如何防止隐式链接描述文件更改节的LMA

时间:2013-02-14 17:28:06

标签: c embedded ld binutils linker-scripts

我使用模块化构建系统来运行软件,而不是在ARM嵌入式目标以及普通X86(linux)机器上运行。我正在使用GNU工具链进行编译,因此使用ld进行链接。

其中一个模块利用linkerscript技巧来组装“已注册”对象的数组。使用如下宏创建对象:

#define RegObject(name, arg1, arg2, etc) \
    static TRegObject name \
    __attribute__((section ("regobj_table"), used)) = \
    { arg1, arg2, etc }

该模块还在链接步骤中添加implicit linker script,如下所示:

SECTIONS
{
    .data : ALIGN(4)
    {
        regobj_table_start = .;
        KEEP(*(regobj_table))
        regobj_table_end = .;
    }
}

代码使用regobj_table_startregobj_table_end符号来查找已注册的对象。此解决方案适用于本机(Linux)编译目标。

然而,这对ARM目标不起作用。原因是我有一个针对目标的自定义默认链接描述文件(它是一个微型微控制器,在没有操作系统的情况下运行),它定义了.data部分的加载内存地址。这是因为该部分存储在闪存中,但是一旦微控制器启动它就会被复制到RAM中。链接描述文件的相关部分如下所示:

MEMORY
{
  ROM (rx)  : ORIGIN = 0x00000000, LENGTH = 512k
  RAM (rwx) : ORIGIN = 0x40000000, LENGTH = 32k
}

SECTIONS
{
    /* ... other stuff ... */

    .data :
    {
        _data = .;
        *(.data)
        *(.data.*)
    } >RAM AT>ROM

    /* ... even more stuff ... */
}

这会将.data部分的VMA设置为0x4000000范围内的某个位置,并将LMA设置为0x00000000范围内。

问题是当隐式链接描述文件被添加到ld的命令行时,它只是忘记了LMA,它再次变得等于VMA。我正在拼命寻找一种方法来告诉ld在加载隐式链接描述文件时不要触摸LMA。

1 个答案:

答案 0 :(得分:0)

尝试使用INSERT AFTER ...作为最后一行。这会将您的脚本插入默认脚本。