2009-07-23 9 views
2

Existe-t-il un outil permettant de lire le nom des bibliothèques dynamiques requises par un exécutable Linux pour lire les en-têtes?Comment savoir quelles bibliothèques dynamiques sont nécessaires à un ELF?

J'ai besoin de savoir s'il existe des dépendances étranges (c'est-à-dire pas très standard) dans un binaire que je viens de construire depuis la source (c'est la branche Python de GDB) ou statiquement lié. Je pense que ce serait plus facile que de lire les makefiles ...

+0

double possible de [Afficher toutes les bibliothèques utilisées par executables sur linux] (http://stackoverflow.com/questions/50159/show-all-libraries-used-by-executables-on-linux) –

Répondre

3

/usr/bin/ldd est votre ami. Utilisation:

ldd /bin/ls 

Exemple de sortie:

linux-vdso.so.1 => (0x00007ffd14f79000) 
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f2d875fc000) 
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f2d873f4000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2d8702f000) 
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f2d86df1000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2d86bed000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f2d8781f000) 
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f2d869e8000) 
1

Si vous ne faites pas confiance à l'exécutable, utilisez readelf -d à la place. A partir de la page man ldd:

Dans le cas habituel, ldd invoque l'éditeur de liens dynamique standard (voir ld.so (8)) avec la variable d'environnement LD_TRACE_LOADED_OBJECTS mis à 1, ce qui provoque l'éditeur de liens pour afficher la bibliothèque dépendances. Sachez cependant que dans certaines circonstances, certaines versions de ldd peuvent tenter d'obtenir les informations de dépendance en exécutant directement le programme. Ainsi, n'utilisez jamais ldd sur un exécutable non fiable, car cela peut entraîner l'exécution de code arbitraire.

Exemple:

readelf -d /bin/ls | grep 'NEEDED' 

Exemple ouptut:

0x0000000000000001 (NEEDED)    Shared library: [libselinux.so.1] 
0x0000000000000001 (NEEDED)    Shared library: [libacl.so.1] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 

Notez que les bibliothèques peuvent dépendre d'autres bibliothèques, vous devez alors:

$ locate libselinux.so.1 
/lib/i386-linux-gnu/libselinux.so.1 
/lib/x86_64-linux-gnu/libselinux.so.1 
/mnt/debootstrap/lib/x86_64-linux-gnu/libselinux.so.1 

Choisissez l'un, et répéter:

readelf -d /lib/x86_64-linux-gnu/libselinux.so.1 | grep 'NEEDED' 

Exemple de sortie:

0x0000000000000001 (NEEDED)    Shared library: [libpcre.so.3] 
0x0000000000000001 (NEEDED)    Shared library: [libdl.so.2] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [ld-linux-x86-64.so.2] 

Et ainsi de suite.

Voir aussi:

Questions connexes