链接器将不正确的LMA分配给一个部分(使用AT>)

时间:2013-11-28 14:44:43

标签: linker embedded arm ld elf

我有一个包含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?

1 个答案:

答案 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地址。