Niedawno natknąłem się na to odniesienie w proggit i (jak na razie) nie zostało to wyjaśnione.
Podejrzewam, że to może być to, ale nie jestem pewien.
c
linux
environment-variables
Hank Gay
źródło
źródło
Odpowiedzi:
Jeśli ustawisz
LD_PRELOAD
ścieżkę do obiektu współdzielonego, plik ten zostanie załadowany przed każdą inną biblioteką (w tym środowiskiem uruchomieniowym Clibc.so
). Aby uruchomićls
specjalnąmalloc()
implementację, wykonaj następujące czynności:źródło
LD_PRELOAD
. Powodem jest to, że jest to zmienna środowiskowa, dziedziczone przez procesy potomne - które mogą mieć inny katalog roboczy niż proces macierzysty. Dlatego żadna ścieżka względna nie zlokalizowałaby biblioteki do wstępnego załadowania.Można zastąpić symbole w bibliotekach podstawowych, tworząc bibliotekę z tymi samymi symbolami i określając bibliotekę w
LD_PRELOAD
.Niektóre osoby używają go do określania bibliotek w niestandardowych lokalizacjach, ale
LD_LIBRARY_PATH
jest to lepsze w tym celu.źródło
Dzięki
LD_PRELOAD
niemu możesz dać bibliotekom pierwszeństwo.Na przykład możesz napisać bibliotekę, która implementuje
malloc
ifree
. I przez załadowanie ich zeLD_PRELOAD
swoimmalloc
ifree
zostanie wykonany zamiast standardowych.źródło
calloc
? czy to by nie wszystko zepsuło?malloc
i darmowe są specjalnie zaprojektowane w glibc, aby to umożliwić, a magazyniecalloc
można zadzwonić do importowanegomalloc
. Nie próbuj tego z innymi funkcjami. To nie zadziała tak dobrze.Jak wiele osób wspomniało, używając
LD_PRELOAD
do wstępnego załadowania biblioteki. BTW, można SPRAWDŹ , czy ustawienie jest dostępne przezldd
komendę.Przykład: załóżmy, że musisz wstępnie załadować własny
libselinux.so.1
.Dlatego ustaw swoje środowisko ładowania wstępnego:
Sprawdź swoją bibliotekę jeszcze raz:
źródło
LD_PRELOAD
wyświetla listę bibliotek współdzielonych z funkcjami, które zastępują standardowy zestaw, podobnie jak/etc/ld.so.preload
robi to. Są one realizowane przez moduł ładujący/lib/ld-linux.so
. Jeśli chcesz zastąpić tylko kilka wybranych funkcji, możesz to zrobić, tworząc nadpisany plik obiektowy i ustawienieLD_PRELOAD
; funkcje w tym pliku obiektowym zastąpią tylko te funkcje, pozostawiając inne takie, jakie były.Więcej informacji na temat bibliotek współdzielonych można znaleźć na stronie http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
źródło
Oto szczegółowy post na blogu na temat wstępnego ładowania:
https://blog.cryptomilk.org/2014/07/21/what-is-preloading/
źródło
łatwo jest eksportować
mylib.so
do env:wyłączyć :
źródło
unset LD_PRELOAD
gdy używany jest LD_PRELOAD, plik ten zostanie załadowany przed jakąkolwiek inną
$export LD_PRELOAD=/path/lib
biblioteką lib, która ma zostać wstępnie załadowana, nawet tego można użyć w programachźródło
Za pomocą
LD_PRELOAD
ścieżki można zmusić moduł ładujący aplikacje do ładowania udostępnionego obiektu współdzielonego, ponad domyślny.Deweloperzy używają tego do debugowania swoich aplikacji, udostępniając różne wersje współdzielonych obiektów.
Używaliśmy go do hakowania niektórych aplikacji, zastępując istniejące funkcje za pomocą przygotowanych obiektów współdzielonych.
źródło