<html lang="en">
<head>
<title>Builtin Functions - Untitled</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="Untitled">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Expressions.html#Expressions" title="Expressions">
<link rel="prev" href="Expression-Section.html#Expression-Section" title="Expression Section">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU linker LD
(GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10))
version 2.33.1.

Copyright (C) 1991-2019 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, with no Front-Cover Texts, and with no
Back-Cover Texts.  A copy of the license is included in the
section entitled ``GNU Free Documentation License''.-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
  pre.display { font-family:inherit }
  pre.format  { font-family:inherit }
  pre.smalldisplay { font-family:inherit; font-size:smaller }
  pre.smallformat  { font-family:inherit; font-size:smaller }
  pre.smallexample { font-size:smaller }
  pre.smalllisp    { font-size:smaller }
  span.sc    { font-variant:small-caps }
  span.roman { font-family:serif; font-weight:normal; } 
  span.sansserif { font-family:sans-serif; font-weight:normal; } 
--></style>
</head>
<body>
<div class="node">
<a name="Builtin-Functions"></a>
<p>
Previous:&nbsp;<a rel="previous" accesskey="p" href="Expression-Section.html#Expression-Section">Expression Section</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Expressions.html#Expressions">Expressions</a>
<hr>
</div>

<h4 class="subsection">3.10.9 Builtin Functions</h4>

<p><a name="index-functions-in-expressions-585"></a>The linker script language includes a number of builtin functions for
use in linker script expressions.

     <dl>
<dt><code>ABSOLUTE(</code><var>exp</var><code>)</code><dd><a name="index-ABSOLUTE_0028_0040var_007bexp_007d_0029-586"></a><a name="index-expression_002c-absolute-587"></a>Return the absolute (non-relocatable, as opposed to non-negative) value
of the expression <var>exp</var>.  Primarily useful to assign an absolute
value to a symbol within a section definition, where symbol values are
normally section relative.  See <a href="Expression-Section.html#Expression-Section">Expression Section</a>.

     <br><dt><code>ADDR(</code><var>section</var><code>)</code><dd><a name="index-ADDR_0028_0040var_007bsection_007d_0029-588"></a><a name="index-section-address-in-expression-589"></a>Return the address (VMA) of the named <var>section</var>.  Your
script must previously have defined the location of that section.  In
the following example, <code>start_of_output_1</code>, <code>symbol_1</code> and
<code>symbol_2</code> are assigned equivalent values, except that
<code>symbol_1</code> will be relative to the <code>.output1</code> section while
the other two will be absolute:
     <pre class="smallexample">          SECTIONS { ...
            .output1 :
              {
              start_of_output_1 = ABSOLUTE(.);
              ...
              }
            .output :
              {
              symbol_1 = ADDR(.output1);
              symbol_2 = start_of_output_1;
              }
          ... }
</pre>
     <br><dt><code>ALIGN(</code><var>align</var><code>)</code><dt><code>ALIGN(</code><var>exp</var><code>,</code><var>align</var><code>)</code><dd><a name="index-ALIGN_0028_0040var_007balign_007d_0029-590"></a><a name="index-ALIGN_0028_0040var_007bexp_007d_002c_0040var_007balign_007d_0029-591"></a><a name="index-round-up-location-counter-592"></a><a name="index-align-location-counter-593"></a><a name="index-round-up-expression-594"></a><a name="index-align-expression-595"></a>Return the location counter (<code>.</code>) or arbitrary expression aligned
to the next <var>align</var> boundary.  The single operand <code>ALIGN</code>
doesn't change the value of the location counter&mdash;it just does
arithmetic on it.  The two operand <code>ALIGN</code> allows an arbitrary
expression to be aligned upwards (<code>ALIGN(</code><var>align</var><code>)</code> is
equivalent to <code>ALIGN(ABSOLUTE(.), </code><var>align</var><code>)</code>).

     <p>Here is an example which aligns the output <code>.data</code> section to the
next <code>0x2000</code> byte boundary after the preceding section and sets a
variable within the section to the next <code>0x8000</code> boundary after the
input sections:
     <pre class="smallexample">          SECTIONS { ...
            .data ALIGN(0x2000): {
              *(.data)
              variable = ALIGN(0x8000);
            }
          ... }
</pre>
     <p class="noindent">The first use of <code>ALIGN</code> in this example specifies the location of
a section because it is used as the optional <var>address</var> attribute of
a section definition (see <a href="Output-Section-Address.html#Output-Section-Address">Output Section Address</a>).  The second use
of <code>ALIGN</code> is used to defines the value of a symbol.

     <p>The builtin function <code>NEXT</code> is closely related to <code>ALIGN</code>.

     <br><dt><code>ALIGNOF(</code><var>section</var><code>)</code><dd><a name="index-ALIGNOF_0028_0040var_007bsection_007d_0029-596"></a><a name="index-section-alignment-597"></a>Return the alignment in bytes of the named <var>section</var>, if that section has
