Bagaimana cara melihat daftar fungsi yang diekspor oleh perpustakaan bersama Linux?

Jawaban:

314

Yang Anda butuhkan adalah nmdan -Dopsinya:

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

Sumbol yang diekspor ditunjukkan oleh a T. Simbol yang diperlukan yang harus dimuat dari objek bersama lainnya memiliki a U. Perhatikan bahwa tabel simbol tidak hanya menyertakan fungsi, tetapi juga mengekspor variabel.

Lihat nm halaman manual untuk informasi lebih lanjut.

thkala
sumber
18
Atau jika Anda hanya ingin melihat simbol yang diekspor, tambahkan bendera "--defined-only". mis: "nm -D --defined-only /lib/libtest.so"
Shervin Emami
3
Di Mac OS X gunakan saja nmtanpa -Dflag.
JPaget
43

objdump -T *.so mungkin juga melakukan pekerjaan itu

pengguna2391685
sumber
8

Pada MAC, Anda perlu menggunakan nm *.o | c++filt, karena tidak ada -Copsi di nm.

Vincent Fenet
sumber
1

Di antara alat-alat lain yang telah disebutkan Anda dapat menggunakan juga readelf( manual ). Ini mirip dengan objdumptetapi lebih detail. Lihat ini untuk penjelasan perbedaannya.

$ 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)
Martin Flaska
sumber
Bagaimana saya bisa menemukan simbol yang diekspor dengan menggunakan readelf? Ini memberi saya jumlah output yang luar biasa.
Juraj Martinka