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