【发布时间】:2017-09-13 12:37:55
【问题描述】:
我有兴趣创建一个外部符号文件,我使用 objcopy --add-gnu-debuglink=... 从我的 ELF 文件中引用它。
现在我知道如何仅提取调试符号 (objcopy --only-keep-debug) 以及如何仅去除调试符号 (objcopy --strip-debug)。
但是,我想去掉所有不需要的符号。我知道这可以通过objcopy --strip-unneeded 完成。调试符号和不需要的符号是两个不同的类别和两个不同的命令行开关这一事实表明可能存在不重叠的符号。
由于不需要的符号似乎包含更多而不仅仅是调试符号,我担心这样做时会丢失一些符号信息(在 GNU make 中):
stripped/%: %
objcopy --only-keep-debug $@ $@.dbg
objcopy --strip-unneeded $@
objcopy --add-gnu-debuglink=$@.dbg $@
谁能解释一下哪些符号可以通过--strip-unneeded 删除,而哪些符号不能通过--strip-debug 删除?或者换一种说法:在原始二进制文件上运行--strip-unneeded 时,--only-keep-debug 未保存在外部符号文件中的哪些符号可能会丢失?有没有办法将这些符号保留在我的外部符号文件中,或者这不是问题?
目标是能够使用外部调试符号来调试问题,而不至于错过一些符号信息而发现为时已晚。所以我不想丢失符号信息,我只想从程序二进制文件中完全删除它。
PS:我知道How to generate gcc debug symbol outside the build target? 但这个问题及其答案并没有触及我所询问的细节。
【问题讨论】:
-
我发现this article 有一些有用的信息。甚至可以回答这个问题。
-
@mshildt:确实有用。谢谢。不幸的是,它没有回答问题,即如果我仅将调试符号提取到外部文件中,然后在原始文件上使用
--strip-unneeded,哪些符号可能会丢失。
标签: debug-symbols objcopy