1 // defstd.cc -- define standard symbols for gold.
2 
3 // Copyright (C) 2006-2020 Free Software Foundation, Inc.
4 // Written by Ian Lance Taylor <iant@google.com>.
5 
6 // This file is part of gold.
7 
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 3 of the License, or
11 // (at your option) any later version.
12 
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 // MA 02110-1301, USA.
22 
23 #include "gold.h"
24 
25 #include "symtab.h"
26 #include "layout.h"
27 #include "defstd.h"
28 
29 // This is a simple file which defines the standard symbols like
30 // "_end".
31 
32 namespace
33 {
34 
35 using namespace gold;
36 
37 const Define_symbol_in_section in_section[] =
38 {
39   {
40     "__preinit_array_start",	// name
41     ".preinit_array",		// output_section
42     0,				// value
43     0,				// size
44     elfcpp::STT_NOTYPE,		// type
45     elfcpp::STB_GLOBAL,		// binding
46     elfcpp::STV_HIDDEN,		// visibility
47     0,				// nonvis
48     false,			// offset_is_from_end
49     true			// only_if_ref
50   },
51   {
52     "__preinit_array_end",	// name
53     ".preinit_array",		// output_section
54     0,				// value
55     0,				// size
56     elfcpp::STT_NOTYPE,		// type
57     elfcpp::STB_GLOBAL,		// binding
58     elfcpp::STV_HIDDEN,		// visibility
59     0,				// nonvis
60     true,			// offset_is_from_end
61     true			// only_if_ref
62   },
63   {
64     "__init_array_start",	// name
65     ".init_array",		// output_section
66     0,				// value
67     0,				// size
68     elfcpp::STT_NOTYPE,		// type
69     elfcpp::STB_GLOBAL,		// binding
70     elfcpp::STV_HIDDEN,		// visibility
71     0,				// nonvis
72     false,			// offset_is_from_end
73     true			// only_if_ref
74   },
75   {
76     "__init_array_end",		// name
77     ".init_array",		// output_section
78     0,				// value
79     0,				// size
80     elfcpp::STT_NOTYPE,		// type
81     elfcpp::STB_GLOBAL,		// binding
82     elfcpp::STV_HIDDEN,		// visibility
83     0,				// nonvis
84     true,			// offset_is_from_end
85     true			// only_if_ref
86   },
87   {
88     "__fini_array_start",	// name
89     ".fini_array",		// output_section
90     0,				// value
91     0,				// size
92     elfcpp::STT_NOTYPE,		// type
93     elfcpp::STB_GLOBAL,		// binding
94     elfcpp::STV_HIDDEN,		// visibility
95     0,				// nonvis
96     false,			// offset_is_from_end
97     true			// only_if_ref
98   },
99   {
100     "__fini_array_end",		// name
101     ".fini_array",		// output_section
102     0,				// value
103     0,				// size
104     elfcpp::STT_NOTYPE,		// type
105     elfcpp::STB_GLOBAL,		// binding
106     elfcpp::STV_HIDDEN,		// visibility
107     0,				// nonvis
108     true,			// offset_is_from_end
109     true			// only_if_ref
110   },
111   {
112     "__stack",			// name
113     ".stack",			// output_section
114     0,				// value
115     0,				// size
116     elfcpp::STT_NOTYPE,		// type
117     elfcpp::STB_GLOBAL,		// binding
118     elfcpp::STV_DEFAULT,	// visibility
119     0,				// nonvis
120     false,			// offset_is_from_end
121     true			// only_if_ref
122   },
123 };
124 
125 const int in_section_count = sizeof in_section / sizeof in_section[0];
126 
127 const Define_symbol_in_segment in_segment[] =
128 {
129   {
130     "__executable_start",	// name
131     elfcpp::PT_LOAD,		// segment_type
132     elfcpp::PF(0),		// segment_flags_set
133     elfcpp::PF(0),		// segment_flags_clear
134     0,				// value
135     0,				// size
136     elfcpp::STT_NOTYPE,		// type
137     elfcpp::STB_GLOBAL,		// binding
138     elfcpp::STV_DEFAULT,	// visibility
139     0,				// nonvis
140     Symbol::SEGMENT_START,	// offset_from_base
141     true			// only_if_ref
142   },
143   {
144     "__ehdr_start",		// name
145     elfcpp::PT_LOAD,		// segment_type
146     elfcpp::PF(0),		// segment_flags_set
147     elfcpp::PF(0),		// segment_flags_clear
148     0,				// value
149     0,				// size
150     elfcpp::STT_NOTYPE,		// type
151     elfcpp::STB_GLOBAL,		// binding
152     elfcpp::STV_HIDDEN,		// visibility
153     0,				// nonvis
154     Symbol::SEGMENT_START,	// offset_from_base
155     true			// only_if_ref
156   },
157   {
158     "etext",			// name
159     elfcpp::PT_LOAD,		// segment_type
160     elfcpp::PF_X,		// segment_flags_set
161     elfcpp::PF_W,		// segment_flags_clear
162     0,				// value
163     0,				// size
164     elfcpp::STT_NOTYPE,		// type
165     elfcpp::STB_GLOBAL,		// binding
166     elfcpp::STV_DEFAULT,	// visibility
167     0,				// nonvis
168     Symbol::SEGMENT_END,	// offset_from_base
169     true			// only_if_ref
170   },
171   {
172     "_etext",			// name
173     elfcpp::PT_LOAD,		// segment_type
174     elfcpp::PF_X,		// segment_flags_set
175     elfcpp::PF_W,		// segment_flags_clear
176     0,				// value
177     0,				// size
178     elfcpp::STT_NOTYPE,		// type
179     elfcpp::STB_GLOBAL,		// binding
180     elfcpp::STV_DEFAULT,	// visibility
181     0,				// nonvis
182     Symbol::SEGMENT_END,	// offset_from_base
183     true			// only_if_ref
184   },
185   {
186     "__etext",			// name
187     elfcpp::PT_LOAD,		// segment_type
188     elfcpp::PF_X,		// segment_flags_set
189     elfcpp::PF_W,		// segment_flags_clear
190     0,				// value
191     0,				// size
192     elfcpp::STT_NOTYPE,		// type
193     elfcpp::STB_GLOBAL,		// binding
194     elfcpp::STV_DEFAULT,	// visibility
195     0,				// nonvis
196     Symbol::SEGMENT_END,	// offset_from_base
197     true			// only_if_ref
198   },
199   {
200     "_edata",			// name
201     elfcpp::PT_LOAD,		// segment_type
202     elfcpp::PF_W,		// segment_flags_set
203     elfcpp::PF(0),		// segment_flags_clear
204     0,				// value
205     0,				// size
206     elfcpp::STT_NOTYPE,		// type
207     elfcpp::STB_GLOBAL,		// binding
208     elfcpp::STV_DEFAULT,	// visibility
209     0,				// nonvis
210     Symbol::SEGMENT_BSS,	// offset_from_base
211     false			// only_if_ref
212   },
213   {
214     "edata",			// name
215     elfcpp::PT_LOAD,		// segment_type
216     elfcpp::PF_W,		// segment_flags_set
217     elfcpp::PF(0),		// segment_flags_clear
218     0,				// value
219     0,				// size
220     elfcpp::STT_NOTYPE,		// type
221     elfcpp::STB_GLOBAL,		// binding
222     elfcpp::STV_DEFAULT,	// visibility
223     0,				// nonvis
224     Symbol::SEGMENT_BSS,	// offset_from_base
225     true			// only_if_ref
226   },
227   {
228     "__bss_start",		// name
229     elfcpp::PT_LOAD,		// segment_type
230     elfcpp::PF_W,		// segment_flags_set
231     elfcpp::PF(0),		// segment_flags_clear
232     0,				// value
233     0,				// size
234     elfcpp::STT_NOTYPE,		// type
235     elfcpp::STB_GLOBAL,		// binding
236     elfcpp::STV_DEFAULT,	// visibility
237     0,				// nonvis
238     Symbol::SEGMENT_BSS,	// offset_from_base
239     false			// only_if_ref
240   },
241   {
242     "_end",			// name
243     elfcpp::PT_LOAD,		// segment_type
244     elfcpp::PF_W,		// segment_flags_set
245     elfcpp::PF(0),		// segment_flags_clear
246     0,				// value
247     0,				// size
248     elfcpp::STT_NOTYPE,		// type
249     elfcpp::STB_GLOBAL,		// binding
250     elfcpp::STV_DEFAULT,	// visibility
251     0,				// nonvis
252     Symbol::SEGMENT_END,	// offset_from_base
253     false			// only_if_ref
254   },
255   {
256     "end",			// name
257     elfcpp::PT_LOAD,		// segment_type
258     elfcpp::PF_W,		// segment_flags_set
259     elfcpp::PF(0),		// segment_flags_clear
260     0,				// value
261     0,				// size
262     elfcpp::STT_NOTYPE,		// type
263     elfcpp::STB_GLOBAL,		// binding
264     elfcpp::STV_DEFAULT,	// visibility
265     0,				// nonvis
266     Symbol::SEGMENT_END,	// offset_from_base
267     true			// only_if_ref
268   }
269 };
270 
271 const int in_segment_count = sizeof in_segment / sizeof in_segment[0];
272 
273 } // End anonymous namespace.
274 
275 namespace gold
276 {
277 
278 void
279 define_standard_symbols(Symbol_table* symtab, const Layout* layout)
280 {
281   bool saw_sections_clause = layout->script_options()->saw_sections_clause();
282   symtab->define_symbols(layout, in_section_count, in_section,
283 			 saw_sections_clause);
284   symtab->define_symbols(layout, in_segment_count, in_segment,
285 			 saw_sections_clause);
286 }
287 
288 } // End namespace gold.
289