À quelle bibliothèque le programme est lié et qui fournit une fonction donnée?

J’ai un programme appelant la fonction foo qui est défini dans une bibliothèque. Comment savoir où se trouve la bibliothèque dans le système de fichiers? (comme est-ce une bibliothèque statique ou une bibliothèque liée dynamicment?)

Mise à jour: avec using ldd , le programme a beaucoup de bibliothèque de dépendances. Comment savoir quelle lib contient la fonction foo ?

Vous n’avez pas indiqué le système d’exploitation sur lequel vous vous trouvez, et la réponse dépend du système.

Sur Linux et la plupart des systèmes UNIX, vous pouvez simplement demander à l’éditeur de liens de vous le dire. Par exemple, supposons que vous vouliez savoir d’où vient printf dans ce programme:

 #include  int main() { return printf("Hello\n"); } $ gcc -c tc $ gcc to -Wl,-y,printf to: reference to printf /lib/libc.so.6: definition of printf 

Cela vous indique que printf est référencé dans et défini dans libc.so.6 . La solution ci-dessus fonctionnera pour les bibliothèques statiques et partagées.

Puisque vous avez étiqueté cette question avec gdb , voici ce que vous pouvez faire dans gdb:

 gdb -q ./a.out Reading symbols from /tmp/a.out...done. (gdb) b main Breakpoint 1 at 0x400528 (gdb) run Breakpoint 1, 0x0000000000400528 in main () (gdb) info symbol &printf printf in section .text of /lib/libc.so.6 

Si foo provient d’une bibliothèque partagée, gdb vous dira laquelle. Si elle provient d’une bibliothèque statique (auquel cas gdb dira in section .text of a.out ), utilisez la -Wl,-y,foo ci-dessus. Vous pouvez également faire une solution de “force brute” comme ceci:

 find / -name '*.a' -print0 | xargs -0 nm -A | grep ' foo$' 

Pour les bibliothèques partagées, utilisez l’outil de ligne de commande ldd .

Pour les bibliothèques statiques, la bibliothèque est dans le programme lui-même – il n’y a pas de dépendances externes, ce qui est tout l’intérêt d’utiliser des bibliothèques statiques.

Vous ne pouvez pas lister les bibliothèques statiques dans le binary final. Pour répertorier les bibliothèques dynamics liées, utilisez les commandes suivantes: Sous Linux, utilisez ldd [file] . Sous Mac OS X, utilisez otool -L [file] . Sous Windows, je n’en ai aucune idée 😉