602 votes

Comment lister les symboles dans un fichier .so ?

Comment puis-je dresser la liste des symboles exportés à partir d'un fichier .so ? Si possible, j'aimerais également connaître leur source (par exemple, s'ils sont tirés d'une bibliothèque statique).

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

0 votes

La plateforme fait la différence. Apple fournit un GCC 4.0, mais son nm ne répond pas à certaines options, comme -D y -g (IIRC).

0 votes

Cela n'imprime rien sur Mac OS.

5 votes

@jww parce que c'est BSD nm pas GNU nm .

739voto

Steve Gury Points 5825

L'outil standard pour lister les symboles est nm vous pouvez l'utiliser simplement comme ceci :

nm -gD yourLib.so

Si vous voulez voir les symboles d'une bibliothèque C++, ajoutez l'option "-C" qui démêle les symboles (c'est beaucoup plus lisible démêlé).

nm -gDC yourLib.so

Si votre fichier .so est au format elf, vous avez deux possibilités :

Soit objdump ( -C est également utile pour démêler le C++) :

$ objdump -TC libz.so

libz.so:     file format elf64-x86-64

DYNAMIC SYMBOL TABLE:
0000000000002010 l    d  .init  0000000000000000              .init
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 free
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 __errno_location
0000000000000000  w   D  *UND*  0000000000000000              _ITM_deregisterTMCloneTable

Ou utilisez readelf :

$ readelf -Ws libz.so
Symbol table '.dynsym' contains 112 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000002010     0 SECTION LOCAL  DEFAULT   10
     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND free@GLIBC_2.2.5 (14)
     3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __errno_location@GLIBC_2.2.5 (14)
     4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable

40 votes

Cependant, cela ne fonctionne pas toujours avec les fichiers .so, et vous devrez peut-être utiliser la solution "readelf" mentionnée dans une autre réponse.

0 votes

Excellente réponse - mais je n'obtiens pas les signatures de fonction de nm, objdump ou readelf. Savez-vous comment je peux obtenir la signature de la fonction (paramètres) également ?

9 votes

Notez que les versions OS X de nm manquent l'option '-C' pour démêler les symboles. c++filt peut être utilisé à la place. Exemple script ici : v8.googlecode.com/svn/branches/bleeding_edge/tools/mac-nm nm -g /usr/lib/libstdc++.6.dylib | c++filt -p -i

96voto

Pavel Shved Points 34706

Si votre .so est au format elf, vous pouvez utiliser le programme readelf pour extraire les informations des symboles du binaire. Cette commande vous donnera la table des symboles :

readelf -Ws /usr/lib/libexample.so

Vous ne devez extraire que ceux qui sont définis dans ce document. .so et non dans les bibliothèques qu'il référence. Dans ce cas, la septième colonne doit contenir un numéro. Vous pouvez l'extraire en utilisant 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}';

24 votes

Readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}' ; Les expressions rationnelles sont géniales mais parfois, un peu d'awk est plus efficace.

57voto

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

44voto

cavila Points 815

Pour les bibliothèques partagées libNAME.so, le commutateur -D était nécessaire pour voir les symboles dans mon système Linux.

nm -D libNAME.so

et pour la bibliothèque statique, comme indiqué par d'autres

nm -g libNAME.a

37voto

Peter Remmers Points 423

Je me demandais pourquoi -fvisibility=hidden y #pragma GCC visibilité ne semblait pas avoir d'influence, puisque tous les symboles étaient toujours visibles avec nm - jusqu'à ce que je trouve ce post qui m'a dirigé vers lisez vous-même y objdump ce qui m'a fait réaliser qu'il semble y avoir effectivement deux les tables de symboles :

  • Celui que vous pouvez énumérer avec nm
  • Celui que vous pouvez énumérer avec lisez vous-même y objdump

Je pense que le premier contient des symboles de débogage qui peuvent être supprimés avec strip ou le commutateur -s que vous pouvez donner au linker ou au installer commandement. Et même si nm ne liste plus rien, vos symboles exportés le sont toujours car ils se trouvent dans la "table de symboles dynamique" ELF, qui est cette dernière.

3 votes

Merci ! Cela explique pourquoi parfois "nm" ne montre aucun symbole pour les fichiers .so.

11 votes

Nm -D - permet de lister la table des symboles dynamiques

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