2011-03-08 4 views
4

ARM9 프로세서의 기본 C 프로그램에서 전역 변수를 정의 할 때 문제가 발생합니다. 나는 EABI GNU 컴파일러를 사용 중이며 12KB 엘프에서 생성 된 바이너리는 4GB입니다! 나는 문제가 내 분산 파일과 함께 있다고 생각하지만, 내 머리를 쓰는 데 문제가있다.objcopy가있는 거대한 이진 파일

int a=10; 
int main() { 
    int b=5; 
    b = (a>b)? a : b; 
    return b; 
}; 

내가 로를 선언하면 다음과 같이

나는 ROM 256의 (기본 주소 0xFFFF0000)이 있고 RAM의 32KBs (기본 0x01000000)

SECTIONS { 
    . = 0xFFFF0000; 
    .text : { 
    * (vectors); 
    * (.text); 
    } 
    .rodata : { *(.rodata) } 
    . = 0x01000000; 
    sbss = .; 
    .data : { *(.data) } 
    .bss : { *(.bss) } 
    ebss = .; 
    bssSize = ebss - sbss; 
} 

그리고 내 프로그램입니다 지역 변수, 즉 .data 섹션이 없다면 모든 것이 작동합니다. 괜찮습니다. 어떤 도움이라도 대단히 감사합니다.

--16th 월 2011--
사람이 임 갈 곳없는 등 ...
내 부팅, 컴파일 명령 objcopy의 명령

아래에 붙여 넣은 설명서, 포럼을 읽고,이 작업에 도움을 줄 수 있습니다
 .section "vectors" 
reset: b start 
undef: b undef 
swi: b swi 
pabt: b pabt 
dabt: b dabt 
    nop 
irq: b irq 
fiq: b fiq 
.text 
start: 
     ldr sp, =0x01006000 
     bl main 

stop: b  stop 

아암 그럼에도 EABI-GCC -mcpu = ARM926EJ-S - 벽 -nostartfiles - 벽을 main.c boot.s -o main.elf -T \ scatter_f ile
arm-none-eabi-objcopy ./main.elf --output-target = binary ./main.bin
arm-none-eabi-objdump ./main.elf --disassemble-all> ./main .dis

+0

줄을 제거하면 파일이 얼마나 큽니까? = 0x01000000; ' ? – fazo

+0

RAM 주소 (0x01000000)를 제거하면 364 바이트가됩니다. – Damn

답변

2

문제점을 발견했습니다. objcopy 명령은 가장 낮은 주소에서 그 사이의 모든 것을 포함하여 가장 높은 주소까지 링커 스크립트에 설명 된 전체 주소 공간을 만들려고 시도합니다. 다음과 같이 그냥 ROM 코드를 생성하도록 지시 할 수 있습니다

objcopy의 ./main.elf -j ROM --output-대상 = 이진 ./main.bin을 나는 또한 변경

링커 스크립트 약간

MEMORY { 
    ram(WXAIL) : ORIGIN = 0x01000000, LENGTH = 32K  
    rom(RX) : ORIGIN = 0xFFFF0000, LENGTH = 32K      
} 

SECTIONS { 
    ROM : { 
    *(vectors); 
    *(.text); 
    *(.rodata); 
    } > rom 

    RAM : { 
    *(.data); 
    *(.bss); 
    } > ram 
} 
+0

그러나 .DATA 세그먼트가 좀 중요 너무 아닌가요? 난 그냥 그것을 버릴 수 없어 거기에 ROM 섹션을 복사하면 잃어버린 초기화 된 데이터가 있습니다. – user1273684

+0

@ user1273684에 대한 의견이 있으십니까? – ransh

2

주소가 0x01000000부터 시작하여 최대 0xFFFF0000 인 파일을 만듭니다. 그것은 거의 4 기가 바이트입니다. 너 뭐가 좋겠 니? 데이터 세그먼트를 원하지 않는다면 -R 옵션을 사용하여 데이터 세그먼트를 제거하십시오 (ROM 초기화 파일을 준비하는 경우).

+0

이해가 안됩니다. 필자는 링커 스크립트가 텍스트, 벡터 및 읽기 전용 데이터 (예 : ROM)를 포함하는 0xFFFF0000부터 시작하는 섹션을 정의하고 있다고 생각 했으므로 ffff0000부터이 모든 것의 크기입니다. 그런 다음 다른 섹션은 데이터 및 bss에 대해 주소 0x01000000에서 시작하여 정의됩니다. 이 섹션들 사이에 무엇이 정의되어 있지 않은가? 왜 그것을 채우고 있는가? 전역 변수가 있으면 채울 것입니다. 내가 -R을 사용하려고 시도했지만 정의되지 않은 메모리 섹션을 제거하려면 어떻게합니까? – Damn

+0

elf 파일이 괜찮은 것 같습니다. 바이너리가 잘못되었습니다. [link] (readelf -l main.엘프) 엘프 파일 형식이 EXEC (실행 파일) 진입 점 0xffff0000 에서 시작하는이 프로그램 헤더, 52 프로그램 헤더가 오프셋입니다 : 입력 오프셋 VirtAddr PhysAddr FileSiz MemSiz FLG 정렬 LOAD 0x008000 0x01000000 0x01000000 0x00004 0x00004 RW 0x8000이 세그먼트 매핑 LOAD가 0x010000 0xffff0000 0xffff0000 0x00148 0x00148 RE 0x8000을 섹션 : 세그먼트 섹션 ... 00 .DATA 01는 .text [\ 코드] – Damn