14

如何确定函数是否存在于库中,或列出已编译库中的函数?

4

5 回答 5

26

您可以使用nm命令列出静态库中的符号。

nm -g -C <libMylib.a>
于 2008-12-24T20:00:29.710 回答
15

对于 ELF 二进制文件,您可以使用 readelf:

readelf -sW a.out | awk '$4 == "FUNC"' | c++filt

-s: 列出符号 -W: 不要剪太长的名字

然后 awk 命令将过滤掉所有函数,而 c++filt 将解开它们。这意味着它将从内部命名方案转换它们,以便它们以人类可读的形式显示。它输出与此类似的名称(取自 boost.filesystem lib):

285: 0000bef0    91 FUNC    WEAK   DEFAULT   11 boost::exception::~exception()

没有 c++filt,名称显示为_ZN5boost9exceptionD0Ev

于 2008-12-24T20:08:06.010 回答
7

对于 Microsoft 工具,“ link /dump /symbols <filename>”将为您提供血淋淋的细节。可能还有其他方法(或选项)可以提供更易于阅读的列表。

于 2008-12-24T20:21:09.027 回答
6

在 Linux/Unix 下,您可以使用objdump -T列出给定对象中包含的导出符号。在 Windows 下有dumpbin(IIRC dumpbin /exports)。请注意,为了允许重载,对 C++ 函数名称进行了修改。

编辑:在看到 codelogic 的anwser之后,我记得 objdump 也理解 -C 来执行 de-mangling。

于 2008-12-24T20:02:48.923 回答
5

使用这个命令:

objdump -t "你的库"

它会打印比你想要的更多的东西——不仅仅是函数名,而是整个符号表。检查你得到的符号的各种属性,你将能够从变量和东西中整理出函数。

于 2008-12-24T20:00:58.147 回答