【问题标题】:How to make duplicate sections in ELF file如何在 ELF 文件中创建重复的部分
【发布时间】:2015-06-29 20:43:25
【问题描述】:

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

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

下面是我想要的链接器脚本,

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

谁能帮助编写符合上述要求的链接描述文件?

【问题讨论】:

  • 你认为你为什么要这样做?这感觉就像XY Problem
  • @Jonathan 我的平台希望将数据部分内容的副本加载到预定义的位置,以将其用作 ROM 数据。到目前为止,这种安排基本上是由第三方编译器工具链完成的,但我们现在想迁移到 GNU 开源工具链。有一种方法可以通过更改与 ROM 数据一起使用的汇编代码来满足这个新版本的 ELF 映像启动的要求,但我不想打扰汇编代码,所以我想通过在链接描述文件中创建数据部分的副本。
  • 玩得开心!我不知道这是不可能的,但我不知道如何去做。

标签: c gcc linker elf duplicate-data


【解决方案1】:

我认为这不能仅使用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

不像只是在链接描述文件中复制一些东西那么干净,但它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2016-12-15
    • 1970-01-01
    • 2017-10-20
    • 2019-06-28
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多