Déterminer les dépendances d'objets partagés directs d'un binaire Linux?

170

Comment puis-je trouver facilement les dépendances d'objets partagés directs d'un binaire Linux au format ELF?

Je connais l'outil ldd, mais cela semble générer toutes les dépendances d'un binaire, y compris les dépendances de tous les objets partagés dont le binaire dépend.

Gnou gratuit
la source
2
associé unix.stackexchange.com/questions/120015/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

262

Vous pouvez utiliser readelfpour explorer les en-têtes ELF. readelf -dlistera les dépendances directes sous forme de NEEDEDsections.

 $ readelf -d elfbin

Dynamic section at offset 0xe30 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400520
 0x000000000000000d (FINI)               0x400758
 ...
Tapis
la source
20
C'est bien. Contrairement à ldd, readelf peut inspecter un binaire multiplateforme (c'est-à-dire inspecter un exécutable ARM à partir de Linux x86-64.)
Robert Calhoun
86

Si vous souhaitez rechercher des dépendances de manière récursive (y compris les dépendances de dépendances, les dépendances de dépendances de dépendances, etc.)…

Vous pouvez utiliser la lddcommande. ldd - imprimer les dépendances de la bibliothèque partagée

Serge C
la source
5
La commande ldd travaille sur les dépendances des dépendances, ce qui n'est pas ce que je veux.
Free Wildebeest le
11
Pour moi, cela fonctionne bien. Et il vous indique même laquelle des bibliothèques peut et ne peut pas être trouvée.
Philipp F
2
ldd ne fonctionnerait pas avec un exécutable - seulement pour découvrir les dépendances des bibliothèques partagées, il est utile.
Tuxdude
2
Tuxdude, pourquoi pensez-vous cela? Quelle est la raison de l'inutilisabilité de ldd pour les exécutables ELF?
Vitaly Isaev
C'est génial pour copier les bibliothèques partagées requises de la machine de développement à l'archive de déploiement.
Tomáš Zato - Réintégrer Monica le
30

L' objdumpoutil peut vous fournir ces informations. Si vous invoquez objdumpavec le-x option, pour obtenir la sortie de tous les en-têtes, vous trouverez les dépendances d'objets partagés dès le début dans la "Section dynamique".

Par exemple, s'exécuter objdump -x /usr/lib/libXpm.so.4sur mon système donne les informations suivantes dans la "section dynamique":

Dynamic Section:
  NEEDED               libX11.so.6
  NEEDED               libc.so.6
  SONAME               libXpm.so.4
  INIT                 0x0000000000002450
  FINI                 0x000000000000e0e8
  GNU_HASH             0x00000000000001f0
  STRTAB               0x00000000000011a8
  SYMTAB               0x0000000000000470
  STRSZ                0x0000000000000813
  SYMENT               0x0000000000000018
  PLTGOT               0x000000000020ffe8
  PLTRELSZ             0x00000000000005e8
  PLTREL               0x0000000000000007
  JMPREL               0x0000000000001e68
  RELA                 0x0000000000001b38
  RELASZ               0x0000000000000330
  RELAENT              0x0000000000000018
  VERNEED              0x0000000000001ad8
  VERNEEDNUM           0x0000000000000001
  VERSYM               0x00000000000019bc
  RELACOUNT            0x000000000000001b

Les dépendances directes des objets partagés sont répertoriées comme des valeurs «NÉCESSAIRES». Donc, dans l'exemple ci-dessus, libXpm.so.4mon système a juste besoin de libX11.so.6et libc.so.6.

Il est important de noter que cela ne signifie pas que tous les symboles nécessaires à la transmission du binaire objdumpseront présents dans les bibliothèques, mais cela montre au moins quelles bibliothèques le chargeur essaiera de charger lors du chargement du binaire.

Gnou gratuit
la source
13

ldd -v imprime l'arborescence des dépendances dans la section "Informations sur la version:". Le premier bloc de cette section correspond aux dépendances directes du binaire.

Voir Hiérarchique ldd (1)

Hannes
la source
Quelle est la différence entre ceci et objdump -x <binary> | grep "NEEDED"? Je veux dire, les deux sont presque exactement les mêmes, je reçois juste un .sofichier de plus avec lddque objdump. Mais le fait que les résultats ne soient pas les mêmes me fait me demander quelle méthode est la plus précise.
m4l490n le