链接器 – GNU 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 ...

我发现ld从最终的二进制文件中删除了它(“boot”部分不可用).这是很自然的,因为它不知道ld知道它,但它会导致设备无法正确启动.

所以我的问题是:强制包含此代码的最佳方法是什么?

最佳答案
尝试添加以下内容:

KEEP(*(.boot))

在ld链接器脚本中告诉链接器保留.boot部分.

但是,我不确定这是否足以导致ld从.boot部分中的归档中提取任何对象 – 它可能根本不考虑对象,除非该对象中的某些符号导致它被拉如果这是一个问题,指定_start作为入口点(在ld命令行上使用-e _start或在链接描述文件中使用ENTRY(_start))可能是解决方案.

转载注明原文:链接器 – GNU ld删除部分 - 代码日志