控制链接中的文件偏移量

时间:2014-11-09 23:15:33

标签: gcc assembly linker ld microblaze

我有一些用于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 个答案:

答案 0 :(得分:1)

根据您的objdump列表,一切都假设按照您的预期进行布局。即您.text部分的VMA和LMA指向地址0x100

正确猜测的偏移量0x1000是ELF文件中.text部分的偏移量。但此部分将加载到地址0x100

如果您尝试使用

拆卸ELF
$ objdump -S startup.MICROBLAZE.elf

您将看到正确的说明布局。使用-Wl,-Map,output.map gcc标志在链接阶段生成MAP文件也很有帮助。