GNU ld删除部分

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)在链接器脚本中使用)可能是解决方案.