Jon*_*tan 7 embedded linker arm gnu-assembler ld
我正在为基于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 ...
Run Code Online (Sandbox Code Playgroud)
我发现ld从最终的二进制文件中剥离了这个("boot"部分不可用).这是非常自然的,因为它不ld知道它的依赖性,但它会导致设备无法正确启动.
所以我的问题是:强制包含此代码的最佳方法是什么?
Mic*_*urr 10
尝试添加以下内容:
KEEP(*(.boot))
Run Code Online (Sandbox Code Playgroud)
在ld链接器脚本中告诉链接器保留该.boot节.
但是,我不确定这是否足以导致ld从该.boot部分中的归档中提取任何对象- 它可能根本不考虑对象,除非该对象中的某些符号导致它被拉入.如果这是一个问题,指定_start入口点(-e _start在ld命令行上使用或ENTRY(_start)在链接器脚本中使用)可能是解决方案.