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

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [gold/] [arm.cc] - Blame information for rev 159

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

Line No. Rev Author Line
1 27 khays
// arm.cc -- arm target support for gold.
2
 
3 159 khays
// Copyright 2009, 2010, 2011 Free Software Foundation, Inc.
4 27 khays
// Written by Doug Kwan <dougkwan@google.com> based on the i386 code
5
// by Ian Lance Taylor <iant@google.com>.
6
// This file also contains borrowed and adapted code from
7
// bfd/elf32-arm.c.
8
 
9
// This file is part of gold.
10
 
11
// This program is free software; you can redistribute it and/or modify
12
// it under the terms of the GNU General Public License as published by
13
// the Free Software Foundation; either version 3 of the License, or
14
// (at your option) any later version.
15
 
16
// This program is distributed in the hope that it will be useful,
17
// but WITHOUT ANY WARRANTY; without even the implied warranty of
18
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
// GNU General Public License for more details.
20
 
21
// You should have received a copy of the GNU General Public License
22
// along with this program; if not, write to the Free Software
23
// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
24
// MA 02110-1301, USA.
25
 
26
#include "gold.h"
27
 
28
#include <cstring>
29
#include <limits>
30
#include <cstdio>
31
#include <string>
32
#include <algorithm>
33
#include <map>
34
#include <utility>
35
#include <set>
36
 
37
#include "elfcpp.h"
38
#include "parameters.h"
39
#include "reloc.h"
40
#include "arm.h"
41
#include "object.h"
42
#include "symtab.h"
43
#include "layout.h"
44
#include "output.h"
45
#include "copy-relocs.h"
46
#include "target.h"
47
#include "target-reloc.h"
48
#include "target-select.h"
49
#include "tls.h"
50
#include "defstd.h"
51
#include "gc.h"
52
#include "attributes.h"
53
#include "arm-reloc-property.h"
54
 
55
namespace
56
{
57
 
58
using namespace gold;
59
 
60
template<bool big_endian>
61
class Output_data_plt_arm;
62
 
63
template<bool big_endian>
64
class Stub_table;
65
 
66
template<bool big_endian>
67
class Arm_input_section;
68
 
69
class Arm_exidx_cantunwind;
70
 
71
class Arm_exidx_merged_section;
72
 
73
class Arm_exidx_fixup;
74
 
75
template<bool big_endian>
76
class Arm_output_section;
77
 
78
class Arm_exidx_input_section;
79
 
80
template<bool big_endian>
81
class Arm_relobj;
82
 
83
template<bool big_endian>
84
class Arm_relocate_functions;
85
 
86
template<bool big_endian>
87
class Arm_output_data_got;
88
 
89
template<bool big_endian>
90
class Target_arm;
91
 
92
// For convenience.
93
typedef elfcpp::Elf_types<32>::Elf_Addr Arm_address;
94
 
95
// Maximum branch offsets for ARM, THUMB and THUMB2.
96
const int32_t ARM_MAX_FWD_BRANCH_OFFSET = ((((1 << 23) - 1) << 2) + 8);
97
const int32_t ARM_MAX_BWD_BRANCH_OFFSET = ((-((1 << 23) << 2)) + 8);
98
const int32_t THM_MAX_FWD_BRANCH_OFFSET = ((1 << 22) -2 + 4);
99
const int32_t THM_MAX_BWD_BRANCH_OFFSET = (-(1 << 22) + 4);
100
const int32_t THM2_MAX_FWD_BRANCH_OFFSET = (((1 << 24) - 2) + 4);
101
const int32_t THM2_MAX_BWD_BRANCH_OFFSET = (-(1 << 24) + 4);
102
 
103
// Thread Control Block size.
104
const size_t ARM_TCB_SIZE = 8;
105
 
106
// The arm target class.
107
//
108
// This is a very simple port of gold for ARM-EABI.  It is intended for
109
// supporting Android only for the time being.
110
// 
111
// TODOs:
112
// - Implement all static relocation types documented in arm-reloc.def.
113
// - Make PLTs more flexible for different architecture features like
114
//   Thumb-2 and BE8.
115
// There are probably a lot more.
116
 
117
// Ideally we would like to avoid using global variables but this is used
118
// very in many places and sometimes in loops.  If we use a function
119
// returning a static instance of Arm_reloc_property_table, it will be very
120
// slow in an threaded environment since the static instance needs to be
121
// locked.  The pointer is below initialized in the
122
// Target::do_select_as_default_target() hook so that we do not spend time
123
// building the table if we are not linking ARM objects.
124
//
125
// An alternative is to to process the information in arm-reloc.def in
126
// compilation time and generate a representation of it in PODs only.  That
127
// way we can avoid initialization when the linker starts.
128
 
129
Arm_reloc_property_table* arm_reloc_property_table = NULL;
130
 
131
// Instruction template class.  This class is similar to the insn_sequence
132
// struct in bfd/elf32-arm.c.
133
 
134
class Insn_template
135
{
136
 public:
137
  // Types of instruction templates.
138
  enum Type
139
    {
140
      THUMB16_TYPE = 1,
141
      // THUMB16_SPECIAL_TYPE is used by sub-classes of Stub for instruction 
142
      // templates with class-specific semantics.  Currently this is used
143
      // only by the Cortex_a8_stub class for handling condition codes in
144
      // conditional branches.
145
      THUMB16_SPECIAL_TYPE,
146
      THUMB32_TYPE,
147
      ARM_TYPE,
148
      DATA_TYPE
149
    };
150
 
151
  // Factory methods to create instruction templates in different formats.
152
 
153
  static const Insn_template
154
  thumb16_insn(uint32_t data)
155
  { return Insn_template(data, THUMB16_TYPE, elfcpp::R_ARM_NONE, 0); }
156
 
157
  // A Thumb conditional branch, in which the proper condition is inserted
158
  // when we build the stub.
159
  static const Insn_template
160
  thumb16_bcond_insn(uint32_t data)
161
  { return Insn_template(data, THUMB16_SPECIAL_TYPE, elfcpp::R_ARM_NONE, 1); }
162
 
163
  static const Insn_template
164
  thumb32_insn(uint32_t data)
165
  { return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_NONE, 0); }
166
 
167
  static const Insn_template
168
  thumb32_b_insn(uint32_t data, int reloc_addend)
169
  {
170
    return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_THM_JUMP24,
171
                         reloc_addend);
172
  }
173
 
174
  static const Insn_template
175
  arm_insn(uint32_t data)
176
  { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_NONE, 0); }
177
 
178
  static const Insn_template
179
  arm_rel_insn(unsigned data, int reloc_addend)
180
  { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_JUMP24, reloc_addend); }
181
 
182
  static const Insn_template
183
  data_word(unsigned data, unsigned int r_type, int reloc_addend)
184
  { return Insn_template(data, DATA_TYPE, r_type, reloc_addend); }
185
 
186
  // Accessors.  This class is used for read-only objects so no modifiers
187
  // are provided.
188
 
189
  uint32_t
190
  data() const
191
  { return this->data_; }
192
 
193
  // Return the instruction sequence type of this.
194
  Type
195
  type() const
196
  { return this->type_; }
197
 
198
  // Return the ARM relocation type of this.
199
  unsigned int
200
  r_type() const
201
  { return this->r_type_; }
202
 
203
  int32_t
204
  reloc_addend() const
205
  { return this->reloc_addend_; }
206
 
207
  // Return size of instruction template in bytes.
208
  size_t
209
  size() const;
210
 
211
  // Return byte-alignment of instruction template.
212
  unsigned
213
  alignment() const;
214
 
215
 private:
216
  // We make the constructor private to ensure that only the factory
217
  // methods are used.
218
  inline
219
  Insn_template(unsigned data, Type type, unsigned int r_type, int reloc_addend)
220
    : data_(data), type_(type), r_type_(r_type), reloc_addend_(reloc_addend)
221
  { }
222
 
223
  // Instruction specific data.  This is used to store information like
224
  // some of the instruction bits.
225
  uint32_t data_;
226
  // Instruction template type.
227
  Type type_;
228
  // Relocation type if there is a relocation or R_ARM_NONE otherwise.
229
  unsigned int r_type_;
230
  // Relocation addend.
231
  int32_t reloc_addend_;
232
};
233
 
234
// Macro for generating code to stub types. One entry per long/short
235
// branch stub
236
 
237
#define DEF_STUBS \
238
  DEF_STUB(long_branch_any_any) \
239
  DEF_STUB(long_branch_v4t_arm_thumb) \
240
  DEF_STUB(long_branch_thumb_only) \
241
  DEF_STUB(long_branch_v4t_thumb_thumb) \
242
  DEF_STUB(long_branch_v4t_thumb_arm) \
243
  DEF_STUB(short_branch_v4t_thumb_arm) \
244
  DEF_STUB(long_branch_any_arm_pic) \
245
  DEF_STUB(long_branch_any_thumb_pic) \
246
  DEF_STUB(long_branch_v4t_thumb_thumb_pic) \
247
  DEF_STUB(long_branch_v4t_arm_thumb_pic) \
248
  DEF_STUB(long_branch_v4t_thumb_arm_pic) \
249
  DEF_STUB(long_branch_thumb_only_pic) \
250
  DEF_STUB(a8_veneer_b_cond) \
251
  DEF_STUB(a8_veneer_b) \
252
  DEF_STUB(a8_veneer_bl) \
253
  DEF_STUB(a8_veneer_blx) \
254
  DEF_STUB(v4_veneer_bx)
255
 
256
// Stub types.
257
 
258
#define DEF_STUB(x) arm_stub_##x,
259
typedef enum
260
  {
261
    arm_stub_none,
262
    DEF_STUBS
263
 
264
    // First reloc stub type.
265
    arm_stub_reloc_first = arm_stub_long_branch_any_any,
266
    // Last  reloc stub type.
267
    arm_stub_reloc_last = arm_stub_long_branch_thumb_only_pic,
268
 
269
    // First Cortex-A8 stub type.
270
    arm_stub_cortex_a8_first = arm_stub_a8_veneer_b_cond,
271
    // Last Cortex-A8 stub type.
272
    arm_stub_cortex_a8_last = arm_stub_a8_veneer_blx,
273
 
274
    // Last stub type.
275
    arm_stub_type_last = arm_stub_v4_veneer_bx
276
  } Stub_type;
277
#undef DEF_STUB
278
 
279
// Stub template class.  Templates are meant to be read-only objects.
280
// A stub template for a stub type contains all read-only attributes
281
// common to all stubs of the same type.
282
 
283
class Stub_template
284
{
285
 public:
286
  Stub_template(Stub_type, const Insn_template*, size_t);
287
 
288
  ~Stub_template()
289
  { }
290
 
291
  // Return stub type.
292
  Stub_type
293
  type() const
294
  { return this->type_; }
295
 
296
  // Return an array of instruction templates.
297
  const Insn_template*
298
  insns() const
299
  { return this->insns_; }
300
 
301
  // Return size of template in number of instructions.
302
  size_t
303
  insn_count() const
304
  { return this->insn_count_; }
305
 
306
  // Return size of template in bytes.
307
  size_t
308
  size() const
309
  { return this->size_; }
310
 
311
  // Return alignment of the stub template.
312
  unsigned
313
  alignment() const
314
  { return this->alignment_; }
315
 
316
  // Return whether entry point is in thumb mode.
317
  bool
318
  entry_in_thumb_mode() const
319
  { return this->entry_in_thumb_mode_; }
320
 
321
  // Return number of relocations in this template.
322
  size_t
323
  reloc_count() const
324
  { return this->relocs_.size(); }
325
 
326
  // Return index of the I-th instruction with relocation.
327
  size_t
328
  reloc_insn_index(size_t i) const
329
  {
330
    gold_assert(i < this->relocs_.size());
331
    return this->relocs_[i].first;
332
  }
333
 
334
  // Return the offset of the I-th instruction with relocation from the
335
  // beginning of the stub.
336
  section_size_type
337
  reloc_offset(size_t i) const
338
  {
339
    gold_assert(i < this->relocs_.size());
340
    return this->relocs_[i].second;
341
  }
342
 
343
 private:
344
  // This contains information about an instruction template with a relocation
345
  // and its offset from start of stub.
346
  typedef std::pair<size_t, section_size_type> Reloc;
347
 
348
  // A Stub_template may not be copied.  We want to share templates as much
349
  // as possible.
350
  Stub_template(const Stub_template&);
351
  Stub_template& operator=(const Stub_template&);
352
 
353
  // Stub type.
354
  Stub_type type_;
355
  // Points to an array of Insn_templates.
356
  const Insn_template* insns_;
357
  // Number of Insn_templates in insns_[].
358
  size_t insn_count_;
359
  // Size of templated instructions in bytes.
360
  size_t size_;
361
  // Alignment of templated instructions.
362
  unsigned alignment_;
363
  // Flag to indicate if entry is in thumb mode.
364
  bool entry_in_thumb_mode_;
365
  // A table of reloc instruction indices and offsets.  We can find these by
366
  // looking at the instruction templates but we pre-compute and then stash
367
  // them here for speed. 
368
  std::vector<Reloc> relocs_;
369
};
370
 
371
//
372
// A class for code stubs.  This is a base class for different type of
373
// stubs used in the ARM target.
374
//
375
 
376
class Stub
377
{
378
 private:
379
  static const section_offset_type invalid_offset =
380
    static_cast<section_offset_type>(-1);
381
 
382
 public:
383
  Stub(const Stub_template* stub_template)
384
    : stub_template_(stub_template), offset_(invalid_offset)
385
  { }
386
 
387
  virtual
388
   ~Stub()
389
  { }
390
 
391
  // Return the stub template.
392
  const Stub_template*
393
  stub_template() const
394
  { return this->stub_template_; }
395
 
396
  // Return offset of code stub from beginning of its containing stub table.
397
  section_offset_type
398
  offset() const
399
  {
400
    gold_assert(this->offset_ != invalid_offset);
401
    return this->offset_;
402
  }
403
 
404
  // Set offset of code stub from beginning of its containing stub table.
405
  void
406
  set_offset(section_offset_type offset)
407
  { this->offset_ = offset; }
408
 
409
  // Return the relocation target address of the i-th relocation in the
410
  // stub.  This must be defined in a child class.
411
  Arm_address
412
  reloc_target(size_t i)
413
  { return this->do_reloc_target(i); }
414
 
415
  // Write a stub at output VIEW.  BIG_ENDIAN select how a stub is written.
416
  void
417
  write(unsigned char* view, section_size_type view_size, bool big_endian)
418
  { this->do_write(view, view_size, big_endian); }
419
 
420
  // Return the instruction for THUMB16_SPECIAL_TYPE instruction template
421
  // for the i-th instruction.
422
  uint16_t
423
  thumb16_special(size_t i)
424
  { return this->do_thumb16_special(i); }
425
 
426
 protected:
427
  // This must be defined in the child class.
428
  virtual Arm_address
429
  do_reloc_target(size_t) = 0;
430
 
431
  // This may be overridden in the child class.
432
  virtual void
433
  do_write(unsigned char* view, section_size_type view_size, bool big_endian)
434
  {
435
    if (big_endian)
436
      this->do_fixed_endian_write<true>(view, view_size);
437
    else
438
      this->do_fixed_endian_write<false>(view, view_size);
439
  }
440
 
441
  // This must be overridden if a child class uses the THUMB16_SPECIAL_TYPE
442
  // instruction template.
443
  virtual uint16_t
444
  do_thumb16_special(size_t)
445
  { gold_unreachable(); }
446
 
447
 private:
448
  // A template to implement do_write.
449
  template<bool big_endian>
450
  void inline
451
  do_fixed_endian_write(unsigned char*, section_size_type);
452
 
453
  // Its template.
454
  const Stub_template* stub_template_;
455
  // Offset within the section of containing this stub.
456
  section_offset_type offset_;
457
};
458
 
459
// Reloc stub class.  These are stubs we use to fix up relocation because
460
// of limited branch ranges.
461
 
462
class Reloc_stub : public Stub
463
{
464
 public:
465
  static const unsigned int invalid_index = static_cast<unsigned int>(-1);
466
  // We assume we never jump to this address.
467
  static const Arm_address invalid_address = static_cast<Arm_address>(-1);
468
 
469
  // Return destination address.
470
  Arm_address
471
  destination_address() const
472
  {
473
    gold_assert(this->destination_address_ != this->invalid_address);
474
    return this->destination_address_;
475
  }
476
 
477
  // Set destination address.
478
  void
479
  set_destination_address(Arm_address address)
480
  {
481
    gold_assert(address != this->invalid_address);
482
    this->destination_address_ = address;
483
  }
484
 
485
  // Reset destination address.
486
  void
487
  reset_destination_address()
488
  { this->destination_address_ = this->invalid_address; }
489
 
490
  // Determine stub type for a branch of a relocation of R_TYPE going
491
  // from BRANCH_ADDRESS to BRANCH_TARGET.  If TARGET_IS_THUMB is set,
492
  // the branch target is a thumb instruction.  TARGET is used for look
493
  // up ARM-specific linker settings.
494
  static Stub_type
495
  stub_type_for_reloc(unsigned int r_type, Arm_address branch_address,
496
                      Arm_address branch_target, bool target_is_thumb);
497
 
498
  // Reloc_stub key.  A key is logically a triplet of a stub type, a symbol
499
  // and an addend.  Since we treat global and local symbol differently, we
500
  // use a Symbol object for a global symbol and a object-index pair for
501
  // a local symbol.
502
  class Key
503
  {
504
   public:
505
    // If SYMBOL is not null, this is a global symbol, we ignore RELOBJ and
506
    // R_SYM.  Otherwise, this is a local symbol and RELOBJ must non-NULL
507
    // and R_SYM must not be invalid_index.
508
    Key(Stub_type stub_type, const Symbol* symbol, const Relobj* relobj,
509
        unsigned int r_sym, int32_t addend)
510
      : stub_type_(stub_type), addend_(addend)
511
    {
512
      if (symbol != NULL)
513
        {
514
          this->r_sym_ = Reloc_stub::invalid_index;
515
          this->u_.symbol = symbol;
516
        }
517
      else
518
        {
519
          gold_assert(relobj != NULL && r_sym != invalid_index);
520
          this->r_sym_ = r_sym;
521
          this->u_.relobj = relobj;
522
        }
523
    }
524
 
525
    ~Key()
526
    { }
527
 
528
    // Accessors: Keys are meant to be read-only object so no modifiers are
529
    // provided.
530
 
531
    // Return stub type.
532
    Stub_type
533
    stub_type() const
534
    { return this->stub_type_; }
535
 
536
    // Return the local symbol index or invalid_index.
537
    unsigned int
538
    r_sym() const
539
    { return this->r_sym_; }
540
 
541
    // Return the symbol if there is one.
542
    const Symbol*
543
    symbol() const
544
    { return this->r_sym_ == invalid_index ? this->u_.symbol : NULL; }
545
 
546
    // Return the relobj if there is one.
547
    const Relobj*
548
    relobj() const
549
    { return this->r_sym_ != invalid_index ? this->u_.relobj : NULL; }
550
 
551
    // Whether this equals to another key k.
552
    bool
553
    eq(const Key& k) const
554
    {
555
      return ((this->stub_type_ == k.stub_type_)
556
              && (this->r_sym_ == k.r_sym_)
557
              && ((this->r_sym_ != Reloc_stub::invalid_index)
558
                  ? (this->u_.relobj == k.u_.relobj)
559
                  : (this->u_.symbol == k.u_.symbol))
560
              && (this->addend_ == k.addend_));
561
    }
562
 
563
    // Return a hash value.
564
    size_t
565
    hash_value() const
566
    {
567
      return (this->stub_type_
568
              ^ this->r_sym_
569
              ^ gold::string_hash<char>(
570
                    (this->r_sym_ != Reloc_stub::invalid_index)
571
                    ? this->u_.relobj->name().c_str()
572
                    : this->u_.symbol->name())
573
              ^ this->addend_);
574
    }
575
 
576
    // Functors for STL associative containers.
577
    struct hash
578
    {
579
      size_t
580
      operator()(const Key& k) const
581
      { return k.hash_value(); }
582
    };
583
 
584
    struct equal_to
585
    {
586
      bool
587
      operator()(const Key& k1, const Key& k2) const
588
      { return k1.eq(k2); }
589
    };
590
 
591
    // Name of key.  This is mainly for debugging.
592
    std::string
593
    name() const;
594
 
595
   private:
596
    // Stub type.
597
    Stub_type stub_type_;
598
    // If this is a local symbol, this is the index in the defining object.
599
    // Otherwise, it is invalid_index for a global symbol.
600
    unsigned int r_sym_;
601
    // If r_sym_ is an invalid index, this points to a global symbol.
602
    // Otherwise, it points to a relobj.  We used the unsized and target
603
    // independent Symbol and Relobj classes instead of Sized_symbol<32> and  
604
    // Arm_relobj, in order to avoid making the stub class a template
605
    // as most of the stub machinery is endianness-neutral.  However, it
606
    // may require a bit of casting done by users of this class.
607
    union
608
    {
609
      const Symbol* symbol;
610
      const Relobj* relobj;
611
    } u_;
612
    // Addend associated with a reloc.
613
    int32_t addend_;
614
  };
615
 
616
 protected:
617
  // Reloc_stubs are created via a stub factory.  So these are protected.
618
  Reloc_stub(const Stub_template* stub_template)
619
    : Stub(stub_template), destination_address_(invalid_address)
620
  { }
621
 
622
  ~Reloc_stub()
623
  { }
624
 
625
  friend class Stub_factory;
626
 
627
  // Return the relocation target address of the i-th relocation in the
628
  // stub.
629
  Arm_address
630
  do_reloc_target(size_t i)
631
  {
632
    // All reloc stub have only one relocation.
633
    gold_assert(i == 0);
634
    return this->destination_address_;
635
  }
636
 
637
 private:
638
  // Address of destination.
639
  Arm_address destination_address_;
640
};
641
 
642
// Cortex-A8 stub class.  We need a Cortex-A8 stub to redirect any 32-bit
643
// THUMB branch that meets the following conditions:
644
// 
645
// 1. The branch straddles across a page boundary. i.e. lower 12-bit of
646
//    branch address is 0xffe.
647
// 2. The branch target address is in the same page as the first word of the
648
//    branch.
649
// 3. The branch follows a 32-bit instruction which is not a branch.
650
//
651
// To do the fix up, we need to store the address of the branch instruction
652
// and its target at least.  We also need to store the original branch
653
// instruction bits for the condition code in a conditional branch.  The
654
// condition code is used in a special instruction template.  We also want
655
// to identify input sections needing Cortex-A8 workaround quickly.  We store
656
// extra information about object and section index of the code section
657
// containing a branch being fixed up.  The information is used to mark
658
// the code section when we finalize the Cortex-A8 stubs.
659
//
660
 
661
class Cortex_a8_stub : public Stub
662
{
663
 public:
664
  ~Cortex_a8_stub()
665
  { }
666
 
667
  // Return the object of the code section containing the branch being fixed
668
  // up.
669
  Relobj*
670
  relobj() const
671
  { return this->relobj_; }
672
 
673
  // Return the section index of the code section containing the branch being
674
  // fixed up.
675
  unsigned int
676
  shndx() const
677
  { return this->shndx_; }
678
 
679
  // Return the source address of stub.  This is the address of the original
680
  // branch instruction.  LSB is 1 always set to indicate that it is a THUMB
681
  // instruction.
682
  Arm_address
683
  source_address() const
684
  { return this->source_address_; }
685
 
686
  // Return the destination address of the stub.  This is the branch taken
687
  // address of the original branch instruction.  LSB is 1 if it is a THUMB
688
  // instruction address.
689
  Arm_address
690
  destination_address() const
691
  { return this->destination_address_; }
692
 
693
  // Return the instruction being fixed up.
694
  uint32_t
695
  original_insn() const
696
  { return this->original_insn_; }
697
 
698
 protected:
699
  // Cortex_a8_stubs are created via a stub factory.  So these are protected.
700
  Cortex_a8_stub(const Stub_template* stub_template, Relobj* relobj,
701
                 unsigned int shndx, Arm_address source_address,
702
                 Arm_address destination_address, uint32_t original_insn)
703
    : Stub(stub_template), relobj_(relobj), shndx_(shndx),
704
      source_address_(source_address | 1U),
705
      destination_address_(destination_address),
706
      original_insn_(original_insn)
707
  { }
708
 
709
  friend class Stub_factory;
710
 
711
  // Return the relocation target address of the i-th relocation in the
712
  // stub.
713
  Arm_address
714
  do_reloc_target(size_t i)
715
  {
716
    if (this->stub_template()->type() == arm_stub_a8_veneer_b_cond)
717
      {
718
        // The conditional branch veneer has two relocations.
719
        gold_assert(i < 2);
720
        return i == 0 ? this->source_address_ + 4 : this->destination_address_;
721
      }
722
    else
723
      {
724
        // All other Cortex-A8 stubs have only one relocation.
725
        gold_assert(i == 0);
726
        return this->destination_address_;
727
      }
728
  }
729
 
730
  // Return an instruction for the THUMB16_SPECIAL_TYPE instruction template.
731
  uint16_t
732
  do_thumb16_special(size_t);
733
 
734
 private:
735
  // Object of the code section containing the branch being fixed up.
736
  Relobj* relobj_;
737
  // Section index of the code section containing the branch begin fixed up.
738
  unsigned int shndx_;
739
  // Source address of original branch.
740
  Arm_address source_address_;
741
  // Destination address of the original branch.
742
  Arm_address destination_address_;
743
  // Original branch instruction.  This is needed for copying the condition
744
  // code from a condition branch to its stub.
745
  uint32_t original_insn_;
746
};
747
 
748
// ARMv4 BX Rx branch relocation stub class.
749
class Arm_v4bx_stub : public Stub
750
{
751
 public:
752
  ~Arm_v4bx_stub()
753
  { }
754
 
755
  // Return the associated register.
756
  uint32_t
757
  reg() const
758
  { return this->reg_; }
759
 
760
 protected:
761
  // Arm V4BX stubs are created via a stub factory.  So these are protected.
762
  Arm_v4bx_stub(const Stub_template* stub_template, const uint32_t reg)
763
    : Stub(stub_template), reg_(reg)
764
  { }
765
 
766
  friend class Stub_factory;
767
 
768
  // Return the relocation target address of the i-th relocation in the
769
  // stub.
770
  Arm_address
771
  do_reloc_target(size_t)
772
  { gold_unreachable(); }
773
 
774
  // This may be overridden in the child class.
775
  virtual void
776
  do_write(unsigned char* view, section_size_type view_size, bool big_endian)
777
  {
778
    if (big_endian)
779
      this->do_fixed_endian_v4bx_write<true>(view, view_size);
780
    else
781
      this->do_fixed_endian_v4bx_write<false>(view, view_size);
782
  }
783
 
784
 private:
785
  // A template to implement do_write.
786
  template<bool big_endian>
787
  void inline
788
  do_fixed_endian_v4bx_write(unsigned char* view, section_size_type)
789
  {
790
    const Insn_template* insns = this->stub_template()->insns();
791
    elfcpp::Swap<32, big_endian>::writeval(view,
792
                                           (insns[0].data()
793
                                           + (this->reg_ << 16)));
794
    view += insns[0].size();
795
    elfcpp::Swap<32, big_endian>::writeval(view,
796
                                           (insns[1].data() + this->reg_));
797
    view += insns[1].size();
798
    elfcpp::Swap<32, big_endian>::writeval(view,
799
                                           (insns[2].data() + this->reg_));
800
  }
801
 
802
  // A register index (r0-r14), which is associated with the stub.
803
  uint32_t reg_;
804
};
805
 
806
// Stub factory class.
807
 
808
class Stub_factory
809
{
810
 public:
811
  // Return the unique instance of this class.
812
  static const Stub_factory&
813
  get_instance()
814
  {
815
    static Stub_factory singleton;
816
    return singleton;
817
  }
818
 
819
  // Make a relocation stub.
820
  Reloc_stub*
821
  make_reloc_stub(Stub_type stub_type) const
822
  {
823
    gold_assert(stub_type >= arm_stub_reloc_first
824
                && stub_type <= arm_stub_reloc_last);
825
    return new Reloc_stub(this->stub_templates_[stub_type]);
826
  }
827
 
828
  // Make a Cortex-A8 stub.
829
  Cortex_a8_stub*
830
  make_cortex_a8_stub(Stub_type stub_type, Relobj* relobj, unsigned int shndx,
831
                      Arm_address source, Arm_address destination,
832
                      uint32_t original_insn) const
833
  {
834
    gold_assert(stub_type >= arm_stub_cortex_a8_first
835
                && stub_type <= arm_stub_cortex_a8_last);
836
    return new Cortex_a8_stub(this->stub_templates_[stub_type], relobj, shndx,
837
                              source, destination, original_insn);
838
  }
839
 
840
  // Make an ARM V4BX relocation stub.
841
  // This method creates a stub from the arm_stub_v4_veneer_bx template only.
842
  Arm_v4bx_stub*
843
  make_arm_v4bx_stub(uint32_t reg) const
844
  {
845
    gold_assert(reg < 0xf);
846
    return new Arm_v4bx_stub(this->stub_templates_[arm_stub_v4_veneer_bx],
847
                             reg);
848
  }
849
 
850
 private:
851
  // Constructor and destructor are protected since we only return a single
852
  // instance created in Stub_factory::get_instance().
853
 
854
  Stub_factory();
855
 
856
  // A Stub_factory may not be copied since it is a singleton.
857
  Stub_factory(const Stub_factory&);
858
  Stub_factory& operator=(Stub_factory&);
859
 
860
  // Stub templates.  These are initialized in the constructor.
861
  const Stub_template* stub_templates_[arm_stub_type_last+1];
862
};
863
 
864
// A class to hold stubs for the ARM target.
865
 
866
template<bool big_endian>
867
class Stub_table : public Output_data
868
{
869
 public:
870
  Stub_table(Arm_input_section<big_endian>* owner)
871
    : Output_data(), owner_(owner), reloc_stubs_(), reloc_stubs_size_(0),
872
      reloc_stubs_addralign_(1), cortex_a8_stubs_(), arm_v4bx_stubs_(0xf),
873
      prev_data_size_(0), prev_addralign_(1)
874
  { }
875
 
876
  ~Stub_table()
877
  { }
878
 
879
  // Owner of this stub table.
880
  Arm_input_section<big_endian>*
881
  owner() const
882
  { return this->owner_; }
883
 
884
  // Whether this stub table is empty.
885
  bool
886
  empty() const
887
  {
888
    return (this->reloc_stubs_.empty()
889
            && this->cortex_a8_stubs_.empty()
890
            && this->arm_v4bx_stubs_.empty());
891
  }
892
 
893
  // Return the current data size.
894
  off_t
895
  current_data_size() const
896
  { return this->current_data_size_for_child(); }
897
 
898
  // Add a STUB using KEY.  The caller is responsible for avoiding addition
899
  // if a STUB with the same key has already been added.
900
  void
901
  add_reloc_stub(Reloc_stub* stub, const Reloc_stub::Key& key)
902
  {
903
    const Stub_template* stub_template = stub->stub_template();
904
    gold_assert(stub_template->type() == key.stub_type());
905
    this->reloc_stubs_[key] = stub;
906
 
907
    // Assign stub offset early.  We can do this because we never remove
908
    // reloc stubs and they are in the beginning of the stub table.
909
    uint64_t align = stub_template->alignment();
910
    this->reloc_stubs_size_ = align_address(this->reloc_stubs_size_, align);
911
    stub->set_offset(this->reloc_stubs_size_);
912
    this->reloc_stubs_size_ += stub_template->size();
913
    this->reloc_stubs_addralign_ =
914
      std::max(this->reloc_stubs_addralign_, align);
915
  }
916
 
917
  // Add a Cortex-A8 STUB that fixes up a THUMB branch at ADDRESS.
918
  // The caller is responsible for avoiding addition if a STUB with the same
919
  // address has already been added.
920
  void
921
  add_cortex_a8_stub(Arm_address address, Cortex_a8_stub* stub)
922
  {
923
    std::pair<Arm_address, Cortex_a8_stub*> value(address, stub);
924
    this->cortex_a8_stubs_.insert(value);
925
  }
926
 
927
  // Add an ARM V4BX relocation stub. A register index will be retrieved
928
  // from the stub.
929
  void
930
  add_arm_v4bx_stub(Arm_v4bx_stub* stub)
931
  {
932
    gold_assert(stub != NULL && this->arm_v4bx_stubs_[stub->reg()] == NULL);
933
    this->arm_v4bx_stubs_[stub->reg()] = stub;
934
  }
935
 
936
  // Remove all Cortex-A8 stubs.
937
  void
938
  remove_all_cortex_a8_stubs();
939
 
940
  // Look up a relocation stub using KEY.  Return NULL if there is none.
941
  Reloc_stub*
942
  find_reloc_stub(const Reloc_stub::Key& key) const
943
  {
944
    typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.find(key);
945
    return (p != this->reloc_stubs_.end()) ? p->second : NULL;
946
  }
947
 
948
  // Look up an arm v4bx relocation stub using the register index.
949
  // Return NULL if there is none.
950
  Arm_v4bx_stub*
951
  find_arm_v4bx_stub(const uint32_t reg) const
952
  {
953
    gold_assert(reg < 0xf);
954
    return this->arm_v4bx_stubs_[reg];
955
  }
956
 
957
  // Relocate stubs in this stub table.
958
  void
959
  relocate_stubs(const Relocate_info<32, big_endian>*,
960
                 Target_arm<big_endian>*, Output_section*,
961
                 unsigned char*, Arm_address, section_size_type);
962
 
963
  // Update data size and alignment at the end of a relaxation pass.  Return
964
  // true if either data size or alignment is different from that of the
965
  // previous relaxation pass.
966
  bool
967
  update_data_size_and_addralign();
968
 
969
  // Finalize stubs.  Set the offsets of all stubs and mark input sections
970
  // needing the Cortex-A8 workaround.
971
  void
972
  finalize_stubs();
973
 
974
  // Apply Cortex-A8 workaround to an address range.
975
  void
976
  apply_cortex_a8_workaround_to_address_range(Target_arm<big_endian>*,
977
                                              unsigned char*, Arm_address,
978
                                              section_size_type);
979
 
980
 protected:
981
  // Write out section contents.
982
  void
983
  do_write(Output_file*);
984
 
985
  // Return the required alignment.
986
  uint64_t
987
  do_addralign() const
988
  { return this->prev_addralign_; }
989
 
990
  // Reset address and file offset.
991
  void
992
  do_reset_address_and_file_offset()
993
  { this->set_current_data_size_for_child(this->prev_data_size_); }
994
 
995
  // Set final data size.
996
  void
997
  set_final_data_size()
998
  { this->set_data_size(this->current_data_size()); }
999
 
1000
 private:
1001
  // Relocate one stub.
1002
  void
1003
  relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
1004
                Target_arm<big_endian>*, Output_section*,
1005
                unsigned char*, Arm_address, section_size_type);
1006
 
1007
  // Unordered map of relocation stubs.
1008
  typedef
1009
    Unordered_map<Reloc_stub::Key, Reloc_stub*, Reloc_stub::Key::hash,
1010
                  Reloc_stub::Key::equal_to>
1011
    Reloc_stub_map;
1012
 
1013
  // List of Cortex-A8 stubs ordered by addresses of branches being
1014
  // fixed up in output.
1015
  typedef std::map<Arm_address, Cortex_a8_stub*> Cortex_a8_stub_list;
1016
  // List of Arm V4BX relocation stubs ordered by associated registers.
1017
  typedef std::vector<Arm_v4bx_stub*> Arm_v4bx_stub_list;
1018
 
1019
  // Owner of this stub table.
1020
  Arm_input_section<big_endian>* owner_;
1021
  // The relocation stubs.
1022
  Reloc_stub_map reloc_stubs_;
1023
  // Size of reloc stubs.
1024
  off_t reloc_stubs_size_;
1025
  // Maximum address alignment of reloc stubs.
1026
  uint64_t reloc_stubs_addralign_;
1027
  // The cortex_a8_stubs.
1028
  Cortex_a8_stub_list cortex_a8_stubs_;
1029
  // The Arm V4BX relocation stubs.
1030
  Arm_v4bx_stub_list arm_v4bx_stubs_;
1031
  // data size of this in the previous pass.
1032
  off_t prev_data_size_;
1033
  // address alignment of this in the previous pass.
1034
  uint64_t prev_addralign_;
1035
};
1036
 
1037
// Arm_exidx_cantunwind class.  This represents an EXIDX_CANTUNWIND entry
1038
// we add to the end of an EXIDX input section that goes into the output.
1039
 
1040
class Arm_exidx_cantunwind : public Output_section_data
1041
{
1042
 public:
1043
  Arm_exidx_cantunwind(Relobj* relobj, unsigned int shndx)
1044
    : Output_section_data(8, 4, true), relobj_(relobj), shndx_(shndx)
1045
  { }
1046
 
1047
  // Return the object containing the section pointed by this.
1048
  Relobj*
1049
  relobj() const
1050
  { return this->relobj_; }
1051
 
1052
  // Return the section index of the section pointed by this.
1053
  unsigned int
1054
  shndx() const
1055
  { return this->shndx_; }
1056
 
1057
 protected:
1058
  void
1059
  do_write(Output_file* of)
1060
  {
1061
    if (parameters->target().is_big_endian())
1062
      this->do_fixed_endian_write<true>(of);
1063
    else
1064
      this->do_fixed_endian_write<false>(of);
1065
  }
1066
 
1067
  // Write to a map file.
1068
  void
1069
  do_print_to_mapfile(Mapfile* mapfile) const
1070
  { mapfile->print_output_data(this, _("** ARM cantunwind")); }
1071
 
1072
 private:
1073
  // Implement do_write for a given endianness.
1074
  template<bool big_endian>
1075
  void inline
1076
  do_fixed_endian_write(Output_file*);
1077
 
1078
  // The object containing the section pointed by this.
1079
  Relobj* relobj_;
1080
  // The section index of the section pointed by this.
1081
  unsigned int shndx_;
1082
};
1083
 
1084
// During EXIDX coverage fix-up, we compact an EXIDX section.  The
1085
// Offset map is used to map input section offset within the EXIDX section
1086
// to the output offset from the start of this EXIDX section. 
1087
 
1088
typedef std::map<section_offset_type, section_offset_type>
1089
        Arm_exidx_section_offset_map;
1090
 
1091
// Arm_exidx_merged_section class.  This represents an EXIDX input section
1092
// with some of its entries merged.
1093
 
1094
class Arm_exidx_merged_section : public Output_relaxed_input_section
1095
{
1096
 public:
1097
  // Constructor for Arm_exidx_merged_section.
1098
  // EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
1099
  // SECTION_OFFSET_MAP points to a section offset map describing how
1100
  // parts of the input section are mapped to output.  DELETED_BYTES is
1101
  // the number of bytes deleted from the EXIDX input section.
1102
  Arm_exidx_merged_section(
1103
      const Arm_exidx_input_section& exidx_input_section,
1104
      const Arm_exidx_section_offset_map& section_offset_map,
1105
      uint32_t deleted_bytes);
1106
 
1107
  // Build output contents.
1108
  void
1109
  build_contents(const unsigned char*, section_size_type);
1110
 
1111
  // Return the original EXIDX input section.
1112
  const Arm_exidx_input_section&
1113
  exidx_input_section() const
1114
  { return this->exidx_input_section_; }
1115
 
1116
  // Return the section offset map.
1117
  const Arm_exidx_section_offset_map&
1118
  section_offset_map() const
1119
  { return this->section_offset_map_; }
1120
 
1121
 protected:
1122
  // Write merged section into file OF.
1123
  void
1124
  do_write(Output_file* of);
1125
 
1126
  bool
1127
  do_output_offset(const Relobj*, unsigned int, section_offset_type,
1128
                  section_offset_type*) const;
1129
 
1130
 private:
1131
  // Original EXIDX input section.
1132
  const Arm_exidx_input_section& exidx_input_section_;
1133
  // Section offset map.
1134
  const Arm_exidx_section_offset_map& section_offset_map_;
1135
  // Merged section contents.  We need to keep build the merged section 
1136
  // and save it here to avoid accessing the original EXIDX section when
1137
  // we cannot lock the sections' object.
1138
  unsigned char* section_contents_;
1139
};
1140
 
1141
// A class to wrap an ordinary input section containing executable code.
1142
 
1143
template<bool big_endian>
1144
class Arm_input_section : public Output_relaxed_input_section
1145
{
1146
 public:
1147
  Arm_input_section(Relobj* relobj, unsigned int shndx)
1148
    : Output_relaxed_input_section(relobj, shndx, 1),
1149
      original_addralign_(1), original_size_(0), stub_table_(NULL),
1150
      original_contents_(NULL)
1151
  { }
1152
 
1153
  ~Arm_input_section()
1154
  { delete[] this->original_contents_; }
1155
 
1156
  // Initialize.
1157
  void
1158
  init();
1159
 
1160
  // Whether this is a stub table owner.
1161
  bool
1162
  is_stub_table_owner() const
1163
  { return this->stub_table_ != NULL && this->stub_table_->owner() == this; }
1164
 
1165
  // Return the stub table.
1166
  Stub_table<big_endian>*
1167
  stub_table() const
1168
  { return this->stub_table_; }
1169
 
1170
  // Set the stub_table.
1171
  void
1172
  set_stub_table(Stub_table<big_endian>* stub_table)
1173
  { this->stub_table_ = stub_table; }
1174
 
1175
  // Downcast a base pointer to an Arm_input_section pointer.  This is
1176
  // not type-safe but we only use Arm_input_section not the base class.
1177
  static Arm_input_section<big_endian>*
1178
  as_arm_input_section(Output_relaxed_input_section* poris)
1179
  { return static_cast<Arm_input_section<big_endian>*>(poris); }
1180
 
1181
  // Return the original size of the section.
1182
  uint32_t
1183
  original_size() const
1184
  { return this->original_size_; }
1185
 
1186
 protected:
1187
  // Write data to output file.
1188
  void
1189
  do_write(Output_file*);
1190
 
1191
  // Return required alignment of this.
1192
  uint64_t
1193
  do_addralign() const
1194
  {
1195
    if (this->is_stub_table_owner())
1196
      return std::max(this->stub_table_->addralign(),
1197
                      static_cast<uint64_t>(this->original_addralign_));
1198
    else
1199
      return this->original_addralign_;
1200
  }
1201
 
1202
  // Finalize data size.
1203
  void
1204
  set_final_data_size();
1205
 
1206
  // Reset address and file offset.
1207
  void
1208
  do_reset_address_and_file_offset();
1209
 
1210
  // Output offset.
1211
  bool
1212
  do_output_offset(const Relobj* object, unsigned int shndx,
1213
                   section_offset_type offset,
1214
                   section_offset_type* poutput) const
1215
  {
1216
    if ((object == this->relobj())
1217
        && (shndx == this->shndx())
1218
        && (offset >= 0)
1219
        && (offset <=
1220
            convert_types<section_offset_type, uint32_t>(this->original_size_)))
1221
      {
1222
        *poutput = offset;
1223
        return true;
1224
      }
1225
    else
1226
      return false;
1227
  }
1228
 
1229
 private:
1230
  // Copying is not allowed.
1231
  Arm_input_section(const Arm_input_section&);
1232
  Arm_input_section& operator=(const Arm_input_section&);
1233
 
1234
  // Address alignment of the original input section.
1235
  uint32_t original_addralign_;
1236
  // Section size of the original input section.
1237
  uint32_t original_size_;
1238
  // Stub table.
1239
  Stub_table<big_endian>* stub_table_;
1240
  // Original section contents.  We have to make a copy here since the file
1241
  // containing the original section may not be locked when we need to access
1242
  // the contents.
1243
  unsigned char* original_contents_;
1244
};
1245
 
1246
// Arm_exidx_fixup class.  This is used to define a number of methods
1247
// and keep states for fixing up EXIDX coverage.
1248
 
1249
class Arm_exidx_fixup
1250
{
1251
 public:
1252
  Arm_exidx_fixup(Output_section* exidx_output_section,
1253
                  bool merge_exidx_entries = true)
1254
    : exidx_output_section_(exidx_output_section), last_unwind_type_(UT_NONE),
1255
      last_inlined_entry_(0), last_input_section_(NULL),
1256
      section_offset_map_(NULL), first_output_text_section_(NULL),
1257
      merge_exidx_entries_(merge_exidx_entries)
1258
  { }
1259
 
1260
  ~Arm_exidx_fixup()
1261
  { delete this->section_offset_map_; }
1262
 
1263
  // Process an EXIDX section for entry merging.  SECTION_CONTENTS points
1264
  // to the EXIDX contents and SECTION_SIZE is the size of the contents. Return
1265
  // number of bytes to be deleted in output.  If parts of the input EXIDX
1266
  // section are merged a heap allocated Arm_exidx_section_offset_map is store
1267
  // in the located PSECTION_OFFSET_MAP.   The caller owns the map and is
1268
  // responsible for releasing it.
1269
  template<bool big_endian>
1270
  uint32_t
1271
  process_exidx_section(const Arm_exidx_input_section* exidx_input_section,
1272
                        const unsigned char* section_contents,
1273
                        section_size_type section_size,
1274
                        Arm_exidx_section_offset_map** psection_offset_map);
1275
 
1276
  // Append an EXIDX_CANTUNWIND entry pointing at the end of the last
1277
  // input section, if there is not one already.
1278
  void
1279
  add_exidx_cantunwind_as_needed();
1280
 
1281
  // Return the output section for the text section which is linked to the
1282
  // first exidx input in output.
1283
  Output_section*
1284
  first_output_text_section() const
1285
  { return this->first_output_text_section_; }
1286
 
1287
 private:
1288
  // Copying is not allowed.
1289
  Arm_exidx_fixup(const Arm_exidx_fixup&);
1290
  Arm_exidx_fixup& operator=(const Arm_exidx_fixup&);
1291
 
1292
  // Type of EXIDX unwind entry.
1293
  enum Unwind_type
1294
  {
1295
    // No type.
1296
    UT_NONE,
1297
    // EXIDX_CANTUNWIND.
1298
    UT_EXIDX_CANTUNWIND,
1299
    // Inlined entry.
1300
    UT_INLINED_ENTRY,
1301
    // Normal entry.
1302
    UT_NORMAL_ENTRY,
1303
  };
1304
 
1305
  // Process an EXIDX entry.  We only care about the second word of the
1306
  // entry.  Return true if the entry can be deleted.
1307
  bool
1308
  process_exidx_entry(uint32_t second_word);
1309
 
1310
  // Update the current section offset map during EXIDX section fix-up.
1311
  // If there is no map, create one.  INPUT_OFFSET is the offset of a
1312
  // reference point, DELETED_BYTES is the number of deleted by in the
1313
  // section so far.  If DELETE_ENTRY is true, the reference point and
1314
  // all offsets after the previous reference point are discarded.
1315
  void
1316
  update_offset_map(section_offset_type input_offset,
1317
                    section_size_type deleted_bytes, bool delete_entry);
1318
 
1319
  // EXIDX output section.
1320
  Output_section* exidx_output_section_;
1321
  // Unwind type of the last EXIDX entry processed.
1322
  Unwind_type last_unwind_type_;
1323
  // Last seen inlined EXIDX entry.
1324
  uint32_t last_inlined_entry_;
1325
  // Last processed EXIDX input section.
1326
  const Arm_exidx_input_section* last_input_section_;
1327
  // Section offset map created in process_exidx_section.
1328
  Arm_exidx_section_offset_map* section_offset_map_;
1329
  // Output section for the text section which is linked to the first exidx
1330
  // input in output.
1331
  Output_section* first_output_text_section_;
1332
 
1333
  bool merge_exidx_entries_;
1334
};
1335
 
1336
// Arm output section class.  This is defined mainly to add a number of
1337
// stub generation methods.
1338
 
1339
template<bool big_endian>
1340
class Arm_output_section : public Output_section
1341
{
1342
 public:
1343
  typedef std::vector<std::pair<Relobj*, unsigned int> > Text_section_list;
1344
 
1345
  // We need to force SHF_LINK_ORDER in a SHT_ARM_EXIDX section.
1346
  Arm_output_section(const char* name, elfcpp::Elf_Word type,
1347
                     elfcpp::Elf_Xword flags)
1348
    : Output_section(name, type,
1349
                     (type == elfcpp::SHT_ARM_EXIDX
1350
                      ? flags | elfcpp::SHF_LINK_ORDER
1351
                      : flags))
1352
  {
1353
    if (type == elfcpp::SHT_ARM_EXIDX)
1354
      this->set_always_keeps_input_sections();
1355
  }
1356
 
1357
  ~Arm_output_section()
1358
  { }
1359
 
1360
  // Group input sections for stub generation.
1361
  void
1362
  group_sections(section_size_type, bool, Target_arm<big_endian>*, const Task*);
1363
 
1364
  // Downcast a base pointer to an Arm_output_section pointer.  This is
1365
  // not type-safe but we only use Arm_output_section not the base class.
1366
  static Arm_output_section<big_endian>*
1367
  as_arm_output_section(Output_section* os)
1368
  { return static_cast<Arm_output_section<big_endian>*>(os); }
1369
 
1370
  // Append all input text sections in this into LIST.
1371
  void
1372
  append_text_sections_to_list(Text_section_list* list);
1373
 
1374
  // Fix EXIDX coverage of this EXIDX output section.  SORTED_TEXT_SECTION
1375
  // is a list of text input sections sorted in ascending order of their
1376
  // output addresses.
1377
  void
1378
  fix_exidx_coverage(Layout* layout,
1379
                     const Text_section_list& sorted_text_section,
1380
                     Symbol_table* symtab,
1381
                     bool merge_exidx_entries,
1382
                     const Task* task);
1383
 
1384
  // Link an EXIDX section into its corresponding text section.
1385
  void
1386
  set_exidx_section_link();
1387
 
1388
 private:
1389
  // For convenience.
1390
  typedef Output_section::Input_section Input_section;
1391
  typedef Output_section::Input_section_list Input_section_list;
1392
 
1393
  // Create a stub group.
1394
  void create_stub_group(Input_section_list::const_iterator,
1395
                         Input_section_list::const_iterator,
1396
                         Input_section_list::const_iterator,
1397
                         Target_arm<big_endian>*,
1398
                         std::vector<Output_relaxed_input_section*>*,
1399
                         const Task* task);
1400
};
1401
 
1402
// Arm_exidx_input_section class.  This represents an EXIDX input section.
1403
 
1404
class Arm_exidx_input_section
1405
{
1406
 public:
1407
  static const section_offset_type invalid_offset =
1408
    static_cast<section_offset_type>(-1);
1409
 
1410
  Arm_exidx_input_section(Relobj* relobj, unsigned int shndx,
1411
                          unsigned int link, uint32_t size,
1412
                          uint32_t addralign, uint32_t text_size)
1413
    : relobj_(relobj), shndx_(shndx), link_(link), size_(size),
1414
      addralign_(addralign), text_size_(text_size), has_errors_(false)
1415
  { }
1416
 
1417
  ~Arm_exidx_input_section()
1418
  { }
1419
 
1420
  // Accessors:  This is a read-only class.
1421
 
1422
  // Return the object containing this EXIDX input section.
1423
  Relobj*
1424
  relobj() const
1425
  { return this->relobj_; }
1426
 
1427
  // Return the section index of this EXIDX input section.
1428
  unsigned int
1429
  shndx() const
1430
  { return this->shndx_; }
1431
 
1432
  // Return the section index of linked text section in the same object.
1433
  unsigned int
1434
  link() const
1435
  { return this->link_; }
1436
 
1437
  // Return size of the EXIDX input section.
1438
  uint32_t
1439
  size() const
1440
  { return this->size_; }
1441
 
1442
  // Return address alignment of EXIDX input section.
1443
  uint32_t
1444
  addralign() const
1445
  { return this->addralign_; }
1446
 
1447
  // Return size of the associated text input section.
1448
  uint32_t
1449
  text_size() const
1450
  { return this->text_size_; }
1451
 
1452
  // Whether there are any errors in the EXIDX input section.
1453
  bool
1454
  has_errors() const
1455
  { return this->has_errors_; }
1456
 
1457
  // Set has-errors flag.
1458
  void
1459
  set_has_errors()
1460
  { this->has_errors_ = true; }
1461
 
1462
 private:
1463
  // Object containing this.
1464
  Relobj* relobj_;
1465
  // Section index of this.
1466
  unsigned int shndx_;
1467
  // text section linked to this in the same object.
1468
  unsigned int link_;
1469
  // Size of this.  For ARM 32-bit is sufficient.
1470
  uint32_t size_;
1471
  // Address alignment of this.  For ARM 32-bit is sufficient.
1472
  uint32_t addralign_;
1473
  // Size of associated text section.
1474
  uint32_t text_size_;
1475
  // Whether this has any errors.
1476
  bool has_errors_;
1477
};
1478
 
1479
// Arm_relobj class.
1480
 
1481
template<bool big_endian>
1482
class Arm_relobj : public Sized_relobj_file<32, big_endian>
1483
{
1484
 public:
1485
  static const Arm_address invalid_address = static_cast<Arm_address>(-1);
1486
 
1487
  Arm_relobj(const std::string& name, Input_file* input_file, off_t offset,
1488
             const typename elfcpp::Ehdr<32, big_endian>& ehdr)
1489
    : Sized_relobj_file<32, big_endian>(name, input_file, offset, ehdr),
1490
      stub_tables_(), local_symbol_is_thumb_function_(),
1491
      attributes_section_data_(NULL), mapping_symbols_info_(),
1492
      section_has_cortex_a8_workaround_(NULL), exidx_section_map_(),
1493
      output_local_symbol_count_needs_update_(false),
1494
      merge_flags_and_attributes_(true)
1495
  { }
1496
 
1497
  ~Arm_relobj()
1498
  { delete this->attributes_section_data_; }
1499
 
1500
  // Return the stub table of the SHNDX-th section if there is one.
1501
  Stub_table<big_endian>*
1502
  stub_table(unsigned int shndx) const
1503
  {
1504
    gold_assert(shndx < this->stub_tables_.size());
1505
    return this->stub_tables_[shndx];
1506
  }
1507
 
1508
  // Set STUB_TABLE to be the stub_table of the SHNDX-th section.
1509
  void
1510
  set_stub_table(unsigned int shndx, Stub_table<big_endian>* stub_table)
1511
  {
1512
    gold_assert(shndx < this->stub_tables_.size());
1513
    this->stub_tables_[shndx] = stub_table;
1514
  }
1515
 
1516
  // Whether a local symbol is a THUMB function.  R_SYM is the symbol table
1517
  // index.  This is only valid after do_count_local_symbol is called.
1518
  bool
1519
  local_symbol_is_thumb_function(unsigned int r_sym) const
1520
  {
1521
    gold_assert(r_sym < this->local_symbol_is_thumb_function_.size());
1522
    return this->local_symbol_is_thumb_function_[r_sym];
1523
  }
1524
 
1525
  // Scan all relocation sections for stub generation.
1526
  void
1527
  scan_sections_for_stubs(Target_arm<big_endian>*, const Symbol_table*,
1528
                          const Layout*);
1529
 
1530
  // Convert regular input section with index SHNDX to a relaxed section.
1531
  void
1532
  convert_input_section_to_relaxed_section(unsigned shndx)
1533
  {
1534
    // The stubs have relocations and we need to process them after writing
1535
    // out the stubs.  So relocation now must follow section write.
1536
    this->set_section_offset(shndx, -1ULL);
1537
    this->set_relocs_must_follow_section_writes();
1538
  }
1539
 
1540
  // Downcast a base pointer to an Arm_relobj pointer.  This is
1541
  // not type-safe but we only use Arm_relobj not the base class.
1542
  static Arm_relobj<big_endian>*
1543
  as_arm_relobj(Relobj* relobj)
1544
  { return static_cast<Arm_relobj<big_endian>*>(relobj); }
1545
 
1546
  // Processor-specific flags in ELF file header.  This is valid only after
1547
  // reading symbols.
1548
  elfcpp::Elf_Word
1549
  processor_specific_flags() const
1550
  { return this->processor_specific_flags_; }
1551
 
1552
  // Attribute section data  This is the contents of the .ARM.attribute section
1553
  // if there is one.
1554
  const Attributes_section_data*
1555
  attributes_section_data() const
1556
  { return this->attributes_section_data_; }
1557
 
1558
  // Mapping symbol location.
1559
  typedef std::pair<unsigned int, Arm_address> Mapping_symbol_position;
1560
 
1561
  // Functor for STL container.
1562
  struct Mapping_symbol_position_less
1563
  {
1564
    bool
1565
    operator()(const Mapping_symbol_position& p1,
1566
               const Mapping_symbol_position& p2) const
1567
    {
1568
      return (p1.first < p2.first
1569
              || (p1.first == p2.first && p1.second < p2.second));
1570
    }
1571
  };
1572
 
1573
  // We only care about the first character of a mapping symbol, so
1574
  // we only store that instead of the whole symbol name.
1575
  typedef std::map<Mapping_symbol_position, char,
1576
                   Mapping_symbol_position_less> Mapping_symbols_info;
1577
 
1578
  // Whether a section contains any Cortex-A8 workaround.
1579
  bool
1580
  section_has_cortex_a8_workaround(unsigned int shndx) const
1581
  {
1582
    return (this->section_has_cortex_a8_workaround_ != NULL
1583
            && (*this->section_has_cortex_a8_workaround_)[shndx]);
1584
  }
1585
 
1586
  // Mark a section that has Cortex-A8 workaround.
1587
  void
1588
  mark_section_for_cortex_a8_workaround(unsigned int shndx)
1589
  {
1590
    if (this->section_has_cortex_a8_workaround_ == NULL)
1591
      this->section_has_cortex_a8_workaround_ =
1592
        new std::vector<bool>(this->shnum(), false);
1593
    (*this->section_has_cortex_a8_workaround_)[shndx] = true;
1594
  }
1595
 
1596
  // Return the EXIDX section of an text section with index SHNDX or NULL
1597
  // if the text section has no associated EXIDX section.
1598
  const Arm_exidx_input_section*
1599
  exidx_input_section_by_link(unsigned int shndx) const
1600
  {
1601
    Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1602
    return ((p != this->exidx_section_map_.end()
1603
             && p->second->link() == shndx)
1604
            ? p->second
1605
            : NULL);
1606
  }
1607
 
1608
  // Return the EXIDX section with index SHNDX or NULL if there is none.
1609
  const Arm_exidx_input_section*
1610
  exidx_input_section_by_shndx(unsigned shndx) const
1611
  {
1612
    Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1613
    return ((p != this->exidx_section_map_.end()
1614
             && p->second->shndx() == shndx)
1615
            ? p->second
1616
            : NULL);
1617
  }
1618
 
1619
  // Whether output local symbol count needs updating.
1620
  bool
1621
  output_local_symbol_count_needs_update() const
1622
  { return this->output_local_symbol_count_needs_update_; }
1623
 
1624
  // Set output_local_symbol_count_needs_update flag to be true.
1625
  void
1626
  set_output_local_symbol_count_needs_update()
1627
  { this->output_local_symbol_count_needs_update_ = true; }
1628
 
1629
  // Update output local symbol count at the end of relaxation.
1630
  void
1631
  update_output_local_symbol_count();
1632
 
1633
  // Whether we want to merge processor-specific flags and attributes.
1634
  bool
1635
  merge_flags_and_attributes() const
1636
  { return this->merge_flags_and_attributes_; }
1637
 
1638
  // Export list of EXIDX section indices.
1639
  void
1640
  get_exidx_shndx_list(std::vector<unsigned int>* list) const
1641
  {
1642
    list->clear();
1643
    for (Exidx_section_map::const_iterator p = this->exidx_section_map_.begin();
1644
         p != this->exidx_section_map_.end();
1645
         ++p)
1646
      {
1647
        if (p->second->shndx() == p->first)
1648
          list->push_back(p->first);
1649
      }
1650
    // Sort list to make result independent of implementation of map. 
1651
    std::sort(list->begin(), list->end());
1652
  }
1653
 
1654
 protected:
1655
  // Post constructor setup.
1656
  void
1657
  do_setup()
1658
  {
1659
    // Call parent's setup method.
1660
    Sized_relobj_file<32, big_endian>::do_setup();
1661
 
1662
    // Initialize look-up tables.
1663
    Stub_table_list empty_stub_table_list(this->shnum(), NULL);
1664
    this->stub_tables_.swap(empty_stub_table_list);
1665
  }
1666
 
1667
  // Count the local symbols.
1668
  void
1669
  do_count_local_symbols(Stringpool_template<char>*,
1670
                         Stringpool_template<char>*);
1671
 
1672
  void
1673
  do_relocate_sections(
1674
      const Symbol_table* symtab, const Layout* layout,
1675
      const unsigned char* pshdrs, Output_file* of,
1676
      typename Sized_relobj_file<32, big_endian>::Views* pivews);
1677
 
1678
  // Read the symbol information.
1679
  void
1680
  do_read_symbols(Read_symbols_data* sd);
1681
 
1682
  // Process relocs for garbage collection.
1683
  void
1684
  do_gc_process_relocs(Symbol_table*, Layout*, Read_relocs_data*);
1685
 
1686
 private:
1687
 
1688
  // Whether a section needs to be scanned for relocation stubs.
1689
  bool
1690
  section_needs_reloc_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1691
                                    const Relobj::Output_sections&,
1692
                                    const Symbol_table*, const unsigned char*);
1693
 
1694
  // Whether a section is a scannable text section.
1695
  bool
1696
  section_is_scannable(const elfcpp::Shdr<32, big_endian>&, unsigned int,
1697
                       const Output_section*, const Symbol_table*);
1698
 
1699
  // Whether a section needs to be scanned for the Cortex-A8 erratum.
1700
  bool
1701
  section_needs_cortex_a8_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1702
                                        unsigned int, Output_section*,
1703
                                        const Symbol_table*);
1704
 
1705
  // Scan a section for the Cortex-A8 erratum.
1706
  void
1707
  scan_section_for_cortex_a8_erratum(const elfcpp::Shdr<32, big_endian>&,
1708
                                     unsigned int, Output_section*,
1709
                                     Target_arm<big_endian>*);
1710
 
1711
  // Find the linked text section of an EXIDX section by looking at the
1712
  // first relocation of the EXIDX section.  PSHDR points to the section
1713
  // headers of a relocation section and PSYMS points to the local symbols.
1714
  // PSHNDX points to a location storing the text section index if found.
1715
  // Return whether we can find the linked section.
1716
  bool
1717
  find_linked_text_section(const unsigned char* pshdr,
1718
                           const unsigned char* psyms, unsigned int* pshndx);
1719
 
1720
  //
1721
  // Make a new Arm_exidx_input_section object for EXIDX section with
1722
  // index SHNDX and section header SHDR.  TEXT_SHNDX is the section
1723
  // index of the linked text section.
1724
  void
1725
  make_exidx_input_section(unsigned int shndx,
1726
                           const elfcpp::Shdr<32, big_endian>& shdr,
1727
                           unsigned int text_shndx,
1728
                           const elfcpp::Shdr<32, big_endian>& text_shdr);
1729
 
1730
  // Return the output address of either a plain input section or a
1731
  // relaxed input section.  SHNDX is the section index.
1732
  Arm_address
1733
  simple_input_section_output_address(unsigned int, Output_section*);
1734
 
1735
  typedef std::vector<Stub_table<big_endian>*> Stub_table_list;
1736
  typedef Unordered_map<unsigned int, const Arm_exidx_input_section*>
1737
    Exidx_section_map;
1738
 
1739
  // List of stub tables.
1740
  Stub_table_list stub_tables_;
1741
  // Bit vector to tell if a local symbol is a thumb function or not.
1742
  // This is only valid after do_count_local_symbol is called.
1743
  std::vector<bool> local_symbol_is_thumb_function_;
1744
  // processor-specific flags in ELF file header.
1745
  elfcpp::Elf_Word processor_specific_flags_;
1746
  // Object attributes if there is an .ARM.attributes section or NULL.
1747
  Attributes_section_data* attributes_section_data_;
1748
  // Mapping symbols information.
1749
  Mapping_symbols_info mapping_symbols_info_;
1750
  // Bitmap to indicate sections with Cortex-A8 workaround or NULL.
1751
  std::vector<bool>* section_has_cortex_a8_workaround_;
1752
  // Map a text section to its associated .ARM.exidx section, if there is one.
1753
  Exidx_section_map exidx_section_map_;
1754
  // Whether output local symbol count needs updating.
1755
  bool output_local_symbol_count_needs_update_;
1756
  // Whether we merge processor flags and attributes of this object to
1757
  // output.
1758
  bool merge_flags_and_attributes_;
1759
};
1760
 
1761
// Arm_dynobj class.
1762
 
1763
template<bool big_endian>
1764
class Arm_dynobj : public Sized_dynobj<32, big_endian>
1765
{
1766
 public:
1767
  Arm_dynobj(const std::string& name, Input_file* input_file, off_t offset,
1768
             const elfcpp::Ehdr<32, big_endian>& ehdr)
1769
    : Sized_dynobj<32, big_endian>(name, input_file, offset, ehdr),
1770
      processor_specific_flags_(0), attributes_section_data_(NULL)
1771
  { }
1772
 
1773
  ~Arm_dynobj()
1774
  { delete this->attributes_section_data_; }
1775
 
1776
  // Downcast a base pointer to an Arm_relobj pointer.  This is
1777
  // not type-safe but we only use Arm_relobj not the base class.
1778
  static Arm_dynobj<big_endian>*
1779
  as_arm_dynobj(Dynobj* dynobj)
1780
  { return static_cast<Arm_dynobj<big_endian>*>(dynobj); }
1781
 
1782
  // Processor-specific flags in ELF file header.  This is valid only after
1783
  // reading symbols.
1784
  elfcpp::Elf_Word
1785
  processor_specific_flags() const
1786
  { return this->processor_specific_flags_; }
1787
 
1788
  // Attributes section data.
1789
  const Attributes_section_data*
1790
  attributes_section_data() const
1791
  { return this->attributes_section_data_; }
1792
 
1793
 protected:
1794
  // Read the symbol information.
1795
  void
1796
  do_read_symbols(Read_symbols_data* sd);
1797
 
1798
 private:
1799
  // processor-specific flags in ELF file header.
1800
  elfcpp::Elf_Word processor_specific_flags_;
1801
  // Object attributes if there is an .ARM.attributes section or NULL.
1802
  Attributes_section_data* attributes_section_data_;
1803
};
1804
 
1805
// Functor to read reloc addends during stub generation.
1806
 
1807
template<int sh_type, bool big_endian>
1808
struct Stub_addend_reader
1809
{
1810
  // Return the addend for a relocation of a particular type.  Depending
1811
  // on whether this is a REL or RELA relocation, read the addend from a
1812
  // view or from a Reloc object.
1813
  elfcpp::Elf_types<32>::Elf_Swxword
1814
  operator()(
1815
    unsigned int /* r_type */,
1816
    const unsigned char* /* view */,
1817
    const typename Reloc_types<sh_type,
1818
                               32, big_endian>::Reloc& /* reloc */) const;
1819
};
1820
 
1821
// Specialized Stub_addend_reader for SHT_REL type relocation sections.
1822
 
1823
template<bool big_endian>
1824
struct Stub_addend_reader<elfcpp::SHT_REL, big_endian>
1825
{
1826
  elfcpp::Elf_types<32>::Elf_Swxword
1827
  operator()(
1828
    unsigned int,
1829
    const unsigned char*,
1830
    const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const;
1831
};
1832
 
1833
// Specialized Stub_addend_reader for RELA type relocation sections.
1834
// We currently do not handle RELA type relocation sections but it is trivial
1835
// to implement the addend reader.  This is provided for completeness and to
1836
// make it easier to add support for RELA relocation sections in the future.
1837
 
1838
template<bool big_endian>
1839
struct Stub_addend_reader<elfcpp::SHT_RELA, big_endian>
1840
{
1841
  elfcpp::Elf_types<32>::Elf_Swxword
1842
  operator()(
1843
    unsigned int,
1844
    const unsigned char*,
1845
    const typename Reloc_types<elfcpp::SHT_RELA, 32,
1846
                               big_endian>::Reloc& reloc) const
1847
  { return reloc.get_r_addend(); }
1848
};
1849
 
1850
// Cortex_a8_reloc class.  We keep record of relocation that may need
1851
// the Cortex-A8 erratum workaround.
1852
 
1853
class Cortex_a8_reloc
1854
{
1855
 public:
1856
  Cortex_a8_reloc(Reloc_stub* reloc_stub, unsigned r_type,
1857
                  Arm_address destination)
1858
    : reloc_stub_(reloc_stub), r_type_(r_type), destination_(destination)
1859
  { }
1860
 
1861
  ~Cortex_a8_reloc()
1862
  { }
1863
 
1864
  // Accessors:  This is a read-only class.
1865
 
1866
  // Return the relocation stub associated with this relocation if there is
1867
  // one.
1868
  const Reloc_stub*
1869
  reloc_stub() const
1870
  { return this->reloc_stub_; }
1871
 
1872
  // Return the relocation type.
1873
  unsigned int
1874
  r_type() const
1875
  { return this->r_type_; }
1876
 
1877
  // Return the destination address of the relocation.  LSB stores the THUMB
1878
  // bit.
1879
  Arm_address
1880
  destination() const
1881
  { return this->destination_; }
1882
 
1883
 private:
1884
  // Associated relocation stub if there is one, or NULL.
1885
  const Reloc_stub* reloc_stub_;
1886
  // Relocation type.
1887
  unsigned int r_type_;
1888
  // Destination address of this relocation.  LSB is used to distinguish
1889
  // ARM/THUMB mode.
1890
  Arm_address destination_;
1891
};
1892
 
1893
// Arm_output_data_got class.  We derive this from Output_data_got to add
1894
// extra methods to handle TLS relocations in a static link.
1895
 
1896
template<bool big_endian>
1897
class Arm_output_data_got : public Output_data_got<32, big_endian>
1898
{
1899
 public:
1900
  Arm_output_data_got(Symbol_table* symtab, Layout* layout)
1901
    : Output_data_got<32, big_endian>(), symbol_table_(symtab), layout_(layout)
1902
  { }
1903
 
1904
  // Add a static entry for the GOT entry at OFFSET.  GSYM is a global
1905
  // symbol and R_TYPE is the code of a dynamic relocation that needs to be
1906
  // applied in a static link.
1907
  void
1908
  add_static_reloc(unsigned int got_offset, unsigned int r_type, Symbol* gsym)
1909
  { this->static_relocs_.push_back(Static_reloc(got_offset, r_type, gsym)); }
1910
 
1911
  // Add a static reloc for the GOT entry at OFFSET.  RELOBJ is an object
1912
  // defining a local symbol with INDEX.  R_TYPE is the code of a dynamic
1913
  // relocation that needs to be applied in a static link.
1914
  void
1915
  add_static_reloc(unsigned int got_offset, unsigned int r_type,
1916
                   Sized_relobj_file<32, big_endian>* relobj,
1917
                   unsigned int index)
1918
  {
1919
    this->static_relocs_.push_back(Static_reloc(got_offset, r_type, relobj,
1920
                                                index));
1921
  }
1922
 
1923
  // Add a GOT pair for R_ARM_TLS_GD32.  The creates a pair of GOT entries.
1924
  // The first one is initialized to be 1, which is the module index for
1925
  // the main executable and the second one 0.  A reloc of the type
1926
  // R_ARM_TLS_DTPOFF32 will be created for the second GOT entry and will
1927
  // be applied by gold.  GSYM is a global symbol.
1928
  void
1929
  add_tls_gd32_with_static_reloc(unsigned int got_type, Symbol* gsym);
1930
 
1931
  // Same as the above but for a local symbol in OBJECT with INDEX.
1932
  void
1933
  add_tls_gd32_with_static_reloc(unsigned int got_type,
1934
                                 Sized_relobj_file<32, big_endian>* object,
1935
                                 unsigned int index);
1936
 
1937
 protected:
1938
  // Write out the GOT table.
1939
  void
1940
  do_write(Output_file*);
1941
 
1942
 private:
1943
  // This class represent dynamic relocations that need to be applied by
1944
  // gold because we are using TLS relocations in a static link.
1945
  class Static_reloc
1946
  {
1947
   public:
1948
    Static_reloc(unsigned int got_offset, unsigned int r_type, Symbol* gsym)
1949
      : got_offset_(got_offset), r_type_(r_type), symbol_is_global_(true)
1950
    { this->u_.global.symbol = gsym; }
1951
 
1952
    Static_reloc(unsigned int got_offset, unsigned int r_type,
1953
          Sized_relobj_file<32, big_endian>* relobj, unsigned int index)
1954
      : got_offset_(got_offset), r_type_(r_type), symbol_is_global_(false)
1955
    {
1956
      this->u_.local.relobj = relobj;
1957
      this->u_.local.index = index;
1958
    }
1959
 
1960
    // Return the GOT offset.
1961
    unsigned int
1962
    got_offset() const
1963
    { return this->got_offset_; }
1964
 
1965
    // Relocation type.
1966
    unsigned int
1967
    r_type() const
1968
    { return this->r_type_; }
1969
 
1970
    // Whether the symbol is global or not.
1971
    bool
1972
    symbol_is_global() const
1973
    { return this->symbol_is_global_; }
1974
 
1975
    // For a relocation against a global symbol, the global symbol.
1976
    Symbol*
1977
    symbol() const
1978
    {
1979
      gold_assert(this->symbol_is_global_);
1980
      return this->u_.global.symbol;
1981
    }
1982
 
1983
    // For a relocation against a local symbol, the defining object.
1984
    Sized_relobj_file<32, big_endian>*
1985
    relobj() const
1986
    {
1987
      gold_assert(!this->symbol_is_global_);
1988
      return this->u_.local.relobj;
1989
    }
1990
 
1991
    // For a relocation against a local symbol, the local symbol index.
1992
    unsigned int
1993
    index() const
1994
    {
1995
      gold_assert(!this->symbol_is_global_);
1996
      return this->u_.local.index;
1997
    }
1998
 
1999
   private:
2000
    // GOT offset of the entry to which this relocation is applied.
2001
    unsigned int got_offset_;
2002
    // Type of relocation.
2003
    unsigned int r_type_;
2004
    // Whether this relocation is against a global symbol.
2005
    bool symbol_is_global_;
2006
    // A global or local symbol.
2007
    union
2008
    {
2009
      struct
2010
      {
2011
        // For a global symbol, the symbol itself.
2012
        Symbol* symbol;
2013
      } global;
2014
      struct
2015
      {
2016
        // For a local symbol, the object defining object.
2017
        Sized_relobj_file<32, big_endian>* relobj;
2018
        // For a local symbol, the symbol index.
2019
        unsigned int index;
2020
      } local;
2021
    } u_;
2022
  };
2023
 
2024
  // Symbol table of the output object.
2025
  Symbol_table* symbol_table_;
2026
  // Layout of the output object.
2027
  Layout* layout_;
2028
  // Static relocs to be applied to the GOT.
2029
  std::vector<Static_reloc> static_relocs_;
2030
};
2031
 
2032
// The ARM target has many relocation types with odd-sizes or noncontiguous
2033
// bits.  The default handling of relocatable relocation cannot process these
2034
// relocations.  So we have to extend the default code.
2035
 
2036
template<bool big_endian, int sh_type, typename Classify_reloc>
2037
class Arm_scan_relocatable_relocs :
2038
  public Default_scan_relocatable_relocs<sh_type, Classify_reloc>
2039
{
2040
 public:
2041
  // Return the strategy to use for a local symbol which is a section
2042
  // symbol, given the relocation type.
2043
  inline Relocatable_relocs::Reloc_strategy
2044
  local_section_strategy(unsigned int r_type, Relobj*)
2045
  {
2046
    if (sh_type == elfcpp::SHT_RELA)
2047
      return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_RELA;
2048
    else
2049
      {
2050
        if (r_type == elfcpp::R_ARM_TARGET1
2051
            || r_type == elfcpp::R_ARM_TARGET2)
2052
          {
2053
            const Target_arm<big_endian>* arm_target =
2054
              Target_arm<big_endian>::default_target();
2055
            r_type = arm_target->get_real_reloc_type(r_type);
2056
          }
2057
 
2058
        switch(r_type)
2059
          {
2060
          // Relocations that write nothing.  These exclude R_ARM_TARGET1
2061
          // and R_ARM_TARGET2.
2062
          case elfcpp::R_ARM_NONE:
2063
          case elfcpp::R_ARM_V4BX:
2064
          case elfcpp::R_ARM_TLS_GOTDESC:
2065
          case elfcpp::R_ARM_TLS_CALL:
2066
          case elfcpp::R_ARM_TLS_DESCSEQ:
2067
          case elfcpp::R_ARM_THM_TLS_CALL:
2068
          case elfcpp::R_ARM_GOTRELAX:
2069
          case elfcpp::R_ARM_GNU_VTENTRY:
2070
          case elfcpp::R_ARM_GNU_VTINHERIT:
2071
          case elfcpp::R_ARM_THM_TLS_DESCSEQ16:
2072
          case elfcpp::R_ARM_THM_TLS_DESCSEQ32:
2073
            return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_0;
2074
          // These should have been converted to something else above.
2075
          case elfcpp::R_ARM_TARGET1:
2076
          case elfcpp::R_ARM_TARGET2:
2077
            gold_unreachable();
2078
          // Relocations that write full 32 bits.
2079
          case elfcpp::R_ARM_ABS32:
2080
          case elfcpp::R_ARM_REL32:
2081
          case elfcpp::R_ARM_SBREL32:
2082
          case elfcpp::R_ARM_GOTOFF32:
2083
          case elfcpp::R_ARM_BASE_PREL:
2084
          case elfcpp::R_ARM_GOT_BREL:
2085
          case elfcpp::R_ARM_BASE_ABS:
2086
          case elfcpp::R_ARM_ABS32_NOI:
2087
          case elfcpp::R_ARM_REL32_NOI:
2088
          case elfcpp::R_ARM_PLT32_ABS:
2089
          case elfcpp::R_ARM_GOT_ABS:
2090
          case elfcpp::R_ARM_GOT_PREL:
2091
          case elfcpp::R_ARM_TLS_GD32:
2092
          case elfcpp::R_ARM_TLS_LDM32:
2093
          case elfcpp::R_ARM_TLS_LDO32:
2094
          case elfcpp::R_ARM_TLS_IE32:
2095
          case elfcpp::R_ARM_TLS_LE32:
2096
            return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_4;
2097
          default:
2098
            // For all other static relocations, return RELOC_SPECIAL.
2099
            return Relocatable_relocs::RELOC_SPECIAL;
2100
          }
2101
      }
2102
  }
2103
};
2104
 
2105
// Utilities for manipulating integers of up to 32-bits
2106
 
2107
namespace utils
2108
{
2109
  // Sign extend an n-bit unsigned integer stored in an uint32_t into
2110
  // an int32_t.  NO_BITS must be between 1 to 32.
2111
  template<int no_bits>
2112
  static inline int32_t
2113
  sign_extend(uint32_t bits)
2114
  {
2115
    gold_assert(no_bits >= 0 && no_bits <= 32);
2116
    if (no_bits == 32)
2117
      return static_cast<int32_t>(bits);
2118
    uint32_t mask = (~((uint32_t) 0)) >> (32 - no_bits);
2119
    bits &= mask;
2120
    uint32_t top_bit = 1U << (no_bits - 1);
2121
    int32_t as_signed = static_cast<int32_t>(bits);
2122
    return (bits & top_bit) ? as_signed + (-top_bit * 2) : as_signed;
2123
  }
2124
 
2125
  // Detects overflow of an NO_BITS integer stored in a uint32_t.
2126
  template<int no_bits>
2127
  static inline bool
2128
  has_overflow(uint32_t bits)
2129
  {
2130
    gold_assert(no_bits >= 0 && no_bits <= 32);
2131
    if (no_bits == 32)
2132
      return false;
2133
    int32_t max = (1 << (no_bits - 1)) - 1;
2134
    int32_t min = -(1 << (no_bits - 1));
2135
    int32_t as_signed = static_cast<int32_t>(bits);
2136
    return as_signed > max || as_signed < min;
2137
  }
2138
 
2139
  // Detects overflow of an NO_BITS integer stored in a uint32_t when it
2140
  // fits in the given number of bits as either a signed or unsigned value.
2141
  // For example, has_signed_unsigned_overflow<8> would check
2142
  // -128 <= bits <= 255
2143
  template<int no_bits>
2144
  static inline bool
2145
  has_signed_unsigned_overflow(uint32_t bits)
2146
  {
2147
    gold_assert(no_bits >= 2 && no_bits <= 32);
2148
    if (no_bits == 32)
2149
      return false;
2150
    int32_t max = static_cast<int32_t>((1U << no_bits) - 1);
2151
    int32_t min = -(1 << (no_bits - 1));
2152
    int32_t as_signed = static_cast<int32_t>(bits);
2153
    return as_signed > max || as_signed < min;
2154
  }
2155
 
2156
  // Select bits from A and B using bits in MASK.  For each n in [0..31],
2157
  // the n-th bit in the result is chosen from the n-th bits of A and B.
2158
  // A zero selects A and a one selects B.
2159
  static inline uint32_t
2160
  bit_select(uint32_t a, uint32_t b, uint32_t mask)
2161
  { return (a & ~mask) | (b & mask); }
2162
};
2163
 
2164
template<bool big_endian>
2165
class Target_arm : public Sized_target<32, big_endian>
2166
{
2167
 public:
2168
  typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
2169
    Reloc_section;
2170
 
2171
  // When were are relocating a stub, we pass this as the relocation number.
2172
  static const size_t fake_relnum_for_stubs = static_cast<size_t>(-1);
2173
 
2174
  Target_arm()
2175
    : Sized_target<32, big_endian>(&arm_info),
2176
      got_(NULL), plt_(NULL), got_plt_(NULL), rel_dyn_(NULL),
2177
      copy_relocs_(elfcpp::R_ARM_COPY), dynbss_(NULL),
2178
      got_mod_index_offset_(-1U), tls_base_symbol_defined_(false),
2179
      stub_tables_(), stub_factory_(Stub_factory::get_instance()),
2180
      may_use_blx_(false), should_force_pic_veneer_(false),
2181
      arm_input_section_map_(), attributes_section_data_(NULL),
2182
      fix_cortex_a8_(false), cortex_a8_relocs_info_()
2183
  { }
2184
 
2185
  // Whether we can use BLX.
2186
  bool
2187
  may_use_blx() const
2188
  { return this->may_use_blx_; }
2189
 
2190
  // Set use-BLX flag.
2191
  void
2192
  set_may_use_blx(bool value)
2193
  { this->may_use_blx_ = value; }
2194
 
2195
  // Whether we force PCI branch veneers.
2196
  bool
2197
  should_force_pic_veneer() const
2198
  { return this->should_force_pic_veneer_; }
2199
 
2200
  // Set PIC veneer flag.
2201
  void
2202
  set_should_force_pic_veneer(bool value)
2203
  { this->should_force_pic_veneer_ = value; }
2204
 
2205
  // Whether we use THUMB-2 instructions.
2206
  bool
2207
  using_thumb2() const
2208
  {
2209
    Object_attribute* attr =
2210
      this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2211
    int arch = attr->int_value();
2212
    return arch == elfcpp::TAG_CPU_ARCH_V6T2 || arch >= elfcpp::TAG_CPU_ARCH_V7;
2213
  }
2214
 
2215
  // Whether we use THUMB/THUMB-2 instructions only.
2216
  bool
2217
  using_thumb_only() const
2218
  {
2219
    Object_attribute* attr =
2220
      this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2221
 
2222
    if (attr->int_value() == elfcpp::TAG_CPU_ARCH_V6_M
2223
        || attr->int_value() == elfcpp::TAG_CPU_ARCH_V6S_M)
2224
      return true;
2225
    if (attr->int_value() != elfcpp::TAG_CPU_ARCH_V7
2226
        && attr->int_value() != elfcpp::TAG_CPU_ARCH_V7E_M)
2227
      return false;
2228
    attr = this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
2229
    return attr->int_value() == 'M';
2230
  }
2231
 
2232
  // Whether we have an NOP instruction.  If not, use mov r0, r0 instead.
2233
  bool
2234
  may_use_arm_nop() const
2235
  {
2236
    Object_attribute* attr =
2237
      this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2238
    int arch = attr->int_value();
2239
    return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2240
            || arch == elfcpp::TAG_CPU_ARCH_V6K
2241
            || arch == elfcpp::TAG_CPU_ARCH_V7
2242
            || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
2243
  }
2244
 
2245
  // Whether we have THUMB-2 NOP.W instruction.
2246
  bool
2247
  may_use_thumb2_nop() const
2248
  {
2249
    Object_attribute* attr =
2250
      this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2251
    int arch = attr->int_value();
2252
    return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2253
            || arch == elfcpp::TAG_CPU_ARCH_V7
2254
            || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
2255
  }
2256
 
2257
  // Process the relocations to determine unreferenced sections for 
2258
  // garbage collection.
2259
  void
2260
  gc_process_relocs(Symbol_table* symtab,
2261
                    Layout* layout,
2262
                    Sized_relobj_file<32, big_endian>* object,
2263
                    unsigned int data_shndx,
2264
                    unsigned int sh_type,
2265
                    const unsigned char* prelocs,
2266
                    size_t reloc_count,
2267
                    Output_section* output_section,
2268
                    bool needs_special_offset_handling,
2269
                    size_t local_symbol_count,
2270
                    const unsigned char* plocal_symbols);
2271
 
2272
  // Scan the relocations to look for symbol adjustments.
2273
  void
2274
  scan_relocs(Symbol_table* symtab,
2275
              Layout* layout,
2276
              Sized_relobj_file<32, big_endian>* object,
2277
              unsigned int data_shndx,
2278
              unsigned int sh_type,
2279
              const unsigned char* prelocs,
2280
              size_t reloc_count,
2281
              Output_section* output_section,
2282
              bool needs_special_offset_handling,
2283
              size_t local_symbol_count,
2284
              const unsigned char* plocal_symbols);
2285
 
2286
  // Finalize the sections.
2287
  void
2288
  do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
2289
 
2290
  // Return the value to use for a dynamic symbol which requires special
2291
  // treatment.
2292
  uint64_t
2293
  do_dynsym_value(const Symbol*) const;
2294
 
2295
  // Relocate a section.
2296
  void
2297
  relocate_section(const Relocate_info<32, big_endian>*,
2298
                   unsigned int sh_type,
2299
                   const unsigned char* prelocs,
2300
                   size_t reloc_count,
2301
                   Output_section* output_section,
2302
                   bool needs_special_offset_handling,
2303
                   unsigned char* view,
2304
                   Arm_address view_address,
2305
                   section_size_type view_size,
2306
                   const Reloc_symbol_changes*);
2307
 
2308
  // Scan the relocs during a relocatable link.
2309
  void
2310
  scan_relocatable_relocs(Symbol_table* symtab,
2311
                          Layout* layout,
2312
                          Sized_relobj_file<32, big_endian>* object,
2313
                          unsigned int data_shndx,
2314
                          unsigned int sh_type,
2315
                          const unsigned char* prelocs,
2316
                          size_t reloc_count,
2317
                          Output_section* output_section,
2318
                          bool needs_special_offset_handling,
2319
                          size_t local_symbol_count,
2320
                          const unsigned char* plocal_symbols,
2321
                          Relocatable_relocs*);
2322
 
2323
  // Relocate a section during a relocatable link.
2324
  void
2325
  relocate_for_relocatable(const Relocate_info<32, big_endian>*,
2326
                           unsigned int sh_type,
2327
                           const unsigned char* prelocs,
2328
                           size_t reloc_count,
2329
                           Output_section* output_section,
2330
                           off_t offset_in_output_section,
2331
                           const Relocatable_relocs*,
2332
                           unsigned char* view,
2333
                           Arm_address view_address,
2334
                           section_size_type view_size,
2335
                           unsigned char* reloc_view,
2336
                           section_size_type reloc_view_size);
2337
 
2338
  // Perform target-specific processing in a relocatable link.  This is
2339
  // only used if we use the relocation strategy RELOC_SPECIAL.
2340
  void
2341
  relocate_special_relocatable(const Relocate_info<32, big_endian>* relinfo,
2342
                               unsigned int sh_type,
2343
                               const unsigned char* preloc_in,
2344
                               size_t relnum,
2345
                               Output_section* output_section,
2346
                               off_t offset_in_output_section,
2347
                               unsigned char* view,
2348
                               typename elfcpp::Elf_types<32>::Elf_Addr
2349
                                 view_address,
2350
                               section_size_type view_size,
2351
                               unsigned char* preloc_out);
2352
 
2353
  // Return whether SYM is defined by the ABI.
2354
  bool
2355
  do_is_defined_by_abi(Symbol* sym) const
2356
  { return strcmp(sym->name(), "__tls_get_addr") == 0; }
2357
 
2358
  // Return whether there is a GOT section.
2359
  bool
2360
  has_got_section() const
2361
  { return this->got_ != NULL; }
2362
 
2363
  // Return the size of the GOT section.
2364
  section_size_type
2365
  got_size() const
2366
  {
2367
    gold_assert(this->got_ != NULL);
2368
    return this->got_->data_size();
2369
  }
2370
 
2371
  // Return the number of entries in the GOT.
2372
  unsigned int
2373
  got_entry_count() const
2374
  {
2375
    if (!this->has_got_section())
2376
      return 0;
2377
    return this->got_size() / 4;
2378
  }
2379
 
2380
  // Return the number of entries in the PLT.
2381
  unsigned int
2382
  plt_entry_count() const;
2383
 
2384
  // Return the offset of the first non-reserved PLT entry.
2385
  unsigned int
2386
  first_plt_entry_offset() const;
2387
 
2388
  // Return the size of each PLT entry.
2389
  unsigned int
2390
  plt_entry_size() const;
2391
 
2392
  // Map platform-specific reloc types
2393
  static unsigned int
2394
  get_real_reloc_type(unsigned int r_type);
2395
 
2396
  //
2397
  // Methods to support stub-generations.
2398
  //
2399
 
2400
  // Return the stub factory
2401
  const Stub_factory&
2402
  stub_factory() const
2403
  { return this->stub_factory_; }
2404
 
2405
  // Make a new Arm_input_section object.
2406
  Arm_input_section<big_endian>*
2407
  new_arm_input_section(Relobj*, unsigned int);
2408
 
2409
  // Find the Arm_input_section object corresponding to the SHNDX-th input
2410
  // section of RELOBJ.
2411
  Arm_input_section<big_endian>*
2412
  find_arm_input_section(Relobj* relobj, unsigned int shndx) const;
2413
 
2414
  // Make a new Stub_table
2415
  Stub_table<big_endian>*
2416
  new_stub_table(Arm_input_section<big_endian>*);
2417
 
2418
  // Scan a section for stub generation.
2419
  void
2420
  scan_section_for_stubs(const Relocate_info<32, big_endian>*, unsigned int,
2421
                         const unsigned char*, size_t, Output_section*,
2422
                         bool, const unsigned char*, Arm_address,
2423
                         section_size_type);
2424
 
2425
  // Relocate a stub. 
2426
  void
2427
  relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
2428
                Output_section*, unsigned char*, Arm_address,
2429
                section_size_type);
2430
 
2431
  // Get the default ARM target.
2432
  static Target_arm<big_endian>*
2433
  default_target()
2434
  {
2435
    gold_assert(parameters->target().machine_code() == elfcpp::EM_ARM
2436
                && parameters->target().is_big_endian() == big_endian);
2437
    return static_cast<Target_arm<big_endian>*>(
2438
             parameters->sized_target<32, big_endian>());
2439
  }
2440
 
2441
  // Whether NAME belongs to a mapping symbol.
2442
  static bool
2443
  is_mapping_symbol_name(const char* name)
2444
  {
2445
    return (name
2446
            && name[0] == '$'
2447
            && (name[1] == 'a' || name[1] == 't' || name[1] == 'd')
2448
            && (name[2] == '\0' || name[2] == '.'));
2449
  }
2450
 
2451
  // Whether we work around the Cortex-A8 erratum.
2452
  bool
2453
  fix_cortex_a8() const
2454
  { return this->fix_cortex_a8_; }
2455
 
2456
  // Whether we merge exidx entries in debuginfo.
2457
  bool
2458
  merge_exidx_entries() const
2459
  { return parameters->options().merge_exidx_entries(); }
2460
 
2461
  // Whether we fix R_ARM_V4BX relocation.
2462
  // 0 - do not fix
2463
  // 1 - replace with MOV instruction (armv4 target)
2464
  // 2 - make interworking veneer (>= armv4t targets only)
2465
  General_options::Fix_v4bx
2466
  fix_v4bx() const
2467
  { return parameters->options().fix_v4bx(); }
2468
 
2469
  // Scan a span of THUMB code section for Cortex-A8 erratum.
2470
  void
2471
  scan_span_for_cortex_a8_erratum(Arm_relobj<big_endian>*, unsigned int,
2472
                                  section_size_type, section_size_type,
2473
                                  const unsigned char*, Arm_address);
2474
 
2475
  // Apply Cortex-A8 workaround to a branch.
2476
  void
2477
  apply_cortex_a8_workaround(const Cortex_a8_stub*, Arm_address,
2478
                             unsigned char*, Arm_address);
2479
 
2480
 protected:
2481
  // Make an ELF object.
2482
  Object*
2483
  do_make_elf_object(const std::string&, Input_file*, off_t,
2484
                     const elfcpp::Ehdr<32, big_endian>& ehdr);
2485
 
2486
  Object*
2487
  do_make_elf_object(const std::string&, Input_file*, off_t,
2488
                     const elfcpp::Ehdr<32, !big_endian>&)
2489
  { gold_unreachable(); }
2490
 
2491
  Object*
2492
  do_make_elf_object(const std::string&, Input_file*, off_t,
2493
                      const elfcpp::Ehdr<64, false>&)
2494
  { gold_unreachable(); }
2495
 
2496
  Object*
2497
  do_make_elf_object(const std::string&, Input_file*, off_t,
2498
                     const elfcpp::Ehdr<64, true>&)
2499
  { gold_unreachable(); }
2500
 
2501
  // Make an output section.
2502
  Output_section*
2503
  do_make_output_section(const char* name, elfcpp::Elf_Word type,
2504
                         elfcpp::Elf_Xword flags)
2505
  { return new Arm_output_section<big_endian>(name, type, flags); }
2506
 
2507
  void
2508
  do_adjust_elf_header(unsigned char* view, int len) const;
2509
 
2510
  // We only need to generate stubs, and hence perform relaxation if we are
2511
  // not doing relocatable linking.
2512
  bool
2513
  do_may_relax() const
2514
  { return !parameters->options().relocatable(); }
2515
 
2516
  bool
2517
  do_relax(int, const Input_objects*, Symbol_table*, Layout*, const Task*);
2518
 
2519
  // Determine whether an object attribute tag takes an integer, a
2520
  // string or both.
2521
  int
2522
  do_attribute_arg_type(int tag) const;
2523
 
2524
  // Reorder tags during output.
2525
  int
2526
  do_attributes_order(int num) const;
2527
 
2528
  // This is called when the target is selected as the default.
2529
  void
2530
  do_select_as_default_target()
2531
  {
2532
    // No locking is required since there should only be one default target.
2533
    // We cannot have both the big-endian and little-endian ARM targets
2534
    // as the default.
2535
    gold_assert(arm_reloc_property_table == NULL);
2536
    arm_reloc_property_table = new Arm_reloc_property_table();
2537
  }
2538
 
2539 159 khays
  // Virtual function which is set to return true by a target if
2540
  // it can use relocation types to determine if a function's
2541
  // pointer is taken.
2542
  virtual bool
2543
  do_can_check_for_function_pointers() const
2544
  { return true; }
2545
 
2546
  // Whether a section called SECTION_NAME may have function pointers to
2547
  // sections not eligible for safe ICF folding.
2548
  virtual bool
2549
  do_section_may_have_icf_unsafe_pointers(const char* section_name) const
2550
  {
2551
    return (!is_prefix_of(".ARM.exidx", section_name)
2552
            && !is_prefix_of(".ARM.extab", section_name)
2553
            && Target::do_section_may_have_icf_unsafe_pointers(section_name));
2554
  }
2555
 
2556 27 khays
 private:
2557
  // The class which scans relocations.
2558
  class Scan
2559
  {
2560
   public:
2561
    Scan()
2562
      : issued_non_pic_error_(false)
2563
    { }
2564
 
2565
    static inline int
2566
    get_reference_flags(unsigned int r_type);
2567
 
2568
    inline void
2569
    local(Symbol_table* symtab, Layout* layout, Target_arm* target,
2570
          Sized_relobj_file<32, big_endian>* object,
2571
          unsigned int data_shndx,
2572
          Output_section* output_section,
2573
          const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2574
          const elfcpp::Sym<32, big_endian>& lsym);
2575
 
2576
    inline void
2577
    global(Symbol_table* symtab, Layout* layout, Target_arm* target,
2578
           Sized_relobj_file<32, big_endian>* object,
2579
           unsigned int data_shndx,
2580
           Output_section* output_section,
2581
           const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2582
           Symbol* gsym);
2583
 
2584
    inline bool
2585
    local_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2586
                                        Sized_relobj_file<32, big_endian>* ,
2587
                                        unsigned int ,
2588
                                        Output_section* ,
2589
                                        const elfcpp::Rel<32, big_endian>& ,
2590
                                        unsigned int ,
2591
                                        const elfcpp::Sym<32, big_endian>&);
2592
 
2593
    inline bool
2594
    global_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2595
                                         Sized_relobj_file<32, big_endian>* ,
2596
                                         unsigned int ,
2597
                                         Output_section* ,
2598
                                         const elfcpp::Rel<32, big_endian>& ,
2599
                                         unsigned int , Symbol*);
2600
 
2601
   private:
2602
    static void
2603
    unsupported_reloc_local(Sized_relobj_file<32, big_endian>*,
2604
                            unsigned int r_type);
2605
 
2606
    static void
2607
    unsupported_reloc_global(Sized_relobj_file<32, big_endian>*,
2608
                             unsigned int r_type, Symbol*);
2609
 
2610
    void
2611
    check_non_pic(Relobj*, unsigned int r_type);
2612
 
2613
    // Almost identical to Symbol::needs_plt_entry except that it also
2614
    // handles STT_ARM_TFUNC.
2615
    static bool
2616
    symbol_needs_plt_entry(const Symbol* sym)
2617
    {
2618
      // An undefined symbol from an executable does not need a PLT entry.
2619
      if (sym->is_undefined() && !parameters->options().shared())
2620
        return false;
2621
 
2622
      return (!parameters->doing_static_link()
2623
              && (sym->type() == elfcpp::STT_FUNC
2624
                  || sym->type() == elfcpp::STT_ARM_TFUNC)
2625
              && (sym->is_from_dynobj()
2626
                  || sym->is_undefined()
2627
                  || sym->is_preemptible()));
2628
    }
2629
 
2630
    inline bool
2631
    possible_function_pointer_reloc(unsigned int r_type);
2632
 
2633
    // Whether we have issued an error about a non-PIC compilation.
2634
    bool issued_non_pic_error_;
2635
  };
2636
 
2637
  // The class which implements relocation.
2638
  class Relocate
2639
  {
2640
   public:
2641
    Relocate()
2642
    { }
2643
 
2644
    ~Relocate()
2645
    { }
2646
 
2647
    // Return whether the static relocation needs to be applied.
2648
    inline bool
2649
    should_apply_static_reloc(const Sized_symbol<32>* gsym,
2650
                              unsigned int r_type,
2651
                              bool is_32bit,
2652
                              Output_section* output_section);
2653
 
2654
    // Do a relocation.  Return false if the caller should not issue
2655
    // any warnings about this relocation.
2656
    inline bool
2657
    relocate(const Relocate_info<32, big_endian>*, Target_arm*,
2658
             Output_section*,  size_t relnum,
2659
             const elfcpp::Rel<32, big_endian>&,
2660
             unsigned int r_type, const Sized_symbol<32>*,
2661
             const Symbol_value<32>*,
2662
             unsigned char*, Arm_address,
2663
             section_size_type);
2664
 
2665
    // Return whether we want to pass flag NON_PIC_REF for this
2666
    // reloc.  This means the relocation type accesses a symbol not via
2667
    // GOT or PLT.
2668
    static inline bool
2669
    reloc_is_non_pic(unsigned int r_type)
2670
    {
2671
      switch (r_type)
2672
        {
2673
        // These relocation types reference GOT or PLT entries explicitly.
2674
        case elfcpp::R_ARM_GOT_BREL:
2675
        case elfcpp::R_ARM_GOT_ABS:
2676
        case elfcpp::R_ARM_GOT_PREL:
2677
        case elfcpp::R_ARM_GOT_BREL12:
2678
        case elfcpp::R_ARM_PLT32_ABS:
2679
        case elfcpp::R_ARM_TLS_GD32:
2680
        case elfcpp::R_ARM_TLS_LDM32:
2681
        case elfcpp::R_ARM_TLS_IE32:
2682
        case elfcpp::R_ARM_TLS_IE12GP:
2683
 
2684
        // These relocate types may use PLT entries.
2685
        case elfcpp::R_ARM_CALL:
2686
        case elfcpp::R_ARM_THM_CALL:
2687
        case elfcpp::R_ARM_JUMP24:
2688
        case elfcpp::R_ARM_THM_JUMP24:
2689
        case elfcpp::R_ARM_THM_JUMP19:
2690
        case elfcpp::R_ARM_PLT32:
2691
        case elfcpp::R_ARM_THM_XPC22:
2692
        case elfcpp::R_ARM_PREL31:
2693
        case elfcpp::R_ARM_SBREL31:
2694
          return false;
2695
 
2696
        default:
2697
          return true;
2698
        }
2699
    }
2700
 
2701
   private:
2702
    // Do a TLS relocation.
2703
    inline typename Arm_relocate_functions<big_endian>::Status
2704
    relocate_tls(const Relocate_info<32, big_endian>*, Target_arm<big_endian>*,
2705
                 size_t, const elfcpp::Rel<32, big_endian>&, unsigned int,
2706
                 const Sized_symbol<32>*, const Symbol_value<32>*,
2707
                 unsigned char*, elfcpp::Elf_types<32>::Elf_Addr,
2708
                 section_size_type);
2709
 
2710
  };
2711
 
2712
  // A class which returns the size required for a relocation type,
2713
  // used while scanning relocs during a relocatable link.
2714
  class Relocatable_size_for_reloc
2715
  {
2716
   public:
2717
    unsigned int
2718
    get_size_for_reloc(unsigned int, Relobj*);
2719
  };
2720
 
2721
  // Adjust TLS relocation type based on the options and whether this
2722
  // is a local symbol.
2723
  static tls::Tls_optimization
2724
  optimize_tls_reloc(bool is_final, int r_type);
2725
 
2726
  // Get the GOT section, creating it if necessary.
2727
  Arm_output_data_got<big_endian>*
2728
  got_section(Symbol_table*, Layout*);
2729
 
2730
  // Get the GOT PLT section.
2731
  Output_data_space*
2732
  got_plt_section() const
2733
  {
2734
    gold_assert(this->got_plt_ != NULL);
2735
    return this->got_plt_;
2736
  }
2737
 
2738
  // Create a PLT entry for a global symbol.
2739
  void
2740
  make_plt_entry(Symbol_table*, Layout*, Symbol*);
2741
 
2742
  // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
2743
  void
2744
  define_tls_base_symbol(Symbol_table*, Layout*);
2745
 
2746
  // Create a GOT entry for the TLS module index.
2747
  unsigned int
2748
  got_mod_index_entry(Symbol_table* symtab, Layout* layout,
2749
                      Sized_relobj_file<32, big_endian>* object);
2750
 
2751
  // Get the PLT section.
2752
  const Output_data_plt_arm<big_endian>*
2753
  plt_section() const
2754
  {
2755
    gold_assert(this->plt_ != NULL);
2756
    return this->plt_;
2757
  }
2758
 
2759
  // Get the dynamic reloc section, creating it if necessary.
2760
  Reloc_section*
2761
  rel_dyn_section(Layout*);
2762
 
2763
  // Get the section to use for TLS_DESC relocations.
2764
  Reloc_section*
2765
  rel_tls_desc_section(Layout*) const;
2766
 
2767
  // Return true if the symbol may need a COPY relocation.
2768
  // References from an executable object to non-function symbols
2769
  // defined in a dynamic object may need a COPY relocation.
2770
  bool
2771
  may_need_copy_reloc(Symbol* gsym)
2772
  {
2773
    return (gsym->type() != elfcpp::STT_ARM_TFUNC
2774
            && gsym->may_need_copy_reloc());
2775
  }
2776
 
2777
  // Add a potential copy relocation.
2778
  void
2779
  copy_reloc(Symbol_table* symtab, Layout* layout,
2780
             Sized_relobj_file<32, big_endian>* object,
2781
             unsigned int shndx, Output_section* output_section,
2782
             Symbol* sym, const elfcpp::Rel<32, big_endian>& reloc)
2783
  {
2784
    this->copy_relocs_.copy_reloc(symtab, layout,
2785
                                  symtab->get_sized_symbol<32>(sym),
2786
                                  object, shndx, output_section, reloc,
2787
                                  this->rel_dyn_section(layout));
2788
  }
2789
 
2790
  // Whether two EABI versions are compatible.
2791
  static bool
2792
  are_eabi_versions_compatible(elfcpp::Elf_Word v1, elfcpp::Elf_Word v2);
2793
 
2794
  // Merge processor-specific flags from input object and those in the ELF
2795
  // header of the output.
2796
  void
2797
  merge_processor_specific_flags(const std::string&, elfcpp::Elf_Word);
2798
 
2799
  // Get the secondary compatible architecture.
2800
  static int
2801
  get_secondary_compatible_arch(const Attributes_section_data*);
2802
 
2803
  // Set the secondary compatible architecture.
2804
  static void
2805
  set_secondary_compatible_arch(Attributes_section_data*, int);
2806
 
2807
  static int
2808
  tag_cpu_arch_combine(const char*, int, int*, int, int);
2809
 
2810
  // Helper to print AEABI enum tag value.
2811
  static std::string
2812
  aeabi_enum_name(unsigned int);
2813
 
2814
  // Return string value for TAG_CPU_name.
2815
  static std::string
2816
  tag_cpu_name_value(unsigned int);
2817
 
2818
  // Merge object attributes from input object and those in the output.
2819
  void
2820
  merge_object_attributes(const char*, const Attributes_section_data*);
2821
 
2822
  // Helper to get an AEABI object attribute
2823
  Object_attribute*
2824
  get_aeabi_object_attribute(int tag) const
2825
  {
2826
    Attributes_section_data* pasd = this->attributes_section_data_;
2827
    gold_assert(pasd != NULL);
2828
    Object_attribute* attr =
2829
      pasd->get_attribute(Object_attribute::OBJ_ATTR_PROC, tag);
2830
    gold_assert(attr != NULL);
2831
    return attr;
2832
  }
2833
 
2834
  //
2835
  // Methods to support stub-generations.
2836
  //
2837
 
2838
  // Group input sections for stub generation.
2839
  void
2840
  group_sections(Layout*, section_size_type, bool, const Task*);
2841
 
2842
  // Scan a relocation for stub generation.
2843
  void
2844
  scan_reloc_for_stub(const Relocate_info<32, big_endian>*, unsigned int,
2845
                      const Sized_symbol<32>*, unsigned int,
2846
                      const Symbol_value<32>*,
2847
                      elfcpp::Elf_types<32>::Elf_Swxword, Arm_address);
2848
 
2849
  // Scan a relocation section for stub.
2850
  template<int sh_type>
2851
  void
2852
  scan_reloc_section_for_stubs(
2853
      const Relocate_info<32, big_endian>* relinfo,
2854
      const unsigned char* prelocs,
2855
      size_t reloc_count,
2856
      Output_section* output_section,
2857
      bool needs_special_offset_handling,
2858
      const unsigned char* view,
2859
      elfcpp::Elf_types<32>::Elf_Addr view_address,
2860
      section_size_type);
2861
 
2862
  // Fix .ARM.exidx section coverage.
2863
  void
2864
  fix_exidx_coverage(Layout*, const Input_objects*,
2865
                     Arm_output_section<big_endian>*, Symbol_table*,
2866
                     const Task*);
2867
 
2868
  // Functors for STL set.
2869
  struct output_section_address_less_than
2870
  {
2871
    bool
2872
    operator()(const Output_section* s1, const Output_section* s2) const
2873
    { return s1->address() < s2->address(); }
2874
  };
2875
 
2876
  // Information about this specific target which we pass to the
2877
  // general Target structure.
2878
  static const Target::Target_info arm_info;
2879
 
2880
  // The types of GOT entries needed for this platform.
2881
  // These values are exposed to the ABI in an incremental link.
2882
  // Do not renumber existing values without changing the version
2883
  // number of the .gnu_incremental_inputs section.
2884
  enum Got_type
2885
  {
2886
    GOT_TYPE_STANDARD = 0,      // GOT entry for a regular symbol
2887
    GOT_TYPE_TLS_NOFFSET = 1,   // GOT entry for negative TLS offset
2888
    GOT_TYPE_TLS_OFFSET = 2,    // GOT entry for positive TLS offset
2889
    GOT_TYPE_TLS_PAIR = 3,      // GOT entry for TLS module/offset pair
2890
    GOT_TYPE_TLS_DESC = 4       // GOT entry for TLS_DESC pair
2891
  };
2892
 
2893
  typedef typename std::vector<Stub_table<big_endian>*> Stub_table_list;
2894
 
2895
  // Map input section to Arm_input_section.
2896
  typedef Unordered_map<Section_id,
2897
                        Arm_input_section<big_endian>*,
2898
                        Section_id_hash>
2899
          Arm_input_section_map;
2900
 
2901
  // Map output addresses to relocs for Cortex-A8 erratum.
2902
  typedef Unordered_map<Arm_address, const Cortex_a8_reloc*>
2903
          Cortex_a8_relocs_info;
2904
 
2905
  // The GOT section.
2906
  Arm_output_data_got<big_endian>* got_;
2907
  // The PLT section.
2908
  Output_data_plt_arm<big_endian>* plt_;
2909
  // The GOT PLT section.
2910
  Output_data_space* got_plt_;
2911
  // The dynamic reloc section.
2912
  Reloc_section* rel_dyn_;
2913
  // Relocs saved to avoid a COPY reloc.
2914
  Copy_relocs<elfcpp::SHT_REL, 32, big_endian> copy_relocs_;
2915
  // Space for variables copied with a COPY reloc.
2916
  Output_data_space* dynbss_;
2917
  // Offset of the GOT entry for the TLS module index.
2918
  unsigned int got_mod_index_offset_;
2919
  // True if the _TLS_MODULE_BASE_ symbol has been defined.
2920
  bool tls_base_symbol_defined_;
2921
  // Vector of Stub_tables created.
2922
  Stub_table_list stub_tables_;
2923
  // Stub factory.
2924
  const Stub_factory &stub_factory_;
2925
  // Whether we can use BLX.
2926
  bool may_use_blx_;
2927
  // Whether we force PIC branch veneers.
2928
  bool should_force_pic_veneer_;
2929
  // Map for locating Arm_input_sections.
2930
  Arm_input_section_map arm_input_section_map_;
2931
  // Attributes section data in output.
2932
  Attributes_section_data* attributes_section_data_;
2933
  // Whether we want to fix code for Cortex-A8 erratum.
2934
  bool fix_cortex_a8_;
2935
  // Map addresses to relocs for Cortex-A8 erratum.
2936
  Cortex_a8_relocs_info cortex_a8_relocs_info_;
2937
};
2938
 
2939
template<bool big_endian>
2940
const Target::Target_info Target_arm<big_endian>::arm_info =
2941
{
2942
  32,                   // size
2943
  big_endian,           // is_big_endian
2944
  elfcpp::EM_ARM,       // machine_code
2945
  false,                // has_make_symbol
2946
  false,                // has_resolve
2947
  false,                // has_code_fill
2948
  true,                 // is_default_stack_executable
2949 159 khays
  false,                // can_icf_inline_merge_sections
2950 27 khays
  '\0',                 // wrap_char
2951
  "/usr/lib/libc.so.1", // dynamic_linker
2952
  0x8000,               // default_text_segment_address
2953
  0x1000,               // abi_pagesize (overridable by -z max-page-size)
2954
  0x1000,               // common_pagesize (overridable by -z common-page-size)
2955
  elfcpp::SHN_UNDEF,    // small_common_shndx
2956
  elfcpp::SHN_UNDEF,    // large_common_shndx
2957
  0,                     // small_common_section_flags
2958
  0,                     // large_common_section_flags
2959
  ".ARM.attributes",    // attributes_section
2960
  "aeabi"               // attributes_vendor
2961
};
2962
 
2963
// Arm relocate functions class
2964
//
2965
 
2966
template<bool big_endian>
2967
class Arm_relocate_functions : public Relocate_functions<32, big_endian>
2968
{
2969
 public:
2970
  typedef enum
2971
  {
2972
    STATUS_OKAY,        // No error during relocation.
2973
    STATUS_OVERFLOW,    // Relocation overflow.
2974
    STATUS_BAD_RELOC    // Relocation cannot be applied.
2975
  } Status;
2976
 
2977
 private:
2978
  typedef Relocate_functions<32, big_endian> Base;
2979
  typedef Arm_relocate_functions<big_endian> This;
2980
 
2981
  // Encoding of imm16 argument for movt and movw ARM instructions
2982
  // from ARM ARM:
2983
  //     
2984
  //     imm16 := imm4 | imm12
2985
  //
2986
  //  f e d c b a 9 8 7 6 5 4 3 2 1 0 f e d c b a 9 8 7 6 5 4 3 2 1 0 
2987
  // +-------+---------------+-------+-------+-----------------------+
2988
  // |       |               |imm4   |       |imm12                  |
2989
  // +-------+---------------+-------+-------+-----------------------+
2990
 
2991
  // Extract the relocation addend from VAL based on the ARM
2992
  // instruction encoding described above.
2993
  static inline typename elfcpp::Swap<32, big_endian>::Valtype
2994
  extract_arm_movw_movt_addend(
2995
      typename elfcpp::Swap<32, big_endian>::Valtype val)
2996
  {
2997
    // According to the Elf ABI for ARM Architecture the immediate
2998
    // field is sign-extended to form the addend.
2999
    return utils::sign_extend<16>(((val >> 4) & 0xf000) | (val & 0xfff));
3000
  }
3001
 
3002
  // Insert X into VAL based on the ARM instruction encoding described
3003
  // above.
3004
  static inline typename elfcpp::Swap<32, big_endian>::Valtype
3005
  insert_val_arm_movw_movt(
3006
      typename elfcpp::Swap<32, big_endian>::Valtype val,
3007
      typename elfcpp::Swap<32, big_endian>::Valtype x)
3008
  {
3009
    val &= 0xfff0f000;
3010
    val |= x & 0x0fff;
3011
    val |= (x & 0xf000) << 4;
3012
    return val;
3013
  }
3014
 
3015
  // Encoding of imm16 argument for movt and movw Thumb2 instructions
3016
  // from ARM ARM:
3017
  //     
3018
  //     imm16 := imm4 | i | imm3 | imm8
3019
  //
3020
  //  f e d c b a 9 8 7 6 5 4 3 2 1 0  f e d c b a 9 8 7 6 5 4 3 2 1 0 
3021
  // +---------+-+-----------+-------++-+-----+-------+---------------+
3022
  // |         |i|           |imm4   || |imm3 |       |imm8           |
3023
  // +---------+-+-----------+-------++-+-----+-------+---------------+
3024
 
3025
  // Extract the relocation addend from VAL based on the Thumb2
3026
  // instruction encoding described above.
3027
  static inline typename elfcpp::Swap<32, big_endian>::Valtype
3028
  extract_thumb_movw_movt_addend(
3029
      typename elfcpp::Swap<32, big_endian>::Valtype val)
3030
  {
3031
    // According to the Elf ABI for ARM Architecture the immediate
3032
    // field is sign-extended to form the addend.
3033
    return utils::sign_extend<16>(((val >> 4) & 0xf000)
3034
                                  | ((val >> 15) & 0x0800)
3035
                                  | ((val >> 4) & 0x0700)
3036
                                  | (val & 0x00ff));
3037
  }
3038
 
3039
  // Insert X into VAL based on the Thumb2 instruction encoding
3040
  // described above.
3041
  static inline typename elfcpp::Swap<32, big_endian>::Valtype
3042
  insert_val_thumb_movw_movt(
3043
      typename elfcpp::Swap<32, big_endian>::Valtype val,
3044
      typename elfcpp::Swap<32, big_endian>::Valtype x)
3045
  {
3046
    val &= 0xfbf08f00;
3047
    val |= (x & 0xf000) << 4;
3048
    val |= (x & 0x0800) << 15;
3049
    val |= (x & 0x0700) << 4;
3050
    val |= (x & 0x00ff);
3051
    return val;
3052
  }
3053
 
3054
  // Calculate the smallest constant Kn for the specified residual.
3055
  // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3056
  static uint32_t
3057
  calc_grp_kn(typename elfcpp::Swap<32, big_endian>::Valtype residual)
3058
  {
3059
    int32_t msb;
3060
 
3061
    if (residual == 0)
3062
      return 0;
3063
    // Determine the most significant bit in the residual and
3064
    // align the resulting value to a 2-bit boundary.
3065
    for (msb = 30; (msb >= 0) && !(residual & (3 << msb)); msb -= 2)
3066
      ;
3067
    // The desired shift is now (msb - 6), or zero, whichever
3068
    // is the greater.
3069
    return (((msb - 6) < 0) ? 0 : (msb - 6));
3070
  }
3071
 
3072
  // Calculate the final residual for the specified group index.
3073
  // If the passed group index is less than zero, the method will return
3074
  // the value of the specified residual without any change.
3075
  // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3076
  static typename elfcpp::Swap<32, big_endian>::Valtype
3077
  calc_grp_residual(typename elfcpp::Swap<32, big_endian>::Valtype residual,
3078
                    const int group)
3079
  {
3080
    for (int n = 0; n <= group; n++)
3081
      {
3082
        // Calculate which part of the value to mask.
3083
        uint32_t shift = calc_grp_kn(residual);
3084
        // Calculate the residual for the next time around.
3085
        residual &= ~(residual & (0xff << shift));
3086
      }
3087
 
3088
    return residual;
3089
  }
3090
 
3091
  // Calculate the value of Gn for the specified group index.
3092
  // We return it in the form of an encoded constant-and-rotation.
3093
  // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3094
  static typename elfcpp::Swap<32, big_endian>::Valtype
3095
  calc_grp_gn(typename elfcpp::Swap<32, big_endian>::Valtype residual,
3096
              const int group)
3097
  {
3098
    typename elfcpp::Swap<32, big_endian>::Valtype gn = 0;
3099
    uint32_t shift = 0;
3100
 
3101
    for (int n = 0; n <= group; n++)
3102
      {
3103
        // Calculate which part of the value to mask.
3104
        shift = calc_grp_kn(residual);
3105
        // Calculate Gn in 32-bit as well as encoded constant-and-rotation form.
3106
        gn = residual & (0xff << shift);
3107
        // Calculate the residual for the next time around.
3108
        residual &= ~gn;
3109
      }
3110
    // Return Gn in the form of an encoded constant-and-rotation.
3111
    return ((gn >> shift) | ((gn <= 0xff ? 0 : (32 - shift) / 2) << 8));
3112
  }
3113
 
3114
 public:
3115
  // Handle ARM long branches.
3116
  static typename This::Status
3117
  arm_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
3118
                    unsigned char*, const Sized_symbol<32>*,
3119
                    const Arm_relobj<big_endian>*, unsigned int,
3120
                    const Symbol_value<32>*, Arm_address, Arm_address, bool);
3121
 
3122
  // Handle THUMB long branches.
3123
  static typename This::Status
3124
  thumb_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
3125
                      unsigned char*, const Sized_symbol<32>*,
3126
                      const Arm_relobj<big_endian>*, unsigned int,
3127
                      const Symbol_value<32>*, Arm_address, Arm_address, bool);
3128
 
3129
 
3130
  // Return the branch offset of a 32-bit THUMB branch.
3131
  static inline int32_t
3132
  thumb32_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
3133
  {
3134
    // We use the Thumb-2 encoding (backwards compatible with Thumb-1)
3135
    // involving the J1 and J2 bits.
3136
    uint32_t s = (upper_insn & (1U << 10)) >> 10;
3137
    uint32_t upper = upper_insn & 0x3ffU;
3138
    uint32_t lower = lower_insn & 0x7ffU;
3139
    uint32_t j1 = (lower_insn & (1U << 13)) >> 13;
3140
    uint32_t j2 = (lower_insn & (1U << 11)) >> 11;
3141
    uint32_t i1 = j1 ^ s ? 0 : 1;
3142
    uint32_t i2 = j2 ^ s ? 0 : 1;
3143
 
3144
    return utils::sign_extend<25>((s << 24) | (i1 << 23) | (i2 << 22)
3145
                                  | (upper << 12) | (lower << 1));
3146
  }
3147
 
3148
  // Insert OFFSET to a 32-bit THUMB branch and return the upper instruction.
3149
  // UPPER_INSN is the original upper instruction of the branch.  Caller is
3150
  // responsible for overflow checking and BLX offset adjustment.
3151
  static inline uint16_t
3152
  thumb32_branch_upper(uint16_t upper_insn, int32_t offset)
3153
  {
3154
    uint32_t s = offset < 0 ? 1 : 0;
3155
    uint32_t bits = static_cast<uint32_t>(offset);
3156
    return (upper_insn & ~0x7ffU) | ((bits >> 12) & 0x3ffU) | (s << 10);
3157
  }
3158
 
3159
  // Insert OFFSET to a 32-bit THUMB branch and return the lower instruction.
3160
  // LOWER_INSN is the original lower instruction of the branch.  Caller is
3161
  // responsible for overflow checking and BLX offset adjustment.
3162
  static inline uint16_t
3163
  thumb32_branch_lower(uint16_t lower_insn, int32_t offset)
3164
  {
3165
    uint32_t s = offset < 0 ? 1 : 0;
3166
    uint32_t bits = static_cast<uint32_t>(offset);
3167
    return ((lower_insn & ~0x2fffU)
3168
            | ((((bits >> 23) & 1) ^ !s) << 13)
3169
            | ((((bits >> 22) & 1) ^ !s) << 11)
3170
            | ((bits >> 1) & 0x7ffU));
3171
  }
3172
 
3173
  // Return the branch offset of a 32-bit THUMB conditional branch.
3174
  static inline int32_t
3175
  thumb32_cond_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
3176
  {
3177
    uint32_t s = (upper_insn & 0x0400U) >> 10;
3178
    uint32_t j1 = (lower_insn & 0x2000U) >> 13;
3179
    uint32_t j2 = (lower_insn & 0x0800U) >> 11;
3180
    uint32_t lower = (lower_insn & 0x07ffU);
3181
    uint32_t upper = (s << 8) | (j2 << 7) | (j1 << 6) | (upper_insn & 0x003fU);
3182
 
3183
    return utils::sign_extend<21>((upper << 12) | (lower << 1));
3184
  }
3185
 
3186
  // Insert OFFSET to a 32-bit THUMB conditional branch and return the upper
3187
  // instruction.  UPPER_INSN is the original upper instruction of the branch.
3188
  // Caller is responsible for overflow checking.
3189
  static inline uint16_t
3190
  thumb32_cond_branch_upper(uint16_t upper_insn, int32_t offset)
3191
  {
3192
    uint32_t s = offset < 0 ? 1 : 0;
3193
    uint32_t bits = static_cast<uint32_t>(offset);
3194
    return (upper_insn & 0xfbc0U) | (s << 10) | ((bits & 0x0003f000U) >> 12);
3195
  }
3196
 
3197
  // Insert OFFSET to a 32-bit THUMB conditional branch and return the lower
3198
  // instruction.  LOWER_INSN is the original lower instruction of the branch.
3199
  // The caller is responsible for overflow checking.
3200
  static inline uint16_t
3201
  thumb32_cond_branch_lower(uint16_t lower_insn, int32_t offset)
3202
  {
3203
    uint32_t bits = static_cast<uint32_t>(offset);
3204
    uint32_t j2 = (bits & 0x00080000U) >> 19;
3205
    uint32_t j1 = (bits & 0x00040000U) >> 18;
3206
    uint32_t lo = (bits & 0x00000ffeU) >> 1;
3207
 
3208
    return (lower_insn & 0xd000U) | (j1 << 13) | (j2 << 11) | lo;
3209
  }
3210
 
3211
  // R_ARM_ABS8: S + A
3212
  static inline typename This::Status
3213
  abs8(unsigned char* view,
3214
       const Sized_relobj_file<32, big_endian>* object,
3215
       const Symbol_value<32>* psymval)
3216
  {
3217
    typedef typename elfcpp::Swap<8, big_endian>::Valtype Valtype;
3218
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3219
    Valtype val = elfcpp::Swap<8, big_endian>::readval(wv);
3220 159 khays
    int32_t addend = utils::sign_extend<8>(val);
3221
    Arm_address x = psymval->value(object, addend);
3222 27 khays
    val = utils::bit_select(val, x, 0xffU);
3223
    elfcpp::Swap<8, big_endian>::writeval(wv, val);
3224
 
3225
    // R_ARM_ABS8 permits signed or unsigned results.
3226
    int signed_x = static_cast<int32_t>(x);
3227
    return ((signed_x < -128 || signed_x > 255)
3228
            ? This::STATUS_OVERFLOW
3229
            : This::STATUS_OKAY);
3230
  }
3231
 
3232
  // R_ARM_THM_ABS5: S + A
3233
  static inline typename This::Status
3234
  thm_abs5(unsigned char* view,
3235
       const Sized_relobj_file<32, big_endian>* object,
3236
       const Symbol_value<32>* psymval)
3237
  {
3238
    typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3239
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3240
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3241
    Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3242
    Reltype addend = (val & 0x7e0U) >> 6;
3243
    Reltype x = psymval->value(object, addend);
3244
    val = utils::bit_select(val, x << 6, 0x7e0U);
3245
    elfcpp::Swap<16, big_endian>::writeval(wv, val);
3246
 
3247
    // R_ARM_ABS16 permits signed or unsigned results.
3248
    int signed_x = static_cast<int32_t>(x);
3249
    return ((signed_x < -32768 || signed_x > 65535)
3250
            ? This::STATUS_OVERFLOW
3251
            : This::STATUS_OKAY);
3252
  }
3253
 
3254
  // R_ARM_ABS12: S + A
3255
  static inline typename This::Status
3256
  abs12(unsigned char* view,
3257
        const Sized_relobj_file<32, big_endian>* object,
3258
        const Symbol_value<32>* psymval)
3259
  {
3260
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3261
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3262
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3263
    Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3264
    Reltype addend = val & 0x0fffU;
3265
    Reltype x = psymval->value(object, addend);
3266
    val = utils::bit_select(val, x, 0x0fffU);
3267
    elfcpp::Swap<32, big_endian>::writeval(wv, val);
3268
    return (utils::has_overflow<12>(x)
3269
            ? This::STATUS_OVERFLOW
3270
            : This::STATUS_OKAY);
3271
  }
3272
 
3273
  // R_ARM_ABS16: S + A
3274
  static inline typename This::Status
3275
  abs16(unsigned char* view,
3276
        const Sized_relobj_file<32, big_endian>* object,
3277
        const Symbol_value<32>* psymval)
3278
  {
3279 159 khays
    typedef typename elfcpp::Swap_unaligned<16, big_endian>::Valtype Valtype;
3280 27 khays
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3281 159 khays
    Valtype val = elfcpp::Swap_unaligned<16, big_endian>::readval(view);
3282
    int32_t addend = utils::sign_extend<16>(val);
3283
    Arm_address x = psymval->value(object, addend);
3284 27 khays
    val = utils::bit_select(val, x, 0xffffU);
3285 159 khays
    elfcpp::Swap_unaligned<16, big_endian>::writeval(view, val);
3286
 
3287
    // R_ARM_ABS16 permits signed or unsigned results.
3288
    int signed_x = static_cast<int32_t>(x);
3289
    return ((signed_x < -32768 || signed_x > 65536)
3290 27 khays
            ? This::STATUS_OVERFLOW
3291
            : This::STATUS_OKAY);
3292
  }
3293
 
3294
  // R_ARM_ABS32: (S + A) | T
3295
  static inline typename This::Status
3296
  abs32(unsigned char* view,
3297
        const Sized_relobj_file<32, big_endian>* object,
3298
        const Symbol_value<32>* psymval,
3299
        Arm_address thumb_bit)
3300
  {
3301 159 khays
    typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
3302
    Valtype addend = elfcpp::Swap_unaligned<32, big_endian>::readval(view);
3303 27 khays
    Valtype x = psymval->value(object, addend) | thumb_bit;
3304 159 khays
    elfcpp::Swap_unaligned<32, big_endian>::writeval(view, x);
3305 27 khays
    return This::STATUS_OKAY;
3306
  }
3307
 
3308
  // R_ARM_REL32: (S + A) | T - P
3309
  static inline typename This::Status
3310
  rel32(unsigned char* view,
3311
        const Sized_relobj_file<32, big_endian>* object,
3312
        const Symbol_value<32>* psymval,
3313
        Arm_address address,
3314
        Arm_address thumb_bit)
3315
  {
3316 159 khays
    typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
3317
    Valtype addend = elfcpp::Swap_unaligned<32, big_endian>::readval(view);
3318 27 khays
    Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
3319 159 khays
    elfcpp::Swap_unaligned<32, big_endian>::writeval(view, x);
3320 27 khays
    return This::STATUS_OKAY;
3321
  }
3322
 
3323
  // R_ARM_THM_JUMP24: (S + A) | T - P
3324
  static typename This::Status
3325
  thm_jump19(unsigned char* view, const Arm_relobj<big_endian>* object,
3326
             const Symbol_value<32>* psymval, Arm_address address,
3327
             Arm_address thumb_bit);
3328
 
3329
  // R_ARM_THM_JUMP6: S + A – P
3330
  static inline typename This::Status
3331
  thm_jump6(unsigned char* view,
3332
            const Sized_relobj_file<32, big_endian>* object,
3333
            const Symbol_value<32>* psymval,
3334
            Arm_address address)
3335
  {
3336
    typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3337
    typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3338
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3339
    Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3340
    // bit[9]:bit[7:3]:’0’ (mask: 0x02f8)
3341
    Reltype addend = (((val & 0x0200) >> 3) | ((val & 0x00f8) >> 2));
3342
    Reltype x = (psymval->value(object, addend) - address);
3343
    val = (val & 0xfd07) | ((x  & 0x0040) << 3) | ((val & 0x003e) << 2);
3344
    elfcpp::Swap<16, big_endian>::writeval(wv, val);
3345
    // CZB does only forward jumps.
3346
    return ((x > 0x007e)
3347
            ? This::STATUS_OVERFLOW
3348
            : This::STATUS_OKAY);
3349
  }
3350
 
3351
  // R_ARM_THM_JUMP8: S + A – P
3352
  static inline typename This::Status
3353
  thm_jump8(unsigned char* view,
3354
            const Sized_relobj_file<32, big_endian>* object,
3355
            const Symbol_value<32>* psymval,
3356
            Arm_address address)
3357
  {
3358
    typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3359
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3360
    Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3361 159 khays
    int32_t addend = utils::sign_extend<8>((val & 0x00ff) << 1);
3362
    int32_t x = (psymval->value(object, addend) - address);
3363
    elfcpp::Swap<16, big_endian>::writeval(wv, ((val & 0xff00)
3364
                                                | ((x & 0x01fe) >> 1)));
3365
    // We do a 9-bit overflow check because x is right-shifted by 1 bit.
3366
    return (utils::has_overflow<9>(x)
3367 27 khays
            ? This::STATUS_OVERFLOW
3368
            : This::STATUS_OKAY);
3369
  }
3370
 
3371
  // R_ARM_THM_JUMP11: S + A – P
3372
  static inline typename This::Status
3373
  thm_jump11(unsigned char* view,
3374
            const Sized_relobj_file<32, big_endian>* object,
3375
            const Symbol_value<32>* psymval,
3376
            Arm_address address)
3377
  {
3378
    typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3379
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3380
    Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3381 159 khays
    int32_t addend = utils::sign_extend<11>((val & 0x07ff) << 1);
3382
    int32_t x = (psymval->value(object, addend) - address);
3383
    elfcpp::Swap<16, big_endian>::writeval(wv, ((val & 0xf800)
3384
                                                | ((x & 0x0ffe) >> 1)));
3385
    // We do a 12-bit overflow check because x is right-shifted by 1 bit.
3386
    return (utils::has_overflow<12>(x)
3387 27 khays
            ? This::STATUS_OVERFLOW
3388
            : This::STATUS_OKAY);
3389
  }
3390
 
3391
  // R_ARM_BASE_PREL: B(S) + A - P
3392
  static inline typename This::Status
3393
  base_prel(unsigned char* view,
3394
            Arm_address origin,
3395
            Arm_address address)
3396
  {
3397
    Base::rel32(view, origin - address);
3398
    return STATUS_OKAY;
3399
  }
3400
 
3401
  // R_ARM_BASE_ABS: B(S) + A
3402
  static inline typename This::Status
3403
  base_abs(unsigned char* view,
3404
           Arm_address origin)
3405
  {
3406
    Base::rel32(view, origin);
3407
    return STATUS_OKAY;
3408
  }
3409
 
3410
  // R_ARM_GOT_BREL: GOT(S) + A - GOT_ORG
3411
  static inline typename This::Status
3412
  got_brel(unsigned char* view,
3413
           typename elfcpp::Swap<32, big_endian>::Valtype got_offset)
3414
  {
3415
    Base::rel32(view, got_offset);
3416
    return This::STATUS_OKAY;
3417
  }
3418
 
3419
  // R_ARM_GOT_PREL: GOT(S) + A - P
3420
  static inline typename This::Status
3421
  got_prel(unsigned char* view,
3422
           Arm_address got_entry,
3423
           Arm_address address)
3424
  {
3425
    Base::rel32(view, got_entry - address);
3426
    return This::STATUS_OKAY;
3427
  }
3428
 
3429
  // R_ARM_PREL: (S + A) | T - P
3430
  static inline typename This::Status
3431
  prel31(unsigned char* view,
3432
         const Sized_relobj_file<32, big_endian>* object,
3433
         const Symbol_value<32>* psymval,
3434
         Arm_address address,
3435
         Arm_address thumb_bit)
3436
  {
3437 159 khays
    typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
3438
    Valtype val = elfcpp::Swap_unaligned<32, big_endian>::readval(view);
3439 27 khays
    Valtype addend = utils::sign_extend<31>(val);
3440
    Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
3441
    val = utils::bit_select(val, x, 0x7fffffffU);
3442 159 khays
    elfcpp::Swap_unaligned<32, big_endian>::writeval(view, val);
3443 27 khays
    return (utils::has_overflow<31>(x) ?
3444
            This::STATUS_OVERFLOW : This::STATUS_OKAY);
3445
  }
3446
 
3447
  // R_ARM_MOVW_ABS_NC: (S + A) | T     (relative address base is )
3448
  // R_ARM_MOVW_PREL_NC: (S + A) | T - P
3449
  // R_ARM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3450
  // R_ARM_MOVW_BREL: ((S + A) | T) - B(S)
3451
  static inline typename This::Status
3452
  movw(unsigned char* view,
3453
       const Sized_relobj_file<32, big_endian>* object,
3454
       const Symbol_value<32>* psymval,
3455
       Arm_address relative_address_base,
3456
       Arm_address thumb_bit,
3457
       bool check_overflow)
3458
  {
3459
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3460
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3461
    Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3462
    Valtype addend = This::extract_arm_movw_movt_addend(val);
3463
    Valtype x = ((psymval->value(object, addend) | thumb_bit)
3464
                 - relative_address_base);
3465
    val = This::insert_val_arm_movw_movt(val, x);
3466
    elfcpp::Swap<32, big_endian>::writeval(wv, val);
3467
    return ((check_overflow && utils::has_overflow<16>(x))
3468
            ? This::STATUS_OVERFLOW
3469
            : This::STATUS_OKAY);
3470
  }
3471
 
3472
  // R_ARM_MOVT_ABS: S + A      (relative address base is 0)
3473
  // R_ARM_MOVT_PREL: S + A - P
3474
  // R_ARM_MOVT_BREL: S + A - B(S)
3475
  static inline typename This::Status
3476
  movt(unsigned char* view,
3477
       const Sized_relobj_file<32, big_endian>* object,
3478
       const Symbol_value<32>* psymval,
3479
       Arm_address relative_address_base)
3480
  {
3481
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3482
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3483
    Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3484
    Valtype addend = This::extract_arm_movw_movt_addend(val);
3485
    Valtype x = (psymval->value(object, addend) - relative_address_base) >> 16;
3486
    val = This::insert_val_arm_movw_movt(val, x);
3487
    elfcpp::Swap<32, big_endian>::writeval(wv, val);
3488
    // FIXME: IHI0044D says that we should check for overflow.
3489
    return This::STATUS_OKAY;
3490
  }
3491
 
3492
  // R_ARM_THM_MOVW_ABS_NC: S + A | T           (relative_address_base is 0)
3493
  // R_ARM_THM_MOVW_PREL_NC: (S + A) | T - P
3494
  // R_ARM_THM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3495
  // R_ARM_THM_MOVW_BREL: ((S + A) | T) - B(S)
3496
  static inline typename This::Status
3497
  thm_movw(unsigned char* view,
3498
           const Sized_relobj_file<32, big_endian>* object,
3499
           const Symbol_value<32>* psymval,
3500
           Arm_address relative_address_base,
3501
           Arm_address thumb_bit,
3502
           bool check_overflow)
3503
  {
3504
    typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3505
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3506
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3507
    Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3508
                  | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3509
    Reltype addend = This::extract_thumb_movw_movt_addend(val);
3510
    Reltype x =
3511
      (psymval->value(object, addend) | thumb_bit) - relative_address_base;
3512
    val = This::insert_val_thumb_movw_movt(val, x);
3513
    elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3514
    elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
3515
    return ((check_overflow && utils::has_overflow<16>(x))
3516
            ? This::STATUS_OVERFLOW
3517
            : This::STATUS_OKAY);
3518
  }
3519
 
3520
  // R_ARM_THM_MOVT_ABS: S + A          (relative address base is 0)
3521
  // R_ARM_THM_MOVT_PREL: S + A - P
3522
  // R_ARM_THM_MOVT_BREL: S + A - B(S)
3523
  static inline typename This::Status
3524
  thm_movt(unsigned char* view,
3525
           const Sized_relobj_file<32, big_endian>* object,
3526
           const Symbol_value<32>* psymval,
3527
           Arm_address relative_address_base)
3528
  {
3529
    typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3530
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3531
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3532
    Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3533
                  | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3534
    Reltype addend = This::extract_thumb_movw_movt_addend(val);
3535
    Reltype x = (psymval->value(object, addend) - relative_address_base) >> 16;
3536
    val = This::insert_val_thumb_movw_movt(val, x);
3537
    elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3538
    elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
3539
    return This::STATUS_OKAY;
3540
  }
3541
 
3542
  // R_ARM_THM_ALU_PREL_11_0: ((S + A) | T) - Pa (Thumb32)
3543
  static inline typename This::Status
3544
  thm_alu11(unsigned char* view,
3545
            const Sized_relobj_file<32, big_endian>* object,
3546
            const Symbol_value<32>* psymval,
3547
            Arm_address address,
3548
            Arm_address thumb_bit)
3549
  {
3550
    typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3551
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3552
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3553
    Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3554
                   | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3555
 
3556
    //        f e d c b|a|9|8 7 6 5|4|3 2 1 0||f|e d c|b a 9 8|7 6 5 4 3 2 1 0
3557
    // -----------------------------------------------------------------------
3558
    // ADD{S} 1 1 1 1 0|i|0|1 0 0 0|S|1 1 0 1||0|imm3 |Rd     |imm8
3559
    // ADDW   1 1 1 1 0|i|1|0 0 0 0|0|1 1 0 1||0|imm3 |Rd     |imm8
3560
    // ADR[+] 1 1 1 1 0|i|1|0 0 0 0|0|1 1 1 1||0|imm3 |Rd     |imm8
3561
    // SUB{S} 1 1 1 1 0|i|0|1 1 0 1|S|1 1 0 1||0|imm3 |Rd     |imm8
3562
    // SUBW   1 1 1 1 0|i|1|0 1 0 1|0|1 1 0 1||0|imm3 |Rd     |imm8
3563
    // ADR[-] 1 1 1 1 0|i|1|0 1 0 1|0|1 1 1 1||0|imm3 |Rd     |imm8
3564
 
3565
    // Determine a sign for the addend.
3566
    const int sign = ((insn & 0xf8ef0000) == 0xf0ad0000
3567
                      || (insn & 0xf8ef0000) == 0xf0af0000) ? -1 : 1;
3568
    // Thumb2 addend encoding:
3569
    // imm12 := i | imm3 | imm8
3570
    int32_t addend = (insn & 0xff)
3571
                     | ((insn & 0x00007000) >> 4)
3572
                     | ((insn & 0x04000000) >> 15);
3573
    // Apply a sign to the added.
3574
    addend *= sign;
3575
 
3576
    int32_t x = (psymval->value(object, addend) | thumb_bit)
3577
                - (address & 0xfffffffc);
3578
    Reltype val = abs(x);
3579
    // Mask out the value and a distinct part of the ADD/SUB opcode
3580
    // (bits 7:5 of opword).
3581
    insn = (insn & 0xfb0f8f00)
3582
           | (val & 0xff)
3583
           | ((val & 0x700) << 4)
3584
           | ((val & 0x800) << 15);
3585
    // Set the opcode according to whether the value to go in the
3586
    // place is negative.
3587
    if (x < 0)
3588
      insn |= 0x00a00000;
3589
 
3590
    elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3591
    elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3592
    return ((val > 0xfff) ?
3593
            This::STATUS_OVERFLOW : This::STATUS_OKAY);
3594
  }
3595
 
3596
  // R_ARM_THM_PC8: S + A - Pa (Thumb)
3597
  static inline typename This::Status
3598
  thm_pc8(unsigned char* view,
3599
          const Sized_relobj_file<32, big_endian>* object,
3600
          const Symbol_value<32>* psymval,
3601
          Arm_address address)
3602
  {
3603
    typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3604
    typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3605
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3606
    Valtype insn = elfcpp::Swap<16, big_endian>::readval(wv);
3607
    Reltype addend = ((insn & 0x00ff) << 2);
3608
    int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3609
    Reltype val = abs(x);
3610
    insn = (insn & 0xff00) | ((val & 0x03fc) >> 2);
3611
 
3612
    elfcpp::Swap<16, big_endian>::writeval(wv, insn);
3613
    return ((val > 0x03fc)
3614
            ? This::STATUS_OVERFLOW
3615
            : This::STATUS_OKAY);
3616
  }
3617
 
3618
  // R_ARM_THM_PC12: S + A - Pa (Thumb32)
3619
  static inline typename This::Status
3620
  thm_pc12(unsigned char* view,
3621
           const Sized_relobj_file<32, big_endian>* object,
3622
           const Symbol_value<32>* psymval,
3623
           Arm_address address)
3624
  {
3625
    typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3626
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3627
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3628
    Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3629
                   | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3630
    // Determine a sign for the addend (positive if the U bit is 1).
3631
    const int sign = (insn & 0x00800000) ? 1 : -1;
3632
    int32_t addend = (insn & 0xfff);
3633
    // Apply a sign to the added.
3634
    addend *= sign;
3635
 
3636
    int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3637
    Reltype val = abs(x);
3638
    // Mask out and apply the value and the U bit.
3639
    insn = (insn & 0xff7ff000) | (val & 0xfff);
3640
    // Set the U bit according to whether the value to go in the
3641
    // place is positive.
3642
    if (x >= 0)
3643
      insn |= 0x00800000;
3644
 
3645
    elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3646
    elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3647
    return ((val > 0xfff) ?
3648
            This::STATUS_OVERFLOW : This::STATUS_OKAY);
3649
  }
3650
 
3651
  // R_ARM_V4BX
3652
  static inline typename This::Status
3653
  v4bx(const Relocate_info<32, big_endian>* relinfo,
3654
       unsigned char* view,
3655
       const Arm_relobj<big_endian>* object,
3656
       const Arm_address address,
3657
       const bool is_interworking)
3658
  {
3659
 
3660
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3661
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3662
    Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3663
 
3664
    // Ensure that we have a BX instruction.
3665
    gold_assert((val & 0x0ffffff0) == 0x012fff10);
3666
    const uint32_t reg = (val & 0xf);
3667
    if (is_interworking && reg != 0xf)
3668
      {
3669
        Stub_table<big_endian>* stub_table =
3670
            object->stub_table(relinfo->data_shndx);
3671
        gold_assert(stub_table != NULL);
3672
 
3673
        Arm_v4bx_stub* stub = stub_table->find_arm_v4bx_stub(reg);
3674
        gold_assert(stub != NULL);
3675
 
3676
        int32_t veneer_address =
3677
            stub_table->address() + stub->offset() - 8 - address;
3678
        gold_assert((veneer_address <= ARM_MAX_FWD_BRANCH_OFFSET)
3679
                    && (veneer_address >= ARM_MAX_BWD_BRANCH_OFFSET));
3680
        // Replace with a branch to veneer (B <addr>)
3681
        val = (val & 0xf0000000) | 0x0a000000
3682
              | ((veneer_address >> 2) & 0x00ffffff);
3683
      }
3684
    else
3685
      {
3686
        // Preserve Rm (lowest four bits) and the condition code
3687
        // (highest four bits). Other bits encode MOV PC,Rm.
3688
        val = (val & 0xf000000f) | 0x01a0f000;
3689
      }
3690
    elfcpp::Swap<32, big_endian>::writeval(wv, val);
3691
    return This::STATUS_OKAY;
3692
  }
3693
 
3694
  // R_ARM_ALU_PC_G0_NC: ((S + A) | T) - P
3695
  // R_ARM_ALU_PC_G0:    ((S + A) | T) - P
3696
  // R_ARM_ALU_PC_G1_NC: ((S + A) | T) - P
3697
  // R_ARM_ALU_PC_G1:    ((S + A) | T) - P
3698
  // R_ARM_ALU_PC_G2:    ((S + A) | T) - P
3699
  // R_ARM_ALU_SB_G0_NC: ((S + A) | T) - B(S)
3700
  // R_ARM_ALU_SB_G0:    ((S + A) | T) - B(S)
3701
  // R_ARM_ALU_SB_G1_NC: ((S + A) | T) - B(S)
3702
  // R_ARM_ALU_SB_G1:    ((S + A) | T) - B(S)
3703
  // R_ARM_ALU_SB_G2:    ((S + A) | T) - B(S)
3704
  static inline typename This::Status
3705
  arm_grp_alu(unsigned char* view,
3706
        const Sized_relobj_file<32, big_endian>* object,
3707
        const Symbol_value<32>* psymval,
3708
        const int group,
3709
        Arm_address address,
3710
        Arm_address thumb_bit,
3711
        bool check_overflow)
3712
  {
3713
    gold_assert(group >= 0 && group < 3);
3714
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3715
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3716
    Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3717
 
3718
    // ALU group relocations are allowed only for the ADD/SUB instructions.
3719
    // (0x00800000 - ADD, 0x00400000 - SUB)
3720
    const Valtype opcode = insn & 0x01e00000;
3721
    if (opcode != 0x00800000 && opcode != 0x00400000)
3722
      return This::STATUS_BAD_RELOC;
3723
 
3724
    // Determine a sign for the addend.
3725
    const int sign = (opcode == 0x00800000) ? 1 : -1;
3726
    // shifter = rotate_imm * 2
3727
    const uint32_t shifter = (insn & 0xf00) >> 7;
3728
    // Initial addend value.
3729
    int32_t addend = insn & 0xff;
3730
    // Rotate addend right by shifter.
3731
    addend = (addend >> shifter) | (addend << (32 - shifter));
3732
    // Apply a sign to the added.
3733
    addend *= sign;
3734
 
3735
    int32_t x = ((psymval->value(object, addend) | thumb_bit) - address);
3736
    Valtype gn = Arm_relocate_functions::calc_grp_gn(abs(x), group);
3737
    // Check for overflow if required
3738
    if (check_overflow
3739
        && (Arm_relocate_functions::calc_grp_residual(abs(x), group) != 0))
3740
      return This::STATUS_OVERFLOW;
3741
 
3742
    // Mask out the value and the ADD/SUB part of the opcode; take care
3743
    // not to destroy the S bit.
3744
    insn &= 0xff1ff000;
3745
    // Set the opcode according to whether the value to go in the
3746
    // place is negative.
3747
    insn |= ((x < 0) ? 0x00400000 : 0x00800000);
3748
    // Encode the offset (encoded Gn).
3749
    insn |= gn;
3750
 
3751
    elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3752
    return This::STATUS_OKAY;
3753
  }
3754
 
3755
  // R_ARM_LDR_PC_G0: S + A - P
3756
  // R_ARM_LDR_PC_G1: S + A - P
3757
  // R_ARM_LDR_PC_G2: S + A - P
3758
  // R_ARM_LDR_SB_G0: S + A - B(S)
3759
  // R_ARM_LDR_SB_G1: S + A - B(S)
3760
  // R_ARM_LDR_SB_G2: S + A - B(S)
3761
  static inline typename This::Status
3762
  arm_grp_ldr(unsigned char* view,
3763
        const Sized_relobj_file<32, big_endian>* object,
3764
        const Symbol_value<32>* psymval,
3765
        const int group,
3766
        Arm_address address)
3767
  {
3768
    gold_assert(group >= 0 && group < 3);
3769
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3770
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3771
    Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3772
 
3773
    const int sign = (insn & 0x00800000) ? 1 : -1;
3774
    int32_t addend = (insn & 0xfff) * sign;
3775
    int32_t x = (psymval->value(object, addend) - address);
3776
    // Calculate the relevant G(n-1) value to obtain this stage residual.
3777
    Valtype residual =
3778
        Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3779
    if (residual >= 0x1000)
3780
      return This::STATUS_OVERFLOW;
3781
 
3782
    // Mask out the value and U bit.
3783
    insn &= 0xff7ff000;
3784
    // Set the U bit for non-negative values.
3785
    if (x >= 0)
3786
      insn |= 0x00800000;
3787
    insn |= residual;
3788
 
3789
    elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3790
    return This::STATUS_OKAY;
3791
  }
3792
 
3793
  // R_ARM_LDRS_PC_G0: S + A - P
3794
  // R_ARM_LDRS_PC_G1: S + A - P
3795
  // R_ARM_LDRS_PC_G2: S + A - P
3796
  // R_ARM_LDRS_SB_G0: S + A - B(S)
3797
  // R_ARM_LDRS_SB_G1: S + A - B(S)
3798
  // R_ARM_LDRS_SB_G2: S + A - B(S)
3799
  static inline typename This::Status
3800
  arm_grp_ldrs(unsigned char* view,
3801
        const Sized_relobj_file<32, big_endian>* object,
3802
        const Symbol_value<32>* psymval,
3803
        const int group,
3804
        Arm_address address)
3805
  {
3806
    gold_assert(group >= 0 && group < 3);
3807
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3808
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3809
    Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3810
 
3811
    const int sign = (insn & 0x00800000) ? 1 : -1;
3812
    int32_t addend = (((insn & 0xf00) >> 4) + (insn & 0xf)) * sign;
3813
    int32_t x = (psymval->value(object, addend) - address);
3814
    // Calculate the relevant G(n-1) value to obtain this stage residual.
3815
    Valtype residual =
3816
        Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3817
   if (residual >= 0x100)
3818
      return This::STATUS_OVERFLOW;
3819
 
3820
    // Mask out the value and U bit.
3821
    insn &= 0xff7ff0f0;
3822
    // Set the U bit for non-negative values.
3823
    if (x >= 0)
3824
      insn |= 0x00800000;
3825
    insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
3826
 
3827
    elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3828
    return This::STATUS_OKAY;
3829
  }
3830
 
3831
  // R_ARM_LDC_PC_G0: S + A - P
3832
  // R_ARM_LDC_PC_G1: S + A - P
3833
  // R_ARM_LDC_PC_G2: S + A - P
3834
  // R_ARM_LDC_SB_G0: S + A - B(S)
3835
  // R_ARM_LDC_SB_G1: S + A - B(S)
3836
  // R_ARM_LDC_SB_G2: S + A - B(S)
3837
  static inline typename This::Status
3838
  arm_grp_ldc(unsigned char* view,
3839
      const Sized_relobj_file<32, big_endian>* object,
3840
      const Symbol_value<32>* psymval,
3841
      const int group,
3842
      Arm_address address)
3843
  {
3844
    gold_assert(group >= 0 && group < 3);
3845
    typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3846
    Valtype* wv = reinterpret_cast<Valtype*>(view);
3847
    Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3848
 
3849
    const int sign = (insn & 0x00800000) ? 1 : -1;
3850
    int32_t addend = ((insn & 0xff) << 2) * sign;
3851
    int32_t x = (psymval->value(object, addend) - address);
3852
    // Calculate the relevant G(n-1) value to obtain this stage residual.
3853
    Valtype residual =
3854
      Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3855
    if ((residual & 0x3) != 0 || residual >= 0x400)
3856
      return This::STATUS_OVERFLOW;
3857
 
3858
    // Mask out the value and U bit.
3859
    insn &= 0xff7fff00;
3860
    // Set the U bit for non-negative values.
3861
    if (x >= 0)
3862
      insn |= 0x00800000;
3863
    insn |= (residual >> 2);
3864
 
3865
    elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3866
    return This::STATUS_OKAY;
3867
  }
3868
};
3869
 
3870
// Relocate ARM long branches.  This handles relocation types
3871
// R_ARM_CALL, R_ARM_JUMP24, R_ARM_PLT32 and R_ARM_XPC25.
3872
// If IS_WEAK_UNDEFINED_WITH_PLT is true.  The target symbol is weakly
3873
// undefined and we do not use PLT in this relocation.  In such a case,
3874
// the branch is converted into an NOP.
3875
 
3876
template<bool big_endian>
3877
typename Arm_relocate_functions<big_endian>::Status
3878
Arm_relocate_functions<big_endian>::arm_branch_common(
3879
    unsigned int r_type,
3880
    const Relocate_info<32, big_endian>* relinfo,
3881
    unsigned char* view,
3882
    const Sized_symbol<32>* gsym,
3883
    const Arm_relobj<big_endian>* object,
3884
    unsigned int r_sym,
3885
    const Symbol_value<32>* psymval,
3886
    Arm_address address,
3887
    Arm_address thumb_bit,
3888
    bool is_weakly_undefined_without_plt)
3889
{
3890
  typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3891
  Valtype* wv = reinterpret_cast<Valtype*>(view);
3892
  Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3893
 
3894
  bool insn_is_b = (((val >> 28) & 0xf) <= 0xe)
3895
                    && ((val & 0x0f000000UL) == 0x0a000000UL);
3896
  bool insn_is_uncond_bl = (val & 0xff000000UL) == 0xeb000000UL;
3897
  bool insn_is_cond_bl = (((val >> 28) & 0xf) < 0xe)
3898
                          && ((val & 0x0f000000UL) == 0x0b000000UL);
3899
  bool insn_is_blx = (val & 0xfe000000UL) == 0xfa000000UL;
3900
  bool insn_is_any_branch = (val & 0x0e000000UL) == 0x0a000000UL;
3901
 
3902
  // Check that the instruction is valid.
3903
  if (r_type == elfcpp::R_ARM_CALL)
3904
    {
3905
      if (!insn_is_uncond_bl && !insn_is_blx)
3906
        return This::STATUS_BAD_RELOC;
3907
    }
3908
  else if (r_type == elfcpp::R_ARM_JUMP24)
3909
    {
3910
      if (!insn_is_b && !insn_is_cond_bl)
3911
        return This::STATUS_BAD_RELOC;
3912
    }
3913
  else if (r_type == elfcpp::R_ARM_PLT32)
3914
    {
3915
      if (!insn_is_any_branch)
3916
        return This::STATUS_BAD_RELOC;
3917
    }
3918
  else if (r_type == elfcpp::R_ARM_XPC25)
3919
    {
3920
      // FIXME: AAELF document IH0044C does not say much about it other
3921
      // than it being obsolete.
3922
      if (!insn_is_any_branch)
3923
        return This::STATUS_BAD_RELOC;
3924
    }
3925
  else
3926
    gold_unreachable();
3927
 
3928
  // A branch to an undefined weak symbol is turned into a jump to
3929
  // the next instruction unless a PLT entry will be created.
3930
  // Do the same for local undefined symbols.
3931
  // The jump to the next instruction is optimized as a NOP depending
3932
  // on the architecture.
3933
  const Target_arm<big_endian>* arm_target =
3934
    Target_arm<big_endian>::default_target();
3935
  if (is_weakly_undefined_without_plt)
3936
    {
3937
      gold_assert(!parameters->options().relocatable());
3938
      Valtype cond = val & 0xf0000000U;
3939
      if (arm_target->may_use_arm_nop())
3940
        val = cond | 0x0320f000;
3941
      else
3942
        val = cond | 0x01a00000;        // Using pre-UAL nop: mov r0, r0.
3943
      elfcpp::Swap<32, big_endian>::writeval(wv, val);
3944
      return This::STATUS_OKAY;
3945
    }
3946
 
3947
  Valtype addend = utils::sign_extend<26>(val << 2);
3948
  Valtype branch_target = psymval->value(object, addend);
3949
  int32_t branch_offset = branch_target - address;
3950
 
3951
  // We need a stub if the branch offset is too large or if we need
3952
  // to switch mode.
3953
  bool may_use_blx = arm_target->may_use_blx();
3954
  Reloc_stub* stub = NULL;
3955
 
3956
  if (!parameters->options().relocatable()
3957
      && (utils::has_overflow<26>(branch_offset)
3958
          || ((thumb_bit != 0)
3959
              && !(may_use_blx && r_type == elfcpp::R_ARM_CALL))))
3960
    {
3961
      Valtype unadjusted_branch_target = psymval->value(object, 0);
3962
 
3963
      Stub_type stub_type =
3964
        Reloc_stub::stub_type_for_reloc(r_type, address,
3965
                                        unadjusted_branch_target,
3966
                                        (thumb_bit != 0));
3967
      if (stub_type != arm_stub_none)
3968
        {
3969
          Stub_table<big_endian>* stub_table =
3970
            object->stub_table(relinfo->data_shndx);
3971
          gold_assert(stub_table != NULL);
3972
 
3973
          Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
3974
          stub = stub_table->find_reloc_stub(stub_key);
3975
          gold_assert(stub != NULL);
3976
          thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
3977
          branch_target = stub_table->address() + stub->offset() + addend;
3978
          branch_offset = branch_target - address;
3979
          gold_assert(!utils::has_overflow<26>(branch_offset));
3980
        }
3981
    }
3982
 
3983
  // At this point, if we still need to switch mode, the instruction
3984
  // must either be a BLX or a BL that can be converted to a BLX.
3985
  if (thumb_bit != 0)
3986
    {
3987
      // Turn BL to BLX.
3988
      gold_assert(may_use_blx && r_type == elfcpp::R_ARM_CALL);
3989
      val = (val & 0xffffff) | 0xfa000000 | ((branch_offset & 2) << 23);
3990
    }
3991
 
3992
  val = utils::bit_select(val, (branch_offset >> 2), 0xffffffUL);
3993
  elfcpp::Swap<32, big_endian>::writeval(wv, val);
3994
  return (utils::has_overflow<26>(branch_offset)
3995
          ? This::STATUS_OVERFLOW : This::STATUS_OKAY);
3996
}
3997
 
3998
// Relocate THUMB long branches.  This handles relocation types
3999
// R_ARM_THM_CALL, R_ARM_THM_JUMP24 and R_ARM_THM_XPC22.
4000
// If IS_WEAK_UNDEFINED_WITH_PLT is true.  The target symbol is weakly
4001
// undefined and we do not use PLT in this relocation.  In such a case,
4002
// the branch is converted into an NOP.
4003
 
4004
template<bool big_endian>
4005
typename Arm_relocate_functions<big_endian>::Status
4006
Arm_relocate_functions<big_endian>::thumb_branch_common(
4007
    unsigned int r_type,
4008
    const Relocate_info<32, big_endian>* relinfo,
4009
    unsigned char* view,
4010
    const Sized_symbol<32>* gsym,
4011
    const Arm_relobj<big_endian>* object,
4012
    unsigned int r_sym,
4013
    const Symbol_value<32>* psymval,
4014
    Arm_address address,
4015
    Arm_address thumb_bit,
4016
    bool is_weakly_undefined_without_plt)
4017
{
4018
  typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
4019
  Valtype* wv = reinterpret_cast<Valtype*>(view);
4020
  uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
4021
  uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
4022
 
4023
  // FIXME: These tests are too loose and do not take THUMB/THUMB-2 difference
4024
  // into account.
4025
  bool is_bl_insn = (lower_insn & 0x1000U) == 0x1000U;
4026
  bool is_blx_insn = (lower_insn & 0x1000U) == 0x0000U;
4027
 
4028
  // Check that the instruction is valid.
4029
  if (r_type == elfcpp::R_ARM_THM_CALL)
4030
    {
4031
      if (!is_bl_insn && !is_blx_insn)
4032
        return This::STATUS_BAD_RELOC;
4033
    }
4034
  else if (r_type == elfcpp::R_ARM_THM_JUMP24)
4035
    {
4036
      // This cannot be a BLX.
4037
      if (!is_bl_insn)
4038
        return This::STATUS_BAD_RELOC;
4039
    }
4040
  else if (r_type == elfcpp::R_ARM_THM_XPC22)
4041
    {
4042
      // Check for Thumb to Thumb call.
4043
      if (!is_blx_insn)
4044
        return This::STATUS_BAD_RELOC;
4045
      if (thumb_bit != 0)
4046
        {
4047
          gold_warning(_("%s: Thumb BLX instruction targets "
4048
                         "thumb function '%s'."),
4049
                         object->name().c_str(),
4050
                         (gsym ? gsym->name() : "(local)"));
4051
          // Convert BLX to BL.
4052
          lower_insn |= 0x1000U;
4053
        }
4054
    }
4055
  else
4056
    gold_unreachable();
4057
 
4058
  // A branch to an undefined weak symbol is turned into a jump to
4059
  // the next instruction unless a PLT entry will be created.
4060
  // The jump to the next instruction is optimized as a NOP.W for
4061
  // Thumb-2 enabled architectures.
4062
  const Target_arm<big_endian>* arm_target =
4063
    Target_arm<big_endian>::default_target();
4064
  if (is_weakly_undefined_without_plt)
4065
    {
4066
      gold_assert(!parameters->options().relocatable());
4067
      if (arm_target->may_use_thumb2_nop())
4068
        {
4069
          elfcpp::Swap<16, big_endian>::writeval(wv, 0xf3af);
4070
          elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0x8000);
4071
        }
4072
      else
4073
        {
4074
          elfcpp::Swap<16, big_endian>::writeval(wv, 0xe000);
4075
          elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0xbf00);
4076
        }
4077
      return This::STATUS_OKAY;
4078
    }
4079
 
4080
  int32_t addend = This::thumb32_branch_offset(upper_insn, lower_insn);
4081
  Arm_address branch_target = psymval->value(object, addend);
4082
 
4083
  // For BLX, bit 1 of target address comes from bit 1 of base address.
4084
  bool may_use_blx = arm_target->may_use_blx();
4085
  if (thumb_bit == 0 && may_use_blx)
4086
    branch_target = utils::bit_select(branch_target, address, 0x2);
4087
 
4088
  int32_t branch_offset = branch_target - address;
4089
 
4090
  // We need a stub if the branch offset is too large or if we need
4091
  // to switch mode.
4092
  bool thumb2 = arm_target->using_thumb2();
4093
  if (!parameters->options().relocatable()
4094
      && ((!thumb2 && utils::has_overflow<23>(branch_offset))
4095
          || (thumb2 && utils::has_overflow<25>(branch_offset))
4096
          || ((thumb_bit == 0)
4097
              && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
4098
                  || r_type == elfcpp::R_ARM_THM_JUMP24))))
4099
    {
4100
      Arm_address unadjusted_branch_target = psymval->value(object, 0);
4101
 
4102
      Stub_type stub_type =
4103
        Reloc_stub::stub_type_for_reloc(r_type, address,
4104
                                        unadjusted_branch_target,
4105
                                        (thumb_bit != 0));
4106
 
4107
      if (stub_type != arm_stub_none)
4108
        {
4109
          Stub_table<big_endian>* stub_table =
4110
            object->stub_table(relinfo->data_shndx);
4111
          gold_assert(stub_table != NULL);
4112
 
4113
          Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
4114
          Reloc_stub* stub = stub_table->find_reloc_stub(stub_key);
4115
          gold_assert(stub != NULL);
4116
          thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
4117
          branch_target = stub_table->address() + stub->offset() + addend;
4118
          if (thumb_bit == 0 && may_use_blx)
4119
            branch_target = utils::bit_select(branch_target, address, 0x2);
4120
          branch_offset = branch_target - address;
4121
        }
4122
    }
4123
 
4124
  // At this point, if we still need to switch mode, the instruction
4125
  // must either be a BLX or a BL that can be converted to a BLX.
4126
  if (thumb_bit == 0)
4127
    {
4128
      gold_assert(may_use_blx
4129
                  && (r_type == elfcpp::R_ARM_THM_CALL
4130
                      || r_type == elfcpp::R_ARM_THM_XPC22));
4131
      // Make sure this is a BLX.
4132
      lower_insn &= ~0x1000U;
4133
    }
4134
  else
4135
    {
4136
      // Make sure this is a BL.
4137
      lower_insn |= 0x1000U;
4138
    }
4139
 
4140
  // For a BLX instruction, make sure that the relocation is rounded up
4141
  // to a word boundary.  This follows the semantics of the instruction
4142
  // which specifies that bit 1 of the target address will come from bit
4143
  // 1 of the base address.
4144
  if ((lower_insn & 0x5000U) == 0x4000U)
4145
    gold_assert((branch_offset & 3) == 0);
4146
 
4147
  // Put BRANCH_OFFSET back into the insn.  Assumes two's complement.
4148
  // We use the Thumb-2 encoding, which is safe even if dealing with
4149
  // a Thumb-1 instruction by virtue of our overflow check above.  */
4150
  upper_insn = This::thumb32_branch_upper(upper_insn, branch_offset);
4151
  lower_insn = This::thumb32_branch_lower(lower_insn, branch_offset);
4152
 
4153
  elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
4154
  elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
4155
 
4156
  gold_assert(!utils::has_overflow<25>(branch_offset));
4157
 
4158
  return ((thumb2
4159
           ? utils::has_overflow<25>(branch_offset)
4160
           : utils::has_overflow<23>(branch_offset))
4161
          ? This::STATUS_OVERFLOW
4162
          : This::STATUS_OKAY);
4163
}
4164
 
4165
// Relocate THUMB-2 long conditional branches.
4166
// If IS_WEAK_UNDEFINED_WITH_PLT is true.  The target symbol is weakly
4167
// undefined and we do not use PLT in this relocation.  In such a case,
4168
// the branch is converted into an NOP.
4169
 
4170
template<bool big_endian>
4171
typename Arm_relocate_functions<big_endian>::Status
4172
Arm_relocate_functions<big_endian>::thm_jump19(
4173
    unsigned char* view,
4174
    const Arm_relobj<big_endian>* object,
4175
    const Symbol_value<32>* psymval,
4176
    Arm_address address,
4177
    Arm_address thumb_bit)
4178
{
4179
  typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
4180
  Valtype* wv = reinterpret_cast<Valtype*>(view);
4181
  uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
4182
  uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
4183
  int32_t addend = This::thumb32_cond_branch_offset(upper_insn, lower_insn);
4184
 
4185
  Arm_address branch_target = psymval->value(object, addend);
4186
  int32_t branch_offset = branch_target - address;
4187
 
4188
  // ??? Should handle interworking?  GCC might someday try to
4189
  // use this for tail calls.
4190
  // FIXME: We do support thumb entry to PLT yet.
4191
  if (thumb_bit == 0)
4192
    {
4193
      gold_error(_("conditional branch to PLT in THUMB-2 not supported yet."));
4194
      return This::STATUS_BAD_RELOC;
4195
    }
4196
 
4197
  // Put RELOCATION back into the insn.
4198
  upper_insn = This::thumb32_cond_branch_upper(upper_insn, branch_offset);
4199
  lower_insn = This::thumb32_cond_branch_lower(lower_insn, branch_offset);
4200
 
4201
  // Put the relocated value back in the object file:
4202
  elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
4203
  elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
4204
 
4205
  return (utils::has_overflow<21>(branch_offset)
4206
          ? This::STATUS_OVERFLOW
4207
          : This::STATUS_OKAY);
4208
}
4209
 
4210
// Get the GOT section, creating it if necessary.
4211
 
4212
template<bool big_endian>
4213
Arm_output_data_got<big_endian>*
4214
Target_arm<big_endian>::got_section(Symbol_table* symtab, Layout* layout)
4215
{
4216
  if (this->got_ == NULL)
4217
    {
4218
      gold_assert(symtab != NULL && layout != NULL);
4219
 
4220
      this->got_ = new Arm_output_data_got<big_endian>(symtab, layout);
4221
 
4222
      layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
4223
                                      (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE),
4224
                                      this->got_, ORDER_DATA, false);
4225
 
4226
      // The old GNU linker creates a .got.plt section.  We just
4227
      // create another set of data in the .got section.  Note that we
4228
      // always create a PLT if we create a GOT, although the PLT
4229
      // might be empty.
4230
      this->got_plt_ = new Output_data_space(4, "** GOT PLT");
4231
      layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
4232
                                      (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE),
4233
                                      this->got_plt_, ORDER_DATA, false);
4234
 
4235
      // The first three entries are reserved.
4236
      this->got_plt_->set_current_data_size(3 * 4);
4237
 
4238
      // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
4239
      symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
4240
                                    Symbol_table::PREDEFINED,
4241
                                    this->got_plt_,
4242
                                    0, 0, elfcpp::STT_OBJECT,
4243
                                    elfcpp::STB_LOCAL,
4244
                                    elfcpp::STV_HIDDEN, 0,
4245
                                    false, false);
4246
    }
4247
  return this->got_;
4248
}
4249
 
4250
// Get the dynamic reloc section, creating it if necessary.
4251
 
4252
template<bool big_endian>
4253
typename Target_arm<big_endian>::Reloc_section*
4254
Target_arm<big_endian>::rel_dyn_section(Layout* layout)
4255
{
4256
  if (this->rel_dyn_ == NULL)
4257
    {
4258
      gold_assert(layout != NULL);
4259
      this->rel_dyn_ = new Reloc_section(parameters->options().combreloc());
4260
      layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
4261
                                      elfcpp::SHF_ALLOC, this->rel_dyn_,
4262
                                      ORDER_DYNAMIC_RELOCS, false);
4263
    }
4264
  return this->rel_dyn_;
4265
}
4266
 
4267
// Insn_template methods.
4268
 
4269
// Return byte size of an instruction template.
4270
 
4271
size_t
4272
Insn_template::size() const
4273
{
4274
  switch (this->type())
4275
    {
4276
    case THUMB16_TYPE:
4277
    case THUMB16_SPECIAL_TYPE:
4278
      return 2;
4279
    case ARM_TYPE:
4280
    case THUMB32_TYPE:
4281
    case DATA_TYPE:
4282
      return 4;
4283
    default:
4284
      gold_unreachable();
4285
    }
4286
}
4287
 
4288
// Return alignment of an instruction template.
4289
 
4290
unsigned
4291
Insn_template::alignment() const
4292
{
4293
  switch (this->type())
4294
    {
4295
    case THUMB16_TYPE:
4296
    case THUMB16_SPECIAL_TYPE:
4297
    case THUMB32_TYPE:
4298
      return 2;
4299
    case ARM_TYPE:
4300
    case DATA_TYPE:
4301
      return 4;
4302
    default:
4303
      gold_unreachable();
4304
    }
4305
}
4306
 
4307
// Stub_template methods.
4308
 
4309
Stub_template::Stub_template(
4310
    Stub_type type, const Insn_template* insns,
4311
     size_t insn_count)
4312
  : type_(type), insns_(insns), insn_count_(insn_count), alignment_(1),
4313
    entry_in_thumb_mode_(false), relocs_()
4314
{
4315
  off_t offset = 0;
4316
 
4317
  // Compute byte size and alignment of stub template.
4318
  for (size_t i = 0; i < insn_count; i++)
4319
    {
4320
      unsigned insn_alignment = insns[i].alignment();
4321
      size_t insn_size = insns[i].size();
4322
      gold_assert((offset & (insn_alignment - 1)) == 0);
4323
      this->alignment_ = std::max(this->alignment_, insn_alignment);
4324
      switch (insns[i].type())
4325
        {
4326
        case Insn_template::THUMB16_TYPE:
4327
        case Insn_template::THUMB16_SPECIAL_TYPE:
4328
          if (i == 0)
4329
            this->entry_in_thumb_mode_ = true;
4330
          break;
4331
 
4332
        case Insn_template::THUMB32_TYPE:
4333
          if (insns[i].r_type() != elfcpp::R_ARM_NONE)
4334
            this->relocs_.push_back(Reloc(i, offset));
4335
          if (i == 0)
4336
            this->entry_in_thumb_mode_ = true;
4337
          break;
4338
 
4339
        case Insn_template::ARM_TYPE:
4340
          // Handle cases where the target is encoded within the
4341
          // instruction.
4342
          if (insns[i].r_type() == elfcpp::R_ARM_JUMP24)
4343
            this->relocs_.push_back(Reloc(i, offset));
4344
          break;
4345
 
4346
        case Insn_template::DATA_TYPE:
4347
          // Entry point cannot be data.
4348
          gold_assert(i != 0);
4349
          this->relocs_.push_back(Reloc(i, offset));
4350
          break;
4351
 
4352
        default:
4353
          gold_unreachable();
4354
        }
4355
      offset += insn_size;
4356
    }
4357
  this->size_ = offset;
4358
}
4359
 
4360
// Stub methods.
4361
 
4362
// Template to implement do_write for a specific target endianness.
4363
 
4364
template<bool big_endian>
4365
void inline
4366
Stub::do_fixed_endian_write(unsigned char* view, section_size_type view_size)
4367
{
4368
  const Stub_template* stub_template = this->stub_template();
4369
  const Insn_template* insns = stub_template->insns();
4370
 
4371
  // FIXME:  We do not handle BE8 encoding yet.
4372
  unsigned char* pov = view;
4373
  for (size_t i = 0; i < stub_template->insn_count(); i++)
4374
    {
4375
      switch (insns[i].type())
4376
        {
4377
        case Insn_template::THUMB16_TYPE:
4378
          elfcpp::Swap<16, big_endian>::writeval(pov, insns[i].data() & 0xffff);
4379
          break;
4380
        case Insn_template::THUMB16_SPECIAL_TYPE:
4381
          elfcpp::Swap<16, big_endian>::writeval(
4382
              pov,
4383
              this->thumb16_special(i));
4384
          break;
4385
        case Insn_template::THUMB32_TYPE:
4386
          {
4387
            uint32_t hi = (insns[i].data() >> 16) & 0xffff;
4388
            uint32_t lo = insns[i].data() & 0xffff;
4389
            elfcpp::Swap<16, big_endian>::writeval(pov, hi);
4390
            elfcpp::Swap<16, big_endian>::writeval(pov + 2, lo);
4391
          }
4392
          break;
4393
        case Insn_template::ARM_TYPE:
4394
        case Insn_template::DATA_TYPE:
4395
          elfcpp::Swap<32, big_endian>::writeval(pov, insns[i].data());
4396
          break;
4397
        default:
4398
          gold_unreachable();
4399
        }
4400
      pov += insns[i].size();
4401
    }
4402
  gold_assert(static_cast<section_size_type>(pov - view) == view_size);
4403
}
4404
 
4405
// Reloc_stub::Key methods.
4406
 
4407
// Dump a Key as a string for debugging.
4408
 
4409
std::string
4410
Reloc_stub::Key::name() const
4411
{
4412
  if (this->r_sym_ == invalid_index)
4413
    {
4414
      // Global symbol key name
4415
      // <stub-type>:<symbol name>:<addend>.
4416
      const std::string sym_name = this->u_.symbol->name();
4417
      // We need to print two hex number and two colons.  So just add 100 bytes
4418
      // to the symbol name size.
4419
      size_t len = sym_name.size() + 100;
4420
      char* buffer = new char[len];
4421
      int c = snprintf(buffer, len, "%d:%s:%x", this->stub_type_,
4422
                       sym_name.c_str(), this->addend_);
4423
      gold_assert(c > 0 && c < static_cast<int>(len));
4424
      delete[] buffer;
4425
      return std::string(buffer);
4426
    }
4427
  else
4428
    {
4429
      // local symbol key name
4430
      // <stub-type>:<object>:<r_sym>:<addend>.
4431
      const size_t len = 200;
4432
      char buffer[len];
4433
      int c = snprintf(buffer, len, "%d:%p:%u:%x", this->stub_type_,
4434
                       this->u_.relobj, this->r_sym_, this->addend_);
4435
      gold_assert(c > 0 && c < static_cast<int>(len));
4436
      return std::string(buffer);
4437
    }
4438
}
4439
 
4440
// Reloc_stub methods.
4441
 
4442
// Determine the type of stub needed, if any, for a relocation of R_TYPE at
4443
// LOCATION to DESTINATION.
4444
// This code is based on the arm_type_of_stub function in
4445
// bfd/elf32-arm.c.  We have changed the interface a little to keep the Stub
4446
// class simple.
4447
 
4448
Stub_type
4449
Reloc_stub::stub_type_for_reloc(
4450
   unsigned int r_type,
4451
   Arm_address location,
4452
   Arm_address destination,
4453
   bool target_is_thumb)
4454
{
4455
  Stub_type stub_type = arm_stub_none;
4456
 
4457
  // This is a bit ugly but we want to avoid using a templated class for
4458
  // big and little endianities.
4459
  bool may_use_blx;
4460
  bool should_force_pic_veneer;
4461
  bool thumb2;
4462
  bool thumb_only;
4463
  if (parameters->target().is_big_endian())
4464
    {
4465
      const Target_arm<true>* big_endian_target =
4466
        Target_arm<true>::default_target();
4467
      may_use_blx = big_endian_target->may_use_blx();
4468
      should_force_pic_veneer = big_endian_target->should_force_pic_veneer();
4469
      thumb2 = big_endian_target->using_thumb2();
4470
      thumb_only = big_endian_target->using_thumb_only();
4471
    }
4472
  else
4473
    {
4474
      const Target_arm<false>* little_endian_target =
4475
        Target_arm<false>::default_target();
4476
      may_use_blx = little_endian_target->may_use_blx();
4477
      should_force_pic_veneer = little_endian_target->should_force_pic_veneer();
4478
      thumb2 = little_endian_target->using_thumb2();
4479
      thumb_only = little_endian_target->using_thumb_only();
4480
    }
4481
 
4482
  int64_t branch_offset;
4483
  if (r_type == elfcpp::R_ARM_THM_CALL || r_type == elfcpp::R_ARM_THM_JUMP24)
4484
    {
4485
      // For THUMB BLX instruction, bit 1 of target comes from bit 1 of the
4486
      // base address (instruction address + 4).
4487
      if ((r_type == elfcpp::R_ARM_THM_CALL) && may_use_blx && !target_is_thumb)
4488
        destination = utils::bit_select(destination, location, 0x2);
4489
      branch_offset = static_cast<int64_t>(destination) - location;
4490
 
4491
      // Handle cases where:
4492
      // - this call goes too far (different Thumb/Thumb2 max
4493
      //   distance)
4494
      // - it's a Thumb->Arm call and blx is not available, or it's a
4495
      //   Thumb->Arm branch (not bl). A stub is needed in this case.
4496
      if ((!thumb2
4497
            && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
4498
                || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
4499
          || (thumb2
4500
              && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
4501
                  || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
4502
          || ((!target_is_thumb)
4503
              && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
4504
                  || (r_type == elfcpp::R_ARM_THM_JUMP24))))
4505
        {
4506
          if (target_is_thumb)
4507
            {
4508
              // Thumb to thumb.
4509
              if (!thumb_only)
4510
                {
4511
                  stub_type = (parameters->options().shared()
4512
                               || should_force_pic_veneer)
4513
                    // PIC stubs.
4514
                    ? ((may_use_blx
4515
                        && (r_type == elfcpp::R_ARM_THM_CALL))
4516
                       // V5T and above. Stub starts with ARM code, so
4517
                       // we must be able to switch mode before
4518
                       // reaching it, which is only possible for 'bl'
4519
                       // (ie R_ARM_THM_CALL relocation).
4520
                       ? arm_stub_long_branch_any_thumb_pic
4521
                       // On V4T, use Thumb code only.
4522
                       : arm_stub_long_branch_v4t_thumb_thumb_pic)
4523
 
4524
                    // non-PIC stubs.
4525
                    : ((may_use_blx
4526
                        && (r_type == elfcpp::R_ARM_THM_CALL))
4527
                       ? arm_stub_long_branch_any_any // V5T and above.
4528
                       : arm_stub_long_branch_v4t_thumb_thumb); // V4T.
4529
                }
4530
              else
4531
                {
4532
                  stub_type = (parameters->options().shared()
4533
                               || should_force_pic_veneer)
4534
                    ? arm_stub_long_branch_thumb_only_pic       // PIC stub.
4535
                    : arm_stub_long_branch_thumb_only;  // non-PIC stub.
4536
                }
4537
            }
4538
          else
4539
            {
4540
              // Thumb to arm.
4541
 
4542
              // FIXME: We should check that the input section is from an
4543
              // object that has interwork enabled.
4544
 
4545
              stub_type = (parameters->options().shared()
4546
                           || should_force_pic_veneer)
4547
                // PIC stubs.
4548
                ? ((may_use_blx
4549
                    && (r_type == elfcpp::R_ARM_THM_CALL))
4550
                   ? arm_stub_long_branch_any_arm_pic   // V5T and above.
4551
                   : arm_stub_long_branch_v4t_thumb_arm_pic)    // V4T.
4552
 
4553
                // non-PIC stubs.
4554
                : ((may_use_blx
4555
                    && (r_type == elfcpp::R_ARM_THM_CALL))
4556
                   ? arm_stub_long_branch_any_any       // V5T and above.
4557
                   : arm_stub_long_branch_v4t_thumb_arm);       // V4T.
4558
 
4559
              // Handle v4t short branches.
4560
              if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
4561
                  && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
4562
                  && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
4563
                stub_type = arm_stub_short_branch_v4t_thumb_arm;
4564
            }
4565
        }
4566
    }
4567
  else if (r_type == elfcpp::R_ARM_CALL
4568
           || r_type == elfcpp::R_ARM_JUMP24
4569
           || r_type == elfcpp::R_ARM_PLT32)
4570
    {
4571
      branch_offset = static_cast<int64_t>(destination) - location;
4572
      if (target_is_thumb)
4573
        {
4574
          // Arm to thumb.
4575
 
4576
          // FIXME: We should check that the input section is from an
4577
          // object that has interwork enabled.
4578
 
4579
          // We have an extra 2-bytes reach because of
4580
          // the mode change (bit 24 (H) of BLX encoding).
4581
          if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
4582
              || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
4583
              || ((r_type == elfcpp::R_ARM_CALL) && !may_use_blx)
4584
              || (r_type == elfcpp::R_ARM_JUMP24)
4585
              || (r_type == elfcpp::R_ARM_PLT32))
4586
            {
4587
              stub_type = (parameters->options().shared()
4588
                           || should_force_pic_veneer)
4589
                // PIC stubs.
4590
                ? (may_use_blx
4591
                   ? arm_stub_long_branch_any_thumb_pic// V5T and above.
4592
                   : arm_stub_long_branch_v4t_arm_thumb_pic)    // V4T stub.
4593
 
4594
                // non-PIC stubs.
4595
                : (may_use_blx
4596
                   ? arm_stub_long_branch_any_any       // V5T and above.
4597
                   : arm_stub_long_branch_v4t_arm_thumb);       // V4T.
4598
            }
4599
        }
4600
      else
4601
        {
4602
          // Arm to arm.
4603
          if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
4604
              || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
4605
            {
4606
              stub_type = (parameters->options().shared()
4607
                           || should_force_pic_veneer)
4608
                ? arm_stub_long_branch_any_arm_pic      // PIC stubs.
4609
                : arm_stub_long_branch_any_any;         /// non-PIC.
4610
            }
4611
        }
4612
    }
4613
 
4614
  return stub_type;
4615
}
4616
 
4617
// Cortex_a8_stub methods.
4618
 
4619
// Return the instruction for a THUMB16_SPECIAL_TYPE instruction template.
4620
// I is the position of the instruction template in the stub template.
4621
 
4622
uint16_t
4623
Cortex_a8_stub::do_thumb16_special(size_t i)
4624
{
4625
  // The only use of this is to copy condition code from a conditional
4626
  // branch being worked around to the corresponding conditional branch in
4627
  // to the stub.
4628
  gold_assert(this->stub_template()->type() == arm_stub_a8_veneer_b_cond
4629
              && i == 0);
4630
  uint16_t data = this->stub_template()->insns()[i].data();
4631
  gold_assert((data & 0xff00U) == 0xd000U);
4632
  data |= ((this->original_insn_ >> 22) & 0xf) << 8;
4633
  return data;
4634
}
4635
 
4636
// Stub_factory methods.
4637
 
4638
Stub_factory::Stub_factory()
4639
{
4640
  // The instruction template sequences are declared as static
4641
  // objects and initialized first time the constructor runs.
4642
 
4643
  // Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
4644
  // to reach the stub if necessary.
4645
  static const Insn_template elf32_arm_stub_long_branch_any_any[] =
4646
    {
4647
      Insn_template::arm_insn(0xe51ff004),      // ldr   pc, [pc, #-4]
4648
      Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4649
                                                // dcd   R_ARM_ABS32(X)
4650
    };
4651
 
4652
  // V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
4653
  // available.
4654
  static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb[] =
4655
    {
4656
      Insn_template::arm_insn(0xe59fc000),      // ldr   ip, [pc, #0]
4657
      Insn_template::arm_insn(0xe12fff1c),      // bx    ip
4658
      Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4659
                                                // dcd   R_ARM_ABS32(X)
4660
    };
4661
 
4662
  // Thumb -> Thumb long branch stub. Used on M-profile architectures.
4663
  static const Insn_template elf32_arm_stub_long_branch_thumb_only[] =
4664
    {
4665
      Insn_template::thumb16_insn(0xb401),      // push {r0}
4666
      Insn_template::thumb16_insn(0x4802),      // ldr  r0, [pc, #8]
4667
      Insn_template::thumb16_insn(0x4684),      // mov  ip, r0
4668
      Insn_template::thumb16_insn(0xbc01),      // pop  {r0}
4669
      Insn_template::thumb16_insn(0x4760),      // bx   ip
4670
      Insn_template::thumb16_insn(0xbf00),      // nop
4671
      Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4672
                                                // dcd  R_ARM_ABS32(X)
4673
    };
4674
 
4675
  // V4T Thumb -> Thumb long branch stub. Using the stack is not
4676
  // allowed.
4677
  static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb[] =
4678
    {
4679
      Insn_template::thumb16_insn(0x4778),      // bx   pc
4680
      Insn_template::thumb16_insn(0x46c0),      // nop
4681
      Insn_template::arm_insn(0xe59fc000),      // ldr  ip, [pc, #0]
4682
      Insn_template::arm_insn(0xe12fff1c),      // bx   ip
4683
      Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4684
                                                // dcd  R_ARM_ABS32(X)
4685
    };
4686
 
4687
  // V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
4688
  // available.
4689
  static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm[] =
4690
    {
4691
      Insn_template::thumb16_insn(0x4778),      // bx   pc
4692
      Insn_template::thumb16_insn(0x46c0),      // nop
4693
      Insn_template::arm_insn(0xe51ff004),      // ldr   pc, [pc, #-4]
4694
      Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4695
                                                // dcd   R_ARM_ABS32(X)
4696
    };
4697
 
4698
  // V4T Thumb -> ARM short branch stub. Shorter variant of the above
4699
  // one, when the destination is close enough.
4700
  static const Insn_template elf32_arm_stub_short_branch_v4t_thumb_arm[] =
4701
    {
4702
      Insn_template::thumb16_insn(0x4778),              // bx   pc
4703
      Insn_template::thumb16_insn(0x46c0),              // nop
4704
      Insn_template::arm_rel_insn(0xea000000, -8),      // b    (X-8)
4705
    };
4706
 
4707
  // ARM/Thumb -> ARM long branch stub, PIC.  On V5T and above, use
4708
  // blx to reach the stub if necessary.
4709
  static const Insn_template elf32_arm_stub_long_branch_any_arm_pic[] =
4710
    {
4711
      Insn_template::arm_insn(0xe59fc000),      // ldr   r12, [pc]
4712
      Insn_template::arm_insn(0xe08ff00c),      // add   pc, pc, ip
4713
      Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
4714
                                                // dcd   R_ARM_REL32(X-4)
4715
    };
4716
 
4717
  // ARM/Thumb -> Thumb long branch stub, PIC.  On V5T and above, use
4718
  // blx to reach the stub if necessary.  We can not add into pc;
4719
  // it is not guaranteed to mode switch (different in ARMv6 and
4720
  // ARMv7).
4721
  static const Insn_template elf32_arm_stub_long_branch_any_thumb_pic[] =
4722
    {
4723
      Insn_template::arm_insn(0xe59fc004),      // ldr   r12, [pc, #4]
4724
      Insn_template::arm_insn(0xe08fc00c),      // add   ip, pc, ip
4725
      Insn_template::arm_insn(0xe12fff1c),      // bx    ip
4726
      Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4727
                                                // dcd   R_ARM_REL32(X)
4728
    };
4729
 
4730
  // V4T ARM -> ARM long branch stub, PIC.
4731
  static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb_pic[] =
4732
    {
4733
      Insn_template::arm_insn(0xe59fc004),      // ldr   ip, [pc, #4]
4734
      Insn_template::arm_insn(0xe08fc00c),      // add   ip, pc, ip
4735
      Insn_template::arm_insn(0xe12fff1c),      // bx    ip
4736
      Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4737
                                                // dcd   R_ARM_REL32(X)
4738
    };
4739
 
4740
  // V4T Thumb -> ARM long branch stub, PIC.
4741
  static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm_pic[] =
4742
    {
4743
      Insn_template::thumb16_insn(0x4778),      // bx   pc
4744
      Insn_template::thumb16_insn(0x46c0),      // nop
4745
      Insn_template::arm_insn(0xe59fc000),      // ldr  ip, [pc, #0]
4746
      Insn_template::arm_insn(0xe08cf00f),      // add  pc, ip, pc
4747
      Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
4748
                                                // dcd  R_ARM_REL32(X)
4749
    };
4750
 
4751
  // Thumb -> Thumb long branch stub, PIC. Used on M-profile
4752
  // architectures.
4753
  static const Insn_template elf32_arm_stub_long_branch_thumb_only_pic[] =
4754
    {
4755
      Insn_template::thumb16_insn(0xb401),      // push {r0}
4756
      Insn_template::thumb16_insn(0x4802),      // ldr  r0, [pc, #8]
4757
      Insn_template::thumb16_insn(0x46fc),      // mov  ip, pc
4758
      Insn_template::thumb16_insn(0x4484),      // add  ip, r0
4759
      Insn_template::thumb16_insn(0xbc01),      // pop  {r0}
4760
      Insn_template::thumb16_insn(0x4760),      // bx   ip
4761
      Insn_template::data_word(0, elfcpp::R_ARM_REL32, 4),
4762
                                                // dcd  R_ARM_REL32(X)
4763
    };
4764
 
4765
  // V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
4766
  // allowed.
4767
  static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb_pic[] =
4768
    {
4769
      Insn_template::thumb16_insn(0x4778),      // bx   pc
4770
      Insn_template::thumb16_insn(0x46c0),      // nop
4771
      Insn_template::arm_insn(0xe59fc004),      // ldr  ip, [pc, #4]
4772
      Insn_template::arm_insn(0xe08fc00c),      // add   ip, pc, ip
4773
      Insn_template::arm_insn(0xe12fff1c),      // bx   ip
4774
      Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4775
                                                // dcd  R_ARM_REL32(X)
4776
    };
4777
 
4778
  // Cortex-A8 erratum-workaround stubs.
4779
 
4780
  // Stub used for conditional branches (which may be beyond +/-1MB away,
4781
  // so we can't use a conditional branch to reach this stub).
4782
 
4783
  // original code:
4784
  //
4785
  //    b<cond> X
4786
  // after:
4787
  //
4788
  static const Insn_template elf32_arm_stub_a8_veneer_b_cond[] =
4789
    {
4790
      Insn_template::thumb16_bcond_insn(0xd001),        //      b<cond>.n true
4791
      Insn_template::thumb32_b_insn(0xf000b800, -4),    //      b.w after
4792
      Insn_template::thumb32_b_insn(0xf000b800, -4)     // true:
4793
                                                        //      b.w X
4794
    };
4795
 
4796
  // Stub used for b.w and bl.w instructions.
4797
 
4798
  static const Insn_template elf32_arm_stub_a8_veneer_b[] =
4799
    {
4800
      Insn_template::thumb32_b_insn(0xf000b800, -4)     // b.w dest
4801
    };
4802
 
4803
  static const Insn_template elf32_arm_stub_a8_veneer_bl[] =
4804
    {
4805
      Insn_template::thumb32_b_insn(0xf000b800, -4)     // b.w dest
4806
    };
4807
 
4808
  // Stub used for Thumb-2 blx.w instructions.  We modified the original blx.w
4809
  // instruction (which switches to ARM mode) to point to this stub.  Jump to
4810
  // the real destination using an ARM-mode branch.
4811
  static const Insn_template elf32_arm_stub_a8_veneer_blx[] =
4812
    {
4813
      Insn_template::arm_rel_insn(0xea000000, -8)       // b dest
4814
    };
4815
 
4816
  // Stub used to provide an interworking for R_ARM_V4BX relocation
4817
  // (bx r[n] instruction).
4818
  static const Insn_template elf32_arm_stub_v4_veneer_bx[] =
4819
    {
4820
      Insn_template::arm_insn(0xe3100001),              // tst   r<n>, #1
4821
      Insn_template::arm_insn(0x01a0f000),              // moveq pc, r<n>
4822
      Insn_template::arm_insn(0xe12fff10)               // bx    r<n>
4823
    };
4824
 
4825
  // Fill in the stub template look-up table.  Stub templates are constructed
4826
  // per instance of Stub_factory for fast look-up without locking
4827
  // in a thread-enabled environment.
4828
 
4829
  this->stub_templates_[arm_stub_none] =
4830
    new Stub_template(arm_stub_none, NULL, 0);
4831
 
4832
#define DEF_STUB(x)     \
4833
  do \
4834
    { \
4835
      size_t array_size \
4836
        = sizeof(elf32_arm_stub_##x) / sizeof(elf32_arm_stub_##x[0]); \
4837
      Stub_type type = arm_stub_##x; \
4838
      this->stub_templates_[type] = \
4839
        new Stub_template(type, elf32_arm_stub_##x, array_size); \
4840
    } \
4841
  while (0);
4842
 
4843
  DEF_STUBS
4844
#undef DEF_STUB
4845
}
4846
 
4847
// Stub_table methods.
4848
 
4849
// Remove all Cortex-A8 stub.
4850
 
4851
template<bool big_endian>
4852
void
4853
Stub_table<big_endian>::remove_all_cortex_a8_stubs()
4854
{
4855
  for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
4856
       p != this->cortex_a8_stubs_.end();
4857
       ++p)
4858
    delete p->second;
4859
  this->cortex_a8_stubs_.clear();
4860
}
4861
 
4862
// Relocate one stub.  This is a helper for Stub_table::relocate_stubs().
4863
 
4864
template<bool big_endian>
4865
void
4866
Stub_table<big_endian>::relocate_stub(
4867
    Stub* stub,
4868
    const Relocate_info<32, big_endian>* relinfo,
4869
    Target_arm<big_endian>* arm_target,
4870
    Output_section* output_section,
4871
    unsigned char* view,
4872
    Arm_address address,
4873
    section_size_type view_size)
4874
{
4875
  const Stub_template* stub_template = stub->stub_template();
4876
  if (stub_template->reloc_count() != 0)
4877
    {
4878
      // Adjust view to cover the stub only.
4879
      section_size_type offset = stub->offset();
4880
      section_size_type stub_size = stub_template->size();
4881
      gold_assert(offset + stub_size <= view_size);
4882
 
4883
      arm_target->relocate_stub(stub, relinfo, output_section, view + offset,
4884
                                address + offset, stub_size);
4885
    }
4886
}
4887
 
4888
// Relocate all stubs in this stub table.
4889
 
4890
template<bool big_endian>
4891
void
4892
Stub_table<big_endian>::relocate_stubs(
4893
    const Relocate_info<32, big_endian>* relinfo,
4894
    Target_arm<big_endian>* arm_target,
4895
    Output_section* output_section,
4896
    unsigned char* view,
4897
    Arm_address address,
4898
    section_size_type view_size)
4899
{
4900
  // If we are passed a view bigger than the stub table's.  we need to
4901
  // adjust the view.
4902
  gold_assert(address == this->address()
4903
              && (view_size
4904
                  == static_cast<section_size_type>(this->data_size())));
4905
 
4906
  // Relocate all relocation stubs.
4907
  for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
4908
      p != this->reloc_stubs_.end();
4909
      ++p)
4910
    this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
4911
                        address, view_size);
4912
 
4913
  // Relocate all Cortex-A8 stubs.
4914
  for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
4915
       p != this->cortex_a8_stubs_.end();
4916
       ++p)
4917
    this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
4918
                        address, view_size);
4919
 
4920
  // Relocate all ARM V4BX stubs.
4921
  for (Arm_v4bx_stub_list::iterator p = this->arm_v4bx_stubs_.begin();
4922
       p != this->arm_v4bx_stubs_.end();
4923
       ++p)
4924
    {
4925
      if (*p != NULL)
4926
        this->relocate_stub(*p, relinfo, arm_target, output_section, view,
4927
                            address, view_size);
4928
    }
4929
}
4930
 
4931
// Write out the stubs to file.
4932
 
4933
template<bool big_endian>
4934
void
4935
Stub_table<big_endian>::do_write(Output_file* of)
4936
{
4937
  off_t offset = this->offset();
4938
  const section_size_type oview_size =
4939
    convert_to_section_size_type(this->data_size());
4940
  unsigned char* const oview = of->get_output_view(offset, oview_size);
4941
 
4942
  // Write relocation stubs.
4943
  for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
4944
      p != this->reloc_stubs_.end();
4945
      ++p)
4946
    {
4947
      Reloc_stub* stub = p->second;
4948
      Arm_address address = this->address() + stub->offset();
4949
      gold_assert(address
4950
                  == align_address(address,
4951
                                   stub->stub_template()->alignment()));
4952
      stub->write(oview + stub->offset(), stub->stub_template()->size(),
4953
                  big_endian);
4954
    }
4955
 
4956
  // Write Cortex-A8 stubs.
4957
  for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
4958
       p != this->cortex_a8_stubs_.end();
4959
       ++p)
4960
    {
4961
      Cortex_a8_stub* stub = p->second;
4962
      Arm_address address = this->address() + stub->offset();
4963
      gold_assert(address
4964
                  == align_address(address,
4965
                                   stub->stub_template()->alignment()));
4966
      stub->write(oview + stub->offset(), stub->stub_template()->size(),
4967
                  big_endian);
4968
    }
4969
 
4970
  // Write ARM V4BX relocation stubs.
4971
  for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
4972
       p != this->arm_v4bx_stubs_.end();
4973
       ++p)
4974
    {
4975
      if (*p == NULL)
4976
        continue;
4977
 
4978
      Arm_address address = this->address() + (*p)->offset();
4979
      gold_assert(address
4980
                  == align_address(address,
4981
                                   (*p)->stub_template()->alignment()));
4982
      (*p)->write(oview + (*p)->offset(), (*p)->stub_template()->size(),
4983
                  big_endian);
4984
    }
4985
 
4986
  of->write_output_view(this->offset(), oview_size, oview);
4987
}
4988
 
4989
// Update the data size and address alignment of the stub table at the end
4990
// of a relaxation pass.   Return true if either the data size or the
4991
// alignment changed in this relaxation pass.
4992
 
4993
template<bool big_endian>
4994
bool
4995
Stub_table<big_endian>::update_data_size_and_addralign()
4996
{
4997
  // Go over all stubs in table to compute data size and address alignment.
4998
  off_t size = this->reloc_stubs_size_;
4999
  unsigned addralign = this->reloc_stubs_addralign_;
5000
 
5001
  for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
5002
       p != this->cortex_a8_stubs_.end();
5003
       ++p)
5004
    {
5005
      const Stub_template* stub_template = p->second->stub_template();
5006
      addralign = std::max(addralign, stub_template->alignment());
5007
      size = (align_address(size, stub_template->alignment())
5008
              + stub_template->size());
5009
    }
5010
 
5011
  for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
5012
       p != this->arm_v4bx_stubs_.end();
5013
       ++p)
5014
    {
5015
      if (*p == NULL)
5016
        continue;
5017
 
5018
      const Stub_template* stub_template = (*p)->stub_template();
5019
      addralign = std::max(addralign, stub_template->alignment());
5020
      size = (align_address(size, stub_template->alignment())
5021
              + stub_template->size());
5022
    }
5023
 
5024
  // Check if either data size or alignment changed in this pass.
5025
  // Update prev_data_size_ and prev_addralign_.  These will be used
5026
  // as the current data size and address alignment for the next pass.
5027
  bool changed = size != this->prev_data_size_;
5028
  this->prev_data_size_ = size;
5029
 
5030
  if (addralign != this->prev_addralign_)
5031
    changed = true;
5032
  this->prev_addralign_ = addralign;
5033
 
5034
  return changed;
5035
}
5036
 
5037
// Finalize the stubs.  This sets the offsets of the stubs within the stub
5038
// table.  It also marks all input sections needing Cortex-A8 workaround.
5039
 
5040
template<bool big_endian>
5041
void
5042
Stub_table<big_endian>::finalize_stubs()
5043
{
5044
  off_t off = this->reloc_stubs_size_;
5045
  for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
5046
       p != this->cortex_a8_stubs_.end();
5047
       ++p)
5048
    {
5049
      Cortex_a8_stub* stub = p->second;
5050
      const Stub_template* stub_template = stub->stub_template();
5051
      uint64_t stub_addralign = stub_template->alignment();
5052
      off = align_address(off, stub_addralign);
5053
      stub->set_offset(off);
5054
      off += stub_template->size();
5055
 
5056
      // Mark input section so that we can determine later if a code section
5057
      // needs the Cortex-A8 workaround quickly.
5058
      Arm_relobj<big_endian>* arm_relobj =
5059
        Arm_relobj<big_endian>::as_arm_relobj(stub->relobj());
5060
      arm_relobj->mark_section_for_cortex_a8_workaround(stub->shndx());
5061
    }
5062
 
5063
  for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
5064
      p != this->arm_v4bx_stubs_.end();
5065
      ++p)
5066
    {
5067
      if (*p == NULL)
5068
        continue;
5069
 
5070
      const Stub_template* stub_template = (*p)->stub_template();
5071
      uint64_t stub_addralign = stub_template->alignment();
5072
      off = align_address(off, stub_addralign);
5073
      (*p)->set_offset(off);
5074
      off += stub_template->size();
5075
    }
5076
 
5077
  gold_assert(off <= this->prev_data_size_);
5078
}
5079
 
5080
// Apply Cortex-A8 workaround to an address range between VIEW_ADDRESS
5081
// and VIEW_ADDRESS + VIEW_SIZE - 1.  VIEW points to the mapped address
5082
// of the address range seen by the linker.
5083
 
5084
template<bool big_endian>
5085
void
5086
Stub_table<big_endian>::apply_cortex_a8_workaround_to_address_range(
5087
    Target_arm<big_endian>* arm_target,
5088
    unsigned char* view,
5089
    Arm_address view_address,
5090
    section_size_type view_size)
5091
{
5092
  // Cortex-A8 stubs are sorted by addresses of branches being fixed up.
5093
  for (Cortex_a8_stub_list::const_iterator p =
5094
         this->cortex_a8_stubs_.lower_bound(view_address);
5095
       ((p != this->cortex_a8_stubs_.end())
5096
        && (p->first < (view_address + view_size)));
5097
       ++p)
5098
    {
5099
      // We do not store the THUMB bit in the LSB of either the branch address
5100
      // or the stub offset.  There is no need to strip the LSB.
5101
      Arm_address branch_address = p->first;
5102
      const Cortex_a8_stub* stub = p->second;
5103
      Arm_address stub_address = this->address() + stub->offset();
5104
 
5105
      // Offset of the branch instruction relative to this view.
5106
      section_size_type offset =
5107
        convert_to_section_size_type(branch_address - view_address);
5108
      gold_assert((offset + 4) <= view_size);
5109
 
5110
      arm_target->apply_cortex_a8_workaround(stub, stub_address,
5111
                                             view + offset, branch_address);
5112
    }
5113
}
5114
 
5115
// Arm_input_section methods.
5116
 
5117
// Initialize an Arm_input_section.
5118
 
5119
template<bool big_endian>
5120
void
5121
Arm_input_section<big_endian>::init()
5122
{
5123
  Relobj* relobj = this->relobj();
5124
  unsigned int shndx = this->shndx();
5125
 
5126
  // We have to cache original size, alignment and contents to avoid locking
5127
  // the original file.
5128
  this->original_addralign_ =
5129
    convert_types<uint32_t, uint64_t>(relobj->section_addralign(shndx));
5130
 
5131
  // This is not efficient but we expect only a small number of relaxed
5132
  // input sections for stubs.
5133
  section_size_type section_size;
5134
  const unsigned char* section_contents =
5135
    relobj->section_contents(shndx, &section_size, false);
5136
  this->original_size_ =
5137
    convert_types<uint32_t, uint64_t>(relobj->section_size(shndx));
5138
 
5139
  gold_assert(this->original_contents_ == NULL);
5140
  this->original_contents_ = new unsigned char[section_size];
5141
  memcpy(this->original_contents_, section_contents, section_size);
5142
 
5143
  // We want to make this look like the original input section after
5144
  // output sections are finalized.
5145
  Output_section* os = relobj->output_section(shndx);
5146
  off_t offset = relobj->output_section_offset(shndx);
5147
  gold_assert(os != NULL && !relobj->is_output_section_offset_invalid(shndx));
5148
  this->set_address(os->address() + offset);
5149
  this->set_file_offset(os->offset() + offset);
5150
 
5151
  this->set_current_data_size(this->original_size_);
5152
  this->finalize_data_size();
5153
}
5154
 
5155
template<bool big_endian>
5156
void
5157
Arm_input_section<big_endian>::do_write(Output_file* of)
5158
{
5159
  // We have to write out the original section content.
5160
  gold_assert(this->original_contents_ != NULL);
5161
  of->write(this->offset(), this->original_contents_,
5162
            this->original_size_);
5163
 
5164
  // If this owns a stub table and it is not empty, write it.
5165
  if (this->is_stub_table_owner() && !this->stub_table_->empty())
5166
    this->stub_table_->write(of);
5167
}
5168
 
5169
// Finalize data size.
5170
 
5171
template<bool big_endian>
5172
void
5173
Arm_input_section<big_endian>::set_final_data_size()
5174
{
5175
  off_t off = convert_types<off_t, uint64_t>(this->original_size_);
5176
 
5177
  if (this->is_stub_table_owner())
5178
    {
5179
      this->stub_table_->finalize_data_size();
5180
      off = align_address(off, this->stub_table_->addralign());
5181
      off += this->stub_table_->data_size();
5182
    }
5183
  this->set_data_size(off);
5184
}
5185
 
5186
// Reset address and file offset.
5187
 
5188
template<bool big_endian>
5189
void
5190
Arm_input_section<big_endian>::do_reset_address_and_file_offset()
5191
{
5192
  // Size of the original input section contents.
5193
  off_t off = convert_types<off_t, uint64_t>(this->original_size_);
5194
 
5195
  // If this is a stub table owner, account for the stub table size.
5196
  if (this->is_stub_table_owner())
5197
    {
5198
      Stub_table<big_endian>* stub_table = this->stub_table_;
5199
 
5200
      // Reset the stub table's address and file offset.  The
5201
      // current data size for child will be updated after that.
5202
      stub_table_->reset_address_and_file_offset();
5203
      off = align_address(off, stub_table_->addralign());
5204
      off += stub_table->current_data_size();
5205
    }
5206
 
5207
  this->set_current_data_size(off);
5208
}
5209
 
5210
// Arm_exidx_cantunwind methods.
5211
 
5212
// Write this to Output file OF for a fixed endianness.
5213
 
5214
template<bool big_endian>
5215
void
5216
Arm_exidx_cantunwind::do_fixed_endian_write(Output_file* of)
5217
{
5218
  off_t offset = this->offset();
5219
  const section_size_type oview_size = 8;
5220
  unsigned char* const oview = of->get_output_view(offset, oview_size);
5221
 
5222 159 khays
  typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
5223 27 khays
 
5224
  Output_section* os = this->relobj_->output_section(this->shndx_);
5225
  gold_assert(os != NULL);
5226
 
5227
  Arm_relobj<big_endian>* arm_relobj =
5228
    Arm_relobj<big_endian>::as_arm_relobj(this->relobj_);
5229
  Arm_address output_offset =
5230
    arm_relobj->get_output_section_offset(this->shndx_);
5231
  Arm_address section_start;
5232
  section_size_type section_size;
5233
 
5234
  // Find out the end of the text section referred by this.
5235
  if (output_offset != Arm_relobj<big_endian>::invalid_address)
5236
    {
5237
      section_start = os->address() + output_offset;
5238
      const Arm_exidx_input_section* exidx_input_section =
5239
        arm_relobj->exidx_input_section_by_link(this->shndx_);
5240
      gold_assert(exidx_input_section != NULL);
5241
      section_size =
5242
        convert_to_section_size_type(exidx_input_section->text_size());
5243
    }
5244
  else
5245
    {
5246
      // Currently this only happens for a relaxed section.
5247
      const Output_relaxed_input_section* poris =
5248
        os->find_relaxed_input_section(this->relobj_, this->shndx_);
5249
      gold_assert(poris != NULL);
5250
      section_start = poris->address();
5251
      section_size = convert_to_section_size_type(poris->data_size());
5252
    }
5253
 
5254
  // We always append this to the end of an EXIDX section.
5255
  Arm_address output_address = section_start + section_size;
5256
 
5257
  // Write out the entry.  The first word either points to the beginning
5258
  // or after the end of a text section.  The second word is the special
5259
  // EXIDX_CANTUNWIND value.
5260
  uint32_t prel31_offset = output_address - this->address();
5261
  if (utils::has_overflow<31>(offset))
5262
    gold_error(_("PREL31 overflow in EXIDX_CANTUNWIND entry"));
5263 159 khays
  elfcpp::Swap_unaligned<32, big_endian>::writeval(oview,
5264
                                                   prel31_offset & 0x7fffffffU);
5265
  elfcpp::Swap_unaligned<32, big_endian>::writeval(oview + 4,
5266
                                                   elfcpp::EXIDX_CANTUNWIND);
5267 27 khays
 
5268
  of->write_output_view(this->offset(), oview_size, oview);
5269
}
5270
 
5271
// Arm_exidx_merged_section methods.
5272
 
5273
// Constructor for Arm_exidx_merged_section.
5274
// EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
5275
// SECTION_OFFSET_MAP points to a section offset map describing how
5276
// parts of the input section are mapped to output.  DELETED_BYTES is
5277
// the number of bytes deleted from the EXIDX input section.
5278
 
5279
Arm_exidx_merged_section::Arm_exidx_merged_section(
5280
    const Arm_exidx_input_section& exidx_input_section,
5281
    const Arm_exidx_section_offset_map& section_offset_map,
5282
    uint32_t deleted_bytes)
5283
  : Output_relaxed_input_section(exidx_input_section.relobj(),
5284
                                 exidx_input_section.shndx(),
5285
                                 exidx_input_section.addralign()),
5286
    exidx_input_section_(exidx_input_section),
5287
    section_offset_map_(section_offset_map)
5288
{
5289
  // If we retain or discard the whole EXIDX input section,  we would
5290
  // not be here.
5291
  gold_assert(deleted_bytes != 0
5292
              && deleted_bytes != this->exidx_input_section_.size());
5293
 
5294
  // Fix size here so that we do not need to implement set_final_data_size.
5295
  uint32_t size = exidx_input_section.size() - deleted_bytes;
5296
  this->set_data_size(size);
5297
  this->fix_data_size();
5298
 
5299
  // Allocate buffer for section contents and build contents.
5300
  this->section_contents_ = new unsigned char[size];
5301
}
5302
 
5303
// Build the contents of a merged EXIDX output section.
5304
 
5305
void
5306
Arm_exidx_merged_section::build_contents(
5307
    const unsigned char* original_contents,
5308
    section_size_type original_size)
5309
{
5310
  // Go over spans of input offsets and write only those that are not
5311
  // discarded.
5312
  section_offset_type in_start = 0;
5313
  section_offset_type out_start = 0;
5314
  section_offset_type in_max =
5315
    convert_types<section_offset_type>(original_size);
5316
  section_offset_type out_max =
5317
    convert_types<section_offset_type>(this->data_size());
5318
  for (Arm_exidx_section_offset_map::const_iterator p =
5319
        this->section_offset_map_.begin();
5320
      p != this->section_offset_map_.end();
5321
      ++p)
5322
    {
5323
      section_offset_type in_end = p->first;
5324
      gold_assert(in_end >= in_start);
5325
      section_offset_type out_end = p->second;
5326
      size_t in_chunk_size = convert_types<size_t>(in_end - in_start + 1);
5327
      if (out_end != -1)
5328
        {
5329
          size_t out_chunk_size =
5330
            convert_types<size_t>(out_end - out_start + 1);
5331
 
5332
          gold_assert(out_chunk_size == in_chunk_size
5333
                      && in_end < in_max && out_end < out_max);
5334
 
5335
          memcpy(this->section_contents_ + out_start,
5336
                 original_contents + in_start,
5337
                 out_chunk_size);
5338
          out_start += out_chunk_size;
5339
        }
5340
      in_start += in_chunk_size;
5341
    }
5342
}
5343
 
5344
// Given an input OBJECT, an input section index SHNDX within that
5345
// object, and an OFFSET relative to the start of that input
5346
// section, return whether or not the corresponding offset within
5347
// the output section is known.  If this function returns true, it
5348
// sets *POUTPUT to the output offset.  The value -1 indicates that
5349
// this input offset is being discarded.
5350
 
5351
bool
5352
Arm_exidx_merged_section::do_output_offset(
5353
    const Relobj* relobj,
5354
    unsigned int shndx,
5355
    section_offset_type offset,
5356
    section_offset_type* poutput) const
5357
{
5358
  // We only handle offsets for the original EXIDX input section.
5359
  if (relobj != this->exidx_input_section_.relobj()
5360
      || shndx != this->exidx_input_section_.shndx())
5361
    return false;
5362
 
5363
  section_offset_type section_size =
5364
    convert_types<section_offset_type>(this->exidx_input_section_.size());
5365
  if (offset < 0 || offset >= section_size)
5366
    // Input offset is out of valid range.
5367
    *poutput = -1;
5368
  else
5369
    {
5370
      // We need to look up the section offset map to determine the output
5371
      // offset.  Find the reference point in map that is first offset
5372
      // bigger than or equal to this offset.
5373
      Arm_exidx_section_offset_map::const_iterator p =
5374
        this->section_offset_map_.lower_bound(offset);
5375
 
5376
      // The section offset maps are build such that this should not happen if
5377
      // input offset is in the valid range.
5378
      gold_assert(p != this->section_offset_map_.end());
5379
 
5380
      // We need to check if this is dropped.
5381
     section_offset_type ref = p->first;
5382
     section_offset_type mapped_ref = p->second;
5383
 
5384
      if (mapped_ref != Arm_exidx_input_section::invalid_offset)
5385
        // Offset is present in output.
5386
        *poutput = mapped_ref + (offset - ref);
5387
      else
5388
        // Offset is discarded owing to EXIDX entry merging.
5389
        *poutput = -1;
5390
    }
5391
 
5392
  return true;
5393
}
5394
 
5395
// Write this to output file OF.
5396
 
5397
void
5398
Arm_exidx_merged_section::do_write(Output_file* of)
5399
{
5400
  off_t offset = this->offset();
5401
  const section_size_type oview_size = this->data_size();
5402
  unsigned char* const oview = of->get_output_view(offset, oview_size);
5403
 
5404
  Output_section* os = this->relobj()->output_section(this->shndx());
5405
  gold_assert(os != NULL);
5406
 
5407
  memcpy(oview, this->section_contents_, oview_size);
5408
  of->write_output_view(this->offset(), oview_size, oview);
5409
}
5410
 
5411
// Arm_exidx_fixup methods.
5412
 
5413
// Append an EXIDX_CANTUNWIND in the current output section if the last entry
5414
// is not an EXIDX_CANTUNWIND entry already.  The new EXIDX_CANTUNWIND entry
5415
// points to the end of the last seen EXIDX section.
5416
 
5417
void
5418
Arm_exidx_fixup::add_exidx_cantunwind_as_needed()
5419
{
5420
  if (this->last_unwind_type_ != UT_EXIDX_CANTUNWIND
5421
      && this->last_input_section_ != NULL)
5422
    {
5423
      Relobj* relobj = this->last_input_section_->relobj();
5424
      unsigned int text_shndx = this->last_input_section_->link();
5425
      Arm_exidx_cantunwind* cantunwind =
5426
        new Arm_exidx_cantunwind(relobj, text_shndx);
5427
      this->exidx_output_section_->add_output_section_data(cantunwind);
5428
      this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5429
    }
5430
}
5431
 
5432
// Process an EXIDX section entry in input.  Return whether this entry
5433
// can be deleted in the output.  SECOND_WORD in the second word of the
5434
// EXIDX entry.
5435
 
5436
bool
5437
Arm_exidx_fixup::process_exidx_entry(uint32_t second_word)
5438
{
5439
  bool delete_entry;
5440
  if (second_word == elfcpp::EXIDX_CANTUNWIND)
5441
    {
5442
      // Merge if previous entry is also an EXIDX_CANTUNWIND.
5443
      delete_entry = this->last_unwind_type_ == UT_EXIDX_CANTUNWIND;
5444
      this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5445
    }
5446
  else if ((second_word & 0x80000000) != 0)
5447
    {
5448
      // Inlined unwinding data.  Merge if equal to previous.
5449
      delete_entry = (merge_exidx_entries_
5450
                      && this->last_unwind_type_ == UT_INLINED_ENTRY
5451
                      && this->last_inlined_entry_ == second_word);
5452
      this->last_unwind_type_ = UT_INLINED_ENTRY;
5453
      this->last_inlined_entry_ = second_word;
5454
    }
5455
  else
5456
    {
5457
      // Normal table entry.  In theory we could merge these too,
5458
      // but duplicate entries are likely to be much less common.
5459
      delete_entry = false;
5460
      this->last_unwind_type_ = UT_NORMAL_ENTRY;
5461
    }
5462
  return delete_entry;
5463
}
5464
 
5465
// Update the current section offset map during EXIDX section fix-up.
5466
// If there is no map, create one.  INPUT_OFFSET is the offset of a
5467
// reference point, DELETED_BYTES is the number of deleted by in the
5468
// section so far.  If DELETE_ENTRY is true, the reference point and
5469
// all offsets after the previous reference point are discarded.
5470
 
5471
void
5472
Arm_exidx_fixup::update_offset_map(
5473
    section_offset_type input_offset,
5474
    section_size_type deleted_bytes,
5475
    bool delete_entry)
5476
{
5477
  if (this->section_offset_map_ == NULL)
5478
    this->section_offset_map_ = new Arm_exidx_section_offset_map();
5479
  section_offset_type output_offset;
5480
  if (delete_entry)
5481
    output_offset = Arm_exidx_input_section::invalid_offset;
5482
  else
5483
    output_offset = input_offset - deleted_bytes;
5484
  (*this->section_offset_map_)[input_offset] = output_offset;
5485
}
5486
 
5487
// Process EXIDX_INPUT_SECTION for EXIDX entry merging.  Return the number of
5488
// bytes deleted.  SECTION_CONTENTS points to the contents of the EXIDX
5489
// section and SECTION_SIZE is the number of bytes pointed by SECTION_CONTENTS.
5490
// If some entries are merged, also store a pointer to a newly created
5491
// Arm_exidx_section_offset_map object in *PSECTION_OFFSET_MAP.  The caller
5492
// owns the map and is responsible for releasing it after use.
5493
 
5494
template<bool big_endian>
5495
uint32_t
5496
Arm_exidx_fixup::process_exidx_section(
5497
    const Arm_exidx_input_section* exidx_input_section,
5498
    const unsigned char* section_contents,
5499
    section_size_type section_size,
5500
    Arm_exidx_section_offset_map** psection_offset_map)
5501
{
5502
  Relobj* relobj = exidx_input_section->relobj();
5503
  unsigned shndx = exidx_input_section->shndx();
5504
 
5505
  if ((section_size % 8) != 0)
5506
    {
5507
      // Something is wrong with this section.  Better not touch it.
5508
      gold_error(_("uneven .ARM.exidx section size in %s section %u"),
5509
                 relobj->name().c_str(), shndx);
5510
      this->last_input_section_ = exidx_input_section;
5511
      this->last_unwind_type_ = UT_NONE;
5512
      return 0;
5513
    }
5514
 
5515
  uint32_t deleted_bytes = 0;
5516
  bool prev_delete_entry = false;
5517
  gold_assert(this->section_offset_map_ == NULL);
5518
 
5519
  for (section_size_type i = 0; i < section_size; i += 8)
5520
    {
5521
      typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
5522
      const Valtype* wv =
5523
          reinterpret_cast<const Valtype*>(section_contents + i + 4);
5524
      uint32_t second_word = elfcpp::Swap<32, big_endian>::readval(wv);
5525
 
5526
      bool delete_entry = this->process_exidx_entry(second_word);
5527
 
5528
      // Entry deletion causes changes in output offsets.  We use a std::map
5529
      // to record these.  And entry (x, y) means input offset x
5530
      // is mapped to output offset y.  If y is invalid_offset, then x is
5531
      // dropped in the output.  Because of the way std::map::lower_bound
5532
      // works, we record the last offset in a region w.r.t to keeping or
5533
      // dropping.  If there is no entry (x0, y0) for an input offset x0,
5534
      // the output offset y0 of it is determined by the output offset y1 of
5535
      // the smallest input offset x1 > x0 that there is an (x1, y1) entry
5536
      // in the map.  If y1 is not -1, then y0 = y1 + x0 - x1.  Otherwise, y1
5537
      // y0 is also -1.
5538
      if (delete_entry != prev_delete_entry && i != 0)
5539
        this->update_offset_map(i - 1, deleted_bytes, prev_delete_entry);
5540
 
5541
      // Update total deleted bytes for this entry.
5542
      if (delete_entry)
5543
        deleted_bytes += 8;
5544
 
5545
      prev_delete_entry = delete_entry;
5546
    }
5547
 
5548
  // If section offset map is not NULL, make an entry for the end of
5549
  // section.
5550
  if (this->section_offset_map_ != NULL)
5551
    update_offset_map(section_size - 1, deleted_bytes, prev_delete_entry);
5552
 
5553
  *psection_offset_map = this->section_offset_map_;
5554
  this->section_offset_map_ = NULL;
5555
  this->last_input_section_ = exidx_input_section;
5556
 
5557
  // Set the first output text section so that we can link the EXIDX output
5558
  // section to it.  Ignore any EXIDX input section that is completely merged.
5559
  if (this->first_output_text_section_ == NULL
5560
      && deleted_bytes != section_size)
5561
    {
5562
      unsigned int link = exidx_input_section->link();
5563
      Output_section* os = relobj->output_section(link);
5564
      gold_assert(os != NULL);
5565
      this->first_output_text_section_ = os;
5566
    }
5567
 
5568
  return deleted_bytes;
5569
}
5570
 
5571
// Arm_output_section methods.
5572
 
5573
// Create a stub group for input sections from BEGIN to END.  OWNER
5574
// points to the input section to be the owner a new stub table.
5575
 
5576
template<bool big_endian>
5577
void
5578
Arm_output_section<big_endian>::create_stub_group(
5579
  Input_section_list::const_iterator begin,
5580
  Input_section_list::const_iterator end,
5581
  Input_section_list::const_iterator owner,
5582
  Target_arm<big_endian>* target,
5583
  std::vector<Output_relaxed_input_section*>* new_relaxed_sections,
5584
  const Task* task)
5585
{
5586
  // We use a different kind of relaxed section in an EXIDX section.
5587
  // The static casting from Output_relaxed_input_section to
5588
  // Arm_input_section is invalid in an EXIDX section.  We are okay
5589
  // because we should not be calling this for an EXIDX section. 
5590
  gold_assert(this->type() != elfcpp::SHT_ARM_EXIDX);
5591
 
5592
  // Currently we convert ordinary input sections into relaxed sections only
5593
  // at this point but we may want to support creating relaxed input section
5594
  // very early.  So we check here to see if owner is already a relaxed
5595
  // section.
5596
 
5597
  Arm_input_section<big_endian>* arm_input_section;
5598
  if (owner->is_relaxed_input_section())
5599
    {
5600
      arm_input_section =
5601
        Arm_input_section<big_endian>::as_arm_input_section(
5602
          owner->relaxed_input_section());
5603
    }
5604
  else
5605
    {
5606
      gold_assert(owner->is_input_section());
5607
      // Create a new relaxed input section.  We need to lock the original
5608
      // file.
5609
      Task_lock_obj<Object> tl(task, owner->relobj());
5610
      arm_input_section =
5611
        target->new_arm_input_section(owner->relobj(), owner->shndx());
5612
      new_relaxed_sections->push_back(arm_input_section);
5613
    }
5614
 
5615
  // Create a stub table.
5616
  Stub_table<big_endian>* stub_table =
5617
    target->new_stub_table(arm_input_section);
5618
 
5619
  arm_input_section->set_stub_table(stub_table);
5620
 
5621
  Input_section_list::const_iterator p = begin;
5622
  Input_section_list::const_iterator prev_p;
5623
 
5624
  // Look for input sections or relaxed input sections in [begin ... end].
5625
  do
5626
    {
5627
      if (p->is_input_section() || p->is_relaxed_input_section())
5628
        {
5629
          // The stub table information for input sections live
5630
          // in their objects.
5631
          Arm_relobj<big_endian>* arm_relobj =
5632
            Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
5633
          arm_relobj->set_stub_table(p->shndx(), stub_table);
5634
        }
5635
      prev_p = p++;
5636
    }
5637
  while (prev_p != end);
5638
}
5639
 
5640
// Group input sections for stub generation.  GROUP_SIZE is roughly the limit
5641
// of stub groups.  We grow a stub group by adding input section until the
5642
// size is just below GROUP_SIZE.  The last input section will be converted
5643
// into a stub table.  If STUB_ALWAYS_AFTER_BRANCH is false, we also add
5644
// input section after the stub table, effectively double the group size.
5645
// 
5646
// This is similar to the group_sections() function in elf32-arm.c but is
5647
// implemented differently.
5648
 
5649
template<bool big_endian>
5650
void
5651
Arm_output_section<big_endian>::group_sections(
5652
    section_size_type group_size,
5653
    bool stubs_always_after_branch,
5654
    Target_arm<big_endian>* target,
5655
    const Task* task)
5656
{
5657
  // We only care about sections containing code.
5658
  if ((this->flags() & elfcpp::SHF_EXECINSTR) == 0)
5659
    return;
5660
 
5661
  // States for grouping.
5662
  typedef enum
5663
  {
5664
    // No group is being built.
5665
    NO_GROUP,
5666
    // A group is being built but the stub table is not found yet.
5667
    // We keep group a stub group until the size is just under GROUP_SIZE.
5668
    // The last input section in the group will be used as the stub table.
5669
    FINDING_STUB_SECTION,
5670
    // A group is being built and we have already found a stub table.
5671
    // We enter this state to grow a stub group by adding input section
5672
    // after the stub table.  This effectively doubles the group size.
5673
    HAS_STUB_SECTION
5674
  } State;
5675
 
5676
  // Any newly created relaxed sections are stored here.
5677
  std::vector<Output_relaxed_input_section*> new_relaxed_sections;
5678
 
5679
  State state = NO_GROUP;
5680
  section_size_type off = 0;
5681
  section_size_type group_begin_offset = 0;
5682
  section_size_type group_end_offset = 0;
5683
  section_size_type stub_table_end_offset = 0;
5684
  Input_section_list::const_iterator group_begin =
5685
    this->input_sections().end();
5686
  Input_section_list::const_iterator stub_table =
5687
    this->input_sections().end();
5688
  Input_section_list::const_iterator group_end = this->input_sections().end();
5689
  for (Input_section_list::const_iterator p = this->input_sections().begin();
5690
       p != this->input_sections().end();
5691
       ++p)
5692
    {
5693
      section_size_type section_begin_offset =
5694
        align_address(off, p->addralign());
5695
      section_size_type section_end_offset =
5696
        section_begin_offset + p->data_size();
5697
 
5698
      // Check to see if we should group the previously seen sections.
5699
      switch (state)
5700
        {
5701
        case NO_GROUP:
5702
          break;
5703
 
5704
        case FINDING_STUB_SECTION:
5705
          // Adding this section makes the group larger than GROUP_SIZE.
5706
          if (section_end_offset - group_begin_offset >= group_size)
5707
            {
5708
              if (stubs_always_after_branch)
5709
                {
5710
                  gold_assert(group_end != this->input_sections().end());
5711
                  this->create_stub_group(group_begin, group_end, group_end,
5712
                                          target, &new_relaxed_sections,
5713
                                          task);
5714
                  state = NO_GROUP;
5715
                }
5716
              else
5717
                {
5718
                  // But wait, there's more!  Input sections up to
5719
                  // stub_group_size bytes after the stub table can be
5720
                  // handled by it too.
5721
                  state = HAS_STUB_SECTION;
5722
                  stub_table = group_end;
5723
                  stub_table_end_offset = group_end_offset;
5724
                }
5725
            }
5726
            break;
5727
 
5728
        case HAS_STUB_SECTION:
5729
          // Adding this section makes the post stub-section group larger
5730
          // than GROUP_SIZE.
5731
          if (section_end_offset - stub_table_end_offset >= group_size)
5732
           {
5733
             gold_assert(group_end != this->input_sections().end());
5734
             this->create_stub_group(group_begin, group_end, stub_table,
5735
                                     target, &new_relaxed_sections, task);
5736
             state = NO_GROUP;
5737
           }
5738
           break;
5739
 
5740
          default:
5741
            gold_unreachable();
5742
        }
5743
 
5744
      // If we see an input section and currently there is no group, start
5745
      // a new one.  Skip any empty sections.  We look at the data size
5746
      // instead of calling p->relobj()->section_size() to avoid locking.
5747
      if ((p->is_input_section() || p->is_relaxed_input_section())
5748
          && (p->data_size() != 0))
5749
        {
5750
          if (state == NO_GROUP)
5751
            {
5752
              state = FINDING_STUB_SECTION;
5753
              group_begin = p;
5754
              group_begin_offset = section_begin_offset;
5755
            }
5756
 
5757
          // Keep track of the last input section seen.
5758
          group_end = p;
5759
          group_end_offset = section_end_offset;
5760
        }
5761
 
5762
      off = section_end_offset;
5763
    }
5764
 
5765
  // Create a stub group for any ungrouped sections.
5766
  if (state == FINDING_STUB_SECTION || state == HAS_STUB_SECTION)
5767
    {
5768
      gold_assert(group_end != this->input_sections().end());
5769
      this->create_stub_group(group_begin, group_end,
5770
                              (state == FINDING_STUB_SECTION
5771
                               ? group_end
5772
                               : stub_table),
5773
                               target, &new_relaxed_sections, task);
5774
    }
5775
 
5776
  // Convert input section into relaxed input section in a batch.
5777
  if (!new_relaxed_sections.empty())
5778
    this->convert_input_sections_to_relaxed_sections(new_relaxed_sections);
5779
 
5780
  // Update the section offsets
5781
  for (size_t i = 0; i < new_relaxed_sections.size(); ++i)
5782
    {
5783
      Arm_relobj<big_endian>* arm_relobj =
5784
        Arm_relobj<big_endian>::as_arm_relobj(
5785
          new_relaxed_sections[i]->relobj());
5786
      unsigned int shndx = new_relaxed_sections[i]->shndx();
5787
      // Tell Arm_relobj that this input section is converted.
5788
      arm_relobj->convert_input_section_to_relaxed_section(shndx);
5789
    }
5790
}
5791
 
5792
// Append non empty text sections in this to LIST in ascending
5793
// order of their position in this.
5794
 
5795
template<bool big_endian>
5796
void
5797
Arm_output_section<big_endian>::append_text_sections_to_list(
5798
    Text_section_list* list)
5799
{
5800
  gold_assert((this->flags() & elfcpp::SHF_ALLOC) != 0);
5801
 
5802
  for (Input_section_list::const_iterator p = this->input_sections().begin();
5803
       p != this->input_sections().end();
5804
       ++p)
5805
    {
5806
      // We only care about plain or relaxed input sections.  We also
5807
      // ignore any merged sections.
5808 159 khays
      if (p->is_input_section() || p->is_relaxed_input_section())
5809 27 khays
        list->push_back(Text_section_list::value_type(p->relobj(),
5810
                                                      p->shndx()));
5811
    }
5812
}
5813
 
5814
template<bool big_endian>
5815
void
5816
Arm_output_section<big_endian>::fix_exidx_coverage(
5817
    Layout* layout,
5818
    const Text_section_list& sorted_text_sections,
5819
    Symbol_table* symtab,
5820
    bool merge_exidx_entries,
5821
    const Task* task)
5822
{
5823
  // We should only do this for the EXIDX output section.
5824
  gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
5825
 
5826
  // We don't want the relaxation loop to undo these changes, so we discard
5827
  // the current saved states and take another one after the fix-up.
5828
  this->discard_states();
5829
 
5830
  // Remove all input sections.
5831
  uint64_t address = this->address();
5832
  typedef std::list<Output_section::Input_section> Input_section_list;
5833
  Input_section_list input_sections;
5834
  this->reset_address_and_file_offset();
5835
  this->get_input_sections(address, std::string(""), &input_sections);
5836
 
5837
  if (!this->input_sections().empty())
5838
    gold_error(_("Found non-EXIDX input sections in EXIDX output section"));
5839
 
5840
  // Go through all the known input sections and record them.
5841
  typedef Unordered_set<Section_id, Section_id_hash> Section_id_set;
5842
  typedef Unordered_map<Section_id, const Output_section::Input_section*,
5843
                        Section_id_hash> Text_to_exidx_map;
5844
  Text_to_exidx_map text_to_exidx_map;
5845
  for (Input_section_list::const_iterator p = input_sections.begin();
5846
       p != input_sections.end();
5847
       ++p)
5848
    {
5849
      // This should never happen.  At this point, we should only see
5850
      // plain EXIDX input sections.
5851
      gold_assert(!p->is_relaxed_input_section());
5852
      text_to_exidx_map[Section_id(p->relobj(), p->shndx())] = &(*p);
5853
    }
5854
 
5855
  Arm_exidx_fixup exidx_fixup(this, merge_exidx_entries);
5856
 
5857
  // Go over the sorted text sections.
5858
  typedef Unordered_set<Section_id, Section_id_hash> Section_id_set;
5859
  Section_id_set processed_input_sections;
5860
  for (Text_section_list::const_iterator p = sorted_text_sections.begin();
5861
       p != sorted_text_sections.end();
5862
       ++p)
5863
    {
5864
      Relobj* relobj = p->first;
5865
      unsigned int shndx = p->second;
5866
 
5867
      Arm_relobj<big_endian>* arm_relobj =
5868
         Arm_relobj<big_endian>::as_arm_relobj(relobj);
5869
      const Arm_exidx_input_section* exidx_input_section =
5870
         arm_relobj->exidx_input_section_by_link(shndx);
5871
 
5872
      // If this text section has no EXIDX section or if the EXIDX section
5873
      // has errors, force an EXIDX_CANTUNWIND entry pointing to the end
5874
      // of the last seen EXIDX section.
5875
      if (exidx_input_section == NULL || exidx_input_section->has_errors())
5876
        {
5877
          exidx_fixup.add_exidx_cantunwind_as_needed();
5878
          continue;
5879
        }
5880
 
5881
      Relobj* exidx_relobj = exidx_input_section->relobj();
5882
      unsigned int exidx_shndx = exidx_input_section->shndx();
5883
      Section_id sid(exidx_relobj, exidx_shndx);
5884
      Text_to_exidx_map::const_iterator iter = text_to_exidx_map.find(sid);
5885
      if (iter == text_to_exidx_map.end())
5886
        {
5887
          // This is odd.  We have not seen this EXIDX input section before.
5888
          // We cannot do fix-up.  If we saw a SECTIONS clause in a script,
5889
          // issue a warning instead.  We assume the user knows what he
5890
          // or she is doing.  Otherwise, this is an error.
5891
          if (layout->script_options()->saw_sections_clause())
5892
            gold_warning(_("unwinding may not work because EXIDX input section"
5893
                           " %u of %s is not in EXIDX output section"),
5894
                         exidx_shndx, exidx_relobj->name().c_str());
5895
          else
5896
            gold_error(_("unwinding may not work because EXIDX input section"
5897
                         " %u of %s is not in EXIDX output section"),
5898
                       exidx_shndx, exidx_relobj->name().c_str());
5899
 
5900
          exidx_fixup.add_exidx_cantunwind_as_needed();
5901
          continue;
5902
        }
5903
 
5904
      // We need to access the contents of the EXIDX section, lock the
5905
      // object here.
5906
      Task_lock_obj<Object> tl(task, exidx_relobj);
5907
      section_size_type exidx_size;
5908
      const unsigned char* exidx_contents =
5909
        exidx_relobj->section_contents(exidx_shndx, &exidx_size, false);
5910
 
5911
      // Fix up coverage and append input section to output data list.
5912
      Arm_exidx_section_offset_map* section_offset_map = NULL;
5913
      uint32_t deleted_bytes =
5914
        exidx_fixup.process_exidx_section<big_endian>(exidx_input_section,
5915
                                                      exidx_contents,
5916
                                                      exidx_size,
5917
                                                      &section_offset_map);
5918
 
5919
      if (deleted_bytes == exidx_input_section->size())
5920
        {
5921
          // The whole EXIDX section got merged.  Remove it from output.
5922
          gold_assert(section_offset_map == NULL);
5923
          exidx_relobj->set_output_section(exidx_shndx, NULL);
5924
 
5925
          // All local symbols defined in this input section will be dropped.
5926
          // We need to adjust output local symbol count.
5927
          arm_relobj->set_output_local_symbol_count_needs_update();
5928
        }
5929
      else if (deleted_bytes > 0)
5930
        {
5931
          // Some entries are merged.  We need to convert this EXIDX input
5932
          // section into a relaxed section.
5933
          gold_assert(section_offset_map != NULL);
5934
 
5935
          Arm_exidx_merged_section* merged_section =
5936
            new Arm_exidx_merged_section(*exidx_input_section,
5937
                                         *section_offset_map, deleted_bytes);
5938
          merged_section->build_contents(exidx_contents, exidx_size);
5939
 
5940
          const std::string secname = exidx_relobj->section_name(exidx_shndx);
5941
          this->add_relaxed_input_section(layout, merged_section, secname);
5942
          arm_relobj->convert_input_section_to_relaxed_section(exidx_shndx);
5943
 
5944
          // All local symbols defined in discarded portions of this input
5945
          // section will be dropped.  We need to adjust output local symbol
5946
          // count.
5947
          arm_relobj->set_output_local_symbol_count_needs_update();
5948
        }
5949
      else
5950
        {
5951
          // Just add back the EXIDX input section.
5952
          gold_assert(section_offset_map == NULL);
5953
          const Output_section::Input_section* pis = iter->second;
5954
          gold_assert(pis->is_input_section());
5955
          this->add_script_input_section(*pis);
5956
        }
5957
 
5958
      processed_input_sections.insert(Section_id(exidx_relobj, exidx_shndx));
5959
    }
5960
 
5961
  // Insert an EXIDX_CANTUNWIND entry at the end of output if necessary.
5962
  exidx_fixup.add_exidx_cantunwind_as_needed();
5963
 
5964
  // Remove any known EXIDX input sections that are not processed.
5965
  for (Input_section_list::const_iterator p = input_sections.begin();
5966
       p != input_sections.end();
5967
       ++p)
5968
    {
5969
      if (processed_input_sections.find(Section_id(p->relobj(), p->shndx()))
5970
          == processed_input_sections.end())
5971
        {
5972
          // We discard a known EXIDX section because its linked
5973
          // text section has been folded by ICF.  We also discard an
5974
          // EXIDX section with error, the output does not matter in this
5975
          // case.  We do this to avoid triggering asserts.
5976
          Arm_relobj<big_endian>* arm_relobj =
5977
            Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
5978
          const Arm_exidx_input_section* exidx_input_section =
5979
            arm_relobj->exidx_input_section_by_shndx(p->shndx());
5980
          gold_assert(exidx_input_section != NULL);
5981
          if (!exidx_input_section->has_errors())
5982
            {
5983
              unsigned int text_shndx = exidx_input_section->link();
5984
              gold_assert(symtab->is_section_folded(p->relobj(), text_shndx));
5985
            }
5986
 
5987
          // Remove this from link.  We also need to recount the
5988
          // local symbols.
5989
          p->relobj()->set_output_section(p->shndx(), NULL);
5990
          arm_relobj->set_output_local_symbol_count_needs_update();
5991
        }
5992
    }
5993
 
5994
  // Link exidx output section to the first seen output section and
5995
  // set correct entry size.
5996
  this->set_link_section(exidx_fixup.first_output_text_section());
5997
  this->set_entsize(8);
5998
 
5999
  // Make changes permanent.
6000
  this->save_states();
6001
  this->set_section_offsets_need_adjustment();
6002
}
6003
 
6004
// Link EXIDX output sections to text output sections.
6005
 
6006
template<bool big_endian>
6007
void
6008
Arm_output_section<big_endian>::set_exidx_section_link()
6009
{
6010
  gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
6011
  if (!this->input_sections().empty())
6012
    {
6013
      Input_section_list::const_iterator p = this->input_sections().begin();
6014
      Arm_relobj<big_endian>* arm_relobj =
6015
        Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
6016
      unsigned exidx_shndx = p->shndx();
6017
      const Arm_exidx_input_section* exidx_input_section =
6018
        arm_relobj->exidx_input_section_by_shndx(exidx_shndx);
6019
      gold_assert(exidx_input_section != NULL);
6020
      unsigned int text_shndx = exidx_input_section->link();
6021
      Output_section* os = arm_relobj->output_section(text_shndx);
6022
      this->set_link_section(os);
6023
    }
6024
}
6025
 
6026
// Arm_relobj methods.
6027
 
6028
// Determine if an input section is scannable for stub processing.  SHDR is
6029
// the header of the section and SHNDX is the section index.  OS is the output
6030
// section for the input section and SYMTAB is the global symbol table used to
6031
// look up ICF information.
6032
 
6033
template<bool big_endian>
6034
bool
6035
Arm_relobj<big_endian>::section_is_scannable(
6036
    const elfcpp::Shdr<32, big_endian>& shdr,
6037
    unsigned int shndx,
6038
    const Output_section* os,
6039
    const Symbol_table* symtab)
6040
{
6041
  // Skip any empty sections, unallocated sections or sections whose
6042
  // type are not SHT_PROGBITS.
6043
  if (shdr.get_sh_size() == 0
6044
      || (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0
6045
      || shdr.get_sh_type() != elfcpp::SHT_PROGBITS)
6046
    return false;
6047
 
6048
  // Skip any discarded or ICF'ed sections.
6049
  if (os == NULL || symtab->is_section_folded(this, shndx))
6050
    return false;
6051
 
6052
  // If this requires special offset handling, check to see if it is
6053
  // a relaxed section.  If this is not, then it is a merged section that
6054
  // we cannot handle.
6055
  if (this->is_output_section_offset_invalid(shndx))
6056
    {
6057
      const Output_relaxed_input_section* poris =
6058
        os->find_relaxed_input_section(this, shndx);
6059
      if (poris == NULL)
6060
        return false;
6061
    }
6062
 
6063
  return true;
6064
}
6065
 
6066
// Determine if we want to scan the SHNDX-th section for relocation stubs.
6067
// This is a helper for Arm_relobj::scan_sections_for_stubs() below.
6068
 
6069
template<bool big_endian>
6070
bool
6071
Arm_relobj<big_endian>::section_needs_reloc_stub_scanning(
6072
    const elfcpp::Shdr<32, big_endian>& shdr,
6073
    const Relobj::Output_sections& out_sections,
6074
    const Symbol_table* symtab,
6075
    const unsigned char* pshdrs)
6076
{
6077
  unsigned int sh_type = shdr.get_sh_type();
6078
  if (sh_type != elfcpp::SHT_REL && sh_type != elfcpp::SHT_RELA)
6079
    return false;
6080
 
6081
  // Ignore empty section.
6082
  off_t sh_size = shdr.get_sh_size();
6083
  if (sh_size == 0)
6084
    return false;
6085
 
6086
  // Ignore reloc section with unexpected symbol table.  The
6087
  // error will be reported in the final link.
6088
  if (this->adjust_shndx(shdr.get_sh_link()) != this->symtab_shndx())
6089
    return false;
6090
 
6091
  unsigned int reloc_size;
6092
  if (sh_type == elfcpp::SHT_REL)
6093
    reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6094
  else
6095
    reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6096
 
6097
  // Ignore reloc section with unexpected entsize or uneven size.
6098
  // The error will be reported in the final link.
6099
  if (reloc_size != shdr.get_sh_entsize() || sh_size % reloc_size != 0)
6100
    return false;
6101
 
6102
  // Ignore reloc section with bad info.  This error will be
6103
  // reported in the final link.
6104
  unsigned int index = this->adjust_shndx(shdr.get_sh_info());
6105
  if (index >= this->shnum())
6106
    return false;
6107
 
6108
  const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6109
  const elfcpp::Shdr<32, big_endian> text_shdr(pshdrs + index * shdr_size);
6110
  return this->section_is_scannable(text_shdr, index,
6111
                                   out_sections[index], symtab);
6112
}
6113
 
6114
// Return the output address of either a plain input section or a relaxed
6115
// input section.  SHNDX is the section index.  We define and use this
6116
// instead of calling Output_section::output_address because that is slow
6117
// for large output.
6118
 
6119
template<bool big_endian>
6120
Arm_address
6121
Arm_relobj<big_endian>::simple_input_section_output_address(
6122
    unsigned int shndx,
6123
    Output_section* os)
6124
{
6125
  if (this->is_output_section_offset_invalid(shndx))
6126
    {
6127
      const Output_relaxed_input_section* poris =
6128
        os->find_relaxed_input_section(this, shndx);
6129
      // We do not handle merged sections here.
6130
      gold_assert(poris != NULL);
6131
      return poris->address();
6132
    }
6133
  else
6134
    return os->address() + this->get_output_section_offset(shndx);
6135
}
6136
 
6137
// Determine if we want to scan the SHNDX-th section for non-relocation stubs.
6138
// This is a helper for Arm_relobj::scan_sections_for_stubs() below.
6139
 
6140
template<bool big_endian>
6141
bool
6142
Arm_relobj<big_endian>::section_needs_cortex_a8_stub_scanning(
6143
    const elfcpp::Shdr<32, big_endian>& shdr,
6144
    unsigned int shndx,
6145
    Output_section* os,
6146
    const Symbol_table* symtab)
6147
{
6148
  if (!this->section_is_scannable(shdr, shndx, os, symtab))
6149
    return false;
6150
 
6151
  // If the section does not cross any 4K-boundaries, it does not need to
6152
  // be scanned.
6153
  Arm_address address = this->simple_input_section_output_address(shndx, os);
6154
  if ((address & ~0xfffU) == ((address + shdr.get_sh_size() - 1) & ~0xfffU))
6155
    return false;
6156
 
6157
  return true;
6158
}
6159
 
6160
// Scan a section for Cortex-A8 workaround.
6161
 
6162
template<bool big_endian>
6163
void
6164
Arm_relobj<big_endian>::scan_section_for_cortex_a8_erratum(
6165
    const elfcpp::Shdr<32, big_endian>& shdr,
6166
    unsigned int shndx,
6167
    Output_section* os,
6168
    Target_arm<big_endian>* arm_target)
6169
{
6170
  // Look for the first mapping symbol in this section.  It should be
6171
  // at (shndx, 0).
6172
  Mapping_symbol_position section_start(shndx, 0);
6173
  typename Mapping_symbols_info::const_iterator p =
6174
    this->mapping_symbols_info_.lower_bound(section_start);
6175
 
6176
  // There are no mapping symbols for this section.  Treat it as a data-only
6177
  // section.  Issue a warning if section is marked as containing
6178
  // instructions.
6179
  if (p == this->mapping_symbols_info_.end() || p->first.first != shndx)
6180
    {
6181
      if ((this->section_flags(shndx) & elfcpp::SHF_EXECINSTR) != 0)
6182
        gold_warning(_("cannot scan executable section %u of %s for Cortex-A8 "
6183
                       "erratum because it has no mapping symbols."),
6184
                     shndx, this->name().c_str());
6185
      return;
6186
    }
6187
 
6188
  Arm_address output_address =
6189
    this->simple_input_section_output_address(shndx, os);
6190
 
6191
  // Get the section contents.
6192
  section_size_type input_view_size = 0;
6193
  const unsigned char* input_view =
6194
    this->section_contents(shndx, &input_view_size, false);
6195
 
6196
  // We need to go through the mapping symbols to determine what to
6197
  // scan.  There are two reasons.  First, we should look at THUMB code and
6198
  // THUMB code only.  Second, we only want to look at the 4K-page boundary
6199
  // to speed up the scanning.
6200
 
6201
  while (p != this->mapping_symbols_info_.end()
6202
        && p->first.first == shndx)
6203
    {
6204
      typename Mapping_symbols_info::const_iterator next =
6205
        this->mapping_symbols_info_.upper_bound(p->first);
6206
 
6207
      // Only scan part of a section with THUMB code.
6208
      if (p->second == 't')
6209
        {
6210
          // Determine the end of this range.
6211
          section_size_type span_start =
6212
            convert_to_section_size_type(p->first.second);
6213
          section_size_type span_end;
6214
          if (next != this->mapping_symbols_info_.end()
6215
              && next->first.first == shndx)
6216
            span_end = convert_to_section_size_type(next->first.second);
6217
          else
6218
            span_end = convert_to_section_size_type(shdr.get_sh_size());
6219
 
6220
          if (((span_start + output_address) & ~0xfffUL)
6221
              != ((span_end + output_address - 1) & ~0xfffUL))
6222
            {
6223
              arm_target->scan_span_for_cortex_a8_erratum(this, shndx,
6224
                                                          span_start, span_end,
6225
                                                          input_view,
6226
                                                          output_address);
6227
            }
6228
        }
6229
 
6230
      p = next;
6231
    }
6232
}
6233
 
6234
// Scan relocations for stub generation.
6235
 
6236
template<bool big_endian>
6237
void
6238
Arm_relobj<big_endian>::scan_sections_for_stubs(
6239
    Target_arm<big_endian>* arm_target,
6240
    const Symbol_table* symtab,
6241
    const Layout* layout)
6242
{
6243
  unsigned int shnum = this->shnum();
6244
  const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6245
 
6246
  // Read the section headers.
6247
  const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
6248
                                               shnum * shdr_size,
6249
                                               true, true);
6250
 
6251
  // To speed up processing, we set up hash tables for fast lookup of
6252
  // input offsets to output addresses.
6253
  this->initialize_input_to_output_maps();
6254
 
6255
  const Relobj::Output_sections& out_sections(this->output_sections());
6256
 
6257
  Relocate_info<32, big_endian> relinfo;
6258
  relinfo.symtab = symtab;
6259
  relinfo.layout = layout;
6260
  relinfo.object = this;
6261
 
6262
  // Do relocation stubs scanning.
6263
  const unsigned char* p = pshdrs + shdr_size;
6264
  for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
6265
    {
6266
      const elfcpp::Shdr<32, big_endian> shdr(p);
6267
      if (this->section_needs_reloc_stub_scanning(shdr, out_sections, symtab,
6268
                                                  pshdrs))
6269
        {
6270
          unsigned int index = this->adjust_shndx(shdr.get_sh_info());
6271
          Arm_address output_offset = this->get_output_section_offset(index);
6272
          Arm_address output_address;
6273
          if (output_offset != invalid_address)
6274
            output_address = out_sections[index]->address() + output_offset;
6275
          else
6276
            {
6277
              // Currently this only happens for a relaxed section.
6278
              const Output_relaxed_input_section* poris =
6279
              out_sections[index]->find_relaxed_input_section(this, index);
6280
              gold_assert(poris != NULL);
6281
              output_address = poris->address();
6282
            }
6283
 
6284
          // Get the relocations.
6285
          const unsigned char* prelocs = this->get_view(shdr.get_sh_offset(),
6286
                                                        shdr.get_sh_size(),
6287
                                                        true, false);
6288
 
6289
          // Get the section contents.  This does work for the case in which
6290
          // we modify the contents of an input section.  We need to pass the
6291
          // output view under such circumstances.
6292
          section_size_type input_view_size = 0;
6293
          const unsigned char* input_view =
6294
            this->section_contents(index, &input_view_size, false);
6295
 
6296
          relinfo.reloc_shndx = i;
6297
          relinfo.data_shndx = index;
6298
          unsigned int sh_type = shdr.get_sh_type();
6299
          unsigned int reloc_size;
6300
          if (sh_type == elfcpp::SHT_REL)
6301
            reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6302
          else
6303
            reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6304
 
6305
          Output_section* os = out_sections[index];
6306
          arm_target->scan_section_for_stubs(&relinfo, sh_type, prelocs,
6307
                                             shdr.get_sh_size() / reloc_size,
6308
                                             os,
6309
                                             output_offset == invalid_address,
6310
                                             input_view, output_address,
6311
                                             input_view_size);
6312
        }
6313
    }
6314
 
6315
  // Do Cortex-A8 erratum stubs scanning.  This has to be done for a section
6316
  // after its relocation section, if there is one, is processed for
6317
  // relocation stubs.  Merging this loop with the one above would have been
6318
  // complicated since we would have had to make sure that relocation stub
6319
  // scanning is done first.
6320
  if (arm_target->fix_cortex_a8())
6321
    {
6322
      const unsigned char* p = pshdrs + shdr_size;
6323
      for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
6324
        {
6325
          const elfcpp::Shdr<32, big_endian> shdr(p);
6326
          if (this->section_needs_cortex_a8_stub_scanning(shdr, i,
6327
                                                          out_sections[i],
6328
                                                          symtab))
6329
            this->scan_section_for_cortex_a8_erratum(shdr, i, out_sections[i],
6330
                                                     arm_target);
6331
        }
6332
    }
6333
 
6334
  // After we've done the relocations, we release the hash tables,
6335
  // since we no longer need them.
6336
  this->free_input_to_output_maps();
6337
}
6338
 
6339
// Count the local symbols.  The ARM backend needs to know if a symbol
6340
// is a THUMB function or not.  For global symbols, it is easy because
6341
// the Symbol object keeps the ELF symbol type.  For local symbol it is
6342
// harder because we cannot access this information.   So we override the
6343
// do_count_local_symbol in parent and scan local symbols to mark
6344
// THUMB functions.  This is not the most efficient way but I do not want to
6345
// slow down other ports by calling a per symbol target hook inside
6346
// Sized_relobj_file<size, big_endian>::do_count_local_symbols. 
6347
 
6348
template<bool big_endian>
6349
void
6350
Arm_relobj<big_endian>::do_count_local_symbols(
6351
    Stringpool_template<char>* pool,
6352
    Stringpool_template<char>* dynpool)
6353
{
6354
  // We need to fix-up the values of any local symbols whose type are
6355
  // STT_ARM_TFUNC.
6356
 
6357
  // Ask parent to count the local symbols.
6358
  Sized_relobj_file<32, big_endian>::do_count_local_symbols(pool, dynpool);
6359
  const unsigned int loccount = this->local_symbol_count();
6360
  if (loccount == 0)
6361
    return;
6362
 
6363
  // Initialize the thumb function bit-vector.
6364
  std::vector<bool> empty_vector(loccount, false);
6365
  this->local_symbol_is_thumb_function_.swap(empty_vector);
6366
 
6367
  // Read the symbol table section header.
6368
  const unsigned int symtab_shndx = this->symtab_shndx();
6369
  elfcpp::Shdr<32, big_endian>
6370
      symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6371
  gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6372
 
6373
  // Read the local symbols.
6374
  const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
6375
  gold_assert(loccount == symtabshdr.get_sh_info());
6376
  off_t locsize = loccount * sym_size;
6377
  const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6378
                                              locsize, true, true);
6379
 
6380
  // For mapping symbol processing, we need to read the symbol names.
6381
  unsigned int strtab_shndx = this->adjust_shndx(symtabshdr.get_sh_link());
6382
  if (strtab_shndx >= this->shnum())
6383
    {
6384
      this->error(_("invalid symbol table name index: %u"), strtab_shndx);
6385
      return;
6386
    }
6387
 
6388
  elfcpp::Shdr<32, big_endian>
6389
    strtabshdr(this, this->elf_file()->section_header(strtab_shndx));
6390
  if (strtabshdr.get_sh_type() != elfcpp::SHT_STRTAB)
6391
    {
6392
      this->error(_("symbol table name section has wrong type: %u"),
6393
                  static_cast<unsigned int>(strtabshdr.get_sh_type()));
6394
      return;
6395
    }
6396
  const char* pnames =
6397
    reinterpret_cast<const char*>(this->get_view(strtabshdr.get_sh_offset(),
6398
                                                 strtabshdr.get_sh_size(),
6399
                                                 false, false));
6400
 
6401
  // Loop over the local symbols and mark any local symbols pointing
6402
  // to THUMB functions.
6403
 
6404
  // Skip the first dummy symbol.
6405
  psyms += sym_size;
6406
  typename Sized_relobj_file<32, big_endian>::Local_values* plocal_values =
6407
    this->local_values();
6408
  for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
6409
    {
6410
      elfcpp::Sym<32, big_endian> sym(psyms);
6411
      elfcpp::STT st_type = sym.get_st_type();
6412
      Symbol_value<32>& lv((*plocal_values)[i]);
6413
      Arm_address input_value = lv.input_value();
6414
 
6415
      // Check to see if this is a mapping symbol.
6416
      const char* sym_name = pnames + sym.get_st_name();
6417
      if (Target_arm<big_endian>::is_mapping_symbol_name(sym_name))
6418
        {
6419
          bool is_ordinary;
6420
          unsigned int input_shndx =
6421
            this->adjust_sym_shndx(i, sym.get_st_shndx(), &is_ordinary);
6422
          gold_assert(is_ordinary);
6423
 
6424
          // Strip of LSB in case this is a THUMB symbol.
6425
          Mapping_symbol_position msp(input_shndx, input_value & ~1U);
6426
          this->mapping_symbols_info_[msp] = sym_name[1];
6427
        }
6428
 
6429
      if (st_type == elfcpp::STT_ARM_TFUNC
6430
          || (st_type == elfcpp::STT_FUNC && ((input_value & 1) != 0)))
6431
        {
6432
          // This is a THUMB function.  Mark this and canonicalize the
6433
          // symbol value by setting LSB.
6434
          this->local_symbol_is_thumb_function_[i] = true;
6435
          if ((input_value & 1) == 0)
6436
            lv.set_input_value(input_value | 1);
6437
        }
6438
    }
6439
}
6440
 
6441
// Relocate sections.
6442
template<bool big_endian>
6443
void
6444
Arm_relobj<big_endian>::do_relocate_sections(
6445
    const Symbol_table* symtab,
6446
    const Layout* layout,
6447
    const unsigned char* pshdrs,
6448
    Output_file* of,
6449
    typename Sized_relobj_file<32, big_endian>::Views* pviews)
6450
{
6451
  // Call parent to relocate sections.
6452
  Sized_relobj_file<32, big_endian>::do_relocate_sections(symtab, layout,
6453
                                                          pshdrs, of, pviews);
6454
 
6455
  // We do not generate stubs if doing a relocatable link.
6456
  if (parameters->options().relocatable())
6457
    return;
6458
 
6459
  // Relocate stub tables.
6460
  unsigned int shnum = this->shnum();
6461
 
6462
  Target_arm<big_endian>* arm_target =
6463
    Target_arm<big_endian>::default_target();
6464
 
6465
  Relocate_info<32, big_endian> relinfo;
6466
  relinfo.symtab = symtab;
6467
  relinfo.layout = layout;
6468
  relinfo.object = this;
6469
 
6470
  for (unsigned int i = 1; i < shnum; ++i)
6471
    {
6472
      Arm_input_section<big_endian>* arm_input_section =
6473
        arm_target->find_arm_input_section(this, i);
6474
 
6475
      if (arm_input_section != NULL
6476
          && arm_input_section->is_stub_table_owner()
6477
          && !arm_input_section->stub_table()->empty())
6478
        {
6479
          // We cannot discard a section if it owns a stub table.
6480
          Output_section* os = this->output_section(i);
6481
          gold_assert(os != NULL);
6482
 
6483
          relinfo.reloc_shndx = elfcpp::SHN_UNDEF;
6484
          relinfo.reloc_shdr = NULL;
6485
          relinfo.data_shndx = i;
6486
          relinfo.data_shdr = pshdrs + i * elfcpp::Elf_sizes<32>::shdr_size;
6487
 
6488
          gold_assert((*pviews)[i].view != NULL);
6489
 
6490
          // We are passed the output section view.  Adjust it to cover the
6491
          // stub table only.
6492
          Stub_table<big_endian>* stub_table = arm_input_section->stub_table();
6493
          gold_assert((stub_table->address() >= (*pviews)[i].address)
6494
                      && ((stub_table->address() + stub_table->data_size())
6495
                          <= (*pviews)[i].address + (*pviews)[i].view_size));
6496
 
6497
          off_t offset = stub_table->address() - (*pviews)[i].address;
6498
          unsigned char* view = (*pviews)[i].view + offset;
6499
          Arm_address address = stub_table->address();
6500
          section_size_type view_size = stub_table->data_size();
6501
 
6502
          stub_table->relocate_stubs(&relinfo, arm_target, os, view, address,
6503
                                     view_size);
6504
        }
6505
 
6506
      // Apply Cortex A8 workaround if applicable.
6507
      if (this->section_has_cortex_a8_workaround(i))
6508
        {
6509
          unsigned char* view = (*pviews)[i].view;
6510
          Arm_address view_address = (*pviews)[i].address;
6511
          section_size_type view_size = (*pviews)[i].view_size;
6512
          Stub_table<big_endian>* stub_table = this->stub_tables_[i];
6513
 
6514
          // Adjust view to cover section.
6515
          Output_section* os = this->output_section(i);
6516
          gold_assert(os != NULL);
6517
          Arm_address section_address =
6518
            this->simple_input_section_output_address(i, os);
6519
          uint64_t section_size = this->section_size(i);
6520
 
6521
          gold_assert(section_address >= view_address
6522
                      && ((section_address + section_size)
6523
                          <= (view_address + view_size)));
6524
 
6525
          unsigned char* section_view = view + (section_address - view_address);
6526
 
6527
          // Apply the Cortex-A8 workaround to the output address range
6528
          // corresponding to this input section.
6529
          stub_table->apply_cortex_a8_workaround_to_address_range(
6530
              arm_target,
6531
              section_view,
6532
              section_address,
6533
              section_size);
6534
        }
6535
    }
6536
}
6537
 
6538
// Find the linked text section of an EXIDX section by looking at the first
6539
// relocation.  4.4.1 of the EHABI specifications says that an EXIDX section
6540
// must be linked to its associated code section via the sh_link field of
6541
// its section header.  However, some tools are broken and the link is not
6542
// always set.  LD just drops such an EXIDX section silently, causing the
6543
// associated code not unwindabled.   Here we try a little bit harder to
6544
// discover the linked code section.
6545
//
6546
// PSHDR points to the section header of a relocation section of an EXIDX
6547
// section.  If we can find a linked text section, return true and
6548
// store the text section index in the location PSHNDX.  Otherwise
6549
// return false.
6550
 
6551
template<bool big_endian>
6552
bool
6553
Arm_relobj<big_endian>::find_linked_text_section(
6554
    const unsigned char* pshdr,
6555
    const unsigned char* psyms,
6556
    unsigned int* pshndx)
6557
{
6558
  elfcpp::Shdr<32, big_endian> shdr(pshdr);
6559
 
6560
  // If there is no relocation, we cannot find the linked text section.
6561
  size_t reloc_size;
6562
  if (shdr.get_sh_type() == elfcpp::SHT_REL)
6563
      reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6564
  else
6565
      reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6566
  size_t reloc_count = shdr.get_sh_size() / reloc_size;
6567
 
6568
  // Get the relocations.
6569
  const unsigned char* prelocs =
6570
      this->get_view(shdr.get_sh_offset(), shdr.get_sh_size(), true, false);
6571
 
6572
  // Find the REL31 relocation for the first word of the first EXIDX entry.
6573
  for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
6574
    {
6575
      Arm_address r_offset;
6576
      typename elfcpp::Elf_types<32>::Elf_WXword r_info;
6577
      if (shdr.get_sh_type() == elfcpp::SHT_REL)
6578
        {
6579
          typename elfcpp::Rel<32, big_endian> reloc(prelocs);
6580
          r_info = reloc.get_r_info();
6581
          r_offset = reloc.get_r_offset();
6582
        }
6583
      else
6584
        {
6585
          typename elfcpp::Rela<32, big_endian> reloc(prelocs);
6586
          r_info = reloc.get_r_info();
6587
          r_offset = reloc.get_r_offset();
6588
        }
6589
 
6590
      unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
6591
      if (r_type != elfcpp::R_ARM_PREL31 && r_type != elfcpp::R_ARM_SBREL31)
6592
        continue;
6593
 
6594
      unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
6595
      if (r_sym == 0
6596
          || r_sym >= this->local_symbol_count()
6597
          || r_offset != 0)
6598
        continue;
6599
 
6600
      // This is the relocation for the first word of the first EXIDX entry.
6601
      // We expect to see a local section symbol.
6602
      const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6603
      elfcpp::Sym<32, big_endian> sym(psyms + r_sym * sym_size);
6604
      if (sym.get_st_type() == elfcpp::STT_SECTION)
6605
        {
6606
          bool is_ordinary;
6607
          *pshndx =
6608
            this->adjust_sym_shndx(r_sym, sym.get_st_shndx(), &is_ordinary);
6609
          gold_assert(is_ordinary);
6610
          return true;
6611
        }
6612
      else
6613
        return false;
6614
    }
6615
 
6616
  return false;
6617
}
6618
 
6619
// Make an EXIDX input section object for an EXIDX section whose index is
6620
// SHNDX.  SHDR is the section header of the EXIDX section and TEXT_SHNDX
6621
// is the section index of the linked text section.
6622
 
6623
template<bool big_endian>
6624
void
6625
Arm_relobj<big_endian>::make_exidx_input_section(
6626
    unsigned int shndx,
6627
    const elfcpp::Shdr<32, big_endian>& shdr,
6628
    unsigned int text_shndx,
6629
    const elfcpp::Shdr<32, big_endian>& text_shdr)
6630
{
6631
  // Create an Arm_exidx_input_section object for this EXIDX section.
6632
  Arm_exidx_input_section* exidx_input_section =
6633
    new Arm_exidx_input_section(this, shndx, text_shndx, shdr.get_sh_size(),
6634
                                shdr.get_sh_addralign(),
6635
                                text_shdr.get_sh_size());
6636
 
6637
  gold_assert(this->exidx_section_map_[shndx] == NULL);
6638
  this->exidx_section_map_[shndx] = exidx_input_section;
6639
 
6640
  if (text_shndx == elfcpp::SHN_UNDEF || text_shndx >= this->shnum())
6641
    {
6642
      gold_error(_("EXIDX section %s(%u) links to invalid section %u in %s"),
6643
                 this->section_name(shndx).c_str(), shndx, text_shndx,
6644
                 this->name().c_str());
6645
      exidx_input_section->set_has_errors();
6646
    }
6647
  else if (this->exidx_section_map_[text_shndx] != NULL)
6648
    {
6649
      unsigned other_exidx_shndx =
6650
        this->exidx_section_map_[text_shndx]->shndx();
6651
      gold_error(_("EXIDX sections %s(%u) and %s(%u) both link to text section"
6652
                   "%s(%u) in %s"),
6653
                 this->section_name(shndx).c_str(), shndx,
6654
                 this->section_name(other_exidx_shndx).c_str(),
6655
                 other_exidx_shndx, this->section_name(text_shndx).c_str(),
6656
                 text_shndx, this->name().c_str());
6657
      exidx_input_section->set_has_errors();
6658
    }
6659
  else
6660
     this->exidx_section_map_[text_shndx] = exidx_input_section;
6661
 
6662
  // Check section flags of text section.
6663
  if ((text_shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
6664
    {
6665
      gold_error(_("EXIDX section %s(%u) links to non-allocated section %s(%u) "
6666
                   " in %s"),
6667
                 this->section_name(shndx).c_str(), shndx,
6668
                 this->section_name(text_shndx).c_str(), text_shndx,
6669
                 this->name().c_str());
6670
      exidx_input_section->set_has_errors();
6671
    }
6672
  else if ((text_shdr.get_sh_flags() & elfcpp::SHF_EXECINSTR) == 0)
6673
    // I would like to make this an error but currently ld just ignores
6674
    // this.
6675
    gold_warning(_("EXIDX section %s(%u) links to non-executable section "
6676
                   "%s(%u) in %s"),
6677
                 this->section_name(shndx).c_str(), shndx,
6678
                 this->section_name(text_shndx).c_str(), text_shndx,
6679
                 this->name().c_str());
6680
}
6681
 
6682
// Read the symbol information.
6683
 
6684
template<bool big_endian>
6685
void
6686
Arm_relobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
6687
{
6688
  // Call parent class to read symbol information.
6689
  Sized_relobj_file<32, big_endian>::do_read_symbols(sd);
6690
 
6691
  // If this input file is a binary file, it has no processor
6692
  // specific flags and attributes section.
6693
  Input_file::Format format = this->input_file()->format();
6694
  if (format != Input_file::FORMAT_ELF)
6695
    {
6696
      gold_assert(format == Input_file::FORMAT_BINARY);
6697
      this->merge_flags_and_attributes_ = false;
6698
      return;
6699
    }
6700
 
6701
  // Read processor-specific flags in ELF file header.
6702
  const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
6703
                                              elfcpp::Elf_sizes<32>::ehdr_size,
6704
                                              true, false);
6705
  elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
6706
  this->processor_specific_flags_ = ehdr.get_e_flags();
6707
 
6708
  // Go over the section headers and look for .ARM.attributes and .ARM.exidx
6709
  // sections.
6710
  std::vector<unsigned int> deferred_exidx_sections;
6711
  const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6712
  const unsigned char* pshdrs = sd->section_headers->data();
6713
  const unsigned char* ps = pshdrs + shdr_size;
6714
  bool must_merge_flags_and_attributes = false;
6715
  for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6716
    {
6717
      elfcpp::Shdr<32, big_endian> shdr(ps);
6718
 
6719
      // Sometimes an object has no contents except the section name string
6720
      // table and an empty symbol table with the undefined symbol.  We
6721
      // don't want to merge processor-specific flags from such an object.
6722
      if (shdr.get_sh_type() == elfcpp::SHT_SYMTAB)
6723
        {
6724
          // Symbol table is not empty.
6725
          const elfcpp::Elf_types<32>::Elf_WXword sym_size =
6726
             elfcpp::Elf_sizes<32>::sym_size;
6727
          if (shdr.get_sh_size() > sym_size)
6728
            must_merge_flags_and_attributes = true;
6729
        }
6730
      else if (shdr.get_sh_type() != elfcpp::SHT_STRTAB)
6731
        // If this is neither an empty symbol table nor a string table,
6732
        // be conservative.
6733
        must_merge_flags_and_attributes = true;
6734
 
6735
      if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
6736
        {
6737
          gold_assert(this->attributes_section_data_ == NULL);
6738
          section_offset_type section_offset = shdr.get_sh_offset();
6739
          section_size_type section_size =
6740
            convert_to_section_size_type(shdr.get_sh_size());
6741
          const unsigned char* view =
6742
             this->get_view(section_offset, section_size, true, false);
6743
          this->attributes_section_data_ =
6744
            new Attributes_section_data(view, section_size);
6745
        }
6746
      else if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
6747
        {
6748
          unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
6749
          if (text_shndx == elfcpp::SHN_UNDEF)
6750
            deferred_exidx_sections.push_back(i);
6751
          else
6752
            {
6753
              elfcpp::Shdr<32, big_endian> text_shdr(pshdrs
6754
                                                     + text_shndx * shdr_size);
6755
              this->make_exidx_input_section(i, shdr, text_shndx, text_shdr);
6756
            }
6757
          // EHABI 4.4.1 requires that SHF_LINK_ORDER flag to be set.
6758
          if ((shdr.get_sh_flags() & elfcpp::SHF_LINK_ORDER) == 0)
6759
            gold_warning(_("SHF_LINK_ORDER not set in EXIDX section %s of %s"),
6760
                         this->section_name(i).c_str(), this->name().c_str());
6761
        }
6762
    }
6763
 
6764
  // This is rare.
6765
  if (!must_merge_flags_and_attributes)
6766
    {
6767
      gold_assert(deferred_exidx_sections.empty());
6768
      this->merge_flags_and_attributes_ = false;
6769
      return;
6770
    }
6771
 
6772
  // Some tools are broken and they do not set the link of EXIDX sections. 
6773
  // We look at the first relocation to figure out the linked sections.
6774
  if (!deferred_exidx_sections.empty())
6775
    {
6776
      // We need to go over the section headers again to find the mapping
6777
      // from sections being relocated to their relocation sections.  This is
6778
      // a bit inefficient as we could do that in the loop above.  However,
6779
      // we do not expect any deferred EXIDX sections normally.  So we do not
6780
      // want to slow down the most common path.
6781
      typedef Unordered_map<unsigned int, unsigned int> Reloc_map;
6782
      Reloc_map reloc_map;
6783
      ps = pshdrs + shdr_size;
6784
      for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6785
        {
6786
          elfcpp::Shdr<32, big_endian> shdr(ps);
6787
          elfcpp::Elf_Word sh_type = shdr.get_sh_type();
6788
          if (sh_type == elfcpp::SHT_REL || sh_type == elfcpp::SHT_RELA)
6789
            {
6790
              unsigned int info_shndx = this->adjust_shndx(shdr.get_sh_info());
6791
              if (info_shndx >= this->shnum())
6792
                gold_error(_("relocation section %u has invalid info %u"),
6793
                           i, info_shndx);
6794
              Reloc_map::value_type value(info_shndx, i);
6795
              std::pair<Reloc_map::iterator, bool> result =
6796
                reloc_map.insert(value);
6797
              if (!result.second)
6798
                gold_error(_("section %u has multiple relocation sections "
6799
                             "%u and %u"),
6800
                           info_shndx, i, reloc_map[info_shndx]);
6801
            }
6802
        }
6803
 
6804
      // Read the symbol table section header.
6805
      const unsigned int symtab_shndx = this->symtab_shndx();
6806
      elfcpp::Shdr<32, big_endian>
6807
          symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6808
      gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6809
 
6810
      // Read the local symbols.
6811
      const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
6812
      const unsigned int loccount = this->local_symbol_count();
6813
      gold_assert(loccount == symtabshdr.get_sh_info());
6814
      off_t locsize = loccount * sym_size;
6815
      const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6816
                                                  locsize, true, true);
6817
 
6818
      // Process the deferred EXIDX sections. 
6819
      for (unsigned int i = 0; i < deferred_exidx_sections.size(); ++i)
6820
        {
6821
          unsigned int shndx = deferred_exidx_sections[i];
6822
          elfcpp::Shdr<32, big_endian> shdr(pshdrs + shndx * shdr_size);
6823
          unsigned int text_shndx = elfcpp::SHN_UNDEF;
6824
          Reloc_map::const_iterator it = reloc_map.find(shndx);
6825
          if (it != reloc_map.end())
6826
            find_linked_text_section(pshdrs + it->second * shdr_size,
6827
                                     psyms, &text_shndx);
6828
          elfcpp::Shdr<32, big_endian> text_shdr(pshdrs
6829
                                                 + text_shndx * shdr_size);
6830
          this->make_exidx_input_section(shndx, shdr, text_shndx, text_shdr);
6831
        }
6832
    }
6833
}
6834
 
6835
// Process relocations for garbage collection.  The ARM target uses .ARM.exidx
6836
// sections for unwinding.  These sections are referenced implicitly by 
6837
// text sections linked in the section headers.  If we ignore these implicit
6838
// references, the .ARM.exidx sections and any .ARM.extab sections they use
6839
// will be garbage-collected incorrectly.  Hence we override the same function
6840
// in the base class to handle these implicit references.
6841
 
6842
template<bool big_endian>
6843
void
6844
Arm_relobj<big_endian>::do_gc_process_relocs(Symbol_table* symtab,
6845
                                             Layout* layout,
6846
                                             Read_relocs_data* rd)
6847
{
6848
  // First, call base class method to process relocations in this object.
6849
  Sized_relobj_file<32, big_endian>::do_gc_process_relocs(symtab, layout, rd);
6850
 
6851
  // If --gc-sections is not specified, there is nothing more to do.
6852
  // This happens when --icf is used but --gc-sections is not.
6853
  if (!parameters->options().gc_sections())
6854
    return;
6855
 
6856
  unsigned int shnum = this->shnum();
6857
  const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6858
  const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
6859
                                               shnum * shdr_size,
6860
                                               true, true);
6861
 
6862
  // Scan section headers for sections of type SHT_ARM_EXIDX.  Add references
6863
  // to these from the linked text sections.
6864
  const unsigned char* ps = pshdrs + shdr_size;
6865
  for (unsigned int i = 1; i < shnum; ++i, ps += shdr_size)
6866
    {
6867
      elfcpp::Shdr<32, big_endian> shdr(ps);
6868
      if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
6869
        {
6870
          // Found an .ARM.exidx section, add it to the set of reachable
6871
          // sections from its linked text section.
6872
          unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
6873
          symtab->gc()->add_reference(this, text_shndx, this, i);
6874
        }
6875
    }
6876
}
6877
 
6878
// Update output local symbol count.  Owing to EXIDX entry merging, some local
6879
// symbols  will be removed in output.  Adjust output local symbol count
6880
// accordingly.  We can only changed the static output local symbol count.  It
6881
// is too late to change the dynamic symbols.
6882
 
6883
template<bool big_endian>
6884
void
6885
Arm_relobj<big_endian>::update_output_local_symbol_count()
6886
{
6887
  // Caller should check that this needs updating.  We want caller checking
6888
  // because output_local_symbol_count_needs_update() is most likely inlined.
6889
  gold_assert(this->output_local_symbol_count_needs_update_);
6890
 
6891
  gold_assert(this->symtab_shndx() != -1U);
6892
  if (this->symtab_shndx() == 0)
6893
    {
6894
      // This object has no symbols.  Weird but legal.
6895
      return;
6896
    }
6897
 
6898
  // Read the symbol table section header.
6899
  const unsigned int symtab_shndx = this->symtab_shndx();
6900
  elfcpp::Shdr<32, big_endian>
6901
    symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6902
  gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6903
 
6904
  // Read the local symbols.
6905
  const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6906
  const unsigned int loccount = this->local_symbol_count();
6907
  gold_assert(loccount == symtabshdr.get_sh_info());
6908
  off_t locsize = loccount * sym_size;
6909
  const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6910
                                              locsize, true, true);
6911
 
6912
  // Loop over the local symbols.
6913
 
6914
  typedef typename Sized_relobj_file<32, big_endian>::Output_sections
6915
     Output_sections;
6916
  const Output_sections& out_sections(this->output_sections());
6917
  unsigned int shnum = this->shnum();
6918
  unsigned int count = 0;
6919
  // Skip the first, dummy, symbol.
6920
  psyms += sym_size;
6921
  for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
6922
    {
6923
      elfcpp::Sym<32, big_endian> sym(psyms);
6924
 
6925
      Symbol_value<32>& lv((*this->local_values())[i]);
6926
 
6927
      // This local symbol was already discarded by do_count_local_symbols.
6928
      if (lv.is_output_symtab_index_set() && !lv.has_output_symtab_entry())
6929
        continue;
6930
 
6931
      bool is_ordinary;
6932
      unsigned int shndx = this->adjust_sym_shndx(i, sym.get_st_shndx(),
6933
                                                  &is_ordinary);
6934
 
6935
      if (shndx < shnum)
6936
        {
6937
          Output_section* os = out_sections[shndx];
6938
 
6939
          // This local symbol no longer has an output section.  Discard it.
6940
          if (os == NULL)
6941
            {
6942
              lv.set_no_output_symtab_entry();
6943
              continue;
6944
            }
6945
 
6946
          // Currently we only discard parts of EXIDX input sections.
6947
          // We explicitly check for a merged EXIDX input section to avoid
6948
          // calling Output_section_data::output_offset unless necessary.
6949
          if ((this->get_output_section_offset(shndx) == invalid_address)
6950
              && (this->exidx_input_section_by_shndx(shndx) != NULL))
6951
            {
6952
              section_offset_type output_offset =
6953
                os->output_offset(this, shndx, lv.input_value());
6954
              if (output_offset == -1)
6955
                {
6956
                  // This symbol is defined in a part of an EXIDX input section
6957
                  // that is discarded due to entry merging.
6958
                  lv.set_no_output_symtab_entry();
6959
                  continue;
6960
                }
6961
            }
6962
        }
6963
 
6964
      ++count;
6965
    }
6966
 
6967
  this->set_output_local_symbol_count(count);
6968
  this->output_local_symbol_count_needs_update_ = false;
6969
}
6970
 
6971
// Arm_dynobj methods.
6972
 
6973
// Read the symbol information.
6974
 
6975
template<bool big_endian>
6976
void
6977
Arm_dynobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
6978
{
6979
  // Call parent class to read symbol information.
6980
  Sized_dynobj<32, big_endian>::do_read_symbols(sd);
6981
 
6982
  // Read processor-specific flags in ELF file header.
6983
  const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
6984
                                              elfcpp::Elf_sizes<32>::ehdr_size,
6985
                                              true, false);
6986
  elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
6987
  this->processor_specific_flags_ = ehdr.get_e_flags();
6988
 
6989
  // Read the attributes section if there is one.
6990
  // We read from the end because gas seems to put it near the end of
6991
  // the section headers.
6992
  const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6993
  const unsigned char* ps =
6994
    sd->section_headers->data() + shdr_size * (this->shnum() - 1);
6995
  for (unsigned int i = this->shnum(); i > 0; --i, ps -= shdr_size)
6996
    {
6997
      elfcpp::Shdr<32, big_endian> shdr(ps);
6998
      if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
6999
        {
7000
          section_offset_type section_offset = shdr.get_sh_offset();
7001
          section_size_type section_size =
7002
            convert_to_section_size_type(shdr.get_sh_size());
7003
          const unsigned char* view =
7004
            this->get_view(section_offset, section_size, true, false);
7005
          this->attributes_section_data_ =
7006
            new Attributes_section_data(view, section_size);
7007
          break;
7008
        }
7009
    }
7010
}
7011
 
7012
// Stub_addend_reader methods.
7013
 
7014
// Read the addend of a REL relocation of type R_TYPE at VIEW.
7015
 
7016
template<bool big_endian>
7017
elfcpp::Elf_types<32>::Elf_Swxword
7018
Stub_addend_reader<elfcpp::SHT_REL, big_endian>::operator()(
7019
    unsigned int r_type,
7020
    const unsigned char* view,
7021
    const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const
7022
{
7023
  typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
7024
 
7025
  switch (r_type)
7026
    {
7027
    case elfcpp::R_ARM_CALL:
7028
    case elfcpp::R_ARM_JUMP24:
7029
    case elfcpp::R_ARM_PLT32:
7030
      {
7031
        typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
7032
        const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7033
        Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
7034
        return utils::sign_extend<26>(val << 2);
7035
      }
7036
 
7037
    case elfcpp::R_ARM_THM_CALL:
7038
    case elfcpp::R_ARM_THM_JUMP24:
7039
    case elfcpp::R_ARM_THM_XPC22:
7040
      {
7041
        typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
7042
        const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7043
        Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
7044
        Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
7045
        return RelocFuncs::thumb32_branch_offset(upper_insn, lower_insn);
7046
      }
7047
 
7048
    case elfcpp::R_ARM_THM_JUMP19:
7049
      {
7050
        typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
7051
        const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7052
        Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
7053
        Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
7054
        return RelocFuncs::thumb32_cond_branch_offset(upper_insn, lower_insn);
7055
      }
7056
 
7057
    default:
7058
      gold_unreachable();
7059
    }
7060
}
7061
 
7062
// Arm_output_data_got methods.
7063
 
7064
// Add a GOT pair for R_ARM_TLS_GD32.  The creates a pair of GOT entries.
7065
// The first one is initialized to be 1, which is the module index for
7066
// the main executable and the second one 0.  A reloc of the type
7067
// R_ARM_TLS_DTPOFF32 will be created for the second GOT entry and will
7068
// be applied by gold.  GSYM is a global symbol.
7069
//
7070
template<bool big_endian>
7071
void
7072
Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
7073
    unsigned int got_type,
7074
    Symbol* gsym)
7075
{
7076
  if (gsym->has_got_offset(got_type))
7077
    return;
7078
 
7079
  // We are doing a static link.  Just mark it as belong to module 1,
7080
  // the executable.
7081
  unsigned int got_offset = this->add_constant(1);
7082
  gsym->set_got_offset(got_type, got_offset);
7083
  got_offset = this->add_constant(0);
7084
  this->static_relocs_.push_back(Static_reloc(got_offset,
7085
                                              elfcpp::R_ARM_TLS_DTPOFF32,
7086
                                              gsym));
7087
}
7088
 
7089
// Same as the above but for a local symbol.
7090
 
7091
template<bool big_endian>
7092
void
7093
Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
7094
  unsigned int got_type,
7095
  Sized_relobj_file<32, big_endian>* object,
7096
  unsigned int index)
7097
{
7098
  if (object->local_has_got_offset(index, got_type))
7099
    return;
7100
 
7101
  // We are doing a static link.  Just mark it as belong to module 1,
7102
  // the executable.
7103
  unsigned int got_offset = this->add_constant(1);
7104
  object->set_local_got_offset(index, got_type, got_offset);
7105
  got_offset = this->add_constant(0);
7106
  this->static_relocs_.push_back(Static_reloc(got_offset,
7107
                                              elfcpp::R_ARM_TLS_DTPOFF32,
7108
                                              object, index));
7109
}
7110
 
7111
template<bool big_endian>
7112
void
7113
Arm_output_data_got<big_endian>::do_write(Output_file* of)
7114
{
7115
  // Call parent to write out GOT.
7116
  Output_data_got<32, big_endian>::do_write(of);
7117
 
7118
  // We are done if there is no fix up.
7119
  if (this->static_relocs_.empty())
7120
    return;
7121
 
7122
  gold_assert(parameters->doing_static_link());
7123
 
7124
  const off_t offset = this->offset();
7125
  const section_size_type oview_size =
7126
    convert_to_section_size_type(this->data_size());
7127
  unsigned char* const oview = of->get_output_view(offset, oview_size);
7128
 
7129
  Output_segment* tls_segment = this->layout_->tls_segment();
7130
  gold_assert(tls_segment != NULL);
7131
 
7132
  // The thread pointer $tp points to the TCB, which is followed by the
7133
  // TLS.  So we need to adjust $tp relative addressing by this amount.
7134
  Arm_address aligned_tcb_size =
7135
    align_address(ARM_TCB_SIZE, tls_segment->maximum_alignment());
7136
 
7137
  for (size_t i = 0; i < this->static_relocs_.size(); ++i)
7138
    {
7139
      Static_reloc& reloc(this->static_relocs_[i]);
7140
 
7141
      Arm_address value;
7142
      if (!reloc.symbol_is_global())
7143
        {
7144
          Sized_relobj_file<32, big_endian>* object = reloc.relobj();
7145
          const Symbol_value<32>* psymval =
7146
            reloc.relobj()->local_symbol(reloc.index());
7147
 
7148
          // We are doing static linking.  Issue an error and skip this
7149
          // relocation if the symbol is undefined or in a discarded_section.
7150
          bool is_ordinary;
7151
          unsigned int shndx = psymval->input_shndx(&is_ordinary);
7152
          if ((shndx == elfcpp::SHN_UNDEF)
7153
              || (is_ordinary
7154
                  && shndx != elfcpp::SHN_UNDEF
7155
                  && !object->is_section_included(shndx)
7156
                  && !this->symbol_table_->is_section_folded(object, shndx)))
7157
            {
7158
              gold_error(_("undefined or discarded local symbol %u from "
7159
                           " object %s in GOT"),
7160
                         reloc.index(), reloc.relobj()->name().c_str());
7161
              continue;
7162
            }
7163
 
7164
          value = psymval->value(object, 0);
7165
        }
7166
      else
7167
        {
7168
          const Symbol* gsym = reloc.symbol();
7169
          gold_assert(gsym != NULL);
7170
          if (gsym->is_forwarder())
7171
            gsym = this->symbol_table_->resolve_forwards(gsym);
7172
 
7173
          // We are doing static linking.  Issue an error and skip this
7174
          // relocation if the symbol is undefined or in a discarded_section
7175
          // unless it is a weakly_undefined symbol.
7176
          if ((gsym->is_defined_in_discarded_section()
7177
               || gsym->is_undefined())
7178
              && !gsym->is_weak_undefined())
7179
            {
7180
              gold_error(_("undefined or discarded symbol %s in GOT"),
7181
                         gsym->name());
7182
              continue;
7183
            }
7184
 
7185
          if (!gsym->is_weak_undefined())
7186
            {
7187
              const Sized_symbol<32>* sym =
7188
                static_cast<const Sized_symbol<32>*>(gsym);
7189
              value = sym->value();
7190
            }
7191
          else
7192
              value = 0;
7193
        }
7194
 
7195
      unsigned got_offset = reloc.got_offset();
7196
      gold_assert(got_offset < oview_size);
7197
 
7198
      typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
7199
      Valtype* wv = reinterpret_cast<Valtype*>(oview + got_offset);
7200
      Valtype x;
7201
      switch (reloc.r_type())
7202
        {
7203
        case elfcpp::R_ARM_TLS_DTPOFF32:
7204
          x = value;
7205
          break;
7206
        case elfcpp::R_ARM_TLS_TPOFF32:
7207
          x = value + aligned_tcb_size;
7208
          break;
7209
        default:
7210
          gold_unreachable();
7211
        }
7212
      elfcpp::Swap<32, big_endian>::writeval(wv, x);
7213
    }
7214
 
7215
  of->write_output_view(offset, oview_size, oview);
7216
}
7217
 
7218
// A class to handle the PLT data.
7219
 
7220
template<bool big_endian>
7221
class Output_data_plt_arm : public Output_section_data
7222
{
7223
 public:
7224
  typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
7225
    Reloc_section;
7226
 
7227
  Output_data_plt_arm(Layout*, Output_data_space*);
7228
 
7229
  // Add an entry to the PLT.
7230
  void
7231
  add_entry(Symbol* gsym);
7232
 
7233
  // Return the .rel.plt section data.
7234
  const Reloc_section*
7235
  rel_plt() const
7236
  { return this->rel_; }
7237
 
7238
  // Return the number of PLT entries.
7239
  unsigned int
7240
  entry_count() const
7241
  { return this->count_; }
7242
 
7243
  // Return the offset of the first non-reserved PLT entry.
7244
  static unsigned int
7245
  first_plt_entry_offset()
7246
  { return sizeof(first_plt_entry); }
7247
 
7248
  // Return the size of a PLT entry.
7249
  static unsigned int
7250
  get_plt_entry_size()
7251
  { return sizeof(plt_entry); }
7252
 
7253
 protected:
7254
  void
7255
  do_adjust_output_section(Output_section* os);
7256
 
7257
  // Write to a map file.
7258
  void
7259
  do_print_to_mapfile(Mapfile* mapfile) const
7260
  { mapfile->print_output_data(this, _("** PLT")); }
7261
 
7262
 private:
7263
  // Template for the first PLT entry.
7264
  static const uint32_t first_plt_entry[5];
7265
 
7266
  // Template for subsequent PLT entries. 
7267
  static const uint32_t plt_entry[3];
7268
 
7269
  // Set the final size.
7270
  void
7271
  set_final_data_size()
7272
  {
7273
    this->set_data_size(sizeof(first_plt_entry)
7274
                        + this->count_ * sizeof(plt_entry));
7275
  }
7276
 
7277
  // Write out the PLT data.
7278
  void
7279
  do_write(Output_file*);
7280
 
7281
  // The reloc section.
7282
  Reloc_section* rel_;
7283
  // The .got.plt section.
7284
  Output_data_space* got_plt_;
7285
  // The number of PLT entries.
7286
  unsigned int count_;
7287
};
7288
 
7289
// Create the PLT section.  The ordinary .got section is an argument,
7290
// since we need to refer to the start.  We also create our own .got
7291
// section just for PLT entries.
7292
 
7293
template<bool big_endian>
7294
Output_data_plt_arm<big_endian>::Output_data_plt_arm(Layout* layout,
7295
                                                     Output_data_space* got_plt)
7296
  : Output_section_data(4), got_plt_(got_plt), count_(0)
7297
{
7298
  this->rel_ = new Reloc_section(false);
7299
  layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
7300
                                  elfcpp::SHF_ALLOC, this->rel_,
7301
                                  ORDER_DYNAMIC_PLT_RELOCS, false);
7302
}
7303
 
7304
template<bool big_endian>
7305
void
7306
Output_data_plt_arm<big_endian>::do_adjust_output_section(Output_section* os)
7307
{
7308
  os->set_entsize(0);
7309
}
7310
 
7311
// Add an entry to the PLT.
7312
 
7313
template<bool big_endian>
7314
void
7315
Output_data_plt_arm<big_endian>::add_entry(Symbol* gsym)
7316
{
7317
  gold_assert(!gsym->has_plt_offset());
7318
 
7319
  // Note that when setting the PLT offset we skip the initial
7320
  // reserved PLT entry.
7321
  gsym->set_plt_offset((this->count_) * sizeof(plt_entry)
7322
                       + sizeof(first_plt_entry));
7323
 
7324
  ++this->count_;
7325
 
7326
  section_offset_type got_offset = this->got_plt_->current_data_size();
7327
 
7328
  // Every PLT entry needs a GOT entry which points back to the PLT
7329
  // entry (this will be changed by the dynamic linker, normally
7330
  // lazily when the function is called).
7331
  this->got_plt_->set_current_data_size(got_offset + 4);
7332
 
7333
  // Every PLT entry needs a reloc.
7334
  gsym->set_needs_dynsym_entry();
7335
  this->rel_->add_global(gsym, elfcpp::R_ARM_JUMP_SLOT, this->got_plt_,
7336
                         got_offset);
7337
 
7338
  // Note that we don't need to save the symbol.  The contents of the
7339
  // PLT are independent of which symbols are used.  The symbols only
7340
  // appear in the relocations.
7341
}
7342
 
7343
// ARM PLTs.
7344
// FIXME:  This is not very flexible.  Right now this has only been tested
7345
// on armv5te.  If we are to support additional architecture features like
7346
// Thumb-2 or BE8, we need to make this more flexible like GNU ld.
7347
 
7348
// The first entry in the PLT.
7349
template<bool big_endian>
7350
const uint32_t Output_data_plt_arm<big_endian>::first_plt_entry[5] =
7351
{
7352
  0xe52de004,   // str   lr, [sp, #-4]!
7353
  0xe59fe004,   // ldr   lr, [pc, #4]
7354
  0xe08fe00e,   // add   lr, pc, lr 
7355
  0xe5bef008,   // ldr   pc, [lr, #8]!
7356
  0x00000000,   // &GOT[0] - .
7357
};
7358
 
7359
// Subsequent entries in the PLT.
7360
 
7361
template<bool big_endian>
7362
const uint32_t Output_data_plt_arm<big_endian>::plt_entry[3] =
7363
{
7364
  0xe28fc600,   // add   ip, pc, #0xNN00000
7365
  0xe28cca00,   // add   ip, ip, #0xNN000
7366
  0xe5bcf000,   // ldr   pc, [ip, #0xNNN]!
7367
};
7368
 
7369
// Write out the PLT.  This uses the hand-coded instructions above,
7370
// and adjusts them as needed.  This is all specified by the arm ELF
7371
// Processor Supplement.
7372
 
7373
template<bool big_endian>
7374
void
7375
Output_data_plt_arm<big_endian>::do_write(Output_file* of)
7376
{
7377
  const off_t offset = this->offset();
7378
  const section_size_type oview_size =
7379
    convert_to_section_size_type(this->data_size());
7380
  unsigned char* const oview = of->get_output_view(offset, oview_size);
7381
 
7382
  const off_t got_file_offset = this->got_plt_->offset();
7383
  const section_size_type got_size =
7384
    convert_to_section_size_type(this->got_plt_->data_size());
7385
  unsigned char* const got_view = of->get_output_view(got_file_offset,
7386
                                                      got_size);
7387
  unsigned char* pov = oview;
7388
 
7389
  Arm_address plt_address = this->address();
7390
  Arm_address got_address = this->got_plt_->address();
7391
 
7392
  // Write first PLT entry.  All but the last word are constants.
7393
  const size_t num_first_plt_words = (sizeof(first_plt_entry)
7394
                                      / sizeof(plt_entry[0]));
7395
  for (size_t i = 0; i < num_first_plt_words - 1; i++)
7396
    elfcpp::Swap<32, big_endian>::writeval(pov + i * 4, first_plt_entry[i]);
7397
  // Last word in first PLT entry is &GOT[0] - .
7398
  elfcpp::Swap<32, big_endian>::writeval(pov + 16,
7399
                                         got_address - (plt_address + 16));
7400
  pov += sizeof(first_plt_entry);
7401
 
7402
  unsigned char* got_pov = got_view;
7403
 
7404
  memset(got_pov, 0, 12);
7405
  got_pov += 12;
7406
 
7407
  const int rel_size = elfcpp::Elf_sizes<32>::rel_size;
7408
  unsigned int plt_offset = sizeof(first_plt_entry);
7409
  unsigned int plt_rel_offset = 0;
7410
  unsigned int got_offset = 12;
7411
  const unsigned int count = this->count_;
7412
  for (unsigned int i = 0;
7413
       i < count;
7414
       ++i,
7415
         pov += sizeof(plt_entry),
7416
         got_pov += 4,
7417
         plt_offset += sizeof(plt_entry),
7418
         plt_rel_offset += rel_size,
7419
         got_offset += 4)
7420
    {
7421
      // Set and adjust the PLT entry itself.
7422
      int32_t offset = ((got_address + got_offset)
7423
                         - (plt_address + plt_offset + 8));
7424
 
7425
      gold_assert(offset >= 0 && offset < 0x0fffffff);
7426
      uint32_t plt_insn0 = plt_entry[0] | ((offset >> 20) & 0xff);
7427
      elfcpp::Swap<32, big_endian>::writeval(pov, plt_insn0);
7428
      uint32_t plt_insn1 = plt_entry[1] | ((offset >> 12) & 0xff);
7429
      elfcpp::Swap<32, big_endian>::writeval(pov + 4, plt_insn1);
7430
      uint32_t plt_insn2 = plt_entry[2] | (offset & 0xfff);
7431
      elfcpp::Swap<32, big_endian>::writeval(pov + 8, plt_insn2);
7432
 
7433
      // Set the entry in the GOT.
7434
      elfcpp::Swap<32, big_endian>::writeval(got_pov, plt_address);
7435
    }
7436
 
7437
  gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
7438
  gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
7439
 
7440
  of->write_output_view(offset, oview_size, oview);
7441
  of->write_output_view(got_file_offset, got_size, got_view);
7442
}
7443
 
7444
// Create a PLT entry for a global symbol.
7445
 
7446
template<bool big_endian>
7447
void
7448
Target_arm<big_endian>::make_plt_entry(Symbol_table* symtab, Layout* layout,
7449
                                       Symbol* gsym)
7450
{
7451
  if (gsym->has_plt_offset())
7452
    return;
7453
 
7454
  if (this->plt_ == NULL)
7455
    {
7456
      // Create the GOT sections first.
7457
      this->got_section(symtab, layout);
7458
 
7459
      this->plt_ = new Output_data_plt_arm<big_endian>(layout, this->got_plt_);
7460
      layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
7461
                                      (elfcpp::SHF_ALLOC
7462
                                       | elfcpp::SHF_EXECINSTR),
7463
                                      this->plt_, ORDER_PLT, false);
7464
    }
7465
  this->plt_->add_entry(gsym);
7466
}
7467
 
7468
// Return the number of entries in the PLT.
7469
 
7470
template<bool big_endian>
7471
unsigned int
7472
Target_arm<big_endian>::plt_entry_count() const
7473
{
7474
  if (this->plt_ == NULL)
7475
    return 0;
7476
  return this->plt_->entry_count();
7477
}
7478
 
7479
// Return the offset of the first non-reserved PLT entry.
7480
 
7481
template<bool big_endian>
7482
unsigned int
7483
Target_arm<big_endian>::first_plt_entry_offset() const
7484
{
7485
  return Output_data_plt_arm<big_endian>::first_plt_entry_offset();
7486
}
7487
 
7488
// Return the size of each PLT entry.
7489
 
7490
template<bool big_endian>
7491
unsigned int
7492
Target_arm<big_endian>::plt_entry_size() const
7493
{
7494
  return Output_data_plt_arm<big_endian>::get_plt_entry_size();
7495
}
7496
 
7497
// Get the section to use for TLS_DESC relocations.
7498
 
7499
template<bool big_endian>
7500
typename Target_arm<big_endian>::Reloc_section*
7501
Target_arm<big_endian>::rel_tls_desc_section(Layout* layout) const
7502
{
7503
  return this->plt_section()->rel_tls_desc(layout);
7504
}
7505
 
7506
// Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
7507
 
7508
template<bool big_endian>
7509
void
7510
Target_arm<big_endian>::define_tls_base_symbol(
7511
    Symbol_table* symtab,
7512
    Layout* layout)
7513
{
7514
  if (this->tls_base_symbol_defined_)
7515
    return;
7516
 
7517
  Output_segment* tls_segment = layout->tls_segment();
7518
  if (tls_segment != NULL)
7519
    {
7520
      bool is_exec = parameters->options().output_is_executable();
7521
      symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL,
7522
                                       Symbol_table::PREDEFINED,
7523
                                       tls_segment, 0, 0,
7524
                                       elfcpp::STT_TLS,
7525
                                       elfcpp::STB_LOCAL,
7526
                                       elfcpp::STV_HIDDEN, 0,
7527
                                       (is_exec
7528
                                        ? Symbol::SEGMENT_END
7529
                                        : Symbol::SEGMENT_START),
7530
                                       true);
7531
    }
7532
  this->tls_base_symbol_defined_ = true;
7533
}
7534
 
7535
// Create a GOT entry for the TLS module index.
7536
 
7537
template<bool big_endian>
7538
unsigned int
7539
Target_arm<big_endian>::got_mod_index_entry(
7540
    Symbol_table* symtab,
7541
    Layout* layout,
7542
    Sized_relobj_file<32, big_endian>* object)
7543
{
7544
  if (this->got_mod_index_offset_ == -1U)
7545
    {
7546
      gold_assert(symtab != NULL && layout != NULL && object != NULL);
7547
      Arm_output_data_got<big_endian>* got = this->got_section(symtab, layout);
7548
      unsigned int got_offset;
7549
      if (!parameters->doing_static_link())
7550
        {
7551
          got_offset = got->add_constant(0);
7552
          Reloc_section* rel_dyn = this->rel_dyn_section(layout);
7553
          rel_dyn->add_local(object, 0, elfcpp::R_ARM_TLS_DTPMOD32, got,
7554
                             got_offset);
7555
        }
7556
      else
7557
        {
7558
          // We are doing a static link.  Just mark it as belong to module 1,
7559
          // the executable.
7560
          got_offset = got->add_constant(1);
7561
        }
7562
 
7563
      got->add_constant(0);
7564
      this->got_mod_index_offset_ = got_offset;
7565
    }
7566
  return this->got_mod_index_offset_;
7567
}
7568
 
7569
// Optimize the TLS relocation type based on what we know about the
7570
// symbol.  IS_FINAL is true if the final address of this symbol is
7571
// known at link time.
7572
 
7573
template<bool big_endian>
7574
tls::Tls_optimization
7575
Target_arm<big_endian>::optimize_tls_reloc(bool, int)
7576
{
7577
  // FIXME: Currently we do not do any TLS optimization.
7578
  return tls::TLSOPT_NONE;
7579
}
7580
 
7581
// Get the Reference_flags for a particular relocation.
7582
 
7583
template<bool big_endian>
7584
int
7585
Target_arm<big_endian>::Scan::get_reference_flags(unsigned int r_type)
7586
{
7587
  switch (r_type)
7588
    {
7589
    case elfcpp::R_ARM_NONE:
7590
    case elfcpp::R_ARM_V4BX:
7591
    case elfcpp::R_ARM_GNU_VTENTRY:
7592
    case elfcpp::R_ARM_GNU_VTINHERIT:
7593
      // No symbol reference.
7594
      return 0;
7595
 
7596
    case elfcpp::R_ARM_ABS32:
7597
    case elfcpp::R_ARM_ABS16:
7598
    case elfcpp::R_ARM_ABS12:
7599
    case elfcpp::R_ARM_THM_ABS5:
7600
    case elfcpp::R_ARM_ABS8:
7601
    case elfcpp::R_ARM_BASE_ABS:
7602
    case elfcpp::R_ARM_MOVW_ABS_NC:
7603
    case elfcpp::R_ARM_MOVT_ABS:
7604
    case elfcpp::R_ARM_THM_MOVW_ABS_NC:
7605
    case elfcpp::R_ARM_THM_MOVT_ABS:
7606
    case elfcpp::R_ARM_ABS32_NOI:
7607
      return Symbol::ABSOLUTE_REF;
7608
 
7609
    case elfcpp::R_ARM_REL32:
7610
    case elfcpp::R_ARM_LDR_PC_G0:
7611
    case elfcpp::R_ARM_SBREL32:
7612
    case elfcpp::R_ARM_THM_PC8:
7613
    case elfcpp::R_ARM_BASE_PREL:
7614
    case elfcpp::R_ARM_MOVW_PREL_NC:
7615
    case elfcpp::R_ARM_MOVT_PREL:
7616
    case elfcpp::R_ARM_THM_MOVW_PREL_NC:
7617
    case elfcpp::R_ARM_THM_MOVT_PREL:
7618
    case elfcpp::R_ARM_THM_ALU_PREL_11_0:
7619
    case elfcpp::R_ARM_THM_PC12:
7620
    case elfcpp::R_ARM_REL32_NOI:
7621
    case elfcpp::R_ARM_ALU_PC_G0_NC:
7622
    case elfcpp::R_ARM_ALU_PC_G0:
7623
    case elfcpp::R_ARM_ALU_PC_G1_NC:
7624
    case elfcpp::R_ARM_ALU_PC_G1:
7625
    case elfcpp::R_ARM_ALU_PC_G2:
7626
    case elfcpp::R_ARM_LDR_PC_G1:
7627
    case elfcpp::R_ARM_LDR_PC_G2:
7628
    case elfcpp::R_ARM_LDRS_PC_G0:
7629
    case elfcpp::R_ARM_LDRS_PC_G1:
7630
    case elfcpp::R_ARM_LDRS_PC_G2:
7631
    case elfcpp::R_ARM_LDC_PC_G0:
7632
    case elfcpp::R_ARM_LDC_PC_G1:
7633
    case elfcpp::R_ARM_LDC_PC_G2:
7634
    case elfcpp::R_ARM_ALU_SB_G0_NC:
7635
    case elfcpp::R_ARM_ALU_SB_G0:
7636
    case elfcpp::R_ARM_ALU_SB_G1_NC:
7637
    case elfcpp::R_ARM_ALU_SB_G1:
7638
    case elfcpp::R_ARM_ALU_SB_G2:
7639
    case elfcpp::R_ARM_LDR_SB_G0:
7640
    case elfcpp::R_ARM_LDR_SB_G1:
7641
    case elfcpp::R_ARM_LDR_SB_G2:
7642
    case elfcpp::R_ARM_LDRS_SB_G0:
7643
    case elfcpp::R_ARM_LDRS_SB_G1:
7644
    case elfcpp::R_ARM_LDRS_SB_G2:
7645
    case elfcpp::R_ARM_LDC_SB_G0:
7646
    case elfcpp::R_ARM_LDC_SB_G1:
7647
    case elfcpp::R_ARM_LDC_SB_G2:
7648
    case elfcpp::R_ARM_MOVW_BREL_NC:
7649
    case elfcpp::R_ARM_MOVT_BREL:
7650
    case elfcpp::R_ARM_MOVW_BREL:
7651
    case elfcpp::R_ARM_THM_MOVW_BREL_NC:
7652
    case elfcpp::R_ARM_THM_MOVT_BREL:
7653
    case elfcpp::R_ARM_THM_MOVW_BREL:
7654
    case elfcpp::R_ARM_GOTOFF32:
7655
    case elfcpp::R_ARM_GOTOFF12:
7656
    case elfcpp::R_ARM_SBREL31:
7657
      return Symbol::RELATIVE_REF;
7658
 
7659
    case elfcpp::R_ARM_PLT32:
7660
    case elfcpp::R_ARM_CALL:
7661
    case elfcpp::R_ARM_JUMP24:
7662
    case elfcpp::R_ARM_THM_CALL:
7663
    case elfcpp::R_ARM_THM_JUMP24:
7664
    case elfcpp::R_ARM_THM_JUMP19:
7665
    case elfcpp::R_ARM_THM_JUMP6:
7666
    case elfcpp::R_ARM_THM_JUMP11:
7667
    case elfcpp::R_ARM_THM_JUMP8:
7668
    // R_ARM_PREL31 is not used to relocate call/jump instructions but
7669
    // in unwind tables. It may point to functions via PLTs.
7670
    // So we treat it like call/jump relocations above.
7671
    case elfcpp::R_ARM_PREL31:
7672
      return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF;
7673
 
7674
    case elfcpp::R_ARM_GOT_BREL:
7675
    case elfcpp::R_ARM_GOT_ABS:
7676
    case elfcpp::R_ARM_GOT_PREL:
7677
      // Absolute in GOT.
7678
      return Symbol::ABSOLUTE_REF;
7679
 
7680
    case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
7681
    case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
7682
    case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
7683
    case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
7684
    case elfcpp::R_ARM_TLS_LE32:        // Local-exec
7685
      return Symbol::TLS_REF;
7686
 
7687
    case elfcpp::R_ARM_TARGET1:
7688
    case elfcpp::R_ARM_TARGET2:
7689
    case elfcpp::R_ARM_COPY:
7690
    case elfcpp::R_ARM_GLOB_DAT:
7691
    case elfcpp::R_ARM_JUMP_SLOT:
7692
    case elfcpp::R_ARM_RELATIVE:
7693
    case elfcpp::R_ARM_PC24:
7694
    case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
7695
    case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
7696
    case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
7697
    default:
7698
      // Not expected.  We will give an error later.
7699
      return 0;
7700
    }
7701
}
7702
 
7703
// Report an unsupported relocation against a local symbol.
7704
 
7705
template<bool big_endian>
7706
void
7707
Target_arm<big_endian>::Scan::unsupported_reloc_local(
7708
    Sized_relobj_file<32, big_endian>* object,
7709
    unsigned int r_type)
7710
{
7711
  gold_error(_("%s: unsupported reloc %u against local symbol"),
7712
             object->name().c_str(), r_type);
7713
}
7714
 
7715
// We are about to emit a dynamic relocation of type R_TYPE.  If the
7716
// dynamic linker does not support it, issue an error.  The GNU linker
7717
// only issues a non-PIC error for an allocated read-only section.
7718
// Here we know the section is allocated, but we don't know that it is
7719
// read-only.  But we check for all the relocation types which the
7720
// glibc dynamic linker supports, so it seems appropriate to issue an
7721
// error even if the section is not read-only.
7722
 
7723
template<bool big_endian>
7724
void
7725
Target_arm<big_endian>::Scan::check_non_pic(Relobj* object,
7726
                                            unsigned int r_type)
7727
{
7728
  switch (r_type)
7729
    {
7730
    // These are the relocation types supported by glibc for ARM.
7731
    case elfcpp::R_ARM_RELATIVE:
7732
    case elfcpp::R_ARM_COPY:
7733
    case elfcpp::R_ARM_GLOB_DAT:
7734
    case elfcpp::R_ARM_JUMP_SLOT:
7735
    case elfcpp::R_ARM_ABS32:
7736
    case elfcpp::R_ARM_ABS32_NOI:
7737
    case elfcpp::R_ARM_PC24:
7738
    // FIXME: The following 3 types are not supported by Android's dynamic
7739
    // linker.
7740
    case elfcpp::R_ARM_TLS_DTPMOD32:
7741
    case elfcpp::R_ARM_TLS_DTPOFF32:
7742
    case elfcpp::R_ARM_TLS_TPOFF32:
7743
      return;
7744
 
7745
    default:
7746
      {
7747
        // This prevents us from issuing more than one error per reloc
7748
        // section.  But we can still wind up issuing more than one
7749
        // error per object file.
7750
        if (this->issued_non_pic_error_)
7751
          return;
7752
        const Arm_reloc_property* reloc_property =
7753
          arm_reloc_property_table->get_reloc_property(r_type);
7754
        gold_assert(reloc_property != NULL);
7755
        object->error(_("requires unsupported dynamic reloc %s; "
7756
                      "recompile with -fPIC"),
7757
                      reloc_property->name().c_str());
7758
        this->issued_non_pic_error_ = true;
7759
        return;
7760
      }
7761
 
7762
    case elfcpp::R_ARM_NONE:
7763
      gold_unreachable();
7764
    }
7765
}
7766
 
7767
// Scan a relocation for a local symbol.
7768
// FIXME: This only handles a subset of relocation types used by Android
7769
// on ARM v5te devices.
7770
 
7771
template<bool big_endian>
7772
inline void
7773
Target_arm<big_endian>::Scan::local(Symbol_table* symtab,
7774
                                    Layout* layout,
7775
                                    Target_arm* target,
7776
                                    Sized_relobj_file<32, big_endian>* object,
7777
                                    unsigned int data_shndx,
7778
                                    Output_section* output_section,
7779
                                    const elfcpp::Rel<32, big_endian>& reloc,
7780
                                    unsigned int r_type,
7781
                                    const elfcpp::Sym<32, big_endian>& lsym)
7782
{
7783
  r_type = get_real_reloc_type(r_type);
7784
  switch (r_type)
7785
    {
7786
    case elfcpp::R_ARM_NONE:
7787
    case elfcpp::R_ARM_V4BX:
7788
    case elfcpp::R_ARM_GNU_VTENTRY:
7789
    case elfcpp::R_ARM_GNU_VTINHERIT:
7790
      break;
7791
 
7792
    case elfcpp::R_ARM_ABS32:
7793
    case elfcpp::R_ARM_ABS32_NOI:
7794
      // If building a shared library (or a position-independent
7795
      // executable), we need to create a dynamic relocation for
7796
      // this location. The relocation applied at link time will
7797
      // apply the link-time value, so we flag the location with
7798
      // an R_ARM_RELATIVE relocation so the dynamic loader can
7799
      // relocate it easily.
7800
      if (parameters->options().output_is_position_independent())
7801
        {
7802
          Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7803
          unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7804
          // If we are to add more other reloc types than R_ARM_ABS32,
7805
          // we need to add check_non_pic(object, r_type) here.
7806
          rel_dyn->add_local_relative(object, r_sym, elfcpp::R_ARM_RELATIVE,
7807
                                      output_section, data_shndx,
7808
                                      reloc.get_r_offset());
7809
        }
7810
      break;
7811
 
7812
    case elfcpp::R_ARM_ABS16:
7813
    case elfcpp::R_ARM_ABS12:
7814
    case elfcpp::R_ARM_THM_ABS5:
7815
    case elfcpp::R_ARM_ABS8:
7816
    case elfcpp::R_ARM_BASE_ABS:
7817
    case elfcpp::R_ARM_MOVW_ABS_NC:
7818
    case elfcpp::R_ARM_MOVT_ABS:
7819
    case elfcpp::R_ARM_THM_MOVW_ABS_NC:
7820
    case elfcpp::R_ARM_THM_MOVT_ABS:
7821
      // If building a shared library (or a position-independent
7822
      // executable), we need to create a dynamic relocation for
7823
      // this location. Because the addend needs to remain in the
7824
      // data section, we need to be careful not to apply this
7825
      // relocation statically.
7826
      if (parameters->options().output_is_position_independent())
7827
        {
7828
          check_non_pic(object, r_type);
7829
          Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7830
          unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7831
          if (lsym.get_st_type() != elfcpp::STT_SECTION)
7832
            rel_dyn->add_local(object, r_sym, r_type, output_section,
7833
                               data_shndx, reloc.get_r_offset());
7834
          else
7835
            {
7836
              gold_assert(lsym.get_st_value() == 0);
7837
              unsigned int shndx = lsym.get_st_shndx();
7838
              bool is_ordinary;
7839
              shndx = object->adjust_sym_shndx(r_sym, shndx,
7840
                                               &is_ordinary);
7841
              if (!is_ordinary)
7842
                object->error(_("section symbol %u has bad shndx %u"),
7843
                              r_sym, shndx);
7844
              else
7845
                rel_dyn->add_local_section(object, shndx,
7846
                                           r_type, output_section,
7847
                                           data_shndx, reloc.get_r_offset());
7848
            }
7849
        }
7850
      break;
7851
 
7852
    case elfcpp::R_ARM_REL32:
7853
    case elfcpp::R_ARM_LDR_PC_G0:
7854
    case elfcpp::R_ARM_SBREL32:
7855
    case elfcpp::R_ARM_THM_CALL:
7856
    case elfcpp::R_ARM_THM_PC8:
7857
    case elfcpp::R_ARM_BASE_PREL:
7858
    case elfcpp::R_ARM_PLT32:
7859
    case elfcpp::R_ARM_CALL:
7860
    case elfcpp::R_ARM_JUMP24:
7861
    case elfcpp::R_ARM_THM_JUMP24:
7862
    case elfcpp::R_ARM_SBREL31:
7863
    case elfcpp::R_ARM_PREL31:
7864
    case elfcpp::R_ARM_MOVW_PREL_NC:
7865
    case elfcpp::R_ARM_MOVT_PREL:
7866
    case elfcpp::R_ARM_THM_MOVW_PREL_NC:
7867
    case elfcpp::R_ARM_THM_MOVT_PREL:
7868
    case elfcpp::R_ARM_THM_JUMP19:
7869
    case elfcpp::R_ARM_THM_JUMP6:
7870
    case elfcpp::R_ARM_THM_ALU_PREL_11_0:
7871
    case elfcpp::R_ARM_THM_PC12:
7872
    case elfcpp::R_ARM_REL32_NOI:
7873
    case elfcpp::R_ARM_ALU_PC_G0_NC:
7874
    case elfcpp::R_ARM_ALU_PC_G0:
7875
    case elfcpp::R_ARM_ALU_PC_G1_NC:
7876
    case elfcpp::R_ARM_ALU_PC_G1:
7877
    case elfcpp::R_ARM_ALU_PC_G2:
7878
    case elfcpp::R_ARM_LDR_PC_G1:
7879
    case elfcpp::R_ARM_LDR_PC_G2:
7880
    case elfcpp::R_ARM_LDRS_PC_G0:
7881
    case elfcpp::R_ARM_LDRS_PC_G1:
7882
    case elfcpp::R_ARM_LDRS_PC_G2:
7883
    case elfcpp::R_ARM_LDC_PC_G0:
7884
    case elfcpp::R_ARM_LDC_PC_G1:
7885
    case elfcpp::R_ARM_LDC_PC_G2:
7886
    case elfcpp::R_ARM_ALU_SB_G0_NC:
7887
    case elfcpp::R_ARM_ALU_SB_G0:
7888
    case elfcpp::R_ARM_ALU_SB_G1_NC:
7889
    case elfcpp::R_ARM_ALU_SB_G1:
7890
    case elfcpp::R_ARM_ALU_SB_G2:
7891
    case elfcpp::R_ARM_LDR_SB_G0:
7892
    case elfcpp::R_ARM_LDR_SB_G1:
7893
    case elfcpp::R_ARM_LDR_SB_G2:
7894
    case elfcpp::R_ARM_LDRS_SB_G0:
7895
    case elfcpp::R_ARM_LDRS_SB_G1:
7896
    case elfcpp::R_ARM_LDRS_SB_G2:
7897
    case elfcpp::R_ARM_LDC_SB_G0:
7898
    case elfcpp::R_ARM_LDC_SB_G1:
7899
    case elfcpp::R_ARM_LDC_SB_G2:
7900
    case elfcpp::R_ARM_MOVW_BREL_NC:
7901
    case elfcpp::R_ARM_MOVT_BREL:
7902
    case elfcpp::R_ARM_MOVW_BREL:
7903
    case elfcpp::R_ARM_THM_MOVW_BREL_NC:
7904
    case elfcpp::R_ARM_THM_MOVT_BREL:
7905
    case elfcpp::R_ARM_THM_MOVW_BREL:
7906
    case elfcpp::R_ARM_THM_JUMP11:
7907
    case elfcpp::R_ARM_THM_JUMP8:
7908
      // We don't need to do anything for a relative addressing relocation
7909
      // against a local symbol if it does not reference the GOT.
7910
      break;
7911
 
7912
    case elfcpp::R_ARM_GOTOFF32:
7913
    case elfcpp::R_ARM_GOTOFF12:
7914
      // We need a GOT section:
7915
      target->got_section(symtab, layout);
7916
      break;
7917
 
7918
    case elfcpp::R_ARM_GOT_BREL:
7919
    case elfcpp::R_ARM_GOT_PREL:
7920
      {
7921
        // The symbol requires a GOT entry.
7922
        Arm_output_data_got<big_endian>* got =
7923
          target->got_section(symtab, layout);
7924
        unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7925
        if (got->add_local(object, r_sym, GOT_TYPE_STANDARD))
7926
          {
7927
            // If we are generating a shared object, we need to add a
7928
            // dynamic RELATIVE relocation for this symbol's GOT entry.
7929
            if (parameters->options().output_is_position_independent())
7930
              {
7931
                Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7932
                unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7933
                rel_dyn->add_local_relative(
7934
                    object, r_sym, elfcpp::R_ARM_RELATIVE, got,
7935
                    object->local_got_offset(r_sym, GOT_TYPE_STANDARD));
7936
              }
7937
          }
7938
      }
7939
      break;
7940
 
7941
    case elfcpp::R_ARM_TARGET1:
7942
    case elfcpp::R_ARM_TARGET2:
7943
      // This should have been mapped to another type already.
7944
      // Fall through.
7945
    case elfcpp::R_ARM_COPY:
7946
    case elfcpp::R_ARM_GLOB_DAT:
7947
    case elfcpp::R_ARM_JUMP_SLOT:
7948
    case elfcpp::R_ARM_RELATIVE:
7949
      // These are relocations which should only be seen by the
7950
      // dynamic linker, and should never be seen here.
7951
      gold_error(_("%s: unexpected reloc %u in object file"),
7952
                 object->name().c_str(), r_type);
7953
      break;
7954
 
7955
 
7956
      // These are initial TLS relocs, which are expected when
7957
      // linking.
7958
    case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
7959
    case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
7960
    case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
7961
    case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
7962
    case elfcpp::R_ARM_TLS_LE32:        // Local-exec
7963
      {
7964
        bool output_is_shared = parameters->options().shared();
7965
        const tls::Tls_optimization optimized_type
7966
            = Target_arm<big_endian>::optimize_tls_reloc(!output_is_shared,
7967
                                                         r_type);
7968
        switch (r_type)
7969
          {
7970
          case elfcpp::R_ARM_TLS_GD32:          // Global-dynamic
7971
            if (optimized_type == tls::TLSOPT_NONE)
7972
              {
7973
                // Create a pair of GOT entries for the module index and
7974
                // dtv-relative offset.
7975
                Arm_output_data_got<big_endian>* got
7976
                    = target->got_section(symtab, layout);
7977
                unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7978
                unsigned int shndx = lsym.get_st_shndx();
7979
                bool is_ordinary;
7980
                shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
7981
                if (!is_ordinary)
7982
                  {
7983
                    object->error(_("local symbol %u has bad shndx %u"),
7984
                                  r_sym, shndx);
7985
                    break;
7986
                  }
7987
 
7988
                if (!parameters->doing_static_link())
7989
                  got->add_local_pair_with_rel(object, r_sym, shndx,
7990
                                               GOT_TYPE_TLS_PAIR,
7991
                                               target->rel_dyn_section(layout),
7992
                                               elfcpp::R_ARM_TLS_DTPMOD32, 0);
7993
                else
7994
                  got->add_tls_gd32_with_static_reloc(GOT_TYPE_TLS_PAIR,
7995
                                                      object, r_sym);
7996
              }
7997
            else
7998
              // FIXME: TLS optimization not supported yet.
7999
              gold_unreachable();
8000
            break;
8001
 
8002
          case elfcpp::R_ARM_TLS_LDM32:         // Local-dynamic
8003
            if (optimized_type == tls::TLSOPT_NONE)
8004
              {
8005
                // Create a GOT entry for the module index.
8006
                target->got_mod_index_entry(symtab, layout, object);
8007
              }
8008
            else
8009
              // FIXME: TLS optimization not supported yet.
8010
              gold_unreachable();
8011
            break;
8012
 
8013
          case elfcpp::R_ARM_TLS_LDO32:         // Alternate local-dynamic
8014
            break;
8015
 
8016
          case elfcpp::R_ARM_TLS_IE32:          // Initial-exec
8017
            layout->set_has_static_tls();
8018
            if (optimized_type == tls::TLSOPT_NONE)
8019
              {
8020
                // Create a GOT entry for the tp-relative offset.
8021
                Arm_output_data_got<big_endian>* got
8022
                  = target->got_section(symtab, layout);
8023
                unsigned int r_sym =
8024
                   elfcpp::elf_r_sym<32>(reloc.get_r_info());
8025
                if (!parameters->doing_static_link())
8026
                    got->add_local_with_rel(object, r_sym, GOT_TYPE_TLS_OFFSET,
8027
                                            target->rel_dyn_section(layout),
8028
                                            elfcpp::R_ARM_TLS_TPOFF32);
8029
                else if (!object->local_has_got_offset(r_sym,
8030
                                                       GOT_TYPE_TLS_OFFSET))
8031
                  {
8032
                    got->add_local(object, r_sym, GOT_TYPE_TLS_OFFSET);
8033
                    unsigned int got_offset =
8034
                      object->local_got_offset(r_sym, GOT_TYPE_TLS_OFFSET);
8035
                    got->add_static_reloc(got_offset,
8036
                                          elfcpp::R_ARM_TLS_TPOFF32, object,
8037
                                          r_sym);
8038
                  }
8039
              }
8040
            else
8041
              // FIXME: TLS optimization not supported yet.
8042
              gold_unreachable();
8043
            break;
8044
 
8045
          case elfcpp::R_ARM_TLS_LE32:          // Local-exec
8046
            layout->set_has_static_tls();
8047
            if (output_is_shared)
8048
              {
8049
                // We need to create a dynamic relocation.
8050
                gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
8051
                unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
8052
                Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8053
                rel_dyn->add_local(object, r_sym, elfcpp::R_ARM_TLS_TPOFF32,
8054
                                   output_section, data_shndx,
8055
                                   reloc.get_r_offset());
8056
              }
8057
            break;
8058
 
8059
          default:
8060
            gold_unreachable();
8061
          }
8062
      }
8063
      break;
8064
 
8065
    case elfcpp::R_ARM_PC24:
8066
    case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
8067
    case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
8068
    case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
8069
    default:
8070
      unsupported_reloc_local(object, r_type);
8071
      break;
8072
    }
8073
}
8074
 
8075
// Report an unsupported relocation against a global symbol.
8076
 
8077
template<bool big_endian>
8078
void
8079
Target_arm<big_endian>::Scan::unsupported_reloc_global(
8080
    Sized_relobj_file<32, big_endian>* object,
8081
    unsigned int r_type,
8082
    Symbol* gsym)
8083
{
8084
  gold_error(_("%s: unsupported reloc %u against global symbol %s"),
8085
             object->name().c_str(), r_type, gsym->demangled_name().c_str());
8086
}
8087
 
8088
template<bool big_endian>
8089
inline bool
8090
Target_arm<big_endian>::Scan::possible_function_pointer_reloc(
8091
    unsigned int r_type)
8092
{
8093
  switch (r_type)
8094
    {
8095
    case elfcpp::R_ARM_PC24:
8096
    case elfcpp::R_ARM_THM_CALL:
8097
    case elfcpp::R_ARM_PLT32:
8098
    case elfcpp::R_ARM_CALL:
8099
    case elfcpp::R_ARM_JUMP24:
8100
    case elfcpp::R_ARM_THM_JUMP24:
8101
    case elfcpp::R_ARM_SBREL31:
8102
    case elfcpp::R_ARM_PREL31:
8103
    case elfcpp::R_ARM_THM_JUMP19:
8104
    case elfcpp::R_ARM_THM_JUMP6:
8105
    case elfcpp::R_ARM_THM_JUMP11:
8106
    case elfcpp::R_ARM_THM_JUMP8:
8107
      // All the relocations above are branches except SBREL31 and PREL31.
8108
      return false;
8109
 
8110
    default:
8111
      // Be conservative and assume this is a function pointer.
8112
      return true;
8113
    }
8114
}
8115
 
8116
template<bool big_endian>
8117
inline bool
8118
Target_arm<big_endian>::Scan::local_reloc_may_be_function_pointer(
8119
  Symbol_table*,
8120
  Layout*,
8121
  Target_arm<big_endian>* target,
8122
  Sized_relobj_file<32, big_endian>*,
8123
  unsigned int,
8124
  Output_section*,
8125
  const elfcpp::Rel<32, big_endian>&,
8126
  unsigned int r_type,
8127
  const elfcpp::Sym<32, big_endian>&)
8128
{
8129
  r_type = target->get_real_reloc_type(r_type);
8130
  return possible_function_pointer_reloc(r_type);
8131
}
8132
 
8133
template<bool big_endian>
8134
inline bool
8135
Target_arm<big_endian>::Scan::global_reloc_may_be_function_pointer(
8136
  Symbol_table*,
8137
  Layout*,
8138
  Target_arm<big_endian>* target,
8139
  Sized_relobj_file<32, big_endian>*,
8140
  unsigned int,
8141
  Output_section*,
8142
  const elfcpp::Rel<32, big_endian>&,
8143
  unsigned int r_type,
8144
  Symbol* gsym)
8145
{
8146
  // GOT is not a function.
8147
  if (strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
8148
    return false;
8149
 
8150
  r_type = target->get_real_reloc_type(r_type);
8151
  return possible_function_pointer_reloc(r_type);
8152
}
8153
 
8154
// Scan a relocation for a global symbol.
8155
 
8156
template<bool big_endian>
8157
inline void
8158
Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
8159
                                     Layout* layout,
8160
                                     Target_arm* target,
8161
                                     Sized_relobj_file<32, big_endian>* object,
8162
                                     unsigned int data_shndx,
8163
                                     Output_section* output_section,
8164
                                     const elfcpp::Rel<32, big_endian>& reloc,
8165
                                     unsigned int r_type,
8166
                                     Symbol* gsym)
8167
{
8168
  // A reference to _GLOBAL_OFFSET_TABLE_ implies that we need a got
8169
  // section.  We check here to avoid creating a dynamic reloc against
8170
  // _GLOBAL_OFFSET_TABLE_.
8171
  if (!target->has_got_section()
8172
      && strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
8173
    target->got_section(symtab, layout);
8174
 
8175
  r_type = get_real_reloc_type(r_type);
8176
  switch (r_type)
8177
    {
8178
    case elfcpp::R_ARM_NONE:
8179
    case elfcpp::R_ARM_V4BX:
8180
    case elfcpp::R_ARM_GNU_VTENTRY:
8181
    case elfcpp::R_ARM_GNU_VTINHERIT:
8182
      break;
8183
 
8184
    case elfcpp::R_ARM_ABS32:
8185
    case elfcpp::R_ARM_ABS16:
8186
    case elfcpp::R_ARM_ABS12:
8187
    case elfcpp::R_ARM_THM_ABS5:
8188
    case elfcpp::R_ARM_ABS8:
8189
    case elfcpp::R_ARM_BASE_ABS:
8190
    case elfcpp::R_ARM_MOVW_ABS_NC:
8191
    case elfcpp::R_ARM_MOVT_ABS:
8192
    case elfcpp::R_ARM_THM_MOVW_ABS_NC:
8193
    case elfcpp::R_ARM_THM_MOVT_ABS:
8194
    case elfcpp::R_ARM_ABS32_NOI:
8195
      // Absolute addressing relocations.
8196
      {
8197
        // Make a PLT entry if necessary.
8198
        if (this->symbol_needs_plt_entry(gsym))
8199
          {
8200
            target->make_plt_entry(symtab, layout, gsym);
8201
            // Since this is not a PC-relative relocation, we may be
8202
            // taking the address of a function. In that case we need to
8203
            // set the entry in the dynamic symbol table to the address of
8204
            // the PLT entry.
8205
            if (gsym->is_from_dynobj() && !parameters->options().shared())
8206
              gsym->set_needs_dynsym_value();
8207
          }
8208
        // Make a dynamic relocation if necessary.
8209
        if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
8210
          {
8211
            if (gsym->may_need_copy_reloc())
8212
              {
8213
                target->copy_reloc(symtab, layout, object,
8214
                                   data_shndx, output_section, gsym, reloc);
8215
              }
8216
            else if ((r_type == elfcpp::R_ARM_ABS32
8217
                      || r_type == elfcpp::R_ARM_ABS32_NOI)
8218
                     && gsym->can_use_relative_reloc(false))
8219
              {
8220
                Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8221
                rel_dyn->add_global_relative(gsym, elfcpp::R_ARM_RELATIVE,
8222
                                             output_section, object,
8223
                                             data_shndx, reloc.get_r_offset());
8224
              }
8225
            else
8226
              {
8227
                check_non_pic(object, r_type);
8228
                Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8229
                rel_dyn->add_global(gsym, r_type, output_section, object,
8230
                                    data_shndx, reloc.get_r_offset());
8231
              }
8232
          }
8233
      }
8234
      break;
8235
 
8236
    case elfcpp::R_ARM_GOTOFF32:
8237
    case elfcpp::R_ARM_GOTOFF12:
8238
      // We need a GOT section.
8239
      target->got_section(symtab, layout);
8240
      break;
8241
 
8242
    case elfcpp::R_ARM_REL32:
8243
    case elfcpp::R_ARM_LDR_PC_G0:
8244
    case elfcpp::R_ARM_SBREL32:
8245
    case elfcpp::R_ARM_THM_PC8:
8246
    case elfcpp::R_ARM_BASE_PREL:
8247
    case elfcpp::R_ARM_MOVW_PREL_NC:
8248
    case elfcpp::R_ARM_MOVT_PREL:
8249
    case elfcpp::R_ARM_THM_MOVW_PREL_NC:
8250
    case elfcpp::R_ARM_THM_MOVT_PREL:
8251
    case elfcpp::R_ARM_THM_ALU_PREL_11_0:
8252
    case elfcpp::R_ARM_THM_PC12:
8253
    case elfcpp::R_ARM_REL32_NOI:
8254
    case elfcpp::R_ARM_ALU_PC_G0_NC:
8255
    case elfcpp::R_ARM_ALU_PC_G0:
8256
    case elfcpp::R_ARM_ALU_PC_G1_NC:
8257
    case elfcpp::R_ARM_ALU_PC_G1:
8258
    case elfcpp::R_ARM_ALU_PC_G2:
8259
    case elfcpp::R_ARM_LDR_PC_G1:
8260
    case elfcpp::R_ARM_LDR_PC_G2:
8261
    case elfcpp::R_ARM_LDRS_PC_G0:
8262
    case elfcpp::R_ARM_LDRS_PC_G1:
8263
    case elfcpp::R_ARM_LDRS_PC_G2:
8264
    case elfcpp::R_ARM_LDC_PC_G0:
8265
    case elfcpp::R_ARM_LDC_PC_G1:
8266
    case elfcpp::R_ARM_LDC_PC_G2:
8267
    case elfcpp::R_ARM_ALU_SB_G0_NC:
8268
    case elfcpp::R_ARM_ALU_SB_G0:
8269
    case elfcpp::R_ARM_ALU_SB_G1_NC:
8270
    case elfcpp::R_ARM_ALU_SB_G1:
8271
    case elfcpp::R_ARM_ALU_SB_G2:
8272
    case elfcpp::R_ARM_LDR_SB_G0:
8273
    case elfcpp::R_ARM_LDR_SB_G1:
8274
    case elfcpp::R_ARM_LDR_SB_G2:
8275
    case elfcpp::R_ARM_LDRS_SB_G0:
8276
    case elfcpp::R_ARM_LDRS_SB_G1:
8277
    case elfcpp::R_ARM_LDRS_SB_G2:
8278
    case elfcpp::R_ARM_LDC_SB_G0:
8279
    case elfcpp::R_ARM_LDC_SB_G1:
8280
    case elfcpp::R_ARM_LDC_SB_G2:
8281
    case elfcpp::R_ARM_MOVW_BREL_NC:
8282
    case elfcpp::R_ARM_MOVT_BREL:
8283
    case elfcpp::R_ARM_MOVW_BREL:
8284
    case elfcpp::R_ARM_THM_MOVW_BREL_NC:
8285
    case elfcpp::R_ARM_THM_MOVT_BREL:
8286
    case elfcpp::R_ARM_THM_MOVW_BREL:
8287
      // Relative addressing relocations.
8288
      {
8289
        // Make a dynamic relocation if necessary.
8290
        if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
8291
          {
8292
            if (target->may_need_copy_reloc(gsym))
8293
              {
8294
                target->copy_reloc(symtab, layout, object,
8295
                                   data_shndx, output_section, gsym, reloc);
8296
              }
8297
            else
8298
              {
8299
                check_non_pic(object, r_type);
8300
                Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8301
                rel_dyn->add_global(gsym, r_type, output_section, object,
8302
                                    data_shndx, reloc.get_r_offset());
8303
              }
8304
          }
8305
      }
8306
      break;
8307
 
8308
    case elfcpp::R_ARM_THM_CALL:
8309
    case elfcpp::R_ARM_PLT32:
8310
    case elfcpp::R_ARM_CALL:
8311
    case elfcpp::R_ARM_JUMP24:
8312
    case elfcpp::R_ARM_THM_JUMP24:
8313
    case elfcpp::R_ARM_SBREL31:
8314
    case elfcpp::R_ARM_PREL31:
8315
    case elfcpp::R_ARM_THM_JUMP19:
8316
    case elfcpp::R_ARM_THM_JUMP6:
8317
    case elfcpp::R_ARM_THM_JUMP11:
8318
    case elfcpp::R_ARM_THM_JUMP8:
8319
      // All the relocation above are branches except for the PREL31 ones.
8320
      // A PREL31 relocation can point to a personality function in a shared
8321
      // library.  In that case we want to use a PLT because we want to
8322
      // call the personality routine and the dynamic linkers we care about
8323
      // do not support dynamic PREL31 relocations. An REL31 relocation may
8324
      // point to a function whose unwinding behaviour is being described but
8325
      // we will not mistakenly generate a PLT for that because we should use
8326
      // a local section symbol.
8327
 
8328
      // If the symbol is fully resolved, this is just a relative
8329
      // local reloc.  Otherwise we need a PLT entry.
8330
      if (gsym->final_value_is_known())
8331
        break;
8332
      // If building a shared library, we can also skip the PLT entry
8333
      // if the symbol is defined in the output file and is protected
8334
      // or hidden.
8335
      if (gsym->is_defined()
8336
          && !gsym->is_from_dynobj()
8337
          && !gsym->is_preemptible())
8338
        break;
8339
      target->make_plt_entry(symtab, layout, gsym);
8340
      break;
8341
 
8342
    case elfcpp::R_ARM_GOT_BREL:
8343
    case elfcpp::R_ARM_GOT_ABS:
8344
    case elfcpp::R_ARM_GOT_PREL:
8345
      {
8346
        // The symbol requires a GOT entry.
8347
        Arm_output_data_got<big_endian>* got =
8348
          target->got_section(symtab, layout);
8349
        if (gsym->final_value_is_known())
8350
          got->add_global(gsym, GOT_TYPE_STANDARD);
8351
        else
8352
          {
8353
            // If this symbol is not fully resolved, we need to add a
8354
            // GOT entry with a dynamic relocation.
8355
            Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8356
            if (gsym->is_from_dynobj()
8357
                || gsym->is_undefined()
8358
                || gsym->is_preemptible())
8359
              got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
8360
                                       rel_dyn, elfcpp::R_ARM_GLOB_DAT);
8361
            else
8362
              {
8363
                if (got->add_global(gsym, GOT_TYPE_STANDARD))
8364
                  rel_dyn->add_global_relative(
8365
                      gsym, elfcpp::R_ARM_RELATIVE, got,
8366
                      gsym->got_offset(GOT_TYPE_STANDARD));
8367
              }
8368
          }
8369
      }
8370
      break;
8371
 
8372
    case elfcpp::R_ARM_TARGET1:
8373
    case elfcpp::R_ARM_TARGET2:
8374
      // These should have been mapped to other types already.
8375
      // Fall through.
8376
    case elfcpp::R_ARM_COPY:
8377
    case elfcpp::R_ARM_GLOB_DAT:
8378
    case elfcpp::R_ARM_JUMP_SLOT:
8379
    case elfcpp::R_ARM_RELATIVE:
8380
      // These are relocations which should only be seen by the
8381
      // dynamic linker, and should never be seen here.
8382
      gold_error(_("%s: unexpected reloc %u in object file"),
8383
                 object->name().c_str(), r_type);
8384
      break;
8385
 
8386
      // These are initial tls relocs, which are expected when
8387
      // linking.
8388
    case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
8389
    case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
8390
    case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
8391
    case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
8392
    case elfcpp::R_ARM_TLS_LE32:        // Local-exec
8393
      {
8394
        const bool is_final = gsym->final_value_is_known();
8395
        const tls::Tls_optimization optimized_type
8396
            = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
8397
        switch (r_type)
8398
          {
8399
          case elfcpp::R_ARM_TLS_GD32:          // Global-dynamic
8400
            if (optimized_type == tls::TLSOPT_NONE)
8401
              {
8402
                // Create a pair of GOT entries for the module index and
8403
                // dtv-relative offset.
8404
                Arm_output_data_got<big_endian>* got
8405
                    = target->got_section(symtab, layout);
8406
                if (!parameters->doing_static_link())
8407
                  got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR,
8408
                                                target->rel_dyn_section(layout),
8409
                                                elfcpp::R_ARM_TLS_DTPMOD32,
8410
                                                elfcpp::R_ARM_TLS_DTPOFF32);
8411
                else
8412
                  got->add_tls_gd32_with_static_reloc(GOT_TYPE_TLS_PAIR, gsym);
8413
              }
8414
            else
8415
              // FIXME: TLS optimization not supported yet.
8416
              gold_unreachable();
8417
            break;
8418
 
8419
          case elfcpp::R_ARM_TLS_LDM32:         // Local-dynamic
8420
            if (optimized_type == tls::TLSOPT_NONE)
8421
              {
8422
                // Create a GOT entry for the module index.
8423
                target->got_mod_index_entry(symtab, layout, object);
8424
              }
8425
            else
8426
              // FIXME: TLS optimization not supported yet.
8427
              gold_unreachable();
8428
            break;
8429
 
8430
          case elfcpp::R_ARM_TLS_LDO32:         // Alternate local-dynamic
8431
            break;
8432
 
8433
          case elfcpp::R_ARM_TLS_IE32:          // Initial-exec
8434
            layout->set_has_static_tls();
8435
            if (optimized_type == tls::TLSOPT_NONE)
8436
              {
8437
                // Create a GOT entry for the tp-relative offset.
8438
                Arm_output_data_got<big_endian>* got
8439
                  = target->got_section(symtab, layout);
8440
                if (!parameters->doing_static_link())
8441
                  got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET,
8442
                                           target->rel_dyn_section(layout),
8443
                                           elfcpp::R_ARM_TLS_TPOFF32);
8444
                else if (!gsym->has_got_offset(GOT_TYPE_TLS_OFFSET))
8445
                  {
8446
                    got->add_global(gsym, GOT_TYPE_TLS_OFFSET);
8447
                    unsigned int got_offset =
8448
                       gsym->got_offset(GOT_TYPE_TLS_OFFSET);
8449
                    got->add_static_reloc(got_offset,
8450
                                          elfcpp::R_ARM_TLS_TPOFF32, gsym);
8451
                  }
8452
              }
8453
            else
8454
              // FIXME: TLS optimization not supported yet.
8455
              gold_unreachable();
8456
            break;
8457
 
8458
          case elfcpp::R_ARM_TLS_LE32:  // Local-exec
8459
            layout->set_has_static_tls();
8460
            if (parameters->options().shared())
8461
              {
8462
                // We need to create a dynamic relocation.
8463
                Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8464
                rel_dyn->add_global(gsym, elfcpp::R_ARM_TLS_TPOFF32,
8465
                                    output_section, object,
8466
                                    data_shndx, reloc.get_r_offset());
8467
              }
8468
            break;
8469
 
8470
          default:
8471
            gold_unreachable();
8472
          }
8473
      }
8474
      break;
8475
 
8476
    case elfcpp::R_ARM_PC24:
8477
    case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
8478
    case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
8479
    case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
8480
    default:
8481
      unsupported_reloc_global(object, r_type, gsym);
8482
      break;
8483
    }
8484
}
8485
 
8486
// Process relocations for gc.
8487
 
8488
template<bool big_endian>
8489
void
8490
Target_arm<big_endian>::gc_process_relocs(
8491
    Symbol_table* symtab,
8492
    Layout* layout,
8493
    Sized_relobj_file<32, big_endian>* object,
8494
    unsigned int data_shndx,
8495
    unsigned int,
8496
    const unsigned char* prelocs,
8497
    size_t reloc_count,
8498
    Output_section* output_section,
8499
    bool needs_special_offset_handling,
8500
    size_t local_symbol_count,
8501
    const unsigned char* plocal_symbols)
8502
{
8503
  typedef Target_arm<big_endian> Arm;
8504
  typedef typename Target_arm<big_endian>::Scan Scan;
8505
 
8506
  gold::gc_process_relocs<32, big_endian, Arm, elfcpp::SHT_REL, Scan,
8507
                          typename Target_arm::Relocatable_size_for_reloc>(
8508
    symtab,
8509
    layout,
8510
    this,
8511
    object,
8512
    data_shndx,
8513
    prelocs,
8514
    reloc_count,
8515
    output_section,
8516
    needs_special_offset_handling,
8517
    local_symbol_count,
8518
    plocal_symbols);
8519
}
8520
 
8521
// Scan relocations for a section.
8522
 
8523
template<bool big_endian>
8524
void
8525
Target_arm<big_endian>::scan_relocs(Symbol_table* symtab,
8526
                                    Layout* layout,
8527
                                    Sized_relobj_file<32, big_endian>* object,
8528
                                    unsigned int data_shndx,
8529
                                    unsigned int sh_type,
8530
                                    const unsigned char* prelocs,
8531
                                    size_t reloc_count,
8532
                                    Output_section* output_section,
8533
                                    bool needs_special_offset_handling,
8534
                                    size_t local_symbol_count,
8535
                                    const unsigned char* plocal_symbols)
8536
{
8537
  typedef typename Target_arm<big_endian>::Scan Scan;
8538
  if (sh_type == elfcpp::SHT_RELA)
8539
    {
8540
      gold_error(_("%s: unsupported RELA reloc section"),
8541
                 object->name().c_str());
8542
      return;
8543
    }
8544
 
8545
  gold::scan_relocs<32, big_endian, Target_arm, elfcpp::SHT_REL, Scan>(
8546
    symtab,
8547
    layout,
8548
    this,
8549
    object,
8550
    data_shndx,
8551
    prelocs,
8552
    reloc_count,
8553
    output_section,
8554
    needs_special_offset_handling,
8555
    local_symbol_count,
8556
    plocal_symbols);
8557
}
8558
 
8559
// Finalize the sections.
8560
 
8561
template<bool big_endian>
8562
void
8563
Target_arm<big_endian>::do_finalize_sections(
8564
    Layout* layout,
8565
    const Input_objects* input_objects,
8566
    Symbol_table* symtab)
8567
{
8568
  bool merged_any_attributes = false;
8569
  // Merge processor-specific flags.
8570
  for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
8571
       p != input_objects->relobj_end();
8572
       ++p)
8573
    {
8574
      Arm_relobj<big_endian>* arm_relobj =
8575
        Arm_relobj<big_endian>::as_arm_relobj(*p);
8576
      if (arm_relobj->merge_flags_and_attributes())
8577
        {
8578
          this->merge_processor_specific_flags(
8579
              arm_relobj->name(),
8580
              arm_relobj->processor_specific_flags());
8581
          this->merge_object_attributes(arm_relobj->name().c_str(),
8582
                                        arm_relobj->attributes_section_data());
8583
          merged_any_attributes = true;
8584
        }
8585
    }
8586
 
8587
  for (Input_objects::Dynobj_iterator p = input_objects->dynobj_begin();
8588
       p != input_objects->dynobj_end();
8589
       ++p)
8590
    {
8591
      Arm_dynobj<big_endian>* arm_dynobj =
8592
        Arm_dynobj<big_endian>::as_arm_dynobj(*p);
8593
      this->merge_processor_specific_flags(
8594
          arm_dynobj->name(),
8595
          arm_dynobj->processor_specific_flags());
8596
      this->merge_object_attributes(arm_dynobj->name().c_str(),
8597
                                    arm_dynobj->attributes_section_data());
8598
      merged_any_attributes = true;
8599
    }
8600
 
8601
  // Create an empty uninitialized attribute section if we still don't have it
8602
  // at this moment.  This happens if there is no attributes sections in all
8603
  // inputs.
8604
  if (this->attributes_section_data_ == NULL)
8605
    this->attributes_section_data_ = new Attributes_section_data(NULL, 0);
8606
 
8607
  // Check BLX use.
8608
  const Object_attribute* cpu_arch_attr =
8609
    this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
8610
  if (cpu_arch_attr->int_value() > elfcpp::TAG_CPU_ARCH_V4)
8611
    this->set_may_use_blx(true);
8612
 
8613
  // Check if we need to use Cortex-A8 workaround.
8614
  if (parameters->options().user_set_fix_cortex_a8())
8615
    this->fix_cortex_a8_ = parameters->options().fix_cortex_a8();
8616
  else
8617
    {
8618
      // If neither --fix-cortex-a8 nor --no-fix-cortex-a8 is used, turn on
8619
      // Cortex-A8 erratum workaround for ARMv7-A or ARMv7 with unknown
8620
      // profile.  
8621
      const Object_attribute* cpu_arch_profile_attr =
8622
        this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
8623
      this->fix_cortex_a8_ =
8624
        (cpu_arch_attr->int_value() == elfcpp::TAG_CPU_ARCH_V7
8625
         && (cpu_arch_profile_attr->int_value() == 'A'
8626
             || cpu_arch_profile_attr->int_value() == 0));
8627
    }
8628
 
8629
  // Check if we can use V4BX interworking.
8630
  // The V4BX interworking stub contains BX instruction,
8631
  // which is not specified for some profiles.
8632
  if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING
8633
      && !this->may_use_blx())
8634
    gold_error(_("unable to provide V4BX reloc interworking fix up; "
8635
                 "the target profile does not support BX instruction"));
8636
 
8637
  // Fill in some more dynamic tags.
8638
  const Reloc_section* rel_plt = (this->plt_ == NULL
8639
                                  ? NULL
8640
                                  : this->plt_->rel_plt());
8641
  layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
8642
                                  this->rel_dyn_, true, false);
8643
 
8644
  // Emit any relocs we saved in an attempt to avoid generating COPY
8645
  // relocs.
8646
  if (this->copy_relocs_.any_saved_relocs())
8647
    this->copy_relocs_.emit(this->rel_dyn_section(layout));
8648
 
8649
  // Handle the .ARM.exidx section.
8650
  Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
8651
 
8652
  if (!parameters->options().relocatable())
8653
    {
8654
      if (exidx_section != NULL
8655
          && exidx_section->type() == elfcpp::SHT_ARM_EXIDX)
8656
        {
8657
          // Create __exidx_start and __exidx_end symbols.
8658
          symtab->define_in_output_data("__exidx_start", NULL,
8659
                                        Symbol_table::PREDEFINED,
8660
                                        exidx_section, 0, 0, elfcpp::STT_OBJECT,
8661
                                        elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN,
8662
                                        0, false, true);
8663
          symtab->define_in_output_data("__exidx_end", NULL,
8664
                                        Symbol_table::PREDEFINED,
8665
                                        exidx_section, 0, 0, elfcpp::STT_OBJECT,
8666
                                        elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN,
8667
                                        0, true, true);
8668
 
8669
          // For the ARM target, we need to add a PT_ARM_EXIDX segment for
8670
          // the .ARM.exidx section.
8671
          if (!layout->script_options()->saw_phdrs_clause())
8672
            {
8673
              gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0,
8674
                                                      0)
8675
                          == NULL);
8676
              Output_segment*  exidx_segment =
8677
                layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
8678
              exidx_segment->add_output_section_to_nonload(exidx_section,
8679
                                                           elfcpp::PF_R);
8680
            }
8681
        }
8682
      else
8683
        {
8684
          symtab->define_as_constant("__exidx_start", NULL,
8685
                                     Symbol_table::PREDEFINED,
8686
                                     0, 0, elfcpp::STT_OBJECT,
8687
                                     elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
8688
                                     true, false);
8689
          symtab->define_as_constant("__exidx_end", NULL,
8690
                                     Symbol_table::PREDEFINED,
8691
                                     0, 0, elfcpp::STT_OBJECT,
8692
                                     elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
8693
                                     true, false);
8694
        }
8695
    }
8696
 
8697
  // Create an .ARM.attributes section if we have merged any attributes
8698
  // from inputs.
8699
  if (merged_any_attributes)
8700
    {
8701
      Output_attributes_section_data* attributes_section =
8702
      new Output_attributes_section_data(*this->attributes_section_data_);
8703
      layout->add_output_section_data(".ARM.attributes",
8704
                                      elfcpp::SHT_ARM_ATTRIBUTES, 0,
8705
                                      attributes_section, ORDER_INVALID,
8706
                                      false);
8707
    }
8708
 
8709
  // Fix up links in section EXIDX headers.
8710
  for (Layout::Section_list::const_iterator p = layout->section_list().begin();
8711
       p != layout->section_list().end();
8712
       ++p)
8713
    if ((*p)->type() == elfcpp::SHT_ARM_EXIDX)
8714
      {
8715
        Arm_output_section<big_endian>* os =
8716
          Arm_output_section<big_endian>::as_arm_output_section(*p);
8717
        os->set_exidx_section_link();
8718
      }
8719
}
8720
 
8721
// Return whether a direct absolute static relocation needs to be applied.
8722
// In cases where Scan::local() or Scan::global() has created
8723
// a dynamic relocation other than R_ARM_RELATIVE, the addend
8724
// of the relocation is carried in the data, and we must not
8725
// apply the static relocation.
8726
 
8727
template<bool big_endian>
8728
inline bool
8729
Target_arm<big_endian>::Relocate::should_apply_static_reloc(
8730
    const Sized_symbol<32>* gsym,
8731
    unsigned int r_type,
8732
    bool is_32bit,
8733
    Output_section* output_section)
8734
{
8735
  // If the output section is not allocated, then we didn't call
8736
  // scan_relocs, we didn't create a dynamic reloc, and we must apply
8737
  // the reloc here.
8738
  if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0)
8739
      return true;
8740
 
8741
  int ref_flags = Scan::get_reference_flags(r_type);
8742
 
8743
  // For local symbols, we will have created a non-RELATIVE dynamic
8744
  // relocation only if (a) the output is position independent,
8745
  // (b) the relocation is absolute (not pc- or segment-relative), and
8746
  // (c) the relocation is not 32 bits wide.
8747
  if (gsym == NULL)
8748
    return !(parameters->options().output_is_position_independent()
8749
             && (ref_flags & Symbol::ABSOLUTE_REF)
8750
             && !is_32bit);
8751
 
8752
  // For global symbols, we use the same helper routines used in the
8753
  // scan pass.  If we did not create a dynamic relocation, or if we
8754
  // created a RELATIVE dynamic relocation, we should apply the static
8755
  // relocation.
8756
  bool has_dyn = gsym->needs_dynamic_reloc(ref_flags);
8757
  bool is_rel = (ref_flags & Symbol::ABSOLUTE_REF)
8758
                 && gsym->can_use_relative_reloc(ref_flags
8759
                                                 & Symbol::FUNCTION_CALL);
8760
  return !has_dyn || is_rel;
8761
}
8762
 
8763
// Perform a relocation.
8764
 
8765
template<bool big_endian>
8766
inline bool
8767
Target_arm<big_endian>::Relocate::relocate(
8768
    const Relocate_info<32, big_endian>* relinfo,
8769
    Target_arm* target,
8770
    Output_section* output_section,
8771
    size_t relnum,
8772
    const elfcpp::Rel<32, big_endian>& rel,
8773
    unsigned int r_type,
8774
    const Sized_symbol<32>* gsym,
8775
    const Symbol_value<32>* psymval,
8776
    unsigned char* view,
8777
    Arm_address address,
8778
    section_size_type view_size)
8779
{
8780
  typedef Arm_relocate_functions<big_endian> Arm_relocate_functions;
8781
 
8782
  r_type = get_real_reloc_type(r_type);
8783
  const Arm_reloc_property* reloc_property =
8784
    arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
8785
  if (reloc_property == NULL)
8786
    {
8787
      std::string reloc_name =
8788
        arm_reloc_property_table->reloc_name_in_error_message(r_type);
8789
      gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
8790
                             _("cannot relocate %s in object file"),
8791
                             reloc_name.c_str());
8792
      return true;
8793
    }
8794
 
8795
  const Arm_relobj<big_endian>* object =
8796
    Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
8797
 
8798
  // If the final branch target of a relocation is THUMB instruction, this
8799
  // is 1.  Otherwise it is 0.
8800
  Arm_address thumb_bit = 0;
8801
  Symbol_value<32> symval;
8802
  bool is_weakly_undefined_without_plt = false;
8803
  bool have_got_offset = false;
8804
  unsigned int got_offset = 0;
8805
 
8806
  // If the relocation uses the GOT entry of a symbol instead of the symbol
8807
  // itself, we don't care about whether the symbol is defined or what kind
8808
  // of symbol it is.
8809
  if (reloc_property->uses_got_entry())
8810
    {
8811
      // Get the GOT offset.
8812
      // The GOT pointer points to the end of the GOT section.
8813
      // We need to subtract the size of the GOT section to get
8814
      // the actual offset to use in the relocation.
8815
      // TODO: We should move GOT offset computing code in TLS relocations
8816
      // to here.
8817
      switch (r_type)
8818
        {
8819
        case elfcpp::R_ARM_GOT_BREL:
8820
        case elfcpp::R_ARM_GOT_PREL:
8821
          if (gsym != NULL)
8822
            {
8823
              gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
8824
              got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
8825
                            - target->got_size());
8826
            }
8827
          else
8828
            {
8829
              unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
8830
              gold_assert(object->local_has_got_offset(r_sym,
8831
                                                       GOT_TYPE_STANDARD));
8832
              got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
8833
                            - target->got_size());
8834
            }
8835
          have_got_offset = true;
8836
          break;
8837
 
8838
        default:
8839
          break;
8840
        }
8841
    }
8842
  else if (relnum != Target_arm<big_endian>::fake_relnum_for_stubs)
8843
    {
8844
      if (gsym != NULL)
8845
        {
8846
          // This is a global symbol.  Determine if we use PLT and if the
8847
          // final target is THUMB.
8848
          if (gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
8849
            {
8850
              // This uses a PLT, change the symbol value.
8851
              symval.set_output_value(target->plt_section()->address()
8852
                                      + gsym->plt_offset());
8853
              psymval = &symval;
8854
            }
8855
          else if (gsym->is_weak_undefined())
8856
            {
8857
              // This is a weakly undefined symbol and we do not use PLT
8858
              // for this relocation.  A branch targeting this symbol will
8859
              // be converted into an NOP.
8860
              is_weakly_undefined_without_plt = true;
8861
            }
8862
          else if (gsym->is_undefined() && reloc_property->uses_symbol())
8863
            {
8864
              // This relocation uses the symbol value but the symbol is
8865
              // undefined.  Exit early and have the caller reporting an
8866
              // error.
8867
              return true;
8868
            }
8869
          else
8870
            {
8871
              // Set thumb bit if symbol:
8872
              // -Has type STT_ARM_TFUNC or
8873
              // -Has type STT_FUNC, is defined and with LSB in value set.
8874
              thumb_bit =
8875
                (((gsym->type() == elfcpp::STT_ARM_TFUNC)
8876
                 || (gsym->type() == elfcpp::STT_FUNC
8877
                     && !gsym->is_undefined()
8878
                     && ((psymval->value(object, 0) & 1) != 0)))
8879
                ? 1
8880
                : 0);
8881
            }
8882
        }
8883
      else
8884
        {
8885
          // This is a local symbol.  Determine if the final target is THUMB.
8886
          // We saved this information when all the local symbols were read.
8887
          elfcpp::Elf_types<32>::Elf_WXword r_info = rel.get_r_info();
8888
          unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
8889
          thumb_bit = object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
8890
        }
8891
    }
8892
  else
8893
    {
8894
      // This is a fake relocation synthesized for a stub.  It does not have
8895
      // a real symbol.  We just look at the LSB of the symbol value to
8896
      // determine if the target is THUMB or not.
8897
      thumb_bit = ((psymval->value(object, 0) & 1) != 0);
8898
    }
8899
 
8900
  // Strip LSB if this points to a THUMB target.
8901
  if (thumb_bit != 0
8902
      && reloc_property->uses_thumb_bit()
8903
      && ((psymval->value(object, 0) & 1) != 0))
8904
    {
8905
      Arm_address stripped_value =
8906
        psymval->value(object, 0) & ~static_cast<Arm_address>(1);
8907
      symval.set_output_value(stripped_value);
8908
      psymval = &symval;
8909
    }
8910
 
8911
  // To look up relocation stubs, we need to pass the symbol table index of
8912
  // a local symbol.
8913
  unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
8914
 
8915
  // Get the addressing origin of the output segment defining the
8916
  // symbol gsym if needed (AAELF 4.6.1.2 Relocation types).
8917
  Arm_address sym_origin = 0;
8918
  if (reloc_property->uses_symbol_base())
8919
    {
8920
      if (r_type == elfcpp::R_ARM_BASE_ABS && gsym == NULL)
8921
        // R_ARM_BASE_ABS with the NULL symbol will give the
8922
        // absolute address of the GOT origin (GOT_ORG) (see ARM IHI
8923
        // 0044C (AAELF): 4.6.1.8 Proxy generating relocations).
8924
        sym_origin = target->got_plt_section()->address();
8925
      else if (gsym == NULL)
8926
        sym_origin = 0;
8927
      else if (gsym->source() == Symbol::IN_OUTPUT_SEGMENT)
8928
        sym_origin = gsym->output_segment()->vaddr();
8929
      else if (gsym->source() == Symbol::IN_OUTPUT_DATA)
8930
        sym_origin = gsym->output_data()->address();
8931
 
8932
      // TODO: Assumes the segment base to be zero for the global symbols
8933
      // till the proper support for the segment-base-relative addressing
8934
      // will be implemented.  This is consistent with GNU ld.
8935
    }
8936
 
8937
  // For relative addressing relocation, find out the relative address base.
8938
  Arm_address relative_address_base = 0;
8939
  switch(reloc_property->relative_address_base())
8940
    {
8941
    case Arm_reloc_property::RAB_NONE:
8942
    // Relocations with relative address bases RAB_TLS and RAB_tp are
8943
    // handled by relocate_tls.  So we do not need to do anything here.
8944
    case Arm_reloc_property::RAB_TLS:
8945
    case Arm_reloc_property::RAB_tp:
8946
      break;
8947
    case Arm_reloc_property::RAB_B_S:
8948
      relative_address_base = sym_origin;
8949
      break;
8950
    case Arm_reloc_property::RAB_GOT_ORG:
8951
      relative_address_base = target->got_plt_section()->address();
8952
      break;
8953
    case Arm_reloc_property::RAB_P:
8954
      relative_address_base = address;
8955
      break;
8956
    case Arm_reloc_property::RAB_Pa:
8957
      relative_address_base = address & 0xfffffffcU;
8958
      break;
8959
    default:
8960
      gold_unreachable();
8961
    }
8962
 
8963
  typename Arm_relocate_functions::Status reloc_status =
8964
        Arm_relocate_functions::STATUS_OKAY;
8965
  bool check_overflow = reloc_property->checks_overflow();
8966
  switch (r_type)
8967
    {
8968
    case elfcpp::R_ARM_NONE:
8969
      break;
8970
 
8971
    case elfcpp::R_ARM_ABS8:
8972
      if (should_apply_static_reloc(gsym, r_type, false, output_section))
8973
        reloc_status = Arm_relocate_functions::abs8(view, object, psymval);
8974
      break;
8975
 
8976
    case elfcpp::R_ARM_ABS12:
8977
      if (should_apply_static_reloc(gsym, r_type, false, output_section))
8978
        reloc_status = Arm_relocate_functions::abs12(view, object, psymval);
8979
      break;
8980
 
8981
    case elfcpp::R_ARM_ABS16:
8982
      if (should_apply_static_reloc(gsym, r_type, false, output_section))
8983
        reloc_status = Arm_relocate_functions::abs16(view, object, psymval);
8984
      break;
8985
 
8986
    case elfcpp::R_ARM_ABS32:
8987
      if (should_apply_static_reloc(gsym, r_type, true, output_section))
8988
        reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
8989
                                                     thumb_bit);
8990
      break;
8991
 
8992
    case elfcpp::R_ARM_ABS32_NOI:
8993
      if (should_apply_static_reloc(gsym, r_type, true, output_section))
8994
        // No thumb bit for this relocation: (S + A)
8995
        reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
8996
                                                     0);
8997
      break;
8998
 
8999
    case elfcpp::R_ARM_MOVW_ABS_NC:
9000
      if (should_apply_static_reloc(gsym, r_type, false, output_section))
9001
        reloc_status = Arm_relocate_functions::movw(view, object, psymval,
9002
                                                    0, thumb_bit,
9003
                                                    check_overflow);
9004
      break;
9005
 
9006
    case elfcpp::R_ARM_MOVT_ABS:
9007
      if (should_apply_static_reloc(gsym, r_type, false, output_section))
9008
        reloc_status = Arm_relocate_functions::movt(view, object, psymval, 0);
9009
      break;
9010
 
9011
    case elfcpp::R_ARM_THM_MOVW_ABS_NC:
9012
      if (should_apply_static_reloc(gsym, r_type, false, output_section))
9013
        reloc_status = Arm_relocate_functions::thm_movw(view, object, psymval,
9014
                                                        0, thumb_bit, false);
9015
      break;
9016
 
9017
    case elfcpp::R_ARM_THM_MOVT_ABS:
9018
      if (should_apply_static_reloc(gsym, r_type, false, output_section))
9019
        reloc_status = Arm_relocate_functions::thm_movt(view, object,
9020
                                                        psymval, 0);
9021
      break;
9022
 
9023
    case elfcpp::R_ARM_MOVW_PREL_NC:
9024
    case elfcpp::R_ARM_MOVW_BREL_NC:
9025
    case elfcpp::R_ARM_MOVW_BREL:
9026
      reloc_status =
9027
        Arm_relocate_functions::movw(view, object, psymval,
9028
                                     relative_address_base, thumb_bit,
9029
                                     check_overflow);
9030
      break;
9031
 
9032
    case elfcpp::R_ARM_MOVT_PREL:
9033
    case elfcpp::R_ARM_MOVT_BREL:
9034
      reloc_status =
9035
        Arm_relocate_functions::movt(view, object, psymval,
9036
                                     relative_address_base);
9037
      break;
9038
 
9039
    case elfcpp::R_ARM_THM_MOVW_PREL_NC:
9040
    case elfcpp::R_ARM_THM_MOVW_BREL_NC:
9041
    case elfcpp::R_ARM_THM_MOVW_BREL:
9042
      reloc_status =
9043
        Arm_relocate_functions::thm_movw(view, object, psymval,
9044
                                         relative_address_base,
9045
                                         thumb_bit, check_overflow);
9046
      break;
9047
 
9048
    case elfcpp::R_ARM_THM_MOVT_PREL:
9049
    case elfcpp::R_ARM_THM_MOVT_BREL:
9050
      reloc_status =
9051
        Arm_relocate_functions::thm_movt(view, object, psymval,
9052
                                         relative_address_base);
9053
      break;
9054
 
9055
    case elfcpp::R_ARM_REL32:
9056
      reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
9057
                                                   address, thumb_bit);
9058
      break;
9059
 
9060
    case elfcpp::R_ARM_THM_ABS5:
9061
      if (should_apply_static_reloc(gsym, r_type, false, output_section))
9062
        reloc_status = Arm_relocate_functions::thm_abs5(view, object, psymval);
9063
      break;
9064
 
9065
    // Thumb long branches.
9066
    case elfcpp::R_ARM_THM_CALL:
9067
    case elfcpp::R_ARM_THM_XPC22:
9068
    case elfcpp::R_ARM_THM_JUMP24:
9069
      reloc_status =
9070
        Arm_relocate_functions::thumb_branch_common(
9071
            r_type, relinfo, view, gsym, object, r_sym, psymval, address,
9072
            thumb_bit, is_weakly_undefined_without_plt);
9073
      break;
9074
 
9075
    case elfcpp::R_ARM_GOTOFF32:
9076
      {
9077
        Arm_address got_origin;
9078
        got_origin = target->got_plt_section()->address();
9079
        reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
9080
                                                     got_origin, thumb_bit);
9081
      }
9082
      break;
9083
 
9084
    case elfcpp::R_ARM_BASE_PREL:
9085
      gold_assert(gsym != NULL);
9086
      reloc_status =
9087
          Arm_relocate_functions::base_prel(view, sym_origin, address);
9088
      break;
9089
 
9090
    case elfcpp::R_ARM_BASE_ABS:
9091
      if (should_apply_static_reloc(gsym, r_type, false, output_section))
9092
        reloc_status = Arm_relocate_functions::base_abs(view, sym_origin);
9093
      break;
9094
 
9095
    case elfcpp::R_ARM_GOT_BREL:
9096
      gold_assert(have_got_offset);
9097
      reloc_status = Arm_relocate_functions::got_brel(view, got_offset);
9098
      break;
9099
 
9100
    case elfcpp::R_ARM_GOT_PREL:
9101
      gold_assert(have_got_offset);
9102
      // Get the address origin for GOT PLT, which is allocated right
9103
      // after the GOT section, to calculate an absolute address of
9104
      // the symbol GOT entry (got_origin + got_offset).
9105
      Arm_address got_origin;
9106
      got_origin = target->got_plt_section()->address();
9107
      reloc_status = Arm_relocate_functions::got_prel(view,
9108
                                                      got_origin + got_offset,
9109
                                                      address);
9110
      break;
9111
 
9112
    case elfcpp::R_ARM_PLT32:
9113
    case elfcpp::R_ARM_CALL:
9114
    case elfcpp::R_ARM_JUMP24:
9115
    case elfcpp::R_ARM_XPC25:
9116
      gold_assert(gsym == NULL
9117
                  || gsym->has_plt_offset()
9118
                  || gsym->final_value_is_known()
9119
                  || (gsym->is_defined()
9120
                      && !gsym->is_from_dynobj()
9121
                      && !gsym->is_preemptible()));
9122
      reloc_status =
9123
        Arm_relocate_functions::arm_branch_common(
9124
            r_type, relinfo, view, gsym, object, r_sym, psymval, address,
9125
            thumb_bit, is_weakly_undefined_without_plt);
9126
      break;
9127
 
9128
    case elfcpp::R_ARM_THM_JUMP19:
9129
      reloc_status =
9130
        Arm_relocate_functions::thm_jump19(view, object, psymval, address,
9131
                                           thumb_bit);
9132
      break;
9133
 
9134
    case elfcpp::R_ARM_THM_JUMP6:
9135
      reloc_status =
9136
        Arm_relocate_functions::thm_jump6(view, object, psymval, address);
9137
      break;
9138
 
9139
    case elfcpp::R_ARM_THM_JUMP8:
9140
      reloc_status =
9141
        Arm_relocate_functions::thm_jump8(view, object, psymval, address);
9142
      break;
9143
 
9144
    case elfcpp::R_ARM_THM_JUMP11:
9145
      reloc_status =
9146
        Arm_relocate_functions::thm_jump11(view, object, psymval, address);
9147
      break;
9148
 
9149
    case elfcpp::R_ARM_PREL31:
9150
      reloc_status = Arm_relocate_functions::prel31(view, object, psymval,
9151
                                                    address, thumb_bit);
9152
      break;
9153
 
9154
    case elfcpp::R_ARM_V4BX:
9155
      if (target->fix_v4bx() > General_options::FIX_V4BX_NONE)
9156
        {
9157
          const bool is_v4bx_interworking =
9158
              (target->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING);
9159
          reloc_status =
9160
            Arm_relocate_functions::v4bx(relinfo, view, object, address,
9161
                                         is_v4bx_interworking);
9162
        }
9163
      break;
9164
 
9165
    case elfcpp::R_ARM_THM_PC8:
9166
      reloc_status =
9167
        Arm_relocate_functions::thm_pc8(view, object, psymval, address);
9168
      break;
9169
 
9170
    case elfcpp::R_ARM_THM_PC12:
9171
      reloc_status =
9172
        Arm_relocate_functions::thm_pc12(view, object, psymval, address);
9173
      break;
9174
 
9175
    case elfcpp::R_ARM_THM_ALU_PREL_11_0:
9176
      reloc_status =
9177
        Arm_relocate_functions::thm_alu11(view, object, psymval, address,
9178
                                          thumb_bit);
9179
      break;
9180
 
9181
    case elfcpp::R_ARM_ALU_PC_G0_NC:
9182
    case elfcpp::R_ARM_ALU_PC_G0:
9183
    case elfcpp::R_ARM_ALU_PC_G1_NC:
9184
    case elfcpp::R_ARM_ALU_PC_G1:
9185
    case elfcpp::R_ARM_ALU_PC_G2:
9186
    case elfcpp::R_ARM_ALU_SB_G0_NC:
9187
    case elfcpp::R_ARM_ALU_SB_G0:
9188
    case elfcpp::R_ARM_ALU_SB_G1_NC:
9189
    case elfcpp::R_ARM_ALU_SB_G1:
9190
    case elfcpp::R_ARM_ALU_SB_G2:
9191
      reloc_status =
9192
        Arm_relocate_functions::arm_grp_alu(view, object, psymval,
9193
                                            reloc_property->group_index(),
9194
                                            relative_address_base,
9195
                                            thumb_bit, check_overflow);
9196
      break;
9197
 
9198
    case elfcpp::R_ARM_LDR_PC_G0:
9199
    case elfcpp::R_ARM_LDR_PC_G1:
9200
    case elfcpp::R_ARM_LDR_PC_G2:
9201
    case elfcpp::R_ARM_LDR_SB_G0:
9202
    case elfcpp::R_ARM_LDR_SB_G1:
9203
    case elfcpp::R_ARM_LDR_SB_G2:
9204
      reloc_status =
9205
          Arm_relocate_functions::arm_grp_ldr(view, object, psymval,
9206
                                              reloc_property->group_index(),
9207
                                              relative_address_base);
9208
      break;
9209
 
9210
    case elfcpp::R_ARM_LDRS_PC_G0:
9211
    case elfcpp::R_ARM_LDRS_PC_G1:
9212
    case elfcpp::R_ARM_LDRS_PC_G2:
9213
    case elfcpp::R_ARM_LDRS_SB_G0:
9214
    case elfcpp::R_ARM_LDRS_SB_G1:
9215
    case elfcpp::R_ARM_LDRS_SB_G2:
9216
      reloc_status =
9217
          Arm_relocate_functions::arm_grp_ldrs(view, object, psymval,
9218
                                               reloc_property->group_index(),
9219
                                               relative_address_base);
9220
      break;
9221
 
9222
    case elfcpp::R_ARM_LDC_PC_G0:
9223
    case elfcpp::R_ARM_LDC_PC_G1:
9224
    case elfcpp::R_ARM_LDC_PC_G2:
9225
    case elfcpp::R_ARM_LDC_SB_G0:
9226
    case elfcpp::R_ARM_LDC_SB_G1:
9227
    case elfcpp::R_ARM_LDC_SB_G2:
9228
      reloc_status =
9229
          Arm_relocate_functions::arm_grp_ldc(view, object, psymval,
9230
                                              reloc_property->group_index(),
9231
                                              relative_address_base);
9232
      break;
9233
 
9234
      // These are initial tls relocs, which are expected when
9235
      // linking.
9236
    case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
9237
    case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
9238
    case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
9239
    case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
9240
    case elfcpp::R_ARM_TLS_LE32:        // Local-exec
9241
      reloc_status =
9242
        this->relocate_tls(relinfo, target, relnum, rel, r_type, gsym, psymval,
9243
                           view, address, view_size);
9244
      break;
9245
 
9246
    // The known and unknown unsupported and/or deprecated relocations.
9247
    case elfcpp::R_ARM_PC24:
9248
    case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
9249
    case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
9250
    case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
9251
    default:
9252
      // Just silently leave the method. We should get an appropriate error
9253
      // message in the scan methods.
9254
      break;
9255
    }
9256
 
9257
  // Report any errors.
9258
  switch (reloc_status)
9259
    {
9260
    case Arm_relocate_functions::STATUS_OKAY:
9261
      break;
9262
    case Arm_relocate_functions::STATUS_OVERFLOW:
9263
      gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
9264
                             _("relocation overflow in %s"),
9265
                             reloc_property->name().c_str());
9266
      break;
9267
    case Arm_relocate_functions::STATUS_BAD_RELOC:
9268
      gold_error_at_location(
9269
        relinfo,
9270
        relnum,
9271
        rel.get_r_offset(),
9272
        _("unexpected opcode while processing relocation %s"),
9273
        reloc_property->name().c_str());
9274
      break;
9275
    default:
9276
      gold_unreachable();
9277
    }
9278
 
9279
  return true;
9280
}
9281
 
9282
// Perform a TLS relocation.
9283
 
9284
template<bool big_endian>
9285
inline typename Arm_relocate_functions<big_endian>::Status
9286
Target_arm<big_endian>::Relocate::relocate_tls(
9287
    const Relocate_info<32, big_endian>* relinfo,
9288
    Target_arm<big_endian>* target,
9289
    size_t relnum,
9290
    const elfcpp::Rel<32, big_endian>& rel,
9291
    unsigned int r_type,
9292
    const Sized_symbol<32>* gsym,
9293
    const Symbol_value<32>* psymval,
9294
    unsigned char* view,
9295
    elfcpp::Elf_types<32>::Elf_Addr address,
9296
    section_size_type /*view_size*/ )
9297
{
9298
  typedef Arm_relocate_functions<big_endian> ArmRelocFuncs;
9299
  typedef Relocate_functions<32, big_endian> RelocFuncs;
9300
  Output_segment* tls_segment = relinfo->layout->tls_segment();
9301
 
9302
  const Sized_relobj_file<32, big_endian>* object = relinfo->object;
9303
 
9304
  elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0);
9305
 
9306
  const bool is_final = (gsym == NULL
9307
                         ? !parameters->options().shared()
9308
                         : gsym->final_value_is_known());
9309
  const tls::Tls_optimization optimized_type
9310
      = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
9311
  switch (r_type)
9312
    {
9313
    case elfcpp::R_ARM_TLS_GD32:        // Global-dynamic
9314
        {
9315
          unsigned int got_type = GOT_TYPE_TLS_PAIR;
9316
          unsigned int got_offset;
9317
          if (gsym != NULL)
9318
            {
9319
              gold_assert(gsym->has_got_offset(got_type));
9320
              got_offset = gsym->got_offset(got_type) - target->got_size();
9321
            }
9322
          else
9323
            {
9324
              unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
9325
              gold_assert(object->local_has_got_offset(r_sym, got_type));
9326
              got_offset = (object->local_got_offset(r_sym, got_type)
9327
                            - target->got_size());
9328
            }
9329
          if (optimized_type == tls::TLSOPT_NONE)
9330
            {
9331
              Arm_address got_entry =
9332
                target->got_plt_section()->address() + got_offset;
9333
 
9334
              // Relocate the field with the PC relative offset of the pair of
9335
              // GOT entries.
9336
              RelocFuncs::pcrel32(view, got_entry, address);
9337
              return ArmRelocFuncs::STATUS_OKAY;
9338
            }
9339
        }
9340
      break;
9341
 
9342
    case elfcpp::R_ARM_TLS_LDM32:       // Local-dynamic
9343
      if (optimized_type == tls::TLSOPT_NONE)
9344
        {
9345
          // Relocate the field with the offset of the GOT entry for
9346
          // the module index.
9347
          unsigned int got_offset;
9348
          got_offset = (target->got_mod_index_entry(NULL, NULL, NULL)
9349
                        - target->got_size());
9350
          Arm_address got_entry =
9351
            target->got_plt_section()->address() + got_offset;
9352
 
9353
          // Relocate the field with the PC relative offset of the pair of
9354
          // GOT entries.
9355
          RelocFuncs::pcrel32(view, got_entry, address);
9356
          return ArmRelocFuncs::STATUS_OKAY;
9357
        }
9358
      break;
9359
 
9360
    case elfcpp::R_ARM_TLS_LDO32:       // Alternate local-dynamic
9361
      RelocFuncs::rel32(view, value);
9362
      return ArmRelocFuncs::STATUS_OKAY;
9363
 
9364
    case elfcpp::R_ARM_TLS_IE32:        // Initial-exec
9365
      if (optimized_type == tls::TLSOPT_NONE)
9366
        {
9367
          // Relocate the field with the offset of the GOT entry for
9368
          // the tp-relative offset of the symbol.
9369
          unsigned int got_type = GOT_TYPE_TLS_OFFSET;
9370
          unsigned int got_offset;
9371
          if (gsym != NULL)
9372
            {
9373
              gold_assert(gsym->has_got_offset(got_type));
9374
              got_offset = gsym->got_offset(got_type);
9375
            }
9376
          else
9377
            {
9378
              unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
9379
              gold_assert(object->local_has_got_offset(r_sym, got_type));
9380
              got_offset = object->local_got_offset(r_sym, got_type);
9381
            }
9382
 
9383
          // All GOT offsets are relative to the end of the GOT.
9384
          got_offset -= target->got_size();
9385
 
9386
          Arm_address got_entry =
9387
            target->got_plt_section()->address() + got_offset;
9388
 
9389
          // Relocate the field with the PC relative offset of the GOT entry.
9390
          RelocFuncs::pcrel32(view, got_entry, address);
9391
          return ArmRelocFuncs::STATUS_OKAY;
9392
        }
9393
      break;
9394
 
9395
    case elfcpp::R_ARM_TLS_LE32:        // Local-exec
9396
      // If we're creating a shared library, a dynamic relocation will
9397
      // have been created for this location, so do not apply it now.
9398
      if (!parameters->options().shared())
9399
        {
9400
          gold_assert(tls_segment != NULL);
9401
 
9402
          // $tp points to the TCB, which is followed by the TLS, so we
9403
          // need to add TCB size to the offset.
9404
          Arm_address aligned_tcb_size =
9405
            align_address(ARM_TCB_SIZE, tls_segment->maximum_alignment());
9406
          RelocFuncs::rel32(view, value + aligned_tcb_size);
9407
 
9408
        }
9409
      return ArmRelocFuncs::STATUS_OKAY;
9410
 
9411
    default:
9412
      gold_unreachable();
9413
    }
9414
 
9415
  gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
9416
                         _("unsupported reloc %u"),
9417
                         r_type);
9418
  return ArmRelocFuncs::STATUS_BAD_RELOC;
9419
}
9420
 
9421
// Relocate section data.
9422
 
9423
template<bool big_endian>
9424
void
9425
Target_arm<big_endian>::relocate_section(
9426
    const Relocate_info<32, big_endian>* relinfo,
9427
    unsigned int sh_type,
9428
    const unsigned char* prelocs,
9429
    size_t reloc_count,
9430
    Output_section* output_section,
9431
    bool needs_special_offset_handling,
9432
    unsigned char* view,
9433
    Arm_address address,
9434
    section_size_type view_size,
9435
    const Reloc_symbol_changes* reloc_symbol_changes)
9436
{
9437
  typedef typename Target_arm<big_endian>::Relocate Arm_relocate;
9438
  gold_assert(sh_type == elfcpp::SHT_REL);
9439
 
9440
  // See if we are relocating a relaxed input section.  If so, the view
9441
  // covers the whole output section and we need to adjust accordingly.
9442
  if (needs_special_offset_handling)
9443
    {
9444
      const Output_relaxed_input_section* poris =
9445
        output_section->find_relaxed_input_section(relinfo->object,
9446
                                                   relinfo->data_shndx);
9447
      if (poris != NULL)
9448
        {
9449
          Arm_address section_address = poris->address();
9450
          section_size_type section_size = poris->data_size();
9451
 
9452
          gold_assert((section_address >= address)
9453
                      && ((section_address + section_size)
9454
                          <= (address + view_size)));
9455
 
9456
          off_t offset = section_address - address;
9457
          view += offset;
9458
          address += offset;
9459
          view_size = section_size;
9460
        }
9461
    }
9462
 
9463
  gold::relocate_section<32, big_endian, Target_arm, elfcpp::SHT_REL,
9464
                         Arm_relocate>(
9465
    relinfo,
9466
    this,
9467
    prelocs,
9468
    reloc_count,
9469
    output_section,
9470
    needs_special_offset_handling,
9471
    view,
9472
    address,
9473
    view_size,
9474
    reloc_symbol_changes);
9475
}
9476
 
9477
// Return the size of a relocation while scanning during a relocatable
9478
// link.
9479
 
9480
template<bool big_endian>
9481
unsigned int
9482
Target_arm<big_endian>::Relocatable_size_for_reloc::get_size_for_reloc(
9483
    unsigned int r_type,
9484
    Relobj* object)
9485
{
9486
  r_type = get_real_reloc_type(r_type);
9487
  const Arm_reloc_property* arp =
9488
      arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
9489
  if (arp != NULL)
9490
    return arp->size();
9491
  else
9492
    {
9493
      std::string reloc_name =
9494
        arm_reloc_property_table->reloc_name_in_error_message(r_type);
9495
      gold_error(_("%s: unexpected %s in object file"),
9496
                 object->name().c_str(), reloc_name.c_str());
9497
      return 0;
9498
    }
9499
}
9500
 
9501
// Scan the relocs during a relocatable link.
9502
 
9503
template<bool big_endian>
9504
void
9505
Target_arm<big_endian>::scan_relocatable_relocs(
9506
    Symbol_table* symtab,
9507
    Layout* layout,
9508
    Sized_relobj_file<32, big_endian>* object,
9509
    unsigned int data_shndx,
9510
    unsigned int sh_type,
9511
    const unsigned char* prelocs,
9512
    size_t reloc_count,
9513
    Output_section* output_section,
9514
    bool needs_special_offset_handling,
9515
    size_t local_symbol_count,
9516
    const unsigned char* plocal_symbols,
9517
    Relocatable_relocs* rr)
9518
{
9519
  gold_assert(sh_type == elfcpp::SHT_REL);
9520
 
9521
  typedef Arm_scan_relocatable_relocs<big_endian, elfcpp::SHT_REL,
9522
    Relocatable_size_for_reloc> Scan_relocatable_relocs;
9523
 
9524
  gold::scan_relocatable_relocs<32, big_endian, elfcpp::SHT_REL,
9525
      Scan_relocatable_relocs>(
9526
    symtab,
9527
    layout,
9528
    object,
9529
    data_shndx,
9530
    prelocs,
9531
    reloc_count,
9532
    output_section,
9533
    needs_special_offset_handling,
9534
    local_symbol_count,
9535
    plocal_symbols,
9536
    rr);
9537
}
9538
 
9539
// Relocate a section during a relocatable link.
9540
 
9541
template<bool big_endian>
9542
void
9543
Target_arm<big_endian>::relocate_for_relocatable(
9544
    const Relocate_info<32, big_endian>* relinfo,
9545
    unsigned int sh_type,
9546
    const unsigned char* prelocs,
9547
    size_t reloc_count,
9548
    Output_section* output_section,
9549
    off_t offset_in_output_section,
9550
    const Relocatable_relocs* rr,
9551
    unsigned char* view,
9552
    Arm_address view_address,
9553
    section_size_type view_size,
9554
    unsigned char* reloc_view,
9555
    section_size_type reloc_view_size)
9556
{
9557
  gold_assert(sh_type == elfcpp::SHT_REL);
9558
 
9559
  gold::relocate_for_relocatable<32, big_endian, elfcpp::SHT_REL>(
9560
    relinfo,
9561
    prelocs,
9562
    reloc_count,
9563
    output_section,
9564
    offset_in_output_section,
9565
    rr,
9566
    view,
9567
    view_address,
9568
    view_size,
9569
    reloc_view,
9570
    reloc_view_size);
9571
}
9572
 
9573
// Perform target-specific processing in a relocatable link.  This is
9574
// only used if we use the relocation strategy RELOC_SPECIAL.
9575
 
9576
template<bool big_endian>
9577
void
9578
Target_arm<big_endian>::relocate_special_relocatable(
9579
    const Relocate_info<32, big_endian>* relinfo,
9580
    unsigned int sh_type,
9581
    const unsigned char* preloc_in,
9582
    size_t relnum,
9583
    Output_section* output_section,
9584
    off_t offset_in_output_section,
9585
    unsigned char* view,
9586
    elfcpp::Elf_types<32>::Elf_Addr view_address,
9587
    section_size_type,
9588
    unsigned char* preloc_out)
9589
{
9590
  // We can only handle REL type relocation sections.
9591
  gold_assert(sh_type == elfcpp::SHT_REL);
9592
 
9593
  typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc Reltype;
9594
  typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc_write
9595
    Reltype_write;
9596
  const Arm_address invalid_address = static_cast<Arm_address>(0) - 1;
9597
 
9598
  const Arm_relobj<big_endian>* object =
9599
    Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
9600
  const unsigned int local_count = object->local_symbol_count();
9601
 
9602
  Reltype reloc(preloc_in);
9603
  Reltype_write reloc_write(preloc_out);
9604
 
9605
  elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
9606
  const unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
9607
  const unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
9608
 
9609
  const Arm_reloc_property* arp =
9610
    arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
9611
  gold_assert(arp != NULL);
9612
 
9613
  // Get the new symbol index.
9614
  // We only use RELOC_SPECIAL strategy in local relocations.
9615
  gold_assert(r_sym < local_count);
9616
 
9617
  // We are adjusting a section symbol.  We need to find
9618
  // the symbol table index of the section symbol for
9619
  // the output section corresponding to input section
9620
  // in which this symbol is defined.
9621
  bool is_ordinary;
9622
  unsigned int shndx = object->local_symbol_input_shndx(r_sym, &is_ordinary);
9623
  gold_assert(is_ordinary);
9624
  Output_section* os = object->output_section(shndx);
9625
  gold_assert(os != NULL);
9626
  gold_assert(os->needs_symtab_index());
9627
  unsigned int new_symndx = os->symtab_index();
9628
 
9629
  // Get the new offset--the location in the output section where
9630
  // this relocation should be applied.
9631
 
9632
  Arm_address offset = reloc.get_r_offset();
9633
  Arm_address new_offset;
9634
  if (offset_in_output_section != invalid_address)
9635
    new_offset = offset + offset_in_output_section;
9636
  else
9637
    {
9638
      section_offset_type sot_offset =
9639
          convert_types<section_offset_type, Arm_address>(offset);
9640
      section_offset_type new_sot_offset =
9641
          output_section->output_offset(object, relinfo->data_shndx,
9642
                                        sot_offset);
9643
      gold_assert(new_sot_offset != -1);
9644
      new_offset = new_sot_offset;
9645
    }
9646
 
9647
  // In an object file, r_offset is an offset within the section.
9648
  // In an executable or dynamic object, generated by
9649
  // --emit-relocs, r_offset is an absolute address.
9650
  if (!parameters->options().relocatable())
9651
    {
9652
      new_offset += view_address;
9653
      if (offset_in_output_section != invalid_address)
9654
        new_offset -= offset_in_output_section;
9655
    }
9656
 
9657
  reloc_write.put_r_offset(new_offset);
9658
  reloc_write.put_r_info(elfcpp::elf_r_info<32>(new_symndx, r_type));
9659
 
9660
  // Handle the reloc addend.
9661
  // The relocation uses a section symbol in the input file.
9662
  // We are adjusting it to use a section symbol in the output
9663
  // file.  The input section symbol refers to some address in
9664
  // the input section.  We need the relocation in the output
9665
  // file to refer to that same address.  This adjustment to
9666
  // the addend is the same calculation we use for a simple
9667
  // absolute relocation for the input section symbol.
9668
 
9669
  const Symbol_value<32>* psymval = object->local_symbol(r_sym);
9670
 
9671
  // Handle THUMB bit.
9672
  Symbol_value<32> symval;
9673
  Arm_address thumb_bit =
9674
     object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
9675
  if (thumb_bit != 0
9676
      && arp->uses_thumb_bit()
9677
      && ((psymval->value(object, 0) & 1) != 0))
9678
    {
9679
      Arm_address stripped_value =
9680
        psymval->value(object, 0) & ~static_cast<Arm_address>(1);
9681
      symval.set_output_value(stripped_value);
9682
      psymval = &symval;
9683
    }
9684
 
9685
  unsigned char* paddend = view + offset;
9686
  typename Arm_relocate_functions<big_endian>::Status reloc_status =
9687
        Arm_relocate_functions<big_endian>::STATUS_OKAY;
9688
  switch (r_type)
9689
    {
9690
    case elfcpp::R_ARM_ABS8:
9691
      reloc_status = Arm_relocate_functions<big_endian>::abs8(paddend, object,
9692
                                                              psymval);
9693
      break;
9694
 
9695
    case elfcpp::R_ARM_ABS12:
9696
      reloc_status = Arm_relocate_functions<big_endian>::abs12(paddend, object,
9697
                                                               psymval);
9698
      break;
9699
 
9700
    case elfcpp::R_ARM_ABS16:
9701
      reloc_status = Arm_relocate_functions<big_endian>::abs16(paddend, object,
9702
                                                               psymval);
9703
      break;
9704
 
9705
    case elfcpp::R_ARM_THM_ABS5:
9706
      reloc_status = Arm_relocate_functions<big_endian>::thm_abs5(paddend,
9707
                                                                  object,
9708
                                                                  psymval);
9709
      break;
9710
 
9711
    case elfcpp::R_ARM_MOVW_ABS_NC:
9712
    case elfcpp::R_ARM_MOVW_PREL_NC:
9713
    case elfcpp::R_ARM_MOVW_BREL_NC:
9714
    case elfcpp::R_ARM_MOVW_BREL:
9715
      reloc_status = Arm_relocate_functions<big_endian>::movw(
9716
          paddend, object, psymval, 0, thumb_bit, arp->checks_overflow());
9717
      break;
9718
 
9719
    case elfcpp::R_ARM_THM_MOVW_ABS_NC:
9720
    case elfcpp::R_ARM_THM_MOVW_PREL_NC:
9721
    case elfcpp::R_ARM_THM_MOVW_BREL_NC:
9722
    case elfcpp::R_ARM_THM_MOVW_BREL:
9723
      reloc_status = Arm_relocate_functions<big_endian>::thm_movw(
9724
          paddend, object, psymval, 0, thumb_bit, arp->checks_overflow());
9725
      break;
9726
 
9727
    case elfcpp::R_ARM_THM_CALL:
9728
    case elfcpp::R_ARM_THM_XPC22:
9729
    case elfcpp::R_ARM_THM_JUMP24:
9730
      reloc_status =
9731
        Arm_relocate_functions<big_endian>::thumb_branch_common(
9732
            r_type, relinfo, paddend, NULL, object, 0, psymval, 0, thumb_bit,
9733
            false);
9734
      break;
9735
 
9736
    case elfcpp::R_ARM_PLT32:
9737
    case elfcpp::R_ARM_CALL:
9738
    case elfcpp::R_ARM_JUMP24:
9739
    case elfcpp::R_ARM_XPC25:
9740
      reloc_status =
9741
        Arm_relocate_functions<big_endian>::arm_branch_common(
9742
            r_type, relinfo, paddend, NULL, object, 0, psymval, 0, thumb_bit,
9743
            false);
9744
      break;
9745
 
9746
    case elfcpp::R_ARM_THM_JUMP19:
9747
      reloc_status =
9748
        Arm_relocate_functions<big_endian>::thm_jump19(paddend, object,
9749
                                                       psymval, 0, thumb_bit);
9750
      break;
9751
 
9752
    case elfcpp::R_ARM_THM_JUMP6:
9753
      reloc_status =
9754
        Arm_relocate_functions<big_endian>::thm_jump6(paddend, object, psymval,
9755
                                                      0);
9756
      break;
9757
 
9758
    case elfcpp::R_ARM_THM_JUMP8:
9759
      reloc_status =
9760
        Arm_relocate_functions<big_endian>::thm_jump8(paddend, object, psymval,
9761
                                                      0);
9762
      break;
9763
 
9764
    case elfcpp::R_ARM_THM_JUMP11:
9765
      reloc_status =
9766
        Arm_relocate_functions<big_endian>::thm_jump11(paddend, object, psymval,
9767
                                                       0);
9768
      break;
9769
 
9770
    case elfcpp::R_ARM_PREL31:
9771
      reloc_status =
9772
        Arm_relocate_functions<big_endian>::prel31(paddend, object, psymval, 0,
9773
                                                   thumb_bit);
9774
      break;
9775
 
9776
    case elfcpp::R_ARM_THM_PC8:
9777
      reloc_status =
9778
        Arm_relocate_functions<big_endian>::thm_pc8(paddend, object, psymval,
9779
                                                    0);
9780
      break;
9781
 
9782
    case elfcpp::R_ARM_THM_PC12:
9783
      reloc_status =
9784
        Arm_relocate_functions<big_endian>::thm_pc12(paddend, object, psymval,
9785
                                                     0);
9786
      break;
9787
 
9788
    case elfcpp::R_ARM_THM_ALU_PREL_11_0:
9789
      reloc_status =
9790
        Arm_relocate_functions<big_endian>::thm_alu11(paddend, object, psymval,
9791
                                                      0, thumb_bit);
9792
      break;
9793
 
9794
    // These relocation truncate relocation results so we cannot handle them
9795
    // in a relocatable link.
9796
    case elfcpp::R_ARM_MOVT_ABS:
9797
    case elfcpp::R_ARM_THM_MOVT_ABS:
9798
    case elfcpp::R_ARM_MOVT_PREL:
9799
    case elfcpp::R_ARM_MOVT_BREL:
9800
    case elfcpp::R_ARM_THM_MOVT_PREL:
9801
    case elfcpp::R_ARM_THM_MOVT_BREL:
9802
    case elfcpp::R_ARM_ALU_PC_G0_NC:
9803
    case elfcpp::R_ARM_ALU_PC_G0:
9804
    case elfcpp::R_ARM_ALU_PC_G1_NC:
9805
    case elfcpp::R_ARM_ALU_PC_G1:
9806
    case elfcpp::R_ARM_ALU_PC_G2:
9807
    case elfcpp::R_ARM_ALU_SB_G0_NC:
9808
    case elfcpp::R_ARM_ALU_SB_G0:
9809
    case elfcpp::R_ARM_ALU_SB_G1_NC:
9810
    case elfcpp::R_ARM_ALU_SB_G1:
9811
    case elfcpp::R_ARM_ALU_SB_G2:
9812
    case elfcpp::R_ARM_LDR_PC_G0:
9813
    case elfcpp::R_ARM_LDR_PC_G1:
9814
    case elfcpp::R_ARM_LDR_PC_G2:
9815
    case elfcpp::R_ARM_LDR_SB_G0:
9816
    case elfcpp::R_ARM_LDR_SB_G1:
9817
    case elfcpp::R_ARM_LDR_SB_G2:
9818
    case elfcpp::R_ARM_LDRS_PC_G0:
9819
    case elfcpp::R_ARM_LDRS_PC_G1:
9820
    case elfcpp::R_ARM_LDRS_PC_G2:
9821
    case elfcpp::R_ARM_LDRS_SB_G0:
9822
    case elfcpp::R_ARM_LDRS_SB_G1:
9823
    case elfcpp::R_ARM_LDRS_SB_G2:
9824
    case elfcpp::R_ARM_LDC_PC_G0:
9825
    case elfcpp::R_ARM_LDC_PC_G1:
9826
    case elfcpp::R_ARM_LDC_PC_G2:
9827
    case elfcpp::R_ARM_LDC_SB_G0:
9828
    case elfcpp::R_ARM_LDC_SB_G1:
9829
    case elfcpp::R_ARM_LDC_SB_G2:
9830
      gold_error(_("cannot handle %s in a relocatable link"),
9831
                 arp->name().c_str());
9832
      break;
9833
 
9834
    default:
9835
      gold_unreachable();
9836
    }
9837
 
9838
  // Report any errors.
9839
  switch (reloc_status)
9840
    {
9841
    case Arm_relocate_functions<big_endian>::STATUS_OKAY:
9842
      break;
9843
    case Arm_relocate_functions<big_endian>::STATUS_OVERFLOW:
9844
      gold_error_at_location(relinfo, relnum, reloc.get_r_offset(),
9845
                             _("relocation overflow in %s"),
9846
                             arp->name().c_str());
9847
      break;
9848
    case Arm_relocate_functions<big_endian>::STATUS_BAD_RELOC:
9849
      gold_error_at_location(relinfo, relnum, reloc.get_r_offset(),
9850
        _("unexpected opcode while processing relocation %s"),
9851
        arp->name().c_str());
9852
      break;
9853
    default:
9854
      gold_unreachable();
9855
    }
9856
}
9857
 
9858
// Return the value to use for a dynamic symbol which requires special
9859
// treatment.  This is how we support equality comparisons of function
9860
// pointers across shared library boundaries, as described in the
9861
// processor specific ABI supplement.
9862
 
9863
template<bool big_endian>
9864
uint64_t
9865
Target_arm<big_endian>::do_dynsym_value(const Symbol* gsym) const
9866
{
9867
  gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
9868
  return this->plt_section()->address() + gsym->plt_offset();
9869
}
9870
 
9871
// Map platform-specific relocs to real relocs
9872
//
9873
template<bool big_endian>
9874
unsigned int
9875
Target_arm<big_endian>::get_real_reloc_type(unsigned int r_type)
9876
{
9877
  switch (r_type)
9878
    {
9879
    case elfcpp::R_ARM_TARGET1:
9880
      // This is either R_ARM_ABS32 or R_ARM_REL32;
9881
      return elfcpp::R_ARM_ABS32;
9882
 
9883
    case elfcpp::R_ARM_TARGET2:
9884
      // This can be any reloc type but usually is R_ARM_GOT_PREL
9885
      return elfcpp::R_ARM_GOT_PREL;
9886
 
9887
    default:
9888
      return r_type;
9889
    }
9890
}
9891
 
9892
// Whether if two EABI versions V1 and V2 are compatible.
9893
 
9894
template<bool big_endian>
9895
bool
9896
Target_arm<big_endian>::are_eabi_versions_compatible(
9897
    elfcpp::Elf_Word v1,
9898
    elfcpp::Elf_Word v2)
9899
{
9900
  // v4 and v5 are the same spec before and after it was released,
9901
  // so allow mixing them.
9902
  if ((v1 == elfcpp::EF_ARM_EABI_UNKNOWN || v2 == elfcpp::EF_ARM_EABI_UNKNOWN)
9903
      || (v1 == elfcpp::EF_ARM_EABI_VER4 && v2 == elfcpp::EF_ARM_EABI_VER5)
9904
      || (v1 == elfcpp::EF_ARM_EABI_VER5 && v2 == elfcpp::EF_ARM_EABI_VER4))
9905
    return true;
9906
 
9907
  return v1 == v2;
9908
}
9909
 
9910
// Combine FLAGS from an input object called NAME and the processor-specific
9911
// flags in the ELF header of the output.  Much of this is adapted from the
9912
// processor-specific flags merging code in elf32_arm_merge_private_bfd_data
9913
// in bfd/elf32-arm.c.
9914
 
9915
template<bool big_endian>
9916
void
9917
Target_arm<big_endian>::merge_processor_specific_flags(
9918
    const std::string& name,
9919
    elfcpp::Elf_Word flags)
9920
{
9921
  if (this->are_processor_specific_flags_set())
9922
    {
9923
      elfcpp::Elf_Word out_flags = this->processor_specific_flags();
9924
 
9925
      // Nothing to merge if flags equal to those in output.
9926
      if (flags == out_flags)
9927
        return;
9928
 
9929
      // Complain about various flag mismatches.
9930
      elfcpp::Elf_Word version1 = elfcpp::arm_eabi_version(flags);
9931
      elfcpp::Elf_Word version2 = elfcpp::arm_eabi_version(out_flags);
9932
      if (!this->are_eabi_versions_compatible(version1, version2)
9933
          && parameters->options().warn_mismatch())
9934
        gold_error(_("Source object %s has EABI version %d but output has "
9935
                     "EABI version %d."),
9936
                   name.c_str(),
9937
                   (flags & elfcpp::EF_ARM_EABIMASK) >> 24,
9938
                   (out_flags & elfcpp::EF_ARM_EABIMASK) >> 24);
9939
    }
9940
  else
9941
    {
9942
      // If the input is the default architecture and had the default
9943
      // flags then do not bother setting the flags for the output
9944
      // architecture, instead allow future merges to do this.  If no
9945
      // future merges ever set these flags then they will retain their
9946
      // uninitialised values, which surprise surprise, correspond
9947
      // to the default values.
9948
      if (flags == 0)
9949
        return;
9950
 
9951
      // This is the first time, just copy the flags.
9952
      // We only copy the EABI version for now.
9953
      this->set_processor_specific_flags(flags & elfcpp::EF_ARM_EABIMASK);
9954
    }
9955
}
9956
 
9957
// Adjust ELF file header.
9958
template<bool big_endian>
9959
void
9960
Target_arm<big_endian>::do_adjust_elf_header(
9961
    unsigned char* view,
9962
    int len) const
9963
{
9964
  gold_assert(len == elfcpp::Elf_sizes<32>::ehdr_size);
9965
 
9966
  elfcpp::Ehdr<32, big_endian> ehdr(view);
9967
  unsigned char e_ident[elfcpp::EI_NIDENT];
9968
  memcpy(e_ident, ehdr.get_e_ident(), elfcpp::EI_NIDENT);
9969
 
9970
  if (elfcpp::arm_eabi_version(this->processor_specific_flags())
9971
      == elfcpp::EF_ARM_EABI_UNKNOWN)
9972
    e_ident[elfcpp::EI_OSABI] = elfcpp::ELFOSABI_ARM;
9973
  else
9974
    e_ident[elfcpp::EI_OSABI] = 0;
9975
  e_ident[elfcpp::EI_ABIVERSION] = 0;
9976
 
9977
  // FIXME: Do EF_ARM_BE8 adjustment.
9978
 
9979
  elfcpp::Ehdr_write<32, big_endian> oehdr(view);
9980
  oehdr.put_e_ident(e_ident);
9981
}
9982
 
9983
// do_make_elf_object to override the same function in the base class.
9984
// We need to use a target-specific sub-class of
9985
// Sized_relobj_file<32, big_endian> to store ARM specific information.
9986
// Hence we need to have our own ELF object creation.
9987
 
9988
template<bool big_endian>
9989
Object*
9990
Target_arm<big_endian>::do_make_elf_object(
9991
    const std::string& name,
9992
    Input_file* input_file,
9993
    off_t offset, const elfcpp::Ehdr<32, big_endian>& ehdr)
9994
{
9995
  int et = ehdr.get_e_type();
9996
  if (et == elfcpp::ET_REL)
9997
    {
9998
      Arm_relobj<big_endian>* obj =
9999
        new Arm_relobj<big_endian>(name, input_file, offset, ehdr);
10000
      obj->setup();
10001
      return obj;
10002
    }
10003
  else if (et == elfcpp::ET_DYN)
10004
    {
10005
      Sized_dynobj<32, big_endian>* obj =
10006
        new Arm_dynobj<big_endian>(name, input_file, offset, ehdr);
10007
      obj->setup();
10008
      return obj;
10009
    }
10010
  else
10011
    {
10012
      gold_error(_("%s: unsupported ELF file type %d"),
10013
                 name.c_str(), et);
10014
      return NULL;
10015
    }
10016
}
10017
 
10018
// Read the architecture from the Tag_also_compatible_with attribute, if any.
10019
// Returns -1 if no architecture could be read.
10020
// This is adapted from get_secondary_compatible_arch() in bfd/elf32-arm.c.
10021
 
10022
template<bool big_endian>
10023
int
10024
Target_arm<big_endian>::get_secondary_compatible_arch(
10025
    const Attributes_section_data* pasd)
10026
{
10027
  const Object_attribute* known_attributes =
10028
    pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
10029
 
10030
  // Note: the tag and its argument below are uleb128 values, though
10031
  // currently-defined values fit in one byte for each.
10032
  const std::string& sv =
10033
    known_attributes[elfcpp::Tag_also_compatible_with].string_value();
10034
  if (sv.size() == 2
10035
      && sv.data()[0] == elfcpp::Tag_CPU_arch
10036
      && (sv.data()[1] & 128) != 128)
10037
   return sv.data()[1];
10038
 
10039
  // This tag is "safely ignorable", so don't complain if it looks funny.
10040
  return -1;
10041
}
10042
 
10043
// Set, or unset, the architecture of the Tag_also_compatible_with attribute.
10044
// The tag is removed if ARCH is -1.
10045
// This is adapted from set_secondary_compatible_arch() in bfd/elf32-arm.c.
10046
 
10047
template<bool big_endian>
10048
void
10049
Target_arm<big_endian>::set_secondary_compatible_arch(
10050
    Attributes_section_data* pasd,
10051
    int arch)
10052
{
10053
  Object_attribute* known_attributes =
10054
    pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
10055
 
10056
  if (arch == -1)
10057
    {
10058
      known_attributes[elfcpp::Tag_also_compatible_with].set_string_value("");
10059
      return;
10060
    }
10061
 
10062
  // Note: the tag and its argument below are uleb128 values, though
10063
  // currently-defined values fit in one byte for each.
10064
  char sv[3];
10065
  sv[0] = elfcpp::Tag_CPU_arch;
10066
  gold_assert(arch != 0);
10067
  sv[1] = arch;
10068
  sv[2] = '\0';
10069
 
10070
  known_attributes[elfcpp::Tag_also_compatible_with].set_string_value(sv);
10071
}
10072
 
10073
// Combine two values for Tag_CPU_arch, taking secondary compatibility tags
10074
// into account.
10075
// This is adapted from tag_cpu_arch_combine() in bfd/elf32-arm.c.
10076
 
10077
template<bool big_endian>
10078
int
10079
Target_arm<big_endian>::tag_cpu_arch_combine(
10080
    const char* name,
10081
    int oldtag,
10082
    int* secondary_compat_out,
10083
    int newtag,
10084
    int secondary_compat)
10085
{
10086
#define T(X) elfcpp::TAG_CPU_ARCH_##X
10087
  static const int v6t2[] =
10088
    {
10089
      T(V6T2),   // PRE_V4.
10090
      T(V6T2),   // V4.
10091
      T(V6T2),   // V4T.
10092
      T(V6T2),   // V5T.
10093
      T(V6T2),   // V5TE.
10094
      T(V6T2),   // V5TEJ.
10095
      T(V6T2),   // V6.
10096
      T(V7),     // V6KZ.
10097
      T(V6T2)    // V6T2.
10098
    };
10099
  static const int v6k[] =
10100
    {
10101
      T(V6K),    // PRE_V4.
10102
      T(V6K),    // V4.
10103
      T(V6K),    // V4T.
10104
      T(V6K),    // V5T.
10105
      T(V6K),    // V5TE.
10106
      T(V6K),    // V5TEJ.
10107
      T(V6K),    // V6.
10108
      T(V6KZ),   // V6KZ.
10109
      T(V7),     // V6T2.
10110
      T(V6K)     // V6K.
10111
    };
10112
  static const int v7[] =
10113
    {
10114
      T(V7),     // PRE_V4.
10115
      T(V7),     // V4.
10116
      T(V7),     // V4T.
10117
      T(V7),     // V5T.
10118
      T(V7),     // V5TE.
10119
      T(V7),     // V5TEJ.
10120
      T(V7),     // V6.
10121
      T(V7),     // V6KZ.
10122
      T(V7),     // V6T2.
10123
      T(V7),     // V6K.
10124
      T(V7)      // V7.
10125
    };
10126
  static const int v6_m[] =
10127
    {
10128
      -1,        // PRE_V4.
10129
      -1,        // V4.
10130
      T(V6K),    // V4T.
10131
      T(V6K),    // V5T.
10132
      T(V6K),    // V5TE.
10133
      T(V6K),    // V5TEJ.
10134
      T(V6K),    // V6.
10135
      T(V6KZ),   // V6KZ.
10136
      T(V7),     // V6T2.
10137
      T(V6K),    // V6K.
10138
      T(V7),     // V7.
10139
      T(V6_M)    // V6_M.
10140
    };
10141
  static const int v6s_m[] =
10142
    {
10143
      -1,        // PRE_V4.
10144
      -1,        // V4.
10145
      T(V6K),    // V4T.
10146
      T(V6K),    // V5T.
10147
      T(V6K),    // V5TE.
10148
      T(V6K),    // V5TEJ.
10149
      T(V6K),    // V6.
10150
      T(V6KZ),   // V6KZ.
10151
      T(V7),     // V6T2.
10152
      T(V6K),    // V6K.
10153
      T(V7),     // V7.
10154
      T(V6S_M),  // V6_M.
10155
      T(V6S_M)   // V6S_M.
10156
    };
10157
  static const int v7e_m[] =
10158
    {
10159
      -1,       // PRE_V4.
10160
      -1,       // V4.
10161
      T(V7E_M), // V4T.
10162
      T(V7E_M), // V5T.
10163
      T(V7E_M), // V5TE.
10164
      T(V7E_M), // V5TEJ.
10165
      T(V7E_M), // V6.
10166
      T(V7E_M), // V6KZ.
10167
      T(V7E_M), // V6T2.
10168
      T(V7E_M), // V6K.
10169
      T(V7E_M), // V7.
10170
      T(V7E_M), // V6_M.
10171
      T(V7E_M), // V6S_M.
10172
      T(V7E_M)  // V7E_M.
10173
    };
10174
  static const int v4t_plus_v6_m[] =
10175
    {
10176
      -1,               // PRE_V4.
10177
      -1,               // V4.
10178
      T(V4T),           // V4T.
10179
      T(V5T),           // V5T.
10180
      T(V5TE),          // V5TE.
10181
      T(V5TEJ),         // V5TEJ.
10182
      T(V6),            // V6.
10183
      T(V6KZ),          // V6KZ.
10184
      T(V6T2),          // V6T2.
10185
      T(V6K),           // V6K.
10186
      T(V7),            // V7.
10187
      T(V6_M),          // V6_M.
10188
      T(V6S_M),         // V6S_M.
10189
      T(V7E_M),         // V7E_M.
10190
      T(V4T_PLUS_V6_M)  // V4T plus V6_M.
10191
    };
10192
  static const int* comb[] =
10193
    {
10194
      v6t2,
10195
      v6k,
10196
      v7,
10197
      v6_m,
10198
      v6s_m,
10199
      v7e_m,
10200
      // Pseudo-architecture.
10201
      v4t_plus_v6_m
10202
    };
10203
 
10204
  // Check we've not got a higher architecture than we know about.
10205
 
10206
  if (oldtag > elfcpp::MAX_TAG_CPU_ARCH || newtag > elfcpp::MAX_TAG_CPU_ARCH)
10207
    {
10208
      gold_error(_("%s: unknown CPU architecture"), name);
10209
      return -1;
10210
    }
10211
 
10212
  // Override old tag if we have a Tag_also_compatible_with on the output.
10213
 
10214
  if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
10215
      || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
10216
    oldtag = T(V4T_PLUS_V6_M);
10217
 
10218
  // And override the new tag if we have a Tag_also_compatible_with on the
10219
  // input.
10220
 
10221
  if ((newtag == T(V6_M) && secondary_compat == T(V4T))
10222
      || (newtag == T(V4T) && secondary_compat == T(V6_M)))
10223
    newtag = T(V4T_PLUS_V6_M);
10224
 
10225
  // Architectures before V6KZ add features monotonically.
10226
  int tagh = std::max(oldtag, newtag);
10227
  if (tagh <= elfcpp::TAG_CPU_ARCH_V6KZ)
10228
    return tagh;
10229
 
10230
  int tagl = std::min(oldtag, newtag);
10231
  int result = comb[tagh - T(V6T2)][tagl];
10232
 
10233
  // Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
10234
  // as the canonical version.
10235
  if (result == T(V4T_PLUS_V6_M))
10236
    {
10237
      result = T(V4T);
10238
      *secondary_compat_out = T(V6_M);
10239
    }
10240
  else
10241
    *secondary_compat_out = -1;
10242
 
10243
  if (result == -1)
10244
    {
10245
      gold_error(_("%s: conflicting CPU architectures %d/%d"),
10246
                 name, oldtag, newtag);
10247
      return -1;
10248
    }
10249
 
10250
  return result;
10251
#undef T
10252
}
10253
 
10254
// Helper to print AEABI enum tag value.
10255
 
10256
template<bool big_endian>
10257
std::string
10258
Target_arm<big_endian>::aeabi_enum_name(unsigned int value)
10259
{
10260
  static const char* aeabi_enum_names[] =
10261
    { "", "variable-size", "32-bit", "" };
10262
  const size_t aeabi_enum_names_size =
10263
    sizeof(aeabi_enum_names) / sizeof(aeabi_enum_names[0]);
10264
 
10265
  if (value < aeabi_enum_names_size)
10266
    return std::string(aeabi_enum_names[value]);
10267
  else
10268
    {
10269
      char buffer[100];
10270
      sprintf(buffer, "<unknown value %u>", value);
10271
      return std::string(buffer);
10272
    }
10273
}
10274
 
10275
// Return the string value to store in TAG_CPU_name.
10276
 
10277
template<bool big_endian>
10278
std::string
10279
Target_arm<big_endian>::tag_cpu_name_value(unsigned int value)
10280
{
10281
  static const char* name_table[] = {
10282
    // These aren't real CPU names, but we can't guess
10283
    // that from the architecture version alone.
10284
   "Pre v4",
10285
   "ARM v4",
10286
   "ARM v4T",
10287
   "ARM v5T",
10288
   "ARM v5TE",
10289
   "ARM v5TEJ",
10290
   "ARM v6",
10291
   "ARM v6KZ",
10292
   "ARM v6T2",
10293
   "ARM v6K",
10294
   "ARM v7",
10295
   "ARM v6-M",
10296
   "ARM v6S-M",
10297
   "ARM v7E-M"
10298
 };
10299
 const size_t name_table_size = sizeof(name_table) / sizeof(name_table[0]);
10300
 
10301
  if (value < name_table_size)
10302
    return std::string(name_table[value]);
10303
  else
10304
    {
10305
      char buffer[100];
10306
      sprintf(buffer, "<unknown CPU value %u>", value);
10307
      return std::string(buffer);
10308
    }
10309
}
10310
 
10311
// Merge object attributes from input file called NAME with those of the
10312
// output.  The input object attributes are in the object pointed by PASD.
10313
 
10314
template<bool big_endian>
10315
void
10316
Target_arm<big_endian>::merge_object_attributes(
10317
    const char* name,
10318
    const Attributes_section_data* pasd)
10319
{
10320
  // Return if there is no attributes section data.
10321
  if (pasd == NULL)
10322
    return;
10323
 
10324
  // If output has no object attributes, just copy.
10325
  const int vendor = Object_attribute::OBJ_ATTR_PROC;
10326
  if (this->attributes_section_data_ == NULL)
10327
    {
10328
      this->attributes_section_data_ = new Attributes_section_data(*pasd);
10329
      Object_attribute* out_attr =
10330
        this->attributes_section_data_->known_attributes(vendor);
10331
 
10332
      // We do not output objects with Tag_MPextension_use_legacy - we move
10333
      //  the attribute's value to Tag_MPextension_use.  */
10334
      if (out_attr[elfcpp::Tag_MPextension_use_legacy].int_value() != 0)
10335
        {
10336
          if (out_attr[elfcpp::Tag_MPextension_use].int_value() != 0
10337
              && out_attr[elfcpp::Tag_MPextension_use_legacy].int_value()
10338
                != out_attr[elfcpp::Tag_MPextension_use].int_value())
10339
            {
10340
              gold_error(_("%s has both the current and legacy "
10341
                           "Tag_MPextension_use attributes"),
10342
                         name);
10343
            }
10344
 
10345
          out_attr[elfcpp::Tag_MPextension_use] =
10346
            out_attr[elfcpp::Tag_MPextension_use_legacy];
10347
          out_attr[elfcpp::Tag_MPextension_use_legacy].set_type(0);
10348
          out_attr[elfcpp::Tag_MPextension_use_legacy].set_int_value(0);
10349
        }
10350
 
10351
      return;
10352
    }
10353
 
10354
  const Object_attribute* in_attr = pasd->known_attributes(vendor);
10355
  Object_attribute* out_attr =
10356
    this->attributes_section_data_->known_attributes(vendor);
10357
 
10358
  // This needs to happen before Tag_ABI_FP_number_model is merged.  */
10359
  if (in_attr[elfcpp::Tag_ABI_VFP_args].int_value()
10360
      != out_attr[elfcpp::Tag_ABI_VFP_args].int_value())
10361
    {
10362
      // Ignore mismatches if the object doesn't use floating point.  */
10363
      if (out_attr[elfcpp::Tag_ABI_FP_number_model].int_value() == 0)
10364
        out_attr[elfcpp::Tag_ABI_VFP_args].set_int_value(
10365
            in_attr[elfcpp::Tag_ABI_VFP_args].int_value());
10366
      else if (in_attr[elfcpp::Tag_ABI_FP_number_model].int_value() != 0
10367
               && parameters->options().warn_mismatch())
10368
        gold_error(_("%s uses VFP register arguments, output does not"),
10369
                   name);
10370
    }
10371
 
10372
  for (int i = 4; i < Vendor_object_attributes::NUM_KNOWN_ATTRIBUTES; ++i)
10373
    {
10374
      // Merge this attribute with existing attributes.
10375
      switch (i)
10376
        {
10377
        case elfcpp::Tag_CPU_raw_name:
10378
        case elfcpp::Tag_CPU_name:
10379
          // These are merged after Tag_CPU_arch.
10380
          break;
10381
 
10382
        case elfcpp::Tag_ABI_optimization_goals:
10383
        case elfcpp::Tag_ABI_FP_optimization_goals:
10384
          // Use the first value seen.
10385
          break;
10386
 
10387
        case elfcpp::Tag_CPU_arch:
10388
          {
10389
            unsigned int saved_out_attr = out_attr->int_value();
10390
            // Merge Tag_CPU_arch and Tag_also_compatible_with.
10391
            int secondary_compat =
10392
              this->get_secondary_compatible_arch(pasd);
10393
            int secondary_compat_out =
10394
              this->get_secondary_compatible_arch(
10395
                  this->attributes_section_data_);
10396
            out_attr[i].set_int_value(
10397
                tag_cpu_arch_combine(name, out_attr[i].int_value(),
10398
                                     &secondary_compat_out,
10399
                                     in_attr[i].int_value(),
10400
                                     secondary_compat));
10401
            this->set_secondary_compatible_arch(this->attributes_section_data_,
10402
                                                secondary_compat_out);
10403
 
10404
            // Merge Tag_CPU_name and Tag_CPU_raw_name.
10405
            if (out_attr[i].int_value() == saved_out_attr)
10406
              ; // Leave the names alone.
10407
            else if (out_attr[i].int_value() == in_attr[i].int_value())
10408
              {
10409
                // The output architecture has been changed to match the
10410
                // input architecture.  Use the input names.
10411
                out_attr[elfcpp::Tag_CPU_name].set_string_value(
10412
                    in_attr[elfcpp::Tag_CPU_name].string_value());
10413
                out_attr[elfcpp::Tag_CPU_raw_name].set_string_value(
10414
                    in_attr[elfcpp::Tag_CPU_raw_name].string_value());
10415
              }
10416
            else
10417
              {
10418
                out_attr[elfcpp::Tag_CPU_name].set_string_value("");
10419
                out_attr[elfcpp::Tag_CPU_raw_name].set_string_value("");
10420
              }
10421
 
10422
            // If we still don't have a value for Tag_CPU_name,
10423
            // make one up now.  Tag_CPU_raw_name remains blank.
10424
            if (out_attr[elfcpp::Tag_CPU_name].string_value() == "")
10425
              {
10426
                const std::string cpu_name =
10427
                  this->tag_cpu_name_value(out_attr[i].int_value());
10428
                // FIXME:  If we see an unknown CPU, this will be set
10429
                // to "<unknown CPU n>", where n is the attribute value.
10430
                // This is different from BFD, which leaves the name alone.
10431
                out_attr[elfcpp::Tag_CPU_name].set_string_value(cpu_name);
10432
              }
10433
          }
10434
          break;
10435
 
10436
        case elfcpp::Tag_ARM_ISA_use:
10437
        case elfcpp::Tag_THUMB_ISA_use:
10438
        case elfcpp::Tag_WMMX_arch:
10439
        case elfcpp::Tag_Advanced_SIMD_arch:
10440
          // ??? Do Advanced_SIMD (NEON) and WMMX conflict?
10441
        case elfcpp::Tag_ABI_FP_rounding:
10442
        case elfcpp::Tag_ABI_FP_exceptions:
10443
        case elfcpp::Tag_ABI_FP_user_exceptions:
10444
        case elfcpp::Tag_ABI_FP_number_model:
10445
        case elfcpp::Tag_VFP_HP_extension:
10446
        case elfcpp::Tag_CPU_unaligned_access:
10447
        case elfcpp::Tag_T2EE_use:
10448
        case elfcpp::Tag_Virtualization_use:
10449
        case elfcpp::Tag_MPextension_use:
10450
          // Use the largest value specified.
10451
          if (in_attr[i].int_value() > out_attr[i].int_value())
10452
            out_attr[i].set_int_value(in_attr[i].int_value());
10453
          break;
10454
 
10455
        case elfcpp::Tag_ABI_align8_preserved:
10456
        case elfcpp::Tag_ABI_PCS_RO_data:
10457
          // Use the smallest value specified.
10458
          if (in_attr[i].int_value() < out_attr[i].int_value())
10459
            out_attr[i].set_int_value(in_attr[i].int_value());
10460
          break;
10461
 
10462
        case elfcpp::Tag_ABI_align8_needed:
10463
          if ((in_attr[i].int_value() > 0 || out_attr[i].int_value() > 0)
10464
              && (in_attr[elfcpp::Tag_ABI_align8_preserved].int_value() == 0
10465
                  || (out_attr[elfcpp::Tag_ABI_align8_preserved].int_value()
10466
                      == 0)))
10467
            {
10468
              // This error message should be enabled once all non-conforming
10469
              // binaries in the toolchain have had the attributes set
10470
              // properly.
10471
              // gold_error(_("output 8-byte data alignment conflicts with %s"),
10472
              //            name);
10473
            }
10474
          // Fall through.
10475
        case elfcpp::Tag_ABI_FP_denormal:
10476
        case elfcpp::Tag_ABI_PCS_GOT_use:
10477
          {
10478
            // These tags have 0 = don't care, 1 = strong requirement,
10479
            // 2 = weak requirement.
10480
            static const int order_021[3] = {0, 2, 1};
10481
 
10482
            // Use the "greatest" from the sequence 0, 2, 1, or the largest
10483
            // value if greater than 2 (for future-proofing).
10484
            if ((in_attr[i].int_value() > 2
10485
                 && in_attr[i].int_value() > out_attr[i].int_value())
10486
                || (in_attr[i].int_value() <= 2
10487
                    && out_attr[i].int_value() <= 2
10488
                    && (order_021[in_attr[i].int_value()]
10489
                        > order_021[out_attr[i].int_value()])))
10490
              out_attr[i].set_int_value(in_attr[i].int_value());
10491
          }
10492
          break;
10493
 
10494
        case elfcpp::Tag_CPU_arch_profile:
10495
          if (out_attr[i].int_value() != in_attr[i].int_value())
10496
            {
10497
              // 0 will merge with anything.
10498
              // 'A' and 'S' merge to 'A'.
10499
              // 'R' and 'S' merge to 'R'.
10500
              // 'M' and 'A|R|S' is an error.
10501
              if (out_attr[i].int_value() == 0
10502
                  || (out_attr[i].int_value() == 'S'
10503
                      && (in_attr[i].int_value() == 'A'
10504
                          || in_attr[i].int_value() == 'R')))
10505
                out_attr[i].set_int_value(in_attr[i].int_value());
10506
              else if (in_attr[i].int_value() == 0
10507
                       || (in_attr[i].int_value() == 'S'
10508
                           && (out_attr[i].int_value() == 'A'
10509
                               || out_attr[i].int_value() == 'R')))
10510
                ; // Do nothing.
10511
              else if (parameters->options().warn_mismatch())
10512
                {
10513
                  gold_error
10514
                    (_("conflicting architecture profiles %c/%c"),
10515
                     in_attr[i].int_value() ? in_attr[i].int_value() : '0',
10516
                     out_attr[i].int_value() ? out_attr[i].int_value() : '0');
10517
                }
10518
            }
10519
          break;
10520
        case elfcpp::Tag_VFP_arch:
10521
            {
10522
              static const struct
10523
              {
10524
                  int ver;
10525
                  int regs;
10526
              } vfp_versions[7] =
10527
                {
10528
                  {0, 0},
10529
                  {1, 16},
10530
                  {2, 16},
10531
                  {3, 32},
10532
                  {3, 16},
10533
                  {4, 32},
10534
                  {4, 16}
10535
                };
10536
 
10537
              // Values greater than 6 aren't defined, so just pick the
10538
              // biggest.
10539
              if (in_attr[i].int_value() > 6
10540
                  && in_attr[i].int_value() > out_attr[i].int_value())
10541
                {
10542
                  *out_attr = *in_attr;
10543
                  break;
10544
                }
10545
              // The output uses the superset of input features
10546
              // (ISA version) and registers.
10547
              int ver = std::max(vfp_versions[in_attr[i].int_value()].ver,
10548
                                 vfp_versions[out_attr[i].int_value()].ver);
10549
              int regs = std::max(vfp_versions[in_attr[i].int_value()].regs,
10550
                                  vfp_versions[out_attr[i].int_value()].regs);
10551
              // This assumes all possible supersets are also a valid
10552
              // options.
10553
              int newval;
10554
              for (newval = 6; newval > 0; newval--)
10555
                {
10556
                  if (regs == vfp_versions[newval].regs
10557
                      && ver == vfp_versions[newval].ver)
10558
                    break;
10559
                }
10560
              out_attr[i].set_int_value(newval);
10561
            }
10562
          break;
10563
        case elfcpp::Tag_PCS_config:
10564
          if (out_attr[i].int_value() == 0)
10565
            out_attr[i].set_int_value(in_attr[i].int_value());
10566
          else if (in_attr[i].int_value() != 0
10567
                   && out_attr[i].int_value() != 0
10568
                   && parameters->options().warn_mismatch())
10569
            {
10570
              // It's sometimes ok to mix different configs, so this is only
10571
              // a warning.
10572
              gold_warning(_("%s: conflicting platform configuration"), name);
10573
            }
10574
          break;
10575
        case elfcpp::Tag_ABI_PCS_R9_use:
10576
          if (in_attr[i].int_value() != out_attr[i].int_value()
10577
              && out_attr[i].int_value() != elfcpp::AEABI_R9_unused
10578
              && in_attr[i].int_value() != elfcpp::AEABI_R9_unused
10579
              && parameters->options().warn_mismatch())
10580
            {
10581
              gold_error(_("%s: conflicting use of R9"), name);
10582
            }
10583
          if (out_attr[i].int_value() == elfcpp::AEABI_R9_unused)
10584
            out_attr[i].set_int_value(in_attr[i].int_value());
10585
          break;
10586
        case elfcpp::Tag_ABI_PCS_RW_data:
10587
          if (in_attr[i].int_value() == elfcpp::AEABI_PCS_RW_data_SBrel
10588
              && (in_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
10589
                  != elfcpp::AEABI_R9_SB)
10590
              && (out_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
10591
                  != elfcpp::AEABI_R9_unused)
10592
              && parameters->options().warn_mismatch())
10593
            {
10594
              gold_error(_("%s: SB relative addressing conflicts with use "
10595
                           "of R9"),
10596
                           name);
10597
            }
10598
          // Use the smallest value specified.
10599
          if (in_attr[i].int_value() < out_attr[i].int_value())
10600
            out_attr[i].set_int_value(in_attr[i].int_value());
10601
          break;
10602
        case elfcpp::Tag_ABI_PCS_wchar_t:
10603
          if (out_attr[i].int_value()
10604
              && in_attr[i].int_value()
10605
              && out_attr[i].int_value() != in_attr[i].int_value()
10606
              && parameters->options().warn_mismatch()
10607
              && parameters->options().wchar_size_warning())
10608
            {
10609
              gold_warning(_("%s uses %u-byte wchar_t yet the output is to "
10610
                             "use %u-byte wchar_t; use of wchar_t values "
10611
                             "across objects may fail"),
10612
                           name, in_attr[i].int_value(),
10613
                           out_attr[i].int_value());
10614
            }
10615
          else if (in_attr[i].int_value() && !out_attr[i].int_value())
10616
            out_attr[i].set_int_value(in_attr[i].int_value());
10617
          break;
10618
        case elfcpp::Tag_ABI_enum_size:
10619
          if (in_attr[i].int_value() != elfcpp::AEABI_enum_unused)
10620
            {
10621
              if (out_attr[i].int_value() == elfcpp::AEABI_enum_unused
10622
                  || out_attr[i].int_value() == elfcpp::AEABI_enum_forced_wide)
10623
                {
10624
                  // The existing object is compatible with anything.
10625
                  // Use whatever requirements the new object has.
10626
                  out_attr[i].set_int_value(in_attr[i].int_value());
10627
                }
10628
              else if (in_attr[i].int_value() != elfcpp::AEABI_enum_forced_wide
10629
                       && out_attr[i].int_value() != in_attr[i].int_value()
10630
                       && parameters->options().warn_mismatch()
10631
                       && parameters->options().enum_size_warning())
10632
                {
10633
                  unsigned int in_value = in_attr[i].int_value();
10634
                  unsigned int out_value = out_attr[i].int_value();
10635
                  gold_warning(_("%s uses %s enums yet the output is to use "
10636
                                 "%s enums; use of enum values across objects "
10637
                                 "may fail"),
10638
                               name,
10639
                               this->aeabi_enum_name(in_value).c_str(),
10640
                               this->aeabi_enum_name(out_value).c_str());
10641
                }
10642
            }
10643
          break;
10644
        case elfcpp::Tag_ABI_VFP_args:
10645
          // Already done.
10646
          break;
10647
        case elfcpp::Tag_ABI_WMMX_args:
10648
          if (in_attr[i].int_value() != out_attr[i].int_value()
10649
              && parameters->options().warn_mismatch())
10650
            {
10651
              gold_error(_("%s uses iWMMXt register arguments, output does "
10652
                           "not"),
10653
                         name);
10654
            }
10655
          break;
10656
        case Object_attribute::Tag_compatibility:
10657
          // Merged in target-independent code.
10658
          break;
10659
        case elfcpp::Tag_ABI_HardFP_use:
10660
          // 1 (SP) and 2 (DP) conflict, so combine to 3 (SP & DP).
10661
          if ((in_attr[i].int_value() == 1 && out_attr[i].int_value() == 2)
10662
              || (in_attr[i].int_value() == 2 && out_attr[i].int_value() == 1))
10663
            out_attr[i].set_int_value(3);
10664
          else if (in_attr[i].int_value() > out_attr[i].int_value())
10665
            out_attr[i].set_int_value(in_attr[i].int_value());
10666
          break;
10667
        case elfcpp::Tag_ABI_FP_16bit_format:
10668
          if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
10669
            {
10670
              if (in_attr[i].int_value() != out_attr[i].int_value()
10671
                  && parameters->options().warn_mismatch())
10672
                gold_error(_("fp16 format mismatch between %s and output"),
10673
                           name);
10674
            }
10675
          if (in_attr[i].int_value() != 0)
10676
            out_attr[i].set_int_value(in_attr[i].int_value());
10677
          break;
10678
 
10679
        case elfcpp::Tag_DIV_use:
10680
          // This tag is set to zero if we can use UDIV and SDIV in Thumb
10681
          // mode on a v7-M or v7-R CPU; to one if we can not use UDIV or
10682
          // SDIV at all; and to two if we can use UDIV or SDIV on a v7-A
10683
          // CPU.  We will merge as follows: If the input attribute's value
10684
          // is one then the output attribute's value remains unchanged.  If
10685
          // the input attribute's value is zero or two then if the output
10686
          // attribute's value is one the output value is set to the input
10687
          // value, otherwise the output value must be the same as the
10688
          // inputs.  */ 
10689
          if (in_attr[i].int_value() != 1 && out_attr[i].int_value() != 1)
10690
            {
10691
              if (in_attr[i].int_value() != out_attr[i].int_value())
10692
                {
10693
                  gold_error(_("DIV usage mismatch between %s and output"),
10694
                             name);
10695
                }
10696
            }
10697
 
10698
          if (in_attr[i].int_value() != 1)
10699
            out_attr[i].set_int_value(in_attr[i].int_value());
10700
 
10701
          break;
10702
 
10703
        case elfcpp::Tag_MPextension_use_legacy:
10704
          // We don't output objects with Tag_MPextension_use_legacy - we
10705
          // move the value to Tag_MPextension_use.
10706
          if (in_attr[i].int_value() != 0
10707
              && in_attr[elfcpp::Tag_MPextension_use].int_value() != 0)
10708
            {
10709
              if (in_attr[elfcpp::Tag_MPextension_use].int_value()
10710
                  != in_attr[i].int_value())
10711
                {
10712
                  gold_error(_("%s has has both the current and legacy "
10713
                               "Tag_MPextension_use attributes"),
10714
                             name);
10715
                }
10716
            }
10717
 
10718
          if (in_attr[i].int_value()
10719
              > out_attr[elfcpp::Tag_MPextension_use].int_value())
10720
            out_attr[elfcpp::Tag_MPextension_use] = in_attr[i];
10721
 
10722
          break;
10723
 
10724
        case elfcpp::Tag_nodefaults:
10725
          // This tag is set if it exists, but the value is unused (and is
10726
          // typically zero).  We don't actually need to do anything here -
10727
          // the merge happens automatically when the type flags are merged
10728
          // below.
10729
          break;
10730
        case elfcpp::Tag_also_compatible_with:
10731
          // Already done in Tag_CPU_arch.
10732
          break;
10733
        case elfcpp::Tag_conformance:
10734
          // Keep the attribute if it matches.  Throw it away otherwise.
10735
          // No attribute means no claim to conform.
10736
          if (in_attr[i].string_value() != out_attr[i].string_value())
10737
            out_attr[i].set_string_value("");
10738
          break;
10739
 
10740
        default:
10741
          {
10742
            const char* err_object = NULL;
10743
 
10744
            // The "known_obj_attributes" table does contain some undefined
10745
            // attributes.  Ensure that there are unused.
10746
            if (out_attr[i].int_value() != 0
10747
                || out_attr[i].string_value() != "")
10748
              err_object = "output";
10749
            else if (in_attr[i].int_value() != 0
10750
                     || in_attr[i].string_value() != "")
10751
              err_object = name;
10752
 
10753
            if (err_object != NULL
10754
                && parameters->options().warn_mismatch())
10755
              {
10756
                // Attribute numbers >=64 (mod 128) can be safely ignored.
10757
                if ((i & 127) < 64)
10758
                  gold_error(_("%s: unknown mandatory EABI object attribute "
10759
                               "%d"),
10760
                             err_object, i);
10761
                else
10762
                  gold_warning(_("%s: unknown EABI object attribute %d"),
10763
                               err_object, i);
10764
              }
10765
 
10766
            // Only pass on attributes that match in both inputs.
10767
            if (!in_attr[i].matches(out_attr[i]))
10768
              {
10769
                out_attr[i].set_int_value(0);
10770
                out_attr[i].set_string_value("");
10771
              }
10772
          }
10773
        }
10774
 
10775
      // If out_attr was copied from in_attr then it won't have a type yet.
10776
      if (in_attr[i].type() && !out_attr[i].type())
10777
        out_attr[i].set_type(in_attr[i].type());
10778
    }
10779
 
10780
  // Merge Tag_compatibility attributes and any common GNU ones.
10781
  this->attributes_section_data_->merge(name, pasd);
10782
 
10783
  // Check for any attributes not known on ARM.
10784
  typedef Vendor_object_attributes::Other_attributes Other_attributes;
10785
  const Other_attributes* in_other_attributes = pasd->other_attributes(vendor);
10786
  Other_attributes::const_iterator in_iter = in_other_attributes->begin();
10787
  Other_attributes* out_other_attributes =
10788
    this->attributes_section_data_->other_attributes(vendor);
10789
  Other_attributes::iterator out_iter = out_other_attributes->begin();
10790
 
10791
  while (in_iter != in_other_attributes->end()
10792
         || out_iter != out_other_attributes->end())
10793
    {
10794
      const char* err_object = NULL;
10795
      int err_tag = 0;
10796
 
10797
      // The tags for each list are in numerical order.
10798
      // If the tags are equal, then merge.
10799
      if (out_iter != out_other_attributes->end()
10800
          && (in_iter == in_other_attributes->end()
10801
              || in_iter->first > out_iter->first))
10802
        {
10803
          // This attribute only exists in output.  We can't merge, and we
10804
          // don't know what the tag means, so delete it.
10805
          err_object = "output";
10806
          err_tag = out_iter->first;
10807
          int saved_tag = out_iter->first;
10808
          delete out_iter->second;
10809
          out_other_attributes->erase(out_iter);
10810
          out_iter = out_other_attributes->upper_bound(saved_tag);
10811
        }
10812
      else if (in_iter != in_other_attributes->end()
10813
               && (out_iter != out_other_attributes->end()
10814
                   || in_iter->first < out_iter->first))
10815
        {
10816
          // This attribute only exists in input. We can't merge, and we
10817
          // don't know what the tag means, so ignore it.
10818
          err_object = name;
10819
          err_tag = in_iter->first;
10820
          ++in_iter;
10821
        }
10822
      else // The tags are equal.
10823
        {
10824
          // As present, all attributes in the list are unknown, and
10825
          // therefore can't be merged meaningfully.
10826
          err_object = "output";
10827
          err_tag = out_iter->first;
10828
 
10829
          //  Only pass on attributes that match in both inputs.
10830
          if (!in_iter->second->matches(*(out_iter->second)))
10831
            {
10832
              // No match.  Delete the attribute.
10833
              int saved_tag = out_iter->first;
10834
              delete out_iter->second;
10835
              out_other_attributes->erase(out_iter);
10836
              out_iter = out_other_attributes->upper_bound(saved_tag);
10837
            }
10838
          else
10839
            {
10840
              // Matched.  Keep the attribute and move to the next.
10841
              ++out_iter;
10842
              ++in_iter;
10843
            }
10844
        }
10845
 
10846
      if (err_object && parameters->options().warn_mismatch())
10847
        {
10848
          // Attribute numbers >=64 (mod 128) can be safely ignored.  */
10849
          if ((err_tag & 127) < 64)
10850
            {
10851
              gold_error(_("%s: unknown mandatory EABI object attribute %d"),
10852
                         err_object, err_tag);
10853
            }
10854
          else
10855
            {
10856
              gold_warning(_("%s: unknown EABI object attribute %d"),
10857
                           err_object, err_tag);
10858
            }
10859
        }
10860
    }
10861
}
10862
 
10863
// Stub-generation methods for Target_arm.
10864
 
10865
// Make a new Arm_input_section object.
10866
 
10867
template<bool big_endian>
10868
Arm_input_section<big_endian>*
10869
Target_arm<big_endian>::new_arm_input_section(
10870
    Relobj* relobj,
10871
    unsigned int shndx)
10872
{
10873
  Section_id sid(relobj, shndx);
10874
 
10875
  Arm_input_section<big_endian>* arm_input_section =
10876
    new Arm_input_section<big_endian>(relobj, shndx);
10877
  arm_input_section->init();
10878
 
10879
  // Register new Arm_input_section in map for look-up.
10880
  std::pair<typename Arm_input_section_map::iterator, bool> ins =
10881
    this->arm_input_section_map_.insert(std::make_pair(sid, arm_input_section));
10882
 
10883
  // Make sure that it we have not created another Arm_input_section
10884
  // for this input section already.
10885
  gold_assert(ins.second);
10886
 
10887
  return arm_input_section;
10888
}
10889
 
10890
// Find the Arm_input_section object corresponding to the SHNDX-th input
10891
// section of RELOBJ.
10892
 
10893
template<bool big_endian>
10894
Arm_input_section<big_endian>*
10895
Target_arm<big_endian>::find_arm_input_section(
10896
    Relobj* relobj,
10897
    unsigned int shndx) const
10898
{
10899
  Section_id sid(relobj, shndx);
10900
  typename Arm_input_section_map::const_iterator p =
10901
    this->arm_input_section_map_.find(sid);
10902
  return (p != this->arm_input_section_map_.end()) ? p->second : NULL;
10903
}
10904
 
10905
// Make a new stub table.
10906
 
10907
template<bool big_endian>
10908
Stub_table<big_endian>*
10909
Target_arm<big_endian>::new_stub_table(Arm_input_section<big_endian>* owner)
10910
{
10911
  Stub_table<big_endian>* stub_table =
10912
    new Stub_table<big_endian>(owner);
10913
  this->stub_tables_.push_back(stub_table);
10914
 
10915
  stub_table->set_address(owner->address() + owner->data_size());
10916
  stub_table->set_file_offset(owner->offset() + owner->data_size());
10917
  stub_table->finalize_data_size();
10918
 
10919
  return stub_table;
10920
}
10921
 
10922
// Scan a relocation for stub generation.
10923
 
10924
template<bool big_endian>
10925
void
10926
Target_arm<big_endian>::scan_reloc_for_stub(
10927
    const Relocate_info<32, big_endian>* relinfo,
10928
    unsigned int r_type,
10929
    const Sized_symbol<32>* gsym,
10930
    unsigned int r_sym,
10931
    const Symbol_value<32>* psymval,
10932
    elfcpp::Elf_types<32>::Elf_Swxword addend,
10933
    Arm_address address)
10934
{
10935
  typedef typename Target_arm<big_endian>::Relocate Relocate;
10936
 
10937
  const Arm_relobj<big_endian>* arm_relobj =
10938
    Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
10939
 
10940
  bool target_is_thumb;
10941
  Symbol_value<32> symval;
10942
  if (gsym != NULL)
10943
    {
10944
      // This is a global symbol.  Determine if we use PLT and if the
10945
      // final target is THUMB.
10946
      if (gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
10947
        {
10948
          // This uses a PLT, change the symbol value.
10949
          symval.set_output_value(this->plt_section()->address()
10950
                                  + gsym->plt_offset());
10951
          psymval = &symval;
10952
          target_is_thumb = false;
10953
        }
10954
      else if (gsym->is_undefined())
10955
        // There is no need to generate a stub symbol is undefined.
10956
        return;
10957
      else
10958
        {
10959
          target_is_thumb =
10960
            ((gsym->type() == elfcpp::STT_ARM_TFUNC)
10961
             || (gsym->type() == elfcpp::STT_FUNC
10962
                 && !gsym->is_undefined()
10963
                 && ((psymval->value(arm_relobj, 0) & 1) != 0)));
10964
        }
10965
    }
10966
  else
10967
    {
10968
      // This is a local symbol.  Determine if the final target is THUMB.
10969
      target_is_thumb = arm_relobj->local_symbol_is_thumb_function(r_sym);
10970
    }
10971
 
10972
  // Strip LSB if this points to a THUMB target.
10973
  const Arm_reloc_property* reloc_property =
10974
    arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
10975
  gold_assert(reloc_property != NULL);
10976
  if (target_is_thumb
10977
      && reloc_property->uses_thumb_bit()
10978
      && ((psymval->value(arm_relobj, 0) & 1) != 0))
10979
    {
10980
      Arm_address stripped_value =
10981
        psymval->value(arm_relobj, 0) & ~static_cast<Arm_address>(1);
10982
      symval.set_output_value(stripped_value);
10983
      psymval = &symval;
10984
    }
10985
 
10986
  // Get the symbol value.
10987
  Symbol_value<32>::Value value = psymval->value(arm_relobj, 0);
10988
 
10989
  // Owing to pipelining, the PC relative branches below actually skip
10990
  // two instructions when the branch offset is 0.
10991
  Arm_address destination;
10992
  switch (r_type)
10993
    {
10994
    case elfcpp::R_ARM_CALL:
10995
    case elfcpp::R_ARM_JUMP24:
10996
    case elfcpp::R_ARM_PLT32:
10997
      // ARM branches.
10998
      destination = value + addend + 8;
10999
      break;
11000
    case elfcpp::R_ARM_THM_CALL:
11001
    case elfcpp::R_ARM_THM_XPC22:
11002
    case elfcpp::R_ARM_THM_JUMP24:
11003
    case elfcpp::R_ARM_THM_JUMP19:
11004
      // THUMB branches.
11005
      destination = value + addend + 4;
11006
      break;
11007
    default:
11008
      gold_unreachable();
11009
    }
11010
 
11011
  Reloc_stub* stub = NULL;
11012
  Stub_type stub_type =
11013
    Reloc_stub::stub_type_for_reloc(r_type, address, destination,
11014
                                    target_is_thumb);
11015
  if (stub_type != arm_stub_none)
11016
    {
11017
      // Try looking up an existing stub from a stub table.
11018
      Stub_table<big_endian>* stub_table =
11019
        arm_relobj->stub_table(relinfo->data_shndx);
11020
      gold_assert(stub_table != NULL);
11021
 
11022
      // Locate stub by destination.
11023
      Reloc_stub::Key stub_key(stub_type, gsym, arm_relobj, r_sym, addend);
11024
 
11025
      // Create a stub if there is not one already
11026
      stub = stub_table->find_reloc_stub(stub_key);
11027
      if (stub == NULL)
11028
        {
11029
          // create a new stub and add it to stub table.
11030
          stub = this->stub_factory().make_reloc_stub(stub_type);
11031
          stub_table->add_reloc_stub(stub, stub_key);
11032
        }
11033
 
11034
      // Record the destination address.
11035
      stub->set_destination_address(destination
11036
                                    | (target_is_thumb ? 1 : 0));
11037
    }
11038
 
11039
  // For Cortex-A8, we need to record a relocation at 4K page boundary.
11040
  if (this->fix_cortex_a8_
11041
      && (r_type == elfcpp::R_ARM_THM_JUMP24
11042
          || r_type == elfcpp::R_ARM_THM_JUMP19
11043
          || r_type == elfcpp::R_ARM_THM_CALL
11044
          || r_type == elfcpp::R_ARM_THM_XPC22)
11045
      && (address & 0xfffU) == 0xffeU)
11046
    {
11047
      // Found a candidate.  Note we haven't checked the destination is
11048
      // within 4K here: if we do so (and don't create a record) we can't
11049
      // tell that a branch should have been relocated when scanning later.
11050
      this->cortex_a8_relocs_info_[address] =
11051
        new Cortex_a8_reloc(stub, r_type,
11052
                            destination | (target_is_thumb ? 1 : 0));
11053
    }
11054
}
11055
 
11056
// This function scans a relocation sections for stub generation.
11057
// The template parameter Relocate must be a class type which provides
11058
// a single function, relocate(), which implements the machine
11059
// specific part of a relocation.
11060
 
11061
// BIG_ENDIAN is the endianness of the data.  SH_TYPE is the section type:
11062
// SHT_REL or SHT_RELA.
11063
 
11064
// PRELOCS points to the relocation data.  RELOC_COUNT is the number
11065
// of relocs.  OUTPUT_SECTION is the output section.
11066
// NEEDS_SPECIAL_OFFSET_HANDLING is true if input offsets need to be
11067
// mapped to output offsets.
11068
 
11069
// VIEW is the section data, VIEW_ADDRESS is its memory address, and
11070
// VIEW_SIZE is the size.  These refer to the input section, unless
11071
// NEEDS_SPECIAL_OFFSET_HANDLING is true, in which case they refer to
11072
// the output section.
11073
 
11074
template<bool big_endian>
11075
template<int sh_type>
11076
void inline
11077
Target_arm<big_endian>::scan_reloc_section_for_stubs(
11078
    const Relocate_info<32, big_endian>* relinfo,
11079
    const unsigned char* prelocs,
11080
    size_t reloc_count,
11081
    Output_section* output_section,
11082
    bool needs_special_offset_handling,
11083
    const unsigned char* view,
11084
    elfcpp::Elf_types<32>::Elf_Addr view_address,
11085
    section_size_type)
11086
{
11087
  typedef typename Reloc_types<sh_type, 32, big_endian>::Reloc Reltype;
11088
  const int reloc_size =
11089
    Reloc_types<sh_type, 32, big_endian>::reloc_size;
11090
 
11091
  Arm_relobj<big_endian>* arm_object =
11092
    Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
11093
  unsigned int local_count = arm_object->local_symbol_count();
11094
 
11095
  Comdat_behavior comdat_behavior = CB_UNDETERMINED;
11096
 
11097
  for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
11098
    {
11099
      Reltype reloc(prelocs);
11100
 
11101
      typename elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
11102
      unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
11103
      unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
11104
 
11105
      r_type = this->get_real_reloc_type(r_type);
11106
 
11107
      // Only a few relocation types need stubs.
11108
      if ((r_type != elfcpp::R_ARM_CALL)
11109
         && (r_type != elfcpp::R_ARM_JUMP24)
11110
         && (r_type != elfcpp::R_ARM_PLT32)
11111
         && (r_type != elfcpp::R_ARM_THM_CALL)
11112
         && (r_type != elfcpp::R_ARM_THM_XPC22)
11113
         && (r_type != elfcpp::R_ARM_THM_JUMP24)
11114
         && (r_type != elfcpp::R_ARM_THM_JUMP19)
11115
         && (r_type != elfcpp::R_ARM_V4BX))
11116
        continue;
11117
 
11118
      section_offset_type offset =
11119
        convert_to_section_size_type(reloc.get_r_offset());
11120
 
11121
      if (needs_special_offset_handling)
11122
        {
11123
          offset = output_section->output_offset(relinfo->object,
11124
                                                 relinfo->data_shndx,
11125
                                                 offset);
11126
          if (offset == -1)
11127
            continue;
11128
        }
11129
 
11130
      // Create a v4bx stub if --fix-v4bx-interworking is used.
11131
      if (r_type == elfcpp::R_ARM_V4BX)
11132
        {
11133
          if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING)
11134
            {
11135
              // Get the BX instruction.
11136
              typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
11137
              const Valtype* wv =
11138
                reinterpret_cast<const Valtype*>(view + offset);
11139
              elfcpp::Elf_types<32>::Elf_Swxword insn =
11140
                elfcpp::Swap<32, big_endian>::readval(wv);
11141
              const uint32_t reg = (insn & 0xf);
11142
 
11143
              if (reg < 0xf)
11144
                {
11145
                  // Try looking up an existing stub from a stub table.
11146
                  Stub_table<big_endian>* stub_table =
11147
                    arm_object->stub_table(relinfo->data_shndx);
11148
                  gold_assert(stub_table != NULL);
11149
 
11150
                  if (stub_table->find_arm_v4bx_stub(reg) == NULL)
11151
                    {
11152
                      // create a new stub and add it to stub table.
11153
                      Arm_v4bx_stub* stub =
11154
                        this->stub_factory().make_arm_v4bx_stub(reg);
11155
                      gold_assert(stub != NULL);
11156
                      stub_table->add_arm_v4bx_stub(stub);
11157
                    }
11158
                }
11159
            }
11160
          continue;
11161
        }
11162
 
11163
      // Get the addend.
11164
      Stub_addend_reader<sh_type, big_endian> stub_addend_reader;
11165
      elfcpp::Elf_types<32>::Elf_Swxword addend =
11166
        stub_addend_reader(r_type, view + offset, reloc);
11167
 
11168
      const Sized_symbol<32>* sym;
11169
 
11170
      Symbol_value<32> symval;
11171
      const Symbol_value<32> *psymval;
11172
      bool is_defined_in_discarded_section;
11173
      unsigned int shndx;
11174
      if (r_sym < local_count)
11175
        {
11176
          sym = NULL;
11177
          psymval = arm_object->local_symbol(r_sym);
11178
 
11179
          // If the local symbol belongs to a section we are discarding,
11180
          // and that section is a debug section, try to find the
11181
          // corresponding kept section and map this symbol to its
11182
          // counterpart in the kept section.  The symbol must not 
11183
          // correspond to a section we are folding.
11184
          bool is_ordinary;
11185
          shndx = psymval->input_shndx(&is_ordinary);
11186
          is_defined_in_discarded_section =
11187
            (is_ordinary
11188
             && shndx != elfcpp::SHN_UNDEF
11189
             && !arm_object->is_section_included(shndx)
11190
             && !relinfo->symtab->is_section_folded(arm_object, shndx));
11191
 
11192
          // We need to compute the would-be final value of this local
11193
          // symbol.
11194
          if (!is_defined_in_discarded_section)
11195
            {
11196
              typedef Sized_relobj_file<32, big_endian> ObjType;
11197
              typename ObjType::Compute_final_local_value_status status =
11198
                arm_object->compute_final_local_value(r_sym, psymval, &symval,
11199
                                                      relinfo->symtab);
11200
              if (status == ObjType::CFLV_OK)
11201
                {
11202
                  // Currently we cannot handle a branch to a target in
11203
                  // a merged section.  If this is the case, issue an error
11204
                  // and also free the merge symbol value.
11205
                  if (!symval.has_output_value())
11206
                    {
11207
                      const std::string& section_name =
11208
                        arm_object->section_name(shndx);
11209
                      arm_object->error(_("cannot handle branch to local %u "
11210
                                          "in a merged section %s"),
11211
                                        r_sym, section_name.c_str());
11212
                    }
11213
                  psymval = &symval;
11214
                }
11215
              else
11216
                {
11217
                  // We cannot determine the final value.
11218
                  continue;
11219
                }
11220
            }
11221
        }
11222
      else
11223
        {
11224
          const Symbol* gsym;
11225
          gsym = arm_object->global_symbol(r_sym);
11226
          gold_assert(gsym != NULL);
11227
          if (gsym->is_forwarder())
11228
            gsym = relinfo->symtab->resolve_forwards(gsym);
11229
 
11230
          sym = static_cast<const Sized_symbol<32>*>(gsym);
11231
          if (sym->has_symtab_index() && sym->symtab_index() != -1U)
11232
            symval.set_output_symtab_index(sym->symtab_index());
11233
          else
11234
            symval.set_no_output_symtab_entry();
11235
 
11236
          // We need to compute the would-be final value of this global
11237
          // symbol.
11238
          const Symbol_table* symtab = relinfo->symtab;
11239
          const Sized_symbol<32>* sized_symbol =
11240
            symtab->get_sized_symbol<32>(gsym);
11241
          Symbol_table::Compute_final_value_status status;
11242
          Arm_address value =
11243
            symtab->compute_final_value<32>(sized_symbol, &status);
11244
 
11245
          // Skip this if the symbol has not output section.
11246
          if (status == Symbol_table::CFVS_NO_OUTPUT_SECTION)
11247
            continue;
11248
          symval.set_output_value(value);
11249
 
11250
          if (gsym->type() == elfcpp::STT_TLS)
11251
            symval.set_is_tls_symbol();
11252
          else if (gsym->type() == elfcpp::STT_GNU_IFUNC)
11253
            symval.set_is_ifunc_symbol();
11254
          psymval = &symval;
11255
 
11256
          is_defined_in_discarded_section =
11257
            (gsym->is_defined_in_discarded_section()
11258
             && gsym->is_undefined());
11259
          shndx = 0;
11260
        }
11261
 
11262
      Symbol_value<32> symval2;
11263
      if (is_defined_in_discarded_section)
11264
        {
11265
          if (comdat_behavior == CB_UNDETERMINED)
11266
            {
11267
              std::string name = arm_object->section_name(relinfo->data_shndx);
11268
              comdat_behavior = get_comdat_behavior(name.c_str());
11269
            }
11270
          if (comdat_behavior == CB_PRETEND)
11271
            {
11272
              // FIXME: This case does not work for global symbols.
11273
              // We have no place to store the original section index.
11274
              // Fortunately this does not matter for comdat sections,
11275
              // only for sections explicitly discarded by a linker
11276
              // script.
11277
              bool found;
11278
              typename elfcpp::Elf_types<32>::Elf_Addr value =
11279
                arm_object->map_to_kept_section(shndx, &found);
11280
              if (found)
11281
                symval2.set_output_value(value + psymval->input_value());
11282
              else
11283
                symval2.set_output_value(0);
11284
            }
11285
          else
11286
            {
11287
              if (comdat_behavior == CB_WARNING)
11288
                gold_warning_at_location(relinfo, i, offset,
11289
                                         _("relocation refers to discarded "
11290
                                           "section"));
11291
              symval2.set_output_value(0);
11292
            }
11293
          symval2.set_no_output_symtab_entry();
11294
          psymval = &symval2;
11295
        }
11296
 
11297
      // If symbol is a section symbol, we don't know the actual type of
11298
      // destination.  Give up.
11299
      if (psymval->is_section_symbol())
11300
        continue;
11301
 
11302
      this->scan_reloc_for_stub(relinfo, r_type, sym, r_sym, psymval,
11303
                                addend, view_address + offset);
11304
    }
11305
}
11306
 
11307
// Scan an input section for stub generation.
11308
 
11309
template<bool big_endian>
11310
void
11311
Target_arm<big_endian>::scan_section_for_stubs(
11312
    const Relocate_info<32, big_endian>* relinfo,
11313
    unsigned int sh_type,
11314
    const unsigned char* prelocs,
11315
    size_t reloc_count,
11316
    Output_section* output_section,
11317
    bool needs_special_offset_handling,
11318
    const unsigned char* view,
11319
    Arm_address view_address,
11320
    section_size_type view_size)
11321
{
11322
  if (sh_type == elfcpp::SHT_REL)
11323
    this->scan_reloc_section_for_stubs<elfcpp::SHT_REL>(
11324
        relinfo,
11325
        prelocs,
11326
        reloc_count,
11327
        output_section,
11328
        needs_special_offset_handling,
11329
        view,
11330
        view_address,
11331
        view_size);
11332
  else if (sh_type == elfcpp::SHT_RELA)
11333
    // We do not support RELA type relocations yet.  This is provided for
11334
    // completeness.
11335
    this->scan_reloc_section_for_stubs<elfcpp::SHT_RELA>(
11336
        relinfo,
11337
        prelocs,
11338
        reloc_count,
11339
        output_section,
11340
        needs_special_offset_handling,
11341
        view,
11342
        view_address,
11343
        view_size);
11344
  else
11345
    gold_unreachable();
11346
}
11347
 
11348
// Group input sections for stub generation.
11349
//
11350
// We group input sections in an output section so that the total size,
11351
// including any padding space due to alignment is smaller than GROUP_SIZE
11352
// unless the only input section in group is bigger than GROUP_SIZE already.
11353
// Then an ARM stub table is created to follow the last input section
11354
// in group.  For each group an ARM stub table is created an is placed
11355
// after the last group.  If STUB_ALWAYS_AFTER_BRANCH is false, we further
11356
// extend the group after the stub table.
11357
 
11358
template<bool big_endian>
11359
void
11360
Target_arm<big_endian>::group_sections(
11361
    Layout* layout,
11362
    section_size_type group_size,
11363
    bool stubs_always_after_branch,
11364
    const Task* task)
11365
{
11366
  // Group input sections and insert stub table
11367
  Layout::Section_list section_list;
11368
  layout->get_allocated_sections(&section_list);
11369
  for (Layout::Section_list::const_iterator p = section_list.begin();
11370
       p != section_list.end();
11371
       ++p)
11372
    {
11373
      Arm_output_section<big_endian>* output_section =
11374
        Arm_output_section<big_endian>::as_arm_output_section(*p);
11375
      output_section->group_sections(group_size, stubs_always_after_branch,
11376
                                     this, task);
11377
    }
11378
}
11379
 
11380
// Relaxation hook.  This is where we do stub generation.
11381
 
11382
template<bool big_endian>
11383
bool
11384
Target_arm<big_endian>::do_relax(
11385
    int pass,
11386
    const Input_objects* input_objects,
11387
    Symbol_table* symtab,
11388
    Layout* layout,
11389
    const Task* task)
11390
{
11391
  // No need to generate stubs if this is a relocatable link.
11392
  gold_assert(!parameters->options().relocatable());
11393
 
11394
  // If this is the first pass, we need to group input sections into
11395
  // stub groups.
11396
  bool done_exidx_fixup = false;
11397
  typedef typename Stub_table_list::iterator Stub_table_iterator;
11398
  if (pass == 1)
11399
    {
11400
      // Determine the stub group size.  The group size is the absolute
11401
      // value of the parameter --stub-group-size.  If --stub-group-size
11402
      // is passed a negative value, we restrict stubs to be always after
11403
      // the stubbed branches.
11404
      int32_t stub_group_size_param =
11405
        parameters->options().stub_group_size();
11406
      bool stubs_always_after_branch = stub_group_size_param < 0;
11407
      section_size_type stub_group_size = abs(stub_group_size_param);
11408
 
11409
      if (stub_group_size == 1)
11410
        {
11411
          // Default value.
11412
          // Thumb branch range is +-4MB has to be used as the default
11413
          // maximum size (a given section can contain both ARM and Thumb
11414
          // code, so the worst case has to be taken into account).  If we are
11415
          // fixing cortex-a8 errata, the branch range has to be even smaller,
11416
          // since wide conditional branch has a range of +-1MB only.
11417
          //
11418
          // This value is 48K less than that, which allows for 4096
11419
          // 12-byte stubs.  If we exceed that, then we will fail to link.
11420
          // The user will have to relink with an explicit group size
11421
          // option.
11422
            stub_group_size = 4145152;
11423
        }
11424
 
11425
      // The Cortex-A8 erratum fix depends on stubs not being in the same 4K
11426
      // page as the first half of a 32-bit branch straddling two 4K pages.
11427
      // This is a crude way of enforcing that.  In addition, long conditional
11428
      // branches of THUMB-2 have a range of +-1M.  If we are fixing cortex-A8
11429
      // erratum, limit the group size to  (1M - 12k) to avoid unreachable
11430
      // cortex-A8 stubs from long conditional branches.
11431
      if (this->fix_cortex_a8_)
11432
        {
11433
          stubs_always_after_branch = true;
11434
          const section_size_type cortex_a8_group_size = 1024 * (1024 - 12);
11435
          stub_group_size = std::max(stub_group_size, cortex_a8_group_size);
11436
        }
11437
 
11438
      group_sections(layout, stub_group_size, stubs_always_after_branch, task);
11439
 
11440
      // Also fix .ARM.exidx section coverage.
11441
      Arm_output_section<big_endian>* exidx_output_section = NULL;
11442
      for (Layout::Section_list::const_iterator p =
11443
             layout->section_list().begin();
11444
           p != layout->section_list().end();
11445
           ++p)
11446
        if ((*p)->type() == elfcpp::SHT_ARM_EXIDX)
11447
          {
11448
            if (exidx_output_section == NULL)
11449
              exidx_output_section =
11450
                Arm_output_section<big_endian>::as_arm_output_section(*p);
11451
            else
11452
              // We cannot handle this now.
11453
              gold_error(_("multiple SHT_ARM_EXIDX sections %s and %s in a "
11454
                           "non-relocatable link"),
11455
                          exidx_output_section->name(),
11456
                          (*p)->name());
11457
          }
11458
 
11459
      if (exidx_output_section != NULL)
11460
        {
11461
          this->fix_exidx_coverage(layout, input_objects, exidx_output_section,
11462
                                   symtab, task);
11463
          done_exidx_fixup = true;
11464
        }
11465
    }
11466
  else
11467
    {
11468
      // If this is not the first pass, addresses and file offsets have
11469
      // been reset at this point, set them here.
11470
      for (Stub_table_iterator sp = this->stub_tables_.begin();
11471
           sp != this->stub_tables_.end();
11472
           ++sp)
11473
        {
11474
          Arm_input_section<big_endian>* owner = (*sp)->owner();
11475
          off_t off = align_address(owner->original_size(),
11476
                                    (*sp)->addralign());
11477
          (*sp)->set_address_and_file_offset(owner->address() + off,
11478
                                             owner->offset() + off);
11479
        }
11480
    }
11481
 
11482
  // The Cortex-A8 stubs are sensitive to layout of code sections.  At the
11483
  // beginning of each relaxation pass, just blow away all the stubs.
11484
  // Alternatively, we could selectively remove only the stubs and reloc
11485
  // information for code sections that have moved since the last pass.
11486
  // That would require more book-keeping.
11487
  if (this->fix_cortex_a8_)
11488
    {
11489
      // Clear all Cortex-A8 reloc information.
11490
      for (typename Cortex_a8_relocs_info::const_iterator p =
11491
             this->cortex_a8_relocs_info_.begin();
11492
           p != this->cortex_a8_relocs_info_.end();
11493
           ++p)
11494
        delete p->second;
11495
      this->cortex_a8_relocs_info_.clear();
11496
 
11497
      // Remove all Cortex-A8 stubs.
11498
      for (Stub_table_iterator sp = this->stub_tables_.begin();
11499
           sp != this->stub_tables_.end();
11500
           ++sp)
11501
        (*sp)->remove_all_cortex_a8_stubs();
11502
    }
11503
 
11504
  // Scan relocs for relocation stubs
11505
  for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
11506
       op != input_objects->relobj_end();
11507
       ++op)
11508
    {
11509
      Arm_relobj<big_endian>* arm_relobj =
11510
        Arm_relobj<big_endian>::as_arm_relobj(*op);
11511
      // Lock the object so we can read from it.  This is only called
11512
      // single-threaded from Layout::finalize, so it is OK to lock.
11513
      Task_lock_obj<Object> tl(task, arm_relobj);
11514
      arm_relobj->scan_sections_for_stubs(this, symtab, layout);
11515
    }
11516
 
11517
  // Check all stub tables to see if any of them have their data sizes
11518
  // or addresses alignments changed.  These are the only things that
11519
  // matter.
11520
  bool any_stub_table_changed = false;
11521
  Unordered_set<const Output_section*> sections_needing_adjustment;
11522
  for (Stub_table_iterator sp = this->stub_tables_.begin();
11523
       (sp != this->stub_tables_.end()) && !any_stub_table_changed;
11524
       ++sp)
11525
    {
11526
      if ((*sp)->update_data_size_and_addralign())
11527
        {
11528
          // Update data size of stub table owner.
11529
          Arm_input_section<big_endian>* owner = (*sp)->owner();
11530
          uint64_t address = owner->address();
11531
          off_t offset = owner->offset();
11532
          owner->reset_address_and_file_offset();
11533
          owner->set_address_and_file_offset(address, offset);
11534
 
11535
          sections_needing_adjustment.insert(owner->output_section());
11536
          any_stub_table_changed = true;
11537
        }
11538
    }
11539
 
11540
  // Output_section_data::output_section() returns a const pointer but we
11541
  // need to update output sections, so we record all output sections needing
11542
  // update above and scan the sections here to find out what sections need
11543
  // to be updated.
11544
  for (Layout::Section_list::const_iterator p = layout->section_list().begin();
11545
      p != layout->section_list().end();
11546
      ++p)
11547
    {
11548
      if (sections_needing_adjustment.find(*p)
11549
          != sections_needing_adjustment.end())
11550
        (*p)->set_section_offsets_need_adjustment();
11551
    }
11552
 
11553
  // Stop relaxation if no EXIDX fix-up and no stub table change.
11554
  bool continue_relaxation = done_exidx_fixup || any_stub_table_changed;
11555
 
11556
  // Finalize the stubs in the last relaxation pass.
11557
  if (!continue_relaxation)
11558
    {
11559
      for (Stub_table_iterator sp = this->stub_tables_.begin();
11560
           (sp != this->stub_tables_.end()) && !any_stub_table_changed;
11561
            ++sp)
11562
        (*sp)->finalize_stubs();
11563
 
11564
      // Update output local symbol counts of objects if necessary.
11565
      for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
11566
           op != input_objects->relobj_end();
11567
           ++op)
11568
        {
11569
          Arm_relobj<big_endian>* arm_relobj =
11570
            Arm_relobj<big_endian>::as_arm_relobj(*op);
11571
 
11572
          // Update output local symbol counts.  We need to discard local
11573
          // symbols defined in parts of input sections that are discarded by
11574
          // relaxation.
11575
          if (arm_relobj->output_local_symbol_count_needs_update())
11576
            {
11577
              // We need to lock the object's file to update it.
11578
              Task_lock_obj<Object> tl(task, arm_relobj);
11579
              arm_relobj->update_output_local_symbol_count();
11580
            }
11581
        }
11582
    }
11583
 
11584
  return continue_relaxation;
11585
}
11586
 
11587
// Relocate a stub.
11588
 
11589
template<bool big_endian>
11590
void
11591
Target_arm<big_endian>::relocate_stub(
11592
    Stub* stub,
11593
    const Relocate_info<32, big_endian>* relinfo,
11594
    Output_section* output_section,
11595
    unsigned char* view,
11596
    Arm_address address,
11597
    section_size_type view_size)
11598
{
11599
  Relocate relocate;
11600
  const Stub_template* stub_template = stub->stub_template();
11601
  for (size_t i = 0; i < stub_template->reloc_count(); i++)
11602
    {
11603
      size_t reloc_insn_index = stub_template->reloc_insn_index(i);
11604
      const Insn_template* insn = &stub_template->insns()[reloc_insn_index];
11605
 
11606
      unsigned int r_type = insn->r_type();
11607
      section_size_type reloc_offset = stub_template->reloc_offset(i);
11608
      section_size_type reloc_size = insn->size();
11609
      gold_assert(reloc_offset + reloc_size <= view_size);
11610
 
11611
      // This is the address of the stub destination.
11612
      Arm_address target = stub->reloc_target(i) + insn->reloc_addend();
11613
      Symbol_value<32> symval;
11614
      symval.set_output_value(target);
11615
 
11616
      // Synthesize a fake reloc just in case.  We don't have a symbol so
11617
      // we use 0.
11618
      unsigned char reloc_buffer[elfcpp::Elf_sizes<32>::rel_size];
11619
      memset(reloc_buffer, 0, sizeof(reloc_buffer));
11620
      elfcpp::Rel_write<32, big_endian> reloc_write(reloc_buffer);
11621
      reloc_write.put_r_offset(reloc_offset);
11622
      reloc_write.put_r_info(elfcpp::elf_r_info<32>(0, r_type));
11623
      elfcpp::Rel<32, big_endian> rel(reloc_buffer);
11624
 
11625
      relocate.relocate(relinfo, this, output_section,
11626
                        this->fake_relnum_for_stubs, rel, r_type,
11627
                        NULL, &symval, view + reloc_offset,
11628
                        address + reloc_offset, reloc_size);
11629
    }
11630
}
11631
 
11632
// Determine whether an object attribute tag takes an integer, a
11633
// string or both.
11634
 
11635
template<bool big_endian>
11636
int
11637
Target_arm<big_endian>::do_attribute_arg_type(int tag) const
11638
{
11639
  if (tag == Object_attribute::Tag_compatibility)
11640
    return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
11641
            | Object_attribute::ATTR_TYPE_FLAG_STR_VAL);
11642
  else if (tag == elfcpp::Tag_nodefaults)
11643
    return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
11644
            | Object_attribute::ATTR_TYPE_FLAG_NO_DEFAULT);
11645
  else if (tag == elfcpp::Tag_CPU_raw_name || tag == elfcpp::Tag_CPU_name)
11646
    return Object_attribute::ATTR_TYPE_FLAG_STR_VAL;
11647
  else if (tag < 32)
11648
    return Object_attribute::ATTR_TYPE_FLAG_INT_VAL;
11649
  else
11650
    return ((tag & 1) != 0
11651
            ? Object_attribute::ATTR_TYPE_FLAG_STR_VAL
11652
            : Object_attribute::ATTR_TYPE_FLAG_INT_VAL);
11653
}
11654
 
11655
// Reorder attributes.
11656
//
11657
// The ABI defines that Tag_conformance should be emitted first, and that
11658
// Tag_nodefaults should be second (if either is defined).  This sets those
11659
// two positions, and bumps up the position of all the remaining tags to
11660
// compensate.
11661
 
11662
template<bool big_endian>
11663
int
11664
Target_arm<big_endian>::do_attributes_order(int num) const
11665
{
11666
  // Reorder the known object attributes in output.  We want to move
11667
  // Tag_conformance to position 4 and Tag_conformance to position 5
11668
  // and shift everything between 4 .. Tag_conformance - 1 to make room.
11669
  if (num == 4)
11670
    return elfcpp::Tag_conformance;
11671
  if (num == 5)
11672
    return elfcpp::Tag_nodefaults;
11673
  if ((num - 2) < elfcpp::Tag_nodefaults)
11674
    return num - 2;
11675
  if ((num - 1) < elfcpp::Tag_conformance)
11676
    return num - 1;
11677
  return num;
11678
}
11679
 
11680
// Scan a span of THUMB code for Cortex-A8 erratum.
11681
 
11682
template<bool big_endian>
11683
void
11684
Target_arm<big_endian>::scan_span_for_cortex_a8_erratum(
11685
    Arm_relobj<big_endian>* arm_relobj,
11686
    unsigned int shndx,
11687
    section_size_type span_start,
11688
    section_size_type span_end,
11689
    const unsigned char* view,
11690
    Arm_address address)
11691
{
11692
  // Scan for 32-bit Thumb-2 branches which span two 4K regions, where:
11693
  //
11694
  // The opcode is BLX.W, BL.W, B.W, Bcc.W
11695
  // The branch target is in the same 4KB region as the
11696
  // first half of the branch.
11697
  // The instruction before the branch is a 32-bit
11698
  // length non-branch instruction.
11699
  section_size_type i = span_start;
11700
  bool last_was_32bit = false;
11701
  bool last_was_branch = false;
11702
  while (i < span_end)
11703
    {
11704
      typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
11705
      const Valtype* wv = reinterpret_cast<const Valtype*>(view + i);
11706
      uint32_t insn = elfcpp::Swap<16, big_endian>::readval(wv);
11707
      bool is_blx = false, is_b = false;
11708
      bool is_bl = false, is_bcc = false;
11709
 
11710
      bool insn_32bit = (insn & 0xe000) == 0xe000 && (insn & 0x1800) != 0x0000;
11711
      if (insn_32bit)
11712
        {
11713
          // Load the rest of the insn (in manual-friendly order).
11714
          insn = (insn << 16) | elfcpp::Swap<16, big_endian>::readval(wv + 1);
11715
 
11716
          // Encoding T4: B<c>.W.
11717
          is_b = (insn & 0xf800d000U) == 0xf0009000U;
11718
          // Encoding T1: BL<c>.W.
11719
          is_bl = (insn & 0xf800d000U) == 0xf000d000U;
11720
          // Encoding T2: BLX<c>.W.
11721
          is_blx = (insn & 0xf800d000U) == 0xf000c000U;
11722
          // Encoding T3: B<c>.W (not permitted in IT block).
11723
          is_bcc = ((insn & 0xf800d000U) == 0xf0008000U
11724
                    && (insn & 0x07f00000U) != 0x03800000U);
11725
        }
11726
 
11727
      bool is_32bit_branch = is_b || is_bl || is_blx || is_bcc;
11728
 
11729
      // If this instruction is a 32-bit THUMB branch that crosses a 4K
11730
      // page boundary and it follows 32-bit non-branch instruction,
11731
      // we need to work around.
11732
      if (is_32bit_branch
11733
          && ((address + i) & 0xfffU) == 0xffeU
11734
          && last_was_32bit
11735
          && !last_was_branch)
11736
        {
11737
          // Check to see if there is a relocation stub for this branch.
11738
          bool force_target_arm = false;
11739
          bool force_target_thumb = false;
11740
          const Cortex_a8_reloc* cortex_a8_reloc = NULL;
11741
          Cortex_a8_relocs_info::const_iterator p =
11742
            this->cortex_a8_relocs_info_.find(address + i);
11743
 
11744
          if (p != this->cortex_a8_relocs_info_.end())
11745
            {
11746
              cortex_a8_reloc = p->second;
11747
              bool target_is_thumb = (cortex_a8_reloc->destination() & 1) != 0;
11748
 
11749
              if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
11750
                  && !target_is_thumb)
11751
                force_target_arm = true;
11752
              else if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
11753
                       && target_is_thumb)
11754
                force_target_thumb = true;
11755
            }
11756
 
11757
          off_t offset;
11758
          Stub_type stub_type = arm_stub_none;
11759
 
11760
          // Check if we have an offending branch instruction.
11761
          uint16_t upper_insn = (insn >> 16) & 0xffffU;
11762
          uint16_t lower_insn = insn & 0xffffU;
11763
          typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
11764
 
11765
          if (cortex_a8_reloc != NULL
11766
              && cortex_a8_reloc->reloc_stub() != NULL)
11767
            // We've already made a stub for this instruction, e.g.
11768
            // it's a long branch or a Thumb->ARM stub.  Assume that
11769
            // stub will suffice to work around the A8 erratum (see
11770
            // setting of always_after_branch above).
11771
            ;
11772
          else if (is_bcc)
11773
            {
11774
              offset = RelocFuncs::thumb32_cond_branch_offset(upper_insn,
11775
                                                              lower_insn);
11776
              stub_type = arm_stub_a8_veneer_b_cond;
11777
            }
11778
          else if (is_b || is_bl || is_blx)
11779
            {
11780
              offset = RelocFuncs::thumb32_branch_offset(upper_insn,
11781
                                                         lower_insn);
11782
              if (is_blx)
11783
                offset &= ~3;
11784
 
11785
              stub_type = (is_blx
11786
                           ? arm_stub_a8_veneer_blx
11787
                           : (is_bl
11788
                              ? arm_stub_a8_veneer_bl
11789
                              : arm_stub_a8_veneer_b));
11790
            }
11791
 
11792
          if (stub_type != arm_stub_none)
11793
            {
11794
              Arm_address pc_for_insn = address + i + 4;
11795
 
11796
              // The original instruction is a BL, but the target is
11797
              // an ARM instruction.  If we were not making a stub,
11798
              // the BL would have been converted to a BLX.  Use the
11799
              // BLX stub instead in that case.
11800
              if (this->may_use_blx() && force_target_arm
11801
                  && stub_type == arm_stub_a8_veneer_bl)
11802
                {
11803
                  stub_type = arm_stub_a8_veneer_blx;
11804
                  is_blx = true;
11805
                  is_bl = false;
11806
                }
11807
              // Conversely, if the original instruction was
11808
              // BLX but the target is Thumb mode, use the BL stub.
11809
              else if (force_target_thumb
11810
                       && stub_type == arm_stub_a8_veneer_blx)
11811
                {
11812
                  stub_type = arm_stub_a8_veneer_bl;
11813
                  is_blx = false;
11814
                  is_bl = true;
11815
                }
11816
 
11817
              if (is_blx)
11818
                pc_for_insn &= ~3;
11819
 
11820
              // If we found a relocation, use the proper destination,
11821
              // not the offset in the (unrelocated) instruction.
11822
              // Note this is always done if we switched the stub type above.
11823
              if (cortex_a8_reloc != NULL)
11824
                offset = (off_t) (cortex_a8_reloc->destination() - pc_for_insn);
11825
 
11826
              Arm_address target = (pc_for_insn + offset) | (is_blx ? 0 : 1);
11827
 
11828
              // Add a new stub if destination address in in the same page.
11829
              if (((address + i) & ~0xfffU) == (target & ~0xfffU))
11830
                {
11831
                  Cortex_a8_stub* stub =
11832
                    this->stub_factory_.make_cortex_a8_stub(stub_type,
11833
                                                            arm_relobj, shndx,
11834
                                                            address + i,
11835
                                                            target, insn);
11836
                  Stub_table<big_endian>* stub_table =
11837
                    arm_relobj->stub_table(shndx);
11838
                  gold_assert(stub_table != NULL);
11839
                  stub_table->add_cortex_a8_stub(address + i, stub);
11840
                }
11841
            }
11842
        }
11843
 
11844
      i += insn_32bit ? 4 : 2;
11845
      last_was_32bit = insn_32bit;
11846
      last_was_branch = is_32bit_branch;
11847
    }
11848
}
11849
 
11850
// Apply the Cortex-A8 workaround.
11851
 
11852
template<bool big_endian>
11853
void
11854
Target_arm<big_endian>::apply_cortex_a8_workaround(
11855
    const Cortex_a8_stub* stub,
11856
    Arm_address stub_address,
11857
    unsigned char* insn_view,
11858
    Arm_address insn_address)
11859
{
11860
  typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
11861
  Valtype* wv = reinterpret_cast<Valtype*>(insn_view);
11862
  Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
11863
  Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
11864
  off_t branch_offset = stub_address - (insn_address + 4);
11865
 
11866
  typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
11867
  switch (stub->stub_template()->type())
11868
    {
11869
    case arm_stub_a8_veneer_b_cond:
11870
      // For a conditional branch, we re-write it to be an unconditional
11871
      // branch to the stub.  We use the THUMB-2 encoding here.
11872
      upper_insn = 0xf000U;
11873
      lower_insn = 0xb800U;
11874
      // Fall through
11875
    case arm_stub_a8_veneer_b:
11876
    case arm_stub_a8_veneer_bl:
11877
    case arm_stub_a8_veneer_blx:
11878
      if ((lower_insn & 0x5000U) == 0x4000U)
11879
        // For a BLX instruction, make sure that the relocation is
11880
        // rounded up to a word boundary.  This follows the semantics of
11881
        // the instruction which specifies that bit 1 of the target
11882
        // address will come from bit 1 of the base address.
11883
        branch_offset = (branch_offset + 2) & ~3;
11884
 
11885
      // Put BRANCH_OFFSET back into the insn.
11886
      gold_assert(!utils::has_overflow<25>(branch_offset));
11887
      upper_insn = RelocFuncs::thumb32_branch_upper(upper_insn, branch_offset);
11888
      lower_insn = RelocFuncs::thumb32_branch_lower(lower_insn, branch_offset);
11889
      break;
11890
 
11891
    default:
11892
      gold_unreachable();
11893
    }
11894
 
11895
  // Put the relocated value back in the object file:
11896
  elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
11897
  elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
11898
}
11899
 
11900
template<bool big_endian>
11901
class Target_selector_arm : public Target_selector
11902
{
11903
 public:
11904
  Target_selector_arm()
11905
    : Target_selector(elfcpp::EM_ARM, 32, big_endian,
11906 159 khays
                      (big_endian ? "elf32-bigarm" : "elf32-littlearm"),
11907
                      (big_endian ? "armelfb" : "armelf"))
11908 27 khays
  { }
11909
 
11910
  Target*
11911
  do_instantiate_target()
11912
  { return new Target_arm<big_endian>(); }
11913
};
11914
 
11915
// Fix .ARM.exidx section coverage.
11916
 
11917
template<bool big_endian>
11918
void
11919
Target_arm<big_endian>::fix_exidx_coverage(
11920
    Layout* layout,
11921
    const Input_objects* input_objects,
11922
    Arm_output_section<big_endian>* exidx_section,
11923
    Symbol_table* symtab,
11924
    const Task* task)
11925
{
11926
  // We need to look at all the input sections in output in ascending
11927
  // order of of output address.  We do that by building a sorted list
11928
  // of output sections by addresses.  Then we looks at the output sections
11929
  // in order.  The input sections in an output section are already sorted
11930
  // by addresses within the output section.
11931
 
11932
  typedef std::set<Output_section*, output_section_address_less_than>
11933
      Sorted_output_section_list;
11934
  Sorted_output_section_list sorted_output_sections;
11935
 
11936
  // Find out all the output sections of input sections pointed by
11937
  // EXIDX input sections.
11938
  for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
11939
       p != input_objects->relobj_end();
11940
       ++p)
11941
    {
11942
      Arm_relobj<big_endian>* arm_relobj =
11943
        Arm_relobj<big_endian>::as_arm_relobj(*p);
11944
      std::vector<unsigned int> shndx_list;
11945
      arm_relobj->get_exidx_shndx_list(&shndx_list);
11946
      for (size_t i = 0; i < shndx_list.size(); ++i)
11947
        {
11948
          const Arm_exidx_input_section* exidx_input_section =
11949
            arm_relobj->exidx_input_section_by_shndx(shndx_list[i]);
11950
          gold_assert(exidx_input_section != NULL);
11951
          if (!exidx_input_section->has_errors())
11952
            {
11953
              unsigned int text_shndx = exidx_input_section->link();
11954
              Output_section* os = arm_relobj->output_section(text_shndx);
11955
              if (os != NULL && (os->flags() & elfcpp::SHF_ALLOC) != 0)
11956
                sorted_output_sections.insert(os);
11957
            }
11958
        }
11959
    }
11960
 
11961
  // Go over the output sections in ascending order of output addresses.
11962
  typedef typename Arm_output_section<big_endian>::Text_section_list
11963
      Text_section_list;
11964
  Text_section_list sorted_text_sections;
11965
  for (typename Sorted_output_section_list::iterator p =
11966
        sorted_output_sections.begin();
11967
      p != sorted_output_sections.end();
11968
      ++p)
11969
    {
11970
      Arm_output_section<big_endian>* arm_output_section =
11971
        Arm_output_section<big_endian>::as_arm_output_section(*p);
11972
      arm_output_section->append_text_sections_to_list(&sorted_text_sections);
11973
    }
11974
 
11975
  exidx_section->fix_exidx_coverage(layout, sorted_text_sections, symtab,
11976
                                    merge_exidx_entries(), task);
11977
}
11978
 
11979
Target_selector_arm<false> target_selector_arm;
11980
Target_selector_arm<true> target_selector_armbe;
11981
 
11982
} // End anonymous namespace.

powered by: WebSVN 2.1.0

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