2017-10-18 1 views
0

저는 GNU .ld 링커 스크립트를 만들고 있으며 일부 메모리 섹션의 기원을 상징적으로 정의하려고합니다. 다음은 작동하지 않습니다 오류가 읽어 줄을 참조한다GNU .ld 스크립트 원본에 대한 기호 상수 정의

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 = 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 
} 

BASE_ADDR는 나에게 꽤 상수로 보인다. ldBASE_ADDR이 상수라고 확신 시키려면 몇 가지 특수 구문이 필요합니까? MEMORY에 대한

+0

에 하드 코딩 된 값을 사용하는 것이 좋습니다 어떤 버전의 이클립스에 따르면 – wds

+0

사용하고, 그것을 사용하고 :.?"를 GNU ARM C/C++ 크로스 컴파일러 \t 2.4. 1.201704251808 \t ilg.gnuarmeclipse.managedbuild.cross.feature.group \t Liviu Ionescu " 어느 특정 버전의 링커를 사용하고 있는지 명확히하지 않습니다. –

답변

0

레이저 다이오드 매뉴얼 주 :.

는 "원점 메모리 영역의 시작 주소에 대한 표현이다 표현식은 상수로 평가되어야 메모리 할당이 수행되기 전에, 의미 당신은하지 않을 수 있습니다 어떤 부분을 상대 기호를 사용하여 키워드 ORIGIN (예, ORG를 들어,하지만) 조직 또는 o을 단축 할 수있다 "

그리고 표현을 :.. BASE_ADDR = 0X4000;

다음 텍스트 또한이 속하는 섹션 상대 상징 :

"그러나 다른 값 (예 : 기호 값)은 저장 할당 후까지 알 수 없거나 필요하지 않습니다. 이러한 값은 나중에 출력 섹션의 크기와 같은 다른 정보를 기호 할당 표현식에 사용할 수있을 때 평가됩니다. "

이 바이너리 유틸리티 2.26와 함께 작동하도록 나타나는 메모리 할당

+0

그게 바로 제가 두려워했던 것입니다 - 명확한 해석 덕분입니다. –

관련 문제