The linker script language includes a number of builtin functions for use in linker script expressions.
ABSOLUTE(
exp)
ADDR(
section)
start_of_output_1
, symbol_1
and
symbol_2
are assigned equivalent values, except that
symbol_1
will be relative to the .output1
section while
the other two will be absolute:
SECTIONS { ... .output1 : { start_of_output_1 = ABSOLUTE(.); ... } .output : { symbol_1 = ADDR(.output1); symbol_2 = start_of_output_1; } ... }
ALIGN(
align)
ALIGN(
exp,
align)
.
) or arbitrary expression aligned
to the next align boundary. The single operand ALIGN
doesn't change the value of the location counter—it just does
arithmetic on it. The two operand ALIGN
allows an arbitrary
expression to be aligned upwards (ALIGN(
align)
is
equivalent to ALIGN(ABSOLUTE(.),
align)
).
Here is an example which aligns the output .data
section to the
next 0x2000
byte boundary after the preceding section and sets a
variable within the section to the next 0x8000
boundary after the
input sections:
SECTIONS { ... .data ALIGN(0x2000): { *(.data) variable = ALIGN(0x8000); } ... }
The first use of ALIGN
in this example specifies the location of
a section because it is used as the optional address attribute of
a section definition (see Output Section Address). The second use
of ALIGN
is used to defines the value of a symbol.
The builtin function NEXT
is closely related to ALIGN
.
ALIGNOF(
section)
.output
section is stored as the first
value in that section.
SECTIONS{ ... .output { LONG (ALIGNOF (.output)) ... } ... }
BLOCK(
exp)
ALIGN
, for compatibility with older linker
scripts. It is most often seen when setting the address of an output
section.
DATA_SEGMENT_ALIGN(
maxpagesize,
commonpagesize)
(ALIGN(maxpagesize) + (. & (maxpagesize - 1)))
or
(ALIGN(maxpagesize) + ((. + commonpagesize - 1) & (maxpagesize - commonpagesize)))
depending on whether the latter uses fewer commonpagesize sized pages
for the data segment (area between the result of this expression and
DATA_SEGMENT_END
) than the former or not.
If the latter form is used, it means commonpagesize bytes of runtime
memory will be saved at the expense of up to commonpagesize wasted
bytes in the on-disk file.
This expression can only be used directly in SECTIONS
commands, not in
any output section descriptions and only once in the linker script.
commonpagesize should be less or equal to maxpagesize and should
be the system page size the object wants to be optimized for while still
running on system page sizes up to maxpagesize. Note however
that ‘-z relro’ protection will not be effective if the system
page size is larger than commonpagesize.
Example:
. = DATA_SEGMENT_ALIGN(0x10000, 0x2000);
DATA_SEGMENT_END(
exp)
DATA_SEGMENT_ALIGN
evaluation purposes.
. = DATA_SEGMENT_END(.);
DATA_SEGMENT_RELRO_END(
offset,
exp)
PT_GNU_RELRO
segment when
‘-z relro’ option is used.
When ‘-z relro’ option is not present, DATA_SEGMENT_RELRO_END
does nothing, otherwise DATA_SEGMENT_ALIGN
is padded so that
exp + offset is aligned to the commonpagesize
argument given to DATA_SEGMENT_ALIGN
. If present in the linker
script, it must be placed between DATA_SEGMENT_ALIGN
and
DATA_SEGMENT_END
. Evaluates to the second argument plus any
padding needed at the end of the PT_GNU_RELRO
segment due to
section alignment.
. = DATA_SEGMENT_RELRO_END(24, .);
DEFINED(
symbol)
SECTIONS { ... .text : { begin = DEFINED(begin) ? begin : . ; ... } ... }
LENGTH(
memory)
LOADADDR(
section)
LOG2CEIL(
exp)
LOG2CEIL(0)
returns 0.
MAX(
exp1,
exp2)
MIN(
exp1,
exp2)
NEXT(
exp)
ALIGN(
exp)
; unless you
use the MEMORY
command to define discontinuous memory for the
output file, the two functions are equivalent.
ORIGIN(
memory)
SEGMENT_START(
segment,
default)
SEGMENT_START
with any segment
name.
SIZEOF(
section)
symbol_1
and symbol_2
are assigned identical values:
SECTIONS{ ... .output { .start = . ; ... .end = . ; } symbol_1 = .end - .start ; symbol_2 = SIZEOF(.output); ... }
SIZEOF_HEADERS
sizeof_headers
When producing an ELF output file, if the linker script uses the
SIZEOF_HEADERS
builtin function, the linker must compute the
number of program headers before it has determined all the section
addresses and sizes. If the linker later discovers that it needs
additional program headers, it will report an error ‘not enough
room for program headers’. To avoid this error, you must avoid using
the SIZEOF_HEADERS
function, or you must rework your linker
script to avoid forcing the linker to use additional program headers, or
you must define the program headers yourself using the PHDRS
command (see PHDRS).