been allocated.  If the section has not been allocated when this is
evaluated, the linker will report an error. In the following example,
the alignment of the <code>.output</code> section is stored as the first
value in that section.
     <pre class="smallexample">          SECTIONS{ ...
            .output {
              LONG (ALIGNOF (.output))
              ...
              }
          ... }
</pre>
     <br><dt><code>BLOCK(</code><var>exp</var><code>)</code><dd><a name="index-BLOCK_0028_0040var_007bexp_007d_0029-598"></a>This is a synonym for <code>ALIGN</code>, for compatibility with older linker
scripts.  It is most often seen when setting the address of an output
section.

     <br><dt><code>DATA_SEGMENT_ALIGN(</code><var>maxpagesize</var><code>, </code><var>commonpagesize</var><code>)</code><dd><a name="index-DATA_005fSEGMENT_005fALIGN_0028_0040var_007bmaxpagesize_007d_002c-_0040var_007bcommonpagesize_007d_0029-599"></a>This is equivalent to either
     <pre class="smallexample">          (ALIGN(<var>maxpagesize</var>) + (. &amp; (<var>maxpagesize</var> - 1)))
</pre>
     <p>or
     <pre class="smallexample">          (ALIGN(<var>maxpagesize</var>)
           + ((. + <var>commonpagesize</var> - 1) &amp; (<var>maxpagesize</var> - <var>commonpagesize</var>)))
</pre>
     <p class="noindent">depending on whether the latter uses fewer <var>commonpagesize</var> sized pages
for the data segment (area between the result of this expression and
<code>DATA_SEGMENT_END</code>) than the former or not. 
If the latter form is used, it means <var>commonpagesize</var> bytes of runtime
memory will be saved at the expense of up to <var>commonpagesize</var> wasted
bytes in the on-disk file.

     <p>This expression can only be used directly in <code>SECTIONS</code> commands, not in
any output section descriptions and only once in the linker script. 
<var>commonpagesize</var> should be less or equal to <var>maxpagesize</var> and should
be the system page size the object wants to be optimized for while still
running on system page sizes up to <var>maxpagesize</var>.  Note however
that &lsquo;<samp><span class="samp">-z relro</span></samp>&rsquo; protection will not be effective if the system
page size is larger than <var>commonpagesize</var>.

     <p class="noindent">Example:
     <pre class="smallexample">            . = DATA_SEGMENT_ALIGN(0x10000, 0x2000);
</pre>
     <br><dt><code>DATA_SEGMENT_END(</code><var>exp</var><code>)</code><dd><a name="index-DATA_005fSEGMENT_005fEND_0028_0040var_007bexp_007d_0029-600"></a>This defines the end of data segment for <code>DATA_SEGMENT_ALIGN</code>
evaluation purposes.

     <pre class="smallexample">            . = DATA_SEGMENT_END(.);
</pre>
     <br><dt><code>DATA_SEGMENT_RELRO_END(</code><var>offset</var><code>, </code><var>exp</var><code>)</code><dd><a name="index-DATA_005fSEGMENT_005fRELRO_005fEND_0028_0040var_007boffset_007d_002c-_0040var_007bexp_007d_0029-601"></a>This defines the end of the <code>PT_GNU_RELRO</code> segment when
&lsquo;<samp><span class="samp">-z relro</span></samp>&rsquo; option is used. 
When &lsquo;<samp><span class="samp">-z relro</span></samp>&rsquo; option is not present, <code>DATA_SEGMENT_RELRO_END</code>
does nothing, otherwise <code>DATA_SEGMENT_ALIGN</code> is padded so that
<var>exp</var> + <var>offset</var> is aligned to the <var>commonpagesize</var>
argument given to <code>DATA_SEGMENT_ALIGN</code>.  If present in the linker
script, it must be placed between <code>DATA_SEGMENT_ALIGN</code> and
<code>DATA_SEGMENT_END</code>.  Evaluates to the second argument plus any
padding needed at the end of the <code>PT_GNU_RELRO</code> segment due to
section alignment.

     <pre class="smallexample">            . = DATA_SEGMENT_RELRO_END(24, .);
</pre>
     <br><dt><code>DEFINED(</code><var>symbol</var><code>)</code><dd><a name="index-DEFINED_0028_0040var_007bsymbol_007d_0029-602"></a><a name="index-symbol-defaults-603"></a>Return 1 if <var>symbol</var> is in the linker global symbol table and is
defined before the statement using DEFINED in the script, otherwise
return 0.  You can use this function to provide
default values for symbols.  For example, the following script fragment
shows how to set a global symbol &lsquo;<samp><span class="samp">begin</span></samp>&rsquo; to the first location in
the &lsquo;<samp><span class="samp">.text</span></samp>&rsquo; section&mdash;but if a symbol called &lsquo;<samp><span class="samp">begin</span></samp>&rsquo; already
existed, its value is preserved:

     <pre class="smallexample">          SECTIONS { ...
            .text : {
              begin = DEFINED(begin) ? begin : . ;
              ...
            }
            ...
          }
