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 299

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

powered by: WebSVN 2.1.0

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