10.5.5.11 Output Section LMA
Every section has a virtual address (VMA) and a load address (LMA). The address expression which may appear in an output section description sets the VMA.
The linker will normally set the LMA equal to the VMA. This can be changed
by using the AT
keyword. The expression lma that follows the
AT
keyword specifies the load address of the section.
Alternatively, with AT>lma_region
expression, a memory
region may be specified for the section’s load address (see MEMORY
Command).
This feature is designed to make it easy to build a ROM image. For example, the following linker script creates three output sections: one called .text
, which starts at 0x1000
, one called .mdata
, which is loaded at the end of the .text
section even though its VMA is 0x2000
, and one called .bss
to hold uninitialized data at address 0x3000
. The symbol _data
is defined with the value 0x2000
, which shows that the location counter holds the VMA value, not the LMA value.
SECTIONS
{
.text 0x1000 : { *(.text) _etext = . ; }
.mdata 0x2000 :
AT ( ADDR (.text) + SIZEOF (.text) )
{ _data = . ; *(.data); _edata = . ; }
.bss 0x3000 :
{ _bstart = . ; *(.bss) *(COMMON) ; _bend = . ;}
}
The run-time initialization code for use with a program generated with this linker script would include a function to copy the initialized data from the ROM image to its run-time address. The initialization function could take advantage of the symbols defined by the linker script.
It would rarely be necessary to write such a function, however. The XC32 linker includes automatic support for the initialization of BSS-type and data-type sections. Instead of mapping a data section into both program memory and data memory (as this example implies), the linker creates a special template in program memory which includes all of the relevant information. See Initialized Data for details.