Jak wyświetlić aktualnie załadowane współdzielone obiekty w systemie Linux?

34

Mam dwa powiązane pytania:

  • Jak mogę sprawdzić, czy biblioteka współdzielona jest aktualnie ładowana? (tj. w całym systemie, niezależnie od procesu)
  • Jak mogę zobaczyć wszystkie biblioteki współdzielone ładowane przez proces?
Max
źródło

Odpowiedzi:

40

Możesz zrobić obie te rzeczy lsof. Aby zobaczyć, jakie procesy mają bibliotekę otwartą lub zmapowaną wykonaj:

lsof /path/to/lib.so

i aby zobaczyć, jakie pliki (w tym biblioteki współdzielone) proces otworzył i / lub zmapował, wykonaj:

lsof -p <pid>
TomH
źródło
22

Innym sposobem na sprawdzenie, co jest ładowane w procesie, jest przeglądanie /proc/PID/mapspliku. Pokazuje wszystko zmapowane w przestrzeni adresowej, w tym zmapowane obiekty współdzielone.

Rich Homolka
źródło
Działa dobrze na mojej wbudowanej platformie ARM. Chociaż implementacja BusyBox lsofnie miała wymaganej funkcjonalności.
Alex Che
7
sudo grep libcairo.so /proc/*/maps

to dobry sposób na poznanie wszystkich /proc/PID/maps wymienionych przez Richa naraz. Przykładowe dane wyjściowe:

/proc/8390/maps:7f0a9afae000-7f0a9b0bc000 r-xp 00000000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8390/maps:7f0a9b0bc000-7f0a9b2bc000 ---p 0010e000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8390/maps:7f0a9b2bc000-7f0a9b2bf000 r--p 0010e000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8390/maps:7f0a9b2bf000-7f0a9b2c0000 rw-p 00111000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8466/maps:7f0a9afae000-7f0a9b0bc000 r-xp 00000000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8466/maps:7f0a9b0bc000-7f0a9b2bc000 ---p 0010e000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8466/maps:7f0a9b2bc000-7f0a9b2bf000 r--p 0010e000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8466/maps:7f0a9b2bf000-7f0a9b2c0000 rw-p 00111000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6

Dalej, awka bash-fu może dodatkowo udoskonalić wydajność.

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.

Ciro Santilli
źródło
4

Możesz uruchomić następne polecenie z poziomu roota i zobaczyć pełną listę,

cat /proc/*/maps | awk '{print $6;}' | grep '\.so' | sort | uniq

To jest dla użytkowników, którzy nie mają lsof.

Nobutarou
źródło
Dlaczego chcesz, żeby użytkownik tego spróbował? Proszę edytować swoją odpowiedź do lepszego zrozumienia.
CaldeiraG,