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