* arm.cc (Target_arm::do_finalize_sections): Create attribute
[binutils.git] / gold / arm.cc
blobb8141e0a7c10eddb6f459f3a4e835ed1846b4443
1 // arm.cc -- arm target support for gold.
3 // Copyright 2009, 2010 Free Software Foundation, Inc.
4 // Written by Doug Kwan <dougkwan@google.com> based on the i386 code
5 // by Ian Lance Taylor <iant@google.com>.
6 // This file also contains borrowed and adapted code from
7 // bfd/elf32-arm.c.
9 // This file is part of gold.
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.
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.
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.
26 #include "gold.h"
28 #include <cstring>
29 #include <limits>
30 #include <cstdio>
31 #include <string>
32 #include <algorithm>
33 #include <map>
34 #include <utility>
35 #include <set>
37 #include "elfcpp.h"
38 #include "parameters.h"
39 #include "reloc.h"
40 #include "arm.h"
41 #include "object.h"
42 #include "symtab.h"
43 #include "layout.h"
44 #include "output.h"
45 #include "copy-relocs.h"
46 #include "target.h"
47 #include "target-reloc.h"
48 #include "target-select.h"
49 #include "tls.h"
50 #include "defstd.h"
51 #include "gc.h"
52 #include "attributes.h"
53 #include "arm-reloc-property.h"
55 namespace
58 using namespace gold;
60 template<bool big_endian>
61 class Output_data_plt_arm;
63 template<bool big_endian>
64 class Stub_table;
66 template<bool big_endian>
67 class Arm_input_section;
69 class Arm_exidx_cantunwind;
71 class Arm_exidx_merged_section;
73 class Arm_exidx_fixup;
75 template<bool big_endian>
76 class Arm_output_section;
78 class Arm_exidx_input_section;
80 template<bool big_endian>
81 class Arm_relobj;
83 template<bool big_endian>
84 class Arm_relocate_functions;
86 template<bool big_endian>
87 class Target_arm;
89 // For convenience.
90 typedef elfcpp::Elf_types<32>::Elf_Addr Arm_address;
92 // Maximum branch offsets for ARM, THUMB and THUMB2.
93 const int32_t ARM_MAX_FWD_BRANCH_OFFSET = ((((1 << 23) - 1) << 2) + 8);
94 const int32_t ARM_MAX_BWD_BRANCH_OFFSET = ((-((1 << 23) << 2)) + 8);
95 const int32_t THM_MAX_FWD_BRANCH_OFFSET = ((1 << 22) -2 + 4);
96 const int32_t THM_MAX_BWD_BRANCH_OFFSET = (-(1 << 22) + 4);
97 const int32_t THM2_MAX_FWD_BRANCH_OFFSET = (((1 << 24) - 2) + 4);
98 const int32_t THM2_MAX_BWD_BRANCH_OFFSET = (-(1 << 24) + 4);
100 // The arm target class.
102 // This is a very simple port of gold for ARM-EABI. It is intended for
103 // supporting Android only for the time being.
105 // TODOs:
106 // - Implement all static relocation types documented in arm-reloc.def.
107 // - Make PLTs more flexible for different architecture features like
108 // Thumb-2 and BE8.
109 // There are probably a lot more.
111 // Ideally we would like to avoid using global variables but this is used
112 // very in many places and sometimes in loops. If we use a function
113 // returning a static instance of Arm_reloc_property_table, it will very
114 // slow in an threaded environment since the static instance needs to be
115 // locked. The pointer is below initialized in the
116 // Target::do_select_as_default_target() hook so that we do not spend time
117 // building the table if we are not linking ARM objects.
119 // An alternative is to to process the information in arm-reloc.def in
120 // compilation time and generate a representation of it in PODs only. That
121 // way we can avoid initialization when the linker starts.
123 Arm_reloc_property_table *arm_reloc_property_table = NULL;
125 // Instruction template class. This class is similar to the insn_sequence
126 // struct in bfd/elf32-arm.c.
128 class Insn_template
130 public:
131 // Types of instruction templates.
132 enum Type
134 THUMB16_TYPE = 1,
135 // THUMB16_SPECIAL_TYPE is used by sub-classes of Stub for instruction
136 // templates with class-specific semantics. Currently this is used
137 // only by the Cortex_a8_stub class for handling condition codes in
138 // conditional branches.
139 THUMB16_SPECIAL_TYPE,
140 THUMB32_TYPE,
141 ARM_TYPE,
142 DATA_TYPE
145 // Factory methods to create instruction templates in different formats.
147 static const Insn_template
148 thumb16_insn(uint32_t data)
149 { return Insn_template(data, THUMB16_TYPE, elfcpp::R_ARM_NONE, 0); }
151 // A Thumb conditional branch, in which the proper condition is inserted
152 // when we build the stub.
153 static const Insn_template
154 thumb16_bcond_insn(uint32_t data)
155 { return Insn_template(data, THUMB16_SPECIAL_TYPE, elfcpp::R_ARM_NONE, 1); }
157 static const Insn_template
158 thumb32_insn(uint32_t data)
159 { return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_NONE, 0); }
161 static const Insn_template
162 thumb32_b_insn(uint32_t data, int reloc_addend)
164 return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_THM_JUMP24,
165 reloc_addend);
168 static const Insn_template
169 arm_insn(uint32_t data)
170 { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_NONE, 0); }
172 static const Insn_template
173 arm_rel_insn(unsigned data, int reloc_addend)
174 { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_JUMP24, reloc_addend); }
176 static const Insn_template
177 data_word(unsigned data, unsigned int r_type, int reloc_addend)
178 { return Insn_template(data, DATA_TYPE, r_type, reloc_addend); }
180 // Accessors. This class is used for read-only objects so no modifiers
181 // are provided.
183 uint32_t
184 data() const
185 { return this->data_; }
187 // Return the instruction sequence type of this.
188 Type
189 type() const
190 { return this->type_; }
192 // Return the ARM relocation type of this.
193 unsigned int
194 r_type() const
195 { return this->r_type_; }
197 int32_t
198 reloc_addend() const
199 { return this->reloc_addend_; }
201 // Return size of instruction template in bytes.
202 size_t
203 size() const;
205 // Return byte-alignment of instruction template.
206 unsigned
207 alignment() const;
209 private:
210 // We make the constructor private to ensure that only the factory
211 // methods are used.
212 inline
213 Insn_template(unsigned data, Type type, unsigned int r_type, int reloc_addend)
214 : data_(data), type_(type), r_type_(r_type), reloc_addend_(reloc_addend)
217 // Instruction specific data. This is used to store information like
218 // some of the instruction bits.
219 uint32_t data_;
220 // Instruction template type.
221 Type type_;
222 // Relocation type if there is a relocation or R_ARM_NONE otherwise.
223 unsigned int r_type_;
224 // Relocation addend.
225 int32_t reloc_addend_;
228 // Macro for generating code to stub types. One entry per long/short
229 // branch stub
231 #define DEF_STUBS \
232 DEF_STUB(long_branch_any_any) \
233 DEF_STUB(long_branch_v4t_arm_thumb) \
234 DEF_STUB(long_branch_thumb_only) \
235 DEF_STUB(long_branch_v4t_thumb_thumb) \
236 DEF_STUB(long_branch_v4t_thumb_arm) \
237 DEF_STUB(short_branch_v4t_thumb_arm) \
238 DEF_STUB(long_branch_any_arm_pic) \
239 DEF_STUB(long_branch_any_thumb_pic) \
240 DEF_STUB(long_branch_v4t_thumb_thumb_pic) \
241 DEF_STUB(long_branch_v4t_arm_thumb_pic) \
242 DEF_STUB(long_branch_v4t_thumb_arm_pic) \
243 DEF_STUB(long_branch_thumb_only_pic) \
244 DEF_STUB(a8_veneer_b_cond) \
245 DEF_STUB(a8_veneer_b) \
246 DEF_STUB(a8_veneer_bl) \
247 DEF_STUB(a8_veneer_blx) \
248 DEF_STUB(v4_veneer_bx)
250 // Stub types.
252 #define DEF_STUB(x) arm_stub_##x,
253 typedef enum
255 arm_stub_none,
256 DEF_STUBS
258 // First reloc stub type.
259 arm_stub_reloc_first = arm_stub_long_branch_any_any,
260 // Last reloc stub type.
261 arm_stub_reloc_last = arm_stub_long_branch_thumb_only_pic,
263 // First Cortex-A8 stub type.
264 arm_stub_cortex_a8_first = arm_stub_a8_veneer_b_cond,
265 // Last Cortex-A8 stub type.
266 arm_stub_cortex_a8_last = arm_stub_a8_veneer_blx,
268 // Last stub type.
269 arm_stub_type_last = arm_stub_v4_veneer_bx
270 } Stub_type;
271 #undef DEF_STUB
273 // Stub template class. Templates are meant to be read-only objects.
274 // A stub template for a stub type contains all read-only attributes
275 // common to all stubs of the same type.
277 class Stub_template
279 public:
280 Stub_template(Stub_type, const Insn_template*, size_t);
282 ~Stub_template()
285 // Return stub type.
286 Stub_type
287 type() const
288 { return this->type_; }
290 // Return an array of instruction templates.
291 const Insn_template*
292 insns() const
293 { return this->insns_; }
295 // Return size of template in number of instructions.
296 size_t
297 insn_count() const
298 { return this->insn_count_; }
300 // Return size of template in bytes.
301 size_t
302 size() const
303 { return this->size_; }
305 // Return alignment of the stub template.
306 unsigned
307 alignment() const
308 { return this->alignment_; }
310 // Return whether entry point is in thumb mode.
311 bool
312 entry_in_thumb_mode() const
313 { return this->entry_in_thumb_mode_; }
315 // Return number of relocations in this template.
316 size_t
317 reloc_count() const
318 { return this->relocs_.size(); }
320 // Return index of the I-th instruction with relocation.
321 size_t
322 reloc_insn_index(size_t i) const
324 gold_assert(i < this->relocs_.size());
325 return this->relocs_[i].first;
328 // Return the offset of the I-th instruction with relocation from the
329 // beginning of the stub.
330 section_size_type
331 reloc_offset(size_t i) const
333 gold_assert(i < this->relocs_.size());
334 return this->relocs_[i].second;
337 private:
338 // This contains information about an instruction template with a relocation
339 // and its offset from start of stub.
340 typedef std::pair<size_t, section_size_type> Reloc;
342 // A Stub_template may not be copied. We want to share templates as much
343 // as possible.
344 Stub_template(const Stub_template&);
345 Stub_template& operator=(const Stub_template&);
347 // Stub type.
348 Stub_type type_;
349 // Points to an array of Insn_templates.
350 const Insn_template* insns_;
351 // Number of Insn_templates in insns_[].
352 size_t insn_count_;
353 // Size of templated instructions in bytes.
354 size_t size_;
355 // Alignment of templated instructions.
356 unsigned alignment_;
357 // Flag to indicate if entry is in thumb mode.
358 bool entry_in_thumb_mode_;
359 // A table of reloc instruction indices and offsets. We can find these by
360 // looking at the instruction templates but we pre-compute and then stash
361 // them here for speed.
362 std::vector<Reloc> relocs_;
366 // A class for code stubs. This is a base class for different type of
367 // stubs used in the ARM target.
370 class Stub
372 private:
373 static const section_offset_type invalid_offset =
374 static_cast<section_offset_type>(-1);
376 public:
377 Stub(const Stub_template* stub_template)
378 : stub_template_(stub_template), offset_(invalid_offset)
381 virtual
382 ~Stub()
385 // Return the stub template.
386 const Stub_template*
387 stub_template() const
388 { return this->stub_template_; }
390 // Return offset of code stub from beginning of its containing stub table.
391 section_offset_type
392 offset() const
394 gold_assert(this->offset_ != invalid_offset);
395 return this->offset_;
398 // Set offset of code stub from beginning of its containing stub table.
399 void
400 set_offset(section_offset_type offset)
401 { this->offset_ = offset; }
403 // Return the relocation target address of the i-th relocation in the
404 // stub. This must be defined in a child class.
405 Arm_address
406 reloc_target(size_t i)
407 { return this->do_reloc_target(i); }
409 // Write a stub at output VIEW. BIG_ENDIAN select how a stub is written.
410 void
411 write(unsigned char* view, section_size_type view_size, bool big_endian)
412 { this->do_write(view, view_size, big_endian); }
414 // Return the instruction for THUMB16_SPECIAL_TYPE instruction template
415 // for the i-th instruction.
416 uint16_t
417 thumb16_special(size_t i)
418 { return this->do_thumb16_special(i); }
420 protected:
421 // This must be defined in the child class.
422 virtual Arm_address
423 do_reloc_target(size_t) = 0;
425 // This may be overridden in the child class.
426 virtual void
427 do_write(unsigned char* view, section_size_type view_size, bool big_endian)
429 if (big_endian)
430 this->do_fixed_endian_write<true>(view, view_size);
431 else
432 this->do_fixed_endian_write<false>(view, view_size);
435 // This must be overridden if a child class uses the THUMB16_SPECIAL_TYPE
436 // instruction template.
437 virtual uint16_t
438 do_thumb16_special(size_t)
439 { gold_unreachable(); }
441 private:
442 // A template to implement do_write.
443 template<bool big_endian>
444 void inline
445 do_fixed_endian_write(unsigned char*, section_size_type);
447 // Its template.
448 const Stub_template* stub_template_;
449 // Offset within the section of containing this stub.
450 section_offset_type offset_;
453 // Reloc stub class. These are stubs we use to fix up relocation because
454 // of limited branch ranges.
456 class Reloc_stub : public Stub
458 public:
459 static const unsigned int invalid_index = static_cast<unsigned int>(-1);
460 // We assume we never jump to this address.
461 static const Arm_address invalid_address = static_cast<Arm_address>(-1);
463 // Return destination address.
464 Arm_address
465 destination_address() const
467 gold_assert(this->destination_address_ != this->invalid_address);
468 return this->destination_address_;
471 // Set destination address.
472 void
473 set_destination_address(Arm_address address)
475 gold_assert(address != this->invalid_address);
476 this->destination_address_ = address;
479 // Reset destination address.
480 void
481 reset_destination_address()
482 { this->destination_address_ = this->invalid_address; }
484 // Determine stub type for a branch of a relocation of R_TYPE going
485 // from BRANCH_ADDRESS to BRANCH_TARGET. If TARGET_IS_THUMB is set,
486 // the branch target is a thumb instruction. TARGET is used for look
487 // up ARM-specific linker settings.
488 static Stub_type
489 stub_type_for_reloc(unsigned int r_type, Arm_address branch_address,
490 Arm_address branch_target, bool target_is_thumb);
492 // Reloc_stub key. A key is logically a triplet of a stub type, a symbol
493 // and an addend. Since we treat global and local symbol differently, we
494 // use a Symbol object for a global symbol and a object-index pair for
495 // a local symbol.
496 class Key
498 public:
499 // If SYMBOL is not null, this is a global symbol, we ignore RELOBJ and
500 // R_SYM. Otherwise, this is a local symbol and RELOBJ must non-NULL
501 // and R_SYM must not be invalid_index.
502 Key(Stub_type stub_type, const Symbol* symbol, const Relobj* relobj,
503 unsigned int r_sym, int32_t addend)
504 : stub_type_(stub_type), addend_(addend)
506 if (symbol != NULL)
508 this->r_sym_ = Reloc_stub::invalid_index;
509 this->u_.symbol = symbol;
511 else
513 gold_assert(relobj != NULL && r_sym != invalid_index);
514 this->r_sym_ = r_sym;
515 this->u_.relobj = relobj;
519 ~Key()
522 // Accessors: Keys are meant to be read-only object so no modifiers are
523 // provided.
525 // Return stub type.
526 Stub_type
527 stub_type() const
528 { return this->stub_type_; }
530 // Return the local symbol index or invalid_index.
531 unsigned int
532 r_sym() const
533 { return this->r_sym_; }
535 // Return the symbol if there is one.
536 const Symbol*
537 symbol() const
538 { return this->r_sym_ == invalid_index ? this->u_.symbol : NULL; }
540 // Return the relobj if there is one.
541 const Relobj*
542 relobj() const
543 { return this->r_sym_ != invalid_index ? this->u_.relobj : NULL; }
545 // Whether this equals to another key k.
546 bool
547 eq(const Key& k) const
549 return ((this->stub_type_ == k.stub_type_)
550 && (this->r_sym_ == k.r_sym_)
551 && ((this->r_sym_ != Reloc_stub::invalid_index)
552 ? (this->u_.relobj == k.u_.relobj)
553 : (this->u_.symbol == k.u_.symbol))
554 && (this->addend_ == k.addend_));
557 // Return a hash value.
558 size_t
559 hash_value() const
561 return (this->stub_type_
562 ^ this->r_sym_
563 ^ gold::string_hash<char>(
564 (this->r_sym_ != Reloc_stub::invalid_index)
565 ? this->u_.relobj->name().c_str()
566 : this->u_.symbol->name())
567 ^ this->addend_);
570 // Functors for STL associative containers.
571 struct hash
573 size_t
574 operator()(const Key& k) const
575 { return k.hash_value(); }
578 struct equal_to
580 bool
581 operator()(const Key& k1, const Key& k2) const
582 { return k1.eq(k2); }
585 // Name of key. This is mainly for debugging.
586 std::string
587 name() const;
589 private:
590 // Stub type.
591 Stub_type stub_type_;
592 // If this is a local symbol, this is the index in the defining object.
593 // Otherwise, it is invalid_index for a global symbol.
594 unsigned int r_sym_;
595 // If r_sym_ is invalid index. This points to a global symbol.
596 // Otherwise, this points a relobj. We used the unsized and target
597 // independent Symbol and Relobj classes instead of Sized_symbol<32> and
598 // Arm_relobj. This is done to avoid making the stub class a template
599 // as most of the stub machinery is endianity-neutral. However, it
600 // may require a bit of casting done by users of this class.
601 union
603 const Symbol* symbol;
604 const Relobj* relobj;
605 } u_;
606 // Addend associated with a reloc.
607 int32_t addend_;
610 protected:
611 // Reloc_stubs are created via a stub factory. So these are protected.
612 Reloc_stub(const Stub_template* stub_template)
613 : Stub(stub_template), destination_address_(invalid_address)
616 ~Reloc_stub()
619 friend class Stub_factory;
621 // Return the relocation target address of the i-th relocation in the
622 // stub.
623 Arm_address
624 do_reloc_target(size_t i)
626 // All reloc stub have only one relocation.
627 gold_assert(i == 0);
628 return this->destination_address_;
631 private:
632 // Address of destination.
633 Arm_address destination_address_;
636 // Cortex-A8 stub class. We need a Cortex-A8 stub to redirect any 32-bit
637 // THUMB branch that meets the following conditions:
639 // 1. The branch straddles across a page boundary. i.e. lower 12-bit of
640 // branch address is 0xffe.
641 // 2. The branch target address is in the same page as the first word of the
642 // branch.
643 // 3. The branch follows a 32-bit instruction which is not a branch.
645 // To do the fix up, we need to store the address of the branch instruction
646 // and its target at least. We also need to store the original branch
647 // instruction bits for the condition code in a conditional branch. The
648 // condition code is used in a special instruction template. We also want
649 // to identify input sections needing Cortex-A8 workaround quickly. We store
650 // extra information about object and section index of the code section
651 // containing a branch being fixed up. The information is used to mark
652 // the code section when we finalize the Cortex-A8 stubs.
655 class Cortex_a8_stub : public Stub
657 public:
658 ~Cortex_a8_stub()
661 // Return the object of the code section containing the branch being fixed
662 // up.
663 Relobj*
664 relobj() const
665 { return this->relobj_; }
667 // Return the section index of the code section containing the branch being
668 // fixed up.
669 unsigned int
670 shndx() const
671 { return this->shndx_; }
673 // Return the source address of stub. This is the address of the original
674 // branch instruction. LSB is 1 always set to indicate that it is a THUMB
675 // instruction.
676 Arm_address
677 source_address() const
678 { return this->source_address_; }
680 // Return the destination address of the stub. This is the branch taken
681 // address of the original branch instruction. LSB is 1 if it is a THUMB
682 // instruction address.
683 Arm_address
684 destination_address() const
685 { return this->destination_address_; }
687 // Return the instruction being fixed up.
688 uint32_t
689 original_insn() const
690 { return this->original_insn_; }
692 protected:
693 // Cortex_a8_stubs are created via a stub factory. So these are protected.
694 Cortex_a8_stub(const Stub_template* stub_template, Relobj* relobj,
695 unsigned int shndx, Arm_address source_address,
696 Arm_address destination_address, uint32_t original_insn)
697 : Stub(stub_template), relobj_(relobj), shndx_(shndx),
698 source_address_(source_address | 1U),
699 destination_address_(destination_address),
700 original_insn_(original_insn)
703 friend class Stub_factory;
705 // Return the relocation target address of the i-th relocation in the
706 // stub.
707 Arm_address
708 do_reloc_target(size_t i)
710 if (this->stub_template()->type() == arm_stub_a8_veneer_b_cond)
712 // The conditional branch veneer has two relocations.
713 gold_assert(i < 2);
714 return i == 0 ? this->source_address_ + 4 : this->destination_address_;
716 else
718 // All other Cortex-A8 stubs have only one relocation.
719 gold_assert(i == 0);
720 return this->destination_address_;
724 // Return an instruction for the THUMB16_SPECIAL_TYPE instruction template.
725 uint16_t
726 do_thumb16_special(size_t);
728 private:
729 // Object of the code section containing the branch being fixed up.
730 Relobj* relobj_;
731 // Section index of the code section containing the branch begin fixed up.
732 unsigned int shndx_;
733 // Source address of original branch.
734 Arm_address source_address_;
735 // Destination address of the original branch.
736 Arm_address destination_address_;
737 // Original branch instruction. This is needed for copying the condition
738 // code from a condition branch to its stub.
739 uint32_t original_insn_;
742 // ARMv4 BX Rx branch relocation stub class.
743 class Arm_v4bx_stub : public Stub
745 public:
746 ~Arm_v4bx_stub()
749 // Return the associated register.
750 uint32_t
751 reg() const
752 { return this->reg_; }
754 protected:
755 // Arm V4BX stubs are created via a stub factory. So these are protected.
756 Arm_v4bx_stub(const Stub_template* stub_template, const uint32_t reg)
757 : Stub(stub_template), reg_(reg)
760 friend class Stub_factory;
762 // Return the relocation target address of the i-th relocation in the
763 // stub.
764 Arm_address
765 do_reloc_target(size_t)
766 { gold_unreachable(); }
768 // This may be overridden in the child class.
769 virtual void
770 do_write(unsigned char* view, section_size_type view_size, bool big_endian)
772 if (big_endian)
773 this->do_fixed_endian_v4bx_write<true>(view, view_size);
774 else
775 this->do_fixed_endian_v4bx_write<false>(view, view_size);
778 private:
779 // A template to implement do_write.
780 template<bool big_endian>
781 void inline
782 do_fixed_endian_v4bx_write(unsigned char* view, section_size_type)
784 const Insn_template* insns = this->stub_template()->insns();
785 elfcpp::Swap<32, big_endian>::writeval(view,
786 (insns[0].data()
787 + (this->reg_ << 16)));
788 view += insns[0].size();
789 elfcpp::Swap<32, big_endian>::writeval(view,
790 (insns[1].data() + this->reg_));
791 view += insns[1].size();
792 elfcpp::Swap<32, big_endian>::writeval(view,
793 (insns[2].data() + this->reg_));
796 // A register index (r0-r14), which is associated with the stub.
797 uint32_t reg_;
800 // Stub factory class.
802 class Stub_factory
804 public:
805 // Return the unique instance of this class.
806 static const Stub_factory&
807 get_instance()
809 static Stub_factory singleton;
810 return singleton;
813 // Make a relocation stub.
814 Reloc_stub*
815 make_reloc_stub(Stub_type stub_type) const
817 gold_assert(stub_type >= arm_stub_reloc_first
818 && stub_type <= arm_stub_reloc_last);
819 return new Reloc_stub(this->stub_templates_[stub_type]);
822 // Make a Cortex-A8 stub.
823 Cortex_a8_stub*
824 make_cortex_a8_stub(Stub_type stub_type, Relobj* relobj, unsigned int shndx,
825 Arm_address source, Arm_address destination,
826 uint32_t original_insn) const
828 gold_assert(stub_type >= arm_stub_cortex_a8_first
829 && stub_type <= arm_stub_cortex_a8_last);
830 return new Cortex_a8_stub(this->stub_templates_[stub_type], relobj, shndx,
831 source, destination, original_insn);
834 // Make an ARM V4BX relocation stub.
835 // This method creates a stub from the arm_stub_v4_veneer_bx template only.
836 Arm_v4bx_stub*
837 make_arm_v4bx_stub(uint32_t reg) const
839 gold_assert(reg < 0xf);
840 return new Arm_v4bx_stub(this->stub_templates_[arm_stub_v4_veneer_bx],
841 reg);
844 private:
845 // Constructor and destructor are protected since we only return a single
846 // instance created in Stub_factory::get_instance().
848 Stub_factory();
850 // A Stub_factory may not be copied since it is a singleton.
851 Stub_factory(const Stub_factory&);
852 Stub_factory& operator=(Stub_factory&);
854 // Stub templates. These are initialized in the constructor.
855 const Stub_template* stub_templates_[arm_stub_type_last+1];
858 // A class to hold stubs for the ARM target.
860 template<bool big_endian>
861 class Stub_table : public Output_data
863 public:
864 Stub_table(Arm_input_section<big_endian>* owner)
865 : Output_data(), owner_(owner), reloc_stubs_(), cortex_a8_stubs_(),
866 arm_v4bx_stubs_(0xf), prev_data_size_(0), prev_addralign_(1)
869 ~Stub_table()
872 // Owner of this stub table.
873 Arm_input_section<big_endian>*
874 owner() const
875 { return this->owner_; }
877 // Whether this stub table is empty.
878 bool
879 empty() const
881 return (this->reloc_stubs_.empty()
882 && this->cortex_a8_stubs_.empty()
883 && this->arm_v4bx_stubs_.empty());
886 // Return the current data size.
887 off_t
888 current_data_size() const
889 { return this->current_data_size_for_child(); }
891 // Add a STUB with using KEY. Caller is reponsible for avoid adding
892 // if already a STUB with the same key has been added.
893 void
894 add_reloc_stub(Reloc_stub* stub, const Reloc_stub::Key& key)
896 const Stub_template* stub_template = stub->stub_template();
897 gold_assert(stub_template->type() == key.stub_type());
898 this->reloc_stubs_[key] = stub;
901 // Add a Cortex-A8 STUB that fixes up a THUMB branch at ADDRESS.
902 // Caller is reponsible for avoid adding if already a STUB with the same
903 // address has been added.
904 void
905 add_cortex_a8_stub(Arm_address address, Cortex_a8_stub* stub)
907 std::pair<Arm_address, Cortex_a8_stub*> value(address, stub);
908 this->cortex_a8_stubs_.insert(value);
911 // Add an ARM V4BX relocation stub. A register index will be retrieved
912 // from the stub.
913 void
914 add_arm_v4bx_stub(Arm_v4bx_stub* stub)
916 gold_assert(stub != NULL && this->arm_v4bx_stubs_[stub->reg()] == NULL);
917 this->arm_v4bx_stubs_[stub->reg()] = stub;
920 // Remove all Cortex-A8 stubs.
921 void
922 remove_all_cortex_a8_stubs();
924 // Look up a relocation stub using KEY. Return NULL if there is none.
925 Reloc_stub*
926 find_reloc_stub(const Reloc_stub::Key& key) const
928 typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.find(key);
929 return (p != this->reloc_stubs_.end()) ? p->second : NULL;
932 // Look up an arm v4bx relocation stub using the register index.
933 // Return NULL if there is none.
934 Arm_v4bx_stub*
935 find_arm_v4bx_stub(const uint32_t reg) const
937 gold_assert(reg < 0xf);
938 return this->arm_v4bx_stubs_[reg];
941 // Relocate stubs in this stub table.
942 void
943 relocate_stubs(const Relocate_info<32, big_endian>*,
944 Target_arm<big_endian>*, Output_section*,
945 unsigned char*, Arm_address, section_size_type);
947 // Update data size and alignment at the end of a relaxation pass. Return
948 // true if either data size or alignment is different from that of the
949 // previous relaxation pass.
950 bool
951 update_data_size_and_addralign();
953 // Finalize stubs. Set the offsets of all stubs and mark input sections
954 // needing the Cortex-A8 workaround.
955 void
956 finalize_stubs();
958 // Apply Cortex-A8 workaround to an address range.
959 void
960 apply_cortex_a8_workaround_to_address_range(Target_arm<big_endian>*,
961 unsigned char*, Arm_address,
962 section_size_type);
964 protected:
965 // Write out section contents.
966 void
967 do_write(Output_file*);
969 // Return the required alignment.
970 uint64_t
971 do_addralign() const
972 { return this->prev_addralign_; }
974 // Reset address and file offset.
975 void
976 do_reset_address_and_file_offset()
977 { this->set_current_data_size_for_child(this->prev_data_size_); }
979 // Set final data size.
980 void
981 set_final_data_size()
982 { this->set_data_size(this->current_data_size()); }
984 private:
985 // Relocate one stub.
986 void
987 relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
988 Target_arm<big_endian>*, Output_section*,
989 unsigned char*, Arm_address, section_size_type);
991 // Unordered map of relocation stubs.
992 typedef
993 Unordered_map<Reloc_stub::Key, Reloc_stub*, Reloc_stub::Key::hash,
994 Reloc_stub::Key::equal_to>
995 Reloc_stub_map;
997 // List of Cortex-A8 stubs ordered by addresses of branches being
998 // fixed up in output.
999 typedef std::map<Arm_address, Cortex_a8_stub*> Cortex_a8_stub_list;
1000 // List of Arm V4BX relocation stubs ordered by associated registers.
1001 typedef std::vector<Arm_v4bx_stub*> Arm_v4bx_stub_list;
1003 // Owner of this stub table.
1004 Arm_input_section<big_endian>* owner_;
1005 // The relocation stubs.
1006 Reloc_stub_map reloc_stubs_;
1007 // The cortex_a8_stubs.
1008 Cortex_a8_stub_list cortex_a8_stubs_;
1009 // The Arm V4BX relocation stubs.
1010 Arm_v4bx_stub_list arm_v4bx_stubs_;
1011 // data size of this in the previous pass.
1012 off_t prev_data_size_;
1013 // address alignment of this in the previous pass.
1014 uint64_t prev_addralign_;
1017 // Arm_exidx_cantunwind class. This represents an EXIDX_CANTUNWIND entry
1018 // we add to the end of an EXIDX input section that goes into the output.
1020 class Arm_exidx_cantunwind : public Output_section_data
1022 public:
1023 Arm_exidx_cantunwind(Relobj* relobj, unsigned int shndx)
1024 : Output_section_data(8, 4, true), relobj_(relobj), shndx_(shndx)
1027 // Return the object containing the section pointed by this.
1028 Relobj*
1029 relobj() const
1030 { return this->relobj_; }
1032 // Return the section index of the section pointed by this.
1033 unsigned int
1034 shndx() const
1035 { return this->shndx_; }
1037 protected:
1038 void
1039 do_write(Output_file* of)
1041 if (parameters->target().is_big_endian())
1042 this->do_fixed_endian_write<true>(of);
1043 else
1044 this->do_fixed_endian_write<false>(of);
1047 private:
1048 // Implement do_write for a given endianity.
1049 template<bool big_endian>
1050 void inline
1051 do_fixed_endian_write(Output_file*);
1053 // The object containing the section pointed by this.
1054 Relobj* relobj_;
1055 // The section index of the section pointed by this.
1056 unsigned int shndx_;
1059 // During EXIDX coverage fix-up, we compact an EXIDX section. The
1060 // Offset map is used to map input section offset within the EXIDX section
1061 // to the output offset from the start of this EXIDX section.
1063 typedef std::map<section_offset_type, section_offset_type>
1064 Arm_exidx_section_offset_map;
1066 // Arm_exidx_merged_section class. This represents an EXIDX input section
1067 // with some of its entries merged.
1069 class Arm_exidx_merged_section : public Output_relaxed_input_section
1071 public:
1072 // Constructor for Arm_exidx_merged_section.
1073 // EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
1074 // SECTION_OFFSET_MAP points to a section offset map describing how
1075 // parts of the input section are mapped to output. DELETED_BYTES is
1076 // the number of bytes deleted from the EXIDX input section.
1077 Arm_exidx_merged_section(
1078 const Arm_exidx_input_section& exidx_input_section,
1079 const Arm_exidx_section_offset_map& section_offset_map,
1080 uint32_t deleted_bytes);
1082 // Return the original EXIDX input section.
1083 const Arm_exidx_input_section&
1084 exidx_input_section() const
1085 { return this->exidx_input_section_; }
1087 // Return the section offset map.
1088 const Arm_exidx_section_offset_map&
1089 section_offset_map() const
1090 { return this->section_offset_map_; }
1092 protected:
1093 // Write merged section into file OF.
1094 void
1095 do_write(Output_file* of);
1097 bool
1098 do_output_offset(const Relobj*, unsigned int, section_offset_type,
1099 section_offset_type*) const;
1101 private:
1102 // Original EXIDX input section.
1103 const Arm_exidx_input_section& exidx_input_section_;
1104 // Section offset map.
1105 const Arm_exidx_section_offset_map& section_offset_map_;
1108 // A class to wrap an ordinary input section containing executable code.
1110 template<bool big_endian>
1111 class Arm_input_section : public Output_relaxed_input_section
1113 public:
1114 Arm_input_section(Relobj* relobj, unsigned int shndx)
1115 : Output_relaxed_input_section(relobj, shndx, 1),
1116 original_addralign_(1), original_size_(0), stub_table_(NULL)
1119 ~Arm_input_section()
1122 // Initialize.
1123 void
1124 init();
1126 // Whether this is a stub table owner.
1127 bool
1128 is_stub_table_owner() const
1129 { return this->stub_table_ != NULL && this->stub_table_->owner() == this; }
1131 // Return the stub table.
1132 Stub_table<big_endian>*
1133 stub_table() const
1134 { return this->stub_table_; }
1136 // Set the stub_table.
1137 void
1138 set_stub_table(Stub_table<big_endian>* stub_table)
1139 { this->stub_table_ = stub_table; }
1141 // Downcast a base pointer to an Arm_input_section pointer. This is
1142 // not type-safe but we only use Arm_input_section not the base class.
1143 static Arm_input_section<big_endian>*
1144 as_arm_input_section(Output_relaxed_input_section* poris)
1145 { return static_cast<Arm_input_section<big_endian>*>(poris); }
1147 protected:
1148 // Write data to output file.
1149 void
1150 do_write(Output_file*);
1152 // Return required alignment of this.
1153 uint64_t
1154 do_addralign() const
1156 if (this->is_stub_table_owner())
1157 return std::max(this->stub_table_->addralign(),
1158 this->original_addralign_);
1159 else
1160 return this->original_addralign_;
1163 // Finalize data size.
1164 void
1165 set_final_data_size();
1167 // Reset address and file offset.
1168 void
1169 do_reset_address_and_file_offset();
1171 // Output offset.
1172 bool
1173 do_output_offset(const Relobj* object, unsigned int shndx,
1174 section_offset_type offset,
1175 section_offset_type* poutput) const
1177 if ((object == this->relobj())
1178 && (shndx == this->shndx())
1179 && (offset >= 0)
1180 && (convert_types<uint64_t, section_offset_type>(offset)
1181 <= this->original_size_))
1183 *poutput = offset;
1184 return true;
1186 else
1187 return false;
1190 private:
1191 // Copying is not allowed.
1192 Arm_input_section(const Arm_input_section&);
1193 Arm_input_section& operator=(const Arm_input_section&);
1195 // Address alignment of the original input section.
1196 uint64_t original_addralign_;
1197 // Section size of the original input section.
1198 uint64_t original_size_;
1199 // Stub table.
1200 Stub_table<big_endian>* stub_table_;
1203 // Arm_exidx_fixup class. This is used to define a number of methods
1204 // and keep states for fixing up EXIDX coverage.
1206 class Arm_exidx_fixup
1208 public:
1209 Arm_exidx_fixup(Output_section* exidx_output_section)
1210 : exidx_output_section_(exidx_output_section), last_unwind_type_(UT_NONE),
1211 last_inlined_entry_(0), last_input_section_(NULL),
1212 section_offset_map_(NULL), first_output_text_section_(NULL)
1215 ~Arm_exidx_fixup()
1216 { delete this->section_offset_map_; }
1218 // Process an EXIDX section for entry merging. Return number of bytes to
1219 // be deleted in output. If parts of the input EXIDX section are merged
1220 // a heap allocated Arm_exidx_section_offset_map is store in the located
1221 // PSECTION_OFFSET_MAP. The caller owns the map and is reponsible for
1222 // releasing it.
1223 template<bool big_endian>
1224 uint32_t
1225 process_exidx_section(const Arm_exidx_input_section* exidx_input_section,
1226 Arm_exidx_section_offset_map** psection_offset_map);
1228 // Append an EXIDX_CANTUNWIND entry pointing at the end of the last
1229 // input section, if there is not one already.
1230 void
1231 add_exidx_cantunwind_as_needed();
1233 // Return the output section for the text section which is linked to the
1234 // first exidx input in output.
1235 Output_section*
1236 first_output_text_section() const
1237 { return this->first_output_text_section_; }
1239 private:
1240 // Copying is not allowed.
1241 Arm_exidx_fixup(const Arm_exidx_fixup&);
1242 Arm_exidx_fixup& operator=(const Arm_exidx_fixup&);
1244 // Type of EXIDX unwind entry.
1245 enum Unwind_type
1247 // No type.
1248 UT_NONE,
1249 // EXIDX_CANTUNWIND.
1250 UT_EXIDX_CANTUNWIND,
1251 // Inlined entry.
1252 UT_INLINED_ENTRY,
1253 // Normal entry.
1254 UT_NORMAL_ENTRY,
1257 // Process an EXIDX entry. We only care about the second word of the
1258 // entry. Return true if the entry can be deleted.
1259 bool
1260 process_exidx_entry(uint32_t second_word);
1262 // Update the current section offset map during EXIDX section fix-up.
1263 // If there is no map, create one. INPUT_OFFSET is the offset of a
1264 // reference point, DELETED_BYTES is the number of deleted by in the
1265 // section so far. If DELETE_ENTRY is true, the reference point and
1266 // all offsets after the previous reference point are discarded.
1267 void
1268 update_offset_map(section_offset_type input_offset,
1269 section_size_type deleted_bytes, bool delete_entry);
1271 // EXIDX output section.
1272 Output_section* exidx_output_section_;
1273 // Unwind type of the last EXIDX entry processed.
1274 Unwind_type last_unwind_type_;
1275 // Last seen inlined EXIDX entry.
1276 uint32_t last_inlined_entry_;
1277 // Last processed EXIDX input section.
1278 const Arm_exidx_input_section* last_input_section_;
1279 // Section offset map created in process_exidx_section.
1280 Arm_exidx_section_offset_map* section_offset_map_;
1281 // Output section for the text section which is linked to the first exidx
1282 // input in output.
1283 Output_section* first_output_text_section_;
1286 // Arm output section class. This is defined mainly to add a number of
1287 // stub generation methods.
1289 template<bool big_endian>
1290 class Arm_output_section : public Output_section
1292 public:
1293 typedef std::vector<std::pair<Relobj*, unsigned int> > Text_section_list;
1295 Arm_output_section(const char* name, elfcpp::Elf_Word type,
1296 elfcpp::Elf_Xword flags)
1297 : Output_section(name, type, flags)
1300 ~Arm_output_section()
1303 // Group input sections for stub generation.
1304 void
1305 group_sections(section_size_type, bool, Target_arm<big_endian>*);
1307 // Downcast a base pointer to an Arm_output_section pointer. This is
1308 // not type-safe but we only use Arm_output_section not the base class.
1309 static Arm_output_section<big_endian>*
1310 as_arm_output_section(Output_section* os)
1311 { return static_cast<Arm_output_section<big_endian>*>(os); }
1313 // Append all input text sections in this into LIST.
1314 void
1315 append_text_sections_to_list(Text_section_list* list);
1317 // Fix EXIDX coverage of this EXIDX output section. SORTED_TEXT_SECTION
1318 // is a list of text input sections sorted in ascending order of their
1319 // output addresses.
1320 void
1321 fix_exidx_coverage(const Text_section_list& sorted_text_section,
1322 Symbol_table* symtab);
1324 private:
1325 // For convenience.
1326 typedef Output_section::Input_section Input_section;
1327 typedef Output_section::Input_section_list Input_section_list;
1329 // Create a stub group.
1330 void create_stub_group(Input_section_list::const_iterator,
1331 Input_section_list::const_iterator,
1332 Input_section_list::const_iterator,
1333 Target_arm<big_endian>*,
1334 std::vector<Output_relaxed_input_section*>*);
1337 // Arm_exidx_input_section class. This represents an EXIDX input section.
1339 class Arm_exidx_input_section
1341 public:
1342 static const section_offset_type invalid_offset =
1343 static_cast<section_offset_type>(-1);
1345 Arm_exidx_input_section(Relobj* relobj, unsigned int shndx,
1346 unsigned int link, uint32_t size, uint32_t addralign)
1347 : relobj_(relobj), shndx_(shndx), link_(link), size_(size),
1348 addralign_(addralign)
1351 ~Arm_exidx_input_section()
1354 // Accessors: This is a read-only class.
1356 // Return the object containing this EXIDX input section.
1357 Relobj*
1358 relobj() const
1359 { return this->relobj_; }
1361 // Return the section index of this EXIDX input section.
1362 unsigned int
1363 shndx() const
1364 { return this->shndx_; }
1366 // Return the section index of linked text section in the same object.
1367 unsigned int
1368 link() const
1369 { return this->link_; }
1371 // Return size of the EXIDX input section.
1372 uint32_t
1373 size() const
1374 { return this->size_; }
1376 // Reutnr address alignment of EXIDX input section.
1377 uint32_t
1378 addralign() const
1379 { return this->addralign_; }
1381 private:
1382 // Object containing this.
1383 Relobj* relobj_;
1384 // Section index of this.
1385 unsigned int shndx_;
1386 // text section linked to this in the same object.
1387 unsigned int link_;
1388 // Size of this. For ARM 32-bit is sufficient.
1389 uint32_t size_;
1390 // Address alignment of this. For ARM 32-bit is sufficient.
1391 uint32_t addralign_;
1394 // Arm_relobj class.
1396 template<bool big_endian>
1397 class Arm_relobj : public Sized_relobj<32, big_endian>
1399 public:
1400 static const Arm_address invalid_address = static_cast<Arm_address>(-1);
1402 Arm_relobj(const std::string& name, Input_file* input_file, off_t offset,
1403 const typename elfcpp::Ehdr<32, big_endian>& ehdr)
1404 : Sized_relobj<32, big_endian>(name, input_file, offset, ehdr),
1405 stub_tables_(), local_symbol_is_thumb_function_(),
1406 attributes_section_data_(NULL), mapping_symbols_info_(),
1407 section_has_cortex_a8_workaround_(NULL), exidx_section_map_(),
1408 output_local_symbol_count_needs_update_(false)
1411 ~Arm_relobj()
1412 { delete this->attributes_section_data_; }
1414 // Return the stub table of the SHNDX-th section if there is one.
1415 Stub_table<big_endian>*
1416 stub_table(unsigned int shndx) const
1418 gold_assert(shndx < this->stub_tables_.size());
1419 return this->stub_tables_[shndx];
1422 // Set STUB_TABLE to be the stub_table of the SHNDX-th section.
1423 void
1424 set_stub_table(unsigned int shndx, Stub_table<big_endian>* stub_table)
1426 gold_assert(shndx < this->stub_tables_.size());
1427 this->stub_tables_[shndx] = stub_table;
1430 // Whether a local symbol is a THUMB function. R_SYM is the symbol table
1431 // index. This is only valid after do_count_local_symbol is called.
1432 bool
1433 local_symbol_is_thumb_function(unsigned int r_sym) const
1435 gold_assert(r_sym < this->local_symbol_is_thumb_function_.size());
1436 return this->local_symbol_is_thumb_function_[r_sym];
1439 // Scan all relocation sections for stub generation.
1440 void
1441 scan_sections_for_stubs(Target_arm<big_endian>*, const Symbol_table*,
1442 const Layout*);
1444 // Convert regular input section with index SHNDX to a relaxed section.
1445 void
1446 convert_input_section_to_relaxed_section(unsigned shndx)
1448 // The stubs have relocations and we need to process them after writing
1449 // out the stubs. So relocation now must follow section write.
1450 this->set_section_offset(shndx, -1ULL);
1451 this->set_relocs_must_follow_section_writes();
1454 // Downcast a base pointer to an Arm_relobj pointer. This is
1455 // not type-safe but we only use Arm_relobj not the base class.
1456 static Arm_relobj<big_endian>*
1457 as_arm_relobj(Relobj* relobj)
1458 { return static_cast<Arm_relobj<big_endian>*>(relobj); }
1460 // Processor-specific flags in ELF file header. This is valid only after
1461 // reading symbols.
1462 elfcpp::Elf_Word
1463 processor_specific_flags() const
1464 { return this->processor_specific_flags_; }
1466 // Attribute section data This is the contents of the .ARM.attribute section
1467 // if there is one.
1468 const Attributes_section_data*
1469 attributes_section_data() const
1470 { return this->attributes_section_data_; }
1472 // Mapping symbol location.
1473 typedef std::pair<unsigned int, Arm_address> Mapping_symbol_position;
1475 // Functor for STL container.
1476 struct Mapping_symbol_position_less
1478 bool
1479 operator()(const Mapping_symbol_position& p1,
1480 const Mapping_symbol_position& p2) const
1482 return (p1.first < p2.first
1483 || (p1.first == p2.first && p1.second < p2.second));
1487 // We only care about the first character of a mapping symbol, so
1488 // we only store that instead of the whole symbol name.
1489 typedef std::map<Mapping_symbol_position, char,
1490 Mapping_symbol_position_less> Mapping_symbols_info;
1492 // Whether a section contains any Cortex-A8 workaround.
1493 bool
1494 section_has_cortex_a8_workaround(unsigned int shndx) const
1496 return (this->section_has_cortex_a8_workaround_ != NULL
1497 && (*this->section_has_cortex_a8_workaround_)[shndx]);
1500 // Mark a section that has Cortex-A8 workaround.
1501 void
1502 mark_section_for_cortex_a8_workaround(unsigned int shndx)
1504 if (this->section_has_cortex_a8_workaround_ == NULL)
1505 this->section_has_cortex_a8_workaround_ =
1506 new std::vector<bool>(this->shnum(), false);
1507 (*this->section_has_cortex_a8_workaround_)[shndx] = true;
1510 // Return the EXIDX section of an text section with index SHNDX or NULL
1511 // if the text section has no associated EXIDX section.
1512 const Arm_exidx_input_section*
1513 exidx_input_section_by_link(unsigned int shndx) const
1515 Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1516 return ((p != this->exidx_section_map_.end()
1517 && p->second->link() == shndx)
1518 ? p->second
1519 : NULL);
1522 // Return the EXIDX section with index SHNDX or NULL if there is none.
1523 const Arm_exidx_input_section*
1524 exidx_input_section_by_shndx(unsigned shndx) const
1526 Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1527 return ((p != this->exidx_section_map_.end()
1528 && p->second->shndx() == shndx)
1529 ? p->second
1530 : NULL);
1533 // Whether output local symbol count needs updating.
1534 bool
1535 output_local_symbol_count_needs_update() const
1536 { return this->output_local_symbol_count_needs_update_; }
1538 // Set output_local_symbol_count_needs_update flag to be true.
1539 void
1540 set_output_local_symbol_count_needs_update()
1541 { this->output_local_symbol_count_needs_update_ = true; }
1543 // Update output local symbol count at the end of relaxation.
1544 void
1545 update_output_local_symbol_count();
1547 protected:
1548 // Post constructor setup.
1549 void
1550 do_setup()
1552 // Call parent's setup method.
1553 Sized_relobj<32, big_endian>::do_setup();
1555 // Initialize look-up tables.
1556 Stub_table_list empty_stub_table_list(this->shnum(), NULL);
1557 this->stub_tables_.swap(empty_stub_table_list);
1560 // Count the local symbols.
1561 void
1562 do_count_local_symbols(Stringpool_template<char>*,
1563 Stringpool_template<char>*);
1565 void
1566 do_relocate_sections(const Symbol_table* symtab, const Layout* layout,
1567 const unsigned char* pshdrs,
1568 typename Sized_relobj<32, big_endian>::Views* pivews);
1570 // Read the symbol information.
1571 void
1572 do_read_symbols(Read_symbols_data* sd);
1574 // Process relocs for garbage collection.
1575 void
1576 do_gc_process_relocs(Symbol_table*, Layout*, Read_relocs_data*);
1578 private:
1580 // Whether a section needs to be scanned for relocation stubs.
1581 bool
1582 section_needs_reloc_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1583 const Relobj::Output_sections&,
1584 const Symbol_table *, const unsigned char*);
1586 // Whether a section is a scannable text section.
1587 bool
1588 section_is_scannable(const elfcpp::Shdr<32, big_endian>&, unsigned int,
1589 const Output_section*, const Symbol_table *);
1591 // Whether a section needs to be scanned for the Cortex-A8 erratum.
1592 bool
1593 section_needs_cortex_a8_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1594 unsigned int, Output_section*,
1595 const Symbol_table *);
1597 // Scan a section for the Cortex-A8 erratum.
1598 void
1599 scan_section_for_cortex_a8_erratum(const elfcpp::Shdr<32, big_endian>&,
1600 unsigned int, Output_section*,
1601 Target_arm<big_endian>*);
1603 // Find the linked text section of an EXIDX section by looking at the
1604 // first reloction of the EXIDX section. PSHDR points to the section
1605 // headers of a relocation section and PSYMS points to the local symbols.
1606 // PSHNDX points to a location storing the text section index if found.
1607 // Return whether we can find the linked section.
1608 bool
1609 find_linked_text_section(const unsigned char* pshdr,
1610 const unsigned char* psyms, unsigned int* pshndx);
1613 // Make a new Arm_exidx_input_section object for EXIDX section with
1614 // index SHNDX and section header SHDR. TEXT_SHNDX is the section
1615 // index of the linked text section.
1616 void
1617 make_exidx_input_section(unsigned int shndx,
1618 const elfcpp::Shdr<32, big_endian>& shdr,
1619 unsigned int text_shndx);
1621 // Return the output address of either a plain input section or a
1622 // relaxed input section. SHNDX is the section index.
1623 Arm_address
1624 simple_input_section_output_address(unsigned int, Output_section*);
1626 typedef std::vector<Stub_table<big_endian>*> Stub_table_list;
1627 typedef Unordered_map<unsigned int, const Arm_exidx_input_section*>
1628 Exidx_section_map;
1630 // List of stub tables.
1631 Stub_table_list stub_tables_;
1632 // Bit vector to tell if a local symbol is a thumb function or not.
1633 // This is only valid after do_count_local_symbol is called.
1634 std::vector<bool> local_symbol_is_thumb_function_;
1635 // processor-specific flags in ELF file header.
1636 elfcpp::Elf_Word processor_specific_flags_;
1637 // Object attributes if there is an .ARM.attributes section or NULL.
1638 Attributes_section_data* attributes_section_data_;
1639 // Mapping symbols information.
1640 Mapping_symbols_info mapping_symbols_info_;
1641 // Bitmap to indicate sections with Cortex-A8 workaround or NULL.
1642 std::vector<bool>* section_has_cortex_a8_workaround_;
1643 // Map a text section to its associated .ARM.exidx section, if there is one.
1644 Exidx_section_map exidx_section_map_;
1645 // Whether output local symbol count needs updating.
1646 bool output_local_symbol_count_needs_update_;
1649 // Arm_dynobj class.
1651 template<bool big_endian>
1652 class Arm_dynobj : public Sized_dynobj<32, big_endian>
1654 public:
1655 Arm_dynobj(const std::string& name, Input_file* input_file, off_t offset,
1656 const elfcpp::Ehdr<32, big_endian>& ehdr)
1657 : Sized_dynobj<32, big_endian>(name, input_file, offset, ehdr),
1658 processor_specific_flags_(0), attributes_section_data_(NULL)
1661 ~Arm_dynobj()
1662 { delete this->attributes_section_data_; }
1664 // Downcast a base pointer to an Arm_relobj pointer. This is
1665 // not type-safe but we only use Arm_relobj not the base class.
1666 static Arm_dynobj<big_endian>*
1667 as_arm_dynobj(Dynobj* dynobj)
1668 { return static_cast<Arm_dynobj<big_endian>*>(dynobj); }
1670 // Processor-specific flags in ELF file header. This is valid only after
1671 // reading symbols.
1672 elfcpp::Elf_Word
1673 processor_specific_flags() const
1674 { return this->processor_specific_flags_; }
1676 // Attributes section data.
1677 const Attributes_section_data*
1678 attributes_section_data() const
1679 { return this->attributes_section_data_; }
1681 protected:
1682 // Read the symbol information.
1683 void
1684 do_read_symbols(Read_symbols_data* sd);
1686 private:
1687 // processor-specific flags in ELF file header.
1688 elfcpp::Elf_Word processor_specific_flags_;
1689 // Object attributes if there is an .ARM.attributes section or NULL.
1690 Attributes_section_data* attributes_section_data_;
1693 // Functor to read reloc addends during stub generation.
1695 template<int sh_type, bool big_endian>
1696 struct Stub_addend_reader
1698 // Return the addend for a relocation of a particular type. Depending
1699 // on whether this is a REL or RELA relocation, read the addend from a
1700 // view or from a Reloc object.
1701 elfcpp::Elf_types<32>::Elf_Swxword
1702 operator()(
1703 unsigned int /* r_type */,
1704 const unsigned char* /* view */,
1705 const typename Reloc_types<sh_type,
1706 32, big_endian>::Reloc& /* reloc */) const;
1709 // Specialized Stub_addend_reader for SHT_REL type relocation sections.
1711 template<bool big_endian>
1712 struct Stub_addend_reader<elfcpp::SHT_REL, big_endian>
1714 elfcpp::Elf_types<32>::Elf_Swxword
1715 operator()(
1716 unsigned int,
1717 const unsigned char*,
1718 const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const;
1721 // Specialized Stub_addend_reader for RELA type relocation sections.
1722 // We currently do not handle RELA type relocation sections but it is trivial
1723 // to implement the addend reader. This is provided for completeness and to
1724 // make it easier to add support for RELA relocation sections in the future.
1726 template<bool big_endian>
1727 struct Stub_addend_reader<elfcpp::SHT_RELA, big_endian>
1729 elfcpp::Elf_types<32>::Elf_Swxword
1730 operator()(
1731 unsigned int,
1732 const unsigned char*,
1733 const typename Reloc_types<elfcpp::SHT_RELA, 32,
1734 big_endian>::Reloc& reloc) const
1735 { return reloc.get_r_addend(); }
1738 // Cortex_a8_reloc class. We keep record of relocation that may need
1739 // the Cortex-A8 erratum workaround.
1741 class Cortex_a8_reloc
1743 public:
1744 Cortex_a8_reloc(Reloc_stub* reloc_stub, unsigned r_type,
1745 Arm_address destination)
1746 : reloc_stub_(reloc_stub), r_type_(r_type), destination_(destination)
1749 ~Cortex_a8_reloc()
1752 // Accessors: This is a read-only class.
1754 // Return the relocation stub associated with this relocation if there is
1755 // one.
1756 const Reloc_stub*
1757 reloc_stub() const
1758 { return this->reloc_stub_; }
1760 // Return the relocation type.
1761 unsigned int
1762 r_type() const
1763 { return this->r_type_; }
1765 // Return the destination address of the relocation. LSB stores the THUMB
1766 // bit.
1767 Arm_address
1768 destination() const
1769 { return this->destination_; }
1771 private:
1772 // Associated relocation stub if there is one, or NULL.
1773 const Reloc_stub* reloc_stub_;
1774 // Relocation type.
1775 unsigned int r_type_;
1776 // Destination address of this relocation. LSB is used to distinguish
1777 // ARM/THUMB mode.
1778 Arm_address destination_;
1781 // Utilities for manipulating integers of up to 32-bits
1783 namespace utils
1785 // Sign extend an n-bit unsigned integer stored in an uint32_t into
1786 // an int32_t. NO_BITS must be between 1 to 32.
1787 template<int no_bits>
1788 static inline int32_t
1789 sign_extend(uint32_t bits)
1791 gold_assert(no_bits >= 0 && no_bits <= 32);
1792 if (no_bits == 32)
1793 return static_cast<int32_t>(bits);
1794 uint32_t mask = (~((uint32_t) 0)) >> (32 - no_bits);
1795 bits &= mask;
1796 uint32_t top_bit = 1U << (no_bits - 1);
1797 int32_t as_signed = static_cast<int32_t>(bits);
1798 return (bits & top_bit) ? as_signed + (-top_bit * 2) : as_signed;
1801 // Detects overflow of an NO_BITS integer stored in a uint32_t.
1802 template<int no_bits>
1803 static inline bool
1804 has_overflow(uint32_t bits)
1806 gold_assert(no_bits >= 0 && no_bits <= 32);
1807 if (no_bits == 32)
1808 return false;
1809 int32_t max = (1 << (no_bits - 1)) - 1;
1810 int32_t min = -(1 << (no_bits - 1));
1811 int32_t as_signed = static_cast<int32_t>(bits);
1812 return as_signed > max || as_signed < min;
1815 // Detects overflow of an NO_BITS integer stored in a uint32_t when it
1816 // fits in the given number of bits as either a signed or unsigned value.
1817 // For example, has_signed_unsigned_overflow<8> would check
1818 // -128 <= bits <= 255
1819 template<int no_bits>
1820 static inline bool
1821 has_signed_unsigned_overflow(uint32_t bits)
1823 gold_assert(no_bits >= 2 && no_bits <= 32);
1824 if (no_bits == 32)
1825 return false;
1826 int32_t max = static_cast<int32_t>((1U << no_bits) - 1);
1827 int32_t min = -(1 << (no_bits - 1));
1828 int32_t as_signed = static_cast<int32_t>(bits);
1829 return as_signed > max || as_signed < min;
1832 // Select bits from A and B using bits in MASK. For each n in [0..31],
1833 // the n-th bit in the result is chosen from the n-th bits of A and B.
1834 // A zero selects A and a one selects B.
1835 static inline uint32_t
1836 bit_select(uint32_t a, uint32_t b, uint32_t mask)
1837 { return (a & ~mask) | (b & mask); }
1840 template<bool big_endian>
1841 class Target_arm : public Sized_target<32, big_endian>
1843 public:
1844 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
1845 Reloc_section;
1847 // When were are relocating a stub, we pass this as the relocation number.
1848 static const size_t fake_relnum_for_stubs = static_cast<size_t>(-1);
1850 Target_arm()
1851 : Sized_target<32, big_endian>(&arm_info),
1852 got_(NULL), plt_(NULL), got_plt_(NULL), rel_dyn_(NULL),
1853 copy_relocs_(elfcpp::R_ARM_COPY), dynbss_(NULL),
1854 got_mod_index_offset_(-1U), tls_base_symbol_defined_(false),
1855 stub_tables_(), stub_factory_(Stub_factory::get_instance()),
1856 may_use_blx_(false), should_force_pic_veneer_(false),
1857 arm_input_section_map_(), attributes_section_data_(NULL),
1858 fix_cortex_a8_(false), cortex_a8_relocs_info_()
1861 // Whether we can use BLX.
1862 bool
1863 may_use_blx() const
1864 { return this->may_use_blx_; }
1866 // Set use-BLX flag.
1867 void
1868 set_may_use_blx(bool value)
1869 { this->may_use_blx_ = value; }
1871 // Whether we force PCI branch veneers.
1872 bool
1873 should_force_pic_veneer() const
1874 { return this->should_force_pic_veneer_; }
1876 // Set PIC veneer flag.
1877 void
1878 set_should_force_pic_veneer(bool value)
1879 { this->should_force_pic_veneer_ = value; }
1881 // Whether we use THUMB-2 instructions.
1882 bool
1883 using_thumb2() const
1885 Object_attribute* attr =
1886 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
1887 int arch = attr->int_value();
1888 return arch == elfcpp::TAG_CPU_ARCH_V6T2 || arch >= elfcpp::TAG_CPU_ARCH_V7;
1891 // Whether we use THUMB/THUMB-2 instructions only.
1892 bool
1893 using_thumb_only() const
1895 Object_attribute* attr =
1896 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
1897 if (attr->int_value() != elfcpp::TAG_CPU_ARCH_V7
1898 && attr->int_value() != elfcpp::TAG_CPU_ARCH_V7E_M)
1899 return false;
1900 attr = this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
1901 return attr->int_value() == 'M';
1904 // Whether we have an NOP instruction. If not, use mov r0, r0 instead.
1905 bool
1906 may_use_arm_nop() const
1908 Object_attribute* attr =
1909 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
1910 int arch = attr->int_value();
1911 return (arch == elfcpp::TAG_CPU_ARCH_V6T2
1912 || arch == elfcpp::TAG_CPU_ARCH_V6K
1913 || arch == elfcpp::TAG_CPU_ARCH_V7
1914 || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
1917 // Whether we have THUMB-2 NOP.W instruction.
1918 bool
1919 may_use_thumb2_nop() const
1921 Object_attribute* attr =
1922 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
1923 int arch = attr->int_value();
1924 return (arch == elfcpp::TAG_CPU_ARCH_V6T2
1925 || arch == elfcpp::TAG_CPU_ARCH_V7
1926 || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
1929 // Process the relocations to determine unreferenced sections for
1930 // garbage collection.
1931 void
1932 gc_process_relocs(Symbol_table* symtab,
1933 Layout* layout,
1934 Sized_relobj<32, big_endian>* object,
1935 unsigned int data_shndx,
1936 unsigned int sh_type,
1937 const unsigned char* prelocs,
1938 size_t reloc_count,
1939 Output_section* output_section,
1940 bool needs_special_offset_handling,
1941 size_t local_symbol_count,
1942 const unsigned char* plocal_symbols);
1944 // Scan the relocations to look for symbol adjustments.
1945 void
1946 scan_relocs(Symbol_table* symtab,
1947 Layout* layout,
1948 Sized_relobj<32, big_endian>* object,
1949 unsigned int data_shndx,
1950 unsigned int sh_type,
1951 const unsigned char* prelocs,
1952 size_t reloc_count,
1953 Output_section* output_section,
1954 bool needs_special_offset_handling,
1955 size_t local_symbol_count,
1956 const unsigned char* plocal_symbols);
1958 // Finalize the sections.
1959 void
1960 do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
1962 // Return the value to use for a dynamic symbol which requires special
1963 // treatment.
1964 uint64_t
1965 do_dynsym_value(const Symbol*) const;
1967 // Relocate a section.
1968 void
1969 relocate_section(const Relocate_info<32, big_endian>*,
1970 unsigned int sh_type,
1971 const unsigned char* prelocs,
1972 size_t reloc_count,
1973 Output_section* output_section,
1974 bool needs_special_offset_handling,
1975 unsigned char* view,
1976 Arm_address view_address,
1977 section_size_type view_size,
1978 const Reloc_symbol_changes*);
1980 // Scan the relocs during a relocatable link.
1981 void
1982 scan_relocatable_relocs(Symbol_table* symtab,
1983 Layout* layout,
1984 Sized_relobj<32, big_endian>* object,
1985 unsigned int data_shndx,
1986 unsigned int sh_type,
1987 const unsigned char* prelocs,
1988 size_t reloc_count,
1989 Output_section* output_section,
1990 bool needs_special_offset_handling,
1991 size_t local_symbol_count,
1992 const unsigned char* plocal_symbols,
1993 Relocatable_relocs*);
1995 // Relocate a section during a relocatable link.
1996 void
1997 relocate_for_relocatable(const Relocate_info<32, big_endian>*,
1998 unsigned int sh_type,
1999 const unsigned char* prelocs,
2000 size_t reloc_count,
2001 Output_section* output_section,
2002 off_t offset_in_output_section,
2003 const Relocatable_relocs*,
2004 unsigned char* view,
2005 Arm_address view_address,
2006 section_size_type view_size,
2007 unsigned char* reloc_view,
2008 section_size_type reloc_view_size);
2010 // Return whether SYM is defined by the ABI.
2011 bool
2012 do_is_defined_by_abi(Symbol* sym) const
2013 { return strcmp(sym->name(), "__tls_get_addr") == 0; }
2015 // Return whether there is a GOT section.
2016 bool
2017 has_got_section() const
2018 { return this->got_ != NULL; }
2020 // Return the size of the GOT section.
2021 section_size_type
2022 got_size()
2024 gold_assert(this->got_ != NULL);
2025 return this->got_->data_size();
2028 // Map platform-specific reloc types
2029 static unsigned int
2030 get_real_reloc_type (unsigned int r_type);
2033 // Methods to support stub-generations.
2036 // Return the stub factory
2037 const Stub_factory&
2038 stub_factory() const
2039 { return this->stub_factory_; }
2041 // Make a new Arm_input_section object.
2042 Arm_input_section<big_endian>*
2043 new_arm_input_section(Relobj*, unsigned int);
2045 // Find the Arm_input_section object corresponding to the SHNDX-th input
2046 // section of RELOBJ.
2047 Arm_input_section<big_endian>*
2048 find_arm_input_section(Relobj* relobj, unsigned int shndx) const;
2050 // Make a new Stub_table
2051 Stub_table<big_endian>*
2052 new_stub_table(Arm_input_section<big_endian>*);
2054 // Scan a section for stub generation.
2055 void
2056 scan_section_for_stubs(const Relocate_info<32, big_endian>*, unsigned int,
2057 const unsigned char*, size_t, Output_section*,
2058 bool, const unsigned char*, Arm_address,
2059 section_size_type);
2061 // Relocate a stub.
2062 void
2063 relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
2064 Output_section*, unsigned char*, Arm_address,
2065 section_size_type);
2067 // Get the default ARM target.
2068 static Target_arm<big_endian>*
2069 default_target()
2071 gold_assert(parameters->target().machine_code() == elfcpp::EM_ARM
2072 && parameters->target().is_big_endian() == big_endian);
2073 return static_cast<Target_arm<big_endian>*>(
2074 parameters->sized_target<32, big_endian>());
2077 // Whether NAME belongs to a mapping symbol.
2078 static bool
2079 is_mapping_symbol_name(const char* name)
2081 return (name
2082 && name[0] == '$'
2083 && (name[1] == 'a' || name[1] == 't' || name[1] == 'd')
2084 && (name[2] == '\0' || name[2] == '.'));
2087 // Whether we work around the Cortex-A8 erratum.
2088 bool
2089 fix_cortex_a8() const
2090 { return this->fix_cortex_a8_; }
2092 // Whether we fix R_ARM_V4BX relocation.
2093 // 0 - do not fix
2094 // 1 - replace with MOV instruction (armv4 target)
2095 // 2 - make interworking veneer (>= armv4t targets only)
2096 General_options::Fix_v4bx
2097 fix_v4bx() const
2098 { return parameters->options().fix_v4bx(); }
2100 // Scan a span of THUMB code section for Cortex-A8 erratum.
2101 void
2102 scan_span_for_cortex_a8_erratum(Arm_relobj<big_endian>*, unsigned int,
2103 section_size_type, section_size_type,
2104 const unsigned char*, Arm_address);
2106 // Apply Cortex-A8 workaround to a branch.
2107 void
2108 apply_cortex_a8_workaround(const Cortex_a8_stub*, Arm_address,
2109 unsigned char*, Arm_address);
2111 protected:
2112 // Make an ELF object.
2113 Object*
2114 do_make_elf_object(const std::string&, Input_file*, off_t,
2115 const elfcpp::Ehdr<32, big_endian>& ehdr);
2117 Object*
2118 do_make_elf_object(const std::string&, Input_file*, off_t,
2119 const elfcpp::Ehdr<32, !big_endian>&)
2120 { gold_unreachable(); }
2122 Object*
2123 do_make_elf_object(const std::string&, Input_file*, off_t,
2124 const elfcpp::Ehdr<64, false>&)
2125 { gold_unreachable(); }
2127 Object*
2128 do_make_elf_object(const std::string&, Input_file*, off_t,
2129 const elfcpp::Ehdr<64, true>&)
2130 { gold_unreachable(); }
2132 // Make an output section.
2133 Output_section*
2134 do_make_output_section(const char* name, elfcpp::Elf_Word type,
2135 elfcpp::Elf_Xword flags)
2136 { return new Arm_output_section<big_endian>(name, type, flags); }
2138 void
2139 do_adjust_elf_header(unsigned char* view, int len) const;
2141 // We only need to generate stubs, and hence perform relaxation if we are
2142 // not doing relocatable linking.
2143 bool
2144 do_may_relax() const
2145 { return !parameters->options().relocatable(); }
2147 bool
2148 do_relax(int, const Input_objects*, Symbol_table*, Layout*);
2150 // Determine whether an object attribute tag takes an integer, a
2151 // string or both.
2153 do_attribute_arg_type(int tag) const;
2155 // Reorder tags during output.
2157 do_attributes_order(int num) const;
2159 // This is called when the target is selected as the default.
2160 void
2161 do_select_as_default_target()
2163 // No locking is required since there should only be one default target.
2164 // We cannot have both the big-endian and little-endian ARM targets
2165 // as the default.
2166 gold_assert(arm_reloc_property_table == NULL);
2167 arm_reloc_property_table = new Arm_reloc_property_table();
2170 private:
2171 // The class which scans relocations.
2172 class Scan
2174 public:
2175 Scan()
2176 : issued_non_pic_error_(false)
2179 inline void
2180 local(Symbol_table* symtab, Layout* layout, Target_arm* target,
2181 Sized_relobj<32, big_endian>* object,
2182 unsigned int data_shndx,
2183 Output_section* output_section,
2184 const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2185 const elfcpp::Sym<32, big_endian>& lsym);
2187 inline void
2188 global(Symbol_table* symtab, Layout* layout, Target_arm* target,
2189 Sized_relobj<32, big_endian>* object,
2190 unsigned int data_shndx,
2191 Output_section* output_section,
2192 const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2193 Symbol* gsym);
2195 inline bool
2196 local_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2197 Sized_relobj<32, big_endian>* ,
2198 unsigned int ,
2199 Output_section* ,
2200 const elfcpp::Rel<32, big_endian>& ,
2201 unsigned int ,
2202 const elfcpp::Sym<32, big_endian>&)
2203 { return false; }
2205 inline bool
2206 global_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2207 Sized_relobj<32, big_endian>* ,
2208 unsigned int ,
2209 Output_section* ,
2210 const elfcpp::Rel<32, big_endian>& ,
2211 unsigned int , Symbol*)
2212 { return false; }
2214 private:
2215 static void
2216 unsupported_reloc_local(Sized_relobj<32, big_endian>*,
2217 unsigned int r_type);
2219 static void
2220 unsupported_reloc_global(Sized_relobj<32, big_endian>*,
2221 unsigned int r_type, Symbol*);
2223 void
2224 check_non_pic(Relobj*, unsigned int r_type);
2226 // Almost identical to Symbol::needs_plt_entry except that it also
2227 // handles STT_ARM_TFUNC.
2228 static bool
2229 symbol_needs_plt_entry(const Symbol* sym)
2231 // An undefined symbol from an executable does not need a PLT entry.
2232 if (sym->is_undefined() && !parameters->options().shared())
2233 return false;
2235 return (!parameters->doing_static_link()
2236 && (sym->type() == elfcpp::STT_FUNC
2237 || sym->type() == elfcpp::STT_ARM_TFUNC)
2238 && (sym->is_from_dynobj()
2239 || sym->is_undefined()
2240 || sym->is_preemptible()));
2243 // Whether we have issued an error about a non-PIC compilation.
2244 bool issued_non_pic_error_;
2247 // The class which implements relocation.
2248 class Relocate
2250 public:
2251 Relocate()
2254 ~Relocate()
2257 // Return whether the static relocation needs to be applied.
2258 inline bool
2259 should_apply_static_reloc(const Sized_symbol<32>* gsym,
2260 int ref_flags,
2261 bool is_32bit,
2262 Output_section* output_section);
2264 // Do a relocation. Return false if the caller should not issue
2265 // any warnings about this relocation.
2266 inline bool
2267 relocate(const Relocate_info<32, big_endian>*, Target_arm*,
2268 Output_section*, size_t relnum,
2269 const elfcpp::Rel<32, big_endian>&,
2270 unsigned int r_type, const Sized_symbol<32>*,
2271 const Symbol_value<32>*,
2272 unsigned char*, Arm_address,
2273 section_size_type);
2275 // Return whether we want to pass flag NON_PIC_REF for this
2276 // reloc. This means the relocation type accesses a symbol not via
2277 // GOT or PLT.
2278 static inline bool
2279 reloc_is_non_pic (unsigned int r_type)
2281 switch (r_type)
2283 // These relocation types reference GOT or PLT entries explicitly.
2284 case elfcpp::R_ARM_GOT_BREL:
2285 case elfcpp::R_ARM_GOT_ABS:
2286 case elfcpp::R_ARM_GOT_PREL:
2287 case elfcpp::R_ARM_GOT_BREL12:
2288 case elfcpp::R_ARM_PLT32_ABS:
2289 case elfcpp::R_ARM_TLS_GD32:
2290 case elfcpp::R_ARM_TLS_LDM32:
2291 case elfcpp::R_ARM_TLS_IE32:
2292 case elfcpp::R_ARM_TLS_IE12GP:
2294 // These relocate types may use PLT entries.
2295 case elfcpp::R_ARM_CALL:
2296 case elfcpp::R_ARM_THM_CALL:
2297 case elfcpp::R_ARM_JUMP24:
2298 case elfcpp::R_ARM_THM_JUMP24:
2299 case elfcpp::R_ARM_THM_JUMP19:
2300 case elfcpp::R_ARM_PLT32:
2301 case elfcpp::R_ARM_THM_XPC22:
2302 return false;
2304 default:
2305 return true;
2309 private:
2310 // Do a TLS relocation.
2311 inline typename Arm_relocate_functions<big_endian>::Status
2312 relocate_tls(const Relocate_info<32, big_endian>*, Target_arm<big_endian>*,
2313 size_t, const elfcpp::Rel<32, big_endian>&, unsigned int,
2314 const Sized_symbol<32>*, const Symbol_value<32>*,
2315 unsigned char*, elfcpp::Elf_types<32>::Elf_Addr,
2316 section_size_type);
2320 // A class which returns the size required for a relocation type,
2321 // used while scanning relocs during a relocatable link.
2322 class Relocatable_size_for_reloc
2324 public:
2325 unsigned int
2326 get_size_for_reloc(unsigned int, Relobj*);
2329 // Adjust TLS relocation type based on the options and whether this
2330 // is a local symbol.
2331 static tls::Tls_optimization
2332 optimize_tls_reloc(bool is_final, int r_type);
2334 // Get the GOT section, creating it if necessary.
2335 Output_data_got<32, big_endian>*
2336 got_section(Symbol_table*, Layout*);
2338 // Get the GOT PLT section.
2339 Output_data_space*
2340 got_plt_section() const
2342 gold_assert(this->got_plt_ != NULL);
2343 return this->got_plt_;
2346 // Create a PLT entry for a global symbol.
2347 void
2348 make_plt_entry(Symbol_table*, Layout*, Symbol*);
2350 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
2351 void
2352 define_tls_base_symbol(Symbol_table*, Layout*);
2354 // Create a GOT entry for the TLS module index.
2355 unsigned int
2356 got_mod_index_entry(Symbol_table* symtab, Layout* layout,
2357 Sized_relobj<32, big_endian>* object);
2359 // Get the PLT section.
2360 const Output_data_plt_arm<big_endian>*
2361 plt_section() const
2363 gold_assert(this->plt_ != NULL);
2364 return this->plt_;
2367 // Get the dynamic reloc section, creating it if necessary.
2368 Reloc_section*
2369 rel_dyn_section(Layout*);
2371 // Get the section to use for TLS_DESC relocations.
2372 Reloc_section*
2373 rel_tls_desc_section(Layout*) const;
2375 // Return true if the symbol may need a COPY relocation.
2376 // References from an executable object to non-function symbols
2377 // defined in a dynamic object may need a COPY relocation.
2378 bool
2379 may_need_copy_reloc(Symbol* gsym)
2381 return (gsym->type() != elfcpp::STT_ARM_TFUNC
2382 && gsym->may_need_copy_reloc());
2385 // Add a potential copy relocation.
2386 void
2387 copy_reloc(Symbol_table* symtab, Layout* layout,
2388 Sized_relobj<32, big_endian>* object,
2389 unsigned int shndx, Output_section* output_section,
2390 Symbol* sym, const elfcpp::Rel<32, big_endian>& reloc)
2392 this->copy_relocs_.copy_reloc(symtab, layout,
2393 symtab->get_sized_symbol<32>(sym),
2394 object, shndx, output_section, reloc,
2395 this->rel_dyn_section(layout));
2398 // Whether two EABI versions are compatible.
2399 static bool
2400 are_eabi_versions_compatible(elfcpp::Elf_Word v1, elfcpp::Elf_Word v2);
2402 // Merge processor-specific flags from input object and those in the ELF
2403 // header of the output.
2404 void
2405 merge_processor_specific_flags(const std::string&, elfcpp::Elf_Word);
2407 // Get the secondary compatible architecture.
2408 static int
2409 get_secondary_compatible_arch(const Attributes_section_data*);
2411 // Set the secondary compatible architecture.
2412 static void
2413 set_secondary_compatible_arch(Attributes_section_data*, int);
2415 static int
2416 tag_cpu_arch_combine(const char*, int, int*, int, int);
2418 // Helper to print AEABI enum tag value.
2419 static std::string
2420 aeabi_enum_name(unsigned int);
2422 // Return string value for TAG_CPU_name.
2423 static std::string
2424 tag_cpu_name_value(unsigned int);
2426 // Merge object attributes from input object and those in the output.
2427 void
2428 merge_object_attributes(const char*, const Attributes_section_data*);
2430 // Helper to get an AEABI object attribute
2431 Object_attribute*
2432 get_aeabi_object_attribute(int tag) const
2434 Attributes_section_data* pasd = this->attributes_section_data_;
2435 gold_assert(pasd != NULL);
2436 Object_attribute* attr =
2437 pasd->get_attribute(Object_attribute::OBJ_ATTR_PROC, tag);
2438 gold_assert(attr != NULL);
2439 return attr;
2443 // Methods to support stub-generations.
2446 // Group input sections for stub generation.
2447 void
2448 group_sections(Layout*, section_size_type, bool);
2450 // Scan a relocation for stub generation.
2451 void
2452 scan_reloc_for_stub(const Relocate_info<32, big_endian>*, unsigned int,
2453 const Sized_symbol<32>*, unsigned int,
2454 const Symbol_value<32>*,
2455 elfcpp::Elf_types<32>::Elf_Swxword, Arm_address);
2457 // Scan a relocation section for stub.
2458 template<int sh_type>
2459 void
2460 scan_reloc_section_for_stubs(
2461 const Relocate_info<32, big_endian>* relinfo,
2462 const unsigned char* prelocs,
2463 size_t reloc_count,
2464 Output_section* output_section,
2465 bool needs_special_offset_handling,
2466 const unsigned char* view,
2467 elfcpp::Elf_types<32>::Elf_Addr view_address,
2468 section_size_type);
2470 // Fix .ARM.exidx section coverage.
2471 void
2472 fix_exidx_coverage(Layout*, Arm_output_section<big_endian>*, Symbol_table*);
2474 // Functors for STL set.
2475 struct output_section_address_less_than
2477 bool
2478 operator()(const Output_section* s1, const Output_section* s2) const
2479 { return s1->address() < s2->address(); }
2482 // Information about this specific target which we pass to the
2483 // general Target structure.
2484 static const Target::Target_info arm_info;
2486 // The types of GOT entries needed for this platform.
2487 enum Got_type
2489 GOT_TYPE_STANDARD = 0, // GOT entry for a regular symbol
2490 GOT_TYPE_TLS_NOFFSET = 1, // GOT entry for negative TLS offset
2491 GOT_TYPE_TLS_OFFSET = 2, // GOT entry for positive TLS offset
2492 GOT_TYPE_TLS_PAIR = 3, // GOT entry for TLS module/offset pair
2493 GOT_TYPE_TLS_DESC = 4 // GOT entry for TLS_DESC pair
2496 typedef typename std::vector<Stub_table<big_endian>*> Stub_table_list;
2498 // Map input section to Arm_input_section.
2499 typedef Unordered_map<Section_id,
2500 Arm_input_section<big_endian>*,
2501 Section_id_hash>
2502 Arm_input_section_map;
2504 // Map output addresses to relocs for Cortex-A8 erratum.
2505 typedef Unordered_map<Arm_address, const Cortex_a8_reloc*>
2506 Cortex_a8_relocs_info;
2508 // The GOT section.
2509 Output_data_got<32, big_endian>* got_;
2510 // The PLT section.
2511 Output_data_plt_arm<big_endian>* plt_;
2512 // The GOT PLT section.
2513 Output_data_space* got_plt_;
2514 // The dynamic reloc section.
2515 Reloc_section* rel_dyn_;
2516 // Relocs saved to avoid a COPY reloc.
2517 Copy_relocs<elfcpp::SHT_REL, 32, big_endian> copy_relocs_;
2518 // Space for variables copied with a COPY reloc.
2519 Output_data_space* dynbss_;
2520 // Offset of the GOT entry for the TLS module index.
2521 unsigned int got_mod_index_offset_;
2522 // True if the _TLS_MODULE_BASE_ symbol has been defined.
2523 bool tls_base_symbol_defined_;
2524 // Vector of Stub_tables created.
2525 Stub_table_list stub_tables_;
2526 // Stub factory.
2527 const Stub_factory &stub_factory_;
2528 // Whether we can use BLX.
2529 bool may_use_blx_;
2530 // Whether we force PIC branch veneers.
2531 bool should_force_pic_veneer_;
2532 // Map for locating Arm_input_sections.
2533 Arm_input_section_map arm_input_section_map_;
2534 // Attributes section data in output.
2535 Attributes_section_data* attributes_section_data_;
2536 // Whether we want to fix code for Cortex-A8 erratum.
2537 bool fix_cortex_a8_;
2538 // Map addresses to relocs for Cortex-A8 erratum.
2539 Cortex_a8_relocs_info cortex_a8_relocs_info_;
2542 template<bool big_endian>
2543 const Target::Target_info Target_arm<big_endian>::arm_info =
2545 32, // size
2546 big_endian, // is_big_endian
2547 elfcpp::EM_ARM, // machine_code
2548 false, // has_make_symbol
2549 false, // has_resolve
2550 false, // has_code_fill
2551 true, // is_default_stack_executable
2552 '\0', // wrap_char
2553 "/usr/lib/libc.so.1", // dynamic_linker
2554 0x8000, // default_text_segment_address
2555 0x1000, // abi_pagesize (overridable by -z max-page-size)
2556 0x1000, // common_pagesize (overridable by -z common-page-size)
2557 elfcpp::SHN_UNDEF, // small_common_shndx
2558 elfcpp::SHN_UNDEF, // large_common_shndx
2559 0, // small_common_section_flags
2560 0, // large_common_section_flags
2561 ".ARM.attributes", // attributes_section
2562 "aeabi" // attributes_vendor
2565 // Arm relocate functions class
2568 template<bool big_endian>
2569 class Arm_relocate_functions : public Relocate_functions<32, big_endian>
2571 public:
2572 typedef enum
2574 STATUS_OKAY, // No error during relocation.
2575 STATUS_OVERFLOW, // Relocation oveflow.
2576 STATUS_BAD_RELOC // Relocation cannot be applied.
2577 } Status;
2579 private:
2580 typedef Relocate_functions<32, big_endian> Base;
2581 typedef Arm_relocate_functions<big_endian> This;
2583 // Encoding of imm16 argument for movt and movw ARM instructions
2584 // from ARM ARM:
2586 // imm16 := imm4 | imm12
2588 // 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
2589 // +-------+---------------+-------+-------+-----------------------+
2590 // | | |imm4 | |imm12 |
2591 // +-------+---------------+-------+-------+-----------------------+
2593 // Extract the relocation addend from VAL based on the ARM
2594 // instruction encoding described above.
2595 static inline typename elfcpp::Swap<32, big_endian>::Valtype
2596 extract_arm_movw_movt_addend(
2597 typename elfcpp::Swap<32, big_endian>::Valtype val)
2599 // According to the Elf ABI for ARM Architecture the immediate
2600 // field is sign-extended to form the addend.
2601 return utils::sign_extend<16>(((val >> 4) & 0xf000) | (val & 0xfff));
2604 // Insert X into VAL based on the ARM instruction encoding described
2605 // above.
2606 static inline typename elfcpp::Swap<32, big_endian>::Valtype
2607 insert_val_arm_movw_movt(
2608 typename elfcpp::Swap<32, big_endian>::Valtype val,
2609 typename elfcpp::Swap<32, big_endian>::Valtype x)
2611 val &= 0xfff0f000;
2612 val |= x & 0x0fff;
2613 val |= (x & 0xf000) << 4;
2614 return val;
2617 // Encoding of imm16 argument for movt and movw Thumb2 instructions
2618 // from ARM ARM:
2620 // imm16 := imm4 | i | imm3 | imm8
2622 // 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
2623 // +---------+-+-----------+-------++-+-----+-------+---------------+
2624 // | |i| |imm4 || |imm3 | |imm8 |
2625 // +---------+-+-----------+-------++-+-----+-------+---------------+
2627 // Extract the relocation addend from VAL based on the Thumb2
2628 // instruction encoding described above.
2629 static inline typename elfcpp::Swap<32, big_endian>::Valtype
2630 extract_thumb_movw_movt_addend(
2631 typename elfcpp::Swap<32, big_endian>::Valtype val)
2633 // According to the Elf ABI for ARM Architecture the immediate
2634 // field is sign-extended to form the addend.
2635 return utils::sign_extend<16>(((val >> 4) & 0xf000)
2636 | ((val >> 15) & 0x0800)
2637 | ((val >> 4) & 0x0700)
2638 | (val & 0x00ff));
2641 // Insert X into VAL based on the Thumb2 instruction encoding
2642 // described above.
2643 static inline typename elfcpp::Swap<32, big_endian>::Valtype
2644 insert_val_thumb_movw_movt(
2645 typename elfcpp::Swap<32, big_endian>::Valtype val,
2646 typename elfcpp::Swap<32, big_endian>::Valtype x)
2648 val &= 0xfbf08f00;
2649 val |= (x & 0xf000) << 4;
2650 val |= (x & 0x0800) << 15;
2651 val |= (x & 0x0700) << 4;
2652 val |= (x & 0x00ff);
2653 return val;
2656 // Calculate the smallest constant Kn for the specified residual.
2657 // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
2658 static uint32_t
2659 calc_grp_kn(typename elfcpp::Swap<32, big_endian>::Valtype residual)
2661 int32_t msb;
2663 if (residual == 0)
2664 return 0;
2665 // Determine the most significant bit in the residual and
2666 // align the resulting value to a 2-bit boundary.
2667 for (msb = 30; (msb >= 0) && !(residual & (3 << msb)); msb -= 2)
2669 // The desired shift is now (msb - 6), or zero, whichever
2670 // is the greater.
2671 return (((msb - 6) < 0) ? 0 : (msb - 6));
2674 // Calculate the final residual for the specified group index.
2675 // If the passed group index is less than zero, the method will return
2676 // the value of the specified residual without any change.
2677 // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
2678 static typename elfcpp::Swap<32, big_endian>::Valtype
2679 calc_grp_residual(typename elfcpp::Swap<32, big_endian>::Valtype residual,
2680 const int group)
2682 for (int n = 0; n <= group; n++)
2684 // Calculate which part of the value to mask.
2685 uint32_t shift = calc_grp_kn(residual);
2686 // Calculate the residual for the next time around.
2687 residual &= ~(residual & (0xff << shift));
2690 return residual;
2693 // Calculate the value of Gn for the specified group index.
2694 // We return it in the form of an encoded constant-and-rotation.
2695 // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
2696 static typename elfcpp::Swap<32, big_endian>::Valtype
2697 calc_grp_gn(typename elfcpp::Swap<32, big_endian>::Valtype residual,
2698 const int group)
2700 typename elfcpp::Swap<32, big_endian>::Valtype gn = 0;
2701 uint32_t shift = 0;
2703 for (int n = 0; n <= group; n++)
2705 // Calculate which part of the value to mask.
2706 shift = calc_grp_kn(residual);
2707 // Calculate Gn in 32-bit as well as encoded constant-and-rotation form.
2708 gn = residual & (0xff << shift);
2709 // Calculate the residual for the next time around.
2710 residual &= ~gn;
2712 // Return Gn in the form of an encoded constant-and-rotation.
2713 return ((gn >> shift) | ((gn <= 0xff ? 0 : (32 - shift) / 2) << 8));
2716 public:
2717 // Handle ARM long branches.
2718 static typename This::Status
2719 arm_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
2720 unsigned char *, const Sized_symbol<32>*,
2721 const Arm_relobj<big_endian>*, unsigned int,
2722 const Symbol_value<32>*, Arm_address, Arm_address, bool);
2724 // Handle THUMB long branches.
2725 static typename This::Status
2726 thumb_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
2727 unsigned char *, const Sized_symbol<32>*,
2728 const Arm_relobj<big_endian>*, unsigned int,
2729 const Symbol_value<32>*, Arm_address, Arm_address, bool);
2732 // Return the branch offset of a 32-bit THUMB branch.
2733 static inline int32_t
2734 thumb32_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
2736 // We use the Thumb-2 encoding (backwards compatible with Thumb-1)
2737 // involving the J1 and J2 bits.
2738 uint32_t s = (upper_insn & (1U << 10)) >> 10;
2739 uint32_t upper = upper_insn & 0x3ffU;
2740 uint32_t lower = lower_insn & 0x7ffU;
2741 uint32_t j1 = (lower_insn & (1U << 13)) >> 13;
2742 uint32_t j2 = (lower_insn & (1U << 11)) >> 11;
2743 uint32_t i1 = j1 ^ s ? 0 : 1;
2744 uint32_t i2 = j2 ^ s ? 0 : 1;
2746 return utils::sign_extend<25>((s << 24) | (i1 << 23) | (i2 << 22)
2747 | (upper << 12) | (lower << 1));
2750 // Insert OFFSET to a 32-bit THUMB branch and return the upper instruction.
2751 // UPPER_INSN is the original upper instruction of the branch. Caller is
2752 // responsible for overflow checking and BLX offset adjustment.
2753 static inline uint16_t
2754 thumb32_branch_upper(uint16_t upper_insn, int32_t offset)
2756 uint32_t s = offset < 0 ? 1 : 0;
2757 uint32_t bits = static_cast<uint32_t>(offset);
2758 return (upper_insn & ~0x7ffU) | ((bits >> 12) & 0x3ffU) | (s << 10);
2761 // Insert OFFSET to a 32-bit THUMB branch and return the lower instruction.
2762 // LOWER_INSN is the original lower instruction of the branch. Caller is
2763 // responsible for overflow checking and BLX offset adjustment.
2764 static inline uint16_t
2765 thumb32_branch_lower(uint16_t lower_insn, int32_t offset)
2767 uint32_t s = offset < 0 ? 1 : 0;
2768 uint32_t bits = static_cast<uint32_t>(offset);
2769 return ((lower_insn & ~0x2fffU)
2770 | ((((bits >> 23) & 1) ^ !s) << 13)
2771 | ((((bits >> 22) & 1) ^ !s) << 11)
2772 | ((bits >> 1) & 0x7ffU));
2775 // Return the branch offset of a 32-bit THUMB conditional branch.
2776 static inline int32_t
2777 thumb32_cond_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
2779 uint32_t s = (upper_insn & 0x0400U) >> 10;
2780 uint32_t j1 = (lower_insn & 0x2000U) >> 13;
2781 uint32_t j2 = (lower_insn & 0x0800U) >> 11;
2782 uint32_t lower = (lower_insn & 0x07ffU);
2783 uint32_t upper = (s << 8) | (j2 << 7) | (j1 << 6) | (upper_insn & 0x003fU);
2785 return utils::sign_extend<21>((upper << 12) | (lower << 1));
2788 // Insert OFFSET to a 32-bit THUMB conditional branch and return the upper
2789 // instruction. UPPER_INSN is the original upper instruction of the branch.
2790 // Caller is responsible for overflow checking.
2791 static inline uint16_t
2792 thumb32_cond_branch_upper(uint16_t upper_insn, int32_t offset)
2794 uint32_t s = offset < 0 ? 1 : 0;
2795 uint32_t bits = static_cast<uint32_t>(offset);
2796 return (upper_insn & 0xfbc0U) | (s << 10) | ((bits & 0x0003f000U) >> 12);
2799 // Insert OFFSET to a 32-bit THUMB conditional branch and return the lower
2800 // instruction. LOWER_INSN is the original lower instruction of the branch.
2801 // Caller is reponsible for overflow checking.
2802 static inline uint16_t
2803 thumb32_cond_branch_lower(uint16_t lower_insn, int32_t offset)
2805 uint32_t bits = static_cast<uint32_t>(offset);
2806 uint32_t j2 = (bits & 0x00080000U) >> 19;
2807 uint32_t j1 = (bits & 0x00040000U) >> 18;
2808 uint32_t lo = (bits & 0x00000ffeU) >> 1;
2810 return (lower_insn & 0xd000U) | (j1 << 13) | (j2 << 11) | lo;
2813 // R_ARM_ABS8: S + A
2814 static inline typename This::Status
2815 abs8(unsigned char *view,
2816 const Sized_relobj<32, big_endian>* object,
2817 const Symbol_value<32>* psymval)
2819 typedef typename elfcpp::Swap<8, big_endian>::Valtype Valtype;
2820 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2821 Valtype* wv = reinterpret_cast<Valtype*>(view);
2822 Valtype val = elfcpp::Swap<8, big_endian>::readval(wv);
2823 Reltype addend = utils::sign_extend<8>(val);
2824 Reltype x = psymval->value(object, addend);
2825 val = utils::bit_select(val, x, 0xffU);
2826 elfcpp::Swap<8, big_endian>::writeval(wv, val);
2827 return (utils::has_signed_unsigned_overflow<8>(x)
2828 ? This::STATUS_OVERFLOW
2829 : This::STATUS_OKAY);
2832 // R_ARM_THM_ABS5: S + A
2833 static inline typename This::Status
2834 thm_abs5(unsigned char *view,
2835 const Sized_relobj<32, big_endian>* object,
2836 const Symbol_value<32>* psymval)
2838 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2839 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2840 Valtype* wv = reinterpret_cast<Valtype*>(view);
2841 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
2842 Reltype addend = (val & 0x7e0U) >> 6;
2843 Reltype x = psymval->value(object, addend);
2844 val = utils::bit_select(val, x << 6, 0x7e0U);
2845 elfcpp::Swap<16, big_endian>::writeval(wv, val);
2846 return (utils::has_overflow<5>(x)
2847 ? This::STATUS_OVERFLOW
2848 : This::STATUS_OKAY);
2851 // R_ARM_ABS12: S + A
2852 static inline typename This::Status
2853 abs12(unsigned char *view,
2854 const Sized_relobj<32, big_endian>* object,
2855 const Symbol_value<32>* psymval)
2857 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2858 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2859 Valtype* wv = reinterpret_cast<Valtype*>(view);
2860 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2861 Reltype addend = val & 0x0fffU;
2862 Reltype x = psymval->value(object, addend);
2863 val = utils::bit_select(val, x, 0x0fffU);
2864 elfcpp::Swap<32, big_endian>::writeval(wv, val);
2865 return (utils::has_overflow<12>(x)
2866 ? This::STATUS_OVERFLOW
2867 : This::STATUS_OKAY);
2870 // R_ARM_ABS16: S + A
2871 static inline typename This::Status
2872 abs16(unsigned char *view,
2873 const Sized_relobj<32, big_endian>* object,
2874 const Symbol_value<32>* psymval)
2876 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2877 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2878 Valtype* wv = reinterpret_cast<Valtype*>(view);
2879 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
2880 Reltype addend = utils::sign_extend<16>(val);
2881 Reltype x = psymval->value(object, addend);
2882 val = utils::bit_select(val, x, 0xffffU);
2883 elfcpp::Swap<16, big_endian>::writeval(wv, val);
2884 return (utils::has_signed_unsigned_overflow<16>(x)
2885 ? This::STATUS_OVERFLOW
2886 : This::STATUS_OKAY);
2889 // R_ARM_ABS32: (S + A) | T
2890 static inline typename This::Status
2891 abs32(unsigned char *view,
2892 const Sized_relobj<32, big_endian>* object,
2893 const Symbol_value<32>* psymval,
2894 Arm_address thumb_bit)
2896 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2897 Valtype* wv = reinterpret_cast<Valtype*>(view);
2898 Valtype addend = elfcpp::Swap<32, big_endian>::readval(wv);
2899 Valtype x = psymval->value(object, addend) | thumb_bit;
2900 elfcpp::Swap<32, big_endian>::writeval(wv, x);
2901 return This::STATUS_OKAY;
2904 // R_ARM_REL32: (S + A) | T - P
2905 static inline typename This::Status
2906 rel32(unsigned char *view,
2907 const Sized_relobj<32, big_endian>* object,
2908 const Symbol_value<32>* psymval,
2909 Arm_address address,
2910 Arm_address thumb_bit)
2912 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2913 Valtype* wv = reinterpret_cast<Valtype*>(view);
2914 Valtype addend = elfcpp::Swap<32, big_endian>::readval(wv);
2915 Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
2916 elfcpp::Swap<32, big_endian>::writeval(wv, x);
2917 return This::STATUS_OKAY;
2920 // R_ARM_THM_JUMP24: (S + A) | T - P
2921 static typename This::Status
2922 thm_jump19(unsigned char *view, const Arm_relobj<big_endian>* object,
2923 const Symbol_value<32>* psymval, Arm_address address,
2924 Arm_address thumb_bit);
2926 // R_ARM_THM_JUMP6: S + A – P
2927 static inline typename This::Status
2928 thm_jump6(unsigned char *view,
2929 const Sized_relobj<32, big_endian>* object,
2930 const Symbol_value<32>* psymval,
2931 Arm_address address)
2933 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2934 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
2935 Valtype* wv = reinterpret_cast<Valtype*>(view);
2936 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
2937 // bit[9]:bit[7:3]:’0’ (mask: 0x02f8)
2938 Reltype addend = (((val & 0x0200) >> 3) | ((val & 0x00f8) >> 2));
2939 Reltype x = (psymval->value(object, addend) - address);
2940 val = (val & 0xfd07) | ((x & 0x0040) << 3) | ((val & 0x003e) << 2);
2941 elfcpp::Swap<16, big_endian>::writeval(wv, val);
2942 // CZB does only forward jumps.
2943 return ((x > 0x007e)
2944 ? This::STATUS_OVERFLOW
2945 : This::STATUS_OKAY);
2948 // R_ARM_THM_JUMP8: S + A – P
2949 static inline typename This::Status
2950 thm_jump8(unsigned char *view,
2951 const Sized_relobj<32, big_endian>* object,
2952 const Symbol_value<32>* psymval,
2953 Arm_address address)
2955 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2956 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
2957 Valtype* wv = reinterpret_cast<Valtype*>(view);
2958 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
2959 Reltype addend = utils::sign_extend<8>((val & 0x00ff) << 1);
2960 Reltype x = (psymval->value(object, addend) - address);
2961 elfcpp::Swap<16, big_endian>::writeval(wv, (val & 0xff00) | ((x & 0x01fe) >> 1));
2962 return (utils::has_overflow<8>(x)
2963 ? This::STATUS_OVERFLOW
2964 : This::STATUS_OKAY);
2967 // R_ARM_THM_JUMP11: S + A – P
2968 static inline typename This::Status
2969 thm_jump11(unsigned char *view,
2970 const Sized_relobj<32, big_endian>* object,
2971 const Symbol_value<32>* psymval,
2972 Arm_address address)
2974 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2975 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
2976 Valtype* wv = reinterpret_cast<Valtype*>(view);
2977 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
2978 Reltype addend = utils::sign_extend<11>((val & 0x07ff) << 1);
2979 Reltype x = (psymval->value(object, addend) - address);
2980 elfcpp::Swap<16, big_endian>::writeval(wv, (val & 0xf800) | ((x & 0x0ffe) >> 1));
2981 return (utils::has_overflow<11>(x)
2982 ? This::STATUS_OVERFLOW
2983 : This::STATUS_OKAY);
2986 // R_ARM_BASE_PREL: B(S) + A - P
2987 static inline typename This::Status
2988 base_prel(unsigned char* view,
2989 Arm_address origin,
2990 Arm_address address)
2992 Base::rel32(view, origin - address);
2993 return STATUS_OKAY;
2996 // R_ARM_BASE_ABS: B(S) + A
2997 static inline typename This::Status
2998 base_abs(unsigned char* view,
2999 Arm_address origin)
3001 Base::rel32(view, origin);
3002 return STATUS_OKAY;
3005 // R_ARM_GOT_BREL: GOT(S) + A - GOT_ORG
3006 static inline typename This::Status
3007 got_brel(unsigned char* view,
3008 typename elfcpp::Swap<32, big_endian>::Valtype got_offset)
3010 Base::rel32(view, got_offset);
3011 return This::STATUS_OKAY;
3014 // R_ARM_GOT_PREL: GOT(S) + A - P
3015 static inline typename This::Status
3016 got_prel(unsigned char *view,
3017 Arm_address got_entry,
3018 Arm_address address)
3020 Base::rel32(view, got_entry - address);
3021 return This::STATUS_OKAY;
3024 // R_ARM_PREL: (S + A) | T - P
3025 static inline typename This::Status
3026 prel31(unsigned char *view,
3027 const Sized_relobj<32, big_endian>* object,
3028 const Symbol_value<32>* psymval,
3029 Arm_address address,
3030 Arm_address thumb_bit)
3032 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3033 Valtype* wv = reinterpret_cast<Valtype*>(view);
3034 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3035 Valtype addend = utils::sign_extend<31>(val);
3036 Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
3037 val = utils::bit_select(val, x, 0x7fffffffU);
3038 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3039 return (utils::has_overflow<31>(x) ?
3040 This::STATUS_OVERFLOW : This::STATUS_OKAY);
3043 // R_ARM_MOVW_ABS_NC: (S + A) | T (relative address base is )
3044 // R_ARM_MOVW_PREL_NC: (S + A) | T - P
3045 // R_ARM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3046 // R_ARM_MOVW_BREL: ((S + A) | T) - B(S)
3047 static inline typename This::Status
3048 movw(unsigned char* view,
3049 const Sized_relobj<32, big_endian>* object,
3050 const Symbol_value<32>* psymval,
3051 Arm_address relative_address_base,
3052 Arm_address thumb_bit,
3053 bool check_overflow)
3055 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3056 Valtype* wv = reinterpret_cast<Valtype*>(view);
3057 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3058 Valtype addend = This::extract_arm_movw_movt_addend(val);
3059 Valtype x = ((psymval->value(object, addend) | thumb_bit)
3060 - relative_address_base);
3061 val = This::insert_val_arm_movw_movt(val, x);
3062 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3063 return ((check_overflow && utils::has_overflow<16>(x))
3064 ? This::STATUS_OVERFLOW
3065 : This::STATUS_OKAY);
3068 // R_ARM_MOVT_ABS: S + A (relative address base is 0)
3069 // R_ARM_MOVT_PREL: S + A - P
3070 // R_ARM_MOVT_BREL: S + A - B(S)
3071 static inline typename This::Status
3072 movt(unsigned char* view,
3073 const Sized_relobj<32, big_endian>* object,
3074 const Symbol_value<32>* psymval,
3075 Arm_address relative_address_base)
3077 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3078 Valtype* wv = reinterpret_cast<Valtype*>(view);
3079 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3080 Valtype addend = This::extract_arm_movw_movt_addend(val);
3081 Valtype x = (psymval->value(object, addend) - relative_address_base) >> 16;
3082 val = This::insert_val_arm_movw_movt(val, x);
3083 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3084 // FIXME: IHI0044D says that we should check for overflow.
3085 return This::STATUS_OKAY;
3088 // R_ARM_THM_MOVW_ABS_NC: S + A | T (relative_address_base is 0)
3089 // R_ARM_THM_MOVW_PREL_NC: (S + A) | T - P
3090 // R_ARM_THM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3091 // R_ARM_THM_MOVW_BREL: ((S + A) | T) - B(S)
3092 static inline typename This::Status
3093 thm_movw(unsigned char *view,
3094 const Sized_relobj<32, big_endian>* object,
3095 const Symbol_value<32>* psymval,
3096 Arm_address relative_address_base,
3097 Arm_address thumb_bit,
3098 bool check_overflow)
3100 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3101 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3102 Valtype* wv = reinterpret_cast<Valtype*>(view);
3103 Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3104 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3105 Reltype addend = This::extract_thumb_movw_movt_addend(val);
3106 Reltype x =
3107 (psymval->value(object, addend) | thumb_bit) - relative_address_base;
3108 val = This::insert_val_thumb_movw_movt(val, x);
3109 elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3110 elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
3111 return ((check_overflow && utils::has_overflow<16>(x))
3112 ? This::STATUS_OVERFLOW
3113 : This::STATUS_OKAY);
3116 // R_ARM_THM_MOVT_ABS: S + A (relative address base is 0)
3117 // R_ARM_THM_MOVT_PREL: S + A - P
3118 // R_ARM_THM_MOVT_BREL: S + A - B(S)
3119 static inline typename This::Status
3120 thm_movt(unsigned char* view,
3121 const Sized_relobj<32, big_endian>* object,
3122 const Symbol_value<32>* psymval,
3123 Arm_address relative_address_base)
3125 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3126 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3127 Valtype* wv = reinterpret_cast<Valtype*>(view);
3128 Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3129 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3130 Reltype addend = This::extract_thumb_movw_movt_addend(val);
3131 Reltype x = (psymval->value(object, addend) - relative_address_base) >> 16;
3132 val = This::insert_val_thumb_movw_movt(val, x);
3133 elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3134 elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
3135 return This::STATUS_OKAY;
3138 // R_ARM_THM_ALU_PREL_11_0: ((S + A) | T) - Pa (Thumb32)
3139 static inline typename This::Status
3140 thm_alu11(unsigned char* view,
3141 const Sized_relobj<32, big_endian>* object,
3142 const Symbol_value<32>* psymval,
3143 Arm_address address,
3144 Arm_address thumb_bit)
3146 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3147 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3148 Valtype* wv = reinterpret_cast<Valtype*>(view);
3149 Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3150 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3152 // 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
3153 // -----------------------------------------------------------------------
3154 // ADD{S} 1 1 1 1 0|i|0|1 0 0 0|S|1 1 0 1||0|imm3 |Rd |imm8
3155 // ADDW 1 1 1 1 0|i|1|0 0 0 0|0|1 1 0 1||0|imm3 |Rd |imm8
3156 // ADR[+] 1 1 1 1 0|i|1|0 0 0 0|0|1 1 1 1||0|imm3 |Rd |imm8
3157 // SUB{S} 1 1 1 1 0|i|0|1 1 0 1|S|1 1 0 1||0|imm3 |Rd |imm8
3158 // SUBW 1 1 1 1 0|i|1|0 1 0 1|0|1 1 0 1||0|imm3 |Rd |imm8
3159 // ADR[-] 1 1 1 1 0|i|1|0 1 0 1|0|1 1 1 1||0|imm3 |Rd |imm8
3161 // Determine a sign for the addend.
3162 const int sign = ((insn & 0xf8ef0000) == 0xf0ad0000
3163 || (insn & 0xf8ef0000) == 0xf0af0000) ? -1 : 1;
3164 // Thumb2 addend encoding:
3165 // imm12 := i | imm3 | imm8
3166 int32_t addend = (insn & 0xff)
3167 | ((insn & 0x00007000) >> 4)
3168 | ((insn & 0x04000000) >> 15);
3169 // Apply a sign to the added.
3170 addend *= sign;
3172 int32_t x = (psymval->value(object, addend) | thumb_bit)
3173 - (address & 0xfffffffc);
3174 Reltype val = abs(x);
3175 // Mask out the value and a distinct part of the ADD/SUB opcode
3176 // (bits 7:5 of opword).
3177 insn = (insn & 0xfb0f8f00)
3178 | (val & 0xff)
3179 | ((val & 0x700) << 4)
3180 | ((val & 0x800) << 15);
3181 // Set the opcode according to whether the value to go in the
3182 // place is negative.
3183 if (x < 0)
3184 insn |= 0x00a00000;
3186 elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3187 elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3188 return ((val > 0xfff) ?
3189 This::STATUS_OVERFLOW : This::STATUS_OKAY);
3192 // R_ARM_THM_PC8: S + A - Pa (Thumb)
3193 static inline typename This::Status
3194 thm_pc8(unsigned char* view,
3195 const Sized_relobj<32, big_endian>* object,
3196 const Symbol_value<32>* psymval,
3197 Arm_address address)
3199 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3200 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3201 Valtype* wv = reinterpret_cast<Valtype*>(view);
3202 Valtype insn = elfcpp::Swap<16, big_endian>::readval(wv);
3203 Reltype addend = ((insn & 0x00ff) << 2);
3204 int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3205 Reltype val = abs(x);
3206 insn = (insn & 0xff00) | ((val & 0x03fc) >> 2);
3208 elfcpp::Swap<16, big_endian>::writeval(wv, insn);
3209 return ((val > 0x03fc)
3210 ? This::STATUS_OVERFLOW
3211 : This::STATUS_OKAY);
3214 // R_ARM_THM_PC12: S + A - Pa (Thumb32)
3215 static inline typename This::Status
3216 thm_pc12(unsigned char* view,
3217 const Sized_relobj<32, big_endian>* object,
3218 const Symbol_value<32>* psymval,
3219 Arm_address address)
3221 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3222 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3223 Valtype* wv = reinterpret_cast<Valtype*>(view);
3224 Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3225 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3226 // Determine a sign for the addend (positive if the U bit is 1).
3227 const int sign = (insn & 0x00800000) ? 1 : -1;
3228 int32_t addend = (insn & 0xfff);
3229 // Apply a sign to the added.
3230 addend *= sign;
3232 int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3233 Reltype val = abs(x);
3234 // Mask out and apply the value and the U bit.
3235 insn = (insn & 0xff7ff000) | (val & 0xfff);
3236 // Set the U bit according to whether the value to go in the
3237 // place is positive.
3238 if (x >= 0)
3239 insn |= 0x00800000;
3241 elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3242 elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3243 return ((val > 0xfff) ?
3244 This::STATUS_OVERFLOW : This::STATUS_OKAY);
3247 // R_ARM_V4BX
3248 static inline typename This::Status
3249 v4bx(const Relocate_info<32, big_endian>* relinfo,
3250 unsigned char *view,
3251 const Arm_relobj<big_endian>* object,
3252 const Arm_address address,
3253 const bool is_interworking)
3256 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3257 Valtype* wv = reinterpret_cast<Valtype*>(view);
3258 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3260 // Ensure that we have a BX instruction.
3261 gold_assert((val & 0x0ffffff0) == 0x012fff10);
3262 const uint32_t reg = (val & 0xf);
3263 if (is_interworking && reg != 0xf)
3265 Stub_table<big_endian>* stub_table =
3266 object->stub_table(relinfo->data_shndx);
3267 gold_assert(stub_table != NULL);
3269 Arm_v4bx_stub* stub = stub_table->find_arm_v4bx_stub(reg);
3270 gold_assert(stub != NULL);
3272 int32_t veneer_address =
3273 stub_table->address() + stub->offset() - 8 - address;
3274 gold_assert((veneer_address <= ARM_MAX_FWD_BRANCH_OFFSET)
3275 && (veneer_address >= ARM_MAX_BWD_BRANCH_OFFSET));
3276 // Replace with a branch to veneer (B <addr>)
3277 val = (val & 0xf0000000) | 0x0a000000
3278 | ((veneer_address >> 2) & 0x00ffffff);
3280 else
3282 // Preserve Rm (lowest four bits) and the condition code
3283 // (highest four bits). Other bits encode MOV PC,Rm.
3284 val = (val & 0xf000000f) | 0x01a0f000;
3286 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3287 return This::STATUS_OKAY;
3290 // R_ARM_ALU_PC_G0_NC: ((S + A) | T) - P
3291 // R_ARM_ALU_PC_G0: ((S + A) | T) - P
3292 // R_ARM_ALU_PC_G1_NC: ((S + A) | T) - P
3293 // R_ARM_ALU_PC_G1: ((S + A) | T) - P
3294 // R_ARM_ALU_PC_G2: ((S + A) | T) - P
3295 // R_ARM_ALU_SB_G0_NC: ((S + A) | T) - B(S)
3296 // R_ARM_ALU_SB_G0: ((S + A) | T) - B(S)
3297 // R_ARM_ALU_SB_G1_NC: ((S + A) | T) - B(S)
3298 // R_ARM_ALU_SB_G1: ((S + A) | T) - B(S)
3299 // R_ARM_ALU_SB_G2: ((S + A) | T) - B(S)
3300 static inline typename This::Status
3301 arm_grp_alu(unsigned char* view,
3302 const Sized_relobj<32, big_endian>* object,
3303 const Symbol_value<32>* psymval,
3304 const int group,
3305 Arm_address address,
3306 Arm_address thumb_bit,
3307 bool check_overflow)
3309 gold_assert(group >= 0 && group < 3);
3310 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3311 Valtype* wv = reinterpret_cast<Valtype*>(view);
3312 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3314 // ALU group relocations are allowed only for the ADD/SUB instructions.
3315 // (0x00800000 - ADD, 0x00400000 - SUB)
3316 const Valtype opcode = insn & 0x01e00000;
3317 if (opcode != 0x00800000 && opcode != 0x00400000)
3318 return This::STATUS_BAD_RELOC;
3320 // Determine a sign for the addend.
3321 const int sign = (opcode == 0x00800000) ? 1 : -1;
3322 // shifter = rotate_imm * 2
3323 const uint32_t shifter = (insn & 0xf00) >> 7;
3324 // Initial addend value.
3325 int32_t addend = insn & 0xff;
3326 // Rotate addend right by shifter.
3327 addend = (addend >> shifter) | (addend << (32 - shifter));
3328 // Apply a sign to the added.
3329 addend *= sign;
3331 int32_t x = ((psymval->value(object, addend) | thumb_bit) - address);
3332 Valtype gn = Arm_relocate_functions::calc_grp_gn(abs(x), group);
3333 // Check for overflow if required
3334 if (check_overflow
3335 && (Arm_relocate_functions::calc_grp_residual(abs(x), group) != 0))
3336 return This::STATUS_OVERFLOW;
3338 // Mask out the value and the ADD/SUB part of the opcode; take care
3339 // not to destroy the S bit.
3340 insn &= 0xff1ff000;
3341 // Set the opcode according to whether the value to go in the
3342 // place is negative.
3343 insn |= ((x < 0) ? 0x00400000 : 0x00800000);
3344 // Encode the offset (encoded Gn).
3345 insn |= gn;
3347 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3348 return This::STATUS_OKAY;
3351 // R_ARM_LDR_PC_G0: S + A - P
3352 // R_ARM_LDR_PC_G1: S + A - P
3353 // R_ARM_LDR_PC_G2: S + A - P
3354 // R_ARM_LDR_SB_G0: S + A - B(S)
3355 // R_ARM_LDR_SB_G1: S + A - B(S)
3356 // R_ARM_LDR_SB_G2: S + A - B(S)
3357 static inline typename This::Status
3358 arm_grp_ldr(unsigned char* view,
3359 const Sized_relobj<32, big_endian>* object,
3360 const Symbol_value<32>* psymval,
3361 const int group,
3362 Arm_address address)
3364 gold_assert(group >= 0 && group < 3);
3365 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3366 Valtype* wv = reinterpret_cast<Valtype*>(view);
3367 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3369 const int sign = (insn & 0x00800000) ? 1 : -1;
3370 int32_t addend = (insn & 0xfff) * sign;
3371 int32_t x = (psymval->value(object, addend) - address);
3372 // Calculate the relevant G(n-1) value to obtain this stage residual.
3373 Valtype residual =
3374 Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3375 if (residual >= 0x1000)
3376 return This::STATUS_OVERFLOW;
3378 // Mask out the value and U bit.
3379 insn &= 0xff7ff000;
3380 // Set the U bit for non-negative values.
3381 if (x >= 0)
3382 insn |= 0x00800000;
3383 insn |= residual;
3385 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3386 return This::STATUS_OKAY;
3389 // R_ARM_LDRS_PC_G0: S + A - P
3390 // R_ARM_LDRS_PC_G1: S + A - P
3391 // R_ARM_LDRS_PC_G2: S + A - P
3392 // R_ARM_LDRS_SB_G0: S + A - B(S)
3393 // R_ARM_LDRS_SB_G1: S + A - B(S)
3394 // R_ARM_LDRS_SB_G2: S + A - B(S)
3395 static inline typename This::Status
3396 arm_grp_ldrs(unsigned char* view,
3397 const Sized_relobj<32, big_endian>* object,
3398 const Symbol_value<32>* psymval,
3399 const int group,
3400 Arm_address address)
3402 gold_assert(group >= 0 && group < 3);
3403 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3404 Valtype* wv = reinterpret_cast<Valtype*>(view);
3405 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3407 const int sign = (insn & 0x00800000) ? 1 : -1;
3408 int32_t addend = (((insn & 0xf00) >> 4) + (insn & 0xf)) * sign;
3409 int32_t x = (psymval->value(object, addend) - address);
3410 // Calculate the relevant G(n-1) value to obtain this stage residual.
3411 Valtype residual =
3412 Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3413 if (residual >= 0x100)
3414 return This::STATUS_OVERFLOW;
3416 // Mask out the value and U bit.
3417 insn &= 0xff7ff0f0;
3418 // Set the U bit for non-negative values.
3419 if (x >= 0)
3420 insn |= 0x00800000;
3421 insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
3423 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3424 return This::STATUS_OKAY;
3427 // R_ARM_LDC_PC_G0: S + A - P
3428 // R_ARM_LDC_PC_G1: S + A - P
3429 // R_ARM_LDC_PC_G2: S + A - P
3430 // R_ARM_LDC_SB_G0: S + A - B(S)
3431 // R_ARM_LDC_SB_G1: S + A - B(S)
3432 // R_ARM_LDC_SB_G2: S + A - B(S)
3433 static inline typename This::Status
3434 arm_grp_ldc(unsigned char* view,
3435 const Sized_relobj<32, big_endian>* object,
3436 const Symbol_value<32>* psymval,
3437 const int group,
3438 Arm_address address)
3440 gold_assert(group >= 0 && group < 3);
3441 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3442 Valtype* wv = reinterpret_cast<Valtype*>(view);
3443 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3445 const int sign = (insn & 0x00800000) ? 1 : -1;
3446 int32_t addend = ((insn & 0xff) << 2) * sign;
3447 int32_t x = (psymval->value(object, addend) - address);
3448 // Calculate the relevant G(n-1) value to obtain this stage residual.
3449 Valtype residual =
3450 Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3451 if ((residual & 0x3) != 0 || residual >= 0x400)
3452 return This::STATUS_OVERFLOW;
3454 // Mask out the value and U bit.
3455 insn &= 0xff7fff00;
3456 // Set the U bit for non-negative values.
3457 if (x >= 0)
3458 insn |= 0x00800000;
3459 insn |= (residual >> 2);
3461 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3462 return This::STATUS_OKAY;
3466 // Relocate ARM long branches. This handles relocation types
3467 // R_ARM_CALL, R_ARM_JUMP24, R_ARM_PLT32 and R_ARM_XPC25.
3468 // If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
3469 // undefined and we do not use PLT in this relocation. In such a case,
3470 // the branch is converted into an NOP.
3472 template<bool big_endian>
3473 typename Arm_relocate_functions<big_endian>::Status
3474 Arm_relocate_functions<big_endian>::arm_branch_common(
3475 unsigned int r_type,
3476 const Relocate_info<32, big_endian>* relinfo,
3477 unsigned char *view,
3478 const Sized_symbol<32>* gsym,
3479 const Arm_relobj<big_endian>* object,
3480 unsigned int r_sym,
3481 const Symbol_value<32>* psymval,
3482 Arm_address address,
3483 Arm_address thumb_bit,
3484 bool is_weakly_undefined_without_plt)
3486 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3487 Valtype* wv = reinterpret_cast<Valtype*>(view);
3488 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3490 bool insn_is_b = (((val >> 28) & 0xf) <= 0xe)
3491 && ((val & 0x0f000000UL) == 0x0a000000UL);
3492 bool insn_is_uncond_bl = (val & 0xff000000UL) == 0xeb000000UL;
3493 bool insn_is_cond_bl = (((val >> 28) & 0xf) < 0xe)
3494 && ((val & 0x0f000000UL) == 0x0b000000UL);
3495 bool insn_is_blx = (val & 0xfe000000UL) == 0xfa000000UL;
3496 bool insn_is_any_branch = (val & 0x0e000000UL) == 0x0a000000UL;
3498 // Check that the instruction is valid.
3499 if (r_type == elfcpp::R_ARM_CALL)
3501 if (!insn_is_uncond_bl && !insn_is_blx)
3502 return This::STATUS_BAD_RELOC;
3504 else if (r_type == elfcpp::R_ARM_JUMP24)
3506 if (!insn_is_b && !insn_is_cond_bl)
3507 return This::STATUS_BAD_RELOC;
3509 else if (r_type == elfcpp::R_ARM_PLT32)
3511 if (!insn_is_any_branch)
3512 return This::STATUS_BAD_RELOC;
3514 else if (r_type == elfcpp::R_ARM_XPC25)
3516 // FIXME: AAELF document IH0044C does not say much about it other
3517 // than it being obsolete.
3518 if (!insn_is_any_branch)
3519 return This::STATUS_BAD_RELOC;
3521 else
3522 gold_unreachable();
3524 // A branch to an undefined weak symbol is turned into a jump to
3525 // the next instruction unless a PLT entry will be created.
3526 // Do the same for local undefined symbols.
3527 // The jump to the next instruction is optimized as a NOP depending
3528 // on the architecture.
3529 const Target_arm<big_endian>* arm_target =
3530 Target_arm<big_endian>::default_target();
3531 if (is_weakly_undefined_without_plt)
3533 Valtype cond = val & 0xf0000000U;
3534 if (arm_target->may_use_arm_nop())
3535 val = cond | 0x0320f000;
3536 else
3537 val = cond | 0x01a00000; // Using pre-UAL nop: mov r0, r0.
3538 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3539 return This::STATUS_OKAY;
3542 Valtype addend = utils::sign_extend<26>(val << 2);
3543 Valtype branch_target = psymval->value(object, addend);
3544 int32_t branch_offset = branch_target - address;
3546 // We need a stub if the branch offset is too large or if we need
3547 // to switch mode.
3548 bool may_use_blx = arm_target->may_use_blx();
3549 Reloc_stub* stub = NULL;
3550 if (utils::has_overflow<26>(branch_offset)
3551 || ((thumb_bit != 0) && !(may_use_blx && r_type == elfcpp::R_ARM_CALL)))
3553 Valtype unadjusted_branch_target = psymval->value(object, 0);
3555 Stub_type stub_type =
3556 Reloc_stub::stub_type_for_reloc(r_type, address,
3557 unadjusted_branch_target,
3558 (thumb_bit != 0));
3559 if (stub_type != arm_stub_none)
3561 Stub_table<big_endian>* stub_table =
3562 object->stub_table(relinfo->data_shndx);
3563 gold_assert(stub_table != NULL);
3565 Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
3566 stub = stub_table->find_reloc_stub(stub_key);
3567 gold_assert(stub != NULL);
3568 thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
3569 branch_target = stub_table->address() + stub->offset() + addend;
3570 branch_offset = branch_target - address;
3571 gold_assert(!utils::has_overflow<26>(branch_offset));
3575 // At this point, if we still need to switch mode, the instruction
3576 // must either be a BLX or a BL that can be converted to a BLX.
3577 if (thumb_bit != 0)
3579 // Turn BL to BLX.
3580 gold_assert(may_use_blx && r_type == elfcpp::R_ARM_CALL);
3581 val = (val & 0xffffff) | 0xfa000000 | ((branch_offset & 2) << 23);
3584 val = utils::bit_select(val, (branch_offset >> 2), 0xffffffUL);
3585 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3586 return (utils::has_overflow<26>(branch_offset)
3587 ? This::STATUS_OVERFLOW : This::STATUS_OKAY);
3590 // Relocate THUMB long branches. This handles relocation types
3591 // R_ARM_THM_CALL, R_ARM_THM_JUMP24 and R_ARM_THM_XPC22.
3592 // If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
3593 // undefined and we do not use PLT in this relocation. In such a case,
3594 // the branch is converted into an NOP.
3596 template<bool big_endian>
3597 typename Arm_relocate_functions<big_endian>::Status
3598 Arm_relocate_functions<big_endian>::thumb_branch_common(
3599 unsigned int r_type,
3600 const Relocate_info<32, big_endian>* relinfo,
3601 unsigned char *view,
3602 const Sized_symbol<32>* gsym,
3603 const Arm_relobj<big_endian>* object,
3604 unsigned int r_sym,
3605 const Symbol_value<32>* psymval,
3606 Arm_address address,
3607 Arm_address thumb_bit,
3608 bool is_weakly_undefined_without_plt)
3610 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3611 Valtype* wv = reinterpret_cast<Valtype*>(view);
3612 uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
3613 uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
3615 // FIXME: These tests are too loose and do not take THUMB/THUMB-2 difference
3616 // into account.
3617 bool is_bl_insn = (lower_insn & 0x1000U) == 0x1000U;
3618 bool is_blx_insn = (lower_insn & 0x1000U) == 0x0000U;
3620 // Check that the instruction is valid.
3621 if (r_type == elfcpp::R_ARM_THM_CALL)
3623 if (!is_bl_insn && !is_blx_insn)
3624 return This::STATUS_BAD_RELOC;
3626 else if (r_type == elfcpp::R_ARM_THM_JUMP24)
3628 // This cannot be a BLX.
3629 if (!is_bl_insn)
3630 return This::STATUS_BAD_RELOC;
3632 else if (r_type == elfcpp::R_ARM_THM_XPC22)
3634 // Check for Thumb to Thumb call.
3635 if (!is_blx_insn)
3636 return This::STATUS_BAD_RELOC;
3637 if (thumb_bit != 0)
3639 gold_warning(_("%s: Thumb BLX instruction targets "
3640 "thumb function '%s'."),
3641 object->name().c_str(),
3642 (gsym ? gsym->name() : "(local)"));
3643 // Convert BLX to BL.
3644 lower_insn |= 0x1000U;
3647 else
3648 gold_unreachable();
3650 // A branch to an undefined weak symbol is turned into a jump to
3651 // the next instruction unless a PLT entry will be created.
3652 // The jump to the next instruction is optimized as a NOP.W for
3653 // Thumb-2 enabled architectures.
3654 const Target_arm<big_endian>* arm_target =
3655 Target_arm<big_endian>::default_target();
3656 if (is_weakly_undefined_without_plt)
3658 if (arm_target->may_use_thumb2_nop())
3660 elfcpp::Swap<16, big_endian>::writeval(wv, 0xf3af);
3661 elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0x8000);
3663 else
3665 elfcpp::Swap<16, big_endian>::writeval(wv, 0xe000);
3666 elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0xbf00);
3668 return This::STATUS_OKAY;
3671 int32_t addend = This::thumb32_branch_offset(upper_insn, lower_insn);
3672 Arm_address branch_target = psymval->value(object, addend);
3673 int32_t branch_offset = branch_target - address;
3675 // We need a stub if the branch offset is too large or if we need
3676 // to switch mode.
3677 bool may_use_blx = arm_target->may_use_blx();
3678 bool thumb2 = arm_target->using_thumb2();
3679 if ((!thumb2 && utils::has_overflow<23>(branch_offset))
3680 || (thumb2 && utils::has_overflow<25>(branch_offset))
3681 || ((thumb_bit == 0)
3682 && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
3683 || r_type == elfcpp::R_ARM_THM_JUMP24)))
3685 Arm_address unadjusted_branch_target = psymval->value(object, 0);
3687 Stub_type stub_type =
3688 Reloc_stub::stub_type_for_reloc(r_type, address,
3689 unadjusted_branch_target,
3690 (thumb_bit != 0));
3692 if (stub_type != arm_stub_none)
3694 Stub_table<big_endian>* stub_table =
3695 object->stub_table(relinfo->data_shndx);
3696 gold_assert(stub_table != NULL);
3698 Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
3699 Reloc_stub* stub = stub_table->find_reloc_stub(stub_key);
3700 gold_assert(stub != NULL);
3701 thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
3702 branch_target = stub_table->address() + stub->offset() + addend;
3703 branch_offset = branch_target - address;
3707 // At this point, if we still need to switch mode, the instruction
3708 // must either be a BLX or a BL that can be converted to a BLX.
3709 if (thumb_bit == 0)
3711 gold_assert(may_use_blx
3712 && (r_type == elfcpp::R_ARM_THM_CALL
3713 || r_type == elfcpp::R_ARM_THM_XPC22));
3714 // Make sure this is a BLX.
3715 lower_insn &= ~0x1000U;
3717 else
3719 // Make sure this is a BL.
3720 lower_insn |= 0x1000U;
3723 if ((lower_insn & 0x5000U) == 0x4000U)
3724 // For a BLX instruction, make sure that the relocation is rounded up
3725 // to a word boundary. This follows the semantics of the instruction
3726 // which specifies that bit 1 of the target address will come from bit
3727 // 1 of the base address.
3728 branch_offset = (branch_offset + 2) & ~3;
3730 // Put BRANCH_OFFSET back into the insn. Assumes two's complement.
3731 // We use the Thumb-2 encoding, which is safe even if dealing with
3732 // a Thumb-1 instruction by virtue of our overflow check above. */
3733 upper_insn = This::thumb32_branch_upper(upper_insn, branch_offset);
3734 lower_insn = This::thumb32_branch_lower(lower_insn, branch_offset);
3736 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
3737 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
3739 return ((thumb2
3740 ? utils::has_overflow<25>(branch_offset)
3741 : utils::has_overflow<23>(branch_offset))
3742 ? This::STATUS_OVERFLOW
3743 : This::STATUS_OKAY);
3746 // Relocate THUMB-2 long conditional branches.
3747 // If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
3748 // undefined and we do not use PLT in this relocation. In such a case,
3749 // the branch is converted into an NOP.
3751 template<bool big_endian>
3752 typename Arm_relocate_functions<big_endian>::Status
3753 Arm_relocate_functions<big_endian>::thm_jump19(
3754 unsigned char *view,
3755 const Arm_relobj<big_endian>* object,
3756 const Symbol_value<32>* psymval,
3757 Arm_address address,
3758 Arm_address thumb_bit)
3760 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3761 Valtype* wv = reinterpret_cast<Valtype*>(view);
3762 uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
3763 uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
3764 int32_t addend = This::thumb32_cond_branch_offset(upper_insn, lower_insn);
3766 Arm_address branch_target = psymval->value(object, addend);
3767 int32_t branch_offset = branch_target - address;
3769 // ??? Should handle interworking? GCC might someday try to
3770 // use this for tail calls.
3771 // FIXME: We do support thumb entry to PLT yet.
3772 if (thumb_bit == 0)
3774 gold_error(_("conditional branch to PLT in THUMB-2 not supported yet."));
3775 return This::STATUS_BAD_RELOC;
3778 // Put RELOCATION back into the insn.
3779 upper_insn = This::thumb32_cond_branch_upper(upper_insn, branch_offset);
3780 lower_insn = This::thumb32_cond_branch_lower(lower_insn, branch_offset);
3782 // Put the relocated value back in the object file:
3783 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
3784 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
3786 return (utils::has_overflow<21>(branch_offset)
3787 ? This::STATUS_OVERFLOW
3788 : This::STATUS_OKAY);
3791 // Get the GOT section, creating it if necessary.
3793 template<bool big_endian>
3794 Output_data_got<32, big_endian>*
3795 Target_arm<big_endian>::got_section(Symbol_table* symtab, Layout* layout)
3797 if (this->got_ == NULL)
3799 gold_assert(symtab != NULL && layout != NULL);
3801 this->got_ = new Output_data_got<32, big_endian>();
3803 Output_section* os;
3804 os = layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
3805 (elfcpp::SHF_ALLOC
3806 | elfcpp::SHF_WRITE),
3807 this->got_, false, true, true,
3808 false);
3810 // The old GNU linker creates a .got.plt section. We just
3811 // create another set of data in the .got section. Note that we
3812 // always create a PLT if we create a GOT, although the PLT
3813 // might be empty.
3814 this->got_plt_ = new Output_data_space(4, "** GOT PLT");
3815 os = layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
3816 (elfcpp::SHF_ALLOC
3817 | elfcpp::SHF_WRITE),
3818 this->got_plt_, false, false,
3819 false, true);
3821 // The first three entries are reserved.
3822 this->got_plt_->set_current_data_size(3 * 4);
3824 // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
3825 symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
3826 Symbol_table::PREDEFINED,
3827 this->got_plt_,
3828 0, 0, elfcpp::STT_OBJECT,
3829 elfcpp::STB_LOCAL,
3830 elfcpp::STV_HIDDEN, 0,
3831 false, false);
3833 return this->got_;
3836 // Get the dynamic reloc section, creating it if necessary.
3838 template<bool big_endian>
3839 typename Target_arm<big_endian>::Reloc_section*
3840 Target_arm<big_endian>::rel_dyn_section(Layout* layout)
3842 if (this->rel_dyn_ == NULL)
3844 gold_assert(layout != NULL);
3845 this->rel_dyn_ = new Reloc_section(parameters->options().combreloc());
3846 layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
3847 elfcpp::SHF_ALLOC, this->rel_dyn_, true,
3848 false, false, false);
3850 return this->rel_dyn_;
3853 // Insn_template methods.
3855 // Return byte size of an instruction template.
3857 size_t
3858 Insn_template::size() const
3860 switch (this->type())
3862 case THUMB16_TYPE:
3863 case THUMB16_SPECIAL_TYPE:
3864 return 2;
3865 case ARM_TYPE:
3866 case THUMB32_TYPE:
3867 case DATA_TYPE:
3868 return 4;
3869 default:
3870 gold_unreachable();
3874 // Return alignment of an instruction template.
3876 unsigned
3877 Insn_template::alignment() const
3879 switch (this->type())
3881 case THUMB16_TYPE:
3882 case THUMB16_SPECIAL_TYPE:
3883 case THUMB32_TYPE:
3884 return 2;
3885 case ARM_TYPE:
3886 case DATA_TYPE:
3887 return 4;
3888 default:
3889 gold_unreachable();
3893 // Stub_template methods.
3895 Stub_template::Stub_template(
3896 Stub_type type, const Insn_template* insns,
3897 size_t insn_count)
3898 : type_(type), insns_(insns), insn_count_(insn_count), alignment_(1),
3899 entry_in_thumb_mode_(false), relocs_()
3901 off_t offset = 0;
3903 // Compute byte size and alignment of stub template.
3904 for (size_t i = 0; i < insn_count; i++)
3906 unsigned insn_alignment = insns[i].alignment();
3907 size_t insn_size = insns[i].size();
3908 gold_assert((offset & (insn_alignment - 1)) == 0);
3909 this->alignment_ = std::max(this->alignment_, insn_alignment);
3910 switch (insns[i].type())
3912 case Insn_template::THUMB16_TYPE:
3913 case Insn_template::THUMB16_SPECIAL_TYPE:
3914 if (i == 0)
3915 this->entry_in_thumb_mode_ = true;
3916 break;
3918 case Insn_template::THUMB32_TYPE:
3919 if (insns[i].r_type() != elfcpp::R_ARM_NONE)
3920 this->relocs_.push_back(Reloc(i, offset));
3921 if (i == 0)
3922 this->entry_in_thumb_mode_ = true;
3923 break;
3925 case Insn_template::ARM_TYPE:
3926 // Handle cases where the target is encoded within the
3927 // instruction.
3928 if (insns[i].r_type() == elfcpp::R_ARM_JUMP24)
3929 this->relocs_.push_back(Reloc(i, offset));
3930 break;
3932 case Insn_template::DATA_TYPE:
3933 // Entry point cannot be data.
3934 gold_assert(i != 0);
3935 this->relocs_.push_back(Reloc(i, offset));
3936 break;
3938 default:
3939 gold_unreachable();
3941 offset += insn_size;
3943 this->size_ = offset;
3946 // Stub methods.
3948 // Template to implement do_write for a specific target endianity.
3950 template<bool big_endian>
3951 void inline
3952 Stub::do_fixed_endian_write(unsigned char* view, section_size_type view_size)
3954 const Stub_template* stub_template = this->stub_template();
3955 const Insn_template* insns = stub_template->insns();
3957 // FIXME: We do not handle BE8 encoding yet.
3958 unsigned char* pov = view;
3959 for (size_t i = 0; i < stub_template->insn_count(); i++)
3961 switch (insns[i].type())
3963 case Insn_template::THUMB16_TYPE:
3964 elfcpp::Swap<16, big_endian>::writeval(pov, insns[i].data() & 0xffff);
3965 break;
3966 case Insn_template::THUMB16_SPECIAL_TYPE:
3967 elfcpp::Swap<16, big_endian>::writeval(
3968 pov,
3969 this->thumb16_special(i));
3970 break;
3971 case Insn_template::THUMB32_TYPE:
3973 uint32_t hi = (insns[i].data() >> 16) & 0xffff;
3974 uint32_t lo = insns[i].data() & 0xffff;
3975 elfcpp::Swap<16, big_endian>::writeval(pov, hi);
3976 elfcpp::Swap<16, big_endian>::writeval(pov + 2, lo);
3978 break;
3979 case Insn_template::ARM_TYPE:
3980 case Insn_template::DATA_TYPE:
3981 elfcpp::Swap<32, big_endian>::writeval(pov, insns[i].data());
3982 break;
3983 default:
3984 gold_unreachable();
3986 pov += insns[i].size();
3988 gold_assert(static_cast<section_size_type>(pov - view) == view_size);
3991 // Reloc_stub::Key methods.
3993 // Dump a Key as a string for debugging.
3995 std::string
3996 Reloc_stub::Key::name() const
3998 if (this->r_sym_ == invalid_index)
4000 // Global symbol key name
4001 // <stub-type>:<symbol name>:<addend>.
4002 const std::string sym_name = this->u_.symbol->name();
4003 // We need to print two hex number and two colons. So just add 100 bytes
4004 // to the symbol name size.
4005 size_t len = sym_name.size() + 100;
4006 char* buffer = new char[len];
4007 int c = snprintf(buffer, len, "%d:%s:%x", this->stub_type_,
4008 sym_name.c_str(), this->addend_);
4009 gold_assert(c > 0 && c < static_cast<int>(len));
4010 delete[] buffer;
4011 return std::string(buffer);
4013 else
4015 // local symbol key name
4016 // <stub-type>:<object>:<r_sym>:<addend>.
4017 const size_t len = 200;
4018 char buffer[len];
4019 int c = snprintf(buffer, len, "%d:%p:%u:%x", this->stub_type_,
4020 this->u_.relobj, this->r_sym_, this->addend_);
4021 gold_assert(c > 0 && c < static_cast<int>(len));
4022 return std::string(buffer);
4026 // Reloc_stub methods.
4028 // Determine the type of stub needed, if any, for a relocation of R_TYPE at
4029 // LOCATION to DESTINATION.
4030 // This code is based on the arm_type_of_stub function in
4031 // bfd/elf32-arm.c. We have changed the interface a liitle to keep the Stub
4032 // class simple.
4034 Stub_type
4035 Reloc_stub::stub_type_for_reloc(
4036 unsigned int r_type,
4037 Arm_address location,
4038 Arm_address destination,
4039 bool target_is_thumb)
4041 Stub_type stub_type = arm_stub_none;
4043 // This is a bit ugly but we want to avoid using a templated class for
4044 // big and little endianities.
4045 bool may_use_blx;
4046 bool should_force_pic_veneer;
4047 bool thumb2;
4048 bool thumb_only;
4049 if (parameters->target().is_big_endian())
4051 const Target_arm<true>* big_endian_target =
4052 Target_arm<true>::default_target();
4053 may_use_blx = big_endian_target->may_use_blx();
4054 should_force_pic_veneer = big_endian_target->should_force_pic_veneer();
4055 thumb2 = big_endian_target->using_thumb2();
4056 thumb_only = big_endian_target->using_thumb_only();
4058 else
4060 const Target_arm<false>* little_endian_target =
4061 Target_arm<false>::default_target();
4062 may_use_blx = little_endian_target->may_use_blx();
4063 should_force_pic_veneer = little_endian_target->should_force_pic_veneer();
4064 thumb2 = little_endian_target->using_thumb2();
4065 thumb_only = little_endian_target->using_thumb_only();
4068 int64_t branch_offset = (int64_t)destination - location;
4070 if (r_type == elfcpp::R_ARM_THM_CALL || r_type == elfcpp::R_ARM_THM_JUMP24)
4072 // Handle cases where:
4073 // - this call goes too far (different Thumb/Thumb2 max
4074 // distance)
4075 // - it's a Thumb->Arm call and blx is not available, or it's a
4076 // Thumb->Arm branch (not bl). A stub is needed in this case.
4077 if ((!thumb2
4078 && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
4079 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
4080 || (thumb2
4081 && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
4082 || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
4083 || ((!target_is_thumb)
4084 && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
4085 || (r_type == elfcpp::R_ARM_THM_JUMP24))))
4087 if (target_is_thumb)
4089 // Thumb to thumb.
4090 if (!thumb_only)
4092 stub_type = (parameters->options().shared()
4093 || should_force_pic_veneer)
4094 // PIC stubs.
4095 ? ((may_use_blx
4096 && (r_type == elfcpp::R_ARM_THM_CALL))
4097 // V5T and above. Stub starts with ARM code, so
4098 // we must be able to switch mode before
4099 // reaching it, which is only possible for 'bl'
4100 // (ie R_ARM_THM_CALL relocation).
4101 ? arm_stub_long_branch_any_thumb_pic
4102 // On V4T, use Thumb code only.
4103 : arm_stub_long_branch_v4t_thumb_thumb_pic)
4105 // non-PIC stubs.
4106 : ((may_use_blx
4107 && (r_type == elfcpp::R_ARM_THM_CALL))
4108 ? arm_stub_long_branch_any_any // V5T and above.
4109 : arm_stub_long_branch_v4t_thumb_thumb); // V4T.
4111 else
4113 stub_type = (parameters->options().shared()
4114 || should_force_pic_veneer)
4115 ? arm_stub_long_branch_thumb_only_pic // PIC stub.
4116 : arm_stub_long_branch_thumb_only; // non-PIC stub.
4119 else
4121 // Thumb to arm.
4123 // FIXME: We should check that the input section is from an
4124 // object that has interwork enabled.
4126 stub_type = (parameters->options().shared()
4127 || should_force_pic_veneer)
4128 // PIC stubs.
4129 ? ((may_use_blx
4130 && (r_type == elfcpp::R_ARM_THM_CALL))
4131 ? arm_stub_long_branch_any_arm_pic // V5T and above.
4132 : arm_stub_long_branch_v4t_thumb_arm_pic) // V4T.
4134 // non-PIC stubs.
4135 : ((may_use_blx
4136 && (r_type == elfcpp::R_ARM_THM_CALL))
4137 ? arm_stub_long_branch_any_any // V5T and above.
4138 : arm_stub_long_branch_v4t_thumb_arm); // V4T.
4140 // Handle v4t short branches.
4141 if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
4142 && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
4143 && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
4144 stub_type = arm_stub_short_branch_v4t_thumb_arm;
4148 else if (r_type == elfcpp::R_ARM_CALL
4149 || r_type == elfcpp::R_ARM_JUMP24
4150 || r_type == elfcpp::R_ARM_PLT32)
4152 if (target_is_thumb)
4154 // Arm to thumb.
4156 // FIXME: We should check that the input section is from an
4157 // object that has interwork enabled.
4159 // We have an extra 2-bytes reach because of
4160 // the mode change (bit 24 (H) of BLX encoding).
4161 if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
4162 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
4163 || ((r_type == elfcpp::R_ARM_CALL) && !may_use_blx)
4164 || (r_type == elfcpp::R_ARM_JUMP24)
4165 || (r_type == elfcpp::R_ARM_PLT32))
4167 stub_type = (parameters->options().shared()
4168 || should_force_pic_veneer)
4169 // PIC stubs.
4170 ? (may_use_blx
4171 ? arm_stub_long_branch_any_thumb_pic// V5T and above.
4172 : arm_stub_long_branch_v4t_arm_thumb_pic) // V4T stub.
4174 // non-PIC stubs.
4175 : (may_use_blx
4176 ? arm_stub_long_branch_any_any // V5T and above.
4177 : arm_stub_long_branch_v4t_arm_thumb); // V4T.
4180 else
4182 // Arm to arm.
4183 if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
4184 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
4186 stub_type = (parameters->options().shared()
4187 || should_force_pic_veneer)
4188 ? arm_stub_long_branch_any_arm_pic // PIC stubs.
4189 : arm_stub_long_branch_any_any; /// non-PIC.
4194 return stub_type;
4197 // Cortex_a8_stub methods.
4199 // Return the instruction for a THUMB16_SPECIAL_TYPE instruction template.
4200 // I is the position of the instruction template in the stub template.
4202 uint16_t
4203 Cortex_a8_stub::do_thumb16_special(size_t i)
4205 // The only use of this is to copy condition code from a conditional
4206 // branch being worked around to the corresponding conditional branch in
4207 // to the stub.
4208 gold_assert(this->stub_template()->type() == arm_stub_a8_veneer_b_cond
4209 && i == 0);
4210 uint16_t data = this->stub_template()->insns()[i].data();
4211 gold_assert((data & 0xff00U) == 0xd000U);
4212 data |= ((this->original_insn_ >> 22) & 0xf) << 8;
4213 return data;
4216 // Stub_factory methods.
4218 Stub_factory::Stub_factory()
4220 // The instruction template sequences are declared as static
4221 // objects and initialized first time the constructor runs.
4223 // Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
4224 // to reach the stub if necessary.
4225 static const Insn_template elf32_arm_stub_long_branch_any_any[] =
4227 Insn_template::arm_insn(0xe51ff004), // ldr pc, [pc, #-4]
4228 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4229 // dcd R_ARM_ABS32(X)
4232 // V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
4233 // available.
4234 static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb[] =
4236 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
4237 Insn_template::arm_insn(0xe12fff1c), // bx ip
4238 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4239 // dcd R_ARM_ABS32(X)
4242 // Thumb -> Thumb long branch stub. Used on M-profile architectures.
4243 static const Insn_template elf32_arm_stub_long_branch_thumb_only[] =
4245 Insn_template::thumb16_insn(0xb401), // push {r0}
4246 Insn_template::thumb16_insn(0x4802), // ldr r0, [pc, #8]
4247 Insn_template::thumb16_insn(0x4684), // mov ip, r0
4248 Insn_template::thumb16_insn(0xbc01), // pop {r0}
4249 Insn_template::thumb16_insn(0x4760), // bx ip
4250 Insn_template::thumb16_insn(0xbf00), // nop
4251 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4252 // dcd R_ARM_ABS32(X)
4255 // V4T Thumb -> Thumb long branch stub. Using the stack is not
4256 // allowed.
4257 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb[] =
4259 Insn_template::thumb16_insn(0x4778), // bx pc
4260 Insn_template::thumb16_insn(0x46c0), // nop
4261 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
4262 Insn_template::arm_insn(0xe12fff1c), // bx ip
4263 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4264 // dcd R_ARM_ABS32(X)
4267 // V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
4268 // available.
4269 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm[] =
4271 Insn_template::thumb16_insn(0x4778), // bx pc
4272 Insn_template::thumb16_insn(0x46c0), // nop
4273 Insn_template::arm_insn(0xe51ff004), // ldr pc, [pc, #-4]
4274 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4275 // dcd R_ARM_ABS32(X)
4278 // V4T Thumb -> ARM short branch stub. Shorter variant of the above
4279 // one, when the destination is close enough.
4280 static const Insn_template elf32_arm_stub_short_branch_v4t_thumb_arm[] =
4282 Insn_template::thumb16_insn(0x4778), // bx pc
4283 Insn_template::thumb16_insn(0x46c0), // nop
4284 Insn_template::arm_rel_insn(0xea000000, -8), // b (X-8)
4287 // ARM/Thumb -> ARM long branch stub, PIC. On V5T and above, use
4288 // blx to reach the stub if necessary.
4289 static const Insn_template elf32_arm_stub_long_branch_any_arm_pic[] =
4291 Insn_template::arm_insn(0xe59fc000), // ldr r12, [pc]
4292 Insn_template::arm_insn(0xe08ff00c), // add pc, pc, ip
4293 Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
4294 // dcd R_ARM_REL32(X-4)
4297 // ARM/Thumb -> Thumb long branch stub, PIC. On V5T and above, use
4298 // blx to reach the stub if necessary. We can not add into pc;
4299 // it is not guaranteed to mode switch (different in ARMv6 and
4300 // ARMv7).
4301 static const Insn_template elf32_arm_stub_long_branch_any_thumb_pic[] =
4303 Insn_template::arm_insn(0xe59fc004), // ldr r12, [pc, #4]
4304 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
4305 Insn_template::arm_insn(0xe12fff1c), // bx ip
4306 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4307 // dcd R_ARM_REL32(X)
4310 // V4T ARM -> ARM long branch stub, PIC.
4311 static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb_pic[] =
4313 Insn_template::arm_insn(0xe59fc004), // ldr ip, [pc, #4]
4314 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
4315 Insn_template::arm_insn(0xe12fff1c), // bx ip
4316 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4317 // dcd R_ARM_REL32(X)
4320 // V4T Thumb -> ARM long branch stub, PIC.
4321 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm_pic[] =
4323 Insn_template::thumb16_insn(0x4778), // bx pc
4324 Insn_template::thumb16_insn(0x46c0), // nop
4325 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
4326 Insn_template::arm_insn(0xe08cf00f), // add pc, ip, pc
4327 Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
4328 // dcd R_ARM_REL32(X)
4331 // Thumb -> Thumb long branch stub, PIC. Used on M-profile
4332 // architectures.
4333 static const Insn_template elf32_arm_stub_long_branch_thumb_only_pic[] =
4335 Insn_template::thumb16_insn(0xb401), // push {r0}
4336 Insn_template::thumb16_insn(0x4802), // ldr r0, [pc, #8]
4337 Insn_template::thumb16_insn(0x46fc), // mov ip, pc
4338 Insn_template::thumb16_insn(0x4484), // add ip, r0
4339 Insn_template::thumb16_insn(0xbc01), // pop {r0}
4340 Insn_template::thumb16_insn(0x4760), // bx ip
4341 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 4),
4342 // dcd R_ARM_REL32(X)
4345 // V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
4346 // allowed.
4347 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb_pic[] =
4349 Insn_template::thumb16_insn(0x4778), // bx pc
4350 Insn_template::thumb16_insn(0x46c0), // nop
4351 Insn_template::arm_insn(0xe59fc004), // ldr ip, [pc, #4]
4352 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
4353 Insn_template::arm_insn(0xe12fff1c), // bx ip
4354 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4355 // dcd R_ARM_REL32(X)
4358 // Cortex-A8 erratum-workaround stubs.
4360 // Stub used for conditional branches (which may be beyond +/-1MB away,
4361 // so we can't use a conditional branch to reach this stub).
4363 // original code:
4365 // b<cond> X
4366 // after:
4368 static const Insn_template elf32_arm_stub_a8_veneer_b_cond[] =
4370 Insn_template::thumb16_bcond_insn(0xd001), // b<cond>.n true
4371 Insn_template::thumb32_b_insn(0xf000b800, -4), // b.w after
4372 Insn_template::thumb32_b_insn(0xf000b800, -4) // true:
4373 // b.w X
4376 // Stub used for b.w and bl.w instructions.
4378 static const Insn_template elf32_arm_stub_a8_veneer_b[] =
4380 Insn_template::thumb32_b_insn(0xf000b800, -4) // b.w dest
4383 static const Insn_template elf32_arm_stub_a8_veneer_bl[] =
4385 Insn_template::thumb32_b_insn(0xf000b800, -4) // b.w dest
4388 // Stub used for Thumb-2 blx.w instructions. We modified the original blx.w
4389 // instruction (which switches to ARM mode) to point to this stub. Jump to
4390 // the real destination using an ARM-mode branch.
4391 static const Insn_template elf32_arm_stub_a8_veneer_blx[] =
4393 Insn_template::arm_rel_insn(0xea000000, -8) // b dest
4396 // Stub used to provide an interworking for R_ARM_V4BX relocation
4397 // (bx r[n] instruction).
4398 static const Insn_template elf32_arm_stub_v4_veneer_bx[] =
4400 Insn_template::arm_insn(0xe3100001), // tst r<n>, #1
4401 Insn_template::arm_insn(0x01a0f000), // moveq pc, r<n>
4402 Insn_template::arm_insn(0xe12fff10) // bx r<n>
4405 // Fill in the stub template look-up table. Stub templates are constructed
4406 // per instance of Stub_factory for fast look-up without locking
4407 // in a thread-enabled environment.
4409 this->stub_templates_[arm_stub_none] =
4410 new Stub_template(arm_stub_none, NULL, 0);
4412 #define DEF_STUB(x) \
4413 do \
4415 size_t array_size \
4416 = sizeof(elf32_arm_stub_##x) / sizeof(elf32_arm_stub_##x[0]); \
4417 Stub_type type = arm_stub_##x; \
4418 this->stub_templates_[type] = \
4419 new Stub_template(type, elf32_arm_stub_##x, array_size); \
4421 while (0);
4423 DEF_STUBS
4424 #undef DEF_STUB
4427 // Stub_table methods.
4429 // Removel all Cortex-A8 stub.
4431 template<bool big_endian>
4432 void
4433 Stub_table<big_endian>::remove_all_cortex_a8_stubs()
4435 for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
4436 p != this->cortex_a8_stubs_.end();
4437 ++p)
4438 delete p->second;
4439 this->cortex_a8_stubs_.clear();
4442 // Relocate one stub. This is a helper for Stub_table::relocate_stubs().
4444 template<bool big_endian>
4445 void
4446 Stub_table<big_endian>::relocate_stub(
4447 Stub* stub,
4448 const Relocate_info<32, big_endian>* relinfo,
4449 Target_arm<big_endian>* arm_target,
4450 Output_section* output_section,
4451 unsigned char* view,
4452 Arm_address address,
4453 section_size_type view_size)
4455 const Stub_template* stub_template = stub->stub_template();
4456 if (stub_template->reloc_count() != 0)
4458 // Adjust view to cover the stub only.
4459 section_size_type offset = stub->offset();
4460 section_size_type stub_size = stub_template->size();
4461 gold_assert(offset + stub_size <= view_size);
4463 arm_target->relocate_stub(stub, relinfo, output_section, view + offset,
4464 address + offset, stub_size);
4468 // Relocate all stubs in this stub table.
4470 template<bool big_endian>
4471 void
4472 Stub_table<big_endian>::relocate_stubs(
4473 const Relocate_info<32, big_endian>* relinfo,
4474 Target_arm<big_endian>* arm_target,
4475 Output_section* output_section,
4476 unsigned char* view,
4477 Arm_address address,
4478 section_size_type view_size)
4480 // If we are passed a view bigger than the stub table's. we need to
4481 // adjust the view.
4482 gold_assert(address == this->address()
4483 && (view_size
4484 == static_cast<section_size_type>(this->data_size())));
4486 // Relocate all relocation stubs.
4487 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
4488 p != this->reloc_stubs_.end();
4489 ++p)
4490 this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
4491 address, view_size);
4493 // Relocate all Cortex-A8 stubs.
4494 for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
4495 p != this->cortex_a8_stubs_.end();
4496 ++p)
4497 this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
4498 address, view_size);
4500 // Relocate all ARM V4BX stubs.
4501 for (Arm_v4bx_stub_list::iterator p = this->arm_v4bx_stubs_.begin();
4502 p != this->arm_v4bx_stubs_.end();
4503 ++p)
4505 if (*p != NULL)
4506 this->relocate_stub(*p, relinfo, arm_target, output_section, view,
4507 address, view_size);
4511 // Write out the stubs to file.
4513 template<bool big_endian>
4514 void
4515 Stub_table<big_endian>::do_write(Output_file* of)
4517 off_t offset = this->offset();
4518 const section_size_type oview_size =
4519 convert_to_section_size_type(this->data_size());
4520 unsigned char* const oview = of->get_output_view(offset, oview_size);
4522 // Write relocation stubs.
4523 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
4524 p != this->reloc_stubs_.end();
4525 ++p)
4527 Reloc_stub* stub = p->second;
4528 Arm_address address = this->address() + stub->offset();
4529 gold_assert(address
4530 == align_address(address,
4531 stub->stub_template()->alignment()));
4532 stub->write(oview + stub->offset(), stub->stub_template()->size(),
4533 big_endian);
4536 // Write Cortex-A8 stubs.
4537 for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
4538 p != this->cortex_a8_stubs_.end();
4539 ++p)
4541 Cortex_a8_stub* stub = p->second;
4542 Arm_address address = this->address() + stub->offset();
4543 gold_assert(address
4544 == align_address(address,
4545 stub->stub_template()->alignment()));
4546 stub->write(oview + stub->offset(), stub->stub_template()->size(),
4547 big_endian);
4550 // Write ARM V4BX relocation stubs.
4551 for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
4552 p != this->arm_v4bx_stubs_.end();
4553 ++p)
4555 if (*p == NULL)
4556 continue;
4558 Arm_address address = this->address() + (*p)->offset();
4559 gold_assert(address
4560 == align_address(address,
4561 (*p)->stub_template()->alignment()));
4562 (*p)->write(oview + (*p)->offset(), (*p)->stub_template()->size(),
4563 big_endian);
4566 of->write_output_view(this->offset(), oview_size, oview);
4569 // Update the data size and address alignment of the stub table at the end
4570 // of a relaxation pass. Return true if either the data size or the
4571 // alignment changed in this relaxation pass.
4573 template<bool big_endian>
4574 bool
4575 Stub_table<big_endian>::update_data_size_and_addralign()
4577 off_t size = 0;
4578 unsigned addralign = 1;
4580 // Go over all stubs in table to compute data size and address alignment.
4582 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
4583 p != this->reloc_stubs_.end();
4584 ++p)
4586 const Stub_template* stub_template = p->second->stub_template();
4587 addralign = std::max(addralign, stub_template->alignment());
4588 size = (align_address(size, stub_template->alignment())
4589 + stub_template->size());
4592 for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
4593 p != this->cortex_a8_stubs_.end();
4594 ++p)
4596 const Stub_template* stub_template = p->second->stub_template();
4597 addralign = std::max(addralign, stub_template->alignment());
4598 size = (align_address(size, stub_template->alignment())
4599 + stub_template->size());
4602 for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
4603 p != this->arm_v4bx_stubs_.end();
4604 ++p)
4606 if (*p == NULL)
4607 continue;
4609 const Stub_template* stub_template = (*p)->stub_template();
4610 addralign = std::max(addralign, stub_template->alignment());
4611 size = (align_address(size, stub_template->alignment())
4612 + stub_template->size());
4615 // Check if either data size or alignment changed in this pass.
4616 // Update prev_data_size_ and prev_addralign_. These will be used
4617 // as the current data size and address alignment for the next pass.
4618 bool changed = size != this->prev_data_size_;
4619 this->prev_data_size_ = size;
4621 if (addralign != this->prev_addralign_)
4622 changed = true;
4623 this->prev_addralign_ = addralign;
4625 return changed;
4628 // Finalize the stubs. This sets the offsets of the stubs within the stub
4629 // table. It also marks all input sections needing Cortex-A8 workaround.
4631 template<bool big_endian>
4632 void
4633 Stub_table<big_endian>::finalize_stubs()
4635 off_t off = 0;
4636 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
4637 p != this->reloc_stubs_.end();
4638 ++p)
4640 Reloc_stub* stub = p->second;
4641 const Stub_template* stub_template = stub->stub_template();
4642 uint64_t stub_addralign = stub_template->alignment();
4643 off = align_address(off, stub_addralign);
4644 stub->set_offset(off);
4645 off += stub_template->size();
4648 for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
4649 p != this->cortex_a8_stubs_.end();
4650 ++p)
4652 Cortex_a8_stub* stub = p->second;
4653 const Stub_template* stub_template = stub->stub_template();
4654 uint64_t stub_addralign = stub_template->alignment();
4655 off = align_address(off, stub_addralign);
4656 stub->set_offset(off);
4657 off += stub_template->size();
4659 // Mark input section so that we can determine later if a code section
4660 // needs the Cortex-A8 workaround quickly.
4661 Arm_relobj<big_endian>* arm_relobj =
4662 Arm_relobj<big_endian>::as_arm_relobj(stub->relobj());
4663 arm_relobj->mark_section_for_cortex_a8_workaround(stub->shndx());
4666 for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
4667 p != this->arm_v4bx_stubs_.end();
4668 ++p)
4670 if (*p == NULL)
4671 continue;
4673 const Stub_template* stub_template = (*p)->stub_template();
4674 uint64_t stub_addralign = stub_template->alignment();
4675 off = align_address(off, stub_addralign);
4676 (*p)->set_offset(off);
4677 off += stub_template->size();
4680 gold_assert(off <= this->prev_data_size_);
4683 // Apply Cortex-A8 workaround to an address range between VIEW_ADDRESS
4684 // and VIEW_ADDRESS + VIEW_SIZE - 1. VIEW points to the mapped address
4685 // of the address range seen by the linker.
4687 template<bool big_endian>
4688 void
4689 Stub_table<big_endian>::apply_cortex_a8_workaround_to_address_range(
4690 Target_arm<big_endian>* arm_target,
4691 unsigned char* view,
4692 Arm_address view_address,
4693 section_size_type view_size)
4695 // Cortex-A8 stubs are sorted by addresses of branches being fixed up.
4696 for (Cortex_a8_stub_list::const_iterator p =
4697 this->cortex_a8_stubs_.lower_bound(view_address);
4698 ((p != this->cortex_a8_stubs_.end())
4699 && (p->first < (view_address + view_size)));
4700 ++p)
4702 // We do not store the THUMB bit in the LSB of either the branch address
4703 // or the stub offset. There is no need to strip the LSB.
4704 Arm_address branch_address = p->first;
4705 const Cortex_a8_stub* stub = p->second;
4706 Arm_address stub_address = this->address() + stub->offset();
4708 // Offset of the branch instruction relative to this view.
4709 section_size_type offset =
4710 convert_to_section_size_type(branch_address - view_address);
4711 gold_assert((offset + 4) <= view_size);
4713 arm_target->apply_cortex_a8_workaround(stub, stub_address,
4714 view + offset, branch_address);
4718 // Arm_input_section methods.
4720 // Initialize an Arm_input_section.
4722 template<bool big_endian>
4723 void
4724 Arm_input_section<big_endian>::init()
4726 Relobj* relobj = this->relobj();
4727 unsigned int shndx = this->shndx();
4729 // Cache these to speed up size and alignment queries. It is too slow
4730 // to call section_addraglin and section_size every time.
4731 this->original_addralign_ = relobj->section_addralign(shndx);
4732 this->original_size_ = relobj->section_size(shndx);
4734 // We want to make this look like the original input section after
4735 // output sections are finalized.
4736 Output_section* os = relobj->output_section(shndx);
4737 off_t offset = relobj->output_section_offset(shndx);
4738 gold_assert(os != NULL && !relobj->is_output_section_offset_invalid(shndx));
4739 this->set_address(os->address() + offset);
4740 this->set_file_offset(os->offset() + offset);
4742 this->set_current_data_size(this->original_size_);
4743 this->finalize_data_size();
4746 template<bool big_endian>
4747 void
4748 Arm_input_section<big_endian>::do_write(Output_file* of)
4750 // We have to write out the original section content.
4751 section_size_type section_size;
4752 const unsigned char* section_contents =
4753 this->relobj()->section_contents(this->shndx(), &section_size, false);
4754 of->write(this->offset(), section_contents, section_size);
4756 // If this owns a stub table and it is not empty, write it.
4757 if (this->is_stub_table_owner() && !this->stub_table_->empty())
4758 this->stub_table_->write(of);
4761 // Finalize data size.
4763 template<bool big_endian>
4764 void
4765 Arm_input_section<big_endian>::set_final_data_size()
4767 // If this owns a stub table, finalize its data size as well.
4768 if (this->is_stub_table_owner())
4770 uint64_t address = this->address();
4772 // The stub table comes after the original section contents.
4773 address += this->original_size_;
4774 address = align_address(address, this->stub_table_->addralign());
4775 off_t offset = this->offset() + (address - this->address());
4776 this->stub_table_->set_address_and_file_offset(address, offset);
4777 address += this->stub_table_->data_size();
4778 gold_assert(address == this->address() + this->current_data_size());
4781 this->set_data_size(this->current_data_size());
4784 // Reset address and file offset.
4786 template<bool big_endian>
4787 void
4788 Arm_input_section<big_endian>::do_reset_address_and_file_offset()
4790 // Size of the original input section contents.
4791 off_t off = convert_types<off_t, uint64_t>(this->original_size_);
4793 // If this is a stub table owner, account for the stub table size.
4794 if (this->is_stub_table_owner())
4796 Stub_table<big_endian>* stub_table = this->stub_table_;
4798 // Reset the stub table's address and file offset. The
4799 // current data size for child will be updated after that.
4800 stub_table_->reset_address_and_file_offset();
4801 off = align_address(off, stub_table_->addralign());
4802 off += stub_table->current_data_size();
4805 this->set_current_data_size(off);
4808 // Arm_exidx_cantunwind methods.
4810 // Write this to Output file OF for a fixed endianity.
4812 template<bool big_endian>
4813 void
4814 Arm_exidx_cantunwind::do_fixed_endian_write(Output_file* of)
4816 off_t offset = this->offset();
4817 const section_size_type oview_size = 8;
4818 unsigned char* const oview = of->get_output_view(offset, oview_size);
4820 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
4821 Valtype* wv = reinterpret_cast<Valtype*>(oview);
4823 Output_section* os = this->relobj_->output_section(this->shndx_);
4824 gold_assert(os != NULL);
4826 Arm_relobj<big_endian>* arm_relobj =
4827 Arm_relobj<big_endian>::as_arm_relobj(this->relobj_);
4828 Arm_address output_offset =
4829 arm_relobj->get_output_section_offset(this->shndx_);
4830 Arm_address section_start;
4831 if(output_offset != Arm_relobj<big_endian>::invalid_address)
4832 section_start = os->address() + output_offset;
4833 else
4835 // Currently this only happens for a relaxed section.
4836 const Output_relaxed_input_section* poris =
4837 os->find_relaxed_input_section(this->relobj_, this->shndx_);
4838 gold_assert(poris != NULL);
4839 section_start = poris->address();
4842 // We always append this to the end of an EXIDX section.
4843 Arm_address output_address =
4844 section_start + this->relobj_->section_size(this->shndx_);
4846 // Write out the entry. The first word either points to the beginning
4847 // or after the end of a text section. The second word is the special
4848 // EXIDX_CANTUNWIND value.
4849 uint32_t prel31_offset = output_address - this->address();
4850 if (utils::has_overflow<31>(offset))
4851 gold_error(_("PREL31 overflow in EXIDX_CANTUNWIND entry"));
4852 elfcpp::Swap<32, big_endian>::writeval(wv, prel31_offset & 0x7fffffffU);
4853 elfcpp::Swap<32, big_endian>::writeval(wv + 1, elfcpp::EXIDX_CANTUNWIND);
4855 of->write_output_view(this->offset(), oview_size, oview);
4858 // Arm_exidx_merged_section methods.
4860 // Constructor for Arm_exidx_merged_section.
4861 // EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
4862 // SECTION_OFFSET_MAP points to a section offset map describing how
4863 // parts of the input section are mapped to output. DELETED_BYTES is
4864 // the number of bytes deleted from the EXIDX input section.
4866 Arm_exidx_merged_section::Arm_exidx_merged_section(
4867 const Arm_exidx_input_section& exidx_input_section,
4868 const Arm_exidx_section_offset_map& section_offset_map,
4869 uint32_t deleted_bytes)
4870 : Output_relaxed_input_section(exidx_input_section.relobj(),
4871 exidx_input_section.shndx(),
4872 exidx_input_section.addralign()),
4873 exidx_input_section_(exidx_input_section),
4874 section_offset_map_(section_offset_map)
4876 // Fix size here so that we do not need to implement set_final_data_size.
4877 this->set_data_size(exidx_input_section.size() - deleted_bytes);
4878 this->fix_data_size();
4881 // Given an input OBJECT, an input section index SHNDX within that
4882 // object, and an OFFSET relative to the start of that input
4883 // section, return whether or not the corresponding offset within
4884 // the output section is known. If this function returns true, it
4885 // sets *POUTPUT to the output offset. The value -1 indicates that
4886 // this input offset is being discarded.
4888 bool
4889 Arm_exidx_merged_section::do_output_offset(
4890 const Relobj* relobj,
4891 unsigned int shndx,
4892 section_offset_type offset,
4893 section_offset_type* poutput) const
4895 // We only handle offsets for the original EXIDX input section.
4896 if (relobj != this->exidx_input_section_.relobj()
4897 || shndx != this->exidx_input_section_.shndx())
4898 return false;
4900 section_offset_type section_size =
4901 convert_types<section_offset_type>(this->exidx_input_section_.size());
4902 if (offset < 0 || offset >= section_size)
4903 // Input offset is out of valid range.
4904 *poutput = -1;
4905 else
4907 // We need to look up the section offset map to determine the output
4908 // offset. Find the reference point in map that is first offset
4909 // bigger than or equal to this offset.
4910 Arm_exidx_section_offset_map::const_iterator p =
4911 this->section_offset_map_.lower_bound(offset);
4913 // The section offset maps are build such that this should not happen if
4914 // input offset is in the valid range.
4915 gold_assert(p != this->section_offset_map_.end());
4917 // We need to check if this is dropped.
4918 section_offset_type ref = p->first;
4919 section_offset_type mapped_ref = p->second;
4921 if (mapped_ref != Arm_exidx_input_section::invalid_offset)
4922 // Offset is present in output.
4923 *poutput = mapped_ref + (offset - ref);
4924 else
4925 // Offset is discarded owing to EXIDX entry merging.
4926 *poutput = -1;
4929 return true;
4932 // Write this to output file OF.
4934 void
4935 Arm_exidx_merged_section::do_write(Output_file* of)
4937 // If we retain or discard the whole EXIDX input section, we would
4938 // not be here.
4939 gold_assert(this->data_size() != this->exidx_input_section_.size()
4940 && this->data_size() != 0);
4942 off_t offset = this->offset();
4943 const section_size_type oview_size = this->data_size();
4944 unsigned char* const oview = of->get_output_view(offset, oview_size);
4946 Output_section* os = this->relobj()->output_section(this->shndx());
4947 gold_assert(os != NULL);
4949 // Get contents of EXIDX input section.
4950 section_size_type section_size;
4951 const unsigned char* section_contents =
4952 this->relobj()->section_contents(this->shndx(), &section_size, false);
4953 gold_assert(section_size == this->exidx_input_section_.size());
4955 // Go over spans of input offsets and write only those that are not
4956 // discarded.
4957 section_offset_type in_start = 0;
4958 section_offset_type out_start = 0;
4959 for(Arm_exidx_section_offset_map::const_iterator p =
4960 this->section_offset_map_.begin();
4961 p != this->section_offset_map_.end();
4962 ++p)
4964 section_offset_type in_end = p->first;
4965 gold_assert(in_end >= in_start);
4966 section_offset_type out_end = p->second;
4967 size_t in_chunk_size = convert_types<size_t>(in_end - in_start + 1);
4968 if (out_end != -1)
4970 size_t out_chunk_size =
4971 convert_types<size_t>(out_end - out_start + 1);
4972 gold_assert(out_chunk_size == in_chunk_size);
4973 memcpy(oview + out_start, section_contents + in_start,
4974 out_chunk_size);
4975 out_start += out_chunk_size;
4977 in_start += in_chunk_size;
4980 gold_assert(convert_to_section_size_type(out_start) == oview_size);
4981 of->write_output_view(this->offset(), oview_size, oview);
4984 // Arm_exidx_fixup methods.
4986 // Append an EXIDX_CANTUNWIND in the current output section if the last entry
4987 // is not an EXIDX_CANTUNWIND entry already. The new EXIDX_CANTUNWIND entry
4988 // points to the end of the last seen EXIDX section.
4990 void
4991 Arm_exidx_fixup::add_exidx_cantunwind_as_needed()
4993 if (this->last_unwind_type_ != UT_EXIDX_CANTUNWIND
4994 && this->last_input_section_ != NULL)
4996 Relobj* relobj = this->last_input_section_->relobj();
4997 unsigned int text_shndx = this->last_input_section_->link();
4998 Arm_exidx_cantunwind* cantunwind =
4999 new Arm_exidx_cantunwind(relobj, text_shndx);
5000 this->exidx_output_section_->add_output_section_data(cantunwind);
5001 this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5005 // Process an EXIDX section entry in input. Return whether this entry
5006 // can be deleted in the output. SECOND_WORD in the second word of the
5007 // EXIDX entry.
5009 bool
5010 Arm_exidx_fixup::process_exidx_entry(uint32_t second_word)
5012 bool delete_entry;
5013 if (second_word == elfcpp::EXIDX_CANTUNWIND)
5015 // Merge if previous entry is also an EXIDX_CANTUNWIND.
5016 delete_entry = this->last_unwind_type_ == UT_EXIDX_CANTUNWIND;
5017 this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5019 else if ((second_word & 0x80000000) != 0)
5021 // Inlined unwinding data. Merge if equal to previous.
5022 delete_entry = (this->last_unwind_type_ == UT_INLINED_ENTRY
5023 && this->last_inlined_entry_ == second_word);
5024 this->last_unwind_type_ = UT_INLINED_ENTRY;
5025 this->last_inlined_entry_ = second_word;
5027 else
5029 // Normal table entry. In theory we could merge these too,
5030 // but duplicate entries are likely to be much less common.
5031 delete_entry = false;
5032 this->last_unwind_type_ = UT_NORMAL_ENTRY;
5034 return delete_entry;
5037 // Update the current section offset map during EXIDX section fix-up.
5038 // If there is no map, create one. INPUT_OFFSET is the offset of a
5039 // reference point, DELETED_BYTES is the number of deleted by in the
5040 // section so far. If DELETE_ENTRY is true, the reference point and
5041 // all offsets after the previous reference point are discarded.
5043 void
5044 Arm_exidx_fixup::update_offset_map(
5045 section_offset_type input_offset,
5046 section_size_type deleted_bytes,
5047 bool delete_entry)
5049 if (this->section_offset_map_ == NULL)
5050 this->section_offset_map_ = new Arm_exidx_section_offset_map();
5051 section_offset_type output_offset = (delete_entry
5052 ? -1
5053 : input_offset - deleted_bytes);
5054 (*this->section_offset_map_)[input_offset] = output_offset;
5057 // Process EXIDX_INPUT_SECTION for EXIDX entry merging. Return the number of
5058 // bytes deleted. If some entries are merged, also store a pointer to a newly
5059 // created Arm_exidx_section_offset_map object in *PSECTION_OFFSET_MAP. The
5060 // caller owns the map and is responsible for releasing it after use.
5062 template<bool big_endian>
5063 uint32_t
5064 Arm_exidx_fixup::process_exidx_section(
5065 const Arm_exidx_input_section* exidx_input_section,
5066 Arm_exidx_section_offset_map** psection_offset_map)
5068 Relobj* relobj = exidx_input_section->relobj();
5069 unsigned shndx = exidx_input_section->shndx();
5070 section_size_type section_size;
5071 const unsigned char* section_contents =
5072 relobj->section_contents(shndx, &section_size, false);
5074 if ((section_size % 8) != 0)
5076 // Something is wrong with this section. Better not touch it.
5077 gold_error(_("uneven .ARM.exidx section size in %s section %u"),
5078 relobj->name().c_str(), shndx);
5079 this->last_input_section_ = exidx_input_section;
5080 this->last_unwind_type_ = UT_NONE;
5081 return 0;
5084 uint32_t deleted_bytes = 0;
5085 bool prev_delete_entry = false;
5086 gold_assert(this->section_offset_map_ == NULL);
5088 for (section_size_type i = 0; i < section_size; i += 8)
5090 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
5091 const Valtype* wv =
5092 reinterpret_cast<const Valtype*>(section_contents + i + 4);
5093 uint32_t second_word = elfcpp::Swap<32, big_endian>::readval(wv);
5095 bool delete_entry = this->process_exidx_entry(second_word);
5097 // Entry deletion causes changes in output offsets. We use a std::map
5098 // to record these. And entry (x, y) means input offset x
5099 // is mapped to output offset y. If y is invalid_offset, then x is
5100 // dropped in the output. Because of the way std::map::lower_bound
5101 // works, we record the last offset in a region w.r.t to keeping or
5102 // dropping. If there is no entry (x0, y0) for an input offset x0,
5103 // the output offset y0 of it is determined by the output offset y1 of
5104 // the smallest input offset x1 > x0 that there is an (x1, y1) entry
5105 // in the map. If y1 is not -1, then y0 = y1 + x0 - x1. Othewise, y1
5106 // y0 is also -1.
5107 if (delete_entry != prev_delete_entry && i != 0)
5108 this->update_offset_map(i - 1, deleted_bytes, prev_delete_entry);
5110 // Update total deleted bytes for this entry.
5111 if (delete_entry)
5112 deleted_bytes += 8;
5114 prev_delete_entry = delete_entry;
5117 // If section offset map is not NULL, make an entry for the end of
5118 // section.
5119 if (this->section_offset_map_ != NULL)
5120 update_offset_map(section_size - 1, deleted_bytes, prev_delete_entry);
5122 *psection_offset_map = this->section_offset_map_;
5123 this->section_offset_map_ = NULL;
5124 this->last_input_section_ = exidx_input_section;
5126 // Set the first output text section so that we can link the EXIDX output
5127 // section to it. Ignore any EXIDX input section that is completely merged.
5128 if (this->first_output_text_section_ == NULL
5129 && deleted_bytes != section_size)
5131 unsigned int link = exidx_input_section->link();
5132 Output_section* os = relobj->output_section(link);
5133 gold_assert(os != NULL);
5134 this->first_output_text_section_ = os;
5137 return deleted_bytes;
5140 // Arm_output_section methods.
5142 // Create a stub group for input sections from BEGIN to END. OWNER
5143 // points to the input section to be the owner a new stub table.
5145 template<bool big_endian>
5146 void
5147 Arm_output_section<big_endian>::create_stub_group(
5148 Input_section_list::const_iterator begin,
5149 Input_section_list::const_iterator end,
5150 Input_section_list::const_iterator owner,
5151 Target_arm<big_endian>* target,
5152 std::vector<Output_relaxed_input_section*>* new_relaxed_sections)
5154 // We use a different kind of relaxed section in an EXIDX section.
5155 // The static casting from Output_relaxed_input_section to
5156 // Arm_input_section is invalid in an EXIDX section. We are okay
5157 // because we should not be calling this for an EXIDX section.
5158 gold_assert(this->type() != elfcpp::SHT_ARM_EXIDX);
5160 // Currently we convert ordinary input sections into relaxed sections only
5161 // at this point but we may want to support creating relaxed input section
5162 // very early. So we check here to see if owner is already a relaxed
5163 // section.
5165 Arm_input_section<big_endian>* arm_input_section;
5166 if (owner->is_relaxed_input_section())
5168 arm_input_section =
5169 Arm_input_section<big_endian>::as_arm_input_section(
5170 owner->relaxed_input_section());
5172 else
5174 gold_assert(owner->is_input_section());
5175 // Create a new relaxed input section.
5176 arm_input_section =
5177 target->new_arm_input_section(owner->relobj(), owner->shndx());
5178 new_relaxed_sections->push_back(arm_input_section);
5181 // Create a stub table.
5182 Stub_table<big_endian>* stub_table =
5183 target->new_stub_table(arm_input_section);
5185 arm_input_section->set_stub_table(stub_table);
5187 Input_section_list::const_iterator p = begin;
5188 Input_section_list::const_iterator prev_p;
5190 // Look for input sections or relaxed input sections in [begin ... end].
5193 if (p->is_input_section() || p->is_relaxed_input_section())
5195 // The stub table information for input sections live
5196 // in their objects.
5197 Arm_relobj<big_endian>* arm_relobj =
5198 Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
5199 arm_relobj->set_stub_table(p->shndx(), stub_table);
5201 prev_p = p++;
5203 while (prev_p != end);
5206 // Group input sections for stub generation. GROUP_SIZE is roughly the limit
5207 // of stub groups. We grow a stub group by adding input section until the
5208 // size is just below GROUP_SIZE. The last input section will be converted
5209 // into a stub table. If STUB_ALWAYS_AFTER_BRANCH is false, we also add
5210 // input section after the stub table, effectively double the group size.
5212 // This is similar to the group_sections() function in elf32-arm.c but is
5213 // implemented differently.
5215 template<bool big_endian>
5216 void
5217 Arm_output_section<big_endian>::group_sections(
5218 section_size_type group_size,
5219 bool stubs_always_after_branch,
5220 Target_arm<big_endian>* target)
5222 // We only care about sections containing code.
5223 if ((this->flags() & elfcpp::SHF_EXECINSTR) == 0)
5224 return;
5226 // States for grouping.
5227 typedef enum
5229 // No group is being built.
5230 NO_GROUP,
5231 // A group is being built but the stub table is not found yet.
5232 // We keep group a stub group until the size is just under GROUP_SIZE.
5233 // The last input section in the group will be used as the stub table.
5234 FINDING_STUB_SECTION,
5235 // A group is being built and we have already found a stub table.
5236 // We enter this state to grow a stub group by adding input section
5237 // after the stub table. This effectively doubles the group size.
5238 HAS_STUB_SECTION
5239 } State;
5241 // Any newly created relaxed sections are stored here.
5242 std::vector<Output_relaxed_input_section*> new_relaxed_sections;
5244 State state = NO_GROUP;
5245 section_size_type off = 0;
5246 section_size_type group_begin_offset = 0;
5247 section_size_type group_end_offset = 0;
5248 section_size_type stub_table_end_offset = 0;
5249 Input_section_list::const_iterator group_begin =
5250 this->input_sections().end();
5251 Input_section_list::const_iterator stub_table =
5252 this->input_sections().end();
5253 Input_section_list::const_iterator group_end = this->input_sections().end();
5254 for (Input_section_list::const_iterator p = this->input_sections().begin();
5255 p != this->input_sections().end();
5256 ++p)
5258 section_size_type section_begin_offset =
5259 align_address(off, p->addralign());
5260 section_size_type section_end_offset =
5261 section_begin_offset + p->data_size();
5263 // Check to see if we should group the previously seens sections.
5264 switch (state)
5266 case NO_GROUP:
5267 break;
5269 case FINDING_STUB_SECTION:
5270 // Adding this section makes the group larger than GROUP_SIZE.
5271 if (section_end_offset - group_begin_offset >= group_size)
5273 if (stubs_always_after_branch)
5275 gold_assert(group_end != this->input_sections().end());
5276 this->create_stub_group(group_begin, group_end, group_end,
5277 target, &new_relaxed_sections);
5278 state = NO_GROUP;
5280 else
5282 // But wait, there's more! Input sections up to
5283 // stub_group_size bytes after the stub table can be
5284 // handled by it too.
5285 state = HAS_STUB_SECTION;
5286 stub_table = group_end;
5287 stub_table_end_offset = group_end_offset;
5290 break;
5292 case HAS_STUB_SECTION:
5293 // Adding this section makes the post stub-section group larger
5294 // than GROUP_SIZE.
5295 if (section_end_offset - stub_table_end_offset >= group_size)
5297 gold_assert(group_end != this->input_sections().end());
5298 this->create_stub_group(group_begin, group_end, stub_table,
5299 target, &new_relaxed_sections);
5300 state = NO_GROUP;
5302 break;
5304 default:
5305 gold_unreachable();
5308 // If we see an input section and currently there is no group, start
5309 // a new one. Skip any empty sections.
5310 if ((p->is_input_section() || p->is_relaxed_input_section())
5311 && (p->relobj()->section_size(p->shndx()) != 0))
5313 if (state == NO_GROUP)
5315 state = FINDING_STUB_SECTION;
5316 group_begin = p;
5317 group_begin_offset = section_begin_offset;
5320 // Keep track of the last input section seen.
5321 group_end = p;
5322 group_end_offset = section_end_offset;
5325 off = section_end_offset;
5328 // Create a stub group for any ungrouped sections.
5329 if (state == FINDING_STUB_SECTION || state == HAS_STUB_SECTION)
5331 gold_assert(group_end != this->input_sections().end());
5332 this->create_stub_group(group_begin, group_end,
5333 (state == FINDING_STUB_SECTION
5334 ? group_end
5335 : stub_table),
5336 target, &new_relaxed_sections);
5339 // Convert input section into relaxed input section in a batch.
5340 if (!new_relaxed_sections.empty())
5341 this->convert_input_sections_to_relaxed_sections(new_relaxed_sections);
5343 // Update the section offsets
5344 for (size_t i = 0; i < new_relaxed_sections.size(); ++i)
5346 Arm_relobj<big_endian>* arm_relobj =
5347 Arm_relobj<big_endian>::as_arm_relobj(
5348 new_relaxed_sections[i]->relobj());
5349 unsigned int shndx = new_relaxed_sections[i]->shndx();
5350 // Tell Arm_relobj that this input section is converted.
5351 arm_relobj->convert_input_section_to_relaxed_section(shndx);
5355 // Append non empty text sections in this to LIST in ascending
5356 // order of their position in this.
5358 template<bool big_endian>
5359 void
5360 Arm_output_section<big_endian>::append_text_sections_to_list(
5361 Text_section_list* list)
5363 // We only care about text sections.
5364 if ((this->flags() & elfcpp::SHF_EXECINSTR) == 0)
5365 return;
5367 gold_assert((this->flags() & elfcpp::SHF_ALLOC) != 0);
5369 for (Input_section_list::const_iterator p = this->input_sections().begin();
5370 p != this->input_sections().end();
5371 ++p)
5373 // We only care about plain or relaxed input sections. We also
5374 // ignore any merged sections.
5375 if ((p->is_input_section() || p->is_relaxed_input_section())
5376 && p->data_size() != 0)
5377 list->push_back(Text_section_list::value_type(p->relobj(),
5378 p->shndx()));
5382 template<bool big_endian>
5383 void
5384 Arm_output_section<big_endian>::fix_exidx_coverage(
5385 const Text_section_list& sorted_text_sections,
5386 Symbol_table* symtab)
5388 // We should only do this for the EXIDX output section.
5389 gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
5391 // We don't want the relaxation loop to undo these changes, so we discard
5392 // the current saved states and take another one after the fix-up.
5393 this->discard_states();
5395 // Remove all input sections.
5396 uint64_t address = this->address();
5397 typedef std::list<Simple_input_section> Simple_input_section_list;
5398 Simple_input_section_list input_sections;
5399 this->reset_address_and_file_offset();
5400 this->get_input_sections(address, std::string(""), &input_sections);
5402 if (!this->input_sections().empty())
5403 gold_error(_("Found non-EXIDX input sections in EXIDX output section"));
5405 // Go through all the known input sections and record them.
5406 typedef Unordered_set<Section_id, Section_id_hash> Section_id_set;
5407 Section_id_set known_input_sections;
5408 for (Simple_input_section_list::const_iterator p = input_sections.begin();
5409 p != input_sections.end();
5410 ++p)
5412 // This should never happen. At this point, we should only see
5413 // plain EXIDX input sections.
5414 gold_assert(!p->is_relaxed_input_section());
5415 known_input_sections.insert(Section_id(p->relobj(), p->shndx()));
5418 Arm_exidx_fixup exidx_fixup(this);
5420 // Go over the sorted text sections.
5421 Section_id_set processed_input_sections;
5422 for (Text_section_list::const_iterator p = sorted_text_sections.begin();
5423 p != sorted_text_sections.end();
5424 ++p)
5426 Relobj* relobj = p->first;
5427 unsigned int shndx = p->second;
5429 Arm_relobj<big_endian>* arm_relobj =
5430 Arm_relobj<big_endian>::as_arm_relobj(relobj);
5431 const Arm_exidx_input_section* exidx_input_section =
5432 arm_relobj->exidx_input_section_by_link(shndx);
5434 // If this text section has no EXIDX section, force an EXIDX_CANTUNWIND
5435 // entry pointing to the end of the last seen EXIDX section.
5436 if (exidx_input_section == NULL)
5438 exidx_fixup.add_exidx_cantunwind_as_needed();
5439 continue;
5442 Relobj* exidx_relobj = exidx_input_section->relobj();
5443 unsigned int exidx_shndx = exidx_input_section->shndx();
5444 Section_id sid(exidx_relobj, exidx_shndx);
5445 if (known_input_sections.find(sid) == known_input_sections.end())
5447 // This is odd. We have not seen this EXIDX input section before.
5448 // We cannot do fix-up.
5449 gold_error(_("EXIDX section %u of %s is not in EXIDX output section"),
5450 exidx_shndx, exidx_relobj->name().c_str());
5451 exidx_fixup.add_exidx_cantunwind_as_needed();
5452 continue;
5455 // Fix up coverage and append input section to output data list.
5456 Arm_exidx_section_offset_map* section_offset_map = NULL;
5457 uint32_t deleted_bytes =
5458 exidx_fixup.process_exidx_section<big_endian>(exidx_input_section,
5459 &section_offset_map);
5461 if (deleted_bytes == exidx_input_section->size())
5463 // The whole EXIDX section got merged. Remove it from output.
5464 gold_assert(section_offset_map == NULL);
5465 exidx_relobj->set_output_section(exidx_shndx, NULL);
5467 // All local symbols defined in this input section will be dropped.
5468 // We need to adjust output local symbol count.
5469 arm_relobj->set_output_local_symbol_count_needs_update();
5471 else if (deleted_bytes > 0)
5473 // Some entries are merged. We need to convert this EXIDX input
5474 // section into a relaxed section.
5475 gold_assert(section_offset_map != NULL);
5476 Arm_exidx_merged_section* merged_section =
5477 new Arm_exidx_merged_section(*exidx_input_section,
5478 *section_offset_map, deleted_bytes);
5479 this->add_relaxed_input_section(merged_section);
5480 arm_relobj->convert_input_section_to_relaxed_section(exidx_shndx);
5482 // All local symbols defined in discarded portions of this input
5483 // section will be dropped. We need to adjust output local symbol
5484 // count.
5485 arm_relobj->set_output_local_symbol_count_needs_update();
5487 else
5489 // Just add back the EXIDX input section.
5490 gold_assert(section_offset_map == NULL);
5491 Output_section::Simple_input_section sis(exidx_relobj, exidx_shndx);
5492 this->add_simple_input_section(sis, exidx_input_section->size(),
5493 exidx_input_section->addralign());
5496 processed_input_sections.insert(Section_id(exidx_relobj, exidx_shndx));
5499 // Insert an EXIDX_CANTUNWIND entry at the end of output if necessary.
5500 exidx_fixup.add_exidx_cantunwind_as_needed();
5502 // Remove any known EXIDX input sections that are not processed.
5503 for (Simple_input_section_list::const_iterator p = input_sections.begin();
5504 p != input_sections.end();
5505 ++p)
5507 if (processed_input_sections.find(Section_id(p->relobj(), p->shndx()))
5508 == processed_input_sections.end())
5510 // We only discard a known EXIDX section because its linked
5511 // text section has been folded by ICF.
5512 Arm_relobj<big_endian>* arm_relobj =
5513 Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
5514 const Arm_exidx_input_section* exidx_input_section =
5515 arm_relobj->exidx_input_section_by_shndx(p->shndx());
5516 gold_assert(exidx_input_section != NULL);
5517 unsigned int text_shndx = exidx_input_section->link();
5518 gold_assert(symtab->is_section_folded(p->relobj(), text_shndx));
5520 // Remove this from link.
5521 p->relobj()->set_output_section(p->shndx(), NULL);
5525 // Link exidx output section to the first seen output section and
5526 // set correct entry size.
5527 this->set_link_section(exidx_fixup.first_output_text_section());
5528 this->set_entsize(8);
5530 // Make changes permanent.
5531 this->save_states();
5532 this->set_section_offsets_need_adjustment();
5535 // Arm_relobj methods.
5537 // Determine if an input section is scannable for stub processing. SHDR is
5538 // the header of the section and SHNDX is the section index. OS is the output
5539 // section for the input section and SYMTAB is the global symbol table used to
5540 // look up ICF information.
5542 template<bool big_endian>
5543 bool
5544 Arm_relobj<big_endian>::section_is_scannable(
5545 const elfcpp::Shdr<32, big_endian>& shdr,
5546 unsigned int shndx,
5547 const Output_section* os,
5548 const Symbol_table *symtab)
5550 // Skip any empty sections, unallocated sections or sections whose
5551 // type are not SHT_PROGBITS.
5552 if (shdr.get_sh_size() == 0
5553 || (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0
5554 || shdr.get_sh_type() != elfcpp::SHT_PROGBITS)
5555 return false;
5557 // Skip any discarded or ICF'ed sections.
5558 if (os == NULL || symtab->is_section_folded(this, shndx))
5559 return false;
5561 // If this requires special offset handling, check to see if it is
5562 // a relaxed section. If this is not, then it is a merged section that
5563 // we cannot handle.
5564 if (this->is_output_section_offset_invalid(shndx))
5566 const Output_relaxed_input_section* poris =
5567 os->find_relaxed_input_section(this, shndx);
5568 if (poris == NULL)
5569 return false;
5572 return true;
5575 // Determine if we want to scan the SHNDX-th section for relocation stubs.
5576 // This is a helper for Arm_relobj::scan_sections_for_stubs() below.
5578 template<bool big_endian>
5579 bool
5580 Arm_relobj<big_endian>::section_needs_reloc_stub_scanning(
5581 const elfcpp::Shdr<32, big_endian>& shdr,
5582 const Relobj::Output_sections& out_sections,
5583 const Symbol_table *symtab,
5584 const unsigned char* pshdrs)
5586 unsigned int sh_type = shdr.get_sh_type();
5587 if (sh_type != elfcpp::SHT_REL && sh_type != elfcpp::SHT_RELA)
5588 return false;
5590 // Ignore empty section.
5591 off_t sh_size = shdr.get_sh_size();
5592 if (sh_size == 0)
5593 return false;
5595 // Ignore reloc section with unexpected symbol table. The
5596 // error will be reported in the final link.
5597 if (this->adjust_shndx(shdr.get_sh_link()) != this->symtab_shndx())
5598 return false;
5600 unsigned int reloc_size;
5601 if (sh_type == elfcpp::SHT_REL)
5602 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
5603 else
5604 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
5606 // Ignore reloc section with unexpected entsize or uneven size.
5607 // The error will be reported in the final link.
5608 if (reloc_size != shdr.get_sh_entsize() || sh_size % reloc_size != 0)
5609 return false;
5611 // Ignore reloc section with bad info. This error will be
5612 // reported in the final link.
5613 unsigned int index = this->adjust_shndx(shdr.get_sh_info());
5614 if (index >= this->shnum())
5615 return false;
5617 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
5618 const elfcpp::Shdr<32, big_endian> text_shdr(pshdrs + index * shdr_size);
5619 return this->section_is_scannable(text_shdr, index,
5620 out_sections[index], symtab);
5623 // Return the output address of either a plain input section or a relaxed
5624 // input section. SHNDX is the section index. We define and use this
5625 // instead of calling Output_section::output_address because that is slow
5626 // for large output.
5628 template<bool big_endian>
5629 Arm_address
5630 Arm_relobj<big_endian>::simple_input_section_output_address(
5631 unsigned int shndx,
5632 Output_section* os)
5634 if (this->is_output_section_offset_invalid(shndx))
5636 const Output_relaxed_input_section* poris =
5637 os->find_relaxed_input_section(this, shndx);
5638 // We do not handle merged sections here.
5639 gold_assert(poris != NULL);
5640 return poris->address();
5642 else
5643 return os->address() + this->get_output_section_offset(shndx);
5646 // Determine if we want to scan the SHNDX-th section for non-relocation stubs.
5647 // This is a helper for Arm_relobj::scan_sections_for_stubs() below.
5649 template<bool big_endian>
5650 bool
5651 Arm_relobj<big_endian>::section_needs_cortex_a8_stub_scanning(
5652 const elfcpp::Shdr<32, big_endian>& shdr,
5653 unsigned int shndx,
5654 Output_section* os,
5655 const Symbol_table* symtab)
5657 if (!this->section_is_scannable(shdr, shndx, os, symtab))
5658 return false;
5660 // If the section does not cross any 4K-boundaries, it does not need to
5661 // be scanned.
5662 Arm_address address = this->simple_input_section_output_address(shndx, os);
5663 if ((address & ~0xfffU) == ((address + shdr.get_sh_size() - 1) & ~0xfffU))
5664 return false;
5666 return true;
5669 // Scan a section for Cortex-A8 workaround.
5671 template<bool big_endian>
5672 void
5673 Arm_relobj<big_endian>::scan_section_for_cortex_a8_erratum(
5674 const elfcpp::Shdr<32, big_endian>& shdr,
5675 unsigned int shndx,
5676 Output_section* os,
5677 Target_arm<big_endian>* arm_target)
5679 // Look for the first mapping symbol in this section. It should be
5680 // at (shndx, 0).
5681 Mapping_symbol_position section_start(shndx, 0);
5682 typename Mapping_symbols_info::const_iterator p =
5683 this->mapping_symbols_info_.lower_bound(section_start);
5685 // There are no mapping symbols for this section. Treat it as a data-only
5686 // section.
5687 if (p == this->mapping_symbols_info_.end() || p->first.first != shndx)
5688 return;
5690 Arm_address output_address =
5691 this->simple_input_section_output_address(shndx, os);
5693 // Get the section contents.
5694 section_size_type input_view_size = 0;
5695 const unsigned char* input_view =
5696 this->section_contents(shndx, &input_view_size, false);
5698 // We need to go through the mapping symbols to determine what to
5699 // scan. There are two reasons. First, we should look at THUMB code and
5700 // THUMB code only. Second, we only want to look at the 4K-page boundary
5701 // to speed up the scanning.
5703 while (p != this->mapping_symbols_info_.end()
5704 && p->first.first == shndx)
5706 typename Mapping_symbols_info::const_iterator next =
5707 this->mapping_symbols_info_.upper_bound(p->first);
5709 // Only scan part of a section with THUMB code.
5710 if (p->second == 't')
5712 // Determine the end of this range.
5713 section_size_type span_start =
5714 convert_to_section_size_type(p->first.second);
5715 section_size_type span_end;
5716 if (next != this->mapping_symbols_info_.end()
5717 && next->first.first == shndx)
5718 span_end = convert_to_section_size_type(next->first.second);
5719 else
5720 span_end = convert_to_section_size_type(shdr.get_sh_size());
5722 if (((span_start + output_address) & ~0xfffUL)
5723 != ((span_end + output_address - 1) & ~0xfffUL))
5725 arm_target->scan_span_for_cortex_a8_erratum(this, shndx,
5726 span_start, span_end,
5727 input_view,
5728 output_address);
5732 p = next;
5736 // Scan relocations for stub generation.
5738 template<bool big_endian>
5739 void
5740 Arm_relobj<big_endian>::scan_sections_for_stubs(
5741 Target_arm<big_endian>* arm_target,
5742 const Symbol_table* symtab,
5743 const Layout* layout)
5745 unsigned int shnum = this->shnum();
5746 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
5748 // Read the section headers.
5749 const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
5750 shnum * shdr_size,
5751 true, true);
5753 // To speed up processing, we set up hash tables for fast lookup of
5754 // input offsets to output addresses.
5755 this->initialize_input_to_output_maps();
5757 const Relobj::Output_sections& out_sections(this->output_sections());
5759 Relocate_info<32, big_endian> relinfo;
5760 relinfo.symtab = symtab;
5761 relinfo.layout = layout;
5762 relinfo.object = this;
5764 // Do relocation stubs scanning.
5765 const unsigned char* p = pshdrs + shdr_size;
5766 for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
5768 const elfcpp::Shdr<32, big_endian> shdr(p);
5769 if (this->section_needs_reloc_stub_scanning(shdr, out_sections, symtab,
5770 pshdrs))
5772 unsigned int index = this->adjust_shndx(shdr.get_sh_info());
5773 Arm_address output_offset = this->get_output_section_offset(index);
5774 Arm_address output_address;
5775 if(output_offset != invalid_address)
5776 output_address = out_sections[index]->address() + output_offset;
5777 else
5779 // Currently this only happens for a relaxed section.
5780 const Output_relaxed_input_section* poris =
5781 out_sections[index]->find_relaxed_input_section(this, index);
5782 gold_assert(poris != NULL);
5783 output_address = poris->address();
5786 // Get the relocations.
5787 const unsigned char* prelocs = this->get_view(shdr.get_sh_offset(),
5788 shdr.get_sh_size(),
5789 true, false);
5791 // Get the section contents. This does work for the case in which
5792 // we modify the contents of an input section. We need to pass the
5793 // output view under such circumstances.
5794 section_size_type input_view_size = 0;
5795 const unsigned char* input_view =
5796 this->section_contents(index, &input_view_size, false);
5798 relinfo.reloc_shndx = i;
5799 relinfo.data_shndx = index;
5800 unsigned int sh_type = shdr.get_sh_type();
5801 unsigned int reloc_size;
5802 if (sh_type == elfcpp::SHT_REL)
5803 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
5804 else
5805 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
5807 Output_section* os = out_sections[index];
5808 arm_target->scan_section_for_stubs(&relinfo, sh_type, prelocs,
5809 shdr.get_sh_size() / reloc_size,
5811 output_offset == invalid_address,
5812 input_view, output_address,
5813 input_view_size);
5817 // Do Cortex-A8 erratum stubs scanning. This has to be done for a section
5818 // after its relocation section, if there is one, is processed for
5819 // relocation stubs. Merging this loop with the one above would have been
5820 // complicated since we would have had to make sure that relocation stub
5821 // scanning is done first.
5822 if (arm_target->fix_cortex_a8())
5824 const unsigned char* p = pshdrs + shdr_size;
5825 for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
5827 const elfcpp::Shdr<32, big_endian> shdr(p);
5828 if (this->section_needs_cortex_a8_stub_scanning(shdr, i,
5829 out_sections[i],
5830 symtab))
5831 this->scan_section_for_cortex_a8_erratum(shdr, i, out_sections[i],
5832 arm_target);
5836 // After we've done the relocations, we release the hash tables,
5837 // since we no longer need them.
5838 this->free_input_to_output_maps();
5841 // Count the local symbols. The ARM backend needs to know if a symbol
5842 // is a THUMB function or not. For global symbols, it is easy because
5843 // the Symbol object keeps the ELF symbol type. For local symbol it is
5844 // harder because we cannot access this information. So we override the
5845 // do_count_local_symbol in parent and scan local symbols to mark
5846 // THUMB functions. This is not the most efficient way but I do not want to
5847 // slow down other ports by calling a per symbol targer hook inside
5848 // Sized_relobj<size, big_endian>::do_count_local_symbols.
5850 template<bool big_endian>
5851 void
5852 Arm_relobj<big_endian>::do_count_local_symbols(
5853 Stringpool_template<char>* pool,
5854 Stringpool_template<char>* dynpool)
5856 // We need to fix-up the values of any local symbols whose type are
5857 // STT_ARM_TFUNC.
5859 // Ask parent to count the local symbols.
5860 Sized_relobj<32, big_endian>::do_count_local_symbols(pool, dynpool);
5861 const unsigned int loccount = this->local_symbol_count();
5862 if (loccount == 0)
5863 return;
5865 // Intialize the thumb function bit-vector.
5866 std::vector<bool> empty_vector(loccount, false);
5867 this->local_symbol_is_thumb_function_.swap(empty_vector);
5869 // Read the symbol table section header.
5870 const unsigned int symtab_shndx = this->symtab_shndx();
5871 elfcpp::Shdr<32, big_endian>
5872 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
5873 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
5875 // Read the local symbols.
5876 const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
5877 gold_assert(loccount == symtabshdr.get_sh_info());
5878 off_t locsize = loccount * sym_size;
5879 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
5880 locsize, true, true);
5882 // For mapping symbol processing, we need to read the symbol names.
5883 unsigned int strtab_shndx = this->adjust_shndx(symtabshdr.get_sh_link());
5884 if (strtab_shndx >= this->shnum())
5886 this->error(_("invalid symbol table name index: %u"), strtab_shndx);
5887 return;
5890 elfcpp::Shdr<32, big_endian>
5891 strtabshdr(this, this->elf_file()->section_header(strtab_shndx));
5892 if (strtabshdr.get_sh_type() != elfcpp::SHT_STRTAB)
5894 this->error(_("symbol table name section has wrong type: %u"),
5895 static_cast<unsigned int>(strtabshdr.get_sh_type()));
5896 return;
5898 const char* pnames =
5899 reinterpret_cast<const char*>(this->get_view(strtabshdr.get_sh_offset(),
5900 strtabshdr.get_sh_size(),
5901 false, false));
5903 // Loop over the local symbols and mark any local symbols pointing
5904 // to THUMB functions.
5906 // Skip the first dummy symbol.
5907 psyms += sym_size;
5908 typename Sized_relobj<32, big_endian>::Local_values* plocal_values =
5909 this->local_values();
5910 for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
5912 elfcpp::Sym<32, big_endian> sym(psyms);
5913 elfcpp::STT st_type = sym.get_st_type();
5914 Symbol_value<32>& lv((*plocal_values)[i]);
5915 Arm_address input_value = lv.input_value();
5917 // Check to see if this is a mapping symbol.
5918 const char* sym_name = pnames + sym.get_st_name();
5919 if (Target_arm<big_endian>::is_mapping_symbol_name(sym_name))
5921 unsigned int input_shndx = sym.get_st_shndx();
5923 // Strip of LSB in case this is a THUMB symbol.
5924 Mapping_symbol_position msp(input_shndx, input_value & ~1U);
5925 this->mapping_symbols_info_[msp] = sym_name[1];
5928 if (st_type == elfcpp::STT_ARM_TFUNC
5929 || (st_type == elfcpp::STT_FUNC && ((input_value & 1) != 0)))
5931 // This is a THUMB function. Mark this and canonicalize the
5932 // symbol value by setting LSB.
5933 this->local_symbol_is_thumb_function_[i] = true;
5934 if ((input_value & 1) == 0)
5935 lv.set_input_value(input_value | 1);
5940 // Relocate sections.
5941 template<bool big_endian>
5942 void
5943 Arm_relobj<big_endian>::do_relocate_sections(
5944 const Symbol_table* symtab,
5945 const Layout* layout,
5946 const unsigned char* pshdrs,
5947 typename Sized_relobj<32, big_endian>::Views* pviews)
5949 // Call parent to relocate sections.
5950 Sized_relobj<32, big_endian>::do_relocate_sections(symtab, layout, pshdrs,
5951 pviews);
5953 // We do not generate stubs if doing a relocatable link.
5954 if (parameters->options().relocatable())
5955 return;
5957 // Relocate stub tables.
5958 unsigned int shnum = this->shnum();
5960 Target_arm<big_endian>* arm_target =
5961 Target_arm<big_endian>::default_target();
5963 Relocate_info<32, big_endian> relinfo;
5964 relinfo.symtab = symtab;
5965 relinfo.layout = layout;
5966 relinfo.object = this;
5968 for (unsigned int i = 1; i < shnum; ++i)
5970 Arm_input_section<big_endian>* arm_input_section =
5971 arm_target->find_arm_input_section(this, i);
5973 if (arm_input_section != NULL
5974 && arm_input_section->is_stub_table_owner()
5975 && !arm_input_section->stub_table()->empty())
5977 // We cannot discard a section if it owns a stub table.
5978 Output_section* os = this->output_section(i);
5979 gold_assert(os != NULL);
5981 relinfo.reloc_shndx = elfcpp::SHN_UNDEF;
5982 relinfo.reloc_shdr = NULL;
5983 relinfo.data_shndx = i;
5984 relinfo.data_shdr = pshdrs + i * elfcpp::Elf_sizes<32>::shdr_size;
5986 gold_assert((*pviews)[i].view != NULL);
5988 // We are passed the output section view. Adjust it to cover the
5989 // stub table only.
5990 Stub_table<big_endian>* stub_table = arm_input_section->stub_table();
5991 gold_assert((stub_table->address() >= (*pviews)[i].address)
5992 && ((stub_table->address() + stub_table->data_size())
5993 <= (*pviews)[i].address + (*pviews)[i].view_size));
5995 off_t offset = stub_table->address() - (*pviews)[i].address;
5996 unsigned char* view = (*pviews)[i].view + offset;
5997 Arm_address address = stub_table->address();
5998 section_size_type view_size = stub_table->data_size();
6000 stub_table->relocate_stubs(&relinfo, arm_target, os, view, address,
6001 view_size);
6004 // Apply Cortex A8 workaround if applicable.
6005 if (this->section_has_cortex_a8_workaround(i))
6007 unsigned char* view = (*pviews)[i].view;
6008 Arm_address view_address = (*pviews)[i].address;
6009 section_size_type view_size = (*pviews)[i].view_size;
6010 Stub_table<big_endian>* stub_table = this->stub_tables_[i];
6012 // Adjust view to cover section.
6013 Output_section* os = this->output_section(i);
6014 gold_assert(os != NULL);
6015 Arm_address section_address =
6016 this->simple_input_section_output_address(i, os);
6017 uint64_t section_size = this->section_size(i);
6019 gold_assert(section_address >= view_address
6020 && ((section_address + section_size)
6021 <= (view_address + view_size)));
6023 unsigned char* section_view = view + (section_address - view_address);
6025 // Apply the Cortex-A8 workaround to the output address range
6026 // corresponding to this input section.
6027 stub_table->apply_cortex_a8_workaround_to_address_range(
6028 arm_target,
6029 section_view,
6030 section_address,
6031 section_size);
6036 // Find the linked text section of an EXIDX section by looking the the first
6037 // relocation. 4.4.1 of the EHABI specifications says that an EXIDX section
6038 // must be linked to to its associated code section via the sh_link field of
6039 // its section header. However, some tools are broken and the link is not
6040 // always set. LD just drops such an EXIDX section silently, causing the
6041 // associated code not unwindabled. Here we try a little bit harder to
6042 // discover the linked code section.
6044 // PSHDR points to the section header of a relocation section of an EXIDX
6045 // section. If we can find a linked text section, return true and
6046 // store the text section index in the location PSHNDX. Otherwise
6047 // return false.
6049 template<bool big_endian>
6050 bool
6051 Arm_relobj<big_endian>::find_linked_text_section(
6052 const unsigned char* pshdr,
6053 const unsigned char* psyms,
6054 unsigned int* pshndx)
6056 elfcpp::Shdr<32, big_endian> shdr(pshdr);
6058 // If there is no relocation, we cannot find the linked text section.
6059 size_t reloc_size;
6060 if (shdr.get_sh_type() == elfcpp::SHT_REL)
6061 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6062 else
6063 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6064 size_t reloc_count = shdr.get_sh_size() / reloc_size;
6066 // Get the relocations.
6067 const unsigned char* prelocs =
6068 this->get_view(shdr.get_sh_offset(), shdr.get_sh_size(), true, false);
6070 // Find the REL31 relocation for the first word of the first EXIDX entry.
6071 for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
6073 Arm_address r_offset;
6074 typename elfcpp::Elf_types<32>::Elf_WXword r_info;
6075 if (shdr.get_sh_type() == elfcpp::SHT_REL)
6077 typename elfcpp::Rel<32, big_endian> reloc(prelocs);
6078 r_info = reloc.get_r_info();
6079 r_offset = reloc.get_r_offset();
6081 else
6083 typename elfcpp::Rela<32, big_endian> reloc(prelocs);
6084 r_info = reloc.get_r_info();
6085 r_offset = reloc.get_r_offset();
6088 unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
6089 if (r_type != elfcpp::R_ARM_PREL31 && r_type != elfcpp::R_ARM_SBREL31)
6090 continue;
6092 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
6093 if (r_sym == 0
6094 || r_sym >= this->local_symbol_count()
6095 || r_offset != 0)
6096 continue;
6098 // This is the relocation for the first word of the first EXIDX entry.
6099 // We expect to see a local section symbol.
6100 const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6101 elfcpp::Sym<32, big_endian> sym(psyms + r_sym * sym_size);
6102 if (sym.get_st_type() == elfcpp::STT_SECTION)
6104 *pshndx = this->adjust_shndx(sym.get_st_shndx());
6105 return true;
6107 else
6108 return false;
6111 return false;
6114 // Make an EXIDX input section object for an EXIDX section whose index is
6115 // SHNDX. SHDR is the section header of the EXIDX section and TEXT_SHNDX
6116 // is the section index of the linked text section.
6118 template<bool big_endian>
6119 void
6120 Arm_relobj<big_endian>::make_exidx_input_section(
6121 unsigned int shndx,
6122 const elfcpp::Shdr<32, big_endian>& shdr,
6123 unsigned int text_shndx)
6125 // Issue an error and ignore this EXIDX section if it points to a text
6126 // section already has an EXIDX section.
6127 if (this->exidx_section_map_[text_shndx] != NULL)
6129 gold_error(_("EXIDX sections %u and %u both link to text section %u "
6130 "in %s"),
6131 shndx, this->exidx_section_map_[text_shndx]->shndx(),
6132 text_shndx, this->name().c_str());
6133 return;
6136 // Create an Arm_exidx_input_section object for this EXIDX section.
6137 Arm_exidx_input_section* exidx_input_section =
6138 new Arm_exidx_input_section(this, shndx, text_shndx, shdr.get_sh_size(),
6139 shdr.get_sh_addralign());
6140 this->exidx_section_map_[text_shndx] = exidx_input_section;
6142 // Also map the EXIDX section index to this.
6143 gold_assert(this->exidx_section_map_[shndx] == NULL);
6144 this->exidx_section_map_[shndx] = exidx_input_section;
6147 // Read the symbol information.
6149 template<bool big_endian>
6150 void
6151 Arm_relobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
6153 // Call parent class to read symbol information.
6154 Sized_relobj<32, big_endian>::do_read_symbols(sd);
6156 // Read processor-specific flags in ELF file header.
6157 const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
6158 elfcpp::Elf_sizes<32>::ehdr_size,
6159 true, false);
6160 elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
6161 this->processor_specific_flags_ = ehdr.get_e_flags();
6163 // Go over the section headers and look for .ARM.attributes and .ARM.exidx
6164 // sections.
6165 std::vector<unsigned int> deferred_exidx_sections;
6166 const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6167 const unsigned char* pshdrs = sd->section_headers->data();
6168 const unsigned char *ps = pshdrs + shdr_size;
6169 for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6171 elfcpp::Shdr<32, big_endian> shdr(ps);
6172 if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
6174 gold_assert(this->attributes_section_data_ == NULL);
6175 section_offset_type section_offset = shdr.get_sh_offset();
6176 section_size_type section_size =
6177 convert_to_section_size_type(shdr.get_sh_size());
6178 File_view* view = this->get_lasting_view(section_offset,
6179 section_size, true, false);
6180 this->attributes_section_data_ =
6181 new Attributes_section_data(view->data(), section_size);
6183 else if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
6185 unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
6186 if (text_shndx >= this->shnum())
6187 gold_error(_("EXIDX section %u linked to invalid section %u"),
6188 i, text_shndx);
6189 else if (text_shndx == elfcpp::SHN_UNDEF)
6190 deferred_exidx_sections.push_back(i);
6191 else
6192 this->make_exidx_input_section(i, shdr, text_shndx);
6196 // Some tools are broken and they do not set the link of EXIDX sections.
6197 // We look at the first relocation to figure out the linked sections.
6198 if (!deferred_exidx_sections.empty())
6200 // We need to go over the section headers again to find the mapping
6201 // from sections being relocated to their relocation sections. This is
6202 // a bit inefficient as we could do that in the loop above. However,
6203 // we do not expect any deferred EXIDX sections normally. So we do not
6204 // want to slow down the most common path.
6205 typedef Unordered_map<unsigned int, unsigned int> Reloc_map;
6206 Reloc_map reloc_map;
6207 ps = pshdrs + shdr_size;
6208 for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6210 elfcpp::Shdr<32, big_endian> shdr(ps);
6211 elfcpp::Elf_Word sh_type = shdr.get_sh_type();
6212 if (sh_type == elfcpp::SHT_REL || sh_type == elfcpp::SHT_RELA)
6214 unsigned int info_shndx = this->adjust_shndx(shdr.get_sh_info());
6215 if (info_shndx >= this->shnum())
6216 gold_error(_("relocation section %u has invalid info %u"),
6217 i, info_shndx);
6218 Reloc_map::value_type value(info_shndx, i);
6219 std::pair<Reloc_map::iterator, bool> result =
6220 reloc_map.insert(value);
6221 if (!result.second)
6222 gold_error(_("section %u has multiple relocation sections "
6223 "%u and %u"),
6224 info_shndx, i, reloc_map[info_shndx]);
6228 // Read the symbol table section header.
6229 const unsigned int symtab_shndx = this->symtab_shndx();
6230 elfcpp::Shdr<32, big_endian>
6231 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6232 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6234 // Read the local symbols.
6235 const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
6236 const unsigned int loccount = this->local_symbol_count();
6237 gold_assert(loccount == symtabshdr.get_sh_info());
6238 off_t locsize = loccount * sym_size;
6239 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6240 locsize, true, true);
6242 // Process the deferred EXIDX sections.
6243 for(unsigned int i = 0; i < deferred_exidx_sections.size(); ++i)
6245 unsigned int shndx = deferred_exidx_sections[i];
6246 elfcpp::Shdr<32, big_endian> shdr(pshdrs + shndx * shdr_size);
6247 unsigned int text_shndx;
6248 Reloc_map::const_iterator it = reloc_map.find(shndx);
6249 if (it != reloc_map.end()
6250 && find_linked_text_section(pshdrs + it->second * shdr_size,
6251 psyms, &text_shndx))
6252 this->make_exidx_input_section(shndx, shdr, text_shndx);
6253 else
6254 gold_error(_("EXIDX section %u has no linked text section."),
6255 shndx);
6260 // Process relocations for garbage collection. The ARM target uses .ARM.exidx
6261 // sections for unwinding. These sections are referenced implicitly by
6262 // text sections linked in the section headers. If we ignore these implict
6263 // references, the .ARM.exidx sections and any .ARM.extab sections they use
6264 // will be garbage-collected incorrectly. Hence we override the same function
6265 // in the base class to handle these implicit references.
6267 template<bool big_endian>
6268 void
6269 Arm_relobj<big_endian>::do_gc_process_relocs(Symbol_table* symtab,
6270 Layout* layout,
6271 Read_relocs_data* rd)
6273 // First, call base class method to process relocations in this object.
6274 Sized_relobj<32, big_endian>::do_gc_process_relocs(symtab, layout, rd);
6276 unsigned int shnum = this->shnum();
6277 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6278 const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
6279 shnum * shdr_size,
6280 true, true);
6282 // Scan section headers for sections of type SHT_ARM_EXIDX. Add references
6283 // to these from the linked text sections.
6284 const unsigned char* ps = pshdrs + shdr_size;
6285 for (unsigned int i = 1; i < shnum; ++i, ps += shdr_size)
6287 elfcpp::Shdr<32, big_endian> shdr(ps);
6288 if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
6290 // Found an .ARM.exidx section, add it to the set of reachable
6291 // sections from its linked text section.
6292 unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
6293 symtab->gc()->add_reference(this, text_shndx, this, i);
6298 // Update output local symbol count. Owing to EXIDX entry merging, some local
6299 // symbols will be removed in output. Adjust output local symbol count
6300 // accordingly. We can only changed the static output local symbol count. It
6301 // is too late to change the dynamic symbols.
6303 template<bool big_endian>
6304 void
6305 Arm_relobj<big_endian>::update_output_local_symbol_count()
6307 // Caller should check that this needs updating. We want caller checking
6308 // because output_local_symbol_count_needs_update() is most likely inlined.
6309 gold_assert(this->output_local_symbol_count_needs_update_);
6311 gold_assert(this->symtab_shndx() != -1U);
6312 if (this->symtab_shndx() == 0)
6314 // This object has no symbols. Weird but legal.
6315 return;
6318 // Read the symbol table section header.
6319 const unsigned int symtab_shndx = this->symtab_shndx();
6320 elfcpp::Shdr<32, big_endian>
6321 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6322 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6324 // Read the local symbols.
6325 const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6326 const unsigned int loccount = this->local_symbol_count();
6327 gold_assert(loccount == symtabshdr.get_sh_info());
6328 off_t locsize = loccount * sym_size;
6329 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6330 locsize, true, true);
6332 // Loop over the local symbols.
6334 typedef typename Sized_relobj<32, big_endian>::Output_sections
6335 Output_sections;
6336 const Output_sections& out_sections(this->output_sections());
6337 unsigned int shnum = this->shnum();
6338 unsigned int count = 0;
6339 // Skip the first, dummy, symbol.
6340 psyms += sym_size;
6341 for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
6343 elfcpp::Sym<32, big_endian> sym(psyms);
6345 Symbol_value<32>& lv((*this->local_values())[i]);
6347 // This local symbol was already discarded by do_count_local_symbols.
6348 if (!lv.needs_output_symtab_entry())
6349 continue;
6351 bool is_ordinary;
6352 unsigned int shndx = this->adjust_sym_shndx(i, sym.get_st_shndx(),
6353 &is_ordinary);
6355 if (shndx < shnum)
6357 Output_section* os = out_sections[shndx];
6359 // This local symbol no longer has an output section. Discard it.
6360 if (os == NULL)
6362 lv.set_no_output_symtab_entry();
6363 continue;
6366 // Currently we only discard parts of EXIDX input sections.
6367 // We explicitly check for a merged EXIDX input section to avoid
6368 // calling Output_section_data::output_offset unless necessary.
6369 if ((this->get_output_section_offset(shndx) == invalid_address)
6370 && (this->exidx_input_section_by_shndx(shndx) != NULL))
6372 section_offset_type output_offset =
6373 os->output_offset(this, shndx, lv.input_value());
6374 if (output_offset == -1)
6376 // This symbol is defined in a part of an EXIDX input section
6377 // that is discarded due to entry merging.
6378 lv.set_no_output_symtab_entry();
6379 continue;
6384 ++count;
6387 this->set_output_local_symbol_count(count);
6388 this->output_local_symbol_count_needs_update_ = false;
6391 // Arm_dynobj methods.
6393 // Read the symbol information.
6395 template<bool big_endian>
6396 void
6397 Arm_dynobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
6399 // Call parent class to read symbol information.
6400 Sized_dynobj<32, big_endian>::do_read_symbols(sd);
6402 // Read processor-specific flags in ELF file header.
6403 const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
6404 elfcpp::Elf_sizes<32>::ehdr_size,
6405 true, false);
6406 elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
6407 this->processor_specific_flags_ = ehdr.get_e_flags();
6409 // Read the attributes section if there is one.
6410 // We read from the end because gas seems to put it near the end of
6411 // the section headers.
6412 const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6413 const unsigned char *ps =
6414 sd->section_headers->data() + shdr_size * (this->shnum() - 1);
6415 for (unsigned int i = this->shnum(); i > 0; --i, ps -= shdr_size)
6417 elfcpp::Shdr<32, big_endian> shdr(ps);
6418 if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
6420 section_offset_type section_offset = shdr.get_sh_offset();
6421 section_size_type section_size =
6422 convert_to_section_size_type(shdr.get_sh_size());
6423 File_view* view = this->get_lasting_view(section_offset,
6424 section_size, true, false);
6425 this->attributes_section_data_ =
6426 new Attributes_section_data(view->data(), section_size);
6427 break;
6432 // Stub_addend_reader methods.
6434 // Read the addend of a REL relocation of type R_TYPE at VIEW.
6436 template<bool big_endian>
6437 elfcpp::Elf_types<32>::Elf_Swxword
6438 Stub_addend_reader<elfcpp::SHT_REL, big_endian>::operator()(
6439 unsigned int r_type,
6440 const unsigned char* view,
6441 const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const
6443 typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
6445 switch (r_type)
6447 case elfcpp::R_ARM_CALL:
6448 case elfcpp::R_ARM_JUMP24:
6449 case elfcpp::R_ARM_PLT32:
6451 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
6452 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
6453 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
6454 return utils::sign_extend<26>(val << 2);
6457 case elfcpp::R_ARM_THM_CALL:
6458 case elfcpp::R_ARM_THM_JUMP24:
6459 case elfcpp::R_ARM_THM_XPC22:
6461 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
6462 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
6463 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
6464 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
6465 return RelocFuncs::thumb32_branch_offset(upper_insn, lower_insn);
6468 case elfcpp::R_ARM_THM_JUMP19:
6470 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
6471 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
6472 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
6473 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
6474 return RelocFuncs::thumb32_cond_branch_offset(upper_insn, lower_insn);
6477 default:
6478 gold_unreachable();
6482 // A class to handle the PLT data.
6484 template<bool big_endian>
6485 class Output_data_plt_arm : public Output_section_data
6487 public:
6488 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
6489 Reloc_section;
6491 Output_data_plt_arm(Layout*, Output_data_space*);
6493 // Add an entry to the PLT.
6494 void
6495 add_entry(Symbol* gsym);
6497 // Return the .rel.plt section data.
6498 const Reloc_section*
6499 rel_plt() const
6500 { return this->rel_; }
6502 protected:
6503 void
6504 do_adjust_output_section(Output_section* os);
6506 // Write to a map file.
6507 void
6508 do_print_to_mapfile(Mapfile* mapfile) const
6509 { mapfile->print_output_data(this, _("** PLT")); }
6511 private:
6512 // Template for the first PLT entry.
6513 static const uint32_t first_plt_entry[5];
6515 // Template for subsequent PLT entries.
6516 static const uint32_t plt_entry[3];
6518 // Set the final size.
6519 void
6520 set_final_data_size()
6522 this->set_data_size(sizeof(first_plt_entry)
6523 + this->count_ * sizeof(plt_entry));
6526 // Write out the PLT data.
6527 void
6528 do_write(Output_file*);
6530 // The reloc section.
6531 Reloc_section* rel_;
6532 // The .got.plt section.
6533 Output_data_space* got_plt_;
6534 // The number of PLT entries.
6535 unsigned int count_;
6538 // Create the PLT section. The ordinary .got section is an argument,
6539 // since we need to refer to the start. We also create our own .got
6540 // section just for PLT entries.
6542 template<bool big_endian>
6543 Output_data_plt_arm<big_endian>::Output_data_plt_arm(Layout* layout,
6544 Output_data_space* got_plt)
6545 : Output_section_data(4), got_plt_(got_plt), count_(0)
6547 this->rel_ = new Reloc_section(false);
6548 layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
6549 elfcpp::SHF_ALLOC, this->rel_, true, false,
6550 false, false);
6553 template<bool big_endian>
6554 void
6555 Output_data_plt_arm<big_endian>::do_adjust_output_section(Output_section* os)
6557 os->set_entsize(0);
6560 // Add an entry to the PLT.
6562 template<bool big_endian>
6563 void
6564 Output_data_plt_arm<big_endian>::add_entry(Symbol* gsym)
6566 gold_assert(!gsym->has_plt_offset());
6568 // Note that when setting the PLT offset we skip the initial
6569 // reserved PLT entry.
6570 gsym->set_plt_offset((this->count_) * sizeof(plt_entry)
6571 + sizeof(first_plt_entry));
6573 ++this->count_;
6575 section_offset_type got_offset = this->got_plt_->current_data_size();
6577 // Every PLT entry needs a GOT entry which points back to the PLT
6578 // entry (this will be changed by the dynamic linker, normally
6579 // lazily when the function is called).
6580 this->got_plt_->set_current_data_size(got_offset + 4);
6582 // Every PLT entry needs a reloc.
6583 gsym->set_needs_dynsym_entry();
6584 this->rel_->add_global(gsym, elfcpp::R_ARM_JUMP_SLOT, this->got_plt_,
6585 got_offset);
6587 // Note that we don't need to save the symbol. The contents of the
6588 // PLT are independent of which symbols are used. The symbols only
6589 // appear in the relocations.
6592 // ARM PLTs.
6593 // FIXME: This is not very flexible. Right now this has only been tested
6594 // on armv5te. If we are to support additional architecture features like
6595 // Thumb-2 or BE8, we need to make this more flexible like GNU ld.
6597 // The first entry in the PLT.
6598 template<bool big_endian>
6599 const uint32_t Output_data_plt_arm<big_endian>::first_plt_entry[5] =
6601 0xe52de004, // str lr, [sp, #-4]!
6602 0xe59fe004, // ldr lr, [pc, #4]
6603 0xe08fe00e, // add lr, pc, lr
6604 0xe5bef008, // ldr pc, [lr, #8]!
6605 0x00000000, // &GOT[0] - .
6608 // Subsequent entries in the PLT.
6610 template<bool big_endian>
6611 const uint32_t Output_data_plt_arm<big_endian>::plt_entry[3] =
6613 0xe28fc600, // add ip, pc, #0xNN00000
6614 0xe28cca00, // add ip, ip, #0xNN000
6615 0xe5bcf000, // ldr pc, [ip, #0xNNN]!
6618 // Write out the PLT. This uses the hand-coded instructions above,
6619 // and adjusts them as needed. This is all specified by the arm ELF
6620 // Processor Supplement.
6622 template<bool big_endian>
6623 void
6624 Output_data_plt_arm<big_endian>::do_write(Output_file* of)
6626 const off_t offset = this->offset();
6627 const section_size_type oview_size =
6628 convert_to_section_size_type(this->data_size());
6629 unsigned char* const oview = of->get_output_view(offset, oview_size);
6631 const off_t got_file_offset = this->got_plt_->offset();
6632 const section_size_type got_size =
6633 convert_to_section_size_type(this->got_plt_->data_size());
6634 unsigned char* const got_view = of->get_output_view(got_file_offset,
6635 got_size);
6636 unsigned char* pov = oview;
6638 Arm_address plt_address = this->address();
6639 Arm_address got_address = this->got_plt_->address();
6641 // Write first PLT entry. All but the last word are constants.
6642 const size_t num_first_plt_words = (sizeof(first_plt_entry)
6643 / sizeof(plt_entry[0]));
6644 for (size_t i = 0; i < num_first_plt_words - 1; i++)
6645 elfcpp::Swap<32, big_endian>::writeval(pov + i * 4, first_plt_entry[i]);
6646 // Last word in first PLT entry is &GOT[0] - .
6647 elfcpp::Swap<32, big_endian>::writeval(pov + 16,
6648 got_address - (plt_address + 16));
6649 pov += sizeof(first_plt_entry);
6651 unsigned char* got_pov = got_view;
6653 memset(got_pov, 0, 12);
6654 got_pov += 12;
6656 const int rel_size = elfcpp::Elf_sizes<32>::rel_size;
6657 unsigned int plt_offset = sizeof(first_plt_entry);
6658 unsigned int plt_rel_offset = 0;
6659 unsigned int got_offset = 12;
6660 const unsigned int count = this->count_;
6661 for (unsigned int i = 0;
6662 i < count;
6663 ++i,
6664 pov += sizeof(plt_entry),
6665 got_pov += 4,
6666 plt_offset += sizeof(plt_entry),
6667 plt_rel_offset += rel_size,
6668 got_offset += 4)
6670 // Set and adjust the PLT entry itself.
6671 int32_t offset = ((got_address + got_offset)
6672 - (plt_address + plt_offset + 8));
6674 gold_assert(offset >= 0 && offset < 0x0fffffff);
6675 uint32_t plt_insn0 = plt_entry[0] | ((offset >> 20) & 0xff);
6676 elfcpp::Swap<32, big_endian>::writeval(pov, plt_insn0);
6677 uint32_t plt_insn1 = plt_entry[1] | ((offset >> 12) & 0xff);
6678 elfcpp::Swap<32, big_endian>::writeval(pov + 4, plt_insn1);
6679 uint32_t plt_insn2 = plt_entry[2] | (offset & 0xfff);
6680 elfcpp::Swap<32, big_endian>::writeval(pov + 8, plt_insn2);
6682 // Set the entry in the GOT.
6683 elfcpp::Swap<32, big_endian>::writeval(got_pov, plt_address);
6686 gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
6687 gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
6689 of->write_output_view(offset, oview_size, oview);
6690 of->write_output_view(got_file_offset, got_size, got_view);
6693 // Create a PLT entry for a global symbol.
6695 template<bool big_endian>
6696 void
6697 Target_arm<big_endian>::make_plt_entry(Symbol_table* symtab, Layout* layout,
6698 Symbol* gsym)
6700 if (gsym->has_plt_offset())
6701 return;
6703 if (this->plt_ == NULL)
6705 // Create the GOT sections first.
6706 this->got_section(symtab, layout);
6708 this->plt_ = new Output_data_plt_arm<big_endian>(layout, this->got_plt_);
6709 layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
6710 (elfcpp::SHF_ALLOC
6711 | elfcpp::SHF_EXECINSTR),
6712 this->plt_, false, false, false, false);
6714 this->plt_->add_entry(gsym);
6717 // Get the section to use for TLS_DESC relocations.
6719 template<bool big_endian>
6720 typename Target_arm<big_endian>::Reloc_section*
6721 Target_arm<big_endian>::rel_tls_desc_section(Layout* layout) const
6723 return this->plt_section()->rel_tls_desc(layout);
6726 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
6728 template<bool big_endian>
6729 void
6730 Target_arm<big_endian>::define_tls_base_symbol(
6731 Symbol_table* symtab,
6732 Layout* layout)
6734 if (this->tls_base_symbol_defined_)
6735 return;
6737 Output_segment* tls_segment = layout->tls_segment();
6738 if (tls_segment != NULL)
6740 bool is_exec = parameters->options().output_is_executable();
6741 symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL,
6742 Symbol_table::PREDEFINED,
6743 tls_segment, 0, 0,
6744 elfcpp::STT_TLS,
6745 elfcpp::STB_LOCAL,
6746 elfcpp::STV_HIDDEN, 0,
6747 (is_exec
6748 ? Symbol::SEGMENT_END
6749 : Symbol::SEGMENT_START),
6750 true);
6752 this->tls_base_symbol_defined_ = true;
6755 // Create a GOT entry for the TLS module index.
6757 template<bool big_endian>
6758 unsigned int
6759 Target_arm<big_endian>::got_mod_index_entry(
6760 Symbol_table* symtab,
6761 Layout* layout,
6762 Sized_relobj<32, big_endian>* object)
6764 if (this->got_mod_index_offset_ == -1U)
6766 gold_assert(symtab != NULL && layout != NULL && object != NULL);
6767 Reloc_section* rel_dyn = this->rel_dyn_section(layout);
6768 Output_data_got<32, big_endian>* got = this->got_section(symtab, layout);
6769 unsigned int got_offset = got->add_constant(0);
6770 rel_dyn->add_local(object, 0, elfcpp::R_ARM_TLS_DTPMOD32, got,
6771 got_offset);
6772 got->add_constant(0);
6773 this->got_mod_index_offset_ = got_offset;
6775 return this->got_mod_index_offset_;
6778 // Optimize the TLS relocation type based on what we know about the
6779 // symbol. IS_FINAL is true if the final address of this symbol is
6780 // known at link time.
6782 template<bool big_endian>
6783 tls::Tls_optimization
6784 Target_arm<big_endian>::optimize_tls_reloc(bool, int)
6786 // FIXME: Currently we do not do any TLS optimization.
6787 return tls::TLSOPT_NONE;
6790 // Report an unsupported relocation against a local symbol.
6792 template<bool big_endian>
6793 void
6794 Target_arm<big_endian>::Scan::unsupported_reloc_local(
6795 Sized_relobj<32, big_endian>* object,
6796 unsigned int r_type)
6798 gold_error(_("%s: unsupported reloc %u against local symbol"),
6799 object->name().c_str(), r_type);
6802 // We are about to emit a dynamic relocation of type R_TYPE. If the
6803 // dynamic linker does not support it, issue an error. The GNU linker
6804 // only issues a non-PIC error for an allocated read-only section.
6805 // Here we know the section is allocated, but we don't know that it is
6806 // read-only. But we check for all the relocation types which the
6807 // glibc dynamic linker supports, so it seems appropriate to issue an
6808 // error even if the section is not read-only.
6810 template<bool big_endian>
6811 void
6812 Target_arm<big_endian>::Scan::check_non_pic(Relobj* object,
6813 unsigned int r_type)
6815 switch (r_type)
6817 // These are the relocation types supported by glibc for ARM.
6818 case elfcpp::R_ARM_RELATIVE:
6819 case elfcpp::R_ARM_COPY:
6820 case elfcpp::R_ARM_GLOB_DAT:
6821 case elfcpp::R_ARM_JUMP_SLOT:
6822 case elfcpp::R_ARM_ABS32:
6823 case elfcpp::R_ARM_ABS32_NOI:
6824 case elfcpp::R_ARM_PC24:
6825 // FIXME: The following 3 types are not supported by Android's dynamic
6826 // linker.
6827 case elfcpp::R_ARM_TLS_DTPMOD32:
6828 case elfcpp::R_ARM_TLS_DTPOFF32:
6829 case elfcpp::R_ARM_TLS_TPOFF32:
6830 return;
6832 default:
6834 // This prevents us from issuing more than one error per reloc
6835 // section. But we can still wind up issuing more than one
6836 // error per object file.
6837 if (this->issued_non_pic_error_)
6838 return;
6839 const Arm_reloc_property* reloc_property =
6840 arm_reloc_property_table->get_reloc_property(r_type);
6841 gold_assert(reloc_property != NULL);
6842 object->error(_("requires unsupported dynamic reloc %s; "
6843 "recompile with -fPIC"),
6844 reloc_property->name().c_str());
6845 this->issued_non_pic_error_ = true;
6846 return;
6849 case elfcpp::R_ARM_NONE:
6850 gold_unreachable();
6854 // Scan a relocation for a local symbol.
6855 // FIXME: This only handles a subset of relocation types used by Android
6856 // on ARM v5te devices.
6858 template<bool big_endian>
6859 inline void
6860 Target_arm<big_endian>::Scan::local(Symbol_table* symtab,
6861 Layout* layout,
6862 Target_arm* target,
6863 Sized_relobj<32, big_endian>* object,
6864 unsigned int data_shndx,
6865 Output_section* output_section,
6866 const elfcpp::Rel<32, big_endian>& reloc,
6867 unsigned int r_type,
6868 const elfcpp::Sym<32, big_endian>& lsym)
6870 r_type = get_real_reloc_type(r_type);
6871 switch (r_type)
6873 case elfcpp::R_ARM_NONE:
6874 case elfcpp::R_ARM_V4BX:
6875 case elfcpp::R_ARM_GNU_VTENTRY:
6876 case elfcpp::R_ARM_GNU_VTINHERIT:
6877 break;
6879 case elfcpp::R_ARM_ABS32:
6880 case elfcpp::R_ARM_ABS32_NOI:
6881 // If building a shared library (or a position-independent
6882 // executable), we need to create a dynamic relocation for
6883 // this location. The relocation applied at link time will
6884 // apply the link-time value, so we flag the location with
6885 // an R_ARM_RELATIVE relocation so the dynamic loader can
6886 // relocate it easily.
6887 if (parameters->options().output_is_position_independent())
6889 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
6890 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
6891 // If we are to add more other reloc types than R_ARM_ABS32,
6892 // we need to add check_non_pic(object, r_type) here.
6893 rel_dyn->add_local_relative(object, r_sym, elfcpp::R_ARM_RELATIVE,
6894 output_section, data_shndx,
6895 reloc.get_r_offset());
6897 break;
6899 case elfcpp::R_ARM_ABS16:
6900 case elfcpp::R_ARM_ABS12:
6901 case elfcpp::R_ARM_THM_ABS5:
6902 case elfcpp::R_ARM_ABS8:
6903 case elfcpp::R_ARM_BASE_ABS:
6904 case elfcpp::R_ARM_MOVW_ABS_NC:
6905 case elfcpp::R_ARM_MOVT_ABS:
6906 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
6907 case elfcpp::R_ARM_THM_MOVT_ABS:
6908 // If building a shared library (or a position-independent
6909 // executable), we need to create a dynamic relocation for
6910 // this location. Because the addend needs to remain in the
6911 // data section, we need to be careful not to apply this
6912 // relocation statically.
6913 if (parameters->options().output_is_position_independent())
6915 check_non_pic(object, r_type);
6916 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
6917 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
6918 if (lsym.get_st_type() != elfcpp::STT_SECTION)
6919 rel_dyn->add_local(object, r_sym, r_type, output_section,
6920 data_shndx, reloc.get_r_offset());
6921 else
6923 gold_assert(lsym.get_st_value() == 0);
6924 unsigned int shndx = lsym.get_st_shndx();
6925 bool is_ordinary;
6926 shndx = object->adjust_sym_shndx(r_sym, shndx,
6927 &is_ordinary);
6928 if (!is_ordinary)
6929 object->error(_("section symbol %u has bad shndx %u"),
6930 r_sym, shndx);
6931 else
6932 rel_dyn->add_local_section(object, shndx,
6933 r_type, output_section,
6934 data_shndx, reloc.get_r_offset());
6937 break;
6939 case elfcpp::R_ARM_PC24:
6940 case elfcpp::R_ARM_REL32:
6941 case elfcpp::R_ARM_LDR_PC_G0:
6942 case elfcpp::R_ARM_SBREL32:
6943 case elfcpp::R_ARM_THM_CALL:
6944 case elfcpp::R_ARM_THM_PC8:
6945 case elfcpp::R_ARM_BASE_PREL:
6946 case elfcpp::R_ARM_PLT32:
6947 case elfcpp::R_ARM_CALL:
6948 case elfcpp::R_ARM_JUMP24:
6949 case elfcpp::R_ARM_THM_JUMP24:
6950 case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
6951 case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
6952 case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
6953 case elfcpp::R_ARM_SBREL31:
6954 case elfcpp::R_ARM_PREL31:
6955 case elfcpp::R_ARM_MOVW_PREL_NC:
6956 case elfcpp::R_ARM_MOVT_PREL:
6957 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
6958 case elfcpp::R_ARM_THM_MOVT_PREL:
6959 case elfcpp::R_ARM_THM_JUMP19:
6960 case elfcpp::R_ARM_THM_JUMP6:
6961 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
6962 case elfcpp::R_ARM_THM_PC12:
6963 case elfcpp::R_ARM_REL32_NOI:
6964 case elfcpp::R_ARM_ALU_PC_G0_NC:
6965 case elfcpp::R_ARM_ALU_PC_G0:
6966 case elfcpp::R_ARM_ALU_PC_G1_NC:
6967 case elfcpp::R_ARM_ALU_PC_G1:
6968 case elfcpp::R_ARM_ALU_PC_G2:
6969 case elfcpp::R_ARM_LDR_PC_G1:
6970 case elfcpp::R_ARM_LDR_PC_G2:
6971 case elfcpp::R_ARM_LDRS_PC_G0:
6972 case elfcpp::R_ARM_LDRS_PC_G1:
6973 case elfcpp::R_ARM_LDRS_PC_G2:
6974 case elfcpp::R_ARM_LDC_PC_G0:
6975 case elfcpp::R_ARM_LDC_PC_G1:
6976 case elfcpp::R_ARM_LDC_PC_G2:
6977 case elfcpp::R_ARM_ALU_SB_G0_NC:
6978 case elfcpp::R_ARM_ALU_SB_G0:
6979 case elfcpp::R_ARM_ALU_SB_G1_NC:
6980 case elfcpp::R_ARM_ALU_SB_G1:
6981 case elfcpp::R_ARM_ALU_SB_G2:
6982 case elfcpp::R_ARM_LDR_SB_G0:
6983 case elfcpp::R_ARM_LDR_SB_G1:
6984 case elfcpp::R_ARM_LDR_SB_G2:
6985 case elfcpp::R_ARM_LDRS_SB_G0:
6986 case elfcpp::R_ARM_LDRS_SB_G1:
6987 case elfcpp::R_ARM_LDRS_SB_G2:
6988 case elfcpp::R_ARM_LDC_SB_G0:
6989 case elfcpp::R_ARM_LDC_SB_G1:
6990 case elfcpp::R_ARM_LDC_SB_G2:
6991 case elfcpp::R_ARM_MOVW_BREL_NC:
6992 case elfcpp::R_ARM_MOVT_BREL:
6993 case elfcpp::R_ARM_MOVW_BREL:
6994 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
6995 case elfcpp::R_ARM_THM_MOVT_BREL:
6996 case elfcpp::R_ARM_THM_MOVW_BREL:
6997 case elfcpp::R_ARM_THM_JUMP11:
6998 case elfcpp::R_ARM_THM_JUMP8:
6999 // We don't need to do anything for a relative addressing relocation
7000 // against a local symbol if it does not reference the GOT.
7001 break;
7003 case elfcpp::R_ARM_GOTOFF32:
7004 case elfcpp::R_ARM_GOTOFF12:
7005 // We need a GOT section:
7006 target->got_section(symtab, layout);
7007 break;
7009 case elfcpp::R_ARM_GOT_BREL:
7010 case elfcpp::R_ARM_GOT_PREL:
7012 // The symbol requires a GOT entry.
7013 Output_data_got<32, big_endian>* got =
7014 target->got_section(symtab, layout);
7015 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7016 if (got->add_local(object, r_sym, GOT_TYPE_STANDARD))
7018 // If we are generating a shared object, we need to add a
7019 // dynamic RELATIVE relocation for this symbol's GOT entry.
7020 if (parameters->options().output_is_position_independent())
7022 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7023 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7024 rel_dyn->add_local_relative(
7025 object, r_sym, elfcpp::R_ARM_RELATIVE, got,
7026 object->local_got_offset(r_sym, GOT_TYPE_STANDARD));
7030 break;
7032 case elfcpp::R_ARM_TARGET1:
7033 case elfcpp::R_ARM_TARGET2:
7034 // This should have been mapped to another type already.
7035 // Fall through.
7036 case elfcpp::R_ARM_COPY:
7037 case elfcpp::R_ARM_GLOB_DAT:
7038 case elfcpp::R_ARM_JUMP_SLOT:
7039 case elfcpp::R_ARM_RELATIVE:
7040 // These are relocations which should only be seen by the
7041 // dynamic linker, and should never be seen here.
7042 gold_error(_("%s: unexpected reloc %u in object file"),
7043 object->name().c_str(), r_type);
7044 break;
7047 // These are initial TLS relocs, which are expected when
7048 // linking.
7049 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
7050 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
7051 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
7052 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
7053 case elfcpp::R_ARM_TLS_LE32: // Local-exec
7055 bool output_is_shared = parameters->options().shared();
7056 const tls::Tls_optimization optimized_type
7057 = Target_arm<big_endian>::optimize_tls_reloc(!output_is_shared,
7058 r_type);
7059 switch (r_type)
7061 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
7062 if (optimized_type == tls::TLSOPT_NONE)
7064 // Create a pair of GOT entries for the module index and
7065 // dtv-relative offset.
7066 Output_data_got<32, big_endian>* got
7067 = target->got_section(symtab, layout);
7068 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7069 unsigned int shndx = lsym.get_st_shndx();
7070 bool is_ordinary;
7071 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
7072 if (!is_ordinary)
7073 object->error(_("local symbol %u has bad shndx %u"),
7074 r_sym, shndx);
7075 else
7076 got->add_local_pair_with_rel(object, r_sym, shndx,
7077 GOT_TYPE_TLS_PAIR,
7078 target->rel_dyn_section(layout),
7079 elfcpp::R_ARM_TLS_DTPMOD32, 0);
7081 else
7082 // FIXME: TLS optimization not supported yet.
7083 gold_unreachable();
7084 break;
7086 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
7087 if (optimized_type == tls::TLSOPT_NONE)
7089 // Create a GOT entry for the module index.
7090 target->got_mod_index_entry(symtab, layout, object);
7092 else
7093 // FIXME: TLS optimization not supported yet.
7094 gold_unreachable();
7095 break;
7097 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
7098 break;
7100 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
7101 layout->set_has_static_tls();
7102 if (optimized_type == tls::TLSOPT_NONE)
7104 // Create a GOT entry for the tp-relative offset.
7105 Output_data_got<32, big_endian>* got
7106 = target->got_section(symtab, layout);
7107 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7108 got->add_local_with_rel(object, r_sym, GOT_TYPE_TLS_OFFSET,
7109 target->rel_dyn_section(layout),
7110 elfcpp::R_ARM_TLS_TPOFF32);
7112 else
7113 // FIXME: TLS optimization not supported yet.
7114 gold_unreachable();
7115 break;
7117 case elfcpp::R_ARM_TLS_LE32: // Local-exec
7118 layout->set_has_static_tls();
7119 if (output_is_shared)
7121 // We need to create a dynamic relocation.
7122 gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
7123 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7124 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7125 rel_dyn->add_local(object, r_sym, elfcpp::R_ARM_TLS_TPOFF32,
7126 output_section, data_shndx,
7127 reloc.get_r_offset());
7129 break;
7131 default:
7132 gold_unreachable();
7135 break;
7137 default:
7138 unsupported_reloc_local(object, r_type);
7139 break;
7143 // Report an unsupported relocation against a global symbol.
7145 template<bool big_endian>
7146 void
7147 Target_arm<big_endian>::Scan::unsupported_reloc_global(
7148 Sized_relobj<32, big_endian>* object,
7149 unsigned int r_type,
7150 Symbol* gsym)
7152 gold_error(_("%s: unsupported reloc %u against global symbol %s"),
7153 object->name().c_str(), r_type, gsym->demangled_name().c_str());
7156 // Scan a relocation for a global symbol.
7158 template<bool big_endian>
7159 inline void
7160 Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
7161 Layout* layout,
7162 Target_arm* target,
7163 Sized_relobj<32, big_endian>* object,
7164 unsigned int data_shndx,
7165 Output_section* output_section,
7166 const elfcpp::Rel<32, big_endian>& reloc,
7167 unsigned int r_type,
7168 Symbol* gsym)
7170 // A reference to _GLOBAL_OFFSET_TABLE_ implies that we need a got
7171 // section. We check here to avoid creating a dynamic reloc against
7172 // _GLOBAL_OFFSET_TABLE_.
7173 if (!target->has_got_section()
7174 && strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
7175 target->got_section(symtab, layout);
7177 r_type = get_real_reloc_type(r_type);
7178 switch (r_type)
7180 case elfcpp::R_ARM_NONE:
7181 case elfcpp::R_ARM_V4BX:
7182 case elfcpp::R_ARM_GNU_VTENTRY:
7183 case elfcpp::R_ARM_GNU_VTINHERIT:
7184 break;
7186 case elfcpp::R_ARM_ABS32:
7187 case elfcpp::R_ARM_ABS16:
7188 case elfcpp::R_ARM_ABS12:
7189 case elfcpp::R_ARM_THM_ABS5:
7190 case elfcpp::R_ARM_ABS8:
7191 case elfcpp::R_ARM_BASE_ABS:
7192 case elfcpp::R_ARM_MOVW_ABS_NC:
7193 case elfcpp::R_ARM_MOVT_ABS:
7194 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
7195 case elfcpp::R_ARM_THM_MOVT_ABS:
7196 case elfcpp::R_ARM_ABS32_NOI:
7197 // Absolute addressing relocations.
7199 // Make a PLT entry if necessary.
7200 if (this->symbol_needs_plt_entry(gsym))
7202 target->make_plt_entry(symtab, layout, gsym);
7203 // Since this is not a PC-relative relocation, we may be
7204 // taking the address of a function. In that case we need to
7205 // set the entry in the dynamic symbol table to the address of
7206 // the PLT entry.
7207 if (gsym->is_from_dynobj() && !parameters->options().shared())
7208 gsym->set_needs_dynsym_value();
7210 // Make a dynamic relocation if necessary.
7211 if (gsym->needs_dynamic_reloc(Symbol::ABSOLUTE_REF))
7213 if (gsym->may_need_copy_reloc())
7215 target->copy_reloc(symtab, layout, object,
7216 data_shndx, output_section, gsym, reloc);
7218 else if ((r_type == elfcpp::R_ARM_ABS32
7219 || r_type == elfcpp::R_ARM_ABS32_NOI)
7220 && gsym->can_use_relative_reloc(false))
7222 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7223 rel_dyn->add_global_relative(gsym, elfcpp::R_ARM_RELATIVE,
7224 output_section, object,
7225 data_shndx, reloc.get_r_offset());
7227 else
7229 check_non_pic(object, r_type);
7230 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7231 rel_dyn->add_global(gsym, r_type, output_section, object,
7232 data_shndx, reloc.get_r_offset());
7236 break;
7238 case elfcpp::R_ARM_GOTOFF32:
7239 case elfcpp::R_ARM_GOTOFF12:
7240 // We need a GOT section.
7241 target->got_section(symtab, layout);
7242 break;
7244 case elfcpp::R_ARM_REL32:
7245 case elfcpp::R_ARM_LDR_PC_G0:
7246 case elfcpp::R_ARM_SBREL32:
7247 case elfcpp::R_ARM_THM_PC8:
7248 case elfcpp::R_ARM_BASE_PREL:
7249 case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
7250 case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
7251 case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
7252 case elfcpp::R_ARM_MOVW_PREL_NC:
7253 case elfcpp::R_ARM_MOVT_PREL:
7254 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
7255 case elfcpp::R_ARM_THM_MOVT_PREL:
7256 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
7257 case elfcpp::R_ARM_THM_PC12:
7258 case elfcpp::R_ARM_REL32_NOI:
7259 case elfcpp::R_ARM_ALU_PC_G0_NC:
7260 case elfcpp::R_ARM_ALU_PC_G0:
7261 case elfcpp::R_ARM_ALU_PC_G1_NC:
7262 case elfcpp::R_ARM_ALU_PC_G1:
7263 case elfcpp::R_ARM_ALU_PC_G2:
7264 case elfcpp::R_ARM_LDR_PC_G1:
7265 case elfcpp::R_ARM_LDR_PC_G2:
7266 case elfcpp::R_ARM_LDRS_PC_G0:
7267 case elfcpp::R_ARM_LDRS_PC_G1:
7268 case elfcpp::R_ARM_LDRS_PC_G2:
7269 case elfcpp::R_ARM_LDC_PC_G0:
7270 case elfcpp::R_ARM_LDC_PC_G1:
7271 case elfcpp::R_ARM_LDC_PC_G2:
7272 case elfcpp::R_ARM_ALU_SB_G0_NC:
7273 case elfcpp::R_ARM_ALU_SB_G0:
7274 case elfcpp::R_ARM_ALU_SB_G1_NC:
7275 case elfcpp::R_ARM_ALU_SB_G1:
7276 case elfcpp::R_ARM_ALU_SB_G2:
7277 case elfcpp::R_ARM_LDR_SB_G0:
7278 case elfcpp::R_ARM_LDR_SB_G1:
7279 case elfcpp::R_ARM_LDR_SB_G2:
7280 case elfcpp::R_ARM_LDRS_SB_G0:
7281 case elfcpp::R_ARM_LDRS_SB_G1:
7282 case elfcpp::R_ARM_LDRS_SB_G2:
7283 case elfcpp::R_ARM_LDC_SB_G0:
7284 case elfcpp::R_ARM_LDC_SB_G1:
7285 case elfcpp::R_ARM_LDC_SB_G2:
7286 case elfcpp::R_ARM_MOVW_BREL_NC:
7287 case elfcpp::R_ARM_MOVT_BREL:
7288 case elfcpp::R_ARM_MOVW_BREL:
7289 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
7290 case elfcpp::R_ARM_THM_MOVT_BREL:
7291 case elfcpp::R_ARM_THM_MOVW_BREL:
7292 // Relative addressing relocations.
7294 // Make a dynamic relocation if necessary.
7295 int flags = Symbol::NON_PIC_REF;
7296 if (gsym->needs_dynamic_reloc(flags))
7298 if (target->may_need_copy_reloc(gsym))
7300 target->copy_reloc(symtab, layout, object,
7301 data_shndx, output_section, gsym, reloc);
7303 else
7305 check_non_pic(object, r_type);
7306 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7307 rel_dyn->add_global(gsym, r_type, output_section, object,
7308 data_shndx, reloc.get_r_offset());
7312 break;
7314 case elfcpp::R_ARM_PC24:
7315 case elfcpp::R_ARM_THM_CALL:
7316 case elfcpp::R_ARM_PLT32:
7317 case elfcpp::R_ARM_CALL:
7318 case elfcpp::R_ARM_JUMP24:
7319 case elfcpp::R_ARM_THM_JUMP24:
7320 case elfcpp::R_ARM_SBREL31:
7321 case elfcpp::R_ARM_PREL31:
7322 case elfcpp::R_ARM_THM_JUMP19:
7323 case elfcpp::R_ARM_THM_JUMP6:
7324 case elfcpp::R_ARM_THM_JUMP11:
7325 case elfcpp::R_ARM_THM_JUMP8:
7326 // All the relocation above are branches except for the PREL31 ones.
7327 // A PREL31 relocation can point to a personality function in a shared
7328 // library. In that case we want to use a PLT because we want to
7329 // call the personality routine and the dyanmic linkers we care about
7330 // do not support dynamic PREL31 relocations. An REL31 relocation may
7331 // point to a function whose unwinding behaviour is being described but
7332 // we will not mistakenly generate a PLT for that because we should use
7333 // a local section symbol.
7335 // If the symbol is fully resolved, this is just a relative
7336 // local reloc. Otherwise we need a PLT entry.
7337 if (gsym->final_value_is_known())
7338 break;
7339 // If building a shared library, we can also skip the PLT entry
7340 // if the symbol is defined in the output file and is protected
7341 // or hidden.
7342 if (gsym->is_defined()
7343 && !gsym->is_from_dynobj()
7344 && !gsym->is_preemptible())
7345 break;
7346 target->make_plt_entry(symtab, layout, gsym);
7347 break;
7349 case elfcpp::R_ARM_GOT_BREL:
7350 case elfcpp::R_ARM_GOT_ABS:
7351 case elfcpp::R_ARM_GOT_PREL:
7353 // The symbol requires a GOT entry.
7354 Output_data_got<32, big_endian>* got =
7355 target->got_section(symtab, layout);
7356 if (gsym->final_value_is_known())
7357 got->add_global(gsym, GOT_TYPE_STANDARD);
7358 else
7360 // If this symbol is not fully resolved, we need to add a
7361 // GOT entry with a dynamic relocation.
7362 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7363 if (gsym->is_from_dynobj()
7364 || gsym->is_undefined()
7365 || gsym->is_preemptible())
7366 got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
7367 rel_dyn, elfcpp::R_ARM_GLOB_DAT);
7368 else
7370 if (got->add_global(gsym, GOT_TYPE_STANDARD))
7371 rel_dyn->add_global_relative(
7372 gsym, elfcpp::R_ARM_RELATIVE, got,
7373 gsym->got_offset(GOT_TYPE_STANDARD));
7377 break;
7379 case elfcpp::R_ARM_TARGET1:
7380 case elfcpp::R_ARM_TARGET2:
7381 // These should have been mapped to other types already.
7382 // Fall through.
7383 case elfcpp::R_ARM_COPY:
7384 case elfcpp::R_ARM_GLOB_DAT:
7385 case elfcpp::R_ARM_JUMP_SLOT:
7386 case elfcpp::R_ARM_RELATIVE:
7387 // These are relocations which should only be seen by the
7388 // dynamic linker, and should never be seen here.
7389 gold_error(_("%s: unexpected reloc %u in object file"),
7390 object->name().c_str(), r_type);
7391 break;
7393 // These are initial tls relocs, which are expected when
7394 // linking.
7395 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
7396 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
7397 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
7398 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
7399 case elfcpp::R_ARM_TLS_LE32: // Local-exec
7401 const bool is_final = gsym->final_value_is_known();
7402 const tls::Tls_optimization optimized_type
7403 = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
7404 switch (r_type)
7406 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
7407 if (optimized_type == tls::TLSOPT_NONE)
7409 // Create a pair of GOT entries for the module index and
7410 // dtv-relative offset.
7411 Output_data_got<32, big_endian>* got
7412 = target->got_section(symtab, layout);
7413 got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR,
7414 target->rel_dyn_section(layout),
7415 elfcpp::R_ARM_TLS_DTPMOD32,
7416 elfcpp::R_ARM_TLS_DTPOFF32);
7418 else
7419 // FIXME: TLS optimization not supported yet.
7420 gold_unreachable();
7421 break;
7423 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
7424 if (optimized_type == tls::TLSOPT_NONE)
7426 // Create a GOT entry for the module index.
7427 target->got_mod_index_entry(symtab, layout, object);
7429 else
7430 // FIXME: TLS optimization not supported yet.
7431 gold_unreachable();
7432 break;
7434 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
7435 break;
7437 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
7438 layout->set_has_static_tls();
7439 if (optimized_type == tls::TLSOPT_NONE)
7441 // Create a GOT entry for the tp-relative offset.
7442 Output_data_got<32, big_endian>* got
7443 = target->got_section(symtab, layout);
7444 got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET,
7445 target->rel_dyn_section(layout),
7446 elfcpp::R_ARM_TLS_TPOFF32);
7448 else
7449 // FIXME: TLS optimization not supported yet.
7450 gold_unreachable();
7451 break;
7453 case elfcpp::R_ARM_TLS_LE32: // Local-exec
7454 layout->set_has_static_tls();
7455 if (parameters->options().shared())
7457 // We need to create a dynamic relocation.
7458 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7459 rel_dyn->add_global(gsym, elfcpp::R_ARM_TLS_TPOFF32,
7460 output_section, object,
7461 data_shndx, reloc.get_r_offset());
7463 break;
7465 default:
7466 gold_unreachable();
7469 break;
7471 default:
7472 unsupported_reloc_global(object, r_type, gsym);
7473 break;
7477 // Process relocations for gc.
7479 template<bool big_endian>
7480 void
7481 Target_arm<big_endian>::gc_process_relocs(Symbol_table* symtab,
7482 Layout* layout,
7483 Sized_relobj<32, big_endian>* object,
7484 unsigned int data_shndx,
7485 unsigned int,
7486 const unsigned char* prelocs,
7487 size_t reloc_count,
7488 Output_section* output_section,
7489 bool needs_special_offset_handling,
7490 size_t local_symbol_count,
7491 const unsigned char* plocal_symbols)
7493 typedef Target_arm<big_endian> Arm;
7494 typedef typename Target_arm<big_endian>::Scan Scan;
7496 gold::gc_process_relocs<32, big_endian, Arm, elfcpp::SHT_REL, Scan>(
7497 symtab,
7498 layout,
7499 this,
7500 object,
7501 data_shndx,
7502 prelocs,
7503 reloc_count,
7504 output_section,
7505 needs_special_offset_handling,
7506 local_symbol_count,
7507 plocal_symbols);
7510 // Scan relocations for a section.
7512 template<bool big_endian>
7513 void
7514 Target_arm<big_endian>::scan_relocs(Symbol_table* symtab,
7515 Layout* layout,
7516 Sized_relobj<32, big_endian>* object,
7517 unsigned int data_shndx,
7518 unsigned int sh_type,
7519 const unsigned char* prelocs,
7520 size_t reloc_count,
7521 Output_section* output_section,
7522 bool needs_special_offset_handling,
7523 size_t local_symbol_count,
7524 const unsigned char* plocal_symbols)
7526 typedef typename Target_arm<big_endian>::Scan Scan;
7527 if (sh_type == elfcpp::SHT_RELA)
7529 gold_error(_("%s: unsupported RELA reloc section"),
7530 object->name().c_str());
7531 return;
7534 gold::scan_relocs<32, big_endian, Target_arm, elfcpp::SHT_REL, Scan>(
7535 symtab,
7536 layout,
7537 this,
7538 object,
7539 data_shndx,
7540 prelocs,
7541 reloc_count,
7542 output_section,
7543 needs_special_offset_handling,
7544 local_symbol_count,
7545 plocal_symbols);
7548 // Finalize the sections.
7550 template<bool big_endian>
7551 void
7552 Target_arm<big_endian>::do_finalize_sections(
7553 Layout* layout,
7554 const Input_objects* input_objects,
7555 Symbol_table* symtab)
7557 // Create an empty uninitialized attribute section if we still don't have it
7558 // at this moment.
7559 if (this->attributes_section_data_ == NULL)
7560 this->attributes_section_data_ = new Attributes_section_data(NULL, 0);
7562 // Merge processor-specific flags.
7563 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
7564 p != input_objects->relobj_end();
7565 ++p)
7567 Arm_relobj<big_endian>* arm_relobj =
7568 Arm_relobj<big_endian>::as_arm_relobj(*p);
7569 this->merge_processor_specific_flags(
7570 arm_relobj->name(),
7571 arm_relobj->processor_specific_flags());
7572 this->merge_object_attributes(arm_relobj->name().c_str(),
7573 arm_relobj->attributes_section_data());
7577 for (Input_objects::Dynobj_iterator p = input_objects->dynobj_begin();
7578 p != input_objects->dynobj_end();
7579 ++p)
7581 Arm_dynobj<big_endian>* arm_dynobj =
7582 Arm_dynobj<big_endian>::as_arm_dynobj(*p);
7583 this->merge_processor_specific_flags(
7584 arm_dynobj->name(),
7585 arm_dynobj->processor_specific_flags());
7586 this->merge_object_attributes(arm_dynobj->name().c_str(),
7587 arm_dynobj->attributes_section_data());
7590 // Check BLX use.
7591 const Object_attribute* cpu_arch_attr =
7592 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
7593 if (cpu_arch_attr->int_value() > elfcpp::TAG_CPU_ARCH_V4)
7594 this->set_may_use_blx(true);
7596 // Check if we need to use Cortex-A8 workaround.
7597 if (parameters->options().user_set_fix_cortex_a8())
7598 this->fix_cortex_a8_ = parameters->options().fix_cortex_a8();
7599 else
7601 // If neither --fix-cortex-a8 nor --no-fix-cortex-a8 is used, turn on
7602 // Cortex-A8 erratum workaround for ARMv7-A or ARMv7 with unknown
7603 // profile.
7604 const Object_attribute* cpu_arch_profile_attr =
7605 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
7606 this->fix_cortex_a8_ =
7607 (cpu_arch_attr->int_value() == elfcpp::TAG_CPU_ARCH_V7
7608 && (cpu_arch_profile_attr->int_value() == 'A'
7609 || cpu_arch_profile_attr->int_value() == 0));
7612 // Check if we can use V4BX interworking.
7613 // The V4BX interworking stub contains BX instruction,
7614 // which is not specified for some profiles.
7615 if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING
7616 && !this->may_use_blx())
7617 gold_error(_("unable to provide V4BX reloc interworking fix up; "
7618 "the target profile does not support BX instruction"));
7620 // Fill in some more dynamic tags.
7621 const Reloc_section* rel_plt = (this->plt_ == NULL
7622 ? NULL
7623 : this->plt_->rel_plt());
7624 layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
7625 this->rel_dyn_, true, false);
7627 // Emit any relocs we saved in an attempt to avoid generating COPY
7628 // relocs.
7629 if (this->copy_relocs_.any_saved_relocs())
7630 this->copy_relocs_.emit(this->rel_dyn_section(layout));
7632 // Handle the .ARM.exidx section.
7633 Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
7634 if (exidx_section != NULL
7635 && exidx_section->type() == elfcpp::SHT_ARM_EXIDX
7636 && !parameters->options().relocatable())
7638 // Create __exidx_start and __exdix_end symbols.
7639 symtab->define_in_output_data("__exidx_start", NULL,
7640 Symbol_table::PREDEFINED,
7641 exidx_section, 0, 0, elfcpp::STT_OBJECT,
7642 elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
7643 false, true);
7644 symtab->define_in_output_data("__exidx_end", NULL,
7645 Symbol_table::PREDEFINED,
7646 exidx_section, 0, 0, elfcpp::STT_OBJECT,
7647 elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
7648 true, true);
7650 // For the ARM target, we need to add a PT_ARM_EXIDX segment for
7651 // the .ARM.exidx section.
7652 if (!layout->script_options()->saw_phdrs_clause())
7654 gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0, 0)
7655 == NULL);
7656 Output_segment* exidx_segment =
7657 layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
7658 exidx_segment->add_output_section(exidx_section, elfcpp::PF_R,
7659 false);
7663 // Create an .ARM.attributes section if there is not one already.
7664 Output_attributes_section_data* attributes_section =
7665 new Output_attributes_section_data(*this->attributes_section_data_);
7666 layout->add_output_section_data(".ARM.attributes",
7667 elfcpp::SHT_ARM_ATTRIBUTES, 0,
7668 attributes_section, false, false, false,
7669 false);
7672 // Return whether a direct absolute static relocation needs to be applied.
7673 // In cases where Scan::local() or Scan::global() has created
7674 // a dynamic relocation other than R_ARM_RELATIVE, the addend
7675 // of the relocation is carried in the data, and we must not
7676 // apply the static relocation.
7678 template<bool big_endian>
7679 inline bool
7680 Target_arm<big_endian>::Relocate::should_apply_static_reloc(
7681 const Sized_symbol<32>* gsym,
7682 int ref_flags,
7683 bool is_32bit,
7684 Output_section* output_section)
7686 // If the output section is not allocated, then we didn't call
7687 // scan_relocs, we didn't create a dynamic reloc, and we must apply
7688 // the reloc here.
7689 if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0)
7690 return true;
7692 // For local symbols, we will have created a non-RELATIVE dynamic
7693 // relocation only if (a) the output is position independent,
7694 // (b) the relocation is absolute (not pc- or segment-relative), and
7695 // (c) the relocation is not 32 bits wide.
7696 if (gsym == NULL)
7697 return !(parameters->options().output_is_position_independent()
7698 && (ref_flags & Symbol::ABSOLUTE_REF)
7699 && !is_32bit);
7701 // For global symbols, we use the same helper routines used in the
7702 // scan pass. If we did not create a dynamic relocation, or if we
7703 // created a RELATIVE dynamic relocation, we should apply the static
7704 // relocation.
7705 bool has_dyn = gsym->needs_dynamic_reloc(ref_flags);
7706 bool is_rel = (ref_flags & Symbol::ABSOLUTE_REF)
7707 && gsym->can_use_relative_reloc(ref_flags
7708 & Symbol::FUNCTION_CALL);
7709 return !has_dyn || is_rel;
7712 // Perform a relocation.
7714 template<bool big_endian>
7715 inline bool
7716 Target_arm<big_endian>::Relocate::relocate(
7717 const Relocate_info<32, big_endian>* relinfo,
7718 Target_arm* target,
7719 Output_section *output_section,
7720 size_t relnum,
7721 const elfcpp::Rel<32, big_endian>& rel,
7722 unsigned int r_type,
7723 const Sized_symbol<32>* gsym,
7724 const Symbol_value<32>* psymval,
7725 unsigned char* view,
7726 Arm_address address,
7727 section_size_type view_size)
7729 typedef Arm_relocate_functions<big_endian> Arm_relocate_functions;
7731 r_type = get_real_reloc_type(r_type);
7732 const Arm_reloc_property* reloc_property =
7733 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
7734 if (reloc_property == NULL)
7736 std::string reloc_name =
7737 arm_reloc_property_table->reloc_name_in_error_message(r_type);
7738 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
7739 _("cannot relocate %s in object file"),
7740 reloc_name.c_str());
7741 return true;
7744 const Arm_relobj<big_endian>* object =
7745 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
7747 // If the final branch target of a relocation is THUMB instruction, this
7748 // is 1. Otherwise it is 0.
7749 Arm_address thumb_bit = 0;
7750 Symbol_value<32> symval;
7751 bool is_weakly_undefined_without_plt = false;
7752 if (relnum != Target_arm<big_endian>::fake_relnum_for_stubs)
7754 if (gsym != NULL)
7756 // This is a global symbol. Determine if we use PLT and if the
7757 // final target is THUMB.
7758 if (gsym->use_plt_offset(reloc_is_non_pic(r_type)))
7760 // This uses a PLT, change the symbol value.
7761 symval.set_output_value(target->plt_section()->address()
7762 + gsym->plt_offset());
7763 psymval = &symval;
7765 else if (gsym->is_weak_undefined())
7767 // This is a weakly undefined symbol and we do not use PLT
7768 // for this relocation. A branch targeting this symbol will
7769 // be converted into an NOP.
7770 is_weakly_undefined_without_plt = true;
7772 else
7774 // Set thumb bit if symbol:
7775 // -Has type STT_ARM_TFUNC or
7776 // -Has type STT_FUNC, is defined and with LSB in value set.
7777 thumb_bit =
7778 (((gsym->type() == elfcpp::STT_ARM_TFUNC)
7779 || (gsym->type() == elfcpp::STT_FUNC
7780 && !gsym->is_undefined()
7781 && ((psymval->value(object, 0) & 1) != 0)))
7783 : 0);
7786 else
7788 // This is a local symbol. Determine if the final target is THUMB.
7789 // We saved this information when all the local symbols were read.
7790 elfcpp::Elf_types<32>::Elf_WXword r_info = rel.get_r_info();
7791 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
7792 thumb_bit = object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
7795 else
7797 // This is a fake relocation synthesized for a stub. It does not have
7798 // a real symbol. We just look at the LSB of the symbol value to
7799 // determine if the target is THUMB or not.
7800 thumb_bit = ((psymval->value(object, 0) & 1) != 0);
7803 // Strip LSB if this points to a THUMB target.
7804 if (thumb_bit != 0
7805 && reloc_property->uses_thumb_bit()
7806 && ((psymval->value(object, 0) & 1) != 0))
7808 Arm_address stripped_value =
7809 psymval->value(object, 0) & ~static_cast<Arm_address>(1);
7810 symval.set_output_value(stripped_value);
7811 psymval = &symval;
7814 // Get the GOT offset if needed.
7815 // The GOT pointer points to the end of the GOT section.
7816 // We need to subtract the size of the GOT section to get
7817 // the actual offset to use in the relocation.
7818 bool have_got_offset = false;
7819 unsigned int got_offset = 0;
7820 switch (r_type)
7822 case elfcpp::R_ARM_GOT_BREL:
7823 case elfcpp::R_ARM_GOT_PREL:
7824 if (gsym != NULL)
7826 gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
7827 got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
7828 - target->got_size());
7830 else
7832 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
7833 gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD));
7834 got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
7835 - target->got_size());
7837 have_got_offset = true;
7838 break;
7840 default:
7841 break;
7844 // To look up relocation stubs, we need to pass the symbol table index of
7845 // a local symbol.
7846 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
7848 // Get the addressing origin of the output segment defining the
7849 // symbol gsym if needed (AAELF 4.6.1.2 Relocation types).
7850 Arm_address sym_origin = 0;
7851 if (reloc_property->uses_symbol_base())
7853 if (r_type == elfcpp::R_ARM_BASE_ABS && gsym == NULL)
7854 // R_ARM_BASE_ABS with the NULL symbol will give the
7855 // absolute address of the GOT origin (GOT_ORG) (see ARM IHI
7856 // 0044C (AAELF): 4.6.1.8 Proxy generating relocations).
7857 sym_origin = target->got_plt_section()->address();
7858 else if (gsym == NULL)
7859 sym_origin = 0;
7860 else if (gsym->source() == Symbol::IN_OUTPUT_SEGMENT)
7861 sym_origin = gsym->output_segment()->vaddr();
7862 else if (gsym->source() == Symbol::IN_OUTPUT_DATA)
7863 sym_origin = gsym->output_data()->address();
7865 // TODO: Assumes the segment base to be zero for the global symbols
7866 // till the proper support for the segment-base-relative addressing
7867 // will be implemented. This is consistent with GNU ld.
7870 // For relative addressing relocation, find out the relative address base.
7871 Arm_address relative_address_base = 0;
7872 switch(reloc_property->relative_address_base())
7874 case Arm_reloc_property::RAB_NONE:
7875 // Relocations with relative address bases RAB_TLS and RAB_tp are
7876 // handled by relocate_tls. So we do not need to do anything here.
7877 case Arm_reloc_property::RAB_TLS:
7878 case Arm_reloc_property::RAB_tp:
7879 break;
7880 case Arm_reloc_property::RAB_B_S:
7881 relative_address_base = sym_origin;
7882 break;
7883 case Arm_reloc_property::RAB_GOT_ORG:
7884 relative_address_base = target->got_plt_section()->address();
7885 break;
7886 case Arm_reloc_property::RAB_P:
7887 relative_address_base = address;
7888 break;
7889 case Arm_reloc_property::RAB_Pa:
7890 relative_address_base = address & 0xfffffffcU;
7891 break;
7892 default:
7893 gold_unreachable();
7896 typename Arm_relocate_functions::Status reloc_status =
7897 Arm_relocate_functions::STATUS_OKAY;
7898 bool check_overflow = reloc_property->checks_overflow();
7899 switch (r_type)
7901 case elfcpp::R_ARM_NONE:
7902 break;
7904 case elfcpp::R_ARM_ABS8:
7905 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
7906 output_section))
7907 reloc_status = Arm_relocate_functions::abs8(view, object, psymval);
7908 break;
7910 case elfcpp::R_ARM_ABS12:
7911 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
7912 output_section))
7913 reloc_status = Arm_relocate_functions::abs12(view, object, psymval);
7914 break;
7916 case elfcpp::R_ARM_ABS16:
7917 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
7918 output_section))
7919 reloc_status = Arm_relocate_functions::abs16(view, object, psymval);
7920 break;
7922 case elfcpp::R_ARM_ABS32:
7923 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
7924 output_section))
7925 reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
7926 thumb_bit);
7927 break;
7929 case elfcpp::R_ARM_ABS32_NOI:
7930 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
7931 output_section))
7932 // No thumb bit for this relocation: (S + A)
7933 reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
7935 break;
7937 case elfcpp::R_ARM_MOVW_ABS_NC:
7938 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
7939 output_section))
7940 reloc_status = Arm_relocate_functions::movw(view, object, psymval,
7941 0, thumb_bit,
7942 check_overflow);
7943 break;
7945 case elfcpp::R_ARM_MOVT_ABS:
7946 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
7947 output_section))
7948 reloc_status = Arm_relocate_functions::movt(view, object, psymval, 0);
7949 break;
7951 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
7952 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
7953 output_section))
7954 reloc_status = Arm_relocate_functions::thm_movw(view, object, psymval,
7955 0, thumb_bit, false);
7956 break;
7958 case elfcpp::R_ARM_THM_MOVT_ABS:
7959 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
7960 output_section))
7961 reloc_status = Arm_relocate_functions::thm_movt(view, object,
7962 psymval, 0);
7963 break;
7965 case elfcpp::R_ARM_MOVW_PREL_NC:
7966 case elfcpp::R_ARM_MOVW_BREL_NC:
7967 case elfcpp::R_ARM_MOVW_BREL:
7968 reloc_status =
7969 Arm_relocate_functions::movw(view, object, psymval,
7970 relative_address_base, thumb_bit,
7971 check_overflow);
7972 break;
7974 case elfcpp::R_ARM_MOVT_PREL:
7975 case elfcpp::R_ARM_MOVT_BREL:
7976 reloc_status =
7977 Arm_relocate_functions::movt(view, object, psymval,
7978 relative_address_base);
7979 break;
7981 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
7982 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
7983 case elfcpp::R_ARM_THM_MOVW_BREL:
7984 reloc_status =
7985 Arm_relocate_functions::thm_movw(view, object, psymval,
7986 relative_address_base,
7987 thumb_bit, check_overflow);
7988 break;
7990 case elfcpp::R_ARM_THM_MOVT_PREL:
7991 case elfcpp::R_ARM_THM_MOVT_BREL:
7992 reloc_status =
7993 Arm_relocate_functions::thm_movt(view, object, psymval,
7994 relative_address_base);
7995 break;
7997 case elfcpp::R_ARM_REL32:
7998 reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
7999 address, thumb_bit);
8000 break;
8002 case elfcpp::R_ARM_THM_ABS5:
8003 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
8004 output_section))
8005 reloc_status = Arm_relocate_functions::thm_abs5(view, object, psymval);
8006 break;
8008 // Thumb long branches.
8009 case elfcpp::R_ARM_THM_CALL:
8010 case elfcpp::R_ARM_THM_XPC22:
8011 case elfcpp::R_ARM_THM_JUMP24:
8012 reloc_status =
8013 Arm_relocate_functions::thumb_branch_common(
8014 r_type, relinfo, view, gsym, object, r_sym, psymval, address,
8015 thumb_bit, is_weakly_undefined_without_plt);
8016 break;
8018 case elfcpp::R_ARM_GOTOFF32:
8020 Arm_address got_origin;
8021 got_origin = target->got_plt_section()->address();
8022 reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
8023 got_origin, thumb_bit);
8025 break;
8027 case elfcpp::R_ARM_BASE_PREL:
8028 gold_assert(gsym != NULL);
8029 reloc_status =
8030 Arm_relocate_functions::base_prel(view, sym_origin, address);
8031 break;
8033 case elfcpp::R_ARM_BASE_ABS:
8035 if (!should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
8036 output_section))
8037 break;
8039 reloc_status = Arm_relocate_functions::base_abs(view, sym_origin);
8041 break;
8043 case elfcpp::R_ARM_GOT_BREL:
8044 gold_assert(have_got_offset);
8045 reloc_status = Arm_relocate_functions::got_brel(view, got_offset);
8046 break;
8048 case elfcpp::R_ARM_GOT_PREL:
8049 gold_assert(have_got_offset);
8050 // Get the address origin for GOT PLT, which is allocated right
8051 // after the GOT section, to calculate an absolute address of
8052 // the symbol GOT entry (got_origin + got_offset).
8053 Arm_address got_origin;
8054 got_origin = target->got_plt_section()->address();
8055 reloc_status = Arm_relocate_functions::got_prel(view,
8056 got_origin + got_offset,
8057 address);
8058 break;
8060 case elfcpp::R_ARM_PLT32:
8061 case elfcpp::R_ARM_CALL:
8062 case elfcpp::R_ARM_JUMP24:
8063 case elfcpp::R_ARM_XPC25:
8064 gold_assert(gsym == NULL
8065 || gsym->has_plt_offset()
8066 || gsym->final_value_is_known()
8067 || (gsym->is_defined()
8068 && !gsym->is_from_dynobj()
8069 && !gsym->is_preemptible()));
8070 reloc_status =
8071 Arm_relocate_functions::arm_branch_common(
8072 r_type, relinfo, view, gsym, object, r_sym, psymval, address,
8073 thumb_bit, is_weakly_undefined_without_plt);
8074 break;
8076 case elfcpp::R_ARM_THM_JUMP19:
8077 reloc_status =
8078 Arm_relocate_functions::thm_jump19(view, object, psymval, address,
8079 thumb_bit);
8080 break;
8082 case elfcpp::R_ARM_THM_JUMP6:
8083 reloc_status =
8084 Arm_relocate_functions::thm_jump6(view, object, psymval, address);
8085 break;
8087 case elfcpp::R_ARM_THM_JUMP8:
8088 reloc_status =
8089 Arm_relocate_functions::thm_jump8(view, object, psymval, address);
8090 break;
8092 case elfcpp::R_ARM_THM_JUMP11:
8093 reloc_status =
8094 Arm_relocate_functions::thm_jump11(view, object, psymval, address);
8095 break;
8097 case elfcpp::R_ARM_PREL31:
8098 reloc_status = Arm_relocate_functions::prel31(view, object, psymval,
8099 address, thumb_bit);
8100 break;
8102 case elfcpp::R_ARM_V4BX:
8103 if (target->fix_v4bx() > General_options::FIX_V4BX_NONE)
8105 const bool is_v4bx_interworking =
8106 (target->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING);
8107 reloc_status =
8108 Arm_relocate_functions::v4bx(relinfo, view, object, address,
8109 is_v4bx_interworking);
8111 break;
8113 case elfcpp::R_ARM_THM_PC8:
8114 reloc_status =
8115 Arm_relocate_functions::thm_pc8(view, object, psymval, address);
8116 break;
8118 case elfcpp::R_ARM_THM_PC12:
8119 reloc_status =
8120 Arm_relocate_functions::thm_pc12(view, object, psymval, address);
8121 break;
8123 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
8124 reloc_status =
8125 Arm_relocate_functions::thm_alu11(view, object, psymval, address,
8126 thumb_bit);
8127 break;
8129 case elfcpp::R_ARM_ALU_PC_G0_NC:
8130 case elfcpp::R_ARM_ALU_PC_G0:
8131 case elfcpp::R_ARM_ALU_PC_G1_NC:
8132 case elfcpp::R_ARM_ALU_PC_G1:
8133 case elfcpp::R_ARM_ALU_PC_G2:
8134 case elfcpp::R_ARM_ALU_SB_G0_NC:
8135 case elfcpp::R_ARM_ALU_SB_G0:
8136 case elfcpp::R_ARM_ALU_SB_G1_NC:
8137 case elfcpp::R_ARM_ALU_SB_G1:
8138 case elfcpp::R_ARM_ALU_SB_G2:
8139 reloc_status =
8140 Arm_relocate_functions::arm_grp_alu(view, object, psymval,
8141 reloc_property->group_index(),
8142 relative_address_base,
8143 thumb_bit, check_overflow);
8144 break;
8146 case elfcpp::R_ARM_LDR_PC_G0:
8147 case elfcpp::R_ARM_LDR_PC_G1:
8148 case elfcpp::R_ARM_LDR_PC_G2:
8149 case elfcpp::R_ARM_LDR_SB_G0:
8150 case elfcpp::R_ARM_LDR_SB_G1:
8151 case elfcpp::R_ARM_LDR_SB_G2:
8152 reloc_status =
8153 Arm_relocate_functions::arm_grp_ldr(view, object, psymval,
8154 reloc_property->group_index(),
8155 relative_address_base);
8156 break;
8158 case elfcpp::R_ARM_LDRS_PC_G0:
8159 case elfcpp::R_ARM_LDRS_PC_G1:
8160 case elfcpp::R_ARM_LDRS_PC_G2:
8161 case elfcpp::R_ARM_LDRS_SB_G0:
8162 case elfcpp::R_ARM_LDRS_SB_G1:
8163 case elfcpp::R_ARM_LDRS_SB_G2:
8164 reloc_status =
8165 Arm_relocate_functions::arm_grp_ldrs(view, object, psymval,
8166 reloc_property->group_index(),
8167 relative_address_base);
8168 break;
8170 case elfcpp::R_ARM_LDC_PC_G0:
8171 case elfcpp::R_ARM_LDC_PC_G1:
8172 case elfcpp::R_ARM_LDC_PC_G2:
8173 case elfcpp::R_ARM_LDC_SB_G0:
8174 case elfcpp::R_ARM_LDC_SB_G1:
8175 case elfcpp::R_ARM_LDC_SB_G2:
8176 reloc_status =
8177 Arm_relocate_functions::arm_grp_ldc(view, object, psymval,
8178 reloc_property->group_index(),
8179 relative_address_base);
8180 break;
8182 // These are initial tls relocs, which are expected when
8183 // linking.
8184 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
8185 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
8186 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
8187 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
8188 case elfcpp::R_ARM_TLS_LE32: // Local-exec
8189 reloc_status =
8190 this->relocate_tls(relinfo, target, relnum, rel, r_type, gsym, psymval,
8191 view, address, view_size);
8192 break;
8194 default:
8195 gold_unreachable();
8198 // Report any errors.
8199 switch (reloc_status)
8201 case Arm_relocate_functions::STATUS_OKAY:
8202 break;
8203 case Arm_relocate_functions::STATUS_OVERFLOW:
8204 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
8205 _("relocation overflow in relocation %u"),
8206 r_type);
8207 break;
8208 case Arm_relocate_functions::STATUS_BAD_RELOC:
8209 gold_error_at_location(
8210 relinfo,
8211 relnum,
8212 rel.get_r_offset(),
8213 _("unexpected opcode while processing relocation %u"),
8214 r_type);
8215 break;
8216 default:
8217 gold_unreachable();
8220 return true;
8223 // Perform a TLS relocation.
8225 template<bool big_endian>
8226 inline typename Arm_relocate_functions<big_endian>::Status
8227 Target_arm<big_endian>::Relocate::relocate_tls(
8228 const Relocate_info<32, big_endian>* relinfo,
8229 Target_arm<big_endian>* target,
8230 size_t relnum,
8231 const elfcpp::Rel<32, big_endian>& rel,
8232 unsigned int r_type,
8233 const Sized_symbol<32>* gsym,
8234 const Symbol_value<32>* psymval,
8235 unsigned char* view,
8236 elfcpp::Elf_types<32>::Elf_Addr,
8237 section_size_type /*view_size*/ )
8239 typedef Arm_relocate_functions<big_endian> ArmRelocFuncs;
8240 Output_segment* tls_segment = relinfo->layout->tls_segment();
8242 const Sized_relobj<32, big_endian>* object = relinfo->object;
8244 elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0);
8246 const bool is_final = (gsym == NULL
8247 ? !parameters->options().shared()
8248 : gsym->final_value_is_known());
8249 const tls::Tls_optimization optimized_type
8250 = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
8251 switch (r_type)
8253 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
8255 unsigned int got_type = GOT_TYPE_TLS_PAIR;
8256 unsigned int got_offset;
8257 if (gsym != NULL)
8259 gold_assert(gsym->has_got_offset(got_type));
8260 got_offset = gsym->got_offset(got_type) - target->got_size();
8262 else
8264 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
8265 gold_assert(object->local_has_got_offset(r_sym, got_type));
8266 got_offset = (object->local_got_offset(r_sym, got_type)
8267 - target->got_size());
8269 if (optimized_type == tls::TLSOPT_NONE)
8271 // Relocate the field with the offset of the pair of GOT
8272 // entries.
8273 Relocate_functions<32, big_endian>::rel32(view, got_offset);
8274 return ArmRelocFuncs::STATUS_OKAY;
8277 break;
8279 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
8280 if (optimized_type == tls::TLSOPT_NONE)
8282 // Relocate the field with the offset of the GOT entry for
8283 // the module index.
8284 unsigned int got_offset;
8285 got_offset = (target->got_mod_index_entry(NULL, NULL, NULL)
8286 - target->got_size());
8287 Relocate_functions<32, big_endian>::rel32(view, got_offset);
8288 return ArmRelocFuncs::STATUS_OKAY;
8290 break;
8292 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
8293 Relocate_functions<32, big_endian>::rel32(view, value);
8294 return ArmRelocFuncs::STATUS_OKAY;
8296 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
8297 if (optimized_type == tls::TLSOPT_NONE)
8299 // Relocate the field with the offset of the GOT entry for
8300 // the tp-relative offset of the symbol.
8301 unsigned int got_type = GOT_TYPE_TLS_OFFSET;
8302 unsigned int got_offset;
8303 if (gsym != NULL)
8305 gold_assert(gsym->has_got_offset(got_type));
8306 got_offset = gsym->got_offset(got_type);
8308 else
8310 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
8311 gold_assert(object->local_has_got_offset(r_sym, got_type));
8312 got_offset = object->local_got_offset(r_sym, got_type);
8314 // All GOT offsets are relative to the end of the GOT.
8315 got_offset -= target->got_size();
8316 Relocate_functions<32, big_endian>::rel32(view, got_offset);
8317 return ArmRelocFuncs::STATUS_OKAY;
8319 break;
8321 case elfcpp::R_ARM_TLS_LE32: // Local-exec
8322 // If we're creating a shared library, a dynamic relocation will
8323 // have been created for this location, so do not apply it now.
8324 if (!parameters->options().shared())
8326 gold_assert(tls_segment != NULL);
8327 value = tls_segment->memsz() - value;
8328 Relocate_functions<32, false>::rel32(view, value);
8330 return ArmRelocFuncs::STATUS_OKAY;
8332 default:
8333 gold_unreachable();
8336 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
8337 _("unsupported reloc %u"),
8338 r_type);
8339 return ArmRelocFuncs::STATUS_BAD_RELOC;
8342 // Relocate section data.
8344 template<bool big_endian>
8345 void
8346 Target_arm<big_endian>::relocate_section(
8347 const Relocate_info<32, big_endian>* relinfo,
8348 unsigned int sh_type,
8349 const unsigned char* prelocs,
8350 size_t reloc_count,
8351 Output_section* output_section,
8352 bool needs_special_offset_handling,
8353 unsigned char* view,
8354 Arm_address address,
8355 section_size_type view_size,
8356 const Reloc_symbol_changes* reloc_symbol_changes)
8358 typedef typename Target_arm<big_endian>::Relocate Arm_relocate;
8359 gold_assert(sh_type == elfcpp::SHT_REL);
8361 // See if we are relocating a relaxed input section. If so, the view
8362 // covers the whole output section and we need to adjust accordingly.
8363 if (needs_special_offset_handling)
8365 const Output_relaxed_input_section* poris =
8366 output_section->find_relaxed_input_section(relinfo->object,
8367 relinfo->data_shndx);
8368 if (poris != NULL)
8370 Arm_address section_address = poris->address();
8371 section_size_type section_size = poris->data_size();
8373 gold_assert((section_address >= address)
8374 && ((section_address + section_size)
8375 <= (address + view_size)));
8377 off_t offset = section_address - address;
8378 view += offset;
8379 address += offset;
8380 view_size = section_size;
8384 gold::relocate_section<32, big_endian, Target_arm, elfcpp::SHT_REL,
8385 Arm_relocate>(
8386 relinfo,
8387 this,
8388 prelocs,
8389 reloc_count,
8390 output_section,
8391 needs_special_offset_handling,
8392 view,
8393 address,
8394 view_size,
8395 reloc_symbol_changes);
8398 // Return the size of a relocation while scanning during a relocatable
8399 // link.
8401 template<bool big_endian>
8402 unsigned int
8403 Target_arm<big_endian>::Relocatable_size_for_reloc::get_size_for_reloc(
8404 unsigned int r_type,
8405 Relobj* object)
8407 r_type = get_real_reloc_type(r_type);
8408 const Arm_reloc_property* arp =
8409 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
8410 if (arp != NULL)
8411 return arp->size();
8412 else
8414 std::string reloc_name =
8415 arm_reloc_property_table->reloc_name_in_error_message(r_type);
8416 gold_error(_("%s: unexpected %s in object file"),
8417 object->name().c_str(), reloc_name.c_str());
8418 return 0;
8422 // Scan the relocs during a relocatable link.
8424 template<bool big_endian>
8425 void
8426 Target_arm<big_endian>::scan_relocatable_relocs(
8427 Symbol_table* symtab,
8428 Layout* layout,
8429 Sized_relobj<32, big_endian>* object,
8430 unsigned int data_shndx,
8431 unsigned int sh_type,
8432 const unsigned char* prelocs,
8433 size_t reloc_count,
8434 Output_section* output_section,
8435 bool needs_special_offset_handling,
8436 size_t local_symbol_count,
8437 const unsigned char* plocal_symbols,
8438 Relocatable_relocs* rr)
8440 gold_assert(sh_type == elfcpp::SHT_REL);
8442 typedef gold::Default_scan_relocatable_relocs<elfcpp::SHT_REL,
8443 Relocatable_size_for_reloc> Scan_relocatable_relocs;
8445 gold::scan_relocatable_relocs<32, big_endian, elfcpp::SHT_REL,
8446 Scan_relocatable_relocs>(
8447 symtab,
8448 layout,
8449 object,
8450 data_shndx,
8451 prelocs,
8452 reloc_count,
8453 output_section,
8454 needs_special_offset_handling,
8455 local_symbol_count,
8456 plocal_symbols,
8457 rr);
8460 // Relocate a section during a relocatable link.
8462 template<bool big_endian>
8463 void
8464 Target_arm<big_endian>::relocate_for_relocatable(
8465 const Relocate_info<32, big_endian>* relinfo,
8466 unsigned int sh_type,
8467 const unsigned char* prelocs,
8468 size_t reloc_count,
8469 Output_section* output_section,
8470 off_t offset_in_output_section,
8471 const Relocatable_relocs* rr,
8472 unsigned char* view,
8473 Arm_address view_address,
8474 section_size_type view_size,
8475 unsigned char* reloc_view,
8476 section_size_type reloc_view_size)
8478 gold_assert(sh_type == elfcpp::SHT_REL);
8480 gold::relocate_for_relocatable<32, big_endian, elfcpp::SHT_REL>(
8481 relinfo,
8482 prelocs,
8483 reloc_count,
8484 output_section,
8485 offset_in_output_section,
8487 view,
8488 view_address,
8489 view_size,
8490 reloc_view,
8491 reloc_view_size);
8494 // Return the value to use for a dynamic symbol which requires special
8495 // treatment. This is how we support equality comparisons of function
8496 // pointers across shared library boundaries, as described in the
8497 // processor specific ABI supplement.
8499 template<bool big_endian>
8500 uint64_t
8501 Target_arm<big_endian>::do_dynsym_value(const Symbol* gsym) const
8503 gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
8504 return this->plt_section()->address() + gsym->plt_offset();
8507 // Map platform-specific relocs to real relocs
8509 template<bool big_endian>
8510 unsigned int
8511 Target_arm<big_endian>::get_real_reloc_type (unsigned int r_type)
8513 switch (r_type)
8515 case elfcpp::R_ARM_TARGET1:
8516 // This is either R_ARM_ABS32 or R_ARM_REL32;
8517 return elfcpp::R_ARM_ABS32;
8519 case elfcpp::R_ARM_TARGET2:
8520 // This can be any reloc type but ususally is R_ARM_GOT_PREL
8521 return elfcpp::R_ARM_GOT_PREL;
8523 default:
8524 return r_type;
8528 // Whether if two EABI versions V1 and V2 are compatible.
8530 template<bool big_endian>
8531 bool
8532 Target_arm<big_endian>::are_eabi_versions_compatible(
8533 elfcpp::Elf_Word v1,
8534 elfcpp::Elf_Word v2)
8536 // v4 and v5 are the same spec before and after it was released,
8537 // so allow mixing them.
8538 if ((v1 == elfcpp::EF_ARM_EABI_VER4 && v2 == elfcpp::EF_ARM_EABI_VER5)
8539 || (v1 == elfcpp::EF_ARM_EABI_VER5 && v2 == elfcpp::EF_ARM_EABI_VER4))
8540 return true;
8542 return v1 == v2;
8545 // Combine FLAGS from an input object called NAME and the processor-specific
8546 // flags in the ELF header of the output. Much of this is adapted from the
8547 // processor-specific flags merging code in elf32_arm_merge_private_bfd_data
8548 // in bfd/elf32-arm.c.
8550 template<bool big_endian>
8551 void
8552 Target_arm<big_endian>::merge_processor_specific_flags(
8553 const std::string& name,
8554 elfcpp::Elf_Word flags)
8556 if (this->are_processor_specific_flags_set())
8558 elfcpp::Elf_Word out_flags = this->processor_specific_flags();
8560 // Nothing to merge if flags equal to those in output.
8561 if (flags == out_flags)
8562 return;
8564 // Complain about various flag mismatches.
8565 elfcpp::Elf_Word version1 = elfcpp::arm_eabi_version(flags);
8566 elfcpp::Elf_Word version2 = elfcpp::arm_eabi_version(out_flags);
8567 if (!this->are_eabi_versions_compatible(version1, version2))
8568 gold_error(_("Source object %s has EABI version %d but output has "
8569 "EABI version %d."),
8570 name.c_str(),
8571 (flags & elfcpp::EF_ARM_EABIMASK) >> 24,
8572 (out_flags & elfcpp::EF_ARM_EABIMASK) >> 24);
8574 else
8576 // If the input is the default architecture and had the default
8577 // flags then do not bother setting the flags for the output
8578 // architecture, instead allow future merges to do this. If no
8579 // future merges ever set these flags then they will retain their
8580 // uninitialised values, which surprise surprise, correspond
8581 // to the default values.
8582 if (flags == 0)
8583 return;
8585 // This is the first time, just copy the flags.
8586 // We only copy the EABI version for now.
8587 this->set_processor_specific_flags(flags & elfcpp::EF_ARM_EABIMASK);
8591 // Adjust ELF file header.
8592 template<bool big_endian>
8593 void
8594 Target_arm<big_endian>::do_adjust_elf_header(
8595 unsigned char* view,
8596 int len) const
8598 gold_assert(len == elfcpp::Elf_sizes<32>::ehdr_size);
8600 elfcpp::Ehdr<32, big_endian> ehdr(view);
8601 unsigned char e_ident[elfcpp::EI_NIDENT];
8602 memcpy(e_ident, ehdr.get_e_ident(), elfcpp::EI_NIDENT);
8604 if (elfcpp::arm_eabi_version(this->processor_specific_flags())
8605 == elfcpp::EF_ARM_EABI_UNKNOWN)
8606 e_ident[elfcpp::EI_OSABI] = elfcpp::ELFOSABI_ARM;
8607 else
8608 e_ident[elfcpp::EI_OSABI] = 0;
8609 e_ident[elfcpp::EI_ABIVERSION] = 0;
8611 // FIXME: Do EF_ARM_BE8 adjustment.
8613 elfcpp::Ehdr_write<32, big_endian> oehdr(view);
8614 oehdr.put_e_ident(e_ident);
8617 // do_make_elf_object to override the same function in the base class.
8618 // We need to use a target-specific sub-class of Sized_relobj<32, big_endian>
8619 // to store ARM specific information. Hence we need to have our own
8620 // ELF object creation.
8622 template<bool big_endian>
8623 Object*
8624 Target_arm<big_endian>::do_make_elf_object(
8625 const std::string& name,
8626 Input_file* input_file,
8627 off_t offset, const elfcpp::Ehdr<32, big_endian>& ehdr)
8629 int et = ehdr.get_e_type();
8630 if (et == elfcpp::ET_REL)
8632 Arm_relobj<big_endian>* obj =
8633 new Arm_relobj<big_endian>(name, input_file, offset, ehdr);
8634 obj->setup();
8635 return obj;
8637 else if (et == elfcpp::ET_DYN)
8639 Sized_dynobj<32, big_endian>* obj =
8640 new Arm_dynobj<big_endian>(name, input_file, offset, ehdr);
8641 obj->setup();
8642 return obj;
8644 else
8646 gold_error(_("%s: unsupported ELF file type %d"),
8647 name.c_str(), et);
8648 return NULL;
8652 // Read the architecture from the Tag_also_compatible_with attribute, if any.
8653 // Returns -1 if no architecture could be read.
8654 // This is adapted from get_secondary_compatible_arch() in bfd/elf32-arm.c.
8656 template<bool big_endian>
8658 Target_arm<big_endian>::get_secondary_compatible_arch(
8659 const Attributes_section_data* pasd)
8661 const Object_attribute *known_attributes =
8662 pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
8664 // Note: the tag and its argument below are uleb128 values, though
8665 // currently-defined values fit in one byte for each.
8666 const std::string& sv =
8667 known_attributes[elfcpp::Tag_also_compatible_with].string_value();
8668 if (sv.size() == 2
8669 && sv.data()[0] == elfcpp::Tag_CPU_arch
8670 && (sv.data()[1] & 128) != 128)
8671 return sv.data()[1];
8673 // This tag is "safely ignorable", so don't complain if it looks funny.
8674 return -1;
8677 // Set, or unset, the architecture of the Tag_also_compatible_with attribute.
8678 // The tag is removed if ARCH is -1.
8679 // This is adapted from set_secondary_compatible_arch() in bfd/elf32-arm.c.
8681 template<bool big_endian>
8682 void
8683 Target_arm<big_endian>::set_secondary_compatible_arch(
8684 Attributes_section_data* pasd,
8685 int arch)
8687 Object_attribute *known_attributes =
8688 pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
8690 if (arch == -1)
8692 known_attributes[elfcpp::Tag_also_compatible_with].set_string_value("");
8693 return;
8696 // Note: the tag and its argument below are uleb128 values, though
8697 // currently-defined values fit in one byte for each.
8698 char sv[3];
8699 sv[0] = elfcpp::Tag_CPU_arch;
8700 gold_assert(arch != 0);
8701 sv[1] = arch;
8702 sv[2] = '\0';
8704 known_attributes[elfcpp::Tag_also_compatible_with].set_string_value(sv);
8707 // Combine two values for Tag_CPU_arch, taking secondary compatibility tags
8708 // into account.
8709 // This is adapted from tag_cpu_arch_combine() in bfd/elf32-arm.c.
8711 template<bool big_endian>
8713 Target_arm<big_endian>::tag_cpu_arch_combine(
8714 const char* name,
8715 int oldtag,
8716 int* secondary_compat_out,
8717 int newtag,
8718 int secondary_compat)
8720 #define T(X) elfcpp::TAG_CPU_ARCH_##X
8721 static const int v6t2[] =
8723 T(V6T2), // PRE_V4.
8724 T(V6T2), // V4.
8725 T(V6T2), // V4T.
8726 T(V6T2), // V5T.
8727 T(V6T2), // V5TE.
8728 T(V6T2), // V5TEJ.
8729 T(V6T2), // V6.
8730 T(V7), // V6KZ.
8731 T(V6T2) // V6T2.
8733 static const int v6k[] =
8735 T(V6K), // PRE_V4.
8736 T(V6K), // V4.
8737 T(V6K), // V4T.
8738 T(V6K), // V5T.
8739 T(V6K), // V5TE.
8740 T(V6K), // V5TEJ.
8741 T(V6K), // V6.
8742 T(V6KZ), // V6KZ.
8743 T(V7), // V6T2.
8744 T(V6K) // V6K.
8746 static const int v7[] =
8748 T(V7), // PRE_V4.
8749 T(V7), // V4.
8750 T(V7), // V4T.
8751 T(V7), // V5T.
8752 T(V7), // V5TE.
8753 T(V7), // V5TEJ.
8754 T(V7), // V6.
8755 T(V7), // V6KZ.
8756 T(V7), // V6T2.
8757 T(V7), // V6K.
8758 T(V7) // V7.
8760 static const int v6_m[] =
8762 -1, // PRE_V4.
8763 -1, // V4.
8764 T(V6K), // V4T.
8765 T(V6K), // V5T.
8766 T(V6K), // V5TE.
8767 T(V6K), // V5TEJ.
8768 T(V6K), // V6.
8769 T(V6KZ), // V6KZ.
8770 T(V7), // V6T2.
8771 T(V6K), // V6K.
8772 T(V7), // V7.
8773 T(V6_M) // V6_M.
8775 static const int v6s_m[] =
8777 -1, // PRE_V4.
8778 -1, // V4.
8779 T(V6K), // V4T.
8780 T(V6K), // V5T.
8781 T(V6K), // V5TE.
8782 T(V6K), // V5TEJ.
8783 T(V6K), // V6.
8784 T(V6KZ), // V6KZ.
8785 T(V7), // V6T2.
8786 T(V6K), // V6K.
8787 T(V7), // V7.
8788 T(V6S_M), // V6_M.
8789 T(V6S_M) // V6S_M.
8791 static const int v7e_m[] =
8793 -1, // PRE_V4.
8794 -1, // V4.
8795 T(V7E_M), // V4T.
8796 T(V7E_M), // V5T.
8797 T(V7E_M), // V5TE.
8798 T(V7E_M), // V5TEJ.
8799 T(V7E_M), // V6.
8800 T(V7E_M), // V6KZ.
8801 T(V7E_M), // V6T2.
8802 T(V7E_M), // V6K.
8803 T(V7E_M), // V7.
8804 T(V7E_M), // V6_M.
8805 T(V7E_M), // V6S_M.
8806 T(V7E_M) // V7E_M.
8808 static const int v4t_plus_v6_m[] =
8810 -1, // PRE_V4.
8811 -1, // V4.
8812 T(V4T), // V4T.
8813 T(V5T), // V5T.
8814 T(V5TE), // V5TE.
8815 T(V5TEJ), // V5TEJ.
8816 T(V6), // V6.
8817 T(V6KZ), // V6KZ.
8818 T(V6T2), // V6T2.
8819 T(V6K), // V6K.
8820 T(V7), // V7.
8821 T(V6_M), // V6_M.
8822 T(V6S_M), // V6S_M.
8823 T(V7E_M), // V7E_M.
8824 T(V4T_PLUS_V6_M) // V4T plus V6_M.
8826 static const int *comb[] =
8828 v6t2,
8829 v6k,
8831 v6_m,
8832 v6s_m,
8833 v7e_m,
8834 // Pseudo-architecture.
8835 v4t_plus_v6_m
8838 // Check we've not got a higher architecture than we know about.
8840 if (oldtag >= elfcpp::MAX_TAG_CPU_ARCH || newtag >= elfcpp::MAX_TAG_CPU_ARCH)
8842 gold_error(_("%s: unknown CPU architecture"), name);
8843 return -1;
8846 // Override old tag if we have a Tag_also_compatible_with on the output.
8848 if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
8849 || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
8850 oldtag = T(V4T_PLUS_V6_M);
8852 // And override the new tag if we have a Tag_also_compatible_with on the
8853 // input.
8855 if ((newtag == T(V6_M) && secondary_compat == T(V4T))
8856 || (newtag == T(V4T) && secondary_compat == T(V6_M)))
8857 newtag = T(V4T_PLUS_V6_M);
8859 // Architectures before V6KZ add features monotonically.
8860 int tagh = std::max(oldtag, newtag);
8861 if (tagh <= elfcpp::TAG_CPU_ARCH_V6KZ)
8862 return tagh;
8864 int tagl = std::min(oldtag, newtag);
8865 int result = comb[tagh - T(V6T2)][tagl];
8867 // Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
8868 // as the canonical version.
8869 if (result == T(V4T_PLUS_V6_M))
8871 result = T(V4T);
8872 *secondary_compat_out = T(V6_M);
8874 else
8875 *secondary_compat_out = -1;
8877 if (result == -1)
8879 gold_error(_("%s: conflicting CPU architectures %d/%d"),
8880 name, oldtag, newtag);
8881 return -1;
8884 return result;
8885 #undef T
8888 // Helper to print AEABI enum tag value.
8890 template<bool big_endian>
8891 std::string
8892 Target_arm<big_endian>::aeabi_enum_name(unsigned int value)
8894 static const char *aeabi_enum_names[] =
8895 { "", "variable-size", "32-bit", "" };
8896 const size_t aeabi_enum_names_size =
8897 sizeof(aeabi_enum_names) / sizeof(aeabi_enum_names[0]);
8899 if (value < aeabi_enum_names_size)
8900 return std::string(aeabi_enum_names[value]);
8901 else
8903 char buffer[100];
8904 sprintf(buffer, "<unknown value %u>", value);
8905 return std::string(buffer);
8909 // Return the string value to store in TAG_CPU_name.
8911 template<bool big_endian>
8912 std::string
8913 Target_arm<big_endian>::tag_cpu_name_value(unsigned int value)
8915 static const char *name_table[] = {
8916 // These aren't real CPU names, but we can't guess
8917 // that from the architecture version alone.
8918 "Pre v4",
8919 "ARM v4",
8920 "ARM v4T",
8921 "ARM v5T",
8922 "ARM v5TE",
8923 "ARM v5TEJ",
8924 "ARM v6",
8925 "ARM v6KZ",
8926 "ARM v6T2",
8927 "ARM v6K",
8928 "ARM v7",
8929 "ARM v6-M",
8930 "ARM v6S-M",
8931 "ARM v7E-M"
8933 const size_t name_table_size = sizeof(name_table) / sizeof(name_table[0]);
8935 if (value < name_table_size)
8936 return std::string(name_table[value]);
8937 else
8939 char buffer[100];
8940 sprintf(buffer, "<unknown CPU value %u>", value);
8941 return std::string(buffer);
8945 // Merge object attributes from input file called NAME with those of the
8946 // output. The input object attributes are in the object pointed by PASD.
8948 template<bool big_endian>
8949 void
8950 Target_arm<big_endian>::merge_object_attributes(
8951 const char* name,
8952 const Attributes_section_data* pasd)
8954 // Return if there is no attributes section data.
8955 if (pasd == NULL)
8956 return;
8958 // If output has no object attributes, just copy.
8959 if (this->attributes_section_data_ == NULL)
8961 this->attributes_section_data_ = new Attributes_section_data(*pasd);
8962 return;
8965 const int vendor = Object_attribute::OBJ_ATTR_PROC;
8966 const Object_attribute* in_attr = pasd->known_attributes(vendor);
8967 Object_attribute* out_attr =
8968 this->attributes_section_data_->known_attributes(vendor);
8970 // This needs to happen before Tag_ABI_FP_number_model is merged. */
8971 if (in_attr[elfcpp::Tag_ABI_VFP_args].int_value()
8972 != out_attr[elfcpp::Tag_ABI_VFP_args].int_value())
8974 // Ignore mismatches if the object doesn't use floating point. */
8975 if (out_attr[elfcpp::Tag_ABI_FP_number_model].int_value() == 0)
8976 out_attr[elfcpp::Tag_ABI_VFP_args].set_int_value(
8977 in_attr[elfcpp::Tag_ABI_VFP_args].int_value());
8978 else if (in_attr[elfcpp::Tag_ABI_FP_number_model].int_value() != 0)
8979 gold_error(_("%s uses VFP register arguments, output does not"),
8980 name);
8983 for (int i = 4; i < Vendor_object_attributes::NUM_KNOWN_ATTRIBUTES; ++i)
8985 // Merge this attribute with existing attributes.
8986 switch (i)
8988 case elfcpp::Tag_CPU_raw_name:
8989 case elfcpp::Tag_CPU_name:
8990 // These are merged after Tag_CPU_arch.
8991 break;
8993 case elfcpp::Tag_ABI_optimization_goals:
8994 case elfcpp::Tag_ABI_FP_optimization_goals:
8995 // Use the first value seen.
8996 break;
8998 case elfcpp::Tag_CPU_arch:
9000 unsigned int saved_out_attr = out_attr->int_value();
9001 // Merge Tag_CPU_arch and Tag_also_compatible_with.
9002 int secondary_compat =
9003 this->get_secondary_compatible_arch(pasd);
9004 int secondary_compat_out =
9005 this->get_secondary_compatible_arch(
9006 this->attributes_section_data_);
9007 out_attr[i].set_int_value(
9008 tag_cpu_arch_combine(name, out_attr[i].int_value(),
9009 &secondary_compat_out,
9010 in_attr[i].int_value(),
9011 secondary_compat));
9012 this->set_secondary_compatible_arch(this->attributes_section_data_,
9013 secondary_compat_out);
9015 // Merge Tag_CPU_name and Tag_CPU_raw_name.
9016 if (out_attr[i].int_value() == saved_out_attr)
9017 ; // Leave the names alone.
9018 else if (out_attr[i].int_value() == in_attr[i].int_value())
9020 // The output architecture has been changed to match the
9021 // input architecture. Use the input names.
9022 out_attr[elfcpp::Tag_CPU_name].set_string_value(
9023 in_attr[elfcpp::Tag_CPU_name].string_value());
9024 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value(
9025 in_attr[elfcpp::Tag_CPU_raw_name].string_value());
9027 else
9029 out_attr[elfcpp::Tag_CPU_name].set_string_value("");
9030 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value("");
9033 // If we still don't have a value for Tag_CPU_name,
9034 // make one up now. Tag_CPU_raw_name remains blank.
9035 if (out_attr[elfcpp::Tag_CPU_name].string_value() == "")
9037 const std::string cpu_name =
9038 this->tag_cpu_name_value(out_attr[i].int_value());
9039 // FIXME: If we see an unknown CPU, this will be set
9040 // to "<unknown CPU n>", where n is the attribute value.
9041 // This is different from BFD, which leaves the name alone.
9042 out_attr[elfcpp::Tag_CPU_name].set_string_value(cpu_name);
9045 break;
9047 case elfcpp::Tag_ARM_ISA_use:
9048 case elfcpp::Tag_THUMB_ISA_use:
9049 case elfcpp::Tag_WMMX_arch:
9050 case elfcpp::Tag_Advanced_SIMD_arch:
9051 // ??? Do Advanced_SIMD (NEON) and WMMX conflict?
9052 case elfcpp::Tag_ABI_FP_rounding:
9053 case elfcpp::Tag_ABI_FP_exceptions:
9054 case elfcpp::Tag_ABI_FP_user_exceptions:
9055 case elfcpp::Tag_ABI_FP_number_model:
9056 case elfcpp::Tag_VFP_HP_extension:
9057 case elfcpp::Tag_CPU_unaligned_access:
9058 case elfcpp::Tag_T2EE_use:
9059 case elfcpp::Tag_Virtualization_use:
9060 case elfcpp::Tag_MPextension_use:
9061 // Use the largest value specified.
9062 if (in_attr[i].int_value() > out_attr[i].int_value())
9063 out_attr[i].set_int_value(in_attr[i].int_value());
9064 break;
9066 case elfcpp::Tag_ABI_align8_preserved:
9067 case elfcpp::Tag_ABI_PCS_RO_data:
9068 // Use the smallest value specified.
9069 if (in_attr[i].int_value() < out_attr[i].int_value())
9070 out_attr[i].set_int_value(in_attr[i].int_value());
9071 break;
9073 case elfcpp::Tag_ABI_align8_needed:
9074 if ((in_attr[i].int_value() > 0 || out_attr[i].int_value() > 0)
9075 && (in_attr[elfcpp::Tag_ABI_align8_preserved].int_value() == 0
9076 || (out_attr[elfcpp::Tag_ABI_align8_preserved].int_value()
9077 == 0)))
9079 // This error message should be enabled once all non-conformant
9080 // binaries in the toolchain have had the attributes set
9081 // properly.
9082 // gold_error(_("output 8-byte data alignment conflicts with %s"),
9083 // name);
9085 // Fall through.
9086 case elfcpp::Tag_ABI_FP_denormal:
9087 case elfcpp::Tag_ABI_PCS_GOT_use:
9089 // These tags have 0 = don't care, 1 = strong requirement,
9090 // 2 = weak requirement.
9091 static const int order_021[3] = {0, 2, 1};
9093 // Use the "greatest" from the sequence 0, 2, 1, or the largest
9094 // value if greater than 2 (for future-proofing).
9095 if ((in_attr[i].int_value() > 2
9096 && in_attr[i].int_value() > out_attr[i].int_value())
9097 || (in_attr[i].int_value() <= 2
9098 && out_attr[i].int_value() <= 2
9099 && (order_021[in_attr[i].int_value()]
9100 > order_021[out_attr[i].int_value()])))
9101 out_attr[i].set_int_value(in_attr[i].int_value());
9103 break;
9105 case elfcpp::Tag_CPU_arch_profile:
9106 if (out_attr[i].int_value() != in_attr[i].int_value())
9108 // 0 will merge with anything.
9109 // 'A' and 'S' merge to 'A'.
9110 // 'R' and 'S' merge to 'R'.
9111 // 'M' and 'A|R|S' is an error.
9112 if (out_attr[i].int_value() == 0
9113 || (out_attr[i].int_value() == 'S'
9114 && (in_attr[i].int_value() == 'A'
9115 || in_attr[i].int_value() == 'R')))
9116 out_attr[i].set_int_value(in_attr[i].int_value());
9117 else if (in_attr[i].int_value() == 0
9118 || (in_attr[i].int_value() == 'S'
9119 && (out_attr[i].int_value() == 'A'
9120 || out_attr[i].int_value() == 'R')))
9121 ; // Do nothing.
9122 else
9124 gold_error
9125 (_("conflicting architecture profiles %c/%c"),
9126 in_attr[i].int_value() ? in_attr[i].int_value() : '0',
9127 out_attr[i].int_value() ? out_attr[i].int_value() : '0');
9130 break;
9131 case elfcpp::Tag_VFP_arch:
9133 static const struct
9135 int ver;
9136 int regs;
9137 } vfp_versions[7] =
9139 {0, 0},
9140 {1, 16},
9141 {2, 16},
9142 {3, 32},
9143 {3, 16},
9144 {4, 32},
9145 {4, 16}
9148 // Values greater than 6 aren't defined, so just pick the
9149 // biggest.
9150 if (in_attr[i].int_value() > 6
9151 && in_attr[i].int_value() > out_attr[i].int_value())
9153 *out_attr = *in_attr;
9154 break;
9156 // The output uses the superset of input features
9157 // (ISA version) and registers.
9158 int ver = std::max(vfp_versions[in_attr[i].int_value()].ver,
9159 vfp_versions[out_attr[i].int_value()].ver);
9160 int regs = std::max(vfp_versions[in_attr[i].int_value()].regs,
9161 vfp_versions[out_attr[i].int_value()].regs);
9162 // This assumes all possible supersets are also a valid
9163 // options.
9164 int newval;
9165 for (newval = 6; newval > 0; newval--)
9167 if (regs == vfp_versions[newval].regs
9168 && ver == vfp_versions[newval].ver)
9169 break;
9171 out_attr[i].set_int_value(newval);
9173 break;
9174 case elfcpp::Tag_PCS_config:
9175 if (out_attr[i].int_value() == 0)
9176 out_attr[i].set_int_value(in_attr[i].int_value());
9177 else if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
9179 // It's sometimes ok to mix different configs, so this is only
9180 // a warning.
9181 gold_warning(_("%s: conflicting platform configuration"), name);
9183 break;
9184 case elfcpp::Tag_ABI_PCS_R9_use:
9185 if (in_attr[i].int_value() != out_attr[i].int_value()
9186 && out_attr[i].int_value() != elfcpp::AEABI_R9_unused
9187 && in_attr[i].int_value() != elfcpp::AEABI_R9_unused)
9189 gold_error(_("%s: conflicting use of R9"), name);
9191 if (out_attr[i].int_value() == elfcpp::AEABI_R9_unused)
9192 out_attr[i].set_int_value(in_attr[i].int_value());
9193 break;
9194 case elfcpp::Tag_ABI_PCS_RW_data:
9195 if (in_attr[i].int_value() == elfcpp::AEABI_PCS_RW_data_SBrel
9196 && (in_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
9197 != elfcpp::AEABI_R9_SB)
9198 && (out_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
9199 != elfcpp::AEABI_R9_unused))
9201 gold_error(_("%s: SB relative addressing conflicts with use "
9202 "of R9"),
9203 name);
9205 // Use the smallest value specified.
9206 if (in_attr[i].int_value() < out_attr[i].int_value())
9207 out_attr[i].set_int_value(in_attr[i].int_value());
9208 break;
9209 case elfcpp::Tag_ABI_PCS_wchar_t:
9210 // FIXME: Make it possible to turn off this warning.
9211 if (out_attr[i].int_value()
9212 && in_attr[i].int_value()
9213 && out_attr[i].int_value() != in_attr[i].int_value())
9215 gold_warning(_("%s uses %u-byte wchar_t yet the output is to "
9216 "use %u-byte wchar_t; use of wchar_t values "
9217 "across objects may fail"),
9218 name, in_attr[i].int_value(),
9219 out_attr[i].int_value());
9221 else if (in_attr[i].int_value() && !out_attr[i].int_value())
9222 out_attr[i].set_int_value(in_attr[i].int_value());
9223 break;
9224 case elfcpp::Tag_ABI_enum_size:
9225 if (in_attr[i].int_value() != elfcpp::AEABI_enum_unused)
9227 if (out_attr[i].int_value() == elfcpp::AEABI_enum_unused
9228 || out_attr[i].int_value() == elfcpp::AEABI_enum_forced_wide)
9230 // The existing object is compatible with anything.
9231 // Use whatever requirements the new object has.
9232 out_attr[i].set_int_value(in_attr[i].int_value());
9234 // FIXME: Make it possible to turn off this warning.
9235 else if (in_attr[i].int_value() != elfcpp::AEABI_enum_forced_wide
9236 && out_attr[i].int_value() != in_attr[i].int_value())
9238 unsigned int in_value = in_attr[i].int_value();
9239 unsigned int out_value = out_attr[i].int_value();
9240 gold_warning(_("%s uses %s enums yet the output is to use "
9241 "%s enums; use of enum values across objects "
9242 "may fail"),
9243 name,
9244 this->aeabi_enum_name(in_value).c_str(),
9245 this->aeabi_enum_name(out_value).c_str());
9248 break;
9249 case elfcpp::Tag_ABI_VFP_args:
9250 // Aready done.
9251 break;
9252 case elfcpp::Tag_ABI_WMMX_args:
9253 if (in_attr[i].int_value() != out_attr[i].int_value())
9255 gold_error(_("%s uses iWMMXt register arguments, output does "
9256 "not"),
9257 name);
9259 break;
9260 case Object_attribute::Tag_compatibility:
9261 // Merged in target-independent code.
9262 break;
9263 case elfcpp::Tag_ABI_HardFP_use:
9264 // 1 (SP) and 2 (DP) conflict, so combine to 3 (SP & DP).
9265 if ((in_attr[i].int_value() == 1 && out_attr[i].int_value() == 2)
9266 || (in_attr[i].int_value() == 2 && out_attr[i].int_value() == 1))
9267 out_attr[i].set_int_value(3);
9268 else if (in_attr[i].int_value() > out_attr[i].int_value())
9269 out_attr[i].set_int_value(in_attr[i].int_value());
9270 break;
9271 case elfcpp::Tag_ABI_FP_16bit_format:
9272 if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
9274 if (in_attr[i].int_value() != out_attr[i].int_value())
9275 gold_error(_("fp16 format mismatch between %s and output"),
9276 name);
9278 if (in_attr[i].int_value() != 0)
9279 out_attr[i].set_int_value(in_attr[i].int_value());
9280 break;
9282 case elfcpp::Tag_nodefaults:
9283 // This tag is set if it exists, but the value is unused (and is
9284 // typically zero). We don't actually need to do anything here -
9285 // the merge happens automatically when the type flags are merged
9286 // below.
9287 break;
9288 case elfcpp::Tag_also_compatible_with:
9289 // Already done in Tag_CPU_arch.
9290 break;
9291 case elfcpp::Tag_conformance:
9292 // Keep the attribute if it matches. Throw it away otherwise.
9293 // No attribute means no claim to conform.
9294 if (in_attr[i].string_value() != out_attr[i].string_value())
9295 out_attr[i].set_string_value("");
9296 break;
9298 default:
9300 const char* err_object = NULL;
9302 // The "known_obj_attributes" table does contain some undefined
9303 // attributes. Ensure that there are unused.
9304 if (out_attr[i].int_value() != 0
9305 || out_attr[i].string_value() != "")
9306 err_object = "output";
9307 else if (in_attr[i].int_value() != 0
9308 || in_attr[i].string_value() != "")
9309 err_object = name;
9311 if (err_object != NULL)
9313 // Attribute numbers >=64 (mod 128) can be safely ignored.
9314 if ((i & 127) < 64)
9315 gold_error(_("%s: unknown mandatory EABI object attribute "
9316 "%d"),
9317 err_object, i);
9318 else
9319 gold_warning(_("%s: unknown EABI object attribute %d"),
9320 err_object, i);
9323 // Only pass on attributes that match in both inputs.
9324 if (!in_attr[i].matches(out_attr[i]))
9326 out_attr[i].set_int_value(0);
9327 out_attr[i].set_string_value("");
9332 // If out_attr was copied from in_attr then it won't have a type yet.
9333 if (in_attr[i].type() && !out_attr[i].type())
9334 out_attr[i].set_type(in_attr[i].type());
9337 // Merge Tag_compatibility attributes and any common GNU ones.
9338 this->attributes_section_data_->merge(name, pasd);
9340 // Check for any attributes not known on ARM.
9341 typedef Vendor_object_attributes::Other_attributes Other_attributes;
9342 const Other_attributes* in_other_attributes = pasd->other_attributes(vendor);
9343 Other_attributes::const_iterator in_iter = in_other_attributes->begin();
9344 Other_attributes* out_other_attributes =
9345 this->attributes_section_data_->other_attributes(vendor);
9346 Other_attributes::iterator out_iter = out_other_attributes->begin();
9348 while (in_iter != in_other_attributes->end()
9349 || out_iter != out_other_attributes->end())
9351 const char* err_object = NULL;
9352 int err_tag = 0;
9354 // The tags for each list are in numerical order.
9355 // If the tags are equal, then merge.
9356 if (out_iter != out_other_attributes->end()
9357 && (in_iter == in_other_attributes->end()
9358 || in_iter->first > out_iter->first))
9360 // This attribute only exists in output. We can't merge, and we
9361 // don't know what the tag means, so delete it.
9362 err_object = "output";
9363 err_tag = out_iter->first;
9364 int saved_tag = out_iter->first;
9365 delete out_iter->second;
9366 out_other_attributes->erase(out_iter);
9367 out_iter = out_other_attributes->upper_bound(saved_tag);
9369 else if (in_iter != in_other_attributes->end()
9370 && (out_iter != out_other_attributes->end()
9371 || in_iter->first < out_iter->first))
9373 // This attribute only exists in input. We can't merge, and we
9374 // don't know what the tag means, so ignore it.
9375 err_object = name;
9376 err_tag = in_iter->first;
9377 ++in_iter;
9379 else // The tags are equal.
9381 // As present, all attributes in the list are unknown, and
9382 // therefore can't be merged meaningfully.
9383 err_object = "output";
9384 err_tag = out_iter->first;
9386 // Only pass on attributes that match in both inputs.
9387 if (!in_iter->second->matches(*(out_iter->second)))
9389 // No match. Delete the attribute.
9390 int saved_tag = out_iter->first;
9391 delete out_iter->second;
9392 out_other_attributes->erase(out_iter);
9393 out_iter = out_other_attributes->upper_bound(saved_tag);
9395 else
9397 // Matched. Keep the attribute and move to the next.
9398 ++out_iter;
9399 ++in_iter;
9403 if (err_object)
9405 // Attribute numbers >=64 (mod 128) can be safely ignored. */
9406 if ((err_tag & 127) < 64)
9408 gold_error(_("%s: unknown mandatory EABI object attribute %d"),
9409 err_object, err_tag);
9411 else
9413 gold_warning(_("%s: unknown EABI object attribute %d"),
9414 err_object, err_tag);
9420 // Stub-generation methods for Target_arm.
9422 // Make a new Arm_input_section object.
9424 template<bool big_endian>
9425 Arm_input_section<big_endian>*
9426 Target_arm<big_endian>::new_arm_input_section(
9427 Relobj* relobj,
9428 unsigned int shndx)
9430 Section_id sid(relobj, shndx);
9432 Arm_input_section<big_endian>* arm_input_section =
9433 new Arm_input_section<big_endian>(relobj, shndx);
9434 arm_input_section->init();
9436 // Register new Arm_input_section in map for look-up.
9437 std::pair<typename Arm_input_section_map::iterator, bool> ins =
9438 this->arm_input_section_map_.insert(std::make_pair(sid, arm_input_section));
9440 // Make sure that it we have not created another Arm_input_section
9441 // for this input section already.
9442 gold_assert(ins.second);
9444 return arm_input_section;
9447 // Find the Arm_input_section object corresponding to the SHNDX-th input
9448 // section of RELOBJ.
9450 template<bool big_endian>
9451 Arm_input_section<big_endian>*
9452 Target_arm<big_endian>::find_arm_input_section(
9453 Relobj* relobj,
9454 unsigned int shndx) const
9456 Section_id sid(relobj, shndx);
9457 typename Arm_input_section_map::const_iterator p =
9458 this->arm_input_section_map_.find(sid);
9459 return (p != this->arm_input_section_map_.end()) ? p->second : NULL;
9462 // Make a new stub table.
9464 template<bool big_endian>
9465 Stub_table<big_endian>*
9466 Target_arm<big_endian>::new_stub_table(Arm_input_section<big_endian>* owner)
9468 Stub_table<big_endian>* stub_table =
9469 new Stub_table<big_endian>(owner);
9470 this->stub_tables_.push_back(stub_table);
9472 stub_table->set_address(owner->address() + owner->data_size());
9473 stub_table->set_file_offset(owner->offset() + owner->data_size());
9474 stub_table->finalize_data_size();
9476 return stub_table;
9479 // Scan a relocation for stub generation.
9481 template<bool big_endian>
9482 void
9483 Target_arm<big_endian>::scan_reloc_for_stub(
9484 const Relocate_info<32, big_endian>* relinfo,
9485 unsigned int r_type,
9486 const Sized_symbol<32>* gsym,
9487 unsigned int r_sym,
9488 const Symbol_value<32>* psymval,
9489 elfcpp::Elf_types<32>::Elf_Swxword addend,
9490 Arm_address address)
9492 typedef typename Target_arm<big_endian>::Relocate Relocate;
9494 const Arm_relobj<big_endian>* arm_relobj =
9495 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
9497 if (r_type == elfcpp::R_ARM_V4BX)
9499 const uint32_t reg = (addend & 0xf);
9500 if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING
9501 && reg < 0xf)
9503 // Try looking up an existing stub from a stub table.
9504 Stub_table<big_endian>* stub_table =
9505 arm_relobj->stub_table(relinfo->data_shndx);
9506 gold_assert(stub_table != NULL);
9508 if (stub_table->find_arm_v4bx_stub(reg) == NULL)
9510 // create a new stub and add it to stub table.
9511 Arm_v4bx_stub* stub =
9512 this->stub_factory().make_arm_v4bx_stub(reg);
9513 gold_assert(stub != NULL);
9514 stub_table->add_arm_v4bx_stub(stub);
9518 return;
9521 bool target_is_thumb;
9522 Symbol_value<32> symval;
9523 if (gsym != NULL)
9525 // This is a global symbol. Determine if we use PLT and if the
9526 // final target is THUMB.
9527 if (gsym->use_plt_offset(Relocate::reloc_is_non_pic(r_type)))
9529 // This uses a PLT, change the symbol value.
9530 symval.set_output_value(this->plt_section()->address()
9531 + gsym->plt_offset());
9532 psymval = &symval;
9533 target_is_thumb = false;
9535 else if (gsym->is_undefined())
9536 // There is no need to generate a stub symbol is undefined.
9537 return;
9538 else
9540 target_is_thumb =
9541 ((gsym->type() == elfcpp::STT_ARM_TFUNC)
9542 || (gsym->type() == elfcpp::STT_FUNC
9543 && !gsym->is_undefined()
9544 && ((psymval->value(arm_relobj, 0) & 1) != 0)));
9547 else
9549 // This is a local symbol. Determine if the final target is THUMB.
9550 target_is_thumb = arm_relobj->local_symbol_is_thumb_function(r_sym);
9553 // Strip LSB if this points to a THUMB target.
9554 const Arm_reloc_property* reloc_property =
9555 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
9556 gold_assert(reloc_property != NULL);
9557 if (target_is_thumb
9558 && reloc_property->uses_thumb_bit()
9559 && ((psymval->value(arm_relobj, 0) & 1) != 0))
9561 Arm_address stripped_value =
9562 psymval->value(arm_relobj, 0) & ~static_cast<Arm_address>(1);
9563 symval.set_output_value(stripped_value);
9564 psymval = &symval;
9567 // Get the symbol value.
9568 Symbol_value<32>::Value value = psymval->value(arm_relobj, 0);
9570 // Owing to pipelining, the PC relative branches below actually skip
9571 // two instructions when the branch offset is 0.
9572 Arm_address destination;
9573 switch (r_type)
9575 case elfcpp::R_ARM_CALL:
9576 case elfcpp::R_ARM_JUMP24:
9577 case elfcpp::R_ARM_PLT32:
9578 // ARM branches.
9579 destination = value + addend + 8;
9580 break;
9581 case elfcpp::R_ARM_THM_CALL:
9582 case elfcpp::R_ARM_THM_XPC22:
9583 case elfcpp::R_ARM_THM_JUMP24:
9584 case elfcpp::R_ARM_THM_JUMP19:
9585 // THUMB branches.
9586 destination = value + addend + 4;
9587 break;
9588 default:
9589 gold_unreachable();
9592 Reloc_stub* stub = NULL;
9593 Stub_type stub_type =
9594 Reloc_stub::stub_type_for_reloc(r_type, address, destination,
9595 target_is_thumb);
9596 if (stub_type != arm_stub_none)
9598 // Try looking up an existing stub from a stub table.
9599 Stub_table<big_endian>* stub_table =
9600 arm_relobj->stub_table(relinfo->data_shndx);
9601 gold_assert(stub_table != NULL);
9603 // Locate stub by destination.
9604 Reloc_stub::Key stub_key(stub_type, gsym, arm_relobj, r_sym, addend);
9606 // Create a stub if there is not one already
9607 stub = stub_table->find_reloc_stub(stub_key);
9608 if (stub == NULL)
9610 // create a new stub and add it to stub table.
9611 stub = this->stub_factory().make_reloc_stub(stub_type);
9612 stub_table->add_reloc_stub(stub, stub_key);
9615 // Record the destination address.
9616 stub->set_destination_address(destination
9617 | (target_is_thumb ? 1 : 0));
9620 // For Cortex-A8, we need to record a relocation at 4K page boundary.
9621 if (this->fix_cortex_a8_
9622 && (r_type == elfcpp::R_ARM_THM_JUMP24
9623 || r_type == elfcpp::R_ARM_THM_JUMP19
9624 || r_type == elfcpp::R_ARM_THM_CALL
9625 || r_type == elfcpp::R_ARM_THM_XPC22)
9626 && (address & 0xfffU) == 0xffeU)
9628 // Found a candidate. Note we haven't checked the destination is
9629 // within 4K here: if we do so (and don't create a record) we can't
9630 // tell that a branch should have been relocated when scanning later.
9631 this->cortex_a8_relocs_info_[address] =
9632 new Cortex_a8_reloc(stub, r_type,
9633 destination | (target_is_thumb ? 1 : 0));
9637 // This function scans a relocation sections for stub generation.
9638 // The template parameter Relocate must be a class type which provides
9639 // a single function, relocate(), which implements the machine
9640 // specific part of a relocation.
9642 // BIG_ENDIAN is the endianness of the data. SH_TYPE is the section type:
9643 // SHT_REL or SHT_RELA.
9645 // PRELOCS points to the relocation data. RELOC_COUNT is the number
9646 // of relocs. OUTPUT_SECTION is the output section.
9647 // NEEDS_SPECIAL_OFFSET_HANDLING is true if input offsets need to be
9648 // mapped to output offsets.
9650 // VIEW is the section data, VIEW_ADDRESS is its memory address, and
9651 // VIEW_SIZE is the size. These refer to the input section, unless
9652 // NEEDS_SPECIAL_OFFSET_HANDLING is true, in which case they refer to
9653 // the output section.
9655 template<bool big_endian>
9656 template<int sh_type>
9657 void inline
9658 Target_arm<big_endian>::scan_reloc_section_for_stubs(
9659 const Relocate_info<32, big_endian>* relinfo,
9660 const unsigned char* prelocs,
9661 size_t reloc_count,
9662 Output_section* output_section,
9663 bool needs_special_offset_handling,
9664 const unsigned char* view,
9665 elfcpp::Elf_types<32>::Elf_Addr view_address,
9666 section_size_type)
9668 typedef typename Reloc_types<sh_type, 32, big_endian>::Reloc Reltype;
9669 const int reloc_size =
9670 Reloc_types<sh_type, 32, big_endian>::reloc_size;
9672 Arm_relobj<big_endian>* arm_object =
9673 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
9674 unsigned int local_count = arm_object->local_symbol_count();
9676 Comdat_behavior comdat_behavior = CB_UNDETERMINED;
9678 for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
9680 Reltype reloc(prelocs);
9682 typename elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
9683 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
9684 unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
9686 r_type = this->get_real_reloc_type(r_type);
9688 // Only a few relocation types need stubs.
9689 if ((r_type != elfcpp::R_ARM_CALL)
9690 && (r_type != elfcpp::R_ARM_JUMP24)
9691 && (r_type != elfcpp::R_ARM_PLT32)
9692 && (r_type != elfcpp::R_ARM_THM_CALL)
9693 && (r_type != elfcpp::R_ARM_THM_XPC22)
9694 && (r_type != elfcpp::R_ARM_THM_JUMP24)
9695 && (r_type != elfcpp::R_ARM_THM_JUMP19)
9696 && (r_type != elfcpp::R_ARM_V4BX))
9697 continue;
9699 section_offset_type offset =
9700 convert_to_section_size_type(reloc.get_r_offset());
9702 if (needs_special_offset_handling)
9704 offset = output_section->output_offset(relinfo->object,
9705 relinfo->data_shndx,
9706 offset);
9707 if (offset == -1)
9708 continue;
9711 if (r_type == elfcpp::R_ARM_V4BX)
9713 // Get the BX instruction.
9714 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
9715 const Valtype* wv = reinterpret_cast<const Valtype*>(view + offset);
9716 elfcpp::Elf_types<32>::Elf_Swxword insn =
9717 elfcpp::Swap<32, big_endian>::readval(wv);
9718 this->scan_reloc_for_stub(relinfo, r_type, NULL, 0, NULL,
9719 insn, NULL);
9720 continue;
9723 // Get the addend.
9724 Stub_addend_reader<sh_type, big_endian> stub_addend_reader;
9725 elfcpp::Elf_types<32>::Elf_Swxword addend =
9726 stub_addend_reader(r_type, view + offset, reloc);
9728 const Sized_symbol<32>* sym;
9730 Symbol_value<32> symval;
9731 const Symbol_value<32> *psymval;
9732 if (r_sym < local_count)
9734 sym = NULL;
9735 psymval = arm_object->local_symbol(r_sym);
9737 // If the local symbol belongs to a section we are discarding,
9738 // and that section is a debug section, try to find the
9739 // corresponding kept section and map this symbol to its
9740 // counterpart in the kept section. The symbol must not
9741 // correspond to a section we are folding.
9742 bool is_ordinary;
9743 unsigned int shndx = psymval->input_shndx(&is_ordinary);
9744 if (is_ordinary
9745 && shndx != elfcpp::SHN_UNDEF
9746 && !arm_object->is_section_included(shndx)
9747 && !(relinfo->symtab->is_section_folded(arm_object, shndx)))
9749 if (comdat_behavior == CB_UNDETERMINED)
9751 std::string name =
9752 arm_object->section_name(relinfo->data_shndx);
9753 comdat_behavior = get_comdat_behavior(name.c_str());
9755 if (comdat_behavior == CB_PRETEND)
9757 bool found;
9758 typename elfcpp::Elf_types<32>::Elf_Addr value =
9759 arm_object->map_to_kept_section(shndx, &found);
9760 if (found)
9761 symval.set_output_value(value + psymval->input_value());
9762 else
9763 symval.set_output_value(0);
9765 else
9767 symval.set_output_value(0);
9769 symval.set_no_output_symtab_entry();
9770 psymval = &symval;
9773 else
9775 const Symbol* gsym = arm_object->global_symbol(r_sym);
9776 gold_assert(gsym != NULL);
9777 if (gsym->is_forwarder())
9778 gsym = relinfo->symtab->resolve_forwards(gsym);
9780 sym = static_cast<const Sized_symbol<32>*>(gsym);
9781 if (sym->has_symtab_index())
9782 symval.set_output_symtab_index(sym->symtab_index());
9783 else
9784 symval.set_no_output_symtab_entry();
9786 // We need to compute the would-be final value of this global
9787 // symbol.
9788 const Symbol_table* symtab = relinfo->symtab;
9789 const Sized_symbol<32>* sized_symbol =
9790 symtab->get_sized_symbol<32>(gsym);
9791 Symbol_table::Compute_final_value_status status;
9792 Arm_address value =
9793 symtab->compute_final_value<32>(sized_symbol, &status);
9795 // Skip this if the symbol has not output section.
9796 if (status == Symbol_table::CFVS_NO_OUTPUT_SECTION)
9797 continue;
9799 symval.set_output_value(value);
9800 psymval = &symval;
9803 // If symbol is a section symbol, we don't know the actual type of
9804 // destination. Give up.
9805 if (psymval->is_section_symbol())
9806 continue;
9808 this->scan_reloc_for_stub(relinfo, r_type, sym, r_sym, psymval,
9809 addend, view_address + offset);
9813 // Scan an input section for stub generation.
9815 template<bool big_endian>
9816 void
9817 Target_arm<big_endian>::scan_section_for_stubs(
9818 const Relocate_info<32, big_endian>* relinfo,
9819 unsigned int sh_type,
9820 const unsigned char* prelocs,
9821 size_t reloc_count,
9822 Output_section* output_section,
9823 bool needs_special_offset_handling,
9824 const unsigned char* view,
9825 Arm_address view_address,
9826 section_size_type view_size)
9828 if (sh_type == elfcpp::SHT_REL)
9829 this->scan_reloc_section_for_stubs<elfcpp::SHT_REL>(
9830 relinfo,
9831 prelocs,
9832 reloc_count,
9833 output_section,
9834 needs_special_offset_handling,
9835 view,
9836 view_address,
9837 view_size);
9838 else if (sh_type == elfcpp::SHT_RELA)
9839 // We do not support RELA type relocations yet. This is provided for
9840 // completeness.
9841 this->scan_reloc_section_for_stubs<elfcpp::SHT_RELA>(
9842 relinfo,
9843 prelocs,
9844 reloc_count,
9845 output_section,
9846 needs_special_offset_handling,
9847 view,
9848 view_address,
9849 view_size);
9850 else
9851 gold_unreachable();
9854 // Group input sections for stub generation.
9856 // We goup input sections in an output sections so that the total size,
9857 // including any padding space due to alignment is smaller than GROUP_SIZE
9858 // unless the only input section in group is bigger than GROUP_SIZE already.
9859 // Then an ARM stub table is created to follow the last input section
9860 // in group. For each group an ARM stub table is created an is placed
9861 // after the last group. If STUB_ALWATS_AFTER_BRANCH is false, we further
9862 // extend the group after the stub table.
9864 template<bool big_endian>
9865 void
9866 Target_arm<big_endian>::group_sections(
9867 Layout* layout,
9868 section_size_type group_size,
9869 bool stubs_always_after_branch)
9871 // Group input sections and insert stub table
9872 Layout::Section_list section_list;
9873 layout->get_allocated_sections(&section_list);
9874 for (Layout::Section_list::const_iterator p = section_list.begin();
9875 p != section_list.end();
9876 ++p)
9878 Arm_output_section<big_endian>* output_section =
9879 Arm_output_section<big_endian>::as_arm_output_section(*p);
9880 output_section->group_sections(group_size, stubs_always_after_branch,
9881 this);
9885 // Relaxation hook. This is where we do stub generation.
9887 template<bool big_endian>
9888 bool
9889 Target_arm<big_endian>::do_relax(
9890 int pass,
9891 const Input_objects* input_objects,
9892 Symbol_table* symtab,
9893 Layout* layout)
9895 // No need to generate stubs if this is a relocatable link.
9896 gold_assert(!parameters->options().relocatable());
9898 // If this is the first pass, we need to group input sections into
9899 // stub groups.
9900 bool done_exidx_fixup = false;
9901 if (pass == 1)
9903 // Determine the stub group size. The group size is the absolute
9904 // value of the parameter --stub-group-size. If --stub-group-size
9905 // is passed a negative value, we restict stubs to be always after
9906 // the stubbed branches.
9907 int32_t stub_group_size_param =
9908 parameters->options().stub_group_size();
9909 bool stubs_always_after_branch = stub_group_size_param < 0;
9910 section_size_type stub_group_size = abs(stub_group_size_param);
9912 // The Cortex-A8 erratum fix depends on stubs not being in the same 4K
9913 // page as the first half of a 32-bit branch straddling two 4K pages.
9914 // This is a crude way of enforcing that.
9915 if (this->fix_cortex_a8_)
9916 stubs_always_after_branch = true;
9918 if (stub_group_size == 1)
9920 // Default value.
9921 // Thumb branch range is +-4MB has to be used as the default
9922 // maximum size (a given section can contain both ARM and Thumb
9923 // code, so the worst case has to be taken into account).
9925 // This value is 24K less than that, which allows for 2025
9926 // 12-byte stubs. If we exceed that, then we will fail to link.
9927 // The user will have to relink with an explicit group size
9928 // option.
9929 stub_group_size = 4170000;
9932 group_sections(layout, stub_group_size, stubs_always_after_branch);
9934 // Also fix .ARM.exidx section coverage.
9935 Output_section* os = layout->find_output_section(".ARM.exidx");
9936 if (os != NULL && os->type() == elfcpp::SHT_ARM_EXIDX)
9938 Arm_output_section<big_endian>* exidx_output_section =
9939 Arm_output_section<big_endian>::as_arm_output_section(os);
9940 this->fix_exidx_coverage(layout, exidx_output_section, symtab);
9941 done_exidx_fixup = true;
9945 // The Cortex-A8 stubs are sensitive to layout of code sections. At the
9946 // beginning of each relaxation pass, just blow away all the stubs.
9947 // Alternatively, we could selectively remove only the stubs and reloc
9948 // information for code sections that have moved since the last pass.
9949 // That would require more book-keeping.
9950 typedef typename Stub_table_list::iterator Stub_table_iterator;
9951 if (this->fix_cortex_a8_)
9953 // Clear all Cortex-A8 reloc information.
9954 for (typename Cortex_a8_relocs_info::const_iterator p =
9955 this->cortex_a8_relocs_info_.begin();
9956 p != this->cortex_a8_relocs_info_.end();
9957 ++p)
9958 delete p->second;
9959 this->cortex_a8_relocs_info_.clear();
9961 // Remove all Cortex-A8 stubs.
9962 for (Stub_table_iterator sp = this->stub_tables_.begin();
9963 sp != this->stub_tables_.end();
9964 ++sp)
9965 (*sp)->remove_all_cortex_a8_stubs();
9968 // Scan relocs for relocation stubs
9969 for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
9970 op != input_objects->relobj_end();
9971 ++op)
9973 Arm_relobj<big_endian>* arm_relobj =
9974 Arm_relobj<big_endian>::as_arm_relobj(*op);
9975 arm_relobj->scan_sections_for_stubs(this, symtab, layout);
9978 // Check all stub tables to see if any of them have their data sizes
9979 // or addresses alignments changed. These are the only things that
9980 // matter.
9981 bool any_stub_table_changed = false;
9982 Unordered_set<const Output_section*> sections_needing_adjustment;
9983 for (Stub_table_iterator sp = this->stub_tables_.begin();
9984 (sp != this->stub_tables_.end()) && !any_stub_table_changed;
9985 ++sp)
9987 if ((*sp)->update_data_size_and_addralign())
9989 // Update data size of stub table owner.
9990 Arm_input_section<big_endian>* owner = (*sp)->owner();
9991 uint64_t address = owner->address();
9992 off_t offset = owner->offset();
9993 owner->reset_address_and_file_offset();
9994 owner->set_address_and_file_offset(address, offset);
9996 sections_needing_adjustment.insert(owner->output_section());
9997 any_stub_table_changed = true;
10001 // Output_section_data::output_section() returns a const pointer but we
10002 // need to update output sections, so we record all output sections needing
10003 // update above and scan the sections here to find out what sections need
10004 // to be updated.
10005 for(Layout::Section_list::const_iterator p = layout->section_list().begin();
10006 p != layout->section_list().end();
10007 ++p)
10009 if (sections_needing_adjustment.find(*p)
10010 != sections_needing_adjustment.end())
10011 (*p)->set_section_offsets_need_adjustment();
10014 // Stop relaxation if no EXIDX fix-up and no stub table change.
10015 bool continue_relaxation = done_exidx_fixup || any_stub_table_changed;
10017 // Finalize the stubs in the last relaxation pass.
10018 if (!continue_relaxation)
10020 for (Stub_table_iterator sp = this->stub_tables_.begin();
10021 (sp != this->stub_tables_.end()) && !any_stub_table_changed;
10022 ++sp)
10023 (*sp)->finalize_stubs();
10025 // Update output local symbol counts of objects if necessary.
10026 for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
10027 op != input_objects->relobj_end();
10028 ++op)
10030 Arm_relobj<big_endian>* arm_relobj =
10031 Arm_relobj<big_endian>::as_arm_relobj(*op);
10033 // Update output local symbol counts. We need to discard local
10034 // symbols defined in parts of input sections that are discarded by
10035 // relaxation.
10036 if (arm_relobj->output_local_symbol_count_needs_update())
10037 arm_relobj->update_output_local_symbol_count();
10041 return continue_relaxation;
10044 // Relocate a stub.
10046 template<bool big_endian>
10047 void
10048 Target_arm<big_endian>::relocate_stub(
10049 Stub* stub,
10050 const Relocate_info<32, big_endian>* relinfo,
10051 Output_section* output_section,
10052 unsigned char* view,
10053 Arm_address address,
10054 section_size_type view_size)
10056 Relocate relocate;
10057 const Stub_template* stub_template = stub->stub_template();
10058 for (size_t i = 0; i < stub_template->reloc_count(); i++)
10060 size_t reloc_insn_index = stub_template->reloc_insn_index(i);
10061 const Insn_template* insn = &stub_template->insns()[reloc_insn_index];
10063 unsigned int r_type = insn->r_type();
10064 section_size_type reloc_offset = stub_template->reloc_offset(i);
10065 section_size_type reloc_size = insn->size();
10066 gold_assert(reloc_offset + reloc_size <= view_size);
10068 // This is the address of the stub destination.
10069 Arm_address target = stub->reloc_target(i) + insn->reloc_addend();
10070 Symbol_value<32> symval;
10071 symval.set_output_value(target);
10073 // Synthesize a fake reloc just in case. We don't have a symbol so
10074 // we use 0.
10075 unsigned char reloc_buffer[elfcpp::Elf_sizes<32>::rel_size];
10076 memset(reloc_buffer, 0, sizeof(reloc_buffer));
10077 elfcpp::Rel_write<32, big_endian> reloc_write(reloc_buffer);
10078 reloc_write.put_r_offset(reloc_offset);
10079 reloc_write.put_r_info(elfcpp::elf_r_info<32>(0, r_type));
10080 elfcpp::Rel<32, big_endian> rel(reloc_buffer);
10082 relocate.relocate(relinfo, this, output_section,
10083 this->fake_relnum_for_stubs, rel, r_type,
10084 NULL, &symval, view + reloc_offset,
10085 address + reloc_offset, reloc_size);
10089 // Determine whether an object attribute tag takes an integer, a
10090 // string or both.
10092 template<bool big_endian>
10094 Target_arm<big_endian>::do_attribute_arg_type(int tag) const
10096 if (tag == Object_attribute::Tag_compatibility)
10097 return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
10098 | Object_attribute::ATTR_TYPE_FLAG_STR_VAL);
10099 else if (tag == elfcpp::Tag_nodefaults)
10100 return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
10101 | Object_attribute::ATTR_TYPE_FLAG_NO_DEFAULT);
10102 else if (tag == elfcpp::Tag_CPU_raw_name || tag == elfcpp::Tag_CPU_name)
10103 return Object_attribute::ATTR_TYPE_FLAG_STR_VAL;
10104 else if (tag < 32)
10105 return Object_attribute::ATTR_TYPE_FLAG_INT_VAL;
10106 else
10107 return ((tag & 1) != 0
10108 ? Object_attribute::ATTR_TYPE_FLAG_STR_VAL
10109 : Object_attribute::ATTR_TYPE_FLAG_INT_VAL);
10112 // Reorder attributes.
10114 // The ABI defines that Tag_conformance should be emitted first, and that
10115 // Tag_nodefaults should be second (if either is defined). This sets those
10116 // two positions, and bumps up the position of all the remaining tags to
10117 // compensate.
10119 template<bool big_endian>
10121 Target_arm<big_endian>::do_attributes_order(int num) const
10123 // Reorder the known object attributes in output. We want to move
10124 // Tag_conformance to position 4 and Tag_conformance to position 5
10125 // and shift eveything between 4 .. Tag_conformance - 1 to make room.
10126 if (num == 4)
10127 return elfcpp::Tag_conformance;
10128 if (num == 5)
10129 return elfcpp::Tag_nodefaults;
10130 if ((num - 2) < elfcpp::Tag_nodefaults)
10131 return num - 2;
10132 if ((num - 1) < elfcpp::Tag_conformance)
10133 return num - 1;
10134 return num;
10137 // Scan a span of THUMB code for Cortex-A8 erratum.
10139 template<bool big_endian>
10140 void
10141 Target_arm<big_endian>::scan_span_for_cortex_a8_erratum(
10142 Arm_relobj<big_endian>* arm_relobj,
10143 unsigned int shndx,
10144 section_size_type span_start,
10145 section_size_type span_end,
10146 const unsigned char* view,
10147 Arm_address address)
10149 // Scan for 32-bit Thumb-2 branches which span two 4K regions, where:
10151 // The opcode is BLX.W, BL.W, B.W, Bcc.W
10152 // The branch target is in the same 4KB region as the
10153 // first half of the branch.
10154 // The instruction before the branch is a 32-bit
10155 // length non-branch instruction.
10156 section_size_type i = span_start;
10157 bool last_was_32bit = false;
10158 bool last_was_branch = false;
10159 while (i < span_end)
10161 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
10162 const Valtype* wv = reinterpret_cast<const Valtype*>(view + i);
10163 uint32_t insn = elfcpp::Swap<16, big_endian>::readval(wv);
10164 bool is_blx = false, is_b = false;
10165 bool is_bl = false, is_bcc = false;
10167 bool insn_32bit = (insn & 0xe000) == 0xe000 && (insn & 0x1800) != 0x0000;
10168 if (insn_32bit)
10170 // Load the rest of the insn (in manual-friendly order).
10171 insn = (insn << 16) | elfcpp::Swap<16, big_endian>::readval(wv + 1);
10173 // Encoding T4: B<c>.W.
10174 is_b = (insn & 0xf800d000U) == 0xf0009000U;
10175 // Encoding T1: BL<c>.W.
10176 is_bl = (insn & 0xf800d000U) == 0xf000d000U;
10177 // Encoding T2: BLX<c>.W.
10178 is_blx = (insn & 0xf800d000U) == 0xf000c000U;
10179 // Encoding T3: B<c>.W (not permitted in IT block).
10180 is_bcc = ((insn & 0xf800d000U) == 0xf0008000U
10181 && (insn & 0x07f00000U) != 0x03800000U);
10184 bool is_32bit_branch = is_b || is_bl || is_blx || is_bcc;
10186 // If this instruction is a 32-bit THUMB branch that crosses a 4K
10187 // page boundary and it follows 32-bit non-branch instruction,
10188 // we need to work around.
10189 if (is_32bit_branch
10190 && ((address + i) & 0xfffU) == 0xffeU
10191 && last_was_32bit
10192 && !last_was_branch)
10194 // Check to see if there is a relocation stub for this branch.
10195 bool force_target_arm = false;
10196 bool force_target_thumb = false;
10197 const Cortex_a8_reloc* cortex_a8_reloc = NULL;
10198 Cortex_a8_relocs_info::const_iterator p =
10199 this->cortex_a8_relocs_info_.find(address + i);
10201 if (p != this->cortex_a8_relocs_info_.end())
10203 cortex_a8_reloc = p->second;
10204 bool target_is_thumb = (cortex_a8_reloc->destination() & 1) != 0;
10206 if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
10207 && !target_is_thumb)
10208 force_target_arm = true;
10209 else if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
10210 && target_is_thumb)
10211 force_target_thumb = true;
10214 off_t offset;
10215 Stub_type stub_type = arm_stub_none;
10217 // Check if we have an offending branch instruction.
10218 uint16_t upper_insn = (insn >> 16) & 0xffffU;
10219 uint16_t lower_insn = insn & 0xffffU;
10220 typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
10222 if (cortex_a8_reloc != NULL
10223 && cortex_a8_reloc->reloc_stub() != NULL)
10224 // We've already made a stub for this instruction, e.g.
10225 // it's a long branch or a Thumb->ARM stub. Assume that
10226 // stub will suffice to work around the A8 erratum (see
10227 // setting of always_after_branch above).
10229 else if (is_bcc)
10231 offset = RelocFuncs::thumb32_cond_branch_offset(upper_insn,
10232 lower_insn);
10233 stub_type = arm_stub_a8_veneer_b_cond;
10235 else if (is_b || is_bl || is_blx)
10237 offset = RelocFuncs::thumb32_branch_offset(upper_insn,
10238 lower_insn);
10239 if (is_blx)
10240 offset &= ~3;
10242 stub_type = (is_blx
10243 ? arm_stub_a8_veneer_blx
10244 : (is_bl
10245 ? arm_stub_a8_veneer_bl
10246 : arm_stub_a8_veneer_b));
10249 if (stub_type != arm_stub_none)
10251 Arm_address pc_for_insn = address + i + 4;
10253 // The original instruction is a BL, but the target is
10254 // an ARM instruction. If we were not making a stub,
10255 // the BL would have been converted to a BLX. Use the
10256 // BLX stub instead in that case.
10257 if (this->may_use_blx() && force_target_arm
10258 && stub_type == arm_stub_a8_veneer_bl)
10260 stub_type = arm_stub_a8_veneer_blx;
10261 is_blx = true;
10262 is_bl = false;
10264 // Conversely, if the original instruction was
10265 // BLX but the target is Thumb mode, use the BL stub.
10266 else if (force_target_thumb
10267 && stub_type == arm_stub_a8_veneer_blx)
10269 stub_type = arm_stub_a8_veneer_bl;
10270 is_blx = false;
10271 is_bl = true;
10274 if (is_blx)
10275 pc_for_insn &= ~3;
10277 // If we found a relocation, use the proper destination,
10278 // not the offset in the (unrelocated) instruction.
10279 // Note this is always done if we switched the stub type above.
10280 if (cortex_a8_reloc != NULL)
10281 offset = (off_t) (cortex_a8_reloc->destination() - pc_for_insn);
10283 Arm_address target = (pc_for_insn + offset) | (is_blx ? 0 : 1);
10285 // Add a new stub if destination address in in the same page.
10286 if (((address + i) & ~0xfffU) == (target & ~0xfffU))
10288 Cortex_a8_stub* stub =
10289 this->stub_factory_.make_cortex_a8_stub(stub_type,
10290 arm_relobj, shndx,
10291 address + i,
10292 target, insn);
10293 Stub_table<big_endian>* stub_table =
10294 arm_relobj->stub_table(shndx);
10295 gold_assert(stub_table != NULL);
10296 stub_table->add_cortex_a8_stub(address + i, stub);
10301 i += insn_32bit ? 4 : 2;
10302 last_was_32bit = insn_32bit;
10303 last_was_branch = is_32bit_branch;
10307 // Apply the Cortex-A8 workaround.
10309 template<bool big_endian>
10310 void
10311 Target_arm<big_endian>::apply_cortex_a8_workaround(
10312 const Cortex_a8_stub* stub,
10313 Arm_address stub_address,
10314 unsigned char* insn_view,
10315 Arm_address insn_address)
10317 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
10318 Valtype* wv = reinterpret_cast<Valtype*>(insn_view);
10319 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
10320 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
10321 off_t branch_offset = stub_address - (insn_address + 4);
10323 typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
10324 switch (stub->stub_template()->type())
10326 case arm_stub_a8_veneer_b_cond:
10327 gold_assert(!utils::has_overflow<21>(branch_offset));
10328 upper_insn = RelocFuncs::thumb32_cond_branch_upper(upper_insn,
10329 branch_offset);
10330 lower_insn = RelocFuncs::thumb32_cond_branch_lower(lower_insn,
10331 branch_offset);
10332 break;
10334 case arm_stub_a8_veneer_b:
10335 case arm_stub_a8_veneer_bl:
10336 case arm_stub_a8_veneer_blx:
10337 if ((lower_insn & 0x5000U) == 0x4000U)
10338 // For a BLX instruction, make sure that the relocation is
10339 // rounded up to a word boundary. This follows the semantics of
10340 // the instruction which specifies that bit 1 of the target
10341 // address will come from bit 1 of the base address.
10342 branch_offset = (branch_offset + 2) & ~3;
10344 // Put BRANCH_OFFSET back into the insn.
10345 gold_assert(!utils::has_overflow<25>(branch_offset));
10346 upper_insn = RelocFuncs::thumb32_branch_upper(upper_insn, branch_offset);
10347 lower_insn = RelocFuncs::thumb32_branch_lower(lower_insn, branch_offset);
10348 break;
10350 default:
10351 gold_unreachable();
10354 // Put the relocated value back in the object file:
10355 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
10356 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
10359 template<bool big_endian>
10360 class Target_selector_arm : public Target_selector
10362 public:
10363 Target_selector_arm()
10364 : Target_selector(elfcpp::EM_ARM, 32, big_endian,
10365 (big_endian ? "elf32-bigarm" : "elf32-littlearm"))
10368 Target*
10369 do_instantiate_target()
10370 { return new Target_arm<big_endian>(); }
10373 // Fix .ARM.exidx section coverage.
10375 template<bool big_endian>
10376 void
10377 Target_arm<big_endian>::fix_exidx_coverage(
10378 Layout* layout,
10379 Arm_output_section<big_endian>* exidx_section,
10380 Symbol_table* symtab)
10382 // We need to look at all the input sections in output in ascending
10383 // order of of output address. We do that by building a sorted list
10384 // of output sections by addresses. Then we looks at the output sections
10385 // in order. The input sections in an output section are already sorted
10386 // by addresses within the output section.
10388 typedef std::set<Output_section*, output_section_address_less_than>
10389 Sorted_output_section_list;
10390 Sorted_output_section_list sorted_output_sections;
10391 Layout::Section_list section_list;
10392 layout->get_allocated_sections(&section_list);
10393 for (Layout::Section_list::const_iterator p = section_list.begin();
10394 p != section_list.end();
10395 ++p)
10397 // We only care about output sections that contain executable code.
10398 if (((*p)->flags() & elfcpp::SHF_EXECINSTR) != 0)
10399 sorted_output_sections.insert(*p);
10402 // Go over the output sections in ascending order of output addresses.
10403 typedef typename Arm_output_section<big_endian>::Text_section_list
10404 Text_section_list;
10405 Text_section_list sorted_text_sections;
10406 for(typename Sorted_output_section_list::iterator p =
10407 sorted_output_sections.begin();
10408 p != sorted_output_sections.end();
10409 ++p)
10411 Arm_output_section<big_endian>* arm_output_section =
10412 Arm_output_section<big_endian>::as_arm_output_section(*p);
10413 arm_output_section->append_text_sections_to_list(&sorted_text_sections);
10416 exidx_section->fix_exidx_coverage(sorted_text_sections, symtab);
10419 Target_selector_arm<false> target_selector_arm;
10420 Target_selector_arm<true> target_selector_armbe;
10422 } // End anonymous namespace.