2017-10-18 86 views
0

我正在创建一个GNU .ld链接器脚本,并且想要象征性地定义某些内存段的起源。以下不工作:为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对我来说看起来很不稳定。是否有一些特殊语法需要调用以说服ldBASE_ADDR是恒定的?

+0

这似乎与binutils的2.26到工作中使用硬编码值,你在使用 – wds

+0

根据Eclipse版本,它使用:?” GNU ARM C/C++编译器\t 2.4。 1.201704251808 \t ilg.gnuarmeclipse.managedbuild.cross.feature.group \t Liviu Ionescu“ 不清楚它使用的链接器的特定版本 –

回答

0

的LD手册指出,对于MEMORY:

“的原点是用于存储器区域的起始地址的表达式的表达式必须计算一个常数执行存储区分配之前,这意味着你可以不使用任何段相对符号关键字ORIGIN可被缩写为org或o(但不是,例如,ORG)“

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

下面的文本还涉及:

“但是,其他值(例如符号值)在存储分配之后才是已知的或需要的。当其他信息(如输出部分的大小)可用于符号分配表达式时,稍后会对这些值进行评估。 “

推荐在内存分配

+0

叹了口气,这是我担心的 - 谢谢你的明确解释。 –

相关问题