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

У меня есть ассемблер для 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 — это физическое смещение раздела кода в скомпилированном файле/объекте — это правильно?


person adrianmcmenamin    schedule 09.11.2014    source источник


Ответы (1)


Согласно вашему objdump списку, все должно быть выложено так, как вы ожидаете. т.е. VMA и LMA вашего раздела .text указывают на адрес 0x100.

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

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

$ objdump -S startup.MICROBLAZE.elf

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

person dkz    schedule 10.11.2014
comment
Есть ли способ контролировать смещение файла? - person smwikipedia; 16.07.2016
comment
Если вы пытаетесь контролировать смещение внутри файла ELF, вы, вероятно, находитесь на неправильном пути решения своей проблемы. Чаще вам нужно иметь определенный раздел ELF по определенному смещению необработанного / неформатированного двоичного файла, а затем использовать инструмент objcopy, который может извлечь любой раздел ELF в любой другой формат (включая обычный двоичный файл). - person dkz; 18.07.2016
comment
Итак, есть ли способ контролировать смещение файла? Честно говоря, просто сказать, что это неправильно, не очень полезно. Есть много ситуаций, когда люди могут не захотеть обрабатывать определенные разделы ELF снаружи, но иметь свой собственный способ выполнения двоичного файла. - person Keya Kersting; 07.10.2020