c++ - 如何使用 objcopy 将 ARM_ATTRIBUTES 部分添加到二进制文件中
问题描述
我正在尝试将一个部分从专有二进制文件移动到我自己的目标文件中,以便我可以链接它。但是,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 部分?
解决方案
推荐阅读
- reactjs - 来自不同班级的天才聊天附加消息
- c# - 检测与 VR 按钮方向相同的控制器移动
- ios - CGContext 绘制两个相邻的菱形会产生很细的间隙,如何减小呢?
- laravel - spatie/laravel-permissions - Gate 和 hasPermissionTo 不起作用
- javascript - 部署 React 应用程序
- wcf - 未在 System.Data.Services.AstoriaRequestMessage.get_HttpVerb() 实现
- docusignapi - DocuSign 收件人签名日期不可通过 REST API 获得,而可通过 Connect XML 事件获得
- python - 哪种真正的方法可以创建几个具有可从其他类继承的默认值的类并使用一个通用行为 init
- php - Phpmyadmin 在 xampp 中不起作用
- numpy - 按 ndarray 的值对索引进行采样的更快解决方案