1
MEMORY
{
    RAM (rxai!w) :                  ORIGIN = 0x80000000 LENGTH = 34K
}

假设我在上面的链接器脚本中有一个部分。我可以定义 0x80000000 和 34K。我希望它看起来像,

MEMORY
{
    RAM (rxai!w) :                  ORIGIN = RAM_ORIGIN LENGTH = RAM_LENGTH
}

所以我的问题是如何将这个定义放在链接器脚本中?我有一个自动生成链接器脚本的脚本,并且每次定义都会有所不同。

4

2 回答 2

0

我想用以下格式定义一个不同的文件,如 common.ld,

RAM_ORIGIN = 0x80000000;
RAM_LENGTH = 34K;

作品。但是这个 common.ld 不能直接包含在使用 'INCLUDE' 的链接描述文件中。如果我在命令行中将它作为 -Wl,common.ld 传递,那么它可以工作。

于 2019-02-05T04:40:49.667 回答
0

我已经使用 C 预处理器解决了这个问题cpp

我的链接器脚本包含“变量”,可以从调用cpp实际值的 Makefile 中“填充”:

LDCSRC=script.lk.in
LDCDILE=script.lk

$(LDCFILE): $(LDCSRC)
        $(Q)echo CPP $<
        $(Q)$(CPP) $(INCLUDE) -DOBJDIR=$(1)/objs -P -DFORMAT_ELF=$(FORMAT_ELF) -D$$(MACHINE) $$< -o $$@

然后链接器脚本本身也可以用cpp宏“增强”:

#ifdef COMPILE_RAM
#define ROMFLAGS    WX
#else
#define ROMFLAGS    RX
#endif /* COMPILE_RAM */

MEMORY
{
    _rom (ROMFLAGS) : ORIGIN = TARGET_ADDRESS, LENGTH = 0x00100000

在这个例子中,链接描述文件甚至#include是一个 C 头文件(未显示)来定义TARGET_ADDRESS,以确保我们在代码和链接描述文件中具有相同的定义。您只需要确保此 *.h 文件不包含干扰链接器的语句(应仅包含预处理器定义)。

于 2019-02-07T13:20:01.250 回答