2014-11-09 11 views
0

나는 Microblaze에 대해 주소 0x00000000 (즉, 리셋시 실행되도록)에로드하려는 어셈블러가 있습니다.링크에서 파일 오프셋 제어

나는 (내가 생각하는)이 작업을 수행해야 링커 스크립트가 있습니다

SECTIONS 
{ 
    ENTRY(_start) 
    . = 0x0000; 
    .vectors.reset : { *(.vectors.reset) } 
    . = 0x0008; 
    .vectors.sw_exception : { *(.vectors.sw_exception) } 
    . = 0x0010; 
    .vectors.interrupt : { *(.vectors.interrupt) } 
    . = 0x0018; 
    .vectors.hw_exception : { *(.vectors.hw_exception) } 
    . = 0x100; 
    .text : { *(.text) } 
    .data : { *(.data) } 
    .bss : { *(.bss) } 
} 

을하지만 코드를 컴파일 할 때이 0x1000 인에 의해 상쇄 될 것 같다

objdump -h startup.MICROBLAZE.elf 

startup.MICROBLAZE.elf:  file format elf32-big 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .vectors.reset 00000008 00000000 00000000 00001000 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    1 .vectors.sw_exception 00000008 00000008 00000008 00001008 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    2 .vectors.interrupt 00000008 00000010 00000010 00001010 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    3 .vectors.hw_exception 00000008 00000018 00000018 00001018 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    4 .text   00000020 00000100 00000100 00001100 2**4 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 

어디 오프셋 않습니다 나와서 어떻게 억누를 수 있습니까?

편집 : 0x1000 오프셋은 컴파일 된 파일/개체의 코드 섹션의 실제 오프셋입니다 - 맞습니까?

답변

1

귀하의 objdump 목록에 따르면 모든 것이 예상 한대로 레이아웃되어 있다고 가정합니다. 나는. .text 섹션의 VMA 및 LMA는 주소 0x100을 가리 킵니다.

올바르게 추측 한 오프셋 0x1000은 ELF 파일 내에서 .text 섹션의 오프셋입니다. 그러나이 섹션은 주소 0x100에로드됩니다.

당신이

$ objdump -S startup.MICROBLAZE.elf 

와 ELF를 분해하려고하면 당신이 적절한 지침 레이아웃이 표시됩니다. MAP 파일을 연결 단계에서 -Wl,-Map,output.map gcc 플래그로 생성하는 것도 도움이됩니다.

+0

파일 오프셋을 제어하는 ​​방법이 있습니까? – smwikipedia

+0

ELF 파일의 오프셋을 제어하려는 경우 문제 해결의 잘못된 경로에있을 가능성이 큽니다. 좀 더 자주 원시/포맷되지 않은 바이너리 파일의 특정 오프셋에서 특정 ELF 섹션을 가질 필요가 있으며, ELF 섹션을 일반 형식의 바이너리 파일을 포함한 다른 형식으로 추출 할 수있는'objcopy' 도구를 사용해야합니다. – dkz