所以我可以添加一个指向调试符号文件的链接,就像这个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
)?那是文件名 only ...
我意识到我可以在这里使用一些shell foo,但似乎很奇怪,有一个选项可以设置这个值,但没有一个可以检索它。所以我可能只是错过了它。
答案 0 :(得分:2)
这样的事情应该有效:
objcopy --output-target=binary --set-section-flags .gnu_debuglink=alloc \
--only-section=.gnu_debuglink helloworld helloworld.dbg
--output-target=binary
避免添加ELF标头。需要--set-section-flags .gnu_debuglink=alloc
,因为objcopy
默认情况下只会写入已分配的部分(使用binary
仿真)。而--only-section=.gnu_debuglink
最终确定了答案。 See this earlier answer.
请注意,生成的文件可能有一个尾随的NUL字节和四个字节的CRC,因此需要进行一些后处理以提取所有内容直到第一个NUL字节(可能使用head -z -n 1 helloworld.dbg | tr -d '\0'
或类似的东西)。 / p>
答案 1 :(得分:1)
您可以直接使用LocC
:
readelf
我不知道第二个条目的含义(它似乎总是不同的)。要摆脱标题和偏移量,可以使用$ readelf --string-dump=.gnu_debuglink helloworld
String dump of section '.gnu_debuglink':
[ 0] helloworld
[ 1b] 9
:
sed