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 163

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

powered by: WebSVN 2.1.0

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