Управление смещением файла при связывании
У меня есть какой-то ассемблер для 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.