PR 11128
[binutils.git] / gold / arm.cc
blobd1040335241c66b494535bbc8f254cbfd641aeb7
1 // arm.cc -- arm target support for gold.
3 // Copyright 2009 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>
34 #include "elfcpp.h"
35 #include "parameters.h"
36 #include "reloc.h"
37 #include "arm.h"
38 #include "object.h"
39 #include "symtab.h"
40 #include "layout.h"
41 #include "output.h"
42 #include "copy-relocs.h"
43 #include "target.h"
44 #include "target-reloc.h"
45 #include "target-select.h"
46 #include "tls.h"
47 #include "defstd.h"
48 #include "gc.h"
49 #include "attributes.h"
51 namespace
54 using namespace gold;
56 template<bool big_endian>
57 class Output_data_plt_arm;
59 template<bool big_endian>
60 class Stub_table;
62 template<bool big_endian>
63 class Arm_input_section;
65 template<bool big_endian>
66 class Arm_output_section;
68 template<bool big_endian>
69 class Arm_relobj;
71 template<bool big_endian>
72 class Target_arm;
74 // For convenience.
75 typedef elfcpp::Elf_types<32>::Elf_Addr Arm_address;
77 // Maximum branch offsets for ARM, THUMB and THUMB2.
78 const int32_t ARM_MAX_FWD_BRANCH_OFFSET = ((((1 << 23) - 1) << 2) + 8);
79 const int32_t ARM_MAX_BWD_BRANCH_OFFSET = ((-((1 << 23) << 2)) + 8);
80 const int32_t THM_MAX_FWD_BRANCH_OFFSET = ((1 << 22) -2 + 4);
81 const int32_t THM_MAX_BWD_BRANCH_OFFSET = (-(1 << 22) + 4);
82 const int32_t THM2_MAX_FWD_BRANCH_OFFSET = (((1 << 24) - 2) + 4);
83 const int32_t THM2_MAX_BWD_BRANCH_OFFSET = (-(1 << 24) + 4);
85 // The arm target class.
87 // This is a very simple port of gold for ARM-EABI. It is intended for
88 // supporting Android only for the time being. Only these relocation types
89 // are supported.
91 // R_ARM_NONE
92 // R_ARM_ABS32
93 // R_ARM_ABS32_NOI
94 // R_ARM_ABS16
95 // R_ARM_ABS12
96 // R_ARM_ABS8
97 // R_ARM_THM_ABS5
98 // R_ARM_BASE_ABS
99 // R_ARM_REL32
100 // R_ARM_THM_CALL
101 // R_ARM_COPY
102 // R_ARM_GLOB_DAT
103 // R_ARM_BASE_PREL
104 // R_ARM_JUMP_SLOT
105 // R_ARM_RELATIVE
106 // R_ARM_GOTOFF32
107 // R_ARM_GOT_BREL
108 // R_ARM_GOT_PREL
109 // R_ARM_PLT32
110 // R_ARM_CALL
111 // R_ARM_JUMP24
112 // R_ARM_TARGET1
113 // R_ARM_PREL31
114 // R_ARM_ABS8
115 // R_ARM_MOVW_ABS_NC
116 // R_ARM_MOVT_ABS
117 // R_ARM_THM_MOVW_ABS_NC
118 // R_ARM_THM_MOVT_ABS
119 // R_ARM_MOVW_PREL_NC
120 // R_ARM_MOVT_PREL
121 // R_ARM_THM_MOVW_PREL_NC
122 // R_ARM_THM_MOVT_PREL
124 // TODOs:
125 // - Support more relocation types as needed.
126 // - Make PLTs more flexible for different architecture features like
127 // Thumb-2 and BE8.
128 // There are probably a lot more.
130 // Instruction template class. This class is similar to the insn_sequence
131 // struct in bfd/elf32-arm.c.
133 class Insn_template
135 public:
136 // Types of instruction templates.
137 enum Type
139 THUMB16_TYPE = 1,
140 THUMB32_TYPE,
141 ARM_TYPE,
142 DATA_TYPE
145 // Factory methods to create instrunction templates in different formats.
147 static const Insn_template
148 thumb16_insn(uint32_t data)
149 { return Insn_template(data, THUMB16_TYPE, elfcpp::R_ARM_NONE, 0); }
151 // A bit of a hack. A Thumb conditional branch, in which the proper
152 // condition is inserted when we build the stub.
153 static const Insn_template
154 thumb16_bcond_insn(uint32_t data)
155 { return Insn_template(data, THUMB16_TYPE, elfcpp::R_ARM_NONE, 1); }
157 static const Insn_template
158 thumb32_insn(uint32_t data)
159 { return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_NONE, 0); }
161 static const Insn_template
162 thumb32_b_insn(uint32_t data, int reloc_addend)
164 return Insn_template(data, THUMB32_TYPE, elfcpp::R_ARM_THM_JUMP24,
165 reloc_addend);
168 static const Insn_template
169 arm_insn(uint32_t data)
170 { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_NONE, 0); }
172 static const Insn_template
173 arm_rel_insn(unsigned data, int reloc_addend)
174 { return Insn_template(data, ARM_TYPE, elfcpp::R_ARM_JUMP24, reloc_addend); }
176 static const Insn_template
177 data_word(unsigned data, unsigned int r_type, int reloc_addend)
178 { return Insn_template(data, DATA_TYPE, r_type, reloc_addend); }
180 // Accessors. This class is used for read-only objects so no modifiers
181 // are provided.
183 uint32_t
184 data() const
185 { return this->data_; }
187 // Return the instruction sequence type of this.
188 Type
189 type() const
190 { return this->type_; }
192 // Return the ARM relocation type of this.
193 unsigned int
194 r_type() const
195 { return this->r_type_; }
197 int32_t
198 reloc_addend() const
199 { return this->reloc_addend_; }
201 // Return size of instrunction template in bytes.
202 size_t
203 size() const;
205 // Return byte-alignment of instrunction template.
206 unsigned
207 alignment() const;
209 private:
210 // We make the constructor private to ensure that only the factory
211 // methods are used.
212 inline
213 Insn_template(unsigned data, Type type, unsigned int r_type, int reloc_addend)
214 : data_(data), type_(type), r_type_(r_type), reloc_addend_(reloc_addend)
217 // Instruction specific data. This is used to store information like
218 // some of the instruction bits.
219 uint32_t data_;
220 // Instruction template type.
221 Type type_;
222 // Relocation type if there is a relocation or R_ARM_NONE otherwise.
223 unsigned int r_type_;
224 // Relocation addend.
225 int32_t reloc_addend_;
228 // Macro for generating code to stub types. One entry per long/short
229 // branch stub
231 #define DEF_STUBS \
232 DEF_STUB(long_branch_any_any) \
233 DEF_STUB(long_branch_v4t_arm_thumb) \
234 DEF_STUB(long_branch_thumb_only) \
235 DEF_STUB(long_branch_v4t_thumb_thumb) \
236 DEF_STUB(long_branch_v4t_thumb_arm) \
237 DEF_STUB(short_branch_v4t_thumb_arm) \
238 DEF_STUB(long_branch_any_arm_pic) \
239 DEF_STUB(long_branch_any_thumb_pic) \
240 DEF_STUB(long_branch_v4t_thumb_thumb_pic) \
241 DEF_STUB(long_branch_v4t_arm_thumb_pic) \
242 DEF_STUB(long_branch_v4t_thumb_arm_pic) \
243 DEF_STUB(long_branch_thumb_only_pic) \
244 DEF_STUB(a8_veneer_b_cond) \
245 DEF_STUB(a8_veneer_b) \
246 DEF_STUB(a8_veneer_bl) \
247 DEF_STUB(a8_veneer_blx)
249 // Stub types.
251 #define DEF_STUB(x) arm_stub_##x,
252 typedef enum
254 arm_stub_none,
255 DEF_STUBS
257 // First reloc stub type.
258 arm_stub_reloc_first = arm_stub_long_branch_any_any,
259 // Last reloc stub type.
260 arm_stub_reloc_last = arm_stub_long_branch_thumb_only_pic,
262 // First Cortex-A8 stub type.
263 arm_stub_cortex_a8_first = arm_stub_a8_veneer_b_cond,
264 // Last Cortex-A8 stub type.
265 arm_stub_cortex_a8_last = arm_stub_a8_veneer_blx,
267 // Last stub type.
268 arm_stub_type_last = arm_stub_a8_veneer_blx
269 } Stub_type;
270 #undef DEF_STUB
272 // Stub template class. Templates are meant to be read-only objects.
273 // A stub template for a stub type contains all read-only attributes
274 // common to all stubs of the same type.
276 class Stub_template
278 public:
279 Stub_template(Stub_type, const Insn_template*, size_t);
281 ~Stub_template()
284 // Return stub type.
285 Stub_type
286 type() const
287 { return this->type_; }
289 // Return an array of instruction templates.
290 const Insn_template*
291 insns() const
292 { return this->insns_; }
294 // Return size of template in number of instructions.
295 size_t
296 insn_count() const
297 { return this->insn_count_; }
299 // Return size of template in bytes.
300 size_t
301 size() const
302 { return this->size_; }
304 // Return alignment of the stub template.
305 unsigned
306 alignment() const
307 { return this->alignment_; }
309 // Return whether entry point is in thumb mode.
310 bool
311 entry_in_thumb_mode() const
312 { return this->entry_in_thumb_mode_; }
314 // Return number of relocations in this template.
315 size_t
316 reloc_count() const
317 { return this->relocs_.size(); }
319 // Return index of the I-th instruction with relocation.
320 size_t
321 reloc_insn_index(size_t i) const
323 gold_assert(i < this->relocs_.size());
324 return this->relocs_[i].first;
327 // Return the offset of the I-th instruction with relocation from the
328 // beginning of the stub.
329 section_size_type
330 reloc_offset(size_t i) const
332 gold_assert(i < this->relocs_.size());
333 return this->relocs_[i].second;
336 private:
337 // This contains information about an instruction template with a relocation
338 // and its offset from start of stub.
339 typedef std::pair<size_t, section_size_type> Reloc;
341 // A Stub_template may not be copied. We want to share templates as much
342 // as possible.
343 Stub_template(const Stub_template&);
344 Stub_template& operator=(const Stub_template&);
346 // Stub type.
347 Stub_type type_;
348 // Points to an array of Insn_templates.
349 const Insn_template* insns_;
350 // Number of Insn_templates in insns_[].
351 size_t insn_count_;
352 // Size of templated instructions in bytes.
353 size_t size_;
354 // Alignment of templated instructions.
355 unsigned alignment_;
356 // Flag to indicate if entry is in thumb mode.
357 bool entry_in_thumb_mode_;
358 // A table of reloc instruction indices and offsets. We can find these by
359 // looking at the instruction templates but we pre-compute and then stash
360 // them here for speed.
361 std::vector<Reloc> relocs_;
365 // A class for code stubs. This is a base class for different type of
366 // stubs used in the ARM target.
369 class Stub
371 private:
372 static const section_offset_type invalid_offset =
373 static_cast<section_offset_type>(-1);
375 public:
376 Stub(const Stub_template* stub_template)
377 : stub_template_(stub_template), offset_(invalid_offset)
380 virtual
381 ~Stub()
384 // Return the stub template.
385 const Stub_template*
386 stub_template() const
387 { return this->stub_template_; }
389 // Return offset of code stub from beginning of its containing stub table.
390 section_offset_type
391 offset() const
393 gold_assert(this->offset_ != invalid_offset);
394 return this->offset_;
397 // Set offset of code stub from beginning of its containing stub table.
398 void
399 set_offset(section_offset_type offset)
400 { this->offset_ = offset; }
402 // Return the relocation target address of the i-th relocation in the
403 // stub. This must be defined in a child class.
404 Arm_address
405 reloc_target(size_t i)
406 { return this->do_reloc_target(i); }
408 // Write a stub at output VIEW. BIG_ENDIAN select how a stub is written.
409 void
410 write(unsigned char* view, section_size_type view_size, bool big_endian)
411 { this->do_write(view, view_size, big_endian); }
413 protected:
414 // This must be defined in the child class.
415 virtual Arm_address
416 do_reloc_target(size_t) = 0;
418 // This must be defined in the child class.
419 virtual void
420 do_write(unsigned char*, section_size_type, bool) = 0;
422 private:
423 // Its template.
424 const Stub_template* stub_template_;
425 // Offset within the section of containing this stub.
426 section_offset_type offset_;
429 // Reloc stub class. These are stubs we use to fix up relocation because
430 // of limited branch ranges.
432 class Reloc_stub : public Stub
434 public:
435 static const unsigned int invalid_index = static_cast<unsigned int>(-1);
436 // We assume we never jump to this address.
437 static const Arm_address invalid_address = static_cast<Arm_address>(-1);
439 // Return destination address.
440 Arm_address
441 destination_address() const
443 gold_assert(this->destination_address_ != this->invalid_address);
444 return this->destination_address_;
447 // Set destination address.
448 void
449 set_destination_address(Arm_address address)
451 gold_assert(address != this->invalid_address);
452 this->destination_address_ = address;
455 // Reset destination address.
456 void
457 reset_destination_address()
458 { this->destination_address_ = this->invalid_address; }
460 // Determine stub type for a branch of a relocation of R_TYPE going
461 // from BRANCH_ADDRESS to BRANCH_TARGET. If TARGET_IS_THUMB is set,
462 // the branch target is a thumb instruction. TARGET is used for look
463 // up ARM-specific linker settings.
464 static Stub_type
465 stub_type_for_reloc(unsigned int r_type, Arm_address branch_address,
466 Arm_address branch_target, bool target_is_thumb);
468 // Reloc_stub key. A key is logically a triplet of a stub type, a symbol
469 // and an addend. Since we treat global and local symbol differently, we
470 // use a Symbol object for a global symbol and a object-index pair for
471 // a local symbol.
472 class Key
474 public:
475 // If SYMBOL is not null, this is a global symbol, we ignore RELOBJ and
476 // R_SYM. Otherwise, this is a local symbol and RELOBJ must non-NULL
477 // and R_SYM must not be invalid_index.
478 Key(Stub_type stub_type, const Symbol* symbol, const Relobj* relobj,
479 unsigned int r_sym, int32_t addend)
480 : stub_type_(stub_type), addend_(addend)
482 if (symbol != NULL)
484 this->r_sym_ = Reloc_stub::invalid_index;
485 this->u_.symbol = symbol;
487 else
489 gold_assert(relobj != NULL && r_sym != invalid_index);
490 this->r_sym_ = r_sym;
491 this->u_.relobj = relobj;
495 ~Key()
498 // Accessors: Keys are meant to be read-only object so no modifiers are
499 // provided.
501 // Return stub type.
502 Stub_type
503 stub_type() const
504 { return this->stub_type_; }
506 // Return the local symbol index or invalid_index.
507 unsigned int
508 r_sym() const
509 { return this->r_sym_; }
511 // Return the symbol if there is one.
512 const Symbol*
513 symbol() const
514 { return this->r_sym_ == invalid_index ? this->u_.symbol : NULL; }
516 // Return the relobj if there is one.
517 const Relobj*
518 relobj() const
519 { return this->r_sym_ != invalid_index ? this->u_.relobj : NULL; }
521 // Whether this equals to another key k.
522 bool
523 eq(const Key& k) const
525 return ((this->stub_type_ == k.stub_type_)
526 && (this->r_sym_ == k.r_sym_)
527 && ((this->r_sym_ != Reloc_stub::invalid_index)
528 ? (this->u_.relobj == k.u_.relobj)
529 : (this->u_.symbol == k.u_.symbol))
530 && (this->addend_ == k.addend_));
533 // Return a hash value.
534 size_t
535 hash_value() const
537 return (this->stub_type_
538 ^ this->r_sym_
539 ^ gold::string_hash<char>(
540 (this->r_sym_ != Reloc_stub::invalid_index)
541 ? this->u_.relobj->name().c_str()
542 : this->u_.symbol->name())
543 ^ this->addend_);
546 // Functors for STL associative containers.
547 struct hash
549 size_t
550 operator()(const Key& k) const
551 { return k.hash_value(); }
554 struct equal_to
556 bool
557 operator()(const Key& k1, const Key& k2) const
558 { return k1.eq(k2); }
561 // Name of key. This is mainly for debugging.
562 std::string
563 name() const;
565 private:
566 // Stub type.
567 Stub_type stub_type_;
568 // If this is a local symbol, this is the index in the defining object.
569 // Otherwise, it is invalid_index for a global symbol.
570 unsigned int r_sym_;
571 // If r_sym_ is invalid index. This points to a global symbol.
572 // Otherwise, this points a relobj. We used the unsized and target
573 // independent Symbol and Relobj classes instead of Sized_symbol<32> and
574 // Arm_relobj. This is done to avoid making the stub class a template
575 // as most of the stub machinery is endianity-neutral. However, it
576 // may require a bit of casting done by users of this class.
577 union
579 const Symbol* symbol;
580 const Relobj* relobj;
581 } u_;
582 // Addend associated with a reloc.
583 int32_t addend_;
586 protected:
587 // Reloc_stubs are created via a stub factory. So these are protected.
588 Reloc_stub(const Stub_template* stub_template)
589 : Stub(stub_template), destination_address_(invalid_address)
592 ~Reloc_stub()
595 friend class Stub_factory;
597 private:
598 // Return the relocation target address of the i-th relocation in the
599 // stub.
600 Arm_address
601 do_reloc_target(size_t i)
603 // All reloc stub have only one relocation.
604 gold_assert(i == 0);
605 return this->destination_address_;
608 // A template to implement do_write below.
609 template<bool big_endian>
610 void inline
611 do_fixed_endian_write(unsigned char*, section_size_type);
613 // Write a stub.
614 void
615 do_write(unsigned char* view, section_size_type view_size, bool big_endian);
617 // Address of destination.
618 Arm_address destination_address_;
621 // Stub factory class.
623 class Stub_factory
625 public:
626 // Return the unique instance of this class.
627 static const Stub_factory&
628 get_instance()
630 static Stub_factory singleton;
631 return singleton;
634 // Make a relocation stub.
635 Reloc_stub*
636 make_reloc_stub(Stub_type stub_type) const
638 gold_assert(stub_type >= arm_stub_reloc_first
639 && stub_type <= arm_stub_reloc_last);
640 return new Reloc_stub(this->stub_templates_[stub_type]);
643 private:
644 // Constructor and destructor are protected since we only return a single
645 // instance created in Stub_factory::get_instance().
647 Stub_factory();
649 // A Stub_factory may not be copied since it is a singleton.
650 Stub_factory(const Stub_factory&);
651 Stub_factory& operator=(Stub_factory&);
653 // Stub templates. These are initialized in the constructor.
654 const Stub_template* stub_templates_[arm_stub_type_last+1];
657 // A class to hold stubs for the ARM target.
659 template<bool big_endian>
660 class Stub_table : public Output_data
662 public:
663 Stub_table(Arm_input_section<big_endian>* owner)
664 : Output_data(), addralign_(1), owner_(owner), has_been_changed_(false),
665 reloc_stubs_()
668 ~Stub_table()
671 // Owner of this stub table.
672 Arm_input_section<big_endian>*
673 owner() const
674 { return this->owner_; }
676 // Whether this stub table is empty.
677 bool
678 empty() const
679 { return this->reloc_stubs_.empty(); }
681 // Whether this has been changed.
682 bool
683 has_been_changed() const
684 { return this->has_been_changed_; }
686 // Set the has-been-changed flag.
687 void
688 set_has_been_changed(bool value)
689 { this->has_been_changed_ = value; }
691 // Return the current data size.
692 off_t
693 current_data_size() const
694 { return this->current_data_size_for_child(); }
696 // Add a STUB with using KEY. Caller is reponsible for avoid adding
697 // if already a STUB with the same key has been added.
698 void
699 add_reloc_stub(Reloc_stub* stub, const Reloc_stub::Key& key);
701 // Look up a relocation stub using KEY. Return NULL if there is none.
702 Reloc_stub*
703 find_reloc_stub(const Reloc_stub::Key& key) const
705 typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.find(key);
706 return (p != this->reloc_stubs_.end()) ? p->second : NULL;
709 // Relocate stubs in this stub table.
710 void
711 relocate_stubs(const Relocate_info<32, big_endian>*,
712 Target_arm<big_endian>*, Output_section*,
713 unsigned char*, Arm_address, section_size_type);
715 protected:
716 // Write out section contents.
717 void
718 do_write(Output_file*);
720 // Return the required alignment.
721 uint64_t
722 do_addralign() const
723 { return this->addralign_; }
725 // Finalize data size.
726 void
727 set_final_data_size()
728 { this->set_data_size(this->current_data_size_for_child()); }
730 // Reset address and file offset.
731 void
732 do_reset_address_and_file_offset();
734 private:
735 // Unordered map of stubs.
736 typedef
737 Unordered_map<Reloc_stub::Key, Reloc_stub*, Reloc_stub::Key::hash,
738 Reloc_stub::Key::equal_to>
739 Reloc_stub_map;
741 // Address alignment
742 uint64_t addralign_;
743 // Owner of this stub table.
744 Arm_input_section<big_endian>* owner_;
745 // This is set to true during relaxiong if the size of the stub table
746 // has been changed.
747 bool has_been_changed_;
748 // The relocation stubs.
749 Reloc_stub_map reloc_stubs_;
752 // A class to wrap an ordinary input section containing executable code.
754 template<bool big_endian>
755 class Arm_input_section : public Output_relaxed_input_section
757 public:
758 Arm_input_section(Relobj* relobj, unsigned int shndx)
759 : Output_relaxed_input_section(relobj, shndx, 1),
760 original_addralign_(1), original_size_(0), stub_table_(NULL)
763 ~Arm_input_section()
766 // Initialize.
767 void
768 init();
770 // Whether this is a stub table owner.
771 bool
772 is_stub_table_owner() const
773 { return this->stub_table_ != NULL && this->stub_table_->owner() == this; }
775 // Return the stub table.
776 Stub_table<big_endian>*
777 stub_table() const
778 { return this->stub_table_; }
780 // Set the stub_table.
781 void
782 set_stub_table(Stub_table<big_endian>* stub_table)
783 { this->stub_table_ = stub_table; }
785 // Downcast a base pointer to an Arm_input_section pointer. This is
786 // not type-safe but we only use Arm_input_section not the base class.
787 static Arm_input_section<big_endian>*
788 as_arm_input_section(Output_relaxed_input_section* poris)
789 { return static_cast<Arm_input_section<big_endian>*>(poris); }
791 protected:
792 // Write data to output file.
793 void
794 do_write(Output_file*);
796 // Return required alignment of this.
797 uint64_t
798 do_addralign() const
800 if (this->is_stub_table_owner())
801 return std::max(this->stub_table_->addralign(),
802 this->original_addralign_);
803 else
804 return this->original_addralign_;
807 // Finalize data size.
808 void
809 set_final_data_size();
811 // Reset address and file offset.
812 void
813 do_reset_address_and_file_offset();
815 // Output offset.
816 bool
817 do_output_offset(const Relobj* object, unsigned int shndx,
818 section_offset_type offset,
819 section_offset_type* poutput) const
821 if ((object == this->relobj())
822 && (shndx == this->shndx())
823 && (offset >= 0)
824 && (convert_types<uint64_t, section_offset_type>(offset)
825 <= this->original_size_))
827 *poutput = offset;
828 return true;
830 else
831 return false;
834 private:
835 // Copying is not allowed.
836 Arm_input_section(const Arm_input_section&);
837 Arm_input_section& operator=(const Arm_input_section&);
839 // Address alignment of the original input section.
840 uint64_t original_addralign_;
841 // Section size of the original input section.
842 uint64_t original_size_;
843 // Stub table.
844 Stub_table<big_endian>* stub_table_;
847 // Arm output section class. This is defined mainly to add a number of
848 // stub generation methods.
850 template<bool big_endian>
851 class Arm_output_section : public Output_section
853 public:
854 Arm_output_section(const char* name, elfcpp::Elf_Word type,
855 elfcpp::Elf_Xword flags)
856 : Output_section(name, type, flags)
859 ~Arm_output_section()
862 // Group input sections for stub generation.
863 void
864 group_sections(section_size_type, bool, Target_arm<big_endian>*);
866 // Downcast a base pointer to an Arm_output_section pointer. This is
867 // not type-safe but we only use Arm_output_section not the base class.
868 static Arm_output_section<big_endian>*
869 as_arm_output_section(Output_section* os)
870 { return static_cast<Arm_output_section<big_endian>*>(os); }
872 private:
873 // For convenience.
874 typedef Output_section::Input_section Input_section;
875 typedef Output_section::Input_section_list Input_section_list;
877 // Create a stub group.
878 void create_stub_group(Input_section_list::const_iterator,
879 Input_section_list::const_iterator,
880 Input_section_list::const_iterator,
881 Target_arm<big_endian>*,
882 std::vector<Output_relaxed_input_section*>*);
885 // Arm_relobj class.
887 template<bool big_endian>
888 class Arm_relobj : public Sized_relobj<32, big_endian>
890 public:
891 static const Arm_address invalid_address = static_cast<Arm_address>(-1);
893 Arm_relobj(const std::string& name, Input_file* input_file, off_t offset,
894 const typename elfcpp::Ehdr<32, big_endian>& ehdr)
895 : Sized_relobj<32, big_endian>(name, input_file, offset, ehdr),
896 stub_tables_(), local_symbol_is_thumb_function_(),
897 attributes_section_data_(NULL)
900 ~Arm_relobj()
901 { delete this->attributes_section_data_; }
903 // Return the stub table of the SHNDX-th section if there is one.
904 Stub_table<big_endian>*
905 stub_table(unsigned int shndx) const
907 gold_assert(shndx < this->stub_tables_.size());
908 return this->stub_tables_[shndx];
911 // Set STUB_TABLE to be the stub_table of the SHNDX-th section.
912 void
913 set_stub_table(unsigned int shndx, Stub_table<big_endian>* stub_table)
915 gold_assert(shndx < this->stub_tables_.size());
916 this->stub_tables_[shndx] = stub_table;
919 // Whether a local symbol is a THUMB function. R_SYM is the symbol table
920 // index. This is only valid after do_count_local_symbol is called.
921 bool
922 local_symbol_is_thumb_function(unsigned int r_sym) const
924 gold_assert(r_sym < this->local_symbol_is_thumb_function_.size());
925 return this->local_symbol_is_thumb_function_[r_sym];
928 // Scan all relocation sections for stub generation.
929 void
930 scan_sections_for_stubs(Target_arm<big_endian>*, const Symbol_table*,
931 const Layout*);
933 // Convert regular input section with index SHNDX to a relaxed section.
934 void
935 convert_input_section_to_relaxed_section(unsigned shndx)
937 // The stubs have relocations and we need to process them after writing
938 // out the stubs. So relocation now must follow section write.
939 this->invalidate_section_offset(shndx);
940 this->set_relocs_must_follow_section_writes();
943 // Downcast a base pointer to an Arm_relobj pointer. This is
944 // not type-safe but we only use Arm_relobj not the base class.
945 static Arm_relobj<big_endian>*
946 as_arm_relobj(Relobj* relobj)
947 { return static_cast<Arm_relobj<big_endian>*>(relobj); }
949 // Processor-specific flags in ELF file header. This is valid only after
950 // reading symbols.
951 elfcpp::Elf_Word
952 processor_specific_flags() const
953 { return this->processor_specific_flags_; }
955 // Attribute section data This is the contents of the .ARM.attribute section
956 // if there is one.
957 const Attributes_section_data*
958 attributes_section_data() const
959 { return this->attributes_section_data_; }
961 protected:
962 // Post constructor setup.
963 void
964 do_setup()
966 // Call parent's setup method.
967 Sized_relobj<32, big_endian>::do_setup();
969 // Initialize look-up tables.
970 Stub_table_list empty_stub_table_list(this->shnum(), NULL);
971 this->stub_tables_.swap(empty_stub_table_list);
974 // Count the local symbols.
975 void
976 do_count_local_symbols(Stringpool_template<char>*,
977 Stringpool_template<char>*);
979 void
980 do_relocate_sections(const Symbol_table* symtab, const Layout* layout,
981 const unsigned char* pshdrs,
982 typename Sized_relobj<32, big_endian>::Views* pivews);
984 // Read the symbol information.
985 void
986 do_read_symbols(Read_symbols_data* sd);
988 private:
989 // List of stub tables.
990 typedef std::vector<Stub_table<big_endian>*> Stub_table_list;
991 Stub_table_list stub_tables_;
992 // Bit vector to tell if a local symbol is a thumb function or not.
993 // This is only valid after do_count_local_symbol is called.
994 std::vector<bool> local_symbol_is_thumb_function_;
995 // processor-specific flags in ELF file header.
996 elfcpp::Elf_Word processor_specific_flags_;
997 // Object attributes if there is an .ARM.attributes section or NULL.
998 Attributes_section_data* attributes_section_data_;
1001 // Arm_dynobj class.
1003 template<bool big_endian>
1004 class Arm_dynobj : public Sized_dynobj<32, big_endian>
1006 public:
1007 Arm_dynobj(const std::string& name, Input_file* input_file, off_t offset,
1008 const elfcpp::Ehdr<32, big_endian>& ehdr)
1009 : Sized_dynobj<32, big_endian>(name, input_file, offset, ehdr),
1010 processor_specific_flags_(0), attributes_section_data_(NULL)
1013 ~Arm_dynobj()
1014 { delete this->attributes_section_data_; }
1016 // Downcast a base pointer to an Arm_relobj pointer. This is
1017 // not type-safe but we only use Arm_relobj not the base class.
1018 static Arm_dynobj<big_endian>*
1019 as_arm_dynobj(Dynobj* dynobj)
1020 { return static_cast<Arm_dynobj<big_endian>*>(dynobj); }
1022 // Processor-specific flags in ELF file header. This is valid only after
1023 // reading symbols.
1024 elfcpp::Elf_Word
1025 processor_specific_flags() const
1026 { return this->processor_specific_flags_; }
1028 // Attributes section data.
1029 const Attributes_section_data*
1030 attributes_section_data() const
1031 { return this->attributes_section_data_; }
1033 protected:
1034 // Read the symbol information.
1035 void
1036 do_read_symbols(Read_symbols_data* sd);
1038 private:
1039 // processor-specific flags in ELF file header.
1040 elfcpp::Elf_Word processor_specific_flags_;
1041 // Object attributes if there is an .ARM.attributes section or NULL.
1042 Attributes_section_data* attributes_section_data_;
1045 // Functor to read reloc addends during stub generation.
1047 template<int sh_type, bool big_endian>
1048 struct Stub_addend_reader
1050 // Return the addend for a relocation of a particular type. Depending
1051 // on whether this is a REL or RELA relocation, read the addend from a
1052 // view or from a Reloc object.
1053 elfcpp::Elf_types<32>::Elf_Swxword
1054 operator()(
1055 unsigned int /* r_type */,
1056 const unsigned char* /* view */,
1057 const typename Reloc_types<sh_type,
1058 32, big_endian>::Reloc& /* reloc */) const;
1061 // Specialized Stub_addend_reader for SHT_REL type relocation sections.
1063 template<bool big_endian>
1064 struct Stub_addend_reader<elfcpp::SHT_REL, big_endian>
1066 elfcpp::Elf_types<32>::Elf_Swxword
1067 operator()(
1068 unsigned int,
1069 const unsigned char*,
1070 const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const;
1073 // Specialized Stub_addend_reader for RELA type relocation sections.
1074 // We currently do not handle RELA type relocation sections but it is trivial
1075 // to implement the addend reader. This is provided for completeness and to
1076 // make it easier to add support for RELA relocation sections in the future.
1078 template<bool big_endian>
1079 struct Stub_addend_reader<elfcpp::SHT_RELA, big_endian>
1081 elfcpp::Elf_types<32>::Elf_Swxword
1082 operator()(
1083 unsigned int,
1084 const unsigned char*,
1085 const typename Reloc_types<elfcpp::SHT_RELA, 32,
1086 big_endian>::Reloc& reloc) const
1087 { return reloc.get_r_addend(); }
1090 // Utilities for manipulating integers of up to 32-bits
1092 namespace utils
1094 // Sign extend an n-bit unsigned integer stored in an uint32_t into
1095 // an int32_t. NO_BITS must be between 1 to 32.
1096 template<int no_bits>
1097 static inline int32_t
1098 sign_extend(uint32_t bits)
1100 gold_assert(no_bits >= 0 && no_bits <= 32);
1101 if (no_bits == 32)
1102 return static_cast<int32_t>(bits);
1103 uint32_t mask = (~((uint32_t) 0)) >> (32 - no_bits);
1104 bits &= mask;
1105 uint32_t top_bit = 1U << (no_bits - 1);
1106 int32_t as_signed = static_cast<int32_t>(bits);
1107 return (bits & top_bit) ? as_signed + (-top_bit * 2) : as_signed;
1110 // Detects overflow of an NO_BITS integer stored in a uint32_t.
1111 template<int no_bits>
1112 static inline bool
1113 has_overflow(uint32_t bits)
1115 gold_assert(no_bits >= 0 && no_bits <= 32);
1116 if (no_bits == 32)
1117 return false;
1118 int32_t max = (1 << (no_bits - 1)) - 1;
1119 int32_t min = -(1 << (no_bits - 1));
1120 int32_t as_signed = static_cast<int32_t>(bits);
1121 return as_signed > max || as_signed < min;
1124 // Detects overflow of an NO_BITS integer stored in a uint32_t when it
1125 // fits in the given number of bits as either a signed or unsigned value.
1126 // For example, has_signed_unsigned_overflow<8> would check
1127 // -128 <= bits <= 255
1128 template<int no_bits>
1129 static inline bool
1130 has_signed_unsigned_overflow(uint32_t bits)
1132 gold_assert(no_bits >= 2 && no_bits <= 32);
1133 if (no_bits == 32)
1134 return false;
1135 int32_t max = static_cast<int32_t>((1U << no_bits) - 1);
1136 int32_t min = -(1 << (no_bits - 1));
1137 int32_t as_signed = static_cast<int32_t>(bits);
1138 return as_signed > max || as_signed < min;
1141 // Select bits from A and B using bits in MASK. For each n in [0..31],
1142 // the n-th bit in the result is chosen from the n-th bits of A and B.
1143 // A zero selects A and a one selects B.
1144 static inline uint32_t
1145 bit_select(uint32_t a, uint32_t b, uint32_t mask)
1146 { return (a & ~mask) | (b & mask); }
1149 template<bool big_endian>
1150 class Target_arm : public Sized_target<32, big_endian>
1152 public:
1153 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
1154 Reloc_section;
1156 // When were are relocating a stub, we pass this as the relocation number.
1157 static const size_t fake_relnum_for_stubs = static_cast<size_t>(-1);
1159 Target_arm()
1160 : Sized_target<32, big_endian>(&arm_info),
1161 got_(NULL), plt_(NULL), got_plt_(NULL), rel_dyn_(NULL),
1162 copy_relocs_(elfcpp::R_ARM_COPY), dynbss_(NULL), stub_tables_(),
1163 stub_factory_(Stub_factory::get_instance()), may_use_blx_(false),
1164 should_force_pic_veneer_(false), arm_input_section_map_(),
1165 attributes_section_data_(NULL)
1168 // Whether we can use BLX.
1169 bool
1170 may_use_blx() const
1171 { return this->may_use_blx_; }
1173 // Set use-BLX flag.
1174 void
1175 set_may_use_blx(bool value)
1176 { this->may_use_blx_ = value; }
1178 // Whether we force PCI branch veneers.
1179 bool
1180 should_force_pic_veneer() const
1181 { return this->should_force_pic_veneer_; }
1183 // Set PIC veneer flag.
1184 void
1185 set_should_force_pic_veneer(bool value)
1186 { this->should_force_pic_veneer_ = value; }
1188 // Whether we use THUMB-2 instructions.
1189 bool
1190 using_thumb2() const
1192 Object_attribute* attr =
1193 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
1194 int arch = attr->int_value();
1195 return arch == elfcpp::TAG_CPU_ARCH_V6T2 || arch >= elfcpp::TAG_CPU_ARCH_V7;
1198 // Whether we use THUMB/THUMB-2 instructions only.
1199 bool
1200 using_thumb_only() const
1202 Object_attribute* attr =
1203 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
1204 if (attr->int_value() != elfcpp::TAG_CPU_ARCH_V7
1205 && attr->int_value() != elfcpp::TAG_CPU_ARCH_V7E_M)
1206 return false;
1207 attr = this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch_profile);
1208 return attr->int_value() == 'M';
1211 // Whether we have an NOP instruction. If not, use mov r0, r0 instead.
1212 bool
1213 may_use_arm_nop() const
1215 Object_attribute* attr =
1216 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
1217 int arch = attr->int_value();
1218 return (arch == elfcpp::TAG_CPU_ARCH_V6T2
1219 || arch == elfcpp::TAG_CPU_ARCH_V6K
1220 || arch == elfcpp::TAG_CPU_ARCH_V7
1221 || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
1224 // Whether we have THUMB-2 NOP.W instruction.
1225 bool
1226 may_use_thumb2_nop() const
1228 Object_attribute* attr =
1229 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
1230 int arch = attr->int_value();
1231 return (arch == elfcpp::TAG_CPU_ARCH_V6T2
1232 || arch == elfcpp::TAG_CPU_ARCH_V7
1233 || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
1236 // Process the relocations to determine unreferenced sections for
1237 // garbage collection.
1238 void
1239 gc_process_relocs(Symbol_table* symtab,
1240 Layout* layout,
1241 Sized_relobj<32, big_endian>* object,
1242 unsigned int data_shndx,
1243 unsigned int sh_type,
1244 const unsigned char* prelocs,
1245 size_t reloc_count,
1246 Output_section* output_section,
1247 bool needs_special_offset_handling,
1248 size_t local_symbol_count,
1249 const unsigned char* plocal_symbols);
1251 // Scan the relocations to look for symbol adjustments.
1252 void
1253 scan_relocs(Symbol_table* symtab,
1254 Layout* layout,
1255 Sized_relobj<32, big_endian>* object,
1256 unsigned int data_shndx,
1257 unsigned int sh_type,
1258 const unsigned char* prelocs,
1259 size_t reloc_count,
1260 Output_section* output_section,
1261 bool needs_special_offset_handling,
1262 size_t local_symbol_count,
1263 const unsigned char* plocal_symbols);
1265 // Finalize the sections.
1266 void
1267 do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
1269 // Return the value to use for a dynamic symbol which requires special
1270 // treatment.
1271 uint64_t
1272 do_dynsym_value(const Symbol*) const;
1274 // Relocate a section.
1275 void
1276 relocate_section(const Relocate_info<32, big_endian>*,
1277 unsigned int sh_type,
1278 const unsigned char* prelocs,
1279 size_t reloc_count,
1280 Output_section* output_section,
1281 bool needs_special_offset_handling,
1282 unsigned char* view,
1283 Arm_address view_address,
1284 section_size_type view_size,
1285 const Reloc_symbol_changes*);
1287 // Scan the relocs during a relocatable link.
1288 void
1289 scan_relocatable_relocs(Symbol_table* symtab,
1290 Layout* layout,
1291 Sized_relobj<32, big_endian>* object,
1292 unsigned int data_shndx,
1293 unsigned int sh_type,
1294 const unsigned char* prelocs,
1295 size_t reloc_count,
1296 Output_section* output_section,
1297 bool needs_special_offset_handling,
1298 size_t local_symbol_count,
1299 const unsigned char* plocal_symbols,
1300 Relocatable_relocs*);
1302 // Relocate a section during a relocatable link.
1303 void
1304 relocate_for_relocatable(const Relocate_info<32, big_endian>*,
1305 unsigned int sh_type,
1306 const unsigned char* prelocs,
1307 size_t reloc_count,
1308 Output_section* output_section,
1309 off_t offset_in_output_section,
1310 const Relocatable_relocs*,
1311 unsigned char* view,
1312 Arm_address view_address,
1313 section_size_type view_size,
1314 unsigned char* reloc_view,
1315 section_size_type reloc_view_size);
1317 // Return whether SYM is defined by the ABI.
1318 bool
1319 do_is_defined_by_abi(Symbol* sym) const
1320 { return strcmp(sym->name(), "__tls_get_addr") == 0; }
1322 // Return the size of the GOT section.
1323 section_size_type
1324 got_size()
1326 gold_assert(this->got_ != NULL);
1327 return this->got_->data_size();
1330 // Map platform-specific reloc types
1331 static unsigned int
1332 get_real_reloc_type (unsigned int r_type);
1335 // Methods to support stub-generations.
1338 // Return the stub factory
1339 const Stub_factory&
1340 stub_factory() const
1341 { return this->stub_factory_; }
1343 // Make a new Arm_input_section object.
1344 Arm_input_section<big_endian>*
1345 new_arm_input_section(Relobj*, unsigned int);
1347 // Find the Arm_input_section object corresponding to the SHNDX-th input
1348 // section of RELOBJ.
1349 Arm_input_section<big_endian>*
1350 find_arm_input_section(Relobj* relobj, unsigned int shndx) const;
1352 // Make a new Stub_table
1353 Stub_table<big_endian>*
1354 new_stub_table(Arm_input_section<big_endian>*);
1356 // Scan a section for stub generation.
1357 void
1358 scan_section_for_stubs(const Relocate_info<32, big_endian>*, unsigned int,
1359 const unsigned char*, size_t, Output_section*,
1360 bool, const unsigned char*, Arm_address,
1361 section_size_type);
1363 // Relocate a stub.
1364 void
1365 relocate_stub(Reloc_stub*, const Relocate_info<32, big_endian>*,
1366 Output_section*, unsigned char*, Arm_address,
1367 section_size_type);
1369 // Get the default ARM target.
1370 static Target_arm<big_endian>*
1371 default_target()
1373 gold_assert(parameters->target().machine_code() == elfcpp::EM_ARM
1374 && parameters->target().is_big_endian() == big_endian);
1375 return static_cast<Target_arm<big_endian>*>(
1376 parameters->sized_target<32, big_endian>());
1379 // Whether relocation type uses LSB to distinguish THUMB addresses.
1380 static bool
1381 reloc_uses_thumb_bit(unsigned int r_type);
1383 protected:
1384 // Make an ELF object.
1385 Object*
1386 do_make_elf_object(const std::string&, Input_file*, off_t,
1387 const elfcpp::Ehdr<32, big_endian>& ehdr);
1389 Object*
1390 do_make_elf_object(const std::string&, Input_file*, off_t,
1391 const elfcpp::Ehdr<32, !big_endian>&)
1392 { gold_unreachable(); }
1394 Object*
1395 do_make_elf_object(const std::string&, Input_file*, off_t,
1396 const elfcpp::Ehdr<64, false>&)
1397 { gold_unreachable(); }
1399 Object*
1400 do_make_elf_object(const std::string&, Input_file*, off_t,
1401 const elfcpp::Ehdr<64, true>&)
1402 { gold_unreachable(); }
1404 // Make an output section.
1405 Output_section*
1406 do_make_output_section(const char* name, elfcpp::Elf_Word type,
1407 elfcpp::Elf_Xword flags)
1408 { return new Arm_output_section<big_endian>(name, type, flags); }
1410 void
1411 do_adjust_elf_header(unsigned char* view, int len) const;
1413 // We only need to generate stubs, and hence perform relaxation if we are
1414 // not doing relocatable linking.
1415 bool
1416 do_may_relax() const
1417 { return !parameters->options().relocatable(); }
1419 bool
1420 do_relax(int, const Input_objects*, Symbol_table*, Layout*);
1422 // Determine whether an object attribute tag takes an integer, a
1423 // string or both.
1425 do_attribute_arg_type(int tag) const;
1427 // Reorder tags during output.
1429 do_attributes_order(int num) const;
1431 private:
1432 // The class which scans relocations.
1433 class Scan
1435 public:
1436 Scan()
1437 : issued_non_pic_error_(false)
1440 inline void
1441 local(Symbol_table* symtab, Layout* layout, Target_arm* target,
1442 Sized_relobj<32, big_endian>* object,
1443 unsigned int data_shndx,
1444 Output_section* output_section,
1445 const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
1446 const elfcpp::Sym<32, big_endian>& lsym);
1448 inline void
1449 global(Symbol_table* symtab, Layout* layout, Target_arm* target,
1450 Sized_relobj<32, big_endian>* object,
1451 unsigned int data_shndx,
1452 Output_section* output_section,
1453 const elfcpp::Rel<32, big_endian>& reloc, unsigned int r_type,
1454 Symbol* gsym);
1456 private:
1457 static void
1458 unsupported_reloc_local(Sized_relobj<32, big_endian>*,
1459 unsigned int r_type);
1461 static void
1462 unsupported_reloc_global(Sized_relobj<32, big_endian>*,
1463 unsigned int r_type, Symbol*);
1465 void
1466 check_non_pic(Relobj*, unsigned int r_type);
1468 // Almost identical to Symbol::needs_plt_entry except that it also
1469 // handles STT_ARM_TFUNC.
1470 static bool
1471 symbol_needs_plt_entry(const Symbol* sym)
1473 // An undefined symbol from an executable does not need a PLT entry.
1474 if (sym->is_undefined() && !parameters->options().shared())
1475 return false;
1477 return (!parameters->doing_static_link()
1478 && (sym->type() == elfcpp::STT_FUNC
1479 || sym->type() == elfcpp::STT_ARM_TFUNC)
1480 && (sym->is_from_dynobj()
1481 || sym->is_undefined()
1482 || sym->is_preemptible()));
1485 // Whether we have issued an error about a non-PIC compilation.
1486 bool issued_non_pic_error_;
1489 // The class which implements relocation.
1490 class Relocate
1492 public:
1493 Relocate()
1496 ~Relocate()
1499 // Return whether the static relocation needs to be applied.
1500 inline bool
1501 should_apply_static_reloc(const Sized_symbol<32>* gsym,
1502 int ref_flags,
1503 bool is_32bit,
1504 Output_section* output_section);
1506 // Do a relocation. Return false if the caller should not issue
1507 // any warnings about this relocation.
1508 inline bool
1509 relocate(const Relocate_info<32, big_endian>*, Target_arm*,
1510 Output_section*, size_t relnum,
1511 const elfcpp::Rel<32, big_endian>&,
1512 unsigned int r_type, const Sized_symbol<32>*,
1513 const Symbol_value<32>*,
1514 unsigned char*, Arm_address,
1515 section_size_type);
1517 // Return whether we want to pass flag NON_PIC_REF for this
1518 // reloc. This means the relocation type accesses a symbol not via
1519 // GOT or PLT.
1520 static inline bool
1521 reloc_is_non_pic (unsigned int r_type)
1523 switch (r_type)
1525 // These relocation types reference GOT or PLT entries explicitly.
1526 case elfcpp::R_ARM_GOT_BREL:
1527 case elfcpp::R_ARM_GOT_ABS:
1528 case elfcpp::R_ARM_GOT_PREL:
1529 case elfcpp::R_ARM_GOT_BREL12:
1530 case elfcpp::R_ARM_PLT32_ABS:
1531 case elfcpp::R_ARM_TLS_GD32:
1532 case elfcpp::R_ARM_TLS_LDM32:
1533 case elfcpp::R_ARM_TLS_IE32:
1534 case elfcpp::R_ARM_TLS_IE12GP:
1536 // These relocate types may use PLT entries.
1537 case elfcpp::R_ARM_CALL:
1538 case elfcpp::R_ARM_THM_CALL:
1539 case elfcpp::R_ARM_JUMP24:
1540 case elfcpp::R_ARM_THM_JUMP24:
1541 case elfcpp::R_ARM_THM_JUMP19:
1542 case elfcpp::R_ARM_PLT32:
1543 case elfcpp::R_ARM_THM_XPC22:
1544 return false;
1546 default:
1547 return true;
1552 // A class which returns the size required for a relocation type,
1553 // used while scanning relocs during a relocatable link.
1554 class Relocatable_size_for_reloc
1556 public:
1557 unsigned int
1558 get_size_for_reloc(unsigned int, Relobj*);
1561 // Get the GOT section, creating it if necessary.
1562 Output_data_got<32, big_endian>*
1563 got_section(Symbol_table*, Layout*);
1565 // Get the GOT PLT section.
1566 Output_data_space*
1567 got_plt_section() const
1569 gold_assert(this->got_plt_ != NULL);
1570 return this->got_plt_;
1573 // Create a PLT entry for a global symbol.
1574 void
1575 make_plt_entry(Symbol_table*, Layout*, Symbol*);
1577 // Get the PLT section.
1578 const Output_data_plt_arm<big_endian>*
1579 plt_section() const
1581 gold_assert(this->plt_ != NULL);
1582 return this->plt_;
1585 // Get the dynamic reloc section, creating it if necessary.
1586 Reloc_section*
1587 rel_dyn_section(Layout*);
1589 // Return true if the symbol may need a COPY relocation.
1590 // References from an executable object to non-function symbols
1591 // defined in a dynamic object may need a COPY relocation.
1592 bool
1593 may_need_copy_reloc(Symbol* gsym)
1595 return (gsym->type() != elfcpp::STT_ARM_TFUNC
1596 && gsym->may_need_copy_reloc());
1599 // Add a potential copy relocation.
1600 void
1601 copy_reloc(Symbol_table* symtab, Layout* layout,
1602 Sized_relobj<32, big_endian>* object,
1603 unsigned int shndx, Output_section* output_section,
1604 Symbol* sym, const elfcpp::Rel<32, big_endian>& reloc)
1606 this->copy_relocs_.copy_reloc(symtab, layout,
1607 symtab->get_sized_symbol<32>(sym),
1608 object, shndx, output_section, reloc,
1609 this->rel_dyn_section(layout));
1612 // Whether two EABI versions are compatible.
1613 static bool
1614 are_eabi_versions_compatible(elfcpp::Elf_Word v1, elfcpp::Elf_Word v2);
1616 // Merge processor-specific flags from input object and those in the ELF
1617 // header of the output.
1618 void
1619 merge_processor_specific_flags(const std::string&, elfcpp::Elf_Word);
1621 // Get the secondary compatible architecture.
1622 static int
1623 get_secondary_compatible_arch(const Attributes_section_data*);
1625 // Set the secondary compatible architecture.
1626 static void
1627 set_secondary_compatible_arch(Attributes_section_data*, int);
1629 static int
1630 tag_cpu_arch_combine(const char*, int, int*, int, int);
1632 // Helper to print AEABI enum tag value.
1633 static std::string
1634 aeabi_enum_name(unsigned int);
1636 // Return string value for TAG_CPU_name.
1637 static std::string
1638 tag_cpu_name_value(unsigned int);
1640 // Merge object attributes from input object and those in the output.
1641 void
1642 merge_object_attributes(const char*, const Attributes_section_data*);
1644 // Helper to get an AEABI object attribute
1645 Object_attribute*
1646 get_aeabi_object_attribute(int tag) const
1648 Attributes_section_data* pasd = this->attributes_section_data_;
1649 gold_assert(pasd != NULL);
1650 Object_attribute* attr =
1651 pasd->get_attribute(Object_attribute::OBJ_ATTR_PROC, tag);
1652 gold_assert(attr != NULL);
1653 return attr;
1657 // Methods to support stub-generations.
1660 // Group input sections for stub generation.
1661 void
1662 group_sections(Layout*, section_size_type, bool);
1664 // Scan a relocation for stub generation.
1665 void
1666 scan_reloc_for_stub(const Relocate_info<32, big_endian>*, unsigned int,
1667 const Sized_symbol<32>*, unsigned int,
1668 const Symbol_value<32>*,
1669 elfcpp::Elf_types<32>::Elf_Swxword, Arm_address);
1671 // Scan a relocation section for stub.
1672 template<int sh_type>
1673 void
1674 scan_reloc_section_for_stubs(
1675 const Relocate_info<32, big_endian>* relinfo,
1676 const unsigned char* prelocs,
1677 size_t reloc_count,
1678 Output_section* output_section,
1679 bool needs_special_offset_handling,
1680 const unsigned char* view,
1681 elfcpp::Elf_types<32>::Elf_Addr view_address,
1682 section_size_type);
1684 // Information about this specific target which we pass to the
1685 // general Target structure.
1686 static const Target::Target_info arm_info;
1688 // The types of GOT entries needed for this platform.
1689 enum Got_type
1691 GOT_TYPE_STANDARD = 0 // GOT entry for a regular symbol
1694 typedef typename std::vector<Stub_table<big_endian>*> Stub_table_list;
1696 // Map input section to Arm_input_section.
1697 typedef Unordered_map<Input_section_specifier,
1698 Arm_input_section<big_endian>*,
1699 Input_section_specifier::hash,
1700 Input_section_specifier::equal_to>
1701 Arm_input_section_map;
1703 // The GOT section.
1704 Output_data_got<32, big_endian>* got_;
1705 // The PLT section.
1706 Output_data_plt_arm<big_endian>* plt_;
1707 // The GOT PLT section.
1708 Output_data_space* got_plt_;
1709 // The dynamic reloc section.
1710 Reloc_section* rel_dyn_;
1711 // Relocs saved to avoid a COPY reloc.
1712 Copy_relocs<elfcpp::SHT_REL, 32, big_endian> copy_relocs_;
1713 // Space for variables copied with a COPY reloc.
1714 Output_data_space* dynbss_;
1715 // Vector of Stub_tables created.
1716 Stub_table_list stub_tables_;
1717 // Stub factory.
1718 const Stub_factory &stub_factory_;
1719 // Whether we can use BLX.
1720 bool may_use_blx_;
1721 // Whether we force PIC branch veneers.
1722 bool should_force_pic_veneer_;
1723 // Map for locating Arm_input_sections.
1724 Arm_input_section_map arm_input_section_map_;
1725 // Attributes section data in output.
1726 Attributes_section_data* attributes_section_data_;
1729 template<bool big_endian>
1730 const Target::Target_info Target_arm<big_endian>::arm_info =
1732 32, // size
1733 big_endian, // is_big_endian
1734 elfcpp::EM_ARM, // machine_code
1735 false, // has_make_symbol
1736 false, // has_resolve
1737 false, // has_code_fill
1738 true, // is_default_stack_executable
1739 '\0', // wrap_char
1740 "/usr/lib/libc.so.1", // dynamic_linker
1741 0x8000, // default_text_segment_address
1742 0x1000, // abi_pagesize (overridable by -z max-page-size)
1743 0x1000, // common_pagesize (overridable by -z common-page-size)
1744 elfcpp::SHN_UNDEF, // small_common_shndx
1745 elfcpp::SHN_UNDEF, // large_common_shndx
1746 0, // small_common_section_flags
1747 0, // large_common_section_flags
1748 ".ARM.attributes", // attributes_section
1749 "aeabi" // attributes_vendor
1752 // Arm relocate functions class
1755 template<bool big_endian>
1756 class Arm_relocate_functions : public Relocate_functions<32, big_endian>
1758 public:
1759 typedef enum
1761 STATUS_OKAY, // No error during relocation.
1762 STATUS_OVERFLOW, // Relocation oveflow.
1763 STATUS_BAD_RELOC // Relocation cannot be applied.
1764 } Status;
1766 private:
1767 typedef Relocate_functions<32, big_endian> Base;
1768 typedef Arm_relocate_functions<big_endian> This;
1770 // Encoding of imm16 argument for movt and movw ARM instructions
1771 // from ARM ARM:
1773 // imm16 := imm4 | imm12
1775 // 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
1776 // +-------+---------------+-------+-------+-----------------------+
1777 // | | |imm4 | |imm12 |
1778 // +-------+---------------+-------+-------+-----------------------+
1780 // Extract the relocation addend from VAL based on the ARM
1781 // instruction encoding described above.
1782 static inline typename elfcpp::Swap<32, big_endian>::Valtype
1783 extract_arm_movw_movt_addend(
1784 typename elfcpp::Swap<32, big_endian>::Valtype val)
1786 // According to the Elf ABI for ARM Architecture the immediate
1787 // field is sign-extended to form the addend.
1788 return utils::sign_extend<16>(((val >> 4) & 0xf000) | (val & 0xfff));
1791 // Insert X into VAL based on the ARM instruction encoding described
1792 // above.
1793 static inline typename elfcpp::Swap<32, big_endian>::Valtype
1794 insert_val_arm_movw_movt(
1795 typename elfcpp::Swap<32, big_endian>::Valtype val,
1796 typename elfcpp::Swap<32, big_endian>::Valtype x)
1798 val &= 0xfff0f000;
1799 val |= x & 0x0fff;
1800 val |= (x & 0xf000) << 4;
1801 return val;
1804 // Encoding of imm16 argument for movt and movw Thumb2 instructions
1805 // from ARM ARM:
1807 // imm16 := imm4 | i | imm3 | imm8
1809 // 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
1810 // +---------+-+-----------+-------++-+-----+-------+---------------+
1811 // | |i| |imm4 || |imm3 | |imm8 |
1812 // +---------+-+-----------+-------++-+-----+-------+---------------+
1814 // Extract the relocation addend from VAL based on the Thumb2
1815 // instruction encoding described above.
1816 static inline typename elfcpp::Swap<32, big_endian>::Valtype
1817 extract_thumb_movw_movt_addend(
1818 typename elfcpp::Swap<32, big_endian>::Valtype val)
1820 // According to the Elf ABI for ARM Architecture the immediate
1821 // field is sign-extended to form the addend.
1822 return utils::sign_extend<16>(((val >> 4) & 0xf000)
1823 | ((val >> 15) & 0x0800)
1824 | ((val >> 4) & 0x0700)
1825 | (val & 0x00ff));
1828 // Insert X into VAL based on the Thumb2 instruction encoding
1829 // described above.
1830 static inline typename elfcpp::Swap<32, big_endian>::Valtype
1831 insert_val_thumb_movw_movt(
1832 typename elfcpp::Swap<32, big_endian>::Valtype val,
1833 typename elfcpp::Swap<32, big_endian>::Valtype x)
1835 val &= 0xfbf08f00;
1836 val |= (x & 0xf000) << 4;
1837 val |= (x & 0x0800) << 15;
1838 val |= (x & 0x0700) << 4;
1839 val |= (x & 0x00ff);
1840 return val;
1843 // Handle ARM long branches.
1844 static typename This::Status
1845 arm_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
1846 unsigned char *, const Sized_symbol<32>*,
1847 const Arm_relobj<big_endian>*, unsigned int,
1848 const Symbol_value<32>*, Arm_address, Arm_address, bool);
1850 // Handle THUMB long branches.
1851 static typename This::Status
1852 thumb_branch_common(unsigned int, const Relocate_info<32, big_endian>*,
1853 unsigned char *, const Sized_symbol<32>*,
1854 const Arm_relobj<big_endian>*, unsigned int,
1855 const Symbol_value<32>*, Arm_address, Arm_address, bool);
1857 public:
1859 // R_ARM_ABS8: S + A
1860 static inline typename This::Status
1861 abs8(unsigned char *view,
1862 const Sized_relobj<32, big_endian>* object,
1863 const Symbol_value<32>* psymval)
1865 typedef typename elfcpp::Swap<8, big_endian>::Valtype Valtype;
1866 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
1867 Valtype* wv = reinterpret_cast<Valtype*>(view);
1868 Valtype val = elfcpp::Swap<8, big_endian>::readval(wv);
1869 Reltype addend = utils::sign_extend<8>(val);
1870 Reltype x = psymval->value(object, addend);
1871 val = utils::bit_select(val, x, 0xffU);
1872 elfcpp::Swap<8, big_endian>::writeval(wv, val);
1873 return (utils::has_signed_unsigned_overflow<8>(x)
1874 ? This::STATUS_OVERFLOW
1875 : This::STATUS_OKAY);
1878 // R_ARM_THM_ABS5: S + A
1879 static inline typename This::Status
1880 thm_abs5(unsigned char *view,
1881 const Sized_relobj<32, big_endian>* object,
1882 const Symbol_value<32>* psymval)
1884 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
1885 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
1886 Valtype* wv = reinterpret_cast<Valtype*>(view);
1887 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
1888 Reltype addend = (val & 0x7e0U) >> 6;
1889 Reltype x = psymval->value(object, addend);
1890 val = utils::bit_select(val, x << 6, 0x7e0U);
1891 elfcpp::Swap<16, big_endian>::writeval(wv, val);
1892 return (utils::has_overflow<5>(x)
1893 ? This::STATUS_OVERFLOW
1894 : This::STATUS_OKAY);
1897 // R_ARM_ABS12: S + A
1898 static inline typename This::Status
1899 abs12(unsigned char *view,
1900 const Sized_relobj<32, big_endian>* object,
1901 const Symbol_value<32>* psymval)
1903 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
1904 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
1905 Valtype* wv = reinterpret_cast<Valtype*>(view);
1906 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
1907 Reltype addend = val & 0x0fffU;
1908 Reltype x = psymval->value(object, addend);
1909 val = utils::bit_select(val, x, 0x0fffU);
1910 elfcpp::Swap<32, big_endian>::writeval(wv, val);
1911 return (utils::has_overflow<12>(x)
1912 ? This::STATUS_OVERFLOW
1913 : This::STATUS_OKAY);
1916 // R_ARM_ABS16: S + A
1917 static inline typename This::Status
1918 abs16(unsigned char *view,
1919 const Sized_relobj<32, big_endian>* object,
1920 const Symbol_value<32>* psymval)
1922 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
1923 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
1924 Valtype* wv = reinterpret_cast<Valtype*>(view);
1925 Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
1926 Reltype addend = utils::sign_extend<16>(val);
1927 Reltype x = psymval->value(object, addend);
1928 val = utils::bit_select(val, x, 0xffffU);
1929 elfcpp::Swap<16, big_endian>::writeval(wv, val);
1930 return (utils::has_signed_unsigned_overflow<16>(x)
1931 ? This::STATUS_OVERFLOW
1932 : This::STATUS_OKAY);
1935 // R_ARM_ABS32: (S + A) | T
1936 static inline typename This::Status
1937 abs32(unsigned char *view,
1938 const Sized_relobj<32, big_endian>* object,
1939 const Symbol_value<32>* psymval,
1940 Arm_address thumb_bit)
1942 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
1943 Valtype* wv = reinterpret_cast<Valtype*>(view);
1944 Valtype addend = elfcpp::Swap<32, big_endian>::readval(wv);
1945 Valtype x = psymval->value(object, addend) | thumb_bit;
1946 elfcpp::Swap<32, big_endian>::writeval(wv, x);
1947 return This::STATUS_OKAY;
1950 // R_ARM_REL32: (S + A) | T - P
1951 static inline typename This::Status
1952 rel32(unsigned char *view,
1953 const Sized_relobj<32, big_endian>* object,
1954 const Symbol_value<32>* psymval,
1955 Arm_address address,
1956 Arm_address thumb_bit)
1958 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
1959 Valtype* wv = reinterpret_cast<Valtype*>(view);
1960 Valtype addend = elfcpp::Swap<32, big_endian>::readval(wv);
1961 Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
1962 elfcpp::Swap<32, big_endian>::writeval(wv, x);
1963 return This::STATUS_OKAY;
1966 // R_ARM_THM_CALL: (S + A) | T - P
1967 static inline typename This::Status
1968 thm_call(const Relocate_info<32, big_endian>* relinfo, unsigned char *view,
1969 const Sized_symbol<32>* gsym, const Arm_relobj<big_endian>* object,
1970 unsigned int r_sym, const Symbol_value<32>* psymval,
1971 Arm_address address, Arm_address thumb_bit,
1972 bool is_weakly_undefined_without_plt)
1974 return thumb_branch_common(elfcpp::R_ARM_THM_CALL, relinfo, view, gsym,
1975 object, r_sym, psymval, address, thumb_bit,
1976 is_weakly_undefined_without_plt);
1979 // R_ARM_THM_JUMP24: (S + A) | T - P
1980 static inline typename This::Status
1981 thm_jump24(const Relocate_info<32, big_endian>* relinfo, unsigned char *view,
1982 const Sized_symbol<32>* gsym, const Arm_relobj<big_endian>* object,
1983 unsigned int r_sym, const Symbol_value<32>* psymval,
1984 Arm_address address, Arm_address thumb_bit,
1985 bool is_weakly_undefined_without_plt)
1987 return thumb_branch_common(elfcpp::R_ARM_THM_JUMP24, relinfo, view, gsym,
1988 object, r_sym, psymval, address, thumb_bit,
1989 is_weakly_undefined_without_plt);
1992 // R_ARM_THM_XPC22: (S + A) | T - P
1993 static inline typename This::Status
1994 thm_xpc22(const Relocate_info<32, big_endian>* relinfo, unsigned char *view,
1995 const Sized_symbol<32>* gsym, const Arm_relobj<big_endian>* object,
1996 unsigned int r_sym, const Symbol_value<32>* psymval,
1997 Arm_address address, Arm_address thumb_bit,
1998 bool is_weakly_undefined_without_plt)
2000 return thumb_branch_common(elfcpp::R_ARM_THM_XPC22, relinfo, view, gsym,
2001 object, r_sym, psymval, address, thumb_bit,
2002 is_weakly_undefined_without_plt);
2005 // R_ARM_BASE_PREL: B(S) + A - P
2006 static inline typename This::Status
2007 base_prel(unsigned char* view,
2008 Arm_address origin,
2009 Arm_address address)
2011 Base::rel32(view, origin - address);
2012 return STATUS_OKAY;
2015 // R_ARM_BASE_ABS: B(S) + A
2016 static inline typename This::Status
2017 base_abs(unsigned char* view,
2018 Arm_address origin)
2020 Base::rel32(view, origin);
2021 return STATUS_OKAY;
2024 // R_ARM_GOT_BREL: GOT(S) + A - GOT_ORG
2025 static inline typename This::Status
2026 got_brel(unsigned char* view,
2027 typename elfcpp::Swap<32, big_endian>::Valtype got_offset)
2029 Base::rel32(view, got_offset);
2030 return This::STATUS_OKAY;
2033 // R_ARM_GOT_PREL: GOT(S) + A - P
2034 static inline typename This::Status
2035 got_prel(unsigned char *view,
2036 Arm_address got_entry,
2037 Arm_address address)
2039 Base::rel32(view, got_entry - address);
2040 return This::STATUS_OKAY;
2043 // R_ARM_PLT32: (S + A) | T - P
2044 static inline typename This::Status
2045 plt32(const Relocate_info<32, big_endian>* relinfo,
2046 unsigned char *view,
2047 const Sized_symbol<32>* gsym,
2048 const Arm_relobj<big_endian>* object,
2049 unsigned int r_sym,
2050 const Symbol_value<32>* psymval,
2051 Arm_address address,
2052 Arm_address thumb_bit,
2053 bool is_weakly_undefined_without_plt)
2055 return arm_branch_common(elfcpp::R_ARM_PLT32, relinfo, view, gsym,
2056 object, r_sym, psymval, address, thumb_bit,
2057 is_weakly_undefined_without_plt);
2060 // R_ARM_XPC25: (S + A) | T - P
2061 static inline typename This::Status
2062 xpc25(const Relocate_info<32, big_endian>* relinfo,
2063 unsigned char *view,
2064 const Sized_symbol<32>* gsym,
2065 const Arm_relobj<big_endian>* object,
2066 unsigned int r_sym,
2067 const Symbol_value<32>* psymval,
2068 Arm_address address,
2069 Arm_address thumb_bit,
2070 bool is_weakly_undefined_without_plt)
2072 return arm_branch_common(elfcpp::R_ARM_XPC25, relinfo, view, gsym,
2073 object, r_sym, psymval, address, thumb_bit,
2074 is_weakly_undefined_without_plt);
2077 // R_ARM_CALL: (S + A) | T - P
2078 static inline typename This::Status
2079 call(const Relocate_info<32, big_endian>* relinfo,
2080 unsigned char *view,
2081 const Sized_symbol<32>* gsym,
2082 const Arm_relobj<big_endian>* object,
2083 unsigned int r_sym,
2084 const Symbol_value<32>* psymval,
2085 Arm_address address,
2086 Arm_address thumb_bit,
2087 bool is_weakly_undefined_without_plt)
2089 return arm_branch_common(elfcpp::R_ARM_CALL, relinfo, view, gsym,
2090 object, r_sym, psymval, address, thumb_bit,
2091 is_weakly_undefined_without_plt);
2094 // R_ARM_JUMP24: (S + A) | T - P
2095 static inline typename This::Status
2096 jump24(const Relocate_info<32, big_endian>* relinfo,
2097 unsigned char *view,
2098 const Sized_symbol<32>* gsym,
2099 const Arm_relobj<big_endian>* object,
2100 unsigned int r_sym,
2101 const Symbol_value<32>* psymval,
2102 Arm_address address,
2103 Arm_address thumb_bit,
2104 bool is_weakly_undefined_without_plt)
2106 return arm_branch_common(elfcpp::R_ARM_JUMP24, relinfo, view, gsym,
2107 object, r_sym, psymval, address, thumb_bit,
2108 is_weakly_undefined_without_plt);
2111 // R_ARM_PREL: (S + A) | T - P
2112 static inline typename This::Status
2113 prel31(unsigned char *view,
2114 const Sized_relobj<32, big_endian>* object,
2115 const Symbol_value<32>* psymval,
2116 Arm_address address,
2117 Arm_address thumb_bit)
2119 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2120 Valtype* wv = reinterpret_cast<Valtype*>(view);
2121 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2122 Valtype addend = utils::sign_extend<31>(val);
2123 Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
2124 val = utils::bit_select(val, x, 0x7fffffffU);
2125 elfcpp::Swap<32, big_endian>::writeval(wv, val);
2126 return (utils::has_overflow<31>(x) ?
2127 This::STATUS_OVERFLOW : This::STATUS_OKAY);
2130 // R_ARM_MOVW_ABS_NC: (S + A) | T
2131 static inline typename This::Status
2132 movw_abs_nc(unsigned char *view,
2133 const Sized_relobj<32, big_endian>* object,
2134 const Symbol_value<32>* psymval,
2135 Arm_address thumb_bit)
2137 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2138 Valtype* wv = reinterpret_cast<Valtype*>(view);
2139 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2140 Valtype addend = This::extract_arm_movw_movt_addend(val);
2141 Valtype x = psymval->value(object, addend) | thumb_bit;
2142 val = This::insert_val_arm_movw_movt(val, x);
2143 elfcpp::Swap<32, big_endian>::writeval(wv, val);
2144 return This::STATUS_OKAY;
2147 // R_ARM_MOVT_ABS: S + A
2148 static inline typename This::Status
2149 movt_abs(unsigned char *view,
2150 const Sized_relobj<32, big_endian>* object,
2151 const Symbol_value<32>* psymval)
2153 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2154 Valtype* wv = reinterpret_cast<Valtype*>(view);
2155 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2156 Valtype addend = This::extract_arm_movw_movt_addend(val);
2157 Valtype x = psymval->value(object, addend) >> 16;
2158 val = This::insert_val_arm_movw_movt(val, x);
2159 elfcpp::Swap<32, big_endian>::writeval(wv, val);
2160 return This::STATUS_OKAY;
2163 // R_ARM_THM_MOVW_ABS_NC: S + A | T
2164 static inline typename This::Status
2165 thm_movw_abs_nc(unsigned char *view,
2166 const Sized_relobj<32, big_endian>* object,
2167 const Symbol_value<32>* psymval,
2168 Arm_address thumb_bit)
2170 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2171 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2172 Valtype* wv = reinterpret_cast<Valtype*>(view);
2173 Reltype val = ((elfcpp::Swap<16, big_endian>::readval(wv) << 16)
2174 | elfcpp::Swap<16, big_endian>::readval(wv + 1));
2175 Reltype addend = extract_thumb_movw_movt_addend(val);
2176 Reltype x = psymval->value(object, addend) | thumb_bit;
2177 val = This::insert_val_thumb_movw_movt(val, x);
2178 elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
2179 elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
2180 return This::STATUS_OKAY;
2183 // R_ARM_THM_MOVT_ABS: S + A
2184 static inline typename This::Status
2185 thm_movt_abs(unsigned char *view,
2186 const Sized_relobj<32, big_endian>* object,
2187 const Symbol_value<32>* psymval)
2189 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2190 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2191 Valtype* wv = reinterpret_cast<Valtype*>(view);
2192 Reltype val = ((elfcpp::Swap<16, big_endian>::readval(wv) << 16)
2193 | elfcpp::Swap<16, big_endian>::readval(wv + 1));
2194 Reltype addend = This::extract_thumb_movw_movt_addend(val);
2195 Reltype x = psymval->value(object, addend) >> 16;
2196 val = This::insert_val_thumb_movw_movt(val, x);
2197 elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
2198 elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
2199 return This::STATUS_OKAY;
2202 // R_ARM_MOVW_PREL_NC: (S + A) | T - P
2203 static inline typename This::Status
2204 movw_prel_nc(unsigned char *view,
2205 const Sized_relobj<32, big_endian>* object,
2206 const Symbol_value<32>* psymval,
2207 Arm_address address,
2208 Arm_address thumb_bit)
2210 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2211 Valtype* wv = reinterpret_cast<Valtype*>(view);
2212 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2213 Valtype addend = This::extract_arm_movw_movt_addend(val);
2214 Valtype x = (psymval->value(object, addend) | thumb_bit) - address;
2215 val = This::insert_val_arm_movw_movt(val, x);
2216 elfcpp::Swap<32, big_endian>::writeval(wv, val);
2217 return This::STATUS_OKAY;
2220 // R_ARM_MOVT_PREL: S + A - P
2221 static inline typename This::Status
2222 movt_prel(unsigned char *view,
2223 const Sized_relobj<32, big_endian>* object,
2224 const Symbol_value<32>* psymval,
2225 Arm_address address)
2227 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2228 Valtype* wv = reinterpret_cast<Valtype*>(view);
2229 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2230 Valtype addend = This::extract_arm_movw_movt_addend(val);
2231 Valtype x = (psymval->value(object, addend) - address) >> 16;
2232 val = This::insert_val_arm_movw_movt(val, x);
2233 elfcpp::Swap<32, big_endian>::writeval(wv, val);
2234 return This::STATUS_OKAY;
2237 // R_ARM_THM_MOVW_PREL_NC: (S + A) | T - P
2238 static inline typename This::Status
2239 thm_movw_prel_nc(unsigned char *view,
2240 const Sized_relobj<32, big_endian>* object,
2241 const Symbol_value<32>* psymval,
2242 Arm_address address,
2243 Arm_address thumb_bit)
2245 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2246 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2247 Valtype* wv = reinterpret_cast<Valtype*>(view);
2248 Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
2249 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
2250 Reltype addend = This::extract_thumb_movw_movt_addend(val);
2251 Reltype x = (psymval->value(object, addend) | thumb_bit) - address;
2252 val = This::insert_val_thumb_movw_movt(val, x);
2253 elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
2254 elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
2255 return This::STATUS_OKAY;
2258 // R_ARM_THM_MOVT_PREL: S + A - P
2259 static inline typename This::Status
2260 thm_movt_prel(unsigned char *view,
2261 const Sized_relobj<32, big_endian>* object,
2262 const Symbol_value<32>* psymval,
2263 Arm_address address)
2265 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2266 typedef typename elfcpp::Swap<32, big_endian>::Valtype Reltype;
2267 Valtype* wv = reinterpret_cast<Valtype*>(view);
2268 Reltype val = (elfcpp::Swap<16, big_endian>::readval(wv) << 16)
2269 | elfcpp::Swap<16, big_endian>::readval(wv + 1);
2270 Reltype addend = This::extract_thumb_movw_movt_addend(val);
2271 Reltype x = (psymval->value(object, addend) - address) >> 16;
2272 val = This::insert_val_thumb_movw_movt(val, x);
2273 elfcpp::Swap<16, big_endian>::writeval(wv, val >> 16);
2274 elfcpp::Swap<16, big_endian>::writeval(wv + 1, val & 0xffff);
2275 return This::STATUS_OKAY;
2279 // Relocate ARM long branches. This handles relocation types
2280 // R_ARM_CALL, R_ARM_JUMP24, R_ARM_PLT32 and R_ARM_XPC25.
2281 // If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
2282 // undefined and we do not use PLT in this relocation. In such a case,
2283 // the branch is converted into an NOP.
2285 template<bool big_endian>
2286 typename Arm_relocate_functions<big_endian>::Status
2287 Arm_relocate_functions<big_endian>::arm_branch_common(
2288 unsigned int r_type,
2289 const Relocate_info<32, big_endian>* relinfo,
2290 unsigned char *view,
2291 const Sized_symbol<32>* gsym,
2292 const Arm_relobj<big_endian>* object,
2293 unsigned int r_sym,
2294 const Symbol_value<32>* psymval,
2295 Arm_address address,
2296 Arm_address thumb_bit,
2297 bool is_weakly_undefined_without_plt)
2299 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
2300 Valtype* wv = reinterpret_cast<Valtype*>(view);
2301 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
2303 bool insn_is_b = (((val >> 28) & 0xf) <= 0xe)
2304 && ((val & 0x0f000000UL) == 0x0a000000UL);
2305 bool insn_is_uncond_bl = (val & 0xff000000UL) == 0xeb000000UL;
2306 bool insn_is_cond_bl = (((val >> 28) & 0xf) < 0xe)
2307 && ((val & 0x0f000000UL) == 0x0b000000UL);
2308 bool insn_is_blx = (val & 0xfe000000UL) == 0xfa000000UL;
2309 bool insn_is_any_branch = (val & 0x0e000000UL) == 0x0a000000UL;
2311 // Check that the instruction is valid.
2312 if (r_type == elfcpp::R_ARM_CALL)
2314 if (!insn_is_uncond_bl && !insn_is_blx)
2315 return This::STATUS_BAD_RELOC;
2317 else if (r_type == elfcpp::R_ARM_JUMP24)
2319 if (!insn_is_b && !insn_is_cond_bl)
2320 return This::STATUS_BAD_RELOC;
2322 else if (r_type == elfcpp::R_ARM_PLT32)
2324 if (!insn_is_any_branch)
2325 return This::STATUS_BAD_RELOC;
2327 else if (r_type == elfcpp::R_ARM_XPC25)
2329 // FIXME: AAELF document IH0044C does not say much about it other
2330 // than it being obsolete.
2331 if (!insn_is_any_branch)
2332 return This::STATUS_BAD_RELOC;
2334 else
2335 gold_unreachable();
2337 // A branch to an undefined weak symbol is turned into a jump to
2338 // the next instruction unless a PLT entry will be created.
2339 // Do the same for local undefined symbols.
2340 // The jump to the next instruction is optimized as a NOP depending
2341 // on the architecture.
2342 const Target_arm<big_endian>* arm_target =
2343 Target_arm<big_endian>::default_target();
2344 if (is_weakly_undefined_without_plt)
2346 Valtype cond = val & 0xf0000000U;
2347 if (arm_target->may_use_arm_nop())
2348 val = cond | 0x0320f000;
2349 else
2350 val = cond | 0x01a00000; // Using pre-UAL nop: mov r0, r0.
2351 elfcpp::Swap<32, big_endian>::writeval(wv, val);
2352 return This::STATUS_OKAY;
2355 Valtype addend = utils::sign_extend<26>(val << 2);
2356 Valtype branch_target = psymval->value(object, addend);
2357 int32_t branch_offset = branch_target - address;
2359 // We need a stub if the branch offset is too large or if we need
2360 // to switch mode.
2361 bool may_use_blx = arm_target->may_use_blx();
2362 Reloc_stub* stub = NULL;
2363 if ((branch_offset > ARM_MAX_FWD_BRANCH_OFFSET)
2364 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
2365 || ((thumb_bit != 0) && !(may_use_blx && r_type == elfcpp::R_ARM_CALL)))
2367 Stub_type stub_type =
2368 Reloc_stub::stub_type_for_reloc(r_type, address, branch_target,
2369 (thumb_bit != 0));
2370 if (stub_type != arm_stub_none)
2372 Stub_table<big_endian>* stub_table =
2373 object->stub_table(relinfo->data_shndx);
2374 gold_assert(stub_table != NULL);
2376 Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
2377 stub = stub_table->find_reloc_stub(stub_key);
2378 gold_assert(stub != NULL);
2379 thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
2380 branch_target = stub_table->address() + stub->offset() + addend;
2381 branch_offset = branch_target - address;
2382 gold_assert((branch_offset <= ARM_MAX_FWD_BRANCH_OFFSET)
2383 && (branch_offset >= ARM_MAX_BWD_BRANCH_OFFSET));
2387 // At this point, if we still need to switch mode, the instruction
2388 // must either be a BLX or a BL that can be converted to a BLX.
2389 if (thumb_bit != 0)
2391 // Turn BL to BLX.
2392 gold_assert(may_use_blx && r_type == elfcpp::R_ARM_CALL);
2393 val = (val & 0xffffff) | 0xfa000000 | ((branch_offset & 2) << 23);
2396 val = utils::bit_select(val, (branch_offset >> 2), 0xffffffUL);
2397 elfcpp::Swap<32, big_endian>::writeval(wv, val);
2398 return (utils::has_overflow<26>(branch_offset)
2399 ? This::STATUS_OVERFLOW : This::STATUS_OKAY);
2402 // Relocate THUMB long branches. This handles relocation types
2403 // R_ARM_THM_CALL, R_ARM_THM_JUMP24 and R_ARM_THM_XPC22.
2404 // If IS_WEAK_UNDEFINED_WITH_PLT is true. The target symbol is weakly
2405 // undefined and we do not use PLT in this relocation. In such a case,
2406 // the branch is converted into an NOP.
2408 template<bool big_endian>
2409 typename Arm_relocate_functions<big_endian>::Status
2410 Arm_relocate_functions<big_endian>::thumb_branch_common(
2411 unsigned int r_type,
2412 const Relocate_info<32, big_endian>* relinfo,
2413 unsigned char *view,
2414 const Sized_symbol<32>* gsym,
2415 const Arm_relobj<big_endian>* object,
2416 unsigned int r_sym,
2417 const Symbol_value<32>* psymval,
2418 Arm_address address,
2419 Arm_address thumb_bit,
2420 bool is_weakly_undefined_without_plt)
2422 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
2423 Valtype* wv = reinterpret_cast<Valtype*>(view);
2424 uint32_t upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
2425 uint32_t lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
2427 // FIXME: These tests are too loose and do not take THUMB/THUMB-2 difference
2428 // into account.
2429 bool is_bl_insn = (lower_insn & 0x1000U) == 0x1000U;
2430 bool is_blx_insn = (lower_insn & 0x1000U) == 0x0000U;
2432 // Check that the instruction is valid.
2433 if (r_type == elfcpp::R_ARM_THM_CALL)
2435 if (!is_bl_insn && !is_blx_insn)
2436 return This::STATUS_BAD_RELOC;
2438 else if (r_type == elfcpp::R_ARM_THM_JUMP24)
2440 // This cannot be a BLX.
2441 if (!is_bl_insn)
2442 return This::STATUS_BAD_RELOC;
2444 else if (r_type == elfcpp::R_ARM_THM_XPC22)
2446 // Check for Thumb to Thumb call.
2447 if (!is_blx_insn)
2448 return This::STATUS_BAD_RELOC;
2449 if (thumb_bit != 0)
2451 gold_warning(_("%s: Thumb BLX instruction targets "
2452 "thumb function '%s'."),
2453 object->name().c_str(),
2454 (gsym ? gsym->name() : "(local)"));
2455 // Convert BLX to BL.
2456 lower_insn |= 0x1000U;
2459 else
2460 gold_unreachable();
2462 // A branch to an undefined weak symbol is turned into a jump to
2463 // the next instruction unless a PLT entry will be created.
2464 // The jump to the next instruction is optimized as a NOP.W for
2465 // Thumb-2 enabled architectures.
2466 const Target_arm<big_endian>* arm_target =
2467 Target_arm<big_endian>::default_target();
2468 if (is_weakly_undefined_without_plt)
2470 if (arm_target->may_use_thumb2_nop())
2472 elfcpp::Swap<16, big_endian>::writeval(wv, 0xf3af);
2473 elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0x8000);
2475 else
2477 elfcpp::Swap<16, big_endian>::writeval(wv, 0xe000);
2478 elfcpp::Swap<16, big_endian>::writeval(wv + 1, 0xbf00);
2480 return This::STATUS_OKAY;
2483 // Fetch the addend. We use the Thumb-2 encoding (backwards compatible
2484 // with Thumb-1) involving the J1 and J2 bits.
2485 uint32_t s = (upper_insn & (1 << 10)) >> 10;
2486 uint32_t upper = upper_insn & 0x3ff;
2487 uint32_t lower = lower_insn & 0x7ff;
2488 uint32_t j1 = (lower_insn & (1 << 13)) >> 13;
2489 uint32_t j2 = (lower_insn & (1 << 11)) >> 11;
2490 uint32_t i1 = j1 ^ s ? 0 : 1;
2491 uint32_t i2 = j2 ^ s ? 0 : 1;
2493 int32_t addend = (i1 << 23) | (i2 << 22) | (upper << 12) | (lower << 1);
2494 // Sign extend.
2495 addend = (addend | ((s ? 0 : 1) << 24)) - (1 << 24);
2497 Arm_address branch_target = psymval->value(object, addend);
2498 int32_t branch_offset = branch_target - address;
2500 // We need a stub if the branch offset is too large or if we need
2501 // to switch mode.
2502 bool may_use_blx = arm_target->may_use_blx();
2503 bool thumb2 = arm_target->using_thumb2();
2504 if ((!thumb2
2505 && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
2506 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
2507 || (thumb2
2508 && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
2509 || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
2510 || ((thumb_bit == 0)
2511 && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
2512 || r_type == elfcpp::R_ARM_THM_JUMP24)))
2514 Stub_type stub_type =
2515 Reloc_stub::stub_type_for_reloc(r_type, address, branch_target,
2516 (thumb_bit != 0));
2517 if (stub_type != arm_stub_none)
2519 Stub_table<big_endian>* stub_table =
2520 object->stub_table(relinfo->data_shndx);
2521 gold_assert(stub_table != NULL);
2523 Reloc_stub::Key stub_key(stub_type, gsym, object, r_sym, addend);
2524 Reloc_stub* stub = stub_table->find_reloc_stub(stub_key);
2525 gold_assert(stub != NULL);
2526 thumb_bit = stub->stub_template()->entry_in_thumb_mode() ? 1 : 0;
2527 branch_target = stub_table->address() + stub->offset() + addend;
2528 branch_offset = branch_target - address;
2532 // At this point, if we still need to switch mode, the instruction
2533 // must either be a BLX or a BL that can be converted to a BLX.
2534 if (thumb_bit == 0)
2536 gold_assert(may_use_blx
2537 && (r_type == elfcpp::R_ARM_THM_CALL
2538 || r_type == elfcpp::R_ARM_THM_XPC22));
2539 // Make sure this is a BLX.
2540 lower_insn &= ~0x1000U;
2542 else
2544 // Make sure this is a BL.
2545 lower_insn |= 0x1000U;
2548 uint32_t reloc_sign = (branch_offset < 0) ? 1 : 0;
2549 uint32_t relocation = static_cast<uint32_t>(branch_offset);
2551 if ((lower_insn & 0x5000U) == 0x4000U)
2552 // For a BLX instruction, make sure that the relocation is rounded up
2553 // to a word boundary. This follows the semantics of the instruction
2554 // which specifies that bit 1 of the target address will come from bit
2555 // 1 of the base address.
2556 relocation = (relocation + 2U) & ~3U;
2558 // Put BRANCH_OFFSET back into the insn. Assumes two's complement.
2559 // We use the Thumb-2 encoding, which is safe even if dealing with
2560 // a Thumb-1 instruction by virtue of our overflow check above. */
2561 upper_insn = (upper_insn & ~0x7ffU)
2562 | ((relocation >> 12) & 0x3ffU)
2563 | (reloc_sign << 10);
2564 lower_insn = (lower_insn & ~0x2fffU)
2565 | (((!((relocation >> 23) & 1U)) ^ reloc_sign) << 13)
2566 | (((!((relocation >> 22) & 1U)) ^ reloc_sign) << 11)
2567 | ((relocation >> 1) & 0x7ffU);
2569 elfcpp::Swap<16, big_endian>::writeval(wv, upper_insn);
2570 elfcpp::Swap<16, big_endian>::writeval(wv + 1, lower_insn);
2572 return ((thumb2
2573 ? utils::has_overflow<25>(relocation)
2574 : utils::has_overflow<23>(relocation))
2575 ? This::STATUS_OVERFLOW
2576 : This::STATUS_OKAY);
2579 // Get the GOT section, creating it if necessary.
2581 template<bool big_endian>
2582 Output_data_got<32, big_endian>*
2583 Target_arm<big_endian>::got_section(Symbol_table* symtab, Layout* layout)
2585 if (this->got_ == NULL)
2587 gold_assert(symtab != NULL && layout != NULL);
2589 this->got_ = new Output_data_got<32, big_endian>();
2591 Output_section* os;
2592 os = layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
2593 (elfcpp::SHF_ALLOC
2594 | elfcpp::SHF_WRITE),
2595 this->got_, false, true, true,
2596 false);
2598 // The old GNU linker creates a .got.plt section. We just
2599 // create another set of data in the .got section. Note that we
2600 // always create a PLT if we create a GOT, although the PLT
2601 // might be empty.
2602 this->got_plt_ = new Output_data_space(4, "** GOT PLT");
2603 os = layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
2604 (elfcpp::SHF_ALLOC
2605 | elfcpp::SHF_WRITE),
2606 this->got_plt_, false, false,
2607 false, true);
2609 // The first three entries are reserved.
2610 this->got_plt_->set_current_data_size(3 * 4);
2612 // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
2613 symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
2614 Symbol_table::PREDEFINED,
2615 this->got_plt_,
2616 0, 0, elfcpp::STT_OBJECT,
2617 elfcpp::STB_LOCAL,
2618 elfcpp::STV_HIDDEN, 0,
2619 false, false);
2621 return this->got_;
2624 // Get the dynamic reloc section, creating it if necessary.
2626 template<bool big_endian>
2627 typename Target_arm<big_endian>::Reloc_section*
2628 Target_arm<big_endian>::rel_dyn_section(Layout* layout)
2630 if (this->rel_dyn_ == NULL)
2632 gold_assert(layout != NULL);
2633 this->rel_dyn_ = new Reloc_section(parameters->options().combreloc());
2634 layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
2635 elfcpp::SHF_ALLOC, this->rel_dyn_, true,
2636 false, false, false);
2638 return this->rel_dyn_;
2641 // Insn_template methods.
2643 // Return byte size of an instruction template.
2645 size_t
2646 Insn_template::size() const
2648 switch (this->type())
2650 case THUMB16_TYPE:
2651 return 2;
2652 case ARM_TYPE:
2653 case THUMB32_TYPE:
2654 case DATA_TYPE:
2655 return 4;
2656 default:
2657 gold_unreachable();
2661 // Return alignment of an instruction template.
2663 unsigned
2664 Insn_template::alignment() const
2666 switch (this->type())
2668 case THUMB16_TYPE:
2669 case THUMB32_TYPE:
2670 return 2;
2671 case ARM_TYPE:
2672 case DATA_TYPE:
2673 return 4;
2674 default:
2675 gold_unreachable();
2679 // Stub_template methods.
2681 Stub_template::Stub_template(
2682 Stub_type type, const Insn_template* insns,
2683 size_t insn_count)
2684 : type_(type), insns_(insns), insn_count_(insn_count), alignment_(1),
2685 entry_in_thumb_mode_(false), relocs_()
2687 off_t offset = 0;
2689 // Compute byte size and alignment of stub template.
2690 for (size_t i = 0; i < insn_count; i++)
2692 unsigned insn_alignment = insns[i].alignment();
2693 size_t insn_size = insns[i].size();
2694 gold_assert((offset & (insn_alignment - 1)) == 0);
2695 this->alignment_ = std::max(this->alignment_, insn_alignment);
2696 switch (insns[i].type())
2698 case Insn_template::THUMB16_TYPE:
2699 if (i == 0)
2700 this->entry_in_thumb_mode_ = true;
2701 break;
2703 case Insn_template::THUMB32_TYPE:
2704 if (insns[i].r_type() != elfcpp::R_ARM_NONE)
2705 this->relocs_.push_back(Reloc(i, offset));
2706 if (i == 0)
2707 this->entry_in_thumb_mode_ = true;
2708 break;
2710 case Insn_template::ARM_TYPE:
2711 // Handle cases where the target is encoded within the
2712 // instruction.
2713 if (insns[i].r_type() == elfcpp::R_ARM_JUMP24)
2714 this->relocs_.push_back(Reloc(i, offset));
2715 break;
2717 case Insn_template::DATA_TYPE:
2718 // Entry point cannot be data.
2719 gold_assert(i != 0);
2720 this->relocs_.push_back(Reloc(i, offset));
2721 break;
2723 default:
2724 gold_unreachable();
2726 offset += insn_size;
2728 this->size_ = offset;
2731 // Reloc_stub::Key methods.
2733 // Dump a Key as a string for debugging.
2735 std::string
2736 Reloc_stub::Key::name() const
2738 if (this->r_sym_ == invalid_index)
2740 // Global symbol key name
2741 // <stub-type>:<symbol name>:<addend>.
2742 const std::string sym_name = this->u_.symbol->name();
2743 // We need to print two hex number and two colons. So just add 100 bytes
2744 // to the symbol name size.
2745 size_t len = sym_name.size() + 100;
2746 char* buffer = new char[len];
2747 int c = snprintf(buffer, len, "%d:%s:%x", this->stub_type_,
2748 sym_name.c_str(), this->addend_);
2749 gold_assert(c > 0 && c < static_cast<int>(len));
2750 delete[] buffer;
2751 return std::string(buffer);
2753 else
2755 // local symbol key name
2756 // <stub-type>:<object>:<r_sym>:<addend>.
2757 const size_t len = 200;
2758 char buffer[len];
2759 int c = snprintf(buffer, len, "%d:%p:%u:%x", this->stub_type_,
2760 this->u_.relobj, this->r_sym_, this->addend_);
2761 gold_assert(c > 0 && c < static_cast<int>(len));
2762 return std::string(buffer);
2766 // Reloc_stub methods.
2768 // Determine the type of stub needed, if any, for a relocation of R_TYPE at
2769 // LOCATION to DESTINATION.
2770 // This code is based on the arm_type_of_stub function in
2771 // bfd/elf32-arm.c. We have changed the interface a liitle to keep the Stub
2772 // class simple.
2774 Stub_type
2775 Reloc_stub::stub_type_for_reloc(
2776 unsigned int r_type,
2777 Arm_address location,
2778 Arm_address destination,
2779 bool target_is_thumb)
2781 Stub_type stub_type = arm_stub_none;
2783 // This is a bit ugly but we want to avoid using a templated class for
2784 // big and little endianities.
2785 bool may_use_blx;
2786 bool should_force_pic_veneer;
2787 bool thumb2;
2788 bool thumb_only;
2789 if (parameters->target().is_big_endian())
2791 const Target_arm<true>* big_endian_target =
2792 Target_arm<true>::default_target();
2793 may_use_blx = big_endian_target->may_use_blx();
2794 should_force_pic_veneer = big_endian_target->should_force_pic_veneer();
2795 thumb2 = big_endian_target->using_thumb2();
2796 thumb_only = big_endian_target->using_thumb_only();
2798 else
2800 const Target_arm<false>* little_endian_target =
2801 Target_arm<false>::default_target();
2802 may_use_blx = little_endian_target->may_use_blx();
2803 should_force_pic_veneer = little_endian_target->should_force_pic_veneer();
2804 thumb2 = little_endian_target->using_thumb2();
2805 thumb_only = little_endian_target->using_thumb_only();
2808 int64_t branch_offset = (int64_t)destination - location;
2810 if (r_type == elfcpp::R_ARM_THM_CALL || r_type == elfcpp::R_ARM_THM_JUMP24)
2812 // Handle cases where:
2813 // - this call goes too far (different Thumb/Thumb2 max
2814 // distance)
2815 // - it's a Thumb->Arm call and blx is not available, or it's a
2816 // Thumb->Arm branch (not bl). A stub is needed in this case.
2817 if ((!thumb2
2818 && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
2819 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
2820 || (thumb2
2821 && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
2822 || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
2823 || ((!target_is_thumb)
2824 && (((r_type == elfcpp::R_ARM_THM_CALL) && !may_use_blx)
2825 || (r_type == elfcpp::R_ARM_THM_JUMP24))))
2827 if (target_is_thumb)
2829 // Thumb to thumb.
2830 if (!thumb_only)
2832 stub_type = (parameters->options().shared()
2833 || should_force_pic_veneer)
2834 // PIC stubs.
2835 ? ((may_use_blx
2836 && (r_type == elfcpp::R_ARM_THM_CALL))
2837 // V5T and above. Stub starts with ARM code, so
2838 // we must be able to switch mode before
2839 // reaching it, which is only possible for 'bl'
2840 // (ie R_ARM_THM_CALL relocation).
2841 ? arm_stub_long_branch_any_thumb_pic
2842 // On V4T, use Thumb code only.
2843 : arm_stub_long_branch_v4t_thumb_thumb_pic)
2845 // non-PIC stubs.
2846 : ((may_use_blx
2847 && (r_type == elfcpp::R_ARM_THM_CALL))
2848 ? arm_stub_long_branch_any_any // V5T and above.
2849 : arm_stub_long_branch_v4t_thumb_thumb); // V4T.
2851 else
2853 stub_type = (parameters->options().shared()
2854 || should_force_pic_veneer)
2855 ? arm_stub_long_branch_thumb_only_pic // PIC stub.
2856 : arm_stub_long_branch_thumb_only; // non-PIC stub.
2859 else
2861 // Thumb to arm.
2863 // FIXME: We should check that the input section is from an
2864 // object that has interwork enabled.
2866 stub_type = (parameters->options().shared()
2867 || should_force_pic_veneer)
2868 // PIC stubs.
2869 ? ((may_use_blx
2870 && (r_type == elfcpp::R_ARM_THM_CALL))
2871 ? arm_stub_long_branch_any_arm_pic // V5T and above.
2872 : arm_stub_long_branch_v4t_thumb_arm_pic) // V4T.
2874 // non-PIC stubs.
2875 : ((may_use_blx
2876 && (r_type == elfcpp::R_ARM_THM_CALL))
2877 ? arm_stub_long_branch_any_any // V5T and above.
2878 : arm_stub_long_branch_v4t_thumb_arm); // V4T.
2880 // Handle v4t short branches.
2881 if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
2882 && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
2883 && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
2884 stub_type = arm_stub_short_branch_v4t_thumb_arm;
2888 else if (r_type == elfcpp::R_ARM_CALL
2889 || r_type == elfcpp::R_ARM_JUMP24
2890 || r_type == elfcpp::R_ARM_PLT32)
2892 if (target_is_thumb)
2894 // Arm to thumb.
2896 // FIXME: We should check that the input section is from an
2897 // object that has interwork enabled.
2899 // We have an extra 2-bytes reach because of
2900 // the mode change (bit 24 (H) of BLX encoding).
2901 if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
2902 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
2903 || ((r_type == elfcpp::R_ARM_CALL) && !may_use_blx)
2904 || (r_type == elfcpp::R_ARM_JUMP24)
2905 || (r_type == elfcpp::R_ARM_PLT32))
2907 stub_type = (parameters->options().shared()
2908 || should_force_pic_veneer)
2909 // PIC stubs.
2910 ? (may_use_blx
2911 ? arm_stub_long_branch_any_thumb_pic// V5T and above.
2912 : arm_stub_long_branch_v4t_arm_thumb_pic) // V4T stub.
2914 // non-PIC stubs.
2915 : (may_use_blx
2916 ? arm_stub_long_branch_any_any // V5T and above.
2917 : arm_stub_long_branch_v4t_arm_thumb); // V4T.
2920 else
2922 // Arm to arm.
2923 if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
2924 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
2926 stub_type = (parameters->options().shared()
2927 || should_force_pic_veneer)
2928 ? arm_stub_long_branch_any_arm_pic // PIC stubs.
2929 : arm_stub_long_branch_any_any; /// non-PIC.
2934 return stub_type;
2937 // Template to implement do_write for a specific target endianity.
2939 template<bool big_endian>
2940 void inline
2941 Reloc_stub::do_fixed_endian_write(unsigned char* view,
2942 section_size_type view_size)
2944 const Stub_template* stub_template = this->stub_template();
2945 const Insn_template* insns = stub_template->insns();
2947 // FIXME: We do not handle BE8 encoding yet.
2948 unsigned char* pov = view;
2949 for (size_t i = 0; i < stub_template->insn_count(); i++)
2951 switch (insns[i].type())
2953 case Insn_template::THUMB16_TYPE:
2954 // Non-zero reloc addends are only used in Cortex-A8 stubs.
2955 gold_assert(insns[i].reloc_addend() == 0);
2956 elfcpp::Swap<16, big_endian>::writeval(pov, insns[i].data() & 0xffff);
2957 break;
2958 case Insn_template::THUMB32_TYPE:
2960 uint32_t hi = (insns[i].data() >> 16) & 0xffff;
2961 uint32_t lo = insns[i].data() & 0xffff;
2962 elfcpp::Swap<16, big_endian>::writeval(pov, hi);
2963 elfcpp::Swap<16, big_endian>::writeval(pov + 2, lo);
2965 break;
2966 case Insn_template::ARM_TYPE:
2967 case Insn_template::DATA_TYPE:
2968 elfcpp::Swap<32, big_endian>::writeval(pov, insns[i].data());
2969 break;
2970 default:
2971 gold_unreachable();
2973 pov += insns[i].size();
2975 gold_assert(static_cast<section_size_type>(pov - view) == view_size);
2978 // Write a reloc stub to VIEW with endianity specified by BIG_ENDIAN.
2980 void
2981 Reloc_stub::do_write(unsigned char* view, section_size_type view_size,
2982 bool big_endian)
2984 if (big_endian)
2985 this->do_fixed_endian_write<true>(view, view_size);
2986 else
2987 this->do_fixed_endian_write<false>(view, view_size);
2990 // Stub_factory methods.
2992 Stub_factory::Stub_factory()
2994 // The instruction template sequences are declared as static
2995 // objects and initialized first time the constructor runs.
2997 // Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
2998 // to reach the stub if necessary.
2999 static const Insn_template elf32_arm_stub_long_branch_any_any[] =
3001 Insn_template::arm_insn(0xe51ff004), // ldr pc, [pc, #-4]
3002 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
3003 // dcd R_ARM_ABS32(X)
3006 // V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
3007 // available.
3008 static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb[] =
3010 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
3011 Insn_template::arm_insn(0xe12fff1c), // bx ip
3012 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
3013 // dcd R_ARM_ABS32(X)
3016 // Thumb -> Thumb long branch stub. Used on M-profile architectures.
3017 static const Insn_template elf32_arm_stub_long_branch_thumb_only[] =
3019 Insn_template::thumb16_insn(0xb401), // push {r0}
3020 Insn_template::thumb16_insn(0x4802), // ldr r0, [pc, #8]
3021 Insn_template::thumb16_insn(0x4684), // mov ip, r0
3022 Insn_template::thumb16_insn(0xbc01), // pop {r0}
3023 Insn_template::thumb16_insn(0x4760), // bx ip
3024 Insn_template::thumb16_insn(0xbf00), // nop
3025 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
3026 // dcd R_ARM_ABS32(X)
3029 // V4T Thumb -> Thumb long branch stub. Using the stack is not
3030 // allowed.
3031 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb[] =
3033 Insn_template::thumb16_insn(0x4778), // bx pc
3034 Insn_template::thumb16_insn(0x46c0), // nop
3035 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
3036 Insn_template::arm_insn(0xe12fff1c), // bx ip
3037 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
3038 // dcd R_ARM_ABS32(X)
3041 // V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
3042 // available.
3043 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm[] =
3045 Insn_template::thumb16_insn(0x4778), // bx pc
3046 Insn_template::thumb16_insn(0x46c0), // nop
3047 Insn_template::arm_insn(0xe51ff004), // ldr pc, [pc, #-4]
3048 Insn_template::data_word(0, elfcpp::R_ARM_ABS32, 0),
3049 // dcd R_ARM_ABS32(X)
3052 // V4T Thumb -> ARM short branch stub. Shorter variant of the above
3053 // one, when the destination is close enough.
3054 static const Insn_template elf32_arm_stub_short_branch_v4t_thumb_arm[] =
3056 Insn_template::thumb16_insn(0x4778), // bx pc
3057 Insn_template::thumb16_insn(0x46c0), // nop
3058 Insn_template::arm_rel_insn(0xea000000, -8), // b (X-8)
3061 // ARM/Thumb -> ARM long branch stub, PIC. On V5T and above, use
3062 // blx to reach the stub if necessary.
3063 static const Insn_template elf32_arm_stub_long_branch_any_arm_pic[] =
3065 Insn_template::arm_insn(0xe59fc000), // ldr r12, [pc]
3066 Insn_template::arm_insn(0xe08ff00c), // add pc, pc, ip
3067 Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
3068 // dcd R_ARM_REL32(X-4)
3071 // ARM/Thumb -> Thumb long branch stub, PIC. On V5T and above, use
3072 // blx to reach the stub if necessary. We can not add into pc;
3073 // it is not guaranteed to mode switch (different in ARMv6 and
3074 // ARMv7).
3075 static const Insn_template elf32_arm_stub_long_branch_any_thumb_pic[] =
3077 Insn_template::arm_insn(0xe59fc004), // ldr r12, [pc, #4]
3078 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
3079 Insn_template::arm_insn(0xe12fff1c), // bx ip
3080 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
3081 // dcd R_ARM_REL32(X)
3084 // V4T ARM -> ARM long branch stub, PIC.
3085 static const Insn_template elf32_arm_stub_long_branch_v4t_arm_thumb_pic[] =
3087 Insn_template::arm_insn(0xe59fc004), // ldr ip, [pc, #4]
3088 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
3089 Insn_template::arm_insn(0xe12fff1c), // bx ip
3090 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
3091 // dcd R_ARM_REL32(X)
3094 // V4T Thumb -> ARM long branch stub, PIC.
3095 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_arm_pic[] =
3097 Insn_template::thumb16_insn(0x4778), // bx pc
3098 Insn_template::thumb16_insn(0x46c0), // nop
3099 Insn_template::arm_insn(0xe59fc000), // ldr ip, [pc, #0]
3100 Insn_template::arm_insn(0xe08cf00f), // add pc, ip, pc
3101 Insn_template::data_word(0, elfcpp::R_ARM_REL32, -4),
3102 // dcd R_ARM_REL32(X)
3105 // Thumb -> Thumb long branch stub, PIC. Used on M-profile
3106 // architectures.
3107 static const Insn_template elf32_arm_stub_long_branch_thumb_only_pic[] =
3109 Insn_template::thumb16_insn(0xb401), // push {r0}
3110 Insn_template::thumb16_insn(0x4802), // ldr r0, [pc, #8]
3111 Insn_template::thumb16_insn(0x46fc), // mov ip, pc
3112 Insn_template::thumb16_insn(0x4484), // add ip, r0
3113 Insn_template::thumb16_insn(0xbc01), // pop {r0}
3114 Insn_template::thumb16_insn(0x4760), // bx ip
3115 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 4),
3116 // dcd R_ARM_REL32(X)
3119 // V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
3120 // allowed.
3121 static const Insn_template elf32_arm_stub_long_branch_v4t_thumb_thumb_pic[] =
3123 Insn_template::thumb16_insn(0x4778), // bx pc
3124 Insn_template::thumb16_insn(0x46c0), // nop
3125 Insn_template::arm_insn(0xe59fc004), // ldr ip, [pc, #4]
3126 Insn_template::arm_insn(0xe08fc00c), // add ip, pc, ip
3127 Insn_template::arm_insn(0xe12fff1c), // bx ip
3128 Insn_template::data_word(0, elfcpp::R_ARM_REL32, 0),
3129 // dcd R_ARM_REL32(X)
3132 // Cortex-A8 erratum-workaround stubs.
3134 // Stub used for conditional branches (which may be beyond +/-1MB away,
3135 // so we can't use a conditional branch to reach this stub).
3137 // original code:
3139 // b<cond> X
3140 // after:
3142 static const Insn_template elf32_arm_stub_a8_veneer_b_cond[] =
3144 Insn_template::thumb16_bcond_insn(0xd001), // b<cond>.n true
3145 Insn_template::thumb32_b_insn(0xf000b800, -4), // b.w after
3146 Insn_template::thumb32_b_insn(0xf000b800, -4) // true:
3147 // b.w X
3150 // Stub used for b.w and bl.w instructions.
3152 static const Insn_template elf32_arm_stub_a8_veneer_b[] =
3154 Insn_template::thumb32_b_insn(0xf000b800, -4) // b.w dest
3157 static const Insn_template elf32_arm_stub_a8_veneer_bl[] =
3159 Insn_template::thumb32_b_insn(0xf000b800, -4) // b.w dest
3162 // Stub used for Thumb-2 blx.w instructions. We modified the original blx.w
3163 // instruction (which switches to ARM mode) to point to this stub. Jump to
3164 // the real destination using an ARM-mode branch.
3165 const Insn_template elf32_arm_stub_a8_veneer_blx[] =
3167 Insn_template::arm_rel_insn(0xea000000, -8) // b dest
3170 // Fill in the stub template look-up table. Stub templates are constructed
3171 // per instance of Stub_factory for fast look-up without locking
3172 // in a thread-enabled environment.
3174 this->stub_templates_[arm_stub_none] =
3175 new Stub_template(arm_stub_none, NULL, 0);
3177 #define DEF_STUB(x) \
3178 do \
3180 size_t array_size \
3181 = sizeof(elf32_arm_stub_##x) / sizeof(elf32_arm_stub_##x[0]); \
3182 Stub_type type = arm_stub_##x; \
3183 this->stub_templates_[type] = \
3184 new Stub_template(type, elf32_arm_stub_##x, array_size); \
3186 while (0);
3188 DEF_STUBS
3189 #undef DEF_STUB
3192 // Stub_table methods.
3194 // Add a STUB with using KEY. Caller is reponsible for avoid adding
3195 // if already a STUB with the same key has been added.
3197 template<bool big_endian>
3198 void
3199 Stub_table<big_endian>::add_reloc_stub(
3200 Reloc_stub* stub,
3201 const Reloc_stub::Key& key)
3203 const Stub_template* stub_template = stub->stub_template();
3204 gold_assert(stub_template->type() == key.stub_type());
3205 this->reloc_stubs_[key] = stub;
3206 if (this->addralign_ < stub_template->alignment())
3207 this->addralign_ = stub_template->alignment();
3208 this->has_been_changed_ = true;
3211 template<bool big_endian>
3212 void
3213 Stub_table<big_endian>::relocate_stubs(
3214 const Relocate_info<32, big_endian>* relinfo,
3215 Target_arm<big_endian>* arm_target,
3216 Output_section* output_section,
3217 unsigned char* view,
3218 Arm_address address,
3219 section_size_type view_size)
3221 // If we are passed a view bigger than the stub table's. we need to
3222 // adjust the view.
3223 gold_assert(address == this->address()
3224 && (view_size
3225 == static_cast<section_size_type>(this->data_size())));
3227 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
3228 p != this->reloc_stubs_.end();
3229 ++p)
3231 Reloc_stub* stub = p->second;
3232 const Stub_template* stub_template = stub->stub_template();
3233 if (stub_template->reloc_count() != 0)
3235 // Adjust view to cover the stub only.
3236 section_size_type offset = stub->offset();
3237 section_size_type stub_size = stub_template->size();
3238 gold_assert(offset + stub_size <= view_size);
3240 arm_target->relocate_stub(stub, relinfo, output_section,
3241 view + offset, address + offset,
3242 stub_size);
3247 // Reset address and file offset.
3249 template<bool big_endian>
3250 void
3251 Stub_table<big_endian>::do_reset_address_and_file_offset()
3253 off_t off = 0;
3254 uint64_t max_addralign = 1;
3255 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
3256 p != this->reloc_stubs_.end();
3257 ++p)
3259 Reloc_stub* stub = p->second;
3260 const Stub_template* stub_template = stub->stub_template();
3261 uint64_t stub_addralign = stub_template->alignment();
3262 max_addralign = std::max(max_addralign, stub_addralign);
3263 off = align_address(off, stub_addralign);
3264 stub->set_offset(off);
3265 stub->reset_destination_address();
3266 off += stub_template->size();
3269 this->addralign_ = max_addralign;
3270 this->set_current_data_size_for_child(off);
3273 // Write out the stubs to file.
3275 template<bool big_endian>
3276 void
3277 Stub_table<big_endian>::do_write(Output_file* of)
3279 off_t offset = this->offset();
3280 const section_size_type oview_size =
3281 convert_to_section_size_type(this->data_size());
3282 unsigned char* const oview = of->get_output_view(offset, oview_size);
3284 for (typename Reloc_stub_map::const_iterator p = this->reloc_stubs_.begin();
3285 p != this->reloc_stubs_.end();
3286 ++p)
3288 Reloc_stub* stub = p->second;
3289 Arm_address address = this->address() + stub->offset();
3290 gold_assert(address
3291 == align_address(address,
3292 stub->stub_template()->alignment()));
3293 stub->write(oview + stub->offset(), stub->stub_template()->size(),
3294 big_endian);
3296 of->write_output_view(this->offset(), oview_size, oview);
3299 // Arm_input_section methods.
3301 // Initialize an Arm_input_section.
3303 template<bool big_endian>
3304 void
3305 Arm_input_section<big_endian>::init()
3307 Relobj* relobj = this->relobj();
3308 unsigned int shndx = this->shndx();
3310 // Cache these to speed up size and alignment queries. It is too slow
3311 // to call section_addraglin and section_size every time.
3312 this->original_addralign_ = relobj->section_addralign(shndx);
3313 this->original_size_ = relobj->section_size(shndx);
3315 // We want to make this look like the original input section after
3316 // output sections are finalized.
3317 Output_section* os = relobj->output_section(shndx);
3318 off_t offset = relobj->output_section_offset(shndx);
3319 gold_assert(os != NULL && !relobj->is_output_section_offset_invalid(shndx));
3320 this->set_address(os->address() + offset);
3321 this->set_file_offset(os->offset() + offset);
3323 this->set_current_data_size(this->original_size_);
3324 this->finalize_data_size();
3327 template<bool big_endian>
3328 void
3329 Arm_input_section<big_endian>::do_write(Output_file* of)
3331 // We have to write out the original section content.
3332 section_size_type section_size;
3333 const unsigned char* section_contents =
3334 this->relobj()->section_contents(this->shndx(), &section_size, false);
3335 of->write(this->offset(), section_contents, section_size);
3337 // If this owns a stub table and it is not empty, write it.
3338 if (this->is_stub_table_owner() && !this->stub_table_->empty())
3339 this->stub_table_->write(of);
3342 // Finalize data size.
3344 template<bool big_endian>
3345 void
3346 Arm_input_section<big_endian>::set_final_data_size()
3348 // If this owns a stub table, finalize its data size as well.
3349 if (this->is_stub_table_owner())
3351 uint64_t address = this->address();
3353 // The stub table comes after the original section contents.
3354 address += this->original_size_;
3355 address = align_address(address, this->stub_table_->addralign());
3356 off_t offset = this->offset() + (address - this->address());
3357 this->stub_table_->set_address_and_file_offset(address, offset);
3358 address += this->stub_table_->data_size();
3359 gold_assert(address == this->address() + this->current_data_size());
3362 this->set_data_size(this->current_data_size());
3365 // Reset address and file offset.
3367 template<bool big_endian>
3368 void
3369 Arm_input_section<big_endian>::do_reset_address_and_file_offset()
3371 // Size of the original input section contents.
3372 off_t off = convert_types<off_t, uint64_t>(this->original_size_);
3374 // If this is a stub table owner, account for the stub table size.
3375 if (this->is_stub_table_owner())
3377 Stub_table<big_endian>* stub_table = this->stub_table_;
3379 // Reset the stub table's address and file offset. The
3380 // current data size for child will be updated after that.
3381 stub_table_->reset_address_and_file_offset();
3382 off = align_address(off, stub_table_->addralign());
3383 off += stub_table->current_data_size();
3386 this->set_current_data_size(off);
3389 // Arm_output_section methods.
3391 // Create a stub group for input sections from BEGIN to END. OWNER
3392 // points to the input section to be the owner a new stub table.
3394 template<bool big_endian>
3395 void
3396 Arm_output_section<big_endian>::create_stub_group(
3397 Input_section_list::const_iterator begin,
3398 Input_section_list::const_iterator end,
3399 Input_section_list::const_iterator owner,
3400 Target_arm<big_endian>* target,
3401 std::vector<Output_relaxed_input_section*>* new_relaxed_sections)
3403 // Currently we convert ordinary input sections into relaxed sections only
3404 // at this point but we may want to support creating relaxed input section
3405 // very early. So we check here to see if owner is already a relaxed
3406 // section.
3408 Arm_input_section<big_endian>* arm_input_section;
3409 if (owner->is_relaxed_input_section())
3411 arm_input_section =
3412 Arm_input_section<big_endian>::as_arm_input_section(
3413 owner->relaxed_input_section());
3415 else
3417 gold_assert(owner->is_input_section());
3418 // Create a new relaxed input section.
3419 arm_input_section =
3420 target->new_arm_input_section(owner->relobj(), owner->shndx());
3421 new_relaxed_sections->push_back(arm_input_section);
3424 // Create a stub table.
3425 Stub_table<big_endian>* stub_table =
3426 target->new_stub_table(arm_input_section);
3428 arm_input_section->set_stub_table(stub_table);
3430 Input_section_list::const_iterator p = begin;
3431 Input_section_list::const_iterator prev_p;
3433 // Look for input sections or relaxed input sections in [begin ... end].
3436 if (p->is_input_section() || p->is_relaxed_input_section())
3438 // The stub table information for input sections live
3439 // in their objects.
3440 Arm_relobj<big_endian>* arm_relobj =
3441 Arm_relobj<big_endian>::as_arm_relobj(p->relobj());
3442 arm_relobj->set_stub_table(p->shndx(), stub_table);
3444 prev_p = p++;
3446 while (prev_p != end);
3449 // Group input sections for stub generation. GROUP_SIZE is roughly the limit
3450 // of stub groups. We grow a stub group by adding input section until the
3451 // size is just below GROUP_SIZE. The last input section will be converted
3452 // into a stub table. If STUB_ALWAYS_AFTER_BRANCH is false, we also add
3453 // input section after the stub table, effectively double the group size.
3455 // This is similar to the group_sections() function in elf32-arm.c but is
3456 // implemented differently.
3458 template<bool big_endian>
3459 void
3460 Arm_output_section<big_endian>::group_sections(
3461 section_size_type group_size,
3462 bool stubs_always_after_branch,
3463 Target_arm<big_endian>* target)
3465 // We only care about sections containing code.
3466 if ((this->flags() & elfcpp::SHF_EXECINSTR) == 0)
3467 return;
3469 // States for grouping.
3470 typedef enum
3472 // No group is being built.
3473 NO_GROUP,
3474 // A group is being built but the stub table is not found yet.
3475 // We keep group a stub group until the size is just under GROUP_SIZE.
3476 // The last input section in the group will be used as the stub table.
3477 FINDING_STUB_SECTION,
3478 // A group is being built and we have already found a stub table.
3479 // We enter this state to grow a stub group by adding input section
3480 // after the stub table. This effectively doubles the group size.
3481 HAS_STUB_SECTION
3482 } State;
3484 // Any newly created relaxed sections are stored here.
3485 std::vector<Output_relaxed_input_section*> new_relaxed_sections;
3487 State state = NO_GROUP;
3488 section_size_type off = 0;
3489 section_size_type group_begin_offset = 0;
3490 section_size_type group_end_offset = 0;
3491 section_size_type stub_table_end_offset = 0;
3492 Input_section_list::const_iterator group_begin =
3493 this->input_sections().end();
3494 Input_section_list::const_iterator stub_table =
3495 this->input_sections().end();
3496 Input_section_list::const_iterator group_end = this->input_sections().end();
3497 for (Input_section_list::const_iterator p = this->input_sections().begin();
3498 p != this->input_sections().end();
3499 ++p)
3501 section_size_type section_begin_offset =
3502 align_address(off, p->addralign());
3503 section_size_type section_end_offset =
3504 section_begin_offset + p->data_size();
3506 // Check to see if we should group the previously seens sections.
3507 switch (state)
3509 case NO_GROUP:
3510 break;
3512 case FINDING_STUB_SECTION:
3513 // Adding this section makes the group larger than GROUP_SIZE.
3514 if (section_end_offset - group_begin_offset >= group_size)
3516 if (stubs_always_after_branch)
3518 gold_assert(group_end != this->input_sections().end());
3519 this->create_stub_group(group_begin, group_end, group_end,
3520 target, &new_relaxed_sections);
3521 state = NO_GROUP;
3523 else
3525 // But wait, there's more! Input sections up to
3526 // stub_group_size bytes after the stub table can be
3527 // handled by it too.
3528 state = HAS_STUB_SECTION;
3529 stub_table = group_end;
3530 stub_table_end_offset = group_end_offset;
3533 break;
3535 case HAS_STUB_SECTION:
3536 // Adding this section makes the post stub-section group larger
3537 // than GROUP_SIZE.
3538 if (section_end_offset - stub_table_end_offset >= group_size)
3540 gold_assert(group_end != this->input_sections().end());
3541 this->create_stub_group(group_begin, group_end, stub_table,
3542 target, &new_relaxed_sections);
3543 state = NO_GROUP;
3545 break;
3547 default:
3548 gold_unreachable();
3551 // If we see an input section and currently there is no group, start
3552 // a new one. Skip any empty sections.
3553 if ((p->is_input_section() || p->is_relaxed_input_section())
3554 && (p->relobj()->section_size(p->shndx()) != 0))
3556 if (state == NO_GROUP)
3558 state = FINDING_STUB_SECTION;
3559 group_begin = p;
3560 group_begin_offset = section_begin_offset;
3563 // Keep track of the last input section seen.
3564 group_end = p;
3565 group_end_offset = section_end_offset;
3568 off = section_end_offset;
3571 // Create a stub group for any ungrouped sections.
3572 if (state == FINDING_STUB_SECTION || state == HAS_STUB_SECTION)
3574 gold_assert(group_end != this->input_sections().end());
3575 this->create_stub_group(group_begin, group_end,
3576 (state == FINDING_STUB_SECTION
3577 ? group_end
3578 : stub_table),
3579 target, &new_relaxed_sections);
3582 // Convert input section into relaxed input section in a batch.
3583 if (!new_relaxed_sections.empty())
3584 this->convert_input_sections_to_relaxed_sections(new_relaxed_sections);
3586 // Update the section offsets
3587 for (size_t i = 0; i < new_relaxed_sections.size(); ++i)
3589 Arm_relobj<big_endian>* arm_relobj =
3590 Arm_relobj<big_endian>::as_arm_relobj(
3591 new_relaxed_sections[i]->relobj());
3592 unsigned int shndx = new_relaxed_sections[i]->shndx();
3593 // Tell Arm_relobj that this input section is converted.
3594 arm_relobj->convert_input_section_to_relaxed_section(shndx);
3598 // Arm_relobj methods.
3600 // Scan relocations for stub generation.
3602 template<bool big_endian>
3603 void
3604 Arm_relobj<big_endian>::scan_sections_for_stubs(
3605 Target_arm<big_endian>* arm_target,
3606 const Symbol_table* symtab,
3607 const Layout* layout)
3609 unsigned int shnum = this->shnum();
3610 const unsigned int shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
3612 // Read the section headers.
3613 const unsigned char* pshdrs = this->get_view(this->elf_file()->shoff(),
3614 shnum * shdr_size,
3615 true, true);
3617 // To speed up processing, we set up hash tables for fast lookup of
3618 // input offsets to output addresses.
3619 this->initialize_input_to_output_maps();
3621 const Relobj::Output_sections& out_sections(this->output_sections());
3623 Relocate_info<32, big_endian> relinfo;
3624 relinfo.symtab = symtab;
3625 relinfo.layout = layout;
3626 relinfo.object = this;
3628 const unsigned char* p = pshdrs + shdr_size;
3629 for (unsigned int i = 1; i < shnum; ++i, p += shdr_size)
3631 typename elfcpp::Shdr<32, big_endian> shdr(p);
3633 unsigned int sh_type = shdr.get_sh_type();
3634 if (sh_type != elfcpp::SHT_REL && sh_type != elfcpp::SHT_RELA)
3635 continue;
3637 off_t sh_size = shdr.get_sh_size();
3638 if (sh_size == 0)
3639 continue;
3641 unsigned int index = this->adjust_shndx(shdr.get_sh_info());
3642 if (index >= this->shnum())
3644 // Ignore reloc section with bad info. This error will be
3645 // reported in the final link.
3646 continue;
3649 Output_section* os = out_sections[index];
3650 if (os == NULL
3651 || symtab->is_section_folded(this, index))
3653 // This relocation section is against a section which we
3654 // discarded or if the section is folded into another
3655 // section due to ICF.
3656 continue;
3658 Arm_address output_offset = this->get_output_section_offset(index);
3660 if (this->adjust_shndx(shdr.get_sh_link()) != this->symtab_shndx())
3662 // Ignore reloc section with unexpected symbol table. The
3663 // error will be reported in the final link.
3664 continue;
3667 const unsigned char* prelocs = this->get_view(shdr.get_sh_offset(),
3668 sh_size, true, false);
3670 unsigned int reloc_size;
3671 if (sh_type == elfcpp::SHT_REL)
3672 reloc_size = elfcpp::Elf_sizes<32>::rel_size;
3673 else
3674 reloc_size = elfcpp::Elf_sizes<32>::rela_size;
3676 if (reloc_size != shdr.get_sh_entsize())
3678 // Ignore reloc section with unexpected entsize. The error
3679 // will be reported in the final link.
3680 continue;
3683 size_t reloc_count = sh_size / reloc_size;
3684 if (static_cast<off_t>(reloc_count * reloc_size) != sh_size)
3686 // Ignore reloc section with uneven size. The error will be
3687 // reported in the final link.
3688 continue;
3691 gold_assert(output_offset != invalid_address
3692 || this->relocs_must_follow_section_writes());
3694 // Get the section contents. This does work for the case in which
3695 // we modify the contents of an input section. We need to pass the
3696 // output view under such circumstances.
3697 section_size_type input_view_size = 0;
3698 const unsigned char* input_view =
3699 this->section_contents(index, &input_view_size, false);
3701 relinfo.reloc_shndx = i;
3702 relinfo.data_shndx = index;
3703 arm_target->scan_section_for_stubs(&relinfo, sh_type, prelocs,
3704 reloc_count, os,
3705 output_offset == invalid_address,
3706 input_view,
3707 os->address(),
3708 input_view_size);
3711 // After we've done the relocations, we release the hash tables,
3712 // since we no longer need them.
3713 this->free_input_to_output_maps();
3716 // Count the local symbols. The ARM backend needs to know if a symbol
3717 // is a THUMB function or not. For global symbols, it is easy because
3718 // the Symbol object keeps the ELF symbol type. For local symbol it is
3719 // harder because we cannot access this information. So we override the
3720 // do_count_local_symbol in parent and scan local symbols to mark
3721 // THUMB functions. This is not the most efficient way but I do not want to
3722 // slow down other ports by calling a per symbol targer hook inside
3723 // Sized_relobj<size, big_endian>::do_count_local_symbols.
3725 template<bool big_endian>
3726 void
3727 Arm_relobj<big_endian>::do_count_local_symbols(
3728 Stringpool_template<char>* pool,
3729 Stringpool_template<char>* dynpool)
3731 // We need to fix-up the values of any local symbols whose type are
3732 // STT_ARM_TFUNC.
3734 // Ask parent to count the local symbols.
3735 Sized_relobj<32, big_endian>::do_count_local_symbols(pool, dynpool);
3736 const unsigned int loccount = this->local_symbol_count();
3737 if (loccount == 0)
3738 return;
3740 // Intialize the thumb function bit-vector.
3741 std::vector<bool> empty_vector(loccount, false);
3742 this->local_symbol_is_thumb_function_.swap(empty_vector);
3744 // Read the symbol table section header.
3745 const unsigned int symtab_shndx = this->symtab_shndx();
3746 elfcpp::Shdr<32, big_endian>
3747 symtabshdr(this, this->elf_file()->section_header(symtab_shndx));
3748 gold_assert(symtabshdr.get_sh_type() == elfcpp::SHT_SYMTAB);
3750 // Read the local symbols.
3751 const int sym_size =elfcpp::Elf_sizes<32>::sym_size;
3752 gold_assert(loccount == symtabshdr.get_sh_info());
3753 off_t locsize = loccount * sym_size;
3754 const unsigned char* psyms = this->get_view(symtabshdr.get_sh_offset(),
3755 locsize, true, true);
3757 // Loop over the local symbols and mark any local symbols pointing
3758 // to THUMB functions.
3760 // Skip the first dummy symbol.
3761 psyms += sym_size;
3762 typename Sized_relobj<32, big_endian>::Local_values* plocal_values =
3763 this->local_values();
3764 for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
3766 elfcpp::Sym<32, big_endian> sym(psyms);
3767 elfcpp::STT st_type = sym.get_st_type();
3768 Symbol_value<32>& lv((*plocal_values)[i]);
3769 Arm_address input_value = lv.input_value();
3771 if (st_type == elfcpp::STT_ARM_TFUNC
3772 || (st_type == elfcpp::STT_FUNC && ((input_value & 1) != 0)))
3774 // This is a THUMB function. Mark this and canonicalize the
3775 // symbol value by setting LSB.
3776 this->local_symbol_is_thumb_function_[i] = true;
3777 if ((input_value & 1) == 0)
3778 lv.set_input_value(input_value | 1);
3783 // Relocate sections.
3784 template<bool big_endian>
3785 void
3786 Arm_relobj<big_endian>::do_relocate_sections(
3787 const Symbol_table* symtab,
3788 const Layout* layout,
3789 const unsigned char* pshdrs,
3790 typename Sized_relobj<32, big_endian>::Views* pviews)
3792 // Call parent to relocate sections.
3793 Sized_relobj<32, big_endian>::do_relocate_sections(symtab, layout, pshdrs,
3794 pviews);
3796 // We do not generate stubs if doing a relocatable link.
3797 if (parameters->options().relocatable())
3798 return;
3800 // Relocate stub tables.
3801 unsigned int shnum = this->shnum();
3803 Target_arm<big_endian>* arm_target =
3804 Target_arm<big_endian>::default_target();
3806 Relocate_info<32, big_endian> relinfo;
3807 relinfo.symtab = symtab;
3808 relinfo.layout = layout;
3809 relinfo.object = this;
3811 for (unsigned int i = 1; i < shnum; ++i)
3813 Arm_input_section<big_endian>* arm_input_section =
3814 arm_target->find_arm_input_section(this, i);
3816 if (arm_input_section == NULL
3817 || !arm_input_section->is_stub_table_owner()
3818 || arm_input_section->stub_table()->empty())
3819 continue;
3821 // We cannot discard a section if it owns a stub table.
3822 Output_section* os = this->output_section(i);
3823 gold_assert(os != NULL);
3825 relinfo.reloc_shndx = elfcpp::SHN_UNDEF;
3826 relinfo.reloc_shdr = NULL;
3827 relinfo.data_shndx = i;
3828 relinfo.data_shdr = pshdrs + i * elfcpp::Elf_sizes<32>::shdr_size;
3830 gold_assert((*pviews)[i].view != NULL);
3832 // We are passed the output section view. Adjust it to cover the
3833 // stub table only.
3834 Stub_table<big_endian>* stub_table = arm_input_section->stub_table();
3835 gold_assert((stub_table->address() >= (*pviews)[i].address)
3836 && ((stub_table->address() + stub_table->data_size())
3837 <= (*pviews)[i].address + (*pviews)[i].view_size));
3839 off_t offset = stub_table->address() - (*pviews)[i].address;
3840 unsigned char* view = (*pviews)[i].view + offset;
3841 Arm_address address = stub_table->address();
3842 section_size_type view_size = stub_table->data_size();
3844 stub_table->relocate_stubs(&relinfo, arm_target, os, view, address,
3845 view_size);
3849 // Helper functions for both Arm_relobj and Arm_dynobj to read ARM
3850 // ABI information.
3852 template<bool big_endian>
3853 Attributes_section_data*
3854 read_arm_attributes_section(
3855 Object* object,
3856 Read_symbols_data *sd)
3858 // Read the attributes section if there is one.
3859 // We read from the end because gas seems to put it near the end of
3860 // the section headers.
3861 const size_t shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
3862 const unsigned char *ps =
3863 sd->section_headers->data() + shdr_size * (object->shnum() - 1);
3864 for (unsigned int i = object->shnum(); i > 0; --i, ps -= shdr_size)
3866 elfcpp::Shdr<32, big_endian> shdr(ps);
3867 if (shdr.get_sh_type() == elfcpp::SHT_ARM_ATTRIBUTES)
3869 section_offset_type section_offset = shdr.get_sh_offset();
3870 section_size_type section_size =
3871 convert_to_section_size_type(shdr.get_sh_size());
3872 File_view* view = object->get_lasting_view(section_offset,
3873 section_size, true, false);
3874 return new Attributes_section_data(view->data(), section_size);
3877 return NULL;
3880 // Read the symbol information.
3882 template<bool big_endian>
3883 void
3884 Arm_relobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
3886 // Call parent class to read symbol information.
3887 Sized_relobj<32, big_endian>::do_read_symbols(sd);
3889 // Read processor-specific flags in ELF file header.
3890 const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
3891 elfcpp::Elf_sizes<32>::ehdr_size,
3892 true, false);
3893 elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
3894 this->processor_specific_flags_ = ehdr.get_e_flags();
3895 this->attributes_section_data_ =
3896 read_arm_attributes_section<big_endian>(this, sd);
3899 // Arm_dynobj methods.
3901 // Read the symbol information.
3903 template<bool big_endian>
3904 void
3905 Arm_dynobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
3907 // Call parent class to read symbol information.
3908 Sized_dynobj<32, big_endian>::do_read_symbols(sd);
3910 // Read processor-specific flags in ELF file header.
3911 const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
3912 elfcpp::Elf_sizes<32>::ehdr_size,
3913 true, false);
3914 elfcpp::Ehdr<32, big_endian> ehdr(pehdr);
3915 this->processor_specific_flags_ = ehdr.get_e_flags();
3916 this->attributes_section_data_ =
3917 read_arm_attributes_section<big_endian>(this, sd);
3920 // Stub_addend_reader methods.
3922 // Read the addend of a REL relocation of type R_TYPE at VIEW.
3924 template<bool big_endian>
3925 elfcpp::Elf_types<32>::Elf_Swxword
3926 Stub_addend_reader<elfcpp::SHT_REL, big_endian>::operator()(
3927 unsigned int r_type,
3928 const unsigned char* view,
3929 const typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc&) const
3931 switch (r_type)
3933 case elfcpp::R_ARM_CALL:
3934 case elfcpp::R_ARM_JUMP24:
3935 case elfcpp::R_ARM_PLT32:
3937 typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
3938 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
3939 Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
3940 return utils::sign_extend<26>(val << 2);
3943 case elfcpp::R_ARM_THM_CALL:
3944 case elfcpp::R_ARM_THM_JUMP24:
3945 case elfcpp::R_ARM_THM_XPC22:
3947 // Fetch the addend. We use the Thumb-2 encoding (backwards
3948 // compatible with Thumb-1) involving the J1 and J2 bits.
3949 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3950 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
3951 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
3952 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
3954 uint32_t s = (upper_insn & (1 << 10)) >> 10;
3955 uint32_t upper = upper_insn & 0x3ff;
3956 uint32_t lower = lower_insn & 0x7ff;
3957 uint32_t j1 = (lower_insn & (1 << 13)) >> 13;
3958 uint32_t j2 = (lower_insn & (1 << 11)) >> 11;
3959 uint32_t i1 = j1 ^ s ? 0 : 1;
3960 uint32_t i2 = j2 ^ s ? 0 : 1;
3962 return utils::sign_extend<25>((s << 24) | (i1 << 23) | (i2 << 22)
3963 | (upper << 12) | (lower << 1));
3966 case elfcpp::R_ARM_THM_JUMP19:
3968 typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
3969 const Valtype* wv = reinterpret_cast<const Valtype*>(view);
3970 Valtype upper_insn = elfcpp::Swap<16, big_endian>::readval(wv);
3971 Valtype lower_insn = elfcpp::Swap<16, big_endian>::readval(wv + 1);
3973 // Reconstruct the top three bits and squish the two 11 bit pieces
3974 // together.
3975 uint32_t S = (upper_insn & 0x0400) >> 10;
3976 uint32_t J1 = (lower_insn & 0x2000) >> 13;
3977 uint32_t J2 = (lower_insn & 0x0800) >> 11;
3978 uint32_t upper =
3979 (S << 8) | (J2 << 7) | (J1 << 6) | (upper_insn & 0x003f);
3980 uint32_t lower = (lower_insn & 0x07ff);
3981 return utils::sign_extend<23>((upper << 12) | (lower << 1));
3984 default:
3985 gold_unreachable();
3989 // A class to handle the PLT data.
3991 template<bool big_endian>
3992 class Output_data_plt_arm : public Output_section_data
3994 public:
3995 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, big_endian>
3996 Reloc_section;
3998 Output_data_plt_arm(Layout*, Output_data_space*);
4000 // Add an entry to the PLT.
4001 void
4002 add_entry(Symbol* gsym);
4004 // Return the .rel.plt section data.
4005 const Reloc_section*
4006 rel_plt() const
4007 { return this->rel_; }
4009 protected:
4010 void
4011 do_adjust_output_section(Output_section* os);
4013 // Write to a map file.
4014 void
4015 do_print_to_mapfile(Mapfile* mapfile) const
4016 { mapfile->print_output_data(this, _("** PLT")); }
4018 private:
4019 // Template for the first PLT entry.
4020 static const uint32_t first_plt_entry[5];
4022 // Template for subsequent PLT entries.
4023 static const uint32_t plt_entry[3];
4025 // Set the final size.
4026 void
4027 set_final_data_size()
4029 this->set_data_size(sizeof(first_plt_entry)
4030 + this->count_ * sizeof(plt_entry));
4033 // Write out the PLT data.
4034 void
4035 do_write(Output_file*);
4037 // The reloc section.
4038 Reloc_section* rel_;
4039 // The .got.plt section.
4040 Output_data_space* got_plt_;
4041 // The number of PLT entries.
4042 unsigned int count_;
4045 // Create the PLT section. The ordinary .got section is an argument,
4046 // since we need to refer to the start. We also create our own .got
4047 // section just for PLT entries.
4049 template<bool big_endian>
4050 Output_data_plt_arm<big_endian>::Output_data_plt_arm(Layout* layout,
4051 Output_data_space* got_plt)
4052 : Output_section_data(4), got_plt_(got_plt), count_(0)
4054 this->rel_ = new Reloc_section(false);
4055 layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
4056 elfcpp::SHF_ALLOC, this->rel_, true, false,
4057 false, false);
4060 template<bool big_endian>
4061 void
4062 Output_data_plt_arm<big_endian>::do_adjust_output_section(Output_section* os)
4064 os->set_entsize(0);
4067 // Add an entry to the PLT.
4069 template<bool big_endian>
4070 void
4071 Output_data_plt_arm<big_endian>::add_entry(Symbol* gsym)
4073 gold_assert(!gsym->has_plt_offset());
4075 // Note that when setting the PLT offset we skip the initial
4076 // reserved PLT entry.
4077 gsym->set_plt_offset((this->count_) * sizeof(plt_entry)
4078 + sizeof(first_plt_entry));
4080 ++this->count_;
4082 section_offset_type got_offset = this->got_plt_->current_data_size();
4084 // Every PLT entry needs a GOT entry which points back to the PLT
4085 // entry (this will be changed by the dynamic linker, normally
4086 // lazily when the function is called).
4087 this->got_plt_->set_current_data_size(got_offset + 4);
4089 // Every PLT entry needs a reloc.
4090 gsym->set_needs_dynsym_entry();
4091 this->rel_->add_global(gsym, elfcpp::R_ARM_JUMP_SLOT, this->got_plt_,
4092 got_offset);
4094 // Note that we don't need to save the symbol. The contents of the
4095 // PLT are independent of which symbols are used. The symbols only
4096 // appear in the relocations.
4099 // ARM PLTs.
4100 // FIXME: This is not very flexible. Right now this has only been tested
4101 // on armv5te. If we are to support additional architecture features like
4102 // Thumb-2 or BE8, we need to make this more flexible like GNU ld.
4104 // The first entry in the PLT.
4105 template<bool big_endian>
4106 const uint32_t Output_data_plt_arm<big_endian>::first_plt_entry[5] =
4108 0xe52de004, // str lr, [sp, #-4]!
4109 0xe59fe004, // ldr lr, [pc, #4]
4110 0xe08fe00e, // add lr, pc, lr
4111 0xe5bef008, // ldr pc, [lr, #8]!
4112 0x00000000, // &GOT[0] - .
4115 // Subsequent entries in the PLT.
4117 template<bool big_endian>
4118 const uint32_t Output_data_plt_arm<big_endian>::plt_entry[3] =
4120 0xe28fc600, // add ip, pc, #0xNN00000
4121 0xe28cca00, // add ip, ip, #0xNN000
4122 0xe5bcf000, // ldr pc, [ip, #0xNNN]!
4125 // Write out the PLT. This uses the hand-coded instructions above,
4126 // and adjusts them as needed. This is all specified by the arm ELF
4127 // Processor Supplement.
4129 template<bool big_endian>
4130 void
4131 Output_data_plt_arm<big_endian>::do_write(Output_file* of)
4133 const off_t offset = this->offset();
4134 const section_size_type oview_size =
4135 convert_to_section_size_type(this->data_size());
4136 unsigned char* const oview = of->get_output_view(offset, oview_size);
4138 const off_t got_file_offset = this->got_plt_->offset();
4139 const section_size_type got_size =
4140 convert_to_section_size_type(this->got_plt_->data_size());
4141 unsigned char* const got_view = of->get_output_view(got_file_offset,
4142 got_size);
4143 unsigned char* pov = oview;
4145 Arm_address plt_address = this->address();
4146 Arm_address got_address = this->got_plt_->address();
4148 // Write first PLT entry. All but the last word are constants.
4149 const size_t num_first_plt_words = (sizeof(first_plt_entry)
4150 / sizeof(plt_entry[0]));
4151 for (size_t i = 0; i < num_first_plt_words - 1; i++)
4152 elfcpp::Swap<32, big_endian>::writeval(pov + i * 4, first_plt_entry[i]);
4153 // Last word in first PLT entry is &GOT[0] - .
4154 elfcpp::Swap<32, big_endian>::writeval(pov + 16,
4155 got_address - (plt_address + 16));
4156 pov += sizeof(first_plt_entry);
4158 unsigned char* got_pov = got_view;
4160 memset(got_pov, 0, 12);
4161 got_pov += 12;
4163 const int rel_size = elfcpp::Elf_sizes<32>::rel_size;
4164 unsigned int plt_offset = sizeof(first_plt_entry);
4165 unsigned int plt_rel_offset = 0;
4166 unsigned int got_offset = 12;
4167 const unsigned int count = this->count_;
4168 for (unsigned int i = 0;
4169 i < count;
4170 ++i,
4171 pov += sizeof(plt_entry),
4172 got_pov += 4,
4173 plt_offset += sizeof(plt_entry),
4174 plt_rel_offset += rel_size,
4175 got_offset += 4)
4177 // Set and adjust the PLT entry itself.
4178 int32_t offset = ((got_address + got_offset)
4179 - (plt_address + plt_offset + 8));
4181 gold_assert(offset >= 0 && offset < 0x0fffffff);
4182 uint32_t plt_insn0 = plt_entry[0] | ((offset >> 20) & 0xff);
4183 elfcpp::Swap<32, big_endian>::writeval(pov, plt_insn0);
4184 uint32_t plt_insn1 = plt_entry[1] | ((offset >> 12) & 0xff);
4185 elfcpp::Swap<32, big_endian>::writeval(pov + 4, plt_insn1);
4186 uint32_t plt_insn2 = plt_entry[2] | (offset & 0xfff);
4187 elfcpp::Swap<32, big_endian>::writeval(pov + 8, plt_insn2);
4189 // Set the entry in the GOT.
4190 elfcpp::Swap<32, big_endian>::writeval(got_pov, plt_address);
4193 gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
4194 gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
4196 of->write_output_view(offset, oview_size, oview);
4197 of->write_output_view(got_file_offset, got_size, got_view);
4200 // Create a PLT entry for a global symbol.
4202 template<bool big_endian>
4203 void
4204 Target_arm<big_endian>::make_plt_entry(Symbol_table* symtab, Layout* layout,
4205 Symbol* gsym)
4207 if (gsym->has_plt_offset())
4208 return;
4210 if (this->plt_ == NULL)
4212 // Create the GOT sections first.
4213 this->got_section(symtab, layout);
4215 this->plt_ = new Output_data_plt_arm<big_endian>(layout, this->got_plt_);
4216 layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
4217 (elfcpp::SHF_ALLOC
4218 | elfcpp::SHF_EXECINSTR),
4219 this->plt_, false, false, false, false);
4221 this->plt_->add_entry(gsym);
4224 // Report an unsupported relocation against a local symbol.
4226 template<bool big_endian>
4227 void
4228 Target_arm<big_endian>::Scan::unsupported_reloc_local(
4229 Sized_relobj<32, big_endian>* object,
4230 unsigned int r_type)
4232 gold_error(_("%s: unsupported reloc %u against local symbol"),
4233 object->name().c_str(), r_type);
4236 // We are about to emit a dynamic relocation of type R_TYPE. If the
4237 // dynamic linker does not support it, issue an error. The GNU linker
4238 // only issues a non-PIC error for an allocated read-only section.
4239 // Here we know the section is allocated, but we don't know that it is
4240 // read-only. But we check for all the relocation types which the
4241 // glibc dynamic linker supports, so it seems appropriate to issue an
4242 // error even if the section is not read-only.
4244 template<bool big_endian>
4245 void
4246 Target_arm<big_endian>::Scan::check_non_pic(Relobj* object,
4247 unsigned int r_type)
4249 switch (r_type)
4251 // These are the relocation types supported by glibc for ARM.
4252 case elfcpp::R_ARM_RELATIVE:
4253 case elfcpp::R_ARM_COPY:
4254 case elfcpp::R_ARM_GLOB_DAT:
4255 case elfcpp::R_ARM_JUMP_SLOT:
4256 case elfcpp::R_ARM_ABS32:
4257 case elfcpp::R_ARM_ABS32_NOI:
4258 case elfcpp::R_ARM_PC24:
4259 // FIXME: The following 3 types are not supported by Android's dynamic
4260 // linker.
4261 case elfcpp::R_ARM_TLS_DTPMOD32:
4262 case elfcpp::R_ARM_TLS_DTPOFF32:
4263 case elfcpp::R_ARM_TLS_TPOFF32:
4264 return;
4266 default:
4267 // This prevents us from issuing more than one error per reloc
4268 // section. But we can still wind up issuing more than one
4269 // error per object file.
4270 if (this->issued_non_pic_error_)
4271 return;
4272 object->error(_("requires unsupported dynamic reloc; "
4273 "recompile with -fPIC"));
4274 this->issued_non_pic_error_ = true;
4275 return;
4277 case elfcpp::R_ARM_NONE:
4278 gold_unreachable();
4282 // Scan a relocation for a local symbol.
4283 // FIXME: This only handles a subset of relocation types used by Android
4284 // on ARM v5te devices.
4286 template<bool big_endian>
4287 inline void
4288 Target_arm<big_endian>::Scan::local(Symbol_table* symtab,
4289 Layout* layout,
4290 Target_arm* target,
4291 Sized_relobj<32, big_endian>* object,
4292 unsigned int data_shndx,
4293 Output_section* output_section,
4294 const elfcpp::Rel<32, big_endian>& reloc,
4295 unsigned int r_type,
4296 const elfcpp::Sym<32, big_endian>&)
4298 r_type = get_real_reloc_type(r_type);
4299 switch (r_type)
4301 case elfcpp::R_ARM_NONE:
4302 break;
4304 case elfcpp::R_ARM_ABS32:
4305 case elfcpp::R_ARM_ABS32_NOI:
4306 // If building a shared library (or a position-independent
4307 // executable), we need to create a dynamic relocation for
4308 // this location. The relocation applied at link time will
4309 // apply the link-time value, so we flag the location with
4310 // an R_ARM_RELATIVE relocation so the dynamic loader can
4311 // relocate it easily.
4312 if (parameters->options().output_is_position_independent())
4314 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
4315 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
4316 // If we are to add more other reloc types than R_ARM_ABS32,
4317 // we need to add check_non_pic(object, r_type) here.
4318 rel_dyn->add_local_relative(object, r_sym, elfcpp::R_ARM_RELATIVE,
4319 output_section, data_shndx,
4320 reloc.get_r_offset());
4322 break;
4324 case elfcpp::R_ARM_REL32:
4325 case elfcpp::R_ARM_THM_CALL:
4326 case elfcpp::R_ARM_CALL:
4327 case elfcpp::R_ARM_PREL31:
4328 case elfcpp::R_ARM_JUMP24:
4329 case elfcpp::R_ARM_PLT32:
4330 case elfcpp::R_ARM_THM_ABS5:
4331 case elfcpp::R_ARM_ABS8:
4332 case elfcpp::R_ARM_ABS12:
4333 case elfcpp::R_ARM_ABS16:
4334 case elfcpp::R_ARM_BASE_ABS:
4335 case elfcpp::R_ARM_MOVW_ABS_NC:
4336 case elfcpp::R_ARM_MOVT_ABS:
4337 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
4338 case elfcpp::R_ARM_THM_MOVT_ABS:
4339 case elfcpp::R_ARM_MOVW_PREL_NC:
4340 case elfcpp::R_ARM_MOVT_PREL:
4341 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
4342 case elfcpp::R_ARM_THM_MOVT_PREL:
4343 break;
4345 case elfcpp::R_ARM_GOTOFF32:
4346 // We need a GOT section:
4347 target->got_section(symtab, layout);
4348 break;
4350 case elfcpp::R_ARM_BASE_PREL:
4351 // FIXME: What about this?
4352 break;
4354 case elfcpp::R_ARM_GOT_BREL:
4355 case elfcpp::R_ARM_GOT_PREL:
4357 // The symbol requires a GOT entry.
4358 Output_data_got<32, big_endian>* got =
4359 target->got_section(symtab, layout);
4360 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
4361 if (got->add_local(object, r_sym, GOT_TYPE_STANDARD))
4363 // If we are generating a shared object, we need to add a
4364 // dynamic RELATIVE relocation for this symbol's GOT entry.
4365 if (parameters->options().output_is_position_independent())
4367 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
4368 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
4369 rel_dyn->add_local_relative(
4370 object, r_sym, elfcpp::R_ARM_RELATIVE, got,
4371 object->local_got_offset(r_sym, GOT_TYPE_STANDARD));
4375 break;
4377 case elfcpp::R_ARM_TARGET1:
4378 // This should have been mapped to another type already.
4379 // Fall through.
4380 case elfcpp::R_ARM_COPY:
4381 case elfcpp::R_ARM_GLOB_DAT:
4382 case elfcpp::R_ARM_JUMP_SLOT:
4383 case elfcpp::R_ARM_RELATIVE:
4384 // These are relocations which should only be seen by the
4385 // dynamic linker, and should never be seen here.
4386 gold_error(_("%s: unexpected reloc %u in object file"),
4387 object->name().c_str(), r_type);
4388 break;
4390 default:
4391 unsupported_reloc_local(object, r_type);
4392 break;
4396 // Report an unsupported relocation against a global symbol.
4398 template<bool big_endian>
4399 void
4400 Target_arm<big_endian>::Scan::unsupported_reloc_global(
4401 Sized_relobj<32, big_endian>* object,
4402 unsigned int r_type,
4403 Symbol* gsym)
4405 gold_error(_("%s: unsupported reloc %u against global symbol %s"),
4406 object->name().c_str(), r_type, gsym->demangled_name().c_str());
4409 // Scan a relocation for a global symbol.
4410 // FIXME: This only handles a subset of relocation types used by Android
4411 // on ARM v5te devices.
4413 template<bool big_endian>
4414 inline void
4415 Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
4416 Layout* layout,
4417 Target_arm* target,
4418 Sized_relobj<32, big_endian>* object,
4419 unsigned int data_shndx,
4420 Output_section* output_section,
4421 const elfcpp::Rel<32, big_endian>& reloc,
4422 unsigned int r_type,
4423 Symbol* gsym)
4425 r_type = get_real_reloc_type(r_type);
4426 switch (r_type)
4428 case elfcpp::R_ARM_NONE:
4429 break;
4431 case elfcpp::R_ARM_ABS32:
4432 case elfcpp::R_ARM_ABS32_NOI:
4434 // Make a dynamic relocation if necessary.
4435 if (gsym->needs_dynamic_reloc(Symbol::ABSOLUTE_REF))
4437 if (target->may_need_copy_reloc(gsym))
4439 target->copy_reloc(symtab, layout, object,
4440 data_shndx, output_section, gsym, reloc);
4442 else if (gsym->can_use_relative_reloc(false))
4444 // If we are to add more other reloc types than R_ARM_ABS32,
4445 // we need to add check_non_pic(object, r_type) here.
4446 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
4447 rel_dyn->add_global_relative(gsym, elfcpp::R_ARM_RELATIVE,
4448 output_section, object,
4449 data_shndx, reloc.get_r_offset());
4451 else
4453 // If we are to add more other reloc types than R_ARM_ABS32,
4454 // we need to add check_non_pic(object, r_type) here.
4455 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
4456 rel_dyn->add_global(gsym, r_type, output_section, object,
4457 data_shndx, reloc.get_r_offset());
4461 break;
4463 case elfcpp::R_ARM_MOVW_ABS_NC:
4464 case elfcpp::R_ARM_MOVT_ABS:
4465 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
4466 case elfcpp::R_ARM_THM_MOVT_ABS:
4467 case elfcpp::R_ARM_MOVW_PREL_NC:
4468 case elfcpp::R_ARM_MOVT_PREL:
4469 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
4470 case elfcpp::R_ARM_THM_MOVT_PREL:
4471 break;
4473 case elfcpp::R_ARM_THM_ABS5:
4474 case elfcpp::R_ARM_ABS8:
4475 case elfcpp::R_ARM_ABS12:
4476 case elfcpp::R_ARM_ABS16:
4477 case elfcpp::R_ARM_BASE_ABS:
4479 // No dynamic relocs of this kinds.
4480 // Report the error in case of PIC.
4481 int flags = Symbol::NON_PIC_REF;
4482 if (gsym->type() == elfcpp::STT_FUNC
4483 || gsym->type() == elfcpp::STT_ARM_TFUNC)
4484 flags |= Symbol::FUNCTION_CALL;
4485 if (gsym->needs_dynamic_reloc(flags))
4486 check_non_pic(object, r_type);
4488 break;
4490 case elfcpp::R_ARM_REL32:
4491 case elfcpp::R_ARM_PREL31:
4493 // Make a dynamic relocation if necessary.
4494 int flags = Symbol::NON_PIC_REF;
4495 if (gsym->needs_dynamic_reloc(flags))
4497 if (target->may_need_copy_reloc(gsym))
4499 target->copy_reloc(symtab, layout, object,
4500 data_shndx, output_section, gsym, reloc);
4502 else
4504 check_non_pic(object, r_type);
4505 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
4506 rel_dyn->add_global(gsym, r_type, output_section, object,
4507 data_shndx, reloc.get_r_offset());
4511 break;
4513 case elfcpp::R_ARM_JUMP24:
4514 case elfcpp::R_ARM_THM_JUMP24:
4515 case elfcpp::R_ARM_CALL:
4516 case elfcpp::R_ARM_THM_CALL:
4518 if (Target_arm<big_endian>::Scan::symbol_needs_plt_entry(gsym))
4519 target->make_plt_entry(symtab, layout, gsym);
4520 else
4522 // Check to see if this is a function that would need a PLT
4523 // but does not get one because the function symbol is untyped.
4524 // This happens in assembly code missing a proper .type directive.
4525 if ((!gsym->is_undefined() || parameters->options().shared())
4526 && !parameters->doing_static_link()
4527 && gsym->type() == elfcpp::STT_NOTYPE
4528 && (gsym->is_from_dynobj()
4529 || gsym->is_undefined()
4530 || gsym->is_preemptible()))
4531 gold_error(_("%s is not a function."),
4532 gsym->demangled_name().c_str());
4534 break;
4536 case elfcpp::R_ARM_PLT32:
4537 // If the symbol is fully resolved, this is just a relative
4538 // local reloc. Otherwise we need a PLT entry.
4539 if (gsym->final_value_is_known())
4540 break;
4541 // If building a shared library, we can also skip the PLT entry
4542 // if the symbol is defined in the output file and is protected
4543 // or hidden.
4544 if (gsym->is_defined()
4545 && !gsym->is_from_dynobj()
4546 && !gsym->is_preemptible())
4547 break;
4548 target->make_plt_entry(symtab, layout, gsym);
4549 break;
4551 case elfcpp::R_ARM_GOTOFF32:
4552 // We need a GOT section.
4553 target->got_section(symtab, layout);
4554 break;
4556 case elfcpp::R_ARM_BASE_PREL:
4557 // FIXME: What about this?
4558 break;
4560 case elfcpp::R_ARM_GOT_BREL:
4561 case elfcpp::R_ARM_GOT_PREL:
4563 // The symbol requires a GOT entry.
4564 Output_data_got<32, big_endian>* got =
4565 target->got_section(symtab, layout);
4566 if (gsym->final_value_is_known())
4567 got->add_global(gsym, GOT_TYPE_STANDARD);
4568 else
4570 // If this symbol is not fully resolved, we need to add a
4571 // GOT entry with a dynamic relocation.
4572 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
4573 if (gsym->is_from_dynobj()
4574 || gsym->is_undefined()
4575 || gsym->is_preemptible())
4576 got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
4577 rel_dyn, elfcpp::R_ARM_GLOB_DAT);
4578 else
4580 if (got->add_global(gsym, GOT_TYPE_STANDARD))
4581 rel_dyn->add_global_relative(
4582 gsym, elfcpp::R_ARM_RELATIVE, got,
4583 gsym->got_offset(GOT_TYPE_STANDARD));
4587 break;
4589 case elfcpp::R_ARM_TARGET1:
4590 // This should have been mapped to another type already.
4591 // Fall through.
4592 case elfcpp::R_ARM_COPY:
4593 case elfcpp::R_ARM_GLOB_DAT:
4594 case elfcpp::R_ARM_JUMP_SLOT:
4595 case elfcpp::R_ARM_RELATIVE:
4596 // These are relocations which should only be seen by the
4597 // dynamic linker, and should never be seen here.
4598 gold_error(_("%s: unexpected reloc %u in object file"),
4599 object->name().c_str(), r_type);
4600 break;
4602 default:
4603 unsupported_reloc_global(object, r_type, gsym);
4604 break;
4608 // Process relocations for gc.
4610 template<bool big_endian>
4611 void
4612 Target_arm<big_endian>::gc_process_relocs(Symbol_table* symtab,
4613 Layout* layout,
4614 Sized_relobj<32, big_endian>* object,
4615 unsigned int data_shndx,
4616 unsigned int,
4617 const unsigned char* prelocs,
4618 size_t reloc_count,
4619 Output_section* output_section,
4620 bool needs_special_offset_handling,
4621 size_t local_symbol_count,
4622 const unsigned char* plocal_symbols)
4624 typedef Target_arm<big_endian> Arm;
4625 typedef typename Target_arm<big_endian>::Scan Scan;
4627 gold::gc_process_relocs<32, big_endian, Arm, elfcpp::SHT_REL, Scan>(
4628 symtab,
4629 layout,
4630 this,
4631 object,
4632 data_shndx,
4633 prelocs,
4634 reloc_count,
4635 output_section,
4636 needs_special_offset_handling,
4637 local_symbol_count,
4638 plocal_symbols);
4641 // Scan relocations for a section.
4643 template<bool big_endian>
4644 void
4645 Target_arm<big_endian>::scan_relocs(Symbol_table* symtab,
4646 Layout* layout,
4647 Sized_relobj<32, big_endian>* object,
4648 unsigned int data_shndx,
4649 unsigned int sh_type,
4650 const unsigned char* prelocs,
4651 size_t reloc_count,
4652 Output_section* output_section,
4653 bool needs_special_offset_handling,
4654 size_t local_symbol_count,
4655 const unsigned char* plocal_symbols)
4657 typedef typename Target_arm<big_endian>::Scan Scan;
4658 if (sh_type == elfcpp::SHT_RELA)
4660 gold_error(_("%s: unsupported RELA reloc section"),
4661 object->name().c_str());
4662 return;
4665 gold::scan_relocs<32, big_endian, Target_arm, elfcpp::SHT_REL, Scan>(
4666 symtab,
4667 layout,
4668 this,
4669 object,
4670 data_shndx,
4671 prelocs,
4672 reloc_count,
4673 output_section,
4674 needs_special_offset_handling,
4675 local_symbol_count,
4676 plocal_symbols);
4679 // Finalize the sections.
4681 template<bool big_endian>
4682 void
4683 Target_arm<big_endian>::do_finalize_sections(
4684 Layout* layout,
4685 const Input_objects* input_objects,
4686 Symbol_table* symtab)
4688 // Merge processor-specific flags.
4689 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
4690 p != input_objects->relobj_end();
4691 ++p)
4693 Arm_relobj<big_endian>* arm_relobj =
4694 Arm_relobj<big_endian>::as_arm_relobj(*p);
4695 this->merge_processor_specific_flags(
4696 arm_relobj->name(),
4697 arm_relobj->processor_specific_flags());
4698 this->merge_object_attributes(arm_relobj->name().c_str(),
4699 arm_relobj->attributes_section_data());
4703 for (Input_objects::Dynobj_iterator p = input_objects->dynobj_begin();
4704 p != input_objects->dynobj_end();
4705 ++p)
4707 Arm_dynobj<big_endian>* arm_dynobj =
4708 Arm_dynobj<big_endian>::as_arm_dynobj(*p);
4709 this->merge_processor_specific_flags(
4710 arm_dynobj->name(),
4711 arm_dynobj->processor_specific_flags());
4712 this->merge_object_attributes(arm_dynobj->name().c_str(),
4713 arm_dynobj->attributes_section_data());
4716 // Check BLX use.
4717 Object_attribute* attr =
4718 this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
4719 if (attr->int_value() > elfcpp::TAG_CPU_ARCH_V4)
4720 this->set_may_use_blx(true);
4722 // Fill in some more dynamic tags.
4723 Output_data_dynamic* const odyn = layout->dynamic_data();
4724 if (odyn != NULL)
4726 if (this->got_plt_ != NULL
4727 && this->got_plt_->output_section() != NULL)
4728 odyn->add_section_address(elfcpp::DT_PLTGOT, this->got_plt_);
4730 if (this->plt_ != NULL
4731 && this->plt_->output_section() != NULL)
4733 const Output_data* od = this->plt_->rel_plt();
4734 odyn->add_section_size(elfcpp::DT_PLTRELSZ, od);
4735 odyn->add_section_address(elfcpp::DT_JMPREL, od);
4736 odyn->add_constant(elfcpp::DT_PLTREL, elfcpp::DT_REL);
4739 if (this->rel_dyn_ != NULL
4740 && this->rel_dyn_->output_section() != NULL)
4742 const Output_data* od = this->rel_dyn_;
4743 odyn->add_section_address(elfcpp::DT_REL, od);
4744 odyn->add_section_size(elfcpp::DT_RELSZ, od);
4745 odyn->add_constant(elfcpp::DT_RELENT,
4746 elfcpp::Elf_sizes<32>::rel_size);
4749 if (!parameters->options().shared())
4751 // The value of the DT_DEBUG tag is filled in by the dynamic
4752 // linker at run time, and used by the debugger.
4753 odyn->add_constant(elfcpp::DT_DEBUG, 0);
4757 // Emit any relocs we saved in an attempt to avoid generating COPY
4758 // relocs.
4759 if (this->copy_relocs_.any_saved_relocs())
4760 this->copy_relocs_.emit(this->rel_dyn_section(layout));
4762 // Handle the .ARM.exidx section.
4763 Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
4764 if (exidx_section != NULL
4765 && exidx_section->type() == elfcpp::SHT_ARM_EXIDX
4766 && !parameters->options().relocatable())
4768 // Create __exidx_start and __exdix_end symbols.
4769 symtab->define_in_output_data("__exidx_start", NULL,
4770 Symbol_table::PREDEFINED,
4771 exidx_section, 0, 0, elfcpp::STT_OBJECT,
4772 elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
4773 false, false);
4774 symtab->define_in_output_data("__exidx_end", NULL,
4775 Symbol_table::PREDEFINED,
4776 exidx_section, 0, 0, elfcpp::STT_OBJECT,
4777 elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
4778 true, false);
4780 // For the ARM target, we need to add a PT_ARM_EXIDX segment for
4781 // the .ARM.exidx section.
4782 if (!layout->script_options()->saw_phdrs_clause())
4784 gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0, 0)
4785 == NULL);
4786 Output_segment* exidx_segment =
4787 layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
4788 exidx_segment->add_output_section(exidx_section, elfcpp::PF_R,
4789 false);
4793 // Create an .ARM.attributes section if there is not one already.
4794 Output_attributes_section_data* attributes_section =
4795 new Output_attributes_section_data(*this->attributes_section_data_);
4796 layout->add_output_section_data(".ARM.attributes",
4797 elfcpp::SHT_ARM_ATTRIBUTES, 0,
4798 attributes_section, false, false, false,
4799 false);
4802 // Return whether a direct absolute static relocation needs to be applied.
4803 // In cases where Scan::local() or Scan::global() has created
4804 // a dynamic relocation other than R_ARM_RELATIVE, the addend
4805 // of the relocation is carried in the data, and we must not
4806 // apply the static relocation.
4808 template<bool big_endian>
4809 inline bool
4810 Target_arm<big_endian>::Relocate::should_apply_static_reloc(
4811 const Sized_symbol<32>* gsym,
4812 int ref_flags,
4813 bool is_32bit,
4814 Output_section* output_section)
4816 // If the output section is not allocated, then we didn't call
4817 // scan_relocs, we didn't create a dynamic reloc, and we must apply
4818 // the reloc here.
4819 if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0)
4820 return true;
4822 // For local symbols, we will have created a non-RELATIVE dynamic
4823 // relocation only if (a) the output is position independent,
4824 // (b) the relocation is absolute (not pc- or segment-relative), and
4825 // (c) the relocation is not 32 bits wide.
4826 if (gsym == NULL)
4827 return !(parameters->options().output_is_position_independent()
4828 && (ref_flags & Symbol::ABSOLUTE_REF)
4829 && !is_32bit);
4831 // For global symbols, we use the same helper routines used in the
4832 // scan pass. If we did not create a dynamic relocation, or if we
4833 // created a RELATIVE dynamic relocation, we should apply the static
4834 // relocation.
4835 bool has_dyn = gsym->needs_dynamic_reloc(ref_flags);
4836 bool is_rel = (ref_flags & Symbol::ABSOLUTE_REF)
4837 && gsym->can_use_relative_reloc(ref_flags
4838 & Symbol::FUNCTION_CALL);
4839 return !has_dyn || is_rel;
4842 // Perform a relocation.
4844 template<bool big_endian>
4845 inline bool
4846 Target_arm<big_endian>::Relocate::relocate(
4847 const Relocate_info<32, big_endian>* relinfo,
4848 Target_arm* target,
4849 Output_section *output_section,
4850 size_t relnum,
4851 const elfcpp::Rel<32, big_endian>& rel,
4852 unsigned int r_type,
4853 const Sized_symbol<32>* gsym,
4854 const Symbol_value<32>* psymval,
4855 unsigned char* view,
4856 Arm_address address,
4857 section_size_type /* view_size */ )
4859 typedef Arm_relocate_functions<big_endian> Arm_relocate_functions;
4861 r_type = get_real_reloc_type(r_type);
4863 const Arm_relobj<big_endian>* object =
4864 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
4866 // If the final branch target of a relocation is THUMB instruction, this
4867 // is 1. Otherwise it is 0.
4868 Arm_address thumb_bit = 0;
4869 Symbol_value<32> symval;
4870 bool is_weakly_undefined_without_plt = false;
4871 if (relnum != Target_arm<big_endian>::fake_relnum_for_stubs)
4873 if (gsym != NULL)
4875 // This is a global symbol. Determine if we use PLT and if the
4876 // final target is THUMB.
4877 if (gsym->use_plt_offset(reloc_is_non_pic(r_type)))
4879 // This uses a PLT, change the symbol value.
4880 symval.set_output_value(target->plt_section()->address()
4881 + gsym->plt_offset());
4882 psymval = &symval;
4884 else if (gsym->is_weak_undefined())
4886 // This is a weakly undefined symbol and we do not use PLT
4887 // for this relocation. A branch targeting this symbol will
4888 // be converted into an NOP.
4889 is_weakly_undefined_without_plt = true;
4891 else
4893 // Set thumb bit if symbol:
4894 // -Has type STT_ARM_TFUNC or
4895 // -Has type STT_FUNC, is defined and with LSB in value set.
4896 thumb_bit =
4897 (((gsym->type() == elfcpp::STT_ARM_TFUNC)
4898 || (gsym->type() == elfcpp::STT_FUNC
4899 && !gsym->is_undefined()
4900 && ((psymval->value(object, 0) & 1) != 0)))
4902 : 0);
4905 else
4907 // This is a local symbol. Determine if the final target is THUMB.
4908 // We saved this information when all the local symbols were read.
4909 elfcpp::Elf_types<32>::Elf_WXword r_info = rel.get_r_info();
4910 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
4911 thumb_bit = object->local_symbol_is_thumb_function(r_sym) ? 1 : 0;
4914 else
4916 // This is a fake relocation synthesized for a stub. It does not have
4917 // a real symbol. We just look at the LSB of the symbol value to
4918 // determine if the target is THUMB or not.
4919 thumb_bit = ((psymval->value(object, 0) & 1) != 0);
4922 // Strip LSB if this points to a THUMB target.
4923 if (thumb_bit != 0
4924 && Target_arm<big_endian>::reloc_uses_thumb_bit(r_type)
4925 && ((psymval->value(object, 0) & 1) != 0))
4927 Arm_address stripped_value =
4928 psymval->value(object, 0) & ~static_cast<Arm_address>(1);
4929 symval.set_output_value(stripped_value);
4930 psymval = &symval;
4933 // Get the GOT offset if needed.
4934 // The GOT pointer points to the end of the GOT section.
4935 // We need to subtract the size of the GOT section to get
4936 // the actual offset to use in the relocation.
4937 bool have_got_offset = false;
4938 unsigned int got_offset = 0;
4939 switch (r_type)
4941 case elfcpp::R_ARM_GOT_BREL:
4942 case elfcpp::R_ARM_GOT_PREL:
4943 if (gsym != NULL)
4945 gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
4946 got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
4947 - target->got_size());
4949 else
4951 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
4952 gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD));
4953 got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
4954 - target->got_size());
4956 have_got_offset = true;
4957 break;
4959 default:
4960 break;
4963 // To look up relocation stubs, we need to pass the symbol table index of
4964 // a local symbol.
4965 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
4967 typename Arm_relocate_functions::Status reloc_status =
4968 Arm_relocate_functions::STATUS_OKAY;
4969 switch (r_type)
4971 case elfcpp::R_ARM_NONE:
4972 break;
4974 case elfcpp::R_ARM_ABS8:
4975 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
4976 output_section))
4977 reloc_status = Arm_relocate_functions::abs8(view, object, psymval);
4978 break;
4980 case elfcpp::R_ARM_ABS12:
4981 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
4982 output_section))
4983 reloc_status = Arm_relocate_functions::abs12(view, object, psymval);
4984 break;
4986 case elfcpp::R_ARM_ABS16:
4987 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
4988 output_section))
4989 reloc_status = Arm_relocate_functions::abs16(view, object, psymval);
4990 break;
4992 case elfcpp::R_ARM_ABS32:
4993 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
4994 output_section))
4995 reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
4996 thumb_bit);
4997 break;
4999 case elfcpp::R_ARM_ABS32_NOI:
5000 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
5001 output_section))
5002 // No thumb bit for this relocation: (S + A)
5003 reloc_status = Arm_relocate_functions::abs32(view, object, psymval,
5005 break;
5007 case elfcpp::R_ARM_MOVW_ABS_NC:
5008 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
5009 output_section))
5010 reloc_status = Arm_relocate_functions::movw_abs_nc(view, object,
5011 psymval,
5012 thumb_bit);
5013 else
5014 gold_error(_("relocation R_ARM_MOVW_ABS_NC cannot be used when making"
5015 "a shared object; recompile with -fPIC"));
5016 break;
5018 case elfcpp::R_ARM_MOVT_ABS:
5019 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
5020 output_section))
5021 reloc_status = Arm_relocate_functions::movt_abs(view, object, psymval);
5022 else
5023 gold_error(_("relocation R_ARM_MOVT_ABS cannot be used when making"
5024 "a shared object; recompile with -fPIC"));
5025 break;
5027 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
5028 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
5029 output_section))
5030 reloc_status = Arm_relocate_functions::thm_movw_abs_nc(view, object,
5031 psymval,
5032 thumb_bit);
5033 else
5034 gold_error(_("relocation R_ARM_THM_MOVW_ABS_NC cannot be used when"
5035 "making a shared object; recompile with -fPIC"));
5036 break;
5038 case elfcpp::R_ARM_THM_MOVT_ABS:
5039 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
5040 output_section))
5041 reloc_status = Arm_relocate_functions::thm_movt_abs(view, object,
5042 psymval);
5043 else
5044 gold_error(_("relocation R_ARM_THM_MOVT_ABS cannot be used when"
5045 "making a shared object; recompile with -fPIC"));
5046 break;
5048 case elfcpp::R_ARM_MOVW_PREL_NC:
5049 reloc_status = Arm_relocate_functions::movw_prel_nc(view, object,
5050 psymval, address,
5051 thumb_bit);
5052 break;
5054 case elfcpp::R_ARM_MOVT_PREL:
5055 reloc_status = Arm_relocate_functions::movt_prel(view, object,
5056 psymval, address);
5057 break;
5059 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
5060 reloc_status = Arm_relocate_functions::thm_movw_prel_nc(view, object,
5061 psymval, address,
5062 thumb_bit);
5063 break;
5065 case elfcpp::R_ARM_THM_MOVT_PREL:
5066 reloc_status = Arm_relocate_functions::thm_movt_prel(view, object,
5067 psymval, address);
5068 break;
5070 case elfcpp::R_ARM_REL32:
5071 reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
5072 address, thumb_bit);
5073 break;
5075 case elfcpp::R_ARM_THM_ABS5:
5076 if (should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, false,
5077 output_section))
5078 reloc_status = Arm_relocate_functions::thm_abs5(view, object, psymval);
5079 break;
5081 case elfcpp::R_ARM_THM_CALL:
5082 reloc_status =
5083 Arm_relocate_functions::thm_call(relinfo, view, gsym, object, r_sym,
5084 psymval, address, thumb_bit,
5085 is_weakly_undefined_without_plt);
5086 break;
5088 case elfcpp::R_ARM_XPC25:
5089 reloc_status =
5090 Arm_relocate_functions::xpc25(relinfo, view, gsym, object, r_sym,
5091 psymval, address, thumb_bit,
5092 is_weakly_undefined_without_plt);
5093 break;
5095 case elfcpp::R_ARM_THM_XPC22:
5096 reloc_status =
5097 Arm_relocate_functions::thm_xpc22(relinfo, view, gsym, object, r_sym,
5098 psymval, address, thumb_bit,
5099 is_weakly_undefined_without_plt);
5100 break;
5102 case elfcpp::R_ARM_GOTOFF32:
5104 Arm_address got_origin;
5105 got_origin = target->got_plt_section()->address();
5106 reloc_status = Arm_relocate_functions::rel32(view, object, psymval,
5107 got_origin, thumb_bit);
5109 break;
5111 case elfcpp::R_ARM_BASE_PREL:
5113 uint32_t origin;
5114 // Get the addressing origin of the output segment defining the
5115 // symbol gsym (AAELF 4.6.1.2 Relocation types)
5116 gold_assert(gsym != NULL);
5117 if (gsym->source() == Symbol::IN_OUTPUT_SEGMENT)
5118 origin = gsym->output_segment()->vaddr();
5119 else if (gsym->source () == Symbol::IN_OUTPUT_DATA)
5120 origin = gsym->output_data()->address();
5121 else
5123 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
5124 _("cannot find origin of R_ARM_BASE_PREL"));
5125 return true;
5127 reloc_status = Arm_relocate_functions::base_prel(view, origin, address);
5129 break;
5131 case elfcpp::R_ARM_BASE_ABS:
5133 if (!should_apply_static_reloc(gsym, Symbol::ABSOLUTE_REF, true,
5134 output_section))
5135 break;
5137 uint32_t origin;
5138 // Get the addressing origin of the output segment defining
5139 // the symbol gsym (AAELF 4.6.1.2 Relocation types).
5140 if (gsym == NULL)
5141 // R_ARM_BASE_ABS with the NULL symbol will give the
5142 // absolute address of the GOT origin (GOT_ORG) (see ARM IHI
5143 // 0044C (AAELF): 4.6.1.8 Proxy generating relocations).
5144 origin = target->got_plt_section()->address();
5145 else if (gsym->source() == Symbol::IN_OUTPUT_SEGMENT)
5146 origin = gsym->output_segment()->vaddr();
5147 else if (gsym->source () == Symbol::IN_OUTPUT_DATA)
5148 origin = gsym->output_data()->address();
5149 else
5151 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
5152 _("cannot find origin of R_ARM_BASE_ABS"));
5153 return true;
5156 reloc_status = Arm_relocate_functions::base_abs(view, origin);
5158 break;
5160 case elfcpp::R_ARM_GOT_BREL:
5161 gold_assert(have_got_offset);
5162 reloc_status = Arm_relocate_functions::got_brel(view, got_offset);
5163 break;
5165 case elfcpp::R_ARM_GOT_PREL:
5166 gold_assert(have_got_offset);
5167 // Get the address origin for GOT PLT, which is allocated right
5168 // after the GOT section, to calculate an absolute address of
5169 // the symbol GOT entry (got_origin + got_offset).
5170 Arm_address got_origin;
5171 got_origin = target->got_plt_section()->address();
5172 reloc_status = Arm_relocate_functions::got_prel(view,
5173 got_origin + got_offset,
5174 address);
5175 break;
5177 case elfcpp::R_ARM_PLT32:
5178 gold_assert(gsym == NULL
5179 || gsym->has_plt_offset()
5180 || gsym->final_value_is_known()
5181 || (gsym->is_defined()
5182 && !gsym->is_from_dynobj()
5183 && !gsym->is_preemptible()));
5184 reloc_status =
5185 Arm_relocate_functions::plt32(relinfo, view, gsym, object, r_sym,
5186 psymval, address, thumb_bit,
5187 is_weakly_undefined_without_plt);
5188 break;
5190 case elfcpp::R_ARM_CALL:
5191 reloc_status =
5192 Arm_relocate_functions::call(relinfo, view, gsym, object, r_sym,
5193 psymval, address, thumb_bit,
5194 is_weakly_undefined_without_plt);
5195 break;
5197 case elfcpp::R_ARM_JUMP24:
5198 reloc_status =
5199 Arm_relocate_functions::jump24(relinfo, view, gsym, object, r_sym,
5200 psymval, address, thumb_bit,
5201 is_weakly_undefined_without_plt);
5202 break;
5204 case elfcpp::R_ARM_THM_JUMP24:
5205 reloc_status =
5206 Arm_relocate_functions::thm_jump24(relinfo, view, gsym, object, r_sym,
5207 psymval, address, thumb_bit,
5208 is_weakly_undefined_without_plt);
5209 break;
5211 case elfcpp::R_ARM_PREL31:
5212 reloc_status = Arm_relocate_functions::prel31(view, object, psymval,
5213 address, thumb_bit);
5214 break;
5216 case elfcpp::R_ARM_TARGET1:
5217 // This should have been mapped to another type already.
5218 // Fall through.
5219 case elfcpp::R_ARM_COPY:
5220 case elfcpp::R_ARM_GLOB_DAT:
5221 case elfcpp::R_ARM_JUMP_SLOT:
5222 case elfcpp::R_ARM_RELATIVE:
5223 // These are relocations which should only be seen by the
5224 // dynamic linker, and should never be seen here.
5225 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
5226 _("unexpected reloc %u in object file"),
5227 r_type);
5228 break;
5230 default:
5231 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
5232 _("unsupported reloc %u"),
5233 r_type);
5234 break;
5237 // Report any errors.
5238 switch (reloc_status)
5240 case Arm_relocate_functions::STATUS_OKAY:
5241 break;
5242 case Arm_relocate_functions::STATUS_OVERFLOW:
5243 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
5244 _("relocation overflow in relocation %u"),
5245 r_type);
5246 break;
5247 case Arm_relocate_functions::STATUS_BAD_RELOC:
5248 gold_error_at_location(
5249 relinfo,
5250 relnum,
5251 rel.get_r_offset(),
5252 _("unexpected opcode while processing relocation %u"),
5253 r_type);
5254 break;
5255 default:
5256 gold_unreachable();
5259 return true;
5262 // Relocate section data.
5264 template<bool big_endian>
5265 void
5266 Target_arm<big_endian>::relocate_section(
5267 const Relocate_info<32, big_endian>* relinfo,
5268 unsigned int sh_type,
5269 const unsigned char* prelocs,
5270 size_t reloc_count,
5271 Output_section* output_section,
5272 bool needs_special_offset_handling,
5273 unsigned char* view,
5274 Arm_address address,
5275 section_size_type view_size,
5276 const Reloc_symbol_changes* reloc_symbol_changes)
5278 typedef typename Target_arm<big_endian>::Relocate Arm_relocate;
5279 gold_assert(sh_type == elfcpp::SHT_REL);
5281 Arm_input_section<big_endian>* arm_input_section =
5282 this->find_arm_input_section(relinfo->object, relinfo->data_shndx);
5284 // This is an ARM input section and the view covers the whole output
5285 // section.
5286 if (arm_input_section != NULL)
5288 gold_assert(needs_special_offset_handling);
5289 Arm_address section_address = arm_input_section->address();
5290 section_size_type section_size = arm_input_section->data_size();
5292 gold_assert((arm_input_section->address() >= address)
5293 && ((arm_input_section->address()
5294 + arm_input_section->data_size())
5295 <= (address + view_size)));
5297 off_t offset = section_address - address;
5298 view += offset;
5299 address += offset;
5300 view_size = section_size;
5303 gold::relocate_section<32, big_endian, Target_arm, elfcpp::SHT_REL,
5304 Arm_relocate>(
5305 relinfo,
5306 this,
5307 prelocs,
5308 reloc_count,
5309 output_section,
5310 needs_special_offset_handling,
5311 view,
5312 address,
5313 view_size,
5314 reloc_symbol_changes);
5317 // Return the size of a relocation while scanning during a relocatable
5318 // link.
5320 template<bool big_endian>
5321 unsigned int
5322 Target_arm<big_endian>::Relocatable_size_for_reloc::get_size_for_reloc(
5323 unsigned int r_type,
5324 Relobj* object)
5326 r_type = get_real_reloc_type(r_type);
5327 switch (r_type)
5329 case elfcpp::R_ARM_NONE:
5330 return 0;
5332 case elfcpp::R_ARM_ABS8:
5333 return 1;
5335 case elfcpp::R_ARM_ABS16:
5336 case elfcpp::R_ARM_THM_ABS5:
5337 return 2;
5339 case elfcpp::R_ARM_ABS32:
5340 case elfcpp::R_ARM_ABS32_NOI:
5341 case elfcpp::R_ARM_ABS12:
5342 case elfcpp::R_ARM_BASE_ABS:
5343 case elfcpp::R_ARM_REL32:
5344 case elfcpp::R_ARM_THM_CALL:
5345 case elfcpp::R_ARM_GOTOFF32:
5346 case elfcpp::R_ARM_BASE_PREL:
5347 case elfcpp::R_ARM_GOT_BREL:
5348 case elfcpp::R_ARM_GOT_PREL:
5349 case elfcpp::R_ARM_PLT32:
5350 case elfcpp::R_ARM_CALL:
5351 case elfcpp::R_ARM_JUMP24:
5352 case elfcpp::R_ARM_PREL31:
5353 case elfcpp::R_ARM_MOVW_ABS_NC:
5354 case elfcpp::R_ARM_MOVT_ABS:
5355 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
5356 case elfcpp::R_ARM_THM_MOVT_ABS:
5357 case elfcpp::R_ARM_MOVW_PREL_NC:
5358 case elfcpp::R_ARM_MOVT_PREL:
5359 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
5360 case elfcpp::R_ARM_THM_MOVT_PREL:
5361 return 4;
5363 case elfcpp::R_ARM_TARGET1:
5364 // This should have been mapped to another type already.
5365 // Fall through.
5366 case elfcpp::R_ARM_COPY:
5367 case elfcpp::R_ARM_GLOB_DAT:
5368 case elfcpp::R_ARM_JUMP_SLOT:
5369 case elfcpp::R_ARM_RELATIVE:
5370 // These are relocations which should only be seen by the
5371 // dynamic linker, and should never be seen here.
5372 gold_error(_("%s: unexpected reloc %u in object file"),
5373 object->name().c_str(), r_type);
5374 return 0;
5376 default:
5377 object->error(_("unsupported reloc %u in object file"), r_type);
5378 return 0;
5382 // Scan the relocs during a relocatable link.
5384 template<bool big_endian>
5385 void
5386 Target_arm<big_endian>::scan_relocatable_relocs(
5387 Symbol_table* symtab,
5388 Layout* layout,
5389 Sized_relobj<32, big_endian>* object,
5390 unsigned int data_shndx,
5391 unsigned int sh_type,
5392 const unsigned char* prelocs,
5393 size_t reloc_count,
5394 Output_section* output_section,
5395 bool needs_special_offset_handling,
5396 size_t local_symbol_count,
5397 const unsigned char* plocal_symbols,
5398 Relocatable_relocs* rr)
5400 gold_assert(sh_type == elfcpp::SHT_REL);
5402 typedef gold::Default_scan_relocatable_relocs<elfcpp::SHT_REL,
5403 Relocatable_size_for_reloc> Scan_relocatable_relocs;
5405 gold::scan_relocatable_relocs<32, big_endian, elfcpp::SHT_REL,
5406 Scan_relocatable_relocs>(
5407 symtab,
5408 layout,
5409 object,
5410 data_shndx,
5411 prelocs,
5412 reloc_count,
5413 output_section,
5414 needs_special_offset_handling,
5415 local_symbol_count,
5416 plocal_symbols,
5417 rr);
5420 // Relocate a section during a relocatable link.
5422 template<bool big_endian>
5423 void
5424 Target_arm<big_endian>::relocate_for_relocatable(
5425 const Relocate_info<32, big_endian>* relinfo,
5426 unsigned int sh_type,
5427 const unsigned char* prelocs,
5428 size_t reloc_count,
5429 Output_section* output_section,
5430 off_t offset_in_output_section,
5431 const Relocatable_relocs* rr,
5432 unsigned char* view,
5433 Arm_address view_address,
5434 section_size_type view_size,
5435 unsigned char* reloc_view,
5436 section_size_type reloc_view_size)
5438 gold_assert(sh_type == elfcpp::SHT_REL);
5440 gold::relocate_for_relocatable<32, big_endian, elfcpp::SHT_REL>(
5441 relinfo,
5442 prelocs,
5443 reloc_count,
5444 output_section,
5445 offset_in_output_section,
5447 view,
5448 view_address,
5449 view_size,
5450 reloc_view,
5451 reloc_view_size);
5454 // Return the value to use for a dynamic symbol which requires special
5455 // treatment. This is how we support equality comparisons of function
5456 // pointers across shared library boundaries, as described in the
5457 // processor specific ABI supplement.
5459 template<bool big_endian>
5460 uint64_t
5461 Target_arm<big_endian>::do_dynsym_value(const Symbol* gsym) const
5463 gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
5464 return this->plt_section()->address() + gsym->plt_offset();
5467 // Map platform-specific relocs to real relocs
5469 template<bool big_endian>
5470 unsigned int
5471 Target_arm<big_endian>::get_real_reloc_type (unsigned int r_type)
5473 switch (r_type)
5475 case elfcpp::R_ARM_TARGET1:
5476 // This is either R_ARM_ABS32 or R_ARM_REL32;
5477 return elfcpp::R_ARM_ABS32;
5479 case elfcpp::R_ARM_TARGET2:
5480 // This can be any reloc type but ususally is R_ARM_GOT_PREL
5481 return elfcpp::R_ARM_GOT_PREL;
5483 default:
5484 return r_type;
5488 // Whether if two EABI versions V1 and V2 are compatible.
5490 template<bool big_endian>
5491 bool
5492 Target_arm<big_endian>::are_eabi_versions_compatible(
5493 elfcpp::Elf_Word v1,
5494 elfcpp::Elf_Word v2)
5496 // v4 and v5 are the same spec before and after it was released,
5497 // so allow mixing them.
5498 if ((v1 == elfcpp::EF_ARM_EABI_VER4 && v2 == elfcpp::EF_ARM_EABI_VER5)
5499 || (v1 == elfcpp::EF_ARM_EABI_VER5 && v2 == elfcpp::EF_ARM_EABI_VER4))
5500 return true;
5502 return v1 == v2;
5505 // Combine FLAGS from an input object called NAME and the processor-specific
5506 // flags in the ELF header of the output. Much of this is adapted from the
5507 // processor-specific flags merging code in elf32_arm_merge_private_bfd_data
5508 // in bfd/elf32-arm.c.
5510 template<bool big_endian>
5511 void
5512 Target_arm<big_endian>::merge_processor_specific_flags(
5513 const std::string& name,
5514 elfcpp::Elf_Word flags)
5516 if (this->are_processor_specific_flags_set())
5518 elfcpp::Elf_Word out_flags = this->processor_specific_flags();
5520 // Nothing to merge if flags equal to those in output.
5521 if (flags == out_flags)
5522 return;
5524 // Complain about various flag mismatches.
5525 elfcpp::Elf_Word version1 = elfcpp::arm_eabi_version(flags);
5526 elfcpp::Elf_Word version2 = elfcpp::arm_eabi_version(out_flags);
5527 if (!this->are_eabi_versions_compatible(version1, version2))
5528 gold_error(_("Source object %s has EABI version %d but output has "
5529 "EABI version %d."),
5530 name.c_str(),
5531 (flags & elfcpp::EF_ARM_EABIMASK) >> 24,
5532 (out_flags & elfcpp::EF_ARM_EABIMASK) >> 24);
5534 else
5536 // If the input is the default architecture and had the default
5537 // flags then do not bother setting the flags for the output
5538 // architecture, instead allow future merges to do this. If no
5539 // future merges ever set these flags then they will retain their
5540 // uninitialised values, which surprise surprise, correspond
5541 // to the default values.
5542 if (flags == 0)
5543 return;
5545 // This is the first time, just copy the flags.
5546 // We only copy the EABI version for now.
5547 this->set_processor_specific_flags(flags & elfcpp::EF_ARM_EABIMASK);
5551 // Adjust ELF file header.
5552 template<bool big_endian>
5553 void
5554 Target_arm<big_endian>::do_adjust_elf_header(
5555 unsigned char* view,
5556 int len) const
5558 gold_assert(len == elfcpp::Elf_sizes<32>::ehdr_size);
5560 elfcpp::Ehdr<32, big_endian> ehdr(view);
5561 unsigned char e_ident[elfcpp::EI_NIDENT];
5562 memcpy(e_ident, ehdr.get_e_ident(), elfcpp::EI_NIDENT);
5564 if (elfcpp::arm_eabi_version(this->processor_specific_flags())
5565 == elfcpp::EF_ARM_EABI_UNKNOWN)
5566 e_ident[elfcpp::EI_OSABI] = elfcpp::ELFOSABI_ARM;
5567 else
5568 e_ident[elfcpp::EI_OSABI] = 0;
5569 e_ident[elfcpp::EI_ABIVERSION] = 0;
5571 // FIXME: Do EF_ARM_BE8 adjustment.
5573 elfcpp::Ehdr_write<32, big_endian> oehdr(view);
5574 oehdr.put_e_ident(e_ident);
5577 // do_make_elf_object to override the same function in the base class.
5578 // We need to use a target-specific sub-class of Sized_relobj<32, big_endian>
5579 // to store ARM specific information. Hence we need to have our own
5580 // ELF object creation.
5582 template<bool big_endian>
5583 Object*
5584 Target_arm<big_endian>::do_make_elf_object(
5585 const std::string& name,
5586 Input_file* input_file,
5587 off_t offset, const elfcpp::Ehdr<32, big_endian>& ehdr)
5589 int et = ehdr.get_e_type();
5590 if (et == elfcpp::ET_REL)
5592 Arm_relobj<big_endian>* obj =
5593 new Arm_relobj<big_endian>(name, input_file, offset, ehdr);
5594 obj->setup();
5595 return obj;
5597 else if (et == elfcpp::ET_DYN)
5599 Sized_dynobj<32, big_endian>* obj =
5600 new Arm_dynobj<big_endian>(name, input_file, offset, ehdr);
5601 obj->setup();
5602 return obj;
5604 else
5606 gold_error(_("%s: unsupported ELF file type %d"),
5607 name.c_str(), et);
5608 return NULL;
5612 // Read the architecture from the Tag_also_compatible_with attribute, if any.
5613 // Returns -1 if no architecture could be read.
5614 // This is adapted from get_secondary_compatible_arch() in bfd/elf32-arm.c.
5616 template<bool big_endian>
5618 Target_arm<big_endian>::get_secondary_compatible_arch(
5619 const Attributes_section_data* pasd)
5621 const Object_attribute *known_attributes =
5622 pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
5624 // Note: the tag and its argument below are uleb128 values, though
5625 // currently-defined values fit in one byte for each.
5626 const std::string& sv =
5627 known_attributes[elfcpp::Tag_also_compatible_with].string_value();
5628 if (sv.size() == 2
5629 && sv.data()[0] == elfcpp::Tag_CPU_arch
5630 && (sv.data()[1] & 128) != 128)
5631 return sv.data()[1];
5633 // This tag is "safely ignorable", so don't complain if it looks funny.
5634 return -1;
5637 // Set, or unset, the architecture of the Tag_also_compatible_with attribute.
5638 // The tag is removed if ARCH is -1.
5639 // This is adapted from set_secondary_compatible_arch() in bfd/elf32-arm.c.
5641 template<bool big_endian>
5642 void
5643 Target_arm<big_endian>::set_secondary_compatible_arch(
5644 Attributes_section_data* pasd,
5645 int arch)
5647 Object_attribute *known_attributes =
5648 pasd->known_attributes(Object_attribute::OBJ_ATTR_PROC);
5650 if (arch == -1)
5652 known_attributes[elfcpp::Tag_also_compatible_with].set_string_value("");
5653 return;
5656 // Note: the tag and its argument below are uleb128 values, though
5657 // currently-defined values fit in one byte for each.
5658 char sv[3];
5659 sv[0] = elfcpp::Tag_CPU_arch;
5660 gold_assert(arch != 0);
5661 sv[1] = arch;
5662 sv[2] = '\0';
5664 known_attributes[elfcpp::Tag_also_compatible_with].set_string_value(sv);
5667 // Combine two values for Tag_CPU_arch, taking secondary compatibility tags
5668 // into account.
5669 // This is adapted from tag_cpu_arch_combine() in bfd/elf32-arm.c.
5671 template<bool big_endian>
5673 Target_arm<big_endian>::tag_cpu_arch_combine(
5674 const char* name,
5675 int oldtag,
5676 int* secondary_compat_out,
5677 int newtag,
5678 int secondary_compat)
5680 #define T(X) elfcpp::TAG_CPU_ARCH_##X
5681 static const int v6t2[] =
5683 T(V6T2), // PRE_V4.
5684 T(V6T2), // V4.
5685 T(V6T2), // V4T.
5686 T(V6T2), // V5T.
5687 T(V6T2), // V5TE.
5688 T(V6T2), // V5TEJ.
5689 T(V6T2), // V6.
5690 T(V7), // V6KZ.
5691 T(V6T2) // V6T2.
5693 static const int v6k[] =
5695 T(V6K), // PRE_V4.
5696 T(V6K), // V4.
5697 T(V6K), // V4T.
5698 T(V6K), // V5T.
5699 T(V6K), // V5TE.
5700 T(V6K), // V5TEJ.
5701 T(V6K), // V6.
5702 T(V6KZ), // V6KZ.
5703 T(V7), // V6T2.
5704 T(V6K) // V6K.
5706 static const int v7[] =
5708 T(V7), // PRE_V4.
5709 T(V7), // V4.
5710 T(V7), // V4T.
5711 T(V7), // V5T.
5712 T(V7), // V5TE.
5713 T(V7), // V5TEJ.
5714 T(V7), // V6.
5715 T(V7), // V6KZ.
5716 T(V7), // V6T2.
5717 T(V7), // V6K.
5718 T(V7) // V7.
5720 static const int v6_m[] =
5722 -1, // PRE_V4.
5723 -1, // V4.
5724 T(V6K), // V4T.
5725 T(V6K), // V5T.
5726 T(V6K), // V5TE.
5727 T(V6K), // V5TEJ.
5728 T(V6K), // V6.
5729 T(V6KZ), // V6KZ.
5730 T(V7), // V6T2.
5731 T(V6K), // V6K.
5732 T(V7), // V7.
5733 T(V6_M) // V6_M.
5735 static const int v6s_m[] =
5737 -1, // PRE_V4.
5738 -1, // V4.
5739 T(V6K), // V4T.
5740 T(V6K), // V5T.
5741 T(V6K), // V5TE.
5742 T(V6K), // V5TEJ.
5743 T(V6K), // V6.
5744 T(V6KZ), // V6KZ.
5745 T(V7), // V6T2.
5746 T(V6K), // V6K.
5747 T(V7), // V7.
5748 T(V6S_M), // V6_M.
5749 T(V6S_M) // V6S_M.
5751 static const int v7e_m[] =
5753 -1, // PRE_V4.
5754 -1, // V4.
5755 T(V7E_M), // V4T.
5756 T(V7E_M), // V5T.
5757 T(V7E_M), // V5TE.
5758 T(V7E_M), // V5TEJ.
5759 T(V7E_M), // V6.
5760 T(V7E_M), // V6KZ.
5761 T(V7E_M), // V6T2.
5762 T(V7E_M), // V6K.
5763 T(V7E_M), // V7.
5764 T(V7E_M), // V6_M.
5765 T(V7E_M), // V6S_M.
5766 T(V7E_M) // V7E_M.
5768 static const int v4t_plus_v6_m[] =
5770 -1, // PRE_V4.
5771 -1, // V4.
5772 T(V4T), // V4T.
5773 T(V5T), // V5T.
5774 T(V5TE), // V5TE.
5775 T(V5TEJ), // V5TEJ.
5776 T(V6), // V6.
5777 T(V6KZ), // V6KZ.
5778 T(V6T2), // V6T2.
5779 T(V6K), // V6K.
5780 T(V7), // V7.
5781 T(V6_M), // V6_M.
5782 T(V6S_M), // V6S_M.
5783 T(V7E_M), // V7E_M.
5784 T(V4T_PLUS_V6_M) // V4T plus V6_M.
5786 static const int *comb[] =
5788 v6t2,
5789 v6k,
5791 v6_m,
5792 v6s_m,
5793 v7e_m,
5794 // Pseudo-architecture.
5795 v4t_plus_v6_m
5798 // Check we've not got a higher architecture than we know about.
5800 if (oldtag >= elfcpp::MAX_TAG_CPU_ARCH || newtag >= elfcpp::MAX_TAG_CPU_ARCH)
5802 gold_error(_("%s: unknown CPU architecture"), name);
5803 return -1;
5806 // Override old tag if we have a Tag_also_compatible_with on the output.
5808 if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
5809 || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
5810 oldtag = T(V4T_PLUS_V6_M);
5812 // And override the new tag if we have a Tag_also_compatible_with on the
5813 // input.
5815 if ((newtag == T(V6_M) && secondary_compat == T(V4T))
5816 || (newtag == T(V4T) && secondary_compat == T(V6_M)))
5817 newtag = T(V4T_PLUS_V6_M);
5819 // Architectures before V6KZ add features monotonically.
5820 int tagh = std::max(oldtag, newtag);
5821 if (tagh <= elfcpp::TAG_CPU_ARCH_V6KZ)
5822 return tagh;
5824 int tagl = std::min(oldtag, newtag);
5825 int result = comb[tagh - T(V6T2)][tagl];
5827 // Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
5828 // as the canonical version.
5829 if (result == T(V4T_PLUS_V6_M))
5831 result = T(V4T);
5832 *secondary_compat_out = T(V6_M);
5834 else
5835 *secondary_compat_out = -1;
5837 if (result == -1)
5839 gold_error(_("%s: conflicting CPU architectures %d/%d"),
5840 name, oldtag, newtag);
5841 return -1;
5844 return result;
5845 #undef T
5848 // Helper to print AEABI enum tag value.
5850 template<bool big_endian>
5851 std::string
5852 Target_arm<big_endian>::aeabi_enum_name(unsigned int value)
5854 static const char *aeabi_enum_names[] =
5855 { "", "variable-size", "32-bit", "" };
5856 const size_t aeabi_enum_names_size =
5857 sizeof(aeabi_enum_names) / sizeof(aeabi_enum_names[0]);
5859 if (value < aeabi_enum_names_size)
5860 return std::string(aeabi_enum_names[value]);
5861 else
5863 char buffer[100];
5864 sprintf(buffer, "<unknown value %u>", value);
5865 return std::string(buffer);
5869 // Return the string value to store in TAG_CPU_name.
5871 template<bool big_endian>
5872 std::string
5873 Target_arm<big_endian>::tag_cpu_name_value(unsigned int value)
5875 static const char *name_table[] = {
5876 // These aren't real CPU names, but we can't guess
5877 // that from the architecture version alone.
5878 "Pre v4",
5879 "ARM v4",
5880 "ARM v4T",
5881 "ARM v5T",
5882 "ARM v5TE",
5883 "ARM v5TEJ",
5884 "ARM v6",
5885 "ARM v6KZ",
5886 "ARM v6T2",
5887 "ARM v6K",
5888 "ARM v7",
5889 "ARM v6-M",
5890 "ARM v6S-M",
5891 "ARM v7E-M"
5893 const size_t name_table_size = sizeof(name_table) / sizeof(name_table[0]);
5895 if (value < name_table_size)
5896 return std::string(name_table[value]);
5897 else
5899 char buffer[100];
5900 sprintf(buffer, "<unknown CPU value %u>", value);
5901 return std::string(buffer);
5905 // Merge object attributes from input file called NAME with those of the
5906 // output. The input object attributes are in the object pointed by PASD.
5908 template<bool big_endian>
5909 void
5910 Target_arm<big_endian>::merge_object_attributes(
5911 const char* name,
5912 const Attributes_section_data* pasd)
5914 // Return if there is no attributes section data.
5915 if (pasd == NULL)
5916 return;
5918 // If output has no object attributes, just copy.
5919 if (this->attributes_section_data_ == NULL)
5921 this->attributes_section_data_ = new Attributes_section_data(*pasd);
5922 return;
5925 const int vendor = Object_attribute::OBJ_ATTR_PROC;
5926 const Object_attribute* in_attr = pasd->known_attributes(vendor);
5927 Object_attribute* out_attr =
5928 this->attributes_section_data_->known_attributes(vendor);
5930 // This needs to happen before Tag_ABI_FP_number_model is merged. */
5931 if (in_attr[elfcpp::Tag_ABI_VFP_args].int_value()
5932 != out_attr[elfcpp::Tag_ABI_VFP_args].int_value())
5934 // Ignore mismatches if the object doesn't use floating point. */
5935 if (out_attr[elfcpp::Tag_ABI_FP_number_model].int_value() == 0)
5936 out_attr[elfcpp::Tag_ABI_VFP_args].set_int_value(
5937 in_attr[elfcpp::Tag_ABI_VFP_args].int_value());
5938 else if (in_attr[elfcpp::Tag_ABI_FP_number_model].int_value() != 0)
5939 gold_error(_("%s uses VFP register arguments, output does not"),
5940 name);
5943 for (int i = 4; i < Vendor_object_attributes::NUM_KNOWN_ATTRIBUTES; ++i)
5945 // Merge this attribute with existing attributes.
5946 switch (i)
5948 case elfcpp::Tag_CPU_raw_name:
5949 case elfcpp::Tag_CPU_name:
5950 // These are merged after Tag_CPU_arch.
5951 break;
5953 case elfcpp::Tag_ABI_optimization_goals:
5954 case elfcpp::Tag_ABI_FP_optimization_goals:
5955 // Use the first value seen.
5956 break;
5958 case elfcpp::Tag_CPU_arch:
5960 unsigned int saved_out_attr = out_attr->int_value();
5961 // Merge Tag_CPU_arch and Tag_also_compatible_with.
5962 int secondary_compat =
5963 this->get_secondary_compatible_arch(pasd);
5964 int secondary_compat_out =
5965 this->get_secondary_compatible_arch(
5966 this->attributes_section_data_);
5967 out_attr[i].set_int_value(
5968 tag_cpu_arch_combine(name, out_attr[i].int_value(),
5969 &secondary_compat_out,
5970 in_attr[i].int_value(),
5971 secondary_compat));
5972 this->set_secondary_compatible_arch(this->attributes_section_data_,
5973 secondary_compat_out);
5975 // Merge Tag_CPU_name and Tag_CPU_raw_name.
5976 if (out_attr[i].int_value() == saved_out_attr)
5977 ; // Leave the names alone.
5978 else if (out_attr[i].int_value() == in_attr[i].int_value())
5980 // The output architecture has been changed to match the
5981 // input architecture. Use the input names.
5982 out_attr[elfcpp::Tag_CPU_name].set_string_value(
5983 in_attr[elfcpp::Tag_CPU_name].string_value());
5984 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value(
5985 in_attr[elfcpp::Tag_CPU_raw_name].string_value());
5987 else
5989 out_attr[elfcpp::Tag_CPU_name].set_string_value("");
5990 out_attr[elfcpp::Tag_CPU_raw_name].set_string_value("");
5993 // If we still don't have a value for Tag_CPU_name,
5994 // make one up now. Tag_CPU_raw_name remains blank.
5995 if (out_attr[elfcpp::Tag_CPU_name].string_value() == "")
5997 const std::string cpu_name =
5998 this->tag_cpu_name_value(out_attr[i].int_value());
5999 // FIXME: If we see an unknown CPU, this will be set
6000 // to "<unknown CPU n>", where n is the attribute value.
6001 // This is different from BFD, which leaves the name alone.
6002 out_attr[elfcpp::Tag_CPU_name].set_string_value(cpu_name);
6005 break;
6007 case elfcpp::Tag_ARM_ISA_use:
6008 case elfcpp::Tag_THUMB_ISA_use:
6009 case elfcpp::Tag_WMMX_arch:
6010 case elfcpp::Tag_Advanced_SIMD_arch:
6011 // ??? Do Advanced_SIMD (NEON) and WMMX conflict?
6012 case elfcpp::Tag_ABI_FP_rounding:
6013 case elfcpp::Tag_ABI_FP_exceptions:
6014 case elfcpp::Tag_ABI_FP_user_exceptions:
6015 case elfcpp::Tag_ABI_FP_number_model:
6016 case elfcpp::Tag_VFP_HP_extension:
6017 case elfcpp::Tag_CPU_unaligned_access:
6018 case elfcpp::Tag_T2EE_use:
6019 case elfcpp::Tag_Virtualization_use:
6020 case elfcpp::Tag_MPextension_use:
6021 // Use the largest value specified.
6022 if (in_attr[i].int_value() > out_attr[i].int_value())
6023 out_attr[i].set_int_value(in_attr[i].int_value());
6024 break;
6026 case elfcpp::Tag_ABI_align8_preserved:
6027 case elfcpp::Tag_ABI_PCS_RO_data:
6028 // Use the smallest value specified.
6029 if (in_attr[i].int_value() < out_attr[i].int_value())
6030 out_attr[i].set_int_value(in_attr[i].int_value());
6031 break;
6033 case elfcpp::Tag_ABI_align8_needed:
6034 if ((in_attr[i].int_value() > 0 || out_attr[i].int_value() > 0)
6035 && (in_attr[elfcpp::Tag_ABI_align8_preserved].int_value() == 0
6036 || (out_attr[elfcpp::Tag_ABI_align8_preserved].int_value()
6037 == 0)))
6039 // This error message should be enabled once all non-conformant
6040 // binaries in the toolchain have had the attributes set
6041 // properly.
6042 // gold_error(_("output 8-byte data alignment conflicts with %s"),
6043 // name);
6045 // Fall through.
6046 case elfcpp::Tag_ABI_FP_denormal:
6047 case elfcpp::Tag_ABI_PCS_GOT_use:
6049 // These tags have 0 = don't care, 1 = strong requirement,
6050 // 2 = weak requirement.
6051 static const int order_021[3] = {0, 2, 1};
6053 // Use the "greatest" from the sequence 0, 2, 1, or the largest
6054 // value if greater than 2 (for future-proofing).
6055 if ((in_attr[i].int_value() > 2
6056 && in_attr[i].int_value() > out_attr[i].int_value())
6057 || (in_attr[i].int_value() <= 2
6058 && out_attr[i].int_value() <= 2
6059 && (order_021[in_attr[i].int_value()]
6060 > order_021[out_attr[i].int_value()])))
6061 out_attr[i].set_int_value(in_attr[i].int_value());
6063 break;
6065 case elfcpp::Tag_CPU_arch_profile:
6066 if (out_attr[i].int_value() != in_attr[i].int_value())
6068 // 0 will merge with anything.
6069 // 'A' and 'S' merge to 'A'.
6070 // 'R' and 'S' merge to 'R'.
6071 // 'M' and 'A|R|S' is an error.
6072 if (out_attr[i].int_value() == 0
6073 || (out_attr[i].int_value() == 'S'
6074 && (in_attr[i].int_value() == 'A'
6075 || in_attr[i].int_value() == 'R')))
6076 out_attr[i].set_int_value(in_attr[i].int_value());
6077 else if (in_attr[i].int_value() == 0
6078 || (in_attr[i].int_value() == 'S'
6079 && (out_attr[i].int_value() == 'A'
6080 || out_attr[i].int_value() == 'R')))
6081 ; // Do nothing.
6082 else
6084 gold_error
6085 (_("conflicting architecture profiles %c/%c"),
6086 in_attr[i].int_value() ? in_attr[i].int_value() : '0',
6087 out_attr[i].int_value() ? out_attr[i].int_value() : '0');
6090 break;
6091 case elfcpp::Tag_VFP_arch:
6093 static const struct
6095 int ver;
6096 int regs;
6097 } vfp_versions[7] =
6099 {0, 0},
6100 {1, 16},
6101 {2, 16},
6102 {3, 32},
6103 {3, 16},
6104 {4, 32},
6105 {4, 16}
6108 // Values greater than 6 aren't defined, so just pick the
6109 // biggest.
6110 if (in_attr[i].int_value() > 6
6111 && in_attr[i].int_value() > out_attr[i].int_value())
6113 *out_attr = *in_attr;
6114 break;
6116 // The output uses the superset of input features
6117 // (ISA version) and registers.
6118 int ver = std::max(vfp_versions[in_attr[i].int_value()].ver,
6119 vfp_versions[out_attr[i].int_value()].ver);
6120 int regs = std::max(vfp_versions[in_attr[i].int_value()].regs,
6121 vfp_versions[out_attr[i].int_value()].regs);
6122 // This assumes all possible supersets are also a valid
6123 // options.
6124 int newval;
6125 for (newval = 6; newval > 0; newval--)
6127 if (regs == vfp_versions[newval].regs
6128 && ver == vfp_versions[newval].ver)
6129 break;
6131 out_attr[i].set_int_value(newval);
6133 break;
6134 case elfcpp::Tag_PCS_config:
6135 if (out_attr[i].int_value() == 0)
6136 out_attr[i].set_int_value(in_attr[i].int_value());
6137 else if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
6139 // It's sometimes ok to mix different configs, so this is only
6140 // a warning.
6141 gold_warning(_("%s: conflicting platform configuration"), name);
6143 break;
6144 case elfcpp::Tag_ABI_PCS_R9_use:
6145 if (in_attr[i].int_value() != out_attr[i].int_value()
6146 && out_attr[i].int_value() != elfcpp::AEABI_R9_unused
6147 && in_attr[i].int_value() != elfcpp::AEABI_R9_unused)
6149 gold_error(_("%s: conflicting use of R9"), name);
6151 if (out_attr[i].int_value() == elfcpp::AEABI_R9_unused)
6152 out_attr[i].set_int_value(in_attr[i].int_value());
6153 break;
6154 case elfcpp::Tag_ABI_PCS_RW_data:
6155 if (in_attr[i].int_value() == elfcpp::AEABI_PCS_RW_data_SBrel
6156 && (in_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
6157 != elfcpp::AEABI_R9_SB)
6158 && (out_attr[elfcpp::Tag_ABI_PCS_R9_use].int_value()
6159 != elfcpp::AEABI_R9_unused))
6161 gold_error(_("%s: SB relative addressing conflicts with use "
6162 "of R9"),
6163 name);
6165 // Use the smallest value specified.
6166 if (in_attr[i].int_value() < out_attr[i].int_value())
6167 out_attr[i].set_int_value(in_attr[i].int_value());
6168 break;
6169 case elfcpp::Tag_ABI_PCS_wchar_t:
6170 // FIXME: Make it possible to turn off this warning.
6171 if (out_attr[i].int_value()
6172 && in_attr[i].int_value()
6173 && out_attr[i].int_value() != in_attr[i].int_value())
6175 gold_warning(_("%s uses %u-byte wchar_t yet the output is to "
6176 "use %u-byte wchar_t; use of wchar_t values "
6177 "across objects may fail"),
6178 name, in_attr[i].int_value(),
6179 out_attr[i].int_value());
6181 else if (in_attr[i].int_value() && !out_attr[i].int_value())
6182 out_attr[i].set_int_value(in_attr[i].int_value());
6183 break;
6184 case elfcpp::Tag_ABI_enum_size:
6185 if (in_attr[i].int_value() != elfcpp::AEABI_enum_unused)
6187 if (out_attr[i].int_value() == elfcpp::AEABI_enum_unused
6188 || out_attr[i].int_value() == elfcpp::AEABI_enum_forced_wide)
6190 // The existing object is compatible with anything.
6191 // Use whatever requirements the new object has.
6192 out_attr[i].set_int_value(in_attr[i].int_value());
6194 // FIXME: Make it possible to turn off this warning.
6195 else if (in_attr[i].int_value() != elfcpp::AEABI_enum_forced_wide
6196 && out_attr[i].int_value() != in_attr[i].int_value())
6198 unsigned int in_value = in_attr[i].int_value();
6199 unsigned int out_value = out_attr[i].int_value();
6200 gold_warning(_("%s uses %s enums yet the output is to use "
6201 "%s enums; use of enum values across objects "
6202 "may fail"),
6203 name,
6204 this->aeabi_enum_name(in_value).c_str(),
6205 this->aeabi_enum_name(out_value).c_str());
6208 break;
6209 case elfcpp::Tag_ABI_VFP_args:
6210 // Aready done.
6211 break;
6212 case elfcpp::Tag_ABI_WMMX_args:
6213 if (in_attr[i].int_value() != out_attr[i].int_value())
6215 gold_error(_("%s uses iWMMXt register arguments, output does "
6216 "not"),
6217 name);
6219 break;
6220 case Object_attribute::Tag_compatibility:
6221 // Merged in target-independent code.
6222 break;
6223 case elfcpp::Tag_ABI_HardFP_use:
6224 // 1 (SP) and 2 (DP) conflict, so combine to 3 (SP & DP).
6225 if ((in_attr[i].int_value() == 1 && out_attr[i].int_value() == 2)
6226 || (in_attr[i].int_value() == 2 && out_attr[i].int_value() == 1))
6227 out_attr[i].set_int_value(3);
6228 else if (in_attr[i].int_value() > out_attr[i].int_value())
6229 out_attr[i].set_int_value(in_attr[i].int_value());
6230 break;
6231 case elfcpp::Tag_ABI_FP_16bit_format:
6232 if (in_attr[i].int_value() != 0 && out_attr[i].int_value() != 0)
6234 if (in_attr[i].int_value() != out_attr[i].int_value())
6235 gold_error(_("fp16 format mismatch between %s and output"),
6236 name);
6238 if (in_attr[i].int_value() != 0)
6239 out_attr[i].set_int_value(in_attr[i].int_value());
6240 break;
6242 case elfcpp::Tag_nodefaults:
6243 // This tag is set if it exists, but the value is unused (and is
6244 // typically zero). We don't actually need to do anything here -
6245 // the merge happens automatically when the type flags are merged
6246 // below.
6247 break;
6248 case elfcpp::Tag_also_compatible_with:
6249 // Already done in Tag_CPU_arch.
6250 break;
6251 case elfcpp::Tag_conformance:
6252 // Keep the attribute if it matches. Throw it away otherwise.
6253 // No attribute means no claim to conform.
6254 if (in_attr[i].string_value() != out_attr[i].string_value())
6255 out_attr[i].set_string_value("");
6256 break;
6258 default:
6260 const char* err_object = NULL;
6262 // The "known_obj_attributes" table does contain some undefined
6263 // attributes. Ensure that there are unused.
6264 if (out_attr[i].int_value() != 0
6265 || out_attr[i].string_value() != "")
6266 err_object = "output";
6267 else if (in_attr[i].int_value() != 0
6268 || in_attr[i].string_value() != "")
6269 err_object = name;
6271 if (err_object != NULL)
6273 // Attribute numbers >=64 (mod 128) can be safely ignored.
6274 if ((i & 127) < 64)
6275 gold_error(_("%s: unknown mandatory EABI object attribute "
6276 "%d"),
6277 err_object, i);
6278 else
6279 gold_warning(_("%s: unknown EABI object attribute %d"),
6280 err_object, i);
6283 // Only pass on attributes that match in both inputs.
6284 if (!in_attr[i].matches(out_attr[i]))
6286 out_attr[i].set_int_value(0);
6287 out_attr[i].set_string_value("");
6292 // If out_attr was copied from in_attr then it won't have a type yet.
6293 if (in_attr[i].type() && !out_attr[i].type())
6294 out_attr[i].set_type(in_attr[i].type());
6297 // Merge Tag_compatibility attributes and any common GNU ones.
6298 this->attributes_section_data_->merge(name, pasd);
6300 // Check for any attributes not known on ARM.
6301 typedef Vendor_object_attributes::Other_attributes Other_attributes;
6302 const Other_attributes* in_other_attributes = pasd->other_attributes(vendor);
6303 Other_attributes::const_iterator in_iter = in_other_attributes->begin();
6304 Other_attributes* out_other_attributes =
6305 this->attributes_section_data_->other_attributes(vendor);
6306 Other_attributes::iterator out_iter = out_other_attributes->begin();
6308 while (in_iter != in_other_attributes->end()
6309 || out_iter != out_other_attributes->end())
6311 const char* err_object = NULL;
6312 int err_tag = 0;
6314 // The tags for each list are in numerical order.
6315 // If the tags are equal, then merge.
6316 if (out_iter != out_other_attributes->end()
6317 && (in_iter == in_other_attributes->end()
6318 || in_iter->first > out_iter->first))
6320 // This attribute only exists in output. We can't merge, and we
6321 // don't know what the tag means, so delete it.
6322 err_object = "output";
6323 err_tag = out_iter->first;
6324 int saved_tag = out_iter->first;
6325 delete out_iter->second;
6326 out_other_attributes->erase(out_iter);
6327 out_iter = out_other_attributes->upper_bound(saved_tag);
6329 else if (in_iter != in_other_attributes->end()
6330 && (out_iter != out_other_attributes->end()
6331 || in_iter->first < out_iter->first))
6333 // This attribute only exists in input. We can't merge, and we
6334 // don't know what the tag means, so ignore it.
6335 err_object = name;
6336 err_tag = in_iter->first;
6337 ++in_iter;
6339 else // The tags are equal.
6341 // As present, all attributes in the list are unknown, and
6342 // therefore can't be merged meaningfully.
6343 err_object = "output";
6344 err_tag = out_iter->first;
6346 // Only pass on attributes that match in both inputs.
6347 if (!in_iter->second->matches(*(out_iter->second)))
6349 // No match. Delete the attribute.
6350 int saved_tag = out_iter->first;
6351 delete out_iter->second;
6352 out_other_attributes->erase(out_iter);
6353 out_iter = out_other_attributes->upper_bound(saved_tag);
6355 else
6357 // Matched. Keep the attribute and move to the next.
6358 ++out_iter;
6359 ++in_iter;
6363 if (err_object)
6365 // Attribute numbers >=64 (mod 128) can be safely ignored. */
6366 if ((err_tag & 127) < 64)
6368 gold_error(_("%s: unknown mandatory EABI object attribute %d"),
6369 err_object, err_tag);
6371 else
6373 gold_warning(_("%s: unknown EABI object attribute %d"),
6374 err_object, err_tag);
6380 // Return whether a relocation type used the LSB to distinguish THUMB
6381 // addresses.
6382 template<bool big_endian>
6383 bool
6384 Target_arm<big_endian>::reloc_uses_thumb_bit(unsigned int r_type)
6386 switch (r_type)
6388 case elfcpp::R_ARM_PC24:
6389 case elfcpp::R_ARM_ABS32:
6390 case elfcpp::R_ARM_REL32:
6391 case elfcpp::R_ARM_SBREL32:
6392 case elfcpp::R_ARM_THM_CALL:
6393 case elfcpp::R_ARM_GLOB_DAT:
6394 case elfcpp::R_ARM_JUMP_SLOT:
6395 case elfcpp::R_ARM_GOTOFF32:
6396 case elfcpp::R_ARM_PLT32:
6397 case elfcpp::R_ARM_CALL:
6398 case elfcpp::R_ARM_JUMP24:
6399 case elfcpp::R_ARM_THM_JUMP24:
6400 case elfcpp::R_ARM_SBREL31:
6401 case elfcpp::R_ARM_PREL31:
6402 case elfcpp::R_ARM_MOVW_ABS_NC:
6403 case elfcpp::R_ARM_MOVW_PREL_NC:
6404 case elfcpp::R_ARM_THM_MOVW_ABS_NC:
6405 case elfcpp::R_ARM_THM_MOVW_PREL_NC:
6406 case elfcpp::R_ARM_THM_JUMP19:
6407 case elfcpp::R_ARM_THM_ALU_PREL_11_0:
6408 case elfcpp::R_ARM_ALU_PC_G0_NC:
6409 case elfcpp::R_ARM_ALU_PC_G0:
6410 case elfcpp::R_ARM_ALU_PC_G1_NC:
6411 case elfcpp::R_ARM_ALU_PC_G1:
6412 case elfcpp::R_ARM_ALU_PC_G2:
6413 case elfcpp::R_ARM_ALU_SB_G0_NC:
6414 case elfcpp::R_ARM_ALU_SB_G0:
6415 case elfcpp::R_ARM_ALU_SB_G1_NC:
6416 case elfcpp::R_ARM_ALU_SB_G1:
6417 case elfcpp::R_ARM_ALU_SB_G2:
6418 case elfcpp::R_ARM_MOVW_BREL_NC:
6419 case elfcpp::R_ARM_MOVW_BREL:
6420 case elfcpp::R_ARM_THM_MOVW_BREL_NC:
6421 case elfcpp::R_ARM_THM_MOVW_BREL:
6422 return true;
6423 default:
6424 return false;
6428 // Stub-generation methods for Target_arm.
6430 // Make a new Arm_input_section object.
6432 template<bool big_endian>
6433 Arm_input_section<big_endian>*
6434 Target_arm<big_endian>::new_arm_input_section(
6435 Relobj* relobj,
6436 unsigned int shndx)
6438 Input_section_specifier iss(relobj, shndx);
6440 Arm_input_section<big_endian>* arm_input_section =
6441 new Arm_input_section<big_endian>(relobj, shndx);
6442 arm_input_section->init();
6444 // Register new Arm_input_section in map for look-up.
6445 std::pair<typename Arm_input_section_map::iterator, bool> ins =
6446 this->arm_input_section_map_.insert(std::make_pair(iss, arm_input_section));
6448 // Make sure that it we have not created another Arm_input_section
6449 // for this input section already.
6450 gold_assert(ins.second);
6452 return arm_input_section;
6455 // Find the Arm_input_section object corresponding to the SHNDX-th input
6456 // section of RELOBJ.
6458 template<bool big_endian>
6459 Arm_input_section<big_endian>*
6460 Target_arm<big_endian>::find_arm_input_section(
6461 Relobj* relobj,
6462 unsigned int shndx) const
6464 Input_section_specifier iss(relobj, shndx);
6465 typename Arm_input_section_map::const_iterator p =
6466 this->arm_input_section_map_.find(iss);
6467 return (p != this->arm_input_section_map_.end()) ? p->second : NULL;
6470 // Make a new stub table.
6472 template<bool big_endian>
6473 Stub_table<big_endian>*
6474 Target_arm<big_endian>::new_stub_table(Arm_input_section<big_endian>* owner)
6476 Stub_table<big_endian>* stub_table =
6477 new Stub_table<big_endian>(owner);
6478 this->stub_tables_.push_back(stub_table);
6480 stub_table->set_address(owner->address() + owner->data_size());
6481 stub_table->set_file_offset(owner->offset() + owner->data_size());
6482 stub_table->finalize_data_size();
6484 return stub_table;
6487 // Scan a relocation for stub generation.
6489 template<bool big_endian>
6490 void
6491 Target_arm<big_endian>::scan_reloc_for_stub(
6492 const Relocate_info<32, big_endian>* relinfo,
6493 unsigned int r_type,
6494 const Sized_symbol<32>* gsym,
6495 unsigned int r_sym,
6496 const Symbol_value<32>* psymval,
6497 elfcpp::Elf_types<32>::Elf_Swxword addend,
6498 Arm_address address)
6500 typedef typename Target_arm<big_endian>::Relocate Relocate;
6502 const Arm_relobj<big_endian>* arm_relobj =
6503 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
6505 bool target_is_thumb;
6506 Symbol_value<32> symval;
6507 if (gsym != NULL)
6509 // This is a global symbol. Determine if we use PLT and if the
6510 // final target is THUMB.
6511 if (gsym->use_plt_offset(Relocate::reloc_is_non_pic(r_type)))
6513 // This uses a PLT, change the symbol value.
6514 symval.set_output_value(this->plt_section()->address()
6515 + gsym->plt_offset());
6516 psymval = &symval;
6517 target_is_thumb = false;
6519 else if (gsym->is_undefined())
6520 // There is no need to generate a stub symbol is undefined.
6521 return;
6522 else
6524 target_is_thumb =
6525 ((gsym->type() == elfcpp::STT_ARM_TFUNC)
6526 || (gsym->type() == elfcpp::STT_FUNC
6527 && !gsym->is_undefined()
6528 && ((psymval->value(arm_relobj, 0) & 1) != 0)));
6531 else
6533 // This is a local symbol. Determine if the final target is THUMB.
6534 target_is_thumb = arm_relobj->local_symbol_is_thumb_function(r_sym);
6537 // Strip LSB if this points to a THUMB target.
6538 if (target_is_thumb
6539 && Target_arm<big_endian>::reloc_uses_thumb_bit(r_type)
6540 && ((psymval->value(arm_relobj, 0) & 1) != 0))
6542 Arm_address stripped_value =
6543 psymval->value(arm_relobj, 0) & ~static_cast<Arm_address>(1);
6544 symval.set_output_value(stripped_value);
6545 psymval = &symval;
6548 // Get the symbol value.
6549 Symbol_value<32>::Value value = psymval->value(arm_relobj, 0);
6551 // Owing to pipelining, the PC relative branches below actually skip
6552 // two instructions when the branch offset is 0.
6553 Arm_address destination;
6554 switch (r_type)
6556 case elfcpp::R_ARM_CALL:
6557 case elfcpp::R_ARM_JUMP24:
6558 case elfcpp::R_ARM_PLT32:
6559 // ARM branches.
6560 destination = value + addend + 8;
6561 break;
6562 case elfcpp::R_ARM_THM_CALL:
6563 case elfcpp::R_ARM_THM_XPC22:
6564 case elfcpp::R_ARM_THM_JUMP24:
6565 case elfcpp::R_ARM_THM_JUMP19:
6566 // THUMB branches.
6567 destination = value + addend + 4;
6568 break;
6569 default:
6570 gold_unreachable();
6573 Stub_type stub_type =
6574 Reloc_stub::stub_type_for_reloc(r_type, address, destination,
6575 target_is_thumb);
6577 // This reloc does not need a stub.
6578 if (stub_type == arm_stub_none)
6579 return;
6581 // Try looking up an existing stub from a stub table.
6582 Stub_table<big_endian>* stub_table =
6583 arm_relobj->stub_table(relinfo->data_shndx);
6584 gold_assert(stub_table != NULL);
6586 // Locate stub by destination.
6587 Reloc_stub::Key stub_key(stub_type, gsym, arm_relobj, r_sym, addend);
6589 // Create a stub if there is not one already
6590 Reloc_stub* stub = stub_table->find_reloc_stub(stub_key);
6591 if (stub == NULL)
6593 // create a new stub and add it to stub table.
6594 stub = this->stub_factory().make_reloc_stub(stub_type);
6595 stub_table->add_reloc_stub(stub, stub_key);
6598 // Record the destination address.
6599 stub->set_destination_address(destination
6600 | (target_is_thumb ? 1 : 0));
6603 // This function scans a relocation sections for stub generation.
6604 // The template parameter Relocate must be a class type which provides
6605 // a single function, relocate(), which implements the machine
6606 // specific part of a relocation.
6608 // BIG_ENDIAN is the endianness of the data. SH_TYPE is the section type:
6609 // SHT_REL or SHT_RELA.
6611 // PRELOCS points to the relocation data. RELOC_COUNT is the number
6612 // of relocs. OUTPUT_SECTION is the output section.
6613 // NEEDS_SPECIAL_OFFSET_HANDLING is true if input offsets need to be
6614 // mapped to output offsets.
6616 // VIEW is the section data, VIEW_ADDRESS is its memory address, and
6617 // VIEW_SIZE is the size. These refer to the input section, unless
6618 // NEEDS_SPECIAL_OFFSET_HANDLING is true, in which case they refer to
6619 // the output section.
6621 template<bool big_endian>
6622 template<int sh_type>
6623 void inline
6624 Target_arm<big_endian>::scan_reloc_section_for_stubs(
6625 const Relocate_info<32, big_endian>* relinfo,
6626 const unsigned char* prelocs,
6627 size_t reloc_count,
6628 Output_section* output_section,
6629 bool needs_special_offset_handling,
6630 const unsigned char* view,
6631 elfcpp::Elf_types<32>::Elf_Addr view_address,
6632 section_size_type)
6634 typedef typename Reloc_types<sh_type, 32, big_endian>::Reloc Reltype;
6635 const int reloc_size =
6636 Reloc_types<sh_type, 32, big_endian>::reloc_size;
6638 Arm_relobj<big_endian>* arm_object =
6639 Arm_relobj<big_endian>::as_arm_relobj(relinfo->object);
6640 unsigned int local_count = arm_object->local_symbol_count();
6642 Comdat_behavior comdat_behavior = CB_UNDETERMINED;
6644 for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
6646 Reltype reloc(prelocs);
6648 typename elfcpp::Elf_types<32>::Elf_WXword r_info = reloc.get_r_info();
6649 unsigned int r_sym = elfcpp::elf_r_sym<32>(r_info);
6650 unsigned int r_type = elfcpp::elf_r_type<32>(r_info);
6652 r_type = this->get_real_reloc_type(r_type);
6654 // Only a few relocation types need stubs.
6655 if ((r_type != elfcpp::R_ARM_CALL)
6656 && (r_type != elfcpp::R_ARM_JUMP24)
6657 && (r_type != elfcpp::R_ARM_PLT32)
6658 && (r_type != elfcpp::R_ARM_THM_CALL)
6659 && (r_type != elfcpp::R_ARM_THM_XPC22)
6660 && (r_type != elfcpp::R_ARM_THM_JUMP24)
6661 && (r_type != elfcpp::R_ARM_THM_JUMP19))
6662 continue;
6664 section_offset_type offset =
6665 convert_to_section_size_type(reloc.get_r_offset());
6667 if (needs_special_offset_handling)
6669 offset = output_section->output_offset(relinfo->object,
6670 relinfo->data_shndx,
6671 offset);
6672 if (offset == -1)
6673 continue;
6676 // Get the addend.
6677 Stub_addend_reader<sh_type, big_endian> stub_addend_reader;
6678 elfcpp::Elf_types<32>::Elf_Swxword addend =
6679 stub_addend_reader(r_type, view + offset, reloc);
6681 const Sized_symbol<32>* sym;
6683 Symbol_value<32> symval;
6684 const Symbol_value<32> *psymval;
6685 if (r_sym < local_count)
6687 sym = NULL;
6688 psymval = arm_object->local_symbol(r_sym);
6690 // If the local symbol belongs to a section we are discarding,
6691 // and that section is a debug section, try to find the
6692 // corresponding kept section and map this symbol to its
6693 // counterpart in the kept section. The symbol must not
6694 // correspond to a section we are folding.
6695 bool is_ordinary;
6696 unsigned int shndx = psymval->input_shndx(&is_ordinary);
6697 if (is_ordinary
6698 && shndx != elfcpp::SHN_UNDEF
6699 && !arm_object->is_section_included(shndx)
6700 && !(relinfo->symtab->is_section_folded(arm_object, shndx)))
6702 if (comdat_behavior == CB_UNDETERMINED)
6704 std::string name =
6705 arm_object->section_name(relinfo->data_shndx);
6706 comdat_behavior = get_comdat_behavior(name.c_str());
6708 if (comdat_behavior == CB_PRETEND)
6710 bool found;
6711 typename elfcpp::Elf_types<32>::Elf_Addr value =
6712 arm_object->map_to_kept_section(shndx, &found);
6713 if (found)
6714 symval.set_output_value(value + psymval->input_value());
6715 else
6716 symval.set_output_value(0);
6718 else
6720 symval.set_output_value(0);
6722 symval.set_no_output_symtab_entry();
6723 psymval = &symval;
6726 else
6728 const Symbol* gsym = arm_object->global_symbol(r_sym);
6729 gold_assert(gsym != NULL);
6730 if (gsym->is_forwarder())
6731 gsym = relinfo->symtab->resolve_forwards(gsym);
6733 sym = static_cast<const Sized_symbol<32>*>(gsym);
6734 if (sym->has_symtab_index())
6735 symval.set_output_symtab_index(sym->symtab_index());
6736 else
6737 symval.set_no_output_symtab_entry();
6739 // We need to compute the would-be final value of this global
6740 // symbol.
6741 const Symbol_table* symtab = relinfo->symtab;
6742 const Sized_symbol<32>* sized_symbol =
6743 symtab->get_sized_symbol<32>(gsym);
6744 Symbol_table::Compute_final_value_status status;
6745 Arm_address value =
6746 symtab->compute_final_value<32>(sized_symbol, &status);
6748 // Skip this if the symbol has not output section.
6749 if (status == Symbol_table::CFVS_NO_OUTPUT_SECTION)
6750 continue;
6752 symval.set_output_value(value);
6753 psymval = &symval;
6756 // If symbol is a section symbol, we don't know the actual type of
6757 // destination. Give up.
6758 if (psymval->is_section_symbol())
6759 continue;
6761 this->scan_reloc_for_stub(relinfo, r_type, sym, r_sym, psymval,
6762 addend, view_address + offset);
6766 // Scan an input section for stub generation.
6768 template<bool big_endian>
6769 void
6770 Target_arm<big_endian>::scan_section_for_stubs(
6771 const Relocate_info<32, big_endian>* relinfo,
6772 unsigned int sh_type,
6773 const unsigned char* prelocs,
6774 size_t reloc_count,
6775 Output_section* output_section,
6776 bool needs_special_offset_handling,
6777 const unsigned char* view,
6778 Arm_address view_address,
6779 section_size_type view_size)
6781 if (sh_type == elfcpp::SHT_REL)
6782 this->scan_reloc_section_for_stubs<elfcpp::SHT_REL>(
6783 relinfo,
6784 prelocs,
6785 reloc_count,
6786 output_section,
6787 needs_special_offset_handling,
6788 view,
6789 view_address,
6790 view_size);
6791 else if (sh_type == elfcpp::SHT_RELA)
6792 // We do not support RELA type relocations yet. This is provided for
6793 // completeness.
6794 this->scan_reloc_section_for_stubs<elfcpp::SHT_RELA>(
6795 relinfo,
6796 prelocs,
6797 reloc_count,
6798 output_section,
6799 needs_special_offset_handling,
6800 view,
6801 view_address,
6802 view_size);
6803 else
6804 gold_unreachable();
6807 // Group input sections for stub generation.
6809 // We goup input sections in an output sections so that the total size,
6810 // including any padding space due to alignment is smaller than GROUP_SIZE
6811 // unless the only input section in group is bigger than GROUP_SIZE already.
6812 // Then an ARM stub table is created to follow the last input section
6813 // in group. For each group an ARM stub table is created an is placed
6814 // after the last group. If STUB_ALWATS_AFTER_BRANCH is false, we further
6815 // extend the group after the stub table.
6817 template<bool big_endian>
6818 void
6819 Target_arm<big_endian>::group_sections(
6820 Layout* layout,
6821 section_size_type group_size,
6822 bool stubs_always_after_branch)
6824 // Group input sections and insert stub table
6825 Layout::Section_list section_list;
6826 layout->get_allocated_sections(&section_list);
6827 for (Layout::Section_list::const_iterator p = section_list.begin();
6828 p != section_list.end();
6829 ++p)
6831 Arm_output_section<big_endian>* output_section =
6832 Arm_output_section<big_endian>::as_arm_output_section(*p);
6833 output_section->group_sections(group_size, stubs_always_after_branch,
6834 this);
6838 // Relaxation hook. This is where we do stub generation.
6840 template<bool big_endian>
6841 bool
6842 Target_arm<big_endian>::do_relax(
6843 int pass,
6844 const Input_objects* input_objects,
6845 Symbol_table* symtab,
6846 Layout* layout)
6848 // No need to generate stubs if this is a relocatable link.
6849 gold_assert(!parameters->options().relocatable());
6851 // If this is the first pass, we need to group input sections into
6852 // stub groups.
6853 if (pass == 1)
6855 // Determine the stub group size. The group size is the absolute
6856 // value of the parameter --stub-group-size. If --stub-group-size
6857 // is passed a negative value, we restict stubs to be always after
6858 // the stubbed branches.
6859 int32_t stub_group_size_param =
6860 parameters->options().stub_group_size();
6861 bool stubs_always_after_branch = stub_group_size_param < 0;
6862 section_size_type stub_group_size = abs(stub_group_size_param);
6864 if (stub_group_size == 1)
6866 // Default value.
6867 // Thumb branch range is +-4MB has to be used as the default
6868 // maximum size (a given section can contain both ARM and Thumb
6869 // code, so the worst case has to be taken into account).
6871 // This value is 24K less than that, which allows for 2025
6872 // 12-byte stubs. If we exceed that, then we will fail to link.
6873 // The user will have to relink with an explicit group size
6874 // option.
6875 stub_group_size = 4170000;
6878 group_sections(layout, stub_group_size, stubs_always_after_branch);
6881 // clear changed flags for all stub_tables
6882 typedef typename Stub_table_list::iterator Stub_table_iterator;
6883 for (Stub_table_iterator sp = this->stub_tables_.begin();
6884 sp != this->stub_tables_.end();
6885 ++sp)
6886 (*sp)->set_has_been_changed(false);
6888 // scan relocs for stubs
6889 for (Input_objects::Relobj_iterator op = input_objects->relobj_begin();
6890 op != input_objects->relobj_end();
6891 ++op)
6893 Arm_relobj<big_endian>* arm_relobj =
6894 Arm_relobj<big_endian>::as_arm_relobj(*op);
6895 arm_relobj->scan_sections_for_stubs(this, symtab, layout);
6898 bool any_stub_table_changed = false;
6899 for (Stub_table_iterator sp = this->stub_tables_.begin();
6900 (sp != this->stub_tables_.end()) && !any_stub_table_changed;
6901 ++sp)
6903 if ((*sp)->has_been_changed())
6904 any_stub_table_changed = true;
6907 return any_stub_table_changed;
6910 // Relocate a stub.
6912 template<bool big_endian>
6913 void
6914 Target_arm<big_endian>::relocate_stub(
6915 Reloc_stub* stub,
6916 const Relocate_info<32, big_endian>* relinfo,
6917 Output_section* output_section,
6918 unsigned char* view,
6919 Arm_address address,
6920 section_size_type view_size)
6922 Relocate relocate;
6923 const Stub_template* stub_template = stub->stub_template();
6924 for (size_t i = 0; i < stub_template->reloc_count(); i++)
6926 size_t reloc_insn_index = stub_template->reloc_insn_index(i);
6927 const Insn_template* insn = &stub_template->insns()[reloc_insn_index];
6929 unsigned int r_type = insn->r_type();
6930 section_size_type reloc_offset = stub_template->reloc_offset(i);
6931 section_size_type reloc_size = insn->size();
6932 gold_assert(reloc_offset + reloc_size <= view_size);
6934 // This is the address of the stub destination.
6935 Arm_address target = stub->reloc_target(i);
6936 Symbol_value<32> symval;
6937 symval.set_output_value(target);
6939 // Synthesize a fake reloc just in case. We don't have a symbol so
6940 // we use 0.
6941 unsigned char reloc_buffer[elfcpp::Elf_sizes<32>::rel_size];
6942 memset(reloc_buffer, 0, sizeof(reloc_buffer));
6943 elfcpp::Rel_write<32, big_endian> reloc_write(reloc_buffer);
6944 reloc_write.put_r_offset(reloc_offset);
6945 reloc_write.put_r_info(elfcpp::elf_r_info<32>(0, r_type));
6946 elfcpp::Rel<32, big_endian> rel(reloc_buffer);
6948 relocate.relocate(relinfo, this, output_section,
6949 this->fake_relnum_for_stubs, rel, r_type,
6950 NULL, &symval, view + reloc_offset,
6951 address + reloc_offset, reloc_size);
6955 // Determine whether an object attribute tag takes an integer, a
6956 // string or both.
6958 template<bool big_endian>
6960 Target_arm<big_endian>::do_attribute_arg_type(int tag) const
6962 if (tag == Object_attribute::Tag_compatibility)
6963 return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
6964 | Object_attribute::ATTR_TYPE_FLAG_STR_VAL);
6965 else if (tag == elfcpp::Tag_nodefaults)
6966 return (Object_attribute::ATTR_TYPE_FLAG_INT_VAL
6967 | Object_attribute::ATTR_TYPE_FLAG_NO_DEFAULT);
6968 else if (tag == elfcpp::Tag_CPU_raw_name || tag == elfcpp::Tag_CPU_name)
6969 return Object_attribute::ATTR_TYPE_FLAG_STR_VAL;
6970 else if (tag < 32)
6971 return Object_attribute::ATTR_TYPE_FLAG_INT_VAL;
6972 else
6973 return ((tag & 1) != 0
6974 ? Object_attribute::ATTR_TYPE_FLAG_STR_VAL
6975 : Object_attribute::ATTR_TYPE_FLAG_INT_VAL);
6978 // Reorder attributes.
6980 // The ABI defines that Tag_conformance should be emitted first, and that
6981 // Tag_nodefaults should be second (if either is defined). This sets those
6982 // two positions, and bumps up the position of all the remaining tags to
6983 // compensate.
6985 template<bool big_endian>
6987 Target_arm<big_endian>::do_attributes_order(int num) const
6989 // Reorder the known object attributes in output. We want to move
6990 // Tag_conformance to position 4 and Tag_conformance to position 5
6991 // and shift eveything between 4 .. Tag_conformance - 1 to make room.
6992 if (num == 4)
6993 return elfcpp::Tag_conformance;
6994 if (num == 5)
6995 return elfcpp::Tag_nodefaults;
6996 if ((num - 2) < elfcpp::Tag_nodefaults)
6997 return num - 2;
6998 if ((num - 1) < elfcpp::Tag_conformance)
6999 return num - 1;
7000 return num;
7003 template<bool big_endian>
7004 class Target_selector_arm : public Target_selector
7006 public:
7007 Target_selector_arm()
7008 : Target_selector(elfcpp::EM_ARM, 32, big_endian,
7009 (big_endian ? "elf32-bigarm" : "elf32-littlearm"))
7012 Target*
7013 do_instantiate_target()
7014 { return new Target_arm<big_endian>(); }
7017 Target_selector_arm<false> target_selector_arm;
7018 Target_selector_arm<true> target_selector_armbe;
7020 } // End anonymous namespace.