1ed0d50c3Schristos // resolve.cc -- symbol resolution for gold
2ed0d50c3Schristos 
3*b88e3e88Schristos // Copyright (C) 2006-2020 Free Software Foundation, Inc.
4ed0d50c3Schristos // Written by Ian Lance Taylor <iant@google.com>.
5ed0d50c3Schristos 
6ed0d50c3Schristos // This file is part of gold.
7ed0d50c3Schristos 
8ed0d50c3Schristos // This program is free software; you can redistribute it and/or modify
9ed0d50c3Schristos // it under the terms of the GNU General Public License as published by
10ed0d50c3Schristos // the Free Software Foundation; either version 3 of the License, or
11ed0d50c3Schristos // (at your option) any later version.
12ed0d50c3Schristos 
13ed0d50c3Schristos // This program is distributed in the hope that it will be useful,
14ed0d50c3Schristos // but WITHOUT ANY WARRANTY; without even the implied warranty of
15ed0d50c3Schristos // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16ed0d50c3Schristos // GNU General Public License for more details.
17ed0d50c3Schristos 
18ed0d50c3Schristos // You should have received a copy of the GNU General Public License
19ed0d50c3Schristos // along with this program; if not, write to the Free Software
20ed0d50c3Schristos // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21ed0d50c3Schristos // MA 02110-1301, USA.
22ed0d50c3Schristos 
23ed0d50c3Schristos #include "gold.h"
24ed0d50c3Schristos 
25ed0d50c3Schristos #include "elfcpp.h"
26ed0d50c3Schristos #include "target.h"
27ed0d50c3Schristos #include "object.h"
28ed0d50c3Schristos #include "symtab.h"
29ed0d50c3Schristos #include "plugin.h"
30ed0d50c3Schristos 
31ed0d50c3Schristos namespace gold
32ed0d50c3Schristos {
33ed0d50c3Schristos 
34ed0d50c3Schristos // Symbol methods used in this file.
35ed0d50c3Schristos 
36ed0d50c3Schristos // This symbol is being overridden by another symbol whose version is
37ed0d50c3Schristos // VERSION.  Update the VERSION_ field accordingly.
38ed0d50c3Schristos 
39ed0d50c3Schristos inline void
override_version(const char * version)40ed0d50c3Schristos Symbol::override_version(const char* version)
41ed0d50c3Schristos {
42ed0d50c3Schristos   if (version == NULL)
43ed0d50c3Schristos     {
44ed0d50c3Schristos       // This is the case where this symbol is NAME/VERSION, and the
45ed0d50c3Schristos       // version was not marked as hidden.  That makes it the default
46ed0d50c3Schristos       // version, so we create NAME/NULL.  Later we see another symbol
47ed0d50c3Schristos       // NAME/NULL, and that symbol is overriding this one.  In this
48ed0d50c3Schristos       // case, since NAME/VERSION is the default, we make NAME/NULL
49ed0d50c3Schristos       // override NAME/VERSION as well.  They are already the same
50ed0d50c3Schristos       // Symbol structure.  Setting the VERSION_ field to NULL ensures
51ed0d50c3Schristos       // that it will be output with the correct, empty, version.
52ed0d50c3Schristos       this->version_ = version;
53ed0d50c3Schristos     }
54ed0d50c3Schristos   else
55ed0d50c3Schristos     {
56ed0d50c3Schristos       // This is the case where this symbol is NAME/VERSION_ONE, and
57ed0d50c3Schristos       // now we see NAME/VERSION_TWO, and NAME/VERSION_TWO is
58ed0d50c3Schristos       // overriding NAME.  If VERSION_ONE and VERSION_TWO are
59ed0d50c3Schristos       // different, then this can only happen when VERSION_ONE is NULL
60ed0d50c3Schristos       // and VERSION_TWO is not hidden.
61ed0d50c3Schristos       gold_assert(this->version_ == version || this->version_ == NULL);
62ed0d50c3Schristos       this->version_ = version;
63ed0d50c3Schristos     }
64ed0d50c3Schristos }
65ed0d50c3Schristos 
66ed0d50c3Schristos // This symbol is being overidden by another symbol whose visibility
67ed0d50c3Schristos // is VISIBILITY.  Updated the VISIBILITY_ field accordingly.
68ed0d50c3Schristos 
69ed0d50c3Schristos inline void
override_visibility(elfcpp::STV visibility)70ed0d50c3Schristos Symbol::override_visibility(elfcpp::STV visibility)
71ed0d50c3Schristos {
72ed0d50c3Schristos   // The rule for combining visibility is that we always choose the
73ed0d50c3Schristos   // most constrained visibility.  In order of increasing constraint,
74ed0d50c3Schristos   // visibility goes PROTECTED, HIDDEN, INTERNAL.  This is the reverse
75ed0d50c3Schristos   // of the numeric values, so the effect is that we always want the
76ed0d50c3Schristos   // smallest non-zero value.
77ed0d50c3Schristos   if (visibility != elfcpp::STV_DEFAULT)
78ed0d50c3Schristos     {
79ed0d50c3Schristos       if (this->visibility_ == elfcpp::STV_DEFAULT)
80ed0d50c3Schristos 	this->visibility_ = visibility;
81ed0d50c3Schristos       else if (this->visibility_ > visibility)
82ed0d50c3Schristos 	this->visibility_ = visibility;
83ed0d50c3Schristos     }
84ed0d50c3Schristos }
85ed0d50c3Schristos 
86ed0d50c3Schristos // Override the fields in Symbol.
87ed0d50c3Schristos 
88ed0d50c3Schristos template<int size, bool big_endian>
89ed0d50c3Schristos void
override_base(const elfcpp::Sym<size,big_endian> & sym,unsigned int st_shndx,bool is_ordinary,Object * object,const char * version)90ed0d50c3Schristos Symbol::override_base(const elfcpp::Sym<size, big_endian>& sym,
91ed0d50c3Schristos 		      unsigned int st_shndx, bool is_ordinary,
92ed0d50c3Schristos 		      Object* object, const char* version)
93ed0d50c3Schristos {
94ed0d50c3Schristos   gold_assert(this->source_ == FROM_OBJECT);
9506324dcfSchristos   this->u1_.object = object;
96ed0d50c3Schristos   this->override_version(version);
9706324dcfSchristos   this->u2_.shndx = st_shndx;
98ed0d50c3Schristos   this->is_ordinary_shndx_ = is_ordinary;
99ed0d50c3Schristos   // Don't override st_type from plugin placeholder symbols.
100ed0d50c3Schristos   if (object->pluginobj() == NULL)
101ed0d50c3Schristos     this->type_ = sym.get_st_type();
102ed0d50c3Schristos   this->binding_ = sym.get_st_bind();
103ed0d50c3Schristos   this->override_visibility(sym.get_st_visibility());
104ed0d50c3Schristos   this->nonvis_ = sym.get_st_nonvis();
105ed0d50c3Schristos   if (object->is_dynamic())
106ed0d50c3Schristos     this->in_dyn_ = true;
107ed0d50c3Schristos   else
108ed0d50c3Schristos     this->in_reg_ = true;
109ed0d50c3Schristos }
110ed0d50c3Schristos 
111ed0d50c3Schristos // Override the fields in Sized_symbol.
112ed0d50c3Schristos 
113ed0d50c3Schristos template<int size>
114ed0d50c3Schristos template<bool big_endian>
115ed0d50c3Schristos void
override(const elfcpp::Sym<size,big_endian> & sym,unsigned st_shndx,bool is_ordinary,Object * object,const char * version)116ed0d50c3Schristos Sized_symbol<size>::override(const elfcpp::Sym<size, big_endian>& sym,
117ed0d50c3Schristos 			     unsigned st_shndx, bool is_ordinary,
118ed0d50c3Schristos 			     Object* object, const char* version)
119ed0d50c3Schristos {
120ed0d50c3Schristos   this->override_base(sym, st_shndx, is_ordinary, object, version);
121ed0d50c3Schristos   this->value_ = sym.get_st_value();
122ed0d50c3Schristos   this->symsize_ = sym.get_st_size();
123ed0d50c3Schristos }
124ed0d50c3Schristos 
125ed0d50c3Schristos // Override TOSYM with symbol FROMSYM, defined in OBJECT, with version
126ed0d50c3Schristos // VERSION.  This handles all aliases of TOSYM.
127ed0d50c3Schristos 
128ed0d50c3Schristos template<int size, bool big_endian>
129ed0d50c3Schristos void
override(Sized_symbol<size> * tosym,const elfcpp::Sym<size,big_endian> & fromsym,unsigned int st_shndx,bool is_ordinary,Object * object,const char * version)130ed0d50c3Schristos Symbol_table::override(Sized_symbol<size>* tosym,
131ed0d50c3Schristos 		       const elfcpp::Sym<size, big_endian>& fromsym,
132ed0d50c3Schristos 		       unsigned int st_shndx, bool is_ordinary,
133ed0d50c3Schristos 		       Object* object, const char* version)
134ed0d50c3Schristos {
135ed0d50c3Schristos   tosym->override(fromsym, st_shndx, is_ordinary, object, version);
136ed0d50c3Schristos   if (tosym->has_alias())
137ed0d50c3Schristos     {
138ed0d50c3Schristos       Symbol* sym = this->weak_aliases_[tosym];
139ed0d50c3Schristos       gold_assert(sym != NULL);
140ed0d50c3Schristos       Sized_symbol<size>* ssym = this->get_sized_symbol<size>(sym);
141ed0d50c3Schristos       do
142ed0d50c3Schristos 	{
143ed0d50c3Schristos 	  ssym->override(fromsym, st_shndx, is_ordinary, object, version);
144ed0d50c3Schristos 	  sym = this->weak_aliases_[ssym];
145ed0d50c3Schristos 	  gold_assert(sym != NULL);
146ed0d50c3Schristos 	  ssym = this->get_sized_symbol<size>(sym);
147ed0d50c3Schristos 	}
148ed0d50c3Schristos       while (ssym != tosym);
149ed0d50c3Schristos     }
150ed0d50c3Schristos }
151ed0d50c3Schristos 
152ed0d50c3Schristos // The resolve functions build a little code for each symbol.
153ed0d50c3Schristos // Bit 0: 0 for global, 1 for weak.
154ed0d50c3Schristos // Bit 1: 0 for regular object, 1 for shared object
155ed0d50c3Schristos // Bits 2-3: 0 for normal, 1 for undefined, 2 for common
156ed0d50c3Schristos // This gives us values from 0 to 11.
157ed0d50c3Schristos 
158ed0d50c3Schristos static const int global_or_weak_shift = 0;
159ed0d50c3Schristos static const unsigned int global_flag = 0 << global_or_weak_shift;
160ed0d50c3Schristos static const unsigned int weak_flag = 1 << global_or_weak_shift;
161ed0d50c3Schristos 
162ed0d50c3Schristos static const int regular_or_dynamic_shift = 1;
163ed0d50c3Schristos static const unsigned int regular_flag = 0 << regular_or_dynamic_shift;
164ed0d50c3Schristos static const unsigned int dynamic_flag = 1 << regular_or_dynamic_shift;
165ed0d50c3Schristos 
166ed0d50c3Schristos static const int def_undef_or_common_shift = 2;
167ed0d50c3Schristos static const unsigned int def_flag = 0 << def_undef_or_common_shift;
168ed0d50c3Schristos static const unsigned int undef_flag = 1 << def_undef_or_common_shift;
169ed0d50c3Schristos static const unsigned int common_flag = 2 << def_undef_or_common_shift;
170ed0d50c3Schristos 
171ed0d50c3Schristos // This convenience function combines all the flags based on facts
172ed0d50c3Schristos // about the symbol.
173ed0d50c3Schristos 
174ed0d50c3Schristos static unsigned int
symbol_to_bits(elfcpp::STB binding,bool is_dynamic,unsigned int shndx,bool is_ordinary)175ed0d50c3Schristos symbol_to_bits(elfcpp::STB binding, bool is_dynamic,
176ed0d50c3Schristos 	       unsigned int shndx, bool is_ordinary)
177ed0d50c3Schristos {
178ed0d50c3Schristos   unsigned int bits;
179ed0d50c3Schristos 
180ed0d50c3Schristos   switch (binding)
181ed0d50c3Schristos     {
182ed0d50c3Schristos     case elfcpp::STB_GLOBAL:
183ed0d50c3Schristos     case elfcpp::STB_GNU_UNIQUE:
184ed0d50c3Schristos       bits = global_flag;
185ed0d50c3Schristos       break;
186ed0d50c3Schristos 
187ed0d50c3Schristos     case elfcpp::STB_WEAK:
188ed0d50c3Schristos       bits = weak_flag;
189ed0d50c3Schristos       break;
190ed0d50c3Schristos 
191ed0d50c3Schristos     case elfcpp::STB_LOCAL:
192ed0d50c3Schristos       // We should only see externally visible symbols in the symbol
193ed0d50c3Schristos       // table.
194ed0d50c3Schristos       gold_error(_("invalid STB_LOCAL symbol in external symbols"));
195ed0d50c3Schristos       bits = global_flag;
19606324dcfSchristos       break;
197ed0d50c3Schristos 
198ed0d50c3Schristos     default:
199ed0d50c3Schristos       // Any target which wants to handle STB_LOOS, etc., needs to
200ed0d50c3Schristos       // define a resolve method.
201ed0d50c3Schristos       gold_error(_("unsupported symbol binding %d"), static_cast<int>(binding));
202ed0d50c3Schristos       bits = global_flag;
203ed0d50c3Schristos     }
204ed0d50c3Schristos 
205ed0d50c3Schristos   if (is_dynamic)
206ed0d50c3Schristos     bits |= dynamic_flag;
207ed0d50c3Schristos   else
208ed0d50c3Schristos     bits |= regular_flag;
209ed0d50c3Schristos 
210ed0d50c3Schristos   switch (shndx)
211ed0d50c3Schristos     {
212ed0d50c3Schristos     case elfcpp::SHN_UNDEF:
213ed0d50c3Schristos       bits |= undef_flag;
214ed0d50c3Schristos       break;
215ed0d50c3Schristos 
216ed0d50c3Schristos     case elfcpp::SHN_COMMON:
217ed0d50c3Schristos       if (!is_ordinary)
218ed0d50c3Schristos 	bits |= common_flag;
219ed0d50c3Schristos       break;
220ed0d50c3Schristos 
221ed0d50c3Schristos     default:
222ed0d50c3Schristos       if (!is_ordinary && Symbol::is_common_shndx(shndx))
223ed0d50c3Schristos 	bits |= common_flag;
224ed0d50c3Schristos       else
225ed0d50c3Schristos         bits |= def_flag;
226ed0d50c3Schristos       break;
227ed0d50c3Schristos     }
228ed0d50c3Schristos 
229ed0d50c3Schristos   return bits;
230ed0d50c3Schristos }
231ed0d50c3Schristos 
232ed0d50c3Schristos // Resolve a symbol.  This is called the second and subsequent times
233ed0d50c3Schristos // we see a symbol.  TO is the pre-existing symbol.  ST_SHNDX is the
234ed0d50c3Schristos // section index for SYM, possibly adjusted for many sections.
235ed0d50c3Schristos // IS_ORDINARY is whether ST_SHNDX is a normal section index rather
236ed0d50c3Schristos // than a special code.  ORIG_ST_SHNDX is the original section index,
237ed0d50c3Schristos // before any munging because of discarded sections, except that all
238ed0d50c3Schristos // non-ordinary section indexes are mapped to SHN_UNDEF.  VERSION is
239ed0d50c3Schristos // the version of SYM.
240ed0d50c3Schristos 
241ed0d50c3Schristos template<int size, bool big_endian>
242ed0d50c3Schristos void
resolve(Sized_symbol<size> * to,const elfcpp::Sym<size,big_endian> & sym,unsigned int st_shndx,bool is_ordinary,unsigned int orig_st_shndx,Object * object,const char * version,bool is_default_version)243ed0d50c3Schristos Symbol_table::resolve(Sized_symbol<size>* to,
244ed0d50c3Schristos 		      const elfcpp::Sym<size, big_endian>& sym,
245ed0d50c3Schristos 		      unsigned int st_shndx, bool is_ordinary,
246ed0d50c3Schristos 		      unsigned int orig_st_shndx,
247ed0d50c3Schristos 		      Object* object, const char* version,
248ed0d50c3Schristos 		      bool is_default_version)
249ed0d50c3Schristos {
25006324dcfSchristos   bool to_is_ordinary;
25106324dcfSchristos   const unsigned int to_shndx = to->shndx(&to_is_ordinary);
25206324dcfSchristos 
253ed0d50c3Schristos   // It's possible for a symbol to be defined in an object file
254ed0d50c3Schristos   // using .symver to give it a version, and for there to also be
255ed0d50c3Schristos   // a linker script giving that symbol the same version.  We
256ed0d50c3Schristos   // don't want to give a multiple-definition error for this
257ed0d50c3Schristos   // harmless redefinition.
258ed0d50c3Schristos   if (to->source() == Symbol::FROM_OBJECT
259ed0d50c3Schristos       && to->object() == object
260ed0d50c3Schristos       && to->is_defined()
26106324dcfSchristos       && is_ordinary
262ed0d50c3Schristos       && to_is_ordinary
26306324dcfSchristos       && to_shndx == st_shndx
26406324dcfSchristos       && to->value() == sym.get_st_value())
26506324dcfSchristos     return;
26606324dcfSchristos 
26706324dcfSchristos   // Likewise for an absolute symbol defined twice with the same value.
26806324dcfSchristos   if (!is_ordinary
26906324dcfSchristos       && st_shndx == elfcpp::SHN_ABS
27006324dcfSchristos       && !to_is_ordinary
27106324dcfSchristos       && to_shndx == elfcpp::SHN_ABS
272ed0d50c3Schristos       && to->value() == sym.get_st_value())
273ed0d50c3Schristos     return;
274ed0d50c3Schristos 
275ed0d50c3Schristos   if (parameters->target().has_resolve())
276ed0d50c3Schristos     {
277ed0d50c3Schristos       Sized_target<size, big_endian>* sized_target;
278ed0d50c3Schristos       sized_target = parameters->sized_target<size, big_endian>();
27906324dcfSchristos       if (sized_target->resolve(to, sym, object, version))
280ed0d50c3Schristos 	return;
281ed0d50c3Schristos     }
282ed0d50c3Schristos 
283ed0d50c3Schristos   if (!object->is_dynamic())
284ed0d50c3Schristos     {
285ed0d50c3Schristos       if (sym.get_st_type() == elfcpp::STT_COMMON
286ed0d50c3Schristos 	  && (is_ordinary || !Symbol::is_common_shndx(st_shndx)))
287ed0d50c3Schristos 	{
288ed0d50c3Schristos 	  gold_warning(_("STT_COMMON symbol '%s' in %s "
289ed0d50c3Schristos 			 "is not in a common section"),
290ed0d50c3Schristos 		       to->demangled_name().c_str(),
291ed0d50c3Schristos 		       to->object()->name().c_str());
292ed0d50c3Schristos 	  return;
293ed0d50c3Schristos 	}
294ed0d50c3Schristos       // Record that we've seen this symbol in a regular object.
295ed0d50c3Schristos       to->set_in_reg();
296ed0d50c3Schristos     }
297ed0d50c3Schristos   else if (st_shndx == elfcpp::SHN_UNDEF
298ed0d50c3Schristos            && (to->visibility() == elfcpp::STV_HIDDEN
299ed0d50c3Schristos                || to->visibility() == elfcpp::STV_INTERNAL))
300ed0d50c3Schristos     {
301ed0d50c3Schristos       // The symbol is hidden, so a reference from a shared object
302ed0d50c3Schristos       // cannot bind to it.  We tried issuing a warning in this case,
303ed0d50c3Schristos       // but that produces false positives when the symbol is
304ed0d50c3Schristos       // actually resolved in a different shared object (PR 15574).
305ed0d50c3Schristos       return;
306ed0d50c3Schristos     }
307ed0d50c3Schristos   else
308ed0d50c3Schristos     {
309ed0d50c3Schristos       // Record that we've seen this symbol in a dynamic object.
310ed0d50c3Schristos       to->set_in_dyn();
311ed0d50c3Schristos     }
312ed0d50c3Schristos 
313ed0d50c3Schristos   // Record if we've seen this symbol in a real ELF object (i.e., the
314ed0d50c3Schristos   // symbol is referenced from outside the world known to the plugin).
315ed0d50c3Schristos   if (object->pluginobj() == NULL && !object->is_dynamic())
316ed0d50c3Schristos     to->set_in_real_elf();
317ed0d50c3Schristos 
318ed0d50c3Schristos   // If we're processing replacement files, allow new symbols to override
319ed0d50c3Schristos   // the placeholders from the plugin objects.
320ed0d50c3Schristos   // Treat common symbols specially since it is possible that an ELF
321ed0d50c3Schristos   // file increased the size of the alignment.
322ed0d50c3Schristos   if (to->source() == Symbol::FROM_OBJECT)
323ed0d50c3Schristos     {
324ed0d50c3Schristos       Pluginobj* obj = to->object()->pluginobj();
325ed0d50c3Schristos       if (obj != NULL
326ed0d50c3Schristos           && parameters->options().plugins()->in_replacement_phase())
327ed0d50c3Schristos         {
328ed0d50c3Schristos 	  bool adjust_common = false;
329ed0d50c3Schristos 	  typename Sized_symbol<size>::Size_type tosize = 0;
330ed0d50c3Schristos 	  typename Sized_symbol<size>::Value_type tovalue = 0;
331ed0d50c3Schristos 	  if (to->is_common()
332ed0d50c3Schristos 	      && !is_ordinary && Symbol::is_common_shndx(st_shndx))
333ed0d50c3Schristos 	    {
334ed0d50c3Schristos 	      adjust_common = true;
335ed0d50c3Schristos 	      tosize = to->symsize();
336ed0d50c3Schristos 	      tovalue = to->value();
337ed0d50c3Schristos 	    }
338ed0d50c3Schristos 	  this->override(to, sym, st_shndx, is_ordinary, object, version);
339ed0d50c3Schristos 	  if (adjust_common)
340ed0d50c3Schristos 	    {
341ed0d50c3Schristos 	      if (tosize > to->symsize())
342ed0d50c3Schristos 		to->set_symsize(tosize);
343ed0d50c3Schristos 	      if (tovalue > to->value())
344ed0d50c3Schristos 		to->set_value(tovalue);
345ed0d50c3Schristos 	    }
346ed0d50c3Schristos 	  return;
347ed0d50c3Schristos         }
348ed0d50c3Schristos     }
349ed0d50c3Schristos 
350ed0d50c3Schristos   // A new weak undefined reference, merging with an old weak
351ed0d50c3Schristos   // reference, could be a One Definition Rule (ODR) violation --
352ed0d50c3Schristos   // especially if the types or sizes of the references differ.  We'll
353ed0d50c3Schristos   // store such pairs and look them up later to make sure they
354ed0d50c3Schristos   // actually refer to the same lines of code.  We also check
355ed0d50c3Schristos   // combinations of weak and strong, which might occur if one case is
356ed0d50c3Schristos   // inline and the other is not.  (Note: not all ODR violations can
357ed0d50c3Schristos   // be found this way, and not everything this finds is an ODR
358ed0d50c3Schristos   // violation.  But it's helpful to warn about.)
359ed0d50c3Schristos   if (parameters->options().detect_odr_violations()
360ed0d50c3Schristos       && (sym.get_st_bind() == elfcpp::STB_WEAK
361ed0d50c3Schristos 	  || to->binding() == elfcpp::STB_WEAK)
362ed0d50c3Schristos       && orig_st_shndx != elfcpp::SHN_UNDEF
363ed0d50c3Schristos       && to_is_ordinary
36406324dcfSchristos       && to_shndx != elfcpp::SHN_UNDEF
365ed0d50c3Schristos       && sym.get_st_size() != 0    // Ignore weird 0-sized symbols.
366ed0d50c3Schristos       && to->symsize() != 0
367ed0d50c3Schristos       && (sym.get_st_type() != to->type()
368ed0d50c3Schristos           || sym.get_st_size() != to->symsize())
369ed0d50c3Schristos       // C does not have a concept of ODR, so we only need to do this
370ed0d50c3Schristos       // on C++ symbols.  These have (mangled) names starting with _Z.
371ed0d50c3Schristos       && to->name()[0] == '_' && to->name()[1] == 'Z')
372ed0d50c3Schristos     {
373ed0d50c3Schristos       Symbol_location fromloc
374ed0d50c3Schristos           = { object, orig_st_shndx, static_cast<off_t>(sym.get_st_value()) };
37506324dcfSchristos       Symbol_location toloc = { to->object(), to_shndx,
376ed0d50c3Schristos 				static_cast<off_t>(to->value()) };
377ed0d50c3Schristos       this->candidate_odr_violations_[to->name()].insert(fromloc);
378ed0d50c3Schristos       this->candidate_odr_violations_[to->name()].insert(toloc);
379ed0d50c3Schristos     }
380ed0d50c3Schristos 
381ed0d50c3Schristos   // Plugins don't provide a symbol type, so adopt the existing type
382ed0d50c3Schristos   // if the FROM symbol is from a plugin.
383ed0d50c3Schristos   elfcpp::STT fromtype = (object->pluginobj() != NULL
384ed0d50c3Schristos 			  ? to->type()
385ed0d50c3Schristos 			  : sym.get_st_type());
386ed0d50c3Schristos   unsigned int frombits = symbol_to_bits(sym.get_st_bind(),
387ed0d50c3Schristos                                          object->is_dynamic(),
388ed0d50c3Schristos 					 st_shndx, is_ordinary);
389ed0d50c3Schristos 
390ed0d50c3Schristos   bool adjust_common_sizes;
391ed0d50c3Schristos   bool adjust_dyndef;
392ed0d50c3Schristos   typename Sized_symbol<size>::Size_type tosize = to->symsize();
393ed0d50c3Schristos   if (Symbol_table::should_override(to, frombits, fromtype, OBJECT,
394ed0d50c3Schristos 				    object, &adjust_common_sizes,
395ed0d50c3Schristos 				    &adjust_dyndef, is_default_version))
396ed0d50c3Schristos     {
39706324dcfSchristos       elfcpp::STB orig_tobinding = to->binding();
398ed0d50c3Schristos       typename Sized_symbol<size>::Value_type tovalue = to->value();
399ed0d50c3Schristos       this->override(to, sym, st_shndx, is_ordinary, object, version);
400ed0d50c3Schristos       if (adjust_common_sizes)
401ed0d50c3Schristos 	{
402ed0d50c3Schristos 	  if (tosize > to->symsize())
403ed0d50c3Schristos 	    to->set_symsize(tosize);
404ed0d50c3Schristos 	  if (tovalue > to->value())
405ed0d50c3Schristos 	    to->set_value(tovalue);
406ed0d50c3Schristos 	}
407ed0d50c3Schristos       if (adjust_dyndef)
408ed0d50c3Schristos 	{
409ed0d50c3Schristos 	  // We are overriding an UNDEF or WEAK UNDEF with a DYN DEF.
410ed0d50c3Schristos 	  // Remember which kind of UNDEF it was for future reference.
41106324dcfSchristos 	  to->set_undef_binding(orig_tobinding);
412ed0d50c3Schristos 	}
413ed0d50c3Schristos     }
414ed0d50c3Schristos   else
415ed0d50c3Schristos     {
416ed0d50c3Schristos       if (adjust_common_sizes)
417ed0d50c3Schristos 	{
418ed0d50c3Schristos 	  if (sym.get_st_size() > tosize)
419ed0d50c3Schristos 	    to->set_symsize(sym.get_st_size());
420ed0d50c3Schristos 	  if (sym.get_st_value() > to->value())
421ed0d50c3Schristos 	    to->set_value(sym.get_st_value());
422ed0d50c3Schristos 	}
423ed0d50c3Schristos       if (adjust_dyndef)
424ed0d50c3Schristos 	{
425ed0d50c3Schristos 	  // We are keeping a DYN DEF after seeing an UNDEF or WEAK UNDEF.
426ed0d50c3Schristos 	  // Remember which kind of UNDEF it was.
427ed0d50c3Schristos 	  to->set_undef_binding(sym.get_st_bind());
428ed0d50c3Schristos 	}
429ed0d50c3Schristos       // The ELF ABI says that even for a reference to a symbol we
430ed0d50c3Schristos       // merge the visibility.
431ed0d50c3Schristos       to->override_visibility(sym.get_st_visibility());
432ed0d50c3Schristos     }
433ed0d50c3Schristos 
43406324dcfSchristos   // If we have a non-WEAK reference from a regular object to a
43506324dcfSchristos   // dynamic object, mark the dynamic object as needed.
43606324dcfSchristos   if (to->is_from_dynobj() && to->in_reg() && !to->is_undef_binding_weak())
43706324dcfSchristos     to->object()->set_is_needed();
43806324dcfSchristos 
439ed0d50c3Schristos   if (adjust_common_sizes && parameters->options().warn_common())
440ed0d50c3Schristos     {
441ed0d50c3Schristos       if (tosize > sym.get_st_size())
442ed0d50c3Schristos 	Symbol_table::report_resolve_problem(false,
443ed0d50c3Schristos 					     _("common of '%s' overriding "
444ed0d50c3Schristos 					       "smaller common"),
445ed0d50c3Schristos 					     to, OBJECT, object);
446ed0d50c3Schristos       else if (tosize < sym.get_st_size())
447ed0d50c3Schristos 	Symbol_table::report_resolve_problem(false,
448ed0d50c3Schristos 					     _("common of '%s' overidden by "
449ed0d50c3Schristos 					       "larger common"),
450ed0d50c3Schristos 					     to, OBJECT, object);
451ed0d50c3Schristos       else
452ed0d50c3Schristos 	Symbol_table::report_resolve_problem(false,
453ed0d50c3Schristos 					     _("multiple common of '%s'"),
454ed0d50c3Schristos 					     to, OBJECT, object);
455ed0d50c3Schristos     }
456ed0d50c3Schristos }
457ed0d50c3Schristos 
458ed0d50c3Schristos // Handle the core of symbol resolution.  This is called with the
459ed0d50c3Schristos // existing symbol, TO, and a bitflag describing the new symbol.  This
460ed0d50c3Schristos // returns true if we should override the existing symbol with the new
461ed0d50c3Schristos // one, and returns false otherwise.  It sets *ADJUST_COMMON_SIZES to
462ed0d50c3Schristos // true if we should set the symbol size to the maximum of the TO and
463ed0d50c3Schristos // FROM sizes.  It handles error conditions.
464ed0d50c3Schristos 
465ed0d50c3Schristos bool
should_override(const Symbol * to,unsigned int frombits,elfcpp::STT fromtype,Defined defined,Object * object,bool * adjust_common_sizes,bool * adjust_dyndef,bool is_default_version)466ed0d50c3Schristos Symbol_table::should_override(const Symbol* to, unsigned int frombits,
467ed0d50c3Schristos 			      elfcpp::STT fromtype, Defined defined,
468ed0d50c3Schristos 			      Object* object, bool* adjust_common_sizes,
469ed0d50c3Schristos 			      bool* adjust_dyndef, bool is_default_version)
470ed0d50c3Schristos {
471ed0d50c3Schristos   *adjust_common_sizes = false;
472ed0d50c3Schristos   *adjust_dyndef = false;
473ed0d50c3Schristos 
474ed0d50c3Schristos   unsigned int tobits;
475ed0d50c3Schristos   if (to->source() == Symbol::IS_UNDEFINED)
476ed0d50c3Schristos     tobits = symbol_to_bits(to->binding(), false, elfcpp::SHN_UNDEF, true);
477ed0d50c3Schristos   else if (to->source() != Symbol::FROM_OBJECT)
478ed0d50c3Schristos     tobits = symbol_to_bits(to->binding(), false, elfcpp::SHN_ABS, false);
479ed0d50c3Schristos   else
480ed0d50c3Schristos     {
481ed0d50c3Schristos       bool is_ordinary;
482ed0d50c3Schristos       unsigned int shndx = to->shndx(&is_ordinary);
483ed0d50c3Schristos       tobits = symbol_to_bits(to->binding(),
484ed0d50c3Schristos 			      to->object()->is_dynamic(),
485ed0d50c3Schristos 			      shndx,
486ed0d50c3Schristos 			      is_ordinary);
487ed0d50c3Schristos     }
488ed0d50c3Schristos 
489ed0d50c3Schristos   if ((to->type() == elfcpp::STT_TLS) ^ (fromtype == elfcpp::STT_TLS)
490ed0d50c3Schristos       && !to->is_placeholder())
491ed0d50c3Schristos     Symbol_table::report_resolve_problem(true,
492ed0d50c3Schristos 					 _("symbol '%s' used as both __thread "
493ed0d50c3Schristos 					   "and non-__thread"),
494ed0d50c3Schristos 					 to, defined, object);
495ed0d50c3Schristos 
496ed0d50c3Schristos   // We use a giant switch table for symbol resolution.  This code is
497ed0d50c3Schristos   // unwieldy, but: 1) it is efficient; 2) we definitely handle all
498ed0d50c3Schristos   // cases; 3) it is easy to change the handling of a particular case.
499ed0d50c3Schristos   // The alternative would be a series of conditionals, but it is easy
500ed0d50c3Schristos   // to get the ordering wrong.  This could also be done as a table,
501ed0d50c3Schristos   // but that is no easier to understand than this large switch
502ed0d50c3Schristos   // statement.
503ed0d50c3Schristos 
504ed0d50c3Schristos   // These are the values generated by the bit codes.
505ed0d50c3Schristos   enum
506ed0d50c3Schristos   {
507ed0d50c3Schristos     DEF =              global_flag | regular_flag | def_flag,
508ed0d50c3Schristos     WEAK_DEF =         weak_flag   | regular_flag | def_flag,
509ed0d50c3Schristos     DYN_DEF =          global_flag | dynamic_flag | def_flag,
510ed0d50c3Schristos     DYN_WEAK_DEF =     weak_flag   | dynamic_flag | def_flag,
511ed0d50c3Schristos     UNDEF =            global_flag | regular_flag | undef_flag,
512ed0d50c3Schristos     WEAK_UNDEF =       weak_flag   | regular_flag | undef_flag,
513ed0d50c3Schristos     DYN_UNDEF =        global_flag | dynamic_flag | undef_flag,
514ed0d50c3Schristos     DYN_WEAK_UNDEF =   weak_flag   | dynamic_flag | undef_flag,
515ed0d50c3Schristos     COMMON =           global_flag | regular_flag | common_flag,
516ed0d50c3Schristos     WEAK_COMMON =      weak_flag   | regular_flag | common_flag,
517ed0d50c3Schristos     DYN_COMMON =       global_flag | dynamic_flag | common_flag,
518ed0d50c3Schristos     DYN_WEAK_COMMON =  weak_flag   | dynamic_flag | common_flag
519ed0d50c3Schristos   };
520ed0d50c3Schristos 
521ed0d50c3Schristos   switch (tobits * 16 + frombits)
522ed0d50c3Schristos     {
523ed0d50c3Schristos     case DEF * 16 + DEF:
524ed0d50c3Schristos       // Two definitions of the same symbol.
525ed0d50c3Schristos 
526ed0d50c3Schristos       // If either symbol is defined by an object included using
527ed0d50c3Schristos       // --just-symbols, then don't warn.  This is for compatibility
528ed0d50c3Schristos       // with the GNU linker.  FIXME: This is a hack.
529ed0d50c3Schristos       if ((to->source() == Symbol::FROM_OBJECT && to->object()->just_symbols())
530ed0d50c3Schristos           || (object != NULL && object->just_symbols()))
531ed0d50c3Schristos         return false;
532ed0d50c3Schristos 
533ed0d50c3Schristos       if (!parameters->options().muldefs())
534ed0d50c3Schristos 	Symbol_table::report_resolve_problem(true,
535ed0d50c3Schristos 					     _("multiple definition of '%s'"),
536ed0d50c3Schristos 					     to, defined, object);
537ed0d50c3Schristos       return false;
538ed0d50c3Schristos 
539ed0d50c3Schristos     case WEAK_DEF * 16 + DEF:
540ed0d50c3Schristos       // We've seen a weak definition, and now we see a strong
541ed0d50c3Schristos       // definition.  In the original SVR4 linker, this was treated as
542ed0d50c3Schristos       // a multiple definition error.  In the Solaris linker and the
543ed0d50c3Schristos       // GNU linker, a weak definition followed by a regular
544ed0d50c3Schristos       // definition causes the weak definition to be overridden.  We
545ed0d50c3Schristos       // are currently compatible with the GNU linker.  In the future
546ed0d50c3Schristos       // we should add a target specific option to change this.
547ed0d50c3Schristos       // FIXME.
548ed0d50c3Schristos       return true;
549ed0d50c3Schristos 
550ed0d50c3Schristos     case DYN_DEF * 16 + DEF:
551ed0d50c3Schristos     case DYN_WEAK_DEF * 16 + DEF:
552ed0d50c3Schristos       // We've seen a definition in a dynamic object, and now we see a
553ed0d50c3Schristos       // definition in a regular object.  The definition in the
554ed0d50c3Schristos       // regular object overrides the definition in the dynamic
555ed0d50c3Schristos       // object.
556ed0d50c3Schristos       return true;
557ed0d50c3Schristos 
558ed0d50c3Schristos     case UNDEF * 16 + DEF:
559ed0d50c3Schristos     case WEAK_UNDEF * 16 + DEF:
560ed0d50c3Schristos     case DYN_UNDEF * 16 + DEF:
561ed0d50c3Schristos     case DYN_WEAK_UNDEF * 16 + DEF:
562ed0d50c3Schristos       // We've seen an undefined reference, and now we see a
563ed0d50c3Schristos       // definition.  We use the definition.
564ed0d50c3Schristos       return true;
565ed0d50c3Schristos 
566ed0d50c3Schristos     case COMMON * 16 + DEF:
567ed0d50c3Schristos     case WEAK_COMMON * 16 + DEF:
568ed0d50c3Schristos     case DYN_COMMON * 16 + DEF:
569ed0d50c3Schristos     case DYN_WEAK_COMMON * 16 + DEF:
570ed0d50c3Schristos       // We've seen a common symbol and now we see a definition.  The
571ed0d50c3Schristos       // definition overrides.
572ed0d50c3Schristos       if (parameters->options().warn_common())
573ed0d50c3Schristos 	Symbol_table::report_resolve_problem(false,
574ed0d50c3Schristos 					     _("definition of '%s' overriding "
575ed0d50c3Schristos 					       "common"),
576ed0d50c3Schristos 					     to, defined, object);
577ed0d50c3Schristos       return true;
578ed0d50c3Schristos 
579ed0d50c3Schristos     case DEF * 16 + WEAK_DEF:
580ed0d50c3Schristos     case WEAK_DEF * 16 + WEAK_DEF:
581ed0d50c3Schristos       // We've seen a definition and now we see a weak definition.  We
582ed0d50c3Schristos       // ignore the new weak definition.
583ed0d50c3Schristos       return false;
584ed0d50c3Schristos 
585ed0d50c3Schristos     case DYN_DEF * 16 + WEAK_DEF:
586ed0d50c3Schristos     case DYN_WEAK_DEF * 16 + WEAK_DEF:
587ed0d50c3Schristos       // We've seen a dynamic definition and now we see a regular weak
588ed0d50c3Schristos       // definition.  The regular weak definition overrides.
589ed0d50c3Schristos       return true;
590ed0d50c3Schristos 
591ed0d50c3Schristos     case UNDEF * 16 + WEAK_DEF:
592ed0d50c3Schristos     case WEAK_UNDEF * 16 + WEAK_DEF:
593ed0d50c3Schristos     case DYN_UNDEF * 16 + WEAK_DEF:
594ed0d50c3Schristos     case DYN_WEAK_UNDEF * 16 + WEAK_DEF:
595ed0d50c3Schristos       // A weak definition of a currently undefined symbol.
596ed0d50c3Schristos       return true;
597ed0d50c3Schristos 
598ed0d50c3Schristos     case COMMON * 16 + WEAK_DEF:
599ed0d50c3Schristos     case WEAK_COMMON * 16 + WEAK_DEF:
600ed0d50c3Schristos       // A weak definition does not override a common definition.
601ed0d50c3Schristos       return false;
602ed0d50c3Schristos 
603ed0d50c3Schristos     case DYN_COMMON * 16 + WEAK_DEF:
604ed0d50c3Schristos     case DYN_WEAK_COMMON * 16 + WEAK_DEF:
605ed0d50c3Schristos       // A weak definition does override a definition in a dynamic
606ed0d50c3Schristos       // object.
607ed0d50c3Schristos       if (parameters->options().warn_common())
608ed0d50c3Schristos 	Symbol_table::report_resolve_problem(false,
609ed0d50c3Schristos 					     _("definition of '%s' overriding "
610ed0d50c3Schristos 					       "dynamic common definition"),
611ed0d50c3Schristos 					     to, defined, object);
612ed0d50c3Schristos       return true;
613ed0d50c3Schristos 
614ed0d50c3Schristos     case DEF * 16 + DYN_DEF:
615ed0d50c3Schristos     case WEAK_DEF * 16 + DYN_DEF:
616ed0d50c3Schristos       // Ignore a dynamic definition if we already have a definition.
617ed0d50c3Schristos       return false;
618ed0d50c3Schristos 
619ed0d50c3Schristos     case DYN_DEF * 16 + DYN_DEF:
620ed0d50c3Schristos     case DYN_WEAK_DEF * 16 + DYN_DEF:
621ed0d50c3Schristos       // Ignore a dynamic definition if we already have a definition,
622ed0d50c3Schristos       // unless the existing definition is an unversioned definition
623ed0d50c3Schristos       // in the same dynamic object, and the new definition is a
624ed0d50c3Schristos       // default version.
625ed0d50c3Schristos       if (to->object() == object
626ed0d50c3Schristos           && to->version() == NULL
627ed0d50c3Schristos           && is_default_version)
628ed0d50c3Schristos         return true;
62906324dcfSchristos       // Or, if the existing definition is in an unused --as-needed library,
63006324dcfSchristos       // and the reference is weak, let the new definition override.
63106324dcfSchristos       if (to->in_reg()
63206324dcfSchristos 	  && to->is_undef_binding_weak()
63306324dcfSchristos 	  && to->object()->as_needed()
63406324dcfSchristos 	  && !to->object()->is_needed())
63506324dcfSchristos 	return true;
636ed0d50c3Schristos       return false;
637ed0d50c3Schristos 
638ed0d50c3Schristos     case UNDEF * 16 + DYN_DEF:
639ed0d50c3Schristos     case DYN_UNDEF * 16 + DYN_DEF:
640ed0d50c3Schristos     case DYN_WEAK_UNDEF * 16 + DYN_DEF:
641ed0d50c3Schristos       // Use a dynamic definition if we have a reference.
642ed0d50c3Schristos       return true;
643ed0d50c3Schristos 
644ed0d50c3Schristos     case WEAK_UNDEF * 16 + DYN_DEF:
645ed0d50c3Schristos       // When overriding a weak undef by a dynamic definition,
646ed0d50c3Schristos       // we need to remember that the original undef was weak.
647ed0d50c3Schristos       *adjust_dyndef = true;
648ed0d50c3Schristos       return true;
649ed0d50c3Schristos 
650ed0d50c3Schristos     case COMMON * 16 + DYN_DEF:
651ed0d50c3Schristos     case WEAK_COMMON * 16 + DYN_DEF:
652ed0d50c3Schristos       // Ignore a dynamic definition if we already have a common
653ed0d50c3Schristos       // definition.
654ed0d50c3Schristos       return false;
655ed0d50c3Schristos 
656ed0d50c3Schristos     case DEF * 16 + DYN_WEAK_DEF:
657ed0d50c3Schristos     case WEAK_DEF * 16 + DYN_WEAK_DEF:
658ed0d50c3Schristos       // Ignore a weak dynamic definition if we already have a
659ed0d50c3Schristos       // definition.
660ed0d50c3Schristos       return false;
661ed0d50c3Schristos 
662ed0d50c3Schristos     case UNDEF * 16 + DYN_WEAK_DEF:
663ed0d50c3Schristos       // When overriding an undef by a dynamic weak definition,
664ed0d50c3Schristos       // we need to remember that the original undef was not weak.
665ed0d50c3Schristos       *adjust_dyndef = true;
666ed0d50c3Schristos       return true;
667ed0d50c3Schristos 
668ed0d50c3Schristos     case DYN_UNDEF * 16 + DYN_WEAK_DEF:
669ed0d50c3Schristos     case DYN_WEAK_UNDEF * 16 + DYN_WEAK_DEF:
670ed0d50c3Schristos       // Use a weak dynamic definition if we have a reference.
671ed0d50c3Schristos       return true;
672ed0d50c3Schristos 
673ed0d50c3Schristos     case WEAK_UNDEF * 16 + DYN_WEAK_DEF:
674ed0d50c3Schristos       // When overriding a weak undef by a dynamic definition,
675ed0d50c3Schristos       // we need to remember that the original undef was weak.
676ed0d50c3Schristos       *adjust_dyndef = true;
677ed0d50c3Schristos       return true;
678ed0d50c3Schristos 
679ed0d50c3Schristos     case COMMON * 16 + DYN_WEAK_DEF:
680ed0d50c3Schristos     case WEAK_COMMON * 16 + DYN_WEAK_DEF:
681ed0d50c3Schristos       // Ignore a weak dynamic definition if we already have a common
682ed0d50c3Schristos       // definition.
683ed0d50c3Schristos       return false;
684ed0d50c3Schristos 
68506324dcfSchristos     case DYN_COMMON * 16 + DYN_DEF:
68606324dcfSchristos     case DYN_WEAK_COMMON * 16 + DYN_DEF:
68706324dcfSchristos     case DYN_DEF * 16 + DYN_WEAK_DEF:
68806324dcfSchristos     case DYN_WEAK_DEF * 16 + DYN_WEAK_DEF:
68906324dcfSchristos     case DYN_COMMON * 16 + DYN_WEAK_DEF:
69006324dcfSchristos     case DYN_WEAK_COMMON * 16 + DYN_WEAK_DEF:
69106324dcfSchristos       // If the existing definition is in an unused --as-needed library,
69206324dcfSchristos       // and the reference is weak, let a new dynamic definition override.
69306324dcfSchristos       if (to->in_reg()
69406324dcfSchristos 	  && to->is_undef_binding_weak()
69506324dcfSchristos 	  && to->object()->as_needed()
69606324dcfSchristos 	  && !to->object()->is_needed())
69706324dcfSchristos 	return true;
69806324dcfSchristos       return false;
69906324dcfSchristos 
700ed0d50c3Schristos     case DEF * 16 + UNDEF:
701ed0d50c3Schristos     case WEAK_DEF * 16 + UNDEF:
702ed0d50c3Schristos     case UNDEF * 16 + UNDEF:
703ed0d50c3Schristos       // A new undefined reference tells us nothing.
704ed0d50c3Schristos       return false;
705ed0d50c3Schristos 
706ed0d50c3Schristos     case DYN_DEF * 16 + UNDEF:
707ed0d50c3Schristos     case DYN_WEAK_DEF * 16 + UNDEF:
708ed0d50c3Schristos       // For a dynamic def, we need to remember which kind of undef we see.
709ed0d50c3Schristos       *adjust_dyndef = true;
710ed0d50c3Schristos       return false;
711ed0d50c3Schristos 
712ed0d50c3Schristos     case WEAK_UNDEF * 16 + UNDEF:
713ed0d50c3Schristos     case DYN_UNDEF * 16 + UNDEF:
714ed0d50c3Schristos     case DYN_WEAK_UNDEF * 16 + UNDEF:
715ed0d50c3Schristos       // A strong undef overrides a dynamic or weak undef.
716ed0d50c3Schristos       return true;
717ed0d50c3Schristos 
718ed0d50c3Schristos     case COMMON * 16 + UNDEF:
719ed0d50c3Schristos     case WEAK_COMMON * 16 + UNDEF:
720ed0d50c3Schristos     case DYN_COMMON * 16 + UNDEF:
721ed0d50c3Schristos     case DYN_WEAK_COMMON * 16 + UNDEF:
722ed0d50c3Schristos       // A new undefined reference tells us nothing.
723ed0d50c3Schristos       return false;
724ed0d50c3Schristos 
725ed0d50c3Schristos     case DEF * 16 + WEAK_UNDEF:
726ed0d50c3Schristos     case WEAK_DEF * 16 + WEAK_UNDEF:
727ed0d50c3Schristos     case UNDEF * 16 + WEAK_UNDEF:
728ed0d50c3Schristos     case WEAK_UNDEF * 16 + WEAK_UNDEF:
729ed0d50c3Schristos     case DYN_UNDEF * 16 + WEAK_UNDEF:
730ed0d50c3Schristos     case COMMON * 16 + WEAK_UNDEF:
731ed0d50c3Schristos     case WEAK_COMMON * 16 + WEAK_UNDEF:
732ed0d50c3Schristos     case DYN_COMMON * 16 + WEAK_UNDEF:
733ed0d50c3Schristos     case DYN_WEAK_COMMON * 16 + WEAK_UNDEF:
734ed0d50c3Schristos       // A new weak undefined reference tells us nothing unless the
735ed0d50c3Schristos       // exisiting symbol is a dynamic weak reference.
736ed0d50c3Schristos       return false;
737ed0d50c3Schristos 
738ed0d50c3Schristos     case DYN_WEAK_UNDEF * 16 + WEAK_UNDEF:
739ed0d50c3Schristos       // A new weak reference overrides an existing dynamic weak reference.
740ed0d50c3Schristos       // This is necessary because a dynamic weak reference remembers
741ed0d50c3Schristos       // the old binding, which may not be weak.  If we keeps the existing
742ed0d50c3Schristos       // dynamic weak reference, the weakness may be dropped in the output.
743ed0d50c3Schristos       return true;
744ed0d50c3Schristos 
745ed0d50c3Schristos     case DYN_DEF * 16 + WEAK_UNDEF:
746ed0d50c3Schristos     case DYN_WEAK_DEF * 16 + WEAK_UNDEF:
747ed0d50c3Schristos       // For a dynamic def, we need to remember which kind of undef we see.
748ed0d50c3Schristos       *adjust_dyndef = true;
749ed0d50c3Schristos       return false;
750ed0d50c3Schristos 
751ed0d50c3Schristos     case DEF * 16 + DYN_UNDEF:
752ed0d50c3Schristos     case WEAK_DEF * 16 + DYN_UNDEF:
753ed0d50c3Schristos     case DYN_DEF * 16 + DYN_UNDEF:
754ed0d50c3Schristos     case DYN_WEAK_DEF * 16 + DYN_UNDEF:
755ed0d50c3Schristos     case UNDEF * 16 + DYN_UNDEF:
756ed0d50c3Schristos     case WEAK_UNDEF * 16 + DYN_UNDEF:
757ed0d50c3Schristos     case DYN_UNDEF * 16 + DYN_UNDEF:
758ed0d50c3Schristos     case DYN_WEAK_UNDEF * 16 + DYN_UNDEF:
759ed0d50c3Schristos     case COMMON * 16 + DYN_UNDEF:
760ed0d50c3Schristos     case WEAK_COMMON * 16 + DYN_UNDEF:
761ed0d50c3Schristos     case DYN_COMMON * 16 + DYN_UNDEF:
762ed0d50c3Schristos     case DYN_WEAK_COMMON * 16 + DYN_UNDEF:
763ed0d50c3Schristos       // A new dynamic undefined reference tells us nothing.
764ed0d50c3Schristos       return false;
765ed0d50c3Schristos 
766ed0d50c3Schristos     case DEF * 16 + DYN_WEAK_UNDEF:
767ed0d50c3Schristos     case WEAK_DEF * 16 + DYN_WEAK_UNDEF:
768ed0d50c3Schristos     case DYN_DEF * 16 + DYN_WEAK_UNDEF:
769ed0d50c3Schristos     case DYN_WEAK_DEF * 16 + DYN_WEAK_UNDEF:
770ed0d50c3Schristos     case UNDEF * 16 + DYN_WEAK_UNDEF:
771ed0d50c3Schristos     case WEAK_UNDEF * 16 + DYN_WEAK_UNDEF:
772ed0d50c3Schristos     case DYN_UNDEF * 16 + DYN_WEAK_UNDEF:
773ed0d50c3Schristos     case DYN_WEAK_UNDEF * 16 + DYN_WEAK_UNDEF:
774ed0d50c3Schristos     case COMMON * 16 + DYN_WEAK_UNDEF:
775ed0d50c3Schristos     case WEAK_COMMON * 16 + DYN_WEAK_UNDEF:
776ed0d50c3Schristos     case DYN_COMMON * 16 + DYN_WEAK_UNDEF:
777ed0d50c3Schristos     case DYN_WEAK_COMMON * 16 + DYN_WEAK_UNDEF:
778ed0d50c3Schristos       // A new weak dynamic undefined reference tells us nothing.
779ed0d50c3Schristos       return false;
780ed0d50c3Schristos 
781ed0d50c3Schristos     case DEF * 16 + COMMON:
782ed0d50c3Schristos       // A common symbol does not override a definition.
783ed0d50c3Schristos       if (parameters->options().warn_common())
784ed0d50c3Schristos 	Symbol_table::report_resolve_problem(false,
785ed0d50c3Schristos 					     _("common '%s' overridden by "
786ed0d50c3Schristos 					       "previous definition"),
787ed0d50c3Schristos 					     to, defined, object);
788ed0d50c3Schristos       return false;
789ed0d50c3Schristos 
790ed0d50c3Schristos     case WEAK_DEF * 16 + COMMON:
791ed0d50c3Schristos     case DYN_DEF * 16 + COMMON:
792ed0d50c3Schristos     case DYN_WEAK_DEF * 16 + COMMON:
793ed0d50c3Schristos       // A common symbol does override a weak definition or a dynamic
794ed0d50c3Schristos       // definition.
795ed0d50c3Schristos       return true;
796ed0d50c3Schristos 
797ed0d50c3Schristos     case UNDEF * 16 + COMMON:
798ed0d50c3Schristos     case WEAK_UNDEF * 16 + COMMON:
799ed0d50c3Schristos     case DYN_UNDEF * 16 + COMMON:
800ed0d50c3Schristos     case DYN_WEAK_UNDEF * 16 + COMMON:
801ed0d50c3Schristos       // A common symbol is a definition for a reference.
802ed0d50c3Schristos       return true;
803ed0d50c3Schristos 
804ed0d50c3Schristos     case COMMON * 16 + COMMON:
805ed0d50c3Schristos       // Set the size to the maximum.
806ed0d50c3Schristos       *adjust_common_sizes = true;
807ed0d50c3Schristos       return false;
808ed0d50c3Schristos 
809ed0d50c3Schristos     case WEAK_COMMON * 16 + COMMON:
810ed0d50c3Schristos       // I'm not sure just what a weak common symbol means, but
811ed0d50c3Schristos       // presumably it can be overridden by a regular common symbol.
812ed0d50c3Schristos       return true;
813ed0d50c3Schristos 
814ed0d50c3Schristos     case DYN_COMMON * 16 + COMMON:
815ed0d50c3Schristos     case DYN_WEAK_COMMON * 16 + COMMON:
816ed0d50c3Schristos       // Use the real common symbol, but adjust the size if necessary.
817ed0d50c3Schristos       *adjust_common_sizes = true;
818ed0d50c3Schristos       return true;
819ed0d50c3Schristos 
820ed0d50c3Schristos     case DEF * 16 + WEAK_COMMON:
821ed0d50c3Schristos     case WEAK_DEF * 16 + WEAK_COMMON:
822ed0d50c3Schristos     case DYN_DEF * 16 + WEAK_COMMON:
823ed0d50c3Schristos     case DYN_WEAK_DEF * 16 + WEAK_COMMON:
824ed0d50c3Schristos       // Whatever a weak common symbol is, it won't override a
825ed0d50c3Schristos       // definition.
826ed0d50c3Schristos       return false;
827ed0d50c3Schristos 
828ed0d50c3Schristos     case UNDEF * 16 + WEAK_COMMON:
829ed0d50c3Schristos     case WEAK_UNDEF * 16 + WEAK_COMMON:
830ed0d50c3Schristos     case DYN_UNDEF * 16 + WEAK_COMMON:
831ed0d50c3Schristos     case DYN_WEAK_UNDEF * 16 + WEAK_COMMON:
832ed0d50c3Schristos       // A weak common symbol is better than an undefined symbol.
833ed0d50c3Schristos       return true;
834ed0d50c3Schristos 
835ed0d50c3Schristos     case COMMON * 16 + WEAK_COMMON:
836ed0d50c3Schristos     case WEAK_COMMON * 16 + WEAK_COMMON:
837ed0d50c3Schristos     case DYN_COMMON * 16 + WEAK_COMMON:
838ed0d50c3Schristos     case DYN_WEAK_COMMON * 16 + WEAK_COMMON:
839ed0d50c3Schristos       // Ignore a weak common symbol in the presence of a real common
840ed0d50c3Schristos       // symbol.
841ed0d50c3Schristos       return false;
842ed0d50c3Schristos 
843ed0d50c3Schristos     case DEF * 16 + DYN_COMMON:
844ed0d50c3Schristos     case WEAK_DEF * 16 + DYN_COMMON:
845ed0d50c3Schristos     case DYN_DEF * 16 + DYN_COMMON:
846ed0d50c3Schristos     case DYN_WEAK_DEF * 16 + DYN_COMMON:
847ed0d50c3Schristos       // Ignore a dynamic common symbol in the presence of a
848ed0d50c3Schristos       // definition.
849ed0d50c3Schristos       return false;
850ed0d50c3Schristos 
851ed0d50c3Schristos     case UNDEF * 16 + DYN_COMMON:
852ed0d50c3Schristos     case WEAK_UNDEF * 16 + DYN_COMMON:
853ed0d50c3Schristos     case DYN_UNDEF * 16 + DYN_COMMON:
854ed0d50c3Schristos     case DYN_WEAK_UNDEF * 16 + DYN_COMMON:
855ed0d50c3Schristos       // A dynamic common symbol is a definition of sorts.
856ed0d50c3Schristos       return true;
857ed0d50c3Schristos 
858ed0d50c3Schristos     case COMMON * 16 + DYN_COMMON:
859ed0d50c3Schristos     case WEAK_COMMON * 16 + DYN_COMMON:
860ed0d50c3Schristos     case DYN_COMMON * 16 + DYN_COMMON:
861ed0d50c3Schristos     case DYN_WEAK_COMMON * 16 + DYN_COMMON:
862ed0d50c3Schristos       // Set the size to the maximum.
863ed0d50c3Schristos       *adjust_common_sizes = true;
864ed0d50c3Schristos       return false;
865ed0d50c3Schristos 
866ed0d50c3Schristos     case DEF * 16 + DYN_WEAK_COMMON:
867ed0d50c3Schristos     case WEAK_DEF * 16 + DYN_WEAK_COMMON:
868ed0d50c3Schristos     case DYN_DEF * 16 + DYN_WEAK_COMMON:
869ed0d50c3Schristos     case DYN_WEAK_DEF * 16 + DYN_WEAK_COMMON:
870ed0d50c3Schristos       // A common symbol is ignored in the face of a definition.
871ed0d50c3Schristos       return false;
872ed0d50c3Schristos 
873ed0d50c3Schristos     case UNDEF * 16 + DYN_WEAK_COMMON:
874ed0d50c3Schristos     case WEAK_UNDEF * 16 + DYN_WEAK_COMMON:
875ed0d50c3Schristos     case DYN_UNDEF * 16 + DYN_WEAK_COMMON:
876ed0d50c3Schristos     case DYN_WEAK_UNDEF * 16 + DYN_WEAK_COMMON:
877ed0d50c3Schristos       // I guess a weak common symbol is better than a definition.
878ed0d50c3Schristos       return true;
879ed0d50c3Schristos 
880ed0d50c3Schristos     case COMMON * 16 + DYN_WEAK_COMMON:
881ed0d50c3Schristos     case WEAK_COMMON * 16 + DYN_WEAK_COMMON:
882ed0d50c3Schristos     case DYN_COMMON * 16 + DYN_WEAK_COMMON:
883ed0d50c3Schristos     case DYN_WEAK_COMMON * 16 + DYN_WEAK_COMMON:
884ed0d50c3Schristos       // Set the size to the maximum.
885ed0d50c3Schristos       *adjust_common_sizes = true;
886ed0d50c3Schristos       return false;
887ed0d50c3Schristos 
888ed0d50c3Schristos     default:
889ed0d50c3Schristos       gold_unreachable();
890ed0d50c3Schristos     }
891ed0d50c3Schristos }
892ed0d50c3Schristos 
893ed0d50c3Schristos // Issue an error or warning due to symbol resolution.  IS_ERROR
894ed0d50c3Schristos // indicates an error rather than a warning.  MSG is the error
895ed0d50c3Schristos // message; it is expected to have a %s for the symbol name.  TO is
896ed0d50c3Schristos // the existing symbol.  DEFINED/OBJECT is where the new symbol was
897ed0d50c3Schristos // found.
898ed0d50c3Schristos 
899ed0d50c3Schristos // FIXME: We should have better location information here.  When the
900ed0d50c3Schristos // symbol is defined, we should be able to pull the location from the
901ed0d50c3Schristos // debug info if there is any.
902ed0d50c3Schristos 
903ed0d50c3Schristos void
report_resolve_problem(bool is_error,const char * msg,const Symbol * to,Defined defined,Object * object)904ed0d50c3Schristos Symbol_table::report_resolve_problem(bool is_error, const char* msg,
905ed0d50c3Schristos 				     const Symbol* to, Defined defined,
906ed0d50c3Schristos 				     Object* object)
907ed0d50c3Schristos {
908ed0d50c3Schristos   std::string demangled(to->demangled_name());
909ed0d50c3Schristos   size_t len = strlen(msg) + demangled.length() + 10;
910ed0d50c3Schristos   char* buf = new char[len];
911ed0d50c3Schristos   snprintf(buf, len, msg, demangled.c_str());
912ed0d50c3Schristos 
913ed0d50c3Schristos   const char* objname;
914ed0d50c3Schristos   switch (defined)
915ed0d50c3Schristos     {
916ed0d50c3Schristos     case OBJECT:
917ed0d50c3Schristos       objname = object->name().c_str();
918ed0d50c3Schristos       break;
919ed0d50c3Schristos     case COPY:
920ed0d50c3Schristos       objname = _("COPY reloc");
921ed0d50c3Schristos       break;
922ed0d50c3Schristos     case DEFSYM:
923ed0d50c3Schristos     case UNDEFINED:
924ed0d50c3Schristos       objname = _("command line");
925ed0d50c3Schristos       break;
926ed0d50c3Schristos     case SCRIPT:
927ed0d50c3Schristos       objname = _("linker script");
928ed0d50c3Schristos       break;
929ed0d50c3Schristos     case PREDEFINED:
930ed0d50c3Schristos     case INCREMENTAL_BASE:
931ed0d50c3Schristos       objname = _("linker defined");
932ed0d50c3Schristos       break;
933ed0d50c3Schristos     default:
934ed0d50c3Schristos       gold_unreachable();
935ed0d50c3Schristos     }
936ed0d50c3Schristos 
937ed0d50c3Schristos   if (is_error)
938ed0d50c3Schristos     gold_error("%s: %s", objname, buf);
939ed0d50c3Schristos   else
940ed0d50c3Schristos     gold_warning("%s: %s", objname, buf);
941ed0d50c3Schristos 
942ed0d50c3Schristos   delete[] buf;
943ed0d50c3Schristos 
944ed0d50c3Schristos   if (to->source() == Symbol::FROM_OBJECT)
945ed0d50c3Schristos     objname = to->object()->name().c_str();
946ed0d50c3Schristos   else
947ed0d50c3Schristos     objname = _("command line");
948ed0d50c3Schristos   gold_info("%s: %s: previous definition here", program_name, objname);
949ed0d50c3Schristos }
950ed0d50c3Schristos 
95106324dcfSchristos // Completely override existing symbol.  Everything bar name_,
95206324dcfSchristos // version_, and is_forced_local_ flag are copied.  version_ is
95306324dcfSchristos // cleared if from->version_ is clear.  Returns true if this symbol
95406324dcfSchristos // should be forced local.
95506324dcfSchristos bool
clone(const Symbol * from)95606324dcfSchristos Symbol::clone(const Symbol* from)
95706324dcfSchristos {
95806324dcfSchristos   // Don't allow cloning after dynamic linking info is attached to symbols.
95906324dcfSchristos   // We aren't prepared to merge such.
96006324dcfSchristos   gold_assert(!this->has_symtab_index() && !from->has_symtab_index());
96106324dcfSchristos   gold_assert(!this->has_dynsym_index() && !from->has_dynsym_index());
96206324dcfSchristos   gold_assert(this->got_offset_list() == NULL
96306324dcfSchristos 	      && from->got_offset_list() == NULL);
96406324dcfSchristos   gold_assert(!this->has_plt_offset() && !from->has_plt_offset());
96506324dcfSchristos 
96606324dcfSchristos   if (!from->version_)
96706324dcfSchristos     this->version_ = from->version_;
96806324dcfSchristos   this->u1_ = from->u1_;
96906324dcfSchristos   this->u2_ = from->u2_;
97006324dcfSchristos   this->type_ = from->type_;
97106324dcfSchristos   this->binding_ = from->binding_;
97206324dcfSchristos   this->visibility_ = from->visibility_;
97306324dcfSchristos   this->nonvis_ = from->nonvis_;
97406324dcfSchristos   this->source_ = from->source_;
97506324dcfSchristos   this->is_def_ = from->is_def_;
97606324dcfSchristos   this->is_forwarder_ = from->is_forwarder_;
97706324dcfSchristos   this->has_alias_ = from->has_alias_;
97806324dcfSchristos   this->needs_dynsym_entry_ = from->needs_dynsym_entry_;
97906324dcfSchristos   this->in_reg_ = from->in_reg_;
98006324dcfSchristos   this->in_dyn_ = from->in_dyn_;
98106324dcfSchristos   this->needs_dynsym_value_ = from->needs_dynsym_value_;
98206324dcfSchristos   this->has_warning_ = from->has_warning_;
98306324dcfSchristos   this->is_copied_from_dynobj_ = from->is_copied_from_dynobj_;
98406324dcfSchristos   this->is_ordinary_shndx_ = from->is_ordinary_shndx_;
98506324dcfSchristos   this->in_real_elf_ = from->in_real_elf_;
98606324dcfSchristos   this->is_defined_in_discarded_section_
98706324dcfSchristos     = from->is_defined_in_discarded_section_;
98806324dcfSchristos   this->undef_binding_set_ = from->undef_binding_set_;
98906324dcfSchristos   this->undef_binding_weak_ = from->undef_binding_weak_;
99006324dcfSchristos   this->is_predefined_ = from->is_predefined_;
99106324dcfSchristos   this->is_protected_ = from->is_protected_;
99206324dcfSchristos   this->non_zero_localentry_ = from->non_zero_localentry_;
99306324dcfSchristos 
99406324dcfSchristos   return !this->is_forced_local_ && from->is_forced_local_;
99506324dcfSchristos }
99606324dcfSchristos 
99706324dcfSchristos template <int size>
99806324dcfSchristos bool
clone(const Sized_symbol<size> * from)99906324dcfSchristos Sized_symbol<size>::clone(const Sized_symbol<size>* from)
100006324dcfSchristos {
100106324dcfSchristos   this->value_ = from->value_;
100206324dcfSchristos   this->symsize_ = from->symsize_;
100306324dcfSchristos   return Symbol::clone(from);
100406324dcfSchristos }
100506324dcfSchristos 
1006ed0d50c3Schristos // A special case of should_override which is only called for a strong
1007ed0d50c3Schristos // defined symbol from a regular object file.  This is used when
1008ed0d50c3Schristos // defining special symbols.
1009ed0d50c3Schristos 
1010ed0d50c3Schristos bool
should_override_with_special(const Symbol * to,elfcpp::STT fromtype,Defined defined)1011ed0d50c3Schristos Symbol_table::should_override_with_special(const Symbol* to,
1012ed0d50c3Schristos 					   elfcpp::STT fromtype,
1013ed0d50c3Schristos 					   Defined defined)
1014ed0d50c3Schristos {
1015ed0d50c3Schristos   bool adjust_common_sizes;
1016ed0d50c3Schristos   bool adjust_dyn_def;
1017ed0d50c3Schristos   unsigned int frombits = global_flag | regular_flag | def_flag;
1018ed0d50c3Schristos   bool ret = Symbol_table::should_override(to, frombits, fromtype, defined,
1019ed0d50c3Schristos 					   NULL, &adjust_common_sizes,
1020ed0d50c3Schristos 					   &adjust_dyn_def, false);
1021ed0d50c3Schristos   gold_assert(!adjust_common_sizes && !adjust_dyn_def);
1022ed0d50c3Schristos   return ret;
1023ed0d50c3Schristos }
1024ed0d50c3Schristos 
1025ed0d50c3Schristos // Override symbol base with a special symbol.
1026ed0d50c3Schristos 
1027ed0d50c3Schristos void
override_base_with_special(const Symbol * from)1028ed0d50c3Schristos Symbol::override_base_with_special(const Symbol* from)
1029ed0d50c3Schristos {
1030ed0d50c3Schristos   bool same_name = this->name_ == from->name_;
1031ed0d50c3Schristos   gold_assert(same_name || this->has_alias());
1032ed0d50c3Schristos 
1033ed0d50c3Schristos   // If we are overriding an undef, remember the original binding.
1034ed0d50c3Schristos   if (this->is_undefined())
1035ed0d50c3Schristos     this->set_undef_binding(this->binding_);
1036ed0d50c3Schristos 
1037ed0d50c3Schristos   this->source_ = from->source_;
1038ed0d50c3Schristos   switch (from->source_)
1039ed0d50c3Schristos     {
1040ed0d50c3Schristos     case FROM_OBJECT:
1041ed0d50c3Schristos     case IN_OUTPUT_DATA:
1042ed0d50c3Schristos     case IN_OUTPUT_SEGMENT:
104306324dcfSchristos       this->u1_ = from->u1_;
104406324dcfSchristos       this->u2_ = from->u2_;
1045ed0d50c3Schristos       break;
1046ed0d50c3Schristos     case IS_CONSTANT:
1047ed0d50c3Schristos     case IS_UNDEFINED:
1048ed0d50c3Schristos       break;
1049ed0d50c3Schristos     default:
1050ed0d50c3Schristos       gold_unreachable();
1051ed0d50c3Schristos       break;
1052ed0d50c3Schristos     }
1053ed0d50c3Schristos 
1054ed0d50c3Schristos   if (same_name)
1055ed0d50c3Schristos     {
1056ed0d50c3Schristos       // When overriding a versioned symbol with a special symbol, we
1057ed0d50c3Schristos       // may be changing the version.  This will happen if we see a
1058ed0d50c3Schristos       // special symbol such as "_end" defined in a shared object with
1059ed0d50c3Schristos       // one version (from a version script), but we want to define it
1060ed0d50c3Schristos       // here with a different version (from a different version
1061ed0d50c3Schristos       // script).
1062ed0d50c3Schristos       this->version_ = from->version_;
1063ed0d50c3Schristos     }
1064ed0d50c3Schristos   this->type_ = from->type_;
1065ed0d50c3Schristos   this->binding_ = from->binding_;
1066ed0d50c3Schristos   this->override_visibility(from->visibility_);
1067ed0d50c3Schristos   this->nonvis_ = from->nonvis_;
1068ed0d50c3Schristos 
1069ed0d50c3Schristos   // Special symbols are always considered to be regular symbols.
1070ed0d50c3Schristos   this->in_reg_ = true;
1071ed0d50c3Schristos 
1072ed0d50c3Schristos   if (from->needs_dynsym_entry_)
1073ed0d50c3Schristos     this->needs_dynsym_entry_ = true;
1074ed0d50c3Schristos   if (from->needs_dynsym_value_)
1075ed0d50c3Schristos     this->needs_dynsym_value_ = true;
1076ed0d50c3Schristos 
1077ed0d50c3Schristos   this->is_predefined_ = from->is_predefined_;
1078ed0d50c3Schristos 
1079ed0d50c3Schristos   // We shouldn't see these flags.  If we do, we need to handle them
1080ed0d50c3Schristos   // somehow.
1081ed0d50c3Schristos   gold_assert(!from->is_forwarder_);
1082ed0d50c3Schristos   gold_assert(!from->has_plt_offset());
1083ed0d50c3Schristos   gold_assert(!from->has_warning_);
1084ed0d50c3Schristos   gold_assert(!from->is_copied_from_dynobj_);
1085ed0d50c3Schristos   gold_assert(!from->is_forced_local_);
1086ed0d50c3Schristos }
1087ed0d50c3Schristos 
1088ed0d50c3Schristos // Override a symbol with a special symbol.
1089ed0d50c3Schristos 
1090ed0d50c3Schristos template<int size>
1091ed0d50c3Schristos void
override_with_special(const Sized_symbol<size> * from)1092ed0d50c3Schristos Sized_symbol<size>::override_with_special(const Sized_symbol<size>* from)
1093ed0d50c3Schristos {
1094ed0d50c3Schristos   this->override_base_with_special(from);
1095ed0d50c3Schristos   this->value_ = from->value_;
1096ed0d50c3Schristos   this->symsize_ = from->symsize_;
1097ed0d50c3Schristos }
1098ed0d50c3Schristos 
1099ed0d50c3Schristos // Override TOSYM with the special symbol FROMSYM.  This handles all
1100ed0d50c3Schristos // aliases of TOSYM.
1101ed0d50c3Schristos 
1102ed0d50c3Schristos template<int size>
1103ed0d50c3Schristos void
override_with_special(Sized_symbol<size> * tosym,const Sized_symbol<size> * fromsym)1104ed0d50c3Schristos Symbol_table::override_with_special(Sized_symbol<size>* tosym,
1105ed0d50c3Schristos 				    const Sized_symbol<size>* fromsym)
1106ed0d50c3Schristos {
1107ed0d50c3Schristos   tosym->override_with_special(fromsym);
1108ed0d50c3Schristos   if (tosym->has_alias())
1109ed0d50c3Schristos     {
1110ed0d50c3Schristos       Symbol* sym = this->weak_aliases_[tosym];
1111ed0d50c3Schristos       gold_assert(sym != NULL);
1112ed0d50c3Schristos       Sized_symbol<size>* ssym = this->get_sized_symbol<size>(sym);
1113ed0d50c3Schristos       do
1114ed0d50c3Schristos 	{
1115ed0d50c3Schristos 	  ssym->override_with_special(fromsym);
1116ed0d50c3Schristos 	  sym = this->weak_aliases_[ssym];
1117ed0d50c3Schristos 	  gold_assert(sym != NULL);
1118ed0d50c3Schristos 	  ssym = this->get_sized_symbol<size>(sym);
1119ed0d50c3Schristos 	}
1120ed0d50c3Schristos       while (ssym != tosym);
1121ed0d50c3Schristos     }
1122ed0d50c3Schristos   if (tosym->binding() == elfcpp::STB_LOCAL
1123ed0d50c3Schristos       || ((tosym->visibility() == elfcpp::STV_HIDDEN
1124ed0d50c3Schristos 	   || tosym->visibility() == elfcpp::STV_INTERNAL)
1125ed0d50c3Schristos 	  && (tosym->binding() == elfcpp::STB_GLOBAL
1126ed0d50c3Schristos 	      || tosym->binding() == elfcpp::STB_GNU_UNIQUE
1127ed0d50c3Schristos 	      || tosym->binding() == elfcpp::STB_WEAK)
1128ed0d50c3Schristos 	  && !parameters->options().relocatable()))
1129ed0d50c3Schristos     this->force_local(tosym);
1130ed0d50c3Schristos }
1131ed0d50c3Schristos 
1132ed0d50c3Schristos // Instantiate the templates we need.  We could use the configure
1133ed0d50c3Schristos // script to restrict this to only the ones needed for implemented
1134ed0d50c3Schristos // targets.
1135ed0d50c3Schristos 
1136ed0d50c3Schristos // We have to instantiate both big and little endian versions because
1137ed0d50c3Schristos // these are used by other templates that depends on size only.
1138ed0d50c3Schristos 
1139ed0d50c3Schristos #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
1140ed0d50c3Schristos template
1141ed0d50c3Schristos void
1142ed0d50c3Schristos Symbol_table::resolve<32, false>(
1143ed0d50c3Schristos     Sized_symbol<32>* to,
1144ed0d50c3Schristos     const elfcpp::Sym<32, false>& sym,
1145ed0d50c3Schristos     unsigned int st_shndx,
1146ed0d50c3Schristos     bool is_ordinary,
1147ed0d50c3Schristos     unsigned int orig_st_shndx,
1148ed0d50c3Schristos     Object* object,
1149ed0d50c3Schristos     const char* version,
1150ed0d50c3Schristos     bool is_default_version);
1151ed0d50c3Schristos 
1152ed0d50c3Schristos template
1153ed0d50c3Schristos void
1154ed0d50c3Schristos Symbol_table::resolve<32, true>(
1155ed0d50c3Schristos     Sized_symbol<32>* to,
1156ed0d50c3Schristos     const elfcpp::Sym<32, true>& sym,
1157ed0d50c3Schristos     unsigned int st_shndx,
1158ed0d50c3Schristos     bool is_ordinary,
1159ed0d50c3Schristos     unsigned int orig_st_shndx,
1160ed0d50c3Schristos     Object* object,
1161ed0d50c3Schristos     const char* version,
1162ed0d50c3Schristos     bool is_default_version);
1163ed0d50c3Schristos #endif
1164ed0d50c3Schristos 
1165ed0d50c3Schristos #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
1166ed0d50c3Schristos template
1167ed0d50c3Schristos void
1168ed0d50c3Schristos Symbol_table::resolve<64, false>(
1169ed0d50c3Schristos     Sized_symbol<64>* to,
1170ed0d50c3Schristos     const elfcpp::Sym<64, false>& sym,
1171ed0d50c3Schristos     unsigned int st_shndx,
1172ed0d50c3Schristos     bool is_ordinary,
1173ed0d50c3Schristos     unsigned int orig_st_shndx,
1174ed0d50c3Schristos     Object* object,
1175ed0d50c3Schristos     const char* version,
1176ed0d50c3Schristos     bool is_default_version);
1177ed0d50c3Schristos 
1178ed0d50c3Schristos template
1179ed0d50c3Schristos void
1180ed0d50c3Schristos Symbol_table::resolve<64, true>(
1181ed0d50c3Schristos     Sized_symbol<64>* to,
1182ed0d50c3Schristos     const elfcpp::Sym<64, true>& sym,
1183ed0d50c3Schristos     unsigned int st_shndx,
1184ed0d50c3Schristos     bool is_ordinary,
1185ed0d50c3Schristos     unsigned int orig_st_shndx,
1186ed0d50c3Schristos     Object* object,
1187ed0d50c3Schristos     const char* version,
1188ed0d50c3Schristos     bool is_default_version);
1189ed0d50c3Schristos #endif
1190ed0d50c3Schristos 
1191ed0d50c3Schristos #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
1192ed0d50c3Schristos template
1193ed0d50c3Schristos void
1194ed0d50c3Schristos Symbol_table::override_with_special<32>(Sized_symbol<32>*,
1195ed0d50c3Schristos 					const Sized_symbol<32>*);
1196ed0d50c3Schristos #endif
1197ed0d50c3Schristos 
1198ed0d50c3Schristos #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
1199ed0d50c3Schristos template
1200ed0d50c3Schristos void
1201ed0d50c3Schristos Symbol_table::override_with_special<64>(Sized_symbol<64>*,
1202ed0d50c3Schristos 					const Sized_symbol<64>*);
1203ed0d50c3Schristos #endif
1204ed0d50c3Schristos 
120506324dcfSchristos template
120606324dcfSchristos bool
120706324dcfSchristos Sized_symbol<32>::clone(const Sized_symbol<32>*);
120806324dcfSchristos 
120906324dcfSchristos template
121006324dcfSchristos bool
121106324dcfSchristos Sized_symbol<64>::clone(const Sized_symbol<64>*);
1212ed0d50c3Schristos } // End namespace gold.
1213