如何在ELF文件

时间:2015-06-29 20:43:26

标签: c gcc linker elf duplicate-data

我有一个要求,我需要创建.data部分的重复/复制部分。

我尝试在链接描述文件中创建一个具有相同大小的数据部分的虚拟部分,并将数据部分的内容复制到我的ELF图像的init函数中的虚拟部分,但这不符合我的要求,如我希望复制/复制部分与最终ELF图像一起创建,而不是在执行期间。

以下是我在链接描述文件中想要的内容

SECTIONS {
    .data : { <data section contents> }
    .dummydata : { <copy of .data section> } 
}

任何人都可以帮助编写链接器脚本以匹配上述要求吗?

1 个答案:

答案 0 :(得分:3)

我认为只需使用ld和链接描述文件即可完成此操作。给出here的这一行:

  

如果文件名与多个通配符模式匹配,或者与文件匹配   name显式出现,并且还与通配符模式匹配   链接器将使用链接描述文件中的第一个匹配项。

听起来链接器脚本只会将数据(或任何内容)放在一个部分中。

然而,所有的希望都没有丢失。您可以使用objcopy复制该部分,然后再次使用objcopy添加该部分

objcopy -O binary --only-section=.data your-file temp.bin
objcopy --add-section .dummydata=temp.bin your-file

这会将该部分附加为VMA / LMA为0的最后一部分。然后,您可以使用objcopy将该部分移动到所需位置。

objcopy --change-section-address .dummydata=desired-address your-file

当然,如果已经有某些东西存在问题。幸运的是,你可以在第一个.data之后创建一个洞,例如:

data_start = .;
.data : { *(.data) }
data_end = .;
. += (data_end - data_start);

这应该在您的第一个数据之后立即创建一个洞,大到足以在其后立即放置另一个数据副本。如果这不是您想要的地方,只需将(data_end - data_start)添加到您想要的地方。

最后,您可以使用objcopy

再次更改部分标记
objcopy --set-section-flags .dummydata=the-flags-you-want your-file

不像在链接描述文件中复制某些内容那样简洁,但它应该可以正常工作。