177 votes

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

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

Je connais l'outil ldd, mais il semble qu'il affiche toutes les dépendances d'un binaire, y compris les dépendances de tout objet partagé dont ce binaire dépend.

2 votes

276voto

Mat Points 104488

Vous pouvez utiliser readelf pour explorer les en-têtes ELF. readelf -d listera les dépendances directes comme NEEDED sections.

 $ 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
 ...

22 votes

C'est génial. Contrairement à ldd, readelf peut inspecter un binaire multiplateforme (c'est-à-dire inspecter un exécutable ARM à partir de linux x86-64).

88voto

Serge C Points 673

Si vous voulez trouver les dépendances récursivement (y compris les dépendances des dépendances, les dépendances des dépendances des dépendances et ainsi de suite)

Vous pouvez utiliser ldd commandement. ldd - affiche les dépendances des bibliothèques partagées

5 votes

La commande ldd calcule les dépendances des dépendances, ce qui n'est pas ce que je veux.

11 votes

Pour moi, cela fonctionne bien. Il vous indique même quelles bibliothèques ont pu être trouvées et lesquelles n'ont pas pu l'être.

3 votes

Ldd ne fonctionnerait pas avec un exécutable - il n'est utile que pour trouver les dépendances des bibliothèques partagées.

30voto

Free Wildebeest Points 1548

Le site objdump peut vous donner cette information. Si vous invoquez objdump avec le -x pour qu'il affiche 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 en courant objdump -x /usr/lib/libXpm.so.4 sur 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 listées comme des valeurs "NEEDED". Ainsi, dans l'exemple ci-dessus, libXpm.so.4 sur mon système a juste besoin libX11.so.6 et libc.so.6 .

Il est important de noter que cela ne signifie pas que tous les symboles nécessaires au binaire passé à l'option objdump sera présent dans les bibliothèques, mais il montre au moins quelles bibliothèques le chargeur va essayer de charger lors du chargement du binaire.

0 votes

Cela produit un peu plus de résultats que les autres réponses, ce qui peut ou non être un avantage.

14voto

Hannes Points 11

Ldd -v imprime l'arbre de dépendance sous la section 'Information sur la version:'. Le premier bloc de cette section est constitué des dépendances directes du binaire.

Voir Hiérarchique ldd(1)

0 votes

Quelle est la différence entre ceci et objdump -x <binary> | grep "NEEDED" ? Je veux dire, les deux sont presque exactement les mêmes, j'en prends juste un. .so plus de fichiers avec ldd que objdump . Mais le fait que les résultats ne soient pas les mêmes m'amène à me demander quelle méthode est la plus précise.

1 votes

@m4l490n, si votre nom de divergence est linux-vdso.so Il s'agit d'une bibliothèque virtuelle injectée par le noyau dans chaque processus. Elle n'existe en tant que fichier qu'au moment de la construction du noyau, puis elle est stockée à l'intérieur du noyau. Elle accélère les appels non privilégiés tels que time() qui ne nécessitent pas vraiment une transition de mode coûteuse.

2 votes

@m4l490n, en utilisant ldd sur un fichier constitue un risque pour la sécurité, car il charge le chargeur spécifié dans le fichier lui-même pour charger le fichier et résoudre ses dépendances. Les failles flagrantes ont été corrigées, mais gardez à l'esprit qu'avec ldd vous êtes à un saut de l'exécution du programme, cela indique essentiellement au chargeur d'exécuter le programme, de résoudre les dépendances et de les tracer, et de s'arrêter juste au dernier moment. Les deux sites objdump et readelf lire les ELF comme des fichiers de données. objdump utilise la bibliothèque commune bfd pour analyser le fichier, readelf est autonome (lisez les commentaires au début de sa source pour savoir pourquoi).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X