xref: /netbsd-src/external/gpl3/binutils/dist/gold/defstd.cc (revision 179b12252ecaf3553d9c2b7458ce62b6a2203d0c)
1 // defstd.cc -- define standard symbols for gold.
2 
3 // Copyright 2006, 2007 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 
113 const int in_section_count = sizeof in_section / sizeof in_section[0];
114 
115 const Define_symbol_in_segment in_segment[] =
116 {
117   {
118     "__executable_start",	// name
119     elfcpp::PT_LOAD,		// segment_type
120     elfcpp::PF(0),		// segment_flags_set
121     elfcpp::PF(0),		// segment_flags_clear
122     0,				// value
123     0,				// size
124     elfcpp::STT_NOTYPE,		// type
125     elfcpp::STB_GLOBAL,		// binding
126     elfcpp::STV_DEFAULT,	// visibility
127     0,				// nonvis
128     Symbol::SEGMENT_START,	// offset_from_base
129     true			// only_if_ref
130   },
131   {
132     "etext",			// name
133     elfcpp::PT_LOAD,		// segment_type
134     elfcpp::PF_X,		// segment_flags_set
135     elfcpp::PF_W,		// segment_flags_clear
136     0,				// value
137     0,				// size
138     elfcpp::STT_NOTYPE,		// type
139     elfcpp::STB_GLOBAL,		// binding
140     elfcpp::STV_DEFAULT,	// visibility
141     0,				// nonvis
142     Symbol::SEGMENT_END,	// offset_from_base
143     true			// only_if_ref
144   },
145   {
146     "_etext",			// name
147     elfcpp::PT_LOAD,		// segment_type
148     elfcpp::PF_X,		// segment_flags_set
149     elfcpp::PF_W,		// segment_flags_clear
150     0,				// value
151     0,				// size
152     elfcpp::STT_NOTYPE,		// type
153     elfcpp::STB_GLOBAL,		// binding
154     elfcpp::STV_DEFAULT,	// visibility
155     0,				// nonvis
156     Symbol::SEGMENT_END,	// offset_from_base
157     true			// only_if_ref
158   },
159   {
160     "__etext",			// name
161     elfcpp::PT_LOAD,		// segment_type
162     elfcpp::PF_X,		// segment_flags_set
163     elfcpp::PF_W,		// segment_flags_clear
164     0,				// value
165     0,				// size
166     elfcpp::STT_NOTYPE,		// type
167     elfcpp::STB_GLOBAL,		// binding
168     elfcpp::STV_DEFAULT,	// visibility
169     0,				// nonvis
170     Symbol::SEGMENT_END,	// offset_from_base
171     true			// only_if_ref
172   },
173   {
174     "_edata",			// name
175     elfcpp::PT_LOAD,		// segment_type
176     elfcpp::PF_W,		// segment_flags_set
177     elfcpp::PF(0),		// segment_flags_clear
178     0,				// value
179     0,				// size
180     elfcpp::STT_NOTYPE,		// type
181     elfcpp::STB_GLOBAL,		// binding
182     elfcpp::STV_DEFAULT,	// visibility
183     0,				// nonvis
184     Symbol::SEGMENT_BSS,	// offset_from_base
185     false			// only_if_ref
186   },
187   {
188     "edata",			// name
189     elfcpp::PT_LOAD,		// segment_type
190     elfcpp::PF_W,		// segment_flags_set
191     elfcpp::PF(0),		// segment_flags_clear
192     0,				// value
193     0,				// size
194     elfcpp::STT_NOTYPE,		// type
195     elfcpp::STB_GLOBAL,		// binding
196     elfcpp::STV_DEFAULT,	// visibility
197     0,				// nonvis
198     Symbol::SEGMENT_BSS,	// offset_from_base
199     true			// only_if_ref
200   },
201   {
202     "__bss_start",		// name
203     elfcpp::PT_LOAD,		// segment_type
204     elfcpp::PF_W,		// segment_flags_set
205     elfcpp::PF(0),		// segment_flags_clear
206     0,				// value
207     0,				// size
208     elfcpp::STT_NOTYPE,		// type
209     elfcpp::STB_GLOBAL,		// binding
210     elfcpp::STV_DEFAULT,	// visibility
211     0,				// nonvis
212     Symbol::SEGMENT_BSS,	// offset_from_base
213     false			// only_if_ref
214   },
215   {
216     "_end",			// name
217     elfcpp::PT_LOAD,		// segment_type
218     elfcpp::PF_W,		// segment_flags_set
219     elfcpp::PF(0),		// segment_flags_clear
220     0,				// value
221     0,				// size
222     elfcpp::STT_NOTYPE,		// type
223     elfcpp::STB_GLOBAL,		// binding
224     elfcpp::STV_DEFAULT,	// visibility
225     0,				// nonvis
226     Symbol::SEGMENT_END,	// offset_from_base
227     false			// only_if_ref
228   },
229   {
230     "end",			// name
231     elfcpp::PT_LOAD,		// segment_type
232     elfcpp::PF_W,		// segment_flags_set
233     elfcpp::PF(0),		// segment_flags_clear
234     0,				// value
235     0,				// size
236     elfcpp::STT_NOTYPE,		// type
237     elfcpp::STB_GLOBAL,		// binding
238     elfcpp::STV_DEFAULT,	// visibility
239     0,				// nonvis
240     Symbol::SEGMENT_END,	// offset_from_base
241     false			// only_if_ref
242   }
243 };
244 
245 const int in_segment_count = sizeof in_segment / sizeof in_segment[0];
246 
247 } // End anonymous namespace.
248 
249 namespace gold
250 {
251 
252 void
253 define_standard_symbols(Symbol_table* symtab, const Layout* layout)
254 {
255   bool saw_sections_clause = layout->script_options()->saw_sections_clause();
256   symtab->define_symbols(layout, in_section_count, in_section,
257 			 saw_sections_clause);
258   symtab->define_symbols(layout, in_segment_count, in_segment,
259 			 saw_sections_clause);
260 }
261 
262 } // End namespace gold.
263