我有一个我正在尝试调试的应用程序,但是在gdb下运行它会产生不同的结果,并且在遇到地址时让它输出真实的符号信息会很好。例如。
我有一个定期调用的方法,我可以确定呼叫站点的地址。但是,我想在运行时打印出该地址的符号信息。我知道我可以在可执行文件上运行“nm”,但这不在应用程序之外。我希望能够在应用程序本身内完成它。
我在Linux平台上使用GCC 4.7.2。
(编辑解释为什么我不能使用gdb)
答案 0 :(得分:1)
可以通过DT_DYNAMIC
段访问动态符号信息,该段加载到内存中,可以通过询问dlopen(3)
主要可执行文件的句柄来访问。
静态符号信息只能从实际的可执行文件或外部文件中读取,因为它未在可加载的段中列出。
仅使用动态信息,您将无法解析任何未导出的内容,这意味着除非您的可执行文件的符号表已导出,否则您很可能只会看到库调用,因此静态信息可能是最佳选择。
这涉及大量解析,或使用从 binutils 构建的bfd
库。