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

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

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

$ objdump -S startup.MICROBLAZE.elf 

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

+0

Есть ли способ контролировать смещение файла? – smwikipedia

+0

Если вы пытаетесь контролировать смещение внутри файла ELF, вы, вероятно, ошибетесь в решении своей проблемы. Чаще всего вам нужно иметь определенный раздел ELF при определенном смещении исходного/неформатированного двоичного файла, а затем использовать инструмент 'objcopy', который может извлечь любой раздел ELF в любой другой формат (включая простой двоичный файл). – dkz