1 /* 32-bit ELF support for ARM
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
26 #include "libiberty.h"
29 #include "elf-vxworks.h"
32 /* Return the relocation section associated with NAME. HTAB is the
33 bfd's elf32_arm_link_hash_entry. */
34 #define RELOC_SECTION(HTAB, NAME) \
35 ((HTAB)->use_rel ? ".rel" NAME : ".rela" NAME)
37 /* Return size of a relocation entry. HTAB is the bfd's
38 elf32_arm_link_hash_entry. */
39 #define RELOC_SIZE(HTAB) \
41 ? sizeof (Elf32_External_Rel) \
42 : sizeof (Elf32_External_Rela))
44 /* Return function to swap relocations in. HTAB is the bfd's
45 elf32_arm_link_hash_entry. */
46 #define SWAP_RELOC_IN(HTAB) \
48 ? bfd_elf32_swap_reloc_in \
49 : bfd_elf32_swap_reloca_in)
51 /* Return function to swap relocations out. HTAB is the bfd's
52 elf32_arm_link_hash_entry. */
53 #define SWAP_RELOC_OUT(HTAB) \
55 ? bfd_elf32_swap_reloc_out \
56 : bfd_elf32_swap_reloca_out)
58 #define elf_info_to_howto 0
59 #define elf_info_to_howto_rel elf32_arm_info_to_howto
61 #define ARM_ELF_ABI_VERSION 0
62 #define ARM_ELF_OS_ABI_VERSION ELFOSABI_ARM
64 static struct elf_backend_data elf32_arm_vxworks_bed
;
66 static bfd_boolean
elf32_arm_write_section (bfd
*output_bfd
,
67 struct bfd_link_info
*link_info
,
71 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
72 R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
75 static reloc_howto_type elf32_arm_howto_table_1
[] =
78 HOWTO (R_ARM_NONE
, /* type */
80 0, /* size (0 = byte, 1 = short, 2 = long) */
82 FALSE
, /* pc_relative */
84 complain_overflow_dont
,/* complain_on_overflow */
85 bfd_elf_generic_reloc
, /* special_function */
86 "R_ARM_NONE", /* name */
87 FALSE
, /* partial_inplace */
90 FALSE
), /* pcrel_offset */
92 HOWTO (R_ARM_PC24
, /* type */
94 2, /* size (0 = byte, 1 = short, 2 = long) */
96 TRUE
, /* pc_relative */
98 complain_overflow_signed
,/* complain_on_overflow */
99 bfd_elf_generic_reloc
, /* special_function */
100 "R_ARM_PC24", /* name */
101 FALSE
, /* partial_inplace */
102 0x00ffffff, /* src_mask */
103 0x00ffffff, /* dst_mask */
104 TRUE
), /* pcrel_offset */
106 /* 32 bit absolute */
107 HOWTO (R_ARM_ABS32
, /* type */
109 2, /* size (0 = byte, 1 = short, 2 = long) */
111 FALSE
, /* pc_relative */
113 complain_overflow_bitfield
,/* complain_on_overflow */
114 bfd_elf_generic_reloc
, /* special_function */
115 "R_ARM_ABS32", /* name */
116 FALSE
, /* partial_inplace */
117 0xffffffff, /* src_mask */
118 0xffffffff, /* dst_mask */
119 FALSE
), /* pcrel_offset */
121 /* standard 32bit pc-relative reloc */
122 HOWTO (R_ARM_REL32
, /* type */
124 2, /* size (0 = byte, 1 = short, 2 = long) */
126 TRUE
, /* pc_relative */
128 complain_overflow_bitfield
,/* complain_on_overflow */
129 bfd_elf_generic_reloc
, /* special_function */
130 "R_ARM_REL32", /* name */
131 FALSE
, /* partial_inplace */
132 0xffffffff, /* src_mask */
133 0xffffffff, /* dst_mask */
134 TRUE
), /* pcrel_offset */
136 /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
137 HOWTO (R_ARM_LDR_PC_G0
, /* type */
139 0, /* size (0 = byte, 1 = short, 2 = long) */
141 TRUE
, /* pc_relative */
143 complain_overflow_dont
,/* complain_on_overflow */
144 bfd_elf_generic_reloc
, /* special_function */
145 "R_ARM_LDR_PC_G0", /* name */
146 FALSE
, /* partial_inplace */
147 0xffffffff, /* src_mask */
148 0xffffffff, /* dst_mask */
149 TRUE
), /* pcrel_offset */
151 /* 16 bit absolute */
152 HOWTO (R_ARM_ABS16
, /* type */
154 1, /* size (0 = byte, 1 = short, 2 = long) */
156 FALSE
, /* pc_relative */
158 complain_overflow_bitfield
,/* complain_on_overflow */
159 bfd_elf_generic_reloc
, /* special_function */
160 "R_ARM_ABS16", /* name */
161 FALSE
, /* partial_inplace */
162 0x0000ffff, /* src_mask */
163 0x0000ffff, /* dst_mask */
164 FALSE
), /* pcrel_offset */
166 /* 12 bit absolute */
167 HOWTO (R_ARM_ABS12
, /* type */
169 2, /* size (0 = byte, 1 = short, 2 = long) */
171 FALSE
, /* pc_relative */
173 complain_overflow_bitfield
,/* complain_on_overflow */
174 bfd_elf_generic_reloc
, /* special_function */
175 "R_ARM_ABS12", /* name */
176 FALSE
, /* partial_inplace */
177 0x00000fff, /* src_mask */
178 0x00000fff, /* dst_mask */
179 FALSE
), /* pcrel_offset */
181 HOWTO (R_ARM_THM_ABS5
, /* type */
183 1, /* size (0 = byte, 1 = short, 2 = long) */
185 FALSE
, /* pc_relative */
187 complain_overflow_bitfield
,/* complain_on_overflow */
188 bfd_elf_generic_reloc
, /* special_function */
189 "R_ARM_THM_ABS5", /* name */
190 FALSE
, /* partial_inplace */
191 0x000007e0, /* src_mask */
192 0x000007e0, /* dst_mask */
193 FALSE
), /* pcrel_offset */
196 HOWTO (R_ARM_ABS8
, /* type */
198 0, /* size (0 = byte, 1 = short, 2 = long) */
200 FALSE
, /* pc_relative */
202 complain_overflow_bitfield
,/* complain_on_overflow */
203 bfd_elf_generic_reloc
, /* special_function */
204 "R_ARM_ABS8", /* name */
205 FALSE
, /* partial_inplace */
206 0x000000ff, /* src_mask */
207 0x000000ff, /* dst_mask */
208 FALSE
), /* pcrel_offset */
210 HOWTO (R_ARM_SBREL32
, /* type */
212 2, /* size (0 = byte, 1 = short, 2 = long) */
214 FALSE
, /* pc_relative */
216 complain_overflow_dont
,/* complain_on_overflow */
217 bfd_elf_generic_reloc
, /* special_function */
218 "R_ARM_SBREL32", /* name */
219 FALSE
, /* partial_inplace */
220 0xffffffff, /* src_mask */
221 0xffffffff, /* dst_mask */
222 FALSE
), /* pcrel_offset */
224 HOWTO (R_ARM_THM_CALL
, /* type */
226 2, /* size (0 = byte, 1 = short, 2 = long) */
228 TRUE
, /* pc_relative */
230 complain_overflow_signed
,/* complain_on_overflow */
231 bfd_elf_generic_reloc
, /* special_function */
232 "R_ARM_THM_CALL", /* name */
233 FALSE
, /* partial_inplace */
234 0x07ff07ff, /* src_mask */
235 0x07ff07ff, /* dst_mask */
236 TRUE
), /* pcrel_offset */
238 HOWTO (R_ARM_THM_PC8
, /* type */
240 1, /* size (0 = byte, 1 = short, 2 = long) */
242 TRUE
, /* pc_relative */
244 complain_overflow_signed
,/* complain_on_overflow */
245 bfd_elf_generic_reloc
, /* special_function */
246 "R_ARM_THM_PC8", /* name */
247 FALSE
, /* partial_inplace */
248 0x000000ff, /* src_mask */
249 0x000000ff, /* dst_mask */
250 TRUE
), /* pcrel_offset */
252 HOWTO (R_ARM_BREL_ADJ
, /* type */
254 1, /* size (0 = byte, 1 = short, 2 = long) */
256 FALSE
, /* pc_relative */
258 complain_overflow_signed
,/* complain_on_overflow */
259 bfd_elf_generic_reloc
, /* special_function */
260 "R_ARM_BREL_ADJ", /* name */
261 FALSE
, /* partial_inplace */
262 0xffffffff, /* src_mask */
263 0xffffffff, /* dst_mask */
264 FALSE
), /* pcrel_offset */
266 HOWTO (R_ARM_SWI24
, /* type */
268 0, /* size (0 = byte, 1 = short, 2 = long) */
270 FALSE
, /* pc_relative */
272 complain_overflow_signed
,/* complain_on_overflow */
273 bfd_elf_generic_reloc
, /* special_function */
274 "R_ARM_SWI24", /* name */
275 FALSE
, /* partial_inplace */
276 0x00000000, /* src_mask */
277 0x00000000, /* dst_mask */
278 FALSE
), /* pcrel_offset */
280 HOWTO (R_ARM_THM_SWI8
, /* type */
282 0, /* size (0 = byte, 1 = short, 2 = long) */
284 FALSE
, /* pc_relative */
286 complain_overflow_signed
,/* complain_on_overflow */
287 bfd_elf_generic_reloc
, /* special_function */
288 "R_ARM_SWI8", /* name */
289 FALSE
, /* partial_inplace */
290 0x00000000, /* src_mask */
291 0x00000000, /* dst_mask */
292 FALSE
), /* pcrel_offset */
294 /* BLX instruction for the ARM. */
295 HOWTO (R_ARM_XPC25
, /* type */
297 2, /* size (0 = byte, 1 = short, 2 = long) */
299 TRUE
, /* pc_relative */
301 complain_overflow_signed
,/* complain_on_overflow */
302 bfd_elf_generic_reloc
, /* special_function */
303 "R_ARM_XPC25", /* name */
304 FALSE
, /* partial_inplace */
305 0x00ffffff, /* src_mask */
306 0x00ffffff, /* dst_mask */
307 TRUE
), /* pcrel_offset */
309 /* BLX instruction for the Thumb. */
310 HOWTO (R_ARM_THM_XPC22
, /* type */
312 2, /* size (0 = byte, 1 = short, 2 = long) */
314 TRUE
, /* pc_relative */
316 complain_overflow_signed
,/* complain_on_overflow */
317 bfd_elf_generic_reloc
, /* special_function */
318 "R_ARM_THM_XPC22", /* name */
319 FALSE
, /* partial_inplace */
320 0x07ff07ff, /* src_mask */
321 0x07ff07ff, /* dst_mask */
322 TRUE
), /* pcrel_offset */
324 /* Dynamic TLS relocations. */
326 HOWTO (R_ARM_TLS_DTPMOD32
, /* type */
328 2, /* size (0 = byte, 1 = short, 2 = long) */
330 FALSE
, /* pc_relative */
332 complain_overflow_bitfield
,/* complain_on_overflow */
333 bfd_elf_generic_reloc
, /* special_function */
334 "R_ARM_TLS_DTPMOD32", /* name */
335 TRUE
, /* partial_inplace */
336 0xffffffff, /* src_mask */
337 0xffffffff, /* dst_mask */
338 FALSE
), /* pcrel_offset */
340 HOWTO (R_ARM_TLS_DTPOFF32
, /* type */
342 2, /* size (0 = byte, 1 = short, 2 = long) */
344 FALSE
, /* pc_relative */
346 complain_overflow_bitfield
,/* complain_on_overflow */
347 bfd_elf_generic_reloc
, /* special_function */
348 "R_ARM_TLS_DTPOFF32", /* name */
349 TRUE
, /* partial_inplace */
350 0xffffffff, /* src_mask */
351 0xffffffff, /* dst_mask */
352 FALSE
), /* pcrel_offset */
354 HOWTO (R_ARM_TLS_TPOFF32
, /* type */
356 2, /* size (0 = byte, 1 = short, 2 = long) */
358 FALSE
, /* pc_relative */
360 complain_overflow_bitfield
,/* complain_on_overflow */
361 bfd_elf_generic_reloc
, /* special_function */
362 "R_ARM_TLS_TPOFF32", /* name */
363 TRUE
, /* partial_inplace */
364 0xffffffff, /* src_mask */
365 0xffffffff, /* dst_mask */
366 FALSE
), /* pcrel_offset */
368 /* Relocs used in ARM Linux */
370 HOWTO (R_ARM_COPY
, /* type */
372 2, /* size (0 = byte, 1 = short, 2 = long) */
374 FALSE
, /* pc_relative */
376 complain_overflow_bitfield
,/* complain_on_overflow */
377 bfd_elf_generic_reloc
, /* special_function */
378 "R_ARM_COPY", /* name */
379 TRUE
, /* partial_inplace */
380 0xffffffff, /* src_mask */
381 0xffffffff, /* dst_mask */
382 FALSE
), /* pcrel_offset */
384 HOWTO (R_ARM_GLOB_DAT
, /* type */
386 2, /* size (0 = byte, 1 = short, 2 = long) */
388 FALSE
, /* pc_relative */
390 complain_overflow_bitfield
,/* complain_on_overflow */
391 bfd_elf_generic_reloc
, /* special_function */
392 "R_ARM_GLOB_DAT", /* name */
393 TRUE
, /* partial_inplace */
394 0xffffffff, /* src_mask */
395 0xffffffff, /* dst_mask */
396 FALSE
), /* pcrel_offset */
398 HOWTO (R_ARM_JUMP_SLOT
, /* type */
400 2, /* size (0 = byte, 1 = short, 2 = long) */
402 FALSE
, /* pc_relative */
404 complain_overflow_bitfield
,/* complain_on_overflow */
405 bfd_elf_generic_reloc
, /* special_function */
406 "R_ARM_JUMP_SLOT", /* name */
407 TRUE
, /* partial_inplace */
408 0xffffffff, /* src_mask */
409 0xffffffff, /* dst_mask */
410 FALSE
), /* pcrel_offset */
412 HOWTO (R_ARM_RELATIVE
, /* type */
414 2, /* size (0 = byte, 1 = short, 2 = long) */
416 FALSE
, /* pc_relative */
418 complain_overflow_bitfield
,/* complain_on_overflow */
419 bfd_elf_generic_reloc
, /* special_function */
420 "R_ARM_RELATIVE", /* name */
421 TRUE
, /* partial_inplace */
422 0xffffffff, /* src_mask */
423 0xffffffff, /* dst_mask */
424 FALSE
), /* pcrel_offset */
426 HOWTO (R_ARM_GOTOFF32
, /* type */
428 2, /* size (0 = byte, 1 = short, 2 = long) */
430 FALSE
, /* pc_relative */
432 complain_overflow_bitfield
,/* complain_on_overflow */
433 bfd_elf_generic_reloc
, /* special_function */
434 "R_ARM_GOTOFF32", /* name */
435 TRUE
, /* partial_inplace */
436 0xffffffff, /* src_mask */
437 0xffffffff, /* dst_mask */
438 FALSE
), /* pcrel_offset */
440 HOWTO (R_ARM_GOTPC
, /* type */
442 2, /* size (0 = byte, 1 = short, 2 = long) */
444 TRUE
, /* pc_relative */
446 complain_overflow_bitfield
,/* complain_on_overflow */
447 bfd_elf_generic_reloc
, /* special_function */
448 "R_ARM_GOTPC", /* name */
449 TRUE
, /* partial_inplace */
450 0xffffffff, /* src_mask */
451 0xffffffff, /* dst_mask */
452 TRUE
), /* pcrel_offset */
454 HOWTO (R_ARM_GOT32
, /* type */
456 2, /* size (0 = byte, 1 = short, 2 = long) */
458 FALSE
, /* pc_relative */
460 complain_overflow_bitfield
,/* complain_on_overflow */
461 bfd_elf_generic_reloc
, /* special_function */
462 "R_ARM_GOT32", /* name */
463 TRUE
, /* partial_inplace */
464 0xffffffff, /* src_mask */
465 0xffffffff, /* dst_mask */
466 FALSE
), /* pcrel_offset */
468 HOWTO (R_ARM_PLT32
, /* type */
470 2, /* size (0 = byte, 1 = short, 2 = long) */
472 TRUE
, /* pc_relative */
474 complain_overflow_bitfield
,/* complain_on_overflow */
475 bfd_elf_generic_reloc
, /* special_function */
476 "R_ARM_PLT32", /* name */
477 FALSE
, /* partial_inplace */
478 0x00ffffff, /* src_mask */
479 0x00ffffff, /* dst_mask */
480 TRUE
), /* pcrel_offset */
482 HOWTO (R_ARM_CALL
, /* type */
484 2, /* size (0 = byte, 1 = short, 2 = long) */
486 TRUE
, /* pc_relative */
488 complain_overflow_signed
,/* complain_on_overflow */
489 bfd_elf_generic_reloc
, /* special_function */
490 "R_ARM_CALL", /* name */
491 FALSE
, /* partial_inplace */
492 0x00ffffff, /* src_mask */
493 0x00ffffff, /* dst_mask */
494 TRUE
), /* pcrel_offset */
496 HOWTO (R_ARM_JUMP24
, /* type */
498 2, /* size (0 = byte, 1 = short, 2 = long) */
500 TRUE
, /* pc_relative */
502 complain_overflow_signed
,/* complain_on_overflow */
503 bfd_elf_generic_reloc
, /* special_function */
504 "R_ARM_JUMP24", /* name */
505 FALSE
, /* partial_inplace */
506 0x00ffffff, /* src_mask */
507 0x00ffffff, /* dst_mask */
508 TRUE
), /* pcrel_offset */
510 HOWTO (R_ARM_THM_JUMP24
, /* type */
512 2, /* size (0 = byte, 1 = short, 2 = long) */
514 TRUE
, /* pc_relative */
516 complain_overflow_signed
,/* complain_on_overflow */
517 bfd_elf_generic_reloc
, /* special_function */
518 "R_ARM_THM_JUMP24", /* name */
519 FALSE
, /* partial_inplace */
520 0x07ff2fff, /* src_mask */
521 0x07ff2fff, /* dst_mask */
522 TRUE
), /* pcrel_offset */
524 HOWTO (R_ARM_BASE_ABS
, /* type */
526 2, /* size (0 = byte, 1 = short, 2 = long) */
528 FALSE
, /* pc_relative */
530 complain_overflow_dont
,/* complain_on_overflow */
531 bfd_elf_generic_reloc
, /* special_function */
532 "R_ARM_BASE_ABS", /* name */
533 FALSE
, /* partial_inplace */
534 0xffffffff, /* src_mask */
535 0xffffffff, /* dst_mask */
536 FALSE
), /* pcrel_offset */
538 HOWTO (R_ARM_ALU_PCREL7_0
, /* type */
540 2, /* size (0 = byte, 1 = short, 2 = long) */
542 TRUE
, /* pc_relative */
544 complain_overflow_dont
,/* complain_on_overflow */
545 bfd_elf_generic_reloc
, /* special_function */
546 "R_ARM_ALU_PCREL_7_0", /* name */
547 FALSE
, /* partial_inplace */
548 0x00000fff, /* src_mask */
549 0x00000fff, /* dst_mask */
550 TRUE
), /* pcrel_offset */
552 HOWTO (R_ARM_ALU_PCREL15_8
, /* type */
554 2, /* size (0 = byte, 1 = short, 2 = long) */
556 TRUE
, /* pc_relative */
558 complain_overflow_dont
,/* complain_on_overflow */
559 bfd_elf_generic_reloc
, /* special_function */
560 "R_ARM_ALU_PCREL_15_8",/* name */
561 FALSE
, /* partial_inplace */
562 0x00000fff, /* src_mask */
563 0x00000fff, /* dst_mask */
564 TRUE
), /* pcrel_offset */
566 HOWTO (R_ARM_ALU_PCREL23_15
, /* type */
568 2, /* size (0 = byte, 1 = short, 2 = long) */
570 TRUE
, /* pc_relative */
572 complain_overflow_dont
,/* complain_on_overflow */
573 bfd_elf_generic_reloc
, /* special_function */
574 "R_ARM_ALU_PCREL_23_15",/* name */
575 FALSE
, /* partial_inplace */
576 0x00000fff, /* src_mask */
577 0x00000fff, /* dst_mask */
578 TRUE
), /* pcrel_offset */
580 HOWTO (R_ARM_LDR_SBREL_11_0
, /* type */
582 2, /* size (0 = byte, 1 = short, 2 = long) */
584 FALSE
, /* pc_relative */
586 complain_overflow_dont
,/* complain_on_overflow */
587 bfd_elf_generic_reloc
, /* special_function */
588 "R_ARM_LDR_SBREL_11_0",/* name */
589 FALSE
, /* partial_inplace */
590 0x00000fff, /* src_mask */
591 0x00000fff, /* dst_mask */
592 FALSE
), /* pcrel_offset */
594 HOWTO (R_ARM_ALU_SBREL_19_12
, /* type */
596 2, /* size (0 = byte, 1 = short, 2 = long) */
598 FALSE
, /* pc_relative */
600 complain_overflow_dont
,/* complain_on_overflow */
601 bfd_elf_generic_reloc
, /* special_function */
602 "R_ARM_ALU_SBREL_19_12",/* name */
603 FALSE
, /* partial_inplace */
604 0x000ff000, /* src_mask */
605 0x000ff000, /* dst_mask */
606 FALSE
), /* pcrel_offset */
608 HOWTO (R_ARM_ALU_SBREL_27_20
, /* type */
610 2, /* size (0 = byte, 1 = short, 2 = long) */
612 FALSE
, /* pc_relative */
614 complain_overflow_dont
,/* complain_on_overflow */
615 bfd_elf_generic_reloc
, /* special_function */
616 "R_ARM_ALU_SBREL_27_20",/* name */
617 FALSE
, /* partial_inplace */
618 0x0ff00000, /* src_mask */
619 0x0ff00000, /* dst_mask */
620 FALSE
), /* pcrel_offset */
622 HOWTO (R_ARM_TARGET1
, /* type */
624 2, /* size (0 = byte, 1 = short, 2 = long) */
626 FALSE
, /* pc_relative */
628 complain_overflow_dont
,/* complain_on_overflow */
629 bfd_elf_generic_reloc
, /* special_function */
630 "R_ARM_TARGET1", /* name */
631 FALSE
, /* partial_inplace */
632 0xffffffff, /* src_mask */
633 0xffffffff, /* dst_mask */
634 FALSE
), /* pcrel_offset */
636 HOWTO (R_ARM_ROSEGREL32
, /* type */
638 2, /* size (0 = byte, 1 = short, 2 = long) */
640 FALSE
, /* pc_relative */
642 complain_overflow_dont
,/* complain_on_overflow */
643 bfd_elf_generic_reloc
, /* special_function */
644 "R_ARM_ROSEGREL32", /* name */
645 FALSE
, /* partial_inplace */
646 0xffffffff, /* src_mask */
647 0xffffffff, /* dst_mask */
648 FALSE
), /* pcrel_offset */
650 HOWTO (R_ARM_V4BX
, /* type */
652 2, /* size (0 = byte, 1 = short, 2 = long) */
654 FALSE
, /* pc_relative */
656 complain_overflow_dont
,/* complain_on_overflow */
657 bfd_elf_generic_reloc
, /* special_function */
658 "R_ARM_V4BX", /* name */
659 FALSE
, /* partial_inplace */
660 0xffffffff, /* src_mask */
661 0xffffffff, /* dst_mask */
662 FALSE
), /* pcrel_offset */
664 HOWTO (R_ARM_TARGET2
, /* type */
666 2, /* size (0 = byte, 1 = short, 2 = long) */
668 FALSE
, /* pc_relative */
670 complain_overflow_signed
,/* complain_on_overflow */
671 bfd_elf_generic_reloc
, /* special_function */
672 "R_ARM_TARGET2", /* name */
673 FALSE
, /* partial_inplace */
674 0xffffffff, /* src_mask */
675 0xffffffff, /* dst_mask */
676 TRUE
), /* pcrel_offset */
678 HOWTO (R_ARM_PREL31
, /* type */
680 2, /* size (0 = byte, 1 = short, 2 = long) */
682 TRUE
, /* pc_relative */
684 complain_overflow_signed
,/* complain_on_overflow */
685 bfd_elf_generic_reloc
, /* special_function */
686 "R_ARM_PREL31", /* name */
687 FALSE
, /* partial_inplace */
688 0x7fffffff, /* src_mask */
689 0x7fffffff, /* dst_mask */
690 TRUE
), /* pcrel_offset */
692 HOWTO (R_ARM_MOVW_ABS_NC
, /* type */
694 2, /* size (0 = byte, 1 = short, 2 = long) */
696 FALSE
, /* pc_relative */
698 complain_overflow_dont
,/* complain_on_overflow */
699 bfd_elf_generic_reloc
, /* special_function */
700 "R_ARM_MOVW_ABS_NC", /* name */
701 FALSE
, /* partial_inplace */
702 0x000f0fff, /* src_mask */
703 0x000f0fff, /* dst_mask */
704 FALSE
), /* pcrel_offset */
706 HOWTO (R_ARM_MOVT_ABS
, /* type */
708 2, /* size (0 = byte, 1 = short, 2 = long) */
710 FALSE
, /* pc_relative */
712 complain_overflow_bitfield
,/* complain_on_overflow */
713 bfd_elf_generic_reloc
, /* special_function */
714 "R_ARM_MOVT_ABS", /* name */
715 FALSE
, /* partial_inplace */
716 0x000f0fff, /* src_mask */
717 0x000f0fff, /* dst_mask */
718 FALSE
), /* pcrel_offset */
720 HOWTO (R_ARM_MOVW_PREL_NC
, /* type */
722 2, /* size (0 = byte, 1 = short, 2 = long) */
724 TRUE
, /* pc_relative */
726 complain_overflow_dont
,/* complain_on_overflow */
727 bfd_elf_generic_reloc
, /* special_function */
728 "R_ARM_MOVW_PREL_NC", /* name */
729 FALSE
, /* partial_inplace */
730 0x000f0fff, /* src_mask */
731 0x000f0fff, /* dst_mask */
732 TRUE
), /* pcrel_offset */
734 HOWTO (R_ARM_MOVT_PREL
, /* type */
736 2, /* size (0 = byte, 1 = short, 2 = long) */
738 TRUE
, /* pc_relative */
740 complain_overflow_bitfield
,/* complain_on_overflow */
741 bfd_elf_generic_reloc
, /* special_function */
742 "R_ARM_MOVT_PREL", /* name */
743 FALSE
, /* partial_inplace */
744 0x000f0fff, /* src_mask */
745 0x000f0fff, /* dst_mask */
746 TRUE
), /* pcrel_offset */
748 HOWTO (R_ARM_THM_MOVW_ABS_NC
, /* type */
750 2, /* size (0 = byte, 1 = short, 2 = long) */
752 FALSE
, /* pc_relative */
754 complain_overflow_dont
,/* complain_on_overflow */
755 bfd_elf_generic_reloc
, /* special_function */
756 "R_ARM_THM_MOVW_ABS_NC",/* name */
757 FALSE
, /* partial_inplace */
758 0x040f70ff, /* src_mask */
759 0x040f70ff, /* dst_mask */
760 FALSE
), /* pcrel_offset */
762 HOWTO (R_ARM_THM_MOVT_ABS
, /* type */
764 2, /* size (0 = byte, 1 = short, 2 = long) */
766 FALSE
, /* pc_relative */
768 complain_overflow_bitfield
,/* complain_on_overflow */
769 bfd_elf_generic_reloc
, /* special_function */
770 "R_ARM_THM_MOVT_ABS", /* name */
771 FALSE
, /* partial_inplace */
772 0x040f70ff, /* src_mask */
773 0x040f70ff, /* dst_mask */
774 FALSE
), /* pcrel_offset */
776 HOWTO (R_ARM_THM_MOVW_PREL_NC
,/* type */
778 2, /* size (0 = byte, 1 = short, 2 = long) */
780 TRUE
, /* pc_relative */
782 complain_overflow_dont
,/* complain_on_overflow */
783 bfd_elf_generic_reloc
, /* special_function */
784 "R_ARM_THM_MOVW_PREL_NC",/* name */
785 FALSE
, /* partial_inplace */
786 0x040f70ff, /* src_mask */
787 0x040f70ff, /* dst_mask */
788 TRUE
), /* pcrel_offset */
790 HOWTO (R_ARM_THM_MOVT_PREL
, /* type */
792 2, /* size (0 = byte, 1 = short, 2 = long) */
794 TRUE
, /* pc_relative */
796 complain_overflow_bitfield
,/* complain_on_overflow */
797 bfd_elf_generic_reloc
, /* special_function */
798 "R_ARM_THM_MOVT_PREL", /* name */
799 FALSE
, /* partial_inplace */
800 0x040f70ff, /* src_mask */
801 0x040f70ff, /* dst_mask */
802 TRUE
), /* pcrel_offset */
804 HOWTO (R_ARM_THM_JUMP19
, /* type */
806 2, /* size (0 = byte, 1 = short, 2 = long) */
808 TRUE
, /* pc_relative */
810 complain_overflow_signed
,/* complain_on_overflow */
811 bfd_elf_generic_reloc
, /* special_function */
812 "R_ARM_THM_JUMP19", /* name */
813 FALSE
, /* partial_inplace */
814 0x043f2fff, /* src_mask */
815 0x043f2fff, /* dst_mask */
816 TRUE
), /* pcrel_offset */
818 HOWTO (R_ARM_THM_JUMP6
, /* type */
820 1, /* size (0 = byte, 1 = short, 2 = long) */
822 TRUE
, /* pc_relative */
824 complain_overflow_unsigned
,/* complain_on_overflow */
825 bfd_elf_generic_reloc
, /* special_function */
826 "R_ARM_THM_JUMP6", /* name */
827 FALSE
, /* partial_inplace */
828 0x02f8, /* src_mask */
829 0x02f8, /* dst_mask */
830 TRUE
), /* pcrel_offset */
832 /* These are declared as 13-bit signed relocations because we can
833 address -4095 .. 4095(base) by altering ADDW to SUBW or vice
835 HOWTO (R_ARM_THM_ALU_PREL_11_0
,/* type */
837 2, /* size (0 = byte, 1 = short, 2 = long) */
839 TRUE
, /* pc_relative */
841 complain_overflow_dont
,/* complain_on_overflow */
842 bfd_elf_generic_reloc
, /* special_function */
843 "R_ARM_THM_ALU_PREL_11_0",/* name */
844 FALSE
, /* partial_inplace */
845 0xffffffff, /* src_mask */
846 0xffffffff, /* dst_mask */
847 TRUE
), /* pcrel_offset */
849 HOWTO (R_ARM_THM_PC12
, /* type */
851 2, /* size (0 = byte, 1 = short, 2 = long) */
853 TRUE
, /* pc_relative */
855 complain_overflow_dont
,/* complain_on_overflow */
856 bfd_elf_generic_reloc
, /* special_function */
857 "R_ARM_THM_PC12", /* name */
858 FALSE
, /* partial_inplace */
859 0xffffffff, /* src_mask */
860 0xffffffff, /* dst_mask */
861 TRUE
), /* pcrel_offset */
863 HOWTO (R_ARM_ABS32_NOI
, /* type */
865 2, /* size (0 = byte, 1 = short, 2 = long) */
867 FALSE
, /* pc_relative */
869 complain_overflow_dont
,/* complain_on_overflow */
870 bfd_elf_generic_reloc
, /* special_function */
871 "R_ARM_ABS32_NOI", /* name */
872 FALSE
, /* partial_inplace */
873 0xffffffff, /* src_mask */
874 0xffffffff, /* dst_mask */
875 FALSE
), /* pcrel_offset */
877 HOWTO (R_ARM_REL32_NOI
, /* type */
879 2, /* size (0 = byte, 1 = short, 2 = long) */
881 TRUE
, /* pc_relative */
883 complain_overflow_dont
,/* complain_on_overflow */
884 bfd_elf_generic_reloc
, /* special_function */
885 "R_ARM_REL32_NOI", /* name */
886 FALSE
, /* partial_inplace */
887 0xffffffff, /* src_mask */
888 0xffffffff, /* dst_mask */
889 FALSE
), /* pcrel_offset */
891 /* Group relocations. */
893 HOWTO (R_ARM_ALU_PC_G0_NC
, /* type */
895 2, /* size (0 = byte, 1 = short, 2 = long) */
897 TRUE
, /* pc_relative */
899 complain_overflow_dont
,/* complain_on_overflow */
900 bfd_elf_generic_reloc
, /* special_function */
901 "R_ARM_ALU_PC_G0_NC", /* name */
902 FALSE
, /* partial_inplace */
903 0xffffffff, /* src_mask */
904 0xffffffff, /* dst_mask */
905 TRUE
), /* pcrel_offset */
907 HOWTO (R_ARM_ALU_PC_G0
, /* type */
909 2, /* size (0 = byte, 1 = short, 2 = long) */
911 TRUE
, /* pc_relative */
913 complain_overflow_dont
,/* complain_on_overflow */
914 bfd_elf_generic_reloc
, /* special_function */
915 "R_ARM_ALU_PC_G0", /* name */
916 FALSE
, /* partial_inplace */
917 0xffffffff, /* src_mask */
918 0xffffffff, /* dst_mask */
919 TRUE
), /* pcrel_offset */
921 HOWTO (R_ARM_ALU_PC_G1_NC
, /* type */
923 2, /* size (0 = byte, 1 = short, 2 = long) */
925 TRUE
, /* pc_relative */
927 complain_overflow_dont
,/* complain_on_overflow */
928 bfd_elf_generic_reloc
, /* special_function */
929 "R_ARM_ALU_PC_G1_NC", /* name */
930 FALSE
, /* partial_inplace */
931 0xffffffff, /* src_mask */
932 0xffffffff, /* dst_mask */
933 TRUE
), /* pcrel_offset */
935 HOWTO (R_ARM_ALU_PC_G1
, /* type */
937 2, /* size (0 = byte, 1 = short, 2 = long) */
939 TRUE
, /* pc_relative */
941 complain_overflow_dont
,/* complain_on_overflow */
942 bfd_elf_generic_reloc
, /* special_function */
943 "R_ARM_ALU_PC_G1", /* name */
944 FALSE
, /* partial_inplace */
945 0xffffffff, /* src_mask */
946 0xffffffff, /* dst_mask */
947 TRUE
), /* pcrel_offset */
949 HOWTO (R_ARM_ALU_PC_G2
, /* type */
951 2, /* size (0 = byte, 1 = short, 2 = long) */
953 TRUE
, /* pc_relative */
955 complain_overflow_dont
,/* complain_on_overflow */
956 bfd_elf_generic_reloc
, /* special_function */
957 "R_ARM_ALU_PC_G2", /* name */
958 FALSE
, /* partial_inplace */
959 0xffffffff, /* src_mask */
960 0xffffffff, /* dst_mask */
961 TRUE
), /* pcrel_offset */
963 HOWTO (R_ARM_LDR_PC_G1
, /* type */
965 2, /* size (0 = byte, 1 = short, 2 = long) */
967 TRUE
, /* pc_relative */
969 complain_overflow_dont
,/* complain_on_overflow */
970 bfd_elf_generic_reloc
, /* special_function */
971 "R_ARM_LDR_PC_G1", /* name */
972 FALSE
, /* partial_inplace */
973 0xffffffff, /* src_mask */
974 0xffffffff, /* dst_mask */
975 TRUE
), /* pcrel_offset */
977 HOWTO (R_ARM_LDR_PC_G2
, /* type */
979 2, /* size (0 = byte, 1 = short, 2 = long) */
981 TRUE
, /* pc_relative */
983 complain_overflow_dont
,/* complain_on_overflow */
984 bfd_elf_generic_reloc
, /* special_function */
985 "R_ARM_LDR_PC_G2", /* name */
986 FALSE
, /* partial_inplace */
987 0xffffffff, /* src_mask */
988 0xffffffff, /* dst_mask */
989 TRUE
), /* pcrel_offset */
991 HOWTO (R_ARM_LDRS_PC_G0
, /* type */
993 2, /* size (0 = byte, 1 = short, 2 = long) */
995 TRUE
, /* pc_relative */
997 complain_overflow_dont
,/* complain_on_overflow */
998 bfd_elf_generic_reloc
, /* special_function */
999 "R_ARM_LDRS_PC_G0", /* name */
1000 FALSE
, /* partial_inplace */
1001 0xffffffff, /* src_mask */
1002 0xffffffff, /* dst_mask */
1003 TRUE
), /* pcrel_offset */
1005 HOWTO (R_ARM_LDRS_PC_G1
, /* type */
1007 2, /* size (0 = byte, 1 = short, 2 = long) */
1009 TRUE
, /* pc_relative */
1011 complain_overflow_dont
,/* complain_on_overflow */
1012 bfd_elf_generic_reloc
, /* special_function */
1013 "R_ARM_LDRS_PC_G1", /* name */
1014 FALSE
, /* partial_inplace */
1015 0xffffffff, /* src_mask */
1016 0xffffffff, /* dst_mask */
1017 TRUE
), /* pcrel_offset */
1019 HOWTO (R_ARM_LDRS_PC_G2
, /* type */
1021 2, /* size (0 = byte, 1 = short, 2 = long) */
1023 TRUE
, /* pc_relative */
1025 complain_overflow_dont
,/* complain_on_overflow */
1026 bfd_elf_generic_reloc
, /* special_function */
1027 "R_ARM_LDRS_PC_G2", /* name */
1028 FALSE
, /* partial_inplace */
1029 0xffffffff, /* src_mask */
1030 0xffffffff, /* dst_mask */
1031 TRUE
), /* pcrel_offset */
1033 HOWTO (R_ARM_LDC_PC_G0
, /* type */
1035 2, /* size (0 = byte, 1 = short, 2 = long) */
1037 TRUE
, /* pc_relative */
1039 complain_overflow_dont
,/* complain_on_overflow */
1040 bfd_elf_generic_reloc
, /* special_function */
1041 "R_ARM_LDC_PC_G0", /* name */
1042 FALSE
, /* partial_inplace */
1043 0xffffffff, /* src_mask */
1044 0xffffffff, /* dst_mask */
1045 TRUE
), /* pcrel_offset */
1047 HOWTO (R_ARM_LDC_PC_G1
, /* type */
1049 2, /* size (0 = byte, 1 = short, 2 = long) */
1051 TRUE
, /* pc_relative */
1053 complain_overflow_dont
,/* complain_on_overflow */
1054 bfd_elf_generic_reloc
, /* special_function */
1055 "R_ARM_LDC_PC_G1", /* name */
1056 FALSE
, /* partial_inplace */
1057 0xffffffff, /* src_mask */
1058 0xffffffff, /* dst_mask */
1059 TRUE
), /* pcrel_offset */
1061 HOWTO (R_ARM_LDC_PC_G2
, /* type */
1063 2, /* size (0 = byte, 1 = short, 2 = long) */
1065 TRUE
, /* pc_relative */
1067 complain_overflow_dont
,/* complain_on_overflow */
1068 bfd_elf_generic_reloc
, /* special_function */
1069 "R_ARM_LDC_PC_G2", /* name */
1070 FALSE
, /* partial_inplace */
1071 0xffffffff, /* src_mask */
1072 0xffffffff, /* dst_mask */
1073 TRUE
), /* pcrel_offset */
1075 HOWTO (R_ARM_ALU_SB_G0_NC
, /* type */
1077 2, /* size (0 = byte, 1 = short, 2 = long) */
1079 TRUE
, /* pc_relative */
1081 complain_overflow_dont
,/* complain_on_overflow */
1082 bfd_elf_generic_reloc
, /* special_function */
1083 "R_ARM_ALU_SB_G0_NC", /* name */
1084 FALSE
, /* partial_inplace */
1085 0xffffffff, /* src_mask */
1086 0xffffffff, /* dst_mask */
1087 TRUE
), /* pcrel_offset */
1089 HOWTO (R_ARM_ALU_SB_G0
, /* type */
1091 2, /* size (0 = byte, 1 = short, 2 = long) */
1093 TRUE
, /* pc_relative */
1095 complain_overflow_dont
,/* complain_on_overflow */
1096 bfd_elf_generic_reloc
, /* special_function */
1097 "R_ARM_ALU_SB_G0", /* name */
1098 FALSE
, /* partial_inplace */
1099 0xffffffff, /* src_mask */
1100 0xffffffff, /* dst_mask */
1101 TRUE
), /* pcrel_offset */
1103 HOWTO (R_ARM_ALU_SB_G1_NC
, /* type */
1105 2, /* size (0 = byte, 1 = short, 2 = long) */
1107 TRUE
, /* pc_relative */
1109 complain_overflow_dont
,/* complain_on_overflow */
1110 bfd_elf_generic_reloc
, /* special_function */
1111 "R_ARM_ALU_SB_G1_NC", /* name */
1112 FALSE
, /* partial_inplace */
1113 0xffffffff, /* src_mask */
1114 0xffffffff, /* dst_mask */
1115 TRUE
), /* pcrel_offset */
1117 HOWTO (R_ARM_ALU_SB_G1
, /* type */
1119 2, /* size (0 = byte, 1 = short, 2 = long) */
1121 TRUE
, /* pc_relative */
1123 complain_overflow_dont
,/* complain_on_overflow */
1124 bfd_elf_generic_reloc
, /* special_function */
1125 "R_ARM_ALU_SB_G1", /* name */
1126 FALSE
, /* partial_inplace */
1127 0xffffffff, /* src_mask */
1128 0xffffffff, /* dst_mask */
1129 TRUE
), /* pcrel_offset */
1131 HOWTO (R_ARM_ALU_SB_G2
, /* type */
1133 2, /* size (0 = byte, 1 = short, 2 = long) */
1135 TRUE
, /* pc_relative */
1137 complain_overflow_dont
,/* complain_on_overflow */
1138 bfd_elf_generic_reloc
, /* special_function */
1139 "R_ARM_ALU_SB_G2", /* name */
1140 FALSE
, /* partial_inplace */
1141 0xffffffff, /* src_mask */
1142 0xffffffff, /* dst_mask */
1143 TRUE
), /* pcrel_offset */
1145 HOWTO (R_ARM_LDR_SB_G0
, /* type */
1147 2, /* size (0 = byte, 1 = short, 2 = long) */
1149 TRUE
, /* pc_relative */
1151 complain_overflow_dont
,/* complain_on_overflow */
1152 bfd_elf_generic_reloc
, /* special_function */
1153 "R_ARM_LDR_SB_G0", /* name */
1154 FALSE
, /* partial_inplace */
1155 0xffffffff, /* src_mask */
1156 0xffffffff, /* dst_mask */
1157 TRUE
), /* pcrel_offset */
1159 HOWTO (R_ARM_LDR_SB_G1
, /* type */
1161 2, /* size (0 = byte, 1 = short, 2 = long) */
1163 TRUE
, /* pc_relative */
1165 complain_overflow_dont
,/* complain_on_overflow */
1166 bfd_elf_generic_reloc
, /* special_function */
1167 "R_ARM_LDR_SB_G1", /* name */
1168 FALSE
, /* partial_inplace */
1169 0xffffffff, /* src_mask */
1170 0xffffffff, /* dst_mask */
1171 TRUE
), /* pcrel_offset */
1173 HOWTO (R_ARM_LDR_SB_G2
, /* type */
1175 2, /* size (0 = byte, 1 = short, 2 = long) */
1177 TRUE
, /* pc_relative */
1179 complain_overflow_dont
,/* complain_on_overflow */
1180 bfd_elf_generic_reloc
, /* special_function */
1181 "R_ARM_LDR_SB_G2", /* name */
1182 FALSE
, /* partial_inplace */
1183 0xffffffff, /* src_mask */
1184 0xffffffff, /* dst_mask */
1185 TRUE
), /* pcrel_offset */
1187 HOWTO (R_ARM_LDRS_SB_G0
, /* type */
1189 2, /* size (0 = byte, 1 = short, 2 = long) */
1191 TRUE
, /* pc_relative */
1193 complain_overflow_dont
,/* complain_on_overflow */
1194 bfd_elf_generic_reloc
, /* special_function */
1195 "R_ARM_LDRS_SB_G0", /* name */
1196 FALSE
, /* partial_inplace */
1197 0xffffffff, /* src_mask */
1198 0xffffffff, /* dst_mask */
1199 TRUE
), /* pcrel_offset */
1201 HOWTO (R_ARM_LDRS_SB_G1
, /* type */
1203 2, /* size (0 = byte, 1 = short, 2 = long) */
1205 TRUE
, /* pc_relative */
1207 complain_overflow_dont
,/* complain_on_overflow */
1208 bfd_elf_generic_reloc
, /* special_function */
1209 "R_ARM_LDRS_SB_G1", /* name */
1210 FALSE
, /* partial_inplace */
1211 0xffffffff, /* src_mask */
1212 0xffffffff, /* dst_mask */
1213 TRUE
), /* pcrel_offset */
1215 HOWTO (R_ARM_LDRS_SB_G2
, /* type */
1217 2, /* size (0 = byte, 1 = short, 2 = long) */
1219 TRUE
, /* pc_relative */
1221 complain_overflow_dont
,/* complain_on_overflow */
1222 bfd_elf_generic_reloc
, /* special_function */
1223 "R_ARM_LDRS_SB_G2", /* name */
1224 FALSE
, /* partial_inplace */
1225 0xffffffff, /* src_mask */
1226 0xffffffff, /* dst_mask */
1227 TRUE
), /* pcrel_offset */
1229 HOWTO (R_ARM_LDC_SB_G0
, /* type */
1231 2, /* size (0 = byte, 1 = short, 2 = long) */
1233 TRUE
, /* pc_relative */
1235 complain_overflow_dont
,/* complain_on_overflow */
1236 bfd_elf_generic_reloc
, /* special_function */
1237 "R_ARM_LDC_SB_G0", /* name */
1238 FALSE
, /* partial_inplace */
1239 0xffffffff, /* src_mask */
1240 0xffffffff, /* dst_mask */
1241 TRUE
), /* pcrel_offset */
1243 HOWTO (R_ARM_LDC_SB_G1
, /* type */
1245 2, /* size (0 = byte, 1 = short, 2 = long) */
1247 TRUE
, /* pc_relative */
1249 complain_overflow_dont
,/* complain_on_overflow */
1250 bfd_elf_generic_reloc
, /* special_function */
1251 "R_ARM_LDC_SB_G1", /* name */
1252 FALSE
, /* partial_inplace */
1253 0xffffffff, /* src_mask */
1254 0xffffffff, /* dst_mask */
1255 TRUE
), /* pcrel_offset */
1257 HOWTO (R_ARM_LDC_SB_G2
, /* type */
1259 2, /* size (0 = byte, 1 = short, 2 = long) */
1261 TRUE
, /* pc_relative */
1263 complain_overflow_dont
,/* complain_on_overflow */
1264 bfd_elf_generic_reloc
, /* special_function */
1265 "R_ARM_LDC_SB_G2", /* name */
1266 FALSE
, /* partial_inplace */
1267 0xffffffff, /* src_mask */
1268 0xffffffff, /* dst_mask */
1269 TRUE
), /* pcrel_offset */
1271 /* End of group relocations. */
1273 HOWTO (R_ARM_MOVW_BREL_NC
, /* type */
1275 2, /* size (0 = byte, 1 = short, 2 = long) */
1277 FALSE
, /* pc_relative */
1279 complain_overflow_dont
,/* complain_on_overflow */
1280 bfd_elf_generic_reloc
, /* special_function */
1281 "R_ARM_MOVW_BREL_NC", /* name */
1282 FALSE
, /* partial_inplace */
1283 0x0000ffff, /* src_mask */
1284 0x0000ffff, /* dst_mask */
1285 FALSE
), /* pcrel_offset */
1287 HOWTO (R_ARM_MOVT_BREL
, /* type */
1289 2, /* size (0 = byte, 1 = short, 2 = long) */
1291 FALSE
, /* pc_relative */
1293 complain_overflow_bitfield
,/* complain_on_overflow */
1294 bfd_elf_generic_reloc
, /* special_function */
1295 "R_ARM_MOVT_BREL", /* name */
1296 FALSE
, /* partial_inplace */
1297 0x0000ffff, /* src_mask */
1298 0x0000ffff, /* dst_mask */
1299 FALSE
), /* pcrel_offset */
1301 HOWTO (R_ARM_MOVW_BREL
, /* type */
1303 2, /* size (0 = byte, 1 = short, 2 = long) */
1305 FALSE
, /* pc_relative */
1307 complain_overflow_dont
,/* complain_on_overflow */
1308 bfd_elf_generic_reloc
, /* special_function */
1309 "R_ARM_MOVW_BREL", /* name */
1310 FALSE
, /* partial_inplace */
1311 0x0000ffff, /* src_mask */
1312 0x0000ffff, /* dst_mask */
1313 FALSE
), /* pcrel_offset */
1315 HOWTO (R_ARM_THM_MOVW_BREL_NC
,/* type */
1317 2, /* size (0 = byte, 1 = short, 2 = long) */
1319 FALSE
, /* pc_relative */
1321 complain_overflow_dont
,/* complain_on_overflow */
1322 bfd_elf_generic_reloc
, /* special_function */
1323 "R_ARM_THM_MOVW_BREL_NC",/* name */
1324 FALSE
, /* partial_inplace */
1325 0x040f70ff, /* src_mask */
1326 0x040f70ff, /* dst_mask */
1327 FALSE
), /* pcrel_offset */
1329 HOWTO (R_ARM_THM_MOVT_BREL
, /* type */
1331 2, /* size (0 = byte, 1 = short, 2 = long) */
1333 FALSE
, /* pc_relative */
1335 complain_overflow_bitfield
,/* complain_on_overflow */
1336 bfd_elf_generic_reloc
, /* special_function */
1337 "R_ARM_THM_MOVT_BREL", /* name */
1338 FALSE
, /* partial_inplace */
1339 0x040f70ff, /* src_mask */
1340 0x040f70ff, /* dst_mask */
1341 FALSE
), /* pcrel_offset */
1343 HOWTO (R_ARM_THM_MOVW_BREL
, /* type */
1345 2, /* size (0 = byte, 1 = short, 2 = long) */
1347 FALSE
, /* pc_relative */
1349 complain_overflow_dont
,/* complain_on_overflow */
1350 bfd_elf_generic_reloc
, /* special_function */
1351 "R_ARM_THM_MOVW_BREL", /* name */
1352 FALSE
, /* partial_inplace */
1353 0x040f70ff, /* src_mask */
1354 0x040f70ff, /* dst_mask */
1355 FALSE
), /* pcrel_offset */
1357 EMPTY_HOWTO (90), /* Unallocated. */
1362 HOWTO (R_ARM_PLT32_ABS
, /* type */
1364 2, /* size (0 = byte, 1 = short, 2 = long) */
1366 FALSE
, /* pc_relative */
1368 complain_overflow_dont
,/* complain_on_overflow */
1369 bfd_elf_generic_reloc
, /* special_function */
1370 "R_ARM_PLT32_ABS", /* name */
1371 FALSE
, /* partial_inplace */
1372 0xffffffff, /* src_mask */
1373 0xffffffff, /* dst_mask */
1374 FALSE
), /* pcrel_offset */
1376 HOWTO (R_ARM_GOT_ABS
, /* type */
1378 2, /* size (0 = byte, 1 = short, 2 = long) */
1380 FALSE
, /* pc_relative */
1382 complain_overflow_dont
,/* complain_on_overflow */
1383 bfd_elf_generic_reloc
, /* special_function */
1384 "R_ARM_GOT_ABS", /* name */
1385 FALSE
, /* partial_inplace */
1386 0xffffffff, /* src_mask */
1387 0xffffffff, /* dst_mask */
1388 FALSE
), /* pcrel_offset */
1390 HOWTO (R_ARM_GOT_PREL
, /* type */
1392 2, /* size (0 = byte, 1 = short, 2 = long) */
1394 TRUE
, /* pc_relative */
1396 complain_overflow_dont
, /* complain_on_overflow */
1397 bfd_elf_generic_reloc
, /* special_function */
1398 "R_ARM_GOT_PREL", /* name */
1399 FALSE
, /* partial_inplace */
1400 0xffffffff, /* src_mask */
1401 0xffffffff, /* dst_mask */
1402 TRUE
), /* pcrel_offset */
1404 HOWTO (R_ARM_GOT_BREL12
, /* type */
1406 2, /* size (0 = byte, 1 = short, 2 = long) */
1408 FALSE
, /* pc_relative */
1410 complain_overflow_bitfield
,/* complain_on_overflow */
1411 bfd_elf_generic_reloc
, /* special_function */
1412 "R_ARM_GOT_BREL12", /* name */
1413 FALSE
, /* partial_inplace */
1414 0x00000fff, /* src_mask */
1415 0x00000fff, /* dst_mask */
1416 FALSE
), /* pcrel_offset */
1418 HOWTO (R_ARM_GOTOFF12
, /* type */
1420 2, /* size (0 = byte, 1 = short, 2 = long) */
1422 FALSE
, /* pc_relative */
1424 complain_overflow_bitfield
,/* complain_on_overflow */
1425 bfd_elf_generic_reloc
, /* special_function */
1426 "R_ARM_GOTOFF12", /* name */
1427 FALSE
, /* partial_inplace */
1428 0x00000fff, /* src_mask */
1429 0x00000fff, /* dst_mask */
1430 FALSE
), /* pcrel_offset */
1432 EMPTY_HOWTO (R_ARM_GOTRELAX
), /* reserved for future GOT-load optimizations */
1434 /* GNU extension to record C++ vtable member usage */
1435 HOWTO (R_ARM_GNU_VTENTRY
, /* type */
1437 2, /* size (0 = byte, 1 = short, 2 = long) */
1439 FALSE
, /* pc_relative */
1441 complain_overflow_dont
, /* complain_on_overflow */
1442 _bfd_elf_rel_vtable_reloc_fn
, /* special_function */
1443 "R_ARM_GNU_VTENTRY", /* name */
1444 FALSE
, /* partial_inplace */
1447 FALSE
), /* pcrel_offset */
1449 /* GNU extension to record C++ vtable hierarchy */
1450 HOWTO (R_ARM_GNU_VTINHERIT
, /* type */
1452 2, /* size (0 = byte, 1 = short, 2 = long) */
1454 FALSE
, /* pc_relative */
1456 complain_overflow_dont
, /* complain_on_overflow */
1457 NULL
, /* special_function */
1458 "R_ARM_GNU_VTINHERIT", /* name */
1459 FALSE
, /* partial_inplace */
1462 FALSE
), /* pcrel_offset */
1464 HOWTO (R_ARM_THM_JUMP11
, /* type */
1466 1, /* size (0 = byte, 1 = short, 2 = long) */
1468 TRUE
, /* pc_relative */
1470 complain_overflow_signed
, /* complain_on_overflow */
1471 bfd_elf_generic_reloc
, /* special_function */
1472 "R_ARM_THM_JUMP11", /* name */
1473 FALSE
, /* partial_inplace */
1474 0x000007ff, /* src_mask */
1475 0x000007ff, /* dst_mask */
1476 TRUE
), /* pcrel_offset */
1478 HOWTO (R_ARM_THM_JUMP8
, /* type */
1480 1, /* size (0 = byte, 1 = short, 2 = long) */
1482 TRUE
, /* pc_relative */
1484 complain_overflow_signed
, /* complain_on_overflow */
1485 bfd_elf_generic_reloc
, /* special_function */
1486 "R_ARM_THM_JUMP8", /* name */
1487 FALSE
, /* partial_inplace */
1488 0x000000ff, /* src_mask */
1489 0x000000ff, /* dst_mask */
1490 TRUE
), /* pcrel_offset */
1492 /* TLS relocations */
1493 HOWTO (R_ARM_TLS_GD32
, /* type */
1495 2, /* size (0 = byte, 1 = short, 2 = long) */
1497 FALSE
, /* pc_relative */
1499 complain_overflow_bitfield
,/* complain_on_overflow */
1500 NULL
, /* special_function */
1501 "R_ARM_TLS_GD32", /* name */
1502 TRUE
, /* partial_inplace */
1503 0xffffffff, /* src_mask */
1504 0xffffffff, /* dst_mask */
1505 FALSE
), /* pcrel_offset */
1507 HOWTO (R_ARM_TLS_LDM32
, /* type */
1509 2, /* size (0 = byte, 1 = short, 2 = long) */
1511 FALSE
, /* pc_relative */
1513 complain_overflow_bitfield
,/* complain_on_overflow */
1514 bfd_elf_generic_reloc
, /* special_function */
1515 "R_ARM_TLS_LDM32", /* name */
1516 TRUE
, /* partial_inplace */
1517 0xffffffff, /* src_mask */
1518 0xffffffff, /* dst_mask */
1519 FALSE
), /* pcrel_offset */
1521 HOWTO (R_ARM_TLS_LDO32
, /* type */
1523 2, /* size (0 = byte, 1 = short, 2 = long) */
1525 FALSE
, /* pc_relative */
1527 complain_overflow_bitfield
,/* complain_on_overflow */
1528 bfd_elf_generic_reloc
, /* special_function */
1529 "R_ARM_TLS_LDO32", /* name */
1530 TRUE
, /* partial_inplace */
1531 0xffffffff, /* src_mask */
1532 0xffffffff, /* dst_mask */
1533 FALSE
), /* pcrel_offset */
1535 HOWTO (R_ARM_TLS_IE32
, /* type */
1537 2, /* size (0 = byte, 1 = short, 2 = long) */
1539 FALSE
, /* pc_relative */
1541 complain_overflow_bitfield
,/* complain_on_overflow */
1542 NULL
, /* special_function */
1543 "R_ARM_TLS_IE32", /* name */
1544 TRUE
, /* partial_inplace */
1545 0xffffffff, /* src_mask */
1546 0xffffffff, /* dst_mask */
1547 FALSE
), /* pcrel_offset */
1549 HOWTO (R_ARM_TLS_LE32
, /* type */
1551 2, /* size (0 = byte, 1 = short, 2 = long) */
1553 FALSE
, /* pc_relative */
1555 complain_overflow_bitfield
,/* complain_on_overflow */
1556 bfd_elf_generic_reloc
, /* special_function */
1557 "R_ARM_TLS_LE32", /* name */
1558 TRUE
, /* partial_inplace */
1559 0xffffffff, /* src_mask */
1560 0xffffffff, /* dst_mask */
1561 FALSE
), /* pcrel_offset */
1563 HOWTO (R_ARM_TLS_LDO12
, /* type */
1565 2, /* size (0 = byte, 1 = short, 2 = long) */
1567 FALSE
, /* pc_relative */
1569 complain_overflow_bitfield
,/* complain_on_overflow */
1570 bfd_elf_generic_reloc
, /* special_function */
1571 "R_ARM_TLS_LDO12", /* name */
1572 FALSE
, /* partial_inplace */
1573 0x00000fff, /* src_mask */
1574 0x00000fff, /* dst_mask */
1575 FALSE
), /* pcrel_offset */
1577 HOWTO (R_ARM_TLS_LE12
, /* type */
1579 2, /* size (0 = byte, 1 = short, 2 = long) */
1581 FALSE
, /* pc_relative */
1583 complain_overflow_bitfield
,/* complain_on_overflow */
1584 bfd_elf_generic_reloc
, /* special_function */
1585 "R_ARM_TLS_LE12", /* name */
1586 FALSE
, /* partial_inplace */
1587 0x00000fff, /* src_mask */
1588 0x00000fff, /* dst_mask */
1589 FALSE
), /* pcrel_offset */
1591 HOWTO (R_ARM_TLS_IE12GP
, /* type */
1593 2, /* size (0 = byte, 1 = short, 2 = long) */
1595 FALSE
, /* pc_relative */
1597 complain_overflow_bitfield
,/* complain_on_overflow */
1598 bfd_elf_generic_reloc
, /* special_function */
1599 "R_ARM_TLS_IE12GP", /* name */
1600 FALSE
, /* partial_inplace */
1601 0x00000fff, /* src_mask */
1602 0x00000fff, /* dst_mask */
1603 FALSE
), /* pcrel_offset */
1606 /* 112-127 private relocations
1607 128 R_ARM_ME_TOO, obsolete
1608 129-255 unallocated in AAELF.
1610 249-255 extended, currently unused, relocations: */
1612 static reloc_howto_type elf32_arm_howto_table_2
[4] =
1614 HOWTO (R_ARM_RREL32
, /* type */
1616 0, /* size (0 = byte, 1 = short, 2 = long) */
1618 FALSE
, /* pc_relative */
1620 complain_overflow_dont
,/* complain_on_overflow */
1621 bfd_elf_generic_reloc
, /* special_function */
1622 "R_ARM_RREL32", /* name */
1623 FALSE
, /* partial_inplace */
1626 FALSE
), /* pcrel_offset */
1628 HOWTO (R_ARM_RABS32
, /* type */
1630 0, /* size (0 = byte, 1 = short, 2 = long) */
1632 FALSE
, /* pc_relative */
1634 complain_overflow_dont
,/* complain_on_overflow */
1635 bfd_elf_generic_reloc
, /* special_function */
1636 "R_ARM_RABS32", /* name */
1637 FALSE
, /* partial_inplace */
1640 FALSE
), /* pcrel_offset */
1642 HOWTO (R_ARM_RPC24
, /* type */
1644 0, /* size (0 = byte, 1 = short, 2 = long) */
1646 FALSE
, /* pc_relative */
1648 complain_overflow_dont
,/* complain_on_overflow */
1649 bfd_elf_generic_reloc
, /* special_function */
1650 "R_ARM_RPC24", /* name */
1651 FALSE
, /* partial_inplace */
1654 FALSE
), /* pcrel_offset */
1656 HOWTO (R_ARM_RBASE
, /* type */
1658 0, /* size (0 = byte, 1 = short, 2 = long) */
1660 FALSE
, /* pc_relative */
1662 complain_overflow_dont
,/* complain_on_overflow */
1663 bfd_elf_generic_reloc
, /* special_function */
1664 "R_ARM_RBASE", /* name */
1665 FALSE
, /* partial_inplace */
1668 FALSE
) /* pcrel_offset */
1671 static reloc_howto_type
*
1672 elf32_arm_howto_from_type (unsigned int r_type
)
1674 if (r_type
< ARRAY_SIZE (elf32_arm_howto_table_1
))
1675 return &elf32_arm_howto_table_1
[r_type
];
1677 if (r_type
>= R_ARM_RREL32
1678 && r_type
< R_ARM_RREL32
+ ARRAY_SIZE (elf32_arm_howto_table_2
))
1679 return &elf32_arm_howto_table_2
[r_type
- R_ARM_RREL32
];
1685 elf32_arm_info_to_howto (bfd
* abfd ATTRIBUTE_UNUSED
, arelent
* bfd_reloc
,
1686 Elf_Internal_Rela
* elf_reloc
)
1688 unsigned int r_type
;
1690 r_type
= ELF32_R_TYPE (elf_reloc
->r_info
);
1691 bfd_reloc
->howto
= elf32_arm_howto_from_type (r_type
);
1694 struct elf32_arm_reloc_map
1696 bfd_reloc_code_real_type bfd_reloc_val
;
1697 unsigned char elf_reloc_val
;
1700 /* All entries in this list must also be present in elf32_arm_howto_table. */
1701 static const struct elf32_arm_reloc_map elf32_arm_reloc_map
[] =
1703 {BFD_RELOC_NONE
, R_ARM_NONE
},
1704 {BFD_RELOC_ARM_PCREL_BRANCH
, R_ARM_PC24
},
1705 {BFD_RELOC_ARM_PCREL_CALL
, R_ARM_CALL
},
1706 {BFD_RELOC_ARM_PCREL_JUMP
, R_ARM_JUMP24
},
1707 {BFD_RELOC_ARM_PCREL_BLX
, R_ARM_XPC25
},
1708 {BFD_RELOC_THUMB_PCREL_BLX
, R_ARM_THM_XPC22
},
1709 {BFD_RELOC_32
, R_ARM_ABS32
},
1710 {BFD_RELOC_32_PCREL
, R_ARM_REL32
},
1711 {BFD_RELOC_8
, R_ARM_ABS8
},
1712 {BFD_RELOC_16
, R_ARM_ABS16
},
1713 {BFD_RELOC_ARM_OFFSET_IMM
, R_ARM_ABS12
},
1714 {BFD_RELOC_ARM_THUMB_OFFSET
, R_ARM_THM_ABS5
},
1715 {BFD_RELOC_THUMB_PCREL_BRANCH25
, R_ARM_THM_JUMP24
},
1716 {BFD_RELOC_THUMB_PCREL_BRANCH23
, R_ARM_THM_CALL
},
1717 {BFD_RELOC_THUMB_PCREL_BRANCH12
, R_ARM_THM_JUMP11
},
1718 {BFD_RELOC_THUMB_PCREL_BRANCH20
, R_ARM_THM_JUMP19
},
1719 {BFD_RELOC_THUMB_PCREL_BRANCH9
, R_ARM_THM_JUMP8
},
1720 {BFD_RELOC_THUMB_PCREL_BRANCH7
, R_ARM_THM_JUMP6
},
1721 {BFD_RELOC_ARM_GLOB_DAT
, R_ARM_GLOB_DAT
},
1722 {BFD_RELOC_ARM_JUMP_SLOT
, R_ARM_JUMP_SLOT
},
1723 {BFD_RELOC_ARM_RELATIVE
, R_ARM_RELATIVE
},
1724 {BFD_RELOC_ARM_GOTOFF
, R_ARM_GOTOFF32
},
1725 {BFD_RELOC_ARM_GOTPC
, R_ARM_GOTPC
},
1726 {BFD_RELOC_ARM_GOT32
, R_ARM_GOT32
},
1727 {BFD_RELOC_ARM_PLT32
, R_ARM_PLT32
},
1728 {BFD_RELOC_ARM_TARGET1
, R_ARM_TARGET1
},
1729 {BFD_RELOC_ARM_ROSEGREL32
, R_ARM_ROSEGREL32
},
1730 {BFD_RELOC_ARM_SBREL32
, R_ARM_SBREL32
},
1731 {BFD_RELOC_ARM_PREL31
, R_ARM_PREL31
},
1732 {BFD_RELOC_ARM_TARGET2
, R_ARM_TARGET2
},
1733 {BFD_RELOC_ARM_PLT32
, R_ARM_PLT32
},
1734 {BFD_RELOC_ARM_TLS_GD32
, R_ARM_TLS_GD32
},
1735 {BFD_RELOC_ARM_TLS_LDO32
, R_ARM_TLS_LDO32
},
1736 {BFD_RELOC_ARM_TLS_LDM32
, R_ARM_TLS_LDM32
},
1737 {BFD_RELOC_ARM_TLS_DTPMOD32
, R_ARM_TLS_DTPMOD32
},
1738 {BFD_RELOC_ARM_TLS_DTPOFF32
, R_ARM_TLS_DTPOFF32
},
1739 {BFD_RELOC_ARM_TLS_TPOFF32
, R_ARM_TLS_TPOFF32
},
1740 {BFD_RELOC_ARM_TLS_IE32
, R_ARM_TLS_IE32
},
1741 {BFD_RELOC_ARM_TLS_LE32
, R_ARM_TLS_LE32
},
1742 {BFD_RELOC_VTABLE_INHERIT
, R_ARM_GNU_VTINHERIT
},
1743 {BFD_RELOC_VTABLE_ENTRY
, R_ARM_GNU_VTENTRY
},
1744 {BFD_RELOC_ARM_MOVW
, R_ARM_MOVW_ABS_NC
},
1745 {BFD_RELOC_ARM_MOVT
, R_ARM_MOVT_ABS
},
1746 {BFD_RELOC_ARM_MOVW_PCREL
, R_ARM_MOVW_PREL_NC
},
1747 {BFD_RELOC_ARM_MOVT_PCREL
, R_ARM_MOVT_PREL
},
1748 {BFD_RELOC_ARM_THUMB_MOVW
, R_ARM_THM_MOVW_ABS_NC
},
1749 {BFD_RELOC_ARM_THUMB_MOVT
, R_ARM_THM_MOVT_ABS
},
1750 {BFD_RELOC_ARM_THUMB_MOVW_PCREL
, R_ARM_THM_MOVW_PREL_NC
},
1751 {BFD_RELOC_ARM_THUMB_MOVT_PCREL
, R_ARM_THM_MOVT_PREL
},
1752 {BFD_RELOC_ARM_ALU_PC_G0_NC
, R_ARM_ALU_PC_G0_NC
},
1753 {BFD_RELOC_ARM_ALU_PC_G0
, R_ARM_ALU_PC_G0
},
1754 {BFD_RELOC_ARM_ALU_PC_G1_NC
, R_ARM_ALU_PC_G1_NC
},
1755 {BFD_RELOC_ARM_ALU_PC_G1
, R_ARM_ALU_PC_G1
},
1756 {BFD_RELOC_ARM_ALU_PC_G2
, R_ARM_ALU_PC_G2
},
1757 {BFD_RELOC_ARM_LDR_PC_G0
, R_ARM_LDR_PC_G0
},
1758 {BFD_RELOC_ARM_LDR_PC_G1
, R_ARM_LDR_PC_G1
},
1759 {BFD_RELOC_ARM_LDR_PC_G2
, R_ARM_LDR_PC_G2
},
1760 {BFD_RELOC_ARM_LDRS_PC_G0
, R_ARM_LDRS_PC_G0
},
1761 {BFD_RELOC_ARM_LDRS_PC_G1
, R_ARM_LDRS_PC_G1
},
1762 {BFD_RELOC_ARM_LDRS_PC_G2
, R_ARM_LDRS_PC_G2
},
1763 {BFD_RELOC_ARM_LDC_PC_G0
, R_ARM_LDC_PC_G0
},
1764 {BFD_RELOC_ARM_LDC_PC_G1
, R_ARM_LDC_PC_G1
},
1765 {BFD_RELOC_ARM_LDC_PC_G2
, R_ARM_LDC_PC_G2
},
1766 {BFD_RELOC_ARM_ALU_SB_G0_NC
, R_ARM_ALU_SB_G0_NC
},
1767 {BFD_RELOC_ARM_ALU_SB_G0
, R_ARM_ALU_SB_G0
},
1768 {BFD_RELOC_ARM_ALU_SB_G1_NC
, R_ARM_ALU_SB_G1_NC
},
1769 {BFD_RELOC_ARM_ALU_SB_G1
, R_ARM_ALU_SB_G1
},
1770 {BFD_RELOC_ARM_ALU_SB_G2
, R_ARM_ALU_SB_G2
},
1771 {BFD_RELOC_ARM_LDR_SB_G0
, R_ARM_LDR_SB_G0
},
1772 {BFD_RELOC_ARM_LDR_SB_G1
, R_ARM_LDR_SB_G1
},
1773 {BFD_RELOC_ARM_LDR_SB_G2
, R_ARM_LDR_SB_G2
},
1774 {BFD_RELOC_ARM_LDRS_SB_G0
, R_ARM_LDRS_SB_G0
},
1775 {BFD_RELOC_ARM_LDRS_SB_G1
, R_ARM_LDRS_SB_G1
},
1776 {BFD_RELOC_ARM_LDRS_SB_G2
, R_ARM_LDRS_SB_G2
},
1777 {BFD_RELOC_ARM_LDC_SB_G0
, R_ARM_LDC_SB_G0
},
1778 {BFD_RELOC_ARM_LDC_SB_G1
, R_ARM_LDC_SB_G1
},
1779 {BFD_RELOC_ARM_LDC_SB_G2
, R_ARM_LDC_SB_G2
},
1780 {BFD_RELOC_ARM_V4BX
, R_ARM_V4BX
}
1783 static reloc_howto_type
*
1784 elf32_arm_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1785 bfd_reloc_code_real_type code
)
1789 for (i
= 0; i
< ARRAY_SIZE (elf32_arm_reloc_map
); i
++)
1790 if (elf32_arm_reloc_map
[i
].bfd_reloc_val
== code
)
1791 return elf32_arm_howto_from_type (elf32_arm_reloc_map
[i
].elf_reloc_val
);
1796 static reloc_howto_type
*
1797 elf32_arm_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1802 for (i
= 0; i
< ARRAY_SIZE (elf32_arm_howto_table_1
); i
++)
1803 if (elf32_arm_howto_table_1
[i
].name
!= NULL
1804 && strcasecmp (elf32_arm_howto_table_1
[i
].name
, r_name
) == 0)
1805 return &elf32_arm_howto_table_1
[i
];
1807 for (i
= 0; i
< ARRAY_SIZE (elf32_arm_howto_table_2
); i
++)
1808 if (elf32_arm_howto_table_2
[i
].name
!= NULL
1809 && strcasecmp (elf32_arm_howto_table_2
[i
].name
, r_name
) == 0)
1810 return &elf32_arm_howto_table_2
[i
];
1815 /* Support for core dump NOTE sections. */
1818 elf32_arm_nabi_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
1823 switch (note
->descsz
)
1828 case 148: /* Linux/ARM 32-bit. */
1830 elf_tdata (abfd
)->core_signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
1833 elf_tdata (abfd
)->core_pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
1842 /* Make a ".reg/999" section. */
1843 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
1844 size
, note
->descpos
+ offset
);
1848 elf32_arm_nabi_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
1850 switch (note
->descsz
)
1855 case 124: /* Linux/ARM elf_prpsinfo. */
1856 elf_tdata (abfd
)->core_program
1857 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 28, 16);
1858 elf_tdata (abfd
)->core_command
1859 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 44, 80);
1862 /* Note that for some reason, a spurious space is tacked
1863 onto the end of the args in some (at least one anyway)
1864 implementations, so strip it off if it exists. */
1866 char *command
= elf_tdata (abfd
)->core_command
;
1867 int n
= strlen (command
);
1869 if (0 < n
&& command
[n
- 1] == ' ')
1870 command
[n
- 1] = '\0';
1876 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vec
1877 #define TARGET_LITTLE_NAME "elf32-littlearm"
1878 #define TARGET_BIG_SYM bfd_elf32_bigarm_vec
1879 #define TARGET_BIG_NAME "elf32-bigarm"
1881 #define elf_backend_grok_prstatus elf32_arm_nabi_grok_prstatus
1882 #define elf_backend_grok_psinfo elf32_arm_nabi_grok_psinfo
1884 typedef unsigned long int insn32
;
1885 typedef unsigned short int insn16
;
1887 /* In lieu of proper flags, assume all EABIv4 or later objects are
1889 #define INTERWORK_FLAG(abfd) \
1890 (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) >= EF_ARM_EABI_VER4 \
1891 || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK) \
1892 || ((abfd)->flags & BFD_LINKER_CREATED))
1894 /* The linker script knows the section names for placement.
1895 The entry_names are used to do simple name mangling on the stubs.
1896 Given a function name, and its type, the stub can be found. The
1897 name can be changed. The only requirement is the %s be present. */
1898 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
1899 #define THUMB2ARM_GLUE_ENTRY_NAME "__%s_from_thumb"
1901 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
1902 #define ARM2THUMB_GLUE_ENTRY_NAME "__%s_from_arm"
1904 #define VFP11_ERRATUM_VENEER_SECTION_NAME ".vfp11_veneer"
1905 #define VFP11_ERRATUM_VENEER_ENTRY_NAME "__vfp11_veneer_%x"
1907 #define ARM_BX_GLUE_SECTION_NAME ".v4_bx"
1908 #define ARM_BX_GLUE_ENTRY_NAME "__bx_r%d"
1910 #define STUB_ENTRY_NAME "__%s_veneer"
1912 /* The name of the dynamic interpreter. This is put in the .interp
1914 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
1916 #ifdef FOUR_WORD_PLT
1918 /* The first entry in a procedure linkage table looks like
1919 this. It is set up so that any shared library function that is
1920 called before the relocation has been set up calls the dynamic
1922 static const bfd_vma elf32_arm_plt0_entry
[] =
1924 0xe52de004, /* str lr, [sp, #-4]! */
1925 0xe59fe010, /* ldr lr, [pc, #16] */
1926 0xe08fe00e, /* add lr, pc, lr */
1927 0xe5bef008, /* ldr pc, [lr, #8]! */
1930 /* Subsequent entries in a procedure linkage table look like
1932 static const bfd_vma elf32_arm_plt_entry
[] =
1934 0xe28fc600, /* add ip, pc, #NN */
1935 0xe28cca00, /* add ip, ip, #NN */
1936 0xe5bcf000, /* ldr pc, [ip, #NN]! */
1937 0x00000000, /* unused */
1942 /* The first entry in a procedure linkage table looks like
1943 this. It is set up so that any shared library function that is
1944 called before the relocation has been set up calls the dynamic
1946 static const bfd_vma elf32_arm_plt0_entry
[] =
1948 0xe52de004, /* str lr, [sp, #-4]! */
1949 0xe59fe004, /* ldr lr, [pc, #4] */
1950 0xe08fe00e, /* add lr, pc, lr */
1951 0xe5bef008, /* ldr pc, [lr, #8]! */
1952 0x00000000, /* &GOT[0] - . */
1955 /* Subsequent entries in a procedure linkage table look like
1957 static const bfd_vma elf32_arm_plt_entry
[] =
1959 0xe28fc600, /* add ip, pc, #0xNN00000 */
1960 0xe28cca00, /* add ip, ip, #0xNN000 */
1961 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */
1966 /* The format of the first entry in the procedure linkage table
1967 for a VxWorks executable. */
1968 static const bfd_vma elf32_arm_vxworks_exec_plt0_entry
[] =
1970 0xe52dc008, /* str ip,[sp,#-8]! */
1971 0xe59fc000, /* ldr ip,[pc] */
1972 0xe59cf008, /* ldr pc,[ip,#8] */
1973 0x00000000, /* .long _GLOBAL_OFFSET_TABLE_ */
1976 /* The format of subsequent entries in a VxWorks executable. */
1977 static const bfd_vma elf32_arm_vxworks_exec_plt_entry
[] =
1979 0xe59fc000, /* ldr ip,[pc] */
1980 0xe59cf000, /* ldr pc,[ip] */
1981 0x00000000, /* .long @got */
1982 0xe59fc000, /* ldr ip,[pc] */
1983 0xea000000, /* b _PLT */
1984 0x00000000, /* .long @pltindex*sizeof(Elf32_Rela) */
1987 /* The format of entries in a VxWorks shared library. */
1988 static const bfd_vma elf32_arm_vxworks_shared_plt_entry
[] =
1990 0xe59fc000, /* ldr ip,[pc] */
1991 0xe79cf009, /* ldr pc,[ip,r9] */
1992 0x00000000, /* .long @got */
1993 0xe59fc000, /* ldr ip,[pc] */
1994 0xe599f008, /* ldr pc,[r9,#8] */
1995 0x00000000, /* .long @pltindex*sizeof(Elf32_Rela) */
1998 /* An initial stub used if the PLT entry is referenced from Thumb code. */
1999 #define PLT_THUMB_STUB_SIZE 4
2000 static const bfd_vma elf32_arm_plt_thumb_stub
[] =
2006 /* The entries in a PLT when using a DLL-based target with multiple
2008 static const bfd_vma elf32_arm_symbian_plt_entry
[] =
2010 0xe51ff004, /* ldr pc, [pc, #-4] */
2011 0x00000000, /* dcd R_ARM_GLOB_DAT(X) */
2014 #define ARM_MAX_FWD_BRANCH_OFFSET ((((1 << 23) - 1) << 2) + 8)
2015 #define ARM_MAX_BWD_BRANCH_OFFSET ((-((1 << 23) << 2)) + 8)
2016 #define THM_MAX_FWD_BRANCH_OFFSET ((1 << 22) -2 + 4)
2017 #define THM_MAX_BWD_BRANCH_OFFSET (-(1 << 22) + 4)
2018 #define THM2_MAX_FWD_BRANCH_OFFSET (((1 << 24) - 2) + 4)
2019 #define THM2_MAX_BWD_BRANCH_OFFSET (-(1 << 24) + 4)
2029 #define THUMB16_INSN(X) {(X), THUMB16_TYPE, R_ARM_NONE, 0}
2030 #define THUMB32_INSN(X) {(X), THUMB32_TYPE, R_ARM_NONE, 0}
2031 #define ARM_INSN(X) {(X), ARM_TYPE, R_ARM_NONE, 0}
2032 #define ARM_REL_INSN(X, Z) {(X), ARM_TYPE, R_ARM_JUMP24, (Z)}
2033 #define DATA_WORD(X,Y,Z) {(X), DATA_TYPE, (Y), (Z)}
2038 enum stub_insn_type type
;
2039 unsigned int r_type
;
2043 /* Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
2044 to reach the stub if necessary. */
2045 static const insn_sequence elf32_arm_stub_long_branch_any_any
[] =
2047 ARM_INSN(0xe51ff004), /* ldr pc, [pc, #-4] */
2048 DATA_WORD(0, R_ARM_ABS32
, 0), /* dcd R_ARM_ABS32(X) */
2051 /* V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
2053 static const insn_sequence elf32_arm_stub_long_branch_v4t_arm_thumb
[] =
2055 ARM_INSN(0xe59fc000), /* ldr ip, [pc, #0] */
2056 ARM_INSN(0xe12fff1c), /* bx ip */
2057 DATA_WORD(0, R_ARM_ABS32
, 0), /* dcd R_ARM_ABS32(X) */
2060 /* Thumb -> Thumb long branch stub. Used on M-profile architectures. */
2061 static const insn_sequence elf32_arm_stub_long_branch_thumb_only
[] =
2063 THUMB16_INSN(0xb401), /* push {r0} */
2064 THUMB16_INSN(0x4802), /* ldr r0, [pc, #8] */
2065 THUMB16_INSN(0x4684), /* mov ip, r0 */
2066 THUMB16_INSN(0xbc01), /* pop {r0} */
2067 THUMB16_INSN(0x4760), /* bx ip */
2068 THUMB16_INSN(0xbf00), /* nop */
2069 DATA_WORD(0, R_ARM_ABS32
, 0), /* dcd R_ARM_ABS32(X) */
2072 /* V4T Thumb -> Thumb long branch stub. Using the stack is not
2074 static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_thumb
[] =
2076 THUMB16_INSN(0x4778), /* bx pc */
2077 THUMB16_INSN(0x46c0), /* nop */
2078 ARM_INSN(0xe59fc000), /* ldr ip, [pc, #0] */
2079 ARM_INSN(0xe12fff1c), /* bx ip */
2080 DATA_WORD(0, R_ARM_ABS32
, 0), /* dcd R_ARM_ABS32(X) */
2083 /* V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
2085 static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_arm
[] =
2087 THUMB16_INSN(0x4778), /* bx pc */
2088 THUMB16_INSN(0x46c0), /* nop */
2089 ARM_INSN(0xe51ff004), /* ldr pc, [pc, #-4] */
2090 DATA_WORD(0, R_ARM_ABS32
, 0), /* dcd R_ARM_ABS32(X) */
2093 /* V4T Thumb -> ARM short branch stub. Shorter variant of the above
2094 one, when the destination is close enough. */
2095 static const insn_sequence elf32_arm_stub_short_branch_v4t_thumb_arm
[] =
2097 THUMB16_INSN(0x4778), /* bx pc */
2098 THUMB16_INSN(0x46c0), /* nop */
2099 ARM_REL_INSN(0xea000000, -8), /* b (X-8) */
2102 /* ARM/Thumb -> ARM long branch stub, PIC. On V5T and above, use
2103 blx to reach the stub if necessary. */
2104 static const insn_sequence elf32_arm_stub_long_branch_any_arm_pic
[] =
2106 ARM_INSN(0xe59fc000), /* ldr r12, [pc] */
2107 ARM_INSN(0xe08ff00c), /* add pc, pc, ip */
2108 DATA_WORD(0, R_ARM_REL32
, -4), /* dcd R_ARM_REL32(X-4) */
2111 /* ARM/Thumb -> Thumb long branch stub, PIC. On V5T and above, use
2112 blx to reach the stub if necessary. We can not add into pc;
2113 it is not guaranteed to mode switch (different in ARMv6 and
2115 static const insn_sequence elf32_arm_stub_long_branch_any_thumb_pic
[] =
2117 ARM_INSN(0xe59fc004), /* ldr r12, [pc, #4] */
2118 ARM_INSN(0xe08fc00c), /* add ip, pc, ip */
2119 ARM_INSN(0xe12fff1c), /* bx ip */
2120 DATA_WORD(0, R_ARM_REL32
, 0), /* dcd R_ARM_REL32(X) */
2123 /* V4T ARM -> ARM long branch stub, PIC. */
2124 static const insn_sequence elf32_arm_stub_long_branch_v4t_arm_thumb_pic
[] =
2126 ARM_INSN(0xe59fc004), /* ldr ip, [pc, #4] */
2127 ARM_INSN(0xe08fc00c), /* add ip, pc, ip */
2128 ARM_INSN(0xe12fff1c), /* bx ip */
2129 DATA_WORD(0, R_ARM_REL32
, 0), /* dcd R_ARM_REL32(X) */
2132 /* V4T Thumb -> ARM long branch stub, PIC. */
2133 static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_arm_pic
[] =
2135 THUMB16_INSN(0x4778), /* bx pc */
2136 THUMB16_INSN(0x46c0), /* nop */
2137 ARM_INSN(0xe59fc000), /* ldr ip, [pc, #0] */
2138 ARM_INSN(0xe08cf00f), /* add pc, ip, pc */
2139 DATA_WORD(0, R_ARM_REL32
, -4), /* dcd R_ARM_REL32(X) */
2142 /* Thumb -> Thumb long branch stub, PIC. Used on M-profile
2144 static const insn_sequence elf32_arm_stub_long_branch_thumb_only_pic
[] =
2146 THUMB16_INSN(0xb401), /* push {r0} */
2147 THUMB16_INSN(0x4802), /* ldr r0, [pc, #8] */
2148 THUMB16_INSN(0x46fc), /* mov ip, pc */
2149 THUMB16_INSN(0x4484), /* add ip, r0 */
2150 THUMB16_INSN(0xbc01), /* pop {r0} */
2151 THUMB16_INSN(0x4760), /* bx ip */
2152 DATA_WORD(0, R_ARM_REL32
, 4), /* dcd R_ARM_REL32(X) */
2155 /* V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
2157 static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_thumb_pic
[] =
2159 THUMB16_INSN(0x4778), /* bx pc */
2160 THUMB16_INSN(0x46c0), /* nop */
2161 ARM_INSN(0xe59fc004), /* ldr ip, [pc, #4] */
2162 ARM_INSN(0xe08fc00c), /* add ip, pc, ip */
2163 ARM_INSN(0xe12fff1c), /* bx ip */
2164 DATA_WORD(0, R_ARM_REL32
, 0), /* dcd R_ARM_REL32(X) */
2167 /* Section name for stubs is the associated section name plus this
2169 #define STUB_SUFFIX ".stub"
2171 /* One entry per long/short branch stub defined above. */
2173 DEF_STUB(long_branch_any_any) \
2174 DEF_STUB(long_branch_v4t_arm_thumb) \
2175 DEF_STUB(long_branch_thumb_only) \
2176 DEF_STUB(long_branch_v4t_thumb_thumb) \
2177 DEF_STUB(long_branch_v4t_thumb_arm) \
2178 DEF_STUB(short_branch_v4t_thumb_arm) \
2179 DEF_STUB(long_branch_any_arm_pic) \
2180 DEF_STUB(long_branch_any_thumb_pic) \
2181 DEF_STUB(long_branch_v4t_thumb_thumb_pic) \
2182 DEF_STUB(long_branch_v4t_arm_thumb_pic) \
2183 DEF_STUB(long_branch_v4t_thumb_arm_pic) \
2184 DEF_STUB(long_branch_thumb_only_pic)
2186 #define DEF_STUB(x) arm_stub_##x,
2187 enum elf32_arm_stub_type
{
2195 const insn_sequence
* template;
2199 #define DEF_STUB(x) {elf32_arm_stub_##x, ARRAY_SIZE(elf32_arm_stub_##x)},
2200 static const stub_def stub_definitions
[] = {
2205 struct elf32_arm_stub_hash_entry
2207 /* Base hash table entry structure. */
2208 struct bfd_hash_entry root
;
2210 /* The stub section. */
2213 /* Offset within stub_sec of the beginning of this stub. */
2214 bfd_vma stub_offset
;
2216 /* Given the symbol's value and its section we can determine its final
2217 value when building the stubs (so the stub knows where to jump). */
2218 bfd_vma target_value
;
2219 asection
*target_section
;
2221 /* The stub type. */
2222 enum elf32_arm_stub_type stub_type
;
2223 /* Its encoding size in bytes. */
2226 const insn_sequence
*stub_template
;
2227 /* The size of the template (number of entries). */
2228 int stub_template_size
;
2230 /* The symbol table entry, if any, that this was derived from. */
2231 struct elf32_arm_link_hash_entry
*h
;
2233 /* Destination symbol type (STT_ARM_TFUNC, ...) */
2234 unsigned char st_type
;
2236 /* Where this stub is being called from, or, in the case of combined
2237 stub sections, the first input section in the group. */
2240 /* The name for the local symbol at the start of this stub. The
2241 stub name in the hash table has to be unique; this does not, so
2242 it can be friendlier. */
2246 /* Used to build a map of a section. This is required for mixed-endian
2249 typedef struct elf32_elf_section_map
2254 elf32_arm_section_map
;
2256 /* Information about a VFP11 erratum veneer, or a branch to such a veneer. */
2260 VFP11_ERRATUM_BRANCH_TO_ARM_VENEER
,
2261 VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER
,
2262 VFP11_ERRATUM_ARM_VENEER
,
2263 VFP11_ERRATUM_THUMB_VENEER
2265 elf32_vfp11_erratum_type
;
2267 typedef struct elf32_vfp11_erratum_list
2269 struct elf32_vfp11_erratum_list
*next
;
2275 struct elf32_vfp11_erratum_list
*veneer
;
2276 unsigned int vfp_insn
;
2280 struct elf32_vfp11_erratum_list
*branch
;
2284 elf32_vfp11_erratum_type type
;
2286 elf32_vfp11_erratum_list
;
2291 INSERT_EXIDX_CANTUNWIND_AT_END
2293 arm_unwind_edit_type
;
2295 /* A (sorted) list of edits to apply to an unwind table. */
2296 typedef struct arm_unwind_table_edit
2298 arm_unwind_edit_type type
;
2299 /* Note: we sometimes want to insert an unwind entry corresponding to a
2300 section different from the one we're currently writing out, so record the
2301 (text) section this edit relates to here. */
2302 asection
*linked_section
;
2304 struct arm_unwind_table_edit
*next
;
2306 arm_unwind_table_edit
;
2308 typedef struct _arm_elf_section_data
2310 /* Information about mapping symbols. */
2311 struct bfd_elf_section_data elf
;
2312 unsigned int mapcount
;
2313 unsigned int mapsize
;
2314 elf32_arm_section_map
*map
;
2315 /* Information about CPU errata. */
2316 unsigned int erratumcount
;
2317 elf32_vfp11_erratum_list
*erratumlist
;
2318 /* Information about unwind tables. */
2321 /* Unwind info attached to a text section. */
2324 asection
*arm_exidx_sec
;
2327 /* Unwind info attached to an .ARM.exidx section. */
2330 arm_unwind_table_edit
*unwind_edit_list
;
2331 arm_unwind_table_edit
*unwind_edit_tail
;
2335 _arm_elf_section_data
;
2337 #define elf32_arm_section_data(sec) \
2338 ((_arm_elf_section_data *) elf_section_data (sec))
2340 /* The size of the thread control block. */
2343 struct elf_arm_obj_tdata
2345 struct elf_obj_tdata root
;
2347 /* tls_type for each local got entry. */
2348 char *local_got_tls_type
;
2350 /* Zero to warn when linking objects with incompatible enum sizes. */
2351 int no_enum_size_warning
;
2353 /* Zero to warn when linking objects with incompatible wchar_t sizes. */
2354 int no_wchar_size_warning
;
2357 #define elf_arm_tdata(bfd) \
2358 ((struct elf_arm_obj_tdata *) (bfd)->tdata.any)
2360 #define elf32_arm_local_got_tls_type(bfd) \
2361 (elf_arm_tdata (bfd)->local_got_tls_type)
2363 #define is_arm_elf(bfd) \
2364 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2365 && elf_tdata (bfd) != NULL \
2366 && elf_object_id (bfd) == ARM_ELF_TDATA)
2369 elf32_arm_mkobject (bfd
*abfd
)
2371 return bfd_elf_allocate_object (abfd
, sizeof (struct elf_arm_obj_tdata
),
2375 /* The ARM linker needs to keep track of the number of relocs that it
2376 decides to copy in check_relocs for each symbol. This is so that
2377 it can discard PC relative relocs if it doesn't need them when
2378 linking with -Bsymbolic. We store the information in a field
2379 extending the regular ELF linker hash table. */
2381 /* This structure keeps track of the number of relocs we have copied
2382 for a given symbol. */
2383 struct elf32_arm_relocs_copied
2386 struct elf32_arm_relocs_copied
* next
;
2387 /* A section in dynobj. */
2389 /* Number of relocs copied in this section. */
2390 bfd_size_type count
;
2391 /* Number of PC-relative relocs copied in this section. */
2392 bfd_size_type pc_count
;
2395 #define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
2397 /* Arm ELF linker hash entry. */
2398 struct elf32_arm_link_hash_entry
2400 struct elf_link_hash_entry root
;
2402 /* Number of PC relative relocs copied for this symbol. */
2403 struct elf32_arm_relocs_copied
* relocs_copied
;
2405 /* We reference count Thumb references to a PLT entry separately,
2406 so that we can emit the Thumb trampoline only if needed. */
2407 bfd_signed_vma plt_thumb_refcount
;
2409 /* Some references from Thumb code may be eliminated by BL->BLX
2410 conversion, so record them separately. */
2411 bfd_signed_vma plt_maybe_thumb_refcount
;
2413 /* Since PLT entries have variable size if the Thumb prologue is
2414 used, we need to record the index into .got.plt instead of
2415 recomputing it from the PLT offset. */
2416 bfd_signed_vma plt_got_offset
;
2418 #define GOT_UNKNOWN 0
2419 #define GOT_NORMAL 1
2420 #define GOT_TLS_GD 2
2421 #define GOT_TLS_IE 4
2422 unsigned char tls_type
;
2424 /* The symbol marking the real symbol location for exported thumb
2425 symbols with Arm stubs. */
2426 struct elf_link_hash_entry
*export_glue
;
2428 /* A pointer to the most recently used stub hash entry against this
2430 struct elf32_arm_stub_hash_entry
*stub_cache
;
2433 /* Traverse an arm ELF linker hash table. */
2434 #define elf32_arm_link_hash_traverse(table, func, info) \
2435 (elf_link_hash_traverse \
2437 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
2440 /* Get the ARM elf linker hash table from a link_info structure. */
2441 #define elf32_arm_hash_table(info) \
2442 ((struct elf32_arm_link_hash_table *) ((info)->hash))
2444 #define arm_stub_hash_lookup(table, string, create, copy) \
2445 ((struct elf32_arm_stub_hash_entry *) \
2446 bfd_hash_lookup ((table), (string), (create), (copy)))
2448 /* ARM ELF linker hash table. */
2449 struct elf32_arm_link_hash_table
2451 /* The main hash table. */
2452 struct elf_link_hash_table root
;
2454 /* The size in bytes of the section containing the Thumb-to-ARM glue. */
2455 bfd_size_type thumb_glue_size
;
2457 /* The size in bytes of the section containing the ARM-to-Thumb glue. */
2458 bfd_size_type arm_glue_size
;
2460 /* The size in bytes of section containing the ARMv4 BX veneers. */
2461 bfd_size_type bx_glue_size
;
2463 /* Offsets of ARMv4 BX veneers. Bit1 set if present, and Bit0 set when
2464 veneer has been populated. */
2465 bfd_vma bx_glue_offset
[15];
2467 /* The size in bytes of the section containing glue for VFP11 erratum
2469 bfd_size_type vfp11_erratum_glue_size
;
2471 /* An arbitrary input BFD chosen to hold the glue sections. */
2472 bfd
* bfd_of_glue_owner
;
2474 /* Nonzero to output a BE8 image. */
2477 /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
2478 Nonzero if R_ARM_TARGET1 means R_ARM_REL32. */
2481 /* The relocation to use for R_ARM_TARGET2 relocations. */
2484 /* 0 = Ignore R_ARM_V4BX.
2485 1 = Convert BX to MOV PC.
2486 2 = Generate v4 interworing stubs. */
2489 /* Nonzero if the ARM/Thumb BLX instructions are available for use. */
2492 /* What sort of code sequences we should look for which may trigger the
2493 VFP11 denorm erratum. */
2494 bfd_arm_vfp11_fix vfp11_fix
;
2496 /* Global counter for the number of fixes we have emitted. */
2497 int num_vfp11_fixes
;
2499 /* Nonzero to force PIC branch veneers. */
2502 /* The number of bytes in the initial entry in the PLT. */
2503 bfd_size_type plt_header_size
;
2505 /* The number of bytes in the subsequent PLT etries. */
2506 bfd_size_type plt_entry_size
;
2508 /* True if the target system is VxWorks. */
2511 /* True if the target system is Symbian OS. */
2514 /* True if the target uses REL relocations. */
2517 /* Short-cuts to get to dynamic linker sections. */
2526 /* The (unloaded but important) VxWorks .rela.plt.unloaded section. */
2529 /* Data for R_ARM_TLS_LDM32 relocations. */
2532 bfd_signed_vma refcount
;
2536 /* Small local sym to section mapping cache. */
2537 struct sym_sec_cache sym_sec
;
2539 /* For convenience in allocate_dynrelocs. */
2542 /* The stub hash table. */
2543 struct bfd_hash_table stub_hash_table
;
2545 /* Linker stub bfd. */
2548 /* Linker call-backs. */
2549 asection
* (*add_stub_section
) (const char *, asection
*);
2550 void (*layout_sections_again
) (void);
2552 /* Array to keep track of which stub sections have been created, and
2553 information on stub grouping. */
2556 /* This is the section to which stubs in the group will be
2559 /* The stub section. */
2563 /* Assorted information used by elf32_arm_size_stubs. */
2564 unsigned int bfd_count
;
2566 asection
**input_list
;
2569 /* Create an entry in an ARM ELF linker hash table. */
2571 static struct bfd_hash_entry
*
2572 elf32_arm_link_hash_newfunc (struct bfd_hash_entry
* entry
,
2573 struct bfd_hash_table
* table
,
2574 const char * string
)
2576 struct elf32_arm_link_hash_entry
* ret
=
2577 (struct elf32_arm_link_hash_entry
*) entry
;
2579 /* Allocate the structure if it has not already been allocated by a
2582 ret
= bfd_hash_allocate (table
, sizeof (struct elf32_arm_link_hash_entry
));
2584 return (struct bfd_hash_entry
*) ret
;
2586 /* Call the allocation method of the superclass. */
2587 ret
= ((struct elf32_arm_link_hash_entry
*)
2588 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
2592 ret
->relocs_copied
= NULL
;
2593 ret
->tls_type
= GOT_UNKNOWN
;
2594 ret
->plt_thumb_refcount
= 0;
2595 ret
->plt_maybe_thumb_refcount
= 0;
2596 ret
->plt_got_offset
= -1;
2597 ret
->export_glue
= NULL
;
2599 ret
->stub_cache
= NULL
;
2602 return (struct bfd_hash_entry
*) ret
;
2605 /* Initialize an entry in the stub hash table. */
2607 static struct bfd_hash_entry
*
2608 stub_hash_newfunc (struct bfd_hash_entry
*entry
,
2609 struct bfd_hash_table
*table
,
2612 /* Allocate the structure if it has not already been allocated by a
2616 entry
= bfd_hash_allocate (table
,
2617 sizeof (struct elf32_arm_stub_hash_entry
));
2622 /* Call the allocation method of the superclass. */
2623 entry
= bfd_hash_newfunc (entry
, table
, string
);
2626 struct elf32_arm_stub_hash_entry
*eh
;
2628 /* Initialize the local fields. */
2629 eh
= (struct elf32_arm_stub_hash_entry
*) entry
;
2630 eh
->stub_sec
= NULL
;
2631 eh
->stub_offset
= 0;
2632 eh
->target_value
= 0;
2633 eh
->target_section
= NULL
;
2634 eh
->stub_type
= arm_stub_none
;
2636 eh
->stub_template
= NULL
;
2637 eh
->stub_template_size
= 0;
2645 /* Create .got, .gotplt, and .rel(a).got sections in DYNOBJ, and set up
2646 shortcuts to them in our hash table. */
2649 create_got_section (bfd
*dynobj
, struct bfd_link_info
*info
)
2651 struct elf32_arm_link_hash_table
*htab
;
2653 htab
= elf32_arm_hash_table (info
);
2654 /* BPABI objects never have a GOT, or associated sections. */
2655 if (htab
->symbian_p
)
2658 if (! _bfd_elf_create_got_section (dynobj
, info
))
2661 htab
->sgot
= bfd_get_section_by_name (dynobj
, ".got");
2662 htab
->sgotplt
= bfd_get_section_by_name (dynobj
, ".got.plt");
2663 if (!htab
->sgot
|| !htab
->sgotplt
)
2666 htab
->srelgot
= bfd_make_section_with_flags (dynobj
,
2667 RELOC_SECTION (htab
, ".got"),
2668 (SEC_ALLOC
| SEC_LOAD
2671 | SEC_LINKER_CREATED
2673 if (htab
->srelgot
== NULL
2674 || ! bfd_set_section_alignment (dynobj
, htab
->srelgot
, 2))
2679 /* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
2680 .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
2684 elf32_arm_create_dynamic_sections (bfd
*dynobj
, struct bfd_link_info
*info
)
2686 struct elf32_arm_link_hash_table
*htab
;
2688 htab
= elf32_arm_hash_table (info
);
2689 if (!htab
->sgot
&& !create_got_section (dynobj
, info
))
2692 if (!_bfd_elf_create_dynamic_sections (dynobj
, info
))
2695 htab
->splt
= bfd_get_section_by_name (dynobj
, ".plt");
2696 htab
->srelplt
= bfd_get_section_by_name (dynobj
,
2697 RELOC_SECTION (htab
, ".plt"));
2698 htab
->sdynbss
= bfd_get_section_by_name (dynobj
, ".dynbss");
2700 htab
->srelbss
= bfd_get_section_by_name (dynobj
,
2701 RELOC_SECTION (htab
, ".bss"));
2703 if (htab
->vxworks_p
)
2705 if (!elf_vxworks_create_dynamic_sections (dynobj
, info
, &htab
->srelplt2
))
2710 htab
->plt_header_size
= 0;
2711 htab
->plt_entry_size
2712 = 4 * ARRAY_SIZE (elf32_arm_vxworks_shared_plt_entry
);
2716 htab
->plt_header_size
2717 = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt0_entry
);
2718 htab
->plt_entry_size
2719 = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt_entry
);
2726 || (!info
->shared
&& !htab
->srelbss
))
2732 /* Copy the extra info we tack onto an elf_link_hash_entry. */
2735 elf32_arm_copy_indirect_symbol (struct bfd_link_info
*info
,
2736 struct elf_link_hash_entry
*dir
,
2737 struct elf_link_hash_entry
*ind
)
2739 struct elf32_arm_link_hash_entry
*edir
, *eind
;
2741 edir
= (struct elf32_arm_link_hash_entry
*) dir
;
2742 eind
= (struct elf32_arm_link_hash_entry
*) ind
;
2744 if (eind
->relocs_copied
!= NULL
)
2746 if (edir
->relocs_copied
!= NULL
)
2748 struct elf32_arm_relocs_copied
**pp
;
2749 struct elf32_arm_relocs_copied
*p
;
2751 /* Add reloc counts against the indirect sym to the direct sym
2752 list. Merge any entries against the same section. */
2753 for (pp
= &eind
->relocs_copied
; (p
= *pp
) != NULL
; )
2755 struct elf32_arm_relocs_copied
*q
;
2757 for (q
= edir
->relocs_copied
; q
!= NULL
; q
= q
->next
)
2758 if (q
->section
== p
->section
)
2760 q
->pc_count
+= p
->pc_count
;
2761 q
->count
+= p
->count
;
2768 *pp
= edir
->relocs_copied
;
2771 edir
->relocs_copied
= eind
->relocs_copied
;
2772 eind
->relocs_copied
= NULL
;
2775 if (ind
->root
.type
== bfd_link_hash_indirect
)
2777 /* Copy over PLT info. */
2778 edir
->plt_thumb_refcount
+= eind
->plt_thumb_refcount
;
2779 eind
->plt_thumb_refcount
= 0;
2780 edir
->plt_maybe_thumb_refcount
+= eind
->plt_maybe_thumb_refcount
;
2781 eind
->plt_maybe_thumb_refcount
= 0;
2783 if (dir
->got
.refcount
<= 0)
2785 edir
->tls_type
= eind
->tls_type
;
2786 eind
->tls_type
= GOT_UNKNOWN
;
2790 _bfd_elf_link_hash_copy_indirect (info
, dir
, ind
);
2793 /* Create an ARM elf linker hash table. */
2795 static struct bfd_link_hash_table
*
2796 elf32_arm_link_hash_table_create (bfd
*abfd
)
2798 struct elf32_arm_link_hash_table
*ret
;
2799 bfd_size_type amt
= sizeof (struct elf32_arm_link_hash_table
);
2801 ret
= bfd_malloc (amt
);
2805 if (!_bfd_elf_link_hash_table_init (& ret
->root
, abfd
,
2806 elf32_arm_link_hash_newfunc
,
2807 sizeof (struct elf32_arm_link_hash_entry
)))
2814 ret
->sgotplt
= NULL
;
2815 ret
->srelgot
= NULL
;
2817 ret
->srelplt
= NULL
;
2818 ret
->sdynbss
= NULL
;
2819 ret
->srelbss
= NULL
;
2820 ret
->srelplt2
= NULL
;
2821 ret
->thumb_glue_size
= 0;
2822 ret
->arm_glue_size
= 0;
2823 ret
->bx_glue_size
= 0;
2824 memset (ret
->bx_glue_offset
, 0, sizeof (ret
->bx_glue_offset
));
2825 ret
->vfp11_fix
= BFD_ARM_VFP11_FIX_NONE
;
2826 ret
->vfp11_erratum_glue_size
= 0;
2827 ret
->num_vfp11_fixes
= 0;
2828 ret
->bfd_of_glue_owner
= NULL
;
2829 ret
->byteswap_code
= 0;
2830 ret
->target1_is_rel
= 0;
2831 ret
->target2_reloc
= R_ARM_NONE
;
2832 #ifdef FOUR_WORD_PLT
2833 ret
->plt_header_size
= 16;
2834 ret
->plt_entry_size
= 16;
2836 ret
->plt_header_size
= 20;
2837 ret
->plt_entry_size
= 12;
2844 ret
->sym_sec
.abfd
= NULL
;
2846 ret
->tls_ldm_got
.refcount
= 0;
2847 ret
->stub_bfd
= NULL
;
2848 ret
->add_stub_section
= NULL
;
2849 ret
->layout_sections_again
= NULL
;
2850 ret
->stub_group
= NULL
;
2853 ret
->input_list
= NULL
;
2855 if (!bfd_hash_table_init (&ret
->stub_hash_table
, stub_hash_newfunc
,
2856 sizeof (struct elf32_arm_stub_hash_entry
)))
2862 return &ret
->root
.root
;
2865 /* Free the derived linker hash table. */
2868 elf32_arm_hash_table_free (struct bfd_link_hash_table
*hash
)
2870 struct elf32_arm_link_hash_table
*ret
2871 = (struct elf32_arm_link_hash_table
*) hash
;
2873 bfd_hash_table_free (&ret
->stub_hash_table
);
2874 _bfd_generic_link_hash_table_free (hash
);
2877 /* Determine if we're dealing with a Thumb only architecture. */
2880 using_thumb_only (struct elf32_arm_link_hash_table
*globals
)
2882 int arch
= bfd_elf_get_obj_attr_int (globals
->obfd
, OBJ_ATTR_PROC
,
2886 if (arch
!= TAG_CPU_ARCH_V7
)
2889 profile
= bfd_elf_get_obj_attr_int (globals
->obfd
, OBJ_ATTR_PROC
,
2890 Tag_CPU_arch_profile
);
2892 return profile
== 'M';
2895 /* Determine if we're dealing with a Thumb-2 object. */
2898 using_thumb2 (struct elf32_arm_link_hash_table
*globals
)
2900 int arch
= bfd_elf_get_obj_attr_int (globals
->obfd
, OBJ_ATTR_PROC
,
2902 return arch
== TAG_CPU_ARCH_V6T2
|| arch
>= TAG_CPU_ARCH_V7
;
2906 arm_stub_is_thumb (enum elf32_arm_stub_type stub_type
)
2910 case arm_stub_long_branch_thumb_only
:
2911 case arm_stub_long_branch_v4t_thumb_arm
:
2912 case arm_stub_short_branch_v4t_thumb_arm
:
2913 case arm_stub_long_branch_v4t_thumb_arm_pic
:
2914 case arm_stub_long_branch_thumb_only_pic
:
2925 /* Determine the type of stub needed, if any, for a call. */
2927 static enum elf32_arm_stub_type
2928 arm_type_of_stub (struct bfd_link_info
*info
,
2929 asection
*input_sec
,
2930 const Elf_Internal_Rela
*rel
,
2931 unsigned char st_type
,
2932 struct elf32_arm_link_hash_entry
*hash
,
2933 bfd_vma destination
,
2939 bfd_signed_vma branch_offset
;
2940 unsigned int r_type
;
2941 struct elf32_arm_link_hash_table
* globals
;
2944 enum elf32_arm_stub_type stub_type
= arm_stub_none
;
2947 /* We don't know the actual type of destination in case it is of
2948 type STT_SECTION: give up. */
2949 if (st_type
== STT_SECTION
)
2952 globals
= elf32_arm_hash_table (info
);
2954 thumb_only
= using_thumb_only (globals
);
2956 thumb2
= using_thumb2 (globals
);
2958 /* Determine where the call point is. */
2959 location
= (input_sec
->output_offset
2960 + input_sec
->output_section
->vma
2963 branch_offset
= (bfd_signed_vma
)(destination
- location
);
2965 r_type
= ELF32_R_TYPE (rel
->r_info
);
2967 /* Keep a simpler condition, for the sake of clarity. */
2968 if (globals
->splt
!= NULL
&& hash
!= NULL
&& hash
->root
.plt
.offset
!= (bfd_vma
) -1)
2971 /* Note when dealing with PLT entries: the main PLT stub is in
2972 ARM mode, so if the branch is in Thumb mode, another
2973 Thumb->ARM stub will be inserted later just before the ARM
2974 PLT stub. We don't take this extra distance into account
2975 here, because if a long branch stub is needed, we'll add a
2976 Thumb->Arm one and branch directly to the ARM PLT entry
2977 because it avoids spreading offset corrections in several
2981 if (r_type
== R_ARM_THM_CALL
|| r_type
== R_ARM_THM_JUMP24
)
2983 /* Handle cases where:
2984 - this call goes too far (different Thumb/Thumb2 max
2986 - it's a Thumb->Arm call and blx is not available, or it's a
2987 Thumb->Arm branch (not bl). A stub is needed in this case,
2988 but only if this call is not through a PLT entry. Indeed,
2989 PLT stubs handle mode switching already.
2992 && (branch_offset
> THM_MAX_FWD_BRANCH_OFFSET
2993 || (branch_offset
< THM_MAX_BWD_BRANCH_OFFSET
)))
2995 && (branch_offset
> THM2_MAX_FWD_BRANCH_OFFSET
2996 || (branch_offset
< THM2_MAX_BWD_BRANCH_OFFSET
)))
2997 || ((st_type
!= STT_ARM_TFUNC
)
2998 && (((r_type
== R_ARM_THM_CALL
) && !globals
->use_blx
)
2999 || (r_type
== R_ARM_THM_JUMP24
))
3002 if (st_type
== STT_ARM_TFUNC
)
3004 /* Thumb to thumb. */
3007 stub_type
= (info
->shared
| globals
->pic_veneer
)
3009 ? ((globals
->use_blx
3010 && (r_type
==R_ARM_THM_CALL
))
3011 /* V5T and above. Stub starts with ARM code, so
3012 we must be able to switch mode before
3013 reaching it, which is only possible for 'bl'
3014 (ie R_ARM_THM_CALL relocation). */
3015 ? arm_stub_long_branch_any_thumb_pic
3016 /* On V4T, use Thumb code only. */
3017 : arm_stub_long_branch_v4t_thumb_thumb_pic
)
3019 /* non-PIC stubs. */
3020 : ((globals
->use_blx
3021 && (r_type
==R_ARM_THM_CALL
))
3022 /* V5T and above. */
3023 ? arm_stub_long_branch_any_any
3025 : arm_stub_long_branch_v4t_thumb_thumb
);
3029 stub_type
= (info
->shared
| globals
->pic_veneer
)
3031 ? arm_stub_long_branch_thumb_only_pic
3033 : arm_stub_long_branch_thumb_only
;
3040 && sym_sec
->owner
!= NULL
3041 && !INTERWORK_FLAG (sym_sec
->owner
))
3043 (*_bfd_error_handler
)
3044 (_("%B(%s): warning: interworking not enabled.\n"
3045 " first occurrence: %B: Thumb call to ARM"),
3046 sym_sec
->owner
, input_bfd
, name
);
3049 stub_type
= (info
->shared
| globals
->pic_veneer
)
3051 ? ((globals
->use_blx
3052 && (r_type
==R_ARM_THM_CALL
))
3053 /* V5T and above. */
3054 ? arm_stub_long_branch_any_arm_pic
3056 : arm_stub_long_branch_v4t_thumb_arm_pic
)
3058 /* non-PIC stubs. */
3059 : ((globals
->use_blx
3060 && (r_type
==R_ARM_THM_CALL
))
3061 /* V5T and above. */
3062 ? arm_stub_long_branch_any_any
3064 : arm_stub_long_branch_v4t_thumb_arm
);
3066 /* Handle v4t short branches. */
3067 if ((stub_type
== arm_stub_long_branch_v4t_thumb_arm
)
3068 && (branch_offset
<= THM_MAX_FWD_BRANCH_OFFSET
)
3069 && (branch_offset
>= THM_MAX_BWD_BRANCH_OFFSET
))
3070 stub_type
= arm_stub_short_branch_v4t_thumb_arm
;
3074 else if (r_type
== R_ARM_CALL
|| r_type
== R_ARM_JUMP24
|| r_type
== R_ARM_PLT32
)
3076 if (st_type
== STT_ARM_TFUNC
)
3081 && sym_sec
->owner
!= NULL
3082 && !INTERWORK_FLAG (sym_sec
->owner
))
3084 (*_bfd_error_handler
)
3085 (_("%B(%s): warning: interworking not enabled.\n"
3086 " first occurrence: %B: ARM call to Thumb"),
3087 sym_sec
->owner
, input_bfd
, name
);
3090 /* We have an extra 2-bytes reach because of
3091 the mode change (bit 24 (H) of BLX encoding). */
3092 if (branch_offset
> (ARM_MAX_FWD_BRANCH_OFFSET
+ 2)
3093 || (branch_offset
< ARM_MAX_BWD_BRANCH_OFFSET
)
3094 || ((r_type
== R_ARM_CALL
) && !globals
->use_blx
)
3095 || (r_type
== R_ARM_JUMP24
)
3096 || (r_type
== R_ARM_PLT32
))
3098 stub_type
= (info
->shared
| globals
->pic_veneer
)
3100 ? ((globals
->use_blx
)
3101 /* V5T and above. */
3102 ? arm_stub_long_branch_any_thumb_pic
3104 : arm_stub_long_branch_v4t_arm_thumb_pic
)
3106 /* non-PIC stubs. */
3107 : ((globals
->use_blx
)
3108 /* V5T and above. */
3109 ? arm_stub_long_branch_any_any
3111 : arm_stub_long_branch_v4t_arm_thumb
);
3117 if (branch_offset
> ARM_MAX_FWD_BRANCH_OFFSET
3118 || (branch_offset
< ARM_MAX_BWD_BRANCH_OFFSET
))
3120 stub_type
= (info
->shared
| globals
->pic_veneer
)
3122 ? arm_stub_long_branch_any_arm_pic
3123 /* non-PIC stubs. */
3124 : arm_stub_long_branch_any_any
;
3132 /* Build a name for an entry in the stub hash table. */
3135 elf32_arm_stub_name (const asection
*input_section
,
3136 const asection
*sym_sec
,
3137 const struct elf32_arm_link_hash_entry
*hash
,
3138 const Elf_Internal_Rela
*rel
)
3145 len
= 8 + 1 + strlen (hash
->root
.root
.root
.string
) + 1 + 8 + 1;
3146 stub_name
= bfd_malloc (len
);
3147 if (stub_name
!= NULL
)
3148 sprintf (stub_name
, "%08x_%s+%x",
3149 input_section
->id
& 0xffffffff,
3150 hash
->root
.root
.root
.string
,
3151 (int) rel
->r_addend
& 0xffffffff);
3155 len
= 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
3156 stub_name
= bfd_malloc (len
);
3157 if (stub_name
!= NULL
)
3158 sprintf (stub_name
, "%08x_%x:%x+%x",
3159 input_section
->id
& 0xffffffff,
3160 sym_sec
->id
& 0xffffffff,
3161 (int) ELF32_R_SYM (rel
->r_info
) & 0xffffffff,
3162 (int) rel
->r_addend
& 0xffffffff);
3168 /* Look up an entry in the stub hash. Stub entries are cached because
3169 creating the stub name takes a bit of time. */
3171 static struct elf32_arm_stub_hash_entry
*
3172 elf32_arm_get_stub_entry (const asection
*input_section
,
3173 const asection
*sym_sec
,
3174 struct elf_link_hash_entry
*hash
,
3175 const Elf_Internal_Rela
*rel
,
3176 struct elf32_arm_link_hash_table
*htab
)
3178 struct elf32_arm_stub_hash_entry
*stub_entry
;
3179 struct elf32_arm_link_hash_entry
*h
= (struct elf32_arm_link_hash_entry
*) hash
;
3180 const asection
*id_sec
;
3182 if ((input_section
->flags
& SEC_CODE
) == 0)
3185 /* If this input section is part of a group of sections sharing one
3186 stub section, then use the id of the first section in the group.
3187 Stub names need to include a section id, as there may well be
3188 more than one stub used to reach say, printf, and we need to
3189 distinguish between them. */
3190 id_sec
= htab
->stub_group
[input_section
->id
].link_sec
;
3192 if (h
!= NULL
&& h
->stub_cache
!= NULL
3193 && h
->stub_cache
->h
== h
3194 && h
->stub_cache
->id_sec
== id_sec
)
3196 stub_entry
= h
->stub_cache
;
3202 stub_name
= elf32_arm_stub_name (id_sec
, sym_sec
, h
, rel
);
3203 if (stub_name
== NULL
)
3206 stub_entry
= arm_stub_hash_lookup (&htab
->stub_hash_table
,
3207 stub_name
, FALSE
, FALSE
);
3209 h
->stub_cache
= stub_entry
;
3217 /* Add a new stub entry to the stub hash. Not all fields of the new
3218 stub entry are initialised. */
3220 static struct elf32_arm_stub_hash_entry
*
3221 elf32_arm_add_stub (const char *stub_name
,
3223 struct elf32_arm_link_hash_table
*htab
)
3227 struct elf32_arm_stub_hash_entry
*stub_entry
;
3229 link_sec
= htab
->stub_group
[section
->id
].link_sec
;
3230 stub_sec
= htab
->stub_group
[section
->id
].stub_sec
;
3231 if (stub_sec
== NULL
)
3233 stub_sec
= htab
->stub_group
[link_sec
->id
].stub_sec
;
3234 if (stub_sec
== NULL
)
3240 namelen
= strlen (link_sec
->name
);
3241 len
= namelen
+ sizeof (STUB_SUFFIX
);
3242 s_name
= bfd_alloc (htab
->stub_bfd
, len
);
3246 memcpy (s_name
, link_sec
->name
, namelen
);
3247 memcpy (s_name
+ namelen
, STUB_SUFFIX
, sizeof (STUB_SUFFIX
));
3248 stub_sec
= (*htab
->add_stub_section
) (s_name
, link_sec
);
3249 if (stub_sec
== NULL
)
3251 htab
->stub_group
[link_sec
->id
].stub_sec
= stub_sec
;
3253 htab
->stub_group
[section
->id
].stub_sec
= stub_sec
;
3256 /* Enter this entry into the linker stub hash table. */
3257 stub_entry
= arm_stub_hash_lookup (&htab
->stub_hash_table
, stub_name
,
3259 if (stub_entry
== NULL
)
3261 (*_bfd_error_handler
) (_("%s: cannot create stub entry %s"),
3267 stub_entry
->stub_sec
= stub_sec
;
3268 stub_entry
->stub_offset
= 0;
3269 stub_entry
->id_sec
= link_sec
;
3274 /* Store an Arm insn into an output section not processed by
3275 elf32_arm_write_section. */
3278 put_arm_insn (struct elf32_arm_link_hash_table
* htab
,
3279 bfd
* output_bfd
, bfd_vma val
, void * ptr
)
3281 if (htab
->byteswap_code
!= bfd_little_endian (output_bfd
))
3282 bfd_putl32 (val
, ptr
);
3284 bfd_putb32 (val
, ptr
);
3287 /* Store a 16-bit Thumb insn into an output section not processed by
3288 elf32_arm_write_section. */
3291 put_thumb_insn (struct elf32_arm_link_hash_table
* htab
,
3292 bfd
* output_bfd
, bfd_vma val
, void * ptr
)
3294 if (htab
->byteswap_code
!= bfd_little_endian (output_bfd
))
3295 bfd_putl16 (val
, ptr
);
3297 bfd_putb16 (val
, ptr
);
3301 arm_build_one_stub (struct bfd_hash_entry
*gen_entry
,
3304 struct elf32_arm_stub_hash_entry
*stub_entry
;
3305 struct bfd_link_info
*info
;
3306 struct elf32_arm_link_hash_table
*htab
;
3314 const insn_sequence
*template;
3316 struct elf32_arm_link_hash_table
* globals
;
3317 int stub_reloc_idx
= -1;
3318 int stub_reloc_offset
= 0;
3320 /* Massage our args to the form they really have. */
3321 stub_entry
= (struct elf32_arm_stub_hash_entry
*) gen_entry
;
3322 info
= (struct bfd_link_info
*) in_arg
;
3324 globals
= elf32_arm_hash_table (info
);
3326 htab
= elf32_arm_hash_table (info
);
3327 stub_sec
= stub_entry
->stub_sec
;
3329 /* Make a note of the offset within the stubs for this entry. */
3330 stub_entry
->stub_offset
= stub_sec
->size
;
3331 loc
= stub_sec
->contents
+ stub_entry
->stub_offset
;
3333 stub_bfd
= stub_sec
->owner
;
3335 /* This is the address of the start of the stub. */
3336 stub_addr
= stub_sec
->output_section
->vma
+ stub_sec
->output_offset
3337 + stub_entry
->stub_offset
;
3339 /* This is the address of the stub destination. */
3340 sym_value
= (stub_entry
->target_value
3341 + stub_entry
->target_section
->output_offset
3342 + stub_entry
->target_section
->output_section
->vma
);
3344 template = stub_entry
->stub_template
;
3345 template_size
= stub_entry
->stub_template_size
;
3348 for (i
= 0; i
< template_size
; i
++)
3350 switch (template[i
].type
)
3353 put_thumb_insn (globals
, stub_bfd
, template[i
].data
, loc
+ size
);
3358 put_arm_insn (globals
, stub_bfd
, template[i
].data
, loc
+ size
);
3359 /* Handle cases where the target is encoded within the
3361 if (template[i
].r_type
== R_ARM_JUMP24
)
3364 stub_reloc_offset
= size
;
3370 bfd_put_32 (stub_bfd
, template[i
].data
, loc
+ size
);
3372 stub_reloc_offset
= size
;
3382 stub_sec
->size
+= size
;
3384 /* Stub size has already been computed in arm_size_one_stub. Check
3386 BFD_ASSERT (size
== stub_entry
->stub_size
);
3388 /* Destination is Thumb. Force bit 0 to 1 to reflect this. */
3389 if (stub_entry
->st_type
== STT_ARM_TFUNC
)
3392 /* Assume there is one and only one entry to relocate in each stub. */
3393 BFD_ASSERT (stub_reloc_idx
!= -1);
3395 _bfd_final_link_relocate (elf32_arm_howto_from_type (template[stub_reloc_idx
].r_type
),
3396 stub_bfd
, stub_sec
, stub_sec
->contents
,
3397 stub_entry
->stub_offset
+ stub_reloc_offset
,
3398 sym_value
, template[stub_reloc_idx
].reloc_addend
);
3403 /* As above, but don't actually build the stub. Just bump offset so
3404 we know stub section sizes. */
3407 arm_size_one_stub (struct bfd_hash_entry
*gen_entry
,
3410 struct elf32_arm_stub_hash_entry
*stub_entry
;
3411 struct elf32_arm_link_hash_table
*htab
;
3412 const insn_sequence
*template;
3417 /* Massage our args to the form they really have. */
3418 stub_entry
= (struct elf32_arm_stub_hash_entry
*) gen_entry
;
3419 htab
= (struct elf32_arm_link_hash_table
*) in_arg
;
3421 BFD_ASSERT((stub_entry
->stub_type
> arm_stub_none
)
3422 && stub_entry
->stub_type
< ARRAY_SIZE(stub_definitions
));
3424 template = stub_definitions
[stub_entry
->stub_type
].template;
3425 template_size
= stub_definitions
[stub_entry
->stub_type
].template_size
;
3428 for (i
= 0; i
< template_size
; i
++)
3430 switch (template[i
].type
)
3450 stub_entry
->stub_size
= size
;
3451 stub_entry
->stub_template
= template;
3452 stub_entry
->stub_template_size
= template_size
;
3454 size
= (size
+ 7) & ~7;
3455 stub_entry
->stub_sec
->size
+= size
;
3460 /* External entry points for sizing and building linker stubs. */
3462 /* Set up various things so that we can make a list of input sections
3463 for each output section included in the link. Returns -1 on error,
3464 0 when no stubs will be needed, and 1 on success. */
3467 elf32_arm_setup_section_lists (bfd
*output_bfd
,
3468 struct bfd_link_info
*info
)
3471 unsigned int bfd_count
;
3472 int top_id
, top_index
;
3474 asection
**input_list
, **list
;
3476 struct elf32_arm_link_hash_table
*htab
= elf32_arm_hash_table (info
);
3478 if (! is_elf_hash_table (htab
))
3481 /* Count the number of input BFDs and find the top input section id. */
3482 for (input_bfd
= info
->input_bfds
, bfd_count
= 0, top_id
= 0;
3484 input_bfd
= input_bfd
->link_next
)
3487 for (section
= input_bfd
->sections
;
3489 section
= section
->next
)
3491 if (top_id
< section
->id
)
3492 top_id
= section
->id
;
3495 htab
->bfd_count
= bfd_count
;
3497 amt
= sizeof (struct map_stub
) * (top_id
+ 1);
3498 htab
->stub_group
= bfd_zmalloc (amt
);
3499 if (htab
->stub_group
== NULL
)
3502 /* We can't use output_bfd->section_count here to find the top output
3503 section index as some sections may have been removed, and
3504 _bfd_strip_section_from_output doesn't renumber the indices. */
3505 for (section
= output_bfd
->sections
, top_index
= 0;
3507 section
= section
->next
)
3509 if (top_index
< section
->index
)
3510 top_index
= section
->index
;
3513 htab
->top_index
= top_index
;
3514 amt
= sizeof (asection
*) * (top_index
+ 1);
3515 input_list
= bfd_malloc (amt
);
3516 htab
->input_list
= input_list
;
3517 if (input_list
== NULL
)
3520 /* For sections we aren't interested in, mark their entries with a
3521 value we can check later. */
3522 list
= input_list
+ top_index
;
3524 *list
= bfd_abs_section_ptr
;
3525 while (list
-- != input_list
);
3527 for (section
= output_bfd
->sections
;
3529 section
= section
->next
)
3531 if ((section
->flags
& SEC_CODE
) != 0)
3532 input_list
[section
->index
] = NULL
;
3538 /* The linker repeatedly calls this function for each input section,
3539 in the order that input sections are linked into output sections.
3540 Build lists of input sections to determine groupings between which
3541 we may insert linker stubs. */
3544 elf32_arm_next_input_section (struct bfd_link_info
*info
,
3547 struct elf32_arm_link_hash_table
*htab
= elf32_arm_hash_table (info
);
3549 if (isec
->output_section
->index
<= htab
->top_index
)
3551 asection
**list
= htab
->input_list
+ isec
->output_section
->index
;
3553 if (*list
!= bfd_abs_section_ptr
)
3555 /* Steal the link_sec pointer for our list. */
3556 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
3557 /* This happens to make the list in reverse order,
3558 which we reverse later. */
3559 PREV_SEC (isec
) = *list
;
3565 /* See whether we can group stub sections together. Grouping stub
3566 sections may result in fewer stubs. More importantly, we need to
3567 put all .init* and .fini* stubs at the end of the .init or
3568 .fini output sections respectively, because glibc splits the
3569 _init and _fini functions into multiple parts. Putting a stub in
3570 the middle of a function is not a good idea. */
3573 group_sections (struct elf32_arm_link_hash_table
*htab
,
3574 bfd_size_type stub_group_size
,
3575 bfd_boolean stubs_always_after_branch
)
3577 asection
**list
= htab
->input_list
;
3581 asection
*tail
= *list
;
3584 if (tail
== bfd_abs_section_ptr
)
3587 /* Reverse the list: we must avoid placing stubs at the
3588 beginning of the section because the beginning of the text
3589 section may be required for an interrupt vector in bare metal
3591 #define NEXT_SEC PREV_SEC
3593 while (tail
!= NULL
)
3595 /* Pop from tail. */
3596 asection
*item
= tail
;
3597 tail
= PREV_SEC (item
);
3600 NEXT_SEC (item
) = head
;
3604 while (head
!= NULL
)
3608 bfd_vma stub_group_start
= head
->output_offset
;
3609 bfd_vma end_of_next
;
3612 while (NEXT_SEC (curr
) != NULL
)
3614 next
= NEXT_SEC (curr
);
3615 end_of_next
= next
->output_offset
+ next
->size
;
3616 if (end_of_next
- stub_group_start
>= stub_group_size
)
3617 /* End of NEXT is too far from start, so stop. */
3619 /* Add NEXT to the group. */
3623 /* OK, the size from the start to the start of CURR is less
3624 than stub_group_size and thus can be handled by one stub
3625 section. (Or the head section is itself larger than
3626 stub_group_size, in which case we may be toast.)
3627 We should really be keeping track of the total size of
3628 stubs added here, as stubs contribute to the final output
3632 next
= NEXT_SEC (head
);
3633 /* Set up this stub group. */
3634 htab
->stub_group
[head
->id
].link_sec
= curr
;
3636 while (head
!= curr
&& (head
= next
) != NULL
);
3638 /* But wait, there's more! Input sections up to stub_group_size
3639 bytes after the stub section can be handled by it too. */
3640 if (!stubs_always_after_branch
)
3642 stub_group_start
= curr
->output_offset
+ curr
->size
;
3644 while (next
!= NULL
)
3646 end_of_next
= next
->output_offset
+ next
->size
;
3647 if (end_of_next
- stub_group_start
>= stub_group_size
)
3648 /* End of NEXT is too far from stubs, so stop. */
3650 /* Add NEXT to the stub group. */
3652 next
= NEXT_SEC (head
);
3653 htab
->stub_group
[head
->id
].link_sec
= curr
;
3659 while (list
++ != htab
->input_list
+ htab
->top_index
);
3661 free (htab
->input_list
);
3666 /* Determine and set the size of the stub section for a final link.
3668 The basic idea here is to examine all the relocations looking for
3669 PC-relative calls to a target that is unreachable with a "bl"
3673 elf32_arm_size_stubs (bfd
*output_bfd
,
3675 struct bfd_link_info
*info
,
3676 bfd_signed_vma group_size
,
3677 asection
* (*add_stub_section
) (const char *, asection
*),
3678 void (*layout_sections_again
) (void))
3680 bfd_size_type stub_group_size
;
3681 bfd_boolean stubs_always_after_branch
;
3682 bfd_boolean stub_changed
= 0;
3683 struct elf32_arm_link_hash_table
*htab
= elf32_arm_hash_table (info
);
3685 /* Propagate mach to stub bfd, because it may not have been
3686 finalized when we created stub_bfd. */
3687 bfd_set_arch_mach (stub_bfd
, bfd_get_arch (output_bfd
),
3688 bfd_get_mach (output_bfd
));
3690 /* Stash our params away. */
3691 htab
->stub_bfd
= stub_bfd
;
3692 htab
->add_stub_section
= add_stub_section
;
3693 htab
->layout_sections_again
= layout_sections_again
;
3694 stubs_always_after_branch
= group_size
< 0;
3696 stub_group_size
= -group_size
;
3698 stub_group_size
= group_size
;
3700 if (stub_group_size
== 1)
3702 /* Default values. */
3703 /* Thumb branch range is +-4MB has to be used as the default
3704 maximum size (a given section can contain both ARM and Thumb
3705 code, so the worst case has to be taken into account).
3707 This value is 24K less than that, which allows for 2025
3708 12-byte stubs. If we exceed that, then we will fail to link.
3709 The user will have to relink with an explicit group size
3711 stub_group_size
= 4170000;
3714 group_sections (htab
, stub_group_size
, stubs_always_after_branch
);
3719 unsigned int bfd_indx
;
3722 for (input_bfd
= info
->input_bfds
, bfd_indx
= 0;
3724 input_bfd
= input_bfd
->link_next
, bfd_indx
++)
3726 Elf_Internal_Shdr
*symtab_hdr
;
3728 Elf_Internal_Sym
*local_syms
= NULL
;
3730 /* We'll need the symbol table in a second. */
3731 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
3732 if (symtab_hdr
->sh_info
== 0)
3735 /* Walk over each section attached to the input bfd. */
3736 for (section
= input_bfd
->sections
;
3738 section
= section
->next
)
3740 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
3742 /* If there aren't any relocs, then there's nothing more
3744 if ((section
->flags
& SEC_RELOC
) == 0
3745 || section
->reloc_count
== 0
3746 || (section
->flags
& SEC_CODE
) == 0)
3749 /* If this section is a link-once section that will be
3750 discarded, then don't create any stubs. */
3751 if (section
->output_section
== NULL
3752 || section
->output_section
->owner
!= output_bfd
)
3755 /* Get the relocs. */
3757 = _bfd_elf_link_read_relocs (input_bfd
, section
, NULL
,
3758 NULL
, info
->keep_memory
);
3759 if (internal_relocs
== NULL
)
3760 goto error_ret_free_local
;
3762 /* Now examine each relocation. */
3763 irela
= internal_relocs
;
3764 irelaend
= irela
+ section
->reloc_count
;
3765 for (; irela
< irelaend
; irela
++)
3767 unsigned int r_type
, r_indx
;
3768 enum elf32_arm_stub_type stub_type
;
3769 struct elf32_arm_stub_hash_entry
*stub_entry
;
3772 bfd_vma destination
;
3773 struct elf32_arm_link_hash_entry
*hash
;
3774 const char *sym_name
;
3776 const asection
*id_sec
;
3777 unsigned char st_type
;
3779 r_type
= ELF32_R_TYPE (irela
->r_info
);
3780 r_indx
= ELF32_R_SYM (irela
->r_info
);
3782 if (r_type
>= (unsigned int) R_ARM_max
)
3784 bfd_set_error (bfd_error_bad_value
);
3785 error_ret_free_internal
:
3786 if (elf_section_data (section
)->relocs
== NULL
)
3787 free (internal_relocs
);
3788 goto error_ret_free_local
;
3791 /* Only look for stubs on branch instructions. */
3792 if ((r_type
!= (unsigned int) R_ARM_CALL
)
3793 && (r_type
!= (unsigned int) R_ARM_THM_CALL
)
3794 && (r_type
!= (unsigned int) R_ARM_JUMP24
)
3795 && (r_type
!= (unsigned int) R_ARM_THM_JUMP24
)
3796 && (r_type
!= (unsigned int) R_ARM_PLT32
))
3799 /* Now determine the call target, its name, value,
3806 if (r_indx
< symtab_hdr
->sh_info
)
3808 /* It's a local symbol. */
3809 Elf_Internal_Sym
*sym
;
3810 Elf_Internal_Shdr
*hdr
;
3812 if (local_syms
== NULL
)
3815 = (Elf_Internal_Sym
*) symtab_hdr
->contents
;
3816 if (local_syms
== NULL
)
3818 = bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
3819 symtab_hdr
->sh_info
, 0,
3821 if (local_syms
== NULL
)
3822 goto error_ret_free_internal
;
3825 sym
= local_syms
+ r_indx
;
3826 hdr
= elf_elfsections (input_bfd
)[sym
->st_shndx
];
3827 sym_sec
= hdr
->bfd_section
;
3828 if (ELF_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3829 sym_value
= sym
->st_value
;
3830 destination
= (sym_value
+ irela
->r_addend
3831 + sym_sec
->output_offset
3832 + sym_sec
->output_section
->vma
);
3833 st_type
= ELF_ST_TYPE (sym
->st_info
);
3835 = bfd_elf_string_from_elf_section (input_bfd
,
3836 symtab_hdr
->sh_link
,
3841 /* It's an external symbol. */
3844 e_indx
= r_indx
- symtab_hdr
->sh_info
;
3845 hash
= ((struct elf32_arm_link_hash_entry
*)
3846 elf_sym_hashes (input_bfd
)[e_indx
]);
3848 while (hash
->root
.root
.type
== bfd_link_hash_indirect
3849 || hash
->root
.root
.type
== bfd_link_hash_warning
)
3850 hash
= ((struct elf32_arm_link_hash_entry
*)
3851 hash
->root
.root
.u
.i
.link
);
3853 if (hash
->root
.root
.type
== bfd_link_hash_defined
3854 || hash
->root
.root
.type
== bfd_link_hash_defweak
)
3856 sym_sec
= hash
->root
.root
.u
.def
.section
;
3857 sym_value
= hash
->root
.root
.u
.def
.value
;
3858 if (sym_sec
->output_section
!= NULL
)
3859 destination
= (sym_value
+ irela
->r_addend
3860 + sym_sec
->output_offset
3861 + sym_sec
->output_section
->vma
);
3863 else if ((hash
->root
.root
.type
== bfd_link_hash_undefined
)
3864 || (hash
->root
.root
.type
== bfd_link_hash_undefweak
))
3866 /* For a shared library, use the PLT stub as
3867 target address to decide whether a long
3868 branch stub is needed.
3869 For absolute code, they cannot be handled. */
3870 struct elf32_arm_link_hash_table
*globals
=
3871 elf32_arm_hash_table (info
);
3873 if (globals
->splt
!= NULL
&& hash
!= NULL
3874 && hash
->root
.plt
.offset
!= (bfd_vma
) -1)
3876 sym_sec
= globals
->splt
;
3877 sym_value
= hash
->root
.plt
.offset
;
3878 if (sym_sec
->output_section
!= NULL
)
3879 destination
= (sym_value
3880 + sym_sec
->output_offset
3881 + sym_sec
->output_section
->vma
);
3888 bfd_set_error (bfd_error_bad_value
);
3889 goto error_ret_free_internal
;
3891 st_type
= ELF_ST_TYPE (hash
->root
.type
);
3892 sym_name
= hash
->root
.root
.root
.string
;
3895 /* Determine what (if any) linker stub is needed. */
3896 stub_type
= arm_type_of_stub (info
, section
, irela
, st_type
,
3897 hash
, destination
, sym_sec
,
3898 input_bfd
, sym_name
);
3899 if (stub_type
== arm_stub_none
)
3902 /* Support for grouping stub sections. */
3903 id_sec
= htab
->stub_group
[section
->id
].link_sec
;
3905 /* Get the name of this stub. */
3906 stub_name
= elf32_arm_stub_name (id_sec
, sym_sec
, hash
, irela
);
3908 goto error_ret_free_internal
;
3910 stub_entry
= arm_stub_hash_lookup (&htab
->stub_hash_table
,
3913 if (stub_entry
!= NULL
)
3915 /* The proper stub has already been created. */
3920 stub_entry
= elf32_arm_add_stub (stub_name
, section
, htab
);
3921 if (stub_entry
== NULL
)
3924 goto error_ret_free_internal
;
3927 stub_entry
->target_value
= sym_value
;
3928 stub_entry
->target_section
= sym_sec
;
3929 stub_entry
->stub_type
= stub_type
;
3930 stub_entry
->h
= hash
;
3931 stub_entry
->st_type
= st_type
;
3933 if (sym_name
== NULL
)
3934 sym_name
= "unnamed";
3935 stub_entry
->output_name
3936 = bfd_alloc (htab
->stub_bfd
,
3937 sizeof (THUMB2ARM_GLUE_ENTRY_NAME
)
3938 + strlen (sym_name
));
3939 if (stub_entry
->output_name
== NULL
)
3942 goto error_ret_free_internal
;
3945 /* For historical reasons, use the existing names for
3946 ARM-to-Thumb and Thumb-to-ARM stubs. */
3947 if ( ((r_type
== (unsigned int) R_ARM_THM_CALL
)
3948 || (r_type
== (unsigned int) R_ARM_THM_JUMP24
))
3949 && st_type
!= STT_ARM_TFUNC
)
3950 sprintf (stub_entry
->output_name
, THUMB2ARM_GLUE_ENTRY_NAME
,
3952 else if ( ((r_type
== (unsigned int) R_ARM_CALL
)
3953 || (r_type
== (unsigned int) R_ARM_JUMP24
))
3954 && st_type
== STT_ARM_TFUNC
)
3955 sprintf (stub_entry
->output_name
, ARM2THUMB_GLUE_ENTRY_NAME
,
3958 sprintf (stub_entry
->output_name
, STUB_ENTRY_NAME
,
3961 stub_changed
= TRUE
;
3964 /* We're done with the internal relocs, free them. */
3965 if (elf_section_data (section
)->relocs
== NULL
)
3966 free (internal_relocs
);
3973 /* OK, we've added some stubs. Find out the new size of the
3975 for (stub_sec
= htab
->stub_bfd
->sections
;
3977 stub_sec
= stub_sec
->next
)
3979 /* Ignore non-stub sections. */
3980 if (!strstr (stub_sec
->name
, STUB_SUFFIX
))
3986 bfd_hash_traverse (&htab
->stub_hash_table
, arm_size_one_stub
, htab
);
3988 /* Ask the linker to do its stuff. */
3989 (*htab
->layout_sections_again
) ();
3990 stub_changed
= FALSE
;
3995 error_ret_free_local
:
3999 /* Build all the stubs associated with the current output file. The
4000 stubs are kept in a hash table attached to the main linker hash
4001 table. We also set up the .plt entries for statically linked PIC
4002 functions here. This function is called via arm_elf_finish in the
4006 elf32_arm_build_stubs (struct bfd_link_info
*info
)
4009 struct bfd_hash_table
*table
;
4010 struct elf32_arm_link_hash_table
*htab
;
4012 htab
= elf32_arm_hash_table (info
);
4014 for (stub_sec
= htab
->stub_bfd
->sections
;
4016 stub_sec
= stub_sec
->next
)
4020 /* Ignore non-stub sections. */
4021 if (!strstr (stub_sec
->name
, STUB_SUFFIX
))
4024 /* Allocate memory to hold the linker stubs. */
4025 size
= stub_sec
->size
;
4026 stub_sec
->contents
= bfd_zalloc (htab
->stub_bfd
, size
);
4027 if (stub_sec
->contents
== NULL
&& size
!= 0)
4032 /* Build the stubs as directed by the stub hash table. */
4033 table
= &htab
->stub_hash_table
;
4034 bfd_hash_traverse (table
, arm_build_one_stub
, info
);
4039 /* Locate the Thumb encoded calling stub for NAME. */
4041 static struct elf_link_hash_entry
*
4042 find_thumb_glue (struct bfd_link_info
*link_info
,
4044 char **error_message
)
4047 struct elf_link_hash_entry
*hash
;
4048 struct elf32_arm_link_hash_table
*hash_table
;
4050 /* We need a pointer to the armelf specific hash table. */
4051 hash_table
= elf32_arm_hash_table (link_info
);
4053 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
)
4054 + strlen (THUMB2ARM_GLUE_ENTRY_NAME
) + 1);
4056 BFD_ASSERT (tmp_name
);
4058 sprintf (tmp_name
, THUMB2ARM_GLUE_ENTRY_NAME
, name
);
4060 hash
= elf_link_hash_lookup
4061 (&(hash_table
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
4064 && asprintf (error_message
, _("unable to find THUMB glue '%s' for '%s'"),
4065 tmp_name
, name
) == -1)
4066 *error_message
= (char *) bfd_errmsg (bfd_error_system_call
);
4073 /* Locate the ARM encoded calling stub for NAME. */
4075 static struct elf_link_hash_entry
*
4076 find_arm_glue (struct bfd_link_info
*link_info
,
4078 char **error_message
)
4081 struct elf_link_hash_entry
*myh
;
4082 struct elf32_arm_link_hash_table
*hash_table
;
4084 /* We need a pointer to the elfarm specific hash table. */
4085 hash_table
= elf32_arm_hash_table (link_info
);
4087 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
)
4088 + strlen (ARM2THUMB_GLUE_ENTRY_NAME
) + 1);
4090 BFD_ASSERT (tmp_name
);
4092 sprintf (tmp_name
, ARM2THUMB_GLUE_ENTRY_NAME
, name
);
4094 myh
= elf_link_hash_lookup
4095 (&(hash_table
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
4098 && asprintf (error_message
, _("unable to find ARM glue '%s' for '%s'"),
4099 tmp_name
, name
) == -1)
4100 *error_message
= (char *) bfd_errmsg (bfd_error_system_call
);
4107 /* ARM->Thumb glue (static images):
4111 ldr r12, __func_addr
4114 .word func @ behave as if you saw a ARM_32 reloc.
4121 .word func @ behave as if you saw a ARM_32 reloc.
4123 (relocatable images)
4126 ldr r12, __func_offset
4132 #define ARM2THUMB_STATIC_GLUE_SIZE 12
4133 static const insn32 a2t1_ldr_insn
= 0xe59fc000;
4134 static const insn32 a2t2_bx_r12_insn
= 0xe12fff1c;
4135 static const insn32 a2t3_func_addr_insn
= 0x00000001;
4137 #define ARM2THUMB_V5_STATIC_GLUE_SIZE 8
4138 static const insn32 a2t1v5_ldr_insn
= 0xe51ff004;
4139 static const insn32 a2t2v5_func_addr_insn
= 0x00000001;
4141 #define ARM2THUMB_PIC_GLUE_SIZE 16
4142 static const insn32 a2t1p_ldr_insn
= 0xe59fc004;
4143 static const insn32 a2t2p_add_pc_insn
= 0xe08cc00f;
4144 static const insn32 a2t3p_bx_r12_insn
= 0xe12fff1c;
4146 /* Thumb->ARM: Thumb->(non-interworking aware) ARM
4150 __func_from_thumb: __func_from_thumb:
4152 nop ldr r6, __func_addr
4162 #define THUMB2ARM_GLUE_SIZE 8
4163 static const insn16 t2a1_bx_pc_insn
= 0x4778;
4164 static const insn16 t2a2_noop_insn
= 0x46c0;
4165 static const insn32 t2a3_b_insn
= 0xea000000;
4167 #define VFP11_ERRATUM_VENEER_SIZE 8
4169 #define ARM_BX_VENEER_SIZE 12
4170 static const insn32 armbx1_tst_insn
= 0xe3100001;
4171 static const insn32 armbx2_moveq_insn
= 0x01a0f000;
4172 static const insn32 armbx3_bx_insn
= 0xe12fff10;
4174 #ifndef ELFARM_NABI_C_INCLUDED
4176 arm_allocate_glue_section_space (bfd
* abfd
, bfd_size_type size
, const char * name
)
4179 bfd_byte
* contents
;
4183 /* Do not include empty glue sections in the output. */
4186 s
= bfd_get_section_by_name (abfd
, name
);
4188 s
->flags
|= SEC_EXCLUDE
;
4193 BFD_ASSERT (abfd
!= NULL
);
4195 s
= bfd_get_section_by_name (abfd
, name
);
4196 BFD_ASSERT (s
!= NULL
);
4198 contents
= bfd_alloc (abfd
, size
);
4200 BFD_ASSERT (s
->size
== size
);
4201 s
->contents
= contents
;
4205 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info
* info
)
4207 struct elf32_arm_link_hash_table
* globals
;
4209 globals
= elf32_arm_hash_table (info
);
4210 BFD_ASSERT (globals
!= NULL
);
4212 arm_allocate_glue_section_space (globals
->bfd_of_glue_owner
,
4213 globals
->arm_glue_size
,
4214 ARM2THUMB_GLUE_SECTION_NAME
);
4216 arm_allocate_glue_section_space (globals
->bfd_of_glue_owner
,
4217 globals
->thumb_glue_size
,
4218 THUMB2ARM_GLUE_SECTION_NAME
);
4220 arm_allocate_glue_section_space (globals
->bfd_of_glue_owner
,
4221 globals
->vfp11_erratum_glue_size
,
4222 VFP11_ERRATUM_VENEER_SECTION_NAME
);
4224 arm_allocate_glue_section_space (globals
->bfd_of_glue_owner
,
4225 globals
->bx_glue_size
,
4226 ARM_BX_GLUE_SECTION_NAME
);
4231 /* Allocate space and symbols for calling a Thumb function from Arm mode.
4232 returns the symbol identifying the stub. */
4234 static struct elf_link_hash_entry
*
4235 record_arm_to_thumb_glue (struct bfd_link_info
* link_info
,
4236 struct elf_link_hash_entry
* h
)
4238 const char * name
= h
->root
.root
.string
;
4241 struct elf_link_hash_entry
* myh
;
4242 struct bfd_link_hash_entry
* bh
;
4243 struct elf32_arm_link_hash_table
* globals
;
4247 globals
= elf32_arm_hash_table (link_info
);
4249 BFD_ASSERT (globals
!= NULL
);
4250 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
4252 s
= bfd_get_section_by_name
4253 (globals
->bfd_of_glue_owner
, ARM2THUMB_GLUE_SECTION_NAME
);
4255 BFD_ASSERT (s
!= NULL
);
4257 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
) + strlen (ARM2THUMB_GLUE_ENTRY_NAME
) + 1);
4259 BFD_ASSERT (tmp_name
);
4261 sprintf (tmp_name
, ARM2THUMB_GLUE_ENTRY_NAME
, name
);
4263 myh
= elf_link_hash_lookup
4264 (&(globals
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
4268 /* We've already seen this guy. */
4273 /* The only trick here is using hash_table->arm_glue_size as the value.
4274 Even though the section isn't allocated yet, this is where we will be
4275 putting it. The +1 on the value marks that the stub has not been
4276 output yet - not that it is a Thumb function. */
4278 val
= globals
->arm_glue_size
+ 1;
4279 _bfd_generic_link_add_one_symbol (link_info
, globals
->bfd_of_glue_owner
,
4280 tmp_name
, BSF_GLOBAL
, s
, val
,
4281 NULL
, TRUE
, FALSE
, &bh
);
4283 myh
= (struct elf_link_hash_entry
*) bh
;
4284 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_FUNC
);
4285 myh
->forced_local
= 1;
4289 if (link_info
->shared
|| globals
->root
.is_relocatable_executable
4290 || globals
->pic_veneer
)
4291 size
= ARM2THUMB_PIC_GLUE_SIZE
;
4292 else if (globals
->use_blx
)
4293 size
= ARM2THUMB_V5_STATIC_GLUE_SIZE
;
4295 size
= ARM2THUMB_STATIC_GLUE_SIZE
;
4298 globals
->arm_glue_size
+= size
;
4303 /* Allocate space for ARMv4 BX veneers. */
4306 record_arm_bx_glue (struct bfd_link_info
* link_info
, int reg
)
4309 struct elf32_arm_link_hash_table
*globals
;
4311 struct elf_link_hash_entry
*myh
;
4312 struct bfd_link_hash_entry
*bh
;
4315 /* BX PC does not need a veneer. */
4319 globals
= elf32_arm_hash_table (link_info
);
4321 BFD_ASSERT (globals
!= NULL
);
4322 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
4324 /* Check if this veneer has already been allocated. */
4325 if (globals
->bx_glue_offset
[reg
])
4328 s
= bfd_get_section_by_name
4329 (globals
->bfd_of_glue_owner
, ARM_BX_GLUE_SECTION_NAME
);
4331 BFD_ASSERT (s
!= NULL
);
4333 /* Add symbol for veneer. */
4334 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (ARM_BX_GLUE_ENTRY_NAME
) + 1);
4336 BFD_ASSERT (tmp_name
);
4338 sprintf (tmp_name
, ARM_BX_GLUE_ENTRY_NAME
, reg
);
4340 myh
= elf_link_hash_lookup
4341 (&(globals
)->root
, tmp_name
, FALSE
, FALSE
, FALSE
);
4343 BFD_ASSERT (myh
== NULL
);
4346 val
= globals
->bx_glue_size
;
4347 _bfd_generic_link_add_one_symbol (link_info
, globals
->bfd_of_glue_owner
,
4348 tmp_name
, BSF_FUNCTION
| BSF_LOCAL
, s
, val
,
4349 NULL
, TRUE
, FALSE
, &bh
);
4351 myh
= (struct elf_link_hash_entry
*) bh
;
4352 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_FUNC
);
4353 myh
->forced_local
= 1;
4355 s
->size
+= ARM_BX_VENEER_SIZE
;
4356 globals
->bx_glue_offset
[reg
] = globals
->bx_glue_size
| 2;
4357 globals
->bx_glue_size
+= ARM_BX_VENEER_SIZE
;
4361 /* Add an entry to the code/data map for section SEC. */
4364 elf32_arm_section_map_add (asection
*sec
, char type
, bfd_vma vma
)
4366 struct _arm_elf_section_data
*sec_data
= elf32_arm_section_data (sec
);
4367 unsigned int newidx
;
4369 if (sec_data
->map
== NULL
)
4371 sec_data
->map
= bfd_malloc (sizeof (elf32_arm_section_map
));
4372 sec_data
->mapcount
= 0;
4373 sec_data
->mapsize
= 1;
4376 newidx
= sec_data
->mapcount
++;
4378 if (sec_data
->mapcount
> sec_data
->mapsize
)
4380 sec_data
->mapsize
*= 2;
4381 sec_data
->map
= bfd_realloc_or_free (sec_data
->map
, sec_data
->mapsize
4382 * sizeof (elf32_arm_section_map
));
4387 sec_data
->map
[newidx
].vma
= vma
;
4388 sec_data
->map
[newidx
].type
= type
;
4393 /* Record information about a VFP11 denorm-erratum veneer. Only ARM-mode
4394 veneers are handled for now. */
4397 record_vfp11_erratum_veneer (struct bfd_link_info
*link_info
,
4398 elf32_vfp11_erratum_list
*branch
,
4400 asection
*branch_sec
,
4401 unsigned int offset
)
4404 struct elf32_arm_link_hash_table
*hash_table
;
4406 struct elf_link_hash_entry
*myh
;
4407 struct bfd_link_hash_entry
*bh
;
4409 struct _arm_elf_section_data
*sec_data
;
4411 elf32_vfp11_erratum_list
*newerr
;
4413 hash_table
= elf32_arm_hash_table (link_info
);
4415 BFD_ASSERT (hash_table
!= NULL
);
4416 BFD_ASSERT (hash_table
->bfd_of_glue_owner
!= NULL
);
4418 s
= bfd_get_section_by_name
4419 (hash_table
->bfd_of_glue_owner
, VFP11_ERRATUM_VENEER_SECTION_NAME
);
4421 sec_data
= elf32_arm_section_data (s
);
4423 BFD_ASSERT (s
!= NULL
);
4425 tmp_name
= bfd_malloc ((bfd_size_type
) strlen
4426 (VFP11_ERRATUM_VENEER_ENTRY_NAME
) + 10);
4428 BFD_ASSERT (tmp_name
);
4430 sprintf (tmp_name
, VFP11_ERRATUM_VENEER_ENTRY_NAME
,
4431 hash_table
->num_vfp11_fixes
);
4433 myh
= elf_link_hash_lookup
4434 (&(hash_table
)->root
, tmp_name
, FALSE
, FALSE
, FALSE
);
4436 BFD_ASSERT (myh
== NULL
);
4439 val
= hash_table
->vfp11_erratum_glue_size
;
4440 _bfd_generic_link_add_one_symbol (link_info
, hash_table
->bfd_of_glue_owner
,
4441 tmp_name
, BSF_FUNCTION
| BSF_LOCAL
, s
, val
,
4442 NULL
, TRUE
, FALSE
, &bh
);
4444 myh
= (struct elf_link_hash_entry
*) bh
;
4445 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_FUNC
);
4446 myh
->forced_local
= 1;
4448 /* Link veneer back to calling location. */
4449 errcount
= ++(sec_data
->erratumcount
);
4450 newerr
= bfd_zmalloc (sizeof (elf32_vfp11_erratum_list
));
4452 newerr
->type
= VFP11_ERRATUM_ARM_VENEER
;
4454 newerr
->u
.v
.branch
= branch
;
4455 newerr
->u
.v
.id
= hash_table
->num_vfp11_fixes
;
4456 branch
->u
.b
.veneer
= newerr
;
4458 newerr
->next
= sec_data
->erratumlist
;
4459 sec_data
->erratumlist
= newerr
;
4461 /* A symbol for the return from the veneer. */
4462 sprintf (tmp_name
, VFP11_ERRATUM_VENEER_ENTRY_NAME
"_r",
4463 hash_table
->num_vfp11_fixes
);
4465 myh
= elf_link_hash_lookup
4466 (&(hash_table
)->root
, tmp_name
, FALSE
, FALSE
, FALSE
);
4473 _bfd_generic_link_add_one_symbol (link_info
, branch_bfd
, tmp_name
, BSF_LOCAL
,
4474 branch_sec
, val
, NULL
, TRUE
, FALSE
, &bh
);
4476 myh
= (struct elf_link_hash_entry
*) bh
;
4477 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_FUNC
);
4478 myh
->forced_local
= 1;
4482 /* Generate a mapping symbol for the veneer section, and explicitly add an
4483 entry for that symbol to the code/data map for the section. */
4484 if (hash_table
->vfp11_erratum_glue_size
== 0)
4487 /* FIXME: Creates an ARM symbol. Thumb mode will need attention if it
4488 ever requires this erratum fix. */
4489 _bfd_generic_link_add_one_symbol (link_info
,
4490 hash_table
->bfd_of_glue_owner
, "$a",
4491 BSF_LOCAL
, s
, 0, NULL
,
4494 myh
= (struct elf_link_hash_entry
*) bh
;
4495 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_NOTYPE
);
4496 myh
->forced_local
= 1;
4498 /* The elf32_arm_init_maps function only cares about symbols from input
4499 BFDs. We must make a note of this generated mapping symbol
4500 ourselves so that code byteswapping works properly in
4501 elf32_arm_write_section. */
4502 elf32_arm_section_map_add (s
, 'a', 0);
4505 s
->size
+= VFP11_ERRATUM_VENEER_SIZE
;
4506 hash_table
->vfp11_erratum_glue_size
+= VFP11_ERRATUM_VENEER_SIZE
;
4507 hash_table
->num_vfp11_fixes
++;
4509 /* The offset of the veneer. */
4513 #define ARM_GLUE_SECTION_FLAGS \
4514 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE \
4515 | SEC_READONLY | SEC_LINKER_CREATED)
4517 /* Create a fake section for use by the ARM backend of the linker. */
4520 arm_make_glue_section (bfd
* abfd
, const char * name
)
4524 sec
= bfd_get_section_by_name (abfd
, name
);
4529 sec
= bfd_make_section_with_flags (abfd
, name
, ARM_GLUE_SECTION_FLAGS
);
4532 || !bfd_set_section_alignment (abfd
, sec
, 2))
4535 /* Set the gc mark to prevent the section from being removed by garbage
4536 collection, despite the fact that no relocs refer to this section. */
4542 /* Add the glue sections to ABFD. This function is called from the
4543 linker scripts in ld/emultempl/{armelf}.em. */
4546 bfd_elf32_arm_add_glue_sections_to_bfd (bfd
*abfd
,
4547 struct bfd_link_info
*info
)
4549 /* If we are only performing a partial
4550 link do not bother adding the glue. */
4551 if (info
->relocatable
)
4554 return arm_make_glue_section (abfd
, ARM2THUMB_GLUE_SECTION_NAME
)
4555 && arm_make_glue_section (abfd
, THUMB2ARM_GLUE_SECTION_NAME
)
4556 && arm_make_glue_section (abfd
, VFP11_ERRATUM_VENEER_SECTION_NAME
)
4557 && arm_make_glue_section (abfd
, ARM_BX_GLUE_SECTION_NAME
);
4560 /* Select a BFD to be used to hold the sections used by the glue code.
4561 This function is called from the linker scripts in ld/emultempl/
4565 bfd_elf32_arm_get_bfd_for_interworking (bfd
*abfd
, struct bfd_link_info
*info
)
4567 struct elf32_arm_link_hash_table
*globals
;
4569 /* If we are only performing a partial link
4570 do not bother getting a bfd to hold the glue. */
4571 if (info
->relocatable
)
4574 /* Make sure we don't attach the glue sections to a dynamic object. */
4575 BFD_ASSERT (!(abfd
->flags
& DYNAMIC
));
4577 globals
= elf32_arm_hash_table (info
);
4579 BFD_ASSERT (globals
!= NULL
);
4581 if (globals
->bfd_of_glue_owner
!= NULL
)
4584 /* Save the bfd for later use. */
4585 globals
->bfd_of_glue_owner
= abfd
;
4591 check_use_blx (struct elf32_arm_link_hash_table
*globals
)
4593 if (bfd_elf_get_obj_attr_int (globals
->obfd
, OBJ_ATTR_PROC
,
4595 globals
->use_blx
= 1;
4599 bfd_elf32_arm_process_before_allocation (bfd
*abfd
,
4600 struct bfd_link_info
*link_info
)
4602 Elf_Internal_Shdr
*symtab_hdr
;
4603 Elf_Internal_Rela
*internal_relocs
= NULL
;
4604 Elf_Internal_Rela
*irel
, *irelend
;
4605 bfd_byte
*contents
= NULL
;
4608 struct elf32_arm_link_hash_table
*globals
;
4610 /* If we are only performing a partial link do not bother
4611 to construct any glue. */
4612 if (link_info
->relocatable
)
4615 /* Here we have a bfd that is to be included on the link. We have a
4616 hook to do reloc rummaging, before section sizes are nailed down. */
4617 globals
= elf32_arm_hash_table (link_info
);
4619 BFD_ASSERT (globals
!= NULL
);
4621 check_use_blx (globals
);
4623 if (globals
->byteswap_code
&& !bfd_big_endian (abfd
))
4625 _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
4630 /* PR 5398: If we have not decided to include any loadable sections in
4631 the output then we will not have a glue owner bfd. This is OK, it
4632 just means that there is nothing else for us to do here. */
4633 if (globals
->bfd_of_glue_owner
== NULL
)
4636 /* Rummage around all the relocs and map the glue vectors. */
4637 sec
= abfd
->sections
;
4642 for (; sec
!= NULL
; sec
= sec
->next
)
4644 if (sec
->reloc_count
== 0)
4647 if ((sec
->flags
& SEC_EXCLUDE
) != 0)
4650 symtab_hdr
= & elf_symtab_hdr (abfd
);
4652 /* Load the relocs. */
4654 = _bfd_elf_link_read_relocs (abfd
, sec
, NULL
, NULL
, FALSE
);
4656 if (internal_relocs
== NULL
)
4659 irelend
= internal_relocs
+ sec
->reloc_count
;
4660 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
4663 unsigned long r_index
;
4665 struct elf_link_hash_entry
*h
;
4667 r_type
= ELF32_R_TYPE (irel
->r_info
);
4668 r_index
= ELF32_R_SYM (irel
->r_info
);
4670 /* These are the only relocation types we care about. */
4671 if ( r_type
!= R_ARM_PC24
4672 && (r_type
!= R_ARM_V4BX
|| globals
->fix_v4bx
< 2))
4675 /* Get the section contents if we haven't done so already. */
4676 if (contents
== NULL
)
4678 /* Get cached copy if it exists. */
4679 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
4680 contents
= elf_section_data (sec
)->this_hdr
.contents
;
4683 /* Go get them off disk. */
4684 if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
4689 if (r_type
== R_ARM_V4BX
)
4693 reg
= bfd_get_32 (abfd
, contents
+ irel
->r_offset
) & 0xf;
4694 record_arm_bx_glue (link_info
, reg
);
4698 /* If the relocation is not against a symbol it cannot concern us. */
4701 /* We don't care about local symbols. */
4702 if (r_index
< symtab_hdr
->sh_info
)
4705 /* This is an external symbol. */
4706 r_index
-= symtab_hdr
->sh_info
;
4707 h
= (struct elf_link_hash_entry
*)
4708 elf_sym_hashes (abfd
)[r_index
];
4710 /* If the relocation is against a static symbol it must be within
4711 the current section and so cannot be a cross ARM/Thumb relocation. */
4715 /* If the call will go through a PLT entry then we do not need
4717 if (globals
->splt
!= NULL
&& h
->plt
.offset
!= (bfd_vma
) -1)
4723 /* This one is a call from arm code. We need to look up
4724 the target of the call. If it is a thumb target, we
4726 if (ELF_ST_TYPE (h
->type
) == STT_ARM_TFUNC
)
4727 record_arm_to_thumb_glue (link_info
, h
);
4735 if (contents
!= NULL
4736 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
4740 if (internal_relocs
!= NULL
4741 && elf_section_data (sec
)->relocs
!= internal_relocs
)
4742 free (internal_relocs
);
4743 internal_relocs
= NULL
;
4749 if (contents
!= NULL
4750 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
4752 if (internal_relocs
!= NULL
4753 && elf_section_data (sec
)->relocs
!= internal_relocs
)
4754 free (internal_relocs
);
4761 /* Initialise maps of ARM/Thumb/data for input BFDs. */
4764 bfd_elf32_arm_init_maps (bfd
*abfd
)
4766 Elf_Internal_Sym
*isymbuf
;
4767 Elf_Internal_Shdr
*hdr
;
4768 unsigned int i
, localsyms
;
4770 /* PR 7093: Make sure that we are dealing with an arm elf binary. */
4771 if (! is_arm_elf (abfd
))
4774 if ((abfd
->flags
& DYNAMIC
) != 0)
4777 hdr
= & elf_symtab_hdr (abfd
);
4778 localsyms
= hdr
->sh_info
;
4780 /* Obtain a buffer full of symbols for this BFD. The hdr->sh_info field
4781 should contain the number of local symbols, which should come before any
4782 global symbols. Mapping symbols are always local. */
4783 isymbuf
= bfd_elf_get_elf_syms (abfd
, hdr
, localsyms
, 0, NULL
, NULL
,
4786 /* No internal symbols read? Skip this BFD. */
4787 if (isymbuf
== NULL
)
4790 for (i
= 0; i
< localsyms
; i
++)
4792 Elf_Internal_Sym
*isym
= &isymbuf
[i
];
4793 asection
*sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
4797 && ELF_ST_BIND (isym
->st_info
) == STB_LOCAL
)
4799 name
= bfd_elf_string_from_elf_section (abfd
,
4800 hdr
->sh_link
, isym
->st_name
);
4802 if (bfd_is_arm_special_symbol_name (name
,
4803 BFD_ARM_SPECIAL_SYM_TYPE_MAP
))
4804 elf32_arm_section_map_add (sec
, name
[1], isym
->st_value
);
4811 bfd_elf32_arm_set_vfp11_fix (bfd
*obfd
, struct bfd_link_info
*link_info
)
4813 struct elf32_arm_link_hash_table
*globals
= elf32_arm_hash_table (link_info
);
4814 obj_attribute
*out_attr
= elf_known_obj_attributes_proc (obfd
);
4816 /* We assume that ARMv7+ does not need the VFP11 denorm erratum fix. */
4817 if (out_attr
[Tag_CPU_arch
].i
>= TAG_CPU_ARCH_V7
)
4819 switch (globals
->vfp11_fix
)
4821 case BFD_ARM_VFP11_FIX_DEFAULT
:
4822 case BFD_ARM_VFP11_FIX_NONE
:
4823 globals
->vfp11_fix
= BFD_ARM_VFP11_FIX_NONE
;
4827 /* Give a warning, but do as the user requests anyway. */
4828 (*_bfd_error_handler
) (_("%B: warning: selected VFP11 erratum "
4829 "workaround is not necessary for target architecture"), obfd
);
4832 else if (globals
->vfp11_fix
== BFD_ARM_VFP11_FIX_DEFAULT
)
4833 /* For earlier architectures, we might need the workaround, but do not
4834 enable it by default. If users is running with broken hardware, they
4835 must enable the erratum fix explicitly. */
4836 globals
->vfp11_fix
= BFD_ARM_VFP11_FIX_NONE
;
4840 enum bfd_arm_vfp11_pipe
4848 /* Return a VFP register number. This is encoded as RX:X for single-precision
4849 registers, or X:RX for double-precision registers, where RX is the group of
4850 four bits in the instruction encoding and X is the single extension bit.
4851 RX and X fields are specified using their lowest (starting) bit. The return
4854 0...31: single-precision registers s0...s31
4855 32...63: double-precision registers d0...d31.
4857 Although X should be zero for VFP11 (encoding d0...d15 only), we might
4858 encounter VFP3 instructions, so we allow the full range for DP registers. */
4861 bfd_arm_vfp11_regno (unsigned int insn
, bfd_boolean is_double
, unsigned int rx
,
4865 return (((insn
>> rx
) & 0xf) | (((insn
>> x
) & 1) << 4)) + 32;
4867 return (((insn
>> rx
) & 0xf) << 1) | ((insn
>> x
) & 1);
4870 /* Set bits in *WMASK according to a register number REG as encoded by
4871 bfd_arm_vfp11_regno(). Ignore d16-d31. */
4874 bfd_arm_vfp11_write_mask (unsigned int *wmask
, unsigned int reg
)
4879 *wmask
|= 3 << ((reg
- 32) * 2);
4882 /* Return TRUE if WMASK overwrites anything in REGS. */
4885 bfd_arm_vfp11_antidependency (unsigned int wmask
, int *regs
, int numregs
)
4889 for (i
= 0; i
< numregs
; i
++)
4891 unsigned int reg
= regs
[i
];
4893 if (reg
< 32 && (wmask
& (1 << reg
)) != 0)
4901 if ((wmask
& (3 << (reg
* 2))) != 0)
4908 /* In this function, we're interested in two things: finding input registers
4909 for VFP data-processing instructions, and finding the set of registers which
4910 arbitrary VFP instructions may write to. We use a 32-bit unsigned int to
4911 hold the written set, so FLDM etc. are easy to deal with (we're only
4912 interested in 32 SP registers or 16 dp registers, due to the VFP version
4913 implemented by the chip in question). DP registers are marked by setting
4914 both SP registers in the write mask). */
4916 static enum bfd_arm_vfp11_pipe
4917 bfd_arm_vfp11_insn_decode (unsigned int insn
, unsigned int *destmask
, int *regs
,
4920 enum bfd_arm_vfp11_pipe pipe
= VFP11_BAD
;
4921 bfd_boolean is_double
= ((insn
& 0xf00) == 0xb00) ? 1 : 0;
4923 if ((insn
& 0x0f000e10) == 0x0e000a00) /* A data-processing insn. */
4926 unsigned int fd
= bfd_arm_vfp11_regno (insn
, is_double
, 12, 22);
4927 unsigned int fm
= bfd_arm_vfp11_regno (insn
, is_double
, 0, 5);
4929 pqrs
= ((insn
& 0x00800000) >> 20)
4930 | ((insn
& 0x00300000) >> 19)
4931 | ((insn
& 0x00000040) >> 6);
4935 case 0: /* fmac[sd]. */
4936 case 1: /* fnmac[sd]. */
4937 case 2: /* fmsc[sd]. */
4938 case 3: /* fnmsc[sd]. */
4940 bfd_arm_vfp11_write_mask (destmask
, fd
);
4942 regs
[1] = bfd_arm_vfp11_regno (insn
, is_double
, 16, 7); /* Fn. */
4947 case 4: /* fmul[sd]. */
4948 case 5: /* fnmul[sd]. */
4949 case 6: /* fadd[sd]. */
4950 case 7: /* fsub[sd]. */
4954 case 8: /* fdiv[sd]. */
4957 bfd_arm_vfp11_write_mask (destmask
, fd
);
4958 regs
[0] = bfd_arm_vfp11_regno (insn
, is_double
, 16, 7); /* Fn. */
4963 case 15: /* extended opcode. */
4965 unsigned int extn
= ((insn
>> 15) & 0x1e)
4966 | ((insn
>> 7) & 1);
4970 case 0: /* fcpy[sd]. */
4971 case 1: /* fabs[sd]. */
4972 case 2: /* fneg[sd]. */
4973 case 8: /* fcmp[sd]. */
4974 case 9: /* fcmpe[sd]. */
4975 case 10: /* fcmpz[sd]. */
4976 case 11: /* fcmpez[sd]. */
4977 case 16: /* fuito[sd]. */
4978 case 17: /* fsito[sd]. */
4979 case 24: /* ftoui[sd]. */
4980 case 25: /* ftouiz[sd]. */
4981 case 26: /* ftosi[sd]. */
4982 case 27: /* ftosiz[sd]. */
4983 /* These instructions will not bounce due to underflow. */
4988 case 3: /* fsqrt[sd]. */
4989 /* fsqrt cannot underflow, but it can (perhaps) overwrite
4990 registers to cause the erratum in previous instructions. */
4991 bfd_arm_vfp11_write_mask (destmask
, fd
);
4995 case 15: /* fcvt{ds,sd}. */
4999 bfd_arm_vfp11_write_mask (destmask
, fd
);
5001 /* Only FCVTSD can underflow. */
5002 if ((insn
& 0x100) != 0)
5021 /* Two-register transfer. */
5022 else if ((insn
& 0x0fe00ed0) == 0x0c400a10)
5024 unsigned int fm
= bfd_arm_vfp11_regno (insn
, is_double
, 0, 5);
5026 if ((insn
& 0x100000) == 0)
5029 bfd_arm_vfp11_write_mask (destmask
, fm
);
5032 bfd_arm_vfp11_write_mask (destmask
, fm
);
5033 bfd_arm_vfp11_write_mask (destmask
, fm
+ 1);
5039 else if ((insn
& 0x0e100e00) == 0x0c100a00) /* A load insn. */
5041 int fd
= bfd_arm_vfp11_regno (insn
, is_double
, 12, 22);
5042 unsigned int puw
= ((insn
>> 21) & 0x1) | (((insn
>> 23) & 3) << 1);
5046 case 0: /* Two-reg transfer. We should catch these above. */
5049 case 2: /* fldm[sdx]. */
5053 unsigned int i
, offset
= insn
& 0xff;
5058 for (i
= fd
; i
< fd
+ offset
; i
++)
5059 bfd_arm_vfp11_write_mask (destmask
, i
);
5063 case 4: /* fld[sd]. */
5065 bfd_arm_vfp11_write_mask (destmask
, fd
);
5074 /* Single-register transfer. Note L==0. */
5075 else if ((insn
& 0x0f100e10) == 0x0e000a10)
5077 unsigned int opcode
= (insn
>> 21) & 7;
5078 unsigned int fn
= bfd_arm_vfp11_regno (insn
, is_double
, 16, 7);
5082 case 0: /* fmsr/fmdlr. */
5083 case 1: /* fmdhr. */
5084 /* Mark fmdhr and fmdlr as writing to the whole of the DP
5085 destination register. I don't know if this is exactly right,
5086 but it is the conservative choice. */
5087 bfd_arm_vfp11_write_mask (destmask
, fn
);
5101 static int elf32_arm_compare_mapping (const void * a
, const void * b
);
5104 /* Look for potentially-troublesome code sequences which might trigger the
5105 VFP11 denormal/antidependency erratum. See, e.g., the ARM1136 errata sheet
5106 (available from ARM) for details of the erratum. A short version is
5107 described in ld.texinfo. */
5110 bfd_elf32_arm_vfp11_erratum_scan (bfd
*abfd
, struct bfd_link_info
*link_info
)
5113 bfd_byte
*contents
= NULL
;
5115 int regs
[3], numregs
= 0;
5116 struct elf32_arm_link_hash_table
*globals
= elf32_arm_hash_table (link_info
);
5117 int use_vector
= (globals
->vfp11_fix
== BFD_ARM_VFP11_FIX_VECTOR
);
5119 /* We use a simple FSM to match troublesome VFP11 instruction sequences.
5120 The states transition as follows:
5122 0 -> 1 (vector) or 0 -> 2 (scalar)
5123 A VFP FMAC-pipeline instruction has been seen. Fill
5124 regs[0]..regs[numregs-1] with its input operands. Remember this
5125 instruction in 'first_fmac'.
5128 Any instruction, except for a VFP instruction which overwrites
5133 A VFP instruction has been seen which overwrites any of regs[*].
5134 We must make a veneer! Reset state to 0 before examining next
5138 If we fail to match anything in state 2, reset to state 0 and reset
5139 the instruction pointer to the instruction after 'first_fmac'.
5141 If the VFP11 vector mode is in use, there must be at least two unrelated
5142 instructions between anti-dependent VFP11 instructions to properly avoid
5143 triggering the erratum, hence the use of the extra state 1. */
5145 /* If we are only performing a partial link do not bother
5146 to construct any glue. */
5147 if (link_info
->relocatable
)
5150 /* Skip if this bfd does not correspond to an ELF image. */
5151 if (! is_arm_elf (abfd
))
5154 /* We should have chosen a fix type by the time we get here. */
5155 BFD_ASSERT (globals
->vfp11_fix
!= BFD_ARM_VFP11_FIX_DEFAULT
);
5157 if (globals
->vfp11_fix
== BFD_ARM_VFP11_FIX_NONE
)
5160 /* Skip this BFD if it corresponds to an executable or dynamic object. */
5161 if ((abfd
->flags
& (EXEC_P
| DYNAMIC
)) != 0)
5164 for (sec
= abfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
5166 unsigned int i
, span
, first_fmac
= 0, veneer_of_insn
= 0;
5167 struct _arm_elf_section_data
*sec_data
;
5169 /* If we don't have executable progbits, we're not interested in this
5170 section. Also skip if section is to be excluded. */
5171 if (elf_section_type (sec
) != SHT_PROGBITS
5172 || (elf_section_flags (sec
) & SHF_EXECINSTR
) == 0
5173 || (sec
->flags
& SEC_EXCLUDE
) != 0
5174 || sec
->sec_info_type
== ELF_INFO_TYPE_JUST_SYMS
5175 || sec
->output_section
== bfd_abs_section_ptr
5176 || strcmp (sec
->name
, VFP11_ERRATUM_VENEER_SECTION_NAME
) == 0)
5179 sec_data
= elf32_arm_section_data (sec
);
5181 if (sec_data
->mapcount
== 0)
5184 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
5185 contents
= elf_section_data (sec
)->this_hdr
.contents
;
5186 else if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
5189 qsort (sec_data
->map
, sec_data
->mapcount
, sizeof (elf32_arm_section_map
),
5190 elf32_arm_compare_mapping
);
5192 for (span
= 0; span
< sec_data
->mapcount
; span
++)
5194 unsigned int span_start
= sec_data
->map
[span
].vma
;
5195 unsigned int span_end
= (span
== sec_data
->mapcount
- 1)
5196 ? sec
->size
: sec_data
->map
[span
+ 1].vma
;
5197 char span_type
= sec_data
->map
[span
].type
;
5199 /* FIXME: Only ARM mode is supported at present. We may need to
5200 support Thumb-2 mode also at some point. */
5201 if (span_type
!= 'a')
5204 for (i
= span_start
; i
< span_end
;)
5206 unsigned int next_i
= i
+ 4;
5207 unsigned int insn
= bfd_big_endian (abfd
)
5208 ? (contents
[i
] << 24)
5209 | (contents
[i
+ 1] << 16)
5210 | (contents
[i
+ 2] << 8)
5212 : (contents
[i
+ 3] << 24)
5213 | (contents
[i
+ 2] << 16)
5214 | (contents
[i
+ 1] << 8)
5216 unsigned int writemask
= 0;
5217 enum bfd_arm_vfp11_pipe pipe
;
5222 pipe
= bfd_arm_vfp11_insn_decode (insn
, &writemask
, regs
,
5224 /* I'm assuming the VFP11 erratum can trigger with denorm
5225 operands on either the FMAC or the DS pipeline. This might
5226 lead to slightly overenthusiastic veneer insertion. */
5227 if (pipe
== VFP11_FMAC
|| pipe
== VFP11_DS
)
5229 state
= use_vector
? 1 : 2;
5231 veneer_of_insn
= insn
;
5237 int other_regs
[3], other_numregs
;
5238 pipe
= bfd_arm_vfp11_insn_decode (insn
, &writemask
,
5241 if (pipe
!= VFP11_BAD
5242 && bfd_arm_vfp11_antidependency (writemask
, regs
,
5252 int other_regs
[3], other_numregs
;
5253 pipe
= bfd_arm_vfp11_insn_decode (insn
, &writemask
,
5256 if (pipe
!= VFP11_BAD
5257 && bfd_arm_vfp11_antidependency (writemask
, regs
,
5263 next_i
= first_fmac
+ 4;
5269 abort (); /* Should be unreachable. */
5274 elf32_vfp11_erratum_list
*newerr
5275 = bfd_zmalloc (sizeof (elf32_vfp11_erratum_list
));
5278 errcount
= ++(elf32_arm_section_data (sec
)->erratumcount
);
5280 newerr
->u
.b
.vfp_insn
= veneer_of_insn
;
5285 newerr
->type
= VFP11_ERRATUM_BRANCH_TO_ARM_VENEER
;
5292 record_vfp11_erratum_veneer (link_info
, newerr
, abfd
, sec
,
5297 newerr
->next
= sec_data
->erratumlist
;
5298 sec_data
->erratumlist
= newerr
;
5307 if (contents
!= NULL
5308 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
5316 if (contents
!= NULL
5317 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
5323 /* Find virtual-memory addresses for VFP11 erratum veneers and return locations
5324 after sections have been laid out, using specially-named symbols. */
5327 bfd_elf32_arm_vfp11_fix_veneer_locations (bfd
*abfd
,
5328 struct bfd_link_info
*link_info
)
5331 struct elf32_arm_link_hash_table
*globals
;
5334 if (link_info
->relocatable
)
5337 /* Skip if this bfd does not correspond to an ELF image. */
5338 if (! is_arm_elf (abfd
))
5341 globals
= elf32_arm_hash_table (link_info
);
5343 tmp_name
= bfd_malloc ((bfd_size_type
) strlen
5344 (VFP11_ERRATUM_VENEER_ENTRY_NAME
) + 10);
5346 for (sec
= abfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
5348 struct _arm_elf_section_data
*sec_data
= elf32_arm_section_data (sec
);
5349 elf32_vfp11_erratum_list
*errnode
= sec_data
->erratumlist
;
5351 for (; errnode
!= NULL
; errnode
= errnode
->next
)
5353 struct elf_link_hash_entry
*myh
;
5356 switch (errnode
->type
)
5358 case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER
:
5359 case VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER
:
5360 /* Find veneer symbol. */
5361 sprintf (tmp_name
, VFP11_ERRATUM_VENEER_ENTRY_NAME
,
5362 errnode
->u
.b
.veneer
->u
.v
.id
);
5364 myh
= elf_link_hash_lookup
5365 (&(globals
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
5368 (*_bfd_error_handler
) (_("%B: unable to find VFP11 veneer "
5369 "`%s'"), abfd
, tmp_name
);
5371 vma
= myh
->root
.u
.def
.section
->output_section
->vma
5372 + myh
->root
.u
.def
.section
->output_offset
5373 + myh
->root
.u
.def
.value
;
5375 errnode
->u
.b
.veneer
->vma
= vma
;
5378 case VFP11_ERRATUM_ARM_VENEER
:
5379 case VFP11_ERRATUM_THUMB_VENEER
:
5380 /* Find return location. */
5381 sprintf (tmp_name
, VFP11_ERRATUM_VENEER_ENTRY_NAME
"_r",
5384 myh
= elf_link_hash_lookup
5385 (&(globals
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
5388 (*_bfd_error_handler
) (_("%B: unable to find VFP11 veneer "
5389 "`%s'"), abfd
, tmp_name
);
5391 vma
= myh
->root
.u
.def
.section
->output_section
->vma
5392 + myh
->root
.u
.def
.section
->output_offset
5393 + myh
->root
.u
.def
.value
;
5395 errnode
->u
.v
.branch
->vma
= vma
;
5408 /* Set target relocation values needed during linking. */
5411 bfd_elf32_arm_set_target_relocs (struct bfd
*output_bfd
,
5412 struct bfd_link_info
*link_info
,
5414 char * target2_type
,
5417 bfd_arm_vfp11_fix vfp11_fix
,
5418 int no_enum_warn
, int no_wchar_warn
,
5421 struct elf32_arm_link_hash_table
*globals
;
5423 globals
= elf32_arm_hash_table (link_info
);
5425 globals
->target1_is_rel
= target1_is_rel
;
5426 if (strcmp (target2_type
, "rel") == 0)
5427 globals
->target2_reloc
= R_ARM_REL32
;
5428 else if (strcmp (target2_type
, "abs") == 0)
5429 globals
->target2_reloc
= R_ARM_ABS32
;
5430 else if (strcmp (target2_type
, "got-rel") == 0)
5431 globals
->target2_reloc
= R_ARM_GOT_PREL
;
5434 _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
5437 globals
->fix_v4bx
= fix_v4bx
;
5438 globals
->use_blx
|= use_blx
;
5439 globals
->vfp11_fix
= vfp11_fix
;
5440 globals
->pic_veneer
= pic_veneer
;
5442 BFD_ASSERT (is_arm_elf (output_bfd
));
5443 elf_arm_tdata (output_bfd
)->no_enum_size_warning
= no_enum_warn
;
5444 elf_arm_tdata (output_bfd
)->no_wchar_size_warning
= no_wchar_warn
;
5447 /* Replace the target offset of a Thumb bl or b.w instruction. */
5450 insert_thumb_branch (bfd
*abfd
, long int offset
, bfd_byte
*insn
)
5456 BFD_ASSERT ((offset
& 1) == 0);
5458 upper
= bfd_get_16 (abfd
, insn
);
5459 lower
= bfd_get_16 (abfd
, insn
+ 2);
5460 reloc_sign
= (offset
< 0) ? 1 : 0;
5461 upper
= (upper
& ~(bfd_vma
) 0x7ff)
5462 | ((offset
>> 12) & 0x3ff)
5463 | (reloc_sign
<< 10);
5464 lower
= (lower
& ~(bfd_vma
) 0x2fff)
5465 | (((!((offset
>> 23) & 1)) ^ reloc_sign
) << 13)
5466 | (((!((offset
>> 22) & 1)) ^ reloc_sign
) << 11)
5467 | ((offset
>> 1) & 0x7ff);
5468 bfd_put_16 (abfd
, upper
, insn
);
5469 bfd_put_16 (abfd
, lower
, insn
+ 2);
5472 /* Thumb code calling an ARM function. */
5475 elf32_thumb_to_arm_stub (struct bfd_link_info
* info
,
5479 asection
* input_section
,
5480 bfd_byte
* hit_data
,
5483 bfd_signed_vma addend
,
5485 char **error_message
)
5489 long int ret_offset
;
5490 struct elf_link_hash_entry
* myh
;
5491 struct elf32_arm_link_hash_table
* globals
;
5493 myh
= find_thumb_glue (info
, name
, error_message
);
5497 globals
= elf32_arm_hash_table (info
);
5499 BFD_ASSERT (globals
!= NULL
);
5500 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
5502 my_offset
= myh
->root
.u
.def
.value
;
5504 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
5505 THUMB2ARM_GLUE_SECTION_NAME
);
5507 BFD_ASSERT (s
!= NULL
);
5508 BFD_ASSERT (s
->contents
!= NULL
);
5509 BFD_ASSERT (s
->output_section
!= NULL
);
5511 if ((my_offset
& 0x01) == 0x01)
5514 && sym_sec
->owner
!= NULL
5515 && !INTERWORK_FLAG (sym_sec
->owner
))
5517 (*_bfd_error_handler
)
5518 (_("%B(%s): warning: interworking not enabled.\n"
5519 " first occurrence: %B: thumb call to arm"),
5520 sym_sec
->owner
, input_bfd
, name
);
5526 myh
->root
.u
.def
.value
= my_offset
;
5528 put_thumb_insn (globals
, output_bfd
, (bfd_vma
) t2a1_bx_pc_insn
,
5529 s
->contents
+ my_offset
);
5531 put_thumb_insn (globals
, output_bfd
, (bfd_vma
) t2a2_noop_insn
,
5532 s
->contents
+ my_offset
+ 2);
5535 /* Address of destination of the stub. */
5536 ((bfd_signed_vma
) val
)
5538 /* Offset from the start of the current section
5539 to the start of the stubs. */
5541 /* Offset of the start of this stub from the start of the stubs. */
5543 /* Address of the start of the current section. */
5544 + s
->output_section
->vma
)
5545 /* The branch instruction is 4 bytes into the stub. */
5547 /* ARM branches work from the pc of the instruction + 8. */
5550 put_arm_insn (globals
, output_bfd
,
5551 (bfd_vma
) t2a3_b_insn
| ((ret_offset
>> 2) & 0x00FFFFFF),
5552 s
->contents
+ my_offset
+ 4);
5555 BFD_ASSERT (my_offset
<= globals
->thumb_glue_size
);
5557 /* Now go back and fix up the original BL insn to point to here. */
5559 /* Address of where the stub is located. */
5560 (s
->output_section
->vma
+ s
->output_offset
+ my_offset
)
5561 /* Address of where the BL is located. */
5562 - (input_section
->output_section
->vma
+ input_section
->output_offset
5564 /* Addend in the relocation. */
5566 /* Biassing for PC-relative addressing. */
5569 insert_thumb_branch (input_bfd
, ret_offset
, hit_data
- input_section
->vma
);
5574 /* Populate an Arm to Thumb stub. Returns the stub symbol. */
5576 static struct elf_link_hash_entry
*
5577 elf32_arm_create_thumb_stub (struct bfd_link_info
* info
,
5584 char ** error_message
)
5587 long int ret_offset
;
5588 struct elf_link_hash_entry
* myh
;
5589 struct elf32_arm_link_hash_table
* globals
;
5591 myh
= find_arm_glue (info
, name
, error_message
);
5595 globals
= elf32_arm_hash_table (info
);
5597 BFD_ASSERT (globals
!= NULL
);
5598 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
5600 my_offset
= myh
->root
.u
.def
.value
;
5602 if ((my_offset
& 0x01) == 0x01)
5605 && sym_sec
->owner
!= NULL
5606 && !INTERWORK_FLAG (sym_sec
->owner
))
5608 (*_bfd_error_handler
)
5609 (_("%B(%s): warning: interworking not enabled.\n"
5610 " first occurrence: %B: arm call to thumb"),
5611 sym_sec
->owner
, input_bfd
, name
);
5615 myh
->root
.u
.def
.value
= my_offset
;
5617 if (info
->shared
|| globals
->root
.is_relocatable_executable
5618 || globals
->pic_veneer
)
5620 /* For relocatable objects we can't use absolute addresses,
5621 so construct the address from a relative offset. */
5622 /* TODO: If the offset is small it's probably worth
5623 constructing the address with adds. */
5624 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t1p_ldr_insn
,
5625 s
->contents
+ my_offset
);
5626 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t2p_add_pc_insn
,
5627 s
->contents
+ my_offset
+ 4);
5628 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t3p_bx_r12_insn
,
5629 s
->contents
+ my_offset
+ 8);
5630 /* Adjust the offset by 4 for the position of the add,
5631 and 8 for the pipeline offset. */
5632 ret_offset
= (val
- (s
->output_offset
5633 + s
->output_section
->vma
5636 bfd_put_32 (output_bfd
, ret_offset
,
5637 s
->contents
+ my_offset
+ 12);
5639 else if (globals
->use_blx
)
5641 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t1v5_ldr_insn
,
5642 s
->contents
+ my_offset
);
5644 /* It's a thumb address. Add the low order bit. */
5645 bfd_put_32 (output_bfd
, val
| a2t2v5_func_addr_insn
,
5646 s
->contents
+ my_offset
+ 4);
5650 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t1_ldr_insn
,
5651 s
->contents
+ my_offset
);
5653 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t2_bx_r12_insn
,
5654 s
->contents
+ my_offset
+ 4);
5656 /* It's a thumb address. Add the low order bit. */
5657 bfd_put_32 (output_bfd
, val
| a2t3_func_addr_insn
,
5658 s
->contents
+ my_offset
+ 8);
5664 BFD_ASSERT (my_offset
<= globals
->arm_glue_size
);
5669 /* Arm code calling a Thumb function. */
5672 elf32_arm_to_thumb_stub (struct bfd_link_info
* info
,
5676 asection
* input_section
,
5677 bfd_byte
* hit_data
,
5680 bfd_signed_vma addend
,
5682 char **error_message
)
5684 unsigned long int tmp
;
5687 long int ret_offset
;
5688 struct elf_link_hash_entry
* myh
;
5689 struct elf32_arm_link_hash_table
* globals
;
5691 globals
= elf32_arm_hash_table (info
);
5693 BFD_ASSERT (globals
!= NULL
);
5694 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
5696 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
5697 ARM2THUMB_GLUE_SECTION_NAME
);
5698 BFD_ASSERT (s
!= NULL
);
5699 BFD_ASSERT (s
->contents
!= NULL
);
5700 BFD_ASSERT (s
->output_section
!= NULL
);
5702 myh
= elf32_arm_create_thumb_stub (info
, name
, input_bfd
, output_bfd
,
5703 sym_sec
, val
, s
, error_message
);
5707 my_offset
= myh
->root
.u
.def
.value
;
5708 tmp
= bfd_get_32 (input_bfd
, hit_data
);
5709 tmp
= tmp
& 0xFF000000;
5711 /* Somehow these are both 4 too far, so subtract 8. */
5712 ret_offset
= (s
->output_offset
5714 + s
->output_section
->vma
5715 - (input_section
->output_offset
5716 + input_section
->output_section
->vma
5720 tmp
= tmp
| ((ret_offset
>> 2) & 0x00FFFFFF);
5722 bfd_put_32 (output_bfd
, (bfd_vma
) tmp
, hit_data
- input_section
->vma
);
5727 /* Populate Arm stub for an exported Thumb function. */
5730 elf32_arm_to_thumb_export_stub (struct elf_link_hash_entry
*h
, void * inf
)
5732 struct bfd_link_info
* info
= (struct bfd_link_info
*) inf
;
5734 struct elf_link_hash_entry
* myh
;
5735 struct elf32_arm_link_hash_entry
*eh
;
5736 struct elf32_arm_link_hash_table
* globals
;
5739 char *error_message
;
5741 eh
= elf32_arm_hash_entry (h
);
5742 /* Allocate stubs for exported Thumb functions on v4t. */
5743 if (eh
->export_glue
== NULL
)
5746 globals
= elf32_arm_hash_table (info
);
5748 BFD_ASSERT (globals
!= NULL
);
5749 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
5751 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
5752 ARM2THUMB_GLUE_SECTION_NAME
);
5753 BFD_ASSERT (s
!= NULL
);
5754 BFD_ASSERT (s
->contents
!= NULL
);
5755 BFD_ASSERT (s
->output_section
!= NULL
);
5757 sec
= eh
->export_glue
->root
.u
.def
.section
;
5759 BFD_ASSERT (sec
->output_section
!= NULL
);
5761 val
= eh
->export_glue
->root
.u
.def
.value
+ sec
->output_offset
5762 + sec
->output_section
->vma
;
5764 myh
= elf32_arm_create_thumb_stub (info
, h
->root
.root
.string
,
5765 h
->root
.u
.def
.section
->owner
,
5766 globals
->obfd
, sec
, val
, s
,
5772 /* Populate ARMv4 BX veneers. Returns the absolute adress of the veneer. */
5775 elf32_arm_bx_glue (struct bfd_link_info
* info
, int reg
)
5780 struct elf32_arm_link_hash_table
*globals
;
5782 globals
= elf32_arm_hash_table (info
);
5784 BFD_ASSERT (globals
!= NULL
);
5785 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
5787 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
5788 ARM_BX_GLUE_SECTION_NAME
);
5789 BFD_ASSERT (s
!= NULL
);
5790 BFD_ASSERT (s
->contents
!= NULL
);
5791 BFD_ASSERT (s
->output_section
!= NULL
);
5793 BFD_ASSERT (globals
->bx_glue_offset
[reg
] & 2);
5795 glue_addr
= globals
->bx_glue_offset
[reg
] & ~(bfd_vma
)3;
5797 if ((globals
->bx_glue_offset
[reg
] & 1) == 0)
5799 p
= s
->contents
+ glue_addr
;
5800 bfd_put_32 (globals
->obfd
, armbx1_tst_insn
+ (reg
<< 16), p
);
5801 bfd_put_32 (globals
->obfd
, armbx2_moveq_insn
+ reg
, p
+ 4);
5802 bfd_put_32 (globals
->obfd
, armbx3_bx_insn
+ reg
, p
+ 8);
5803 globals
->bx_glue_offset
[reg
] |= 1;
5806 return glue_addr
+ s
->output_section
->vma
+ s
->output_offset
;
5809 /* Generate Arm stubs for exported Thumb symbols. */
5811 elf32_arm_begin_write_processing (bfd
*abfd ATTRIBUTE_UNUSED
,
5812 struct bfd_link_info
*link_info
)
5814 struct elf32_arm_link_hash_table
* globals
;
5816 if (link_info
== NULL
)
5817 /* Ignore this if we are not called by the ELF backend linker. */
5820 globals
= elf32_arm_hash_table (link_info
);
5821 /* If blx is available then exported Thumb symbols are OK and there is
5823 if (globals
->use_blx
)
5826 elf_link_hash_traverse (&globals
->root
, elf32_arm_to_thumb_export_stub
,
5830 /* Some relocations map to different relocations depending on the
5831 target. Return the real relocation. */
5834 arm_real_reloc_type (struct elf32_arm_link_hash_table
* globals
,
5840 if (globals
->target1_is_rel
)
5846 return globals
->target2_reloc
;
5853 /* Return the base VMA address which should be subtracted from real addresses
5854 when resolving @dtpoff relocation.
5855 This is PT_TLS segment p_vaddr. */
5858 dtpoff_base (struct bfd_link_info
*info
)
5860 /* If tls_sec is NULL, we should have signalled an error already. */
5861 if (elf_hash_table (info
)->tls_sec
== NULL
)
5863 return elf_hash_table (info
)->tls_sec
->vma
;
5866 /* Return the relocation value for @tpoff relocation
5867 if STT_TLS virtual address is ADDRESS. */
5870 tpoff (struct bfd_link_info
*info
, bfd_vma address
)
5872 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
5875 /* If tls_sec is NULL, we should have signalled an error already. */
5876 if (htab
->tls_sec
== NULL
)
5878 base
= align_power ((bfd_vma
) TCB_SIZE
, htab
->tls_sec
->alignment_power
);
5879 return address
- htab
->tls_sec
->vma
+ base
;
5882 /* Perform an R_ARM_ABS12 relocation on the field pointed to by DATA.
5883 VALUE is the relocation value. */
5885 static bfd_reloc_status_type
5886 elf32_arm_abs12_reloc (bfd
*abfd
, void *data
, bfd_vma value
)
5889 return bfd_reloc_overflow
;
5891 value
|= bfd_get_32 (abfd
, data
) & 0xfffff000;
5892 bfd_put_32 (abfd
, value
, data
);
5893 return bfd_reloc_ok
;
5896 /* For a given value of n, calculate the value of G_n as required to
5897 deal with group relocations. We return it in the form of an
5898 encoded constant-and-rotation, together with the final residual. If n is
5899 specified as less than zero, then final_residual is filled with the
5900 input value and no further action is performed. */
5903 calculate_group_reloc_mask (bfd_vma value
, int n
, bfd_vma
*final_residual
)
5907 bfd_vma encoded_g_n
= 0;
5908 bfd_vma residual
= value
; /* Also known as Y_n. */
5910 for (current_n
= 0; current_n
<= n
; current_n
++)
5914 /* Calculate which part of the value to mask. */
5921 /* Determine the most significant bit in the residual and
5922 align the resulting value to a 2-bit boundary. */
5923 for (msb
= 30; msb
>= 0; msb
-= 2)
5924 if (residual
& (3 << msb
))
5927 /* The desired shift is now (msb - 6), or zero, whichever
5934 /* Calculate g_n in 32-bit as well as encoded constant+rotation form. */
5935 g_n
= residual
& (0xff << shift
);
5936 encoded_g_n
= (g_n
>> shift
)
5937 | ((g_n
<= 0xff ? 0 : (32 - shift
) / 2) << 8);
5939 /* Calculate the residual for the next time around. */
5943 *final_residual
= residual
;
5948 /* Given an ARM instruction, determine whether it is an ADD or a SUB.
5949 Returns 1 if it is an ADD, -1 if it is a SUB, and 0 otherwise. */
5952 identify_add_or_sub (bfd_vma insn
)
5954 int opcode
= insn
& 0x1e00000;
5956 if (opcode
== 1 << 23) /* ADD */
5959 if (opcode
== 1 << 22) /* SUB */
5965 /* Perform a relocation as part of a final link. */
5967 static bfd_reloc_status_type
5968 elf32_arm_final_link_relocate (reloc_howto_type
* howto
,
5971 asection
* input_section
,
5972 bfd_byte
* contents
,
5973 Elf_Internal_Rela
* rel
,
5975 struct bfd_link_info
* info
,
5977 const char * sym_name
,
5979 struct elf_link_hash_entry
* h
,
5980 bfd_boolean
* unresolved_reloc_p
,
5981 char ** error_message
)
5983 unsigned long r_type
= howto
->type
;
5984 unsigned long r_symndx
;
5985 bfd_byte
* hit_data
= contents
+ rel
->r_offset
;
5986 bfd
* dynobj
= NULL
;
5987 Elf_Internal_Shdr
* symtab_hdr
;
5988 struct elf_link_hash_entry
** sym_hashes
;
5989 bfd_vma
* local_got_offsets
;
5990 asection
* sgot
= NULL
;
5991 asection
* splt
= NULL
;
5992 asection
* sreloc
= NULL
;
5994 bfd_signed_vma signed_addend
;
5995 struct elf32_arm_link_hash_table
* globals
;
5997 globals
= elf32_arm_hash_table (info
);
5999 BFD_ASSERT (is_arm_elf (input_bfd
));
6001 /* Some relocation types map to different relocations depending on the
6002 target. We pick the right one here. */
6003 r_type
= arm_real_reloc_type (globals
, r_type
);
6004 if (r_type
!= howto
->type
)
6005 howto
= elf32_arm_howto_from_type (r_type
);
6007 /* If the start address has been set, then set the EF_ARM_HASENTRY
6008 flag. Setting this more than once is redundant, but the cost is
6009 not too high, and it keeps the code simple.
6011 The test is done here, rather than somewhere else, because the
6012 start address is only set just before the final link commences.
6014 Note - if the user deliberately sets a start address of 0, the
6015 flag will not be set. */
6016 if (bfd_get_start_address (output_bfd
) != 0)
6017 elf_elfheader (output_bfd
)->e_flags
|= EF_ARM_HASENTRY
;
6019 dynobj
= elf_hash_table (info
)->dynobj
;
6022 sgot
= bfd_get_section_by_name (dynobj
, ".got");
6023 splt
= bfd_get_section_by_name (dynobj
, ".plt");
6025 symtab_hdr
= & elf_symtab_hdr (input_bfd
);
6026 sym_hashes
= elf_sym_hashes (input_bfd
);
6027 local_got_offsets
= elf_local_got_offsets (input_bfd
);
6028 r_symndx
= ELF32_R_SYM (rel
->r_info
);
6030 if (globals
->use_rel
)
6032 addend
= bfd_get_32 (input_bfd
, hit_data
) & howto
->src_mask
;
6034 if (addend
& ((howto
->src_mask
+ 1) >> 1))
6037 signed_addend
&= ~ howto
->src_mask
;
6038 signed_addend
|= addend
;
6041 signed_addend
= addend
;
6044 addend
= signed_addend
= rel
->r_addend
;
6049 /* We don't need to find a value for this symbol. It's just a
6051 *unresolved_reloc_p
= FALSE
;
6052 return bfd_reloc_ok
;
6055 if (!globals
->vxworks_p
)
6056 return elf32_arm_abs12_reloc (input_bfd
, hit_data
, value
+ addend
);
6060 case R_ARM_ABS32_NOI
:
6062 case R_ARM_REL32_NOI
:
6068 /* Handle relocations which should use the PLT entry. ABS32/REL32
6069 will use the symbol's value, which may point to a PLT entry, but we
6070 don't need to handle that here. If we created a PLT entry, all
6071 branches in this object should go to it, except if the PLT is too
6072 far away, in which case a long branch stub should be inserted. */
6073 if ((r_type
!= R_ARM_ABS32
&& r_type
!= R_ARM_REL32
6074 && r_type
!= R_ARM_ABS32_NOI
&& r_type
!= R_ARM_REL32_NOI
6075 && r_type
!= R_ARM_CALL
6076 && r_type
!= R_ARM_JUMP24
6077 && r_type
!= R_ARM_PLT32
)
6080 && h
->plt
.offset
!= (bfd_vma
) -1)
6082 /* If we've created a .plt section, and assigned a PLT entry to
6083 this function, it should not be known to bind locally. If
6084 it were, we would have cleared the PLT entry. */
6085 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info
, h
));
6087 value
= (splt
->output_section
->vma
6088 + splt
->output_offset
6090 *unresolved_reloc_p
= FALSE
;
6091 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
6092 contents
, rel
->r_offset
, value
,
6096 /* When generating a shared object or relocatable executable, these
6097 relocations are copied into the output file to be resolved at
6099 if ((info
->shared
|| globals
->root
.is_relocatable_executable
)
6100 && (input_section
->flags
& SEC_ALLOC
)
6101 && !(elf32_arm_hash_table (info
)->vxworks_p
6102 && strcmp (input_section
->output_section
->name
,
6104 && ((r_type
!= R_ARM_REL32
&& r_type
!= R_ARM_REL32_NOI
)
6105 || !SYMBOL_CALLS_LOCAL (info
, h
))
6107 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
6108 || h
->root
.type
!= bfd_link_hash_undefweak
)
6109 && r_type
!= R_ARM_PC24
6110 && r_type
!= R_ARM_CALL
6111 && r_type
!= R_ARM_JUMP24
6112 && r_type
!= R_ARM_PREL31
6113 && r_type
!= R_ARM_PLT32
)
6115 Elf_Internal_Rela outrel
;
6117 bfd_boolean skip
, relocate
;
6119 *unresolved_reloc_p
= FALSE
;
6123 sreloc
= _bfd_elf_get_dynamic_reloc_section (input_bfd
, input_section
,
6124 ! globals
->use_rel
);
6127 return bfd_reloc_notsupported
;
6133 outrel
.r_addend
= addend
;
6135 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
6137 if (outrel
.r_offset
== (bfd_vma
) -1)
6139 else if (outrel
.r_offset
== (bfd_vma
) -2)
6140 skip
= TRUE
, relocate
= TRUE
;
6141 outrel
.r_offset
+= (input_section
->output_section
->vma
6142 + input_section
->output_offset
);
6145 memset (&outrel
, 0, sizeof outrel
);
6150 || !h
->def_regular
))
6151 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
6156 /* This symbol is local, or marked to become local. */
6157 if (sym_flags
== STT_ARM_TFUNC
)
6159 if (globals
->symbian_p
)
6163 /* On Symbian OS, the data segment and text segement
6164 can be relocated independently. Therefore, we
6165 must indicate the segment to which this
6166 relocation is relative. The BPABI allows us to
6167 use any symbol in the right segment; we just use
6168 the section symbol as it is convenient. (We
6169 cannot use the symbol given by "h" directly as it
6170 will not appear in the dynamic symbol table.)
6172 Note that the dynamic linker ignores the section
6173 symbol value, so we don't subtract osec->vma
6174 from the emitted reloc addend. */
6176 osec
= sym_sec
->output_section
;
6178 osec
= input_section
->output_section
;
6179 symbol
= elf_section_data (osec
)->dynindx
;
6182 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
6184 if ((osec
->flags
& SEC_READONLY
) == 0
6185 && htab
->data_index_section
!= NULL
)
6186 osec
= htab
->data_index_section
;
6188 osec
= htab
->text_index_section
;
6189 symbol
= elf_section_data (osec
)->dynindx
;
6191 BFD_ASSERT (symbol
!= 0);
6194 /* On SVR4-ish systems, the dynamic loader cannot
6195 relocate the text and data segments independently,
6196 so the symbol does not matter. */
6198 outrel
.r_info
= ELF32_R_INFO (symbol
, R_ARM_RELATIVE
);
6199 if (globals
->use_rel
)
6202 outrel
.r_addend
+= value
;
6205 loc
= sreloc
->contents
;
6206 loc
+= sreloc
->reloc_count
++ * RELOC_SIZE (globals
);
6207 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
6209 /* If this reloc is against an external symbol, we do not want to
6210 fiddle with the addend. Otherwise, we need to include the symbol
6211 value so that it becomes an addend for the dynamic reloc. */
6213 return bfd_reloc_ok
;
6215 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
6216 contents
, rel
->r_offset
, value
,
6219 else switch (r_type
)
6222 return elf32_arm_abs12_reloc (input_bfd
, hit_data
, value
+ addend
);
6224 case R_ARM_XPC25
: /* Arm BLX instruction. */
6227 case R_ARM_PC24
: /* Arm B/BL instruction. */
6231 bfd_signed_vma branch_offset
;
6232 struct elf32_arm_stub_hash_entry
*stub_entry
= NULL
;
6234 if (r_type
== R_ARM_XPC25
)
6236 /* Check for Arm calling Arm function. */
6237 /* FIXME: Should we translate the instruction into a BL
6238 instruction instead ? */
6239 if (sym_flags
!= STT_ARM_TFUNC
)
6240 (*_bfd_error_handler
)
6241 (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
6243 h
? h
->root
.root
.string
: "(local)");
6245 else if (r_type
== R_ARM_PC24
)
6247 /* Check for Arm calling Thumb function. */
6248 if (sym_flags
== STT_ARM_TFUNC
)
6250 if (elf32_arm_to_thumb_stub (info
, sym_name
, input_bfd
,
6251 output_bfd
, input_section
,
6252 hit_data
, sym_sec
, rel
->r_offset
,
6253 signed_addend
, value
,
6255 return bfd_reloc_ok
;
6257 return bfd_reloc_dangerous
;
6261 /* Check if a stub has to be inserted because the
6262 destination is too far or we are changing mode. */
6263 if ( r_type
== R_ARM_CALL
6264 || r_type
== R_ARM_JUMP24
6265 || r_type
== R_ARM_PLT32
)
6267 /* If the call goes through a PLT entry, make sure to
6268 check distance to the right destination address. */
6269 if (h
!= NULL
&& splt
!= NULL
&& h
->plt
.offset
!= (bfd_vma
) -1)
6271 value
= (splt
->output_section
->vma
6272 + splt
->output_offset
6274 *unresolved_reloc_p
= FALSE
;
6277 from
= (input_section
->output_section
->vma
6278 + input_section
->output_offset
6280 branch_offset
= (bfd_signed_vma
)(value
- from
);
6282 if (branch_offset
> ARM_MAX_FWD_BRANCH_OFFSET
6283 || branch_offset
< ARM_MAX_BWD_BRANCH_OFFSET
6284 || ((sym_flags
== STT_ARM_TFUNC
)
6285 && (((r_type
== R_ARM_CALL
) && !globals
->use_blx
)
6286 || (r_type
== R_ARM_JUMP24
)
6287 || (r_type
== R_ARM_PLT32
) ))
6290 /* The target is out of reach, so redirect the
6291 branch to the local stub for this function. */
6293 stub_entry
= elf32_arm_get_stub_entry (input_section
,
6296 if (stub_entry
!= NULL
)
6297 value
= (stub_entry
->stub_offset
6298 + stub_entry
->stub_sec
->output_offset
6299 + stub_entry
->stub_sec
->output_section
->vma
);
6303 /* The ARM ELF ABI says that this reloc is computed as: S - P + A
6305 S is the address of the symbol in the relocation.
6306 P is address of the instruction being relocated.
6307 A is the addend (extracted from the instruction) in bytes.
6309 S is held in 'value'.
6310 P is the base address of the section containing the
6311 instruction plus the offset of the reloc into that
6313 (input_section->output_section->vma +
6314 input_section->output_offset +
6316 A is the addend, converted into bytes, ie:
6319 Note: None of these operations have knowledge of the pipeline
6320 size of the processor, thus it is up to the assembler to
6321 encode this information into the addend. */
6322 value
-= (input_section
->output_section
->vma
6323 + input_section
->output_offset
);
6324 value
-= rel
->r_offset
;
6325 if (globals
->use_rel
)
6326 value
+= (signed_addend
<< howto
->size
);
6328 /* RELA addends do not have to be adjusted by howto->size. */
6329 value
+= signed_addend
;
6331 signed_addend
= value
;
6332 signed_addend
>>= howto
->rightshift
;
6334 /* A branch to an undefined weak symbol is turned into a jump to
6335 the next instruction unless a PLT entry will be created. */
6336 if (h
&& h
->root
.type
== bfd_link_hash_undefweak
6337 && !(splt
!= NULL
&& h
->plt
.offset
!= (bfd_vma
) -1))
6339 value
= (bfd_get_32 (input_bfd
, hit_data
) & 0xf0000000)
6344 /* Perform a signed range check. */
6345 if ( signed_addend
> ((bfd_signed_vma
) (howto
->dst_mask
>> 1))
6346 || signed_addend
< - ((bfd_signed_vma
) ((howto
->dst_mask
+ 1) >> 1)))
6347 return bfd_reloc_overflow
;
6349 addend
= (value
& 2);
6351 value
= (signed_addend
& howto
->dst_mask
)
6352 | (bfd_get_32 (input_bfd
, hit_data
) & (~ howto
->dst_mask
));
6354 if (r_type
== R_ARM_CALL
)
6356 /* Set the H bit in the BLX instruction. */
6357 if (sym_flags
== STT_ARM_TFUNC
)
6362 value
&= ~(bfd_vma
)(1 << 24);
6365 /* Select the correct instruction (BL or BLX). */
6366 /* Only if we are not handling a BL to a stub. In this
6367 case, mode switching is performed by the stub. */
6368 if (sym_flags
== STT_ARM_TFUNC
&& !stub_entry
)
6372 value
&= ~(bfd_vma
)(1 << 28);
6382 if (sym_flags
== STT_ARM_TFUNC
)
6386 case R_ARM_ABS32_NOI
:
6392 if (sym_flags
== STT_ARM_TFUNC
)
6394 value
-= (input_section
->output_section
->vma
6395 + input_section
->output_offset
+ rel
->r_offset
);
6398 case R_ARM_REL32_NOI
:
6400 value
-= (input_section
->output_section
->vma
6401 + input_section
->output_offset
+ rel
->r_offset
);
6405 value
-= (input_section
->output_section
->vma
6406 + input_section
->output_offset
+ rel
->r_offset
);
6407 value
+= signed_addend
;
6408 if (! h
|| h
->root
.type
!= bfd_link_hash_undefweak
)
6410 /* Check for overflow. */
6411 if ((value
^ (value
>> 1)) & (1 << 30))
6412 return bfd_reloc_overflow
;
6414 value
&= 0x7fffffff;
6415 value
|= (bfd_get_32 (input_bfd
, hit_data
) & 0x80000000);
6416 if (sym_flags
== STT_ARM_TFUNC
)
6421 bfd_put_32 (input_bfd
, value
, hit_data
);
6422 return bfd_reloc_ok
;
6426 if ((long) value
> 0x7f || (long) value
< -0x80)
6427 return bfd_reloc_overflow
;
6429 bfd_put_8 (input_bfd
, value
, hit_data
);
6430 return bfd_reloc_ok
;
6435 if ((long) value
> 0x7fff || (long) value
< -0x8000)
6436 return bfd_reloc_overflow
;
6438 bfd_put_16 (input_bfd
, value
, hit_data
);
6439 return bfd_reloc_ok
;
6441 case R_ARM_THM_ABS5
:
6442 /* Support ldr and str instructions for the thumb. */
6443 if (globals
->use_rel
)
6445 /* Need to refetch addend. */
6446 addend
= bfd_get_16 (input_bfd
, hit_data
) & howto
->src_mask
;
6447 /* ??? Need to determine shift amount from operand size. */
6448 addend
>>= howto
->rightshift
;
6452 /* ??? Isn't value unsigned? */
6453 if ((long) value
> 0x1f || (long) value
< -0x10)
6454 return bfd_reloc_overflow
;
6456 /* ??? Value needs to be properly shifted into place first. */
6457 value
|= bfd_get_16 (input_bfd
, hit_data
) & 0xf83f;
6458 bfd_put_16 (input_bfd
, value
, hit_data
);
6459 return bfd_reloc_ok
;
6461 case R_ARM_THM_ALU_PREL_11_0
:
6462 /* Corresponds to: addw.w reg, pc, #offset (and similarly for subw). */
6465 bfd_signed_vma relocation
;
6467 insn
= (bfd_get_16 (input_bfd
, hit_data
) << 16)
6468 | bfd_get_16 (input_bfd
, hit_data
+ 2);
6470 if (globals
->use_rel
)
6472 signed_addend
= (insn
& 0xff) | ((insn
& 0x7000) >> 4)
6473 | ((insn
& (1 << 26)) >> 15);
6474 if (insn
& 0xf00000)
6475 signed_addend
= -signed_addend
;
6478 relocation
= value
+ signed_addend
;
6479 relocation
-= (input_section
->output_section
->vma
6480 + input_section
->output_offset
6483 value
= abs (relocation
);
6485 if (value
>= 0x1000)
6486 return bfd_reloc_overflow
;
6488 insn
= (insn
& 0xfb0f8f00) | (value
& 0xff)
6489 | ((value
& 0x700) << 4)
6490 | ((value
& 0x800) << 15);
6494 bfd_put_16 (input_bfd
, insn
>> 16, hit_data
);
6495 bfd_put_16 (input_bfd
, insn
& 0xffff, hit_data
+ 2);
6497 return bfd_reloc_ok
;
6500 case R_ARM_THM_PC12
:
6501 /* Corresponds to: ldr.w reg, [pc, #offset]. */
6504 bfd_signed_vma relocation
;
6506 insn
= (bfd_get_16 (input_bfd
, hit_data
) << 16)
6507 | bfd_get_16 (input_bfd
, hit_data
+ 2);
6509 if (globals
->use_rel
)
6511 signed_addend
= insn
& 0xfff;
6512 if (!(insn
& (1 << 23)))
6513 signed_addend
= -signed_addend
;
6516 relocation
= value
+ signed_addend
;
6517 relocation
-= (input_section
->output_section
->vma
6518 + input_section
->output_offset
6521 value
= abs (relocation
);
6523 if (value
>= 0x1000)
6524 return bfd_reloc_overflow
;
6526 insn
= (insn
& 0xff7ff000) | value
;
6527 if (relocation
>= 0)
6530 bfd_put_16 (input_bfd
, insn
>> 16, hit_data
);
6531 bfd_put_16 (input_bfd
, insn
& 0xffff, hit_data
+ 2);
6533 return bfd_reloc_ok
;
6536 case R_ARM_THM_XPC22
:
6537 case R_ARM_THM_CALL
:
6538 case R_ARM_THM_JUMP24
:
6539 /* Thumb BL (branch long instruction). */
6543 bfd_boolean overflow
= FALSE
;
6544 bfd_vma upper_insn
= bfd_get_16 (input_bfd
, hit_data
);
6545 bfd_vma lower_insn
= bfd_get_16 (input_bfd
, hit_data
+ 2);
6546 bfd_signed_vma reloc_signed_max
;
6547 bfd_signed_vma reloc_signed_min
;
6549 bfd_signed_vma signed_check
;
6551 int thumb2
= using_thumb2 (globals
);
6553 /* A branch to an undefined weak symbol is turned into a jump to
6554 the next instruction unless a PLT entry will be created. */
6555 if (h
&& h
->root
.type
== bfd_link_hash_undefweak
6556 && !(splt
!= NULL
&& h
->plt
.offset
!= (bfd_vma
) -1))
6558 bfd_put_16 (input_bfd
, 0xe000, hit_data
);
6559 bfd_put_16 (input_bfd
, 0xbf00, hit_data
+ 2);
6560 return bfd_reloc_ok
;
6563 /* Fetch the addend. We use the Thumb-2 encoding (backwards compatible
6564 with Thumb-1) involving the J1 and J2 bits. */
6565 if (globals
->use_rel
)
6567 bfd_vma s
= (upper_insn
& (1 << 10)) >> 10;
6568 bfd_vma upper
= upper_insn
& 0x3ff;
6569 bfd_vma lower
= lower_insn
& 0x7ff;
6570 bfd_vma j1
= (lower_insn
& (1 << 13)) >> 13;
6571 bfd_vma j2
= (lower_insn
& (1 << 11)) >> 11;
6572 bfd_vma i1
= j1
^ s
? 0 : 1;
6573 bfd_vma i2
= j2
^ s
? 0 : 1;
6575 addend
= (i1
<< 23) | (i2
<< 22) | (upper
<< 12) | (lower
<< 1);
6577 addend
= (addend
| ((s
? 0 : 1) << 24)) - (1 << 24);
6579 signed_addend
= addend
;
6582 if (r_type
== R_ARM_THM_XPC22
)
6584 /* Check for Thumb to Thumb call. */
6585 /* FIXME: Should we translate the instruction into a BL
6586 instruction instead ? */
6587 if (sym_flags
== STT_ARM_TFUNC
)
6588 (*_bfd_error_handler
)
6589 (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
6591 h
? h
->root
.root
.string
: "(local)");
6595 /* If it is not a call to Thumb, assume call to Arm.
6596 If it is a call relative to a section name, then it is not a
6597 function call at all, but rather a long jump. Calls through
6598 the PLT do not require stubs. */
6599 if (sym_flags
!= STT_ARM_TFUNC
&& sym_flags
!= STT_SECTION
6600 && (h
== NULL
|| splt
== NULL
6601 || h
->plt
.offset
== (bfd_vma
) -1))
6603 if (globals
->use_blx
&& r_type
== R_ARM_THM_CALL
)
6605 /* Convert BL to BLX. */
6606 lower_insn
= (lower_insn
& ~0x1000) | 0x0800;
6608 else if (( r_type
!= R_ARM_THM_CALL
)
6609 && (r_type
!= R_ARM_THM_JUMP24
))
6611 if (elf32_thumb_to_arm_stub
6612 (info
, sym_name
, input_bfd
, output_bfd
, input_section
,
6613 hit_data
, sym_sec
, rel
->r_offset
, signed_addend
, value
,
6615 return bfd_reloc_ok
;
6617 return bfd_reloc_dangerous
;
6620 else if (sym_flags
== STT_ARM_TFUNC
&& globals
->use_blx
6621 && r_type
== R_ARM_THM_CALL
)
6623 /* Make sure this is a BL. */
6624 lower_insn
|= 0x1800;
6628 /* Handle calls via the PLT. */
6629 if (h
!= NULL
&& splt
!= NULL
&& h
->plt
.offset
!= (bfd_vma
) -1)
6631 value
= (splt
->output_section
->vma
6632 + splt
->output_offset
6634 if (globals
->use_blx
&& r_type
== R_ARM_THM_CALL
)
6636 /* If the Thumb BLX instruction is available, convert the
6637 BL to a BLX instruction to call the ARM-mode PLT entry. */
6638 lower_insn
= (lower_insn
& ~0x1000) | 0x0800;
6641 /* Target the Thumb stub before the ARM PLT entry. */
6642 value
-= PLT_THUMB_STUB_SIZE
;
6643 *unresolved_reloc_p
= FALSE
;
6646 if (r_type
== R_ARM_THM_CALL
|| r_type
== R_ARM_THM_JUMP24
)
6648 /* Check if a stub has to be inserted because the destination
6651 bfd_signed_vma branch_offset
;
6652 struct elf32_arm_stub_hash_entry
*stub_entry
= NULL
;
6654 from
= (input_section
->output_section
->vma
6655 + input_section
->output_offset
6657 branch_offset
= (bfd_signed_vma
)(value
- from
);
6660 && (branch_offset
> THM_MAX_FWD_BRANCH_OFFSET
6661 || (branch_offset
< THM_MAX_BWD_BRANCH_OFFSET
)))
6664 && (branch_offset
> THM2_MAX_FWD_BRANCH_OFFSET
6665 || (branch_offset
< THM2_MAX_BWD_BRANCH_OFFSET
)))
6666 || ((sym_flags
!= STT_ARM_TFUNC
)
6667 && (((r_type
== R_ARM_THM_CALL
) && !globals
->use_blx
)
6668 || r_type
== R_ARM_THM_JUMP24
)))
6670 /* The target is out of reach or we are changing modes, so
6671 redirect the branch to the local stub for this
6673 stub_entry
= elf32_arm_get_stub_entry (input_section
,
6676 if (stub_entry
!= NULL
)
6677 value
= (stub_entry
->stub_offset
6678 + stub_entry
->stub_sec
->output_offset
6679 + stub_entry
->stub_sec
->output_section
->vma
);
6681 /* If this call becomes a call to Arm, force BLX. */
6682 if (globals
->use_blx
&& (r_type
== R_ARM_THM_CALL
))
6685 && !arm_stub_is_thumb (stub_entry
->stub_type
))
6686 || (sym_flags
!= STT_ARM_TFUNC
))
6687 lower_insn
= (lower_insn
& ~0x1000) | 0x0800;
6692 relocation
= value
+ signed_addend
;
6694 relocation
-= (input_section
->output_section
->vma
6695 + input_section
->output_offset
6698 check
= relocation
>> howto
->rightshift
;
6700 /* If this is a signed value, the rightshift just dropped
6701 leading 1 bits (assuming twos complement). */
6702 if ((bfd_signed_vma
) relocation
>= 0)
6703 signed_check
= check
;
6705 signed_check
= check
| ~((bfd_vma
) -1 >> howto
->rightshift
);
6707 /* Calculate the permissable maximum and minimum values for
6708 this relocation according to whether we're relocating for
6710 bitsize
= howto
->bitsize
;
6713 reloc_signed_max
= ((1 << (bitsize
- 1)) - 1) >> howto
->rightshift
;
6714 reloc_signed_min
= ~reloc_signed_max
;
6716 /* Assumes two's complement. */
6717 if (signed_check
> reloc_signed_max
|| signed_check
< reloc_signed_min
)
6720 if ((lower_insn
& 0x5000) == 0x4000)
6721 /* For a BLX instruction, make sure that the relocation is rounded up
6722 to a word boundary. This follows the semantics of the instruction
6723 which specifies that bit 1 of the target address will come from bit
6724 1 of the base address. */
6725 relocation
= (relocation
+ 2) & ~ 3;
6727 /* Put RELOCATION back into the insn. Assumes two's complement.
6728 We use the Thumb-2 encoding, which is safe even if dealing with
6729 a Thumb-1 instruction by virtue of our overflow check above. */
6730 reloc_sign
= (signed_check
< 0) ? 1 : 0;
6731 upper_insn
= (upper_insn
& ~(bfd_vma
) 0x7ff)
6732 | ((relocation
>> 12) & 0x3ff)
6733 | (reloc_sign
<< 10);
6734 lower_insn
= (lower_insn
& ~(bfd_vma
) 0x2fff)
6735 | (((!((relocation
>> 23) & 1)) ^ reloc_sign
) << 13)
6736 | (((!((relocation
>> 22) & 1)) ^ reloc_sign
) << 11)
6737 | ((relocation
>> 1) & 0x7ff);
6739 /* Put the relocated value back in the object file: */
6740 bfd_put_16 (input_bfd
, upper_insn
, hit_data
);
6741 bfd_put_16 (input_bfd
, lower_insn
, hit_data
+ 2);
6743 return (overflow
? bfd_reloc_overflow
: bfd_reloc_ok
);
6747 case R_ARM_THM_JUMP19
:
6748 /* Thumb32 conditional branch instruction. */
6751 bfd_boolean overflow
= FALSE
;
6752 bfd_vma upper_insn
= bfd_get_16 (input_bfd
, hit_data
);
6753 bfd_vma lower_insn
= bfd_get_16 (input_bfd
, hit_data
+ 2);
6754 bfd_signed_vma reloc_signed_max
= 0xffffe;
6755 bfd_signed_vma reloc_signed_min
= -0x100000;
6756 bfd_signed_vma signed_check
;
6758 /* Need to refetch the addend, reconstruct the top three bits,
6759 and squish the two 11 bit pieces together. */
6760 if (globals
->use_rel
)
6762 bfd_vma S
= (upper_insn
& 0x0400) >> 10;
6763 bfd_vma upper
= (upper_insn
& 0x003f);
6764 bfd_vma J1
= (lower_insn
& 0x2000) >> 13;
6765 bfd_vma J2
= (lower_insn
& 0x0800) >> 11;
6766 bfd_vma lower
= (lower_insn
& 0x07ff);
6771 upper
-= 0x0100; /* Sign extend. */
6773 addend
= (upper
<< 12) | (lower
<< 1);
6774 signed_addend
= addend
;
6777 /* Handle calls via the PLT. */
6778 if (h
!= NULL
&& splt
!= NULL
&& h
->plt
.offset
!= (bfd_vma
) -1)
6780 value
= (splt
->output_section
->vma
6781 + splt
->output_offset
6783 /* Target the Thumb stub before the ARM PLT entry. */
6784 value
-= PLT_THUMB_STUB_SIZE
;
6785 *unresolved_reloc_p
= FALSE
;
6788 /* ??? Should handle interworking? GCC might someday try to
6789 use this for tail calls. */
6791 relocation
= value
+ signed_addend
;
6792 relocation
-= (input_section
->output_section
->vma
6793 + input_section
->output_offset
6795 signed_check
= (bfd_signed_vma
) relocation
;
6797 if (signed_check
> reloc_signed_max
|| signed_check
< reloc_signed_min
)
6800 /* Put RELOCATION back into the insn. */
6802 bfd_vma S
= (relocation
& 0x00100000) >> 20;
6803 bfd_vma J2
= (relocation
& 0x00080000) >> 19;
6804 bfd_vma J1
= (relocation
& 0x00040000) >> 18;
6805 bfd_vma hi
= (relocation
& 0x0003f000) >> 12;
6806 bfd_vma lo
= (relocation
& 0x00000ffe) >> 1;
6808 upper_insn
= (upper_insn
& 0xfbc0) | (S
<< 10) | hi
;
6809 lower_insn
= (lower_insn
& 0xd000) | (J1
<< 13) | (J2
<< 11) | lo
;
6812 /* Put the relocated value back in the object file: */
6813 bfd_put_16 (input_bfd
, upper_insn
, hit_data
);
6814 bfd_put_16 (input_bfd
, lower_insn
, hit_data
+ 2);
6816 return (overflow
? bfd_reloc_overflow
: bfd_reloc_ok
);
6819 case R_ARM_THM_JUMP11
:
6820 case R_ARM_THM_JUMP8
:
6821 case R_ARM_THM_JUMP6
:
6822 /* Thumb B (branch) instruction). */
6824 bfd_signed_vma relocation
;
6825 bfd_signed_vma reloc_signed_max
= (1 << (howto
->bitsize
- 1)) - 1;
6826 bfd_signed_vma reloc_signed_min
= ~ reloc_signed_max
;
6827 bfd_signed_vma signed_check
;
6829 /* CZB cannot jump backward. */
6830 if (r_type
== R_ARM_THM_JUMP6
)
6831 reloc_signed_min
= 0;
6833 if (globals
->use_rel
)
6835 /* Need to refetch addend. */
6836 addend
= bfd_get_16 (input_bfd
, hit_data
) & howto
->src_mask
;
6837 if (addend
& ((howto
->src_mask
+ 1) >> 1))
6840 signed_addend
&= ~ howto
->src_mask
;
6841 signed_addend
|= addend
;
6844 signed_addend
= addend
;
6845 /* The value in the insn has been right shifted. We need to
6846 undo this, so that we can perform the address calculation
6847 in terms of bytes. */
6848 signed_addend
<<= howto
->rightshift
;
6850 relocation
= value
+ signed_addend
;
6852 relocation
-= (input_section
->output_section
->vma
6853 + input_section
->output_offset
6856 relocation
>>= howto
->rightshift
;
6857 signed_check
= relocation
;
6859 if (r_type
== R_ARM_THM_JUMP6
)
6860 relocation
= ((relocation
& 0x0020) << 4) | ((relocation
& 0x001f) << 3);
6862 relocation
&= howto
->dst_mask
;
6863 relocation
|= (bfd_get_16 (input_bfd
, hit_data
) & (~ howto
->dst_mask
));
6865 bfd_put_16 (input_bfd
, relocation
, hit_data
);
6867 /* Assumes two's complement. */
6868 if (signed_check
> reloc_signed_max
|| signed_check
< reloc_signed_min
)
6869 return bfd_reloc_overflow
;
6871 return bfd_reloc_ok
;
6874 case R_ARM_ALU_PCREL7_0
:
6875 case R_ARM_ALU_PCREL15_8
:
6876 case R_ARM_ALU_PCREL23_15
:
6881 insn
= bfd_get_32 (input_bfd
, hit_data
);
6882 if (globals
->use_rel
)
6884 /* Extract the addend. */
6885 addend
= (insn
& 0xff) << ((insn
& 0xf00) >> 7);
6886 signed_addend
= addend
;
6888 relocation
= value
+ signed_addend
;
6890 relocation
-= (input_section
->output_section
->vma
6891 + input_section
->output_offset
6893 insn
= (insn
& ~0xfff)
6894 | ((howto
->bitpos
<< 7) & 0xf00)
6895 | ((relocation
>> howto
->bitpos
) & 0xff);
6896 bfd_put_32 (input_bfd
, value
, hit_data
);
6898 return bfd_reloc_ok
;
6900 case R_ARM_GNU_VTINHERIT
:
6901 case R_ARM_GNU_VTENTRY
:
6902 return bfd_reloc_ok
;
6904 case R_ARM_GOTOFF32
:
6905 /* Relocation is relative to the start of the
6906 global offset table. */
6908 BFD_ASSERT (sgot
!= NULL
);
6910 return bfd_reloc_notsupported
;
6912 /* If we are addressing a Thumb function, we need to adjust the
6913 address by one, so that attempts to call the function pointer will
6914 correctly interpret it as Thumb code. */
6915 if (sym_flags
== STT_ARM_TFUNC
)
6918 /* Note that sgot->output_offset is not involved in this
6919 calculation. We always want the start of .got. If we
6920 define _GLOBAL_OFFSET_TABLE in a different way, as is
6921 permitted by the ABI, we might have to change this
6923 value
-= sgot
->output_section
->vma
;
6924 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
6925 contents
, rel
->r_offset
, value
,
6929 /* Use global offset table as symbol value. */
6930 BFD_ASSERT (sgot
!= NULL
);
6933 return bfd_reloc_notsupported
;
6935 *unresolved_reloc_p
= FALSE
;
6936 value
= sgot
->output_section
->vma
;
6937 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
6938 contents
, rel
->r_offset
, value
,
6942 case R_ARM_GOT_PREL
:
6943 /* Relocation is to the entry for this symbol in the
6944 global offset table. */
6946 return bfd_reloc_notsupported
;
6953 off
= h
->got
.offset
;
6954 BFD_ASSERT (off
!= (bfd_vma
) -1);
6955 dyn
= globals
->root
.dynamic_sections_created
;
6957 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
6959 && SYMBOL_REFERENCES_LOCAL (info
, h
))
6960 || (ELF_ST_VISIBILITY (h
->other
)
6961 && h
->root
.type
== bfd_link_hash_undefweak
))
6963 /* This is actually a static link, or it is a -Bsymbolic link
6964 and the symbol is defined locally. We must initialize this
6965 entry in the global offset table. Since the offset must
6966 always be a multiple of 4, we use the least significant bit
6967 to record whether we have initialized it already.
6969 When doing a dynamic link, we create a .rel(a).got relocation
6970 entry to initialize the value. This is done in the
6971 finish_dynamic_symbol routine. */
6976 /* If we are addressing a Thumb function, we need to
6977 adjust the address by one, so that attempts to
6978 call the function pointer will correctly
6979 interpret it as Thumb code. */
6980 if (sym_flags
== STT_ARM_TFUNC
)
6983 bfd_put_32 (output_bfd
, value
, sgot
->contents
+ off
);
6988 *unresolved_reloc_p
= FALSE
;
6990 value
= sgot
->output_offset
+ off
;
6996 BFD_ASSERT (local_got_offsets
!= NULL
&&
6997 local_got_offsets
[r_symndx
] != (bfd_vma
) -1);
6999 off
= local_got_offsets
[r_symndx
];
7001 /* The offset must always be a multiple of 4. We use the
7002 least significant bit to record whether we have already
7003 generated the necessary reloc. */
7008 /* If we are addressing a Thumb function, we need to
7009 adjust the address by one, so that attempts to
7010 call the function pointer will correctly
7011 interpret it as Thumb code. */
7012 if (sym_flags
== STT_ARM_TFUNC
)
7015 if (globals
->use_rel
)
7016 bfd_put_32 (output_bfd
, value
, sgot
->contents
+ off
);
7021 Elf_Internal_Rela outrel
;
7024 srelgot
= (bfd_get_section_by_name
7025 (dynobj
, RELOC_SECTION (globals
, ".got")));
7026 BFD_ASSERT (srelgot
!= NULL
);
7028 outrel
.r_addend
= addend
+ value
;
7029 outrel
.r_offset
= (sgot
->output_section
->vma
7030 + sgot
->output_offset
7032 outrel
.r_info
= ELF32_R_INFO (0, R_ARM_RELATIVE
);
7033 loc
= srelgot
->contents
;
7034 loc
+= srelgot
->reloc_count
++ * RELOC_SIZE (globals
);
7035 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
7038 local_got_offsets
[r_symndx
] |= 1;
7041 value
= sgot
->output_offset
+ off
;
7043 if (r_type
!= R_ARM_GOT32
)
7044 value
+= sgot
->output_section
->vma
;
7046 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
7047 contents
, rel
->r_offset
, value
,
7050 case R_ARM_TLS_LDO32
:
7051 value
= value
- dtpoff_base (info
);
7053 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
7054 contents
, rel
->r_offset
, value
,
7057 case R_ARM_TLS_LDM32
:
7061 if (globals
->sgot
== NULL
)
7064 off
= globals
->tls_ldm_got
.offset
;
7070 /* If we don't know the module number, create a relocation
7074 Elf_Internal_Rela outrel
;
7077 if (globals
->srelgot
== NULL
)
7080 outrel
.r_addend
= 0;
7081 outrel
.r_offset
= (globals
->sgot
->output_section
->vma
7082 + globals
->sgot
->output_offset
+ off
);
7083 outrel
.r_info
= ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32
);
7085 if (globals
->use_rel
)
7086 bfd_put_32 (output_bfd
, outrel
.r_addend
,
7087 globals
->sgot
->contents
+ off
);
7089 loc
= globals
->srelgot
->contents
;
7090 loc
+= globals
->srelgot
->reloc_count
++ * RELOC_SIZE (globals
);
7091 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
7094 bfd_put_32 (output_bfd
, 1, globals
->sgot
->contents
+ off
);
7096 globals
->tls_ldm_got
.offset
|= 1;
7099 value
= globals
->sgot
->output_section
->vma
+ globals
->sgot
->output_offset
+ off
7100 - (input_section
->output_section
->vma
+ input_section
->output_offset
+ rel
->r_offset
);
7102 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
7103 contents
, rel
->r_offset
, value
,
7107 case R_ARM_TLS_GD32
:
7108 case R_ARM_TLS_IE32
:
7114 if (globals
->sgot
== NULL
)
7121 dyn
= globals
->root
.dynamic_sections_created
;
7122 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
7124 || !SYMBOL_REFERENCES_LOCAL (info
, h
)))
7126 *unresolved_reloc_p
= FALSE
;
7129 off
= h
->got
.offset
;
7130 tls_type
= ((struct elf32_arm_link_hash_entry
*) h
)->tls_type
;
7134 if (local_got_offsets
== NULL
)
7136 off
= local_got_offsets
[r_symndx
];
7137 tls_type
= elf32_arm_local_got_tls_type (input_bfd
)[r_symndx
];
7140 if (tls_type
== GOT_UNKNOWN
)
7147 bfd_boolean need_relocs
= FALSE
;
7148 Elf_Internal_Rela outrel
;
7149 bfd_byte
*loc
= NULL
;
7152 /* The GOT entries have not been initialized yet. Do it
7153 now, and emit any relocations. If both an IE GOT and a
7154 GD GOT are necessary, we emit the GD first. */
7156 if ((info
->shared
|| indx
!= 0)
7158 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
7159 || h
->root
.type
!= bfd_link_hash_undefweak
))
7162 if (globals
->srelgot
== NULL
)
7164 loc
= globals
->srelgot
->contents
;
7165 loc
+= globals
->srelgot
->reloc_count
* RELOC_SIZE (globals
);
7168 if (tls_type
& GOT_TLS_GD
)
7172 outrel
.r_addend
= 0;
7173 outrel
.r_offset
= (globals
->sgot
->output_section
->vma
7174 + globals
->sgot
->output_offset
7176 outrel
.r_info
= ELF32_R_INFO (indx
, R_ARM_TLS_DTPMOD32
);
7178 if (globals
->use_rel
)
7179 bfd_put_32 (output_bfd
, outrel
.r_addend
,
7180 globals
->sgot
->contents
+ cur_off
);
7182 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
7183 globals
->srelgot
->reloc_count
++;
7184 loc
+= RELOC_SIZE (globals
);
7187 bfd_put_32 (output_bfd
, value
- dtpoff_base (info
),
7188 globals
->sgot
->contents
+ cur_off
+ 4);
7191 outrel
.r_addend
= 0;
7192 outrel
.r_info
= ELF32_R_INFO (indx
,
7193 R_ARM_TLS_DTPOFF32
);
7194 outrel
.r_offset
+= 4;
7196 if (globals
->use_rel
)
7197 bfd_put_32 (output_bfd
, outrel
.r_addend
,
7198 globals
->sgot
->contents
+ cur_off
+ 4);
7201 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
7202 globals
->srelgot
->reloc_count
++;
7203 loc
+= RELOC_SIZE (globals
);
7208 /* If we are not emitting relocations for a
7209 general dynamic reference, then we must be in a
7210 static link or an executable link with the
7211 symbol binding locally. Mark it as belonging
7212 to module 1, the executable. */
7213 bfd_put_32 (output_bfd
, 1,
7214 globals
->sgot
->contents
+ cur_off
);
7215 bfd_put_32 (output_bfd
, value
- dtpoff_base (info
),
7216 globals
->sgot
->contents
+ cur_off
+ 4);
7222 if (tls_type
& GOT_TLS_IE
)
7227 outrel
.r_addend
= value
- dtpoff_base (info
);
7229 outrel
.r_addend
= 0;
7230 outrel
.r_offset
= (globals
->sgot
->output_section
->vma
7231 + globals
->sgot
->output_offset
7233 outrel
.r_info
= ELF32_R_INFO (indx
, R_ARM_TLS_TPOFF32
);
7235 if (globals
->use_rel
)
7236 bfd_put_32 (output_bfd
, outrel
.r_addend
,
7237 globals
->sgot
->contents
+ cur_off
);
7239 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
7240 globals
->srelgot
->reloc_count
++;
7241 loc
+= RELOC_SIZE (globals
);
7244 bfd_put_32 (output_bfd
, tpoff (info
, value
),
7245 globals
->sgot
->contents
+ cur_off
);
7252 local_got_offsets
[r_symndx
] |= 1;
7255 if ((tls_type
& GOT_TLS_GD
) && r_type
!= R_ARM_TLS_GD32
)
7257 value
= globals
->sgot
->output_section
->vma
+ globals
->sgot
->output_offset
+ off
7258 - (input_section
->output_section
->vma
+ input_section
->output_offset
+ rel
->r_offset
);
7260 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
7261 contents
, rel
->r_offset
, value
,
7265 case R_ARM_TLS_LE32
:
7268 (*_bfd_error_handler
)
7269 (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
7270 input_bfd
, input_section
,
7271 (long) rel
->r_offset
, howto
->name
);
7275 value
= tpoff (info
, value
);
7277 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
7278 contents
, rel
->r_offset
, value
,
7282 if (globals
->fix_v4bx
)
7284 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
7286 /* Ensure that we have a BX instruction. */
7287 BFD_ASSERT ((insn
& 0x0ffffff0) == 0x012fff10);
7289 if (globals
->fix_v4bx
== 2 && (insn
& 0xf) != 0xf)
7291 /* Branch to veneer. */
7293 glue_addr
= elf32_arm_bx_glue (info
, insn
& 0xf);
7294 glue_addr
-= input_section
->output_section
->vma
7295 + input_section
->output_offset
7296 + rel
->r_offset
+ 8;
7297 insn
= (insn
& 0xf0000000) | 0x0a000000
7298 | ((glue_addr
>> 2) & 0x00ffffff);
7302 /* Preserve Rm (lowest four bits) and the condition code
7303 (highest four bits). Other bits encode MOV PC,Rm. */
7304 insn
= (insn
& 0xf000000f) | 0x01a0f000;
7307 bfd_put_32 (input_bfd
, insn
, hit_data
);
7309 return bfd_reloc_ok
;
7311 case R_ARM_MOVW_ABS_NC
:
7312 case R_ARM_MOVT_ABS
:
7313 case R_ARM_MOVW_PREL_NC
:
7314 case R_ARM_MOVT_PREL
:
7315 /* Until we properly support segment-base-relative addressing then
7316 we assume the segment base to be zero, as for the group relocations.
7317 Thus R_ARM_MOVW_BREL_NC has the same semantics as R_ARM_MOVW_ABS_NC
7318 and R_ARM_MOVT_BREL has the same semantics as R_ARM_MOVT_ABS. */
7319 case R_ARM_MOVW_BREL_NC
:
7320 case R_ARM_MOVW_BREL
:
7321 case R_ARM_MOVT_BREL
:
7323 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
7325 if (globals
->use_rel
)
7327 addend
= ((insn
>> 4) & 0xf000) | (insn
& 0xfff);
7328 signed_addend
= (addend
^ 0x8000) - 0x8000;
7331 value
+= signed_addend
;
7333 if (r_type
== R_ARM_MOVW_PREL_NC
|| r_type
== R_ARM_MOVT_PREL
)
7334 value
-= (input_section
->output_section
->vma
7335 + input_section
->output_offset
+ rel
->r_offset
);
7337 if (r_type
== R_ARM_MOVW_BREL
&& value
>= 0x10000)
7338 return bfd_reloc_overflow
;
7340 if (sym_flags
== STT_ARM_TFUNC
)
7343 if (r_type
== R_ARM_MOVT_ABS
|| r_type
== R_ARM_MOVT_PREL
7344 || r_type
== R_ARM_MOVT_BREL
)
7348 insn
|= value
& 0xfff;
7349 insn
|= (value
& 0xf000) << 4;
7350 bfd_put_32 (input_bfd
, insn
, hit_data
);
7352 return bfd_reloc_ok
;
7354 case R_ARM_THM_MOVW_ABS_NC
:
7355 case R_ARM_THM_MOVT_ABS
:
7356 case R_ARM_THM_MOVW_PREL_NC
:
7357 case R_ARM_THM_MOVT_PREL
:
7358 /* Until we properly support segment-base-relative addressing then
7359 we assume the segment base to be zero, as for the above relocations.
7360 Thus R_ARM_THM_MOVW_BREL_NC has the same semantics as
7361 R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_BREL has the same semantics
7362 as R_ARM_THM_MOVT_ABS. */
7363 case R_ARM_THM_MOVW_BREL_NC
:
7364 case R_ARM_THM_MOVW_BREL
:
7365 case R_ARM_THM_MOVT_BREL
:
7369 insn
= bfd_get_16 (input_bfd
, hit_data
) << 16;
7370 insn
|= bfd_get_16 (input_bfd
, hit_data
+ 2);
7372 if (globals
->use_rel
)
7374 addend
= ((insn
>> 4) & 0xf000)
7375 | ((insn
>> 15) & 0x0800)
7376 | ((insn
>> 4) & 0x0700)
7378 signed_addend
= (addend
^ 0x8000) - 0x8000;
7381 value
+= signed_addend
;
7383 if (r_type
== R_ARM_THM_MOVW_PREL_NC
|| r_type
== R_ARM_THM_MOVT_PREL
)
7384 value
-= (input_section
->output_section
->vma
7385 + input_section
->output_offset
+ rel
->r_offset
);
7387 if (r_type
== R_ARM_THM_MOVW_BREL
&& value
>= 0x10000)
7388 return bfd_reloc_overflow
;
7390 if (sym_flags
== STT_ARM_TFUNC
)
7393 if (r_type
== R_ARM_THM_MOVT_ABS
|| r_type
== R_ARM_THM_MOVT_PREL
7394 || r_type
== R_ARM_THM_MOVT_BREL
)
7398 insn
|= (value
& 0xf000) << 4;
7399 insn
|= (value
& 0x0800) << 15;
7400 insn
|= (value
& 0x0700) << 4;
7401 insn
|= (value
& 0x00ff);
7403 bfd_put_16 (input_bfd
, insn
>> 16, hit_data
);
7404 bfd_put_16 (input_bfd
, insn
& 0xffff, hit_data
+ 2);
7406 return bfd_reloc_ok
;
7408 case R_ARM_ALU_PC_G0_NC
:
7409 case R_ARM_ALU_PC_G1_NC
:
7410 case R_ARM_ALU_PC_G0
:
7411 case R_ARM_ALU_PC_G1
:
7412 case R_ARM_ALU_PC_G2
:
7413 case R_ARM_ALU_SB_G0_NC
:
7414 case R_ARM_ALU_SB_G1_NC
:
7415 case R_ARM_ALU_SB_G0
:
7416 case R_ARM_ALU_SB_G1
:
7417 case R_ARM_ALU_SB_G2
:
7419 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
7420 bfd_vma pc
= input_section
->output_section
->vma
7421 + input_section
->output_offset
+ rel
->r_offset
;
7422 /* sb should be the origin of the *segment* containing the symbol.
7423 It is not clear how to obtain this OS-dependent value, so we
7424 make an arbitrary choice of zero. */
7428 bfd_signed_vma signed_value
;
7431 /* Determine which group of bits to select. */
7434 case R_ARM_ALU_PC_G0_NC
:
7435 case R_ARM_ALU_PC_G0
:
7436 case R_ARM_ALU_SB_G0_NC
:
7437 case R_ARM_ALU_SB_G0
:
7441 case R_ARM_ALU_PC_G1_NC
:
7442 case R_ARM_ALU_PC_G1
:
7443 case R_ARM_ALU_SB_G1_NC
:
7444 case R_ARM_ALU_SB_G1
:
7448 case R_ARM_ALU_PC_G2
:
7449 case R_ARM_ALU_SB_G2
:
7457 /* If REL, extract the addend from the insn. If RELA, it will
7458 have already been fetched for us. */
7459 if (globals
->use_rel
)
7462 bfd_vma constant
= insn
& 0xff;
7463 bfd_vma rotation
= (insn
& 0xf00) >> 8;
7466 signed_addend
= constant
;
7469 /* Compensate for the fact that in the instruction, the
7470 rotation is stored in multiples of 2 bits. */
7473 /* Rotate "constant" right by "rotation" bits. */
7474 signed_addend
= (constant
>> rotation
) |
7475 (constant
<< (8 * sizeof (bfd_vma
) - rotation
));
7478 /* Determine if the instruction is an ADD or a SUB.
7479 (For REL, this determines the sign of the addend.) */
7480 negative
= identify_add_or_sub (insn
);
7483 (*_bfd_error_handler
)
7484 (_("%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group relocations"),
7485 input_bfd
, input_section
,
7486 (long) rel
->r_offset
, howto
->name
);
7487 return bfd_reloc_overflow
;
7490 signed_addend
*= negative
;
7493 /* Compute the value (X) to go in the place. */
7494 if (r_type
== R_ARM_ALU_PC_G0_NC
7495 || r_type
== R_ARM_ALU_PC_G1_NC
7496 || r_type
== R_ARM_ALU_PC_G0
7497 || r_type
== R_ARM_ALU_PC_G1
7498 || r_type
== R_ARM_ALU_PC_G2
)
7500 signed_value
= value
- pc
+ signed_addend
;
7502 /* Section base relative. */
7503 signed_value
= value
- sb
+ signed_addend
;
7505 /* If the target symbol is a Thumb function, then set the
7506 Thumb bit in the address. */
7507 if (sym_flags
== STT_ARM_TFUNC
)
7510 /* Calculate the value of the relevant G_n, in encoded
7511 constant-with-rotation format. */
7512 g_n
= calculate_group_reloc_mask (abs (signed_value
), group
,
7515 /* Check for overflow if required. */
7516 if ((r_type
== R_ARM_ALU_PC_G0
7517 || r_type
== R_ARM_ALU_PC_G1
7518 || r_type
== R_ARM_ALU_PC_G2
7519 || r_type
== R_ARM_ALU_SB_G0
7520 || r_type
== R_ARM_ALU_SB_G1
7521 || r_type
== R_ARM_ALU_SB_G2
) && residual
!= 0)
7523 (*_bfd_error_handler
)
7524 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7525 input_bfd
, input_section
,
7526 (long) rel
->r_offset
, abs (signed_value
), howto
->name
);
7527 return bfd_reloc_overflow
;
7530 /* Mask out the value and the ADD/SUB part of the opcode; take care
7531 not to destroy the S bit. */
7534 /* Set the opcode according to whether the value to go in the
7535 place is negative. */
7536 if (signed_value
< 0)
7541 /* Encode the offset. */
7544 bfd_put_32 (input_bfd
, insn
, hit_data
);
7546 return bfd_reloc_ok
;
7548 case R_ARM_LDR_PC_G0
:
7549 case R_ARM_LDR_PC_G1
:
7550 case R_ARM_LDR_PC_G2
:
7551 case R_ARM_LDR_SB_G0
:
7552 case R_ARM_LDR_SB_G1
:
7553 case R_ARM_LDR_SB_G2
:
7555 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
7556 bfd_vma pc
= input_section
->output_section
->vma
7557 + input_section
->output_offset
+ rel
->r_offset
;
7558 bfd_vma sb
= 0; /* See note above. */
7560 bfd_signed_vma signed_value
;
7563 /* Determine which groups of bits to calculate. */
7566 case R_ARM_LDR_PC_G0
:
7567 case R_ARM_LDR_SB_G0
:
7571 case R_ARM_LDR_PC_G1
:
7572 case R_ARM_LDR_SB_G1
:
7576 case R_ARM_LDR_PC_G2
:
7577 case R_ARM_LDR_SB_G2
:
7585 /* If REL, extract the addend from the insn. If RELA, it will
7586 have already been fetched for us. */
7587 if (globals
->use_rel
)
7589 int negative
= (insn
& (1 << 23)) ? 1 : -1;
7590 signed_addend
= negative
* (insn
& 0xfff);
7593 /* Compute the value (X) to go in the place. */
7594 if (r_type
== R_ARM_LDR_PC_G0
7595 || r_type
== R_ARM_LDR_PC_G1
7596 || r_type
== R_ARM_LDR_PC_G2
)
7598 signed_value
= value
- pc
+ signed_addend
;
7600 /* Section base relative. */
7601 signed_value
= value
- sb
+ signed_addend
;
7603 /* Calculate the value of the relevant G_{n-1} to obtain
7604 the residual at that stage. */
7605 calculate_group_reloc_mask (abs (signed_value
), group
- 1, &residual
);
7607 /* Check for overflow. */
7608 if (residual
>= 0x1000)
7610 (*_bfd_error_handler
)
7611 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7612 input_bfd
, input_section
,
7613 (long) rel
->r_offset
, abs (signed_value
), howto
->name
);
7614 return bfd_reloc_overflow
;
7617 /* Mask out the value and U bit. */
7620 /* Set the U bit if the value to go in the place is non-negative. */
7621 if (signed_value
>= 0)
7624 /* Encode the offset. */
7627 bfd_put_32 (input_bfd
, insn
, hit_data
);
7629 return bfd_reloc_ok
;
7631 case R_ARM_LDRS_PC_G0
:
7632 case R_ARM_LDRS_PC_G1
:
7633 case R_ARM_LDRS_PC_G2
:
7634 case R_ARM_LDRS_SB_G0
:
7635 case R_ARM_LDRS_SB_G1
:
7636 case R_ARM_LDRS_SB_G2
:
7638 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
7639 bfd_vma pc
= input_section
->output_section
->vma
7640 + input_section
->output_offset
+ rel
->r_offset
;
7641 bfd_vma sb
= 0; /* See note above. */
7643 bfd_signed_vma signed_value
;
7646 /* Determine which groups of bits to calculate. */
7649 case R_ARM_LDRS_PC_G0
:
7650 case R_ARM_LDRS_SB_G0
:
7654 case R_ARM_LDRS_PC_G1
:
7655 case R_ARM_LDRS_SB_G1
:
7659 case R_ARM_LDRS_PC_G2
:
7660 case R_ARM_LDRS_SB_G2
:
7668 /* If REL, extract the addend from the insn. If RELA, it will
7669 have already been fetched for us. */
7670 if (globals
->use_rel
)
7672 int negative
= (insn
& (1 << 23)) ? 1 : -1;
7673 signed_addend
= negative
* (((insn
& 0xf00) >> 4) + (insn
& 0xf));
7676 /* Compute the value (X) to go in the place. */
7677 if (r_type
== R_ARM_LDRS_PC_G0
7678 || r_type
== R_ARM_LDRS_PC_G1
7679 || r_type
== R_ARM_LDRS_PC_G2
)
7681 signed_value
= value
- pc
+ signed_addend
;
7683 /* Section base relative. */
7684 signed_value
= value
- sb
+ signed_addend
;
7686 /* Calculate the value of the relevant G_{n-1} to obtain
7687 the residual at that stage. */
7688 calculate_group_reloc_mask (abs (signed_value
), group
- 1, &residual
);
7690 /* Check for overflow. */
7691 if (residual
>= 0x100)
7693 (*_bfd_error_handler
)
7694 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7695 input_bfd
, input_section
,
7696 (long) rel
->r_offset
, abs (signed_value
), howto
->name
);
7697 return bfd_reloc_overflow
;
7700 /* Mask out the value and U bit. */
7703 /* Set the U bit if the value to go in the place is non-negative. */
7704 if (signed_value
>= 0)
7707 /* Encode the offset. */
7708 insn
|= ((residual
& 0xf0) << 4) | (residual
& 0xf);
7710 bfd_put_32 (input_bfd
, insn
, hit_data
);
7712 return bfd_reloc_ok
;
7714 case R_ARM_LDC_PC_G0
:
7715 case R_ARM_LDC_PC_G1
:
7716 case R_ARM_LDC_PC_G2
:
7717 case R_ARM_LDC_SB_G0
:
7718 case R_ARM_LDC_SB_G1
:
7719 case R_ARM_LDC_SB_G2
:
7721 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
7722 bfd_vma pc
= input_section
->output_section
->vma
7723 + input_section
->output_offset
+ rel
->r_offset
;
7724 bfd_vma sb
= 0; /* See note above. */
7726 bfd_signed_vma signed_value
;
7729 /* Determine which groups of bits to calculate. */
7732 case R_ARM_LDC_PC_G0
:
7733 case R_ARM_LDC_SB_G0
:
7737 case R_ARM_LDC_PC_G1
:
7738 case R_ARM_LDC_SB_G1
:
7742 case R_ARM_LDC_PC_G2
:
7743 case R_ARM_LDC_SB_G2
:
7751 /* If REL, extract the addend from the insn. If RELA, it will
7752 have already been fetched for us. */
7753 if (globals
->use_rel
)
7755 int negative
= (insn
& (1 << 23)) ? 1 : -1;
7756 signed_addend
= negative
* ((insn
& 0xff) << 2);
7759 /* Compute the value (X) to go in the place. */
7760 if (r_type
== R_ARM_LDC_PC_G0
7761 || r_type
== R_ARM_LDC_PC_G1
7762 || r_type
== R_ARM_LDC_PC_G2
)
7764 signed_value
= value
- pc
+ signed_addend
;
7766 /* Section base relative. */
7767 signed_value
= value
- sb
+ signed_addend
;
7769 /* Calculate the value of the relevant G_{n-1} to obtain
7770 the residual at that stage. */
7771 calculate_group_reloc_mask (abs (signed_value
), group
- 1, &residual
);
7773 /* Check for overflow. (The absolute value to go in the place must be
7774 divisible by four and, after having been divided by four, must
7775 fit in eight bits.) */
7776 if ((residual
& 0x3) != 0 || residual
>= 0x400)
7778 (*_bfd_error_handler
)
7779 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7780 input_bfd
, input_section
,
7781 (long) rel
->r_offset
, abs (signed_value
), howto
->name
);
7782 return bfd_reloc_overflow
;
7785 /* Mask out the value and U bit. */
7788 /* Set the U bit if the value to go in the place is non-negative. */
7789 if (signed_value
>= 0)
7792 /* Encode the offset. */
7793 insn
|= residual
>> 2;
7795 bfd_put_32 (input_bfd
, insn
, hit_data
);
7797 return bfd_reloc_ok
;
7800 return bfd_reloc_notsupported
;
7804 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS. */
7806 arm_add_to_rel (bfd
* abfd
,
7808 reloc_howto_type
* howto
,
7809 bfd_signed_vma increment
)
7811 bfd_signed_vma addend
;
7813 if (howto
->type
== R_ARM_THM_CALL
7814 || howto
->type
== R_ARM_THM_JUMP24
)
7816 int upper_insn
, lower_insn
;
7819 upper_insn
= bfd_get_16 (abfd
, address
);
7820 lower_insn
= bfd_get_16 (abfd
, address
+ 2);
7821 upper
= upper_insn
& 0x7ff;
7822 lower
= lower_insn
& 0x7ff;
7824 addend
= (upper
<< 12) | (lower
<< 1);
7825 addend
+= increment
;
7828 upper_insn
= (upper_insn
& 0xf800) | ((addend
>> 11) & 0x7ff);
7829 lower_insn
= (lower_insn
& 0xf800) | (addend
& 0x7ff);
7831 bfd_put_16 (abfd
, (bfd_vma
) upper_insn
, address
);
7832 bfd_put_16 (abfd
, (bfd_vma
) lower_insn
, address
+ 2);
7838 contents
= bfd_get_32 (abfd
, address
);
7840 /* Get the (signed) value from the instruction. */
7841 addend
= contents
& howto
->src_mask
;
7842 if (addend
& ((howto
->src_mask
+ 1) >> 1))
7844 bfd_signed_vma mask
;
7847 mask
&= ~ howto
->src_mask
;
7851 /* Add in the increment, (which is a byte value). */
7852 switch (howto
->type
)
7855 addend
+= increment
;
7862 addend
<<= howto
->size
;
7863 addend
+= increment
;
7865 /* Should we check for overflow here ? */
7867 /* Drop any undesired bits. */
7868 addend
>>= howto
->rightshift
;
7872 contents
= (contents
& ~ howto
->dst_mask
) | (addend
& howto
->dst_mask
);
7874 bfd_put_32 (abfd
, contents
, address
);
7878 #define IS_ARM_TLS_RELOC(R_TYPE) \
7879 ((R_TYPE) == R_ARM_TLS_GD32 \
7880 || (R_TYPE) == R_ARM_TLS_LDO32 \
7881 || (R_TYPE) == R_ARM_TLS_LDM32 \
7882 || (R_TYPE) == R_ARM_TLS_DTPOFF32 \
7883 || (R_TYPE) == R_ARM_TLS_DTPMOD32 \
7884 || (R_TYPE) == R_ARM_TLS_TPOFF32 \
7885 || (R_TYPE) == R_ARM_TLS_LE32 \
7886 || (R_TYPE) == R_ARM_TLS_IE32)
7888 /* Relocate an ARM ELF section. */
7891 elf32_arm_relocate_section (bfd
* output_bfd
,
7892 struct bfd_link_info
* info
,
7894 asection
* input_section
,
7895 bfd_byte
* contents
,
7896 Elf_Internal_Rela
* relocs
,
7897 Elf_Internal_Sym
* local_syms
,
7898 asection
** local_sections
)
7900 Elf_Internal_Shdr
*symtab_hdr
;
7901 struct elf_link_hash_entry
**sym_hashes
;
7902 Elf_Internal_Rela
*rel
;
7903 Elf_Internal_Rela
*relend
;
7905 struct elf32_arm_link_hash_table
* globals
;
7907 globals
= elf32_arm_hash_table (info
);
7909 symtab_hdr
= & elf_symtab_hdr (input_bfd
);
7910 sym_hashes
= elf_sym_hashes (input_bfd
);
7913 relend
= relocs
+ input_section
->reloc_count
;
7914 for (; rel
< relend
; rel
++)
7917 reloc_howto_type
* howto
;
7918 unsigned long r_symndx
;
7919 Elf_Internal_Sym
* sym
;
7921 struct elf_link_hash_entry
* h
;
7923 bfd_reloc_status_type r
;
7926 bfd_boolean unresolved_reloc
= FALSE
;
7927 char *error_message
= NULL
;
7929 r_symndx
= ELF32_R_SYM (rel
->r_info
);
7930 r_type
= ELF32_R_TYPE (rel
->r_info
);
7931 r_type
= arm_real_reloc_type (globals
, r_type
);
7933 if ( r_type
== R_ARM_GNU_VTENTRY
7934 || r_type
== R_ARM_GNU_VTINHERIT
)
7937 bfd_reloc
.howto
= elf32_arm_howto_from_type (r_type
);
7938 howto
= bfd_reloc
.howto
;
7944 if (r_symndx
< symtab_hdr
->sh_info
)
7946 sym
= local_syms
+ r_symndx
;
7947 sym_type
= ELF32_ST_TYPE (sym
->st_info
);
7948 sec
= local_sections
[r_symndx
];
7949 if (globals
->use_rel
)
7951 relocation
= (sec
->output_section
->vma
7952 + sec
->output_offset
7954 if (!info
->relocatable
7955 && (sec
->flags
& SEC_MERGE
)
7956 && ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
7959 bfd_vma addend
, value
;
7963 case R_ARM_MOVW_ABS_NC
:
7964 case R_ARM_MOVT_ABS
:
7965 value
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
7966 addend
= ((value
& 0xf0000) >> 4) | (value
& 0xfff);
7967 addend
= (addend
^ 0x8000) - 0x8000;
7970 case R_ARM_THM_MOVW_ABS_NC
:
7971 case R_ARM_THM_MOVT_ABS
:
7972 value
= bfd_get_16 (input_bfd
, contents
+ rel
->r_offset
)
7974 value
|= bfd_get_16 (input_bfd
,
7975 contents
+ rel
->r_offset
+ 2);
7976 addend
= ((value
& 0xf7000) >> 4) | (value
& 0xff)
7977 | ((value
& 0x04000000) >> 15);
7978 addend
= (addend
^ 0x8000) - 0x8000;
7982 if (howto
->rightshift
7983 || (howto
->src_mask
& (howto
->src_mask
+ 1)))
7985 (*_bfd_error_handler
)
7986 (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
7987 input_bfd
, input_section
,
7988 (long) rel
->r_offset
, howto
->name
);
7992 value
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
7994 /* Get the (signed) value from the instruction. */
7995 addend
= value
& howto
->src_mask
;
7996 if (addend
& ((howto
->src_mask
+ 1) >> 1))
7998 bfd_signed_vma mask
;
8001 mask
&= ~ howto
->src_mask
;
8009 _bfd_elf_rel_local_sym (output_bfd
, sym
, &msec
, addend
)
8011 addend
+= msec
->output_section
->vma
+ msec
->output_offset
;
8013 /* Cases here must match those in the preceeding
8014 switch statement. */
8017 case R_ARM_MOVW_ABS_NC
:
8018 case R_ARM_MOVT_ABS
:
8019 value
= (value
& 0xfff0f000) | ((addend
& 0xf000) << 4)
8021 bfd_put_32 (input_bfd
, value
, contents
+ rel
->r_offset
);
8024 case R_ARM_THM_MOVW_ABS_NC
:
8025 case R_ARM_THM_MOVT_ABS
:
8026 value
= (value
& 0xfbf08f00) | ((addend
& 0xf700) << 4)
8027 | (addend
& 0xff) | ((addend
& 0x0800) << 15);
8028 bfd_put_16 (input_bfd
, value
>> 16,
8029 contents
+ rel
->r_offset
);
8030 bfd_put_16 (input_bfd
, value
,
8031 contents
+ rel
->r_offset
+ 2);
8035 value
= (value
& ~ howto
->dst_mask
)
8036 | (addend
& howto
->dst_mask
);
8037 bfd_put_32 (input_bfd
, value
, contents
+ rel
->r_offset
);
8043 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
8049 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
8050 r_symndx
, symtab_hdr
, sym_hashes
,
8052 unresolved_reloc
, warned
);
8057 if (sec
!= NULL
&& elf_discarded_section (sec
))
8059 /* For relocs against symbols from removed linkonce sections,
8060 or sections discarded by a linker script, we just want the
8061 section contents zeroed. Avoid any special processing. */
8062 _bfd_clear_contents (howto
, input_bfd
, contents
+ rel
->r_offset
);
8068 if (info
->relocatable
)
8070 /* This is a relocatable link. We don't have to change
8071 anything, unless the reloc is against a section symbol,
8072 in which case we have to adjust according to where the
8073 section symbol winds up in the output section. */
8074 if (sym
!= NULL
&& ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
8076 if (globals
->use_rel
)
8077 arm_add_to_rel (input_bfd
, contents
+ rel
->r_offset
,
8078 howto
, (bfd_signed_vma
) sec
->output_offset
);
8080 rel
->r_addend
+= sec
->output_offset
;
8086 name
= h
->root
.root
.string
;
8089 name
= (bfd_elf_string_from_elf_section
8090 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
8091 if (name
== NULL
|| *name
== '\0')
8092 name
= bfd_section_name (input_bfd
, sec
);
8096 && r_type
!= R_ARM_NONE
8098 || h
->root
.type
== bfd_link_hash_defined
8099 || h
->root
.type
== bfd_link_hash_defweak
)
8100 && IS_ARM_TLS_RELOC (r_type
) != (sym_type
== STT_TLS
))
8102 (*_bfd_error_handler
)
8103 ((sym_type
== STT_TLS
8104 ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
8105 : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
8108 (long) rel
->r_offset
,
8113 r
= elf32_arm_final_link_relocate (howto
, input_bfd
, output_bfd
,
8114 input_section
, contents
, rel
,
8115 relocation
, info
, sec
, name
,
8116 (h
? ELF_ST_TYPE (h
->type
) :
8117 ELF_ST_TYPE (sym
->st_info
)), h
,
8118 &unresolved_reloc
, &error_message
);
8120 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
8121 because such sections are not SEC_ALLOC and thus ld.so will
8122 not process them. */
8123 if (unresolved_reloc
8124 && !((input_section
->flags
& SEC_DEBUGGING
) != 0
8127 (*_bfd_error_handler
)
8128 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
8131 (long) rel
->r_offset
,
8133 h
->root
.root
.string
);
8137 if (r
!= bfd_reloc_ok
)
8141 case bfd_reloc_overflow
:
8142 /* If the overflowing reloc was to an undefined symbol,
8143 we have already printed one error message and there
8144 is no point complaining again. */
8146 h
->root
.type
!= bfd_link_hash_undefined
)
8147 && (!((*info
->callbacks
->reloc_overflow
)
8148 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
8149 (bfd_vma
) 0, input_bfd
, input_section
,
8154 case bfd_reloc_undefined
:
8155 if (!((*info
->callbacks
->undefined_symbol
)
8156 (info
, name
, input_bfd
, input_section
,
8157 rel
->r_offset
, TRUE
)))
8161 case bfd_reloc_outofrange
:
8162 error_message
= _("out of range");
8165 case bfd_reloc_notsupported
:
8166 error_message
= _("unsupported relocation");
8169 case bfd_reloc_dangerous
:
8170 /* error_message should already be set. */
8174 error_message
= _("unknown error");
8178 BFD_ASSERT (error_message
!= NULL
);
8179 if (!((*info
->callbacks
->reloc_dangerous
)
8180 (info
, error_message
, input_bfd
, input_section
,
8191 /* Add a new unwind edit to the list described by HEAD, TAIL. If INDEX is zero,
8192 adds the edit to the start of the list. (The list must be built in order of
8193 ascending INDEX: the function's callers are primarily responsible for
8194 maintaining that condition). */
8197 add_unwind_table_edit (arm_unwind_table_edit
**head
,
8198 arm_unwind_table_edit
**tail
,
8199 arm_unwind_edit_type type
,
8200 asection
*linked_section
,
8203 arm_unwind_table_edit
*new_edit
= xmalloc (sizeof (arm_unwind_table_edit
));
8205 new_edit
->type
= type
;
8206 new_edit
->linked_section
= linked_section
;
8207 new_edit
->index
= index
;
8211 new_edit
->next
= NULL
;
8214 (*tail
)->next
= new_edit
;
8223 new_edit
->next
= *head
;
8232 static _arm_elf_section_data
*get_arm_elf_section_data (asection
*);
8234 /* Increase the size of EXIDX_SEC by ADJUST bytes. ADJUST mau be negative. */
8236 adjust_exidx_size(asection
*exidx_sec
, int adjust
)
8240 if (!exidx_sec
->rawsize
)
8241 exidx_sec
->rawsize
= exidx_sec
->size
;
8243 bfd_set_section_size (exidx_sec
->owner
, exidx_sec
, exidx_sec
->size
+ adjust
);
8244 out_sec
= exidx_sec
->output_section
;
8245 /* Adjust size of output section. */
8246 bfd_set_section_size (out_sec
->owner
, out_sec
, out_sec
->size
+adjust
);
8249 /* Insert an EXIDX_CANTUNWIND marker at the end of a section. */
8251 insert_cantunwind_after(asection
*text_sec
, asection
*exidx_sec
)
8253 struct _arm_elf_section_data
*exidx_arm_data
;
8255 exidx_arm_data
= get_arm_elf_section_data (exidx_sec
);
8256 add_unwind_table_edit (
8257 &exidx_arm_data
->u
.exidx
.unwind_edit_list
,
8258 &exidx_arm_data
->u
.exidx
.unwind_edit_tail
,
8259 INSERT_EXIDX_CANTUNWIND_AT_END
, text_sec
, UINT_MAX
);
8261 adjust_exidx_size(exidx_sec
, 8);
8264 /* Scan .ARM.exidx tables, and create a list describing edits which should be
8265 made to those tables, such that:
8267 1. Regions without unwind data are marked with EXIDX_CANTUNWIND entries.
8268 2. Duplicate entries are merged together (EXIDX_CANTUNWIND, or unwind
8269 codes which have been inlined into the index).
8271 The edits are applied when the tables are written
8272 (in elf32_arm_write_section).
8276 elf32_arm_fix_exidx_coverage (asection
**text_section_order
,
8277 unsigned int num_text_sections
,
8278 struct bfd_link_info
*info
)
8281 unsigned int last_second_word
= 0, i
;
8282 asection
*last_exidx_sec
= NULL
;
8283 asection
*last_text_sec
= NULL
;
8284 int last_unwind_type
= -1;
8286 /* Walk over all EXIDX sections, and create backlinks from the corrsponding
8288 for (inp
= info
->input_bfds
; inp
!= NULL
; inp
= inp
->link_next
)
8292 for (sec
= inp
->sections
; sec
!= NULL
; sec
= sec
->next
)
8294 struct bfd_elf_section_data
*elf_sec
= elf_section_data (sec
);
8295 Elf_Internal_Shdr
*hdr
= &elf_sec
->this_hdr
;
8297 if (hdr
->sh_type
!= SHT_ARM_EXIDX
)
8300 if (elf_sec
->linked_to
)
8302 Elf_Internal_Shdr
*linked_hdr
8303 = &elf_section_data (elf_sec
->linked_to
)->this_hdr
;
8304 struct _arm_elf_section_data
*linked_sec_arm_data
8305 = get_arm_elf_section_data (linked_hdr
->bfd_section
);
8307 if (linked_sec_arm_data
== NULL
)
8310 /* Link this .ARM.exidx section back from the text section it
8312 linked_sec_arm_data
->u
.text
.arm_exidx_sec
= sec
;
8317 /* Walk all text sections in order of increasing VMA. Eilminate duplicate
8318 index table entries (EXIDX_CANTUNWIND and inlined unwind opcodes),
8319 and add EXIDX_CANTUNWIND entries for sections with no unwind table data.
8322 for (i
= 0; i
< num_text_sections
; i
++)
8324 asection
*sec
= text_section_order
[i
];
8325 asection
*exidx_sec
;
8326 struct _arm_elf_section_data
*arm_data
= get_arm_elf_section_data (sec
);
8327 struct _arm_elf_section_data
*exidx_arm_data
;
8328 bfd_byte
*contents
= NULL
;
8329 int deleted_exidx_bytes
= 0;
8331 arm_unwind_table_edit
*unwind_edit_head
= NULL
;
8332 arm_unwind_table_edit
*unwind_edit_tail
= NULL
;
8333 Elf_Internal_Shdr
*hdr
;
8336 if (arm_data
== NULL
)
8339 exidx_sec
= arm_data
->u
.text
.arm_exidx_sec
;
8340 if (exidx_sec
== NULL
)
8342 /* Section has no unwind data. */
8343 if (last_unwind_type
== 0 || !last_exidx_sec
)
8346 /* Ignore zero sized sections. */
8350 insert_cantunwind_after(last_text_sec
, last_exidx_sec
);
8351 last_unwind_type
= 0;
8355 /* Skip /DISCARD/ sections. */
8356 if (bfd_is_abs_section (exidx_sec
->output_section
))
8359 hdr
= &elf_section_data (exidx_sec
)->this_hdr
;
8360 if (hdr
->sh_type
!= SHT_ARM_EXIDX
)
8363 exidx_arm_data
= get_arm_elf_section_data (exidx_sec
);
8364 if (exidx_arm_data
== NULL
)
8367 ibfd
= exidx_sec
->owner
;
8369 if (hdr
->contents
!= NULL
)
8370 contents
= hdr
->contents
;
8371 else if (! bfd_malloc_and_get_section (ibfd
, exidx_sec
, &contents
))
8375 for (j
= 0; j
< hdr
->sh_size
; j
+= 8)
8377 unsigned int second_word
= bfd_get_32 (ibfd
, contents
+ j
+ 4);
8381 /* An EXIDX_CANTUNWIND entry. */
8382 if (second_word
== 1)
8384 if (last_unwind_type
== 0)
8388 /* Inlined unwinding data. Merge if equal to previous. */
8389 else if ((second_word
& 0x80000000) != 0)
8391 if (last_second_word
== second_word
&& last_unwind_type
== 1)
8394 last_second_word
= second_word
;
8396 /* Normal table entry. In theory we could merge these too,
8397 but duplicate entries are likely to be much less common. */
8403 add_unwind_table_edit (&unwind_edit_head
, &unwind_edit_tail
,
8404 DELETE_EXIDX_ENTRY
, NULL
, j
/ 8);
8406 deleted_exidx_bytes
+= 8;
8409 last_unwind_type
= unwind_type
;
8412 /* Free contents if we allocated it ourselves. */
8413 if (contents
!= hdr
->contents
)
8416 /* Record edits to be applied later (in elf32_arm_write_section). */
8417 exidx_arm_data
->u
.exidx
.unwind_edit_list
= unwind_edit_head
;
8418 exidx_arm_data
->u
.exidx
.unwind_edit_tail
= unwind_edit_tail
;
8420 if (deleted_exidx_bytes
> 0)
8421 adjust_exidx_size(exidx_sec
, -deleted_exidx_bytes
);
8423 last_exidx_sec
= exidx_sec
;
8424 last_text_sec
= sec
;
8427 /* Add terminating CANTUNWIND entry. */
8428 if (last_exidx_sec
&& last_unwind_type
!= 0)
8429 insert_cantunwind_after(last_text_sec
, last_exidx_sec
);
8435 elf32_arm_output_glue_section (struct bfd_link_info
*info
, bfd
*obfd
,
8436 bfd
*ibfd
, const char *name
)
8438 asection
*sec
, *osec
;
8440 sec
= bfd_get_section_by_name (ibfd
, name
);
8441 if (sec
== NULL
|| (sec
->flags
& SEC_EXCLUDE
) != 0)
8444 osec
= sec
->output_section
;
8445 if (elf32_arm_write_section (obfd
, info
, sec
, sec
->contents
))
8448 if (! bfd_set_section_contents (obfd
, osec
, sec
->contents
,
8449 sec
->output_offset
, sec
->size
))
8456 elf32_arm_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
8458 struct elf32_arm_link_hash_table
*globals
= elf32_arm_hash_table (info
);
8460 /* Invoke the regular ELF backend linker to do all the work. */
8461 if (!bfd_elf_final_link (abfd
, info
))
8464 /* Write out any glue sections now that we have created all the
8466 if (globals
->bfd_of_glue_owner
!= NULL
)
8468 if (! elf32_arm_output_glue_section (info
, abfd
,
8469 globals
->bfd_of_glue_owner
,
8470 ARM2THUMB_GLUE_SECTION_NAME
))
8473 if (! elf32_arm_output_glue_section (info
, abfd
,
8474 globals
->bfd_of_glue_owner
,
8475 THUMB2ARM_GLUE_SECTION_NAME
))
8478 if (! elf32_arm_output_glue_section (info
, abfd
,
8479 globals
->bfd_of_glue_owner
,
8480 VFP11_ERRATUM_VENEER_SECTION_NAME
))
8483 if (! elf32_arm_output_glue_section (info
, abfd
,
8484 globals
->bfd_of_glue_owner
,
8485 ARM_BX_GLUE_SECTION_NAME
))
8492 /* Set the right machine number. */
8495 elf32_arm_object_p (bfd
*abfd
)
8499 mach
= bfd_arm_get_mach_from_notes (abfd
, ARM_NOTE_SECTION
);
8501 if (mach
!= bfd_mach_arm_unknown
)
8502 bfd_default_set_arch_mach (abfd
, bfd_arch_arm
, mach
);
8504 else if (elf_elfheader (abfd
)->e_flags
& EF_ARM_MAVERICK_FLOAT
)
8505 bfd_default_set_arch_mach (abfd
, bfd_arch_arm
, bfd_mach_arm_ep9312
);
8508 bfd_default_set_arch_mach (abfd
, bfd_arch_arm
, mach
);
8513 /* Function to keep ARM specific flags in the ELF header. */
8516 elf32_arm_set_private_flags (bfd
*abfd
, flagword flags
)
8518 if (elf_flags_init (abfd
)
8519 && elf_elfheader (abfd
)->e_flags
!= flags
)
8521 if (EF_ARM_EABI_VERSION (flags
) == EF_ARM_EABI_UNKNOWN
)
8523 if (flags
& EF_ARM_INTERWORK
)
8524 (*_bfd_error_handler
)
8525 (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
8529 (_("Warning: Clearing the interworking flag of %B due to outside request"),
8535 elf_elfheader (abfd
)->e_flags
= flags
;
8536 elf_flags_init (abfd
) = TRUE
;
8542 /* Copy backend specific data from one object module to another. */
8545 elf32_arm_copy_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
8550 if (! is_arm_elf (ibfd
) || ! is_arm_elf (obfd
))
8553 in_flags
= elf_elfheader (ibfd
)->e_flags
;
8554 out_flags
= elf_elfheader (obfd
)->e_flags
;
8556 if (elf_flags_init (obfd
)
8557 && EF_ARM_EABI_VERSION (out_flags
) == EF_ARM_EABI_UNKNOWN
8558 && in_flags
!= out_flags
)
8560 /* Cannot mix APCS26 and APCS32 code. */
8561 if ((in_flags
& EF_ARM_APCS_26
) != (out_flags
& EF_ARM_APCS_26
))
8564 /* Cannot mix float APCS and non-float APCS code. */
8565 if ((in_flags
& EF_ARM_APCS_FLOAT
) != (out_flags
& EF_ARM_APCS_FLOAT
))
8568 /* If the src and dest have different interworking flags
8569 then turn off the interworking bit. */
8570 if ((in_flags
& EF_ARM_INTERWORK
) != (out_flags
& EF_ARM_INTERWORK
))
8572 if (out_flags
& EF_ARM_INTERWORK
)
8574 (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
8577 in_flags
&= ~EF_ARM_INTERWORK
;
8580 /* Likewise for PIC, though don't warn for this case. */
8581 if ((in_flags
& EF_ARM_PIC
) != (out_flags
& EF_ARM_PIC
))
8582 in_flags
&= ~EF_ARM_PIC
;
8585 elf_elfheader (obfd
)->e_flags
= in_flags
;
8586 elf_flags_init (obfd
) = TRUE
;
8588 /* Also copy the EI_OSABI field. */
8589 elf_elfheader (obfd
)->e_ident
[EI_OSABI
] =
8590 elf_elfheader (ibfd
)->e_ident
[EI_OSABI
];
8592 /* Copy object attributes. */
8593 _bfd_elf_copy_obj_attributes (ibfd
, obfd
);
8598 /* Values for Tag_ABI_PCS_R9_use. */
8607 /* Values for Tag_ABI_PCS_RW_data. */
8610 AEABI_PCS_RW_data_absolute
,
8611 AEABI_PCS_RW_data_PCrel
,
8612 AEABI_PCS_RW_data_SBrel
,
8613 AEABI_PCS_RW_data_unused
8616 /* Values for Tag_ABI_enum_size. */
8622 AEABI_enum_forced_wide
8625 /* Determine whether an object attribute tag takes an integer, a
8629 elf32_arm_obj_attrs_arg_type (int tag
)
8631 if (tag
== Tag_compatibility
)
8632 return ATTR_TYPE_FLAG_INT_VAL
| ATTR_TYPE_FLAG_STR_VAL
;
8633 else if (tag
== Tag_nodefaults
)
8634 return ATTR_TYPE_FLAG_INT_VAL
| ATTR_TYPE_FLAG_NO_DEFAULT
;
8635 else if (tag
== Tag_CPU_raw_name
|| tag
== Tag_CPU_name
)
8636 return ATTR_TYPE_FLAG_STR_VAL
;
8638 return ATTR_TYPE_FLAG_INT_VAL
;
8640 return (tag
& 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL
: ATTR_TYPE_FLAG_INT_VAL
;
8643 /* The ABI defines that Tag_conformance should be emitted first, and that
8644 Tag_nodefaults should be second (if either is defined). This sets those
8645 two positions, and bumps up the position of all the remaining tags to
8648 elf32_arm_obj_attrs_order (int num
)
8651 return Tag_conformance
;
8653 return Tag_nodefaults
;
8654 if ((num
- 2) < Tag_nodefaults
)
8656 if ((num
- 1) < Tag_conformance
)
8661 /* Read the architecture from the Tag_also_compatible_with attribute, if any.
8662 Returns -1 if no architecture could be read. */
8665 get_secondary_compatible_arch (bfd
*abfd
)
8667 obj_attribute
*attr
=
8668 &elf_known_obj_attributes_proc (abfd
)[Tag_also_compatible_with
];
8670 /* Note: the tag and its argument below are uleb128 values, though
8671 currently-defined values fit in one byte for each. */
8673 && attr
->s
[0] == Tag_CPU_arch
8674 && (attr
->s
[1] & 128) != 128
8678 /* This tag is "safely ignorable", so don't complain if it looks funny. */
8682 /* Set, or unset, the architecture of the Tag_also_compatible_with attribute.
8683 The tag is removed if ARCH is -1. */
8686 set_secondary_compatible_arch (bfd
*abfd
, int arch
)
8688 obj_attribute
*attr
=
8689 &elf_known_obj_attributes_proc (abfd
)[Tag_also_compatible_with
];
8697 /* Note: the tag and its argument below are uleb128 values, though
8698 currently-defined values fit in one byte for each. */
8700 attr
->s
= bfd_alloc (abfd
, 3);
8701 attr
->s
[0] = Tag_CPU_arch
;
8706 /* Combine two values for Tag_CPU_arch, taking secondary compatibility tags
8710 tag_cpu_arch_combine (bfd
*ibfd
, int oldtag
, int *secondary_compat_out
,
8711 int newtag
, int secondary_compat
)
8713 #define T(X) TAG_CPU_ARCH_##X
8714 int tagl
, tagh
, result
;
8717 T(V6T2
), /* PRE_V4. */
8721 T(V6T2
), /* V5TE. */
8722 T(V6T2
), /* V5TEJ. */
8729 T(V6K
), /* PRE_V4. */
8734 T(V6K
), /* V5TEJ. */
8736 T(V6KZ
), /* V6KZ. */
8742 T(V7
), /* PRE_V4. */
8761 T(V6K
), /* V5TEJ. */
8763 T(V6KZ
), /* V6KZ. */
8776 T(V6K
), /* V5TEJ. */
8778 T(V6KZ
), /* V6KZ. */
8782 T(V6S_M
), /* V6_M. */
8783 T(V6S_M
) /* V6S_M. */
8785 const int v4t_plus_v6_m
[] =
8791 T(V5TE
), /* V5TE. */
8792 T(V5TEJ
), /* V5TEJ. */
8794 T(V6KZ
), /* V6KZ. */
8795 T(V6T2
), /* V6T2. */
8798 T(V6_M
), /* V6_M. */
8799 T(V6S_M
), /* V6S_M. */
8800 T(V4T_PLUS_V6_M
) /* V4T plus V6_M. */
8809 /* Pseudo-architecture. */
8813 /* Check we've not got a higher architecture than we know about. */
8815 if (oldtag
>= MAX_TAG_CPU_ARCH
|| newtag
>= MAX_TAG_CPU_ARCH
)
8817 _bfd_error_handler (_("error: %B: Unknown CPU architecture"), ibfd
);
8821 /* Override old tag if we have a Tag_also_compatible_with on the output. */
8823 if ((oldtag
== T(V6_M
) && *secondary_compat_out
== T(V4T
))
8824 || (oldtag
== T(V4T
) && *secondary_compat_out
== T(V6_M
)))
8825 oldtag
= T(V4T_PLUS_V6_M
);
8827 /* And override the new tag if we have a Tag_also_compatible_with on the
8830 if ((newtag
== T(V6_M
) && secondary_compat
== T(V4T
))
8831 || (newtag
== T(V4T
) && secondary_compat
== T(V6_M
)))
8832 newtag
= T(V4T_PLUS_V6_M
);
8834 tagl
= (oldtag
< newtag
) ? oldtag
: newtag
;
8835 result
= tagh
= (oldtag
> newtag
) ? oldtag
: newtag
;
8837 /* Architectures before V6KZ add features monotonically. */
8838 if (tagh
<= TAG_CPU_ARCH_V6KZ
)
8841 result
= comb
[tagh
- T(V6T2
)][tagl
];
8843 /* Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
8844 as the canonical version. */
8845 if (result
== T(V4T_PLUS_V6_M
))
8848 *secondary_compat_out
= T(V6_M
);
8851 *secondary_compat_out
= -1;
8855 _bfd_error_handler (_("error: %B: Conflicting CPU architectures %d/%d"),
8856 ibfd
, oldtag
, newtag
);
8864 /* Merge EABI object attributes from IBFD into OBFD. Raise an error if there
8865 are conflicting attributes. */
8868 elf32_arm_merge_eabi_attributes (bfd
*ibfd
, bfd
*obfd
)
8870 obj_attribute
*in_attr
;
8871 obj_attribute
*out_attr
;
8872 obj_attribute_list
*in_list
;
8873 obj_attribute_list
*out_list
;
8874 obj_attribute_list
**out_listp
;
8875 /* Some tags have 0 = don't care, 1 = strong requirement,
8876 2 = weak requirement. */
8877 static const int order_021
[3] = {0, 2, 1};
8878 /* For use with Tag_VFP_arch. */
8879 static const int order_01243
[5] = {0, 1, 2, 4, 3};
8881 bfd_boolean result
= TRUE
;
8883 /* Skip the linker stubs file. This preserves previous behavior
8884 of accepting unknown attributes in the first input file - but
8886 if (ibfd
->flags
& BFD_LINKER_CREATED
)
8889 if (!elf_known_obj_attributes_proc (obfd
)[0].i
)
8891 /* This is the first object. Copy the attributes. */
8892 _bfd_elf_copy_obj_attributes (ibfd
, obfd
);
8894 /* Use the Tag_null value to indicate the attributes have been
8896 elf_known_obj_attributes_proc (obfd
)[0].i
= 1;
8901 in_attr
= elf_known_obj_attributes_proc (ibfd
);
8902 out_attr
= elf_known_obj_attributes_proc (obfd
);
8903 /* This needs to happen before Tag_ABI_FP_number_model is merged. */
8904 if (in_attr
[Tag_ABI_VFP_args
].i
!= out_attr
[Tag_ABI_VFP_args
].i
)
8906 /* Ignore mismatches if the object doesn't use floating point. */
8907 if (out_attr
[Tag_ABI_FP_number_model
].i
== 0)
8908 out_attr
[Tag_ABI_VFP_args
].i
= in_attr
[Tag_ABI_VFP_args
].i
;
8909 else if (in_attr
[Tag_ABI_FP_number_model
].i
!= 0)
8912 (_("error: %B uses VFP register arguments, %B does not"),
8918 for (i
= 4; i
< NUM_KNOWN_OBJ_ATTRIBUTES
; i
++)
8920 /* Merge this attribute with existing attributes. */
8923 case Tag_CPU_raw_name
:
8925 /* These are merged after Tag_CPU_arch. */
8928 case Tag_ABI_optimization_goals
:
8929 case Tag_ABI_FP_optimization_goals
:
8930 /* Use the first value seen. */
8935 int secondary_compat
= -1, secondary_compat_out
= -1;
8936 unsigned int saved_out_attr
= out_attr
[i
].i
;
8937 static const char *name_table
[] = {
8938 /* These aren't real CPU names, but we can't guess
8939 that from the architecture version alone. */
8955 /* Merge Tag_CPU_arch and Tag_also_compatible_with. */
8956 secondary_compat
= get_secondary_compatible_arch (ibfd
);
8957 secondary_compat_out
= get_secondary_compatible_arch (obfd
);
8958 out_attr
[i
].i
= tag_cpu_arch_combine (ibfd
, out_attr
[i
].i
,
8959 &secondary_compat_out
,
8962 set_secondary_compatible_arch (obfd
, secondary_compat_out
);
8964 /* Merge Tag_CPU_name and Tag_CPU_raw_name. */
8965 if (out_attr
[i
].i
== saved_out_attr
)
8966 ; /* Leave the names alone. */
8967 else if (out_attr
[i
].i
== in_attr
[i
].i
)
8969 /* The output architecture has been changed to match the
8970 input architecture. Use the input names. */
8971 out_attr
[Tag_CPU_name
].s
= in_attr
[Tag_CPU_name
].s
8972 ? _bfd_elf_attr_strdup (obfd
, in_attr
[Tag_CPU_name
].s
)
8974 out_attr
[Tag_CPU_raw_name
].s
= in_attr
[Tag_CPU_raw_name
].s
8975 ? _bfd_elf_attr_strdup (obfd
, in_attr
[Tag_CPU_raw_name
].s
)
8980 out_attr
[Tag_CPU_name
].s
= NULL
;
8981 out_attr
[Tag_CPU_raw_name
].s
= NULL
;
8984 /* If we still don't have a value for Tag_CPU_name,
8985 make one up now. Tag_CPU_raw_name remains blank. */
8986 if (out_attr
[Tag_CPU_name
].s
== NULL
8987 && out_attr
[i
].i
< ARRAY_SIZE (name_table
))
8988 out_attr
[Tag_CPU_name
].s
=
8989 _bfd_elf_attr_strdup (obfd
, name_table
[out_attr
[i
].i
]);
8993 case Tag_ARM_ISA_use
:
8994 case Tag_THUMB_ISA_use
:
8996 case Tag_Advanced_SIMD_arch
:
8997 /* ??? Do Advanced_SIMD (NEON) and WMMX conflict? */
8998 case Tag_ABI_FP_rounding
:
8999 case Tag_ABI_FP_exceptions
:
9000 case Tag_ABI_FP_user_exceptions
:
9001 case Tag_ABI_FP_number_model
:
9002 case Tag_VFP_HP_extension
:
9003 case Tag_CPU_unaligned_access
:
9005 case Tag_Virtualization_use
:
9006 case Tag_MPextension_use
:
9007 /* Use the largest value specified. */
9008 if (in_attr
[i
].i
> out_attr
[i
].i
)
9009 out_attr
[i
].i
= in_attr
[i
].i
;
9012 case Tag_ABI_align8_preserved
:
9013 case Tag_ABI_PCS_RO_data
:
9014 /* Use the smallest value specified. */
9015 if (in_attr
[i
].i
< out_attr
[i
].i
)
9016 out_attr
[i
].i
= in_attr
[i
].i
;
9019 case Tag_ABI_align8_needed
:
9020 if ((in_attr
[i
].i
> 0 || out_attr
[i
].i
> 0)
9021 && (in_attr
[Tag_ABI_align8_preserved
].i
== 0
9022 || out_attr
[Tag_ABI_align8_preserved
].i
== 0))
9024 /* This error message should be enabled once all non-conformant
9025 binaries in the toolchain have had the attributes set
9028 (_("error: %B: 8-byte data alignment conflicts with %B"),
9033 case Tag_ABI_FP_denormal
:
9034 case Tag_ABI_PCS_GOT_use
:
9035 /* Use the "greatest" from the sequence 0, 2, 1, or the largest
9036 value if greater than 2 (for future-proofing). */
9037 if ((in_attr
[i
].i
> 2 && in_attr
[i
].i
> out_attr
[i
].i
)
9038 || (in_attr
[i
].i
<= 2 && out_attr
[i
].i
<= 2
9039 && order_021
[in_attr
[i
].i
] > order_021
[out_attr
[i
].i
]))
9040 out_attr
[i
].i
= in_attr
[i
].i
;
9044 case Tag_CPU_arch_profile
:
9045 if (out_attr
[i
].i
!= in_attr
[i
].i
)
9047 /* 0 will merge with anything.
9048 'A' and 'S' merge to 'A'.
9049 'R' and 'S' merge to 'R'.
9050 'M' and 'A|R|S' is an error. */
9051 if (out_attr
[i
].i
== 0
9052 || (out_attr
[i
].i
== 'S'
9053 && (in_attr
[i
].i
== 'A' || in_attr
[i
].i
== 'R')))
9054 out_attr
[i
].i
= in_attr
[i
].i
;
9055 else if (in_attr
[i
].i
== 0
9056 || (in_attr
[i
].i
== 'S'
9057 && (out_attr
[i
].i
== 'A' || out_attr
[i
].i
== 'R')))
9062 (_("error: %B: Conflicting architecture profiles %c/%c"),
9064 in_attr
[i
].i
? in_attr
[i
].i
: '0',
9065 out_attr
[i
].i
? out_attr
[i
].i
: '0');
9071 /* Use the "greatest" from the sequence 0, 1, 2, 4, 3, or the
9072 largest value if greater than 4 (for future-proofing). */
9073 if ((in_attr
[i
].i
> 4 && in_attr
[i
].i
> out_attr
[i
].i
)
9074 || (in_attr
[i
].i
<= 4 && out_attr
[i
].i
<= 4
9075 && order_01243
[in_attr
[i
].i
] > order_01243
[out_attr
[i
].i
]))
9076 out_attr
[i
].i
= in_attr
[i
].i
;
9078 case Tag_PCS_config
:
9079 if (out_attr
[i
].i
== 0)
9080 out_attr
[i
].i
= in_attr
[i
].i
;
9081 else if (in_attr
[i
].i
!= 0 && out_attr
[i
].i
!= 0)
9083 /* It's sometimes ok to mix different configs, so this is only
9086 (_("Warning: %B: Conflicting platform configuration"), ibfd
);
9089 case Tag_ABI_PCS_R9_use
:
9090 if (in_attr
[i
].i
!= out_attr
[i
].i
9091 && out_attr
[i
].i
!= AEABI_R9_unused
9092 && in_attr
[i
].i
!= AEABI_R9_unused
)
9095 (_("error: %B: Conflicting use of R9"), ibfd
);
9098 if (out_attr
[i
].i
== AEABI_R9_unused
)
9099 out_attr
[i
].i
= in_attr
[i
].i
;
9101 case Tag_ABI_PCS_RW_data
:
9102 if (in_attr
[i
].i
== AEABI_PCS_RW_data_SBrel
9103 && out_attr
[Tag_ABI_PCS_R9_use
].i
!= AEABI_R9_SB
9104 && out_attr
[Tag_ABI_PCS_R9_use
].i
!= AEABI_R9_unused
)
9107 (_("error: %B: SB relative addressing conflicts with use of R9"),
9111 /* Use the smallest value specified. */
9112 if (in_attr
[i
].i
< out_attr
[i
].i
)
9113 out_attr
[i
].i
= in_attr
[i
].i
;
9115 case Tag_ABI_PCS_wchar_t
:
9116 if (out_attr
[i
].i
&& in_attr
[i
].i
&& out_attr
[i
].i
!= in_attr
[i
].i
9117 && !elf_arm_tdata (obfd
)->no_wchar_size_warning
)
9120 (_("warning: %B uses %u-byte wchar_t yet the output is to use %u-byte wchar_t; use of wchar_t values across objects may fail"),
9121 ibfd
, in_attr
[i
].i
, out_attr
[i
].i
);
9123 else if (in_attr
[i
].i
&& !out_attr
[i
].i
)
9124 out_attr
[i
].i
= in_attr
[i
].i
;
9126 case Tag_ABI_enum_size
:
9127 if (in_attr
[i
].i
!= AEABI_enum_unused
)
9129 if (out_attr
[i
].i
== AEABI_enum_unused
9130 || out_attr
[i
].i
== AEABI_enum_forced_wide
)
9132 /* The existing object is compatible with anything.
9133 Use whatever requirements the new object has. */
9134 out_attr
[i
].i
= in_attr
[i
].i
;
9136 else if (in_attr
[i
].i
!= AEABI_enum_forced_wide
9137 && out_attr
[i
].i
!= in_attr
[i
].i
9138 && !elf_arm_tdata (obfd
)->no_enum_size_warning
)
9140 static const char *aeabi_enum_names
[] =
9141 { "", "variable-size", "32-bit", "" };
9142 const char *in_name
=
9143 in_attr
[i
].i
< ARRAY_SIZE(aeabi_enum_names
)
9144 ? aeabi_enum_names
[in_attr
[i
].i
]
9146 const char *out_name
=
9147 out_attr
[i
].i
< ARRAY_SIZE(aeabi_enum_names
)
9148 ? aeabi_enum_names
[out_attr
[i
].i
]
9151 (_("warning: %B uses %s enums yet the output is to use %s enums; use of enum values across objects may fail"),
9152 ibfd
, in_name
, out_name
);
9156 case Tag_ABI_VFP_args
:
9159 case Tag_ABI_WMMX_args
:
9160 if (in_attr
[i
].i
!= out_attr
[i
].i
)
9163 (_("error: %B uses iWMMXt register arguments, %B does not"),
9168 case Tag_compatibility
:
9169 /* Merged in target-independent code. */
9171 case Tag_ABI_HardFP_use
:
9172 /* 1 (SP) and 2 (DP) conflict, so combine to 3 (SP & DP). */
9173 if ((in_attr
[i
].i
== 1 && out_attr
[i
].i
== 2)
9174 || (in_attr
[i
].i
== 2 && out_attr
[i
].i
== 1))
9176 else if (in_attr
[i
].i
> out_attr
[i
].i
)
9177 out_attr
[i
].i
= in_attr
[i
].i
;
9179 case Tag_ABI_FP_16bit_format
:
9180 if (in_attr
[i
].i
!= 0 && out_attr
[i
].i
!= 0)
9182 if (in_attr
[i
].i
!= out_attr
[i
].i
)
9185 (_("error: fp16 format mismatch between %B and %B"),
9190 if (in_attr
[i
].i
!= 0)
9191 out_attr
[i
].i
= in_attr
[i
].i
;
9194 case Tag_nodefaults
:
9195 /* This tag is set if it exists, but the value is unused (and is
9196 typically zero). We don't actually need to do anything here -
9197 the merge happens automatically when the type flags are merged
9200 case Tag_also_compatible_with
:
9201 /* Already done in Tag_CPU_arch. */
9203 case Tag_conformance
:
9204 /* Keep the attribute if it matches. Throw it away otherwise.
9205 No attribute means no claim to conform. */
9206 if (!in_attr
[i
].s
|| !out_attr
[i
].s
9207 || strcmp (in_attr
[i
].s
, out_attr
[i
].s
) != 0)
9208 out_attr
[i
].s
= NULL
;
9213 bfd
*err_bfd
= NULL
;
9215 /* The "known_obj_attributes" table does contain some undefined
9216 attributes. Ensure that there are unused. */
9217 if (out_attr
[i
].i
!= 0 || out_attr
[i
].s
!= NULL
)
9219 else if (in_attr
[i
].i
!= 0 || in_attr
[i
].s
!= NULL
)
9222 if (err_bfd
!= NULL
)
9224 /* Attribute numbers >=64 (mod 128) can be safely ignored. */
9228 (_("%B: Unknown mandatory EABI object attribute %d"),
9230 bfd_set_error (bfd_error_bad_value
);
9236 (_("Warning: %B: Unknown EABI object attribute %d"),
9241 /* Only pass on attributes that match in both inputs. */
9242 if (in_attr
[i
].i
!= out_attr
[i
].i
9243 || in_attr
[i
].s
!= out_attr
[i
].s
9244 || (in_attr
[i
].s
!= NULL
&& out_attr
[i
].s
!= NULL
9245 && strcmp (in_attr
[i
].s
, out_attr
[i
].s
) != 0))
9248 out_attr
[i
].s
= NULL
;
9253 /* If out_attr was copied from in_attr then it won't have a type yet. */
9254 if (in_attr
[i
].type
&& !out_attr
[i
].type
)
9255 out_attr
[i
].type
= in_attr
[i
].type
;
9258 /* Merge Tag_compatibility attributes and any common GNU ones. */
9259 _bfd_elf_merge_object_attributes (ibfd
, obfd
);
9261 /* Check for any attributes not known on ARM. */
9262 in_list
= elf_other_obj_attributes_proc (ibfd
);
9263 out_listp
= &elf_other_obj_attributes_proc (obfd
);
9264 out_list
= *out_listp
;
9266 for (; in_list
|| out_list
; )
9268 bfd
*err_bfd
= NULL
;
9271 /* The tags for each list are in numerical order. */
9272 /* If the tags are equal, then merge. */
9273 if (out_list
&& (!in_list
|| in_list
->tag
> out_list
->tag
))
9275 /* This attribute only exists in obfd. We can't merge, and we don't
9276 know what the tag means, so delete it. */
9278 err_tag
= out_list
->tag
;
9279 *out_listp
= out_list
->next
;
9280 out_list
= *out_listp
;
9282 else if (in_list
&& (!out_list
|| in_list
->tag
< out_list
->tag
))
9284 /* This attribute only exists in ibfd. We can't merge, and we don't
9285 know what the tag means, so ignore it. */
9287 err_tag
= in_list
->tag
;
9288 in_list
= in_list
->next
;
9290 else /* The tags are equal. */
9292 /* As present, all attributes in the list are unknown, and
9293 therefore can't be merged meaningfully. */
9295 err_tag
= out_list
->tag
;
9297 /* Only pass on attributes that match in both inputs. */
9298 if (in_list
->attr
.i
!= out_list
->attr
.i
9299 || in_list
->attr
.s
!= out_list
->attr
.s
9300 || (in_list
->attr
.s
&& out_list
->attr
.s
9301 && strcmp (in_list
->attr
.s
, out_list
->attr
.s
) != 0))
9303 /* No match. Delete the attribute. */
9304 *out_listp
= out_list
->next
;
9305 out_list
= *out_listp
;
9309 /* Matched. Keep the attribute and move to the next. */
9310 out_list
= out_list
->next
;
9311 in_list
= in_list
->next
;
9317 /* Attribute numbers >=64 (mod 128) can be safely ignored. */
9318 if ((err_tag
& 127) < 64)
9321 (_("%B: Unknown mandatory EABI object attribute %d"),
9323 bfd_set_error (bfd_error_bad_value
);
9329 (_("Warning: %B: Unknown EABI object attribute %d"),
9338 /* Return TRUE if the two EABI versions are incompatible. */
9341 elf32_arm_versions_compatible (unsigned iver
, unsigned over
)
9343 /* v4 and v5 are the same spec before and after it was released,
9344 so allow mixing them. */
9345 if ((iver
== EF_ARM_EABI_VER4
&& over
== EF_ARM_EABI_VER5
)
9346 || (iver
== EF_ARM_EABI_VER5
&& over
== EF_ARM_EABI_VER4
))
9349 return (iver
== over
);
9352 /* Merge backend specific data from an object file to the output
9353 object file when linking. */
9356 elf32_arm_merge_private_bfd_data (bfd
* ibfd
, bfd
* obfd
)
9360 bfd_boolean flags_compatible
= TRUE
;
9363 /* Check if we have the same endianess. */
9364 if (! _bfd_generic_verify_endian_match (ibfd
, obfd
))
9367 if (! is_arm_elf (ibfd
) || ! is_arm_elf (obfd
))
9370 if (!elf32_arm_merge_eabi_attributes (ibfd
, obfd
))
9373 /* The input BFD must have had its flags initialised. */
9374 /* The following seems bogus to me -- The flags are initialized in
9375 the assembler but I don't think an elf_flags_init field is
9376 written into the object. */
9377 /* BFD_ASSERT (elf_flags_init (ibfd)); */
9379 in_flags
= elf_elfheader (ibfd
)->e_flags
;
9380 out_flags
= elf_elfheader (obfd
)->e_flags
;
9382 /* In theory there is no reason why we couldn't handle this. However
9383 in practice it isn't even close to working and there is no real
9384 reason to want it. */
9385 if (EF_ARM_EABI_VERSION (in_flags
) >= EF_ARM_EABI_VER4
9386 && !(ibfd
->flags
& DYNAMIC
)
9387 && (in_flags
& EF_ARM_BE8
))
9389 _bfd_error_handler (_("error: %B is already in final BE8 format"),
9394 if (!elf_flags_init (obfd
))
9396 /* If the input is the default architecture and had the default
9397 flags then do not bother setting the flags for the output
9398 architecture, instead allow future merges to do this. If no
9399 future merges ever set these flags then they will retain their
9400 uninitialised values, which surprise surprise, correspond
9401 to the default values. */
9402 if (bfd_get_arch_info (ibfd
)->the_default
9403 && elf_elfheader (ibfd
)->e_flags
== 0)
9406 elf_flags_init (obfd
) = TRUE
;
9407 elf_elfheader (obfd
)->e_flags
= in_flags
;
9409 if (bfd_get_arch (obfd
) == bfd_get_arch (ibfd
)
9410 && bfd_get_arch_info (obfd
)->the_default
)
9411 return bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
), bfd_get_mach (ibfd
));
9416 /* Determine what should happen if the input ARM architecture
9417 does not match the output ARM architecture. */
9418 if (! bfd_arm_merge_machines (ibfd
, obfd
))
9421 /* Identical flags must be compatible. */
9422 if (in_flags
== out_flags
)
9425 /* Check to see if the input BFD actually contains any sections. If
9426 not, its flags may not have been initialised either, but it
9427 cannot actually cause any incompatiblity. Do not short-circuit
9428 dynamic objects; their section list may be emptied by
9429 elf_link_add_object_symbols.
9431 Also check to see if there are no code sections in the input.
9432 In this case there is no need to check for code specific flags.
9433 XXX - do we need to worry about floating-point format compatability
9434 in data sections ? */
9435 if (!(ibfd
->flags
& DYNAMIC
))
9437 bfd_boolean null_input_bfd
= TRUE
;
9438 bfd_boolean only_data_sections
= TRUE
;
9440 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
9442 /* Ignore synthetic glue sections. */
9443 if (strcmp (sec
->name
, ".glue_7")
9444 && strcmp (sec
->name
, ".glue_7t"))
9446 if ((bfd_get_section_flags (ibfd
, sec
)
9447 & (SEC_LOAD
| SEC_CODE
| SEC_HAS_CONTENTS
))
9448 == (SEC_LOAD
| SEC_CODE
| SEC_HAS_CONTENTS
))
9449 only_data_sections
= FALSE
;
9451 null_input_bfd
= FALSE
;
9456 if (null_input_bfd
|| only_data_sections
)
9460 /* Complain about various flag mismatches. */
9461 if (!elf32_arm_versions_compatible (EF_ARM_EABI_VERSION (in_flags
),
9462 EF_ARM_EABI_VERSION (out_flags
)))
9465 (_("error: Source object %B has EABI version %d, but target %B has EABI version %d"),
9467 (in_flags
& EF_ARM_EABIMASK
) >> 24,
9468 (out_flags
& EF_ARM_EABIMASK
) >> 24);
9472 /* Not sure what needs to be checked for EABI versions >= 1. */
9473 /* VxWorks libraries do not use these flags. */
9474 if (get_elf_backend_data (obfd
) != &elf32_arm_vxworks_bed
9475 && get_elf_backend_data (ibfd
) != &elf32_arm_vxworks_bed
9476 && EF_ARM_EABI_VERSION (in_flags
) == EF_ARM_EABI_UNKNOWN
)
9478 if ((in_flags
& EF_ARM_APCS_26
) != (out_flags
& EF_ARM_APCS_26
))
9481 (_("error: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
9483 in_flags
& EF_ARM_APCS_26
? 26 : 32,
9484 out_flags
& EF_ARM_APCS_26
? 26 : 32);
9485 flags_compatible
= FALSE
;
9488 if ((in_flags
& EF_ARM_APCS_FLOAT
) != (out_flags
& EF_ARM_APCS_FLOAT
))
9490 if (in_flags
& EF_ARM_APCS_FLOAT
)
9492 (_("error: %B passes floats in float registers, whereas %B passes them in integer registers"),
9496 (_("error: %B passes floats in integer registers, whereas %B passes them in float registers"),
9499 flags_compatible
= FALSE
;
9502 if ((in_flags
& EF_ARM_VFP_FLOAT
) != (out_flags
& EF_ARM_VFP_FLOAT
))
9504 if (in_flags
& EF_ARM_VFP_FLOAT
)
9506 (_("error: %B uses VFP instructions, whereas %B does not"),
9510 (_("error: %B uses FPA instructions, whereas %B does not"),
9513 flags_compatible
= FALSE
;
9516 if ((in_flags
& EF_ARM_MAVERICK_FLOAT
) != (out_flags
& EF_ARM_MAVERICK_FLOAT
))
9518 if (in_flags
& EF_ARM_MAVERICK_FLOAT
)
9520 (_("error: %B uses Maverick instructions, whereas %B does not"),
9524 (_("error: %B does not use Maverick instructions, whereas %B does"),
9527 flags_compatible
= FALSE
;
9530 #ifdef EF_ARM_SOFT_FLOAT
9531 if ((in_flags
& EF_ARM_SOFT_FLOAT
) != (out_flags
& EF_ARM_SOFT_FLOAT
))
9533 /* We can allow interworking between code that is VFP format
9534 layout, and uses either soft float or integer regs for
9535 passing floating point arguments and results. We already
9536 know that the APCS_FLOAT flags match; similarly for VFP
9538 if ((in_flags
& EF_ARM_APCS_FLOAT
) != 0
9539 || (in_flags
& EF_ARM_VFP_FLOAT
) == 0)
9541 if (in_flags
& EF_ARM_SOFT_FLOAT
)
9543 (_("error: %B uses software FP, whereas %B uses hardware FP"),
9547 (_("error: %B uses hardware FP, whereas %B uses software FP"),
9550 flags_compatible
= FALSE
;
9555 /* Interworking mismatch is only a warning. */
9556 if ((in_flags
& EF_ARM_INTERWORK
) != (out_flags
& EF_ARM_INTERWORK
))
9558 if (in_flags
& EF_ARM_INTERWORK
)
9561 (_("Warning: %B supports interworking, whereas %B does not"),
9567 (_("Warning: %B does not support interworking, whereas %B does"),
9573 return flags_compatible
;
9576 /* Display the flags field. */
9579 elf32_arm_print_private_bfd_data (bfd
*abfd
, void * ptr
)
9581 FILE * file
= (FILE *) ptr
;
9582 unsigned long flags
;
9584 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
9586 /* Print normal ELF private data. */
9587 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
9589 flags
= elf_elfheader (abfd
)->e_flags
;
9590 /* Ignore init flag - it may not be set, despite the flags field
9591 containing valid data. */
9593 /* xgettext:c-format */
9594 fprintf (file
, _("private flags = %lx:"), elf_elfheader (abfd
)->e_flags
);
9596 switch (EF_ARM_EABI_VERSION (flags
))
9598 case EF_ARM_EABI_UNKNOWN
:
9599 /* The following flag bits are GNU extensions and not part of the
9600 official ARM ELF extended ABI. Hence they are only decoded if
9601 the EABI version is not set. */
9602 if (flags
& EF_ARM_INTERWORK
)
9603 fprintf (file
, _(" [interworking enabled]"));
9605 if (flags
& EF_ARM_APCS_26
)
9606 fprintf (file
, " [APCS-26]");
9608 fprintf (file
, " [APCS-32]");
9610 if (flags
& EF_ARM_VFP_FLOAT
)
9611 fprintf (file
, _(" [VFP float format]"));
9612 else if (flags
& EF_ARM_MAVERICK_FLOAT
)
9613 fprintf (file
, _(" [Maverick float format]"));
9615 fprintf (file
, _(" [FPA float format]"));
9617 if (flags
& EF_ARM_APCS_FLOAT
)
9618 fprintf (file
, _(" [floats passed in float registers]"));
9620 if (flags
& EF_ARM_PIC
)
9621 fprintf (file
, _(" [position independent]"));
9623 if (flags
& EF_ARM_NEW_ABI
)
9624 fprintf (file
, _(" [new ABI]"));
9626 if (flags
& EF_ARM_OLD_ABI
)
9627 fprintf (file
, _(" [old ABI]"));
9629 if (flags
& EF_ARM_SOFT_FLOAT
)
9630 fprintf (file
, _(" [software FP]"));
9632 flags
&= ~(EF_ARM_INTERWORK
| EF_ARM_APCS_26
| EF_ARM_APCS_FLOAT
9633 | EF_ARM_PIC
| EF_ARM_NEW_ABI
| EF_ARM_OLD_ABI
9634 | EF_ARM_SOFT_FLOAT
| EF_ARM_VFP_FLOAT
9635 | EF_ARM_MAVERICK_FLOAT
);
9638 case EF_ARM_EABI_VER1
:
9639 fprintf (file
, _(" [Version1 EABI]"));
9641 if (flags
& EF_ARM_SYMSARESORTED
)
9642 fprintf (file
, _(" [sorted symbol table]"));
9644 fprintf (file
, _(" [unsorted symbol table]"));
9646 flags
&= ~ EF_ARM_SYMSARESORTED
;
9649 case EF_ARM_EABI_VER2
:
9650 fprintf (file
, _(" [Version2 EABI]"));
9652 if (flags
& EF_ARM_SYMSARESORTED
)
9653 fprintf (file
, _(" [sorted symbol table]"));
9655 fprintf (file
, _(" [unsorted symbol table]"));
9657 if (flags
& EF_ARM_DYNSYMSUSESEGIDX
)
9658 fprintf (file
, _(" [dynamic symbols use segment index]"));
9660 if (flags
& EF_ARM_MAPSYMSFIRST
)
9661 fprintf (file
, _(" [mapping symbols precede others]"));
9663 flags
&= ~(EF_ARM_SYMSARESORTED
| EF_ARM_DYNSYMSUSESEGIDX
9664 | EF_ARM_MAPSYMSFIRST
);
9667 case EF_ARM_EABI_VER3
:
9668 fprintf (file
, _(" [Version3 EABI]"));
9671 case EF_ARM_EABI_VER4
:
9672 fprintf (file
, _(" [Version4 EABI]"));
9675 case EF_ARM_EABI_VER5
:
9676 fprintf (file
, _(" [Version5 EABI]"));
9678 if (flags
& EF_ARM_BE8
)
9679 fprintf (file
, _(" [BE8]"));
9681 if (flags
& EF_ARM_LE8
)
9682 fprintf (file
, _(" [LE8]"));
9684 flags
&= ~(EF_ARM_LE8
| EF_ARM_BE8
);
9688 fprintf (file
, _(" <EABI version unrecognised>"));
9692 flags
&= ~ EF_ARM_EABIMASK
;
9694 if (flags
& EF_ARM_RELEXEC
)
9695 fprintf (file
, _(" [relocatable executable]"));
9697 if (flags
& EF_ARM_HASENTRY
)
9698 fprintf (file
, _(" [has entry point]"));
9700 flags
&= ~ (EF_ARM_RELEXEC
| EF_ARM_HASENTRY
);
9703 fprintf (file
, _("<Unrecognised flag bits set>"));
9711 elf32_arm_get_symbol_type (Elf_Internal_Sym
* elf_sym
, int type
)
9713 switch (ELF_ST_TYPE (elf_sym
->st_info
))
9716 return ELF_ST_TYPE (elf_sym
->st_info
);
9719 /* If the symbol is not an object, return the STT_ARM_16BIT flag.
9720 This allows us to distinguish between data used by Thumb instructions
9721 and non-data (which is probably code) inside Thumb regions of an
9723 if (type
!= STT_OBJECT
&& type
!= STT_TLS
)
9724 return ELF_ST_TYPE (elf_sym
->st_info
);
9735 elf32_arm_gc_mark_hook (asection
*sec
,
9736 struct bfd_link_info
*info
,
9737 Elf_Internal_Rela
*rel
,
9738 struct elf_link_hash_entry
*h
,
9739 Elf_Internal_Sym
*sym
)
9742 switch (ELF32_R_TYPE (rel
->r_info
))
9744 case R_ARM_GNU_VTINHERIT
:
9745 case R_ARM_GNU_VTENTRY
:
9749 return _bfd_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
);
9752 /* Update the got entry reference counts for the section being removed. */
9755 elf32_arm_gc_sweep_hook (bfd
* abfd
,
9756 struct bfd_link_info
* info
,
9758 const Elf_Internal_Rela
* relocs
)
9760 Elf_Internal_Shdr
*symtab_hdr
;
9761 struct elf_link_hash_entry
**sym_hashes
;
9762 bfd_signed_vma
*local_got_refcounts
;
9763 const Elf_Internal_Rela
*rel
, *relend
;
9764 struct elf32_arm_link_hash_table
* globals
;
9766 if (info
->relocatable
)
9769 globals
= elf32_arm_hash_table (info
);
9771 elf_section_data (sec
)->local_dynrel
= NULL
;
9773 symtab_hdr
= & elf_symtab_hdr (abfd
);
9774 sym_hashes
= elf_sym_hashes (abfd
);
9775 local_got_refcounts
= elf_local_got_refcounts (abfd
);
9777 check_use_blx (globals
);
9779 relend
= relocs
+ sec
->reloc_count
;
9780 for (rel
= relocs
; rel
< relend
; rel
++)
9782 unsigned long r_symndx
;
9783 struct elf_link_hash_entry
*h
= NULL
;
9786 r_symndx
= ELF32_R_SYM (rel
->r_info
);
9787 if (r_symndx
>= symtab_hdr
->sh_info
)
9789 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
9790 while (h
->root
.type
== bfd_link_hash_indirect
9791 || h
->root
.type
== bfd_link_hash_warning
)
9792 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
9795 r_type
= ELF32_R_TYPE (rel
->r_info
);
9796 r_type
= arm_real_reloc_type (globals
, r_type
);
9800 case R_ARM_GOT_PREL
:
9801 case R_ARM_TLS_GD32
:
9802 case R_ARM_TLS_IE32
:
9805 if (h
->got
.refcount
> 0)
9806 h
->got
.refcount
-= 1;
9808 else if (local_got_refcounts
!= NULL
)
9810 if (local_got_refcounts
[r_symndx
] > 0)
9811 local_got_refcounts
[r_symndx
] -= 1;
9815 case R_ARM_TLS_LDM32
:
9816 elf32_arm_hash_table (info
)->tls_ldm_got
.refcount
-= 1;
9820 case R_ARM_ABS32_NOI
:
9822 case R_ARM_REL32_NOI
:
9828 case R_ARM_THM_CALL
:
9829 case R_ARM_THM_JUMP24
:
9830 case R_ARM_THM_JUMP19
:
9831 case R_ARM_MOVW_ABS_NC
:
9832 case R_ARM_MOVT_ABS
:
9833 case R_ARM_MOVW_PREL_NC
:
9834 case R_ARM_MOVT_PREL
:
9835 case R_ARM_THM_MOVW_ABS_NC
:
9836 case R_ARM_THM_MOVT_ABS
:
9837 case R_ARM_THM_MOVW_PREL_NC
:
9838 case R_ARM_THM_MOVT_PREL
:
9839 /* Should the interworking branches be here also? */
9843 struct elf32_arm_link_hash_entry
*eh
;
9844 struct elf32_arm_relocs_copied
**pp
;
9845 struct elf32_arm_relocs_copied
*p
;
9847 eh
= (struct elf32_arm_link_hash_entry
*) h
;
9849 if (h
->plt
.refcount
> 0)
9851 h
->plt
.refcount
-= 1;
9852 if (r_type
== R_ARM_THM_CALL
)
9853 eh
->plt_maybe_thumb_refcount
--;
9855 if (r_type
== R_ARM_THM_JUMP24
9856 || r_type
== R_ARM_THM_JUMP19
)
9857 eh
->plt_thumb_refcount
--;
9860 if (r_type
== R_ARM_ABS32
9861 || r_type
== R_ARM_REL32
9862 || r_type
== R_ARM_ABS32_NOI
9863 || r_type
== R_ARM_REL32_NOI
)
9865 for (pp
= &eh
->relocs_copied
; (p
= *pp
) != NULL
;
9867 if (p
->section
== sec
)
9870 if (ELF32_R_TYPE (rel
->r_info
) == R_ARM_REL32
9871 || ELF32_R_TYPE (rel
->r_info
) == R_ARM_REL32_NOI
)
9889 /* Look through the relocs for a section during the first phase. */
9892 elf32_arm_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
,
9893 asection
*sec
, const Elf_Internal_Rela
*relocs
)
9895 Elf_Internal_Shdr
*symtab_hdr
;
9896 struct elf_link_hash_entry
**sym_hashes
;
9897 const Elf_Internal_Rela
*rel
;
9898 const Elf_Internal_Rela
*rel_end
;
9901 bfd_vma
*local_got_offsets
;
9902 struct elf32_arm_link_hash_table
*htab
;
9903 bfd_boolean needs_plt
;
9904 unsigned long nsyms
;
9906 if (info
->relocatable
)
9909 BFD_ASSERT (is_arm_elf (abfd
));
9911 htab
= elf32_arm_hash_table (info
);
9914 /* Create dynamic sections for relocatable executables so that we can
9915 copy relocations. */
9916 if (htab
->root
.is_relocatable_executable
9917 && ! htab
->root
.dynamic_sections_created
)
9919 if (! _bfd_elf_link_create_dynamic_sections (abfd
, info
))
9923 dynobj
= elf_hash_table (info
)->dynobj
;
9924 local_got_offsets
= elf_local_got_offsets (abfd
);
9926 symtab_hdr
= & elf_symtab_hdr (abfd
);
9927 sym_hashes
= elf_sym_hashes (abfd
);
9928 nsyms
= NUM_SHDR_ENTRIES (symtab_hdr
);
9930 rel_end
= relocs
+ sec
->reloc_count
;
9931 for (rel
= relocs
; rel
< rel_end
; rel
++)
9933 struct elf_link_hash_entry
*h
;
9934 struct elf32_arm_link_hash_entry
*eh
;
9935 unsigned long r_symndx
;
9938 r_symndx
= ELF32_R_SYM (rel
->r_info
);
9939 r_type
= ELF32_R_TYPE (rel
->r_info
);
9940 r_type
= arm_real_reloc_type (htab
, r_type
);
9942 if (r_symndx
>= nsyms
9943 /* PR 9934: It is possible to have relocations that do not
9944 refer to symbols, thus it is also possible to have an
9945 object file containing relocations but no symbol table. */
9946 && (r_symndx
> 0 || nsyms
> 0))
9948 (*_bfd_error_handler
) (_("%B: bad symbol index: %d"), abfd
,
9953 if (nsyms
== 0 || r_symndx
< symtab_hdr
->sh_info
)
9957 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
9958 while (h
->root
.type
== bfd_link_hash_indirect
9959 || h
->root
.type
== bfd_link_hash_warning
)
9960 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
9963 eh
= (struct elf32_arm_link_hash_entry
*) h
;
9968 case R_ARM_GOT_PREL
:
9969 case R_ARM_TLS_GD32
:
9970 case R_ARM_TLS_IE32
:
9971 /* This symbol requires a global offset table entry. */
9973 int tls_type
, old_tls_type
;
9977 case R_ARM_TLS_GD32
: tls_type
= GOT_TLS_GD
; break;
9978 case R_ARM_TLS_IE32
: tls_type
= GOT_TLS_IE
; break;
9979 default: tls_type
= GOT_NORMAL
; break;
9985 old_tls_type
= elf32_arm_hash_entry (h
)->tls_type
;
9989 bfd_signed_vma
*local_got_refcounts
;
9991 /* This is a global offset table entry for a local symbol. */
9992 local_got_refcounts
= elf_local_got_refcounts (abfd
);
9993 if (local_got_refcounts
== NULL
)
9997 size
= symtab_hdr
->sh_info
;
9998 size
*= (sizeof (bfd_signed_vma
) + sizeof (char));
9999 local_got_refcounts
= bfd_zalloc (abfd
, size
);
10000 if (local_got_refcounts
== NULL
)
10002 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
10003 elf32_arm_local_got_tls_type (abfd
)
10004 = (char *) (local_got_refcounts
+ symtab_hdr
->sh_info
);
10006 local_got_refcounts
[r_symndx
] += 1;
10007 old_tls_type
= elf32_arm_local_got_tls_type (abfd
) [r_symndx
];
10010 /* We will already have issued an error message if there is a
10011 TLS / non-TLS mismatch, based on the symbol type. We don't
10012 support any linker relaxations. So just combine any TLS
10014 if (old_tls_type
!= GOT_UNKNOWN
&& old_tls_type
!= GOT_NORMAL
10015 && tls_type
!= GOT_NORMAL
)
10016 tls_type
|= old_tls_type
;
10018 if (old_tls_type
!= tls_type
)
10021 elf32_arm_hash_entry (h
)->tls_type
= tls_type
;
10023 elf32_arm_local_got_tls_type (abfd
) [r_symndx
] = tls_type
;
10026 /* Fall through. */
10028 case R_ARM_TLS_LDM32
:
10029 if (r_type
== R_ARM_TLS_LDM32
)
10030 htab
->tls_ldm_got
.refcount
++;
10031 /* Fall through. */
10033 case R_ARM_GOTOFF32
:
10035 if (htab
->sgot
== NULL
)
10037 if (htab
->root
.dynobj
== NULL
)
10038 htab
->root
.dynobj
= abfd
;
10039 if (!create_got_section (htab
->root
.dynobj
, info
))
10045 /* VxWorks uses dynamic R_ARM_ABS12 relocations for
10046 ldr __GOTT_INDEX__ offsets. */
10047 if (!htab
->vxworks_p
)
10049 /* Fall through. */
10056 case R_ARM_THM_CALL
:
10057 case R_ARM_THM_JUMP24
:
10058 case R_ARM_THM_JUMP19
:
10062 case R_ARM_MOVW_ABS_NC
:
10063 case R_ARM_MOVT_ABS
:
10064 case R_ARM_THM_MOVW_ABS_NC
:
10065 case R_ARM_THM_MOVT_ABS
:
10068 (*_bfd_error_handler
)
10069 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
10070 abfd
, elf32_arm_howto_table_1
[r_type
].name
,
10071 (h
) ? h
->root
.root
.string
: "a local symbol");
10072 bfd_set_error (bfd_error_bad_value
);
10076 /* Fall through. */
10078 case R_ARM_ABS32_NOI
:
10080 case R_ARM_REL32_NOI
:
10081 case R_ARM_MOVW_PREL_NC
:
10082 case R_ARM_MOVT_PREL
:
10083 case R_ARM_THM_MOVW_PREL_NC
:
10084 case R_ARM_THM_MOVT_PREL
:
10088 /* Should the interworking branches be listed here? */
10091 /* If this reloc is in a read-only section, we might
10092 need a copy reloc. We can't check reliably at this
10093 stage whether the section is read-only, as input
10094 sections have not yet been mapped to output sections.
10095 Tentatively set the flag for now, and correct in
10096 adjust_dynamic_symbol. */
10098 h
->non_got_ref
= 1;
10100 /* We may need a .plt entry if the function this reloc
10101 refers to is in a different object. We can't tell for
10102 sure yet, because something later might force the
10107 /* If we create a PLT entry, this relocation will reference
10108 it, even if it's an ABS32 relocation. */
10109 h
->plt
.refcount
+= 1;
10111 /* It's too early to use htab->use_blx here, so we have to
10112 record possible blx references separately from
10113 relocs that definitely need a thumb stub. */
10115 if (r_type
== R_ARM_THM_CALL
)
10116 eh
->plt_maybe_thumb_refcount
+= 1;
10118 if (r_type
== R_ARM_THM_JUMP24
10119 || r_type
== R_ARM_THM_JUMP19
)
10120 eh
->plt_thumb_refcount
+= 1;
10123 /* If we are creating a shared library or relocatable executable,
10124 and this is a reloc against a global symbol, or a non PC
10125 relative reloc against a local symbol, then we need to copy
10126 the reloc into the shared library. However, if we are linking
10127 with -Bsymbolic, we do not need to copy a reloc against a
10128 global symbol which is defined in an object we are
10129 including in the link (i.e., DEF_REGULAR is set). At
10130 this point we have not seen all the input files, so it is
10131 possible that DEF_REGULAR is not set now but will be set
10132 later (it is never cleared). We account for that
10133 possibility below by storing information in the
10134 relocs_copied field of the hash table entry. */
10135 if ((info
->shared
|| htab
->root
.is_relocatable_executable
)
10136 && (sec
->flags
& SEC_ALLOC
) != 0
10137 && ((r_type
== R_ARM_ABS32
|| r_type
== R_ARM_ABS32_NOI
)
10138 || (h
!= NULL
&& ! h
->needs_plt
10139 && (! info
->symbolic
|| ! h
->def_regular
))))
10141 struct elf32_arm_relocs_copied
*p
, **head
;
10143 /* When creating a shared object, we must copy these
10144 reloc types into the output file. We create a reloc
10145 section in dynobj and make room for this reloc. */
10146 if (sreloc
== NULL
)
10148 sreloc
= _bfd_elf_make_dynamic_reloc_section
10149 (sec
, dynobj
, 2, abfd
, ! htab
->use_rel
);
10151 if (sreloc
== NULL
)
10154 /* BPABI objects never have dynamic relocations mapped. */
10155 if (htab
->symbian_p
)
10159 flags
= bfd_get_section_flags (dynobj
, sreloc
);
10160 flags
&= ~(SEC_LOAD
| SEC_ALLOC
);
10161 bfd_set_section_flags (dynobj
, sreloc
, flags
);
10165 /* If this is a global symbol, we count the number of
10166 relocations we need for this symbol. */
10169 head
= &((struct elf32_arm_link_hash_entry
*) h
)->relocs_copied
;
10173 /* Track dynamic relocs needed for local syms too.
10174 We really need local syms available to do this
10175 easily. Oh well. */
10180 s
= bfd_section_from_r_symndx (abfd
, &htab
->sym_sec
,
10185 vpp
= &elf_section_data (s
)->local_dynrel
;
10186 head
= (struct elf32_arm_relocs_copied
**) vpp
;
10190 if (p
== NULL
|| p
->section
!= sec
)
10192 bfd_size_type amt
= sizeof *p
;
10194 p
= bfd_alloc (htab
->root
.dynobj
, amt
);
10204 if (r_type
== R_ARM_REL32
|| r_type
== R_ARM_REL32_NOI
)
10210 /* This relocation describes the C++ object vtable hierarchy.
10211 Reconstruct it for later use during GC. */
10212 case R_ARM_GNU_VTINHERIT
:
10213 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
10217 /* This relocation describes which C++ vtable entries are actually
10218 used. Record for later use during GC. */
10219 case R_ARM_GNU_VTENTRY
:
10220 BFD_ASSERT (h
!= NULL
);
10222 && !bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_offset
))
10231 /* Unwinding tables are not referenced directly. This pass marks them as
10232 required if the corresponding code section is marked. */
10235 elf32_arm_gc_mark_extra_sections (struct bfd_link_info
*info
,
10236 elf_gc_mark_hook_fn gc_mark_hook
)
10239 Elf_Internal_Shdr
**elf_shdrp
;
10242 /* Marking EH data may cause additional code sections to be marked,
10243 requiring multiple passes. */
10248 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link_next
)
10252 if (! is_arm_elf (sub
))
10255 elf_shdrp
= elf_elfsections (sub
);
10256 for (o
= sub
->sections
; o
!= NULL
; o
= o
->next
)
10258 Elf_Internal_Shdr
*hdr
;
10260 hdr
= &elf_section_data (o
)->this_hdr
;
10261 if (hdr
->sh_type
== SHT_ARM_EXIDX
10263 && hdr
->sh_link
< elf_numsections (sub
)
10265 && elf_shdrp
[hdr
->sh_link
]->bfd_section
->gc_mark
)
10268 if (!_bfd_elf_gc_mark (info
, o
, gc_mark_hook
))
10278 /* Treat mapping symbols as special target symbols. */
10281 elf32_arm_is_target_special_symbol (bfd
* abfd ATTRIBUTE_UNUSED
, asymbol
* sym
)
10283 return bfd_is_arm_special_symbol_name (sym
->name
,
10284 BFD_ARM_SPECIAL_SYM_TYPE_ANY
);
10287 /* This is a copy of elf_find_function() from elf.c except that
10288 ARM mapping symbols are ignored when looking for function names
10289 and STT_ARM_TFUNC is considered to a function type. */
10292 arm_elf_find_function (bfd
* abfd ATTRIBUTE_UNUSED
,
10293 asection
* section
,
10294 asymbol
** symbols
,
10296 const char ** filename_ptr
,
10297 const char ** functionname_ptr
)
10299 const char * filename
= NULL
;
10300 asymbol
* func
= NULL
;
10301 bfd_vma low_func
= 0;
10304 for (p
= symbols
; *p
!= NULL
; p
++)
10306 elf_symbol_type
*q
;
10308 q
= (elf_symbol_type
*) *p
;
10310 switch (ELF_ST_TYPE (q
->internal_elf_sym
.st_info
))
10315 filename
= bfd_asymbol_name (&q
->symbol
);
10318 case STT_ARM_TFUNC
:
10320 /* Skip mapping symbols. */
10321 if ((q
->symbol
.flags
& BSF_LOCAL
)
10322 && bfd_is_arm_special_symbol_name (q
->symbol
.name
,
10323 BFD_ARM_SPECIAL_SYM_TYPE_ANY
))
10325 /* Fall through. */
10326 if (bfd_get_section (&q
->symbol
) == section
10327 && q
->symbol
.value
>= low_func
10328 && q
->symbol
.value
<= offset
)
10330 func
= (asymbol
*) q
;
10331 low_func
= q
->symbol
.value
;
10341 *filename_ptr
= filename
;
10342 if (functionname_ptr
)
10343 *functionname_ptr
= bfd_asymbol_name (func
);
10349 /* Find the nearest line to a particular section and offset, for error
10350 reporting. This code is a duplicate of the code in elf.c, except
10351 that it uses arm_elf_find_function. */
10354 elf32_arm_find_nearest_line (bfd
* abfd
,
10355 asection
* section
,
10356 asymbol
** symbols
,
10358 const char ** filename_ptr
,
10359 const char ** functionname_ptr
,
10360 unsigned int * line_ptr
)
10362 bfd_boolean found
= FALSE
;
10364 /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it. */
10366 if (_bfd_dwarf2_find_nearest_line (abfd
, section
, symbols
, offset
,
10367 filename_ptr
, functionname_ptr
,
10369 & elf_tdata (abfd
)->dwarf2_find_line_info
))
10371 if (!*functionname_ptr
)
10372 arm_elf_find_function (abfd
, section
, symbols
, offset
,
10373 *filename_ptr
? NULL
: filename_ptr
,
10379 if (! _bfd_stab_section_find_nearest_line (abfd
, symbols
, section
, offset
,
10380 & found
, filename_ptr
,
10381 functionname_ptr
, line_ptr
,
10382 & elf_tdata (abfd
)->line_info
))
10385 if (found
&& (*functionname_ptr
|| *line_ptr
))
10388 if (symbols
== NULL
)
10391 if (! arm_elf_find_function (abfd
, section
, symbols
, offset
,
10392 filename_ptr
, functionname_ptr
))
10400 elf32_arm_find_inliner_info (bfd
* abfd
,
10401 const char ** filename_ptr
,
10402 const char ** functionname_ptr
,
10403 unsigned int * line_ptr
)
10406 found
= _bfd_dwarf2_find_inliner_info (abfd
, filename_ptr
,
10407 functionname_ptr
, line_ptr
,
10408 & elf_tdata (abfd
)->dwarf2_find_line_info
);
10412 /* Adjust a symbol defined by a dynamic object and referenced by a
10413 regular object. The current definition is in some section of the
10414 dynamic object, but we're not including those sections. We have to
10415 change the definition to something the rest of the link can
10419 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info
* info
,
10420 struct elf_link_hash_entry
* h
)
10424 struct elf32_arm_link_hash_entry
* eh
;
10425 struct elf32_arm_link_hash_table
*globals
;
10427 globals
= elf32_arm_hash_table (info
);
10428 dynobj
= elf_hash_table (info
)->dynobj
;
10430 /* Make sure we know what is going on here. */
10431 BFD_ASSERT (dynobj
!= NULL
10433 || h
->u
.weakdef
!= NULL
10436 && !h
->def_regular
)));
10438 eh
= (struct elf32_arm_link_hash_entry
*) h
;
10440 /* If this is a function, put it in the procedure linkage table. We
10441 will fill in the contents of the procedure linkage table later,
10442 when we know the address of the .got section. */
10443 if (h
->type
== STT_FUNC
|| h
->type
== STT_ARM_TFUNC
10446 if (h
->plt
.refcount
<= 0
10447 || SYMBOL_CALLS_LOCAL (info
, h
)
10448 || (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
10449 && h
->root
.type
== bfd_link_hash_undefweak
))
10451 /* This case can occur if we saw a PLT32 reloc in an input
10452 file, but the symbol was never referred to by a dynamic
10453 object, or if all references were garbage collected. In
10454 such a case, we don't actually need to build a procedure
10455 linkage table, and we can just do a PC24 reloc instead. */
10456 h
->plt
.offset
= (bfd_vma
) -1;
10457 eh
->plt_thumb_refcount
= 0;
10458 eh
->plt_maybe_thumb_refcount
= 0;
10466 /* It's possible that we incorrectly decided a .plt reloc was
10467 needed for an R_ARM_PC24 or similar reloc to a non-function sym
10468 in check_relocs. We can't decide accurately between function
10469 and non-function syms in check-relocs; Objects loaded later in
10470 the link may change h->type. So fix it now. */
10471 h
->plt
.offset
= (bfd_vma
) -1;
10472 eh
->plt_thumb_refcount
= 0;
10473 eh
->plt_maybe_thumb_refcount
= 0;
10476 /* If this is a weak symbol, and there is a real definition, the
10477 processor independent code will have arranged for us to see the
10478 real definition first, and we can just use the same value. */
10479 if (h
->u
.weakdef
!= NULL
)
10481 BFD_ASSERT (h
->u
.weakdef
->root
.type
== bfd_link_hash_defined
10482 || h
->u
.weakdef
->root
.type
== bfd_link_hash_defweak
);
10483 h
->root
.u
.def
.section
= h
->u
.weakdef
->root
.u
.def
.section
;
10484 h
->root
.u
.def
.value
= h
->u
.weakdef
->root
.u
.def
.value
;
10488 /* If there are no non-GOT references, we do not need a copy
10490 if (!h
->non_got_ref
)
10493 /* This is a reference to a symbol defined by a dynamic object which
10494 is not a function. */
10496 /* If we are creating a shared library, we must presume that the
10497 only references to the symbol are via the global offset table.
10498 For such cases we need not do anything here; the relocations will
10499 be handled correctly by relocate_section. Relocatable executables
10500 can reference data in shared objects directly, so we don't need to
10501 do anything here. */
10502 if (info
->shared
|| globals
->root
.is_relocatable_executable
)
10507 (*_bfd_error_handler
) (_("dynamic variable `%s' is zero size"),
10508 h
->root
.root
.string
);
10512 /* We must allocate the symbol in our .dynbss section, which will
10513 become part of the .bss section of the executable. There will be
10514 an entry for this symbol in the .dynsym section. The dynamic
10515 object will contain position independent code, so all references
10516 from the dynamic object to this symbol will go through the global
10517 offset table. The dynamic linker will use the .dynsym entry to
10518 determine the address it must put in the global offset table, so
10519 both the dynamic object and the regular object will refer to the
10520 same memory location for the variable. */
10521 s
= bfd_get_section_by_name (dynobj
, ".dynbss");
10522 BFD_ASSERT (s
!= NULL
);
10524 /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
10525 copy the initial value out of the dynamic object and into the
10526 runtime process image. We need to remember the offset into the
10527 .rel(a).bss section we are going to use. */
10528 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
10532 srel
= bfd_get_section_by_name (dynobj
, RELOC_SECTION (globals
, ".bss"));
10533 BFD_ASSERT (srel
!= NULL
);
10534 srel
->size
+= RELOC_SIZE (globals
);
10538 return _bfd_elf_adjust_dynamic_copy (h
, s
);
10541 /* Allocate space in .plt, .got and associated reloc sections for
10545 allocate_dynrelocs (struct elf_link_hash_entry
*h
, void * inf
)
10547 struct bfd_link_info
*info
;
10548 struct elf32_arm_link_hash_table
*htab
;
10549 struct elf32_arm_link_hash_entry
*eh
;
10550 struct elf32_arm_relocs_copied
*p
;
10551 bfd_signed_vma thumb_refs
;
10553 eh
= (struct elf32_arm_link_hash_entry
*) h
;
10555 if (h
->root
.type
== bfd_link_hash_indirect
)
10558 if (h
->root
.type
== bfd_link_hash_warning
)
10559 /* When warning symbols are created, they **replace** the "real"
10560 entry in the hash table, thus we never get to see the real
10561 symbol in a hash traversal. So look at it now. */
10562 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
10564 info
= (struct bfd_link_info
*) inf
;
10565 htab
= elf32_arm_hash_table (info
);
10567 if (htab
->root
.dynamic_sections_created
10568 && h
->plt
.refcount
> 0)
10570 /* Make sure this symbol is output as a dynamic symbol.
10571 Undefined weak syms won't yet be marked as dynamic. */
10572 if (h
->dynindx
== -1
10573 && !h
->forced_local
)
10575 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
10580 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h
))
10582 asection
*s
= htab
->splt
;
10584 /* If this is the first .plt entry, make room for the special
10587 s
->size
+= htab
->plt_header_size
;
10589 h
->plt
.offset
= s
->size
;
10591 /* If we will insert a Thumb trampoline before this PLT, leave room
10593 thumb_refs
= eh
->plt_thumb_refcount
;
10594 if (!htab
->use_blx
)
10595 thumb_refs
+= eh
->plt_maybe_thumb_refcount
;
10597 if (thumb_refs
> 0)
10599 h
->plt
.offset
+= PLT_THUMB_STUB_SIZE
;
10600 s
->size
+= PLT_THUMB_STUB_SIZE
;
10603 /* If this symbol is not defined in a regular file, and we are
10604 not generating a shared library, then set the symbol to this
10605 location in the .plt. This is required to make function
10606 pointers compare as equal between the normal executable and
10607 the shared library. */
10609 && !h
->def_regular
)
10611 h
->root
.u
.def
.section
= s
;
10612 h
->root
.u
.def
.value
= h
->plt
.offset
;
10614 /* Make sure the function is not marked as Thumb, in case
10615 it is the target of an ABS32 relocation, which will
10616 point to the PLT entry. */
10617 if (ELF_ST_TYPE (h
->type
) == STT_ARM_TFUNC
)
10618 h
->type
= ELF_ST_INFO (ELF_ST_BIND (h
->type
), STT_FUNC
);
10621 /* Make room for this entry. */
10622 s
->size
+= htab
->plt_entry_size
;
10624 if (!htab
->symbian_p
)
10626 /* We also need to make an entry in the .got.plt section, which
10627 will be placed in the .got section by the linker script. */
10628 eh
->plt_got_offset
= htab
->sgotplt
->size
;
10629 htab
->sgotplt
->size
+= 4;
10632 /* We also need to make an entry in the .rel(a).plt section. */
10633 htab
->srelplt
->size
+= RELOC_SIZE (htab
);
10635 /* VxWorks executables have a second set of relocations for
10636 each PLT entry. They go in a separate relocation section,
10637 which is processed by the kernel loader. */
10638 if (htab
->vxworks_p
&& !info
->shared
)
10640 /* There is a relocation for the initial PLT entry:
10641 an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_. */
10642 if (h
->plt
.offset
== htab
->plt_header_size
)
10643 htab
->srelplt2
->size
+= RELOC_SIZE (htab
);
10645 /* There are two extra relocations for each subsequent
10646 PLT entry: an R_ARM_32 relocation for the GOT entry,
10647 and an R_ARM_32 relocation for the PLT entry. */
10648 htab
->srelplt2
->size
+= RELOC_SIZE (htab
) * 2;
10653 h
->plt
.offset
= (bfd_vma
) -1;
10659 h
->plt
.offset
= (bfd_vma
) -1;
10663 if (h
->got
.refcount
> 0)
10667 int tls_type
= elf32_arm_hash_entry (h
)->tls_type
;
10670 /* Make sure this symbol is output as a dynamic symbol.
10671 Undefined weak syms won't yet be marked as dynamic. */
10672 if (h
->dynindx
== -1
10673 && !h
->forced_local
)
10675 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
10679 if (!htab
->symbian_p
)
10682 h
->got
.offset
= s
->size
;
10684 if (tls_type
== GOT_UNKNOWN
)
10687 if (tls_type
== GOT_NORMAL
)
10688 /* Non-TLS symbols need one GOT slot. */
10692 if (tls_type
& GOT_TLS_GD
)
10693 /* R_ARM_TLS_GD32 needs 2 consecutive GOT slots. */
10695 if (tls_type
& GOT_TLS_IE
)
10696 /* R_ARM_TLS_IE32 needs one GOT slot. */
10700 dyn
= htab
->root
.dynamic_sections_created
;
10703 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
10705 || !SYMBOL_REFERENCES_LOCAL (info
, h
)))
10708 if (tls_type
!= GOT_NORMAL
10709 && (info
->shared
|| indx
!= 0)
10710 && (ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
10711 || h
->root
.type
!= bfd_link_hash_undefweak
))
10713 if (tls_type
& GOT_TLS_IE
)
10714 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
10716 if (tls_type
& GOT_TLS_GD
)
10717 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
10719 if ((tls_type
& GOT_TLS_GD
) && indx
!= 0)
10720 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
10722 else if ((ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
10723 || h
->root
.type
!= bfd_link_hash_undefweak
)
10725 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, 0, h
)))
10726 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
10730 h
->got
.offset
= (bfd_vma
) -1;
10732 /* Allocate stubs for exported Thumb functions on v4t. */
10733 if (!htab
->use_blx
&& h
->dynindx
!= -1
10735 && ELF_ST_TYPE (h
->type
) == STT_ARM_TFUNC
10736 && ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
)
10738 struct elf_link_hash_entry
* th
;
10739 struct bfd_link_hash_entry
* bh
;
10740 struct elf_link_hash_entry
* myh
;
10744 /* Create a new symbol to regist the real location of the function. */
10745 s
= h
->root
.u
.def
.section
;
10746 sprintf (name
, "__real_%s", h
->root
.root
.string
);
10747 _bfd_generic_link_add_one_symbol (info
, s
->owner
,
10748 name
, BSF_GLOBAL
, s
,
10749 h
->root
.u
.def
.value
,
10750 NULL
, TRUE
, FALSE
, &bh
);
10752 myh
= (struct elf_link_hash_entry
*) bh
;
10753 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_ARM_TFUNC
);
10754 myh
->forced_local
= 1;
10755 eh
->export_glue
= myh
;
10756 th
= record_arm_to_thumb_glue (info
, h
);
10757 /* Point the symbol at the stub. */
10758 h
->type
= ELF_ST_INFO (ELF_ST_BIND (h
->type
), STT_FUNC
);
10759 h
->root
.u
.def
.section
= th
->root
.u
.def
.section
;
10760 h
->root
.u
.def
.value
= th
->root
.u
.def
.value
& ~1;
10763 if (eh
->relocs_copied
== NULL
)
10766 /* In the shared -Bsymbolic case, discard space allocated for
10767 dynamic pc-relative relocs against symbols which turn out to be
10768 defined in regular objects. For the normal shared case, discard
10769 space for pc-relative relocs that have become local due to symbol
10770 visibility changes. */
10772 if (info
->shared
|| htab
->root
.is_relocatable_executable
)
10774 /* The only relocs that use pc_count are R_ARM_REL32 and
10775 R_ARM_REL32_NOI, which will appear on something like
10776 ".long foo - .". We want calls to protected symbols to resolve
10777 directly to the function rather than going via the plt. If people
10778 want function pointer comparisons to work as expected then they
10779 should avoid writing assembly like ".long foo - .". */
10780 if (SYMBOL_CALLS_LOCAL (info
, h
))
10782 struct elf32_arm_relocs_copied
**pp
;
10784 for (pp
= &eh
->relocs_copied
; (p
= *pp
) != NULL
; )
10786 p
->count
-= p
->pc_count
;
10795 if (elf32_arm_hash_table (info
)->vxworks_p
)
10797 struct elf32_arm_relocs_copied
**pp
;
10799 for (pp
= &eh
->relocs_copied
; (p
= *pp
) != NULL
; )
10801 if (strcmp (p
->section
->output_section
->name
, ".tls_vars") == 0)
10808 /* Also discard relocs on undefined weak syms with non-default
10810 if (eh
->relocs_copied
!= NULL
10811 && h
->root
.type
== bfd_link_hash_undefweak
)
10813 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
)
10814 eh
->relocs_copied
= NULL
;
10816 /* Make sure undefined weak symbols are output as a dynamic
10818 else if (h
->dynindx
== -1
10819 && !h
->forced_local
)
10821 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
10826 else if (htab
->root
.is_relocatable_executable
&& h
->dynindx
== -1
10827 && h
->root
.type
== bfd_link_hash_new
)
10829 /* Output absolute symbols so that we can create relocations
10830 against them. For normal symbols we output a relocation
10831 against the section that contains them. */
10832 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
10839 /* For the non-shared case, discard space for relocs against
10840 symbols which turn out to need copy relocs or are not
10843 if (!h
->non_got_ref
10844 && ((h
->def_dynamic
10845 && !h
->def_regular
)
10846 || (htab
->root
.dynamic_sections_created
10847 && (h
->root
.type
== bfd_link_hash_undefweak
10848 || h
->root
.type
== bfd_link_hash_undefined
))))
10850 /* Make sure this symbol is output as a dynamic symbol.
10851 Undefined weak syms won't yet be marked as dynamic. */
10852 if (h
->dynindx
== -1
10853 && !h
->forced_local
)
10855 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
10859 /* If that succeeded, we know we'll be keeping all the
10861 if (h
->dynindx
!= -1)
10865 eh
->relocs_copied
= NULL
;
10870 /* Finally, allocate space. */
10871 for (p
= eh
->relocs_copied
; p
!= NULL
; p
= p
->next
)
10873 asection
*sreloc
= elf_section_data (p
->section
)->sreloc
;
10874 sreloc
->size
+= p
->count
* RELOC_SIZE (htab
);
10880 /* Find any dynamic relocs that apply to read-only sections. */
10883 elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry
* h
, void * inf
)
10885 struct elf32_arm_link_hash_entry
* eh
;
10886 struct elf32_arm_relocs_copied
* p
;
10888 if (h
->root
.type
== bfd_link_hash_warning
)
10889 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
10891 eh
= (struct elf32_arm_link_hash_entry
*) h
;
10892 for (p
= eh
->relocs_copied
; p
!= NULL
; p
= p
->next
)
10894 asection
*s
= p
->section
;
10896 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
10898 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
10900 info
->flags
|= DF_TEXTREL
;
10902 /* Not an error, just cut short the traversal. */
10910 bfd_elf32_arm_set_byteswap_code (struct bfd_link_info
*info
,
10913 struct elf32_arm_link_hash_table
*globals
;
10915 globals
= elf32_arm_hash_table (info
);
10916 globals
->byteswap_code
= byteswap_code
;
10919 /* Set the sizes of the dynamic sections. */
10922 elf32_arm_size_dynamic_sections (bfd
* output_bfd ATTRIBUTE_UNUSED
,
10923 struct bfd_link_info
* info
)
10928 bfd_boolean relocs
;
10930 struct elf32_arm_link_hash_table
*htab
;
10932 htab
= elf32_arm_hash_table (info
);
10933 dynobj
= elf_hash_table (info
)->dynobj
;
10934 BFD_ASSERT (dynobj
!= NULL
);
10935 check_use_blx (htab
);
10937 if (elf_hash_table (info
)->dynamic_sections_created
)
10939 /* Set the contents of the .interp section to the interpreter. */
10940 if (info
->executable
)
10942 s
= bfd_get_section_by_name (dynobj
, ".interp");
10943 BFD_ASSERT (s
!= NULL
);
10944 s
->size
= sizeof ELF_DYNAMIC_INTERPRETER
;
10945 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
10949 /* Set up .got offsets for local syms, and space for local dynamic
10951 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
10953 bfd_signed_vma
*local_got
;
10954 bfd_signed_vma
*end_local_got
;
10955 char *local_tls_type
;
10956 bfd_size_type locsymcount
;
10957 Elf_Internal_Shdr
*symtab_hdr
;
10959 bfd_boolean is_vxworks
= elf32_arm_hash_table (info
)->vxworks_p
;
10961 if (! is_arm_elf (ibfd
))
10964 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
10966 struct elf32_arm_relocs_copied
*p
;
10968 for (p
= elf_section_data (s
)->local_dynrel
; p
!= NULL
; p
= p
->next
)
10970 if (!bfd_is_abs_section (p
->section
)
10971 && bfd_is_abs_section (p
->section
->output_section
))
10973 /* Input section has been discarded, either because
10974 it is a copy of a linkonce section or due to
10975 linker script /DISCARD/, so we'll be discarding
10978 else if (is_vxworks
10979 && strcmp (p
->section
->output_section
->name
,
10982 /* Relocations in vxworks .tls_vars sections are
10983 handled specially by the loader. */
10985 else if (p
->count
!= 0)
10987 srel
= elf_section_data (p
->section
)->sreloc
;
10988 srel
->size
+= p
->count
* RELOC_SIZE (htab
);
10989 if ((p
->section
->output_section
->flags
& SEC_READONLY
) != 0)
10990 info
->flags
|= DF_TEXTREL
;
10995 local_got
= elf_local_got_refcounts (ibfd
);
10999 symtab_hdr
= & elf_symtab_hdr (ibfd
);
11000 locsymcount
= symtab_hdr
->sh_info
;
11001 end_local_got
= local_got
+ locsymcount
;
11002 local_tls_type
= elf32_arm_local_got_tls_type (ibfd
);
11004 srel
= htab
->srelgot
;
11005 for (; local_got
< end_local_got
; ++local_got
, ++local_tls_type
)
11007 if (*local_got
> 0)
11009 *local_got
= s
->size
;
11010 if (*local_tls_type
& GOT_TLS_GD
)
11011 /* TLS_GD relocs need an 8-byte structure in the GOT. */
11013 if (*local_tls_type
& GOT_TLS_IE
)
11015 if (*local_tls_type
== GOT_NORMAL
)
11018 if (info
->shared
|| *local_tls_type
== GOT_TLS_GD
)
11019 srel
->size
+= RELOC_SIZE (htab
);
11022 *local_got
= (bfd_vma
) -1;
11026 if (htab
->tls_ldm_got
.refcount
> 0)
11028 /* Allocate two GOT entries and one dynamic relocation (if necessary)
11029 for R_ARM_TLS_LDM32 relocations. */
11030 htab
->tls_ldm_got
.offset
= htab
->sgot
->size
;
11031 htab
->sgot
->size
+= 8;
11033 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
11036 htab
->tls_ldm_got
.offset
= -1;
11038 /* Allocate global sym .plt and .got entries, and space for global
11039 sym dynamic relocs. */
11040 elf_link_hash_traverse (& htab
->root
, allocate_dynrelocs
, info
);
11042 /* Here we rummage through the found bfds to collect glue information. */
11043 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
11045 if (! is_arm_elf (ibfd
))
11048 /* Initialise mapping tables for code/data. */
11049 bfd_elf32_arm_init_maps (ibfd
);
11051 if (!bfd_elf32_arm_process_before_allocation (ibfd
, info
)
11052 || !bfd_elf32_arm_vfp11_erratum_scan (ibfd
, info
))
11053 /* xgettext:c-format */
11054 _bfd_error_handler (_("Errors encountered processing file %s"),
11058 /* Allocate space for the glue sections now that we've sized them. */
11059 bfd_elf32_arm_allocate_interworking_sections (info
);
11061 /* The check_relocs and adjust_dynamic_symbol entry points have
11062 determined the sizes of the various dynamic sections. Allocate
11063 memory for them. */
11066 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
11070 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
11073 /* It's OK to base decisions on the section name, because none
11074 of the dynobj section names depend upon the input files. */
11075 name
= bfd_get_section_name (dynobj
, s
);
11077 if (strcmp (name
, ".plt") == 0)
11079 /* Remember whether there is a PLT. */
11080 plt
= s
->size
!= 0;
11082 else if (CONST_STRNEQ (name
, ".rel"))
11086 /* Remember whether there are any reloc sections other
11087 than .rel(a).plt and .rela.plt.unloaded. */
11088 if (s
!= htab
->srelplt
&& s
!= htab
->srelplt2
)
11091 /* We use the reloc_count field as a counter if we need
11092 to copy relocs into the output file. */
11093 s
->reloc_count
= 0;
11096 else if (! CONST_STRNEQ (name
, ".got")
11097 && strcmp (name
, ".dynbss") != 0)
11099 /* It's not one of our sections, so don't allocate space. */
11105 /* If we don't need this section, strip it from the
11106 output file. This is mostly to handle .rel(a).bss and
11107 .rel(a).plt. We must create both sections in
11108 create_dynamic_sections, because they must be created
11109 before the linker maps input sections to output
11110 sections. The linker does that before
11111 adjust_dynamic_symbol is called, and it is that
11112 function which decides whether anything needs to go
11113 into these sections. */
11114 s
->flags
|= SEC_EXCLUDE
;
11118 if ((s
->flags
& SEC_HAS_CONTENTS
) == 0)
11121 /* Allocate memory for the section contents. */
11122 s
->contents
= bfd_zalloc (dynobj
, s
->size
);
11123 if (s
->contents
== NULL
)
11127 if (elf_hash_table (info
)->dynamic_sections_created
)
11129 /* Add some entries to the .dynamic section. We fill in the
11130 values later, in elf32_arm_finish_dynamic_sections, but we
11131 must add the entries now so that we get the correct size for
11132 the .dynamic section. The DT_DEBUG entry is filled in by the
11133 dynamic linker and used by the debugger. */
11134 #define add_dynamic_entry(TAG, VAL) \
11135 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
11137 if (info
->executable
)
11139 if (!add_dynamic_entry (DT_DEBUG
, 0))
11145 if ( !add_dynamic_entry (DT_PLTGOT
, 0)
11146 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
11147 || !add_dynamic_entry (DT_PLTREL
,
11148 htab
->use_rel
? DT_REL
: DT_RELA
)
11149 || !add_dynamic_entry (DT_JMPREL
, 0))
11157 if (!add_dynamic_entry (DT_REL
, 0)
11158 || !add_dynamic_entry (DT_RELSZ
, 0)
11159 || !add_dynamic_entry (DT_RELENT
, RELOC_SIZE (htab
)))
11164 if (!add_dynamic_entry (DT_RELA
, 0)
11165 || !add_dynamic_entry (DT_RELASZ
, 0)
11166 || !add_dynamic_entry (DT_RELAENT
, RELOC_SIZE (htab
)))
11171 /* If any dynamic relocs apply to a read-only section,
11172 then we need a DT_TEXTREL entry. */
11173 if ((info
->flags
& DF_TEXTREL
) == 0)
11174 elf_link_hash_traverse (& htab
->root
, elf32_arm_readonly_dynrelocs
,
11177 if ((info
->flags
& DF_TEXTREL
) != 0)
11179 if (!add_dynamic_entry (DT_TEXTREL
, 0))
11182 if (htab
->vxworks_p
11183 && !elf_vxworks_add_dynamic_entries (output_bfd
, info
))
11186 #undef add_dynamic_entry
11191 /* Finish up dynamic symbol handling. We set the contents of various
11192 dynamic sections here. */
11195 elf32_arm_finish_dynamic_symbol (bfd
* output_bfd
,
11196 struct bfd_link_info
* info
,
11197 struct elf_link_hash_entry
* h
,
11198 Elf_Internal_Sym
* sym
)
11201 struct elf32_arm_link_hash_table
*htab
;
11202 struct elf32_arm_link_hash_entry
*eh
;
11204 dynobj
= elf_hash_table (info
)->dynobj
;
11205 htab
= elf32_arm_hash_table (info
);
11206 eh
= (struct elf32_arm_link_hash_entry
*) h
;
11208 if (h
->plt
.offset
!= (bfd_vma
) -1)
11214 Elf_Internal_Rela rel
;
11216 /* This symbol has an entry in the procedure linkage table. Set
11219 BFD_ASSERT (h
->dynindx
!= -1);
11221 splt
= bfd_get_section_by_name (dynobj
, ".plt");
11222 srel
= bfd_get_section_by_name (dynobj
, RELOC_SECTION (htab
, ".plt"));
11223 BFD_ASSERT (splt
!= NULL
&& srel
!= NULL
);
11225 /* Fill in the entry in the procedure linkage table. */
11226 if (htab
->symbian_p
)
11228 put_arm_insn (htab
, output_bfd
,
11229 elf32_arm_symbian_plt_entry
[0],
11230 splt
->contents
+ h
->plt
.offset
);
11231 bfd_put_32 (output_bfd
,
11232 elf32_arm_symbian_plt_entry
[1],
11233 splt
->contents
+ h
->plt
.offset
+ 4);
11235 /* Fill in the entry in the .rel.plt section. */
11236 rel
.r_offset
= (splt
->output_section
->vma
11237 + splt
->output_offset
11238 + h
->plt
.offset
+ 4);
11239 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_GLOB_DAT
);
11241 /* Get the index in the procedure linkage table which
11242 corresponds to this symbol. This is the index of this symbol
11243 in all the symbols for which we are making plt entries. The
11244 first entry in the procedure linkage table is reserved. */
11245 plt_index
= ((h
->plt
.offset
- htab
->plt_header_size
)
11246 / htab
->plt_entry_size
);
11250 bfd_vma got_offset
, got_address
, plt_address
;
11251 bfd_vma got_displacement
;
11255 sgot
= bfd_get_section_by_name (dynobj
, ".got.plt");
11256 BFD_ASSERT (sgot
!= NULL
);
11258 /* Get the offset into the .got.plt table of the entry that
11259 corresponds to this function. */
11260 got_offset
= eh
->plt_got_offset
;
11262 /* Get the index in the procedure linkage table which
11263 corresponds to this symbol. This is the index of this symbol
11264 in all the symbols for which we are making plt entries. The
11265 first three entries in .got.plt are reserved; after that
11266 symbols appear in the same order as in .plt. */
11267 plt_index
= (got_offset
- 12) / 4;
11269 /* Calculate the address of the GOT entry. */
11270 got_address
= (sgot
->output_section
->vma
11271 + sgot
->output_offset
11274 /* ...and the address of the PLT entry. */
11275 plt_address
= (splt
->output_section
->vma
11276 + splt
->output_offset
11279 ptr
= htab
->splt
->contents
+ h
->plt
.offset
;
11280 if (htab
->vxworks_p
&& info
->shared
)
11285 for (i
= 0; i
!= htab
->plt_entry_size
/ 4; i
++, ptr
+= 4)
11287 val
= elf32_arm_vxworks_shared_plt_entry
[i
];
11289 val
|= got_address
- sgot
->output_section
->vma
;
11291 val
|= plt_index
* RELOC_SIZE (htab
);
11292 if (i
== 2 || i
== 5)
11293 bfd_put_32 (output_bfd
, val
, ptr
);
11295 put_arm_insn (htab
, output_bfd
, val
, ptr
);
11298 else if (htab
->vxworks_p
)
11303 for (i
= 0; i
!= htab
->plt_entry_size
/ 4; i
++, ptr
+= 4)
11305 val
= elf32_arm_vxworks_exec_plt_entry
[i
];
11307 val
|= got_address
;
11309 val
|= 0xffffff & -((h
->plt
.offset
+ i
* 4 + 8) >> 2);
11311 val
|= plt_index
* RELOC_SIZE (htab
);
11312 if (i
== 2 || i
== 5)
11313 bfd_put_32 (output_bfd
, val
, ptr
);
11315 put_arm_insn (htab
, output_bfd
, val
, ptr
);
11318 loc
= (htab
->srelplt2
->contents
11319 + (plt_index
* 2 + 1) * RELOC_SIZE (htab
));
11321 /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
11322 referencing the GOT for this PLT entry. */
11323 rel
.r_offset
= plt_address
+ 8;
11324 rel
.r_info
= ELF32_R_INFO (htab
->root
.hgot
->indx
, R_ARM_ABS32
);
11325 rel
.r_addend
= got_offset
;
11326 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
11327 loc
+= RELOC_SIZE (htab
);
11329 /* Create the R_ARM_ABS32 relocation referencing the
11330 beginning of the PLT for this GOT entry. */
11331 rel
.r_offset
= got_address
;
11332 rel
.r_info
= ELF32_R_INFO (htab
->root
.hplt
->indx
, R_ARM_ABS32
);
11334 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
11338 bfd_signed_vma thumb_refs
;
11339 /* Calculate the displacement between the PLT slot and the
11340 entry in the GOT. The eight-byte offset accounts for the
11341 value produced by adding to pc in the first instruction
11342 of the PLT stub. */
11343 got_displacement
= got_address
- (plt_address
+ 8);
11345 BFD_ASSERT ((got_displacement
& 0xf0000000) == 0);
11347 thumb_refs
= eh
->plt_thumb_refcount
;
11348 if (!htab
->use_blx
)
11349 thumb_refs
+= eh
->plt_maybe_thumb_refcount
;
11351 if (thumb_refs
> 0)
11353 put_thumb_insn (htab
, output_bfd
,
11354 elf32_arm_plt_thumb_stub
[0], ptr
- 4);
11355 put_thumb_insn (htab
, output_bfd
,
11356 elf32_arm_plt_thumb_stub
[1], ptr
- 2);
11359 put_arm_insn (htab
, output_bfd
,
11360 elf32_arm_plt_entry
[0]
11361 | ((got_displacement
& 0x0ff00000) >> 20),
11363 put_arm_insn (htab
, output_bfd
,
11364 elf32_arm_plt_entry
[1]
11365 | ((got_displacement
& 0x000ff000) >> 12),
11367 put_arm_insn (htab
, output_bfd
,
11368 elf32_arm_plt_entry
[2]
11369 | (got_displacement
& 0x00000fff),
11371 #ifdef FOUR_WORD_PLT
11372 bfd_put_32 (output_bfd
, elf32_arm_plt_entry
[3], ptr
+ 12);
11376 /* Fill in the entry in the global offset table. */
11377 bfd_put_32 (output_bfd
,
11378 (splt
->output_section
->vma
11379 + splt
->output_offset
),
11380 sgot
->contents
+ got_offset
);
11382 /* Fill in the entry in the .rel(a).plt section. */
11384 rel
.r_offset
= got_address
;
11385 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_JUMP_SLOT
);
11388 loc
= srel
->contents
+ plt_index
* RELOC_SIZE (htab
);
11389 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
11391 if (!h
->def_regular
)
11393 /* Mark the symbol as undefined, rather than as defined in
11394 the .plt section. Leave the value alone. */
11395 sym
->st_shndx
= SHN_UNDEF
;
11396 /* If the symbol is weak, we do need to clear the value.
11397 Otherwise, the PLT entry would provide a definition for
11398 the symbol even if the symbol wasn't defined anywhere,
11399 and so the symbol would never be NULL. */
11400 if (!h
->ref_regular_nonweak
)
11405 if (h
->got
.offset
!= (bfd_vma
) -1
11406 && (elf32_arm_hash_entry (h
)->tls_type
& GOT_TLS_GD
) == 0
11407 && (elf32_arm_hash_entry (h
)->tls_type
& GOT_TLS_IE
) == 0)
11411 Elf_Internal_Rela rel
;
11415 /* This symbol has an entry in the global offset table. Set it
11417 sgot
= bfd_get_section_by_name (dynobj
, ".got");
11418 srel
= bfd_get_section_by_name (dynobj
, RELOC_SECTION (htab
, ".got"));
11419 BFD_ASSERT (sgot
!= NULL
&& srel
!= NULL
);
11421 offset
= (h
->got
.offset
& ~(bfd_vma
) 1);
11423 rel
.r_offset
= (sgot
->output_section
->vma
11424 + sgot
->output_offset
11427 /* If this is a static link, or it is a -Bsymbolic link and the
11428 symbol is defined locally or was forced to be local because
11429 of a version file, we just want to emit a RELATIVE reloc.
11430 The entry in the global offset table will already have been
11431 initialized in the relocate_section function. */
11433 && SYMBOL_REFERENCES_LOCAL (info
, h
))
11435 BFD_ASSERT ((h
->got
.offset
& 1) != 0);
11436 rel
.r_info
= ELF32_R_INFO (0, R_ARM_RELATIVE
);
11437 if (!htab
->use_rel
)
11439 rel
.r_addend
= bfd_get_32 (output_bfd
, sgot
->contents
+ offset
);
11440 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ offset
);
11445 BFD_ASSERT ((h
->got
.offset
& 1) == 0);
11446 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ offset
);
11447 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_GLOB_DAT
);
11450 loc
= srel
->contents
+ srel
->reloc_count
++ * RELOC_SIZE (htab
);
11451 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
11457 Elf_Internal_Rela rel
;
11460 /* This symbol needs a copy reloc. Set it up. */
11461 BFD_ASSERT (h
->dynindx
!= -1
11462 && (h
->root
.type
== bfd_link_hash_defined
11463 || h
->root
.type
== bfd_link_hash_defweak
));
11465 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
,
11466 RELOC_SECTION (htab
, ".bss"));
11467 BFD_ASSERT (s
!= NULL
);
11470 rel
.r_offset
= (h
->root
.u
.def
.value
11471 + h
->root
.u
.def
.section
->output_section
->vma
11472 + h
->root
.u
.def
.section
->output_offset
);
11473 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_COPY
);
11474 loc
= s
->contents
+ s
->reloc_count
++ * RELOC_SIZE (htab
);
11475 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
11478 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. On VxWorks,
11479 the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it is relative
11480 to the ".got" section. */
11481 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
11482 || (!htab
->vxworks_p
&& h
== htab
->root
.hgot
))
11483 sym
->st_shndx
= SHN_ABS
;
11488 /* Finish up the dynamic sections. */
11491 elf32_arm_finish_dynamic_sections (bfd
* output_bfd
, struct bfd_link_info
* info
)
11497 dynobj
= elf_hash_table (info
)->dynobj
;
11499 sgot
= bfd_get_section_by_name (dynobj
, ".got.plt");
11500 BFD_ASSERT (elf32_arm_hash_table (info
)->symbian_p
|| sgot
!= NULL
);
11501 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
11503 if (elf_hash_table (info
)->dynamic_sections_created
)
11506 Elf32_External_Dyn
*dyncon
, *dynconend
;
11507 struct elf32_arm_link_hash_table
*htab
;
11509 htab
= elf32_arm_hash_table (info
);
11510 splt
= bfd_get_section_by_name (dynobj
, ".plt");
11511 BFD_ASSERT (splt
!= NULL
&& sdyn
!= NULL
);
11513 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
11514 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
11516 for (; dyncon
< dynconend
; dyncon
++)
11518 Elf_Internal_Dyn dyn
;
11522 bfd_elf32_swap_dyn_in (dynobj
, dyncon
, &dyn
);
11529 if (htab
->vxworks_p
11530 && elf_vxworks_finish_dynamic_entry (output_bfd
, &dyn
))
11531 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
11536 goto get_vma_if_bpabi
;
11539 goto get_vma_if_bpabi
;
11542 goto get_vma_if_bpabi
;
11544 name
= ".gnu.version";
11545 goto get_vma_if_bpabi
;
11547 name
= ".gnu.version_d";
11548 goto get_vma_if_bpabi
;
11550 name
= ".gnu.version_r";
11551 goto get_vma_if_bpabi
;
11557 name
= RELOC_SECTION (htab
, ".plt");
11559 s
= bfd_get_section_by_name (output_bfd
, name
);
11560 BFD_ASSERT (s
!= NULL
);
11561 if (!htab
->symbian_p
)
11562 dyn
.d_un
.d_ptr
= s
->vma
;
11564 /* In the BPABI, tags in the PT_DYNAMIC section point
11565 at the file offset, not the memory address, for the
11566 convenience of the post linker. */
11567 dyn
.d_un
.d_ptr
= s
->filepos
;
11568 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
11572 if (htab
->symbian_p
)
11577 s
= bfd_get_section_by_name (output_bfd
,
11578 RELOC_SECTION (htab
, ".plt"));
11579 BFD_ASSERT (s
!= NULL
);
11580 dyn
.d_un
.d_val
= s
->size
;
11581 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
11586 if (!htab
->symbian_p
)
11588 /* My reading of the SVR4 ABI indicates that the
11589 procedure linkage table relocs (DT_JMPREL) should be
11590 included in the overall relocs (DT_REL). This is
11591 what Solaris does. However, UnixWare can not handle
11592 that case. Therefore, we override the DT_RELSZ entry
11593 here to make it not include the JMPREL relocs. Since
11594 the linker script arranges for .rel(a).plt to follow all
11595 other relocation sections, we don't have to worry
11596 about changing the DT_REL entry. */
11597 s
= bfd_get_section_by_name (output_bfd
,
11598 RELOC_SECTION (htab
, ".plt"));
11600 dyn
.d_un
.d_val
-= s
->size
;
11601 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
11604 /* Fall through. */
11608 /* In the BPABI, the DT_REL tag must point at the file
11609 offset, not the VMA, of the first relocation
11610 section. So, we use code similar to that in
11611 elflink.c, but do not check for SHF_ALLOC on the
11612 relcoation section, since relocations sections are
11613 never allocated under the BPABI. The comments above
11614 about Unixware notwithstanding, we include all of the
11615 relocations here. */
11616 if (htab
->symbian_p
)
11619 type
= ((dyn
.d_tag
== DT_REL
|| dyn
.d_tag
== DT_RELSZ
)
11620 ? SHT_REL
: SHT_RELA
);
11621 dyn
.d_un
.d_val
= 0;
11622 for (i
= 1; i
< elf_numsections (output_bfd
); i
++)
11624 Elf_Internal_Shdr
*hdr
11625 = elf_elfsections (output_bfd
)[i
];
11626 if (hdr
->sh_type
== type
)
11628 if (dyn
.d_tag
== DT_RELSZ
11629 || dyn
.d_tag
== DT_RELASZ
)
11630 dyn
.d_un
.d_val
+= hdr
->sh_size
;
11631 else if ((ufile_ptr
) hdr
->sh_offset
11632 <= dyn
.d_un
.d_val
- 1)
11633 dyn
.d_un
.d_val
= hdr
->sh_offset
;
11636 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
11640 /* Set the bottom bit of DT_INIT/FINI if the
11641 corresponding function is Thumb. */
11643 name
= info
->init_function
;
11646 name
= info
->fini_function
;
11648 /* If it wasn't set by elf_bfd_final_link
11649 then there is nothing to adjust. */
11650 if (dyn
.d_un
.d_val
!= 0)
11652 struct elf_link_hash_entry
* eh
;
11654 eh
= elf_link_hash_lookup (elf_hash_table (info
), name
,
11655 FALSE
, FALSE
, TRUE
);
11657 && ELF_ST_TYPE (eh
->type
) == STT_ARM_TFUNC
)
11659 dyn
.d_un
.d_val
|= 1;
11660 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
11667 /* Fill in the first entry in the procedure linkage table. */
11668 if (splt
->size
> 0 && elf32_arm_hash_table (info
)->plt_header_size
)
11670 const bfd_vma
*plt0_entry
;
11671 bfd_vma got_address
, plt_address
, got_displacement
;
11673 /* Calculate the addresses of the GOT and PLT. */
11674 got_address
= sgot
->output_section
->vma
+ sgot
->output_offset
;
11675 plt_address
= splt
->output_section
->vma
+ splt
->output_offset
;
11677 if (htab
->vxworks_p
)
11679 /* The VxWorks GOT is relocated by the dynamic linker.
11680 Therefore, we must emit relocations rather than simply
11681 computing the values now. */
11682 Elf_Internal_Rela rel
;
11684 plt0_entry
= elf32_arm_vxworks_exec_plt0_entry
;
11685 put_arm_insn (htab
, output_bfd
, plt0_entry
[0],
11686 splt
->contents
+ 0);
11687 put_arm_insn (htab
, output_bfd
, plt0_entry
[1],
11688 splt
->contents
+ 4);
11689 put_arm_insn (htab
, output_bfd
, plt0_entry
[2],
11690 splt
->contents
+ 8);
11691 bfd_put_32 (output_bfd
, got_address
, splt
->contents
+ 12);
11693 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_. */
11694 rel
.r_offset
= plt_address
+ 12;
11695 rel
.r_info
= ELF32_R_INFO (htab
->root
.hgot
->indx
, R_ARM_ABS32
);
11697 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
,
11698 htab
->srelplt2
->contents
);
11702 got_displacement
= got_address
- (plt_address
+ 16);
11704 plt0_entry
= elf32_arm_plt0_entry
;
11705 put_arm_insn (htab
, output_bfd
, plt0_entry
[0],
11706 splt
->contents
+ 0);
11707 put_arm_insn (htab
, output_bfd
, plt0_entry
[1],
11708 splt
->contents
+ 4);
11709 put_arm_insn (htab
, output_bfd
, plt0_entry
[2],
11710 splt
->contents
+ 8);
11711 put_arm_insn (htab
, output_bfd
, plt0_entry
[3],
11712 splt
->contents
+ 12);
11714 #ifdef FOUR_WORD_PLT
11715 /* The displacement value goes in the otherwise-unused
11716 last word of the second entry. */
11717 bfd_put_32 (output_bfd
, got_displacement
, splt
->contents
+ 28);
11719 bfd_put_32 (output_bfd
, got_displacement
, splt
->contents
+ 16);
11724 /* UnixWare sets the entsize of .plt to 4, although that doesn't
11725 really seem like the right value. */
11726 if (splt
->output_section
->owner
== output_bfd
)
11727 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
= 4;
11729 if (htab
->vxworks_p
&& !info
->shared
&& htab
->splt
->size
> 0)
11731 /* Correct the .rel(a).plt.unloaded relocations. They will have
11732 incorrect symbol indexes. */
11736 num_plts
= ((htab
->splt
->size
- htab
->plt_header_size
)
11737 / htab
->plt_entry_size
);
11738 p
= htab
->srelplt2
->contents
+ RELOC_SIZE (htab
);
11740 for (; num_plts
; num_plts
--)
11742 Elf_Internal_Rela rel
;
11744 SWAP_RELOC_IN (htab
) (output_bfd
, p
, &rel
);
11745 rel
.r_info
= ELF32_R_INFO (htab
->root
.hgot
->indx
, R_ARM_ABS32
);
11746 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, p
);
11747 p
+= RELOC_SIZE (htab
);
11749 SWAP_RELOC_IN (htab
) (output_bfd
, p
, &rel
);
11750 rel
.r_info
= ELF32_R_INFO (htab
->root
.hplt
->indx
, R_ARM_ABS32
);
11751 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, p
);
11752 p
+= RELOC_SIZE (htab
);
11757 /* Fill in the first three entries in the global offset table. */
11760 if (sgot
->size
> 0)
11763 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
);
11765 bfd_put_32 (output_bfd
,
11766 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
11768 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 4);
11769 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 8);
11772 elf_section_data (sgot
->output_section
)->this_hdr
.sh_entsize
= 4;
11779 elf32_arm_post_process_headers (bfd
* abfd
, struct bfd_link_info
* link_info ATTRIBUTE_UNUSED
)
11781 Elf_Internal_Ehdr
* i_ehdrp
; /* ELF file header, internal form. */
11782 struct elf32_arm_link_hash_table
*globals
;
11784 i_ehdrp
= elf_elfheader (abfd
);
11786 if (EF_ARM_EABI_VERSION (i_ehdrp
->e_flags
) == EF_ARM_EABI_UNKNOWN
)
11787 i_ehdrp
->e_ident
[EI_OSABI
] = ELFOSABI_ARM
;
11789 i_ehdrp
->e_ident
[EI_OSABI
] = 0;
11790 i_ehdrp
->e_ident
[EI_ABIVERSION
] = ARM_ELF_ABI_VERSION
;
11794 globals
= elf32_arm_hash_table (link_info
);
11795 if (globals
->byteswap_code
)
11796 i_ehdrp
->e_flags
|= EF_ARM_BE8
;
11800 static enum elf_reloc_type_class
11801 elf32_arm_reloc_type_class (const Elf_Internal_Rela
*rela
)
11803 switch ((int) ELF32_R_TYPE (rela
->r_info
))
11805 case R_ARM_RELATIVE
:
11806 return reloc_class_relative
;
11807 case R_ARM_JUMP_SLOT
:
11808 return reloc_class_plt
;
11810 return reloc_class_copy
;
11812 return reloc_class_normal
;
11816 /* Set the right machine number for an Arm ELF file. */
11819 elf32_arm_section_flags (flagword
*flags
, const Elf_Internal_Shdr
*hdr
)
11821 if (hdr
->sh_type
== SHT_NOTE
)
11822 *flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_SAME_CONTENTS
;
11828 elf32_arm_final_write_processing (bfd
*abfd
, bfd_boolean linker ATTRIBUTE_UNUSED
)
11830 bfd_arm_update_notes (abfd
, ARM_NOTE_SECTION
);
11833 /* Return TRUE if this is an unwinding table entry. */
11836 is_arm_elf_unwind_section_name (bfd
* abfd ATTRIBUTE_UNUSED
, const char * name
)
11838 return (CONST_STRNEQ (name
, ELF_STRING_ARM_unwind
)
11839 || CONST_STRNEQ (name
, ELF_STRING_ARM_unwind_once
));
11843 /* Set the type and flags for an ARM section. We do this by
11844 the section name, which is a hack, but ought to work. */
11847 elf32_arm_fake_sections (bfd
* abfd
, Elf_Internal_Shdr
* hdr
, asection
* sec
)
11851 name
= bfd_get_section_name (abfd
, sec
);
11853 if (is_arm_elf_unwind_section_name (abfd
, name
))
11855 hdr
->sh_type
= SHT_ARM_EXIDX
;
11856 hdr
->sh_flags
|= SHF_LINK_ORDER
;
11861 /* Handle an ARM specific section when reading an object file. This is
11862 called when bfd_section_from_shdr finds a section with an unknown
11866 elf32_arm_section_from_shdr (bfd
*abfd
,
11867 Elf_Internal_Shdr
* hdr
,
11871 /* There ought to be a place to keep ELF backend specific flags, but
11872 at the moment there isn't one. We just keep track of the
11873 sections by their name, instead. Fortunately, the ABI gives
11874 names for all the ARM specific sections, so we will probably get
11876 switch (hdr
->sh_type
)
11878 case SHT_ARM_EXIDX
:
11879 case SHT_ARM_PREEMPTMAP
:
11880 case SHT_ARM_ATTRIBUTES
:
11887 if (! _bfd_elf_make_section_from_shdr (abfd
, hdr
, name
, shindex
))
11893 /* A structure used to record a list of sections, independently
11894 of the next and prev fields in the asection structure. */
11895 typedef struct section_list
11898 struct section_list
* next
;
11899 struct section_list
* prev
;
11903 /* Unfortunately we need to keep a list of sections for which
11904 an _arm_elf_section_data structure has been allocated. This
11905 is because it is possible for functions like elf32_arm_write_section
11906 to be called on a section which has had an elf_data_structure
11907 allocated for it (and so the used_by_bfd field is valid) but
11908 for which the ARM extended version of this structure - the
11909 _arm_elf_section_data structure - has not been allocated. */
11910 static section_list
* sections_with_arm_elf_section_data
= NULL
;
11913 record_section_with_arm_elf_section_data (asection
* sec
)
11915 struct section_list
* entry
;
11917 entry
= bfd_malloc (sizeof (* entry
));
11921 entry
->next
= sections_with_arm_elf_section_data
;
11922 entry
->prev
= NULL
;
11923 if (entry
->next
!= NULL
)
11924 entry
->next
->prev
= entry
;
11925 sections_with_arm_elf_section_data
= entry
;
11928 static struct section_list
*
11929 find_arm_elf_section_entry (asection
* sec
)
11931 struct section_list
* entry
;
11932 static struct section_list
* last_entry
= NULL
;
11934 /* This is a short cut for the typical case where the sections are added
11935 to the sections_with_arm_elf_section_data list in forward order and
11936 then looked up here in backwards order. This makes a real difference
11937 to the ld-srec/sec64k.exp linker test. */
11938 entry
= sections_with_arm_elf_section_data
;
11939 if (last_entry
!= NULL
)
11941 if (last_entry
->sec
== sec
)
11942 entry
= last_entry
;
11943 else if (last_entry
->next
!= NULL
11944 && last_entry
->next
->sec
== sec
)
11945 entry
= last_entry
->next
;
11948 for (; entry
; entry
= entry
->next
)
11949 if (entry
->sec
== sec
)
11953 /* Record the entry prior to this one - it is the entry we are most
11954 likely to want to locate next time. Also this way if we have been
11955 called from unrecord_section_with_arm_elf_section_data() we will not
11956 be caching a pointer that is about to be freed. */
11957 last_entry
= entry
->prev
;
11962 static _arm_elf_section_data
*
11963 get_arm_elf_section_data (asection
* sec
)
11965 struct section_list
* entry
;
11967 entry
= find_arm_elf_section_entry (sec
);
11970 return elf32_arm_section_data (entry
->sec
);
11976 unrecord_section_with_arm_elf_section_data (asection
* sec
)
11978 struct section_list
* entry
;
11980 entry
= find_arm_elf_section_entry (sec
);
11984 if (entry
->prev
!= NULL
)
11985 entry
->prev
->next
= entry
->next
;
11986 if (entry
->next
!= NULL
)
11987 entry
->next
->prev
= entry
->prev
;
11988 if (entry
== sections_with_arm_elf_section_data
)
11989 sections_with_arm_elf_section_data
= entry
->next
;
11998 struct bfd_link_info
*info
;
12001 int (*func
) (void *, const char *, Elf_Internal_Sym
*,
12002 asection
*, struct elf_link_hash_entry
*);
12003 } output_arch_syminfo
;
12005 enum map_symbol_type
12013 /* Output a single mapping symbol. */
12016 elf32_arm_output_map_sym (output_arch_syminfo
*osi
,
12017 enum map_symbol_type type
,
12020 static const char *names
[3] = {"$a", "$t", "$d"};
12021 struct elf32_arm_link_hash_table
*htab
;
12022 Elf_Internal_Sym sym
;
12024 htab
= elf32_arm_hash_table (osi
->info
);
12025 sym
.st_value
= osi
->sec
->output_section
->vma
12026 + osi
->sec
->output_offset
12030 sym
.st_info
= ELF_ST_INFO (STB_LOCAL
, STT_NOTYPE
);
12031 sym
.st_shndx
= osi
->sec_shndx
;
12032 return osi
->func (osi
->finfo
, names
[type
], &sym
, osi
->sec
, NULL
) == 1;
12036 /* Output mapping symbols for PLT entries associated with H. */
12039 elf32_arm_output_plt_map (struct elf_link_hash_entry
*h
, void *inf
)
12041 output_arch_syminfo
*osi
= (output_arch_syminfo
*) inf
;
12042 struct elf32_arm_link_hash_table
*htab
;
12043 struct elf32_arm_link_hash_entry
*eh
;
12046 htab
= elf32_arm_hash_table (osi
->info
);
12048 if (h
->root
.type
== bfd_link_hash_indirect
)
12051 if (h
->root
.type
== bfd_link_hash_warning
)
12052 /* When warning symbols are created, they **replace** the "real"
12053 entry in the hash table, thus we never get to see the real
12054 symbol in a hash traversal. So look at it now. */
12055 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
12057 if (h
->plt
.offset
== (bfd_vma
) -1)
12060 eh
= (struct elf32_arm_link_hash_entry
*) h
;
12061 addr
= h
->plt
.offset
;
12062 if (htab
->symbian_p
)
12064 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
))
12066 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 4))
12069 else if (htab
->vxworks_p
)
12071 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
))
12073 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 8))
12075 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
+ 12))
12077 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 20))
12082 bfd_signed_vma thumb_refs
;
12084 thumb_refs
= eh
->plt_thumb_refcount
;
12085 if (!htab
->use_blx
)
12086 thumb_refs
+= eh
->plt_maybe_thumb_refcount
;
12088 if (thumb_refs
> 0)
12090 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_THUMB
, addr
- 4))
12093 #ifdef FOUR_WORD_PLT
12094 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
))
12096 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 12))
12099 /* A three-word PLT with no Thumb thunk contains only Arm code,
12100 so only need to output a mapping symbol for the first PLT entry and
12101 entries with thumb thunks. */
12102 if (thumb_refs
> 0 || addr
== 20)
12104 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
))
12113 /* Output a single local symbol for a generated stub. */
12116 elf32_arm_output_stub_sym (output_arch_syminfo
*osi
, const char *name
,
12117 bfd_vma offset
, bfd_vma size
)
12119 struct elf32_arm_link_hash_table
*htab
;
12120 Elf_Internal_Sym sym
;
12122 htab
= elf32_arm_hash_table (osi
->info
);
12123 sym
.st_value
= osi
->sec
->output_section
->vma
12124 + osi
->sec
->output_offset
12126 sym
.st_size
= size
;
12128 sym
.st_info
= ELF_ST_INFO (STB_LOCAL
, STT_FUNC
);
12129 sym
.st_shndx
= osi
->sec_shndx
;
12130 return osi
->func (osi
->finfo
, name
, &sym
, osi
->sec
, NULL
) == 1;
12134 arm_map_one_stub (struct bfd_hash_entry
* gen_entry
,
12137 struct elf32_arm_stub_hash_entry
*stub_entry
;
12138 struct bfd_link_info
*info
;
12139 struct elf32_arm_link_hash_table
*htab
;
12140 asection
*stub_sec
;
12143 output_arch_syminfo
*osi
;
12144 const insn_sequence
*template;
12145 enum stub_insn_type prev_type
;
12148 enum map_symbol_type sym_type
;
12150 /* Massage our args to the form they really have. */
12151 stub_entry
= (struct elf32_arm_stub_hash_entry
*) gen_entry
;
12152 osi
= (output_arch_syminfo
*) in_arg
;
12156 htab
= elf32_arm_hash_table (info
);
12157 stub_sec
= stub_entry
->stub_sec
;
12159 /* Ensure this stub is attached to the current section being
12161 if (stub_sec
!= osi
->sec
)
12164 addr
= (bfd_vma
) stub_entry
->stub_offset
;
12165 stub_name
= stub_entry
->output_name
;
12167 template = stub_entry
->stub_template
;
12168 switch (template[0].type
)
12171 if (!elf32_arm_output_stub_sym (osi
, stub_name
, addr
, stub_entry
->stub_size
))
12175 if (!elf32_arm_output_stub_sym (osi
, stub_name
, addr
| 1,
12176 stub_entry
->stub_size
))
12184 prev_type
= DATA_TYPE
;
12186 for (i
= 0; i
< stub_entry
->stub_template_size
; i
++)
12188 switch (template[i
].type
)
12191 sym_type
= ARM_MAP_ARM
;
12195 sym_type
= ARM_MAP_THUMB
;
12199 sym_type
= ARM_MAP_DATA
;
12207 if (template[i
].type
!= prev_type
)
12209 prev_type
= template[i
].type
;
12210 if (!elf32_arm_output_map_sym (osi
, sym_type
, addr
+ size
))
12214 switch (template[i
].type
)
12237 /* Output mapping symbols for linker generated sections. */
12240 elf32_arm_output_arch_local_syms (bfd
*output_bfd
,
12241 struct bfd_link_info
*info
,
12243 int (*func
) (void *, const char *,
12244 Elf_Internal_Sym
*,
12246 struct elf_link_hash_entry
*))
12248 output_arch_syminfo osi
;
12249 struct elf32_arm_link_hash_table
*htab
;
12251 bfd_size_type size
;
12253 htab
= elf32_arm_hash_table (info
);
12254 check_use_blx (htab
);
12260 /* ARM->Thumb glue. */
12261 if (htab
->arm_glue_size
> 0)
12263 osi
.sec
= bfd_get_section_by_name (htab
->bfd_of_glue_owner
,
12264 ARM2THUMB_GLUE_SECTION_NAME
);
12266 osi
.sec_shndx
= _bfd_elf_section_from_bfd_section
12267 (output_bfd
, osi
.sec
->output_section
);
12268 if (info
->shared
|| htab
->root
.is_relocatable_executable
12269 || htab
->pic_veneer
)
12270 size
= ARM2THUMB_PIC_GLUE_SIZE
;
12271 else if (htab
->use_blx
)
12272 size
= ARM2THUMB_V5_STATIC_GLUE_SIZE
;
12274 size
= ARM2THUMB_STATIC_GLUE_SIZE
;
12276 for (offset
= 0; offset
< htab
->arm_glue_size
; offset
+= size
)
12278 elf32_arm_output_map_sym (&osi
, ARM_MAP_ARM
, offset
);
12279 elf32_arm_output_map_sym (&osi
, ARM_MAP_DATA
, offset
+ size
- 4);
12283 /* Thumb->ARM glue. */
12284 if (htab
->thumb_glue_size
> 0)
12286 osi
.sec
= bfd_get_section_by_name (htab
->bfd_of_glue_owner
,
12287 THUMB2ARM_GLUE_SECTION_NAME
);
12289 osi
.sec_shndx
= _bfd_elf_section_from_bfd_section
12290 (output_bfd
, osi
.sec
->output_section
);
12291 size
= THUMB2ARM_GLUE_SIZE
;
12293 for (offset
= 0; offset
< htab
->thumb_glue_size
; offset
+= size
)
12295 elf32_arm_output_map_sym (&osi
, ARM_MAP_THUMB
, offset
);
12296 elf32_arm_output_map_sym (&osi
, ARM_MAP_ARM
, offset
+ 4);
12300 /* ARMv4 BX veneers. */
12301 if (htab
->bx_glue_size
> 0)
12303 osi
.sec
= bfd_get_section_by_name (htab
->bfd_of_glue_owner
,
12304 ARM_BX_GLUE_SECTION_NAME
);
12306 osi
.sec_shndx
= _bfd_elf_section_from_bfd_section
12307 (output_bfd
, osi
.sec
->output_section
);
12309 elf32_arm_output_map_sym (&osi
, ARM_MAP_ARM
, 0);
12312 /* Long calls stubs. */
12313 if (htab
->stub_bfd
&& htab
->stub_bfd
->sections
)
12315 asection
* stub_sec
;
12317 for (stub_sec
= htab
->stub_bfd
->sections
;
12319 stub_sec
= stub_sec
->next
)
12321 /* Ignore non-stub sections. */
12322 if (!strstr (stub_sec
->name
, STUB_SUFFIX
))
12325 osi
.sec
= stub_sec
;
12327 osi
.sec_shndx
= _bfd_elf_section_from_bfd_section
12328 (output_bfd
, osi
.sec
->output_section
);
12330 bfd_hash_traverse (&htab
->stub_hash_table
, arm_map_one_stub
, &osi
);
12334 /* Finally, output mapping symbols for the PLT. */
12335 if (!htab
->splt
|| htab
->splt
->size
== 0)
12338 osi
.sec_shndx
= _bfd_elf_section_from_bfd_section (output_bfd
,
12339 htab
->splt
->output_section
);
12340 osi
.sec
= htab
->splt
;
12341 /* Output mapping symbols for the plt header. SymbianOS does not have a
12343 if (htab
->vxworks_p
)
12345 /* VxWorks shared libraries have no PLT header. */
12348 if (!elf32_arm_output_map_sym (&osi
, ARM_MAP_ARM
, 0))
12350 if (!elf32_arm_output_map_sym (&osi
, ARM_MAP_DATA
, 12))
12354 else if (!htab
->symbian_p
)
12356 if (!elf32_arm_output_map_sym (&osi
, ARM_MAP_ARM
, 0))
12358 #ifndef FOUR_WORD_PLT
12359 if (!elf32_arm_output_map_sym (&osi
, ARM_MAP_DATA
, 16))
12364 elf_link_hash_traverse (&htab
->root
, elf32_arm_output_plt_map
, (void *) &osi
);
12368 /* Allocate target specific section data. */
12371 elf32_arm_new_section_hook (bfd
*abfd
, asection
*sec
)
12373 if (!sec
->used_by_bfd
)
12375 _arm_elf_section_data
*sdata
;
12376 bfd_size_type amt
= sizeof (*sdata
);
12378 sdata
= bfd_zalloc (abfd
, amt
);
12381 sec
->used_by_bfd
= sdata
;
12384 record_section_with_arm_elf_section_data (sec
);
12386 return _bfd_elf_new_section_hook (abfd
, sec
);
12390 /* Used to order a list of mapping symbols by address. */
12393 elf32_arm_compare_mapping (const void * a
, const void * b
)
12395 const elf32_arm_section_map
*amap
= (const elf32_arm_section_map
*) a
;
12396 const elf32_arm_section_map
*bmap
= (const elf32_arm_section_map
*) b
;
12398 if (amap
->vma
> bmap
->vma
)
12400 else if (amap
->vma
< bmap
->vma
)
12402 else if (amap
->type
> bmap
->type
)
12403 /* Ensure results do not depend on the host qsort for objects with
12404 multiple mapping symbols at the same address by sorting on type
12407 else if (amap
->type
< bmap
->type
)
12413 /* Add OFFSET to lower 31 bits of ADDR, leaving other bits unmodified. */
12415 static unsigned long
12416 offset_prel31 (unsigned long addr
, bfd_vma offset
)
12418 return (addr
& ~0x7ffffffful
) | ((addr
+ offset
) & 0x7ffffffful
);
12421 /* Copy an .ARM.exidx table entry, adding OFFSET to (applied) PREL31
12425 copy_exidx_entry (bfd
*output_bfd
, bfd_byte
*to
, bfd_byte
*from
, bfd_vma offset
)
12427 unsigned long first_word
= bfd_get_32 (output_bfd
, from
);
12428 unsigned long second_word
= bfd_get_32 (output_bfd
, from
+ 4);
12430 /* High bit of first word is supposed to be zero. */
12431 if ((first_word
& 0x80000000ul
) == 0)
12432 first_word
= offset_prel31 (first_word
, offset
);
12434 /* If the high bit of the first word is clear, and the bit pattern is not 0x1
12435 (EXIDX_CANTUNWIND), this is an offset to an .ARM.extab entry. */
12436 if ((second_word
!= 0x1) && ((second_word
& 0x80000000ul
) == 0))
12437 second_word
= offset_prel31 (second_word
, offset
);
12439 bfd_put_32 (output_bfd
, first_word
, to
);
12440 bfd_put_32 (output_bfd
, second_word
, to
+ 4);
12443 /* Do code byteswapping. Return FALSE afterwards so that the section is
12444 written out as normal. */
12447 elf32_arm_write_section (bfd
*output_bfd
,
12448 struct bfd_link_info
*link_info
,
12450 bfd_byte
*contents
)
12452 int mapcount
, errcount
;
12453 _arm_elf_section_data
*arm_data
;
12454 struct elf32_arm_link_hash_table
*globals
= elf32_arm_hash_table (link_info
);
12455 elf32_arm_section_map
*map
;
12456 elf32_vfp11_erratum_list
*errnode
;
12459 bfd_vma offset
= sec
->output_section
->vma
+ sec
->output_offset
;
12463 /* If this section has not been allocated an _arm_elf_section_data
12464 structure then we cannot record anything. */
12465 arm_data
= get_arm_elf_section_data (sec
);
12466 if (arm_data
== NULL
)
12469 mapcount
= arm_data
->mapcount
;
12470 map
= arm_data
->map
;
12471 errcount
= arm_data
->erratumcount
;
12475 unsigned int endianflip
= bfd_big_endian (output_bfd
) ? 3 : 0;
12477 for (errnode
= arm_data
->erratumlist
; errnode
!= 0;
12478 errnode
= errnode
->next
)
12480 bfd_vma index
= errnode
->vma
- offset
;
12482 switch (errnode
->type
)
12484 case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER
:
12486 bfd_vma branch_to_veneer
;
12487 /* Original condition code of instruction, plus bit mask for
12488 ARM B instruction. */
12489 unsigned int insn
= (errnode
->u
.b
.vfp_insn
& 0xf0000000)
12492 /* The instruction is before the label. */
12495 /* Above offset included in -4 below. */
12496 branch_to_veneer
= errnode
->u
.b
.veneer
->vma
12497 - errnode
->vma
- 4;
12499 if ((signed) branch_to_veneer
< -(1 << 25)
12500 || (signed) branch_to_veneer
>= (1 << 25))
12501 (*_bfd_error_handler
) (_("%B: error: VFP11 veneer out of "
12502 "range"), output_bfd
);
12504 insn
|= (branch_to_veneer
>> 2) & 0xffffff;
12505 contents
[endianflip
^ index
] = insn
& 0xff;
12506 contents
[endianflip
^ (index
+ 1)] = (insn
>> 8) & 0xff;
12507 contents
[endianflip
^ (index
+ 2)] = (insn
>> 16) & 0xff;
12508 contents
[endianflip
^ (index
+ 3)] = (insn
>> 24) & 0xff;
12512 case VFP11_ERRATUM_ARM_VENEER
:
12514 bfd_vma branch_from_veneer
;
12517 /* Take size of veneer into account. */
12518 branch_from_veneer
= errnode
->u
.v
.branch
->vma
12519 - errnode
->vma
- 12;
12521 if ((signed) branch_from_veneer
< -(1 << 25)
12522 || (signed) branch_from_veneer
>= (1 << 25))
12523 (*_bfd_error_handler
) (_("%B: error: VFP11 veneer out of "
12524 "range"), output_bfd
);
12526 /* Original instruction. */
12527 insn
= errnode
->u
.v
.branch
->u
.b
.vfp_insn
;
12528 contents
[endianflip
^ index
] = insn
& 0xff;
12529 contents
[endianflip
^ (index
+ 1)] = (insn
>> 8) & 0xff;
12530 contents
[endianflip
^ (index
+ 2)] = (insn
>> 16) & 0xff;
12531 contents
[endianflip
^ (index
+ 3)] = (insn
>> 24) & 0xff;
12533 /* Branch back to insn after original insn. */
12534 insn
= 0xea000000 | ((branch_from_veneer
>> 2) & 0xffffff);
12535 contents
[endianflip
^ (index
+ 4)] = insn
& 0xff;
12536 contents
[endianflip
^ (index
+ 5)] = (insn
>> 8) & 0xff;
12537 contents
[endianflip
^ (index
+ 6)] = (insn
>> 16) & 0xff;
12538 contents
[endianflip
^ (index
+ 7)] = (insn
>> 24) & 0xff;
12548 if (arm_data
->elf
.this_hdr
.sh_type
== SHT_ARM_EXIDX
)
12550 arm_unwind_table_edit
*edit_node
12551 = arm_data
->u
.exidx
.unwind_edit_list
;
12552 /* Now, sec->size is the size of the section we will write. The original
12553 size (before we merged duplicate entries and inserted EXIDX_CANTUNWIND
12554 markers) was sec->rawsize. (This isn't the case if we perform no
12555 edits, then rawsize will be zero and we should use size). */
12556 bfd_byte
*edited_contents
= bfd_malloc (sec
->size
);
12557 unsigned int input_size
= sec
->rawsize
? sec
->rawsize
: sec
->size
;
12558 unsigned int in_index
, out_index
;
12559 bfd_vma add_to_offsets
= 0;
12561 for (in_index
= 0, out_index
= 0; in_index
* 8 < input_size
|| edit_node
;)
12565 unsigned int edit_index
= edit_node
->index
;
12567 if (in_index
< edit_index
&& in_index
* 8 < input_size
)
12569 copy_exidx_entry (output_bfd
, edited_contents
+ out_index
* 8,
12570 contents
+ in_index
* 8, add_to_offsets
);
12574 else if (in_index
== edit_index
12575 || (in_index
* 8 >= input_size
12576 && edit_index
== UINT_MAX
))
12578 switch (edit_node
->type
)
12580 case DELETE_EXIDX_ENTRY
:
12582 add_to_offsets
+= 8;
12585 case INSERT_EXIDX_CANTUNWIND_AT_END
:
12587 asection
*text_sec
= edit_node
->linked_section
;
12588 bfd_vma text_offset
= text_sec
->output_section
->vma
12589 + text_sec
->output_offset
12591 bfd_vma exidx_offset
= offset
+ out_index
* 8;
12592 unsigned long prel31_offset
;
12594 /* Note: this is meant to be equivalent to an
12595 R_ARM_PREL31 relocation. These synthetic
12596 EXIDX_CANTUNWIND markers are not relocated by the
12597 usual BFD method. */
12598 prel31_offset
= (text_offset
- exidx_offset
)
12601 /* First address we can't unwind. */
12602 bfd_put_32 (output_bfd
, prel31_offset
,
12603 &edited_contents
[out_index
* 8]);
12605 /* Code for EXIDX_CANTUNWIND. */
12606 bfd_put_32 (output_bfd
, 0x1,
12607 &edited_contents
[out_index
* 8 + 4]);
12610 add_to_offsets
-= 8;
12615 edit_node
= edit_node
->next
;
12620 /* No more edits, copy remaining entries verbatim. */
12621 copy_exidx_entry (output_bfd
, edited_contents
+ out_index
* 8,
12622 contents
+ in_index
* 8, add_to_offsets
);
12628 if (!(sec
->flags
& SEC_EXCLUDE
) && !(sec
->flags
& SEC_NEVER_LOAD
))
12629 bfd_set_section_contents (output_bfd
, sec
->output_section
,
12631 (file_ptr
) sec
->output_offset
, sec
->size
);
12639 if (globals
->byteswap_code
)
12641 qsort (map
, mapcount
, sizeof (* map
), elf32_arm_compare_mapping
);
12644 for (i
= 0; i
< mapcount
; i
++)
12646 if (i
== mapcount
- 1)
12649 end
= map
[i
+ 1].vma
;
12651 switch (map
[i
].type
)
12654 /* Byte swap code words. */
12655 while (ptr
+ 3 < end
)
12657 tmp
= contents
[ptr
];
12658 contents
[ptr
] = contents
[ptr
+ 3];
12659 contents
[ptr
+ 3] = tmp
;
12660 tmp
= contents
[ptr
+ 1];
12661 contents
[ptr
+ 1] = contents
[ptr
+ 2];
12662 contents
[ptr
+ 2] = tmp
;
12668 /* Byte swap code halfwords. */
12669 while (ptr
+ 1 < end
)
12671 tmp
= contents
[ptr
];
12672 contents
[ptr
] = contents
[ptr
+ 1];
12673 contents
[ptr
+ 1] = tmp
;
12679 /* Leave data alone. */
12687 arm_data
->mapcount
= 0;
12688 arm_data
->mapsize
= 0;
12689 arm_data
->map
= NULL
;
12690 unrecord_section_with_arm_elf_section_data (sec
);
12696 unrecord_section_via_map_over_sections (bfd
* abfd ATTRIBUTE_UNUSED
,
12698 void * ignore ATTRIBUTE_UNUSED
)
12700 unrecord_section_with_arm_elf_section_data (sec
);
12704 elf32_arm_close_and_cleanup (bfd
* abfd
)
12706 if (abfd
->sections
)
12707 bfd_map_over_sections (abfd
,
12708 unrecord_section_via_map_over_sections
,
12711 return _bfd_elf_close_and_cleanup (abfd
);
12715 elf32_arm_bfd_free_cached_info (bfd
* abfd
)
12717 if (abfd
->sections
)
12718 bfd_map_over_sections (abfd
,
12719 unrecord_section_via_map_over_sections
,
12722 return _bfd_free_cached_info (abfd
);
12725 /* Display STT_ARM_TFUNC symbols as functions. */
12728 elf32_arm_symbol_processing (bfd
*abfd ATTRIBUTE_UNUSED
,
12731 elf_symbol_type
*elfsym
= (elf_symbol_type
*) asym
;
12733 if (ELF_ST_TYPE (elfsym
->internal_elf_sym
.st_info
) == STT_ARM_TFUNC
)
12734 elfsym
->symbol
.flags
|= BSF_FUNCTION
;
12738 /* Mangle thumb function symbols as we read them in. */
12741 elf32_arm_swap_symbol_in (bfd
* abfd
,
12744 Elf_Internal_Sym
*dst
)
12746 if (!bfd_elf32_swap_symbol_in (abfd
, psrc
, pshn
, dst
))
12749 /* New EABI objects mark thumb function symbols by setting the low bit of
12750 the address. Turn these into STT_ARM_TFUNC. */
12751 if ((ELF_ST_TYPE (dst
->st_info
) == STT_FUNC
)
12752 && (dst
->st_value
& 1))
12754 dst
->st_info
= ELF_ST_INFO (ELF_ST_BIND (dst
->st_info
), STT_ARM_TFUNC
);
12755 dst
->st_value
&= ~(bfd_vma
) 1;
12761 /* Mangle thumb function symbols as we write them out. */
12764 elf32_arm_swap_symbol_out (bfd
*abfd
,
12765 const Elf_Internal_Sym
*src
,
12769 Elf_Internal_Sym newsym
;
12771 /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
12772 of the address set, as per the new EABI. We do this unconditionally
12773 because objcopy does not set the elf header flags until after
12774 it writes out the symbol table. */
12775 if (ELF_ST_TYPE (src
->st_info
) == STT_ARM_TFUNC
)
12778 newsym
.st_info
= ELF_ST_INFO (ELF_ST_BIND (src
->st_info
), STT_FUNC
);
12779 if (newsym
.st_shndx
!= SHN_UNDEF
)
12781 /* Do this only for defined symbols. At link type, the static
12782 linker will simulate the work of dynamic linker of resolving
12783 symbols and will carry over the thumbness of found symbols to
12784 the output symbol table. It's not clear how it happens, but
12785 the thumbness of undefined symbols can well be different at
12786 runtime, and writing '1' for them will be confusing for users
12787 and possibly for dynamic linker itself.
12789 newsym
.st_value
|= 1;
12794 bfd_elf32_swap_symbol_out (abfd
, src
, cdst
, shndx
);
12797 /* Add the PT_ARM_EXIDX program header. */
12800 elf32_arm_modify_segment_map (bfd
*abfd
,
12801 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
12803 struct elf_segment_map
*m
;
12806 sec
= bfd_get_section_by_name (abfd
, ".ARM.exidx");
12807 if (sec
!= NULL
&& (sec
->flags
& SEC_LOAD
) != 0)
12809 /* If there is already a PT_ARM_EXIDX header, then we do not
12810 want to add another one. This situation arises when running
12811 "strip"; the input binary already has the header. */
12812 m
= elf_tdata (abfd
)->segment_map
;
12813 while (m
&& m
->p_type
!= PT_ARM_EXIDX
)
12817 m
= bfd_zalloc (abfd
, sizeof (struct elf_segment_map
));
12820 m
->p_type
= PT_ARM_EXIDX
;
12822 m
->sections
[0] = sec
;
12824 m
->next
= elf_tdata (abfd
)->segment_map
;
12825 elf_tdata (abfd
)->segment_map
= m
;
12832 /* We may add a PT_ARM_EXIDX program header. */
12835 elf32_arm_additional_program_headers (bfd
*abfd
,
12836 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
12840 sec
= bfd_get_section_by_name (abfd
, ".ARM.exidx");
12841 if (sec
!= NULL
&& (sec
->flags
& SEC_LOAD
) != 0)
12847 /* We have two function types: STT_FUNC and STT_ARM_TFUNC. */
12850 elf32_arm_is_function_type (unsigned int type
)
12852 return (type
== STT_FUNC
) || (type
== STT_ARM_TFUNC
);
12855 /* We use this to override swap_symbol_in and swap_symbol_out. */
12856 const struct elf_size_info elf32_arm_size_info
=
12858 sizeof (Elf32_External_Ehdr
),
12859 sizeof (Elf32_External_Phdr
),
12860 sizeof (Elf32_External_Shdr
),
12861 sizeof (Elf32_External_Rel
),
12862 sizeof (Elf32_External_Rela
),
12863 sizeof (Elf32_External_Sym
),
12864 sizeof (Elf32_External_Dyn
),
12865 sizeof (Elf_External_Note
),
12869 ELFCLASS32
, EV_CURRENT
,
12870 bfd_elf32_write_out_phdrs
,
12871 bfd_elf32_write_shdrs_and_ehdr
,
12872 bfd_elf32_checksum_contents
,
12873 bfd_elf32_write_relocs
,
12874 elf32_arm_swap_symbol_in
,
12875 elf32_arm_swap_symbol_out
,
12876 bfd_elf32_slurp_reloc_table
,
12877 bfd_elf32_slurp_symbol_table
,
12878 bfd_elf32_swap_dyn_in
,
12879 bfd_elf32_swap_dyn_out
,
12880 bfd_elf32_swap_reloc_in
,
12881 bfd_elf32_swap_reloc_out
,
12882 bfd_elf32_swap_reloca_in
,
12883 bfd_elf32_swap_reloca_out
12886 #define ELF_ARCH bfd_arch_arm
12887 #define ELF_MACHINE_CODE EM_ARM
12888 #ifdef __QNXTARGET__
12889 #define ELF_MAXPAGESIZE 0x1000
12891 #define ELF_MAXPAGESIZE 0x8000
12893 #define ELF_MINPAGESIZE 0x1000
12894 #define ELF_COMMONPAGESIZE 0x1000
12896 #define bfd_elf32_mkobject elf32_arm_mkobject
12898 #define bfd_elf32_bfd_copy_private_bfd_data elf32_arm_copy_private_bfd_data
12899 #define bfd_elf32_bfd_merge_private_bfd_data elf32_arm_merge_private_bfd_data
12900 #define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
12901 #define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
12902 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
12903 #define bfd_elf32_bfd_link_hash_table_free elf32_arm_hash_table_free
12904 #define bfd_elf32_bfd_reloc_type_lookup elf32_arm_reloc_type_lookup
12905 #define bfd_elf32_bfd_reloc_name_lookup elf32_arm_reloc_name_lookup
12906 #define bfd_elf32_find_nearest_line elf32_arm_find_nearest_line
12907 #define bfd_elf32_find_inliner_info elf32_arm_find_inliner_info
12908 #define bfd_elf32_new_section_hook elf32_arm_new_section_hook
12909 #define bfd_elf32_bfd_is_target_special_symbol elf32_arm_is_target_special_symbol
12910 #define bfd_elf32_close_and_cleanup elf32_arm_close_and_cleanup
12911 #define bfd_elf32_bfd_free_cached_info elf32_arm_bfd_free_cached_info
12912 #define bfd_elf32_bfd_final_link elf32_arm_final_link
12914 #define elf_backend_get_symbol_type elf32_arm_get_symbol_type
12915 #define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook
12916 #define elf_backend_gc_mark_extra_sections elf32_arm_gc_mark_extra_sections
12917 #define elf_backend_gc_sweep_hook elf32_arm_gc_sweep_hook
12918 #define elf_backend_check_relocs elf32_arm_check_relocs
12919 #define elf_backend_relocate_section elf32_arm_relocate_section
12920 #define elf_backend_write_section elf32_arm_write_section
12921 #define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol
12922 #define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections
12923 #define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol
12924 #define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections
12925 #define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections
12926 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections
12927 #define elf_backend_post_process_headers elf32_arm_post_process_headers
12928 #define elf_backend_reloc_type_class elf32_arm_reloc_type_class
12929 #define elf_backend_object_p elf32_arm_object_p
12930 #define elf_backend_section_flags elf32_arm_section_flags
12931 #define elf_backend_fake_sections elf32_arm_fake_sections
12932 #define elf_backend_section_from_shdr elf32_arm_section_from_shdr
12933 #define elf_backend_final_write_processing elf32_arm_final_write_processing
12934 #define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol
12935 #define elf_backend_symbol_processing elf32_arm_symbol_processing
12936 #define elf_backend_size_info elf32_arm_size_info
12937 #define elf_backend_modify_segment_map elf32_arm_modify_segment_map
12938 #define elf_backend_additional_program_headers elf32_arm_additional_program_headers
12939 #define elf_backend_output_arch_local_syms elf32_arm_output_arch_local_syms
12940 #define elf_backend_begin_write_processing elf32_arm_begin_write_processing
12941 #define elf_backend_is_function_type elf32_arm_is_function_type
12943 #define elf_backend_can_refcount 1
12944 #define elf_backend_can_gc_sections 1
12945 #define elf_backend_plt_readonly 1
12946 #define elf_backend_want_got_plt 1
12947 #define elf_backend_want_plt_sym 0
12948 #define elf_backend_may_use_rel_p 1
12949 #define elf_backend_may_use_rela_p 0
12950 #define elf_backend_default_use_rela_p 0
12952 #define elf_backend_got_header_size 12
12954 #undef elf_backend_obj_attrs_vendor
12955 #define elf_backend_obj_attrs_vendor "aeabi"
12956 #undef elf_backend_obj_attrs_section
12957 #define elf_backend_obj_attrs_section ".ARM.attributes"
12958 #undef elf_backend_obj_attrs_arg_type
12959 #define elf_backend_obj_attrs_arg_type elf32_arm_obj_attrs_arg_type
12960 #undef elf_backend_obj_attrs_section_type
12961 #define elf_backend_obj_attrs_section_type SHT_ARM_ATTRIBUTES
12962 #define elf_backend_obj_attrs_order elf32_arm_obj_attrs_order
12964 #include "elf32-target.h"
12966 /* VxWorks Targets. */
12968 #undef TARGET_LITTLE_SYM
12969 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vxworks_vec
12970 #undef TARGET_LITTLE_NAME
12971 #define TARGET_LITTLE_NAME "elf32-littlearm-vxworks"
12972 #undef TARGET_BIG_SYM
12973 #define TARGET_BIG_SYM bfd_elf32_bigarm_vxworks_vec
12974 #undef TARGET_BIG_NAME
12975 #define TARGET_BIG_NAME "elf32-bigarm-vxworks"
12977 /* Like elf32_arm_link_hash_table_create -- but overrides
12978 appropriately for VxWorks. */
12980 static struct bfd_link_hash_table
*
12981 elf32_arm_vxworks_link_hash_table_create (bfd
*abfd
)
12983 struct bfd_link_hash_table
*ret
;
12985 ret
= elf32_arm_link_hash_table_create (abfd
);
12988 struct elf32_arm_link_hash_table
*htab
12989 = (struct elf32_arm_link_hash_table
*) ret
;
12991 htab
->vxworks_p
= 1;
12997 elf32_arm_vxworks_final_write_processing (bfd
*abfd
, bfd_boolean linker
)
12999 elf32_arm_final_write_processing (abfd
, linker
);
13000 elf_vxworks_final_write_processing (abfd
, linker
);
13004 #define elf32_bed elf32_arm_vxworks_bed
13006 #undef bfd_elf32_bfd_link_hash_table_create
13007 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_vxworks_link_hash_table_create
13008 #undef elf_backend_add_symbol_hook
13009 #define elf_backend_add_symbol_hook elf_vxworks_add_symbol_hook
13010 #undef elf_backend_final_write_processing
13011 #define elf_backend_final_write_processing elf32_arm_vxworks_final_write_processing
13012 #undef elf_backend_emit_relocs
13013 #define elf_backend_emit_relocs elf_vxworks_emit_relocs
13015 #undef elf_backend_may_use_rel_p
13016 #define elf_backend_may_use_rel_p 0
13017 #undef elf_backend_may_use_rela_p
13018 #define elf_backend_may_use_rela_p 1
13019 #undef elf_backend_default_use_rela_p
13020 #define elf_backend_default_use_rela_p 1
13021 #undef elf_backend_want_plt_sym
13022 #define elf_backend_want_plt_sym 1
13023 #undef ELF_MAXPAGESIZE
13024 #define ELF_MAXPAGESIZE 0x1000
13026 #include "elf32-target.h"
13029 /* Symbian OS Targets. */
13031 #undef TARGET_LITTLE_SYM
13032 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_symbian_vec
13033 #undef TARGET_LITTLE_NAME
13034 #define TARGET_LITTLE_NAME "elf32-littlearm-symbian"
13035 #undef TARGET_BIG_SYM
13036 #define TARGET_BIG_SYM bfd_elf32_bigarm_symbian_vec
13037 #undef TARGET_BIG_NAME
13038 #define TARGET_BIG_NAME "elf32-bigarm-symbian"
13040 /* Like elf32_arm_link_hash_table_create -- but overrides
13041 appropriately for Symbian OS. */
13043 static struct bfd_link_hash_table
*
13044 elf32_arm_symbian_link_hash_table_create (bfd
*abfd
)
13046 struct bfd_link_hash_table
*ret
;
13048 ret
= elf32_arm_link_hash_table_create (abfd
);
13051 struct elf32_arm_link_hash_table
*htab
13052 = (struct elf32_arm_link_hash_table
*)ret
;
13053 /* There is no PLT header for Symbian OS. */
13054 htab
->plt_header_size
= 0;
13055 /* The PLT entries are each one instruction and one word. */
13056 htab
->plt_entry_size
= 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry
);
13057 htab
->symbian_p
= 1;
13058 /* Symbian uses armv5t or above, so use_blx is always true. */
13060 htab
->root
.is_relocatable_executable
= 1;
13065 static const struct bfd_elf_special_section
13066 elf32_arm_symbian_special_sections
[] =
13068 /* In a BPABI executable, the dynamic linking sections do not go in
13069 the loadable read-only segment. The post-linker may wish to
13070 refer to these sections, but they are not part of the final
13072 { STRING_COMMA_LEN (".dynamic"), 0, SHT_DYNAMIC
, 0 },
13073 { STRING_COMMA_LEN (".dynstr"), 0, SHT_STRTAB
, 0 },
13074 { STRING_COMMA_LEN (".dynsym"), 0, SHT_DYNSYM
, 0 },
13075 { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS
, 0 },
13076 { STRING_COMMA_LEN (".hash"), 0, SHT_HASH
, 0 },
13077 /* These sections do not need to be writable as the SymbianOS
13078 postlinker will arrange things so that no dynamic relocation is
13080 { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY
, SHF_ALLOC
},
13081 { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY
, SHF_ALLOC
},
13082 { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY
, SHF_ALLOC
},
13083 { NULL
, 0, 0, 0, 0 }
13087 elf32_arm_symbian_begin_write_processing (bfd
*abfd
,
13088 struct bfd_link_info
*link_info
)
13090 /* BPABI objects are never loaded directly by an OS kernel; they are
13091 processed by a postlinker first, into an OS-specific format. If
13092 the D_PAGED bit is set on the file, BFD will align segments on
13093 page boundaries, so that an OS can directly map the file. With
13094 BPABI objects, that just results in wasted space. In addition,
13095 because we clear the D_PAGED bit, map_sections_to_segments will
13096 recognize that the program headers should not be mapped into any
13097 loadable segment. */
13098 abfd
->flags
&= ~D_PAGED
;
13099 elf32_arm_begin_write_processing (abfd
, link_info
);
13103 elf32_arm_symbian_modify_segment_map (bfd
*abfd
,
13104 struct bfd_link_info
*info
)
13106 struct elf_segment_map
*m
;
13109 /* BPABI shared libraries and executables should have a PT_DYNAMIC
13110 segment. However, because the .dynamic section is not marked
13111 with SEC_LOAD, the generic ELF code will not create such a
13113 dynsec
= bfd_get_section_by_name (abfd
, ".dynamic");
13116 for (m
= elf_tdata (abfd
)->segment_map
; m
!= NULL
; m
= m
->next
)
13117 if (m
->p_type
== PT_DYNAMIC
)
13122 m
= _bfd_elf_make_dynamic_segment (abfd
, dynsec
);
13123 m
->next
= elf_tdata (abfd
)->segment_map
;
13124 elf_tdata (abfd
)->segment_map
= m
;
13128 /* Also call the generic arm routine. */
13129 return elf32_arm_modify_segment_map (abfd
, info
);
13132 /* Return address for Ith PLT stub in section PLT, for relocation REL
13133 or (bfd_vma) -1 if it should not be included. */
13136 elf32_arm_symbian_plt_sym_val (bfd_vma i
, const asection
*plt
,
13137 const arelent
*rel ATTRIBUTE_UNUSED
)
13139 return plt
->vma
+ 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry
) * i
;
13144 #define elf32_bed elf32_arm_symbian_bed
13146 /* The dynamic sections are not allocated on SymbianOS; the postlinker
13147 will process them and then discard them. */
13148 #undef ELF_DYNAMIC_SEC_FLAGS
13149 #define ELF_DYNAMIC_SEC_FLAGS \
13150 (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
13152 #undef elf_backend_add_symbol_hook
13153 #undef elf_backend_emit_relocs
13155 #undef bfd_elf32_bfd_link_hash_table_create
13156 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_symbian_link_hash_table_create
13157 #undef elf_backend_special_sections
13158 #define elf_backend_special_sections elf32_arm_symbian_special_sections
13159 #undef elf_backend_begin_write_processing
13160 #define elf_backend_begin_write_processing elf32_arm_symbian_begin_write_processing
13161 #undef elf_backend_final_write_processing
13162 #define elf_backend_final_write_processing elf32_arm_final_write_processing
13164 #undef elf_backend_modify_segment_map
13165 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
13167 /* There is no .got section for BPABI objects, and hence no header. */
13168 #undef elf_backend_got_header_size
13169 #define elf_backend_got_header_size 0
13171 /* Similarly, there is no .got.plt section. */
13172 #undef elf_backend_want_got_plt
13173 #define elf_backend_want_got_plt 0
13175 #undef elf_backend_plt_sym_val
13176 #define elf_backend_plt_sym_val elf32_arm_symbian_plt_sym_val
13178 #undef elf_backend_may_use_rel_p
13179 #define elf_backend_may_use_rel_p 1
13180 #undef elf_backend_may_use_rela_p
13181 #define elf_backend_may_use_rela_p 0
13182 #undef elf_backend_default_use_rela_p
13183 #define elf_backend_default_use_rela_p 0
13184 #undef elf_backend_want_plt_sym
13185 #define elf_backend_want_plt_sym 0
13186 #undef ELF_MAXPAGESIZE
13187 #define ELF_MAXPAGESIZE 0x8000
13189 #include "elf32-target.h"