如何以编程方式在正在运行的应用程序中查找符号

时间:2013-10-31 14:26:14

标签: c linux gcc

我有一个我正在尝试调试的应用程序,但是在gdb下运行它会产生不同的结果,并且在遇到地址时让它输出真实的符号信息会很好。例如。

我有一个定期调用的方法,我可以确定呼叫站点的地址。但是,我想在运行时打印出该地址的符号信息。我知道我可以在可执行文件上运行“nm”,但这不在应用程序之外。我希望能够在应用程序本身内完成它。

我在Linux平台上使用GCC 4.7.2。

(编辑解释为什么我不能使用gdb)

1 个答案:

答案 0 :(得分:1)

可以通过DT_DYNAMIC段访问动态符号信息,该段加载到内存中,可以通过询问dlopen(3)主要可执行文件的句柄来访问。

静态符号信息只能从实际的可执行文件或外部文件中读取,因为它未在可加载的段中列出。

仅使用动态信息,您将无法解析任何未导出的内容,这意味着除非您的可执行文件的符号表已导出,否则您很可能只会看到库调用,因此静态信息可能是最佳选择。

这涉及大量解析,或使用从 binutils 构建的bfd库。

但是,我真的很想知道这是否值得付出努力。您可能会从使用gcc中的分析支持获得相同的信息。