我正在尝试将一个部分从专有二进制文件移动到我自己的目标文件中,以便我可以链接它。但是,ARM 架构数据没有正确添加到生成的目标文件中,因此它没有链接到最终的可执行文件中。
我使用以下命令执行此操作:
arm-none-eabi-objcopy --rename-section .data=.rodata,contents,alloc,load,readonly,data
-I binary -O elf32-littlearm -B arm prop_fw.bin fw_data.o
当我尝试将此目标文件链接到我的可执行文件中时,我得到:
arm-none-eabi-ld: error: ../fw_lib.a(fw_data.o): Conflicting CPU architectures 13/0
这似乎是因为生成的对象中没有 ARM 架构数据。我已经将生成的 fw_data.o 与使用 objdump 和 readelf 的编译器(例如 main.o)生成的目标文件进行了比较。成功链接的对象文件似乎都有.ARM.attributes
我生成的对象没有的部分。
作为测试,我从 main.o 手动转储了该部分并将其添加到我的 objcopy 命令中:
arm-none-eabi-objcopy --rename-section .data=.rodata,contents,alloc,load,readonly,data
-I binary -O elf32-littlearm -B arm prop_fw.bin fw_data.o
--add-section .ARM.attributes=attributes_dump.bin
这成功地将部分添加到对象,但编译器似乎没有拾取它,它仍然无法链接。比较 main.o 和 fw_data.o 我发现这些部分的类型不同:
main.o
[31] .ARM.attributes ARM_ATTRIBUTES 00000000 001abc 000033 00 0 0 1
fw_data.o
[ 3] .ARM.attributes PROGBITS 00000000 0078b9 000033 00 0 0 1
我还尝试将 .data 部分转储到文件并使用 ld 创建 fw_data.o ,因为这个问题表明:确定 GNU binutils 的目标和体系结构的“正确”方法是什么?
arm-none-eabi-objcopy --dump-section .data=fw_data.bin -I binary -O elf32-littlearm -B arm prop_fw.bin
arm-none-eabi-ld -r -b binary -A elf32-littlearm -o fw_data.o fw_data.bin
这会导致生成的相同问题,fw_data.o
并且仍然无法链接。
如何在使用 objcopy 生成的目标文件中正确设置 ARM_ATTRIBUTES 部分?