当另一个库具有相同的符号时,gdb 不显示来自共享库的符号

Posted

技术标签:

【中文标题】当另一个库具有相同的符号时,gdb 不显示来自共享库的符号【英文标题】:gdb doesn't show symbol from a shared library when another library has the same symbol 【发布时间】:2019-08-04 00:25:18 【问题描述】:

我正在调试一个与两个共享库(liba.so 和 libb.so)链接的 Linux 程序。每个库在同一文件“main.cpp”中都有相同的符号“Journal”。gdb 仅从其中一个库中查找并打印符号。 如何从另一个库中查找和打印符号? 如何打印特定共享库中的所有符号?

(gdb)info var Journal
File ../main.cpp:

SJournalEntry Journal[64];

(gdb) info address Journal

Symbol "Journal" is static storage at address 0x7ffff7febee0.

(gdb) info symbol 0x7ffff7febee0

Journal in section .bss of /usr/lib/liba.so

但这里有另一个符号:

(gdb) info symbol 0x7ffff7dc7070

Journal in section .bss of /usr/lib/libb.so

【问题讨论】:

【参考方案1】:

gdb 仅从其中一个库中查找并打印符号。

您可能正在查看this bug。

如何从另一个库中查找和打印符号?

我认为你不能(没有运行 nm libb.so 并手动将符号重新定位到 libb.so 加载地址)。

注意:在正常的符号解析规则下,假设符号是全局的,所有对 Journal 的引用都将绑定到同一个符号,因此该符号也存在于另一个库中这一事实是无关紧要的。

如何打印特定共享库中的所有符号?

我不相信 GDB 有办法做到这一点。

【讨论】:

以上是关于当另一个库具有相同的符号时,gdb 不显示来自共享库的符号的主要内容,如果未能解决你的问题,请参考以下文章

需要在 GDB 中加载共享库的调试符号

gdb - 多线程和共享库

如何使共享库符号强大?

如何避免 GDB 中符号的命名空间前缀?

iOS 5.1 - GDB 命令或实用程序列出特定共享库中的函数

GDB - 未来共享库加载时的断点