我想在Linux上查看共享库的导出功能。
什么命令允许我这样做?
(在Windows上我使用程序取决于)
答案 0 :(得分:265)
您需要的是nm
及其-D
选项:
$ nm -D /usr/lib/libopenal.so.1
.
.
.
00012ea0 T alcSetThreadContext
000140f0 T alcSuspendContext
U atanf
U calloc
.
.
.
导出的sumbols由T
表示。必须从其他共享对象加载的必需符号具有U
。请注意,符号表不仅包含函数,还包括导出的变量。
有关详细信息,请参阅nm
manual page。
答案 1 :(得分:33)
objdump -T *.so
也可以完成这项工作
答案 2 :(得分:3)
在MAC上,您需要使用nm *.o | c++filt
,因为-C
中没有nm
选项。
答案 3 :(得分:2)
在其他已经提到的工具中,您也可以使用readelf
(manual)。它类似于objdump
,但更详细。有关差异说明,请参见this。
$ 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)
答案 4 :(得分:0)
以防某些 Mac 用户正在查看这里,请使用 llvm-cxxdump 或 llvm-readelf -sW