TL;DR:
- 有一个特殊的
.gnu_debugdata
GDB 读取的 Fedora 二进制文件中的压缩部分,其中包含迷你符号.
- 该部分的内容可以方便地打印
eu-readelf -Ws --elf-section /usr/bin/ls
readelf -S /usr/bin/ls | grep abformat
该命令正在转储sections。你要symbols反而:
readelf -s /usr/bin/ls | grep abformat
readelf --all /usr/bin/ls | grep abformat
strings /usr/bin/ls | grep abformat
Strings 尝试猜测您想要的内容,并且不会输出二进制文件中找到的所有字符串。看这篇博文并尝试:
strings -a /usr/bin/ls | grep abformat
Update:我确认了您观察到的结果:abformat
没有出现在任何地方,但 GDB 知道它。
事实证明,有一个.gnu_debugdata
压缩的部分(描述here), 其中有迷你符号.
要提取此数据,通常您会执行以下操作:
objcopy -O binary -j .gnu_debugdata /usr/bin/ls ls.mini.xz
然而,那被打破在我的系统上(产生空输出),所以我使用dd
:
# You may need to adjust the numbers below from "readelf -WS /usr/bin/ls"
dd if=/usr/bin/ls of=ls.mini.xz bs=1 skip=151896 count=3764
xz -d ls.mini.xz
nm ls.mini | grep abformat
这产生了:
00000000000005db0 t abformat_init
QED.
附加信息:
- 令人困惑的 GDB
no debugging symbols
解决于this bug.
-
objcopy
拒绝复制.gnu_debugdata
是的主题this bug.
-
There is一个可以方便地转储此信息的工具:
eu-readelf -Ws --elf-section /usr/bin/ls | grep abformat
37: 0000000000005db0 593 FUNC LOCAL DEFAULT 14 abformat_init