为GNU .ld脚本源定义符号常量

时间:2017-10-18 21:59:06

标签: c linker gnu

我正在创建一个GNU .ld链接器脚本,并希望以符号方式定义某些内存部分的来源。以下不起作用:

BASE_ADDR = 0x4000;

MEMORY
{
  m_interrupts        (RX) : ORIGIN = BASE_ADDR, LENGTH = 0x0200
  m_bootloader_config (RX) : ORIGIN = BASE_ADDR + 0x3C0, LENGTH = 0x0040
  m_text              (RX) : ORIGIN = BASE_ADDR + 0x400, LENGTH = 0x10000 - (BASE_ADDR + 0x400)
  m_data              (RW) : ORIGIN = 0x1FFFF000, LENGTH = 0x4000
}

这会导致以下错误:

Invoking: Cross ARM C++ Linker
../MKL27Z64xxx4_flash.ld:67: nonconstant expression for origin
collect2: error: ld returned 1 exit status

错误是指以下行:

m_interrupts        (RX) : ORIGIN = BASE_ADDR, LENGTH = 0x0200

令我感到困惑的是,BASE_ADDR看起来非常不变。是否需要调用一些特殊语法来说服ld BASE_ADDR是否为常量?

1 个答案:

答案 0 :(得分:0)

LD手册指出,对于MEMORY:

"原点是存储区起始地址的表达式。在执行内存分配之前,表达式必须求值为常量,这意味着您不能使用任何节相对符号。关键字ORIGIN可以缩写为org或o(但不是,例如,ORG)。 "

表达式:BASE_ADDR = 0X4000;是一个部分相对符号

以下文字也适用于:

"但是,在存储分配之前,其他值(例如符号值)是未知的或不需要的。当其他信息(例如输出节的大小)可用于符号赋值表达式时,将对此类值进行评估。 "

建议在MEMORY分配中使用硬编码值