Questions about the LMA and VMA in a linker script

Dave Hylands dhylands at gmail.com
Thu Jul 14 02:07:52 EDT 2016


Replying to all this time.

Currently, I'm most recently familiar with small non-MMU processors (not
running linux), and in that case, the VMA is the final address (typically
in RAM) that the section will be loaded to.
The LMA is the address (typically in ROM) that the section will be at when
the program starts execution.

A typical example of this is initialized data. In the image, this
"initialized data" section will be stored in ROM and copied to RAM by the C
runtime library before calling main.

In the linux kernel, the kernel image will be linked against its final
virtual address (the VMA) and the LMA would correspond to the physical
address that the kernel will be loaded at (since the MMU is typically off
when the kernel image is loaded).

There are lots of variations and reasons why things might not be exactly
like I described (different architectures have different conventions), but
that's the jist of things.

On Wed, Jul 13, 2016 at 7:33 PM, walker lala <ablacktshirt at gmail.com> wrote:

> Hi,
> I got some question about the AT directive in linker script. I have
> post this question to binutils{at}sourceware.org with no reply.
> Hopefully someone can help me out.
>
> After some searching and asking, I finally know that the AT directive
> tell the linker about LMA of  a section.
>
> For example there is some linker script like this:
>
>     SECTIONS
>     {
>         . = 0X80100000;
>         .text : AT(0x100000) {
>             *(.text .stub .text.* .gnu.linkonce.t.*)
>         }
>
>       ... blah blah ...
>     }
>
> Now 0x8010000 is a VMA, and 0x100000 is a LMA.
>
> My question is, is LMA the same as the physical address in a ELF
> program header ? A typical ELF declaration would be something like
> this:
>
> typedef struct
> {
>   Elf32_Word    p_type;                 /* Segment type */
>   Elf32_Off     p_offset;               /* Segment file offset */
>   Elf32_Addr    p_vaddr;                /* Segment virtual address */
>   Elf32_Addr    p_paddr;                /* Segment physical address */
>   Elf32_Word    p_filesz;               /* Segment size in file */
>   Elf32_Word    p_memsz;                /* Segment size in memory */
>   Elf32_Word    p_flags;                /* Segment flags */
>   Elf32_Word    p_align;                /* Segment alignment */
> } Elf32_Phdr;
>
> Is LMA just **p_paddr** in the program header?
>
> My understanding is, when the linker link all the object files
> together and then output a executable file of ELF format, those LMA
> declare in the linker script would be the **p_paddr** in the
> executable file, so the loader can correspondingly put that program on
> the physical address as declared by **p_paddr**. Is that correct?
> Please correct me if you may. I'm reading some low level code and is
> not really familiar with those low level stuff.
>
> Thanks in advance!
> Ruan.
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>



-- 
Dave Hylands
Shuswap, BC, Canada
http://www.davehylands.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20160713/e66c7493/attachment-0001.html 


More information about the Kernelnewbies mailing list