Binutils 如何查看ELF文件的GNU debuglink值?
因此,我可以像下面这样向调试符号文件添加一个链接Binutils 如何查看ELF文件的GNU debuglink值?,binutils,Binutils,因此,我可以像下面这样向调试符号文件添加一个链接objcopy--add gnu debuglink=$name.dbg$name,但是我以后如何再次检索该值呢 我用readelf-a进行了检查,并在没有任何运气的情况下搜索了\.dbg。类似地,我使用objdump-sj.gnu_debuglink(该部分为.gnu_debuglink)检查了该部分,并可以看到其中的值: $ objdump -sj .gnu_debuglink helloworld|grep \.dbg 0000 68656c
objcopy--add gnu debuglink=$name.dbg$name
,但是我以后如何再次检索该值呢
我用readelf-a
进行了检查,并在没有任何运气的情况下搜索了\.dbg
。类似地,我使用objdump-sj.gnu_debuglink
(该部分为.gnu_debuglink
)检查了该部分,并可以看到其中的值:
$ objdump -sj .gnu_debuglink helloworld|grep \.dbg
0000 68656c6c 6f776f72 6c642e64 62670000 helloworld.dbg..
但是,是否有一个命令允许我提取数据并再次检索准确的值(即在上面的示例中helloworld.dbg
)?这只是文件名
我意识到我可以在这里使用一些shell foo,但奇怪的是,存在一个选项来设置这个值,但没有一个选项来检索它。所以我可能只是错过了它。像这样的东西应该有用:
objcopy --output-target=binary --set-section-flags .gnu_debuglink=alloc \
--only-section=.gnu_debuglink helloworld helloworld.dbg
--output target=binary
避免添加ELF头--设置节标志。需要gnu_debuglink=alloc
,因为默认情况下objcopy
只写入分配的节(使用二进制模拟)。而--只有section=.gnu_debuglink
最终确定了答案
请注意,生成的文件可能有一个尾随NUL字节和四个CRC字节,因此需要进行一些后处理以提取到第一个NUL字节的所有内容(可能使用head-z-n1 helloworld.dbg | tr-d'\0'
或类似的内容)。您可以直接使用readelf
:
$ readelf --string-dump=.gnu_debuglink helloworld
String dump of section '.gnu_debuglink':
[ 0] helloworld
[ 1b] 9
我不知道第二个条目意味着什么(似乎总是不同的)。要去除标题和偏移量,可以使用sed
:
$ readelf --string-dump=.gnu_debuglink helloworld | sed -n '/]/{s/.* //;p;q}'
helloworld
第二个条目可能是readelf
的渲染尝试。