33.3. Memory Layout

The linker's default configuration permits allocation of all available memory. You can override this configuration by using the MEMORY command. The MEMORY command describes the location and size of blocks of memory in the target. By using it carefully, you can describe which memory regions may be used by the linker, and which memory regions it must avoid. The linker does not shuffle sections to fit into the available regions, but does move the requested sections into the correct regions and issue errors when the regions become too full.

A command file may contain at most one use of the MEMORY command; however, you can define as many blocks of memory within it as you wish. The syntax is:

MEMORY
  {
    name (attr) : ORIGIN = origin, LENGTH = len
    ...
  }
name

is a name used internally by the linker to refer to the region. Any symbol name may be used. The region names are stored in a separate name space, and will not conflict with symbols, file names or section names. Use distinct names to specify multiple regions.

(attr)

is an optional list of attributes, permitted for compatibility with the AT&T linker but not used by the linker beyond checking that the attribute list is valid. Valid attribute lists must be made up of the characters "LIRWX". If you omit the attribute list, you may omit the parentheses around it as well.

origin

is the start address of the region in physical memory. It is an expression that must evaluate to a constant before memory allocation is performed. The keyword ORIGIN may be abbreviated to org or o (but not, for example, "ORG").

len

is the size in bytes of the region (an expression). The keyword LENGTH may be abbreviated to len or l.

For example, to specify that memory has two regions available for allocation—one starting at 0 for 256 kilobytes, and the other starting at 0x40000000 for four megabytes:

MEMORY
  {
  rom : ORIGIN = 0, LENGTH = 256K
  ram : org = 0x40000000, l = 4M
  }

Once you have defined a region of memory named mem, you can direct specific output sections there by using a command ending in ">mem" within the SECTIONS command (see Section 33.4.4.). If the combined output sections directed to a region are too big for the region, the linker will issue an error message.