Wie kann ich die Liste der Funktionen anzeigen, die eine gemeinsam genutzte Linux-Bibliothek exportiert?


Antworten:


307

Was Sie brauchen, ist nmund seine -DOption:

$ nm -D /usr/lib/libopenal.so.1
.
.
.
00012ea0 T alcSetThreadContext
000140f0 T alcSuspendContext
         U atanf
         U calloc
.
.
.

Exportierte Sumbole sind mit a gekennzeichnet T. Erforderliche Symbole, die von anderen freigegebenen Objekten geladen werden müssen, haben a U. Beachten Sie, dass die Symboltabelle nicht nur Funktionen enthält, sondern auch exportierte Variablen.

Weitere Informationen finden Sie auf der nm Handbuchseite .


18
Wenn Sie nur exportierte Symbole anzeigen möchten, fügen Sie das Flag "--defined-only" hinzu. zB: "nm -D --defined-only /lib/libtest.so"
Shervin Emami

3
Unter Mac OS X nur nmohne -DFlag verwenden.
JPaget


8

Auf einem MAC müssen Sie verwenden nm *.o | c++filt, da es in keine -COption gibt nm.


1

Neben anderen bereits erwähnten Werkzeugen können Sie auch readelf( manuell ) verwenden. Es ist ähnlich, objdumpgeht aber detaillierter. Siehe dies für die Erklärung der Unterschiede.

$ readelf -sW /lib/liblzma.so.5 |head -n10

Symbol table '.dynsym' contains 128 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000000     0 FUNC    GLOBAL DEFAULT  UND pthread_mutex_unlock@GLIBC_2.0 (4)
     2: 00000000     0 FUNC    GLOBAL DEFAULT  UND pthread_mutex_destroy@GLIBC_2.0 (4)
     3: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable
     4: 00000000     0 FUNC    GLOBAL DEFAULT  UND memmove@GLIBC_2.0 (5)
     5: 00000000     0 FUNC    GLOBAL DEFAULT  UND free@GLIBC_2.0 (5)
     6: 00000000     0 FUNC    GLOBAL DEFAULT  UND memcpy@GLIBC_2.0 (5)

Wie soll ich exportierte Symbole finden, indem ich readelf verwende? Es gibt mir eine überwältigende Menge an Ausgabe.
Juraj Martinka
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.