【发布时间】:2021-01-26 08:14:10
【问题描述】:
我有一个将数组初始化为 0 的程序。我已将该数组的值指向自定义部分,使用:__attribute__((section(".mysection")))
struct my_struct my_array[1] __attribute__((section(".mysection"))) = {
{0, 0},
};
以上只是为了让我们有一个默认值,链接器将该部分标记为可加载,并将其包含在适当的部分列表中。
现在我希望编辑生成的 ELF 并根据我的选择修改该结构的内容。我已经有一个二进制文件,其中包含我希望该部分的内容。 我尝试使用 --remove-section 和 --add-section 但无法强制新部分成为部分的一部分。
不确定 --update-section 在这里是否有帮助,但我的微控制器在 objcopy 中没有 --update-section 并且当我尝试它的公共版本时,它表示它不支持 bfd 目标.
FWIW,ELF 不使用任何可重定位地址等。所有地址都是内存中的物理地址。
有没有办法做到这一点?我只需要替换部分的内容并修改它的长度。
【问题讨论】:
-
“并修改它的长度”——如果你的原始 ELF 中的部分还没有正确的长度,那么这将变得更加复杂。假设您只想对 ELF 文件进行二进制编辑,那么如果该部分已经是正确的长度,则只需替换数据即可。
-
一种用预先计算的数据填充数组的常用方法,而不是弄乱目标文件中的部分,只是生成一个定义初始化数组的简单 C 源文件。例如。有一个脚本输出
struct my_struct my_array[1] = {,后跟所有所需的十进制或十六进制条目。然后只需编译它并将其与您的程序链接。将目标文件处理留给知道如何处理它的现有工具。 -
现在我使数组大小变大了,所以编译器将空间初始化为全 0,然后编写脚本在事后对其进行修改。
标签: linux executable elf