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