Here is the full syntax of a section definition, including all the optional portions:
SECTIONS { ... secname start BLOCK(align) (NOLOAD) : AT ( ldadr ) { contents } >region :phdr =fill ... }
secname and contents are required. See section Section Definitions, and section Section Placement, for details on
contents. The remaining elements---start,
BLOCK(align)
, (NOLOAD)
, AT ( ldadr )
,
>region
, :phdr
, and =fill
---are
all optional.
start
0x40000000
:
SECTIONS { ... output 0x40000000: { ... } ... }
BLOCK(align)
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)
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 )
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
:
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 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
:phdr
:phdr
modifier. To
prevent a section from being assigned to a segment when it would
normally default to one, use :NONE
.
=fill
=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.
Go to the first, previous, next, last section, table of contents.