OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [gold/] [symtab.cc] - Blame information for rev 148

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.