我有一些用于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偏移量是编译文件/对象中代码段的物理偏移量 - 这是正确的吗?
答案 0 :(得分:1)
根据您的objdump
列表,一切都假设按照您的预期进行布局。即您.text
部分的VMA和LMA指向地址0x100
。
正确猜测的偏移量0x1000
是ELF文件中.text
部分的偏移量。但此部分将加载到地址0x100
。
如果您尝试使用
拆卸ELF$ objdump -S startup.MICROBLAZE.elf
您将看到正确的说明布局。使用-Wl,-Map,output.map
gcc标志在链接阶段生成MAP文件也很有帮助。