Reapply: List inferiors/threads/pspaces in ascending order
[deliverable/binutils-gdb.git] / gold / arm.cc
CommitLineData
4a657b0d
DK
1// arm.cc -- arm target support for gold.
2
6f2750fe 3// Copyright (C) 2009-2016 Free Software Foundation, Inc.
4a657b0d
DK
4// Written by Doug Kwan <dougkwan@google.com> based on the i386 code
5// by Ian Lance Taylor <iant@google.com>.
b569affa
DK
6// This file also contains borrowed and adapted code from
7// bfd/elf32-arm.c.
4a657b0d
DK
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>
56ee5e00 32#include <algorithm>
41263c05
DK
33#include <map>
34#include <utility>
2b328d4e 35#include <set>
4a657b0d
DK
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"
f345227a 51#include "gc.h"
a0351a69 52#include "attributes.h"
0d31c79d 53#include "arm-reloc-property.h"
2e702c99 54#include "nacl.h"
4a657b0d
DK
55
56namespace
57{
58
59using namespace gold;
60
94cdfcff
DK
61template<bool big_endian>
62class Output_data_plt_arm;
63
2e702c99 64template<bool big_endian>
ce3e4980
PC
65class Output_data_plt_arm_short;
66
67template<bool big_endian>
68class Output_data_plt_arm_long;
2e702c99 69
56ee5e00
DK
70template<bool big_endian>
71class Stub_table;
72
73template<bool big_endian>
74class Arm_input_section;
75
af2cdeae
DK
76class Arm_exidx_cantunwind;
77
78class Arm_exidx_merged_section;
79
80d0d023
DK
80class Arm_exidx_fixup;
81
07f508a2
DK
82template<bool big_endian>
83class Arm_output_section;
84
993d07c1
DK
85class Arm_exidx_input_section;
86
07f508a2
DK
87template<bool big_endian>
88class Arm_relobj;
89
f96accdf
DK
90template<bool big_endian>
91class Arm_relocate_functions;
92
4a54abbb
DK
93template<bool big_endian>
94class Arm_output_data_got;
95
b569affa
DK
96template<bool big_endian>
97class Target_arm;
98
99// For convenience.
100typedef elfcpp::Elf_types<32>::Elf_Addr Arm_address;
101
102// Maximum branch offsets for ARM, THUMB and THUMB2.
103const int32_t ARM_MAX_FWD_BRANCH_OFFSET = ((((1 << 23) - 1) << 2) + 8);
104const int32_t ARM_MAX_BWD_BRANCH_OFFSET = ((-((1 << 23) << 2)) + 8);
105const int32_t THM_MAX_FWD_BRANCH_OFFSET = ((1 << 22) -2 + 4);
106const int32_t THM_MAX_BWD_BRANCH_OFFSET = (-(1 << 22) + 4);
107const int32_t THM2_MAX_FWD_BRANCH_OFFSET = (((1 << 24) - 2) + 4);
108const int32_t THM2_MAX_BWD_BRANCH_OFFSET = (-(1 << 24) + 4);
109
4a54abbb
DK
110// Thread Control Block size.
111const size_t ARM_TCB_SIZE = 8;
112
4a657b0d
DK
113// The arm target class.
114//
115// This is a very simple port of gold for ARM-EABI. It is intended for
b10d2873 116// supporting Android only for the time being.
2e702c99 117//
4a657b0d 118// TODOs:
0d31c79d 119// - Implement all static relocation types documented in arm-reloc.def.
94cdfcff
DK
120// - Make PLTs more flexible for different architecture features like
121// Thumb-2 and BE8.
11af873f 122// There are probably a lot more.
4a657b0d 123
0d31c79d
DK
124// Ideally we would like to avoid using global variables but this is used
125// very in many places and sometimes in loops. If we use a function
9b547ce6 126// returning a static instance of Arm_reloc_property_table, it will be very
0d31c79d
DK
127// slow in an threaded environment since the static instance needs to be
128// locked. The pointer is below initialized in the
129// Target::do_select_as_default_target() hook so that we do not spend time
130// building the table if we are not linking ARM objects.
131//
132// An alternative is to to process the information in arm-reloc.def in
133// compilation time and generate a representation of it in PODs only. That
134// way we can avoid initialization when the linker starts.
135
ca09d69a 136Arm_reloc_property_table* arm_reloc_property_table = NULL;
0d31c79d 137
b569affa
DK
138// Instruction template class. This class is similar to the insn_sequence
139// struct in bfd/elf32-arm.c.
140
141class Insn_template
142{
143 public:
144 // Types of instruction templates.
145 enum Type
146 {
147 THUMB16_TYPE = 1,
2e702c99 148 // THUMB16_SPECIAL_TYPE is used by sub-classes of Stub for instruction
bb0d3eb0
DK
149 // templates with class-specific semantics. Currently this is used
150 // only by the Cortex_a8_stub class for handling condition codes in
151 // conditional branches.
152 THUMB16_SPECIAL_TYPE,
b569affa
DK
153 THUMB32_TYPE,
154 ARM_TYPE,
155 DATA_TYPE
156 };
157
bb0d3eb0 158 // Factory methods to create instruction templates in different formats.
b569affa
DK
159
160 static const Insn_template
161 thumb16_insn(uint32_t data)
2e702c99 162 { return Insn_template(data, THUMB16_TYPE, elfcpp::R_ARM_NONE, 0); }
b569affa 163
bb0d3eb0
DK
164 // A Thumb conditional branch, in which the proper condition is inserted
165 // when we build the stub.
b569affa
DK
166 static const Insn_template
167 thumb16_bcond_insn(uint32_t data)
2e702c99 168 { return Insn_template(data, THUMB16_SPECIAL_TYPE, elfcpp::R_ARM_NONE, 1); }
b569affa
DK
169
170 static const Insn_template
171 thumb32_insn(uint32_t data)
2e702c99 172 { return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_NONE, 0); }
b569affa
DK
173
174 static const Insn_template
175 thumb32_b_insn(uint32_t data, int reloc_addend)
176 {
177 return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_THM_JUMP24,
178 reloc_addend);
2e702c99 179 }
b569affa
DK
180
181 static const Insn_template
182 arm_insn(uint32_t data)
183 { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_NONE, 0); }
184
185 static const Insn_template
186 arm_rel_insn(unsigned data, int reloc_addend)
187 { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_JUMP24, reloc_addend); }
188
189 static const Insn_template
190 data_word(unsigned data, unsigned int r_type, int reloc_addend)
2e702c99 191 { return Insn_template(data, DATA_TYPE, r_type, reloc_addend); }
b569affa
DK
192
193 // Accessors. This class is used for read-only objects so no modifiers
194 // are provided.
195
196 uint32_t
197 data() const
198 { return this->data_; }
199
200 // Return the instruction sequence type of this.
201 Type
202 type() const
203 { return this->type_; }
204
205 // Return the ARM relocation type of this.
206 unsigned int
207 r_type() const
208 { return this->r_type_; }
209
210 int32_t
211 reloc_addend() const
212 { return this->reloc_addend_; }
213
bb0d3eb0 214 // Return size of instruction template in bytes.
b569affa
DK
215 size_t
216 size() const;
217
bb0d3eb0 218 // Return byte-alignment of instruction template.
b569affa
DK
219 unsigned
220 alignment() const;
221
222 private:
223 // We make the constructor private to ensure that only the factory
224 // methods are used.
225 inline
2ea97941
ILT
226 Insn_template(unsigned data, Type type, unsigned int r_type, int reloc_addend)
227 : data_(data), type_(type), r_type_(r_type), reloc_addend_(reloc_addend)
b569affa
DK
228 { }
229
230 // Instruction specific data. This is used to store information like
231 // some of the instruction bits.
232 uint32_t data_;
233 // Instruction template type.
234 Type type_;
235 // Relocation type if there is a relocation or R_ARM_NONE otherwise.
236 unsigned int r_type_;
237 // Relocation addend.
238 int32_t reloc_addend_;
239};
240
241// Macro for generating code to stub types. One entry per long/short
242// branch stub
243
244#define DEF_STUBS \
245 DEF_STUB(long_branch_any_any) \
246 DEF_STUB(long_branch_v4t_arm_thumb) \
247 DEF_STUB(long_branch_thumb_only) \
248 DEF_STUB(long_branch_v4t_thumb_thumb) \
249 DEF_STUB(long_branch_v4t_thumb_arm) \
250 DEF_STUB(short_branch_v4t_thumb_arm) \
251 DEF_STUB(long_branch_any_arm_pic) \
252 DEF_STUB(long_branch_any_thumb_pic) \
253 DEF_STUB(long_branch_v4t_thumb_thumb_pic) \
254 DEF_STUB(long_branch_v4t_arm_thumb_pic) \
255 DEF_STUB(long_branch_v4t_thumb_arm_pic) \
256 DEF_STUB(long_branch_thumb_only_pic) \
257 DEF_STUB(a8_veneer_b_cond) \
258 DEF_STUB(a8_veneer_b) \
259 DEF_STUB(a8_veneer_bl) \
a2162063
ILT
260 DEF_STUB(a8_veneer_blx) \
261 DEF_STUB(v4_veneer_bx)
b569affa
DK
262
263// Stub types.
264
265#define DEF_STUB(x) arm_stub_##x,
266typedef enum
267 {
268 arm_stub_none,
269 DEF_STUBS
270
271 // First reloc stub type.
272 arm_stub_reloc_first = arm_stub_long_branch_any_any,
273 // Last reloc stub type.
274 arm_stub_reloc_last = arm_stub_long_branch_thumb_only_pic,
275
276 // First Cortex-A8 stub type.
277 arm_stub_cortex_a8_first = arm_stub_a8_veneer_b_cond,
278 // Last Cortex-A8 stub type.
279 arm_stub_cortex_a8_last = arm_stub_a8_veneer_blx,
2e702c99 280
b569affa 281 // Last stub type.
a2162063 282 arm_stub_type_last = arm_stub_v4_veneer_bx
b569affa
DK
283 } Stub_type;
284#undef DEF_STUB
285
286// Stub template class. Templates are meant to be read-only objects.
287// A stub template for a stub type contains all read-only attributes
288// common to all stubs of the same type.
289
290class Stub_template
291{
292 public:
293 Stub_template(Stub_type, const Insn_template*, size_t);
294
295 ~Stub_template()
296 { }
297
298 // Return stub type.
299 Stub_type
300 type() const
301 { return this->type_; }
302
303 // Return an array of instruction templates.
304 const Insn_template*
305 insns() const
306 { return this->insns_; }
307
308 // Return size of template in number of instructions.
309 size_t
310 insn_count() const
311 { return this->insn_count_; }
312
313 // Return size of template in bytes.
314 size_t
315 size() const
316 { return this->size_; }
317
318 // Return alignment of the stub template.
319 unsigned
320 alignment() const
321 { return this->alignment_; }
2e702c99 322
b569affa
DK
323 // Return whether entry point is in thumb mode.
324 bool
325 entry_in_thumb_mode() const
326 { return this->entry_in_thumb_mode_; }
327
328 // Return number of relocations in this template.
329 size_t
330 reloc_count() const
331 { return this->relocs_.size(); }
332
333 // Return index of the I-th instruction with relocation.
334 size_t
335 reloc_insn_index(size_t i) const
336 {
337 gold_assert(i < this->relocs_.size());
338 return this->relocs_[i].first;
339 }
340
341 // Return the offset of the I-th instruction with relocation from the
342 // beginning of the stub.
343 section_size_type
344 reloc_offset(size_t i) const
345 {
346 gold_assert(i < this->relocs_.size());
347 return this->relocs_[i].second;
348 }
349
350 private:
351 // This contains information about an instruction template with a relocation
352 // and its offset from start of stub.
353 typedef std::pair<size_t, section_size_type> Reloc;
354
355 // A Stub_template may not be copied. We want to share templates as much
356 // as possible.
357 Stub_template(const Stub_template&);
358 Stub_template& operator=(const Stub_template&);
2e702c99 359
b569affa
DK
360 // Stub type.
361 Stub_type type_;
362 // Points to an array of Insn_templates.
363 const Insn_template* insns_;
364 // Number of Insn_templates in insns_[].
365 size_t insn_count_;
366 // Size of templated instructions in bytes.
367 size_t size_;
368 // Alignment of templated instructions.
369 unsigned alignment_;
370 // Flag to indicate if entry is in thumb mode.
371 bool entry_in_thumb_mode_;
372 // A table of reloc instruction indices and offsets. We can find these by
373 // looking at the instruction templates but we pre-compute and then stash
2e702c99 374 // them here for speed.
b569affa
DK
375 std::vector<Reloc> relocs_;
376};
377
378//
379// A class for code stubs. This is a base class for different type of
380// stubs used in the ARM target.
381//
382
383class Stub
384{
385 private:
386 static const section_offset_type invalid_offset =
387 static_cast<section_offset_type>(-1);
388
389 public:
2ea97941
ILT
390 Stub(const Stub_template* stub_template)
391 : stub_template_(stub_template), offset_(invalid_offset)
b569affa
DK
392 { }
393
394 virtual
395 ~Stub()
396 { }
397
398 // Return the stub template.
399 const Stub_template*
400 stub_template() const
401 { return this->stub_template_; }
402
403 // Return offset of code stub from beginning of its containing stub table.
404 section_offset_type
405 offset() const
406 {
407 gold_assert(this->offset_ != invalid_offset);
408 return this->offset_;
409 }
410
411 // Set offset of code stub from beginning of its containing stub table.
412 void
2ea97941
ILT
413 set_offset(section_offset_type offset)
414 { this->offset_ = offset; }
2e702c99 415
b569affa
DK
416 // Return the relocation target address of the i-th relocation in the
417 // stub. This must be defined in a child class.
418 Arm_address
419 reloc_target(size_t i)
420 { return this->do_reloc_target(i); }
421
422 // Write a stub at output VIEW. BIG_ENDIAN select how a stub is written.
423 void
424 write(unsigned char* view, section_size_type view_size, bool big_endian)
425 { this->do_write(view, view_size, big_endian); }
426
bb0d3eb0
DK
427 // Return the instruction for THUMB16_SPECIAL_TYPE instruction template
428 // for the i-th instruction.
429 uint16_t
430 thumb16_special(size_t i)
431 { return this->do_thumb16_special(i); }
432
b569affa
DK
433 protected:
434 // This must be defined in the child class.
435 virtual Arm_address
436 do_reloc_target(size_t) = 0;
437
bb0d3eb0 438 // This may be overridden in the child class.
b569affa 439 virtual void
bb0d3eb0
DK
440 do_write(unsigned char* view, section_size_type view_size, bool big_endian)
441 {
442 if (big_endian)
443 this->do_fixed_endian_write<true>(view, view_size);
444 else
445 this->do_fixed_endian_write<false>(view, view_size);
446 }
2e702c99 447
bb0d3eb0
DK
448 // This must be overridden if a child class uses the THUMB16_SPECIAL_TYPE
449 // instruction template.
450 virtual uint16_t
451 do_thumb16_special(size_t)
452 { gold_unreachable(); }
453
b569affa 454 private:
bb0d3eb0
DK
455 // A template to implement do_write.
456 template<bool big_endian>
457 void inline
458 do_fixed_endian_write(unsigned char*, section_size_type);
459
b569affa
DK
460 // Its template.
461 const Stub_template* stub_template_;
462 // Offset within the section of containing this stub.
463 section_offset_type offset_;
464};
465
466// Reloc stub class. These are stubs we use to fix up relocation because
467// of limited branch ranges.
468
469class Reloc_stub : public Stub
470{
471 public:
472 static const unsigned int invalid_index = static_cast<unsigned int>(-1);
473 // We assume we never jump to this address.
474 static const Arm_address invalid_address = static_cast<Arm_address>(-1);
475
476 // Return destination address.
477 Arm_address
478 destination_address() const
479 {
480 gold_assert(this->destination_address_ != this->invalid_address);
481 return this->destination_address_;
482 }
483
484 // Set destination address.
485 void
486 set_destination_address(Arm_address address)
487 {
488 gold_assert(address != this->invalid_address);
489 this->destination_address_ = address;
490 }
491
492 // Reset destination address.
493 void
494 reset_destination_address()
495 { this->destination_address_ = this->invalid_address; }
496
497 // Determine stub type for a branch of a relocation of R_TYPE going
498 // from BRANCH_ADDRESS to BRANCH_TARGET. If TARGET_IS_THUMB is set,
499 // the branch target is a thumb instruction. TARGET is used for look
500 // up ARM-specific linker settings.
501 static Stub_type
502 stub_type_for_reloc(unsigned int r_type, Arm_address branch_address,
503 Arm_address branch_target, bool target_is_thumb);
504
505 // Reloc_stub key. A key is logically a triplet of a stub type, a symbol
506 // and an addend. Since we treat global and local symbol differently, we
507 // use a Symbol object for a global symbol and a object-index pair for
508 // a local symbol.
509 class Key
510 {
511 public:
512 // If SYMBOL is not null, this is a global symbol, we ignore RELOBJ and
513 // R_SYM. Otherwise, this is a local symbol and RELOBJ must non-NULL
514 // and R_SYM must not be invalid_index.
2ea97941
ILT
515 Key(Stub_type stub_type, const Symbol* symbol, const Relobj* relobj,
516 unsigned int r_sym, int32_t addend)
517 : stub_type_(stub_type), addend_(addend)
b569affa 518 {
2ea97941 519 if (symbol != NULL)
b569affa
DK
520 {
521 this->r_sym_ = Reloc_stub::invalid_index;
2ea97941 522 this->u_.symbol = symbol;
b569affa
DK
523 }
524 else
525 {
2ea97941
ILT
526 gold_assert(relobj != NULL && r_sym != invalid_index);
527 this->r_sym_ = r_sym;
528 this->u_.relobj = relobj;
b569affa
DK
529 }
530 }
531
532 ~Key()
533 { }
534
535 // Accessors: Keys are meant to be read-only object so no modifiers are
536 // provided.
537
538 // Return stub type.
539 Stub_type
540 stub_type() const
541 { return this->stub_type_; }
542
543 // Return the local symbol index or invalid_index.
544 unsigned int
545 r_sym() const
546 { return this->r_sym_; }
547
548 // Return the symbol if there is one.
549 const Symbol*
550 symbol() const
551 { return this->r_sym_ == invalid_index ? this->u_.symbol : NULL; }
552
553 // Return the relobj if there is one.
554 const Relobj*
555 relobj() const
556 { return this->r_sym_ != invalid_index ? this->u_.relobj : NULL; }
557
558 // Whether this equals to another key k.
559 bool
2e702c99 560 eq(const Key& k) const
b569affa
DK
561 {
562 return ((this->stub_type_ == k.stub_type_)
563 && (this->r_sym_ == k.r_sym_)
564 && ((this->r_sym_ != Reloc_stub::invalid_index)
565 ? (this->u_.relobj == k.u_.relobj)
566 : (this->u_.symbol == k.u_.symbol))
567 && (this->addend_ == k.addend_));
568 }
569
570 // Return a hash value.
571 size_t
572 hash_value() const
573 {
574 return (this->stub_type_
575 ^ this->r_sym_
576 ^ gold::string_hash<char>(
577 (this->r_sym_ != Reloc_stub::invalid_index)
578 ? this->u_.relobj->name().c_str()
579 : this->u_.symbol->name())
580 ^ this->addend_);
581 }
582
583 // Functors for STL associative containers.
584 struct hash
585 {
586 size_t
587 operator()(const Key& k) const
588 { return k.hash_value(); }
589 };
590
591 struct equal_to
592 {
593 bool
594 operator()(const Key& k1, const Key& k2) const
595 { return k1.eq(k2); }
596 };
597
598 // Name of key. This is mainly for debugging.
599 std::string
600 name() const;
601
602 private:
603 // Stub type.
604 Stub_type stub_type_;
605 // If this is a local symbol, this is the index in the defining object.
606 // Otherwise, it is invalid_index for a global symbol.
607 unsigned int r_sym_;
9b547ce6
RW
608 // If r_sym_ is an invalid index, this points to a global symbol.
609 // Otherwise, it points to a relobj. We used the unsized and target
2e702c99 610 // independent Symbol and Relobj classes instead of Sized_symbol<32> and
9b547ce6 611 // Arm_relobj, in order to avoid making the stub class a template
7296d933 612 // as most of the stub machinery is endianness-neutral. However, it
b569affa
DK
613 // may require a bit of casting done by users of this class.
614 union
615 {
616 const Symbol* symbol;
617 const Relobj* relobj;
618 } u_;
619 // Addend associated with a reloc.
620 int32_t addend_;
621 };
622
623 protected:
624 // Reloc_stubs are created via a stub factory. So these are protected.
2ea97941
ILT
625 Reloc_stub(const Stub_template* stub_template)
626 : Stub(stub_template), destination_address_(invalid_address)
b569affa
DK
627 { }
628
629 ~Reloc_stub()
630 { }
631
632 friend class Stub_factory;
633
b569affa
DK
634 // Return the relocation target address of the i-th relocation in the
635 // stub.
636 Arm_address
637 do_reloc_target(size_t i)
638 {
639 // All reloc stub have only one relocation.
640 gold_assert(i == 0);
641 return this->destination_address_;
642 }
643
bb0d3eb0
DK
644 private:
645 // Address of destination.
646 Arm_address destination_address_;
647};
b569affa 648
bb0d3eb0
DK
649// Cortex-A8 stub class. We need a Cortex-A8 stub to redirect any 32-bit
650// THUMB branch that meets the following conditions:
2e702c99 651//
bb0d3eb0
DK
652// 1. The branch straddles across a page boundary. i.e. lower 12-bit of
653// branch address is 0xffe.
654// 2. The branch target address is in the same page as the first word of the
655// branch.
656// 3. The branch follows a 32-bit instruction which is not a branch.
657//
658// To do the fix up, we need to store the address of the branch instruction
659// and its target at least. We also need to store the original branch
660// instruction bits for the condition code in a conditional branch. The
661// condition code is used in a special instruction template. We also want
662// to identify input sections needing Cortex-A8 workaround quickly. We store
663// extra information about object and section index of the code section
664// containing a branch being fixed up. The information is used to mark
665// the code section when we finalize the Cortex-A8 stubs.
666//
b569affa 667
bb0d3eb0
DK
668class Cortex_a8_stub : public Stub
669{
670 public:
671 ~Cortex_a8_stub()
672 { }
673
674 // Return the object of the code section containing the branch being fixed
675 // up.
676 Relobj*
677 relobj() const
678 { return this->relobj_; }
679
680 // Return the section index of the code section containing the branch being
681 // fixed up.
682 unsigned int
683 shndx() const
684 { return this->shndx_; }
685
686 // Return the source address of stub. This is the address of the original
687 // branch instruction. LSB is 1 always set to indicate that it is a THUMB
688 // instruction.
689 Arm_address
690 source_address() const
691 { return this->source_address_; }
692
693 // Return the destination address of the stub. This is the branch taken
694 // address of the original branch instruction. LSB is 1 if it is a THUMB
695 // instruction address.
696 Arm_address
697 destination_address() const
698 { return this->destination_address_; }
699
700 // Return the instruction being fixed up.
701 uint32_t
702 original_insn() const
703 { return this->original_insn_; }
704
705 protected:
706 // Cortex_a8_stubs are created via a stub factory. So these are protected.
707 Cortex_a8_stub(const Stub_template* stub_template, Relobj* relobj,
708 unsigned int shndx, Arm_address source_address,
709 Arm_address destination_address, uint32_t original_insn)
710 : Stub(stub_template), relobj_(relobj), shndx_(shndx),
711 source_address_(source_address | 1U),
712 destination_address_(destination_address),
713 original_insn_(original_insn)
714 { }
715
716 friend class Stub_factory;
717
718 // Return the relocation target address of the i-th relocation in the
719 // stub.
720 Arm_address
721 do_reloc_target(size_t i)
722 {
723 if (this->stub_template()->type() == arm_stub_a8_veneer_b_cond)
724 {
2e702c99
RM
725 // The conditional branch veneer has two relocations.
726 gold_assert(i < 2);
bb0d3eb0
DK
727 return i == 0 ? this->source_address_ + 4 : this->destination_address_;
728 }
729 else
730 {
2e702c99
RM
731 // All other Cortex-A8 stubs have only one relocation.
732 gold_assert(i == 0);
733 return this->destination_address_;
bb0d3eb0
DK
734 }
735 }
736
737 // Return an instruction for the THUMB16_SPECIAL_TYPE instruction template.
738 uint16_t
739 do_thumb16_special(size_t);
740
741 private:
742 // Object of the code section containing the branch being fixed up.
743 Relobj* relobj_;
744 // Section index of the code section containing the branch begin fixed up.
745 unsigned int shndx_;
746 // Source address of original branch.
747 Arm_address source_address_;
748 // Destination address of the original branch.
b569affa 749 Arm_address destination_address_;
bb0d3eb0
DK
750 // Original branch instruction. This is needed for copying the condition
751 // code from a condition branch to its stub.
752 uint32_t original_insn_;
b569affa
DK
753};
754
a2162063
ILT
755// ARMv4 BX Rx branch relocation stub class.
756class Arm_v4bx_stub : public Stub
757{
758 public:
759 ~Arm_v4bx_stub()
760 { }
761
762 // Return the associated register.
763 uint32_t
764 reg() const
765 { return this->reg_; }
766
767 protected:
768 // Arm V4BX stubs are created via a stub factory. So these are protected.
769 Arm_v4bx_stub(const Stub_template* stub_template, const uint32_t reg)
770 : Stub(stub_template), reg_(reg)
771 { }
772
773 friend class Stub_factory;
774
775 // Return the relocation target address of the i-th relocation in the
776 // stub.
777 Arm_address
778 do_reloc_target(size_t)
779 { gold_unreachable(); }
780
781 // This may be overridden in the child class.
782 virtual void
783 do_write(unsigned char* view, section_size_type view_size, bool big_endian)
784 {
785 if (big_endian)
786 this->do_fixed_endian_v4bx_write<true>(view, view_size);
787 else
788 this->do_fixed_endian_v4bx_write<false>(view, view_size);
789 }
790
791 private:
792 // A template to implement do_write.
793 template<bool big_endian>
794 void inline
795 do_fixed_endian_v4bx_write(unsigned char* view, section_size_type)
796 {
797 const Insn_template* insns = this->stub_template()->insns();
798 elfcpp::Swap<32, big_endian>::writeval(view,
799 (insns[0].data()
800 + (this->reg_ << 16)));
801 view += insns[0].size();
802 elfcpp::Swap<32, big_endian>::writeval(view,
803 (insns[1].data() + this->reg_));
804 view += insns[1].size();
805 elfcpp::Swap<32, big_endian>::writeval(view,
806 (insns[2].data() + this->reg_));
807 }
808
809 // A register index (r0-r14), which is associated with the stub.
810 uint32_t reg_;
811};
812
b569affa
DK
813// Stub factory class.
814
815class Stub_factory
816{
817 public:
818 // Return the unique instance of this class.
819 static const Stub_factory&
820 get_instance()
821 {
822 static Stub_factory singleton;
823 return singleton;
824 }
825
826 // Make a relocation stub.
827 Reloc_stub*
828 make_reloc_stub(Stub_type stub_type) const
829 {
830 gold_assert(stub_type >= arm_stub_reloc_first
831 && stub_type <= arm_stub_reloc_last);
832 return new Reloc_stub(this->stub_templates_[stub_type]);
833 }
834
bb0d3eb0
DK
835 // Make a Cortex-A8 stub.
836 Cortex_a8_stub*
837 make_cortex_a8_stub(Stub_type stub_type, Relobj* relobj, unsigned int shndx,
838 Arm_address source, Arm_address destination,
839 uint32_t original_insn) const
840 {
841 gold_assert(stub_type >= arm_stub_cortex_a8_first
842 && stub_type <= arm_stub_cortex_a8_last);
843 return new Cortex_a8_stub(this->stub_templates_[stub_type], relobj, shndx,
844 source, destination, original_insn);
845 }
846
a2162063
ILT
847 // Make an ARM V4BX relocation stub.
848 // This method creates a stub from the arm_stub_v4_veneer_bx template only.
849 Arm_v4bx_stub*
850 make_arm_v4bx_stub(uint32_t reg) const
851 {
852 gold_assert(reg < 0xf);
853 return new Arm_v4bx_stub(this->stub_templates_[arm_stub_v4_veneer_bx],
854 reg);
855 }
856
b569affa
DK
857 private:
858 // Constructor and destructor are protected since we only return a single
859 // instance created in Stub_factory::get_instance().
2e702c99 860
b569affa
DK
861 Stub_factory();
862
863 // A Stub_factory may not be copied since it is a singleton.
864 Stub_factory(const Stub_factory&);
865 Stub_factory& operator=(Stub_factory&);
2e702c99 866
b569affa
DK
867 // Stub templates. These are initialized in the constructor.
868 const Stub_template* stub_templates_[arm_stub_type_last+1];
869};
870
56ee5e00
DK
871// A class to hold stubs for the ARM target.
872
873template<bool big_endian>
874class Stub_table : public Output_data
875{
876 public:
2ea97941 877 Stub_table(Arm_input_section<big_endian>* owner)
d099120c
DK
878 : Output_data(), owner_(owner), reloc_stubs_(), reloc_stubs_size_(0),
879 reloc_stubs_addralign_(1), cortex_a8_stubs_(), arm_v4bx_stubs_(0xf),
880 prev_data_size_(0), prev_addralign_(1)
56ee5e00
DK
881 { }
882
883 ~Stub_table()
884 { }
885
886 // Owner of this stub table.
887 Arm_input_section<big_endian>*
888 owner() const
889 { return this->owner_; }
890
891 // Whether this stub table is empty.
892 bool
893 empty() const
a2162063
ILT
894 {
895 return (this->reloc_stubs_.empty()
896 && this->cortex_a8_stubs_.empty()
897 && this->arm_v4bx_stubs_.empty());
898 }
56ee5e00
DK
899
900 // Return the current data size.
901 off_t
902 current_data_size() const
903 { return this->current_data_size_for_child(); }
904
9b547ce6
RW
905 // Add a STUB using KEY. The caller is responsible for avoiding addition
906 // if a STUB with the same key has already been added.
56ee5e00 907 void
2fb7225c
DK
908 add_reloc_stub(Reloc_stub* stub, const Reloc_stub::Key& key)
909 {
910 const Stub_template* stub_template = stub->stub_template();
911 gold_assert(stub_template->type() == key.stub_type());
912 this->reloc_stubs_[key] = stub;
d099120c
DK
913
914 // Assign stub offset early. We can do this because we never remove
915 // reloc stubs and they are in the beginning of the stub table.
916 uint64_t align = stub_template->alignment();
917 this->reloc_stubs_size_ = align_address(this->reloc_stubs_size_, align);
918 stub->set_offset(this->reloc_stubs_size_);
919 this->reloc_stubs_size_ += stub_template->size();
920 this->reloc_stubs_addralign_ =
921 std::max(this->reloc_stubs_addralign_, align);
2fb7225c
DK
922 }
923
924 // Add a Cortex-A8 STUB that fixes up a THUMB branch at ADDRESS.
9b547ce6
RW
925 // The caller is responsible for avoiding addition if a STUB with the same
926 // address has already been added.
2fb7225c
DK
927 void
928 add_cortex_a8_stub(Arm_address address, Cortex_a8_stub* stub)
929 {
930 std::pair<Arm_address, Cortex_a8_stub*> value(address, stub);
931 this->cortex_a8_stubs_.insert(value);
932 }
933
a2162063
ILT
934 // Add an ARM V4BX relocation stub. A register index will be retrieved
935 // from the stub.
936 void
937 add_arm_v4bx_stub(Arm_v4bx_stub* stub)
938 {
939 gold_assert(stub != NULL && this->arm_v4bx_stubs_[stub->reg()] == NULL);
940 this->arm_v4bx_stubs_[stub->reg()] = stub;
941 }
942
2fb7225c
DK
943 // Remove all Cortex-A8 stubs.
944 void
945 remove_all_cortex_a8_stubs();
56ee5e00
DK
946
947 // Look up a relocation stub using KEY. Return NULL if there is none.
948 Reloc_stub*
949 find_reloc_stub(const Reloc_stub::Key& key) const
950 {
951 typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.find(key);
952 return (p != this->reloc_stubs_.end()) ? p->second : NULL;
953 }
954
a2162063
ILT
955 // Look up an arm v4bx relocation stub using the register index.
956 // Return NULL if there is none.
957 Arm_v4bx_stub*
958 find_arm_v4bx_stub(const uint32_t reg) const
959 {
960 gold_assert(reg < 0xf);
961 return this->arm_v4bx_stubs_[reg];
962 }
963
56ee5e00
DK
964 // Relocate stubs in this stub table.
965 void
966 relocate_stubs(const Relocate_info<32, big_endian>*,
967 Target_arm<big_endian>*, Output_section*,
968 unsigned char*, Arm_address, section_size_type);
969
2fb7225c
DK
970 // Update data size and alignment at the end of a relaxation pass. Return
971 // true if either data size or alignment is different from that of the
972 // previous relaxation pass.
973 bool
974 update_data_size_and_addralign();
975
976 // Finalize stubs. Set the offsets of all stubs and mark input sections
977 // needing the Cortex-A8 workaround.
978 void
979 finalize_stubs();
2e702c99 980
2fb7225c
DK
981 // Apply Cortex-A8 workaround to an address range.
982 void
983 apply_cortex_a8_workaround_to_address_range(Target_arm<big_endian>*,
984 unsigned char*, Arm_address,
985 section_size_type);
986
56ee5e00
DK
987 protected:
988 // Write out section contents.
989 void
990 do_write(Output_file*);
2e702c99 991
56ee5e00
DK
992 // Return the required alignment.
993 uint64_t
994 do_addralign() const
2fb7225c 995 { return this->prev_addralign_; }
56ee5e00
DK
996
997 // Reset address and file offset.
998 void
2fb7225c
DK
999 do_reset_address_and_file_offset()
1000 { this->set_current_data_size_for_child(this->prev_data_size_); }
56ee5e00 1001
2fb7225c
DK
1002 // Set final data size.
1003 void
1004 set_final_data_size()
1005 { this->set_data_size(this->current_data_size()); }
2e702c99 1006
56ee5e00 1007 private:
2fb7225c
DK
1008 // Relocate one stub.
1009 void
1010 relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
1011 Target_arm<big_endian>*, Output_section*,
1012 unsigned char*, Arm_address, section_size_type);
1013
1014 // Unordered map of relocation stubs.
56ee5e00
DK
1015 typedef
1016 Unordered_map<Reloc_stub::Key, Reloc_stub*, Reloc_stub::Key::hash,
1017 Reloc_stub::Key::equal_to>
1018 Reloc_stub_map;
1019
2fb7225c
DK
1020 // List of Cortex-A8 stubs ordered by addresses of branches being
1021 // fixed up in output.
1022 typedef std::map<Arm_address, Cortex_a8_stub*> Cortex_a8_stub_list;
a2162063
ILT
1023 // List of Arm V4BX relocation stubs ordered by associated registers.
1024 typedef std::vector<Arm_v4bx_stub*> Arm_v4bx_stub_list;
2fb7225c 1025
56ee5e00
DK
1026 // Owner of this stub table.
1027 Arm_input_section<big_endian>* owner_;
56ee5e00
DK
1028 // The relocation stubs.
1029 Reloc_stub_map reloc_stubs_;
d099120c
DK
1030 // Size of reloc stubs.
1031 off_t reloc_stubs_size_;
1032 // Maximum address alignment of reloc stubs.
1033 uint64_t reloc_stubs_addralign_;
2fb7225c
DK
1034 // The cortex_a8_stubs.
1035 Cortex_a8_stub_list cortex_a8_stubs_;
a2162063
ILT
1036 // The Arm V4BX relocation stubs.
1037 Arm_v4bx_stub_list arm_v4bx_stubs_;
2fb7225c
DK
1038 // data size of this in the previous pass.
1039 off_t prev_data_size_;
1040 // address alignment of this in the previous pass.
1041 uint64_t prev_addralign_;
56ee5e00
DK
1042};
1043
af2cdeae
DK
1044// Arm_exidx_cantunwind class. This represents an EXIDX_CANTUNWIND entry
1045// we add to the end of an EXIDX input section that goes into the output.
1046
1047class Arm_exidx_cantunwind : public Output_section_data
1048{
1049 public:
1050 Arm_exidx_cantunwind(Relobj* relobj, unsigned int shndx)
1051 : Output_section_data(8, 4, true), relobj_(relobj), shndx_(shndx)
1052 { }
1053
1054 // Return the object containing the section pointed by this.
1055 Relobj*
1056 relobj() const
1057 { return this->relobj_; }
1058
1059 // Return the section index of the section pointed by this.
1060 unsigned int
1061 shndx() const
1062 { return this->shndx_; }
1063
1064 protected:
1065 void
1066 do_write(Output_file* of)
1067 {
1068 if (parameters->target().is_big_endian())
1069 this->do_fixed_endian_write<true>(of);
1070 else
1071 this->do_fixed_endian_write<false>(of);
1072 }
1073
aa98ff75
DK
1074 // Write to a map file.
1075 void
1076 do_print_to_mapfile(Mapfile* mapfile) const
1077 { mapfile->print_output_data(this, _("** ARM cantunwind")); }
1078
af2cdeae 1079 private:
7296d933 1080 // Implement do_write for a given endianness.
af2cdeae
DK
1081 template<bool big_endian>
1082 void inline
1083 do_fixed_endian_write(Output_file*);
2e702c99 1084
af2cdeae
DK
1085 // The object containing the section pointed by this.
1086 Relobj* relobj_;
1087 // The section index of the section pointed by this.
1088 unsigned int shndx_;
1089};
1090
1091// During EXIDX coverage fix-up, we compact an EXIDX section. The
1092// Offset map is used to map input section offset within the EXIDX section
2e702c99 1093// to the output offset from the start of this EXIDX section.
af2cdeae
DK
1094
1095typedef std::map<section_offset_type, section_offset_type>
1096 Arm_exidx_section_offset_map;
1097
1098// Arm_exidx_merged_section class. This represents an EXIDX input section
1099// with some of its entries merged.
1100
1101class Arm_exidx_merged_section : public Output_relaxed_input_section
1102{
1103 public:
1104 // Constructor for Arm_exidx_merged_section.
1105 // EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
1106 // SECTION_OFFSET_MAP points to a section offset map describing how
1107 // parts of the input section are mapped to output. DELETED_BYTES is
1108 // the number of bytes deleted from the EXIDX input section.
1109 Arm_exidx_merged_section(
1110 const Arm_exidx_input_section& exidx_input_section,
1111 const Arm_exidx_section_offset_map& section_offset_map,
1112 uint32_t deleted_bytes);
1113
f625ae50
DK
1114 // Build output contents.
1115 void
1116 build_contents(const unsigned char*, section_size_type);
1117
af2cdeae
DK
1118 // Return the original EXIDX input section.
1119 const Arm_exidx_input_section&
1120 exidx_input_section() const
1121 { return this->exidx_input_section_; }
1122
1123 // Return the section offset map.
1124 const Arm_exidx_section_offset_map&
1125 section_offset_map() const
1126 { return this->section_offset_map_; }
1127
1128 protected:
1129 // Write merged section into file OF.
1130 void
1131 do_write(Output_file* of);
1132
1133 bool
1134 do_output_offset(const Relobj*, unsigned int, section_offset_type,
1135 section_offset_type*) const;
1136
1137 private:
1138 // Original EXIDX input section.
1139 const Arm_exidx_input_section& exidx_input_section_;
1140 // Section offset map.
1141 const Arm_exidx_section_offset_map& section_offset_map_;
2e702c99 1142 // Merged section contents. We need to keep build the merged section
f625ae50
DK
1143 // and save it here to avoid accessing the original EXIDX section when
1144 // we cannot lock the sections' object.
1145 unsigned char* section_contents_;
af2cdeae
DK
1146};
1147
10ad9fe5
DK
1148// A class to wrap an ordinary input section containing executable code.
1149
1150template<bool big_endian>
1151class Arm_input_section : public Output_relaxed_input_section
1152{
1153 public:
2ea97941
ILT
1154 Arm_input_section(Relobj* relobj, unsigned int shndx)
1155 : Output_relaxed_input_section(relobj, shndx, 1),
f625ae50
DK
1156 original_addralign_(1), original_size_(0), stub_table_(NULL),
1157 original_contents_(NULL)
10ad9fe5
DK
1158 { }
1159
1160 ~Arm_input_section()
f625ae50 1161 { delete[] this->original_contents_; }
10ad9fe5
DK
1162
1163 // Initialize.
1164 void
1165 init();
2e702c99 1166
10ad9fe5
DK
1167 // Whether this is a stub table owner.
1168 bool
1169 is_stub_table_owner() const
1170 { return this->stub_table_ != NULL && this->stub_table_->owner() == this; }
1171
1172 // Return the stub table.
1173 Stub_table<big_endian>*
1174 stub_table() const
1175 { return this->stub_table_; }
1176
1177 // Set the stub_table.
1178 void
2ea97941
ILT
1179 set_stub_table(Stub_table<big_endian>* stub_table)
1180 { this->stub_table_ = stub_table; }
10ad9fe5 1181
07f508a2
DK
1182 // Downcast a base pointer to an Arm_input_section pointer. This is
1183 // not type-safe but we only use Arm_input_section not the base class.
1184 static Arm_input_section<big_endian>*
1185 as_arm_input_section(Output_relaxed_input_section* poris)
1186 { return static_cast<Arm_input_section<big_endian>*>(poris); }
1187
6625d24e
DK
1188 // Return the original size of the section.
1189 uint32_t
1190 original_size() const
1191 { return this->original_size_; }
1192
10ad9fe5
DK
1193 protected:
1194 // Write data to output file.
1195 void
1196 do_write(Output_file*);
1197
1198 // Return required alignment of this.
1199 uint64_t
1200 do_addralign() const
1201 {
1202 if (this->is_stub_table_owner())
1203 return std::max(this->stub_table_->addralign(),
6625d24e 1204 static_cast<uint64_t>(this->original_addralign_));
10ad9fe5
DK
1205 else
1206 return this->original_addralign_;
1207 }
1208
1209 // Finalize data size.
1210 void
1211 set_final_data_size();
1212
1213 // Reset address and file offset.
1214 void
1215 do_reset_address_and_file_offset();
1216
1217 // Output offset.
1218 bool
2ea97941
ILT
1219 do_output_offset(const Relobj* object, unsigned int shndx,
1220 section_offset_type offset,
2e702c99 1221 section_offset_type* poutput) const
10ad9fe5
DK
1222 {
1223 if ((object == this->relobj())
2ea97941
ILT
1224 && (shndx == this->shndx())
1225 && (offset >= 0)
0439c796
DK
1226 && (offset <=
1227 convert_types<section_offset_type, uint32_t>(this->original_size_)))
10ad9fe5 1228 {
2ea97941 1229 *poutput = offset;
10ad9fe5
DK
1230 return true;
1231 }
1232 else
1233 return false;
1234 }
1235
1236 private:
1237 // Copying is not allowed.
1238 Arm_input_section(const Arm_input_section&);
1239 Arm_input_section& operator=(const Arm_input_section&);
1240
1241 // Address alignment of the original input section.
6625d24e 1242 uint32_t original_addralign_;
10ad9fe5 1243 // Section size of the original input section.
6625d24e 1244 uint32_t original_size_;
10ad9fe5
DK
1245 // Stub table.
1246 Stub_table<big_endian>* stub_table_;
f625ae50
DK
1247 // Original section contents. We have to make a copy here since the file
1248 // containing the original section may not be locked when we need to access
1249 // the contents.
1250 unsigned char* original_contents_;
10ad9fe5
DK
1251};
1252
80d0d023
DK
1253// Arm_exidx_fixup class. This is used to define a number of methods
1254// and keep states for fixing up EXIDX coverage.
1255
1256class Arm_exidx_fixup
1257{
1258 public:
85fdf906
AH
1259 Arm_exidx_fixup(Output_section* exidx_output_section,
1260 bool merge_exidx_entries = true)
80d0d023
DK
1261 : exidx_output_section_(exidx_output_section), last_unwind_type_(UT_NONE),
1262 last_inlined_entry_(0), last_input_section_(NULL),
85fdf906
AH
1263 section_offset_map_(NULL), first_output_text_section_(NULL),
1264 merge_exidx_entries_(merge_exidx_entries)
80d0d023
DK
1265 { }
1266
1267 ~Arm_exidx_fixup()
1268 { delete this->section_offset_map_; }
1269
f625ae50
DK
1270 // Process an EXIDX section for entry merging. SECTION_CONTENTS points
1271 // to the EXIDX contents and SECTION_SIZE is the size of the contents. Return
1272 // number of bytes to be deleted in output. If parts of the input EXIDX
1273 // section are merged a heap allocated Arm_exidx_section_offset_map is store
1274 // in the located PSECTION_OFFSET_MAP. The caller owns the map and is
9b547ce6 1275 // responsible for releasing it.
80d0d023
DK
1276 template<bool big_endian>
1277 uint32_t
1278 process_exidx_section(const Arm_exidx_input_section* exidx_input_section,
f625ae50
DK
1279 const unsigned char* section_contents,
1280 section_size_type section_size,
80d0d023 1281 Arm_exidx_section_offset_map** psection_offset_map);
2e702c99 1282
80d0d023
DK
1283 // Append an EXIDX_CANTUNWIND entry pointing at the end of the last
1284 // input section, if there is not one already.
1285 void
1286 add_exidx_cantunwind_as_needed();
1287
546c7457
DK
1288 // Return the output section for the text section which is linked to the
1289 // first exidx input in output.
1290 Output_section*
1291 first_output_text_section() const
1292 { return this->first_output_text_section_; }
1293
80d0d023
DK
1294 private:
1295 // Copying is not allowed.
1296 Arm_exidx_fixup(const Arm_exidx_fixup&);
1297 Arm_exidx_fixup& operator=(const Arm_exidx_fixup&);
1298
1299 // Type of EXIDX unwind entry.
1300 enum Unwind_type
1301 {
1302 // No type.
1303 UT_NONE,
1304 // EXIDX_CANTUNWIND.
1305 UT_EXIDX_CANTUNWIND,
1306 // Inlined entry.
1307 UT_INLINED_ENTRY,
1308 // Normal entry.
1309 UT_NORMAL_ENTRY,
1310 };
1311
1312 // Process an EXIDX entry. We only care about the second word of the
1313 // entry. Return true if the entry can be deleted.
1314 bool
1315 process_exidx_entry(uint32_t second_word);
1316
1317 // Update the current section offset map during EXIDX section fix-up.
1318 // If there is no map, create one. INPUT_OFFSET is the offset of a
1319 // reference point, DELETED_BYTES is the number of deleted by in the
1320 // section so far. If DELETE_ENTRY is true, the reference point and
1321 // all offsets after the previous reference point are discarded.
1322 void
1323 update_offset_map(section_offset_type input_offset,
1324 section_size_type deleted_bytes, bool delete_entry);
1325
1326 // EXIDX output section.
1327 Output_section* exidx_output_section_;
1328 // Unwind type of the last EXIDX entry processed.
1329 Unwind_type last_unwind_type_;
1330 // Last seen inlined EXIDX entry.
1331 uint32_t last_inlined_entry_;
1332 // Last processed EXIDX input section.
2b328d4e 1333 const Arm_exidx_input_section* last_input_section_;
80d0d023
DK
1334 // Section offset map created in process_exidx_section.
1335 Arm_exidx_section_offset_map* section_offset_map_;
546c7457
DK
1336 // Output section for the text section which is linked to the first exidx
1337 // input in output.
1338 Output_section* first_output_text_section_;
85fdf906
AH
1339
1340 bool merge_exidx_entries_;
80d0d023
DK
1341};
1342
07f508a2
DK
1343// Arm output section class. This is defined mainly to add a number of
1344// stub generation methods.
1345
1346template<bool big_endian>
1347class Arm_output_section : public Output_section
1348{
1349 public:
2b328d4e
DK
1350 typedef std::vector<std::pair<Relobj*, unsigned int> > Text_section_list;
1351
c87e4302 1352 // We need to force SHF_LINK_ORDER in a SHT_ARM_EXIDX section.
2ea97941
ILT
1353 Arm_output_section(const char* name, elfcpp::Elf_Word type,
1354 elfcpp::Elf_Xword flags)
c87e4302
DK
1355 : Output_section(name, type,
1356 (type == elfcpp::SHT_ARM_EXIDX
1357 ? flags | elfcpp::SHF_LINK_ORDER
1358 : flags))
131687b4
DK
1359 {
1360 if (type == elfcpp::SHT_ARM_EXIDX)
1361 this->set_always_keeps_input_sections();
1362 }
07f508a2
DK
1363
1364 ~Arm_output_section()
1365 { }
2e702c99 1366
07f508a2
DK
1367 // Group input sections for stub generation.
1368 void
f625ae50 1369 group_sections(section_size_type, bool, Target_arm<big_endian>*, const Task*);
07f508a2
DK
1370
1371 // Downcast a base pointer to an Arm_output_section pointer. This is
1372 // not type-safe but we only use Arm_output_section not the base class.
1373 static Arm_output_section<big_endian>*
1374 as_arm_output_section(Output_section* os)
1375 { return static_cast<Arm_output_section<big_endian>*>(os); }
1376
2b328d4e
DK
1377 // Append all input text sections in this into LIST.
1378 void
1379 append_text_sections_to_list(Text_section_list* list);
1380
1381 // Fix EXIDX coverage of this EXIDX output section. SORTED_TEXT_SECTION
1382 // is a list of text input sections sorted in ascending order of their
1383 // output addresses.
1384 void
4a54abbb
DK
1385 fix_exidx_coverage(Layout* layout,
1386 const Text_section_list& sorted_text_section,
85fdf906 1387 Symbol_table* symtab,
f625ae50
DK
1388 bool merge_exidx_entries,
1389 const Task* task);
2b328d4e 1390
131687b4
DK
1391 // Link an EXIDX section into its corresponding text section.
1392 void
1393 set_exidx_section_link();
1394
07f508a2
DK
1395 private:
1396 // For convenience.
1397 typedef Output_section::Input_section Input_section;
1398 typedef Output_section::Input_section_list Input_section_list;
1399
1400 // Create a stub group.
1401 void create_stub_group(Input_section_list::const_iterator,
1402 Input_section_list::const_iterator,
1403 Input_section_list::const_iterator,
1404 Target_arm<big_endian>*,
f625ae50
DK
1405 std::vector<Output_relaxed_input_section*>*,
1406 const Task* task);
07f508a2
DK
1407};
1408
993d07c1
DK
1409// Arm_exidx_input_section class. This represents an EXIDX input section.
1410
1411class Arm_exidx_input_section
1412{
1413 public:
1414 static const section_offset_type invalid_offset =
1415 static_cast<section_offset_type>(-1);
1416
1417 Arm_exidx_input_section(Relobj* relobj, unsigned int shndx,
f625ae50
DK
1418 unsigned int link, uint32_t size,
1419 uint32_t addralign, uint32_t text_size)
993d07c1 1420 : relobj_(relobj), shndx_(shndx), link_(link), size_(size),
f625ae50 1421 addralign_(addralign), text_size_(text_size), has_errors_(false)
993d07c1
DK
1422 { }
1423
1424 ~Arm_exidx_input_section()
1425 { }
2e702c99 1426
993d07c1
DK
1427 // Accessors: This is a read-only class.
1428
1429 // Return the object containing this EXIDX input section.
1430 Relobj*
1431 relobj() const
1432 { return this->relobj_; }
1433
1434 // Return the section index of this EXIDX input section.
1435 unsigned int
1436 shndx() const
1437 { return this->shndx_; }
1438
1439 // Return the section index of linked text section in the same object.
1440 unsigned int
1441 link() const
1442 { return this->link_; }
1443
1444 // Return size of the EXIDX input section.
1445 uint32_t
1446 size() const
1447 { return this->size_; }
1448
f625ae50 1449 // Return address alignment of EXIDX input section.
993d07c1
DK
1450 uint32_t
1451 addralign() const
1452 { return this->addralign_; }
1453
f625ae50
DK
1454 // Return size of the associated text input section.
1455 uint32_t
1456 text_size() const
1457 { return this->text_size_; }
1458
131687b4
DK
1459 // Whether there are any errors in the EXIDX input section.
1460 bool
1461 has_errors() const
1462 { return this->has_errors_; }
1463
1464 // Set has-errors flag.
1465 void
1466 set_has_errors()
1467 { this->has_errors_ = true; }
1468
993d07c1
DK
1469 private:
1470 // Object containing this.
1471 Relobj* relobj_;
1472 // Section index of this.
1473 unsigned int shndx_;
1474 // text section linked to this in the same object.
1475 unsigned int link_;
1476 // Size of this. For ARM 32-bit is sufficient.
1477 uint32_t size_;
1478 // Address alignment of this. For ARM 32-bit is sufficient.
1479 uint32_t addralign_;
f625ae50
DK
1480 // Size of associated text section.
1481 uint32_t text_size_;
131687b4
DK
1482 // Whether this has any errors.
1483 bool has_errors_;
993d07c1
DK
1484};
1485
8ffa3667
DK
1486// Arm_relobj class.
1487
1488template<bool big_endian>
6fa2a40b 1489class Arm_relobj : public Sized_relobj_file<32, big_endian>
8ffa3667
DK
1490{
1491 public:
1492 static const Arm_address invalid_address = static_cast<Arm_address>(-1);
1493
2ea97941 1494 Arm_relobj(const std::string& name, Input_file* input_file, off_t offset,
2e702c99 1495 const typename elfcpp::Ehdr<32, big_endian>& ehdr)
6fa2a40b 1496 : Sized_relobj_file<32, big_endian>(name, input_file, offset, ehdr),
a0351a69 1497 stub_tables_(), local_symbol_is_thumb_function_(),
20138696 1498 attributes_section_data_(NULL), mapping_symbols_info_(),
e7eca48c 1499 section_has_cortex_a8_workaround_(NULL), exidx_section_map_(),
7296d933
DK
1500 output_local_symbol_count_needs_update_(false),
1501 merge_flags_and_attributes_(true)
8ffa3667
DK
1502 { }
1503
1504 ~Arm_relobj()
a0351a69 1505 { delete this->attributes_section_data_; }
2e702c99 1506
8ffa3667
DK
1507 // Return the stub table of the SHNDX-th section if there is one.
1508 Stub_table<big_endian>*
2ea97941 1509 stub_table(unsigned int shndx) const
8ffa3667 1510 {
2ea97941
ILT
1511 gold_assert(shndx < this->stub_tables_.size());
1512 return this->stub_tables_[shndx];
8ffa3667
DK
1513 }
1514
1515 // Set STUB_TABLE to be the stub_table of the SHNDX-th section.
1516 void
2ea97941 1517 set_stub_table(unsigned int shndx, Stub_table<big_endian>* stub_table)
8ffa3667 1518 {
2ea97941
ILT
1519 gold_assert(shndx < this->stub_tables_.size());
1520 this->stub_tables_[shndx] = stub_table;
8ffa3667
DK
1521 }
1522
1523 // Whether a local symbol is a THUMB function. R_SYM is the symbol table
1524 // index. This is only valid after do_count_local_symbol is called.
1525 bool
1526 local_symbol_is_thumb_function(unsigned int r_sym) const
1527 {
1528 gold_assert(r_sym < this->local_symbol_is_thumb_function_.size());
1529 return this->local_symbol_is_thumb_function_[r_sym];
1530 }
2e702c99 1531
8ffa3667
DK
1532 // Scan all relocation sections for stub generation.
1533 void
1534 scan_sections_for_stubs(Target_arm<big_endian>*, const Symbol_table*,
1535 const Layout*);
1536
1537 // Convert regular input section with index SHNDX to a relaxed section.
1538 void
2ea97941 1539 convert_input_section_to_relaxed_section(unsigned shndx)
8ffa3667
DK
1540 {
1541 // The stubs have relocations and we need to process them after writing
1542 // out the stubs. So relocation now must follow section write.
2b328d4e 1543 this->set_section_offset(shndx, -1ULL);
8ffa3667
DK
1544 this->set_relocs_must_follow_section_writes();
1545 }
1546
1547 // Downcast a base pointer to an Arm_relobj pointer. This is
1548 // not type-safe but we only use Arm_relobj not the base class.
1549 static Arm_relobj<big_endian>*
2ea97941
ILT
1550 as_arm_relobj(Relobj* relobj)
1551 { return static_cast<Arm_relobj<big_endian>*>(relobj); }
8ffa3667 1552
d5b40221
DK
1553 // Processor-specific flags in ELF file header. This is valid only after
1554 // reading symbols.
1555 elfcpp::Elf_Word
1556 processor_specific_flags() const
1557 { return this->processor_specific_flags_; }
1558
a0351a69
DK
1559 // Attribute section data This is the contents of the .ARM.attribute section
1560 // if there is one.
1561 const Attributes_section_data*
1562 attributes_section_data() const
1563 { return this->attributes_section_data_; }
1564
20138696
DK
1565 // Mapping symbol location.
1566 typedef std::pair<unsigned int, Arm_address> Mapping_symbol_position;
1567
1568 // Functor for STL container.
1569 struct Mapping_symbol_position_less
1570 {
1571 bool
1572 operator()(const Mapping_symbol_position& p1,
1573 const Mapping_symbol_position& p2) const
1574 {
1575 return (p1.first < p2.first
1576 || (p1.first == p2.first && p1.second < p2.second));
1577 }
1578 };
2e702c99 1579
20138696
DK
1580 // We only care about the first character of a mapping symbol, so
1581 // we only store that instead of the whole symbol name.
1582 typedef std::map<Mapping_symbol_position, char,
1583 Mapping_symbol_position_less> Mapping_symbols_info;
1584
2fb7225c
DK
1585 // Whether a section contains any Cortex-A8 workaround.
1586 bool
1587 section_has_cortex_a8_workaround(unsigned int shndx) const
2e702c99 1588 {
2fb7225c
DK
1589 return (this->section_has_cortex_a8_workaround_ != NULL
1590 && (*this->section_has_cortex_a8_workaround_)[shndx]);
1591 }
2e702c99 1592
2fb7225c
DK
1593 // Mark a section that has Cortex-A8 workaround.
1594 void
1595 mark_section_for_cortex_a8_workaround(unsigned int shndx)
1596 {
1597 if (this->section_has_cortex_a8_workaround_ == NULL)
1598 this->section_has_cortex_a8_workaround_ =
1599 new std::vector<bool>(this->shnum(), false);
1600 (*this->section_has_cortex_a8_workaround_)[shndx] = true;
1601 }
1602
993d07c1
DK
1603 // Return the EXIDX section of an text section with index SHNDX or NULL
1604 // if the text section has no associated EXIDX section.
1605 const Arm_exidx_input_section*
1606 exidx_input_section_by_link(unsigned int shndx) const
1607 {
1608 Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1609 return ((p != this->exidx_section_map_.end()
1610 && p->second->link() == shndx)
1611 ? p->second
1612 : NULL);
1613 }
1614
1615 // Return the EXIDX section with index SHNDX or NULL if there is none.
1616 const Arm_exidx_input_section*
1617 exidx_input_section_by_shndx(unsigned shndx) const
1618 {
1619 Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1620 return ((p != this->exidx_section_map_.end()
1621 && p->second->shndx() == shndx)
1622 ? p->second
1623 : NULL);
1624 }
1625
e7eca48c
DK
1626 // Whether output local symbol count needs updating.
1627 bool
1628 output_local_symbol_count_needs_update() const
1629 { return this->output_local_symbol_count_needs_update_; }
1630
1631 // Set output_local_symbol_count_needs_update flag to be true.
1632 void
1633 set_output_local_symbol_count_needs_update()
1634 { this->output_local_symbol_count_needs_update_ = true; }
2e702c99 1635
e7eca48c
DK
1636 // Update output local symbol count at the end of relaxation.
1637 void
1638 update_output_local_symbol_count();
1639
7296d933
DK
1640 // Whether we want to merge processor-specific flags and attributes.
1641 bool
1642 merge_flags_and_attributes() const
1643 { return this->merge_flags_and_attributes_; }
2e702c99 1644
131687b4
DK
1645 // Export list of EXIDX section indices.
1646 void
1647 get_exidx_shndx_list(std::vector<unsigned int>* list) const
1648 {
1649 list->clear();
1650 for (Exidx_section_map::const_iterator p = this->exidx_section_map_.begin();
1651 p != this->exidx_section_map_.end();
1652 ++p)
1653 {
1654 if (p->second->shndx() == p->first)
1655 list->push_back(p->first);
1656 }
2e702c99 1657 // Sort list to make result independent of implementation of map.
131687b4
DK
1658 std::sort(list->begin(), list->end());
1659 }
1660
8ffa3667
DK
1661 protected:
1662 // Post constructor setup.
1663 void
1664 do_setup()
1665 {
1666 // Call parent's setup method.
6fa2a40b 1667 Sized_relobj_file<32, big_endian>::do_setup();
8ffa3667
DK
1668
1669 // Initialize look-up tables.
1670 Stub_table_list empty_stub_table_list(this->shnum(), NULL);
1671 this->stub_tables_.swap(empty_stub_table_list);
1672 }
1673
1674 // Count the local symbols.
1675 void
1676 do_count_local_symbols(Stringpool_template<char>*,
2e702c99 1677 Stringpool_template<char>*);
8ffa3667
DK
1678
1679 void
6fa2a40b
CC
1680 do_relocate_sections(
1681 const Symbol_table* symtab, const Layout* layout,
1682 const unsigned char* pshdrs, Output_file* of,
1683 typename Sized_relobj_file<32, big_endian>::Views* pivews);
8ffa3667 1684
d5b40221
DK
1685 // Read the symbol information.
1686 void
1687 do_read_symbols(Read_symbols_data* sd);
1688
99e5bff2
DK
1689 // Process relocs for garbage collection.
1690 void
1691 do_gc_process_relocs(Symbol_table*, Layout*, Read_relocs_data*);
1692
8ffa3667 1693 private:
44272192
DK
1694
1695 // Whether a section needs to be scanned for relocation stubs.
1696 bool
1697 section_needs_reloc_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1698 const Relobj::Output_sections&,
ca09d69a 1699 const Symbol_table*, const unsigned char*);
44272192 1700
cf846138
DK
1701 // Whether a section is a scannable text section.
1702 bool
1703 section_is_scannable(const elfcpp::Shdr<32, big_endian>&, unsigned int,
ca09d69a 1704 const Output_section*, const Symbol_table*);
cf846138 1705
44272192
DK
1706 // Whether a section needs to be scanned for the Cortex-A8 erratum.
1707 bool
1708 section_needs_cortex_a8_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1709 unsigned int, Output_section*,
ca09d69a 1710 const Symbol_table*);
44272192
DK
1711
1712 // Scan a section for the Cortex-A8 erratum.
1713 void
1714 scan_section_for_cortex_a8_erratum(const elfcpp::Shdr<32, big_endian>&,
1715 unsigned int, Output_section*,
1716 Target_arm<big_endian>*);
1717
c8761b9a 1718 // Find the linked text section of an EXIDX section by looking at the
9b547ce6 1719 // first relocation of the EXIDX section. PSHDR points to the section
c8761b9a
DK
1720 // headers of a relocation section and PSYMS points to the local symbols.
1721 // PSHNDX points to a location storing the text section index if found.
1722 // Return whether we can find the linked section.
1723 bool
1724 find_linked_text_section(const unsigned char* pshdr,
1725 const unsigned char* psyms, unsigned int* pshndx);
1726
1727 //
993d07c1 1728 // Make a new Arm_exidx_input_section object for EXIDX section with
c8761b9a
DK
1729 // index SHNDX and section header SHDR. TEXT_SHNDX is the section
1730 // index of the linked text section.
993d07c1
DK
1731 void
1732 make_exidx_input_section(unsigned int shndx,
c8761b9a 1733 const elfcpp::Shdr<32, big_endian>& shdr,
131687b4
DK
1734 unsigned int text_shndx,
1735 const elfcpp::Shdr<32, big_endian>& text_shdr);
993d07c1 1736
cb1be87e
DK
1737 // Return the output address of either a plain input section or a
1738 // relaxed input section. SHNDX is the section index.
1739 Arm_address
1740 simple_input_section_output_address(unsigned int, Output_section*);
1741
8ffa3667 1742 typedef std::vector<Stub_table<big_endian>*> Stub_table_list;
993d07c1
DK
1743 typedef Unordered_map<unsigned int, const Arm_exidx_input_section*>
1744 Exidx_section_map;
1745
1746 // List of stub tables.
8ffa3667
DK
1747 Stub_table_list stub_tables_;
1748 // Bit vector to tell if a local symbol is a thumb function or not.
1749 // This is only valid after do_count_local_symbol is called.
1750 std::vector<bool> local_symbol_is_thumb_function_;
d5b40221
DK
1751 // processor-specific flags in ELF file header.
1752 elfcpp::Elf_Word processor_specific_flags_;
a0351a69
DK
1753 // Object attributes if there is an .ARM.attributes section or NULL.
1754 Attributes_section_data* attributes_section_data_;
20138696
DK
1755 // Mapping symbols information.
1756 Mapping_symbols_info mapping_symbols_info_;
2fb7225c
DK
1757 // Bitmap to indicate sections with Cortex-A8 workaround or NULL.
1758 std::vector<bool>* section_has_cortex_a8_workaround_;
993d07c1
DK
1759 // Map a text section to its associated .ARM.exidx section, if there is one.
1760 Exidx_section_map exidx_section_map_;
e7eca48c
DK
1761 // Whether output local symbol count needs updating.
1762 bool output_local_symbol_count_needs_update_;
7296d933
DK
1763 // Whether we merge processor flags and attributes of this object to
1764 // output.
1765 bool merge_flags_and_attributes_;
d5b40221
DK
1766};
1767
1768// Arm_dynobj class.
1769
1770template<bool big_endian>
1771class Arm_dynobj : public Sized_dynobj<32, big_endian>
1772{
1773 public:
2ea97941 1774 Arm_dynobj(const std::string& name, Input_file* input_file, off_t offset,
d5b40221 1775 const elfcpp::Ehdr<32, big_endian>& ehdr)
2ea97941
ILT
1776 : Sized_dynobj<32, big_endian>(name, input_file, offset, ehdr),
1777 processor_specific_flags_(0), attributes_section_data_(NULL)
d5b40221 1778 { }
2e702c99 1779
d5b40221 1780 ~Arm_dynobj()
a0351a69 1781 { delete this->attributes_section_data_; }
d5b40221
DK
1782
1783 // Downcast a base pointer to an Arm_relobj pointer. This is
1784 // not type-safe but we only use Arm_relobj not the base class.
1785 static Arm_dynobj<big_endian>*
1786 as_arm_dynobj(Dynobj* dynobj)
1787 { return static_cast<Arm_dynobj<big_endian>*>(dynobj); }
1788
1789 // Processor-specific flags in ELF file header. This is valid only after
1790 // reading symbols.
1791 elfcpp::Elf_Word
1792 processor_specific_flags() const
1793 { return this->processor_specific_flags_; }
1794
a0351a69
DK
1795 // Attributes section data.
1796 const Attributes_section_data*
1797 attributes_section_data() const
1798 { return this->attributes_section_data_; }
1799
d5b40221
DK
1800 protected:
1801 // Read the symbol information.
1802 void
1803 do_read_symbols(Read_symbols_data* sd);
1804
1805 private:
1806 // processor-specific flags in ELF file header.
1807 elfcpp::Elf_Word processor_specific_flags_;
a0351a69
DK
1808 // Object attributes if there is an .ARM.attributes section or NULL.
1809 Attributes_section_data* attributes_section_data_;
8ffa3667
DK
1810};
1811
e9bbb538
DK
1812// Functor to read reloc addends during stub generation.
1813
1814template<int sh_type, bool big_endian>
1815struct Stub_addend_reader
1816{
1817 // Return the addend for a relocation of a particular type. Depending
1818 // on whether this is a REL or RELA relocation, read the addend from a
1819 // view or from a Reloc object.
1820 elfcpp::Elf_types<32>::Elf_Swxword
1821 operator()(
1822 unsigned int /* r_type */,
1823 const unsigned char* /* view */,
1824 const typename Reloc_types<sh_type,
ebd95253 1825 32, big_endian>::Reloc& /* reloc */) const;
e9bbb538
DK
1826};
1827
1828// Specialized Stub_addend_reader for SHT_REL type relocation sections.
1829
1830template<bool big_endian>
1831struct Stub_addend_reader<elfcpp::SHT_REL, big_endian>
1832{
1833 elfcpp::Elf_types<32>::Elf_Swxword
1834 operator()(
1835 unsigned int,
1836 const unsigned char*,
1837 const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const;
1838};
1839
1840// Specialized Stub_addend_reader for RELA type relocation sections.
1841// We currently do not handle RELA type relocation sections but it is trivial
1842// to implement the addend reader. This is provided for completeness and to
1843// make it easier to add support for RELA relocation sections in the future.
1844
1845template<bool big_endian>
1846struct Stub_addend_reader<elfcpp::SHT_RELA, big_endian>
1847{
1848 elfcpp::Elf_types<32>::Elf_Swxword
1849 operator()(
1850 unsigned int,
1851 const unsigned char*,
1852 const typename Reloc_types<elfcpp::SHT_RELA, 32,
ebd95253
DK
1853 big_endian>::Reloc& reloc) const
1854 { return reloc.get_r_addend(); }
e9bbb538
DK
1855};
1856
a120bc7f
DK
1857// Cortex_a8_reloc class. We keep record of relocation that may need
1858// the Cortex-A8 erratum workaround.
1859
1860class Cortex_a8_reloc
1861{
1862 public:
1863 Cortex_a8_reloc(Reloc_stub* reloc_stub, unsigned r_type,
1864 Arm_address destination)
1865 : reloc_stub_(reloc_stub), r_type_(r_type), destination_(destination)
1866 { }
1867
1868 ~Cortex_a8_reloc()
1869 { }
1870
1871 // Accessors: This is a read-only class.
2e702c99 1872
a120bc7f
DK
1873 // Return the relocation stub associated with this relocation if there is
1874 // one.
1875 const Reloc_stub*
1876 reloc_stub() const
2e702c99
RM
1877 { return this->reloc_stub_; }
1878
a120bc7f
DK
1879 // Return the relocation type.
1880 unsigned int
1881 r_type() const
1882 { return this->r_type_; }
1883
1884 // Return the destination address of the relocation. LSB stores the THUMB
1885 // bit.
1886 Arm_address
1887 destination() const
1888 { return this->destination_; }
1889
1890 private:
1891 // Associated relocation stub if there is one, or NULL.
1892 const Reloc_stub* reloc_stub_;
1893 // Relocation type.
1894 unsigned int r_type_;
1895 // Destination address of this relocation. LSB is used to distinguish
1896 // ARM/THUMB mode.
1897 Arm_address destination_;
1898};
1899
4a54abbb
DK
1900// Arm_output_data_got class. We derive this from Output_data_got to add
1901// extra methods to handle TLS relocations in a static link.
1902
1903template<bool big_endian>
1904class Arm_output_data_got : public Output_data_got<32, big_endian>
1905{
1906 public:
1907 Arm_output_data_got(Symbol_table* symtab, Layout* layout)
1908 : Output_data_got<32, big_endian>(), symbol_table_(symtab), layout_(layout)
1909 { }
1910
1911 // Add a static entry for the GOT entry at OFFSET. GSYM is a global
1912 // symbol and R_TYPE is the code of a dynamic relocation that needs to be
1913 // applied in a static link.
1914 void
1915 add_static_reloc(unsigned int got_offset, unsigned int r_type, Symbol* gsym)
1916 { this->static_relocs_.push_back(Static_reloc(got_offset, r_type, gsym)); }
1917
1918 // Add a static reloc for the GOT entry at OFFSET. RELOBJ is an object
1919 // defining a local symbol with INDEX. R_TYPE is the code of a dynamic
1920 // relocation that needs to be applied in a static link.
1921 void
1922 add_static_reloc(unsigned int got_offset, unsigned int r_type,
6fa2a40b
CC
1923 Sized_relobj_file<32, big_endian>* relobj,
1924 unsigned int index)
4a54abbb
DK
1925 {
1926 this->static_relocs_.push_back(Static_reloc(got_offset, r_type, relobj,
1927 index));
1928 }
1929
1930 // Add a GOT pair for R_ARM_TLS_GD32. The creates a pair of GOT entries.
1931 // The first one is initialized to be 1, which is the module index for
1932 // the main executable and the second one 0. A reloc of the type
1933 // R_ARM_TLS_DTPOFF32 will be created for the second GOT entry and will
1934 // be applied by gold. GSYM is a global symbol.
1935 void
1936 add_tls_gd32_with_static_reloc(unsigned int got_type, Symbol* gsym);
1937
1938 // Same as the above but for a local symbol in OBJECT with INDEX.
1939 void
1940 add_tls_gd32_with_static_reloc(unsigned int got_type,
6fa2a40b 1941 Sized_relobj_file<32, big_endian>* object,
4a54abbb
DK
1942 unsigned int index);
1943
1944 protected:
1945 // Write out the GOT table.
1946 void
1947 do_write(Output_file*);
1948
1949 private:
1950 // This class represent dynamic relocations that need to be applied by
1951 // gold because we are using TLS relocations in a static link.
1952 class Static_reloc
1953 {
1954 public:
1955 Static_reloc(unsigned int got_offset, unsigned int r_type, Symbol* gsym)
1956 : got_offset_(got_offset), r_type_(r_type), symbol_is_global_(true)
1957 { this->u_.global.symbol = gsym; }
1958
1959 Static_reloc(unsigned int got_offset, unsigned int r_type,
6fa2a40b 1960 Sized_relobj_file<32, big_endian>* relobj, unsigned int index)
4a54abbb
DK
1961 : got_offset_(got_offset), r_type_(r_type), symbol_is_global_(false)
1962 {
1963 this->u_.local.relobj = relobj;
1964 this->u_.local.index = index;
1965 }
1966
1967 // Return the GOT offset.
1968 unsigned int
1969 got_offset() const
1970 { return this->got_offset_; }
1971
1972 // Relocation type.
1973 unsigned int
1974 r_type() const
1975 { return this->r_type_; }
1976
1977 // Whether the symbol is global or not.
1978 bool
1979 symbol_is_global() const
1980 { return this->symbol_is_global_; }
1981
1982 // For a relocation against a global symbol, the global symbol.
1983 Symbol*
1984 symbol() const
1985 {
1986 gold_assert(this->symbol_is_global_);
1987 return this->u_.global.symbol;
1988 }
1989
1990 // For a relocation against a local symbol, the defining object.
6fa2a40b 1991 Sized_relobj_file<32, big_endian>*
4a54abbb
DK
1992 relobj() const
1993 {
1994 gold_assert(!this->symbol_is_global_);
1995 return this->u_.local.relobj;
1996 }
1997
1998 // For a relocation against a local symbol, the local symbol index.
1999 unsigned int
2000 index() const
2001 {
2002 gold_assert(!this->symbol_is_global_);
2003 return this->u_.local.index;
2004 }
2005
2006 private:
2007 // GOT offset of the entry to which this relocation is applied.
2008 unsigned int got_offset_;
2009 // Type of relocation.
2010 unsigned int r_type_;
2011 // Whether this relocation is against a global symbol.
2012 bool symbol_is_global_;
2013 // A global or local symbol.
2014 union
2015 {
2016 struct
2017 {
2018 // For a global symbol, the symbol itself.
2019 Symbol* symbol;
2020 } global;
2021 struct
2022 {
2023 // For a local symbol, the object defining object.
6fa2a40b 2024 Sized_relobj_file<32, big_endian>* relobj;
4a54abbb
DK
2025 // For a local symbol, the symbol index.
2026 unsigned int index;
2027 } local;
2028 } u_;
2029 };
2030
2031 // Symbol table of the output object.
2032 Symbol_table* symbol_table_;
2033 // Layout of the output object.
2034 Layout* layout_;
2035 // Static relocs to be applied to the GOT.
2036 std::vector<Static_reloc> static_relocs_;
2037};
2038
9b547ce6 2039// The ARM target has many relocation types with odd-sizes or noncontiguous
5c388529
DK
2040// bits. The default handling of relocatable relocation cannot process these
2041// relocations. So we have to extend the default code.
2042
2043template<bool big_endian, int sh_type, typename Classify_reloc>
2044class Arm_scan_relocatable_relocs :
2045 public Default_scan_relocatable_relocs<sh_type, Classify_reloc>
2046{
2047 public:
2048 // Return the strategy to use for a local symbol which is a section
2049 // symbol, given the relocation type.
2050 inline Relocatable_relocs::Reloc_strategy
2051 local_section_strategy(unsigned int r_type, Relobj*)
2052 {
2053 if (sh_type == elfcpp::SHT_RELA)
2054 return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_RELA;
2055 else
2056 {
2057 if (r_type == elfcpp::R_ARM_TARGET1
2058 || r_type == elfcpp::R_ARM_TARGET2)
2059 {
2060 const Target_arm<big_endian>* arm_target =
2061 Target_arm<big_endian>::default_target();
2062 r_type = arm_target->get_real_reloc_type(r_type);
2063 }
2064
2065 switch(r_type)
2066 {
2067 // Relocations that write nothing. These exclude R_ARM_TARGET1
2068 // and R_ARM_TARGET2.
2069 case elfcpp::R_ARM_NONE:
2070 case elfcpp::R_ARM_V4BX:
2071 case elfcpp::R_ARM_TLS_GOTDESC:
2072 case elfcpp::R_ARM_TLS_CALL:
2073 case elfcpp::R_ARM_TLS_DESCSEQ:
2074 case elfcpp::R_ARM_THM_TLS_CALL:
2075 case elfcpp::R_ARM_GOTRELAX:
2076 case elfcpp::R_ARM_GNU_VTENTRY:
2077 case elfcpp::R_ARM_GNU_VTINHERIT:
2078 case elfcpp::R_ARM_THM_TLS_DESCSEQ16:
2079 case elfcpp::R_ARM_THM_TLS_DESCSEQ32:
2080 return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_0;
2081 // These should have been converted to something else above.
2082 case elfcpp::R_ARM_TARGET1:
2083 case elfcpp::R_ARM_TARGET2:
2084 gold_unreachable();
2c339f71 2085 // Relocations that write full 32 bits and
2e702c99 2086 // have alignment of 1.
5c388529
DK
2087 case elfcpp::R_ARM_ABS32:
2088 case elfcpp::R_ARM_REL32:
2089 case elfcpp::R_ARM_SBREL32:
2090 case elfcpp::R_ARM_GOTOFF32:
2091 case elfcpp::R_ARM_BASE_PREL:
2092 case elfcpp::R_ARM_GOT_BREL:
2093 case elfcpp::R_ARM_BASE_ABS:
2094 case elfcpp::R_ARM_ABS32_NOI:
2095 case elfcpp::R_ARM_REL32_NOI:
2096 case elfcpp::R_ARM_PLT32_ABS:
2097 case elfcpp::R_ARM_GOT_ABS:
2098 case elfcpp::R_ARM_GOT_PREL:
2099 case elfcpp::R_ARM_TLS_GD32:
2100 case elfcpp::R_ARM_TLS_LDM32:
2101 case elfcpp::R_ARM_TLS_LDO32:
2102 case elfcpp::R_ARM_TLS_IE32:
2103 case elfcpp::R_ARM_TLS_LE32:
2c339f71 2104 return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_4_UNALIGNED;
5c388529
DK
2105 default:
2106 // For all other static relocations, return RELOC_SPECIAL.
2107 return Relocatable_relocs::RELOC_SPECIAL;
2108 }
2109 }
2110 }
2111};
2112
4a657b0d
DK
2113template<bool big_endian>
2114class Target_arm : public Sized_target<32, big_endian>
2115{
2116 public:
2117 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
2118 Reloc_section;
2119
2daedcd6
DK
2120 // When were are relocating a stub, we pass this as the relocation number.
2121 static const size_t fake_relnum_for_stubs = static_cast<size_t>(-1);
2122
2e702c99
RM
2123 Target_arm(const Target::Target_info* info = &arm_info)
2124 : Sized_target<32, big_endian>(info),
fa89cc82
HS
2125 got_(NULL), plt_(NULL), got_plt_(NULL), got_irelative_(NULL),
2126 rel_dyn_(NULL), rel_irelative_(NULL), copy_relocs_(elfcpp::R_ARM_COPY),
f96accdf
DK
2127 got_mod_index_offset_(-1U), tls_base_symbol_defined_(false),
2128 stub_tables_(), stub_factory_(Stub_factory::get_instance()),
cd6eab1c 2129 should_force_pic_veneer_(false),
f96accdf
DK
2130 arm_input_section_map_(), attributes_section_data_(NULL),
2131 fix_cortex_a8_(false), cortex_a8_relocs_info_()
a6d1ef57 2132 { }
4a657b0d 2133
b569affa
DK
2134 // Whether we force PCI branch veneers.
2135 bool
2136 should_force_pic_veneer() const
2137 { return this->should_force_pic_veneer_; }
2138
2139 // Set PIC veneer flag.
2140 void
2141 set_should_force_pic_veneer(bool value)
2142 { this->should_force_pic_veneer_ = value; }
2e702c99 2143
b569affa
DK
2144 // Whether we use THUMB-2 instructions.
2145 bool
2146 using_thumb2() const
2147 {
a0351a69
DK
2148 Object_attribute* attr =
2149 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2150 int arch = attr->int_value();
2151 return arch == elfcpp::TAG_CPU_ARCH_V6T2 || arch >= elfcpp::TAG_CPU_ARCH_V7;
b569affa
DK
2152 }
2153
2154 // Whether we use THUMB/THUMB-2 instructions only.
2155 bool
2156 using_thumb_only() const
2157 {
a0351a69
DK
2158 Object_attribute* attr =
2159 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
323c532f
DK
2160
2161 if (attr->int_value() == elfcpp::TAG_CPU_ARCH_V6_M
2162 || attr->int_value() == elfcpp::TAG_CPU_ARCH_V6S_M)
2163 return true;
a0351a69
DK
2164 if (attr->int_value() != elfcpp::TAG_CPU_ARCH_V7
2165 && attr->int_value() != elfcpp::TAG_CPU_ARCH_V7E_M)
2166 return false;
2167 attr = this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
2168 return attr->int_value() == 'M';
b569affa
DK
2169 }
2170
d204b6e9
DK
2171 // Whether we have an NOP instruction. If not, use mov r0, r0 instead.
2172 bool
2173 may_use_arm_nop() const
2174 {
a0351a69
DK
2175 Object_attribute* attr =
2176 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2177 int arch = attr->int_value();
2178 return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2179 || arch == elfcpp::TAG_CPU_ARCH_V6K
2180 || arch == elfcpp::TAG_CPU_ARCH_V7
2181 || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
d204b6e9
DK
2182 }
2183
51938283
DK
2184 // Whether we have THUMB-2 NOP.W instruction.
2185 bool
2186 may_use_thumb2_nop() const
2187 {
a0351a69
DK
2188 Object_attribute* attr =
2189 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2190 int arch = attr->int_value();
2191 return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2192 || arch == elfcpp::TAG_CPU_ARCH_V7
2193 || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
51938283 2194 }
cd6eab1c
ILT
2195
2196 // Whether we have v4T interworking instructions available.
2197 bool
2198 may_use_v4t_interworking() const
2199 {
2200 Object_attribute* attr =
2201 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2202 int arch = attr->int_value();
2203 return (arch != elfcpp::TAG_CPU_ARCH_PRE_V4
2204 && arch != elfcpp::TAG_CPU_ARCH_V4);
2205 }
2e702c99 2206
cd6eab1c
ILT
2207 // Whether we have v5T interworking instructions available.
2208 bool
2209 may_use_v5t_interworking() const
2210 {
2211 Object_attribute* attr =
2212 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2213 int arch = attr->int_value();
a8e2273b
ILT
2214 if (parameters->options().fix_arm1176())
2215 return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2216 || arch == elfcpp::TAG_CPU_ARCH_V7
2217 || arch == elfcpp::TAG_CPU_ARCH_V6_M
2218 || arch == elfcpp::TAG_CPU_ARCH_V6S_M
2219 || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
2220 else
2221 return (arch != elfcpp::TAG_CPU_ARCH_PRE_V4
2222 && arch != elfcpp::TAG_CPU_ARCH_V4
2223 && arch != elfcpp::TAG_CPU_ARCH_V4T);
cd6eab1c 2224 }
2e702c99
RM
2225
2226 // Process the relocations to determine unreferenced sections for
4a657b0d
DK
2227 // garbage collection.
2228 void
ad0f2072 2229 gc_process_relocs(Symbol_table* symtab,
4a657b0d 2230 Layout* layout,
6fa2a40b 2231 Sized_relobj_file<32, big_endian>* object,
4a657b0d
DK
2232 unsigned int data_shndx,
2233 unsigned int sh_type,
2234 const unsigned char* prelocs,
2235 size_t reloc_count,
2236 Output_section* output_section,
2237 bool needs_special_offset_handling,
2238 size_t local_symbol_count,
2239 const unsigned char* plocal_symbols);
2240
2241 // Scan the relocations to look for symbol adjustments.
2242 void
ad0f2072 2243 scan_relocs(Symbol_table* symtab,
4a657b0d 2244 Layout* layout,
6fa2a40b 2245 Sized_relobj_file<32, big_endian>* object,
4a657b0d
DK
2246 unsigned int data_shndx,
2247 unsigned int sh_type,
2248 const unsigned char* prelocs,
2249 size_t reloc_count,
2250 Output_section* output_section,
2251 bool needs_special_offset_handling,
2252 size_t local_symbol_count,
2253 const unsigned char* plocal_symbols);
2254
2255 // Finalize the sections.
2256 void
f59f41f3 2257 do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
4a657b0d 2258
94cdfcff 2259 // Return the value to use for a dynamic symbol which requires special
4a657b0d
DK
2260 // treatment.
2261 uint64_t
2262 do_dynsym_value(const Symbol*) const;
2263
fa89cc82
HS
2264 // Return the plt address for globals. Since we have irelative plt entries,
2265 // address calculation is not as straightforward as plt_address + plt_offset.
2266 uint64_t
2267 do_plt_address_for_global(const Symbol* gsym) const
2268 { return this->plt_section()->address_for_global(gsym); }
2269
2270 // Return the plt address for locals. Since we have irelative plt entries,
2271 // address calculation is not as straightforward as plt_address + plt_offset.
2272 uint64_t
2273 do_plt_address_for_local(const Relobj* relobj, unsigned int symndx) const
2274 { return this->plt_section()->address_for_local(relobj, symndx); }
2275
4a657b0d
DK
2276 // Relocate a section.
2277 void
2278 relocate_section(const Relocate_info<32, big_endian>*,
2279 unsigned int sh_type,
2280 const unsigned char* prelocs,
2281 size_t reloc_count,
2282 Output_section* output_section,
2283 bool needs_special_offset_handling,
2284 unsigned char* view,
ebabffbd 2285 Arm_address view_address,
364c7fa5
ILT
2286 section_size_type view_size,
2287 const Reloc_symbol_changes*);
4a657b0d
DK
2288
2289 // Scan the relocs during a relocatable link.
2290 void
ad0f2072 2291 scan_relocatable_relocs(Symbol_table* symtab,
4a657b0d 2292 Layout* layout,
6fa2a40b 2293 Sized_relobj_file<32, big_endian>* object,
4a657b0d
DK
2294 unsigned int data_shndx,
2295 unsigned int sh_type,
2296 const unsigned char* prelocs,
2297 size_t reloc_count,
2298 Output_section* output_section,
2299 bool needs_special_offset_handling,
2300 size_t local_symbol_count,
2301 const unsigned char* plocal_symbols,
2302 Relocatable_relocs*);
2303
7404fe1b 2304 // Emit relocations for a section.
4a657b0d 2305 void
7404fe1b
AM
2306 relocate_relocs(const Relocate_info<32, big_endian>*,
2307 unsigned int sh_type,
2308 const unsigned char* prelocs,
2309 size_t reloc_count,
2310 Output_section* output_section,
62fe925a
RM
2311 typename elfcpp::Elf_types<32>::Elf_Off
2312 offset_in_output_section,
7404fe1b
AM
2313 unsigned char* view,
2314 Arm_address view_address,
2315 section_size_type view_size,
2316 unsigned char* reloc_view,
2317 section_size_type reloc_view_size);
4a657b0d 2318
5c388529
DK
2319 // Perform target-specific processing in a relocatable link. This is
2320 // only used if we use the relocation strategy RELOC_SPECIAL.
2321 void
2322 relocate_special_relocatable(const Relocate_info<32, big_endian>* relinfo,
2323 unsigned int sh_type,
2324 const unsigned char* preloc_in,
2325 size_t relnum,
2326 Output_section* output_section,
62fe925a
RM
2327 typename elfcpp::Elf_types<32>::Elf_Off
2328 offset_in_output_section,
5c388529
DK
2329 unsigned char* view,
2330 typename elfcpp::Elf_types<32>::Elf_Addr
2331 view_address,
2332 section_size_type view_size,
2333 unsigned char* preloc_out);
2e702c99 2334
4a657b0d
DK
2335 // Return whether SYM is defined by the ABI.
2336 bool
2c54b4f4 2337 do_is_defined_by_abi(const Symbol* sym) const
4a657b0d
DK
2338 { return strcmp(sym->name(), "__tls_get_addr") == 0; }
2339
c8761b9a
DK
2340 // Return whether there is a GOT section.
2341 bool
2342 has_got_section() const
2343 { return this->got_ != NULL; }
2344
94cdfcff
DK
2345 // Return the size of the GOT section.
2346 section_size_type
0e70b911 2347 got_size() const
94cdfcff
DK
2348 {
2349 gold_assert(this->got_ != NULL);
2350 return this->got_->data_size();
2351 }
2352
0e70b911
CC
2353 // Return the number of entries in the GOT.
2354 unsigned int
2355 got_entry_count() const
2356 {
2357 if (!this->has_got_section())
2358 return 0;
2359 return this->got_size() / 4;
2360 }
2361
2362 // Return the number of entries in the PLT.
2363 unsigned int
2364 plt_entry_count() const;
2365
2366 // Return the offset of the first non-reserved PLT entry.
2367 unsigned int
2368 first_plt_entry_offset() const;
2369
2370 // Return the size of each PLT entry.
2371 unsigned int
2372 plt_entry_size() const;
2373
fa89cc82
HS
2374 // Get the section to use for IRELATIVE relocations, create it if necessary.
2375 Reloc_section*
2376 rel_irelative_section(Layout*);
2377
4a657b0d 2378 // Map platform-specific reloc types
a6d1ef57 2379 static unsigned int
ca09d69a 2380 get_real_reloc_type(unsigned int r_type);
4a657b0d 2381
55da9579
DK
2382 //
2383 // Methods to support stub-generations.
2384 //
2e702c99 2385
55da9579
DK
2386 // Return the stub factory
2387 const Stub_factory&
2388 stub_factory() const
2389 { return this->stub_factory_; }
2390
2391 // Make a new Arm_input_section object.
2392 Arm_input_section<big_endian>*
2393 new_arm_input_section(Relobj*, unsigned int);
2394
2395 // Find the Arm_input_section object corresponding to the SHNDX-th input
2396 // section of RELOBJ.
2397 Arm_input_section<big_endian>*
2ea97941 2398 find_arm_input_section(Relobj* relobj, unsigned int shndx) const;
55da9579
DK
2399
2400 // Make a new Stub_table
2401 Stub_table<big_endian>*
2402 new_stub_table(Arm_input_section<big_endian>*);
2403
eb44217c
DK
2404 // Scan a section for stub generation.
2405 void
2406 scan_section_for_stubs(const Relocate_info<32, big_endian>*, unsigned int,
2407 const unsigned char*, size_t, Output_section*,
2408 bool, const unsigned char*, Arm_address,
2409 section_size_type);
2410
2e702c99 2411 // Relocate a stub.
43d12afe 2412 void
2fb7225c 2413 relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
43d12afe
DK
2414 Output_section*, unsigned char*, Arm_address,
2415 section_size_type);
2e702c99 2416
b569affa 2417 // Get the default ARM target.
43d12afe 2418 static Target_arm<big_endian>*
b569affa
DK
2419 default_target()
2420 {
2421 gold_assert(parameters->target().machine_code() == elfcpp::EM_ARM
2422 && parameters->target().is_big_endian() == big_endian);
43d12afe
DK
2423 return static_cast<Target_arm<big_endian>*>(
2424 parameters->sized_target<32, big_endian>());
b569affa
DK
2425 }
2426
20138696
DK
2427 // Whether NAME belongs to a mapping symbol.
2428 static bool
2429 is_mapping_symbol_name(const char* name)
2430 {
2431 return (name
2432 && name[0] == '$'
2433 && (name[1] == 'a' || name[1] == 't' || name[1] == 'd')
2434 && (name[2] == '\0' || name[2] == '.'));
2435 }
2436
a120bc7f
DK
2437 // Whether we work around the Cortex-A8 erratum.
2438 bool
2439 fix_cortex_a8() const
2440 { return this->fix_cortex_a8_; }
2441
85fdf906
AH
2442 // Whether we merge exidx entries in debuginfo.
2443 bool
2444 merge_exidx_entries() const
2445 { return parameters->options().merge_exidx_entries(); }
2446
a2162063
ILT
2447 // Whether we fix R_ARM_V4BX relocation.
2448 // 0 - do not fix
2449 // 1 - replace with MOV instruction (armv4 target)
2450 // 2 - make interworking veneer (>= armv4t targets only)
9b2fd367 2451 General_options::Fix_v4bx
a2162063 2452 fix_v4bx() const
9b2fd367 2453 { return parameters->options().fix_v4bx(); }
a2162063 2454
44272192
DK
2455 // Scan a span of THUMB code section for Cortex-A8 erratum.
2456 void
2457 scan_span_for_cortex_a8_erratum(Arm_relobj<big_endian>*, unsigned int,
2458 section_size_type, section_size_type,
2459 const unsigned char*, Arm_address);
2460
41263c05
DK
2461 // Apply Cortex-A8 workaround to a branch.
2462 void
2463 apply_cortex_a8_workaround(const Cortex_a8_stub*, Arm_address,
2464 unsigned char*, Arm_address);
2465
d5b40221 2466 protected:
2e702c99
RM
2467 // Make the PLT-generator object.
2468 Output_data_plt_arm<big_endian>*
fa89cc82
HS
2469 make_data_plt(Layout* layout,
2470 Arm_output_data_got<big_endian>* got,
2471 Output_data_space* got_plt,
2472 Output_data_space* got_irelative)
2473 { return this->do_make_data_plt(layout, got, got_plt, got_irelative); }
2e702c99 2474
eb44217c
DK
2475 // Make an ELF object.
2476 Object*
2477 do_make_elf_object(const std::string&, Input_file*, off_t,
2478 const elfcpp::Ehdr<32, big_endian>& ehdr);
2479
2480 Object*
2481 do_make_elf_object(const std::string&, Input_file*, off_t,
2482 const elfcpp::Ehdr<32, !big_endian>&)
2483 { gold_unreachable(); }
2484
2485 Object*
2486 do_make_elf_object(const std::string&, Input_file*, off_t,
2487 const elfcpp::Ehdr<64, false>&)
2488 { gold_unreachable(); }
2489
2490 Object*
2491 do_make_elf_object(const std::string&, Input_file*, off_t,
2492 const elfcpp::Ehdr<64, true>&)
2493 { gold_unreachable(); }
2494
2495 // Make an output section.
2496 Output_section*
2497 do_make_output_section(const char* name, elfcpp::Elf_Word type,
2498 elfcpp::Elf_Xword flags)
2499 { return new Arm_output_section<big_endian>(name, type, flags); }
2500
d5b40221 2501 void
3bfcb652 2502 do_adjust_elf_header(unsigned char* view, int len);
d5b40221 2503
eb44217c
DK
2504 // We only need to generate stubs, and hence perform relaxation if we are
2505 // not doing relocatable linking.
2506 bool
2507 do_may_relax() const
2508 { return !parameters->options().relocatable(); }
2509
2510 bool
f625ae50 2511 do_relax(int, const Input_objects*, Symbol_table*, Layout*, const Task*);
eb44217c 2512
a0351a69
DK
2513 // Determine whether an object attribute tag takes an integer, a
2514 // string or both.
2515 int
2516 do_attribute_arg_type(int tag) const;
2517
2518 // Reorder tags during output.
2519 int
2520 do_attributes_order(int num) const;
2521
0d31c79d
DK
2522 // This is called when the target is selected as the default.
2523 void
2524 do_select_as_default_target()
2525 {
2526 // No locking is required since there should only be one default target.
2527 // We cannot have both the big-endian and little-endian ARM targets
2528 // as the default.
2529 gold_assert(arm_reloc_property_table == NULL);
2530 arm_reloc_property_table = new Arm_reloc_property_table();
2531 }
2532
b3ce541e
ILT
2533 // Virtual function which is set to return true by a target if
2534 // it can use relocation types to determine if a function's
2535 // pointer is taken.
2536 virtual bool
2537 do_can_check_for_function_pointers() const
2538 { return true; }
2539
2540 // Whether a section called SECTION_NAME may have function pointers to
2541 // sections not eligible for safe ICF folding.
2542 virtual bool
2543 do_section_may_have_icf_unsafe_pointers(const char* section_name) const
2544 {
2545 return (!is_prefix_of(".ARM.exidx", section_name)
2546 && !is_prefix_of(".ARM.extab", section_name)
2547 && Target::do_section_may_have_icf_unsafe_pointers(section_name));
2548 }
2e702c99 2549
647f1574
DK
2550 virtual void
2551 do_define_standard_symbols(Symbol_table*, Layout*);
2552
2e702c99 2553 virtual Output_data_plt_arm<big_endian>*
fa89cc82
HS
2554 do_make_data_plt(Layout* layout,
2555 Arm_output_data_got<big_endian>* got,
2556 Output_data_space* got_plt,
2557 Output_data_space* got_irelative)
2e702c99 2558 {
fa89cc82 2559 gold_assert(got_plt != NULL && got_irelative != NULL);
ce3e4980
PC
2560 if (parameters->options().long_plt())
2561 return new Output_data_plt_arm_long<big_endian>(
2562 layout, got, got_plt, got_irelative);
2563 else
2564 return new Output_data_plt_arm_short<big_endian>(
fa89cc82 2565 layout, got, got_plt, got_irelative);
2e702c99
RM
2566 }
2567
4a657b0d
DK
2568 private:
2569 // The class which scans relocations.
2570 class Scan
2571 {
2572 public:
2573 Scan()
bec53400 2574 : issued_non_pic_error_(false)
4a657b0d
DK
2575 { }
2576
95a2c8d6
RS
2577 static inline int
2578 get_reference_flags(unsigned int r_type);
2579
4a657b0d 2580 inline void
ad0f2072 2581 local(Symbol_table* symtab, Layout* layout, Target_arm* target,
6fa2a40b 2582 Sized_relobj_file<32, big_endian>* object,
4a657b0d
DK
2583 unsigned int data_shndx,
2584 Output_section* output_section,
2585 const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
bfdfa4cd
AM
2586 const elfcpp::Sym<32, big_endian>& lsym,
2587 bool is_discarded);
4a657b0d
DK
2588
2589 inline void
ad0f2072 2590 global(Symbol_table* symtab, Layout* layout, Target_arm* target,
6fa2a40b 2591 Sized_relobj_file<32, big_endian>* object,
4a657b0d
DK
2592 unsigned int data_shndx,
2593 Output_section* output_section,
2594 const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2595 Symbol* gsym);
2596
21bb3914
ST
2597 inline bool
2598 local_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2e702c99
RM
2599 Sized_relobj_file<32, big_endian>* ,
2600 unsigned int ,
2601 Output_section* ,
2602 const elfcpp::Rel<32, big_endian>& ,
21bb3914 2603 unsigned int ,
2e702c99 2604 const elfcpp::Sym<32, big_endian>&);
21bb3914
ST
2605
2606 inline bool
2607 global_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2e702c99
RM
2608 Sized_relobj_file<32, big_endian>* ,
2609 unsigned int ,
2610 Output_section* ,
2611 const elfcpp::Rel<32, big_endian>& ,
8a75a161 2612 unsigned int , Symbol*);
21bb3914 2613
4a657b0d
DK
2614 private:
2615 static void
6fa2a40b 2616 unsupported_reloc_local(Sized_relobj_file<32, big_endian>*,
4a657b0d
DK
2617 unsigned int r_type);
2618
2619 static void
6fa2a40b 2620 unsupported_reloc_global(Sized_relobj_file<32, big_endian>*,
4a657b0d 2621 unsigned int r_type, Symbol*);
bec53400
DK
2622
2623 void
2624 check_non_pic(Relobj*, unsigned int r_type);
2625
2626 // Almost identical to Symbol::needs_plt_entry except that it also
2627 // handles STT_ARM_TFUNC.
2628 static bool
2629 symbol_needs_plt_entry(const Symbol* sym)
2630 {
2631 // An undefined symbol from an executable does not need a PLT entry.
2632 if (sym->is_undefined() && !parameters->options().shared())
2633 return false;
2634
fa89cc82
HS
2635 if (sym->type() == elfcpp::STT_GNU_IFUNC)
2636 return true;
2637
bec53400
DK
2638 return (!parameters->doing_static_link()
2639 && (sym->type() == elfcpp::STT_FUNC
2640 || sym->type() == elfcpp::STT_ARM_TFUNC)
2641 && (sym->is_from_dynobj()
2642 || sym->is_undefined()
2643 || sym->is_preemptible()));
2644 }
2645
8a75a161
DK
2646 inline bool
2647 possible_function_pointer_reloc(unsigned int r_type);
2648
fa89cc82
HS
2649 // Whether a plt entry is needed for ifunc.
2650 bool
2651 reloc_needs_plt_for_ifunc(Sized_relobj_file<32, big_endian>*,
2652 unsigned int r_type);
2653
bec53400
DK
2654 // Whether we have issued an error about a non-PIC compilation.
2655 bool issued_non_pic_error_;
4a657b0d
DK
2656 };
2657
2658 // The class which implements relocation.
2659 class Relocate
2660 {
2661 public:
2662 Relocate()
2663 { }
2664
2665 ~Relocate()
2666 { }
2667
bec53400
DK
2668 // Return whether the static relocation needs to be applied.
2669 inline bool
2670 should_apply_static_reloc(const Sized_symbol<32>* gsym,
95a2c8d6 2671 unsigned int r_type,
bec53400
DK
2672 bool is_32bit,
2673 Output_section* output_section);
2674
4a657b0d
DK
2675 // Do a relocation. Return false if the caller should not issue
2676 // any warnings about this relocation.
2677 inline bool
91a65d2f
AM
2678 relocate(const Relocate_info<32, big_endian>*, unsigned int,
2679 Target_arm*, Output_section*, size_t, const unsigned char*,
2680 const Sized_symbol<32>*, const Symbol_value<32>*,
2681 unsigned char*, Arm_address, section_size_type);
c121c671
DK
2682
2683 // Return whether we want to pass flag NON_PIC_REF for this
f4e5969c
DK
2684 // reloc. This means the relocation type accesses a symbol not via
2685 // GOT or PLT.
c121c671 2686 static inline bool
ca09d69a 2687 reloc_is_non_pic(unsigned int r_type)
c121c671
DK
2688 {
2689 switch (r_type)
2690 {
f4e5969c
DK
2691 // These relocation types reference GOT or PLT entries explicitly.
2692 case elfcpp::R_ARM_GOT_BREL:
2693 case elfcpp::R_ARM_GOT_ABS:
2694 case elfcpp::R_ARM_GOT_PREL:
2695 case elfcpp::R_ARM_GOT_BREL12:
2696 case elfcpp::R_ARM_PLT32_ABS:
2697 case elfcpp::R_ARM_TLS_GD32:
2698 case elfcpp::R_ARM_TLS_LDM32:
2699 case elfcpp::R_ARM_TLS_IE32:
2700 case elfcpp::R_ARM_TLS_IE12GP:
2701
2702 // These relocate types may use PLT entries.
c121c671 2703 case elfcpp::R_ARM_CALL:
f4e5969c 2704 case elfcpp::R_ARM_THM_CALL:
c121c671 2705 case elfcpp::R_ARM_JUMP24:
f4e5969c
DK
2706 case elfcpp::R_ARM_THM_JUMP24:
2707 case elfcpp::R_ARM_THM_JUMP19:
2708 case elfcpp::R_ARM_PLT32:
2709 case elfcpp::R_ARM_THM_XPC22:
c3e4ae29
DK
2710 case elfcpp::R_ARM_PREL31:
2711 case elfcpp::R_ARM_SBREL31:
c121c671 2712 return false;
f4e5969c
DK
2713
2714 default:
2715 return true;
c121c671
DK
2716 }
2717 }
f96accdf
DK
2718
2719 private:
2720 // Do a TLS relocation.
2721 inline typename Arm_relocate_functions<big_endian>::Status
2722 relocate_tls(const Relocate_info<32, big_endian>*, Target_arm<big_endian>*,
2e702c99 2723 size_t, const elfcpp::Rel<32, big_endian>&, unsigned int,
f96accdf
DK
2724 const Sized_symbol<32>*, const Symbol_value<32>*,
2725 unsigned char*, elfcpp::Elf_types<32>::Elf_Addr,
2726 section_size_type);
2727
4a657b0d
DK
2728 };
2729
2730 // A class which returns the size required for a relocation type,
2731 // used while scanning relocs during a relocatable link.
2732 class Relocatable_size_for_reloc
2733 {
2734 public:
2735 unsigned int
2736 get_size_for_reloc(unsigned int, Relobj*);
2737 };
2738
f96accdf
DK
2739 // Adjust TLS relocation type based on the options and whether this
2740 // is a local symbol.
2741 static tls::Tls_optimization
2742 optimize_tls_reloc(bool is_final, int r_type);
2743
94cdfcff 2744 // Get the GOT section, creating it if necessary.
4a54abbb 2745 Arm_output_data_got<big_endian>*
94cdfcff
DK
2746 got_section(Symbol_table*, Layout*);
2747
2748 // Get the GOT PLT section.
2749 Output_data_space*
2750 got_plt_section() const
2751 {
2752 gold_assert(this->got_plt_ != NULL);
2753 return this->got_plt_;
2754 }
2755
fa89cc82
HS
2756 // Create the PLT section.
2757 void
2758 make_plt_section(Symbol_table* symtab, Layout* layout);
2759
94cdfcff
DK
2760 // Create a PLT entry for a global symbol.
2761 void
2762 make_plt_entry(Symbol_table*, Layout*, Symbol*);
2763
fa89cc82
HS
2764 // Create a PLT entry for a local STT_GNU_IFUNC symbol.
2765 void
2766 make_local_ifunc_plt_entry(Symbol_table*, Layout*,
2767 Sized_relobj_file<32, big_endian>* relobj,
2768 unsigned int local_sym_index);
2769
f96accdf
DK
2770 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
2771 void
2772 define_tls_base_symbol(Symbol_table*, Layout*);
2773
2774 // Create a GOT entry for the TLS module index.
2775 unsigned int
2776 got_mod_index_entry(Symbol_table* symtab, Layout* layout,
6fa2a40b 2777 Sized_relobj_file<32, big_endian>* object);
f96accdf 2778
94cdfcff
DK
2779 // Get the PLT section.
2780 const Output_data_plt_arm<big_endian>*
2781 plt_section() const
2782 {
2783 gold_assert(this->plt_ != NULL);
2784 return this->plt_;
2785 }
2786
2787 // Get the dynamic reloc section, creating it if necessary.
2788 Reloc_section*
2789 rel_dyn_section(Layout*);
2790
f96accdf
DK
2791 // Get the section to use for TLS_DESC relocations.
2792 Reloc_section*
2793 rel_tls_desc_section(Layout*) const;
2794
94cdfcff
DK
2795 // Return true if the symbol may need a COPY relocation.
2796 // References from an executable object to non-function symbols
2797 // defined in a dynamic object may need a COPY relocation.
2798 bool
2799 may_need_copy_reloc(Symbol* gsym)
2800 {
966d4097
DK
2801 return (gsym->type() != elfcpp::STT_ARM_TFUNC
2802 && gsym->may_need_copy_reloc());
94cdfcff
DK
2803 }
2804
2805 // Add a potential copy relocation.
2806 void
2807 copy_reloc(Symbol_table* symtab, Layout* layout,
6fa2a40b 2808 Sized_relobj_file<32, big_endian>* object,
2ea97941 2809 unsigned int shndx, Output_section* output_section,
94cdfcff
DK
2810 Symbol* sym, const elfcpp::Rel<32, big_endian>& reloc)
2811 {
859d7987 2812 unsigned int r_type = elfcpp::elf_r_type<32>(reloc.get_r_info());
94cdfcff
DK
2813 this->copy_relocs_.copy_reloc(symtab, layout,
2814 symtab->get_sized_symbol<32>(sym),
859d7987
CC
2815 object, shndx, output_section,
2816 r_type, reloc.get_r_offset(), 0,
94cdfcff
DK
2817 this->rel_dyn_section(layout));
2818 }
2819
d5b40221
DK
2820 // Whether two EABI versions are compatible.
2821 static bool
2822 are_eabi_versions_compatible(elfcpp::Elf_Word v1, elfcpp::Elf_Word v2);
2823
2824 // Merge processor-specific flags from input object and those in the ELF
2825 // header of the output.
2826 void
2827 merge_processor_specific_flags(const std::string&, elfcpp::Elf_Word);
2828
a0351a69
DK
2829 // Get the secondary compatible architecture.
2830 static int
2831 get_secondary_compatible_arch(const Attributes_section_data*);
2832
2833 // Set the secondary compatible architecture.
2834 static void
2835 set_secondary_compatible_arch(Attributes_section_data*, int);
2836
2837 static int
2838 tag_cpu_arch_combine(const char*, int, int*, int, int);
2839
2840 // Helper to print AEABI enum tag value.
2841 static std::string
2842 aeabi_enum_name(unsigned int);
2843
2844 // Return string value for TAG_CPU_name.
2845 static std::string
2846 tag_cpu_name_value(unsigned int);
2847
679af368
ILT
2848 // Query attributes object to see if integer divide instructions may be
2849 // present in an object.
2850 static bool
2851 attributes_accept_div(int arch, int profile,
2852 const Object_attribute* div_attr);
2853
2854 // Query attributes object to see if integer divide instructions are
2855 // forbidden to be in the object. This is not the inverse of
2856 // attributes_accept_div.
2857 static bool
2858 attributes_forbid_div(const Object_attribute* div_attr);
2859
a0351a69
DK
2860 // Merge object attributes from input object and those in the output.
2861 void
2862 merge_object_attributes(const char*, const Attributes_section_data*);
2863
2864 // Helper to get an AEABI object attribute
2865 Object_attribute*
2866 get_aeabi_object_attribute(int tag) const
2867 {
2868 Attributes_section_data* pasd = this->attributes_section_data_;
2869 gold_assert(pasd != NULL);
2870 Object_attribute* attr =
2871 pasd->get_attribute(Object_attribute::OBJ_ATTR_PROC, tag);
2872 gold_assert(attr != NULL);
2873 return attr;
2874 }
2875
eb44217c
DK
2876 //
2877 // Methods to support stub-generations.
2878 //
d5b40221 2879
eb44217c
DK
2880 // Group input sections for stub generation.
2881 void
f625ae50 2882 group_sections(Layout*, section_size_type, bool, const Task*);
d5b40221 2883
eb44217c
DK
2884 // Scan a relocation for stub generation.
2885 void
2886 scan_reloc_for_stub(const Relocate_info<32, big_endian>*, unsigned int,
2887 const Sized_symbol<32>*, unsigned int,
2888 const Symbol_value<32>*,
2889 elfcpp::Elf_types<32>::Elf_Swxword, Arm_address);
d5b40221 2890
eb44217c
DK
2891 // Scan a relocation section for stub.
2892 template<int sh_type>
2893 void
2894 scan_reloc_section_for_stubs(
2895 const Relocate_info<32, big_endian>* relinfo,
2896 const unsigned char* prelocs,
2897 size_t reloc_count,
2898 Output_section* output_section,
2899 bool needs_special_offset_handling,
2900 const unsigned char* view,
2901 elfcpp::Elf_types<32>::Elf_Addr view_address,
2902 section_size_type);
d5b40221 2903
2b328d4e
DK
2904 // Fix .ARM.exidx section coverage.
2905 void
131687b4 2906 fix_exidx_coverage(Layout*, const Input_objects*,
f625ae50
DK
2907 Arm_output_section<big_endian>*, Symbol_table*,
2908 const Task*);
2b328d4e
DK
2909
2910 // Functors for STL set.
2911 struct output_section_address_less_than
2912 {
2913 bool
2914 operator()(const Output_section* s1, const Output_section* s2) const
2915 { return s1->address() < s2->address(); }
2916 };
2917
4a657b0d
DK
2918 // Information about this specific target which we pass to the
2919 // general Target structure.
2920 static const Target::Target_info arm_info;
94cdfcff
DK
2921
2922 // The types of GOT entries needed for this platform.
0e70b911
CC
2923 // These values are exposed to the ABI in an incremental link.
2924 // Do not renumber existing values without changing the version
2925 // number of the .gnu_incremental_inputs section.
94cdfcff
DK
2926 enum Got_type
2927 {
f96accdf
DK
2928 GOT_TYPE_STANDARD = 0, // GOT entry for a regular symbol
2929 GOT_TYPE_TLS_NOFFSET = 1, // GOT entry for negative TLS offset
2930 GOT_TYPE_TLS_OFFSET = 2, // GOT entry for positive TLS offset
2931 GOT_TYPE_TLS_PAIR = 3, // GOT entry for TLS module/offset pair
2932 GOT_TYPE_TLS_DESC = 4 // GOT entry for TLS_DESC pair
94cdfcff
DK
2933 };
2934
55da9579
DK
2935 typedef typename std::vector<Stub_table<big_endian>*> Stub_table_list;
2936
2937 // Map input section to Arm_input_section.
5ac169d4 2938 typedef Unordered_map<Section_id,
55da9579 2939 Arm_input_section<big_endian>*,
5ac169d4 2940 Section_id_hash>
55da9579 2941 Arm_input_section_map;
2e702c99 2942
a120bc7f
DK
2943 // Map output addresses to relocs for Cortex-A8 erratum.
2944 typedef Unordered_map<Arm_address, const Cortex_a8_reloc*>
2945 Cortex_a8_relocs_info;
2946
94cdfcff 2947 // The GOT section.
4a54abbb 2948 Arm_output_data_got<big_endian>* got_;
94cdfcff
DK
2949 // The PLT section.
2950 Output_data_plt_arm<big_endian>* plt_;
2951 // The GOT PLT section.
2952 Output_data_space* got_plt_;
fa89cc82
HS
2953 // The GOT section for IRELATIVE relocations.
2954 Output_data_space* got_irelative_;
94cdfcff
DK
2955 // The dynamic reloc section.
2956 Reloc_section* rel_dyn_;
fa89cc82
HS
2957 // The section to use for IRELATIVE relocs.
2958 Reloc_section* rel_irelative_;
94cdfcff
DK
2959 // Relocs saved to avoid a COPY reloc.
2960 Copy_relocs<elfcpp::SHT_REL, 32, big_endian> copy_relocs_;
f96accdf
DK
2961 // Offset of the GOT entry for the TLS module index.
2962 unsigned int got_mod_index_offset_;
2963 // True if the _TLS_MODULE_BASE_ symbol has been defined.
2964 bool tls_base_symbol_defined_;
55da9579
DK
2965 // Vector of Stub_tables created.
2966 Stub_table_list stub_tables_;
2967 // Stub factory.
2968 const Stub_factory &stub_factory_;
b569affa
DK
2969 // Whether we force PIC branch veneers.
2970 bool should_force_pic_veneer_;
eb44217c
DK
2971 // Map for locating Arm_input_sections.
2972 Arm_input_section_map arm_input_section_map_;
a0351a69
DK
2973 // Attributes section data in output.
2974 Attributes_section_data* attributes_section_data_;
a120bc7f
DK
2975 // Whether we want to fix code for Cortex-A8 erratum.
2976 bool fix_cortex_a8_;
2977 // Map addresses to relocs for Cortex-A8 erratum.
2978 Cortex_a8_relocs_info cortex_a8_relocs_info_;
4a657b0d
DK
2979};
2980
2981template<bool big_endian>
2982const Target::Target_info Target_arm<big_endian>::arm_info =
2983{
2984 32, // size
2985 big_endian, // is_big_endian
2986 elfcpp::EM_ARM, // machine_code
2987 false, // has_make_symbol
2988 false, // has_resolve
2989 false, // has_code_fill
2990 true, // is_default_stack_executable
b3ce541e 2991 false, // can_icf_inline_merge_sections
4a657b0d
DK
2992 '\0', // wrap_char
2993 "/usr/lib/libc.so.1", // dynamic_linker
2994 0x8000, // default_text_segment_address
2995 0x1000, // abi_pagesize (overridable by -z max-page-size)
8a5e3e08 2996 0x1000, // common_pagesize (overridable by -z common-page-size)
2e702c99
RM
2997 false, // isolate_execinstr
2998 0, // rosegment_gap
8a5e3e08
ILT
2999 elfcpp::SHN_UNDEF, // small_common_shndx
3000 elfcpp::SHN_UNDEF, // large_common_shndx
3001 0, // small_common_section_flags
05a352e6
DK
3002 0, // large_common_section_flags
3003 ".ARM.attributes", // attributes_section
a67858e0 3004 "aeabi", // attributes_vendor
8d9743bd
MK
3005 "_start", // entry_symbol_name
3006 32, // hash_entry_size
4a657b0d
DK
3007};
3008
c121c671
DK
3009// Arm relocate functions class
3010//
3011
3012template<bool big_endian>
3013class Arm_relocate_functions : public Relocate_functions<32, big_endian>
3014{
3015 public:
3016 typedef enum
3017 {
3018 STATUS_OKAY, // No error during relocation.
9b547ce6 3019 STATUS_OVERFLOW, // Relocation overflow.
c121c671
DK
3020 STATUS_BAD_RELOC // Relocation cannot be applied.
3021 } Status;
3022
3023 private:
3024 typedef Relocate_functions<32, big_endian> Base;
3025 typedef Arm_relocate_functions<big_endian> This;
3026
fd3c5f0b
ILT
3027 // Encoding of imm16 argument for movt and movw ARM instructions
3028 // from ARM ARM:
2e702c99 3029 //
fd3c5f0b
ILT
3030 // imm16 := imm4 | imm12
3031 //
2e702c99 3032 // 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
fd3c5f0b
ILT
3033 // +-------+---------------+-------+-------+-----------------------+
3034 // | | |imm4 | |imm12 |
3035 // +-------+---------------+-------+-------+-----------------------+
3036
3037 // Extract the relocation addend from VAL based on the ARM
3038 // instruction encoding described above.
3039 static inline typename elfcpp::Swap<32, big_endian>::Valtype
3040 extract_arm_movw_movt_addend(
3041 typename elfcpp::Swap<32, big_endian>::Valtype val)
3042 {
3043 // According to the Elf ABI for ARM Architecture the immediate
3044 // field is sign-extended to form the addend.
bef2b434 3045 return Bits<16>::sign_extend32(((val >> 4) & 0xf000) | (val & 0xfff));
fd3c5f0b
ILT
3046 }
3047
3048 // Insert X into VAL based on the ARM instruction encoding described
3049 // above.
3050 static inline typename elfcpp::Swap<32, big_endian>::Valtype
3051 insert_val_arm_movw_movt(
3052 typename elfcpp::Swap<32, big_endian>::Valtype val,
3053 typename elfcpp::Swap<32, big_endian>::Valtype x)
3054 {
3055 val &= 0xfff0f000;
3056 val |= x & 0x0fff;
3057 val |= (x & 0xf000) << 4;
3058 return val;
3059 }
3060
3061 // Encoding of imm16 argument for movt and movw Thumb2 instructions
3062 // from ARM ARM:
2e702c99 3063 //
fd3c5f0b
ILT
3064 // imm16 := imm4 | i | imm3 | imm8
3065 //
2e702c99 3066 // 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
fd3c5f0b
ILT
3067 // +---------+-+-----------+-------++-+-----+-------+---------------+
3068 // | |i| |imm4 || |imm3 | |imm8 |
3069 // +---------+-+-----------+-------++-+-----+-------+---------------+
3070
3071 // Extract the relocation addend from VAL based on the Thumb2
3072 // instruction encoding described above.
3073 static inline typename elfcpp::Swap<32, big_endian>::Valtype
3074 extract_thumb_movw_movt_addend(
3075 typename elfcpp::Swap<32, big_endian>::Valtype val)
3076 {
3077 // According to the Elf ABI for ARM Architecture the immediate
3078 // field is sign-extended to form the addend.
bef2b434
ILT
3079 return Bits<16>::sign_extend32(((val >> 4) & 0xf000)
3080 | ((val >> 15) & 0x0800)
3081 | ((val >> 4) & 0x0700)
3082 | (val & 0x00ff));
fd3c5f0b
ILT
3083 }
3084
3085 // Insert X into VAL based on the Thumb2 instruction encoding
3086 // described above.
3087 static inline typename elfcpp::Swap<32, big_endian>::Valtype
3088 insert_val_thumb_movw_movt(
3089 typename elfcpp::Swap<32, big_endian>::Valtype val,
3090 typename elfcpp::Swap<32, big_endian>::Valtype x)
3091 {
3092 val &= 0xfbf08f00;
3093 val |= (x & 0xf000) << 4;
3094 val |= (x & 0x0800) << 15;
3095 val |= (x & 0x0700) << 4;
3096 val |= (x & 0x00ff);
3097 return val;
3098 }
3099
b10d2873
ILT
3100 // Calculate the smallest constant Kn for the specified residual.
3101 // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3102 static uint32_t
3103 calc_grp_kn(typename elfcpp::Swap<32, big_endian>::Valtype residual)
3104 {
3105 int32_t msb;
3106
3107 if (residual == 0)
3108 return 0;
3109 // Determine the most significant bit in the residual and
3110 // align the resulting value to a 2-bit boundary.
3111 for (msb = 30; (msb >= 0) && !(residual & (3 << msb)); msb -= 2)
3112 ;
3113 // The desired shift is now (msb - 6), or zero, whichever
3114 // is the greater.
3115 return (((msb - 6) < 0) ? 0 : (msb - 6));
3116 }
3117
3118 // Calculate the final residual for the specified group index.
3119 // If the passed group index is less than zero, the method will return
3120 // the value of the specified residual without any change.
3121 // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3122 static typename elfcpp::Swap<32, big_endian>::Valtype
3123 calc_grp_residual(typename elfcpp::Swap<32, big_endian>::Valtype residual,
3124 const int group)
3125 {
3126 for (int n = 0; n <= group; n++)
3127 {
3128 // Calculate which part of the value to mask.
3129 uint32_t shift = calc_grp_kn(residual);
3130 // Calculate the residual for the next time around.
3131 residual &= ~(residual & (0xff << shift));
3132 }
3133
3134 return residual;
3135 }
3136
3137 // Calculate the value of Gn for the specified group index.
3138 // We return it in the form of an encoded constant-and-rotation.
3139 // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
3140 static typename elfcpp::Swap<32, big_endian>::Valtype
3141 calc_grp_gn(typename elfcpp::Swap<32, big_endian>::Valtype residual,
3142 const int group)
3143 {
3144 typename elfcpp::Swap<32, big_endian>::Valtype gn = 0;
3145 uint32_t shift = 0;
3146
3147 for (int n = 0; n <= group; n++)
3148 {
3149 // Calculate which part of the value to mask.
3150 shift = calc_grp_kn(residual);
3151 // Calculate Gn in 32-bit as well as encoded constant-and-rotation form.
3152 gn = residual & (0xff << shift);
3153 // Calculate the residual for the next time around.
3154 residual &= ~gn;
3155 }
3156 // Return Gn in the form of an encoded constant-and-rotation.
3157 return ((gn >> shift) | ((gn <= 0xff ? 0 : (32 - shift) / 2) << 8));
3158 }
3159
1521477a 3160 public:
d204b6e9
DK
3161 // Handle ARM long branches.
3162 static typename This::Status
3163 arm_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
ca09d69a 3164 unsigned char*, const Sized_symbol<32>*,
d204b6e9
DK
3165 const Arm_relobj<big_endian>*, unsigned int,
3166 const Symbol_value<32>*, Arm_address, Arm_address, bool);
c121c671 3167
51938283
DK
3168 // Handle THUMB long branches.
3169 static typename This::Status
3170 thumb_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
ca09d69a 3171 unsigned char*, const Sized_symbol<32>*,
51938283
DK
3172 const Arm_relobj<big_endian>*, unsigned int,
3173 const Symbol_value<32>*, Arm_address, Arm_address, bool);
3174
5e445df6 3175
089d69dc
DK
3176 // Return the branch offset of a 32-bit THUMB branch.
3177 static inline int32_t
3178 thumb32_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
3179 {
3180 // We use the Thumb-2 encoding (backwards compatible with Thumb-1)
3181 // involving the J1 and J2 bits.
3182 uint32_t s = (upper_insn & (1U << 10)) >> 10;
3183 uint32_t upper = upper_insn & 0x3ffU;
3184 uint32_t lower = lower_insn & 0x7ffU;
3185 uint32_t j1 = (lower_insn & (1U << 13)) >> 13;
3186 uint32_t j2 = (lower_insn & (1U << 11)) >> 11;
3187 uint32_t i1 = j1 ^ s ? 0 : 1;
3188 uint32_t i2 = j2 ^ s ? 0 : 1;
3189
bef2b434
ILT
3190 return Bits<25>::sign_extend32((s << 24) | (i1 << 23) | (i2 << 22)
3191 | (upper << 12) | (lower << 1));
089d69dc
DK
3192 }
3193
3194 // Insert OFFSET to a 32-bit THUMB branch and return the upper instruction.
3195 // UPPER_INSN is the original upper instruction of the branch. Caller is
3196 // responsible for overflow checking and BLX offset adjustment.
3197 static inline uint16_t
3198 thumb32_branch_upper(uint16_t upper_insn, int32_t offset)
3199 {
3200 uint32_t s = offset < 0 ? 1 : 0;
3201 uint32_t bits = static_cast<uint32_t>(offset);
3202 return (upper_insn & ~0x7ffU) | ((bits >> 12) & 0x3ffU) | (s << 10);
3203 }
3204
3205 // Insert OFFSET to a 32-bit THUMB branch and return the lower instruction.
3206 // LOWER_INSN is the original lower instruction of the branch. Caller is
3207 // responsible for overflow checking and BLX offset adjustment.
3208 static inline uint16_t
3209 thumb32_branch_lower(uint16_t lower_insn, int32_t offset)
3210 {
3211 uint32_t s = offset < 0 ? 1 : 0;
3212 uint32_t bits = static_cast<uint32_t>(offset);
3213 return ((lower_insn & ~0x2fffU)
2e702c99
RM
3214 | ((((bits >> 23) & 1) ^ !s) << 13)
3215 | ((((bits >> 22) & 1) ^ !s) << 11)
3216 | ((bits >> 1) & 0x7ffU));
089d69dc
DK
3217 }
3218
3219 // Return the branch offset of a 32-bit THUMB conditional branch.
3220 static inline int32_t
3221 thumb32_cond_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
3222 {
3223 uint32_t s = (upper_insn & 0x0400U) >> 10;
3224 uint32_t j1 = (lower_insn & 0x2000U) >> 13;
3225 uint32_t j2 = (lower_insn & 0x0800U) >> 11;
3226 uint32_t lower = (lower_insn & 0x07ffU);
3227 uint32_t upper = (s << 8) | (j2 << 7) | (j1 << 6) | (upper_insn & 0x003fU);
3228
bef2b434 3229 return Bits<21>::sign_extend32((upper << 12) | (lower << 1));
089d69dc
DK
3230 }
3231
3232 // Insert OFFSET to a 32-bit THUMB conditional branch and return the upper
3233 // instruction. UPPER_INSN is the original upper instruction of the branch.
3234 // Caller is responsible for overflow checking.
3235 static inline uint16_t
3236 thumb32_cond_branch_upper(uint16_t upper_insn, int32_t offset)
3237 {
3238 uint32_t s = offset < 0 ? 1 : 0;
3239 uint32_t bits = static_cast<uint32_t>(offset);
3240 return (upper_insn & 0xfbc0U) | (s << 10) | ((bits & 0x0003f000U) >> 12);
3241 }
3242
3243 // Insert OFFSET to a 32-bit THUMB conditional branch and return the lower
3244 // instruction. LOWER_INSN is the original lower instruction of the branch.
9b547ce6 3245 // The caller is responsible for overflow checking.
089d69dc
DK
3246 static inline uint16_t
3247 thumb32_cond_branch_lower(uint16_t lower_insn, int32_t offset)
3248 {
3249 uint32_t bits = static_cast<uint32_t>(offset);
3250 uint32_t j2 = (bits & 0x00080000U) >> 19;
3251 uint32_t j1 = (bits & 0x00040000U) >> 18;
3252 uint32_t lo = (bits & 0x00000ffeU) >> 1;
3253
3254 return (lower_insn & 0xd000U) | (j1 << 13) | (j2 << 11) | lo;
3255 }
3256
5e445df6
ILT
3257 // R_ARM_ABS8: S + A
3258 static inline typename This::Status
ca09d69a 3259 abs8(unsigned char* view,
6fa2a40b 3260 const Sized_relobj_file<32, big_endian>* object,
be8fcb75 3261 const Symbol_value<32>* psymval)
5e445df6
ILT
3262 {
3263 typedef typename elfcpp::Swap<8, big_endian>::Valtype Valtype;
5e445df6
ILT
3264 Valtype* wv = reinterpret_cast<Valtype*>(view);
3265 Valtype val = elfcpp::Swap<8, big_endian>::readval(wv);
bef2b434 3266 int32_t addend = Bits<8>::sign_extend32(val);
f6cccc2c 3267 Arm_address x = psymval->value(object, addend);
bef2b434 3268 val = Bits<32>::bit_select32(val, x, 0xffU);
5e445df6 3269 elfcpp::Swap<8, big_endian>::writeval(wv, val);
a2c7281b
DK
3270
3271 // R_ARM_ABS8 permits signed or unsigned results.
2c175ebc 3272 return (Bits<8>::has_signed_unsigned_overflow32(x)
5e445df6
ILT
3273 ? This::STATUS_OVERFLOW
3274 : This::STATUS_OKAY);
3275 }
3276
be8fcb75
ILT
3277 // R_ARM_THM_ABS5: S + A
3278 static inline typename This::Status
ca09d69a 3279 thm_abs5(unsigned char* view,
6fa2a40b 3280 const Sized_relobj_file<32, big_endian>* object,
be8fcb75
ILT
3281 const Symbol_value<32>* psymval)
3282 {
3283 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3284 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3285 Valtype* wv = reinterpret_cast<Valtype*>(view);
3286 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3287 Reltype addend = (val & 0x7e0U) >> 6;
2daedcd6 3288 Reltype x = psymval->value(object, addend);
bef2b434 3289 val = Bits<32>::bit_select32(val, x << 6, 0x7e0U);
be8fcb75 3290 elfcpp::Swap<16, big_endian>::writeval(wv, val);
2c175ebc 3291 return (Bits<5>::has_overflow32(x)
be8fcb75
ILT
3292 ? This::STATUS_OVERFLOW
3293 : This::STATUS_OKAY);
3294 }
3295
3296 // R_ARM_ABS12: S + A
3297 static inline typename This::Status
ca09d69a 3298 abs12(unsigned char* view,
6fa2a40b 3299 const Sized_relobj_file<32, big_endian>* object,
51938283 3300 const Symbol_value<32>* psymval)
be8fcb75
ILT
3301 {
3302 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3303 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3304 Valtype* wv = reinterpret_cast<Valtype*>(view);
3305 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3306 Reltype addend = val & 0x0fffU;
2daedcd6 3307 Reltype x = psymval->value(object, addend);
bef2b434 3308 val = Bits<32>::bit_select32(val, x, 0x0fffU);
be8fcb75 3309 elfcpp::Swap<32, big_endian>::writeval(wv, val);
bef2b434 3310 return (Bits<12>::has_overflow32(x)
be8fcb75
ILT
3311 ? This::STATUS_OVERFLOW
3312 : This::STATUS_OKAY);
3313 }
3314
3315 // R_ARM_ABS16: S + A
3316 static inline typename This::Status
ca09d69a 3317 abs16(unsigned char* view,
6fa2a40b 3318 const Sized_relobj_file<32, big_endian>* object,
51938283 3319 const Symbol_value<32>* psymval)
be8fcb75 3320 {
f6cccc2c 3321 typedef typename elfcpp::Swap_unaligned<16, big_endian>::Valtype Valtype;
f6cccc2c 3322 Valtype val = elfcpp::Swap_unaligned<16, big_endian>::readval(view);
bef2b434 3323 int32_t addend = Bits<16>::sign_extend32(val);
f6cccc2c 3324 Arm_address x = psymval->value(object, addend);
bef2b434 3325 val = Bits<32>::bit_select32(val, x, 0xffffU);
f6cccc2c
DK
3326 elfcpp::Swap_unaligned<16, big_endian>::writeval(view, val);
3327
3328 // R_ARM_ABS16 permits signed or unsigned results.
2c175ebc 3329 return (Bits<16>::has_signed_unsigned_overflow32(x)
be8fcb75
ILT
3330 ? This::STATUS_OVERFLOW
3331 : This::STATUS_OKAY);
3332 }
3333
c121c671
DK
3334 // R_ARM_ABS32: (S + A) | T
3335 static inline typename This::Status
ca09d69a 3336 abs32(unsigned char* view,
6fa2a40b 3337 const Sized_relobj_file<32, big_endian>* object,
c121c671 3338 const Symbol_value<32>* psymval,
2daedcd6 3339 Arm_address thumb_bit)
c121c671 3340 {
f6cccc2c
DK
3341 typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
3342 Valtype addend = elfcpp::Swap_unaligned<32, big_endian>::readval(view);
2daedcd6 3343 Valtype x = psymval->value(object, addend) | thumb_bit;
f6cccc2c 3344 elfcpp::Swap_unaligned<32, big_endian>::writeval(view, x);
c121c671
DK
3345 return This::STATUS_OKAY;
3346 }
3347
3348 // R_ARM_REL32: (S + A) | T - P
3349 static inline typename This::Status
ca09d69a 3350 rel32(unsigned char* view,
6fa2a40b 3351 const Sized_relobj_file<32, big_endian>* object,
c121c671 3352 const Symbol_value<32>* psymval,
ebabffbd 3353 Arm_address address,
2daedcd6 3354 Arm_address thumb_bit)
c121c671 3355 {
f6cccc2c
DK
3356 typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
3357 Valtype addend = elfcpp::Swap_unaligned<32, big_endian>::readval(view);
2daedcd6 3358 Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
f6cccc2c 3359 elfcpp::Swap_unaligned<32, big_endian>::writeval(view, x);
c121c671
DK
3360 return This::STATUS_OKAY;
3361 }
3362
089d69dc
DK
3363 // R_ARM_THM_JUMP24: (S + A) | T - P
3364 static typename This::Status
ca09d69a 3365 thm_jump19(unsigned char* view, const Arm_relobj<big_endian>* object,
089d69dc
DK
3366 const Symbol_value<32>* psymval, Arm_address address,
3367 Arm_address thumb_bit);
3368
800d0f56
ILT
3369 // R_ARM_THM_JUMP6: S + A – P
3370 static inline typename This::Status
ca09d69a 3371 thm_jump6(unsigned char* view,
6fa2a40b 3372 const Sized_relobj_file<32, big_endian>* object,
800d0f56
ILT
3373 const Symbol_value<32>* psymval,
3374 Arm_address address)
3375 {
3376 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3377 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3378 Valtype* wv = reinterpret_cast<Valtype*>(view);
3379 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3380 // bit[9]:bit[7:3]:’0’ (mask: 0x02f8)
3381 Reltype addend = (((val & 0x0200) >> 3) | ((val & 0x00f8) >> 2));
3382 Reltype x = (psymval->value(object, addend) - address);
3383 val = (val & 0xfd07) | ((x & 0x0040) << 3) | ((val & 0x003e) << 2);
3384 elfcpp::Swap<16, big_endian>::writeval(wv, val);
3385 // CZB does only forward jumps.
3386 return ((x > 0x007e)
3387 ? This::STATUS_OVERFLOW
3388 : This::STATUS_OKAY);
3389 }
3390
3391 // R_ARM_THM_JUMP8: S + A – P
3392 static inline typename This::Status
ca09d69a 3393 thm_jump8(unsigned char* view,
6fa2a40b 3394 const Sized_relobj_file<32, big_endian>* object,
800d0f56
ILT
3395 const Symbol_value<32>* psymval,
3396 Arm_address address)
3397 {
3398 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
800d0f56
ILT
3399 Valtype* wv = reinterpret_cast<Valtype*>(view);
3400 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
bef2b434 3401 int32_t addend = Bits<8>::sign_extend32((val & 0x00ff) << 1);
57eb9b50
DK
3402 int32_t x = (psymval->value(object, addend) - address);
3403 elfcpp::Swap<16, big_endian>::writeval(wv, ((val & 0xff00)
2e702c99 3404 | ((x & 0x01fe) >> 1)));
57eb9b50 3405 // We do a 9-bit overflow check because x is right-shifted by 1 bit.
bef2b434 3406 return (Bits<9>::has_overflow32(x)
800d0f56
ILT
3407 ? This::STATUS_OVERFLOW
3408 : This::STATUS_OKAY);
3409 }
3410
3411 // R_ARM_THM_JUMP11: S + A – P
3412 static inline typename This::Status
ca09d69a 3413 thm_jump11(unsigned char* view,
6fa2a40b 3414 const Sized_relobj_file<32, big_endian>* object,
800d0f56
ILT
3415 const Symbol_value<32>* psymval,
3416 Arm_address address)
3417 {
3418 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
800d0f56
ILT
3419 Valtype* wv = reinterpret_cast<Valtype*>(view);
3420 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
bef2b434 3421 int32_t addend = Bits<11>::sign_extend32((val & 0x07ff) << 1);
57eb9b50
DK
3422 int32_t x = (psymval->value(object, addend) - address);
3423 elfcpp::Swap<16, big_endian>::writeval(wv, ((val & 0xf800)
2e702c99 3424 | ((x & 0x0ffe) >> 1)));
57eb9b50 3425 // We do a 12-bit overflow check because x is right-shifted by 1 bit.
bef2b434 3426 return (Bits<12>::has_overflow32(x)
800d0f56
ILT
3427 ? This::STATUS_OVERFLOW
3428 : This::STATUS_OKAY);
3429 }
3430
c121c671
DK
3431 // R_ARM_BASE_PREL: B(S) + A - P
3432 static inline typename This::Status
3433 base_prel(unsigned char* view,
ebabffbd
DK
3434 Arm_address origin,
3435 Arm_address address)
c121c671
DK
3436 {
3437 Base::rel32(view, origin - address);
3438 return STATUS_OKAY;
3439 }
3440
be8fcb75
ILT
3441 // R_ARM_BASE_ABS: B(S) + A
3442 static inline typename This::Status
3443 base_abs(unsigned char* view,
f4e5969c 3444 Arm_address origin)
be8fcb75
ILT
3445 {
3446 Base::rel32(view, origin);
3447 return STATUS_OKAY;
3448 }
3449
c121c671
DK
3450 // R_ARM_GOT_BREL: GOT(S) + A - GOT_ORG
3451 static inline typename This::Status
3452 got_brel(unsigned char* view,
3453 typename elfcpp::Swap<32, big_endian>::Valtype got_offset)
3454 {
3455 Base::rel32(view, got_offset);
3456 return This::STATUS_OKAY;
3457 }
3458
f4e5969c 3459 // R_ARM_GOT_PREL: GOT(S) + A - P
7f5309a5 3460 static inline typename This::Status
ca09d69a 3461 got_prel(unsigned char* view,
f4e5969c 3462 Arm_address got_entry,
ebabffbd 3463 Arm_address address)
7f5309a5 3464 {
f4e5969c 3465 Base::rel32(view, got_entry - address);
7f5309a5
ILT
3466 return This::STATUS_OKAY;
3467 }
3468
c121c671
DK
3469 // R_ARM_PREL: (S + A) | T - P
3470 static inline typename This::Status
ca09d69a 3471 prel31(unsigned char* view,
6fa2a40b 3472 const Sized_relobj_file<32, big_endian>* object,
c121c671 3473 const Symbol_value<32>* psymval,
ebabffbd 3474 Arm_address address,
2daedcd6 3475 Arm_address thumb_bit)
c121c671 3476 {
f6cccc2c
DK
3477 typedef typename elfcpp::Swap_unaligned<32, big_endian>::Valtype Valtype;
3478 Valtype val = elfcpp::Swap_unaligned<32, big_endian>::readval(view);
bef2b434 3479 Valtype addend = Bits<31>::sign_extend32(val);
2daedcd6 3480 Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
bef2b434 3481 val = Bits<32>::bit_select32(val, x, 0x7fffffffU);
f6cccc2c 3482 elfcpp::Swap_unaligned<32, big_endian>::writeval(view, val);
bef2b434
ILT
3483 return (Bits<31>::has_overflow32(x)
3484 ? This::STATUS_OVERFLOW
3485 : This::STATUS_OKAY);
c121c671 3486 }
fd3c5f0b 3487
5c57f1be 3488 // R_ARM_MOVW_ABS_NC: (S + A) | T (relative address base is )
c2a122b6 3489 // R_ARM_MOVW_PREL_NC: (S + A) | T - P
5c57f1be
DK
3490 // R_ARM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3491 // R_ARM_MOVW_BREL: ((S + A) | T) - B(S)
02961d7e 3492 static inline typename This::Status
5c57f1be 3493 movw(unsigned char* view,
6fa2a40b 3494 const Sized_relobj_file<32, big_endian>* object,
5c57f1be
DK
3495 const Symbol_value<32>* psymval,
3496 Arm_address relative_address_base,
3497 Arm_address thumb_bit,
3498 bool check_overflow)
02961d7e
ILT
3499 {
3500 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3501 Valtype* wv = reinterpret_cast<Valtype*>(view);
3502 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3503 Valtype addend = This::extract_arm_movw_movt_addend(val);
5c57f1be
DK
3504 Valtype x = ((psymval->value(object, addend) | thumb_bit)
3505 - relative_address_base);
02961d7e
ILT
3506 val = This::insert_val_arm_movw_movt(val, x);
3507 elfcpp::Swap<32, big_endian>::writeval(wv, val);
bef2b434 3508 return ((check_overflow && Bits<16>::has_overflow32(x))
5c57f1be
DK
3509 ? This::STATUS_OVERFLOW
3510 : This::STATUS_OKAY);
02961d7e
ILT
3511 }
3512
5c57f1be 3513 // R_ARM_MOVT_ABS: S + A (relative address base is 0)
c2a122b6 3514 // R_ARM_MOVT_PREL: S + A - P
5c57f1be 3515 // R_ARM_MOVT_BREL: S + A - B(S)
c2a122b6 3516 static inline typename This::Status
5c57f1be 3517 movt(unsigned char* view,
6fa2a40b 3518 const Sized_relobj_file<32, big_endian>* object,
5c57f1be
DK
3519 const Symbol_value<32>* psymval,
3520 Arm_address relative_address_base)
c2a122b6
ILT
3521 {
3522 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3523 Valtype* wv = reinterpret_cast<Valtype*>(view);
3524 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3525 Valtype addend = This::extract_arm_movw_movt_addend(val);
5c57f1be 3526 Valtype x = (psymval->value(object, addend) - relative_address_base) >> 16;
c2a122b6
ILT
3527 val = This::insert_val_arm_movw_movt(val, x);
3528 elfcpp::Swap<32, big_endian>::writeval(wv, val);
5c57f1be 3529 // FIXME: IHI0044D says that we should check for overflow.
c2a122b6
ILT
3530 return This::STATUS_OKAY;
3531 }
3532
5c57f1be 3533 // R_ARM_THM_MOVW_ABS_NC: S + A | T (relative_address_base is 0)
c2a122b6 3534 // R_ARM_THM_MOVW_PREL_NC: (S + A) | T - P
5c57f1be
DK
3535 // R_ARM_THM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3536 // R_ARM_THM_MOVW_BREL: ((S + A) | T) - B(S)
02961d7e 3537 static inline typename This::Status
ca09d69a 3538 thm_movw(unsigned char* view,
6fa2a40b 3539 const Sized_relobj_file<32, big_endian>* object,
5c57f1be
DK
3540 const Symbol_value<32>* psymval,
3541 Arm_address relative_address_base,
3542 Arm_address thumb_bit,
3543 bool check_overflow)
02961d7e
ILT
3544 {
3545 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3546 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3547 Valtype* wv = reinterpret_cast<Valtype*>(view);
3548 Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3549 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3550 Reltype addend = This::extract_thumb_movw_movt_addend(val);
5c57f1be
DK
3551 Reltype x =
3552 (psymval->value(object, addend) | thumb_bit) - relative_address_base;
02961d7e
ILT
3553 val = This::insert_val_thumb_movw_movt(val, x);
3554 elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3555 elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
bef2b434 3556 return ((check_overflow && Bits<16>::has_overflow32(x))
2e702c99 3557 ? This::STATUS_OVERFLOW
5c57f1be 3558 : This::STATUS_OKAY);
02961d7e
ILT
3559 }
3560
5c57f1be 3561 // R_ARM_THM_MOVT_ABS: S + A (relative address base is 0)
c2a122b6 3562 // R_ARM_THM_MOVT_PREL: S + A - P
5c57f1be 3563 // R_ARM_THM_MOVT_BREL: S + A - B(S)
c2a122b6 3564 static inline typename This::Status
5c57f1be 3565 thm_movt(unsigned char* view,
6fa2a40b 3566 const Sized_relobj_file<32, big_endian>* object,
5c57f1be
DK
3567 const Symbol_value<32>* psymval,
3568 Arm_address relative_address_base)
c2a122b6
ILT
3569 {
3570 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3571 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3572 Valtype* wv = reinterpret_cast<Valtype*>(view);
3573 Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3574 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3575 Reltype addend = This::extract_thumb_movw_movt_addend(val);
5c57f1be 3576 Reltype x = (psymval->value(object, addend) - relative_address_base) >> 16;
c2a122b6
ILT
3577 val = This::insert_val_thumb_movw_movt(val, x);
3578 elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3579 elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
3580 return This::STATUS_OKAY;
3581 }
a2162063 3582
11b861d5
DK
3583 // R_ARM_THM_ALU_PREL_11_0: ((S + A) | T) - Pa (Thumb32)
3584 static inline typename This::Status
3585 thm_alu11(unsigned char* view,
6fa2a40b 3586 const Sized_relobj_file<32, big_endian>* object,
11b861d5
DK
3587 const Symbol_value<32>* psymval,
3588 Arm_address address,
3589 Arm_address thumb_bit)
3590 {
3591 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3592 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3593 Valtype* wv = reinterpret_cast<Valtype*>(view);
3594 Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3595 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3596
3597 // 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
3598 // -----------------------------------------------------------------------
3599 // ADD{S} 1 1 1 1 0|i|0|1 0 0 0|S|1 1 0 1||0|imm3 |Rd |imm8
3600 // ADDW 1 1 1 1 0|i|1|0 0 0 0|0|1 1 0 1||0|imm3 |Rd |imm8
3601 // ADR[+] 1 1 1 1 0|i|1|0 0 0 0|0|1 1 1 1||0|imm3 |Rd |imm8
3602 // SUB{S} 1 1 1 1 0|i|0|1 1 0 1|S|1 1 0 1||0|imm3 |Rd |imm8
3603 // SUBW 1 1 1 1 0|i|1|0 1 0 1|0|1 1 0 1||0|imm3 |Rd |imm8
3604 // ADR[-] 1 1 1 1 0|i|1|0 1 0 1|0|1 1 1 1||0|imm3 |Rd |imm8
3605
3606 // Determine a sign for the addend.
3607 const int sign = ((insn & 0xf8ef0000) == 0xf0ad0000
3608 || (insn & 0xf8ef0000) == 0xf0af0000) ? -1 : 1;
3609 // Thumb2 addend encoding:
3610 // imm12 := i | imm3 | imm8
3611 int32_t addend = (insn & 0xff)
3612 | ((insn & 0x00007000) >> 4)
3613 | ((insn & 0x04000000) >> 15);
3614 // Apply a sign to the added.
3615 addend *= sign;
3616
3617 int32_t x = (psymval->value(object, addend) | thumb_bit)
3618 - (address & 0xfffffffc);
3619 Reltype val = abs(x);
3620 // Mask out the value and a distinct part of the ADD/SUB opcode
3621 // (bits 7:5 of opword).
3622 insn = (insn & 0xfb0f8f00)
3623 | (val & 0xff)
3624 | ((val & 0x700) << 4)
3625 | ((val & 0x800) << 15);
3626 // Set the opcode according to whether the value to go in the
3627 // place is negative.
3628 if (x < 0)
3629 insn |= 0x00a00000;
3630
3631 elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3632 elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3633 return ((val > 0xfff) ?
2e702c99 3634 This::STATUS_OVERFLOW : This::STATUS_OKAY);
11b861d5
DK
3635 }
3636
3637 // R_ARM_THM_PC8: S + A - Pa (Thumb)
3638 static inline typename This::Status
3639 thm_pc8(unsigned char* view,
6fa2a40b 3640 const Sized_relobj_file<32, big_endian>* object,
11b861d5
DK
3641 const Symbol_value<32>* psymval,
3642 Arm_address address)
3643 {
3644 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3645 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3646 Valtype* wv = reinterpret_cast<Valtype*>(view);
3647 Valtype insn = elfcpp::Swap<16, big_endian>::readval(wv);
3648 Reltype addend = ((insn & 0x00ff) << 2);
3649 int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3650 Reltype val = abs(x);
3651 insn = (insn & 0xff00) | ((val & 0x03fc) >> 2);
3652
3653 elfcpp::Swap<16, big_endian>::writeval(wv, insn);
3654 return ((val > 0x03fc)
3655 ? This::STATUS_OVERFLOW
3656 : This::STATUS_OKAY);
3657 }
3658
3659 // R_ARM_THM_PC12: S + A - Pa (Thumb32)
3660 static inline typename This::Status
3661 thm_pc12(unsigned char* view,
6fa2a40b 3662 const Sized_relobj_file<32, big_endian>* object,
11b861d5
DK
3663 const Symbol_value<32>* psymval,
3664 Arm_address address)
3665 {
3666 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3667 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3668 Valtype* wv = reinterpret_cast<Valtype*>(view);
3669 Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3670 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3671 // Determine a sign for the addend (positive if the U bit is 1).
3672 const int sign = (insn & 0x00800000) ? 1 : -1;
3673 int32_t addend = (insn & 0xfff);
3674 // Apply a sign to the added.
3675 addend *= sign;
3676
3677 int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3678 Reltype val = abs(x);
3679 // Mask out and apply the value and the U bit.
3680 insn = (insn & 0xff7ff000) | (val & 0xfff);
3681 // Set the U bit according to whether the value to go in the
3682 // place is positive.
3683 if (x >= 0)
3684 insn |= 0x00800000;
3685
3686 elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3687 elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3688 return ((val > 0xfff) ?
2e702c99 3689 This::STATUS_OVERFLOW : This::STATUS_OKAY);
11b861d5
DK
3690 }
3691
a2162063
ILT
3692 // R_ARM_V4BX
3693 static inline typename This::Status
3694 v4bx(const Relocate_info<32, big_endian>* relinfo,
ca09d69a 3695 unsigned char* view,
a2162063
ILT
3696 const Arm_relobj<big_endian>* object,
3697 const Arm_address address,
3698 const bool is_interworking)
3699 {
3700
3701 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3702 Valtype* wv = reinterpret_cast<Valtype*>(view);
3703 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3704
3705 // Ensure that we have a BX instruction.
3706 gold_assert((val & 0x0ffffff0) == 0x012fff10);
3707 const uint32_t reg = (val & 0xf);
3708 if (is_interworking && reg != 0xf)
3709 {
3710 Stub_table<big_endian>* stub_table =
3711 object->stub_table(relinfo->data_shndx);
3712 gold_assert(stub_table != NULL);
3713
3714 Arm_v4bx_stub* stub = stub_table->find_arm_v4bx_stub(reg);
3715 gold_assert(stub != NULL);
3716
3717 int32_t veneer_address =
3718 stub_table->address() + stub->offset() - 8 - address;
3719 gold_assert((veneer_address <= ARM_MAX_FWD_BRANCH_OFFSET)
3720 && (veneer_address >= ARM_MAX_BWD_BRANCH_OFFSET));
3721 // Replace with a branch to veneer (B <addr>)
3722 val = (val & 0xf0000000) | 0x0a000000
3723 | ((veneer_address >> 2) & 0x00ffffff);
3724 }
3725 else
3726 {
3727 // Preserve Rm (lowest four bits) and the condition code
3728 // (highest four bits). Other bits encode MOV PC,Rm.
3729 val = (val & 0xf000000f) | 0x01a0f000;
3730 }
3731 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3732 return This::STATUS_OKAY;
3733 }
b10d2873
ILT
3734
3735 // R_ARM_ALU_PC_G0_NC: ((S + A) | T) - P
3736 // R_ARM_ALU_PC_G0: ((S + A) | T) - P
3737 // R_ARM_ALU_PC_G1_NC: ((S + A) | T) - P
3738 // R_ARM_ALU_PC_G1: ((S + A) | T) - P
3739 // R_ARM_ALU_PC_G2: ((S + A) | T) - P
3740 // R_ARM_ALU_SB_G0_NC: ((S + A) | T) - B(S)
3741 // R_ARM_ALU_SB_G0: ((S + A) | T) - B(S)
3742 // R_ARM_ALU_SB_G1_NC: ((S + A) | T) - B(S)
3743 // R_ARM_ALU_SB_G1: ((S + A) | T) - B(S)
3744 // R_ARM_ALU_SB_G2: ((S + A) | T) - B(S)
3745 static inline typename This::Status
3746 arm_grp_alu(unsigned char* view,
6fa2a40b 3747 const Sized_relobj_file<32, big_endian>* object,
b10d2873
ILT
3748 const Symbol_value<32>* psymval,
3749 const int group,
3750 Arm_address address,
3751 Arm_address thumb_bit,
3752 bool check_overflow)
3753 {
5c57f1be 3754 gold_assert(group >= 0 && group < 3);
b10d2873
ILT
3755 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3756 Valtype* wv = reinterpret_cast<Valtype*>(view);
3757 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3758
3759 // ALU group relocations are allowed only for the ADD/SUB instructions.
3760 // (0x00800000 - ADD, 0x00400000 - SUB)
3761 const Valtype opcode = insn & 0x01e00000;
3762 if (opcode != 0x00800000 && opcode != 0x00400000)
3763 return This::STATUS_BAD_RELOC;
3764
3765 // Determine a sign for the addend.
3766 const int sign = (opcode == 0x00800000) ? 1 : -1;
3767 // shifter = rotate_imm * 2
3768 const uint32_t shifter = (insn & 0xf00) >> 7;
3769 // Initial addend value.
3770 int32_t addend = insn & 0xff;
3771 // Rotate addend right by shifter.
3772 addend = (addend >> shifter) | (addend << (32 - shifter));
3773 // Apply a sign to the added.
3774 addend *= sign;
3775
3776 int32_t x = ((psymval->value(object, addend) | thumb_bit) - address);
3777 Valtype gn = Arm_relocate_functions::calc_grp_gn(abs(x), group);
3778 // Check for overflow if required
3779 if (check_overflow
3780 && (Arm_relocate_functions::calc_grp_residual(abs(x), group) != 0))
3781 return This::STATUS_OVERFLOW;
3782
3783 // Mask out the value and the ADD/SUB part of the opcode; take care
3784 // not to destroy the S bit.
3785 insn &= 0xff1ff000;
3786 // Set the opcode according to whether the value to go in the
3787 // place is negative.
3788 insn |= ((x < 0) ? 0x00400000 : 0x00800000);
3789 // Encode the offset (encoded Gn).
3790 insn |= gn;
3791
3792 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3793 return This::STATUS_OKAY;
3794 }
3795
3796 // R_ARM_LDR_PC_G0: S + A - P
3797 // R_ARM_LDR_PC_G1: S + A - P
3798 // R_ARM_LDR_PC_G2: S + A - P
3799 // R_ARM_LDR_SB_G0: S + A - B(S)
3800 // R_ARM_LDR_SB_G1: S + A - B(S)
3801 // R_ARM_LDR_SB_G2: S + A - B(S)
3802 static inline typename This::Status
3803 arm_grp_ldr(unsigned char* view,
6fa2a40b 3804 const Sized_relobj_file<32, big_endian>* object,
b10d2873
ILT
3805 const Symbol_value<32>* psymval,
3806 const int group,
3807 Arm_address address)
3808 {
5c57f1be 3809 gold_assert(group >= 0 && group < 3);
b10d2873
ILT
3810 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3811 Valtype* wv = reinterpret_cast<Valtype*>(view);
3812 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3813
3814 const int sign = (insn & 0x00800000) ? 1 : -1;
3815 int32_t addend = (insn & 0xfff) * sign;
3816 int32_t x = (psymval->value(object, addend) - address);
3817 // Calculate the relevant G(n-1) value to obtain this stage residual.
3818 Valtype residual =
3819 Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3820 if (residual >= 0x1000)
3821 return This::STATUS_OVERFLOW;
3822
3823 // Mask out the value and U bit.
3824 insn &= 0xff7ff000;
3825 // Set the U bit for non-negative values.
3826 if (x >= 0)
3827 insn |= 0x00800000;
3828 insn |= residual;
3829
3830 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3831 return This::STATUS_OKAY;
3832 }
3833
3834 // R_ARM_LDRS_PC_G0: S + A - P
3835 // R_ARM_LDRS_PC_G1: S + A - P
3836 // R_ARM_LDRS_PC_G2: S + A - P
3837 // R_ARM_LDRS_SB_G0: S + A - B(S)
3838 // R_ARM_LDRS_SB_G1: S + A - B(S)
3839 // R_ARM_LDRS_SB_G2: S + A - B(S)
3840 static inline typename This::Status
3841 arm_grp_ldrs(unsigned char* view,
6fa2a40b 3842 const Sized_relobj_file<32, big_endian>* object,
b10d2873
ILT
3843 const Symbol_value<32>* psymval,
3844 const int group,
3845 Arm_address address)
3846 {
5c57f1be 3847 gold_assert(group >= 0 && group < 3);
b10d2873
ILT
3848 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3849 Valtype* wv = reinterpret_cast<Valtype*>(view);
3850 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3851
3852 const int sign = (insn & 0x00800000) ? 1 : -1;
3853 int32_t addend = (((insn & 0xf00) >> 4) + (insn & 0xf)) * sign;
3854 int32_t x = (psymval->value(object, addend) - address);
3855 // Calculate the relevant G(n-1) value to obtain this stage residual.
3856 Valtype residual =
3857 Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3858 if (residual >= 0x100)
3859 return This::STATUS_OVERFLOW;
3860
3861 // Mask out the value and U bit.
3862 insn &= 0xff7ff0f0;
3863 // Set the U bit for non-negative values.
3864 if (x >= 0)
3865 insn |= 0x00800000;
3866 insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
3867
3868 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3869 return This::STATUS_OKAY;
3870 }
3871
3872 // R_ARM_LDC_PC_G0: S + A - P
3873 // R_ARM_LDC_PC_G1: S + A - P
3874 // R_ARM_LDC_PC_G2: S + A - P
3875 // R_ARM_LDC_SB_G0: S + A - B(S)
3876 // R_ARM_LDC_SB_G1: S + A - B(S)
3877 // R_ARM_LDC_SB_G2: S + A - B(S)
3878 static inline typename This::Status
3879 arm_grp_ldc(unsigned char* view,
6fa2a40b 3880 const Sized_relobj_file<32, big_endian>* object,
b10d2873
ILT
3881 const Symbol_value<32>* psymval,
3882 const int group,
3883 Arm_address address)
3884 {
5c57f1be 3885 gold_assert(group >= 0 && group < 3);
b10d2873
ILT
3886 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3887 Valtype* wv = reinterpret_cast<Valtype*>(view);
3888 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3889
3890 const int sign = (insn & 0x00800000) ? 1 : -1;
3891 int32_t addend = ((insn & 0xff) << 2) * sign;
3892 int32_t x = (psymval->value(object, addend) - address);
3893 // Calculate the relevant G(n-1) value to obtain this stage residual.
3894 Valtype residual =
3895 Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3896 if ((residual & 0x3) != 0 || residual >= 0x400)
3897 return This::STATUS_OVERFLOW;
3898
3899 // Mask out the value and U bit.
3900 insn &= 0xff7fff00;
3901 // Set the U bit for non-negative values.
3902 if (x >= 0)
3903 insn |= 0x00800000;
3904 insn |= (residual >> 2);
3905
3906 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3907 return This::STATUS_OKAY;
3908 }
c121c671
DK
3909};
3910
d204b6e9
DK
3911// Relocate ARM long branches. This handles relocation types
3912// R_ARM_CALL, R_ARM_JUMP24, R_ARM_PLT32 and R_ARM_XPC25.
3913// If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
3914// undefined and we do not use PLT in this relocation. In such a case,
3915// the branch is converted into an NOP.
3916
3917template<bool big_endian>
3918typename Arm_relocate_functions<big_endian>::Status
3919Arm_relocate_functions<big_endian>::arm_branch_common(
3920 unsigned int r_type,
3921 const Relocate_info<32, big_endian>* relinfo,
ca09d69a 3922 unsigned char* view,
d204b6e9
DK
3923 const Sized_symbol<32>* gsym,
3924 const Arm_relobj<big_endian>* object,
3925 unsigned int r_sym,
3926 const Symbol_value<32>* psymval,
3927 Arm_address address,
3928 Arm_address thumb_bit,
3929 bool is_weakly_undefined_without_plt)
3930{
3931 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3932 Valtype* wv = reinterpret_cast<Valtype*>(view);
3933 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2e702c99 3934
d204b6e9 3935 bool insn_is_b = (((val >> 28) & 0xf) <= 0xe)
2e702c99 3936 && ((val & 0x0f000000UL) == 0x0a000000UL);
d204b6e9
DK
3937 bool insn_is_uncond_bl = (val & 0xff000000UL) == 0xeb000000UL;
3938 bool insn_is_cond_bl = (((val >> 28) & 0xf) < 0xe)
3939 && ((val & 0x0f000000UL) == 0x0b000000UL);
3940 bool insn_is_blx = (val & 0xfe000000UL) == 0xfa000000UL;
3941 bool insn_is_any_branch = (val & 0x0e000000UL) == 0x0a000000UL;
3942
3943 // Check that the instruction is valid.
3944 if (r_type == elfcpp::R_ARM_CALL)
3945 {
3946 if (!insn_is_uncond_bl && !insn_is_blx)
3947 return This::STATUS_BAD_RELOC;
3948 }
3949 else if (r_type == elfcpp::R_ARM_JUMP24)
3950 {
3951 if (!insn_is_b && !insn_is_cond_bl)
3952 return This::STATUS_BAD_RELOC;
3953 }
3954 else if (r_type == elfcpp::R_ARM_PLT32)
3955 {
3956 if (!insn_is_any_branch)
3957 return This::STATUS_BAD_RELOC;
3958 }
3959 else if (r_type == elfcpp::R_ARM_XPC25)
3960 {
3961 // FIXME: AAELF document IH0044C does not say much about it other
3962 // than it being obsolete.
3963 if (!insn_is_any_branch)
3964 return This::STATUS_BAD_RELOC;
3965 }
3966 else
3967 gold_unreachable();
3968
3969 // A branch to an undefined weak symbol is turned into a jump to
3970 // the next instruction unless a PLT entry will be created.
3971 // Do the same for local undefined symbols.
3972 // The jump to the next instruction is optimized as a NOP depending
3973 // on the architecture.
3974 const Target_arm<big_endian>* arm_target =
3975 Target_arm<big_endian>::default_target();
3976 if (is_weakly_undefined_without_plt)
3977 {
5c388529 3978 gold_assert(!parameters->options().relocatable());
d204b6e9
DK
3979 Valtype cond = val & 0xf0000000U;
3980 if (arm_target->may_use_arm_nop())
3981 val = cond | 0x0320f000;
3982 else
3983 val = cond | 0x01a00000; // Using pre-UAL nop: mov r0, r0.
3984 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3985 return This::STATUS_OKAY;
3986 }
2e702c99 3987
bef2b434 3988 Valtype addend = Bits<26>::sign_extend32(val << 2);
d204b6e9
DK
3989 Valtype branch_target = psymval->value(object, addend);
3990 int32_t branch_offset = branch_target - address;
3991
3992 // We need a stub if the branch offset is too large or if we need
3993 // to switch mode.
cd6eab1c 3994 bool may_use_blx = arm_target->may_use_v5t_interworking();
d204b6e9 3995 Reloc_stub* stub = NULL;
5c388529
DK
3996
3997 if (!parameters->options().relocatable()
bef2b434 3998 && (Bits<26>::has_overflow32(branch_offset)
5c388529
DK
3999 || ((thumb_bit != 0)
4000 && !(may_use_blx && r_type == elfcpp::R_ARM_CALL))))
d204b6e9 4001 {
2a2b6d42
DK
4002 Valtype unadjusted_branch_target = psymval->value(object, 0);
4003
d204b6e9 4004 Stub_type stub_type =
2a2b6d42
DK
4005 Reloc_stub::stub_type_for_reloc(r_type, address,
4006 unadjusted_branch_target,
d204b6e9
DK
4007 (thumb_bit != 0));
4008 if (stub_type != arm_stub_none)
4009 {
2ea97941 4010 Stub_table<big_endian>* stub_table =
d204b6e9 4011 object->stub_table(relinfo->data_shndx);
2ea97941 4012 gold_assert(stub_table != NULL);
d204b6e9
DK
4013
4014 Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
2ea97941 4015 stub = stub_table->find_reloc_stub(stub_key);
d204b6e9
DK
4016 gold_assert(stub != NULL);
4017 thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
2ea97941 4018 branch_target = stub_table->address() + stub->offset() + addend;
d204b6e9 4019 branch_offset = branch_target - address;
bef2b434 4020 gold_assert(!Bits<26>::has_overflow32(branch_offset));
d204b6e9
DK
4021 }
4022 }
4023
4024 // At this point, if we still need to switch mode, the instruction
4025 // must either be a BLX or a BL that can be converted to a BLX.
4026 if (thumb_bit != 0)
4027 {
4028 // Turn BL to BLX.
4029 gold_assert(may_use_blx && r_type == elfcpp::R_ARM_CALL);
4030 val = (val & 0xffffff) | 0xfa000000 | ((branch_offset & 2) << 23);
4031 }
4032
bef2b434 4033 val = Bits<32>::bit_select32(val, (branch_offset >> 2), 0xffffffUL);
d204b6e9 4034 elfcpp::Swap<32, big_endian>::writeval(wv, val);
bef2b434
ILT
4035 return (Bits<26>::has_overflow32(branch_offset)
4036 ? This::STATUS_OVERFLOW
4037 : This::STATUS_OKAY);
d204b6e9
DK
4038}
4039
51938283
DK
4040// Relocate THUMB long branches. This handles relocation types
4041// R_ARM_THM_CALL, R_ARM_THM_JUMP24 and R_ARM_THM_XPC22.
4042// If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
4043// undefined and we do not use PLT in this relocation. In such a case,
4044// the branch is converted into an NOP.
4045
4046template<bool big_endian>
4047typename Arm_relocate_functions<big_endian>::Status
4048Arm_relocate_functions<big_endian>::thumb_branch_common(
4049 unsigned int r_type,
4050 const Relocate_info<32, big_endian>* relinfo,
ca09d69a 4051 unsigned char* view,
51938283
DK
4052 const Sized_symbol<32>* gsym,
4053 const Arm_relobj<big_endian>* object,
4054 unsigned int r_sym,
4055 const Symbol_value<32>* psymval,
4056 Arm_address address,
4057 Arm_address thumb_bit,
4058 bool is_weakly_undefined_without_plt)
4059{
4060 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
4061 Valtype* wv = reinterpret_cast<Valtype*>(view);
4062 uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
4063 uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
4064
4065 // FIXME: These tests are too loose and do not take THUMB/THUMB-2 difference
4066 // into account.
4067 bool is_bl_insn = (lower_insn & 0x1000U) == 0x1000U;
4068 bool is_blx_insn = (lower_insn & 0x1000U) == 0x0000U;
2e702c99 4069
51938283
DK
4070 // Check that the instruction is valid.
4071 if (r_type == elfcpp::R_ARM_THM_CALL)
4072 {
4073 if (!is_bl_insn && !is_blx_insn)
4074 return This::STATUS_BAD_RELOC;
4075 }
4076 else if (r_type == elfcpp::R_ARM_THM_JUMP24)
4077 {
4078 // This cannot be a BLX.
4079 if (!is_bl_insn)
4080 return This::STATUS_BAD_RELOC;
4081 }
4082 else if (r_type == elfcpp::R_ARM_THM_XPC22)
4083 {
4084 // Check for Thumb to Thumb call.
4085 if (!is_blx_insn)
4086 return This::STATUS_BAD_RELOC;
4087 if (thumb_bit != 0)
4088 {
4089 gold_warning(_("%s: Thumb BLX instruction targets "
4090 "thumb function '%s'."),
4091 object->name().c_str(),
2e702c99 4092 (gsym ? gsym->name() : "(local)"));
51938283
DK
4093 // Convert BLX to BL.
4094 lower_insn |= 0x1000U;
4095 }
4096 }
4097 else
4098 gold_unreachable();
4099
4100 // A branch to an undefined weak symbol is turned into a jump to
4101 // the next instruction unless a PLT entry will be created.
4102 // The jump to the next instruction is optimized as a NOP.W for
4103 // Thumb-2 enabled architectures.
4104 const Target_arm<big_endian>* arm_target =
4105 Target_arm<big_endian>::default_target();
4106 if (is_weakly_undefined_without_plt)
4107 {
5c388529 4108 gold_assert(!parameters->options().relocatable());
51938283
DK
4109 if (arm_target->may_use_thumb2_nop())
4110 {
4111 elfcpp::Swap<16, big_endian>::writeval(wv, 0xf3af);
4112 elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0x8000);
4113 }
4114 else
4115 {
4116 elfcpp::Swap<16, big_endian>::writeval(wv, 0xe000);
4117 elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0xbf00);
4118 }
4119 return This::STATUS_OKAY;
4120 }
2e702c99 4121
089d69dc 4122 int32_t addend = This::thumb32_branch_offset(upper_insn, lower_insn);
51938283 4123 Arm_address branch_target = psymval->value(object, addend);
a2c7281b
DK
4124
4125 // For BLX, bit 1 of target address comes from bit 1 of base address.
cd6eab1c 4126 bool may_use_blx = arm_target->may_use_v5t_interworking();
a2c7281b 4127 if (thumb_bit == 0 && may_use_blx)
bef2b434 4128 branch_target = Bits<32>::bit_select32(branch_target, address, 0x2);
a2c7281b 4129
51938283
DK
4130 int32_t branch_offset = branch_target - address;
4131
4132 // We need a stub if the branch offset is too large or if we need
4133 // to switch mode.
51938283 4134 bool thumb2 = arm_target->using_thumb2();
5c388529 4135 if (!parameters->options().relocatable()
bef2b434
ILT
4136 && ((!thumb2 && Bits<23>::has_overflow32(branch_offset))
4137 || (thumb2 && Bits<25>::has_overflow32(branch_offset))
5c388529
DK
4138 || ((thumb_bit == 0)
4139 && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
4140 || r_type == elfcpp::R_ARM_THM_JUMP24))))
51938283 4141 {
2a2b6d42
DK
4142 Arm_address unadjusted_branch_target = psymval->value(object, 0);
4143
51938283 4144 Stub_type stub_type =
2a2b6d42
DK
4145 Reloc_stub::stub_type_for_reloc(r_type, address,
4146 unadjusted_branch_target,
51938283 4147 (thumb_bit != 0));
2a2b6d42 4148
51938283
DK
4149 if (stub_type != arm_stub_none)
4150 {
2ea97941 4151 Stub_table<big_endian>* stub_table =
51938283 4152 object->stub_table(relinfo->data_shndx);
2ea97941 4153 gold_assert(stub_table != NULL);
51938283
DK
4154
4155 Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
2ea97941 4156 Reloc_stub* stub = stub_table->find_reloc_stub(stub_key);
51938283
DK
4157 gold_assert(stub != NULL);
4158 thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
2ea97941 4159 branch_target = stub_table->address() + stub->offset() + addend;
2e702c99 4160 if (thumb_bit == 0 && may_use_blx)
bef2b434 4161 branch_target = Bits<32>::bit_select32(branch_target, address, 0x2);
51938283
DK
4162 branch_offset = branch_target - address;
4163 }
4164 }
4165
4166 // At this point, if we still need to switch mode, the instruction
4167 // must either be a BLX or a BL that can be converted to a BLX.
4168 if (thumb_bit == 0)
4169 {
4170 gold_assert(may_use_blx
4171 && (r_type == elfcpp::R_ARM_THM_CALL
4172 || r_type == elfcpp::R_ARM_THM_XPC22));
4173 // Make sure this is a BLX.
4174 lower_insn &= ~0x1000U;
4175 }
4176 else
4177 {
4178 // Make sure this is a BL.
4179 lower_insn |= 0x1000U;
4180 }
4181
a2c7281b
DK
4182 // For a BLX instruction, make sure that the relocation is rounded up
4183 // to a word boundary. This follows the semantics of the instruction
4184 // which specifies that bit 1 of the target address will come from bit
4185 // 1 of the base address.
51938283 4186 if ((lower_insn & 0x5000U) == 0x4000U)
a2c7281b 4187 gold_assert((branch_offset & 3) == 0);
51938283
DK
4188
4189 // Put BRANCH_OFFSET back into the insn. Assumes two's complement.
4190 // We use the Thumb-2 encoding, which is safe even if dealing with
4191 // a Thumb-1 instruction by virtue of our overflow check above. */
089d69dc
DK
4192 upper_insn = This::thumb32_branch_upper(upper_insn, branch_offset);
4193 lower_insn = This::thumb32_branch_lower(lower_insn, branch_offset);
51938283
DK
4194
4195 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
4196 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
4197
bef2b434 4198 gold_assert(!Bits<25>::has_overflow32(branch_offset));
a2c7281b 4199
51938283 4200 return ((thumb2
bef2b434
ILT
4201 ? Bits<25>::has_overflow32(branch_offset)
4202 : Bits<23>::has_overflow32(branch_offset))
089d69dc
DK
4203 ? This::STATUS_OVERFLOW
4204 : This::STATUS_OKAY);
4205}
4206
4207// Relocate THUMB-2 long conditional branches.
4208// If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
4209// undefined and we do not use PLT in this relocation. In such a case,
4210// the branch is converted into an NOP.
4211
4212template<bool big_endian>
4213typename Arm_relocate_functions<big_endian>::Status
4214Arm_relocate_functions<big_endian>::thm_jump19(
ca09d69a 4215 unsigned char* view,
089d69dc
DK
4216 const Arm_relobj<big_endian>* object,
4217 const Symbol_value<32>* psymval,
4218 Arm_address address,
4219 Arm_address thumb_bit)
4220{
4221 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
4222 Valtype* wv = reinterpret_cast<Valtype*>(view);
4223 uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
4224 uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
4225 int32_t addend = This::thumb32_cond_branch_offset(upper_insn, lower_insn);
4226
4227 Arm_address branch_target = psymval->value(object, addend);
4228 int32_t branch_offset = branch_target - address;
4229
4230 // ??? Should handle interworking? GCC might someday try to
4231 // use this for tail calls.
4232 // FIXME: We do support thumb entry to PLT yet.
4233 if (thumb_bit == 0)
4234 {
4235 gold_error(_("conditional branch to PLT in THUMB-2 not supported yet."));
4236 return This::STATUS_BAD_RELOC;
4237 }
4238
4239 // Put RELOCATION back into the insn.
4240 upper_insn = This::thumb32_cond_branch_upper(upper_insn, branch_offset);
4241 lower_insn = This::thumb32_cond_branch_lower(lower_insn, branch_offset);
4242
4243 // Put the relocated value back in the object file:
4244 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
4245 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
4246
bef2b434 4247 return (Bits<21>::has_overflow32(branch_offset)
51938283
DK
4248 ? This::STATUS_OVERFLOW
4249 : This::STATUS_OKAY);
4250}
4251
94cdfcff
DK
4252// Get the GOT section, creating it if necessary.
4253
4254template<bool big_endian>
4a54abbb 4255Arm_output_data_got<big_endian>*
94cdfcff
DK
4256Target_arm<big_endian>::got_section(Symbol_table* symtab, Layout* layout)
4257{
4258 if (this->got_ == NULL)
4259 {
4260 gold_assert(symtab != NULL && layout != NULL);
4261
7b8957f8
DK
4262 // When using -z now, we can treat .got as a relro section.
4263 // Without -z now, it is modified after program startup by lazy
4264 // PLT relocations.
4265 bool is_got_relro = parameters->options().now();
4266 Output_section_order got_order = (is_got_relro
4267 ? ORDER_RELRO_LAST
4268 : ORDER_DATA);
4269
4270 // Unlike some targets (.e.g x86), ARM does not use separate .got and
4271 // .got.plt sections in output. The output .got section contains both
4272 // PLT and non-PLT GOT entries.
4a54abbb 4273 this->got_ = new Arm_output_data_got<big_endian>(symtab, layout);
94cdfcff 4274
82742395 4275 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
0c91cf04 4276 (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE),
7b8957f8 4277 this->got_, got_order, is_got_relro);
22f0da72 4278
94cdfcff
DK
4279 // The old GNU linker creates a .got.plt section. We just
4280 // create another set of data in the .got section. Note that we
4281 // always create a PLT if we create a GOT, although the PLT
4282 // might be empty.
4283 this->got_plt_ = new Output_data_space(4, "** GOT PLT");
82742395 4284 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
0c91cf04 4285 (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE),
7b8957f8 4286 this->got_plt_, got_order, is_got_relro);
94cdfcff
DK
4287
4288 // The first three entries are reserved.
4289 this->got_plt_->set_current_data_size(3 * 4);
4290
4291 // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
4292 symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
99fff23b 4293 Symbol_table::PREDEFINED,
94cdfcff
DK
4294 this->got_plt_,
4295 0, 0, elfcpp::STT_OBJECT,
4296 elfcpp::STB_LOCAL,
4297 elfcpp::STV_HIDDEN, 0,
4298 false, false);
fa89cc82
HS
4299
4300 // If there are any IRELATIVE relocations, they get GOT entries
4301 // in .got.plt after the jump slot entries.
4302 this->got_irelative_ = new Output_data_space(4, "** GOT IRELATIVE PLT");
4303 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
4304 (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE),
4305 this->got_irelative_,
4306 got_order, is_got_relro);
4307
94cdfcff
DK
4308 }
4309 return this->got_;
4310}
4311
4312// Get the dynamic reloc section, creating it if necessary.
4313
4314template<bool big_endian>
4315typename Target_arm<big_endian>::Reloc_section*
4316Target_arm<big_endian>::rel_dyn_section(Layout* layout)
4317{
4318 if (this->rel_dyn_ == NULL)
4319 {
4320 gold_assert(layout != NULL);
fa89cc82
HS
4321 // Create both relocation sections in the same place, so as to ensure
4322 // their relative order in the output section.
94cdfcff 4323 this->rel_dyn_ = new Reloc_section(parameters->options().combreloc());
fa89cc82 4324 this->rel_irelative_ = new Reloc_section(false);
94cdfcff 4325 layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
22f0da72
ILT
4326 elfcpp::SHF_ALLOC, this->rel_dyn_,
4327 ORDER_DYNAMIC_RELOCS, false);
fa89cc82
HS
4328 layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
4329 elfcpp::SHF_ALLOC, this->rel_irelative_,
4330 ORDER_DYNAMIC_RELOCS, false);
94cdfcff
DK
4331 }
4332 return this->rel_dyn_;
4333}
4334
fa89cc82
HS
4335
4336// Get the section to use for IRELATIVE relocs, creating it if necessary. These
4337// go in .rela.dyn, but only after all other dynamic relocations. They need to
4338// follow the other dynamic relocations so that they can refer to global
4339// variables initialized by those relocs.
4340
4341template<bool big_endian>
4342typename Target_arm<big_endian>::Reloc_section*
4343Target_arm<big_endian>::rel_irelative_section(Layout* layout)
4344{
4345 if (this->rel_irelative_ == NULL)
4346 {
4347 // Delegate the creation to rel_dyn_section so as to ensure their order in
4348 // the output section.
4349 this->rel_dyn_section(layout);
4350 gold_assert(this->rel_irelative_ != NULL
4351 && (this->rel_dyn_->output_section()
4352 == this->rel_irelative_->output_section()));
4353 }
4354 return this->rel_irelative_;
4355}
4356
4357
b569affa
DK
4358// Insn_template methods.
4359
4360// Return byte size of an instruction template.
4361
4362size_t
4363Insn_template::size() const
4364{
4365 switch (this->type())
4366 {
4367 case THUMB16_TYPE:
2fb7225c 4368 case THUMB16_SPECIAL_TYPE:
b569affa
DK
4369 return 2;
4370 case ARM_TYPE:
4371 case THUMB32_TYPE:
4372 case DATA_TYPE:
4373 return 4;
4374 default:
4375 gold_unreachable();
4376 }
4377}
4378
4379// Return alignment of an instruction template.
4380
4381unsigned
4382Insn_template::alignment() const
4383{
4384 switch (this->type())
4385 {
4386 case THUMB16_TYPE:
2fb7225c 4387 case THUMB16_SPECIAL_TYPE:
b569affa
DK
4388 case THUMB32_TYPE:
4389 return 2;
4390 case ARM_TYPE:
4391 case DATA_TYPE:
4392 return 4;
4393 default:
4394 gold_unreachable();
4395 }
4396}
4397
4398// Stub_template methods.
4399
4400Stub_template::Stub_template(
2ea97941
ILT
4401 Stub_type type, const Insn_template* insns,
4402 size_t insn_count)
4403 : type_(type), insns_(insns), insn_count_(insn_count), alignment_(1),
b569affa
DK
4404 entry_in_thumb_mode_(false), relocs_()
4405{
2ea97941 4406 off_t offset = 0;
b569affa
DK
4407
4408 // Compute byte size and alignment of stub template.
2ea97941 4409 for (size_t i = 0; i < insn_count; i++)
b569affa 4410 {
2ea97941
ILT
4411 unsigned insn_alignment = insns[i].alignment();
4412 size_t insn_size = insns[i].size();
4413 gold_assert((offset & (insn_alignment - 1)) == 0);
b569affa 4414 this->alignment_ = std::max(this->alignment_, insn_alignment);
2ea97941 4415 switch (insns[i].type())
b569affa
DK
4416 {
4417 case Insn_template::THUMB16_TYPE:
089d69dc 4418 case Insn_template::THUMB16_SPECIAL_TYPE:
b569affa
DK
4419 if (i == 0)
4420 this->entry_in_thumb_mode_ = true;
4421 break;
4422
4423 case Insn_template::THUMB32_TYPE:
2e702c99 4424 if (insns[i].r_type() != elfcpp::R_ARM_NONE)
2ea97941 4425 this->relocs_.push_back(Reloc(i, offset));
b569affa
DK
4426 if (i == 0)
4427 this->entry_in_thumb_mode_ = true;
2e702c99 4428 break;
b569affa
DK
4429
4430 case Insn_template::ARM_TYPE:
4431 // Handle cases where the target is encoded within the
4432 // instruction.
2ea97941
ILT
4433 if (insns[i].r_type() == elfcpp::R_ARM_JUMP24)
4434 this->relocs_.push_back(Reloc(i, offset));
b569affa
DK
4435 break;
4436
4437 case Insn_template::DATA_TYPE:
4438 // Entry point cannot be data.
4439 gold_assert(i != 0);
2ea97941 4440 this->relocs_.push_back(Reloc(i, offset));
b569affa
DK
4441 break;
4442
4443 default:
4444 gold_unreachable();
4445 }
2e702c99 4446 offset += insn_size;
b569affa 4447 }
2ea97941 4448 this->size_ = offset;
b569affa
DK
4449}
4450
bb0d3eb0
DK
4451// Stub methods.
4452
7296d933 4453// Template to implement do_write for a specific target endianness.
bb0d3eb0
DK
4454
4455template<bool big_endian>
4456void inline
4457Stub::do_fixed_endian_write(unsigned char* view, section_size_type view_size)
4458{
4459 const Stub_template* stub_template = this->stub_template();
4460 const Insn_template* insns = stub_template->insns();
4461
4462 // FIXME: We do not handle BE8 encoding yet.
4463 unsigned char* pov = view;
4464 for (size_t i = 0; i < stub_template->insn_count(); i++)
4465 {
4466 switch (insns[i].type())
4467 {
4468 case Insn_template::THUMB16_TYPE:
4469 elfcpp::Swap<16, big_endian>::writeval(pov, insns[i].data() & 0xffff);
4470 break;
4471 case Insn_template::THUMB16_SPECIAL_TYPE:
4472 elfcpp::Swap<16, big_endian>::writeval(
4473 pov,
4474 this->thumb16_special(i));
4475 break;
4476 case Insn_template::THUMB32_TYPE:
4477 {
4478 uint32_t hi = (insns[i].data() >> 16) & 0xffff;
4479 uint32_t lo = insns[i].data() & 0xffff;
4480 elfcpp::Swap<16, big_endian>::writeval(pov, hi);
4481 elfcpp::Swap<16, big_endian>::writeval(pov + 2, lo);
4482 }
2e702c99 4483 break;
bb0d3eb0
DK
4484 case Insn_template::ARM_TYPE:
4485 case Insn_template::DATA_TYPE:
4486 elfcpp::Swap<32, big_endian>::writeval(pov, insns[i].data());
4487 break;
4488 default:
4489 gold_unreachable();
4490 }
4491 pov += insns[i].size();
4492 }
4493 gold_assert(static_cast<section_size_type>(pov - view) == view_size);
2e702c99 4494}
bb0d3eb0 4495
b569affa
DK
4496// Reloc_stub::Key methods.
4497
4498// Dump a Key as a string for debugging.
4499
4500std::string
4501Reloc_stub::Key::name() const
4502{
4503 if (this->r_sym_ == invalid_index)
4504 {
4505 // Global symbol key name
4506 // <stub-type>:<symbol name>:<addend>.
4507 const std::string sym_name = this->u_.symbol->name();
4508 // We need to print two hex number and two colons. So just add 100 bytes
4509 // to the symbol name size.
4510 size_t len = sym_name.size() + 100;
4511 char* buffer = new char[len];
4512 int c = snprintf(buffer, len, "%d:%s:%x", this->stub_type_,
4513 sym_name.c_str(), this->addend_);
4514 gold_assert(c > 0 && c < static_cast<int>(len));
4515 delete[] buffer;
4516 return std::string(buffer);
4517 }
4518 else
4519 {
4520 // local symbol key name
4521 // <stub-type>:<object>:<r_sym>:<addend>.
4522 const size_t len = 200;
4523 char buffer[len];
4524 int c = snprintf(buffer, len, "%d:%p:%u:%x", this->stub_type_,
4525 this->u_.relobj, this->r_sym_, this->addend_);
4526 gold_assert(c > 0 && c < static_cast<int>(len));
4527 return std::string(buffer);
4528 }
4529}
4530
4531// Reloc_stub methods.
4532
4533// Determine the type of stub needed, if any, for a relocation of R_TYPE at
4534// LOCATION to DESTINATION.
4535// This code is based on the arm_type_of_stub function in
9b547ce6 4536// bfd/elf32-arm.c. We have changed the interface a little to keep the Stub
b569affa
DK
4537// class simple.
4538
4539Stub_type
4540Reloc_stub::stub_type_for_reloc(
4541 unsigned int r_type,
4542 Arm_address location,
4543 Arm_address destination,
4544 bool target_is_thumb)
4545{
4546 Stub_type stub_type = arm_stub_none;
4547
4548 // This is a bit ugly but we want to avoid using a templated class for
4549 // big and little endianities.
4550 bool may_use_blx;
cdb06167 4551 bool should_force_pic_veneer = parameters->options().pic_veneer();
b569affa
DK
4552 bool thumb2;
4553 bool thumb_only;
4554 if (parameters->target().is_big_endian())
4555 {
43d12afe 4556 const Target_arm<true>* big_endian_target =
b569affa 4557 Target_arm<true>::default_target();
cd6eab1c 4558 may_use_blx = big_endian_target->may_use_v5t_interworking();
cdb06167 4559 should_force_pic_veneer |= big_endian_target->should_force_pic_veneer();
43d12afe
DK
4560 thumb2 = big_endian_target->using_thumb2();
4561 thumb_only = big_endian_target->using_thumb_only();
b569affa
DK
4562 }
4563 else
4564 {
43d12afe 4565 const Target_arm<false>* little_endian_target =
b569affa 4566 Target_arm<false>::default_target();
cd6eab1c 4567 may_use_blx = little_endian_target->may_use_v5t_interworking();
cdb06167
HS
4568 should_force_pic_veneer |=
4569 little_endian_target->should_force_pic_veneer();
43d12afe
DK
4570 thumb2 = little_endian_target->using_thumb2();
4571 thumb_only = little_endian_target->using_thumb_only();
b569affa
DK
4572 }
4573
a2c7281b 4574 int64_t branch_offset;
90cff06f
DK
4575 bool output_is_position_independent =
4576 parameters->options().output_is_position_independent();
b569affa
DK
4577 if (r_type == elfcpp::R_ARM_THM_CALL || r_type == elfcpp::R_ARM_THM_JUMP24)
4578 {
a2c7281b
DK
4579 // For THUMB BLX instruction, bit 1 of target comes from bit 1 of the
4580 // base address (instruction address + 4).
4581 if ((r_type == elfcpp::R_ARM_THM_CALL) && may_use_blx && !target_is_thumb)
bef2b434 4582 destination = Bits<32>::bit_select32(destination, location, 0x2);
a2c7281b 4583 branch_offset = static_cast<int64_t>(destination) - location;
2e702c99 4584
b569affa
DK
4585 // Handle cases where:
4586 // - this call goes too far (different Thumb/Thumb2 max
4587 // distance)
4588 // - it's a Thumb->Arm call and blx is not available, or it's a
4589 // Thumb->Arm branch (not bl). A stub is needed in this case.
4590 if ((!thumb2
4591 && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
4592 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
4593 || (thumb2
4594 && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
4595 || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
4596 || ((!target_is_thumb)
4597 && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
4598 || (r_type == elfcpp::R_ARM_THM_JUMP24))))
4599 {
4600 if (target_is_thumb)
4601 {
4602 // Thumb to thumb.
4603 if (!thumb_only)
4604 {
90cff06f 4605 stub_type = (output_is_position_independent
51938283 4606 || should_force_pic_veneer)
b569affa
DK
4607 // PIC stubs.
4608 ? ((may_use_blx
4609 && (r_type == elfcpp::R_ARM_THM_CALL))
4610 // V5T and above. Stub starts with ARM code, so
4611 // we must be able to switch mode before
4612 // reaching it, which is only possible for 'bl'
4613 // (ie R_ARM_THM_CALL relocation).
4614 ? arm_stub_long_branch_any_thumb_pic
4615 // On V4T, use Thumb code only.
4616 : arm_stub_long_branch_v4t_thumb_thumb_pic)
4617
4618 // non-PIC stubs.
4619 : ((may_use_blx
4620 && (r_type == elfcpp::R_ARM_THM_CALL))
4621 ? arm_stub_long_branch_any_any // V5T and above.
4622 : arm_stub_long_branch_v4t_thumb_thumb); // V4T.
4623 }
4624 else
4625 {
90cff06f 4626 stub_type = (output_is_position_independent
51938283 4627 || should_force_pic_veneer)
b569affa
DK
4628 ? arm_stub_long_branch_thumb_only_pic // PIC stub.
4629 : arm_stub_long_branch_thumb_only; // non-PIC stub.
4630 }
4631 }
4632 else
4633 {
4634 // Thumb to arm.
2e702c99 4635
b569affa
DK
4636 // FIXME: We should check that the input section is from an
4637 // object that has interwork enabled.
4638
90cff06f 4639 stub_type = (output_is_position_independent
b569affa
DK
4640 || should_force_pic_veneer)
4641 // PIC stubs.
4642 ? ((may_use_blx
4643 && (r_type == elfcpp::R_ARM_THM_CALL))
4644 ? arm_stub_long_branch_any_arm_pic // V5T and above.
4645 : arm_stub_long_branch_v4t_thumb_arm_pic) // V4T.
4646
4647 // non-PIC stubs.
4648 : ((may_use_blx
4649 && (r_type == elfcpp::R_ARM_THM_CALL))
4650 ? arm_stub_long_branch_any_any // V5T and above.
4651 : arm_stub_long_branch_v4t_thumb_arm); // V4T.
4652
4653 // Handle v4t short branches.
4654 if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
4655 && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
4656 && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
4657 stub_type = arm_stub_short_branch_v4t_thumb_arm;
4658 }
4659 }
4660 }
4661 else if (r_type == elfcpp::R_ARM_CALL
4662 || r_type == elfcpp::R_ARM_JUMP24
4663 || r_type == elfcpp::R_ARM_PLT32)
4664 {
a2c7281b 4665 branch_offset = static_cast<int64_t>(destination) - location;
b569affa
DK
4666 if (target_is_thumb)
4667 {
4668 // Arm to thumb.
4669
4670 // FIXME: We should check that the input section is from an
4671 // object that has interwork enabled.
4672
4673 // We have an extra 2-bytes reach because of
4674 // the mode change (bit 24 (H) of BLX encoding).
4675 if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
4676 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
4677 || ((r_type == elfcpp::R_ARM_CALL) && !may_use_blx)
4678 || (r_type == elfcpp::R_ARM_JUMP24)
4679 || (r_type == elfcpp::R_ARM_PLT32))
4680 {
90cff06f 4681 stub_type = (output_is_position_independent
b569affa
DK
4682 || should_force_pic_veneer)
4683 // PIC stubs.
4684 ? (may_use_blx
4685 ? arm_stub_long_branch_any_thumb_pic// V5T and above.
4686 : arm_stub_long_branch_v4t_arm_thumb_pic) // V4T stub.
4687
4688 // non-PIC stubs.
4689 : (may_use_blx
4690 ? arm_stub_long_branch_any_any // V5T and above.
4691 : arm_stub_long_branch_v4t_arm_thumb); // V4T.
4692 }
4693 }
4694 else
4695 {
4696 // Arm to arm.
4697 if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
4698 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
4699 {
90cff06f 4700 stub_type = (output_is_position_independent
b569affa
DK
4701 || should_force_pic_veneer)
4702 ? arm_stub_long_branch_any_arm_pic // PIC stubs.
4703 : arm_stub_long_branch_any_any; /// non-PIC.
4704 }
4705 }
4706 }
4707
4708 return stub_type;
4709}
4710
bb0d3eb0 4711// Cortex_a8_stub methods.
b569affa 4712
bb0d3eb0
DK
4713// Return the instruction for a THUMB16_SPECIAL_TYPE instruction template.
4714// I is the position of the instruction template in the stub template.
b569affa 4715
bb0d3eb0
DK
4716uint16_t
4717Cortex_a8_stub::do_thumb16_special(size_t i)
b569affa 4718{
bb0d3eb0
DK
4719 // The only use of this is to copy condition code from a conditional
4720 // branch being worked around to the corresponding conditional branch in
4721 // to the stub.
4722 gold_assert(this->stub_template()->type() == arm_stub_a8_veneer_b_cond
4723 && i == 0);
4724 uint16_t data = this->stub_template()->insns()[i].data();
4725 gold_assert((data & 0xff00U) == 0xd000U);
4726 data |= ((this->original_insn_ >> 22) & 0xf) << 8;
4727 return data;
b569affa
DK
4728}
4729
4730// Stub_factory methods.
4731
4732Stub_factory::Stub_factory()
4733{
4734 // The instruction template sequences are declared as static
4735 // objects and initialized first time the constructor runs.
2e702c99 4736
b569affa
DK
4737 // Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
4738 // to reach the stub if necessary.
4739 static const Insn_template elf32_arm_stub_long_branch_any_any[] =
4740 {
4741 Insn_template::arm_insn(0xe51ff004), // ldr pc, [pc, #-4]
4742 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
2e702c99 4743 // dcd R_ARM_ABS32(X)
b569affa 4744 };
2e702c99 4745
b569affa
DK
4746 // V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
4747 // available.
4748 static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb[] =
4749 {
4750 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
4751 Insn_template::arm_insn(0xe12fff1c), // bx ip
4752 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
2e702c99 4753 // dcd R_ARM_ABS32(X)
b569affa 4754 };
2e702c99 4755
b569affa
DK
4756 // Thumb -> Thumb long branch stub. Used on M-profile architectures.
4757 static const Insn_template elf32_arm_stub_long_branch_thumb_only[] =
4758 {
4759 Insn_template::thumb16_insn(0xb401), // push {r0}
4760 Insn_template::thumb16_insn(0x4802), // ldr r0, [pc, #8]
4761 Insn_template::thumb16_insn(0x4684), // mov ip, r0
4762 Insn_template::thumb16_insn(0xbc01), // pop {r0}
4763 Insn_template::thumb16_insn(0x4760), // bx ip
4764 Insn_template::thumb16_insn(0xbf00), // nop
4765 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
2e702c99 4766 // dcd R_ARM_ABS32(X)
b569affa 4767 };
2e702c99 4768
b569affa
DK
4769 // V4T Thumb -> Thumb long branch stub. Using the stack is not
4770 // allowed.
4771 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb[] =
4772 {
4773 Insn_template::thumb16_insn(0x4778), // bx pc
4774 Insn_template::thumb16_insn(0x46c0), // nop
4775 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
4776 Insn_template::arm_insn(0xe12fff1c), // bx ip
4777 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
2e702c99 4778 // dcd R_ARM_ABS32(X)
b569affa 4779 };
2e702c99 4780
b569affa
DK
4781 // V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
4782 // available.
4783 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm[] =
4784 {
4785 Insn_template::thumb16_insn(0x4778), // bx pc
4786 Insn_template::thumb16_insn(0x46c0), // nop
4787 Insn_template::arm_insn(0xe51ff004), // ldr pc, [pc, #-4]
4788 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
2e702c99 4789 // dcd R_ARM_ABS32(X)
b569affa 4790 };
2e702c99 4791
b569affa
DK
4792 // V4T Thumb -> ARM short branch stub. Shorter variant of the above
4793 // one, when the destination is close enough.
4794 static const Insn_template elf32_arm_stub_short_branch_v4t_thumb_arm[] =
4795 {
4796 Insn_template::thumb16_insn(0x4778), // bx pc
4797 Insn_template::thumb16_insn(0x46c0), // nop
4798 Insn_template::arm_rel_insn(0xea000000, -8), // b (X-8)
4799 };
2e702c99 4800
b569affa
DK
4801 // ARM/Thumb -> ARM long branch stub, PIC. On V5T and above, use
4802 // blx to reach the stub if necessary.
4803 static const Insn_template elf32_arm_stub_long_branch_any_arm_pic[] =
4804 {
4805 Insn_template::arm_insn(0xe59fc000), // ldr r12, [pc]
4806 Insn_template::arm_insn(0xe08ff00c), // add pc, pc, ip
4807 Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
2e702c99 4808 // dcd R_ARM_REL32(X-4)
b569affa 4809 };
2e702c99 4810
b569affa
DK
4811 // ARM/Thumb -> Thumb long branch stub, PIC. On V5T and above, use
4812 // blx to reach the stub if necessary. We can not add into pc;
4813 // it is not guaranteed to mode switch (different in ARMv6 and
4814 // ARMv7).
4815 static const Insn_template elf32_arm_stub_long_branch_any_thumb_pic[] =
4816 {
4817 Insn_template::arm_insn(0xe59fc004), // ldr r12, [pc, #4]
4818 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
4819 Insn_template::arm_insn(0xe12fff1c), // bx ip
4820 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
2e702c99 4821 // dcd R_ARM_REL32(X)
b569affa 4822 };
2e702c99 4823
b569affa
DK
4824 // V4T ARM -> ARM long branch stub, PIC.
4825 static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb_pic[] =
4826 {
4827 Insn_template::arm_insn(0xe59fc004), // ldr ip, [pc, #4]
4828 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
4829 Insn_template::arm_insn(0xe12fff1c), // bx ip
4830 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
2e702c99 4831 // dcd R_ARM_REL32(X)
b569affa 4832 };
2e702c99 4833
b569affa
DK
4834 // V4T Thumb -> ARM long branch stub, PIC.
4835 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm_pic[] =
4836 {
4837 Insn_template::thumb16_insn(0x4778), // bx pc
4838 Insn_template::thumb16_insn(0x46c0), // nop
4839 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
4840 Insn_template::arm_insn(0xe08cf00f), // add pc, ip, pc
4841 Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
2e702c99 4842 // dcd R_ARM_REL32(X)
b569affa 4843 };
2e702c99 4844
b569affa
DK
4845 // Thumb -> Thumb long branch stub, PIC. Used on M-profile
4846 // architectures.
4847 static const Insn_template elf32_arm_stub_long_branch_thumb_only_pic[] =
4848 {
4849 Insn_template::thumb16_insn(0xb401), // push {r0}
4850 Insn_template::thumb16_insn(0x4802), // ldr r0, [pc, #8]
4851 Insn_template::thumb16_insn(0x46fc), // mov ip, pc
4852 Insn_template::thumb16_insn(0x4484), // add ip, r0
4853 Insn_template::thumb16_insn(0xbc01), // pop {r0}
4854 Insn_template::thumb16_insn(0x4760), // bx ip
4855 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 4),
2e702c99 4856 // dcd R_ARM_REL32(X)
b569affa 4857 };
2e702c99 4858
b569affa
DK
4859 // V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
4860 // allowed.
4861 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb_pic[] =
4862 {
4863 Insn_template::thumb16_insn(0x4778), // bx pc
4864 Insn_template::thumb16_insn(0x46c0), // nop
4865 Insn_template::arm_insn(0xe59fc004), // ldr ip, [pc, #4]
4866 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
4867 Insn_template::arm_insn(0xe12fff1c), // bx ip
4868 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
2e702c99 4869 // dcd R_ARM_REL32(X)
b569affa 4870 };
2e702c99 4871
b569affa 4872 // Cortex-A8 erratum-workaround stubs.
2e702c99 4873
b569affa
DK
4874 // Stub used for conditional branches (which may be beyond +/-1MB away,
4875 // so we can't use a conditional branch to reach this stub).
2e702c99 4876
b569affa
DK
4877 // original code:
4878 //
4879 // b<cond> X
4880 // after:
4881 //
4882 static const Insn_template elf32_arm_stub_a8_veneer_b_cond[] =
4883 {
4884 Insn_template::thumb16_bcond_insn(0xd001), // b<cond>.n true
4885 Insn_template::thumb32_b_insn(0xf000b800, -4), // b.w after
4886 Insn_template::thumb32_b_insn(0xf000b800, -4) // true:
2e702c99 4887 // b.w X
b569affa 4888 };
2e702c99 4889
b569affa 4890 // Stub used for b.w and bl.w instructions.
2e702c99 4891
b569affa
DK
4892 static const Insn_template elf32_arm_stub_a8_veneer_b[] =
4893 {
4894 Insn_template::thumb32_b_insn(0xf000b800, -4) // b.w dest
4895 };
2e702c99 4896
b569affa
DK
4897 static const Insn_template elf32_arm_stub_a8_veneer_bl[] =
4898 {
4899 Insn_template::thumb32_b_insn(0xf000b800, -4) // b.w dest
4900 };
2e702c99 4901
b569affa
DK
4902 // Stub used for Thumb-2 blx.w instructions. We modified the original blx.w
4903 // instruction (which switches to ARM mode) to point to this stub. Jump to
4904 // the real destination using an ARM-mode branch.
bb0d3eb0 4905 static const Insn_template elf32_arm_stub_a8_veneer_blx[] =
b569affa
DK
4906 {
4907 Insn_template::arm_rel_insn(0xea000000, -8) // b dest
4908 };
4909
a2162063
ILT
4910 // Stub used to provide an interworking for R_ARM_V4BX relocation
4911 // (bx r[n] instruction).
4912 static const Insn_template elf32_arm_stub_v4_veneer_bx[] =
4913 {
4914 Insn_template::arm_insn(0xe3100001), // tst r<n>, #1
4915 Insn_template::arm_insn(0x01a0f000), // moveq pc, r<n>
4916 Insn_template::arm_insn(0xe12fff10) // bx r<n>
4917 };
4918
b569affa
DK
4919 // Fill in the stub template look-up table. Stub templates are constructed
4920 // per instance of Stub_factory for fast look-up without locking
4921 // in a thread-enabled environment.
4922
4923 this->stub_templates_[arm_stub_none] =
4924 new Stub_template(arm_stub_none, NULL, 0);
4925
4926#define DEF_STUB(x) \
4927 do \
4928 { \
4929 size_t array_size \
4930 = sizeof(elf32_arm_stub_##x) / sizeof(elf32_arm_stub_##x[0]); \
4931 Stub_type type = arm_stub_##x; \
4932 this->stub_templates_[type] = \
4933 new Stub_template(type, elf32_arm_stub_##x, array_size); \
4934 } \
4935 while (0);
4936
4937 DEF_STUBS
4938#undef DEF_STUB
4939}
4940
56ee5e00
DK
4941// Stub_table methods.
4942
9b547ce6 4943// Remove all Cortex-A8 stub.
56ee5e00
DK
4944
4945template<bool big_endian>
4946void
2fb7225c
DK
4947Stub_table<big_endian>::remove_all_cortex_a8_stubs()
4948{
4949 for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
4950 p != this->cortex_a8_stubs_.end();
4951 ++p)
4952 delete p->second;
4953 this->cortex_a8_stubs_.clear();
4954}
4955
4956// Relocate one stub. This is a helper for Stub_table::relocate_stubs().
4957
4958template<bool big_endian>
4959void
4960Stub_table<big_endian>::relocate_stub(
4961 Stub* stub,
4962 const Relocate_info<32, big_endian>* relinfo,
4963 Target_arm<big_endian>* arm_target,
4964 Output_section* output_section,
4965 unsigned char* view,
4966 Arm_address address,
4967 section_size_type view_size)
56ee5e00 4968{
2ea97941 4969 const Stub_template* stub_template = stub->stub_template();
2fb7225c
DK
4970 if (stub_template->reloc_count() != 0)
4971 {
4972 // Adjust view to cover the stub only.
4973 section_size_type offset = stub->offset();
4974 section_size_type stub_size = stub_template->size();
4975 gold_assert(offset + stub_size <= view_size);
4976
4977 arm_target->relocate_stub(stub, relinfo, output_section, view + offset,
4978 address + offset, stub_size);
4979 }
56ee5e00
DK
4980}
4981
2fb7225c
DK
4982// Relocate all stubs in this stub table.
4983
56ee5e00
DK
4984template<bool big_endian>
4985void
4986Stub_table<big_endian>::relocate_stubs(
4987 const Relocate_info<32, big_endian>* relinfo,
4988 Target_arm<big_endian>* arm_target,
2ea97941 4989 Output_section* output_section,
56ee5e00 4990 unsigned char* view,
2ea97941 4991 Arm_address address,
56ee5e00
DK
4992 section_size_type view_size)
4993{
4994 // If we are passed a view bigger than the stub table's. we need to
4995 // adjust the view.
2ea97941 4996 gold_assert(address == this->address()
56ee5e00
DK
4997 && (view_size
4998 == static_cast<section_size_type>(this->data_size())));
4999
2fb7225c
DK
5000 // Relocate all relocation stubs.
5001 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
5002 p != this->reloc_stubs_.end();
5003 ++p)
5004 this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
5005 address, view_size);
5006
5007 // Relocate all Cortex-A8 stubs.
5008 for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
5009 p != this->cortex_a8_stubs_.end();
5010 ++p)
5011 this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
5012 address, view_size);
a2162063
ILT
5013
5014 // Relocate all ARM V4BX stubs.
5015 for (Arm_v4bx_stub_list::iterator p = this->arm_v4bx_stubs_.begin();
5016 p != this->arm_v4bx_stubs_.end();
5017 ++p)
5018 {
5019 if (*p != NULL)
5020 this->relocate_stub(*p, relinfo, arm_target, output_section, view,
5021 address, view_size);
5022 }
2fb7225c
DK
5023}
5024
5025// Write out the stubs to file.
5026
5027template<bool big_endian>
5028void
5029Stub_table<big_endian>::do_write(Output_file* of)
5030{
5031 off_t offset = this->offset();
5032 const section_size_type oview_size =
5033 convert_to_section_size_type(this->data_size());
5034 unsigned char* const oview = of->get_output_view(offset, oview_size);
5035
5036 // Write relocation stubs.
56ee5e00
DK
5037 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
5038 p != this->reloc_stubs_.end();
5039 ++p)
5040 {
5041 Reloc_stub* stub = p->second;
2fb7225c
DK
5042 Arm_address address = this->address() + stub->offset();
5043 gold_assert(address
5044 == align_address(address,
5045 stub->stub_template()->alignment()));
5046 stub->write(oview + stub->offset(), stub->stub_template()->size(),
5047 big_endian);
56ee5e00 5048 }
2fb7225c
DK
5049
5050 // Write Cortex-A8 stubs.
5051 for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
5052 p != this->cortex_a8_stubs_.end();
5053 ++p)
5054 {
5055 Cortex_a8_stub* stub = p->second;
5056 Arm_address address = this->address() + stub->offset();
5057 gold_assert(address
5058 == align_address(address,
5059 stub->stub_template()->alignment()));
5060 stub->write(oview + stub->offset(), stub->stub_template()->size(),
5061 big_endian);
5062 }
5063
a2162063
ILT
5064 // Write ARM V4BX relocation stubs.
5065 for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
5066 p != this->arm_v4bx_stubs_.end();
5067 ++p)
5068 {
5069 if (*p == NULL)
5070 continue;
5071
5072 Arm_address address = this->address() + (*p)->offset();
5073 gold_assert(address
5074 == align_address(address,
5075 (*p)->stub_template()->alignment()));
5076 (*p)->write(oview + (*p)->offset(), (*p)->stub_template()->size(),
5077 big_endian);
5078 }
5079
2fb7225c 5080 of->write_output_view(this->offset(), oview_size, oview);
56ee5e00
DK
5081}
5082
2fb7225c
DK
5083// Update the data size and address alignment of the stub table at the end
5084// of a relaxation pass. Return true if either the data size or the
5085// alignment changed in this relaxation pass.
5086
5087template<bool big_endian>
5088bool
5089Stub_table<big_endian>::update_data_size_and_addralign()
5090{
2fb7225c 5091 // Go over all stubs in table to compute data size and address alignment.
d099120c
DK
5092 off_t size = this->reloc_stubs_size_;
5093 unsigned addralign = this->reloc_stubs_addralign_;
2fb7225c
DK
5094
5095 for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
5096 p != this->cortex_a8_stubs_.end();
5097 ++p)
5098 {
5099 const Stub_template* stub_template = p->second->stub_template();
5100 addralign = std::max(addralign, stub_template->alignment());
5101 size = (align_address(size, stub_template->alignment())
5102 + stub_template->size());
5103 }
5104
a2162063
ILT
5105 for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
5106 p != this->arm_v4bx_stubs_.end();
5107 ++p)
5108 {
5109 if (*p == NULL)
5110 continue;
5111
5112 const Stub_template* stub_template = (*p)->stub_template();
5113 addralign = std::max(addralign, stub_template->alignment());
5114 size = (align_address(size, stub_template->alignment())
5115 + stub_template->size());
5116 }
5117
2fb7225c
DK
5118 // Check if either data size or alignment changed in this pass.
5119 // Update prev_data_size_ and prev_addralign_. These will be used
5120 // as the current data size and address alignment for the next pass.
5121 bool changed = size != this->prev_data_size_;
2e702c99 5122 this->prev_data_size_ = size;
2fb7225c
DK
5123
5124 if (addralign != this->prev_addralign_)
5125 changed = true;
5126 this->prev_addralign_ = addralign;
5127
5128 return changed;
5129}
5130
5131// Finalize the stubs. This sets the offsets of the stubs within the stub
5132// table. It also marks all input sections needing Cortex-A8 workaround.
56ee5e00
DK
5133
5134template<bool big_endian>
5135void
2fb7225c 5136Stub_table<big_endian>::finalize_stubs()
56ee5e00 5137{
d099120c 5138 off_t off = this->reloc_stubs_size_;
2fb7225c
DK
5139 for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
5140 p != this->cortex_a8_stubs_.end();
5141 ++p)
5142 {
5143 Cortex_a8_stub* stub = p->second;
5144 const Stub_template* stub_template = stub->stub_template();
5145 uint64_t stub_addralign = stub_template->alignment();
5146 off = align_address(off, stub_addralign);
5147 stub->set_offset(off);
5148 off += stub_template->size();
5149
5150 // Mark input section so that we can determine later if a code section
5151 // needs the Cortex-A8 workaround quickly.
5152 Arm_relobj<big_endian>* arm_relobj =
5153 Arm_relobj<big_endian>::as_arm_relobj(stub->relobj());
5154 arm_relobj->mark_section_for_cortex_a8_workaround(stub->shndx());
5155 }
5156
a2162063
ILT
5157 for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
5158 p != this->arm_v4bx_stubs_.end();
5159 ++p)
5160 {
5161 if (*p == NULL)
5162 continue;
5163
5164 const Stub_template* stub_template = (*p)->stub_template();
5165 uint64_t stub_addralign = stub_template->alignment();
5166 off = align_address(off, stub_addralign);
5167 (*p)->set_offset(off);
5168 off += stub_template->size();
5169 }
5170
2fb7225c 5171 gold_assert(off <= this->prev_data_size_);
56ee5e00
DK
5172}
5173
2fb7225c
DK
5174// Apply Cortex-A8 workaround to an address range between VIEW_ADDRESS
5175// and VIEW_ADDRESS + VIEW_SIZE - 1. VIEW points to the mapped address
5176// of the address range seen by the linker.
56ee5e00
DK
5177
5178template<bool big_endian>
5179void
2fb7225c
DK
5180Stub_table<big_endian>::apply_cortex_a8_workaround_to_address_range(
5181 Target_arm<big_endian>* arm_target,
5182 unsigned char* view,
5183 Arm_address view_address,
5184 section_size_type view_size)
56ee5e00 5185{
2fb7225c
DK
5186 // Cortex-A8 stubs are sorted by addresses of branches being fixed up.
5187 for (Cortex_a8_stub_list::const_iterator p =
5188 this->cortex_a8_stubs_.lower_bound(view_address);
5189 ((p != this->cortex_a8_stubs_.end())
5190 && (p->first < (view_address + view_size)));
5191 ++p)
56ee5e00 5192 {
2fb7225c
DK
5193 // We do not store the THUMB bit in the LSB of either the branch address
5194 // or the stub offset. There is no need to strip the LSB.
5195 Arm_address branch_address = p->first;
5196 const Cortex_a8_stub* stub = p->second;
5197 Arm_address stub_address = this->address() + stub->offset();
5198
5199 // Offset of the branch instruction relative to this view.
5200 section_size_type offset =
5201 convert_to_section_size_type(branch_address - view_address);
5202 gold_assert((offset + 4) <= view_size);
5203
5204 arm_target->apply_cortex_a8_workaround(stub, stub_address,
5205 view + offset, branch_address);
5206 }
56ee5e00
DK
5207}
5208
10ad9fe5
DK
5209// Arm_input_section methods.
5210
5211// Initialize an Arm_input_section.
5212
5213template<bool big_endian>
5214void
5215Arm_input_section<big_endian>::init()
5216{
2ea97941
ILT
5217 Relobj* relobj = this->relobj();
5218 unsigned int shndx = this->shndx();
10ad9fe5 5219
f625ae50
DK
5220 // We have to cache original size, alignment and contents to avoid locking
5221 // the original file.
6625d24e
DK
5222 this->original_addralign_ =
5223 convert_types<uint32_t, uint64_t>(relobj->section_addralign(shndx));
f625ae50
DK
5224
5225 // This is not efficient but we expect only a small number of relaxed
5226 // input sections for stubs.
5227 section_size_type section_size;
5228 const unsigned char* section_contents =
5229 relobj->section_contents(shndx, &section_size, false);
6625d24e
DK
5230 this->original_size_ =
5231 convert_types<uint32_t, uint64_t>(relobj->section_size(shndx));
10ad9fe5 5232
f625ae50
DK
5233 gold_assert(this->original_contents_ == NULL);
5234 this->original_contents_ = new unsigned char[section_size];
5235 memcpy(this->original_contents_, section_contents, section_size);
5236
10ad9fe5
DK
5237 // We want to make this look like the original input section after
5238 // output sections are finalized.
2ea97941
ILT
5239 Output_section* os = relobj->output_section(shndx);
5240 off_t offset = relobj->output_section_offset(shndx);
5241 gold_assert(os != NULL && !relobj->is_output_section_offset_invalid(shndx));
5242 this->set_address(os->address() + offset);
5243 this->set_file_offset(os->offset() + offset);
10ad9fe5
DK
5244
5245 this->set_current_data_size(this->original_size_);
5246 this->finalize_data_size();
5247}
5248
5249template<bool big_endian>
5250void
5251Arm_input_section<big_endian>::do_write(Output_file* of)
5252{
5253 // We have to write out the original section content.
f625ae50
DK
5254 gold_assert(this->original_contents_ != NULL);
5255 of->write(this->offset(), this->original_contents_,
2e702c99 5256 this->original_size_);
10ad9fe5
DK
5257
5258 // If this owns a stub table and it is not empty, write it.
5259 if (this->is_stub_table_owner() && !this->stub_table_->empty())
5260 this->stub_table_->write(of);
5261}
5262
5263// Finalize data size.
5264
5265template<bool big_endian>
5266void
5267Arm_input_section<big_endian>::set_final_data_size()
5268{
153e7da4
DK
5269 off_t off = convert_types<off_t, uint64_t>(this->original_size_);
5270
10ad9fe5
DK
5271 if (this->is_stub_table_owner())
5272 {
6625d24e 5273 this->stub_table_->finalize_data_size();
153e7da4 5274 off = align_address(off, this->stub_table_->addralign());
153e7da4 5275 off += this->stub_table_->data_size();
10ad9fe5 5276 }
153e7da4 5277 this->set_data_size(off);
10ad9fe5
DK
5278}
5279
5280// Reset address and file offset.
5281
5282template<bool big_endian>
5283void
5284Arm_input_section<big_endian>::do_reset_address_and_file_offset()
5285{
5286 // Size of the original input section contents.
5287 off_t off = convert_types<off_t, uint64_t>(this->original_size_);
5288
5289 // If this is a stub table owner, account for the stub table size.
5290 if (this->is_stub_table_owner())
5291 {
2ea97941 5292 Stub_table<big_endian>* stub_table = this->stub_table_;
10ad9fe5
DK
5293
5294 // Reset the stub table's address and file offset. The
5295 // current data size for child will be updated after that.
5296 stub_table_->reset_address_and_file_offset();
5297 off = align_address(off, stub_table_->addralign());
2ea97941 5298 off += stub_table->current_data_size();
10ad9fe5
DK
5299 }
5300
5301 this->set_current_data_size(off);
5302}
5303
af2cdeae
DK
5304// Arm_exidx_cantunwind methods.
5305
7296d933 5306// Write this to Output file OF for a fixed endianness.
af2cdeae
DK
5307
5308template<bool big_endian>
5309void
5310Arm_exidx_cantunwind::do_fixed_endian_write(Output_file* of)
5311{
5312 off_t offset = this->offset();
5313 const section_size_type oview_size = 8;
5314 unsigned char* const oview = of->get_output_view(offset, oview_size);
2e702c99 5315
af2cdeae
DK
5316 Output_section* os = this->relobj_->output_section(this->shndx_);
5317 gold_assert(os != NULL);
5318
5319 Arm_relobj<big_endian>* arm_relobj =
5320 Arm_relobj<big_endian>::as_arm_relobj(this->relobj_);
5321 Arm_address output_offset =
5322 arm_relobj->get_output_section_offset(this->shndx_);
5323 Arm_address section_start;
f625ae50
DK
5324 section_size_type section_size;
5325
5326 // Find out the end of the text section referred by this.
7296d933 5327 if (output_offset != Arm_relobj<big_endian>::invalid_address)
f625ae50
DK
5328 {
5329 section_start = os->address() + output_offset;
5330 const Arm_exidx_input_section* exidx_input_section =
2e702c99 5331 arm_relobj->exidx_input_section_by_link(this->shndx_);
f625ae50
DK
5332 gold_assert(exidx_input_section != NULL);
5333 section_size =
5334 convert_to_section_size_type(exidx_input_section->text_size());
5335 }
af2cdeae
DK
5336 else
5337 {
5338 // Currently this only happens for a relaxed section.
5339 const Output_relaxed_input_section* poris =
5340 os->find_relaxed_input_section(this->relobj_, this->shndx_);
5341 gold_assert(poris != NULL);
5342 section_start = poris->address();
f625ae50 5343 section_size = convert_to_section_size_type(poris->data_size());
af2cdeae
DK
5344 }
5345
5346 // We always append this to the end of an EXIDX section.
f625ae50 5347 Arm_address output_address = section_start + section_size;
af2cdeae
DK
5348
5349 // Write out the entry. The first word either points to the beginning
5350 // or after the end of a text section. The second word is the special
5351 // EXIDX_CANTUNWIND value.
e7eca48c 5352 uint32_t prel31_offset = output_address - this->address();
bef2b434 5353 if (Bits<31>::has_overflow32(offset))
e7eca48c 5354 gold_error(_("PREL31 overflow in EXIDX_CANTUNWIND entry"));
f6cccc2c
DK
5355 elfcpp::Swap_unaligned<32, big_endian>::writeval(oview,
5356 prel31_offset & 0x7fffffffU);
5357 elfcpp::Swap_unaligned<32, big_endian>::writeval(oview + 4,
5358 elfcpp::EXIDX_CANTUNWIND);
af2cdeae
DK
5359
5360 of->write_output_view(this->offset(), oview_size, oview);
5361}
5362
5363// Arm_exidx_merged_section methods.
5364
5365// Constructor for Arm_exidx_merged_section.
5366// EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
5367// SECTION_OFFSET_MAP points to a section offset map describing how
5368// parts of the input section are mapped to output. DELETED_BYTES is
5369// the number of bytes deleted from the EXIDX input section.
5370
5371Arm_exidx_merged_section::Arm_exidx_merged_section(
5372 const Arm_exidx_input_section& exidx_input_section,
5373 const Arm_exidx_section_offset_map& section_offset_map,
5374 uint32_t deleted_bytes)
5375 : Output_relaxed_input_section(exidx_input_section.relobj(),
5376 exidx_input_section.shndx(),
5377 exidx_input_section.addralign()),
5378 exidx_input_section_(exidx_input_section),
5379 section_offset_map_(section_offset_map)
5380{
f625ae50
DK
5381 // If we retain or discard the whole EXIDX input section, we would
5382 // not be here.
5383 gold_assert(deleted_bytes != 0
5384 && deleted_bytes != this->exidx_input_section_.size());
5385
af2cdeae 5386 // Fix size here so that we do not need to implement set_final_data_size.
f625ae50
DK
5387 uint32_t size = exidx_input_section.size() - deleted_bytes;
5388 this->set_data_size(size);
af2cdeae 5389 this->fix_data_size();
f625ae50
DK
5390
5391 // Allocate buffer for section contents and build contents.
5392 this->section_contents_ = new unsigned char[size];
5393}
5394
5395// Build the contents of a merged EXIDX output section.
5396
5397void
5398Arm_exidx_merged_section::build_contents(
5399 const unsigned char* original_contents,
5400 section_size_type original_size)
5401{
5402 // Go over spans of input offsets and write only those that are not
5403 // discarded.
5404 section_offset_type in_start = 0;
5405 section_offset_type out_start = 0;
5406 section_offset_type in_max =
5407 convert_types<section_offset_type>(original_size);
5408 section_offset_type out_max =
5409 convert_types<section_offset_type>(this->data_size());
5410 for (Arm_exidx_section_offset_map::const_iterator p =
2e702c99 5411 this->section_offset_map_.begin();
f625ae50
DK
5412 p != this->section_offset_map_.end();
5413 ++p)
5414 {
5415 section_offset_type in_end = p->first;
5416 gold_assert(in_end >= in_start);
5417 section_offset_type out_end = p->second;
5418 size_t in_chunk_size = convert_types<size_t>(in_end - in_start + 1);
5419 if (out_end != -1)
5420 {
5421 size_t out_chunk_size =
5422 convert_types<size_t>(out_end - out_start + 1);
5423
5424 gold_assert(out_chunk_size == in_chunk_size
5425 && in_end < in_max && out_end < out_max);
5426
5427 memcpy(this->section_contents_ + out_start,
5428 original_contents + in_start,
5429 out_chunk_size);
5430 out_start += out_chunk_size;
5431 }
5432 in_start += in_chunk_size;
5433 }
af2cdeae
DK
5434}
5435
5436// Given an input OBJECT, an input section index SHNDX within that
5437// object, and an OFFSET relative to the start of that input
5438// section, return whether or not the corresponding offset within
5439// the output section is known. If this function returns true, it
5440// sets *POUTPUT to the output offset. The value -1 indicates that
5441// this input offset is being discarded.
5442
5443bool
5444Arm_exidx_merged_section::do_output_offset(
5445 const Relobj* relobj,
5446 unsigned int shndx,
5447 section_offset_type offset,
5448 section_offset_type* poutput) const
5449{
5450 // We only handle offsets for the original EXIDX input section.
5451 if (relobj != this->exidx_input_section_.relobj()
5452 || shndx != this->exidx_input_section_.shndx())
5453 return false;
5454
c7f3c371
DK
5455 section_offset_type section_size =
5456 convert_types<section_offset_type>(this->exidx_input_section_.size());
5457 if (offset < 0 || offset >= section_size)
af2cdeae
DK
5458 // Input offset is out of valid range.
5459 *poutput = -1;
5460 else
5461 {
5462 // We need to look up the section offset map to determine the output
5463 // offset. Find the reference point in map that is first offset
5464 // bigger than or equal to this offset.
5465 Arm_exidx_section_offset_map::const_iterator p =
5466 this->section_offset_map_.lower_bound(offset);
5467
5468 // The section offset maps are build such that this should not happen if
5469 // input offset is in the valid range.
5470 gold_assert(p != this->section_offset_map_.end());
5471
5472 // We need to check if this is dropped.
5473 section_offset_type ref = p->first;
5474 section_offset_type mapped_ref = p->second;
5475
5476 if (mapped_ref != Arm_exidx_input_section::invalid_offset)
5477 // Offset is present in output.
5478 *poutput = mapped_ref + (offset - ref);
5479 else
5480 // Offset is discarded owing to EXIDX entry merging.
5481 *poutput = -1;
5482 }
2e702c99 5483
af2cdeae
DK
5484 return true;
5485}
5486
5487// Write this to output file OF.
5488
5489void
5490Arm_exidx_merged_section::do_write(Output_file* of)
5491{
af2cdeae
DK
5492 off_t offset = this->offset();
5493 const section_size_type oview_size = this->data_size();
5494 unsigned char* const oview = of->get_output_view(offset, oview_size);
2e702c99 5495
af2cdeae
DK
5496 Output_section* os = this->relobj()->output_section(this->shndx());
5497 gold_assert(os != NULL);
5498
f625ae50 5499 memcpy(oview, this->section_contents_, oview_size);
af2cdeae
DK
5500 of->write_output_view(this->offset(), oview_size, oview);
5501}
5502
80d0d023
DK
5503// Arm_exidx_fixup methods.
5504
5505// Append an EXIDX_CANTUNWIND in the current output section if the last entry
5506// is not an EXIDX_CANTUNWIND entry already. The new EXIDX_CANTUNWIND entry
5507// points to the end of the last seen EXIDX section.
5508
5509void
5510Arm_exidx_fixup::add_exidx_cantunwind_as_needed()
5511{
5512 if (this->last_unwind_type_ != UT_EXIDX_CANTUNWIND
5513 && this->last_input_section_ != NULL)
5514 {
5515 Relobj* relobj = this->last_input_section_->relobj();
2b328d4e 5516 unsigned int text_shndx = this->last_input_section_->link();
80d0d023 5517 Arm_exidx_cantunwind* cantunwind =
2b328d4e 5518 new Arm_exidx_cantunwind(relobj, text_shndx);
80d0d023
DK
5519 this->exidx_output_section_->add_output_section_data(cantunwind);
5520 this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5521 }
5522}
5523
5524// Process an EXIDX section entry in input. Return whether this entry
5525// can be deleted in the output. SECOND_WORD in the second word of the
5526// EXIDX entry.
5527
5528bool
5529Arm_exidx_fixup::process_exidx_entry(uint32_t second_word)
5530{
5531 bool delete_entry;
5532 if (second_word == elfcpp::EXIDX_CANTUNWIND)
5533 {
5534 // Merge if previous entry is also an EXIDX_CANTUNWIND.
5535 delete_entry = this->last_unwind_type_ == UT_EXIDX_CANTUNWIND;
5536 this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5537 }
5538 else if ((second_word & 0x80000000) != 0)
5539 {
5540 // Inlined unwinding data. Merge if equal to previous.
85fdf906
AH
5541 delete_entry = (merge_exidx_entries_
5542 && this->last_unwind_type_ == UT_INLINED_ENTRY
80d0d023
DK
5543 && this->last_inlined_entry_ == second_word);
5544 this->last_unwind_type_ = UT_INLINED_ENTRY;
5545 this->last_inlined_entry_ = second_word;
5546 }
5547 else
5548 {
5549 // Normal table entry. In theory we could merge these too,
5550 // but duplicate entries are likely to be much less common.
5551 delete_entry = false;
5552 this->last_unwind_type_ = UT_NORMAL_ENTRY;
5553 }
5554 return delete_entry;
5555}
5556
5557// Update the current section offset map during EXIDX section fix-up.
5558// If there is no map, create one. INPUT_OFFSET is the offset of a
5559// reference point, DELETED_BYTES is the number of deleted by in the
5560// section so far. If DELETE_ENTRY is true, the reference point and
5561// all offsets after the previous reference point are discarded.
5562
5563void
5564Arm_exidx_fixup::update_offset_map(
5565 section_offset_type input_offset,
5566 section_size_type deleted_bytes,
5567 bool delete_entry)
5568{
5569 if (this->section_offset_map_ == NULL)
5570 this->section_offset_map_ = new Arm_exidx_section_offset_map();
4fcd97eb
DK
5571 section_offset_type output_offset;
5572 if (delete_entry)
5573 output_offset = Arm_exidx_input_section::invalid_offset;
5574 else
5575 output_offset = input_offset - deleted_bytes;
80d0d023
DK
5576 (*this->section_offset_map_)[input_offset] = output_offset;
5577}
5578
5579// Process EXIDX_INPUT_SECTION for EXIDX entry merging. Return the number of
f625ae50
DK
5580// bytes deleted. SECTION_CONTENTS points to the contents of the EXIDX
5581// section and SECTION_SIZE is the number of bytes pointed by SECTION_CONTENTS.
5582// If some entries are merged, also store a pointer to a newly created
5583// Arm_exidx_section_offset_map object in *PSECTION_OFFSET_MAP. The caller
5584// owns the map and is responsible for releasing it after use.
80d0d023
DK
5585
5586template<bool big_endian>
5587uint32_t
5588Arm_exidx_fixup::process_exidx_section(
5589 const Arm_exidx_input_section* exidx_input_section,
f625ae50
DK
5590 const unsigned char* section_contents,
5591 section_size_type section_size,
80d0d023
DK
5592 Arm_exidx_section_offset_map** psection_offset_map)
5593{
5594 Relobj* relobj = exidx_input_section->relobj();
5595 unsigned shndx = exidx_input_section->shndx();
80d0d023
DK
5596
5597 if ((section_size % 8) != 0)
5598 {
5599 // Something is wrong with this section. Better not touch it.
5600 gold_error(_("uneven .ARM.exidx section size in %s section %u"),
5601 relobj->name().c_str(), shndx);
5602 this->last_input_section_ = exidx_input_section;
5603 this->last_unwind_type_ = UT_NONE;
5604 return 0;
5605 }
2e702c99 5606
80d0d023
DK
5607 uint32_t deleted_bytes = 0;
5608 bool prev_delete_entry = false;
5609 gold_assert(this->section_offset_map_ == NULL);
5610
5611 for (section_size_type i = 0; i < section_size; i += 8)
5612 {
5613 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
5614 const Valtype* wv =
5615 reinterpret_cast<const Valtype*>(section_contents + i + 4);
5616 uint32_t second_word = elfcpp::Swap<32, big_endian>::readval(wv);
5617
5618 bool delete_entry = this->process_exidx_entry(second_word);
5619
5620 // Entry deletion causes changes in output offsets. We use a std::map
5621 // to record these. And entry (x, y) means input offset x
5622 // is mapped to output offset y. If y is invalid_offset, then x is
5623 // dropped in the output. Because of the way std::map::lower_bound
5624 // works, we record the last offset in a region w.r.t to keeping or
5625 // dropping. If there is no entry (x0, y0) for an input offset x0,
5626 // the output offset y0 of it is determined by the output offset y1 of
5627 // the smallest input offset x1 > x0 that there is an (x1, y1) entry
9b547ce6 5628 // in the map. If y1 is not -1, then y0 = y1 + x0 - x1. Otherwise, y1
80d0d023
DK
5629 // y0 is also -1.
5630 if (delete_entry != prev_delete_entry && i != 0)
5631 this->update_offset_map(i - 1, deleted_bytes, prev_delete_entry);
5632
5633 // Update total deleted bytes for this entry.
5634 if (delete_entry)
5635 deleted_bytes += 8;
5636
5637 prev_delete_entry = delete_entry;
5638 }
2e702c99 5639
80d0d023
DK
5640 // If section offset map is not NULL, make an entry for the end of
5641 // section.
5642 if (this->section_offset_map_ != NULL)
5643 update_offset_map(section_size - 1, deleted_bytes, prev_delete_entry);
5644
5645 *psection_offset_map = this->section_offset_map_;
5646 this->section_offset_map_ = NULL;
5647 this->last_input_section_ = exidx_input_section;
2e702c99 5648
546c7457
DK
5649 // Set the first output text section so that we can link the EXIDX output
5650 // section to it. Ignore any EXIDX input section that is completely merged.
5651 if (this->first_output_text_section_ == NULL
5652 && deleted_bytes != section_size)
5653 {
5654 unsigned int link = exidx_input_section->link();
5655 Output_section* os = relobj->output_section(link);
5656 gold_assert(os != NULL);
5657 this->first_output_text_section_ = os;
5658 }
5659
80d0d023
DK
5660 return deleted_bytes;
5661}
5662
07f508a2
DK
5663// Arm_output_section methods.
5664
5665// Create a stub group for input sections from BEGIN to END. OWNER
5666// points to the input section to be the owner a new stub table.
5667
5668template<bool big_endian>
5669void
5670Arm_output_section<big_endian>::create_stub_group(
5671 Input_section_list::const_iterator begin,
5672 Input_section_list::const_iterator end,
5673 Input_section_list::const_iterator owner,
5674 Target_arm<big_endian>* target,
f625ae50
DK
5675 std::vector<Output_relaxed_input_section*>* new_relaxed_sections,
5676 const Task* task)
07f508a2 5677{
2b328d4e
DK
5678 // We use a different kind of relaxed section in an EXIDX section.
5679 // The static casting from Output_relaxed_input_section to
5680 // Arm_input_section is invalid in an EXIDX section. We are okay
2e702c99 5681 // because we should not be calling this for an EXIDX section.
2b328d4e
DK
5682 gold_assert(this->type() != elfcpp::SHT_ARM_EXIDX);
5683
07f508a2
DK
5684 // Currently we convert ordinary input sections into relaxed sections only
5685 // at this point but we may want to support creating relaxed input section
5686 // very early. So we check here to see if owner is already a relaxed
5687 // section.
2e702c99 5688
07f508a2
DK
5689 Arm_input_section<big_endian>* arm_input_section;
5690 if (owner->is_relaxed_input_section())
5691 {
5692 arm_input_section =
5693 Arm_input_section<big_endian>::as_arm_input_section(
5694 owner->relaxed_input_section());
5695 }
5696 else
5697 {
5698 gold_assert(owner->is_input_section());
f625ae50
DK
5699 // Create a new relaxed input section. We need to lock the original
5700 // file.
5701 Task_lock_obj<Object> tl(task, owner->relobj());
07f508a2
DK
5702 arm_input_section =
5703 target->new_arm_input_section(owner->relobj(), owner->shndx());
5704 new_relaxed_sections->push_back(arm_input_section);
5705 }
5706
5707 // Create a stub table.
2ea97941 5708 Stub_table<big_endian>* stub_table =
07f508a2
DK
5709 target->new_stub_table(arm_input_section);
5710
2ea97941 5711 arm_input_section->set_stub_table(stub_table);
2e702c99 5712
07f508a2
DK
5713 Input_section_list::const_iterator p = begin;
5714 Input_section_list::const_iterator prev_p;
5715
5716 // Look for input sections or relaxed input sections in [begin ... end].
5717 do
5718 {
5719 if (p->is_input_section() || p->is_relaxed_input_section())
5720 {
5721 // The stub table information for input sections live
5722 // in their objects.
5723 Arm_relobj<big_endian>* arm_relobj =
5724 Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
2ea97941 5725 arm_relobj->set_stub_table(p->shndx(), stub_table);
07f508a2
DK
5726 }
5727 prev_p = p++;
5728 }
5729 while (prev_p != end);
5730}
5731
5732// Group input sections for stub generation. GROUP_SIZE is roughly the limit
5733// of stub groups. We grow a stub group by adding input section until the
5734// size is just below GROUP_SIZE. The last input section will be converted
5735// into a stub table. If STUB_ALWAYS_AFTER_BRANCH is false, we also add
5736// input section after the stub table, effectively double the group size.
2e702c99 5737//
07f508a2
DK
5738// This is similar to the group_sections() function in elf32-arm.c but is
5739// implemented differently.
5740
5741template<bool big_endian>
5742void
5743Arm_output_section<big_endian>::group_sections(
5744 section_size_type group_size,
5745 bool stubs_always_after_branch,
f625ae50
DK
5746 Target_arm<big_endian>* target,
5747 const Task* task)
07f508a2 5748{
07f508a2
DK
5749 // States for grouping.
5750 typedef enum
5751 {
5752 // No group is being built.
5753 NO_GROUP,
5754 // A group is being built but the stub table is not found yet.
5755 // We keep group a stub group until the size is just under GROUP_SIZE.
5756 // The last input section in the group will be used as the stub table.
5757 FINDING_STUB_SECTION,
5758 // A group is being built and we have already found a stub table.
5759 // We enter this state to grow a stub group by adding input section
5760 // after the stub table. This effectively doubles the group size.
5761 HAS_STUB_SECTION
5762 } State;
5763
5764 // Any newly created relaxed sections are stored here.
5765 std::vector<Output_relaxed_input_section*> new_relaxed_sections;
5766
5767 State state = NO_GROUP;
5768 section_size_type off = 0;
5769 section_size_type group_begin_offset = 0;
5770 section_size_type group_end_offset = 0;
5771 section_size_type stub_table_end_offset = 0;
5772 Input_section_list::const_iterator group_begin =
5773 this->input_sections().end();
2ea97941 5774 Input_section_list::const_iterator stub_table =
07f508a2
DK
5775 this->input_sections().end();
5776 Input_section_list::const_iterator group_end = this->input_sections().end();
5777 for (Input_section_list::const_iterator p = this->input_sections().begin();
5778 p != this->input_sections().end();
5779 ++p)
5780 {
5781 section_size_type section_begin_offset =
5782 align_address(off, p->addralign());
5783 section_size_type section_end_offset =
2e702c99
RM
5784 section_begin_offset + p->data_size();
5785
9b547ce6 5786 // Check to see if we should group the previously seen sections.
e9bbb538 5787 switch (state)
07f508a2
DK
5788 {
5789 case NO_GROUP:
5790 break;
5791
5792 case FINDING_STUB_SECTION:
5793 // Adding this section makes the group larger than GROUP_SIZE.
5794 if (section_end_offset - group_begin_offset >= group_size)
5795 {
5796 if (stubs_always_after_branch)
2e702c99 5797 {
07f508a2
DK
5798 gold_assert(group_end != this->input_sections().end());
5799 this->create_stub_group(group_begin, group_end, group_end,
f625ae50
DK
5800 target, &new_relaxed_sections,
5801 task);
07f508a2
DK
5802 state = NO_GROUP;
5803 }
5804 else
5805 {
5806 // But wait, there's more! Input sections up to
5807 // stub_group_size bytes after the stub table can be
5808 // handled by it too.
5809 state = HAS_STUB_SECTION;
2ea97941 5810 stub_table = group_end;
07f508a2
DK
5811 stub_table_end_offset = group_end_offset;
5812 }
5813 }
5814 break;
5815
5816 case HAS_STUB_SECTION:
5817 // Adding this section makes the post stub-section group larger
5818 // than GROUP_SIZE.
5819 if (section_end_offset - stub_table_end_offset >= group_size)
5820 {
5821 gold_assert(group_end != this->input_sections().end());
2ea97941 5822 this->create_stub_group(group_begin, group_end, stub_table,
f625ae50 5823 target, &new_relaxed_sections, task);
07f508a2
DK
5824 state = NO_GROUP;
5825 }
5826 break;
5827
5828 default:
5829 gold_unreachable();
2e702c99 5830 }
07f508a2
DK
5831
5832 // If we see an input section and currently there is no group, start
f625ae50
DK
5833 // a new one. Skip any empty sections. We look at the data size
5834 // instead of calling p->relobj()->section_size() to avoid locking.
07f508a2 5835 if ((p->is_input_section() || p->is_relaxed_input_section())
f625ae50 5836 && (p->data_size() != 0))
07f508a2
DK
5837 {
5838 if (state == NO_GROUP)
5839 {
5840 state = FINDING_STUB_SECTION;
5841 group_begin = p;
5842 group_begin_offset = section_begin_offset;
5843 }
5844
5845 // Keep track of the last input section seen.
5846 group_end = p;
5847 group_end_offset = section_end_offset;
5848 }
5849
5850 off = section_end_offset;
5851 }
5852
5853 // Create a stub group for any ungrouped sections.
5854 if (state == FINDING_STUB_SECTION || state == HAS_STUB_SECTION)
5855 {
5856 gold_assert(group_end != this->input_sections().end());
5857 this->create_stub_group(group_begin, group_end,
5858 (state == FINDING_STUB_SECTION
5859 ? group_end
2ea97941 5860 : stub_table),
f625ae50 5861 target, &new_relaxed_sections, task);
07f508a2
DK
5862 }
5863
5864 // Convert input section into relaxed input section in a batch.
5865 if (!new_relaxed_sections.empty())
5866 this->convert_input_sections_to_relaxed_sections(new_relaxed_sections);
5867
5868 // Update the section offsets
5869 for (size_t i = 0; i < new_relaxed_sections.size(); ++i)
5870 {
5871 Arm_relobj<big_endian>* arm_relobj =
5872 Arm_relobj<big_endian>::as_arm_relobj(
5873 new_relaxed_sections[i]->relobj());
2ea97941 5874 unsigned int shndx = new_relaxed_sections[i]->shndx();
07f508a2 5875 // Tell Arm_relobj that this input section is converted.
2ea97941 5876 arm_relobj->convert_input_section_to_relaxed_section(shndx);
07f508a2
DK
5877 }
5878}
5879
2b328d4e
DK
5880// Append non empty text sections in this to LIST in ascending
5881// order of their position in this.
5882
5883template<bool big_endian>
5884void
5885Arm_output_section<big_endian>::append_text_sections_to_list(
5886 Text_section_list* list)
5887{
2b328d4e
DK
5888 gold_assert((this->flags() & elfcpp::SHF_ALLOC) != 0);
5889
5890 for (Input_section_list::const_iterator p = this->input_sections().begin();
5891 p != this->input_sections().end();
5892 ++p)
5893 {
5894 // We only care about plain or relaxed input sections. We also
5895 // ignore any merged sections.
a60af0db 5896 if (p->is_input_section() || p->is_relaxed_input_section())
2b328d4e
DK
5897 list->push_back(Text_section_list::value_type(p->relobj(),
5898 p->shndx()));
5899 }
5900}
5901
5902template<bool big_endian>
5903void
5904Arm_output_section<big_endian>::fix_exidx_coverage(
4a54abbb 5905 Layout* layout,
2b328d4e 5906 const Text_section_list& sorted_text_sections,
85fdf906 5907 Symbol_table* symtab,
f625ae50
DK
5908 bool merge_exidx_entries,
5909 const Task* task)
2b328d4e
DK
5910{
5911 // We should only do this for the EXIDX output section.
5912 gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
5913
5914 // We don't want the relaxation loop to undo these changes, so we discard
5915 // the current saved states and take another one after the fix-up.
5916 this->discard_states();
5917
5918 // Remove all input sections.
5919 uint64_t address = this->address();
6625d24e
DK
5920 typedef std::list<Output_section::Input_section> Input_section_list;
5921 Input_section_list input_sections;
2b328d4e
DK
5922 this->reset_address_and_file_offset();
5923 this->get_input_sections(address, std::string(""), &input_sections);
5924
5925 if (!this->input_sections().empty())
5926 gold_error(_("Found non-EXIDX input sections in EXIDX output section"));
2e702c99 5927
2b328d4e
DK
5928 // Go through all the known input sections and record them.
5929 typedef Unordered_set<Section_id, Section_id_hash> Section_id_set;
6625d24e
DK
5930 typedef Unordered_map<Section_id, const Output_section::Input_section*,
5931 Section_id_hash> Text_to_exidx_map;
5932 Text_to_exidx_map text_to_exidx_map;
5933 for (Input_section_list::const_iterator p = input_sections.begin();
2b328d4e
DK
5934 p != input_sections.end();
5935 ++p)
5936 {
5937 // This should never happen. At this point, we should only see
5938 // plain EXIDX input sections.
5939 gold_assert(!p->is_relaxed_input_section());
6625d24e 5940 text_to_exidx_map[Section_id(p->relobj(), p->shndx())] = &(*p);
2b328d4e
DK
5941 }
5942
85fdf906 5943 Arm_exidx_fixup exidx_fixup(this, merge_exidx_entries);
2b328d4e
DK
5944
5945 // Go over the sorted text sections.
6625d24e 5946 typedef Unordered_set<Section_id, Section_id_hash> Section_id_set;
2b328d4e
DK
5947 Section_id_set processed_input_sections;
5948 for (Text_section_list::const_iterator p = sorted_text_sections.begin();
5949 p != sorted_text_sections.end();
5950 ++p)
5951 {
5952 Relobj* relobj = p->first;
5953 unsigned int shndx = p->second;
5954
5955 Arm_relobj<big_endian>* arm_relobj =
5956 Arm_relobj<big_endian>::as_arm_relobj(relobj);
5957 const Arm_exidx_input_section* exidx_input_section =
5958 arm_relobj->exidx_input_section_by_link(shndx);
5959
131687b4
DK
5960 // If this text section has no EXIDX section or if the EXIDX section
5961 // has errors, force an EXIDX_CANTUNWIND entry pointing to the end
5962 // of the last seen EXIDX section.
5963 if (exidx_input_section == NULL || exidx_input_section->has_errors())
2b328d4e
DK
5964 {
5965 exidx_fixup.add_exidx_cantunwind_as_needed();
5966 continue;
5967 }
5968
5969 Relobj* exidx_relobj = exidx_input_section->relobj();
5970 unsigned int exidx_shndx = exidx_input_section->shndx();
5971 Section_id sid(exidx_relobj, exidx_shndx);
6625d24e
DK
5972 Text_to_exidx_map::const_iterator iter = text_to_exidx_map.find(sid);
5973 if (iter == text_to_exidx_map.end())
2b328d4e
DK
5974 {
5975 // This is odd. We have not seen this EXIDX input section before.
4a54abbb
DK
5976 // We cannot do fix-up. If we saw a SECTIONS clause in a script,
5977 // issue a warning instead. We assume the user knows what he
5978 // or she is doing. Otherwise, this is an error.
5979 if (layout->script_options()->saw_sections_clause())
5980 gold_warning(_("unwinding may not work because EXIDX input section"
5981 " %u of %s is not in EXIDX output section"),
5982 exidx_shndx, exidx_relobj->name().c_str());
5983 else
5984 gold_error(_("unwinding may not work because EXIDX input section"
5985 " %u of %s is not in EXIDX output section"),
5986 exidx_shndx, exidx_relobj->name().c_str());
5987
2b328d4e
DK
5988 exidx_fixup.add_exidx_cantunwind_as_needed();
5989 continue;
5990 }
5991
f625ae50
DK
5992 // We need to access the contents of the EXIDX section, lock the
5993 // object here.
5994 Task_lock_obj<Object> tl(task, exidx_relobj);
5995 section_size_type exidx_size;
5996 const unsigned char* exidx_contents =
2e702c99 5997 exidx_relobj->section_contents(exidx_shndx, &exidx_size, false);
f625ae50 5998
2b328d4e
DK
5999 // Fix up coverage and append input section to output data list.
6000 Arm_exidx_section_offset_map* section_offset_map = NULL;
6001 uint32_t deleted_bytes =
2e702c99 6002 exidx_fixup.process_exidx_section<big_endian>(exidx_input_section,
f625ae50
DK
6003 exidx_contents,
6004 exidx_size,
2b328d4e
DK
6005 &section_offset_map);
6006
6007 if (deleted_bytes == exidx_input_section->size())
6008 {
6009 // The whole EXIDX section got merged. Remove it from output.
6010 gold_assert(section_offset_map == NULL);
6011 exidx_relobj->set_output_section(exidx_shndx, NULL);
e7eca48c
DK
6012
6013 // All local symbols defined in this input section will be dropped.
6014 // We need to adjust output local symbol count.
6015 arm_relobj->set_output_local_symbol_count_needs_update();
2b328d4e
DK
6016 }
6017 else if (deleted_bytes > 0)
6018 {
6019 // Some entries are merged. We need to convert this EXIDX input
6020 // section into a relaxed section.
6021 gold_assert(section_offset_map != NULL);
f625ae50 6022
2b328d4e
DK
6023 Arm_exidx_merged_section* merged_section =
6024 new Arm_exidx_merged_section(*exidx_input_section,
6025 *section_offset_map, deleted_bytes);
f625ae50
DK
6026 merged_section->build_contents(exidx_contents, exidx_size);
6027
d06fb4d1
DK
6028 const std::string secname = exidx_relobj->section_name(exidx_shndx);
6029 this->add_relaxed_input_section(layout, merged_section, secname);
2b328d4e 6030 arm_relobj->convert_input_section_to_relaxed_section(exidx_shndx);
e7eca48c
DK
6031
6032 // All local symbols defined in discarded portions of this input
6033 // section will be dropped. We need to adjust output local symbol
6034 // count.
6035 arm_relobj->set_output_local_symbol_count_needs_update();
2b328d4e
DK
6036 }
6037 else
6038 {
6039 // Just add back the EXIDX input section.
6040 gold_assert(section_offset_map == NULL);
6625d24e
DK
6041 const Output_section::Input_section* pis = iter->second;
6042 gold_assert(pis->is_input_section());
6043 this->add_script_input_section(*pis);
2b328d4e
DK
6044 }
6045
2e702c99 6046 processed_input_sections.insert(Section_id(exidx_relobj, exidx_shndx));
2b328d4e
DK
6047 }
6048
6049 // Insert an EXIDX_CANTUNWIND entry at the end of output if necessary.
6050 exidx_fixup.add_exidx_cantunwind_as_needed();
6051
6052 // Remove any known EXIDX input sections that are not processed.
6625d24e 6053 for (Input_section_list::const_iterator p = input_sections.begin();
2b328d4e
DK
6054 p != input_sections.end();
6055 ++p)
6056 {
6057 if (processed_input_sections.find(Section_id(p->relobj(), p->shndx()))
6058 == processed_input_sections.end())
6059 {
131687b4
DK
6060 // We discard a known EXIDX section because its linked
6061 // text section has been folded by ICF. We also discard an
6062 // EXIDX section with error, the output does not matter in this
6063 // case. We do this to avoid triggering asserts.
2b328d4e
DK
6064 Arm_relobj<big_endian>* arm_relobj =
6065 Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
6066 const Arm_exidx_input_section* exidx_input_section =
6067 arm_relobj->exidx_input_section_by_shndx(p->shndx());
6068 gold_assert(exidx_input_section != NULL);
131687b4
DK
6069 if (!exidx_input_section->has_errors())
6070 {
6071 unsigned int text_shndx = exidx_input_section->link();
6072 gold_assert(symtab->is_section_folded(p->relobj(), text_shndx));
6073 }
2b328d4e 6074
04ceb17c
DK
6075 // Remove this from link. We also need to recount the
6076 // local symbols.
2b328d4e 6077 p->relobj()->set_output_section(p->shndx(), NULL);
04ceb17c 6078 arm_relobj->set_output_local_symbol_count_needs_update();
2b328d4e
DK
6079 }
6080 }
2e702c99 6081
546c7457
DK
6082 // Link exidx output section to the first seen output section and
6083 // set correct entry size.
6084 this->set_link_section(exidx_fixup.first_output_text_section());
6085 this->set_entsize(8);
6086
2b328d4e
DK
6087 // Make changes permanent.
6088 this->save_states();
6089 this->set_section_offsets_need_adjustment();
6090}
6091
131687b4
DK
6092// Link EXIDX output sections to text output sections.
6093
6094template<bool big_endian>
6095void
6096Arm_output_section<big_endian>::set_exidx_section_link()
6097{
6098 gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
6099 if (!this->input_sections().empty())
6100 {
6101 Input_section_list::const_iterator p = this->input_sections().begin();
6102 Arm_relobj<big_endian>* arm_relobj =
6103 Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
6104 unsigned exidx_shndx = p->shndx();
6105 const Arm_exidx_input_section* exidx_input_section =
6106 arm_relobj->exidx_input_section_by_shndx(exidx_shndx);
6107 gold_assert(exidx_input_section != NULL);
6108 unsigned int text_shndx = exidx_input_section->link();
6109 Output_section* os = arm_relobj->output_section(text_shndx);
6110 this->set_link_section(os);
6111 }
6112}
6113
8ffa3667
DK
6114// Arm_relobj methods.
6115
cf846138
DK
6116// Determine if an input section is scannable for stub processing. SHDR is
6117// the header of the section and SHNDX is the section index. OS is the output
6118// section for the input section and SYMTAB is the global symbol table used to
6119// look up ICF information.
6120
6121template<bool big_endian>
6122bool
6123Arm_relobj<big_endian>::section_is_scannable(
6124 const elfcpp::Shdr<32, big_endian>& shdr,
6125 unsigned int shndx,
6126 const Output_section* os,
ca09d69a 6127 const Symbol_table* symtab)
cf846138
DK
6128{
6129 // Skip any empty sections, unallocated sections or sections whose
6130 // type are not SHT_PROGBITS.
6131 if (shdr.get_sh_size() == 0
6132 || (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0
6133 || shdr.get_sh_type() != elfcpp::SHT_PROGBITS)
6134 return false;
6135
6136 // Skip any discarded or ICF'ed sections.
6137 if (os == NULL || symtab->is_section_folded(this, shndx))
6138 return false;
6139
6140 // If this requires special offset handling, check to see if it is
6141 // a relaxed section. If this is not, then it is a merged section that
6142 // we cannot handle.
6143 if (this->is_output_section_offset_invalid(shndx))
6144 {
6145 const Output_relaxed_input_section* poris =
6146 os->find_relaxed_input_section(this, shndx);
6147 if (poris == NULL)
6148 return false;
6149 }
6150
6151 return true;
6152}
6153
44272192
DK
6154// Determine if we want to scan the SHNDX-th section for relocation stubs.
6155// This is a helper for Arm_relobj::scan_sections_for_stubs() below.
6156
6157template<bool big_endian>
6158bool
6159Arm_relobj<big_endian>::section_needs_reloc_stub_scanning(
6160 const elfcpp::Shdr<32, big_endian>& shdr,
6161 const Relobj::Output_sections& out_sections,
ca09d69a 6162 const Symbol_table* symtab,
2b328d4e 6163 const unsigned char* pshdrs)
44272192
DK
6164{
6165 unsigned int sh_type = shdr.get_sh_type();
6166 if (sh_type != elfcpp::SHT_REL && sh_type != elfcpp::SHT_RELA)
6167 return false;
6168
6169 // Ignore empty section.
6170 off_t sh_size = shdr.get_sh_size();
6171 if (sh_size == 0)
6172 return false;
6173
44272192
DK
6174 // Ignore reloc section with unexpected symbol table. The
6175 // error will be reported in the final link.
6176 if (this->adjust_shndx(shdr.get_sh_link()) != this->symtab_shndx())
6177 return false;
6178
b521dfe4
DK
6179 unsigned int reloc_size;
6180 if (sh_type == elfcpp::SHT_REL)
6181 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6182 else
6183 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
44272192
DK
6184
6185 // Ignore reloc section with unexpected entsize or uneven size.
6186 // The error will be reported in the final link.
6187 if (reloc_size != shdr.get_sh_entsize() || sh_size % reloc_size != 0)
6188 return false;
6189
cf846138
DK
6190 // Ignore reloc section with bad info. This error will be
6191 // reported in the final link.
6192 unsigned int index = this->adjust_shndx(shdr.get_sh_info());
6193 if (index >= this->shnum())
6194 return false;
6195
6196 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6197 const elfcpp::Shdr<32, big_endian> text_shdr(pshdrs + index * shdr_size);
6198 return this->section_is_scannable(text_shdr, index,
6199 out_sections[index], symtab);
44272192
DK
6200}
6201
cb1be87e
DK
6202// Return the output address of either a plain input section or a relaxed
6203// input section. SHNDX is the section index. We define and use this
6204// instead of calling Output_section::output_address because that is slow
6205// for large output.
6206
6207template<bool big_endian>
6208Arm_address
6209Arm_relobj<big_endian>::simple_input_section_output_address(
6210 unsigned int shndx,
6211 Output_section* os)
6212{
6213 if (this->is_output_section_offset_invalid(shndx))
6214 {
6215 const Output_relaxed_input_section* poris =
6216 os->find_relaxed_input_section(this, shndx);
6217 // We do not handle merged sections here.
6218 gold_assert(poris != NULL);
6219 return poris->address();
6220 }
6221 else
6222 return os->address() + this->get_output_section_offset(shndx);
6223}
6224
44272192
DK
6225// Determine if we want to scan the SHNDX-th section for non-relocation stubs.
6226// This is a helper for Arm_relobj::scan_sections_for_stubs() below.
6227
6228template<bool big_endian>
6229bool
6230Arm_relobj<big_endian>::section_needs_cortex_a8_stub_scanning(
6231 const elfcpp::Shdr<32, big_endian>& shdr,
6232 unsigned int shndx,
6233 Output_section* os,
6234 const Symbol_table* symtab)
6235{
cf846138 6236 if (!this->section_is_scannable(shdr, shndx, os, symtab))
44272192
DK
6237 return false;
6238
44272192
DK
6239 // If the section does not cross any 4K-boundaries, it does not need to
6240 // be scanned.
cb1be87e 6241 Arm_address address = this->simple_input_section_output_address(shndx, os);
44272192
DK
6242 if ((address & ~0xfffU) == ((address + shdr.get_sh_size() - 1) & ~0xfffU))
6243 return false;
6244
6245 return true;
6246}
6247
6248// Scan a section for Cortex-A8 workaround.
6249
6250template<bool big_endian>
6251void
6252Arm_relobj<big_endian>::scan_section_for_cortex_a8_erratum(
6253 const elfcpp::Shdr<32, big_endian>& shdr,
6254 unsigned int shndx,
6255 Output_section* os,
6256 Target_arm<big_endian>* arm_target)
6257{
c8761b9a
DK
6258 // Look for the first mapping symbol in this section. It should be
6259 // at (shndx, 0).
6260 Mapping_symbol_position section_start(shndx, 0);
6261 typename Mapping_symbols_info::const_iterator p =
6262 this->mapping_symbols_info_.lower_bound(section_start);
6263
6264 // There are no mapping symbols for this section. Treat it as a data-only
61163dfa 6265 // section.
c8761b9a 6266 if (p == this->mapping_symbols_info_.end() || p->first.first != shndx)
61163dfa 6267 return;
c8761b9a 6268
cb1be87e
DK
6269 Arm_address output_address =
6270 this->simple_input_section_output_address(shndx, os);
44272192
DK
6271
6272 // Get the section contents.
6273 section_size_type input_view_size = 0;
6274 const unsigned char* input_view =
6275 this->section_contents(shndx, &input_view_size, false);
6276
6277 // We need to go through the mapping symbols to determine what to
6278 // scan. There are two reasons. First, we should look at THUMB code and
6279 // THUMB code only. Second, we only want to look at the 4K-page boundary
6280 // to speed up the scanning.
2e702c99 6281
44272192
DK
6282 while (p != this->mapping_symbols_info_.end()
6283 && p->first.first == shndx)
6284 {
6285 typename Mapping_symbols_info::const_iterator next =
6286 this->mapping_symbols_info_.upper_bound(p->first);
6287
6288 // Only scan part of a section with THUMB code.
6289 if (p->second == 't')
6290 {
6291 // Determine the end of this range.
6292 section_size_type span_start =
6293 convert_to_section_size_type(p->first.second);
6294 section_size_type span_end;
6295 if (next != this->mapping_symbols_info_.end()
6296 && next->first.first == shndx)
6297 span_end = convert_to_section_size_type(next->first.second);
6298 else
6299 span_end = convert_to_section_size_type(shdr.get_sh_size());
2e702c99 6300
44272192
DK
6301 if (((span_start + output_address) & ~0xfffUL)
6302 != ((span_end + output_address - 1) & ~0xfffUL))
6303 {
6304 arm_target->scan_span_for_cortex_a8_erratum(this, shndx,
6305 span_start, span_end,
6306 input_view,
6307 output_address);
6308 }
6309 }
6310
2e702c99 6311 p = next;
44272192
DK
6312 }
6313}
6314
8ffa3667
DK
6315// Scan relocations for stub generation.
6316
6317template<bool big_endian>
6318void
6319Arm_relobj<big_endian>::scan_sections_for_stubs(
6320 Target_arm<big_endian>* arm_target,
6321 const Symbol_table* symtab,
2ea97941 6322 const Layout* layout)
8ffa3667 6323{
2ea97941
ILT
6324 unsigned int shnum = this->shnum();
6325 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
8ffa3667
DK
6326
6327 // Read the section headers.
6328 const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
2ea97941 6329 shnum * shdr_size,
8ffa3667
DK
6330 true, true);
6331
6332 // To speed up processing, we set up hash tables for fast lookup of
6333 // input offsets to output addresses.
6334 this->initialize_input_to_output_maps();
6335
6336 const Relobj::Output_sections& out_sections(this->output_sections());
6337
6338 Relocate_info<32, big_endian> relinfo;
8ffa3667 6339 relinfo.symtab = symtab;
2ea97941 6340 relinfo.layout = layout;
8ffa3667
DK
6341 relinfo.object = this;
6342
44272192 6343 // Do relocation stubs scanning.
2ea97941
ILT
6344 const unsigned char* p = pshdrs + shdr_size;
6345 for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
8ffa3667 6346 {
44272192 6347 const elfcpp::Shdr<32, big_endian> shdr(p);
2b328d4e
DK
6348 if (this->section_needs_reloc_stub_scanning(shdr, out_sections, symtab,
6349 pshdrs))
8ffa3667 6350 {
44272192
DK
6351 unsigned int index = this->adjust_shndx(shdr.get_sh_info());
6352 Arm_address output_offset = this->get_output_section_offset(index);
6353 Arm_address output_address;
7296d933 6354 if (output_offset != invalid_address)
44272192
DK
6355 output_address = out_sections[index]->address() + output_offset;
6356 else
6357 {
6358 // Currently this only happens for a relaxed section.
6359 const Output_relaxed_input_section* poris =
6360 out_sections[index]->find_relaxed_input_section(this, index);
6361 gold_assert(poris != NULL);
6362 output_address = poris->address();
6363 }
8ffa3667 6364
44272192
DK
6365 // Get the relocations.
6366 const unsigned char* prelocs = this->get_view(shdr.get_sh_offset(),
6367 shdr.get_sh_size(),
6368 true, false);
6369
6370 // Get the section contents. This does work for the case in which
6371 // we modify the contents of an input section. We need to pass the
6372 // output view under such circumstances.
6373 section_size_type input_view_size = 0;
6374 const unsigned char* input_view =
6375 this->section_contents(index, &input_view_size, false);
6376
6377 relinfo.reloc_shndx = i;
6378 relinfo.data_shndx = index;
6379 unsigned int sh_type = shdr.get_sh_type();
b521dfe4
DK
6380 unsigned int reloc_size;
6381 if (sh_type == elfcpp::SHT_REL)
6382 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6383 else
6384 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
44272192
DK
6385
6386 Output_section* os = out_sections[index];
6387 arm_target->scan_section_for_stubs(&relinfo, sh_type, prelocs,
6388 shdr.get_sh_size() / reloc_size,
6389 os,
6390 output_offset == invalid_address,
6391 input_view, output_address,
6392 input_view_size);
8ffa3667 6393 }
44272192 6394 }
8ffa3667 6395
44272192
DK
6396 // Do Cortex-A8 erratum stubs scanning. This has to be done for a section
6397 // after its relocation section, if there is one, is processed for
6398 // relocation stubs. Merging this loop with the one above would have been
6399 // complicated since we would have had to make sure that relocation stub
6400 // scanning is done first.
6401 if (arm_target->fix_cortex_a8())
6402 {
6403 const unsigned char* p = pshdrs + shdr_size;
6404 for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
8ffa3667 6405 {
44272192
DK
6406 const elfcpp::Shdr<32, big_endian> shdr(p);
6407 if (this->section_needs_cortex_a8_stub_scanning(shdr, i,
6408 out_sections[i],
6409 symtab))
6410 this->scan_section_for_cortex_a8_erratum(shdr, i, out_sections[i],
6411 arm_target);
8ffa3667 6412 }
8ffa3667
DK
6413 }
6414
6415 // After we've done the relocations, we release the hash tables,
6416 // since we no longer need them.
6417 this->free_input_to_output_maps();
6418}
6419
6420// Count the local symbols. The ARM backend needs to know if a symbol
6421// is a THUMB function or not. For global symbols, it is easy because
6422// the Symbol object keeps the ELF symbol type. For local symbol it is
6423// harder because we cannot access this information. So we override the
6424// do_count_local_symbol in parent and scan local symbols to mark
6425// THUMB functions. This is not the most efficient way but I do not want to
9b547ce6 6426// slow down other ports by calling a per symbol target hook inside
2e702c99 6427// Sized_relobj_file<size, big_endian>::do_count_local_symbols.
8ffa3667
DK
6428
6429template<bool big_endian>
6430void
6431Arm_relobj<big_endian>::do_count_local_symbols(
6432 Stringpool_template<char>* pool,
6433 Stringpool_template<char>* dynpool)
6434{
6435 // We need to fix-up the values of any local symbols whose type are
6436 // STT_ARM_TFUNC.
2e702c99 6437
8ffa3667 6438 // Ask parent to count the local symbols.
6fa2a40b 6439 Sized_relobj_file<32, big_endian>::do_count_local_symbols(pool, dynpool);
8ffa3667
DK
6440 const unsigned int loccount = this->local_symbol_count();
6441 if (loccount == 0)
6442 return;
6443
9b547ce6 6444 // Initialize the thumb function bit-vector.
8ffa3667
DK
6445 std::vector<bool> empty_vector(loccount, false);
6446 this->local_symbol_is_thumb_function_.swap(empty_vector);
6447
6448 // Read the symbol table section header.
2ea97941 6449 const unsigned int symtab_shndx = this->symtab_shndx();
8ffa3667 6450 elfcpp::Shdr<32, big_endian>
2ea97941 6451 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
8ffa3667
DK
6452 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6453
6454 // Read the local symbols.
2ea97941 6455 const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
8ffa3667 6456 gold_assert(loccount == symtabshdr.get_sh_info());
2ea97941 6457 off_t locsize = loccount * sym_size;
8ffa3667
DK
6458 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6459 locsize, true, true);
6460
20138696
DK
6461 // For mapping symbol processing, we need to read the symbol names.
6462 unsigned int strtab_shndx = this->adjust_shndx(symtabshdr.get_sh_link());
6463 if (strtab_shndx >= this->shnum())
6464 {
6465 this->error(_("invalid symbol table name index: %u"), strtab_shndx);
6466 return;
6467 }
6468
6469 elfcpp::Shdr<32, big_endian>
6470 strtabshdr(this, this->elf_file()->section_header(strtab_shndx));
6471 if (strtabshdr.get_sh_type() != elfcpp::SHT_STRTAB)
6472 {
6473 this->error(_("symbol table name section has wrong type: %u"),
2e702c99 6474 static_cast<unsigned int>(strtabshdr.get_sh_type()));
20138696
DK
6475 return;
6476 }
6477 const char* pnames =
6478 reinterpret_cast<const char*>(this->get_view(strtabshdr.get_sh_offset(),
6479 strtabshdr.get_sh_size(),
6480 false, false));
6481
8ffa3667
DK
6482 // Loop over the local symbols and mark any local symbols pointing
6483 // to THUMB functions.
6484
6485 // Skip the first dummy symbol.
2ea97941 6486 psyms += sym_size;
6fa2a40b 6487 typename Sized_relobj_file<32, big_endian>::Local_values* plocal_values =
8ffa3667 6488 this->local_values();
2ea97941 6489 for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
8ffa3667
DK
6490 {
6491 elfcpp::Sym<32, big_endian> sym(psyms);
6492 elfcpp::STT st_type = sym.get_st_type();
6493 Symbol_value<32>& lv((*plocal_values)[i]);
6494 Arm_address input_value = lv.input_value();
6495
20138696
DK
6496 // Check to see if this is a mapping symbol.
6497 const char* sym_name = pnames + sym.get_st_name();
6498 if (Target_arm<big_endian>::is_mapping_symbol_name(sym_name))
6499 {
24af6f92
DK
6500 bool is_ordinary;
6501 unsigned int input_shndx =
6502 this->adjust_sym_shndx(i, sym.get_st_shndx(), &is_ordinary);
6503 gold_assert(is_ordinary);
20138696
DK
6504
6505 // Strip of LSB in case this is a THUMB symbol.
6506 Mapping_symbol_position msp(input_shndx, input_value & ~1U);
6507 this->mapping_symbols_info_[msp] = sym_name[1];
6508 }
6509
8ffa3667
DK
6510 if (st_type == elfcpp::STT_ARM_TFUNC
6511 || (st_type == elfcpp::STT_FUNC && ((input_value & 1) != 0)))
6512 {
6513 // This is a THUMB function. Mark this and canonicalize the
6514 // symbol value by setting LSB.
6515 this->local_symbol_is_thumb_function_[i] = true;
6516 if ((input_value & 1) == 0)
6517 lv.set_input_value(input_value | 1);
6518 }
6519 }
6520}
6521
6522// Relocate sections.
6523template<bool big_endian>
6524void
6525Arm_relobj<big_endian>::do_relocate_sections(
8ffa3667 6526 const Symbol_table* symtab,
2ea97941 6527 const Layout* layout,
8ffa3667 6528 const unsigned char* pshdrs,
aa98ff75 6529 Output_file* of,
6fa2a40b 6530 typename Sized_relobj_file<32, big_endian>::Views* pviews)
8ffa3667
DK
6531{
6532 // Call parent to relocate sections.
6fa2a40b 6533 Sized_relobj_file<32, big_endian>::do_relocate_sections(symtab, layout,
2e702c99 6534 pshdrs, of, pviews);
8ffa3667
DK
6535
6536 // We do not generate stubs if doing a relocatable link.
6537 if (parameters->options().relocatable())
6538 return;
6539
6540 // Relocate stub tables.
2ea97941 6541 unsigned int shnum = this->shnum();
8ffa3667
DK
6542
6543 Target_arm<big_endian>* arm_target =
6544 Target_arm<big_endian>::default_target();
6545
6546 Relocate_info<32, big_endian> relinfo;
8ffa3667 6547 relinfo.symtab = symtab;
2ea97941 6548 relinfo.layout = layout;
8ffa3667
DK
6549 relinfo.object = this;
6550
2ea97941 6551 for (unsigned int i = 1; i < shnum; ++i)
8ffa3667
DK
6552 {
6553 Arm_input_section<big_endian>* arm_input_section =
6554 arm_target->find_arm_input_section(this, i);
6555
41263c05
DK
6556 if (arm_input_section != NULL
6557 && arm_input_section->is_stub_table_owner()
6558 && !arm_input_section->stub_table()->empty())
6559 {
6560 // We cannot discard a section if it owns a stub table.
6561 Output_section* os = this->output_section(i);
6562 gold_assert(os != NULL);
6563
6564 relinfo.reloc_shndx = elfcpp::SHN_UNDEF;
6565 relinfo.reloc_shdr = NULL;
6566 relinfo.data_shndx = i;
6567 relinfo.data_shdr = pshdrs + i * elfcpp::Elf_sizes<32>::shdr_size;
6568
6569 gold_assert((*pviews)[i].view != NULL);
6570
6571 // We are passed the output section view. Adjust it to cover the
6572 // stub table only.
6573 Stub_table<big_endian>* stub_table = arm_input_section->stub_table();
6574 gold_assert((stub_table->address() >= (*pviews)[i].address)
6575 && ((stub_table->address() + stub_table->data_size())
6576 <= (*pviews)[i].address + (*pviews)[i].view_size));
6577
6578 off_t offset = stub_table->address() - (*pviews)[i].address;
6579 unsigned char* view = (*pviews)[i].view + offset;
6580 Arm_address address = stub_table->address();
6581 section_size_type view_size = stub_table->data_size();
2e702c99 6582
41263c05
DK
6583 stub_table->relocate_stubs(&relinfo, arm_target, os, view, address,
6584 view_size);
6585 }
6586
6587 // Apply Cortex A8 workaround if applicable.
6588 if (this->section_has_cortex_a8_workaround(i))
6589 {
6590 unsigned char* view = (*pviews)[i].view;
6591 Arm_address view_address = (*pviews)[i].address;
6592 section_size_type view_size = (*pviews)[i].view_size;
6593 Stub_table<big_endian>* stub_table = this->stub_tables_[i];
6594
6595 // Adjust view to cover section.
6596 Output_section* os = this->output_section(i);
6597 gold_assert(os != NULL);
cb1be87e
DK
6598 Arm_address section_address =
6599 this->simple_input_section_output_address(i, os);
41263c05
DK
6600 uint64_t section_size = this->section_size(i);
6601
6602 gold_assert(section_address >= view_address
6603 && ((section_address + section_size)
6604 <= (view_address + view_size)));
6605
6606 unsigned char* section_view = view + (section_address - view_address);
6607
6608 // Apply the Cortex-A8 workaround to the output address range
6609 // corresponding to this input section.
6610 stub_table->apply_cortex_a8_workaround_to_address_range(
6611 arm_target,
6612 section_view,
6613 section_address,
6614 section_size);
6615 }
8ffa3667
DK
6616 }
6617}
6618
9b547ce6 6619// Find the linked text section of an EXIDX section by looking at the first
c8761b9a 6620// relocation. 4.4.1 of the EHABI specifications says that an EXIDX section
9b547ce6 6621// must be linked to its associated code section via the sh_link field of
c8761b9a
DK
6622// its section header. However, some tools are broken and the link is not
6623// always set. LD just drops such an EXIDX section silently, causing the
6624// associated code not unwindabled. Here we try a little bit harder to
6625// discover the linked code section.
6626//
6627// PSHDR points to the section header of a relocation section of an EXIDX
6628// section. If we can find a linked text section, return true and
6629// store the text section index in the location PSHNDX. Otherwise
6630// return false.
a0351a69
DK
6631
6632template<bool big_endian>
c8761b9a
DK
6633bool
6634Arm_relobj<big_endian>::find_linked_text_section(
6635 const unsigned char* pshdr,
6636 const unsigned char* psyms,
6637 unsigned int* pshndx)
a0351a69 6638{
c8761b9a 6639 elfcpp::Shdr<32, big_endian> shdr(pshdr);
2e702c99 6640
c8761b9a
DK
6641 // If there is no relocation, we cannot find the linked text section.
6642 size_t reloc_size;
6643 if (shdr.get_sh_type() == elfcpp::SHT_REL)
6644 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6645 else
6646 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6647 size_t reloc_count = shdr.get_sh_size() / reloc_size;
2e702c99 6648
c8761b9a
DK
6649 // Get the relocations.
6650 const unsigned char* prelocs =
2e702c99 6651 this->get_view(shdr.get_sh_offset(), shdr.get_sh_size(), true, false);
993d07c1 6652
c8761b9a
DK
6653 // Find the REL31 relocation for the first word of the first EXIDX entry.
6654 for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
a0351a69 6655 {
c8761b9a
DK
6656 Arm_address r_offset;
6657 typename elfcpp::Elf_types<32>::Elf_WXword r_info;
6658 if (shdr.get_sh_type() == elfcpp::SHT_REL)
6659 {
6660 typename elfcpp::Rel<32, big_endian> reloc(prelocs);
6661 r_info = reloc.get_r_info();
6662 r_offset = reloc.get_r_offset();
6663 }
6664 else
6665 {
6666 typename elfcpp::Rela<32, big_endian> reloc(prelocs);
6667 r_info = reloc.get_r_info();
6668 r_offset = reloc.get_r_offset();
6669 }
6670
6671 unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
6672 if (r_type != elfcpp::R_ARM_PREL31 && r_type != elfcpp::R_ARM_SBREL31)
6673 continue;
6674
6675 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
6676 if (r_sym == 0
6677 || r_sym >= this->local_symbol_count()
6678 || r_offset != 0)
6679 continue;
6680
6681 // This is the relocation for the first word of the first EXIDX entry.
6682 // We expect to see a local section symbol.
6683 const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6684 elfcpp::Sym<32, big_endian> sym(psyms + r_sym * sym_size);
6685 if (sym.get_st_type() == elfcpp::STT_SECTION)
6686 {
24af6f92
DK
6687 bool is_ordinary;
6688 *pshndx =
6689 this->adjust_sym_shndx(r_sym, sym.get_st_shndx(), &is_ordinary);
6690 gold_assert(is_ordinary);
c8761b9a
DK
6691 return true;
6692 }
6693 else
6694 return false;
993d07c1 6695 }
c8761b9a
DK
6696
6697 return false;
6698}
6699
6700// Make an EXIDX input section object for an EXIDX section whose index is
6701// SHNDX. SHDR is the section header of the EXIDX section and TEXT_SHNDX
6702// is the section index of the linked text section.
6703
6704template<bool big_endian>
6705void
6706Arm_relobj<big_endian>::make_exidx_input_section(
6707 unsigned int shndx,
6708 const elfcpp::Shdr<32, big_endian>& shdr,
131687b4
DK
6709 unsigned int text_shndx,
6710 const elfcpp::Shdr<32, big_endian>& text_shdr)
c8761b9a 6711{
993d07c1
DK
6712 // Create an Arm_exidx_input_section object for this EXIDX section.
6713 Arm_exidx_input_section* exidx_input_section =
6714 new Arm_exidx_input_section(this, shndx, text_shndx, shdr.get_sh_size(),
f625ae50
DK
6715 shdr.get_sh_addralign(),
6716 text_shdr.get_sh_size());
993d07c1 6717
993d07c1
DK
6718 gold_assert(this->exidx_section_map_[shndx] == NULL);
6719 this->exidx_section_map_[shndx] = exidx_input_section;
131687b4
DK
6720
6721 if (text_shndx == elfcpp::SHN_UNDEF || text_shndx >= this->shnum())
6722 {
6723 gold_error(_("EXIDX section %s(%u) links to invalid section %u in %s"),
6724 this->section_name(shndx).c_str(), shndx, text_shndx,
6725 this->name().c_str());
6726 exidx_input_section->set_has_errors();
2e702c99 6727 }
131687b4
DK
6728 else if (this->exidx_section_map_[text_shndx] != NULL)
6729 {
6730 unsigned other_exidx_shndx =
6731 this->exidx_section_map_[text_shndx]->shndx();
6732 gold_error(_("EXIDX sections %s(%u) and %s(%u) both link to text section"
6733 "%s(%u) in %s"),
6734 this->section_name(shndx).c_str(), shndx,
6735 this->section_name(other_exidx_shndx).c_str(),
6736 other_exidx_shndx, this->section_name(text_shndx).c_str(),
6737 text_shndx, this->name().c_str());
6738 exidx_input_section->set_has_errors();
6739 }
6740 else
6741 this->exidx_section_map_[text_shndx] = exidx_input_section;
6742
6743 // Check section flags of text section.
6744 if ((text_shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
6745 {
6746 gold_error(_("EXIDX section %s(%u) links to non-allocated section %s(%u) "
6747 " in %s"),
6748 this->section_name(shndx).c_str(), shndx,
6749 this->section_name(text_shndx).c_str(), text_shndx,
6750 this->name().c_str());
6751 exidx_input_section->set_has_errors();
6752 }
6753 else if ((text_shdr.get_sh_flags() & elfcpp::SHF_EXECINSTR) == 0)
9b547ce6 6754 // I would like to make this an error but currently ld just ignores
131687b4
DK
6755 // this.
6756 gold_warning(_("EXIDX section %s(%u) links to non-executable section "
6757 "%s(%u) in %s"),
6758 this->section_name(shndx).c_str(), shndx,
6759 this->section_name(text_shndx).c_str(), text_shndx,
6760 this->name().c_str());
a0351a69
DK
6761}
6762
d5b40221
DK
6763// Read the symbol information.
6764
6765template<bool big_endian>
6766void
6767Arm_relobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
6768{
6769 // Call parent class to read symbol information.
f35c4853 6770 this->base_read_symbols(sd);
d5b40221 6771
7296d933
DK
6772 // If this input file is a binary file, it has no processor
6773 // specific flags and attributes section.
6774 Input_file::Format format = this->input_file()->format();
6775 if (format != Input_file::FORMAT_ELF)
6776 {
6777 gold_assert(format == Input_file::FORMAT_BINARY);
6778 this->merge_flags_and_attributes_ = false;
6779 return;
6780 }
6781
d5b40221
DK
6782 // Read processor-specific flags in ELF file header.
6783 const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
6784 elfcpp::Elf_sizes<32>::ehdr_size,
6785 true, false);
6786 elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
6787 this->processor_specific_flags_ = ehdr.get_e_flags();
993d07c1
DK
6788
6789 // Go over the section headers and look for .ARM.attributes and .ARM.exidx
6790 // sections.
c8761b9a 6791 std::vector<unsigned int> deferred_exidx_sections;
993d07c1 6792 const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
c8761b9a 6793 const unsigned char* pshdrs = sd->section_headers->data();
ca09d69a 6794 const unsigned char* ps = pshdrs + shdr_size;
7296d933 6795 bool must_merge_flags_and_attributes = false;
993d07c1
DK
6796 for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6797 {
6798 elfcpp::Shdr<32, big_endian> shdr(ps);
7296d933
DK
6799
6800 // Sometimes an object has no contents except the section name string
6801 // table and an empty symbol table with the undefined symbol. We
6802 // don't want to merge processor-specific flags from such an object.
6803 if (shdr.get_sh_type() == elfcpp::SHT_SYMTAB)
6804 {
6805 // Symbol table is not empty.
6806 const elfcpp::Elf_types<32>::Elf_WXword sym_size =
6807 elfcpp::Elf_sizes<32>::sym_size;
6808 if (shdr.get_sh_size() > sym_size)
6809 must_merge_flags_and_attributes = true;
6810 }
6811 else if (shdr.get_sh_type() != elfcpp::SHT_STRTAB)
6812 // If this is neither an empty symbol table nor a string table,
6813 // be conservative.
6814 must_merge_flags_and_attributes = true;
6815
993d07c1
DK
6816 if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
6817 {
2e702c99 6818 gold_assert(this->attributes_section_data_ == NULL);
993d07c1
DK
6819 section_offset_type section_offset = shdr.get_sh_offset();
6820 section_size_type section_size =
6821 convert_to_section_size_type(shdr.get_sh_size());
f625ae50
DK
6822 const unsigned char* view =
6823 this->get_view(section_offset, section_size, true, false);
993d07c1 6824 this->attributes_section_data_ =
f625ae50 6825 new Attributes_section_data(view, section_size);
993d07c1
DK
6826 }
6827 else if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
c8761b9a
DK
6828 {
6829 unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
131687b4 6830 if (text_shndx == elfcpp::SHN_UNDEF)
c8761b9a
DK
6831 deferred_exidx_sections.push_back(i);
6832 else
131687b4
DK
6833 {
6834 elfcpp::Shdr<32, big_endian> text_shdr(pshdrs
6835 + text_shndx * shdr_size);
6836 this->make_exidx_input_section(i, shdr, text_shndx, text_shdr);
6837 }
c9484ea5
DK
6838 // EHABI 4.4.1 requires that SHF_LINK_ORDER flag to be set.
6839 if ((shdr.get_sh_flags() & elfcpp::SHF_LINK_ORDER) == 0)
6840 gold_warning(_("SHF_LINK_ORDER not set in EXIDX section %s of %s"),
6841 this->section_name(i).c_str(), this->name().c_str());
c8761b9a
DK
6842 }
6843 }
6844
7296d933
DK
6845 // This is rare.
6846 if (!must_merge_flags_and_attributes)
6847 {
131687b4 6848 gold_assert(deferred_exidx_sections.empty());
7296d933
DK
6849 this->merge_flags_and_attributes_ = false;
6850 return;
6851 }
6852
2e702c99 6853 // Some tools are broken and they do not set the link of EXIDX sections.
c8761b9a
DK
6854 // We look at the first relocation to figure out the linked sections.
6855 if (!deferred_exidx_sections.empty())
6856 {
6857 // We need to go over the section headers again to find the mapping
6858 // from sections being relocated to their relocation sections. This is
6859 // a bit inefficient as we could do that in the loop above. However,
6860 // we do not expect any deferred EXIDX sections normally. So we do not
6861 // want to slow down the most common path.
6862 typedef Unordered_map<unsigned int, unsigned int> Reloc_map;
6863 Reloc_map reloc_map;
6864 ps = pshdrs + shdr_size;
6865 for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6866 {
6867 elfcpp::Shdr<32, big_endian> shdr(ps);
6868 elfcpp::Elf_Word sh_type = shdr.get_sh_type();
6869 if (sh_type == elfcpp::SHT_REL || sh_type == elfcpp::SHT_RELA)
6870 {
6871 unsigned int info_shndx = this->adjust_shndx(shdr.get_sh_info());
6872 if (info_shndx >= this->shnum())
6873 gold_error(_("relocation section %u has invalid info %u"),
6874 i, info_shndx);
6875 Reloc_map::value_type value(info_shndx, i);
6876 std::pair<Reloc_map::iterator, bool> result =
6877 reloc_map.insert(value);
6878 if (!result.second)
6879 gold_error(_("section %u has multiple relocation sections "
6880 "%u and %u"),
6881 info_shndx, i, reloc_map[info_shndx]);
6882 }
6883 }
6884
6885 // Read the symbol table section header.
6886 const unsigned int symtab_shndx = this->symtab_shndx();
6887 elfcpp::Shdr<32, big_endian>
6888 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6889 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6890
6891 // Read the local symbols.
6892 const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
6893 const unsigned int loccount = this->local_symbol_count();
6894 gold_assert(loccount == symtabshdr.get_sh_info());
6895 off_t locsize = loccount * sym_size;
6896 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6897 locsize, true, true);
6898
2e702c99 6899 // Process the deferred EXIDX sections.
f625ae50 6900 for (unsigned int i = 0; i < deferred_exidx_sections.size(); ++i)
c8761b9a
DK
6901 {
6902 unsigned int shndx = deferred_exidx_sections[i];
6903 elfcpp::Shdr<32, big_endian> shdr(pshdrs + shndx * shdr_size);
131687b4 6904 unsigned int text_shndx = elfcpp::SHN_UNDEF;
c8761b9a 6905 Reloc_map::const_iterator it = reloc_map.find(shndx);
131687b4
DK
6906 if (it != reloc_map.end())
6907 find_linked_text_section(pshdrs + it->second * shdr_size,
6908 psyms, &text_shndx);
6909 elfcpp::Shdr<32, big_endian> text_shdr(pshdrs
6910 + text_shndx * shdr_size);
6911 this->make_exidx_input_section(shndx, shdr, text_shndx, text_shdr);
c8761b9a 6912 }
993d07c1 6913 }
d5b40221
DK
6914}
6915
99e5bff2 6916// Process relocations for garbage collection. The ARM target uses .ARM.exidx
2e702c99 6917// sections for unwinding. These sections are referenced implicitly by
9b547ce6 6918// text sections linked in the section headers. If we ignore these implicit
99e5bff2
DK
6919// references, the .ARM.exidx sections and any .ARM.extab sections they use
6920// will be garbage-collected incorrectly. Hence we override the same function
6921// in the base class to handle these implicit references.
6922
6923template<bool big_endian>
6924void
6925Arm_relobj<big_endian>::do_gc_process_relocs(Symbol_table* symtab,
6926 Layout* layout,
6927 Read_relocs_data* rd)
6928{
6929 // First, call base class method to process relocations in this object.
6fa2a40b 6930 Sized_relobj_file<32, big_endian>::do_gc_process_relocs(symtab, layout, rd);
99e5bff2 6931
4a54abbb
DK
6932 // If --gc-sections is not specified, there is nothing more to do.
6933 // This happens when --icf is used but --gc-sections is not.
6934 if (!parameters->options().gc_sections())
6935 return;
2e702c99 6936
99e5bff2
DK
6937 unsigned int shnum = this->shnum();
6938 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6939 const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
6940 shnum * shdr_size,
6941 true, true);
6942
6943 // Scan section headers for sections of type SHT_ARM_EXIDX. Add references
6944 // to these from the linked text sections.
6945 const unsigned char* ps = pshdrs + shdr_size;
6946 for (unsigned int i = 1; i < shnum; ++i, ps += shdr_size)
6947 {
6948 elfcpp::Shdr<32, big_endian> shdr(ps);
6949 if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
6950 {
6951 // Found an .ARM.exidx section, add it to the set of reachable
6952 // sections from its linked text section.
6953 unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
6954 symtab->gc()->add_reference(this, text_shndx, this, i);
6955 }
6956 }
6957}
6958
e7eca48c
DK
6959// Update output local symbol count. Owing to EXIDX entry merging, some local
6960// symbols will be removed in output. Adjust output local symbol count
6961// accordingly. We can only changed the static output local symbol count. It
6962// is too late to change the dynamic symbols.
6963
6964template<bool big_endian>
6965void
6966Arm_relobj<big_endian>::update_output_local_symbol_count()
6967{
6968 // Caller should check that this needs updating. We want caller checking
6969 // because output_local_symbol_count_needs_update() is most likely inlined.
6970 gold_assert(this->output_local_symbol_count_needs_update_);
6971
6972 gold_assert(this->symtab_shndx() != -1U);
6973 if (this->symtab_shndx() == 0)
6974 {
6975 // This object has no symbols. Weird but legal.
6976 return;
6977 }
6978
6979 // Read the symbol table section header.
6980 const unsigned int symtab_shndx = this->symtab_shndx();
6981 elfcpp::Shdr<32, big_endian>
6982 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6983 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6984
6985 // Read the local symbols.
6986 const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6987 const unsigned int loccount = this->local_symbol_count();
6988 gold_assert(loccount == symtabshdr.get_sh_info());
6989 off_t locsize = loccount * sym_size;
6990 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6991 locsize, true, true);
6992
6993 // Loop over the local symbols.
6994
6fa2a40b 6995 typedef typename Sized_relobj_file<32, big_endian>::Output_sections
e7eca48c
DK
6996 Output_sections;
6997 const Output_sections& out_sections(this->output_sections());
6998 unsigned int shnum = this->shnum();
6999 unsigned int count = 0;
7000 // Skip the first, dummy, symbol.
7001 psyms += sym_size;
7002 for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
7003 {
7004 elfcpp::Sym<32, big_endian> sym(psyms);
7005
7006 Symbol_value<32>& lv((*this->local_values())[i]);
7007
7008 // This local symbol was already discarded by do_count_local_symbols.
9177756d 7009 if (lv.is_output_symtab_index_set() && !lv.has_output_symtab_entry())
e7eca48c
DK
7010 continue;
7011
7012 bool is_ordinary;
7013 unsigned int shndx = this->adjust_sym_shndx(i, sym.get_st_shndx(),
7014 &is_ordinary);
7015
7016 if (shndx < shnum)
7017 {
7018 Output_section* os = out_sections[shndx];
7019
7020 // This local symbol no longer has an output section. Discard it.
7021 if (os == NULL)
7022 {
7023 lv.set_no_output_symtab_entry();
7024 continue;
7025 }
7026
7027 // Currently we only discard parts of EXIDX input sections.
7028 // We explicitly check for a merged EXIDX input section to avoid
7029 // calling Output_section_data::output_offset unless necessary.
7030 if ((this->get_output_section_offset(shndx) == invalid_address)
7031 && (this->exidx_input_section_by_shndx(shndx) != NULL))
7032 {
7033 section_offset_type output_offset =
7034 os->output_offset(this, shndx, lv.input_value());
7035 if (output_offset == -1)
7036 {
7037 // This symbol is defined in a part of an EXIDX input section
7038 // that is discarded due to entry merging.
7039 lv.set_no_output_symtab_entry();
7040 continue;
2e702c99 7041 }
e7eca48c
DK
7042 }
7043 }
7044
7045 ++count;
7046 }
7047
7048 this->set_output_local_symbol_count(count);
7049 this->output_local_symbol_count_needs_update_ = false;
7050}
7051
d5b40221
DK
7052// Arm_dynobj methods.
7053
7054// Read the symbol information.
7055
7056template<bool big_endian>
7057void
7058Arm_dynobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
7059{
7060 // Call parent class to read symbol information.
f35c4853 7061 this->base_read_symbols(sd);
d5b40221
DK
7062
7063 // Read processor-specific flags in ELF file header.
7064 const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
7065 elfcpp::Elf_sizes<32>::ehdr_size,
7066 true, false);
7067 elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
7068 this->processor_specific_flags_ = ehdr.get_e_flags();
993d07c1
DK
7069
7070 // Read the attributes section if there is one.
7071 // We read from the end because gas seems to put it near the end of
7072 // the section headers.
7073 const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
ca09d69a 7074 const unsigned char* ps =
993d07c1
DK
7075 sd->section_headers->data() + shdr_size * (this->shnum() - 1);
7076 for (unsigned int i = this->shnum(); i > 0; --i, ps -= shdr_size)
7077 {
7078 elfcpp::Shdr<32, big_endian> shdr(ps);
7079 if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
7080 {
7081 section_offset_type section_offset = shdr.get_sh_offset();
7082 section_size_type section_size =
7083 convert_to_section_size_type(shdr.get_sh_size());
f625ae50
DK
7084 const unsigned char* view =
7085 this->get_view(section_offset, section_size, true, false);
993d07c1 7086 this->attributes_section_data_ =
f625ae50 7087 new Attributes_section_data(view, section_size);
993d07c1
DK
7088 break;
7089 }
7090 }
d5b40221
DK
7091}
7092
e9bbb538
DK
7093// Stub_addend_reader methods.
7094
7095// Read the addend of a REL relocation of type R_TYPE at VIEW.
7096
7097template<bool big_endian>
7098elfcpp::Elf_types<32>::Elf_Swxword
7099Stub_addend_reader<elfcpp::SHT_REL, big_endian>::operator()(
7100 unsigned int r_type,
7101 const unsigned char* view,
7102 const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const
7103{
2c54b4f4 7104 typedef class Arm_relocate_functions<big_endian> RelocFuncs;
2e702c99 7105
e9bbb538
DK
7106 switch (r_type)
7107 {
7108 case elfcpp::R_ARM_CALL:
7109 case elfcpp::R_ARM_JUMP24:
7110 case elfcpp::R_ARM_PLT32:
7111 {
7112 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
7113 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7114 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
bef2b434 7115 return Bits<26>::sign_extend32(val << 2);
e9bbb538
DK
7116 }
7117
7118 case elfcpp::R_ARM_THM_CALL:
7119 case elfcpp::R_ARM_THM_JUMP24:
7120 case elfcpp::R_ARM_THM_XPC22:
7121 {
e9bbb538
DK
7122 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
7123 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7124 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
7125 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
089d69dc 7126 return RelocFuncs::thumb32_branch_offset(upper_insn, lower_insn);
e9bbb538
DK
7127 }
7128
7129 case elfcpp::R_ARM_THM_JUMP19:
7130 {
7131 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
7132 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
7133 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
7134 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
089d69dc 7135 return RelocFuncs::thumb32_cond_branch_offset(upper_insn, lower_insn);
e9bbb538
DK
7136 }
7137
7138 default:
7139 gold_unreachable();
7140 }
7141}
7142
4a54abbb
DK
7143// Arm_output_data_got methods.
7144
7145// Add a GOT pair for R_ARM_TLS_GD32. The creates a pair of GOT entries.
7146// The first one is initialized to be 1, which is the module index for
7147// the main executable and the second one 0. A reloc of the type
7148// R_ARM_TLS_DTPOFF32 will be created for the second GOT entry and will
7149// be applied by gold. GSYM is a global symbol.
7150//
7151template<bool big_endian>
7152void
7153Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
7154 unsigned int got_type,
7155 Symbol* gsym)
7156{
7157 if (gsym->has_got_offset(got_type))
7158 return;
7159
7160 // We are doing a static link. Just mark it as belong to module 1,
7161 // the executable.
7162 unsigned int got_offset = this->add_constant(1);
2e702c99 7163 gsym->set_got_offset(got_type, got_offset);
4a54abbb
DK
7164 got_offset = this->add_constant(0);
7165 this->static_relocs_.push_back(Static_reloc(got_offset,
7166 elfcpp::R_ARM_TLS_DTPOFF32,
7167 gsym));
7168}
7169
7170// Same as the above but for a local symbol.
7171
7172template<bool big_endian>
7173void
7174Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
7175 unsigned int got_type,
6fa2a40b 7176 Sized_relobj_file<32, big_endian>* object,
4a54abbb
DK
7177 unsigned int index)
7178{
7179 if (object->local_has_got_offset(index, got_type))
7180 return;
7181
7182 // We are doing a static link. Just mark it as belong to module 1,
7183 // the executable.
7184 unsigned int got_offset = this->add_constant(1);
7185 object->set_local_got_offset(index, got_type, got_offset);
7186 got_offset = this->add_constant(0);
2e702c99
RM
7187 this->static_relocs_.push_back(Static_reloc(got_offset,
7188 elfcpp::R_ARM_TLS_DTPOFF32,
4a54abbb
DK
7189 object, index));
7190}
7191
7192template<bool big_endian>
7193void
7194Arm_output_data_got<big_endian>::do_write(Output_file* of)
7195{
7196 // Call parent to write out GOT.
7197 Output_data_got<32, big_endian>::do_write(of);
7198
7199 // We are done if there is no fix up.
7200 if (this->static_relocs_.empty())
7201 return;
7202
7203 gold_assert(parameters->doing_static_link());
7204
7205 const off_t offset = this->offset();
7206 const section_size_type oview_size =
7207 convert_to_section_size_type(this->data_size());
7208 unsigned char* const oview = of->get_output_view(offset, oview_size);
7209
7210 Output_segment* tls_segment = this->layout_->tls_segment();
7211 gold_assert(tls_segment != NULL);
2e702c99 7212
4a54abbb
DK
7213 // The thread pointer $tp points to the TCB, which is followed by the
7214 // TLS. So we need to adjust $tp relative addressing by this amount.
7215 Arm_address aligned_tcb_size =
7216 align_address(ARM_TCB_SIZE, tls_segment->maximum_alignment());
7217
7218 for (size_t i = 0; i < this->static_relocs_.size(); ++i)
7219 {
7220 Static_reloc& reloc(this->static_relocs_[i]);
2e702c99 7221
4a54abbb
DK
7222 Arm_address value;
7223 if (!reloc.symbol_is_global())
7224 {
6fa2a40b 7225 Sized_relobj_file<32, big_endian>* object = reloc.relobj();
4a54abbb
DK
7226 const Symbol_value<32>* psymval =
7227 reloc.relobj()->local_symbol(reloc.index());
7228
7229 // We are doing static linking. Issue an error and skip this
7230 // relocation if the symbol is undefined or in a discarded_section.
7231 bool is_ordinary;
7232 unsigned int shndx = psymval->input_shndx(&is_ordinary);
7233 if ((shndx == elfcpp::SHN_UNDEF)
7234 || (is_ordinary
7235 && shndx != elfcpp::SHN_UNDEF
7236 && !object->is_section_included(shndx)
7237 && !this->symbol_table_->is_section_folded(object, shndx)))
7238 {
7239 gold_error(_("undefined or discarded local symbol %u from "
7240 " object %s in GOT"),
7241 reloc.index(), reloc.relobj()->name().c_str());
7242 continue;
7243 }
2e702c99 7244
4a54abbb
DK
7245 value = psymval->value(object, 0);
7246 }
7247 else
7248 {
7249 const Symbol* gsym = reloc.symbol();
7250 gold_assert(gsym != NULL);
7251 if (gsym->is_forwarder())
7252 gsym = this->symbol_table_->resolve_forwards(gsym);
7253
7254 // We are doing static linking. Issue an error and skip this
7255 // relocation if the symbol is undefined or in a discarded_section
7256 // unless it is a weakly_undefined symbol.
7257 if ((gsym->is_defined_in_discarded_section()
7258 || gsym->is_undefined())
7259 && !gsym->is_weak_undefined())
7260 {
7261 gold_error(_("undefined or discarded symbol %s in GOT"),
7262 gsym->name());
7263 continue;
7264 }
7265
7266 if (!gsym->is_weak_undefined())
7267 {
7268 const Sized_symbol<32>* sym =
7269 static_cast<const Sized_symbol<32>*>(gsym);
7270 value = sym->value();
7271 }
7272 else
7273 value = 0;
7274 }
7275
7276 unsigned got_offset = reloc.got_offset();
7277 gold_assert(got_offset < oview_size);
7278
7279 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
7280 Valtype* wv = reinterpret_cast<Valtype*>(oview + got_offset);
7281 Valtype x;
7282 switch (reloc.r_type())
7283 {
7284 case elfcpp::R_ARM_TLS_DTPOFF32:
7285 x = value;
7286 break;
7287 case elfcpp::R_ARM_TLS_TPOFF32:
7288 x = value + aligned_tcb_size;
7289 break;
7290 default:
7291 gold_unreachable();
7292 }
7293 elfcpp::Swap<32, big_endian>::writeval(wv, x);
7294 }
7295
7296 of->write_output_view(offset, oview_size, oview);
7297}
7298
94cdfcff 7299// A class to handle the PLT data.
2e702c99
RM
7300// This is an abstract base class that handles most of the linker details
7301// but does not know the actual contents of PLT entries. The derived
7302// classes below fill in those details.
94cdfcff
DK
7303
7304template<bool big_endian>
7305class Output_data_plt_arm : public Output_section_data
7306{
7307 public:
fa89cc82
HS
7308 // Unlike aarch64, which records symbol value in "addend" field of relocations
7309 // and could be done at the same time an IRelative reloc is created for the
7310 // symbol, arm puts the symbol value into "GOT" table, which, however, is
7311 // issued later in Output_data_plt_arm::do_write(). So we have a struct here
7312 // to keep necessary symbol information for later use in do_write. We usually
7313 // have only a very limited number of ifuncs, so the extra data required here
7314 // is also limited.
7315
7316 struct IRelative_data
7317 {
7318 IRelative_data(Sized_symbol<32>* sized_symbol)
7319 : symbol_is_global_(true)
7320 {
7321 u_.global = sized_symbol;
7322 }
7323
7324 IRelative_data(Sized_relobj_file<32, big_endian>* relobj,
7325 unsigned int index)
7326 : symbol_is_global_(false)
7327 {
7328 u_.local.relobj = relobj;
7329 u_.local.index = index;
7330 }
7331
7332 union
7333 {
7334 Sized_symbol<32>* global;
7335
7336 struct
7337 {
7338 Sized_relobj_file<32, big_endian>* relobj;
7339 unsigned int index;
7340 } local;
7341 } u_;
7342
7343 bool symbol_is_global_;
7344 };
7345
94cdfcff
DK
7346 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
7347 Reloc_section;
7348
fa89cc82
HS
7349 Output_data_plt_arm(Layout* layout, uint64_t addralign,
7350 Arm_output_data_got<big_endian>* got,
7351 Output_data_space* got_plt,
7352 Output_data_space* got_irelative);
94cdfcff
DK
7353
7354 // Add an entry to the PLT.
7355 void
fa89cc82
HS
7356 add_entry(Symbol_table* symtab, Layout* layout, Symbol* gsym);
7357
7358 // Add the relocation for a plt entry.
7359 void
7360 add_relocation(Symbol_table* symtab, Layout* layout,
7361 Symbol* gsym, unsigned int got_offset);
7362
7363 // Add an entry to the PLT for a local STT_GNU_IFUNC symbol.
7364 unsigned int
7365 add_local_ifunc_entry(Symbol_table* symtab, Layout*,
7366 Sized_relobj_file<32, big_endian>* relobj,
7367 unsigned int local_sym_index);
94cdfcff
DK
7368
7369 // Return the .rel.plt section data.
7370 const Reloc_section*
7371 rel_plt() const
7372 { return this->rel_; }
7373
fa89cc82
HS
7374 // Return the PLT relocation container for IRELATIVE.
7375 Reloc_section*
7376 rel_irelative(Symbol_table*, Layout*);
7377
0e70b911
CC
7378 // Return the number of PLT entries.
7379 unsigned int
7380 entry_count() const
fa89cc82 7381 { return this->count_ + this->irelative_count_; }
0e70b911
CC
7382
7383 // Return the offset of the first non-reserved PLT entry.
2e702c99
RM
7384 unsigned int
7385 first_plt_entry_offset() const
7386 { return this->do_first_plt_entry_offset(); }
0e70b911
CC
7387
7388 // Return the size of a PLT entry.
2e702c99
RM
7389 unsigned int
7390 get_plt_entry_size() const
7391 { return this->do_get_plt_entry_size(); }
0e70b911 7392
fa89cc82
HS
7393 // Return the PLT address for globals.
7394 uint32_t
7395 address_for_global(const Symbol*) const;
7396
7397 // Return the PLT address for locals.
7398 uint32_t
7399 address_for_local(const Relobj*, unsigned int symndx) const;
7400
94cdfcff 7401 protected:
2e702c99
RM
7402 // Fill in the first PLT entry.
7403 void
7404 fill_first_plt_entry(unsigned char* pov,
7405 Arm_address got_address,
7406 Arm_address plt_address)
7407 { this->do_fill_first_plt_entry(pov, got_address, plt_address); }
7408
7409 void
7410 fill_plt_entry(unsigned char* pov,
7411 Arm_address got_address,
7412 Arm_address plt_address,
7413 unsigned int got_offset,
7414 unsigned int plt_offset)
7415 { do_fill_plt_entry(pov, got_address, plt_address, got_offset, plt_offset); }
7416
7417 virtual unsigned int
7418 do_first_plt_entry_offset() const = 0;
7419
7420 virtual unsigned int
7421 do_get_plt_entry_size() const = 0;
7422
7423 virtual void
7424 do_fill_first_plt_entry(unsigned char* pov,
7425 Arm_address got_address,
7426 Arm_address plt_address) = 0;
7427
7428 virtual void
7429 do_fill_plt_entry(unsigned char* pov,
7430 Arm_address got_address,
7431 Arm_address plt_address,
7432 unsigned int got_offset,
7433 unsigned int plt_offset) = 0;
7434
94cdfcff
DK
7435 void
7436 do_adjust_output_section(Output_section* os);
7437
7438 // Write to a map file.
7439 void
7440 do_print_to_mapfile(Mapfile* mapfile) const
7441 { mapfile->print_output_data(this, _("** PLT")); }
7442
7443 private:
94cdfcff
DK
7444 // Set the final size.
7445 void
7446 set_final_data_size()
7447 {
2e702c99 7448 this->set_data_size(this->first_plt_entry_offset()
fa89cc82
HS
7449 + ((this->count_ + this->irelative_count_)
7450 * this->get_plt_entry_size()));
94cdfcff
DK
7451 }
7452
7453 // Write out the PLT data.
7454 void
7455 do_write(Output_file*);
7456
fa89cc82
HS
7457 // Record irelative symbol data.
7458 void insert_irelative_data(const IRelative_data& idata)
7459 { irelative_data_vec_.push_back(idata); }
7460
94cdfcff
DK
7461 // The reloc section.
7462 Reloc_section* rel_;
fa89cc82
HS
7463 // The IRELATIVE relocs, if necessary. These must follow the
7464 // regular PLT relocations.
7465 Reloc_section* irelative_rel_;
7466 // The .got section.
7467 Arm_output_data_got<big_endian>* got_;
94cdfcff
DK
7468 // The .got.plt section.
7469 Output_data_space* got_plt_;
fa89cc82
HS
7470 // The part of the .got.plt section used for IRELATIVE relocs.
7471 Output_data_space* got_irelative_;
94cdfcff
DK
7472 // The number of PLT entries.
7473 unsigned int count_;
fa89cc82
HS
7474 // Number of PLT entries with R_ARM_IRELATIVE relocs. These
7475 // follow the regular PLT entries.
7476 unsigned int irelative_count_;
7477 // Vector for irelative data.
7478 typedef std::vector<IRelative_data> IRelative_data_vec;
7479 IRelative_data_vec irelative_data_vec_;
94cdfcff
DK
7480};
7481
7482// Create the PLT section. The ordinary .got section is an argument,
7483// since we need to refer to the start. We also create our own .got
7484// section just for PLT entries.
7485
7486template<bool big_endian>
fa89cc82
HS
7487Output_data_plt_arm<big_endian>::Output_data_plt_arm(
7488 Layout* layout, uint64_t addralign,
7489 Arm_output_data_got<big_endian>* got,
7490 Output_data_space* got_plt,
7491 Output_data_space* got_irelative)
7492 : Output_section_data(addralign), irelative_rel_(NULL),
7493 got_(got), got_plt_(got_plt), got_irelative_(got_irelative),
7494 count_(0), irelative_count_(0)
94cdfcff
DK
7495{
7496 this->rel_ = new Reloc_section(false);
2ea97941 7497 layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
22f0da72
ILT
7498 elfcpp::SHF_ALLOC, this->rel_,
7499 ORDER_DYNAMIC_PLT_RELOCS, false);
94cdfcff
DK
7500}
7501
7502template<bool big_endian>
7503void
7504Output_data_plt_arm<big_endian>::do_adjust_output_section(Output_section* os)
7505{
7506 os->set_entsize(0);
7507}
7508
7509// Add an entry to the PLT.
7510
7511template<bool big_endian>
7512void
fa89cc82
HS
7513Output_data_plt_arm<big_endian>::add_entry(Symbol_table* symtab,
7514 Layout* layout,
7515 Symbol* gsym)
94cdfcff
DK
7516{
7517 gold_assert(!gsym->has_plt_offset());
7518
fa89cc82
HS
7519 unsigned int* entry_count;
7520 Output_section_data_build* got;
7521
7522 // We have 2 different types of plt entry here, normal and ifunc.
7523
7524 // For normal plt, the offset begins with first_plt_entry_offset(20), and the
7525 // 1st entry offset would be 20, the second 32, third 44 ... etc.
7526
7527 // For ifunc plt, the offset begins with 0. So the first offset would 0,
7528 // second 12, third 24 ... etc.
7529
7530 // IFunc plt entries *always* come after *normal* plt entries.
7531
7532 // Notice, when computing the plt address of a certain symbol, "plt_address +
7533 // plt_offset" is no longer correct. Use target->plt_address_for_global() or
7534 // target->plt_address_for_local() instead.
7535
7536 int begin_offset = 0;
7537 if (gsym->type() == elfcpp::STT_GNU_IFUNC
7538 && gsym->can_use_relative_reloc(false))
7539 {
7540 entry_count = &this->irelative_count_;
7541 got = this->got_irelative_;
7542 // For irelative plt entries, offset is relative to the end of normal plt
7543 // entries, so it starts from 0.
7544 begin_offset = 0;
7545 // Record symbol information.
7546 this->insert_irelative_data(
7547 IRelative_data(symtab->get_sized_symbol<32>(gsym)));
7548 }
7549 else
7550 {
7551 entry_count = &this->count_;
7552 got = this->got_plt_;
7553 // Note that for normal plt entries, when setting the PLT offset we skip
7554 // the initial reserved PLT entry.
7555 begin_offset = this->first_plt_entry_offset();
7556 }
7557
7558 gsym->set_plt_offset(begin_offset
7559 + (*entry_count) * this->get_plt_entry_size());
94cdfcff 7560
fa89cc82 7561 ++(*entry_count);
94cdfcff 7562
fa89cc82 7563 section_offset_type got_offset = got->current_data_size();
94cdfcff
DK
7564
7565 // Every PLT entry needs a GOT entry which points back to the PLT
7566 // entry (this will be changed by the dynamic linker, normally
7567 // lazily when the function is called).
fa89cc82 7568 got->set_current_data_size(got_offset + 4);
94cdfcff
DK
7569
7570 // Every PLT entry needs a reloc.
fa89cc82 7571 this->add_relocation(symtab, layout, gsym, got_offset);
94cdfcff
DK
7572
7573 // Note that we don't need to save the symbol. The contents of the
7574 // PLT are independent of which symbols are used. The symbols only
7575 // appear in the relocations.
7576}
7577
fa89cc82
HS
7578// Add an entry to the PLT for a local STT_GNU_IFUNC symbol. Return
7579// the PLT offset.
7580
7581template<bool big_endian>
7582unsigned int
7583Output_data_plt_arm<big_endian>::add_local_ifunc_entry(
7584 Symbol_table* symtab,
7585 Layout* layout,
7586 Sized_relobj_file<32, big_endian>* relobj,
7587 unsigned int local_sym_index)
7588{
7589 this->insert_irelative_data(IRelative_data(relobj, local_sym_index));
7590
7591 // Notice, when computingthe plt entry address, "plt_address + plt_offset" is
7592 // no longer correct. Use target->plt_address_for_local() instead.
7593 unsigned int plt_offset = this->irelative_count_ * this->get_plt_entry_size();
7594 ++this->irelative_count_;
7595
7596 section_offset_type got_offset = this->got_irelative_->current_data_size();
7597
7598 // Every PLT entry needs a GOT entry which points back to the PLT
7599 // entry.
7600 this->got_irelative_->set_current_data_size(got_offset + 4);
7601
7602
7603 // Every PLT entry needs a reloc.
7604 Reloc_section* rel = this->rel_irelative(symtab, layout);
7605 rel->add_symbolless_local_addend(relobj, local_sym_index,
7606 elfcpp::R_ARM_IRELATIVE,
7607 this->got_irelative_, got_offset);
7608 return plt_offset;
7609}
7610
7611
7612// Add the relocation for a PLT entry.
7613
7614template<bool big_endian>
7615void
7616Output_data_plt_arm<big_endian>::add_relocation(
7617 Symbol_table* symtab, Layout* layout, Symbol* gsym, unsigned int got_offset)
7618{
7619 if (gsym->type() == elfcpp::STT_GNU_IFUNC
7620 && gsym->can_use_relative_reloc(false))
7621 {
7622 Reloc_section* rel = this->rel_irelative(symtab, layout);
7623 rel->add_symbolless_global_addend(gsym, elfcpp::R_ARM_IRELATIVE,
7624 this->got_irelative_, got_offset);
7625 }
7626 else
7627 {
7628 gsym->set_needs_dynsym_entry();
7629 this->rel_->add_global(gsym, elfcpp::R_ARM_JUMP_SLOT, this->got_plt_,
7630 got_offset);
7631 }
7632}
7633
7634
7635// Create the irelative relocation data.
7636
7637template<bool big_endian>
7638typename Output_data_plt_arm<big_endian>::Reloc_section*
7639Output_data_plt_arm<big_endian>::rel_irelative(Symbol_table* symtab,
7640 Layout* layout)
7641{
7642 if (this->irelative_rel_ == NULL)
7643 {
7644 // Since irelative relocations goes into 'rel.dyn', we delegate the
7645 // creation of irelative_rel_ to where rel_dyn section gets created.
7646 Target_arm<big_endian>* arm_target =
7647 Target_arm<big_endian>::default_target();
7648 this->irelative_rel_ = arm_target->rel_irelative_section(layout);
7649
7650 // Make sure we have a place for the TLSDESC relocations, in
7651 // case we see any later on.
7652 // this->rel_tlsdesc(layout);
7653 if (parameters->doing_static_link())
7654 {
7655 // A statically linked executable will only have a .rel.plt section to
7656 // hold R_ARM_IRELATIVE relocs for STT_GNU_IFUNC symbols. The library
7657 // will use these symbols to locate the IRELATIVE relocs at program
7658 // startup time.
7659 symtab->define_in_output_data("__rel_iplt_start", NULL,
7660 Symbol_table::PREDEFINED,
7661 this->irelative_rel_, 0, 0,
7662 elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
7663 elfcpp::STV_HIDDEN, 0, false, true);
7664 symtab->define_in_output_data("__rel_iplt_end", NULL,
7665 Symbol_table::PREDEFINED,
7666 this->irelative_rel_, 0, 0,
7667 elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
7668 elfcpp::STV_HIDDEN, 0, true, true);
7669 }
7670 }
7671 return this->irelative_rel_;
7672}
7673
7674
7675// Return the PLT address for a global symbol.
7676
7677template<bool big_endian>
7678uint32_t
7679Output_data_plt_arm<big_endian>::address_for_global(const Symbol* gsym) const
7680{
7681 uint64_t begin_offset = 0;
7682 if (gsym->type() == elfcpp::STT_GNU_IFUNC
7683 && gsym->can_use_relative_reloc(false))
7684 {
7685 begin_offset = (this->first_plt_entry_offset() +
7686 this->count_ * this->get_plt_entry_size());
7687 }
7688 return this->address() + begin_offset + gsym->plt_offset();
7689}
7690
7691
7692// Return the PLT address for a local symbol. These are always
7693// IRELATIVE relocs.
7694
7695template<bool big_endian>
7696uint32_t
7697Output_data_plt_arm<big_endian>::address_for_local(
7698 const Relobj* object,
7699 unsigned int r_sym) const
7700{
7701 return (this->address()
7702 + this->first_plt_entry_offset()
7703 + this->count_ * this->get_plt_entry_size()
7704 + object->local_plt_offset(r_sym));
7705}
7706
7707
2e702c99
RM
7708template<bool big_endian>
7709class Output_data_plt_arm_standard : public Output_data_plt_arm<big_endian>
7710{
7711 public:
fa89cc82
HS
7712 Output_data_plt_arm_standard(Layout* layout,
7713 Arm_output_data_got<big_endian>* got,
7714 Output_data_space* got_plt,
7715 Output_data_space* got_irelative)
7716 : Output_data_plt_arm<big_endian>(layout, 4, got, got_plt, got_irelative)
2e702c99
RM
7717 { }
7718
7719 protected:
7720 // Return the offset of the first non-reserved PLT entry.
7721 virtual unsigned int
7722 do_first_plt_entry_offset() const
7723 { return sizeof(first_plt_entry); }
7724
2e702c99
RM
7725 virtual void
7726 do_fill_first_plt_entry(unsigned char* pov,
7727 Arm_address got_address,
7728 Arm_address plt_address);
7729
2e702c99
RM
7730 private:
7731 // Template for the first PLT entry.
7732 static const uint32_t first_plt_entry[5];
2e702c99
RM
7733};
7734
94cdfcff
DK
7735// ARM PLTs.
7736// FIXME: This is not very flexible. Right now this has only been tested
7737// on armv5te. If we are to support additional architecture features like
7738// Thumb-2 or BE8, we need to make this more flexible like GNU ld.
7739
7740// The first entry in the PLT.
7741template<bool big_endian>
2e702c99 7742const uint32_t Output_data_plt_arm_standard<big_endian>::first_plt_entry[5] =
94cdfcff
DK
7743{
7744 0xe52de004, // str lr, [sp, #-4]!
7745 0xe59fe004, // ldr lr, [pc, #4]
2e702c99 7746 0xe08fe00e, // add lr, pc, lr
94cdfcff
DK
7747 0xe5bef008, // ldr pc, [lr, #8]!
7748 0x00000000, // &GOT[0] - .
7749};
7750
2e702c99
RM
7751template<bool big_endian>
7752void
7753Output_data_plt_arm_standard<big_endian>::do_fill_first_plt_entry(
7754 unsigned char* pov,
7755 Arm_address got_address,
7756 Arm_address plt_address)
7757{
7758 // Write first PLT entry. All but the last word are constants.
7759 const size_t num_first_plt_words = (sizeof(first_plt_entry)
ce3e4980 7760 / sizeof(first_plt_entry[0]));
2e702c99
RM
7761 for (size_t i = 0; i < num_first_plt_words - 1; i++)
7762 elfcpp::Swap<32, big_endian>::writeval(pov + i * 4, first_plt_entry[i]);
7763 // Last word in first PLT entry is &GOT[0] - .
7764 elfcpp::Swap<32, big_endian>::writeval(pov + 16,
7765 got_address - (plt_address + 16));
7766}
7767
94cdfcff 7768// Subsequent entries in the PLT.
ce3e4980
PC
7769// This class generates short (12-byte) entries, for displacements up to 2^28.
7770
7771template<bool big_endian>
7772class Output_data_plt_arm_short : public Output_data_plt_arm_standard<big_endian>
7773{
7774 public:
7775 Output_data_plt_arm_short(Layout* layout,
7776 Arm_output_data_got<big_endian>* got,
7777 Output_data_space* got_plt,
7778 Output_data_space* got_irelative)
7779 : Output_data_plt_arm_standard<big_endian>(layout, got, got_plt, got_irelative)
7780 { }
7781
7782 protected:
7783 // Return the size of a PLT entry.
7784 virtual unsigned int
7785 do_get_plt_entry_size() const
7786 { return sizeof(plt_entry); }
7787
7788 virtual void
7789 do_fill_plt_entry(unsigned char* pov,
7790 Arm_address got_address,
7791 Arm_address plt_address,
7792 unsigned int got_offset,
7793 unsigned int plt_offset);
7794
7795 private:
7796 // Template for subsequent PLT entries.
7797 static const uint32_t plt_entry[3];
7798};
94cdfcff
DK
7799
7800template<bool big_endian>
ce3e4980 7801const uint32_t Output_data_plt_arm_short<big_endian>::plt_entry[3] =
94cdfcff
DK
7802{
7803 0xe28fc600, // add ip, pc, #0xNN00000
7804 0xe28cca00, // add ip, ip, #0xNN000
7805 0xe5bcf000, // ldr pc, [ip, #0xNNN]!
7806};
7807
2e702c99
RM
7808template<bool big_endian>
7809void
ce3e4980 7810Output_data_plt_arm_short<big_endian>::do_fill_plt_entry(
2e702c99
RM
7811 unsigned char* pov,
7812 Arm_address got_address,
7813 Arm_address plt_address,
7814 unsigned int got_offset,
7815 unsigned int plt_offset)
7816{
7817 int32_t offset = ((got_address + got_offset)
7818 - (plt_address + plt_offset + 8));
ce3e4980
PC
7819 if (offset < 0 || offset > 0x0fffffff)
7820 gold_error(_("PLT offset too large, try linking with --long-plt"));
2e702c99 7821
2e702c99
RM
7822 uint32_t plt_insn0 = plt_entry[0] | ((offset >> 20) & 0xff);
7823 elfcpp::Swap<32, big_endian>::writeval(pov, plt_insn0);
7824 uint32_t plt_insn1 = plt_entry[1] | ((offset >> 12) & 0xff);
7825 elfcpp::Swap<32, big_endian>::writeval(pov + 4, plt_insn1);
7826 uint32_t plt_insn2 = plt_entry[2] | (offset & 0xfff);
7827 elfcpp::Swap<32, big_endian>::writeval(pov + 8, plt_insn2);
7828}
7829
ce3e4980
PC
7830// This class generates long (16-byte) entries, for arbitrary displacements.
7831
7832template<bool big_endian>
7833class Output_data_plt_arm_long : public Output_data_plt_arm_standard<big_endian>
7834{
7835 public:
7836 Output_data_plt_arm_long(Layout* layout,
7837 Arm_output_data_got<big_endian>* got,
7838 Output_data_space* got_plt,
7839 Output_data_space* got_irelative)
7840 : Output_data_plt_arm_standard<big_endian>(layout, got, got_plt, got_irelative)
7841 { }
7842
7843 protected:
7844 // Return the size of a PLT entry.
7845 virtual unsigned int
7846 do_get_plt_entry_size() const
7847 { return sizeof(plt_entry); }
7848
7849 virtual void
7850 do_fill_plt_entry(unsigned char* pov,
7851 Arm_address got_address,
7852 Arm_address plt_address,
7853 unsigned int got_offset,
7854 unsigned int plt_offset);
7855
7856 private:
7857 // Template for subsequent PLT entries.
7858 static const uint32_t plt_entry[4];
7859};
7860
7861template<bool big_endian>
7862const uint32_t Output_data_plt_arm_long<big_endian>::plt_entry[4] =
7863{
7864 0xe28fc200, // add ip, pc, #0xN0000000
7865 0xe28cc600, // add ip, ip, #0xNN00000
7866 0xe28cca00, // add ip, ip, #0xNN000
7867 0xe5bcf000, // ldr pc, [ip, #0xNNN]!
7868};
7869
7870template<bool big_endian>
7871void
7872Output_data_plt_arm_long<big_endian>::do_fill_plt_entry(
7873 unsigned char* pov,
7874 Arm_address got_address,
7875 Arm_address plt_address,
7876 unsigned int got_offset,
7877 unsigned int plt_offset)
7878{
7879 int32_t offset = ((got_address + got_offset)
7880 - (plt_address + plt_offset + 8));
7881
7882 uint32_t plt_insn0 = plt_entry[0] | (offset >> 28);
7883 elfcpp::Swap<32, big_endian>::writeval(pov, plt_insn0);
7884 uint32_t plt_insn1 = plt_entry[1] | ((offset >> 20) & 0xff);
7885 elfcpp::Swap<32, big_endian>::writeval(pov + 4, plt_insn1);
7886 uint32_t plt_insn2 = plt_entry[2] | ((offset >> 12) & 0xff);
7887 elfcpp::Swap<32, big_endian>::writeval(pov + 8, plt_insn2);
7888 uint32_t plt_insn3 = plt_entry[3] | (offset & 0xfff);
7889 elfcpp::Swap<32, big_endian>::writeval(pov + 12, plt_insn3);
7890}
7891
94cdfcff
DK
7892// Write out the PLT. This uses the hand-coded instructions above,
7893// and adjusts them as needed. This is all specified by the arm ELF
7894// Processor Supplement.
7895
7896template<bool big_endian>
7897void
7898Output_data_plt_arm<big_endian>::do_write(Output_file* of)
7899{
2ea97941 7900 const off_t offset = this->offset();
94cdfcff
DK
7901 const section_size_type oview_size =
7902 convert_to_section_size_type(this->data_size());
2ea97941 7903 unsigned char* const oview = of->get_output_view(offset, oview_size);
94cdfcff
DK
7904
7905 const off_t got_file_offset = this->got_plt_->offset();
fa89cc82
HS
7906 gold_assert(got_file_offset + this->got_plt_->data_size()
7907 == this->got_irelative_->offset());
94cdfcff 7908 const section_size_type got_size =
fa89cc82
HS
7909 convert_to_section_size_type(this->got_plt_->data_size()
7910 + this->got_irelative_->data_size());
94cdfcff
DK
7911 unsigned char* const got_view = of->get_output_view(got_file_offset,
7912 got_size);
7913 unsigned char* pov = oview;
7914
ebabffbd
DK
7915 Arm_address plt_address = this->address();
7916 Arm_address got_address = this->got_plt_->address();
94cdfcff 7917
2e702c99
RM
7918 // Write first PLT entry.
7919 this->fill_first_plt_entry(pov, got_address, plt_address);
7920 pov += this->first_plt_entry_offset();
94cdfcff
DK
7921
7922 unsigned char* got_pov = got_view;
7923
7924 memset(got_pov, 0, 12);
7925 got_pov += 12;
7926
2e702c99 7927 unsigned int plt_offset = this->first_plt_entry_offset();
94cdfcff 7928 unsigned int got_offset = 12;
fa89cc82
HS
7929 const unsigned int count = this->count_ + this->irelative_count_;
7930 gold_assert(this->irelative_count_ == this->irelative_data_vec_.size());
94cdfcff
DK
7931 for (unsigned int i = 0;
7932 i < count;
7933 ++i,
2e702c99 7934 pov += this->get_plt_entry_size(),
94cdfcff 7935 got_pov += 4,
2e702c99 7936 plt_offset += this->get_plt_entry_size(),
94cdfcff
DK
7937 got_offset += 4)
7938 {
7939 // Set and adjust the PLT entry itself.
2e702c99
RM
7940 this->fill_plt_entry(pov, got_address, plt_address,
7941 got_offset, plt_offset);
94cdfcff 7942
fa89cc82
HS
7943 Arm_address value;
7944 if (i < this->count_)
7945 {
7946 // For non-irelative got entries, the value is the beginning of plt.
7947 value = plt_address;
7948 }
7949 else
7950 {
7951 // For irelative got entries, the value is the (global/local) symbol
7952 // address.
7953 const IRelative_data& idata =
7954 this->irelative_data_vec_[i - this->count_];
7955 if (idata.symbol_is_global_)
7956 {
7957 // Set the entry in the GOT for irelative symbols. The content is
7958 // the address of the ifunc, not the address of plt start.
7959 const Sized_symbol<32>* sized_symbol = idata.u_.global;
7960 gold_assert(sized_symbol->type() == elfcpp::STT_GNU_IFUNC);
7961 value = sized_symbol->value();
7962 }
7963 else
7964 {
7965 value = idata.u_.local.relobj->local_symbol_value(
7966 idata.u_.local.index, 0);
7967 }
7968 }
7969 elfcpp::Swap<32, big_endian>::writeval(got_pov, value);
94cdfcff
DK
7970 }
7971
7972 gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
7973 gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
7974
2ea97941 7975 of->write_output_view(offset, oview_size, oview);
94cdfcff
DK
7976 of->write_output_view(got_file_offset, got_size, got_view);
7977}
7978
fa89cc82 7979
94cdfcff
DK
7980// Create a PLT entry for a global symbol.
7981
7982template<bool big_endian>
7983void
2ea97941 7984Target_arm<big_endian>::make_plt_entry(Symbol_table* symtab, Layout* layout,
94cdfcff
DK
7985 Symbol* gsym)
7986{
7987 if (gsym->has_plt_offset())
7988 return;
7989
fa89cc82
HS
7990 if (this->plt_ == NULL)
7991 this->make_plt_section(symtab, layout);
7992
7993 this->plt_->add_entry(symtab, layout, gsym);
7994}
7995
7996
7997// Create the PLT section.
7998template<bool big_endian>
7999void
8000Target_arm<big_endian>::make_plt_section(
8001 Symbol_table* symtab, Layout* layout)
8002{
94cdfcff
DK
8003 if (this->plt_ == NULL)
8004 {
fa89cc82 8005 // Create the GOT section first.
2ea97941 8006 this->got_section(symtab, layout);
94cdfcff 8007
fa89cc82
HS
8008 // GOT for irelatives is create along with got.plt.
8009 gold_assert(this->got_ != NULL
8010 && this->got_plt_ != NULL
8011 && this->got_irelative_ != NULL);
8012 this->plt_ = this->make_data_plt(layout, this->got_, this->got_plt_,
8013 this->got_irelative_);
2e702c99 8014
2ea97941
ILT
8015 layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
8016 (elfcpp::SHF_ALLOC
8017 | elfcpp::SHF_EXECINSTR),
22f0da72 8018 this->plt_, ORDER_PLT, false);
07f107f3
WN
8019 symtab->define_in_output_data("$a", NULL,
8020 Symbol_table::PREDEFINED,
8021 this->plt_,
8022 0, 0, elfcpp::STT_NOTYPE,
8023 elfcpp::STB_LOCAL,
8024 elfcpp::STV_DEFAULT, 0,
8025 false, false);
94cdfcff 8026 }
94cdfcff
DK
8027}
8028
fa89cc82
HS
8029
8030// Make a PLT entry for a local STT_GNU_IFUNC symbol.
8031
8032template<bool big_endian>
8033void
8034Target_arm<big_endian>::make_local_ifunc_plt_entry(
8035 Symbol_table* symtab, Layout* layout,
8036 Sized_relobj_file<32, big_endian>* relobj,
8037 unsigned int local_sym_index)
8038{
8039 if (relobj->local_has_plt_offset(local_sym_index))
8040 return;
8041 if (this->plt_ == NULL)
8042 this->make_plt_section(symtab, layout);
8043 unsigned int plt_offset = this->plt_->add_local_ifunc_entry(symtab, layout,
8044 relobj,
8045 local_sym_index);
8046 relobj->set_local_plt_offset(local_sym_index, plt_offset);
8047}
8048
8049
0e70b911
CC
8050// Return the number of entries in the PLT.
8051
8052template<bool big_endian>
8053unsigned int
8054Target_arm<big_endian>::plt_entry_count() const
8055{
8056 if (this->plt_ == NULL)
8057 return 0;
8058 return this->plt_->entry_count();
8059}
8060
8061// Return the offset of the first non-reserved PLT entry.
8062
8063template<bool big_endian>
8064unsigned int
8065Target_arm<big_endian>::first_plt_entry_offset() const
8066{
2e702c99 8067 return this->plt_->first_plt_entry_offset();
0e70b911
CC
8068}
8069
8070// Return the size of each PLT entry.
8071
8072template<bool big_endian>
8073unsigned int
8074Target_arm<big_endian>::plt_entry_size() const
8075{
2e702c99 8076 return this->plt_->get_plt_entry_size();
0e70b911
CC
8077}
8078
f96accdf
DK
8079// Get the section to use for TLS_DESC relocations.
8080
8081template<bool big_endian>
8082typename Target_arm<big_endian>::Reloc_section*
8083Target_arm<big_endian>::rel_tls_desc_section(Layout* layout) const
8084{
8085 return this->plt_section()->rel_tls_desc(layout);
8086}
8087
8088// Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
8089
8090template<bool big_endian>
8091void
8092Target_arm<big_endian>::define_tls_base_symbol(
8093 Symbol_table* symtab,
8094 Layout* layout)
8095{
8096 if (this->tls_base_symbol_defined_)
8097 return;
8098
8099 Output_segment* tls_segment = layout->tls_segment();
8100 if (tls_segment != NULL)
8101 {
8102 bool is_exec = parameters->options().output_is_executable();
8103 symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL,
8104 Symbol_table::PREDEFINED,
8105 tls_segment, 0, 0,
8106 elfcpp::STT_TLS,
8107 elfcpp::STB_LOCAL,
8108 elfcpp::STV_HIDDEN, 0,
8109 (is_exec
8110 ? Symbol::SEGMENT_END
8111 : Symbol::SEGMENT_START),
8112 true);
8113 }
8114 this->tls_base_symbol_defined_ = true;
8115}
8116
8117// Create a GOT entry for the TLS module index.
8118
8119template<bool big_endian>
8120unsigned int
8121Target_arm<big_endian>::got_mod_index_entry(
8122 Symbol_table* symtab,
8123 Layout* layout,
6fa2a40b 8124 Sized_relobj_file<32, big_endian>* object)
f96accdf
DK
8125{
8126 if (this->got_mod_index_offset_ == -1U)
8127 {
8128 gold_assert(symtab != NULL && layout != NULL && object != NULL);
4a54abbb
DK
8129 Arm_output_data_got<big_endian>* got = this->got_section(symtab, layout);
8130 unsigned int got_offset;
8131 if (!parameters->doing_static_link())
8132 {
8133 got_offset = got->add_constant(0);
8134 Reloc_section* rel_dyn = this->rel_dyn_section(layout);
8135 rel_dyn->add_local(object, 0, elfcpp::R_ARM_TLS_DTPMOD32, got,
8136 got_offset);
8137 }
8138 else
8139 {
8140 // We are doing a static link. Just mark it as belong to module 1,
8141 // the executable.
8142 got_offset = got->add_constant(1);
8143 }
8144
f96accdf
DK
8145 got->add_constant(0);
8146 this->got_mod_index_offset_ = got_offset;
8147 }
8148 return this->got_mod_index_offset_;
8149}
8150
8151// Optimize the TLS relocation type based on what we know about the
8152// symbol. IS_FINAL is true if the final address of this symbol is
8153// known at link time.
8154
8155template<bool big_endian>
8156tls::Tls_optimization
8157Target_arm<big_endian>::optimize_tls_reloc(bool, int)
8158{
8159 // FIXME: Currently we do not do any TLS optimization.
8160 return tls::TLSOPT_NONE;
8161}
8162
95a2c8d6
RS
8163// Get the Reference_flags for a particular relocation.
8164
8165template<bool big_endian>
8166int
8167Target_arm<big_endian>::Scan::get_reference_flags(unsigned int r_type)
8168{
8169 switch (r_type)
8170 {
8171 case elfcpp::R_ARM_NONE:
8172 case elfcpp::R_ARM_V4BX:
8173 case elfcpp::R_ARM_GNU_VTENTRY:
8174 case elfcpp::R_ARM_GNU_VTINHERIT:
8175 // No symbol reference.
8176 return 0;
8177
8178 case elfcpp::R_ARM_ABS32:
8179 case elfcpp::R_ARM_ABS16:
8180 case elfcpp::R_ARM_ABS12:
8181 case elfcpp::R_ARM_THM_ABS5:
8182 case elfcpp::R_ARM_ABS8:
8183 case elfcpp::R_ARM_BASE_ABS:
8184 case elfcpp::R_ARM_MOVW_ABS_NC:
8185 case elfcpp::R_ARM_MOVT_ABS:
8186 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
8187 case elfcpp::R_ARM_THM_MOVT_ABS:
8188 case elfcpp::R_ARM_ABS32_NOI:
8189 return Symbol::ABSOLUTE_REF;
8190
8191 case elfcpp::R_ARM_REL32:
8192 case elfcpp::R_ARM_LDR_PC_G0:
8193 case elfcpp::R_ARM_SBREL32:
8194 case elfcpp::R_ARM_THM_PC8:
8195 case elfcpp::R_ARM_BASE_PREL:
8196 case elfcpp::R_ARM_MOVW_PREL_NC:
8197 case elfcpp::R_ARM_MOVT_PREL:
8198 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
8199 case elfcpp::R_ARM_THM_MOVT_PREL:
8200 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
8201 case elfcpp::R_ARM_THM_PC12:
8202 case elfcpp::R_ARM_REL32_NOI:
8203 case elfcpp::R_ARM_ALU_PC_G0_NC:
8204 case elfcpp::R_ARM_ALU_PC_G0:
8205 case elfcpp::R_ARM_ALU_PC_G1_NC:
8206 case elfcpp::R_ARM_ALU_PC_G1:
8207 case elfcpp::R_ARM_ALU_PC_G2:
8208 case elfcpp::R_ARM_LDR_PC_G1:
8209 case elfcpp::R_ARM_LDR_PC_G2:
8210 case elfcpp::R_ARM_LDRS_PC_G0:
8211 case elfcpp::R_ARM_LDRS_PC_G1:
8212 case elfcpp::R_ARM_LDRS_PC_G2:
8213 case elfcpp::R_ARM_LDC_PC_G0:
8214 case elfcpp::R_ARM_LDC_PC_G1:
8215 case elfcpp::R_ARM_LDC_PC_G2:
8216 case elfcpp::R_ARM_ALU_SB_G0_NC:
8217 case elfcpp::R_ARM_ALU_SB_G0:
8218 case elfcpp::R_ARM_ALU_SB_G1_NC:
8219 case elfcpp::R_ARM_ALU_SB_G1:
8220 case elfcpp::R_ARM_ALU_SB_G2:
8221 case elfcpp::R_ARM_LDR_SB_G0:
8222 case elfcpp::R_ARM_LDR_SB_G1:
8223 case elfcpp::R_ARM_LDR_SB_G2:
8224 case elfcpp::R_ARM_LDRS_SB_G0:
8225 case elfcpp::R_ARM_LDRS_SB_G1:
8226 case elfcpp::R_ARM_LDRS_SB_G2:
8227 case elfcpp::R_ARM_LDC_SB_G0:
8228 case elfcpp::R_ARM_LDC_SB_G1:
8229 case elfcpp::R_ARM_LDC_SB_G2:
8230 case elfcpp::R_ARM_MOVW_BREL_NC:
8231 case elfcpp::R_ARM_MOVT_BREL:
8232 case elfcpp::R_ARM_MOVW_BREL:
8233 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
8234 case elfcpp::R_ARM_THM_MOVT_BREL:
8235 case elfcpp::R_ARM_THM_MOVW_BREL:
8236 case elfcpp::R_ARM_GOTOFF32:
8237 case elfcpp::R_ARM_GOTOFF12:
95a2c8d6
RS
8238 case elfcpp::R_ARM_SBREL31:
8239 return Symbol::RELATIVE_REF;
8240
8241 case elfcpp::R_ARM_PLT32:
8242 case elfcpp::R_ARM_CALL:
8243 case elfcpp::R_ARM_JUMP24:
8244 case elfcpp::R_ARM_THM_CALL:
8245 case elfcpp::R_ARM_THM_JUMP24:
8246 case elfcpp::R_ARM_THM_JUMP19:
8247 case elfcpp::R_ARM_THM_JUMP6:
8248 case elfcpp::R_ARM_THM_JUMP11:
8249 case elfcpp::R_ARM_THM_JUMP8:
017257f8
DK
8250 // R_ARM_PREL31 is not used to relocate call/jump instructions but
8251 // in unwind tables. It may point to functions via PLTs.
8252 // So we treat it like call/jump relocations above.
8253 case elfcpp::R_ARM_PREL31:
95a2c8d6
RS
8254 return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF;
8255
8256 case elfcpp::R_ARM_GOT_BREL:
8257 case elfcpp::R_ARM_GOT_ABS:
8258 case elfcpp::R_ARM_GOT_PREL:
8259 // Absolute in GOT.
8260 return Symbol::ABSOLUTE_REF;
8261
8262 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
8263 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
8264 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
8265 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
8266 case elfcpp::R_ARM_TLS_LE32: // Local-exec
8267 return Symbol::TLS_REF;
8268
8269 case elfcpp::R_ARM_TARGET1:
8270 case elfcpp::R_ARM_TARGET2:
8271 case elfcpp::R_ARM_COPY:
8272 case elfcpp::R_ARM_GLOB_DAT:
8273 case elfcpp::R_ARM_JUMP_SLOT:
8274 case elfcpp::R_ARM_RELATIVE:
8275 case elfcpp::R_ARM_PC24:
8276 case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
8277 case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
8278 case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
8279 default:
8280 // Not expected. We will give an error later.
8281 return 0;
8282 }
8283}
8284
4a657b0d
DK
8285// Report an unsupported relocation against a local symbol.
8286
8287template<bool big_endian>
8288void
8289Target_arm<big_endian>::Scan::unsupported_reloc_local(
6fa2a40b 8290 Sized_relobj_file<32, big_endian>* object,
4a657b0d
DK
8291 unsigned int r_type)
8292{
8293 gold_error(_("%s: unsupported reloc %u against local symbol"),
8294 object->name().c_str(), r_type);
8295}
8296
bec53400
DK
8297// We are about to emit a dynamic relocation of type R_TYPE. If the
8298// dynamic linker does not support it, issue an error. The GNU linker
8299// only issues a non-PIC error for an allocated read-only section.
8300// Here we know the section is allocated, but we don't know that it is
8301// read-only. But we check for all the relocation types which the
8302// glibc dynamic linker supports, so it seems appropriate to issue an
8303// error even if the section is not read-only.
8304
8305template<bool big_endian>
8306void
8307Target_arm<big_endian>::Scan::check_non_pic(Relobj* object,
8308 unsigned int r_type)
8309{
8310 switch (r_type)
8311 {
8312 // These are the relocation types supported by glibc for ARM.
8313 case elfcpp::R_ARM_RELATIVE:
8314 case elfcpp::R_ARM_COPY:
8315 case elfcpp::R_ARM_GLOB_DAT:
8316 case elfcpp::R_ARM_JUMP_SLOT:
8317 case elfcpp::R_ARM_ABS32:
be8fcb75 8318 case elfcpp::R_ARM_ABS32_NOI:
fa89cc82 8319 case elfcpp::R_ARM_IRELATIVE:
bec53400
DK
8320 case elfcpp::R_ARM_PC24:
8321 // FIXME: The following 3 types are not supported by Android's dynamic
8322 // linker.
8323 case elfcpp::R_ARM_TLS_DTPMOD32:
8324 case elfcpp::R_ARM_TLS_DTPOFF32:
8325 case elfcpp::R_ARM_TLS_TPOFF32:
8326 return;
8327
8328 default:
c8761b9a
DK
8329 {
8330 // This prevents us from issuing more than one error per reloc
8331 // section. But we can still wind up issuing more than one
8332 // error per object file.
8333 if (this->issued_non_pic_error_)
8334 return;
8335 const Arm_reloc_property* reloc_property =
8336 arm_reloc_property_table->get_reloc_property(r_type);
8337 gold_assert(reloc_property != NULL);
8338 object->error(_("requires unsupported dynamic reloc %s; "
8339 "recompile with -fPIC"),
8340 reloc_property->name().c_str());
8341 this->issued_non_pic_error_ = true;
bec53400 8342 return;
c8761b9a 8343 }
bec53400
DK
8344
8345 case elfcpp::R_ARM_NONE:
8346 gold_unreachable();
8347 }
8348}
8349
fa89cc82
HS
8350
8351// Return whether we need to make a PLT entry for a relocation of the
8352// given type against a STT_GNU_IFUNC symbol.
8353
8354template<bool big_endian>
8355bool
8356Target_arm<big_endian>::Scan::reloc_needs_plt_for_ifunc(
8357 Sized_relobj_file<32, big_endian>* object,
8358 unsigned int r_type)
8359{
8360 int flags = Scan::get_reference_flags(r_type);
8361 if (flags & Symbol::TLS_REF)
8362 {
8363 gold_error(_("%s: unsupported TLS reloc %u for IFUNC symbol"),
8364 object->name().c_str(), r_type);
8365 return false;
8366 }
8367 return flags != 0;
8368}
8369
8370
4a657b0d 8371// Scan a relocation for a local symbol.
bec53400
DK
8372// FIXME: This only handles a subset of relocation types used by Android
8373// on ARM v5te devices.
4a657b0d
DK
8374
8375template<bool big_endian>
8376inline void
ad0f2072 8377Target_arm<big_endian>::Scan::local(Symbol_table* symtab,
2ea97941 8378 Layout* layout,
bec53400 8379 Target_arm* target,
6fa2a40b 8380 Sized_relobj_file<32, big_endian>* object,
bec53400
DK
8381 unsigned int data_shndx,
8382 Output_section* output_section,
8383 const elfcpp::Rel<32, big_endian>& reloc,
4a657b0d 8384 unsigned int r_type,
bfdfa4cd
AM
8385 const elfcpp::Sym<32, big_endian>& lsym,
8386 bool is_discarded)
4a657b0d 8387{
bfdfa4cd
AM
8388 if (is_discarded)
8389 return;
8390
a6d1ef57 8391 r_type = get_real_reloc_type(r_type);
fa89cc82
HS
8392
8393 // A local STT_GNU_IFUNC symbol may require a PLT entry.
8394 bool is_ifunc = lsym.get_st_type() == elfcpp::STT_GNU_IFUNC;
8395 if (is_ifunc && this->reloc_needs_plt_for_ifunc(object, r_type))
8396 {
8397 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
8398 target->make_local_ifunc_plt_entry(symtab, layout, object, r_sym);
8399 }
8400
4a657b0d
DK
8401 switch (r_type)
8402 {
8403 case elfcpp::R_ARM_NONE:
e4782e83
DK
8404 case elfcpp::R_ARM_V4BX:
8405 case elfcpp::R_ARM_GNU_VTENTRY:
8406 case elfcpp::R_ARM_GNU_VTINHERIT:
4a657b0d
DK
8407 break;
8408
bec53400 8409 case elfcpp::R_ARM_ABS32:
be8fcb75 8410 case elfcpp::R_ARM_ABS32_NOI:
bec53400
DK
8411 // If building a shared library (or a position-independent
8412 // executable), we need to create a dynamic relocation for
8413 // this location. The relocation applied at link time will
8414 // apply the link-time value, so we flag the location with
8415 // an R_ARM_RELATIVE relocation so the dynamic loader can
8416 // relocate it easily.
8417 if (parameters->options().output_is_position_independent())
8418 {
2ea97941 8419 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
bec53400 8420 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
2e702c99
RM
8421 // If we are to add more other reloc types than R_ARM_ABS32,
8422 // we need to add check_non_pic(object, r_type) here.
bec53400
DK
8423 rel_dyn->add_local_relative(object, r_sym, elfcpp::R_ARM_RELATIVE,
8424 output_section, data_shndx,
fa89cc82 8425 reloc.get_r_offset(), is_ifunc);
bec53400
DK
8426 }
8427 break;
8428
e4782e83
DK
8429 case elfcpp::R_ARM_ABS16:
8430 case elfcpp::R_ARM_ABS12:
be8fcb75
ILT
8431 case elfcpp::R_ARM_THM_ABS5:
8432 case elfcpp::R_ARM_ABS8:
be8fcb75 8433 case elfcpp::R_ARM_BASE_ABS:
fd3c5f0b
ILT
8434 case elfcpp::R_ARM_MOVW_ABS_NC:
8435 case elfcpp::R_ARM_MOVT_ABS:
8436 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
8437 case elfcpp::R_ARM_THM_MOVT_ABS:
e4782e83
DK
8438 // If building a shared library (or a position-independent
8439 // executable), we need to create a dynamic relocation for
8440 // this location. Because the addend needs to remain in the
8441 // data section, we need to be careful not to apply this
8442 // relocation statically.
8443 if (parameters->options().output_is_position_independent())
2e702c99 8444 {
e4782e83 8445 check_non_pic(object, r_type);
2e702c99 8446 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
e4782e83 8447 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
2e702c99 8448 if (lsym.get_st_type() != elfcpp::STT_SECTION)
e4782e83
DK
8449 rel_dyn->add_local(object, r_sym, r_type, output_section,
8450 data_shndx, reloc.get_r_offset());
2e702c99
RM
8451 else
8452 {
8453 gold_assert(lsym.get_st_value() == 0);
e4782e83
DK
8454 unsigned int shndx = lsym.get_st_shndx();
8455 bool is_ordinary;
8456 shndx = object->adjust_sym_shndx(r_sym, shndx,
8457 &is_ordinary);
8458 if (!is_ordinary)
8459 object->error(_("section symbol %u has bad shndx %u"),
8460 r_sym, shndx);
8461 else
8462 rel_dyn->add_local_section(object, shndx,
8463 r_type, output_section,
8464 data_shndx, reloc.get_r_offset());
2e702c99
RM
8465 }
8466 }
e4782e83
DK
8467 break;
8468
e4782e83
DK
8469 case elfcpp::R_ARM_REL32:
8470 case elfcpp::R_ARM_LDR_PC_G0:
8471 case elfcpp::R_ARM_SBREL32:
8472 case elfcpp::R_ARM_THM_CALL:
8473 case elfcpp::R_ARM_THM_PC8:
8474 case elfcpp::R_ARM_BASE_PREL:
8475 case elfcpp::R_ARM_PLT32:
8476 case elfcpp::R_ARM_CALL:
8477 case elfcpp::R_ARM_JUMP24:
8478 case elfcpp::R_ARM_THM_JUMP24:
e4782e83
DK
8479 case elfcpp::R_ARM_SBREL31:
8480 case elfcpp::R_ARM_PREL31:
c2a122b6
ILT
8481 case elfcpp::R_ARM_MOVW_PREL_NC:
8482 case elfcpp::R_ARM_MOVT_PREL:
8483 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
8484 case elfcpp::R_ARM_THM_MOVT_PREL:
e4782e83 8485 case elfcpp::R_ARM_THM_JUMP19:
800d0f56 8486 case elfcpp::R_ARM_THM_JUMP6:
11b861d5 8487 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
e4782e83
DK
8488 case elfcpp::R_ARM_THM_PC12:
8489 case elfcpp::R_ARM_REL32_NOI:
b10d2873
ILT
8490 case elfcpp::R_ARM_ALU_PC_G0_NC:
8491 case elfcpp::R_ARM_ALU_PC_G0:
8492 case elfcpp::R_ARM_ALU_PC_G1_NC:
8493 case elfcpp::R_ARM_ALU_PC_G1:
8494 case elfcpp::R_ARM_ALU_PC_G2:
e4782e83
DK
8495 case elfcpp::R_ARM_LDR_PC_G1:
8496 case elfcpp::R_ARM_LDR_PC_G2:
8497 case elfcpp::R_ARM_LDRS_PC_G0:
8498 case elfcpp::R_ARM_LDRS_PC_G1:
8499 case elfcpp::R_ARM_LDRS_PC_G2:
8500 case elfcpp::R_ARM_LDC_PC_G0:
8501 case elfcpp::R_ARM_LDC_PC_G1:
8502 case elfcpp::R_ARM_LDC_PC_G2:
b10d2873
ILT
8503 case elfcpp::R_ARM_ALU_SB_G0_NC:
8504 case elfcpp::R_ARM_ALU_SB_G0:
8505 case elfcpp::R_ARM_ALU_SB_G1_NC:
8506 case elfcpp::R_ARM_ALU_SB_G1:
8507 case elfcpp::R_ARM_ALU_SB_G2:
b10d2873
ILT
8508 case elfcpp::R_ARM_LDR_SB_G0:
8509 case elfcpp::R_ARM_LDR_SB_G1:
8510 case elfcpp::R_ARM_LDR_SB_G2:
b10d2873
ILT
8511 case elfcpp::R_ARM_LDRS_SB_G0:
8512 case elfcpp::R_ARM_LDRS_SB_G1:
8513 case elfcpp::R_ARM_LDRS_SB_G2:
b10d2873
ILT
8514 case elfcpp::R_ARM_LDC_SB_G0:
8515 case elfcpp::R_ARM_LDC_SB_G1:
8516 case elfcpp::R_ARM_LDC_SB_G2:
e4782e83
DK
8517 case elfcpp::R_ARM_MOVW_BREL_NC:
8518 case elfcpp::R_ARM_MOVT_BREL:
8519 case elfcpp::R_ARM_MOVW_BREL:
8520 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
8521 case elfcpp::R_ARM_THM_MOVT_BREL:
8522 case elfcpp::R_ARM_THM_MOVW_BREL:
8523 case elfcpp::R_ARM_THM_JUMP11:
8524 case elfcpp::R_ARM_THM_JUMP8:
8525 // We don't need to do anything for a relative addressing relocation
8526 // against a local symbol if it does not reference the GOT.
bec53400
DK
8527 break;
8528
8529 case elfcpp::R_ARM_GOTOFF32:
e4782e83 8530 case elfcpp::R_ARM_GOTOFF12:
bec53400 8531 // We need a GOT section:
2ea97941 8532 target->got_section(symtab, layout);
bec53400
DK
8533 break;
8534
bec53400 8535 case elfcpp::R_ARM_GOT_BREL:
7f5309a5 8536 case elfcpp::R_ARM_GOT_PREL:
bec53400
DK
8537 {
8538 // The symbol requires a GOT entry.
4a54abbb 8539 Arm_output_data_got<big_endian>* got =
2ea97941 8540 target->got_section(symtab, layout);
bec53400
DK
8541 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
8542 if (got->add_local(object, r_sym, GOT_TYPE_STANDARD))
8543 {
8544 // If we are generating a shared object, we need to add a
8545 // dynamic RELATIVE relocation for this symbol's GOT entry.
8546 if (parameters->options().output_is_position_independent())
8547 {
2ea97941
ILT
8548 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8549 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
bec53400 8550 rel_dyn->add_local_relative(
2ea97941
ILT
8551 object, r_sym, elfcpp::R_ARM_RELATIVE, got,
8552 object->local_got_offset(r_sym, GOT_TYPE_STANDARD));
bec53400
DK
8553 }
8554 }
8555 }
8556 break;
8557
8558 case elfcpp::R_ARM_TARGET1:
e4782e83 8559 case elfcpp::R_ARM_TARGET2:
bec53400
DK
8560 // This should have been mapped to another type already.
8561 // Fall through.
8562 case elfcpp::R_ARM_COPY:
8563 case elfcpp::R_ARM_GLOB_DAT:
8564 case elfcpp::R_ARM_JUMP_SLOT:
8565 case elfcpp::R_ARM_RELATIVE:
8566 // These are relocations which should only be seen by the
8567 // dynamic linker, and should never be seen here.
8568 gold_error(_("%s: unexpected reloc %u in object file"),
8569 object->name().c_str(), r_type);
8570 break;
8571
f96accdf
DK
8572
8573 // These are initial TLS relocs, which are expected when
8574 // linking.
8575 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
8576 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
8577 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
8578 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
8579 case elfcpp::R_ARM_TLS_LE32: // Local-exec
8580 {
8581 bool output_is_shared = parameters->options().shared();
8582 const tls::Tls_optimization optimized_type
2e702c99 8583 = Target_arm<big_endian>::optimize_tls_reloc(!output_is_shared,
f96accdf
DK
8584 r_type);
8585 switch (r_type)
8586 {
8587 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
8588 if (optimized_type == tls::TLSOPT_NONE)
8589 {
2e702c99
RM
8590 // Create a pair of GOT entries for the module index and
8591 // dtv-relative offset.
8592 Arm_output_data_got<big_endian>* got
8593 = target->got_section(symtab, layout);
8594 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
f96accdf
DK
8595 unsigned int shndx = lsym.get_st_shndx();
8596 bool is_ordinary;
8597 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
8598 if (!is_ordinary)
4a54abbb
DK
8599 {
8600 object->error(_("local symbol %u has bad shndx %u"),
8601 r_sym, shndx);
8602 break;
8603 }
8604
8605 if (!parameters->doing_static_link())
f96accdf
DK
8606 got->add_local_pair_with_rel(object, r_sym, shndx,
8607 GOT_TYPE_TLS_PAIR,
8608 target->rel_dyn_section(layout),
bd73a62d 8609 elfcpp::R_ARM_TLS_DTPMOD32);
4a54abbb
DK
8610 else
8611 got->add_tls_gd32_with_static_reloc(GOT_TYPE_TLS_PAIR,
8612 object, r_sym);
f96accdf
DK
8613 }
8614 else
8615 // FIXME: TLS optimization not supported yet.
8616 gold_unreachable();
8617 break;
8618
8619 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
8620 if (optimized_type == tls::TLSOPT_NONE)
8621 {
2e702c99
RM
8622 // Create a GOT entry for the module index.
8623 target->got_mod_index_entry(symtab, layout, object);
f96accdf
DK
8624 }
8625 else
8626 // FIXME: TLS optimization not supported yet.
8627 gold_unreachable();
8628 break;
8629
8630 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
8631 break;
8632
8633 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
8634 layout->set_has_static_tls();
8635 if (optimized_type == tls::TLSOPT_NONE)
8636 {
4a54abbb
DK
8637 // Create a GOT entry for the tp-relative offset.
8638 Arm_output_data_got<big_endian>* got
8639 = target->got_section(symtab, layout);
8640 unsigned int r_sym =
8641 elfcpp::elf_r_sym<32>(reloc.get_r_info());
8642 if (!parameters->doing_static_link())
8643 got->add_local_with_rel(object, r_sym, GOT_TYPE_TLS_OFFSET,
8644 target->rel_dyn_section(layout),
8645 elfcpp::R_ARM_TLS_TPOFF32);
8646 else if (!object->local_has_got_offset(r_sym,
8647 GOT_TYPE_TLS_OFFSET))
8648 {
8649 got->add_local(object, r_sym, GOT_TYPE_TLS_OFFSET);
8650 unsigned int got_offset =
8651 object->local_got_offset(r_sym, GOT_TYPE_TLS_OFFSET);
8652 got->add_static_reloc(got_offset,
8653 elfcpp::R_ARM_TLS_TPOFF32, object,
8654 r_sym);
8655 }
f96accdf
DK
8656 }
8657 else
8658 // FIXME: TLS optimization not supported yet.
8659 gold_unreachable();
8660 break;
8661
8662 case elfcpp::R_ARM_TLS_LE32: // Local-exec
8663 layout->set_has_static_tls();
8664 if (output_is_shared)
8665 {
2e702c99
RM
8666 // We need to create a dynamic relocation.
8667 gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
8668 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
f96accdf
DK
8669 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8670 rel_dyn->add_local(object, r_sym, elfcpp::R_ARM_TLS_TPOFF32,
8671 output_section, data_shndx,
8672 reloc.get_r_offset());
8673 }
8674 break;
8675
8676 default:
8677 gold_unreachable();
8678 }
8679 }
8680 break;
8681
3cef7179
ILT
8682 case elfcpp::R_ARM_PC24:
8683 case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
8684 case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
8685 case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
4a657b0d
DK
8686 default:
8687 unsupported_reloc_local(object, r_type);
8688 break;
8689 }
8690}
8691
8692// Report an unsupported relocation against a global symbol.
8693
8694template<bool big_endian>
8695void
8696Target_arm<big_endian>::Scan::unsupported_reloc_global(
6fa2a40b 8697 Sized_relobj_file<32, big_endian>* object,
4a657b0d
DK
8698 unsigned int r_type,
8699 Symbol* gsym)
8700{
8701 gold_error(_("%s: unsupported reloc %u against global symbol %s"),
8702 object->name().c_str(), r_type, gsym->demangled_name().c_str());
8703}
8704
8a75a161
DK
8705template<bool big_endian>
8706inline bool
8707Target_arm<big_endian>::Scan::possible_function_pointer_reloc(
8708 unsigned int r_type)
8709{
8710 switch (r_type)
8711 {
8712 case elfcpp::R_ARM_PC24:
8713 case elfcpp::R_ARM_THM_CALL:
8714 case elfcpp::R_ARM_PLT32:
8715 case elfcpp::R_ARM_CALL:
8716 case elfcpp::R_ARM_JUMP24:
8717 case elfcpp::R_ARM_THM_JUMP24:
8718 case elfcpp::R_ARM_SBREL31:
8719 case elfcpp::R_ARM_PREL31:
8720 case elfcpp::R_ARM_THM_JUMP19:
8721 case elfcpp::R_ARM_THM_JUMP6:
8722 case elfcpp::R_ARM_THM_JUMP11:
8723 case elfcpp::R_ARM_THM_JUMP8:
8724 // All the relocations above are branches except SBREL31 and PREL31.
8725 return false;
8726
8727 default:
8728 // Be conservative and assume this is a function pointer.
8729 return true;
8730 }
8731}
8732
8733template<bool big_endian>
8734inline bool
8735Target_arm<big_endian>::Scan::local_reloc_may_be_function_pointer(
8736 Symbol_table*,
8737 Layout*,
8738 Target_arm<big_endian>* target,
6fa2a40b 8739 Sized_relobj_file<32, big_endian>*,
8a75a161
DK
8740 unsigned int,
8741 Output_section*,
8742 const elfcpp::Rel<32, big_endian>&,
8743 unsigned int r_type,
8744 const elfcpp::Sym<32, big_endian>&)
8745{
8746 r_type = target->get_real_reloc_type(r_type);
8747 return possible_function_pointer_reloc(r_type);
8748}
8749
8750template<bool big_endian>
8751inline bool
8752Target_arm<big_endian>::Scan::global_reloc_may_be_function_pointer(
8753 Symbol_table*,
8754 Layout*,
8755 Target_arm<big_endian>* target,
6fa2a40b 8756 Sized_relobj_file<32, big_endian>*,
8a75a161
DK
8757 unsigned int,
8758 Output_section*,
8759 const elfcpp::Rel<32, big_endian>&,
8760 unsigned int r_type,
8761 Symbol* gsym)
8762{
8763 // GOT is not a function.
8764 if (strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
8765 return false;
8766
8767 r_type = target->get_real_reloc_type(r_type);
8768 return possible_function_pointer_reloc(r_type);
8769}
8770
4a657b0d
DK
8771// Scan a relocation for a global symbol.
8772
8773template<bool big_endian>
8774inline void
ad0f2072 8775Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
2ea97941 8776 Layout* layout,
bec53400 8777 Target_arm* target,
6fa2a40b 8778 Sized_relobj_file<32, big_endian>* object,
bec53400
DK
8779 unsigned int data_shndx,
8780 Output_section* output_section,
8781 const elfcpp::Rel<32, big_endian>& reloc,
4a657b0d
DK
8782 unsigned int r_type,
8783 Symbol* gsym)
8784{
c8761b9a
DK
8785 // A reference to _GLOBAL_OFFSET_TABLE_ implies that we need a got
8786 // section. We check here to avoid creating a dynamic reloc against
8787 // _GLOBAL_OFFSET_TABLE_.
8788 if (!target->has_got_section()
8789 && strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
8790 target->got_section(symtab, layout);
8791
fa89cc82
HS
8792 // A STT_GNU_IFUNC symbol may require a PLT entry.
8793 if (gsym->type() == elfcpp::STT_GNU_IFUNC
8794 && this->reloc_needs_plt_for_ifunc(object, r_type))
8795 target->make_plt_entry(symtab, layout, gsym);
8796
a6d1ef57 8797 r_type = get_real_reloc_type(r_type);
4a657b0d
DK
8798 switch (r_type)
8799 {
8800 case elfcpp::R_ARM_NONE:
e4782e83
DK
8801 case elfcpp::R_ARM_V4BX:
8802 case elfcpp::R_ARM_GNU_VTENTRY:
8803 case elfcpp::R_ARM_GNU_VTINHERIT:
4a657b0d
DK
8804 break;
8805
bec53400 8806 case elfcpp::R_ARM_ABS32:
e4782e83
DK
8807 case elfcpp::R_ARM_ABS16:
8808 case elfcpp::R_ARM_ABS12:
8809 case elfcpp::R_ARM_THM_ABS5:
8810 case elfcpp::R_ARM_ABS8:
8811 case elfcpp::R_ARM_BASE_ABS:
8812 case elfcpp::R_ARM_MOVW_ABS_NC:
8813 case elfcpp::R_ARM_MOVT_ABS:
8814 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
8815 case elfcpp::R_ARM_THM_MOVT_ABS:
be8fcb75 8816 case elfcpp::R_ARM_ABS32_NOI:
e4782e83 8817 // Absolute addressing relocations.
bec53400 8818 {
2e702c99
RM
8819 // Make a PLT entry if necessary.
8820 if (this->symbol_needs_plt_entry(gsym))
8821 {
8822 target->make_plt_entry(symtab, layout, gsym);
8823 // Since this is not a PC-relative relocation, we may be
8824 // taking the address of a function. In that case we need to
8825 // set the entry in the dynamic symbol table to the address of
8826 // the PLT entry.
8827 if (gsym->is_from_dynobj() && !parameters->options().shared())
8828 gsym->set_needs_dynsym_value();
8829 }
8830 // Make a dynamic relocation if necessary.
8831 if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
8832 {
a82bef93
ST
8833 if (!parameters->options().output_is_position_independent()
8834 && gsym->may_need_copy_reloc())
2e702c99
RM
8835 {
8836 target->copy_reloc(symtab, layout, object,
8837 data_shndx, output_section, gsym, reloc);
8838 }
fa89cc82
HS
8839 else if ((r_type == elfcpp::R_ARM_ABS32
8840 || r_type == elfcpp::R_ARM_ABS32_NOI)
8841 && gsym->type() == elfcpp::STT_GNU_IFUNC
8842 && gsym->can_use_relative_reloc(false)
8843 && !gsym->is_from_dynobj()
8844 && !gsym->is_undefined()
8845 && !gsym->is_preemptible())
8846 {
8847 // Use an IRELATIVE reloc for a locally defined STT_GNU_IFUNC
8848 // symbol. This makes a function address in a PIE executable
8849 // match the address in a shared library that it links against.
8850 Reloc_section* rel_irelative =
8851 target->rel_irelative_section(layout);
8852 unsigned int r_type = elfcpp::R_ARM_IRELATIVE;
8853 rel_irelative->add_symbolless_global_addend(
8854 gsym, r_type, output_section, object,
8855 data_shndx, reloc.get_r_offset());
8856 }
2e702c99 8857 else if ((r_type == elfcpp::R_ARM_ABS32
e4782e83 8858 || r_type == elfcpp::R_ARM_ABS32_NOI)
2e702c99
RM
8859 && gsym->can_use_relative_reloc(false))
8860 {
8861 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8862 rel_dyn->add_global_relative(gsym, elfcpp::R_ARM_RELATIVE,
8863 output_section, object,
8864 data_shndx, reloc.get_r_offset());
8865 }
8866 else
8867 {
e4782e83 8868 check_non_pic(object, r_type);
2e702c99
RM
8869 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
8870 rel_dyn->add_global(gsym, r_type, output_section, object,
8871 data_shndx, reloc.get_r_offset());
8872 }
8873 }
bec53400
DK
8874 }
8875 break;
8876
e4782e83
DK
8877 case elfcpp::R_ARM_GOTOFF32:
8878 case elfcpp::R_ARM_GOTOFF12:
8879 // We need a GOT section.
8880 target->got_section(symtab, layout);
8881 break;
2e702c99 8882
e4782e83
DK
8883 case elfcpp::R_ARM_REL32:
8884 case elfcpp::R_ARM_LDR_PC_G0:
8885 case elfcpp::R_ARM_SBREL32:
8886 case elfcpp::R_ARM_THM_PC8:
8887 case elfcpp::R_ARM_BASE_PREL:
c2a122b6
ILT
8888 case elfcpp::R_ARM_MOVW_PREL_NC:
8889 case elfcpp::R_ARM_MOVT_PREL:
8890 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
8891 case elfcpp::R_ARM_THM_MOVT_PREL:
11b861d5 8892 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
e4782e83
DK
8893 case elfcpp::R_ARM_THM_PC12:
8894 case elfcpp::R_ARM_REL32_NOI:
b10d2873
ILT
8895 case elfcpp::R_ARM_ALU_PC_G0_NC:
8896 case elfcpp::R_ARM_ALU_PC_G0:
8897 case elfcpp::R_ARM_ALU_PC_G1_NC:
8898 case elfcpp::R_ARM_ALU_PC_G1:
8899 case elfcpp::R_ARM_ALU_PC_G2:
e4782e83
DK
8900 case elfcpp::R_ARM_LDR_PC_G1:
8901 case elfcpp::R_ARM_LDR_PC_G2:
8902 case elfcpp::R_ARM_LDRS_PC_G0:
8903 case elfcpp::R_ARM_LDRS_PC_G1:
8904 case elfcpp::R_ARM_LDRS_PC_G2:
8905 case elfcpp::R_ARM_LDC_PC_G0:
8906 case elfcpp::R_ARM_LDC_PC_G1:
8907 case elfcpp::R_ARM_LDC_PC_G2:
b10d2873
ILT
8908 case elfcpp::R_ARM_ALU_SB_G0_NC:
8909 case elfcpp::R_ARM_ALU_SB_G0:
8910 case elfcpp::R_ARM_ALU_SB_G1_NC:
8911 case elfcpp::R_ARM_ALU_SB_G1:
8912 case elfcpp::R_ARM_ALU_SB_G2:
b10d2873
ILT
8913 case elfcpp::R_ARM_LDR_SB_G0:
8914 case elfcpp::R_ARM_LDR_SB_G1:
8915 case elfcpp::R_ARM_LDR_SB_G2:
b10d2873
ILT
8916 case elfcpp::R_ARM_LDRS_SB_G0:
8917 case elfcpp::R_ARM_LDRS_SB_G1:
8918 case elfcpp::R_ARM_LDRS_SB_G2:
b10d2873
ILT
8919 case elfcpp::R_ARM_LDC_SB_G0:
8920 case elfcpp::R_ARM_LDC_SB_G1:
8921 case elfcpp::R_ARM_LDC_SB_G2:
e4782e83
DK
8922 case elfcpp::R_ARM_MOVW_BREL_NC:
8923 case elfcpp::R_ARM_MOVT_BREL:
8924 case elfcpp::R_ARM_MOVW_BREL:
8925 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
8926 case elfcpp::R_ARM_THM_MOVT_BREL:
8927 case elfcpp::R_ARM_THM_MOVW_BREL:
8928 // Relative addressing relocations.
bec53400
DK
8929 {
8930 // Make a dynamic relocation if necessary.
95a2c8d6 8931 if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
bec53400 8932 {
a82bef93
ST
8933 if (parameters->options().output_is_executable()
8934 && target->may_need_copy_reloc(gsym))
bec53400 8935 {
2ea97941 8936 target->copy_reloc(symtab, layout, object,
bec53400
DK
8937 data_shndx, output_section, gsym, reloc);
8938 }
8939 else
8940 {
8941 check_non_pic(object, r_type);
2ea97941 8942 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
bec53400
DK
8943 rel_dyn->add_global(gsym, r_type, output_section, object,
8944 data_shndx, reloc.get_r_offset());
8945 }
8946 }
8947 }
8948 break;
8949
f4e5969c 8950 case elfcpp::R_ARM_THM_CALL:
bec53400 8951 case elfcpp::R_ARM_PLT32:
e4782e83
DK
8952 case elfcpp::R_ARM_CALL:
8953 case elfcpp::R_ARM_JUMP24:
8954 case elfcpp::R_ARM_THM_JUMP24:
8955 case elfcpp::R_ARM_SBREL31:
c9a2c125 8956 case elfcpp::R_ARM_PREL31:
e4782e83
DK
8957 case elfcpp::R_ARM_THM_JUMP19:
8958 case elfcpp::R_ARM_THM_JUMP6:
8959 case elfcpp::R_ARM_THM_JUMP11:
8960 case elfcpp::R_ARM_THM_JUMP8:
8961 // All the relocation above are branches except for the PREL31 ones.
8962 // A PREL31 relocation can point to a personality function in a shared
8963 // library. In that case we want to use a PLT because we want to
9b547ce6 8964 // call the personality routine and the dynamic linkers we care about
e4782e83
DK
8965 // do not support dynamic PREL31 relocations. An REL31 relocation may
8966 // point to a function whose unwinding behaviour is being described but
8967 // we will not mistakenly generate a PLT for that because we should use
8968 // a local section symbol.
8969
bec53400
DK
8970 // If the symbol is fully resolved, this is just a relative
8971 // local reloc. Otherwise we need a PLT entry.
8972 if (gsym->final_value_is_known())
8973 break;
8974 // If building a shared library, we can also skip the PLT entry
8975 // if the symbol is defined in the output file and is protected
8976 // or hidden.
8977 if (gsym->is_defined()
8978 && !gsym->is_from_dynobj()
8979 && !gsym->is_preemptible())
8980 break;
2ea97941 8981 target->make_plt_entry(symtab, layout, gsym);
bec53400
DK
8982 break;
8983
bec53400 8984 case elfcpp::R_ARM_GOT_BREL:
e4782e83 8985 case elfcpp::R_ARM_GOT_ABS:
7f5309a5 8986 case elfcpp::R_ARM_GOT_PREL:
bec53400
DK
8987 {
8988 // The symbol requires a GOT entry.
4a54abbb 8989 Arm_output_data_got<big_endian>* got =
2ea97941 8990 target->got_section(symtab, layout);
bec53400 8991 if (gsym->final_value_is_known())
fa89cc82
HS
8992 {
8993 // For a STT_GNU_IFUNC symbol we want the PLT address.
8994 if (gsym->type() == elfcpp::STT_GNU_IFUNC)
8995 got->add_global_plt(gsym, GOT_TYPE_STANDARD);
8996 else
8997 got->add_global(gsym, GOT_TYPE_STANDARD);
8998 }
bec53400
DK
8999 else
9000 {
9001 // If this symbol is not fully resolved, we need to add a
9002 // GOT entry with a dynamic relocation.
2ea97941 9003 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
bec53400
DK
9004 if (gsym->is_from_dynobj()
9005 || gsym->is_undefined()
fa40b62a
DK
9006 || gsym->is_preemptible()
9007 || (gsym->visibility() == elfcpp::STV_PROTECTED
fa89cc82
HS
9008 && parameters->options().shared())
9009 || (gsym->type() == elfcpp::STT_GNU_IFUNC
9010 && parameters->options().output_is_position_independent()))
bec53400
DK
9011 got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
9012 rel_dyn, elfcpp::R_ARM_GLOB_DAT);
9013 else
9014 {
fa89cc82
HS
9015 // For a STT_GNU_IFUNC symbol we want to write the PLT
9016 // offset into the GOT, so that function pointer
9017 // comparisons work correctly.
9018 bool is_new;
9019 if (gsym->type() != elfcpp::STT_GNU_IFUNC)
9020 is_new = got->add_global(gsym, GOT_TYPE_STANDARD);
9021 else
9022 {
9023 is_new = got->add_global_plt(gsym, GOT_TYPE_STANDARD);
9024 // Tell the dynamic linker to use the PLT address
9025 // when resolving relocations.
9026 if (gsym->is_from_dynobj()
9027 && !parameters->options().shared())
9028 gsym->set_needs_dynsym_value();
9029 }
9030 if (is_new)
bec53400
DK
9031 rel_dyn->add_global_relative(
9032 gsym, elfcpp::R_ARM_RELATIVE, got,
9033 gsym->got_offset(GOT_TYPE_STANDARD));
9034 }
9035 }
9036 }
9037 break;
9038
9039 case elfcpp::R_ARM_TARGET1:
e4782e83
DK
9040 case elfcpp::R_ARM_TARGET2:
9041 // These should have been mapped to other types already.
bec53400
DK
9042 // Fall through.
9043 case elfcpp::R_ARM_COPY:
9044 case elfcpp::R_ARM_GLOB_DAT:
9045 case elfcpp::R_ARM_JUMP_SLOT:
9046 case elfcpp::R_ARM_RELATIVE:
9047 // These are relocations which should only be seen by the
9048 // dynamic linker, and should never be seen here.
9049 gold_error(_("%s: unexpected reloc %u in object file"),
9050 object->name().c_str(), r_type);
9051 break;
9052
f96accdf
DK
9053 // These are initial tls relocs, which are expected when
9054 // linking.
9055 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
9056 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
9057 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
9058 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
9059 case elfcpp::R_ARM_TLS_LE32: // Local-exec
9060 {
9061 const bool is_final = gsym->final_value_is_known();
9062 const tls::Tls_optimization optimized_type
2e702c99 9063 = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
f96accdf
DK
9064 switch (r_type)
9065 {
9066 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
9067 if (optimized_type == tls::TLSOPT_NONE)
9068 {
2e702c99
RM
9069 // Create a pair of GOT entries for the module index and
9070 // dtv-relative offset.
9071 Arm_output_data_got<big_endian>* got
9072 = target->got_section(symtab, layout);
4a54abbb
DK
9073 if (!parameters->doing_static_link())
9074 got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR,
9075 target->rel_dyn_section(layout),
9076 elfcpp::R_ARM_TLS_DTPMOD32,
9077 elfcpp::R_ARM_TLS_DTPOFF32);
9078 else
9079 got->add_tls_gd32_with_static_reloc(GOT_TYPE_TLS_PAIR, gsym);
f96accdf
DK
9080 }
9081 else
9082 // FIXME: TLS optimization not supported yet.
9083 gold_unreachable();
9084 break;
9085
9086 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
9087 if (optimized_type == tls::TLSOPT_NONE)
9088 {
2e702c99
RM
9089 // Create a GOT entry for the module index.
9090 target->got_mod_index_entry(symtab, layout, object);
f96accdf
DK
9091 }
9092 else
9093 // FIXME: TLS optimization not supported yet.
9094 gold_unreachable();
9095 break;
9096
9097 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
9098 break;
9099
9100 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
9101 layout->set_has_static_tls();
9102 if (optimized_type == tls::TLSOPT_NONE)
9103 {
4a54abbb
DK
9104 // Create a GOT entry for the tp-relative offset.
9105 Arm_output_data_got<big_endian>* got
9106 = target->got_section(symtab, layout);
9107 if (!parameters->doing_static_link())
9108 got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET,
9109 target->rel_dyn_section(layout),
9110 elfcpp::R_ARM_TLS_TPOFF32);
9111 else if (!gsym->has_got_offset(GOT_TYPE_TLS_OFFSET))
9112 {
9113 got->add_global(gsym, GOT_TYPE_TLS_OFFSET);
9114 unsigned int got_offset =
9115 gsym->got_offset(GOT_TYPE_TLS_OFFSET);
9116 got->add_static_reloc(got_offset,
9117 elfcpp::R_ARM_TLS_TPOFF32, gsym);
9118 }
f96accdf
DK
9119 }
9120 else
9121 // FIXME: TLS optimization not supported yet.
9122 gold_unreachable();
9123 break;
9124
9125 case elfcpp::R_ARM_TLS_LE32: // Local-exec
9126 layout->set_has_static_tls();
9127 if (parameters->options().shared())
9128 {
2e702c99
RM
9129 // We need to create a dynamic relocation.
9130 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
9131 rel_dyn->add_global(gsym, elfcpp::R_ARM_TLS_TPOFF32,
f96accdf 9132 output_section, object,
2e702c99 9133 data_shndx, reloc.get_r_offset());
f96accdf
DK
9134 }
9135 break;
9136
9137 default:
9138 gold_unreachable();
9139 }
9140 }
9141 break;
9142
3cef7179
ILT
9143 case elfcpp::R_ARM_PC24:
9144 case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
9145 case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
9146 case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
4a657b0d
DK
9147 default:
9148 unsupported_reloc_global(object, r_type, gsym);
9149 break;
9150 }
9151}
9152
9153// Process relocations for gc.
9154
9155template<bool big_endian>
9156void
6fa2a40b
CC
9157Target_arm<big_endian>::gc_process_relocs(
9158 Symbol_table* symtab,
9159 Layout* layout,
9160 Sized_relobj_file<32, big_endian>* object,
9161 unsigned int data_shndx,
9162 unsigned int,
9163 const unsigned char* prelocs,
9164 size_t reloc_count,
9165 Output_section* output_section,
9166 bool needs_special_offset_handling,
9167 size_t local_symbol_count,
9168 const unsigned char* plocal_symbols)
4a657b0d
DK
9169{
9170 typedef Target_arm<big_endian> Arm;
2ea97941 9171 typedef typename Target_arm<big_endian>::Scan Scan;
4a657b0d 9172
41cbeecc 9173 gold::gc_process_relocs<32, big_endian, Arm, elfcpp::SHT_REL, Scan,
3ff2ccb0 9174 typename Target_arm::Relocatable_size_for_reloc>(
4a657b0d 9175 symtab,
2ea97941 9176 layout,
4a657b0d
DK
9177 this,
9178 object,
9179 data_shndx,
9180 prelocs,
9181 reloc_count,
9182 output_section,
9183 needs_special_offset_handling,
9184 local_symbol_count,
9185 plocal_symbols);
9186}
9187
9188// Scan relocations for a section.
9189
9190template<bool big_endian>
9191void
ad0f2072 9192Target_arm<big_endian>::scan_relocs(Symbol_table* symtab,
2ea97941 9193 Layout* layout,
6fa2a40b 9194 Sized_relobj_file<32, big_endian>* object,
4a657b0d
DK
9195 unsigned int data_shndx,
9196 unsigned int sh_type,
9197 const unsigned char* prelocs,
9198 size_t reloc_count,
9199 Output_section* output_section,
9200 bool needs_special_offset_handling,
9201 size_t local_symbol_count,
9202 const unsigned char* plocal_symbols)
9203{
2ea97941 9204 typedef typename Target_arm<big_endian>::Scan Scan;
4a657b0d
DK
9205 if (sh_type == elfcpp::SHT_RELA)
9206 {
9207 gold_error(_("%s: unsupported RELA reloc section"),
9208 object->name().c_str());
9209 return;
9210 }
9211
2ea97941 9212 gold::scan_relocs<32, big_endian, Target_arm, elfcpp::SHT_REL, Scan>(
4a657b0d 9213 symtab,
2ea97941 9214 layout,
4a657b0d
DK
9215 this,
9216 object,
9217 data_shndx,
9218 prelocs,
9219 reloc_count,
9220 output_section,
9221 needs_special_offset_handling,
9222 local_symbol_count,
9223 plocal_symbols);
9224}
9225
9226// Finalize the sections.
9227
9228template<bool big_endian>
9229void
d5b40221 9230Target_arm<big_endian>::do_finalize_sections(
2ea97941 9231 Layout* layout,
f59f41f3 9232 const Input_objects* input_objects,
647f1574 9233 Symbol_table*)
4a657b0d 9234{
3e235302 9235 bool merged_any_attributes = false;
d5b40221
DK
9236 // Merge processor-specific flags.
9237 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
9238 p != input_objects->relobj_end();
9239 ++p)
9240 {
9241 Arm_relobj<big_endian>* arm_relobj =
9242 Arm_relobj<big_endian>::as_arm_relobj(*p);
7296d933
DK
9243 if (arm_relobj->merge_flags_and_attributes())
9244 {
9245 this->merge_processor_specific_flags(
9246 arm_relobj->name(),
9247 arm_relobj->processor_specific_flags());
9248 this->merge_object_attributes(arm_relobj->name().c_str(),
9249 arm_relobj->attributes_section_data());
3e235302 9250 merged_any_attributes = true;
7296d933 9251 }
2e702c99 9252 }
d5b40221
DK
9253
9254 for (Input_objects::Dynobj_iterator p = input_objects->dynobj_begin();
9255 p != input_objects->dynobj_end();
9256 ++p)
9257 {
9258 Arm_dynobj<big_endian>* arm_dynobj =
9259 Arm_dynobj<big_endian>::as_arm_dynobj(*p);
9260 this->merge_processor_specific_flags(
9261 arm_dynobj->name(),
9262 arm_dynobj->processor_specific_flags());
a0351a69
DK
9263 this->merge_object_attributes(arm_dynobj->name().c_str(),
9264 arm_dynobj->attributes_section_data());
3e235302 9265 merged_any_attributes = true;
d5b40221
DK
9266 }
9267
da59ad79
DK
9268 // Create an empty uninitialized attribute section if we still don't have it
9269 // at this moment. This happens if there is no attributes sections in all
9270 // inputs.
9271 if (this->attributes_section_data_ == NULL)
9272 this->attributes_section_data_ = new Attributes_section_data(NULL, 0);
9273
41263c05 9274 const Object_attribute* cpu_arch_attr =
a0351a69 9275 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
41263c05
DK
9276 // Check if we need to use Cortex-A8 workaround.
9277 if (parameters->options().user_set_fix_cortex_a8())
9278 this->fix_cortex_a8_ = parameters->options().fix_cortex_a8();
9279 else
9280 {
9281 // If neither --fix-cortex-a8 nor --no-fix-cortex-a8 is used, turn on
9282 // Cortex-A8 erratum workaround for ARMv7-A or ARMv7 with unknown
2e702c99 9283 // profile.
41263c05
DK
9284 const Object_attribute* cpu_arch_profile_attr =
9285 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
9286 this->fix_cortex_a8_ =
9287 (cpu_arch_attr->int_value() == elfcpp::TAG_CPU_ARCH_V7
2e702c99
RM
9288 && (cpu_arch_profile_attr->int_value() == 'A'
9289 || cpu_arch_profile_attr->int_value() == 0));
41263c05 9290 }
2e702c99 9291
a2162063
ILT
9292 // Check if we can use V4BX interworking.
9293 // The V4BX interworking stub contains BX instruction,
9294 // which is not specified for some profiles.
9b2fd367 9295 if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING
cd6eab1c 9296 && !this->may_use_v4t_interworking())
a2162063 9297 gold_error(_("unable to provide V4BX reloc interworking fix up; "
2e702c99 9298 "the target profile does not support BX instruction"));
a2162063 9299
94cdfcff 9300 // Fill in some more dynamic tags.
ea715a34
ILT
9301 const Reloc_section* rel_plt = (this->plt_ == NULL
9302 ? NULL
9303 : this->plt_->rel_plt());
9304 layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
612a8d3d 9305 this->rel_dyn_, true, false);
94cdfcff
DK
9306
9307 // Emit any relocs we saved in an attempt to avoid generating COPY
9308 // relocs.
9309 if (this->copy_relocs_.any_saved_relocs())
2ea97941 9310 this->copy_relocs_.emit(this->rel_dyn_section(layout));
11af873f 9311
f59f41f3 9312 // Handle the .ARM.exidx section.
2ea97941 9313 Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
11af873f 9314
731ca54a
RÁE
9315 if (!parameters->options().relocatable())
9316 {
9317 if (exidx_section != NULL
2e702c99
RM
9318 && exidx_section->type() == elfcpp::SHT_ARM_EXIDX)
9319 {
9320 // For the ARM target, we need to add a PT_ARM_EXIDX segment for
9321 // the .ARM.exidx section.
9322 if (!layout->script_options()->saw_phdrs_clause())
9323 {
9324 gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0,
9325 0)
9326 == NULL);
9327 Output_segment* exidx_segment =
9328 layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
9329 exidx_segment->add_output_section_to_nonload(exidx_section,
9330 elfcpp::PF_R);
9331 }
9332 }
11af873f 9333 }
a0351a69 9334
3e235302
DK
9335 // Create an .ARM.attributes section if we have merged any attributes
9336 // from inputs.
9337 if (merged_any_attributes)
7296d933
DK
9338 {
9339 Output_attributes_section_data* attributes_section =
9340 new Output_attributes_section_data(*this->attributes_section_data_);
9341 layout->add_output_section_data(".ARM.attributes",
9342 elfcpp::SHT_ARM_ATTRIBUTES, 0,
22f0da72 9343 attributes_section, ORDER_INVALID,
7296d933
DK
9344 false);
9345 }
131687b4
DK
9346
9347 // Fix up links in section EXIDX headers.
9348 for (Layout::Section_list::const_iterator p = layout->section_list().begin();
9349 p != layout->section_list().end();
9350 ++p)
9351 if ((*p)->type() == elfcpp::SHT_ARM_EXIDX)
9352 {
9353 Arm_output_section<big_endian>* os =
9354 Arm_output_section<big_endian>::as_arm_output_section(*p);
9355 os->set_exidx_section_link();
9356 }
4a657b0d
DK
9357}
9358
bec53400
DK
9359// Return whether a direct absolute static relocation needs to be applied.
9360// In cases where Scan::local() or Scan::global() has created
9361// a dynamic relocation other than R_ARM_RELATIVE, the addend
9362// of the relocation is carried in the data, and we must not
9363// apply the static relocation.
9364
9365template<bool big_endian>
9366inline bool
9367Target_arm<big_endian>::Relocate::should_apply_static_reloc(
9368 const Sized_symbol<32>* gsym,
95a2c8d6 9369 unsigned int r_type,
bec53400
DK
9370 bool is_32bit,
9371 Output_section* output_section)
9372{
9373 // If the output section is not allocated, then we didn't call
9374 // scan_relocs, we didn't create a dynamic reloc, and we must apply
9375 // the reloc here.
9376 if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0)
9377 return true;
9378
95a2c8d6
RS
9379 int ref_flags = Scan::get_reference_flags(r_type);
9380
bec53400
DK
9381 // For local symbols, we will have created a non-RELATIVE dynamic
9382 // relocation only if (a) the output is position independent,
9383 // (b) the relocation is absolute (not pc- or segment-relative), and
9384 // (c) the relocation is not 32 bits wide.
9385 if (gsym == NULL)
9386 return !(parameters->options().output_is_position_independent()
9387 && (ref_flags & Symbol::ABSOLUTE_REF)
9388 && !is_32bit);
9389
9390 // For global symbols, we use the same helper routines used in the
9391 // scan pass. If we did not create a dynamic relocation, or if we
9392 // created a RELATIVE dynamic relocation, we should apply the static
9393 // relocation.
9394 bool has_dyn = gsym->needs_dynamic_reloc(ref_flags);
9395 bool is_rel = (ref_flags & Symbol::ABSOLUTE_REF)
9396 && gsym->can_use_relative_reloc(ref_flags
9397 & Symbol::FUNCTION_CALL);
9398 return !has_dyn || is_rel;
9399}
9400
4a657b0d
DK
9401// Perform a relocation.
9402
9403template<bool big_endian>
9404inline bool
9405Target_arm<big_endian>::Relocate::relocate(
c121c671 9406 const Relocate_info<32, big_endian>* relinfo,
91a65d2f 9407 unsigned int,
c121c671 9408 Target_arm* target,
ca09d69a 9409 Output_section* output_section,
c121c671 9410 size_t relnum,
91a65d2f 9411 const unsigned char* preloc,
c121c671
DK
9412 const Sized_symbol<32>* gsym,
9413 const Symbol_value<32>* psymval,
9414 unsigned char* view,
ebabffbd 9415 Arm_address address,
f96accdf 9416 section_size_type view_size)
4a657b0d 9417{
0e804863
ILT
9418 if (view == NULL)
9419 return true;
9420
c121c671
DK
9421 typedef Arm_relocate_functions<big_endian> Arm_relocate_functions;
9422
91a65d2f
AM
9423 const elfcpp::Rel<32, big_endian> rel(preloc);
9424 unsigned int r_type = elfcpp::elf_r_type<32>(rel.get_r_info());
a6d1ef57 9425 r_type = get_real_reloc_type(r_type);
5c57f1be
DK
9426 const Arm_reloc_property* reloc_property =
9427 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
9428 if (reloc_property == NULL)
9429 {
9430 std::string reloc_name =
9431 arm_reloc_property_table->reloc_name_in_error_message(r_type);
9432 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
9433 _("cannot relocate %s in object file"),
9434 reloc_name.c_str());
9435 return true;
9436 }
c121c671 9437
2daedcd6
DK
9438 const Arm_relobj<big_endian>* object =
9439 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
c121c671 9440
2daedcd6
DK
9441 // If the final branch target of a relocation is THUMB instruction, this
9442 // is 1. Otherwise it is 0.
9443 Arm_address thumb_bit = 0;
c121c671 9444 Symbol_value<32> symval;
d204b6e9 9445 bool is_weakly_undefined_without_plt = false;
bca7fb63
DK
9446 bool have_got_offset = false;
9447 unsigned int got_offset = 0;
9448
9449 // If the relocation uses the GOT entry of a symbol instead of the symbol
9450 // itself, we don't care about whether the symbol is defined or what kind
9451 // of symbol it is.
9452 if (reloc_property->uses_got_entry())
9453 {
9454 // Get the GOT offset.
9455 // The GOT pointer points to the end of the GOT section.
9456 // We need to subtract the size of the GOT section to get
9457 // the actual offset to use in the relocation.
9458 // TODO: We should move GOT offset computing code in TLS relocations
9459 // to here.
9460 switch (r_type)
9461 {
9462 case elfcpp::R_ARM_GOT_BREL:
9463 case elfcpp::R_ARM_GOT_PREL:
9464 if (gsym != NULL)
9465 {
9466 gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
9467 got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
9468 - target->got_size());
9469 }
9470 else
9471 {
9472 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
9473 gold_assert(object->local_has_got_offset(r_sym,
9474 GOT_TYPE_STANDARD));
9475 got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
9476 - target->got_size());
9477 }
9478 have_got_offset = true;
9479 break;
9480
9481 default:
9482 break;
9483 }
9484 }
9485 else if (relnum != Target_arm<big_endian>::fake_relnum_for_stubs)
c121c671 9486 {
2daedcd6
DK
9487 if (gsym != NULL)
9488 {
9489 // This is a global symbol. Determine if we use PLT and if the
9490 // final target is THUMB.
95a2c8d6 9491 if (gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
2daedcd6
DK
9492 {
9493 // This uses a PLT, change the symbol value.
fa89cc82 9494 symval.set_output_value(target->plt_address_for_global(gsym));
2daedcd6
DK
9495 psymval = &symval;
9496 }
d204b6e9
DK
9497 else if (gsym->is_weak_undefined())
9498 {
9499 // This is a weakly undefined symbol and we do not use PLT
9500 // for this relocation. A branch targeting this symbol will
9501 // be converted into an NOP.
9502 is_weakly_undefined_without_plt = true;
9503 }
b2286c10
DK
9504 else if (gsym->is_undefined() && reloc_property->uses_symbol())
9505 {
9506 // This relocation uses the symbol value but the symbol is
9507 // undefined. Exit early and have the caller reporting an
9508 // error.
9509 return true;
9510 }
2daedcd6
DK
9511 else
9512 {
9513 // Set thumb bit if symbol:
9514 // -Has type STT_ARM_TFUNC or
9515 // -Has type STT_FUNC, is defined and with LSB in value set.
9516 thumb_bit =
9517 (((gsym->type() == elfcpp::STT_ARM_TFUNC)
9518 || (gsym->type() == elfcpp::STT_FUNC
9519 && !gsym->is_undefined()
9520 && ((psymval->value(object, 0) & 1) != 0)))
9521 ? 1
9522 : 0);
9523 }
9524 }
9525 else
9526 {
2e702c99
RM
9527 // This is a local symbol. Determine if the final target is THUMB.
9528 // We saved this information when all the local symbols were read.
2daedcd6
DK
9529 elfcpp::Elf_types<32>::Elf_WXword r_info = rel.get_r_info();
9530 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
9531 thumb_bit = object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
fa89cc82
HS
9532
9533 if (psymval->is_ifunc_symbol() && object->local_has_plt_offset(r_sym))
9534 {
9535 symval.set_output_value(
9536 target->plt_address_for_local(object, r_sym));
9537 psymval = &symval;
9538 }
2daedcd6
DK
9539 }
9540 }
9541 else
9542 {
9543 // This is a fake relocation synthesized for a stub. It does not have
9544 // a real symbol. We just look at the LSB of the symbol value to
9545 // determine if the target is THUMB or not.
9546 thumb_bit = ((psymval->value(object, 0) & 1) != 0);
c121c671
DK
9547 }
9548
2daedcd6
DK
9549 // Strip LSB if this points to a THUMB target.
9550 if (thumb_bit != 0
2e702c99 9551 && reloc_property->uses_thumb_bit()
2daedcd6
DK
9552 && ((psymval->value(object, 0) & 1) != 0))
9553 {
9554 Arm_address stripped_value =
9555 psymval->value(object, 0) & ~static_cast<Arm_address>(1);
9556 symval.set_output_value(stripped_value);
9557 psymval = &symval;
2e702c99 9558 }
2daedcd6 9559
d204b6e9
DK
9560 // To look up relocation stubs, we need to pass the symbol table index of
9561 // a local symbol.
9562 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
9563
b10d2873
ILT
9564 // Get the addressing origin of the output segment defining the
9565 // symbol gsym if needed (AAELF 4.6.1.2 Relocation types).
9566 Arm_address sym_origin = 0;
5c57f1be 9567 if (reloc_property->uses_symbol_base())
b10d2873
ILT
9568 {
9569 if (r_type == elfcpp::R_ARM_BASE_ABS && gsym == NULL)
9570 // R_ARM_BASE_ABS with the NULL symbol will give the
9571 // absolute address of the GOT origin (GOT_ORG) (see ARM IHI
9572 // 0044C (AAELF): 4.6.1.8 Proxy generating relocations).
9573 sym_origin = target->got_plt_section()->address();
9574 else if (gsym == NULL)
9575 sym_origin = 0;
9576 else if (gsym->source() == Symbol::IN_OUTPUT_SEGMENT)
9577 sym_origin = gsym->output_segment()->vaddr();
9578 else if (gsym->source() == Symbol::IN_OUTPUT_DATA)
9579 sym_origin = gsym->output_data()->address();
9580
9581 // TODO: Assumes the segment base to be zero for the global symbols
9582 // till the proper support for the segment-base-relative addressing
9583 // will be implemented. This is consistent with GNU ld.
9584 }
9585
5c57f1be
DK
9586 // For relative addressing relocation, find out the relative address base.
9587 Arm_address relative_address_base = 0;
9588 switch(reloc_property->relative_address_base())
9589 {
9590 case Arm_reloc_property::RAB_NONE:
f96accdf
DK
9591 // Relocations with relative address bases RAB_TLS and RAB_tp are
9592 // handled by relocate_tls. So we do not need to do anything here.
9593 case Arm_reloc_property::RAB_TLS:
9594 case Arm_reloc_property::RAB_tp:
5c57f1be
DK
9595 break;
9596 case Arm_reloc_property::RAB_B_S:
9597 relative_address_base = sym_origin;
9598 break;
9599 case Arm_reloc_property::RAB_GOT_ORG:
9600 relative_address_base = target->got_plt_section()->address();
9601 break;
9602 case Arm_reloc_property::RAB_P:
9603 relative_address_base = address;
9604 break;
9605 case Arm_reloc_property::RAB_Pa:
9606 relative_address_base = address & 0xfffffffcU;
9607 break;
9608 default:
2e702c99 9609 gold_unreachable();
5c57f1be 9610 }
2e702c99 9611
c121c671
DK
9612 typename Arm_relocate_functions::Status reloc_status =
9613 Arm_relocate_functions::STATUS_OKAY;
5c57f1be 9614 bool check_overflow = reloc_property->checks_overflow();
4a657b0d
DK
9615 switch (r_type)
9616 {
9617 case elfcpp::R_ARM_NONE:
9618 break;
9619
5e445df6 9620 case elfcpp::R_ARM_ABS8:
95a2c8d6 9621 if (should_apply_static_reloc(gsym, r_type, false, output_section))
be8fcb75
ILT
9622 reloc_status = Arm_relocate_functions::abs8(view, object, psymval);
9623 break;
9624
9625 case elfcpp::R_ARM_ABS12:
95a2c8d6 9626 if (should_apply_static_reloc(gsym, r_type, false, output_section))
be8fcb75
ILT
9627 reloc_status = Arm_relocate_functions::abs12(view, object, psymval);
9628 break;
9629
9630 case elfcpp::R_ARM_ABS16:
95a2c8d6 9631 if (should_apply_static_reloc(gsym, r_type, false, output_section))
be8fcb75 9632 reloc_status = Arm_relocate_functions::abs16(view, object, psymval);
5e445df6
ILT
9633 break;
9634
c121c671 9635 case elfcpp::R_ARM_ABS32:
95a2c8d6 9636 if (should_apply_static_reloc(gsym, r_type, true, output_section))
c121c671 9637 reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
2daedcd6 9638 thumb_bit);
c121c671
DK
9639 break;
9640
be8fcb75 9641 case elfcpp::R_ARM_ABS32_NOI:
95a2c8d6 9642 if (should_apply_static_reloc(gsym, r_type, true, output_section))
be8fcb75
ILT
9643 // No thumb bit for this relocation: (S + A)
9644 reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
f4e5969c 9645 0);
be8fcb75
ILT
9646 break;
9647
fd3c5f0b 9648 case elfcpp::R_ARM_MOVW_ABS_NC:
95a2c8d6 9649 if (should_apply_static_reloc(gsym, r_type, false, output_section))
5c57f1be
DK
9650 reloc_status = Arm_relocate_functions::movw(view, object, psymval,
9651 0, thumb_bit,
9652 check_overflow);
fd3c5f0b
ILT
9653 break;
9654
9655 case elfcpp::R_ARM_MOVT_ABS:
95a2c8d6 9656 if (should_apply_static_reloc(gsym, r_type, false, output_section))
5c57f1be 9657 reloc_status = Arm_relocate_functions::movt(view, object, psymval, 0);
fd3c5f0b
ILT
9658 break;
9659
9660 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
95a2c8d6 9661 if (should_apply_static_reloc(gsym, r_type, false, output_section))
5c57f1be 9662 reloc_status = Arm_relocate_functions::thm_movw(view, object, psymval,
2e702c99 9663 0, thumb_bit, false);
fd3c5f0b
ILT
9664 break;
9665
9666 case elfcpp::R_ARM_THM_MOVT_ABS:
95a2c8d6 9667 if (should_apply_static_reloc(gsym, r_type, false, output_section))
5c57f1be
DK
9668 reloc_status = Arm_relocate_functions::thm_movt(view, object,
9669 psymval, 0);
fd3c5f0b
ILT
9670 break;
9671
c2a122b6 9672 case elfcpp::R_ARM_MOVW_PREL_NC:
02961d7e 9673 case elfcpp::R_ARM_MOVW_BREL_NC:
02961d7e 9674 case elfcpp::R_ARM_MOVW_BREL:
5c57f1be
DK
9675 reloc_status =
9676 Arm_relocate_functions::movw(view, object, psymval,
9677 relative_address_base, thumb_bit,
9678 check_overflow);
c2a122b6
ILT
9679 break;
9680
9681 case elfcpp::R_ARM_MOVT_PREL:
02961d7e 9682 case elfcpp::R_ARM_MOVT_BREL:
5c57f1be
DK
9683 reloc_status =
9684 Arm_relocate_functions::movt(view, object, psymval,
9685 relative_address_base);
c2a122b6
ILT
9686 break;
9687
9688 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
02961d7e 9689 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
02961d7e 9690 case elfcpp::R_ARM_THM_MOVW_BREL:
5c57f1be
DK
9691 reloc_status =
9692 Arm_relocate_functions::thm_movw(view, object, psymval,
9693 relative_address_base,
9694 thumb_bit, check_overflow);
c2a122b6
ILT
9695 break;
9696
9697 case elfcpp::R_ARM_THM_MOVT_PREL:
02961d7e 9698 case elfcpp::R_ARM_THM_MOVT_BREL:
5c57f1be
DK
9699 reloc_status =
9700 Arm_relocate_functions::thm_movt(view, object, psymval,
9701 relative_address_base);
02961d7e 9702 break;
2e702c99 9703
c121c671
DK
9704 case elfcpp::R_ARM_REL32:
9705 reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
2daedcd6 9706 address, thumb_bit);
c121c671
DK
9707 break;
9708
be8fcb75 9709 case elfcpp::R_ARM_THM_ABS5:
95a2c8d6 9710 if (should_apply_static_reloc(gsym, r_type, false, output_section))
be8fcb75
ILT
9711 reloc_status = Arm_relocate_functions::thm_abs5(view, object, psymval);
9712 break;
9713
1521477a 9714 // Thumb long branches.
c121c671 9715 case elfcpp::R_ARM_THM_CALL:
51938283 9716 case elfcpp::R_ARM_THM_XPC22:
1521477a 9717 case elfcpp::R_ARM_THM_JUMP24:
51938283 9718 reloc_status =
1521477a
DK
9719 Arm_relocate_functions::thumb_branch_common(
9720 r_type, relinfo, view, gsym, object, r_sym, psymval, address,
9721 thumb_bit, is_weakly_undefined_without_plt);
51938283
DK
9722 break;
9723
c121c671
DK
9724 case elfcpp::R_ARM_GOTOFF32:
9725 {
ebabffbd 9726 Arm_address got_origin;
c121c671
DK
9727 got_origin = target->got_plt_section()->address();
9728 reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
2daedcd6 9729 got_origin, thumb_bit);
c121c671
DK
9730 }
9731 break;
9732
9733 case elfcpp::R_ARM_BASE_PREL:
b10d2873
ILT
9734 gold_assert(gsym != NULL);
9735 reloc_status =
9736 Arm_relocate_functions::base_prel(view, sym_origin, address);
c121c671
DK
9737 break;
9738
be8fcb75 9739 case elfcpp::R_ARM_BASE_ABS:
95a2c8d6 9740 if (should_apply_static_reloc(gsym, r_type, false, output_section))
b10d2873 9741 reloc_status = Arm_relocate_functions::base_abs(view, sym_origin);
be8fcb75
ILT
9742 break;
9743
c121c671
DK
9744 case elfcpp::R_ARM_GOT_BREL:
9745 gold_assert(have_got_offset);
9746 reloc_status = Arm_relocate_functions::got_brel(view, got_offset);
9747 break;
9748
7f5309a5
ILT
9749 case elfcpp::R_ARM_GOT_PREL:
9750 gold_assert(have_got_offset);
9751 // Get the address origin for GOT PLT, which is allocated right
9752 // after the GOT section, to calculate an absolute address of
9753 // the symbol GOT entry (got_origin + got_offset).
ebabffbd 9754 Arm_address got_origin;
7f5309a5
ILT
9755 got_origin = target->got_plt_section()->address();
9756 reloc_status = Arm_relocate_functions::got_prel(view,
9757 got_origin + got_offset,
9758 address);
9759 break;
9760
c121c671 9761 case elfcpp::R_ARM_PLT32:
1521477a
DK
9762 case elfcpp::R_ARM_CALL:
9763 case elfcpp::R_ARM_JUMP24:
9764 case elfcpp::R_ARM_XPC25:
c121c671
DK
9765 gold_assert(gsym == NULL
9766 || gsym->has_plt_offset()
9767 || gsym->final_value_is_known()
9768 || (gsym->is_defined()
9769 && !gsym->is_from_dynobj()
9770 && !gsym->is_preemptible()));
d204b6e9 9771 reloc_status =
2e702c99 9772 Arm_relocate_functions::arm_branch_common(
1521477a
DK
9773 r_type, relinfo, view, gsym, object, r_sym, psymval, address,
9774 thumb_bit, is_weakly_undefined_without_plt);
51938283
DK
9775 break;
9776
41263c05
DK
9777 case elfcpp::R_ARM_THM_JUMP19:
9778 reloc_status =
9779 Arm_relocate_functions::thm_jump19(view, object, psymval, address,
9780 thumb_bit);
9781 break;
9782
800d0f56
ILT
9783 case elfcpp::R_ARM_THM_JUMP6:
9784 reloc_status =
9785 Arm_relocate_functions::thm_jump6(view, object, psymval, address);
9786 break;
9787
9788 case elfcpp::R_ARM_THM_JUMP8:
9789 reloc_status =
9790 Arm_relocate_functions::thm_jump8(view, object, psymval, address);
9791 break;
9792
9793 case elfcpp::R_ARM_THM_JUMP11:
9794 reloc_status =
9795 Arm_relocate_functions::thm_jump11(view, object, psymval, address);
9796 break;
9797
c121c671
DK
9798 case elfcpp::R_ARM_PREL31:
9799 reloc_status = Arm_relocate_functions::prel31(view, object, psymval,
2daedcd6 9800 address, thumb_bit);
c121c671
DK
9801 break;
9802
a2162063 9803 case elfcpp::R_ARM_V4BX:
9b2fd367
DK
9804 if (target->fix_v4bx() > General_options::FIX_V4BX_NONE)
9805 {
9806 const bool is_v4bx_interworking =
9807 (target->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING);
9808 reloc_status =
9809 Arm_relocate_functions::v4bx(relinfo, view, object, address,
9810 is_v4bx_interworking);
9811 }
a2162063
ILT
9812 break;
9813
11b861d5
DK
9814 case elfcpp::R_ARM_THM_PC8:
9815 reloc_status =
9816 Arm_relocate_functions::thm_pc8(view, object, psymval, address);
9817 break;
9818
9819 case elfcpp::R_ARM_THM_PC12:
9820 reloc_status =
9821 Arm_relocate_functions::thm_pc12(view, object, psymval, address);
9822 break;
9823
9824 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
9825 reloc_status =
9826 Arm_relocate_functions::thm_alu11(view, object, psymval, address,
9827 thumb_bit);
9828 break;
9829
b10d2873 9830 case elfcpp::R_ARM_ALU_PC_G0_NC:
b10d2873 9831 case elfcpp::R_ARM_ALU_PC_G0:
b10d2873 9832 case elfcpp::R_ARM_ALU_PC_G1_NC:
b10d2873 9833 case elfcpp::R_ARM_ALU_PC_G1:
b10d2873 9834 case elfcpp::R_ARM_ALU_PC_G2:
b10d2873 9835 case elfcpp::R_ARM_ALU_SB_G0_NC:
b10d2873 9836 case elfcpp::R_ARM_ALU_SB_G0:
b10d2873 9837 case elfcpp::R_ARM_ALU_SB_G1_NC:
b10d2873 9838 case elfcpp::R_ARM_ALU_SB_G1:
b10d2873
ILT
9839 case elfcpp::R_ARM_ALU_SB_G2:
9840 reloc_status =
5c57f1be
DK
9841 Arm_relocate_functions::arm_grp_alu(view, object, psymval,
9842 reloc_property->group_index(),
9843 relative_address_base,
9844 thumb_bit, check_overflow);
b10d2873
ILT
9845 break;
9846
9847 case elfcpp::R_ARM_LDR_PC_G0:
b10d2873 9848 case elfcpp::R_ARM_LDR_PC_G1:
b10d2873 9849 case elfcpp::R_ARM_LDR_PC_G2:
b10d2873 9850 case elfcpp::R_ARM_LDR_SB_G0:
b10d2873 9851 case elfcpp::R_ARM_LDR_SB_G1:
b10d2873
ILT
9852 case elfcpp::R_ARM_LDR_SB_G2:
9853 reloc_status =
5c57f1be
DK
9854 Arm_relocate_functions::arm_grp_ldr(view, object, psymval,
9855 reloc_property->group_index(),
9856 relative_address_base);
b10d2873
ILT
9857 break;
9858
9859 case elfcpp::R_ARM_LDRS_PC_G0:
b10d2873 9860 case elfcpp::R_ARM_LDRS_PC_G1:
b10d2873 9861 case elfcpp::R_ARM_LDRS_PC_G2:
b10d2873 9862 case elfcpp::R_ARM_LDRS_SB_G0:
b10d2873 9863 case elfcpp::R_ARM_LDRS_SB_G1:
b10d2873
ILT
9864 case elfcpp::R_ARM_LDRS_SB_G2:
9865 reloc_status =
5c57f1be
DK
9866 Arm_relocate_functions::arm_grp_ldrs(view, object, psymval,
9867 reloc_property->group_index(),
9868 relative_address_base);
b10d2873
ILT
9869 break;
9870
9871 case elfcpp::R_ARM_LDC_PC_G0:
b10d2873 9872 case elfcpp::R_ARM_LDC_PC_G1:
b10d2873 9873 case elfcpp::R_ARM_LDC_PC_G2:
b10d2873 9874 case elfcpp::R_ARM_LDC_SB_G0:
b10d2873 9875 case elfcpp::R_ARM_LDC_SB_G1:
b10d2873
ILT
9876 case elfcpp::R_ARM_LDC_SB_G2:
9877 reloc_status =
5c57f1be
DK
9878 Arm_relocate_functions::arm_grp_ldc(view, object, psymval,
9879 reloc_property->group_index(),
9880 relative_address_base);
c121c671
DK
9881 break;
9882
f96accdf
DK
9883 // These are initial tls relocs, which are expected when
9884 // linking.
9885 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
9886 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
9887 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
9888 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
9889 case elfcpp::R_ARM_TLS_LE32: // Local-exec
9890 reloc_status =
9891 this->relocate_tls(relinfo, target, relnum, rel, r_type, gsym, psymval,
9892 view, address, view_size);
9893 break;
9894
3cef7179
ILT
9895 // The known and unknown unsupported and/or deprecated relocations.
9896 case elfcpp::R_ARM_PC24:
9897 case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
9898 case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
9899 case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
c121c671 9900 default:
3cef7179
ILT
9901 // Just silently leave the method. We should get an appropriate error
9902 // message in the scan methods.
9903 break;
c121c671
DK
9904 }
9905
9906 // Report any errors.
9907 switch (reloc_status)
9908 {
9909 case Arm_relocate_functions::STATUS_OKAY:
9910 break;
9911 case Arm_relocate_functions::STATUS_OVERFLOW:
9912 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
a2c7281b
DK
9913 _("relocation overflow in %s"),
9914 reloc_property->name().c_str());
c121c671
DK
9915 break;
9916 case Arm_relocate_functions::STATUS_BAD_RELOC:
9917 gold_error_at_location(
9918 relinfo,
9919 relnum,
9920 rel.get_r_offset(),
a2c7281b
DK
9921 _("unexpected opcode while processing relocation %s"),
9922 reloc_property->name().c_str());
c121c671 9923 break;
4a657b0d
DK
9924 default:
9925 gold_unreachable();
9926 }
9927
9928 return true;
9929}
9930
f96accdf
DK
9931// Perform a TLS relocation.
9932
9933template<bool big_endian>
9934inline typename Arm_relocate_functions<big_endian>::Status
9935Target_arm<big_endian>::Relocate::relocate_tls(
9936 const Relocate_info<32, big_endian>* relinfo,
9937 Target_arm<big_endian>* target,
9938 size_t relnum,
9939 const elfcpp::Rel<32, big_endian>& rel,
9940 unsigned int r_type,
9941 const Sized_symbol<32>* gsym,
9942 const Symbol_value<32>* psymval,
9943 unsigned char* view,
4a54abbb 9944 elfcpp::Elf_types<32>::Elf_Addr address,
f96accdf
DK
9945 section_size_type /*view_size*/ )
9946{
9947 typedef Arm_relocate_functions<big_endian> ArmRelocFuncs;
4a54abbb 9948 typedef Relocate_functions<32, big_endian> RelocFuncs;
f96accdf
DK
9949 Output_segment* tls_segment = relinfo->layout->tls_segment();
9950
6fa2a40b 9951 const Sized_relobj_file<32, big_endian>* object = relinfo->object;
f96accdf
DK
9952
9953 elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0);
9954
9955 const bool is_final = (gsym == NULL
9956 ? !parameters->options().shared()
9957 : gsym->final_value_is_known());
9958 const tls::Tls_optimization optimized_type
9959 = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
9960 switch (r_type)
9961 {
9962 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
2e702c99
RM
9963 {
9964 unsigned int got_type = GOT_TYPE_TLS_PAIR;
9965 unsigned int got_offset;
9966 if (gsym != NULL)
9967 {
9968 gold_assert(gsym->has_got_offset(got_type));
9969 got_offset = gsym->got_offset(got_type) - target->got_size();
9970 }
9971 else
9972 {
9973 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
9974 gold_assert(object->local_has_got_offset(r_sym, got_type));
9975 got_offset = (object->local_got_offset(r_sym, got_type)
f96accdf 9976 - target->got_size());
2e702c99
RM
9977 }
9978 if (optimized_type == tls::TLSOPT_NONE)
9979 {
4a54abbb
DK
9980 Arm_address got_entry =
9981 target->got_plt_section()->address() + got_offset;
2e702c99
RM
9982
9983 // Relocate the field with the PC relative offset of the pair of
9984 // GOT entries.
29ab395d 9985 RelocFuncs::pcrel32_unaligned(view, got_entry, address);
2e702c99
RM
9986 return ArmRelocFuncs::STATUS_OKAY;
9987 }
9988 }
f96accdf
DK
9989 break;
9990
9991 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
9992 if (optimized_type == tls::TLSOPT_NONE)
2e702c99
RM
9993 {
9994 // Relocate the field with the offset of the GOT entry for
9995 // the module index.
9996 unsigned int got_offset;
9997 got_offset = (target->got_mod_index_entry(NULL, NULL, NULL)
f96accdf 9998 - target->got_size());
4a54abbb
DK
9999 Arm_address got_entry =
10000 target->got_plt_section()->address() + got_offset;
10001
2e702c99
RM
10002 // Relocate the field with the PC relative offset of the pair of
10003 // GOT entries.
10004 RelocFuncs::pcrel32_unaligned(view, got_entry, address);
f96accdf 10005 return ArmRelocFuncs::STATUS_OKAY;
2e702c99 10006 }
f96accdf
DK
10007 break;
10008
10009 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
29ab395d 10010 RelocFuncs::rel32_unaligned(view, value);
f96accdf
DK
10011 return ArmRelocFuncs::STATUS_OKAY;
10012
10013 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
10014 if (optimized_type == tls::TLSOPT_NONE)
2e702c99
RM
10015 {
10016 // Relocate the field with the offset of the GOT entry for
10017 // the tp-relative offset of the symbol.
f96accdf 10018 unsigned int got_type = GOT_TYPE_TLS_OFFSET;
2e702c99
RM
10019 unsigned int got_offset;
10020 if (gsym != NULL)
10021 {
10022 gold_assert(gsym->has_got_offset(got_type));
10023 got_offset = gsym->got_offset(got_type);
10024 }
10025 else
10026 {
10027 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
10028 gold_assert(object->local_has_got_offset(r_sym, got_type));
10029 got_offset = object->local_got_offset(r_sym, got_type);
10030 }
10031
10032 // All GOT offsets are relative to the end of the GOT.
10033 got_offset -= target->got_size();
4a54abbb
DK
10034
10035 Arm_address got_entry =
10036 target->got_plt_section()->address() + got_offset;
10037
2e702c99 10038 // Relocate the field with the PC relative offset of the GOT entry.
29ab395d 10039 RelocFuncs::pcrel32_unaligned(view, got_entry, address);
f96accdf 10040 return ArmRelocFuncs::STATUS_OKAY;
2e702c99 10041 }
f96accdf
DK
10042 break;
10043
10044 case elfcpp::R_ARM_TLS_LE32: // Local-exec
10045 // If we're creating a shared library, a dynamic relocation will
10046 // have been created for this location, so do not apply it now.
10047 if (!parameters->options().shared())
2e702c99
RM
10048 {
10049 gold_assert(tls_segment != NULL);
4a54abbb
DK
10050
10051 // $tp points to the TCB, which is followed by the TLS, so we
10052 // need to add TCB size to the offset.
10053 Arm_address aligned_tcb_size =
10054 align_address(ARM_TCB_SIZE, tls_segment->maximum_alignment());
2e702c99 10055 RelocFuncs::rel32_unaligned(view, value + aligned_tcb_size);
4a54abbb 10056
2e702c99 10057 }
f96accdf 10058 return ArmRelocFuncs::STATUS_OKAY;
2e702c99 10059
f96accdf
DK
10060 default:
10061 gold_unreachable();
10062 }
10063
10064 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
10065 _("unsupported reloc %u"),
10066 r_type);
10067 return ArmRelocFuncs::STATUS_BAD_RELOC;
10068}
10069
4a657b0d
DK
10070// Relocate section data.
10071
10072template<bool big_endian>
10073void
10074Target_arm<big_endian>::relocate_section(
10075 const Relocate_info<32, big_endian>* relinfo,
10076 unsigned int sh_type,
10077 const unsigned char* prelocs,
10078 size_t reloc_count,
10079 Output_section* output_section,
10080 bool needs_special_offset_handling,
10081 unsigned char* view,
ebabffbd 10082 Arm_address address,
364c7fa5
ILT
10083 section_size_type view_size,
10084 const Reloc_symbol_changes* reloc_symbol_changes)
4a657b0d
DK
10085{
10086 typedef typename Target_arm<big_endian>::Relocate Arm_relocate;
10087 gold_assert(sh_type == elfcpp::SHT_REL);
10088
218c5831
DK
10089 // See if we are relocating a relaxed input section. If so, the view
10090 // covers the whole output section and we need to adjust accordingly.
10091 if (needs_special_offset_handling)
43d12afe 10092 {
218c5831
DK
10093 const Output_relaxed_input_section* poris =
10094 output_section->find_relaxed_input_section(relinfo->object,
10095 relinfo->data_shndx);
10096 if (poris != NULL)
10097 {
10098 Arm_address section_address = poris->address();
10099 section_size_type section_size = poris->data_size();
10100
10101 gold_assert((section_address >= address)
10102 && ((section_address + section_size)
10103 <= (address + view_size)));
10104
10105 off_t offset = section_address - address;
10106 view += offset;
10107 address += offset;
10108 view_size = section_size;
10109 }
43d12afe
DK
10110 }
10111
4a657b0d 10112 gold::relocate_section<32, big_endian, Target_arm, elfcpp::SHT_REL,
168a4726 10113 Arm_relocate, gold::Default_comdat_behavior>(
4a657b0d
DK
10114 relinfo,
10115 this,
10116 prelocs,
10117 reloc_count,
10118 output_section,
10119 needs_special_offset_handling,
10120 view,
10121 address,
364c7fa5
ILT
10122 view_size,
10123 reloc_symbol_changes);
4a657b0d
DK
10124}
10125
10126// Return the size of a relocation while scanning during a relocatable
10127// link.
10128
10129template<bool big_endian>
10130unsigned int
10131Target_arm<big_endian>::Relocatable_size_for_reloc::get_size_for_reloc(
10132 unsigned int r_type,
10133 Relobj* object)
10134{
a6d1ef57 10135 r_type = get_real_reloc_type(r_type);
5c57f1be
DK
10136 const Arm_reloc_property* arp =
10137 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
10138 if (arp != NULL)
10139 return arp->size();
10140 else
4a657b0d 10141 {
5c57f1be
DK
10142 std::string reloc_name =
10143 arm_reloc_property_table->reloc_name_in_error_message(r_type);
10144 gold_error(_("%s: unexpected %s in object file"),
10145 object->name().c_str(), reloc_name.c_str());
4a657b0d
DK
10146 return 0;
10147 }
10148}
10149
10150// Scan the relocs during a relocatable link.
10151
10152template<bool big_endian>
10153void
10154Target_arm<big_endian>::scan_relocatable_relocs(
4a657b0d 10155 Symbol_table* symtab,
2ea97941 10156 Layout* layout,
6fa2a40b 10157 Sized_relobj_file<32, big_endian>* object,
4a657b0d
DK
10158 unsigned int data_shndx,
10159 unsigned int sh_type,
10160 const unsigned char* prelocs,
10161 size_t reloc_count,
10162 Output_section* output_section,
10163 bool needs_special_offset_handling,
10164 size_t local_symbol_count,
10165 const unsigned char* plocal_symbols,
10166 Relocatable_relocs* rr)
10167{
10168 gold_assert(sh_type == elfcpp::SHT_REL);
10169
5c388529 10170 typedef Arm_scan_relocatable_relocs<big_endian, elfcpp::SHT_REL,
4a657b0d
DK
10171 Relocatable_size_for_reloc> Scan_relocatable_relocs;
10172
10173 gold::scan_relocatable_relocs<32, big_endian, elfcpp::SHT_REL,
10174 Scan_relocatable_relocs>(
4a657b0d 10175 symtab,
2ea97941 10176 layout,
4a657b0d
DK
10177 object,
10178 data_shndx,
10179 prelocs,
10180 reloc_count,
10181 output_section,
10182 needs_special_offset_handling,
10183 local_symbol_count,
10184 plocal_symbols,
10185 rr);
10186}
10187
7404fe1b 10188// Emit relocations for a section.
4a657b0d
DK
10189
10190template<bool big_endian>
10191void
7404fe1b 10192Target_arm<big_endian>::relocate_relocs(
4a657b0d
DK
10193 const Relocate_info<32, big_endian>* relinfo,
10194 unsigned int sh_type,
10195 const unsigned char* prelocs,
10196 size_t reloc_count,
10197 Output_section* output_section,
62fe925a 10198 typename elfcpp::Elf_types<32>::Elf_Off offset_in_output_section,
4a657b0d 10199 unsigned char* view,
ebabffbd 10200 Arm_address view_address,
4a657b0d
DK
10201 section_size_type view_size,
10202 unsigned char* reloc_view,
10203 section_size_type reloc_view_size)
10204{
10205 gold_assert(sh_type == elfcpp::SHT_REL);
10206
7404fe1b 10207 gold::relocate_relocs<32, big_endian, elfcpp::SHT_REL>(
4a657b0d
DK
10208 relinfo,
10209 prelocs,
10210 reloc_count,
10211 output_section,
10212 offset_in_output_section,
4a657b0d
DK
10213 view,
10214 view_address,
10215 view_size,
10216 reloc_view,
10217 reloc_view_size);
10218}
10219
5c388529
DK
10220// Perform target-specific processing in a relocatable link. This is
10221// only used if we use the relocation strategy RELOC_SPECIAL.
10222
10223template<bool big_endian>
10224void
10225Target_arm<big_endian>::relocate_special_relocatable(
10226 const Relocate_info<32, big_endian>* relinfo,
10227 unsigned int sh_type,
10228 const unsigned char* preloc_in,
10229 size_t relnum,
10230 Output_section* output_section,
62fe925a 10231 typename elfcpp::Elf_types<32>::Elf_Off offset_in_output_section,
5c388529
DK
10232 unsigned char* view,
10233 elfcpp::Elf_types<32>::Elf_Addr view_address,
10234 section_size_type,
10235 unsigned char* preloc_out)
10236{
10237 // We can only handle REL type relocation sections.
10238 gold_assert(sh_type == elfcpp::SHT_REL);
10239
10240 typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc Reltype;
10241 typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc_write
10242 Reltype_write;
10243 const Arm_address invalid_address = static_cast<Arm_address>(0) - 1;
10244
10245 const Arm_relobj<big_endian>* object =
10246 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
10247 const unsigned int local_count = object->local_symbol_count();
10248
10249 Reltype reloc(preloc_in);
10250 Reltype_write reloc_write(preloc_out);
10251
10252 elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
10253 const unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
10254 const unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
10255
10256 const Arm_reloc_property* arp =
10257 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
10258 gold_assert(arp != NULL);
10259
10260 // Get the new symbol index.
10261 // We only use RELOC_SPECIAL strategy in local relocations.
10262 gold_assert(r_sym < local_count);
10263
10264 // We are adjusting a section symbol. We need to find
10265 // the symbol table index of the section symbol for
10266 // the output section corresponding to input section
10267 // in which this symbol is defined.
10268 bool is_ordinary;
10269 unsigned int shndx = object->local_symbol_input_shndx(r_sym, &is_ordinary);
10270 gold_assert(is_ordinary);
10271 Output_section* os = object->output_section(shndx);
10272 gold_assert(os != NULL);
10273 gold_assert(os->needs_symtab_index());
10274 unsigned int new_symndx = os->symtab_index();
10275
10276 // Get the new offset--the location in the output section where
10277 // this relocation should be applied.
10278
10279 Arm_address offset = reloc.get_r_offset();
10280 Arm_address new_offset;
10281 if (offset_in_output_section != invalid_address)
10282 new_offset = offset + offset_in_output_section;
10283 else
10284 {
10285 section_offset_type sot_offset =
2e702c99 10286 convert_types<section_offset_type, Arm_address>(offset);
5c388529 10287 section_offset_type new_sot_offset =
2e702c99
RM
10288 output_section->output_offset(object, relinfo->data_shndx,
10289 sot_offset);
5c388529
DK
10290 gold_assert(new_sot_offset != -1);
10291 new_offset = new_sot_offset;
10292 }
10293
10294 // In an object file, r_offset is an offset within the section.
10295 // In an executable or dynamic object, generated by
10296 // --emit-relocs, r_offset is an absolute address.
10297 if (!parameters->options().relocatable())
10298 {
10299 new_offset += view_address;
10300 if (offset_in_output_section != invalid_address)
2e702c99 10301 new_offset -= offset_in_output_section;
5c388529
DK
10302 }
10303
10304 reloc_write.put_r_offset(new_offset);
10305 reloc_write.put_r_info(elfcpp::elf_r_info<32>(new_symndx, r_type));
10306
10307 // Handle the reloc addend.
10308 // The relocation uses a section symbol in the input file.
10309 // We are adjusting it to use a section symbol in the output
10310 // file. The input section symbol refers to some address in
10311 // the input section. We need the relocation in the output
10312 // file to refer to that same address. This adjustment to
10313 // the addend is the same calculation we use for a simple
10314 // absolute relocation for the input section symbol.
10315
10316 const Symbol_value<32>* psymval = object->local_symbol(r_sym);
10317
10318 // Handle THUMB bit.
10319 Symbol_value<32> symval;
10320 Arm_address thumb_bit =
10321 object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
10322 if (thumb_bit != 0
2e702c99 10323 && arp->uses_thumb_bit()
5c388529
DK
10324 && ((psymval->value(object, 0) & 1) != 0))
10325 {
10326 Arm_address stripped_value =
10327 psymval->value(object, 0) & ~static_cast<Arm_address>(1);
10328 symval.set_output_value(stripped_value);
10329 psymval = &symval;
2e702c99 10330 }
5c388529
DK
10331
10332 unsigned char* paddend = view + offset;
10333 typename Arm_relocate_functions<big_endian>::Status reloc_status =
10334 Arm_relocate_functions<big_endian>::STATUS_OKAY;
10335 switch (r_type)
10336 {
10337 case elfcpp::R_ARM_ABS8:
10338 reloc_status = Arm_relocate_functions<big_endian>::abs8(paddend, object,
10339 psymval);
10340 break;
10341
10342 case elfcpp::R_ARM_ABS12:
10343 reloc_status = Arm_relocate_functions<big_endian>::abs12(paddend, object,
10344 psymval);
10345 break;
10346
10347 case elfcpp::R_ARM_ABS16:
10348 reloc_status = Arm_relocate_functions<big_endian>::abs16(paddend, object,
10349 psymval);
10350 break;
10351
10352 case elfcpp::R_ARM_THM_ABS5:
10353 reloc_status = Arm_relocate_functions<big_endian>::thm_abs5(paddend,
10354 object,
10355 psymval);
10356 break;
10357
10358 case elfcpp::R_ARM_MOVW_ABS_NC:
10359 case elfcpp::R_ARM_MOVW_PREL_NC:
10360 case elfcpp::R_ARM_MOVW_BREL_NC:
10361 case elfcpp::R_ARM_MOVW_BREL:
10362 reloc_status = Arm_relocate_functions<big_endian>::movw(
10363 paddend, object, psymval, 0, thumb_bit, arp->checks_overflow());
10364 break;
10365
10366 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
10367 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
10368 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
10369 case elfcpp::R_ARM_THM_MOVW_BREL:
10370 reloc_status = Arm_relocate_functions<big_endian>::thm_movw(
10371 paddend, object, psymval, 0, thumb_bit, arp->checks_overflow());
10372 break;
10373
10374 case elfcpp::R_ARM_THM_CALL:
10375 case elfcpp::R_ARM_THM_XPC22:
10376 case elfcpp::R_ARM_THM_JUMP24:
10377 reloc_status =
10378 Arm_relocate_functions<big_endian>::thumb_branch_common(
10379 r_type, relinfo, paddend, NULL, object, 0, psymval, 0, thumb_bit,
10380 false);
10381 break;
10382
10383 case elfcpp::R_ARM_PLT32:
10384 case elfcpp::R_ARM_CALL:
10385 case elfcpp::R_ARM_JUMP24:
10386 case elfcpp::R_ARM_XPC25:
10387 reloc_status =
2e702c99 10388 Arm_relocate_functions<big_endian>::arm_branch_common(
5c388529
DK
10389 r_type, relinfo, paddend, NULL, object, 0, psymval, 0, thumb_bit,
10390 false);
10391 break;
10392
10393 case elfcpp::R_ARM_THM_JUMP19:
10394 reloc_status =
10395 Arm_relocate_functions<big_endian>::thm_jump19(paddend, object,
10396 psymval, 0, thumb_bit);
10397 break;
10398
10399 case elfcpp::R_ARM_THM_JUMP6:
10400 reloc_status =
10401 Arm_relocate_functions<big_endian>::thm_jump6(paddend, object, psymval,
10402 0);
10403 break;
10404
10405 case elfcpp::R_ARM_THM_JUMP8:
10406 reloc_status =
10407 Arm_relocate_functions<big_endian>::thm_jump8(paddend, object, psymval,
10408 0);
10409 break;
10410
10411 case elfcpp::R_ARM_THM_JUMP11:
10412 reloc_status =
10413 Arm_relocate_functions<big_endian>::thm_jump11(paddend, object, psymval,
10414 0);
10415 break;
10416
10417 case elfcpp::R_ARM_PREL31:
10418 reloc_status =
10419 Arm_relocate_functions<big_endian>::prel31(paddend, object, psymval, 0,
10420 thumb_bit);
10421 break;
10422
10423 case elfcpp::R_ARM_THM_PC8:
10424 reloc_status =
10425 Arm_relocate_functions<big_endian>::thm_pc8(paddend, object, psymval,
10426 0);
10427 break;
10428
10429 case elfcpp::R_ARM_THM_PC12:
10430 reloc_status =
10431 Arm_relocate_functions<big_endian>::thm_pc12(paddend, object, psymval,
10432 0);
10433 break;
10434
10435 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
10436 reloc_status =
10437 Arm_relocate_functions<big_endian>::thm_alu11(paddend, object, psymval,
10438 0, thumb_bit);
10439 break;
10440
10441 // These relocation truncate relocation results so we cannot handle them
10442 // in a relocatable link.
10443 case elfcpp::R_ARM_MOVT_ABS:
10444 case elfcpp::R_ARM_THM_MOVT_ABS:
10445 case elfcpp::R_ARM_MOVT_PREL:
10446 case elfcpp::R_ARM_MOVT_BREL:
10447 case elfcpp::R_ARM_THM_MOVT_PREL:
10448 case elfcpp::R_ARM_THM_MOVT_BREL:
10449 case elfcpp::R_ARM_ALU_PC_G0_NC:
10450 case elfcpp::R_ARM_ALU_PC_G0:
10451 case elfcpp::R_ARM_ALU_PC_G1_NC:
10452 case elfcpp::R_ARM_ALU_PC_G1:
10453 case elfcpp::R_ARM_ALU_PC_G2:
10454 case elfcpp::R_ARM_ALU_SB_G0_NC:
10455 case elfcpp::R_ARM_ALU_SB_G0:
10456 case elfcpp::R_ARM_ALU_SB_G1_NC:
10457 case elfcpp::R_ARM_ALU_SB_G1:
10458 case elfcpp::R_ARM_ALU_SB_G2:
10459 case elfcpp::R_ARM_LDR_PC_G0:
10460 case elfcpp::R_ARM_LDR_PC_G1:
10461 case elfcpp::R_ARM_LDR_PC_G2:
10462 case elfcpp::R_ARM_LDR_SB_G0:
10463 case elfcpp::R_ARM_LDR_SB_G1:
10464 case elfcpp::R_ARM_LDR_SB_G2:
10465 case elfcpp::R_ARM_LDRS_PC_G0:
10466 case elfcpp::R_ARM_LDRS_PC_G1:
10467 case elfcpp::R_ARM_LDRS_PC_G2:
10468 case elfcpp::R_ARM_LDRS_SB_G0:
10469 case elfcpp::R_ARM_LDRS_SB_G1:
10470 case elfcpp::R_ARM_LDRS_SB_G2:
10471 case elfcpp::R_ARM_LDC_PC_G0:
10472 case elfcpp::R_ARM_LDC_PC_G1:
10473 case elfcpp::R_ARM_LDC_PC_G2:
10474 case elfcpp::R_ARM_LDC_SB_G0:
10475 case elfcpp::R_ARM_LDC_SB_G1:
10476 case elfcpp::R_ARM_LDC_SB_G2:
10477 gold_error(_("cannot handle %s in a relocatable link"),
10478 arp->name().c_str());
10479 break;
10480
10481 default:
10482 gold_unreachable();
10483 }
10484
10485 // Report any errors.
10486 switch (reloc_status)
10487 {
10488 case Arm_relocate_functions<big_endian>::STATUS_OKAY:
10489 break;
10490 case Arm_relocate_functions<big_endian>::STATUS_OVERFLOW:
10491 gold_error_at_location(relinfo, relnum, reloc.get_r_offset(),
10492 _("relocation overflow in %s"),
10493 arp->name().c_str());
10494 break;
10495 case Arm_relocate_functions<big_endian>::STATUS_BAD_RELOC:
10496 gold_error_at_location(relinfo, relnum, reloc.get_r_offset(),
10497 _("unexpected opcode while processing relocation %s"),
10498 arp->name().c_str());
10499 break;
10500 default:
10501 gold_unreachable();
10502 }
10503}
10504
94cdfcff
DK
10505// Return the value to use for a dynamic symbol which requires special
10506// treatment. This is how we support equality comparisons of function
10507// pointers across shared library boundaries, as described in the
10508// processor specific ABI supplement.
10509
4a657b0d
DK
10510template<bool big_endian>
10511uint64_t
94cdfcff 10512Target_arm<big_endian>::do_dynsym_value(const Symbol* gsym) const
4a657b0d 10513{
94cdfcff 10514 gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
fa89cc82 10515 return this->plt_address_for_global(gsym);
4a657b0d
DK
10516}
10517
10518// Map platform-specific relocs to real relocs
10519//
10520template<bool big_endian>
10521unsigned int
ca09d69a 10522Target_arm<big_endian>::get_real_reloc_type(unsigned int r_type)
4a657b0d
DK
10523{
10524 switch (r_type)
10525 {
10526 case elfcpp::R_ARM_TARGET1:
a6d1ef57
DK
10527 // This is either R_ARM_ABS32 or R_ARM_REL32;
10528 return elfcpp::R_ARM_ABS32;
4a657b0d
DK
10529
10530 case elfcpp::R_ARM_TARGET2:
9b547ce6 10531 // This can be any reloc type but usually is R_ARM_GOT_PREL
a6d1ef57 10532 return elfcpp::R_ARM_GOT_PREL;
4a657b0d
DK
10533
10534 default:
10535 return r_type;
10536 }
10537}
10538
d5b40221
DK
10539// Whether if two EABI versions V1 and V2 are compatible.
10540
10541template<bool big_endian>
10542bool
10543Target_arm<big_endian>::are_eabi_versions_compatible(
10544 elfcpp::Elf_Word v1,
10545 elfcpp::Elf_Word v2)
10546{
10547 // v4 and v5 are the same spec before and after it was released,
10548 // so allow mixing them.
106e8a6c
DK
10549 if ((v1 == elfcpp::EF_ARM_EABI_UNKNOWN || v2 == elfcpp::EF_ARM_EABI_UNKNOWN)
10550 || (v1 == elfcpp::EF_ARM_EABI_VER4 && v2 == elfcpp::EF_ARM_EABI_VER5)
d5b40221
DK
10551 || (v1 == elfcpp::EF_ARM_EABI_VER5 && v2 == elfcpp::EF_ARM_EABI_VER4))
10552 return true;
10553
10554 return v1 == v2;
10555}
10556
10557// Combine FLAGS from an input object called NAME and the processor-specific
10558// flags in the ELF header of the output. Much of this is adapted from the
10559// processor-specific flags merging code in elf32_arm_merge_private_bfd_data
10560// in bfd/elf32-arm.c.
10561
10562template<bool big_endian>
10563void
10564Target_arm<big_endian>::merge_processor_specific_flags(
10565 const std::string& name,
10566 elfcpp::Elf_Word flags)
10567{
10568 if (this->are_processor_specific_flags_set())
10569 {
10570 elfcpp::Elf_Word out_flags = this->processor_specific_flags();
10571
10572 // Nothing to merge if flags equal to those in output.
10573 if (flags == out_flags)
10574 return;
10575
10576 // Complain about various flag mismatches.
10577 elfcpp::Elf_Word version1 = elfcpp::arm_eabi_version(flags);
10578 elfcpp::Elf_Word version2 = elfcpp::arm_eabi_version(out_flags);
7296d933
DK
10579 if (!this->are_eabi_versions_compatible(version1, version2)
10580 && parameters->options().warn_mismatch())
d5b40221
DK
10581 gold_error(_("Source object %s has EABI version %d but output has "
10582 "EABI version %d."),
10583 name.c_str(),
10584 (flags & elfcpp::EF_ARM_EABIMASK) >> 24,
10585 (out_flags & elfcpp::EF_ARM_EABIMASK) >> 24);
10586 }
10587 else
10588 {
10589 // If the input is the default architecture and had the default
10590 // flags then do not bother setting the flags for the output
10591 // architecture, instead allow future merges to do this. If no
10592 // future merges ever set these flags then they will retain their
10593 // uninitialised values, which surprise surprise, correspond
10594 // to the default values.
10595 if (flags == 0)
10596 return;
10597
10598 // This is the first time, just copy the flags.
10599 // We only copy the EABI version for now.
10600 this->set_processor_specific_flags(flags & elfcpp::EF_ARM_EABIMASK);
10601 }
10602}
10603
10604// Adjust ELF file header.
10605template<bool big_endian>
10606void
10607Target_arm<big_endian>::do_adjust_elf_header(
10608 unsigned char* view,
3bfcb652 10609 int len)
d5b40221
DK
10610{
10611 gold_assert(len == elfcpp::Elf_sizes<32>::ehdr_size);
10612
10613 elfcpp::Ehdr<32, big_endian> ehdr(view);
3bfcb652 10614 elfcpp::Elf_Word flags = this->processor_specific_flags();
d5b40221
DK
10615 unsigned char e_ident[elfcpp::EI_NIDENT];
10616 memcpy(e_ident, ehdr.get_e_ident(), elfcpp::EI_NIDENT);
10617
3bfcb652 10618 if (elfcpp::arm_eabi_version(flags)
d5b40221
DK
10619 == elfcpp::EF_ARM_EABI_UNKNOWN)
10620 e_ident[elfcpp::EI_OSABI] = elfcpp::ELFOSABI_ARM;
10621 else
10622 e_ident[elfcpp::EI_OSABI] = 0;
10623 e_ident[elfcpp::EI_ABIVERSION] = 0;
10624
10625 // FIXME: Do EF_ARM_BE8 adjustment.
10626
3bfcb652
NC
10627 // If we're working in EABI_VER5, set the hard/soft float ABI flags
10628 // as appropriate.
10629 if (elfcpp::arm_eabi_version(flags) == elfcpp::EF_ARM_EABI_VER5)
10630 {
10631 elfcpp::Elf_Half type = ehdr.get_e_type();
10632 if (type == elfcpp::ET_EXEC || type == elfcpp::ET_DYN)
10633 {
10634 Object_attribute* attr = this->get_aeabi_object_attribute(elfcpp::Tag_ABI_VFP_args);
f12d1e8a 10635 if (attr->int_value() == elfcpp::AEABI_VFP_args_vfp)
3bfcb652
NC
10636 flags |= elfcpp::EF_ARM_ABI_FLOAT_HARD;
10637 else
10638 flags |= elfcpp::EF_ARM_ABI_FLOAT_SOFT;
10639 this->set_processor_specific_flags(flags);
10640 }
10641 }
d5b40221
DK
10642 elfcpp::Ehdr_write<32, big_endian> oehdr(view);
10643 oehdr.put_e_ident(e_ident);
2bca0377 10644 oehdr.put_e_flags(this->processor_specific_flags());
d5b40221
DK
10645}
10646
10647// do_make_elf_object to override the same function in the base class.
6fa2a40b
CC
10648// We need to use a target-specific sub-class of
10649// Sized_relobj_file<32, big_endian> to store ARM specific information.
10650// Hence we need to have our own ELF object creation.
d5b40221
DK
10651
10652template<bool big_endian>
10653Object*
10654Target_arm<big_endian>::do_make_elf_object(
10655 const std::string& name,
10656 Input_file* input_file,
2ea97941 10657 off_t offset, const elfcpp::Ehdr<32, big_endian>& ehdr)
d5b40221
DK
10658{
10659 int et = ehdr.get_e_type();
f4a8b6d7
DK
10660 // ET_EXEC files are valid input for --just-symbols/-R,
10661 // and we treat them as relocatable objects.
10662 if (et == elfcpp::ET_REL
10663 || (et == elfcpp::ET_EXEC && input_file->just_symbols()))
d5b40221
DK
10664 {
10665 Arm_relobj<big_endian>* obj =
2e702c99 10666 new Arm_relobj<big_endian>(name, input_file, offset, ehdr);
d5b40221
DK
10667 obj->setup();
10668 return obj;
10669 }
10670 else if (et == elfcpp::ET_DYN)
10671 {
10672 Sized_dynobj<32, big_endian>* obj =
2e702c99 10673 new Arm_dynobj<big_endian>(name, input_file, offset, ehdr);
d5b40221
DK
10674 obj->setup();
10675 return obj;
10676 }
10677 else
10678 {
10679 gold_error(_("%s: unsupported ELF file type %d"),
2e702c99 10680 name.c_str(), et);
d5b40221
DK
10681 return NULL;
10682 }
10683}
10684
a0351a69
DK
10685// Read the architecture from the Tag_also_compatible_with attribute, if any.
10686// Returns -1 if no architecture could be read.
10687// This is adapted from get_secondary_compatible_arch() in bfd/elf32-arm.c.
10688
10689template<bool big_endian>
10690int
10691Target_arm<big_endian>::get_secondary_compatible_arch(
10692 const Attributes_section_data* pasd)
10693{
ca09d69a 10694 const Object_attribute* known_attributes =
a0351a69
DK
10695 pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
10696
10697 // Note: the tag and its argument below are uleb128 values, though
10698 // currently-defined values fit in one byte for each.
10699 const std::string& sv =
10700 known_attributes[elfcpp::Tag_also_compatible_with].string_value();
10701 if (sv.size() == 2
10702 && sv.data()[0] == elfcpp::Tag_CPU_arch
10703 && (sv.data()[1] & 128) != 128)
10704 return sv.data()[1];
10705
10706 // This tag is "safely ignorable", so don't complain if it looks funny.
10707 return -1;
10708}
10709
10710// Set, or unset, the architecture of the Tag_also_compatible_with attribute.
10711// The tag is removed if ARCH is -1.
10712// This is adapted from set_secondary_compatible_arch() in bfd/elf32-arm.c.
10713
10714template<bool big_endian>
10715void
10716Target_arm<big_endian>::set_secondary_compatible_arch(
10717 Attributes_section_data* pasd,
10718 int arch)
10719{
ca09d69a 10720 Object_attribute* known_attributes =
a0351a69
DK
10721 pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
10722
10723 if (arch == -1)
10724 {
10725 known_attributes[elfcpp::Tag_also_compatible_with].set_string_value("");
10726 return;
10727 }
10728
10729 // Note: the tag and its argument below are uleb128 values, though
10730 // currently-defined values fit in one byte for each.
10731 char sv[3];
10732 sv[0] = elfcpp::Tag_CPU_arch;
10733 gold_assert(arch != 0);
10734 sv[1] = arch;
10735 sv[2] = '\0';
10736
10737 known_attributes[elfcpp::Tag_also_compatible_with].set_string_value(sv);
10738}
10739
10740// Combine two values for Tag_CPU_arch, taking secondary compatibility tags
10741// into account.
10742// This is adapted from tag_cpu_arch_combine() in bfd/elf32-arm.c.
10743
10744template<bool big_endian>
10745int
10746Target_arm<big_endian>::tag_cpu_arch_combine(
10747 const char* name,
10748 int oldtag,
10749 int* secondary_compat_out,
10750 int newtag,
10751 int secondary_compat)
10752{
10753#define T(X) elfcpp::TAG_CPU_ARCH_##X
10754 static const int v6t2[] =
10755 {
10756 T(V6T2), // PRE_V4.
10757 T(V6T2), // V4.
10758 T(V6T2), // V4T.
10759 T(V6T2), // V5T.
10760 T(V6T2), // V5TE.
10761 T(V6T2), // V5TEJ.
10762 T(V6T2), // V6.
10763 T(V7), // V6KZ.
10764 T(V6T2) // V6T2.
10765 };
10766 static const int v6k[] =
10767 {
10768 T(V6K), // PRE_V4.
10769 T(V6K), // V4.
10770 T(V6K), // V4T.
10771 T(V6K), // V5T.
10772 T(V6K), // V5TE.
10773 T(V6K), // V5TEJ.
10774 T(V6K), // V6.
10775 T(V6KZ), // V6KZ.
10776 T(V7), // V6T2.
10777 T(V6K) // V6K.
10778 };
10779 static const int v7[] =
10780 {
10781 T(V7), // PRE_V4.
10782 T(V7), // V4.
10783 T(V7), // V4T.
10784 T(V7), // V5T.
10785 T(V7), // V5TE.
10786 T(V7), // V5TEJ.
10787 T(V7), // V6.
10788 T(V7), // V6KZ.
10789 T(V7), // V6T2.
10790 T(V7), // V6K.
10791 T(V7) // V7.
10792 };
10793 static const int v6_m[] =
10794 {
10795 -1, // PRE_V4.
10796 -1, // V4.
10797 T(V6K), // V4T.
10798 T(V6K), // V5T.
10799 T(V6K), // V5TE.
10800 T(V6K), // V5TEJ.
10801 T(V6K), // V6.
10802 T(V6KZ), // V6KZ.
10803 T(V7), // V6T2.
10804 T(V6K), // V6K.
10805 T(V7), // V7.
10806 T(V6_M) // V6_M.
10807 };
10808 static const int v6s_m[] =
10809 {
10810 -1, // PRE_V4.
10811 -1, // V4.
10812 T(V6K), // V4T.
10813 T(V6K), // V5T.
10814 T(V6K), // V5TE.
10815 T(V6K), // V5TEJ.
10816 T(V6K), // V6.
10817 T(V6KZ), // V6KZ.
10818 T(V7), // V6T2.
10819 T(V6K), // V6K.
10820 T(V7), // V7.
10821 T(V6S_M), // V6_M.
10822 T(V6S_M) // V6S_M.
10823 };
10824 static const int v7e_m[] =
10825 {
10826 -1, // PRE_V4.
10827 -1, // V4.
10828 T(V7E_M), // V4T.
10829 T(V7E_M), // V5T.
10830 T(V7E_M), // V5TE.
10831 T(V7E_M), // V5TEJ.
10832 T(V7E_M), // V6.
10833 T(V7E_M), // V6KZ.
10834 T(V7E_M), // V6T2.
10835 T(V7E_M), // V6K.
10836 T(V7E_M), // V7.
10837 T(V7E_M), // V6_M.
10838 T(V7E_M), // V6S_M.
10839 T(V7E_M) // V7E_M.
10840 };
24491327
HS
10841 static const int v8[] =
10842 {
10843 T(V8), // PRE_V4.
10844 T(V8), // V4.
10845 T(V8), // V4T.
10846 T(V8), // V5T.
10847 T(V8), // V5TE.
10848 T(V8), // V5TEJ.
10849 T(V8), // V6.
10850 T(V8), // V6KZ.
10851 T(V8), // V6T2.
10852 T(V8), // V6K.
10853 T(V8), // V7.
10854 T(V8), // V6_M.
10855 T(V8), // V6S_M.
10856 T(V8), // V7E_M.
10857 T(V8) // V8.
10858 };
a0351a69
DK
10859 static const int v4t_plus_v6_m[] =
10860 {
10861 -1, // PRE_V4.
10862 -1, // V4.
10863 T(V4T), // V4T.
10864 T(V5T), // V5T.
10865 T(V5TE), // V5TE.
10866 T(V5TEJ), // V5TEJ.
10867 T(V6), // V6.
10868 T(V6KZ), // V6KZ.
10869 T(V6T2), // V6T2.
10870 T(V6K), // V6K.
10871 T(V7), // V7.
10872 T(V6_M), // V6_M.
10873 T(V6S_M), // V6S_M.
10874 T(V7E_M), // V7E_M.
24491327 10875 T(V8), // V8.
a0351a69
DK
10876 T(V4T_PLUS_V6_M) // V4T plus V6_M.
10877 };
ca09d69a 10878 static const int* comb[] =
a0351a69
DK
10879 {
10880 v6t2,
10881 v6k,
10882 v7,
10883 v6_m,
10884 v6s_m,
10885 v7e_m,
24491327 10886 v8,
a0351a69
DK
10887 // Pseudo-architecture.
10888 v4t_plus_v6_m
10889 };
10890
10891 // Check we've not got a higher architecture than we know about.
10892
f62a3ca7 10893 if (oldtag > elfcpp::MAX_TAG_CPU_ARCH || newtag > elfcpp::MAX_TAG_CPU_ARCH)
a0351a69
DK
10894 {
10895 gold_error(_("%s: unknown CPU architecture"), name);
10896 return -1;
10897 }
10898
10899 // Override old tag if we have a Tag_also_compatible_with on the output.
10900
10901 if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
10902 || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
10903 oldtag = T(V4T_PLUS_V6_M);
10904
10905 // And override the new tag if we have a Tag_also_compatible_with on the
10906 // input.
10907
10908 if ((newtag == T(V6_M) && secondary_compat == T(V4T))
10909 || (newtag == T(V4T) && secondary_compat == T(V6_M)))
10910 newtag = T(V4T_PLUS_V6_M);
10911
10912 // Architectures before V6KZ add features monotonically.
10913 int tagh = std::max(oldtag, newtag);
10914 if (tagh <= elfcpp::TAG_CPU_ARCH_V6KZ)
10915 return tagh;
10916
10917 int tagl = std::min(oldtag, newtag);
10918 int result = comb[tagh - T(V6T2)][tagl];
10919
10920 // Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
10921 // as the canonical version.
10922 if (result == T(V4T_PLUS_V6_M))
10923 {
10924 result = T(V4T);
10925 *secondary_compat_out = T(V6_M);
10926 }
10927 else
10928 *secondary_compat_out = -1;
10929
10930 if (result == -1)
10931 {
10932 gold_error(_("%s: conflicting CPU architectures %d/%d"),
10933 name, oldtag, newtag);
10934 return -1;
10935 }
10936
10937 return result;
10938#undef T
10939}
10940
10941// Helper to print AEABI enum tag value.
10942
10943template<bool big_endian>
10944std::string
10945Target_arm<big_endian>::aeabi_enum_name(unsigned int value)
10946{
ca09d69a 10947 static const char* aeabi_enum_names[] =
a0351a69
DK
10948 { "", "variable-size", "32-bit", "" };
10949 const size_t aeabi_enum_names_size =
10950 sizeof(aeabi_enum_names) / sizeof(aeabi_enum_names[0]);
10951
10952 if (value < aeabi_enum_names_size)
10953 return std::string(aeabi_enum_names[value]);
10954 else
10955 {
10956 char buffer[100];
10957 sprintf(buffer, "<unknown value %u>", value);
10958 return std::string(buffer);
10959 }
10960}
10961
10962// Return the string value to store in TAG_CPU_name.
10963
10964template<bool big_endian>
10965std::string
10966Target_arm<big_endian>::tag_cpu_name_value(unsigned int value)
10967{
ca09d69a 10968 static const char* name_table[] = {
a0351a69
DK
10969 // These aren't real CPU names, but we can't guess
10970 // that from the architecture version alone.
10971 "Pre v4",
10972 "ARM v4",
10973 "ARM v4T",
10974 "ARM v5T",
10975 "ARM v5TE",
10976 "ARM v5TEJ",
10977 "ARM v6",
10978 "ARM v6KZ",
10979 "ARM v6T2",
10980 "ARM v6K",
10981 "ARM v7",
10982 "ARM v6-M",
10983 "ARM v6S-M",
24491327
HS
10984 "ARM v7E-M",
10985 "ARM v8"
a0351a69
DK
10986 };
10987 const size_t name_table_size = sizeof(name_table) / sizeof(name_table[0]);
10988
10989 if (value < name_table_size)
10990 return std::string(name_table[value]);
10991 else
10992 {
10993 char buffer[100];
10994 sprintf(buffer, "<unknown CPU value %u>", value);
10995 return std::string(buffer);
2e702c99 10996 }
a0351a69
DK
10997}
10998
679af368
ILT
10999// Query attributes object to see if integer divide instructions may be
11000// present in an object.
11001
11002template<bool big_endian>
11003bool
11004Target_arm<big_endian>::attributes_accept_div(int arch, int profile,
11005 const Object_attribute* div_attr)
11006{
11007 switch (div_attr->int_value())
11008 {
11009 case 0:
11010 // Integer divide allowed if instruction contained in
11011 // archetecture.
11012 if (arch == elfcpp::TAG_CPU_ARCH_V7 && (profile == 'R' || profile == 'M'))
11013 return true;
11014 else if (arch >= elfcpp::TAG_CPU_ARCH_V7E_M)
11015 return true;
11016 else
11017 return false;
11018
11019 case 1:
11020 // Integer divide explicitly prohibited.
11021 return false;
11022
11023 default:
11024 // Unrecognised case - treat as allowing divide everywhere.
11025 case 2:
11026 // Integer divide allowed in ARM state.
11027 return true;
11028 }
11029}
11030
11031// Query attributes object to see if integer divide instructions are
11032// forbidden to be in the object. This is not the inverse of
11033// attributes_accept_div.
11034
11035template<bool big_endian>
11036bool
11037Target_arm<big_endian>::attributes_forbid_div(const Object_attribute* div_attr)
11038{
11039 return div_attr->int_value() == 1;
11040}
11041
a0351a69
DK
11042// Merge object attributes from input file called NAME with those of the
11043// output. The input object attributes are in the object pointed by PASD.
11044
11045template<bool big_endian>
11046void
11047Target_arm<big_endian>::merge_object_attributes(
11048 const char* name,
11049 const Attributes_section_data* pasd)
11050{
11051 // Return if there is no attributes section data.
11052 if (pasd == NULL)
11053 return;
11054
11055 // If output has no object attributes, just copy.
da59ad79 11056 const int vendor = Object_attribute::OBJ_ATTR_PROC;
a0351a69
DK
11057 if (this->attributes_section_data_ == NULL)
11058 {
11059 this->attributes_section_data_ = new Attributes_section_data(*pasd);
da59ad79
DK
11060 Object_attribute* out_attr =
11061 this->attributes_section_data_->known_attributes(vendor);
11062
11063 // We do not output objects with Tag_MPextension_use_legacy - we move
11064 // the attribute's value to Tag_MPextension_use. */
11065 if (out_attr[elfcpp::Tag_MPextension_use_legacy].int_value() != 0)
11066 {
11067 if (out_attr[elfcpp::Tag_MPextension_use].int_value() != 0
11068 && out_attr[elfcpp::Tag_MPextension_use_legacy].int_value()
2e702c99 11069 != out_attr[elfcpp::Tag_MPextension_use].int_value())
da59ad79
DK
11070 {
11071 gold_error(_("%s has both the current and legacy "
11072 "Tag_MPextension_use attributes"),
11073 name);
11074 }
11075
11076 out_attr[elfcpp::Tag_MPextension_use] =
11077 out_attr[elfcpp::Tag_MPextension_use_legacy];
11078 out_attr[elfcpp::Tag_MPextension_use_legacy].set_type(0);
11079 out_attr[elfcpp::Tag_MPextension_use_legacy].set_int_value(0);
11080 }
11081
a0351a69
DK
11082 return;
11083 }
11084
a0351a69
DK
11085 const Object_attribute* in_attr = pasd->known_attributes(vendor);
11086 Object_attribute* out_attr =
11087 this->attributes_section_data_->known_attributes(vendor);
11088
11089 // This needs to happen before Tag_ABI_FP_number_model is merged. */
11090 if (in_attr[elfcpp::Tag_ABI_VFP_args].int_value()
11091 != out_attr[elfcpp::Tag_ABI_VFP_args].int_value())
11092 {
11093 // Ignore mismatches if the object doesn't use floating point. */
5c294fee 11094 if (out_attr[elfcpp::Tag_ABI_FP_number_model].int_value()
f12d1e8a 11095 == elfcpp::AEABI_FP_number_model_none
5c294fee 11096 || (in_attr[elfcpp::Tag_ABI_FP_number_model].int_value()
f12d1e8a 11097 != elfcpp::AEABI_FP_number_model_none
5c294fee 11098 && out_attr[elfcpp::Tag_ABI_VFP_args].int_value()
f12d1e8a 11099 == elfcpp::AEABI_VFP_args_compatible))
a0351a69
DK
11100 out_attr[elfcpp::Tag_ABI_VFP_args].set_int_value(
11101 in_attr[elfcpp::Tag_ABI_VFP_args].int_value());
5c294fee 11102 else if (in_attr[elfcpp::Tag_ABI_FP_number_model].int_value()
f12d1e8a 11103 != elfcpp::AEABI_FP_number_model_none
5c294fee 11104 && in_attr[elfcpp::Tag_ABI_VFP_args].int_value()
f12d1e8a 11105 != elfcpp::AEABI_VFP_args_compatible
7296d933 11106 && parameters->options().warn_mismatch())
2e702c99 11107 gold_error(_("%s uses VFP register arguments, output does not"),
a0351a69
DK
11108 name);
11109 }
11110
11111 for (int i = 4; i < Vendor_object_attributes::NUM_KNOWN_ATTRIBUTES; ++i)
11112 {
11113 // Merge this attribute with existing attributes.
11114 switch (i)
11115 {
11116 case elfcpp::Tag_CPU_raw_name:
11117 case elfcpp::Tag_CPU_name:
11118 // These are merged after Tag_CPU_arch.
11119 break;
11120
11121 case elfcpp::Tag_ABI_optimization_goals:
11122 case elfcpp::Tag_ABI_FP_optimization_goals:
11123 // Use the first value seen.
11124 break;
11125
11126 case elfcpp::Tag_CPU_arch:
11127 {
11128 unsigned int saved_out_attr = out_attr->int_value();
11129 // Merge Tag_CPU_arch and Tag_also_compatible_with.
11130 int secondary_compat =
11131 this->get_secondary_compatible_arch(pasd);
11132 int secondary_compat_out =
11133 this->get_secondary_compatible_arch(
11134 this->attributes_section_data_);
11135 out_attr[i].set_int_value(
11136 tag_cpu_arch_combine(name, out_attr[i].int_value(),
11137 &secondary_compat_out,
11138 in_attr[i].int_value(),
11139 secondary_compat));
11140 this->set_secondary_compatible_arch(this->attributes_section_data_,
11141 secondary_compat_out);
11142
11143 // Merge Tag_CPU_name and Tag_CPU_raw_name.
11144 if (out_attr[i].int_value() == saved_out_attr)
11145 ; // Leave the names alone.
11146 else if (out_attr[i].int_value() == in_attr[i].int_value())
11147 {
11148 // The output architecture has been changed to match the
11149 // input architecture. Use the input names.
11150 out_attr[elfcpp::Tag_CPU_name].set_string_value(
11151 in_attr[elfcpp::Tag_CPU_name].string_value());
11152 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value(
11153 in_attr[elfcpp::Tag_CPU_raw_name].string_value());
11154 }
11155 else
11156 {
11157 out_attr[elfcpp::Tag_CPU_name].set_string_value("");
11158 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value("");
11159 }
11160
11161 // If we still don't have a value for Tag_CPU_name,
11162 // make one up now. Tag_CPU_raw_name remains blank.
11163 if (out_attr[elfcpp::Tag_CPU_name].string_value() == "")
11164 {
11165 const std::string cpu_name =
11166 this->tag_cpu_name_value(out_attr[i].int_value());
11167 // FIXME: If we see an unknown CPU, this will be set
11168 // to "<unknown CPU n>", where n is the attribute value.
11169 // This is different from BFD, which leaves the name alone.
11170 out_attr[elfcpp::Tag_CPU_name].set_string_value(cpu_name);
11171 }
11172 }
11173 break;
11174
11175 case elfcpp::Tag_ARM_ISA_use:
11176 case elfcpp::Tag_THUMB_ISA_use:
11177 case elfcpp::Tag_WMMX_arch:
11178 case elfcpp::Tag_Advanced_SIMD_arch:
11179 // ??? Do Advanced_SIMD (NEON) and WMMX conflict?
11180 case elfcpp::Tag_ABI_FP_rounding:
11181 case elfcpp::Tag_ABI_FP_exceptions:
11182 case elfcpp::Tag_ABI_FP_user_exceptions:
11183 case elfcpp::Tag_ABI_FP_number_model:
11184 case elfcpp::Tag_VFP_HP_extension:
11185 case elfcpp::Tag_CPU_unaligned_access:
11186 case elfcpp::Tag_T2EE_use:
11187 case elfcpp::Tag_Virtualization_use:
11188 case elfcpp::Tag_MPextension_use:
11189 // Use the largest value specified.
11190 if (in_attr[i].int_value() > out_attr[i].int_value())
11191 out_attr[i].set_int_value(in_attr[i].int_value());
11192 break;
11193
11194 case elfcpp::Tag_ABI_align8_preserved:
11195 case elfcpp::Tag_ABI_PCS_RO_data:
11196 // Use the smallest value specified.
11197 if (in_attr[i].int_value() < out_attr[i].int_value())
11198 out_attr[i].set_int_value(in_attr[i].int_value());
11199 break;
11200
11201 case elfcpp::Tag_ABI_align8_needed:
11202 if ((in_attr[i].int_value() > 0 || out_attr[i].int_value() > 0)
11203 && (in_attr[elfcpp::Tag_ABI_align8_preserved].int_value() == 0
11204 || (out_attr[elfcpp::Tag_ABI_align8_preserved].int_value()
11205 == 0)))
11206 {
9b547ce6 11207 // This error message should be enabled once all non-conforming
a0351a69
DK
11208 // binaries in the toolchain have had the attributes set
11209 // properly.
11210 // gold_error(_("output 8-byte data alignment conflicts with %s"),
11211 // name);
11212 }
11213 // Fall through.
11214 case elfcpp::Tag_ABI_FP_denormal:
11215 case elfcpp::Tag_ABI_PCS_GOT_use:
11216 {
11217 // These tags have 0 = don't care, 1 = strong requirement,
11218 // 2 = weak requirement.
11219 static const int order_021[3] = {0, 2, 1};
11220
11221 // Use the "greatest" from the sequence 0, 2, 1, or the largest
11222 // value if greater than 2 (for future-proofing).
11223 if ((in_attr[i].int_value() > 2
11224 && in_attr[i].int_value() > out_attr[i].int_value())
11225 || (in_attr[i].int_value() <= 2
11226 && out_attr[i].int_value() <= 2
11227 && (order_021[in_attr[i].int_value()]
11228 > order_021[out_attr[i].int_value()])))
11229 out_attr[i].set_int_value(in_attr[i].int_value());
11230 }
11231 break;
11232
11233 case elfcpp::Tag_CPU_arch_profile:
11234 if (out_attr[i].int_value() != in_attr[i].int_value())
11235 {
11236 // 0 will merge with anything.
11237 // 'A' and 'S' merge to 'A'.
11238 // 'R' and 'S' merge to 'R'.
11239 // 'M' and 'A|R|S' is an error.
11240 if (out_attr[i].int_value() == 0
11241 || (out_attr[i].int_value() == 'S'
11242 && (in_attr[i].int_value() == 'A'
11243 || in_attr[i].int_value() == 'R')))
11244 out_attr[i].set_int_value(in_attr[i].int_value());
11245 else if (in_attr[i].int_value() == 0
11246 || (in_attr[i].int_value() == 'S'
11247 && (out_attr[i].int_value() == 'A'
11248 || out_attr[i].int_value() == 'R')))
11249 ; // Do nothing.
7296d933 11250 else if (parameters->options().warn_mismatch())
a0351a69
DK
11251 {
11252 gold_error
11253 (_("conflicting architecture profiles %c/%c"),
11254 in_attr[i].int_value() ? in_attr[i].int_value() : '0',
11255 out_attr[i].int_value() ? out_attr[i].int_value() : '0');
11256 }
11257 }
11258 break;
11259 case elfcpp::Tag_VFP_arch:
11260 {
11261 static const struct
11262 {
11263 int ver;
11264 int regs;
11265 } vfp_versions[7] =
11266 {
11267 {0, 0},
11268 {1, 16},
11269 {2, 16},
11270 {3, 32},
11271 {3, 16},
11272 {4, 32},
11273 {4, 16}
11274 };
11275
11276 // Values greater than 6 aren't defined, so just pick the
11277 // biggest.
11278 if (in_attr[i].int_value() > 6
11279 && in_attr[i].int_value() > out_attr[i].int_value())
11280 {
11281 *out_attr = *in_attr;
11282 break;
11283 }
11284 // The output uses the superset of input features
11285 // (ISA version) and registers.
11286 int ver = std::max(vfp_versions[in_attr[i].int_value()].ver,
11287 vfp_versions[out_attr[i].int_value()].ver);
11288 int regs = std::max(vfp_versions[in_attr[i].int_value()].regs,
11289 vfp_versions[out_attr[i].int_value()].regs);
11290 // This assumes all possible supersets are also a valid
11291 // options.
11292 int newval;
11293 for (newval = 6; newval > 0; newval--)
11294 {
11295 if (regs == vfp_versions[newval].regs
11296 && ver == vfp_versions[newval].ver)
11297 break;
11298 }
11299 out_attr[i].set_int_value(newval);
11300 }
11301 break;
11302 case elfcpp::Tag_PCS_config:
11303 if (out_attr[i].int_value() == 0)
11304 out_attr[i].set_int_value(in_attr[i].int_value());
7296d933
DK
11305 else if (in_attr[i].int_value() != 0
11306 && out_attr[i].int_value() != 0
11307 && parameters->options().warn_mismatch())
a0351a69
DK
11308 {
11309 // It's sometimes ok to mix different configs, so this is only
11310 // a warning.
11311 gold_warning(_("%s: conflicting platform configuration"), name);
11312 }
11313 break;
11314 case elfcpp::Tag_ABI_PCS_R9_use:
11315 if (in_attr[i].int_value() != out_attr[i].int_value()
11316 && out_attr[i].int_value() != elfcpp::AEABI_R9_unused
7296d933
DK
11317 && in_attr[i].int_value() != elfcpp::AEABI_R9_unused
11318 && parameters->options().warn_mismatch())
a0351a69
DK
11319 {
11320 gold_error(_("%s: conflicting use of R9"), name);
11321 }
11322 if (out_attr[i].int_value() == elfcpp::AEABI_R9_unused)
11323 out_attr[i].set_int_value(in_attr[i].int_value());
11324 break;
11325 case elfcpp::Tag_ABI_PCS_RW_data:
11326 if (in_attr[i].int_value() == elfcpp::AEABI_PCS_RW_data_SBrel
11327 && (in_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
11328 != elfcpp::AEABI_R9_SB)
11329 && (out_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
7296d933
DK
11330 != elfcpp::AEABI_R9_unused)
11331 && parameters->options().warn_mismatch())
a0351a69
DK
11332 {
11333 gold_error(_("%s: SB relative addressing conflicts with use "
11334 "of R9"),
7296d933 11335 name);
a0351a69
DK
11336 }
11337 // Use the smallest value specified.
11338 if (in_attr[i].int_value() < out_attr[i].int_value())
11339 out_attr[i].set_int_value(in_attr[i].int_value());
11340 break;
11341 case elfcpp::Tag_ABI_PCS_wchar_t:
a0351a69
DK
11342 if (out_attr[i].int_value()
11343 && in_attr[i].int_value()
7296d933 11344 && out_attr[i].int_value() != in_attr[i].int_value()
ce0d1972
DK
11345 && parameters->options().warn_mismatch()
11346 && parameters->options().wchar_size_warning())
a0351a69
DK
11347 {
11348 gold_warning(_("%s uses %u-byte wchar_t yet the output is to "
11349 "use %u-byte wchar_t; use of wchar_t values "
11350 "across objects may fail"),
11351 name, in_attr[i].int_value(),
11352 out_attr[i].int_value());
11353 }
11354 else if (in_attr[i].int_value() && !out_attr[i].int_value())
11355 out_attr[i].set_int_value(in_attr[i].int_value());
11356 break;
11357 case elfcpp::Tag_ABI_enum_size:
11358 if (in_attr[i].int_value() != elfcpp::AEABI_enum_unused)
11359 {
11360 if (out_attr[i].int_value() == elfcpp::AEABI_enum_unused
11361 || out_attr[i].int_value() == elfcpp::AEABI_enum_forced_wide)
11362 {
11363 // The existing object is compatible with anything.
11364 // Use whatever requirements the new object has.
11365 out_attr[i].set_int_value(in_attr[i].int_value());
11366 }
a0351a69 11367 else if (in_attr[i].int_value() != elfcpp::AEABI_enum_forced_wide
7296d933 11368 && out_attr[i].int_value() != in_attr[i].int_value()
ce0d1972
DK
11369 && parameters->options().warn_mismatch()
11370 && parameters->options().enum_size_warning())
a0351a69
DK
11371 {
11372 unsigned int in_value = in_attr[i].int_value();
11373 unsigned int out_value = out_attr[i].int_value();
11374 gold_warning(_("%s uses %s enums yet the output is to use "
11375 "%s enums; use of enum values across objects "
11376 "may fail"),
11377 name,
11378 this->aeabi_enum_name(in_value).c_str(),
11379 this->aeabi_enum_name(out_value).c_str());
11380 }
11381 }
11382 break;
11383 case elfcpp::Tag_ABI_VFP_args:
9b547ce6 11384 // Already done.
a0351a69
DK
11385 break;
11386 case elfcpp::Tag_ABI_WMMX_args:
7296d933
DK
11387 if (in_attr[i].int_value() != out_attr[i].int_value()
11388 && parameters->options().warn_mismatch())
a0351a69
DK
11389 {
11390 gold_error(_("%s uses iWMMXt register arguments, output does "
11391 "not"),
11392 name);
11393 }
11394 break;
11395 case Object_attribute::Tag_compatibility:
11396 // Merged in target-independent code.
11397 break;
11398 case elfcpp::Tag_ABI_HardFP_use:
11399 // 1 (SP) and 2 (DP) conflict, so combine to 3 (SP & DP).
11400 if ((in_attr[i].int_value() == 1 && out_attr[i].int_value() == 2)
11401 || (in_attr[i].int_value() == 2 && out_attr[i].int_value() == 1))
11402 out_attr[i].set_int_value(3);
11403 else if (in_attr[i].int_value() > out_attr[i].int_value())
11404 out_attr[i].set_int_value(in_attr[i].int_value());
11405 break;
11406 case elfcpp::Tag_ABI_FP_16bit_format:
11407 if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
11408 {
7296d933
DK
11409 if (in_attr[i].int_value() != out_attr[i].int_value()
11410 && parameters->options().warn_mismatch())
a0351a69
DK
11411 gold_error(_("fp16 format mismatch between %s and output"),
11412 name);
11413 }
11414 if (in_attr[i].int_value() != 0)
11415 out_attr[i].set_int_value(in_attr[i].int_value());
11416 break;
11417
da59ad79 11418 case elfcpp::Tag_DIV_use:
679af368
ILT
11419 {
11420 // A value of zero on input means that the divide
11421 // instruction may be used if available in the base
11422 // architecture as specified via Tag_CPU_arch and
11423 // Tag_CPU_arch_profile. A value of 1 means that the user
11424 // did not want divide instructions. A value of 2
11425 // explicitly means that divide instructions were allowed
11426 // in ARM and Thumb state.
11427 int arch = this->
11428 get_aeabi_object_attribute(elfcpp::Tag_CPU_arch)->
11429 int_value();
11430 int profile = this->
11431 get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile)->
11432 int_value();
11433 if (in_attr[i].int_value() == out_attr[i].int_value())
11434 {
11435 // Do nothing.
11436 }
11437 else if (attributes_forbid_div(&in_attr[i])
43819297 11438 && !attributes_accept_div(arch, profile, &out_attr[i]))
679af368
ILT
11439 out_attr[i].set_int_value(1);
11440 else if (attributes_forbid_div(&out_attr[i])
11441 && attributes_accept_div(arch, profile, &in_attr[i]))
11442 out_attr[i].set_int_value(in_attr[i].int_value());
11443 else if (in_attr[i].int_value() == 2)
11444 out_attr[i].set_int_value(in_attr[i].int_value());
11445 }
da59ad79
DK
11446 break;
11447
11448 case elfcpp::Tag_MPextension_use_legacy:
11449 // We don't output objects with Tag_MPextension_use_legacy - we
11450 // move the value to Tag_MPextension_use.
11451 if (in_attr[i].int_value() != 0
11452 && in_attr[elfcpp::Tag_MPextension_use].int_value() != 0)
11453 {
11454 if (in_attr[elfcpp::Tag_MPextension_use].int_value()
11455 != in_attr[i].int_value())
11456 {
11457 gold_error(_("%s has has both the current and legacy "
2e702c99 11458 "Tag_MPextension_use attributes"),
da59ad79
DK
11459 name);
11460 }
11461 }
11462
11463 if (in_attr[i].int_value()
11464 > out_attr[elfcpp::Tag_MPextension_use].int_value())
11465 out_attr[elfcpp::Tag_MPextension_use] = in_attr[i];
11466
11467 break;
11468
a0351a69
DK
11469 case elfcpp::Tag_nodefaults:
11470 // This tag is set if it exists, but the value is unused (and is
11471 // typically zero). We don't actually need to do anything here -
11472 // the merge happens automatically when the type flags are merged
11473 // below.
11474 break;
11475 case elfcpp::Tag_also_compatible_with:
11476 // Already done in Tag_CPU_arch.
11477 break;
11478 case elfcpp::Tag_conformance:
11479 // Keep the attribute if it matches. Throw it away otherwise.
11480 // No attribute means no claim to conform.
11481 if (in_attr[i].string_value() != out_attr[i].string_value())
11482 out_attr[i].set_string_value("");
11483 break;
11484
11485 default:
11486 {
11487 const char* err_object = NULL;
11488
11489 // The "known_obj_attributes" table does contain some undefined
11490 // attributes. Ensure that there are unused.
11491 if (out_attr[i].int_value() != 0
11492 || out_attr[i].string_value() != "")
11493 err_object = "output";
11494 else if (in_attr[i].int_value() != 0
11495 || in_attr[i].string_value() != "")
11496 err_object = name;
11497
7296d933
DK
11498 if (err_object != NULL
11499 && parameters->options().warn_mismatch())
a0351a69
DK
11500 {
11501 // Attribute numbers >=64 (mod 128) can be safely ignored.
11502 if ((i & 127) < 64)
11503 gold_error(_("%s: unknown mandatory EABI object attribute "
11504 "%d"),
11505 err_object, i);
11506 else
11507 gold_warning(_("%s: unknown EABI object attribute %d"),
11508 err_object, i);
11509 }
11510
11511 // Only pass on attributes that match in both inputs.
11512 if (!in_attr[i].matches(out_attr[i]))
11513 {
11514 out_attr[i].set_int_value(0);
11515 out_attr[i].set_string_value("");
11516 }
11517 }
11518 }
11519
11520 // If out_attr was copied from in_attr then it won't have a type yet.
11521 if (in_attr[i].type() && !out_attr[i].type())
11522 out_attr[i].set_type(in_attr[i].type());
11523 }
11524
11525 // Merge Tag_compatibility attributes and any common GNU ones.
11526 this->attributes_section_data_->merge(name, pasd);
11527
11528 // Check for any attributes not known on ARM.
11529 typedef Vendor_object_attributes::Other_attributes Other_attributes;
11530 const Other_attributes* in_other_attributes = pasd->other_attributes(vendor);
11531 Other_attributes::const_iterator in_iter = in_other_attributes->begin();
11532 Other_attributes* out_other_attributes =
11533 this->attributes_section_data_->other_attributes(vendor);
11534 Other_attributes::iterator out_iter = out_other_attributes->begin();
11535
11536 while (in_iter != in_other_attributes->end()
11537 || out_iter != out_other_attributes->end())
11538 {
11539 const char* err_object = NULL;
11540 int err_tag = 0;
11541
11542 // The tags for each list are in numerical order.
11543 // If the tags are equal, then merge.
11544 if (out_iter != out_other_attributes->end()
11545 && (in_iter == in_other_attributes->end()
11546 || in_iter->first > out_iter->first))
11547 {
11548 // This attribute only exists in output. We can't merge, and we
11549 // don't know what the tag means, so delete it.
11550 err_object = "output";
11551 err_tag = out_iter->first;
11552 int saved_tag = out_iter->first;
11553 delete out_iter->second;
2e702c99 11554 out_other_attributes->erase(out_iter);
a0351a69
DK
11555 out_iter = out_other_attributes->upper_bound(saved_tag);
11556 }
11557 else if (in_iter != in_other_attributes->end()
11558 && (out_iter != out_other_attributes->end()
11559 || in_iter->first < out_iter->first))
11560 {
11561 // This attribute only exists in input. We can't merge, and we
11562 // don't know what the tag means, so ignore it.
11563 err_object = name;
11564 err_tag = in_iter->first;
11565 ++in_iter;
11566 }
11567 else // The tags are equal.
11568 {
11569 // As present, all attributes in the list are unknown, and
11570 // therefore can't be merged meaningfully.
11571 err_object = "output";
11572 err_tag = out_iter->first;
11573
11574 // Only pass on attributes that match in both inputs.
11575 if (!in_iter->second->matches(*(out_iter->second)))
11576 {
11577 // No match. Delete the attribute.
11578 int saved_tag = out_iter->first;
11579 delete out_iter->second;
11580 out_other_attributes->erase(out_iter);
11581 out_iter = out_other_attributes->upper_bound(saved_tag);
11582 }
11583 else
11584 {
11585 // Matched. Keep the attribute and move to the next.
11586 ++out_iter;
11587 ++in_iter;
11588 }
11589 }
11590
7296d933 11591 if (err_object && parameters->options().warn_mismatch())
a0351a69
DK
11592 {
11593 // Attribute numbers >=64 (mod 128) can be safely ignored. */
11594 if ((err_tag & 127) < 64)
11595 {
11596 gold_error(_("%s: unknown mandatory EABI object attribute %d"),
11597 err_object, err_tag);
11598 }
11599 else
11600 {
11601 gold_warning(_("%s: unknown EABI object attribute %d"),
11602 err_object, err_tag);
11603 }
11604 }
11605 }
11606}
11607
55da9579
DK
11608// Stub-generation methods for Target_arm.
11609
11610// Make a new Arm_input_section object.
11611
11612template<bool big_endian>
11613Arm_input_section<big_endian>*
11614Target_arm<big_endian>::new_arm_input_section(
2ea97941
ILT
11615 Relobj* relobj,
11616 unsigned int shndx)
55da9579 11617{
5ac169d4 11618 Section_id sid(relobj, shndx);
55da9579
DK
11619
11620 Arm_input_section<big_endian>* arm_input_section =
2ea97941 11621 new Arm_input_section<big_endian>(relobj, shndx);
55da9579
DK
11622 arm_input_section->init();
11623
11624 // Register new Arm_input_section in map for look-up.
11625 std::pair<typename Arm_input_section_map::iterator, bool> ins =
5ac169d4 11626 this->arm_input_section_map_.insert(std::make_pair(sid, arm_input_section));
55da9579
DK
11627
11628 // Make sure that it we have not created another Arm_input_section
11629 // for this input section already.
11630 gold_assert(ins.second);
11631
2e702c99 11632 return arm_input_section;
55da9579
DK
11633}
11634
11635// Find the Arm_input_section object corresponding to the SHNDX-th input
11636// section of RELOBJ.
11637
11638template<bool big_endian>
11639Arm_input_section<big_endian>*
11640Target_arm<big_endian>::find_arm_input_section(
2ea97941
ILT
11641 Relobj* relobj,
11642 unsigned int shndx) const
55da9579 11643{
5ac169d4 11644 Section_id sid(relobj, shndx);
55da9579 11645 typename Arm_input_section_map::const_iterator p =
5ac169d4 11646 this->arm_input_section_map_.find(sid);
55da9579
DK
11647 return (p != this->arm_input_section_map_.end()) ? p->second : NULL;
11648}
11649
11650// Make a new stub table.
11651
11652template<bool big_endian>
11653Stub_table<big_endian>*
11654Target_arm<big_endian>::new_stub_table(Arm_input_section<big_endian>* owner)
11655{
2ea97941 11656 Stub_table<big_endian>* stub_table =
55da9579 11657 new Stub_table<big_endian>(owner);
2ea97941 11658 this->stub_tables_.push_back(stub_table);
55da9579 11659
2ea97941
ILT
11660 stub_table->set_address(owner->address() + owner->data_size());
11661 stub_table->set_file_offset(owner->offset() + owner->data_size());
11662 stub_table->finalize_data_size();
55da9579 11663
2ea97941 11664 return stub_table;
55da9579
DK
11665}
11666
eb44217c
DK
11667// Scan a relocation for stub generation.
11668
11669template<bool big_endian>
11670void
11671Target_arm<big_endian>::scan_reloc_for_stub(
11672 const Relocate_info<32, big_endian>* relinfo,
11673 unsigned int r_type,
11674 const Sized_symbol<32>* gsym,
11675 unsigned int r_sym,
11676 const Symbol_value<32>* psymval,
11677 elfcpp::Elf_types<32>::Elf_Swxword addend,
11678 Arm_address address)
11679{
eb44217c
DK
11680 const Arm_relobj<big_endian>* arm_relobj =
11681 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
11682
11683 bool target_is_thumb;
11684 Symbol_value<32> symval;
11685 if (gsym != NULL)
11686 {
11687 // This is a global symbol. Determine if we use PLT and if the
11688 // final target is THUMB.
95a2c8d6 11689 if (gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
eb44217c
DK
11690 {
11691 // This uses a PLT, change the symbol value.
fa89cc82 11692 symval.set_output_value(this->plt_address_for_global(gsym));
eb44217c
DK
11693 psymval = &symval;
11694 target_is_thumb = false;
11695 }
11696 else if (gsym->is_undefined())
11697 // There is no need to generate a stub symbol is undefined.
11698 return;
11699 else
11700 {
11701 target_is_thumb =
11702 ((gsym->type() == elfcpp::STT_ARM_TFUNC)
11703 || (gsym->type() == elfcpp::STT_FUNC
11704 && !gsym->is_undefined()
11705 && ((psymval->value(arm_relobj, 0) & 1) != 0)));
11706 }
11707 }
11708 else
11709 {
11710 // This is a local symbol. Determine if the final target is THUMB.
11711 target_is_thumb = arm_relobj->local_symbol_is_thumb_function(r_sym);
11712 }
11713
11714 // Strip LSB if this points to a THUMB target.
5c57f1be
DK
11715 const Arm_reloc_property* reloc_property =
11716 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
11717 gold_assert(reloc_property != NULL);
eb44217c 11718 if (target_is_thumb
5c57f1be 11719 && reloc_property->uses_thumb_bit()
eb44217c
DK
11720 && ((psymval->value(arm_relobj, 0) & 1) != 0))
11721 {
11722 Arm_address stripped_value =
11723 psymval->value(arm_relobj, 0) & ~static_cast<Arm_address>(1);
11724 symval.set_output_value(stripped_value);
11725 psymval = &symval;
2e702c99 11726 }
eb44217c
DK
11727
11728 // Get the symbol value.
11729 Symbol_value<32>::Value value = psymval->value(arm_relobj, 0);
11730
11731 // Owing to pipelining, the PC relative branches below actually skip
11732 // two instructions when the branch offset is 0.
11733 Arm_address destination;
11734 switch (r_type)
11735 {
11736 case elfcpp::R_ARM_CALL:
11737 case elfcpp::R_ARM_JUMP24:
11738 case elfcpp::R_ARM_PLT32:
11739 // ARM branches.
11740 destination = value + addend + 8;
11741 break;
11742 case elfcpp::R_ARM_THM_CALL:
11743 case elfcpp::R_ARM_THM_XPC22:
11744 case elfcpp::R_ARM_THM_JUMP24:
11745 case elfcpp::R_ARM_THM_JUMP19:
11746 // THUMB branches.
11747 destination = value + addend + 4;
11748 break;
11749 default:
11750 gold_unreachable();
11751 }
11752
a120bc7f 11753 Reloc_stub* stub = NULL;
eb44217c
DK
11754 Stub_type stub_type =
11755 Reloc_stub::stub_type_for_reloc(r_type, address, destination,
11756 target_is_thumb);
a120bc7f
DK
11757 if (stub_type != arm_stub_none)
11758 {
11759 // Try looking up an existing stub from a stub table.
2e702c99 11760 Stub_table<big_endian>* stub_table =
a120bc7f
DK
11761 arm_relobj->stub_table(relinfo->data_shndx);
11762 gold_assert(stub_table != NULL);
2e702c99 11763
a120bc7f
DK
11764 // Locate stub by destination.
11765 Reloc_stub::Key stub_key(stub_type, gsym, arm_relobj, r_sym, addend);
eb44217c 11766
a120bc7f
DK
11767 // Create a stub if there is not one already
11768 stub = stub_table->find_reloc_stub(stub_key);
11769 if (stub == NULL)
11770 {
11771 // create a new stub and add it to stub table.
11772 stub = this->stub_factory().make_reloc_stub(stub_type);
11773 stub_table->add_reloc_stub(stub, stub_key);
11774 }
11775
11776 // Record the destination address.
11777 stub->set_destination_address(destination
11778 | (target_is_thumb ? 1 : 0));
eb44217c
DK
11779 }
11780
a120bc7f
DK
11781 // For Cortex-A8, we need to record a relocation at 4K page boundary.
11782 if (this->fix_cortex_a8_
11783 && (r_type == elfcpp::R_ARM_THM_JUMP24
11784 || r_type == elfcpp::R_ARM_THM_JUMP19
11785 || r_type == elfcpp::R_ARM_THM_CALL
11786 || r_type == elfcpp::R_ARM_THM_XPC22)
11787 && (address & 0xfffU) == 0xffeU)
11788 {
11789 // Found a candidate. Note we haven't checked the destination is
11790 // within 4K here: if we do so (and don't create a record) we can't
11791 // tell that a branch should have been relocated when scanning later.
11792 this->cortex_a8_relocs_info_[address] =
11793 new Cortex_a8_reloc(stub, r_type,
11794 destination | (target_is_thumb ? 1 : 0));
11795 }
eb44217c
DK
11796}
11797
11798// This function scans a relocation sections for stub generation.
11799// The template parameter Relocate must be a class type which provides
11800// a single function, relocate(), which implements the machine
11801// specific part of a relocation.
11802
11803// BIG_ENDIAN is the endianness of the data. SH_TYPE is the section type:
11804// SHT_REL or SHT_RELA.
11805
11806// PRELOCS points to the relocation data. RELOC_COUNT is the number
11807// of relocs. OUTPUT_SECTION is the output section.
11808// NEEDS_SPECIAL_OFFSET_HANDLING is true if input offsets need to be
11809// mapped to output offsets.
11810
11811// VIEW is the section data, VIEW_ADDRESS is its memory address, and
11812// VIEW_SIZE is the size. These refer to the input section, unless
11813// NEEDS_SPECIAL_OFFSET_HANDLING is true, in which case they refer to
11814// the output section.
11815
11816template<bool big_endian>
11817template<int sh_type>
11818void inline
11819Target_arm<big_endian>::scan_reloc_section_for_stubs(
11820 const Relocate_info<32, big_endian>* relinfo,
11821 const unsigned char* prelocs,
11822 size_t reloc_count,
11823 Output_section* output_section,
11824 bool needs_special_offset_handling,
11825 const unsigned char* view,
11826 elfcpp::Elf_types<32>::Elf_Addr view_address,
11827 section_size_type)
11828{
11829 typedef typename Reloc_types<sh_type, 32, big_endian>::Reloc Reltype;
11830 const int reloc_size =
11831 Reloc_types<sh_type, 32, big_endian>::reloc_size;
11832
11833 Arm_relobj<big_endian>* arm_object =
11834 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
11835 unsigned int local_count = arm_object->local_symbol_count();
11836
168a4726 11837 gold::Default_comdat_behavior default_comdat_behavior;
eb44217c
DK
11838 Comdat_behavior comdat_behavior = CB_UNDETERMINED;
11839
11840 for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
11841 {
11842 Reltype reloc(prelocs);
11843
11844 typename elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
11845 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
11846 unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
11847
11848 r_type = this->get_real_reloc_type(r_type);
11849
11850 // Only a few relocation types need stubs.
11851 if ((r_type != elfcpp::R_ARM_CALL)
2e702c99
RM
11852 && (r_type != elfcpp::R_ARM_JUMP24)
11853 && (r_type != elfcpp::R_ARM_PLT32)
11854 && (r_type != elfcpp::R_ARM_THM_CALL)
11855 && (r_type != elfcpp::R_ARM_THM_XPC22)
11856 && (r_type != elfcpp::R_ARM_THM_JUMP24)
11857 && (r_type != elfcpp::R_ARM_THM_JUMP19)
11858 && (r_type != elfcpp::R_ARM_V4BX))
eb44217c
DK
11859 continue;
11860
2ea97941 11861 section_offset_type offset =
eb44217c
DK
11862 convert_to_section_size_type(reloc.get_r_offset());
11863
11864 if (needs_special_offset_handling)
11865 {
2ea97941
ILT
11866 offset = output_section->output_offset(relinfo->object,
11867 relinfo->data_shndx,
11868 offset);
11869 if (offset == -1)
eb44217c
DK
11870 continue;
11871 }
11872
2fd9ae7a 11873 // Create a v4bx stub if --fix-v4bx-interworking is used.
a2162063
ILT
11874 if (r_type == elfcpp::R_ARM_V4BX)
11875 {
2fd9ae7a
DK
11876 if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING)
11877 {
11878 // Get the BX instruction.
11879 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
11880 const Valtype* wv =
11881 reinterpret_cast<const Valtype*>(view + offset);
11882 elfcpp::Elf_types<32>::Elf_Swxword insn =
11883 elfcpp::Swap<32, big_endian>::readval(wv);
11884 const uint32_t reg = (insn & 0xf);
11885
11886 if (reg < 0xf)
11887 {
11888 // Try looking up an existing stub from a stub table.
11889 Stub_table<big_endian>* stub_table =
11890 arm_object->stub_table(relinfo->data_shndx);
11891 gold_assert(stub_table != NULL);
11892
11893 if (stub_table->find_arm_v4bx_stub(reg) == NULL)
11894 {
11895 // create a new stub and add it to stub table.
11896 Arm_v4bx_stub* stub =
2e702c99 11897 this->stub_factory().make_arm_v4bx_stub(reg);
2fd9ae7a
DK
11898 gold_assert(stub != NULL);
11899 stub_table->add_arm_v4bx_stub(stub);
11900 }
11901 }
11902 }
a2162063
ILT
11903 continue;
11904 }
11905
eb44217c
DK
11906 // Get the addend.
11907 Stub_addend_reader<sh_type, big_endian> stub_addend_reader;
11908 elfcpp::Elf_types<32>::Elf_Swxword addend =
2ea97941 11909 stub_addend_reader(r_type, view + offset, reloc);
eb44217c
DK
11910
11911 const Sized_symbol<32>* sym;
11912
11913 Symbol_value<32> symval;
11914 const Symbol_value<32> *psymval;
aa98ff75
DK
11915 bool is_defined_in_discarded_section;
11916 unsigned int shndx;
eb44217c
DK
11917 if (r_sym < local_count)
11918 {
11919 sym = NULL;
11920 psymval = arm_object->local_symbol(r_sym);
11921
2e702c99
RM
11922 // If the local symbol belongs to a section we are discarding,
11923 // and that section is a debug section, try to find the
11924 // corresponding kept section and map this symbol to its
11925 // counterpart in the kept section. The symbol must not
11926 // correspond to a section we are folding.
eb44217c 11927 bool is_ordinary;
aa98ff75
DK
11928 shndx = psymval->input_shndx(&is_ordinary);
11929 is_defined_in_discarded_section =
11930 (is_ordinary
11931 && shndx != elfcpp::SHN_UNDEF
11932 && !arm_object->is_section_included(shndx)
11933 && !relinfo->symtab->is_section_folded(arm_object, shndx));
11934
11935 // We need to compute the would-be final value of this local
11936 // symbol.
11937 if (!is_defined_in_discarded_section)
eb44217c 11938 {
6fa2a40b 11939 typedef Sized_relobj_file<32, big_endian> ObjType;
aa98ff75
DK
11940 typename ObjType::Compute_final_local_value_status status =
11941 arm_object->compute_final_local_value(r_sym, psymval, &symval,
2e702c99 11942 relinfo->symtab);
aa98ff75
DK
11943 if (status == ObjType::CFLV_OK)
11944 {
11945 // Currently we cannot handle a branch to a target in
11946 // a merged section. If this is the case, issue an error
11947 // and also free the merge symbol value.
11948 if (!symval.has_output_value())
11949 {
11950 const std::string& section_name =
11951 arm_object->section_name(shndx);
11952 arm_object->error(_("cannot handle branch to local %u "
11953 "in a merged section %s"),
11954 r_sym, section_name.c_str());
11955 }
11956 psymval = &symval;
11957 }
eb44217c 11958 else
aa98ff75
DK
11959 {
11960 // We cannot determine the final value.
2e702c99 11961 continue;
aa98ff75 11962 }
eb44217c
DK
11963 }
11964 }
11965 else
11966 {
aa98ff75
DK
11967 const Symbol* gsym;
11968 gsym = arm_object->global_symbol(r_sym);
eb44217c
DK
11969 gold_assert(gsym != NULL);
11970 if (gsym->is_forwarder())
11971 gsym = relinfo->symtab->resolve_forwards(gsym);
11972
11973 sym = static_cast<const Sized_symbol<32>*>(gsym);
aa98ff75 11974 if (sym->has_symtab_index() && sym->symtab_index() != -1U)
eb44217c
DK
11975 symval.set_output_symtab_index(sym->symtab_index());
11976 else
11977 symval.set_no_output_symtab_entry();
11978
11979 // We need to compute the would-be final value of this global
11980 // symbol.
11981 const Symbol_table* symtab = relinfo->symtab;
11982 const Sized_symbol<32>* sized_symbol =
11983 symtab->get_sized_symbol<32>(gsym);
11984 Symbol_table::Compute_final_value_status status;
11985 Arm_address value =
11986 symtab->compute_final_value<32>(sized_symbol, &status);
11987
11988 // Skip this if the symbol has not output section.
11989 if (status == Symbol_table::CFVS_NO_OUTPUT_SECTION)
11990 continue;
eb44217c 11991 symval.set_output_value(value);
aa98ff75
DK
11992
11993 if (gsym->type() == elfcpp::STT_TLS)
11994 symval.set_is_tls_symbol();
11995 else if (gsym->type() == elfcpp::STT_GNU_IFUNC)
11996 symval.set_is_ifunc_symbol();
eb44217c 11997 psymval = &symval;
aa98ff75
DK
11998
11999 is_defined_in_discarded_section =
12000 (gsym->is_defined_in_discarded_section()
12001 && gsym->is_undefined());
12002 shndx = 0;
12003 }
12004
12005 Symbol_value<32> symval2;
12006 if (is_defined_in_discarded_section)
12007 {
12008 if (comdat_behavior == CB_UNDETERMINED)
12009 {
12010 std::string name = arm_object->section_name(relinfo->data_shndx);
168a4726 12011 comdat_behavior = default_comdat_behavior.get(name.c_str());
aa98ff75
DK
12012 }
12013 if (comdat_behavior == CB_PRETEND)
12014 {
12015 // FIXME: This case does not work for global symbols.
12016 // We have no place to store the original section index.
12017 // Fortunately this does not matter for comdat sections,
12018 // only for sections explicitly discarded by a linker
12019 // script.
12020 bool found;
12021 typename elfcpp::Elf_types<32>::Elf_Addr value =
12022 arm_object->map_to_kept_section(shndx, &found);
12023 if (found)
12024 symval2.set_output_value(value + psymval->input_value());
12025 else
12026 symval2.set_output_value(0);
12027 }
12028 else
12029 {
12030 if (comdat_behavior == CB_WARNING)
12031 gold_warning_at_location(relinfo, i, offset,
12032 _("relocation refers to discarded "
12033 "section"));
12034 symval2.set_output_value(0);
12035 }
12036 symval2.set_no_output_symtab_entry();
12037 psymval = &symval2;
eb44217c
DK
12038 }
12039
12040 // If symbol is a section symbol, we don't know the actual type of
12041 // destination. Give up.
12042 if (psymval->is_section_symbol())
12043 continue;
12044
12045 this->scan_reloc_for_stub(relinfo, r_type, sym, r_sym, psymval,
2ea97941 12046 addend, view_address + offset);
eb44217c
DK
12047 }
12048}
12049
12050// Scan an input section for stub generation.
12051
12052template<bool big_endian>
12053void
12054Target_arm<big_endian>::scan_section_for_stubs(
12055 const Relocate_info<32, big_endian>* relinfo,
12056 unsigned int sh_type,
12057 const unsigned char* prelocs,
12058 size_t reloc_count,
12059 Output_section* output_section,
12060 bool needs_special_offset_handling,
12061 const unsigned char* view,
12062 Arm_address view_address,
12063 section_size_type view_size)
12064{
12065 if (sh_type == elfcpp::SHT_REL)
12066 this->scan_reloc_section_for_stubs<elfcpp::SHT_REL>(
12067 relinfo,
12068 prelocs,
12069 reloc_count,
12070 output_section,
12071 needs_special_offset_handling,
12072 view,
12073 view_address,
12074 view_size);
12075 else if (sh_type == elfcpp::SHT_RELA)
12076 // We do not support RELA type relocations yet. This is provided for
12077 // completeness.
12078 this->scan_reloc_section_for_stubs<elfcpp::SHT_RELA>(
12079 relinfo,
12080 prelocs,
12081 reloc_count,
12082 output_section,
12083 needs_special_offset_handling,
12084 view,
12085 view_address,
12086 view_size);
12087 else
12088 gold_unreachable();
12089}
12090
12091// Group input sections for stub generation.
12092//
9b547ce6 12093// We group input sections in an output section so that the total size,
eb44217c
DK
12094// including any padding space due to alignment is smaller than GROUP_SIZE
12095// unless the only input section in group is bigger than GROUP_SIZE already.
12096// Then an ARM stub table is created to follow the last input section
12097// in group. For each group an ARM stub table is created an is placed
9b547ce6 12098// after the last group. If STUB_ALWAYS_AFTER_BRANCH is false, we further
eb44217c
DK
12099// extend the group after the stub table.
12100
12101template<bool big_endian>
12102void
12103Target_arm<big_endian>::group_sections(
2ea97941 12104 Layout* layout,
eb44217c 12105 section_size_type group_size,
f625ae50
DK
12106 bool stubs_always_after_branch,
12107 const Task* task)
eb44217c
DK
12108{
12109 // Group input sections and insert stub table
12110 Layout::Section_list section_list;
ec661b9d 12111 layout->get_executable_sections(&section_list);
eb44217c
DK
12112 for (Layout::Section_list::const_iterator p = section_list.begin();
12113 p != section_list.end();
12114 ++p)
12115 {
12116 Arm_output_section<big_endian>* output_section =
12117 Arm_output_section<big_endian>::as_arm_output_section(*p);
12118 output_section->group_sections(group_size, stubs_always_after_branch,
f625ae50 12119 this, task);
eb44217c
DK
12120 }
12121}
12122
12123// Relaxation hook. This is where we do stub generation.
12124
12125template<bool big_endian>
12126bool
12127Target_arm<big_endian>::do_relax(
12128 int pass,
12129 const Input_objects* input_objects,
12130 Symbol_table* symtab,
f625ae50
DK
12131 Layout* layout,
12132 const Task* task)
eb44217c
DK
12133{
12134 // No need to generate stubs if this is a relocatable link.
12135 gold_assert(!parameters->options().relocatable());
12136
12137 // If this is the first pass, we need to group input sections into
12138 // stub groups.
2b328d4e 12139 bool done_exidx_fixup = false;
6625d24e 12140 typedef typename Stub_table_list::iterator Stub_table_iterator;
eb44217c
DK
12141 if (pass == 1)
12142 {
12143 // Determine the stub group size. The group size is the absolute
12144 // value of the parameter --stub-group-size. If --stub-group-size
9b547ce6 12145 // is passed a negative value, we restrict stubs to be always after
eb44217c
DK
12146 // the stubbed branches.
12147 int32_t stub_group_size_param =
12148 parameters->options().stub_group_size();
12149 bool stubs_always_after_branch = stub_group_size_param < 0;
12150 section_size_type stub_group_size = abs(stub_group_size_param);
12151
12152 if (stub_group_size == 1)
12153 {
12154 // Default value.
12155 // Thumb branch range is +-4MB has to be used as the default
12156 // maximum size (a given section can contain both ARM and Thumb
a2c7281b
DK
12157 // code, so the worst case has to be taken into account). If we are
12158 // fixing cortex-a8 errata, the branch range has to be even smaller,
12159 // since wide conditional branch has a range of +-1MB only.
eb44217c 12160 //
25bbe950 12161 // This value is 48K less than that, which allows for 4096
eb44217c
DK
12162 // 12-byte stubs. If we exceed that, then we will fail to link.
12163 // The user will have to relink with an explicit group size
12164 // option.
25bbe950
DK
12165 stub_group_size = 4145152;
12166 }
12167
12168 // The Cortex-A8 erratum fix depends on stubs not being in the same 4K
12169 // page as the first half of a 32-bit branch straddling two 4K pages.
12170 // This is a crude way of enforcing that. In addition, long conditional
12171 // branches of THUMB-2 have a range of +-1M. If we are fixing cortex-A8
12172 // erratum, limit the group size to (1M - 12k) to avoid unreachable
12173 // cortex-A8 stubs from long conditional branches.
12174 if (this->fix_cortex_a8_)
12175 {
12176 stubs_always_after_branch = true;
12177 const section_size_type cortex_a8_group_size = 1024 * (1024 - 12);
12178 stub_group_size = std::max(stub_group_size, cortex_a8_group_size);
eb44217c
DK
12179 }
12180
f625ae50 12181 group_sections(layout, stub_group_size, stubs_always_after_branch, task);
2e702c99 12182
2b328d4e 12183 // Also fix .ARM.exidx section coverage.
131687b4
DK
12184 Arm_output_section<big_endian>* exidx_output_section = NULL;
12185 for (Layout::Section_list::const_iterator p =
12186 layout->section_list().begin();
12187 p != layout->section_list().end();
12188 ++p)
12189 if ((*p)->type() == elfcpp::SHT_ARM_EXIDX)
12190 {
12191 if (exidx_output_section == NULL)
12192 exidx_output_section =
12193 Arm_output_section<big_endian>::as_arm_output_section(*p);
12194 else
12195 // We cannot handle this now.
12196 gold_error(_("multiple SHT_ARM_EXIDX sections %s and %s in a "
12197 "non-relocatable link"),
12198 exidx_output_section->name(),
12199 (*p)->name());
12200 }
12201
12202 if (exidx_output_section != NULL)
2b328d4e 12203 {
131687b4 12204 this->fix_exidx_coverage(layout, input_objects, exidx_output_section,
f625ae50 12205 symtab, task);
2b328d4e
DK
12206 done_exidx_fixup = true;
12207 }
eb44217c 12208 }
6625d24e
DK
12209 else
12210 {
12211 // If this is not the first pass, addresses and file offsets have
12212 // been reset at this point, set them here.
12213 for (Stub_table_iterator sp = this->stub_tables_.begin();
12214 sp != this->stub_tables_.end();
12215 ++sp)
12216 {
12217 Arm_input_section<big_endian>* owner = (*sp)->owner();
12218 off_t off = align_address(owner->original_size(),
12219 (*sp)->addralign());
12220 (*sp)->set_address_and_file_offset(owner->address() + off,
12221 owner->offset() + off);
12222 }
12223 }
eb44217c 12224
44272192
DK
12225 // The Cortex-A8 stubs are sensitive to layout of code sections. At the
12226 // beginning of each relaxation pass, just blow away all the stubs.
12227 // Alternatively, we could selectively remove only the stubs and reloc
12228 // information for code sections that have moved since the last pass.
12229 // That would require more book-keeping.
a120bc7f
DK
12230 if (this->fix_cortex_a8_)
12231 {
12232 // Clear all Cortex-A8 reloc information.
12233 for (typename Cortex_a8_relocs_info::const_iterator p =
12234 this->cortex_a8_relocs_info_.begin();
12235 p != this->cortex_a8_relocs_info_.end();
12236 ++p)
12237 delete p->second;
12238 this->cortex_a8_relocs_info_.clear();
44272192
DK
12239
12240 // Remove all Cortex-A8 stubs.
12241 for (Stub_table_iterator sp = this->stub_tables_.begin();
12242 sp != this->stub_tables_.end();
12243 ++sp)
12244 (*sp)->remove_all_cortex_a8_stubs();
a120bc7f 12245 }
2e702c99 12246
44272192 12247 // Scan relocs for relocation stubs
eb44217c
DK
12248 for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
12249 op != input_objects->relobj_end();
12250 ++op)
12251 {
12252 Arm_relobj<big_endian>* arm_relobj =
12253 Arm_relobj<big_endian>::as_arm_relobj(*op);
f625ae50
DK
12254 // Lock the object so we can read from it. This is only called
12255 // single-threaded from Layout::finalize, so it is OK to lock.
12256 Task_lock_obj<Object> tl(task, arm_relobj);
2ea97941 12257 arm_relobj->scan_sections_for_stubs(this, symtab, layout);
eb44217c
DK
12258 }
12259
2fb7225c
DK
12260 // Check all stub tables to see if any of them have their data sizes
12261 // or addresses alignments changed. These are the only things that
12262 // matter.
eb44217c 12263 bool any_stub_table_changed = false;
8923b24c 12264 Unordered_set<const Output_section*> sections_needing_adjustment;
eb44217c
DK
12265 for (Stub_table_iterator sp = this->stub_tables_.begin();
12266 (sp != this->stub_tables_.end()) && !any_stub_table_changed;
12267 ++sp)
12268 {
2fb7225c 12269 if ((*sp)->update_data_size_and_addralign())
8923b24c
DK
12270 {
12271 // Update data size of stub table owner.
12272 Arm_input_section<big_endian>* owner = (*sp)->owner();
12273 uint64_t address = owner->address();
12274 off_t offset = owner->offset();
12275 owner->reset_address_and_file_offset();
12276 owner->set_address_and_file_offset(address, offset);
12277
12278 sections_needing_adjustment.insert(owner->output_section());
12279 any_stub_table_changed = true;
12280 }
12281 }
12282
12283 // Output_section_data::output_section() returns a const pointer but we
12284 // need to update output sections, so we record all output sections needing
12285 // update above and scan the sections here to find out what sections need
12286 // to be updated.
f625ae50 12287 for (Layout::Section_list::const_iterator p = layout->section_list().begin();
8923b24c
DK
12288 p != layout->section_list().end();
12289 ++p)
12290 {
12291 if (sections_needing_adjustment.find(*p)
12292 != sections_needing_adjustment.end())
12293 (*p)->set_section_offsets_need_adjustment();
eb44217c
DK
12294 }
12295
2b328d4e
DK
12296 // Stop relaxation if no EXIDX fix-up and no stub table change.
12297 bool continue_relaxation = done_exidx_fixup || any_stub_table_changed;
12298
2fb7225c 12299 // Finalize the stubs in the last relaxation pass.
2b328d4e 12300 if (!continue_relaxation)
e7eca48c
DK
12301 {
12302 for (Stub_table_iterator sp = this->stub_tables_.begin();
12303 (sp != this->stub_tables_.end()) && !any_stub_table_changed;
12304 ++sp)
12305 (*sp)->finalize_stubs();
12306
12307 // Update output local symbol counts of objects if necessary.
12308 for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
12309 op != input_objects->relobj_end();
12310 ++op)
12311 {
12312 Arm_relobj<big_endian>* arm_relobj =
12313 Arm_relobj<big_endian>::as_arm_relobj(*op);
12314
12315 // Update output local symbol counts. We need to discard local
12316 // symbols defined in parts of input sections that are discarded by
12317 // relaxation.
12318 if (arm_relobj->output_local_symbol_count_needs_update())
f625ae50
DK
12319 {
12320 // We need to lock the object's file to update it.
12321 Task_lock_obj<Object> tl(task, arm_relobj);
12322 arm_relobj->update_output_local_symbol_count();
12323 }
e7eca48c
DK
12324 }
12325 }
2fb7225c 12326
2b328d4e 12327 return continue_relaxation;
eb44217c
DK
12328}
12329
43d12afe
DK
12330// Relocate a stub.
12331
12332template<bool big_endian>
12333void
12334Target_arm<big_endian>::relocate_stub(
2fb7225c 12335 Stub* stub,
43d12afe
DK
12336 const Relocate_info<32, big_endian>* relinfo,
12337 Output_section* output_section,
12338 unsigned char* view,
12339 Arm_address address,
12340 section_size_type view_size)
12341{
12342 Relocate relocate;
2ea97941
ILT
12343 const Stub_template* stub_template = stub->stub_template();
12344 for (size_t i = 0; i < stub_template->reloc_count(); i++)
43d12afe 12345 {
2ea97941
ILT
12346 size_t reloc_insn_index = stub_template->reloc_insn_index(i);
12347 const Insn_template* insn = &stub_template->insns()[reloc_insn_index];
43d12afe
DK
12348
12349 unsigned int r_type = insn->r_type();
2ea97941 12350 section_size_type reloc_offset = stub_template->reloc_offset(i);
43d12afe
DK
12351 section_size_type reloc_size = insn->size();
12352 gold_assert(reloc_offset + reloc_size <= view_size);
12353
12354 // This is the address of the stub destination.
41263c05 12355 Arm_address target = stub->reloc_target(i) + insn->reloc_addend();
43d12afe
DK
12356 Symbol_value<32> symval;
12357 symval.set_output_value(target);
12358
12359 // Synthesize a fake reloc just in case. We don't have a symbol so
12360 // we use 0.
12361 unsigned char reloc_buffer[elfcpp::Elf_sizes<32>::rel_size];
12362 memset(reloc_buffer, 0, sizeof(reloc_buffer));
12363 elfcpp::Rel_write<32, big_endian> reloc_write(reloc_buffer);
12364 reloc_write.put_r_offset(reloc_offset);
12365 reloc_write.put_r_info(elfcpp::elf_r_info<32>(0, r_type));
43d12afe 12366
91a65d2f
AM
12367 relocate.relocate(relinfo, elfcpp::SHT_REL, this, output_section,
12368 this->fake_relnum_for_stubs, reloc_buffer,
43d12afe
DK
12369 NULL, &symval, view + reloc_offset,
12370 address + reloc_offset, reloc_size);
12371 }
12372}
12373
a0351a69
DK
12374// Determine whether an object attribute tag takes an integer, a
12375// string or both.
12376
12377template<bool big_endian>
12378int
12379Target_arm<big_endian>::do_attribute_arg_type(int tag) const
12380{
12381 if (tag == Object_attribute::Tag_compatibility)
12382 return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
12383 | Object_attribute::ATTR_TYPE_FLAG_STR_VAL);
12384 else if (tag == elfcpp::Tag_nodefaults)
12385 return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
12386 | Object_attribute::ATTR_TYPE_FLAG_NO_DEFAULT);
12387 else if (tag == elfcpp::Tag_CPU_raw_name || tag == elfcpp::Tag_CPU_name)
12388 return Object_attribute::ATTR_TYPE_FLAG_STR_VAL;
12389 else if (tag < 32)
12390 return Object_attribute::ATTR_TYPE_FLAG_INT_VAL;
12391 else
12392 return ((tag & 1) != 0
12393 ? Object_attribute::ATTR_TYPE_FLAG_STR_VAL
12394 : Object_attribute::ATTR_TYPE_FLAG_INT_VAL);
12395}
12396
12397// Reorder attributes.
12398//
12399// The ABI defines that Tag_conformance should be emitted first, and that
12400// Tag_nodefaults should be second (if either is defined). This sets those
12401// two positions, and bumps up the position of all the remaining tags to
12402// compensate.
12403
12404template<bool big_endian>
12405int
12406Target_arm<big_endian>::do_attributes_order(int num) const
12407{
12408 // Reorder the known object attributes in output. We want to move
12409 // Tag_conformance to position 4 and Tag_conformance to position 5
9b547ce6 12410 // and shift everything between 4 .. Tag_conformance - 1 to make room.
a0351a69
DK
12411 if (num == 4)
12412 return elfcpp::Tag_conformance;
12413 if (num == 5)
12414 return elfcpp::Tag_nodefaults;
12415 if ((num - 2) < elfcpp::Tag_nodefaults)
12416 return num - 2;
12417 if ((num - 1) < elfcpp::Tag_conformance)
12418 return num - 1;
12419 return num;
12420}
4a657b0d 12421
44272192
DK
12422// Scan a span of THUMB code for Cortex-A8 erratum.
12423
12424template<bool big_endian>
12425void
12426Target_arm<big_endian>::scan_span_for_cortex_a8_erratum(
12427 Arm_relobj<big_endian>* arm_relobj,
12428 unsigned int shndx,
12429 section_size_type span_start,
12430 section_size_type span_end,
12431 const unsigned char* view,
12432 Arm_address address)
12433{
12434 // Scan for 32-bit Thumb-2 branches which span two 4K regions, where:
12435 //
12436 // The opcode is BLX.W, BL.W, B.W, Bcc.W
12437 // The branch target is in the same 4KB region as the
12438 // first half of the branch.
12439 // The instruction before the branch is a 32-bit
12440 // length non-branch instruction.
12441 section_size_type i = span_start;
12442 bool last_was_32bit = false;
12443 bool last_was_branch = false;
12444 while (i < span_end)
12445 {
12446 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
12447 const Valtype* wv = reinterpret_cast<const Valtype*>(view + i);
12448 uint32_t insn = elfcpp::Swap<16, big_endian>::readval(wv);
12449 bool is_blx = false, is_b = false;
12450 bool is_bl = false, is_bcc = false;
12451
12452 bool insn_32bit = (insn & 0xe000) == 0xe000 && (insn & 0x1800) != 0x0000;
12453 if (insn_32bit)
12454 {
12455 // Load the rest of the insn (in manual-friendly order).
12456 insn = (insn << 16) | elfcpp::Swap<16, big_endian>::readval(wv + 1);
12457
12458 // Encoding T4: B<c>.W.
12459 is_b = (insn & 0xf800d000U) == 0xf0009000U;
12460 // Encoding T1: BL<c>.W.
2e702c99
RM
12461 is_bl = (insn & 0xf800d000U) == 0xf000d000U;
12462 // Encoding T2: BLX<c>.W.
12463 is_blx = (insn & 0xf800d000U) == 0xf000c000U;
44272192
DK
12464 // Encoding T3: B<c>.W (not permitted in IT block).
12465 is_bcc = ((insn & 0xf800d000U) == 0xf0008000U
12466 && (insn & 0x07f00000U) != 0x03800000U);
12467 }
12468
12469 bool is_32bit_branch = is_b || is_bl || is_blx || is_bcc;
2e702c99 12470
44272192
DK
12471 // If this instruction is a 32-bit THUMB branch that crosses a 4K
12472 // page boundary and it follows 32-bit non-branch instruction,
12473 // we need to work around.
12474 if (is_32bit_branch
12475 && ((address + i) & 0xfffU) == 0xffeU
12476 && last_was_32bit
12477 && !last_was_branch)
12478 {
12479 // Check to see if there is a relocation stub for this branch.
12480 bool force_target_arm = false;
12481 bool force_target_thumb = false;
12482 const Cortex_a8_reloc* cortex_a8_reloc = NULL;
12483 Cortex_a8_relocs_info::const_iterator p =
12484 this->cortex_a8_relocs_info_.find(address + i);
12485
12486 if (p != this->cortex_a8_relocs_info_.end())
12487 {
12488 cortex_a8_reloc = p->second;
12489 bool target_is_thumb = (cortex_a8_reloc->destination() & 1) != 0;
12490
12491 if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
12492 && !target_is_thumb)
12493 force_target_arm = true;
12494 else if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
12495 && target_is_thumb)
12496 force_target_thumb = true;
12497 }
12498
12499 off_t offset;
12500 Stub_type stub_type = arm_stub_none;
12501
12502 // Check if we have an offending branch instruction.
12503 uint16_t upper_insn = (insn >> 16) & 0xffffU;
12504 uint16_t lower_insn = insn & 0xffffU;
2c54b4f4 12505 typedef class Arm_relocate_functions<big_endian> RelocFuncs;
44272192
DK
12506
12507 if (cortex_a8_reloc != NULL
12508 && cortex_a8_reloc->reloc_stub() != NULL)
12509 // We've already made a stub for this instruction, e.g.
12510 // it's a long branch or a Thumb->ARM stub. Assume that
12511 // stub will suffice to work around the A8 erratum (see
12512 // setting of always_after_branch above).
12513 ;
12514 else if (is_bcc)
12515 {
12516 offset = RelocFuncs::thumb32_cond_branch_offset(upper_insn,
12517 lower_insn);
12518 stub_type = arm_stub_a8_veneer_b_cond;
12519 }
12520 else if (is_b || is_bl || is_blx)
12521 {
12522 offset = RelocFuncs::thumb32_branch_offset(upper_insn,
12523 lower_insn);
12524 if (is_blx)
2e702c99 12525 offset &= ~3;
44272192
DK
12526
12527 stub_type = (is_blx
12528 ? arm_stub_a8_veneer_blx
12529 : (is_bl
12530 ? arm_stub_a8_veneer_bl
12531 : arm_stub_a8_veneer_b));
12532 }
12533
12534 if (stub_type != arm_stub_none)
12535 {
12536 Arm_address pc_for_insn = address + i + 4;
12537
12538 // The original instruction is a BL, but the target is
12539 // an ARM instruction. If we were not making a stub,
12540 // the BL would have been converted to a BLX. Use the
12541 // BLX stub instead in that case.
cd6eab1c 12542 if (this->may_use_v5t_interworking() && force_target_arm
44272192
DK
12543 && stub_type == arm_stub_a8_veneer_bl)
12544 {
12545 stub_type = arm_stub_a8_veneer_blx;
12546 is_blx = true;
12547 is_bl = false;
12548 }
12549 // Conversely, if the original instruction was
12550 // BLX but the target is Thumb mode, use the BL stub.
12551 else if (force_target_thumb
12552 && stub_type == arm_stub_a8_veneer_blx)
12553 {
12554 stub_type = arm_stub_a8_veneer_bl;
12555 is_blx = false;
12556 is_bl = true;
12557 }
12558
12559 if (is_blx)
12560 pc_for_insn &= ~3;
12561
2e702c99 12562 // If we found a relocation, use the proper destination,
44272192
DK
12563 // not the offset in the (unrelocated) instruction.
12564 // Note this is always done if we switched the stub type above.
2e702c99
RM
12565 if (cortex_a8_reloc != NULL)
12566 offset = (off_t) (cortex_a8_reloc->destination() - pc_for_insn);
44272192 12567
2e702c99 12568 Arm_address target = (pc_for_insn + offset) | (is_blx ? 0 : 1);
44272192
DK
12569
12570 // Add a new stub if destination address in in the same page.
2e702c99
RM
12571 if (((address + i) & ~0xfffU) == (target & ~0xfffU))
12572 {
44272192
DK
12573 Cortex_a8_stub* stub =
12574 this->stub_factory_.make_cortex_a8_stub(stub_type,
12575 arm_relobj, shndx,
12576 address + i,
12577 target, insn);
12578 Stub_table<big_endian>* stub_table =
12579 arm_relobj->stub_table(shndx);
12580 gold_assert(stub_table != NULL);
12581 stub_table->add_cortex_a8_stub(address + i, stub);
2e702c99
RM
12582 }
12583 }
12584 }
44272192
DK
12585
12586 i += insn_32bit ? 4 : 2;
12587 last_was_32bit = insn_32bit;
12588 last_was_branch = is_32bit_branch;
12589 }
12590}
12591
41263c05
DK
12592// Apply the Cortex-A8 workaround.
12593
12594template<bool big_endian>
12595void
12596Target_arm<big_endian>::apply_cortex_a8_workaround(
12597 const Cortex_a8_stub* stub,
12598 Arm_address stub_address,
12599 unsigned char* insn_view,
12600 Arm_address insn_address)
12601{
12602 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
12603 Valtype* wv = reinterpret_cast<Valtype*>(insn_view);
12604 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
12605 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
12606 off_t branch_offset = stub_address - (insn_address + 4);
12607
2c54b4f4 12608 typedef class Arm_relocate_functions<big_endian> RelocFuncs;
41263c05
DK
12609 switch (stub->stub_template()->type())
12610 {
12611 case arm_stub_a8_veneer_b_cond:
9b547ce6 12612 // For a conditional branch, we re-write it to be an unconditional
0439c796
DK
12613 // branch to the stub. We use the THUMB-2 encoding here.
12614 upper_insn = 0xf000U;
12615 lower_insn = 0xb800U;
12616 // Fall through
41263c05
DK
12617 case arm_stub_a8_veneer_b:
12618 case arm_stub_a8_veneer_bl:
12619 case arm_stub_a8_veneer_blx:
12620 if ((lower_insn & 0x5000U) == 0x4000U)
12621 // For a BLX instruction, make sure that the relocation is
12622 // rounded up to a word boundary. This follows the semantics of
12623 // the instruction which specifies that bit 1 of the target
12624 // address will come from bit 1 of the base address.
12625 branch_offset = (branch_offset + 2) & ~3;
12626
12627 // Put BRANCH_OFFSET back into the insn.
bef2b434 12628 gold_assert(!Bits<25>::has_overflow32(branch_offset));
41263c05
DK
12629 upper_insn = RelocFuncs::thumb32_branch_upper(upper_insn, branch_offset);
12630 lower_insn = RelocFuncs::thumb32_branch_lower(lower_insn, branch_offset);
12631 break;
12632
12633 default:
12634 gold_unreachable();
12635 }
12636
12637 // Put the relocated value back in the object file:
12638 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
12639 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
12640}
12641
2e702c99
RM
12642// Target selector for ARM. Note this is never instantiated directly.
12643// It's only used in Target_selector_arm_nacl, below.
12644
4a657b0d
DK
12645template<bool big_endian>
12646class Target_selector_arm : public Target_selector
12647{
12648 public:
12649 Target_selector_arm()
12650 : Target_selector(elfcpp::EM_ARM, 32, big_endian,
03ef7571
ILT
12651 (big_endian ? "elf32-bigarm" : "elf32-littlearm"),
12652 (big_endian ? "armelfb" : "armelf"))
4a657b0d
DK
12653 { }
12654
12655 Target*
12656 do_instantiate_target()
12657 { return new Target_arm<big_endian>(); }
12658};
12659
2b328d4e
DK
12660// Fix .ARM.exidx section coverage.
12661
12662template<bool big_endian>
12663void
12664Target_arm<big_endian>::fix_exidx_coverage(
12665 Layout* layout,
131687b4 12666 const Input_objects* input_objects,
2b328d4e 12667 Arm_output_section<big_endian>* exidx_section,
f625ae50
DK
12668 Symbol_table* symtab,
12669 const Task* task)
2b328d4e
DK
12670{
12671 // We need to look at all the input sections in output in ascending
12672 // order of of output address. We do that by building a sorted list
12673 // of output sections by addresses. Then we looks at the output sections
12674 // in order. The input sections in an output section are already sorted
12675 // by addresses within the output section.
12676
12677 typedef std::set<Output_section*, output_section_address_less_than>
12678 Sorted_output_section_list;
12679 Sorted_output_section_list sorted_output_sections;
131687b4
DK
12680
12681 // Find out all the output sections of input sections pointed by
12682 // EXIDX input sections.
12683 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
12684 p != input_objects->relobj_end();
2b328d4e
DK
12685 ++p)
12686 {
131687b4
DK
12687 Arm_relobj<big_endian>* arm_relobj =
12688 Arm_relobj<big_endian>::as_arm_relobj(*p);
12689 std::vector<unsigned int> shndx_list;
12690 arm_relobj->get_exidx_shndx_list(&shndx_list);
12691 for (size_t i = 0; i < shndx_list.size(); ++i)
12692 {
12693 const Arm_exidx_input_section* exidx_input_section =
12694 arm_relobj->exidx_input_section_by_shndx(shndx_list[i]);
12695 gold_assert(exidx_input_section != NULL);
12696 if (!exidx_input_section->has_errors())
12697 {
12698 unsigned int text_shndx = exidx_input_section->link();
ca09d69a 12699 Output_section* os = arm_relobj->output_section(text_shndx);
131687b4
DK
12700 if (os != NULL && (os->flags() & elfcpp::SHF_ALLOC) != 0)
12701 sorted_output_sections.insert(os);
12702 }
12703 }
2b328d4e
DK
12704 }
12705
12706 // Go over the output sections in ascending order of output addresses.
12707 typedef typename Arm_output_section<big_endian>::Text_section_list
12708 Text_section_list;
12709 Text_section_list sorted_text_sections;
f625ae50 12710 for (typename Sorted_output_section_list::iterator p =
2b328d4e
DK
12711 sorted_output_sections.begin();
12712 p != sorted_output_sections.end();
12713 ++p)
12714 {
12715 Arm_output_section<big_endian>* arm_output_section =
12716 Arm_output_section<big_endian>::as_arm_output_section(*p);
12717 arm_output_section->append_text_sections_to_list(&sorted_text_sections);
2e702c99 12718 }
2b328d4e 12719
85fdf906 12720 exidx_section->fix_exidx_coverage(layout, sorted_text_sections, symtab,
f625ae50 12721 merge_exidx_entries(), task);
2b328d4e
DK
12722}
12723
647f1574
DK
12724template<bool big_endian>
12725void
12726Target_arm<big_endian>::do_define_standard_symbols(
12727 Symbol_table* symtab,
12728 Layout* layout)
12729{
12730 // Handle the .ARM.exidx section.
12731 Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
12732
12733 if (exidx_section != NULL)
12734 {
12735 // Create __exidx_start and __exidx_end symbols.
12736 symtab->define_in_output_data("__exidx_start",
12737 NULL, // version
12738 Symbol_table::PREDEFINED,
12739 exidx_section,
12740 0, // value
12741 0, // symsize
12742 elfcpp::STT_NOTYPE,
12743 elfcpp::STB_GLOBAL,
12744 elfcpp::STV_HIDDEN,
12745 0, // nonvis
12746 false, // offset_is_from_end
12747 true); // only_if_ref
12748
12749 symtab->define_in_output_data("__exidx_end",
12750 NULL, // version
12751 Symbol_table::PREDEFINED,
12752 exidx_section,
2e702c99 12753 0, // value
647f1574
DK
12754 0, // symsize
12755 elfcpp::STT_NOTYPE,
12756 elfcpp::STB_GLOBAL,
12757 elfcpp::STV_HIDDEN,
12758 0, // nonvis
12759 true, // offset_is_from_end
12760 true); // only_if_ref
12761 }
12762 else
12763 {
12764 // Define __exidx_start and __exidx_end even when .ARM.exidx
12765 // section is missing to match ld's behaviour.
12766 symtab->define_as_constant("__exidx_start", NULL,
2e702c99
RM
12767 Symbol_table::PREDEFINED,
12768 0, 0, elfcpp::STT_OBJECT,
12769 elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
12770 true, false);
647f1574 12771 symtab->define_as_constant("__exidx_end", NULL,
2e702c99
RM
12772 Symbol_table::PREDEFINED,
12773 0, 0, elfcpp::STT_OBJECT,
12774 elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
12775 true, false);
647f1574
DK
12776 }
12777}
12778
2e702c99
RM
12779// NaCl variant. It uses different PLT contents.
12780
12781template<bool big_endian>
12782class Output_data_plt_arm_nacl;
12783
12784template<bool big_endian>
12785class Target_arm_nacl : public Target_arm<big_endian>
12786{
12787 public:
12788 Target_arm_nacl()
12789 : Target_arm<big_endian>(&arm_nacl_info)
12790 { }
12791
12792 protected:
12793 virtual Output_data_plt_arm<big_endian>*
fa89cc82
HS
12794 do_make_data_plt(
12795 Layout* layout,
12796 Arm_output_data_got<big_endian>* got,
12797 Output_data_space* got_plt,
12798 Output_data_space* got_irelative)
12799 { return new Output_data_plt_arm_nacl<big_endian>(
12800 layout, got, got_plt, got_irelative); }
2e702c99
RM
12801
12802 private:
12803 static const Target::Target_info arm_nacl_info;
12804};
12805
12806template<bool big_endian>
12807const Target::Target_info Target_arm_nacl<big_endian>::arm_nacl_info =
12808{
12809 32, // size
12810 big_endian, // is_big_endian
12811 elfcpp::EM_ARM, // machine_code
12812 false, // has_make_symbol
12813 false, // has_resolve
12814 false, // has_code_fill
12815 true, // is_default_stack_executable
12816 false, // can_icf_inline_merge_sections
12817 '\0', // wrap_char
12818 "/lib/ld-nacl-arm.so.1", // dynamic_linker
12819 0x20000, // default_text_segment_address
12820 0x10000, // abi_pagesize (overridable by -z max-page-size)
12821 0x10000, // common_pagesize (overridable by -z common-page-size)
12822 true, // isolate_execinstr
12823 0x10000000, // rosegment_gap
12824 elfcpp::SHN_UNDEF, // small_common_shndx
12825 elfcpp::SHN_UNDEF, // large_common_shndx
12826 0, // small_common_section_flags
12827 0, // large_common_section_flags
12828 ".ARM.attributes", // attributes_section
a67858e0 12829 "aeabi", // attributes_vendor
8d9743bd
MK
12830 "_start", // entry_symbol_name
12831 32, // hash_entry_size
2e702c99
RM
12832};
12833
12834template<bool big_endian>
12835class Output_data_plt_arm_nacl : public Output_data_plt_arm<big_endian>
12836{
12837 public:
fa89cc82
HS
12838 Output_data_plt_arm_nacl(
12839 Layout* layout,
12840 Arm_output_data_got<big_endian>* got,
12841 Output_data_space* got_plt,
12842 Output_data_space* got_irelative)
12843 : Output_data_plt_arm<big_endian>(layout, 16, got, got_plt, got_irelative)
2e702c99
RM
12844 { }
12845
12846 protected:
12847 // Return the offset of the first non-reserved PLT entry.
12848 virtual unsigned int
12849 do_first_plt_entry_offset() const
12850 { return sizeof(first_plt_entry); }
12851
12852 // Return the size of a PLT entry.
12853 virtual unsigned int
12854 do_get_plt_entry_size() const
12855 { return sizeof(plt_entry); }
12856
12857 virtual void
12858 do_fill_first_plt_entry(unsigned char* pov,
12859 Arm_address got_address,
12860 Arm_address plt_address);
12861
12862 virtual void
12863 do_fill_plt_entry(unsigned char* pov,
12864 Arm_address got_address,
12865 Arm_address plt_address,
12866 unsigned int got_offset,
12867 unsigned int plt_offset);
12868
12869 private:
12870 inline uint32_t arm_movw_immediate(uint32_t value)
12871 {
12872 return (value & 0x00000fff) | ((value & 0x0000f000) << 4);
12873 }
12874
12875 inline uint32_t arm_movt_immediate(uint32_t value)
12876 {
12877 return ((value & 0x0fff0000) >> 16) | ((value & 0xf0000000) >> 12);
12878 }
12879
12880 // Template for the first PLT entry.
12881 static const uint32_t first_plt_entry[16];
12882
12883 // Template for subsequent PLT entries.
12884 static const uint32_t plt_entry[4];
12885};
12886
12887// The first entry in the PLT.
12888template<bool big_endian>
12889const uint32_t Output_data_plt_arm_nacl<big_endian>::first_plt_entry[16] =
12890{
12891 // First bundle:
12892 0xe300c000, // movw ip, #:lower16:&GOT[2]-.+8
12893 0xe340c000, // movt ip, #:upper16:&GOT[2]-.+8
12894 0xe08cc00f, // add ip, ip, pc
12895 0xe52dc008, // str ip, [sp, #-8]!
12896 // Second bundle:
edccdf7c 12897 0xe3ccc103, // bic ip, ip, #0xc0000000
2e702c99
RM
12898 0xe59cc000, // ldr ip, [ip]
12899 0xe3ccc13f, // bic ip, ip, #0xc000000f
12900 0xe12fff1c, // bx ip
12901 // Third bundle:
12902 0xe320f000, // nop
12903 0xe320f000, // nop
12904 0xe320f000, // nop
12905 // .Lplt_tail:
12906 0xe50dc004, // str ip, [sp, #-4]
12907 // Fourth bundle:
edccdf7c 12908 0xe3ccc103, // bic ip, ip, #0xc0000000
2e702c99
RM
12909 0xe59cc000, // ldr ip, [ip]
12910 0xe3ccc13f, // bic ip, ip, #0xc000000f
12911 0xe12fff1c, // bx ip
12912};
12913
12914template<bool big_endian>
12915void
12916Output_data_plt_arm_nacl<big_endian>::do_fill_first_plt_entry(
12917 unsigned char* pov,
12918 Arm_address got_address,
12919 Arm_address plt_address)
12920{
12921 // Write first PLT entry. All but first two words are constants.
12922 const size_t num_first_plt_words = (sizeof(first_plt_entry)
12923 / sizeof(first_plt_entry[0]));
12924
12925 int32_t got_displacement = got_address + 8 - (plt_address + 16);
12926
12927 elfcpp::Swap<32, big_endian>::writeval
12928 (pov + 0, first_plt_entry[0] | arm_movw_immediate (got_displacement));
12929 elfcpp::Swap<32, big_endian>::writeval
12930 (pov + 4, first_plt_entry[1] | arm_movt_immediate (got_displacement));
12931
12932 for (size_t i = 2; i < num_first_plt_words; ++i)
12933 elfcpp::Swap<32, big_endian>::writeval(pov + i * 4, first_plt_entry[i]);
12934}
12935
12936// Subsequent entries in the PLT.
12937
12938template<bool big_endian>
12939const uint32_t Output_data_plt_arm_nacl<big_endian>::plt_entry[4] =
12940{
12941 0xe300c000, // movw ip, #:lower16:&GOT[n]-.+8
12942 0xe340c000, // movt ip, #:upper16:&GOT[n]-.+8
12943 0xe08cc00f, // add ip, ip, pc
12944 0xea000000, // b .Lplt_tail
12945};
12946
12947template<bool big_endian>
12948void
12949Output_data_plt_arm_nacl<big_endian>::do_fill_plt_entry(
12950 unsigned char* pov,
12951 Arm_address got_address,
12952 Arm_address plt_address,
12953 unsigned int got_offset,
12954 unsigned int plt_offset)
12955{
12956 // Calculate the displacement between the PLT slot and the
12957 // common tail that's part of the special initial PLT slot.
12958 int32_t tail_displacement = (plt_address + (11 * sizeof(uint32_t))
12959 - (plt_address + plt_offset
12960 + sizeof(plt_entry) + sizeof(uint32_t)));
12961 gold_assert((tail_displacement & 3) == 0);
12962 tail_displacement >>= 2;
12963
12964 gold_assert ((tail_displacement & 0xff000000) == 0
12965 || (-tail_displacement & 0xff000000) == 0);
12966
12967 // Calculate the displacement between the PLT slot and the entry
12968 // in the GOT. The offset accounts for the value produced by
12969 // adding to pc in the penultimate instruction of the PLT stub.
12970 const int32_t got_displacement = (got_address + got_offset
12971 - (plt_address + sizeof(plt_entry)));
12972
12973 elfcpp::Swap<32, big_endian>::writeval
12974 (pov + 0, plt_entry[0] | arm_movw_immediate (got_displacement));
12975 elfcpp::Swap<32, big_endian>::writeval
12976 (pov + 4, plt_entry[1] | arm_movt_immediate (got_displacement));
12977 elfcpp::Swap<32, big_endian>::writeval
12978 (pov + 8, plt_entry[2]);
12979 elfcpp::Swap<32, big_endian>::writeval
12980 (pov + 12, plt_entry[3] | (tail_displacement & 0x00ffffff));
12981}
12982
12983// Target selectors.
12984
12985template<bool big_endian>
12986class Target_selector_arm_nacl
12987 : public Target_selector_nacl<Target_selector_arm<big_endian>,
12988 Target_arm_nacl<big_endian> >
12989{
12990 public:
12991 Target_selector_arm_nacl()
12992 : Target_selector_nacl<Target_selector_arm<big_endian>,
12993 Target_arm_nacl<big_endian> >(
12994 "arm",
12995 big_endian ? "elf32-bigarm-nacl" : "elf32-littlearm-nacl",
12996 big_endian ? "armelfb_nacl" : "armelf_nacl")
12997 { }
12998};
12999
13000Target_selector_arm_nacl<false> target_selector_arm;
13001Target_selector_arm_nacl<true> target_selector_armbe;
4a657b0d
DK
13002
13003} // End anonymous namespace.
This page took 1.041731 seconds and 4 git commands to generate.