linker - GNU ld 删除部分

标签 linker embedded arm ld gnu-assembler

我正在为基于 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/

相关文章:

linux - Linux 机器上的 SD 卡吞吐量

interface - 处理器与高速外设之间的通信

C++ 字符串覆盖链接错误

c++ - Windows 中的 ffmpeg/libav 链接问题

c++ - 如何将 C++ 目标文件与 ld 链接

c++ - 嵌入式系统的工厂方法模式

android - 为什么使用 armeabi-v7a 代码而不是 armeabi 代码?

java - 是否可以通过openjdk在android上运行java应用程序

c++ - 在 ARM NEON 中的数组边界上加载 vector

c++ - 尝试链接 .cpp 文件时出现多重定义错误(头文件中没有 .cpp)