2010-03-30 Doug Kwan <dougkwan@google.com>
[binutils.git] / gold / arm.cc
blob0f9f1bd1cc158852565db8ae5af87d315da6c155
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 Arm_output_data_got;
89 template<bool big_endian>
90 class Target_arm;
92 // For convenience.
93 typedef elfcpp::Elf_types<32>::Elf_Addr Arm_address;
95 // Maximum branch offsets for ARM, THUMB and THUMB2.
96 const int32_t ARM_MAX_FWD_BRANCH_OFFSET = ((((1 << 23) - 1) << 2) + 8);
97 const int32_t ARM_MAX_BWD_BRANCH_OFFSET = ((-((1 << 23) << 2)) + 8);
98 const int32_t THM_MAX_FWD_BRANCH_OFFSET = ((1 << 22) -2 + 4);
99 const int32_t THM_MAX_BWD_BRANCH_OFFSET = (-(1 << 22) + 4);
100 const int32_t THM2_MAX_FWD_BRANCH_OFFSET = (((1 << 24) - 2) + 4);
101 const int32_t THM2_MAX_BWD_BRANCH_OFFSET = (-(1 << 24) + 4);
103 // Thread Control Block size.
104 const size_t ARM_TCB_SIZE = 8;
106 // The arm target class.
108 // This is a very simple port of gold for ARM-EABI. It is intended for
109 // supporting Android only for the time being.
111 // TODOs:
112 // - Implement all static relocation types documented in arm-reloc.def.
113 // - Make PLTs more flexible for different architecture features like
114 // Thumb-2 and BE8.
115 // There are probably a lot more.
117 // Ideally we would like to avoid using global variables but this is used
118 // very in many places and sometimes in loops. If we use a function
119 // returning a static instance of Arm_reloc_property_table, it will very
120 // slow in an threaded environment since the static instance needs to be
121 // locked. The pointer is below initialized in the
122 // Target::do_select_as_default_target() hook so that we do not spend time
123 // building the table if we are not linking ARM objects.
125 // An alternative is to to process the information in arm-reloc.def in
126 // compilation time and generate a representation of it in PODs only. That
127 // way we can avoid initialization when the linker starts.
129 Arm_reloc_property_table *arm_reloc_property_table = NULL;
131 // Instruction template class. This class is similar to the insn_sequence
132 // struct in bfd/elf32-arm.c.
134 class Insn_template
136 public:
137 // Types of instruction templates.
138 enum Type
140 THUMB16_TYPE = 1,
141 // THUMB16_SPECIAL_TYPE is used by sub-classes of Stub for instruction
142 // templates with class-specific semantics. Currently this is used
143 // only by the Cortex_a8_stub class for handling condition codes in
144 // conditional branches.
145 THUMB16_SPECIAL_TYPE,
146 THUMB32_TYPE,
147 ARM_TYPE,
148 DATA_TYPE
151 // Factory methods to create instruction templates in different formats.
153 static const Insn_template
154 thumb16_insn(uint32_t data)
155 { return Insn_template(data, THUMB16_TYPE, elfcpp::R_ARM_NONE, 0); }
157 // A Thumb conditional branch, in which the proper condition is inserted
158 // when we build the stub.
159 static const Insn_template
160 thumb16_bcond_insn(uint32_t data)
161 { return Insn_template(data, THUMB16_SPECIAL_TYPE, elfcpp::R_ARM_NONE, 1); }
163 static const Insn_template
164 thumb32_insn(uint32_t data)
165 { return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_NONE, 0); }
167 static const Insn_template
168 thumb32_b_insn(uint32_t data, int reloc_addend)
170 return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_THM_JUMP24,
171 reloc_addend);
174 static const Insn_template
175 arm_insn(uint32_t data)
176 { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_NONE, 0); }
178 static const Insn_template
179 arm_rel_insn(unsigned data, int reloc_addend)
180 { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_JUMP24, reloc_addend); }
182 static const Insn_template
183 data_word(unsigned data, unsigned int r_type, int reloc_addend)
184 { return Insn_template(data, DATA_TYPE, r_type, reloc_addend); }
186 // Accessors. This class is used for read-only objects so no modifiers
187 // are provided.
189 uint32_t
190 data() const
191 { return this->data_; }
193 // Return the instruction sequence type of this.
194 Type
195 type() const
196 { return this->type_; }
198 // Return the ARM relocation type of this.
199 unsigned int
200 r_type() const
201 { return this->r_type_; }
203 int32_t
204 reloc_addend() const
205 { return this->reloc_addend_; }
207 // Return size of instruction template in bytes.
208 size_t
209 size() const;
211 // Return byte-alignment of instruction template.
212 unsigned
213 alignment() const;
215 private:
216 // We make the constructor private to ensure that only the factory
217 // methods are used.
218 inline
219 Insn_template(unsigned data, Type type, unsigned int r_type, int reloc_addend)
220 : data_(data), type_(type), r_type_(r_type), reloc_addend_(reloc_addend)
223 // Instruction specific data. This is used to store information like
224 // some of the instruction bits.
225 uint32_t data_;
226 // Instruction template type.
227 Type type_;
228 // Relocation type if there is a relocation or R_ARM_NONE otherwise.
229 unsigned int r_type_;
230 // Relocation addend.
231 int32_t reloc_addend_;
234 // Macro for generating code to stub types. One entry per long/short
235 // branch stub
237 #define DEF_STUBS \
238 DEF_STUB(long_branch_any_any) \
239 DEF_STUB(long_branch_v4t_arm_thumb) \
240 DEF_STUB(long_branch_thumb_only) \
241 DEF_STUB(long_branch_v4t_thumb_thumb) \
242 DEF_STUB(long_branch_v4t_thumb_arm) \
243 DEF_STUB(short_branch_v4t_thumb_arm) \
244 DEF_STUB(long_branch_any_arm_pic) \
245 DEF_STUB(long_branch_any_thumb_pic) \
246 DEF_STUB(long_branch_v4t_thumb_thumb_pic) \
247 DEF_STUB(long_branch_v4t_arm_thumb_pic) \
248 DEF_STUB(long_branch_v4t_thumb_arm_pic) \
249 DEF_STUB(long_branch_thumb_only_pic) \
250 DEF_STUB(a8_veneer_b_cond) \
251 DEF_STUB(a8_veneer_b) \
252 DEF_STUB(a8_veneer_bl) \
253 DEF_STUB(a8_veneer_blx) \
254 DEF_STUB(v4_veneer_bx)
256 // Stub types.
258 #define DEF_STUB(x) arm_stub_##x,
259 typedef enum
261 arm_stub_none,
262 DEF_STUBS
264 // First reloc stub type.
265 arm_stub_reloc_first = arm_stub_long_branch_any_any,
266 // Last reloc stub type.
267 arm_stub_reloc_last = arm_stub_long_branch_thumb_only_pic,
269 // First Cortex-A8 stub type.
270 arm_stub_cortex_a8_first = arm_stub_a8_veneer_b_cond,
271 // Last Cortex-A8 stub type.
272 arm_stub_cortex_a8_last = arm_stub_a8_veneer_blx,
274 // Last stub type.
275 arm_stub_type_last = arm_stub_v4_veneer_bx
276 } Stub_type;
277 #undef DEF_STUB
279 // Stub template class. Templates are meant to be read-only objects.
280 // A stub template for a stub type contains all read-only attributes
281 // common to all stubs of the same type.
283 class Stub_template
285 public:
286 Stub_template(Stub_type, const Insn_template*, size_t);
288 ~Stub_template()
291 // Return stub type.
292 Stub_type
293 type() const
294 { return this->type_; }
296 // Return an array of instruction templates.
297 const Insn_template*
298 insns() const
299 { return this->insns_; }
301 // Return size of template in number of instructions.
302 size_t
303 insn_count() const
304 { return this->insn_count_; }
306 // Return size of template in bytes.
307 size_t
308 size() const
309 { return this->size_; }
311 // Return alignment of the stub template.
312 unsigned
313 alignment() const
314 { return this->alignment_; }
316 // Return whether entry point is in thumb mode.
317 bool
318 entry_in_thumb_mode() const
319 { return this->entry_in_thumb_mode_; }
321 // Return number of relocations in this template.
322 size_t
323 reloc_count() const
324 { return this->relocs_.size(); }
326 // Return index of the I-th instruction with relocation.
327 size_t
328 reloc_insn_index(size_t i) const
330 gold_assert(i < this->relocs_.size());
331 return this->relocs_[i].first;
334 // Return the offset of the I-th instruction with relocation from the
335 // beginning of the stub.
336 section_size_type
337 reloc_offset(size_t i) const
339 gold_assert(i < this->relocs_.size());
340 return this->relocs_[i].second;
343 private:
344 // This contains information about an instruction template with a relocation
345 // and its offset from start of stub.
346 typedef std::pair<size_t, section_size_type> Reloc;
348 // A Stub_template may not be copied. We want to share templates as much
349 // as possible.
350 Stub_template(const Stub_template&);
351 Stub_template& operator=(const Stub_template&);
353 // Stub type.
354 Stub_type type_;
355 // Points to an array of Insn_templates.
356 const Insn_template* insns_;
357 // Number of Insn_templates in insns_[].
358 size_t insn_count_;
359 // Size of templated instructions in bytes.
360 size_t size_;
361 // Alignment of templated instructions.
362 unsigned alignment_;
363 // Flag to indicate if entry is in thumb mode.
364 bool entry_in_thumb_mode_;
365 // A table of reloc instruction indices and offsets. We can find these by
366 // looking at the instruction templates but we pre-compute and then stash
367 // them here for speed.
368 std::vector<Reloc> relocs_;
372 // A class for code stubs. This is a base class for different type of
373 // stubs used in the ARM target.
376 class Stub
378 private:
379 static const section_offset_type invalid_offset =
380 static_cast<section_offset_type>(-1);
382 public:
383 Stub(const Stub_template* stub_template)
384 : stub_template_(stub_template), offset_(invalid_offset)
387 virtual
388 ~Stub()
391 // Return the stub template.
392 const Stub_template*
393 stub_template() const
394 { return this->stub_template_; }
396 // Return offset of code stub from beginning of its containing stub table.
397 section_offset_type
398 offset() const
400 gold_assert(this->offset_ != invalid_offset);
401 return this->offset_;
404 // Set offset of code stub from beginning of its containing stub table.
405 void
406 set_offset(section_offset_type offset)
407 { this->offset_ = offset; }
409 // Return the relocation target address of the i-th relocation in the
410 // stub. This must be defined in a child class.
411 Arm_address
412 reloc_target(size_t i)
413 { return this->do_reloc_target(i); }
415 // Write a stub at output VIEW. BIG_ENDIAN select how a stub is written.
416 void
417 write(unsigned char* view, section_size_type view_size, bool big_endian)
418 { this->do_write(view, view_size, big_endian); }
420 // Return the instruction for THUMB16_SPECIAL_TYPE instruction template
421 // for the i-th instruction.
422 uint16_t
423 thumb16_special(size_t i)
424 { return this->do_thumb16_special(i); }
426 protected:
427 // This must be defined in the child class.
428 virtual Arm_address
429 do_reloc_target(size_t) = 0;
431 // This may be overridden in the child class.
432 virtual void
433 do_write(unsigned char* view, section_size_type view_size, bool big_endian)
435 if (big_endian)
436 this->do_fixed_endian_write<true>(view, view_size);
437 else
438 this->do_fixed_endian_write<false>(view, view_size);
441 // This must be overridden if a child class uses the THUMB16_SPECIAL_TYPE
442 // instruction template.
443 virtual uint16_t
444 do_thumb16_special(size_t)
445 { gold_unreachable(); }
447 private:
448 // A template to implement do_write.
449 template<bool big_endian>
450 void inline
451 do_fixed_endian_write(unsigned char*, section_size_type);
453 // Its template.
454 const Stub_template* stub_template_;
455 // Offset within the section of containing this stub.
456 section_offset_type offset_;
459 // Reloc stub class. These are stubs we use to fix up relocation because
460 // of limited branch ranges.
462 class Reloc_stub : public Stub
464 public:
465 static const unsigned int invalid_index = static_cast<unsigned int>(-1);
466 // We assume we never jump to this address.
467 static const Arm_address invalid_address = static_cast<Arm_address>(-1);
469 // Return destination address.
470 Arm_address
471 destination_address() const
473 gold_assert(this->destination_address_ != this->invalid_address);
474 return this->destination_address_;
477 // Set destination address.
478 void
479 set_destination_address(Arm_address address)
481 gold_assert(address != this->invalid_address);
482 this->destination_address_ = address;
485 // Reset destination address.
486 void
487 reset_destination_address()
488 { this->destination_address_ = this->invalid_address; }
490 // Determine stub type for a branch of a relocation of R_TYPE going
491 // from BRANCH_ADDRESS to BRANCH_TARGET. If TARGET_IS_THUMB is set,
492 // the branch target is a thumb instruction. TARGET is used for look
493 // up ARM-specific linker settings.
494 static Stub_type
495 stub_type_for_reloc(unsigned int r_type, Arm_address branch_address,
496 Arm_address branch_target, bool target_is_thumb);
498 // Reloc_stub key. A key is logically a triplet of a stub type, a symbol
499 // and an addend. Since we treat global and local symbol differently, we
500 // use a Symbol object for a global symbol and a object-index pair for
501 // a local symbol.
502 class Key
504 public:
505 // If SYMBOL is not null, this is a global symbol, we ignore RELOBJ and
506 // R_SYM. Otherwise, this is a local symbol and RELOBJ must non-NULL
507 // and R_SYM must not be invalid_index.
508 Key(Stub_type stub_type, const Symbol* symbol, const Relobj* relobj,
509 unsigned int r_sym, int32_t addend)
510 : stub_type_(stub_type), addend_(addend)
512 if (symbol != NULL)
514 this->r_sym_ = Reloc_stub::invalid_index;
515 this->u_.symbol = symbol;
517 else
519 gold_assert(relobj != NULL && r_sym != invalid_index);
520 this->r_sym_ = r_sym;
521 this->u_.relobj = relobj;
525 ~Key()
528 // Accessors: Keys are meant to be read-only object so no modifiers are
529 // provided.
531 // Return stub type.
532 Stub_type
533 stub_type() const
534 { return this->stub_type_; }
536 // Return the local symbol index or invalid_index.
537 unsigned int
538 r_sym() const
539 { return this->r_sym_; }
541 // Return the symbol if there is one.
542 const Symbol*
543 symbol() const
544 { return this->r_sym_ == invalid_index ? this->u_.symbol : NULL; }
546 // Return the relobj if there is one.
547 const Relobj*
548 relobj() const
549 { return this->r_sym_ != invalid_index ? this->u_.relobj : NULL; }
551 // Whether this equals to another key k.
552 bool
553 eq(const Key& k) const
555 return ((this->stub_type_ == k.stub_type_)
556 && (this->r_sym_ == k.r_sym_)
557 && ((this->r_sym_ != Reloc_stub::invalid_index)
558 ? (this->u_.relobj == k.u_.relobj)
559 : (this->u_.symbol == k.u_.symbol))
560 && (this->addend_ == k.addend_));
563 // Return a hash value.
564 size_t
565 hash_value() const
567 return (this->stub_type_
568 ^ this->r_sym_
569 ^ gold::string_hash<char>(
570 (this->r_sym_ != Reloc_stub::invalid_index)
571 ? this->u_.relobj->name().c_str()
572 : this->u_.symbol->name())
573 ^ this->addend_);
576 // Functors for STL associative containers.
577 struct hash
579 size_t
580 operator()(const Key& k) const
581 { return k.hash_value(); }
584 struct equal_to
586 bool
587 operator()(const Key& k1, const Key& k2) const
588 { return k1.eq(k2); }
591 // Name of key. This is mainly for debugging.
592 std::string
593 name() const;
595 private:
596 // Stub type.
597 Stub_type stub_type_;
598 // If this is a local symbol, this is the index in the defining object.
599 // Otherwise, it is invalid_index for a global symbol.
600 unsigned int r_sym_;
601 // If r_sym_ is invalid index. This points to a global symbol.
602 // Otherwise, this points a relobj. We used the unsized and target
603 // independent Symbol and Relobj classes instead of Sized_symbol<32> and
604 // Arm_relobj. This is done to avoid making the stub class a template
605 // as most of the stub machinery is endianity-neutral. However, it
606 // may require a bit of casting done by users of this class.
607 union
609 const Symbol* symbol;
610 const Relobj* relobj;
611 } u_;
612 // Addend associated with a reloc.
613 int32_t addend_;
616 protected:
617 // Reloc_stubs are created via a stub factory. So these are protected.
618 Reloc_stub(const Stub_template* stub_template)
619 : Stub(stub_template), destination_address_(invalid_address)
622 ~Reloc_stub()
625 friend class Stub_factory;
627 // Return the relocation target address of the i-th relocation in the
628 // stub.
629 Arm_address
630 do_reloc_target(size_t i)
632 // All reloc stub have only one relocation.
633 gold_assert(i == 0);
634 return this->destination_address_;
637 private:
638 // Address of destination.
639 Arm_address destination_address_;
642 // Cortex-A8 stub class. We need a Cortex-A8 stub to redirect any 32-bit
643 // THUMB branch that meets the following conditions:
645 // 1. The branch straddles across a page boundary. i.e. lower 12-bit of
646 // branch address is 0xffe.
647 // 2. The branch target address is in the same page as the first word of the
648 // branch.
649 // 3. The branch follows a 32-bit instruction which is not a branch.
651 // To do the fix up, we need to store the address of the branch instruction
652 // and its target at least. We also need to store the original branch
653 // instruction bits for the condition code in a conditional branch. The
654 // condition code is used in a special instruction template. We also want
655 // to identify input sections needing Cortex-A8 workaround quickly. We store
656 // extra information about object and section index of the code section
657 // containing a branch being fixed up. The information is used to mark
658 // the code section when we finalize the Cortex-A8 stubs.
661 class Cortex_a8_stub : public Stub
663 public:
664 ~Cortex_a8_stub()
667 // Return the object of the code section containing the branch being fixed
668 // up.
669 Relobj*
670 relobj() const
671 { return this->relobj_; }
673 // Return the section index of the code section containing the branch being
674 // fixed up.
675 unsigned int
676 shndx() const
677 { return this->shndx_; }
679 // Return the source address of stub. This is the address of the original
680 // branch instruction. LSB is 1 always set to indicate that it is a THUMB
681 // instruction.
682 Arm_address
683 source_address() const
684 { return this->source_address_; }
686 // Return the destination address of the stub. This is the branch taken
687 // address of the original branch instruction. LSB is 1 if it is a THUMB
688 // instruction address.
689 Arm_address
690 destination_address() const
691 { return this->destination_address_; }
693 // Return the instruction being fixed up.
694 uint32_t
695 original_insn() const
696 { return this->original_insn_; }
698 protected:
699 // Cortex_a8_stubs are created via a stub factory. So these are protected.
700 Cortex_a8_stub(const Stub_template* stub_template, Relobj* relobj,
701 unsigned int shndx, Arm_address source_address,
702 Arm_address destination_address, uint32_t original_insn)
703 : Stub(stub_template), relobj_(relobj), shndx_(shndx),
704 source_address_(source_address | 1U),
705 destination_address_(destination_address),
706 original_insn_(original_insn)
709 friend class Stub_factory;
711 // Return the relocation target address of the i-th relocation in the
712 // stub.
713 Arm_address
714 do_reloc_target(size_t i)
716 if (this->stub_template()->type() == arm_stub_a8_veneer_b_cond)
718 // The conditional branch veneer has two relocations.
719 gold_assert(i < 2);
720 return i == 0 ? this->source_address_ + 4 : this->destination_address_;
722 else
724 // All other Cortex-A8 stubs have only one relocation.
725 gold_assert(i == 0);
726 return this->destination_address_;
730 // Return an instruction for the THUMB16_SPECIAL_TYPE instruction template.
731 uint16_t
732 do_thumb16_special(size_t);
734 private:
735 // Object of the code section containing the branch being fixed up.
736 Relobj* relobj_;
737 // Section index of the code section containing the branch begin fixed up.
738 unsigned int shndx_;
739 // Source address of original branch.
740 Arm_address source_address_;
741 // Destination address of the original branch.
742 Arm_address destination_address_;
743 // Original branch instruction. This is needed for copying the condition
744 // code from a condition branch to its stub.
745 uint32_t original_insn_;
748 // ARMv4 BX Rx branch relocation stub class.
749 class Arm_v4bx_stub : public Stub
751 public:
752 ~Arm_v4bx_stub()
755 // Return the associated register.
756 uint32_t
757 reg() const
758 { return this->reg_; }
760 protected:
761 // Arm V4BX stubs are created via a stub factory. So these are protected.
762 Arm_v4bx_stub(const Stub_template* stub_template, const uint32_t reg)
763 : Stub(stub_template), reg_(reg)
766 friend class Stub_factory;
768 // Return the relocation target address of the i-th relocation in the
769 // stub.
770 Arm_address
771 do_reloc_target(size_t)
772 { gold_unreachable(); }
774 // This may be overridden in the child class.
775 virtual void
776 do_write(unsigned char* view, section_size_type view_size, bool big_endian)
778 if (big_endian)
779 this->do_fixed_endian_v4bx_write<true>(view, view_size);
780 else
781 this->do_fixed_endian_v4bx_write<false>(view, view_size);
784 private:
785 // A template to implement do_write.
786 template<bool big_endian>
787 void inline
788 do_fixed_endian_v4bx_write(unsigned char* view, section_size_type)
790 const Insn_template* insns = this->stub_template()->insns();
791 elfcpp::Swap<32, big_endian>::writeval(view,
792 (insns[0].data()
793 + (this->reg_ << 16)));
794 view += insns[0].size();
795 elfcpp::Swap<32, big_endian>::writeval(view,
796 (insns[1].data() + this->reg_));
797 view += insns[1].size();
798 elfcpp::Swap<32, big_endian>::writeval(view,
799 (insns[2].data() + this->reg_));
802 // A register index (r0-r14), which is associated with the stub.
803 uint32_t reg_;
806 // Stub factory class.
808 class Stub_factory
810 public:
811 // Return the unique instance of this class.
812 static const Stub_factory&
813 get_instance()
815 static Stub_factory singleton;
816 return singleton;
819 // Make a relocation stub.
820 Reloc_stub*
821 make_reloc_stub(Stub_type stub_type) const
823 gold_assert(stub_type >= arm_stub_reloc_first
824 && stub_type <= arm_stub_reloc_last);
825 return new Reloc_stub(this->stub_templates_[stub_type]);
828 // Make a Cortex-A8 stub.
829 Cortex_a8_stub*
830 make_cortex_a8_stub(Stub_type stub_type, Relobj* relobj, unsigned int shndx,
831 Arm_address source, Arm_address destination,
832 uint32_t original_insn) const
834 gold_assert(stub_type >= arm_stub_cortex_a8_first
835 && stub_type <= arm_stub_cortex_a8_last);
836 return new Cortex_a8_stub(this->stub_templates_[stub_type], relobj, shndx,
837 source, destination, original_insn);
840 // Make an ARM V4BX relocation stub.
841 // This method creates a stub from the arm_stub_v4_veneer_bx template only.
842 Arm_v4bx_stub*
843 make_arm_v4bx_stub(uint32_t reg) const
845 gold_assert(reg < 0xf);
846 return new Arm_v4bx_stub(this->stub_templates_[arm_stub_v4_veneer_bx],
847 reg);
850 private:
851 // Constructor and destructor are protected since we only return a single
852 // instance created in Stub_factory::get_instance().
854 Stub_factory();
856 // A Stub_factory may not be copied since it is a singleton.
857 Stub_factory(const Stub_factory&);
858 Stub_factory& operator=(Stub_factory&);
860 // Stub templates. These are initialized in the constructor.
861 const Stub_template* stub_templates_[arm_stub_type_last+1];
864 // A class to hold stubs for the ARM target.
866 template<bool big_endian>
867 class Stub_table : public Output_data
869 public:
870 Stub_table(Arm_input_section<big_endian>* owner)
871 : Output_data(), owner_(owner), reloc_stubs_(), reloc_stubs_size_(0),
872 reloc_stubs_addralign_(1), cortex_a8_stubs_(), arm_v4bx_stubs_(0xf),
873 prev_data_size_(0), prev_addralign_(1)
876 ~Stub_table()
879 // Owner of this stub table.
880 Arm_input_section<big_endian>*
881 owner() const
882 { return this->owner_; }
884 // Whether this stub table is empty.
885 bool
886 empty() const
888 return (this->reloc_stubs_.empty()
889 && this->cortex_a8_stubs_.empty()
890 && this->arm_v4bx_stubs_.empty());
893 // Return the current data size.
894 off_t
895 current_data_size() const
896 { return this->current_data_size_for_child(); }
898 // Add a STUB with using KEY. Caller is reponsible for avoid adding
899 // if already a STUB with the same key has been added.
900 void
901 add_reloc_stub(Reloc_stub* stub, const Reloc_stub::Key& key)
903 const Stub_template* stub_template = stub->stub_template();
904 gold_assert(stub_template->type() == key.stub_type());
905 this->reloc_stubs_[key] = stub;
907 // Assign stub offset early. We can do this because we never remove
908 // reloc stubs and they are in the beginning of the stub table.
909 uint64_t align = stub_template->alignment();
910 this->reloc_stubs_size_ = align_address(this->reloc_stubs_size_, align);
911 stub->set_offset(this->reloc_stubs_size_);
912 this->reloc_stubs_size_ += stub_template->size();
913 this->reloc_stubs_addralign_ =
914 std::max(this->reloc_stubs_addralign_, align);
917 // Add a Cortex-A8 STUB that fixes up a THUMB branch at ADDRESS.
918 // Caller is reponsible for avoid adding if already a STUB with the same
919 // address has been added.
920 void
921 add_cortex_a8_stub(Arm_address address, Cortex_a8_stub* stub)
923 std::pair<Arm_address, Cortex_a8_stub*> value(address, stub);
924 this->cortex_a8_stubs_.insert(value);
927 // Add an ARM V4BX relocation stub. A register index will be retrieved
928 // from the stub.
929 void
930 add_arm_v4bx_stub(Arm_v4bx_stub* stub)
932 gold_assert(stub != NULL && this->arm_v4bx_stubs_[stub->reg()] == NULL);
933 this->arm_v4bx_stubs_[stub->reg()] = stub;
936 // Remove all Cortex-A8 stubs.
937 void
938 remove_all_cortex_a8_stubs();
940 // Look up a relocation stub using KEY. Return NULL if there is none.
941 Reloc_stub*
942 find_reloc_stub(const Reloc_stub::Key& key) const
944 typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.find(key);
945 return (p != this->reloc_stubs_.end()) ? p->second : NULL;
948 // Look up an arm v4bx relocation stub using the register index.
949 // Return NULL if there is none.
950 Arm_v4bx_stub*
951 find_arm_v4bx_stub(const uint32_t reg) const
953 gold_assert(reg < 0xf);
954 return this->arm_v4bx_stubs_[reg];
957 // Relocate stubs in this stub table.
958 void
959 relocate_stubs(const Relocate_info<32, big_endian>*,
960 Target_arm<big_endian>*, Output_section*,
961 unsigned char*, Arm_address, section_size_type);
963 // Update data size and alignment at the end of a relaxation pass. Return
964 // true if either data size or alignment is different from that of the
965 // previous relaxation pass.
966 bool
967 update_data_size_and_addralign();
969 // Finalize stubs. Set the offsets of all stubs and mark input sections
970 // needing the Cortex-A8 workaround.
971 void
972 finalize_stubs();
974 // Apply Cortex-A8 workaround to an address range.
975 void
976 apply_cortex_a8_workaround_to_address_range(Target_arm<big_endian>*,
977 unsigned char*, Arm_address,
978 section_size_type);
980 protected:
981 // Write out section contents.
982 void
983 do_write(Output_file*);
985 // Return the required alignment.
986 uint64_t
987 do_addralign() const
988 { return this->prev_addralign_; }
990 // Reset address and file offset.
991 void
992 do_reset_address_and_file_offset()
993 { this->set_current_data_size_for_child(this->prev_data_size_); }
995 // Set final data size.
996 void
997 set_final_data_size()
998 { this->set_data_size(this->current_data_size()); }
1000 private:
1001 // Relocate one stub.
1002 void
1003 relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
1004 Target_arm<big_endian>*, Output_section*,
1005 unsigned char*, Arm_address, section_size_type);
1007 // Unordered map of relocation stubs.
1008 typedef
1009 Unordered_map<Reloc_stub::Key, Reloc_stub*, Reloc_stub::Key::hash,
1010 Reloc_stub::Key::equal_to>
1011 Reloc_stub_map;
1013 // List of Cortex-A8 stubs ordered by addresses of branches being
1014 // fixed up in output.
1015 typedef std::map<Arm_address, Cortex_a8_stub*> Cortex_a8_stub_list;
1016 // List of Arm V4BX relocation stubs ordered by associated registers.
1017 typedef std::vector<Arm_v4bx_stub*> Arm_v4bx_stub_list;
1019 // Owner of this stub table.
1020 Arm_input_section<big_endian>* owner_;
1021 // The relocation stubs.
1022 Reloc_stub_map reloc_stubs_;
1023 // Size of reloc stubs.
1024 off_t reloc_stubs_size_;
1025 // Maximum address alignment of reloc stubs.
1026 uint64_t reloc_stubs_addralign_;
1027 // The cortex_a8_stubs.
1028 Cortex_a8_stub_list cortex_a8_stubs_;
1029 // The Arm V4BX relocation stubs.
1030 Arm_v4bx_stub_list arm_v4bx_stubs_;
1031 // data size of this in the previous pass.
1032 off_t prev_data_size_;
1033 // address alignment of this in the previous pass.
1034 uint64_t prev_addralign_;
1037 // Arm_exidx_cantunwind class. This represents an EXIDX_CANTUNWIND entry
1038 // we add to the end of an EXIDX input section that goes into the output.
1040 class Arm_exidx_cantunwind : public Output_section_data
1042 public:
1043 Arm_exidx_cantunwind(Relobj* relobj, unsigned int shndx)
1044 : Output_section_data(8, 4, true), relobj_(relobj), shndx_(shndx)
1047 // Return the object containing the section pointed by this.
1048 Relobj*
1049 relobj() const
1050 { return this->relobj_; }
1052 // Return the section index of the section pointed by this.
1053 unsigned int
1054 shndx() const
1055 { return this->shndx_; }
1057 protected:
1058 void
1059 do_write(Output_file* of)
1061 if (parameters->target().is_big_endian())
1062 this->do_fixed_endian_write<true>(of);
1063 else
1064 this->do_fixed_endian_write<false>(of);
1067 private:
1068 // Implement do_write for a given endianity.
1069 template<bool big_endian>
1070 void inline
1071 do_fixed_endian_write(Output_file*);
1073 // The object containing the section pointed by this.
1074 Relobj* relobj_;
1075 // The section index of the section pointed by this.
1076 unsigned int shndx_;
1079 // During EXIDX coverage fix-up, we compact an EXIDX section. The
1080 // Offset map is used to map input section offset within the EXIDX section
1081 // to the output offset from the start of this EXIDX section.
1083 typedef std::map<section_offset_type, section_offset_type>
1084 Arm_exidx_section_offset_map;
1086 // Arm_exidx_merged_section class. This represents an EXIDX input section
1087 // with some of its entries merged.
1089 class Arm_exidx_merged_section : public Output_relaxed_input_section
1091 public:
1092 // Constructor for Arm_exidx_merged_section.
1093 // EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
1094 // SECTION_OFFSET_MAP points to a section offset map describing how
1095 // parts of the input section are mapped to output. DELETED_BYTES is
1096 // the number of bytes deleted from the EXIDX input section.
1097 Arm_exidx_merged_section(
1098 const Arm_exidx_input_section& exidx_input_section,
1099 const Arm_exidx_section_offset_map& section_offset_map,
1100 uint32_t deleted_bytes);
1102 // Return the original EXIDX input section.
1103 const Arm_exidx_input_section&
1104 exidx_input_section() const
1105 { return this->exidx_input_section_; }
1107 // Return the section offset map.
1108 const Arm_exidx_section_offset_map&
1109 section_offset_map() const
1110 { return this->section_offset_map_; }
1112 protected:
1113 // Write merged section into file OF.
1114 void
1115 do_write(Output_file* of);
1117 bool
1118 do_output_offset(const Relobj*, unsigned int, section_offset_type,
1119 section_offset_type*) const;
1121 private:
1122 // Original EXIDX input section.
1123 const Arm_exidx_input_section& exidx_input_section_;
1124 // Section offset map.
1125 const Arm_exidx_section_offset_map& section_offset_map_;
1128 // A class to wrap an ordinary input section containing executable code.
1130 template<bool big_endian>
1131 class Arm_input_section : public Output_relaxed_input_section
1133 public:
1134 Arm_input_section(Relobj* relobj, unsigned int shndx)
1135 : Output_relaxed_input_section(relobj, shndx, 1),
1136 original_addralign_(1), original_size_(0), stub_table_(NULL)
1139 ~Arm_input_section()
1142 // Initialize.
1143 void
1144 init();
1146 // Whether this is a stub table owner.
1147 bool
1148 is_stub_table_owner() const
1149 { return this->stub_table_ != NULL && this->stub_table_->owner() == this; }
1151 // Return the stub table.
1152 Stub_table<big_endian>*
1153 stub_table() const
1154 { return this->stub_table_; }
1156 // Set the stub_table.
1157 void
1158 set_stub_table(Stub_table<big_endian>* stub_table)
1159 { this->stub_table_ = stub_table; }
1161 // Downcast a base pointer to an Arm_input_section pointer. This is
1162 // not type-safe but we only use Arm_input_section not the base class.
1163 static Arm_input_section<big_endian>*
1164 as_arm_input_section(Output_relaxed_input_section* poris)
1165 { return static_cast<Arm_input_section<big_endian>*>(poris); }
1167 protected:
1168 // Write data to output file.
1169 void
1170 do_write(Output_file*);
1172 // Return required alignment of this.
1173 uint64_t
1174 do_addralign() const
1176 if (this->is_stub_table_owner())
1177 return std::max(this->stub_table_->addralign(),
1178 this->original_addralign_);
1179 else
1180 return this->original_addralign_;
1183 // Finalize data size.
1184 void
1185 set_final_data_size();
1187 // Reset address and file offset.
1188 void
1189 do_reset_address_and_file_offset();
1191 // Output offset.
1192 bool
1193 do_output_offset(const Relobj* object, unsigned int shndx,
1194 section_offset_type offset,
1195 section_offset_type* poutput) const
1197 if ((object == this->relobj())
1198 && (shndx == this->shndx())
1199 && (offset >= 0)
1200 && (convert_types<uint64_t, section_offset_type>(offset)
1201 <= this->original_size_))
1203 *poutput = offset;
1204 return true;
1206 else
1207 return false;
1210 private:
1211 // Copying is not allowed.
1212 Arm_input_section(const Arm_input_section&);
1213 Arm_input_section& operator=(const Arm_input_section&);
1215 // Address alignment of the original input section.
1216 uint64_t original_addralign_;
1217 // Section size of the original input section.
1218 uint64_t original_size_;
1219 // Stub table.
1220 Stub_table<big_endian>* stub_table_;
1223 // Arm_exidx_fixup class. This is used to define a number of methods
1224 // and keep states for fixing up EXIDX coverage.
1226 class Arm_exidx_fixup
1228 public:
1229 Arm_exidx_fixup(Output_section* exidx_output_section)
1230 : exidx_output_section_(exidx_output_section), last_unwind_type_(UT_NONE),
1231 last_inlined_entry_(0), last_input_section_(NULL),
1232 section_offset_map_(NULL), first_output_text_section_(NULL)
1235 ~Arm_exidx_fixup()
1236 { delete this->section_offset_map_; }
1238 // Process an EXIDX section for entry merging. Return number of bytes to
1239 // be deleted in output. If parts of the input EXIDX section are merged
1240 // a heap allocated Arm_exidx_section_offset_map is store in the located
1241 // PSECTION_OFFSET_MAP. The caller owns the map and is reponsible for
1242 // releasing it.
1243 template<bool big_endian>
1244 uint32_t
1245 process_exidx_section(const Arm_exidx_input_section* exidx_input_section,
1246 Arm_exidx_section_offset_map** psection_offset_map);
1248 // Append an EXIDX_CANTUNWIND entry pointing at the end of the last
1249 // input section, if there is not one already.
1250 void
1251 add_exidx_cantunwind_as_needed();
1253 // Return the output section for the text section which is linked to the
1254 // first exidx input in output.
1255 Output_section*
1256 first_output_text_section() const
1257 { return this->first_output_text_section_; }
1259 private:
1260 // Copying is not allowed.
1261 Arm_exidx_fixup(const Arm_exidx_fixup&);
1262 Arm_exidx_fixup& operator=(const Arm_exidx_fixup&);
1264 // Type of EXIDX unwind entry.
1265 enum Unwind_type
1267 // No type.
1268 UT_NONE,
1269 // EXIDX_CANTUNWIND.
1270 UT_EXIDX_CANTUNWIND,
1271 // Inlined entry.
1272 UT_INLINED_ENTRY,
1273 // Normal entry.
1274 UT_NORMAL_ENTRY,
1277 // Process an EXIDX entry. We only care about the second word of the
1278 // entry. Return true if the entry can be deleted.
1279 bool
1280 process_exidx_entry(uint32_t second_word);
1282 // Update the current section offset map during EXIDX section fix-up.
1283 // If there is no map, create one. INPUT_OFFSET is the offset of a
1284 // reference point, DELETED_BYTES is the number of deleted by in the
1285 // section so far. If DELETE_ENTRY is true, the reference point and
1286 // all offsets after the previous reference point are discarded.
1287 void
1288 update_offset_map(section_offset_type input_offset,
1289 section_size_type deleted_bytes, bool delete_entry);
1291 // EXIDX output section.
1292 Output_section* exidx_output_section_;
1293 // Unwind type of the last EXIDX entry processed.
1294 Unwind_type last_unwind_type_;
1295 // Last seen inlined EXIDX entry.
1296 uint32_t last_inlined_entry_;
1297 // Last processed EXIDX input section.
1298 const Arm_exidx_input_section* last_input_section_;
1299 // Section offset map created in process_exidx_section.
1300 Arm_exidx_section_offset_map* section_offset_map_;
1301 // Output section for the text section which is linked to the first exidx
1302 // input in output.
1303 Output_section* first_output_text_section_;
1306 // Arm output section class. This is defined mainly to add a number of
1307 // stub generation methods.
1309 template<bool big_endian>
1310 class Arm_output_section : public Output_section
1312 public:
1313 typedef std::vector<std::pair<Relobj*, unsigned int> > Text_section_list;
1315 Arm_output_section(const char* name, elfcpp::Elf_Word type,
1316 elfcpp::Elf_Xword flags)
1317 : Output_section(name, type, flags)
1320 ~Arm_output_section()
1323 // Group input sections for stub generation.
1324 void
1325 group_sections(section_size_type, bool, Target_arm<big_endian>*);
1327 // Downcast a base pointer to an Arm_output_section pointer. This is
1328 // not type-safe but we only use Arm_output_section not the base class.
1329 static Arm_output_section<big_endian>*
1330 as_arm_output_section(Output_section* os)
1331 { return static_cast<Arm_output_section<big_endian>*>(os); }
1333 // Append all input text sections in this into LIST.
1334 void
1335 append_text_sections_to_list(Text_section_list* list);
1337 // Fix EXIDX coverage of this EXIDX output section. SORTED_TEXT_SECTION
1338 // is a list of text input sections sorted in ascending order of their
1339 // output addresses.
1340 void
1341 fix_exidx_coverage(Layout* layout,
1342 const Text_section_list& sorted_text_section,
1343 Symbol_table* symtab);
1345 private:
1346 // For convenience.
1347 typedef Output_section::Input_section Input_section;
1348 typedef Output_section::Input_section_list Input_section_list;
1350 // Create a stub group.
1351 void create_stub_group(Input_section_list::const_iterator,
1352 Input_section_list::const_iterator,
1353 Input_section_list::const_iterator,
1354 Target_arm<big_endian>*,
1355 std::vector<Output_relaxed_input_section*>*);
1358 // Arm_exidx_input_section class. This represents an EXIDX input section.
1360 class Arm_exidx_input_section
1362 public:
1363 static const section_offset_type invalid_offset =
1364 static_cast<section_offset_type>(-1);
1366 Arm_exidx_input_section(Relobj* relobj, unsigned int shndx,
1367 unsigned int link, uint32_t size, uint32_t addralign)
1368 : relobj_(relobj), shndx_(shndx), link_(link), size_(size),
1369 addralign_(addralign)
1372 ~Arm_exidx_input_section()
1375 // Accessors: This is a read-only class.
1377 // Return the object containing this EXIDX input section.
1378 Relobj*
1379 relobj() const
1380 { return this->relobj_; }
1382 // Return the section index of this EXIDX input section.
1383 unsigned int
1384 shndx() const
1385 { return this->shndx_; }
1387 // Return the section index of linked text section in the same object.
1388 unsigned int
1389 link() const
1390 { return this->link_; }
1392 // Return size of the EXIDX input section.
1393 uint32_t
1394 size() const
1395 { return this->size_; }
1397 // Reutnr address alignment of EXIDX input section.
1398 uint32_t
1399 addralign() const
1400 { return this->addralign_; }
1402 private:
1403 // Object containing this.
1404 Relobj* relobj_;
1405 // Section index of this.
1406 unsigned int shndx_;
1407 // text section linked to this in the same object.
1408 unsigned int link_;
1409 // Size of this. For ARM 32-bit is sufficient.
1410 uint32_t size_;
1411 // Address alignment of this. For ARM 32-bit is sufficient.
1412 uint32_t addralign_;
1415 // Arm_relobj class.
1417 template<bool big_endian>
1418 class Arm_relobj : public Sized_relobj<32, big_endian>
1420 public:
1421 static const Arm_address invalid_address = static_cast<Arm_address>(-1);
1423 Arm_relobj(const std::string& name, Input_file* input_file, off_t offset,
1424 const typename elfcpp::Ehdr<32, big_endian>& ehdr)
1425 : Sized_relobj<32, big_endian>(name, input_file, offset, ehdr),
1426 stub_tables_(), local_symbol_is_thumb_function_(),
1427 attributes_section_data_(NULL), mapping_symbols_info_(),
1428 section_has_cortex_a8_workaround_(NULL), exidx_section_map_(),
1429 output_local_symbol_count_needs_update_(false)
1432 ~Arm_relobj()
1433 { delete this->attributes_section_data_; }
1435 // Return the stub table of the SHNDX-th section if there is one.
1436 Stub_table<big_endian>*
1437 stub_table(unsigned int shndx) const
1439 gold_assert(shndx < this->stub_tables_.size());
1440 return this->stub_tables_[shndx];
1443 // Set STUB_TABLE to be the stub_table of the SHNDX-th section.
1444 void
1445 set_stub_table(unsigned int shndx, Stub_table<big_endian>* stub_table)
1447 gold_assert(shndx < this->stub_tables_.size());
1448 this->stub_tables_[shndx] = stub_table;
1451 // Whether a local symbol is a THUMB function. R_SYM is the symbol table
1452 // index. This is only valid after do_count_local_symbol is called.
1453 bool
1454 local_symbol_is_thumb_function(unsigned int r_sym) const
1456 gold_assert(r_sym < this->local_symbol_is_thumb_function_.size());
1457 return this->local_symbol_is_thumb_function_[r_sym];
1460 // Scan all relocation sections for stub generation.
1461 void
1462 scan_sections_for_stubs(Target_arm<big_endian>*, const Symbol_table*,
1463 const Layout*);
1465 // Convert regular input section with index SHNDX to a relaxed section.
1466 void
1467 convert_input_section_to_relaxed_section(unsigned shndx)
1469 // The stubs have relocations and we need to process them after writing
1470 // out the stubs. So relocation now must follow section write.
1471 this->set_section_offset(shndx, -1ULL);
1472 this->set_relocs_must_follow_section_writes();
1475 // Downcast a base pointer to an Arm_relobj pointer. This is
1476 // not type-safe but we only use Arm_relobj not the base class.
1477 static Arm_relobj<big_endian>*
1478 as_arm_relobj(Relobj* relobj)
1479 { return static_cast<Arm_relobj<big_endian>*>(relobj); }
1481 // Processor-specific flags in ELF file header. This is valid only after
1482 // reading symbols.
1483 elfcpp::Elf_Word
1484 processor_specific_flags() const
1485 { return this->processor_specific_flags_; }
1487 // Attribute section data This is the contents of the .ARM.attribute section
1488 // if there is one.
1489 const Attributes_section_data*
1490 attributes_section_data() const
1491 { return this->attributes_section_data_; }
1493 // Mapping symbol location.
1494 typedef std::pair<unsigned int, Arm_address> Mapping_symbol_position;
1496 // Functor for STL container.
1497 struct Mapping_symbol_position_less
1499 bool
1500 operator()(const Mapping_symbol_position& p1,
1501 const Mapping_symbol_position& p2) const
1503 return (p1.first < p2.first
1504 || (p1.first == p2.first && p1.second < p2.second));
1508 // We only care about the first character of a mapping symbol, so
1509 // we only store that instead of the whole symbol name.
1510 typedef std::map<Mapping_symbol_position, char,
1511 Mapping_symbol_position_less> Mapping_symbols_info;
1513 // Whether a section contains any Cortex-A8 workaround.
1514 bool
1515 section_has_cortex_a8_workaround(unsigned int shndx) const
1517 return (this->section_has_cortex_a8_workaround_ != NULL
1518 && (*this->section_has_cortex_a8_workaround_)[shndx]);
1521 // Mark a section that has Cortex-A8 workaround.
1522 void
1523 mark_section_for_cortex_a8_workaround(unsigned int shndx)
1525 if (this->section_has_cortex_a8_workaround_ == NULL)
1526 this->section_has_cortex_a8_workaround_ =
1527 new std::vector<bool>(this->shnum(), false);
1528 (*this->section_has_cortex_a8_workaround_)[shndx] = true;
1531 // Return the EXIDX section of an text section with index SHNDX or NULL
1532 // if the text section has no associated EXIDX section.
1533 const Arm_exidx_input_section*
1534 exidx_input_section_by_link(unsigned int shndx) const
1536 Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1537 return ((p != this->exidx_section_map_.end()
1538 && p->second->link() == shndx)
1539 ? p->second
1540 : NULL);
1543 // Return the EXIDX section with index SHNDX or NULL if there is none.
1544 const Arm_exidx_input_section*
1545 exidx_input_section_by_shndx(unsigned shndx) const
1547 Exidx_section_map::const_iterator p = this->exidx_section_map_.find(shndx);
1548 return ((p != this->exidx_section_map_.end()
1549 && p->second->shndx() == shndx)
1550 ? p->second
1551 : NULL);
1554 // Whether output local symbol count needs updating.
1555 bool
1556 output_local_symbol_count_needs_update() const
1557 { return this->output_local_symbol_count_needs_update_; }
1559 // Set output_local_symbol_count_needs_update flag to be true.
1560 void
1561 set_output_local_symbol_count_needs_update()
1562 { this->output_local_symbol_count_needs_update_ = true; }
1564 // Update output local symbol count at the end of relaxation.
1565 void
1566 update_output_local_symbol_count();
1568 protected:
1569 // Post constructor setup.
1570 void
1571 do_setup()
1573 // Call parent's setup method.
1574 Sized_relobj<32, big_endian>::do_setup();
1576 // Initialize look-up tables.
1577 Stub_table_list empty_stub_table_list(this->shnum(), NULL);
1578 this->stub_tables_.swap(empty_stub_table_list);
1581 // Count the local symbols.
1582 void
1583 do_count_local_symbols(Stringpool_template<char>*,
1584 Stringpool_template<char>*);
1586 void
1587 do_relocate_sections(const Symbol_table* symtab, const Layout* layout,
1588 const unsigned char* pshdrs,
1589 typename Sized_relobj<32, big_endian>::Views* pivews);
1591 // Read the symbol information.
1592 void
1593 do_read_symbols(Read_symbols_data* sd);
1595 // Process relocs for garbage collection.
1596 void
1597 do_gc_process_relocs(Symbol_table*, Layout*, Read_relocs_data*);
1599 private:
1601 // Whether a section needs to be scanned for relocation stubs.
1602 bool
1603 section_needs_reloc_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1604 const Relobj::Output_sections&,
1605 const Symbol_table *, const unsigned char*);
1607 // Whether a section is a scannable text section.
1608 bool
1609 section_is_scannable(const elfcpp::Shdr<32, big_endian>&, unsigned int,
1610 const Output_section*, const Symbol_table *);
1612 // Whether a section needs to be scanned for the Cortex-A8 erratum.
1613 bool
1614 section_needs_cortex_a8_stub_scanning(const elfcpp::Shdr<32, big_endian>&,
1615 unsigned int, Output_section*,
1616 const Symbol_table *);
1618 // Scan a section for the Cortex-A8 erratum.
1619 void
1620 scan_section_for_cortex_a8_erratum(const elfcpp::Shdr<32, big_endian>&,
1621 unsigned int, Output_section*,
1622 Target_arm<big_endian>*);
1624 // Find the linked text section of an EXIDX section by looking at the
1625 // first reloction of the EXIDX section. PSHDR points to the section
1626 // headers of a relocation section and PSYMS points to the local symbols.
1627 // PSHNDX points to a location storing the text section index if found.
1628 // Return whether we can find the linked section.
1629 bool
1630 find_linked_text_section(const unsigned char* pshdr,
1631 const unsigned char* psyms, unsigned int* pshndx);
1634 // Make a new Arm_exidx_input_section object for EXIDX section with
1635 // index SHNDX and section header SHDR. TEXT_SHNDX is the section
1636 // index of the linked text section.
1637 void
1638 make_exidx_input_section(unsigned int shndx,
1639 const elfcpp::Shdr<32, big_endian>& shdr,
1640 unsigned int text_shndx);
1642 // Return the output address of either a plain input section or a
1643 // relaxed input section. SHNDX is the section index.
1644 Arm_address
1645 simple_input_section_output_address(unsigned int, Output_section*);
1647 typedef std::vector<Stub_table<big_endian>*> Stub_table_list;
1648 typedef Unordered_map<unsigned int, const Arm_exidx_input_section*>
1649 Exidx_section_map;
1651 // List of stub tables.
1652 Stub_table_list stub_tables_;
1653 // Bit vector to tell if a local symbol is a thumb function or not.
1654 // This is only valid after do_count_local_symbol is called.
1655 std::vector<bool> local_symbol_is_thumb_function_;
1656 // processor-specific flags in ELF file header.
1657 elfcpp::Elf_Word processor_specific_flags_;
1658 // Object attributes if there is an .ARM.attributes section or NULL.
1659 Attributes_section_data* attributes_section_data_;
1660 // Mapping symbols information.
1661 Mapping_symbols_info mapping_symbols_info_;
1662 // Bitmap to indicate sections with Cortex-A8 workaround or NULL.
1663 std::vector<bool>* section_has_cortex_a8_workaround_;
1664 // Map a text section to its associated .ARM.exidx section, if there is one.
1665 Exidx_section_map exidx_section_map_;
1666 // Whether output local symbol count needs updating.
1667 bool output_local_symbol_count_needs_update_;
1670 // Arm_dynobj class.
1672 template<bool big_endian>
1673 class Arm_dynobj : public Sized_dynobj<32, big_endian>
1675 public:
1676 Arm_dynobj(const std::string& name, Input_file* input_file, off_t offset,
1677 const elfcpp::Ehdr<32, big_endian>& ehdr)
1678 : Sized_dynobj<32, big_endian>(name, input_file, offset, ehdr),
1679 processor_specific_flags_(0), attributes_section_data_(NULL)
1682 ~Arm_dynobj()
1683 { delete this->attributes_section_data_; }
1685 // Downcast a base pointer to an Arm_relobj pointer. This is
1686 // not type-safe but we only use Arm_relobj not the base class.
1687 static Arm_dynobj<big_endian>*
1688 as_arm_dynobj(Dynobj* dynobj)
1689 { return static_cast<Arm_dynobj<big_endian>*>(dynobj); }
1691 // Processor-specific flags in ELF file header. This is valid only after
1692 // reading symbols.
1693 elfcpp::Elf_Word
1694 processor_specific_flags() const
1695 { return this->processor_specific_flags_; }
1697 // Attributes section data.
1698 const Attributes_section_data*
1699 attributes_section_data() const
1700 { return this->attributes_section_data_; }
1702 protected:
1703 // Read the symbol information.
1704 void
1705 do_read_symbols(Read_symbols_data* sd);
1707 private:
1708 // processor-specific flags in ELF file header.
1709 elfcpp::Elf_Word processor_specific_flags_;
1710 // Object attributes if there is an .ARM.attributes section or NULL.
1711 Attributes_section_data* attributes_section_data_;
1714 // Functor to read reloc addends during stub generation.
1716 template<int sh_type, bool big_endian>
1717 struct Stub_addend_reader
1719 // Return the addend for a relocation of a particular type. Depending
1720 // on whether this is a REL or RELA relocation, read the addend from a
1721 // view or from a Reloc object.
1722 elfcpp::Elf_types<32>::Elf_Swxword
1723 operator()(
1724 unsigned int /* r_type */,
1725 const unsigned char* /* view */,
1726 const typename Reloc_types<sh_type,
1727 32, big_endian>::Reloc& /* reloc */) const;
1730 // Specialized Stub_addend_reader for SHT_REL type relocation sections.
1732 template<bool big_endian>
1733 struct Stub_addend_reader<elfcpp::SHT_REL, big_endian>
1735 elfcpp::Elf_types<32>::Elf_Swxword
1736 operator()(
1737 unsigned int,
1738 const unsigned char*,
1739 const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const;
1742 // Specialized Stub_addend_reader for RELA type relocation sections.
1743 // We currently do not handle RELA type relocation sections but it is trivial
1744 // to implement the addend reader. This is provided for completeness and to
1745 // make it easier to add support for RELA relocation sections in the future.
1747 template<bool big_endian>
1748 struct Stub_addend_reader<elfcpp::SHT_RELA, big_endian>
1750 elfcpp::Elf_types<32>::Elf_Swxword
1751 operator()(
1752 unsigned int,
1753 const unsigned char*,
1754 const typename Reloc_types<elfcpp::SHT_RELA, 32,
1755 big_endian>::Reloc& reloc) const
1756 { return reloc.get_r_addend(); }
1759 // Cortex_a8_reloc class. We keep record of relocation that may need
1760 // the Cortex-A8 erratum workaround.
1762 class Cortex_a8_reloc
1764 public:
1765 Cortex_a8_reloc(Reloc_stub* reloc_stub, unsigned r_type,
1766 Arm_address destination)
1767 : reloc_stub_(reloc_stub), r_type_(r_type), destination_(destination)
1770 ~Cortex_a8_reloc()
1773 // Accessors: This is a read-only class.
1775 // Return the relocation stub associated with this relocation if there is
1776 // one.
1777 const Reloc_stub*
1778 reloc_stub() const
1779 { return this->reloc_stub_; }
1781 // Return the relocation type.
1782 unsigned int
1783 r_type() const
1784 { return this->r_type_; }
1786 // Return the destination address of the relocation. LSB stores the THUMB
1787 // bit.
1788 Arm_address
1789 destination() const
1790 { return this->destination_; }
1792 private:
1793 // Associated relocation stub if there is one, or NULL.
1794 const Reloc_stub* reloc_stub_;
1795 // Relocation type.
1796 unsigned int r_type_;
1797 // Destination address of this relocation. LSB is used to distinguish
1798 // ARM/THUMB mode.
1799 Arm_address destination_;
1802 // Arm_output_data_got class. We derive this from Output_data_got to add
1803 // extra methods to handle TLS relocations in a static link.
1805 template<bool big_endian>
1806 class Arm_output_data_got : public Output_data_got<32, big_endian>
1808 public:
1809 Arm_output_data_got(Symbol_table* symtab, Layout* layout)
1810 : Output_data_got<32, big_endian>(), symbol_table_(symtab), layout_(layout)
1813 // Add a static entry for the GOT entry at OFFSET. GSYM is a global
1814 // symbol and R_TYPE is the code of a dynamic relocation that needs to be
1815 // applied in a static link.
1816 void
1817 add_static_reloc(unsigned int got_offset, unsigned int r_type, Symbol* gsym)
1818 { this->static_relocs_.push_back(Static_reloc(got_offset, r_type, gsym)); }
1820 // Add a static reloc for the GOT entry at OFFSET. RELOBJ is an object
1821 // defining a local symbol with INDEX. R_TYPE is the code of a dynamic
1822 // relocation that needs to be applied in a static link.
1823 void
1824 add_static_reloc(unsigned int got_offset, unsigned int r_type,
1825 Sized_relobj<32, big_endian>* relobj, unsigned int index)
1827 this->static_relocs_.push_back(Static_reloc(got_offset, r_type, relobj,
1828 index));
1831 // Add a GOT pair for R_ARM_TLS_GD32. The creates a pair of GOT entries.
1832 // The first one is initialized to be 1, which is the module index for
1833 // the main executable and the second one 0. A reloc of the type
1834 // R_ARM_TLS_DTPOFF32 will be created for the second GOT entry and will
1835 // be applied by gold. GSYM is a global symbol.
1836 void
1837 add_tls_gd32_with_static_reloc(unsigned int got_type, Symbol* gsym);
1839 // Same as the above but for a local symbol in OBJECT with INDEX.
1840 void
1841 add_tls_gd32_with_static_reloc(unsigned int got_type,
1842 Sized_relobj<32, big_endian>* object,
1843 unsigned int index);
1845 protected:
1846 // Write out the GOT table.
1847 void
1848 do_write(Output_file*);
1850 private:
1851 // This class represent dynamic relocations that need to be applied by
1852 // gold because we are using TLS relocations in a static link.
1853 class Static_reloc
1855 public:
1856 Static_reloc(unsigned int got_offset, unsigned int r_type, Symbol* gsym)
1857 : got_offset_(got_offset), r_type_(r_type), symbol_is_global_(true)
1858 { this->u_.global.symbol = gsym; }
1860 Static_reloc(unsigned int got_offset, unsigned int r_type,
1861 Sized_relobj<32, big_endian>* relobj, unsigned int index)
1862 : got_offset_(got_offset), r_type_(r_type), symbol_is_global_(false)
1864 this->u_.local.relobj = relobj;
1865 this->u_.local.index = index;
1868 // Return the GOT offset.
1869 unsigned int
1870 got_offset() const
1871 { return this->got_offset_; }
1873 // Relocation type.
1874 unsigned int
1875 r_type() const
1876 { return this->r_type_; }
1878 // Whether the symbol is global or not.
1879 bool
1880 symbol_is_global() const
1881 { return this->symbol_is_global_; }
1883 // For a relocation against a global symbol, the global symbol.
1884 Symbol*
1885 symbol() const
1887 gold_assert(this->symbol_is_global_);
1888 return this->u_.global.symbol;
1891 // For a relocation against a local symbol, the defining object.
1892 Sized_relobj<32, big_endian>*
1893 relobj() const
1895 gold_assert(!this->symbol_is_global_);
1896 return this->u_.local.relobj;
1899 // For a relocation against a local symbol, the local symbol index.
1900 unsigned int
1901 index() const
1903 gold_assert(!this->symbol_is_global_);
1904 return this->u_.local.index;
1907 private:
1908 // GOT offset of the entry to which this relocation is applied.
1909 unsigned int got_offset_;
1910 // Type of relocation.
1911 unsigned int r_type_;
1912 // Whether this relocation is against a global symbol.
1913 bool symbol_is_global_;
1914 // A global or local symbol.
1915 union
1917 struct
1919 // For a global symbol, the symbol itself.
1920 Symbol* symbol;
1921 } global;
1922 struct
1924 // For a local symbol, the object defining object.
1925 Sized_relobj<32, big_endian>* relobj;
1926 // For a local symbol, the symbol index.
1927 unsigned int index;
1928 } local;
1929 } u_;
1932 // Symbol table of the output object.
1933 Symbol_table* symbol_table_;
1934 // Layout of the output object.
1935 Layout* layout_;
1936 // Static relocs to be applied to the GOT.
1937 std::vector<Static_reloc> static_relocs_;
1940 // Utilities for manipulating integers of up to 32-bits
1942 namespace utils
1944 // Sign extend an n-bit unsigned integer stored in an uint32_t into
1945 // an int32_t. NO_BITS must be between 1 to 32.
1946 template<int no_bits>
1947 static inline int32_t
1948 sign_extend(uint32_t bits)
1950 gold_assert(no_bits >= 0 && no_bits <= 32);
1951 if (no_bits == 32)
1952 return static_cast<int32_t>(bits);
1953 uint32_t mask = (~((uint32_t) 0)) >> (32 - no_bits);
1954 bits &= mask;
1955 uint32_t top_bit = 1U << (no_bits - 1);
1956 int32_t as_signed = static_cast<int32_t>(bits);
1957 return (bits & top_bit) ? as_signed + (-top_bit * 2) : as_signed;
1960 // Detects overflow of an NO_BITS integer stored in a uint32_t.
1961 template<int no_bits>
1962 static inline bool
1963 has_overflow(uint32_t bits)
1965 gold_assert(no_bits >= 0 && no_bits <= 32);
1966 if (no_bits == 32)
1967 return false;
1968 int32_t max = (1 << (no_bits - 1)) - 1;
1969 int32_t min = -(1 << (no_bits - 1));
1970 int32_t as_signed = static_cast<int32_t>(bits);
1971 return as_signed > max || as_signed < min;
1974 // Detects overflow of an NO_BITS integer stored in a uint32_t when it
1975 // fits in the given number of bits as either a signed or unsigned value.
1976 // For example, has_signed_unsigned_overflow<8> would check
1977 // -128 <= bits <= 255
1978 template<int no_bits>
1979 static inline bool
1980 has_signed_unsigned_overflow(uint32_t bits)
1982 gold_assert(no_bits >= 2 && no_bits <= 32);
1983 if (no_bits == 32)
1984 return false;
1985 int32_t max = static_cast<int32_t>((1U << no_bits) - 1);
1986 int32_t min = -(1 << (no_bits - 1));
1987 int32_t as_signed = static_cast<int32_t>(bits);
1988 return as_signed > max || as_signed < min;
1991 // Select bits from A and B using bits in MASK. For each n in [0..31],
1992 // the n-th bit in the result is chosen from the n-th bits of A and B.
1993 // A zero selects A and a one selects B.
1994 static inline uint32_t
1995 bit_select(uint32_t a, uint32_t b, uint32_t mask)
1996 { return (a & ~mask) | (b & mask); }
1999 template<bool big_endian>
2000 class Target_arm : public Sized_target<32, big_endian>
2002 public:
2003 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
2004 Reloc_section;
2006 // When were are relocating a stub, we pass this as the relocation number.
2007 static const size_t fake_relnum_for_stubs = static_cast<size_t>(-1);
2009 Target_arm()
2010 : Sized_target<32, big_endian>(&arm_info),
2011 got_(NULL), plt_(NULL), got_plt_(NULL), rel_dyn_(NULL),
2012 copy_relocs_(elfcpp::R_ARM_COPY), dynbss_(NULL),
2013 got_mod_index_offset_(-1U), tls_base_symbol_defined_(false),
2014 stub_tables_(), stub_factory_(Stub_factory::get_instance()),
2015 may_use_blx_(false), should_force_pic_veneer_(false),
2016 arm_input_section_map_(), attributes_section_data_(NULL),
2017 fix_cortex_a8_(false), cortex_a8_relocs_info_()
2020 // Whether we can use BLX.
2021 bool
2022 may_use_blx() const
2023 { return this->may_use_blx_; }
2025 // Set use-BLX flag.
2026 void
2027 set_may_use_blx(bool value)
2028 { this->may_use_blx_ = value; }
2030 // Whether we force PCI branch veneers.
2031 bool
2032 should_force_pic_veneer() const
2033 { return this->should_force_pic_veneer_; }
2035 // Set PIC veneer flag.
2036 void
2037 set_should_force_pic_veneer(bool value)
2038 { this->should_force_pic_veneer_ = value; }
2040 // Whether we use THUMB-2 instructions.
2041 bool
2042 using_thumb2() const
2044 Object_attribute* attr =
2045 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2046 int arch = attr->int_value();
2047 return arch == elfcpp::TAG_CPU_ARCH_V6T2 || arch >= elfcpp::TAG_CPU_ARCH_V7;
2050 // Whether we use THUMB/THUMB-2 instructions only.
2051 bool
2052 using_thumb_only() const
2054 Object_attribute* attr =
2055 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2057 if (attr->int_value() == elfcpp::TAG_CPU_ARCH_V6_M
2058 || attr->int_value() == elfcpp::TAG_CPU_ARCH_V6S_M)
2059 return true;
2060 if (attr->int_value() != elfcpp::TAG_CPU_ARCH_V7
2061 && attr->int_value() != elfcpp::TAG_CPU_ARCH_V7E_M)
2062 return false;
2063 attr = this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
2064 return attr->int_value() == 'M';
2067 // Whether we have an NOP instruction. If not, use mov r0, r0 instead.
2068 bool
2069 may_use_arm_nop() const
2071 Object_attribute* attr =
2072 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2073 int arch = attr->int_value();
2074 return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2075 || arch == elfcpp::TAG_CPU_ARCH_V6K
2076 || arch == elfcpp::TAG_CPU_ARCH_V7
2077 || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
2080 // Whether we have THUMB-2 NOP.W instruction.
2081 bool
2082 may_use_thumb2_nop() const
2084 Object_attribute* attr =
2085 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
2086 int arch = attr->int_value();
2087 return (arch == elfcpp::TAG_CPU_ARCH_V6T2
2088 || arch == elfcpp::TAG_CPU_ARCH_V7
2089 || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
2092 // Process the relocations to determine unreferenced sections for
2093 // garbage collection.
2094 void
2095 gc_process_relocs(Symbol_table* symtab,
2096 Layout* layout,
2097 Sized_relobj<32, big_endian>* object,
2098 unsigned int data_shndx,
2099 unsigned int sh_type,
2100 const unsigned char* prelocs,
2101 size_t reloc_count,
2102 Output_section* output_section,
2103 bool needs_special_offset_handling,
2104 size_t local_symbol_count,
2105 const unsigned char* plocal_symbols);
2107 // Scan the relocations to look for symbol adjustments.
2108 void
2109 scan_relocs(Symbol_table* symtab,
2110 Layout* layout,
2111 Sized_relobj<32, big_endian>* object,
2112 unsigned int data_shndx,
2113 unsigned int sh_type,
2114 const unsigned char* prelocs,
2115 size_t reloc_count,
2116 Output_section* output_section,
2117 bool needs_special_offset_handling,
2118 size_t local_symbol_count,
2119 const unsigned char* plocal_symbols);
2121 // Finalize the sections.
2122 void
2123 do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
2125 // Return the value to use for a dynamic symbol which requires special
2126 // treatment.
2127 uint64_t
2128 do_dynsym_value(const Symbol*) const;
2130 // Relocate a section.
2131 void
2132 relocate_section(const Relocate_info<32, big_endian>*,
2133 unsigned int sh_type,
2134 const unsigned char* prelocs,
2135 size_t reloc_count,
2136 Output_section* output_section,
2137 bool needs_special_offset_handling,
2138 unsigned char* view,
2139 Arm_address view_address,
2140 section_size_type view_size,
2141 const Reloc_symbol_changes*);
2143 // Scan the relocs during a relocatable link.
2144 void
2145 scan_relocatable_relocs(Symbol_table* symtab,
2146 Layout* layout,
2147 Sized_relobj<32, big_endian>* object,
2148 unsigned int data_shndx,
2149 unsigned int sh_type,
2150 const unsigned char* prelocs,
2151 size_t reloc_count,
2152 Output_section* output_section,
2153 bool needs_special_offset_handling,
2154 size_t local_symbol_count,
2155 const unsigned char* plocal_symbols,
2156 Relocatable_relocs*);
2158 // Relocate a section during a relocatable link.
2159 void
2160 relocate_for_relocatable(const Relocate_info<32, big_endian>*,
2161 unsigned int sh_type,
2162 const unsigned char* prelocs,
2163 size_t reloc_count,
2164 Output_section* output_section,
2165 off_t offset_in_output_section,
2166 const Relocatable_relocs*,
2167 unsigned char* view,
2168 Arm_address view_address,
2169 section_size_type view_size,
2170 unsigned char* reloc_view,
2171 section_size_type reloc_view_size);
2173 // Return whether SYM is defined by the ABI.
2174 bool
2175 do_is_defined_by_abi(Symbol* sym) const
2176 { return strcmp(sym->name(), "__tls_get_addr") == 0; }
2178 // Return whether there is a GOT section.
2179 bool
2180 has_got_section() const
2181 { return this->got_ != NULL; }
2183 // Return the size of the GOT section.
2184 section_size_type
2185 got_size()
2187 gold_assert(this->got_ != NULL);
2188 return this->got_->data_size();
2191 // Map platform-specific reloc types
2192 static unsigned int
2193 get_real_reloc_type (unsigned int r_type);
2196 // Methods to support stub-generations.
2199 // Return the stub factory
2200 const Stub_factory&
2201 stub_factory() const
2202 { return this->stub_factory_; }
2204 // Make a new Arm_input_section object.
2205 Arm_input_section<big_endian>*
2206 new_arm_input_section(Relobj*, unsigned int);
2208 // Find the Arm_input_section object corresponding to the SHNDX-th input
2209 // section of RELOBJ.
2210 Arm_input_section<big_endian>*
2211 find_arm_input_section(Relobj* relobj, unsigned int shndx) const;
2213 // Make a new Stub_table
2214 Stub_table<big_endian>*
2215 new_stub_table(Arm_input_section<big_endian>*);
2217 // Scan a section for stub generation.
2218 void
2219 scan_section_for_stubs(const Relocate_info<32, big_endian>*, unsigned int,
2220 const unsigned char*, size_t, Output_section*,
2221 bool, const unsigned char*, Arm_address,
2222 section_size_type);
2224 // Relocate a stub.
2225 void
2226 relocate_stub(Stub*, const Relocate_info<32, big_endian>*,
2227 Output_section*, unsigned char*, Arm_address,
2228 section_size_type);
2230 // Get the default ARM target.
2231 static Target_arm<big_endian>*
2232 default_target()
2234 gold_assert(parameters->target().machine_code() == elfcpp::EM_ARM
2235 && parameters->target().is_big_endian() == big_endian);
2236 return static_cast<Target_arm<big_endian>*>(
2237 parameters->sized_target<32, big_endian>());
2240 // Whether NAME belongs to a mapping symbol.
2241 static bool
2242 is_mapping_symbol_name(const char* name)
2244 return (name
2245 && name[0] == '$'
2246 && (name[1] == 'a' || name[1] == 't' || name[1] == 'd')
2247 && (name[2] == '\0' || name[2] == '.'));
2250 // Whether we work around the Cortex-A8 erratum.
2251 bool
2252 fix_cortex_a8() const
2253 { return this->fix_cortex_a8_; }
2255 // Whether we fix R_ARM_V4BX relocation.
2256 // 0 - do not fix
2257 // 1 - replace with MOV instruction (armv4 target)
2258 // 2 - make interworking veneer (>= armv4t targets only)
2259 General_options::Fix_v4bx
2260 fix_v4bx() const
2261 { return parameters->options().fix_v4bx(); }
2263 // Scan a span of THUMB code section for Cortex-A8 erratum.
2264 void
2265 scan_span_for_cortex_a8_erratum(Arm_relobj<big_endian>*, unsigned int,
2266 section_size_type, section_size_type,
2267 const unsigned char*, Arm_address);
2269 // Apply Cortex-A8 workaround to a branch.
2270 void
2271 apply_cortex_a8_workaround(const Cortex_a8_stub*, Arm_address,
2272 unsigned char*, Arm_address);
2274 protected:
2275 // Make an ELF object.
2276 Object*
2277 do_make_elf_object(const std::string&, Input_file*, off_t,
2278 const elfcpp::Ehdr<32, big_endian>& ehdr);
2280 Object*
2281 do_make_elf_object(const std::string&, Input_file*, off_t,
2282 const elfcpp::Ehdr<32, !big_endian>&)
2283 { gold_unreachable(); }
2285 Object*
2286 do_make_elf_object(const std::string&, Input_file*, off_t,
2287 const elfcpp::Ehdr<64, false>&)
2288 { gold_unreachable(); }
2290 Object*
2291 do_make_elf_object(const std::string&, Input_file*, off_t,
2292 const elfcpp::Ehdr<64, true>&)
2293 { gold_unreachable(); }
2295 // Make an output section.
2296 Output_section*
2297 do_make_output_section(const char* name, elfcpp::Elf_Word type,
2298 elfcpp::Elf_Xword flags)
2299 { return new Arm_output_section<big_endian>(name, type, flags); }
2301 void
2302 do_adjust_elf_header(unsigned char* view, int len) const;
2304 // We only need to generate stubs, and hence perform relaxation if we are
2305 // not doing relocatable linking.
2306 bool
2307 do_may_relax() const
2308 { return !parameters->options().relocatable(); }
2310 bool
2311 do_relax(int, const Input_objects*, Symbol_table*, Layout*);
2313 // Determine whether an object attribute tag takes an integer, a
2314 // string or both.
2316 do_attribute_arg_type(int tag) const;
2318 // Reorder tags during output.
2320 do_attributes_order(int num) const;
2322 // This is called when the target is selected as the default.
2323 void
2324 do_select_as_default_target()
2326 // No locking is required since there should only be one default target.
2327 // We cannot have both the big-endian and little-endian ARM targets
2328 // as the default.
2329 gold_assert(arm_reloc_property_table == NULL);
2330 arm_reloc_property_table = new Arm_reloc_property_table();
2333 private:
2334 // The class which scans relocations.
2335 class Scan
2337 public:
2338 Scan()
2339 : issued_non_pic_error_(false)
2342 inline void
2343 local(Symbol_table* symtab, Layout* layout, Target_arm* target,
2344 Sized_relobj<32, big_endian>* object,
2345 unsigned int data_shndx,
2346 Output_section* output_section,
2347 const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2348 const elfcpp::Sym<32, big_endian>& lsym);
2350 inline void
2351 global(Symbol_table* symtab, Layout* layout, Target_arm* target,
2352 Sized_relobj<32, big_endian>* object,
2353 unsigned int data_shndx,
2354 Output_section* output_section,
2355 const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
2356 Symbol* gsym);
2358 inline bool
2359 local_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2360 Sized_relobj<32, big_endian>* ,
2361 unsigned int ,
2362 Output_section* ,
2363 const elfcpp::Rel<32, big_endian>& ,
2364 unsigned int ,
2365 const elfcpp::Sym<32, big_endian>&)
2366 { return false; }
2368 inline bool
2369 global_reloc_may_be_function_pointer(Symbol_table* , Layout* , Target_arm* ,
2370 Sized_relobj<32, big_endian>* ,
2371 unsigned int ,
2372 Output_section* ,
2373 const elfcpp::Rel<32, big_endian>& ,
2374 unsigned int , Symbol*)
2375 { return false; }
2377 private:
2378 static void
2379 unsupported_reloc_local(Sized_relobj<32, big_endian>*,
2380 unsigned int r_type);
2382 static void
2383 unsupported_reloc_global(Sized_relobj<32, big_endian>*,
2384 unsigned int r_type, Symbol*);
2386 void
2387 check_non_pic(Relobj*, unsigned int r_type);
2389 // Almost identical to Symbol::needs_plt_entry except that it also
2390 // handles STT_ARM_TFUNC.
2391 static bool
2392 symbol_needs_plt_entry(const Symbol* sym)
2394 // An undefined symbol from an executable does not need a PLT entry.
2395 if (sym->is_undefined() && !parameters->options().shared())
2396 return false;
2398 return (!parameters->doing_static_link()
2399 && (sym->type() == elfcpp::STT_FUNC
2400 || sym->type() == elfcpp::STT_ARM_TFUNC)
2401 && (sym->is_from_dynobj()
2402 || sym->is_undefined()
2403 || sym->is_preemptible()));
2406 // Whether we have issued an error about a non-PIC compilation.
2407 bool issued_non_pic_error_;
2410 // The class which implements relocation.
2411 class Relocate
2413 public:
2414 Relocate()
2417 ~Relocate()
2420 // Return whether the static relocation needs to be applied.
2421 inline bool
2422 should_apply_static_reloc(const Sized_symbol<32>* gsym,
2423 int ref_flags,
2424 bool is_32bit,
2425 Output_section* output_section);
2427 // Do a relocation. Return false if the caller should not issue
2428 // any warnings about this relocation.
2429 inline bool
2430 relocate(const Relocate_info<32, big_endian>*, Target_arm*,
2431 Output_section*, size_t relnum,
2432 const elfcpp::Rel<32, big_endian>&,
2433 unsigned int r_type, const Sized_symbol<32>*,
2434 const Symbol_value<32>*,
2435 unsigned char*, Arm_address,
2436 section_size_type);
2438 // Return whether we want to pass flag NON_PIC_REF for this
2439 // reloc. This means the relocation type accesses a symbol not via
2440 // GOT or PLT.
2441 static inline bool
2442 reloc_is_non_pic (unsigned int r_type)
2444 switch (r_type)
2446 // These relocation types reference GOT or PLT entries explicitly.
2447 case elfcpp::R_ARM_GOT_BREL:
2448 case elfcpp::R_ARM_GOT_ABS:
2449 case elfcpp::R_ARM_GOT_PREL:
2450 case elfcpp::R_ARM_GOT_BREL12:
2451 case elfcpp::R_ARM_PLT32_ABS:
2452 case elfcpp::R_ARM_TLS_GD32:
2453 case elfcpp::R_ARM_TLS_LDM32:
2454 case elfcpp::R_ARM_TLS_IE32:
2455 case elfcpp::R_ARM_TLS_IE12GP:
2457 // These relocate types may use PLT entries.
2458 case elfcpp::R_ARM_CALL:
2459 case elfcpp::R_ARM_THM_CALL:
2460 case elfcpp::R_ARM_JUMP24:
2461 case elfcpp::R_ARM_THM_JUMP24:
2462 case elfcpp::R_ARM_THM_JUMP19:
2463 case elfcpp::R_ARM_PLT32:
2464 case elfcpp::R_ARM_THM_XPC22:
2465 case elfcpp::R_ARM_PREL31:
2466 case elfcpp::R_ARM_SBREL31:
2467 return false;
2469 default:
2470 return true;
2474 private:
2475 // Do a TLS relocation.
2476 inline typename Arm_relocate_functions<big_endian>::Status
2477 relocate_tls(const Relocate_info<32, big_endian>*, Target_arm<big_endian>*,
2478 size_t, const elfcpp::Rel<32, big_endian>&, unsigned int,
2479 const Sized_symbol<32>*, const Symbol_value<32>*,
2480 unsigned char*, elfcpp::Elf_types<32>::Elf_Addr,
2481 section_size_type);
2485 // A class which returns the size required for a relocation type,
2486 // used while scanning relocs during a relocatable link.
2487 class Relocatable_size_for_reloc
2489 public:
2490 unsigned int
2491 get_size_for_reloc(unsigned int, Relobj*);
2494 // Adjust TLS relocation type based on the options and whether this
2495 // is a local symbol.
2496 static tls::Tls_optimization
2497 optimize_tls_reloc(bool is_final, int r_type);
2499 // Get the GOT section, creating it if necessary.
2500 Arm_output_data_got<big_endian>*
2501 got_section(Symbol_table*, Layout*);
2503 // Get the GOT PLT section.
2504 Output_data_space*
2505 got_plt_section() const
2507 gold_assert(this->got_plt_ != NULL);
2508 return this->got_plt_;
2511 // Create a PLT entry for a global symbol.
2512 void
2513 make_plt_entry(Symbol_table*, Layout*, Symbol*);
2515 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
2516 void
2517 define_tls_base_symbol(Symbol_table*, Layout*);
2519 // Create a GOT entry for the TLS module index.
2520 unsigned int
2521 got_mod_index_entry(Symbol_table* symtab, Layout* layout,
2522 Sized_relobj<32, big_endian>* object);
2524 // Get the PLT section.
2525 const Output_data_plt_arm<big_endian>*
2526 plt_section() const
2528 gold_assert(this->plt_ != NULL);
2529 return this->plt_;
2532 // Get the dynamic reloc section, creating it if necessary.
2533 Reloc_section*
2534 rel_dyn_section(Layout*);
2536 // Get the section to use for TLS_DESC relocations.
2537 Reloc_section*
2538 rel_tls_desc_section(Layout*) const;
2540 // Return true if the symbol may need a COPY relocation.
2541 // References from an executable object to non-function symbols
2542 // defined in a dynamic object may need a COPY relocation.
2543 bool
2544 may_need_copy_reloc(Symbol* gsym)
2546 return (gsym->type() != elfcpp::STT_ARM_TFUNC
2547 && gsym->may_need_copy_reloc());
2550 // Add a potential copy relocation.
2551 void
2552 copy_reloc(Symbol_table* symtab, Layout* layout,
2553 Sized_relobj<32, big_endian>* object,
2554 unsigned int shndx, Output_section* output_section,
2555 Symbol* sym, const elfcpp::Rel<32, big_endian>& reloc)
2557 this->copy_relocs_.copy_reloc(symtab, layout,
2558 symtab->get_sized_symbol<32>(sym),
2559 object, shndx, output_section, reloc,
2560 this->rel_dyn_section(layout));
2563 // Whether two EABI versions are compatible.
2564 static bool
2565 are_eabi_versions_compatible(elfcpp::Elf_Word v1, elfcpp::Elf_Word v2);
2567 // Merge processor-specific flags from input object and those in the ELF
2568 // header of the output.
2569 void
2570 merge_processor_specific_flags(const std::string&, elfcpp::Elf_Word);
2572 // Get the secondary compatible architecture.
2573 static int
2574 get_secondary_compatible_arch(const Attributes_section_data*);
2576 // Set the secondary compatible architecture.
2577 static void
2578 set_secondary_compatible_arch(Attributes_section_data*, int);
2580 static int
2581 tag_cpu_arch_combine(const char*, int, int*, int, int);
2583 // Helper to print AEABI enum tag value.
2584 static std::string
2585 aeabi_enum_name(unsigned int);
2587 // Return string value for TAG_CPU_name.
2588 static std::string
2589 tag_cpu_name_value(unsigned int);
2591 // Merge object attributes from input object and those in the output.
2592 void
2593 merge_object_attributes(const char*, const Attributes_section_data*);
2595 // Helper to get an AEABI object attribute
2596 Object_attribute*
2597 get_aeabi_object_attribute(int tag) const
2599 Attributes_section_data* pasd = this->attributes_section_data_;
2600 gold_assert(pasd != NULL);
2601 Object_attribute* attr =
2602 pasd->get_attribute(Object_attribute::OBJ_ATTR_PROC, tag);
2603 gold_assert(attr != NULL);
2604 return attr;
2608 // Methods to support stub-generations.
2611 // Group input sections for stub generation.
2612 void
2613 group_sections(Layout*, section_size_type, bool);
2615 // Scan a relocation for stub generation.
2616 void
2617 scan_reloc_for_stub(const Relocate_info<32, big_endian>*, unsigned int,
2618 const Sized_symbol<32>*, unsigned int,
2619 const Symbol_value<32>*,
2620 elfcpp::Elf_types<32>::Elf_Swxword, Arm_address);
2622 // Scan a relocation section for stub.
2623 template<int sh_type>
2624 void
2625 scan_reloc_section_for_stubs(
2626 const Relocate_info<32, big_endian>* relinfo,
2627 const unsigned char* prelocs,
2628 size_t reloc_count,
2629 Output_section* output_section,
2630 bool needs_special_offset_handling,
2631 const unsigned char* view,
2632 elfcpp::Elf_types<32>::Elf_Addr view_address,
2633 section_size_type);
2635 // Fix .ARM.exidx section coverage.
2636 void
2637 fix_exidx_coverage(Layout*, Arm_output_section<big_endian>*, Symbol_table*);
2639 // Functors for STL set.
2640 struct output_section_address_less_than
2642 bool
2643 operator()(const Output_section* s1, const Output_section* s2) const
2644 { return s1->address() < s2->address(); }
2647 // Information about this specific target which we pass to the
2648 // general Target structure.
2649 static const Target::Target_info arm_info;
2651 // The types of GOT entries needed for this platform.
2652 enum Got_type
2654 GOT_TYPE_STANDARD = 0, // GOT entry for a regular symbol
2655 GOT_TYPE_TLS_NOFFSET = 1, // GOT entry for negative TLS offset
2656 GOT_TYPE_TLS_OFFSET = 2, // GOT entry for positive TLS offset
2657 GOT_TYPE_TLS_PAIR = 3, // GOT entry for TLS module/offset pair
2658 GOT_TYPE_TLS_DESC = 4 // GOT entry for TLS_DESC pair
2661 typedef typename std::vector<Stub_table<big_endian>*> Stub_table_list;
2663 // Map input section to Arm_input_section.
2664 typedef Unordered_map<Section_id,
2665 Arm_input_section<big_endian>*,
2666 Section_id_hash>
2667 Arm_input_section_map;
2669 // Map output addresses to relocs for Cortex-A8 erratum.
2670 typedef Unordered_map<Arm_address, const Cortex_a8_reloc*>
2671 Cortex_a8_relocs_info;
2673 // The GOT section.
2674 Arm_output_data_got<big_endian>* got_;
2675 // The PLT section.
2676 Output_data_plt_arm<big_endian>* plt_;
2677 // The GOT PLT section.
2678 Output_data_space* got_plt_;
2679 // The dynamic reloc section.
2680 Reloc_section* rel_dyn_;
2681 // Relocs saved to avoid a COPY reloc.
2682 Copy_relocs<elfcpp::SHT_REL, 32, big_endian> copy_relocs_;
2683 // Space for variables copied with a COPY reloc.
2684 Output_data_space* dynbss_;
2685 // Offset of the GOT entry for the TLS module index.
2686 unsigned int got_mod_index_offset_;
2687 // True if the _TLS_MODULE_BASE_ symbol has been defined.
2688 bool tls_base_symbol_defined_;
2689 // Vector of Stub_tables created.
2690 Stub_table_list stub_tables_;
2691 // Stub factory.
2692 const Stub_factory &stub_factory_;
2693 // Whether we can use BLX.
2694 bool may_use_blx_;
2695 // Whether we force PIC branch veneers.
2696 bool should_force_pic_veneer_;
2697 // Map for locating Arm_input_sections.
2698 Arm_input_section_map arm_input_section_map_;
2699 // Attributes section data in output.
2700 Attributes_section_data* attributes_section_data_;
2701 // Whether we want to fix code for Cortex-A8 erratum.
2702 bool fix_cortex_a8_;
2703 // Map addresses to relocs for Cortex-A8 erratum.
2704 Cortex_a8_relocs_info cortex_a8_relocs_info_;
2707 template<bool big_endian>
2708 const Target::Target_info Target_arm<big_endian>::arm_info =
2710 32, // size
2711 big_endian, // is_big_endian
2712 elfcpp::EM_ARM, // machine_code
2713 false, // has_make_symbol
2714 false, // has_resolve
2715 false, // has_code_fill
2716 true, // is_default_stack_executable
2717 '\0', // wrap_char
2718 "/usr/lib/libc.so.1", // dynamic_linker
2719 0x8000, // default_text_segment_address
2720 0x1000, // abi_pagesize (overridable by -z max-page-size)
2721 0x1000, // common_pagesize (overridable by -z common-page-size)
2722 elfcpp::SHN_UNDEF, // small_common_shndx
2723 elfcpp::SHN_UNDEF, // large_common_shndx
2724 0, // small_common_section_flags
2725 0, // large_common_section_flags
2726 ".ARM.attributes", // attributes_section
2727 "aeabi" // attributes_vendor
2730 // Arm relocate functions class
2733 template<bool big_endian>
2734 class Arm_relocate_functions : public Relocate_functions<32, big_endian>
2736 public:
2737 typedef enum
2739 STATUS_OKAY, // No error during relocation.
2740 STATUS_OVERFLOW, // Relocation oveflow.
2741 STATUS_BAD_RELOC // Relocation cannot be applied.
2742 } Status;
2744 private:
2745 typedef Relocate_functions<32, big_endian> Base;
2746 typedef Arm_relocate_functions<big_endian> This;
2748 // Encoding of imm16 argument for movt and movw ARM instructions
2749 // from ARM ARM:
2751 // imm16 := imm4 | imm12
2753 // 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
2754 // +-------+---------------+-------+-------+-----------------------+
2755 // | | |imm4 | |imm12 |
2756 // +-------+---------------+-------+-------+-----------------------+
2758 // Extract the relocation addend from VAL based on the ARM
2759 // instruction encoding described above.
2760 static inline typename elfcpp::Swap<32, big_endian>::Valtype
2761 extract_arm_movw_movt_addend(
2762 typename elfcpp::Swap<32, big_endian>::Valtype val)
2764 // According to the Elf ABI for ARM Architecture the immediate
2765 // field is sign-extended to form the addend.
2766 return utils::sign_extend<16>(((val >> 4) & 0xf000) | (val & 0xfff));
2769 // Insert X into VAL based on the ARM instruction encoding described
2770 // above.
2771 static inline typename elfcpp::Swap<32, big_endian>::Valtype
2772 insert_val_arm_movw_movt(
2773 typename elfcpp::Swap<32, big_endian>::Valtype val,
2774 typename elfcpp::Swap<32, big_endian>::Valtype x)
2776 val &= 0xfff0f000;
2777 val |= x & 0x0fff;
2778 val |= (x & 0xf000) << 4;
2779 return val;
2782 // Encoding of imm16 argument for movt and movw Thumb2 instructions
2783 // from ARM ARM:
2785 // imm16 := imm4 | i | imm3 | imm8
2787 // 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
2788 // +---------+-+-----------+-------++-+-----+-------+---------------+
2789 // | |i| |imm4 || |imm3 | |imm8 |
2790 // +---------+-+-----------+-------++-+-----+-------+---------------+
2792 // Extract the relocation addend from VAL based on the Thumb2
2793 // instruction encoding described above.
2794 static inline typename elfcpp::Swap<32, big_endian>::Valtype
2795 extract_thumb_movw_movt_addend(
2796 typename elfcpp::Swap<32, big_endian>::Valtype val)
2798 // According to the Elf ABI for ARM Architecture the immediate
2799 // field is sign-extended to form the addend.
2800 return utils::sign_extend<16>(((val >> 4) & 0xf000)
2801 | ((val >> 15) & 0x0800)
2802 | ((val >> 4) & 0x0700)
2803 | (val & 0x00ff));
2806 // Insert X into VAL based on the Thumb2 instruction encoding
2807 // described above.
2808 static inline typename elfcpp::Swap<32, big_endian>::Valtype
2809 insert_val_thumb_movw_movt(
2810 typename elfcpp::Swap<32, big_endian>::Valtype val,
2811 typename elfcpp::Swap<32, big_endian>::Valtype x)
2813 val &= 0xfbf08f00;
2814 val |= (x & 0xf000) << 4;
2815 val |= (x & 0x0800) << 15;
2816 val |= (x & 0x0700) << 4;
2817 val |= (x & 0x00ff);
2818 return val;
2821 // Calculate the smallest constant Kn for the specified residual.
2822 // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
2823 static uint32_t
2824 calc_grp_kn(typename elfcpp::Swap<32, big_endian>::Valtype residual)
2826 int32_t msb;
2828 if (residual == 0)
2829 return 0;
2830 // Determine the most significant bit in the residual and
2831 // align the resulting value to a 2-bit boundary.
2832 for (msb = 30; (msb >= 0) && !(residual & (3 << msb)); msb -= 2)
2834 // The desired shift is now (msb - 6), or zero, whichever
2835 // is the greater.
2836 return (((msb - 6) < 0) ? 0 : (msb - 6));
2839 // Calculate the final residual for the specified group index.
2840 // If the passed group index is less than zero, the method will return
2841 // the value of the specified residual without any change.
2842 // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
2843 static typename elfcpp::Swap<32, big_endian>::Valtype
2844 calc_grp_residual(typename elfcpp::Swap<32, big_endian>::Valtype residual,
2845 const int group)
2847 for (int n = 0; n <= group; n++)
2849 // Calculate which part of the value to mask.
2850 uint32_t shift = calc_grp_kn(residual);
2851 // Calculate the residual for the next time around.
2852 residual &= ~(residual & (0xff << shift));
2855 return residual;
2858 // Calculate the value of Gn for the specified group index.
2859 // We return it in the form of an encoded constant-and-rotation.
2860 // (see (AAELF 4.6.1.4 Static ARM relocations, Group Relocations, p.32)
2861 static typename elfcpp::Swap<32, big_endian>::Valtype
2862 calc_grp_gn(typename elfcpp::Swap<32, big_endian>::Valtype residual,
2863 const int group)
2865 typename elfcpp::Swap<32, big_endian>::Valtype gn = 0;
2866 uint32_t shift = 0;
2868 for (int n = 0; n <= group; n++)
2870 // Calculate which part of the value to mask.
2871 shift = calc_grp_kn(residual);
2872 // Calculate Gn in 32-bit as well as encoded constant-and-rotation form.
2873 gn = residual & (0xff << shift);
2874 // Calculate the residual for the next time around.
2875 residual &= ~gn;
2877 // Return Gn in the form of an encoded constant-and-rotation.
2878 return ((gn >> shift) | ((gn <= 0xff ? 0 : (32 - shift) / 2) << 8));
2881 public:
2882 // Handle ARM long branches.
2883 static typename This::Status
2884 arm_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
2885 unsigned char *, const Sized_symbol<32>*,
2886 const Arm_relobj<big_endian>*, unsigned int,
2887 const Symbol_value<32>*, Arm_address, Arm_address, bool);
2889 // Handle THUMB long branches.
2890 static typename This::Status
2891 thumb_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
2892 unsigned char *, const Sized_symbol<32>*,
2893 const Arm_relobj<big_endian>*, unsigned int,
2894 const Symbol_value<32>*, Arm_address, Arm_address, bool);
2897 // Return the branch offset of a 32-bit THUMB branch.
2898 static inline int32_t
2899 thumb32_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
2901 // We use the Thumb-2 encoding (backwards compatible with Thumb-1)
2902 // involving the J1 and J2 bits.
2903 uint32_t s = (upper_insn & (1U << 10)) >> 10;
2904 uint32_t upper = upper_insn & 0x3ffU;
2905 uint32_t lower = lower_insn & 0x7ffU;
2906 uint32_t j1 = (lower_insn & (1U << 13)) >> 13;
2907 uint32_t j2 = (lower_insn & (1U << 11)) >> 11;
2908 uint32_t i1 = j1 ^ s ? 0 : 1;
2909 uint32_t i2 = j2 ^ s ? 0 : 1;
2911 return utils::sign_extend<25>((s << 24) | (i1 << 23) | (i2 << 22)
2912 | (upper << 12) | (lower << 1));
2915 // Insert OFFSET to a 32-bit THUMB branch and return the upper instruction.
2916 // UPPER_INSN is the original upper instruction of the branch. Caller is
2917 // responsible for overflow checking and BLX offset adjustment.
2918 static inline uint16_t
2919 thumb32_branch_upper(uint16_t upper_insn, int32_t offset)
2921 uint32_t s = offset < 0 ? 1 : 0;
2922 uint32_t bits = static_cast<uint32_t>(offset);
2923 return (upper_insn & ~0x7ffU) | ((bits >> 12) & 0x3ffU) | (s << 10);
2926 // Insert OFFSET to a 32-bit THUMB branch and return the lower instruction.
2927 // LOWER_INSN is the original lower instruction of the branch. Caller is
2928 // responsible for overflow checking and BLX offset adjustment.
2929 static inline uint16_t
2930 thumb32_branch_lower(uint16_t lower_insn, int32_t offset)
2932 uint32_t s = offset < 0 ? 1 : 0;
2933 uint32_t bits = static_cast<uint32_t>(offset);
2934 return ((lower_insn & ~0x2fffU)
2935 | ((((bits >> 23) & 1) ^ !s) << 13)
2936 | ((((bits >> 22) & 1) ^ !s) << 11)
2937 | ((bits >> 1) & 0x7ffU));
2940 // Return the branch offset of a 32-bit THUMB conditional branch.
2941 static inline int32_t
2942 thumb32_cond_branch_offset(uint16_t upper_insn, uint16_t lower_insn)
2944 uint32_t s = (upper_insn & 0x0400U) >> 10;
2945 uint32_t j1 = (lower_insn & 0x2000U) >> 13;
2946 uint32_t j2 = (lower_insn & 0x0800U) >> 11;
2947 uint32_t lower = (lower_insn & 0x07ffU);
2948 uint32_t upper = (s << 8) | (j2 << 7) | (j1 << 6) | (upper_insn & 0x003fU);
2950 return utils::sign_extend<21>((upper << 12) | (lower << 1));
2953 // Insert OFFSET to a 32-bit THUMB conditional branch and return the upper
2954 // instruction. UPPER_INSN is the original upper instruction of the branch.
2955 // Caller is responsible for overflow checking.
2956 static inline uint16_t
2957 thumb32_cond_branch_upper(uint16_t upper_insn, int32_t offset)
2959 uint32_t s = offset < 0 ? 1 : 0;
2960 uint32_t bits = static_cast<uint32_t>(offset);
2961 return (upper_insn & 0xfbc0U) | (s << 10) | ((bits & 0x0003f000U) >> 12);
2964 // Insert OFFSET to a 32-bit THUMB conditional branch and return the lower
2965 // instruction. LOWER_INSN is the original lower instruction of the branch.
2966 // Caller is reponsible for overflow checking.
2967 static inline uint16_t
2968 thumb32_cond_branch_lower(uint16_t lower_insn, int32_t offset)
2970 uint32_t bits = static_cast<uint32_t>(offset);
2971 uint32_t j2 = (bits & 0x00080000U) >> 19;
2972 uint32_t j1 = (bits & 0x00040000U) >> 18;
2973 uint32_t lo = (bits & 0x00000ffeU) >> 1;
2975 return (lower_insn & 0xd000U) | (j1 << 13) | (j2 << 11) | lo;
2978 // R_ARM_ABS8: S + A
2979 static inline typename This::Status
2980 abs8(unsigned char *view,
2981 const Sized_relobj<32, big_endian>* object,
2982 const Symbol_value<32>* psymval)
2984 typedef typename elfcpp::Swap<8, big_endian>::Valtype Valtype;
2985 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2986 Valtype* wv = reinterpret_cast<Valtype*>(view);
2987 Valtype val = elfcpp::Swap<8, big_endian>::readval(wv);
2988 Reltype addend = utils::sign_extend<8>(val);
2989 Reltype x = psymval->value(object, addend);
2990 val = utils::bit_select(val, x, 0xffU);
2991 elfcpp::Swap<8, big_endian>::writeval(wv, val);
2993 // R_ARM_ABS8 permits signed or unsigned results.
2994 int signed_x = static_cast<int32_t>(x);
2995 return ((signed_x < -128 || signed_x > 255)
2996 ? This::STATUS_OVERFLOW
2997 : This::STATUS_OKAY);
3000 // R_ARM_THM_ABS5: S + A
3001 static inline typename This::Status
3002 thm_abs5(unsigned char *view,
3003 const Sized_relobj<32, big_endian>* object,
3004 const Symbol_value<32>* psymval)
3006 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3007 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3008 Valtype* wv = reinterpret_cast<Valtype*>(view);
3009 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3010 Reltype addend = (val & 0x7e0U) >> 6;
3011 Reltype x = psymval->value(object, addend);
3012 val = utils::bit_select(val, x << 6, 0x7e0U);
3013 elfcpp::Swap<16, big_endian>::writeval(wv, val);
3015 // R_ARM_ABS16 permits signed or unsigned results.
3016 int signed_x = static_cast<int32_t>(x);
3017 return ((signed_x < -32768 || signed_x > 65535)
3018 ? This::STATUS_OVERFLOW
3019 : This::STATUS_OKAY);
3022 // R_ARM_ABS12: S + A
3023 static inline typename This::Status
3024 abs12(unsigned char *view,
3025 const Sized_relobj<32, big_endian>* object,
3026 const Symbol_value<32>* psymval)
3028 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3029 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3030 Valtype* wv = reinterpret_cast<Valtype*>(view);
3031 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3032 Reltype addend = val & 0x0fffU;
3033 Reltype x = psymval->value(object, addend);
3034 val = utils::bit_select(val, x, 0x0fffU);
3035 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3036 return (utils::has_overflow<12>(x)
3037 ? This::STATUS_OVERFLOW
3038 : This::STATUS_OKAY);
3041 // R_ARM_ABS16: S + A
3042 static inline typename This::Status
3043 abs16(unsigned char *view,
3044 const Sized_relobj<32, big_endian>* object,
3045 const Symbol_value<32>* psymval)
3047 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3048 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3049 Valtype* wv = reinterpret_cast<Valtype*>(view);
3050 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3051 Reltype addend = utils::sign_extend<16>(val);
3052 Reltype x = psymval->value(object, addend);
3053 val = utils::bit_select(val, x, 0xffffU);
3054 elfcpp::Swap<16, big_endian>::writeval(wv, val);
3055 return (utils::has_signed_unsigned_overflow<16>(x)
3056 ? This::STATUS_OVERFLOW
3057 : This::STATUS_OKAY);
3060 // R_ARM_ABS32: (S + A) | T
3061 static inline typename This::Status
3062 abs32(unsigned char *view,
3063 const Sized_relobj<32, big_endian>* object,
3064 const Symbol_value<32>* psymval,
3065 Arm_address thumb_bit)
3067 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3068 Valtype* wv = reinterpret_cast<Valtype*>(view);
3069 Valtype addend = elfcpp::Swap<32, big_endian>::readval(wv);
3070 Valtype x = psymval->value(object, addend) | thumb_bit;
3071 elfcpp::Swap<32, big_endian>::writeval(wv, x);
3072 return This::STATUS_OKAY;
3075 // R_ARM_REL32: (S + A) | T - P
3076 static inline typename This::Status
3077 rel32(unsigned char *view,
3078 const Sized_relobj<32, big_endian>* object,
3079 const Symbol_value<32>* psymval,
3080 Arm_address address,
3081 Arm_address thumb_bit)
3083 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3084 Valtype* wv = reinterpret_cast<Valtype*>(view);
3085 Valtype addend = elfcpp::Swap<32, big_endian>::readval(wv);
3086 Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
3087 elfcpp::Swap<32, big_endian>::writeval(wv, x);
3088 return This::STATUS_OKAY;
3091 // R_ARM_THM_JUMP24: (S + A) | T - P
3092 static typename This::Status
3093 thm_jump19(unsigned char *view, const Arm_relobj<big_endian>* object,
3094 const Symbol_value<32>* psymval, Arm_address address,
3095 Arm_address thumb_bit);
3097 // R_ARM_THM_JUMP6: S + A – P
3098 static inline typename This::Status
3099 thm_jump6(unsigned char *view,
3100 const Sized_relobj<32, big_endian>* object,
3101 const Symbol_value<32>* psymval,
3102 Arm_address address)
3104 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3105 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3106 Valtype* wv = reinterpret_cast<Valtype*>(view);
3107 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3108 // bit[9]:bit[7:3]:’0’ (mask: 0x02f8)
3109 Reltype addend = (((val & 0x0200) >> 3) | ((val & 0x00f8) >> 2));
3110 Reltype x = (psymval->value(object, addend) - address);
3111 val = (val & 0xfd07) | ((x & 0x0040) << 3) | ((val & 0x003e) << 2);
3112 elfcpp::Swap<16, big_endian>::writeval(wv, val);
3113 // CZB does only forward jumps.
3114 return ((x > 0x007e)
3115 ? This::STATUS_OVERFLOW
3116 : This::STATUS_OKAY);
3119 // R_ARM_THM_JUMP8: S + A – P
3120 static inline typename This::Status
3121 thm_jump8(unsigned char *view,
3122 const Sized_relobj<32, big_endian>* object,
3123 const Symbol_value<32>* psymval,
3124 Arm_address address)
3126 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3127 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3128 Valtype* wv = reinterpret_cast<Valtype*>(view);
3129 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3130 Reltype addend = utils::sign_extend<8>((val & 0x00ff) << 1);
3131 Reltype x = (psymval->value(object, addend) - address);
3132 elfcpp::Swap<16, big_endian>::writeval(wv, (val & 0xff00) | ((x & 0x01fe) >> 1));
3133 return (utils::has_overflow<8>(x)
3134 ? This::STATUS_OVERFLOW
3135 : This::STATUS_OKAY);
3138 // R_ARM_THM_JUMP11: S + A – P
3139 static inline typename This::Status
3140 thm_jump11(unsigned char *view,
3141 const Sized_relobj<32, big_endian>* object,
3142 const Symbol_value<32>* psymval,
3143 Arm_address address)
3145 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3146 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3147 Valtype* wv = reinterpret_cast<Valtype*>(view);
3148 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
3149 Reltype addend = utils::sign_extend<11>((val & 0x07ff) << 1);
3150 Reltype x = (psymval->value(object, addend) - address);
3151 elfcpp::Swap<16, big_endian>::writeval(wv, (val & 0xf800) | ((x & 0x0ffe) >> 1));
3152 return (utils::has_overflow<11>(x)
3153 ? This::STATUS_OVERFLOW
3154 : This::STATUS_OKAY);
3157 // R_ARM_BASE_PREL: B(S) + A - P
3158 static inline typename This::Status
3159 base_prel(unsigned char* view,
3160 Arm_address origin,
3161 Arm_address address)
3163 Base::rel32(view, origin - address);
3164 return STATUS_OKAY;
3167 // R_ARM_BASE_ABS: B(S) + A
3168 static inline typename This::Status
3169 base_abs(unsigned char* view,
3170 Arm_address origin)
3172 Base::rel32(view, origin);
3173 return STATUS_OKAY;
3176 // R_ARM_GOT_BREL: GOT(S) + A - GOT_ORG
3177 static inline typename This::Status
3178 got_brel(unsigned char* view,
3179 typename elfcpp::Swap<32, big_endian>::Valtype got_offset)
3181 Base::rel32(view, got_offset);
3182 return This::STATUS_OKAY;
3185 // R_ARM_GOT_PREL: GOT(S) + A - P
3186 static inline typename This::Status
3187 got_prel(unsigned char *view,
3188 Arm_address got_entry,
3189 Arm_address address)
3191 Base::rel32(view, got_entry - address);
3192 return This::STATUS_OKAY;
3195 // R_ARM_PREL: (S + A) | T - P
3196 static inline typename This::Status
3197 prel31(unsigned char *view,
3198 const Sized_relobj<32, big_endian>* object,
3199 const Symbol_value<32>* psymval,
3200 Arm_address address,
3201 Arm_address thumb_bit)
3203 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3204 Valtype* wv = reinterpret_cast<Valtype*>(view);
3205 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3206 Valtype addend = utils::sign_extend<31>(val);
3207 Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
3208 val = utils::bit_select(val, x, 0x7fffffffU);
3209 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3210 return (utils::has_overflow<31>(x) ?
3211 This::STATUS_OVERFLOW : This::STATUS_OKAY);
3214 // R_ARM_MOVW_ABS_NC: (S + A) | T (relative address base is )
3215 // R_ARM_MOVW_PREL_NC: (S + A) | T - P
3216 // R_ARM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3217 // R_ARM_MOVW_BREL: ((S + A) | T) - B(S)
3218 static inline typename This::Status
3219 movw(unsigned char* view,
3220 const Sized_relobj<32, big_endian>* object,
3221 const Symbol_value<32>* psymval,
3222 Arm_address relative_address_base,
3223 Arm_address thumb_bit,
3224 bool check_overflow)
3226 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3227 Valtype* wv = reinterpret_cast<Valtype*>(view);
3228 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3229 Valtype addend = This::extract_arm_movw_movt_addend(val);
3230 Valtype x = ((psymval->value(object, addend) | thumb_bit)
3231 - relative_address_base);
3232 val = This::insert_val_arm_movw_movt(val, x);
3233 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3234 return ((check_overflow && utils::has_overflow<16>(x))
3235 ? This::STATUS_OVERFLOW
3236 : This::STATUS_OKAY);
3239 // R_ARM_MOVT_ABS: S + A (relative address base is 0)
3240 // R_ARM_MOVT_PREL: S + A - P
3241 // R_ARM_MOVT_BREL: S + A - B(S)
3242 static inline typename This::Status
3243 movt(unsigned char* view,
3244 const Sized_relobj<32, big_endian>* object,
3245 const Symbol_value<32>* psymval,
3246 Arm_address relative_address_base)
3248 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3249 Valtype* wv = reinterpret_cast<Valtype*>(view);
3250 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3251 Valtype addend = This::extract_arm_movw_movt_addend(val);
3252 Valtype x = (psymval->value(object, addend) - relative_address_base) >> 16;
3253 val = This::insert_val_arm_movw_movt(val, x);
3254 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3255 // FIXME: IHI0044D says that we should check for overflow.
3256 return This::STATUS_OKAY;
3259 // R_ARM_THM_MOVW_ABS_NC: S + A | T (relative_address_base is 0)
3260 // R_ARM_THM_MOVW_PREL_NC: (S + A) | T - P
3261 // R_ARM_THM_MOVW_BREL_NC: ((S + A) | T) - B(S)
3262 // R_ARM_THM_MOVW_BREL: ((S + A) | T) - B(S)
3263 static inline typename This::Status
3264 thm_movw(unsigned char *view,
3265 const Sized_relobj<32, big_endian>* object,
3266 const Symbol_value<32>* psymval,
3267 Arm_address relative_address_base,
3268 Arm_address thumb_bit,
3269 bool check_overflow)
3271 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3272 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3273 Valtype* wv = reinterpret_cast<Valtype*>(view);
3274 Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3275 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3276 Reltype addend = This::extract_thumb_movw_movt_addend(val);
3277 Reltype x =
3278 (psymval->value(object, addend) | thumb_bit) - relative_address_base;
3279 val = This::insert_val_thumb_movw_movt(val, x);
3280 elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3281 elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
3282 return ((check_overflow && utils::has_overflow<16>(x))
3283 ? This::STATUS_OVERFLOW
3284 : This::STATUS_OKAY);
3287 // R_ARM_THM_MOVT_ABS: S + A (relative address base is 0)
3288 // R_ARM_THM_MOVT_PREL: S + A - P
3289 // R_ARM_THM_MOVT_BREL: S + A - B(S)
3290 static inline typename This::Status
3291 thm_movt(unsigned char* view,
3292 const Sized_relobj<32, big_endian>* object,
3293 const Symbol_value<32>* psymval,
3294 Arm_address relative_address_base)
3296 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3297 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3298 Valtype* wv = reinterpret_cast<Valtype*>(view);
3299 Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3300 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3301 Reltype addend = This::extract_thumb_movw_movt_addend(val);
3302 Reltype x = (psymval->value(object, addend) - relative_address_base) >> 16;
3303 val = This::insert_val_thumb_movw_movt(val, x);
3304 elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
3305 elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
3306 return This::STATUS_OKAY;
3309 // R_ARM_THM_ALU_PREL_11_0: ((S + A) | T) - Pa (Thumb32)
3310 static inline typename This::Status
3311 thm_alu11(unsigned char* view,
3312 const Sized_relobj<32, big_endian>* object,
3313 const Symbol_value<32>* psymval,
3314 Arm_address address,
3315 Arm_address thumb_bit)
3317 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3318 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3319 Valtype* wv = reinterpret_cast<Valtype*>(view);
3320 Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3321 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3323 // 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
3324 // -----------------------------------------------------------------------
3325 // ADD{S} 1 1 1 1 0|i|0|1 0 0 0|S|1 1 0 1||0|imm3 |Rd |imm8
3326 // ADDW 1 1 1 1 0|i|1|0 0 0 0|0|1 1 0 1||0|imm3 |Rd |imm8
3327 // ADR[+] 1 1 1 1 0|i|1|0 0 0 0|0|1 1 1 1||0|imm3 |Rd |imm8
3328 // SUB{S} 1 1 1 1 0|i|0|1 1 0 1|S|1 1 0 1||0|imm3 |Rd |imm8
3329 // SUBW 1 1 1 1 0|i|1|0 1 0 1|0|1 1 0 1||0|imm3 |Rd |imm8
3330 // ADR[-] 1 1 1 1 0|i|1|0 1 0 1|0|1 1 1 1||0|imm3 |Rd |imm8
3332 // Determine a sign for the addend.
3333 const int sign = ((insn & 0xf8ef0000) == 0xf0ad0000
3334 || (insn & 0xf8ef0000) == 0xf0af0000) ? -1 : 1;
3335 // Thumb2 addend encoding:
3336 // imm12 := i | imm3 | imm8
3337 int32_t addend = (insn & 0xff)
3338 | ((insn & 0x00007000) >> 4)
3339 | ((insn & 0x04000000) >> 15);
3340 // Apply a sign to the added.
3341 addend *= sign;
3343 int32_t x = (psymval->value(object, addend) | thumb_bit)
3344 - (address & 0xfffffffc);
3345 Reltype val = abs(x);
3346 // Mask out the value and a distinct part of the ADD/SUB opcode
3347 // (bits 7:5 of opword).
3348 insn = (insn & 0xfb0f8f00)
3349 | (val & 0xff)
3350 | ((val & 0x700) << 4)
3351 | ((val & 0x800) << 15);
3352 // Set the opcode according to whether the value to go in the
3353 // place is negative.
3354 if (x < 0)
3355 insn |= 0x00a00000;
3357 elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3358 elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3359 return ((val > 0xfff) ?
3360 This::STATUS_OVERFLOW : This::STATUS_OKAY);
3363 // R_ARM_THM_PC8: S + A - Pa (Thumb)
3364 static inline typename This::Status
3365 thm_pc8(unsigned char* view,
3366 const Sized_relobj<32, big_endian>* object,
3367 const Symbol_value<32>* psymval,
3368 Arm_address address)
3370 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3371 typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
3372 Valtype* wv = reinterpret_cast<Valtype*>(view);
3373 Valtype insn = elfcpp::Swap<16, big_endian>::readval(wv);
3374 Reltype addend = ((insn & 0x00ff) << 2);
3375 int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3376 Reltype val = abs(x);
3377 insn = (insn & 0xff00) | ((val & 0x03fc) >> 2);
3379 elfcpp::Swap<16, big_endian>::writeval(wv, insn);
3380 return ((val > 0x03fc)
3381 ? This::STATUS_OVERFLOW
3382 : This::STATUS_OKAY);
3385 // R_ARM_THM_PC12: S + A - Pa (Thumb32)
3386 static inline typename This::Status
3387 thm_pc12(unsigned char* view,
3388 const Sized_relobj<32, big_endian>* object,
3389 const Symbol_value<32>* psymval,
3390 Arm_address address)
3392 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3393 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
3394 Valtype* wv = reinterpret_cast<Valtype*>(view);
3395 Reltype insn = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
3396 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
3397 // Determine a sign for the addend (positive if the U bit is 1).
3398 const int sign = (insn & 0x00800000) ? 1 : -1;
3399 int32_t addend = (insn & 0xfff);
3400 // Apply a sign to the added.
3401 addend *= sign;
3403 int32_t x = (psymval->value(object, addend) - (address & 0xfffffffc));
3404 Reltype val = abs(x);
3405 // Mask out and apply the value and the U bit.
3406 insn = (insn & 0xff7ff000) | (val & 0xfff);
3407 // Set the U bit according to whether the value to go in the
3408 // place is positive.
3409 if (x >= 0)
3410 insn |= 0x00800000;
3412 elfcpp::Swap<16, big_endian>::writeval(wv, insn >> 16);
3413 elfcpp::Swap<16, big_endian>::writeval(wv + 1, insn & 0xffff);
3414 return ((val > 0xfff) ?
3415 This::STATUS_OVERFLOW : This::STATUS_OKAY);
3418 // R_ARM_V4BX
3419 static inline typename This::Status
3420 v4bx(const Relocate_info<32, big_endian>* relinfo,
3421 unsigned char *view,
3422 const Arm_relobj<big_endian>* object,
3423 const Arm_address address,
3424 const bool is_interworking)
3427 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3428 Valtype* wv = reinterpret_cast<Valtype*>(view);
3429 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3431 // Ensure that we have a BX instruction.
3432 gold_assert((val & 0x0ffffff0) == 0x012fff10);
3433 const uint32_t reg = (val & 0xf);
3434 if (is_interworking && reg != 0xf)
3436 Stub_table<big_endian>* stub_table =
3437 object->stub_table(relinfo->data_shndx);
3438 gold_assert(stub_table != NULL);
3440 Arm_v4bx_stub* stub = stub_table->find_arm_v4bx_stub(reg);
3441 gold_assert(stub != NULL);
3443 int32_t veneer_address =
3444 stub_table->address() + stub->offset() - 8 - address;
3445 gold_assert((veneer_address <= ARM_MAX_FWD_BRANCH_OFFSET)
3446 && (veneer_address >= ARM_MAX_BWD_BRANCH_OFFSET));
3447 // Replace with a branch to veneer (B <addr>)
3448 val = (val & 0xf0000000) | 0x0a000000
3449 | ((veneer_address >> 2) & 0x00ffffff);
3451 else
3453 // Preserve Rm (lowest four bits) and the condition code
3454 // (highest four bits). Other bits encode MOV PC,Rm.
3455 val = (val & 0xf000000f) | 0x01a0f000;
3457 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3458 return This::STATUS_OKAY;
3461 // R_ARM_ALU_PC_G0_NC: ((S + A) | T) - P
3462 // R_ARM_ALU_PC_G0: ((S + A) | T) - P
3463 // R_ARM_ALU_PC_G1_NC: ((S + A) | T) - P
3464 // R_ARM_ALU_PC_G1: ((S + A) | T) - P
3465 // R_ARM_ALU_PC_G2: ((S + A) | T) - P
3466 // R_ARM_ALU_SB_G0_NC: ((S + A) | T) - B(S)
3467 // R_ARM_ALU_SB_G0: ((S + A) | T) - B(S)
3468 // R_ARM_ALU_SB_G1_NC: ((S + A) | T) - B(S)
3469 // R_ARM_ALU_SB_G1: ((S + A) | T) - B(S)
3470 // R_ARM_ALU_SB_G2: ((S + A) | T) - B(S)
3471 static inline typename This::Status
3472 arm_grp_alu(unsigned char* view,
3473 const Sized_relobj<32, big_endian>* object,
3474 const Symbol_value<32>* psymval,
3475 const int group,
3476 Arm_address address,
3477 Arm_address thumb_bit,
3478 bool check_overflow)
3480 gold_assert(group >= 0 && group < 3);
3481 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3482 Valtype* wv = reinterpret_cast<Valtype*>(view);
3483 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3485 // ALU group relocations are allowed only for the ADD/SUB instructions.
3486 // (0x00800000 - ADD, 0x00400000 - SUB)
3487 const Valtype opcode = insn & 0x01e00000;
3488 if (opcode != 0x00800000 && opcode != 0x00400000)
3489 return This::STATUS_BAD_RELOC;
3491 // Determine a sign for the addend.
3492 const int sign = (opcode == 0x00800000) ? 1 : -1;
3493 // shifter = rotate_imm * 2
3494 const uint32_t shifter = (insn & 0xf00) >> 7;
3495 // Initial addend value.
3496 int32_t addend = insn & 0xff;
3497 // Rotate addend right by shifter.
3498 addend = (addend >> shifter) | (addend << (32 - shifter));
3499 // Apply a sign to the added.
3500 addend *= sign;
3502 int32_t x = ((psymval->value(object, addend) | thumb_bit) - address);
3503 Valtype gn = Arm_relocate_functions::calc_grp_gn(abs(x), group);
3504 // Check for overflow if required
3505 if (check_overflow
3506 && (Arm_relocate_functions::calc_grp_residual(abs(x), group) != 0))
3507 return This::STATUS_OVERFLOW;
3509 // Mask out the value and the ADD/SUB part of the opcode; take care
3510 // not to destroy the S bit.
3511 insn &= 0xff1ff000;
3512 // Set the opcode according to whether the value to go in the
3513 // place is negative.
3514 insn |= ((x < 0) ? 0x00400000 : 0x00800000);
3515 // Encode the offset (encoded Gn).
3516 insn |= gn;
3518 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3519 return This::STATUS_OKAY;
3522 // R_ARM_LDR_PC_G0: S + A - P
3523 // R_ARM_LDR_PC_G1: S + A - P
3524 // R_ARM_LDR_PC_G2: S + A - P
3525 // R_ARM_LDR_SB_G0: S + A - B(S)
3526 // R_ARM_LDR_SB_G1: S + A - B(S)
3527 // R_ARM_LDR_SB_G2: S + A - B(S)
3528 static inline typename This::Status
3529 arm_grp_ldr(unsigned char* view,
3530 const Sized_relobj<32, big_endian>* object,
3531 const Symbol_value<32>* psymval,
3532 const int group,
3533 Arm_address address)
3535 gold_assert(group >= 0 && group < 3);
3536 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3537 Valtype* wv = reinterpret_cast<Valtype*>(view);
3538 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3540 const int sign = (insn & 0x00800000) ? 1 : -1;
3541 int32_t addend = (insn & 0xfff) * sign;
3542 int32_t x = (psymval->value(object, addend) - address);
3543 // Calculate the relevant G(n-1) value to obtain this stage residual.
3544 Valtype residual =
3545 Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3546 if (residual >= 0x1000)
3547 return This::STATUS_OVERFLOW;
3549 // Mask out the value and U bit.
3550 insn &= 0xff7ff000;
3551 // Set the U bit for non-negative values.
3552 if (x >= 0)
3553 insn |= 0x00800000;
3554 insn |= residual;
3556 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3557 return This::STATUS_OKAY;
3560 // R_ARM_LDRS_PC_G0: S + A - P
3561 // R_ARM_LDRS_PC_G1: S + A - P
3562 // R_ARM_LDRS_PC_G2: S + A - P
3563 // R_ARM_LDRS_SB_G0: S + A - B(S)
3564 // R_ARM_LDRS_SB_G1: S + A - B(S)
3565 // R_ARM_LDRS_SB_G2: S + A - B(S)
3566 static inline typename This::Status
3567 arm_grp_ldrs(unsigned char* view,
3568 const Sized_relobj<32, big_endian>* object,
3569 const Symbol_value<32>* psymval,
3570 const int group,
3571 Arm_address address)
3573 gold_assert(group >= 0 && group < 3);
3574 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3575 Valtype* wv = reinterpret_cast<Valtype*>(view);
3576 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3578 const int sign = (insn & 0x00800000) ? 1 : -1;
3579 int32_t addend = (((insn & 0xf00) >> 4) + (insn & 0xf)) * sign;
3580 int32_t x = (psymval->value(object, addend) - address);
3581 // Calculate the relevant G(n-1) value to obtain this stage residual.
3582 Valtype residual =
3583 Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3584 if (residual >= 0x100)
3585 return This::STATUS_OVERFLOW;
3587 // Mask out the value and U bit.
3588 insn &= 0xff7ff0f0;
3589 // Set the U bit for non-negative values.
3590 if (x >= 0)
3591 insn |= 0x00800000;
3592 insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
3594 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3595 return This::STATUS_OKAY;
3598 // R_ARM_LDC_PC_G0: S + A - P
3599 // R_ARM_LDC_PC_G1: S + A - P
3600 // R_ARM_LDC_PC_G2: S + A - P
3601 // R_ARM_LDC_SB_G0: S + A - B(S)
3602 // R_ARM_LDC_SB_G1: S + A - B(S)
3603 // R_ARM_LDC_SB_G2: S + A - B(S)
3604 static inline typename This::Status
3605 arm_grp_ldc(unsigned char* view,
3606 const Sized_relobj<32, big_endian>* object,
3607 const Symbol_value<32>* psymval,
3608 const int group,
3609 Arm_address address)
3611 gold_assert(group >= 0 && group < 3);
3612 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3613 Valtype* wv = reinterpret_cast<Valtype*>(view);
3614 Valtype insn = elfcpp::Swap<32, big_endian>::readval(wv);
3616 const int sign = (insn & 0x00800000) ? 1 : -1;
3617 int32_t addend = ((insn & 0xff) << 2) * sign;
3618 int32_t x = (psymval->value(object, addend) - address);
3619 // Calculate the relevant G(n-1) value to obtain this stage residual.
3620 Valtype residual =
3621 Arm_relocate_functions::calc_grp_residual(abs(x), group - 1);
3622 if ((residual & 0x3) != 0 || residual >= 0x400)
3623 return This::STATUS_OVERFLOW;
3625 // Mask out the value and U bit.
3626 insn &= 0xff7fff00;
3627 // Set the U bit for non-negative values.
3628 if (x >= 0)
3629 insn |= 0x00800000;
3630 insn |= (residual >> 2);
3632 elfcpp::Swap<32, big_endian>::writeval(wv, insn);
3633 return This::STATUS_OKAY;
3637 // Relocate ARM long branches. This handles relocation types
3638 // R_ARM_CALL, R_ARM_JUMP24, R_ARM_PLT32 and R_ARM_XPC25.
3639 // If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
3640 // undefined and we do not use PLT in this relocation. In such a case,
3641 // the branch is converted into an NOP.
3643 template<bool big_endian>
3644 typename Arm_relocate_functions<big_endian>::Status
3645 Arm_relocate_functions<big_endian>::arm_branch_common(
3646 unsigned int r_type,
3647 const Relocate_info<32, big_endian>* relinfo,
3648 unsigned char *view,
3649 const Sized_symbol<32>* gsym,
3650 const Arm_relobj<big_endian>* object,
3651 unsigned int r_sym,
3652 const Symbol_value<32>* psymval,
3653 Arm_address address,
3654 Arm_address thumb_bit,
3655 bool is_weakly_undefined_without_plt)
3657 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3658 Valtype* wv = reinterpret_cast<Valtype*>(view);
3659 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3661 bool insn_is_b = (((val >> 28) & 0xf) <= 0xe)
3662 && ((val & 0x0f000000UL) == 0x0a000000UL);
3663 bool insn_is_uncond_bl = (val & 0xff000000UL) == 0xeb000000UL;
3664 bool insn_is_cond_bl = (((val >> 28) & 0xf) < 0xe)
3665 && ((val & 0x0f000000UL) == 0x0b000000UL);
3666 bool insn_is_blx = (val & 0xfe000000UL) == 0xfa000000UL;
3667 bool insn_is_any_branch = (val & 0x0e000000UL) == 0x0a000000UL;
3669 // Check that the instruction is valid.
3670 if (r_type == elfcpp::R_ARM_CALL)
3672 if (!insn_is_uncond_bl && !insn_is_blx)
3673 return This::STATUS_BAD_RELOC;
3675 else if (r_type == elfcpp::R_ARM_JUMP24)
3677 if (!insn_is_b && !insn_is_cond_bl)
3678 return This::STATUS_BAD_RELOC;
3680 else if (r_type == elfcpp::R_ARM_PLT32)
3682 if (!insn_is_any_branch)
3683 return This::STATUS_BAD_RELOC;
3685 else if (r_type == elfcpp::R_ARM_XPC25)
3687 // FIXME: AAELF document IH0044C does not say much about it other
3688 // than it being obsolete.
3689 if (!insn_is_any_branch)
3690 return This::STATUS_BAD_RELOC;
3692 else
3693 gold_unreachable();
3695 // A branch to an undefined weak symbol is turned into a jump to
3696 // the next instruction unless a PLT entry will be created.
3697 // Do the same for local undefined symbols.
3698 // The jump to the next instruction is optimized as a NOP depending
3699 // on the architecture.
3700 const Target_arm<big_endian>* arm_target =
3701 Target_arm<big_endian>::default_target();
3702 if (is_weakly_undefined_without_plt)
3704 Valtype cond = val & 0xf0000000U;
3705 if (arm_target->may_use_arm_nop())
3706 val = cond | 0x0320f000;
3707 else
3708 val = cond | 0x01a00000; // Using pre-UAL nop: mov r0, r0.
3709 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3710 return This::STATUS_OKAY;
3713 Valtype addend = utils::sign_extend<26>(val << 2);
3714 Valtype branch_target = psymval->value(object, addend);
3715 int32_t branch_offset = branch_target - address;
3717 // We need a stub if the branch offset is too large or if we need
3718 // to switch mode.
3719 bool may_use_blx = arm_target->may_use_blx();
3720 Reloc_stub* stub = NULL;
3721 if (utils::has_overflow<26>(branch_offset)
3722 || ((thumb_bit != 0) && !(may_use_blx && r_type == elfcpp::R_ARM_CALL)))
3724 Valtype unadjusted_branch_target = psymval->value(object, 0);
3726 Stub_type stub_type =
3727 Reloc_stub::stub_type_for_reloc(r_type, address,
3728 unadjusted_branch_target,
3729 (thumb_bit != 0));
3730 if (stub_type != arm_stub_none)
3732 Stub_table<big_endian>* stub_table =
3733 object->stub_table(relinfo->data_shndx);
3734 gold_assert(stub_table != NULL);
3736 Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
3737 stub = stub_table->find_reloc_stub(stub_key);
3738 gold_assert(stub != NULL);
3739 thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
3740 branch_target = stub_table->address() + stub->offset() + addend;
3741 branch_offset = branch_target - address;
3742 gold_assert(!utils::has_overflow<26>(branch_offset));
3746 // At this point, if we still need to switch mode, the instruction
3747 // must either be a BLX or a BL that can be converted to a BLX.
3748 if (thumb_bit != 0)
3750 // Turn BL to BLX.
3751 gold_assert(may_use_blx && r_type == elfcpp::R_ARM_CALL);
3752 val = (val & 0xffffff) | 0xfa000000 | ((branch_offset & 2) << 23);
3755 val = utils::bit_select(val, (branch_offset >> 2), 0xffffffUL);
3756 elfcpp::Swap<32, big_endian>::writeval(wv, val);
3757 return (utils::has_overflow<26>(branch_offset)
3758 ? This::STATUS_OVERFLOW : This::STATUS_OKAY);
3761 // Relocate THUMB long branches. This handles relocation types
3762 // R_ARM_THM_CALL, R_ARM_THM_JUMP24 and R_ARM_THM_XPC22.
3763 // If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
3764 // undefined and we do not use PLT in this relocation. In such a case,
3765 // the branch is converted into an NOP.
3767 template<bool big_endian>
3768 typename Arm_relocate_functions<big_endian>::Status
3769 Arm_relocate_functions<big_endian>::thumb_branch_common(
3770 unsigned int r_type,
3771 const Relocate_info<32, big_endian>* relinfo,
3772 unsigned char *view,
3773 const Sized_symbol<32>* gsym,
3774 const Arm_relobj<big_endian>* object,
3775 unsigned int r_sym,
3776 const Symbol_value<32>* psymval,
3777 Arm_address address,
3778 Arm_address thumb_bit,
3779 bool is_weakly_undefined_without_plt)
3781 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3782 Valtype* wv = reinterpret_cast<Valtype*>(view);
3783 uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
3784 uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
3786 // FIXME: These tests are too loose and do not take THUMB/THUMB-2 difference
3787 // into account.
3788 bool is_bl_insn = (lower_insn & 0x1000U) == 0x1000U;
3789 bool is_blx_insn = (lower_insn & 0x1000U) == 0x0000U;
3791 // Check that the instruction is valid.
3792 if (r_type == elfcpp::R_ARM_THM_CALL)
3794 if (!is_bl_insn && !is_blx_insn)
3795 return This::STATUS_BAD_RELOC;
3797 else if (r_type == elfcpp::R_ARM_THM_JUMP24)
3799 // This cannot be a BLX.
3800 if (!is_bl_insn)
3801 return This::STATUS_BAD_RELOC;
3803 else if (r_type == elfcpp::R_ARM_THM_XPC22)
3805 // Check for Thumb to Thumb call.
3806 if (!is_blx_insn)
3807 return This::STATUS_BAD_RELOC;
3808 if (thumb_bit != 0)
3810 gold_warning(_("%s: Thumb BLX instruction targets "
3811 "thumb function '%s'."),
3812 object->name().c_str(),
3813 (gsym ? gsym->name() : "(local)"));
3814 // Convert BLX to BL.
3815 lower_insn |= 0x1000U;
3818 else
3819 gold_unreachable();
3821 // A branch to an undefined weak symbol is turned into a jump to
3822 // the next instruction unless a PLT entry will be created.
3823 // The jump to the next instruction is optimized as a NOP.W for
3824 // Thumb-2 enabled architectures.
3825 const Target_arm<big_endian>* arm_target =
3826 Target_arm<big_endian>::default_target();
3827 if (is_weakly_undefined_without_plt)
3829 if (arm_target->may_use_thumb2_nop())
3831 elfcpp::Swap<16, big_endian>::writeval(wv, 0xf3af);
3832 elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0x8000);
3834 else
3836 elfcpp::Swap<16, big_endian>::writeval(wv, 0xe000);
3837 elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0xbf00);
3839 return This::STATUS_OKAY;
3842 int32_t addend = This::thumb32_branch_offset(upper_insn, lower_insn);
3843 Arm_address branch_target = psymval->value(object, addend);
3845 // For BLX, bit 1 of target address comes from bit 1 of base address.
3846 bool may_use_blx = arm_target->may_use_blx();
3847 if (thumb_bit == 0 && may_use_blx)
3848 branch_target = utils::bit_select(branch_target, address, 0x2);
3850 int32_t branch_offset = branch_target - address;
3852 // We need a stub if the branch offset is too large or if we need
3853 // to switch mode.
3854 bool thumb2 = arm_target->using_thumb2();
3855 if ((!thumb2 && utils::has_overflow<23>(branch_offset))
3856 || (thumb2 && utils::has_overflow<25>(branch_offset))
3857 || ((thumb_bit == 0)
3858 && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
3859 || r_type == elfcpp::R_ARM_THM_JUMP24)))
3861 Arm_address unadjusted_branch_target = psymval->value(object, 0);
3863 Stub_type stub_type =
3864 Reloc_stub::stub_type_for_reloc(r_type, address,
3865 unadjusted_branch_target,
3866 (thumb_bit != 0));
3868 if (stub_type != arm_stub_none)
3870 Stub_table<big_endian>* stub_table =
3871 object->stub_table(relinfo->data_shndx);
3872 gold_assert(stub_table != NULL);
3874 Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
3875 Reloc_stub* stub = stub_table->find_reloc_stub(stub_key);
3876 gold_assert(stub != NULL);
3877 thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
3878 branch_target = stub_table->address() + stub->offset() + addend;
3879 if (thumb_bit == 0 && may_use_blx)
3880 branch_target = utils::bit_select(branch_target, address, 0x2);
3881 branch_offset = branch_target - address;
3885 // At this point, if we still need to switch mode, the instruction
3886 // must either be a BLX or a BL that can be converted to a BLX.
3887 if (thumb_bit == 0)
3889 gold_assert(may_use_blx
3890 && (r_type == elfcpp::R_ARM_THM_CALL
3891 || r_type == elfcpp::R_ARM_THM_XPC22));
3892 // Make sure this is a BLX.
3893 lower_insn &= ~0x1000U;
3895 else
3897 // Make sure this is a BL.
3898 lower_insn |= 0x1000U;
3901 // For a BLX instruction, make sure that the relocation is rounded up
3902 // to a word boundary. This follows the semantics of the instruction
3903 // which specifies that bit 1 of the target address will come from bit
3904 // 1 of the base address.
3905 if ((lower_insn & 0x5000U) == 0x4000U)
3906 gold_assert((branch_offset & 3) == 0);
3908 // Put BRANCH_OFFSET back into the insn. Assumes two's complement.
3909 // We use the Thumb-2 encoding, which is safe even if dealing with
3910 // a Thumb-1 instruction by virtue of our overflow check above. */
3911 upper_insn = This::thumb32_branch_upper(upper_insn, branch_offset);
3912 lower_insn = This::thumb32_branch_lower(lower_insn, branch_offset);
3914 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
3915 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
3917 gold_assert(!utils::has_overflow<25>(branch_offset));
3919 return ((thumb2
3920 ? utils::has_overflow<25>(branch_offset)
3921 : utils::has_overflow<23>(branch_offset))
3922 ? This::STATUS_OVERFLOW
3923 : This::STATUS_OKAY);
3926 // Relocate THUMB-2 long conditional branches.
3927 // If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
3928 // undefined and we do not use PLT in this relocation. In such a case,
3929 // the branch is converted into an NOP.
3931 template<bool big_endian>
3932 typename Arm_relocate_functions<big_endian>::Status
3933 Arm_relocate_functions<big_endian>::thm_jump19(
3934 unsigned char *view,
3935 const Arm_relobj<big_endian>* object,
3936 const Symbol_value<32>* psymval,
3937 Arm_address address,
3938 Arm_address thumb_bit)
3940 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3941 Valtype* wv = reinterpret_cast<Valtype*>(view);
3942 uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
3943 uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
3944 int32_t addend = This::thumb32_cond_branch_offset(upper_insn, lower_insn);
3946 Arm_address branch_target = psymval->value(object, addend);
3947 int32_t branch_offset = branch_target - address;
3949 // ??? Should handle interworking? GCC might someday try to
3950 // use this for tail calls.
3951 // FIXME: We do support thumb entry to PLT yet.
3952 if (thumb_bit == 0)
3954 gold_error(_("conditional branch to PLT in THUMB-2 not supported yet."));
3955 return This::STATUS_BAD_RELOC;
3958 // Put RELOCATION back into the insn.
3959 upper_insn = This::thumb32_cond_branch_upper(upper_insn, branch_offset);
3960 lower_insn = This::thumb32_cond_branch_lower(lower_insn, branch_offset);
3962 // Put the relocated value back in the object file:
3963 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
3964 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
3966 return (utils::has_overflow<21>(branch_offset)
3967 ? This::STATUS_OVERFLOW
3968 : This::STATUS_OKAY);
3971 // Get the GOT section, creating it if necessary.
3973 template<bool big_endian>
3974 Arm_output_data_got<big_endian>*
3975 Target_arm<big_endian>::got_section(Symbol_table* symtab, Layout* layout)
3977 if (this->got_ == NULL)
3979 gold_assert(symtab != NULL && layout != NULL);
3981 this->got_ = new Arm_output_data_got<big_endian>(symtab, layout);
3983 Output_section* os;
3984 os = layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
3985 (elfcpp::SHF_ALLOC
3986 | elfcpp::SHF_WRITE),
3987 this->got_, false, false, false,
3988 true);
3989 // The old GNU linker creates a .got.plt section. We just
3990 // create another set of data in the .got section. Note that we
3991 // always create a PLT if we create a GOT, although the PLT
3992 // might be empty.
3993 this->got_plt_ = new Output_data_space(4, "** GOT PLT");
3994 os = layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
3995 (elfcpp::SHF_ALLOC
3996 | elfcpp::SHF_WRITE),
3997 this->got_plt_, false, false,
3998 false, false);
4000 // The first three entries are reserved.
4001 this->got_plt_->set_current_data_size(3 * 4);
4003 // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
4004 symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
4005 Symbol_table::PREDEFINED,
4006 this->got_plt_,
4007 0, 0, elfcpp::STT_OBJECT,
4008 elfcpp::STB_LOCAL,
4009 elfcpp::STV_HIDDEN, 0,
4010 false, false);
4012 return this->got_;
4015 // Get the dynamic reloc section, creating it if necessary.
4017 template<bool big_endian>
4018 typename Target_arm<big_endian>::Reloc_section*
4019 Target_arm<big_endian>::rel_dyn_section(Layout* layout)
4021 if (this->rel_dyn_ == NULL)
4023 gold_assert(layout != NULL);
4024 this->rel_dyn_ = new Reloc_section(parameters->options().combreloc());
4025 layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
4026 elfcpp::SHF_ALLOC, this->rel_dyn_, true,
4027 false, false, false);
4029 return this->rel_dyn_;
4032 // Insn_template methods.
4034 // Return byte size of an instruction template.
4036 size_t
4037 Insn_template::size() const
4039 switch (this->type())
4041 case THUMB16_TYPE:
4042 case THUMB16_SPECIAL_TYPE:
4043 return 2;
4044 case ARM_TYPE:
4045 case THUMB32_TYPE:
4046 case DATA_TYPE:
4047 return 4;
4048 default:
4049 gold_unreachable();
4053 // Return alignment of an instruction template.
4055 unsigned
4056 Insn_template::alignment() const
4058 switch (this->type())
4060 case THUMB16_TYPE:
4061 case THUMB16_SPECIAL_TYPE:
4062 case THUMB32_TYPE:
4063 return 2;
4064 case ARM_TYPE:
4065 case DATA_TYPE:
4066 return 4;
4067 default:
4068 gold_unreachable();
4072 // Stub_template methods.
4074 Stub_template::Stub_template(
4075 Stub_type type, const Insn_template* insns,
4076 size_t insn_count)
4077 : type_(type), insns_(insns), insn_count_(insn_count), alignment_(1),
4078 entry_in_thumb_mode_(false), relocs_()
4080 off_t offset = 0;
4082 // Compute byte size and alignment of stub template.
4083 for (size_t i = 0; i < insn_count; i++)
4085 unsigned insn_alignment = insns[i].alignment();
4086 size_t insn_size = insns[i].size();
4087 gold_assert((offset & (insn_alignment - 1)) == 0);
4088 this->alignment_ = std::max(this->alignment_, insn_alignment);
4089 switch (insns[i].type())
4091 case Insn_template::THUMB16_TYPE:
4092 case Insn_template::THUMB16_SPECIAL_TYPE:
4093 if (i == 0)
4094 this->entry_in_thumb_mode_ = true;
4095 break;
4097 case Insn_template::THUMB32_TYPE:
4098 if (insns[i].r_type() != elfcpp::R_ARM_NONE)
4099 this->relocs_.push_back(Reloc(i, offset));
4100 if (i == 0)
4101 this->entry_in_thumb_mode_ = true;
4102 break;
4104 case Insn_template::ARM_TYPE:
4105 // Handle cases where the target is encoded within the
4106 // instruction.
4107 if (insns[i].r_type() == elfcpp::R_ARM_JUMP24)
4108 this->relocs_.push_back(Reloc(i, offset));
4109 break;
4111 case Insn_template::DATA_TYPE:
4112 // Entry point cannot be data.
4113 gold_assert(i != 0);
4114 this->relocs_.push_back(Reloc(i, offset));
4115 break;
4117 default:
4118 gold_unreachable();
4120 offset += insn_size;
4122 this->size_ = offset;
4125 // Stub methods.
4127 // Template to implement do_write for a specific target endianity.
4129 template<bool big_endian>
4130 void inline
4131 Stub::do_fixed_endian_write(unsigned char* view, section_size_type view_size)
4133 const Stub_template* stub_template = this->stub_template();
4134 const Insn_template* insns = stub_template->insns();
4136 // FIXME: We do not handle BE8 encoding yet.
4137 unsigned char* pov = view;
4138 for (size_t i = 0; i < stub_template->insn_count(); i++)
4140 switch (insns[i].type())
4142 case Insn_template::THUMB16_TYPE:
4143 elfcpp::Swap<16, big_endian>::writeval(pov, insns[i].data() & 0xffff);
4144 break;
4145 case Insn_template::THUMB16_SPECIAL_TYPE:
4146 elfcpp::Swap<16, big_endian>::writeval(
4147 pov,
4148 this->thumb16_special(i));
4149 break;
4150 case Insn_template::THUMB32_TYPE:
4152 uint32_t hi = (insns[i].data() >> 16) & 0xffff;
4153 uint32_t lo = insns[i].data() & 0xffff;
4154 elfcpp::Swap<16, big_endian>::writeval(pov, hi);
4155 elfcpp::Swap<16, big_endian>::writeval(pov + 2, lo);
4157 break;
4158 case Insn_template::ARM_TYPE:
4159 case Insn_template::DATA_TYPE:
4160 elfcpp::Swap<32, big_endian>::writeval(pov, insns[i].data());
4161 break;
4162 default:
4163 gold_unreachable();
4165 pov += insns[i].size();
4167 gold_assert(static_cast<section_size_type>(pov - view) == view_size);
4170 // Reloc_stub::Key methods.
4172 // Dump a Key as a string for debugging.
4174 std::string
4175 Reloc_stub::Key::name() const
4177 if (this->r_sym_ == invalid_index)
4179 // Global symbol key name
4180 // <stub-type>:<symbol name>:<addend>.
4181 const std::string sym_name = this->u_.symbol->name();
4182 // We need to print two hex number and two colons. So just add 100 bytes
4183 // to the symbol name size.
4184 size_t len = sym_name.size() + 100;
4185 char* buffer = new char[len];
4186 int c = snprintf(buffer, len, "%d:%s:%x", this->stub_type_,
4187 sym_name.c_str(), this->addend_);
4188 gold_assert(c > 0 && c < static_cast<int>(len));
4189 delete[] buffer;
4190 return std::string(buffer);
4192 else
4194 // local symbol key name
4195 // <stub-type>:<object>:<r_sym>:<addend>.
4196 const size_t len = 200;
4197 char buffer[len];
4198 int c = snprintf(buffer, len, "%d:%p:%u:%x", this->stub_type_,
4199 this->u_.relobj, this->r_sym_, this->addend_);
4200 gold_assert(c > 0 && c < static_cast<int>(len));
4201 return std::string(buffer);
4205 // Reloc_stub methods.
4207 // Determine the type of stub needed, if any, for a relocation of R_TYPE at
4208 // LOCATION to DESTINATION.
4209 // This code is based on the arm_type_of_stub function in
4210 // bfd/elf32-arm.c. We have changed the interface a liitle to keep the Stub
4211 // class simple.
4213 Stub_type
4214 Reloc_stub::stub_type_for_reloc(
4215 unsigned int r_type,
4216 Arm_address location,
4217 Arm_address destination,
4218 bool target_is_thumb)
4220 Stub_type stub_type = arm_stub_none;
4222 // This is a bit ugly but we want to avoid using a templated class for
4223 // big and little endianities.
4224 bool may_use_blx;
4225 bool should_force_pic_veneer;
4226 bool thumb2;
4227 bool thumb_only;
4228 if (parameters->target().is_big_endian())
4230 const Target_arm<true>* big_endian_target =
4231 Target_arm<true>::default_target();
4232 may_use_blx = big_endian_target->may_use_blx();
4233 should_force_pic_veneer = big_endian_target->should_force_pic_veneer();
4234 thumb2 = big_endian_target->using_thumb2();
4235 thumb_only = big_endian_target->using_thumb_only();
4237 else
4239 const Target_arm<false>* little_endian_target =
4240 Target_arm<false>::default_target();
4241 may_use_blx = little_endian_target->may_use_blx();
4242 should_force_pic_veneer = little_endian_target->should_force_pic_veneer();
4243 thumb2 = little_endian_target->using_thumb2();
4244 thumb_only = little_endian_target->using_thumb_only();
4247 int64_t branch_offset;
4248 if (r_type == elfcpp::R_ARM_THM_CALL || r_type == elfcpp::R_ARM_THM_JUMP24)
4250 // For THUMB BLX instruction, bit 1 of target comes from bit 1 of the
4251 // base address (instruction address + 4).
4252 if ((r_type == elfcpp::R_ARM_THM_CALL) && may_use_blx && !target_is_thumb)
4253 destination = utils::bit_select(destination, location, 0x2);
4254 branch_offset = static_cast<int64_t>(destination) - location;
4256 // Handle cases where:
4257 // - this call goes too far (different Thumb/Thumb2 max
4258 // distance)
4259 // - it's a Thumb->Arm call and blx is not available, or it's a
4260 // Thumb->Arm branch (not bl). A stub is needed in this case.
4261 if ((!thumb2
4262 && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
4263 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
4264 || (thumb2
4265 && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
4266 || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
4267 || ((!target_is_thumb)
4268 && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
4269 || (r_type == elfcpp::R_ARM_THM_JUMP24))))
4271 if (target_is_thumb)
4273 // Thumb to thumb.
4274 if (!thumb_only)
4276 stub_type = (parameters->options().shared()
4277 || should_force_pic_veneer)
4278 // PIC stubs.
4279 ? ((may_use_blx
4280 && (r_type == elfcpp::R_ARM_THM_CALL))
4281 // V5T and above. Stub starts with ARM code, so
4282 // we must be able to switch mode before
4283 // reaching it, which is only possible for 'bl'
4284 // (ie R_ARM_THM_CALL relocation).
4285 ? arm_stub_long_branch_any_thumb_pic
4286 // On V4T, use Thumb code only.
4287 : arm_stub_long_branch_v4t_thumb_thumb_pic)
4289 // non-PIC stubs.
4290 : ((may_use_blx
4291 && (r_type == elfcpp::R_ARM_THM_CALL))
4292 ? arm_stub_long_branch_any_any // V5T and above.
4293 : arm_stub_long_branch_v4t_thumb_thumb); // V4T.
4295 else
4297 stub_type = (parameters->options().shared()
4298 || should_force_pic_veneer)
4299 ? arm_stub_long_branch_thumb_only_pic // PIC stub.
4300 : arm_stub_long_branch_thumb_only; // non-PIC stub.
4303 else
4305 // Thumb to arm.
4307 // FIXME: We should check that the input section is from an
4308 // object that has interwork enabled.
4310 stub_type = (parameters->options().shared()
4311 || should_force_pic_veneer)
4312 // PIC stubs.
4313 ? ((may_use_blx
4314 && (r_type == elfcpp::R_ARM_THM_CALL))
4315 ? arm_stub_long_branch_any_arm_pic // V5T and above.
4316 : arm_stub_long_branch_v4t_thumb_arm_pic) // V4T.
4318 // non-PIC stubs.
4319 : ((may_use_blx
4320 && (r_type == elfcpp::R_ARM_THM_CALL))
4321 ? arm_stub_long_branch_any_any // V5T and above.
4322 : arm_stub_long_branch_v4t_thumb_arm); // V4T.
4324 // Handle v4t short branches.
4325 if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
4326 && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
4327 && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
4328 stub_type = arm_stub_short_branch_v4t_thumb_arm;
4332 else if (r_type == elfcpp::R_ARM_CALL
4333 || r_type == elfcpp::R_ARM_JUMP24
4334 || r_type == elfcpp::R_ARM_PLT32)
4336 branch_offset = static_cast<int64_t>(destination) - location;
4337 if (target_is_thumb)
4339 // Arm to thumb.
4341 // FIXME: We should check that the input section is from an
4342 // object that has interwork enabled.
4344 // We have an extra 2-bytes reach because of
4345 // the mode change (bit 24 (H) of BLX encoding).
4346 if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
4347 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
4348 || ((r_type == elfcpp::R_ARM_CALL) && !may_use_blx)
4349 || (r_type == elfcpp::R_ARM_JUMP24)
4350 || (r_type == elfcpp::R_ARM_PLT32))
4352 stub_type = (parameters->options().shared()
4353 || should_force_pic_veneer)
4354 // PIC stubs.
4355 ? (may_use_blx
4356 ? arm_stub_long_branch_any_thumb_pic// V5T and above.
4357 : arm_stub_long_branch_v4t_arm_thumb_pic) // V4T stub.
4359 // non-PIC stubs.
4360 : (may_use_blx
4361 ? arm_stub_long_branch_any_any // V5T and above.
4362 : arm_stub_long_branch_v4t_arm_thumb); // V4T.
4365 else
4367 // Arm to arm.
4368 if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
4369 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
4371 stub_type = (parameters->options().shared()
4372 || should_force_pic_veneer)
4373 ? arm_stub_long_branch_any_arm_pic // PIC stubs.
4374 : arm_stub_long_branch_any_any; /// non-PIC.
4379 return stub_type;
4382 // Cortex_a8_stub methods.
4384 // Return the instruction for a THUMB16_SPECIAL_TYPE instruction template.
4385 // I is the position of the instruction template in the stub template.
4387 uint16_t
4388 Cortex_a8_stub::do_thumb16_special(size_t i)
4390 // The only use of this is to copy condition code from a conditional
4391 // branch being worked around to the corresponding conditional branch in
4392 // to the stub.
4393 gold_assert(this->stub_template()->type() == arm_stub_a8_veneer_b_cond
4394 && i == 0);
4395 uint16_t data = this->stub_template()->insns()[i].data();
4396 gold_assert((data & 0xff00U) == 0xd000U);
4397 data |= ((this->original_insn_ >> 22) & 0xf) << 8;
4398 return data;
4401 // Stub_factory methods.
4403 Stub_factory::Stub_factory()
4405 // The instruction template sequences are declared as static
4406 // objects and initialized first time the constructor runs.
4408 // Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
4409 // to reach the stub if necessary.
4410 static const Insn_template elf32_arm_stub_long_branch_any_any[] =
4412 Insn_template::arm_insn(0xe51ff004), // ldr pc, [pc, #-4]
4413 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4414 // dcd R_ARM_ABS32(X)
4417 // V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
4418 // available.
4419 static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb[] =
4421 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
4422 Insn_template::arm_insn(0xe12fff1c), // bx ip
4423 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4424 // dcd R_ARM_ABS32(X)
4427 // Thumb -> Thumb long branch stub. Used on M-profile architectures.
4428 static const Insn_template elf32_arm_stub_long_branch_thumb_only[] =
4430 Insn_template::thumb16_insn(0xb401), // push {r0}
4431 Insn_template::thumb16_insn(0x4802), // ldr r0, [pc, #8]
4432 Insn_template::thumb16_insn(0x4684), // mov ip, r0
4433 Insn_template::thumb16_insn(0xbc01), // pop {r0}
4434 Insn_template::thumb16_insn(0x4760), // bx ip
4435 Insn_template::thumb16_insn(0xbf00), // nop
4436 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4437 // dcd R_ARM_ABS32(X)
4440 // V4T Thumb -> Thumb long branch stub. Using the stack is not
4441 // allowed.
4442 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb[] =
4444 Insn_template::thumb16_insn(0x4778), // bx pc
4445 Insn_template::thumb16_insn(0x46c0), // nop
4446 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
4447 Insn_template::arm_insn(0xe12fff1c), // bx ip
4448 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4449 // dcd R_ARM_ABS32(X)
4452 // V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
4453 // available.
4454 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm[] =
4456 Insn_template::thumb16_insn(0x4778), // bx pc
4457 Insn_template::thumb16_insn(0x46c0), // nop
4458 Insn_template::arm_insn(0xe51ff004), // ldr pc, [pc, #-4]
4459 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
4460 // dcd R_ARM_ABS32(X)
4463 // V4T Thumb -> ARM short branch stub. Shorter variant of the above
4464 // one, when the destination is close enough.
4465 static const Insn_template elf32_arm_stub_short_branch_v4t_thumb_arm[] =
4467 Insn_template::thumb16_insn(0x4778), // bx pc
4468 Insn_template::thumb16_insn(0x46c0), // nop
4469 Insn_template::arm_rel_insn(0xea000000, -8), // b (X-8)
4472 // ARM/Thumb -> ARM long branch stub, PIC. On V5T and above, use
4473 // blx to reach the stub if necessary.
4474 static const Insn_template elf32_arm_stub_long_branch_any_arm_pic[] =
4476 Insn_template::arm_insn(0xe59fc000), // ldr r12, [pc]
4477 Insn_template::arm_insn(0xe08ff00c), // add pc, pc, ip
4478 Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
4479 // dcd R_ARM_REL32(X-4)
4482 // ARM/Thumb -> Thumb long branch stub, PIC. On V5T and above, use
4483 // blx to reach the stub if necessary. We can not add into pc;
4484 // it is not guaranteed to mode switch (different in ARMv6 and
4485 // ARMv7).
4486 static const Insn_template elf32_arm_stub_long_branch_any_thumb_pic[] =
4488 Insn_template::arm_insn(0xe59fc004), // ldr r12, [pc, #4]
4489 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
4490 Insn_template::arm_insn(0xe12fff1c), // bx ip
4491 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4492 // dcd R_ARM_REL32(X)
4495 // V4T ARM -> ARM long branch stub, PIC.
4496 static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb_pic[] =
4498 Insn_template::arm_insn(0xe59fc004), // ldr ip, [pc, #4]
4499 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
4500 Insn_template::arm_insn(0xe12fff1c), // bx ip
4501 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4502 // dcd R_ARM_REL32(X)
4505 // V4T Thumb -> ARM long branch stub, PIC.
4506 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm_pic[] =
4508 Insn_template::thumb16_insn(0x4778), // bx pc
4509 Insn_template::thumb16_insn(0x46c0), // nop
4510 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
4511 Insn_template::arm_insn(0xe08cf00f), // add pc, ip, pc
4512 Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
4513 // dcd R_ARM_REL32(X)
4516 // Thumb -> Thumb long branch stub, PIC. Used on M-profile
4517 // architectures.
4518 static const Insn_template elf32_arm_stub_long_branch_thumb_only_pic[] =
4520 Insn_template::thumb16_insn(0xb401), // push {r0}
4521 Insn_template::thumb16_insn(0x4802), // ldr r0, [pc, #8]
4522 Insn_template::thumb16_insn(0x46fc), // mov ip, pc
4523 Insn_template::thumb16_insn(0x4484), // add ip, r0
4524 Insn_template::thumb16_insn(0xbc01), // pop {r0}
4525 Insn_template::thumb16_insn(0x4760), // bx ip
4526 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 4),
4527 // dcd R_ARM_REL32(X)
4530 // V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
4531 // allowed.
4532 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb_pic[] =
4534 Insn_template::thumb16_insn(0x4778), // bx pc
4535 Insn_template::thumb16_insn(0x46c0), // nop
4536 Insn_template::arm_insn(0xe59fc004), // ldr ip, [pc, #4]
4537 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
4538 Insn_template::arm_insn(0xe12fff1c), // bx ip
4539 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
4540 // dcd R_ARM_REL32(X)
4543 // Cortex-A8 erratum-workaround stubs.
4545 // Stub used for conditional branches (which may be beyond +/-1MB away,
4546 // so we can't use a conditional branch to reach this stub).
4548 // original code:
4550 // b<cond> X
4551 // after:
4553 static const Insn_template elf32_arm_stub_a8_veneer_b_cond[] =
4555 Insn_template::thumb16_bcond_insn(0xd001), // b<cond>.n true
4556 Insn_template::thumb32_b_insn(0xf000b800, -4), // b.w after
4557 Insn_template::thumb32_b_insn(0xf000b800, -4) // true:
4558 // b.w X
4561 // Stub used for b.w and bl.w instructions.
4563 static const Insn_template elf32_arm_stub_a8_veneer_b[] =
4565 Insn_template::thumb32_b_insn(0xf000b800, -4) // b.w dest
4568 static const Insn_template elf32_arm_stub_a8_veneer_bl[] =
4570 Insn_template::thumb32_b_insn(0xf000b800, -4) // b.w dest
4573 // Stub used for Thumb-2 blx.w instructions. We modified the original blx.w
4574 // instruction (which switches to ARM mode) to point to this stub. Jump to
4575 // the real destination using an ARM-mode branch.
4576 static const Insn_template elf32_arm_stub_a8_veneer_blx[] =
4578 Insn_template::arm_rel_insn(0xea000000, -8) // b dest
4581 // Stub used to provide an interworking for R_ARM_V4BX relocation
4582 // (bx r[n] instruction).
4583 static const Insn_template elf32_arm_stub_v4_veneer_bx[] =
4585 Insn_template::arm_insn(0xe3100001), // tst r<n>, #1
4586 Insn_template::arm_insn(0x01a0f000), // moveq pc, r<n>
4587 Insn_template::arm_insn(0xe12fff10) // bx r<n>
4590 // Fill in the stub template look-up table. Stub templates are constructed
4591 // per instance of Stub_factory for fast look-up without locking
4592 // in a thread-enabled environment.
4594 this->stub_templates_[arm_stub_none] =
4595 new Stub_template(arm_stub_none, NULL, 0);
4597 #define DEF_STUB(x) \
4598 do \
4600 size_t array_size \
4601 = sizeof(elf32_arm_stub_##x) / sizeof(elf32_arm_stub_##x[0]); \
4602 Stub_type type = arm_stub_##x; \
4603 this->stub_templates_[type] = \
4604 new Stub_template(type, elf32_arm_stub_##x, array_size); \
4606 while (0);
4608 DEF_STUBS
4609 #undef DEF_STUB
4612 // Stub_table methods.
4614 // Removel all Cortex-A8 stub.
4616 template<bool big_endian>
4617 void
4618 Stub_table<big_endian>::remove_all_cortex_a8_stubs()
4620 for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
4621 p != this->cortex_a8_stubs_.end();
4622 ++p)
4623 delete p->second;
4624 this->cortex_a8_stubs_.clear();
4627 // Relocate one stub. This is a helper for Stub_table::relocate_stubs().
4629 template<bool big_endian>
4630 void
4631 Stub_table<big_endian>::relocate_stub(
4632 Stub* stub,
4633 const Relocate_info<32, big_endian>* relinfo,
4634 Target_arm<big_endian>* arm_target,
4635 Output_section* output_section,
4636 unsigned char* view,
4637 Arm_address address,
4638 section_size_type view_size)
4640 const Stub_template* stub_template = stub->stub_template();
4641 if (stub_template->reloc_count() != 0)
4643 // Adjust view to cover the stub only.
4644 section_size_type offset = stub->offset();
4645 section_size_type stub_size = stub_template->size();
4646 gold_assert(offset + stub_size <= view_size);
4648 arm_target->relocate_stub(stub, relinfo, output_section, view + offset,
4649 address + offset, stub_size);
4653 // Relocate all stubs in this stub table.
4655 template<bool big_endian>
4656 void
4657 Stub_table<big_endian>::relocate_stubs(
4658 const Relocate_info<32, big_endian>* relinfo,
4659 Target_arm<big_endian>* arm_target,
4660 Output_section* output_section,
4661 unsigned char* view,
4662 Arm_address address,
4663 section_size_type view_size)
4665 // If we are passed a view bigger than the stub table's. we need to
4666 // adjust the view.
4667 gold_assert(address == this->address()
4668 && (view_size
4669 == static_cast<section_size_type>(this->data_size())));
4671 // Relocate all relocation stubs.
4672 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
4673 p != this->reloc_stubs_.end();
4674 ++p)
4675 this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
4676 address, view_size);
4678 // Relocate all Cortex-A8 stubs.
4679 for (Cortex_a8_stub_list::iterator p = this->cortex_a8_stubs_.begin();
4680 p != this->cortex_a8_stubs_.end();
4681 ++p)
4682 this->relocate_stub(p->second, relinfo, arm_target, output_section, view,
4683 address, view_size);
4685 // Relocate all ARM V4BX stubs.
4686 for (Arm_v4bx_stub_list::iterator p = this->arm_v4bx_stubs_.begin();
4687 p != this->arm_v4bx_stubs_.end();
4688 ++p)
4690 if (*p != NULL)
4691 this->relocate_stub(*p, relinfo, arm_target, output_section, view,
4692 address, view_size);
4696 // Write out the stubs to file.
4698 template<bool big_endian>
4699 void
4700 Stub_table<big_endian>::do_write(Output_file* of)
4702 off_t offset = this->offset();
4703 const section_size_type oview_size =
4704 convert_to_section_size_type(this->data_size());
4705 unsigned char* const oview = of->get_output_view(offset, oview_size);
4707 // Write relocation stubs.
4708 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
4709 p != this->reloc_stubs_.end();
4710 ++p)
4712 Reloc_stub* stub = p->second;
4713 Arm_address address = this->address() + stub->offset();
4714 gold_assert(address
4715 == align_address(address,
4716 stub->stub_template()->alignment()));
4717 stub->write(oview + stub->offset(), stub->stub_template()->size(),
4718 big_endian);
4721 // Write Cortex-A8 stubs.
4722 for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
4723 p != this->cortex_a8_stubs_.end();
4724 ++p)
4726 Cortex_a8_stub* stub = p->second;
4727 Arm_address address = this->address() + stub->offset();
4728 gold_assert(address
4729 == align_address(address,
4730 stub->stub_template()->alignment()));
4731 stub->write(oview + stub->offset(), stub->stub_template()->size(),
4732 big_endian);
4735 // Write ARM V4BX relocation stubs.
4736 for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
4737 p != this->arm_v4bx_stubs_.end();
4738 ++p)
4740 if (*p == NULL)
4741 continue;
4743 Arm_address address = this->address() + (*p)->offset();
4744 gold_assert(address
4745 == align_address(address,
4746 (*p)->stub_template()->alignment()));
4747 (*p)->write(oview + (*p)->offset(), (*p)->stub_template()->size(),
4748 big_endian);
4751 of->write_output_view(this->offset(), oview_size, oview);
4754 // Update the data size and address alignment of the stub table at the end
4755 // of a relaxation pass. Return true if either the data size or the
4756 // alignment changed in this relaxation pass.
4758 template<bool big_endian>
4759 bool
4760 Stub_table<big_endian>::update_data_size_and_addralign()
4762 // Go over all stubs in table to compute data size and address alignment.
4763 off_t size = this->reloc_stubs_size_;
4764 unsigned addralign = this->reloc_stubs_addralign_;
4766 for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
4767 p != this->cortex_a8_stubs_.end();
4768 ++p)
4770 const Stub_template* stub_template = p->second->stub_template();
4771 addralign = std::max(addralign, stub_template->alignment());
4772 size = (align_address(size, stub_template->alignment())
4773 + stub_template->size());
4776 for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
4777 p != this->arm_v4bx_stubs_.end();
4778 ++p)
4780 if (*p == NULL)
4781 continue;
4783 const Stub_template* stub_template = (*p)->stub_template();
4784 addralign = std::max(addralign, stub_template->alignment());
4785 size = (align_address(size, stub_template->alignment())
4786 + stub_template->size());
4789 // Check if either data size or alignment changed in this pass.
4790 // Update prev_data_size_ and prev_addralign_. These will be used
4791 // as the current data size and address alignment for the next pass.
4792 bool changed = size != this->prev_data_size_;
4793 this->prev_data_size_ = size;
4795 if (addralign != this->prev_addralign_)
4796 changed = true;
4797 this->prev_addralign_ = addralign;
4799 return changed;
4802 // Finalize the stubs. This sets the offsets of the stubs within the stub
4803 // table. It also marks all input sections needing Cortex-A8 workaround.
4805 template<bool big_endian>
4806 void
4807 Stub_table<big_endian>::finalize_stubs()
4809 off_t off = this->reloc_stubs_size_;
4810 for (Cortex_a8_stub_list::const_iterator p = this->cortex_a8_stubs_.begin();
4811 p != this->cortex_a8_stubs_.end();
4812 ++p)
4814 Cortex_a8_stub* stub = p->second;
4815 const Stub_template* stub_template = stub->stub_template();
4816 uint64_t stub_addralign = stub_template->alignment();
4817 off = align_address(off, stub_addralign);
4818 stub->set_offset(off);
4819 off += stub_template->size();
4821 // Mark input section so that we can determine later if a code section
4822 // needs the Cortex-A8 workaround quickly.
4823 Arm_relobj<big_endian>* arm_relobj =
4824 Arm_relobj<big_endian>::as_arm_relobj(stub->relobj());
4825 arm_relobj->mark_section_for_cortex_a8_workaround(stub->shndx());
4828 for (Arm_v4bx_stub_list::const_iterator p = this->arm_v4bx_stubs_.begin();
4829 p != this->arm_v4bx_stubs_.end();
4830 ++p)
4832 if (*p == NULL)
4833 continue;
4835 const Stub_template* stub_template = (*p)->stub_template();
4836 uint64_t stub_addralign = stub_template->alignment();
4837 off = align_address(off, stub_addralign);
4838 (*p)->set_offset(off);
4839 off += stub_template->size();
4842 gold_assert(off <= this->prev_data_size_);
4845 // Apply Cortex-A8 workaround to an address range between VIEW_ADDRESS
4846 // and VIEW_ADDRESS + VIEW_SIZE - 1. VIEW points to the mapped address
4847 // of the address range seen by the linker.
4849 template<bool big_endian>
4850 void
4851 Stub_table<big_endian>::apply_cortex_a8_workaround_to_address_range(
4852 Target_arm<big_endian>* arm_target,
4853 unsigned char* view,
4854 Arm_address view_address,
4855 section_size_type view_size)
4857 // Cortex-A8 stubs are sorted by addresses of branches being fixed up.
4858 for (Cortex_a8_stub_list::const_iterator p =
4859 this->cortex_a8_stubs_.lower_bound(view_address);
4860 ((p != this->cortex_a8_stubs_.end())
4861 && (p->first < (view_address + view_size)));
4862 ++p)
4864 // We do not store the THUMB bit in the LSB of either the branch address
4865 // or the stub offset. There is no need to strip the LSB.
4866 Arm_address branch_address = p->first;
4867 const Cortex_a8_stub* stub = p->second;
4868 Arm_address stub_address = this->address() + stub->offset();
4870 // Offset of the branch instruction relative to this view.
4871 section_size_type offset =
4872 convert_to_section_size_type(branch_address - view_address);
4873 gold_assert((offset + 4) <= view_size);
4875 arm_target->apply_cortex_a8_workaround(stub, stub_address,
4876 view + offset, branch_address);
4880 // Arm_input_section methods.
4882 // Initialize an Arm_input_section.
4884 template<bool big_endian>
4885 void
4886 Arm_input_section<big_endian>::init()
4888 Relobj* relobj = this->relobj();
4889 unsigned int shndx = this->shndx();
4891 // Cache these to speed up size and alignment queries. It is too slow
4892 // to call section_addraglin and section_size every time.
4893 this->original_addralign_ = relobj->section_addralign(shndx);
4894 this->original_size_ = relobj->section_size(shndx);
4896 // We want to make this look like the original input section after
4897 // output sections are finalized.
4898 Output_section* os = relobj->output_section(shndx);
4899 off_t offset = relobj->output_section_offset(shndx);
4900 gold_assert(os != NULL && !relobj->is_output_section_offset_invalid(shndx));
4901 this->set_address(os->address() + offset);
4902 this->set_file_offset(os->offset() + offset);
4904 this->set_current_data_size(this->original_size_);
4905 this->finalize_data_size();
4908 template<bool big_endian>
4909 void
4910 Arm_input_section<big_endian>::do_write(Output_file* of)
4912 // We have to write out the original section content.
4913 section_size_type section_size;
4914 const unsigned char* section_contents =
4915 this->relobj()->section_contents(this->shndx(), &section_size, false);
4916 of->write(this->offset(), section_contents, section_size);
4918 // If this owns a stub table and it is not empty, write it.
4919 if (this->is_stub_table_owner() && !this->stub_table_->empty())
4920 this->stub_table_->write(of);
4923 // Finalize data size.
4925 template<bool big_endian>
4926 void
4927 Arm_input_section<big_endian>::set_final_data_size()
4929 // If this owns a stub table, finalize its data size as well.
4930 if (this->is_stub_table_owner())
4932 uint64_t address = this->address();
4934 // The stub table comes after the original section contents.
4935 address += this->original_size_;
4936 address = align_address(address, this->stub_table_->addralign());
4937 off_t offset = this->offset() + (address - this->address());
4938 this->stub_table_->set_address_and_file_offset(address, offset);
4939 address += this->stub_table_->data_size();
4940 gold_assert(address == this->address() + this->current_data_size());
4943 this->set_data_size(this->current_data_size());
4946 // Reset address and file offset.
4948 template<bool big_endian>
4949 void
4950 Arm_input_section<big_endian>::do_reset_address_and_file_offset()
4952 // Size of the original input section contents.
4953 off_t off = convert_types<off_t, uint64_t>(this->original_size_);
4955 // If this is a stub table owner, account for the stub table size.
4956 if (this->is_stub_table_owner())
4958 Stub_table<big_endian>* stub_table = this->stub_table_;
4960 // Reset the stub table's address and file offset. The
4961 // current data size for child will be updated after that.
4962 stub_table_->reset_address_and_file_offset();
4963 off = align_address(off, stub_table_->addralign());
4964 off += stub_table->current_data_size();
4967 this->set_current_data_size(off);
4970 // Arm_exidx_cantunwind methods.
4972 // Write this to Output file OF for a fixed endianity.
4974 template<bool big_endian>
4975 void
4976 Arm_exidx_cantunwind::do_fixed_endian_write(Output_file* of)
4978 off_t offset = this->offset();
4979 const section_size_type oview_size = 8;
4980 unsigned char* const oview = of->get_output_view(offset, oview_size);
4982 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
4983 Valtype* wv = reinterpret_cast<Valtype*>(oview);
4985 Output_section* os = this->relobj_->output_section(this->shndx_);
4986 gold_assert(os != NULL);
4988 Arm_relobj<big_endian>* arm_relobj =
4989 Arm_relobj<big_endian>::as_arm_relobj(this->relobj_);
4990 Arm_address output_offset =
4991 arm_relobj->get_output_section_offset(this->shndx_);
4992 Arm_address section_start;
4993 if(output_offset != Arm_relobj<big_endian>::invalid_address)
4994 section_start = os->address() + output_offset;
4995 else
4997 // Currently this only happens for a relaxed section.
4998 const Output_relaxed_input_section* poris =
4999 os->find_relaxed_input_section(this->relobj_, this->shndx_);
5000 gold_assert(poris != NULL);
5001 section_start = poris->address();
5004 // We always append this to the end of an EXIDX section.
5005 Arm_address output_address =
5006 section_start + this->relobj_->section_size(this->shndx_);
5008 // Write out the entry. The first word either points to the beginning
5009 // or after the end of a text section. The second word is the special
5010 // EXIDX_CANTUNWIND value.
5011 uint32_t prel31_offset = output_address - this->address();
5012 if (utils::has_overflow<31>(offset))
5013 gold_error(_("PREL31 overflow in EXIDX_CANTUNWIND entry"));
5014 elfcpp::Swap<32, big_endian>::writeval(wv, prel31_offset & 0x7fffffffU);
5015 elfcpp::Swap<32, big_endian>::writeval(wv + 1, elfcpp::EXIDX_CANTUNWIND);
5017 of->write_output_view(this->offset(), oview_size, oview);
5020 // Arm_exidx_merged_section methods.
5022 // Constructor for Arm_exidx_merged_section.
5023 // EXIDX_INPUT_SECTION points to the unmodified EXIDX input section.
5024 // SECTION_OFFSET_MAP points to a section offset map describing how
5025 // parts of the input section are mapped to output. DELETED_BYTES is
5026 // the number of bytes deleted from the EXIDX input section.
5028 Arm_exidx_merged_section::Arm_exidx_merged_section(
5029 const Arm_exidx_input_section& exidx_input_section,
5030 const Arm_exidx_section_offset_map& section_offset_map,
5031 uint32_t deleted_bytes)
5032 : Output_relaxed_input_section(exidx_input_section.relobj(),
5033 exidx_input_section.shndx(),
5034 exidx_input_section.addralign()),
5035 exidx_input_section_(exidx_input_section),
5036 section_offset_map_(section_offset_map)
5038 // Fix size here so that we do not need to implement set_final_data_size.
5039 this->set_data_size(exidx_input_section.size() - deleted_bytes);
5040 this->fix_data_size();
5043 // Given an input OBJECT, an input section index SHNDX within that
5044 // object, and an OFFSET relative to the start of that input
5045 // section, return whether or not the corresponding offset within
5046 // the output section is known. If this function returns true, it
5047 // sets *POUTPUT to the output offset. The value -1 indicates that
5048 // this input offset is being discarded.
5050 bool
5051 Arm_exidx_merged_section::do_output_offset(
5052 const Relobj* relobj,
5053 unsigned int shndx,
5054 section_offset_type offset,
5055 section_offset_type* poutput) const
5057 // We only handle offsets for the original EXIDX input section.
5058 if (relobj != this->exidx_input_section_.relobj()
5059 || shndx != this->exidx_input_section_.shndx())
5060 return false;
5062 section_offset_type section_size =
5063 convert_types<section_offset_type>(this->exidx_input_section_.size());
5064 if (offset < 0 || offset >= section_size)
5065 // Input offset is out of valid range.
5066 *poutput = -1;
5067 else
5069 // We need to look up the section offset map to determine the output
5070 // offset. Find the reference point in map that is first offset
5071 // bigger than or equal to this offset.
5072 Arm_exidx_section_offset_map::const_iterator p =
5073 this->section_offset_map_.lower_bound(offset);
5075 // The section offset maps are build such that this should not happen if
5076 // input offset is in the valid range.
5077 gold_assert(p != this->section_offset_map_.end());
5079 // We need to check if this is dropped.
5080 section_offset_type ref = p->first;
5081 section_offset_type mapped_ref = p->second;
5083 if (mapped_ref != Arm_exidx_input_section::invalid_offset)
5084 // Offset is present in output.
5085 *poutput = mapped_ref + (offset - ref);
5086 else
5087 // Offset is discarded owing to EXIDX entry merging.
5088 *poutput = -1;
5091 return true;
5094 // Write this to output file OF.
5096 void
5097 Arm_exidx_merged_section::do_write(Output_file* of)
5099 // If we retain or discard the whole EXIDX input section, we would
5100 // not be here.
5101 gold_assert(this->data_size() != this->exidx_input_section_.size()
5102 && this->data_size() != 0);
5104 off_t offset = this->offset();
5105 const section_size_type oview_size = this->data_size();
5106 unsigned char* const oview = of->get_output_view(offset, oview_size);
5108 Output_section* os = this->relobj()->output_section(this->shndx());
5109 gold_assert(os != NULL);
5111 // Get contents of EXIDX input section.
5112 section_size_type section_size;
5113 const unsigned char* section_contents =
5114 this->relobj()->section_contents(this->shndx(), &section_size, false);
5115 gold_assert(section_size == this->exidx_input_section_.size());
5117 // Go over spans of input offsets and write only those that are not
5118 // discarded.
5119 section_offset_type in_start = 0;
5120 section_offset_type out_start = 0;
5121 for(Arm_exidx_section_offset_map::const_iterator p =
5122 this->section_offset_map_.begin();
5123 p != this->section_offset_map_.end();
5124 ++p)
5126 section_offset_type in_end = p->first;
5127 gold_assert(in_end >= in_start);
5128 section_offset_type out_end = p->second;
5129 size_t in_chunk_size = convert_types<size_t>(in_end - in_start + 1);
5130 if (out_end != -1)
5132 size_t out_chunk_size =
5133 convert_types<size_t>(out_end - out_start + 1);
5134 gold_assert(out_chunk_size == in_chunk_size);
5135 memcpy(oview + out_start, section_contents + in_start,
5136 out_chunk_size);
5137 out_start += out_chunk_size;
5139 in_start += in_chunk_size;
5142 gold_assert(convert_to_section_size_type(out_start) == oview_size);
5143 of->write_output_view(this->offset(), oview_size, oview);
5146 // Arm_exidx_fixup methods.
5148 // Append an EXIDX_CANTUNWIND in the current output section if the last entry
5149 // is not an EXIDX_CANTUNWIND entry already. The new EXIDX_CANTUNWIND entry
5150 // points to the end of the last seen EXIDX section.
5152 void
5153 Arm_exidx_fixup::add_exidx_cantunwind_as_needed()
5155 if (this->last_unwind_type_ != UT_EXIDX_CANTUNWIND
5156 && this->last_input_section_ != NULL)
5158 Relobj* relobj = this->last_input_section_->relobj();
5159 unsigned int text_shndx = this->last_input_section_->link();
5160 Arm_exidx_cantunwind* cantunwind =
5161 new Arm_exidx_cantunwind(relobj, text_shndx);
5162 this->exidx_output_section_->add_output_section_data(cantunwind);
5163 this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5167 // Process an EXIDX section entry in input. Return whether this entry
5168 // can be deleted in the output. SECOND_WORD in the second word of the
5169 // EXIDX entry.
5171 bool
5172 Arm_exidx_fixup::process_exidx_entry(uint32_t second_word)
5174 bool delete_entry;
5175 if (second_word == elfcpp::EXIDX_CANTUNWIND)
5177 // Merge if previous entry is also an EXIDX_CANTUNWIND.
5178 delete_entry = this->last_unwind_type_ == UT_EXIDX_CANTUNWIND;
5179 this->last_unwind_type_ = UT_EXIDX_CANTUNWIND;
5181 else if ((second_word & 0x80000000) != 0)
5183 // Inlined unwinding data. Merge if equal to previous.
5184 delete_entry = (this->last_unwind_type_ == UT_INLINED_ENTRY
5185 && this->last_inlined_entry_ == second_word);
5186 this->last_unwind_type_ = UT_INLINED_ENTRY;
5187 this->last_inlined_entry_ = second_word;
5189 else
5191 // Normal table entry. In theory we could merge these too,
5192 // but duplicate entries are likely to be much less common.
5193 delete_entry = false;
5194 this->last_unwind_type_ = UT_NORMAL_ENTRY;
5196 return delete_entry;
5199 // Update the current section offset map during EXIDX section fix-up.
5200 // If there is no map, create one. INPUT_OFFSET is the offset of a
5201 // reference point, DELETED_BYTES is the number of deleted by in the
5202 // section so far. If DELETE_ENTRY is true, the reference point and
5203 // all offsets after the previous reference point are discarded.
5205 void
5206 Arm_exidx_fixup::update_offset_map(
5207 section_offset_type input_offset,
5208 section_size_type deleted_bytes,
5209 bool delete_entry)
5211 if (this->section_offset_map_ == NULL)
5212 this->section_offset_map_ = new Arm_exidx_section_offset_map();
5213 section_offset_type output_offset;
5214 if (delete_entry)
5215 output_offset = Arm_exidx_input_section::invalid_offset;
5216 else
5217 output_offset = input_offset - deleted_bytes;
5218 (*this->section_offset_map_)[input_offset] = output_offset;
5221 // Process EXIDX_INPUT_SECTION for EXIDX entry merging. Return the number of
5222 // bytes deleted. If some entries are merged, also store a pointer to a newly
5223 // created Arm_exidx_section_offset_map object in *PSECTION_OFFSET_MAP. The
5224 // caller owns the map and is responsible for releasing it after use.
5226 template<bool big_endian>
5227 uint32_t
5228 Arm_exidx_fixup::process_exidx_section(
5229 const Arm_exidx_input_section* exidx_input_section,
5230 Arm_exidx_section_offset_map** psection_offset_map)
5232 Relobj* relobj = exidx_input_section->relobj();
5233 unsigned shndx = exidx_input_section->shndx();
5234 section_size_type section_size;
5235 const unsigned char* section_contents =
5236 relobj->section_contents(shndx, &section_size, false);
5238 if ((section_size % 8) != 0)
5240 // Something is wrong with this section. Better not touch it.
5241 gold_error(_("uneven .ARM.exidx section size in %s section %u"),
5242 relobj->name().c_str(), shndx);
5243 this->last_input_section_ = exidx_input_section;
5244 this->last_unwind_type_ = UT_NONE;
5245 return 0;
5248 uint32_t deleted_bytes = 0;
5249 bool prev_delete_entry = false;
5250 gold_assert(this->section_offset_map_ == NULL);
5252 for (section_size_type i = 0; i < section_size; i += 8)
5254 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
5255 const Valtype* wv =
5256 reinterpret_cast<const Valtype*>(section_contents + i + 4);
5257 uint32_t second_word = elfcpp::Swap<32, big_endian>::readval(wv);
5259 bool delete_entry = this->process_exidx_entry(second_word);
5261 // Entry deletion causes changes in output offsets. We use a std::map
5262 // to record these. And entry (x, y) means input offset x
5263 // is mapped to output offset y. If y is invalid_offset, then x is
5264 // dropped in the output. Because of the way std::map::lower_bound
5265 // works, we record the last offset in a region w.r.t to keeping or
5266 // dropping. If there is no entry (x0, y0) for an input offset x0,
5267 // the output offset y0 of it is determined by the output offset y1 of
5268 // the smallest input offset x1 > x0 that there is an (x1, y1) entry
5269 // in the map. If y1 is not -1, then y0 = y1 + x0 - x1. Othewise, y1
5270 // y0 is also -1.
5271 if (delete_entry != prev_delete_entry && i != 0)
5272 this->update_offset_map(i - 1, deleted_bytes, prev_delete_entry);
5274 // Update total deleted bytes for this entry.
5275 if (delete_entry)
5276 deleted_bytes += 8;
5278 prev_delete_entry = delete_entry;
5281 // If section offset map is not NULL, make an entry for the end of
5282 // section.
5283 if (this->section_offset_map_ != NULL)
5284 update_offset_map(section_size - 1, deleted_bytes, prev_delete_entry);
5286 *psection_offset_map = this->section_offset_map_;
5287 this->section_offset_map_ = NULL;
5288 this->last_input_section_ = exidx_input_section;
5290 // Set the first output text section so that we can link the EXIDX output
5291 // section to it. Ignore any EXIDX input section that is completely merged.
5292 if (this->first_output_text_section_ == NULL
5293 && deleted_bytes != section_size)
5295 unsigned int link = exidx_input_section->link();
5296 Output_section* os = relobj->output_section(link);
5297 gold_assert(os != NULL);
5298 this->first_output_text_section_ = os;
5301 return deleted_bytes;
5304 // Arm_output_section methods.
5306 // Create a stub group for input sections from BEGIN to END. OWNER
5307 // points to the input section to be the owner a new stub table.
5309 template<bool big_endian>
5310 void
5311 Arm_output_section<big_endian>::create_stub_group(
5312 Input_section_list::const_iterator begin,
5313 Input_section_list::const_iterator end,
5314 Input_section_list::const_iterator owner,
5315 Target_arm<big_endian>* target,
5316 std::vector<Output_relaxed_input_section*>* new_relaxed_sections)
5318 // We use a different kind of relaxed section in an EXIDX section.
5319 // The static casting from Output_relaxed_input_section to
5320 // Arm_input_section is invalid in an EXIDX section. We are okay
5321 // because we should not be calling this for an EXIDX section.
5322 gold_assert(this->type() != elfcpp::SHT_ARM_EXIDX);
5324 // Currently we convert ordinary input sections into relaxed sections only
5325 // at this point but we may want to support creating relaxed input section
5326 // very early. So we check here to see if owner is already a relaxed
5327 // section.
5329 Arm_input_section<big_endian>* arm_input_section;
5330 if (owner->is_relaxed_input_section())
5332 arm_input_section =
5333 Arm_input_section<big_endian>::as_arm_input_section(
5334 owner->relaxed_input_section());
5336 else
5338 gold_assert(owner->is_input_section());
5339 // Create a new relaxed input section.
5340 arm_input_section =
5341 target->new_arm_input_section(owner->relobj(), owner->shndx());
5342 new_relaxed_sections->push_back(arm_input_section);
5345 // Create a stub table.
5346 Stub_table<big_endian>* stub_table =
5347 target->new_stub_table(arm_input_section);
5349 arm_input_section->set_stub_table(stub_table);
5351 Input_section_list::const_iterator p = begin;
5352 Input_section_list::const_iterator prev_p;
5354 // Look for input sections or relaxed input sections in [begin ... end].
5357 if (p->is_input_section() || p->is_relaxed_input_section())
5359 // The stub table information for input sections live
5360 // in their objects.
5361 Arm_relobj<big_endian>* arm_relobj =
5362 Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
5363 arm_relobj->set_stub_table(p->shndx(), stub_table);
5365 prev_p = p++;
5367 while (prev_p != end);
5370 // Group input sections for stub generation. GROUP_SIZE is roughly the limit
5371 // of stub groups. We grow a stub group by adding input section until the
5372 // size is just below GROUP_SIZE. The last input section will be converted
5373 // into a stub table. If STUB_ALWAYS_AFTER_BRANCH is false, we also add
5374 // input section after the stub table, effectively double the group size.
5376 // This is similar to the group_sections() function in elf32-arm.c but is
5377 // implemented differently.
5379 template<bool big_endian>
5380 void
5381 Arm_output_section<big_endian>::group_sections(
5382 section_size_type group_size,
5383 bool stubs_always_after_branch,
5384 Target_arm<big_endian>* target)
5386 // We only care about sections containing code.
5387 if ((this->flags() & elfcpp::SHF_EXECINSTR) == 0)
5388 return;
5390 // States for grouping.
5391 typedef enum
5393 // No group is being built.
5394 NO_GROUP,
5395 // A group is being built but the stub table is not found yet.
5396 // We keep group a stub group until the size is just under GROUP_SIZE.
5397 // The last input section in the group will be used as the stub table.
5398 FINDING_STUB_SECTION,
5399 // A group is being built and we have already found a stub table.
5400 // We enter this state to grow a stub group by adding input section
5401 // after the stub table. This effectively doubles the group size.
5402 HAS_STUB_SECTION
5403 } State;
5405 // Any newly created relaxed sections are stored here.
5406 std::vector<Output_relaxed_input_section*> new_relaxed_sections;
5408 State state = NO_GROUP;
5409 section_size_type off = 0;
5410 section_size_type group_begin_offset = 0;
5411 section_size_type group_end_offset = 0;
5412 section_size_type stub_table_end_offset = 0;
5413 Input_section_list::const_iterator group_begin =
5414 this->input_sections().end();
5415 Input_section_list::const_iterator stub_table =
5416 this->input_sections().end();
5417 Input_section_list::const_iterator group_end = this->input_sections().end();
5418 for (Input_section_list::const_iterator p = this->input_sections().begin();
5419 p != this->input_sections().end();
5420 ++p)
5422 section_size_type section_begin_offset =
5423 align_address(off, p->addralign());
5424 section_size_type section_end_offset =
5425 section_begin_offset + p->data_size();
5427 // Check to see if we should group the previously seens sections.
5428 switch (state)
5430 case NO_GROUP:
5431 break;
5433 case FINDING_STUB_SECTION:
5434 // Adding this section makes the group larger than GROUP_SIZE.
5435 if (section_end_offset - group_begin_offset >= group_size)
5437 if (stubs_always_after_branch)
5439 gold_assert(group_end != this->input_sections().end());
5440 this->create_stub_group(group_begin, group_end, group_end,
5441 target, &new_relaxed_sections);
5442 state = NO_GROUP;
5444 else
5446 // But wait, there's more! Input sections up to
5447 // stub_group_size bytes after the stub table can be
5448 // handled by it too.
5449 state = HAS_STUB_SECTION;
5450 stub_table = group_end;
5451 stub_table_end_offset = group_end_offset;
5454 break;
5456 case HAS_STUB_SECTION:
5457 // Adding this section makes the post stub-section group larger
5458 // than GROUP_SIZE.
5459 if (section_end_offset - stub_table_end_offset >= group_size)
5461 gold_assert(group_end != this->input_sections().end());
5462 this->create_stub_group(group_begin, group_end, stub_table,
5463 target, &new_relaxed_sections);
5464 state = NO_GROUP;
5466 break;
5468 default:
5469 gold_unreachable();
5472 // If we see an input section and currently there is no group, start
5473 // a new one. Skip any empty sections.
5474 if ((p->is_input_section() || p->is_relaxed_input_section())
5475 && (p->relobj()->section_size(p->shndx()) != 0))
5477 if (state == NO_GROUP)
5479 state = FINDING_STUB_SECTION;
5480 group_begin = p;
5481 group_begin_offset = section_begin_offset;
5484 // Keep track of the last input section seen.
5485 group_end = p;
5486 group_end_offset = section_end_offset;
5489 off = section_end_offset;
5492 // Create a stub group for any ungrouped sections.
5493 if (state == FINDING_STUB_SECTION || state == HAS_STUB_SECTION)
5495 gold_assert(group_end != this->input_sections().end());
5496 this->create_stub_group(group_begin, group_end,
5497 (state == FINDING_STUB_SECTION
5498 ? group_end
5499 : stub_table),
5500 target, &new_relaxed_sections);
5503 // Convert input section into relaxed input section in a batch.
5504 if (!new_relaxed_sections.empty())
5505 this->convert_input_sections_to_relaxed_sections(new_relaxed_sections);
5507 // Update the section offsets
5508 for (size_t i = 0; i < new_relaxed_sections.size(); ++i)
5510 Arm_relobj<big_endian>* arm_relobj =
5511 Arm_relobj<big_endian>::as_arm_relobj(
5512 new_relaxed_sections[i]->relobj());
5513 unsigned int shndx = new_relaxed_sections[i]->shndx();
5514 // Tell Arm_relobj that this input section is converted.
5515 arm_relobj->convert_input_section_to_relaxed_section(shndx);
5519 // Append non empty text sections in this to LIST in ascending
5520 // order of their position in this.
5522 template<bool big_endian>
5523 void
5524 Arm_output_section<big_endian>::append_text_sections_to_list(
5525 Text_section_list* list)
5527 // We only care about text sections.
5528 if ((this->flags() & elfcpp::SHF_EXECINSTR) == 0)
5529 return;
5531 gold_assert((this->flags() & elfcpp::SHF_ALLOC) != 0);
5533 for (Input_section_list::const_iterator p = this->input_sections().begin();
5534 p != this->input_sections().end();
5535 ++p)
5537 // We only care about plain or relaxed input sections. We also
5538 // ignore any merged sections.
5539 if ((p->is_input_section() || p->is_relaxed_input_section())
5540 && p->data_size() != 0)
5541 list->push_back(Text_section_list::value_type(p->relobj(),
5542 p->shndx()));
5546 template<bool big_endian>
5547 void
5548 Arm_output_section<big_endian>::fix_exidx_coverage(
5549 Layout* layout,
5550 const Text_section_list& sorted_text_sections,
5551 Symbol_table* symtab)
5553 // We should only do this for the EXIDX output section.
5554 gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
5556 // We don't want the relaxation loop to undo these changes, so we discard
5557 // the current saved states and take another one after the fix-up.
5558 this->discard_states();
5560 // Remove all input sections.
5561 uint64_t address = this->address();
5562 typedef std::list<Simple_input_section> Simple_input_section_list;
5563 Simple_input_section_list input_sections;
5564 this->reset_address_and_file_offset();
5565 this->get_input_sections(address, std::string(""), &input_sections);
5567 if (!this->input_sections().empty())
5568 gold_error(_("Found non-EXIDX input sections in EXIDX output section"));
5570 // Go through all the known input sections and record them.
5571 typedef Unordered_set<Section_id, Section_id_hash> Section_id_set;
5572 Section_id_set known_input_sections;
5573 for (Simple_input_section_list::const_iterator p = input_sections.begin();
5574 p != input_sections.end();
5575 ++p)
5577 // This should never happen. At this point, we should only see
5578 // plain EXIDX input sections.
5579 gold_assert(!p->is_relaxed_input_section());
5580 known_input_sections.insert(Section_id(p->relobj(), p->shndx()));
5583 Arm_exidx_fixup exidx_fixup(this);
5585 // Go over the sorted text sections.
5586 Section_id_set processed_input_sections;
5587 for (Text_section_list::const_iterator p = sorted_text_sections.begin();
5588 p != sorted_text_sections.end();
5589 ++p)
5591 Relobj* relobj = p->first;
5592 unsigned int shndx = p->second;
5594 Arm_relobj<big_endian>* arm_relobj =
5595 Arm_relobj<big_endian>::as_arm_relobj(relobj);
5596 const Arm_exidx_input_section* exidx_input_section =
5597 arm_relobj->exidx_input_section_by_link(shndx);
5599 // If this text section has no EXIDX section, force an EXIDX_CANTUNWIND
5600 // entry pointing to the end of the last seen EXIDX section.
5601 if (exidx_input_section == NULL)
5603 exidx_fixup.add_exidx_cantunwind_as_needed();
5604 continue;
5607 Relobj* exidx_relobj = exidx_input_section->relobj();
5608 unsigned int exidx_shndx = exidx_input_section->shndx();
5609 Section_id sid(exidx_relobj, exidx_shndx);
5610 if (known_input_sections.find(sid) == known_input_sections.end())
5612 // This is odd. We have not seen this EXIDX input section before.
5613 // We cannot do fix-up. If we saw a SECTIONS clause in a script,
5614 // issue a warning instead. We assume the user knows what he
5615 // or she is doing. Otherwise, this is an error.
5616 if (layout->script_options()->saw_sections_clause())
5617 gold_warning(_("unwinding may not work because EXIDX input section"
5618 " %u of %s is not in EXIDX output section"),
5619 exidx_shndx, exidx_relobj->name().c_str());
5620 else
5621 gold_error(_("unwinding may not work because EXIDX input section"
5622 " %u of %s is not in EXIDX output section"),
5623 exidx_shndx, exidx_relobj->name().c_str());
5625 exidx_fixup.add_exidx_cantunwind_as_needed();
5626 continue;
5629 // Fix up coverage and append input section to output data list.
5630 Arm_exidx_section_offset_map* section_offset_map = NULL;
5631 uint32_t deleted_bytes =
5632 exidx_fixup.process_exidx_section<big_endian>(exidx_input_section,
5633 &section_offset_map);
5635 if (deleted_bytes == exidx_input_section->size())
5637 // The whole EXIDX section got merged. Remove it from output.
5638 gold_assert(section_offset_map == NULL);
5639 exidx_relobj->set_output_section(exidx_shndx, NULL);
5641 // All local symbols defined in this input section will be dropped.
5642 // We need to adjust output local symbol count.
5643 arm_relobj->set_output_local_symbol_count_needs_update();
5645 else if (deleted_bytes > 0)
5647 // Some entries are merged. We need to convert this EXIDX input
5648 // section into a relaxed section.
5649 gold_assert(section_offset_map != NULL);
5650 Arm_exidx_merged_section* merged_section =
5651 new Arm_exidx_merged_section(*exidx_input_section,
5652 *section_offset_map, deleted_bytes);
5653 this->add_relaxed_input_section(merged_section);
5654 arm_relobj->convert_input_section_to_relaxed_section(exidx_shndx);
5656 // All local symbols defined in discarded portions of this input
5657 // section will be dropped. We need to adjust output local symbol
5658 // count.
5659 arm_relobj->set_output_local_symbol_count_needs_update();
5661 else
5663 // Just add back the EXIDX input section.
5664 gold_assert(section_offset_map == NULL);
5665 Output_section::Simple_input_section sis(exidx_relobj, exidx_shndx);
5666 this->add_simple_input_section(sis, exidx_input_section->size(),
5667 exidx_input_section->addralign());
5670 processed_input_sections.insert(Section_id(exidx_relobj, exidx_shndx));
5673 // Insert an EXIDX_CANTUNWIND entry at the end of output if necessary.
5674 exidx_fixup.add_exidx_cantunwind_as_needed();
5676 // Remove any known EXIDX input sections that are not processed.
5677 for (Simple_input_section_list::const_iterator p = input_sections.begin();
5678 p != input_sections.end();
5679 ++p)
5681 if (processed_input_sections.find(Section_id(p->relobj(), p->shndx()))
5682 == processed_input_sections.end())
5684 // We only discard a known EXIDX section because its linked
5685 // text section has been folded by ICF.
5686 Arm_relobj<big_endian>* arm_relobj =
5687 Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
5688 const Arm_exidx_input_section* exidx_input_section =
5689 arm_relobj->exidx_input_section_by_shndx(p->shndx());
5690 gold_assert(exidx_input_section != NULL);
5691 unsigned int text_shndx = exidx_input_section->link();
5692 gold_assert(symtab->is_section_folded(p->relobj(), text_shndx));
5694 // Remove this from link.
5695 p->relobj()->set_output_section(p->shndx(), NULL);
5699 // Link exidx output section to the first seen output section and
5700 // set correct entry size.
5701 this->set_link_section(exidx_fixup.first_output_text_section());
5702 this->set_entsize(8);
5704 // Make changes permanent.
5705 this->save_states();
5706 this->set_section_offsets_need_adjustment();
5709 // Arm_relobj methods.
5711 // Determine if an input section is scannable for stub processing. SHDR is
5712 // the header of the section and SHNDX is the section index. OS is the output
5713 // section for the input section and SYMTAB is the global symbol table used to
5714 // look up ICF information.
5716 template<bool big_endian>
5717 bool
5718 Arm_relobj<big_endian>::section_is_scannable(
5719 const elfcpp::Shdr<32, big_endian>& shdr,
5720 unsigned int shndx,
5721 const Output_section* os,
5722 const Symbol_table *symtab)
5724 // Skip any empty sections, unallocated sections or sections whose
5725 // type are not SHT_PROGBITS.
5726 if (shdr.get_sh_size() == 0
5727 || (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0
5728 || shdr.get_sh_type() != elfcpp::SHT_PROGBITS)
5729 return false;
5731 // Skip any discarded or ICF'ed sections.
5732 if (os == NULL || symtab->is_section_folded(this, shndx))
5733 return false;
5735 // If this requires special offset handling, check to see if it is
5736 // a relaxed section. If this is not, then it is a merged section that
5737 // we cannot handle.
5738 if (this->is_output_section_offset_invalid(shndx))
5740 const Output_relaxed_input_section* poris =
5741 os->find_relaxed_input_section(this, shndx);
5742 if (poris == NULL)
5743 return false;
5746 return true;
5749 // Determine if we want to scan the SHNDX-th section for relocation stubs.
5750 // This is a helper for Arm_relobj::scan_sections_for_stubs() below.
5752 template<bool big_endian>
5753 bool
5754 Arm_relobj<big_endian>::section_needs_reloc_stub_scanning(
5755 const elfcpp::Shdr<32, big_endian>& shdr,
5756 const Relobj::Output_sections& out_sections,
5757 const Symbol_table *symtab,
5758 const unsigned char* pshdrs)
5760 unsigned int sh_type = shdr.get_sh_type();
5761 if (sh_type != elfcpp::SHT_REL && sh_type != elfcpp::SHT_RELA)
5762 return false;
5764 // Ignore empty section.
5765 off_t sh_size = shdr.get_sh_size();
5766 if (sh_size == 0)
5767 return false;
5769 // Ignore reloc section with unexpected symbol table. The
5770 // error will be reported in the final link.
5771 if (this->adjust_shndx(shdr.get_sh_link()) != this->symtab_shndx())
5772 return false;
5774 unsigned int reloc_size;
5775 if (sh_type == elfcpp::SHT_REL)
5776 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
5777 else
5778 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
5780 // Ignore reloc section with unexpected entsize or uneven size.
5781 // The error will be reported in the final link.
5782 if (reloc_size != shdr.get_sh_entsize() || sh_size % reloc_size != 0)
5783 return false;
5785 // Ignore reloc section with bad info. This error will be
5786 // reported in the final link.
5787 unsigned int index = this->adjust_shndx(shdr.get_sh_info());
5788 if (index >= this->shnum())
5789 return false;
5791 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
5792 const elfcpp::Shdr<32, big_endian> text_shdr(pshdrs + index * shdr_size);
5793 return this->section_is_scannable(text_shdr, index,
5794 out_sections[index], symtab);
5797 // Return the output address of either a plain input section or a relaxed
5798 // input section. SHNDX is the section index. We define and use this
5799 // instead of calling Output_section::output_address because that is slow
5800 // for large output.
5802 template<bool big_endian>
5803 Arm_address
5804 Arm_relobj<big_endian>::simple_input_section_output_address(
5805 unsigned int shndx,
5806 Output_section* os)
5808 if (this->is_output_section_offset_invalid(shndx))
5810 const Output_relaxed_input_section* poris =
5811 os->find_relaxed_input_section(this, shndx);
5812 // We do not handle merged sections here.
5813 gold_assert(poris != NULL);
5814 return poris->address();
5816 else
5817 return os->address() + this->get_output_section_offset(shndx);
5820 // Determine if we want to scan the SHNDX-th section for non-relocation stubs.
5821 // This is a helper for Arm_relobj::scan_sections_for_stubs() below.
5823 template<bool big_endian>
5824 bool
5825 Arm_relobj<big_endian>::section_needs_cortex_a8_stub_scanning(
5826 const elfcpp::Shdr<32, big_endian>& shdr,
5827 unsigned int shndx,
5828 Output_section* os,
5829 const Symbol_table* symtab)
5831 if (!this->section_is_scannable(shdr, shndx, os, symtab))
5832 return false;
5834 // If the section does not cross any 4K-boundaries, it does not need to
5835 // be scanned.
5836 Arm_address address = this->simple_input_section_output_address(shndx, os);
5837 if ((address & ~0xfffU) == ((address + shdr.get_sh_size() - 1) & ~0xfffU))
5838 return false;
5840 return true;
5843 // Scan a section for Cortex-A8 workaround.
5845 template<bool big_endian>
5846 void
5847 Arm_relobj<big_endian>::scan_section_for_cortex_a8_erratum(
5848 const elfcpp::Shdr<32, big_endian>& shdr,
5849 unsigned int shndx,
5850 Output_section* os,
5851 Target_arm<big_endian>* arm_target)
5853 // Look for the first mapping symbol in this section. It should be
5854 // at (shndx, 0).
5855 Mapping_symbol_position section_start(shndx, 0);
5856 typename Mapping_symbols_info::const_iterator p =
5857 this->mapping_symbols_info_.lower_bound(section_start);
5859 // There are no mapping symbols for this section. Treat it as a data-only
5860 // section.
5861 if (p == this->mapping_symbols_info_.end() || p->first.first != shndx)
5862 return;
5864 Arm_address output_address =
5865 this->simple_input_section_output_address(shndx, os);
5867 // Get the section contents.
5868 section_size_type input_view_size = 0;
5869 const unsigned char* input_view =
5870 this->section_contents(shndx, &input_view_size, false);
5872 // We need to go through the mapping symbols to determine what to
5873 // scan. There are two reasons. First, we should look at THUMB code and
5874 // THUMB code only. Second, we only want to look at the 4K-page boundary
5875 // to speed up the scanning.
5877 while (p != this->mapping_symbols_info_.end()
5878 && p->first.first == shndx)
5880 typename Mapping_symbols_info::const_iterator next =
5881 this->mapping_symbols_info_.upper_bound(p->first);
5883 // Only scan part of a section with THUMB code.
5884 if (p->second == 't')
5886 // Determine the end of this range.
5887 section_size_type span_start =
5888 convert_to_section_size_type(p->first.second);
5889 section_size_type span_end;
5890 if (next != this->mapping_symbols_info_.end()
5891 && next->first.first == shndx)
5892 span_end = convert_to_section_size_type(next->first.second);
5893 else
5894 span_end = convert_to_section_size_type(shdr.get_sh_size());
5896 if (((span_start + output_address) & ~0xfffUL)
5897 != ((span_end + output_address - 1) & ~0xfffUL))
5899 arm_target->scan_span_for_cortex_a8_erratum(this, shndx,
5900 span_start, span_end,
5901 input_view,
5902 output_address);
5906 p = next;
5910 // Scan relocations for stub generation.
5912 template<bool big_endian>
5913 void
5914 Arm_relobj<big_endian>::scan_sections_for_stubs(
5915 Target_arm<big_endian>* arm_target,
5916 const Symbol_table* symtab,
5917 const Layout* layout)
5919 unsigned int shnum = this->shnum();
5920 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
5922 // Read the section headers.
5923 const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
5924 shnum * shdr_size,
5925 true, true);
5927 // To speed up processing, we set up hash tables for fast lookup of
5928 // input offsets to output addresses.
5929 this->initialize_input_to_output_maps();
5931 const Relobj::Output_sections& out_sections(this->output_sections());
5933 Relocate_info<32, big_endian> relinfo;
5934 relinfo.symtab = symtab;
5935 relinfo.layout = layout;
5936 relinfo.object = this;
5938 // Do relocation stubs scanning.
5939 const unsigned char* p = pshdrs + shdr_size;
5940 for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
5942 const elfcpp::Shdr<32, big_endian> shdr(p);
5943 if (this->section_needs_reloc_stub_scanning(shdr, out_sections, symtab,
5944 pshdrs))
5946 unsigned int index = this->adjust_shndx(shdr.get_sh_info());
5947 Arm_address output_offset = this->get_output_section_offset(index);
5948 Arm_address output_address;
5949 if(output_offset != invalid_address)
5950 output_address = out_sections[index]->address() + output_offset;
5951 else
5953 // Currently this only happens for a relaxed section.
5954 const Output_relaxed_input_section* poris =
5955 out_sections[index]->find_relaxed_input_section(this, index);
5956 gold_assert(poris != NULL);
5957 output_address = poris->address();
5960 // Get the relocations.
5961 const unsigned char* prelocs = this->get_view(shdr.get_sh_offset(),
5962 shdr.get_sh_size(),
5963 true, false);
5965 // Get the section contents. This does work for the case in which
5966 // we modify the contents of an input section. We need to pass the
5967 // output view under such circumstances.
5968 section_size_type input_view_size = 0;
5969 const unsigned char* input_view =
5970 this->section_contents(index, &input_view_size, false);
5972 relinfo.reloc_shndx = i;
5973 relinfo.data_shndx = index;
5974 unsigned int sh_type = shdr.get_sh_type();
5975 unsigned int reloc_size;
5976 if (sh_type == elfcpp::SHT_REL)
5977 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
5978 else
5979 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
5981 Output_section* os = out_sections[index];
5982 arm_target->scan_section_for_stubs(&relinfo, sh_type, prelocs,
5983 shdr.get_sh_size() / reloc_size,
5985 output_offset == invalid_address,
5986 input_view, output_address,
5987 input_view_size);
5991 // Do Cortex-A8 erratum stubs scanning. This has to be done for a section
5992 // after its relocation section, if there is one, is processed for
5993 // relocation stubs. Merging this loop with the one above would have been
5994 // complicated since we would have had to make sure that relocation stub
5995 // scanning is done first.
5996 if (arm_target->fix_cortex_a8())
5998 const unsigned char* p = pshdrs + shdr_size;
5999 for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
6001 const elfcpp::Shdr<32, big_endian> shdr(p);
6002 if (this->section_needs_cortex_a8_stub_scanning(shdr, i,
6003 out_sections[i],
6004 symtab))
6005 this->scan_section_for_cortex_a8_erratum(shdr, i, out_sections[i],
6006 arm_target);
6010 // After we've done the relocations, we release the hash tables,
6011 // since we no longer need them.
6012 this->free_input_to_output_maps();
6015 // Count the local symbols. The ARM backend needs to know if a symbol
6016 // is a THUMB function or not. For global symbols, it is easy because
6017 // the Symbol object keeps the ELF symbol type. For local symbol it is
6018 // harder because we cannot access this information. So we override the
6019 // do_count_local_symbol in parent and scan local symbols to mark
6020 // THUMB functions. This is not the most efficient way but I do not want to
6021 // slow down other ports by calling a per symbol targer hook inside
6022 // Sized_relobj<size, big_endian>::do_count_local_symbols.
6024 template<bool big_endian>
6025 void
6026 Arm_relobj<big_endian>::do_count_local_symbols(
6027 Stringpool_template<char>* pool,
6028 Stringpool_template<char>* dynpool)
6030 // We need to fix-up the values of any local symbols whose type are
6031 // STT_ARM_TFUNC.
6033 // Ask parent to count the local symbols.
6034 Sized_relobj<32, big_endian>::do_count_local_symbols(pool, dynpool);
6035 const unsigned int loccount = this->local_symbol_count();
6036 if (loccount == 0)
6037 return;
6039 // Intialize the thumb function bit-vector.
6040 std::vector<bool> empty_vector(loccount, false);
6041 this->local_symbol_is_thumb_function_.swap(empty_vector);
6043 // Read the symbol table section header.
6044 const unsigned int symtab_shndx = this->symtab_shndx();
6045 elfcpp::Shdr<32, big_endian>
6046 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6047 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6049 // Read the local symbols.
6050 const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
6051 gold_assert(loccount == symtabshdr.get_sh_info());
6052 off_t locsize = loccount * sym_size;
6053 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6054 locsize, true, true);
6056 // For mapping symbol processing, we need to read the symbol names.
6057 unsigned int strtab_shndx = this->adjust_shndx(symtabshdr.get_sh_link());
6058 if (strtab_shndx >= this->shnum())
6060 this->error(_("invalid symbol table name index: %u"), strtab_shndx);
6061 return;
6064 elfcpp::Shdr<32, big_endian>
6065 strtabshdr(this, this->elf_file()->section_header(strtab_shndx));
6066 if (strtabshdr.get_sh_type() != elfcpp::SHT_STRTAB)
6068 this->error(_("symbol table name section has wrong type: %u"),
6069 static_cast<unsigned int>(strtabshdr.get_sh_type()));
6070 return;
6072 const char* pnames =
6073 reinterpret_cast<const char*>(this->get_view(strtabshdr.get_sh_offset(),
6074 strtabshdr.get_sh_size(),
6075 false, false));
6077 // Loop over the local symbols and mark any local symbols pointing
6078 // to THUMB functions.
6080 // Skip the first dummy symbol.
6081 psyms += sym_size;
6082 typename Sized_relobj<32, big_endian>::Local_values* plocal_values =
6083 this->local_values();
6084 for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
6086 elfcpp::Sym<32, big_endian> sym(psyms);
6087 elfcpp::STT st_type = sym.get_st_type();
6088 Symbol_value<32>& lv((*plocal_values)[i]);
6089 Arm_address input_value = lv.input_value();
6091 // Check to see if this is a mapping symbol.
6092 const char* sym_name = pnames + sym.get_st_name();
6093 if (Target_arm<big_endian>::is_mapping_symbol_name(sym_name))
6095 unsigned int input_shndx = sym.get_st_shndx();
6097 // Strip of LSB in case this is a THUMB symbol.
6098 Mapping_symbol_position msp(input_shndx, input_value & ~1U);
6099 this->mapping_symbols_info_[msp] = sym_name[1];
6102 if (st_type == elfcpp::STT_ARM_TFUNC
6103 || (st_type == elfcpp::STT_FUNC && ((input_value & 1) != 0)))
6105 // This is a THUMB function. Mark this and canonicalize the
6106 // symbol value by setting LSB.
6107 this->local_symbol_is_thumb_function_[i] = true;
6108 if ((input_value & 1) == 0)
6109 lv.set_input_value(input_value | 1);
6114 // Relocate sections.
6115 template<bool big_endian>
6116 void
6117 Arm_relobj<big_endian>::do_relocate_sections(
6118 const Symbol_table* symtab,
6119 const Layout* layout,
6120 const unsigned char* pshdrs,
6121 typename Sized_relobj<32, big_endian>::Views* pviews)
6123 // Call parent to relocate sections.
6124 Sized_relobj<32, big_endian>::do_relocate_sections(symtab, layout, pshdrs,
6125 pviews);
6127 // We do not generate stubs if doing a relocatable link.
6128 if (parameters->options().relocatable())
6129 return;
6131 // Relocate stub tables.
6132 unsigned int shnum = this->shnum();
6134 Target_arm<big_endian>* arm_target =
6135 Target_arm<big_endian>::default_target();
6137 Relocate_info<32, big_endian> relinfo;
6138 relinfo.symtab = symtab;
6139 relinfo.layout = layout;
6140 relinfo.object = this;
6142 for (unsigned int i = 1; i < shnum; ++i)
6144 Arm_input_section<big_endian>* arm_input_section =
6145 arm_target->find_arm_input_section(this, i);
6147 if (arm_input_section != NULL
6148 && arm_input_section->is_stub_table_owner()
6149 && !arm_input_section->stub_table()->empty())
6151 // We cannot discard a section if it owns a stub table.
6152 Output_section* os = this->output_section(i);
6153 gold_assert(os != NULL);
6155 relinfo.reloc_shndx = elfcpp::SHN_UNDEF;
6156 relinfo.reloc_shdr = NULL;
6157 relinfo.data_shndx = i;
6158 relinfo.data_shdr = pshdrs + i * elfcpp::Elf_sizes<32>::shdr_size;
6160 gold_assert((*pviews)[i].view != NULL);
6162 // We are passed the output section view. Adjust it to cover the
6163 // stub table only.
6164 Stub_table<big_endian>* stub_table = arm_input_section->stub_table();
6165 gold_assert((stub_table->address() >= (*pviews)[i].address)
6166 && ((stub_table->address() + stub_table->data_size())
6167 <= (*pviews)[i].address + (*pviews)[i].view_size));
6169 off_t offset = stub_table->address() - (*pviews)[i].address;
6170 unsigned char* view = (*pviews)[i].view + offset;
6171 Arm_address address = stub_table->address();
6172 section_size_type view_size = stub_table->data_size();
6174 stub_table->relocate_stubs(&relinfo, arm_target, os, view, address,
6175 view_size);
6178 // Apply Cortex A8 workaround if applicable.
6179 if (this->section_has_cortex_a8_workaround(i))
6181 unsigned char* view = (*pviews)[i].view;
6182 Arm_address view_address = (*pviews)[i].address;
6183 section_size_type view_size = (*pviews)[i].view_size;
6184 Stub_table<big_endian>* stub_table = this->stub_tables_[i];
6186 // Adjust view to cover section.
6187 Output_section* os = this->output_section(i);
6188 gold_assert(os != NULL);
6189 Arm_address section_address =
6190 this->simple_input_section_output_address(i, os);
6191 uint64_t section_size = this->section_size(i);
6193 gold_assert(section_address >= view_address
6194 && ((section_address + section_size)
6195 <= (view_address + view_size)));
6197 unsigned char* section_view = view + (section_address - view_address);
6199 // Apply the Cortex-A8 workaround to the output address range
6200 // corresponding to this input section.
6201 stub_table->apply_cortex_a8_workaround_to_address_range(
6202 arm_target,
6203 section_view,
6204 section_address,
6205 section_size);
6210 // Find the linked text section of an EXIDX section by looking the the first
6211 // relocation. 4.4.1 of the EHABI specifications says that an EXIDX section
6212 // must be linked to to its associated code section via the sh_link field of
6213 // its section header. However, some tools are broken and the link is not
6214 // always set. LD just drops such an EXIDX section silently, causing the
6215 // associated code not unwindabled. Here we try a little bit harder to
6216 // discover the linked code section.
6218 // PSHDR points to the section header of a relocation section of an EXIDX
6219 // section. If we can find a linked text section, return true and
6220 // store the text section index in the location PSHNDX. Otherwise
6221 // return false.
6223 template<bool big_endian>
6224 bool
6225 Arm_relobj<big_endian>::find_linked_text_section(
6226 const unsigned char* pshdr,
6227 const unsigned char* psyms,
6228 unsigned int* pshndx)
6230 elfcpp::Shdr<32, big_endian> shdr(pshdr);
6232 // If there is no relocation, we cannot find the linked text section.
6233 size_t reloc_size;
6234 if (shdr.get_sh_type() == elfcpp::SHT_REL)
6235 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
6236 else
6237 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
6238 size_t reloc_count = shdr.get_sh_size() / reloc_size;
6240 // Get the relocations.
6241 const unsigned char* prelocs =
6242 this->get_view(shdr.get_sh_offset(), shdr.get_sh_size(), true, false);
6244 // Find the REL31 relocation for the first word of the first EXIDX entry.
6245 for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
6247 Arm_address r_offset;
6248 typename elfcpp::Elf_types<32>::Elf_WXword r_info;
6249 if (shdr.get_sh_type() == elfcpp::SHT_REL)
6251 typename elfcpp::Rel<32, big_endian> reloc(prelocs);
6252 r_info = reloc.get_r_info();
6253 r_offset = reloc.get_r_offset();
6255 else
6257 typename elfcpp::Rela<32, big_endian> reloc(prelocs);
6258 r_info = reloc.get_r_info();
6259 r_offset = reloc.get_r_offset();
6262 unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
6263 if (r_type != elfcpp::R_ARM_PREL31 && r_type != elfcpp::R_ARM_SBREL31)
6264 continue;
6266 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
6267 if (r_sym == 0
6268 || r_sym >= this->local_symbol_count()
6269 || r_offset != 0)
6270 continue;
6272 // This is the relocation for the first word of the first EXIDX entry.
6273 // We expect to see a local section symbol.
6274 const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6275 elfcpp::Sym<32, big_endian> sym(psyms + r_sym * sym_size);
6276 if (sym.get_st_type() == elfcpp::STT_SECTION)
6278 *pshndx = this->adjust_shndx(sym.get_st_shndx());
6279 return true;
6281 else
6282 return false;
6285 return false;
6288 // Make an EXIDX input section object for an EXIDX section whose index is
6289 // SHNDX. SHDR is the section header of the EXIDX section and TEXT_SHNDX
6290 // is the section index of the linked text section.
6292 template<bool big_endian>
6293 void
6294 Arm_relobj<big_endian>::make_exidx_input_section(
6295 unsigned int shndx,
6296 const elfcpp::Shdr<32, big_endian>& shdr,
6297 unsigned int text_shndx)
6299 // Issue an error and ignore this EXIDX section if it points to a text
6300 // section already has an EXIDX section.
6301 if (this->exidx_section_map_[text_shndx] != NULL)
6303 gold_error(_("EXIDX sections %u and %u both link to text section %u "
6304 "in %s"),
6305 shndx, this->exidx_section_map_[text_shndx]->shndx(),
6306 text_shndx, this->name().c_str());
6307 return;
6310 // Create an Arm_exidx_input_section object for this EXIDX section.
6311 Arm_exidx_input_section* exidx_input_section =
6312 new Arm_exidx_input_section(this, shndx, text_shndx, shdr.get_sh_size(),
6313 shdr.get_sh_addralign());
6314 this->exidx_section_map_[text_shndx] = exidx_input_section;
6316 // Also map the EXIDX section index to this.
6317 gold_assert(this->exidx_section_map_[shndx] == NULL);
6318 this->exidx_section_map_[shndx] = exidx_input_section;
6321 // Read the symbol information.
6323 template<bool big_endian>
6324 void
6325 Arm_relobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
6327 // Call parent class to read symbol information.
6328 Sized_relobj<32, big_endian>::do_read_symbols(sd);
6330 // Read processor-specific flags in ELF file header.
6331 const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
6332 elfcpp::Elf_sizes<32>::ehdr_size,
6333 true, false);
6334 elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
6335 this->processor_specific_flags_ = ehdr.get_e_flags();
6337 // Go over the section headers and look for .ARM.attributes and .ARM.exidx
6338 // sections.
6339 std::vector<unsigned int> deferred_exidx_sections;
6340 const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6341 const unsigned char* pshdrs = sd->section_headers->data();
6342 const unsigned char *ps = pshdrs + shdr_size;
6343 for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6345 elfcpp::Shdr<32, big_endian> shdr(ps);
6346 if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
6348 gold_assert(this->attributes_section_data_ == NULL);
6349 section_offset_type section_offset = shdr.get_sh_offset();
6350 section_size_type section_size =
6351 convert_to_section_size_type(shdr.get_sh_size());
6352 File_view* view = this->get_lasting_view(section_offset,
6353 section_size, true, false);
6354 this->attributes_section_data_ =
6355 new Attributes_section_data(view->data(), section_size);
6357 else if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
6359 unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
6360 if (text_shndx >= this->shnum())
6361 gold_error(_("EXIDX section %u linked to invalid section %u"),
6362 i, text_shndx);
6363 else if (text_shndx == elfcpp::SHN_UNDEF)
6364 deferred_exidx_sections.push_back(i);
6365 else
6366 this->make_exidx_input_section(i, shdr, text_shndx);
6370 // Some tools are broken and they do not set the link of EXIDX sections.
6371 // We look at the first relocation to figure out the linked sections.
6372 if (!deferred_exidx_sections.empty())
6374 // We need to go over the section headers again to find the mapping
6375 // from sections being relocated to their relocation sections. This is
6376 // a bit inefficient as we could do that in the loop above. However,
6377 // we do not expect any deferred EXIDX sections normally. So we do not
6378 // want to slow down the most common path.
6379 typedef Unordered_map<unsigned int, unsigned int> Reloc_map;
6380 Reloc_map reloc_map;
6381 ps = pshdrs + shdr_size;
6382 for (unsigned int i = 1; i < this->shnum(); ++i, ps += shdr_size)
6384 elfcpp::Shdr<32, big_endian> shdr(ps);
6385 elfcpp::Elf_Word sh_type = shdr.get_sh_type();
6386 if (sh_type == elfcpp::SHT_REL || sh_type == elfcpp::SHT_RELA)
6388 unsigned int info_shndx = this->adjust_shndx(shdr.get_sh_info());
6389 if (info_shndx >= this->shnum())
6390 gold_error(_("relocation section %u has invalid info %u"),
6391 i, info_shndx);
6392 Reloc_map::value_type value(info_shndx, i);
6393 std::pair<Reloc_map::iterator, bool> result =
6394 reloc_map.insert(value);
6395 if (!result.second)
6396 gold_error(_("section %u has multiple relocation sections "
6397 "%u and %u"),
6398 info_shndx, i, reloc_map[info_shndx]);
6402 // Read the symbol table section header.
6403 const unsigned int symtab_shndx = this->symtab_shndx();
6404 elfcpp::Shdr<32, big_endian>
6405 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6406 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6408 // Read the local symbols.
6409 const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
6410 const unsigned int loccount = this->local_symbol_count();
6411 gold_assert(loccount == symtabshdr.get_sh_info());
6412 off_t locsize = loccount * sym_size;
6413 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6414 locsize, true, true);
6416 // Process the deferred EXIDX sections.
6417 for(unsigned int i = 0; i < deferred_exidx_sections.size(); ++i)
6419 unsigned int shndx = deferred_exidx_sections[i];
6420 elfcpp::Shdr<32, big_endian> shdr(pshdrs + shndx * shdr_size);
6421 unsigned int text_shndx;
6422 Reloc_map::const_iterator it = reloc_map.find(shndx);
6423 if (it != reloc_map.end()
6424 && find_linked_text_section(pshdrs + it->second * shdr_size,
6425 psyms, &text_shndx))
6426 this->make_exidx_input_section(shndx, shdr, text_shndx);
6427 else
6428 gold_error(_("EXIDX section %u has no linked text section."),
6429 shndx);
6434 // Process relocations for garbage collection. The ARM target uses .ARM.exidx
6435 // sections for unwinding. These sections are referenced implicitly by
6436 // text sections linked in the section headers. If we ignore these implict
6437 // references, the .ARM.exidx sections and any .ARM.extab sections they use
6438 // will be garbage-collected incorrectly. Hence we override the same function
6439 // in the base class to handle these implicit references.
6441 template<bool big_endian>
6442 void
6443 Arm_relobj<big_endian>::do_gc_process_relocs(Symbol_table* symtab,
6444 Layout* layout,
6445 Read_relocs_data* rd)
6447 // First, call base class method to process relocations in this object.
6448 Sized_relobj<32, big_endian>::do_gc_process_relocs(symtab, layout, rd);
6450 // If --gc-sections is not specified, there is nothing more to do.
6451 // This happens when --icf is used but --gc-sections is not.
6452 if (!parameters->options().gc_sections())
6453 return;
6455 unsigned int shnum = this->shnum();
6456 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6457 const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
6458 shnum * shdr_size,
6459 true, true);
6461 // Scan section headers for sections of type SHT_ARM_EXIDX. Add references
6462 // to these from the linked text sections.
6463 const unsigned char* ps = pshdrs + shdr_size;
6464 for (unsigned int i = 1; i < shnum; ++i, ps += shdr_size)
6466 elfcpp::Shdr<32, big_endian> shdr(ps);
6467 if (shdr.get_sh_type() == elfcpp::SHT_ARM_EXIDX)
6469 // Found an .ARM.exidx section, add it to the set of reachable
6470 // sections from its linked text section.
6471 unsigned int text_shndx = this->adjust_shndx(shdr.get_sh_link());
6472 symtab->gc()->add_reference(this, text_shndx, this, i);
6477 // Update output local symbol count. Owing to EXIDX entry merging, some local
6478 // symbols will be removed in output. Adjust output local symbol count
6479 // accordingly. We can only changed the static output local symbol count. It
6480 // is too late to change the dynamic symbols.
6482 template<bool big_endian>
6483 void
6484 Arm_relobj<big_endian>::update_output_local_symbol_count()
6486 // Caller should check that this needs updating. We want caller checking
6487 // because output_local_symbol_count_needs_update() is most likely inlined.
6488 gold_assert(this->output_local_symbol_count_needs_update_);
6490 gold_assert(this->symtab_shndx() != -1U);
6491 if (this->symtab_shndx() == 0)
6493 // This object has no symbols. Weird but legal.
6494 return;
6497 // Read the symbol table section header.
6498 const unsigned int symtab_shndx = this->symtab_shndx();
6499 elfcpp::Shdr<32, big_endian>
6500 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
6501 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
6503 // Read the local symbols.
6504 const int sym_size = elfcpp::Elf_sizes<32>::sym_size;
6505 const unsigned int loccount = this->local_symbol_count();
6506 gold_assert(loccount == symtabshdr.get_sh_info());
6507 off_t locsize = loccount * sym_size;
6508 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
6509 locsize, true, true);
6511 // Loop over the local symbols.
6513 typedef typename Sized_relobj<32, big_endian>::Output_sections
6514 Output_sections;
6515 const Output_sections& out_sections(this->output_sections());
6516 unsigned int shnum = this->shnum();
6517 unsigned int count = 0;
6518 // Skip the first, dummy, symbol.
6519 psyms += sym_size;
6520 for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
6522 elfcpp::Sym<32, big_endian> sym(psyms);
6524 Symbol_value<32>& lv((*this->local_values())[i]);
6526 // This local symbol was already discarded by do_count_local_symbols.
6527 if (lv.is_output_symtab_index_set() && !lv.has_output_symtab_entry())
6528 continue;
6530 bool is_ordinary;
6531 unsigned int shndx = this->adjust_sym_shndx(i, sym.get_st_shndx(),
6532 &is_ordinary);
6534 if (shndx < shnum)
6536 Output_section* os = out_sections[shndx];
6538 // This local symbol no longer has an output section. Discard it.
6539 if (os == NULL)
6541 lv.set_no_output_symtab_entry();
6542 continue;
6545 // Currently we only discard parts of EXIDX input sections.
6546 // We explicitly check for a merged EXIDX input section to avoid
6547 // calling Output_section_data::output_offset unless necessary.
6548 if ((this->get_output_section_offset(shndx) == invalid_address)
6549 && (this->exidx_input_section_by_shndx(shndx) != NULL))
6551 section_offset_type output_offset =
6552 os->output_offset(this, shndx, lv.input_value());
6553 if (output_offset == -1)
6555 // This symbol is defined in a part of an EXIDX input section
6556 // that is discarded due to entry merging.
6557 lv.set_no_output_symtab_entry();
6558 continue;
6563 ++count;
6566 this->set_output_local_symbol_count(count);
6567 this->output_local_symbol_count_needs_update_ = false;
6570 // Arm_dynobj methods.
6572 // Read the symbol information.
6574 template<bool big_endian>
6575 void
6576 Arm_dynobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
6578 // Call parent class to read symbol information.
6579 Sized_dynobj<32, big_endian>::do_read_symbols(sd);
6581 // Read processor-specific flags in ELF file header.
6582 const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
6583 elfcpp::Elf_sizes<32>::ehdr_size,
6584 true, false);
6585 elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
6586 this->processor_specific_flags_ = ehdr.get_e_flags();
6588 // Read the attributes section if there is one.
6589 // We read from the end because gas seems to put it near the end of
6590 // the section headers.
6591 const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
6592 const unsigned char *ps =
6593 sd->section_headers->data() + shdr_size * (this->shnum() - 1);
6594 for (unsigned int i = this->shnum(); i > 0; --i, ps -= shdr_size)
6596 elfcpp::Shdr<32, big_endian> shdr(ps);
6597 if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
6599 section_offset_type section_offset = shdr.get_sh_offset();
6600 section_size_type section_size =
6601 convert_to_section_size_type(shdr.get_sh_size());
6602 File_view* view = this->get_lasting_view(section_offset,
6603 section_size, true, false);
6604 this->attributes_section_data_ =
6605 new Attributes_section_data(view->data(), section_size);
6606 break;
6611 // Stub_addend_reader methods.
6613 // Read the addend of a REL relocation of type R_TYPE at VIEW.
6615 template<bool big_endian>
6616 elfcpp::Elf_types<32>::Elf_Swxword
6617 Stub_addend_reader<elfcpp::SHT_REL, big_endian>::operator()(
6618 unsigned int r_type,
6619 const unsigned char* view,
6620 const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const
6622 typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
6624 switch (r_type)
6626 case elfcpp::R_ARM_CALL:
6627 case elfcpp::R_ARM_JUMP24:
6628 case elfcpp::R_ARM_PLT32:
6630 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
6631 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
6632 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
6633 return utils::sign_extend<26>(val << 2);
6636 case elfcpp::R_ARM_THM_CALL:
6637 case elfcpp::R_ARM_THM_JUMP24:
6638 case elfcpp::R_ARM_THM_XPC22:
6640 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
6641 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
6642 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
6643 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
6644 return RelocFuncs::thumb32_branch_offset(upper_insn, lower_insn);
6647 case elfcpp::R_ARM_THM_JUMP19:
6649 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
6650 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
6651 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
6652 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
6653 return RelocFuncs::thumb32_cond_branch_offset(upper_insn, lower_insn);
6656 default:
6657 gold_unreachable();
6661 // Arm_output_data_got methods.
6663 // Add a GOT pair for R_ARM_TLS_GD32. The creates a pair of GOT entries.
6664 // The first one is initialized to be 1, which is the module index for
6665 // the main executable and the second one 0. A reloc of the type
6666 // R_ARM_TLS_DTPOFF32 will be created for the second GOT entry and will
6667 // be applied by gold. GSYM is a global symbol.
6669 template<bool big_endian>
6670 void
6671 Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
6672 unsigned int got_type,
6673 Symbol* gsym)
6675 if (gsym->has_got_offset(got_type))
6676 return;
6678 // We are doing a static link. Just mark it as belong to module 1,
6679 // the executable.
6680 unsigned int got_offset = this->add_constant(1);
6681 gsym->set_got_offset(got_type, got_offset);
6682 got_offset = this->add_constant(0);
6683 this->static_relocs_.push_back(Static_reloc(got_offset,
6684 elfcpp::R_ARM_TLS_DTPOFF32,
6685 gsym));
6688 // Same as the above but for a local symbol.
6690 template<bool big_endian>
6691 void
6692 Arm_output_data_got<big_endian>::add_tls_gd32_with_static_reloc(
6693 unsigned int got_type,
6694 Sized_relobj<32, big_endian>* object,
6695 unsigned int index)
6697 if (object->local_has_got_offset(index, got_type))
6698 return;
6700 // We are doing a static link. Just mark it as belong to module 1,
6701 // the executable.
6702 unsigned int got_offset = this->add_constant(1);
6703 object->set_local_got_offset(index, got_type, got_offset);
6704 got_offset = this->add_constant(0);
6705 this->static_relocs_.push_back(Static_reloc(got_offset,
6706 elfcpp::R_ARM_TLS_DTPOFF32,
6707 object, index));
6710 template<bool big_endian>
6711 void
6712 Arm_output_data_got<big_endian>::do_write(Output_file* of)
6714 // Call parent to write out GOT.
6715 Output_data_got<32, big_endian>::do_write(of);
6717 // We are done if there is no fix up.
6718 if (this->static_relocs_.empty())
6719 return;
6721 gold_assert(parameters->doing_static_link());
6723 const off_t offset = this->offset();
6724 const section_size_type oview_size =
6725 convert_to_section_size_type(this->data_size());
6726 unsigned char* const oview = of->get_output_view(offset, oview_size);
6728 Output_segment* tls_segment = this->layout_->tls_segment();
6729 gold_assert(tls_segment != NULL);
6731 // The thread pointer $tp points to the TCB, which is followed by the
6732 // TLS. So we need to adjust $tp relative addressing by this amount.
6733 Arm_address aligned_tcb_size =
6734 align_address(ARM_TCB_SIZE, tls_segment->maximum_alignment());
6736 for (size_t i = 0; i < this->static_relocs_.size(); ++i)
6738 Static_reloc& reloc(this->static_relocs_[i]);
6740 Arm_address value;
6741 if (!reloc.symbol_is_global())
6743 Sized_relobj<32, big_endian>* object = reloc.relobj();
6744 const Symbol_value<32>* psymval =
6745 reloc.relobj()->local_symbol(reloc.index());
6747 // We are doing static linking. Issue an error and skip this
6748 // relocation if the symbol is undefined or in a discarded_section.
6749 bool is_ordinary;
6750 unsigned int shndx = psymval->input_shndx(&is_ordinary);
6751 if ((shndx == elfcpp::SHN_UNDEF)
6752 || (is_ordinary
6753 && shndx != elfcpp::SHN_UNDEF
6754 && !object->is_section_included(shndx)
6755 && !this->symbol_table_->is_section_folded(object, shndx)))
6757 gold_error(_("undefined or discarded local symbol %u from "
6758 " object %s in GOT"),
6759 reloc.index(), reloc.relobj()->name().c_str());
6760 continue;
6763 value = psymval->value(object, 0);
6765 else
6767 const Symbol* gsym = reloc.symbol();
6768 gold_assert(gsym != NULL);
6769 if (gsym->is_forwarder())
6770 gsym = this->symbol_table_->resolve_forwards(gsym);
6772 // We are doing static linking. Issue an error and skip this
6773 // relocation if the symbol is undefined or in a discarded_section
6774 // unless it is a weakly_undefined symbol.
6775 if ((gsym->is_defined_in_discarded_section()
6776 || gsym->is_undefined())
6777 && !gsym->is_weak_undefined())
6779 gold_error(_("undefined or discarded symbol %s in GOT"),
6780 gsym->name());
6781 continue;
6784 if (!gsym->is_weak_undefined())
6786 const Sized_symbol<32>* sym =
6787 static_cast<const Sized_symbol<32>*>(gsym);
6788 value = sym->value();
6790 else
6791 value = 0;
6794 unsigned got_offset = reloc.got_offset();
6795 gold_assert(got_offset < oview_size);
6797 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
6798 Valtype* wv = reinterpret_cast<Valtype*>(oview + got_offset);
6799 Valtype x;
6800 switch (reloc.r_type())
6802 case elfcpp::R_ARM_TLS_DTPOFF32:
6803 x = value;
6804 break;
6805 case elfcpp::R_ARM_TLS_TPOFF32:
6806 x = value + aligned_tcb_size;
6807 break;
6808 default:
6809 gold_unreachable();
6811 elfcpp::Swap<32, big_endian>::writeval(wv, x);
6814 of->write_output_view(offset, oview_size, oview);
6817 // A class to handle the PLT data.
6819 template<bool big_endian>
6820 class Output_data_plt_arm : public Output_section_data
6822 public:
6823 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
6824 Reloc_section;
6826 Output_data_plt_arm(Layout*, Output_data_space*);
6828 // Add an entry to the PLT.
6829 void
6830 add_entry(Symbol* gsym);
6832 // Return the .rel.plt section data.
6833 const Reloc_section*
6834 rel_plt() const
6835 { return this->rel_; }
6837 protected:
6838 void
6839 do_adjust_output_section(Output_section* os);
6841 // Write to a map file.
6842 void
6843 do_print_to_mapfile(Mapfile* mapfile) const
6844 { mapfile->print_output_data(this, _("** PLT")); }
6846 private:
6847 // Template for the first PLT entry.
6848 static const uint32_t first_plt_entry[5];
6850 // Template for subsequent PLT entries.
6851 static const uint32_t plt_entry[3];
6853 // Set the final size.
6854 void
6855 set_final_data_size()
6857 this->set_data_size(sizeof(first_plt_entry)
6858 + this->count_ * sizeof(plt_entry));
6861 // Write out the PLT data.
6862 void
6863 do_write(Output_file*);
6865 // The reloc section.
6866 Reloc_section* rel_;
6867 // The .got.plt section.
6868 Output_data_space* got_plt_;
6869 // The number of PLT entries.
6870 unsigned int count_;
6873 // Create the PLT section. The ordinary .got section is an argument,
6874 // since we need to refer to the start. We also create our own .got
6875 // section just for PLT entries.
6877 template<bool big_endian>
6878 Output_data_plt_arm<big_endian>::Output_data_plt_arm(Layout* layout,
6879 Output_data_space* got_plt)
6880 : Output_section_data(4), got_plt_(got_plt), count_(0)
6882 this->rel_ = new Reloc_section(false);
6883 layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
6884 elfcpp::SHF_ALLOC, this->rel_, true, false,
6885 false, false);
6888 template<bool big_endian>
6889 void
6890 Output_data_plt_arm<big_endian>::do_adjust_output_section(Output_section* os)
6892 os->set_entsize(0);
6895 // Add an entry to the PLT.
6897 template<bool big_endian>
6898 void
6899 Output_data_plt_arm<big_endian>::add_entry(Symbol* gsym)
6901 gold_assert(!gsym->has_plt_offset());
6903 // Note that when setting the PLT offset we skip the initial
6904 // reserved PLT entry.
6905 gsym->set_plt_offset((this->count_) * sizeof(plt_entry)
6906 + sizeof(first_plt_entry));
6908 ++this->count_;
6910 section_offset_type got_offset = this->got_plt_->current_data_size();
6912 // Every PLT entry needs a GOT entry which points back to the PLT
6913 // entry (this will be changed by the dynamic linker, normally
6914 // lazily when the function is called).
6915 this->got_plt_->set_current_data_size(got_offset + 4);
6917 // Every PLT entry needs a reloc.
6918 gsym->set_needs_dynsym_entry();
6919 this->rel_->add_global(gsym, elfcpp::R_ARM_JUMP_SLOT, this->got_plt_,
6920 got_offset);
6922 // Note that we don't need to save the symbol. The contents of the
6923 // PLT are independent of which symbols are used. The symbols only
6924 // appear in the relocations.
6927 // ARM PLTs.
6928 // FIXME: This is not very flexible. Right now this has only been tested
6929 // on armv5te. If we are to support additional architecture features like
6930 // Thumb-2 or BE8, we need to make this more flexible like GNU ld.
6932 // The first entry in the PLT.
6933 template<bool big_endian>
6934 const uint32_t Output_data_plt_arm<big_endian>::first_plt_entry[5] =
6936 0xe52de004, // str lr, [sp, #-4]!
6937 0xe59fe004, // ldr lr, [pc, #4]
6938 0xe08fe00e, // add lr, pc, lr
6939 0xe5bef008, // ldr pc, [lr, #8]!
6940 0x00000000, // &GOT[0] - .
6943 // Subsequent entries in the PLT.
6945 template<bool big_endian>
6946 const uint32_t Output_data_plt_arm<big_endian>::plt_entry[3] =
6948 0xe28fc600, // add ip, pc, #0xNN00000
6949 0xe28cca00, // add ip, ip, #0xNN000
6950 0xe5bcf000, // ldr pc, [ip, #0xNNN]!
6953 // Write out the PLT. This uses the hand-coded instructions above,
6954 // and adjusts them as needed. This is all specified by the arm ELF
6955 // Processor Supplement.
6957 template<bool big_endian>
6958 void
6959 Output_data_plt_arm<big_endian>::do_write(Output_file* of)
6961 const off_t offset = this->offset();
6962 const section_size_type oview_size =
6963 convert_to_section_size_type(this->data_size());
6964 unsigned char* const oview = of->get_output_view(offset, oview_size);
6966 const off_t got_file_offset = this->got_plt_->offset();
6967 const section_size_type got_size =
6968 convert_to_section_size_type(this->got_plt_->data_size());
6969 unsigned char* const got_view = of->get_output_view(got_file_offset,
6970 got_size);
6971 unsigned char* pov = oview;
6973 Arm_address plt_address = this->address();
6974 Arm_address got_address = this->got_plt_->address();
6976 // Write first PLT entry. All but the last word are constants.
6977 const size_t num_first_plt_words = (sizeof(first_plt_entry)
6978 / sizeof(plt_entry[0]));
6979 for (size_t i = 0; i < num_first_plt_words - 1; i++)
6980 elfcpp::Swap<32, big_endian>::writeval(pov + i * 4, first_plt_entry[i]);
6981 // Last word in first PLT entry is &GOT[0] - .
6982 elfcpp::Swap<32, big_endian>::writeval(pov + 16,
6983 got_address - (plt_address + 16));
6984 pov += sizeof(first_plt_entry);
6986 unsigned char* got_pov = got_view;
6988 memset(got_pov, 0, 12);
6989 got_pov += 12;
6991 const int rel_size = elfcpp::Elf_sizes<32>::rel_size;
6992 unsigned int plt_offset = sizeof(first_plt_entry);
6993 unsigned int plt_rel_offset = 0;
6994 unsigned int got_offset = 12;
6995 const unsigned int count = this->count_;
6996 for (unsigned int i = 0;
6997 i < count;
6998 ++i,
6999 pov += sizeof(plt_entry),
7000 got_pov += 4,
7001 plt_offset += sizeof(plt_entry),
7002 plt_rel_offset += rel_size,
7003 got_offset += 4)
7005 // Set and adjust the PLT entry itself.
7006 int32_t offset = ((got_address + got_offset)
7007 - (plt_address + plt_offset + 8));
7009 gold_assert(offset >= 0 && offset < 0x0fffffff);
7010 uint32_t plt_insn0 = plt_entry[0] | ((offset >> 20) & 0xff);
7011 elfcpp::Swap<32, big_endian>::writeval(pov, plt_insn0);
7012 uint32_t plt_insn1 = plt_entry[1] | ((offset >> 12) & 0xff);
7013 elfcpp::Swap<32, big_endian>::writeval(pov + 4, plt_insn1);
7014 uint32_t plt_insn2 = plt_entry[2] | (offset & 0xfff);
7015 elfcpp::Swap<32, big_endian>::writeval(pov + 8, plt_insn2);
7017 // Set the entry in the GOT.
7018 elfcpp::Swap<32, big_endian>::writeval(got_pov, plt_address);
7021 gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
7022 gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
7024 of->write_output_view(offset, oview_size, oview);
7025 of->write_output_view(got_file_offset, got_size, got_view);
7028 // Create a PLT entry for a global symbol.
7030 template<bool big_endian>
7031 void
7032 Target_arm<big_endian>::make_plt_entry(Symbol_table* symtab, Layout* layout,
7033 Symbol* gsym)
7035 if (gsym->has_plt_offset())
7036 return;
7038 if (this->plt_ == NULL)
7040 // Create the GOT sections first.
7041 this->got_section(symtab, layout);
7043 this->plt_ = new Output_data_plt_arm<big_endian>(layout, this->got_plt_);
7044 layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
7045 (elfcpp::SHF_ALLOC
7046 | elfcpp::SHF_EXECINSTR),
7047 this->plt_, false, false, false, false);
7049 this->plt_->add_entry(gsym);
7052 // Get the section to use for TLS_DESC relocations.
7054 template<bool big_endian>
7055 typename Target_arm<big_endian>::Reloc_section*
7056 Target_arm<big_endian>::rel_tls_desc_section(Layout* layout) const
7058 return this->plt_section()->rel_tls_desc(layout);
7061 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
7063 template<bool big_endian>
7064 void
7065 Target_arm<big_endian>::define_tls_base_symbol(
7066 Symbol_table* symtab,
7067 Layout* layout)
7069 if (this->tls_base_symbol_defined_)
7070 return;
7072 Output_segment* tls_segment = layout->tls_segment();
7073 if (tls_segment != NULL)
7075 bool is_exec = parameters->options().output_is_executable();
7076 symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL,
7077 Symbol_table::PREDEFINED,
7078 tls_segment, 0, 0,
7079 elfcpp::STT_TLS,
7080 elfcpp::STB_LOCAL,
7081 elfcpp::STV_HIDDEN, 0,
7082 (is_exec
7083 ? Symbol::SEGMENT_END
7084 : Symbol::SEGMENT_START),
7085 true);
7087 this->tls_base_symbol_defined_ = true;
7090 // Create a GOT entry for the TLS module index.
7092 template<bool big_endian>
7093 unsigned int
7094 Target_arm<big_endian>::got_mod_index_entry(
7095 Symbol_table* symtab,
7096 Layout* layout,
7097 Sized_relobj<32, big_endian>* object)
7099 if (this->got_mod_index_offset_ == -1U)
7101 gold_assert(symtab != NULL && layout != NULL && object != NULL);
7102 Arm_output_data_got<big_endian>* got = this->got_section(symtab, layout);
7103 unsigned int got_offset;
7104 if (!parameters->doing_static_link())
7106 got_offset = got->add_constant(0);
7107 Reloc_section* rel_dyn = this->rel_dyn_section(layout);
7108 rel_dyn->add_local(object, 0, elfcpp::R_ARM_TLS_DTPMOD32, got,
7109 got_offset);
7111 else
7113 // We are doing a static link. Just mark it as belong to module 1,
7114 // the executable.
7115 got_offset = got->add_constant(1);
7118 got->add_constant(0);
7119 this->got_mod_index_offset_ = got_offset;
7121 return this->got_mod_index_offset_;
7124 // Optimize the TLS relocation type based on what we know about the
7125 // symbol. IS_FINAL is true if the final address of this symbol is
7126 // known at link time.
7128 template<bool big_endian>
7129 tls::Tls_optimization
7130 Target_arm<big_endian>::optimize_tls_reloc(bool, int)
7132 // FIXME: Currently we do not do any TLS optimization.
7133 return tls::TLSOPT_NONE;
7136 // Report an unsupported relocation against a local symbol.
7138 template<bool big_endian>
7139 void
7140 Target_arm<big_endian>::Scan::unsupported_reloc_local(
7141 Sized_relobj<32, big_endian>* object,
7142 unsigned int r_type)
7144 gold_error(_("%s: unsupported reloc %u against local symbol"),
7145 object->name().c_str(), r_type);
7148 // We are about to emit a dynamic relocation of type R_TYPE. If the
7149 // dynamic linker does not support it, issue an error. The GNU linker
7150 // only issues a non-PIC error for an allocated read-only section.
7151 // Here we know the section is allocated, but we don't know that it is
7152 // read-only. But we check for all the relocation types which the
7153 // glibc dynamic linker supports, so it seems appropriate to issue an
7154 // error even if the section is not read-only.
7156 template<bool big_endian>
7157 void
7158 Target_arm<big_endian>::Scan::check_non_pic(Relobj* object,
7159 unsigned int r_type)
7161 switch (r_type)
7163 // These are the relocation types supported by glibc for ARM.
7164 case elfcpp::R_ARM_RELATIVE:
7165 case elfcpp::R_ARM_COPY:
7166 case elfcpp::R_ARM_GLOB_DAT:
7167 case elfcpp::R_ARM_JUMP_SLOT:
7168 case elfcpp::R_ARM_ABS32:
7169 case elfcpp::R_ARM_ABS32_NOI:
7170 case elfcpp::R_ARM_PC24:
7171 // FIXME: The following 3 types are not supported by Android's dynamic
7172 // linker.
7173 case elfcpp::R_ARM_TLS_DTPMOD32:
7174 case elfcpp::R_ARM_TLS_DTPOFF32:
7175 case elfcpp::R_ARM_TLS_TPOFF32:
7176 return;
7178 default:
7180 // This prevents us from issuing more than one error per reloc
7181 // section. But we can still wind up issuing more than one
7182 // error per object file.
7183 if (this->issued_non_pic_error_)
7184 return;
7185 const Arm_reloc_property* reloc_property =
7186 arm_reloc_property_table->get_reloc_property(r_type);
7187 gold_assert(reloc_property != NULL);
7188 object->error(_("requires unsupported dynamic reloc %s; "
7189 "recompile with -fPIC"),
7190 reloc_property->name().c_str());
7191 this->issued_non_pic_error_ = true;
7192 return;
7195 case elfcpp::R_ARM_NONE:
7196 gold_unreachable();
7200 // Scan a relocation for a local symbol.
7201 // FIXME: This only handles a subset of relocation types used by Android
7202 // on ARM v5te devices.
7204 template<bool big_endian>
7205 inline void
7206 Target_arm<big_endian>::Scan::local(Symbol_table* symtab,
7207 Layout* layout,
7208 Target_arm* target,
7209 Sized_relobj<32, big_endian>* object,
7210 unsigned int data_shndx,
7211 Output_section* output_section,
7212 const elfcpp::Rel<32, big_endian>& reloc,
7213 unsigned int r_type,
7214 const elfcpp::Sym<32, big_endian>& lsym)
7216 r_type = get_real_reloc_type(r_type);
7217 switch (r_type)
7219 case elfcpp::R_ARM_NONE:
7220 case elfcpp::R_ARM_V4BX:
7221 case elfcpp::R_ARM_GNU_VTENTRY:
7222 case elfcpp::R_ARM_GNU_VTINHERIT:
7223 break;
7225 case elfcpp::R_ARM_ABS32:
7226 case elfcpp::R_ARM_ABS32_NOI:
7227 // If building a shared library (or a position-independent
7228 // executable), we need to create a dynamic relocation for
7229 // this location. The relocation applied at link time will
7230 // apply the link-time value, so we flag the location with
7231 // an R_ARM_RELATIVE relocation so the dynamic loader can
7232 // relocate it easily.
7233 if (parameters->options().output_is_position_independent())
7235 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7236 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7237 // If we are to add more other reloc types than R_ARM_ABS32,
7238 // we need to add check_non_pic(object, r_type) here.
7239 rel_dyn->add_local_relative(object, r_sym, elfcpp::R_ARM_RELATIVE,
7240 output_section, data_shndx,
7241 reloc.get_r_offset());
7243 break;
7245 case elfcpp::R_ARM_ABS16:
7246 case elfcpp::R_ARM_ABS12:
7247 case elfcpp::R_ARM_THM_ABS5:
7248 case elfcpp::R_ARM_ABS8:
7249 case elfcpp::R_ARM_BASE_ABS:
7250 case elfcpp::R_ARM_MOVW_ABS_NC:
7251 case elfcpp::R_ARM_MOVT_ABS:
7252 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
7253 case elfcpp::R_ARM_THM_MOVT_ABS:
7254 // If building a shared library (or a position-independent
7255 // executable), we need to create a dynamic relocation for
7256 // this location. Because the addend needs to remain in the
7257 // data section, we need to be careful not to apply this
7258 // relocation statically.
7259 if (parameters->options().output_is_position_independent())
7261 check_non_pic(object, r_type);
7262 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7263 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7264 if (lsym.get_st_type() != elfcpp::STT_SECTION)
7265 rel_dyn->add_local(object, r_sym, r_type, output_section,
7266 data_shndx, reloc.get_r_offset());
7267 else
7269 gold_assert(lsym.get_st_value() == 0);
7270 unsigned int shndx = lsym.get_st_shndx();
7271 bool is_ordinary;
7272 shndx = object->adjust_sym_shndx(r_sym, shndx,
7273 &is_ordinary);
7274 if (!is_ordinary)
7275 object->error(_("section symbol %u has bad shndx %u"),
7276 r_sym, shndx);
7277 else
7278 rel_dyn->add_local_section(object, shndx,
7279 r_type, output_section,
7280 data_shndx, reloc.get_r_offset());
7283 break;
7285 case elfcpp::R_ARM_PC24:
7286 case elfcpp::R_ARM_REL32:
7287 case elfcpp::R_ARM_LDR_PC_G0:
7288 case elfcpp::R_ARM_SBREL32:
7289 case elfcpp::R_ARM_THM_CALL:
7290 case elfcpp::R_ARM_THM_PC8:
7291 case elfcpp::R_ARM_BASE_PREL:
7292 case elfcpp::R_ARM_PLT32:
7293 case elfcpp::R_ARM_CALL:
7294 case elfcpp::R_ARM_JUMP24:
7295 case elfcpp::R_ARM_THM_JUMP24:
7296 case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
7297 case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
7298 case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
7299 case elfcpp::R_ARM_SBREL31:
7300 case elfcpp::R_ARM_PREL31:
7301 case elfcpp::R_ARM_MOVW_PREL_NC:
7302 case elfcpp::R_ARM_MOVT_PREL:
7303 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
7304 case elfcpp::R_ARM_THM_MOVT_PREL:
7305 case elfcpp::R_ARM_THM_JUMP19:
7306 case elfcpp::R_ARM_THM_JUMP6:
7307 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
7308 case elfcpp::R_ARM_THM_PC12:
7309 case elfcpp::R_ARM_REL32_NOI:
7310 case elfcpp::R_ARM_ALU_PC_G0_NC:
7311 case elfcpp::R_ARM_ALU_PC_G0:
7312 case elfcpp::R_ARM_ALU_PC_G1_NC:
7313 case elfcpp::R_ARM_ALU_PC_G1:
7314 case elfcpp::R_ARM_ALU_PC_G2:
7315 case elfcpp::R_ARM_LDR_PC_G1:
7316 case elfcpp::R_ARM_LDR_PC_G2:
7317 case elfcpp::R_ARM_LDRS_PC_G0:
7318 case elfcpp::R_ARM_LDRS_PC_G1:
7319 case elfcpp::R_ARM_LDRS_PC_G2:
7320 case elfcpp::R_ARM_LDC_PC_G0:
7321 case elfcpp::R_ARM_LDC_PC_G1:
7322 case elfcpp::R_ARM_LDC_PC_G2:
7323 case elfcpp::R_ARM_ALU_SB_G0_NC:
7324 case elfcpp::R_ARM_ALU_SB_G0:
7325 case elfcpp::R_ARM_ALU_SB_G1_NC:
7326 case elfcpp::R_ARM_ALU_SB_G1:
7327 case elfcpp::R_ARM_ALU_SB_G2:
7328 case elfcpp::R_ARM_LDR_SB_G0:
7329 case elfcpp::R_ARM_LDR_SB_G1:
7330 case elfcpp::R_ARM_LDR_SB_G2:
7331 case elfcpp::R_ARM_LDRS_SB_G0:
7332 case elfcpp::R_ARM_LDRS_SB_G1:
7333 case elfcpp::R_ARM_LDRS_SB_G2:
7334 case elfcpp::R_ARM_LDC_SB_G0:
7335 case elfcpp::R_ARM_LDC_SB_G1:
7336 case elfcpp::R_ARM_LDC_SB_G2:
7337 case elfcpp::R_ARM_MOVW_BREL_NC:
7338 case elfcpp::R_ARM_MOVT_BREL:
7339 case elfcpp::R_ARM_MOVW_BREL:
7340 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
7341 case elfcpp::R_ARM_THM_MOVT_BREL:
7342 case elfcpp::R_ARM_THM_MOVW_BREL:
7343 case elfcpp::R_ARM_THM_JUMP11:
7344 case elfcpp::R_ARM_THM_JUMP8:
7345 // We don't need to do anything for a relative addressing relocation
7346 // against a local symbol if it does not reference the GOT.
7347 break;
7349 case elfcpp::R_ARM_GOTOFF32:
7350 case elfcpp::R_ARM_GOTOFF12:
7351 // We need a GOT section:
7352 target->got_section(symtab, layout);
7353 break;
7355 case elfcpp::R_ARM_GOT_BREL:
7356 case elfcpp::R_ARM_GOT_PREL:
7358 // The symbol requires a GOT entry.
7359 Arm_output_data_got<big_endian>* got =
7360 target->got_section(symtab, layout);
7361 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7362 if (got->add_local(object, r_sym, GOT_TYPE_STANDARD))
7364 // If we are generating a shared object, we need to add a
7365 // dynamic RELATIVE relocation for this symbol's GOT entry.
7366 if (parameters->options().output_is_position_independent())
7368 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7369 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7370 rel_dyn->add_local_relative(
7371 object, r_sym, elfcpp::R_ARM_RELATIVE, got,
7372 object->local_got_offset(r_sym, GOT_TYPE_STANDARD));
7376 break;
7378 case elfcpp::R_ARM_TARGET1:
7379 case elfcpp::R_ARM_TARGET2:
7380 // This should have been mapped to another type already.
7381 // Fall through.
7382 case elfcpp::R_ARM_COPY:
7383 case elfcpp::R_ARM_GLOB_DAT:
7384 case elfcpp::R_ARM_JUMP_SLOT:
7385 case elfcpp::R_ARM_RELATIVE:
7386 // These are relocations which should only be seen by the
7387 // dynamic linker, and should never be seen here.
7388 gold_error(_("%s: unexpected reloc %u in object file"),
7389 object->name().c_str(), r_type);
7390 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 bool output_is_shared = parameters->options().shared();
7402 const tls::Tls_optimization optimized_type
7403 = Target_arm<big_endian>::optimize_tls_reloc(!output_is_shared,
7404 r_type);
7405 switch (r_type)
7407 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
7408 if (optimized_type == tls::TLSOPT_NONE)
7410 // Create a pair of GOT entries for the module index and
7411 // dtv-relative offset.
7412 Arm_output_data_got<big_endian>* got
7413 = target->got_section(symtab, layout);
7414 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7415 unsigned int shndx = lsym.get_st_shndx();
7416 bool is_ordinary;
7417 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
7418 if (!is_ordinary)
7420 object->error(_("local symbol %u has bad shndx %u"),
7421 r_sym, shndx);
7422 break;
7425 if (!parameters->doing_static_link())
7426 got->add_local_pair_with_rel(object, r_sym, shndx,
7427 GOT_TYPE_TLS_PAIR,
7428 target->rel_dyn_section(layout),
7429 elfcpp::R_ARM_TLS_DTPMOD32, 0);
7430 else
7431 got->add_tls_gd32_with_static_reloc(GOT_TYPE_TLS_PAIR,
7432 object, r_sym);
7434 else
7435 // FIXME: TLS optimization not supported yet.
7436 gold_unreachable();
7437 break;
7439 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
7440 if (optimized_type == tls::TLSOPT_NONE)
7442 // Create a GOT entry for the module index.
7443 target->got_mod_index_entry(symtab, layout, object);
7445 else
7446 // FIXME: TLS optimization not supported yet.
7447 gold_unreachable();
7448 break;
7450 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
7451 break;
7453 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
7454 layout->set_has_static_tls();
7455 if (optimized_type == tls::TLSOPT_NONE)
7457 // Create a GOT entry for the tp-relative offset.
7458 Arm_output_data_got<big_endian>* got
7459 = target->got_section(symtab, layout);
7460 unsigned int r_sym =
7461 elfcpp::elf_r_sym<32>(reloc.get_r_info());
7462 if (!parameters->doing_static_link())
7463 got->add_local_with_rel(object, r_sym, GOT_TYPE_TLS_OFFSET,
7464 target->rel_dyn_section(layout),
7465 elfcpp::R_ARM_TLS_TPOFF32);
7466 else if (!object->local_has_got_offset(r_sym,
7467 GOT_TYPE_TLS_OFFSET))
7469 got->add_local(object, r_sym, GOT_TYPE_TLS_OFFSET);
7470 unsigned int got_offset =
7471 object->local_got_offset(r_sym, GOT_TYPE_TLS_OFFSET);
7472 got->add_static_reloc(got_offset,
7473 elfcpp::R_ARM_TLS_TPOFF32, object,
7474 r_sym);
7477 else
7478 // FIXME: TLS optimization not supported yet.
7479 gold_unreachable();
7480 break;
7482 case elfcpp::R_ARM_TLS_LE32: // Local-exec
7483 layout->set_has_static_tls();
7484 if (output_is_shared)
7486 // We need to create a dynamic relocation.
7487 gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
7488 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
7489 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7490 rel_dyn->add_local(object, r_sym, elfcpp::R_ARM_TLS_TPOFF32,
7491 output_section, data_shndx,
7492 reloc.get_r_offset());
7494 break;
7496 default:
7497 gold_unreachable();
7500 break;
7502 default:
7503 unsupported_reloc_local(object, r_type);
7504 break;
7508 // Report an unsupported relocation against a global symbol.
7510 template<bool big_endian>
7511 void
7512 Target_arm<big_endian>::Scan::unsupported_reloc_global(
7513 Sized_relobj<32, big_endian>* object,
7514 unsigned int r_type,
7515 Symbol* gsym)
7517 gold_error(_("%s: unsupported reloc %u against global symbol %s"),
7518 object->name().c_str(), r_type, gsym->demangled_name().c_str());
7521 // Scan a relocation for a global symbol.
7523 template<bool big_endian>
7524 inline void
7525 Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
7526 Layout* layout,
7527 Target_arm* target,
7528 Sized_relobj<32, big_endian>* object,
7529 unsigned int data_shndx,
7530 Output_section* output_section,
7531 const elfcpp::Rel<32, big_endian>& reloc,
7532 unsigned int r_type,
7533 Symbol* gsym)
7535 // A reference to _GLOBAL_OFFSET_TABLE_ implies that we need a got
7536 // section. We check here to avoid creating a dynamic reloc against
7537 // _GLOBAL_OFFSET_TABLE_.
7538 if (!target->has_got_section()
7539 && strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0)
7540 target->got_section(symtab, layout);
7542 r_type = get_real_reloc_type(r_type);
7543 switch (r_type)
7545 case elfcpp::R_ARM_NONE:
7546 case elfcpp::R_ARM_V4BX:
7547 case elfcpp::R_ARM_GNU_VTENTRY:
7548 case elfcpp::R_ARM_GNU_VTINHERIT:
7549 break;
7551 case elfcpp::R_ARM_ABS32:
7552 case elfcpp::R_ARM_ABS16:
7553 case elfcpp::R_ARM_ABS12:
7554 case elfcpp::R_ARM_THM_ABS5:
7555 case elfcpp::R_ARM_ABS8:
7556 case elfcpp::R_ARM_BASE_ABS:
7557 case elfcpp::R_ARM_MOVW_ABS_NC:
7558 case elfcpp::R_ARM_MOVT_ABS:
7559 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
7560 case elfcpp::R_ARM_THM_MOVT_ABS:
7561 case elfcpp::R_ARM_ABS32_NOI:
7562 // Absolute addressing relocations.
7564 // Make a PLT entry if necessary.
7565 if (this->symbol_needs_plt_entry(gsym))
7567 target->make_plt_entry(symtab, layout, gsym);
7568 // Since this is not a PC-relative relocation, we may be
7569 // taking the address of a function. In that case we need to
7570 // set the entry in the dynamic symbol table to the address of
7571 // the PLT entry.
7572 if (gsym->is_from_dynobj() && !parameters->options().shared())
7573 gsym->set_needs_dynsym_value();
7575 // Make a dynamic relocation if necessary.
7576 if (gsym->needs_dynamic_reloc(Symbol::ABSOLUTE_REF))
7578 if (gsym->may_need_copy_reloc())
7580 target->copy_reloc(symtab, layout, object,
7581 data_shndx, output_section, gsym, reloc);
7583 else if ((r_type == elfcpp::R_ARM_ABS32
7584 || r_type == elfcpp::R_ARM_ABS32_NOI)
7585 && gsym->can_use_relative_reloc(false))
7587 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7588 rel_dyn->add_global_relative(gsym, elfcpp::R_ARM_RELATIVE,
7589 output_section, object,
7590 data_shndx, reloc.get_r_offset());
7592 else
7594 check_non_pic(object, r_type);
7595 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7596 rel_dyn->add_global(gsym, r_type, output_section, object,
7597 data_shndx, reloc.get_r_offset());
7601 break;
7603 case elfcpp::R_ARM_GOTOFF32:
7604 case elfcpp::R_ARM_GOTOFF12:
7605 // We need a GOT section.
7606 target->got_section(symtab, layout);
7607 break;
7609 case elfcpp::R_ARM_REL32:
7610 case elfcpp::R_ARM_LDR_PC_G0:
7611 case elfcpp::R_ARM_SBREL32:
7612 case elfcpp::R_ARM_THM_PC8:
7613 case elfcpp::R_ARM_BASE_PREL:
7614 case elfcpp::R_ARM_LDR_SBREL_11_0_NC:
7615 case elfcpp::R_ARM_ALU_SBREL_19_12_NC:
7616 case elfcpp::R_ARM_ALU_SBREL_27_20_CK:
7617 case elfcpp::R_ARM_MOVW_PREL_NC:
7618 case elfcpp::R_ARM_MOVT_PREL:
7619 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
7620 case elfcpp::R_ARM_THM_MOVT_PREL:
7621 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
7622 case elfcpp::R_ARM_THM_PC12:
7623 case elfcpp::R_ARM_REL32_NOI:
7624 case elfcpp::R_ARM_ALU_PC_G0_NC:
7625 case elfcpp::R_ARM_ALU_PC_G0:
7626 case elfcpp::R_ARM_ALU_PC_G1_NC:
7627 case elfcpp::R_ARM_ALU_PC_G1:
7628 case elfcpp::R_ARM_ALU_PC_G2:
7629 case elfcpp::R_ARM_LDR_PC_G1:
7630 case elfcpp::R_ARM_LDR_PC_G2:
7631 case elfcpp::R_ARM_LDRS_PC_G0:
7632 case elfcpp::R_ARM_LDRS_PC_G1:
7633 case elfcpp::R_ARM_LDRS_PC_G2:
7634 case elfcpp::R_ARM_LDC_PC_G0:
7635 case elfcpp::R_ARM_LDC_PC_G1:
7636 case elfcpp::R_ARM_LDC_PC_G2:
7637 case elfcpp::R_ARM_ALU_SB_G0_NC:
7638 case elfcpp::R_ARM_ALU_SB_G0:
7639 case elfcpp::R_ARM_ALU_SB_G1_NC:
7640 case elfcpp::R_ARM_ALU_SB_G1:
7641 case elfcpp::R_ARM_ALU_SB_G2:
7642 case elfcpp::R_ARM_LDR_SB_G0:
7643 case elfcpp::R_ARM_LDR_SB_G1:
7644 case elfcpp::R_ARM_LDR_SB_G2:
7645 case elfcpp::R_ARM_LDRS_SB_G0:
7646 case elfcpp::R_ARM_LDRS_SB_G1:
7647 case elfcpp::R_ARM_LDRS_SB_G2:
7648 case elfcpp::R_ARM_LDC_SB_G0:
7649 case elfcpp::R_ARM_LDC_SB_G1:
7650 case elfcpp::R_ARM_LDC_SB_G2:
7651 case elfcpp::R_ARM_MOVW_BREL_NC:
7652 case elfcpp::R_ARM_MOVT_BREL:
7653 case elfcpp::R_ARM_MOVW_BREL:
7654 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
7655 case elfcpp::R_ARM_THM_MOVT_BREL:
7656 case elfcpp::R_ARM_THM_MOVW_BREL:
7657 // Relative addressing relocations.
7659 // Make a dynamic relocation if necessary.
7660 int flags = Symbol::NON_PIC_REF;
7661 if (gsym->needs_dynamic_reloc(flags))
7663 if (target->may_need_copy_reloc(gsym))
7665 target->copy_reloc(symtab, layout, object,
7666 data_shndx, output_section, gsym, reloc);
7668 else
7670 check_non_pic(object, r_type);
7671 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7672 rel_dyn->add_global(gsym, r_type, output_section, object,
7673 data_shndx, reloc.get_r_offset());
7677 break;
7679 case elfcpp::R_ARM_PC24:
7680 case elfcpp::R_ARM_THM_CALL:
7681 case elfcpp::R_ARM_PLT32:
7682 case elfcpp::R_ARM_CALL:
7683 case elfcpp::R_ARM_JUMP24:
7684 case elfcpp::R_ARM_THM_JUMP24:
7685 case elfcpp::R_ARM_SBREL31:
7686 case elfcpp::R_ARM_PREL31:
7687 case elfcpp::R_ARM_THM_JUMP19:
7688 case elfcpp::R_ARM_THM_JUMP6:
7689 case elfcpp::R_ARM_THM_JUMP11:
7690 case elfcpp::R_ARM_THM_JUMP8:
7691 // All the relocation above are branches except for the PREL31 ones.
7692 // A PREL31 relocation can point to a personality function in a shared
7693 // library. In that case we want to use a PLT because we want to
7694 // call the personality routine and the dyanmic linkers we care about
7695 // do not support dynamic PREL31 relocations. An REL31 relocation may
7696 // point to a function whose unwinding behaviour is being described but
7697 // we will not mistakenly generate a PLT for that because we should use
7698 // a local section symbol.
7700 // If the symbol is fully resolved, this is just a relative
7701 // local reloc. Otherwise we need a PLT entry.
7702 if (gsym->final_value_is_known())
7703 break;
7704 // If building a shared library, we can also skip the PLT entry
7705 // if the symbol is defined in the output file and is protected
7706 // or hidden.
7707 if (gsym->is_defined()
7708 && !gsym->is_from_dynobj()
7709 && !gsym->is_preemptible())
7710 break;
7711 target->make_plt_entry(symtab, layout, gsym);
7712 break;
7714 case elfcpp::R_ARM_GOT_BREL:
7715 case elfcpp::R_ARM_GOT_ABS:
7716 case elfcpp::R_ARM_GOT_PREL:
7718 // The symbol requires a GOT entry.
7719 Arm_output_data_got<big_endian>* got =
7720 target->got_section(symtab, layout);
7721 if (gsym->final_value_is_known())
7722 got->add_global(gsym, GOT_TYPE_STANDARD);
7723 else
7725 // If this symbol is not fully resolved, we need to add a
7726 // GOT entry with a dynamic relocation.
7727 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7728 if (gsym->is_from_dynobj()
7729 || gsym->is_undefined()
7730 || gsym->is_preemptible())
7731 got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
7732 rel_dyn, elfcpp::R_ARM_GLOB_DAT);
7733 else
7735 if (got->add_global(gsym, GOT_TYPE_STANDARD))
7736 rel_dyn->add_global_relative(
7737 gsym, elfcpp::R_ARM_RELATIVE, got,
7738 gsym->got_offset(GOT_TYPE_STANDARD));
7742 break;
7744 case elfcpp::R_ARM_TARGET1:
7745 case elfcpp::R_ARM_TARGET2:
7746 // These should have been mapped to other types already.
7747 // Fall through.
7748 case elfcpp::R_ARM_COPY:
7749 case elfcpp::R_ARM_GLOB_DAT:
7750 case elfcpp::R_ARM_JUMP_SLOT:
7751 case elfcpp::R_ARM_RELATIVE:
7752 // These are relocations which should only be seen by the
7753 // dynamic linker, and should never be seen here.
7754 gold_error(_("%s: unexpected reloc %u in object file"),
7755 object->name().c_str(), r_type);
7756 break;
7758 // These are initial tls relocs, which are expected when
7759 // linking.
7760 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
7761 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
7762 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
7763 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
7764 case elfcpp::R_ARM_TLS_LE32: // Local-exec
7766 const bool is_final = gsym->final_value_is_known();
7767 const tls::Tls_optimization optimized_type
7768 = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
7769 switch (r_type)
7771 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
7772 if (optimized_type == tls::TLSOPT_NONE)
7774 // Create a pair of GOT entries for the module index and
7775 // dtv-relative offset.
7776 Arm_output_data_got<big_endian>* got
7777 = target->got_section(symtab, layout);
7778 if (!parameters->doing_static_link())
7779 got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR,
7780 target->rel_dyn_section(layout),
7781 elfcpp::R_ARM_TLS_DTPMOD32,
7782 elfcpp::R_ARM_TLS_DTPOFF32);
7783 else
7784 got->add_tls_gd32_with_static_reloc(GOT_TYPE_TLS_PAIR, gsym);
7786 else
7787 // FIXME: TLS optimization not supported yet.
7788 gold_unreachable();
7789 break;
7791 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
7792 if (optimized_type == tls::TLSOPT_NONE)
7794 // Create a GOT entry for the module index.
7795 target->got_mod_index_entry(symtab, layout, object);
7797 else
7798 // FIXME: TLS optimization not supported yet.
7799 gold_unreachable();
7800 break;
7802 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
7803 break;
7805 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
7806 layout->set_has_static_tls();
7807 if (optimized_type == tls::TLSOPT_NONE)
7809 // Create a GOT entry for the tp-relative offset.
7810 Arm_output_data_got<big_endian>* got
7811 = target->got_section(symtab, layout);
7812 if (!parameters->doing_static_link())
7813 got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET,
7814 target->rel_dyn_section(layout),
7815 elfcpp::R_ARM_TLS_TPOFF32);
7816 else if (!gsym->has_got_offset(GOT_TYPE_TLS_OFFSET))
7818 got->add_global(gsym, GOT_TYPE_TLS_OFFSET);
7819 unsigned int got_offset =
7820 gsym->got_offset(GOT_TYPE_TLS_OFFSET);
7821 got->add_static_reloc(got_offset,
7822 elfcpp::R_ARM_TLS_TPOFF32, gsym);
7825 else
7826 // FIXME: TLS optimization not supported yet.
7827 gold_unreachable();
7828 break;
7830 case elfcpp::R_ARM_TLS_LE32: // Local-exec
7831 layout->set_has_static_tls();
7832 if (parameters->options().shared())
7834 // We need to create a dynamic relocation.
7835 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
7836 rel_dyn->add_global(gsym, elfcpp::R_ARM_TLS_TPOFF32,
7837 output_section, object,
7838 data_shndx, reloc.get_r_offset());
7840 break;
7842 default:
7843 gold_unreachable();
7846 break;
7848 default:
7849 unsupported_reloc_global(object, r_type, gsym);
7850 break;
7854 // Process relocations for gc.
7856 template<bool big_endian>
7857 void
7858 Target_arm<big_endian>::gc_process_relocs(Symbol_table* symtab,
7859 Layout* layout,
7860 Sized_relobj<32, big_endian>* object,
7861 unsigned int data_shndx,
7862 unsigned int,
7863 const unsigned char* prelocs,
7864 size_t reloc_count,
7865 Output_section* output_section,
7866 bool needs_special_offset_handling,
7867 size_t local_symbol_count,
7868 const unsigned char* plocal_symbols)
7870 typedef Target_arm<big_endian> Arm;
7871 typedef typename Target_arm<big_endian>::Scan Scan;
7873 gold::gc_process_relocs<32, big_endian, Arm, elfcpp::SHT_REL, Scan>(
7874 symtab,
7875 layout,
7876 this,
7877 object,
7878 data_shndx,
7879 prelocs,
7880 reloc_count,
7881 output_section,
7882 needs_special_offset_handling,
7883 local_symbol_count,
7884 plocal_symbols);
7887 // Scan relocations for a section.
7889 template<bool big_endian>
7890 void
7891 Target_arm<big_endian>::scan_relocs(Symbol_table* symtab,
7892 Layout* layout,
7893 Sized_relobj<32, big_endian>* object,
7894 unsigned int data_shndx,
7895 unsigned int sh_type,
7896 const unsigned char* prelocs,
7897 size_t reloc_count,
7898 Output_section* output_section,
7899 bool needs_special_offset_handling,
7900 size_t local_symbol_count,
7901 const unsigned char* plocal_symbols)
7903 typedef typename Target_arm<big_endian>::Scan Scan;
7904 if (sh_type == elfcpp::SHT_RELA)
7906 gold_error(_("%s: unsupported RELA reloc section"),
7907 object->name().c_str());
7908 return;
7911 gold::scan_relocs<32, big_endian, Target_arm, elfcpp::SHT_REL, Scan>(
7912 symtab,
7913 layout,
7914 this,
7915 object,
7916 data_shndx,
7917 prelocs,
7918 reloc_count,
7919 output_section,
7920 needs_special_offset_handling,
7921 local_symbol_count,
7922 plocal_symbols);
7925 // Finalize the sections.
7927 template<bool big_endian>
7928 void
7929 Target_arm<big_endian>::do_finalize_sections(
7930 Layout* layout,
7931 const Input_objects* input_objects,
7932 Symbol_table* symtab)
7934 // Create an empty uninitialized attribute section if we still don't have it
7935 // at this moment.
7936 if (this->attributes_section_data_ == NULL)
7937 this->attributes_section_data_ = new Attributes_section_data(NULL, 0);
7939 // Merge processor-specific flags.
7940 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
7941 p != input_objects->relobj_end();
7942 ++p)
7944 // If this input file is a binary file, it has no processor
7945 // specific flags and attributes section.
7946 Input_file::Format format = (*p)->input_file()->format();
7947 if (format != Input_file::FORMAT_ELF)
7949 gold_assert(format == Input_file::FORMAT_BINARY);
7950 continue;
7953 Arm_relobj<big_endian>* arm_relobj =
7954 Arm_relobj<big_endian>::as_arm_relobj(*p);
7955 this->merge_processor_specific_flags(
7956 arm_relobj->name(),
7957 arm_relobj->processor_specific_flags());
7958 this->merge_object_attributes(arm_relobj->name().c_str(),
7959 arm_relobj->attributes_section_data());
7963 for (Input_objects::Dynobj_iterator p = input_objects->dynobj_begin();
7964 p != input_objects->dynobj_end();
7965 ++p)
7967 Arm_dynobj<big_endian>* arm_dynobj =
7968 Arm_dynobj<big_endian>::as_arm_dynobj(*p);
7969 this->merge_processor_specific_flags(
7970 arm_dynobj->name(),
7971 arm_dynobj->processor_specific_flags());
7972 this->merge_object_attributes(arm_dynobj->name().c_str(),
7973 arm_dynobj->attributes_section_data());
7976 // Check BLX use.
7977 const Object_attribute* cpu_arch_attr =
7978 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
7979 if (cpu_arch_attr->int_value() > elfcpp::TAG_CPU_ARCH_V4)
7980 this->set_may_use_blx(true);
7982 // Check if we need to use Cortex-A8 workaround.
7983 if (parameters->options().user_set_fix_cortex_a8())
7984 this->fix_cortex_a8_ = parameters->options().fix_cortex_a8();
7985 else
7987 // If neither --fix-cortex-a8 nor --no-fix-cortex-a8 is used, turn on
7988 // Cortex-A8 erratum workaround for ARMv7-A or ARMv7 with unknown
7989 // profile.
7990 const Object_attribute* cpu_arch_profile_attr =
7991 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
7992 this->fix_cortex_a8_ =
7993 (cpu_arch_attr->int_value() == elfcpp::TAG_CPU_ARCH_V7
7994 && (cpu_arch_profile_attr->int_value() == 'A'
7995 || cpu_arch_profile_attr->int_value() == 0));
7998 // Check if we can use V4BX interworking.
7999 // The V4BX interworking stub contains BX instruction,
8000 // which is not specified for some profiles.
8001 if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING
8002 && !this->may_use_blx())
8003 gold_error(_("unable to provide V4BX reloc interworking fix up; "
8004 "the target profile does not support BX instruction"));
8006 // Fill in some more dynamic tags.
8007 const Reloc_section* rel_plt = (this->plt_ == NULL
8008 ? NULL
8009 : this->plt_->rel_plt());
8010 layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
8011 this->rel_dyn_, true, false);
8013 // Emit any relocs we saved in an attempt to avoid generating COPY
8014 // relocs.
8015 if (this->copy_relocs_.any_saved_relocs())
8016 this->copy_relocs_.emit(this->rel_dyn_section(layout));
8018 // Handle the .ARM.exidx section.
8019 Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
8020 if (exidx_section != NULL
8021 && exidx_section->type() == elfcpp::SHT_ARM_EXIDX
8022 && !parameters->options().relocatable())
8024 // Create __exidx_start and __exdix_end symbols.
8025 symtab->define_in_output_data("__exidx_start", NULL,
8026 Symbol_table::PREDEFINED,
8027 exidx_section, 0, 0, elfcpp::STT_OBJECT,
8028 elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
8029 false, true);
8030 symtab->define_in_output_data("__exidx_end", NULL,
8031 Symbol_table::PREDEFINED,
8032 exidx_section, 0, 0, elfcpp::STT_OBJECT,
8033 elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
8034 true, true);
8036 // For the ARM target, we need to add a PT_ARM_EXIDX segment for
8037 // the .ARM.exidx section.
8038 if (!layout->script_options()->saw_phdrs_clause())
8040 gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0, 0)
8041 == NULL);
8042 Output_segment* exidx_segment =
8043 layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
8044 exidx_segment->add_output_section(exidx_section, elfcpp::PF_R,
8045 false);
8049 // Create an .ARM.attributes section if there is not one already.
8050 Output_attributes_section_data* attributes_section =
8051 new Output_attributes_section_data(*this->attributes_section_data_);
8052 layout->add_output_section_data(".ARM.attributes",
8053 elfcpp::SHT_ARM_ATTRIBUTES, 0,
8054 attributes_section, false, false, false,
8055 false);
8058 // Return whether a direct absolute static relocation needs to be applied.
8059 // In cases where Scan::local() or Scan::global() has created
8060 // a dynamic relocation other than R_ARM_RELATIVE, the addend
8061 // of the relocation is carried in the data, and we must not
8062 // apply the static relocation.
8064 template<bool big_endian>
8065 inline bool
8066 Target_arm<big_endian>::Relocate::should_apply_static_reloc(
8067 const Sized_symbol<32>* gsym,
8068 int ref_flags,
8069 bool is_32bit,
8070 Output_section* output_section)
8072 // If the output section is not allocated, then we didn't call
8073 // scan_relocs, we didn't create a dynamic reloc, and we must apply
8074 // the reloc here.
8075 if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0)
8076 return true;
8078 // For local symbols, we will have created a non-RELATIVE dynamic
8079 // relocation only if (a) the output is position independent,
8080 // (b) the relocation is absolute (not pc- or segment-relative), and
8081 // (c) the relocation is not 32 bits wide.
8082 if (gsym == NULL)
8083 return !(parameters->options().output_is_position_independent()
8084 && (ref_flags & Symbol::ABSOLUTE_REF)
8085 && !is_32bit);
8087 // For global symbols, we use the same helper routines used in the
8088 // scan pass. If we did not create a dynamic relocation, or if we
8089 // created a RELATIVE dynamic relocation, we should apply the static
8090 // relocation.
8091 bool has_dyn = gsym->needs_dynamic_reloc(ref_flags);
8092 bool is_rel = (ref_flags & Symbol::ABSOLUTE_REF)
8093 && gsym->can_use_relative_reloc(ref_flags
8094 & Symbol::FUNCTION_CALL);
8095 return !has_dyn || is_rel;
8098 // Perform a relocation.
8100 template<bool big_endian>
8101 inline bool
8102 Target_arm<big_endian>::Relocate::relocate(
8103 const Relocate_info<32, big_endian>* relinfo,
8104 Target_arm* target,
8105 Output_section *output_section,
8106 size_t relnum,
8107 const elfcpp::Rel<32, big_endian>& rel,
8108 unsigned int r_type,
8109 const Sized_symbol<32>* gsym,
8110 const Symbol_value<32>* psymval,
8111 unsigned char* view,
8112 Arm_address address,
8113 section_size_type view_size)
8115 typedef Arm_relocate_functions<big_endian> Arm_relocate_functions;
8117 r_type = get_real_reloc_type(r_type);
8118 const Arm_reloc_property* reloc_property =
8119 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
8120 if (reloc_property == NULL)
8122 std::string reloc_name =
8123 arm_reloc_property_table->reloc_name_in_error_message(r_type);
8124 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
8125 _("cannot relocate %s in object file"),
8126 reloc_name.c_str());
8127 return true;
8130 const Arm_relobj<big_endian>* object =
8131 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
8133 // If the final branch target of a relocation is THUMB instruction, this
8134 // is 1. Otherwise it is 0.
8135 Arm_address thumb_bit = 0;
8136 Symbol_value<32> symval;
8137 bool is_weakly_undefined_without_plt = false;
8138 if (relnum != Target_arm<big_endian>::fake_relnum_for_stubs)
8140 if (gsym != NULL)
8142 // This is a global symbol. Determine if we use PLT and if the
8143 // final target is THUMB.
8144 if (gsym->use_plt_offset(reloc_is_non_pic(r_type)))
8146 // This uses a PLT, change the symbol value.
8147 symval.set_output_value(target->plt_section()->address()
8148 + gsym->plt_offset());
8149 psymval = &symval;
8151 else if (gsym->is_weak_undefined())
8153 // This is a weakly undefined symbol and we do not use PLT
8154 // for this relocation. A branch targeting this symbol will
8155 // be converted into an NOP.
8156 is_weakly_undefined_without_plt = true;
8158 else
8160 // Set thumb bit if symbol:
8161 // -Has type STT_ARM_TFUNC or
8162 // -Has type STT_FUNC, is defined and with LSB in value set.
8163 thumb_bit =
8164 (((gsym->type() == elfcpp::STT_ARM_TFUNC)
8165 || (gsym->type() == elfcpp::STT_FUNC
8166 && !gsym->is_undefined()
8167 && ((psymval->value(object, 0) & 1) != 0)))
8169 : 0);
8172 else
8174 // This is a local symbol. Determine if the final target is THUMB.
8175 // We saved this information when all the local symbols were read.
8176 elfcpp::Elf_types<32>::Elf_WXword r_info = rel.get_r_info();
8177 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
8178 thumb_bit = object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
8181 else
8183 // This is a fake relocation synthesized for a stub. It does not have
8184 // a real symbol. We just look at the LSB of the symbol value to
8185 // determine if the target is THUMB or not.
8186 thumb_bit = ((psymval->value(object, 0) & 1) != 0);
8189 // Strip LSB if this points to a THUMB target.
8190 if (thumb_bit != 0
8191 && reloc_property->uses_thumb_bit()
8192 && ((psymval->value(object, 0) & 1) != 0))
8194 Arm_address stripped_value =
8195 psymval->value(object, 0) & ~static_cast<Arm_address>(1);
8196 symval.set_output_value(stripped_value);
8197 psymval = &symval;
8200 // Get the GOT offset if needed.
8201 // The GOT pointer points to the end of the GOT section.
8202 // We need to subtract the size of the GOT section to get
8203 // the actual offset to use in the relocation.
8204 bool have_got_offset = false;
8205 unsigned int got_offset = 0;
8206 switch (r_type)
8208 case elfcpp::R_ARM_GOT_BREL:
8209 case elfcpp::R_ARM_GOT_PREL:
8210 if (gsym != NULL)
8212 gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
8213 got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
8214 - target->got_size());
8216 else
8218 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
8219 gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD));
8220 got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
8221 - target->got_size());
8223 have_got_offset = true;
8224 break;
8226 default:
8227 break;
8230 // To look up relocation stubs, we need to pass the symbol table index of
8231 // a local symbol.
8232 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
8234 // Get the addressing origin of the output segment defining the
8235 // symbol gsym if needed (AAELF 4.6.1.2 Relocation types).
8236 Arm_address sym_origin = 0;
8237 if (reloc_property->uses_symbol_base())
8239 if (r_type == elfcpp::R_ARM_BASE_ABS && gsym == NULL)
8240 // R_ARM_BASE_ABS with the NULL symbol will give the
8241 // absolute address of the GOT origin (GOT_ORG) (see ARM IHI
8242 // 0044C (AAELF): 4.6.1.8 Proxy generating relocations).
8243 sym_origin = target->got_plt_section()->address();
8244 else if (gsym == NULL)
8245 sym_origin = 0;
8246 else if (gsym->source() == Symbol::IN_OUTPUT_SEGMENT)
8247 sym_origin = gsym->output_segment()->vaddr();
8248 else if (gsym->source() == Symbol::IN_OUTPUT_DATA)
8249 sym_origin = gsym->output_data()->address();
8251 // TODO: Assumes the segment base to be zero for the global symbols
8252 // till the proper support for the segment-base-relative addressing
8253 // will be implemented. This is consistent with GNU ld.
8256 // For relative addressing relocation, find out the relative address base.
8257 Arm_address relative_address_base = 0;
8258 switch(reloc_property->relative_address_base())
8260 case Arm_reloc_property::RAB_NONE:
8261 // Relocations with relative address bases RAB_TLS and RAB_tp are
8262 // handled by relocate_tls. So we do not need to do anything here.
8263 case Arm_reloc_property::RAB_TLS:
8264 case Arm_reloc_property::RAB_tp:
8265 break;
8266 case Arm_reloc_property::RAB_B_S:
8267 relative_address_base = sym_origin;
8268 break;
8269 case Arm_reloc_property::RAB_GOT_ORG:
8270 relative_address_base = target->got_plt_section()->address();
8271 break;
8272 case Arm_reloc_property::RAB_P:
8273 relative_address_base = address;
8274 break;
8275 case Arm_reloc_property::RAB_Pa:
8276 relative_address_base = address & 0xfffffffcU;
8277 break;
8278 default:
8279 gold_unreachable();
8282 typename Arm_relocate_functions::Status reloc_status =
8283 Arm_relocate_functions::STATUS_OKAY;
8284 bool check_overflow = reloc_property->checks_overflow();
8285 switch (r_type)
8287 case elfcpp::R_ARM_NONE:
8288 break;
8290 case elfcpp::R_ARM_ABS8:
8291 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
8292 output_section))
8293 reloc_status = Arm_relocate_functions::abs8(view, object, psymval);
8294 break;
8296 case elfcpp::R_ARM_ABS12:
8297 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
8298 output_section))
8299 reloc_status = Arm_relocate_functions::abs12(view, object, psymval);
8300 break;
8302 case elfcpp::R_ARM_ABS16:
8303 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
8304 output_section))
8305 reloc_status = Arm_relocate_functions::abs16(view, object, psymval);
8306 break;
8308 case elfcpp::R_ARM_ABS32:
8309 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
8310 output_section))
8311 reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
8312 thumb_bit);
8313 break;
8315 case elfcpp::R_ARM_ABS32_NOI:
8316 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
8317 output_section))
8318 // No thumb bit for this relocation: (S + A)
8319 reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
8321 break;
8323 case elfcpp::R_ARM_MOVW_ABS_NC:
8324 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
8325 output_section))
8326 reloc_status = Arm_relocate_functions::movw(view, object, psymval,
8327 0, thumb_bit,
8328 check_overflow);
8329 break;
8331 case elfcpp::R_ARM_MOVT_ABS:
8332 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
8333 output_section))
8334 reloc_status = Arm_relocate_functions::movt(view, object, psymval, 0);
8335 break;
8337 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
8338 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
8339 output_section))
8340 reloc_status = Arm_relocate_functions::thm_movw(view, object, psymval,
8341 0, thumb_bit, false);
8342 break;
8344 case elfcpp::R_ARM_THM_MOVT_ABS:
8345 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
8346 output_section))
8347 reloc_status = Arm_relocate_functions::thm_movt(view, object,
8348 psymval, 0);
8349 break;
8351 case elfcpp::R_ARM_MOVW_PREL_NC:
8352 case elfcpp::R_ARM_MOVW_BREL_NC:
8353 case elfcpp::R_ARM_MOVW_BREL:
8354 reloc_status =
8355 Arm_relocate_functions::movw(view, object, psymval,
8356 relative_address_base, thumb_bit,
8357 check_overflow);
8358 break;
8360 case elfcpp::R_ARM_MOVT_PREL:
8361 case elfcpp::R_ARM_MOVT_BREL:
8362 reloc_status =
8363 Arm_relocate_functions::movt(view, object, psymval,
8364 relative_address_base);
8365 break;
8367 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
8368 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
8369 case elfcpp::R_ARM_THM_MOVW_BREL:
8370 reloc_status =
8371 Arm_relocate_functions::thm_movw(view, object, psymval,
8372 relative_address_base,
8373 thumb_bit, check_overflow);
8374 break;
8376 case elfcpp::R_ARM_THM_MOVT_PREL:
8377 case elfcpp::R_ARM_THM_MOVT_BREL:
8378 reloc_status =
8379 Arm_relocate_functions::thm_movt(view, object, psymval,
8380 relative_address_base);
8381 break;
8383 case elfcpp::R_ARM_REL32:
8384 reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
8385 address, thumb_bit);
8386 break;
8388 case elfcpp::R_ARM_THM_ABS5:
8389 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
8390 output_section))
8391 reloc_status = Arm_relocate_functions::thm_abs5(view, object, psymval);
8392 break;
8394 // Thumb long branches.
8395 case elfcpp::R_ARM_THM_CALL:
8396 case elfcpp::R_ARM_THM_XPC22:
8397 case elfcpp::R_ARM_THM_JUMP24:
8398 reloc_status =
8399 Arm_relocate_functions::thumb_branch_common(
8400 r_type, relinfo, view, gsym, object, r_sym, psymval, address,
8401 thumb_bit, is_weakly_undefined_without_plt);
8402 break;
8404 case elfcpp::R_ARM_GOTOFF32:
8406 Arm_address got_origin;
8407 got_origin = target->got_plt_section()->address();
8408 reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
8409 got_origin, thumb_bit);
8411 break;
8413 case elfcpp::R_ARM_BASE_PREL:
8414 gold_assert(gsym != NULL);
8415 reloc_status =
8416 Arm_relocate_functions::base_prel(view, sym_origin, address);
8417 break;
8419 case elfcpp::R_ARM_BASE_ABS:
8421 if (!should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
8422 output_section))
8423 break;
8425 reloc_status = Arm_relocate_functions::base_abs(view, sym_origin);
8427 break;
8429 case elfcpp::R_ARM_GOT_BREL:
8430 gold_assert(have_got_offset);
8431 reloc_status = Arm_relocate_functions::got_brel(view, got_offset);
8432 break;
8434 case elfcpp::R_ARM_GOT_PREL:
8435 gold_assert(have_got_offset);
8436 // Get the address origin for GOT PLT, which is allocated right
8437 // after the GOT section, to calculate an absolute address of
8438 // the symbol GOT entry (got_origin + got_offset).
8439 Arm_address got_origin;
8440 got_origin = target->got_plt_section()->address();
8441 reloc_status = Arm_relocate_functions::got_prel(view,
8442 got_origin + got_offset,
8443 address);
8444 break;
8446 case elfcpp::R_ARM_PLT32:
8447 case elfcpp::R_ARM_CALL:
8448 case elfcpp::R_ARM_JUMP24:
8449 case elfcpp::R_ARM_XPC25:
8450 gold_assert(gsym == NULL
8451 || gsym->has_plt_offset()
8452 || gsym->final_value_is_known()
8453 || (gsym->is_defined()
8454 && !gsym->is_from_dynobj()
8455 && !gsym->is_preemptible()));
8456 reloc_status =
8457 Arm_relocate_functions::arm_branch_common(
8458 r_type, relinfo, view, gsym, object, r_sym, psymval, address,
8459 thumb_bit, is_weakly_undefined_without_plt);
8460 break;
8462 case elfcpp::R_ARM_THM_JUMP19:
8463 reloc_status =
8464 Arm_relocate_functions::thm_jump19(view, object, psymval, address,
8465 thumb_bit);
8466 break;
8468 case elfcpp::R_ARM_THM_JUMP6:
8469 reloc_status =
8470 Arm_relocate_functions::thm_jump6(view, object, psymval, address);
8471 break;
8473 case elfcpp::R_ARM_THM_JUMP8:
8474 reloc_status =
8475 Arm_relocate_functions::thm_jump8(view, object, psymval, address);
8476 break;
8478 case elfcpp::R_ARM_THM_JUMP11:
8479 reloc_status =
8480 Arm_relocate_functions::thm_jump11(view, object, psymval, address);
8481 break;
8483 case elfcpp::R_ARM_PREL31:
8484 reloc_status = Arm_relocate_functions::prel31(view, object, psymval,
8485 address, thumb_bit);
8486 break;
8488 case elfcpp::R_ARM_V4BX:
8489 if (target->fix_v4bx() > General_options::FIX_V4BX_NONE)
8491 const bool is_v4bx_interworking =
8492 (target->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING);
8493 reloc_status =
8494 Arm_relocate_functions::v4bx(relinfo, view, object, address,
8495 is_v4bx_interworking);
8497 break;
8499 case elfcpp::R_ARM_THM_PC8:
8500 reloc_status =
8501 Arm_relocate_functions::thm_pc8(view, object, psymval, address);
8502 break;
8504 case elfcpp::R_ARM_THM_PC12:
8505 reloc_status =
8506 Arm_relocate_functions::thm_pc12(view, object, psymval, address);
8507 break;
8509 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
8510 reloc_status =
8511 Arm_relocate_functions::thm_alu11(view, object, psymval, address,
8512 thumb_bit);
8513 break;
8515 case elfcpp::R_ARM_ALU_PC_G0_NC:
8516 case elfcpp::R_ARM_ALU_PC_G0:
8517 case elfcpp::R_ARM_ALU_PC_G1_NC:
8518 case elfcpp::R_ARM_ALU_PC_G1:
8519 case elfcpp::R_ARM_ALU_PC_G2:
8520 case elfcpp::R_ARM_ALU_SB_G0_NC:
8521 case elfcpp::R_ARM_ALU_SB_G0:
8522 case elfcpp::R_ARM_ALU_SB_G1_NC:
8523 case elfcpp::R_ARM_ALU_SB_G1:
8524 case elfcpp::R_ARM_ALU_SB_G2:
8525 reloc_status =
8526 Arm_relocate_functions::arm_grp_alu(view, object, psymval,
8527 reloc_property->group_index(),
8528 relative_address_base,
8529 thumb_bit, check_overflow);
8530 break;
8532 case elfcpp::R_ARM_LDR_PC_G0:
8533 case elfcpp::R_ARM_LDR_PC_G1:
8534 case elfcpp::R_ARM_LDR_PC_G2:
8535 case elfcpp::R_ARM_LDR_SB_G0:
8536 case elfcpp::R_ARM_LDR_SB_G1:
8537 case elfcpp::R_ARM_LDR_SB_G2:
8538 reloc_status =
8539 Arm_relocate_functions::arm_grp_ldr(view, object, psymval,
8540 reloc_property->group_index(),
8541 relative_address_base);
8542 break;
8544 case elfcpp::R_ARM_LDRS_PC_G0:
8545 case elfcpp::R_ARM_LDRS_PC_G1:
8546 case elfcpp::R_ARM_LDRS_PC_G2:
8547 case elfcpp::R_ARM_LDRS_SB_G0:
8548 case elfcpp::R_ARM_LDRS_SB_G1:
8549 case elfcpp::R_ARM_LDRS_SB_G2:
8550 reloc_status =
8551 Arm_relocate_functions::arm_grp_ldrs(view, object, psymval,
8552 reloc_property->group_index(),
8553 relative_address_base);
8554 break;
8556 case elfcpp::R_ARM_LDC_PC_G0:
8557 case elfcpp::R_ARM_LDC_PC_G1:
8558 case elfcpp::R_ARM_LDC_PC_G2:
8559 case elfcpp::R_ARM_LDC_SB_G0:
8560 case elfcpp::R_ARM_LDC_SB_G1:
8561 case elfcpp::R_ARM_LDC_SB_G2:
8562 reloc_status =
8563 Arm_relocate_functions::arm_grp_ldc(view, object, psymval,
8564 reloc_property->group_index(),
8565 relative_address_base);
8566 break;
8568 // These are initial tls relocs, which are expected when
8569 // linking.
8570 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
8571 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
8572 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
8573 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
8574 case elfcpp::R_ARM_TLS_LE32: // Local-exec
8575 reloc_status =
8576 this->relocate_tls(relinfo, target, relnum, rel, r_type, gsym, psymval,
8577 view, address, view_size);
8578 break;
8580 default:
8581 gold_unreachable();
8584 // Report any errors.
8585 switch (reloc_status)
8587 case Arm_relocate_functions::STATUS_OKAY:
8588 break;
8589 case Arm_relocate_functions::STATUS_OVERFLOW:
8590 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
8591 _("relocation overflow in %s"),
8592 reloc_property->name().c_str());
8593 break;
8594 case Arm_relocate_functions::STATUS_BAD_RELOC:
8595 gold_error_at_location(
8596 relinfo,
8597 relnum,
8598 rel.get_r_offset(),
8599 _("unexpected opcode while processing relocation %s"),
8600 reloc_property->name().c_str());
8601 break;
8602 default:
8603 gold_unreachable();
8606 return true;
8609 // Perform a TLS relocation.
8611 template<bool big_endian>
8612 inline typename Arm_relocate_functions<big_endian>::Status
8613 Target_arm<big_endian>::Relocate::relocate_tls(
8614 const Relocate_info<32, big_endian>* relinfo,
8615 Target_arm<big_endian>* target,
8616 size_t relnum,
8617 const elfcpp::Rel<32, big_endian>& rel,
8618 unsigned int r_type,
8619 const Sized_symbol<32>* gsym,
8620 const Symbol_value<32>* psymval,
8621 unsigned char* view,
8622 elfcpp::Elf_types<32>::Elf_Addr address,
8623 section_size_type /*view_size*/ )
8625 typedef Arm_relocate_functions<big_endian> ArmRelocFuncs;
8626 typedef Relocate_functions<32, big_endian> RelocFuncs;
8627 Output_segment* tls_segment = relinfo->layout->tls_segment();
8629 const Sized_relobj<32, big_endian>* object = relinfo->object;
8631 elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0);
8633 const bool is_final = (gsym == NULL
8634 ? !parameters->options().shared()
8635 : gsym->final_value_is_known());
8636 const tls::Tls_optimization optimized_type
8637 = Target_arm<big_endian>::optimize_tls_reloc(is_final, r_type);
8638 switch (r_type)
8640 case elfcpp::R_ARM_TLS_GD32: // Global-dynamic
8642 unsigned int got_type = GOT_TYPE_TLS_PAIR;
8643 unsigned int got_offset;
8644 if (gsym != NULL)
8646 gold_assert(gsym->has_got_offset(got_type));
8647 got_offset = gsym->got_offset(got_type) - target->got_size();
8649 else
8651 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
8652 gold_assert(object->local_has_got_offset(r_sym, got_type));
8653 got_offset = (object->local_got_offset(r_sym, got_type)
8654 - target->got_size());
8656 if (optimized_type == tls::TLSOPT_NONE)
8658 Arm_address got_entry =
8659 target->got_plt_section()->address() + got_offset;
8661 // Relocate the field with the PC relative offset of the pair of
8662 // GOT entries.
8663 RelocFuncs::pcrel32(view, got_entry, address);
8664 return ArmRelocFuncs::STATUS_OKAY;
8667 break;
8669 case elfcpp::R_ARM_TLS_LDM32: // Local-dynamic
8670 if (optimized_type == tls::TLSOPT_NONE)
8672 // Relocate the field with the offset of the GOT entry for
8673 // the module index.
8674 unsigned int got_offset;
8675 got_offset = (target->got_mod_index_entry(NULL, NULL, NULL)
8676 - target->got_size());
8677 Arm_address got_entry =
8678 target->got_plt_section()->address() + got_offset;
8680 // Relocate the field with the PC relative offset of the pair of
8681 // GOT entries.
8682 RelocFuncs::pcrel32(view, got_entry, address);
8683 return ArmRelocFuncs::STATUS_OKAY;
8685 break;
8687 case elfcpp::R_ARM_TLS_LDO32: // Alternate local-dynamic
8688 RelocFuncs::rel32(view, value);
8689 return ArmRelocFuncs::STATUS_OKAY;
8691 case elfcpp::R_ARM_TLS_IE32: // Initial-exec
8692 if (optimized_type == tls::TLSOPT_NONE)
8694 // Relocate the field with the offset of the GOT entry for
8695 // the tp-relative offset of the symbol.
8696 unsigned int got_type = GOT_TYPE_TLS_OFFSET;
8697 unsigned int got_offset;
8698 if (gsym != NULL)
8700 gold_assert(gsym->has_got_offset(got_type));
8701 got_offset = gsym->got_offset(got_type);
8703 else
8705 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
8706 gold_assert(object->local_has_got_offset(r_sym, got_type));
8707 got_offset = object->local_got_offset(r_sym, got_type);
8710 // All GOT offsets are relative to the end of the GOT.
8711 got_offset -= target->got_size();
8713 Arm_address got_entry =
8714 target->got_plt_section()->address() + got_offset;
8716 // Relocate the field with the PC relative offset of the GOT entry.
8717 RelocFuncs::pcrel32(view, got_entry, address);
8718 return ArmRelocFuncs::STATUS_OKAY;
8720 break;
8722 case elfcpp::R_ARM_TLS_LE32: // Local-exec
8723 // If we're creating a shared library, a dynamic relocation will
8724 // have been created for this location, so do not apply it now.
8725 if (!parameters->options().shared())
8727 gold_assert(tls_segment != NULL);
8729 // $tp points to the TCB, which is followed by the TLS, so we
8730 // need to add TCB size to the offset.
8731 Arm_address aligned_tcb_size =
8732 align_address(ARM_TCB_SIZE, tls_segment->maximum_alignment());
8733 RelocFuncs::rel32(view, value + aligned_tcb_size);
8736 return ArmRelocFuncs::STATUS_OKAY;
8738 default:
8739 gold_unreachable();
8742 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
8743 _("unsupported reloc %u"),
8744 r_type);
8745 return ArmRelocFuncs::STATUS_BAD_RELOC;
8748 // Relocate section data.
8750 template<bool big_endian>
8751 void
8752 Target_arm<big_endian>::relocate_section(
8753 const Relocate_info<32, big_endian>* relinfo,
8754 unsigned int sh_type,
8755 const unsigned char* prelocs,
8756 size_t reloc_count,
8757 Output_section* output_section,
8758 bool needs_special_offset_handling,
8759 unsigned char* view,
8760 Arm_address address,
8761 section_size_type view_size,
8762 const Reloc_symbol_changes* reloc_symbol_changes)
8764 typedef typename Target_arm<big_endian>::Relocate Arm_relocate;
8765 gold_assert(sh_type == elfcpp::SHT_REL);
8767 // See if we are relocating a relaxed input section. If so, the view
8768 // covers the whole output section and we need to adjust accordingly.
8769 if (needs_special_offset_handling)
8771 const Output_relaxed_input_section* poris =
8772 output_section->find_relaxed_input_section(relinfo->object,
8773 relinfo->data_shndx);
8774 if (poris != NULL)
8776 Arm_address section_address = poris->address();
8777 section_size_type section_size = poris->data_size();
8779 gold_assert((section_address >= address)
8780 && ((section_address + section_size)
8781 <= (address + view_size)));
8783 off_t offset = section_address - address;
8784 view += offset;
8785 address += offset;
8786 view_size = section_size;
8790 gold::relocate_section<32, big_endian, Target_arm, elfcpp::SHT_REL,
8791 Arm_relocate>(
8792 relinfo,
8793 this,
8794 prelocs,
8795 reloc_count,
8796 output_section,
8797 needs_special_offset_handling,
8798 view,
8799 address,
8800 view_size,
8801 reloc_symbol_changes);
8804 // Return the size of a relocation while scanning during a relocatable
8805 // link.
8807 template<bool big_endian>
8808 unsigned int
8809 Target_arm<big_endian>::Relocatable_size_for_reloc::get_size_for_reloc(
8810 unsigned int r_type,
8811 Relobj* object)
8813 r_type = get_real_reloc_type(r_type);
8814 const Arm_reloc_property* arp =
8815 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
8816 if (arp != NULL)
8817 return arp->size();
8818 else
8820 std::string reloc_name =
8821 arm_reloc_property_table->reloc_name_in_error_message(r_type);
8822 gold_error(_("%s: unexpected %s in object file"),
8823 object->name().c_str(), reloc_name.c_str());
8824 return 0;
8828 // Scan the relocs during a relocatable link.
8830 template<bool big_endian>
8831 void
8832 Target_arm<big_endian>::scan_relocatable_relocs(
8833 Symbol_table* symtab,
8834 Layout* layout,
8835 Sized_relobj<32, big_endian>* object,
8836 unsigned int data_shndx,
8837 unsigned int sh_type,
8838 const unsigned char* prelocs,
8839 size_t reloc_count,
8840 Output_section* output_section,
8841 bool needs_special_offset_handling,
8842 size_t local_symbol_count,
8843 const unsigned char* plocal_symbols,
8844 Relocatable_relocs* rr)
8846 gold_assert(sh_type == elfcpp::SHT_REL);
8848 typedef gold::Default_scan_relocatable_relocs<elfcpp::SHT_REL,
8849 Relocatable_size_for_reloc> Scan_relocatable_relocs;
8851 gold::scan_relocatable_relocs<32, big_endian, elfcpp::SHT_REL,
8852 Scan_relocatable_relocs>(
8853 symtab,
8854 layout,
8855 object,
8856 data_shndx,
8857 prelocs,
8858 reloc_count,
8859 output_section,
8860 needs_special_offset_handling,
8861 local_symbol_count,
8862 plocal_symbols,
8863 rr);
8866 // Relocate a section during a relocatable link.
8868 template<bool big_endian>
8869 void
8870 Target_arm<big_endian>::relocate_for_relocatable(
8871 const Relocate_info<32, big_endian>* relinfo,
8872 unsigned int sh_type,
8873 const unsigned char* prelocs,
8874 size_t reloc_count,
8875 Output_section* output_section,
8876 off_t offset_in_output_section,
8877 const Relocatable_relocs* rr,
8878 unsigned char* view,
8879 Arm_address view_address,
8880 section_size_type view_size,
8881 unsigned char* reloc_view,
8882 section_size_type reloc_view_size)
8884 gold_assert(sh_type == elfcpp::SHT_REL);
8886 gold::relocate_for_relocatable<32, big_endian, elfcpp::SHT_REL>(
8887 relinfo,
8888 prelocs,
8889 reloc_count,
8890 output_section,
8891 offset_in_output_section,
8893 view,
8894 view_address,
8895 view_size,
8896 reloc_view,
8897 reloc_view_size);
8900 // Return the value to use for a dynamic symbol which requires special
8901 // treatment. This is how we support equality comparisons of function
8902 // pointers across shared library boundaries, as described in the
8903 // processor specific ABI supplement.
8905 template<bool big_endian>
8906 uint64_t
8907 Target_arm<big_endian>::do_dynsym_value(const Symbol* gsym) const
8909 gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
8910 return this->plt_section()->address() + gsym->plt_offset();
8913 // Map platform-specific relocs to real relocs
8915 template<bool big_endian>
8916 unsigned int
8917 Target_arm<big_endian>::get_real_reloc_type (unsigned int r_type)
8919 switch (r_type)
8921 case elfcpp::R_ARM_TARGET1:
8922 // This is either R_ARM_ABS32 or R_ARM_REL32;
8923 return elfcpp::R_ARM_ABS32;
8925 case elfcpp::R_ARM_TARGET2:
8926 // This can be any reloc type but ususally is R_ARM_GOT_PREL
8927 return elfcpp::R_ARM_GOT_PREL;
8929 default:
8930 return r_type;
8934 // Whether if two EABI versions V1 and V2 are compatible.
8936 template<bool big_endian>
8937 bool
8938 Target_arm<big_endian>::are_eabi_versions_compatible(
8939 elfcpp::Elf_Word v1,
8940 elfcpp::Elf_Word v2)
8942 // v4 and v5 are the same spec before and after it was released,
8943 // so allow mixing them.
8944 if ((v1 == elfcpp::EF_ARM_EABI_VER4 && v2 == elfcpp::EF_ARM_EABI_VER5)
8945 || (v1 == elfcpp::EF_ARM_EABI_VER5 && v2 == elfcpp::EF_ARM_EABI_VER4))
8946 return true;
8948 return v1 == v2;
8951 // Combine FLAGS from an input object called NAME and the processor-specific
8952 // flags in the ELF header of the output. Much of this is adapted from the
8953 // processor-specific flags merging code in elf32_arm_merge_private_bfd_data
8954 // in bfd/elf32-arm.c.
8956 template<bool big_endian>
8957 void
8958 Target_arm<big_endian>::merge_processor_specific_flags(
8959 const std::string& name,
8960 elfcpp::Elf_Word flags)
8962 if (this->are_processor_specific_flags_set())
8964 elfcpp::Elf_Word out_flags = this->processor_specific_flags();
8966 // Nothing to merge if flags equal to those in output.
8967 if (flags == out_flags)
8968 return;
8970 // Complain about various flag mismatches.
8971 elfcpp::Elf_Word version1 = elfcpp::arm_eabi_version(flags);
8972 elfcpp::Elf_Word version2 = elfcpp::arm_eabi_version(out_flags);
8973 if (!this->are_eabi_versions_compatible(version1, version2))
8974 gold_error(_("Source object %s has EABI version %d but output has "
8975 "EABI version %d."),
8976 name.c_str(),
8977 (flags & elfcpp::EF_ARM_EABIMASK) >> 24,
8978 (out_flags & elfcpp::EF_ARM_EABIMASK) >> 24);
8980 else
8982 // If the input is the default architecture and had the default
8983 // flags then do not bother setting the flags for the output
8984 // architecture, instead allow future merges to do this. If no
8985 // future merges ever set these flags then they will retain their
8986 // uninitialised values, which surprise surprise, correspond
8987 // to the default values.
8988 if (flags == 0)
8989 return;
8991 // This is the first time, just copy the flags.
8992 // We only copy the EABI version for now.
8993 this->set_processor_specific_flags(flags & elfcpp::EF_ARM_EABIMASK);
8997 // Adjust ELF file header.
8998 template<bool big_endian>
8999 void
9000 Target_arm<big_endian>::do_adjust_elf_header(
9001 unsigned char* view,
9002 int len) const
9004 gold_assert(len == elfcpp::Elf_sizes<32>::ehdr_size);
9006 elfcpp::Ehdr<32, big_endian> ehdr(view);
9007 unsigned char e_ident[elfcpp::EI_NIDENT];
9008 memcpy(e_ident, ehdr.get_e_ident(), elfcpp::EI_NIDENT);
9010 if (elfcpp::arm_eabi_version(this->processor_specific_flags())
9011 == elfcpp::EF_ARM_EABI_UNKNOWN)
9012 e_ident[elfcpp::EI_OSABI] = elfcpp::ELFOSABI_ARM;
9013 else
9014 e_ident[elfcpp::EI_OSABI] = 0;
9015 e_ident[elfcpp::EI_ABIVERSION] = 0;
9017 // FIXME: Do EF_ARM_BE8 adjustment.
9019 elfcpp::Ehdr_write<32, big_endian> oehdr(view);
9020 oehdr.put_e_ident(e_ident);
9023 // do_make_elf_object to override the same function in the base class.
9024 // We need to use a target-specific sub-class of Sized_relobj<32, big_endian>
9025 // to store ARM specific information. Hence we need to have our own
9026 // ELF object creation.
9028 template<bool big_endian>
9029 Object*
9030 Target_arm<big_endian>::do_make_elf_object(
9031 const std::string& name,
9032 Input_file* input_file,
9033 off_t offset, const elfcpp::Ehdr<32, big_endian>& ehdr)
9035 int et = ehdr.get_e_type();
9036 if (et == elfcpp::ET_REL)
9038 Arm_relobj<big_endian>* obj =
9039 new Arm_relobj<big_endian>(name, input_file, offset, ehdr);
9040 obj->setup();
9041 return obj;
9043 else if (et == elfcpp::ET_DYN)
9045 Sized_dynobj<32, big_endian>* obj =
9046 new Arm_dynobj<big_endian>(name, input_file, offset, ehdr);
9047 obj->setup();
9048 return obj;
9050 else
9052 gold_error(_("%s: unsupported ELF file type %d"),
9053 name.c_str(), et);
9054 return NULL;
9058 // Read the architecture from the Tag_also_compatible_with attribute, if any.
9059 // Returns -1 if no architecture could be read.
9060 // This is adapted from get_secondary_compatible_arch() in bfd/elf32-arm.c.
9062 template<bool big_endian>
9064 Target_arm<big_endian>::get_secondary_compatible_arch(
9065 const Attributes_section_data* pasd)
9067 const Object_attribute *known_attributes =
9068 pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
9070 // Note: the tag and its argument below are uleb128 values, though
9071 // currently-defined values fit in one byte for each.
9072 const std::string& sv =
9073 known_attributes[elfcpp::Tag_also_compatible_with].string_value();
9074 if (sv.size() == 2
9075 && sv.data()[0] == elfcpp::Tag_CPU_arch
9076 && (sv.data()[1] & 128) != 128)
9077 return sv.data()[1];
9079 // This tag is "safely ignorable", so don't complain if it looks funny.
9080 return -1;
9083 // Set, or unset, the architecture of the Tag_also_compatible_with attribute.
9084 // The tag is removed if ARCH is -1.
9085 // This is adapted from set_secondary_compatible_arch() in bfd/elf32-arm.c.
9087 template<bool big_endian>
9088 void
9089 Target_arm<big_endian>::set_secondary_compatible_arch(
9090 Attributes_section_data* pasd,
9091 int arch)
9093 Object_attribute *known_attributes =
9094 pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
9096 if (arch == -1)
9098 known_attributes[elfcpp::Tag_also_compatible_with].set_string_value("");
9099 return;
9102 // Note: the tag and its argument below are uleb128 values, though
9103 // currently-defined values fit in one byte for each.
9104 char sv[3];
9105 sv[0] = elfcpp::Tag_CPU_arch;
9106 gold_assert(arch != 0);
9107 sv[1] = arch;
9108 sv[2] = '\0';
9110 known_attributes[elfcpp::Tag_also_compatible_with].set_string_value(sv);
9113 // Combine two values for Tag_CPU_arch, taking secondary compatibility tags
9114 // into account.
9115 // This is adapted from tag_cpu_arch_combine() in bfd/elf32-arm.c.
9117 template<bool big_endian>
9119 Target_arm<big_endian>::tag_cpu_arch_combine(
9120 const char* name,
9121 int oldtag,
9122 int* secondary_compat_out,
9123 int newtag,
9124 int secondary_compat)
9126 #define T(X) elfcpp::TAG_CPU_ARCH_##X
9127 static const int v6t2[] =
9129 T(V6T2), // PRE_V4.
9130 T(V6T2), // V4.
9131 T(V6T2), // V4T.
9132 T(V6T2), // V5T.
9133 T(V6T2), // V5TE.
9134 T(V6T2), // V5TEJ.
9135 T(V6T2), // V6.
9136 T(V7), // V6KZ.
9137 T(V6T2) // V6T2.
9139 static const int v6k[] =
9141 T(V6K), // PRE_V4.
9142 T(V6K), // V4.
9143 T(V6K), // V4T.
9144 T(V6K), // V5T.
9145 T(V6K), // V5TE.
9146 T(V6K), // V5TEJ.
9147 T(V6K), // V6.
9148 T(V6KZ), // V6KZ.
9149 T(V7), // V6T2.
9150 T(V6K) // V6K.
9152 static const int v7[] =
9154 T(V7), // PRE_V4.
9155 T(V7), // V4.
9156 T(V7), // V4T.
9157 T(V7), // V5T.
9158 T(V7), // V5TE.
9159 T(V7), // V5TEJ.
9160 T(V7), // V6.
9161 T(V7), // V6KZ.
9162 T(V7), // V6T2.
9163 T(V7), // V6K.
9164 T(V7) // V7.
9166 static const int v6_m[] =
9168 -1, // PRE_V4.
9169 -1, // V4.
9170 T(V6K), // V4T.
9171 T(V6K), // V5T.
9172 T(V6K), // V5TE.
9173 T(V6K), // V5TEJ.
9174 T(V6K), // V6.
9175 T(V6KZ), // V6KZ.
9176 T(V7), // V6T2.
9177 T(V6K), // V6K.
9178 T(V7), // V7.
9179 T(V6_M) // V6_M.
9181 static const int v6s_m[] =
9183 -1, // PRE_V4.
9184 -1, // V4.
9185 T(V6K), // V4T.
9186 T(V6K), // V5T.
9187 T(V6K), // V5TE.
9188 T(V6K), // V5TEJ.
9189 T(V6K), // V6.
9190 T(V6KZ), // V6KZ.
9191 T(V7), // V6T2.
9192 T(V6K), // V6K.
9193 T(V7), // V7.
9194 T(V6S_M), // V6_M.
9195 T(V6S_M) // V6S_M.
9197 static const int v7e_m[] =
9199 -1, // PRE_V4.
9200 -1, // V4.
9201 T(V7E_M), // V4T.
9202 T(V7E_M), // V5T.
9203 T(V7E_M), // V5TE.
9204 T(V7E_M), // V5TEJ.
9205 T(V7E_M), // V6.
9206 T(V7E_M), // V6KZ.
9207 T(V7E_M), // V6T2.
9208 T(V7E_M), // V6K.
9209 T(V7E_M), // V7.
9210 T(V7E_M), // V6_M.
9211 T(V7E_M), // V6S_M.
9212 T(V7E_M) // V7E_M.
9214 static const int v4t_plus_v6_m[] =
9216 -1, // PRE_V4.
9217 -1, // V4.
9218 T(V4T), // V4T.
9219 T(V5T), // V5T.
9220 T(V5TE), // V5TE.
9221 T(V5TEJ), // V5TEJ.
9222 T(V6), // V6.
9223 T(V6KZ), // V6KZ.
9224 T(V6T2), // V6T2.
9225 T(V6K), // V6K.
9226 T(V7), // V7.
9227 T(V6_M), // V6_M.
9228 T(V6S_M), // V6S_M.
9229 T(V7E_M), // V7E_M.
9230 T(V4T_PLUS_V6_M) // V4T plus V6_M.
9232 static const int *comb[] =
9234 v6t2,
9235 v6k,
9237 v6_m,
9238 v6s_m,
9239 v7e_m,
9240 // Pseudo-architecture.
9241 v4t_plus_v6_m
9244 // Check we've not got a higher architecture than we know about.
9246 if (oldtag >= elfcpp::MAX_TAG_CPU_ARCH || newtag >= elfcpp::MAX_TAG_CPU_ARCH)
9248 gold_error(_("%s: unknown CPU architecture"), name);
9249 return -1;
9252 // Override old tag if we have a Tag_also_compatible_with on the output.
9254 if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
9255 || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
9256 oldtag = T(V4T_PLUS_V6_M);
9258 // And override the new tag if we have a Tag_also_compatible_with on the
9259 // input.
9261 if ((newtag == T(V6_M) && secondary_compat == T(V4T))
9262 || (newtag == T(V4T) && secondary_compat == T(V6_M)))
9263 newtag = T(V4T_PLUS_V6_M);
9265 // Architectures before V6KZ add features monotonically.
9266 int tagh = std::max(oldtag, newtag);
9267 if (tagh <= elfcpp::TAG_CPU_ARCH_V6KZ)
9268 return tagh;
9270 int tagl = std::min(oldtag, newtag);
9271 int result = comb[tagh - T(V6T2)][tagl];
9273 // Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
9274 // as the canonical version.
9275 if (result == T(V4T_PLUS_V6_M))
9277 result = T(V4T);
9278 *secondary_compat_out = T(V6_M);
9280 else
9281 *secondary_compat_out = -1;
9283 if (result == -1)
9285 gold_error(_("%s: conflicting CPU architectures %d/%d"),
9286 name, oldtag, newtag);
9287 return -1;
9290 return result;
9291 #undef T
9294 // Helper to print AEABI enum tag value.
9296 template<bool big_endian>
9297 std::string
9298 Target_arm<big_endian>::aeabi_enum_name(unsigned int value)
9300 static const char *aeabi_enum_names[] =
9301 { "", "variable-size", "32-bit", "" };
9302 const size_t aeabi_enum_names_size =
9303 sizeof(aeabi_enum_names) / sizeof(aeabi_enum_names[0]);
9305 if (value < aeabi_enum_names_size)
9306 return std::string(aeabi_enum_names[value]);
9307 else
9309 char buffer[100];
9310 sprintf(buffer, "<unknown value %u>", value);
9311 return std::string(buffer);
9315 // Return the string value to store in TAG_CPU_name.
9317 template<bool big_endian>
9318 std::string
9319 Target_arm<big_endian>::tag_cpu_name_value(unsigned int value)
9321 static const char *name_table[] = {
9322 // These aren't real CPU names, but we can't guess
9323 // that from the architecture version alone.
9324 "Pre v4",
9325 "ARM v4",
9326 "ARM v4T",
9327 "ARM v5T",
9328 "ARM v5TE",
9329 "ARM v5TEJ",
9330 "ARM v6",
9331 "ARM v6KZ",
9332 "ARM v6T2",
9333 "ARM v6K",
9334 "ARM v7",
9335 "ARM v6-M",
9336 "ARM v6S-M",
9337 "ARM v7E-M"
9339 const size_t name_table_size = sizeof(name_table) / sizeof(name_table[0]);
9341 if (value < name_table_size)
9342 return std::string(name_table[value]);
9343 else
9345 char buffer[100];
9346 sprintf(buffer, "<unknown CPU value %u>", value);
9347 return std::string(buffer);
9351 // Merge object attributes from input file called NAME with those of the
9352 // output. The input object attributes are in the object pointed by PASD.
9354 template<bool big_endian>
9355 void
9356 Target_arm<big_endian>::merge_object_attributes(
9357 const char* name,
9358 const Attributes_section_data* pasd)
9360 // Return if there is no attributes section data.
9361 if (pasd == NULL)
9362 return;
9364 // If output has no object attributes, just copy.
9365 if (this->attributes_section_data_ == NULL)
9367 this->attributes_section_data_ = new Attributes_section_data(*pasd);
9368 return;
9371 const int vendor = Object_attribute::OBJ_ATTR_PROC;
9372 const Object_attribute* in_attr = pasd->known_attributes(vendor);
9373 Object_attribute* out_attr =
9374 this->attributes_section_data_->known_attributes(vendor);
9376 // This needs to happen before Tag_ABI_FP_number_model is merged. */
9377 if (in_attr[elfcpp::Tag_ABI_VFP_args].int_value()
9378 != out_attr[elfcpp::Tag_ABI_VFP_args].int_value())
9380 // Ignore mismatches if the object doesn't use floating point. */
9381 if (out_attr[elfcpp::Tag_ABI_FP_number_model].int_value() == 0)
9382 out_attr[elfcpp::Tag_ABI_VFP_args].set_int_value(
9383 in_attr[elfcpp::Tag_ABI_VFP_args].int_value());
9384 else if (in_attr[elfcpp::Tag_ABI_FP_number_model].int_value() != 0)
9385 gold_error(_("%s uses VFP register arguments, output does not"),
9386 name);
9389 for (int i = 4; i < Vendor_object_attributes::NUM_KNOWN_ATTRIBUTES; ++i)
9391 // Merge this attribute with existing attributes.
9392 switch (i)
9394 case elfcpp::Tag_CPU_raw_name:
9395 case elfcpp::Tag_CPU_name:
9396 // These are merged after Tag_CPU_arch.
9397 break;
9399 case elfcpp::Tag_ABI_optimization_goals:
9400 case elfcpp::Tag_ABI_FP_optimization_goals:
9401 // Use the first value seen.
9402 break;
9404 case elfcpp::Tag_CPU_arch:
9406 unsigned int saved_out_attr = out_attr->int_value();
9407 // Merge Tag_CPU_arch and Tag_also_compatible_with.
9408 int secondary_compat =
9409 this->get_secondary_compatible_arch(pasd);
9410 int secondary_compat_out =
9411 this->get_secondary_compatible_arch(
9412 this->attributes_section_data_);
9413 out_attr[i].set_int_value(
9414 tag_cpu_arch_combine(name, out_attr[i].int_value(),
9415 &secondary_compat_out,
9416 in_attr[i].int_value(),
9417 secondary_compat));
9418 this->set_secondary_compatible_arch(this->attributes_section_data_,
9419 secondary_compat_out);
9421 // Merge Tag_CPU_name and Tag_CPU_raw_name.
9422 if (out_attr[i].int_value() == saved_out_attr)
9423 ; // Leave the names alone.
9424 else if (out_attr[i].int_value() == in_attr[i].int_value())
9426 // The output architecture has been changed to match the
9427 // input architecture. Use the input names.
9428 out_attr[elfcpp::Tag_CPU_name].set_string_value(
9429 in_attr[elfcpp::Tag_CPU_name].string_value());
9430 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value(
9431 in_attr[elfcpp::Tag_CPU_raw_name].string_value());
9433 else
9435 out_attr[elfcpp::Tag_CPU_name].set_string_value("");
9436 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value("");
9439 // If we still don't have a value for Tag_CPU_name,
9440 // make one up now. Tag_CPU_raw_name remains blank.
9441 if (out_attr[elfcpp::Tag_CPU_name].string_value() == "")
9443 const std::string cpu_name =
9444 this->tag_cpu_name_value(out_attr[i].int_value());
9445 // FIXME: If we see an unknown CPU, this will be set
9446 // to "<unknown CPU n>", where n is the attribute value.
9447 // This is different from BFD, which leaves the name alone.
9448 out_attr[elfcpp::Tag_CPU_name].set_string_value(cpu_name);
9451 break;
9453 case elfcpp::Tag_ARM_ISA_use:
9454 case elfcpp::Tag_THUMB_ISA_use:
9455 case elfcpp::Tag_WMMX_arch:
9456 case elfcpp::Tag_Advanced_SIMD_arch:
9457 // ??? Do Advanced_SIMD (NEON) and WMMX conflict?
9458 case elfcpp::Tag_ABI_FP_rounding:
9459 case elfcpp::Tag_ABI_FP_exceptions:
9460 case elfcpp::Tag_ABI_FP_user_exceptions:
9461 case elfcpp::Tag_ABI_FP_number_model:
9462 case elfcpp::Tag_VFP_HP_extension:
9463 case elfcpp::Tag_CPU_unaligned_access:
9464 case elfcpp::Tag_T2EE_use:
9465 case elfcpp::Tag_Virtualization_use:
9466 case elfcpp::Tag_MPextension_use:
9467 // Use the largest value specified.
9468 if (in_attr[i].int_value() > out_attr[i].int_value())
9469 out_attr[i].set_int_value(in_attr[i].int_value());
9470 break;
9472 case elfcpp::Tag_ABI_align8_preserved:
9473 case elfcpp::Tag_ABI_PCS_RO_data:
9474 // Use the smallest value specified.
9475 if (in_attr[i].int_value() < out_attr[i].int_value())
9476 out_attr[i].set_int_value(in_attr[i].int_value());
9477 break;
9479 case elfcpp::Tag_ABI_align8_needed:
9480 if ((in_attr[i].int_value() > 0 || out_attr[i].int_value() > 0)
9481 && (in_attr[elfcpp::Tag_ABI_align8_preserved].int_value() == 0
9482 || (out_attr[elfcpp::Tag_ABI_align8_preserved].int_value()
9483 == 0)))
9485 // This error message should be enabled once all non-conformant
9486 // binaries in the toolchain have had the attributes set
9487 // properly.
9488 // gold_error(_("output 8-byte data alignment conflicts with %s"),
9489 // name);
9491 // Fall through.
9492 case elfcpp::Tag_ABI_FP_denormal:
9493 case elfcpp::Tag_ABI_PCS_GOT_use:
9495 // These tags have 0 = don't care, 1 = strong requirement,
9496 // 2 = weak requirement.
9497 static const int order_021[3] = {0, 2, 1};
9499 // Use the "greatest" from the sequence 0, 2, 1, or the largest
9500 // value if greater than 2 (for future-proofing).
9501 if ((in_attr[i].int_value() > 2
9502 && in_attr[i].int_value() > out_attr[i].int_value())
9503 || (in_attr[i].int_value() <= 2
9504 && out_attr[i].int_value() <= 2
9505 && (order_021[in_attr[i].int_value()]
9506 > order_021[out_attr[i].int_value()])))
9507 out_attr[i].set_int_value(in_attr[i].int_value());
9509 break;
9511 case elfcpp::Tag_CPU_arch_profile:
9512 if (out_attr[i].int_value() != in_attr[i].int_value())
9514 // 0 will merge with anything.
9515 // 'A' and 'S' merge to 'A'.
9516 // 'R' and 'S' merge to 'R'.
9517 // 'M' and 'A|R|S' is an error.
9518 if (out_attr[i].int_value() == 0
9519 || (out_attr[i].int_value() == 'S'
9520 && (in_attr[i].int_value() == 'A'
9521 || in_attr[i].int_value() == 'R')))
9522 out_attr[i].set_int_value(in_attr[i].int_value());
9523 else if (in_attr[i].int_value() == 0
9524 || (in_attr[i].int_value() == 'S'
9525 && (out_attr[i].int_value() == 'A'
9526 || out_attr[i].int_value() == 'R')))
9527 ; // Do nothing.
9528 else
9530 gold_error
9531 (_("conflicting architecture profiles %c/%c"),
9532 in_attr[i].int_value() ? in_attr[i].int_value() : '0',
9533 out_attr[i].int_value() ? out_attr[i].int_value() : '0');
9536 break;
9537 case elfcpp::Tag_VFP_arch:
9539 static const struct
9541 int ver;
9542 int regs;
9543 } vfp_versions[7] =
9545 {0, 0},
9546 {1, 16},
9547 {2, 16},
9548 {3, 32},
9549 {3, 16},
9550 {4, 32},
9551 {4, 16}
9554 // Values greater than 6 aren't defined, so just pick the
9555 // biggest.
9556 if (in_attr[i].int_value() > 6
9557 && in_attr[i].int_value() > out_attr[i].int_value())
9559 *out_attr = *in_attr;
9560 break;
9562 // The output uses the superset of input features
9563 // (ISA version) and registers.
9564 int ver = std::max(vfp_versions[in_attr[i].int_value()].ver,
9565 vfp_versions[out_attr[i].int_value()].ver);
9566 int regs = std::max(vfp_versions[in_attr[i].int_value()].regs,
9567 vfp_versions[out_attr[i].int_value()].regs);
9568 // This assumes all possible supersets are also a valid
9569 // options.
9570 int newval;
9571 for (newval = 6; newval > 0; newval--)
9573 if (regs == vfp_versions[newval].regs
9574 && ver == vfp_versions[newval].ver)
9575 break;
9577 out_attr[i].set_int_value(newval);
9579 break;
9580 case elfcpp::Tag_PCS_config:
9581 if (out_attr[i].int_value() == 0)
9582 out_attr[i].set_int_value(in_attr[i].int_value());
9583 else if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
9585 // It's sometimes ok to mix different configs, so this is only
9586 // a warning.
9587 gold_warning(_("%s: conflicting platform configuration"), name);
9589 break;
9590 case elfcpp::Tag_ABI_PCS_R9_use:
9591 if (in_attr[i].int_value() != out_attr[i].int_value()
9592 && out_attr[i].int_value() != elfcpp::AEABI_R9_unused
9593 && in_attr[i].int_value() != elfcpp::AEABI_R9_unused)
9595 gold_error(_("%s: conflicting use of R9"), name);
9597 if (out_attr[i].int_value() == elfcpp::AEABI_R9_unused)
9598 out_attr[i].set_int_value(in_attr[i].int_value());
9599 break;
9600 case elfcpp::Tag_ABI_PCS_RW_data:
9601 if (in_attr[i].int_value() == elfcpp::AEABI_PCS_RW_data_SBrel
9602 && (in_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
9603 != elfcpp::AEABI_R9_SB)
9604 && (out_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
9605 != elfcpp::AEABI_R9_unused))
9607 gold_error(_("%s: SB relative addressing conflicts with use "
9608 "of R9"),
9609 name);
9611 // Use the smallest value specified.
9612 if (in_attr[i].int_value() < out_attr[i].int_value())
9613 out_attr[i].set_int_value(in_attr[i].int_value());
9614 break;
9615 case elfcpp::Tag_ABI_PCS_wchar_t:
9616 // FIXME: Make it possible to turn off this warning.
9617 if (out_attr[i].int_value()
9618 && in_attr[i].int_value()
9619 && out_attr[i].int_value() != in_attr[i].int_value())
9621 gold_warning(_("%s uses %u-byte wchar_t yet the output is to "
9622 "use %u-byte wchar_t; use of wchar_t values "
9623 "across objects may fail"),
9624 name, in_attr[i].int_value(),
9625 out_attr[i].int_value());
9627 else if (in_attr[i].int_value() && !out_attr[i].int_value())
9628 out_attr[i].set_int_value(in_attr[i].int_value());
9629 break;
9630 case elfcpp::Tag_ABI_enum_size:
9631 if (in_attr[i].int_value() != elfcpp::AEABI_enum_unused)
9633 if (out_attr[i].int_value() == elfcpp::AEABI_enum_unused
9634 || out_attr[i].int_value() == elfcpp::AEABI_enum_forced_wide)
9636 // The existing object is compatible with anything.
9637 // Use whatever requirements the new object has.
9638 out_attr[i].set_int_value(in_attr[i].int_value());
9640 // FIXME: Make it possible to turn off this warning.
9641 else if (in_attr[i].int_value() != elfcpp::AEABI_enum_forced_wide
9642 && out_attr[i].int_value() != in_attr[i].int_value())
9644 unsigned int in_value = in_attr[i].int_value();
9645 unsigned int out_value = out_attr[i].int_value();
9646 gold_warning(_("%s uses %s enums yet the output is to use "
9647 "%s enums; use of enum values across objects "
9648 "may fail"),
9649 name,
9650 this->aeabi_enum_name(in_value).c_str(),
9651 this->aeabi_enum_name(out_value).c_str());
9654 break;
9655 case elfcpp::Tag_ABI_VFP_args:
9656 // Aready done.
9657 break;
9658 case elfcpp::Tag_ABI_WMMX_args:
9659 if (in_attr[i].int_value() != out_attr[i].int_value())
9661 gold_error(_("%s uses iWMMXt register arguments, output does "
9662 "not"),
9663 name);
9665 break;
9666 case Object_attribute::Tag_compatibility:
9667 // Merged in target-independent code.
9668 break;
9669 case elfcpp::Tag_ABI_HardFP_use:
9670 // 1 (SP) and 2 (DP) conflict, so combine to 3 (SP & DP).
9671 if ((in_attr[i].int_value() == 1 && out_attr[i].int_value() == 2)
9672 || (in_attr[i].int_value() == 2 && out_attr[i].int_value() == 1))
9673 out_attr[i].set_int_value(3);
9674 else if (in_attr[i].int_value() > out_attr[i].int_value())
9675 out_attr[i].set_int_value(in_attr[i].int_value());
9676 break;
9677 case elfcpp::Tag_ABI_FP_16bit_format:
9678 if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
9680 if (in_attr[i].int_value() != out_attr[i].int_value())
9681 gold_error(_("fp16 format mismatch between %s and output"),
9682 name);
9684 if (in_attr[i].int_value() != 0)
9685 out_attr[i].set_int_value(in_attr[i].int_value());
9686 break;
9688 case elfcpp::Tag_nodefaults:
9689 // This tag is set if it exists, but the value is unused (and is
9690 // typically zero). We don't actually need to do anything here -
9691 // the merge happens automatically when the type flags are merged
9692 // below.
9693 break;
9694 case elfcpp::Tag_also_compatible_with:
9695 // Already done in Tag_CPU_arch.
9696 break;
9697 case elfcpp::Tag_conformance:
9698 // Keep the attribute if it matches. Throw it away otherwise.
9699 // No attribute means no claim to conform.
9700 if (in_attr[i].string_value() != out_attr[i].string_value())
9701 out_attr[i].set_string_value("");
9702 break;
9704 default:
9706 const char* err_object = NULL;
9708 // The "known_obj_attributes" table does contain some undefined
9709 // attributes. Ensure that there are unused.
9710 if (out_attr[i].int_value() != 0
9711 || out_attr[i].string_value() != "")
9712 err_object = "output";
9713 else if (in_attr[i].int_value() != 0
9714 || in_attr[i].string_value() != "")
9715 err_object = name;
9717 if (err_object != NULL)
9719 // Attribute numbers >=64 (mod 128) can be safely ignored.
9720 if ((i & 127) < 64)
9721 gold_error(_("%s: unknown mandatory EABI object attribute "
9722 "%d"),
9723 err_object, i);
9724 else
9725 gold_warning(_("%s: unknown EABI object attribute %d"),
9726 err_object, i);
9729 // Only pass on attributes that match in both inputs.
9730 if (!in_attr[i].matches(out_attr[i]))
9732 out_attr[i].set_int_value(0);
9733 out_attr[i].set_string_value("");
9738 // If out_attr was copied from in_attr then it won't have a type yet.
9739 if (in_attr[i].type() && !out_attr[i].type())
9740 out_attr[i].set_type(in_attr[i].type());
9743 // Merge Tag_compatibility attributes and any common GNU ones.
9744 this->attributes_section_data_->merge(name, pasd);
9746 // Check for any attributes not known on ARM.
9747 typedef Vendor_object_attributes::Other_attributes Other_attributes;
9748 const Other_attributes* in_other_attributes = pasd->other_attributes(vendor);
9749 Other_attributes::const_iterator in_iter = in_other_attributes->begin();
9750 Other_attributes* out_other_attributes =
9751 this->attributes_section_data_->other_attributes(vendor);
9752 Other_attributes::iterator out_iter = out_other_attributes->begin();
9754 while (in_iter != in_other_attributes->end()
9755 || out_iter != out_other_attributes->end())
9757 const char* err_object = NULL;
9758 int err_tag = 0;
9760 // The tags for each list are in numerical order.
9761 // If the tags are equal, then merge.
9762 if (out_iter != out_other_attributes->end()
9763 && (in_iter == in_other_attributes->end()
9764 || in_iter->first > out_iter->first))
9766 // This attribute only exists in output. We can't merge, and we
9767 // don't know what the tag means, so delete it.
9768 err_object = "output";
9769 err_tag = out_iter->first;
9770 int saved_tag = out_iter->first;
9771 delete out_iter->second;
9772 out_other_attributes->erase(out_iter);
9773 out_iter = out_other_attributes->upper_bound(saved_tag);
9775 else if (in_iter != in_other_attributes->end()
9776 && (out_iter != out_other_attributes->end()
9777 || in_iter->first < out_iter->first))
9779 // This attribute only exists in input. We can't merge, and we
9780 // don't know what the tag means, so ignore it.
9781 err_object = name;
9782 err_tag = in_iter->first;
9783 ++in_iter;
9785 else // The tags are equal.
9787 // As present, all attributes in the list are unknown, and
9788 // therefore can't be merged meaningfully.
9789 err_object = "output";
9790 err_tag = out_iter->first;
9792 // Only pass on attributes that match in both inputs.
9793 if (!in_iter->second->matches(*(out_iter->second)))
9795 // No match. Delete the attribute.
9796 int saved_tag = out_iter->first;
9797 delete out_iter->second;
9798 out_other_attributes->erase(out_iter);
9799 out_iter = out_other_attributes->upper_bound(saved_tag);
9801 else
9803 // Matched. Keep the attribute and move to the next.
9804 ++out_iter;
9805 ++in_iter;
9809 if (err_object)
9811 // Attribute numbers >=64 (mod 128) can be safely ignored. */
9812 if ((err_tag & 127) < 64)
9814 gold_error(_("%s: unknown mandatory EABI object attribute %d"),
9815 err_object, err_tag);
9817 else
9819 gold_warning(_("%s: unknown EABI object attribute %d"),
9820 err_object, err_tag);
9826 // Stub-generation methods for Target_arm.
9828 // Make a new Arm_input_section object.
9830 template<bool big_endian>
9831 Arm_input_section<big_endian>*
9832 Target_arm<big_endian>::new_arm_input_section(
9833 Relobj* relobj,
9834 unsigned int shndx)
9836 Section_id sid(relobj, shndx);
9838 Arm_input_section<big_endian>* arm_input_section =
9839 new Arm_input_section<big_endian>(relobj, shndx);
9840 arm_input_section->init();
9842 // Register new Arm_input_section in map for look-up.
9843 std::pair<typename Arm_input_section_map::iterator, bool> ins =
9844 this->arm_input_section_map_.insert(std::make_pair(sid, arm_input_section));
9846 // Make sure that it we have not created another Arm_input_section
9847 // for this input section already.
9848 gold_assert(ins.second);
9850 return arm_input_section;
9853 // Find the Arm_input_section object corresponding to the SHNDX-th input
9854 // section of RELOBJ.
9856 template<bool big_endian>
9857 Arm_input_section<big_endian>*
9858 Target_arm<big_endian>::find_arm_input_section(
9859 Relobj* relobj,
9860 unsigned int shndx) const
9862 Section_id sid(relobj, shndx);
9863 typename Arm_input_section_map::const_iterator p =
9864 this->arm_input_section_map_.find(sid);
9865 return (p != this->arm_input_section_map_.end()) ? p->second : NULL;
9868 // Make a new stub table.
9870 template<bool big_endian>
9871 Stub_table<big_endian>*
9872 Target_arm<big_endian>::new_stub_table(Arm_input_section<big_endian>* owner)
9874 Stub_table<big_endian>* stub_table =
9875 new Stub_table<big_endian>(owner);
9876 this->stub_tables_.push_back(stub_table);
9878 stub_table->set_address(owner->address() + owner->data_size());
9879 stub_table->set_file_offset(owner->offset() + owner->data_size());
9880 stub_table->finalize_data_size();
9882 return stub_table;
9885 // Scan a relocation for stub generation.
9887 template<bool big_endian>
9888 void
9889 Target_arm<big_endian>::scan_reloc_for_stub(
9890 const Relocate_info<32, big_endian>* relinfo,
9891 unsigned int r_type,
9892 const Sized_symbol<32>* gsym,
9893 unsigned int r_sym,
9894 const Symbol_value<32>* psymval,
9895 elfcpp::Elf_types<32>::Elf_Swxword addend,
9896 Arm_address address)
9898 typedef typename Target_arm<big_endian>::Relocate Relocate;
9900 const Arm_relobj<big_endian>* arm_relobj =
9901 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
9903 bool target_is_thumb;
9904 Symbol_value<32> symval;
9905 if (gsym != NULL)
9907 // This is a global symbol. Determine if we use PLT and if the
9908 // final target is THUMB.
9909 if (gsym->use_plt_offset(Relocate::reloc_is_non_pic(r_type)))
9911 // This uses a PLT, change the symbol value.
9912 symval.set_output_value(this->plt_section()->address()
9913 + gsym->plt_offset());
9914 psymval = &symval;
9915 target_is_thumb = false;
9917 else if (gsym->is_undefined())
9918 // There is no need to generate a stub symbol is undefined.
9919 return;
9920 else
9922 target_is_thumb =
9923 ((gsym->type() == elfcpp::STT_ARM_TFUNC)
9924 || (gsym->type() == elfcpp::STT_FUNC
9925 && !gsym->is_undefined()
9926 && ((psymval->value(arm_relobj, 0) & 1) != 0)));
9929 else
9931 // This is a local symbol. Determine if the final target is THUMB.
9932 target_is_thumb = arm_relobj->local_symbol_is_thumb_function(r_sym);
9935 // Strip LSB if this points to a THUMB target.
9936 const Arm_reloc_property* reloc_property =
9937 arm_reloc_property_table->get_implemented_static_reloc_property(r_type);
9938 gold_assert(reloc_property != NULL);
9939 if (target_is_thumb
9940 && reloc_property->uses_thumb_bit()
9941 && ((psymval->value(arm_relobj, 0) & 1) != 0))
9943 Arm_address stripped_value =
9944 psymval->value(arm_relobj, 0) & ~static_cast<Arm_address>(1);
9945 symval.set_output_value(stripped_value);
9946 psymval = &symval;
9949 // Get the symbol value.
9950 Symbol_value<32>::Value value = psymval->value(arm_relobj, 0);
9952 // Owing to pipelining, the PC relative branches below actually skip
9953 // two instructions when the branch offset is 0.
9954 Arm_address destination;
9955 switch (r_type)
9957 case elfcpp::R_ARM_CALL:
9958 case elfcpp::R_ARM_JUMP24:
9959 case elfcpp::R_ARM_PLT32:
9960 // ARM branches.
9961 destination = value + addend + 8;
9962 break;
9963 case elfcpp::R_ARM_THM_CALL:
9964 case elfcpp::R_ARM_THM_XPC22:
9965 case elfcpp::R_ARM_THM_JUMP24:
9966 case elfcpp::R_ARM_THM_JUMP19:
9967 // THUMB branches.
9968 destination = value + addend + 4;
9969 break;
9970 default:
9971 gold_unreachable();
9974 Reloc_stub* stub = NULL;
9975 Stub_type stub_type =
9976 Reloc_stub::stub_type_for_reloc(r_type, address, destination,
9977 target_is_thumb);
9978 if (stub_type != arm_stub_none)
9980 // Try looking up an existing stub from a stub table.
9981 Stub_table<big_endian>* stub_table =
9982 arm_relobj->stub_table(relinfo->data_shndx);
9983 gold_assert(stub_table != NULL);
9985 // Locate stub by destination.
9986 Reloc_stub::Key stub_key(stub_type, gsym, arm_relobj, r_sym, addend);
9988 // Create a stub if there is not one already
9989 stub = stub_table->find_reloc_stub(stub_key);
9990 if (stub == NULL)
9992 // create a new stub and add it to stub table.
9993 stub = this->stub_factory().make_reloc_stub(stub_type);
9994 stub_table->add_reloc_stub(stub, stub_key);
9997 // Record the destination address.
9998 stub->set_destination_address(destination
9999 | (target_is_thumb ? 1 : 0));
10002 // For Cortex-A8, we need to record a relocation at 4K page boundary.
10003 if (this->fix_cortex_a8_
10004 && (r_type == elfcpp::R_ARM_THM_JUMP24
10005 || r_type == elfcpp::R_ARM_THM_JUMP19
10006 || r_type == elfcpp::R_ARM_THM_CALL
10007 || r_type == elfcpp::R_ARM_THM_XPC22)
10008 && (address & 0xfffU) == 0xffeU)
10010 // Found a candidate. Note we haven't checked the destination is
10011 // within 4K here: if we do so (and don't create a record) we can't
10012 // tell that a branch should have been relocated when scanning later.
10013 this->cortex_a8_relocs_info_[address] =
10014 new Cortex_a8_reloc(stub, r_type,
10015 destination | (target_is_thumb ? 1 : 0));
10019 // This function scans a relocation sections for stub generation.
10020 // The template parameter Relocate must be a class type which provides
10021 // a single function, relocate(), which implements the machine
10022 // specific part of a relocation.
10024 // BIG_ENDIAN is the endianness of the data. SH_TYPE is the section type:
10025 // SHT_REL or SHT_RELA.
10027 // PRELOCS points to the relocation data. RELOC_COUNT is the number
10028 // of relocs. OUTPUT_SECTION is the output section.
10029 // NEEDS_SPECIAL_OFFSET_HANDLING is true if input offsets need to be
10030 // mapped to output offsets.
10032 // VIEW is the section data, VIEW_ADDRESS is its memory address, and
10033 // VIEW_SIZE is the size. These refer to the input section, unless
10034 // NEEDS_SPECIAL_OFFSET_HANDLING is true, in which case they refer to
10035 // the output section.
10037 template<bool big_endian>
10038 template<int sh_type>
10039 void inline
10040 Target_arm<big_endian>::scan_reloc_section_for_stubs(
10041 const Relocate_info<32, big_endian>* relinfo,
10042 const unsigned char* prelocs,
10043 size_t reloc_count,
10044 Output_section* output_section,
10045 bool needs_special_offset_handling,
10046 const unsigned char* view,
10047 elfcpp::Elf_types<32>::Elf_Addr view_address,
10048 section_size_type)
10050 typedef typename Reloc_types<sh_type, 32, big_endian>::Reloc Reltype;
10051 const int reloc_size =
10052 Reloc_types<sh_type, 32, big_endian>::reloc_size;
10054 Arm_relobj<big_endian>* arm_object =
10055 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
10056 unsigned int local_count = arm_object->local_symbol_count();
10058 Comdat_behavior comdat_behavior = CB_UNDETERMINED;
10060 for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
10062 Reltype reloc(prelocs);
10064 typename elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
10065 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
10066 unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
10068 r_type = this->get_real_reloc_type(r_type);
10070 // Only a few relocation types need stubs.
10071 if ((r_type != elfcpp::R_ARM_CALL)
10072 && (r_type != elfcpp::R_ARM_JUMP24)
10073 && (r_type != elfcpp::R_ARM_PLT32)
10074 && (r_type != elfcpp::R_ARM_THM_CALL)
10075 && (r_type != elfcpp::R_ARM_THM_XPC22)
10076 && (r_type != elfcpp::R_ARM_THM_JUMP24)
10077 && (r_type != elfcpp::R_ARM_THM_JUMP19)
10078 && (r_type != elfcpp::R_ARM_V4BX))
10079 continue;
10081 section_offset_type offset =
10082 convert_to_section_size_type(reloc.get_r_offset());
10084 if (needs_special_offset_handling)
10086 offset = output_section->output_offset(relinfo->object,
10087 relinfo->data_shndx,
10088 offset);
10089 if (offset == -1)
10090 continue;
10093 // Create a v4bx stub if --fix-v4bx-interworking is used.
10094 if (r_type == elfcpp::R_ARM_V4BX)
10096 if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING)
10098 // Get the BX instruction.
10099 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
10100 const Valtype* wv =
10101 reinterpret_cast<const Valtype*>(view + offset);
10102 elfcpp::Elf_types<32>::Elf_Swxword insn =
10103 elfcpp::Swap<32, big_endian>::readval(wv);
10104 const uint32_t reg = (insn & 0xf);
10106 if (reg < 0xf)
10108 // Try looking up an existing stub from a stub table.
10109 Stub_table<big_endian>* stub_table =
10110 arm_object->stub_table(relinfo->data_shndx);
10111 gold_assert(stub_table != NULL);
10113 if (stub_table->find_arm_v4bx_stub(reg) == NULL)
10115 // create a new stub and add it to stub table.
10116 Arm_v4bx_stub* stub =
10117 this->stub_factory().make_arm_v4bx_stub(reg);
10118 gold_assert(stub != NULL);
10119 stub_table->add_arm_v4bx_stub(stub);
10123 continue;
10126 // Get the addend.
10127 Stub_addend_reader<sh_type, big_endian> stub_addend_reader;
10128 elfcpp::Elf_types<32>::Elf_Swxword addend =
10129 stub_addend_reader(r_type, view + offset, reloc);
10131 const Sized_symbol<32>* sym;
10133 Symbol_value<32> symval;
10134 const Symbol_value<32> *psymval;
10135 if (r_sym < local_count)
10137 sym = NULL;
10138 psymval = arm_object->local_symbol(r_sym);
10140 // If the local symbol belongs to a section we are discarding,
10141 // and that section is a debug section, try to find the
10142 // corresponding kept section and map this symbol to its
10143 // counterpart in the kept section. The symbol must not
10144 // correspond to a section we are folding.
10145 bool is_ordinary;
10146 unsigned int shndx = psymval->input_shndx(&is_ordinary);
10147 if (is_ordinary
10148 && shndx != elfcpp::SHN_UNDEF
10149 && !arm_object->is_section_included(shndx)
10150 && !(relinfo->symtab->is_section_folded(arm_object, shndx)))
10152 if (comdat_behavior == CB_UNDETERMINED)
10154 std::string name =
10155 arm_object->section_name(relinfo->data_shndx);
10156 comdat_behavior = get_comdat_behavior(name.c_str());
10158 if (comdat_behavior == CB_PRETEND)
10160 bool found;
10161 typename elfcpp::Elf_types<32>::Elf_Addr value =
10162 arm_object->map_to_kept_section(shndx, &found);
10163 if (found)
10164 symval.set_output_value(value + psymval->input_value());
10165 else
10166 symval.set_output_value(0);
10168 else
10170 symval.set_output_value(0);
10172 symval.set_no_output_symtab_entry();
10173 psymval = &symval;
10176 else
10178 const Symbol* gsym = arm_object->global_symbol(r_sym);
10179 gold_assert(gsym != NULL);
10180 if (gsym->is_forwarder())
10181 gsym = relinfo->symtab->resolve_forwards(gsym);
10183 sym = static_cast<const Sized_symbol<32>*>(gsym);
10184 if (sym->has_symtab_index())
10185 symval.set_output_symtab_index(sym->symtab_index());
10186 else
10187 symval.set_no_output_symtab_entry();
10189 // We need to compute the would-be final value of this global
10190 // symbol.
10191 const Symbol_table* symtab = relinfo->symtab;
10192 const Sized_symbol<32>* sized_symbol =
10193 symtab->get_sized_symbol<32>(gsym);
10194 Symbol_table::Compute_final_value_status status;
10195 Arm_address value =
10196 symtab->compute_final_value<32>(sized_symbol, &status);
10198 // Skip this if the symbol has not output section.
10199 if (status == Symbol_table::CFVS_NO_OUTPUT_SECTION)
10200 continue;
10202 symval.set_output_value(value);
10203 psymval = &symval;
10206 // If symbol is a section symbol, we don't know the actual type of
10207 // destination. Give up.
10208 if (psymval->is_section_symbol())
10209 continue;
10211 this->scan_reloc_for_stub(relinfo, r_type, sym, r_sym, psymval,
10212 addend, view_address + offset);
10216 // Scan an input section for stub generation.
10218 template<bool big_endian>
10219 void
10220 Target_arm<big_endian>::scan_section_for_stubs(
10221 const Relocate_info<32, big_endian>* relinfo,
10222 unsigned int sh_type,
10223 const unsigned char* prelocs,
10224 size_t reloc_count,
10225 Output_section* output_section,
10226 bool needs_special_offset_handling,
10227 const unsigned char* view,
10228 Arm_address view_address,
10229 section_size_type view_size)
10231 if (sh_type == elfcpp::SHT_REL)
10232 this->scan_reloc_section_for_stubs<elfcpp::SHT_REL>(
10233 relinfo,
10234 prelocs,
10235 reloc_count,
10236 output_section,
10237 needs_special_offset_handling,
10238 view,
10239 view_address,
10240 view_size);
10241 else if (sh_type == elfcpp::SHT_RELA)
10242 // We do not support RELA type relocations yet. This is provided for
10243 // completeness.
10244 this->scan_reloc_section_for_stubs<elfcpp::SHT_RELA>(
10245 relinfo,
10246 prelocs,
10247 reloc_count,
10248 output_section,
10249 needs_special_offset_handling,
10250 view,
10251 view_address,
10252 view_size);
10253 else
10254 gold_unreachable();
10257 // Group input sections for stub generation.
10259 // We goup input sections in an output sections so that the total size,
10260 // including any padding space due to alignment is smaller than GROUP_SIZE
10261 // unless the only input section in group is bigger than GROUP_SIZE already.
10262 // Then an ARM stub table is created to follow the last input section
10263 // in group. For each group an ARM stub table is created an is placed
10264 // after the last group. If STUB_ALWATS_AFTER_BRANCH is false, we further
10265 // extend the group after the stub table.
10267 template<bool big_endian>
10268 void
10269 Target_arm<big_endian>::group_sections(
10270 Layout* layout,
10271 section_size_type group_size,
10272 bool stubs_always_after_branch)
10274 // Group input sections and insert stub table
10275 Layout::Section_list section_list;
10276 layout->get_allocated_sections(&section_list);
10277 for (Layout::Section_list::const_iterator p = section_list.begin();
10278 p != section_list.end();
10279 ++p)
10281 Arm_output_section<big_endian>* output_section =
10282 Arm_output_section<big_endian>::as_arm_output_section(*p);
10283 output_section->group_sections(group_size, stubs_always_after_branch,
10284 this);
10288 // Relaxation hook. This is where we do stub generation.
10290 template<bool big_endian>
10291 bool
10292 Target_arm<big_endian>::do_relax(
10293 int pass,
10294 const Input_objects* input_objects,
10295 Symbol_table* symtab,
10296 Layout* layout)
10298 // No need to generate stubs if this is a relocatable link.
10299 gold_assert(!parameters->options().relocatable());
10301 // If this is the first pass, we need to group input sections into
10302 // stub groups.
10303 bool done_exidx_fixup = false;
10304 if (pass == 1)
10306 // Determine the stub group size. The group size is the absolute
10307 // value of the parameter --stub-group-size. If --stub-group-size
10308 // is passed a negative value, we restict stubs to be always after
10309 // the stubbed branches.
10310 int32_t stub_group_size_param =
10311 parameters->options().stub_group_size();
10312 bool stubs_always_after_branch = stub_group_size_param < 0;
10313 section_size_type stub_group_size = abs(stub_group_size_param);
10315 // The Cortex-A8 erratum fix depends on stubs not being in the same 4K
10316 // page as the first half of a 32-bit branch straddling two 4K pages.
10317 // This is a crude way of enforcing that.
10318 if (this->fix_cortex_a8_)
10319 stubs_always_after_branch = true;
10321 if (stub_group_size == 1)
10323 // Default value.
10324 // Thumb branch range is +-4MB has to be used as the default
10325 // maximum size (a given section can contain both ARM and Thumb
10326 // code, so the worst case has to be taken into account). If we are
10327 // fixing cortex-a8 errata, the branch range has to be even smaller,
10328 // since wide conditional branch has a range of +-1MB only.
10330 // This value is 24K less than that, which allows for 2025
10331 // 12-byte stubs. If we exceed that, then we will fail to link.
10332 // The user will have to relink with an explicit group size
10333 // option.
10334 if (this->fix_cortex_a8_)
10335 stub_group_size = 1024276;
10336 else
10337 stub_group_size = 4170000;
10340 group_sections(layout, stub_group_size, stubs_always_after_branch);
10342 // Also fix .ARM.exidx section coverage.
10343 Output_section* os = layout->find_output_section(".ARM.exidx");
10344 if (os != NULL && os->type() == elfcpp::SHT_ARM_EXIDX)
10346 Arm_output_section<big_endian>* exidx_output_section =
10347 Arm_output_section<big_endian>::as_arm_output_section(os);
10348 this->fix_exidx_coverage(layout, exidx_output_section, symtab);
10349 done_exidx_fixup = true;
10353 // The Cortex-A8 stubs are sensitive to layout of code sections. At the
10354 // beginning of each relaxation pass, just blow away all the stubs.
10355 // Alternatively, we could selectively remove only the stubs and reloc
10356 // information for code sections that have moved since the last pass.
10357 // That would require more book-keeping.
10358 typedef typename Stub_table_list::iterator Stub_table_iterator;
10359 if (this->fix_cortex_a8_)
10361 // Clear all Cortex-A8 reloc information.
10362 for (typename Cortex_a8_relocs_info::const_iterator p =
10363 this->cortex_a8_relocs_info_.begin();
10364 p != this->cortex_a8_relocs_info_.end();
10365 ++p)
10366 delete p->second;
10367 this->cortex_a8_relocs_info_.clear();
10369 // Remove all Cortex-A8 stubs.
10370 for (Stub_table_iterator sp = this->stub_tables_.begin();
10371 sp != this->stub_tables_.end();
10372 ++sp)
10373 (*sp)->remove_all_cortex_a8_stubs();
10376 // Scan relocs for relocation stubs
10377 for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
10378 op != input_objects->relobj_end();
10379 ++op)
10381 Arm_relobj<big_endian>* arm_relobj =
10382 Arm_relobj<big_endian>::as_arm_relobj(*op);
10383 arm_relobj->scan_sections_for_stubs(this, symtab, layout);
10386 // Check all stub tables to see if any of them have their data sizes
10387 // or addresses alignments changed. These are the only things that
10388 // matter.
10389 bool any_stub_table_changed = false;
10390 Unordered_set<const Output_section*> sections_needing_adjustment;
10391 for (Stub_table_iterator sp = this->stub_tables_.begin();
10392 (sp != this->stub_tables_.end()) && !any_stub_table_changed;
10393 ++sp)
10395 if ((*sp)->update_data_size_and_addralign())
10397 // Update data size of stub table owner.
10398 Arm_input_section<big_endian>* owner = (*sp)->owner();
10399 uint64_t address = owner->address();
10400 off_t offset = owner->offset();
10401 owner->reset_address_and_file_offset();
10402 owner->set_address_and_file_offset(address, offset);
10404 sections_needing_adjustment.insert(owner->output_section());
10405 any_stub_table_changed = true;
10409 // Output_section_data::output_section() returns a const pointer but we
10410 // need to update output sections, so we record all output sections needing
10411 // update above and scan the sections here to find out what sections need
10412 // to be updated.
10413 for(Layout::Section_list::const_iterator p = layout->section_list().begin();
10414 p != layout->section_list().end();
10415 ++p)
10417 if (sections_needing_adjustment.find(*p)
10418 != sections_needing_adjustment.end())
10419 (*p)->set_section_offsets_need_adjustment();
10422 // Stop relaxation if no EXIDX fix-up and no stub table change.
10423 bool continue_relaxation = done_exidx_fixup || any_stub_table_changed;
10425 // Finalize the stubs in the last relaxation pass.
10426 if (!continue_relaxation)
10428 for (Stub_table_iterator sp = this->stub_tables_.begin();
10429 (sp != this->stub_tables_.end()) && !any_stub_table_changed;
10430 ++sp)
10431 (*sp)->finalize_stubs();
10433 // Update output local symbol counts of objects if necessary.
10434 for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
10435 op != input_objects->relobj_end();
10436 ++op)
10438 Arm_relobj<big_endian>* arm_relobj =
10439 Arm_relobj<big_endian>::as_arm_relobj(*op);
10441 // Update output local symbol counts. We need to discard local
10442 // symbols defined in parts of input sections that are discarded by
10443 // relaxation.
10444 if (arm_relobj->output_local_symbol_count_needs_update())
10445 arm_relobj->update_output_local_symbol_count();
10449 return continue_relaxation;
10452 // Relocate a stub.
10454 template<bool big_endian>
10455 void
10456 Target_arm<big_endian>::relocate_stub(
10457 Stub* stub,
10458 const Relocate_info<32, big_endian>* relinfo,
10459 Output_section* output_section,
10460 unsigned char* view,
10461 Arm_address address,
10462 section_size_type view_size)
10464 Relocate relocate;
10465 const Stub_template* stub_template = stub->stub_template();
10466 for (size_t i = 0; i < stub_template->reloc_count(); i++)
10468 size_t reloc_insn_index = stub_template->reloc_insn_index(i);
10469 const Insn_template* insn = &stub_template->insns()[reloc_insn_index];
10471 unsigned int r_type = insn->r_type();
10472 section_size_type reloc_offset = stub_template->reloc_offset(i);
10473 section_size_type reloc_size = insn->size();
10474 gold_assert(reloc_offset + reloc_size <= view_size);
10476 // This is the address of the stub destination.
10477 Arm_address target = stub->reloc_target(i) + insn->reloc_addend();
10478 Symbol_value<32> symval;
10479 symval.set_output_value(target);
10481 // Synthesize a fake reloc just in case. We don't have a symbol so
10482 // we use 0.
10483 unsigned char reloc_buffer[elfcpp::Elf_sizes<32>::rel_size];
10484 memset(reloc_buffer, 0, sizeof(reloc_buffer));
10485 elfcpp::Rel_write<32, big_endian> reloc_write(reloc_buffer);
10486 reloc_write.put_r_offset(reloc_offset);
10487 reloc_write.put_r_info(elfcpp::elf_r_info<32>(0, r_type));
10488 elfcpp::Rel<32, big_endian> rel(reloc_buffer);
10490 relocate.relocate(relinfo, this, output_section,
10491 this->fake_relnum_for_stubs, rel, r_type,
10492 NULL, &symval, view + reloc_offset,
10493 address + reloc_offset, reloc_size);
10497 // Determine whether an object attribute tag takes an integer, a
10498 // string or both.
10500 template<bool big_endian>
10502 Target_arm<big_endian>::do_attribute_arg_type(int tag) const
10504 if (tag == Object_attribute::Tag_compatibility)
10505 return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
10506 | Object_attribute::ATTR_TYPE_FLAG_STR_VAL);
10507 else if (tag == elfcpp::Tag_nodefaults)
10508 return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
10509 | Object_attribute::ATTR_TYPE_FLAG_NO_DEFAULT);
10510 else if (tag == elfcpp::Tag_CPU_raw_name || tag == elfcpp::Tag_CPU_name)
10511 return Object_attribute::ATTR_TYPE_FLAG_STR_VAL;
10512 else if (tag < 32)
10513 return Object_attribute::ATTR_TYPE_FLAG_INT_VAL;
10514 else
10515 return ((tag & 1) != 0
10516 ? Object_attribute::ATTR_TYPE_FLAG_STR_VAL
10517 : Object_attribute::ATTR_TYPE_FLAG_INT_VAL);
10520 // Reorder attributes.
10522 // The ABI defines that Tag_conformance should be emitted first, and that
10523 // Tag_nodefaults should be second (if either is defined). This sets those
10524 // two positions, and bumps up the position of all the remaining tags to
10525 // compensate.
10527 template<bool big_endian>
10529 Target_arm<big_endian>::do_attributes_order(int num) const
10531 // Reorder the known object attributes in output. We want to move
10532 // Tag_conformance to position 4 and Tag_conformance to position 5
10533 // and shift eveything between 4 .. Tag_conformance - 1 to make room.
10534 if (num == 4)
10535 return elfcpp::Tag_conformance;
10536 if (num == 5)
10537 return elfcpp::Tag_nodefaults;
10538 if ((num - 2) < elfcpp::Tag_nodefaults)
10539 return num - 2;
10540 if ((num - 1) < elfcpp::Tag_conformance)
10541 return num - 1;
10542 return num;
10545 // Scan a span of THUMB code for Cortex-A8 erratum.
10547 template<bool big_endian>
10548 void
10549 Target_arm<big_endian>::scan_span_for_cortex_a8_erratum(
10550 Arm_relobj<big_endian>* arm_relobj,
10551 unsigned int shndx,
10552 section_size_type span_start,
10553 section_size_type span_end,
10554 const unsigned char* view,
10555 Arm_address address)
10557 // Scan for 32-bit Thumb-2 branches which span two 4K regions, where:
10559 // The opcode is BLX.W, BL.W, B.W, Bcc.W
10560 // The branch target is in the same 4KB region as the
10561 // first half of the branch.
10562 // The instruction before the branch is a 32-bit
10563 // length non-branch instruction.
10564 section_size_type i = span_start;
10565 bool last_was_32bit = false;
10566 bool last_was_branch = false;
10567 while (i < span_end)
10569 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
10570 const Valtype* wv = reinterpret_cast<const Valtype*>(view + i);
10571 uint32_t insn = elfcpp::Swap<16, big_endian>::readval(wv);
10572 bool is_blx = false, is_b = false;
10573 bool is_bl = false, is_bcc = false;
10575 bool insn_32bit = (insn & 0xe000) == 0xe000 && (insn & 0x1800) != 0x0000;
10576 if (insn_32bit)
10578 // Load the rest of the insn (in manual-friendly order).
10579 insn = (insn << 16) | elfcpp::Swap<16, big_endian>::readval(wv + 1);
10581 // Encoding T4: B<c>.W.
10582 is_b = (insn & 0xf800d000U) == 0xf0009000U;
10583 // Encoding T1: BL<c>.W.
10584 is_bl = (insn & 0xf800d000U) == 0xf000d000U;
10585 // Encoding T2: BLX<c>.W.
10586 is_blx = (insn & 0xf800d000U) == 0xf000c000U;
10587 // Encoding T3: B<c>.W (not permitted in IT block).
10588 is_bcc = ((insn & 0xf800d000U) == 0xf0008000U
10589 && (insn & 0x07f00000U) != 0x03800000U);
10592 bool is_32bit_branch = is_b || is_bl || is_blx || is_bcc;
10594 // If this instruction is a 32-bit THUMB branch that crosses a 4K
10595 // page boundary and it follows 32-bit non-branch instruction,
10596 // we need to work around.
10597 if (is_32bit_branch
10598 && ((address + i) & 0xfffU) == 0xffeU
10599 && last_was_32bit
10600 && !last_was_branch)
10602 // Check to see if there is a relocation stub for this branch.
10603 bool force_target_arm = false;
10604 bool force_target_thumb = false;
10605 const Cortex_a8_reloc* cortex_a8_reloc = NULL;
10606 Cortex_a8_relocs_info::const_iterator p =
10607 this->cortex_a8_relocs_info_.find(address + i);
10609 if (p != this->cortex_a8_relocs_info_.end())
10611 cortex_a8_reloc = p->second;
10612 bool target_is_thumb = (cortex_a8_reloc->destination() & 1) != 0;
10614 if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
10615 && !target_is_thumb)
10616 force_target_arm = true;
10617 else if (cortex_a8_reloc->r_type() == elfcpp::R_ARM_THM_CALL
10618 && target_is_thumb)
10619 force_target_thumb = true;
10622 off_t offset;
10623 Stub_type stub_type = arm_stub_none;
10625 // Check if we have an offending branch instruction.
10626 uint16_t upper_insn = (insn >> 16) & 0xffffU;
10627 uint16_t lower_insn = insn & 0xffffU;
10628 typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
10630 if (cortex_a8_reloc != NULL
10631 && cortex_a8_reloc->reloc_stub() != NULL)
10632 // We've already made a stub for this instruction, e.g.
10633 // it's a long branch or a Thumb->ARM stub. Assume that
10634 // stub will suffice to work around the A8 erratum (see
10635 // setting of always_after_branch above).
10637 else if (is_bcc)
10639 offset = RelocFuncs::thumb32_cond_branch_offset(upper_insn,
10640 lower_insn);
10641 stub_type = arm_stub_a8_veneer_b_cond;
10643 else if (is_b || is_bl || is_blx)
10645 offset = RelocFuncs::thumb32_branch_offset(upper_insn,
10646 lower_insn);
10647 if (is_blx)
10648 offset &= ~3;
10650 stub_type = (is_blx
10651 ? arm_stub_a8_veneer_blx
10652 : (is_bl
10653 ? arm_stub_a8_veneer_bl
10654 : arm_stub_a8_veneer_b));
10657 if (stub_type != arm_stub_none)
10659 Arm_address pc_for_insn = address + i + 4;
10661 // The original instruction is a BL, but the target is
10662 // an ARM instruction. If we were not making a stub,
10663 // the BL would have been converted to a BLX. Use the
10664 // BLX stub instead in that case.
10665 if (this->may_use_blx() && force_target_arm
10666 && stub_type == arm_stub_a8_veneer_bl)
10668 stub_type = arm_stub_a8_veneer_blx;
10669 is_blx = true;
10670 is_bl = false;
10672 // Conversely, if the original instruction was
10673 // BLX but the target is Thumb mode, use the BL stub.
10674 else if (force_target_thumb
10675 && stub_type == arm_stub_a8_veneer_blx)
10677 stub_type = arm_stub_a8_veneer_bl;
10678 is_blx = false;
10679 is_bl = true;
10682 if (is_blx)
10683 pc_for_insn &= ~3;
10685 // If we found a relocation, use the proper destination,
10686 // not the offset in the (unrelocated) instruction.
10687 // Note this is always done if we switched the stub type above.
10688 if (cortex_a8_reloc != NULL)
10689 offset = (off_t) (cortex_a8_reloc->destination() - pc_for_insn);
10691 Arm_address target = (pc_for_insn + offset) | (is_blx ? 0 : 1);
10693 // Add a new stub if destination address in in the same page.
10694 if (((address + i) & ~0xfffU) == (target & ~0xfffU))
10696 Cortex_a8_stub* stub =
10697 this->stub_factory_.make_cortex_a8_stub(stub_type,
10698 arm_relobj, shndx,
10699 address + i,
10700 target, insn);
10701 Stub_table<big_endian>* stub_table =
10702 arm_relobj->stub_table(shndx);
10703 gold_assert(stub_table != NULL);
10704 stub_table->add_cortex_a8_stub(address + i, stub);
10709 i += insn_32bit ? 4 : 2;
10710 last_was_32bit = insn_32bit;
10711 last_was_branch = is_32bit_branch;
10715 // Apply the Cortex-A8 workaround.
10717 template<bool big_endian>
10718 void
10719 Target_arm<big_endian>::apply_cortex_a8_workaround(
10720 const Cortex_a8_stub* stub,
10721 Arm_address stub_address,
10722 unsigned char* insn_view,
10723 Arm_address insn_address)
10725 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
10726 Valtype* wv = reinterpret_cast<Valtype*>(insn_view);
10727 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
10728 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
10729 off_t branch_offset = stub_address - (insn_address + 4);
10731 typedef struct Arm_relocate_functions<big_endian> RelocFuncs;
10732 switch (stub->stub_template()->type())
10734 case arm_stub_a8_veneer_b_cond:
10735 gold_assert(!utils::has_overflow<21>(branch_offset));
10736 upper_insn = RelocFuncs::thumb32_cond_branch_upper(upper_insn,
10737 branch_offset);
10738 lower_insn = RelocFuncs::thumb32_cond_branch_lower(lower_insn,
10739 branch_offset);
10740 break;
10742 case arm_stub_a8_veneer_b:
10743 case arm_stub_a8_veneer_bl:
10744 case arm_stub_a8_veneer_blx:
10745 if ((lower_insn & 0x5000U) == 0x4000U)
10746 // For a BLX instruction, make sure that the relocation is
10747 // rounded up to a word boundary. This follows the semantics of
10748 // the instruction which specifies that bit 1 of the target
10749 // address will come from bit 1 of the base address.
10750 branch_offset = (branch_offset + 2) & ~3;
10752 // Put BRANCH_OFFSET back into the insn.
10753 gold_assert(!utils::has_overflow<25>(branch_offset));
10754 upper_insn = RelocFuncs::thumb32_branch_upper(upper_insn, branch_offset);
10755 lower_insn = RelocFuncs::thumb32_branch_lower(lower_insn, branch_offset);
10756 break;
10758 default:
10759 gold_unreachable();
10762 // Put the relocated value back in the object file:
10763 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
10764 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
10767 template<bool big_endian>
10768 class Target_selector_arm : public Target_selector
10770 public:
10771 Target_selector_arm()
10772 : Target_selector(elfcpp::EM_ARM, 32, big_endian,
10773 (big_endian ? "elf32-bigarm" : "elf32-littlearm"))
10776 Target*
10777 do_instantiate_target()
10778 { return new Target_arm<big_endian>(); }
10781 // Fix .ARM.exidx section coverage.
10783 template<bool big_endian>
10784 void
10785 Target_arm<big_endian>::fix_exidx_coverage(
10786 Layout* layout,
10787 Arm_output_section<big_endian>* exidx_section,
10788 Symbol_table* symtab)
10790 // We need to look at all the input sections in output in ascending
10791 // order of of output address. We do that by building a sorted list
10792 // of output sections by addresses. Then we looks at the output sections
10793 // in order. The input sections in an output section are already sorted
10794 // by addresses within the output section.
10796 typedef std::set<Output_section*, output_section_address_less_than>
10797 Sorted_output_section_list;
10798 Sorted_output_section_list sorted_output_sections;
10799 Layout::Section_list section_list;
10800 layout->get_allocated_sections(&section_list);
10801 for (Layout::Section_list::const_iterator p = section_list.begin();
10802 p != section_list.end();
10803 ++p)
10805 // We only care about output sections that contain executable code.
10806 if (((*p)->flags() & elfcpp::SHF_EXECINSTR) != 0)
10807 sorted_output_sections.insert(*p);
10810 // Go over the output sections in ascending order of output addresses.
10811 typedef typename Arm_output_section<big_endian>::Text_section_list
10812 Text_section_list;
10813 Text_section_list sorted_text_sections;
10814 for(typename Sorted_output_section_list::iterator p =
10815 sorted_output_sections.begin();
10816 p != sorted_output_sections.end();
10817 ++p)
10819 Arm_output_section<big_endian>* arm_output_section =
10820 Arm_output_section<big_endian>::as_arm_output_section(*p);
10821 arm_output_section->append_text_sections_to_list(&sorted_text_sections);
10824 exidx_section->fix_exidx_coverage(layout, sorted_text_sections, symtab);
10827 Target_selector_arm<false> target_selector_arm;
10828 Target_selector_arm<true> target_selector_armbe;
10830 } // End anonymous namespace.