vim*_*hap 6 c linker gcc duplicate-data elf
我有一个要求,需要创建 .data 部分的重复/复制部分。
我尝试在链接器脚本中创建一个与数据部分大小相同的虚拟部分,并将数据部分的内容复制到 ELF 映像的 init 函数中的虚拟部分,但这不符合我的要求,因为我想要复制/复制要与最终 ELF 图像一起创建的部分,而不是在执行期间。
以下是我在链接器脚本中想要的内容,
SECTIONS {
.data : { <data section contents> }
.dummydata : { <copy of .data section> }
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助编写链接器脚本来满足上述要求吗?
我认为仅用ld链接器脚本就可以完成此操作。鉴于这里的这一行:
如果文件名与多个通配符模式匹配,或者文件名显式出现并且还与通配符模式匹配,则链接器将使用链接描述文件中的第一个匹配项。
听起来链接描述文件只会将数据(或任何内容)放在一个部分中。
然而,我们并没有失去所有希望。您可以使用复制该部分objcopy,然后objcopy再次使用添加该部分
objcopy -O binary --only-section=.data your-file temp.bin
objcopy --add-section .dummydata=temp.bin your-file
Run Code Online (Sandbox Code Playgroud)
这将将该部分追加为 VMA/LMA 为 0 的最后一个部分。然后您可以使用objcopy将该部分移动到所需位置。
objcopy --change-section-address .dummydata=desired-address your-file
Run Code Online (Sandbox Code Playgroud)
当然,如果已有的东西存在的话就会有问题。幸运的是,您可以在第一个洞之后立即创建一个洞,.data例如:
data_start = .;
.data : { *(.data) }
data_end = .;
. += (data_end - data_start);
Run Code Online (Sandbox Code Playgroud)
这应该会在第一个数据之后创建一个洞,该洞足够大,可以在其后放置另一个数据副本。如果这不是您想要的位置,只需在(data_end - data_start)您想要的位置添加孔即可。
最后你可以再次更改部分标志objcopy
objcopy --set-section-flags .dummydata=the-flags-you-want your-file
Run Code Online (Sandbox Code Playgroud)
不像在链接器脚本中复制某些内容那么干净,但它应该可以工作。