2017-10-18 84 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

嘆了口氣,這是我擔心的 - 謝謝你的明確解釋。 –

相關問題