0

アドレス 0x00000000 にロードしたい Microblaze 用のアセンブラがあります (つまり、リセット時に確実に実行されるようにするため)。

私はこれを行うべきリンカースクリプトを持っています(私は思う):

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 オフセットは、コンパイルされたファイル/オブジェクトのコード セクションの物理オフセットのようです。これは正しいですか?

4

1 に答える 1

2

あなたのリストによると、objdumpすべてがあなたの期待どおりにレイアウトされているはずです。つまり、セクションの VMA と LMA は.textaddress を指しています0x100

0x1000あなたが正しく推測したオフセットは、ELF ファイル内のセクションのオフセットです.text。しかし、このセクションはアドレスにロードされます0x100

ELFを分解しようとすると

$ objdump -S startup.MICROBLAZE.elf

適切な指示のレイアウトが表示されます。-Wl,-Map,output.mapgcc フラグを使用してリンク ステージで MAP ファイルを生成することも役立ちます。

于 2014-11-10T23:37:03.633 に答える