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