623 Stimmen

Wie kann ich die Symbole in einer .so-Datei auflisten?

Wie kann ich die Symbole auflisten, die aus einer .so-Datei exportiert werden? Wenn möglich, würde ich auch gerne ihre Quelle kennen (z.B. wenn sie aus einer statischen Bibliothek gezogen werden).

Ich verwende gcc 4.0.2, falls das einen Unterschied macht.

0 Stimmen

Die Plattform macht einen Unterschied. Apple bietet einen GCC 4.0, aber seine nm reagiert nicht auf einige Optionen, wie -D y -g (IIRC).

0 Stimmen

Unter Mac OS wird nichts gedruckt.

5 Stimmen

@jww denn das ist BSD nm , nicht GNU nm .

788voto

Steve Gury Punkte 14228

Das Standardwerkzeug für die Auflistung von Symbolen ist nm können Sie es einfach so verwenden:

nm -gD yourLib.so

Wenn Sie die Symbole einer C++-Bibliothek sehen wollen, fügen Sie die Option "-C" hinzu, die die Symbole entmangelt (entmangelt ist es viel besser lesbar).

nm -gDC yourLib.so

Wenn Ihre .so-Datei im elf-Format vorliegt, haben Sie zwei Möglichkeiten:

Entweder objdump ( -C ist auch für die Entflechtung von C++ nützlich):

$ 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

Oder verwenden Sie 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

42 Stimmen

Dies funktioniert jedoch nicht immer mit .so-Dateien, so dass Sie möglicherweise die in einer anderen Antwort erwähnte "readelf"-Lösung verwenden müssen.

0 Stimmen

Gute Antwort - aber ich bekomme die Funktionssignaturen nicht von nm, objdump oder readelf. Wissen Sie, wie ich auch die Funktionssignatur (Parameter) erhalten kann?

9 Stimmen

Beachten Sie, dass den OS X-Versionen von nm die Option '-C' zum Entmischen von Symbolen fehlt. c++filt kann stattdessen verwendet werden. Ein Beispielskript finden Sie hier: v8.googlecode.com/svn/branches/bleeding_edge/tools/mac-nm nm -g /usr/lib/libstdc++.6.dylib | c++filt -p -i

103voto

P Shved Punkte 90784

Wenn Ihr .so Datei im elf-Format vorliegt, können Sie das Programm readelf verwenden, um Symbolinformationen aus der Binärdatei zu extrahieren. Mit diesem Befehl erhalten Sie die Symboltabelle:

readelf -Ws /usr/lib/libexample.so

Sie sollten nur diejenigen extrahieren, die in diesem Dokument definiert sind. .so Datei, nicht in den von ihr referenzierten Bibliotheken. Die siebte Spalte sollte in diesem Fall eine Zahl enthalten. Sie können sie mit Hilfe eines einfachen Regex extrahieren:

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

oder, wie vorgeschlagen von Caspin ,:

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

24 Stimmen

Readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}'; Regexe sind großartig, aber manchmal hilft ein wenig awk auch weiter.

58voto

Pavel Lapin Punkte 716
objdump -TC /usr/lib/libexample.so

46voto

cavila Punkte 7744

Für die gemeinsam genutzten Bibliotheken libNAME.so war der Schalter -D notwendig, um die Symbole in meinem Linux

nm -D libNAME.so

und für die statische Bibliothek, wie von anderen berichtet

nm -g libNAME.a

38voto

Peter Remmers Punkte 1263

Ich habe mich immer wieder gefragt, warum -fvisibility=hidden y #pragma GCC Sichtbarkeit schien keinen Einfluss zu haben, denn alle Symbole waren immer sichtbar mit nm - bis ich diesen Beitrag fand, der mich auf folgende Seite verwies selbst lesen y objdump Dadurch wurde mir klar, dass es anscheinend tatsächlich zwei Symboltabellen:

  • Derjenige, den Sie mit nm
  • Derjenige, den Sie mit selbst lesen y objdump

Ich denke, ersteres enthält Debugging-Symbole, die man mit Streifen oder der Schalter -s, den Sie dem Linker oder dem Programm geben können installieren Befehl. Und selbst wenn nm nichts mehr auflistet, werden Ihre exportierten Symbole immer noch exportiert, weil sie in der "dynamischen Symboltabelle" von ELF enthalten sind, was letztere ist.

3 Stimmen

Ich danke Ihnen! Das erklärt, warum "nm" manchmal keine Symbole für .so-Dateien anzeigt.

11 Stimmen

Nm -D - ermöglicht die Auflistung der dynamischen Symboltabelle

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X