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. */
24 #include "libiberty.h"
27 #include "elf-vxworks.h"
30 /* Return the relocation section associated with NAME. HTAB is the
31 bfd's elf32_arm_link_hash_entry. */
32 #define RELOC_SECTION(HTAB, NAME) \
33 ((HTAB)->use_rel ? ".rel" NAME : ".rela" NAME)
35 /* Return size of a relocation entry. HTAB is the bfd's
36 elf32_arm_link_hash_entry. */
37 #define RELOC_SIZE(HTAB) \
39 ? sizeof (Elf32_External_Rel) \
40 : sizeof (Elf32_External_Rela))
42 /* Return function to swap relocations in. HTAB is the bfd's
43 elf32_arm_link_hash_entry. */
44 #define SWAP_RELOC_IN(HTAB) \
46 ? bfd_elf32_swap_reloc_in \
47 : bfd_elf32_swap_reloca_in)
49 /* Return function to swap relocations out. HTAB is the bfd's
50 elf32_arm_link_hash_entry. */
51 #define SWAP_RELOC_OUT(HTAB) \
53 ? bfd_elf32_swap_reloc_out \
54 : bfd_elf32_swap_reloca_out)
56 #define elf_info_to_howto 0
57 #define elf_info_to_howto_rel elf32_arm_info_to_howto
59 #define ARM_ELF_ABI_VERSION 0
60 #define ARM_ELF_OS_ABI_VERSION ELFOSABI_ARM
62 static struct elf_backend_data elf32_arm_vxworks_bed;
64 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
65 R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
68 static reloc_howto_type elf32_arm_howto_table_1[] =
71 HOWTO (R_ARM_NONE, /* type */
73 0, /* size (0 = byte, 1 = short, 2 = long) */
75 FALSE, /* pc_relative */
77 complain_overflow_dont,/* complain_on_overflow */
78 bfd_elf_generic_reloc, /* special_function */
79 "R_ARM_NONE", /* name */
80 FALSE, /* partial_inplace */
83 FALSE), /* pcrel_offset */
85 HOWTO (R_ARM_PC24, /* type */
87 2, /* size (0 = byte, 1 = short, 2 = long) */
89 TRUE, /* pc_relative */
91 complain_overflow_signed,/* complain_on_overflow */
92 bfd_elf_generic_reloc, /* special_function */
93 "R_ARM_PC24", /* name */
94 FALSE, /* partial_inplace */
95 0x00ffffff, /* src_mask */
96 0x00ffffff, /* dst_mask */
97 TRUE), /* pcrel_offset */
100 HOWTO (R_ARM_ABS32, /* type */
102 2, /* size (0 = byte, 1 = short, 2 = long) */
104 FALSE, /* pc_relative */
106 complain_overflow_bitfield,/* complain_on_overflow */
107 bfd_elf_generic_reloc, /* special_function */
108 "R_ARM_ABS32", /* name */
109 FALSE, /* partial_inplace */
110 0xffffffff, /* src_mask */
111 0xffffffff, /* dst_mask */
112 FALSE), /* pcrel_offset */
114 /* standard 32bit pc-relative reloc */
115 HOWTO (R_ARM_REL32, /* type */
117 2, /* size (0 = byte, 1 = short, 2 = long) */
119 TRUE, /* pc_relative */
121 complain_overflow_bitfield,/* complain_on_overflow */
122 bfd_elf_generic_reloc, /* special_function */
123 "R_ARM_REL32", /* name */
124 FALSE, /* partial_inplace */
125 0xffffffff, /* src_mask */
126 0xffffffff, /* dst_mask */
127 TRUE), /* pcrel_offset */
129 /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
130 HOWTO (R_ARM_LDR_PC_G0, /* type */
132 0, /* size (0 = byte, 1 = short, 2 = long) */
134 TRUE, /* pc_relative */
136 complain_overflow_dont,/* complain_on_overflow */
137 bfd_elf_generic_reloc, /* special_function */
138 "R_ARM_LDR_PC_G0", /* name */
139 FALSE, /* partial_inplace */
140 0xffffffff, /* src_mask */
141 0xffffffff, /* dst_mask */
142 TRUE), /* pcrel_offset */
144 /* 16 bit absolute */
145 HOWTO (R_ARM_ABS16, /* type */
147 1, /* size (0 = byte, 1 = short, 2 = long) */
149 FALSE, /* pc_relative */
151 complain_overflow_bitfield,/* complain_on_overflow */
152 bfd_elf_generic_reloc, /* special_function */
153 "R_ARM_ABS16", /* name */
154 FALSE, /* partial_inplace */
155 0x0000ffff, /* src_mask */
156 0x0000ffff, /* dst_mask */
157 FALSE), /* pcrel_offset */
159 /* 12 bit absolute */
160 HOWTO (R_ARM_ABS12, /* type */
162 2, /* size (0 = byte, 1 = short, 2 = long) */
164 FALSE, /* pc_relative */
166 complain_overflow_bitfield,/* complain_on_overflow */
167 bfd_elf_generic_reloc, /* special_function */
168 "R_ARM_ABS12", /* name */
169 FALSE, /* partial_inplace */
170 0x00000fff, /* src_mask */
171 0x00000fff, /* dst_mask */
172 FALSE), /* pcrel_offset */
174 HOWTO (R_ARM_THM_ABS5, /* type */
176 1, /* size (0 = byte, 1 = short, 2 = long) */
178 FALSE, /* pc_relative */
180 complain_overflow_bitfield,/* complain_on_overflow */
181 bfd_elf_generic_reloc, /* special_function */
182 "R_ARM_THM_ABS5", /* name */
183 FALSE, /* partial_inplace */
184 0x000007e0, /* src_mask */
185 0x000007e0, /* dst_mask */
186 FALSE), /* pcrel_offset */
189 HOWTO (R_ARM_ABS8, /* type */
191 0, /* size (0 = byte, 1 = short, 2 = long) */
193 FALSE, /* pc_relative */
195 complain_overflow_bitfield,/* complain_on_overflow */
196 bfd_elf_generic_reloc, /* special_function */
197 "R_ARM_ABS8", /* name */
198 FALSE, /* partial_inplace */
199 0x000000ff, /* src_mask */
200 0x000000ff, /* dst_mask */
201 FALSE), /* pcrel_offset */
203 HOWTO (R_ARM_SBREL32, /* type */
205 2, /* size (0 = byte, 1 = short, 2 = long) */
207 FALSE, /* pc_relative */
209 complain_overflow_dont,/* complain_on_overflow */
210 bfd_elf_generic_reloc, /* special_function */
211 "R_ARM_SBREL32", /* name */
212 FALSE, /* partial_inplace */
213 0xffffffff, /* src_mask */
214 0xffffffff, /* dst_mask */
215 FALSE), /* pcrel_offset */
217 HOWTO (R_ARM_THM_CALL, /* type */
219 2, /* size (0 = byte, 1 = short, 2 = long) */
221 TRUE, /* pc_relative */
223 complain_overflow_signed,/* complain_on_overflow */
224 bfd_elf_generic_reloc, /* special_function */
225 "R_ARM_THM_CALL", /* name */
226 FALSE, /* partial_inplace */
227 0x07ff07ff, /* src_mask */
228 0x07ff07ff, /* dst_mask */
229 TRUE), /* pcrel_offset */
231 HOWTO (R_ARM_THM_PC8, /* type */
233 1, /* size (0 = byte, 1 = short, 2 = long) */
235 TRUE, /* pc_relative */
237 complain_overflow_signed,/* complain_on_overflow */
238 bfd_elf_generic_reloc, /* special_function */
239 "R_ARM_THM_PC8", /* name */
240 FALSE, /* partial_inplace */
241 0x000000ff, /* src_mask */
242 0x000000ff, /* dst_mask */
243 TRUE), /* pcrel_offset */
245 HOWTO (R_ARM_BREL_ADJ, /* type */
247 1, /* size (0 = byte, 1 = short, 2 = long) */
249 FALSE, /* pc_relative */
251 complain_overflow_signed,/* complain_on_overflow */
252 bfd_elf_generic_reloc, /* special_function */
253 "R_ARM_BREL_ADJ", /* name */
254 FALSE, /* partial_inplace */
255 0xffffffff, /* src_mask */
256 0xffffffff, /* dst_mask */
257 FALSE), /* pcrel_offset */
259 HOWTO (R_ARM_SWI24, /* type */
261 0, /* size (0 = byte, 1 = short, 2 = long) */
263 FALSE, /* pc_relative */
265 complain_overflow_signed,/* complain_on_overflow */
266 bfd_elf_generic_reloc, /* special_function */
267 "R_ARM_SWI24", /* name */
268 FALSE, /* partial_inplace */
269 0x00000000, /* src_mask */
270 0x00000000, /* dst_mask */
271 FALSE), /* pcrel_offset */
273 HOWTO (R_ARM_THM_SWI8, /* type */
275 0, /* size (0 = byte, 1 = short, 2 = long) */
277 FALSE, /* pc_relative */
279 complain_overflow_signed,/* complain_on_overflow */
280 bfd_elf_generic_reloc, /* special_function */
281 "R_ARM_SWI8", /* name */
282 FALSE, /* partial_inplace */
283 0x00000000, /* src_mask */
284 0x00000000, /* dst_mask */
285 FALSE), /* pcrel_offset */
287 /* BLX instruction for the ARM. */
288 HOWTO (R_ARM_XPC25, /* type */
290 2, /* size (0 = byte, 1 = short, 2 = long) */
292 TRUE, /* pc_relative */
294 complain_overflow_signed,/* complain_on_overflow */
295 bfd_elf_generic_reloc, /* special_function */
296 "R_ARM_XPC25", /* name */
297 FALSE, /* partial_inplace */
298 0x00ffffff, /* src_mask */
299 0x00ffffff, /* dst_mask */
300 TRUE), /* pcrel_offset */
302 /* BLX instruction for the Thumb. */
303 HOWTO (R_ARM_THM_XPC22, /* type */
305 2, /* size (0 = byte, 1 = short, 2 = long) */
307 TRUE, /* pc_relative */
309 complain_overflow_signed,/* complain_on_overflow */
310 bfd_elf_generic_reloc, /* special_function */
311 "R_ARM_THM_XPC22", /* name */
312 FALSE, /* partial_inplace */
313 0x07ff07ff, /* src_mask */
314 0x07ff07ff, /* dst_mask */
315 TRUE), /* pcrel_offset */
317 /* Dynamic TLS relocations. */
319 HOWTO (R_ARM_TLS_DTPMOD32, /* type */
321 2, /* size (0 = byte, 1 = short, 2 = long) */
323 FALSE, /* pc_relative */
325 complain_overflow_bitfield,/* complain_on_overflow */
326 bfd_elf_generic_reloc, /* special_function */
327 "R_ARM_TLS_DTPMOD32", /* name */
328 TRUE, /* partial_inplace */
329 0xffffffff, /* src_mask */
330 0xffffffff, /* dst_mask */
331 FALSE), /* pcrel_offset */
333 HOWTO (R_ARM_TLS_DTPOFF32, /* type */
335 2, /* size (0 = byte, 1 = short, 2 = long) */
337 FALSE, /* pc_relative */
339 complain_overflow_bitfield,/* complain_on_overflow */
340 bfd_elf_generic_reloc, /* special_function */
341 "R_ARM_TLS_DTPOFF32", /* name */
342 TRUE, /* partial_inplace */
343 0xffffffff, /* src_mask */
344 0xffffffff, /* dst_mask */
345 FALSE), /* pcrel_offset */
347 HOWTO (R_ARM_TLS_TPOFF32, /* type */
349 2, /* size (0 = byte, 1 = short, 2 = long) */
351 FALSE, /* pc_relative */
353 complain_overflow_bitfield,/* complain_on_overflow */
354 bfd_elf_generic_reloc, /* special_function */
355 "R_ARM_TLS_TPOFF32", /* name */
356 TRUE, /* partial_inplace */
357 0xffffffff, /* src_mask */
358 0xffffffff, /* dst_mask */
359 FALSE), /* pcrel_offset */
361 /* Relocs used in ARM Linux */
363 HOWTO (R_ARM_COPY, /* type */
365 2, /* size (0 = byte, 1 = short, 2 = long) */
367 FALSE, /* pc_relative */
369 complain_overflow_bitfield,/* complain_on_overflow */
370 bfd_elf_generic_reloc, /* special_function */
371 "R_ARM_COPY", /* name */
372 TRUE, /* partial_inplace */
373 0xffffffff, /* src_mask */
374 0xffffffff, /* dst_mask */
375 FALSE), /* pcrel_offset */
377 HOWTO (R_ARM_GLOB_DAT, /* type */
379 2, /* size (0 = byte, 1 = short, 2 = long) */
381 FALSE, /* pc_relative */
383 complain_overflow_bitfield,/* complain_on_overflow */
384 bfd_elf_generic_reloc, /* special_function */
385 "R_ARM_GLOB_DAT", /* name */
386 TRUE, /* partial_inplace */
387 0xffffffff, /* src_mask */
388 0xffffffff, /* dst_mask */
389 FALSE), /* pcrel_offset */
391 HOWTO (R_ARM_JUMP_SLOT, /* type */
393 2, /* size (0 = byte, 1 = short, 2 = long) */
395 FALSE, /* pc_relative */
397 complain_overflow_bitfield,/* complain_on_overflow */
398 bfd_elf_generic_reloc, /* special_function */
399 "R_ARM_JUMP_SLOT", /* name */
400 TRUE, /* partial_inplace */
401 0xffffffff, /* src_mask */
402 0xffffffff, /* dst_mask */
403 FALSE), /* pcrel_offset */
405 HOWTO (R_ARM_RELATIVE, /* type */
407 2, /* size (0 = byte, 1 = short, 2 = long) */
409 FALSE, /* pc_relative */
411 complain_overflow_bitfield,/* complain_on_overflow */
412 bfd_elf_generic_reloc, /* special_function */
413 "R_ARM_RELATIVE", /* name */
414 TRUE, /* partial_inplace */
415 0xffffffff, /* src_mask */
416 0xffffffff, /* dst_mask */
417 FALSE), /* pcrel_offset */
419 HOWTO (R_ARM_GOTOFF32, /* type */
421 2, /* size (0 = byte, 1 = short, 2 = long) */
423 FALSE, /* pc_relative */
425 complain_overflow_bitfield,/* complain_on_overflow */
426 bfd_elf_generic_reloc, /* special_function */
427 "R_ARM_GOTOFF32", /* name */
428 TRUE, /* partial_inplace */
429 0xffffffff, /* src_mask */
430 0xffffffff, /* dst_mask */
431 FALSE), /* pcrel_offset */
433 HOWTO (R_ARM_GOTPC, /* type */
435 2, /* size (0 = byte, 1 = short, 2 = long) */
437 TRUE, /* pc_relative */
439 complain_overflow_bitfield,/* complain_on_overflow */
440 bfd_elf_generic_reloc, /* special_function */
441 "R_ARM_GOTPC", /* name */
442 TRUE, /* partial_inplace */
443 0xffffffff, /* src_mask */
444 0xffffffff, /* dst_mask */
445 TRUE), /* pcrel_offset */
447 HOWTO (R_ARM_GOT32, /* type */
449 2, /* size (0 = byte, 1 = short, 2 = long) */
451 FALSE, /* pc_relative */
453 complain_overflow_bitfield,/* complain_on_overflow */
454 bfd_elf_generic_reloc, /* special_function */
455 "R_ARM_GOT32", /* name */
456 TRUE, /* partial_inplace */
457 0xffffffff, /* src_mask */
458 0xffffffff, /* dst_mask */
459 FALSE), /* pcrel_offset */
461 HOWTO (R_ARM_PLT32, /* type */
463 2, /* size (0 = byte, 1 = short, 2 = long) */
465 TRUE, /* pc_relative */
467 complain_overflow_bitfield,/* complain_on_overflow */
468 bfd_elf_generic_reloc, /* special_function */
469 "R_ARM_PLT32", /* name */
470 FALSE, /* partial_inplace */
471 0x00ffffff, /* src_mask */
472 0x00ffffff, /* dst_mask */
473 TRUE), /* pcrel_offset */
475 HOWTO (R_ARM_CALL, /* type */
477 2, /* size (0 = byte, 1 = short, 2 = long) */
479 TRUE, /* pc_relative */
481 complain_overflow_signed,/* complain_on_overflow */
482 bfd_elf_generic_reloc, /* special_function */
483 "R_ARM_CALL", /* name */
484 FALSE, /* partial_inplace */
485 0x00ffffff, /* src_mask */
486 0x00ffffff, /* dst_mask */
487 TRUE), /* pcrel_offset */
489 HOWTO (R_ARM_JUMP24, /* type */
491 2, /* size (0 = byte, 1 = short, 2 = long) */
493 TRUE, /* pc_relative */
495 complain_overflow_signed,/* complain_on_overflow */
496 bfd_elf_generic_reloc, /* special_function */
497 "R_ARM_JUMP24", /* name */
498 FALSE, /* partial_inplace */
499 0x00ffffff, /* src_mask */
500 0x00ffffff, /* dst_mask */
501 TRUE), /* pcrel_offset */
503 HOWTO (R_ARM_THM_JUMP24, /* type */
505 2, /* size (0 = byte, 1 = short, 2 = long) */
507 TRUE, /* pc_relative */
509 complain_overflow_signed,/* complain_on_overflow */
510 bfd_elf_generic_reloc, /* special_function */
511 "R_ARM_THM_JUMP24", /* name */
512 FALSE, /* partial_inplace */
513 0x07ff2fff, /* src_mask */
514 0x07ff2fff, /* dst_mask */
515 TRUE), /* pcrel_offset */
517 HOWTO (R_ARM_BASE_ABS, /* type */
519 2, /* size (0 = byte, 1 = short, 2 = long) */
521 FALSE, /* pc_relative */
523 complain_overflow_dont,/* complain_on_overflow */
524 bfd_elf_generic_reloc, /* special_function */
525 "R_ARM_BASE_ABS", /* name */
526 FALSE, /* partial_inplace */
527 0xffffffff, /* src_mask */
528 0xffffffff, /* dst_mask */
529 FALSE), /* pcrel_offset */
531 HOWTO (R_ARM_ALU_PCREL7_0, /* type */
533 2, /* size (0 = byte, 1 = short, 2 = long) */
535 TRUE, /* pc_relative */
537 complain_overflow_dont,/* complain_on_overflow */
538 bfd_elf_generic_reloc, /* special_function */
539 "R_ARM_ALU_PCREL_7_0", /* name */
540 FALSE, /* partial_inplace */
541 0x00000fff, /* src_mask */
542 0x00000fff, /* dst_mask */
543 TRUE), /* pcrel_offset */
545 HOWTO (R_ARM_ALU_PCREL15_8, /* type */
547 2, /* size (0 = byte, 1 = short, 2 = long) */
549 TRUE, /* pc_relative */
551 complain_overflow_dont,/* complain_on_overflow */
552 bfd_elf_generic_reloc, /* special_function */
553 "R_ARM_ALU_PCREL_15_8",/* name */
554 FALSE, /* partial_inplace */
555 0x00000fff, /* src_mask */
556 0x00000fff, /* dst_mask */
557 TRUE), /* pcrel_offset */
559 HOWTO (R_ARM_ALU_PCREL23_15, /* type */
561 2, /* size (0 = byte, 1 = short, 2 = long) */
563 TRUE, /* pc_relative */
565 complain_overflow_dont,/* complain_on_overflow */
566 bfd_elf_generic_reloc, /* special_function */
567 "R_ARM_ALU_PCREL_23_15",/* name */
568 FALSE, /* partial_inplace */
569 0x00000fff, /* src_mask */
570 0x00000fff, /* dst_mask */
571 TRUE), /* pcrel_offset */
573 HOWTO (R_ARM_LDR_SBREL_11_0, /* type */
575 2, /* size (0 = byte, 1 = short, 2 = long) */
577 FALSE, /* pc_relative */
579 complain_overflow_dont,/* complain_on_overflow */
580 bfd_elf_generic_reloc, /* special_function */
581 "R_ARM_LDR_SBREL_11_0",/* name */
582 FALSE, /* partial_inplace */
583 0x00000fff, /* src_mask */
584 0x00000fff, /* dst_mask */
585 FALSE), /* pcrel_offset */
587 HOWTO (R_ARM_ALU_SBREL_19_12, /* type */
589 2, /* size (0 = byte, 1 = short, 2 = long) */
591 FALSE, /* pc_relative */
593 complain_overflow_dont,/* complain_on_overflow */
594 bfd_elf_generic_reloc, /* special_function */
595 "R_ARM_ALU_SBREL_19_12",/* name */
596 FALSE, /* partial_inplace */
597 0x000ff000, /* src_mask */
598 0x000ff000, /* dst_mask */
599 FALSE), /* pcrel_offset */
601 HOWTO (R_ARM_ALU_SBREL_27_20, /* type */
603 2, /* size (0 = byte, 1 = short, 2 = long) */
605 FALSE, /* pc_relative */
607 complain_overflow_dont,/* complain_on_overflow */
608 bfd_elf_generic_reloc, /* special_function */
609 "R_ARM_ALU_SBREL_27_20",/* name */
610 FALSE, /* partial_inplace */
611 0x0ff00000, /* src_mask */
612 0x0ff00000, /* dst_mask */
613 FALSE), /* pcrel_offset */
615 HOWTO (R_ARM_TARGET1, /* type */
617 2, /* size (0 = byte, 1 = short, 2 = long) */
619 FALSE, /* pc_relative */
621 complain_overflow_dont,/* complain_on_overflow */
622 bfd_elf_generic_reloc, /* special_function */
623 "R_ARM_TARGET1", /* name */
624 FALSE, /* partial_inplace */
625 0xffffffff, /* src_mask */
626 0xffffffff, /* dst_mask */
627 FALSE), /* pcrel_offset */
629 HOWTO (R_ARM_ROSEGREL32, /* type */
631 2, /* size (0 = byte, 1 = short, 2 = long) */
633 FALSE, /* pc_relative */
635 complain_overflow_dont,/* complain_on_overflow */
636 bfd_elf_generic_reloc, /* special_function */
637 "R_ARM_ROSEGREL32", /* name */
638 FALSE, /* partial_inplace */
639 0xffffffff, /* src_mask */
640 0xffffffff, /* dst_mask */
641 FALSE), /* pcrel_offset */
643 HOWTO (R_ARM_V4BX, /* type */
645 2, /* size (0 = byte, 1 = short, 2 = long) */
647 FALSE, /* pc_relative */
649 complain_overflow_dont,/* complain_on_overflow */
650 bfd_elf_generic_reloc, /* special_function */
651 "R_ARM_V4BX", /* name */
652 FALSE, /* partial_inplace */
653 0xffffffff, /* src_mask */
654 0xffffffff, /* dst_mask */
655 FALSE), /* pcrel_offset */
657 HOWTO (R_ARM_TARGET2, /* type */
659 2, /* size (0 = byte, 1 = short, 2 = long) */
661 FALSE, /* pc_relative */
663 complain_overflow_signed,/* complain_on_overflow */
664 bfd_elf_generic_reloc, /* special_function */
665 "R_ARM_TARGET2", /* name */
666 FALSE, /* partial_inplace */
667 0xffffffff, /* src_mask */
668 0xffffffff, /* dst_mask */
669 TRUE), /* pcrel_offset */
671 HOWTO (R_ARM_PREL31, /* type */
673 2, /* size (0 = byte, 1 = short, 2 = long) */
675 TRUE, /* pc_relative */
677 complain_overflow_signed,/* complain_on_overflow */
678 bfd_elf_generic_reloc, /* special_function */
679 "R_ARM_PREL31", /* name */
680 FALSE, /* partial_inplace */
681 0x7fffffff, /* src_mask */
682 0x7fffffff, /* dst_mask */
683 TRUE), /* pcrel_offset */
685 HOWTO (R_ARM_MOVW_ABS_NC, /* type */
687 2, /* size (0 = byte, 1 = short, 2 = long) */
689 FALSE, /* pc_relative */
691 complain_overflow_dont,/* complain_on_overflow */
692 bfd_elf_generic_reloc, /* special_function */
693 "R_ARM_MOVW_ABS_NC", /* name */
694 FALSE, /* partial_inplace */
695 0x000f0fff, /* src_mask */
696 0x000f0fff, /* dst_mask */
697 FALSE), /* pcrel_offset */
699 HOWTO (R_ARM_MOVT_ABS, /* type */
701 2, /* size (0 = byte, 1 = short, 2 = long) */
703 FALSE, /* pc_relative */
705 complain_overflow_bitfield,/* complain_on_overflow */
706 bfd_elf_generic_reloc, /* special_function */
707 "R_ARM_MOVT_ABS", /* name */
708 FALSE, /* partial_inplace */
709 0x000f0fff, /* src_mask */
710 0x000f0fff, /* dst_mask */
711 FALSE), /* pcrel_offset */
713 HOWTO (R_ARM_MOVW_PREL_NC, /* type */
715 2, /* size (0 = byte, 1 = short, 2 = long) */
717 TRUE, /* pc_relative */
719 complain_overflow_dont,/* complain_on_overflow */
720 bfd_elf_generic_reloc, /* special_function */
721 "R_ARM_MOVW_PREL_NC", /* name */
722 FALSE, /* partial_inplace */
723 0x000f0fff, /* src_mask */
724 0x000f0fff, /* dst_mask */
725 TRUE), /* pcrel_offset */
727 HOWTO (R_ARM_MOVT_PREL, /* type */
729 2, /* size (0 = byte, 1 = short, 2 = long) */
731 TRUE, /* pc_relative */
733 complain_overflow_bitfield,/* complain_on_overflow */
734 bfd_elf_generic_reloc, /* special_function */
735 "R_ARM_MOVT_PREL", /* name */
736 FALSE, /* partial_inplace */
737 0x000f0fff, /* src_mask */
738 0x000f0fff, /* dst_mask */
739 TRUE), /* pcrel_offset */
741 HOWTO (R_ARM_THM_MOVW_ABS_NC, /* type */
743 2, /* size (0 = byte, 1 = short, 2 = long) */
745 FALSE, /* pc_relative */
747 complain_overflow_dont,/* complain_on_overflow */
748 bfd_elf_generic_reloc, /* special_function */
749 "R_ARM_THM_MOVW_ABS_NC",/* name */
750 FALSE, /* partial_inplace */
751 0x040f70ff, /* src_mask */
752 0x040f70ff, /* dst_mask */
753 FALSE), /* pcrel_offset */
755 HOWTO (R_ARM_THM_MOVT_ABS, /* type */
757 2, /* size (0 = byte, 1 = short, 2 = long) */
759 FALSE, /* pc_relative */
761 complain_overflow_bitfield,/* complain_on_overflow */
762 bfd_elf_generic_reloc, /* special_function */
763 "R_ARM_THM_MOVT_ABS", /* name */
764 FALSE, /* partial_inplace */
765 0x040f70ff, /* src_mask */
766 0x040f70ff, /* dst_mask */
767 FALSE), /* pcrel_offset */
769 HOWTO (R_ARM_THM_MOVW_PREL_NC,/* type */
771 2, /* size (0 = byte, 1 = short, 2 = long) */
773 TRUE, /* pc_relative */
775 complain_overflow_dont,/* complain_on_overflow */
776 bfd_elf_generic_reloc, /* special_function */
777 "R_ARM_THM_MOVW_PREL_NC",/* name */
778 FALSE, /* partial_inplace */
779 0x040f70ff, /* src_mask */
780 0x040f70ff, /* dst_mask */
781 TRUE), /* pcrel_offset */
783 HOWTO (R_ARM_THM_MOVT_PREL, /* type */
785 2, /* size (0 = byte, 1 = short, 2 = long) */
787 TRUE, /* pc_relative */
789 complain_overflow_bitfield,/* complain_on_overflow */
790 bfd_elf_generic_reloc, /* special_function */
791 "R_ARM_THM_MOVT_PREL", /* name */
792 FALSE, /* partial_inplace */
793 0x040f70ff, /* src_mask */
794 0x040f70ff, /* dst_mask */
795 TRUE), /* pcrel_offset */
797 HOWTO (R_ARM_THM_JUMP19, /* type */
799 2, /* size (0 = byte, 1 = short, 2 = long) */
801 TRUE, /* pc_relative */
803 complain_overflow_signed,/* complain_on_overflow */
804 bfd_elf_generic_reloc, /* special_function */
805 "R_ARM_THM_JUMP19", /* name */
806 FALSE, /* partial_inplace */
807 0x043f2fff, /* src_mask */
808 0x043f2fff, /* dst_mask */
809 TRUE), /* pcrel_offset */
811 HOWTO (R_ARM_THM_JUMP6, /* type */
813 1, /* size (0 = byte, 1 = short, 2 = long) */
815 TRUE, /* pc_relative */
817 complain_overflow_unsigned,/* complain_on_overflow */
818 bfd_elf_generic_reloc, /* special_function */
819 "R_ARM_THM_JUMP6", /* name */
820 FALSE, /* partial_inplace */
821 0x02f8, /* src_mask */
822 0x02f8, /* dst_mask */
823 TRUE), /* pcrel_offset */
825 /* These are declared as 13-bit signed relocations because we can
826 address -4095 .. 4095(base) by altering ADDW to SUBW or vice
828 HOWTO (R_ARM_THM_ALU_PREL_11_0,/* type */
830 2, /* size (0 = byte, 1 = short, 2 = long) */
832 TRUE, /* pc_relative */
834 complain_overflow_dont,/* complain_on_overflow */
835 bfd_elf_generic_reloc, /* special_function */
836 "R_ARM_THM_ALU_PREL_11_0",/* name */
837 FALSE, /* partial_inplace */
838 0xffffffff, /* src_mask */
839 0xffffffff, /* dst_mask */
840 TRUE), /* pcrel_offset */
842 HOWTO (R_ARM_THM_PC12, /* type */
844 2, /* size (0 = byte, 1 = short, 2 = long) */
846 TRUE, /* pc_relative */
848 complain_overflow_dont,/* complain_on_overflow */
849 bfd_elf_generic_reloc, /* special_function */
850 "R_ARM_THM_PC12", /* name */
851 FALSE, /* partial_inplace */
852 0xffffffff, /* src_mask */
853 0xffffffff, /* dst_mask */
854 TRUE), /* pcrel_offset */
856 HOWTO (R_ARM_ABS32_NOI, /* type */
858 2, /* size (0 = byte, 1 = short, 2 = long) */
860 FALSE, /* pc_relative */
862 complain_overflow_dont,/* complain_on_overflow */
863 bfd_elf_generic_reloc, /* special_function */
864 "R_ARM_ABS32_NOI", /* name */
865 FALSE, /* partial_inplace */
866 0xffffffff, /* src_mask */
867 0xffffffff, /* dst_mask */
868 FALSE), /* pcrel_offset */
870 HOWTO (R_ARM_REL32_NOI, /* type */
872 2, /* size (0 = byte, 1 = short, 2 = long) */
874 TRUE, /* pc_relative */
876 complain_overflow_dont,/* complain_on_overflow */
877 bfd_elf_generic_reloc, /* special_function */
878 "R_ARM_REL32_NOI", /* name */
879 FALSE, /* partial_inplace */
880 0xffffffff, /* src_mask */
881 0xffffffff, /* dst_mask */
882 FALSE), /* pcrel_offset */
884 /* Group relocations. */
886 HOWTO (R_ARM_ALU_PC_G0_NC, /* type */
888 2, /* size (0 = byte, 1 = short, 2 = long) */
890 TRUE, /* pc_relative */
892 complain_overflow_dont,/* complain_on_overflow */
893 bfd_elf_generic_reloc, /* special_function */
894 "R_ARM_ALU_PC_G0_NC", /* name */
895 FALSE, /* partial_inplace */
896 0xffffffff, /* src_mask */
897 0xffffffff, /* dst_mask */
898 TRUE), /* pcrel_offset */
900 HOWTO (R_ARM_ALU_PC_G0, /* type */
902 2, /* size (0 = byte, 1 = short, 2 = long) */
904 TRUE, /* pc_relative */
906 complain_overflow_dont,/* complain_on_overflow */
907 bfd_elf_generic_reloc, /* special_function */
908 "R_ARM_ALU_PC_G0", /* name */
909 FALSE, /* partial_inplace */
910 0xffffffff, /* src_mask */
911 0xffffffff, /* dst_mask */
912 TRUE), /* pcrel_offset */
914 HOWTO (R_ARM_ALU_PC_G1_NC, /* type */
916 2, /* size (0 = byte, 1 = short, 2 = long) */
918 TRUE, /* pc_relative */
920 complain_overflow_dont,/* complain_on_overflow */
921 bfd_elf_generic_reloc, /* special_function */
922 "R_ARM_ALU_PC_G1_NC", /* name */
923 FALSE, /* partial_inplace */
924 0xffffffff, /* src_mask */
925 0xffffffff, /* dst_mask */
926 TRUE), /* pcrel_offset */
928 HOWTO (R_ARM_ALU_PC_G1, /* type */
930 2, /* size (0 = byte, 1 = short, 2 = long) */
932 TRUE, /* pc_relative */
934 complain_overflow_dont,/* complain_on_overflow */
935 bfd_elf_generic_reloc, /* special_function */
936 "R_ARM_ALU_PC_G1", /* name */
937 FALSE, /* partial_inplace */
938 0xffffffff, /* src_mask */
939 0xffffffff, /* dst_mask */
940 TRUE), /* pcrel_offset */
942 HOWTO (R_ARM_ALU_PC_G2, /* type */
944 2, /* size (0 = byte, 1 = short, 2 = long) */
946 TRUE, /* pc_relative */
948 complain_overflow_dont,/* complain_on_overflow */
949 bfd_elf_generic_reloc, /* special_function */
950 "R_ARM_ALU_PC_G2", /* name */
951 FALSE, /* partial_inplace */
952 0xffffffff, /* src_mask */
953 0xffffffff, /* dst_mask */
954 TRUE), /* pcrel_offset */
956 HOWTO (R_ARM_LDR_PC_G1, /* type */
958 2, /* size (0 = byte, 1 = short, 2 = long) */
960 TRUE, /* pc_relative */
962 complain_overflow_dont,/* complain_on_overflow */
963 bfd_elf_generic_reloc, /* special_function */
964 "R_ARM_LDR_PC_G1", /* name */
965 FALSE, /* partial_inplace */
966 0xffffffff, /* src_mask */
967 0xffffffff, /* dst_mask */
968 TRUE), /* pcrel_offset */
970 HOWTO (R_ARM_LDR_PC_G2, /* type */
972 2, /* size (0 = byte, 1 = short, 2 = long) */
974 TRUE, /* pc_relative */
976 complain_overflow_dont,/* complain_on_overflow */
977 bfd_elf_generic_reloc, /* special_function */
978 "R_ARM_LDR_PC_G2", /* name */
979 FALSE, /* partial_inplace */
980 0xffffffff, /* src_mask */
981 0xffffffff, /* dst_mask */
982 TRUE), /* pcrel_offset */
984 HOWTO (R_ARM_LDRS_PC_G0, /* type */
986 2, /* size (0 = byte, 1 = short, 2 = long) */
988 TRUE, /* pc_relative */
990 complain_overflow_dont,/* complain_on_overflow */
991 bfd_elf_generic_reloc, /* special_function */
992 "R_ARM_LDRS_PC_G0", /* name */
993 FALSE, /* partial_inplace */
994 0xffffffff, /* src_mask */
995 0xffffffff, /* dst_mask */
996 TRUE), /* pcrel_offset */
998 HOWTO (R_ARM_LDRS_PC_G1, /* type */
1000 2, /* size (0 = byte, 1 = short, 2 = long) */
1002 TRUE, /* pc_relative */
1004 complain_overflow_dont,/* complain_on_overflow */
1005 bfd_elf_generic_reloc, /* special_function */
1006 "R_ARM_LDRS_PC_G1", /* name */
1007 FALSE, /* partial_inplace */
1008 0xffffffff, /* src_mask */
1009 0xffffffff, /* dst_mask */
1010 TRUE), /* pcrel_offset */
1012 HOWTO (R_ARM_LDRS_PC_G2, /* type */
1014 2, /* size (0 = byte, 1 = short, 2 = long) */
1016 TRUE, /* pc_relative */
1018 complain_overflow_dont,/* complain_on_overflow */
1019 bfd_elf_generic_reloc, /* special_function */
1020 "R_ARM_LDRS_PC_G2", /* name */
1021 FALSE, /* partial_inplace */
1022 0xffffffff, /* src_mask */
1023 0xffffffff, /* dst_mask */
1024 TRUE), /* pcrel_offset */
1026 HOWTO (R_ARM_LDC_PC_G0, /* type */
1028 2, /* size (0 = byte, 1 = short, 2 = long) */
1030 TRUE, /* pc_relative */
1032 complain_overflow_dont,/* complain_on_overflow */
1033 bfd_elf_generic_reloc, /* special_function */
1034 "R_ARM_LDC_PC_G0", /* name */
1035 FALSE, /* partial_inplace */
1036 0xffffffff, /* src_mask */
1037 0xffffffff, /* dst_mask */
1038 TRUE), /* pcrel_offset */
1040 HOWTO (R_ARM_LDC_PC_G1, /* type */
1042 2, /* size (0 = byte, 1 = short, 2 = long) */
1044 TRUE, /* pc_relative */
1046 complain_overflow_dont,/* complain_on_overflow */
1047 bfd_elf_generic_reloc, /* special_function */
1048 "R_ARM_LDC_PC_G1", /* name */
1049 FALSE, /* partial_inplace */
1050 0xffffffff, /* src_mask */
1051 0xffffffff, /* dst_mask */
1052 TRUE), /* pcrel_offset */
1054 HOWTO (R_ARM_LDC_PC_G2, /* type */
1056 2, /* size (0 = byte, 1 = short, 2 = long) */
1058 TRUE, /* pc_relative */
1060 complain_overflow_dont,/* complain_on_overflow */
1061 bfd_elf_generic_reloc, /* special_function */
1062 "R_ARM_LDC_PC_G2", /* name */
1063 FALSE, /* partial_inplace */
1064 0xffffffff, /* src_mask */
1065 0xffffffff, /* dst_mask */
1066 TRUE), /* pcrel_offset */
1068 HOWTO (R_ARM_ALU_SB_G0_NC, /* type */
1070 2, /* size (0 = byte, 1 = short, 2 = long) */
1072 TRUE, /* pc_relative */
1074 complain_overflow_dont,/* complain_on_overflow */
1075 bfd_elf_generic_reloc, /* special_function */
1076 "R_ARM_ALU_SB_G0_NC", /* name */
1077 FALSE, /* partial_inplace */
1078 0xffffffff, /* src_mask */
1079 0xffffffff, /* dst_mask */
1080 TRUE), /* pcrel_offset */
1082 HOWTO (R_ARM_ALU_SB_G0, /* type */
1084 2, /* size (0 = byte, 1 = short, 2 = long) */
1086 TRUE, /* pc_relative */
1088 complain_overflow_dont,/* complain_on_overflow */
1089 bfd_elf_generic_reloc, /* special_function */
1090 "R_ARM_ALU_SB_G0", /* name */
1091 FALSE, /* partial_inplace */
1092 0xffffffff, /* src_mask */
1093 0xffffffff, /* dst_mask */
1094 TRUE), /* pcrel_offset */
1096 HOWTO (R_ARM_ALU_SB_G1_NC, /* type */
1098 2, /* size (0 = byte, 1 = short, 2 = long) */
1100 TRUE, /* pc_relative */
1102 complain_overflow_dont,/* complain_on_overflow */
1103 bfd_elf_generic_reloc, /* special_function */
1104 "R_ARM_ALU_SB_G1_NC", /* name */
1105 FALSE, /* partial_inplace */
1106 0xffffffff, /* src_mask */
1107 0xffffffff, /* dst_mask */
1108 TRUE), /* pcrel_offset */
1110 HOWTO (R_ARM_ALU_SB_G1, /* type */
1112 2, /* size (0 = byte, 1 = short, 2 = long) */
1114 TRUE, /* pc_relative */
1116 complain_overflow_dont,/* complain_on_overflow */
1117 bfd_elf_generic_reloc, /* special_function */
1118 "R_ARM_ALU_SB_G1", /* name */
1119 FALSE, /* partial_inplace */
1120 0xffffffff, /* src_mask */
1121 0xffffffff, /* dst_mask */
1122 TRUE), /* pcrel_offset */
1124 HOWTO (R_ARM_ALU_SB_G2, /* type */
1126 2, /* size (0 = byte, 1 = short, 2 = long) */
1128 TRUE, /* pc_relative */
1130 complain_overflow_dont,/* complain_on_overflow */
1131 bfd_elf_generic_reloc, /* special_function */
1132 "R_ARM_ALU_SB_G2", /* name */
1133 FALSE, /* partial_inplace */
1134 0xffffffff, /* src_mask */
1135 0xffffffff, /* dst_mask */
1136 TRUE), /* pcrel_offset */
1138 HOWTO (R_ARM_LDR_SB_G0, /* type */
1140 2, /* size (0 = byte, 1 = short, 2 = long) */
1142 TRUE, /* pc_relative */
1144 complain_overflow_dont,/* complain_on_overflow */
1145 bfd_elf_generic_reloc, /* special_function */
1146 "R_ARM_LDR_SB_G0", /* name */
1147 FALSE, /* partial_inplace */
1148 0xffffffff, /* src_mask */
1149 0xffffffff, /* dst_mask */
1150 TRUE), /* pcrel_offset */
1152 HOWTO (R_ARM_LDR_SB_G1, /* type */
1154 2, /* size (0 = byte, 1 = short, 2 = long) */
1156 TRUE, /* pc_relative */
1158 complain_overflow_dont,/* complain_on_overflow */
1159 bfd_elf_generic_reloc, /* special_function */
1160 "R_ARM_LDR_SB_G1", /* name */
1161 FALSE, /* partial_inplace */
1162 0xffffffff, /* src_mask */
1163 0xffffffff, /* dst_mask */
1164 TRUE), /* pcrel_offset */
1166 HOWTO (R_ARM_LDR_SB_G2, /* type */
1168 2, /* size (0 = byte, 1 = short, 2 = long) */
1170 TRUE, /* pc_relative */
1172 complain_overflow_dont,/* complain_on_overflow */
1173 bfd_elf_generic_reloc, /* special_function */
1174 "R_ARM_LDR_SB_G2", /* name */
1175 FALSE, /* partial_inplace */
1176 0xffffffff, /* src_mask */
1177 0xffffffff, /* dst_mask */
1178 TRUE), /* pcrel_offset */
1180 HOWTO (R_ARM_LDRS_SB_G0, /* type */
1182 2, /* size (0 = byte, 1 = short, 2 = long) */
1184 TRUE, /* pc_relative */
1186 complain_overflow_dont,/* complain_on_overflow */
1187 bfd_elf_generic_reloc, /* special_function */
1188 "R_ARM_LDRS_SB_G0", /* name */
1189 FALSE, /* partial_inplace */
1190 0xffffffff, /* src_mask */
1191 0xffffffff, /* dst_mask */
1192 TRUE), /* pcrel_offset */
1194 HOWTO (R_ARM_LDRS_SB_G1, /* type */
1196 2, /* size (0 = byte, 1 = short, 2 = long) */
1198 TRUE, /* pc_relative */
1200 complain_overflow_dont,/* complain_on_overflow */
1201 bfd_elf_generic_reloc, /* special_function */
1202 "R_ARM_LDRS_SB_G1", /* name */
1203 FALSE, /* partial_inplace */
1204 0xffffffff, /* src_mask */
1205 0xffffffff, /* dst_mask */
1206 TRUE), /* pcrel_offset */
1208 HOWTO (R_ARM_LDRS_SB_G2, /* type */
1210 2, /* size (0 = byte, 1 = short, 2 = long) */
1212 TRUE, /* pc_relative */
1214 complain_overflow_dont,/* complain_on_overflow */
1215 bfd_elf_generic_reloc, /* special_function */
1216 "R_ARM_LDRS_SB_G2", /* name */
1217 FALSE, /* partial_inplace */
1218 0xffffffff, /* src_mask */
1219 0xffffffff, /* dst_mask */
1220 TRUE), /* pcrel_offset */
1222 HOWTO (R_ARM_LDC_SB_G0, /* type */
1224 2, /* size (0 = byte, 1 = short, 2 = long) */
1226 TRUE, /* pc_relative */
1228 complain_overflow_dont,/* complain_on_overflow */
1229 bfd_elf_generic_reloc, /* special_function */
1230 "R_ARM_LDC_SB_G0", /* name */
1231 FALSE, /* partial_inplace */
1232 0xffffffff, /* src_mask */
1233 0xffffffff, /* dst_mask */
1234 TRUE), /* pcrel_offset */
1236 HOWTO (R_ARM_LDC_SB_G1, /* type */
1238 2, /* size (0 = byte, 1 = short, 2 = long) */
1240 TRUE, /* pc_relative */
1242 complain_overflow_dont,/* complain_on_overflow */
1243 bfd_elf_generic_reloc, /* special_function */
1244 "R_ARM_LDC_SB_G1", /* name */
1245 FALSE, /* partial_inplace */
1246 0xffffffff, /* src_mask */
1247 0xffffffff, /* dst_mask */
1248 TRUE), /* pcrel_offset */
1250 HOWTO (R_ARM_LDC_SB_G2, /* type */
1252 2, /* size (0 = byte, 1 = short, 2 = long) */
1254 TRUE, /* pc_relative */
1256 complain_overflow_dont,/* complain_on_overflow */
1257 bfd_elf_generic_reloc, /* special_function */
1258 "R_ARM_LDC_SB_G2", /* name */
1259 FALSE, /* partial_inplace */
1260 0xffffffff, /* src_mask */
1261 0xffffffff, /* dst_mask */
1262 TRUE), /* pcrel_offset */
1264 /* End of group relocations. */
1266 HOWTO (R_ARM_MOVW_BREL_NC, /* type */
1268 2, /* size (0 = byte, 1 = short, 2 = long) */
1270 FALSE, /* pc_relative */
1272 complain_overflow_dont,/* complain_on_overflow */
1273 bfd_elf_generic_reloc, /* special_function */
1274 "R_ARM_MOVW_BREL_NC", /* name */
1275 FALSE, /* partial_inplace */
1276 0x0000ffff, /* src_mask */
1277 0x0000ffff, /* dst_mask */
1278 FALSE), /* pcrel_offset */
1280 HOWTO (R_ARM_MOVT_BREL, /* type */
1282 2, /* size (0 = byte, 1 = short, 2 = long) */
1284 FALSE, /* pc_relative */
1286 complain_overflow_bitfield,/* complain_on_overflow */
1287 bfd_elf_generic_reloc, /* special_function */
1288 "R_ARM_MOVT_BREL", /* name */
1289 FALSE, /* partial_inplace */
1290 0x0000ffff, /* src_mask */
1291 0x0000ffff, /* dst_mask */
1292 FALSE), /* pcrel_offset */
1294 HOWTO (R_ARM_MOVW_BREL, /* type */
1296 2, /* size (0 = byte, 1 = short, 2 = long) */
1298 FALSE, /* pc_relative */
1300 complain_overflow_dont,/* complain_on_overflow */
1301 bfd_elf_generic_reloc, /* special_function */
1302 "R_ARM_MOVW_BREL", /* name */
1303 FALSE, /* partial_inplace */
1304 0x0000ffff, /* src_mask */
1305 0x0000ffff, /* dst_mask */
1306 FALSE), /* pcrel_offset */
1308 HOWTO (R_ARM_THM_MOVW_BREL_NC,/* type */
1310 2, /* size (0 = byte, 1 = short, 2 = long) */
1312 FALSE, /* pc_relative */
1314 complain_overflow_dont,/* complain_on_overflow */
1315 bfd_elf_generic_reloc, /* special_function */
1316 "R_ARM_THM_MOVW_BREL_NC",/* name */
1317 FALSE, /* partial_inplace */
1318 0x040f70ff, /* src_mask */
1319 0x040f70ff, /* dst_mask */
1320 FALSE), /* pcrel_offset */
1322 HOWTO (R_ARM_THM_MOVT_BREL, /* type */
1324 2, /* size (0 = byte, 1 = short, 2 = long) */
1326 FALSE, /* pc_relative */
1328 complain_overflow_bitfield,/* complain_on_overflow */
1329 bfd_elf_generic_reloc, /* special_function */
1330 "R_ARM_THM_MOVT_BREL", /* name */
1331 FALSE, /* partial_inplace */
1332 0x040f70ff, /* src_mask */
1333 0x040f70ff, /* dst_mask */
1334 FALSE), /* pcrel_offset */
1336 HOWTO (R_ARM_THM_MOVW_BREL, /* type */
1338 2, /* size (0 = byte, 1 = short, 2 = long) */
1340 FALSE, /* pc_relative */
1342 complain_overflow_dont,/* complain_on_overflow */
1343 bfd_elf_generic_reloc, /* special_function */
1344 "R_ARM_THM_MOVW_BREL", /* name */
1345 FALSE, /* partial_inplace */
1346 0x040f70ff, /* src_mask */
1347 0x040f70ff, /* dst_mask */
1348 FALSE), /* pcrel_offset */
1350 EMPTY_HOWTO (90), /* Unallocated. */
1355 HOWTO (R_ARM_PLT32_ABS, /* type */
1357 2, /* size (0 = byte, 1 = short, 2 = long) */
1359 FALSE, /* pc_relative */
1361 complain_overflow_dont,/* complain_on_overflow */
1362 bfd_elf_generic_reloc, /* special_function */
1363 "R_ARM_PLT32_ABS", /* name */
1364 FALSE, /* partial_inplace */
1365 0xffffffff, /* src_mask */
1366 0xffffffff, /* dst_mask */
1367 FALSE), /* pcrel_offset */
1369 HOWTO (R_ARM_GOT_ABS, /* type */
1371 2, /* size (0 = byte, 1 = short, 2 = long) */
1373 FALSE, /* pc_relative */
1375 complain_overflow_dont,/* complain_on_overflow */
1376 bfd_elf_generic_reloc, /* special_function */
1377 "R_ARM_GOT_ABS", /* name */
1378 FALSE, /* partial_inplace */
1379 0xffffffff, /* src_mask */
1380 0xffffffff, /* dst_mask */
1381 FALSE), /* pcrel_offset */
1383 HOWTO (R_ARM_GOT_PREL, /* type */
1385 2, /* size (0 = byte, 1 = short, 2 = long) */
1387 TRUE, /* pc_relative */
1389 complain_overflow_dont, /* complain_on_overflow */
1390 bfd_elf_generic_reloc, /* special_function */
1391 "R_ARM_GOT_PREL", /* name */
1392 FALSE, /* partial_inplace */
1393 0xffffffff, /* src_mask */
1394 0xffffffff, /* dst_mask */
1395 TRUE), /* pcrel_offset */
1397 HOWTO (R_ARM_GOT_BREL12, /* type */
1399 2, /* size (0 = byte, 1 = short, 2 = long) */
1401 FALSE, /* pc_relative */
1403 complain_overflow_bitfield,/* complain_on_overflow */
1404 bfd_elf_generic_reloc, /* special_function */
1405 "R_ARM_GOT_BREL12", /* name */
1406 FALSE, /* partial_inplace */
1407 0x00000fff, /* src_mask */
1408 0x00000fff, /* dst_mask */
1409 FALSE), /* pcrel_offset */
1411 HOWTO (R_ARM_GOTOFF12, /* type */
1413 2, /* size (0 = byte, 1 = short, 2 = long) */
1415 FALSE, /* pc_relative */
1417 complain_overflow_bitfield,/* complain_on_overflow */
1418 bfd_elf_generic_reloc, /* special_function */
1419 "R_ARM_GOTOFF12", /* name */
1420 FALSE, /* partial_inplace */
1421 0x00000fff, /* src_mask */
1422 0x00000fff, /* dst_mask */
1423 FALSE), /* pcrel_offset */
1425 EMPTY_HOWTO (R_ARM_GOTRELAX), /* reserved for future GOT-load optimizations */
1427 /* GNU extension to record C++ vtable member usage */
1428 HOWTO (R_ARM_GNU_VTENTRY, /* type */
1430 2, /* size (0 = byte, 1 = short, 2 = long) */
1432 FALSE, /* pc_relative */
1434 complain_overflow_dont, /* complain_on_overflow */
1435 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1436 "R_ARM_GNU_VTENTRY", /* name */
1437 FALSE, /* partial_inplace */
1440 FALSE), /* pcrel_offset */
1442 /* GNU extension to record C++ vtable hierarchy */
1443 HOWTO (R_ARM_GNU_VTINHERIT, /* type */
1445 2, /* size (0 = byte, 1 = short, 2 = long) */
1447 FALSE, /* pc_relative */
1449 complain_overflow_dont, /* complain_on_overflow */
1450 NULL, /* special_function */
1451 "R_ARM_GNU_VTINHERIT", /* name */
1452 FALSE, /* partial_inplace */
1455 FALSE), /* pcrel_offset */
1457 HOWTO (R_ARM_THM_JUMP11, /* type */
1459 1, /* size (0 = byte, 1 = short, 2 = long) */
1461 TRUE, /* pc_relative */
1463 complain_overflow_signed, /* complain_on_overflow */
1464 bfd_elf_generic_reloc, /* special_function */
1465 "R_ARM_THM_JUMP11", /* name */
1466 FALSE, /* partial_inplace */
1467 0x000007ff, /* src_mask */
1468 0x000007ff, /* dst_mask */
1469 TRUE), /* pcrel_offset */
1471 HOWTO (R_ARM_THM_JUMP8, /* type */
1473 1, /* size (0 = byte, 1 = short, 2 = long) */
1475 TRUE, /* pc_relative */
1477 complain_overflow_signed, /* complain_on_overflow */
1478 bfd_elf_generic_reloc, /* special_function */
1479 "R_ARM_THM_JUMP8", /* name */
1480 FALSE, /* partial_inplace */
1481 0x000000ff, /* src_mask */
1482 0x000000ff, /* dst_mask */
1483 TRUE), /* pcrel_offset */
1485 /* TLS relocations */
1486 HOWTO (R_ARM_TLS_GD32, /* type */
1488 2, /* size (0 = byte, 1 = short, 2 = long) */
1490 FALSE, /* pc_relative */
1492 complain_overflow_bitfield,/* complain_on_overflow */
1493 NULL, /* special_function */
1494 "R_ARM_TLS_GD32", /* name */
1495 TRUE, /* partial_inplace */
1496 0xffffffff, /* src_mask */
1497 0xffffffff, /* dst_mask */
1498 FALSE), /* pcrel_offset */
1500 HOWTO (R_ARM_TLS_LDM32, /* type */
1502 2, /* size (0 = byte, 1 = short, 2 = long) */
1504 FALSE, /* pc_relative */
1506 complain_overflow_bitfield,/* complain_on_overflow */
1507 bfd_elf_generic_reloc, /* special_function */
1508 "R_ARM_TLS_LDM32", /* name */
1509 TRUE, /* partial_inplace */
1510 0xffffffff, /* src_mask */
1511 0xffffffff, /* dst_mask */
1512 FALSE), /* pcrel_offset */
1514 HOWTO (R_ARM_TLS_LDO32, /* type */
1516 2, /* size (0 = byte, 1 = short, 2 = long) */
1518 FALSE, /* pc_relative */
1520 complain_overflow_bitfield,/* complain_on_overflow */
1521 bfd_elf_generic_reloc, /* special_function */
1522 "R_ARM_TLS_LDO32", /* name */
1523 TRUE, /* partial_inplace */
1524 0xffffffff, /* src_mask */
1525 0xffffffff, /* dst_mask */
1526 FALSE), /* pcrel_offset */
1528 HOWTO (R_ARM_TLS_IE32, /* type */
1530 2, /* size (0 = byte, 1 = short, 2 = long) */
1532 FALSE, /* pc_relative */
1534 complain_overflow_bitfield,/* complain_on_overflow */
1535 NULL, /* special_function */
1536 "R_ARM_TLS_IE32", /* name */
1537 TRUE, /* partial_inplace */
1538 0xffffffff, /* src_mask */
1539 0xffffffff, /* dst_mask */
1540 FALSE), /* pcrel_offset */
1542 HOWTO (R_ARM_TLS_LE32, /* type */
1544 2, /* size (0 = byte, 1 = short, 2 = long) */
1546 FALSE, /* pc_relative */
1548 complain_overflow_bitfield,/* complain_on_overflow */
1549 bfd_elf_generic_reloc, /* special_function */
1550 "R_ARM_TLS_LE32", /* name */
1551 TRUE, /* partial_inplace */
1552 0xffffffff, /* src_mask */
1553 0xffffffff, /* dst_mask */
1554 FALSE), /* pcrel_offset */
1556 HOWTO (R_ARM_TLS_LDO12, /* type */
1558 2, /* size (0 = byte, 1 = short, 2 = long) */
1560 FALSE, /* pc_relative */
1562 complain_overflow_bitfield,/* complain_on_overflow */
1563 bfd_elf_generic_reloc, /* special_function */
1564 "R_ARM_TLS_LDO12", /* name */
1565 FALSE, /* partial_inplace */
1566 0x00000fff, /* src_mask */
1567 0x00000fff, /* dst_mask */
1568 FALSE), /* pcrel_offset */
1570 HOWTO (R_ARM_TLS_LE12, /* type */
1572 2, /* size (0 = byte, 1 = short, 2 = long) */
1574 FALSE, /* pc_relative */
1576 complain_overflow_bitfield,/* complain_on_overflow */
1577 bfd_elf_generic_reloc, /* special_function */
1578 "R_ARM_TLS_LE12", /* name */
1579 FALSE, /* partial_inplace */
1580 0x00000fff, /* src_mask */
1581 0x00000fff, /* dst_mask */
1582 FALSE), /* pcrel_offset */
1584 HOWTO (R_ARM_TLS_IE12GP, /* type */
1586 2, /* size (0 = byte, 1 = short, 2 = long) */
1588 FALSE, /* pc_relative */
1590 complain_overflow_bitfield,/* complain_on_overflow */
1591 bfd_elf_generic_reloc, /* special_function */
1592 "R_ARM_TLS_IE12GP", /* name */
1593 FALSE, /* partial_inplace */
1594 0x00000fff, /* src_mask */
1595 0x00000fff, /* dst_mask */
1596 FALSE), /* pcrel_offset */
1599 /* 112-127 private relocations
1600 128 R_ARM_ME_TOO, obsolete
1601 129-255 unallocated in AAELF.
1603 249-255 extended, currently unused, relocations: */
1605 static reloc_howto_type elf32_arm_howto_table_2[4] =
1607 HOWTO (R_ARM_RREL32, /* type */
1609 0, /* size (0 = byte, 1 = short, 2 = long) */
1611 FALSE, /* pc_relative */
1613 complain_overflow_dont,/* complain_on_overflow */
1614 bfd_elf_generic_reloc, /* special_function */
1615 "R_ARM_RREL32", /* name */
1616 FALSE, /* partial_inplace */
1619 FALSE), /* pcrel_offset */
1621 HOWTO (R_ARM_RABS32, /* type */
1623 0, /* size (0 = byte, 1 = short, 2 = long) */
1625 FALSE, /* pc_relative */
1627 complain_overflow_dont,/* complain_on_overflow */
1628 bfd_elf_generic_reloc, /* special_function */
1629 "R_ARM_RABS32", /* name */
1630 FALSE, /* partial_inplace */
1633 FALSE), /* pcrel_offset */
1635 HOWTO (R_ARM_RPC24, /* type */
1637 0, /* size (0 = byte, 1 = short, 2 = long) */
1639 FALSE, /* pc_relative */
1641 complain_overflow_dont,/* complain_on_overflow */
1642 bfd_elf_generic_reloc, /* special_function */
1643 "R_ARM_RPC24", /* name */
1644 FALSE, /* partial_inplace */
1647 FALSE), /* pcrel_offset */
1649 HOWTO (R_ARM_RBASE, /* type */
1651 0, /* size (0 = byte, 1 = short, 2 = long) */
1653 FALSE, /* pc_relative */
1655 complain_overflow_dont,/* complain_on_overflow */
1656 bfd_elf_generic_reloc, /* special_function */
1657 "R_ARM_RBASE", /* name */
1658 FALSE, /* partial_inplace */
1661 FALSE) /* pcrel_offset */
1664 static reloc_howto_type *
1665 elf32_arm_howto_from_type (unsigned int r_type)
1667 if (r_type < ARRAY_SIZE (elf32_arm_howto_table_1))
1668 return &elf32_arm_howto_table_1[r_type];
1670 if (r_type >= R_ARM_RREL32
1671 && r_type < R_ARM_RREL32 + ARRAY_SIZE (elf32_arm_howto_table_2))
1672 return &elf32_arm_howto_table_2[r_type - R_ARM_RREL32];
1678 elf32_arm_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED, arelent * bfd_reloc,
1679 Elf_Internal_Rela * elf_reloc)
1681 unsigned int r_type;
1683 r_type = ELF32_R_TYPE (elf_reloc->r_info);
1684 bfd_reloc->howto = elf32_arm_howto_from_type (r_type);
1687 struct elf32_arm_reloc_map
1689 bfd_reloc_code_real_type bfd_reloc_val;
1690 unsigned char elf_reloc_val;
1693 /* All entries in this list must also be present in elf32_arm_howto_table. */
1694 static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
1696 {BFD_RELOC_NONE, R_ARM_NONE},
1697 {BFD_RELOC_ARM_PCREL_BRANCH, R_ARM_PC24},
1698 {BFD_RELOC_ARM_PCREL_CALL, R_ARM_CALL},
1699 {BFD_RELOC_ARM_PCREL_JUMP, R_ARM_JUMP24},
1700 {BFD_RELOC_ARM_PCREL_BLX, R_ARM_XPC25},
1701 {BFD_RELOC_THUMB_PCREL_BLX, R_ARM_THM_XPC22},
1702 {BFD_RELOC_32, R_ARM_ABS32},
1703 {BFD_RELOC_32_PCREL, R_ARM_REL32},
1704 {BFD_RELOC_8, R_ARM_ABS8},
1705 {BFD_RELOC_16, R_ARM_ABS16},
1706 {BFD_RELOC_ARM_OFFSET_IMM, R_ARM_ABS12},
1707 {BFD_RELOC_ARM_THUMB_OFFSET, R_ARM_THM_ABS5},
1708 {BFD_RELOC_THUMB_PCREL_BRANCH25, R_ARM_THM_JUMP24},
1709 {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_CALL},
1710 {BFD_RELOC_THUMB_PCREL_BRANCH12, R_ARM_THM_JUMP11},
1711 {BFD_RELOC_THUMB_PCREL_BRANCH20, R_ARM_THM_JUMP19},
1712 {BFD_RELOC_THUMB_PCREL_BRANCH9, R_ARM_THM_JUMP8},
1713 {BFD_RELOC_THUMB_PCREL_BRANCH7, R_ARM_THM_JUMP6},
1714 {BFD_RELOC_ARM_GLOB_DAT, R_ARM_GLOB_DAT},
1715 {BFD_RELOC_ARM_JUMP_SLOT, R_ARM_JUMP_SLOT},
1716 {BFD_RELOC_ARM_RELATIVE, R_ARM_RELATIVE},
1717 {BFD_RELOC_ARM_GOTOFF, R_ARM_GOTOFF32},
1718 {BFD_RELOC_ARM_GOTPC, R_ARM_GOTPC},
1719 {BFD_RELOC_ARM_GOT32, R_ARM_GOT32},
1720 {BFD_RELOC_ARM_PLT32, R_ARM_PLT32},
1721 {BFD_RELOC_ARM_TARGET1, R_ARM_TARGET1},
1722 {BFD_RELOC_ARM_ROSEGREL32, R_ARM_ROSEGREL32},
1723 {BFD_RELOC_ARM_SBREL32, R_ARM_SBREL32},
1724 {BFD_RELOC_ARM_PREL31, R_ARM_PREL31},
1725 {BFD_RELOC_ARM_TARGET2, R_ARM_TARGET2},
1726 {BFD_RELOC_ARM_PLT32, R_ARM_PLT32},
1727 {BFD_RELOC_ARM_TLS_GD32, R_ARM_TLS_GD32},
1728 {BFD_RELOC_ARM_TLS_LDO32, R_ARM_TLS_LDO32},
1729 {BFD_RELOC_ARM_TLS_LDM32, R_ARM_TLS_LDM32},
1730 {BFD_RELOC_ARM_TLS_DTPMOD32, R_ARM_TLS_DTPMOD32},
1731 {BFD_RELOC_ARM_TLS_DTPOFF32, R_ARM_TLS_DTPOFF32},
1732 {BFD_RELOC_ARM_TLS_TPOFF32, R_ARM_TLS_TPOFF32},
1733 {BFD_RELOC_ARM_TLS_IE32, R_ARM_TLS_IE32},
1734 {BFD_RELOC_ARM_TLS_LE32, R_ARM_TLS_LE32},
1735 {BFD_RELOC_VTABLE_INHERIT, R_ARM_GNU_VTINHERIT},
1736 {BFD_RELOC_VTABLE_ENTRY, R_ARM_GNU_VTENTRY},
1737 {BFD_RELOC_ARM_MOVW, R_ARM_MOVW_ABS_NC},
1738 {BFD_RELOC_ARM_MOVT, R_ARM_MOVT_ABS},
1739 {BFD_RELOC_ARM_MOVW_PCREL, R_ARM_MOVW_PREL_NC},
1740 {BFD_RELOC_ARM_MOVT_PCREL, R_ARM_MOVT_PREL},
1741 {BFD_RELOC_ARM_THUMB_MOVW, R_ARM_THM_MOVW_ABS_NC},
1742 {BFD_RELOC_ARM_THUMB_MOVT, R_ARM_THM_MOVT_ABS},
1743 {BFD_RELOC_ARM_THUMB_MOVW_PCREL, R_ARM_THM_MOVW_PREL_NC},
1744 {BFD_RELOC_ARM_THUMB_MOVT_PCREL, R_ARM_THM_MOVT_PREL},
1745 {BFD_RELOC_ARM_ALU_PC_G0_NC, R_ARM_ALU_PC_G0_NC},
1746 {BFD_RELOC_ARM_ALU_PC_G0, R_ARM_ALU_PC_G0},
1747 {BFD_RELOC_ARM_ALU_PC_G1_NC, R_ARM_ALU_PC_G1_NC},
1748 {BFD_RELOC_ARM_ALU_PC_G1, R_ARM_ALU_PC_G1},
1749 {BFD_RELOC_ARM_ALU_PC_G2, R_ARM_ALU_PC_G2},
1750 {BFD_RELOC_ARM_LDR_PC_G0, R_ARM_LDR_PC_G0},
1751 {BFD_RELOC_ARM_LDR_PC_G1, R_ARM_LDR_PC_G1},
1752 {BFD_RELOC_ARM_LDR_PC_G2, R_ARM_LDR_PC_G2},
1753 {BFD_RELOC_ARM_LDRS_PC_G0, R_ARM_LDRS_PC_G0},
1754 {BFD_RELOC_ARM_LDRS_PC_G1, R_ARM_LDRS_PC_G1},
1755 {BFD_RELOC_ARM_LDRS_PC_G2, R_ARM_LDRS_PC_G2},
1756 {BFD_RELOC_ARM_LDC_PC_G0, R_ARM_LDC_PC_G0},
1757 {BFD_RELOC_ARM_LDC_PC_G1, R_ARM_LDC_PC_G1},
1758 {BFD_RELOC_ARM_LDC_PC_G2, R_ARM_LDC_PC_G2},
1759 {BFD_RELOC_ARM_ALU_SB_G0_NC, R_ARM_ALU_SB_G0_NC},
1760 {BFD_RELOC_ARM_ALU_SB_G0, R_ARM_ALU_SB_G0},
1761 {BFD_RELOC_ARM_ALU_SB_G1_NC, R_ARM_ALU_SB_G1_NC},
1762 {BFD_RELOC_ARM_ALU_SB_G1, R_ARM_ALU_SB_G1},
1763 {BFD_RELOC_ARM_ALU_SB_G2, R_ARM_ALU_SB_G2},
1764 {BFD_RELOC_ARM_LDR_SB_G0, R_ARM_LDR_SB_G0},
1765 {BFD_RELOC_ARM_LDR_SB_G1, R_ARM_LDR_SB_G1},
1766 {BFD_RELOC_ARM_LDR_SB_G2, R_ARM_LDR_SB_G2},
1767 {BFD_RELOC_ARM_LDRS_SB_G0, R_ARM_LDRS_SB_G0},
1768 {BFD_RELOC_ARM_LDRS_SB_G1, R_ARM_LDRS_SB_G1},
1769 {BFD_RELOC_ARM_LDRS_SB_G2, R_ARM_LDRS_SB_G2},
1770 {BFD_RELOC_ARM_LDC_SB_G0, R_ARM_LDC_SB_G0},
1771 {BFD_RELOC_ARM_LDC_SB_G1, R_ARM_LDC_SB_G1},
1772 {BFD_RELOC_ARM_LDC_SB_G2, R_ARM_LDC_SB_G2},
1773 {BFD_RELOC_ARM_V4BX, R_ARM_V4BX}
1776 static reloc_howto_type *
1777 elf32_arm_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1778 bfd_reloc_code_real_type code)
1782 for (i = 0; i < ARRAY_SIZE (elf32_arm_reloc_map); i ++)
1783 if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
1784 return elf32_arm_howto_from_type (elf32_arm_reloc_map[i].elf_reloc_val);
1789 static reloc_howto_type *
1790 elf32_arm_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1795 for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_1); i++)
1796 if (elf32_arm_howto_table_1[i].name != NULL
1797 && strcasecmp (elf32_arm_howto_table_1[i].name, r_name) == 0)
1798 return &elf32_arm_howto_table_1[i];
1800 for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_2); i++)
1801 if (elf32_arm_howto_table_2[i].name != NULL
1802 && strcasecmp (elf32_arm_howto_table_2[i].name, r_name) == 0)
1803 return &elf32_arm_howto_table_2[i];
1808 /* Support for core dump NOTE sections. */
1811 elf32_arm_nabi_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1816 switch (note->descsz)
1821 case 148: /* Linux/ARM 32-bit. */
1823 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1826 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1835 /* Make a ".reg/999" section. */
1836 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1837 size, note->descpos + offset);
1841 elf32_arm_nabi_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1843 switch (note->descsz)
1848 case 124: /* Linux/ARM elf_prpsinfo. */
1849 elf_tdata (abfd)->core_program
1850 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1851 elf_tdata (abfd)->core_command
1852 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1855 /* Note that for some reason, a spurious space is tacked
1856 onto the end of the args in some (at least one anyway)
1857 implementations, so strip it off if it exists. */
1859 char *command = elf_tdata (abfd)->core_command;
1860 int n = strlen (command);
1862 if (0 < n && command[n - 1] == ' ')
1863 command[n - 1] = '\0';
1869 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vec
1870 #define TARGET_LITTLE_NAME "elf32-littlearm"
1871 #define TARGET_BIG_SYM bfd_elf32_bigarm_vec
1872 #define TARGET_BIG_NAME "elf32-bigarm"
1874 #define elf_backend_grok_prstatus elf32_arm_nabi_grok_prstatus
1875 #define elf_backend_grok_psinfo elf32_arm_nabi_grok_psinfo
1877 typedef unsigned long int insn32;
1878 typedef unsigned short int insn16;
1880 /* In lieu of proper flags, assume all EABIv4 or later objects are
1882 #define INTERWORK_FLAG(abfd) \
1883 (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) >= EF_ARM_EABI_VER4 \
1884 || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK))
1886 /* The linker script knows the section names for placement.
1887 The entry_names are used to do simple name mangling on the stubs.
1888 Given a function name, and its type, the stub can be found. The
1889 name can be changed. The only requirement is the %s be present. */
1890 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
1891 #define THUMB2ARM_GLUE_ENTRY_NAME "__%s_from_thumb"
1893 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
1894 #define ARM2THUMB_GLUE_ENTRY_NAME "__%s_from_arm"
1896 #define VFP11_ERRATUM_VENEER_SECTION_NAME ".vfp11_veneer"
1897 #define VFP11_ERRATUM_VENEER_ENTRY_NAME "__vfp11_veneer_%x"
1899 #define ARM_BX_GLUE_SECTION_NAME ".v4_bx"
1900 #define ARM_BX_GLUE_ENTRY_NAME "__bx_r%d"
1902 #define STUB_ENTRY_NAME "__%s_veneer"
1904 /* The name of the dynamic interpreter. This is put in the .interp
1906 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
1908 #ifdef FOUR_WORD_PLT
1910 /* The first entry in a procedure linkage table looks like
1911 this. It is set up so that any shared library function that is
1912 called before the relocation has been set up calls the dynamic
1914 static const bfd_vma elf32_arm_plt0_entry [] =
1916 0xe52de004, /* str lr, [sp, #-4]! */
1917 0xe59fe010, /* ldr lr, [pc, #16] */
1918 0xe08fe00e, /* add lr, pc, lr */
1919 0xe5bef008, /* ldr pc, [lr, #8]! */
1922 /* Subsequent entries in a procedure linkage table look like
1924 static const bfd_vma elf32_arm_plt_entry [] =
1926 0xe28fc600, /* add ip, pc, #NN */
1927 0xe28cca00, /* add ip, ip, #NN */
1928 0xe5bcf000, /* ldr pc, [ip, #NN]! */
1929 0x00000000, /* unused */
1934 /* The first entry in a procedure linkage table looks like
1935 this. It is set up so that any shared library function that is
1936 called before the relocation has been set up calls the dynamic
1938 static const bfd_vma elf32_arm_plt0_entry [] =
1940 0xe52de004, /* str lr, [sp, #-4]! */
1941 0xe59fe004, /* ldr lr, [pc, #4] */
1942 0xe08fe00e, /* add lr, pc, lr */
1943 0xe5bef008, /* ldr pc, [lr, #8]! */
1944 0x00000000, /* &GOT[0] - . */
1947 /* Subsequent entries in a procedure linkage table look like
1949 static const bfd_vma elf32_arm_plt_entry [] =
1951 0xe28fc600, /* add ip, pc, #0xNN00000 */
1952 0xe28cca00, /* add ip, ip, #0xNN000 */
1953 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */
1958 /* The format of the first entry in the procedure linkage table
1959 for a VxWorks executable. */
1960 static const bfd_vma elf32_arm_vxworks_exec_plt0_entry[] =
1962 0xe52dc008, /* str ip,[sp,#-8]! */
1963 0xe59fc000, /* ldr ip,[pc] */
1964 0xe59cf008, /* ldr pc,[ip,#8] */
1965 0x00000000, /* .long _GLOBAL_OFFSET_TABLE_ */
1968 /* The format of subsequent entries in a VxWorks executable. */
1969 static const bfd_vma elf32_arm_vxworks_exec_plt_entry[] =
1971 0xe59fc000, /* ldr ip,[pc] */
1972 0xe59cf000, /* ldr pc,[ip] */
1973 0x00000000, /* .long @got */
1974 0xe59fc000, /* ldr ip,[pc] */
1975 0xea000000, /* b _PLT */
1976 0x00000000, /* .long @pltindex*sizeof(Elf32_Rela) */
1979 /* The format of entries in a VxWorks shared library. */
1980 static const bfd_vma elf32_arm_vxworks_shared_plt_entry[] =
1982 0xe59fc000, /* ldr ip,[pc] */
1983 0xe79cf009, /* ldr pc,[ip,r9] */
1984 0x00000000, /* .long @got */
1985 0xe59fc000, /* ldr ip,[pc] */
1986 0xe599f008, /* ldr pc,[r9,#8] */
1987 0x00000000, /* .long @pltindex*sizeof(Elf32_Rela) */
1990 /* An initial stub used if the PLT entry is referenced from Thumb code. */
1991 #define PLT_THUMB_STUB_SIZE 4
1992 static const bfd_vma elf32_arm_plt_thumb_stub [] =
1998 /* The entries in a PLT when using a DLL-based target with multiple
2000 static const bfd_vma elf32_arm_symbian_plt_entry [] =
2002 0xe51ff004, /* ldr pc, [pc, #-4] */
2003 0x00000000, /* dcd R_ARM_GLOB_DAT(X) */
2006 #define ARM_MAX_FWD_BRANCH_OFFSET ((((1 << 23) - 1) << 2) + 8)
2007 #define ARM_MAX_BWD_BRANCH_OFFSET ((-((1 << 23) << 2)) + 8)
2008 #define THM_MAX_FWD_BRANCH_OFFSET ((1 << 22) -2 + 4)
2009 #define THM_MAX_BWD_BRANCH_OFFSET (-(1 << 22) + 4)
2010 #define THM2_MAX_FWD_BRANCH_OFFSET (((1 << 24) - 2) + 4)
2011 #define THM2_MAX_BWD_BRANCH_OFFSET (-(1 << 24) + 4)
2021 enum stub_reloc_type
2023 STUB_RELOC_NONE = 0,
2028 #define THUMB16_INSN(X) {(X), THUMB16_TYPE, R_ARM_NONE, 0}
2029 #define THUMB32_INSN(X) {(X), THUMB32_TYPE, R_ARM_NONE, 0}
2030 #define ARM_INSN(X) {(X), ARM_TYPE, R_ARM_NONE, 0}
2031 #define ARM_REL_INSN(X, Z) {(X), ARM_TYPE, R_ARM_JUMP24, (Z)}
2032 #define DATA_WORD(X,Y,Z) {(X), DATA_TYPE, (Y), (Z)}
2037 enum stub_insn_type type;
2038 enum stub_reloc_type reloc_type;
2042 /* Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
2043 to reach the stub if necessary. */
2044 static const insn_sequence elf32_arm_stub_long_branch_any_any[] =
2046 ARM_INSN(0xe51ff004), /* ldr pc, [pc, #-4] */
2047 DATA_WORD(0, R_ARM_ABS32, 0), /* dcd R_ARM_ABS32(X) */
2050 /* V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
2052 static const insn_sequence elf32_arm_stub_long_branch_v4t_arm_thumb[] =
2054 ARM_INSN(0xe59fc000), /* ldr ip, [pc, #0] */
2055 ARM_INSN(0xe12fff1c), /* bx ip */
2056 DATA_WORD(0, R_ARM_ABS32, 0), /* dcd R_ARM_ABS32(X) */
2059 /* Thumb -> Thumb long branch stub. Used on architectures which
2060 support only this mode, or on V4T where it is expensive to switch
2062 static const insn_sequence elf32_arm_stub_long_branch_thumb_only[] =
2064 THUMB16_INSN(0xb401), /* push {r0} */
2065 THUMB16_INSN(0x4802), /* ldr r0, [pc, #8] */
2066 THUMB16_INSN(0x4684), /* mov ip, r0 */
2067 THUMB16_INSN(0xbc01), /* pop {r0} */
2068 THUMB16_INSN(0x4760), /* bx ip */
2069 THUMB16_INSN(0xbf00), /* nop */
2070 DATA_WORD(0, R_ARM_ABS32, 0), /* dcd R_ARM_ABS32(X) */
2073 /* V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
2075 static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_arm[] =
2077 THUMB16_INSN(0x4778), /* bx pc */
2078 THUMB16_INSN(0x46c0), /* nop */
2079 ARM_INSN(0xe51ff004), /* ldr pc, [pc, #-4] */
2080 DATA_WORD(0, R_ARM_ABS32, 0), /* dcd R_ARM_ABS32(X) */
2083 /* V4T Thumb -> ARM short branch stub. Shorter variant of the above
2084 one, when the destination is close enough. */
2085 static const insn_sequence elf32_arm_stub_short_branch_v4t_thumb_arm[] =
2087 THUMB16_INSN(0x4778), /* bx pc */
2088 THUMB16_INSN(0x46c0), /* nop */
2089 ARM_REL_INSN(0xea000000, -8), /* b (X-8) */
2092 /* ARM/Thumb -> ARM/Thumb long branch stub, PIC. On V5T and above, use
2093 blx to reach the stub if necessary. */
2094 static const insn_sequence elf32_arm_stub_long_branch_any_any_pic[] =
2096 ARM_INSN(0xe59fc000), /* ldr r12, [pc] */
2097 ARM_INSN(0xe08ff00c), /* add pc, pc, ip */
2098 DATA_WORD(0, R_ARM_REL32, -4), /* dcd R_ARM_REL32(X-4) */
2101 /* Section name for stubs is the associated section name plus this
2103 #define STUB_SUFFIX ".stub"
2105 enum elf32_arm_stub_type
2108 arm_stub_long_branch_any_any,
2109 arm_stub_long_branch_v4t_arm_thumb,
2110 arm_stub_long_branch_thumb_only,
2111 arm_stub_long_branch_v4t_thumb_arm,
2112 arm_stub_short_branch_v4t_thumb_arm,
2113 arm_stub_long_branch_any_any_pic,
2116 struct elf32_arm_stub_hash_entry
2118 /* Base hash table entry structure. */
2119 struct bfd_hash_entry root;
2121 /* The stub section. */
2124 /* Offset within stub_sec of the beginning of this stub. */
2125 bfd_vma stub_offset;
2127 /* Given the symbol's value and its section we can determine its final
2128 value when building the stubs (so the stub knows where to jump). */
2129 bfd_vma target_value;
2130 asection *target_section;
2132 /* The stub type. */
2133 enum elf32_arm_stub_type stub_type;
2134 /* Its encoding size in bytes. */
2137 const insn_sequence *stub_template;
2138 /* The size of the template (number of entries). */
2139 int stub_template_size;
2141 /* The symbol table entry, if any, that this was derived from. */
2142 struct elf32_arm_link_hash_entry *h;
2144 /* Destination symbol type (STT_ARM_TFUNC, ...) */
2145 unsigned char st_type;
2147 /* Where this stub is being called from, or, in the case of combined
2148 stub sections, the first input section in the group. */
2151 /* The name for the local symbol at the start of this stub. The
2152 stub name in the hash table has to be unique; this does not, so
2153 it can be friendlier. */
2157 /* Used to build a map of a section. This is required for mixed-endian
2160 typedef struct elf32_elf_section_map
2165 elf32_arm_section_map;
2167 /* Information about a VFP11 erratum veneer, or a branch to such a veneer. */
2171 VFP11_ERRATUM_BRANCH_TO_ARM_VENEER,
2172 VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER,
2173 VFP11_ERRATUM_ARM_VENEER,
2174 VFP11_ERRATUM_THUMB_VENEER
2176 elf32_vfp11_erratum_type;
2178 typedef struct elf32_vfp11_erratum_list
2180 struct elf32_vfp11_erratum_list *next;
2186 struct elf32_vfp11_erratum_list *veneer;
2187 unsigned int vfp_insn;
2191 struct elf32_vfp11_erratum_list *branch;
2195 elf32_vfp11_erratum_type type;
2197 elf32_vfp11_erratum_list;
2199 typedef struct _arm_elf_section_data
2201 struct bfd_elf_section_data elf;
2202 unsigned int mapcount;
2203 unsigned int mapsize;
2204 elf32_arm_section_map *map;
2205 unsigned int erratumcount;
2206 elf32_vfp11_erratum_list *erratumlist;
2208 _arm_elf_section_data;
2210 #define elf32_arm_section_data(sec) \
2211 ((_arm_elf_section_data *) elf_section_data (sec))
2213 /* The size of the thread control block. */
2216 struct elf_arm_obj_tdata
2218 struct elf_obj_tdata root;
2220 /* tls_type for each local got entry. */
2221 char *local_got_tls_type;
2223 /* Zero to warn when linking objects with incompatible enum sizes. */
2224 int no_enum_size_warning;
2226 /* Zero to warn when linking objects with incompatible wchar_t sizes. */
2227 int no_wchar_size_warning;
2230 #define elf_arm_tdata(bfd) \
2231 ((struct elf_arm_obj_tdata *) (bfd)->tdata.any)
2233 #define elf32_arm_local_got_tls_type(bfd) \
2234 (elf_arm_tdata (bfd)->local_got_tls_type)
2236 #define is_arm_elf(bfd) \
2237 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2238 && elf_tdata (bfd) != NULL \
2239 && elf_object_id (bfd) == ARM_ELF_TDATA)
2242 elf32_arm_mkobject (bfd *abfd)
2244 return bfd_elf_allocate_object (abfd, sizeof (struct elf_arm_obj_tdata),
2248 /* The ARM linker needs to keep track of the number of relocs that it
2249 decides to copy in check_relocs for each symbol. This is so that
2250 it can discard PC relative relocs if it doesn't need them when
2251 linking with -Bsymbolic. We store the information in a field
2252 extending the regular ELF linker hash table. */
2254 /* This structure keeps track of the number of relocs we have copied
2255 for a given symbol. */
2256 struct elf32_arm_relocs_copied
2259 struct elf32_arm_relocs_copied * next;
2260 /* A section in dynobj. */
2262 /* Number of relocs copied in this section. */
2263 bfd_size_type count;
2264 /* Number of PC-relative relocs copied in this section. */
2265 bfd_size_type pc_count;
2268 #define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
2270 /* Arm ELF linker hash entry. */
2271 struct elf32_arm_link_hash_entry
2273 struct elf_link_hash_entry root;
2275 /* Number of PC relative relocs copied for this symbol. */
2276 struct elf32_arm_relocs_copied * relocs_copied;
2278 /* We reference count Thumb references to a PLT entry separately,
2279 so that we can emit the Thumb trampoline only if needed. */
2280 bfd_signed_vma plt_thumb_refcount;
2282 /* Some references from Thumb code may be eliminated by BL->BLX
2283 conversion, so record them separately. */
2284 bfd_signed_vma plt_maybe_thumb_refcount;
2286 /* Since PLT entries have variable size if the Thumb prologue is
2287 used, we need to record the index into .got.plt instead of
2288 recomputing it from the PLT offset. */
2289 bfd_signed_vma plt_got_offset;
2291 #define GOT_UNKNOWN 0
2292 #define GOT_NORMAL 1
2293 #define GOT_TLS_GD 2
2294 #define GOT_TLS_IE 4
2295 unsigned char tls_type;
2297 /* The symbol marking the real symbol location for exported thumb
2298 symbols with Arm stubs. */
2299 struct elf_link_hash_entry *export_glue;
2301 /* A pointer to the most recently used stub hash entry against this
2303 struct elf32_arm_stub_hash_entry *stub_cache;
2306 /* Traverse an arm ELF linker hash table. */
2307 #define elf32_arm_link_hash_traverse(table, func, info) \
2308 (elf_link_hash_traverse \
2310 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
2313 /* Get the ARM elf linker hash table from a link_info structure. */
2314 #define elf32_arm_hash_table(info) \
2315 ((struct elf32_arm_link_hash_table *) ((info)->hash))
2317 #define arm_stub_hash_lookup(table, string, create, copy) \
2318 ((struct elf32_arm_stub_hash_entry *) \
2319 bfd_hash_lookup ((table), (string), (create), (copy)))
2321 /* ARM ELF linker hash table. */
2322 struct elf32_arm_link_hash_table
2324 /* The main hash table. */
2325 struct elf_link_hash_table root;
2327 /* The size in bytes of the section containing the Thumb-to-ARM glue. */
2328 bfd_size_type thumb_glue_size;
2330 /* The size in bytes of the section containing the ARM-to-Thumb glue. */
2331 bfd_size_type arm_glue_size;
2333 /* The size in bytes of section containing the ARMv4 BX veneers. */
2334 bfd_size_type bx_glue_size;
2336 /* Offsets of ARMv4 BX veneers. Bit1 set if present, and Bit0 set when
2337 veneer has been populated. */
2338 bfd_vma bx_glue_offset[15];
2340 /* The size in bytes of the section containing glue for VFP11 erratum
2342 bfd_size_type vfp11_erratum_glue_size;
2344 /* An arbitrary input BFD chosen to hold the glue sections. */
2345 bfd * bfd_of_glue_owner;
2347 /* Nonzero to output a BE8 image. */
2350 /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
2351 Nonzero if R_ARM_TARGET1 means R_ARM_REL32. */
2354 /* The relocation to use for R_ARM_TARGET2 relocations. */
2357 /* 0 = Ignore R_ARM_V4BX.
2358 1 = Convert BX to MOV PC.
2359 2 = Generate v4 interworing stubs. */
2362 /* Nonzero if the ARM/Thumb BLX instructions are available for use. */
2365 /* What sort of code sequences we should look for which may trigger the
2366 VFP11 denorm erratum. */
2367 bfd_arm_vfp11_fix vfp11_fix;
2369 /* Global counter for the number of fixes we have emitted. */
2370 int num_vfp11_fixes;
2372 /* Nonzero to force PIC branch veneers. */
2375 /* The number of bytes in the initial entry in the PLT. */
2376 bfd_size_type plt_header_size;
2378 /* The number of bytes in the subsequent PLT etries. */
2379 bfd_size_type plt_entry_size;
2381 /* True if the target system is VxWorks. */
2384 /* True if the target system is Symbian OS. */
2387 /* True if the target uses REL relocations. */
2390 /* Short-cuts to get to dynamic linker sections. */
2399 /* The (unloaded but important) VxWorks .rela.plt.unloaded section. */
2402 /* Data for R_ARM_TLS_LDM32 relocations. */
2405 bfd_signed_vma refcount;
2409 /* Small local sym to section mapping cache. */
2410 struct sym_sec_cache sym_sec;
2412 /* For convenience in allocate_dynrelocs. */
2415 /* The stub hash table. */
2416 struct bfd_hash_table stub_hash_table;
2418 /* Linker stub bfd. */
2421 /* Linker call-backs. */
2422 asection * (*add_stub_section) (const char *, asection *);
2423 void (*layout_sections_again) (void);
2425 /* Array to keep track of which stub sections have been created, and
2426 information on stub grouping. */
2429 /* This is the section to which stubs in the group will be
2432 /* The stub section. */
2436 /* Assorted information used by elf32_arm_size_stubs. */
2437 unsigned int bfd_count;
2439 asection **input_list;
2442 /* Create an entry in an ARM ELF linker hash table. */
2444 static struct bfd_hash_entry *
2445 elf32_arm_link_hash_newfunc (struct bfd_hash_entry * entry,
2446 struct bfd_hash_table * table,
2447 const char * string)
2449 struct elf32_arm_link_hash_entry * ret =
2450 (struct elf32_arm_link_hash_entry *) entry;
2452 /* Allocate the structure if it has not already been allocated by a
2455 ret = bfd_hash_allocate (table, sizeof (struct elf32_arm_link_hash_entry));
2457 return (struct bfd_hash_entry *) ret;
2459 /* Call the allocation method of the superclass. */
2460 ret = ((struct elf32_arm_link_hash_entry *)
2461 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2465 ret->relocs_copied = NULL;
2466 ret->tls_type = GOT_UNKNOWN;
2467 ret->plt_thumb_refcount = 0;
2468 ret->plt_maybe_thumb_refcount = 0;
2469 ret->plt_got_offset = -1;
2470 ret->export_glue = NULL;
2472 ret->stub_cache = NULL;
2475 return (struct bfd_hash_entry *) ret;
2478 /* Initialize an entry in the stub hash table. */
2480 static struct bfd_hash_entry *
2481 stub_hash_newfunc (struct bfd_hash_entry *entry,
2482 struct bfd_hash_table *table,
2485 /* Allocate the structure if it has not already been allocated by a
2489 entry = bfd_hash_allocate (table,
2490 sizeof (struct elf32_arm_stub_hash_entry));
2495 /* Call the allocation method of the superclass. */
2496 entry = bfd_hash_newfunc (entry, table, string);
2499 struct elf32_arm_stub_hash_entry *eh;
2501 /* Initialize the local fields. */
2502 eh = (struct elf32_arm_stub_hash_entry *) entry;
2503 eh->stub_sec = NULL;
2504 eh->stub_offset = 0;
2505 eh->target_value = 0;
2506 eh->target_section = NULL;
2507 eh->stub_type = arm_stub_none;
2509 eh->stub_template = NULL;
2510 eh->stub_template_size = 0;
2518 /* Create .got, .gotplt, and .rel(a).got sections in DYNOBJ, and set up
2519 shortcuts to them in our hash table. */
2522 create_got_section (bfd *dynobj, struct bfd_link_info *info)
2524 struct elf32_arm_link_hash_table *htab;
2526 htab = elf32_arm_hash_table (info);
2527 /* BPABI objects never have a GOT, or associated sections. */
2528 if (htab->symbian_p)
2531 if (! _bfd_elf_create_got_section (dynobj, info))
2534 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
2535 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
2536 if (!htab->sgot || !htab->sgotplt)
2539 htab->srelgot = bfd_make_section_with_flags (dynobj,
2540 RELOC_SECTION (htab, ".got"),
2541 (SEC_ALLOC | SEC_LOAD
2544 | SEC_LINKER_CREATED
2546 if (htab->srelgot == NULL
2547 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
2552 /* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
2553 .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
2557 elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
2559 struct elf32_arm_link_hash_table *htab;
2561 htab = elf32_arm_hash_table (info);
2562 if (!htab->sgot && !create_got_section (dynobj, info))
2565 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
2568 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
2569 htab->srelplt = bfd_get_section_by_name (dynobj,
2570 RELOC_SECTION (htab, ".plt"));
2571 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
2573 htab->srelbss = bfd_get_section_by_name (dynobj,
2574 RELOC_SECTION (htab, ".bss"));
2576 if (htab->vxworks_p)
2578 if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
2583 htab->plt_header_size = 0;
2584 htab->plt_entry_size
2585 = 4 * ARRAY_SIZE (elf32_arm_vxworks_shared_plt_entry);
2589 htab->plt_header_size
2590 = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt0_entry);
2591 htab->plt_entry_size
2592 = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt_entry);
2599 || (!info->shared && !htab->srelbss))
2605 /* Copy the extra info we tack onto an elf_link_hash_entry. */
2608 elf32_arm_copy_indirect_symbol (struct bfd_link_info *info,
2609 struct elf_link_hash_entry *dir,
2610 struct elf_link_hash_entry *ind)
2612 struct elf32_arm_link_hash_entry *edir, *eind;
2614 edir = (struct elf32_arm_link_hash_entry *) dir;
2615 eind = (struct elf32_arm_link_hash_entry *) ind;
2617 if (eind->relocs_copied != NULL)
2619 if (edir->relocs_copied != NULL)
2621 struct elf32_arm_relocs_copied **pp;
2622 struct elf32_arm_relocs_copied *p;
2624 /* Add reloc counts against the indirect sym to the direct sym
2625 list. Merge any entries against the same section. */
2626 for (pp = &eind->relocs_copied; (p = *pp) != NULL; )
2628 struct elf32_arm_relocs_copied *q;
2630 for (q = edir->relocs_copied; q != NULL; q = q->next)
2631 if (q->section == p->section)
2633 q->pc_count += p->pc_count;
2634 q->count += p->count;
2641 *pp = edir->relocs_copied;
2644 edir->relocs_copied = eind->relocs_copied;
2645 eind->relocs_copied = NULL;
2648 if (ind->root.type == bfd_link_hash_indirect)
2650 /* Copy over PLT info. */
2651 edir->plt_thumb_refcount += eind->plt_thumb_refcount;
2652 eind->plt_thumb_refcount = 0;
2653 edir->plt_maybe_thumb_refcount += eind->plt_maybe_thumb_refcount;
2654 eind->plt_maybe_thumb_refcount = 0;
2656 if (dir->got.refcount <= 0)
2658 edir->tls_type = eind->tls_type;
2659 eind->tls_type = GOT_UNKNOWN;
2663 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
2666 /* Create an ARM elf linker hash table. */
2668 static struct bfd_link_hash_table *
2669 elf32_arm_link_hash_table_create (bfd *abfd)
2671 struct elf32_arm_link_hash_table *ret;
2672 bfd_size_type amt = sizeof (struct elf32_arm_link_hash_table);
2674 ret = bfd_malloc (amt);
2678 if (!_bfd_elf_link_hash_table_init (& ret->root, abfd,
2679 elf32_arm_link_hash_newfunc,
2680 sizeof (struct elf32_arm_link_hash_entry)))
2687 ret->sgotplt = NULL;
2688 ret->srelgot = NULL;
2690 ret->srelplt = NULL;
2691 ret->sdynbss = NULL;
2692 ret->srelbss = NULL;
2693 ret->srelplt2 = NULL;
2694 ret->thumb_glue_size = 0;
2695 ret->arm_glue_size = 0;
2696 ret->bx_glue_size = 0;
2697 memset (ret->bx_glue_offset, 0, sizeof (ret->bx_glue_offset));
2698 ret->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
2699 ret->vfp11_erratum_glue_size = 0;
2700 ret->num_vfp11_fixes = 0;
2701 ret->bfd_of_glue_owner = NULL;
2702 ret->byteswap_code = 0;
2703 ret->target1_is_rel = 0;
2704 ret->target2_reloc = R_ARM_NONE;
2705 #ifdef FOUR_WORD_PLT
2706 ret->plt_header_size = 16;
2707 ret->plt_entry_size = 16;
2709 ret->plt_header_size = 20;
2710 ret->plt_entry_size = 12;
2717 ret->sym_sec.abfd = NULL;
2719 ret->tls_ldm_got.refcount = 0;
2720 ret->stub_bfd = NULL;
2721 ret->add_stub_section = NULL;
2722 ret->layout_sections_again = NULL;
2723 ret->stub_group = NULL;
2726 ret->input_list = NULL;
2728 if (!bfd_hash_table_init (&ret->stub_hash_table, stub_hash_newfunc,
2729 sizeof (struct elf32_arm_stub_hash_entry)))
2735 return &ret->root.root;
2738 /* Free the derived linker hash table. */
2741 elf32_arm_hash_table_free (struct bfd_link_hash_table *hash)
2743 struct elf32_arm_link_hash_table *ret
2744 = (struct elf32_arm_link_hash_table *) hash;
2746 bfd_hash_table_free (&ret->stub_hash_table);
2747 _bfd_generic_link_hash_table_free (hash);
2750 /* Determine if we're dealing with a Thumb only architecture. */
2753 using_thumb_only (struct elf32_arm_link_hash_table *globals)
2755 int arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
2759 if (arch != TAG_CPU_ARCH_V7)
2762 profile = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
2763 Tag_CPU_arch_profile);
2765 return profile == 'M';
2768 /* Determine if we're dealing with a Thumb-2 object. */
2771 using_thumb2 (struct elf32_arm_link_hash_table *globals)
2773 int arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
2775 return arch == TAG_CPU_ARCH_V6T2 || arch >= TAG_CPU_ARCH_V7;
2779 arm_stub_is_thumb (enum elf32_arm_stub_type stub_type)
2783 case arm_stub_long_branch_thumb_only:
2784 case arm_stub_long_branch_v4t_thumb_arm:
2785 case arm_stub_short_branch_v4t_thumb_arm:
2796 /* Determine the type of stub needed, if any, for a call. */
2798 static enum elf32_arm_stub_type
2799 arm_type_of_stub (struct bfd_link_info *info,
2800 asection *input_sec,
2801 const Elf_Internal_Rela *rel,
2802 unsigned char st_type,
2803 struct elf32_arm_link_hash_entry *hash,
2804 bfd_vma destination,
2810 bfd_signed_vma branch_offset;
2811 unsigned int r_type;
2812 struct elf32_arm_link_hash_table * globals;
2815 enum elf32_arm_stub_type stub_type = arm_stub_none;
2817 /* We don't know the actual type of destination in case it is of
2818 type STT_SECTION: give up. */
2819 if (st_type == STT_SECTION)
2822 globals = elf32_arm_hash_table (info);
2824 thumb_only = using_thumb_only (globals);
2826 thumb2 = using_thumb2 (globals);
2828 /* Determine where the call point is. */
2829 location = (input_sec->output_offset
2830 + input_sec->output_section->vma
2833 branch_offset = (bfd_signed_vma)(destination - location);
2835 r_type = ELF32_R_TYPE (rel->r_info);
2837 /* If the call will go through a PLT entry then we do not need
2839 if (globals->splt != NULL && hash != NULL && hash->root.plt.offset != (bfd_vma) -1)
2842 if (r_type == R_ARM_THM_CALL)
2845 && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
2846 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
2848 && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
2849 || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
2850 || ((st_type != STT_ARM_TFUNC) && !globals->use_blx))
2852 if (st_type == STT_ARM_TFUNC)
2854 /* Thumb to thumb. */
2857 stub_type = (info->shared | globals->pic_veneer)
2859 ? ((globals->use_blx)
2860 /* V5T and above. */
2861 ? arm_stub_long_branch_any_any_pic
2862 /* not yet supported on V4T. */
2865 /* non-PIC stubs. */
2866 : ((globals->use_blx)
2867 /* V5T and above. */
2868 ? arm_stub_long_branch_any_any
2870 : arm_stub_long_branch_thumb_only);
2874 stub_type = (info->shared | globals->pic_veneer)
2875 /* PIC stub not yet supported on V4T. */
2878 : arm_stub_long_branch_thumb_only;
2885 && sym_sec->owner != NULL
2886 && !INTERWORK_FLAG (sym_sec->owner))
2888 (*_bfd_error_handler)
2889 (_("%B(%s): warning: interworking not enabled.\n"
2890 " first occurrence: %B: Thumb call to ARM"),
2891 sym_sec->owner, input_bfd, name);
2894 stub_type = (info->shared | globals->pic_veneer)
2896 ? ((globals->use_blx)
2897 /* V5T and above. */
2898 ? arm_stub_long_branch_any_any_pic
2899 /* not yet supported on V4T. */
2902 /* non-PIC stubs. */
2903 : ((globals->use_blx)
2904 /* V5T and above. */
2905 ? arm_stub_long_branch_any_any
2907 : arm_stub_long_branch_v4t_thumb_arm);
2909 /* Handle v4t short branches. */
2910 if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
2911 && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
2912 && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
2913 stub_type = arm_stub_short_branch_v4t_thumb_arm;
2917 else if (r_type == R_ARM_CALL)
2919 if (st_type == STT_ARM_TFUNC)
2924 && sym_sec->owner != NULL
2925 && !INTERWORK_FLAG (sym_sec->owner))
2927 (*_bfd_error_handler)
2928 (_("%B(%s): warning: interworking not enabled.\n"
2929 " first occurrence: %B: ARM call to Thumb"),
2930 sym_sec->owner, input_bfd, name);
2933 /* We have an extra 2-bytes reach because of
2934 the mode change (bit 24 (H) of BLX encoding). */
2935 if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
2936 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
2937 || !globals->use_blx)
2939 stub_type = (info->shared | globals->pic_veneer)
2941 ? arm_stub_long_branch_any_any_pic
2942 /* non-PIC stubs. */
2943 : ((globals->use_blx)
2944 /* V5T and above. */
2945 ? arm_stub_long_branch_any_any
2947 : arm_stub_long_branch_v4t_arm_thumb);
2953 if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
2954 || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
2956 stub_type = (info->shared | globals->pic_veneer)
2958 ? arm_stub_long_branch_any_any_pic
2959 /* non-PIC stubs. */
2960 : arm_stub_long_branch_any_any;
2968 /* Build a name for an entry in the stub hash table. */
2971 elf32_arm_stub_name (const asection *input_section,
2972 const asection *sym_sec,
2973 const struct elf32_arm_link_hash_entry *hash,
2974 const Elf_Internal_Rela *rel)
2981 len = 8 + 1 + strlen (hash->root.root.root.string) + 1 + 8 + 1;
2982 stub_name = bfd_malloc (len);
2983 if (stub_name != NULL)
2984 sprintf (stub_name, "%08x_%s+%x",
2985 input_section->id & 0xffffffff,
2986 hash->root.root.root.string,
2987 (int) rel->r_addend & 0xffffffff);
2991 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
2992 stub_name = bfd_malloc (len);
2993 if (stub_name != NULL)
2994 sprintf (stub_name, "%08x_%x:%x+%x",
2995 input_section->id & 0xffffffff,
2996 sym_sec->id & 0xffffffff,
2997 (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
2998 (int) rel->r_addend & 0xffffffff);
3004 /* Look up an entry in the stub hash. Stub entries are cached because
3005 creating the stub name takes a bit of time. */
3007 static struct elf32_arm_stub_hash_entry *
3008 elf32_arm_get_stub_entry (const asection *input_section,
3009 const asection *sym_sec,
3010 struct elf_link_hash_entry *hash,
3011 const Elf_Internal_Rela *rel,
3012 struct elf32_arm_link_hash_table *htab)
3014 struct elf32_arm_stub_hash_entry *stub_entry;
3015 struct elf32_arm_link_hash_entry *h = (struct elf32_arm_link_hash_entry *) hash;
3016 const asection *id_sec;
3018 if ((input_section->flags & SEC_CODE) == 0)
3021 /* If this input section is part of a group of sections sharing one
3022 stub section, then use the id of the first section in the group.
3023 Stub names need to include a section id, as there may well be
3024 more than one stub used to reach say, printf, and we need to
3025 distinguish between them. */
3026 id_sec = htab->stub_group[input_section->id].link_sec;
3028 if (h != NULL && h->stub_cache != NULL
3029 && h->stub_cache->h == h
3030 && h->stub_cache->id_sec == id_sec)
3032 stub_entry = h->stub_cache;
3038 stub_name = elf32_arm_stub_name (id_sec, sym_sec, h, rel);
3039 if (stub_name == NULL)
3042 stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table,
3043 stub_name, FALSE, FALSE);
3045 h->stub_cache = stub_entry;
3053 /* Add a new stub entry to the stub hash. Not all fields of the new
3054 stub entry are initialised. */
3056 static struct elf32_arm_stub_hash_entry *
3057 elf32_arm_add_stub (const char *stub_name,
3059 struct elf32_arm_link_hash_table *htab)
3063 struct elf32_arm_stub_hash_entry *stub_entry;
3065 link_sec = htab->stub_group[section->id].link_sec;
3066 stub_sec = htab->stub_group[section->id].stub_sec;
3067 if (stub_sec == NULL)
3069 stub_sec = htab->stub_group[link_sec->id].stub_sec;
3070 if (stub_sec == NULL)
3076 namelen = strlen (link_sec->name);
3077 len = namelen + sizeof (STUB_SUFFIX);
3078 s_name = bfd_alloc (htab->stub_bfd, len);
3082 memcpy (s_name, link_sec->name, namelen);
3083 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3084 stub_sec = (*htab->add_stub_section) (s_name, link_sec);
3085 if (stub_sec == NULL)
3087 htab->stub_group[link_sec->id].stub_sec = stub_sec;
3089 htab->stub_group[section->id].stub_sec = stub_sec;
3092 /* Enter this entry into the linker stub hash table. */
3093 stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, stub_name,
3095 if (stub_entry == NULL)
3097 (*_bfd_error_handler) (_("%s: cannot create stub entry %s"),
3103 stub_entry->stub_sec = stub_sec;
3104 stub_entry->stub_offset = 0;
3105 stub_entry->id_sec = link_sec;
3110 /* Store an Arm insn into an output section not processed by
3111 elf32_arm_write_section. */
3114 put_arm_insn (struct elf32_arm_link_hash_table * htab,
3115 bfd * output_bfd, bfd_vma val, void * ptr)
3117 if (htab->byteswap_code != bfd_little_endian (output_bfd))
3118 bfd_putl32 (val, ptr);
3120 bfd_putb32 (val, ptr);
3123 /* Store a 16-bit Thumb insn into an output section not processed by
3124 elf32_arm_write_section. */
3127 put_thumb_insn (struct elf32_arm_link_hash_table * htab,
3128 bfd * output_bfd, bfd_vma val, void * ptr)
3130 if (htab->byteswap_code != bfd_little_endian (output_bfd))
3131 bfd_putl16 (val, ptr);
3133 bfd_putb16 (val, ptr);
3137 arm_build_one_stub (struct bfd_hash_entry *gen_entry,
3140 struct elf32_arm_stub_hash_entry *stub_entry;
3141 struct bfd_link_info *info;
3142 struct elf32_arm_link_hash_table *htab;
3150 const insn_sequence *template;
3152 struct elf32_arm_link_hash_table * globals;
3153 int stub_reloc_idx = -1;
3154 int stub_reloc_offset = 0;
3156 /* Massage our args to the form they really have. */
3157 stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
3158 info = (struct bfd_link_info *) in_arg;
3160 globals = elf32_arm_hash_table (info);
3162 htab = elf32_arm_hash_table (info);
3163 stub_sec = stub_entry->stub_sec;
3165 /* Make a note of the offset within the stubs for this entry. */
3166 stub_entry->stub_offset = stub_sec->size;
3167 loc = stub_sec->contents + stub_entry->stub_offset;
3169 stub_bfd = stub_sec->owner;
3171 /* This is the address of the start of the stub. */
3172 stub_addr = stub_sec->output_section->vma + stub_sec->output_offset
3173 + stub_entry->stub_offset;
3175 /* This is the address of the stub destination. */
3176 sym_value = (stub_entry->target_value
3177 + stub_entry->target_section->output_offset
3178 + stub_entry->target_section->output_section->vma);
3180 template = stub_entry->stub_template;
3181 template_size = stub_entry->stub_template_size;
3184 for (i = 0; i < template_size; i++)
3186 switch (template[i].type)
3189 put_thumb_insn (globals, stub_bfd, template[i].data, loc + size);
3194 put_arm_insn (globals, stub_bfd, template[i].data, loc + size);
3195 /* Handle cases where the target is encoded within the
3197 if (template[i].reloc_type == R_ARM_JUMP24)
3200 stub_reloc_offset = size;
3206 bfd_put_32 (stub_bfd, template[i].data, loc + size);
3208 stub_reloc_offset = size;
3218 stub_sec->size += size;
3220 /* Stub size has already been computed in arm_size_one_stub. Check
3222 BFD_ASSERT (size == stub_entry->stub_size);
3224 /* Destination is Thumb. Force bit 0 to 1 to reflect this. */
3225 if (stub_entry->st_type == STT_ARM_TFUNC)
3228 /* Assume there is one and only one entry to relocate in each stub. */
3229 BFD_ASSERT (stub_reloc_idx != -1);
3231 _bfd_final_link_relocate (elf32_arm_howto_from_type (template[stub_reloc_idx].reloc_type),
3232 stub_bfd, stub_sec, stub_sec->contents,
3233 stub_entry->stub_offset + stub_reloc_offset,
3234 sym_value, template[stub_reloc_idx].reloc_addend);
3239 /* As above, but don't actually build the stub. Just bump offset so
3240 we know stub section sizes. */
3243 arm_size_one_stub (struct bfd_hash_entry *gen_entry,
3246 struct elf32_arm_stub_hash_entry *stub_entry;
3247 struct elf32_arm_link_hash_table *htab;
3248 const insn_sequence *template;
3253 /* Massage our args to the form they really have. */
3254 stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
3255 htab = (struct elf32_arm_link_hash_table *) in_arg;
3257 switch (stub_entry->stub_type)
3259 case arm_stub_long_branch_any_any:
3260 template = elf32_arm_stub_long_branch_any_any;
3261 template_size = sizeof (elf32_arm_stub_long_branch_any_any) / sizeof (insn_sequence);
3264 case arm_stub_long_branch_v4t_arm_thumb:
3265 template = elf32_arm_stub_long_branch_v4t_arm_thumb;
3266 template_size = sizeof (elf32_arm_stub_long_branch_v4t_arm_thumb) / sizeof (insn_sequence);
3268 case arm_stub_long_branch_thumb_only:
3269 template = elf32_arm_stub_long_branch_thumb_only;
3270 template_size = sizeof (elf32_arm_stub_long_branch_thumb_only) / sizeof (insn_sequence);
3272 case arm_stub_long_branch_v4t_thumb_arm:
3273 template = elf32_arm_stub_long_branch_v4t_thumb_arm;
3274 template_size = sizeof (elf32_arm_stub_long_branch_v4t_thumb_arm) / sizeof (insn_sequence);
3276 case arm_stub_short_branch_v4t_thumb_arm:
3277 template = elf32_arm_stub_short_branch_v4t_thumb_arm;
3278 template_size = sizeof (elf32_arm_stub_short_branch_v4t_thumb_arm) / sizeof (insn_sequence);
3280 case arm_stub_long_branch_any_any_pic:
3281 template = elf32_arm_stub_long_branch_any_any_pic;
3282 template_size = sizeof (elf32_arm_stub_long_branch_any_any_pic) / sizeof (insn_sequence);
3290 for (i = 0; i < template_size; i++)
3292 switch (template[i].type)
3312 stub_entry->stub_size = size;
3313 stub_entry->stub_template = template;
3314 stub_entry->stub_template_size = template_size;
3316 size = (size + 7) & ~7;
3317 stub_entry->stub_sec->size += size;
3322 /* External entry points for sizing and building linker stubs. */
3324 /* Set up various things so that we can make a list of input sections
3325 for each output section included in the link. Returns -1 on error,
3326 0 when no stubs will be needed, and 1 on success. */
3329 elf32_arm_setup_section_lists (bfd *output_bfd,
3330 struct bfd_link_info *info)
3333 unsigned int bfd_count;
3334 int top_id, top_index;
3336 asection **input_list, **list;
3338 struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
3340 if (! is_elf_hash_table (htab))
3343 /* Count the number of input BFDs and find the top input section id. */
3344 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
3346 input_bfd = input_bfd->link_next)
3349 for (section = input_bfd->sections;
3351 section = section->next)
3353 if (top_id < section->id)
3354 top_id = section->id;
3357 htab->bfd_count = bfd_count;
3359 amt = sizeof (struct map_stub) * (top_id + 1);
3360 htab->stub_group = bfd_zmalloc (amt);
3361 if (htab->stub_group == NULL)
3364 /* We can't use output_bfd->section_count here to find the top output
3365 section index as some sections may have been removed, and
3366 _bfd_strip_section_from_output doesn't renumber the indices. */
3367 for (section = output_bfd->sections, top_index = 0;
3369 section = section->next)
3371 if (top_index < section->index)
3372 top_index = section->index;
3375 htab->top_index = top_index;
3376 amt = sizeof (asection *) * (top_index + 1);
3377 input_list = bfd_malloc (amt);
3378 htab->input_list = input_list;
3379 if (input_list == NULL)
3382 /* For sections we aren't interested in, mark their entries with a
3383 value we can check later. */
3384 list = input_list + top_index;
3386 *list = bfd_abs_section_ptr;
3387 while (list-- != input_list);
3389 for (section = output_bfd->sections;
3391 section = section->next)
3393 if ((section->flags & SEC_CODE) != 0)
3394 input_list[section->index] = NULL;
3400 /* The linker repeatedly calls this function for each input section,
3401 in the order that input sections are linked into output sections.
3402 Build lists of input sections to determine groupings between which
3403 we may insert linker stubs. */
3406 elf32_arm_next_input_section (struct bfd_link_info *info,
3409 struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
3411 if (isec->output_section->index <= htab->top_index)
3413 asection **list = htab->input_list + isec->output_section->index;
3415 if (*list != bfd_abs_section_ptr)
3417 /* Steal the link_sec pointer for our list. */
3418 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
3419 /* This happens to make the list in reverse order,
3420 which we reverse later. */
3421 PREV_SEC (isec) = *list;
3427 /* See whether we can group stub sections together. Grouping stub
3428 sections may result in fewer stubs. More importantly, we need to
3429 put all .init* and .fini* stubs at the end of the .init or
3430 .fini output sections respectively, because glibc splits the
3431 _init and _fini functions into multiple parts. Putting a stub in
3432 the middle of a function is not a good idea. */
3435 group_sections (struct elf32_arm_link_hash_table *htab,
3436 bfd_size_type stub_group_size,
3437 bfd_boolean stubs_always_after_branch)
3439 asection **list = htab->input_list;
3443 asection *tail = *list;
3447 if (tail == bfd_abs_section_ptr)
3450 /* Reverse the list: we must avoid placing stubs at the
3451 beginning of the section because the beginning of the text
3452 section may be required for an interrupt vector in bare metal
3454 #define NEXT_SEC PREV_SEC
3459 asection *h = PREV_SEC (head);
3460 NEXT_SEC (head) = tp;
3467 while (head != NULL)
3471 bfd_size_type total;
3475 while ((next = NEXT_SEC (curr)) != NULL
3476 && ((total += next->output_offset - curr->output_offset)
3480 /* OK, the size from the start to the start of CURR is less
3481 than stub_group_size and thus can be handled by one stub
3482 section. (Or the head section is itself larger than
3483 stub_group_size, in which case we may be toast.)
3484 We should really be keeping track of the total size of
3485 stubs added here, as stubs contribute to the final output
3489 next = NEXT_SEC (head);
3490 /* Set up this stub group. */
3491 htab->stub_group[head->id].link_sec = curr;
3493 while (head != curr && (head = next) != NULL);
3495 /* But wait, there's more! Input sections up to stub_group_size
3496 bytes after the stub section can be handled by it too. */
3497 if (!stubs_always_after_branch)
3501 && ((total += next->output_offset - head->output_offset)
3505 next = NEXT_SEC (head);
3506 htab->stub_group[head->id].link_sec = curr;
3512 while (list++ != htab->input_list + htab->top_index);
3514 free (htab->input_list);
3519 /* Determine and set the size of the stub section for a final link.
3521 The basic idea here is to examine all the relocations looking for
3522 PC-relative calls to a target that is unreachable with a "bl"
3526 elf32_arm_size_stubs (bfd *output_bfd,
3528 struct bfd_link_info *info,
3529 bfd_signed_vma group_size,
3530 asection * (*add_stub_section) (const char *, asection *),
3531 void (*layout_sections_again) (void))
3533 bfd_size_type stub_group_size;
3534 bfd_boolean stubs_always_after_branch;
3535 bfd_boolean stub_changed = 0;
3536 struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
3538 /* Propagate mach to stub bfd, because it may not have been
3539 finalized when we created stub_bfd. */
3540 bfd_set_arch_mach (stub_bfd, bfd_get_arch (output_bfd),
3541 bfd_get_mach (output_bfd));
3543 /* Stash our params away. */
3544 htab->stub_bfd = stub_bfd;
3545 htab->add_stub_section = add_stub_section;
3546 htab->layout_sections_again = layout_sections_again;
3547 stubs_always_after_branch = group_size < 0;
3549 stub_group_size = -group_size;
3551 stub_group_size = group_size;
3553 if (stub_group_size == 1)
3555 /* Default values. */
3556 /* Thumb branch range is +-4MB has to be used as the default
3557 maximum size (a given section can contain both ARM and Thumb
3558 code, so the worst case has to be taken into account).
3560 This value is 24K less than that, which allows for 2025
3561 12-byte stubs. If we exceed that, then we will fail to link.
3562 The user will have to relink with an explicit group size
3564 stub_group_size = 4170000;
3567 group_sections (htab, stub_group_size, stubs_always_after_branch);
3572 unsigned int bfd_indx;
3575 for (input_bfd = info->input_bfds, bfd_indx = 0;
3577 input_bfd = input_bfd->link_next, bfd_indx++)
3579 Elf_Internal_Shdr *symtab_hdr;
3581 Elf_Internal_Sym *local_syms = NULL;
3583 /* We'll need the symbol table in a second. */
3584 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3585 if (symtab_hdr->sh_info == 0)
3588 /* Walk over each section attached to the input bfd. */
3589 for (section = input_bfd->sections;
3591 section = section->next)
3593 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
3595 /* If there aren't any relocs, then there's nothing more
3597 if ((section->flags & SEC_RELOC) == 0
3598 || section->reloc_count == 0
3599 || (section->flags & SEC_CODE) == 0)
3602 /* If this section is a link-once section that will be
3603 discarded, then don't create any stubs. */
3604 if (section->output_section == NULL
3605 || section->output_section->owner != output_bfd)
3608 /* Get the relocs. */
3610 = _bfd_elf_link_read_relocs (input_bfd, section, NULL,
3611 NULL, info->keep_memory);
3612 if (internal_relocs == NULL)
3613 goto error_ret_free_local;
3615 /* Now examine each relocation. */
3616 irela = internal_relocs;
3617 irelaend = irela + section->reloc_count;
3618 for (; irela < irelaend; irela++)
3620 unsigned int r_type, r_indx;
3621 enum elf32_arm_stub_type stub_type;
3622 struct elf32_arm_stub_hash_entry *stub_entry;
3625 bfd_vma destination;
3626 struct elf32_arm_link_hash_entry *hash;
3627 const char *sym_name;
3629 const asection *id_sec;
3630 unsigned char st_type;
3632 r_type = ELF32_R_TYPE (irela->r_info);
3633 r_indx = ELF32_R_SYM (irela->r_info);
3635 if (r_type >= (unsigned int) R_ARM_max)
3637 bfd_set_error (bfd_error_bad_value);
3638 error_ret_free_internal:
3639 if (elf_section_data (section)->relocs == NULL)
3640 free (internal_relocs);
3641 goto error_ret_free_local;
3644 /* Only look for stubs on call instructions. */
3645 if ((r_type != (unsigned int) R_ARM_CALL)
3646 && (r_type != (unsigned int) R_ARM_THM_CALL))
3649 /* Now determine the call target, its name, value,
3656 if (r_indx < symtab_hdr->sh_info)
3658 /* It's a local symbol. */
3659 Elf_Internal_Sym *sym;
3660 Elf_Internal_Shdr *hdr;
3662 if (local_syms == NULL)
3665 = (Elf_Internal_Sym *) symtab_hdr->contents;
3666 if (local_syms == NULL)
3668 = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
3669 symtab_hdr->sh_info, 0,
3671 if (local_syms == NULL)
3672 goto error_ret_free_internal;
3675 sym = local_syms + r_indx;
3676 hdr = elf_elfsections (input_bfd)[sym->st_shndx];
3677 sym_sec = hdr->bfd_section;
3678 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
3679 sym_value = sym->st_value;
3680 destination = (sym_value + irela->r_addend
3681 + sym_sec->output_offset
3682 + sym_sec->output_section->vma);
3683 st_type = ELF_ST_TYPE (sym->st_info);
3685 = bfd_elf_string_from_elf_section (input_bfd,
3686 symtab_hdr->sh_link,
3691 /* It's an external symbol. */
3694 e_indx = r_indx - symtab_hdr->sh_info;
3695 hash = ((struct elf32_arm_link_hash_entry *)
3696 elf_sym_hashes (input_bfd)[e_indx]);
3698 while (hash->root.root.type == bfd_link_hash_indirect
3699 || hash->root.root.type == bfd_link_hash_warning)
3700 hash = ((struct elf32_arm_link_hash_entry *)
3701 hash->root.root.u.i.link);
3703 if (hash->root.root.type == bfd_link_hash_defined
3704 || hash->root.root.type == bfd_link_hash_defweak)
3706 sym_sec = hash->root.root.u.def.section;
3707 sym_value = hash->root.root.u.def.value;
3708 if (sym_sec->output_section != NULL)
3709 destination = (sym_value + irela->r_addend
3710 + sym_sec->output_offset
3711 + sym_sec->output_section->vma);
3713 else if (hash->root.root.type == bfd_link_hash_undefweak
3714 || hash->root.root.type == bfd_link_hash_undefined)
3715 /* For a shared library, these will need a PLT stub,
3716 which is treated separately.
3717 For absolute code, they cannot be handled. */
3721 bfd_set_error (bfd_error_bad_value);
3722 goto error_ret_free_internal;
3724 st_type = ELF_ST_TYPE (hash->root.type);
3725 sym_name = hash->root.root.root.string;
3728 /* Determine what (if any) linker stub is needed. */
3729 stub_type = arm_type_of_stub (info, section, irela, st_type,
3730 hash, destination, sym_sec,
3731 input_bfd, sym_name);
3732 if (stub_type == arm_stub_none)
3735 /* Support for grouping stub sections. */
3736 id_sec = htab->stub_group[section->id].link_sec;
3738 /* Get the name of this stub. */
3739 stub_name = elf32_arm_stub_name (id_sec, sym_sec, hash, irela);
3741 goto error_ret_free_internal;
3743 stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table,
3746 if (stub_entry != NULL)
3748 /* The proper stub has already been created. */
3753 stub_entry = elf32_arm_add_stub (stub_name, section, htab);
3754 if (stub_entry == NULL)
3757 goto error_ret_free_internal;
3760 stub_entry->target_value = sym_value;
3761 stub_entry->target_section = sym_sec;
3762 stub_entry->stub_type = stub_type;
3763 stub_entry->h = hash;
3764 stub_entry->st_type = st_type;
3766 if (sym_name == NULL)
3767 sym_name = "unnamed";
3768 stub_entry->output_name
3769 = bfd_alloc (htab->stub_bfd,
3770 sizeof (THUMB2ARM_GLUE_ENTRY_NAME)
3771 + strlen (sym_name));
3772 if (stub_entry->output_name == NULL)
3775 goto error_ret_free_internal;
3778 /* For historical reasons, use the existing names for
3779 ARM-to-Thumb and Thumb-to-ARM stubs. */
3780 if (r_type == (unsigned int) R_ARM_THM_CALL
3781 && st_type != STT_ARM_TFUNC)
3782 sprintf (stub_entry->output_name, THUMB2ARM_GLUE_ENTRY_NAME,
3784 else if (r_type == (unsigned int) R_ARM_CALL
3785 && st_type == STT_ARM_TFUNC)
3786 sprintf (stub_entry->output_name, ARM2THUMB_GLUE_ENTRY_NAME,
3789 sprintf (stub_entry->output_name, STUB_ENTRY_NAME,
3792 stub_changed = TRUE;
3795 /* We're done with the internal relocs, free them. */
3796 if (elf_section_data (section)->relocs == NULL)
3797 free (internal_relocs);
3804 /* OK, we've added some stubs. Find out the new size of the
3806 for (stub_sec = htab->stub_bfd->sections;
3808 stub_sec = stub_sec->next)
3811 bfd_hash_traverse (&htab->stub_hash_table, arm_size_one_stub, htab);
3813 /* Ask the linker to do its stuff. */
3814 (*htab->layout_sections_again) ();
3815 stub_changed = FALSE;
3820 error_ret_free_local:
3824 /* Build all the stubs associated with the current output file. The
3825 stubs are kept in a hash table attached to the main linker hash
3826 table. We also set up the .plt entries for statically linked PIC
3827 functions here. This function is called via arm_elf_finish in the
3831 elf32_arm_build_stubs (struct bfd_link_info *info)
3834 struct bfd_hash_table *table;
3835 struct elf32_arm_link_hash_table *htab;
3837 htab = elf32_arm_hash_table (info);
3839 for (stub_sec = htab->stub_bfd->sections;
3841 stub_sec = stub_sec->next)
3845 /* Ignore non-stub sections. */
3846 if (!strstr (stub_sec->name, STUB_SUFFIX))
3849 /* Allocate memory to hold the linker stubs. */
3850 size = stub_sec->size;
3851 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3852 if (stub_sec->contents == NULL && size != 0)
3857 /* Build the stubs as directed by the stub hash table. */
3858 table = &htab->stub_hash_table;
3859 bfd_hash_traverse (table, arm_build_one_stub, info);
3864 /* Locate the Thumb encoded calling stub for NAME. */
3866 static struct elf_link_hash_entry *
3867 find_thumb_glue (struct bfd_link_info *link_info,
3869 char **error_message)
3872 struct elf_link_hash_entry *hash;
3873 struct elf32_arm_link_hash_table *hash_table;
3875 /* We need a pointer to the armelf specific hash table. */
3876 hash_table = elf32_arm_hash_table (link_info);
3878 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
3879 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
3881 BFD_ASSERT (tmp_name);
3883 sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
3885 hash = elf_link_hash_lookup
3886 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
3889 && asprintf (error_message, _("unable to find THUMB glue '%s' for '%s'"),
3890 tmp_name, name) == -1)
3891 *error_message = (char *) bfd_errmsg (bfd_error_system_call);
3898 /* Locate the ARM encoded calling stub for NAME. */
3900 static struct elf_link_hash_entry *
3901 find_arm_glue (struct bfd_link_info *link_info,
3903 char **error_message)
3906 struct elf_link_hash_entry *myh;
3907 struct elf32_arm_link_hash_table *hash_table;
3909 /* We need a pointer to the elfarm specific hash table. */
3910 hash_table = elf32_arm_hash_table (link_info);
3912 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
3913 + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
3915 BFD_ASSERT (tmp_name);
3917 sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
3919 myh = elf_link_hash_lookup
3920 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
3923 && asprintf (error_message, _("unable to find ARM glue '%s' for '%s'"),
3924 tmp_name, name) == -1)
3925 *error_message = (char *) bfd_errmsg (bfd_error_system_call);
3932 /* ARM->Thumb glue (static images):
3936 ldr r12, __func_addr
3939 .word func @ behave as if you saw a ARM_32 reloc.
3946 .word func @ behave as if you saw a ARM_32 reloc.
3948 (relocatable images)
3951 ldr r12, __func_offset
3957 #define ARM2THUMB_STATIC_GLUE_SIZE 12
3958 static const insn32 a2t1_ldr_insn = 0xe59fc000;
3959 static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
3960 static const insn32 a2t3_func_addr_insn = 0x00000001;
3962 #define ARM2THUMB_V5_STATIC_GLUE_SIZE 8
3963 static const insn32 a2t1v5_ldr_insn = 0xe51ff004;
3964 static const insn32 a2t2v5_func_addr_insn = 0x00000001;
3966 #define ARM2THUMB_PIC_GLUE_SIZE 16
3967 static const insn32 a2t1p_ldr_insn = 0xe59fc004;
3968 static const insn32 a2t2p_add_pc_insn = 0xe08cc00f;
3969 static const insn32 a2t3p_bx_r12_insn = 0xe12fff1c;
3971 /* Thumb->ARM: Thumb->(non-interworking aware) ARM
3975 __func_from_thumb: __func_from_thumb:
3977 nop ldr r6, __func_addr
3987 #define THUMB2ARM_GLUE_SIZE 8
3988 static const insn16 t2a1_bx_pc_insn = 0x4778;
3989 static const insn16 t2a2_noop_insn = 0x46c0;
3990 static const insn32 t2a3_b_insn = 0xea000000;
3992 #define VFP11_ERRATUM_VENEER_SIZE 8
3994 #define ARM_BX_VENEER_SIZE 12
3995 static const insn32 armbx1_tst_insn = 0xe3100001;
3996 static const insn32 armbx2_moveq_insn = 0x01a0f000;
3997 static const insn32 armbx3_bx_insn = 0xe12fff10;
3999 #ifndef ELFARM_NABI_C_INCLUDED
4001 arm_allocate_glue_section_space (bfd * abfd, bfd_size_type size, const char * name)
4004 bfd_byte * contents;
4009 BFD_ASSERT (abfd != NULL);
4011 s = bfd_get_section_by_name (abfd, name);
4012 BFD_ASSERT (s != NULL);
4014 contents = bfd_alloc (abfd, size);
4016 BFD_ASSERT (s->size == size);
4017 s->contents = contents;
4021 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
4023 struct elf32_arm_link_hash_table * globals;
4025 globals = elf32_arm_hash_table (info);
4026 BFD_ASSERT (globals != NULL);
4028 arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
4029 globals->arm_glue_size,
4030 ARM2THUMB_GLUE_SECTION_NAME);
4032 arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
4033 globals->thumb_glue_size,
4034 THUMB2ARM_GLUE_SECTION_NAME);
4036 arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
4037 globals->vfp11_erratum_glue_size,
4038 VFP11_ERRATUM_VENEER_SECTION_NAME);
4040 arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
4041 globals->bx_glue_size,
4042 ARM_BX_GLUE_SECTION_NAME);
4047 /* Allocate space and symbols for calling a Thumb function from Arm mode.
4048 returns the symbol identifying the stub. */
4050 static struct elf_link_hash_entry *
4051 record_arm_to_thumb_glue (struct bfd_link_info * link_info,
4052 struct elf_link_hash_entry * h)
4054 const char * name = h->root.root.string;
4057 struct elf_link_hash_entry * myh;
4058 struct bfd_link_hash_entry * bh;
4059 struct elf32_arm_link_hash_table * globals;
4063 globals = elf32_arm_hash_table (link_info);
4065 BFD_ASSERT (globals != NULL);
4066 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
4068 s = bfd_get_section_by_name
4069 (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
4071 BFD_ASSERT (s != NULL);
4073 tmp_name = bfd_malloc ((bfd_size_type) strlen (name) + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
4075 BFD_ASSERT (tmp_name);
4077 sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
4079 myh = elf_link_hash_lookup
4080 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
4084 /* We've already seen this guy. */
4089 /* The only trick here is using hash_table->arm_glue_size as the value.
4090 Even though the section isn't allocated yet, this is where we will be
4091 putting it. The +1 on the value marks that the stub has not been
4092 output yet - not that it is a Thumb function. */
4094 val = globals->arm_glue_size + 1;
4095 _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
4096 tmp_name, BSF_GLOBAL, s, val,
4097 NULL, TRUE, FALSE, &bh);
4099 myh = (struct elf_link_hash_entry *) bh;
4100 myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
4101 myh->forced_local = 1;
4105 if (link_info->shared || globals->root.is_relocatable_executable
4106 || globals->pic_veneer)
4107 size = ARM2THUMB_PIC_GLUE_SIZE;
4108 else if (globals->use_blx)
4109 size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
4111 size = ARM2THUMB_STATIC_GLUE_SIZE;
4114 globals->arm_glue_size += size;
4120 record_thumb_to_arm_glue (struct bfd_link_info *link_info,
4121 struct elf_link_hash_entry *h)
4123 const char *name = h->root.root.string;
4126 struct elf_link_hash_entry *myh;
4127 struct bfd_link_hash_entry *bh;
4128 struct elf32_arm_link_hash_table *hash_table;
4131 hash_table = elf32_arm_hash_table (link_info);
4133 BFD_ASSERT (hash_table != NULL);
4134 BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
4136 s = bfd_get_section_by_name
4137 (hash_table->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
4139 BFD_ASSERT (s != NULL);
4141 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
4142 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
4144 BFD_ASSERT (tmp_name);
4146 sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
4148 myh = elf_link_hash_lookup
4149 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
4153 /* We've already seen this guy. */
4158 /* The only trick here is using hash_table->thumb_glue_size as the value.
4159 Even though the section isn't allocated yet, this is where we will be
4160 putting it. The +1 on the value marks that the stub has not been
4161 output yet - not that it is a Thumb function. */
4163 val = hash_table->thumb_glue_size + 1;
4164 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
4165 tmp_name, BSF_GLOBAL, s, val,
4166 NULL, TRUE, FALSE, &bh);
4168 /* If we mark it 'Thumb', the disassembler will do a better job. */
4169 myh = (struct elf_link_hash_entry *) bh;
4170 myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
4171 myh->forced_local = 1;
4175 #define CHANGE_TO_ARM "__%s_change_to_arm"
4176 #define BACK_FROM_ARM "__%s_back_from_arm"
4178 /* Allocate another symbol to mark where we switch to Arm mode. */
4179 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
4180 + strlen (CHANGE_TO_ARM) + 1);
4182 BFD_ASSERT (tmp_name);
4184 sprintf (tmp_name, CHANGE_TO_ARM, name);
4187 val = hash_table->thumb_glue_size + 4,
4188 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
4189 tmp_name, BSF_LOCAL, s, val,
4190 NULL, TRUE, FALSE, &bh);
4194 s->size += THUMB2ARM_GLUE_SIZE;
4195 hash_table->thumb_glue_size += THUMB2ARM_GLUE_SIZE;
4199 /* Allocate space for ARMv4 BX veneers. */
4202 record_arm_bx_glue (struct bfd_link_info * link_info, int reg)
4205 struct elf32_arm_link_hash_table *globals;
4207 struct elf_link_hash_entry *myh;
4208 struct bfd_link_hash_entry *bh;
4211 /* BX PC does not need a veneer. */
4215 globals = elf32_arm_hash_table (link_info);
4217 BFD_ASSERT (globals != NULL);
4218 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
4220 /* Check if this veneer has already been allocated. */
4221 if (globals->bx_glue_offset[reg])
4224 s = bfd_get_section_by_name
4225 (globals->bfd_of_glue_owner, ARM_BX_GLUE_SECTION_NAME);
4227 BFD_ASSERT (s != NULL);
4229 /* Add symbol for veneer. */
4230 tmp_name = bfd_malloc ((bfd_size_type) strlen (ARM_BX_GLUE_ENTRY_NAME) + 1);
4232 BFD_ASSERT (tmp_name);
4234 sprintf (tmp_name, ARM_BX_GLUE_ENTRY_NAME, reg);
4236 myh = elf_link_hash_lookup
4237 (&(globals)->root, tmp_name, FALSE, FALSE, FALSE);
4239 BFD_ASSERT (myh == NULL);
4242 val = globals->bx_glue_size;
4243 _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
4244 tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
4245 NULL, TRUE, FALSE, &bh);
4247 myh = (struct elf_link_hash_entry *) bh;
4248 myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
4249 myh->forced_local = 1;
4251 s->size += ARM_BX_VENEER_SIZE;
4252 globals->bx_glue_offset[reg] = globals->bx_glue_size | 2;
4253 globals->bx_glue_size += ARM_BX_VENEER_SIZE;
4257 /* Add an entry to the code/data map for section SEC. */
4260 elf32_arm_section_map_add (asection *sec, char type, bfd_vma vma)
4262 struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
4263 unsigned int newidx;
4265 if (sec_data->map == NULL)
4267 sec_data->map = bfd_malloc (sizeof (elf32_arm_section_map));
4268 sec_data->mapcount = 0;
4269 sec_data->mapsize = 1;
4272 newidx = sec_data->mapcount++;
4274 if (sec_data->mapcount > sec_data->mapsize)
4276 sec_data->mapsize *= 2;
4277 sec_data->map = bfd_realloc_or_free (sec_data->map, sec_data->mapsize
4278 * sizeof (elf32_arm_section_map));
4283 sec_data->map[newidx].vma = vma;
4284 sec_data->map[newidx].type = type;
4289 /* Record information about a VFP11 denorm-erratum veneer. Only ARM-mode
4290 veneers are handled for now. */
4293 record_vfp11_erratum_veneer (struct bfd_link_info *link_info,
4294 elf32_vfp11_erratum_list *branch,
4296 asection *branch_sec,
4297 unsigned int offset)
4300 struct elf32_arm_link_hash_table *hash_table;
4302 struct elf_link_hash_entry *myh;
4303 struct bfd_link_hash_entry *bh;
4305 struct _arm_elf_section_data *sec_data;
4307 elf32_vfp11_erratum_list *newerr;
4309 hash_table = elf32_arm_hash_table (link_info);
4311 BFD_ASSERT (hash_table != NULL);
4312 BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
4314 s = bfd_get_section_by_name
4315 (hash_table->bfd_of_glue_owner, VFP11_ERRATUM_VENEER_SECTION_NAME);
4317 sec_data = elf32_arm_section_data (s);
4319 BFD_ASSERT (s != NULL);
4321 tmp_name = bfd_malloc ((bfd_size_type) strlen
4322 (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
4324 BFD_ASSERT (tmp_name);
4326 sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
4327 hash_table->num_vfp11_fixes);
4329 myh = elf_link_hash_lookup
4330 (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
4332 BFD_ASSERT (myh == NULL);
4335 val = hash_table->vfp11_erratum_glue_size;
4336 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
4337 tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
4338 NULL, TRUE, FALSE, &bh);
4340 myh = (struct elf_link_hash_entry *) bh;
4341 myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
4342 myh->forced_local = 1;
4344 /* Link veneer back to calling location. */
4345 errcount = ++(sec_data->erratumcount);
4346 newerr = bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
4348 newerr->type = VFP11_ERRATUM_ARM_VENEER;
4350 newerr->u.v.branch = branch;
4351 newerr->u.v.id = hash_table->num_vfp11_fixes;
4352 branch->u.b.veneer = newerr;
4354 newerr->next = sec_data->erratumlist;
4355 sec_data->erratumlist = newerr;
4357 /* A symbol for the return from the veneer. */
4358 sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
4359 hash_table->num_vfp11_fixes);
4361 myh = elf_link_hash_lookup
4362 (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
4369 _bfd_generic_link_add_one_symbol (link_info, branch_bfd, tmp_name, BSF_LOCAL,
4370 branch_sec, val, NULL, TRUE, FALSE, &bh);
4372 myh = (struct elf_link_hash_entry *) bh;
4373 myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
4374 myh->forced_local = 1;
4378 /* Generate a mapping symbol for the veneer section, and explicitly add an
4379 entry for that symbol to the code/data map for the section. */
4380 if (hash_table->vfp11_erratum_glue_size == 0)
4383 /* FIXME: Creates an ARM symbol. Thumb mode will need attention if it
4384 ever requires this erratum fix. */
4385 _bfd_generic_link_add_one_symbol (link_info,
4386 hash_table->bfd_of_glue_owner, "$a",
4387 BSF_LOCAL, s, 0, NULL,
4390 myh = (struct elf_link_hash_entry *) bh;
4391 myh->type = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
4392 myh->forced_local = 1;
4394 /* The elf32_arm_init_maps function only cares about symbols from input
4395 BFDs. We must make a note of this generated mapping symbol
4396 ourselves so that code byteswapping works properly in
4397 elf32_arm_write_section. */
4398 elf32_arm_section_map_add (s, 'a', 0);
4401 s->size += VFP11_ERRATUM_VENEER_SIZE;
4402 hash_table->vfp11_erratum_glue_size += VFP11_ERRATUM_VENEER_SIZE;
4403 hash_table->num_vfp11_fixes++;
4405 /* The offset of the veneer. */
4409 /* Note: we do not include the flag SEC_LINKER_CREATED, as that
4410 would prevent elf_link_input_bfd() from processing the contents
4412 #define ARM_GLUE_SECTION_FLAGS \
4413 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY)
4415 /* Create a fake section for use by the ARM backend of the linker. */
4418 arm_make_glue_section (bfd * abfd, const char * name)
4422 sec = bfd_get_section_by_name (abfd, name);
4427 sec = bfd_make_section_with_flags (abfd, name, ARM_GLUE_SECTION_FLAGS);
4430 || !bfd_set_section_alignment (abfd, sec, 2))
4433 /* Set the gc mark to prevent the section from being removed by garbage
4434 collection, despite the fact that no relocs refer to this section. */
4440 /* Add the glue sections to ABFD. This function is called from the
4441 linker scripts in ld/emultempl/{armelf}.em. */
4444 bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
4445 struct bfd_link_info *info)
4447 /* If we are only performing a partial
4448 link do not bother adding the glue. */
4449 if (info->relocatable)
4452 /* Linker stubs don't need glue. */
4453 if (!strcmp (abfd->filename, "linker stubs"))
4456 return arm_make_glue_section (abfd, ARM2THUMB_GLUE_SECTION_NAME)
4457 && arm_make_glue_section (abfd, THUMB2ARM_GLUE_SECTION_NAME)
4458 && arm_make_glue_section (abfd, VFP11_ERRATUM_VENEER_SECTION_NAME)
4459 && arm_make_glue_section (abfd, ARM_BX_GLUE_SECTION_NAME);
4462 /* Select a BFD to be used to hold the sections used by the glue code.
4463 This function is called from the linker scripts in ld/emultempl/
4467 bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
4469 struct elf32_arm_link_hash_table *globals;
4471 /* If we are only performing a partial link
4472 do not bother getting a bfd to hold the glue. */
4473 if (info->relocatable)
4476 /* Make sure we don't attach the glue sections to a dynamic object. */
4477 BFD_ASSERT (!(abfd->flags & DYNAMIC));
4479 globals = elf32_arm_hash_table (info);
4481 BFD_ASSERT (globals != NULL);
4483 if (globals->bfd_of_glue_owner != NULL)
4486 /* Save the bfd for later use. */
4487 globals->bfd_of_glue_owner = abfd;
4493 check_use_blx (struct elf32_arm_link_hash_table *globals)
4495 if (bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
4497 globals->use_blx = 1;
4501 bfd_elf32_arm_process_before_allocation (bfd *abfd,
4502 struct bfd_link_info *link_info)
4504 Elf_Internal_Shdr *symtab_hdr;
4505 Elf_Internal_Rela *internal_relocs = NULL;
4506 Elf_Internal_Rela *irel, *irelend;
4507 bfd_byte *contents = NULL;
4510 struct elf32_arm_link_hash_table *globals;
4512 /* If we are only performing a partial link do not bother
4513 to construct any glue. */
4514 if (link_info->relocatable)
4517 /* Here we have a bfd that is to be included on the link. We have a
4518 hook to do reloc rummaging, before section sizes are nailed down. */
4519 globals = elf32_arm_hash_table (link_info);
4521 BFD_ASSERT (globals != NULL);
4523 check_use_blx (globals);
4525 if (globals->byteswap_code && !bfd_big_endian (abfd))
4527 _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
4532 /* PR 5398: If we have not decided to include any loadable sections in
4533 the output then we will not have a glue owner bfd. This is OK, it
4534 just means that there is nothing else for us to do here. */
4535 if (globals->bfd_of_glue_owner == NULL)
4538 /* Rummage around all the relocs and map the glue vectors. */
4539 sec = abfd->sections;
4544 for (; sec != NULL; sec = sec->next)
4546 if (sec->reloc_count == 0)
4549 if ((sec->flags & SEC_EXCLUDE) != 0)
4552 symtab_hdr = & elf_symtab_hdr (abfd);
4554 /* Load the relocs. */
4556 = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, FALSE);
4558 if (internal_relocs == NULL)
4561 irelend = internal_relocs + sec->reloc_count;
4562 for (irel = internal_relocs; irel < irelend; irel++)
4565 unsigned long r_index;
4567 struct elf_link_hash_entry *h;
4569 r_type = ELF32_R_TYPE (irel->r_info);
4570 r_index = ELF32_R_SYM (irel->r_info);
4572 /* These are the only relocation types we care about. */
4573 if ( r_type != R_ARM_PC24
4574 && r_type != R_ARM_PLT32
4575 && r_type != R_ARM_JUMP24
4576 && r_type != R_ARM_THM_JUMP24
4577 && (r_type != R_ARM_V4BX || globals->fix_v4bx < 2))
4580 /* Get the section contents if we haven't done so already. */
4581 if (contents == NULL)
4583 /* Get cached copy if it exists. */
4584 if (elf_section_data (sec)->this_hdr.contents != NULL)
4585 contents = elf_section_data (sec)->this_hdr.contents;
4588 /* Go get them off disk. */
4589 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
4594 if (r_type == R_ARM_V4BX)
4598 reg = bfd_get_32 (abfd, contents + irel->r_offset) & 0xf;
4599 record_arm_bx_glue (link_info, reg);
4603 /* If the relocation is not against a symbol it cannot concern us. */
4606 /* We don't care about local symbols. */
4607 if (r_index < symtab_hdr->sh_info)
4610 /* This is an external symbol. */
4611 r_index -= symtab_hdr->sh_info;
4612 h = (struct elf_link_hash_entry *)
4613 elf_sym_hashes (abfd)[r_index];
4615 /* If the relocation is against a static symbol it must be within
4616 the current section and so cannot be a cross ARM/Thumb relocation. */
4620 /* If the call will go through a PLT entry then we do not need
4622 if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1)
4630 /* This one is a call from arm code. We need to look up
4631 the target of the call. If it is a thumb target, we
4633 if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC
4634 && !(r_type == R_ARM_CALL && globals->use_blx))
4635 record_arm_to_thumb_glue (link_info, h);
4638 case R_ARM_THM_JUMP24:
4639 /* This one is a call from thumb code. We look
4640 up the target of the call. If it is not a thumb
4641 target, we insert glue. */
4642 if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC
4643 && !(globals->use_blx && r_type == R_ARM_THM_CALL)
4644 && h->root.type != bfd_link_hash_undefweak)
4645 record_thumb_to_arm_glue (link_info, h);
4653 if (contents != NULL
4654 && elf_section_data (sec)->this_hdr.contents != contents)
4658 if (internal_relocs != NULL
4659 && elf_section_data (sec)->relocs != internal_relocs)
4660 free (internal_relocs);
4661 internal_relocs = NULL;
4667 if (contents != NULL
4668 && elf_section_data (sec)->this_hdr.contents != contents)
4670 if (internal_relocs != NULL
4671 && elf_section_data (sec)->relocs != internal_relocs)
4672 free (internal_relocs);
4679 /* Initialise maps of ARM/Thumb/data for input BFDs. */
4682 bfd_elf32_arm_init_maps (bfd *abfd)
4684 Elf_Internal_Sym *isymbuf;
4685 Elf_Internal_Shdr *hdr;
4686 unsigned int i, localsyms;
4688 /* PR 7093: Make sure that we are dealing with an arm elf binary. */
4689 if (! is_arm_elf (abfd))
4692 if ((abfd->flags & DYNAMIC) != 0)
4695 hdr = & elf_symtab_hdr (abfd);
4696 localsyms = hdr->sh_info;
4698 /* Obtain a buffer full of symbols for this BFD. The hdr->sh_info field
4699 should contain the number of local symbols, which should come before any
4700 global symbols. Mapping symbols are always local. */
4701 isymbuf = bfd_elf_get_elf_syms (abfd, hdr, localsyms, 0, NULL, NULL,
4704 /* No internal symbols read? Skip this BFD. */
4705 if (isymbuf == NULL)
4708 for (i = 0; i < localsyms; i++)
4710 Elf_Internal_Sym *isym = &isymbuf[i];
4711 asection *sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
4715 && ELF_ST_BIND (isym->st_info) == STB_LOCAL)
4717 name = bfd_elf_string_from_elf_section (abfd,
4718 hdr->sh_link, isym->st_name);
4720 if (bfd_is_arm_special_symbol_name (name,
4721 BFD_ARM_SPECIAL_SYM_TYPE_MAP))
4722 elf32_arm_section_map_add (sec, name[1], isym->st_value);
4729 bfd_elf32_arm_set_vfp11_fix (bfd *obfd, struct bfd_link_info *link_info)
4731 struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
4732 obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd);
4734 /* We assume that ARMv7+ does not need the VFP11 denorm erratum fix. */
4735 if (out_attr[Tag_CPU_arch].i >= TAG_CPU_ARCH_V7)
4737 switch (globals->vfp11_fix)
4739 case BFD_ARM_VFP11_FIX_DEFAULT:
4740 case BFD_ARM_VFP11_FIX_NONE:
4741 globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
4745 /* Give a warning, but do as the user requests anyway. */
4746 (*_bfd_error_handler) (_("%B: warning: selected VFP11 erratum "
4747 "workaround is not necessary for target architecture"), obfd);
4750 else if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_DEFAULT)
4751 /* For earlier architectures, we might need the workaround, but do not
4752 enable it by default. If users is running with broken hardware, they
4753 must enable the erratum fix explicitly. */
4754 globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
4758 enum bfd_arm_vfp11_pipe
4766 /* Return a VFP register number. This is encoded as RX:X for single-precision
4767 registers, or X:RX for double-precision registers, where RX is the group of
4768 four bits in the instruction encoding and X is the single extension bit.
4769 RX and X fields are specified using their lowest (starting) bit. The return
4772 0...31: single-precision registers s0...s31
4773 32...63: double-precision registers d0...d31.
4775 Although X should be zero for VFP11 (encoding d0...d15 only), we might
4776 encounter VFP3 instructions, so we allow the full range for DP registers. */
4779 bfd_arm_vfp11_regno (unsigned int insn, bfd_boolean is_double, unsigned int rx,
4783 return (((insn >> rx) & 0xf) | (((insn >> x) & 1) << 4)) + 32;
4785 return (((insn >> rx) & 0xf) << 1) | ((insn >> x) & 1);
4788 /* Set bits in *WMASK according to a register number REG as encoded by
4789 bfd_arm_vfp11_regno(). Ignore d16-d31. */
4792 bfd_arm_vfp11_write_mask (unsigned int *wmask, unsigned int reg)
4797 *wmask |= 3 << ((reg - 32) * 2);
4800 /* Return TRUE if WMASK overwrites anything in REGS. */
4803 bfd_arm_vfp11_antidependency (unsigned int wmask, int *regs, int numregs)
4807 for (i = 0; i < numregs; i++)
4809 unsigned int reg = regs[i];
4811 if (reg < 32 && (wmask & (1 << reg)) != 0)
4819 if ((wmask & (3 << (reg * 2))) != 0)
4826 /* In this function, we're interested in two things: finding input registers
4827 for VFP data-processing instructions, and finding the set of registers which
4828 arbitrary VFP instructions may write to. We use a 32-bit unsigned int to
4829 hold the written set, so FLDM etc. are easy to deal with (we're only
4830 interested in 32 SP registers or 16 dp registers, due to the VFP version
4831 implemented by the chip in question). DP registers are marked by setting
4832 both SP registers in the write mask). */
4834 static enum bfd_arm_vfp11_pipe
4835 bfd_arm_vfp11_insn_decode (unsigned int insn, unsigned int *destmask, int *regs,
4838 enum bfd_arm_vfp11_pipe pipe = VFP11_BAD;
4839 bfd_boolean is_double = ((insn & 0xf00) == 0xb00) ? 1 : 0;
4841 if ((insn & 0x0f000e10) == 0x0e000a00) /* A data-processing insn. */
4844 unsigned int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
4845 unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
4847 pqrs = ((insn & 0x00800000) >> 20)
4848 | ((insn & 0x00300000) >> 19)
4849 | ((insn & 0x00000040) >> 6);
4853 case 0: /* fmac[sd]. */
4854 case 1: /* fnmac[sd]. */
4855 case 2: /* fmsc[sd]. */
4856 case 3: /* fnmsc[sd]. */
4858 bfd_arm_vfp11_write_mask (destmask, fd);
4860 regs[1] = bfd_arm_vfp11_regno (insn, is_double, 16, 7); /* Fn. */
4865 case 4: /* fmul[sd]. */
4866 case 5: /* fnmul[sd]. */
4867 case 6: /* fadd[sd]. */
4868 case 7: /* fsub[sd]. */
4872 case 8: /* fdiv[sd]. */
4875 bfd_arm_vfp11_write_mask (destmask, fd);
4876 regs[0] = bfd_arm_vfp11_regno (insn, is_double, 16, 7); /* Fn. */
4881 case 15: /* extended opcode. */
4883 unsigned int extn = ((insn >> 15) & 0x1e)
4884 | ((insn >> 7) & 1);
4888 case 0: /* fcpy[sd]. */
4889 case 1: /* fabs[sd]. */
4890 case 2: /* fneg[sd]. */
4891 case 8: /* fcmp[sd]. */
4892 case 9: /* fcmpe[sd]. */
4893 case 10: /* fcmpz[sd]. */
4894 case 11: /* fcmpez[sd]. */
4895 case 16: /* fuito[sd]. */
4896 case 17: /* fsito[sd]. */
4897 case 24: /* ftoui[sd]. */
4898 case 25: /* ftouiz[sd]. */
4899 case 26: /* ftosi[sd]. */
4900 case 27: /* ftosiz[sd]. */
4901 /* These instructions will not bounce due to underflow. */
4906 case 3: /* fsqrt[sd]. */
4907 /* fsqrt cannot underflow, but it can (perhaps) overwrite
4908 registers to cause the erratum in previous instructions. */
4909 bfd_arm_vfp11_write_mask (destmask, fd);
4913 case 15: /* fcvt{ds,sd}. */
4917 bfd_arm_vfp11_write_mask (destmask, fd);
4919 /* Only FCVTSD can underflow. */
4920 if ((insn & 0x100) != 0)
4939 /* Two-register transfer. */
4940 else if ((insn & 0x0fe00ed0) == 0x0c400a10)
4942 unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
4944 if ((insn & 0x100000) == 0)
4947 bfd_arm_vfp11_write_mask (destmask, fm);
4950 bfd_arm_vfp11_write_mask (destmask, fm);
4951 bfd_arm_vfp11_write_mask (destmask, fm + 1);
4957 else if ((insn & 0x0e100e00) == 0x0c100a00) /* A load insn. */
4959 int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
4960 unsigned int puw = ((insn >> 21) & 0x1) | (((insn >> 23) & 3) << 1);
4964 case 0: /* Two-reg transfer. We should catch these above. */
4967 case 2: /* fldm[sdx]. */
4971 unsigned int i, offset = insn & 0xff;
4976 for (i = fd; i < fd + offset; i++)
4977 bfd_arm_vfp11_write_mask (destmask, i);
4981 case 4: /* fld[sd]. */
4983 bfd_arm_vfp11_write_mask (destmask, fd);
4992 /* Single-register transfer. Note L==0. */
4993 else if ((insn & 0x0f100e10) == 0x0e000a10)
4995 unsigned int opcode = (insn >> 21) & 7;
4996 unsigned int fn = bfd_arm_vfp11_regno (insn, is_double, 16, 7);
5000 case 0: /* fmsr/fmdlr. */
5001 case 1: /* fmdhr. */
5002 /* Mark fmdhr and fmdlr as writing to the whole of the DP
5003 destination register. I don't know if this is exactly right,
5004 but it is the conservative choice. */
5005 bfd_arm_vfp11_write_mask (destmask, fn);
5019 static int elf32_arm_compare_mapping (const void * a, const void * b);
5022 /* Look for potentially-troublesome code sequences which might trigger the
5023 VFP11 denormal/antidependency erratum. See, e.g., the ARM1136 errata sheet
5024 (available from ARM) for details of the erratum. A short version is
5025 described in ld.texinfo. */
5028 bfd_elf32_arm_vfp11_erratum_scan (bfd *abfd, struct bfd_link_info *link_info)
5031 bfd_byte *contents = NULL;
5033 int regs[3], numregs = 0;
5034 struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
5035 int use_vector = (globals->vfp11_fix == BFD_ARM_VFP11_FIX_VECTOR);
5037 /* We use a simple FSM to match troublesome VFP11 instruction sequences.
5038 The states transition as follows:
5040 0 -> 1 (vector) or 0 -> 2 (scalar)
5041 A VFP FMAC-pipeline instruction has been seen. Fill
5042 regs[0]..regs[numregs-1] with its input operands. Remember this
5043 instruction in 'first_fmac'.
5046 Any instruction, except for a VFP instruction which overwrites
5051 A VFP instruction has been seen which overwrites any of regs[*].
5052 We must make a veneer! Reset state to 0 before examining next
5056 If we fail to match anything in state 2, reset to state 0 and reset
5057 the instruction pointer to the instruction after 'first_fmac'.
5059 If the VFP11 vector mode is in use, there must be at least two unrelated
5060 instructions between anti-dependent VFP11 instructions to properly avoid
5061 triggering the erratum, hence the use of the extra state 1. */
5063 /* If we are only performing a partial link do not bother
5064 to construct any glue. */
5065 if (link_info->relocatable)
5068 /* Skip if this bfd does not correspond to an ELF image. */
5069 if (! is_arm_elf (abfd))
5072 /* We should have chosen a fix type by the time we get here. */
5073 BFD_ASSERT (globals->vfp11_fix != BFD_ARM_VFP11_FIX_DEFAULT);
5075 if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_NONE)
5078 /* Skip this BFD if it corresponds to an executable or dynamic object. */
5079 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
5082 for (sec = abfd->sections; sec != NULL; sec = sec->next)
5084 unsigned int i, span, first_fmac = 0, veneer_of_insn = 0;
5085 struct _arm_elf_section_data *sec_data;
5087 /* If we don't have executable progbits, we're not interested in this
5088 section. Also skip if section is to be excluded. */
5089 if (elf_section_type (sec) != SHT_PROGBITS
5090 || (elf_section_flags (sec) & SHF_EXECINSTR) == 0
5091 || (sec->flags & SEC_EXCLUDE) != 0
5092 || sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
5093 || sec->output_section == bfd_abs_section_ptr
5094 || strcmp (sec->name, VFP11_ERRATUM_VENEER_SECTION_NAME) == 0)
5097 sec_data = elf32_arm_section_data (sec);
5099 if (sec_data->mapcount == 0)
5102 if (elf_section_data (sec)->this_hdr.contents != NULL)
5103 contents = elf_section_data (sec)->this_hdr.contents;
5104 else if (! bfd_malloc_and_get_section (abfd, sec, &contents))
5107 qsort (sec_data->map, sec_data->mapcount, sizeof (elf32_arm_section_map),
5108 elf32_arm_compare_mapping);
5110 for (span = 0; span < sec_data->mapcount; span++)
5112 unsigned int span_start = sec_data->map[span].vma;
5113 unsigned int span_end = (span == sec_data->mapcount - 1)
5114 ? sec->size : sec_data->map[span + 1].vma;
5115 char span_type = sec_data->map[span].type;
5117 /* FIXME: Only ARM mode is supported at present. We may need to
5118 support Thumb-2 mode also at some point. */
5119 if (span_type != 'a')
5122 for (i = span_start; i < span_end;)
5124 unsigned int next_i = i + 4;
5125 unsigned int insn = bfd_big_endian (abfd)
5126 ? (contents[i] << 24)
5127 | (contents[i + 1] << 16)
5128 | (contents[i + 2] << 8)
5130 : (contents[i + 3] << 24)
5131 | (contents[i + 2] << 16)
5132 | (contents[i + 1] << 8)
5134 unsigned int writemask = 0;
5135 enum bfd_arm_vfp11_pipe pipe;
5140 pipe = bfd_arm_vfp11_insn_decode (insn, &writemask, regs,
5142 /* I'm assuming the VFP11 erratum can trigger with denorm
5143 operands on either the FMAC or the DS pipeline. This might
5144 lead to slightly overenthusiastic veneer insertion. */
5145 if (pipe == VFP11_FMAC || pipe == VFP11_DS)
5147 state = use_vector ? 1 : 2;
5149 veneer_of_insn = insn;
5155 int other_regs[3], other_numregs;
5156 pipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
5159 if (pipe != VFP11_BAD
5160 && bfd_arm_vfp11_antidependency (writemask, regs,
5170 int other_regs[3], other_numregs;
5171 pipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
5174 if (pipe != VFP11_BAD
5175 && bfd_arm_vfp11_antidependency (writemask, regs,
5181 next_i = first_fmac + 4;
5187 abort (); /* Should be unreachable. */
5192 elf32_vfp11_erratum_list *newerr
5193 = bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
5196 errcount = ++(elf32_arm_section_data (sec)->erratumcount);
5198 newerr->u.b.vfp_insn = veneer_of_insn;
5203 newerr->type = VFP11_ERRATUM_BRANCH_TO_ARM_VENEER;
5210 record_vfp11_erratum_veneer (link_info, newerr, abfd, sec,
5215 newerr->next = sec_data->erratumlist;
5216 sec_data->erratumlist = newerr;
5225 if (contents != NULL
5226 && elf_section_data (sec)->this_hdr.contents != contents)
5234 if (contents != NULL
5235 && elf_section_data (sec)->this_hdr.contents != contents)
5241 /* Find virtual-memory addresses for VFP11 erratum veneers and return locations
5242 after sections have been laid out, using specially-named symbols. */
5245 bfd_elf32_arm_vfp11_fix_veneer_locations (bfd *abfd,
5246 struct bfd_link_info *link_info)
5249 struct elf32_arm_link_hash_table *globals;
5252 if (link_info->relocatable)
5255 /* Skip if this bfd does not correspond to an ELF image. */
5256 if (! is_arm_elf (abfd))
5259 globals = elf32_arm_hash_table (link_info);
5261 tmp_name = bfd_malloc ((bfd_size_type) strlen
5262 (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
5264 for (sec = abfd->sections; sec != NULL; sec = sec->next)
5266 struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
5267 elf32_vfp11_erratum_list *errnode = sec_data->erratumlist;
5269 for (; errnode != NULL; errnode = errnode->next)
5271 struct elf_link_hash_entry *myh;
5274 switch (errnode->type)
5276 case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
5277 case VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER:
5278 /* Find veneer symbol. */
5279 sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
5280 errnode->u.b.veneer->u.v.id);
5282 myh = elf_link_hash_lookup
5283 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
5286 (*_bfd_error_handler) (_("%B: unable to find VFP11 veneer "
5287 "`%s'"), abfd, tmp_name);
5289 vma = myh->root.u.def.section->output_section->vma
5290 + myh->root.u.def.section->output_offset
5291 + myh->root.u.def.value;
5293 errnode->u.b.veneer->vma = vma;
5296 case VFP11_ERRATUM_ARM_VENEER:
5297 case VFP11_ERRATUM_THUMB_VENEER:
5298 /* Find return location. */
5299 sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
5302 myh = elf_link_hash_lookup
5303 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
5306 (*_bfd_error_handler) (_("%B: unable to find VFP11 veneer "
5307 "`%s'"), abfd, tmp_name);
5309 vma = myh->root.u.def.section->output_section->vma
5310 + myh->root.u.def.section->output_offset
5311 + myh->root.u.def.value;
5313 errnode->u.v.branch->vma = vma;
5326 /* Set target relocation values needed during linking. */
5329 bfd_elf32_arm_set_target_relocs (struct bfd *output_bfd,
5330 struct bfd_link_info *link_info,
5332 char * target2_type,
5335 bfd_arm_vfp11_fix vfp11_fix,
5336 int no_enum_warn, int no_wchar_warn,
5339 struct elf32_arm_link_hash_table *globals;
5341 globals = elf32_arm_hash_table (link_info);
5343 globals->target1_is_rel = target1_is_rel;
5344 if (strcmp (target2_type, "rel") == 0)
5345 globals->target2_reloc = R_ARM_REL32;
5346 else if (strcmp (target2_type, "abs") == 0)
5347 globals->target2_reloc = R_ARM_ABS32;
5348 else if (strcmp (target2_type, "got-rel") == 0)
5349 globals->target2_reloc = R_ARM_GOT_PREL;
5352 _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
5355 globals->fix_v4bx = fix_v4bx;
5356 globals->use_blx |= use_blx;
5357 globals->vfp11_fix = vfp11_fix;
5358 globals->pic_veneer = pic_veneer;
5360 BFD_ASSERT (is_arm_elf (output_bfd));
5361 elf_arm_tdata (output_bfd)->no_enum_size_warning = no_enum_warn;
5362 elf_arm_tdata (output_bfd)->no_wchar_size_warning = no_wchar_warn;
5365 /* Replace the target offset of a Thumb bl or b.w instruction. */
5368 insert_thumb_branch (bfd *abfd, long int offset, bfd_byte *insn)
5374 BFD_ASSERT ((offset & 1) == 0);
5376 upper = bfd_get_16 (abfd, insn);
5377 lower = bfd_get_16 (abfd, insn + 2);
5378 reloc_sign = (offset < 0) ? 1 : 0;
5379 upper = (upper & ~(bfd_vma) 0x7ff)
5380 | ((offset >> 12) & 0x3ff)
5381 | (reloc_sign << 10);
5382 lower = (lower & ~(bfd_vma) 0x2fff)
5383 | (((!((offset >> 23) & 1)) ^ reloc_sign) << 13)
5384 | (((!((offset >> 22) & 1)) ^ reloc_sign) << 11)
5385 | ((offset >> 1) & 0x7ff);
5386 bfd_put_16 (abfd, upper, insn);
5387 bfd_put_16 (abfd, lower, insn + 2);
5390 /* Thumb code calling an ARM function. */
5393 elf32_thumb_to_arm_stub (struct bfd_link_info * info,
5397 asection * input_section,
5398 bfd_byte * hit_data,
5401 bfd_signed_vma addend,
5403 char **error_message)
5407 long int ret_offset;
5408 struct elf_link_hash_entry * myh;
5409 struct elf32_arm_link_hash_table * globals;
5411 myh = find_thumb_glue (info, name, error_message);
5415 globals = elf32_arm_hash_table (info);
5417 BFD_ASSERT (globals != NULL);
5418 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5420 my_offset = myh->root.u.def.value;
5422 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
5423 THUMB2ARM_GLUE_SECTION_NAME);
5425 BFD_ASSERT (s != NULL);
5426 BFD_ASSERT (s->contents != NULL);
5427 BFD_ASSERT (s->output_section != NULL);
5429 if ((my_offset & 0x01) == 0x01)
5432 && sym_sec->owner != NULL
5433 && !INTERWORK_FLAG (sym_sec->owner))
5435 (*_bfd_error_handler)
5436 (_("%B(%s): warning: interworking not enabled.\n"
5437 " first occurrence: %B: thumb call to arm"),
5438 sym_sec->owner, input_bfd, name);
5444 myh->root.u.def.value = my_offset;
5446 put_thumb_insn (globals, output_bfd, (bfd_vma) t2a1_bx_pc_insn,
5447 s->contents + my_offset);
5449 put_thumb_insn (globals, output_bfd, (bfd_vma) t2a2_noop_insn,
5450 s->contents + my_offset + 2);
5453 /* Address of destination of the stub. */
5454 ((bfd_signed_vma) val)
5456 /* Offset from the start of the current section
5457 to the start of the stubs. */
5459 /* Offset of the start of this stub from the start of the stubs. */
5461 /* Address of the start of the current section. */
5462 + s->output_section->vma)
5463 /* The branch instruction is 4 bytes into the stub. */
5465 /* ARM branches work from the pc of the instruction + 8. */
5468 put_arm_insn (globals, output_bfd,
5469 (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
5470 s->contents + my_offset + 4);
5473 BFD_ASSERT (my_offset <= globals->thumb_glue_size);
5475 /* Now go back and fix up the original BL insn to point to here. */
5477 /* Address of where the stub is located. */
5478 (s->output_section->vma + s->output_offset + my_offset)
5479 /* Address of where the BL is located. */
5480 - (input_section->output_section->vma + input_section->output_offset
5482 /* Addend in the relocation. */
5484 /* Biassing for PC-relative addressing. */
5487 insert_thumb_branch (input_bfd, ret_offset, hit_data - input_section->vma);
5492 /* Populate an Arm to Thumb stub. Returns the stub symbol. */
5494 static struct elf_link_hash_entry *
5495 elf32_arm_create_thumb_stub (struct bfd_link_info * info,
5502 char ** error_message)
5505 long int ret_offset;
5506 struct elf_link_hash_entry * myh;
5507 struct elf32_arm_link_hash_table * globals;
5509 myh = find_arm_glue (info, name, error_message);
5513 globals = elf32_arm_hash_table (info);
5515 BFD_ASSERT (globals != NULL);
5516 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5518 my_offset = myh->root.u.def.value;
5520 if ((my_offset & 0x01) == 0x01)
5523 && sym_sec->owner != NULL
5524 && !INTERWORK_FLAG (sym_sec->owner))
5526 (*_bfd_error_handler)
5527 (_("%B(%s): warning: interworking not enabled.\n"
5528 " first occurrence: %B: arm call to thumb"),
5529 sym_sec->owner, input_bfd, name);
5533 myh->root.u.def.value = my_offset;
5535 if (info->shared || globals->root.is_relocatable_executable
5536 || globals->pic_veneer)
5538 /* For relocatable objects we can't use absolute addresses,
5539 so construct the address from a relative offset. */
5540 /* TODO: If the offset is small it's probably worth
5541 constructing the address with adds. */
5542 put_arm_insn (globals, output_bfd, (bfd_vma) a2t1p_ldr_insn,
5543 s->contents + my_offset);
5544 put_arm_insn (globals, output_bfd, (bfd_vma) a2t2p_add_pc_insn,
5545 s->contents + my_offset + 4);
5546 put_arm_insn (globals, output_bfd, (bfd_vma) a2t3p_bx_r12_insn,
5547 s->contents + my_offset + 8);
5548 /* Adjust the offset by 4 for the position of the add,
5549 and 8 for the pipeline offset. */
5550 ret_offset = (val - (s->output_offset
5551 + s->output_section->vma
5554 bfd_put_32 (output_bfd, ret_offset,
5555 s->contents + my_offset + 12);
5557 else if (globals->use_blx)
5559 put_arm_insn (globals, output_bfd, (bfd_vma) a2t1v5_ldr_insn,
5560 s->contents + my_offset);
5562 /* It's a thumb address. Add the low order bit. */
5563 bfd_put_32 (output_bfd, val | a2t2v5_func_addr_insn,
5564 s->contents + my_offset + 4);
5568 put_arm_insn (globals, output_bfd, (bfd_vma) a2t1_ldr_insn,
5569 s->contents + my_offset);
5571 put_arm_insn (globals, output_bfd, (bfd_vma) a2t2_bx_r12_insn,
5572 s->contents + my_offset + 4);
5574 /* It's a thumb address. Add the low order bit. */
5575 bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
5576 s->contents + my_offset + 8);
5582 BFD_ASSERT (my_offset <= globals->arm_glue_size);
5587 /* Arm code calling a Thumb function. */
5590 elf32_arm_to_thumb_stub (struct bfd_link_info * info,
5594 asection * input_section,
5595 bfd_byte * hit_data,
5598 bfd_signed_vma addend,
5600 char **error_message)
5602 unsigned long int tmp;
5605 long int ret_offset;
5606 struct elf_link_hash_entry * myh;
5607 struct elf32_arm_link_hash_table * globals;
5609 globals = elf32_arm_hash_table (info);
5611 BFD_ASSERT (globals != NULL);
5612 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5614 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
5615 ARM2THUMB_GLUE_SECTION_NAME);
5616 BFD_ASSERT (s != NULL);
5617 BFD_ASSERT (s->contents != NULL);
5618 BFD_ASSERT (s->output_section != NULL);
5620 myh = elf32_arm_create_thumb_stub (info, name, input_bfd, output_bfd,
5621 sym_sec, val, s, error_message);
5625 my_offset = myh->root.u.def.value;
5626 tmp = bfd_get_32 (input_bfd, hit_data);
5627 tmp = tmp & 0xFF000000;
5629 /* Somehow these are both 4 too far, so subtract 8. */
5630 ret_offset = (s->output_offset
5632 + s->output_section->vma
5633 - (input_section->output_offset
5634 + input_section->output_section->vma
5638 tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
5640 bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
5645 /* Populate Arm stub for an exported Thumb function. */
5648 elf32_arm_to_thumb_export_stub (struct elf_link_hash_entry *h, void * inf)
5650 struct bfd_link_info * info = (struct bfd_link_info *) inf;
5652 struct elf_link_hash_entry * myh;
5653 struct elf32_arm_link_hash_entry *eh;
5654 struct elf32_arm_link_hash_table * globals;
5657 char *error_message;
5659 eh = elf32_arm_hash_entry (h);
5660 /* Allocate stubs for exported Thumb functions on v4t. */
5661 if (eh->export_glue == NULL)
5664 globals = elf32_arm_hash_table (info);
5666 BFD_ASSERT (globals != NULL);
5667 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5669 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
5670 ARM2THUMB_GLUE_SECTION_NAME);
5671 BFD_ASSERT (s != NULL);
5672 BFD_ASSERT (s->contents != NULL);
5673 BFD_ASSERT (s->output_section != NULL);
5675 sec = eh->export_glue->root.u.def.section;
5677 BFD_ASSERT (sec->output_section != NULL);
5679 val = eh->export_glue->root.u.def.value + sec->output_offset
5680 + sec->output_section->vma;
5682 myh = elf32_arm_create_thumb_stub (info, h->root.root.string,
5683 h->root.u.def.section->owner,
5684 globals->obfd, sec, val, s,
5690 /* Populate ARMv4 BX veneers. Returns the absolute adress of the veneer. */
5693 elf32_arm_bx_glue (struct bfd_link_info * info, int reg)
5698 struct elf32_arm_link_hash_table *globals;
5700 globals = elf32_arm_hash_table (info);
5702 BFD_ASSERT (globals != NULL);
5703 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5705 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
5706 ARM_BX_GLUE_SECTION_NAME);
5707 BFD_ASSERT (s != NULL);
5708 BFD_ASSERT (s->contents != NULL);
5709 BFD_ASSERT (s->output_section != NULL);
5711 BFD_ASSERT (globals->bx_glue_offset[reg] & 2);
5713 glue_addr = globals->bx_glue_offset[reg] & ~(bfd_vma)3;
5715 if ((globals->bx_glue_offset[reg] & 1) == 0)
5717 p = s->contents + glue_addr;
5718 bfd_put_32 (globals->obfd, armbx1_tst_insn + (reg << 16), p);
5719 bfd_put_32 (globals->obfd, armbx2_moveq_insn + reg, p + 4);
5720 bfd_put_32 (globals->obfd, armbx3_bx_insn + reg, p + 8);
5721 globals->bx_glue_offset[reg] |= 1;
5724 return glue_addr + s->output_section->vma + s->output_offset;
5727 /* Generate Arm stubs for exported Thumb symbols. */
5729 elf32_arm_begin_write_processing (bfd *abfd ATTRIBUTE_UNUSED,
5730 struct bfd_link_info *link_info)
5732 struct elf32_arm_link_hash_table * globals;
5734 if (link_info == NULL)
5735 /* Ignore this if we are not called by the ELF backend linker. */
5738 globals = elf32_arm_hash_table (link_info);
5739 /* If blx is available then exported Thumb symbols are OK and there is
5741 if (globals->use_blx)
5744 elf_link_hash_traverse (&globals->root, elf32_arm_to_thumb_export_stub,
5748 /* Some relocations map to different relocations depending on the
5749 target. Return the real relocation. */
5752 arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
5758 if (globals->target1_is_rel)
5764 return globals->target2_reloc;
5771 /* Return the base VMA address which should be subtracted from real addresses
5772 when resolving @dtpoff relocation.
5773 This is PT_TLS segment p_vaddr. */
5776 dtpoff_base (struct bfd_link_info *info)
5778 /* If tls_sec is NULL, we should have signalled an error already. */
5779 if (elf_hash_table (info)->tls_sec == NULL)
5781 return elf_hash_table (info)->tls_sec->vma;
5784 /* Return the relocation value for @tpoff relocation
5785 if STT_TLS virtual address is ADDRESS. */
5788 tpoff (struct bfd_link_info *info, bfd_vma address)
5790 struct elf_link_hash_table *htab = elf_hash_table (info);
5793 /* If tls_sec is NULL, we should have signalled an error already. */
5794 if (htab->tls_sec == NULL)
5796 base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
5797 return address - htab->tls_sec->vma + base;
5800 /* Perform an R_ARM_ABS12 relocation on the field pointed to by DATA.
5801 VALUE is the relocation value. */
5803 static bfd_reloc_status_type
5804 elf32_arm_abs12_reloc (bfd *abfd, void *data, bfd_vma value)
5807 return bfd_reloc_overflow;
5809 value |= bfd_get_32 (abfd, data) & 0xfffff000;
5810 bfd_put_32 (abfd, value, data);
5811 return bfd_reloc_ok;
5814 /* For a given value of n, calculate the value of G_n as required to
5815 deal with group relocations. We return it in the form of an
5816 encoded constant-and-rotation, together with the final residual. If n is
5817 specified as less than zero, then final_residual is filled with the
5818 input value and no further action is performed. */
5821 calculate_group_reloc_mask (bfd_vma value, int n, bfd_vma *final_residual)
5825 bfd_vma encoded_g_n = 0;
5826 bfd_vma residual = value; /* Also known as Y_n. */
5828 for (current_n = 0; current_n <= n; current_n++)
5832 /* Calculate which part of the value to mask. */
5839 /* Determine the most significant bit in the residual and
5840 align the resulting value to a 2-bit boundary. */
5841 for (msb = 30; msb >= 0; msb -= 2)
5842 if (residual & (3 << msb))
5845 /* The desired shift is now (msb - 6), or zero, whichever
5852 /* Calculate g_n in 32-bit as well as encoded constant+rotation form. */
5853 g_n = residual & (0xff << shift);
5854 encoded_g_n = (g_n >> shift)
5855 | ((g_n <= 0xff ? 0 : (32 - shift) / 2) << 8);
5857 /* Calculate the residual for the next time around. */
5861 *final_residual = residual;
5866 /* Given an ARM instruction, determine whether it is an ADD or a SUB.
5867 Returns 1 if it is an ADD, -1 if it is a SUB, and 0 otherwise. */
5870 identify_add_or_sub (bfd_vma insn)
5872 int opcode = insn & 0x1e00000;
5874 if (opcode == 1 << 23) /* ADD */
5877 if (opcode == 1 << 22) /* SUB */
5883 /* Perform a relocation as part of a final link. */
5885 static bfd_reloc_status_type
5886 elf32_arm_final_link_relocate (reloc_howto_type * howto,
5889 asection * input_section,
5890 bfd_byte * contents,
5891 Elf_Internal_Rela * rel,
5893 struct bfd_link_info * info,
5895 const char * sym_name,
5897 struct elf_link_hash_entry * h,
5898 bfd_boolean * unresolved_reloc_p,
5899 char ** error_message)
5901 unsigned long r_type = howto->type;
5902 unsigned long r_symndx;
5903 bfd_byte * hit_data = contents + rel->r_offset;
5904 bfd * dynobj = NULL;
5905 Elf_Internal_Shdr * symtab_hdr;
5906 struct elf_link_hash_entry ** sym_hashes;
5907 bfd_vma * local_got_offsets;
5908 asection * sgot = NULL;
5909 asection * splt = NULL;
5910 asection * sreloc = NULL;
5912 bfd_signed_vma signed_addend;
5913 struct elf32_arm_link_hash_table * globals;
5915 globals = elf32_arm_hash_table (info);
5917 BFD_ASSERT (is_arm_elf (input_bfd));
5919 /* Some relocation types map to different relocations depending on the
5920 target. We pick the right one here. */
5921 r_type = arm_real_reloc_type (globals, r_type);
5922 if (r_type != howto->type)
5923 howto = elf32_arm_howto_from_type (r_type);
5925 /* If the start address has been set, then set the EF_ARM_HASENTRY
5926 flag. Setting this more than once is redundant, but the cost is
5927 not too high, and it keeps the code simple.
5929 The test is done here, rather than somewhere else, because the
5930 start address is only set just before the final link commences.
5932 Note - if the user deliberately sets a start address of 0, the
5933 flag will not be set. */
5934 if (bfd_get_start_address (output_bfd) != 0)
5935 elf_elfheader (output_bfd)->e_flags |= EF_ARM_HASENTRY;
5937 dynobj = elf_hash_table (info)->dynobj;
5940 sgot = bfd_get_section_by_name (dynobj, ".got");
5941 splt = bfd_get_section_by_name (dynobj, ".plt");
5943 symtab_hdr = & elf_symtab_hdr (input_bfd);
5944 sym_hashes = elf_sym_hashes (input_bfd);
5945 local_got_offsets = elf_local_got_offsets (input_bfd);
5946 r_symndx = ELF32_R_SYM (rel->r_info);
5948 if (globals->use_rel)
5950 addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
5952 if (addend & ((howto->src_mask + 1) >> 1))
5955 signed_addend &= ~ howto->src_mask;
5956 signed_addend |= addend;
5959 signed_addend = addend;
5962 addend = signed_addend = rel->r_addend;
5967 /* We don't need to find a value for this symbol. It's just a
5969 *unresolved_reloc_p = FALSE;
5970 return bfd_reloc_ok;
5973 if (!globals->vxworks_p)
5974 return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
5978 case R_ARM_ABS32_NOI:
5980 case R_ARM_REL32_NOI:
5986 /* Handle relocations which should use the PLT entry. ABS32/REL32
5987 will use the symbol's value, which may point to a PLT entry, but we
5988 don't need to handle that here. If we created a PLT entry, all
5989 branches in this object should go to it. */
5990 if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32
5991 && r_type != R_ARM_ABS32_NOI && r_type != R_ARM_REL32_NOI)
5994 && h->plt.offset != (bfd_vma) -1)
5996 /* If we've created a .plt section, and assigned a PLT entry to
5997 this function, it should not be known to bind locally. If
5998 it were, we would have cleared the PLT entry. */
5999 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
6001 value = (splt->output_section->vma
6002 + splt->output_offset
6004 *unresolved_reloc_p = FALSE;
6005 return _bfd_final_link_relocate (howto, input_bfd, input_section,
6006 contents, rel->r_offset, value,
6010 /* When generating a shared object or relocatable executable, these
6011 relocations are copied into the output file to be resolved at
6013 if ((info->shared || globals->root.is_relocatable_executable)
6014 && (input_section->flags & SEC_ALLOC)
6015 && !(elf32_arm_hash_table (info)->vxworks_p
6016 && strcmp (input_section->output_section->name,
6018 && ((r_type != R_ARM_REL32 && r_type != R_ARM_REL32_NOI)
6019 || !SYMBOL_CALLS_LOCAL (info, h))
6021 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6022 || h->root.type != bfd_link_hash_undefweak)
6023 && r_type != R_ARM_PC24
6024 && r_type != R_ARM_CALL
6025 && r_type != R_ARM_JUMP24
6026 && r_type != R_ARM_PREL31
6027 && r_type != R_ARM_PLT32)
6029 Elf_Internal_Rela outrel;
6031 bfd_boolean skip, relocate;
6033 *unresolved_reloc_p = FALSE;
6037 sreloc = _bfd_elf_get_dynamic_reloc_section (input_bfd, input_section,
6038 ! globals->use_rel);
6041 return bfd_reloc_notsupported;
6047 outrel.r_addend = addend;
6049 _bfd_elf_section_offset (output_bfd, info, input_section,
6051 if (outrel.r_offset == (bfd_vma) -1)
6053 else if (outrel.r_offset == (bfd_vma) -2)
6054 skip = TRUE, relocate = TRUE;
6055 outrel.r_offset += (input_section->output_section->vma
6056 + input_section->output_offset);
6059 memset (&outrel, 0, sizeof outrel);
6064 || !h->def_regular))
6065 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
6070 /* This symbol is local, or marked to become local. */
6071 if (sym_flags == STT_ARM_TFUNC)
6073 if (globals->symbian_p)
6077 /* On Symbian OS, the data segment and text segement
6078 can be relocated independently. Therefore, we
6079 must indicate the segment to which this
6080 relocation is relative. The BPABI allows us to
6081 use any symbol in the right segment; we just use
6082 the section symbol as it is convenient. (We
6083 cannot use the symbol given by "h" directly as it
6084 will not appear in the dynamic symbol table.)
6086 Note that the dynamic linker ignores the section
6087 symbol value, so we don't subtract osec->vma
6088 from the emitted reloc addend. */
6090 osec = sym_sec->output_section;
6092 osec = input_section->output_section;
6093 symbol = elf_section_data (osec)->dynindx;
6096 struct elf_link_hash_table *htab = elf_hash_table (info);
6098 if ((osec->flags & SEC_READONLY) == 0
6099 && htab->data_index_section != NULL)
6100 osec = htab->data_index_section;
6102 osec = htab->text_index_section;
6103 symbol = elf_section_data (osec)->dynindx;
6105 BFD_ASSERT (symbol != 0);
6108 /* On SVR4-ish systems, the dynamic loader cannot
6109 relocate the text and data segments independently,
6110 so the symbol does not matter. */
6112 outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
6113 if (globals->use_rel)
6116 outrel.r_addend += value;
6119 loc = sreloc->contents;
6120 loc += sreloc->reloc_count++ * RELOC_SIZE (globals);
6121 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
6123 /* If this reloc is against an external symbol, we do not want to
6124 fiddle with the addend. Otherwise, we need to include the symbol
6125 value so that it becomes an addend for the dynamic reloc. */
6127 return bfd_reloc_ok;
6129 return _bfd_final_link_relocate (howto, input_bfd, input_section,
6130 contents, rel->r_offset, value,
6133 else switch (r_type)
6136 return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
6138 case R_ARM_XPC25: /* Arm BLX instruction. */
6141 case R_ARM_PC24: /* Arm B/BL instruction. */
6145 bfd_signed_vma branch_offset;
6146 struct elf32_arm_stub_hash_entry *stub_entry = NULL;
6148 from = (input_section->output_section->vma
6149 + input_section->output_offset
6151 branch_offset = (bfd_signed_vma)(value - from);
6153 if (r_type == R_ARM_XPC25)
6155 /* Check for Arm calling Arm function. */
6156 /* FIXME: Should we translate the instruction into a BL
6157 instruction instead ? */
6158 if (sym_flags != STT_ARM_TFUNC)
6159 (*_bfd_error_handler)
6160 (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
6162 h ? h->root.root.string : "(local)");
6164 else if (r_type != R_ARM_CALL)
6166 /* Check for Arm calling Thumb function. */
6167 if (sym_flags == STT_ARM_TFUNC)
6169 if (elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
6170 output_bfd, input_section,
6171 hit_data, sym_sec, rel->r_offset,
6172 signed_addend, value,
6174 return bfd_reloc_ok;
6176 return bfd_reloc_dangerous;
6180 /* Check if a stub has to be inserted because the
6181 destination is too far or we are changing mode. */
6182 if (r_type == R_ARM_CALL)
6184 if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
6185 || branch_offset < ARM_MAX_BWD_BRANCH_OFFSET
6186 || sym_flags == STT_ARM_TFUNC)
6188 /* The target is out of reach, so redirect the
6189 branch to the local stub for this function. */
6191 stub_entry = elf32_arm_get_stub_entry (input_section,
6194 if (stub_entry != NULL)
6195 value = (stub_entry->stub_offset
6196 + stub_entry->stub_sec->output_offset
6197 + stub_entry->stub_sec->output_section->vma);
6201 /* The ARM ELF ABI says that this reloc is computed as: S - P + A
6203 S is the address of the symbol in the relocation.
6204 P is address of the instruction being relocated.
6205 A is the addend (extracted from the instruction) in bytes.
6207 S is held in 'value'.
6208 P is the base address of the section containing the
6209 instruction plus the offset of the reloc into that
6211 (input_section->output_section->vma +
6212 input_section->output_offset +
6214 A is the addend, converted into bytes, ie:
6217 Note: None of these operations have knowledge of the pipeline
6218 size of the processor, thus it is up to the assembler to
6219 encode this information into the addend. */
6220 value -= (input_section->output_section->vma
6221 + input_section->output_offset);
6222 value -= rel->r_offset;
6223 if (globals->use_rel)
6224 value += (signed_addend << howto->size);
6226 /* RELA addends do not have to be adjusted by howto->size. */
6227 value += signed_addend;
6229 signed_addend = value;
6230 signed_addend >>= howto->rightshift;
6232 /* A branch to an undefined weak symbol is turned into a jump to
6233 the next instruction. */
6234 if (h && h->root.type == bfd_link_hash_undefweak)
6236 value = (bfd_get_32 (input_bfd, hit_data) & 0xf0000000)
6241 /* Perform a signed range check. */
6242 if ( signed_addend > ((bfd_signed_vma) (howto->dst_mask >> 1))
6243 || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
6244 return bfd_reloc_overflow;
6246 addend = (value & 2);
6248 value = (signed_addend & howto->dst_mask)
6249 | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
6251 /* Set the H bit in the BLX instruction. */
6252 if (sym_flags == STT_ARM_TFUNC)
6257 value &= ~(bfd_vma)(1 << 24);
6259 if (r_type == R_ARM_CALL)
6261 /* Select the correct instruction (BL or BLX). */
6262 /* Only if we are not handling a BL to a stub. In this
6263 case, mode switching is performed by the stub. */
6264 if (sym_flags == STT_ARM_TFUNC && !stub_entry)
6268 value &= ~(bfd_vma)(1 << 28);
6278 if (sym_flags == STT_ARM_TFUNC)
6282 case R_ARM_ABS32_NOI:
6288 if (sym_flags == STT_ARM_TFUNC)
6290 value -= (input_section->output_section->vma
6291 + input_section->output_offset + rel->r_offset);
6294 case R_ARM_REL32_NOI:
6296 value -= (input_section->output_section->vma
6297 + input_section->output_offset + rel->r_offset);
6301 value -= (input_section->output_section->vma
6302 + input_section->output_offset + rel->r_offset);
6303 value += signed_addend;
6304 if (! h || h->root.type != bfd_link_hash_undefweak)
6306 /* Check for overflow. */
6307 if ((value ^ (value >> 1)) & (1 << 30))
6308 return bfd_reloc_overflow;
6310 value &= 0x7fffffff;
6311 value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
6312 if (sym_flags == STT_ARM_TFUNC)
6317 bfd_put_32 (input_bfd, value, hit_data);
6318 return bfd_reloc_ok;
6322 if ((long) value > 0x7f || (long) value < -0x80)
6323 return bfd_reloc_overflow;
6325 bfd_put_8 (input_bfd, value, hit_data);
6326 return bfd_reloc_ok;
6331 if ((long) value > 0x7fff || (long) value < -0x8000)
6332 return bfd_reloc_overflow;
6334 bfd_put_16 (input_bfd, value, hit_data);
6335 return bfd_reloc_ok;
6337 case R_ARM_THM_ABS5:
6338 /* Support ldr and str instructions for the thumb. */
6339 if (globals->use_rel)
6341 /* Need to refetch addend. */
6342 addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
6343 /* ??? Need to determine shift amount from operand size. */
6344 addend >>= howto->rightshift;
6348 /* ??? Isn't value unsigned? */
6349 if ((long) value > 0x1f || (long) value < -0x10)
6350 return bfd_reloc_overflow;
6352 /* ??? Value needs to be properly shifted into place first. */
6353 value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
6354 bfd_put_16 (input_bfd, value, hit_data);
6355 return bfd_reloc_ok;
6357 case R_ARM_THM_ALU_PREL_11_0:
6358 /* Corresponds to: addw.w reg, pc, #offset (and similarly for subw). */
6361 bfd_signed_vma relocation;
6363 insn = (bfd_get_16 (input_bfd, hit_data) << 16)
6364 | bfd_get_16 (input_bfd, hit_data + 2);
6366 if (globals->use_rel)
6368 signed_addend = (insn & 0xff) | ((insn & 0x7000) >> 4)
6369 | ((insn & (1 << 26)) >> 15);
6370 if (insn & 0xf00000)
6371 signed_addend = -signed_addend;
6374 relocation = value + signed_addend;
6375 relocation -= (input_section->output_section->vma
6376 + input_section->output_offset
6379 value = abs (relocation);
6381 if (value >= 0x1000)
6382 return bfd_reloc_overflow;
6384 insn = (insn & 0xfb0f8f00) | (value & 0xff)
6385 | ((value & 0x700) << 4)
6386 | ((value & 0x800) << 15);
6390 bfd_put_16 (input_bfd, insn >> 16, hit_data);
6391 bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
6393 return bfd_reloc_ok;
6396 case R_ARM_THM_PC12:
6397 /* Corresponds to: ldr.w reg, [pc, #offset]. */
6400 bfd_signed_vma relocation;
6402 insn = (bfd_get_16 (input_bfd, hit_data) << 16)
6403 | bfd_get_16 (input_bfd, hit_data + 2);
6405 if (globals->use_rel)
6407 signed_addend = insn & 0xfff;
6408 if (!(insn & (1 << 23)))
6409 signed_addend = -signed_addend;
6412 relocation = value + signed_addend;
6413 relocation -= (input_section->output_section->vma
6414 + input_section->output_offset
6417 value = abs (relocation);
6419 if (value >= 0x1000)
6420 return bfd_reloc_overflow;
6422 insn = (insn & 0xff7ff000) | value;
6423 if (relocation >= 0)
6426 bfd_put_16 (input_bfd, insn >> 16, hit_data);
6427 bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
6429 return bfd_reloc_ok;
6432 case R_ARM_THM_XPC22:
6433 case R_ARM_THM_CALL:
6434 case R_ARM_THM_JUMP24:
6435 /* Thumb BL (branch long instruction). */
6439 bfd_boolean overflow = FALSE;
6440 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
6441 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
6442 bfd_signed_vma reloc_signed_max;
6443 bfd_signed_vma reloc_signed_min;
6445 bfd_signed_vma signed_check;
6447 int thumb2 = using_thumb2 (globals);
6449 /* A branch to an undefined weak symbol is turned into a jump to
6450 the next instruction unless a PLT entry will be created. */
6451 if (h && h->root.type == bfd_link_hash_undefweak
6452 && !(splt != NULL && h->plt.offset != (bfd_vma) -1))
6454 bfd_put_16 (input_bfd, 0xe000, hit_data);
6455 bfd_put_16 (input_bfd, 0xbf00, hit_data + 2);
6456 return bfd_reloc_ok;
6459 /* Fetch the addend. We use the Thumb-2 encoding (backwards compatible
6460 with Thumb-1) involving the J1 and J2 bits. */
6461 if (globals->use_rel)
6463 bfd_vma s = (upper_insn & (1 << 10)) >> 10;
6464 bfd_vma upper = upper_insn & 0x3ff;
6465 bfd_vma lower = lower_insn & 0x7ff;
6466 bfd_vma j1 = (lower_insn & (1 << 13)) >> 13;
6467 bfd_vma j2 = (lower_insn & (1 << 11)) >> 11;
6468 bfd_vma i1 = j1 ^ s ? 0 : 1;
6469 bfd_vma i2 = j2 ^ s ? 0 : 1;
6471 addend = (i1 << 23) | (i2 << 22) | (upper << 12) | (lower << 1);
6473 addend = (addend | ((s ? 0 : 1) << 24)) - (1 << 24);
6475 signed_addend = addend;
6478 if (r_type == R_ARM_THM_XPC22)
6480 /* Check for Thumb to Thumb call. */
6481 /* FIXME: Should we translate the instruction into a BL
6482 instruction instead ? */
6483 if (sym_flags == STT_ARM_TFUNC)
6484 (*_bfd_error_handler)
6485 (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
6487 h ? h->root.root.string : "(local)");
6491 /* If it is not a call to Thumb, assume call to Arm.
6492 If it is a call relative to a section name, then it is not a
6493 function call at all, but rather a long jump. Calls through
6494 the PLT do not require stubs. */
6495 if (sym_flags != STT_ARM_TFUNC && sym_flags != STT_SECTION
6496 && (h == NULL || splt == NULL
6497 || h->plt.offset == (bfd_vma) -1))
6499 if (globals->use_blx && r_type == R_ARM_THM_CALL)
6501 /* Convert BL to BLX. */
6502 lower_insn = (lower_insn & ~0x1000) | 0x0800;
6504 else if (r_type != R_ARM_THM_CALL)
6506 if (elf32_thumb_to_arm_stub
6507 (info, sym_name, input_bfd, output_bfd, input_section,
6508 hit_data, sym_sec, rel->r_offset, signed_addend, value,
6510 return bfd_reloc_ok;
6512 return bfd_reloc_dangerous;
6515 else if (sym_flags == STT_ARM_TFUNC && globals->use_blx
6516 && r_type == R_ARM_THM_CALL)
6518 /* Make sure this is a BL. */
6519 lower_insn |= 0x1800;
6523 /* Handle calls via the PLT. */
6524 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
6526 value = (splt->output_section->vma
6527 + splt->output_offset
6529 if (globals->use_blx && r_type == R_ARM_THM_CALL)
6531 /* If the Thumb BLX instruction is available, convert the
6532 BL to a BLX instruction to call the ARM-mode PLT entry. */
6533 lower_insn = (lower_insn & ~0x1000) | 0x0800;
6536 /* Target the Thumb stub before the ARM PLT entry. */
6537 value -= PLT_THUMB_STUB_SIZE;
6538 *unresolved_reloc_p = FALSE;
6541 if (r_type == R_ARM_THM_CALL)
6543 /* Check if a stub has to be inserted because the destination
6546 bfd_signed_vma branch_offset;
6547 struct elf32_arm_stub_hash_entry *stub_entry = NULL;
6549 from = (input_section->output_section->vma
6550 + input_section->output_offset
6552 branch_offset = (bfd_signed_vma)(value - from);
6555 && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
6556 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
6559 && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
6560 || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
6561 || ((sym_flags != STT_ARM_TFUNC) && !globals->use_blx))
6563 /* The target is out of reach or we are changing modes, so
6564 redirect the branch to the local stub for this
6566 stub_entry = elf32_arm_get_stub_entry (input_section,
6569 if (stub_entry != NULL)
6570 value = (stub_entry->stub_offset
6571 + stub_entry->stub_sec->output_offset
6572 + stub_entry->stub_sec->output_section->vma);
6574 /* If this call becomes a call to Arm, force BLX. */
6575 if (globals->use_blx)
6578 && !arm_stub_is_thumb (stub_entry->stub_type))
6579 || (sym_flags != STT_ARM_TFUNC))
6580 lower_insn = (lower_insn & ~0x1000) | 0x0800;
6585 relocation = value + signed_addend;
6587 relocation -= (input_section->output_section->vma
6588 + input_section->output_offset
6591 check = relocation >> howto->rightshift;
6593 /* If this is a signed value, the rightshift just dropped
6594 leading 1 bits (assuming twos complement). */
6595 if ((bfd_signed_vma) relocation >= 0)
6596 signed_check = check;
6598 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
6600 /* Calculate the permissable maximum and minimum values for
6601 this relocation according to whether we're relocating for
6603 bitsize = howto->bitsize;
6606 reloc_signed_max = ((1 << (bitsize - 1)) - 1) >> howto->rightshift;
6607 reloc_signed_min = ~reloc_signed_max;
6609 /* Assumes two's complement. */
6610 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
6613 if ((lower_insn & 0x5000) == 0x4000)
6614 /* For a BLX instruction, make sure that the relocation is rounded up
6615 to a word boundary. This follows the semantics of the instruction
6616 which specifies that bit 1 of the target address will come from bit
6617 1 of the base address. */
6618 relocation = (relocation + 2) & ~ 3;
6620 /* Put RELOCATION back into the insn. Assumes two's complement.
6621 We use the Thumb-2 encoding, which is safe even if dealing with
6622 a Thumb-1 instruction by virtue of our overflow check above. */
6623 reloc_sign = (signed_check < 0) ? 1 : 0;
6624 upper_insn = (upper_insn & ~(bfd_vma) 0x7ff)
6625 | ((relocation >> 12) & 0x3ff)
6626 | (reloc_sign << 10);
6627 lower_insn = (lower_insn & ~(bfd_vma) 0x2fff)
6628 | (((!((relocation >> 23) & 1)) ^ reloc_sign) << 13)
6629 | (((!((relocation >> 22) & 1)) ^ reloc_sign) << 11)
6630 | ((relocation >> 1) & 0x7ff);
6632 /* Put the relocated value back in the object file: */
6633 bfd_put_16 (input_bfd, upper_insn, hit_data);
6634 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
6636 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
6640 case R_ARM_THM_JUMP19:
6641 /* Thumb32 conditional branch instruction. */
6644 bfd_boolean overflow = FALSE;
6645 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
6646 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
6647 bfd_signed_vma reloc_signed_max = 0xffffe;
6648 bfd_signed_vma reloc_signed_min = -0x100000;
6649 bfd_signed_vma signed_check;
6651 /* Need to refetch the addend, reconstruct the top three bits,
6652 and squish the two 11 bit pieces together. */
6653 if (globals->use_rel)
6655 bfd_vma S = (upper_insn & 0x0400) >> 10;
6656 bfd_vma upper = (upper_insn & 0x003f);
6657 bfd_vma J1 = (lower_insn & 0x2000) >> 13;
6658 bfd_vma J2 = (lower_insn & 0x0800) >> 11;
6659 bfd_vma lower = (lower_insn & 0x07ff);
6664 upper -= 0x0100; /* Sign extend. */
6666 addend = (upper << 12) | (lower << 1);
6667 signed_addend = addend;
6670 /* Handle calls via the PLT. */
6671 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
6673 value = (splt->output_section->vma
6674 + splt->output_offset
6676 /* Target the Thumb stub before the ARM PLT entry. */
6677 value -= PLT_THUMB_STUB_SIZE;
6678 *unresolved_reloc_p = FALSE;
6681 /* ??? Should handle interworking? GCC might someday try to
6682 use this for tail calls. */
6684 relocation = value + signed_addend;
6685 relocation -= (input_section->output_section->vma
6686 + input_section->output_offset
6688 signed_check = (bfd_signed_vma) relocation;
6690 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
6693 /* Put RELOCATION back into the insn. */
6695 bfd_vma S = (relocation & 0x00100000) >> 20;
6696 bfd_vma J2 = (relocation & 0x00080000) >> 19;
6697 bfd_vma J1 = (relocation & 0x00040000) >> 18;
6698 bfd_vma hi = (relocation & 0x0003f000) >> 12;
6699 bfd_vma lo = (relocation & 0x00000ffe) >> 1;
6701 upper_insn = (upper_insn & 0xfbc0) | (S << 10) | hi;
6702 lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
6705 /* Put the relocated value back in the object file: */
6706 bfd_put_16 (input_bfd, upper_insn, hit_data);
6707 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
6709 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
6712 case R_ARM_THM_JUMP11:
6713 case R_ARM_THM_JUMP8:
6714 case R_ARM_THM_JUMP6:
6715 /* Thumb B (branch) instruction). */
6717 bfd_signed_vma relocation;
6718 bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
6719 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
6720 bfd_signed_vma signed_check;
6722 /* CZB cannot jump backward. */
6723 if (r_type == R_ARM_THM_JUMP6)
6724 reloc_signed_min = 0;
6726 if (globals->use_rel)
6728 /* Need to refetch addend. */
6729 addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
6730 if (addend & ((howto->src_mask + 1) >> 1))
6733 signed_addend &= ~ howto->src_mask;
6734 signed_addend |= addend;
6737 signed_addend = addend;
6738 /* The value in the insn has been right shifted. We need to
6739 undo this, so that we can perform the address calculation
6740 in terms of bytes. */
6741 signed_addend <<= howto->rightshift;
6743 relocation = value + signed_addend;
6745 relocation -= (input_section->output_section->vma
6746 + input_section->output_offset
6749 relocation >>= howto->rightshift;
6750 signed_check = relocation;
6752 if (r_type == R_ARM_THM_JUMP6)
6753 relocation = ((relocation & 0x0020) << 4) | ((relocation & 0x001f) << 3);
6755 relocation &= howto->dst_mask;
6756 relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
6758 bfd_put_16 (input_bfd, relocation, hit_data);
6760 /* Assumes two's complement. */
6761 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
6762 return bfd_reloc_overflow;
6764 return bfd_reloc_ok;
6767 case R_ARM_ALU_PCREL7_0:
6768 case R_ARM_ALU_PCREL15_8:
6769 case R_ARM_ALU_PCREL23_15:
6774 insn = bfd_get_32 (input_bfd, hit_data);
6775 if (globals->use_rel)
6777 /* Extract the addend. */
6778 addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
6779 signed_addend = addend;
6781 relocation = value + signed_addend;
6783 relocation -= (input_section->output_section->vma
6784 + input_section->output_offset
6786 insn = (insn & ~0xfff)
6787 | ((howto->bitpos << 7) & 0xf00)
6788 | ((relocation >> howto->bitpos) & 0xff);
6789 bfd_put_32 (input_bfd, value, hit_data);
6791 return bfd_reloc_ok;
6793 case R_ARM_GNU_VTINHERIT:
6794 case R_ARM_GNU_VTENTRY:
6795 return bfd_reloc_ok;
6797 case R_ARM_GOTOFF32:
6798 /* Relocation is relative to the start of the
6799 global offset table. */
6801 BFD_ASSERT (sgot != NULL);
6803 return bfd_reloc_notsupported;
6805 /* If we are addressing a Thumb function, we need to adjust the
6806 address by one, so that attempts to call the function pointer will
6807 correctly interpret it as Thumb code. */
6808 if (sym_flags == STT_ARM_TFUNC)
6811 /* Note that sgot->output_offset is not involved in this
6812 calculation. We always want the start of .got. If we
6813 define _GLOBAL_OFFSET_TABLE in a different way, as is
6814 permitted by the ABI, we might have to change this
6816 value -= sgot->output_section->vma;
6817 return _bfd_final_link_relocate (howto, input_bfd, input_section,
6818 contents, rel->r_offset, value,
6822 /* Use global offset table as symbol value. */
6823 BFD_ASSERT (sgot != NULL);
6826 return bfd_reloc_notsupported;
6828 *unresolved_reloc_p = FALSE;
6829 value = sgot->output_section->vma;
6830 return _bfd_final_link_relocate (howto, input_bfd, input_section,
6831 contents, rel->r_offset, value,
6835 case R_ARM_GOT_PREL:
6836 /* Relocation is to the entry for this symbol in the
6837 global offset table. */
6839 return bfd_reloc_notsupported;
6846 off = h->got.offset;
6847 BFD_ASSERT (off != (bfd_vma) -1);
6848 dyn = globals->root.dynamic_sections_created;
6850 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
6852 && SYMBOL_REFERENCES_LOCAL (info, h))
6853 || (ELF_ST_VISIBILITY (h->other)
6854 && h->root.type == bfd_link_hash_undefweak))
6856 /* This is actually a static link, or it is a -Bsymbolic link
6857 and the symbol is defined locally. We must initialize this
6858 entry in the global offset table. Since the offset must
6859 always be a multiple of 4, we use the least significant bit
6860 to record whether we have initialized it already.
6862 When doing a dynamic link, we create a .rel(a).got relocation
6863 entry to initialize the value. This is done in the
6864 finish_dynamic_symbol routine. */
6869 /* If we are addressing a Thumb function, we need to
6870 adjust the address by one, so that attempts to
6871 call the function pointer will correctly
6872 interpret it as Thumb code. */
6873 if (sym_flags == STT_ARM_TFUNC)
6876 bfd_put_32 (output_bfd, value, sgot->contents + off);
6881 *unresolved_reloc_p = FALSE;
6883 value = sgot->output_offset + off;
6889 BFD_ASSERT (local_got_offsets != NULL &&
6890 local_got_offsets[r_symndx] != (bfd_vma) -1);
6892 off = local_got_offsets[r_symndx];
6894 /* The offset must always be a multiple of 4. We use the
6895 least significant bit to record whether we have already
6896 generated the necessary reloc. */
6901 /* If we are addressing a Thumb function, we need to
6902 adjust the address by one, so that attempts to
6903 call the function pointer will correctly
6904 interpret it as Thumb code. */
6905 if (sym_flags == STT_ARM_TFUNC)
6908 if (globals->use_rel)
6909 bfd_put_32 (output_bfd, value, sgot->contents + off);
6914 Elf_Internal_Rela outrel;
6917 srelgot = (bfd_get_section_by_name
6918 (dynobj, RELOC_SECTION (globals, ".got")));
6919 BFD_ASSERT (srelgot != NULL);
6921 outrel.r_addend = addend + value;
6922 outrel.r_offset = (sgot->output_section->vma
6923 + sgot->output_offset
6925 outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
6926 loc = srelgot->contents;
6927 loc += srelgot->reloc_count++ * RELOC_SIZE (globals);
6928 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
6931 local_got_offsets[r_symndx] |= 1;
6934 value = sgot->output_offset + off;
6936 if (r_type != R_ARM_GOT32)
6937 value += sgot->output_section->vma;
6939 return _bfd_final_link_relocate (howto, input_bfd, input_section,
6940 contents, rel->r_offset, value,
6943 case R_ARM_TLS_LDO32:
6944 value = value - dtpoff_base (info);
6946 return _bfd_final_link_relocate (howto, input_bfd, input_section,
6947 contents, rel->r_offset, value,
6950 case R_ARM_TLS_LDM32:
6954 if (globals->sgot == NULL)
6957 off = globals->tls_ldm_got.offset;
6963 /* If we don't know the module number, create a relocation
6967 Elf_Internal_Rela outrel;
6970 if (globals->srelgot == NULL)
6973 outrel.r_addend = 0;
6974 outrel.r_offset = (globals->sgot->output_section->vma
6975 + globals->sgot->output_offset + off);
6976 outrel.r_info = ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32);
6978 if (globals->use_rel)
6979 bfd_put_32 (output_bfd, outrel.r_addend,
6980 globals->sgot->contents + off);
6982 loc = globals->srelgot->contents;
6983 loc += globals->srelgot->reloc_count++ * RELOC_SIZE (globals);
6984 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
6987 bfd_put_32 (output_bfd, 1, globals->sgot->contents + off);
6989 globals->tls_ldm_got.offset |= 1;
6992 value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
6993 - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
6995 return _bfd_final_link_relocate (howto, input_bfd, input_section,
6996 contents, rel->r_offset, value,
7000 case R_ARM_TLS_GD32:
7001 case R_ARM_TLS_IE32:
7007 if (globals->sgot == NULL)
7014 dyn = globals->root.dynamic_sections_created;
7015 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
7017 || !SYMBOL_REFERENCES_LOCAL (info, h)))
7019 *unresolved_reloc_p = FALSE;
7022 off = h->got.offset;
7023 tls_type = ((struct elf32_arm_link_hash_entry *) h)->tls_type;
7027 if (local_got_offsets == NULL)
7029 off = local_got_offsets[r_symndx];
7030 tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
7033 if (tls_type == GOT_UNKNOWN)
7040 bfd_boolean need_relocs = FALSE;
7041 Elf_Internal_Rela outrel;
7042 bfd_byte *loc = NULL;
7045 /* The GOT entries have not been initialized yet. Do it
7046 now, and emit any relocations. If both an IE GOT and a
7047 GD GOT are necessary, we emit the GD first. */
7049 if ((info->shared || indx != 0)
7051 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
7052 || h->root.type != bfd_link_hash_undefweak))
7055 if (globals->srelgot == NULL)
7057 loc = globals->srelgot->contents;
7058 loc += globals->srelgot->reloc_count * RELOC_SIZE (globals);
7061 if (tls_type & GOT_TLS_GD)
7065 outrel.r_addend = 0;
7066 outrel.r_offset = (globals->sgot->output_section->vma
7067 + globals->sgot->output_offset
7069 outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DTPMOD32);
7071 if (globals->use_rel)
7072 bfd_put_32 (output_bfd, outrel.r_addend,
7073 globals->sgot->contents + cur_off);
7075 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
7076 globals->srelgot->reloc_count++;
7077 loc += RELOC_SIZE (globals);
7080 bfd_put_32 (output_bfd, value - dtpoff_base (info),
7081 globals->sgot->contents + cur_off + 4);
7084 outrel.r_addend = 0;
7085 outrel.r_info = ELF32_R_INFO (indx,
7086 R_ARM_TLS_DTPOFF32);
7087 outrel.r_offset += 4;
7089 if (globals->use_rel)
7090 bfd_put_32 (output_bfd, outrel.r_addend,
7091 globals->sgot->contents + cur_off + 4);
7094 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
7095 globals->srelgot->reloc_count++;
7096 loc += RELOC_SIZE (globals);
7101 /* If we are not emitting relocations for a
7102 general dynamic reference, then we must be in a
7103 static link or an executable link with the
7104 symbol binding locally. Mark it as belonging
7105 to module 1, the executable. */
7106 bfd_put_32 (output_bfd, 1,
7107 globals->sgot->contents + cur_off);
7108 bfd_put_32 (output_bfd, value - dtpoff_base (info),
7109 globals->sgot->contents + cur_off + 4);
7115 if (tls_type & GOT_TLS_IE)
7120 outrel.r_addend = value - dtpoff_base (info);
7122 outrel.r_addend = 0;
7123 outrel.r_offset = (globals->sgot->output_section->vma
7124 + globals->sgot->output_offset
7126 outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_TPOFF32);
7128 if (globals->use_rel)
7129 bfd_put_32 (output_bfd, outrel.r_addend,
7130 globals->sgot->contents + cur_off);
7132 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
7133 globals->srelgot->reloc_count++;
7134 loc += RELOC_SIZE (globals);
7137 bfd_put_32 (output_bfd, tpoff (info, value),
7138 globals->sgot->contents + cur_off);
7145 local_got_offsets[r_symndx] |= 1;
7148 if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32)
7150 value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
7151 - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
7153 return _bfd_final_link_relocate (howto, input_bfd, input_section,
7154 contents, rel->r_offset, value,
7158 case R_ARM_TLS_LE32:
7161 (*_bfd_error_handler)
7162 (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
7163 input_bfd, input_section,
7164 (long) rel->r_offset, howto->name);
7168 value = tpoff (info, value);
7170 return _bfd_final_link_relocate (howto, input_bfd, input_section,
7171 contents, rel->r_offset, value,
7175 if (globals->fix_v4bx)
7177 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7179 /* Ensure that we have a BX instruction. */
7180 BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
7182 if (globals->fix_v4bx == 2 && (insn & 0xf) != 0xf)
7184 /* Branch to veneer. */
7186 glue_addr = elf32_arm_bx_glue (info, insn & 0xf);
7187 glue_addr -= input_section->output_section->vma
7188 + input_section->output_offset
7189 + rel->r_offset + 8;
7190 insn = (insn & 0xf0000000) | 0x0a000000
7191 | ((glue_addr >> 2) & 0x00ffffff);
7195 /* Preserve Rm (lowest four bits) and the condition code
7196 (highest four bits). Other bits encode MOV PC,Rm. */
7197 insn = (insn & 0xf000000f) | 0x01a0f000;
7200 bfd_put_32 (input_bfd, insn, hit_data);
7202 return bfd_reloc_ok;
7204 case R_ARM_MOVW_ABS_NC:
7205 case R_ARM_MOVT_ABS:
7206 case R_ARM_MOVW_PREL_NC:
7207 case R_ARM_MOVT_PREL:
7208 /* Until we properly support segment-base-relative addressing then
7209 we assume the segment base to be zero, as for the group relocations.
7210 Thus R_ARM_MOVW_BREL_NC has the same semantics as R_ARM_MOVW_ABS_NC
7211 and R_ARM_MOVT_BREL has the same semantics as R_ARM_MOVT_ABS. */
7212 case R_ARM_MOVW_BREL_NC:
7213 case R_ARM_MOVW_BREL:
7214 case R_ARM_MOVT_BREL:
7216 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7218 if (globals->use_rel)
7220 addend = ((insn >> 4) & 0xf000) | (insn & 0xfff);
7221 signed_addend = (addend ^ 0x8000) - 0x8000;
7224 value += signed_addend;
7226 if (r_type == R_ARM_MOVW_PREL_NC || r_type == R_ARM_MOVT_PREL)
7227 value -= (input_section->output_section->vma
7228 + input_section->output_offset + rel->r_offset);
7230 if (r_type == R_ARM_MOVW_BREL && value >= 0x10000)
7231 return bfd_reloc_overflow;
7233 if (sym_flags == STT_ARM_TFUNC)
7236 if (r_type == R_ARM_MOVT_ABS || r_type == R_ARM_MOVT_PREL
7237 || r_type == R_ARM_MOVT_BREL)
7241 insn |= value & 0xfff;
7242 insn |= (value & 0xf000) << 4;
7243 bfd_put_32 (input_bfd, insn, hit_data);
7245 return bfd_reloc_ok;
7247 case R_ARM_THM_MOVW_ABS_NC:
7248 case R_ARM_THM_MOVT_ABS:
7249 case R_ARM_THM_MOVW_PREL_NC:
7250 case R_ARM_THM_MOVT_PREL:
7251 /* Until we properly support segment-base-relative addressing then
7252 we assume the segment base to be zero, as for the above relocations.
7253 Thus R_ARM_THM_MOVW_BREL_NC has the same semantics as
7254 R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_BREL has the same semantics
7255 as R_ARM_THM_MOVT_ABS. */
7256 case R_ARM_THM_MOVW_BREL_NC:
7257 case R_ARM_THM_MOVW_BREL:
7258 case R_ARM_THM_MOVT_BREL:
7262 insn = bfd_get_16 (input_bfd, hit_data) << 16;
7263 insn |= bfd_get_16 (input_bfd, hit_data + 2);
7265 if (globals->use_rel)
7267 addend = ((insn >> 4) & 0xf000)
7268 | ((insn >> 15) & 0x0800)
7269 | ((insn >> 4) & 0x0700)
7271 signed_addend = (addend ^ 0x8000) - 0x8000;
7274 value += signed_addend;
7276 if (r_type == R_ARM_THM_MOVW_PREL_NC || r_type == R_ARM_THM_MOVT_PREL)
7277 value -= (input_section->output_section->vma
7278 + input_section->output_offset + rel->r_offset);
7280 if (r_type == R_ARM_THM_MOVW_BREL && value >= 0x10000)
7281 return bfd_reloc_overflow;
7283 if (sym_flags == STT_ARM_TFUNC)
7286 if (r_type == R_ARM_THM_MOVT_ABS || r_type == R_ARM_THM_MOVT_PREL
7287 || r_type == R_ARM_THM_MOVT_BREL)
7291 insn |= (value & 0xf000) << 4;
7292 insn |= (value & 0x0800) << 15;
7293 insn |= (value & 0x0700) << 4;
7294 insn |= (value & 0x00ff);
7296 bfd_put_16 (input_bfd, insn >> 16, hit_data);
7297 bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
7299 return bfd_reloc_ok;
7301 case R_ARM_ALU_PC_G0_NC:
7302 case R_ARM_ALU_PC_G1_NC:
7303 case R_ARM_ALU_PC_G0:
7304 case R_ARM_ALU_PC_G1:
7305 case R_ARM_ALU_PC_G2:
7306 case R_ARM_ALU_SB_G0_NC:
7307 case R_ARM_ALU_SB_G1_NC:
7308 case R_ARM_ALU_SB_G0:
7309 case R_ARM_ALU_SB_G1:
7310 case R_ARM_ALU_SB_G2:
7312 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7313 bfd_vma pc = input_section->output_section->vma
7314 + input_section->output_offset + rel->r_offset;
7315 /* sb should be the origin of the *segment* containing the symbol.
7316 It is not clear how to obtain this OS-dependent value, so we
7317 make an arbitrary choice of zero. */
7321 bfd_signed_vma signed_value;
7324 /* Determine which group of bits to select. */
7327 case R_ARM_ALU_PC_G0_NC:
7328 case R_ARM_ALU_PC_G0:
7329 case R_ARM_ALU_SB_G0_NC:
7330 case R_ARM_ALU_SB_G0:
7334 case R_ARM_ALU_PC_G1_NC:
7335 case R_ARM_ALU_PC_G1:
7336 case R_ARM_ALU_SB_G1_NC:
7337 case R_ARM_ALU_SB_G1:
7341 case R_ARM_ALU_PC_G2:
7342 case R_ARM_ALU_SB_G2:
7350 /* If REL, extract the addend from the insn. If RELA, it will
7351 have already been fetched for us. */
7352 if (globals->use_rel)
7355 bfd_vma constant = insn & 0xff;
7356 bfd_vma rotation = (insn & 0xf00) >> 8;
7359 signed_addend = constant;
7362 /* Compensate for the fact that in the instruction, the
7363 rotation is stored in multiples of 2 bits. */
7366 /* Rotate "constant" right by "rotation" bits. */
7367 signed_addend = (constant >> rotation) |
7368 (constant << (8 * sizeof (bfd_vma) - rotation));
7371 /* Determine if the instruction is an ADD or a SUB.
7372 (For REL, this determines the sign of the addend.) */
7373 negative = identify_add_or_sub (insn);
7376 (*_bfd_error_handler)
7377 (_("%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group relocations"),
7378 input_bfd, input_section,
7379 (long) rel->r_offset, howto->name);
7380 return bfd_reloc_overflow;
7383 signed_addend *= negative;
7386 /* Compute the value (X) to go in the place. */
7387 if (r_type == R_ARM_ALU_PC_G0_NC
7388 || r_type == R_ARM_ALU_PC_G1_NC
7389 || r_type == R_ARM_ALU_PC_G0
7390 || r_type == R_ARM_ALU_PC_G1
7391 || r_type == R_ARM_ALU_PC_G2)
7393 signed_value = value - pc + signed_addend;
7395 /* Section base relative. */
7396 signed_value = value - sb + signed_addend;
7398 /* If the target symbol is a Thumb function, then set the
7399 Thumb bit in the address. */
7400 if (sym_flags == STT_ARM_TFUNC)
7403 /* Calculate the value of the relevant G_n, in encoded
7404 constant-with-rotation format. */
7405 g_n = calculate_group_reloc_mask (abs (signed_value), group,
7408 /* Check for overflow if required. */
7409 if ((r_type == R_ARM_ALU_PC_G0
7410 || r_type == R_ARM_ALU_PC_G1
7411 || r_type == R_ARM_ALU_PC_G2
7412 || r_type == R_ARM_ALU_SB_G0
7413 || r_type == R_ARM_ALU_SB_G1
7414 || r_type == R_ARM_ALU_SB_G2) && residual != 0)
7416 (*_bfd_error_handler)
7417 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7418 input_bfd, input_section,
7419 (long) rel->r_offset, abs (signed_value), howto->name);
7420 return bfd_reloc_overflow;
7423 /* Mask out the value and the ADD/SUB part of the opcode; take care
7424 not to destroy the S bit. */
7427 /* Set the opcode according to whether the value to go in the
7428 place is negative. */
7429 if (signed_value < 0)
7434 /* Encode the offset. */
7437 bfd_put_32 (input_bfd, insn, hit_data);
7439 return bfd_reloc_ok;
7441 case R_ARM_LDR_PC_G0:
7442 case R_ARM_LDR_PC_G1:
7443 case R_ARM_LDR_PC_G2:
7444 case R_ARM_LDR_SB_G0:
7445 case R_ARM_LDR_SB_G1:
7446 case R_ARM_LDR_SB_G2:
7448 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7449 bfd_vma pc = input_section->output_section->vma
7450 + input_section->output_offset + rel->r_offset;
7451 bfd_vma sb = 0; /* See note above. */
7453 bfd_signed_vma signed_value;
7456 /* Determine which groups of bits to calculate. */
7459 case R_ARM_LDR_PC_G0:
7460 case R_ARM_LDR_SB_G0:
7464 case R_ARM_LDR_PC_G1:
7465 case R_ARM_LDR_SB_G1:
7469 case R_ARM_LDR_PC_G2:
7470 case R_ARM_LDR_SB_G2:
7478 /* If REL, extract the addend from the insn. If RELA, it will
7479 have already been fetched for us. */
7480 if (globals->use_rel)
7482 int negative = (insn & (1 << 23)) ? 1 : -1;
7483 signed_addend = negative * (insn & 0xfff);
7486 /* Compute the value (X) to go in the place. */
7487 if (r_type == R_ARM_LDR_PC_G0
7488 || r_type == R_ARM_LDR_PC_G1
7489 || r_type == R_ARM_LDR_PC_G2)
7491 signed_value = value - pc + signed_addend;
7493 /* Section base relative. */
7494 signed_value = value - sb + signed_addend;
7496 /* Calculate the value of the relevant G_{n-1} to obtain
7497 the residual at that stage. */
7498 calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
7500 /* Check for overflow. */
7501 if (residual >= 0x1000)
7503 (*_bfd_error_handler)
7504 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7505 input_bfd, input_section,
7506 (long) rel->r_offset, abs (signed_value), howto->name);
7507 return bfd_reloc_overflow;
7510 /* Mask out the value and U bit. */
7513 /* Set the U bit if the value to go in the place is non-negative. */
7514 if (signed_value >= 0)
7517 /* Encode the offset. */
7520 bfd_put_32 (input_bfd, insn, hit_data);
7522 return bfd_reloc_ok;
7524 case R_ARM_LDRS_PC_G0:
7525 case R_ARM_LDRS_PC_G1:
7526 case R_ARM_LDRS_PC_G2:
7527 case R_ARM_LDRS_SB_G0:
7528 case R_ARM_LDRS_SB_G1:
7529 case R_ARM_LDRS_SB_G2:
7531 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7532 bfd_vma pc = input_section->output_section->vma
7533 + input_section->output_offset + rel->r_offset;
7534 bfd_vma sb = 0; /* See note above. */
7536 bfd_signed_vma signed_value;
7539 /* Determine which groups of bits to calculate. */
7542 case R_ARM_LDRS_PC_G0:
7543 case R_ARM_LDRS_SB_G0:
7547 case R_ARM_LDRS_PC_G1:
7548 case R_ARM_LDRS_SB_G1:
7552 case R_ARM_LDRS_PC_G2:
7553 case R_ARM_LDRS_SB_G2:
7561 /* If REL, extract the addend from the insn. If RELA, it will
7562 have already been fetched for us. */
7563 if (globals->use_rel)
7565 int negative = (insn & (1 << 23)) ? 1 : -1;
7566 signed_addend = negative * (((insn & 0xf00) >> 4) + (insn & 0xf));
7569 /* Compute the value (X) to go in the place. */
7570 if (r_type == R_ARM_LDRS_PC_G0
7571 || r_type == R_ARM_LDRS_PC_G1
7572 || r_type == R_ARM_LDRS_PC_G2)
7574 signed_value = value - pc + signed_addend;
7576 /* Section base relative. */
7577 signed_value = value - sb + signed_addend;
7579 /* Calculate the value of the relevant G_{n-1} to obtain
7580 the residual at that stage. */
7581 calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
7583 /* Check for overflow. */
7584 if (residual >= 0x100)
7586 (*_bfd_error_handler)
7587 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7588 input_bfd, input_section,
7589 (long) rel->r_offset, abs (signed_value), howto->name);
7590 return bfd_reloc_overflow;
7593 /* Mask out the value and U bit. */
7596 /* Set the U bit if the value to go in the place is non-negative. */
7597 if (signed_value >= 0)
7600 /* Encode the offset. */
7601 insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
7603 bfd_put_32 (input_bfd, insn, hit_data);
7605 return bfd_reloc_ok;
7607 case R_ARM_LDC_PC_G0:
7608 case R_ARM_LDC_PC_G1:
7609 case R_ARM_LDC_PC_G2:
7610 case R_ARM_LDC_SB_G0:
7611 case R_ARM_LDC_SB_G1:
7612 case R_ARM_LDC_SB_G2:
7614 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7615 bfd_vma pc = input_section->output_section->vma
7616 + input_section->output_offset + rel->r_offset;
7617 bfd_vma sb = 0; /* See note above. */
7619 bfd_signed_vma signed_value;
7622 /* Determine which groups of bits to calculate. */
7625 case R_ARM_LDC_PC_G0:
7626 case R_ARM_LDC_SB_G0:
7630 case R_ARM_LDC_PC_G1:
7631 case R_ARM_LDC_SB_G1:
7635 case R_ARM_LDC_PC_G2:
7636 case R_ARM_LDC_SB_G2:
7644 /* If REL, extract the addend from the insn. If RELA, it will
7645 have already been fetched for us. */
7646 if (globals->use_rel)
7648 int negative = (insn & (1 << 23)) ? 1 : -1;
7649 signed_addend = negative * ((insn & 0xff) << 2);
7652 /* Compute the value (X) to go in the place. */
7653 if (r_type == R_ARM_LDC_PC_G0
7654 || r_type == R_ARM_LDC_PC_G1
7655 || r_type == R_ARM_LDC_PC_G2)
7657 signed_value = value - pc + signed_addend;
7659 /* Section base relative. */
7660 signed_value = value - sb + signed_addend;
7662 /* Calculate the value of the relevant G_{n-1} to obtain
7663 the residual at that stage. */
7664 calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
7666 /* Check for overflow. (The absolute value to go in the place must be
7667 divisible by four and, after having been divided by four, must
7668 fit in eight bits.) */
7669 if ((residual & 0x3) != 0 || residual >= 0x400)
7671 (*_bfd_error_handler)
7672 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7673 input_bfd, input_section,
7674 (long) rel->r_offset, abs (signed_value), howto->name);
7675 return bfd_reloc_overflow;
7678 /* Mask out the value and U bit. */
7681 /* Set the U bit if the value to go in the place is non-negative. */
7682 if (signed_value >= 0)
7685 /* Encode the offset. */
7686 insn |= residual >> 2;
7688 bfd_put_32 (input_bfd, insn, hit_data);
7690 return bfd_reloc_ok;
7693 return bfd_reloc_notsupported;
7697 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS. */
7699 arm_add_to_rel (bfd * abfd,
7701 reloc_howto_type * howto,
7702 bfd_signed_vma increment)
7704 bfd_signed_vma addend;
7706 if (howto->type == R_ARM_THM_CALL
7707 || howto->type == R_ARM_THM_JUMP24)
7709 int upper_insn, lower_insn;
7712 upper_insn = bfd_get_16 (abfd, address);
7713 lower_insn = bfd_get_16 (abfd, address + 2);
7714 upper = upper_insn & 0x7ff;
7715 lower = lower_insn & 0x7ff;
7717 addend = (upper << 12) | (lower << 1);
7718 addend += increment;
7721 upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
7722 lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
7724 bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
7725 bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
7731 contents = bfd_get_32 (abfd, address);
7733 /* Get the (signed) value from the instruction. */
7734 addend = contents & howto->src_mask;
7735 if (addend & ((howto->src_mask + 1) >> 1))
7737 bfd_signed_vma mask;
7740 mask &= ~ howto->src_mask;
7744 /* Add in the increment, (which is a byte value). */
7745 switch (howto->type)
7748 addend += increment;
7755 addend <<= howto->size;
7756 addend += increment;
7758 /* Should we check for overflow here ? */
7760 /* Drop any undesired bits. */
7761 addend >>= howto->rightshift;
7765 contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
7767 bfd_put_32 (abfd, contents, address);
7771 #define IS_ARM_TLS_RELOC(R_TYPE) \
7772 ((R_TYPE) == R_ARM_TLS_GD32 \
7773 || (R_TYPE) == R_ARM_TLS_LDO32 \
7774 || (R_TYPE) == R_ARM_TLS_LDM32 \
7775 || (R_TYPE) == R_ARM_TLS_DTPOFF32 \
7776 || (R_TYPE) == R_ARM_TLS_DTPMOD32 \
7777 || (R_TYPE) == R_ARM_TLS_TPOFF32 \
7778 || (R_TYPE) == R_ARM_TLS_LE32 \
7779 || (R_TYPE) == R_ARM_TLS_IE32)
7781 /* Relocate an ARM ELF section. */
7784 elf32_arm_relocate_section (bfd * output_bfd,
7785 struct bfd_link_info * info,
7787 asection * input_section,
7788 bfd_byte * contents,
7789 Elf_Internal_Rela * relocs,
7790 Elf_Internal_Sym * local_syms,
7791 asection ** local_sections)
7793 Elf_Internal_Shdr *symtab_hdr;
7794 struct elf_link_hash_entry **sym_hashes;
7795 Elf_Internal_Rela *rel;
7796 Elf_Internal_Rela *relend;
7798 struct elf32_arm_link_hash_table * globals;
7800 globals = elf32_arm_hash_table (info);
7802 symtab_hdr = & elf_symtab_hdr (input_bfd);
7803 sym_hashes = elf_sym_hashes (input_bfd);
7806 relend = relocs + input_section->reloc_count;
7807 for (; rel < relend; rel++)
7810 reloc_howto_type * howto;
7811 unsigned long r_symndx;
7812 Elf_Internal_Sym * sym;
7814 struct elf_link_hash_entry * h;
7816 bfd_reloc_status_type r;
7819 bfd_boolean unresolved_reloc = FALSE;
7820 char *error_message = NULL;
7822 r_symndx = ELF32_R_SYM (rel->r_info);
7823 r_type = ELF32_R_TYPE (rel->r_info);
7824 r_type = arm_real_reloc_type (globals, r_type);
7826 if ( r_type == R_ARM_GNU_VTENTRY
7827 || r_type == R_ARM_GNU_VTINHERIT)
7830 bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
7831 howto = bfd_reloc.howto;
7837 if (r_symndx < symtab_hdr->sh_info)
7839 sym = local_syms + r_symndx;
7840 sym_type = ELF32_ST_TYPE (sym->st_info);
7841 sec = local_sections[r_symndx];
7842 if (globals->use_rel)
7844 relocation = (sec->output_section->vma
7845 + sec->output_offset
7847 if (!info->relocatable
7848 && (sec->flags & SEC_MERGE)
7849 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7852 bfd_vma addend, value;
7856 case R_ARM_MOVW_ABS_NC:
7857 case R_ARM_MOVT_ABS:
7858 value = bfd_get_32 (input_bfd, contents + rel->r_offset);
7859 addend = ((value & 0xf0000) >> 4) | (value & 0xfff);
7860 addend = (addend ^ 0x8000) - 0x8000;
7863 case R_ARM_THM_MOVW_ABS_NC:
7864 case R_ARM_THM_MOVT_ABS:
7865 value = bfd_get_16 (input_bfd, contents + rel->r_offset)
7867 value |= bfd_get_16 (input_bfd,
7868 contents + rel->r_offset + 2);
7869 addend = ((value & 0xf7000) >> 4) | (value & 0xff)
7870 | ((value & 0x04000000) >> 15);
7871 addend = (addend ^ 0x8000) - 0x8000;
7875 if (howto->rightshift
7876 || (howto->src_mask & (howto->src_mask + 1)))
7878 (*_bfd_error_handler)
7879 (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
7880 input_bfd, input_section,
7881 (long) rel->r_offset, howto->name);
7885 value = bfd_get_32 (input_bfd, contents + rel->r_offset);
7887 /* Get the (signed) value from the instruction. */
7888 addend = value & howto->src_mask;
7889 if (addend & ((howto->src_mask + 1) >> 1))
7891 bfd_signed_vma mask;
7894 mask &= ~ howto->src_mask;
7902 _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
7904 addend += msec->output_section->vma + msec->output_offset;
7906 /* Cases here must match those in the preceeding
7907 switch statement. */
7910 case R_ARM_MOVW_ABS_NC:
7911 case R_ARM_MOVT_ABS:
7912 value = (value & 0xfff0f000) | ((addend & 0xf000) << 4)
7914 bfd_put_32 (input_bfd, value, contents + rel->r_offset);
7917 case R_ARM_THM_MOVW_ABS_NC:
7918 case R_ARM_THM_MOVT_ABS:
7919 value = (value & 0xfbf08f00) | ((addend & 0xf700) << 4)
7920 | (addend & 0xff) | ((addend & 0x0800) << 15);
7921 bfd_put_16 (input_bfd, value >> 16,
7922 contents + rel->r_offset);
7923 bfd_put_16 (input_bfd, value,
7924 contents + rel->r_offset + 2);
7928 value = (value & ~ howto->dst_mask)
7929 | (addend & howto->dst_mask);
7930 bfd_put_32 (input_bfd, value, contents + rel->r_offset);
7936 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
7942 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
7943 r_symndx, symtab_hdr, sym_hashes,
7945 unresolved_reloc, warned);
7950 if (sec != NULL && elf_discarded_section (sec))
7952 /* For relocs against symbols from removed linkonce sections,
7953 or sections discarded by a linker script, we just want the
7954 section contents zeroed. Avoid any special processing. */
7955 _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
7961 if (info->relocatable)
7963 /* This is a relocatable link. We don't have to change
7964 anything, unless the reloc is against a section symbol,
7965 in which case we have to adjust according to where the
7966 section symbol winds up in the output section. */
7967 if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7969 if (globals->use_rel)
7970 arm_add_to_rel (input_bfd, contents + rel->r_offset,
7971 howto, (bfd_signed_vma) sec->output_offset);
7973 rel->r_addend += sec->output_offset;
7979 name = h->root.root.string;
7982 name = (bfd_elf_string_from_elf_section
7983 (input_bfd, symtab_hdr->sh_link, sym->st_name));
7984 if (name == NULL || *name == '\0')
7985 name = bfd_section_name (input_bfd, sec);
7989 && r_type != R_ARM_NONE
7991 || h->root.type == bfd_link_hash_defined
7992 || h->root.type == bfd_link_hash_defweak)
7993 && IS_ARM_TLS_RELOC (r_type) != (sym_type == STT_TLS))
7995 (*_bfd_error_handler)
7996 ((sym_type == STT_TLS
7997 ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
7998 : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
8001 (long) rel->r_offset,
8006 r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
8007 input_section, contents, rel,
8008 relocation, info, sec, name,
8009 (h ? ELF_ST_TYPE (h->type) :
8010 ELF_ST_TYPE (sym->st_info)), h,
8011 &unresolved_reloc, &error_message);
8013 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
8014 because such sections are not SEC_ALLOC and thus ld.so will
8015 not process them. */
8016 if (unresolved_reloc
8017 && !((input_section->flags & SEC_DEBUGGING) != 0
8020 (*_bfd_error_handler)
8021 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
8024 (long) rel->r_offset,
8026 h->root.root.string);
8030 if (r != bfd_reloc_ok)
8034 case bfd_reloc_overflow:
8035 /* If the overflowing reloc was to an undefined symbol,
8036 we have already printed one error message and there
8037 is no point complaining again. */
8039 h->root.type != bfd_link_hash_undefined)
8040 && (!((*info->callbacks->reloc_overflow)
8041 (info, (h ? &h->root : NULL), name, howto->name,
8042 (bfd_vma) 0, input_bfd, input_section,
8047 case bfd_reloc_undefined:
8048 if (!((*info->callbacks->undefined_symbol)
8049 (info, name, input_bfd, input_section,
8050 rel->r_offset, TRUE)))
8054 case bfd_reloc_outofrange:
8055 error_message = _("out of range");
8058 case bfd_reloc_notsupported:
8059 error_message = _("unsupported relocation");
8062 case bfd_reloc_dangerous:
8063 /* error_message should already be set. */
8067 error_message = _("unknown error");
8071 BFD_ASSERT (error_message != NULL);
8072 if (!((*info->callbacks->reloc_dangerous)
8073 (info, error_message, input_bfd, input_section,
8084 /* Set the right machine number. */
8087 elf32_arm_object_p (bfd *abfd)
8091 mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
8093 if (mach != bfd_mach_arm_unknown)
8094 bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
8096 else if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
8097 bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
8100 bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
8105 /* Function to keep ARM specific flags in the ELF header. */
8108 elf32_arm_set_private_flags (bfd *abfd, flagword flags)
8110 if (elf_flags_init (abfd)
8111 && elf_elfheader (abfd)->e_flags != flags)
8113 if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
8115 if (flags & EF_ARM_INTERWORK)
8116 (*_bfd_error_handler)
8117 (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
8121 (_("Warning: Clearing the interworking flag of %B due to outside request"),
8127 elf_elfheader (abfd)->e_flags = flags;
8128 elf_flags_init (abfd) = TRUE;
8134 /* Copy backend specific data from one object module to another. */
8137 elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
8142 if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
8145 in_flags = elf_elfheader (ibfd)->e_flags;
8146 out_flags = elf_elfheader (obfd)->e_flags;
8148 if (elf_flags_init (obfd)
8149 && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
8150 && in_flags != out_flags)
8152 /* Cannot mix APCS26 and APCS32 code. */
8153 if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
8156 /* Cannot mix float APCS and non-float APCS code. */
8157 if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
8160 /* If the src and dest have different interworking flags
8161 then turn off the interworking bit. */
8162 if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
8164 if (out_flags & EF_ARM_INTERWORK)
8166 (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
8169 in_flags &= ~EF_ARM_INTERWORK;
8172 /* Likewise for PIC, though don't warn for this case. */
8173 if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
8174 in_flags &= ~EF_ARM_PIC;
8177 elf_elfheader (obfd)->e_flags = in_flags;
8178 elf_flags_init (obfd) = TRUE;
8180 /* Also copy the EI_OSABI field. */
8181 elf_elfheader (obfd)->e_ident[EI_OSABI] =
8182 elf_elfheader (ibfd)->e_ident[EI_OSABI];
8184 /* Copy object attributes. */
8185 _bfd_elf_copy_obj_attributes (ibfd, obfd);
8190 /* Values for Tag_ABI_PCS_R9_use. */
8199 /* Values for Tag_ABI_PCS_RW_data. */
8202 AEABI_PCS_RW_data_absolute,
8203 AEABI_PCS_RW_data_PCrel,
8204 AEABI_PCS_RW_data_SBrel,
8205 AEABI_PCS_RW_data_unused
8208 /* Values for Tag_ABI_enum_size. */
8214 AEABI_enum_forced_wide
8217 /* Determine whether an object attribute tag takes an integer, a
8221 elf32_arm_obj_attrs_arg_type (int tag)
8223 if (tag == Tag_compatibility)
8224 return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL;
8225 else if (tag == Tag_nodefaults)
8226 return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_NO_DEFAULT;
8227 else if (tag == Tag_CPU_raw_name || tag == Tag_CPU_name)
8228 return ATTR_TYPE_FLAG_STR_VAL;
8230 return ATTR_TYPE_FLAG_INT_VAL;
8232 return (tag & 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL : ATTR_TYPE_FLAG_INT_VAL;
8235 /* The ABI defines that Tag_conformance should be emitted first, and that
8236 Tag_nodefaults should be second (if either is defined). This sets those
8237 two positions, and bumps up the position of all the remaining tags to
8240 elf32_arm_obj_attrs_order (int num)
8243 return Tag_conformance;
8245 return Tag_nodefaults;
8246 if ((num - 2) < Tag_nodefaults)
8248 if ((num - 1) < Tag_conformance)
8253 /* Read the architecture from the Tag_also_compatible_with attribute, if any.
8254 Returns -1 if no architecture could be read. */
8257 get_secondary_compatible_arch (bfd *abfd)
8259 obj_attribute *attr =
8260 &elf_known_obj_attributes_proc (abfd)[Tag_also_compatible_with];
8262 /* Note: the tag and its argument below are uleb128 values, though
8263 currently-defined values fit in one byte for each. */
8265 && attr->s[0] == Tag_CPU_arch
8266 && (attr->s[1] & 128) != 128
8270 /* This tag is "safely ignorable", so don't complain if it looks funny. */
8274 /* Set, or unset, the architecture of the Tag_also_compatible_with attribute.
8275 The tag is removed if ARCH is -1. */
8278 set_secondary_compatible_arch (bfd *abfd, int arch)
8280 obj_attribute *attr =
8281 &elf_known_obj_attributes_proc (abfd)[Tag_also_compatible_with];
8289 /* Note: the tag and its argument below are uleb128 values, though
8290 currently-defined values fit in one byte for each. */
8292 attr->s = bfd_alloc (abfd, 3);
8293 attr->s[0] = Tag_CPU_arch;
8298 /* Combine two values for Tag_CPU_arch, taking secondary compatibility tags
8302 tag_cpu_arch_combine (bfd *ibfd, int oldtag, int *secondary_compat_out,
8303 int newtag, int secondary_compat)
8305 #define T(X) TAG_CPU_ARCH_##X
8306 int tagl, tagh, result;
8309 T(V6T2), /* PRE_V4. */
8313 T(V6T2), /* V5TE. */
8314 T(V6T2), /* V5TEJ. */
8321 T(V6K), /* PRE_V4. */
8326 T(V6K), /* V5TEJ. */
8328 T(V6KZ), /* V6KZ. */
8334 T(V7), /* PRE_V4. */
8353 T(V6K), /* V5TEJ. */
8355 T(V6KZ), /* V6KZ. */
8368 T(V6K), /* V5TEJ. */
8370 T(V6KZ), /* V6KZ. */
8374 T(V6S_M), /* V6_M. */
8375 T(V6S_M) /* V6S_M. */
8377 const int v4t_plus_v6_m[] =
8383 T(V5TE), /* V5TE. */
8384 T(V5TEJ), /* V5TEJ. */
8386 T(V6KZ), /* V6KZ. */
8387 T(V6T2), /* V6T2. */
8390 T(V6_M), /* V6_M. */
8391 T(V6S_M), /* V6S_M. */
8392 T(V4T_PLUS_V6_M) /* V4T plus V6_M. */
8401 /* Pseudo-architecture. */
8405 /* Check we've not got a higher architecture than we know about. */
8407 if (oldtag >= MAX_TAG_CPU_ARCH || newtag >= MAX_TAG_CPU_ARCH)
8409 _bfd_error_handler (_("ERROR: %B: Unknown CPU architecture"), ibfd);
8413 /* Override old tag if we have a Tag_also_compatible_with on the output. */
8415 if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
8416 || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
8417 oldtag = T(V4T_PLUS_V6_M);
8419 /* And override the new tag if we have a Tag_also_compatible_with on the
8422 if ((newtag == T(V6_M) && secondary_compat == T(V4T))
8423 || (newtag == T(V4T) && secondary_compat == T(V6_M)))
8424 newtag = T(V4T_PLUS_V6_M);
8426 tagl = (oldtag < newtag) ? oldtag : newtag;
8427 result = tagh = (oldtag > newtag) ? oldtag : newtag;
8429 /* Architectures before V6KZ add features monotonically. */
8430 if (tagh <= TAG_CPU_ARCH_V6KZ)
8433 result = comb[tagh - T(V6T2)][tagl];
8435 /* Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
8436 as the canonical version. */
8437 if (result == T(V4T_PLUS_V6_M))
8440 *secondary_compat_out = T(V6_M);
8443 *secondary_compat_out = -1;
8447 _bfd_error_handler (_("ERROR: %B: Conflicting CPU architectures %d/%d"),
8448 ibfd, oldtag, newtag);
8456 /* Merge EABI object attributes from IBFD into OBFD. Raise an error if there
8457 are conflicting attributes. */
8460 elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
8462 obj_attribute *in_attr;
8463 obj_attribute *out_attr;
8464 obj_attribute_list *in_list;
8465 obj_attribute_list *out_list;
8466 obj_attribute_list **out_listp;
8467 /* Some tags have 0 = don't care, 1 = strong requirement,
8468 2 = weak requirement. */
8469 static const int order_021[3] = {0, 2, 1};
8470 /* For use with Tag_VFP_arch. */
8471 static const int order_01243[5] = {0, 1, 2, 4, 3};
8473 bfd_boolean result = TRUE;
8475 if (!elf_known_obj_attributes_proc (obfd)[0].i)
8477 /* This is the first object. Copy the attributes. */
8478 _bfd_elf_copy_obj_attributes (ibfd, obfd);
8480 /* Use the Tag_null value to indicate the attributes have been
8482 elf_known_obj_attributes_proc (obfd)[0].i = 1;
8487 in_attr = elf_known_obj_attributes_proc (ibfd);
8488 out_attr = elf_known_obj_attributes_proc (obfd);
8489 /* This needs to happen before Tag_ABI_FP_number_model is merged. */
8490 if (in_attr[Tag_ABI_VFP_args].i != out_attr[Tag_ABI_VFP_args].i)
8492 /* Ignore mismatches if the object doesn't use floating point. */
8493 if (out_attr[Tag_ABI_FP_number_model].i == 0)
8494 out_attr[Tag_ABI_VFP_args].i = in_attr[Tag_ABI_VFP_args].i;
8495 else if (in_attr[Tag_ABI_FP_number_model].i != 0)
8498 (_("ERROR: %B uses VFP register arguments, %B does not"),
8504 for (i = 4; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++)
8506 /* Merge this attribute with existing attributes. */
8509 case Tag_CPU_raw_name:
8511 /* These are merged after Tag_CPU_arch. */
8514 case Tag_ABI_optimization_goals:
8515 case Tag_ABI_FP_optimization_goals:
8516 /* Use the first value seen. */
8521 int secondary_compat = -1, secondary_compat_out = -1;
8522 unsigned int saved_out_attr = out_attr[i].i;
8523 static const char *name_table[] = {
8524 /* These aren't real CPU names, but we can't guess
8525 that from the architecture version alone. */
8541 /* Merge Tag_CPU_arch and Tag_also_compatible_with. */
8542 secondary_compat = get_secondary_compatible_arch (ibfd);
8543 secondary_compat_out = get_secondary_compatible_arch (obfd);
8544 out_attr[i].i = tag_cpu_arch_combine (ibfd, out_attr[i].i,
8545 &secondary_compat_out,
8548 set_secondary_compatible_arch (obfd, secondary_compat_out);
8550 /* Merge Tag_CPU_name and Tag_CPU_raw_name. */
8551 if (out_attr[i].i == saved_out_attr)
8552 ; /* Leave the names alone. */
8553 else if (out_attr[i].i == in_attr[i].i)
8555 /* The output architecture has been changed to match the
8556 input architecture. Use the input names. */
8557 out_attr[Tag_CPU_name].s = in_attr[Tag_CPU_name].s
8558 ? _bfd_elf_attr_strdup (obfd, in_attr[Tag_CPU_name].s)
8560 out_attr[Tag_CPU_raw_name].s = in_attr[Tag_CPU_raw_name].s
8561 ? _bfd_elf_attr_strdup (obfd, in_attr[Tag_CPU_raw_name].s)
8566 out_attr[Tag_CPU_name].s = NULL;
8567 out_attr[Tag_CPU_raw_name].s = NULL;
8570 /* If we still don't have a value for Tag_CPU_name,
8571 make one up now. Tag_CPU_raw_name remains blank. */
8572 if (out_attr[Tag_CPU_name].s == NULL
8573 && out_attr[i].i < ARRAY_SIZE (name_table))
8574 out_attr[Tag_CPU_name].s =
8575 _bfd_elf_attr_strdup (obfd, name_table[out_attr[i].i]);
8579 case Tag_ARM_ISA_use:
8580 case Tag_THUMB_ISA_use:
8582 case Tag_Advanced_SIMD_arch:
8583 /* ??? Do Advanced_SIMD (NEON) and WMMX conflict? */
8584 case Tag_ABI_FP_rounding:
8585 case Tag_ABI_FP_exceptions:
8586 case Tag_ABI_FP_user_exceptions:
8587 case Tag_ABI_FP_number_model:
8588 case Tag_VFP_HP_extension:
8589 case Tag_CPU_unaligned_access:
8591 case Tag_Virtualization_use:
8592 case Tag_MPextension_use:
8593 /* Use the largest value specified. */
8594 if (in_attr[i].i > out_attr[i].i)
8595 out_attr[i].i = in_attr[i].i;
8598 case Tag_ABI_align8_preserved:
8599 case Tag_ABI_PCS_RO_data:
8600 /* Use the smallest value specified. */
8601 if (in_attr[i].i < out_attr[i].i)
8602 out_attr[i].i = in_attr[i].i;
8605 case Tag_ABI_align8_needed:
8606 if ((in_attr[i].i > 0 || out_attr[i].i > 0)
8607 && (in_attr[Tag_ABI_align8_preserved].i == 0
8608 || out_attr[Tag_ABI_align8_preserved].i == 0))
8610 /* This error message should be enabled once all non-conformant
8611 binaries in the toolchain have had the attributes set
8614 (_("ERROR: %B: 8-byte data alignment conflicts with %B"),
8619 case Tag_ABI_FP_denormal:
8620 case Tag_ABI_PCS_GOT_use:
8621 /* Use the "greatest" from the sequence 0, 2, 1, or the largest
8622 value if greater than 2 (for future-proofing). */
8623 if ((in_attr[i].i > 2 && in_attr[i].i > out_attr[i].i)
8624 || (in_attr[i].i <= 2 && out_attr[i].i <= 2
8625 && order_021[in_attr[i].i] > order_021[out_attr[i].i]))
8626 out_attr[i].i = in_attr[i].i;
8630 case Tag_CPU_arch_profile:
8631 if (out_attr[i].i != in_attr[i].i)
8633 /* 0 will merge with anything.
8634 'A' and 'S' merge to 'A'.
8635 'R' and 'S' merge to 'R'.
8636 'M' and 'A|R|S' is an error. */
8637 if (out_attr[i].i == 0
8638 || (out_attr[i].i == 'S'
8639 && (in_attr[i].i == 'A' || in_attr[i].i == 'R')))
8640 out_attr[i].i = in_attr[i].i;
8641 else if (in_attr[i].i == 0
8642 || (in_attr[i].i == 'S'
8643 && (out_attr[i].i == 'A' || out_attr[i].i == 'R')))
8648 (_("ERROR: %B: Conflicting architecture profiles %c/%c"),
8650 in_attr[i].i ? in_attr[i].i : '0',
8651 out_attr[i].i ? out_attr[i].i : '0');
8657 /* Use the "greatest" from the sequence 0, 1, 2, 4, 3, or the
8658 largest value if greater than 4 (for future-proofing). */
8659 if ((in_attr[i].i > 4 && in_attr[i].i > out_attr[i].i)
8660 || (in_attr[i].i <= 4 && out_attr[i].i <= 4
8661 && order_01243[in_attr[i].i] > order_01243[out_attr[i].i]))
8662 out_attr[i].i = in_attr[i].i;
8664 case Tag_PCS_config:
8665 if (out_attr[i].i == 0)
8666 out_attr[i].i = in_attr[i].i;
8667 else if (in_attr[i].i != 0 && out_attr[i].i != 0)
8669 /* It's sometimes ok to mix different configs, so this is only
8672 (_("Warning: %B: Conflicting platform configuration"), ibfd);
8675 case Tag_ABI_PCS_R9_use:
8676 if (in_attr[i].i != out_attr[i].i
8677 && out_attr[i].i != AEABI_R9_unused
8678 && in_attr[i].i != AEABI_R9_unused)
8681 (_("ERROR: %B: Conflicting use of R9"), ibfd);
8684 if (out_attr[i].i == AEABI_R9_unused)
8685 out_attr[i].i = in_attr[i].i;
8687 case Tag_ABI_PCS_RW_data:
8688 if (in_attr[i].i == AEABI_PCS_RW_data_SBrel
8689 && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_SB
8690 && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_unused)
8693 (_("ERROR: %B: SB relative addressing conflicts with use of R9"),
8697 /* Use the smallest value specified. */
8698 if (in_attr[i].i < out_attr[i].i)
8699 out_attr[i].i = in_attr[i].i;
8701 case Tag_ABI_PCS_wchar_t:
8702 if (out_attr[i].i && in_attr[i].i && out_attr[i].i != in_attr[i].i
8703 && !elf_arm_tdata (obfd)->no_wchar_size_warning)
8706 (_("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"),
8707 ibfd, in_attr[i].i, out_attr[i].i);
8709 else if (in_attr[i].i && !out_attr[i].i)
8710 out_attr[i].i = in_attr[i].i;
8712 case Tag_ABI_enum_size:
8713 if (in_attr[i].i != AEABI_enum_unused)
8715 if (out_attr[i].i == AEABI_enum_unused
8716 || out_attr[i].i == AEABI_enum_forced_wide)
8718 /* The existing object is compatible with anything.
8719 Use whatever requirements the new object has. */
8720 out_attr[i].i = in_attr[i].i;
8722 else if (in_attr[i].i != AEABI_enum_forced_wide
8723 && out_attr[i].i != in_attr[i].i
8724 && !elf_arm_tdata (obfd)->no_enum_size_warning)
8726 static const char *aeabi_enum_names[] =
8727 { "", "variable-size", "32-bit", "" };
8728 const char *in_name =
8729 in_attr[i].i < ARRAY_SIZE(aeabi_enum_names)
8730 ? aeabi_enum_names[in_attr[i].i]
8732 const char *out_name =
8733 out_attr[i].i < ARRAY_SIZE(aeabi_enum_names)
8734 ? aeabi_enum_names[out_attr[i].i]
8737 (_("warning: %B uses %s enums yet the output is to use %s enums; use of enum values across objects may fail"),
8738 ibfd, in_name, out_name);
8742 case Tag_ABI_VFP_args:
8745 case Tag_ABI_WMMX_args:
8746 if (in_attr[i].i != out_attr[i].i)
8749 (_("ERROR: %B uses iWMMXt register arguments, %B does not"),
8754 case Tag_compatibility:
8755 /* Merged in target-independent code. */
8757 case Tag_ABI_HardFP_use:
8758 /* 1 (SP) and 2 (DP) conflict, so combine to 3 (SP & DP). */
8759 if ((in_attr[i].i == 1 && out_attr[i].i == 2)
8760 || (in_attr[i].i == 2 && out_attr[i].i == 1))
8762 else if (in_attr[i].i > out_attr[i].i)
8763 out_attr[i].i = in_attr[i].i;
8765 case Tag_ABI_FP_16bit_format:
8766 if (in_attr[i].i != 0 && out_attr[i].i != 0)
8768 if (in_attr[i].i != out_attr[i].i)
8771 (_("ERROR: fp16 format mismatch between %B and %B"),
8776 if (in_attr[i].i != 0)
8777 out_attr[i].i = in_attr[i].i;
8780 case Tag_nodefaults:
8781 /* This tag is set if it exists, but the value is unused (and is
8782 typically zero). We don't actually need to do anything here -
8783 the merge happens automatically when the type flags are merged
8786 case Tag_also_compatible_with:
8787 /* Already done in Tag_CPU_arch. */
8789 case Tag_conformance:
8790 /* Keep the attribute if it matches. Throw it away otherwise.
8791 No attribute means no claim to conform. */
8792 if (!in_attr[i].s || !out_attr[i].s
8793 || strcmp (in_attr[i].s, out_attr[i].s) != 0)
8794 out_attr[i].s = NULL;
8799 bfd *err_bfd = NULL;
8801 /* The "known_obj_attributes" table does contain some undefined
8802 attributes. Ensure that there are unused. */
8803 if (out_attr[i].i != 0 || out_attr[i].s != NULL)
8805 else if (in_attr[i].i != 0 || in_attr[i].s != NULL)
8808 if (err_bfd != NULL)
8810 /* Attribute numbers >=64 (mod 128) can be safely ignored. */
8814 (_("%B: Unknown mandatory EABI object attribute %d"),
8816 bfd_set_error (bfd_error_bad_value);
8822 (_("Warning: %B: Unknown EABI object attribute %d"),
8827 /* Only pass on attributes that match in both inputs. */
8828 if (in_attr[i].i != out_attr[i].i
8829 || in_attr[i].s != out_attr[i].s
8830 || (in_attr[i].s != NULL && out_attr[i].s != NULL
8831 && strcmp (in_attr[i].s, out_attr[i].s) != 0))
8834 out_attr[i].s = NULL;
8839 /* If out_attr was copied from in_attr then it won't have a type yet. */
8840 if (in_attr[i].type && !out_attr[i].type)
8841 out_attr[i].type = in_attr[i].type;
8844 /* Merge Tag_compatibility attributes and any common GNU ones. */
8845 _bfd_elf_merge_object_attributes (ibfd, obfd);
8847 /* Check for any attributes not known on ARM. */
8848 in_list = elf_other_obj_attributes_proc (ibfd);
8849 out_listp = &elf_other_obj_attributes_proc (obfd);
8850 out_list = *out_listp;
8852 for (; in_list || out_list; )
8854 bfd *err_bfd = NULL;
8857 /* The tags for each list are in numerical order. */
8858 /* If the tags are equal, then merge. */
8859 if (out_list && (!in_list || in_list->tag > out_list->tag))
8861 /* This attribute only exists in obfd. We can't merge, and we don't
8862 know what the tag means, so delete it. */
8864 err_tag = out_list->tag;
8865 *out_listp = out_list->next;
8866 out_list = *out_listp;
8868 else if (in_list && (!out_list || in_list->tag < out_list->tag))
8870 /* This attribute only exists in ibfd. We can't merge, and we don't
8871 know what the tag means, so ignore it. */
8873 err_tag = in_list->tag;
8874 in_list = in_list->next;
8876 else /* The tags are equal. */
8878 /* As present, all attributes in the list are unknown, and
8879 therefore can't be merged meaningfully. */
8881 err_tag = out_list->tag;
8883 /* Only pass on attributes that match in both inputs. */
8884 if (in_list->attr.i != out_list->attr.i
8885 || in_list->attr.s != out_list->attr.s
8886 || (in_list->attr.s && out_list->attr.s
8887 && strcmp (in_list->attr.s, out_list->attr.s) != 0))
8889 /* No match. Delete the attribute. */
8890 *out_listp = out_list->next;
8891 out_list = *out_listp;
8895 /* Matched. Keep the attribute and move to the next. */
8896 out_list = out_list->next;
8897 in_list = in_list->next;
8903 /* Attribute numbers >=64 (mod 128) can be safely ignored. */
8904 if ((err_tag & 127) < 64)
8907 (_("%B: Unknown mandatory EABI object attribute %d"),
8909 bfd_set_error (bfd_error_bad_value);
8915 (_("Warning: %B: Unknown EABI object attribute %d"),
8924 /* Return TRUE if the two EABI versions are incompatible. */
8927 elf32_arm_versions_compatible (unsigned iver, unsigned over)
8929 /* v4 and v5 are the same spec before and after it was released,
8930 so allow mixing them. */
8931 if ((iver == EF_ARM_EABI_VER4 && over == EF_ARM_EABI_VER5)
8932 || (iver == EF_ARM_EABI_VER5 && over == EF_ARM_EABI_VER4))
8935 return (iver == over);
8938 /* Merge backend specific data from an object file to the output
8939 object file when linking. */
8942 elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
8946 bfd_boolean flags_compatible = TRUE;
8949 /* Check if we have the same endianess. */
8950 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
8953 if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
8956 if (!elf32_arm_merge_eabi_attributes (ibfd, obfd))
8959 /* The input BFD must have had its flags initialised. */
8960 /* The following seems bogus to me -- The flags are initialized in
8961 the assembler but I don't think an elf_flags_init field is
8962 written into the object. */
8963 /* BFD_ASSERT (elf_flags_init (ibfd)); */
8965 in_flags = elf_elfheader (ibfd)->e_flags;
8966 out_flags = elf_elfheader (obfd)->e_flags;
8968 /* In theory there is no reason why we couldn't handle this. However
8969 in practice it isn't even close to working and there is no real
8970 reason to want it. */
8971 if (EF_ARM_EABI_VERSION (in_flags) >= EF_ARM_EABI_VER4
8972 && !(ibfd->flags & DYNAMIC)
8973 && (in_flags & EF_ARM_BE8))
8975 _bfd_error_handler (_("ERROR: %B is already in final BE8 format"),
8980 if (!elf_flags_init (obfd))
8982 /* If the input is the default architecture and had the default
8983 flags then do not bother setting the flags for the output
8984 architecture, instead allow future merges to do this. If no
8985 future merges ever set these flags then they will retain their
8986 uninitialised values, which surprise surprise, correspond
8987 to the default values. */
8988 if (bfd_get_arch_info (ibfd)->the_default
8989 && elf_elfheader (ibfd)->e_flags == 0)
8992 elf_flags_init (obfd) = TRUE;
8993 elf_elfheader (obfd)->e_flags = in_flags;
8995 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
8996 && bfd_get_arch_info (obfd)->the_default)
8997 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
9002 /* Determine what should happen if the input ARM architecture
9003 does not match the output ARM architecture. */
9004 if (! bfd_arm_merge_machines (ibfd, obfd))
9007 /* Identical flags must be compatible. */
9008 if (in_flags == out_flags)
9011 /* Check to see if the input BFD actually contains any sections. If
9012 not, its flags may not have been initialised either, but it
9013 cannot actually cause any incompatiblity. Do not short-circuit
9014 dynamic objects; their section list may be emptied by
9015 elf_link_add_object_symbols.
9017 Also check to see if there are no code sections in the input.
9018 In this case there is no need to check for code specific flags.
9019 XXX - do we need to worry about floating-point format compatability
9020 in data sections ? */
9021 if (!(ibfd->flags & DYNAMIC))
9023 bfd_boolean null_input_bfd = TRUE;
9024 bfd_boolean only_data_sections = TRUE;
9026 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9028 /* Ignore synthetic glue sections. */
9029 if (strcmp (sec->name, ".glue_7")
9030 && strcmp (sec->name, ".glue_7t"))
9032 if ((bfd_get_section_flags (ibfd, sec)
9033 & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
9034 == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
9035 only_data_sections = FALSE;
9037 null_input_bfd = FALSE;
9042 if (null_input_bfd || only_data_sections)
9046 /* Complain about various flag mismatches. */
9047 if (!elf32_arm_versions_compatible (EF_ARM_EABI_VERSION (in_flags),
9048 EF_ARM_EABI_VERSION (out_flags)))
9051 (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
9053 (in_flags & EF_ARM_EABIMASK) >> 24,
9054 (out_flags & EF_ARM_EABIMASK) >> 24);
9058 /* Not sure what needs to be checked for EABI versions >= 1. */
9059 /* VxWorks libraries do not use these flags. */
9060 if (get_elf_backend_data (obfd) != &elf32_arm_vxworks_bed
9061 && get_elf_backend_data (ibfd) != &elf32_arm_vxworks_bed
9062 && EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
9064 if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
9067 (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
9069 in_flags & EF_ARM_APCS_26 ? 26 : 32,
9070 out_flags & EF_ARM_APCS_26 ? 26 : 32);
9071 flags_compatible = FALSE;
9074 if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
9076 if (in_flags & EF_ARM_APCS_FLOAT)
9078 (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"),
9082 (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"),
9085 flags_compatible = FALSE;
9088 if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
9090 if (in_flags & EF_ARM_VFP_FLOAT)
9092 (_("ERROR: %B uses VFP instructions, whereas %B does not"),
9096 (_("ERROR: %B uses FPA instructions, whereas %B does not"),
9099 flags_compatible = FALSE;
9102 if ((in_flags & EF_ARM_MAVERICK_FLOAT) != (out_flags & EF_ARM_MAVERICK_FLOAT))
9104 if (in_flags & EF_ARM_MAVERICK_FLOAT)
9106 (_("ERROR: %B uses Maverick instructions, whereas %B does not"),
9110 (_("ERROR: %B does not use Maverick instructions, whereas %B does"),
9113 flags_compatible = FALSE;
9116 #ifdef EF_ARM_SOFT_FLOAT
9117 if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
9119 /* We can allow interworking between code that is VFP format
9120 layout, and uses either soft float or integer regs for
9121 passing floating point arguments and results. We already
9122 know that the APCS_FLOAT flags match; similarly for VFP
9124 if ((in_flags & EF_ARM_APCS_FLOAT) != 0
9125 || (in_flags & EF_ARM_VFP_FLOAT) == 0)
9127 if (in_flags & EF_ARM_SOFT_FLOAT)
9129 (_("ERROR: %B uses software FP, whereas %B uses hardware FP"),
9133 (_("ERROR: %B uses hardware FP, whereas %B uses software FP"),
9136 flags_compatible = FALSE;
9141 /* Interworking mismatch is only a warning. */
9142 if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
9144 if (in_flags & EF_ARM_INTERWORK)
9147 (_("Warning: %B supports interworking, whereas %B does not"),
9153 (_("Warning: %B does not support interworking, whereas %B does"),
9159 return flags_compatible;
9162 /* Display the flags field. */
9165 elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
9167 FILE * file = (FILE *) ptr;
9168 unsigned long flags;
9170 BFD_ASSERT (abfd != NULL && ptr != NULL);
9172 /* Print normal ELF private data. */
9173 _bfd_elf_print_private_bfd_data (abfd, ptr);
9175 flags = elf_elfheader (abfd)->e_flags;
9176 /* Ignore init flag - it may not be set, despite the flags field
9177 containing valid data. */
9179 /* xgettext:c-format */
9180 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
9182 switch (EF_ARM_EABI_VERSION (flags))
9184 case EF_ARM_EABI_UNKNOWN:
9185 /* The following flag bits are GNU extensions and not part of the
9186 official ARM ELF extended ABI. Hence they are only decoded if
9187 the EABI version is not set. */
9188 if (flags & EF_ARM_INTERWORK)
9189 fprintf (file, _(" [interworking enabled]"));
9191 if (flags & EF_ARM_APCS_26)
9192 fprintf (file, " [APCS-26]");
9194 fprintf (file, " [APCS-32]");
9196 if (flags & EF_ARM_VFP_FLOAT)
9197 fprintf (file, _(" [VFP float format]"));
9198 else if (flags & EF_ARM_MAVERICK_FLOAT)
9199 fprintf (file, _(" [Maverick float format]"));
9201 fprintf (file, _(" [FPA float format]"));
9203 if (flags & EF_ARM_APCS_FLOAT)
9204 fprintf (file, _(" [floats passed in float registers]"));
9206 if (flags & EF_ARM_PIC)
9207 fprintf (file, _(" [position independent]"));
9209 if (flags & EF_ARM_NEW_ABI)
9210 fprintf (file, _(" [new ABI]"));
9212 if (flags & EF_ARM_OLD_ABI)
9213 fprintf (file, _(" [old ABI]"));
9215 if (flags & EF_ARM_SOFT_FLOAT)
9216 fprintf (file, _(" [software FP]"));
9218 flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
9219 | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
9220 | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT
9221 | EF_ARM_MAVERICK_FLOAT);
9224 case EF_ARM_EABI_VER1:
9225 fprintf (file, _(" [Version1 EABI]"));
9227 if (flags & EF_ARM_SYMSARESORTED)
9228 fprintf (file, _(" [sorted symbol table]"));
9230 fprintf (file, _(" [unsorted symbol table]"));
9232 flags &= ~ EF_ARM_SYMSARESORTED;
9235 case EF_ARM_EABI_VER2:
9236 fprintf (file, _(" [Version2 EABI]"));
9238 if (flags & EF_ARM_SYMSARESORTED)
9239 fprintf (file, _(" [sorted symbol table]"));
9241 fprintf (file, _(" [unsorted symbol table]"));
9243 if (flags & EF_ARM_DYNSYMSUSESEGIDX)
9244 fprintf (file, _(" [dynamic symbols use segment index]"));
9246 if (flags & EF_ARM_MAPSYMSFIRST)
9247 fprintf (file, _(" [mapping symbols precede others]"));
9249 flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
9250 | EF_ARM_MAPSYMSFIRST);
9253 case EF_ARM_EABI_VER3:
9254 fprintf (file, _(" [Version3 EABI]"));
9257 case EF_ARM_EABI_VER4:
9258 fprintf (file, _(" [Version4 EABI]"));
9261 case EF_ARM_EABI_VER5:
9262 fprintf (file, _(" [Version5 EABI]"));
9264 if (flags & EF_ARM_BE8)
9265 fprintf (file, _(" [BE8]"));
9267 if (flags & EF_ARM_LE8)
9268 fprintf (file, _(" [LE8]"));
9270 flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
9274 fprintf (file, _(" <EABI version unrecognised>"));
9278 flags &= ~ EF_ARM_EABIMASK;
9280 if (flags & EF_ARM_RELEXEC)
9281 fprintf (file, _(" [relocatable executable]"));
9283 if (flags & EF_ARM_HASENTRY)
9284 fprintf (file, _(" [has entry point]"));
9286 flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
9289 fprintf (file, _("<Unrecognised flag bits set>"));
9297 elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
9299 switch (ELF_ST_TYPE (elf_sym->st_info))
9302 return ELF_ST_TYPE (elf_sym->st_info);
9305 /* If the symbol is not an object, return the STT_ARM_16BIT flag.
9306 This allows us to distinguish between data used by Thumb instructions
9307 and non-data (which is probably code) inside Thumb regions of an
9309 if (type != STT_OBJECT && type != STT_TLS)
9310 return ELF_ST_TYPE (elf_sym->st_info);
9321 elf32_arm_gc_mark_hook (asection *sec,
9322 struct bfd_link_info *info,
9323 Elf_Internal_Rela *rel,
9324 struct elf_link_hash_entry *h,
9325 Elf_Internal_Sym *sym)
9328 switch (ELF32_R_TYPE (rel->r_info))
9330 case R_ARM_GNU_VTINHERIT:
9331 case R_ARM_GNU_VTENTRY:
9335 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
9338 /* Update the got entry reference counts for the section being removed. */
9341 elf32_arm_gc_sweep_hook (bfd * abfd,
9342 struct bfd_link_info * info,
9344 const Elf_Internal_Rela * relocs)
9346 Elf_Internal_Shdr *symtab_hdr;
9347 struct elf_link_hash_entry **sym_hashes;
9348 bfd_signed_vma *local_got_refcounts;
9349 const Elf_Internal_Rela *rel, *relend;
9350 struct elf32_arm_link_hash_table * globals;
9352 if (info->relocatable)
9355 globals = elf32_arm_hash_table (info);
9357 elf_section_data (sec)->local_dynrel = NULL;
9359 symtab_hdr = & elf_symtab_hdr (abfd);
9360 sym_hashes = elf_sym_hashes (abfd);
9361 local_got_refcounts = elf_local_got_refcounts (abfd);
9363 check_use_blx (globals);
9365 relend = relocs + sec->reloc_count;
9366 for (rel = relocs; rel < relend; rel++)
9368 unsigned long r_symndx;
9369 struct elf_link_hash_entry *h = NULL;
9372 r_symndx = ELF32_R_SYM (rel->r_info);
9373 if (r_symndx >= symtab_hdr->sh_info)
9375 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
9376 while (h->root.type == bfd_link_hash_indirect
9377 || h->root.type == bfd_link_hash_warning)
9378 h = (struct elf_link_hash_entry *) h->root.u.i.link;
9381 r_type = ELF32_R_TYPE (rel->r_info);
9382 r_type = arm_real_reloc_type (globals, r_type);
9386 case R_ARM_GOT_PREL:
9387 case R_ARM_TLS_GD32:
9388 case R_ARM_TLS_IE32:
9391 if (h->got.refcount > 0)
9392 h->got.refcount -= 1;
9394 else if (local_got_refcounts != NULL)
9396 if (local_got_refcounts[r_symndx] > 0)
9397 local_got_refcounts[r_symndx] -= 1;
9401 case R_ARM_TLS_LDM32:
9402 elf32_arm_hash_table (info)->tls_ldm_got.refcount -= 1;
9406 case R_ARM_ABS32_NOI:
9408 case R_ARM_REL32_NOI:
9414 case R_ARM_THM_CALL:
9415 case R_ARM_THM_JUMP24:
9416 case R_ARM_THM_JUMP19:
9417 case R_ARM_MOVW_ABS_NC:
9418 case R_ARM_MOVT_ABS:
9419 case R_ARM_MOVW_PREL_NC:
9420 case R_ARM_MOVT_PREL:
9421 case R_ARM_THM_MOVW_ABS_NC:
9422 case R_ARM_THM_MOVT_ABS:
9423 case R_ARM_THM_MOVW_PREL_NC:
9424 case R_ARM_THM_MOVT_PREL:
9425 /* Should the interworking branches be here also? */
9429 struct elf32_arm_link_hash_entry *eh;
9430 struct elf32_arm_relocs_copied **pp;
9431 struct elf32_arm_relocs_copied *p;
9433 eh = (struct elf32_arm_link_hash_entry *) h;
9435 if (h->plt.refcount > 0)
9437 h->plt.refcount -= 1;
9438 if (r_type == R_ARM_THM_CALL)
9439 eh->plt_maybe_thumb_refcount--;
9441 if (r_type == R_ARM_THM_JUMP24
9442 || r_type == R_ARM_THM_JUMP19)
9443 eh->plt_thumb_refcount--;
9446 if (r_type == R_ARM_ABS32
9447 || r_type == R_ARM_REL32
9448 || r_type == R_ARM_ABS32_NOI
9449 || r_type == R_ARM_REL32_NOI)
9451 for (pp = &eh->relocs_copied; (p = *pp) != NULL;
9453 if (p->section == sec)
9456 if (ELF32_R_TYPE (rel->r_info) == R_ARM_REL32
9457 || ELF32_R_TYPE (rel->r_info) == R_ARM_REL32_NOI)
9475 /* Look through the relocs for a section during the first phase. */
9478 elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
9479 asection *sec, const Elf_Internal_Rela *relocs)
9481 Elf_Internal_Shdr *symtab_hdr;
9482 struct elf_link_hash_entry **sym_hashes;
9483 const Elf_Internal_Rela *rel;
9484 const Elf_Internal_Rela *rel_end;
9487 bfd_vma *local_got_offsets;
9488 struct elf32_arm_link_hash_table *htab;
9489 bfd_boolean needs_plt;
9491 if (info->relocatable)
9494 BFD_ASSERT (is_arm_elf (abfd));
9496 htab = elf32_arm_hash_table (info);
9499 /* Create dynamic sections for relocatable executables so that we can
9500 copy relocations. */
9501 if (htab->root.is_relocatable_executable
9502 && ! htab->root.dynamic_sections_created)
9504 if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
9508 dynobj = elf_hash_table (info)->dynobj;
9509 local_got_offsets = elf_local_got_offsets (abfd);
9511 symtab_hdr = & elf_symtab_hdr (abfd);
9512 sym_hashes = elf_sym_hashes (abfd);
9514 rel_end = relocs + sec->reloc_count;
9515 for (rel = relocs; rel < rel_end; rel++)
9517 struct elf_link_hash_entry *h;
9518 struct elf32_arm_link_hash_entry *eh;
9519 unsigned long r_symndx;
9522 r_symndx = ELF32_R_SYM (rel->r_info);
9523 r_type = ELF32_R_TYPE (rel->r_info);
9524 r_type = arm_real_reloc_type (htab, r_type);
9526 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
9528 (*_bfd_error_handler) (_("%B: bad symbol index: %d"), abfd,
9533 if (r_symndx < symtab_hdr->sh_info)
9537 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
9538 while (h->root.type == bfd_link_hash_indirect
9539 || h->root.type == bfd_link_hash_warning)
9540 h = (struct elf_link_hash_entry *) h->root.u.i.link;
9543 eh = (struct elf32_arm_link_hash_entry *) h;
9548 case R_ARM_GOT_PREL:
9549 case R_ARM_TLS_GD32:
9550 case R_ARM_TLS_IE32:
9551 /* This symbol requires a global offset table entry. */
9553 int tls_type, old_tls_type;
9557 case R_ARM_TLS_GD32: tls_type = GOT_TLS_GD; break;
9558 case R_ARM_TLS_IE32: tls_type = GOT_TLS_IE; break;
9559 default: tls_type = GOT_NORMAL; break;
9565 old_tls_type = elf32_arm_hash_entry (h)->tls_type;
9569 bfd_signed_vma *local_got_refcounts;
9571 /* This is a global offset table entry for a local symbol. */
9572 local_got_refcounts = elf_local_got_refcounts (abfd);
9573 if (local_got_refcounts == NULL)
9577 size = symtab_hdr->sh_info;
9578 size *= (sizeof (bfd_signed_vma) + sizeof (char));
9579 local_got_refcounts = bfd_zalloc (abfd, size);
9580 if (local_got_refcounts == NULL)
9582 elf_local_got_refcounts (abfd) = local_got_refcounts;
9583 elf32_arm_local_got_tls_type (abfd)
9584 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
9586 local_got_refcounts[r_symndx] += 1;
9587 old_tls_type = elf32_arm_local_got_tls_type (abfd) [r_symndx];
9590 /* We will already have issued an error message if there is a
9591 TLS / non-TLS mismatch, based on the symbol type. We don't
9592 support any linker relaxations. So just combine any TLS
9594 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
9595 && tls_type != GOT_NORMAL)
9596 tls_type |= old_tls_type;
9598 if (old_tls_type != tls_type)
9601 elf32_arm_hash_entry (h)->tls_type = tls_type;
9603 elf32_arm_local_got_tls_type (abfd) [r_symndx] = tls_type;
9608 case R_ARM_TLS_LDM32:
9609 if (r_type == R_ARM_TLS_LDM32)
9610 htab->tls_ldm_got.refcount++;
9613 case R_ARM_GOTOFF32:
9615 if (htab->sgot == NULL)
9617 if (htab->root.dynobj == NULL)
9618 htab->root.dynobj = abfd;
9619 if (!create_got_section (htab->root.dynobj, info))
9625 /* VxWorks uses dynamic R_ARM_ABS12 relocations for
9626 ldr __GOTT_INDEX__ offsets. */
9627 if (!htab->vxworks_p)
9636 case R_ARM_THM_CALL:
9637 case R_ARM_THM_JUMP24:
9638 case R_ARM_THM_JUMP19:
9643 case R_ARM_ABS32_NOI:
9645 case R_ARM_REL32_NOI:
9646 case R_ARM_MOVW_ABS_NC:
9647 case R_ARM_MOVT_ABS:
9648 case R_ARM_MOVW_PREL_NC:
9649 case R_ARM_MOVT_PREL:
9650 case R_ARM_THM_MOVW_ABS_NC:
9651 case R_ARM_THM_MOVT_ABS:
9652 case R_ARM_THM_MOVW_PREL_NC:
9653 case R_ARM_THM_MOVT_PREL:
9657 /* Should the interworking branches be listed here? */
9660 /* If this reloc is in a read-only section, we might
9661 need a copy reloc. We can't check reliably at this
9662 stage whether the section is read-only, as input
9663 sections have not yet been mapped to output sections.
9664 Tentatively set the flag for now, and correct in
9665 adjust_dynamic_symbol. */
9669 /* We may need a .plt entry if the function this reloc
9670 refers to is in a different object. We can't tell for
9671 sure yet, because something later might force the
9676 /* If we create a PLT entry, this relocation will reference
9677 it, even if it's an ABS32 relocation. */
9678 h->plt.refcount += 1;
9680 /* It's too early to use htab->use_blx here, so we have to
9681 record possible blx references separately from
9682 relocs that definitely need a thumb stub. */
9684 if (r_type == R_ARM_THM_CALL)
9685 eh->plt_maybe_thumb_refcount += 1;
9687 if (r_type == R_ARM_THM_JUMP24
9688 || r_type == R_ARM_THM_JUMP19)
9689 eh->plt_thumb_refcount += 1;
9692 /* If we are creating a shared library or relocatable executable,
9693 and this is a reloc against a global symbol, or a non PC
9694 relative reloc against a local symbol, then we need to copy
9695 the reloc into the shared library. However, if we are linking
9696 with -Bsymbolic, we do not need to copy a reloc against a
9697 global symbol which is defined in an object we are
9698 including in the link (i.e., DEF_REGULAR is set). At
9699 this point we have not seen all the input files, so it is
9700 possible that DEF_REGULAR is not set now but will be set
9701 later (it is never cleared). We account for that
9702 possibility below by storing information in the
9703 relocs_copied field of the hash table entry. */
9704 if ((info->shared || htab->root.is_relocatable_executable)
9705 && (sec->flags & SEC_ALLOC) != 0
9706 && ((r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI)
9707 || (h != NULL && ! h->needs_plt
9708 && (! info->symbolic || ! h->def_regular))))
9710 struct elf32_arm_relocs_copied *p, **head;
9712 /* When creating a shared object, we must copy these
9713 reloc types into the output file. We create a reloc
9714 section in dynobj and make room for this reloc. */
9717 sreloc = _bfd_elf_make_dynamic_reloc_section
9718 (sec, dynobj, 2, abfd, ! htab->use_rel);
9723 /* BPABI objects never have dynamic relocations mapped. */
9724 if (! htab->symbian_p)
9728 flags = bfd_get_section_flags (dynobj, sreloc);
9729 flags |= (SEC_LOAD | SEC_ALLOC);
9730 bfd_set_section_flags (dynobj, sreloc, flags);
9734 /* If this is a global symbol, we count the number of
9735 relocations we need for this symbol. */
9738 head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied;
9742 /* Track dynamic relocs needed for local syms too.
9743 We really need local syms available to do this
9749 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
9754 vpp = &elf_section_data (s)->local_dynrel;
9755 head = (struct elf32_arm_relocs_copied **) vpp;
9759 if (p == NULL || p->section != sec)
9761 bfd_size_type amt = sizeof *p;
9763 p = bfd_alloc (htab->root.dynobj, amt);
9773 if (r_type == R_ARM_REL32 || r_type == R_ARM_REL32_NOI)
9779 /* This relocation describes the C++ object vtable hierarchy.
9780 Reconstruct it for later use during GC. */
9781 case R_ARM_GNU_VTINHERIT:
9782 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
9786 /* This relocation describes which C++ vtable entries are actually
9787 used. Record for later use during GC. */
9788 case R_ARM_GNU_VTENTRY:
9789 BFD_ASSERT (h != NULL);
9791 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
9800 /* Unwinding tables are not referenced directly. This pass marks them as
9801 required if the corresponding code section is marked. */
9804 elf32_arm_gc_mark_extra_sections (struct bfd_link_info *info,
9805 elf_gc_mark_hook_fn gc_mark_hook)
9808 Elf_Internal_Shdr **elf_shdrp;
9811 /* Marking EH data may cause additional code sections to be marked,
9812 requiring multiple passes. */
9817 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
9821 if (! is_arm_elf (sub))
9824 elf_shdrp = elf_elfsections (sub);
9825 for (o = sub->sections; o != NULL; o = o->next)
9827 Elf_Internal_Shdr *hdr;
9829 hdr = &elf_section_data (o)->this_hdr;
9830 if (hdr->sh_type == SHT_ARM_EXIDX
9832 && hdr->sh_link < elf_numsections (sub)
9834 && elf_shdrp[hdr->sh_link]->bfd_section->gc_mark)
9837 if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
9847 /* Treat mapping symbols as special target symbols. */
9850 elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
9852 return bfd_is_arm_special_symbol_name (sym->name,
9853 BFD_ARM_SPECIAL_SYM_TYPE_ANY);
9856 /* This is a copy of elf_find_function() from elf.c except that
9857 ARM mapping symbols are ignored when looking for function names
9858 and STT_ARM_TFUNC is considered to a function type. */
9861 arm_elf_find_function (bfd * abfd ATTRIBUTE_UNUSED,
9865 const char ** filename_ptr,
9866 const char ** functionname_ptr)
9868 const char * filename = NULL;
9869 asymbol * func = NULL;
9870 bfd_vma low_func = 0;
9873 for (p = symbols; *p != NULL; p++)
9877 q = (elf_symbol_type *) *p;
9879 switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
9884 filename = bfd_asymbol_name (&q->symbol);
9889 /* Skip mapping symbols. */
9890 if ((q->symbol.flags & BSF_LOCAL)
9891 && bfd_is_arm_special_symbol_name (q->symbol.name,
9892 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
9895 if (bfd_get_section (&q->symbol) == section
9896 && q->symbol.value >= low_func
9897 && q->symbol.value <= offset)
9899 func = (asymbol *) q;
9900 low_func = q->symbol.value;
9910 *filename_ptr = filename;
9911 if (functionname_ptr)
9912 *functionname_ptr = bfd_asymbol_name (func);
9918 /* Find the nearest line to a particular section and offset, for error
9919 reporting. This code is a duplicate of the code in elf.c, except
9920 that it uses arm_elf_find_function. */
9923 elf32_arm_find_nearest_line (bfd * abfd,
9927 const char ** filename_ptr,
9928 const char ** functionname_ptr,
9929 unsigned int * line_ptr)
9931 bfd_boolean found = FALSE;
9933 /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it. */
9935 if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
9936 filename_ptr, functionname_ptr,
9938 & elf_tdata (abfd)->dwarf2_find_line_info))
9940 if (!*functionname_ptr)
9941 arm_elf_find_function (abfd, section, symbols, offset,
9942 *filename_ptr ? NULL : filename_ptr,
9948 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
9949 & found, filename_ptr,
9950 functionname_ptr, line_ptr,
9951 & elf_tdata (abfd)->line_info))
9954 if (found && (*functionname_ptr || *line_ptr))
9957 if (symbols == NULL)
9960 if (! arm_elf_find_function (abfd, section, symbols, offset,
9961 filename_ptr, functionname_ptr))
9969 elf32_arm_find_inliner_info (bfd * abfd,
9970 const char ** filename_ptr,
9971 const char ** functionname_ptr,
9972 unsigned int * line_ptr)
9975 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
9976 functionname_ptr, line_ptr,
9977 & elf_tdata (abfd)->dwarf2_find_line_info);
9981 /* Adjust a symbol defined by a dynamic object and referenced by a
9982 regular object. The current definition is in some section of the
9983 dynamic object, but we're not including those sections. We have to
9984 change the definition to something the rest of the link can
9988 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
9989 struct elf_link_hash_entry * h)
9993 struct elf32_arm_link_hash_entry * eh;
9994 struct elf32_arm_link_hash_table *globals;
9996 globals = elf32_arm_hash_table (info);
9997 dynobj = elf_hash_table (info)->dynobj;
9999 /* Make sure we know what is going on here. */
10000 BFD_ASSERT (dynobj != NULL
10002 || h->u.weakdef != NULL
10005 && !h->def_regular)));
10007 eh = (struct elf32_arm_link_hash_entry *) h;
10009 /* If this is a function, put it in the procedure linkage table. We
10010 will fill in the contents of the procedure linkage table later,
10011 when we know the address of the .got section. */
10012 if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC
10015 if (h->plt.refcount <= 0
10016 || SYMBOL_CALLS_LOCAL (info, h)
10017 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
10018 && h->root.type == bfd_link_hash_undefweak))
10020 /* This case can occur if we saw a PLT32 reloc in an input
10021 file, but the symbol was never referred to by a dynamic
10022 object, or if all references were garbage collected. In
10023 such a case, we don't actually need to build a procedure
10024 linkage table, and we can just do a PC24 reloc instead. */
10025 h->plt.offset = (bfd_vma) -1;
10026 eh->plt_thumb_refcount = 0;
10027 eh->plt_maybe_thumb_refcount = 0;
10035 /* It's possible that we incorrectly decided a .plt reloc was
10036 needed for an R_ARM_PC24 or similar reloc to a non-function sym
10037 in check_relocs. We can't decide accurately between function
10038 and non-function syms in check-relocs; Objects loaded later in
10039 the link may change h->type. So fix it now. */
10040 h->plt.offset = (bfd_vma) -1;
10041 eh->plt_thumb_refcount = 0;
10042 eh->plt_maybe_thumb_refcount = 0;
10045 /* If this is a weak symbol, and there is a real definition, the
10046 processor independent code will have arranged for us to see the
10047 real definition first, and we can just use the same value. */
10048 if (h->u.weakdef != NULL)
10050 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
10051 || h->u.weakdef->root.type == bfd_link_hash_defweak);
10052 h->root.u.def.section = h->u.weakdef->root.u.def.section;
10053 h->root.u.def.value = h->u.weakdef->root.u.def.value;
10057 /* If there are no non-GOT references, we do not need a copy
10059 if (!h->non_got_ref)
10062 /* This is a reference to a symbol defined by a dynamic object which
10063 is not a function. */
10065 /* If we are creating a shared library, we must presume that the
10066 only references to the symbol are via the global offset table.
10067 For such cases we need not do anything here; the relocations will
10068 be handled correctly by relocate_section. Relocatable executables
10069 can reference data in shared objects directly, so we don't need to
10070 do anything here. */
10071 if (info->shared || globals->root.is_relocatable_executable)
10076 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
10077 h->root.root.string);
10081 /* We must allocate the symbol in our .dynbss section, which will
10082 become part of the .bss section of the executable. There will be
10083 an entry for this symbol in the .dynsym section. The dynamic
10084 object will contain position independent code, so all references
10085 from the dynamic object to this symbol will go through the global
10086 offset table. The dynamic linker will use the .dynsym entry to
10087 determine the address it must put in the global offset table, so
10088 both the dynamic object and the regular object will refer to the
10089 same memory location for the variable. */
10090 s = bfd_get_section_by_name (dynobj, ".dynbss");
10091 BFD_ASSERT (s != NULL);
10093 /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
10094 copy the initial value out of the dynamic object and into the
10095 runtime process image. We need to remember the offset into the
10096 .rel(a).bss section we are going to use. */
10097 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
10101 srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (globals, ".bss"));
10102 BFD_ASSERT (srel != NULL);
10103 srel->size += RELOC_SIZE (globals);
10107 return _bfd_elf_adjust_dynamic_copy (h, s);
10110 /* Allocate space in .plt, .got and associated reloc sections for
10114 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
10116 struct bfd_link_info *info;
10117 struct elf32_arm_link_hash_table *htab;
10118 struct elf32_arm_link_hash_entry *eh;
10119 struct elf32_arm_relocs_copied *p;
10120 bfd_signed_vma thumb_refs;
10122 eh = (struct elf32_arm_link_hash_entry *) h;
10124 if (h->root.type == bfd_link_hash_indirect)
10127 if (h->root.type == bfd_link_hash_warning)
10128 /* When warning symbols are created, they **replace** the "real"
10129 entry in the hash table, thus we never get to see the real
10130 symbol in a hash traversal. So look at it now. */
10131 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10133 info = (struct bfd_link_info *) inf;
10134 htab = elf32_arm_hash_table (info);
10136 if (htab->root.dynamic_sections_created
10137 && h->plt.refcount > 0)
10139 /* Make sure this symbol is output as a dynamic symbol.
10140 Undefined weak syms won't yet be marked as dynamic. */
10141 if (h->dynindx == -1
10142 && !h->forced_local)
10144 if (! bfd_elf_link_record_dynamic_symbol (info, h))
10149 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
10151 asection *s = htab->splt;
10153 /* If this is the first .plt entry, make room for the special
10156 s->size += htab->plt_header_size;
10158 h->plt.offset = s->size;
10160 /* If we will insert a Thumb trampoline before this PLT, leave room
10162 thumb_refs = eh->plt_thumb_refcount;
10163 if (!htab->use_blx)
10164 thumb_refs += eh->plt_maybe_thumb_refcount;
10166 if (thumb_refs > 0)
10168 h->plt.offset += PLT_THUMB_STUB_SIZE;
10169 s->size += PLT_THUMB_STUB_SIZE;
10172 /* If this symbol is not defined in a regular file, and we are
10173 not generating a shared library, then set the symbol to this
10174 location in the .plt. This is required to make function
10175 pointers compare as equal between the normal executable and
10176 the shared library. */
10178 && !h->def_regular)
10180 h->root.u.def.section = s;
10181 h->root.u.def.value = h->plt.offset;
10183 /* Make sure the function is not marked as Thumb, in case
10184 it is the target of an ABS32 relocation, which will
10185 point to the PLT entry. */
10186 if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
10187 h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
10190 /* Make room for this entry. */
10191 s->size += htab->plt_entry_size;
10193 if (!htab->symbian_p)
10195 /* We also need to make an entry in the .got.plt section, which
10196 will be placed in the .got section by the linker script. */
10197 eh->plt_got_offset = htab->sgotplt->size;
10198 htab->sgotplt->size += 4;
10201 /* We also need to make an entry in the .rel(a).plt section. */
10202 htab->srelplt->size += RELOC_SIZE (htab);
10204 /* VxWorks executables have a second set of relocations for
10205 each PLT entry. They go in a separate relocation section,
10206 which is processed by the kernel loader. */
10207 if (htab->vxworks_p && !info->shared)
10209 /* There is a relocation for the initial PLT entry:
10210 an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_. */
10211 if (h->plt.offset == htab->plt_header_size)
10212 htab->srelplt2->size += RELOC_SIZE (htab);
10214 /* There are two extra relocations for each subsequent
10215 PLT entry: an R_ARM_32 relocation for the GOT entry,
10216 and an R_ARM_32 relocation for the PLT entry. */
10217 htab->srelplt2->size += RELOC_SIZE (htab) * 2;
10222 h->plt.offset = (bfd_vma) -1;
10228 h->plt.offset = (bfd_vma) -1;
10232 if (h->got.refcount > 0)
10236 int tls_type = elf32_arm_hash_entry (h)->tls_type;
10239 /* Make sure this symbol is output as a dynamic symbol.
10240 Undefined weak syms won't yet be marked as dynamic. */
10241 if (h->dynindx == -1
10242 && !h->forced_local)
10244 if (! bfd_elf_link_record_dynamic_symbol (info, h))
10248 if (!htab->symbian_p)
10251 h->got.offset = s->size;
10253 if (tls_type == GOT_UNKNOWN)
10256 if (tls_type == GOT_NORMAL)
10257 /* Non-TLS symbols need one GOT slot. */
10261 if (tls_type & GOT_TLS_GD)
10262 /* R_ARM_TLS_GD32 needs 2 consecutive GOT slots. */
10264 if (tls_type & GOT_TLS_IE)
10265 /* R_ARM_TLS_IE32 needs one GOT slot. */
10269 dyn = htab->root.dynamic_sections_created;
10272 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
10274 || !SYMBOL_REFERENCES_LOCAL (info, h)))
10277 if (tls_type != GOT_NORMAL
10278 && (info->shared || indx != 0)
10279 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
10280 || h->root.type != bfd_link_hash_undefweak))
10282 if (tls_type & GOT_TLS_IE)
10283 htab->srelgot->size += RELOC_SIZE (htab);
10285 if (tls_type & GOT_TLS_GD)
10286 htab->srelgot->size += RELOC_SIZE (htab);
10288 if ((tls_type & GOT_TLS_GD) && indx != 0)
10289 htab->srelgot->size += RELOC_SIZE (htab);
10291 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
10292 || h->root.type != bfd_link_hash_undefweak)
10294 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
10295 htab->srelgot->size += RELOC_SIZE (htab);
10299 h->got.offset = (bfd_vma) -1;
10301 /* Allocate stubs for exported Thumb functions on v4t. */
10302 if (!htab->use_blx && h->dynindx != -1
10304 && ELF_ST_TYPE (h->type) == STT_ARM_TFUNC
10305 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
10307 struct elf_link_hash_entry * th;
10308 struct bfd_link_hash_entry * bh;
10309 struct elf_link_hash_entry * myh;
10313 /* Create a new symbol to regist the real location of the function. */
10314 s = h->root.u.def.section;
10315 sprintf (name, "__real_%s", h->root.root.string);
10316 _bfd_generic_link_add_one_symbol (info, s->owner,
10317 name, BSF_GLOBAL, s,
10318 h->root.u.def.value,
10319 NULL, TRUE, FALSE, &bh);
10321 myh = (struct elf_link_hash_entry *) bh;
10322 myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
10323 myh->forced_local = 1;
10324 eh->export_glue = myh;
10325 th = record_arm_to_thumb_glue (info, h);
10326 /* Point the symbol at the stub. */
10327 h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
10328 h->root.u.def.section = th->root.u.def.section;
10329 h->root.u.def.value = th->root.u.def.value & ~1;
10332 if (eh->relocs_copied == NULL)
10335 /* In the shared -Bsymbolic case, discard space allocated for
10336 dynamic pc-relative relocs against symbols which turn out to be
10337 defined in regular objects. For the normal shared case, discard
10338 space for pc-relative relocs that have become local due to symbol
10339 visibility changes. */
10341 if (info->shared || htab->root.is_relocatable_executable)
10343 /* The only relocs that use pc_count are R_ARM_REL32 and
10344 R_ARM_REL32_NOI, which will appear on something like
10345 ".long foo - .". We want calls to protected symbols to resolve
10346 directly to the function rather than going via the plt. If people
10347 want function pointer comparisons to work as expected then they
10348 should avoid writing assembly like ".long foo - .". */
10349 if (SYMBOL_CALLS_LOCAL (info, h))
10351 struct elf32_arm_relocs_copied **pp;
10353 for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
10355 p->count -= p->pc_count;
10364 if (elf32_arm_hash_table (info)->vxworks_p)
10366 struct elf32_arm_relocs_copied **pp;
10368 for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
10370 if (strcmp (p->section->output_section->name, ".tls_vars") == 0)
10377 /* Also discard relocs on undefined weak syms with non-default
10379 if (eh->relocs_copied != NULL
10380 && h->root.type == bfd_link_hash_undefweak)
10382 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
10383 eh->relocs_copied = NULL;
10385 /* Make sure undefined weak symbols are output as a dynamic
10387 else if (h->dynindx == -1
10388 && !h->forced_local)
10390 if (! bfd_elf_link_record_dynamic_symbol (info, h))
10395 else if (htab->root.is_relocatable_executable && h->dynindx == -1
10396 && h->root.type == bfd_link_hash_new)
10398 /* Output absolute symbols so that we can create relocations
10399 against them. For normal symbols we output a relocation
10400 against the section that contains them. */
10401 if (! bfd_elf_link_record_dynamic_symbol (info, h))
10408 /* For the non-shared case, discard space for relocs against
10409 symbols which turn out to need copy relocs or are not
10412 if (!h->non_got_ref
10413 && ((h->def_dynamic
10414 && !h->def_regular)
10415 || (htab->root.dynamic_sections_created
10416 && (h->root.type == bfd_link_hash_undefweak
10417 || h->root.type == bfd_link_hash_undefined))))
10419 /* Make sure this symbol is output as a dynamic symbol.
10420 Undefined weak syms won't yet be marked as dynamic. */
10421 if (h->dynindx == -1
10422 && !h->forced_local)
10424 if (! bfd_elf_link_record_dynamic_symbol (info, h))
10428 /* If that succeeded, we know we'll be keeping all the
10430 if (h->dynindx != -1)
10434 eh->relocs_copied = NULL;
10439 /* Finally, allocate space. */
10440 for (p = eh->relocs_copied; p != NULL; p = p->next)
10442 asection *sreloc = elf_section_data (p->section)->sreloc;
10443 sreloc->size += p->count * RELOC_SIZE (htab);
10449 /* Find any dynamic relocs that apply to read-only sections. */
10452 elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry * h, void * inf)
10454 struct elf32_arm_link_hash_entry * eh;
10455 struct elf32_arm_relocs_copied * p;
10457 if (h->root.type == bfd_link_hash_warning)
10458 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10460 eh = (struct elf32_arm_link_hash_entry *) h;
10461 for (p = eh->relocs_copied; p != NULL; p = p->next)
10463 asection *s = p->section;
10465 if (s != NULL && (s->flags & SEC_READONLY) != 0)
10467 struct bfd_link_info *info = (struct bfd_link_info *) inf;
10469 info->flags |= DF_TEXTREL;
10471 /* Not an error, just cut short the traversal. */
10479 bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *info,
10482 struct elf32_arm_link_hash_table *globals;
10484 globals = elf32_arm_hash_table (info);
10485 globals->byteswap_code = byteswap_code;
10488 /* Set the sizes of the dynamic sections. */
10491 elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
10492 struct bfd_link_info * info)
10497 bfd_boolean relocs;
10499 struct elf32_arm_link_hash_table *htab;
10501 htab = elf32_arm_hash_table (info);
10502 dynobj = elf_hash_table (info)->dynobj;
10503 BFD_ASSERT (dynobj != NULL);
10504 check_use_blx (htab);
10506 if (elf_hash_table (info)->dynamic_sections_created)
10508 /* Set the contents of the .interp section to the interpreter. */
10509 if (info->executable)
10511 s = bfd_get_section_by_name (dynobj, ".interp");
10512 BFD_ASSERT (s != NULL);
10513 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
10514 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
10518 /* Set up .got offsets for local syms, and space for local dynamic
10520 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10522 bfd_signed_vma *local_got;
10523 bfd_signed_vma *end_local_got;
10524 char *local_tls_type;
10525 bfd_size_type locsymcount;
10526 Elf_Internal_Shdr *symtab_hdr;
10528 bfd_boolean is_vxworks = elf32_arm_hash_table (info)->vxworks_p;
10530 if (! is_arm_elf (ibfd))
10533 for (s = ibfd->sections; s != NULL; s = s->next)
10535 struct elf32_arm_relocs_copied *p;
10537 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
10539 if (!bfd_is_abs_section (p->section)
10540 && bfd_is_abs_section (p->section->output_section))
10542 /* Input section has been discarded, either because
10543 it is a copy of a linkonce section or due to
10544 linker script /DISCARD/, so we'll be discarding
10547 else if (is_vxworks
10548 && strcmp (p->section->output_section->name,
10551 /* Relocations in vxworks .tls_vars sections are
10552 handled specially by the loader. */
10554 else if (p->count != 0)
10556 srel = elf_section_data (p->section)->sreloc;
10557 srel->size += p->count * RELOC_SIZE (htab);
10558 if ((p->section->output_section->flags & SEC_READONLY) != 0)
10559 info->flags |= DF_TEXTREL;
10564 local_got = elf_local_got_refcounts (ibfd);
10568 symtab_hdr = & elf_symtab_hdr (ibfd);
10569 locsymcount = symtab_hdr->sh_info;
10570 end_local_got = local_got + locsymcount;
10571 local_tls_type = elf32_arm_local_got_tls_type (ibfd);
10573 srel = htab->srelgot;
10574 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
10576 if (*local_got > 0)
10578 *local_got = s->size;
10579 if (*local_tls_type & GOT_TLS_GD)
10580 /* TLS_GD relocs need an 8-byte structure in the GOT. */
10582 if (*local_tls_type & GOT_TLS_IE)
10584 if (*local_tls_type == GOT_NORMAL)
10587 if (info->shared || *local_tls_type == GOT_TLS_GD)
10588 srel->size += RELOC_SIZE (htab);
10591 *local_got = (bfd_vma) -1;
10595 if (htab->tls_ldm_got.refcount > 0)
10597 /* Allocate two GOT entries and one dynamic relocation (if necessary)
10598 for R_ARM_TLS_LDM32 relocations. */
10599 htab->tls_ldm_got.offset = htab->sgot->size;
10600 htab->sgot->size += 8;
10602 htab->srelgot->size += RELOC_SIZE (htab);
10605 htab->tls_ldm_got.offset = -1;
10607 /* Allocate global sym .plt and .got entries, and space for global
10608 sym dynamic relocs. */
10609 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
10611 /* Here we rummage through the found bfds to collect glue information. */
10612 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10614 if (! is_arm_elf (ibfd))
10617 /* Initialise mapping tables for code/data. */
10618 bfd_elf32_arm_init_maps (ibfd);
10620 if (!bfd_elf32_arm_process_before_allocation (ibfd, info)
10621 || !bfd_elf32_arm_vfp11_erratum_scan (ibfd, info))
10622 /* xgettext:c-format */
10623 _bfd_error_handler (_("Errors encountered processing file %s"),
10627 /* The check_relocs and adjust_dynamic_symbol entry points have
10628 determined the sizes of the various dynamic sections. Allocate
10629 memory for them. */
10632 for (s = dynobj->sections; s != NULL; s = s->next)
10636 if ((s->flags & SEC_LINKER_CREATED) == 0)
10639 /* It's OK to base decisions on the section name, because none
10640 of the dynobj section names depend upon the input files. */
10641 name = bfd_get_section_name (dynobj, s);
10643 if (strcmp (name, ".plt") == 0)
10645 /* Remember whether there is a PLT. */
10646 plt = s->size != 0;
10648 else if (CONST_STRNEQ (name, ".rel"))
10652 /* Remember whether there are any reloc sections other
10653 than .rel(a).plt and .rela.plt.unloaded. */
10654 if (s != htab->srelplt && s != htab->srelplt2)
10657 /* We use the reloc_count field as a counter if we need
10658 to copy relocs into the output file. */
10659 s->reloc_count = 0;
10662 else if (! CONST_STRNEQ (name, ".got")
10663 && strcmp (name, ".dynbss") != 0)
10665 /* It's not one of our sections, so don't allocate space. */
10671 /* If we don't need this section, strip it from the
10672 output file. This is mostly to handle .rel(a).bss and
10673 .rel(a).plt. We must create both sections in
10674 create_dynamic_sections, because they must be created
10675 before the linker maps input sections to output
10676 sections. The linker does that before
10677 adjust_dynamic_symbol is called, and it is that
10678 function which decides whether anything needs to go
10679 into these sections. */
10680 s->flags |= SEC_EXCLUDE;
10684 if ((s->flags & SEC_HAS_CONTENTS) == 0)
10687 /* Allocate memory for the section contents. */
10688 s->contents = bfd_zalloc (dynobj, s->size);
10689 if (s->contents == NULL)
10693 if (elf_hash_table (info)->dynamic_sections_created)
10695 /* Add some entries to the .dynamic section. We fill in the
10696 values later, in elf32_arm_finish_dynamic_sections, but we
10697 must add the entries now so that we get the correct size for
10698 the .dynamic section. The DT_DEBUG entry is filled in by the
10699 dynamic linker and used by the debugger. */
10700 #define add_dynamic_entry(TAG, VAL) \
10701 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
10703 if (info->executable)
10705 if (!add_dynamic_entry (DT_DEBUG, 0))
10711 if ( !add_dynamic_entry (DT_PLTGOT, 0)
10712 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10713 || !add_dynamic_entry (DT_PLTREL,
10714 htab->use_rel ? DT_REL : DT_RELA)
10715 || !add_dynamic_entry (DT_JMPREL, 0))
10723 if (!add_dynamic_entry (DT_REL, 0)
10724 || !add_dynamic_entry (DT_RELSZ, 0)
10725 || !add_dynamic_entry (DT_RELENT, RELOC_SIZE (htab)))
10730 if (!add_dynamic_entry (DT_RELA, 0)
10731 || !add_dynamic_entry (DT_RELASZ, 0)
10732 || !add_dynamic_entry (DT_RELAENT, RELOC_SIZE (htab)))
10737 /* If any dynamic relocs apply to a read-only section,
10738 then we need a DT_TEXTREL entry. */
10739 if ((info->flags & DF_TEXTREL) == 0)
10740 elf_link_hash_traverse (& htab->root, elf32_arm_readonly_dynrelocs,
10743 if ((info->flags & DF_TEXTREL) != 0)
10745 if (!add_dynamic_entry (DT_TEXTREL, 0))
10748 if (htab->vxworks_p
10749 && !elf_vxworks_add_dynamic_entries (output_bfd, info))
10752 #undef add_dynamic_entry
10757 /* Finish up dynamic symbol handling. We set the contents of various
10758 dynamic sections here. */
10761 elf32_arm_finish_dynamic_symbol (bfd * output_bfd,
10762 struct bfd_link_info * info,
10763 struct elf_link_hash_entry * h,
10764 Elf_Internal_Sym * sym)
10767 struct elf32_arm_link_hash_table *htab;
10768 struct elf32_arm_link_hash_entry *eh;
10770 dynobj = elf_hash_table (info)->dynobj;
10771 htab = elf32_arm_hash_table (info);
10772 eh = (struct elf32_arm_link_hash_entry *) h;
10774 if (h->plt.offset != (bfd_vma) -1)
10780 Elf_Internal_Rela rel;
10782 /* This symbol has an entry in the procedure linkage table. Set
10785 BFD_ASSERT (h->dynindx != -1);
10787 splt = bfd_get_section_by_name (dynobj, ".plt");
10788 srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (htab, ".plt"));
10789 BFD_ASSERT (splt != NULL && srel != NULL);
10791 /* Fill in the entry in the procedure linkage table. */
10792 if (htab->symbian_p)
10794 put_arm_insn (htab, output_bfd,
10795 elf32_arm_symbian_plt_entry[0],
10796 splt->contents + h->plt.offset);
10797 bfd_put_32 (output_bfd,
10798 elf32_arm_symbian_plt_entry[1],
10799 splt->contents + h->plt.offset + 4);
10801 /* Fill in the entry in the .rel.plt section. */
10802 rel.r_offset = (splt->output_section->vma
10803 + splt->output_offset
10804 + h->plt.offset + 4);
10805 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
10807 /* Get the index in the procedure linkage table which
10808 corresponds to this symbol. This is the index of this symbol
10809 in all the symbols for which we are making plt entries. The
10810 first entry in the procedure linkage table is reserved. */
10811 plt_index = ((h->plt.offset - htab->plt_header_size)
10812 / htab->plt_entry_size);
10816 bfd_vma got_offset, got_address, plt_address;
10817 bfd_vma got_displacement;
10821 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
10822 BFD_ASSERT (sgot != NULL);
10824 /* Get the offset into the .got.plt table of the entry that
10825 corresponds to this function. */
10826 got_offset = eh->plt_got_offset;
10828 /* Get the index in the procedure linkage table which
10829 corresponds to this symbol. This is the index of this symbol
10830 in all the symbols for which we are making plt entries. The
10831 first three entries in .got.plt are reserved; after that
10832 symbols appear in the same order as in .plt. */
10833 plt_index = (got_offset - 12) / 4;
10835 /* Calculate the address of the GOT entry. */
10836 got_address = (sgot->output_section->vma
10837 + sgot->output_offset
10840 /* ...and the address of the PLT entry. */
10841 plt_address = (splt->output_section->vma
10842 + splt->output_offset
10845 ptr = htab->splt->contents + h->plt.offset;
10846 if (htab->vxworks_p && info->shared)
10851 for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
10853 val = elf32_arm_vxworks_shared_plt_entry[i];
10855 val |= got_address - sgot->output_section->vma;
10857 val |= plt_index * RELOC_SIZE (htab);
10858 if (i == 2 || i == 5)
10859 bfd_put_32 (output_bfd, val, ptr);
10861 put_arm_insn (htab, output_bfd, val, ptr);
10864 else if (htab->vxworks_p)
10869 for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
10871 val = elf32_arm_vxworks_exec_plt_entry[i];
10873 val |= got_address;
10875 val |= 0xffffff & -((h->plt.offset + i * 4 + 8) >> 2);
10877 val |= plt_index * RELOC_SIZE (htab);
10878 if (i == 2 || i == 5)
10879 bfd_put_32 (output_bfd, val, ptr);
10881 put_arm_insn (htab, output_bfd, val, ptr);
10884 loc = (htab->srelplt2->contents
10885 + (plt_index * 2 + 1) * RELOC_SIZE (htab));
10887 /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
10888 referencing the GOT for this PLT entry. */
10889 rel.r_offset = plt_address + 8;
10890 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
10891 rel.r_addend = got_offset;
10892 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10893 loc += RELOC_SIZE (htab);
10895 /* Create the R_ARM_ABS32 relocation referencing the
10896 beginning of the PLT for this GOT entry. */
10897 rel.r_offset = got_address;
10898 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
10900 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10904 bfd_signed_vma thumb_refs;
10905 /* Calculate the displacement between the PLT slot and the
10906 entry in the GOT. The eight-byte offset accounts for the
10907 value produced by adding to pc in the first instruction
10908 of the PLT stub. */
10909 got_displacement = got_address - (plt_address + 8);
10911 BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
10913 thumb_refs = eh->plt_thumb_refcount;
10914 if (!htab->use_blx)
10915 thumb_refs += eh->plt_maybe_thumb_refcount;
10917 if (thumb_refs > 0)
10919 put_thumb_insn (htab, output_bfd,
10920 elf32_arm_plt_thumb_stub[0], ptr - 4);
10921 put_thumb_insn (htab, output_bfd,
10922 elf32_arm_plt_thumb_stub[1], ptr - 2);
10925 put_arm_insn (htab, output_bfd,
10926 elf32_arm_plt_entry[0]
10927 | ((got_displacement & 0x0ff00000) >> 20),
10929 put_arm_insn (htab, output_bfd,
10930 elf32_arm_plt_entry[1]
10931 | ((got_displacement & 0x000ff000) >> 12),
10933 put_arm_insn (htab, output_bfd,
10934 elf32_arm_plt_entry[2]
10935 | (got_displacement & 0x00000fff),
10937 #ifdef FOUR_WORD_PLT
10938 bfd_put_32 (output_bfd, elf32_arm_plt_entry[3], ptr + 12);
10942 /* Fill in the entry in the global offset table. */
10943 bfd_put_32 (output_bfd,
10944 (splt->output_section->vma
10945 + splt->output_offset),
10946 sgot->contents + got_offset);
10948 /* Fill in the entry in the .rel(a).plt section. */
10950 rel.r_offset = got_address;
10951 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_JUMP_SLOT);
10954 loc = srel->contents + plt_index * RELOC_SIZE (htab);
10955 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10957 if (!h->def_regular)
10959 /* Mark the symbol as undefined, rather than as defined in
10960 the .plt section. Leave the value alone. */
10961 sym->st_shndx = SHN_UNDEF;
10962 /* If the symbol is weak, we do need to clear the value.
10963 Otherwise, the PLT entry would provide a definition for
10964 the symbol even if the symbol wasn't defined anywhere,
10965 and so the symbol would never be NULL. */
10966 if (!h->ref_regular_nonweak)
10971 if (h->got.offset != (bfd_vma) -1
10972 && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
10973 && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
10977 Elf_Internal_Rela rel;
10981 /* This symbol has an entry in the global offset table. Set it
10983 sgot = bfd_get_section_by_name (dynobj, ".got");
10984 srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (htab, ".got"));
10985 BFD_ASSERT (sgot != NULL && srel != NULL);
10987 offset = (h->got.offset & ~(bfd_vma) 1);
10989 rel.r_offset = (sgot->output_section->vma
10990 + sgot->output_offset
10993 /* If this is a static link, or it is a -Bsymbolic link and the
10994 symbol is defined locally or was forced to be local because
10995 of a version file, we just want to emit a RELATIVE reloc.
10996 The entry in the global offset table will already have been
10997 initialized in the relocate_section function. */
10999 && SYMBOL_REFERENCES_LOCAL (info, h))
11001 BFD_ASSERT ((h->got.offset & 1) != 0);
11002 rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
11003 if (!htab->use_rel)
11005 rel.r_addend = bfd_get_32 (output_bfd, sgot->contents + offset);
11006 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
11011 BFD_ASSERT ((h->got.offset & 1) == 0);
11012 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
11013 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
11016 loc = srel->contents + srel->reloc_count++ * RELOC_SIZE (htab);
11017 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
11023 Elf_Internal_Rela rel;
11026 /* This symbol needs a copy reloc. Set it up. */
11027 BFD_ASSERT (h->dynindx != -1
11028 && (h->root.type == bfd_link_hash_defined
11029 || h->root.type == bfd_link_hash_defweak));
11031 s = bfd_get_section_by_name (h->root.u.def.section->owner,
11032 RELOC_SECTION (htab, ".bss"));
11033 BFD_ASSERT (s != NULL);
11036 rel.r_offset = (h->root.u.def.value
11037 + h->root.u.def.section->output_section->vma
11038 + h->root.u.def.section->output_offset);
11039 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
11040 loc = s->contents + s->reloc_count++ * RELOC_SIZE (htab);
11041 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
11044 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. On VxWorks,
11045 the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it is relative
11046 to the ".got" section. */
11047 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
11048 || (!htab->vxworks_p && h == htab->root.hgot))
11049 sym->st_shndx = SHN_ABS;
11054 /* Finish up the dynamic sections. */
11057 elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
11063 dynobj = elf_hash_table (info)->dynobj;
11065 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
11066 BFD_ASSERT (elf32_arm_hash_table (info)->symbian_p || sgot != NULL);
11067 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
11069 if (elf_hash_table (info)->dynamic_sections_created)
11072 Elf32_External_Dyn *dyncon, *dynconend;
11073 struct elf32_arm_link_hash_table *htab;
11075 htab = elf32_arm_hash_table (info);
11076 splt = bfd_get_section_by_name (dynobj, ".plt");
11077 BFD_ASSERT (splt != NULL && sdyn != NULL);
11079 dyncon = (Elf32_External_Dyn *) sdyn->contents;
11080 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
11082 for (; dyncon < dynconend; dyncon++)
11084 Elf_Internal_Dyn dyn;
11088 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
11095 if (htab->vxworks_p
11096 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
11097 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
11102 goto get_vma_if_bpabi;
11105 goto get_vma_if_bpabi;
11108 goto get_vma_if_bpabi;
11110 name = ".gnu.version";
11111 goto get_vma_if_bpabi;
11113 name = ".gnu.version_d";
11114 goto get_vma_if_bpabi;
11116 name = ".gnu.version_r";
11117 goto get_vma_if_bpabi;
11123 name = RELOC_SECTION (htab, ".plt");
11125 s = bfd_get_section_by_name (output_bfd, name);
11126 BFD_ASSERT (s != NULL);
11127 if (!htab->symbian_p)
11128 dyn.d_un.d_ptr = s->vma;
11130 /* In the BPABI, tags in the PT_DYNAMIC section point
11131 at the file offset, not the memory address, for the
11132 convenience of the post linker. */
11133 dyn.d_un.d_ptr = s->filepos;
11134 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
11138 if (htab->symbian_p)
11143 s = bfd_get_section_by_name (output_bfd,
11144 RELOC_SECTION (htab, ".plt"));
11145 BFD_ASSERT (s != NULL);
11146 dyn.d_un.d_val = s->size;
11147 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
11152 if (!htab->symbian_p)
11154 /* My reading of the SVR4 ABI indicates that the
11155 procedure linkage table relocs (DT_JMPREL) should be
11156 included in the overall relocs (DT_REL). This is
11157 what Solaris does. However, UnixWare can not handle
11158 that case. Therefore, we override the DT_RELSZ entry
11159 here to make it not include the JMPREL relocs. Since
11160 the linker script arranges for .rel(a).plt to follow all
11161 other relocation sections, we don't have to worry
11162 about changing the DT_REL entry. */
11163 s = bfd_get_section_by_name (output_bfd,
11164 RELOC_SECTION (htab, ".plt"));
11166 dyn.d_un.d_val -= s->size;
11167 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
11170 /* Fall through. */
11174 /* In the BPABI, the DT_REL tag must point at the file
11175 offset, not the VMA, of the first relocation
11176 section. So, we use code similar to that in
11177 elflink.c, but do not check for SHF_ALLOC on the
11178 relcoation section, since relocations sections are
11179 never allocated under the BPABI. The comments above
11180 about Unixware notwithstanding, we include all of the
11181 relocations here. */
11182 if (htab->symbian_p)
11185 type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
11186 ? SHT_REL : SHT_RELA);
11187 dyn.d_un.d_val = 0;
11188 for (i = 1; i < elf_numsections (output_bfd); i++)
11190 Elf_Internal_Shdr *hdr
11191 = elf_elfsections (output_bfd)[i];
11192 if (hdr->sh_type == type)
11194 if (dyn.d_tag == DT_RELSZ
11195 || dyn.d_tag == DT_RELASZ)
11196 dyn.d_un.d_val += hdr->sh_size;
11197 else if ((ufile_ptr) hdr->sh_offset
11198 <= dyn.d_un.d_val - 1)
11199 dyn.d_un.d_val = hdr->sh_offset;
11202 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
11206 /* Set the bottom bit of DT_INIT/FINI if the
11207 corresponding function is Thumb. */
11209 name = info->init_function;
11212 name = info->fini_function;
11214 /* If it wasn't set by elf_bfd_final_link
11215 then there is nothing to adjust. */
11216 if (dyn.d_un.d_val != 0)
11218 struct elf_link_hash_entry * eh;
11220 eh = elf_link_hash_lookup (elf_hash_table (info), name,
11221 FALSE, FALSE, TRUE);
11223 && ELF_ST_TYPE (eh->type) == STT_ARM_TFUNC)
11225 dyn.d_un.d_val |= 1;
11226 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
11233 /* Fill in the first entry in the procedure linkage table. */
11234 if (splt->size > 0 && elf32_arm_hash_table (info)->plt_header_size)
11236 const bfd_vma *plt0_entry;
11237 bfd_vma got_address, plt_address, got_displacement;
11239 /* Calculate the addresses of the GOT and PLT. */
11240 got_address = sgot->output_section->vma + sgot->output_offset;
11241 plt_address = splt->output_section->vma + splt->output_offset;
11243 if (htab->vxworks_p)
11245 /* The VxWorks GOT is relocated by the dynamic linker.
11246 Therefore, we must emit relocations rather than simply
11247 computing the values now. */
11248 Elf_Internal_Rela rel;
11250 plt0_entry = elf32_arm_vxworks_exec_plt0_entry;
11251 put_arm_insn (htab, output_bfd, plt0_entry[0],
11252 splt->contents + 0);
11253 put_arm_insn (htab, output_bfd, plt0_entry[1],
11254 splt->contents + 4);
11255 put_arm_insn (htab, output_bfd, plt0_entry[2],
11256 splt->contents + 8);
11257 bfd_put_32 (output_bfd, got_address, splt->contents + 12);
11259 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_. */
11260 rel.r_offset = plt_address + 12;
11261 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
11263 SWAP_RELOC_OUT (htab) (output_bfd, &rel,
11264 htab->srelplt2->contents);
11268 got_displacement = got_address - (plt_address + 16);
11270 plt0_entry = elf32_arm_plt0_entry;
11271 put_arm_insn (htab, output_bfd, plt0_entry[0],
11272 splt->contents + 0);
11273 put_arm_insn (htab, output_bfd, plt0_entry[1],
11274 splt->contents + 4);
11275 put_arm_insn (htab, output_bfd, plt0_entry[2],
11276 splt->contents + 8);
11277 put_arm_insn (htab, output_bfd, plt0_entry[3],
11278 splt->contents + 12);
11280 #ifdef FOUR_WORD_PLT
11281 /* The displacement value goes in the otherwise-unused
11282 last word of the second entry. */
11283 bfd_put_32 (output_bfd, got_displacement, splt->contents + 28);
11285 bfd_put_32 (output_bfd, got_displacement, splt->contents + 16);
11290 /* UnixWare sets the entsize of .plt to 4, although that doesn't
11291 really seem like the right value. */
11292 if (splt->output_section->owner == output_bfd)
11293 elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
11295 if (htab->vxworks_p && !info->shared && htab->splt->size > 0)
11297 /* Correct the .rel(a).plt.unloaded relocations. They will have
11298 incorrect symbol indexes. */
11302 num_plts = ((htab->splt->size - htab->plt_header_size)
11303 / htab->plt_entry_size);
11304 p = htab->srelplt2->contents + RELOC_SIZE (htab);
11306 for (; num_plts; num_plts--)
11308 Elf_Internal_Rela rel;
11310 SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
11311 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
11312 SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
11313 p += RELOC_SIZE (htab);
11315 SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
11316 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
11317 SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
11318 p += RELOC_SIZE (htab);
11323 /* Fill in the first three entries in the global offset table. */
11326 if (sgot->size > 0)
11329 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
11331 bfd_put_32 (output_bfd,
11332 sdyn->output_section->vma + sdyn->output_offset,
11334 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
11335 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
11338 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
11345 elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
11347 Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
11348 struct elf32_arm_link_hash_table *globals;
11350 i_ehdrp = elf_elfheader (abfd);
11352 if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
11353 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
11355 i_ehdrp->e_ident[EI_OSABI] = 0;
11356 i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
11360 globals = elf32_arm_hash_table (link_info);
11361 if (globals->byteswap_code)
11362 i_ehdrp->e_flags |= EF_ARM_BE8;
11366 static enum elf_reloc_type_class
11367 elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
11369 switch ((int) ELF32_R_TYPE (rela->r_info))
11371 case R_ARM_RELATIVE:
11372 return reloc_class_relative;
11373 case R_ARM_JUMP_SLOT:
11374 return reloc_class_plt;
11376 return reloc_class_copy;
11378 return reloc_class_normal;
11382 /* Set the right machine number for an Arm ELF file. */
11385 elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
11387 if (hdr->sh_type == SHT_NOTE)
11388 *flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_CONTENTS;
11394 elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
11396 bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
11399 /* Return TRUE if this is an unwinding table entry. */
11402 is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
11404 return (CONST_STRNEQ (name, ELF_STRING_ARM_unwind)
11405 || CONST_STRNEQ (name, ELF_STRING_ARM_unwind_once));
11409 /* Set the type and flags for an ARM section. We do this by
11410 the section name, which is a hack, but ought to work. */
11413 elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
11417 name = bfd_get_section_name (abfd, sec);
11419 if (is_arm_elf_unwind_section_name (abfd, name))
11421 hdr->sh_type = SHT_ARM_EXIDX;
11422 hdr->sh_flags |= SHF_LINK_ORDER;
11427 /* Handle an ARM specific section when reading an object file. This is
11428 called when bfd_section_from_shdr finds a section with an unknown
11432 elf32_arm_section_from_shdr (bfd *abfd,
11433 Elf_Internal_Shdr * hdr,
11437 /* There ought to be a place to keep ELF backend specific flags, but
11438 at the moment there isn't one. We just keep track of the
11439 sections by their name, instead. Fortunately, the ABI gives
11440 names for all the ARM specific sections, so we will probably get
11442 switch (hdr->sh_type)
11444 case SHT_ARM_EXIDX:
11445 case SHT_ARM_PREEMPTMAP:
11446 case SHT_ARM_ATTRIBUTES:
11453 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
11459 /* A structure used to record a list of sections, independently
11460 of the next and prev fields in the asection structure. */
11461 typedef struct section_list
11464 struct section_list * next;
11465 struct section_list * prev;
11469 /* Unfortunately we need to keep a list of sections for which
11470 an _arm_elf_section_data structure has been allocated. This
11471 is because it is possible for functions like elf32_arm_write_section
11472 to be called on a section which has had an elf_data_structure
11473 allocated for it (and so the used_by_bfd field is valid) but
11474 for which the ARM extended version of this structure - the
11475 _arm_elf_section_data structure - has not been allocated. */
11476 static section_list * sections_with_arm_elf_section_data = NULL;
11479 record_section_with_arm_elf_section_data (asection * sec)
11481 struct section_list * entry;
11483 entry = bfd_malloc (sizeof (* entry));
11487 entry->next = sections_with_arm_elf_section_data;
11488 entry->prev = NULL;
11489 if (entry->next != NULL)
11490 entry->next->prev = entry;
11491 sections_with_arm_elf_section_data = entry;
11494 static struct section_list *
11495 find_arm_elf_section_entry (asection * sec)
11497 struct section_list * entry;
11498 static struct section_list * last_entry = NULL;
11500 /* This is a short cut for the typical case where the sections are added
11501 to the sections_with_arm_elf_section_data list in forward order and
11502 then looked up here in backwards order. This makes a real difference
11503 to the ld-srec/sec64k.exp linker test. */
11504 entry = sections_with_arm_elf_section_data;
11505 if (last_entry != NULL)
11507 if (last_entry->sec == sec)
11508 entry = last_entry;
11509 else if (last_entry->next != NULL
11510 && last_entry->next->sec == sec)
11511 entry = last_entry->next;
11514 for (; entry; entry = entry->next)
11515 if (entry->sec == sec)
11519 /* Record the entry prior to this one - it is the entry we are most
11520 likely to want to locate next time. Also this way if we have been
11521 called from unrecord_section_with_arm_elf_section_data() we will not
11522 be caching a pointer that is about to be freed. */
11523 last_entry = entry->prev;
11528 static _arm_elf_section_data *
11529 get_arm_elf_section_data (asection * sec)
11531 struct section_list * entry;
11533 entry = find_arm_elf_section_entry (sec);
11536 return elf32_arm_section_data (entry->sec);
11542 unrecord_section_with_arm_elf_section_data (asection * sec)
11544 struct section_list * entry;
11546 entry = find_arm_elf_section_entry (sec);
11550 if (entry->prev != NULL)
11551 entry->prev->next = entry->next;
11552 if (entry->next != NULL)
11553 entry->next->prev = entry->prev;
11554 if (entry == sections_with_arm_elf_section_data)
11555 sections_with_arm_elf_section_data = entry->next;
11564 struct bfd_link_info *info;
11567 bfd_boolean (*func) (void *, const char *, Elf_Internal_Sym *,
11568 asection *, struct elf_link_hash_entry *);
11569 } output_arch_syminfo;
11571 enum map_symbol_type
11579 /* Output a single mapping symbol. */
11582 elf32_arm_output_map_sym (output_arch_syminfo *osi,
11583 enum map_symbol_type type,
11586 static const char *names[3] = {"$a", "$t", "$d"};
11587 struct elf32_arm_link_hash_table *htab;
11588 Elf_Internal_Sym sym;
11590 htab = elf32_arm_hash_table (osi->info);
11591 sym.st_value = osi->sec->output_section->vma
11592 + osi->sec->output_offset
11596 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
11597 sym.st_shndx = osi->sec_shndx;
11598 if (!osi->func (osi->finfo, names[type], &sym, osi->sec, NULL))
11604 /* Output mapping symbols for PLT entries associated with H. */
11607 elf32_arm_output_plt_map (struct elf_link_hash_entry *h, void *inf)
11609 output_arch_syminfo *osi = (output_arch_syminfo *) inf;
11610 struct elf32_arm_link_hash_table *htab;
11611 struct elf32_arm_link_hash_entry *eh;
11614 htab = elf32_arm_hash_table (osi->info);
11616 if (h->root.type == bfd_link_hash_indirect)
11619 if (h->root.type == bfd_link_hash_warning)
11620 /* When warning symbols are created, they **replace** the "real"
11621 entry in the hash table, thus we never get to see the real
11622 symbol in a hash traversal. So look at it now. */
11623 h = (struct elf_link_hash_entry *) h->root.u.i.link;
11625 if (h->plt.offset == (bfd_vma) -1)
11628 eh = (struct elf32_arm_link_hash_entry *) h;
11629 addr = h->plt.offset;
11630 if (htab->symbian_p)
11632 if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11634 if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 4))
11637 else if (htab->vxworks_p)
11639 if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11641 if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
11643 if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 12))
11645 if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 20))
11650 bfd_signed_vma thumb_refs;
11652 thumb_refs = eh->plt_thumb_refcount;
11653 if (!htab->use_blx)
11654 thumb_refs += eh->plt_maybe_thumb_refcount;
11656 if (thumb_refs > 0)
11658 if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr - 4))
11661 #ifdef FOUR_WORD_PLT
11662 if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11664 if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 12))
11667 /* A three-word PLT with no Thumb thunk contains only Arm code,
11668 so only need to output a mapping symbol for the first PLT entry and
11669 entries with thumb thunks. */
11670 if (thumb_refs > 0 || addr == 20)
11672 if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11681 /* Output a single local symbol for a generated stub. */
11684 elf32_arm_output_stub_sym (output_arch_syminfo *osi, const char *name,
11685 bfd_vma offset, bfd_vma size)
11687 struct elf32_arm_link_hash_table *htab;
11688 Elf_Internal_Sym sym;
11690 htab = elf32_arm_hash_table (osi->info);
11691 sym.st_value = osi->sec->output_section->vma
11692 + osi->sec->output_offset
11694 sym.st_size = size;
11696 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
11697 sym.st_shndx = osi->sec_shndx;
11698 if (!osi->func (osi->finfo, name, &sym, osi->sec, NULL))
11704 arm_map_one_stub (struct bfd_hash_entry * gen_entry,
11707 struct elf32_arm_stub_hash_entry *stub_entry;
11708 struct bfd_link_info *info;
11709 struct elf32_arm_link_hash_table *htab;
11710 asection *stub_sec;
11713 output_arch_syminfo *osi;
11714 const insn_sequence *template;
11715 enum stub_insn_type prev_type;
11718 enum map_symbol_type sym_type;
11720 /* Massage our args to the form they really have. */
11721 stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
11722 osi = (output_arch_syminfo *) in_arg;
11726 htab = elf32_arm_hash_table (info);
11727 stub_sec = stub_entry->stub_sec;
11729 /* Ensure this stub is attached to the current section being
11731 if (stub_sec != osi->sec)
11734 addr = (bfd_vma) stub_entry->stub_offset;
11735 stub_name = stub_entry->output_name;
11737 template = stub_entry->stub_template;
11738 switch (template[0].type)
11741 if (!elf32_arm_output_stub_sym (osi, stub_name, addr, stub_entry->stub_size))
11745 if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1,
11746 stub_entry->stub_size))
11754 prev_type = DATA_TYPE;
11756 for (i = 0; i < stub_entry->stub_template_size; i++)
11758 switch (template[i].type)
11761 sym_type = ARM_MAP_ARM;
11765 sym_type = ARM_MAP_THUMB;
11769 sym_type = ARM_MAP_DATA;
11777 if (template[i].type != prev_type)
11779 prev_type = template[i].type;
11780 if (!elf32_arm_output_map_sym (osi, sym_type, addr + size))
11784 switch (template[i].type)
11807 /* Output mapping symbols for linker generated sections. */
11810 elf32_arm_output_arch_local_syms (bfd *output_bfd,
11811 struct bfd_link_info *info,
11813 bfd_boolean (*func) (void *, const char *,
11814 Elf_Internal_Sym *,
11816 struct elf_link_hash_entry *))
11818 output_arch_syminfo osi;
11819 struct elf32_arm_link_hash_table *htab;
11821 bfd_size_type size;
11823 htab = elf32_arm_hash_table (info);
11824 check_use_blx (htab);
11830 /* ARM->Thumb glue. */
11831 if (htab->arm_glue_size > 0)
11833 osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
11834 ARM2THUMB_GLUE_SECTION_NAME);
11836 osi.sec_shndx = _bfd_elf_section_from_bfd_section
11837 (output_bfd, osi.sec->output_section);
11838 if (info->shared || htab->root.is_relocatable_executable
11839 || htab->pic_veneer)
11840 size = ARM2THUMB_PIC_GLUE_SIZE;
11841 else if (htab->use_blx)
11842 size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
11844 size = ARM2THUMB_STATIC_GLUE_SIZE;
11846 for (offset = 0; offset < htab->arm_glue_size; offset += size)
11848 elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset);
11849 elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, offset + size - 4);
11853 /* Thumb->ARM glue. */
11854 if (htab->thumb_glue_size > 0)
11856 osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
11857 THUMB2ARM_GLUE_SECTION_NAME);
11859 osi.sec_shndx = _bfd_elf_section_from_bfd_section
11860 (output_bfd, osi.sec->output_section);
11861 size = THUMB2ARM_GLUE_SIZE;
11863 for (offset = 0; offset < htab->thumb_glue_size; offset += size)
11865 elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, offset);
11866 elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset + 4);
11870 /* ARMv4 BX veneers. */
11871 if (htab->bx_glue_size > 0)
11873 osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
11874 ARM_BX_GLUE_SECTION_NAME);
11876 osi.sec_shndx = _bfd_elf_section_from_bfd_section
11877 (output_bfd, osi.sec->output_section);
11879 elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0);
11882 /* Long calls stubs. */
11883 if (htab->stub_bfd && htab->stub_bfd->sections)
11885 asection* stub_sec;
11887 for (stub_sec = htab->stub_bfd->sections;
11889 stub_sec = stub_sec->next)
11891 /* Ignore non-stub sections. */
11892 if (!strstr (stub_sec->name, STUB_SUFFIX))
11895 osi.sec = stub_sec;
11897 osi.sec_shndx = _bfd_elf_section_from_bfd_section
11898 (output_bfd, osi.sec->output_section);
11900 bfd_hash_traverse (&htab->stub_hash_table, arm_map_one_stub, &osi);
11904 /* Finally, output mapping symbols for the PLT. */
11905 if (!htab->splt || htab->splt->size == 0)
11908 osi.sec_shndx = _bfd_elf_section_from_bfd_section (output_bfd,
11909 htab->splt->output_section);
11910 osi.sec = htab->splt;
11911 /* Output mapping symbols for the plt header. SymbianOS does not have a
11913 if (htab->vxworks_p)
11915 /* VxWorks shared libraries have no PLT header. */
11918 if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
11920 if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 12))
11924 else if (!htab->symbian_p)
11926 if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
11928 #ifndef FOUR_WORD_PLT
11929 if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 16))
11934 elf_link_hash_traverse (&htab->root, elf32_arm_output_plt_map, (void *) &osi);
11938 /* Allocate target specific section data. */
11941 elf32_arm_new_section_hook (bfd *abfd, asection *sec)
11943 if (!sec->used_by_bfd)
11945 _arm_elf_section_data *sdata;
11946 bfd_size_type amt = sizeof (*sdata);
11948 sdata = bfd_zalloc (abfd, amt);
11951 sec->used_by_bfd = sdata;
11954 record_section_with_arm_elf_section_data (sec);
11956 return _bfd_elf_new_section_hook (abfd, sec);
11960 /* Used to order a list of mapping symbols by address. */
11963 elf32_arm_compare_mapping (const void * a, const void * b)
11965 const elf32_arm_section_map *amap = (const elf32_arm_section_map *) a;
11966 const elf32_arm_section_map *bmap = (const elf32_arm_section_map *) b;
11968 if (amap->vma > bmap->vma)
11970 else if (amap->vma < bmap->vma)
11972 else if (amap->type > bmap->type)
11973 /* Ensure results do not depend on the host qsort for objects with
11974 multiple mapping symbols at the same address by sorting on type
11977 else if (amap->type < bmap->type)
11984 /* Do code byteswapping. Return FALSE afterwards so that the section is
11985 written out as normal. */
11988 elf32_arm_write_section (bfd *output_bfd,
11989 struct bfd_link_info *link_info,
11991 bfd_byte *contents)
11993 int mapcount, errcount;
11994 _arm_elf_section_data *arm_data;
11995 struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
11996 elf32_arm_section_map *map;
11997 elf32_vfp11_erratum_list *errnode;
12000 bfd_vma offset = sec->output_section->vma + sec->output_offset;
12004 /* If this section has not been allocated an _arm_elf_section_data
12005 structure then we cannot record anything. */
12006 arm_data = get_arm_elf_section_data (sec);
12007 if (arm_data == NULL)
12010 mapcount = arm_data->mapcount;
12011 map = arm_data->map;
12012 errcount = arm_data->erratumcount;
12016 unsigned int endianflip = bfd_big_endian (output_bfd) ? 3 : 0;
12018 for (errnode = arm_data->erratumlist; errnode != 0;
12019 errnode = errnode->next)
12021 bfd_vma index = errnode->vma - offset;
12023 switch (errnode->type)
12025 case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
12027 bfd_vma branch_to_veneer;
12028 /* Original condition code of instruction, plus bit mask for
12029 ARM B instruction. */
12030 unsigned int insn = (errnode->u.b.vfp_insn & 0xf0000000)
12033 /* The instruction is before the label. */
12036 /* Above offset included in -4 below. */
12037 branch_to_veneer = errnode->u.b.veneer->vma
12038 - errnode->vma - 4;
12040 if ((signed) branch_to_veneer < -(1 << 25)
12041 || (signed) branch_to_veneer >= (1 << 25))
12042 (*_bfd_error_handler) (_("%B: error: VFP11 veneer out of "
12043 "range"), output_bfd);
12045 insn |= (branch_to_veneer >> 2) & 0xffffff;
12046 contents[endianflip ^ index] = insn & 0xff;
12047 contents[endianflip ^ (index + 1)] = (insn >> 8) & 0xff;
12048 contents[endianflip ^ (index + 2)] = (insn >> 16) & 0xff;
12049 contents[endianflip ^ (index + 3)] = (insn >> 24) & 0xff;
12053 case VFP11_ERRATUM_ARM_VENEER:
12055 bfd_vma branch_from_veneer;
12058 /* Take size of veneer into account. */
12059 branch_from_veneer = errnode->u.v.branch->vma
12060 - errnode->vma - 12;
12062 if ((signed) branch_from_veneer < -(1 << 25)
12063 || (signed) branch_from_veneer >= (1 << 25))
12064 (*_bfd_error_handler) (_("%B: error: VFP11 veneer out of "
12065 "range"), output_bfd);
12067 /* Original instruction. */
12068 insn = errnode->u.v.branch->u.b.vfp_insn;
12069 contents[endianflip ^ index] = insn & 0xff;
12070 contents[endianflip ^ (index + 1)] = (insn >> 8) & 0xff;
12071 contents[endianflip ^ (index + 2)] = (insn >> 16) & 0xff;
12072 contents[endianflip ^ (index + 3)] = (insn >> 24) & 0xff;
12074 /* Branch back to insn after original insn. */
12075 insn = 0xea000000 | ((branch_from_veneer >> 2) & 0xffffff);
12076 contents[endianflip ^ (index + 4)] = insn & 0xff;
12077 contents[endianflip ^ (index + 5)] = (insn >> 8) & 0xff;
12078 contents[endianflip ^ (index + 6)] = (insn >> 16) & 0xff;
12079 contents[endianflip ^ (index + 7)] = (insn >> 24) & 0xff;
12092 if (globals->byteswap_code)
12094 qsort (map, mapcount, sizeof (* map), elf32_arm_compare_mapping);
12097 for (i = 0; i < mapcount; i++)
12099 if (i == mapcount - 1)
12102 end = map[i + 1].vma;
12104 switch (map[i].type)
12107 /* Byte swap code words. */
12108 while (ptr + 3 < end)
12110 tmp = contents[ptr];
12111 contents[ptr] = contents[ptr + 3];
12112 contents[ptr + 3] = tmp;
12113 tmp = contents[ptr + 1];
12114 contents[ptr + 1] = contents[ptr + 2];
12115 contents[ptr + 2] = tmp;
12121 /* Byte swap code halfwords. */
12122 while (ptr + 1 < end)
12124 tmp = contents[ptr];
12125 contents[ptr] = contents[ptr + 1];
12126 contents[ptr + 1] = tmp;
12132 /* Leave data alone. */
12140 arm_data->mapcount = 0;
12141 arm_data->mapsize = 0;
12142 arm_data->map = NULL;
12143 unrecord_section_with_arm_elf_section_data (sec);
12149 unrecord_section_via_map_over_sections (bfd * abfd ATTRIBUTE_UNUSED,
12151 void * ignore ATTRIBUTE_UNUSED)
12153 unrecord_section_with_arm_elf_section_data (sec);
12157 elf32_arm_close_and_cleanup (bfd * abfd)
12159 if (abfd->sections)
12160 bfd_map_over_sections (abfd,
12161 unrecord_section_via_map_over_sections,
12164 return _bfd_elf_close_and_cleanup (abfd);
12168 elf32_arm_bfd_free_cached_info (bfd * abfd)
12170 if (abfd->sections)
12171 bfd_map_over_sections (abfd,
12172 unrecord_section_via_map_over_sections,
12175 return _bfd_free_cached_info (abfd);
12178 /* Display STT_ARM_TFUNC symbols as functions. */
12181 elf32_arm_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
12184 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
12186 if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_ARM_TFUNC)
12187 elfsym->symbol.flags |= BSF_FUNCTION;
12191 /* Mangle thumb function symbols as we read them in. */
12194 elf32_arm_swap_symbol_in (bfd * abfd,
12197 Elf_Internal_Sym *dst)
12199 if (!bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst))
12202 /* New EABI objects mark thumb function symbols by setting the low bit of
12203 the address. Turn these into STT_ARM_TFUNC. */
12204 if ((ELF_ST_TYPE (dst->st_info) == STT_FUNC)
12205 && (dst->st_value & 1))
12207 dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC);
12208 dst->st_value &= ~(bfd_vma) 1;
12214 /* Mangle thumb function symbols as we write them out. */
12217 elf32_arm_swap_symbol_out (bfd *abfd,
12218 const Elf_Internal_Sym *src,
12222 Elf_Internal_Sym newsym;
12224 /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
12225 of the address set, as per the new EABI. We do this unconditionally
12226 because objcopy does not set the elf header flags until after
12227 it writes out the symbol table. */
12228 if (ELF_ST_TYPE (src->st_info) == STT_ARM_TFUNC)
12231 newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
12232 if (newsym.st_shndx != SHN_UNDEF)
12234 /* Do this only for defined symbols. At link type, the static
12235 linker will simulate the work of dynamic linker of resolving
12236 symbols and will carry over the thumbness of found symbols to
12237 the output symbol table. It's not clear how it happens, but
12238 the thumbness of undefined symbols can well be different at
12239 runtime, and writing '1' for them will be confusing for users
12240 and possibly for dynamic linker itself.
12242 newsym.st_value |= 1;
12247 bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
12250 /* Add the PT_ARM_EXIDX program header. */
12253 elf32_arm_modify_segment_map (bfd *abfd,
12254 struct bfd_link_info *info ATTRIBUTE_UNUSED)
12256 struct elf_segment_map *m;
12259 sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
12260 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
12262 /* If there is already a PT_ARM_EXIDX header, then we do not
12263 want to add another one. This situation arises when running
12264 "strip"; the input binary already has the header. */
12265 m = elf_tdata (abfd)->segment_map;
12266 while (m && m->p_type != PT_ARM_EXIDX)
12270 m = bfd_zalloc (abfd, sizeof (struct elf_segment_map));
12273 m->p_type = PT_ARM_EXIDX;
12275 m->sections[0] = sec;
12277 m->next = elf_tdata (abfd)->segment_map;
12278 elf_tdata (abfd)->segment_map = m;
12285 /* We may add a PT_ARM_EXIDX program header. */
12288 elf32_arm_additional_program_headers (bfd *abfd,
12289 struct bfd_link_info *info ATTRIBUTE_UNUSED)
12293 sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
12294 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
12300 /* We have two function types: STT_FUNC and STT_ARM_TFUNC. */
12303 elf32_arm_is_function_type (unsigned int type)
12305 return (type == STT_FUNC) || (type == STT_ARM_TFUNC);
12308 /* We use this to override swap_symbol_in and swap_symbol_out. */
12309 const struct elf_size_info elf32_arm_size_info =
12311 sizeof (Elf32_External_Ehdr),
12312 sizeof (Elf32_External_Phdr),
12313 sizeof (Elf32_External_Shdr),
12314 sizeof (Elf32_External_Rel),
12315 sizeof (Elf32_External_Rela),
12316 sizeof (Elf32_External_Sym),
12317 sizeof (Elf32_External_Dyn),
12318 sizeof (Elf_External_Note),
12322 ELFCLASS32, EV_CURRENT,
12323 bfd_elf32_write_out_phdrs,
12324 bfd_elf32_write_shdrs_and_ehdr,
12325 bfd_elf32_checksum_contents,
12326 bfd_elf32_write_relocs,
12327 elf32_arm_swap_symbol_in,
12328 elf32_arm_swap_symbol_out,
12329 bfd_elf32_slurp_reloc_table,
12330 bfd_elf32_slurp_symbol_table,
12331 bfd_elf32_swap_dyn_in,
12332 bfd_elf32_swap_dyn_out,
12333 bfd_elf32_swap_reloc_in,
12334 bfd_elf32_swap_reloc_out,
12335 bfd_elf32_swap_reloca_in,
12336 bfd_elf32_swap_reloca_out
12339 #define ELF_ARCH bfd_arch_arm
12340 #define ELF_MACHINE_CODE EM_ARM
12341 #ifdef __QNXTARGET__
12342 #define ELF_MAXPAGESIZE 0x1000
12344 #define ELF_MAXPAGESIZE 0x8000
12346 #define ELF_MINPAGESIZE 0x1000
12347 #define ELF_COMMONPAGESIZE 0x1000
12349 #define bfd_elf32_mkobject elf32_arm_mkobject
12351 #define bfd_elf32_bfd_copy_private_bfd_data elf32_arm_copy_private_bfd_data
12352 #define bfd_elf32_bfd_merge_private_bfd_data elf32_arm_merge_private_bfd_data
12353 #define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
12354 #define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
12355 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
12356 #define bfd_elf32_bfd_link_hash_table_free elf32_arm_hash_table_free
12357 #define bfd_elf32_bfd_reloc_type_lookup elf32_arm_reloc_type_lookup
12358 #define bfd_elf32_bfd_reloc_name_lookup elf32_arm_reloc_name_lookup
12359 #define bfd_elf32_find_nearest_line elf32_arm_find_nearest_line
12360 #define bfd_elf32_find_inliner_info elf32_arm_find_inliner_info
12361 #define bfd_elf32_new_section_hook elf32_arm_new_section_hook
12362 #define bfd_elf32_bfd_is_target_special_symbol elf32_arm_is_target_special_symbol
12363 #define bfd_elf32_close_and_cleanup elf32_arm_close_and_cleanup
12364 #define bfd_elf32_bfd_free_cached_info elf32_arm_bfd_free_cached_info
12366 #define elf_backend_get_symbol_type elf32_arm_get_symbol_type
12367 #define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook
12368 #define elf_backend_gc_mark_extra_sections elf32_arm_gc_mark_extra_sections
12369 #define elf_backend_gc_sweep_hook elf32_arm_gc_sweep_hook
12370 #define elf_backend_check_relocs elf32_arm_check_relocs
12371 #define elf_backend_relocate_section elf32_arm_relocate_section
12372 #define elf_backend_write_section elf32_arm_write_section
12373 #define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol
12374 #define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections
12375 #define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol
12376 #define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections
12377 #define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections
12378 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections
12379 #define elf_backend_post_process_headers elf32_arm_post_process_headers
12380 #define elf_backend_reloc_type_class elf32_arm_reloc_type_class
12381 #define elf_backend_object_p elf32_arm_object_p
12382 #define elf_backend_section_flags elf32_arm_section_flags
12383 #define elf_backend_fake_sections elf32_arm_fake_sections
12384 #define elf_backend_section_from_shdr elf32_arm_section_from_shdr
12385 #define elf_backend_final_write_processing elf32_arm_final_write_processing
12386 #define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol
12387 #define elf_backend_symbol_processing elf32_arm_symbol_processing
12388 #define elf_backend_size_info elf32_arm_size_info
12389 #define elf_backend_modify_segment_map elf32_arm_modify_segment_map
12390 #define elf_backend_additional_program_headers elf32_arm_additional_program_headers
12391 #define elf_backend_output_arch_local_syms elf32_arm_output_arch_local_syms
12392 #define elf_backend_begin_write_processing elf32_arm_begin_write_processing
12393 #define elf_backend_is_function_type elf32_arm_is_function_type
12395 #define elf_backend_can_refcount 1
12396 #define elf_backend_can_gc_sections 1
12397 #define elf_backend_plt_readonly 1
12398 #define elf_backend_want_got_plt 1
12399 #define elf_backend_want_plt_sym 0
12400 #define elf_backend_may_use_rel_p 1
12401 #define elf_backend_may_use_rela_p 0
12402 #define elf_backend_default_use_rela_p 0
12404 #define elf_backend_got_header_size 12
12406 #undef elf_backend_obj_attrs_vendor
12407 #define elf_backend_obj_attrs_vendor "aeabi"
12408 #undef elf_backend_obj_attrs_section
12409 #define elf_backend_obj_attrs_section ".ARM.attributes"
12410 #undef elf_backend_obj_attrs_arg_type
12411 #define elf_backend_obj_attrs_arg_type elf32_arm_obj_attrs_arg_type
12412 #undef elf_backend_obj_attrs_section_type
12413 #define elf_backend_obj_attrs_section_type SHT_ARM_ATTRIBUTES
12414 #define elf_backend_obj_attrs_order elf32_arm_obj_attrs_order
12416 #include "elf32-target.h"
12418 /* VxWorks Targets. */
12420 #undef TARGET_LITTLE_SYM
12421 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vxworks_vec
12422 #undef TARGET_LITTLE_NAME
12423 #define TARGET_LITTLE_NAME "elf32-littlearm-vxworks"
12424 #undef TARGET_BIG_SYM
12425 #define TARGET_BIG_SYM bfd_elf32_bigarm_vxworks_vec
12426 #undef TARGET_BIG_NAME
12427 #define TARGET_BIG_NAME "elf32-bigarm-vxworks"
12429 /* Like elf32_arm_link_hash_table_create -- but overrides
12430 appropriately for VxWorks. */
12432 static struct bfd_link_hash_table *
12433 elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
12435 struct bfd_link_hash_table *ret;
12437 ret = elf32_arm_link_hash_table_create (abfd);
12440 struct elf32_arm_link_hash_table *htab
12441 = (struct elf32_arm_link_hash_table *) ret;
12443 htab->vxworks_p = 1;
12449 elf32_arm_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
12451 elf32_arm_final_write_processing (abfd, linker);
12452 elf_vxworks_final_write_processing (abfd, linker);
12456 #define elf32_bed elf32_arm_vxworks_bed
12458 #undef bfd_elf32_bfd_link_hash_table_create
12459 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_vxworks_link_hash_table_create
12460 #undef elf_backend_add_symbol_hook
12461 #define elf_backend_add_symbol_hook elf_vxworks_add_symbol_hook
12462 #undef elf_backend_final_write_processing
12463 #define elf_backend_final_write_processing elf32_arm_vxworks_final_write_processing
12464 #undef elf_backend_emit_relocs
12465 #define elf_backend_emit_relocs elf_vxworks_emit_relocs
12467 #undef elf_backend_may_use_rel_p
12468 #define elf_backend_may_use_rel_p 0
12469 #undef elf_backend_may_use_rela_p
12470 #define elf_backend_may_use_rela_p 1
12471 #undef elf_backend_default_use_rela_p
12472 #define elf_backend_default_use_rela_p 1
12473 #undef elf_backend_want_plt_sym
12474 #define elf_backend_want_plt_sym 1
12475 #undef ELF_MAXPAGESIZE
12476 #define ELF_MAXPAGESIZE 0x1000
12478 #include "elf32-target.h"
12481 /* Symbian OS Targets. */
12483 #undef TARGET_LITTLE_SYM
12484 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_symbian_vec
12485 #undef TARGET_LITTLE_NAME
12486 #define TARGET_LITTLE_NAME "elf32-littlearm-symbian"
12487 #undef TARGET_BIG_SYM
12488 #define TARGET_BIG_SYM bfd_elf32_bigarm_symbian_vec
12489 #undef TARGET_BIG_NAME
12490 #define TARGET_BIG_NAME "elf32-bigarm-symbian"
12492 /* Like elf32_arm_link_hash_table_create -- but overrides
12493 appropriately for Symbian OS. */
12495 static struct bfd_link_hash_table *
12496 elf32_arm_symbian_link_hash_table_create (bfd *abfd)
12498 struct bfd_link_hash_table *ret;
12500 ret = elf32_arm_link_hash_table_create (abfd);
12503 struct elf32_arm_link_hash_table *htab
12504 = (struct elf32_arm_link_hash_table *)ret;
12505 /* There is no PLT header for Symbian OS. */
12506 htab->plt_header_size = 0;
12507 /* The PLT entries are each one instruction and one word. */
12508 htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry);
12509 htab->symbian_p = 1;
12510 /* Symbian uses armv5t or above, so use_blx is always true. */
12512 htab->root.is_relocatable_executable = 1;
12517 static const struct bfd_elf_special_section
12518 elf32_arm_symbian_special_sections[] =
12520 /* In a BPABI executable, the dynamic linking sections do not go in
12521 the loadable read-only segment. The post-linker may wish to
12522 refer to these sections, but they are not part of the final
12524 { STRING_COMMA_LEN (".dynamic"), 0, SHT_DYNAMIC, 0 },
12525 { STRING_COMMA_LEN (".dynstr"), 0, SHT_STRTAB, 0 },
12526 { STRING_COMMA_LEN (".dynsym"), 0, SHT_DYNSYM, 0 },
12527 { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS, 0 },
12528 { STRING_COMMA_LEN (".hash"), 0, SHT_HASH, 0 },
12529 /* These sections do not need to be writable as the SymbianOS
12530 postlinker will arrange things so that no dynamic relocation is
12532 { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC },
12533 { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC },
12534 { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC },
12535 { NULL, 0, 0, 0, 0 }
12539 elf32_arm_symbian_begin_write_processing (bfd *abfd,
12540 struct bfd_link_info *link_info)
12542 /* BPABI objects are never loaded directly by an OS kernel; they are
12543 processed by a postlinker first, into an OS-specific format. If
12544 the D_PAGED bit is set on the file, BFD will align segments on
12545 page boundaries, so that an OS can directly map the file. With
12546 BPABI objects, that just results in wasted space. In addition,
12547 because we clear the D_PAGED bit, map_sections_to_segments will
12548 recognize that the program headers should not be mapped into any
12549 loadable segment. */
12550 abfd->flags &= ~D_PAGED;
12551 elf32_arm_begin_write_processing (abfd, link_info);
12555 elf32_arm_symbian_modify_segment_map (bfd *abfd,
12556 struct bfd_link_info *info)
12558 struct elf_segment_map *m;
12561 /* BPABI shared libraries and executables should have a PT_DYNAMIC
12562 segment. However, because the .dynamic section is not marked
12563 with SEC_LOAD, the generic ELF code will not create such a
12565 dynsec = bfd_get_section_by_name (abfd, ".dynamic");
12568 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
12569 if (m->p_type == PT_DYNAMIC)
12574 m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
12575 m->next = elf_tdata (abfd)->segment_map;
12576 elf_tdata (abfd)->segment_map = m;
12580 /* Also call the generic arm routine. */
12581 return elf32_arm_modify_segment_map (abfd, info);
12584 /* Return address for Ith PLT stub in section PLT, for relocation REL
12585 or (bfd_vma) -1 if it should not be included. */
12588 elf32_arm_symbian_plt_sym_val (bfd_vma i, const asection *plt,
12589 const arelent *rel ATTRIBUTE_UNUSED)
12591 return plt->vma + 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry) * i;
12596 #define elf32_bed elf32_arm_symbian_bed
12598 /* The dynamic sections are not allocated on SymbianOS; the postlinker
12599 will process them and then discard them. */
12600 #undef ELF_DYNAMIC_SEC_FLAGS
12601 #define ELF_DYNAMIC_SEC_FLAGS \
12602 (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
12604 #undef elf_backend_add_symbol_hook
12605 #undef elf_backend_emit_relocs
12607 #undef bfd_elf32_bfd_link_hash_table_create
12608 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_symbian_link_hash_table_create
12609 #undef elf_backend_special_sections
12610 #define elf_backend_special_sections elf32_arm_symbian_special_sections
12611 #undef elf_backend_begin_write_processing
12612 #define elf_backend_begin_write_processing elf32_arm_symbian_begin_write_processing
12613 #undef elf_backend_final_write_processing
12614 #define elf_backend_final_write_processing elf32_arm_final_write_processing
12616 #undef elf_backend_modify_segment_map
12617 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
12619 /* There is no .got section for BPABI objects, and hence no header. */
12620 #undef elf_backend_got_header_size
12621 #define elf_backend_got_header_size 0
12623 /* Similarly, there is no .got.plt section. */
12624 #undef elf_backend_want_got_plt
12625 #define elf_backend_want_got_plt 0
12627 #undef elf_backend_plt_sym_val
12628 #define elf_backend_plt_sym_val elf32_arm_symbian_plt_sym_val
12630 #undef elf_backend_may_use_rel_p
12631 #define elf_backend_may_use_rel_p 1
12632 #undef elf_backend_may_use_rela_p
12633 #define elf_backend_may_use_rela_p 0
12634 #undef elf_backend_default_use_rela_p
12635 #define elf_backend_default_use_rela_p 0
12636 #undef elf_backend_want_plt_sym
12637 #define elf_backend_want_plt_sym 0
12638 #undef ELF_MAXPAGESIZE
12639 #define ELF_MAXPAGESIZE 0x8000
12641 #include "elf32-target.h"