如何确定函数是否存在于库中,或列出已编译库中的函数?
5 回答
您可以使用nm命令列出静态库中的符号。
nm -g -C <libMylib.a>
对于 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
对于 Microsoft 工具,“ link /dump /symbols <filename>
”将为您提供血淋淋的细节。可能还有其他方法(或选项)可以提供更易于阅读的列表。
在 Linux/Unix 下,您可以使用objdump -T
列出给定对象中包含的导出符号。在 Windows 下有dumpbin
(IIRC dumpbin /exports
)。请注意,为了允许重载,对 C++ 函数名称进行了修改。
编辑:在看到 codelogic 的anwser之后,我记得 objdump 也理解 -C 来执行 de-mangling。
使用这个命令:
objdump -t "你的库"
它会打印比你想要的更多的东西——不仅仅是函数名,而是整个符号表。检查你得到的符号的各种属性,你将能够从变量和东西中整理出函数。