Jestem zaznajomiony z użyciem dlopen()
, aby sprawdzić, czy udostępniona biblioteka została załadowana do procesu przy użyciu wcześniejszego wywołania do dlopen()
bez wyzwalania obciążenia, jeśli nie jest obecny, tak jak poniżej:Jak sprawdzić, czy współdzielona biblioteka linux została wstępnie załadowana przy użyciu LD_PRELOAD
void* lib = dlopen(lib_name, RTLD_NOLOAD);
if (lib != NULL) {
...
}
I niedawno starał się zastosować ten sam wzór, aby ustalić, czy jeden z nielicznych bibliotek współdzielonych zostały załadowane do przestrzeni procesowej przy użyciu LD_PRELOAD. Jednak we wszystkich przypadkach wyżej wymienione wywołanie do dlopen()
zwraca NULL
.
Więc w zasadzie, gdybym rozpocząć proces za pomocą tego wiersza poleceń
LD_PRELOAD=libawesome.so ./mycoolprocess
a następnie uruchom następujący czek w kodzie w mycoolprocess.c
void* has_awesome = dlopen("libawesome.so", RTLD_NOLOAD);
if (has_awesome != NULL) {
printf("libawesome is available\n");
}
wywołanie dlopen()
zawsze zwraca NULL
bez względu na to, czy udostępniona biblioteka została załadowana przy użyciu LD_PRELOAD, czy nie. Na podstawie poniższego komentarza Andrew Henle próbowałem również wywołać dlopen
z bezwzględną ścieżką do jednego z przeładowanych obiektów udostępnionych, ale dlopen
w tym przypadku nadal zwraca wartość NULL, mimo że obiekt współdzielony jest wstępnie ładowany.
Więc moje pytanie jest dwojaki:
- Jeżeli powyższe prace wzór dla biblioteki, który został załadowany za pomocą LD_PRELOAD?
- Czy istnieje inny sposób sprawdzenia, czy określona biblioteka współużytkowana została wstępnie załadowana?
Czy wstępnie załadowany obiekt udostępniony znajduje się w katalogu będącym częścią wartości 'DT_RPATH' binarnego katalogu' binarnego 'w katalogu, który znajduje się w zmiennej środowiskowej 'LD_LIBRARY_PATH', w'/lib' lub '/ usr/lib', lub inny katalog skonfigurowany za pomocą 'ldconfig'? Jeśli nie, prawdopodobnie musisz podać bezwzględną lub względną ścieżkę do 'dlopen()'. –
Czy program mógł sprawdzić, czy istnieje LD_PRELOAD env var? – jftuga
@AndrewHenle, wstępnie załadowane obiekty wspólne zwykle znajdują się w/usr/lib/x86_64-linux. LD_PRELOAD określa tylko nazwę biblioteki bez bezwzględnej lub względnej ścieżki. –