我正在为基于 ARM-Cortex M3 的设备编写启动脚本。如果我编译汇编程序启动脚本和 C 应用程序代码,然后组合目标文件并将它们传输到我的设备,一切正常。
但是,如果我使用 ar
要创建存档 (libboot.a) 并将该存档与 C 应用程序结合,有一个问题:
我已将启动代码放在一个部分中:
.section .boot, "ax"
.global _start
_start:
.word 0x10000800 /* Initial stack pointer (FIXME!) */
.word start
.word nmi_handler
.word hard_fault_handler
... etc ...
我发现
ld
从最终的二进制文件中删除它(“引导”部分不可用)。这是很自然的,因为它不依赖于 ld
知道,但它会导致设备无法正确启动。所以我的问题是:强制包含此代码的最佳方法是什么?
最佳答案
尝试添加如下内容:
KEEP(*(.boot))
在
ld
链接脚本告诉链接器保留 .boot
部分。但是,我不确定这是否足以导致
ld
从存档中拉入 .boot
中的任何对象部分 - 它可能根本不考虑对象,除非该对象中的某些符号导致它被拉入。如果这是一个问题,指定 _start
作为入口点(在 ld 命令行中使用 -e _start
或在链接描述文件中使用 ENTRY(_start)
)可能是解决方案。
关于linker - GNU ld 删除部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2682428/