我有一个包含3个部分的简单asm文件:
.code 32
.section sec1
MOV R3, #10
.section sec2
MOV R1, #10
.section sec3
MOV R2, #10
.end
链接器脚本:
MEMORY
{
ram : ORIGIN = 0x00200000, LENGTH = 1K
rom : ORIGIN = 0x00100000, LENGTH = 1K
}
SECTIONS
{
.text :
{
*(.glue_7t)
*(.glue_7)
*(.text)
}>rom
.sec1 :
{
*(sec1)
}>rom
.sec2 :
{
_ram_start = .;
*(sec2)
}>ram AT> rom
.sec3 :
{
*(sec3)
}>ram AT> rom
.data :
{
*(.data)
}>ram
.bss :
{
*(.bss)
}>ram
}
我认为.sec2应该将VMA地址设置为ram的原点,但LMA应该是.sec1之后的地址,但是objdump给了我:
test2.o: file format elf32-littlearm
Sections:
Idx Name Size VMA LMA File off Algn
0 .sec1 00000004 00100000 00100000 00000034 2**0
CONTENTS, READONLY
1 .sec2 00000004 00200000 00200000 00000038 2**0
CONTENTS, READONLY
2 .sec3 00000004 00200004 00200004 0000003c 2**0
CONTENTS, READONLY
为什么.sec2 LMA设置为ram?
答案 0 :(得分:3)
事实证明,我的.s文件中的部分不可分配。这就是LMA错误的原因。如果不分配部分,则LMA可以与VMA相同。我在使用objcopy时发现了它 - 输出二进制文件总是空的。 asm文件应如下所示:
.code 32
.section sec1, "a"
MOV R3, #10
.section sec2, "a"
MOV R1, #10
.section sec3, "a"
MOV R2, #10
.end
通常代码会转到.text部分,默认情况下可以分配。添加“a”后,链接器会生成正确的LMA地址。