我正在创建一个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
是否为常量?
答案 0 :(得分:0)
LD手册指出,对于MEMORY:
"原点是存储区起始地址的表达式。在执行内存分配之前,表达式必须求值为常量,这意味着您不能使用任何节相对符号。关键字ORIGIN可以缩写为org或o(但不是,例如,ORG)。 "
表达式:BASE_ADDR = 0X4000;
是一个部分相对符号
以下文字也适用于:
"但是,在存储分配之前,其他值(例如符号值)是未知的或不需要的。当其他信息(例如输出节的大小)可用于符号赋值表达式时,将对此类值进行评估。 "
建议在MEMORY分配中使用硬编码值