如何从共享库中打印所有未定义的函数调用以及文件名?

时间:2019-01-11 06:10:44

标签: c nm

我正在尝试打印共享对象文件中所有未定义的函数调用以及文件名。

我尝试使用“ nm”命令,它会打印所有未定义的函数调用。但是无法获取文件名。

示例:

  bash$ nm -u my_test.so
  :
   U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
  :

环境:Ubuntu 18.04,X86 Arch(Intel处理器)

1 个答案:

答案 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