Contents|Index|Previous|Next

Arithmetic Functions

The command language includes a number of built-in functions for use in link script expressions.

ABSOLUTE(exp)
Return the absolute (non-relocatable, as opposed to non-negative) value of the expression exp. Primarily useful to assign an absolute value to a symbol within a section definition, where symbol values are normally section-relative.

ADDR(section)
Return the absolute address of the named section. Your script must previously have defined the location of that section. In the following example, symbol_1 and symbol_2 are assigned identical values.

SECTIONS{ ...
.output1 :
{
start_of_output_1 = ABSOLUTE(.);
...
}
.output :
{
symbol_1 = ADDR(.output1);
symbol_2 = start_of_output_1;
}
... }

ALIGN(exp)
Return the result of the current location counter (.) aligned to the next exp boundary. exp must be an expression whose value is a power of two. This is equivalent to

(. + exp -1)&˜(exp -1)

ALIGN doesn’t change the value of the location counter—it just does arithmetic on it. To align the output .data section to the next 0x2000 byte boundary after the preceding section and to set a variable within the section to the next 0x8000 boundary after the input sections, use the following example.

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 start attribute of a section definition (see Optional Section Attributes). The second use simply defines the value of a variable.

The built-in NEXT is closely related to ALIGN.

DEFINED(symbol)
Return 1 if symbol is in the linker global symbol table and is defined, otherwise return 0. You can use this function to provide default values for symbols. For example, the following command-file fragment shows how to set a global symbol begin to the first location in the .text section—but if a symbol called begin already existed, its value is preserved.

SECTIONS{ ...
.text :
{ begin = DEFINED(begin) ? begin : . ;
...
}
... }

NEXT(exp)
Return the next unallocated address that is a multiple of exp. This function is closely related to ALIGN(exp); unless you use the MEMORY command to define discontinuous memory for the output file, the two functions are equivalent.

SIZEOF(section)
Return the size in bytes of the named section, if that section has been allocated. In the following example, 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
Return the size in bytes of the output file’s headers. You can use this number as the start address of the first section, if you choose, to facilitate paging.