2012-08-21 Cary Coutant <ccoutant@google.com>
[external/binutils.git] / gold / symtab.cc
1 // symtab.cc -- the gold symbol table
2
3 // Copyright 2006, 2007, 2008, 2009, 2010, 2011 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 <cstring>
26 #include <stdint.h>
27 #include <algorithm>
28 #include <set>
29 #include <string>
30 #include <utility>
31 #include "demangle.h"
32
33 #include "gc.h"
34 #include "object.h"
35 #include "dwarf_reader.h"
36 #include "dynobj.h"
37 #include "output.h"
38 #include "target.h"
39 #include "workqueue.h"
40 #include "symtab.h"
41 #include "script.h"
42 #include "plugin.h"
43 #include "incremental.h"
44
45 namespace gold
46 {
47
48 // Class Symbol.
49
50 // Initialize fields in Symbol.  This initializes everything except u_
51 // and source_.
52
53 void
54 Symbol::init_fields(const char* name, const char* version,
55                     elfcpp::STT type, elfcpp::STB binding,
56                     elfcpp::STV visibility, unsigned char nonvis)
57 {
58   this->name_ = name;
59   this->version_ = version;
60   this->symtab_index_ = 0;
61   this->dynsym_index_ = 0;
62   this->got_offsets_.init();
63   this->plt_offset_ = -1U;
64   this->type_ = type;
65   this->binding_ = binding;
66   this->visibility_ = visibility;
67   this->nonvis_ = nonvis;
68   this->is_def_ = false;
69   this->is_forwarder_ = false;
70   this->has_alias_ = false;
71   this->needs_dynsym_entry_ = false;
72   this->in_reg_ = false;
73   this->in_dyn_ = false;
74   this->has_warning_ = false;
75   this->is_copied_from_dynobj_ = false;
76   this->is_forced_local_ = false;
77   this->is_ordinary_shndx_ = false;
78   this->in_real_elf_ = false;
79   this->is_defined_in_discarded_section_ = false;
80   this->undef_binding_set_ = false;
81   this->undef_binding_weak_ = false;
82   this->is_predefined_ = false;
83 }
84
85 // Return the demangled version of the symbol's name, but only
86 // if the --demangle flag was set.
87
88 static std::string
89 demangle(const char* name)
90 {
91   if (!parameters->options().do_demangle())
92     return name;
93
94   // cplus_demangle allocates memory for the result it returns,
95   // and returns NULL if the name is already demangled.
96   char* demangled_name = cplus_demangle(name, DMGL_ANSI | DMGL_PARAMS);
97   if (demangled_name == NULL)
98     return name;
99
100   std::string retval(demangled_name);
101   free(demangled_name);
102   return retval;
103 }
104
105 std::string
106 Symbol::demangled_name() const
107 {
108   return demangle(this->name());
109 }
110
111 // Initialize the fields in the base class Symbol for SYM in OBJECT.
112
113 template<int size, bool big_endian>
114 void
115 Symbol::init_base_object(const char* name, const char* version, Object* object,
116                          const elfcpp::Sym<size, big_endian>& sym,
117                          unsigned int st_shndx, bool is_ordinary)
118 {
119   this->init_fields(name, version, sym.get_st_type(), sym.get_st_bind(),
120                     sym.get_st_visibility(), sym.get_st_nonvis());
121   this->u_.from_object.object = object;
122   this->u_.from_object.shndx = st_shndx;
123   this->is_ordinary_shndx_ = is_ordinary;
124   this->source_ = FROM_OBJECT;
125   this->in_reg_ = !object->is_dynamic();
126   this->in_dyn_ = object->is_dynamic();
127   this->in_real_elf_ = object->pluginobj() == NULL;
128 }
129
130 // Initialize the fields in the base class Symbol for a symbol defined
131 // in an Output_data.
132
133 void
134 Symbol::init_base_output_data(const char* name, const char* version,
135                               Output_data* od, elfcpp::STT type,
136                               elfcpp::STB binding, elfcpp::STV visibility,
137                               unsigned char nonvis, bool offset_is_from_end,
138                               bool is_predefined)
139 {
140   this->init_fields(name, version, type, binding, visibility, nonvis);
141   this->u_.in_output_data.output_data = od;
142   this->u_.in_output_data.offset_is_from_end = offset_is_from_end;
143   this->source_ = IN_OUTPUT_DATA;
144   this->in_reg_ = true;
145   this->in_real_elf_ = true;
146   this->is_predefined_ = is_predefined;
147 }
148
149 // Initialize the fields in the base class Symbol for a symbol defined
150 // in an Output_segment.
151
152 void
153 Symbol::init_base_output_segment(const char* name, const char* version,
154                                  Output_segment* os, elfcpp::STT type,
155                                  elfcpp::STB binding, elfcpp::STV visibility,
156                                  unsigned char nonvis,
157                                  Segment_offset_base offset_base,
158                                  bool is_predefined)
159 {
160   this->init_fields(name, version, type, binding, visibility, nonvis);
161   this->u_.in_output_segment.output_segment = os;
162   this->u_.in_output_segment.offset_base = offset_base;
163   this->source_ = IN_OUTPUT_SEGMENT;
164   this->in_reg_ = true;
165   this->in_real_elf_ = true;
166   this->is_predefined_ = is_predefined;
167 }
168
169 // Initialize the fields in the base class Symbol for a symbol defined
170 // as a constant.
171
172 void
173 Symbol::init_base_constant(const char* name, const char* version,
174                            elfcpp::STT type, elfcpp::STB binding,
175                            elfcpp::STV visibility, unsigned char nonvis,
176                            bool is_predefined)
177 {
178   this->init_fields(name, version, type, binding, visibility, nonvis);
179   this->source_ = IS_CONSTANT;
180   this->in_reg_ = true;
181   this->in_real_elf_ = true;
182   this->is_predefined_ = is_predefined;
183 }
184
185 // Initialize the fields in the base class Symbol for an undefined
186 // symbol.
187
188 void
189 Symbol::init_base_undefined(const char* name, const char* version,
190                             elfcpp::STT type, elfcpp::STB binding,
191                             elfcpp::STV visibility, unsigned char nonvis)
192 {
193   this->init_fields(name, version, type, binding, visibility, nonvis);
194   this->dynsym_index_ = -1U;
195   this->source_ = IS_UNDEFINED;
196   this->in_reg_ = true;
197   this->in_real_elf_ = true;
198 }
199
200 // Allocate a common symbol in the base.
201
202 void
203 Symbol::allocate_base_common(Output_data* od)
204 {
205   gold_assert(this->is_common());
206   this->source_ = IN_OUTPUT_DATA;
207   this->u_.in_output_data.output_data = od;
208   this->u_.in_output_data.offset_is_from_end = false;
209 }
210
211 // Initialize the fields in Sized_symbol for SYM in OBJECT.
212
213 template<int size>
214 template<bool big_endian>
215 void
216 Sized_symbol<size>::init_object(const char* name, const char* version,
217                                 Object* object,
218                                 const elfcpp::Sym<size, big_endian>& sym,
219                                 unsigned int st_shndx, bool is_ordinary)
220 {
221   this->init_base_object(name, version, object, sym, st_shndx, is_ordinary);
222   this->value_ = sym.get_st_value();
223   this->symsize_ = sym.get_st_size();
224 }
225
226 // Initialize the fields in Sized_symbol for a symbol defined in an
227 // Output_data.
228
229 template<int size>
230 void
231 Sized_symbol<size>::init_output_data(const char* name, const char* version,
232                                      Output_data* od, Value_type value,
233                                      Size_type symsize, elfcpp::STT type,
234                                      elfcpp::STB binding,
235                                      elfcpp::STV visibility,
236                                      unsigned char nonvis,
237                                      bool offset_is_from_end,
238                                      bool is_predefined)
239 {
240   this->init_base_output_data(name, version, od, type, binding, visibility,
241                               nonvis, offset_is_from_end, is_predefined);
242   this->value_ = value;
243   this->symsize_ = symsize;
244 }
245
246 // Initialize the fields in Sized_symbol for a symbol defined in an
247 // Output_segment.
248
249 template<int size>
250 void
251 Sized_symbol<size>::init_output_segment(const char* name, const char* version,
252                                         Output_segment* os, Value_type value,
253                                         Size_type symsize, elfcpp::STT type,
254                                         elfcpp::STB binding,
255                                         elfcpp::STV visibility,
256                                         unsigned char nonvis,
257                                         Segment_offset_base offset_base,
258                                         bool is_predefined)
259 {
260   this->init_base_output_segment(name, version, os, type, binding, visibility,
261                                  nonvis, offset_base, is_predefined);
262   this->value_ = value;
263   this->symsize_ = symsize;
264 }
265
266 // Initialize the fields in Sized_symbol for a symbol defined as a
267 // constant.
268
269 template<int size>
270 void
271 Sized_symbol<size>::init_constant(const char* name, const char* version,
272                                   Value_type value, Size_type symsize,
273                                   elfcpp::STT type, elfcpp::STB binding,
274                                   elfcpp::STV visibility, unsigned char nonvis,
275                                   bool is_predefined)
276 {
277   this->init_base_constant(name, version, type, binding, visibility, nonvis,
278                            is_predefined);
279   this->value_ = value;
280   this->symsize_ = symsize;
281 }
282
283 // Initialize the fields in Sized_symbol for an undefined symbol.
284
285 template<int size>
286 void
287 Sized_symbol<size>::init_undefined(const char* name, const char* version,
288                                    elfcpp::STT type, elfcpp::STB binding,
289                                    elfcpp::STV visibility, unsigned char nonvis)
290 {
291   this->init_base_undefined(name, version, type, binding, visibility, nonvis);
292   this->value_ = 0;
293   this->symsize_ = 0;
294 }
295
296 // Return an allocated string holding the symbol's name as
297 // name@version.  This is used for relocatable links.
298
299 std::string
300 Symbol::versioned_name() const
301 {
302   gold_assert(this->version_ != NULL);
303   std::string ret = this->name_;
304   ret.push_back('@');
305   if (this->is_def_)
306     ret.push_back('@');
307   ret += this->version_;
308   return ret;
309 }
310
311 // Return true if SHNDX represents a common symbol.
312
313 bool
314 Symbol::is_common_shndx(unsigned int shndx)
315 {
316   return (shndx == elfcpp::SHN_COMMON
317           || shndx == parameters->target().small_common_shndx()
318           || shndx == parameters->target().large_common_shndx());
319 }
320
321 // Allocate a common symbol.
322
323 template<int size>
324 void
325 Sized_symbol<size>::allocate_common(Output_data* od, Value_type value)
326 {
327   this->allocate_base_common(od);
328   this->value_ = value;
329 }
330
331 // The ""'s around str ensure str is a string literal, so sizeof works.
332 #define strprefix(var, str)   (strncmp(var, str, sizeof("" str "") - 1) == 0)
333
334 // Return true if this symbol should be added to the dynamic symbol
335 // table.
336
337 inline bool
338 Symbol::should_add_dynsym_entry(Symbol_table* symtab) const
339 {
340   // If the symbol is only present on plugin files, the plugin decided we
341   // don't need it.
342   if (!this->in_real_elf())
343     return false;
344
345   // If the symbol is used by a dynamic relocation, we need to add it.
346   if (this->needs_dynsym_entry())
347     return true;
348
349   // If this symbol's section is not added, the symbol need not be added. 
350   // The section may have been GCed.  Note that export_dynamic is being 
351   // overridden here.  This should not be done for shared objects.
352   if (parameters->options().gc_sections() 
353       && !parameters->options().shared()
354       && this->source() == Symbol::FROM_OBJECT
355       && !this->object()->is_dynamic())
356     {
357       Relobj* relobj = static_cast<Relobj*>(this->object());
358       bool is_ordinary;
359       unsigned int shndx = this->shndx(&is_ordinary);
360       if (is_ordinary && shndx != elfcpp::SHN_UNDEF
361           && !relobj->is_section_included(shndx)
362           && !symtab->is_section_folded(relobj, shndx))
363         return false;
364     }
365
366   // If the symbol was forced dynamic in a --dynamic-list file
367   // or an --export-dynamic-symbol option, add it.
368   if (!this->is_from_dynobj()
369       && (parameters->options().in_dynamic_list(this->name())
370           || parameters->options().is_export_dynamic_symbol(this->name())))
371     {
372       if (!this->is_forced_local())
373         return true;
374       gold_warning(_("Cannot export local symbol '%s'"),
375                    this->demangled_name().c_str());
376       return false;
377     }
378
379   // If the symbol was forced local in a version script, do not add it.
380   if (this->is_forced_local())
381     return false;
382
383   // If dynamic-list-data was specified, add any STT_OBJECT.
384   if (parameters->options().dynamic_list_data()
385       && !this->is_from_dynobj()
386       && this->type() == elfcpp::STT_OBJECT)
387     return true;
388
389   // If --dynamic-list-cpp-new was specified, add any new/delete symbol.
390   // If --dynamic-list-cpp-typeinfo was specified, add any typeinfo symbols.
391   if ((parameters->options().dynamic_list_cpp_new()
392        || parameters->options().dynamic_list_cpp_typeinfo())
393       && !this->is_from_dynobj())
394     {
395       // TODO(csilvers): We could probably figure out if we're an operator
396       //                 new/delete or typeinfo without the need to demangle.
397       char* demangled_name = cplus_demangle(this->name(),
398                                             DMGL_ANSI | DMGL_PARAMS);
399       if (demangled_name == NULL)
400         {
401           // Not a C++ symbol, so it can't satisfy these flags
402         }
403       else if (parameters->options().dynamic_list_cpp_new()
404                && (strprefix(demangled_name, "operator new")
405                    || strprefix(demangled_name, "operator delete")))
406         {
407           free(demangled_name);
408           return true;
409         }
410       else if (parameters->options().dynamic_list_cpp_typeinfo()
411                && (strprefix(demangled_name, "typeinfo name for")
412                    || strprefix(demangled_name, "typeinfo for")))
413         {
414           free(demangled_name);
415           return true;
416         }
417       else
418         free(demangled_name);
419     }
420
421   // If exporting all symbols or building a shared library,
422   // and the symbol is defined in a regular object and is
423   // externally visible, we need to add it.
424   if ((parameters->options().export_dynamic() || parameters->options().shared())
425       && !this->is_from_dynobj()
426       && !this->is_undefined()
427       && this->is_externally_visible())
428     return true;
429
430   return false;
431 }
432
433 // Return true if the final value of this symbol is known at link
434 // time.
435
436 bool
437 Symbol::final_value_is_known() const
438 {
439   // If we are not generating an executable, then no final values are
440   // known, since they will change at runtime.
441   if (parameters->options().output_is_position_independent()
442       || parameters->options().relocatable())
443     return false;
444
445   // If the symbol is not from an object file, and is not undefined,
446   // then it is defined, and known.
447   if (this->source_ != FROM_OBJECT)
448     {
449       if (this->source_ != IS_UNDEFINED)
450         return true;
451     }
452   else
453     {
454       // If the symbol is from a dynamic object, then the final value
455       // is not known.
456       if (this->object()->is_dynamic())
457         return false;
458
459       // If the symbol is not undefined (it is defined or common),
460       // then the final value is known.
461       if (!this->is_undefined())
462         return true;
463     }
464
465   // If the symbol is undefined, then whether the final value is known
466   // depends on whether we are doing a static link.  If we are doing a
467   // dynamic link, then the final value could be filled in at runtime.
468   // This could reasonably be the case for a weak undefined symbol.
469   return parameters->doing_static_link();
470 }
471
472 // Return the output section where this symbol is defined.
473
474 Output_section*
475 Symbol::output_section() const
476 {
477   switch (this->source_)
478     {
479     case FROM_OBJECT:
480       {
481         unsigned int shndx = this->u_.from_object.shndx;
482         if (shndx != elfcpp::SHN_UNDEF && this->is_ordinary_shndx_)
483           {
484             gold_assert(!this->u_.from_object.object->is_dynamic());
485             gold_assert(this->u_.from_object.object->pluginobj() == NULL);
486             Relobj* relobj = static_cast<Relobj*>(this->u_.from_object.object);
487             return relobj->output_section(shndx);
488           }
489         return NULL;
490       }
491
492     case IN_OUTPUT_DATA:
493       return this->u_.in_output_data.output_data->output_section();
494
495     case IN_OUTPUT_SEGMENT:
496     case IS_CONSTANT:
497     case IS_UNDEFINED:
498       return NULL;
499
500     default:
501       gold_unreachable();
502     }
503 }
504
505 // Set the symbol's output section.  This is used for symbols defined
506 // in scripts.  This should only be called after the symbol table has
507 // been finalized.
508
509 void
510 Symbol::set_output_section(Output_section* os)
511 {
512   switch (this->source_)
513     {
514     case FROM_OBJECT:
515     case IN_OUTPUT_DATA:
516       gold_assert(this->output_section() == os);
517       break;
518     case IS_CONSTANT:
519       this->source_ = IN_OUTPUT_DATA;
520       this->u_.in_output_data.output_data = os;
521       this->u_.in_output_data.offset_is_from_end = false;
522       break;
523     case IN_OUTPUT_SEGMENT:
524     case IS_UNDEFINED:
525     default:
526       gold_unreachable();
527     }
528 }
529
530 // Class Symbol_table.
531
532 Symbol_table::Symbol_table(unsigned int count,
533                            const Version_script_info& version_script)
534   : saw_undefined_(0), offset_(0), table_(count), namepool_(),
535     forwarders_(), commons_(), tls_commons_(), small_commons_(),
536     large_commons_(), forced_locals_(), warnings_(),
537     version_script_(version_script), gc_(NULL), icf_(NULL)
538 {
539   namepool_.reserve(count);
540 }
541
542 Symbol_table::~Symbol_table()
543 {
544 }
545
546 // The symbol table key equality function.  This is called with
547 // Stringpool keys.
548
549 inline bool
550 Symbol_table::Symbol_table_eq::operator()(const Symbol_table_key& k1,
551                                           const Symbol_table_key& k2) const
552 {
553   return k1.first == k2.first && k1.second == k2.second;
554 }
555
556 bool
557 Symbol_table::is_section_folded(Object* obj, unsigned int shndx) const
558 {
559   return (parameters->options().icf_enabled()
560           && this->icf_->is_section_folded(obj, shndx));
561 }
562
563 // For symbols that have been listed with a -u or --export-dynamic-symbol
564 // option, add them to the work list to avoid gc'ing them.
565
566 void 
567 Symbol_table::gc_mark_undef_symbols(Layout* layout)
568 {
569   for (options::String_set::const_iterator p =
570          parameters->options().undefined_begin();
571        p != parameters->options().undefined_end();
572        ++p)
573     {
574       const char* name = p->c_str();
575       Symbol* sym = this->lookup(name);
576       gold_assert(sym != NULL);
577       if (sym->source() == Symbol::FROM_OBJECT 
578           && !sym->object()->is_dynamic())
579         {
580           Relobj* obj = static_cast<Relobj*>(sym->object());
581           bool is_ordinary;
582           unsigned int shndx = sym->shndx(&is_ordinary);
583           if (is_ordinary)
584             {
585               gold_assert(this->gc_ != NULL);
586               this->gc_->worklist().push(Section_id(obj, shndx));
587             }
588         }
589     }
590
591   for (options::String_set::const_iterator p =
592          parameters->options().export_dynamic_symbol_begin();
593        p != parameters->options().export_dynamic_symbol_end();
594        ++p)
595     {
596       const char* name = p->c_str();
597       Symbol* sym = this->lookup(name);
598       // It's not an error if a symbol named by --export-dynamic-symbol
599       // is undefined.
600       if (sym != NULL
601           && sym->source() == Symbol::FROM_OBJECT 
602           && !sym->object()->is_dynamic())
603         {
604           Relobj* obj = static_cast<Relobj*>(sym->object());
605           bool is_ordinary;
606           unsigned int shndx = sym->shndx(&is_ordinary);
607           if (is_ordinary)
608             {
609               gold_assert(this->gc_ != NULL);
610               this->gc_->worklist().push(Section_id(obj, shndx));
611             }
612         }
613     }
614
615   for (Script_options::referenced_const_iterator p =
616          layout->script_options()->referenced_begin();
617        p != layout->script_options()->referenced_end();
618        ++p)
619     {
620       Symbol* sym = this->lookup(p->c_str());
621       gold_assert(sym != NULL);
622       if (sym->source() == Symbol::FROM_OBJECT
623           && !sym->object()->is_dynamic())
624         {
625           Relobj* obj = static_cast<Relobj*>(sym->object());
626           bool is_ordinary;
627           unsigned int shndx = sym->shndx(&is_ordinary);
628           if (is_ordinary)
629             {
630               gold_assert(this->gc_ != NULL);
631               this->gc_->worklist().push(Section_id(obj, shndx));
632             }
633         }
634     }
635 }
636
637 void
638 Symbol_table::gc_mark_symbol(Symbol* sym)
639 {
640   // Add the object and section to the work list.
641   Relobj* obj = static_cast<Relobj*>(sym->object());
642   bool is_ordinary;
643   unsigned int shndx = sym->shndx(&is_ordinary);
644   if (is_ordinary && shndx != elfcpp::SHN_UNDEF)
645     {
646       gold_assert(this->gc_!= NULL);
647       this->gc_->worklist().push(Section_id(obj, shndx));
648     }
649 }
650
651 // When doing garbage collection, keep symbols that have been seen in
652 // dynamic objects.
653 inline void 
654 Symbol_table::gc_mark_dyn_syms(Symbol* sym)
655 {
656   if (sym->in_dyn() && sym->source() == Symbol::FROM_OBJECT
657       && !sym->object()->is_dynamic())
658     this->gc_mark_symbol(sym);
659 }
660
661 // Make TO a symbol which forwards to FROM.
662
663 void
664 Symbol_table::make_forwarder(Symbol* from, Symbol* to)
665 {
666   gold_assert(from != to);
667   gold_assert(!from->is_forwarder() && !to->is_forwarder());
668   this->forwarders_[from] = to;
669   from->set_forwarder();
670 }
671
672 // Resolve the forwards from FROM, returning the real symbol.
673
674 Symbol*
675 Symbol_table::resolve_forwards(const Symbol* from) const
676 {
677   gold_assert(from->is_forwarder());
678   Unordered_map<const Symbol*, Symbol*>::const_iterator p =
679     this->forwarders_.find(from);
680   gold_assert(p != this->forwarders_.end());
681   return p->second;
682 }
683
684 // Look up a symbol by name.
685
686 Symbol*
687 Symbol_table::lookup(const char* name, const char* version) const
688 {
689   Stringpool::Key name_key;
690   name = this->namepool_.find(name, &name_key);
691   if (name == NULL)
692     return NULL;
693
694   Stringpool::Key version_key = 0;
695   if (version != NULL)
696     {
697       version = this->namepool_.find(version, &version_key);
698       if (version == NULL)
699         return NULL;
700     }
701
702   Symbol_table_key key(name_key, version_key);
703   Symbol_table::Symbol_table_type::const_iterator p = this->table_.find(key);
704   if (p == this->table_.end())
705     return NULL;
706   return p->second;
707 }
708
709 // Resolve a Symbol with another Symbol.  This is only used in the
710 // unusual case where there are references to both an unversioned
711 // symbol and a symbol with a version, and we then discover that that
712 // version is the default version.  Because this is unusual, we do
713 // this the slow way, by converting back to an ELF symbol.
714
715 template<int size, bool big_endian>
716 void
717 Symbol_table::resolve(Sized_symbol<size>* to, const Sized_symbol<size>* from)
718 {
719   unsigned char buf[elfcpp::Elf_sizes<size>::sym_size];
720   elfcpp::Sym_write<size, big_endian> esym(buf);
721   // We don't bother to set the st_name or the st_shndx field.
722   esym.put_st_value(from->value());
723   esym.put_st_size(from->symsize());
724   esym.put_st_info(from->binding(), from->type());
725   esym.put_st_other(from->visibility(), from->nonvis());
726   bool is_ordinary;
727   unsigned int shndx = from->shndx(&is_ordinary);
728   this->resolve(to, esym.sym(), shndx, is_ordinary, shndx, from->object(),
729                 from->version());
730   if (from->in_reg())
731     to->set_in_reg();
732   if (from->in_dyn())
733     to->set_in_dyn();
734   if (parameters->options().gc_sections())
735     this->gc_mark_dyn_syms(to);
736 }
737
738 // Record that a symbol is forced to be local by a version script or
739 // by visibility.
740
741 void
742 Symbol_table::force_local(Symbol* sym)
743 {
744   if (!sym->is_defined() && !sym->is_common())
745     return;
746   if (sym->is_forced_local())
747     {
748       // We already got this one.
749       return;
750     }
751   sym->set_is_forced_local();
752   this->forced_locals_.push_back(sym);
753 }
754
755 // Adjust NAME for wrapping, and update *NAME_KEY if necessary.  This
756 // is only called for undefined symbols, when at least one --wrap
757 // option was used.
758
759 const char*
760 Symbol_table::wrap_symbol(const char* name, Stringpool::Key* name_key)
761 {
762   // For some targets, we need to ignore a specific character when
763   // wrapping, and add it back later.
764   char prefix = '\0';
765   if (name[0] == parameters->target().wrap_char())
766     {
767       prefix = name[0];
768       ++name;
769     }
770
771   if (parameters->options().is_wrap(name))
772     {
773       // Turn NAME into __wrap_NAME.
774       std::string s;
775       if (prefix != '\0')
776         s += prefix;
777       s += "__wrap_";
778       s += name;
779
780       // This will give us both the old and new name in NAMEPOOL_, but
781       // that is OK.  Only the versions we need will wind up in the
782       // real string table in the output file.
783       return this->namepool_.add(s.c_str(), true, name_key);
784     }
785
786   const char* const real_prefix = "__real_";
787   const size_t real_prefix_length = strlen(real_prefix);
788   if (strncmp(name, real_prefix, real_prefix_length) == 0
789       && parameters->options().is_wrap(name + real_prefix_length))
790     {
791       // Turn __real_NAME into NAME.
792       std::string s;
793       if (prefix != '\0')
794         s += prefix;
795       s += name + real_prefix_length;
796       return this->namepool_.add(s.c_str(), true, name_key);
797     }
798
799   return name;
800 }
801
802 // This is called when we see a symbol NAME/VERSION, and the symbol
803 // already exists in the symbol table, and VERSION is marked as being
804 // the default version.  SYM is the NAME/VERSION symbol we just added.
805 // DEFAULT_IS_NEW is true if this is the first time we have seen the
806 // symbol NAME/NULL.  PDEF points to the entry for NAME/NULL.
807
808 template<int size, bool big_endian>
809 void
810 Symbol_table::define_default_version(Sized_symbol<size>* sym,
811                                      bool default_is_new,
812                                      Symbol_table_type::iterator pdef)
813 {
814   if (default_is_new)
815     {
816       // This is the first time we have seen NAME/NULL.  Make
817       // NAME/NULL point to NAME/VERSION, and mark SYM as the default
818       // version.
819       pdef->second = sym;
820       sym->set_is_default();
821     }
822   else if (pdef->second == sym)
823     {
824       // NAME/NULL already points to NAME/VERSION.  Don't mark the
825       // symbol as the default if it is not already the default.
826     }
827   else
828     {
829       // This is the unfortunate case where we already have entries
830       // for both NAME/VERSION and NAME/NULL.  We now see a symbol
831       // NAME/VERSION where VERSION is the default version.  We have
832       // already resolved this new symbol with the existing
833       // NAME/VERSION symbol.
834
835       // It's possible that NAME/NULL and NAME/VERSION are both
836       // defined in regular objects.  This can only happen if one
837       // object file defines foo and another defines foo@@ver.  This
838       // is somewhat obscure, but we call it a multiple definition
839       // error.
840
841       // It's possible that NAME/NULL actually has a version, in which
842       // case it won't be the same as VERSION.  This happens with
843       // ver_test_7.so in the testsuite for the symbol t2_2.  We see
844       // t2_2@@VER2, so we define both t2_2/VER2 and t2_2/NULL.  We
845       // then see an unadorned t2_2 in an object file and give it
846       // version VER1 from the version script.  This looks like a
847       // default definition for VER1, so it looks like we should merge
848       // t2_2/NULL with t2_2/VER1.  That doesn't make sense, but it's
849       // not obvious that this is an error, either.  So we just punt.
850
851       // If one of the symbols has non-default visibility, and the
852       // other is defined in a shared object, then they are different
853       // symbols.
854
855       // Otherwise, we just resolve the symbols as though they were
856       // the same.
857
858       if (pdef->second->version() != NULL)
859         gold_assert(pdef->second->version() != sym->version());
860       else if (sym->visibility() != elfcpp::STV_DEFAULT
861                && pdef->second->is_from_dynobj())
862         ;
863       else if (pdef->second->visibility() != elfcpp::STV_DEFAULT
864                && sym->is_from_dynobj())
865         ;
866       else
867         {
868           const Sized_symbol<size>* symdef;
869           symdef = this->get_sized_symbol<size>(pdef->second);
870           Symbol_table::resolve<size, big_endian>(sym, symdef);
871           this->make_forwarder(pdef->second, sym);
872           pdef->second = sym;
873           sym->set_is_default();
874         }
875     }
876 }
877
878 // Add one symbol from OBJECT to the symbol table.  NAME is symbol
879 // name and VERSION is the version; both are canonicalized.  DEF is
880 // whether this is the default version.  ST_SHNDX is the symbol's
881 // section index; IS_ORDINARY is whether this is a normal section
882 // rather than a special code.
883
884 // If IS_DEFAULT_VERSION is true, then this is the definition of a
885 // default version of a symbol.  That means that any lookup of
886 // NAME/NULL and any lookup of NAME/VERSION should always return the
887 // same symbol.  This is obvious for references, but in particular we
888 // want to do this for definitions: overriding NAME/NULL should also
889 // override NAME/VERSION.  If we don't do that, it would be very hard
890 // to override functions in a shared library which uses versioning.
891
892 // We implement this by simply making both entries in the hash table
893 // point to the same Symbol structure.  That is easy enough if this is
894 // the first time we see NAME/NULL or NAME/VERSION, but it is possible
895 // that we have seen both already, in which case they will both have
896 // independent entries in the symbol table.  We can't simply change
897 // the symbol table entry, because we have pointers to the entries
898 // attached to the object files.  So we mark the entry attached to the
899 // object file as a forwarder, and record it in the forwarders_ map.
900 // Note that entries in the hash table will never be marked as
901 // forwarders.
902 //
903 // ORIG_ST_SHNDX and ST_SHNDX are almost always the same.
904 // ORIG_ST_SHNDX is the section index in the input file, or SHN_UNDEF
905 // for a special section code.  ST_SHNDX may be modified if the symbol
906 // is defined in a section being discarded.
907
908 template<int size, bool big_endian>
909 Sized_symbol<size>*
910 Symbol_table::add_from_object(Object* object,
911                               const char* name,
912                               Stringpool::Key name_key,
913                               const char* version,
914                               Stringpool::Key version_key,
915                               bool is_default_version,
916                               const elfcpp::Sym<size, big_endian>& sym,
917                               unsigned int st_shndx,
918                               bool is_ordinary,
919                               unsigned int orig_st_shndx)
920 {
921   // Print a message if this symbol is being traced.
922   if (parameters->options().is_trace_symbol(name))
923     {
924       if (orig_st_shndx == elfcpp::SHN_UNDEF)
925         gold_info(_("%s: reference to %s"), object->name().c_str(), name);
926       else
927         gold_info(_("%s: definition of %s"), object->name().c_str(), name);
928     }
929
930   // For an undefined symbol, we may need to adjust the name using
931   // --wrap.
932   if (orig_st_shndx == elfcpp::SHN_UNDEF
933       && parameters->options().any_wrap())
934     {
935       const char* wrap_name = this->wrap_symbol(name, &name_key);
936       if (wrap_name != name)
937         {
938           // If we see a reference to malloc with version GLIBC_2.0,
939           // and we turn it into a reference to __wrap_malloc, then we
940           // discard the version number.  Otherwise the user would be
941           // required to specify the correct version for
942           // __wrap_malloc.
943           version = NULL;
944           version_key = 0;
945           name = wrap_name;
946         }
947     }
948
949   Symbol* const snull = NULL;
950   std::pair<typename Symbol_table_type::iterator, bool> ins =
951     this->table_.insert(std::make_pair(std::make_pair(name_key, version_key),
952                                        snull));
953
954   std::pair<typename Symbol_table_type::iterator, bool> insdefault =
955     std::make_pair(this->table_.end(), false);
956   if (is_default_version)
957     {
958       const Stringpool::Key vnull_key = 0;
959       insdefault = this->table_.insert(std::make_pair(std::make_pair(name_key,
960                                                                      vnull_key),
961                                                       snull));
962     }
963
964   // ins.first: an iterator, which is a pointer to a pair.
965   // ins.first->first: the key (a pair of name and version).
966   // ins.first->second: the value (Symbol*).
967   // ins.second: true if new entry was inserted, false if not.
968
969   Sized_symbol<size>* ret;
970   bool was_undefined;
971   bool was_common;
972   if (!ins.second)
973     {
974       // We already have an entry for NAME/VERSION.
975       ret = this->get_sized_symbol<size>(ins.first->second);
976       gold_assert(ret != NULL);
977
978       was_undefined = ret->is_undefined();
979       was_common = ret->is_common();
980
981       this->resolve(ret, sym, st_shndx, is_ordinary, orig_st_shndx, object,
982                     version);
983       if (parameters->options().gc_sections())
984         this->gc_mark_dyn_syms(ret);
985
986       if (is_default_version)
987         this->define_default_version<size, big_endian>(ret, insdefault.second,
988                                                        insdefault.first);
989     }
990   else
991     {
992       // This is the first time we have seen NAME/VERSION.
993       gold_assert(ins.first->second == NULL);
994
995       if (is_default_version && !insdefault.second)
996         {
997           // We already have an entry for NAME/NULL.  If we override
998           // it, then change it to NAME/VERSION.
999           ret = this->get_sized_symbol<size>(insdefault.first->second);
1000
1001           was_undefined = ret->is_undefined();
1002           was_common = ret->is_common();
1003
1004           this->resolve(ret, sym, st_shndx, is_ordinary, orig_st_shndx, object,
1005                         version);
1006           if (parameters->options().gc_sections())
1007             this->gc_mark_dyn_syms(ret);
1008           ins.first->second = ret;
1009         }
1010       else
1011         {
1012           was_undefined = false;
1013           was_common = false;
1014
1015           Sized_target<size, big_endian>* target =
1016             parameters->sized_target<size, big_endian>();
1017           if (!target->has_make_symbol())
1018             ret = new Sized_symbol<size>();
1019           else
1020             {
1021               ret = target->make_symbol();
1022               if (ret == NULL)
1023                 {
1024                   // This means that we don't want a symbol table
1025                   // entry after all.
1026                   if (!is_default_version)
1027                     this->table_.erase(ins.first);
1028                   else
1029                     {
1030                       this->table_.erase(insdefault.first);
1031                       // Inserting INSDEFAULT invalidated INS.
1032                       this->table_.erase(std::make_pair(name_key,
1033                                                         version_key));
1034                     }
1035                   return NULL;
1036                 }
1037             }
1038
1039           ret->init_object(name, version, object, sym, st_shndx, is_ordinary);
1040
1041           ins.first->second = ret;
1042           if (is_default_version)
1043             {
1044               // This is the first time we have seen NAME/NULL.  Point
1045               // it at the new entry for NAME/VERSION.
1046               gold_assert(insdefault.second);
1047               insdefault.first->second = ret;
1048             }
1049         }
1050
1051       if (is_default_version)
1052         ret->set_is_default();
1053     }
1054
1055   // Record every time we see a new undefined symbol, to speed up
1056   // archive groups.
1057   if (!was_undefined && ret->is_undefined())
1058     {
1059       ++this->saw_undefined_;
1060       if (parameters->options().has_plugins())
1061         parameters->options().plugins()->new_undefined_symbol(ret);
1062     }
1063
1064   // Keep track of common symbols, to speed up common symbol
1065   // allocation.
1066   if (!was_common && ret->is_common())
1067     {
1068       if (ret->type() == elfcpp::STT_TLS)
1069         this->tls_commons_.push_back(ret);
1070       else if (!is_ordinary
1071                && st_shndx == parameters->target().small_common_shndx())
1072         this->small_commons_.push_back(ret);
1073       else if (!is_ordinary
1074                && st_shndx == parameters->target().large_common_shndx())
1075         this->large_commons_.push_back(ret);
1076       else
1077         this->commons_.push_back(ret);
1078     }
1079
1080   // If we're not doing a relocatable link, then any symbol with
1081   // hidden or internal visibility is local.
1082   if ((ret->visibility() == elfcpp::STV_HIDDEN
1083        || ret->visibility() == elfcpp::STV_INTERNAL)
1084       && (ret->binding() == elfcpp::STB_GLOBAL
1085           || ret->binding() == elfcpp::STB_GNU_UNIQUE
1086           || ret->binding() == elfcpp::STB_WEAK)
1087       && !parameters->options().relocatable())
1088     this->force_local(ret);
1089
1090   return ret;
1091 }
1092
1093 // Add all the symbols in a relocatable object to the hash table.
1094
1095 template<int size, bool big_endian>
1096 void
1097 Symbol_table::add_from_relobj(
1098     Sized_relobj_file<size, big_endian>* relobj,
1099     const unsigned char* syms,
1100     size_t count,
1101     size_t symndx_offset,
1102     const char* sym_names,
1103     size_t sym_name_size,
1104     typename Sized_relobj_file<size, big_endian>::Symbols* sympointers,
1105     size_t* defined)
1106 {
1107   *defined = 0;
1108
1109   gold_assert(size == parameters->target().get_size());
1110
1111   const int sym_size = elfcpp::Elf_sizes<size>::sym_size;
1112
1113   const bool just_symbols = relobj->just_symbols();
1114
1115   const unsigned char* p = syms;
1116   for (size_t i = 0; i < count; ++i, p += sym_size)
1117     {
1118       (*sympointers)[i] = NULL;
1119
1120       elfcpp::Sym<size, big_endian> sym(p);
1121
1122       unsigned int st_name = sym.get_st_name();
1123       if (st_name >= sym_name_size)
1124         {
1125           relobj->error(_("bad global symbol name offset %u at %zu"),
1126                         st_name, i);
1127           continue;
1128         }
1129
1130       const char* name = sym_names + st_name;
1131
1132       bool is_ordinary;
1133       unsigned int st_shndx = relobj->adjust_sym_shndx(i + symndx_offset,
1134                                                        sym.get_st_shndx(),
1135                                                        &is_ordinary);
1136       unsigned int orig_st_shndx = st_shndx;
1137       if (!is_ordinary)
1138         orig_st_shndx = elfcpp::SHN_UNDEF;
1139
1140       if (st_shndx != elfcpp::SHN_UNDEF)
1141         ++*defined;
1142
1143       // A symbol defined in a section which we are not including must
1144       // be treated as an undefined symbol.
1145       bool is_defined_in_discarded_section = false;
1146       if (st_shndx != elfcpp::SHN_UNDEF
1147           && is_ordinary
1148           && !relobj->is_section_included(st_shndx)
1149           && !this->is_section_folded(relobj, st_shndx))
1150         {
1151           st_shndx = elfcpp::SHN_UNDEF;
1152           is_defined_in_discarded_section = true;
1153         }
1154
1155       // In an object file, an '@' in the name separates the symbol
1156       // name from the version name.  If there are two '@' characters,
1157       // this is the default version.
1158       const char* ver = strchr(name, '@');
1159       Stringpool::Key ver_key = 0;
1160       int namelen = 0;
1161       // IS_DEFAULT_VERSION: is the version default?
1162       // IS_FORCED_LOCAL: is the symbol forced local?
1163       bool is_default_version = false;
1164       bool is_forced_local = false;
1165
1166       // FIXME: For incremental links, we don't store version information,
1167       // so we need to ignore version symbols for now.
1168       if (parameters->incremental_update() && ver != NULL)
1169         {
1170           namelen = ver - name;
1171           ver = NULL;
1172         }
1173
1174       if (ver != NULL)
1175         {
1176           // The symbol name is of the form foo@VERSION or foo@@VERSION
1177           namelen = ver - name;
1178           ++ver;
1179           if (*ver == '@')
1180             {
1181               is_default_version = true;
1182               ++ver;
1183             }
1184           ver = this->namepool_.add(ver, true, &ver_key);
1185         }
1186       // We don't want to assign a version to an undefined symbol,
1187       // even if it is listed in the version script.  FIXME: What
1188       // about a common symbol?
1189       else
1190         {
1191           namelen = strlen(name);
1192           if (!this->version_script_.empty()
1193               && st_shndx != elfcpp::SHN_UNDEF)
1194             {
1195               // The symbol name did not have a version, but the
1196               // version script may assign a version anyway.
1197               std::string version;
1198               bool is_global;
1199               if (this->version_script_.get_symbol_version(name, &version,
1200                                                            &is_global))
1201                 {
1202                   if (!is_global)
1203                     is_forced_local = true;
1204                   else if (!version.empty())
1205                     {
1206                       ver = this->namepool_.add_with_length(version.c_str(),
1207                                                             version.length(),
1208                                                             true,
1209                                                             &ver_key);
1210                       is_default_version = true;
1211                     }
1212                 }
1213             }
1214         }
1215
1216       elfcpp::Sym<size, big_endian>* psym = &sym;
1217       unsigned char symbuf[sym_size];
1218       elfcpp::Sym<size, big_endian> sym2(symbuf);
1219       if (just_symbols)
1220         {
1221           memcpy(symbuf, p, sym_size);
1222           elfcpp::Sym_write<size, big_endian> sw(symbuf);
1223           if (orig_st_shndx != elfcpp::SHN_UNDEF
1224               && is_ordinary
1225               && relobj->e_type() == elfcpp::ET_REL)
1226             {
1227               // Symbol values in relocatable object files are section
1228               // relative.  This is normally what we want, but since here
1229               // we are converting the symbol to absolute we need to add
1230               // the section address.  The section address in an object
1231               // file is normally zero, but people can use a linker
1232               // script to change it.
1233               sw.put_st_value(sym.get_st_value()
1234                               + relobj->section_address(orig_st_shndx));
1235             }
1236           st_shndx = elfcpp::SHN_ABS;
1237           is_ordinary = false;
1238           psym = &sym2;
1239         }
1240
1241       // Fix up visibility if object has no-export set.
1242       if (relobj->no_export()
1243           && (orig_st_shndx != elfcpp::SHN_UNDEF || !is_ordinary))
1244         {
1245           // We may have copied symbol already above.
1246           if (psym != &sym2)
1247             {
1248               memcpy(symbuf, p, sym_size);
1249               psym = &sym2;
1250             }
1251
1252           elfcpp::STV visibility = sym2.get_st_visibility();
1253           if (visibility == elfcpp::STV_DEFAULT
1254               || visibility == elfcpp::STV_PROTECTED)
1255             {
1256               elfcpp::Sym_write<size, big_endian> sw(symbuf);
1257               unsigned char nonvis = sym2.get_st_nonvis();
1258               sw.put_st_other(elfcpp::STV_HIDDEN, nonvis);
1259             }
1260         }
1261
1262       Stringpool::Key name_key;
1263       name = this->namepool_.add_with_length(name, namelen, true,
1264                                              &name_key);
1265
1266       Sized_symbol<size>* res;
1267       res = this->add_from_object(relobj, name, name_key, ver, ver_key,
1268                                   is_default_version, *psym, st_shndx,
1269                                   is_ordinary, orig_st_shndx);
1270       
1271       if (is_forced_local)
1272         this->force_local(res);
1273
1274       // Do not treat this symbol as garbage if this symbol will be
1275       // exported to the dynamic symbol table.  This is true when
1276       // building a shared library or using --export-dynamic and
1277       // the symbol is externally visible.
1278       if (parameters->options().gc_sections()
1279           && res->is_externally_visible()
1280           && !res->is_from_dynobj()
1281           && (parameters->options().shared()
1282               || parameters->options().export_dynamic()))
1283         this->gc_mark_symbol(res);
1284
1285       if (is_defined_in_discarded_section)
1286         res->set_is_defined_in_discarded_section();
1287
1288       (*sympointers)[i] = res;
1289     }
1290 }
1291
1292 // Add a symbol from a plugin-claimed file.
1293
1294 template<int size, bool big_endian>
1295 Symbol*
1296 Symbol_table::add_from_pluginobj(
1297     Sized_pluginobj<size, big_endian>* obj,
1298     const char* name,
1299     const char* ver,
1300     elfcpp::Sym<size, big_endian>* sym)
1301 {
1302   unsigned int st_shndx = sym->get_st_shndx();
1303   bool is_ordinary = st_shndx < elfcpp::SHN_LORESERVE;
1304
1305   Stringpool::Key ver_key = 0;
1306   bool is_default_version = false;
1307   bool is_forced_local = false;
1308
1309   if (ver != NULL)
1310     {
1311       ver = this->namepool_.add(ver, true, &ver_key);
1312     }
1313   // We don't want to assign a version to an undefined symbol,
1314   // even if it is listed in the version script.  FIXME: What
1315   // about a common symbol?
1316   else
1317     {
1318       if (!this->version_script_.empty()
1319           && st_shndx != elfcpp::SHN_UNDEF)
1320         {
1321           // The symbol name did not have a version, but the
1322           // version script may assign a version anyway.
1323           std::string version;
1324           bool is_global;
1325           if (this->version_script_.get_symbol_version(name, &version,
1326                                                        &is_global))
1327             {
1328               if (!is_global)
1329                 is_forced_local = true;
1330               else if (!version.empty())
1331                 {
1332                   ver = this->namepool_.add_with_length(version.c_str(),
1333                                                         version.length(),
1334                                                         true,
1335                                                         &ver_key);
1336                   is_default_version = true;
1337                 }
1338             }
1339         }
1340     }
1341
1342   Stringpool::Key name_key;
1343   name = this->namepool_.add(name, true, &name_key);
1344
1345   Sized_symbol<size>* res;
1346   res = this->add_from_object(obj, name, name_key, ver, ver_key,
1347                               is_default_version, *sym, st_shndx,
1348                               is_ordinary, st_shndx);
1349
1350   if (is_forced_local)
1351     this->force_local(res);
1352
1353   return res;
1354 }
1355
1356 // Add all the symbols in a dynamic object to the hash table.
1357
1358 template<int size, bool big_endian>
1359 void
1360 Symbol_table::add_from_dynobj(
1361     Sized_dynobj<size, big_endian>* dynobj,
1362     const unsigned char* syms,
1363     size_t count,
1364     const char* sym_names,
1365     size_t sym_name_size,
1366     const unsigned char* versym,
1367     size_t versym_size,
1368     const std::vector<const char*>* version_map,
1369     typename Sized_relobj_file<size, big_endian>::Symbols* sympointers,
1370     size_t* defined)
1371 {
1372   *defined = 0;
1373
1374   gold_assert(size == parameters->target().get_size());
1375
1376   if (dynobj->just_symbols())
1377     {
1378       gold_error(_("--just-symbols does not make sense with a shared object"));
1379       return;
1380     }
1381
1382   // FIXME: For incremental links, we don't store version information,
1383   // so we need to ignore version symbols for now.
1384   if (parameters->incremental_update())
1385     versym = NULL;
1386
1387   if (versym != NULL && versym_size / 2 < count)
1388     {
1389       dynobj->error(_("too few symbol versions"));
1390       return;
1391     }
1392
1393   const int sym_size = elfcpp::Elf_sizes<size>::sym_size;
1394
1395   // We keep a list of all STT_OBJECT symbols, so that we can resolve
1396   // weak aliases.  This is necessary because if the dynamic object
1397   // provides the same variable under two names, one of which is a
1398   // weak definition, and the regular object refers to the weak
1399   // definition, we have to put both the weak definition and the
1400   // strong definition into the dynamic symbol table.  Given a weak
1401   // definition, the only way that we can find the corresponding
1402   // strong definition, if any, is to search the symbol table.
1403   std::vector<Sized_symbol<size>*> object_symbols;
1404
1405   const unsigned char* p = syms;
1406   const unsigned char* vs = versym;
1407   for (size_t i = 0; i < count; ++i, p += sym_size, vs += 2)
1408     {
1409       elfcpp::Sym<size, big_endian> sym(p);
1410
1411       if (sympointers != NULL)
1412         (*sympointers)[i] = NULL;
1413
1414       // Ignore symbols with local binding or that have
1415       // internal or hidden visibility.
1416       if (sym.get_st_bind() == elfcpp::STB_LOCAL
1417           || sym.get_st_visibility() == elfcpp::STV_INTERNAL
1418           || sym.get_st_visibility() == elfcpp::STV_HIDDEN)
1419         continue;
1420
1421       // A protected symbol in a shared library must be treated as a
1422       // normal symbol when viewed from outside the shared library.
1423       // Implement this by overriding the visibility here.
1424       elfcpp::Sym<size, big_endian>* psym = &sym;
1425       unsigned char symbuf[sym_size];
1426       elfcpp::Sym<size, big_endian> sym2(symbuf);
1427       if (sym.get_st_visibility() == elfcpp::STV_PROTECTED)
1428         {
1429           memcpy(symbuf, p, sym_size);
1430           elfcpp::Sym_write<size, big_endian> sw(symbuf);
1431           sw.put_st_other(elfcpp::STV_DEFAULT, sym.get_st_nonvis());
1432           psym = &sym2;
1433         }
1434
1435       unsigned int st_name = psym->get_st_name();
1436       if (st_name >= sym_name_size)
1437         {
1438           dynobj->error(_("bad symbol name offset %u at %zu"),
1439                         st_name, i);
1440           continue;
1441         }
1442
1443       const char* name = sym_names + st_name;
1444
1445       bool is_ordinary;
1446       unsigned int st_shndx = dynobj->adjust_sym_shndx(i, psym->get_st_shndx(),
1447                                                        &is_ordinary);
1448
1449       if (st_shndx != elfcpp::SHN_UNDEF)
1450         ++*defined;
1451
1452       Sized_symbol<size>* res;
1453
1454       if (versym == NULL)
1455         {
1456           Stringpool::Key name_key;
1457           name = this->namepool_.add(name, true, &name_key);
1458           res = this->add_from_object(dynobj, name, name_key, NULL, 0,
1459                                       false, *psym, st_shndx, is_ordinary,
1460                                       st_shndx);
1461         }
1462       else
1463         {
1464           // Read the version information.
1465
1466           unsigned int v = elfcpp::Swap<16, big_endian>::readval(vs);
1467
1468           bool hidden = (v & elfcpp::VERSYM_HIDDEN) != 0;
1469           v &= elfcpp::VERSYM_VERSION;
1470
1471           // The Sun documentation says that V can be VER_NDX_LOCAL,
1472           // or VER_NDX_GLOBAL, or a version index.  The meaning of
1473           // VER_NDX_LOCAL is defined as "Symbol has local scope."
1474           // The old GNU linker will happily generate VER_NDX_LOCAL
1475           // for an undefined symbol.  I don't know what the Sun
1476           // linker will generate.
1477
1478           if (v == static_cast<unsigned int>(elfcpp::VER_NDX_LOCAL)
1479               && st_shndx != elfcpp::SHN_UNDEF)
1480             {
1481               // This symbol should not be visible outside the object.
1482               continue;
1483             }
1484
1485           // At this point we are definitely going to add this symbol.
1486           Stringpool::Key name_key;
1487           name = this->namepool_.add(name, true, &name_key);
1488
1489           if (v == static_cast<unsigned int>(elfcpp::VER_NDX_LOCAL)
1490               || v == static_cast<unsigned int>(elfcpp::VER_NDX_GLOBAL))
1491             {
1492               // This symbol does not have a version.
1493               res = this->add_from_object(dynobj, name, name_key, NULL, 0,
1494                                           false, *psym, st_shndx, is_ordinary,
1495                                           st_shndx);
1496             }
1497           else
1498             {
1499               if (v >= version_map->size())
1500                 {
1501                   dynobj->error(_("versym for symbol %zu out of range: %u"),
1502                                 i, v);
1503                   continue;
1504                 }
1505
1506               const char* version = (*version_map)[v];
1507               if (version == NULL)
1508                 {
1509                   dynobj->error(_("versym for symbol %zu has no name: %u"),
1510                                 i, v);
1511                   continue;
1512                 }
1513
1514               Stringpool::Key version_key;
1515               version = this->namepool_.add(version, true, &version_key);
1516
1517               // If this is an absolute symbol, and the version name
1518               // and symbol name are the same, then this is the
1519               // version definition symbol.  These symbols exist to
1520               // support using -u to pull in particular versions.  We
1521               // do not want to record a version for them.
1522               if (st_shndx == elfcpp::SHN_ABS
1523                   && !is_ordinary
1524                   && name_key == version_key)
1525                 res = this->add_from_object(dynobj, name, name_key, NULL, 0,
1526                                             false, *psym, st_shndx, is_ordinary,
1527                                             st_shndx);
1528               else
1529                 {
1530                   const bool is_default_version =
1531                     !hidden && st_shndx != elfcpp::SHN_UNDEF;
1532                   res = this->add_from_object(dynobj, name, name_key, version,
1533                                               version_key, is_default_version,
1534                                               *psym, st_shndx,
1535                                               is_ordinary, st_shndx);
1536                 }
1537             }
1538         }
1539
1540       // Note that it is possible that RES was overridden by an
1541       // earlier object, in which case it can't be aliased here.
1542       if (st_shndx != elfcpp::SHN_UNDEF
1543           && is_ordinary
1544           && psym->get_st_type() == elfcpp::STT_OBJECT
1545           && res->source() == Symbol::FROM_OBJECT
1546           && res->object() == dynobj)
1547         object_symbols.push_back(res);
1548
1549       if (sympointers != NULL)
1550         (*sympointers)[i] = res;
1551     }
1552
1553   this->record_weak_aliases(&object_symbols);
1554 }
1555
1556 // Add a symbol from a incremental object file.
1557
1558 template<int size, bool big_endian>
1559 Sized_symbol<size>*
1560 Symbol_table::add_from_incrobj(
1561     Object* obj,
1562     const char* name,
1563     const char* ver,
1564     elfcpp::Sym<size, big_endian>* sym)
1565 {
1566   unsigned int st_shndx = sym->get_st_shndx();
1567   bool is_ordinary = st_shndx < elfcpp::SHN_LORESERVE;
1568
1569   Stringpool::Key ver_key = 0;
1570   bool is_default_version = false;
1571   bool is_forced_local = false;
1572
1573   Stringpool::Key name_key;
1574   name = this->namepool_.add(name, true, &name_key);
1575
1576   Sized_symbol<size>* res;
1577   res = this->add_from_object(obj, name, name_key, ver, ver_key,
1578                               is_default_version, *sym, st_shndx,
1579                               is_ordinary, st_shndx);
1580
1581   if (is_forced_local)
1582     this->force_local(res);
1583
1584   return res;
1585 }
1586
1587 // This is used to sort weak aliases.  We sort them first by section
1588 // index, then by offset, then by weak ahead of strong.
1589
1590 template<int size>
1591 class Weak_alias_sorter
1592 {
1593  public:
1594   bool operator()(const Sized_symbol<size>*, const Sized_symbol<size>*) const;
1595 };
1596
1597 template<int size>
1598 bool
1599 Weak_alias_sorter<size>::operator()(const Sized_symbol<size>* s1,
1600                                     const Sized_symbol<size>* s2) const
1601 {
1602   bool is_ordinary;
1603   unsigned int s1_shndx = s1->shndx(&is_ordinary);
1604   gold_assert(is_ordinary);
1605   unsigned int s2_shndx = s2->shndx(&is_ordinary);
1606   gold_assert(is_ordinary);
1607   if (s1_shndx != s2_shndx)
1608     return s1_shndx < s2_shndx;
1609
1610   if (s1->value() != s2->value())
1611     return s1->value() < s2->value();
1612   if (s1->binding() != s2->binding())
1613     {
1614       if (s1->binding() == elfcpp::STB_WEAK)
1615         return true;
1616       if (s2->binding() == elfcpp::STB_WEAK)
1617         return false;
1618     }
1619   return std::string(s1->name()) < std::string(s2->name());
1620 }
1621
1622 // SYMBOLS is a list of object symbols from a dynamic object.  Look
1623 // for any weak aliases, and record them so that if we add the weak
1624 // alias to the dynamic symbol table, we also add the corresponding
1625 // strong symbol.
1626
1627 template<int size>
1628 void
1629 Symbol_table::record_weak_aliases(std::vector<Sized_symbol<size>*>* symbols)
1630 {
1631   // Sort the vector by section index, then by offset, then by weak
1632   // ahead of strong.
1633   std::sort(symbols->begin(), symbols->end(), Weak_alias_sorter<size>());
1634
1635   // Walk through the vector.  For each weak definition, record
1636   // aliases.
1637   for (typename std::vector<Sized_symbol<size>*>::const_iterator p =
1638          symbols->begin();
1639        p != symbols->end();
1640        ++p)
1641     {
1642       if ((*p)->binding() != elfcpp::STB_WEAK)
1643         continue;
1644
1645       // Build a circular list of weak aliases.  Each symbol points to
1646       // the next one in the circular list.
1647
1648       Sized_symbol<size>* from_sym = *p;
1649       typename std::vector<Sized_symbol<size>*>::const_iterator q;
1650       for (q = p + 1; q != symbols->end(); ++q)
1651         {
1652           bool dummy;
1653           if ((*q)->shndx(&dummy) != from_sym->shndx(&dummy)
1654               || (*q)->value() != from_sym->value())
1655             break;
1656
1657           this->weak_aliases_[from_sym] = *q;
1658           from_sym->set_has_alias();
1659           from_sym = *q;
1660         }
1661
1662       if (from_sym != *p)
1663         {
1664           this->weak_aliases_[from_sym] = *p;
1665           from_sym->set_has_alias();
1666         }
1667
1668       p = q - 1;
1669     }
1670 }
1671
1672 // Create and return a specially defined symbol.  If ONLY_IF_REF is
1673 // true, then only create the symbol if there is a reference to it.
1674 // If this does not return NULL, it sets *POLDSYM to the existing
1675 // symbol if there is one.  This sets *RESOLVE_OLDSYM if we should
1676 // resolve the newly created symbol to the old one.  This
1677 // canonicalizes *PNAME and *PVERSION.
1678
1679 template<int size, bool big_endian>
1680 Sized_symbol<size>*
1681 Symbol_table::define_special_symbol(const char** pname, const char** pversion,
1682                                     bool only_if_ref,
1683                                     Sized_symbol<size>** poldsym,
1684                                     bool* resolve_oldsym)
1685 {
1686   *resolve_oldsym = false;
1687   *poldsym = NULL;
1688
1689   // If the caller didn't give us a version, see if we get one from
1690   // the version script.
1691   std::string v;
1692   bool is_default_version = false;
1693   if (*pversion == NULL)
1694     {
1695       bool is_global;
1696       if (this->version_script_.get_symbol_version(*pname, &v, &is_global))
1697         {
1698           if (is_global && !v.empty())
1699             {
1700               *pversion = v.c_str();
1701               // If we get the version from a version script, then we
1702               // are also the default version.
1703               is_default_version = true;
1704             }
1705         }
1706     }
1707
1708   Symbol* oldsym;
1709   Sized_symbol<size>* sym;
1710
1711   bool add_to_table = false;
1712   typename Symbol_table_type::iterator add_loc = this->table_.end();
1713   bool add_def_to_table = false;
1714   typename Symbol_table_type::iterator add_def_loc = this->table_.end();
1715
1716   if (only_if_ref)
1717     {
1718       oldsym = this->lookup(*pname, *pversion);
1719       if (oldsym == NULL && is_default_version)
1720         oldsym = this->lookup(*pname, NULL);
1721       if (oldsym == NULL || !oldsym->is_undefined())
1722         return NULL;
1723
1724       *pname = oldsym->name();
1725       if (is_default_version)
1726         *pversion = this->namepool_.add(*pversion, true, NULL);
1727       else
1728         *pversion = oldsym->version();
1729     }
1730   else
1731     {
1732       // Canonicalize NAME and VERSION.
1733       Stringpool::Key name_key;
1734       *pname = this->namepool_.add(*pname, true, &name_key);
1735
1736       Stringpool::Key version_key = 0;
1737       if (*pversion != NULL)
1738         *pversion = this->namepool_.add(*pversion, true, &version_key);
1739
1740       Symbol* const snull = NULL;
1741       std::pair<typename Symbol_table_type::iterator, bool> ins =
1742         this->table_.insert(std::make_pair(std::make_pair(name_key,
1743                                                           version_key),
1744                                            snull));
1745
1746       std::pair<typename Symbol_table_type::iterator, bool> insdefault =
1747         std::make_pair(this->table_.end(), false);
1748       if (is_default_version)
1749         {
1750           const Stringpool::Key vnull = 0;
1751           insdefault =
1752             this->table_.insert(std::make_pair(std::make_pair(name_key,
1753                                                               vnull),
1754                                                snull));
1755         }
1756
1757       if (!ins.second)
1758         {
1759           // We already have a symbol table entry for NAME/VERSION.
1760           oldsym = ins.first->second;
1761           gold_assert(oldsym != NULL);
1762
1763           if (is_default_version)
1764             {
1765               Sized_symbol<size>* soldsym =
1766                 this->get_sized_symbol<size>(oldsym);
1767               this->define_default_version<size, big_endian>(soldsym,
1768                                                              insdefault.second,
1769                                                              insdefault.first);
1770             }
1771         }
1772       else
1773         {
1774           // We haven't seen this symbol before.
1775           gold_assert(ins.first->second == NULL);
1776
1777           add_to_table = true;
1778           add_loc = ins.first;
1779
1780           if (is_default_version && !insdefault.second)
1781             {
1782               // We are adding NAME/VERSION, and it is the default
1783               // version.  We already have an entry for NAME/NULL.
1784               oldsym = insdefault.first->second;
1785               *resolve_oldsym = true;
1786             }
1787           else
1788             {
1789               oldsym = NULL;
1790
1791               if (is_default_version)
1792                 {
1793                   add_def_to_table = true;
1794                   add_def_loc = insdefault.first;
1795                 }
1796             }
1797         }
1798     }
1799
1800   const Target& target = parameters->target();
1801   if (!target.has_make_symbol())
1802     sym = new Sized_symbol<size>();
1803   else
1804     {
1805       Sized_target<size, big_endian>* sized_target =
1806         parameters->sized_target<size, big_endian>();
1807       sym = sized_target->make_symbol();
1808       if (sym == NULL)
1809         return NULL;
1810     }
1811
1812   if (add_to_table)
1813     add_loc->second = sym;
1814   else
1815     gold_assert(oldsym != NULL);
1816
1817   if (add_def_to_table)
1818     add_def_loc->second = sym;
1819
1820   *poldsym = this->get_sized_symbol<size>(oldsym);
1821
1822   return sym;
1823 }
1824
1825 // Define a symbol based on an Output_data.
1826
1827 Symbol*
1828 Symbol_table::define_in_output_data(const char* name,
1829                                     const char* version,
1830                                     Defined defined,
1831                                     Output_data* od,
1832                                     uint64_t value,
1833                                     uint64_t symsize,
1834                                     elfcpp::STT type,
1835                                     elfcpp::STB binding,
1836                                     elfcpp::STV visibility,
1837                                     unsigned char nonvis,
1838                                     bool offset_is_from_end,
1839                                     bool only_if_ref)
1840 {
1841   if (parameters->target().get_size() == 32)
1842     {
1843 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
1844       return this->do_define_in_output_data<32>(name, version, defined, od,
1845                                                 value, symsize, type, binding,
1846                                                 visibility, nonvis,
1847                                                 offset_is_from_end,
1848                                                 only_if_ref);
1849 #else
1850       gold_unreachable();
1851 #endif
1852     }
1853   else if (parameters->target().get_size() == 64)
1854     {
1855 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
1856       return this->do_define_in_output_data<64>(name, version, defined, od,
1857                                                 value, symsize, type, binding,
1858                                                 visibility, nonvis,
1859                                                 offset_is_from_end,
1860                                                 only_if_ref);
1861 #else
1862       gold_unreachable();
1863 #endif
1864     }
1865   else
1866     gold_unreachable();
1867 }
1868
1869 // Define a symbol in an Output_data, sized version.
1870
1871 template<int size>
1872 Sized_symbol<size>*
1873 Symbol_table::do_define_in_output_data(
1874     const char* name,
1875     const char* version,
1876     Defined defined,
1877     Output_data* od,
1878     typename elfcpp::Elf_types<size>::Elf_Addr value,
1879     typename elfcpp::Elf_types<size>::Elf_WXword symsize,
1880     elfcpp::STT type,
1881     elfcpp::STB binding,
1882     elfcpp::STV visibility,
1883     unsigned char nonvis,
1884     bool offset_is_from_end,
1885     bool only_if_ref)
1886 {
1887   Sized_symbol<size>* sym;
1888   Sized_symbol<size>* oldsym;
1889   bool resolve_oldsym;
1890
1891   if (parameters->target().is_big_endian())
1892     {
1893 #if defined(HAVE_TARGET_32_BIG) || defined(HAVE_TARGET_64_BIG)
1894       sym = this->define_special_symbol<size, true>(&name, &version,
1895                                                     only_if_ref, &oldsym,
1896                                                     &resolve_oldsym);
1897 #else
1898       gold_unreachable();
1899 #endif
1900     }
1901   else
1902     {
1903 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_64_LITTLE)
1904       sym = this->define_special_symbol<size, false>(&name, &version,
1905                                                      only_if_ref, &oldsym,
1906                                                      &resolve_oldsym);
1907 #else
1908       gold_unreachable();
1909 #endif
1910     }
1911
1912   if (sym == NULL)
1913     return NULL;
1914
1915   sym->init_output_data(name, version, od, value, symsize, type, binding,
1916                         visibility, nonvis, offset_is_from_end,
1917                         defined == PREDEFINED);
1918
1919   if (oldsym == NULL)
1920     {
1921       if (binding == elfcpp::STB_LOCAL
1922           || this->version_script_.symbol_is_local(name))
1923         this->force_local(sym);
1924       else if (version != NULL)
1925         sym->set_is_default();
1926       return sym;
1927     }
1928
1929   if (Symbol_table::should_override_with_special(oldsym, type, defined))
1930     this->override_with_special(oldsym, sym);
1931
1932   if (resolve_oldsym)
1933     return sym;
1934   else
1935     {
1936       delete sym;
1937       return oldsym;
1938     }
1939 }
1940
1941 // Define a symbol based on an Output_segment.
1942
1943 Symbol*
1944 Symbol_table::define_in_output_segment(const char* name,
1945                                        const char* version,
1946                                        Defined defined,
1947                                        Output_segment* os,
1948                                        uint64_t value,
1949                                        uint64_t symsize,
1950                                        elfcpp::STT type,
1951                                        elfcpp::STB binding,
1952                                        elfcpp::STV visibility,
1953                                        unsigned char nonvis,
1954                                        Symbol::Segment_offset_base offset_base,
1955                                        bool only_if_ref)
1956 {
1957   if (parameters->target().get_size() == 32)
1958     {
1959 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
1960       return this->do_define_in_output_segment<32>(name, version, defined, os,
1961                                                    value, symsize, type,
1962                                                    binding, visibility, nonvis,
1963                                                    offset_base, only_if_ref);
1964 #else
1965       gold_unreachable();
1966 #endif
1967     }
1968   else if (parameters->target().get_size() == 64)
1969     {
1970 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
1971       return this->do_define_in_output_segment<64>(name, version, defined, os,
1972                                                    value, symsize, type,
1973                                                    binding, visibility, nonvis,
1974                                                    offset_base, only_if_ref);
1975 #else
1976       gold_unreachable();
1977 #endif
1978     }
1979   else
1980     gold_unreachable();
1981 }
1982
1983 // Define a symbol in an Output_segment, sized version.
1984
1985 template<int size>
1986 Sized_symbol<size>*
1987 Symbol_table::do_define_in_output_segment(
1988     const char* name,
1989     const char* version,
1990     Defined defined,
1991     Output_segment* os,
1992     typename elfcpp::Elf_types<size>::Elf_Addr value,
1993     typename elfcpp::Elf_types<size>::Elf_WXword symsize,
1994     elfcpp::STT type,
1995     elfcpp::STB binding,
1996     elfcpp::STV visibility,
1997     unsigned char nonvis,
1998     Symbol::Segment_offset_base offset_base,
1999     bool only_if_ref)
2000 {
2001   Sized_symbol<size>* sym;
2002   Sized_symbol<size>* oldsym;
2003   bool resolve_oldsym;
2004
2005   if (parameters->target().is_big_endian())
2006     {
2007 #if defined(HAVE_TARGET_32_BIG) || defined(HAVE_TARGET_64_BIG)
2008       sym = this->define_special_symbol<size, true>(&name, &version,
2009                                                     only_if_ref, &oldsym,
2010                                                     &resolve_oldsym);
2011 #else
2012       gold_unreachable();
2013 #endif
2014     }
2015   else
2016     {
2017 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_64_LITTLE)
2018       sym = this->define_special_symbol<size, false>(&name, &version,
2019                                                      only_if_ref, &oldsym,
2020                                                      &resolve_oldsym);
2021 #else
2022       gold_unreachable();
2023 #endif
2024     }
2025
2026   if (sym == NULL)
2027     return NULL;
2028
2029   sym->init_output_segment(name, version, os, value, symsize, type, binding,
2030                            visibility, nonvis, offset_base,
2031                            defined == PREDEFINED);
2032
2033   if (oldsym == NULL)
2034     {
2035       if (binding == elfcpp::STB_LOCAL
2036           || this->version_script_.symbol_is_local(name))
2037         this->force_local(sym);
2038       else if (version != NULL)
2039         sym->set_is_default();
2040       return sym;
2041     }
2042
2043   if (Symbol_table::should_override_with_special(oldsym, type, defined))
2044     this->override_with_special(oldsym, sym);
2045
2046   if (resolve_oldsym)
2047     return sym;
2048   else
2049     {
2050       delete sym;
2051       return oldsym;
2052     }
2053 }
2054
2055 // Define a special symbol with a constant value.  It is a multiple
2056 // definition error if this symbol is already defined.
2057
2058 Symbol*
2059 Symbol_table::define_as_constant(const char* name,
2060                                  const char* version,
2061                                  Defined defined,
2062                                  uint64_t value,
2063                                  uint64_t symsize,
2064                                  elfcpp::STT type,
2065                                  elfcpp::STB binding,
2066                                  elfcpp::STV visibility,
2067                                  unsigned char nonvis,
2068                                  bool only_if_ref,
2069                                  bool force_override)
2070 {
2071   if (parameters->target().get_size() == 32)
2072     {
2073 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
2074       return this->do_define_as_constant<32>(name, version, defined, value,
2075                                              symsize, type, binding,
2076                                              visibility, nonvis, only_if_ref,
2077                                              force_override);
2078 #else
2079       gold_unreachable();
2080 #endif
2081     }
2082   else if (parameters->target().get_size() == 64)
2083     {
2084 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
2085       return this->do_define_as_constant<64>(name, version, defined, value,
2086                                              symsize, type, binding,
2087                                              visibility, nonvis, only_if_ref,
2088                                              force_override);
2089 #else
2090       gold_unreachable();
2091 #endif
2092     }
2093   else
2094     gold_unreachable();
2095 }
2096
2097 // Define a symbol as a constant, sized version.
2098
2099 template<int size>
2100 Sized_symbol<size>*
2101 Symbol_table::do_define_as_constant(
2102     const char* name,
2103     const char* version,
2104     Defined defined,
2105     typename elfcpp::Elf_types<size>::Elf_Addr value,
2106     typename elfcpp::Elf_types<size>::Elf_WXword symsize,
2107     elfcpp::STT type,
2108     elfcpp::STB binding,
2109     elfcpp::STV visibility,
2110     unsigned char nonvis,
2111     bool only_if_ref,
2112     bool force_override)
2113 {
2114   Sized_symbol<size>* sym;
2115   Sized_symbol<size>* oldsym;
2116   bool resolve_oldsym;
2117
2118   if (parameters->target().is_big_endian())
2119     {
2120 #if defined(HAVE_TARGET_32_BIG) || defined(HAVE_TARGET_64_BIG)
2121       sym = this->define_special_symbol<size, true>(&name, &version,
2122                                                     only_if_ref, &oldsym,
2123                                                     &resolve_oldsym);
2124 #else
2125       gold_unreachable();
2126 #endif
2127     }
2128   else
2129     {
2130 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_64_LITTLE)
2131       sym = this->define_special_symbol<size, false>(&name, &version,
2132                                                      only_if_ref, &oldsym,
2133                                                      &resolve_oldsym);
2134 #else
2135       gold_unreachable();
2136 #endif
2137     }
2138
2139   if (sym == NULL)
2140     return NULL;
2141
2142   sym->init_constant(name, version, value, symsize, type, binding, visibility,
2143                      nonvis, defined == PREDEFINED);
2144
2145   if (oldsym == NULL)
2146     {
2147       // Version symbols are absolute symbols with name == version.
2148       // We don't want to force them to be local.
2149       if ((version == NULL
2150            || name != version
2151            || value != 0)
2152           && (binding == elfcpp::STB_LOCAL
2153               || this->version_script_.symbol_is_local(name)))
2154         this->force_local(sym);
2155       else if (version != NULL
2156                && (name != version || value != 0))
2157         sym->set_is_default();
2158       return sym;
2159     }
2160
2161   if (force_override
2162       || Symbol_table::should_override_with_special(oldsym, type, defined))
2163     this->override_with_special(oldsym, sym);
2164
2165   if (resolve_oldsym)
2166     return sym;
2167   else
2168     {
2169       delete sym;
2170       return oldsym;
2171     }
2172 }
2173
2174 // Define a set of symbols in output sections.
2175
2176 void
2177 Symbol_table::define_symbols(const Layout* layout, int count,
2178                              const Define_symbol_in_section* p,
2179                              bool only_if_ref)
2180 {
2181   for (int i = 0; i < count; ++i, ++p)
2182     {
2183       Output_section* os = layout->find_output_section(p->output_section);
2184       if (os != NULL)
2185         this->define_in_output_data(p->name, NULL, PREDEFINED, os, p->value,
2186                                     p->size, p->type, p->binding,
2187                                     p->visibility, p->nonvis,
2188                                     p->offset_is_from_end,
2189                                     only_if_ref || p->only_if_ref);
2190       else
2191         this->define_as_constant(p->name, NULL, PREDEFINED, 0, p->size,
2192                                  p->type, p->binding, p->visibility, p->nonvis,
2193                                  only_if_ref || p->only_if_ref,
2194                                  false);
2195     }
2196 }
2197
2198 // Define a set of symbols in output segments.
2199
2200 void
2201 Symbol_table::define_symbols(const Layout* layout, int count,
2202                              const Define_symbol_in_segment* p,
2203                              bool only_if_ref)
2204 {
2205   for (int i = 0; i < count; ++i, ++p)
2206     {
2207       Output_segment* os = layout->find_output_segment(p->segment_type,
2208                                                        p->segment_flags_set,
2209                                                        p->segment_flags_clear);
2210       if (os != NULL)
2211         this->define_in_output_segment(p->name, NULL, PREDEFINED, os, p->value,
2212                                        p->size, p->type, p->binding,
2213                                        p->visibility, p->nonvis,
2214                                        p->offset_base,
2215                                        only_if_ref || p->only_if_ref);
2216       else
2217         this->define_as_constant(p->name, NULL, PREDEFINED, 0, p->size,
2218                                  p->type, p->binding, p->visibility, p->nonvis,
2219                                  only_if_ref || p->only_if_ref,
2220                                  false);
2221     }
2222 }
2223
2224 // Define CSYM using a COPY reloc.  POSD is the Output_data where the
2225 // symbol should be defined--typically a .dyn.bss section.  VALUE is
2226 // the offset within POSD.
2227
2228 template<int size>
2229 void
2230 Symbol_table::define_with_copy_reloc(
2231     Sized_symbol<size>* csym,
2232     Output_data* posd,
2233     typename elfcpp::Elf_types<size>::Elf_Addr value)
2234 {
2235   gold_assert(csym->is_from_dynobj());
2236   gold_assert(!csym->is_copied_from_dynobj());
2237   Object* object = csym->object();
2238   gold_assert(object->is_dynamic());
2239   Dynobj* dynobj = static_cast<Dynobj*>(object);
2240
2241   // Our copied variable has to override any variable in a shared
2242   // library.
2243   elfcpp::STB binding = csym->binding();
2244   if (binding == elfcpp::STB_WEAK)
2245     binding = elfcpp::STB_GLOBAL;
2246
2247   this->define_in_output_data(csym->name(), csym->version(), COPY,
2248                               posd, value, csym->symsize(),
2249                               csym->type(), binding,
2250                               csym->visibility(), csym->nonvis(),
2251                               false, false);
2252
2253   csym->set_is_copied_from_dynobj();
2254   csym->set_needs_dynsym_entry();
2255
2256   this->copied_symbol_dynobjs_[csym] = dynobj;
2257
2258   // We have now defined all aliases, but we have not entered them all
2259   // in the copied_symbol_dynobjs_ map.
2260   if (csym->has_alias())
2261     {
2262       Symbol* sym = csym;
2263       while (true)
2264         {
2265           sym = this->weak_aliases_[sym];
2266           if (sym == csym)
2267             break;
2268           gold_assert(sym->output_data() == posd);
2269
2270           sym->set_is_copied_from_dynobj();
2271           this->copied_symbol_dynobjs_[sym] = dynobj;
2272         }
2273     }
2274 }
2275
2276 // SYM is defined using a COPY reloc.  Return the dynamic object where
2277 // the original definition was found.
2278
2279 Dynobj*
2280 Symbol_table::get_copy_source(const Symbol* sym) const
2281 {
2282   gold_assert(sym->is_copied_from_dynobj());
2283   Copied_symbol_dynobjs::const_iterator p =
2284     this->copied_symbol_dynobjs_.find(sym);
2285   gold_assert(p != this->copied_symbol_dynobjs_.end());
2286   return p->second;
2287 }
2288
2289 // Add any undefined symbols named on the command line.
2290
2291 void
2292 Symbol_table::add_undefined_symbols_from_command_line(Layout* layout)
2293 {
2294   if (parameters->options().any_undefined()
2295       || layout->script_options()->any_unreferenced())
2296     {
2297       if (parameters->target().get_size() == 32)
2298         {
2299 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
2300           this->do_add_undefined_symbols_from_command_line<32>(layout);
2301 #else
2302           gold_unreachable();
2303 #endif
2304         }
2305       else if (parameters->target().get_size() == 64)
2306         {
2307 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
2308           this->do_add_undefined_symbols_from_command_line<64>(layout);
2309 #else
2310           gold_unreachable();
2311 #endif
2312         }
2313       else
2314         gold_unreachable();
2315     }
2316 }
2317
2318 template<int size>
2319 void
2320 Symbol_table::do_add_undefined_symbols_from_command_line(Layout* layout)
2321 {
2322   for (options::String_set::const_iterator p =
2323          parameters->options().undefined_begin();
2324        p != parameters->options().undefined_end();
2325        ++p)
2326     this->add_undefined_symbol_from_command_line<size>(p->c_str());
2327
2328   for (options::String_set::const_iterator p =
2329          parameters->options().export_dynamic_symbol_begin();
2330        p != parameters->options().export_dynamic_symbol_end();
2331        ++p)
2332     this->add_undefined_symbol_from_command_line<size>(p->c_str());
2333
2334   for (Script_options::referenced_const_iterator p =
2335          layout->script_options()->referenced_begin();
2336        p != layout->script_options()->referenced_end();
2337        ++p)
2338     this->add_undefined_symbol_from_command_line<size>(p->c_str());
2339 }
2340
2341 template<int size>
2342 void
2343 Symbol_table::add_undefined_symbol_from_command_line(const char* name)
2344 {
2345   if (this->lookup(name) != NULL)
2346     return;
2347
2348   const char* version = NULL;
2349
2350   Sized_symbol<size>* sym;
2351   Sized_symbol<size>* oldsym;
2352   bool resolve_oldsym;
2353   if (parameters->target().is_big_endian())
2354     {
2355 #if defined(HAVE_TARGET_32_BIG) || defined(HAVE_TARGET_64_BIG)
2356       sym = this->define_special_symbol<size, true>(&name, &version,
2357                                                     false, &oldsym,
2358                                                     &resolve_oldsym);
2359 #else
2360       gold_unreachable();
2361 #endif
2362     }
2363   else
2364     {
2365 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_64_LITTLE)
2366       sym = this->define_special_symbol<size, false>(&name, &version,
2367                                                      false, &oldsym,
2368                                                      &resolve_oldsym);
2369 #else
2370       gold_unreachable();
2371 #endif
2372     }
2373
2374   gold_assert(oldsym == NULL);
2375
2376   sym->init_undefined(name, version, elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
2377                       elfcpp::STV_DEFAULT, 0);
2378   ++this->saw_undefined_;
2379 }
2380
2381 // Set the dynamic symbol indexes.  INDEX is the index of the first
2382 // global dynamic symbol.  Pointers to the symbols are stored into the
2383 // vector SYMS.  The names are added to DYNPOOL.  This returns an
2384 // updated dynamic symbol index.
2385
2386 unsigned int
2387 Symbol_table::set_dynsym_indexes(unsigned int index,
2388                                  std::vector<Symbol*>* syms,
2389                                  Stringpool* dynpool,
2390                                  Versions* versions)
2391 {
2392   for (Symbol_table_type::iterator p = this->table_.begin();
2393        p != this->table_.end();
2394        ++p)
2395     {
2396       Symbol* sym = p->second;
2397
2398       // Note that SYM may already have a dynamic symbol index, since
2399       // some symbols appear more than once in the symbol table, with
2400       // and without a version.
2401
2402       if (!sym->should_add_dynsym_entry(this))
2403         sym->set_dynsym_index(-1U);
2404       else if (!sym->has_dynsym_index())
2405         {
2406           sym->set_dynsym_index(index);
2407           ++index;
2408           syms->push_back(sym);
2409           dynpool->add(sym->name(), false, NULL);
2410
2411           // Record any version information.
2412           if (sym->version() != NULL)
2413             versions->record_version(this, dynpool, sym);
2414
2415           // If the symbol is defined in a dynamic object and is
2416           // referenced in a regular object, then mark the dynamic
2417           // object as needed.  This is used to implement --as-needed.
2418           if (sym->is_from_dynobj() && sym->in_reg())
2419             sym->object()->set_is_needed();
2420         }
2421     }
2422
2423   // Finish up the versions.  In some cases this may add new dynamic
2424   // symbols.
2425   index = versions->finalize(this, index, syms);
2426
2427   return index;
2428 }
2429
2430 // Set the final values for all the symbols.  The index of the first
2431 // global symbol in the output file is *PLOCAL_SYMCOUNT.  Record the
2432 // file offset OFF.  Add their names to POOL.  Return the new file
2433 // offset.  Update *PLOCAL_SYMCOUNT if necessary.
2434
2435 off_t
2436 Symbol_table::finalize(off_t off, off_t dynoff, size_t dyn_global_index,
2437                        size_t dyncount, Stringpool* pool,
2438                        unsigned int* plocal_symcount)
2439 {
2440   off_t ret;
2441
2442   gold_assert(*plocal_symcount != 0);
2443   this->first_global_index_ = *plocal_symcount;
2444
2445   this->dynamic_offset_ = dynoff;
2446   this->first_dynamic_global_index_ = dyn_global_index;
2447   this->dynamic_count_ = dyncount;
2448
2449   if (parameters->target().get_size() == 32)
2450     {
2451 #if defined(HAVE_TARGET_32_BIG) || defined(HAVE_TARGET_32_LITTLE)
2452       ret = this->sized_finalize<32>(off, pool, plocal_symcount);
2453 #else
2454       gold_unreachable();
2455 #endif
2456     }
2457   else if (parameters->target().get_size() == 64)
2458     {
2459 #if defined(HAVE_TARGET_64_BIG) || defined(HAVE_TARGET_64_LITTLE)
2460       ret = this->sized_finalize<64>(off, pool, plocal_symcount);
2461 #else
2462       gold_unreachable();
2463 #endif
2464     }
2465   else
2466     gold_unreachable();
2467
2468   // Now that we have the final symbol table, we can reliably note
2469   // which symbols should get warnings.
2470   this->warnings_.note_warnings(this);
2471
2472   return ret;
2473 }
2474
2475 // SYM is going into the symbol table at *PINDEX.  Add the name to
2476 // POOL, update *PINDEX and *POFF.
2477
2478 template<int size>
2479 void
2480 Symbol_table::add_to_final_symtab(Symbol* sym, Stringpool* pool,
2481                                   unsigned int* pindex, off_t* poff)
2482 {
2483   sym->set_symtab_index(*pindex);
2484   if (sym->version() == NULL || !parameters->options().relocatable())
2485     pool->add(sym->name(), false, NULL);
2486   else
2487     pool->add(sym->versioned_name(), true, NULL);
2488   ++*pindex;
2489   *poff += elfcpp::Elf_sizes<size>::sym_size;
2490 }
2491
2492 // Set the final value for all the symbols.  This is called after
2493 // Layout::finalize, so all the output sections have their final
2494 // address.
2495
2496 template<int size>
2497 off_t
2498 Symbol_table::sized_finalize(off_t off, Stringpool* pool,
2499                              unsigned int* plocal_symcount)
2500 {
2501   off = align_address(off, size >> 3);
2502   this->offset_ = off;
2503
2504   unsigned int index = *plocal_symcount;
2505   const unsigned int orig_index = index;
2506
2507   // First do all the symbols which have been forced to be local, as
2508   // they must appear before all global symbols.
2509   for (Forced_locals::iterator p = this->forced_locals_.begin();
2510        p != this->forced_locals_.end();
2511        ++p)
2512     {
2513       Symbol* sym = *p;
2514       gold_assert(sym->is_forced_local());
2515       if (this->sized_finalize_symbol<size>(sym))
2516         {
2517           this->add_to_final_symtab<size>(sym, pool, &index, &off);
2518           ++*plocal_symcount;
2519         }
2520     }
2521
2522   // Now do all the remaining symbols.
2523   for (Symbol_table_type::iterator p = this->table_.begin();
2524        p != this->table_.end();
2525        ++p)
2526     {
2527       Symbol* sym = p->second;
2528       if (this->sized_finalize_symbol<size>(sym))
2529         this->add_to_final_symtab<size>(sym, pool, &index, &off);
2530     }
2531
2532   this->output_count_ = index - orig_index;
2533
2534   return off;
2535 }
2536
2537 // Compute the final value of SYM and store status in location PSTATUS.
2538 // During relaxation, this may be called multiple times for a symbol to
2539 // compute its would-be final value in each relaxation pass.
2540
2541 template<int size>
2542 typename Sized_symbol<size>::Value_type
2543 Symbol_table::compute_final_value(
2544     const Sized_symbol<size>* sym,
2545     Compute_final_value_status* pstatus) const
2546 {
2547   typedef typename Sized_symbol<size>::Value_type Value_type;
2548   Value_type value;
2549
2550   switch (sym->source())
2551     {
2552     case Symbol::FROM_OBJECT:
2553       {
2554         bool is_ordinary;
2555         unsigned int shndx = sym->shndx(&is_ordinary);
2556
2557         if (!is_ordinary
2558             && shndx != elfcpp::SHN_ABS
2559             && !Symbol::is_common_shndx(shndx))
2560           {
2561             *pstatus = CFVS_UNSUPPORTED_SYMBOL_SECTION;
2562             return 0;
2563           }
2564
2565         Object* symobj = sym->object();
2566         if (symobj->is_dynamic())
2567           {
2568             value = 0;
2569             shndx = elfcpp::SHN_UNDEF;
2570           }
2571         else if (symobj->pluginobj() != NULL)
2572           {
2573             value = 0;
2574             shndx = elfcpp::SHN_UNDEF;
2575           }
2576         else if (shndx == elfcpp::SHN_UNDEF)
2577           value = 0;
2578         else if (!is_ordinary
2579                  && (shndx == elfcpp::SHN_ABS
2580                      || Symbol::is_common_shndx(shndx)))
2581           value = sym->value();
2582         else
2583           {
2584             Relobj* relobj = static_cast<Relobj*>(symobj);
2585             Output_section* os = relobj->output_section(shndx);
2586
2587             if (this->is_section_folded(relobj, shndx))
2588               {
2589                 gold_assert(os == NULL);
2590                 // Get the os of the section it is folded onto.
2591                 Section_id folded = this->icf_->get_folded_section(relobj,
2592                                                                    shndx);
2593                 gold_assert(folded.first != NULL);
2594                 Relobj* folded_obj = reinterpret_cast<Relobj*>(folded.first);
2595                 unsigned folded_shndx = folded.second;
2596
2597                 os = folded_obj->output_section(folded_shndx);  
2598                 gold_assert(os != NULL);
2599
2600                 // Replace (relobj, shndx) with canonical ICF input section.
2601                 shndx = folded_shndx;
2602                 relobj = folded_obj;
2603               }
2604
2605             uint64_t secoff64 = relobj->output_section_offset(shndx);
2606             if (os == NULL)
2607               {
2608                 bool static_or_reloc = (parameters->doing_static_link() ||
2609                                         parameters->options().relocatable());
2610                 gold_assert(static_or_reloc || sym->dynsym_index() == -1U);
2611
2612                 *pstatus = CFVS_NO_OUTPUT_SECTION;
2613                 return 0;
2614               }
2615
2616             if (secoff64 == -1ULL)
2617               {
2618                 // The section needs special handling (e.g., a merge section).
2619
2620                 value = os->output_address(relobj, shndx, sym->value());
2621               }
2622             else
2623               {
2624                 Value_type secoff =
2625                   convert_types<Value_type, uint64_t>(secoff64);
2626                 if (sym->type() == elfcpp::STT_TLS)
2627                   value = sym->value() + os->tls_offset() + secoff;
2628                 else
2629                   value = sym->value() + os->address() + secoff;
2630               }
2631           }
2632       }
2633       break;
2634
2635     case Symbol::IN_OUTPUT_DATA:
2636       {
2637         Output_data* od = sym->output_data();
2638         value = sym->value();
2639         if (sym->type() != elfcpp::STT_TLS)
2640           value += od->address();
2641         else
2642           {
2643             Output_section* os = od->output_section();
2644             gold_assert(os != NULL);
2645             value += os->tls_offset() + (od->address() - os->address());
2646           }
2647         if (sym->offset_is_from_end())
2648           value += od->data_size();
2649       }
2650       break;
2651
2652     case Symbol::IN_OUTPUT_SEGMENT:
2653       {
2654         Output_segment* os = sym->output_segment();
2655         value = sym->value();
2656         if (sym->type() != elfcpp::STT_TLS)
2657           value += os->vaddr();
2658         switch (sym->offset_base())
2659           {
2660           case Symbol::SEGMENT_START:
2661             break;
2662           case Symbol::SEGMENT_END:
2663             value += os->memsz();
2664             break;
2665           case Symbol::SEGMENT_BSS:
2666             value += os->filesz();
2667             break;
2668           default:
2669             gold_unreachable();
2670           }
2671       }
2672       break;
2673
2674     case Symbol::IS_CONSTANT:
2675       value = sym->value();
2676       break;
2677
2678     case Symbol::IS_UNDEFINED:
2679       value = 0;
2680       break;
2681
2682     default:
2683       gold_unreachable();
2684     }
2685
2686   *pstatus = CFVS_OK;
2687   return value;
2688 }
2689
2690 // Finalize the symbol SYM.  This returns true if the symbol should be
2691 // added to the symbol table, false otherwise.
2692
2693 template<int size>
2694 bool
2695 Symbol_table::sized_finalize_symbol(Symbol* unsized_sym)
2696 {
2697   typedef typename Sized_symbol<size>::Value_type Value_type;
2698
2699   Sized_symbol<size>* sym = static_cast<Sized_symbol<size>*>(unsized_sym);
2700
2701   // The default version of a symbol may appear twice in the symbol
2702   // table.  We only need to finalize it once.
2703   if (sym->has_symtab_index())
2704     return false;
2705
2706   if (!sym->in_reg())
2707     {
2708       gold_assert(!sym->has_symtab_index());
2709       sym->set_symtab_index(-1U);
2710       gold_assert(sym->dynsym_index() == -1U);
2711       return false;
2712     }
2713
2714   // If the symbol is only present on plugin files, the plugin decided we
2715   // don't need it.
2716   if (!sym->in_real_elf())
2717     {
2718       gold_assert(!sym->has_symtab_index());
2719       sym->set_symtab_index(-1U);
2720       return false;
2721     }
2722
2723   // Compute final symbol value.
2724   Compute_final_value_status status;
2725   Value_type value = this->compute_final_value(sym, &status);
2726
2727   switch (status)
2728     {
2729     case CFVS_OK:
2730       break;
2731     case CFVS_UNSUPPORTED_SYMBOL_SECTION:
2732       {
2733         bool is_ordinary;
2734         unsigned int shndx = sym->shndx(&is_ordinary);
2735         gold_error(_("%s: unsupported symbol section 0x%x"),
2736                    sym->demangled_name().c_str(), shndx);
2737       }
2738       break;
2739     case CFVS_NO_OUTPUT_SECTION:
2740       sym->set_symtab_index(-1U);
2741       return false;
2742     default:
2743       gold_unreachable();
2744     }
2745
2746   sym->set_value(value);
2747
2748   if (parameters->options().strip_all()
2749       || !parameters->options().should_retain_symbol(sym->name()))
2750     {
2751       sym->set_symtab_index(-1U);
2752       return false;
2753     }
2754
2755   return true;
2756 }
2757
2758 // Write out the global symbols.
2759
2760 void
2761 Symbol_table::write_globals(const Stringpool* sympool,
2762                             const Stringpool* dynpool,
2763                             Output_symtab_xindex* symtab_xindex,
2764                             Output_symtab_xindex* dynsym_xindex,
2765                             Output_file* of) const
2766 {
2767   switch (parameters->size_and_endianness())
2768     {
2769 #ifdef HAVE_TARGET_32_LITTLE
2770     case Parameters::TARGET_32_LITTLE:
2771       this->sized_write_globals<32, false>(sympool, dynpool, symtab_xindex,
2772                                            dynsym_xindex, of);
2773       break;
2774 #endif
2775 #ifdef HAVE_TARGET_32_BIG
2776     case Parameters::TARGET_32_BIG:
2777       this->sized_write_globals<32, true>(sympool, dynpool, symtab_xindex,
2778                                           dynsym_xindex, of);
2779       break;
2780 #endif
2781 #ifdef HAVE_TARGET_64_LITTLE
2782     case Parameters::TARGET_64_LITTLE:
2783       this->sized_write_globals<64, false>(sympool, dynpool, symtab_xindex,
2784                                            dynsym_xindex, of);
2785       break;
2786 #endif
2787 #ifdef HAVE_TARGET_64_BIG
2788     case Parameters::TARGET_64_BIG:
2789       this->sized_write_globals<64, true>(sympool, dynpool, symtab_xindex,
2790                                           dynsym_xindex, of);
2791       break;
2792 #endif
2793     default:
2794       gold_unreachable();
2795     }
2796 }
2797
2798 // Write out the global symbols.
2799
2800 template<int size, bool big_endian>
2801 void
2802 Symbol_table::sized_write_globals(const Stringpool* sympool,
2803                                   const Stringpool* dynpool,
2804                                   Output_symtab_xindex* symtab_xindex,
2805                                   Output_symtab_xindex* dynsym_xindex,
2806                                   Output_file* of) const
2807 {
2808   const Target& target = parameters->target();
2809
2810   const int sym_size = elfcpp::Elf_sizes<size>::sym_size;
2811
2812   const unsigned int output_count = this->output_count_;
2813   const section_size_type oview_size = output_count * sym_size;
2814   const unsigned int first_global_index = this->first_global_index_;
2815   unsigned char* psyms;
2816   if (this->offset_ == 0 || output_count == 0)
2817     psyms = NULL;
2818   else
2819     psyms = of->get_output_view(this->offset_, oview_size);
2820
2821   const unsigned int dynamic_count = this->dynamic_count_;
2822   const section_size_type dynamic_size = dynamic_count * sym_size;
2823   const unsigned int first_dynamic_global_index =
2824     this->first_dynamic_global_index_;
2825   unsigned char* dynamic_view;
2826   if (this->dynamic_offset_ == 0 || dynamic_count == 0)
2827     dynamic_view = NULL;
2828   else
2829     dynamic_view = of->get_output_view(this->dynamic_offset_, dynamic_size);
2830
2831   for (Symbol_table_type::const_iterator p = this->table_.begin();
2832        p != this->table_.end();
2833        ++p)
2834     {
2835       Sized_symbol<size>* sym = static_cast<Sized_symbol<size>*>(p->second);
2836
2837       // Possibly warn about unresolved symbols in shared libraries.
2838       this->warn_about_undefined_dynobj_symbol(sym);
2839
2840       unsigned int sym_index = sym->symtab_index();
2841       unsigned int dynsym_index;
2842       if (dynamic_view == NULL)
2843         dynsym_index = -1U;
2844       else
2845         dynsym_index = sym->dynsym_index();
2846
2847       if (sym_index == -1U && dynsym_index == -1U)
2848         {
2849           // This symbol is not included in the output file.
2850           continue;
2851         }
2852
2853       unsigned int shndx;
2854       typename elfcpp::Elf_types<size>::Elf_Addr sym_value = sym->value();
2855       typename elfcpp::Elf_types<size>::Elf_Addr dynsym_value = sym_value;
2856       elfcpp::STB binding = sym->binding();
2857
2858       // If --no-gnu-unique is set, change STB_GNU_UNIQUE to STB_GLOBAL.
2859       if (binding == elfcpp::STB_GNU_UNIQUE
2860           && !parameters->options().gnu_unique())
2861         binding = elfcpp::STB_GLOBAL;
2862
2863       switch (sym->source())
2864         {
2865         case Symbol::FROM_OBJECT:
2866           {
2867             bool is_ordinary;
2868             unsigned int in_shndx = sym->shndx(&is_ordinary);
2869
2870             if (!is_ordinary
2871                 && in_shndx != elfcpp::SHN_ABS
2872                 && !Symbol::is_common_shndx(in_shndx))
2873               {
2874                 gold_error(_("%s: unsupported symbol section 0x%x"),
2875                            sym->demangled_name().c_str(), in_shndx);
2876                 shndx = in_shndx;
2877               }
2878             else
2879               {
2880                 Object* symobj = sym->object();
2881                 if (symobj->is_dynamic())
2882                   {
2883                     if (sym->needs_dynsym_value())
2884                       dynsym_value = target.dynsym_value(sym);
2885                     shndx = elfcpp::SHN_UNDEF;
2886                     if (sym->is_undef_binding_weak())
2887                       binding = elfcpp::STB_WEAK;
2888                     else
2889                       binding = elfcpp::STB_GLOBAL;
2890                   }
2891                 else if (symobj->pluginobj() != NULL)
2892                   shndx = elfcpp::SHN_UNDEF;
2893                 else if (in_shndx == elfcpp::SHN_UNDEF
2894                          || (!is_ordinary
2895                              && (in_shndx == elfcpp::SHN_ABS
2896                                  || Symbol::is_common_shndx(in_shndx))))
2897                   shndx = in_shndx;
2898                 else
2899                   {
2900                     Relobj* relobj = static_cast<Relobj*>(symobj);
2901                     Output_section* os = relobj->output_section(in_shndx);
2902                     if (this->is_section_folded(relobj, in_shndx))
2903                       {
2904                         // This global symbol must be written out even though
2905                         // it is folded.
2906                         // Get the os of the section it is folded onto.
2907                         Section_id folded =
2908                              this->icf_->get_folded_section(relobj, in_shndx);
2909                         gold_assert(folded.first !=NULL);
2910                         Relobj* folded_obj = 
2911                           reinterpret_cast<Relobj*>(folded.first);
2912                         os = folded_obj->output_section(folded.second);  
2913                         gold_assert(os != NULL);
2914                       }
2915                     gold_assert(os != NULL);
2916                     shndx = os->out_shndx();
2917
2918                     if (shndx >= elfcpp::SHN_LORESERVE)
2919                       {
2920                         if (sym_index != -1U)
2921                           symtab_xindex->add(sym_index, shndx);
2922                         if (dynsym_index != -1U)
2923                           dynsym_xindex->add(dynsym_index, shndx);
2924                         shndx = elfcpp::SHN_XINDEX;
2925                       }
2926
2927                     // In object files symbol values are section
2928                     // relative.
2929                     if (parameters->options().relocatable())
2930                       sym_value -= os->address();
2931                   }
2932               }
2933           }
2934           break;
2935
2936         case Symbol::IN_OUTPUT_DATA:
2937           shndx = sym->output_data()->out_shndx();
2938           if (shndx >= elfcpp::SHN_LORESERVE)
2939             {
2940               if (sym_index != -1U)
2941                 symtab_xindex->add(sym_index, shndx);
2942               if (dynsym_index != -1U)
2943                 dynsym_xindex->add(dynsym_index, shndx);
2944               shndx = elfcpp::SHN_XINDEX;
2945             }
2946           break;
2947
2948         case Symbol::IN_OUTPUT_SEGMENT:
2949           shndx = elfcpp::SHN_ABS;
2950           break;
2951
2952         case Symbol::IS_CONSTANT:
2953           shndx = elfcpp::SHN_ABS;
2954           break;
2955
2956         case Symbol::IS_UNDEFINED:
2957           shndx = elfcpp::SHN_UNDEF;
2958           break;
2959
2960         default:
2961           gold_unreachable();
2962         }
2963
2964       if (sym_index != -1U)
2965         {
2966           sym_index -= first_global_index;
2967           gold_assert(sym_index < output_count);
2968           unsigned char* ps = psyms + (sym_index * sym_size);
2969           this->sized_write_symbol<size, big_endian>(sym, sym_value, shndx,
2970                                                      binding, sympool, ps);
2971         }
2972
2973       if (dynsym_index != -1U)
2974         {
2975           dynsym_index -= first_dynamic_global_index;
2976           gold_assert(dynsym_index < dynamic_count);
2977           unsigned char* pd = dynamic_view + (dynsym_index * sym_size);
2978           this->sized_write_symbol<size, big_endian>(sym, dynsym_value, shndx,
2979                                                      binding, dynpool, pd);
2980         }
2981     }
2982
2983   of->write_output_view(this->offset_, oview_size, psyms);
2984   if (dynamic_view != NULL)
2985     of->write_output_view(this->dynamic_offset_, dynamic_size, dynamic_view);
2986 }
2987
2988 // Write out the symbol SYM, in section SHNDX, to P.  POOL is the
2989 // strtab holding the name.
2990
2991 template<int size, bool big_endian>
2992 void
2993 Symbol_table::sized_write_symbol(
2994     Sized_symbol<size>* sym,
2995     typename elfcpp::Elf_types<size>::Elf_Addr value,
2996     unsigned int shndx,
2997     elfcpp::STB binding,
2998     const Stringpool* pool,
2999     unsigned char* p) const
3000 {
3001   elfcpp::Sym_write<size, big_endian> osym(p);
3002   if (sym->version() == NULL || !parameters->options().relocatable())
3003     osym.put_st_name(pool->get_offset(sym->name()));
3004   else
3005     osym.put_st_name(pool->get_offset(sym->versioned_name()));
3006   osym.put_st_value(value);
3007   // Use a symbol size of zero for undefined symbols from shared libraries.
3008   if (shndx == elfcpp::SHN_UNDEF && sym->is_from_dynobj())
3009     osym.put_st_size(0);
3010   else
3011     osym.put_st_size(sym->symsize());
3012   elfcpp::STT type = sym->type();
3013   // Turn IFUNC symbols from shared libraries into normal FUNC symbols.
3014   if (type == elfcpp::STT_GNU_IFUNC
3015       && sym->is_from_dynobj())
3016     type = elfcpp::STT_FUNC;
3017   // A version script may have overridden the default binding.
3018   if (sym->is_forced_local())
3019     osym.put_st_info(elfcpp::elf_st_info(elfcpp::STB_LOCAL, type));
3020   else
3021     osym.put_st_info(elfcpp::elf_st_info(binding, type));
3022   osym.put_st_other(elfcpp::elf_st_other(sym->visibility(), sym->nonvis()));
3023   osym.put_st_shndx(shndx);
3024 }
3025
3026 // Check for unresolved symbols in shared libraries.  This is
3027 // controlled by the --allow-shlib-undefined option.
3028
3029 // We only warn about libraries for which we have seen all the
3030 // DT_NEEDED entries.  We don't try to track down DT_NEEDED entries
3031 // which were not seen in this link.  If we didn't see a DT_NEEDED
3032 // entry, we aren't going to be able to reliably report whether the
3033 // symbol is undefined.
3034
3035 // We also don't warn about libraries found in a system library
3036 // directory (e.g., /lib or /usr/lib); we assume that those libraries
3037 // are OK.  This heuristic avoids problems on GNU/Linux, in which -ldl
3038 // can have undefined references satisfied by ld-linux.so.
3039
3040 inline void
3041 Symbol_table::warn_about_undefined_dynobj_symbol(Symbol* sym) const
3042 {
3043   bool dummy;
3044   if (sym->source() == Symbol::FROM_OBJECT
3045       && sym->object()->is_dynamic()
3046       && sym->shndx(&dummy) == elfcpp::SHN_UNDEF
3047       && sym->binding() != elfcpp::STB_WEAK
3048       && !parameters->options().allow_shlib_undefined()
3049       && !parameters->target().is_defined_by_abi(sym)
3050       && !sym->object()->is_in_system_directory())
3051     {
3052       // A very ugly cast.
3053       Dynobj* dynobj = static_cast<Dynobj*>(sym->object());
3054       if (!dynobj->has_unknown_needed_entries())
3055         gold_undefined_symbol(sym);
3056     }
3057 }
3058
3059 // Write out a section symbol.  Return the update offset.
3060
3061 void
3062 Symbol_table::write_section_symbol(const Output_section* os,
3063                                    Output_symtab_xindex* symtab_xindex,
3064                                    Output_file* of,
3065                                    off_t offset) const
3066 {
3067   switch (parameters->size_and_endianness())
3068     {
3069 #ifdef HAVE_TARGET_32_LITTLE
3070     case Parameters::TARGET_32_LITTLE:
3071       this->sized_write_section_symbol<32, false>(os, symtab_xindex, of,
3072                                                   offset);
3073       break;
3074 #endif
3075 #ifdef HAVE_TARGET_32_BIG
3076     case Parameters::TARGET_32_BIG:
3077       this->sized_write_section_symbol<32, true>(os, symtab_xindex, of,
3078                                                  offset);
3079       break;
3080 #endif
3081 #ifdef HAVE_TARGET_64_LITTLE
3082     case Parameters::TARGET_64_LITTLE:
3083       this->sized_write_section_symbol<64, false>(os, symtab_xindex, of,
3084                                                   offset);
3085       break;
3086 #endif
3087 #ifdef HAVE_TARGET_64_BIG
3088     case Parameters::TARGET_64_BIG:
3089       this->sized_write_section_symbol<64, true>(os, symtab_xindex, of,
3090                                                  offset);
3091       break;
3092 #endif
3093     default:
3094       gold_unreachable();
3095     }
3096 }
3097
3098 // Write out a section symbol, specialized for size and endianness.
3099
3100 template<int size, bool big_endian>
3101 void
3102 Symbol_table::sized_write_section_symbol(const Output_section* os,
3103                                          Output_symtab_xindex* symtab_xindex,
3104                                          Output_file* of,
3105                                          off_t offset) const
3106 {
3107   const int sym_size = elfcpp::Elf_sizes<size>::sym_size;
3108
3109   unsigned char* pov = of->get_output_view(offset, sym_size);
3110
3111   elfcpp::Sym_write<size, big_endian> osym(pov);
3112   osym.put_st_name(0);
3113   if (parameters->options().relocatable())
3114     osym.put_st_value(0);
3115   else
3116     osym.put_st_value(os->address());
3117   osym.put_st_size(0);
3118   osym.put_st_info(elfcpp::elf_st_info(elfcpp::STB_LOCAL,
3119                                        elfcpp::STT_SECTION));
3120   osym.put_st_other(elfcpp::elf_st_other(elfcpp::STV_DEFAULT, 0));
3121
3122   unsigned int shndx = os->out_shndx();
3123   if (shndx >= elfcpp::SHN_LORESERVE)
3124     {
3125       symtab_xindex->add(os->symtab_index(), shndx);
3126       shndx = elfcpp::SHN_XINDEX;
3127     }
3128   osym.put_st_shndx(shndx);
3129
3130   of->write_output_view(offset, sym_size, pov);
3131 }
3132
3133 // Print statistical information to stderr.  This is used for --stats.
3134
3135 void
3136 Symbol_table::print_stats() const
3137 {
3138 #if defined(HAVE_TR1_UNORDERED_MAP) || defined(HAVE_EXT_HASH_MAP)
3139   fprintf(stderr, _("%s: symbol table entries: %zu; buckets: %zu\n"),
3140           program_name, this->table_.size(), this->table_.bucket_count());
3141 #else
3142   fprintf(stderr, _("%s: symbol table entries: %zu\n"),
3143           program_name, this->table_.size());
3144 #endif
3145   this->namepool_.print_stats("symbol table stringpool");
3146 }
3147
3148 // We check for ODR violations by looking for symbols with the same
3149 // name for which the debugging information reports that they were
3150 // defined in disjoint source locations.  When comparing the source
3151 // location, we consider instances with the same base filename to be
3152 // the same.  This is because different object files/shared libraries
3153 // can include the same header file using different paths, and
3154 // different optimization settings can make the line number appear to
3155 // be a couple lines off, and we don't want to report an ODR violation
3156 // in those cases.
3157
3158 // This struct is used to compare line information, as returned by
3159 // Dwarf_line_info::one_addr2line.  It implements a < comparison
3160 // operator used with std::sort.
3161
3162 struct Odr_violation_compare
3163 {
3164   bool
3165   operator()(const std::string& s1, const std::string& s2) const
3166   {
3167     // Inputs should be of the form "dirname/filename:linenum" where
3168     // "dirname/" is optional.  We want to compare just the filename:linenum.
3169
3170     // Find the last '/' in each string.
3171     std::string::size_type s1begin = s1.rfind('/');
3172     std::string::size_type s2begin = s2.rfind('/');
3173     // If there was no '/' in a string, start at the beginning.
3174     if (s1begin == std::string::npos)
3175       s1begin = 0;
3176     if (s2begin == std::string::npos)
3177       s2begin = 0;
3178     return s1.compare(s1begin, std::string::npos,
3179                       s2, s2begin, std::string::npos) < 0;
3180   }
3181 };
3182
3183 // Returns all of the lines attached to LOC, not just the one the
3184 // instruction actually came from.
3185 std::vector<std::string>
3186 Symbol_table::linenos_from_loc(const Task* task,
3187                                const Symbol_location& loc)
3188 {
3189   // We need to lock the object in order to read it.  This
3190   // means that we have to run in a singleton Task.  If we
3191   // want to run this in a general Task for better
3192   // performance, we will need one Task for object, plus
3193   // appropriate locking to ensure that we don't conflict with
3194   // other uses of the object.  Also note, one_addr2line is not
3195   // currently thread-safe.
3196   Task_lock_obj<Object> tl(task, loc.object);
3197
3198   std::vector<std::string> result;
3199   // 16 is the size of the object-cache that one_addr2line should use.
3200   std::string canonical_result = Dwarf_line_info::one_addr2line(
3201       loc.object, loc.shndx, loc.offset, 16, &result);
3202   if (!canonical_result.empty())
3203     result.push_back(canonical_result);
3204   return result;
3205 }
3206
3207 // OutputIterator that records if it was ever assigned to.  This
3208 // allows it to be used with std::set_intersection() to check for
3209 // intersection rather than computing the intersection.
3210 struct Check_intersection
3211 {
3212   Check_intersection()
3213     : value_(false)
3214   {}
3215
3216   bool had_intersection() const
3217   { return this->value_; }
3218
3219   Check_intersection& operator++()
3220   { return *this; }
3221
3222   Check_intersection& operator*()
3223   { return *this; }
3224
3225   template<typename T>
3226   Check_intersection& operator=(const T&)
3227   {
3228     this->value_ = true;
3229     return *this;
3230   }
3231
3232  private:
3233   bool value_;
3234 };
3235
3236 // Check candidate_odr_violations_ to find symbols with the same name
3237 // but apparently different definitions (different source-file/line-no
3238 // for each line assigned to the first instruction).
3239
3240 void
3241 Symbol_table::detect_odr_violations(const Task* task,
3242                                     const char* output_file_name) const
3243 {
3244   for (Odr_map::const_iterator it = candidate_odr_violations_.begin();
3245        it != candidate_odr_violations_.end();
3246        ++it)
3247     {
3248       const char* const symbol_name = it->first;
3249
3250       std::string first_object_name;
3251       std::vector<std::string> first_object_linenos;
3252
3253       Unordered_set<Symbol_location, Symbol_location_hash>::const_iterator
3254           locs = it->second.begin();
3255       const Unordered_set<Symbol_location, Symbol_location_hash>::const_iterator
3256           locs_end = it->second.end();
3257       for (; locs != locs_end && first_object_linenos.empty(); ++locs)
3258         {
3259           // Save the line numbers from the first definition to
3260           // compare to the other definitions.  Ideally, we'd compare
3261           // every definition to every other, but we don't want to
3262           // take O(N^2) time to do this.  This shortcut may cause
3263           // false negatives that appear or disappear depending on the
3264           // link order, but it won't cause false positives.
3265           first_object_name = locs->object->name();
3266           first_object_linenos = this->linenos_from_loc(task, *locs);
3267         }
3268
3269       // Sort by Odr_violation_compare to make std::set_intersection work.
3270       std::sort(first_object_linenos.begin(), first_object_linenos.end(),
3271                 Odr_violation_compare());
3272
3273       for (; locs != locs_end; ++locs)
3274         {
3275           std::vector<std::string> linenos =
3276               this->linenos_from_loc(task, *locs);
3277           // linenos will be empty if we couldn't parse the debug info.
3278           if (linenos.empty())
3279             continue;
3280           // Sort by Odr_violation_compare to make std::set_intersection work.
3281           std::sort(linenos.begin(), linenos.end(), Odr_violation_compare());
3282
3283           Check_intersection intersection_result =
3284               std::set_intersection(first_object_linenos.begin(),
3285                                     first_object_linenos.end(),
3286                                     linenos.begin(),
3287                                     linenos.end(),
3288                                     Check_intersection(),
3289                                     Odr_violation_compare());
3290           if (!intersection_result.had_intersection())
3291             {
3292               gold_warning(_("while linking %s: symbol '%s' defined in "
3293                              "multiple places (possible ODR violation):"),
3294                            output_file_name, demangle(symbol_name).c_str());
3295               // This only prints one location from each definition,
3296               // which may not be the location we expect to intersect
3297               // with another definition.  We could print the whole
3298               // set of locations, but that seems too verbose.
3299               gold_assert(!first_object_linenos.empty());
3300               gold_assert(!linenos.empty());
3301               fprintf(stderr, _("  %s from %s\n"),
3302                       first_object_linenos[0].c_str(),
3303                       first_object_name.c_str());
3304               fprintf(stderr, _("  %s from %s\n"),
3305                       linenos[0].c_str(),
3306                       locs->object->name().c_str());
3307               // Only print one broken pair, to avoid needing to
3308               // compare against a list of the disjoint definition
3309               // locations we've found so far.  (If we kept comparing
3310               // against just the first one, we'd get a lot of
3311               // redundant complaints about the second definition
3312               // location.)
3313               break;
3314             }
3315         }
3316     }
3317   // We only call one_addr2line() in this function, so we can clear its cache.
3318   Dwarf_line_info::clear_addr2line_cache();
3319 }
3320
3321 // Warnings functions.
3322
3323 // Add a new warning.
3324
3325 void
3326 Warnings::add_warning(Symbol_table* symtab, const char* name, Object* obj,
3327                       const std::string& warning)
3328 {
3329   name = symtab->canonicalize_name(name);
3330   this->warnings_[name].set(obj, warning);
3331 }
3332
3333 // Look through the warnings and mark the symbols for which we should
3334 // warn.  This is called during Layout::finalize when we know the
3335 // sources for all the symbols.
3336
3337 void
3338 Warnings::note_warnings(Symbol_table* symtab)
3339 {
3340   for (Warning_table::iterator p = this->warnings_.begin();
3341        p != this->warnings_.end();
3342        ++p)
3343     {
3344       Symbol* sym = symtab->lookup(p->first, NULL);
3345       if (sym != NULL
3346           && sym->source() == Symbol::FROM_OBJECT
3347           && sym->object() == p->second.object)
3348         sym->set_has_warning();
3349     }
3350 }
3351
3352 // Issue a warning.  This is called when we see a relocation against a
3353 // symbol for which has a warning.
3354
3355 template<int size, bool big_endian>
3356 void
3357 Warnings::issue_warning(const Symbol* sym,
3358                         const Relocate_info<size, big_endian>* relinfo,
3359                         size_t relnum, off_t reloffset) const
3360 {
3361   gold_assert(sym->has_warning());
3362
3363   // We don't want to issue a warning for a relocation against the
3364   // symbol in the same object file in which the symbol is defined.
3365   if (sym->object() == relinfo->object)
3366     return;
3367
3368   Warning_table::const_iterator p = this->warnings_.find(sym->name());
3369   gold_assert(p != this->warnings_.end());
3370   gold_warning_at_location(relinfo, relnum, reloffset,
3371                            "%s", p->second.text.c_str());
3372 }
3373
3374 // Instantiate the templates we need.  We could use the configure
3375 // script to restrict this to only the ones needed for implemented
3376 // targets.
3377
3378 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
3379 template
3380 void
3381 Sized_symbol<32>::allocate_common(Output_data*, Value_type);
3382 #endif
3383
3384 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
3385 template
3386 void
3387 Sized_symbol<64>::allocate_common(Output_data*, Value_type);
3388 #endif
3389
3390 #ifdef HAVE_TARGET_32_LITTLE
3391 template
3392 void
3393 Symbol_table::add_from_relobj<32, false>(
3394     Sized_relobj_file<32, false>* relobj,
3395     const unsigned char* syms,
3396     size_t count,
3397     size_t symndx_offset,
3398     const char* sym_names,
3399     size_t sym_name_size,
3400     Sized_relobj_file<32, false>::Symbols* sympointers,
3401     size_t* defined);
3402 #endif
3403
3404 #ifdef HAVE_TARGET_32_BIG
3405 template
3406 void
3407 Symbol_table::add_from_relobj<32, true>(
3408     Sized_relobj_file<32, true>* relobj,
3409     const unsigned char* syms,
3410     size_t count,
3411     size_t symndx_offset,
3412     const char* sym_names,
3413     size_t sym_name_size,
3414     Sized_relobj_file<32, true>::Symbols* sympointers,
3415     size_t* defined);
3416 #endif
3417
3418 #ifdef HAVE_TARGET_64_LITTLE
3419 template
3420 void
3421 Symbol_table::add_from_relobj<64, false>(
3422     Sized_relobj_file<64, false>* relobj,
3423     const unsigned char* syms,
3424     size_t count,
3425     size_t symndx_offset,
3426     const char* sym_names,
3427     size_t sym_name_size,
3428     Sized_relobj_file<64, false>::Symbols* sympointers,
3429     size_t* defined);
3430 #endif
3431
3432 #ifdef HAVE_TARGET_64_BIG
3433 template
3434 void
3435 Symbol_table::add_from_relobj<64, true>(
3436     Sized_relobj_file<64, true>* relobj,
3437     const unsigned char* syms,
3438     size_t count,
3439     size_t symndx_offset,
3440     const char* sym_names,
3441     size_t sym_name_size,
3442     Sized_relobj_file<64, true>::Symbols* sympointers,
3443     size_t* defined);
3444 #endif
3445
3446 #ifdef HAVE_TARGET_32_LITTLE
3447 template
3448 Symbol*
3449 Symbol_table::add_from_pluginobj<32, false>(
3450     Sized_pluginobj<32, false>* obj,
3451     const char* name,
3452     const char* ver,
3453     elfcpp::Sym<32, false>* sym);
3454 #endif
3455
3456 #ifdef HAVE_TARGET_32_BIG
3457 template
3458 Symbol*
3459 Symbol_table::add_from_pluginobj<32, true>(
3460     Sized_pluginobj<32, true>* obj,
3461     const char* name,
3462     const char* ver,
3463     elfcpp::Sym<32, true>* sym);
3464 #endif
3465
3466 #ifdef HAVE_TARGET_64_LITTLE
3467 template
3468 Symbol*
3469 Symbol_table::add_from_pluginobj<64, false>(
3470     Sized_pluginobj<64, false>* obj,
3471     const char* name,
3472     const char* ver,
3473     elfcpp::Sym<64, false>* sym);
3474 #endif
3475
3476 #ifdef HAVE_TARGET_64_BIG
3477 template
3478 Symbol*
3479 Symbol_table::add_from_pluginobj<64, true>(
3480     Sized_pluginobj<64, true>* obj,
3481     const char* name,
3482     const char* ver,
3483     elfcpp::Sym<64, true>* sym);
3484 #endif
3485
3486 #ifdef HAVE_TARGET_32_LITTLE
3487 template
3488 void
3489 Symbol_table::add_from_dynobj<32, false>(
3490     Sized_dynobj<32, false>* dynobj,
3491     const unsigned char* syms,
3492     size_t count,
3493     const char* sym_names,
3494     size_t sym_name_size,
3495     const unsigned char* versym,
3496     size_t versym_size,
3497     const std::vector<const char*>* version_map,
3498     Sized_relobj_file<32, false>::Symbols* sympointers,
3499     size_t* defined);
3500 #endif
3501
3502 #ifdef HAVE_TARGET_32_BIG
3503 template
3504 void
3505 Symbol_table::add_from_dynobj<32, true>(
3506     Sized_dynobj<32, true>* dynobj,
3507     const unsigned char* syms,
3508     size_t count,
3509     const char* sym_names,
3510     size_t sym_name_size,
3511     const unsigned char* versym,
3512     size_t versym_size,
3513     const std::vector<const char*>* version_map,
3514     Sized_relobj_file<32, true>::Symbols* sympointers,
3515     size_t* defined);
3516 #endif
3517
3518 #ifdef HAVE_TARGET_64_LITTLE
3519 template
3520 void
3521 Symbol_table::add_from_dynobj<64, false>(
3522     Sized_dynobj<64, false>* dynobj,
3523     const unsigned char* syms,
3524     size_t count,
3525     const char* sym_names,
3526     size_t sym_name_size,
3527     const unsigned char* versym,
3528     size_t versym_size,
3529     const std::vector<const char*>* version_map,
3530     Sized_relobj_file<64, false>::Symbols* sympointers,
3531     size_t* defined);
3532 #endif
3533
3534 #ifdef HAVE_TARGET_64_BIG
3535 template
3536 void
3537 Symbol_table::add_from_dynobj<64, true>(
3538     Sized_dynobj<64, true>* dynobj,
3539     const unsigned char* syms,
3540     size_t count,
3541     const char* sym_names,
3542     size_t sym_name_size,
3543     const unsigned char* versym,
3544     size_t versym_size,
3545     const std::vector<const char*>* version_map,
3546     Sized_relobj_file<64, true>::Symbols* sympointers,
3547     size_t* defined);
3548 #endif
3549
3550 #ifdef HAVE_TARGET_32_LITTLE
3551 template
3552 Sized_symbol<32>*
3553 Symbol_table::add_from_incrobj(
3554     Object* obj,
3555     const char* name,
3556     const char* ver,
3557     elfcpp::Sym<32, false>* sym);
3558 #endif
3559
3560 #ifdef HAVE_TARGET_32_BIG
3561 template
3562 Sized_symbol<32>*
3563 Symbol_table::add_from_incrobj(
3564     Object* obj,
3565     const char* name,
3566     const char* ver,
3567     elfcpp::Sym<32, true>* sym);
3568 #endif
3569
3570 #ifdef HAVE_TARGET_64_LITTLE
3571 template
3572 Sized_symbol<64>*
3573 Symbol_table::add_from_incrobj(
3574     Object* obj,
3575     const char* name,
3576     const char* ver,
3577     elfcpp::Sym<64, false>* sym);
3578 #endif
3579
3580 #ifdef HAVE_TARGET_64_BIG
3581 template
3582 Sized_symbol<64>*
3583 Symbol_table::add_from_incrobj(
3584     Object* obj,
3585     const char* name,
3586     const char* ver,
3587     elfcpp::Sym<64, true>* sym);
3588 #endif
3589
3590 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
3591 template
3592 void
3593 Symbol_table::define_with_copy_reloc<32>(
3594     Sized_symbol<32>* sym,
3595     Output_data* posd,
3596     elfcpp::Elf_types<32>::Elf_Addr value);
3597 #endif
3598
3599 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
3600 template
3601 void
3602 Symbol_table::define_with_copy_reloc<64>(
3603     Sized_symbol<64>* sym,
3604     Output_data* posd,
3605     elfcpp::Elf_types<64>::Elf_Addr value);
3606 #endif
3607
3608 #ifdef HAVE_TARGET_32_LITTLE
3609 template
3610 void
3611 Warnings::issue_warning<32, false>(const Symbol* sym,
3612                                    const Relocate_info<32, false>* relinfo,
3613                                    size_t relnum, off_t reloffset) const;
3614 #endif
3615
3616 #ifdef HAVE_TARGET_32_BIG
3617 template
3618 void
3619 Warnings::issue_warning<32, true>(const Symbol* sym,
3620                                   const Relocate_info<32, true>* relinfo,
3621                                   size_t relnum, off_t reloffset) const;
3622 #endif
3623
3624 #ifdef HAVE_TARGET_64_LITTLE
3625 template
3626 void
3627 Warnings::issue_warning<64, false>(const Symbol* sym,
3628                                    const Relocate_info<64, false>* relinfo,
3629                                    size_t relnum, off_t reloffset) const;
3630 #endif
3631
3632 #ifdef HAVE_TARGET_64_BIG
3633 template
3634 void
3635 Warnings::issue_warning<64, true>(const Symbol* sym,
3636                                   const Relocate_info<64, true>* relinfo,
3637                                   size_t relnum, off_t reloffset) const;
3638 #endif
3639
3640 } // End namespace gold.