如何查看 Linux 共享库正在导出的函数列表?

Posted

技术标签:

【中文标题】如何查看 Linux 共享库正在导出的函数列表?【英文标题】:How do I view the list of functions a Linux shared library is exporting? 【发布时间】:2011-05-29 17:20:07 【问题描述】:

我想在 Linux 上查看共享库的导出函数。

什么命令允许我这样做?

(在Windows上我使用的程序取决于)

【问题讨论】:

类似问题:How do i find out what all symbols are exported from a shared object? 【参考方案1】:

万一某些 Mac 用户正在查看这里,请使用 llvm-cxxdump 或 llvm-readelf -sW

【讨论】:

【参考方案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)

【讨论】:

我应该如何使用 readelf 找到导出的符号?它给了我大量的输出。 @JurajMartinka readelf -sW *.so > out.txt 这会将输出写入文件。【参考方案3】:

在 MAC 上,您需要使用nm *.o | c++filt,因为nm 中没有-C 选项。

【讨论】:

【参考方案4】:

objdump -T *.so 也可以完成这项工作

【讨论】:

【参考方案5】:

您需要的是nm 及其-D 选项:

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

导出的 sumbols 由 T 表示。必须从其他共享对象加载的必需符号具有U。请注意,符号表不仅包括函数,还包括导出的变量。

请参阅nmmanual page 了解更多信息。

【讨论】:

或者,如果您只想查看导出的符号,请添加“--defined-only”标志。例如:“nm -D --defined-only /lib/libtest.so” 在 Mac OS X 上只需使用 nm 而不使用 -D 标志。

以上是关于如何查看 Linux 共享库正在导出的函数列表?的主要内容,如果未能解决你的问题,请参考以下文章

共享库

linux中动态库libXXX.so

如何使共享库符号强大?

有没有办法确定共享库导出符号的函数参数?

我需要列出在 UNIX/Linux 中具有链接到它们的指定共享库的程序(如 ldd,反之亦然)

是否可以防止 C 共享库中的函数覆盖?