在Fedora31上,我看到gdb知道一些系统二进制文件的符号,例如/usr/bin/true的main
$ gdb -ex 'set height 0' -ex 'disas main' -ex q /bin/true
Reading symbols from /bin/true...
Reading symbols from .gnu_debugdata for /usr/bin/true...
(No debugging symbols found in .gnu_debugdata for /usr/bin/true)
Dump of assembler code for function main:
0x0000000000002550 <+0>: endbr64
0x0000000000002554 <+4>: cmp edi,0x2
[..]但是main不会出现在objdump -d或者‘`nm输出中:
$ objdump -d /usr/bin/true | grep '\<main\>'
$ nm /usr/bin/true | grep main
nm: /usr/bin/true: no symbols
$ nm -D /usr/bin/true | grep '\<main\>'
$怎么会这样?gdb能从一些额外的符号表中读取主symbol吗?
当我和gcc一起编译我自己的二进制文件时,nm/objdump会像预期的那样显示main符号。此外,当我剥离这样的二进制文件时,gdb也找不到main符号。
我假设rpmbuild使用一些导致上述行为的特殊标志来调用gcc/strip。那些是什么?
发布于 2020-01-20 02:11:03
gdb可以从一些额外的符号表中读取主符号吗?
是:包含在.gnu_debugdata部分中的那个。更多信息here。
gdb还会输出:在.gnu_debugdata中找不到/usr/bin/true的调试符号
GDB说:没有调试符号(即带有文件/行信息、变量信息等的符号)。它不会说“没有符号”(即你会在nm输出中看到的东西)。事实上,符号首先是.gnu_debugdata存在的理由。
https://stackoverflow.com/questions/59811882
复制相似问题