Merge branch 'vendor/OPENSSL'
[dragonfly.git] / contrib / binutils-2.20 / gold / defstd.cc
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.