</pre>
     <br><dt><code>LENGTH(</code><var>memory</var><code>)</code><dd><a name="index-LENGTH_0028_0040var_007bmemory_007d_0029-604"></a>Return the length of the memory region named <var>memory</var>.

     <br><dt><code>LOADADDR(</code><var>section</var><code>)</code><dd><a name="index-LOADADDR_0028_0040var_007bsection_007d_0029-605"></a><a name="index-section-load-address-in-expression-606"></a>Return the absolute LMA of the named <var>section</var>.  (see <a href="Output-Section-LMA.html#Output-Section-LMA">Output Section LMA</a>).

     <br><dt><code>LOG2CEIL(</code><var>exp</var><code>)</code><dd><a name="index-LOG2CEIL_0028_0040var_007bexp_007d_0029-607"></a>Return the binary logarithm of <var>exp</var> rounded towards infinity. 
<code>LOG2CEIL(0)</code> returns 0.

     <p><a name="index-MAX-608"></a><br><dt><code>MAX(</code><var>exp1</var><code>, </code><var>exp2</var><code>)</code><dd>Returns the maximum of <var>exp1</var> and <var>exp2</var>.

     <p><a name="index-MIN-609"></a><br><dt><code>MIN(</code><var>exp1</var><code>, </code><var>exp2</var><code>)</code><dd>Returns the minimum of <var>exp1</var> and <var>exp2</var>.

     <br><dt><code>NEXT(</code><var>exp</var><code>)</code><dd><a name="index-NEXT_0028_0040var_007bexp_007d_0029-610"></a><a name="index-unallocated-address_002c-next-611"></a>Return the next unallocated address that is a multiple of <var>exp</var>. 
This function is closely related to <code>ALIGN(</code><var>exp</var><code>)</code>; unless you
use the <code>MEMORY</code> command to define discontinuous memory for the
output file, the two functions are equivalent.

     <br><dt><code>ORIGIN(</code><var>memory</var><code>)</code><dd><a name="index-ORIGIN_0028_0040var_007bmemory_007d_0029-612"></a>Return the origin of the memory region named <var>memory</var>.

     <br><dt><code>SEGMENT_START(</code><var>segment</var><code>, </code><var>default</var><code>)</code><dd><a name="index-SEGMENT_005fSTART_0028_0040var_007bsegment_007d_002c-_0040var_007bdefault_007d_0029-613"></a>Return the base address of the named <var>segment</var>.  If an explicit
value has already been given for this segment (with a command-line
&lsquo;<samp><span class="samp">-T</span></samp>&rsquo; option) then that value will be returned otherwise the value
will be <var>default</var>.  At present, the &lsquo;<samp><span class="samp">-T</span></samp>&rsquo; command-line option
can only be used to set the base address for the &ldquo;text&rdquo;, &ldquo;data&rdquo;, and
&ldquo;bss&rdquo; sections, but you can use <code>SEGMENT_START</code> with any segment
name.

     <br><dt><code>SIZEOF(</code><var>section</var><code>)</code><dd><a name="index-SIZEOF_0028_0040var_007bsection_007d_0029-614"></a><a name="index-section-size-615"></a>Return the size in bytes of the named <var>section</var>, if that section has
been allocated.  If the section has not been allocated when this is
evaluated, the linker will report an error.  In the following example,
<code>symbol_1</code> and <code>symbol_2</code> are assigned identical values:
     <pre class="smallexample">          SECTIONS{ ...
            .output {
              .start = . ;
              ...
              .end = . ;
              }
            symbol_1 = .end - .start ;
            symbol_2 = SIZEOF(.output);
          ... }
</pre>
     <br><dt><code>SIZEOF_HEADERS</code><dt><code>sizeof_headers</code><dd><a name="index-SIZEOF_005fHEADERS-616"></a><a name="index-header-size-617"></a>Return the size in bytes of the output file's headers.  This is
information which appears at the start of the output file.  You can use
this number when setting the start address of the first section, if you
choose, to facilitate paging.

     <p><a name="index-not-enough-room-for-program-headers-618"></a><a name="index-program-headers_002c-not-enough-room-619"></a>When producing an ELF output file, if the linker script uses the
<code>SIZEOF_HEADERS</code> 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 &lsquo;<samp><span class="samp">not enough
room for program headers</span></samp>&rsquo;.  To avoid this error, you must avoid using
the <code>SIZEOF_HEADERS</code> 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 <code>PHDRS</code>
command (see <a href="PHDRS.html#PHDRS">PHDRS</a>). 
</dl>

   </body></html>

