2013-02-14 5 views
3

저는 ARM 임베디드 타겟과 일반 X86 (Linux) 머신에서 실행하는 것보다 소프트웨어 용 모듈러 빌드 시스템을 사용하고 있습니다. GNU toolchain으로 컴파일 중이므로 ld을 사용하여 연결합니다.암시 적 링커 스크립트가 섹션의 LMA를 변경하는 것을 방지하는 방법

모듈 중 하나는 링커 스크립트 트릭을 사용하여 '등록 된'객체의 배열을 어셈블합니다.

#define RegObject(name, arg1, arg2, etc) \ 
    static TRegObject name \ 
    __attribute__((section ("regobj_table"), used)) = \ 
    { arg1, arg2, etc } 

모듈은 또한 링크 단계로 implicit linker script를 추가하고, 다음과 같다 :

SECTIONS 
{ 
    .data : ALIGN(4) 
    { 
     regobj_table_start = .; 
     KEEP(*(regobj_table)) 
     regobj_table_end = .; 
    } 
} 

regobj_table_startregobj_table_end 심볼 코드에 의해 사용되는 객체는 이런 매크로 만든 등록 된 개체를 찾을 수 있습니다. 이 솔루션은 네이티브 (Linux) 컴파일 타겟에서 잘 작동합니다.

그러나 ARM 타겟에서는 작동하지 않습니다. 그 이유는 대상에 대한 사용자 정의 기본 링커 스크립트 (OS없이 실행되는 초소형 마이크로 컨트롤러)가 있기 때문에 .data 섹션의로드 메모리 주소를 정의합니다. 이것은 섹션이 플래시 메모리에 저장 되었기 때문에 마이크로 컨트롤러가 부팅되면 RAM에 복사되기 때문입니다.

MEMORY 
{ 
    ROM (rx) : ORIGIN = 0x00000000, LENGTH = 512k 
    RAM (rwx) : ORIGIN = 0x40000000, LENGTH = 32k 
} 

SECTIONS 
{ 
    /* ... other stuff ... */ 

    .data : 
    { 
     _data = .; 
     *(.data) 
     *(.data.*) 
    } >RAM AT>ROM 

    /* ... even more stuff ... */ 
} 

이는은 0x4000000 범위에있는 곳으로 .data 섹션의 VMA를 설정하고, 0x00000000의 범위에서 LMA : 링커 스크립트의 관련 부분은 다음과 같습니다.

암시 적 링커 스크립트가 ld의 명령 줄에 추가되면 LMA에 대해 잊어 버리고 VMA와 다시 동일하게되는 문제는입니다. 암시 적 링커 스크립트를로드 할 때 ld에게 LMA를 건드리지 말라고하는 방법을 필사적으로 찾고 있습니다.

+0

ARM 빌드에 대해 암시 적 스크립트 (암시 적으로 사용 된 스크립트)를 추가하면 속임수가 발생합니다 (SECTIONS {.data {} AT> ROM}'). 또는, ARM 빌드가 처음에는 다른 암시 적 스크립트를 사용할 수 있다면 해당 스크립트의 적절한 위치에'AT> ROM'을 추가하십시오. –

+0

ROM 메모리 영역이 정의 된 스크립트 외부에서 사용할 수 없으므로 작동하지 않습니다. 나는 이미 그것을 시도했다. – Bart

+0

암시 적 스크립트를 ARM의 명시 적 스크립트에 임베드하는 것을 고려한 적이 있습니까? (불행히도 - 두 개의 스크립트 - ARM 용 및 암시 적 짧은 x86 용) - 이것은 실제로 가장 간단한 솔루션입니다. 아니면 개체에 사용자 정의 섹션을 사용합니까? –

답변

0

마지막 줄에 INSERT AFTER ...를 사용해보십시오. 스크립트가 기본 스크립트에 삽입됩니다.