如何在ELF文件中创建重复的部分

6

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

我尝试在链接器脚本中创建一个与数据节大小相同的虚拟节,并将数据节的内容复制到ELF映像的init函数中的虚拟节中,但这并不符合我的要求,因为我希望复制/重复的节能够随着最终的ELF映像一起创建,而不是在执行期间创建。

以下是我在链接器脚本中想要的内容:

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

有人能帮忙编写连接器脚本以满足上述要求吗?


你为什么想要做这件事?这感觉像是一个 XY 问题 - Jonathan Leffler
@Jonathan 我的平台期望将数据段内容的副本加载到预定义位置以将其用作ROM数据。基本上,这个安排一直由第三方编译器工具链完成,但现在我们想迁移到GNU开源工具链。有一种方法可以通过更改汇编代码来处理与ROM数据一起工作以满足新版本的ELF映像的要求,但我不想干扰汇编代码,所以我想通过在链接器脚本中创建数据段的副本来实现它。 - vimal prathap
玩得开心!我不知道它是否不可能,但我不知道如何去做。 - Jonathan Leffler
1个回答

3
我认为仅使用ld和链接脚本无法完成此操作。根据此处的以下内容:

如果文件名匹配多个通配符模式,或者文件名明确出现并且也被通配符模式匹配,则链接器将在链接脚本中使用第一个匹配项。

看起来链接脚本只会将数据(或任何东西)放在一个部分中。
但是还有希望。您可以使用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

虽然不如在链接脚本中直接复制某些内容那样简洁,但这种方法应该是可行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接