GNU/Linux >> Znalost Linux >  >> Linux

Jak zobrazit všechny sdílené knihovny používané spustitelnými soubory v Linuxu?

  1. Použijte ldd pro seznam sdílených knihoven pro každý spustitelný soubor.
  2. Vyčistěte výstup
  3. Řadit, počítat počty, třídit podle počtu

Chcete-li najít odpověď pro všechny spustitelné soubory v adresáři "/bin":

find /bin -type f -perm /a+x -exec ldd {} \; \
| grep so \
| sed -e '/^[^\t]/ d' \
| sed -e 's/\t//' \
| sed -e 's/.*=..//' \
| sed -e 's/ (0.*)//' \
| sort \
| uniq -c \
| sort -n

Chcete-li prohledat všechny adresáře, změňte „/bin“ výše na „/“.

Výstup (pouze pro adresář /bin) bude vypadat nějak takto:

  1 /lib64/libexpat.so.0
  1 /lib64/libgcc_s.so.1
  1 /lib64/libnsl.so.1
  1 /lib64/libpcre.so.0
  1 /lib64/libproc-3.2.7.so
  1 /usr/lib64/libbeecrypt.so.6
  1 /usr/lib64/libbz2.so.1
  1 /usr/lib64/libelf.so.1
  1 /usr/lib64/libpopt.so.0
  1 /usr/lib64/librpm-4.4.so
  1 /usr/lib64/librpmdb-4.4.so
  1 /usr/lib64/librpmio-4.4.so
  1 /usr/lib64/libsqlite3.so.0
  1 /usr/lib64/libstdc++.so.6
  1 /usr/lib64/libz.so.1
  2 /lib64/libasound.so.2
  2 /lib64/libblkid.so.1
  2 /lib64/libdevmapper.so.1.02
  2 /lib64/libpam_misc.so.0
  2 /lib64/libpam.so.0
  2 /lib64/libuuid.so.1
  3 /lib64/libaudit.so.0
  3 /lib64/libcrypt.so.1
  3 /lib64/libdbus-1.so.3
  4 /lib64/libresolv.so.2
  4 /lib64/libtermcap.so.2
  5 /lib64/libacl.so.1
  5 /lib64/libattr.so.1
  5 /lib64/libcap.so.1
  6 /lib64/librt.so.1
  7 /lib64/libm.so.6
  9 /lib64/libpthread.so.0
 13 /lib64/libselinux.so.1
 13 /lib64/libsepol.so.1
 22 /lib64/libdl.so.2
 83 /lib64/ld-linux-x86-64.so.2
 83 /lib64/libc.so.6

Upravit – Odstraněno „grep -P“


Chcete-li zjistit, jaké knihovny používá binární soubor, použijte ldd

ldd path/to/the/tool

Abyste se dostali k rozčlenění v celém systému, museli byste napsat malý skript Shell.


Neměl jsem na svém ARM toolchainu ldd, takže jsem použil objdump:

$(CROSS_COMPILE)objdump -p

Například:

objdump -p /usr/bin/python:

Dynamic Section:
  NEEDED               libpthread.so.0
  NEEDED               libdl.so.2
  NEEDED               libutil.so.1
  NEEDED               libssl.so.1.0.0
  NEEDED               libcrypto.so.1.0.0
  NEEDED               libz.so.1
  NEEDED               libm.so.6
  NEEDED               libc.so.6
  INIT                 0x0000000000416a98
  FINI                 0x000000000053c058
  GNU_HASH             0x0000000000400298
  STRTAB               0x000000000040c858
  SYMTAB               0x0000000000402aa8
  STRSZ                0x0000000000006cdb
  SYMENT               0x0000000000000018
  DEBUG                0x0000000000000000
  PLTGOT               0x0000000000832fe8
  PLTRELSZ             0x0000000000002688
  PLTREL               0x0000000000000007
  JMPREL               0x0000000000414410
  RELA                 0x0000000000414398
  RELASZ               0x0000000000000078
  RELAENT              0x0000000000000018
  VERNEED              0x0000000000414258
  VERNEEDNUM           0x0000000000000008
  VERSYM               0x0000000000413534

Na Linuxu používám:

lsof -P -T -p Application_PID

Toto funguje lépe než ldd když spustitelný soubor používá jiný než výchozí zavaděč


Linux
  1. Jak vytvořit sdílený adresář pro všechny uživatele v Linuxu

  2. Úvod do sdílených knihoven Linuxu (Jak vytvořit sdílené knihovny)

  3. Jak inicializovat sdílenou knihovnu v Linuxu

  1. Jak zacházet s dynamickými a statickými knihovnami v Linuxu

  2. Odstraňování sdílených linuxových knihoven

  3. Jak nastavit googleTest jako sdílenou knihovnu v Linuxu

  1. Jak najít všechny uživatele Sudo v Linuxu

  2. Jak vypsat všechny nainstalované balíčky v Linuxu

  3. Jak vypsat všechny uživatele ve skupině Linuxu?