Linux 修改ELF中数据节的内容

Linux 修改ELF中数据节的内容,linux,executable,elf,Linux,Executable,Elf,我有一个将数组初始化为0的程序。我已使用以下命令将该数组的值指向自定义节:\uuuuu属性(section(.mysection)) 以上只是为了我们有一个默认值,链接器将该节标记为可加载,并将其包含在相应的节列表中 现在我希望编辑生成的ELF,并根据我的选择修改该结构的内容。我已经有了一个二进制文件,其中包含了我希望用于该部分的内容。 我尝试使用--remove-section和--add-section,但无法强制新的部分成为这些部分的一部分 不确定--update部分在这里是否有用,但是我

我有一个将数组初始化为0的程序。我已使用以下命令将该数组的值指向自定义节:
\uuuuu属性(section(.mysection))

以上只是为了我们有一个默认值,链接器将该节标记为可加载,并将其包含在相应的节列表中

现在我希望编辑生成的ELF,并根据我的选择修改该结构的内容。我已经有了一个二进制文件,其中包含了我希望用于该部分的内容。 我尝试使用--remove-section和--add-section,但无法强制新的部分成为这些部分的一部分

不确定--update部分在这里是否有用,但是我的微控制器在objcopy中没有--update部分,当我尝试它的公共版本时,它说它不支持bfd目标

FWIW,ELF不使用任何可重定位地址等。所有地址都是内存中的物理地址


有没有办法做到这一点?我只需要替换节的内容并修改其长度。

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

“并修改其长度”-如果原始ELF中的节的长度不正确,那么这将非常复杂。假设您只是想对ELF文件进行二进制编辑,那么如果节的长度已经正确,则只替换数据是可能的。用预计算的数据填充数组的一种常见方法,而不是在对象文件中混淆节,只需生成一个定义初始化数组的简单C源文件。例如,有一个脚本输出
struct my_struct my_array[1]={
后跟所有所需的十进制或十六进制项。然后只需编译它并将其与程序链接。将对象文件处理留给知道如何处理它的现有工具。目前,我将数组大小增大,因此编译器将空间初始化为所有0,然后编写脚本在事后对其进行修改。将对此进行详细说明试试看。现在我把数组的大小调大了,所以编译器将空间初始化为所有0,我不必担心大小。我编写了一个脚本,在elf中用我想要的字节编辑0。
struct my_struct my_array[1] __attribute__((section(".mysection"))) = {
    {0, 0},
};