按照这个有用的指南,我使用 objcopy 在我的代码中嵌入一个大数据文件,如下所示:
arm-none-eabi-objcopy -I binary -O elf32-littlearm "raw_data.bin" "raw_data.o"
这会生成一个有效的输出,但我需要将其存储为常量。我像这样重命名该部分:
arm-none-eabi-objcopy -I binary -O elf32-littlearm --rename-section .data=.rodata,alloc,load,readonly "raw_data.bin" "raw_data.o"
这将创建一个与之前大小相同的文件,但现在所有数据都被替换为零。我用 objdump 验证了这一点:
> arm-none-eabi-objdump -s "raw_data.o"
raw_data.o: file format elf32-littlearm
Contents of section .rodata:
00000 00000000 00000000 00000000 00000000 ................
00010 00000000 00000000 00000000 00000000 ................
00020 00000000 00000000 00000000 00000000 ................
00030 00000000 00000000 00000000 00000000 ................
00040 00000000 00000000 00000000 00000000 ................
00050 00000000 00000000 00000000 00000000 ................
00060 00000000 00000000 00000000 00000000 ................
00070 00000000 00000000 00000000 00000000 ................
00080 00000000 00000000 00000000 00000000 ................
... and so on ...
来自 objcopy 手册:
--重命名部分旧名称=新名称[,标志]
将节从旧名称重命名为新名称,可以选择将该节的标志更改为进程中的标志。与使用链接器脚本执行重命名相比,这样做的优点是输出保留为目标文件,并且不会成为链接的可执行文件。此选项接受与 --set-section-flags 选项相同的标志集。
当输入格式为二进制时,此选项特别有用,因为这将始终创建一个名为 .data 的部分。例如,如果您想创建一个名为 .rodata 的包含二进制数据的部分,您可以使用以下命令行来实现它:
--rename-section .data=.rodata,alloc,load,readonly,data,contents \ <input_binary_file> <output_object_file>
contents
标志是这里的关键。您需要保留它,以便 objcopy 保持节内容完整。