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
的渲染尝试。