* merge.cc (Output_merge_string::do_add_input_section): Correct
[platform/upstream/binutils.git] / gold / defstd.cc
1 // defstd.cc -- define standard symbols for gold.
2
3 // Copyright 2006, 2007, 2008, 2009, 2010 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     "etext",                    // name
145     elfcpp::PT_LOAD,            // segment_type
146     elfcpp::PF_X,               // segment_flags_set
147     elfcpp::PF_W,               // segment_flags_clear
148     0,                          // value
149     0,                          // size
150     elfcpp::STT_NOTYPE,         // type
151     elfcpp::STB_GLOBAL,         // binding
152     elfcpp::STV_DEFAULT,        // visibility
153     0,                          // nonvis
154     Symbol::SEGMENT_END,        // 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     "_edata",                   // name
187     elfcpp::PT_LOAD,            // segment_type
188     elfcpp::PF_W,               // segment_flags_set
189     elfcpp::PF(0),              // 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_BSS,        // offset_from_base
197     false                       // 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     true                        // only_if_ref
212   },
213   {
214     "__bss_start",              // 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     false                       // only_if_ref
226   },
227   {
228     "_end",                     // 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_END,        // 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     true                        // only_if_ref
254   }
255 };
256
257 const int in_segment_count = sizeof in_segment / sizeof in_segment[0];
258
259 } // End anonymous namespace.
260
261 namespace gold
262 {
263
264 void
265 define_standard_symbols(Symbol_table* symtab, const Layout* layout)
266 {
267   bool saw_sections_clause = layout->script_options()->saw_sections_clause();
268   symtab->define_symbols(layout, in_section_count, in_section,
269                          saw_sections_clause);
270   symtab->define_symbols(layout, in_segment_count, in_segment,
271                          saw_sections_clause);
272 }
273
274 } // End namespace gold.