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