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

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-binutils/] [binutils-2.19.1/] [gold/] [object.h] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 jlechner
// object.h -- support for an object file for linking in gold  -*- C++ -*-
2
 
3
// Copyright 2006, 2007, 2008 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
#ifndef GOLD_OBJECT_H
24
#define GOLD_OBJECT_H
25
 
26
#include <string>
27
#include <vector>
28
 
29
#include "elfcpp.h"
30
#include "elfcpp_file.h"
31
#include "fileread.h"
32
#include "target.h"
33
 
34
namespace gold
35
{
36
 
37
class General_options;
38
class Task;
39
class Cref;
40
class Archive;
41
class Layout;
42
class Output_section;
43
class Output_file;
44
class Output_symtab_xindex;
45
class Dynobj;
46
class Object_merge_map;
47
class Relocatable_relocs;
48
 
49
template<typename Stringpool_char>
50
class Stringpool_template;
51
 
52
// Data to pass from read_symbols() to add_symbols().
53
 
54
struct Read_symbols_data
55
{
56
  // Section headers.
57
  File_view* section_headers;
58
  // Section names.
59
  File_view* section_names;
60
  // Size of section name data in bytes.
61
  section_size_type section_names_size;
62
  // Symbol data.
63
  File_view* symbols;
64
  // Size of symbol data in bytes.
65
  section_size_type symbols_size;
66
  // Offset of external symbols within symbol data.  This structure
67
  // sometimes contains only external symbols, in which case this will
68
  // be zero.  Sometimes it contains all symbols.
69
  section_offset_type external_symbols_offset;
70
  // Symbol names.
71
  File_view* symbol_names;
72
  // Size of symbol name data in bytes.
73
  section_size_type symbol_names_size;
74
 
75
  // Version information.  This is only used on dynamic objects.
76
  // Version symbol data (from SHT_GNU_versym section).
77
  File_view* versym;
78
  section_size_type versym_size;
79
  // Version definition data (from SHT_GNU_verdef section).
80
  File_view* verdef;
81
  section_size_type verdef_size;
82
  unsigned int verdef_info;
83
  // Needed version data  (from SHT_GNU_verneed section).
84
  File_view* verneed;
85
  section_size_type verneed_size;
86
  unsigned int verneed_info;
87
};
88
 
89
// Information used to print error messages.
90
 
91
struct Symbol_location_info
92
{
93
  std::string source_file;
94
  std::string enclosing_symbol_name;
95
  int line_number;
96
};
97
 
98
// Data about a single relocation section.  This is read in
99
// read_relocs and processed in scan_relocs.
100
 
101
struct Section_relocs
102
{
103
  // Index of reloc section.
104
  unsigned int reloc_shndx;
105
  // Index of section that relocs apply to.
106
  unsigned int data_shndx;
107
  // Contents of reloc section.
108
  File_view* contents;
109
  // Reloc section type.
110
  unsigned int sh_type;
111
  // Number of reloc entries.
112
  size_t reloc_count;
113
  // Output section.
114
  Output_section* output_section;
115
  // Whether this section has special handling for offsets.
116
  bool needs_special_offset_handling;
117
  // Whether the data section is allocated (has the SHF_ALLOC flag set).
118
  bool is_data_section_allocated;
119
};
120
 
121
// Relocations in an object file.  This is read in read_relocs and
122
// processed in scan_relocs.
123
 
124
struct Read_relocs_data
125
{
126
  typedef std::vector<Section_relocs> Relocs_list;
127
  // The relocations.
128
  Relocs_list relocs;
129
  // The local symbols.
130
  File_view* local_symbols;
131
};
132
 
133
// The Xindex class manages section indexes for objects with more than
134
// 0xff00 sections.
135
 
136
class Xindex
137
{
138
 public:
139
  Xindex(int large_shndx_offset)
140
    : large_shndx_offset_(large_shndx_offset), symtab_xindex_()
141
  { }
142
 
143
  // Initialize the symtab_xindex_ array, given the object and the
144
  // section index of the symbol table to use.
145
  template<int size, bool big_endian>
146
  void
147
  initialize_symtab_xindex(Object*, unsigned int symtab_shndx);
148
 
149
  // Read in the symtab_xindex_ array, given its section index.
150
  // PSHDRS may optionally point to the section headers.
151
  template<int size, bool big_endian>
152
  void
153
  read_symtab_xindex(Object*, unsigned int xindex_shndx,
154
                     const unsigned char* pshdrs);
155
 
156
  // Symbol SYMNDX in OBJECT has a section of SHN_XINDEX; return the
157
  // real section index.
158
  unsigned int
159
  sym_xindex_to_shndx(Object* object, unsigned int symndx);
160
 
161
 private:
162
  // The type of the array giving the real section index for symbols
163
  // whose st_shndx field holds SHN_XINDEX.
164
  typedef std::vector<unsigned int> Symtab_xindex;
165
 
166
  // Adjust a section index if necessary.  This should only be called
167
  // for ordinary section indexes.
168
  unsigned int
169
  adjust_shndx(unsigned int shndx)
170
  {
171
    if (shndx >= elfcpp::SHN_LORESERVE)
172
      shndx += this->large_shndx_offset_;
173
    return shndx;
174
  }
175
 
176
  // Adjust to apply to large section indexes.
177
  int large_shndx_offset_;
178
  // The data from the SHT_SYMTAB_SHNDX section.
179
  Symtab_xindex symtab_xindex_;
180
};
181
 
182
// Object is an abstract base class which represents either a 32-bit
183
// or a 64-bit input object.  This can be a regular object file
184
// (ET_REL) or a shared object (ET_DYN).
185
 
186
class Object
187
{
188
 public:
189
  // NAME is the name of the object as we would report it to the user
190
  // (e.g., libfoo.a(bar.o) if this is in an archive.  INPUT_FILE is
191
  // used to read the file.  OFFSET is the offset within the input
192
  // file--0 for a .o or .so file, something else for a .a file.
193
  Object(const std::string& name, Input_file* input_file, bool is_dynamic,
194
         off_t offset = 0)
195
    : name_(name), input_file_(input_file), offset_(offset), shnum_(-1U),
196
      is_dynamic_(is_dynamic), target_(NULL), xindex_(NULL)
197
  { input_file->file().add_object(); }
198
 
199
  virtual ~Object()
200
  { this->input_file_->file().remove_object(); }
201
 
202
  // Return the name of the object as we would report it to the tuser.
203
  const std::string&
204
  name() const
205
  { return this->name_; }
206
 
207
  // Get the offset into the file.
208
  off_t
209
  offset() const
210
  { return this->offset_; }
211
 
212
  // Return whether this is a dynamic object.
213
  bool
214
  is_dynamic() const
215
  { return this->is_dynamic_; }
216
 
217
  // Return the target structure associated with this object.
218
  Target*
219
  target() const
220
  { return this->target_; }
221
 
222
  // Lock the underlying file.
223
  void
224
  lock(const Task* t)
225
  { this->input_file()->file().lock(t); }
226
 
227
  // Unlock the underlying file.
228
  void
229
  unlock(const Task* t)
230
  { this->input_file()->file().unlock(t); }
231
 
232
  // Return whether the underlying file is locked.
233
  bool
234
  is_locked() const
235
  { return this->input_file()->file().is_locked(); }
236
 
237
  // Return the token, so that the task can be queued.
238
  Task_token*
239
  token()
240
  { return this->input_file()->file().token(); }
241
 
242
  // Release the underlying file.
243
  void
244
  release()
245
  { this->input_file_->file().release(); }
246
 
247
  // Return whether we should just read symbols from this file.
248
  bool
249
  just_symbols() const
250
  { return this->input_file()->just_symbols(); }
251
 
252
  // Return the sized target structure associated with this object.
253
  // This is like the target method but it returns a pointer of
254
  // appropriate checked type.
255
  template<int size, bool big_endian>
256
  Sized_target<size, big_endian>*
257
  sized_target() const;
258
 
259
  // Get the number of sections.
260
  unsigned int
261
  shnum() const
262
  { return this->shnum_; }
263
 
264
  // Return a view of the contents of a section.  Set *PLEN to the
265
  // size.  CACHE is a hint as in File_read::get_view.
266
  const unsigned char*
267
  section_contents(unsigned int shndx, section_size_type* plen, bool cache);
268
 
269
  // Adjust a symbol's section index as needed.  SYMNDX is the index
270
  // of the symbol and SHNDX is the symbol's section from
271
  // get_st_shndx.  This returns the section index.  It sets
272
  // *IS_ORDINARY to indicate whether this is a normal section index,
273
  // rather than a special code between SHN_LORESERVE and
274
  // SHN_HIRESERVE.
275
  unsigned int
276
  adjust_sym_shndx(unsigned int symndx, unsigned int shndx, bool* is_ordinary)
277
  {
278
    if (shndx < elfcpp::SHN_LORESERVE)
279
      *is_ordinary = true;
280
    else if (shndx == elfcpp::SHN_XINDEX)
281
      {
282
        if (this->xindex_ == NULL)
283
          this->xindex_ = this->do_initialize_xindex();
284
        shndx = this->xindex_->sym_xindex_to_shndx(this, symndx);
285
        *is_ordinary = true;
286
      }
287
    else
288
      *is_ordinary = false;
289
    return shndx;
290
  }
291
 
292
  // Return the size of a section given a section index.
293
  uint64_t
294
  section_size(unsigned int shndx)
295
  { return this->do_section_size(shndx); }
296
 
297
  // Return the name of a section given a section index.
298
  std::string
299
  section_name(unsigned int shndx)
300
  { return this->do_section_name(shndx); }
301
 
302
  // Return the section flags given a section index.
303
  uint64_t
304
  section_flags(unsigned int shndx)
305
  { return this->do_section_flags(shndx); }
306
 
307
  // Return the section address given a section index.
308
  uint64_t
309
  section_address(unsigned int shndx)
310
  { return this->do_section_address(shndx); }
311
 
312
  // Return the section type given a section index.
313
  unsigned int
314
  section_type(unsigned int shndx)
315
  { return this->do_section_type(shndx); }
316
 
317
  // Return the section link field given a section index.
318
  unsigned int
319
  section_link(unsigned int shndx)
320
  { return this->do_section_link(shndx); }
321
 
322
  // Return the section info field given a section index.
323
  unsigned int
324
  section_info(unsigned int shndx)
325
  { return this->do_section_info(shndx); }
326
 
327
  // Return the required section alignment given a section index.
328
  uint64_t
329
  section_addralign(unsigned int shndx)
330
  { return this->do_section_addralign(shndx); }
331
 
332
  // Read the symbol information.
333
  void
334
  read_symbols(Read_symbols_data* sd)
335
  { return this->do_read_symbols(sd); }
336
 
337
  // Pass sections which should be included in the link to the Layout
338
  // object, and record where the sections go in the output file.
339
  void
340
  layout(Symbol_table* symtab, Layout* layout, Read_symbols_data* sd)
341
  { this->do_layout(symtab, layout, sd); }
342
 
343
  // Add symbol information to the global symbol table.
344
  void
345
  add_symbols(Symbol_table* symtab, Read_symbols_data* sd)
346
  { this->do_add_symbols(symtab, sd); }
347
 
348
  // Functions and types for the elfcpp::Elf_file interface.  This
349
  // permit us to use Object as the File template parameter for
350
  // elfcpp::Elf_file.
351
 
352
  // The View class is returned by view.  It must support a single
353
  // method, data().  This is trivial, because get_view does what we
354
  // need.
355
  class View
356
  {
357
   public:
358
    View(const unsigned char* p)
359
      : p_(p)
360
    { }
361
 
362
    const unsigned char*
363
    data() const
364
    { return this->p_; }
365
 
366
   private:
367
    const unsigned char* p_;
368
  };
369
 
370
  // Return a View.
371
  View
372
  view(off_t file_offset, section_size_type data_size)
373
  { return View(this->get_view(file_offset, data_size, true, true)); }
374
 
375
  // Report an error.
376
  void
377
  error(const char* format, ...) const ATTRIBUTE_PRINTF_2;
378
 
379
  // A location in the file.
380
  struct Location
381
  {
382
    off_t file_offset;
383
    off_t data_size;
384
 
385
    Location(off_t fo, section_size_type ds)
386
      : file_offset(fo), data_size(ds)
387
    { }
388
  };
389
 
390
  // Get a View given a Location.
391
  View view(Location loc)
392
  { return View(this->get_view(loc.file_offset, loc.data_size, true, true)); }
393
 
394
  // Get a view into the underlying file.
395
  const unsigned char*
396
  get_view(off_t start, section_size_type size, bool aligned, bool cache)
397
  {
398
    return this->input_file()->file().get_view(this->offset_, start, size,
399
                                               aligned, cache);
400
  }
401
 
402
  // Get a lasting view into the underlying file.
403
  File_view*
404
  get_lasting_view(off_t start, section_size_type size, bool aligned,
405
                   bool cache)
406
  {
407
    return this->input_file()->file().get_lasting_view(this->offset_, start,
408
                                                       size, aligned, cache);
409
  }
410
 
411
  // Read data from the underlying file.
412
  void
413
  read(off_t start, section_size_type size, void* p)
414
  { this->input_file()->file().read(start + this->offset_, size, p); }
415
 
416
  // Read multiple data from the underlying file.
417
  void
418
  read_multiple(const File_read::Read_multiple& rm)
419
  { this->input_file()->file().read_multiple(this->offset_, rm); }
420
 
421
  // Stop caching views in the underlying file.
422
  void
423
  clear_view_cache_marks()
424
  { this->input_file()->file().clear_view_cache_marks(); }
425
 
426
  // Get the number of global symbols defined by this object, and the
427
  // number of the symbols whose final definition came from this
428
  // object.
429
  void
430
  get_global_symbol_counts(const Symbol_table* symtab, size_t* defined,
431
                           size_t* used) const
432
  { this->do_get_global_symbol_counts(symtab, defined, used); }
433
 
434
 protected:
435
  // Read the symbols--implemented by child class.
436
  virtual void
437
  do_read_symbols(Read_symbols_data*) = 0;
438
 
439
  // Lay out sections--implemented by child class.
440
  virtual void
441
  do_layout(Symbol_table*, Layout*, Read_symbols_data*) = 0;
442
 
443
  // Add symbol information to the global symbol table--implemented by
444
  // child class.
445
  virtual void
446
  do_add_symbols(Symbol_table*, Read_symbols_data*) = 0;
447
 
448
  // Return the location of the contents of a section.  Implemented by
449
  // child class.
450
  virtual Location
451
  do_section_contents(unsigned int shndx) = 0;
452
 
453
  // Get the size of a section--implemented by child class.
454
  virtual uint64_t
455
  do_section_size(unsigned int shndx) = 0;
456
 
457
  // Get the name of a section--implemented by child class.
458
  virtual std::string
459
  do_section_name(unsigned int shndx) = 0;
460
 
461
  // Get section flags--implemented by child class.
462
  virtual uint64_t
463
  do_section_flags(unsigned int shndx) = 0;
464
 
465
  // Get section address--implemented by child class.
466
  virtual uint64_t
467
  do_section_address(unsigned int shndx) = 0;
468
 
469
  // Get section type--implemented by child class.
470
  virtual unsigned int
471
  do_section_type(unsigned int shndx) = 0;
472
 
473
  // Get section link field--implemented by child class.
474
  virtual unsigned int
475
  do_section_link(unsigned int shndx) = 0;
476
 
477
  // Get section info field--implemented by child class.
478
  virtual unsigned int
479
  do_section_info(unsigned int shndx) = 0;
480
 
481
  // Get section alignment--implemented by child class.
482
  virtual uint64_t
483
  do_section_addralign(unsigned int shndx) = 0;
484
 
485
  // Return the Xindex structure to use.
486
  virtual Xindex*
487
  do_initialize_xindex() = 0;
488
 
489
  // Implement get_global_symbol_counts--implemented by child class.
490
  virtual void
491
  do_get_global_symbol_counts(const Symbol_table*, size_t*, size_t*) const = 0;
492
 
493
  // Get the file.  We pass on const-ness.
494
  Input_file*
495
  input_file()
496
  { return this->input_file_; }
497
 
498
  const Input_file*
499
  input_file() const
500
  { return this->input_file_; }
501
 
502
  // Set the target.
503
  void
504
  set_target(int machine, int size, bool big_endian, int osabi,
505
             int abiversion);
506
 
507
  // Set the number of sections.
508
  void
509
  set_shnum(int shnum)
510
  { this->shnum_ = shnum; }
511
 
512
  // Functions used by both Sized_relobj and Sized_dynobj.
513
 
514
  // Read the section data into a Read_symbols_data object.
515
  template<int size, bool big_endian>
516
  void
517
  read_section_data(elfcpp::Elf_file<size, big_endian, Object>*,
518
                    Read_symbols_data*);
519
 
520
  // Let the child class initialize the xindex object directly.
521
  void
522
  set_xindex(Xindex* xindex)
523
  {
524
    gold_assert(this->xindex_ == NULL);
525
    this->xindex_ = xindex;
526
  }
527
 
528
  // If NAME is the name of a special .gnu.warning section, arrange
529
  // for the warning to be issued.  SHNDX is the section index.
530
  // Return whether it is a warning section.
531
  bool
532
  handle_gnu_warning_section(const char* name, unsigned int shndx,
533
                             Symbol_table*);
534
 
535
 private:
536
  // This class may not be copied.
537
  Object(const Object&);
538
  Object& operator=(const Object&);
539
 
540
  // Name of object as printed to user.
541
  std::string name_;
542
  // For reading the file.
543
  Input_file* input_file_;
544
  // Offset within the file--0 for an object file, non-0 for an
545
  // archive.
546
  off_t offset_;
547
  // Number of input sections.
548
  unsigned int shnum_;
549
  // Whether this is a dynamic object.
550
  bool is_dynamic_;
551
  // Target functions--may be NULL if the target is not known.
552
  Target* target_;
553
  // Many sections for objects with more than SHN_LORESERVE sections.
554
  Xindex* xindex_;
555
};
556
 
557
// Implement sized_target inline for efficiency.  This approach breaks
558
// static type checking, but is made safe using asserts.
559
 
560
template<int size, bool big_endian>
561
inline Sized_target<size, big_endian>*
562
Object::sized_target() const
563
{
564
  gold_assert(this->target_->get_size() == size);
565
  gold_assert(this->target_->is_big_endian() ? big_endian : !big_endian);
566
  return static_cast<Sized_target<size, big_endian>*>(this->target_);
567
}
568
 
569
// A regular object (ET_REL).  This is an abstract base class itself.
570
// The implementation is the template class Sized_relobj.
571
 
572
class Relobj : public Object
573
{
574
 public:
575
  Relobj(const std::string& name, Input_file* input_file, off_t offset = 0)
576
    : Object(name, input_file, false, offset),
577
      output_sections_(),
578
      map_to_relocatable_relocs_(NULL),
579
      object_merge_map_(NULL),
580
      relocs_must_follow_section_writes_(false)
581
  { }
582
 
583
  // Read the relocs.
584
  void
585
  read_relocs(Read_relocs_data* rd)
586
  { return this->do_read_relocs(rd); }
587
 
588
  // Scan the relocs and adjust the symbol table.
589
  void
590
  scan_relocs(const General_options& options, Symbol_table* symtab,
591
              Layout* layout, Read_relocs_data* rd)
592
  { return this->do_scan_relocs(options, symtab, layout, rd); }
593
 
594
  // The number of local symbols in the input symbol table.
595
  virtual unsigned int
596
  local_symbol_count() const
597
  { return this->do_local_symbol_count(); }
598
 
599
  // Initial local symbol processing: count the number of local symbols
600
  // in the output symbol table and dynamic symbol table; add local symbol
601
  // names to *POOL and *DYNPOOL.
602
  void
603
  count_local_symbols(Stringpool_template<char>* pool,
604
                      Stringpool_template<char>* dynpool)
605
  { return this->do_count_local_symbols(pool, dynpool); }
606
 
607
  // Set the values of the local symbols, set the output symbol table
608
  // indexes for the local variables, and set the offset where local
609
  // symbol information will be stored. Returns the new local symbol index.
610
  unsigned int
611
  finalize_local_symbols(unsigned int index, off_t off)
612
  { return this->do_finalize_local_symbols(index, off); }
613
 
614
  // Set the output dynamic symbol table indexes for the local variables.
615
  unsigned int
616
  set_local_dynsym_indexes(unsigned int index)
617
  { return this->do_set_local_dynsym_indexes(index); }
618
 
619
  // Set the offset where local dynamic symbol information will be stored.
620
  unsigned int
621
  set_local_dynsym_offset(off_t off)
622
  { return this->do_set_local_dynsym_offset(off); }
623
 
624
  // Relocate the input sections and write out the local symbols.
625
  void
626
  relocate(const General_options& options, const Symbol_table* symtab,
627
           const Layout* layout, Output_file* of)
628
  { return this->do_relocate(options, symtab, layout, of); }
629
 
630
  // Return whether an input section is being included in the link.
631
  bool
632
  is_section_included(unsigned int shndx) const
633
  {
634
    gold_assert(shndx < this->output_sections_.size());
635
    return this->output_sections_[shndx] != NULL;
636
  }
637
 
638
  // Given a section index, return the corresponding Output_section.
639
  // The return value will be NULL if the section is not included in
640
  // the link.
641
  Output_section*
642
  output_section(unsigned int shndx) const
643
  {
644
    gold_assert(shndx < this->output_sections_.size());
645
    return this->output_sections_[shndx];
646
  }
647
 
648
  // Given a section index, return the offset in the Output_section.
649
  // The return value will be -1U if the section is specially mapped,
650
  // such as a merge section.
651
  uint64_t
652
  output_section_offset(unsigned int shndx) const
653
  { return this->do_output_section_offset(shndx); }
654
 
655
  // Set the offset of an input section within its output section.
656
  virtual void
657
  set_section_offset(unsigned int shndx, uint64_t off)
658
  { this->do_set_section_offset(shndx, off); }
659
 
660
  // Return true if we need to wait for output sections to be written
661
  // before we can apply relocations.  This is true if the object has
662
  // any relocations for sections which require special handling, such
663
  // as the exception frame section.
664
  bool
665
  relocs_must_follow_section_writes() const
666
  { return this->relocs_must_follow_section_writes_; }
667
 
668
  // Return the object merge map.
669
  Object_merge_map*
670
  merge_map() const
671
  { return this->object_merge_map_; }
672
 
673
  // Set the object merge map.
674
  void
675
  set_merge_map(Object_merge_map* object_merge_map)
676
  {
677
    gold_assert(this->object_merge_map_ == NULL);
678
    this->object_merge_map_ = object_merge_map;
679
  }
680
 
681
  // Record the relocatable reloc info for an input reloc section.
682
  void
683
  set_relocatable_relocs(unsigned int reloc_shndx, Relocatable_relocs* rr)
684
  {
685
    gold_assert(reloc_shndx < this->shnum());
686
    (*this->map_to_relocatable_relocs_)[reloc_shndx] = rr;
687
  }
688
 
689
  // Get the relocatable reloc info for an input reloc section.
690
  Relocatable_relocs*
691
  relocatable_relocs(unsigned int reloc_shndx)
692
  {
693
    gold_assert(reloc_shndx < this->shnum());
694
    return (*this->map_to_relocatable_relocs_)[reloc_shndx];
695
  }
696
 
697
 protected:
698
  // The output section to be used for each input section, indexed by
699
  // the input section number.  The output section is NULL if the
700
  // input section is to be discarded.
701
  typedef std::vector<Output_section*> Output_sections;
702
 
703
  // Read the relocs--implemented by child class.
704
  virtual void
705
  do_read_relocs(Read_relocs_data*) = 0;
706
 
707
  // Scan the relocs--implemented by child class.
708
  virtual void
709
  do_scan_relocs(const General_options&, Symbol_table*, Layout*,
710
                 Read_relocs_data*) = 0;
711
 
712
  // Return the number of local symbols--implemented by child class.
713
  virtual unsigned int
714
  do_local_symbol_count() const = 0;
715
 
716
  // Count local symbols--implemented by child class.
717
  virtual void
718
  do_count_local_symbols(Stringpool_template<char>*,
719
                         Stringpool_template<char>*) = 0;
720
 
721
  // Finalize the local symbols.  Set the output symbol table indexes
722
  // for the local variables, and set the offset where local symbol
723
  // information will be stored.
724
  virtual unsigned int
725
  do_finalize_local_symbols(unsigned int, off_t) = 0;
726
 
727
  // Set the output dynamic symbol table indexes for the local variables.
728
  virtual unsigned int
729
  do_set_local_dynsym_indexes(unsigned int) = 0;
730
 
731
  // Set the offset where local dynamic symbol information will be stored.
732
  virtual unsigned int
733
  do_set_local_dynsym_offset(off_t) = 0;
734
 
735
  // Relocate the input sections and write out the local
736
  // symbols--implemented by child class.
737
  virtual void
738
  do_relocate(const General_options& options, const Symbol_table* symtab,
739
              const Layout*, Output_file* of) = 0;
740
 
741
  // Get the offset of a section--implemented by child class.
742
  virtual uint64_t
743
  do_output_section_offset(unsigned int shndx) const = 0;
744
 
745
  // Set the offset of a section--implemented by child class.
746
  virtual void
747
  do_set_section_offset(unsigned int shndx, uint64_t off) = 0;
748
 
749
  // Return the vector mapping input sections to output sections.
750
  Output_sections&
751
  output_sections()
752
  { return this->output_sections_; }
753
 
754
  const Output_sections&
755
  output_sections() const
756
  { return this->output_sections_; }
757
 
758
  // Set the size of the relocatable relocs array.
759
  void
760
  size_relocatable_relocs()
761
  {
762
    this->map_to_relocatable_relocs_ =
763
      new std::vector<Relocatable_relocs*>(this->shnum());
764
  }
765
 
766
  // Record that we must wait for the output sections to be written
767
  // before applying relocations.
768
  void
769
  set_relocs_must_follow_section_writes()
770
  { this->relocs_must_follow_section_writes_ = true; }
771
 
772
 private:
773
  // Mapping from input sections to output section.
774
  Output_sections output_sections_;
775
  // Mapping from input section index to the information recorded for
776
  // the relocations.  This is only used for a relocatable link.
777
  std::vector<Relocatable_relocs*>* map_to_relocatable_relocs_;
778
  // Mappings for merge sections.  This is managed by the code in the
779
  // Merge_map class.
780
  Object_merge_map* object_merge_map_;
781
  // Whether we need to wait for output sections to be written before
782
  // we can apply relocations.
783
  bool relocs_must_follow_section_writes_;
784
};
785
 
786
// This class is used to handle relocations against a section symbol
787
// in an SHF_MERGE section.  For such a symbol, we need to know the
788
// addend of the relocation before we can determine the final value.
789
// The addend gives us the location in the input section, and we can
790
// determine how it is mapped to the output section.  For a
791
// non-section symbol, we apply the addend to the final value of the
792
// symbol; that is done in finalize_local_symbols, and does not use
793
// this class.
794
 
795
template<int size>
796
class Merged_symbol_value
797
{
798
 public:
799
  typedef typename elfcpp::Elf_types<size>::Elf_Addr Value;
800
 
801
  // We use a hash table to map offsets in the input section to output
802
  // addresses.
803
  typedef Unordered_map<section_offset_type, Value> Output_addresses;
804
 
805
  Merged_symbol_value(Value input_value, Value output_start_address)
806
    : input_value_(input_value), output_start_address_(output_start_address),
807
      output_addresses_()
808
  { }
809
 
810
  // Initialize the hash table.
811
  void
812
  initialize_input_to_output_map(const Relobj*, unsigned int input_shndx);
813
 
814
  // Release the hash table to save space.
815
  void
816
  free_input_to_output_map()
817
  { this->output_addresses_.clear(); }
818
 
819
  // Get the output value corresponding to an addend.  The object and
820
  // input section index are passed in because the caller will have
821
  // them; otherwise we could store them here.
822
  Value
823
  value(const Relobj* object, unsigned int input_shndx, Value addend) const
824
  {
825
    // This is a relocation against a section symbol.  ADDEND is the
826
    // offset in the section.  The result should be the start of some
827
    // merge area.  If the object file wants something else, it should
828
    // use a regular symbol rather than a section symbol.
829
    // Unfortunately, PR 6658 shows a case in which the object file
830
    // refers to the section symbol, but uses a negative ADDEND to
831
    // compensate for a PC relative reloc.  We can't handle the
832
    // general case.  However, we can handle the special case of a
833
    // negative addend, by assuming that it refers to the start of the
834
    // section.  Of course, that means that we have to guess when
835
    // ADDEND is negative.  It is normal to see a 32-bit value here
836
    // even when the template parameter size is 64, as 64-bit object
837
    // file formats have 32-bit relocations.  We know this is a merge
838
    // section, so we know it has to fit into memory.  So we assume
839
    // that we won't see a value larger than a large 32-bit unsigned
840
    // value.  This will break objects with very very large merge
841
    // sections; they probably break in other ways anyhow.
842
    Value input_offset = this->input_value_;
843
    if (addend < 0xffffff00)
844
      {
845
        input_offset += addend;
846
        addend = 0;
847
      }
848
    typename Output_addresses::const_iterator p =
849
      this->output_addresses_.find(input_offset);
850
    if (p != this->output_addresses_.end())
851
      return p->second + addend;
852
 
853
    return (this->value_from_output_section(object, input_shndx, input_offset)
854
            + addend);
855
  }
856
 
857
 private:
858
  // Get the output value for an input offset if we couldn't find it
859
  // in the hash table.
860
  Value
861
  value_from_output_section(const Relobj*, unsigned int input_shndx,
862
                            Value input_offset) const;
863
 
864
  // The value of the section symbol in the input file.  This is
865
  // normally zero, but could in principle be something else.
866
  Value input_value_;
867
  // The start address of this merged section in the output file.
868
  Value output_start_address_;
869
  // A hash table which maps offsets in the input section to output
870
  // addresses.  This only maps specific offsets, not all offsets.
871
  Output_addresses output_addresses_;
872
};
873
 
874
// This POD class is holds the value of a symbol.  This is used for
875
// local symbols, and for all symbols during relocation processing.
876
// For special sections, such as SHF_MERGE sections, this calls a
877
// function to get the final symbol value.
878
 
879
template<int size>
880
class Symbol_value
881
{
882
 public:
883
  typedef typename elfcpp::Elf_types<size>::Elf_Addr Value;
884
 
885
  Symbol_value()
886
    : output_symtab_index_(0), output_dynsym_index_(-1U), input_shndx_(0),
887
      is_ordinary_shndx_(false), is_section_symbol_(false),
888
      is_tls_symbol_(false), has_output_value_(true)
889
  { this->u_.value = 0; }
890
 
891
  // Get the value of this symbol.  OBJECT is the object in which this
892
  // symbol is defined, and ADDEND is an addend to add to the value.
893
  template<bool big_endian>
894
  Value
895
  value(const Sized_relobj<size, big_endian>* object, Value addend) const
896
  {
897
    if (this->has_output_value_)
898
      return this->u_.value + addend;
899
    else
900
      {
901
        gold_assert(this->is_ordinary_shndx_);
902
        return this->u_.merged_symbol_value->value(object, this->input_shndx_,
903
                                                   addend);
904
      }
905
  }
906
 
907
  // Set the value of this symbol in the output symbol table.
908
  void
909
  set_output_value(Value value)
910
  { this->u_.value = value; }
911
 
912
  // For a section symbol in a merged section, we need more
913
  // information.
914
  void
915
  set_merged_symbol_value(Merged_symbol_value<size>* msv)
916
  {
917
    gold_assert(this->is_section_symbol_);
918
    this->has_output_value_ = false;
919
    this->u_.merged_symbol_value = msv;
920
  }
921
 
922
  // Initialize the input to output map for a section symbol in a
923
  // merged section.  We also initialize the value of a non-section
924
  // symbol in a merged section.
925
  void
926
  initialize_input_to_output_map(const Relobj* object)
927
  {
928
    if (!this->has_output_value_)
929
      {
930
        gold_assert(this->is_section_symbol_ && this->is_ordinary_shndx_);
931
        Merged_symbol_value<size>* msv = this->u_.merged_symbol_value;
932
        msv->initialize_input_to_output_map(object, this->input_shndx_);
933
      }
934
  }
935
 
936
  // Free the input to output map for a section symbol in a merged
937
  // section.
938
  void
939
  free_input_to_output_map()
940
  {
941
    if (!this->has_output_value_)
942
      this->u_.merged_symbol_value->free_input_to_output_map();
943
  }
944
 
945
  // Set the value of the symbol from the input file.  This is only
946
  // called by count_local_symbols, to communicate the value to
947
  // finalize_local_symbols.
948
  void
949
  set_input_value(Value value)
950
  { this->u_.value = value; }
951
 
952
  // Return the input value.  This is only called by
953
  // finalize_local_symbols and (in special cases) relocate_section.
954
  Value
955
  input_value() const
956
  { return this->u_.value; }
957
 
958
  // Return whether this symbol should go into the output symbol
959
  // table.
960
  bool
961
  needs_output_symtab_entry() const
962
  { return this->output_symtab_index_ != -1U; }
963
 
964
  // Return the index in the output symbol table.
965
  unsigned int
966
  output_symtab_index() const
967
  {
968
    gold_assert(this->output_symtab_index_ != 0);
969
    return this->output_symtab_index_;
970
  }
971
 
972
  // Set the index in the output symbol table.
973
  void
974
  set_output_symtab_index(unsigned int i)
975
  {
976
    gold_assert(this->output_symtab_index_ == 0);
977
    this->output_symtab_index_ = i;
978
  }
979
 
980
  // Record that this symbol should not go into the output symbol
981
  // table.
982
  void
983
  set_no_output_symtab_entry()
984
  {
985
    gold_assert(this->output_symtab_index_ == 0);
986
    this->output_symtab_index_ = -1U;
987
  }
988
 
989
  // Set the index in the output dynamic symbol table.
990
  void
991
  set_needs_output_dynsym_entry()
992
  {
993
    gold_assert(!this->is_section_symbol());
994
    this->output_dynsym_index_ = 0;
995
  }
996
 
997
  // Return whether this symbol should go into the output symbol
998
  // table.
999
  bool
1000
  needs_output_dynsym_entry() const
1001
  {
1002
    return this->output_dynsym_index_ != -1U;
1003
  }
1004
 
1005
  // Record that this symbol should go into the dynamic symbol table.
1006
  void
1007
  set_output_dynsym_index(unsigned int i)
1008
  {
1009
    gold_assert(this->output_dynsym_index_ == 0);
1010
    this->output_dynsym_index_ = i;
1011
  }
1012
 
1013
  // Return the index in the output dynamic symbol table.
1014
  unsigned int
1015
  output_dynsym_index() const
1016
  {
1017
    gold_assert(this->output_dynsym_index_ != 0
1018
                && this->output_dynsym_index_ != -1U);
1019
    return this->output_dynsym_index_;
1020
  }
1021
 
1022
  // Set the index of the input section in the input file.
1023
  void
1024
  set_input_shndx(unsigned int i, bool is_ordinary)
1025
  {
1026
    this->input_shndx_ = i;
1027
    // input_shndx_ field is a bitfield, so make sure that the value
1028
    // fits.
1029
    gold_assert(this->input_shndx_ == i);
1030
    this->is_ordinary_shndx_ = is_ordinary;
1031
  }
1032
 
1033
  // Return the index of the input section in the input file.
1034
  unsigned int
1035
  input_shndx(bool* is_ordinary) const
1036
  {
1037
    *is_ordinary = this->is_ordinary_shndx_;
1038
    return this->input_shndx_;
1039
  }
1040
 
1041
  // Whether this is a section symbol.
1042
  bool
1043
  is_section_symbol() const
1044
  { return this->is_section_symbol_; }
1045
 
1046
  // Record that this is a section symbol.
1047
  void
1048
  set_is_section_symbol()
1049
  {
1050
    gold_assert(!this->needs_output_dynsym_entry());
1051
    this->is_section_symbol_ = true;
1052
  }
1053
 
1054
  // Record that this is a TLS symbol.
1055
  void
1056
  set_is_tls_symbol()
1057
  { this->is_tls_symbol_ = true; }
1058
 
1059
  // Return TRUE if this is a TLS symbol.
1060
  bool
1061
  is_tls_symbol() const
1062
  { return this->is_tls_symbol_; }
1063
 
1064
 private:
1065
  // The index of this local symbol in the output symbol table.  This
1066
  // will be -1 if the symbol should not go into the symbol table.
1067
  unsigned int output_symtab_index_;
1068
  // The index of this local symbol in the dynamic symbol table.  This
1069
  // will be -1 if the symbol should not go into the symbol table.
1070
  unsigned int output_dynsym_index_;
1071
  // The section index in the input file in which this symbol is
1072
  // defined.
1073
  unsigned int input_shndx_ : 28;
1074
  // Whether the section index is an ordinary index, not a special
1075
  // value.
1076
  bool is_ordinary_shndx_ : 1;
1077
  // Whether this is a STT_SECTION symbol.
1078
  bool is_section_symbol_ : 1;
1079
  // Whether this is a STT_TLS symbol.
1080
  bool is_tls_symbol_ : 1;
1081
  // Whether this symbol has a value for the output file.  This is
1082
  // normally set to true during Layout::finalize, by
1083
  // finalize_local_symbols.  It will be false for a section symbol in
1084
  // a merge section, as for such symbols we can not determine the
1085
  // value to use in a relocation until we see the addend.
1086
  bool has_output_value_ : 1;
1087
  union
1088
  {
1089
    // This is used if has_output_value_ is true.  Between
1090
    // count_local_symbols and finalize_local_symbols, this is the
1091
    // value in the input file.  After finalize_local_symbols, it is
1092
    // the value in the output file.
1093
    Value value;
1094
    // This is used if has_output_value_ is false.  It points to the
1095
    // information we need to get the value for a merge section.
1096
    Merged_symbol_value<size>* merged_symbol_value;
1097
  } u_;
1098
};
1099
 
1100
// A GOT offset list.  A symbol may have more than one GOT offset
1101
// (e.g., when mixing modules compiled with two different TLS models),
1102
// but will usually have at most one.  GOT_TYPE identifies the type of
1103
// GOT entry; its values are specific to each target.
1104
 
1105
class Got_offset_list
1106
{
1107
 public:
1108
  Got_offset_list()
1109
    : got_type_(-1U), got_offset_(0), got_next_(NULL)
1110
  { }
1111
 
1112
  Got_offset_list(unsigned int got_type, unsigned int got_offset)
1113
    : got_type_(got_type), got_offset_(got_offset), got_next_(NULL)
1114
  { }
1115
 
1116
  ~Got_offset_list()
1117
  {
1118
    if (this->got_next_ != NULL)
1119
      {
1120
        delete this->got_next_;
1121
        this->got_next_ = NULL;
1122
      }
1123
  }
1124
 
1125
  // Initialize the fields to their default values.
1126
  void
1127
  init()
1128
  {
1129
    this->got_type_ = -1U;
1130
    this->got_offset_ = 0;
1131
    this->got_next_ = NULL;
1132
  }
1133
 
1134
  // Set the offset for the GOT entry of type GOT_TYPE.
1135
  void
1136
  set_offset(unsigned int got_type, unsigned int got_offset)
1137
  {
1138
    if (this->got_type_ == -1U)
1139
      {
1140
        this->got_type_ = got_type;
1141
        this->got_offset_ = got_offset;
1142
      }
1143
    else
1144
      {
1145
        for (Got_offset_list* g = this; g != NULL; g = g->got_next_)
1146
          {
1147
            if (g->got_type_ == got_type)
1148
              {
1149
                g->got_offset_ = got_offset;
1150
                return;
1151
              }
1152
          }
1153
        Got_offset_list* g = new Got_offset_list(got_type, got_offset);
1154
        g->got_next_ = this->got_next_;
1155
        this->got_next_ = g;
1156
      }
1157
  }
1158
 
1159
  // Return the offset for a GOT entry of type GOT_TYPE.
1160
  unsigned int
1161
  get_offset(unsigned int got_type) const
1162
  {
1163
    for (const Got_offset_list* g = this; g != NULL; g = g->got_next_)
1164
      {
1165
        if (g->got_type_ == got_type)
1166
          return g->got_offset_;
1167
      }
1168
    return -1U;
1169
  }
1170
 
1171
 private:
1172
  unsigned int got_type_;
1173
  unsigned int got_offset_;
1174
  Got_offset_list* got_next_;
1175
};
1176
 
1177
// A regular object file.  This is size and endian specific.
1178
 
1179
template<int size, bool big_endian>
1180
class Sized_relobj : public Relobj
1181
{
1182
 public:
1183
  typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
1184
  typedef std::vector<Symbol*> Symbols;
1185
  typedef std::vector<Symbol_value<size> > Local_values;
1186
 
1187
  Sized_relobj(const std::string& name, Input_file* input_file, off_t offset,
1188
               const typename elfcpp::Ehdr<size, big_endian>&);
1189
 
1190
  ~Sized_relobj();
1191
 
1192
  // Set up the object file based on the ELF header.
1193
  void
1194
  setup(const typename elfcpp::Ehdr<size, big_endian>&);
1195
 
1196
  // Return the number of symbols.  This is only valid after
1197
  // Object::add_symbols has been called.
1198
  unsigned int
1199
  symbol_count() const
1200
  { return this->local_symbol_count_ + this->symbols_.size(); }
1201
 
1202
  // If SYM is the index of a global symbol in the object file's
1203
  // symbol table, return the Symbol object.  Otherwise, return NULL.
1204
  Symbol*
1205
  global_symbol(unsigned int sym) const
1206
  {
1207
    if (sym >= this->local_symbol_count_)
1208
      {
1209
        gold_assert(sym - this->local_symbol_count_ < this->symbols_.size());
1210
        return this->symbols_[sym - this->local_symbol_count_];
1211
      }
1212
    return NULL;
1213
  }
1214
 
1215
  // Return the section index of symbol SYM.  Set *VALUE to its value
1216
  // in the object file.  Set *IS_ORDINARY if this is an ordinary
1217
  // section index, not a special code between SHN_LORESERVE and
1218
  // SHN_HIRESERVE.  Note that for a symbol which is not defined in
1219
  // this object file, this will set *VALUE to 0 and return SHN_UNDEF;
1220
  // it will not return the final value of the symbol in the link.
1221
  unsigned int
1222
  symbol_section_and_value(unsigned int sym, Address* value, bool* is_ordinary);
1223
 
1224
  // Return a pointer to the Symbol_value structure which holds the
1225
  // value of a local symbol.
1226
  const Symbol_value<size>*
1227
  local_symbol(unsigned int sym) const
1228
  {
1229
    gold_assert(sym < this->local_values_.size());
1230
    return &this->local_values_[sym];
1231
  }
1232
 
1233
  // Return the index of local symbol SYM in the ordinary symbol
1234
  // table.  A value of -1U means that the symbol is not being output.
1235
  unsigned int
1236
  symtab_index(unsigned int sym) const
1237
  {
1238
    gold_assert(sym < this->local_values_.size());
1239
    return this->local_values_[sym].output_symtab_index();
1240
  }
1241
 
1242
  // Return the index of local symbol SYM in the dynamic symbol
1243
  // table.  A value of -1U means that the symbol is not being output.
1244
  unsigned int
1245
  dynsym_index(unsigned int sym) const
1246
  {
1247
    gold_assert(sym < this->local_values_.size());
1248
    return this->local_values_[sym].output_dynsym_index();
1249
  }
1250
 
1251
  // Return the input section index of local symbol SYM.
1252
  unsigned int
1253
  local_symbol_input_shndx(unsigned int sym, bool* is_ordinary) const
1254
  {
1255
    gold_assert(sym < this->local_values_.size());
1256
    return this->local_values_[sym].input_shndx(is_ordinary);
1257
  }
1258
 
1259
  // Return the appropriate Sized_target structure.
1260
  Sized_target<size, big_endian>*
1261
  sized_target()
1262
  { return this->Object::sized_target<size, big_endian>(); }
1263
 
1264
  // Record that local symbol SYM needs a dynamic symbol entry.
1265
  void
1266
  set_needs_output_dynsym_entry(unsigned int sym)
1267
  {
1268
    gold_assert(sym < this->local_values_.size());
1269
    this->local_values_[sym].set_needs_output_dynsym_entry();
1270
  }
1271
 
1272
  // Return whether the local symbol SYMNDX has a GOT offset.
1273
  // For TLS symbols, the GOT entry will hold its tp-relative offset.
1274
  bool
1275
  local_has_got_offset(unsigned int symndx, unsigned int got_type) const
1276
  {
1277
    Local_got_offsets::const_iterator p =
1278
        this->local_got_offsets_.find(symndx);
1279
    return (p != this->local_got_offsets_.end()
1280
            && p->second->get_offset(got_type) != -1U);
1281
  }
1282
 
1283
  // Return the GOT offset of the local symbol SYMNDX.
1284
  unsigned int
1285
  local_got_offset(unsigned int symndx, unsigned int got_type) const
1286
  {
1287
    Local_got_offsets::const_iterator p =
1288
        this->local_got_offsets_.find(symndx);
1289
    gold_assert(p != this->local_got_offsets_.end());
1290
    unsigned int off = p->second->get_offset(got_type);
1291
    gold_assert(off != -1U);
1292
    return off;
1293
  }
1294
 
1295
  // Set the GOT offset of the local symbol SYMNDX to GOT_OFFSET.
1296
  void
1297
  set_local_got_offset(unsigned int symndx, unsigned int got_type,
1298
                       unsigned int got_offset)
1299
  {
1300
    Local_got_offsets::const_iterator p =
1301
        this->local_got_offsets_.find(symndx);
1302
    if (p != this->local_got_offsets_.end())
1303
      p->second->set_offset(got_type, got_offset);
1304
    else
1305
      {
1306
        Got_offset_list* g = new Got_offset_list(got_type, got_offset);
1307
        std::pair<Local_got_offsets::iterator, bool> ins =
1308
            this->local_got_offsets_.insert(std::make_pair(symndx, g));
1309
        gold_assert(ins.second);
1310
      }
1311
  }
1312
 
1313
  // Get the offset of input section SHNDX within its output section.
1314
  // This is -1 if the input section requires a special mapping, such
1315
  // as a merge section.  The output section can be found in the
1316
  // output_sections_ field of the parent class Relobj.
1317
  Address
1318
  get_output_section_offset(unsigned int shndx) const
1319
  {
1320
    gold_assert(shndx < this->section_offsets_.size());
1321
    return this->section_offsets_[shndx];
1322
  }
1323
 
1324
  // Return the name of the symbol that spans the given offset in the
1325
  // specified section in this object.  This is used only for error
1326
  // messages and is not particularly efficient.
1327
  bool
1328
  get_symbol_location_info(unsigned int shndx, off_t offset,
1329
                           Symbol_location_info* info);
1330
 
1331
  // Look for a kept section corresponding to the given discarded section,
1332
  // and return its output address.  This is used only for relocations in
1333
  // debugging sections.
1334
  Address
1335
  map_to_kept_section(unsigned int shndx, bool* found) const;
1336
 
1337
 protected:
1338
  // Read the symbols.
1339
  void
1340
  do_read_symbols(Read_symbols_data*);
1341
 
1342
  // Return the number of local symbols.
1343
  unsigned int
1344
  do_local_symbol_count() const
1345
  { return this->local_symbol_count_; }
1346
 
1347
  // Lay out the input sections.
1348
  void
1349
  do_layout(Symbol_table*, Layout*, Read_symbols_data*);
1350
 
1351
  // Add the symbols to the symbol table.
1352
  void
1353
  do_add_symbols(Symbol_table*, Read_symbols_data*);
1354
 
1355
  // Read the relocs.
1356
  void
1357
  do_read_relocs(Read_relocs_data*);
1358
 
1359
  // Scan the relocs and adjust the symbol table.
1360
  void
1361
  do_scan_relocs(const General_options&, Symbol_table*, Layout*,
1362
                 Read_relocs_data*);
1363
 
1364
  // Count the local symbols.
1365
  void
1366
  do_count_local_symbols(Stringpool_template<char>*,
1367
                            Stringpool_template<char>*);
1368
 
1369
  // Finalize the local symbols.
1370
  unsigned int
1371
  do_finalize_local_symbols(unsigned int, off_t);
1372
 
1373
  // Set the offset where local dynamic symbol information will be stored.
1374
  unsigned int
1375
  do_set_local_dynsym_indexes(unsigned int);
1376
 
1377
  // Set the offset where local dynamic symbol information will be stored.
1378
  unsigned int
1379
  do_set_local_dynsym_offset(off_t);
1380
 
1381
  // Relocate the input sections and write out the local symbols.
1382
  void
1383
  do_relocate(const General_options& options, const Symbol_table* symtab,
1384
              const Layout*, Output_file* of);
1385
 
1386
  // Get the size of a section.
1387
  uint64_t
1388
  do_section_size(unsigned int shndx)
1389
  { return this->elf_file_.section_size(shndx); }
1390
 
1391
  // Get the name of a section.
1392
  std::string
1393
  do_section_name(unsigned int shndx)
1394
  { return this->elf_file_.section_name(shndx); }
1395
 
1396
  // Return the location of the contents of a section.
1397
  Object::Location
1398
  do_section_contents(unsigned int shndx)
1399
  { return this->elf_file_.section_contents(shndx); }
1400
 
1401
  // Return section flags.
1402
  uint64_t
1403
  do_section_flags(unsigned int shndx)
1404
  { return this->elf_file_.section_flags(shndx); }
1405
 
1406
  // Return section address.
1407
  uint64_t
1408
  do_section_address(unsigned int shndx)
1409
  { return this->elf_file_.section_addr(shndx); }
1410
 
1411
  // Return section type.
1412
  unsigned int
1413
  do_section_type(unsigned int shndx)
1414
  { return this->elf_file_.section_type(shndx); }
1415
 
1416
  // Return the section link field.
1417
  unsigned int
1418
  do_section_link(unsigned int shndx)
1419
  { return this->elf_file_.section_link(shndx); }
1420
 
1421
  // Return the section info field.
1422
  unsigned int
1423
  do_section_info(unsigned int shndx)
1424
  { return this->elf_file_.section_info(shndx); }
1425
 
1426
  // Return the section alignment.
1427
  uint64_t
1428
  do_section_addralign(unsigned int shndx)
1429
  { return this->elf_file_.section_addralign(shndx); }
1430
 
1431
  // Return the Xindex structure to use.
1432
  Xindex*
1433
  do_initialize_xindex();
1434
 
1435
  // Get symbol counts.
1436
  void
1437
  do_get_global_symbol_counts(const Symbol_table*, size_t*, size_t*) const;
1438
 
1439
  // Get the offset of a section.
1440
  uint64_t
1441
  do_output_section_offset(unsigned int shndx) const
1442
  { return this->get_output_section_offset(shndx); }
1443
 
1444
  // Set the offset of a section.
1445
  void
1446
  do_set_section_offset(unsigned int shndx, uint64_t off)
1447
  {
1448
    gold_assert(shndx < this->section_offsets_.size());
1449
    this->section_offsets_[shndx] = convert_types<Address, uint64_t>(off);
1450
  }
1451
 
1452
 private:
1453
  // For convenience.
1454
  typedef Sized_relobj<size, big_endian> This;
1455
  static const int ehdr_size = elfcpp::Elf_sizes<size>::ehdr_size;
1456
  static const int shdr_size = elfcpp::Elf_sizes<size>::shdr_size;
1457
  static const int sym_size = elfcpp::Elf_sizes<size>::sym_size;
1458
  typedef elfcpp::Shdr<size, big_endian> Shdr;
1459
 
1460
  // To keep track of discarded comdat sections, we need to map a member
1461
  // section index to the object and section index of the corresponding
1462
  // kept section.
1463
  struct Kept_comdat_section
1464
  {
1465
    Kept_comdat_section(Sized_relobj<size, big_endian>* object,
1466
                        unsigned int shndx)
1467
      : object_(object), shndx_(shndx)
1468
    { }
1469
    Sized_relobj<size, big_endian>* object_;
1470
    unsigned int shndx_;
1471
  };
1472
  typedef std::map<unsigned int, Kept_comdat_section*>
1473
      Kept_comdat_section_table;
1474
 
1475
  // Information needed to keep track of kept comdat groups.  This is
1476
  // simply a map from the section name to its section index.  This may
1477
  // not be a one-to-one mapping, but we ignore that possibility since
1478
  // this is used only to attempt to handle stray relocations from
1479
  // non-comdat debug sections that refer to comdat loadable sections.
1480
  typedef Unordered_map<std::string, unsigned int> Comdat_group;
1481
 
1482
  // A map from group section index to the table of group members.
1483
  typedef std::map<unsigned int, Comdat_group*> Comdat_group_table;
1484
 
1485
  // Find a comdat group table given its group section SHNDX.
1486
  Comdat_group*
1487
  find_comdat_group(unsigned int shndx) const
1488
  {
1489
    Comdat_group_table::const_iterator p =
1490
      this->comdat_groups_.find(shndx);
1491
    if (p != this->comdat_groups_.end())
1492
      return p->second;
1493
    return NULL;
1494
  }
1495
 
1496
  // Record a new comdat group whose group section index is SHNDX.
1497
  void
1498
  add_comdat_group(unsigned int shndx, Comdat_group* group)
1499
  { this->comdat_groups_[shndx] = group; }
1500
 
1501
  // Adjust a section index if necessary.
1502
  unsigned int
1503
  adjust_shndx(unsigned int shndx)
1504
  {
1505
    if (shndx >= elfcpp::SHN_LORESERVE)
1506
      shndx += this->elf_file_.large_shndx_offset();
1507
    return shndx;
1508
  }
1509
 
1510
  // Find the SHT_SYMTAB section, given the section headers.
1511
  void
1512
  find_symtab(const unsigned char* pshdrs);
1513
 
1514
  // Return whether SHDR has the right flags for a GNU style exception
1515
  // frame section.
1516
  bool
1517
  check_eh_frame_flags(const elfcpp::Shdr<size, big_endian>* shdr) const;
1518
 
1519
  // Return whether there is a section named .eh_frame which might be
1520
  // a GNU style exception frame section.
1521
  bool
1522
  find_eh_frame(const unsigned char* pshdrs, const char* names,
1523
                section_size_type names_size) const;
1524
 
1525
  // Whether to include a section group in the link.
1526
  bool
1527
  include_section_group(Symbol_table*, Layout*, unsigned int, const char*,
1528
                        const unsigned char*, const char *, section_size_type,
1529
                        std::vector<bool>*);
1530
 
1531
  // Whether to include a linkonce section in the link.
1532
  bool
1533
  include_linkonce_section(Layout*, unsigned int, const char*,
1534
                           const elfcpp::Shdr<size, big_endian>&);
1535
 
1536
  // Views and sizes when relocating.
1537
  struct View_size
1538
  {
1539
    unsigned char* view;
1540
    typename elfcpp::Elf_types<size>::Elf_Addr address;
1541
    off_t offset;
1542
    section_size_type view_size;
1543
    bool is_input_output_view;
1544
    bool is_postprocessing_view;
1545
  };
1546
 
1547
  typedef std::vector<View_size> Views;
1548
 
1549
  // Write section data to the output file.  Record the views and
1550
  // sizes in VIEWS for use when relocating.
1551
  void
1552
  write_sections(const unsigned char* pshdrs, Output_file*, Views*);
1553
 
1554
  // Relocate the sections in the output file.
1555
  void
1556
  relocate_sections(const General_options& options, const Symbol_table*,
1557
                    const Layout*, const unsigned char* pshdrs, Views*);
1558
 
1559
  // Scan the input relocations for --emit-relocs.
1560
  void
1561
  emit_relocs_scan(const General_options&, Symbol_table*, Layout*,
1562
                   const unsigned char* plocal_syms,
1563
                   const Read_relocs_data::Relocs_list::iterator&);
1564
 
1565
  // Scan the input relocations for --emit-relocs, templatized on the
1566
  // type of the relocation section.
1567
  template<int sh_type>
1568
  void
1569
  emit_relocs_scan_reltype(const General_options&, Symbol_table*, Layout*,
1570
                           const unsigned char* plocal_syms,
1571
                           const Read_relocs_data::Relocs_list::iterator&,
1572
                           Relocatable_relocs*);
1573
 
1574
  // Emit the relocs for --emit-relocs.
1575
  void
1576
  emit_relocs(const Relocate_info<size, big_endian>*, unsigned int,
1577
              unsigned int sh_type, const unsigned char* prelocs,
1578
              size_t reloc_count, Output_section*, Address output_offset,
1579
              unsigned char* view, Address address,
1580
              section_size_type view_size,
1581
              unsigned char* reloc_view, section_size_type reloc_view_size);
1582
 
1583
  // Emit the relocs for --emit-relocs, templatized on the type of the
1584
  // relocation section.
1585
  template<int sh_type>
1586
  void
1587
  emit_relocs_reltype(const Relocate_info<size, big_endian>*, unsigned int,
1588
                      const unsigned char* prelocs, size_t reloc_count,
1589
                      Output_section*, Address output_offset,
1590
                      unsigned char* view, Address address,
1591
                      section_size_type view_size,
1592
                      unsigned char* reloc_view,
1593
                      section_size_type reloc_view_size);
1594
 
1595
  // Initialize input to output maps for section symbols in merged
1596
  // sections.
1597
  void
1598
  initialize_input_to_output_maps();
1599
 
1600
  // Free the input to output maps for section symbols in merged
1601
  // sections.
1602
  void
1603
  free_input_to_output_maps();
1604
 
1605
  // Write out the local symbols.
1606
  void
1607
  write_local_symbols(Output_file*,
1608
                      const Stringpool_template<char>*,
1609
                      const Stringpool_template<char>*,
1610
                      Output_symtab_xindex*,
1611
                      Output_symtab_xindex*);
1612
 
1613
  // Clear the local symbol information.
1614
  void
1615
  clear_local_symbols()
1616
  {
1617
    this->local_values_.clear();
1618
    this->local_got_offsets_.clear();
1619
  }
1620
 
1621
  // Record a mapping from discarded section SHNDX to the corresponding
1622
  // kept section.
1623
  void
1624
  set_kept_comdat_section(unsigned int shndx, Kept_comdat_section* kept)
1625
  {
1626
    this->kept_comdat_sections_[shndx] = kept;
1627
  }
1628
 
1629
  // Find the kept section corresponding to the discarded section SHNDX.
1630
  Kept_comdat_section*
1631
  get_kept_comdat_section(unsigned int shndx) const
1632
  {
1633
    typename Kept_comdat_section_table::const_iterator p =
1634
      this->kept_comdat_sections_.find(shndx);
1635
    if (p == this->kept_comdat_sections_.end())
1636
      return NULL;
1637
    return p->second;
1638
  }
1639
 
1640
  // The GOT offsets of local symbols. This map also stores GOT offsets
1641
  // for tp-relative offsets for TLS symbols.
1642
  typedef Unordered_map<unsigned int, Got_offset_list*> Local_got_offsets;
1643
 
1644
  // The TLS GOT offsets of local symbols. The map stores the offsets
1645
  // for either a single GOT entry that holds the module index of a TLS
1646
  // symbol, or a pair of GOT entries containing the module index and
1647
  // dtv-relative offset.
1648
  struct Tls_got_entry
1649
  {
1650
    Tls_got_entry(int got_offset, bool have_pair)
1651
      : got_offset_(got_offset),
1652
        have_pair_(have_pair)
1653
    { }
1654
    int got_offset_;
1655
    bool have_pair_;
1656
  };
1657
  typedef Unordered_map<unsigned int, Tls_got_entry> Local_tls_got_offsets;
1658
 
1659
  // General access to the ELF file.
1660
  elfcpp::Elf_file<size, big_endian, Object> elf_file_;
1661
  // Index of SHT_SYMTAB section.
1662
  unsigned int symtab_shndx_;
1663
  // The number of local symbols.
1664
  unsigned int local_symbol_count_;
1665
  // The number of local symbols which go into the output file.
1666
  unsigned int output_local_symbol_count_;
1667
  // The number of local symbols which go into the output file's dynamic
1668
  // symbol table.
1669
  unsigned int output_local_dynsym_count_;
1670
  // The entries in the symbol table for the external symbols.
1671
  Symbols symbols_;
1672
  // Number of symbols defined in object file itself.
1673
  size_t defined_count_;
1674
  // File offset for local symbols.
1675
  off_t local_symbol_offset_;
1676
  // File offset for local dynamic symbols.
1677
  off_t local_dynsym_offset_;
1678
  // Values of local symbols.
1679
  Local_values local_values_;
1680
  // GOT offsets for local non-TLS symbols, and tp-relative offsets
1681
  // for TLS symbols, indexed by symbol number.
1682
  Local_got_offsets local_got_offsets_;
1683
  // For each input section, the offset of the input section in its
1684
  // output section.  This is -1U if the input section requires a
1685
  // special mapping.
1686
  std::vector<Address> section_offsets_;
1687
  // Table mapping discarded comdat sections to corresponding kept sections.
1688
  Kept_comdat_section_table kept_comdat_sections_;
1689
  // Table of kept comdat groups.
1690
  Comdat_group_table comdat_groups_;
1691
  // Whether this object has a GNU style .eh_frame section.
1692
  bool has_eh_frame_;
1693
};
1694
 
1695
// A class to manage the list of all objects.
1696
 
1697
class Input_objects
1698
{
1699
 public:
1700
  Input_objects()
1701
    : relobj_list_(), dynobj_list_(), sonames_(), system_library_directory_(),
1702
      cref_(NULL)
1703
  { }
1704
 
1705
  // The type of the list of input relocateable objects.
1706
  typedef std::vector<Relobj*> Relobj_list;
1707
  typedef Relobj_list::const_iterator Relobj_iterator;
1708
 
1709
  // The type of the list of input dynamic objects.
1710
  typedef std::vector<Dynobj*> Dynobj_list;
1711
  typedef Dynobj_list::const_iterator Dynobj_iterator;
1712
 
1713
  // Add an object to the list.  Return true if all is well, or false
1714
  // if this object should be ignored.
1715
  bool
1716
  add_object(Object*);
1717
 
1718
  // Start processing an archive.
1719
  void
1720
  archive_start(Archive*);
1721
 
1722
  // Stop processing an archive.
1723
  void
1724
  archive_stop(Archive*);
1725
 
1726
  // For each dynamic object, check whether we've seen all of its
1727
  // explicit dependencies.
1728
  void
1729
  check_dynamic_dependencies() const;
1730
 
1731
  // Return whether an object was found in the system library
1732
  // directory.
1733
  bool
1734
  found_in_system_library_directory(const Object*) const;
1735
 
1736
  // Print symbol counts.
1737
  void
1738
  print_symbol_counts(const Symbol_table*) const;
1739
 
1740
  // Iterate over all regular objects.
1741
 
1742
  Relobj_iterator
1743
  relobj_begin() const
1744
  { return this->relobj_list_.begin(); }
1745
 
1746
  Relobj_iterator
1747
  relobj_end() const
1748
  { return this->relobj_list_.end(); }
1749
 
1750
  // Iterate over all dynamic objects.
1751
 
1752
  Dynobj_iterator
1753
  dynobj_begin() const
1754
  { return this->dynobj_list_.begin(); }
1755
 
1756
  Dynobj_iterator
1757
  dynobj_end() const
1758
  { return this->dynobj_list_.end(); }
1759
 
1760
  // Return whether we have seen any dynamic objects.
1761
  bool
1762
  any_dynamic() const
1763
  { return !this->dynobj_list_.empty(); }
1764
 
1765
  // Return the number of input objects.
1766
  int
1767
  number_of_input_objects() const
1768
  { return this->relobj_list_.size() + this->dynobj_list_.size(); }
1769
 
1770
 private:
1771
  Input_objects(const Input_objects&);
1772
  Input_objects& operator=(const Input_objects&);
1773
 
1774
  // The list of ordinary objects included in the link.
1775
  Relobj_list relobj_list_;
1776
  // The list of dynamic objects included in the link.
1777
  Dynobj_list dynobj_list_;
1778
  // SONAMEs that we have seen.
1779
  Unordered_set<std::string> sonames_;
1780
  // The directory in which we find the libc.so.
1781
  std::string system_library_directory_;
1782
  // Manage cross-references if requested.
1783
  Cref* cref_;
1784
};
1785
 
1786
// Some of the information we pass to the relocation routines.  We
1787
// group this together to avoid passing a dozen different arguments.
1788
 
1789
template<int size, bool big_endian>
1790
struct Relocate_info
1791
{
1792
  // Command line options.
1793
  const General_options* options;
1794
  // Symbol table.
1795
  const Symbol_table* symtab;
1796
  // Layout.
1797
  const Layout* layout;
1798
  // Object being relocated.
1799
  Sized_relobj<size, big_endian>* object;
1800
  // Section index of relocation section.
1801
  unsigned int reloc_shndx;
1802
  // Section index of section being relocated.
1803
  unsigned int data_shndx;
1804
 
1805
  // Return a string showing the location of a relocation.  This is
1806
  // only used for error messages.
1807
  std::string
1808
  location(size_t relnum, off_t reloffset) const;
1809
};
1810
 
1811
// Return an Object appropriate for the input file.  P is BYTES long,
1812
// and holds the ELF header.
1813
 
1814
extern Object*
1815
make_elf_object(const std::string& name, Input_file*,
1816
                off_t offset, const unsigned char* p,
1817
                section_offset_type bytes);
1818
 
1819
} // end namespace gold
1820
 
1821
#endif // !defined(GOLD_OBJECT_H)

powered by: WebSVN 2.1.0

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