Управление смещением файла при связывании

У меня есть какой-то ассемблер для 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 перечисление всего должно быть выложено так, как вы ожидаете. Т.е. VMA и LMA вашего .text раздел указывает на адрес 0x100,

Смещение 0x1000 как вы правильно догадались, это смещение .text раздел внутри файла ELF. Но этот раздел будет загружен по адресу 0x100,

Если вы попытаетесь разобрать свой ELF с

$ objdump -S startup.MICROBLAZE.elf

вы увидите правильную инструкцию макета. Также полезно создать файл MAP на этапе связывания с -Wl,-Map,output.map флаги gcc.

Другие вопросы по тегам