如何避免 objcopy 炸毁文件?

Posted

技术标签:

【中文标题】如何避免 objcopy 炸毁文件?【英文标题】:how to avoid objcopy blowing up the file? 【发布时间】:2017-06-02 10:29:10 【问题描述】:

我使用objcopy 提取/替换某些部分是 Windows 系统上的 ELF 文件。

>objcopy.exe -V
GNU objcopy 2.17.50 20060824
Copyright 2005 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License.  This program has absolutely no warranty.

这通常有效。

但我的 elf 文件包含调试信息,我需要在交付前删除这些信息以减小文件大小。

我发现 -g--strip-debug 选项应该可以满足我的需求:

>"objcopy.exe" --strip-debug -I elf32-big -O elf32-big with-debug.elf without-debug.elf

但是失败得很惨。而不是使文件更小,它在失败之前将文件大小从〜20MB扩大到3GB:

objcopy.exe: without-debug.elf: File truncated
objcopy.exe: without-debug.elf: No space left on device

如何使用 objcopy 从 ELF 中正确删除调试信息?


不知道这是否重要,但 objcopy 对 ELF 中的大多数部分发出一些警告,如下所示:

BFD: without-debug.elf: warning: allocated section `.sdata' not in segment

【问题讨论】:

【参考方案1】:

听起来像是 binutils 中的错误。

您使用的是 10 年前的版本,不是正式发布,而是随机拍摄的快照。

我会首先尝试当前版本的 binutils(2.28 版)——您遇到的任何错误都有可能已经修复。如果还没有,您可以在 binutils bugzilla 中报告。

【讨论】:

我的问题是我绑定到那个版本。较新的版本在另一个功能上具有不同的行为,这会造成麻烦......

以上是关于如何避免 objcopy 炸毁文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 `objcopy` 支持 efi-app 目标?

Objcopy,它如何进行二进制输出?

使用 objcopy 将文本文件添加到二进制文件,但 objcopy 抱怨架构

binutils工具集之---objcopy,ranlib,size

如何使用 OBJCOPY 的 --add-section 开关?

Objcopy 获取目标文件 64 位二进制文​​件