9.5.4 Memory Command
The MEMORY
command overrides the
linker’s default allocation of all available memory.
The MEMORY
command describes the location and size of blocks of memory in the target. It can be used to describe which memory regions may be used by the linker and which memory regions it must avoid. Sections may then be assigned to particular memory regions. The linker will set section addresses based on the memory regions and will warn about regions that become too full. The linker will not shuffle sections around to fit into the available regions.
MEMORY
command
is: MEMORY
{
name [(attr)] : ORIGIN = origin, LENGTH = len
...
}
The name is a name used in the linker script to refer to the region. The region name has no meaning outside of the linker script. Region names are stored in a separate name space, and will not conflict with symbol names, file names or section names. Each memory region must have a distinct name.
The attr
string must consist only of the
following characters:
R |
Read-only section |
W |
Read/write section |
X |
Executable section |
A |
Allocatable section |
I |
Initialized section |
L |
Same as I |
! |
Invert the sense of any of the following attributes |
If an unmapped section matches any of the listed attributes other than !
, it will be placed in the memory region. The !
attribute reverses this test, so that an unmapped section will be placed in the memory region only if it does not match any of the listed attributes.
The origin is an expression for the start address of the memory region. The expression must evaluate to a constant before memory allocation is performed, which means that section relative symbols may not be used. The keyword ORIGIN
may be abbreviated to org
or o
(but not, for example, ORG
).
The len
is an expression for the size in bytes of the memory region. As with the origin expression, the expression must evaluate to a constant before memory allocation is performed. The keyword LENGTH
may be abbreviated to len
or l
.
0
for 48 KB,
and the other starting at 0x800
for 2 KB. The linker will
place into the rom
memory region every section which is
not explicitly mapped into a memory region, and is either read-only or executable. The
linker will place other sections which are not explicitly mapped into a memory region into
the ram
memory
region. MEMORY
{
rom (rx) : ORIGIN = 0, LENGTH = 48K
ram (!rx) : org = 0x800, l = 2K
}
Once a memory region is defined, the linker can be directed to place specific output sections into that memory region by using the >region
output section attribute. For example, to specify a memory region named mem
, use >mem
in the output section definition. If no address was specified for the output section, the linker will set the address to the next available address within the memory region. If the combined output sections directed to a memory region are too large for the region, the linker will issue an error message.