我正在尝试打印共享对象文件中所有未定义的函数调用以及文件名。
我尝试使用“ nm”命令,它会打印所有未定义的函数调用。但是无法获取文件名。
示例:
bash$ nm -u my_test.so
:
U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
:
环境:Ubuntu 18.04,X86 Arch(Intel处理器)
答案 0 :(得分:2)
详细研究DWARF格式的规范(该格式是Linux上的调试信息所使用的格式)。因此,您可以通过解析ELF二进制文件中的DWARF来提取信息(但并非完全简单)。
考虑查看Ian Taylor's libbacktrace的源代码。它正在从ELF中的DWARF中提取文件名。
也许您真正的问题是获取精确的回溯信息,然后libbacktrace
正是您所需要的!
您还可以使用gdb
:它是extensible并且可以用Python(或Guile)编写脚本,您可以编写自己的专用脚本。
也许编译代码时,GCC plugin可以更好地解决实际问题。
阅读Drepper的How to write shared libraries并阅读有关ELF的更多信息。
例如,您可以使用nm
(或readelf
)来收集共享库中所有未定义的符号。然后,第二个脚本将在源代码中查找这些事件的出现。它甚至可以是简单的awk脚本(或使用for
的{{1}} shell循环),也可以像GCC插件一样复杂。
您的示例显示了(可能)一个mangled C ++名称。您可以使用grep
将其取消损坏。然后编写一个GCC插件以使用它查找所有GIMPLE nm -C
条指令。
编写GCC插件可能需要一些时间,特别是如果您不熟悉GCC internals。