522 votes

Comment répertorier les symboles contenus dans un fichier .so

Comment faire la liste des symboles exportés à partir d’un fichier .so. Si possible, je voudrais aussi connaître leur source (par exemple s’ils sont tirés partir d’une bibliothèque statique).

J’utilise gcc 4.0.2, si cela fait une différence

632voto

Steve Gury Points 5825

L'outil de référence pour la liste des symboles est - nm, vous pouvez l'utiliser simplement comme ceci:

nm -g yourLib.so

Si vous souhaitez voir des symboles d'une bibliothèque C++, ajoutez l'option "-C" qui demangle les symboles (c'est beaucoup plus lisible demangled).

nm -gC yourLib.so

Si votre .si le fichier est au format elf, vous devrez utiliser l' readelf programme pour extraire les informations de symbole de la binaire.

readelf -Ws /usr/lib/libexample.so

Vous devez extraire celles qui sont définies dans le présent .donc, fichier, pas dans les bibliothèques référencées par elle. Septième colonne devrait contenir un certain nombre dans ce cas. Vous pouvez extraire les lignes correspondantes avec awk:

readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}';

Mise à jour: Merci à Pavel Shved et Gaspin, j'ai mis à jour la réponse

87voto

Pavel Shved Points 34706

Si votre .so le fichier est au format elf, vous pouvez utiliser readelf programme pour extraire les informations de symbole de la binaire. Cette commande va vous donner la table des symboles:

readelf -Ws /usr/lib/libexample.so

Vous devez extraire ceux qui sont définis dans cette .so le fichier, pas dans les bibliothèques référencées par elle. Septième colonne devrait contenir un certain nombre dans ce cas. Vous pouvez l'extraire à l'aide d'une simple regex:

readelf -Ws /usr/lib/libstdc++.so.6 | grep '^\([[:space:]]\+[^[:space:]]\+\)\{6\}[[:space:]]\+[[:digit:]]\+'

ou, comme proposé par Caspin,:

readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}';

56voto

Pavel Lapin Points 256
objdump -TC /usr/lib/libexample.so

44voto

cavila Points 815

Des bibliothèques partagées libNAME.so le -D interrupteur était nécessaire pour voir les symboles dans mon Linux

et pour la bibliothèque statique tel que rapporté par d’autres

37voto

Peter Remmers Points 423

Je me demandais pourquoi -fvisibility=cachés et #pragma GCC visibilité ne semblent pas avoir d'influence, comme tous les symboles sont toujours visibles avec nm - jusqu'à ce que j'ai trouvé ce post qui m'a signalé readelf et objdump, qui m'a fait réaliser qu'il y avait effectivement deux tables de symboles:

  • Celui que vous pouvez liste avec nm
  • Celui que vous pouvez liste avec readelf et objdump

Je pense que le premier contient les symboles de débogage qui peut être retiré avec la bande ou le commutateur-s que vous pouvez donner à l'éditeur de liens ou de l' installation de commande. Et même si nm ne fait pas de liste, plus rien, vos symboles exportés sont toujours exportés parce qu'ils sont à l'ELFE de la "dynamique de la table des symboles", qui est le dernier.

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