hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- This file documents the GNU linker LD
(GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29))
version 2.36.1.
 
Copyright (C) 1991-2021 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". -->
<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
<head>
<title>LD: Expression Section</title>
 
<meta name="description" content="LD: Expression Section">
<meta name="keywords" content="LD: Expression Section">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="LD-Index.html#LD-Index" rel="index" title="LD Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Expressions.html#Expressions" rel="up" title="Expressions">
<link href="Builtin-Functions.html#Builtin-Functions" rel="next" title="Builtin Functions">
<link href="Evaluation.html#Evaluation" rel="previous" title="Evaluation">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
 
 
</head>
 
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Expression-Section"></a>
<div class="header">
<p>
Next: <a href="Builtin-Functions.html#Builtin-Functions" accesskey="n" rel="next">Builtin Functions</a>, Previous: <a href="Evaluation.html#Evaluation" accesskey="p" rel="previous">Evaluation</a>, Up: <a href="Expressions.html#Expressions" accesskey="u" rel="up">Expressions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="LD-Index.html#LD-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="The-Section-of-an-Expression"></a>
<h4 class="subsection">3.10.8 The Section of an Expression</h4>
<a name="index-expression-sections"></a>
<a name="index-absolute-expressions"></a>
<a name="index-relative-expressions"></a>
<a name="index-absolute-and-relocatable-symbols"></a>
<a name="index-relocatable-and-absolute-symbols"></a>
<a name="index-symbols_002c-relocatable-and-absolute"></a>
<p>Addresses and symbols may be section relative, or absolute.  A section
relative symbol is relocatable.  If you request relocatable output
using the &lsquo;<samp>-r</samp>&rsquo; option, a further link operation may change the
value of a section relative symbol.  On the other hand, an absolute
symbol will retain the same value throughout any further link
operations.
</p>
<p>Some terms in linker expressions are addresses.  This is true of
section relative symbols and for builtin functions that return an
address, such as <code>ADDR</code>, <code>LOADADDR</code>, <code>ORIGIN</code> and
<code>SEGMENT_START</code>.  Other terms are simply numbers, or are builtin
functions that return a non-address value, such as <code>LENGTH</code>.
One complication is that unless you set <code>LD_FEATURE (&quot;SANE_EXPR&quot;)</code>
(see <a href="Miscellaneous-Commands.html#Miscellaneous-Commands">Miscellaneous Commands</a>), numbers and absolute symbols are treated
differently depending on their location, for compatibility with older
versions of <code>ld</code>.  Expressions appearing outside an output
section definition treat all numbers as absolute addresses.
Expressions appearing inside an output section definition treat
absolute symbols as numbers.  If <code>LD_FEATURE (&quot;SANE_EXPR&quot;)</code> is
given, then absolute symbols and numbers are simply treated as numbers
everywhere.
</p>
<p>In the following simple example,
</p>
<div class="smallexample">
<pre class="smallexample">SECTIONS
  {
    . = 0x100;
    __executable_start = 0x100;
    .data :
    {
      . = 0x10;
      __data_start = 0x10;
      *(.data)
    }
    &hellip;
  }
</pre></div>
 
<p>both <code>.</code> and <code>__executable_start</code> are set to the absolute
address 0x100 in the first two assignments, then both <code>.</code> and
<code>__data_start</code> are set to 0x10 relative to the <code>.data</code>
section in the second two assignments.
</p>
<p>For expressions involving numbers, relative addresses and absolute
addresses, ld follows these rules to evaluate terms:
</p>
<ul>
<li> Unary operations on an absolute address or number, and binary
operations on two absolute addresses or two numbers, or between one
absolute address and a number, apply the operator to the value(s).
</li><li> Unary operations on a relative address, and binary operations on two
relative addresses in the same section or between one relative address
and a number, apply the operator to the offset part of the address(es).
</li><li> Other binary operations, that is, between two relative addresses not
in the same section, or between a relative address and an absolute
address, first convert any non-absolute term to an absolute address
before applying the operator.
</li></ul>
 
<p>The result section of each sub-expression is as follows:
</p>
<ul>
<li> An operation involving only numbers results in a number.
</li><li> The result of comparisons, &lsquo;<samp>&amp;&amp;</samp>&rsquo; and &lsquo;<samp>||</samp>&rsquo; is also a number.
</li><li> The result of other binary arithmetic and logical operations on two
relative addresses in the same section or two absolute addresses
(after above conversions) is also a number when
<code>LD_FEATURE (&quot;SANE_EXPR&quot;)</code> or inside an output section definition
but an absolute address otherwise.
</li><li> The result of other operations on relative addresses or one
relative address and a number, is a relative address in the same
section as the relative operand(s).
</li><li> The result of other operations on absolute addresses (after above
conversions) is an absolute address.
</li></ul>
 
<p>You can use the builtin function <code>ABSOLUTE</code> to force an expression
to be absolute when it would otherwise be relative.  For example, to
create an absolute symbol set to the address of the end of the output
section &lsquo;<samp>.data</samp>&rsquo;:
</p><div class="smallexample">
<pre class="smallexample">SECTIONS
  {
    .data : { *(.data) _edata = ABSOLUTE(.); }
  }
</pre></div>
<p>If &lsquo;<samp>ABSOLUTE</samp>&rsquo; were not used, &lsquo;<samp>_edata</samp>&rsquo; would be relative to the
&lsquo;<samp>.data</samp>&rsquo; section.
</p>
<p>Using <code>LOADADDR</code> also forces an expression absolute, since this
particular builtin function returns an absolute address.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Builtin-Functions.html#Builtin-Functions" accesskey="n" rel="next">Builtin Functions</a>, Previous: <a href="Evaluation.html#Evaluation" accesskey="p" rel="previous">Evaluation</a>, Up: <a href="Expressions.html#Expressions" accesskey="u" rel="up">Expressions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="LD-Index.html#LD-Index" title="Index" rel="index">Index</a>]</p>
</div>
 
 
 
</body>
</html>