Chcę znaleźć listę bibliotek dynamicznych ładowanych binarnie po uruchomieniu (wraz z ich pełnymi ścieżkami). Używam CentOS 6.0. Jak to zrobić?
executable
libraries
dynamic-linking
Ciro Santilli
źródło
źródło
lld
na Darwin, jak się wydaje, nie mogę go znaleźć poprzez homebrew.otool -L <path-to-binary>
ldd
. Zobacz stronę podręcznika man .readelf -d $executable | grep 'NEEDED'
Można go użyć, jeśli nie można uruchomić pliku wykonywalnego, np. Jeśli został on skompilowany krzyżowo lub jeśli mu nie ufasz:
Przykład:
Przykładowy ouptut:
Zauważ, że biblioteki mogą zależeć od innych bibliotek, więc teraz musisz znaleźć zależności.
Naiwne podejście, które często się sprawdza, to:
ale dokładniejszą metodą jest zrozumienie
ldd
ścieżki wyszukiwania / pamięci podręcznej. Myślę, żeldconfig
to dobra droga.Wybierz jeden i powtórz:
Przykładowe dane wyjściowe:
I tak dalej.
Zobacz też:
/proc/<pid>/maps
do uruchamiania procesówWspomniany przez Basile jest przydatny, aby znaleźć wszystkie biblioteki aktualnie używane przez uruchamiane pliki wykonywalne. Na przykład:
pokazuje wszystkie aktualnie załadowane zależności dynamiczne
init
(PID1
):Ta metoda pokazuje również biblioteki otwarte przy użyciu
dlopen
, przetestowane przy użyciu tej minimalnej konfiguracji zhakowanej za pomocąsleep(1000)
Ubuntu 18.04.Zobacz także: Jak wyświetlić aktualnie załadowane współdzielone obiekty w systemie Linux? | Super użytkownik
źródło
ldd i lsof pokazują biblioteki załadowane bezpośrednio lub w danym momencie . Nie uwzględniają bibliotek załadowanych przez
dlopen
(lub odrzuconych przezdlclose
). Możesz uzyskać lepszy obraz tego, używającstrace
np.(ponieważ
dlopen
ostatecznie dzwoniopen
- chociaż możesz oczywiście mieć system używający różnych nazw dla 64-bitowych otwarć ...).Przykład:
pokazuje mi to:
z którego można wstawić nazwy „.so”, aby zobaczyć udostępnione obiekty.
źródło
strace -e trace=open,openat myprogram
/proc/<pid>/maps
pokazuje równieżdlopen
libs btw: unix.stackexchange.com/questions/120015/...ltrace -S
wyjście jest jeszcze fajniejsze, ponieważ pokazuje zarówno wywołania systemowe, jak i wywołania biblioteki, takie jakdlopen
: unix.stackexchange.com/questions/226524/…lsof może również pokazać, które biblioteki są używane dla jednego konkretnego procesu.
to znaczy
źródło
W przypadku procesu pid 1234 można również odczytać
/proc/1234/maps
pseudoplik (tekstowy) (odczyt proc (5) ...) lub użyć pmap (1)Daje to wirtualną przestrzeń adresową tego procesu, stąd pliki (w tym biblioteki współdzielone, nawet nawet dlopen (3) -ed), które są mapowane w pamięci
(oczywiście użyj
ps aux
lub pgrep (1), aby znaleźć procesy uruchamiające dany program)źródło
W przypadku zapytania masowego:
utwórz mały skrypt (
useslib
) i umieść w zmiennej PATH (lub określ pełną ścieżkę w poniższym poleceniu)Użyj go w
find
poleceniu, na przykład:(libgtk-x11-2.0 wydaje się być biblioteką gtk2)
źródło
Możliwe jest użycie
pmap
.Na przykład rozpocznij proces:
$ watch date
Uzyskaj pid:
$ ps -ef | grep watch
Pokaż mapę pamięci:
$ pmap <pid>
Pokaż z pełną ścieżką:
$ pmap <pid> -p
źródło