【问题标题】:Modifying contents of data section in ELF修改 ELF 中数据部分的内容
【发布时间】: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


【解决方案1】:

如果其他更简单的方法不适合,您可以使用ELFIO 库来实现此类功能。

【讨论】:

  • 会试一试。现在我使数组大小更大,因此编译器将空间初始化为全 0,我不必担心大小。我写了一个脚本来编辑精灵中的 0 以及事后我想要的字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 2011-04-24
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2013-03-29
相关资源
最近更新 更多