secname and contents are required. See section 3.4.1 Section Definitions, and 3.4.2 Section Placement, for details on
contents. The remaining elements---start,
BLOCK(align), (NOLOAD), AT ( ldadr ),
>region, :phdr, and =fill---are
all optional.
start
You can force the output section to be loaded at a specified address by
specifying start immediately following the section name.
start can be represented as any expression. The following
example generates section output at location
0x40000000:
SECTIONS {
...
output 0x40000000: {
...
}
...
}
BLOCK(align)
You can include BLOCK() specification to advance
the location counter . prior to the beginning of the section, so
that the section will begin at the specified alignment. align is
an expression.
(NOLOAD)
The `(NOLOAD)' directive will mark a section to not be loaded at
run time. The linker will process the section normally, but will mark
it so that a program loader will not load it into memory. For example,
in the script sample below, the ROM section is addressed at
memory location `0' and does not need to be loaded when the program
is run. The contents of the ROM section will appear in the
linker output file as usual.
SECTIONS {
ROM 0 (NOLOAD) : { ... }
...
}
AT ( ldadr )
The expression ldadr that follows the AT keyword specifies
the load address of the section. The default (if you do not use the
AT keyword) is to make the load address the same as the
relocation address. This feature is designed to make it easy to build a
ROM image. For example, this SECTIONS definition creates two
output sections: one called `.text', which starts at 0x1000,
and one called `.mdata', which is loaded at the end of the
`.text' section even though its relocation address is
0x2000. The symbol _data is defined with the value
0x2000:
The run-time initialization code (for C programs, usually crt0)
for use with a ROM generated this way has to include something like
the following, to copy the initialized data from the ROM image to its runtime
address:
char *src = _etext;
char *dst = _data;
/* ROM has data at end of text; copy it. */
while (dst < _edata) {
*dst++ = *src++;
}
/* Zero bss */
for (dst = _bstart; dst< _bend; dst++)
*dst = 0;
>region
Assign this section to a previously defined region of memory.
See section 3.3 Memory Layout.
:phdr
Assign this section to a segment described by a program header.
See section 3.5 ELF Program Headers. If a section is assigned to one or more segments, then
all subsequent allocated sections will be assigned to those segments as
well, unless they use an explicitly :phdr modifier. To
prevent a section from being assigned to a segment when it would
normally default to one, use :NONE.
=fill
Including =fill in a section definition specifies the
initial fill value for that section. You may use any expression to
specify fill. Any unallocated holes in the current output section
when written to the output file will be filled with the two least
significant bytes of the value, repeated as necessary. You can also
change the fill value with a FILL statement in the contents
of a section definition.