1// defstd.cc -- define standard symbols for gold.
2
3// Copyright (C) 2006-2017 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
32namespace
33{
34
35using namespace gold;
36
37const 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
125const int in_section_count = sizeof in_section / sizeof in_section[0];
126
127const 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
271const int in_segment_count = sizeof in_segment / sizeof in_segment[0];
272
273} // End anonymous namespace.
274
275namespace gold
276{
277
278void
279define_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