1 /* 32-bit ELF support for ARM
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3 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 2 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, MA 02110-1301, USA. */
23 #include "libiberty.h"
26 #include "elf-vxworks.h"
30 #define NUM_ELEM(a) (sizeof (a) / (sizeof (a)[0]))
33 /* Return the relocation section associated with NAME. HTAB is the
34 bfd's elf32_arm_link_hash_entry. */
35 #define RELOC_SECTION(HTAB, NAME) \
36 ((HTAB)->use_rel ? ".rel" NAME : ".rela" NAME)
38 /* Return size of a relocation entry. HTAB is the bfd's
39 elf32_arm_link_hash_entry. */
40 #define RELOC_SIZE(HTAB) \
42 ? sizeof (Elf32_External_Rel) \
43 : sizeof (Elf32_External_Rela))
45 /* Return function to swap relocations in. HTAB is the bfd's
46 elf32_arm_link_hash_entry. */
47 #define SWAP_RELOC_IN(HTAB) \
49 ? bfd_elf32_swap_reloc_in \
50 : bfd_elf32_swap_reloca_in)
52 /* Return function to swap relocations out. HTAB is the bfd's
53 elf32_arm_link_hash_entry. */
54 #define SWAP_RELOC_OUT(HTAB) \
56 ? bfd_elf32_swap_reloc_out \
57 : bfd_elf32_swap_reloca_out)
59 #define elf_info_to_howto 0
60 #define elf_info_to_howto_rel elf32_arm_info_to_howto
62 #define ARM_ELF_ABI_VERSION 0
63 #define ARM_ELF_OS_ABI_VERSION ELFOSABI_ARM
65 static struct elf_backend_data elf32_arm_vxworks_bed;
67 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
68 R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
71 static reloc_howto_type elf32_arm_howto_table_1[] =
74 HOWTO (R_ARM_NONE, /* type */
76 0, /* size (0 = byte, 1 = short, 2 = long) */
78 FALSE, /* pc_relative */
80 complain_overflow_dont,/* complain_on_overflow */
81 bfd_elf_generic_reloc, /* special_function */
82 "R_ARM_NONE", /* name */
83 FALSE, /* partial_inplace */
86 FALSE), /* pcrel_offset */
88 HOWTO (R_ARM_PC24, /* type */
90 2, /* size (0 = byte, 1 = short, 2 = long) */
92 TRUE, /* pc_relative */
94 complain_overflow_signed,/* complain_on_overflow */
95 bfd_elf_generic_reloc, /* special_function */
96 "R_ARM_PC24", /* name */
97 FALSE, /* partial_inplace */
98 0x00ffffff, /* src_mask */
99 0x00ffffff, /* dst_mask */
100 TRUE), /* pcrel_offset */
102 /* 32 bit absolute */
103 HOWTO (R_ARM_ABS32, /* type */
105 2, /* size (0 = byte, 1 = short, 2 = long) */
107 FALSE, /* pc_relative */
109 complain_overflow_bitfield,/* complain_on_overflow */
110 bfd_elf_generic_reloc, /* special_function */
111 "R_ARM_ABS32", /* name */
112 FALSE, /* partial_inplace */
113 0xffffffff, /* src_mask */
114 0xffffffff, /* dst_mask */
115 FALSE), /* pcrel_offset */
117 /* standard 32bit pc-relative reloc */
118 HOWTO (R_ARM_REL32, /* type */
120 2, /* size (0 = byte, 1 = short, 2 = long) */
122 TRUE, /* pc_relative */
124 complain_overflow_bitfield,/* complain_on_overflow */
125 bfd_elf_generic_reloc, /* special_function */
126 "R_ARM_REL32", /* name */
127 FALSE, /* partial_inplace */
128 0xffffffff, /* src_mask */
129 0xffffffff, /* dst_mask */
130 TRUE), /* pcrel_offset */
132 /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
133 HOWTO (R_ARM_LDR_PC_G0, /* type */
135 0, /* size (0 = byte, 1 = short, 2 = long) */
137 TRUE, /* pc_relative */
139 complain_overflow_dont,/* complain_on_overflow */
140 bfd_elf_generic_reloc, /* special_function */
141 "R_ARM_LDR_PC_G0", /* name */
142 FALSE, /* partial_inplace */
143 0xffffffff, /* src_mask */
144 0xffffffff, /* dst_mask */
145 TRUE), /* pcrel_offset */
147 /* 16 bit absolute */
148 HOWTO (R_ARM_ABS16, /* type */
150 1, /* size (0 = byte, 1 = short, 2 = long) */
152 FALSE, /* pc_relative */
154 complain_overflow_bitfield,/* complain_on_overflow */
155 bfd_elf_generic_reloc, /* special_function */
156 "R_ARM_ABS16", /* name */
157 FALSE, /* partial_inplace */
158 0x0000ffff, /* src_mask */
159 0x0000ffff, /* dst_mask */
160 FALSE), /* pcrel_offset */
162 /* 12 bit absolute */
163 HOWTO (R_ARM_ABS12, /* type */
165 2, /* size (0 = byte, 1 = short, 2 = long) */
167 FALSE, /* pc_relative */
169 complain_overflow_bitfield,/* complain_on_overflow */
170 bfd_elf_generic_reloc, /* special_function */
171 "R_ARM_ABS12", /* name */
172 FALSE, /* partial_inplace */
173 0x00000fff, /* src_mask */
174 0x00000fff, /* dst_mask */
175 FALSE), /* pcrel_offset */
177 HOWTO (R_ARM_THM_ABS5, /* type */
179 1, /* size (0 = byte, 1 = short, 2 = long) */
181 FALSE, /* pc_relative */
183 complain_overflow_bitfield,/* complain_on_overflow */
184 bfd_elf_generic_reloc, /* special_function */
185 "R_ARM_THM_ABS5", /* name */
186 FALSE, /* partial_inplace */
187 0x000007e0, /* src_mask */
188 0x000007e0, /* dst_mask */
189 FALSE), /* pcrel_offset */
192 HOWTO (R_ARM_ABS8, /* type */
194 0, /* size (0 = byte, 1 = short, 2 = long) */
196 FALSE, /* pc_relative */
198 complain_overflow_bitfield,/* complain_on_overflow */
199 bfd_elf_generic_reloc, /* special_function */
200 "R_ARM_ABS8", /* name */
201 FALSE, /* partial_inplace */
202 0x000000ff, /* src_mask */
203 0x000000ff, /* dst_mask */
204 FALSE), /* pcrel_offset */
206 HOWTO (R_ARM_SBREL32, /* type */
208 2, /* size (0 = byte, 1 = short, 2 = long) */
210 FALSE, /* pc_relative */
212 complain_overflow_dont,/* complain_on_overflow */
213 bfd_elf_generic_reloc, /* special_function */
214 "R_ARM_SBREL32", /* name */
215 FALSE, /* partial_inplace */
216 0xffffffff, /* src_mask */
217 0xffffffff, /* dst_mask */
218 FALSE), /* pcrel_offset */
220 HOWTO (R_ARM_THM_CALL, /* type */
222 2, /* size (0 = byte, 1 = short, 2 = long) */
224 TRUE, /* pc_relative */
226 complain_overflow_signed,/* complain_on_overflow */
227 bfd_elf_generic_reloc, /* special_function */
228 "R_ARM_THM_CALL", /* name */
229 FALSE, /* partial_inplace */
230 0x07ff07ff, /* src_mask */
231 0x07ff07ff, /* dst_mask */
232 TRUE), /* pcrel_offset */
234 HOWTO (R_ARM_THM_PC8, /* type */
236 1, /* size (0 = byte, 1 = short, 2 = long) */
238 TRUE, /* pc_relative */
240 complain_overflow_signed,/* complain_on_overflow */
241 bfd_elf_generic_reloc, /* special_function */
242 "R_ARM_THM_PC8", /* name */
243 FALSE, /* partial_inplace */
244 0x000000ff, /* src_mask */
245 0x000000ff, /* dst_mask */
246 TRUE), /* pcrel_offset */
248 HOWTO (R_ARM_BREL_ADJ, /* type */
250 1, /* size (0 = byte, 1 = short, 2 = long) */
252 FALSE, /* pc_relative */
254 complain_overflow_signed,/* complain_on_overflow */
255 bfd_elf_generic_reloc, /* special_function */
256 "R_ARM_BREL_ADJ", /* name */
257 FALSE, /* partial_inplace */
258 0xffffffff, /* src_mask */
259 0xffffffff, /* dst_mask */
260 FALSE), /* pcrel_offset */
262 HOWTO (R_ARM_SWI24, /* type */
264 0, /* size (0 = byte, 1 = short, 2 = long) */
266 FALSE, /* pc_relative */
268 complain_overflow_signed,/* complain_on_overflow */
269 bfd_elf_generic_reloc, /* special_function */
270 "R_ARM_SWI24", /* name */
271 FALSE, /* partial_inplace */
272 0x00000000, /* src_mask */
273 0x00000000, /* dst_mask */
274 FALSE), /* pcrel_offset */
276 HOWTO (R_ARM_THM_SWI8, /* type */
278 0, /* size (0 = byte, 1 = short, 2 = long) */
280 FALSE, /* pc_relative */
282 complain_overflow_signed,/* complain_on_overflow */
283 bfd_elf_generic_reloc, /* special_function */
284 "R_ARM_SWI8", /* name */
285 FALSE, /* partial_inplace */
286 0x00000000, /* src_mask */
287 0x00000000, /* dst_mask */
288 FALSE), /* pcrel_offset */
290 /* BLX instruction for the ARM. */
291 HOWTO (R_ARM_XPC25, /* type */
293 2, /* size (0 = byte, 1 = short, 2 = long) */
295 TRUE, /* pc_relative */
297 complain_overflow_signed,/* complain_on_overflow */
298 bfd_elf_generic_reloc, /* special_function */
299 "R_ARM_XPC25", /* name */
300 FALSE, /* partial_inplace */
301 0x00ffffff, /* src_mask */
302 0x00ffffff, /* dst_mask */
303 TRUE), /* pcrel_offset */
305 /* BLX instruction for the Thumb. */
306 HOWTO (R_ARM_THM_XPC22, /* type */
308 2, /* size (0 = byte, 1 = short, 2 = long) */
310 TRUE, /* pc_relative */
312 complain_overflow_signed,/* complain_on_overflow */
313 bfd_elf_generic_reloc, /* special_function */
314 "R_ARM_THM_XPC22", /* name */
315 FALSE, /* partial_inplace */
316 0x07ff07ff, /* src_mask */
317 0x07ff07ff, /* dst_mask */
318 TRUE), /* pcrel_offset */
320 /* Dynamic TLS relocations. */
322 HOWTO (R_ARM_TLS_DTPMOD32, /* type */
324 2, /* size (0 = byte, 1 = short, 2 = long) */
326 FALSE, /* pc_relative */
328 complain_overflow_bitfield,/* complain_on_overflow */
329 bfd_elf_generic_reloc, /* special_function */
330 "R_ARM_TLS_DTPMOD32", /* name */
331 TRUE, /* partial_inplace */
332 0xffffffff, /* src_mask */
333 0xffffffff, /* dst_mask */
334 FALSE), /* pcrel_offset */
336 HOWTO (R_ARM_TLS_DTPOFF32, /* type */
338 2, /* size (0 = byte, 1 = short, 2 = long) */
340 FALSE, /* pc_relative */
342 complain_overflow_bitfield,/* complain_on_overflow */
343 bfd_elf_generic_reloc, /* special_function */
344 "R_ARM_TLS_DTPOFF32", /* name */
345 TRUE, /* partial_inplace */
346 0xffffffff, /* src_mask */
347 0xffffffff, /* dst_mask */
348 FALSE), /* pcrel_offset */
350 HOWTO (R_ARM_TLS_TPOFF32, /* type */
352 2, /* size (0 = byte, 1 = short, 2 = long) */
354 FALSE, /* pc_relative */
356 complain_overflow_bitfield,/* complain_on_overflow */
357 bfd_elf_generic_reloc, /* special_function */
358 "R_ARM_TLS_TPOFF32", /* name */
359 TRUE, /* partial_inplace */
360 0xffffffff, /* src_mask */
361 0xffffffff, /* dst_mask */
362 FALSE), /* pcrel_offset */
364 /* Relocs used in ARM Linux */
366 HOWTO (R_ARM_COPY, /* type */
368 2, /* size (0 = byte, 1 = short, 2 = long) */
370 FALSE, /* pc_relative */
372 complain_overflow_bitfield,/* complain_on_overflow */
373 bfd_elf_generic_reloc, /* special_function */
374 "R_ARM_COPY", /* name */
375 TRUE, /* partial_inplace */
376 0xffffffff, /* src_mask */
377 0xffffffff, /* dst_mask */
378 FALSE), /* pcrel_offset */
380 HOWTO (R_ARM_GLOB_DAT, /* type */
382 2, /* size (0 = byte, 1 = short, 2 = long) */
384 FALSE, /* pc_relative */
386 complain_overflow_bitfield,/* complain_on_overflow */
387 bfd_elf_generic_reloc, /* special_function */
388 "R_ARM_GLOB_DAT", /* name */
389 TRUE, /* partial_inplace */
390 0xffffffff, /* src_mask */
391 0xffffffff, /* dst_mask */
392 FALSE), /* pcrel_offset */
394 HOWTO (R_ARM_JUMP_SLOT, /* type */
396 2, /* size (0 = byte, 1 = short, 2 = long) */
398 FALSE, /* pc_relative */
400 complain_overflow_bitfield,/* complain_on_overflow */
401 bfd_elf_generic_reloc, /* special_function */
402 "R_ARM_JUMP_SLOT", /* name */
403 TRUE, /* partial_inplace */
404 0xffffffff, /* src_mask */
405 0xffffffff, /* dst_mask */
406 FALSE), /* pcrel_offset */
408 HOWTO (R_ARM_RELATIVE, /* type */
410 2, /* size (0 = byte, 1 = short, 2 = long) */
412 FALSE, /* pc_relative */
414 complain_overflow_bitfield,/* complain_on_overflow */
415 bfd_elf_generic_reloc, /* special_function */
416 "R_ARM_RELATIVE", /* name */
417 TRUE, /* partial_inplace */
418 0xffffffff, /* src_mask */
419 0xffffffff, /* dst_mask */
420 FALSE), /* pcrel_offset */
422 HOWTO (R_ARM_GOTOFF32, /* type */
424 2, /* size (0 = byte, 1 = short, 2 = long) */
426 FALSE, /* pc_relative */
428 complain_overflow_bitfield,/* complain_on_overflow */
429 bfd_elf_generic_reloc, /* special_function */
430 "R_ARM_GOTOFF32", /* name */
431 TRUE, /* partial_inplace */
432 0xffffffff, /* src_mask */
433 0xffffffff, /* dst_mask */
434 FALSE), /* pcrel_offset */
436 HOWTO (R_ARM_GOTPC, /* type */
438 2, /* size (0 = byte, 1 = short, 2 = long) */
440 TRUE, /* pc_relative */
442 complain_overflow_bitfield,/* complain_on_overflow */
443 bfd_elf_generic_reloc, /* special_function */
444 "R_ARM_GOTPC", /* name */
445 TRUE, /* partial_inplace */
446 0xffffffff, /* src_mask */
447 0xffffffff, /* dst_mask */
448 TRUE), /* pcrel_offset */
450 HOWTO (R_ARM_GOT32, /* type */
452 2, /* size (0 = byte, 1 = short, 2 = long) */
454 FALSE, /* pc_relative */
456 complain_overflow_bitfield,/* complain_on_overflow */
457 bfd_elf_generic_reloc, /* special_function */
458 "R_ARM_GOT32", /* name */
459 TRUE, /* partial_inplace */
460 0xffffffff, /* src_mask */
461 0xffffffff, /* dst_mask */
462 FALSE), /* pcrel_offset */
464 HOWTO (R_ARM_PLT32, /* type */
466 2, /* size (0 = byte, 1 = short, 2 = long) */
468 TRUE, /* pc_relative */
470 complain_overflow_bitfield,/* complain_on_overflow */
471 bfd_elf_generic_reloc, /* special_function */
472 "R_ARM_PLT32", /* name */
473 FALSE, /* partial_inplace */
474 0x00ffffff, /* src_mask */
475 0x00ffffff, /* dst_mask */
476 TRUE), /* pcrel_offset */
478 HOWTO (R_ARM_CALL, /* type */
480 2, /* size (0 = byte, 1 = short, 2 = long) */
482 TRUE, /* pc_relative */
484 complain_overflow_signed,/* complain_on_overflow */
485 bfd_elf_generic_reloc, /* special_function */
486 "R_ARM_CALL", /* name */
487 FALSE, /* partial_inplace */
488 0x00ffffff, /* src_mask */
489 0x00ffffff, /* dst_mask */
490 TRUE), /* pcrel_offset */
492 HOWTO (R_ARM_JUMP24, /* type */
494 2, /* size (0 = byte, 1 = short, 2 = long) */
496 TRUE, /* pc_relative */
498 complain_overflow_signed,/* complain_on_overflow */
499 bfd_elf_generic_reloc, /* special_function */
500 "R_ARM_JUMP24", /* name */
501 FALSE, /* partial_inplace */
502 0x00ffffff, /* src_mask */
503 0x00ffffff, /* dst_mask */
504 TRUE), /* pcrel_offset */
506 HOWTO (R_ARM_THM_JUMP24, /* type */
508 2, /* size (0 = byte, 1 = short, 2 = long) */
510 TRUE, /* pc_relative */
512 complain_overflow_signed,/* complain_on_overflow */
513 bfd_elf_generic_reloc, /* special_function */
514 "R_ARM_THM_JUMP24", /* name */
515 FALSE, /* partial_inplace */
516 0x07ff2fff, /* src_mask */
517 0x07ff2fff, /* dst_mask */
518 TRUE), /* pcrel_offset */
520 HOWTO (R_ARM_BASE_ABS, /* type */
522 2, /* size (0 = byte, 1 = short, 2 = long) */
524 FALSE, /* pc_relative */
526 complain_overflow_dont,/* complain_on_overflow */
527 bfd_elf_generic_reloc, /* special_function */
528 "R_ARM_BASE_ABS", /* name */
529 FALSE, /* partial_inplace */
530 0xffffffff, /* src_mask */
531 0xffffffff, /* dst_mask */
532 FALSE), /* pcrel_offset */
534 HOWTO (R_ARM_ALU_PCREL7_0, /* type */
536 2, /* size (0 = byte, 1 = short, 2 = long) */
538 TRUE, /* pc_relative */
540 complain_overflow_dont,/* complain_on_overflow */
541 bfd_elf_generic_reloc, /* special_function */
542 "R_ARM_ALU_PCREL_7_0", /* name */
543 FALSE, /* partial_inplace */
544 0x00000fff, /* src_mask */
545 0x00000fff, /* dst_mask */
546 TRUE), /* pcrel_offset */
548 HOWTO (R_ARM_ALU_PCREL15_8, /* type */
550 2, /* size (0 = byte, 1 = short, 2 = long) */
552 TRUE, /* pc_relative */
554 complain_overflow_dont,/* complain_on_overflow */
555 bfd_elf_generic_reloc, /* special_function */
556 "R_ARM_ALU_PCREL_15_8",/* name */
557 FALSE, /* partial_inplace */
558 0x00000fff, /* src_mask */
559 0x00000fff, /* dst_mask */
560 TRUE), /* pcrel_offset */
562 HOWTO (R_ARM_ALU_PCREL23_15, /* type */
564 2, /* size (0 = byte, 1 = short, 2 = long) */
566 TRUE, /* pc_relative */
568 complain_overflow_dont,/* complain_on_overflow */
569 bfd_elf_generic_reloc, /* special_function */
570 "R_ARM_ALU_PCREL_23_15",/* name */
571 FALSE, /* partial_inplace */
572 0x00000fff, /* src_mask */
573 0x00000fff, /* dst_mask */
574 TRUE), /* pcrel_offset */
576 HOWTO (R_ARM_LDR_SBREL_11_0, /* type */
578 2, /* size (0 = byte, 1 = short, 2 = long) */
580 FALSE, /* pc_relative */
582 complain_overflow_dont,/* complain_on_overflow */
583 bfd_elf_generic_reloc, /* special_function */
584 "R_ARM_LDR_SBREL_11_0",/* name */
585 FALSE, /* partial_inplace */
586 0x00000fff, /* src_mask */
587 0x00000fff, /* dst_mask */
588 FALSE), /* pcrel_offset */
590 HOWTO (R_ARM_ALU_SBREL_19_12, /* type */
592 2, /* size (0 = byte, 1 = short, 2 = long) */
594 FALSE, /* pc_relative */
596 complain_overflow_dont,/* complain_on_overflow */
597 bfd_elf_generic_reloc, /* special_function */
598 "R_ARM_ALU_SBREL_19_12",/* name */
599 FALSE, /* partial_inplace */
600 0x000ff000, /* src_mask */
601 0x000ff000, /* dst_mask */
602 FALSE), /* pcrel_offset */
604 HOWTO (R_ARM_ALU_SBREL_27_20, /* type */
606 2, /* size (0 = byte, 1 = short, 2 = long) */
608 FALSE, /* pc_relative */
610 complain_overflow_dont,/* complain_on_overflow */
611 bfd_elf_generic_reloc, /* special_function */
612 "R_ARM_ALU_SBREL_27_20",/* name */
613 FALSE, /* partial_inplace */
614 0x0ff00000, /* src_mask */
615 0x0ff00000, /* dst_mask */
616 FALSE), /* pcrel_offset */
618 HOWTO (R_ARM_TARGET1, /* type */
620 2, /* size (0 = byte, 1 = short, 2 = long) */
622 FALSE, /* pc_relative */
624 complain_overflow_dont,/* complain_on_overflow */
625 bfd_elf_generic_reloc, /* special_function */
626 "R_ARM_TARGET1", /* name */
627 FALSE, /* partial_inplace */
628 0xffffffff, /* src_mask */
629 0xffffffff, /* dst_mask */
630 FALSE), /* pcrel_offset */
632 HOWTO (R_ARM_ROSEGREL32, /* type */
634 2, /* size (0 = byte, 1 = short, 2 = long) */
636 FALSE, /* pc_relative */
638 complain_overflow_dont,/* complain_on_overflow */
639 bfd_elf_generic_reloc, /* special_function */
640 "R_ARM_ROSEGREL32", /* name */
641 FALSE, /* partial_inplace */
642 0xffffffff, /* src_mask */
643 0xffffffff, /* dst_mask */
644 FALSE), /* pcrel_offset */
646 HOWTO (R_ARM_V4BX, /* type */
648 2, /* size (0 = byte, 1 = short, 2 = long) */
650 FALSE, /* pc_relative */
652 complain_overflow_dont,/* complain_on_overflow */
653 bfd_elf_generic_reloc, /* special_function */
654 "R_ARM_V4BX", /* name */
655 FALSE, /* partial_inplace */
656 0xffffffff, /* src_mask */
657 0xffffffff, /* dst_mask */
658 FALSE), /* pcrel_offset */
660 HOWTO (R_ARM_TARGET2, /* type */
662 2, /* size (0 = byte, 1 = short, 2 = long) */
664 FALSE, /* pc_relative */
666 complain_overflow_signed,/* complain_on_overflow */
667 bfd_elf_generic_reloc, /* special_function */
668 "R_ARM_TARGET2", /* name */
669 FALSE, /* partial_inplace */
670 0xffffffff, /* src_mask */
671 0xffffffff, /* dst_mask */
672 TRUE), /* pcrel_offset */
674 HOWTO (R_ARM_PREL31, /* type */
676 2, /* size (0 = byte, 1 = short, 2 = long) */
678 TRUE, /* pc_relative */
680 complain_overflow_signed,/* complain_on_overflow */
681 bfd_elf_generic_reloc, /* special_function */
682 "R_ARM_PREL31", /* name */
683 FALSE, /* partial_inplace */
684 0x7fffffff, /* src_mask */
685 0x7fffffff, /* dst_mask */
686 TRUE), /* pcrel_offset */
688 HOWTO (R_ARM_MOVW_ABS_NC, /* type */
690 2, /* size (0 = byte, 1 = short, 2 = long) */
692 FALSE, /* pc_relative */
694 complain_overflow_dont,/* complain_on_overflow */
695 bfd_elf_generic_reloc, /* special_function */
696 "R_ARM_MOVW_ABS_NC", /* name */
697 FALSE, /* partial_inplace */
698 0x0000ffff, /* src_mask */
699 0x0000ffff, /* dst_mask */
700 FALSE), /* pcrel_offset */
702 HOWTO (R_ARM_MOVT_ABS, /* type */
704 2, /* size (0 = byte, 1 = short, 2 = long) */
706 FALSE, /* pc_relative */
708 complain_overflow_bitfield,/* complain_on_overflow */
709 bfd_elf_generic_reloc, /* special_function */
710 "R_ARM_MOVT_ABS", /* name */
711 FALSE, /* partial_inplace */
712 0x0000ffff, /* src_mask */
713 0x0000ffff, /* dst_mask */
714 FALSE), /* pcrel_offset */
716 HOWTO (R_ARM_MOVW_PREL_NC, /* type */
718 2, /* size (0 = byte, 1 = short, 2 = long) */
720 TRUE, /* pc_relative */
722 complain_overflow_dont,/* complain_on_overflow */
723 bfd_elf_generic_reloc, /* special_function */
724 "R_ARM_MOVW_PREL_NC", /* name */
725 FALSE, /* partial_inplace */
726 0x0000ffff, /* src_mask */
727 0x0000ffff, /* dst_mask */
728 TRUE), /* pcrel_offset */
730 HOWTO (R_ARM_MOVT_PREL, /* type */
732 2, /* size (0 = byte, 1 = short, 2 = long) */
734 TRUE, /* pc_relative */
736 complain_overflow_bitfield,/* complain_on_overflow */
737 bfd_elf_generic_reloc, /* special_function */
738 "R_ARM_MOVT_PREL", /* name */
739 FALSE, /* partial_inplace */
740 0x0000ffff, /* src_mask */
741 0x0000ffff, /* dst_mask */
742 TRUE), /* pcrel_offset */
744 HOWTO (R_ARM_THM_MOVW_ABS_NC, /* type */
746 2, /* size (0 = byte, 1 = short, 2 = long) */
748 FALSE, /* pc_relative */
750 complain_overflow_dont,/* complain_on_overflow */
751 bfd_elf_generic_reloc, /* special_function */
752 "R_ARM_THM_MOVW_ABS_NC",/* name */
753 FALSE, /* partial_inplace */
754 0x040f70ff, /* src_mask */
755 0x040f70ff, /* dst_mask */
756 FALSE), /* pcrel_offset */
758 HOWTO (R_ARM_THM_MOVT_ABS, /* type */
760 2, /* size (0 = byte, 1 = short, 2 = long) */
762 FALSE, /* pc_relative */
764 complain_overflow_bitfield,/* complain_on_overflow */
765 bfd_elf_generic_reloc, /* special_function */
766 "R_ARM_THM_MOVT_ABS", /* name */
767 FALSE, /* partial_inplace */
768 0x040f70ff, /* src_mask */
769 0x040f70ff, /* dst_mask */
770 FALSE), /* pcrel_offset */
772 HOWTO (R_ARM_THM_MOVW_PREL_NC,/* type */
774 2, /* size (0 = byte, 1 = short, 2 = long) */
776 TRUE, /* pc_relative */
778 complain_overflow_dont,/* complain_on_overflow */
779 bfd_elf_generic_reloc, /* special_function */
780 "R_ARM_THM_MOVW_PREL_NC",/* name */
781 FALSE, /* partial_inplace */
782 0x040f70ff, /* src_mask */
783 0x040f70ff, /* dst_mask */
784 TRUE), /* pcrel_offset */
786 HOWTO (R_ARM_THM_MOVT_PREL, /* type */
788 2, /* size (0 = byte, 1 = short, 2 = long) */
790 TRUE, /* pc_relative */
792 complain_overflow_bitfield,/* complain_on_overflow */
793 bfd_elf_generic_reloc, /* special_function */
794 "R_ARM_THM_MOVT_PREL", /* name */
795 FALSE, /* partial_inplace */
796 0x040f70ff, /* src_mask */
797 0x040f70ff, /* dst_mask */
798 TRUE), /* pcrel_offset */
800 HOWTO (R_ARM_THM_JUMP19, /* type */
802 2, /* size (0 = byte, 1 = short, 2 = long) */
804 TRUE, /* pc_relative */
806 complain_overflow_signed,/* complain_on_overflow */
807 bfd_elf_generic_reloc, /* special_function */
808 "R_ARM_THM_JUMP19", /* name */
809 FALSE, /* partial_inplace */
810 0x043f2fff, /* src_mask */
811 0x043f2fff, /* dst_mask */
812 TRUE), /* pcrel_offset */
814 HOWTO (R_ARM_THM_JUMP6, /* type */
816 1, /* size (0 = byte, 1 = short, 2 = long) */
818 TRUE, /* pc_relative */
820 complain_overflow_unsigned,/* complain_on_overflow */
821 bfd_elf_generic_reloc, /* special_function */
822 "R_ARM_THM_JUMP6", /* name */
823 FALSE, /* partial_inplace */
824 0x02f8, /* src_mask */
825 0x02f8, /* dst_mask */
826 TRUE), /* pcrel_offset */
828 /* These are declared as 13-bit signed relocations because we can
829 address -4095 .. 4095(base) by altering ADDW to SUBW or vice
831 HOWTO (R_ARM_THM_ALU_PREL_11_0,/* type */
833 2, /* size (0 = byte, 1 = short, 2 = long) */
835 TRUE, /* pc_relative */
837 complain_overflow_dont,/* complain_on_overflow */
838 bfd_elf_generic_reloc, /* special_function */
839 "R_ARM_THM_ALU_PREL_11_0",/* name */
840 FALSE, /* partial_inplace */
841 0xffffffff, /* src_mask */
842 0xffffffff, /* dst_mask */
843 TRUE), /* pcrel_offset */
845 HOWTO (R_ARM_THM_PC12, /* type */
847 2, /* size (0 = byte, 1 = short, 2 = long) */
849 TRUE, /* pc_relative */
851 complain_overflow_dont,/* complain_on_overflow */
852 bfd_elf_generic_reloc, /* special_function */
853 "R_ARM_THM_PC12", /* name */
854 FALSE, /* partial_inplace */
855 0xffffffff, /* src_mask */
856 0xffffffff, /* dst_mask */
857 TRUE), /* pcrel_offset */
859 HOWTO (R_ARM_ABS32_NOI, /* type */
861 2, /* size (0 = byte, 1 = short, 2 = long) */
863 FALSE, /* pc_relative */
865 complain_overflow_dont,/* complain_on_overflow */
866 bfd_elf_generic_reloc, /* special_function */
867 "R_ARM_ABS32_NOI", /* name */
868 FALSE, /* partial_inplace */
869 0xffffffff, /* src_mask */
870 0xffffffff, /* dst_mask */
871 FALSE), /* pcrel_offset */
873 HOWTO (R_ARM_REL32_NOI, /* type */
875 2, /* size (0 = byte, 1 = short, 2 = long) */
877 TRUE, /* pc_relative */
879 complain_overflow_dont,/* complain_on_overflow */
880 bfd_elf_generic_reloc, /* special_function */
881 "R_ARM_REL32_NOI", /* name */
882 FALSE, /* partial_inplace */
883 0xffffffff, /* src_mask */
884 0xffffffff, /* dst_mask */
885 FALSE), /* pcrel_offset */
887 /* Group relocations. */
889 HOWTO (R_ARM_ALU_PC_G0_NC, /* type */
891 2, /* size (0 = byte, 1 = short, 2 = long) */
893 TRUE, /* pc_relative */
895 complain_overflow_dont,/* complain_on_overflow */
896 bfd_elf_generic_reloc, /* special_function */
897 "R_ARM_ALU_PC_G0_NC", /* name */
898 FALSE, /* partial_inplace */
899 0xffffffff, /* src_mask */
900 0xffffffff, /* dst_mask */
901 TRUE), /* pcrel_offset */
903 HOWTO (R_ARM_ALU_PC_G0, /* type */
905 2, /* size (0 = byte, 1 = short, 2 = long) */
907 TRUE, /* pc_relative */
909 complain_overflow_dont,/* complain_on_overflow */
910 bfd_elf_generic_reloc, /* special_function */
911 "R_ARM_ALU_PC_G0", /* name */
912 FALSE, /* partial_inplace */
913 0xffffffff, /* src_mask */
914 0xffffffff, /* dst_mask */
915 TRUE), /* pcrel_offset */
917 HOWTO (R_ARM_ALU_PC_G1_NC, /* type */
919 2, /* size (0 = byte, 1 = short, 2 = long) */
921 TRUE, /* pc_relative */
923 complain_overflow_dont,/* complain_on_overflow */
924 bfd_elf_generic_reloc, /* special_function */
925 "R_ARM_ALU_PC_G1_NC", /* name */
926 FALSE, /* partial_inplace */
927 0xffffffff, /* src_mask */
928 0xffffffff, /* dst_mask */
929 TRUE), /* pcrel_offset */
931 HOWTO (R_ARM_ALU_PC_G1, /* type */
933 2, /* size (0 = byte, 1 = short, 2 = long) */
935 TRUE, /* pc_relative */
937 complain_overflow_dont,/* complain_on_overflow */
938 bfd_elf_generic_reloc, /* special_function */
939 "R_ARM_ALU_PC_G1", /* name */
940 FALSE, /* partial_inplace */
941 0xffffffff, /* src_mask */
942 0xffffffff, /* dst_mask */
943 TRUE), /* pcrel_offset */
945 HOWTO (R_ARM_ALU_PC_G2, /* type */
947 2, /* size (0 = byte, 1 = short, 2 = long) */
949 TRUE, /* pc_relative */
951 complain_overflow_dont,/* complain_on_overflow */
952 bfd_elf_generic_reloc, /* special_function */
953 "R_ARM_ALU_PC_G2", /* name */
954 FALSE, /* partial_inplace */
955 0xffffffff, /* src_mask */
956 0xffffffff, /* dst_mask */
957 TRUE), /* pcrel_offset */
959 HOWTO (R_ARM_LDR_PC_G1, /* type */
961 2, /* size (0 = byte, 1 = short, 2 = long) */
963 TRUE, /* pc_relative */
965 complain_overflow_dont,/* complain_on_overflow */
966 bfd_elf_generic_reloc, /* special_function */
967 "R_ARM_LDR_PC_G1", /* name */
968 FALSE, /* partial_inplace */
969 0xffffffff, /* src_mask */
970 0xffffffff, /* dst_mask */
971 TRUE), /* pcrel_offset */
973 HOWTO (R_ARM_LDR_PC_G2, /* type */
975 2, /* size (0 = byte, 1 = short, 2 = long) */
977 TRUE, /* pc_relative */
979 complain_overflow_dont,/* complain_on_overflow */
980 bfd_elf_generic_reloc, /* special_function */
981 "R_ARM_LDR_PC_G2", /* name */
982 FALSE, /* partial_inplace */
983 0xffffffff, /* src_mask */
984 0xffffffff, /* dst_mask */
985 TRUE), /* pcrel_offset */
987 HOWTO (R_ARM_LDRS_PC_G0, /* type */
989 2, /* size (0 = byte, 1 = short, 2 = long) */
991 TRUE, /* pc_relative */
993 complain_overflow_dont,/* complain_on_overflow */
994 bfd_elf_generic_reloc, /* special_function */
995 "R_ARM_LDRS_PC_G0", /* name */
996 FALSE, /* partial_inplace */
997 0xffffffff, /* src_mask */
998 0xffffffff, /* dst_mask */
999 TRUE), /* pcrel_offset */
1001 HOWTO (R_ARM_LDRS_PC_G1, /* type */
1003 2, /* size (0 = byte, 1 = short, 2 = long) */
1005 TRUE, /* pc_relative */
1007 complain_overflow_dont,/* complain_on_overflow */
1008 bfd_elf_generic_reloc, /* special_function */
1009 "R_ARM_LDRS_PC_G1", /* name */
1010 FALSE, /* partial_inplace */
1011 0xffffffff, /* src_mask */
1012 0xffffffff, /* dst_mask */
1013 TRUE), /* pcrel_offset */
1015 HOWTO (R_ARM_LDRS_PC_G2, /* type */
1017 2, /* size (0 = byte, 1 = short, 2 = long) */
1019 TRUE, /* pc_relative */
1021 complain_overflow_dont,/* complain_on_overflow */
1022 bfd_elf_generic_reloc, /* special_function */
1023 "R_ARM_LDRS_PC_G2", /* name */
1024 FALSE, /* partial_inplace */
1025 0xffffffff, /* src_mask */
1026 0xffffffff, /* dst_mask */
1027 TRUE), /* pcrel_offset */
1029 HOWTO (R_ARM_LDC_PC_G0, /* type */
1031 2, /* size (0 = byte, 1 = short, 2 = long) */
1033 TRUE, /* pc_relative */
1035 complain_overflow_dont,/* complain_on_overflow */
1036 bfd_elf_generic_reloc, /* special_function */
1037 "R_ARM_LDC_PC_G0", /* name */
1038 FALSE, /* partial_inplace */
1039 0xffffffff, /* src_mask */
1040 0xffffffff, /* dst_mask */
1041 TRUE), /* pcrel_offset */
1043 HOWTO (R_ARM_LDC_PC_G1, /* type */
1045 2, /* size (0 = byte, 1 = short, 2 = long) */
1047 TRUE, /* pc_relative */
1049 complain_overflow_dont,/* complain_on_overflow */
1050 bfd_elf_generic_reloc, /* special_function */
1051 "R_ARM_LDC_PC_G1", /* name */
1052 FALSE, /* partial_inplace */
1053 0xffffffff, /* src_mask */
1054 0xffffffff, /* dst_mask */
1055 TRUE), /* pcrel_offset */
1057 HOWTO (R_ARM_LDC_PC_G2, /* type */
1059 2, /* size (0 = byte, 1 = short, 2 = long) */
1061 TRUE, /* pc_relative */
1063 complain_overflow_dont,/* complain_on_overflow */
1064 bfd_elf_generic_reloc, /* special_function */
1065 "R_ARM_LDC_PC_G2", /* name */
1066 FALSE, /* partial_inplace */
1067 0xffffffff, /* src_mask */
1068 0xffffffff, /* dst_mask */
1069 TRUE), /* pcrel_offset */
1071 HOWTO (R_ARM_ALU_SB_G0_NC, /* type */
1073 2, /* size (0 = byte, 1 = short, 2 = long) */
1075 TRUE, /* pc_relative */
1077 complain_overflow_dont,/* complain_on_overflow */
1078 bfd_elf_generic_reloc, /* special_function */
1079 "R_ARM_ALU_SB_G0_NC", /* name */
1080 FALSE, /* partial_inplace */
1081 0xffffffff, /* src_mask */
1082 0xffffffff, /* dst_mask */
1083 TRUE), /* pcrel_offset */
1085 HOWTO (R_ARM_ALU_SB_G0, /* type */
1087 2, /* size (0 = byte, 1 = short, 2 = long) */
1089 TRUE, /* pc_relative */
1091 complain_overflow_dont,/* complain_on_overflow */
1092 bfd_elf_generic_reloc, /* special_function */
1093 "R_ARM_ALU_SB_G0", /* name */
1094 FALSE, /* partial_inplace */
1095 0xffffffff, /* src_mask */
1096 0xffffffff, /* dst_mask */
1097 TRUE), /* pcrel_offset */
1099 HOWTO (R_ARM_ALU_SB_G1_NC, /* type */
1101 2, /* size (0 = byte, 1 = short, 2 = long) */
1103 TRUE, /* pc_relative */
1105 complain_overflow_dont,/* complain_on_overflow */
1106 bfd_elf_generic_reloc, /* special_function */
1107 "R_ARM_ALU_SB_G1_NC", /* name */
1108 FALSE, /* partial_inplace */
1109 0xffffffff, /* src_mask */
1110 0xffffffff, /* dst_mask */
1111 TRUE), /* pcrel_offset */
1113 HOWTO (R_ARM_ALU_SB_G1, /* type */
1115 2, /* size (0 = byte, 1 = short, 2 = long) */
1117 TRUE, /* pc_relative */
1119 complain_overflow_dont,/* complain_on_overflow */
1120 bfd_elf_generic_reloc, /* special_function */
1121 "R_ARM_ALU_SB_G1", /* name */
1122 FALSE, /* partial_inplace */
1123 0xffffffff, /* src_mask */
1124 0xffffffff, /* dst_mask */
1125 TRUE), /* pcrel_offset */
1127 HOWTO (R_ARM_ALU_SB_G2, /* type */
1129 2, /* size (0 = byte, 1 = short, 2 = long) */
1131 TRUE, /* pc_relative */
1133 complain_overflow_dont,/* complain_on_overflow */
1134 bfd_elf_generic_reloc, /* special_function */
1135 "R_ARM_ALU_SB_G2", /* name */
1136 FALSE, /* partial_inplace */
1137 0xffffffff, /* src_mask */
1138 0xffffffff, /* dst_mask */
1139 TRUE), /* pcrel_offset */
1141 HOWTO (R_ARM_LDR_SB_G0, /* type */
1143 2, /* size (0 = byte, 1 = short, 2 = long) */
1145 TRUE, /* pc_relative */
1147 complain_overflow_dont,/* complain_on_overflow */
1148 bfd_elf_generic_reloc, /* special_function */
1149 "R_ARM_LDR_SB_G0", /* name */
1150 FALSE, /* partial_inplace */
1151 0xffffffff, /* src_mask */
1152 0xffffffff, /* dst_mask */
1153 TRUE), /* pcrel_offset */
1155 HOWTO (R_ARM_LDR_SB_G1, /* type */
1157 2, /* size (0 = byte, 1 = short, 2 = long) */
1159 TRUE, /* pc_relative */
1161 complain_overflow_dont,/* complain_on_overflow */
1162 bfd_elf_generic_reloc, /* special_function */
1163 "R_ARM_LDR_SB_G1", /* name */
1164 FALSE, /* partial_inplace */
1165 0xffffffff, /* src_mask */
1166 0xffffffff, /* dst_mask */
1167 TRUE), /* pcrel_offset */
1169 HOWTO (R_ARM_LDR_SB_G2, /* type */
1171 2, /* size (0 = byte, 1 = short, 2 = long) */
1173 TRUE, /* pc_relative */
1175 complain_overflow_dont,/* complain_on_overflow */
1176 bfd_elf_generic_reloc, /* special_function */
1177 "R_ARM_LDR_SB_G2", /* name */
1178 FALSE, /* partial_inplace */
1179 0xffffffff, /* src_mask */
1180 0xffffffff, /* dst_mask */
1181 TRUE), /* pcrel_offset */
1183 HOWTO (R_ARM_LDRS_SB_G0, /* type */
1185 2, /* size (0 = byte, 1 = short, 2 = long) */
1187 TRUE, /* pc_relative */
1189 complain_overflow_dont,/* complain_on_overflow */
1190 bfd_elf_generic_reloc, /* special_function */
1191 "R_ARM_LDRS_SB_G0", /* name */
1192 FALSE, /* partial_inplace */
1193 0xffffffff, /* src_mask */
1194 0xffffffff, /* dst_mask */
1195 TRUE), /* pcrel_offset */
1197 HOWTO (R_ARM_LDRS_SB_G1, /* type */
1199 2, /* size (0 = byte, 1 = short, 2 = long) */
1201 TRUE, /* pc_relative */
1203 complain_overflow_dont,/* complain_on_overflow */
1204 bfd_elf_generic_reloc, /* special_function */
1205 "R_ARM_LDRS_SB_G1", /* name */
1206 FALSE, /* partial_inplace */
1207 0xffffffff, /* src_mask */
1208 0xffffffff, /* dst_mask */
1209 TRUE), /* pcrel_offset */
1211 HOWTO (R_ARM_LDRS_SB_G2, /* type */
1213 2, /* size (0 = byte, 1 = short, 2 = long) */
1215 TRUE, /* pc_relative */
1217 complain_overflow_dont,/* complain_on_overflow */
1218 bfd_elf_generic_reloc, /* special_function */
1219 "R_ARM_LDRS_SB_G2", /* name */
1220 FALSE, /* partial_inplace */
1221 0xffffffff, /* src_mask */
1222 0xffffffff, /* dst_mask */
1223 TRUE), /* pcrel_offset */
1225 HOWTO (R_ARM_LDC_SB_G0, /* type */
1227 2, /* size (0 = byte, 1 = short, 2 = long) */
1229 TRUE, /* pc_relative */
1231 complain_overflow_dont,/* complain_on_overflow */
1232 bfd_elf_generic_reloc, /* special_function */
1233 "R_ARM_LDC_SB_G0", /* name */
1234 FALSE, /* partial_inplace */
1235 0xffffffff, /* src_mask */
1236 0xffffffff, /* dst_mask */
1237 TRUE), /* pcrel_offset */
1239 HOWTO (R_ARM_LDC_SB_G1, /* type */
1241 2, /* size (0 = byte, 1 = short, 2 = long) */
1243 TRUE, /* pc_relative */
1245 complain_overflow_dont,/* complain_on_overflow */
1246 bfd_elf_generic_reloc, /* special_function */
1247 "R_ARM_LDC_SB_G1", /* name */
1248 FALSE, /* partial_inplace */
1249 0xffffffff, /* src_mask */
1250 0xffffffff, /* dst_mask */
1251 TRUE), /* pcrel_offset */
1253 HOWTO (R_ARM_LDC_SB_G2, /* type */
1255 2, /* size (0 = byte, 1 = short, 2 = long) */
1257 TRUE, /* pc_relative */
1259 complain_overflow_dont,/* complain_on_overflow */
1260 bfd_elf_generic_reloc, /* special_function */
1261 "R_ARM_LDC_SB_G2", /* name */
1262 FALSE, /* partial_inplace */
1263 0xffffffff, /* src_mask */
1264 0xffffffff, /* dst_mask */
1265 TRUE), /* pcrel_offset */
1267 /* End of group relocations. */
1269 HOWTO (R_ARM_MOVW_BREL_NC, /* type */
1271 2, /* size (0 = byte, 1 = short, 2 = long) */
1273 FALSE, /* pc_relative */
1275 complain_overflow_dont,/* complain_on_overflow */
1276 bfd_elf_generic_reloc, /* special_function */
1277 "R_ARM_MOVW_BREL_NC", /* name */
1278 FALSE, /* partial_inplace */
1279 0x0000ffff, /* src_mask */
1280 0x0000ffff, /* dst_mask */
1281 FALSE), /* pcrel_offset */
1283 HOWTO (R_ARM_MOVT_BREL, /* type */
1285 2, /* size (0 = byte, 1 = short, 2 = long) */
1287 FALSE, /* pc_relative */
1289 complain_overflow_bitfield,/* complain_on_overflow */
1290 bfd_elf_generic_reloc, /* special_function */
1291 "R_ARM_MOVT_BREL", /* name */
1292 FALSE, /* partial_inplace */
1293 0x0000ffff, /* src_mask */
1294 0x0000ffff, /* dst_mask */
1295 FALSE), /* pcrel_offset */
1297 HOWTO (R_ARM_MOVW_BREL, /* type */
1299 2, /* size (0 = byte, 1 = short, 2 = long) */
1301 FALSE, /* pc_relative */
1303 complain_overflow_dont,/* complain_on_overflow */
1304 bfd_elf_generic_reloc, /* special_function */
1305 "R_ARM_MOVW_BREL", /* name */
1306 FALSE, /* partial_inplace */
1307 0x0000ffff, /* src_mask */
1308 0x0000ffff, /* dst_mask */
1309 FALSE), /* pcrel_offset */
1311 HOWTO (R_ARM_THM_MOVW_BREL_NC,/* type */
1313 2, /* size (0 = byte, 1 = short, 2 = long) */
1315 FALSE, /* pc_relative */
1317 complain_overflow_dont,/* complain_on_overflow */
1318 bfd_elf_generic_reloc, /* special_function */
1319 "R_ARM_THM_MOVW_BREL_NC",/* name */
1320 FALSE, /* partial_inplace */
1321 0x040f70ff, /* src_mask */
1322 0x040f70ff, /* dst_mask */
1323 FALSE), /* pcrel_offset */
1325 HOWTO (R_ARM_THM_MOVT_BREL, /* type */
1327 2, /* size (0 = byte, 1 = short, 2 = long) */
1329 FALSE, /* pc_relative */
1331 complain_overflow_bitfield,/* complain_on_overflow */
1332 bfd_elf_generic_reloc, /* special_function */
1333 "R_ARM_THM_MOVT_BREL", /* name */
1334 FALSE, /* partial_inplace */
1335 0x040f70ff, /* src_mask */
1336 0x040f70ff, /* dst_mask */
1337 FALSE), /* pcrel_offset */
1339 HOWTO (R_ARM_THM_MOVW_BREL, /* type */
1341 2, /* size (0 = byte, 1 = short, 2 = long) */
1343 FALSE, /* pc_relative */
1345 complain_overflow_dont,/* complain_on_overflow */
1346 bfd_elf_generic_reloc, /* special_function */
1347 "R_ARM_THM_MOVW_BREL", /* name */
1348 FALSE, /* partial_inplace */
1349 0x040f70ff, /* src_mask */
1350 0x040f70ff, /* dst_mask */
1351 FALSE), /* pcrel_offset */
1353 EMPTY_HOWTO (90), /* unallocated */
1358 HOWTO (R_ARM_PLT32_ABS, /* type */
1360 2, /* size (0 = byte, 1 = short, 2 = long) */
1362 FALSE, /* pc_relative */
1364 complain_overflow_dont,/* complain_on_overflow */
1365 bfd_elf_generic_reloc, /* special_function */
1366 "R_ARM_PLT32_ABS", /* name */
1367 FALSE, /* partial_inplace */
1368 0xffffffff, /* src_mask */
1369 0xffffffff, /* dst_mask */
1370 FALSE), /* pcrel_offset */
1372 HOWTO (R_ARM_GOT_ABS, /* type */
1374 2, /* size (0 = byte, 1 = short, 2 = long) */
1376 FALSE, /* pc_relative */
1378 complain_overflow_dont,/* complain_on_overflow */
1379 bfd_elf_generic_reloc, /* special_function */
1380 "R_ARM_GOT_ABS", /* name */
1381 FALSE, /* partial_inplace */
1382 0xffffffff, /* src_mask */
1383 0xffffffff, /* dst_mask */
1384 FALSE), /* pcrel_offset */
1386 HOWTO (R_ARM_GOT_PREL, /* type */
1388 2, /* size (0 = byte, 1 = short, 2 = long) */
1390 TRUE, /* pc_relative */
1392 complain_overflow_dont, /* complain_on_overflow */
1393 bfd_elf_generic_reloc, /* special_function */
1394 "R_ARM_GOT_PREL", /* name */
1395 FALSE, /* partial_inplace */
1396 0xffffffff, /* src_mask */
1397 0xffffffff, /* dst_mask */
1398 TRUE), /* pcrel_offset */
1400 HOWTO (R_ARM_GOT_BREL12, /* type */
1402 2, /* size (0 = byte, 1 = short, 2 = long) */
1404 FALSE, /* pc_relative */
1406 complain_overflow_bitfield,/* complain_on_overflow */
1407 bfd_elf_generic_reloc, /* special_function */
1408 "R_ARM_GOT_BREL12", /* name */
1409 FALSE, /* partial_inplace */
1410 0x00000fff, /* src_mask */
1411 0x00000fff, /* dst_mask */
1412 FALSE), /* pcrel_offset */
1414 HOWTO (R_ARM_GOTOFF12, /* type */
1416 2, /* size (0 = byte, 1 = short, 2 = long) */
1418 FALSE, /* pc_relative */
1420 complain_overflow_bitfield,/* complain_on_overflow */
1421 bfd_elf_generic_reloc, /* special_function */
1422 "R_ARM_GOTOFF12", /* name */
1423 FALSE, /* partial_inplace */
1424 0x00000fff, /* src_mask */
1425 0x00000fff, /* dst_mask */
1426 FALSE), /* pcrel_offset */
1428 EMPTY_HOWTO (R_ARM_GOTRELAX), /* reserved for future GOT-load optimizations */
1430 /* GNU extension to record C++ vtable member usage */
1431 HOWTO (R_ARM_GNU_VTENTRY, /* type */
1433 2, /* size (0 = byte, 1 = short, 2 = long) */
1435 FALSE, /* pc_relative */
1437 complain_overflow_dont, /* complain_on_overflow */
1438 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1439 "R_ARM_GNU_VTENTRY", /* name */
1440 FALSE, /* partial_inplace */
1443 FALSE), /* pcrel_offset */
1445 /* GNU extension to record C++ vtable hierarchy */
1446 HOWTO (R_ARM_GNU_VTINHERIT, /* type */
1448 2, /* size (0 = byte, 1 = short, 2 = long) */
1450 FALSE, /* pc_relative */
1452 complain_overflow_dont, /* complain_on_overflow */
1453 NULL, /* special_function */
1454 "R_ARM_GNU_VTINHERIT", /* name */
1455 FALSE, /* partial_inplace */
1458 FALSE), /* pcrel_offset */
1460 HOWTO (R_ARM_THM_JUMP11, /* type */
1462 1, /* size (0 = byte, 1 = short, 2 = long) */
1464 TRUE, /* pc_relative */
1466 complain_overflow_signed, /* complain_on_overflow */
1467 bfd_elf_generic_reloc, /* special_function */
1468 "R_ARM_THM_JUMP11", /* name */
1469 FALSE, /* partial_inplace */
1470 0x000007ff, /* src_mask */
1471 0x000007ff, /* dst_mask */
1472 TRUE), /* pcrel_offset */
1474 HOWTO (R_ARM_THM_JUMP8, /* type */
1476 1, /* size (0 = byte, 1 = short, 2 = long) */
1478 TRUE, /* pc_relative */
1480 complain_overflow_signed, /* complain_on_overflow */
1481 bfd_elf_generic_reloc, /* special_function */
1482 "R_ARM_THM_JUMP8", /* name */
1483 FALSE, /* partial_inplace */
1484 0x000000ff, /* src_mask */
1485 0x000000ff, /* dst_mask */
1486 TRUE), /* pcrel_offset */
1488 /* TLS relocations */
1489 HOWTO (R_ARM_TLS_GD32, /* type */
1491 2, /* size (0 = byte, 1 = short, 2 = long) */
1493 FALSE, /* pc_relative */
1495 complain_overflow_bitfield,/* complain_on_overflow */
1496 NULL, /* special_function */
1497 "R_ARM_TLS_GD32", /* name */
1498 TRUE, /* partial_inplace */
1499 0xffffffff, /* src_mask */
1500 0xffffffff, /* dst_mask */
1501 FALSE), /* pcrel_offset */
1503 HOWTO (R_ARM_TLS_LDM32, /* type */
1505 2, /* size (0 = byte, 1 = short, 2 = long) */
1507 FALSE, /* pc_relative */
1509 complain_overflow_bitfield,/* complain_on_overflow */
1510 bfd_elf_generic_reloc, /* special_function */
1511 "R_ARM_TLS_LDM32", /* name */
1512 TRUE, /* partial_inplace */
1513 0xffffffff, /* src_mask */
1514 0xffffffff, /* dst_mask */
1515 FALSE), /* pcrel_offset */
1517 HOWTO (R_ARM_TLS_LDO32, /* type */
1519 2, /* size (0 = byte, 1 = short, 2 = long) */
1521 FALSE, /* pc_relative */
1523 complain_overflow_bitfield,/* complain_on_overflow */
1524 bfd_elf_generic_reloc, /* special_function */
1525 "R_ARM_TLS_LDO32", /* name */
1526 TRUE, /* partial_inplace */
1527 0xffffffff, /* src_mask */
1528 0xffffffff, /* dst_mask */
1529 FALSE), /* pcrel_offset */
1531 HOWTO (R_ARM_TLS_IE32, /* type */
1533 2, /* size (0 = byte, 1 = short, 2 = long) */
1535 FALSE, /* pc_relative */
1537 complain_overflow_bitfield,/* complain_on_overflow */
1538 NULL, /* special_function */
1539 "R_ARM_TLS_IE32", /* name */
1540 TRUE, /* partial_inplace */
1541 0xffffffff, /* src_mask */
1542 0xffffffff, /* dst_mask */
1543 FALSE), /* pcrel_offset */
1545 HOWTO (R_ARM_TLS_LE32, /* type */
1547 2, /* size (0 = byte, 1 = short, 2 = long) */
1549 FALSE, /* pc_relative */
1551 complain_overflow_bitfield,/* complain_on_overflow */
1552 bfd_elf_generic_reloc, /* special_function */
1553 "R_ARM_TLS_LE32", /* name */
1554 TRUE, /* partial_inplace */
1555 0xffffffff, /* src_mask */
1556 0xffffffff, /* dst_mask */
1557 FALSE), /* pcrel_offset */
1559 HOWTO (R_ARM_TLS_LDO12, /* type */
1561 2, /* size (0 = byte, 1 = short, 2 = long) */
1563 FALSE, /* pc_relative */
1565 complain_overflow_bitfield,/* complain_on_overflow */
1566 bfd_elf_generic_reloc, /* special_function */
1567 "R_ARM_TLS_LDO12", /* name */
1568 FALSE, /* partial_inplace */
1569 0x00000fff, /* src_mask */
1570 0x00000fff, /* dst_mask */
1571 FALSE), /* pcrel_offset */
1573 HOWTO (R_ARM_TLS_LE12, /* type */
1575 2, /* size (0 = byte, 1 = short, 2 = long) */
1577 FALSE, /* pc_relative */
1579 complain_overflow_bitfield,/* complain_on_overflow */
1580 bfd_elf_generic_reloc, /* special_function */
1581 "R_ARM_TLS_LE12", /* name */
1582 FALSE, /* partial_inplace */
1583 0x00000fff, /* src_mask */
1584 0x00000fff, /* dst_mask */
1585 FALSE), /* pcrel_offset */
1587 HOWTO (R_ARM_TLS_IE12GP, /* type */
1589 2, /* size (0 = byte, 1 = short, 2 = long) */
1591 FALSE, /* pc_relative */
1593 complain_overflow_bitfield,/* complain_on_overflow */
1594 bfd_elf_generic_reloc, /* special_function */
1595 "R_ARM_TLS_IE12GP", /* name */
1596 FALSE, /* partial_inplace */
1597 0x00000fff, /* src_mask */
1598 0x00000fff, /* dst_mask */
1599 FALSE), /* pcrel_offset */
1602 /* 112-127 private relocations
1603 128 R_ARM_ME_TOO, obsolete
1604 129-255 unallocated in AAELF.
1606 249-255 extended, currently unused, relocations: */
1608 static reloc_howto_type elf32_arm_howto_table_2[4] =
1610 HOWTO (R_ARM_RREL32, /* type */
1612 0, /* size (0 = byte, 1 = short, 2 = long) */
1614 FALSE, /* pc_relative */
1616 complain_overflow_dont,/* complain_on_overflow */
1617 bfd_elf_generic_reloc, /* special_function */
1618 "R_ARM_RREL32", /* name */
1619 FALSE, /* partial_inplace */
1622 FALSE), /* pcrel_offset */
1624 HOWTO (R_ARM_RABS32, /* type */
1626 0, /* size (0 = byte, 1 = short, 2 = long) */
1628 FALSE, /* pc_relative */
1630 complain_overflow_dont,/* complain_on_overflow */
1631 bfd_elf_generic_reloc, /* special_function */
1632 "R_ARM_RABS32", /* name */
1633 FALSE, /* partial_inplace */
1636 FALSE), /* pcrel_offset */
1638 HOWTO (R_ARM_RPC24, /* type */
1640 0, /* size (0 = byte, 1 = short, 2 = long) */
1642 FALSE, /* pc_relative */
1644 complain_overflow_dont,/* complain_on_overflow */
1645 bfd_elf_generic_reloc, /* special_function */
1646 "R_ARM_RPC24", /* name */
1647 FALSE, /* partial_inplace */
1650 FALSE), /* pcrel_offset */
1652 HOWTO (R_ARM_RBASE, /* type */
1654 0, /* size (0 = byte, 1 = short, 2 = long) */
1656 FALSE, /* pc_relative */
1658 complain_overflow_dont,/* complain_on_overflow */
1659 bfd_elf_generic_reloc, /* special_function */
1660 "R_ARM_RBASE", /* name */
1661 FALSE, /* partial_inplace */
1664 FALSE) /* pcrel_offset */
1667 static reloc_howto_type *
1668 elf32_arm_howto_from_type (unsigned int r_type)
1670 if (r_type < NUM_ELEM (elf32_arm_howto_table_1))
1671 return &elf32_arm_howto_table_1[r_type];
1673 if (r_type >= R_ARM_RREL32
1674 && r_type < R_ARM_RREL32 + NUM_ELEM (elf32_arm_howto_table_2))
1675 return &elf32_arm_howto_table_2[r_type - R_ARM_RREL32];
1681 elf32_arm_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED, arelent * bfd_reloc,
1682 Elf_Internal_Rela * elf_reloc)
1684 unsigned int r_type;
1686 r_type = ELF32_R_TYPE (elf_reloc->r_info);
1687 bfd_reloc->howto = elf32_arm_howto_from_type (r_type);
1690 struct elf32_arm_reloc_map
1692 bfd_reloc_code_real_type bfd_reloc_val;
1693 unsigned char elf_reloc_val;
1696 /* All entries in this list must also be present in elf32_arm_howto_table. */
1697 static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
1699 {BFD_RELOC_NONE, R_ARM_NONE},
1700 {BFD_RELOC_ARM_PCREL_BRANCH, R_ARM_PC24},
1701 {BFD_RELOC_ARM_PCREL_CALL, R_ARM_CALL},
1702 {BFD_RELOC_ARM_PCREL_JUMP, R_ARM_JUMP24},
1703 {BFD_RELOC_ARM_PCREL_BLX, R_ARM_XPC25},
1704 {BFD_RELOC_THUMB_PCREL_BLX, R_ARM_THM_XPC22},
1705 {BFD_RELOC_32, R_ARM_ABS32},
1706 {BFD_RELOC_32_PCREL, R_ARM_REL32},
1707 {BFD_RELOC_8, R_ARM_ABS8},
1708 {BFD_RELOC_16, R_ARM_ABS16},
1709 {BFD_RELOC_ARM_OFFSET_IMM, R_ARM_ABS12},
1710 {BFD_RELOC_ARM_THUMB_OFFSET, R_ARM_THM_ABS5},
1711 {BFD_RELOC_THUMB_PCREL_BRANCH25, R_ARM_THM_JUMP24},
1712 {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_CALL},
1713 {BFD_RELOC_THUMB_PCREL_BRANCH12, R_ARM_THM_JUMP11},
1714 {BFD_RELOC_THUMB_PCREL_BRANCH20, R_ARM_THM_JUMP19},
1715 {BFD_RELOC_THUMB_PCREL_BRANCH9, R_ARM_THM_JUMP8},
1716 {BFD_RELOC_THUMB_PCREL_BRANCH7, R_ARM_THM_JUMP6},
1717 {BFD_RELOC_ARM_GLOB_DAT, R_ARM_GLOB_DAT},
1718 {BFD_RELOC_ARM_JUMP_SLOT, R_ARM_JUMP_SLOT},
1719 {BFD_RELOC_ARM_RELATIVE, R_ARM_RELATIVE},
1720 {BFD_RELOC_ARM_GOTOFF, R_ARM_GOTOFF32},
1721 {BFD_RELOC_ARM_GOTPC, R_ARM_GOTPC},
1722 {BFD_RELOC_ARM_GOT32, R_ARM_GOT32},
1723 {BFD_RELOC_ARM_PLT32, R_ARM_PLT32},
1724 {BFD_RELOC_ARM_TARGET1, R_ARM_TARGET1},
1725 {BFD_RELOC_ARM_ROSEGREL32, R_ARM_ROSEGREL32},
1726 {BFD_RELOC_ARM_SBREL32, R_ARM_SBREL32},
1727 {BFD_RELOC_ARM_PREL31, R_ARM_PREL31},
1728 {BFD_RELOC_ARM_TARGET2, R_ARM_TARGET2},
1729 {BFD_RELOC_ARM_PLT32, R_ARM_PLT32},
1730 {BFD_RELOC_ARM_TLS_GD32, R_ARM_TLS_GD32},
1731 {BFD_RELOC_ARM_TLS_LDO32, R_ARM_TLS_LDO32},
1732 {BFD_RELOC_ARM_TLS_LDM32, R_ARM_TLS_LDM32},
1733 {BFD_RELOC_ARM_TLS_DTPMOD32, R_ARM_TLS_DTPMOD32},
1734 {BFD_RELOC_ARM_TLS_DTPOFF32, R_ARM_TLS_DTPOFF32},
1735 {BFD_RELOC_ARM_TLS_TPOFF32, R_ARM_TLS_TPOFF32},
1736 {BFD_RELOC_ARM_TLS_IE32, R_ARM_TLS_IE32},
1737 {BFD_RELOC_ARM_TLS_LE32, R_ARM_TLS_LE32},
1738 {BFD_RELOC_VTABLE_INHERIT, R_ARM_GNU_VTINHERIT},
1739 {BFD_RELOC_VTABLE_ENTRY, R_ARM_GNU_VTENTRY},
1740 {BFD_RELOC_ARM_MOVW, R_ARM_MOVW_ABS_NC},
1741 {BFD_RELOC_ARM_MOVT, R_ARM_MOVT_ABS},
1742 {BFD_RELOC_ARM_MOVW_PCREL, R_ARM_MOVW_PREL_NC},
1743 {BFD_RELOC_ARM_MOVT_PCREL, R_ARM_MOVT_PREL},
1744 {BFD_RELOC_ARM_THUMB_MOVW, R_ARM_THM_MOVW_ABS_NC},
1745 {BFD_RELOC_ARM_THUMB_MOVT, R_ARM_THM_MOVT_ABS},
1746 {BFD_RELOC_ARM_THUMB_MOVW_PCREL, R_ARM_THM_MOVW_PREL_NC},
1747 {BFD_RELOC_ARM_THUMB_MOVT_PCREL, R_ARM_THM_MOVT_PREL},
1748 {BFD_RELOC_ARM_ALU_PC_G0_NC, R_ARM_ALU_PC_G0_NC},
1749 {BFD_RELOC_ARM_ALU_PC_G0, R_ARM_ALU_PC_G0},
1750 {BFD_RELOC_ARM_ALU_PC_G1_NC, R_ARM_ALU_PC_G1_NC},
1751 {BFD_RELOC_ARM_ALU_PC_G1, R_ARM_ALU_PC_G1},
1752 {BFD_RELOC_ARM_ALU_PC_G2, R_ARM_ALU_PC_G2},
1753 {BFD_RELOC_ARM_LDR_PC_G0, R_ARM_LDR_PC_G0},
1754 {BFD_RELOC_ARM_LDR_PC_G1, R_ARM_LDR_PC_G1},
1755 {BFD_RELOC_ARM_LDR_PC_G2, R_ARM_LDR_PC_G2},
1756 {BFD_RELOC_ARM_LDRS_PC_G0, R_ARM_LDRS_PC_G0},
1757 {BFD_RELOC_ARM_LDRS_PC_G1, R_ARM_LDRS_PC_G1},
1758 {BFD_RELOC_ARM_LDRS_PC_G2, R_ARM_LDRS_PC_G2},
1759 {BFD_RELOC_ARM_LDC_PC_G0, R_ARM_LDC_PC_G0},
1760 {BFD_RELOC_ARM_LDC_PC_G1, R_ARM_LDC_PC_G1},
1761 {BFD_RELOC_ARM_LDC_PC_G2, R_ARM_LDC_PC_G2},
1762 {BFD_RELOC_ARM_ALU_SB_G0_NC, R_ARM_ALU_SB_G0_NC},
1763 {BFD_RELOC_ARM_ALU_SB_G0, R_ARM_ALU_SB_G0},
1764 {BFD_RELOC_ARM_ALU_SB_G1_NC, R_ARM_ALU_SB_G1_NC},
1765 {BFD_RELOC_ARM_ALU_SB_G1, R_ARM_ALU_SB_G1},
1766 {BFD_RELOC_ARM_ALU_SB_G2, R_ARM_ALU_SB_G2},
1767 {BFD_RELOC_ARM_LDR_SB_G0, R_ARM_LDR_SB_G0},
1768 {BFD_RELOC_ARM_LDR_SB_G1, R_ARM_LDR_SB_G1},
1769 {BFD_RELOC_ARM_LDR_SB_G2, R_ARM_LDR_SB_G2},
1770 {BFD_RELOC_ARM_LDRS_SB_G0, R_ARM_LDRS_SB_G0},
1771 {BFD_RELOC_ARM_LDRS_SB_G1, R_ARM_LDRS_SB_G1},
1772 {BFD_RELOC_ARM_LDRS_SB_G2, R_ARM_LDRS_SB_G2},
1773 {BFD_RELOC_ARM_LDC_SB_G0, R_ARM_LDC_SB_G0},
1774 {BFD_RELOC_ARM_LDC_SB_G1, R_ARM_LDC_SB_G1},
1775 {BFD_RELOC_ARM_LDC_SB_G2, R_ARM_LDC_SB_G2}
1778 static reloc_howto_type *
1779 elf32_arm_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1780 bfd_reloc_code_real_type code)
1783 for (i = 0; i < NUM_ELEM (elf32_arm_reloc_map); i ++)
1784 if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
1785 return elf32_arm_howto_from_type (elf32_arm_reloc_map[i].elf_reloc_val);
1790 /* Support for core dump NOTE sections */
1792 elf32_arm_nabi_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1797 switch (note->descsz)
1802 case 148: /* Linux/ARM 32-bit*/
1804 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1807 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1816 /* Make a ".reg/999" section. */
1817 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1818 size, note->descpos + offset);
1822 elf32_arm_nabi_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1824 switch (note->descsz)
1829 case 124: /* Linux/ARM elf_prpsinfo */
1830 elf_tdata (abfd)->core_program
1831 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1832 elf_tdata (abfd)->core_command
1833 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1836 /* Note that for some reason, a spurious space is tacked
1837 onto the end of the args in some (at least one anyway)
1838 implementations, so strip it off if it exists. */
1841 char *command = elf_tdata (abfd)->core_command;
1842 int n = strlen (command);
1844 if (0 < n && command[n - 1] == ' ')
1845 command[n - 1] = '\0';
1851 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vec
1852 #define TARGET_LITTLE_NAME "elf32-littlearm"
1853 #define TARGET_BIG_SYM bfd_elf32_bigarm_vec
1854 #define TARGET_BIG_NAME "elf32-bigarm"
1856 #define elf_backend_grok_prstatus elf32_arm_nabi_grok_prstatus
1857 #define elf_backend_grok_psinfo elf32_arm_nabi_grok_psinfo
1859 typedef unsigned long int insn32;
1860 typedef unsigned short int insn16;
1862 /* In lieu of proper flags, assume all EABIv4 or later objects are
1864 #define INTERWORK_FLAG(abfd) \
1865 (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) >= EF_ARM_EABI_VER4 \
1866 || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK))
1868 /* The linker script knows the section names for placement.
1869 The entry_names are used to do simple name mangling on the stubs.
1870 Given a function name, and its type, the stub can be found. The
1871 name can be changed. The only requirement is the %s be present. */
1872 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
1873 #define THUMB2ARM_GLUE_ENTRY_NAME "__%s_from_thumb"
1875 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
1876 #define ARM2THUMB_GLUE_ENTRY_NAME "__%s_from_arm"
1878 /* The name of the dynamic interpreter. This is put in the .interp
1880 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
1882 #ifdef FOUR_WORD_PLT
1884 /* The first entry in a procedure linkage table looks like
1885 this. It is set up so that any shared library function that is
1886 called before the relocation has been set up calls the dynamic
1888 static const bfd_vma elf32_arm_plt0_entry [] =
1890 0xe52de004, /* str lr, [sp, #-4]! */
1891 0xe59fe010, /* ldr lr, [pc, #16] */
1892 0xe08fe00e, /* add lr, pc, lr */
1893 0xe5bef008, /* ldr pc, [lr, #8]! */
1896 /* Subsequent entries in a procedure linkage table look like
1898 static const bfd_vma elf32_arm_plt_entry [] =
1900 0xe28fc600, /* add ip, pc, #NN */
1901 0xe28cca00, /* add ip, ip, #NN */
1902 0xe5bcf000, /* ldr pc, [ip, #NN]! */
1903 0x00000000, /* unused */
1908 /* The first entry in a procedure linkage table looks like
1909 this. It is set up so that any shared library function that is
1910 called before the relocation has been set up calls the dynamic
1912 static const bfd_vma elf32_arm_plt0_entry [] =
1914 0xe52de004, /* str lr, [sp, #-4]! */
1915 0xe59fe004, /* ldr lr, [pc, #4] */
1916 0xe08fe00e, /* add lr, pc, lr */
1917 0xe5bef008, /* ldr pc, [lr, #8]! */
1918 0x00000000, /* &GOT[0] - . */
1921 /* Subsequent entries in a procedure linkage table look like
1923 static const bfd_vma elf32_arm_plt_entry [] =
1925 0xe28fc600, /* add ip, pc, #0xNN00000 */
1926 0xe28cca00, /* add ip, ip, #0xNN000 */
1927 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */
1932 /* The format of the first entry in the procedure linkage table
1933 for a VxWorks executable. */
1934 static const bfd_vma elf32_arm_vxworks_exec_plt0_entry[] =
1936 0xe52dc008, /* str ip,[sp,#-8]! */
1937 0xe59fc000, /* ldr ip,[pc] */
1938 0xe59cf008, /* ldr pc,[ip,#8] */
1939 0x00000000, /* .long _GLOBAL_OFFSET_TABLE_ */
1942 /* The format of subsequent entries in a VxWorks executable. */
1943 static const bfd_vma elf32_arm_vxworks_exec_plt_entry[] =
1945 0xe59fc000, /* ldr ip,[pc] */
1946 0xe59cf000, /* ldr pc,[ip] */
1947 0x00000000, /* .long @got */
1948 0xe59fc000, /* ldr ip,[pc] */
1949 0xea000000, /* b _PLT */
1950 0x00000000, /* .long @pltindex*sizeof(Elf32_Rela) */
1953 /* The format of entries in a VxWorks shared library. */
1954 static const bfd_vma elf32_arm_vxworks_shared_plt_entry[] =
1956 0xe59fc000, /* ldr ip,[pc] */
1957 0xe79cf009, /* ldr pc,[ip,r9] */
1958 0x00000000, /* .long @got */
1959 0xe59fc000, /* ldr ip,[pc] */
1960 0xe599f008, /* ldr pc,[r9,#8] */
1961 0x00000000, /* .long @pltindex*sizeof(Elf32_Rela) */
1964 /* An initial stub used if the PLT entry is referenced from Thumb code. */
1965 #define PLT_THUMB_STUB_SIZE 4
1966 static const bfd_vma elf32_arm_plt_thumb_stub [] =
1972 /* The entries in a PLT when using a DLL-based target with multiple
1974 static const bfd_vma elf32_arm_symbian_plt_entry [] =
1976 0xe51ff004, /* ldr pc, [pc, #-4] */
1977 0x00000000, /* dcd R_ARM_GLOB_DAT(X) */
1980 /* Used to build a map of a section. This is required for mixed-endian
1983 typedef struct elf32_elf_section_map
1988 elf32_arm_section_map;
1990 typedef struct _arm_elf_section_data
1992 struct bfd_elf_section_data elf;
1993 unsigned int mapcount;
1994 elf32_arm_section_map *map;
1996 _arm_elf_section_data;
1998 #define elf32_arm_section_data(sec) \
1999 ((_arm_elf_section_data *) elf_section_data (sec))
2001 /* The size of the thread control block. */
2004 #define NUM_KNOWN_ATTRIBUTES 32
2006 typedef struct aeabi_attribute
2013 typedef struct aeabi_attribute_list
2015 struct aeabi_attribute_list *next;
2017 aeabi_attribute attr;
2018 } aeabi_attribute_list;
2020 struct elf32_arm_obj_tdata
2022 struct elf_obj_tdata root;
2024 /* tls_type for each local got entry. */
2025 char *local_got_tls_type;
2027 aeabi_attribute known_eabi_attributes[NUM_KNOWN_ATTRIBUTES];
2028 aeabi_attribute_list *other_eabi_attributes;
2031 #define elf32_arm_tdata(abfd) \
2032 ((struct elf32_arm_obj_tdata *) (abfd)->tdata.any)
2034 #define elf32_arm_local_got_tls_type(abfd) \
2035 (elf32_arm_tdata (abfd)->local_got_tls_type)
2038 elf32_arm_mkobject (bfd *abfd)
2040 if (abfd->tdata.any == NULL)
2042 bfd_size_type amt = sizeof (struct elf32_arm_obj_tdata);
2043 abfd->tdata.any = bfd_zalloc (abfd, amt);
2044 if (abfd->tdata.any == NULL)
2047 return bfd_elf_mkobject (abfd);
2050 /* The ARM linker needs to keep track of the number of relocs that it
2051 decides to copy in check_relocs for each symbol. This is so that
2052 it can discard PC relative relocs if it doesn't need them when
2053 linking with -Bsymbolic. We store the information in a field
2054 extending the regular ELF linker hash table. */
2056 /* This structure keeps track of the number of relocs we have copied
2057 for a given symbol. */
2058 struct elf32_arm_relocs_copied
2061 struct elf32_arm_relocs_copied * next;
2062 /* A section in dynobj. */
2064 /* Number of relocs copied in this section. */
2065 bfd_size_type count;
2066 /* Number of PC-relative relocs copied in this section. */
2067 bfd_size_type pc_count;
2070 #define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
2072 /* Arm ELF linker hash entry. */
2073 struct elf32_arm_link_hash_entry
2075 struct elf_link_hash_entry root;
2077 /* Number of PC relative relocs copied for this symbol. */
2078 struct elf32_arm_relocs_copied * relocs_copied;
2080 /* We reference count Thumb references to a PLT entry separately,
2081 so that we can emit the Thumb trampoline only if needed. */
2082 bfd_signed_vma plt_thumb_refcount;
2084 /* Since PLT entries have variable size if the Thumb prologue is
2085 used, we need to record the index into .got.plt instead of
2086 recomputing it from the PLT offset. */
2087 bfd_signed_vma plt_got_offset;
2089 #define GOT_UNKNOWN 0
2090 #define GOT_NORMAL 1
2091 #define GOT_TLS_GD 2
2092 #define GOT_TLS_IE 4
2093 unsigned char tls_type;
2095 /* The symbol marking the real symbol location for exported thumb
2096 symbols with Arm stubs. */
2097 struct elf_link_hash_entry *export_glue;
2100 /* Traverse an arm ELF linker hash table. */
2101 #define elf32_arm_link_hash_traverse(table, func, info) \
2102 (elf_link_hash_traverse \
2104 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
2107 /* Get the ARM elf linker hash table from a link_info structure. */
2108 #define elf32_arm_hash_table(info) \
2109 ((struct elf32_arm_link_hash_table *) ((info)->hash))
2111 /* ARM ELF linker hash table. */
2112 struct elf32_arm_link_hash_table
2114 /* The main hash table. */
2115 struct elf_link_hash_table root;
2117 /* The size in bytes of the section containing the Thumb-to-ARM glue. */
2118 bfd_size_type thumb_glue_size;
2120 /* The size in bytes of the section containing the ARM-to-Thumb glue. */
2121 bfd_size_type arm_glue_size;
2123 /* An arbitrary input BFD chosen to hold the glue sections. */
2124 bfd * bfd_of_glue_owner;
2126 /* Nonzero to output a BE8 image. */
2129 /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
2130 Nonzero if R_ARM_TARGET1 means R_ARM_REL32. */
2133 /* The relocation to use for R_ARM_TARGET2 relocations. */
2136 /* Nonzero to fix BX instructions for ARMv4 targets. */
2139 /* Nonzero if the ARM/Thumb BLX instructions are available for use. */
2142 /* The number of bytes in the initial entry in the PLT. */
2143 bfd_size_type plt_header_size;
2145 /* The number of bytes in the subsequent PLT etries. */
2146 bfd_size_type plt_entry_size;
2148 /* True if the target system is VxWorks. */
2151 /* True if the target system is Symbian OS. */
2154 /* True if the target uses REL relocations. */
2157 /* Short-cuts to get to dynamic linker sections. */
2166 /* The (unloaded but important) VxWorks .rela.plt.unloaded section. */
2169 /* Data for R_ARM_TLS_LDM32 relocations. */
2171 bfd_signed_vma refcount;
2175 /* Small local sym to section mapping cache. */
2176 struct sym_sec_cache sym_sec;
2178 /* For convenience in allocate_dynrelocs. */
2182 /* Create an entry in an ARM ELF linker hash table. */
2184 static struct bfd_hash_entry *
2185 elf32_arm_link_hash_newfunc (struct bfd_hash_entry * entry,
2186 struct bfd_hash_table * table,
2187 const char * string)
2189 struct elf32_arm_link_hash_entry * ret =
2190 (struct elf32_arm_link_hash_entry *) entry;
2192 /* Allocate the structure if it has not already been allocated by a
2194 if (ret == (struct elf32_arm_link_hash_entry *) NULL)
2195 ret = bfd_hash_allocate (table, sizeof (struct elf32_arm_link_hash_entry));
2197 return (struct bfd_hash_entry *) ret;
2199 /* Call the allocation method of the superclass. */
2200 ret = ((struct elf32_arm_link_hash_entry *)
2201 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2205 ret->relocs_copied = NULL;
2206 ret->tls_type = GOT_UNKNOWN;
2207 ret->plt_thumb_refcount = 0;
2208 ret->plt_got_offset = -1;
2209 ret->export_glue = NULL;
2212 return (struct bfd_hash_entry *) ret;
2215 /* Return true if NAME is the name of the relocation section associated
2219 reloc_section_p (struct elf32_arm_link_hash_table *htab,
2220 const char *name, asection *s)
2223 return CONST_STRNEQ (name, ".rel") && strcmp (s->name, name + 4) == 0;
2225 return CONST_STRNEQ (name, ".rela") && strcmp (s->name, name + 5) == 0;
2228 /* Create .got, .gotplt, and .rel(a).got sections in DYNOBJ, and set up
2229 shortcuts to them in our hash table. */
2232 create_got_section (bfd *dynobj, struct bfd_link_info *info)
2234 struct elf32_arm_link_hash_table *htab;
2236 htab = elf32_arm_hash_table (info);
2237 /* BPABI objects never have a GOT, or associated sections. */
2238 if (htab->symbian_p)
2241 if (! _bfd_elf_create_got_section (dynobj, info))
2244 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
2245 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
2246 if (!htab->sgot || !htab->sgotplt)
2249 htab->srelgot = bfd_make_section_with_flags (dynobj,
2250 RELOC_SECTION (htab, ".got"),
2251 (SEC_ALLOC | SEC_LOAD
2254 | SEC_LINKER_CREATED
2256 if (htab->srelgot == NULL
2257 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
2262 /* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
2263 .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
2267 elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
2269 struct elf32_arm_link_hash_table *htab;
2271 htab = elf32_arm_hash_table (info);
2272 if (!htab->sgot && !create_got_section (dynobj, info))
2275 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
2278 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
2279 htab->srelplt = bfd_get_section_by_name (dynobj,
2280 RELOC_SECTION (htab, ".plt"));
2281 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
2283 htab->srelbss = bfd_get_section_by_name (dynobj,
2284 RELOC_SECTION (htab, ".bss"));
2286 if (htab->vxworks_p)
2288 if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
2293 htab->plt_header_size = 0;
2294 htab->plt_entry_size
2295 = 4 * ARRAY_SIZE (elf32_arm_vxworks_shared_plt_entry);
2299 htab->plt_header_size
2300 = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt0_entry);
2301 htab->plt_entry_size
2302 = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt_entry);
2309 || (!info->shared && !htab->srelbss))
2315 /* Copy the extra info we tack onto an elf_link_hash_entry. */
2318 elf32_arm_copy_indirect_symbol (struct bfd_link_info *info,
2319 struct elf_link_hash_entry *dir,
2320 struct elf_link_hash_entry *ind)
2322 struct elf32_arm_link_hash_entry *edir, *eind;
2324 edir = (struct elf32_arm_link_hash_entry *) dir;
2325 eind = (struct elf32_arm_link_hash_entry *) ind;
2327 if (eind->relocs_copied != NULL)
2329 if (edir->relocs_copied != NULL)
2331 struct elf32_arm_relocs_copied **pp;
2332 struct elf32_arm_relocs_copied *p;
2334 /* Add reloc counts against the indirect sym to the direct sym
2335 list. Merge any entries against the same section. */
2336 for (pp = &eind->relocs_copied; (p = *pp) != NULL; )
2338 struct elf32_arm_relocs_copied *q;
2340 for (q = edir->relocs_copied; q != NULL; q = q->next)
2341 if (q->section == p->section)
2343 q->pc_count += p->pc_count;
2344 q->count += p->count;
2351 *pp = edir->relocs_copied;
2354 edir->relocs_copied = eind->relocs_copied;
2355 eind->relocs_copied = NULL;
2358 if (ind->root.type == bfd_link_hash_indirect)
2360 /* Copy over PLT info. */
2361 edir->plt_thumb_refcount += eind->plt_thumb_refcount;
2362 eind->plt_thumb_refcount = 0;
2364 if (dir->got.refcount <= 0)
2366 edir->tls_type = eind->tls_type;
2367 eind->tls_type = GOT_UNKNOWN;
2371 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
2374 /* Create an ARM elf linker hash table. */
2376 static struct bfd_link_hash_table *
2377 elf32_arm_link_hash_table_create (bfd *abfd)
2379 struct elf32_arm_link_hash_table *ret;
2380 bfd_size_type amt = sizeof (struct elf32_arm_link_hash_table);
2382 ret = bfd_malloc (amt);
2386 if (!_bfd_elf_link_hash_table_init (& ret->root, abfd,
2387 elf32_arm_link_hash_newfunc,
2388 sizeof (struct elf32_arm_link_hash_entry)))
2395 ret->sgotplt = NULL;
2396 ret->srelgot = NULL;
2398 ret->srelplt = NULL;
2399 ret->sdynbss = NULL;
2400 ret->srelbss = NULL;
2401 ret->srelplt2 = NULL;
2402 ret->thumb_glue_size = 0;
2403 ret->arm_glue_size = 0;
2404 ret->bfd_of_glue_owner = NULL;
2405 ret->byteswap_code = 0;
2406 ret->target1_is_rel = 0;
2407 ret->target2_reloc = R_ARM_NONE;
2408 #ifdef FOUR_WORD_PLT
2409 ret->plt_header_size = 16;
2410 ret->plt_entry_size = 16;
2412 ret->plt_header_size = 20;
2413 ret->plt_entry_size = 12;
2420 ret->sym_sec.abfd = NULL;
2422 ret->tls_ldm_got.refcount = 0;
2424 return &ret->root.root;
2427 /* Locate the Thumb encoded calling stub for NAME. */
2429 static struct elf_link_hash_entry *
2430 find_thumb_glue (struct bfd_link_info *link_info,
2435 struct elf_link_hash_entry *hash;
2436 struct elf32_arm_link_hash_table *hash_table;
2438 /* We need a pointer to the armelf specific hash table. */
2439 hash_table = elf32_arm_hash_table (link_info);
2441 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2442 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
2444 BFD_ASSERT (tmp_name);
2446 sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
2448 hash = elf_link_hash_lookup
2449 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
2452 /* xgettext:c-format */
2453 (*_bfd_error_handler) (_("%B: unable to find THUMB glue '%s' for `%s'"),
2454 input_bfd, tmp_name, name);
2461 /* Locate the ARM encoded calling stub for NAME. */
2463 static struct elf_link_hash_entry *
2464 find_arm_glue (struct bfd_link_info *link_info,
2469 struct elf_link_hash_entry *myh;
2470 struct elf32_arm_link_hash_table *hash_table;
2472 /* We need a pointer to the elfarm specific hash table. */
2473 hash_table = elf32_arm_hash_table (link_info);
2475 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2476 + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
2478 BFD_ASSERT (tmp_name);
2480 sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
2482 myh = elf_link_hash_lookup
2483 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
2486 /* xgettext:c-format */
2487 (*_bfd_error_handler) (_("%B: unable to find ARM glue '%s' for `%s'"),
2488 input_bfd, tmp_name, name);
2495 /* ARM->Thumb glue (static images):
2499 ldr r12, __func_addr
2502 .word func @ behave as if you saw a ARM_32 reloc.
2504 (relocatable images)
2507 ldr r12, __func_offset
2514 #define ARM2THUMB_STATIC_GLUE_SIZE 12
2515 static const insn32 a2t1_ldr_insn = 0xe59fc000;
2516 static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
2517 static const insn32 a2t3_func_addr_insn = 0x00000001;
2519 #define ARM2THUMB_PIC_GLUE_SIZE 16
2520 static const insn32 a2t1p_ldr_insn = 0xe59fc004;
2521 static const insn32 a2t2p_add_pc_insn = 0xe08cc00f;
2522 static const insn32 a2t3p_bx_r12_insn = 0xe12fff1c;
2524 /* Thumb->ARM: Thumb->(non-interworking aware) ARM
2528 __func_from_thumb: __func_from_thumb:
2530 nop ldr r6, __func_addr
2532 __func_change_to_arm: bx r6
2534 __func_back_to_thumb:
2540 #define THUMB2ARM_GLUE_SIZE 8
2541 static const insn16 t2a1_bx_pc_insn = 0x4778;
2542 static const insn16 t2a2_noop_insn = 0x46c0;
2543 static const insn32 t2a3_b_insn = 0xea000000;
2545 #ifndef ELFARM_NABI_C_INCLUDED
2547 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
2551 struct elf32_arm_link_hash_table * globals;
2553 globals = elf32_arm_hash_table (info);
2555 BFD_ASSERT (globals != NULL);
2557 if (globals->arm_glue_size != 0)
2559 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2561 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2562 ARM2THUMB_GLUE_SECTION_NAME);
2564 BFD_ASSERT (s != NULL);
2566 foo = bfd_alloc (globals->bfd_of_glue_owner, globals->arm_glue_size);
2568 BFD_ASSERT (s->size == globals->arm_glue_size);
2572 if (globals->thumb_glue_size != 0)
2574 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2576 s = bfd_get_section_by_name
2577 (globals->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
2579 BFD_ASSERT (s != NULL);
2581 foo = bfd_alloc (globals->bfd_of_glue_owner, globals->thumb_glue_size);
2583 BFD_ASSERT (s->size == globals->thumb_glue_size);
2590 /* Allocate space and symbols for calling a Thumb function from Arm mode.
2591 returns the symbol identifying teh stub. */
2592 static struct elf_link_hash_entry *
2593 record_arm_to_thumb_glue (struct bfd_link_info * link_info,
2594 struct elf_link_hash_entry * h)
2596 const char * name = h->root.root.string;
2599 struct elf_link_hash_entry * myh;
2600 struct bfd_link_hash_entry * bh;
2601 struct elf32_arm_link_hash_table * globals;
2605 globals = elf32_arm_hash_table (link_info);
2607 BFD_ASSERT (globals != NULL);
2608 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2610 s = bfd_get_section_by_name
2611 (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
2613 BFD_ASSERT (s != NULL);
2615 tmp_name = bfd_malloc ((bfd_size_type) strlen (name) + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
2617 BFD_ASSERT (tmp_name);
2619 sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
2621 myh = elf_link_hash_lookup
2622 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
2626 /* We've already seen this guy. */
2631 /* The only trick here is using hash_table->arm_glue_size as the value.
2632 Even though the section isn't allocated yet, this is where we will be
2635 val = globals->arm_glue_size + 1;
2636 _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
2637 tmp_name, BSF_GLOBAL, s, val,
2638 NULL, TRUE, FALSE, &bh);
2640 myh = (struct elf_link_hash_entry *) bh;
2641 myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
2642 myh->forced_local = 1;
2646 if ((link_info->shared || globals->root.is_relocatable_executable))
2647 size = ARM2THUMB_PIC_GLUE_SIZE;
2649 size = ARM2THUMB_STATIC_GLUE_SIZE;
2652 globals->arm_glue_size += size;
2658 record_thumb_to_arm_glue (struct bfd_link_info *link_info,
2659 struct elf_link_hash_entry *h)
2661 const char *name = h->root.root.string;
2664 struct elf_link_hash_entry *myh;
2665 struct bfd_link_hash_entry *bh;
2666 struct elf32_arm_link_hash_table *hash_table;
2669 hash_table = elf32_arm_hash_table (link_info);
2671 BFD_ASSERT (hash_table != NULL);
2672 BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
2674 s = bfd_get_section_by_name
2675 (hash_table->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
2677 BFD_ASSERT (s != NULL);
2679 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2680 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
2682 BFD_ASSERT (tmp_name);
2684 sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
2686 myh = elf_link_hash_lookup
2687 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
2691 /* We've already seen this guy. */
2697 val = hash_table->thumb_glue_size + 1;
2698 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
2699 tmp_name, BSF_GLOBAL, s, val,
2700 NULL, TRUE, FALSE, &bh);
2702 /* If we mark it 'Thumb', the disassembler will do a better job. */
2703 myh = (struct elf_link_hash_entry *) bh;
2704 myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
2705 myh->forced_local = 1;
2709 #define CHANGE_TO_ARM "__%s_change_to_arm"
2710 #define BACK_FROM_ARM "__%s_back_from_arm"
2712 /* Allocate another symbol to mark where we switch to Arm mode. */
2713 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2714 + strlen (CHANGE_TO_ARM) + 1);
2716 BFD_ASSERT (tmp_name);
2718 sprintf (tmp_name, CHANGE_TO_ARM, name);
2721 val = hash_table->thumb_glue_size + 4,
2722 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
2723 tmp_name, BSF_LOCAL, s, val,
2724 NULL, TRUE, FALSE, &bh);
2728 s->size += THUMB2ARM_GLUE_SIZE;
2729 hash_table->thumb_glue_size += THUMB2ARM_GLUE_SIZE;
2734 /* Add the glue sections to ABFD. This function is called from the
2735 linker scripts in ld/emultempl/{armelf}.em. */
2738 bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
2739 struct bfd_link_info *info)
2744 /* If we are only performing a partial
2745 link do not bother adding the glue. */
2746 if (info->relocatable)
2749 sec = bfd_get_section_by_name (abfd, ARM2THUMB_GLUE_SECTION_NAME);
2753 /* Note: we do not include the flag SEC_LINKER_CREATED, as this
2754 will prevent elf_link_input_bfd() from processing the contents
2756 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2757 | SEC_CODE | SEC_READONLY);
2759 sec = bfd_make_section_with_flags (abfd,
2760 ARM2THUMB_GLUE_SECTION_NAME,
2764 || !bfd_set_section_alignment (abfd, sec, 2))
2767 /* Set the gc mark to prevent the section from being removed by garbage
2768 collection, despite the fact that no relocs refer to this section. */
2772 sec = bfd_get_section_by_name (abfd, THUMB2ARM_GLUE_SECTION_NAME);
2776 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2777 | SEC_CODE | SEC_READONLY);
2779 sec = bfd_make_section_with_flags (abfd,
2780 THUMB2ARM_GLUE_SECTION_NAME,
2784 || !bfd_set_section_alignment (abfd, sec, 2))
2793 /* Select a BFD to be used to hold the sections used by the glue code.
2794 This function is called from the linker scripts in ld/emultempl/
2798 bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
2800 struct elf32_arm_link_hash_table *globals;
2802 /* If we are only performing a partial link
2803 do not bother getting a bfd to hold the glue. */
2804 if (info->relocatable)
2807 /* Make sure we don't attach the glue sections to a dynamic object. */
2808 BFD_ASSERT (!(abfd->flags & DYNAMIC));
2810 globals = elf32_arm_hash_table (info);
2812 BFD_ASSERT (globals != NULL);
2814 if (globals->bfd_of_glue_owner != NULL)
2817 /* Save the bfd for later use. */
2818 globals->bfd_of_glue_owner = abfd;
2823 static void check_use_blx(struct elf32_arm_link_hash_table *globals)
2825 if (elf32_arm_get_eabi_attr_int (globals->obfd, Tag_CPU_arch) > 2)
2826 globals->use_blx = 1;
2830 bfd_elf32_arm_process_before_allocation (bfd *abfd,
2831 struct bfd_link_info *link_info,
2834 Elf_Internal_Shdr *symtab_hdr;
2835 Elf_Internal_Rela *internal_relocs = NULL;
2836 Elf_Internal_Rela *irel, *irelend;
2837 bfd_byte *contents = NULL;
2840 struct elf32_arm_link_hash_table *globals;
2842 /* If we are only performing a partial link do not bother
2843 to construct any glue. */
2844 if (link_info->relocatable)
2847 /* Here we have a bfd that is to be included on the link. We have a hook
2848 to do reloc rummaging, before section sizes are nailed down. */
2849 globals = elf32_arm_hash_table (link_info);
2850 check_use_blx (globals);
2852 BFD_ASSERT (globals != NULL);
2853 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2855 if (byteswap_code && !bfd_big_endian (abfd))
2857 _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
2861 globals->byteswap_code = byteswap_code;
2863 /* Rummage around all the relocs and map the glue vectors. */
2864 sec = abfd->sections;
2869 for (; sec != NULL; sec = sec->next)
2871 if (sec->reloc_count == 0)
2874 if ((sec->flags & SEC_EXCLUDE) != 0)
2877 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2879 /* Load the relocs. */
2881 = _bfd_elf_link_read_relocs (abfd, sec, (void *) NULL,
2882 (Elf_Internal_Rela *) NULL, FALSE);
2884 if (internal_relocs == NULL)
2887 irelend = internal_relocs + sec->reloc_count;
2888 for (irel = internal_relocs; irel < irelend; irel++)
2891 unsigned long r_index;
2893 struct elf_link_hash_entry *h;
2895 r_type = ELF32_R_TYPE (irel->r_info);
2896 r_index = ELF32_R_SYM (irel->r_info);
2898 /* These are the only relocation types we care about. */
2899 if ( r_type != R_ARM_PC24
2900 && r_type != R_ARM_PLT32
2901 && r_type != R_ARM_CALL
2902 && r_type != R_ARM_JUMP24
2903 && r_type != R_ARM_THM_CALL)
2906 /* Get the section contents if we haven't done so already. */
2907 if (contents == NULL)
2909 /* Get cached copy if it exists. */
2910 if (elf_section_data (sec)->this_hdr.contents != NULL)
2911 contents = elf_section_data (sec)->this_hdr.contents;
2914 /* Go get them off disk. */
2915 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2920 /* If the relocation is not against a symbol it cannot concern us. */
2923 /* We don't care about local symbols. */
2924 if (r_index < symtab_hdr->sh_info)
2927 /* This is an external symbol. */
2928 r_index -= symtab_hdr->sh_info;
2929 h = (struct elf_link_hash_entry *)
2930 elf_sym_hashes (abfd)[r_index];
2932 /* If the relocation is against a static symbol it must be within
2933 the current section and so cannot be a cross ARM/Thumb relocation. */
2937 /* If the call will go through a PLT entry then we do not need
2939 if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1)
2948 /* This one is a call from arm code. We need to look up
2949 the target of the call. If it is a thumb target, we
2951 if (ELF_ST_TYPE(h->type) == STT_ARM_TFUNC
2952 && !(r_type == R_ARM_CALL && globals->use_blx))
2953 record_arm_to_thumb_glue (link_info, h);
2956 case R_ARM_THM_CALL:
2957 /* This one is a call from thumb code. We look
2958 up the target of the call. If it is not a thumb
2959 target, we insert glue. */
2960 if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC && !globals->use_blx)
2961 record_thumb_to_arm_glue (link_info, h);
2969 if (contents != NULL
2970 && elf_section_data (sec)->this_hdr.contents != contents)
2974 if (internal_relocs != NULL
2975 && elf_section_data (sec)->relocs != internal_relocs)
2976 free (internal_relocs);
2977 internal_relocs = NULL;
2983 if (contents != NULL
2984 && elf_section_data (sec)->this_hdr.contents != contents)
2986 if (internal_relocs != NULL
2987 && elf_section_data (sec)->relocs != internal_relocs)
2988 free (internal_relocs);
2995 /* Set target relocation values needed during linking. */
2998 bfd_elf32_arm_set_target_relocs (struct bfd_link_info *link_info,
3000 char * target2_type,
3004 struct elf32_arm_link_hash_table *globals;
3006 globals = elf32_arm_hash_table (link_info);
3008 globals->target1_is_rel = target1_is_rel;
3009 if (strcmp (target2_type, "rel") == 0)
3010 globals->target2_reloc = R_ARM_REL32;
3011 else if (strcmp (target2_type, "abs") == 0)
3012 globals->target2_reloc = R_ARM_ABS32;
3013 else if (strcmp (target2_type, "got-rel") == 0)
3014 globals->target2_reloc = R_ARM_GOT_PREL;
3017 _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
3020 globals->fix_v4bx = fix_v4bx;
3021 globals->use_blx |= use_blx;
3024 /* The thumb form of a long branch is a bit finicky, because the offset
3025 encoding is split over two fields, each in it's own instruction. They
3026 can occur in any order. So given a thumb form of long branch, and an
3027 offset, insert the offset into the thumb branch and return finished
3030 It takes two thumb instructions to encode the target address. Each has
3031 11 bits to invest. The upper 11 bits are stored in one (identified by
3032 H-0.. see below), the lower 11 bits are stored in the other (identified
3035 Combine together and shifted left by 1 (it's a half word address) and
3039 H-0, upper address-0 = 000
3041 H-1, lower address-0 = 800
3043 They can be ordered either way, but the arm tools I've seen always put
3044 the lower one first. It probably doesn't matter. krk@cygnus.com
3046 XXX: Actually the order does matter. The second instruction (H-1)
3047 moves the computed address into the PC, so it must be the second one
3048 in the sequence. The problem, however is that whilst little endian code
3049 stores the instructions in HI then LOW order, big endian code does the
3050 reverse. nickc@cygnus.com. */
3052 #define LOW_HI_ORDER 0xF800F000
3053 #define HI_LOW_ORDER 0xF000F800
3056 insert_thumb_branch (insn32 br_insn, int rel_off)
3058 unsigned int low_bits;
3059 unsigned int high_bits;
3061 BFD_ASSERT ((rel_off & 1) != 1);
3063 rel_off >>= 1; /* Half word aligned address. */
3064 low_bits = rel_off & 0x000007FF; /* The bottom 11 bits. */
3065 high_bits = (rel_off >> 11) & 0x000007FF; /* The top 11 bits. */
3067 if ((br_insn & LOW_HI_ORDER) == LOW_HI_ORDER)
3068 br_insn = LOW_HI_ORDER | (low_bits << 16) | high_bits;
3069 else if ((br_insn & HI_LOW_ORDER) == HI_LOW_ORDER)
3070 br_insn = HI_LOW_ORDER | (high_bits << 16) | low_bits;
3072 /* FIXME: abort is probably not the right call. krk@cygnus.com */
3073 abort (); /* Error - not a valid branch instruction form. */
3079 /* Store an Arm insn into an output section not processed by
3080 elf32_arm_write_section. */
3083 put_arm_insn (struct elf32_arm_link_hash_table *htab,
3084 bfd * output_bfd, bfd_vma val, void * ptr)
3086 if (htab->byteswap_code != bfd_little_endian (output_bfd))
3087 bfd_putl32 (val, ptr);
3089 bfd_putb32 (val, ptr);
3093 /* Store a 16-bit Thumb insn into an output section not processed by
3094 elf32_arm_write_section. */
3097 put_thumb_insn (struct elf32_arm_link_hash_table *htab,
3098 bfd * output_bfd, bfd_vma val, void * ptr)
3100 if (htab->byteswap_code != bfd_little_endian (output_bfd))
3101 bfd_putl16 (val, ptr);
3103 bfd_putb16 (val, ptr);
3107 /* Thumb code calling an ARM function. */
3110 elf32_thumb_to_arm_stub (struct bfd_link_info * info,
3114 asection * input_section,
3115 bfd_byte * hit_data,
3118 bfd_signed_vma addend,
3123 unsigned long int tmp;
3124 long int ret_offset;
3125 struct elf_link_hash_entry * myh;
3126 struct elf32_arm_link_hash_table * globals;
3128 myh = find_thumb_glue (info, name, input_bfd);
3132 globals = elf32_arm_hash_table (info);
3134 BFD_ASSERT (globals != NULL);
3135 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
3137 my_offset = myh->root.u.def.value;
3139 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
3140 THUMB2ARM_GLUE_SECTION_NAME);
3142 BFD_ASSERT (s != NULL);
3143 BFD_ASSERT (s->contents != NULL);
3144 BFD_ASSERT (s->output_section != NULL);
3146 if ((my_offset & 0x01) == 0x01)
3149 && sym_sec->owner != NULL
3150 && !INTERWORK_FLAG (sym_sec->owner))
3152 (*_bfd_error_handler)
3153 (_("%B(%s): warning: interworking not enabled.\n"
3154 " first occurrence: %B: thumb call to arm"),
3155 sym_sec->owner, input_bfd, name);
3161 myh->root.u.def.value = my_offset;
3163 put_thumb_insn (globals, output_bfd, (bfd_vma) t2a1_bx_pc_insn,
3164 s->contents + my_offset);
3166 put_thumb_insn (globals, output_bfd, (bfd_vma) t2a2_noop_insn,
3167 s->contents + my_offset + 2);
3170 /* Address of destination of the stub. */
3171 ((bfd_signed_vma) val)
3173 /* Offset from the start of the current section
3174 to the start of the stubs. */
3176 /* Offset of the start of this stub from the start of the stubs. */
3178 /* Address of the start of the current section. */
3179 + s->output_section->vma)
3180 /* The branch instruction is 4 bytes into the stub. */
3182 /* ARM branches work from the pc of the instruction + 8. */
3185 put_arm_insn (globals, output_bfd,
3186 (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
3187 s->contents + my_offset + 4);
3190 BFD_ASSERT (my_offset <= globals->thumb_glue_size);
3192 /* Now go back and fix up the original BL insn to point to here. */
3194 /* Address of where the stub is located. */
3195 (s->output_section->vma + s->output_offset + my_offset)
3196 /* Address of where the BL is located. */
3197 - (input_section->output_section->vma + input_section->output_offset
3199 /* Addend in the relocation. */
3201 /* Biassing for PC-relative addressing. */
3204 tmp = bfd_get_32 (input_bfd, hit_data
3205 - input_section->vma);
3207 bfd_put_32 (output_bfd,
3208 (bfd_vma) insert_thumb_branch (tmp, ret_offset),
3209 hit_data - input_section->vma);
3214 /* Populate an Arm to Thumb stub. Returns the stub symbol. */
3216 static struct elf_link_hash_entry *
3217 elf32_arm_create_thumb_stub (struct bfd_link_info * info,
3226 long int ret_offset;
3227 struct elf_link_hash_entry * myh;
3228 struct elf32_arm_link_hash_table * globals;
3230 myh = find_arm_glue (info, name, input_bfd);
3234 globals = elf32_arm_hash_table (info);
3236 BFD_ASSERT (globals != NULL);
3237 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
3239 my_offset = myh->root.u.def.value;
3241 if ((my_offset & 0x01) == 0x01)
3244 && sym_sec->owner != NULL
3245 && !INTERWORK_FLAG (sym_sec->owner))
3247 (*_bfd_error_handler)
3248 (_("%B(%s): warning: interworking not enabled.\n"
3249 " first occurrence: %B: arm call to thumb"),
3250 sym_sec->owner, input_bfd, name);
3254 myh->root.u.def.value = my_offset;
3256 if ((info->shared || globals->root.is_relocatable_executable))
3258 /* For relocatable objects we can't use absolute addresses,
3259 so construct the address from a relative offset. */
3260 /* TODO: If the offset is small it's probably worth
3261 constructing the address with adds. */
3262 put_arm_insn (globals, output_bfd, (bfd_vma) a2t1p_ldr_insn,
3263 s->contents + my_offset);
3264 put_arm_insn (globals, output_bfd, (bfd_vma) a2t2p_add_pc_insn,
3265 s->contents + my_offset + 4);
3266 put_arm_insn (globals, output_bfd, (bfd_vma) a2t3p_bx_r12_insn,
3267 s->contents + my_offset + 8);
3268 /* Adjust the offset by 4 for the position of the add,
3269 and 8 for the pipeline offset. */
3270 ret_offset = (val - (s->output_offset
3271 + s->output_section->vma
3274 bfd_put_32 (output_bfd, ret_offset,
3275 s->contents + my_offset + 12);
3279 put_arm_insn (globals, output_bfd, (bfd_vma) a2t1_ldr_insn,
3280 s->contents + my_offset);
3282 put_arm_insn (globals, output_bfd, (bfd_vma) a2t2_bx_r12_insn,
3283 s->contents + my_offset + 4);
3285 /* It's a thumb address. Add the low order bit. */
3286 bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
3287 s->contents + my_offset + 8);
3291 BFD_ASSERT (my_offset <= globals->arm_glue_size);
3296 /* Arm code calling a Thumb function. */
3299 elf32_arm_to_thumb_stub (struct bfd_link_info * info,
3303 asection * input_section,
3304 bfd_byte * hit_data,
3307 bfd_signed_vma addend,
3310 unsigned long int tmp;
3313 long int ret_offset;
3314 struct elf_link_hash_entry * myh;
3315 struct elf32_arm_link_hash_table * globals;
3317 globals = elf32_arm_hash_table (info);
3319 BFD_ASSERT (globals != NULL);
3320 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
3322 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
3323 ARM2THUMB_GLUE_SECTION_NAME);
3324 BFD_ASSERT (s != NULL);
3325 BFD_ASSERT (s->contents != NULL);
3326 BFD_ASSERT (s->output_section != NULL);
3328 myh = elf32_arm_create_thumb_stub (info, name, input_bfd, output_bfd,
3333 my_offset = myh->root.u.def.value;
3334 tmp = bfd_get_32 (input_bfd, hit_data);
3335 tmp = tmp & 0xFF000000;
3337 /* Somehow these are both 4 too far, so subtract 8. */
3338 ret_offset = (s->output_offset
3340 + s->output_section->vma
3341 - (input_section->output_offset
3342 + input_section->output_section->vma
3346 tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
3348 bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
3353 /* Populate Arm stub for an exported Thumb function. */
3356 elf32_arm_to_thumb_export_stub (struct elf_link_hash_entry *h, void * inf)
3358 struct bfd_link_info * info = (struct bfd_link_info *) inf;
3360 struct elf_link_hash_entry * myh;
3361 struct elf32_arm_link_hash_entry *eh;
3362 struct elf32_arm_link_hash_table * globals;
3366 eh = elf32_arm_hash_entry(h);
3367 /* Allocate stubs for exported Thumb functions on v4t. */
3368 if (eh->export_glue == NULL)
3371 globals = elf32_arm_hash_table (info);
3373 BFD_ASSERT (globals != NULL);
3374 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
3376 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
3377 ARM2THUMB_GLUE_SECTION_NAME);
3378 BFD_ASSERT (s != NULL);
3379 BFD_ASSERT (s->contents != NULL);
3380 BFD_ASSERT (s->output_section != NULL);
3382 sec = eh->export_glue->root.u.def.section;
3383 val = eh->export_glue->root.u.def.value + sec->output_offset
3384 + sec->output_section->vma;
3385 myh = elf32_arm_create_thumb_stub (info, h->root.root.string,
3386 h->root.u.def.section->owner,
3387 globals->obfd, sec, val, s);
3392 /* Generate Arm stubs for exported Thumb symbols. */
3394 elf32_arm_begin_write_processing (bfd *abfd ATTRIBUTE_UNUSED,
3395 struct bfd_link_info *link_info)
3397 struct elf32_arm_link_hash_table * globals;
3402 globals = elf32_arm_hash_table (link_info);
3403 /* If blx is available then exported Thumb symbols are OK and there is
3405 if (globals->use_blx)
3408 elf_link_hash_traverse (&globals->root, elf32_arm_to_thumb_export_stub,
3412 /* Some relocations map to different relocations depending on the
3413 target. Return the real relocation. */
3415 arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
3421 if (globals->target1_is_rel)
3427 return globals->target2_reloc;
3434 /* Return the base VMA address which should be subtracted from real addresses
3435 when resolving @dtpoff relocation.
3436 This is PT_TLS segment p_vaddr. */
3439 dtpoff_base (struct bfd_link_info *info)
3441 /* If tls_sec is NULL, we should have signalled an error already. */
3442 if (elf_hash_table (info)->tls_sec == NULL)
3444 return elf_hash_table (info)->tls_sec->vma;
3447 /* Return the relocation value for @tpoff relocation
3448 if STT_TLS virtual address is ADDRESS. */
3451 tpoff (struct bfd_link_info *info, bfd_vma address)
3453 struct elf_link_hash_table *htab = elf_hash_table (info);
3456 /* If tls_sec is NULL, we should have signalled an error already. */
3457 if (htab->tls_sec == NULL)
3459 base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
3460 return address - htab->tls_sec->vma + base;
3463 /* Perform an R_ARM_ABS12 relocation on the field pointed to by DATA.
3464 VALUE is the relocation value. */
3466 static bfd_reloc_status_type
3467 elf32_arm_abs12_reloc (bfd *abfd, void *data, bfd_vma value)
3470 return bfd_reloc_overflow;
3472 value |= bfd_get_32 (abfd, data) & 0xfffff000;
3473 bfd_put_32 (abfd, value, data);
3474 return bfd_reloc_ok;
3477 /* For a given value of n, calculate the value of G_n as required to
3478 deal with group relocations. We return it in the form of an
3479 encoded constant-and-rotation, together with the final residual. If n is
3480 specified as less than zero, then final_residual is filled with the
3481 input value and no further action is performed. */
3484 calculate_group_reloc_mask (bfd_vma value, int n, bfd_vma *final_residual)
3488 bfd_vma encoded_g_n = 0;
3489 bfd_vma residual = value; /* Also known as Y_n. */
3491 for (current_n = 0; current_n <= n; current_n++)
3495 /* Calculate which part of the value to mask. */
3502 /* Determine the most significant bit in the residual and
3503 align the resulting value to a 2-bit boundary. */
3504 for (msb = 30; msb >= 0; msb -= 2)
3505 if (residual & (3 << msb))
3508 /* The desired shift is now (msb - 6), or zero, whichever
3515 /* Calculate g_n in 32-bit as well as encoded constant+rotation form. */
3516 g_n = residual & (0xff << shift);
3517 encoded_g_n = (g_n >> shift)
3518 | ((g_n <= 0xff ? 0 : (32 - shift) / 2) << 8);
3520 /* Calculate the residual for the next time around. */
3524 *final_residual = residual;
3529 /* Given an ARM instruction, determine whether it is an ADD or a SUB.
3530 Returns 1 if it is an ADD, -1 if it is a SUB, and 0 otherwise. */
3532 identify_add_or_sub(bfd_vma insn)
3534 int opcode = insn & 0x1e00000;
3536 if (opcode == 1 << 23) /* ADD */
3539 if (opcode == 1 << 22) /* SUB */
3545 /* Determine if we're dealing with a Thumb-2 object. */
3547 static int using_thumb2 (struct elf32_arm_link_hash_table *globals)
3549 int arch = elf32_arm_get_eabi_attr_int (globals->obfd, Tag_CPU_arch);
3550 return arch == TAG_CPU_ARCH_V6T2 || arch >= TAG_CPU_ARCH_V7;
3553 /* Perform a relocation as part of a final link. */
3555 static bfd_reloc_status_type
3556 elf32_arm_final_link_relocate (reloc_howto_type * howto,
3559 asection * input_section,
3560 bfd_byte * contents,
3561 Elf_Internal_Rela * rel,
3563 struct bfd_link_info * info,
3565 const char * sym_name,
3567 struct elf_link_hash_entry * h,
3568 bfd_boolean * unresolved_reloc_p)
3570 unsigned long r_type = howto->type;
3571 unsigned long r_symndx;
3572 bfd_byte * hit_data = contents + rel->r_offset;
3573 bfd * dynobj = NULL;
3574 Elf_Internal_Shdr * symtab_hdr;
3575 struct elf_link_hash_entry ** sym_hashes;
3576 bfd_vma * local_got_offsets;
3577 asection * sgot = NULL;
3578 asection * splt = NULL;
3579 asection * sreloc = NULL;
3581 bfd_signed_vma signed_addend;
3582 struct elf32_arm_link_hash_table * globals;
3584 globals = elf32_arm_hash_table (info);
3586 /* Some relocation type map to different relocations depending on the
3587 target. We pick the right one here. */
3588 r_type = arm_real_reloc_type (globals, r_type);
3589 if (r_type != howto->type)
3590 howto = elf32_arm_howto_from_type (r_type);
3592 /* If the start address has been set, then set the EF_ARM_HASENTRY
3593 flag. Setting this more than once is redundant, but the cost is
3594 not too high, and it keeps the code simple.
3596 The test is done here, rather than somewhere else, because the
3597 start address is only set just before the final link commences.
3599 Note - if the user deliberately sets a start address of 0, the
3600 flag will not be set. */
3601 if (bfd_get_start_address (output_bfd) != 0)
3602 elf_elfheader (output_bfd)->e_flags |= EF_ARM_HASENTRY;
3604 dynobj = elf_hash_table (info)->dynobj;
3607 sgot = bfd_get_section_by_name (dynobj, ".got");
3608 splt = bfd_get_section_by_name (dynobj, ".plt");
3610 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
3611 sym_hashes = elf_sym_hashes (input_bfd);
3612 local_got_offsets = elf_local_got_offsets (input_bfd);
3613 r_symndx = ELF32_R_SYM (rel->r_info);
3615 if (globals->use_rel)
3617 addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
3619 if (addend & ((howto->src_mask + 1) >> 1))
3622 signed_addend &= ~ howto->src_mask;
3623 signed_addend |= addend;
3626 signed_addend = addend;
3629 addend = signed_addend = rel->r_addend;
3634 /* We don't need to find a value for this symbol. It's just a
3636 *unresolved_reloc_p = FALSE;
3637 return bfd_reloc_ok;
3640 if (!globals->vxworks_p)
3641 return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
3645 case R_ARM_ABS32_NOI:
3647 case R_ARM_REL32_NOI:
3653 /* r_symndx will be zero only for relocs against symbols
3654 from removed linkonce sections, or sections discarded by
3657 return bfd_reloc_ok;
3659 /* Handle relocations which should use the PLT entry. ABS32/REL32
3660 will use the symbol's value, which may point to a PLT entry, but we
3661 don't need to handle that here. If we created a PLT entry, all
3662 branches in this object should go to it. */
3663 if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32
3664 && r_type != R_ARM_ABS32_NOI && r_type != R_ARM_REL32_NOI)
3667 && h->plt.offset != (bfd_vma) -1)
3669 /* If we've created a .plt section, and assigned a PLT entry to
3670 this function, it should not be known to bind locally. If
3671 it were, we would have cleared the PLT entry. */
3672 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
3674 value = (splt->output_section->vma
3675 + splt->output_offset
3677 *unresolved_reloc_p = FALSE;
3678 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3679 contents, rel->r_offset, value,
3683 /* When generating a shared object or relocatable executable, these
3684 relocations are copied into the output file to be resolved at
3686 if ((info->shared || globals->root.is_relocatable_executable)
3687 && (input_section->flags & SEC_ALLOC)
3688 && ((r_type != R_ARM_REL32 && r_type != R_ARM_REL32_NOI)
3689 || !SYMBOL_CALLS_LOCAL (info, h))
3691 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3692 || h->root.type != bfd_link_hash_undefweak)
3693 && r_type != R_ARM_PC24
3694 && r_type != R_ARM_CALL
3695 && r_type != R_ARM_JUMP24
3696 && r_type != R_ARM_PREL31
3697 && r_type != R_ARM_PLT32)
3699 Elf_Internal_Rela outrel;
3701 bfd_boolean skip, relocate;
3703 *unresolved_reloc_p = FALSE;
3709 name = (bfd_elf_string_from_elf_section
3711 elf_elfheader (input_bfd)->e_shstrndx,
3712 elf_section_data (input_section)->rel_hdr.sh_name));
3714 return bfd_reloc_notsupported;
3716 BFD_ASSERT (reloc_section_p (globals, name, input_section));
3718 sreloc = bfd_get_section_by_name (dynobj, name);
3719 BFD_ASSERT (sreloc != NULL);
3725 outrel.r_addend = addend;
3727 _bfd_elf_section_offset (output_bfd, info, input_section,
3729 if (outrel.r_offset == (bfd_vma) -1)
3731 else if (outrel.r_offset == (bfd_vma) -2)
3732 skip = TRUE, relocate = TRUE;
3733 outrel.r_offset += (input_section->output_section->vma
3734 + input_section->output_offset);
3737 memset (&outrel, 0, sizeof outrel);
3742 || !h->def_regular))
3743 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3748 /* This symbol is local, or marked to become local. */
3749 if (sym_flags == STT_ARM_TFUNC)
3751 if (globals->symbian_p)
3755 /* On Symbian OS, the data segment and text segement
3756 can be relocated independently. Therefore, we
3757 must indicate the segment to which this
3758 relocation is relative. The BPABI allows us to
3759 use any symbol in the right segment; we just use
3760 the section symbol as it is convenient. (We
3761 cannot use the symbol given by "h" directly as it
3762 will not appear in the dynamic symbol table.)
3764 Note that the dynamic linker ignores the section
3765 symbol value, so we don't subtract osec->vma
3766 from the emitted reloc addend. */
3768 osec = sym_sec->output_section;
3770 osec = input_section->output_section;
3771 symbol = elf_section_data (osec)->dynindx;
3774 struct elf_link_hash_table *htab = elf_hash_table (info);
3776 if ((osec->flags & SEC_READONLY) == 0
3777 && htab->data_index_section != NULL)
3778 osec = htab->data_index_section;
3780 osec = htab->text_index_section;
3781 symbol = elf_section_data (osec)->dynindx;
3783 BFD_ASSERT (symbol != 0);
3786 /* On SVR4-ish systems, the dynamic loader cannot
3787 relocate the text and data segments independently,
3788 so the symbol does not matter. */
3790 outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
3791 if (globals->use_rel)
3794 outrel.r_addend += value;
3797 loc = sreloc->contents;
3798 loc += sreloc->reloc_count++ * RELOC_SIZE (globals);
3799 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
3801 /* If this reloc is against an external symbol, we do not want to
3802 fiddle with the addend. Otherwise, we need to include the symbol
3803 value so that it becomes an addend for the dynamic reloc. */
3805 return bfd_reloc_ok;
3807 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3808 contents, rel->r_offset, value,
3811 else switch (r_type)
3814 return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
3816 case R_ARM_XPC25: /* Arm BLX instruction. */
3819 case R_ARM_PC24: /* Arm B/BL instruction */
3821 if (r_type == R_ARM_XPC25)
3823 /* Check for Arm calling Arm function. */
3824 /* FIXME: Should we translate the instruction into a BL
3825 instruction instead ? */
3826 if (sym_flags != STT_ARM_TFUNC)
3827 (*_bfd_error_handler)
3828 (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
3830 h ? h->root.root.string : "(local)");
3832 else if (r_type != R_ARM_CALL || !globals->use_blx)
3834 /* Check for Arm calling Thumb function. */
3835 if (sym_flags == STT_ARM_TFUNC)
3837 elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
3838 output_bfd, input_section,
3839 hit_data, sym_sec, rel->r_offset,
3840 signed_addend, value);
3841 return bfd_reloc_ok;
3845 /* The ARM ELF ABI says that this reloc is computed as: S - P + A
3847 S is the address of the symbol in the relocation.
3848 P is address of the instruction being relocated.
3849 A is the addend (extracted from the instruction) in bytes.
3851 S is held in 'value'.
3852 P is the base address of the section containing the
3853 instruction plus the offset of the reloc into that
3855 (input_section->output_section->vma +
3856 input_section->output_offset +
3858 A is the addend, converted into bytes, ie:
3861 Note: None of these operations have knowledge of the pipeline
3862 size of the processor, thus it is up to the assembler to
3863 encode this information into the addend. */
3864 value -= (input_section->output_section->vma
3865 + input_section->output_offset);
3866 value -= rel->r_offset;
3867 if (globals->use_rel)
3868 value += (signed_addend << howto->size);
3870 /* RELA addends do not have to be adjusted by howto->size. */
3871 value += signed_addend;
3873 signed_addend = value;
3874 signed_addend >>= howto->rightshift;
3876 /* It is not an error for an undefined weak reference to be
3877 out of range. Any program that branches to such a symbol
3878 is going to crash anyway, so there is no point worrying
3879 about getting the destination exactly right. */
3880 if (! h || h->root.type != bfd_link_hash_undefweak)
3882 /* Perform a signed range check. */
3883 if ( signed_addend > ((bfd_signed_vma) (howto->dst_mask >> 1))
3884 || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
3885 return bfd_reloc_overflow;
3888 addend = (value & 2);
3890 value = (signed_addend & howto->dst_mask)
3891 | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
3893 /* Set the H bit in the BLX instruction. */
3894 if (sym_flags == STT_ARM_TFUNC)
3899 value &= ~(bfd_vma)(1 << 24);
3901 if (r_type == R_ARM_CALL)
3903 /* Select the correct instruction (BL or BLX). */
3904 if (sym_flags == STT_ARM_TFUNC)
3908 value &= ~(bfd_vma)(1 << 28);
3916 if (sym_flags == STT_ARM_TFUNC)
3920 case R_ARM_ABS32_NOI:
3926 if (sym_flags == STT_ARM_TFUNC)
3928 value -= (input_section->output_section->vma
3929 + input_section->output_offset + rel->r_offset);
3932 case R_ARM_REL32_NOI:
3934 value -= (input_section->output_section->vma
3935 + input_section->output_offset + rel->r_offset);
3939 value -= (input_section->output_section->vma
3940 + input_section->output_offset + rel->r_offset);
3941 value += signed_addend;
3942 if (! h || h->root.type != bfd_link_hash_undefweak)
3944 /* Check for overflow */
3945 if ((value ^ (value >> 1)) & (1 << 30))
3946 return bfd_reloc_overflow;
3948 value &= 0x7fffffff;
3949 value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
3950 if (sym_flags == STT_ARM_TFUNC)
3955 bfd_put_32 (input_bfd, value, hit_data);
3956 return bfd_reloc_ok;
3960 if ((long) value > 0x7f || (long) value < -0x80)
3961 return bfd_reloc_overflow;
3963 bfd_put_8 (input_bfd, value, hit_data);
3964 return bfd_reloc_ok;
3969 if ((long) value > 0x7fff || (long) value < -0x8000)
3970 return bfd_reloc_overflow;
3972 bfd_put_16 (input_bfd, value, hit_data);
3973 return bfd_reloc_ok;
3975 case R_ARM_THM_ABS5:
3976 /* Support ldr and str instructions for the thumb. */
3977 if (globals->use_rel)
3979 /* Need to refetch addend. */
3980 addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
3981 /* ??? Need to determine shift amount from operand size. */
3982 addend >>= howto->rightshift;
3986 /* ??? Isn't value unsigned? */
3987 if ((long) value > 0x1f || (long) value < -0x10)
3988 return bfd_reloc_overflow;
3990 /* ??? Value needs to be properly shifted into place first. */
3991 value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
3992 bfd_put_16 (input_bfd, value, hit_data);
3993 return bfd_reloc_ok;
3995 case R_ARM_THM_ALU_PREL_11_0:
3996 /* Corresponds to: addw.w reg, pc, #offset (and similarly for subw). */
3999 bfd_signed_vma relocation;
4001 insn = (bfd_get_16 (input_bfd, hit_data) << 16)
4002 | bfd_get_16 (input_bfd, hit_data + 2);
4004 if (globals->use_rel)
4006 signed_addend = (insn & 0xff) | ((insn & 0x7000) >> 4)
4007 | ((insn & (1 << 26)) >> 15);
4008 if (insn & 0xf00000)
4009 signed_addend = -signed_addend;
4012 relocation = value + signed_addend;
4013 relocation -= (input_section->output_section->vma
4014 + input_section->output_offset
4017 value = abs (relocation);
4019 if (value >= 0x1000)
4020 return bfd_reloc_overflow;
4022 insn = (insn & 0xfb0f8f00) | (value & 0xff)
4023 | ((value & 0x700) << 4)
4024 | ((value & 0x800) << 15);
4028 bfd_put_16 (input_bfd, insn >> 16, hit_data);
4029 bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
4031 return bfd_reloc_ok;
4034 case R_ARM_THM_PC12:
4035 /* Corresponds to: ldr.w reg, [pc, #offset]. */
4038 bfd_signed_vma relocation;
4040 insn = (bfd_get_16 (input_bfd, hit_data) << 16)
4041 | bfd_get_16 (input_bfd, hit_data + 2);
4043 if (globals->use_rel)
4045 signed_addend = insn & 0xfff;
4046 if (!(insn & (1 << 23)))
4047 signed_addend = -signed_addend;
4050 relocation = value + signed_addend;
4051 relocation -= (input_section->output_section->vma
4052 + input_section->output_offset
4055 value = abs (relocation);
4057 if (value >= 0x1000)
4058 return bfd_reloc_overflow;
4060 insn = (insn & 0xff7ff000) | value;
4061 if (relocation >= 0)
4064 bfd_put_16 (input_bfd, insn >> 16, hit_data);
4065 bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
4067 return bfd_reloc_ok;
4070 case R_ARM_THM_XPC22:
4071 case R_ARM_THM_CALL:
4072 /* Thumb BL (branch long instruction). */
4076 bfd_boolean overflow = FALSE;
4077 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
4078 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
4079 bfd_signed_vma reloc_signed_max;
4080 bfd_signed_vma reloc_signed_min;
4082 bfd_signed_vma signed_check;
4084 int thumb2 = using_thumb2 (globals);
4086 /* Fetch the addend. We use the Thumb-2 encoding (backwards compatible
4087 with Thumb-1) involving the J1 and J2 bits. */
4088 if (globals->use_rel)
4090 bfd_vma s = (upper_insn & (1 << 10)) >> 10;
4091 bfd_vma upper = upper_insn & 0x3ff;
4092 bfd_vma lower = lower_insn & 0x7ff;
4093 bfd_vma j1 = (lower_insn & (1 << 13)) >> 13;
4094 bfd_vma j2 = (lower_insn & (1 << 11)) >> 11;
4095 bfd_vma i1 = j1 ^ s ? 0 : 1;
4096 bfd_vma i2 = j2 ^ s ? 0 : 1;
4098 addend = (i1 << 23) | (i2 << 22) | (upper << 12) | (lower << 1);
4100 addend = (addend | ((s ? 0 : 1) << 24)) - (1 << 24);
4102 signed_addend = addend;
4105 if (r_type == R_ARM_THM_XPC22)
4107 /* Check for Thumb to Thumb call. */
4108 /* FIXME: Should we translate the instruction into a BL
4109 instruction instead ? */
4110 if (sym_flags == STT_ARM_TFUNC)
4111 (*_bfd_error_handler)
4112 (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
4114 h ? h->root.root.string : "(local)");
4118 /* If it is not a call to Thumb, assume call to Arm.
4119 If it is a call relative to a section name, then it is not a
4120 function call at all, but rather a long jump. Calls through
4121 the PLT do not require stubs. */
4122 if (sym_flags != STT_ARM_TFUNC && sym_flags != STT_SECTION
4123 && (h == NULL || splt == NULL
4124 || h->plt.offset == (bfd_vma) -1))
4126 if (globals->use_blx)
4128 /* Convert BL to BLX. */
4129 lower_insn = (lower_insn & ~0x1000) | 0x0800;
4131 else if (elf32_thumb_to_arm_stub
4132 (info, sym_name, input_bfd, output_bfd, input_section,
4133 hit_data, sym_sec, rel->r_offset, signed_addend, value))
4134 return bfd_reloc_ok;
4136 return bfd_reloc_dangerous;
4138 else if (sym_flags == STT_ARM_TFUNC && globals->use_blx)
4140 /* Make sure this is a BL. */
4141 lower_insn |= 0x1800;
4145 /* Handle calls via the PLT. */
4146 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
4148 value = (splt->output_section->vma
4149 + splt->output_offset
4151 if (globals->use_blx)
4153 /* If the Thumb BLX instruction is available, convert the
4154 BL to a BLX instruction to call the ARM-mode PLT entry. */
4155 lower_insn = (lower_insn & ~0x1000) | 0x0800;
4158 /* Target the Thumb stub before the ARM PLT entry. */
4159 value -= PLT_THUMB_STUB_SIZE;
4160 *unresolved_reloc_p = FALSE;
4163 relocation = value + signed_addend;
4165 relocation -= (input_section->output_section->vma
4166 + input_section->output_offset
4169 check = relocation >> howto->rightshift;
4171 /* If this is a signed value, the rightshift just dropped
4172 leading 1 bits (assuming twos complement). */
4173 if ((bfd_signed_vma) relocation >= 0)
4174 signed_check = check;
4176 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
4178 /* Calculate the permissable maximum and minimum values for
4179 this relocation according to whether we're relocating for
4181 bitsize = howto->bitsize;
4184 reloc_signed_max = ((1 << (bitsize - 1)) - 1) >> howto->rightshift;
4185 reloc_signed_min = ~reloc_signed_max;
4187 /* Assumes two's complement. */
4188 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
4191 if ((lower_insn & 0x1800) == 0x0800)
4192 /* For a BLX instruction, make sure that the relocation is rounded up
4193 to a word boundary. This follows the semantics of the instruction
4194 which specifies that bit 1 of the target address will come from bit
4195 1 of the base address. */
4196 relocation = (relocation + 2) & ~ 3;
4198 /* Put RELOCATION back into the insn. Assumes two's complement.
4199 We use the Thumb-2 encoding, which is safe even if dealing with
4200 a Thumb-1 instruction by virtue of our overflow check above. */
4201 reloc_sign = (signed_check < 0) ? 1 : 0;
4202 upper_insn = (upper_insn & ~(bfd_vma) 0x7ff)
4203 | ((relocation >> 12) & 0x3ff)
4204 | (reloc_sign << 10);
4205 lower_insn = (lower_insn & ~(bfd_vma) 0x2fff)
4206 | (((!((relocation >> 23) & 1)) ^ reloc_sign) << 13)
4207 | (((!((relocation >> 22) & 1)) ^ reloc_sign) << 11)
4208 | ((relocation >> 1) & 0x7ff);
4210 /* Put the relocated value back in the object file: */
4211 bfd_put_16 (input_bfd, upper_insn, hit_data);
4212 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
4214 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
4218 case R_ARM_THM_JUMP24:
4219 /* Thumb32 unconditional branch instruction. */
4222 bfd_boolean overflow = FALSE;
4223 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
4224 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
4225 bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
4226 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
4228 bfd_signed_vma signed_check;
4230 /* Need to refetch the addend, reconstruct the top three bits, and glue the
4231 two pieces together. */
4232 if (globals->use_rel)
4234 bfd_vma S = (upper_insn & 0x0400) >> 10;
4235 bfd_vma hi = (upper_insn & 0x03ff);
4236 bfd_vma I1 = (lower_insn & 0x2000) >> 13;
4237 bfd_vma I2 = (lower_insn & 0x0800) >> 11;
4238 bfd_vma lo = (lower_insn & 0x07ff);
4244 signed_addend = (S << 24) | (I1 << 23) | (I2 << 22) | (hi << 12) | (lo << 1);
4245 signed_addend -= (1 << 24); /* Sign extend. */
4248 /* ??? Should handle interworking? GCC might someday try to
4249 use this for tail calls. */
4251 relocation = value + signed_addend;
4252 relocation -= (input_section->output_section->vma
4253 + input_section->output_offset
4256 check = relocation >> howto->rightshift;
4258 /* If this is a signed value, the rightshift just dropped
4259 leading 1 bits (assuming twos complement). */
4260 if ((bfd_signed_vma) relocation >= 0)
4261 signed_check = check;
4263 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
4265 /* Assumes two's complement. */
4266 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
4269 /* Put RELOCATION back into the insn. */
4271 bfd_vma S = (relocation & 0x01000000) >> 24;
4272 bfd_vma I1 = (relocation & 0x00800000) >> 23;
4273 bfd_vma I2 = (relocation & 0x00400000) >> 22;
4274 bfd_vma hi = (relocation & 0x003ff000) >> 12;
4275 bfd_vma lo = (relocation & 0x00000ffe) >> 1;
4280 upper_insn = (upper_insn & (bfd_vma) 0xf800) | (S << 10) | hi;
4281 lower_insn = (lower_insn & (bfd_vma) 0xd000) | (I1 << 13) | (I2 << 11) | lo;
4284 /* Put the relocated value back in the object file: */
4285 bfd_put_16 (input_bfd, upper_insn, hit_data);
4286 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
4288 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
4291 case R_ARM_THM_JUMP19:
4292 /* Thumb32 conditional branch instruction. */
4295 bfd_boolean overflow = FALSE;
4296 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
4297 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
4298 bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
4299 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
4301 bfd_signed_vma signed_check;
4303 /* Need to refetch the addend, reconstruct the top three bits,
4304 and squish the two 11 bit pieces together. */
4305 if (globals->use_rel)
4307 bfd_vma S = (upper_insn & 0x0400) >> 10;
4308 bfd_vma upper = (upper_insn & 0x001f);
4309 bfd_vma J1 = (lower_insn & 0x2000) >> 13;
4310 bfd_vma J2 = (lower_insn & 0x0800) >> 11;
4311 bfd_vma lower = (lower_insn & 0x07ff);
4316 upper -= 0x0100; /* Sign extend. */
4318 addend = (upper << 12) | (lower << 1);
4319 signed_addend = addend;
4322 /* ??? Should handle interworking? GCC might someday try to
4323 use this for tail calls. */
4325 relocation = value + signed_addend;
4326 relocation -= (input_section->output_section->vma
4327 + input_section->output_offset
4330 check = relocation >> howto->rightshift;
4332 /* If this is a signed value, the rightshift just dropped
4333 leading 1 bits (assuming twos complement). */
4334 if ((bfd_signed_vma) relocation >= 0)
4335 signed_check = check;
4337 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
4339 /* Assumes two's complement. */
4340 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
4343 /* Put RELOCATION back into the insn. */
4345 bfd_vma S = (relocation & 0x00100000) >> 20;
4346 bfd_vma J2 = (relocation & 0x00080000) >> 19;
4347 bfd_vma J1 = (relocation & 0x00040000) >> 18;
4348 bfd_vma hi = (relocation & 0x0003f000) >> 12;
4349 bfd_vma lo = (relocation & 0x00000ffe) >> 1;
4351 upper_insn = (upper_insn & 0xfb30) | (S << 10) | hi;
4352 lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
4355 /* Put the relocated value back in the object file: */
4356 bfd_put_16 (input_bfd, upper_insn, hit_data);
4357 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
4359 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
4362 case R_ARM_THM_JUMP11:
4363 case R_ARM_THM_JUMP8:
4364 case R_ARM_THM_JUMP6:
4365 /* Thumb B (branch) instruction). */
4367 bfd_signed_vma relocation;
4368 bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
4369 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
4370 bfd_signed_vma signed_check;
4372 /* CZB cannot jump backward. */
4373 if (r_type == R_ARM_THM_JUMP6)
4374 reloc_signed_min = 0;
4376 if (globals->use_rel)
4378 /* Need to refetch addend. */
4379 addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
4380 if (addend & ((howto->src_mask + 1) >> 1))
4383 signed_addend &= ~ howto->src_mask;
4384 signed_addend |= addend;
4387 signed_addend = addend;
4388 /* The value in the insn has been right shifted. We need to
4389 undo this, so that we can perform the address calculation
4390 in terms of bytes. */
4391 signed_addend <<= howto->rightshift;
4393 relocation = value + signed_addend;
4395 relocation -= (input_section->output_section->vma
4396 + input_section->output_offset
4399 relocation >>= howto->rightshift;
4400 signed_check = relocation;
4402 if (r_type == R_ARM_THM_JUMP6)
4403 relocation = ((relocation & 0x0020) << 4) | ((relocation & 0x001f) << 3);
4405 relocation &= howto->dst_mask;
4406 relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
4408 bfd_put_16 (input_bfd, relocation, hit_data);
4410 /* Assumes two's complement. */
4411 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
4412 return bfd_reloc_overflow;
4414 return bfd_reloc_ok;
4417 case R_ARM_ALU_PCREL7_0:
4418 case R_ARM_ALU_PCREL15_8:
4419 case R_ARM_ALU_PCREL23_15:
4424 insn = bfd_get_32 (input_bfd, hit_data);
4425 if (globals->use_rel)
4427 /* Extract the addend. */
4428 addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
4429 signed_addend = addend;
4431 relocation = value + signed_addend;
4433 relocation -= (input_section->output_section->vma
4434 + input_section->output_offset
4436 insn = (insn & ~0xfff)
4437 | ((howto->bitpos << 7) & 0xf00)
4438 | ((relocation >> howto->bitpos) & 0xff);
4439 bfd_put_32 (input_bfd, value, hit_data);
4441 return bfd_reloc_ok;
4443 case R_ARM_GNU_VTINHERIT:
4444 case R_ARM_GNU_VTENTRY:
4445 return bfd_reloc_ok;
4447 case R_ARM_GOTOFF32:
4448 /* Relocation is relative to the start of the
4449 global offset table. */
4451 BFD_ASSERT (sgot != NULL);
4453 return bfd_reloc_notsupported;
4455 /* If we are addressing a Thumb function, we need to adjust the
4456 address by one, so that attempts to call the function pointer will
4457 correctly interpret it as Thumb code. */
4458 if (sym_flags == STT_ARM_TFUNC)
4461 /* Note that sgot->output_offset is not involved in this
4462 calculation. We always want the start of .got. If we
4463 define _GLOBAL_OFFSET_TABLE in a different way, as is
4464 permitted by the ABI, we might have to change this
4466 value -= sgot->output_section->vma;
4467 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4468 contents, rel->r_offset, value,
4472 /* Use global offset table as symbol value. */
4473 BFD_ASSERT (sgot != NULL);
4476 return bfd_reloc_notsupported;
4478 *unresolved_reloc_p = FALSE;
4479 value = sgot->output_section->vma;
4480 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4481 contents, rel->r_offset, value,
4485 case R_ARM_GOT_PREL:
4486 /* Relocation is to the entry for this symbol in the
4487 global offset table. */
4489 return bfd_reloc_notsupported;
4496 off = h->got.offset;
4497 BFD_ASSERT (off != (bfd_vma) -1);
4498 dyn = globals->root.dynamic_sections_created;
4500 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
4502 && SYMBOL_REFERENCES_LOCAL (info, h))
4503 || (ELF_ST_VISIBILITY (h->other)
4504 && h->root.type == bfd_link_hash_undefweak))
4506 /* This is actually a static link, or it is a -Bsymbolic link
4507 and the symbol is defined locally. We must initialize this
4508 entry in the global offset table. Since the offset must
4509 always be a multiple of 4, we use the least significant bit
4510 to record whether we have initialized it already.
4512 When doing a dynamic link, we create a .rel(a).got relocation
4513 entry to initialize the value. This is done in the
4514 finish_dynamic_symbol routine. */
4519 /* If we are addressing a Thumb function, we need to
4520 adjust the address by one, so that attempts to
4521 call the function pointer will correctly
4522 interpret it as Thumb code. */
4523 if (sym_flags == STT_ARM_TFUNC)
4526 bfd_put_32 (output_bfd, value, sgot->contents + off);
4531 *unresolved_reloc_p = FALSE;
4533 value = sgot->output_offset + off;
4539 BFD_ASSERT (local_got_offsets != NULL &&
4540 local_got_offsets[r_symndx] != (bfd_vma) -1);
4542 off = local_got_offsets[r_symndx];
4544 /* The offset must always be a multiple of 4. We use the
4545 least significant bit to record whether we have already
4546 generated the necessary reloc. */
4551 /* If we are addressing a Thumb function, we need to
4552 adjust the address by one, so that attempts to
4553 call the function pointer will correctly
4554 interpret it as Thumb code. */
4555 if (sym_flags == STT_ARM_TFUNC)
4558 if (globals->use_rel)
4559 bfd_put_32 (output_bfd, value, sgot->contents + off);
4564 Elf_Internal_Rela outrel;
4567 srelgot = (bfd_get_section_by_name
4568 (dynobj, RELOC_SECTION (globals, ".got")));
4569 BFD_ASSERT (srelgot != NULL);
4571 outrel.r_addend = addend + value;
4572 outrel.r_offset = (sgot->output_section->vma
4573 + sgot->output_offset
4575 outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
4576 loc = srelgot->contents;
4577 loc += srelgot->reloc_count++ * RELOC_SIZE (globals);
4578 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
4581 local_got_offsets[r_symndx] |= 1;
4584 value = sgot->output_offset + off;
4586 if (r_type != R_ARM_GOT32)
4587 value += sgot->output_section->vma;
4589 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4590 contents, rel->r_offset, value,
4593 case R_ARM_TLS_LDO32:
4594 value = value - dtpoff_base (info);
4596 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4597 contents, rel->r_offset, value,
4600 case R_ARM_TLS_LDM32:
4604 if (globals->sgot == NULL)
4607 off = globals->tls_ldm_got.offset;
4613 /* If we don't know the module number, create a relocation
4617 Elf_Internal_Rela outrel;
4620 if (globals->srelgot == NULL)
4623 outrel.r_addend = 0;
4624 outrel.r_offset = (globals->sgot->output_section->vma
4625 + globals->sgot->output_offset + off);
4626 outrel.r_info = ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32);
4628 if (globals->use_rel)
4629 bfd_put_32 (output_bfd, outrel.r_addend,
4630 globals->sgot->contents + off);
4632 loc = globals->srelgot->contents;
4633 loc += globals->srelgot->reloc_count++ * RELOC_SIZE (globals);
4634 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
4637 bfd_put_32 (output_bfd, 1, globals->sgot->contents + off);
4639 globals->tls_ldm_got.offset |= 1;
4642 value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
4643 - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
4645 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4646 contents, rel->r_offset, value,
4650 case R_ARM_TLS_GD32:
4651 case R_ARM_TLS_IE32:
4657 if (globals->sgot == NULL)
4664 dyn = globals->root.dynamic_sections_created;
4665 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
4667 || !SYMBOL_REFERENCES_LOCAL (info, h)))
4669 *unresolved_reloc_p = FALSE;
4672 off = h->got.offset;
4673 tls_type = ((struct elf32_arm_link_hash_entry *) h)->tls_type;
4677 if (local_got_offsets == NULL)
4679 off = local_got_offsets[r_symndx];
4680 tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
4683 if (tls_type == GOT_UNKNOWN)
4690 bfd_boolean need_relocs = FALSE;
4691 Elf_Internal_Rela outrel;
4692 bfd_byte *loc = NULL;
4695 /* The GOT entries have not been initialized yet. Do it
4696 now, and emit any relocations. If both an IE GOT and a
4697 GD GOT are necessary, we emit the GD first. */
4699 if ((info->shared || indx != 0)
4701 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4702 || h->root.type != bfd_link_hash_undefweak))
4705 if (globals->srelgot == NULL)
4707 loc = globals->srelgot->contents;
4708 loc += globals->srelgot->reloc_count * RELOC_SIZE (globals);
4711 if (tls_type & GOT_TLS_GD)
4715 outrel.r_addend = 0;
4716 outrel.r_offset = (globals->sgot->output_section->vma
4717 + globals->sgot->output_offset
4719 outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DTPMOD32);
4721 if (globals->use_rel)
4722 bfd_put_32 (output_bfd, outrel.r_addend,
4723 globals->sgot->contents + cur_off);
4725 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
4726 globals->srelgot->reloc_count++;
4727 loc += RELOC_SIZE (globals);
4730 bfd_put_32 (output_bfd, value - dtpoff_base (info),
4731 globals->sgot->contents + cur_off + 4);
4734 outrel.r_addend = 0;
4735 outrel.r_info = ELF32_R_INFO (indx,
4736 R_ARM_TLS_DTPOFF32);
4737 outrel.r_offset += 4;
4739 if (globals->use_rel)
4740 bfd_put_32 (output_bfd, outrel.r_addend,
4741 globals->sgot->contents + cur_off + 4);
4744 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
4745 globals->srelgot->reloc_count++;
4746 loc += RELOC_SIZE (globals);
4751 /* If we are not emitting relocations for a
4752 general dynamic reference, then we must be in a
4753 static link or an executable link with the
4754 symbol binding locally. Mark it as belonging
4755 to module 1, the executable. */
4756 bfd_put_32 (output_bfd, 1,
4757 globals->sgot->contents + cur_off);
4758 bfd_put_32 (output_bfd, value - dtpoff_base (info),
4759 globals->sgot->contents + cur_off + 4);
4765 if (tls_type & GOT_TLS_IE)
4770 outrel.r_addend = value - dtpoff_base (info);
4772 outrel.r_addend = 0;
4773 outrel.r_offset = (globals->sgot->output_section->vma
4774 + globals->sgot->output_offset
4776 outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_TPOFF32);
4778 if (globals->use_rel)
4779 bfd_put_32 (output_bfd, outrel.r_addend,
4780 globals->sgot->contents + cur_off);
4782 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
4783 globals->srelgot->reloc_count++;
4784 loc += RELOC_SIZE (globals);
4787 bfd_put_32 (output_bfd, tpoff (info, value),
4788 globals->sgot->contents + cur_off);
4795 local_got_offsets[r_symndx] |= 1;
4798 if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32)
4800 value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
4801 - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
4803 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4804 contents, rel->r_offset, value,
4808 case R_ARM_TLS_LE32:
4811 (*_bfd_error_handler)
4812 (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
4813 input_bfd, input_section,
4814 (long) rel->r_offset, howto->name);
4818 value = tpoff (info, value);
4820 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4821 contents, rel->r_offset, value,
4825 if (globals->fix_v4bx)
4827 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
4829 /* Ensure that we have a BX instruction. */
4830 BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
4832 /* Preserve Rm (lowest four bits) and the condition code
4833 (highest four bits). Other bits encode MOV PC,Rm. */
4834 insn = (insn & 0xf000000f) | 0x01a0f000;
4836 bfd_put_32 (input_bfd, insn, hit_data);
4838 return bfd_reloc_ok;
4840 case R_ARM_MOVW_ABS_NC:
4841 case R_ARM_MOVT_ABS:
4842 case R_ARM_MOVW_PREL_NC:
4843 case R_ARM_MOVT_PREL:
4844 /* Until we properly support segment-base-relative addressing then
4845 we assume the segment base to be zero, as for the group relocations.
4846 Thus R_ARM_MOVW_BREL_NC has the same semantics as R_ARM_MOVW_ABS_NC
4847 and R_ARM_MOVT_BREL has the same semantics as R_ARM_MOVT_ABS. */
4848 case R_ARM_MOVW_BREL_NC:
4849 case R_ARM_MOVW_BREL:
4850 case R_ARM_MOVT_BREL:
4852 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
4854 if (globals->use_rel)
4856 addend = ((insn >> 4) & 0xf000) | (insn & 0xfff);
4857 signed_addend = (addend ^ 0x10000) - 0x10000;
4860 value += signed_addend;
4862 if (r_type == R_ARM_MOVW_PREL_NC || r_type == R_ARM_MOVT_PREL)
4863 value -= (input_section->output_section->vma
4864 + input_section->output_offset + rel->r_offset);
4866 if (r_type == R_ARM_MOVW_BREL && value >= 0x10000)
4867 return bfd_reloc_overflow;
4869 if (sym_flags == STT_ARM_TFUNC)
4872 if (r_type == R_ARM_MOVT_ABS || r_type == R_ARM_MOVT_PREL
4873 || r_type == R_ARM_MOVT_BREL)
4877 insn |= value & 0xfff;
4878 insn |= (value & 0xf000) << 4;
4879 bfd_put_32 (input_bfd, insn, hit_data);
4881 return bfd_reloc_ok;
4883 case R_ARM_THM_MOVW_ABS_NC:
4884 case R_ARM_THM_MOVT_ABS:
4885 case R_ARM_THM_MOVW_PREL_NC:
4886 case R_ARM_THM_MOVT_PREL:
4887 /* Until we properly support segment-base-relative addressing then
4888 we assume the segment base to be zero, as for the above relocations.
4889 Thus R_ARM_THM_MOVW_BREL_NC has the same semantics as
4890 R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_BREL has the same semantics
4891 as R_ARM_THM_MOVT_ABS. */
4892 case R_ARM_THM_MOVW_BREL_NC:
4893 case R_ARM_THM_MOVW_BREL:
4894 case R_ARM_THM_MOVT_BREL:
4898 insn = bfd_get_16 (input_bfd, hit_data) << 16;
4899 insn |= bfd_get_16 (input_bfd, hit_data + 2);
4901 if (globals->use_rel)
4903 addend = ((insn >> 4) & 0xf000)
4904 | ((insn >> 15) & 0x0800)
4905 | ((insn >> 4) & 0x0700)
4907 signed_addend = (addend ^ 0x10000) - 0x10000;
4910 value += signed_addend;
4912 if (r_type == R_ARM_THM_MOVW_PREL_NC || r_type == R_ARM_THM_MOVT_PREL)
4913 value -= (input_section->output_section->vma
4914 + input_section->output_offset + rel->r_offset);
4916 if (r_type == R_ARM_THM_MOVW_BREL && value >= 0x10000)
4917 return bfd_reloc_overflow;
4919 if (sym_flags == STT_ARM_TFUNC)
4922 if (r_type == R_ARM_THM_MOVT_ABS || r_type == R_ARM_THM_MOVT_PREL
4923 || r_type == R_ARM_THM_MOVT_BREL)
4927 insn |= (value & 0xf000) << 4;
4928 insn |= (value & 0x0800) << 15;
4929 insn |= (value & 0x0700) << 4;
4930 insn |= (value & 0x00ff);
4932 bfd_put_16 (input_bfd, insn >> 16, hit_data);
4933 bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
4935 return bfd_reloc_ok;
4937 case R_ARM_ALU_PC_G0_NC:
4938 case R_ARM_ALU_PC_G1_NC:
4939 case R_ARM_ALU_PC_G0:
4940 case R_ARM_ALU_PC_G1:
4941 case R_ARM_ALU_PC_G2:
4942 case R_ARM_ALU_SB_G0_NC:
4943 case R_ARM_ALU_SB_G1_NC:
4944 case R_ARM_ALU_SB_G0:
4945 case R_ARM_ALU_SB_G1:
4946 case R_ARM_ALU_SB_G2:
4948 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
4949 bfd_vma pc = input_section->output_section->vma
4950 + input_section->output_offset + rel->r_offset;
4951 /* sb should be the origin of the *segment* containing the symbol.
4952 It is not clear how to obtain this OS-dependent value, so we
4953 make an arbitrary choice of zero. */
4957 bfd_signed_vma signed_value;
4960 /* Determine which group of bits to select. */
4963 case R_ARM_ALU_PC_G0_NC:
4964 case R_ARM_ALU_PC_G0:
4965 case R_ARM_ALU_SB_G0_NC:
4966 case R_ARM_ALU_SB_G0:
4970 case R_ARM_ALU_PC_G1_NC:
4971 case R_ARM_ALU_PC_G1:
4972 case R_ARM_ALU_SB_G1_NC:
4973 case R_ARM_ALU_SB_G1:
4977 case R_ARM_ALU_PC_G2:
4978 case R_ARM_ALU_SB_G2:
4986 /* If REL, extract the addend from the insn. If RELA, it will
4987 have already been fetched for us. */
4988 if (globals->use_rel)
4991 bfd_vma constant = insn & 0xff;
4992 bfd_vma rotation = (insn & 0xf00) >> 8;
4995 signed_addend = constant;
4998 /* Compensate for the fact that in the instruction, the
4999 rotation is stored in multiples of 2 bits. */
5002 /* Rotate "constant" right by "rotation" bits. */
5003 signed_addend = (constant >> rotation) |
5004 (constant << (8 * sizeof (bfd_vma) - rotation));
5007 /* Determine if the instruction is an ADD or a SUB.
5008 (For REL, this determines the sign of the addend.) */
5009 negative = identify_add_or_sub (insn);
5012 (*_bfd_error_handler)
5013 (_("%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group relocations"),
5014 input_bfd, input_section,
5015 (long) rel->r_offset, howto->name);
5016 return bfd_reloc_overflow;
5019 signed_addend *= negative;
5022 /* Compute the value (X) to go in the place. */
5023 if (r_type == R_ARM_ALU_PC_G0_NC
5024 || r_type == R_ARM_ALU_PC_G1_NC
5025 || r_type == R_ARM_ALU_PC_G0
5026 || r_type == R_ARM_ALU_PC_G1
5027 || r_type == R_ARM_ALU_PC_G2)
5029 signed_value = value - pc + signed_addend;
5031 /* Section base relative. */
5032 signed_value = value - sb + signed_addend;
5034 /* If the target symbol is a Thumb function, then set the
5035 Thumb bit in the address. */
5036 if (sym_flags == STT_ARM_TFUNC)
5039 /* Calculate the value of the relevant G_n, in encoded
5040 constant-with-rotation format. */
5041 g_n = calculate_group_reloc_mask (abs (signed_value), group,
5044 /* Check for overflow if required. */
5045 if ((r_type == R_ARM_ALU_PC_G0
5046 || r_type == R_ARM_ALU_PC_G1
5047 || r_type == R_ARM_ALU_PC_G2
5048 || r_type == R_ARM_ALU_SB_G0
5049 || r_type == R_ARM_ALU_SB_G1
5050 || r_type == R_ARM_ALU_SB_G2) && residual != 0)
5052 (*_bfd_error_handler)
5053 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
5054 input_bfd, input_section,
5055 (long) rel->r_offset, abs (signed_value), howto->name);
5056 return bfd_reloc_overflow;
5059 /* Mask out the value and the ADD/SUB part of the opcode; take care
5060 not to destroy the S bit. */
5063 /* Set the opcode according to whether the value to go in the
5064 place is negative. */
5065 if (signed_value < 0)
5070 /* Encode the offset. */
5073 bfd_put_32 (input_bfd, insn, hit_data);
5075 return bfd_reloc_ok;
5077 case R_ARM_LDR_PC_G0:
5078 case R_ARM_LDR_PC_G1:
5079 case R_ARM_LDR_PC_G2:
5080 case R_ARM_LDR_SB_G0:
5081 case R_ARM_LDR_SB_G1:
5082 case R_ARM_LDR_SB_G2:
5084 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
5085 bfd_vma pc = input_section->output_section->vma
5086 + input_section->output_offset + rel->r_offset;
5087 bfd_vma sb = 0; /* See note above. */
5089 bfd_signed_vma signed_value;
5092 /* Determine which groups of bits to calculate. */
5095 case R_ARM_LDR_PC_G0:
5096 case R_ARM_LDR_SB_G0:
5100 case R_ARM_LDR_PC_G1:
5101 case R_ARM_LDR_SB_G1:
5105 case R_ARM_LDR_PC_G2:
5106 case R_ARM_LDR_SB_G2:
5114 /* If REL, extract the addend from the insn. If RELA, it will
5115 have already been fetched for us. */
5116 if (globals->use_rel)
5118 int negative = (insn & (1 << 23)) ? 1 : -1;
5119 signed_addend = negative * (insn & 0xfff);
5122 /* Compute the value (X) to go in the place. */
5123 if (r_type == R_ARM_LDR_PC_G0
5124 || r_type == R_ARM_LDR_PC_G1
5125 || r_type == R_ARM_LDR_PC_G2)
5127 signed_value = value - pc + signed_addend;
5129 /* Section base relative. */
5130 signed_value = value - sb + signed_addend;
5132 /* Calculate the value of the relevant G_{n-1} to obtain
5133 the residual at that stage. */
5134 calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
5136 /* Check for overflow. */
5137 if (residual >= 0x1000)
5139 (*_bfd_error_handler)
5140 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
5141 input_bfd, input_section,
5142 (long) rel->r_offset, abs (signed_value), howto->name);
5143 return bfd_reloc_overflow;
5146 /* Mask out the value and U bit. */
5149 /* Set the U bit if the value to go in the place is non-negative. */
5150 if (signed_value >= 0)
5153 /* Encode the offset. */
5156 bfd_put_32 (input_bfd, insn, hit_data);
5158 return bfd_reloc_ok;
5160 case R_ARM_LDRS_PC_G0:
5161 case R_ARM_LDRS_PC_G1:
5162 case R_ARM_LDRS_PC_G2:
5163 case R_ARM_LDRS_SB_G0:
5164 case R_ARM_LDRS_SB_G1:
5165 case R_ARM_LDRS_SB_G2:
5167 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
5168 bfd_vma pc = input_section->output_section->vma
5169 + input_section->output_offset + rel->r_offset;
5170 bfd_vma sb = 0; /* See note above. */
5172 bfd_signed_vma signed_value;
5175 /* Determine which groups of bits to calculate. */
5178 case R_ARM_LDRS_PC_G0:
5179 case R_ARM_LDRS_SB_G0:
5183 case R_ARM_LDRS_PC_G1:
5184 case R_ARM_LDRS_SB_G1:
5188 case R_ARM_LDRS_PC_G2:
5189 case R_ARM_LDRS_SB_G2:
5197 /* If REL, extract the addend from the insn. If RELA, it will
5198 have already been fetched for us. */
5199 if (globals->use_rel)
5201 int negative = (insn & (1 << 23)) ? 1 : -1;
5202 signed_addend = negative * (((insn & 0xf00) >> 4) + (insn & 0xf));
5205 /* Compute the value (X) to go in the place. */
5206 if (r_type == R_ARM_LDRS_PC_G0
5207 || r_type == R_ARM_LDRS_PC_G1
5208 || r_type == R_ARM_LDRS_PC_G2)
5210 signed_value = value - pc + signed_addend;
5212 /* Section base relative. */
5213 signed_value = value - sb + signed_addend;
5215 /* Calculate the value of the relevant G_{n-1} to obtain
5216 the residual at that stage. */
5217 calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
5219 /* Check for overflow. */
5220 if (residual >= 0x100)
5222 (*_bfd_error_handler)
5223 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
5224 input_bfd, input_section,
5225 (long) rel->r_offset, abs (signed_value), howto->name);
5226 return bfd_reloc_overflow;
5229 /* Mask out the value and U bit. */
5232 /* Set the U bit if the value to go in the place is non-negative. */
5233 if (signed_value >= 0)
5236 /* Encode the offset. */
5237 insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
5239 bfd_put_32 (input_bfd, insn, hit_data);
5241 return bfd_reloc_ok;
5243 case R_ARM_LDC_PC_G0:
5244 case R_ARM_LDC_PC_G1:
5245 case R_ARM_LDC_PC_G2:
5246 case R_ARM_LDC_SB_G0:
5247 case R_ARM_LDC_SB_G1:
5248 case R_ARM_LDC_SB_G2:
5250 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
5251 bfd_vma pc = input_section->output_section->vma
5252 + input_section->output_offset + rel->r_offset;
5253 bfd_vma sb = 0; /* See note above. */
5255 bfd_signed_vma signed_value;
5258 /* Determine which groups of bits to calculate. */
5261 case R_ARM_LDC_PC_G0:
5262 case R_ARM_LDC_SB_G0:
5266 case R_ARM_LDC_PC_G1:
5267 case R_ARM_LDC_SB_G1:
5271 case R_ARM_LDC_PC_G2:
5272 case R_ARM_LDC_SB_G2:
5280 /* If REL, extract the addend from the insn. If RELA, it will
5281 have already been fetched for us. */
5282 if (globals->use_rel)
5284 int negative = (insn & (1 << 23)) ? 1 : -1;
5285 signed_addend = negative * ((insn & 0xff) << 2);
5288 /* Compute the value (X) to go in the place. */
5289 if (r_type == R_ARM_LDC_PC_G0
5290 || r_type == R_ARM_LDC_PC_G1
5291 || r_type == R_ARM_LDC_PC_G2)
5293 signed_value = value - pc + signed_addend;
5295 /* Section base relative. */
5296 signed_value = value - sb + signed_addend;
5298 /* Calculate the value of the relevant G_{n-1} to obtain
5299 the residual at that stage. */
5300 calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
5302 /* Check for overflow. (The absolute value to go in the place must be
5303 divisible by four and, after having been divided by four, must
5304 fit in eight bits.) */
5305 if ((residual & 0x3) != 0 || residual >= 0x400)
5307 (*_bfd_error_handler)
5308 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
5309 input_bfd, input_section,
5310 (long) rel->r_offset, abs (signed_value), howto->name);
5311 return bfd_reloc_overflow;
5314 /* Mask out the value and U bit. */
5317 /* Set the U bit if the value to go in the place is non-negative. */
5318 if (signed_value >= 0)
5321 /* Encode the offset. */
5322 insn |= residual >> 2;
5324 bfd_put_32 (input_bfd, insn, hit_data);
5326 return bfd_reloc_ok;
5329 return bfd_reloc_notsupported;
5335 uleb128_size (unsigned int i)
5347 /* Return TRUE if the attribute has the default value (0/""). */
5349 is_default_attr (aeabi_attribute *attr)
5351 if ((attr->type & 1) && attr->i != 0)
5353 if ((attr->type & 2) && attr->s && *attr->s)
5359 /* Return the size of a single attribute. */
5361 eabi_attr_size(int tag, aeabi_attribute *attr)
5365 if (is_default_attr (attr))
5368 size = uleb128_size (tag);
5370 size += uleb128_size (attr->i);
5372 size += strlen ((char *)attr->s) + 1;
5376 /* Returns the size of the eabi object attributess section. */
5378 elf32_arm_eabi_attr_size (bfd *abfd)
5381 aeabi_attribute *attr;
5382 aeabi_attribute_list *list;
5385 attr = elf32_arm_tdata (abfd)->known_eabi_attributes;
5386 size = 16; /* 'A' <size> "aeabi" 0x1 <size>. */
5387 for (i = 4; i < NUM_KNOWN_ATTRIBUTES; i++)
5388 size += eabi_attr_size (i, &attr[i]);
5390 for (list = elf32_arm_tdata (abfd)->other_eabi_attributes;
5393 size += eabi_attr_size (list->tag, &list->attr);
5399 write_uleb128 (bfd_byte *p, unsigned int val)
5414 /* Write attribute ATTR to butter P, and return a pointer to the following
5417 write_eabi_attribute (bfd_byte *p, int tag, aeabi_attribute *attr)
5419 /* Suppress default entries. */
5420 if (is_default_attr(attr))
5423 p = write_uleb128 (p, tag);
5425 p = write_uleb128 (p, attr->i);
5430 len = strlen (attr->s) + 1;
5431 memcpy (p, attr->s, len);
5438 /* Write the contents of the eabi attributes section to p. */
5440 elf32_arm_set_eabi_attr_contents (bfd *abfd, bfd_byte *contents, bfd_vma size)
5443 aeabi_attribute *attr;
5444 aeabi_attribute_list *list;
5449 bfd_put_32 (abfd, size - 1, p);
5451 memcpy (p, "aeabi", 6);
5454 bfd_put_32 (abfd, size - 11, p);
5457 attr = elf32_arm_tdata (abfd)->known_eabi_attributes;
5458 for (i = 4; i < NUM_KNOWN_ATTRIBUTES; i++)
5459 p = write_eabi_attribute (p, i, &attr[i]);
5461 for (list = elf32_arm_tdata (abfd)->other_eabi_attributes;
5464 p = write_eabi_attribute (p, list->tag, &list->attr);
5467 /* Override final_link to handle EABI object attribute sections. */
5470 elf32_arm_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
5473 struct bfd_link_order *p;
5474 asection *attr_section = NULL;
5478 /* elf32_arm_merge_private_bfd_data will already have merged the
5479 object attributes. Remove the input sections from the link, and set
5480 the contents of the output secton. */
5481 for (o = abfd->sections; o != NULL; o = o->next)
5483 if (strcmp (o->name, ".ARM.attributes") == 0)
5485 for (p = o->map_head.link_order; p != NULL; p = p->next)
5487 asection *input_section;
5489 if (p->type != bfd_indirect_link_order)
5491 input_section = p->u.indirect.section;
5492 /* Hack: reset the SEC_HAS_CONTENTS flag so that
5493 elf_link_input_bfd ignores this section. */
5494 input_section->flags &= ~SEC_HAS_CONTENTS;
5497 size = elf32_arm_eabi_attr_size (abfd);
5498 bfd_set_section_size (abfd, o, size);
5500 /* Skip this section later on. */
5501 o->map_head.link_order = NULL;
5504 /* Invoke the ELF linker to do all the work. */
5505 if (!bfd_elf_final_link (abfd, info))
5510 contents = bfd_malloc(size);
5511 if (contents == NULL)
5513 elf32_arm_set_eabi_attr_contents (abfd, contents, size);
5514 bfd_set_section_contents (abfd, attr_section, contents, 0, size);
5521 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS. */
5523 arm_add_to_rel (bfd * abfd,
5525 reloc_howto_type * howto,
5526 bfd_signed_vma increment)
5528 bfd_signed_vma addend;
5530 if (howto->type == R_ARM_THM_CALL)
5532 int upper_insn, lower_insn;
5535 upper_insn = bfd_get_16 (abfd, address);
5536 lower_insn = bfd_get_16 (abfd, address + 2);
5537 upper = upper_insn & 0x7ff;
5538 lower = lower_insn & 0x7ff;
5540 addend = (upper << 12) | (lower << 1);
5541 addend += increment;
5544 upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
5545 lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
5547 bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
5548 bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
5554 contents = bfd_get_32 (abfd, address);
5556 /* Get the (signed) value from the instruction. */
5557 addend = contents & howto->src_mask;
5558 if (addend & ((howto->src_mask + 1) >> 1))
5560 bfd_signed_vma mask;
5563 mask &= ~ howto->src_mask;
5567 /* Add in the increment, (which is a byte value). */
5568 switch (howto->type)
5571 addend += increment;
5578 addend <<= howto->size;
5579 addend += increment;
5581 /* Should we check for overflow here ? */
5583 /* Drop any undesired bits. */
5584 addend >>= howto->rightshift;
5588 contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
5590 bfd_put_32 (abfd, contents, address);
5594 #define IS_ARM_TLS_RELOC(R_TYPE) \
5595 ((R_TYPE) == R_ARM_TLS_GD32 \
5596 || (R_TYPE) == R_ARM_TLS_LDO32 \
5597 || (R_TYPE) == R_ARM_TLS_LDM32 \
5598 || (R_TYPE) == R_ARM_TLS_DTPOFF32 \
5599 || (R_TYPE) == R_ARM_TLS_DTPMOD32 \
5600 || (R_TYPE) == R_ARM_TLS_TPOFF32 \
5601 || (R_TYPE) == R_ARM_TLS_LE32 \
5602 || (R_TYPE) == R_ARM_TLS_IE32)
5604 /* Relocate an ARM ELF section. */
5606 elf32_arm_relocate_section (bfd * output_bfd,
5607 struct bfd_link_info * info,
5609 asection * input_section,
5610 bfd_byte * contents,
5611 Elf_Internal_Rela * relocs,
5612 Elf_Internal_Sym * local_syms,
5613 asection ** local_sections)
5615 Elf_Internal_Shdr *symtab_hdr;
5616 struct elf_link_hash_entry **sym_hashes;
5617 Elf_Internal_Rela *rel;
5618 Elf_Internal_Rela *relend;
5620 struct elf32_arm_link_hash_table * globals;
5622 globals = elf32_arm_hash_table (info);
5623 if (info->relocatable && !globals->use_rel)
5626 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
5627 sym_hashes = elf_sym_hashes (input_bfd);
5630 relend = relocs + input_section->reloc_count;
5631 for (; rel < relend; rel++)
5634 reloc_howto_type * howto;
5635 unsigned long r_symndx;
5636 Elf_Internal_Sym * sym;
5638 struct elf_link_hash_entry * h;
5640 bfd_reloc_status_type r;
5643 bfd_boolean unresolved_reloc = FALSE;
5645 r_symndx = ELF32_R_SYM (rel->r_info);
5646 r_type = ELF32_R_TYPE (rel->r_info);
5647 r_type = arm_real_reloc_type (globals, r_type);
5649 if ( r_type == R_ARM_GNU_VTENTRY
5650 || r_type == R_ARM_GNU_VTINHERIT)
5653 bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
5654 howto = bfd_reloc.howto;
5656 if (info->relocatable && globals->use_rel)
5658 /* This is a relocatable link. We don't have to change
5659 anything, unless the reloc is against a section symbol,
5660 in which case we have to adjust according to where the
5661 section symbol winds up in the output section. */
5662 if (r_symndx < symtab_hdr->sh_info)
5664 sym = local_syms + r_symndx;
5665 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5667 sec = local_sections[r_symndx];
5668 arm_add_to_rel (input_bfd, contents + rel->r_offset,
5670 (bfd_signed_vma) (sec->output_offset
5678 /* This is a final link. */
5683 if (r_symndx < symtab_hdr->sh_info)
5685 sym = local_syms + r_symndx;
5686 sym_type = ELF32_ST_TYPE (sym->st_info);
5687 sec = local_sections[r_symndx];
5688 if (globals->use_rel)
5690 relocation = (sec->output_section->vma
5691 + sec->output_offset
5693 if ((sec->flags & SEC_MERGE)
5694 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5697 bfd_vma addend, value;
5699 if (howto->rightshift)
5701 (*_bfd_error_handler)
5702 (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
5703 input_bfd, input_section,
5704 (long) rel->r_offset, howto->name);
5708 value = bfd_get_32 (input_bfd, contents + rel->r_offset);
5710 /* Get the (signed) value from the instruction. */
5711 addend = value & howto->src_mask;
5712 if (addend & ((howto->src_mask + 1) >> 1))
5714 bfd_signed_vma mask;
5717 mask &= ~ howto->src_mask;
5722 _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
5724 addend += msec->output_section->vma + msec->output_offset;
5725 value = (value & ~ howto->dst_mask) | (addend & howto->dst_mask);
5726 bfd_put_32 (input_bfd, value, contents + rel->r_offset);
5730 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
5736 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
5737 r_symndx, symtab_hdr, sym_hashes,
5739 unresolved_reloc, warned);
5745 name = h->root.root.string;
5748 name = (bfd_elf_string_from_elf_section
5749 (input_bfd, symtab_hdr->sh_link, sym->st_name));
5750 if (name == NULL || *name == '\0')
5751 name = bfd_section_name (input_bfd, sec);
5755 && r_type != R_ARM_NONE
5757 || h->root.type == bfd_link_hash_defined
5758 || h->root.type == bfd_link_hash_defweak)
5759 && IS_ARM_TLS_RELOC (r_type) != (sym_type == STT_TLS))
5761 (*_bfd_error_handler)
5762 ((sym_type == STT_TLS
5763 ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
5764 : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
5767 (long) rel->r_offset,
5772 r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
5773 input_section, contents, rel,
5774 relocation, info, sec, name,
5775 (h ? ELF_ST_TYPE (h->type) :
5776 ELF_ST_TYPE (sym->st_info)), h,
5779 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5780 because such sections are not SEC_ALLOC and thus ld.so will
5781 not process them. */
5782 if (unresolved_reloc
5783 && !((input_section->flags & SEC_DEBUGGING) != 0
5786 (*_bfd_error_handler)
5787 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5790 (long) rel->r_offset,
5792 h->root.root.string);
5796 if (r != bfd_reloc_ok)
5798 const char * msg = (const char *) 0;
5802 case bfd_reloc_overflow:
5803 /* If the overflowing reloc was to an undefined symbol,
5804 we have already printed one error message and there
5805 is no point complaining again. */
5807 h->root.type != bfd_link_hash_undefined)
5808 && (!((*info->callbacks->reloc_overflow)
5809 (info, (h ? &h->root : NULL), name, howto->name,
5810 (bfd_vma) 0, input_bfd, input_section,
5815 case bfd_reloc_undefined:
5816 if (!((*info->callbacks->undefined_symbol)
5817 (info, name, input_bfd, input_section,
5818 rel->r_offset, TRUE)))
5822 case bfd_reloc_outofrange:
5823 msg = _("internal error: out of range error");
5826 case bfd_reloc_notsupported:
5827 msg = _("internal error: unsupported relocation error");
5830 case bfd_reloc_dangerous:
5831 msg = _("internal error: dangerous error");
5835 msg = _("internal error: unknown error");
5839 if (!((*info->callbacks->warning)
5840 (info, msg, name, input_bfd, input_section,
5851 /* Allocate/find an object attribute. */
5852 static aeabi_attribute *
5853 elf32_arm_new_eabi_attr (bfd *abfd, int tag)
5855 aeabi_attribute *attr;
5856 aeabi_attribute_list *list;
5857 aeabi_attribute_list *p;
5858 aeabi_attribute_list **lastp;
5861 if (tag < NUM_KNOWN_ATTRIBUTES)
5863 /* Knwon tags are preallocated. */
5864 attr = &elf32_arm_tdata (abfd)->known_eabi_attributes[tag];
5868 /* Create a new tag. */
5869 list = (aeabi_attribute_list *)
5870 bfd_alloc (abfd, sizeof (aeabi_attribute_list));
5871 memset (list, 0, sizeof (aeabi_attribute_list));
5873 /* Keep the tag list in order. */
5874 lastp = &elf32_arm_tdata (abfd)->other_eabi_attributes;
5875 for (p = *lastp; p; p = p->next)
5881 list->next = *lastp;
5890 elf32_arm_get_eabi_attr_int (bfd *abfd, int tag)
5892 aeabi_attribute_list *p;
5894 if (tag < NUM_KNOWN_ATTRIBUTES)
5896 /* Knwon tags are preallocated. */
5897 return elf32_arm_tdata (abfd)->known_eabi_attributes[tag].i;
5901 for (p = elf32_arm_tdata (abfd)->other_eabi_attributes;
5915 elf32_arm_add_eabi_attr_int (bfd *abfd, int tag, unsigned int i)
5917 aeabi_attribute *attr;
5919 attr = elf32_arm_new_eabi_attr (abfd, tag);
5925 attr_strdup (bfd *abfd, const char * s)
5930 len = strlen (s) + 1;
5931 p = (char *)bfd_alloc(abfd, len);
5932 return memcpy (p, s, len);
5936 elf32_arm_add_eabi_attr_string (bfd *abfd, int tag, const char *s)
5938 aeabi_attribute *attr;
5940 attr = elf32_arm_new_eabi_attr (abfd, tag);
5942 attr->s = attr_strdup (abfd, s);
5946 elf32_arm_add_eabi_attr_compat (bfd *abfd, unsigned int i, const char *s)
5948 aeabi_attribute_list *list;
5949 aeabi_attribute_list *p;
5950 aeabi_attribute_list **lastp;
5952 list = (aeabi_attribute_list *)
5953 bfd_alloc (abfd, sizeof (aeabi_attribute_list));
5954 memset (list, 0, sizeof (aeabi_attribute_list));
5955 list->tag = Tag_compatibility;
5956 list->attr.type = 3;
5958 list->attr.s = attr_strdup (abfd, s);
5960 lastp = &elf32_arm_tdata (abfd)->other_eabi_attributes;
5961 for (p = *lastp; p; p = p->next)
5964 if (p->tag != Tag_compatibility)
5966 cmp = strcmp(s, p->attr.s);
5967 if (cmp < 0 || (cmp == 0 && i < p->attr.i))
5971 list->next = *lastp;
5975 /* Set the right machine number. */
5978 elf32_arm_object_p (bfd *abfd)
5982 mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
5984 if (mach != bfd_mach_arm_unknown)
5985 bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
5987 else if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
5988 bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
5991 bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
5996 /* Function to keep ARM specific flags in the ELF header. */
5999 elf32_arm_set_private_flags (bfd *abfd, flagword flags)
6001 if (elf_flags_init (abfd)
6002 && elf_elfheader (abfd)->e_flags != flags)
6004 if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
6006 if (flags & EF_ARM_INTERWORK)
6007 (*_bfd_error_handler)
6008 (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
6012 (_("Warning: Clearing the interworking flag of %B due to outside request"),
6018 elf_elfheader (abfd)->e_flags = flags;
6019 elf_flags_init (abfd) = TRUE;
6025 /* Copy the eabi object attribute from IBFD to OBFD. */
6027 copy_eabi_attributes (bfd *ibfd, bfd *obfd)
6029 aeabi_attribute *in_attr;
6030 aeabi_attribute *out_attr;
6031 aeabi_attribute_list *list;
6034 in_attr = elf32_arm_tdata (ibfd)->known_eabi_attributes;
6035 out_attr = elf32_arm_tdata (obfd)->known_eabi_attributes;
6036 for (i = 4; i < NUM_KNOWN_ATTRIBUTES; i++)
6038 out_attr->i = in_attr->i;
6039 if (in_attr->s && *in_attr->s)
6040 out_attr->s = attr_strdup (obfd, in_attr->s);
6045 for (list = elf32_arm_tdata (ibfd)->other_eabi_attributes;
6049 in_attr = &list->attr;
6050 switch (in_attr->type)
6053 elf32_arm_add_eabi_attr_int (obfd, list->tag, in_attr->i);
6056 elf32_arm_add_eabi_attr_string (obfd, list->tag, in_attr->s);
6059 elf32_arm_add_eabi_attr_compat (obfd, in_attr->i, in_attr->s);
6068 /* Copy backend specific data from one object module to another. */
6071 elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
6076 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6077 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6080 in_flags = elf_elfheader (ibfd)->e_flags;
6081 out_flags = elf_elfheader (obfd)->e_flags;
6083 if (elf_flags_init (obfd)
6084 && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
6085 && in_flags != out_flags)
6087 /* Cannot mix APCS26 and APCS32 code. */
6088 if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
6091 /* Cannot mix float APCS and non-float APCS code. */
6092 if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
6095 /* If the src and dest have different interworking flags
6096 then turn off the interworking bit. */
6097 if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
6099 if (out_flags & EF_ARM_INTERWORK)
6101 (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
6104 in_flags &= ~EF_ARM_INTERWORK;
6107 /* Likewise for PIC, though don't warn for this case. */
6108 if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
6109 in_flags &= ~EF_ARM_PIC;
6112 elf_elfheader (obfd)->e_flags = in_flags;
6113 elf_flags_init (obfd) = TRUE;
6115 /* Also copy the EI_OSABI field. */
6116 elf_elfheader (obfd)->e_ident[EI_OSABI] =
6117 elf_elfheader (ibfd)->e_ident[EI_OSABI];
6119 /* Copy EABI object attributes. */
6120 copy_eabi_attributes (ibfd, obfd);
6125 /* Values for Tag_ABI_PCS_R9_use. */
6134 /* Values for Tag_ABI_PCS_RW_data. */
6137 AEABI_PCS_RW_data_absolute,
6138 AEABI_PCS_RW_data_PCrel,
6139 AEABI_PCS_RW_data_SBrel,
6140 AEABI_PCS_RW_data_unused
6143 /* Values for Tag_ABI_enum_size. */
6149 AEABI_enum_forced_wide
6152 /* Merge EABI object attributes from IBFD into OBFD. Raise an error if there
6153 are conflicting attributes. */
6155 elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
6157 aeabi_attribute *in_attr;
6158 aeabi_attribute *out_attr;
6159 aeabi_attribute_list *in_list;
6160 aeabi_attribute_list *out_list;
6161 /* Some tags have 0 = don't care, 1 = strong requirement,
6162 2 = weak requirement. */
6163 static const int order_312[3] = {3, 1, 2};
6166 if (!elf32_arm_tdata (ibfd)->known_eabi_attributes[0].i)
6168 /* This is the first object. Copy the attributes. */
6169 copy_eabi_attributes (ibfd, obfd);
6173 /* Use the Tag_null value to indicate the attributes have been
6175 elf32_arm_tdata (ibfd)->known_eabi_attributes[0].i = 1;
6177 in_attr = elf32_arm_tdata (ibfd)->known_eabi_attributes;
6178 out_attr = elf32_arm_tdata (obfd)->known_eabi_attributes;
6179 /* This needs to happen before Tag_ABI_FP_number_model is merged. */
6180 if (in_attr[Tag_ABI_VFP_args].i != out_attr[Tag_ABI_VFP_args].i)
6182 /* Ignore mismatches if teh object doesn't use floating point. */
6183 if (out_attr[Tag_ABI_FP_number_model].i == 0)
6184 out_attr[Tag_ABI_VFP_args].i = in_attr[Tag_ABI_VFP_args].i;
6185 else if (in_attr[Tag_ABI_FP_number_model].i != 0)
6188 (_("ERROR: %B uses VFP register arguments, %B does not"),
6194 for (i = 4; i < NUM_KNOWN_ATTRIBUTES; i++)
6196 /* Merge this attribute with existing attributes. */
6199 case Tag_CPU_raw_name:
6201 /* Use whichever has the greatest architecture requirements. */
6202 if (in_attr[Tag_CPU_arch].i > out_attr[Tag_CPU_arch].i)
6203 out_attr[i].s = attr_strdup(obfd, in_attr[i].s);
6206 case Tag_ABI_optimization_goals:
6207 case Tag_ABI_FP_optimization_goals:
6208 /* Use the first value seen. */
6212 case Tag_ARM_ISA_use:
6213 case Tag_THUMB_ISA_use:
6217 /* ??? Do NEON and WMMX conflict? */
6218 case Tag_ABI_FP_rounding:
6219 case Tag_ABI_FP_denormal:
6220 case Tag_ABI_FP_exceptions:
6221 case Tag_ABI_FP_user_exceptions:
6222 case Tag_ABI_FP_number_model:
6223 case Tag_ABI_align8_preserved:
6224 case Tag_ABI_HardFP_use:
6225 /* Use the largest value specified. */
6226 if (in_attr[i].i > out_attr[i].i)
6227 out_attr[i].i = in_attr[i].i;
6230 case Tag_CPU_arch_profile:
6231 /* Warn if conflicting architecture profiles used. */
6232 if (out_attr[i].i && in_attr[i].i && in_attr[i].i != out_attr[i].i)
6235 (_("ERROR: %B: Conflicting architecture profiles %c/%c"),
6236 ibfd, in_attr[i].i, out_attr[i].i);
6240 out_attr[i].i = in_attr[i].i;
6242 case Tag_PCS_config:
6243 if (out_attr[i].i == 0)
6244 out_attr[i].i = in_attr[i].i;
6245 else if (in_attr[i].i != 0 && out_attr[i].i != 0)
6247 /* It's sometimes ok to mix different configs, so this is only
6250 (_("Warning: %B: Conflicting platform configuration"), ibfd);
6253 case Tag_ABI_PCS_R9_use:
6254 if (out_attr[i].i != AEABI_R9_unused
6255 && in_attr[i].i != AEABI_R9_unused)
6258 (_("ERROR: %B: Conflicting use of R9"), ibfd);
6261 if (out_attr[i].i == AEABI_R9_unused)
6262 out_attr[i].i = in_attr[i].i;
6264 case Tag_ABI_PCS_RW_data:
6265 if (in_attr[i].i == AEABI_PCS_RW_data_SBrel
6266 && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_SB
6267 && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_unused)
6270 (_("ERROR: %B: SB relative addressing conflicts with use of R9"),
6274 /* Use the smallest value specified. */
6275 if (in_attr[i].i < out_attr[i].i)
6276 out_attr[i].i = in_attr[i].i;
6278 case Tag_ABI_PCS_RO_data:
6279 /* Use the smallest value specified. */
6280 if (in_attr[i].i < out_attr[i].i)
6281 out_attr[i].i = in_attr[i].i;
6283 case Tag_ABI_PCS_GOT_use:
6284 if (in_attr[i].i > 2 || out_attr[i].i > 2
6285 || order_312[in_attr[i].i] < order_312[out_attr[i].i])
6286 out_attr[i].i = in_attr[i].i;
6288 case Tag_ABI_PCS_wchar_t:
6289 if (out_attr[i].i && in_attr[i].i && out_attr[i].i != in_attr[i].i)
6292 (_("ERROR: %B: Conflicting definitions of wchar_t"), ibfd);
6296 out_attr[i].i = in_attr[i].i;
6298 case Tag_ABI_align8_needed:
6299 /* ??? Check against Tag_ABI_align8_preserved. */
6300 if (in_attr[i].i > 2 || out_attr[i].i > 2
6301 || order_312[in_attr[i].i] < order_312[out_attr[i].i])
6302 out_attr[i].i = in_attr[i].i;
6304 case Tag_ABI_enum_size:
6305 if (in_attr[i].i != AEABI_enum_unused)
6307 if (out_attr[i].i == AEABI_enum_unused
6308 || out_attr[i].i == AEABI_enum_forced_wide)
6310 /* The existing object is compatible with anything.
6311 Use whatever requirements the new object has. */
6312 out_attr[i].i = in_attr[i].i;
6314 else if (in_attr[i].i != AEABI_enum_forced_wide
6315 && out_attr[i].i != in_attr[i].i)
6318 (_("ERROR: %B: Conflicting enum sizes"), ibfd);
6322 case Tag_ABI_VFP_args:
6325 case Tag_ABI_WMMX_args:
6326 if (in_attr[i].i != out_attr[i].i)
6329 (_("ERROR: %B uses iWMMXt register arguments, %B does not"),
6334 default: /* All known attributes should be explicitly covered. */
6339 in_list = elf32_arm_tdata (ibfd)->other_eabi_attributes;
6340 out_list = elf32_arm_tdata (ibfd)->other_eabi_attributes;
6341 while (in_list && in_list->tag == Tag_compatibility)
6343 in_attr = &in_list->attr;
6344 if (in_attr->i == 0)
6346 if (in_attr->i == 1)
6349 (_("ERROR: %B: Must be processed by '%s' toolchain"),
6353 if (!out_list || out_list->tag != Tag_compatibility
6354 || strcmp (in_attr->s, out_list->attr.s) != 0)
6356 /* Add this compatibility tag to the output. */
6357 elf32_arm_add_eabi_attr_compat (obfd, in_attr->i, in_attr->s);
6360 out_attr = &out_list->attr;
6361 /* Check all the input tags with the same identifier. */
6364 if (out_list->tag != Tag_compatibility
6365 || in_attr->i != out_attr->i
6366 || strcmp (in_attr->s, out_attr->s) != 0)
6369 (_("ERROR: %B: Incompatible object tag '%s':%d"),
6370 ibfd, in_attr->s, in_attr->i);
6373 in_list = in_list->next;
6374 if (in_list->tag != Tag_compatibility
6375 || strcmp (in_attr->s, in_list->attr.s) != 0)
6377 in_attr = &in_list->attr;
6378 out_list = out_list->next;
6380 out_attr = &out_list->attr;
6383 /* Check the output doesn't have extra tags with this identifier. */
6384 if (out_list && out_list->tag == Tag_compatibility
6385 && strcmp (in_attr->s, out_list->attr.s) == 0)
6388 (_("ERROR: %B: Incompatible object tag '%s':%d"),
6389 ibfd, in_attr->s, out_list->attr.i);
6394 for (; in_list; in_list = in_list->next)
6396 if ((in_list->tag & 128) < 64)
6399 (_("Warning: %B: Unknown EABI object attribute %d"),
6400 ibfd, in_list->tag);
6408 /* Return TRUE if the two EABI versions are incompatible. */
6411 elf32_arm_versions_compatible (unsigned iver, unsigned over)
6413 /* v4 and v5 are the same spec before and after it was released,
6414 so allow mixing them. */
6415 if ((iver == EF_ARM_EABI_VER4 && over == EF_ARM_EABI_VER5)
6416 || (iver == EF_ARM_EABI_VER5 && over == EF_ARM_EABI_VER4))
6419 return (iver == over);
6422 /* Merge backend specific data from an object file to the output
6423 object file when linking. */
6426 elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
6430 bfd_boolean flags_compatible = TRUE;
6433 /* Check if we have the same endianess. */
6434 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
6437 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6438 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6441 if (!elf32_arm_merge_eabi_attributes (ibfd, obfd))
6444 /* The input BFD must have had its flags initialised. */
6445 /* The following seems bogus to me -- The flags are initialized in
6446 the assembler but I don't think an elf_flags_init field is
6447 written into the object. */
6448 /* BFD_ASSERT (elf_flags_init (ibfd)); */
6450 in_flags = elf_elfheader (ibfd)->e_flags;
6451 out_flags = elf_elfheader (obfd)->e_flags;
6453 if (!elf_flags_init (obfd))
6455 /* If the input is the default architecture and had the default
6456 flags then do not bother setting the flags for the output
6457 architecture, instead allow future merges to do this. If no
6458 future merges ever set these flags then they will retain their
6459 uninitialised values, which surprise surprise, correspond
6460 to the default values. */
6461 if (bfd_get_arch_info (ibfd)->the_default
6462 && elf_elfheader (ibfd)->e_flags == 0)
6465 elf_flags_init (obfd) = TRUE;
6466 elf_elfheader (obfd)->e_flags = in_flags;
6468 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
6469 && bfd_get_arch_info (obfd)->the_default)
6470 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
6475 /* Determine what should happen if the input ARM architecture
6476 does not match the output ARM architecture. */
6477 if (! bfd_arm_merge_machines (ibfd, obfd))
6480 /* Identical flags must be compatible. */
6481 if (in_flags == out_flags)
6484 /* Check to see if the input BFD actually contains any sections. If
6485 not, its flags may not have been initialised either, but it
6486 cannot actually cause any incompatiblity. Do not short-circuit
6487 dynamic objects; their section list may be emptied by
6488 elf_link_add_object_symbols.
6490 Also check to see if there are no code sections in the input.
6491 In this case there is no need to check for code specific flags.
6492 XXX - do we need to worry about floating-point format compatability
6493 in data sections ? */
6494 if (!(ibfd->flags & DYNAMIC))
6496 bfd_boolean null_input_bfd = TRUE;
6497 bfd_boolean only_data_sections = TRUE;
6499 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
6501 /* Ignore synthetic glue sections. */
6502 if (strcmp (sec->name, ".glue_7")
6503 && strcmp (sec->name, ".glue_7t"))
6505 if ((bfd_get_section_flags (ibfd, sec)
6506 & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
6507 == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
6508 only_data_sections = FALSE;
6510 null_input_bfd = FALSE;
6515 if (null_input_bfd || only_data_sections)
6519 /* Complain about various flag mismatches. */
6520 if (!elf32_arm_versions_compatible (EF_ARM_EABI_VERSION (in_flags),
6521 EF_ARM_EABI_VERSION (out_flags)))
6524 (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
6526 (in_flags & EF_ARM_EABIMASK) >> 24,
6527 (out_flags & EF_ARM_EABIMASK) >> 24);
6531 /* Not sure what needs to be checked for EABI versions >= 1. */
6532 /* VxWorks libraries do not use these flags. */
6533 if (get_elf_backend_data (obfd) != &elf32_arm_vxworks_bed
6534 && get_elf_backend_data (ibfd) != &elf32_arm_vxworks_bed
6535 && EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
6537 if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
6540 (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
6542 in_flags & EF_ARM_APCS_26 ? 26 : 32,
6543 out_flags & EF_ARM_APCS_26 ? 26 : 32);
6544 flags_compatible = FALSE;
6547 if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
6549 if (in_flags & EF_ARM_APCS_FLOAT)
6551 (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"),
6555 (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"),
6558 flags_compatible = FALSE;
6561 if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
6563 if (in_flags & EF_ARM_VFP_FLOAT)
6565 (_("ERROR: %B uses VFP instructions, whereas %B does not"),
6569 (_("ERROR: %B uses FPA instructions, whereas %B does not"),
6572 flags_compatible = FALSE;
6575 if ((in_flags & EF_ARM_MAVERICK_FLOAT) != (out_flags & EF_ARM_MAVERICK_FLOAT))
6577 if (in_flags & EF_ARM_MAVERICK_FLOAT)
6579 (_("ERROR: %B uses Maverick instructions, whereas %B does not"),
6583 (_("ERROR: %B does not use Maverick instructions, whereas %B does"),
6586 flags_compatible = FALSE;
6589 #ifdef EF_ARM_SOFT_FLOAT
6590 if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
6592 /* We can allow interworking between code that is VFP format
6593 layout, and uses either soft float or integer regs for
6594 passing floating point arguments and results. We already
6595 know that the APCS_FLOAT flags match; similarly for VFP
6597 if ((in_flags & EF_ARM_APCS_FLOAT) != 0
6598 || (in_flags & EF_ARM_VFP_FLOAT) == 0)
6600 if (in_flags & EF_ARM_SOFT_FLOAT)
6602 (_("ERROR: %B uses software FP, whereas %B uses hardware FP"),
6606 (_("ERROR: %B uses hardware FP, whereas %B uses software FP"),
6609 flags_compatible = FALSE;
6614 /* Interworking mismatch is only a warning. */
6615 if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
6617 if (in_flags & EF_ARM_INTERWORK)
6620 (_("Warning: %B supports interworking, whereas %B does not"),
6626 (_("Warning: %B does not support interworking, whereas %B does"),
6632 return flags_compatible;
6635 /* Display the flags field. */
6638 elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
6640 FILE * file = (FILE *) ptr;
6641 unsigned long flags;
6643 BFD_ASSERT (abfd != NULL && ptr != NULL);
6645 /* Print normal ELF private data. */
6646 _bfd_elf_print_private_bfd_data (abfd, ptr);
6648 flags = elf_elfheader (abfd)->e_flags;
6649 /* Ignore init flag - it may not be set, despite the flags field
6650 containing valid data. */
6652 /* xgettext:c-format */
6653 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
6655 switch (EF_ARM_EABI_VERSION (flags))
6657 case EF_ARM_EABI_UNKNOWN:
6658 /* The following flag bits are GNU extensions and not part of the
6659 official ARM ELF extended ABI. Hence they are only decoded if
6660 the EABI version is not set. */
6661 if (flags & EF_ARM_INTERWORK)
6662 fprintf (file, _(" [interworking enabled]"));
6664 if (flags & EF_ARM_APCS_26)
6665 fprintf (file, " [APCS-26]");
6667 fprintf (file, " [APCS-32]");
6669 if (flags & EF_ARM_VFP_FLOAT)
6670 fprintf (file, _(" [VFP float format]"));
6671 else if (flags & EF_ARM_MAVERICK_FLOAT)
6672 fprintf (file, _(" [Maverick float format]"));
6674 fprintf (file, _(" [FPA float format]"));
6676 if (flags & EF_ARM_APCS_FLOAT)
6677 fprintf (file, _(" [floats passed in float registers]"));
6679 if (flags & EF_ARM_PIC)
6680 fprintf (file, _(" [position independent]"));
6682 if (flags & EF_ARM_NEW_ABI)
6683 fprintf (file, _(" [new ABI]"));
6685 if (flags & EF_ARM_OLD_ABI)
6686 fprintf (file, _(" [old ABI]"));
6688 if (flags & EF_ARM_SOFT_FLOAT)
6689 fprintf (file, _(" [software FP]"));
6691 flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
6692 | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
6693 | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT
6694 | EF_ARM_MAVERICK_FLOAT);
6697 case EF_ARM_EABI_VER1:
6698 fprintf (file, _(" [Version1 EABI]"));
6700 if (flags & EF_ARM_SYMSARESORTED)
6701 fprintf (file, _(" [sorted symbol table]"));
6703 fprintf (file, _(" [unsorted symbol table]"));
6705 flags &= ~ EF_ARM_SYMSARESORTED;
6708 case EF_ARM_EABI_VER2:
6709 fprintf (file, _(" [Version2 EABI]"));
6711 if (flags & EF_ARM_SYMSARESORTED)
6712 fprintf (file, _(" [sorted symbol table]"));
6714 fprintf (file, _(" [unsorted symbol table]"));
6716 if (flags & EF_ARM_DYNSYMSUSESEGIDX)
6717 fprintf (file, _(" [dynamic symbols use segment index]"));
6719 if (flags & EF_ARM_MAPSYMSFIRST)
6720 fprintf (file, _(" [mapping symbols precede others]"));
6722 flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
6723 | EF_ARM_MAPSYMSFIRST);
6726 case EF_ARM_EABI_VER3:
6727 fprintf (file, _(" [Version3 EABI]"));
6730 case EF_ARM_EABI_VER4:
6731 fprintf (file, _(" [Version4 EABI]"));
6734 case EF_ARM_EABI_VER5:
6735 fprintf (file, _(" [Version5 EABI]"));
6737 if (flags & EF_ARM_BE8)
6738 fprintf (file, _(" [BE8]"));
6740 if (flags & EF_ARM_LE8)
6741 fprintf (file, _(" [LE8]"));
6743 flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
6747 fprintf (file, _(" <EABI version unrecognised>"));
6751 flags &= ~ EF_ARM_EABIMASK;
6753 if (flags & EF_ARM_RELEXEC)
6754 fprintf (file, _(" [relocatable executable]"));
6756 if (flags & EF_ARM_HASENTRY)
6757 fprintf (file, _(" [has entry point]"));
6759 flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
6762 fprintf (file, _("<Unrecognised flag bits set>"));
6770 elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
6772 switch (ELF_ST_TYPE (elf_sym->st_info))
6775 return ELF_ST_TYPE (elf_sym->st_info);
6778 /* If the symbol is not an object, return the STT_ARM_16BIT flag.
6779 This allows us to distinguish between data used by Thumb instructions
6780 and non-data (which is probably code) inside Thumb regions of an
6782 if (type != STT_OBJECT && type != STT_TLS)
6783 return ELF_ST_TYPE (elf_sym->st_info);
6794 elf32_arm_gc_mark_hook (asection *sec,
6795 struct bfd_link_info *info,
6796 Elf_Internal_Rela *rel,
6797 struct elf_link_hash_entry *h,
6798 Elf_Internal_Sym *sym)
6801 switch (ELF32_R_TYPE (rel->r_info))
6803 case R_ARM_GNU_VTINHERIT:
6804 case R_ARM_GNU_VTENTRY:
6808 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6811 /* Update the got entry reference counts for the section being removed. */
6814 elf32_arm_gc_sweep_hook (bfd * abfd,
6815 struct bfd_link_info * info,
6817 const Elf_Internal_Rela * relocs)
6819 Elf_Internal_Shdr *symtab_hdr;
6820 struct elf_link_hash_entry **sym_hashes;
6821 bfd_signed_vma *local_got_refcounts;
6822 const Elf_Internal_Rela *rel, *relend;
6823 struct elf32_arm_link_hash_table * globals;
6825 globals = elf32_arm_hash_table (info);
6827 elf_section_data (sec)->local_dynrel = NULL;
6829 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6830 sym_hashes = elf_sym_hashes (abfd);
6831 local_got_refcounts = elf_local_got_refcounts (abfd);
6833 relend = relocs + sec->reloc_count;
6834 for (rel = relocs; rel < relend; rel++)
6836 unsigned long r_symndx;
6837 struct elf_link_hash_entry *h = NULL;
6840 r_symndx = ELF32_R_SYM (rel->r_info);
6841 if (r_symndx >= symtab_hdr->sh_info)
6843 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6844 while (h->root.type == bfd_link_hash_indirect
6845 || h->root.type == bfd_link_hash_warning)
6846 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6849 r_type = ELF32_R_TYPE (rel->r_info);
6850 r_type = arm_real_reloc_type (globals, r_type);
6854 case R_ARM_GOT_PREL:
6855 case R_ARM_TLS_GD32:
6856 case R_ARM_TLS_IE32:
6859 if (h->got.refcount > 0)
6860 h->got.refcount -= 1;
6862 else if (local_got_refcounts != NULL)
6864 if (local_got_refcounts[r_symndx] > 0)
6865 local_got_refcounts[r_symndx] -= 1;
6869 case R_ARM_TLS_LDM32:
6870 elf32_arm_hash_table (info)->tls_ldm_got.refcount -= 1;
6874 case R_ARM_ABS32_NOI:
6876 case R_ARM_REL32_NOI:
6882 case R_ARM_THM_CALL:
6883 case R_ARM_MOVW_ABS_NC:
6884 case R_ARM_MOVT_ABS:
6885 case R_ARM_MOVW_PREL_NC:
6886 case R_ARM_MOVT_PREL:
6887 case R_ARM_THM_MOVW_ABS_NC:
6888 case R_ARM_THM_MOVT_ABS:
6889 case R_ARM_THM_MOVW_PREL_NC:
6890 case R_ARM_THM_MOVT_PREL:
6891 /* Should the interworking branches be here also? */
6895 struct elf32_arm_link_hash_entry *eh;
6896 struct elf32_arm_relocs_copied **pp;
6897 struct elf32_arm_relocs_copied *p;
6899 eh = (struct elf32_arm_link_hash_entry *) h;
6901 if (h->plt.refcount > 0)
6903 h->plt.refcount -= 1;
6904 if (ELF32_R_TYPE (rel->r_info) == R_ARM_THM_CALL)
6905 eh->plt_thumb_refcount--;
6908 if (r_type == R_ARM_ABS32
6909 || r_type == R_ARM_REL32
6910 || r_type == R_ARM_ABS32_NOI
6911 || r_type == R_ARM_REL32_NOI)
6913 for (pp = &eh->relocs_copied; (p = *pp) != NULL;
6915 if (p->section == sec)
6918 if (ELF32_R_TYPE (rel->r_info) == R_ARM_REL32
6919 || ELF32_R_TYPE (rel->r_info) == R_ARM_REL32_NOI)
6937 /* Look through the relocs for a section during the first phase. */
6940 elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
6941 asection *sec, const Elf_Internal_Rela *relocs)
6943 Elf_Internal_Shdr *symtab_hdr;
6944 struct elf_link_hash_entry **sym_hashes;
6945 struct elf_link_hash_entry **sym_hashes_end;
6946 const Elf_Internal_Rela *rel;
6947 const Elf_Internal_Rela *rel_end;
6950 bfd_vma *local_got_offsets;
6951 struct elf32_arm_link_hash_table *htab;
6953 if (info->relocatable)
6956 htab = elf32_arm_hash_table (info);
6959 /* Create dynamic sections for relocatable executables so that we can
6960 copy relocations. */
6961 if (htab->root.is_relocatable_executable
6962 && ! htab->root.dynamic_sections_created)
6964 if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
6968 dynobj = elf_hash_table (info)->dynobj;
6969 local_got_offsets = elf_local_got_offsets (abfd);
6971 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6972 sym_hashes = elf_sym_hashes (abfd);
6973 sym_hashes_end = sym_hashes
6974 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
6976 if (!elf_bad_symtab (abfd))
6977 sym_hashes_end -= symtab_hdr->sh_info;
6979 rel_end = relocs + sec->reloc_count;
6980 for (rel = relocs; rel < rel_end; rel++)
6982 struct elf_link_hash_entry *h;
6983 struct elf32_arm_link_hash_entry *eh;
6984 unsigned long r_symndx;
6987 r_symndx = ELF32_R_SYM (rel->r_info);
6988 r_type = ELF32_R_TYPE (rel->r_info);
6989 r_type = arm_real_reloc_type (htab, r_type);
6991 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
6993 (*_bfd_error_handler) (_("%B: bad symbol index: %d"), abfd,
6998 if (r_symndx < symtab_hdr->sh_info)
7002 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7003 while (h->root.type == bfd_link_hash_indirect
7004 || h->root.type == bfd_link_hash_warning)
7005 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7008 eh = (struct elf32_arm_link_hash_entry *) h;
7013 case R_ARM_GOT_PREL:
7014 case R_ARM_TLS_GD32:
7015 case R_ARM_TLS_IE32:
7016 /* This symbol requires a global offset table entry. */
7018 int tls_type, old_tls_type;
7022 case R_ARM_TLS_GD32: tls_type = GOT_TLS_GD; break;
7023 case R_ARM_TLS_IE32: tls_type = GOT_TLS_IE; break;
7024 default: tls_type = GOT_NORMAL; break;
7030 old_tls_type = elf32_arm_hash_entry (h)->tls_type;
7034 bfd_signed_vma *local_got_refcounts;
7036 /* This is a global offset table entry for a local symbol. */
7037 local_got_refcounts = elf_local_got_refcounts (abfd);
7038 if (local_got_refcounts == NULL)
7042 size = symtab_hdr->sh_info;
7043 size *= (sizeof (bfd_signed_vma) + sizeof(char));
7044 local_got_refcounts = bfd_zalloc (abfd, size);
7045 if (local_got_refcounts == NULL)
7047 elf_local_got_refcounts (abfd) = local_got_refcounts;
7048 elf32_arm_local_got_tls_type (abfd)
7049 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
7051 local_got_refcounts[r_symndx] += 1;
7052 old_tls_type = elf32_arm_local_got_tls_type (abfd) [r_symndx];
7055 /* We will already have issued an error message if there is a
7056 TLS / non-TLS mismatch, based on the symbol type. We don't
7057 support any linker relaxations. So just combine any TLS
7059 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
7060 && tls_type != GOT_NORMAL)
7061 tls_type |= old_tls_type;
7063 if (old_tls_type != tls_type)
7066 elf32_arm_hash_entry (h)->tls_type = tls_type;
7068 elf32_arm_local_got_tls_type (abfd) [r_symndx] = tls_type;
7073 case R_ARM_TLS_LDM32:
7074 if (r_type == R_ARM_TLS_LDM32)
7075 htab->tls_ldm_got.refcount++;
7078 case R_ARM_GOTOFF32:
7080 if (htab->sgot == NULL)
7082 if (htab->root.dynobj == NULL)
7083 htab->root.dynobj = abfd;
7084 if (!create_got_section (htab->root.dynobj, info))
7090 /* VxWorks uses dynamic R_ARM_ABS12 relocations for
7091 ldr __GOTT_INDEX__ offsets. */
7092 if (!htab->vxworks_p)
7097 case R_ARM_ABS32_NOI:
7099 case R_ARM_REL32_NOI:
7105 case R_ARM_THM_CALL:
7106 case R_ARM_MOVW_ABS_NC:
7107 case R_ARM_MOVT_ABS:
7108 case R_ARM_MOVW_PREL_NC:
7109 case R_ARM_MOVT_PREL:
7110 case R_ARM_THM_MOVW_ABS_NC:
7111 case R_ARM_THM_MOVT_ABS:
7112 case R_ARM_THM_MOVW_PREL_NC:
7113 case R_ARM_THM_MOVT_PREL:
7114 /* Should the interworking branches be listed here? */
7117 /* If this reloc is in a read-only section, we might
7118 need a copy reloc. We can't check reliably at this
7119 stage whether the section is read-only, as input
7120 sections have not yet been mapped to output sections.
7121 Tentatively set the flag for now, and correct in
7122 adjust_dynamic_symbol. */
7126 /* We may need a .plt entry if the function this reloc
7127 refers to is in a different object. We can't tell for
7128 sure yet, because something later might force the
7130 if (r_type != R_ARM_ABS32
7131 && r_type != R_ARM_REL32
7132 && r_type != R_ARM_ABS32_NOI
7133 && r_type != R_ARM_REL32_NOI)
7136 /* If we create a PLT entry, this relocation will reference
7137 it, even if it's an ABS32 relocation. */
7138 h->plt.refcount += 1;
7140 if (r_type == R_ARM_THM_CALL)
7141 eh->plt_thumb_refcount += 1;
7144 /* If we are creating a shared library or relocatable executable,
7145 and this is a reloc against a global symbol, or a non PC
7146 relative reloc against a local symbol, then we need to copy
7147 the reloc into the shared library. However, if we are linking
7148 with -Bsymbolic, we do not need to copy a reloc against a
7149 global symbol which is defined in an object we are
7150 including in the link (i.e., DEF_REGULAR is set). At
7151 this point we have not seen all the input files, so it is
7152 possible that DEF_REGULAR is not set now but will be set
7153 later (it is never cleared). We account for that
7154 possibility below by storing information in the
7155 relocs_copied field of the hash table entry. */
7156 if ((info->shared || htab->root.is_relocatable_executable)
7157 && (sec->flags & SEC_ALLOC) != 0
7158 && ((r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI)
7159 || (h != NULL && ! h->needs_plt
7160 && (! info->symbolic || ! h->def_regular))))
7162 struct elf32_arm_relocs_copied *p, **head;
7164 /* When creating a shared object, we must copy these
7165 reloc types into the output file. We create a reloc
7166 section in dynobj and make room for this reloc. */
7171 name = (bfd_elf_string_from_elf_section
7173 elf_elfheader (abfd)->e_shstrndx,
7174 elf_section_data (sec)->rel_hdr.sh_name));
7178 BFD_ASSERT (reloc_section_p (htab, name, sec));
7180 sreloc = bfd_get_section_by_name (dynobj, name);
7185 flags = (SEC_HAS_CONTENTS | SEC_READONLY
7186 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
7187 if ((sec->flags & SEC_ALLOC) != 0
7188 /* BPABI objects never have dynamic
7189 relocations mapped. */
7190 && !htab->symbian_p)
7191 flags |= SEC_ALLOC | SEC_LOAD;
7192 sreloc = bfd_make_section_with_flags (dynobj,
7196 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
7200 elf_section_data (sec)->sreloc = sreloc;
7203 /* If this is a global symbol, we count the number of
7204 relocations we need for this symbol. */
7207 head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied;
7211 /* Track dynamic relocs needed for local syms too.
7212 We really need local syms available to do this
7218 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
7223 vpp = &elf_section_data (s)->local_dynrel;
7224 head = (struct elf32_arm_relocs_copied **) vpp;
7228 if (p == NULL || p->section != sec)
7230 bfd_size_type amt = sizeof *p;
7232 p = bfd_alloc (htab->root.dynobj, amt);
7242 if (r_type == R_ARM_REL32 || r_type == R_ARM_REL32_NOI)
7248 /* This relocation describes the C++ object vtable hierarchy.
7249 Reconstruct it for later use during GC. */
7250 case R_ARM_GNU_VTINHERIT:
7251 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
7255 /* This relocation describes which C++ vtable entries are actually
7256 used. Record for later use during GC. */
7257 case R_ARM_GNU_VTENTRY:
7258 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
7267 /* Treat mapping symbols as special target symbols. */
7270 elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
7272 return bfd_is_arm_special_symbol_name (sym->name,
7273 BFD_ARM_SPECIAL_SYM_TYPE_ANY);
7276 /* This is a copy of elf_find_function() from elf.c except that
7277 ARM mapping symbols are ignored when looking for function names
7278 and STT_ARM_TFUNC is considered to a function type. */
7281 arm_elf_find_function (bfd * abfd ATTRIBUTE_UNUSED,
7285 const char ** filename_ptr,
7286 const char ** functionname_ptr)
7288 const char * filename = NULL;
7289 asymbol * func = NULL;
7290 bfd_vma low_func = 0;
7293 for (p = symbols; *p != NULL; p++)
7297 q = (elf_symbol_type *) *p;
7299 switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
7304 filename = bfd_asymbol_name (&q->symbol);
7309 /* Skip mapping symbols. */
7310 if ((q->symbol.flags & BSF_LOCAL)
7311 && bfd_is_arm_special_symbol_name (q->symbol.name,
7312 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
7315 if (bfd_get_section (&q->symbol) == section
7316 && q->symbol.value >= low_func
7317 && q->symbol.value <= offset)
7319 func = (asymbol *) q;
7320 low_func = q->symbol.value;
7330 *filename_ptr = filename;
7331 if (functionname_ptr)
7332 *functionname_ptr = bfd_asymbol_name (func);
7338 /* Find the nearest line to a particular section and offset, for error
7339 reporting. This code is a duplicate of the code in elf.c, except
7340 that it uses arm_elf_find_function. */
7343 elf32_arm_find_nearest_line (bfd * abfd,
7347 const char ** filename_ptr,
7348 const char ** functionname_ptr,
7349 unsigned int * line_ptr)
7351 bfd_boolean found = FALSE;
7353 /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it. */
7355 if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
7356 filename_ptr, functionname_ptr,
7358 & elf_tdata (abfd)->dwarf2_find_line_info))
7360 if (!*functionname_ptr)
7361 arm_elf_find_function (abfd, section, symbols, offset,
7362 *filename_ptr ? NULL : filename_ptr,
7368 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
7369 & found, filename_ptr,
7370 functionname_ptr, line_ptr,
7371 & elf_tdata (abfd)->line_info))
7374 if (found && (*functionname_ptr || *line_ptr))
7377 if (symbols == NULL)
7380 if (! arm_elf_find_function (abfd, section, symbols, offset,
7381 filename_ptr, functionname_ptr))
7389 elf32_arm_find_inliner_info (bfd * abfd,
7390 const char ** filename_ptr,
7391 const char ** functionname_ptr,
7392 unsigned int * line_ptr)
7395 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
7396 functionname_ptr, line_ptr,
7397 & elf_tdata (abfd)->dwarf2_find_line_info);
7401 /* Adjust a symbol defined by a dynamic object and referenced by a
7402 regular object. The current definition is in some section of the
7403 dynamic object, but we're not including those sections. We have to
7404 change the definition to something the rest of the link can
7408 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
7409 struct elf_link_hash_entry * h)
7413 unsigned int power_of_two;
7414 struct elf32_arm_link_hash_entry * eh;
7415 struct elf32_arm_link_hash_table *globals;
7417 globals = elf32_arm_hash_table (info);
7418 dynobj = elf_hash_table (info)->dynobj;
7420 /* Make sure we know what is going on here. */
7421 BFD_ASSERT (dynobj != NULL
7423 || h->u.weakdef != NULL
7426 && !h->def_regular)));
7428 eh = (struct elf32_arm_link_hash_entry *) h;
7430 /* If this is a function, put it in the procedure linkage table. We
7431 will fill in the contents of the procedure linkage table later,
7432 when we know the address of the .got section. */
7433 if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC
7436 if (h->plt.refcount <= 0
7437 || SYMBOL_CALLS_LOCAL (info, h)
7438 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
7439 && h->root.type == bfd_link_hash_undefweak))
7441 /* This case can occur if we saw a PLT32 reloc in an input
7442 file, but the symbol was never referred to by a dynamic
7443 object, or if all references were garbage collected. In
7444 such a case, we don't actually need to build a procedure
7445 linkage table, and we can just do a PC24 reloc instead. */
7446 h->plt.offset = (bfd_vma) -1;
7447 eh->plt_thumb_refcount = 0;
7455 /* It's possible that we incorrectly decided a .plt reloc was
7456 needed for an R_ARM_PC24 or similar reloc to a non-function sym
7457 in check_relocs. We can't decide accurately between function
7458 and non-function syms in check-relocs; Objects loaded later in
7459 the link may change h->type. So fix it now. */
7460 h->plt.offset = (bfd_vma) -1;
7461 eh->plt_thumb_refcount = 0;
7464 /* If this is a weak symbol, and there is a real definition, the
7465 processor independent code will have arranged for us to see the
7466 real definition first, and we can just use the same value. */
7467 if (h->u.weakdef != NULL)
7469 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
7470 || h->u.weakdef->root.type == bfd_link_hash_defweak);
7471 h->root.u.def.section = h->u.weakdef->root.u.def.section;
7472 h->root.u.def.value = h->u.weakdef->root.u.def.value;
7476 /* If there are no non-GOT references, we do not need a copy
7478 if (!h->non_got_ref)
7481 /* This is a reference to a symbol defined by a dynamic object which
7482 is not a function. */
7484 /* If we are creating a shared library, we must presume that the
7485 only references to the symbol are via the global offset table.
7486 For such cases we need not do anything here; the relocations will
7487 be handled correctly by relocate_section. Relocatable executables
7488 can reference data in shared objects directly, so we don't need to
7489 do anything here. */
7490 if (info->shared || globals->root.is_relocatable_executable)
7495 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
7496 h->root.root.string);
7500 /* We must allocate the symbol in our .dynbss section, which will
7501 become part of the .bss section of the executable. There will be
7502 an entry for this symbol in the .dynsym section. The dynamic
7503 object will contain position independent code, so all references
7504 from the dynamic object to this symbol will go through the global
7505 offset table. The dynamic linker will use the .dynsym entry to
7506 determine the address it must put in the global offset table, so
7507 both the dynamic object and the regular object will refer to the
7508 same memory location for the variable. */
7509 s = bfd_get_section_by_name (dynobj, ".dynbss");
7510 BFD_ASSERT (s != NULL);
7512 /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
7513 copy the initial value out of the dynamic object and into the
7514 runtime process image. We need to remember the offset into the
7515 .rel(a).bss section we are going to use. */
7516 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
7520 srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (globals, ".bss"));
7521 BFD_ASSERT (srel != NULL);
7522 srel->size += RELOC_SIZE (globals);
7526 /* We need to figure out the alignment required for this symbol. I
7527 have no idea how ELF linkers handle this. */
7528 power_of_two = bfd_log2 (h->size);
7529 if (power_of_two > 3)
7532 /* Apply the required alignment. */
7533 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
7534 if (power_of_two > bfd_get_section_alignment (dynobj, s))
7536 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
7540 /* Define the symbol as being at this point in the section. */
7541 h->root.u.def.section = s;
7542 h->root.u.def.value = s->size;
7544 /* Increment the section size to make room for the symbol. */
7550 /* Allocate space in .plt, .got and associated reloc sections for
7554 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
7556 struct bfd_link_info *info;
7557 struct elf32_arm_link_hash_table *htab;
7558 struct elf32_arm_link_hash_entry *eh;
7559 struct elf32_arm_relocs_copied *p;
7561 eh = (struct elf32_arm_link_hash_entry *) h;
7563 if (h->root.type == bfd_link_hash_indirect)
7566 if (h->root.type == bfd_link_hash_warning)
7567 /* When warning symbols are created, they **replace** the "real"
7568 entry in the hash table, thus we never get to see the real
7569 symbol in a hash traversal. So look at it now. */
7570 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7572 info = (struct bfd_link_info *) inf;
7573 htab = elf32_arm_hash_table (info);
7575 if (htab->root.dynamic_sections_created
7576 && h->plt.refcount > 0)
7578 /* Make sure this symbol is output as a dynamic symbol.
7579 Undefined weak syms won't yet be marked as dynamic. */
7580 if (h->dynindx == -1
7581 && !h->forced_local)
7583 if (! bfd_elf_link_record_dynamic_symbol (info, h))
7588 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
7590 asection *s = htab->splt;
7592 /* If this is the first .plt entry, make room for the special
7595 s->size += htab->plt_header_size;
7597 h->plt.offset = s->size;
7599 /* If we will insert a Thumb trampoline before this PLT, leave room
7601 if (!htab->use_blx && eh->plt_thumb_refcount > 0)
7603 h->plt.offset += PLT_THUMB_STUB_SIZE;
7604 s->size += PLT_THUMB_STUB_SIZE;
7607 /* If this symbol is not defined in a regular file, and we are
7608 not generating a shared library, then set the symbol to this
7609 location in the .plt. This is required to make function
7610 pointers compare as equal between the normal executable and
7611 the shared library. */
7615 h->root.u.def.section = s;
7616 h->root.u.def.value = h->plt.offset;
7618 /* Make sure the function is not marked as Thumb, in case
7619 it is the target of an ABS32 relocation, which will
7620 point to the PLT entry. */
7621 if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
7622 h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
7625 /* Make room for this entry. */
7626 s->size += htab->plt_entry_size;
7628 if (!htab->symbian_p)
7630 /* We also need to make an entry in the .got.plt section, which
7631 will be placed in the .got section by the linker script. */
7632 eh->plt_got_offset = htab->sgotplt->size;
7633 htab->sgotplt->size += 4;
7636 /* We also need to make an entry in the .rel(a).plt section. */
7637 htab->srelplt->size += RELOC_SIZE (htab);
7639 /* VxWorks executables have a second set of relocations for
7640 each PLT entry. They go in a separate relocation section,
7641 which is processed by the kernel loader. */
7642 if (htab->vxworks_p && !info->shared)
7644 /* There is a relocation for the initial PLT entry:
7645 an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_. */
7646 if (h->plt.offset == htab->plt_header_size)
7647 htab->srelplt2->size += RELOC_SIZE (htab);
7649 /* There are two extra relocations for each subsequent
7650 PLT entry: an R_ARM_32 relocation for the GOT entry,
7651 and an R_ARM_32 relocation for the PLT entry. */
7652 htab->srelplt2->size += RELOC_SIZE (htab) * 2;
7657 h->plt.offset = (bfd_vma) -1;
7663 h->plt.offset = (bfd_vma) -1;
7667 if (h->got.refcount > 0)
7671 int tls_type = elf32_arm_hash_entry (h)->tls_type;
7674 /* Make sure this symbol is output as a dynamic symbol.
7675 Undefined weak syms won't yet be marked as dynamic. */
7676 if (h->dynindx == -1
7677 && !h->forced_local)
7679 if (! bfd_elf_link_record_dynamic_symbol (info, h))
7683 if (!htab->symbian_p)
7686 h->got.offset = s->size;
7688 if (tls_type == GOT_UNKNOWN)
7691 if (tls_type == GOT_NORMAL)
7692 /* Non-TLS symbols need one GOT slot. */
7696 if (tls_type & GOT_TLS_GD)
7697 /* R_ARM_TLS_GD32 needs 2 consecutive GOT slots. */
7699 if (tls_type & GOT_TLS_IE)
7700 /* R_ARM_TLS_IE32 needs one GOT slot. */
7704 dyn = htab->root.dynamic_sections_created;
7707 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
7709 || !SYMBOL_REFERENCES_LOCAL (info, h)))
7712 if (tls_type != GOT_NORMAL
7713 && (info->shared || indx != 0)
7714 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
7715 || h->root.type != bfd_link_hash_undefweak))
7717 if (tls_type & GOT_TLS_IE)
7718 htab->srelgot->size += RELOC_SIZE (htab);
7720 if (tls_type & GOT_TLS_GD)
7721 htab->srelgot->size += RELOC_SIZE (htab);
7723 if ((tls_type & GOT_TLS_GD) && indx != 0)
7724 htab->srelgot->size += RELOC_SIZE (htab);
7726 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
7727 || h->root.type != bfd_link_hash_undefweak)
7729 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
7730 htab->srelgot->size += RELOC_SIZE (htab);
7734 h->got.offset = (bfd_vma) -1;
7736 /* Allocate stubs for exported Thumb functions on v4t. */
7737 if (!htab->use_blx && h->dynindx != -1
7738 && ELF_ST_TYPE (h->type) == STT_ARM_TFUNC
7739 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
7741 struct elf_link_hash_entry * th;
7742 struct bfd_link_hash_entry * bh;
7743 struct elf_link_hash_entry * myh;
7747 /* Create a new symbol to regist the real location of the function. */
7748 s = h->root.u.def.section;
7749 sprintf(name, "__real_%s", h->root.root.string);
7750 _bfd_generic_link_add_one_symbol (info, s->owner,
7751 name, BSF_GLOBAL, s,
7752 h->root.u.def.value,
7753 NULL, TRUE, FALSE, &bh);
7755 myh = (struct elf_link_hash_entry *) bh;
7756 myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
7757 myh->forced_local = 1;
7758 eh->export_glue = myh;
7759 th = record_arm_to_thumb_glue (info, h);
7760 /* Point the symbol at the stub. */
7761 h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
7762 h->root.u.def.section = th->root.u.def.section;
7763 h->root.u.def.value = th->root.u.def.value & ~1;
7766 if (eh->relocs_copied == NULL)
7769 /* In the shared -Bsymbolic case, discard space allocated for
7770 dynamic pc-relative relocs against symbols which turn out to be
7771 defined in regular objects. For the normal shared case, discard
7772 space for pc-relative relocs that have become local due to symbol
7773 visibility changes. */
7775 if (info->shared || htab->root.is_relocatable_executable)
7777 /* The only reloc thats uses pc_count are R_ARM_REL32 and
7778 R_ARM_REL32_NOI, which will appear on something like
7779 ".long foo - .". We want calls to protected symbols to resolve
7780 directly to the function rather than going via the plt. If people
7781 want function pointer comparisons to work as expected then they
7782 should avoid writing assembly like ".long foo - .". */
7783 if (SYMBOL_CALLS_LOCAL (info, h))
7785 struct elf32_arm_relocs_copied **pp;
7787 for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
7789 p->count -= p->pc_count;
7798 /* Also discard relocs on undefined weak syms with non-default
7800 if (eh->relocs_copied != NULL
7801 && h->root.type == bfd_link_hash_undefweak)
7803 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
7804 eh->relocs_copied = NULL;
7806 /* Make sure undefined weak symbols are output as a dynamic
7808 else if (h->dynindx == -1
7809 && !h->forced_local)
7811 if (! bfd_elf_link_record_dynamic_symbol (info, h))
7816 else if (htab->root.is_relocatable_executable && h->dynindx == -1
7817 && h->root.type == bfd_link_hash_new)
7819 /* Output absolute symbols so that we can create relocations
7820 against them. For normal symbols we output a relocation
7821 against the section that contains them. */
7822 if (! bfd_elf_link_record_dynamic_symbol (info, h))
7829 /* For the non-shared case, discard space for relocs against
7830 symbols which turn out to need copy relocs or are not
7836 || (htab->root.dynamic_sections_created
7837 && (h->root.type == bfd_link_hash_undefweak
7838 || h->root.type == bfd_link_hash_undefined))))
7840 /* Make sure this symbol is output as a dynamic symbol.
7841 Undefined weak syms won't yet be marked as dynamic. */
7842 if (h->dynindx == -1
7843 && !h->forced_local)
7845 if (! bfd_elf_link_record_dynamic_symbol (info, h))
7849 /* If that succeeded, we know we'll be keeping all the
7851 if (h->dynindx != -1)
7855 eh->relocs_copied = NULL;
7860 /* Finally, allocate space. */
7861 for (p = eh->relocs_copied; p != NULL; p = p->next)
7863 asection *sreloc = elf_section_data (p->section)->sreloc;
7864 sreloc->size += p->count * RELOC_SIZE (htab);
7870 /* Find any dynamic relocs that apply to read-only sections. */
7873 elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
7875 struct elf32_arm_link_hash_entry *eh;
7876 struct elf32_arm_relocs_copied *p;
7878 if (h->root.type == bfd_link_hash_warning)
7879 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7881 eh = (struct elf32_arm_link_hash_entry *) h;
7882 for (p = eh->relocs_copied; p != NULL; p = p->next)
7884 asection *s = p->section;
7886 if (s != NULL && (s->flags & SEC_READONLY) != 0)
7888 struct bfd_link_info *info = (struct bfd_link_info *) inf;
7890 info->flags |= DF_TEXTREL;
7892 /* Not an error, just cut short the traversal. */
7899 /* Set the sizes of the dynamic sections. */
7902 elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
7903 struct bfd_link_info * info)
7910 struct elf32_arm_link_hash_table *htab;
7912 htab = elf32_arm_hash_table (info);
7913 dynobj = elf_hash_table (info)->dynobj;
7914 BFD_ASSERT (dynobj != NULL);
7915 check_use_blx (htab);
7917 if (elf_hash_table (info)->dynamic_sections_created)
7919 /* Set the contents of the .interp section to the interpreter. */
7920 if (info->executable)
7922 s = bfd_get_section_by_name (dynobj, ".interp");
7923 BFD_ASSERT (s != NULL);
7924 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
7925 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
7929 /* Set up .got offsets for local syms, and space for local dynamic
7931 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7933 bfd_signed_vma *local_got;
7934 bfd_signed_vma *end_local_got;
7935 char *local_tls_type;
7936 bfd_size_type locsymcount;
7937 Elf_Internal_Shdr *symtab_hdr;
7940 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
7943 for (s = ibfd->sections; s != NULL; s = s->next)
7945 struct elf32_arm_relocs_copied *p;
7947 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
7949 if (!bfd_is_abs_section (p->section)
7950 && bfd_is_abs_section (p->section->output_section))
7952 /* Input section has been discarded, either because
7953 it is a copy of a linkonce section or due to
7954 linker script /DISCARD/, so we'll be discarding
7957 else if (p->count != 0)
7959 srel = elf_section_data (p->section)->sreloc;
7960 srel->size += p->count * RELOC_SIZE (htab);
7961 if ((p->section->output_section->flags & SEC_READONLY) != 0)
7962 info->flags |= DF_TEXTREL;
7967 local_got = elf_local_got_refcounts (ibfd);
7971 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
7972 locsymcount = symtab_hdr->sh_info;
7973 end_local_got = local_got + locsymcount;
7974 local_tls_type = elf32_arm_local_got_tls_type (ibfd);
7976 srel = htab->srelgot;
7977 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
7981 *local_got = s->size;
7982 if (*local_tls_type & GOT_TLS_GD)
7983 /* TLS_GD relocs need an 8-byte structure in the GOT. */
7985 if (*local_tls_type & GOT_TLS_IE)
7987 if (*local_tls_type == GOT_NORMAL)
7990 if (info->shared || *local_tls_type == GOT_TLS_GD)
7991 srel->size += RELOC_SIZE (htab);
7994 *local_got = (bfd_vma) -1;
7998 if (htab->tls_ldm_got.refcount > 0)
8000 /* Allocate two GOT entries and one dynamic relocation (if necessary)
8001 for R_ARM_TLS_LDM32 relocations. */
8002 htab->tls_ldm_got.offset = htab->sgot->size;
8003 htab->sgot->size += 8;
8005 htab->srelgot->size += RELOC_SIZE (htab);
8008 htab->tls_ldm_got.offset = -1;
8010 /* Allocate global sym .plt and .got entries, and space for global
8011 sym dynamic relocs. */
8012 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
8014 /* The check_relocs and adjust_dynamic_symbol entry points have
8015 determined the sizes of the various dynamic sections. Allocate
8019 for (s = dynobj->sections; s != NULL; s = s->next)
8023 if ((s->flags & SEC_LINKER_CREATED) == 0)
8026 /* It's OK to base decisions on the section name, because none
8027 of the dynobj section names depend upon the input files. */
8028 name = bfd_get_section_name (dynobj, s);
8030 if (strcmp (name, ".plt") == 0)
8032 /* Remember whether there is a PLT. */
8035 else if (CONST_STRNEQ (name, ".rel"))
8039 /* Remember whether there are any reloc sections other
8040 than .rel(a).plt and .rela.plt.unloaded. */
8041 if (s != htab->srelplt && s != htab->srelplt2)
8044 /* We use the reloc_count field as a counter if we need
8045 to copy relocs into the output file. */
8049 else if (! CONST_STRNEQ (name, ".got")
8050 && strcmp (name, ".dynbss") != 0)
8052 /* It's not one of our sections, so don't allocate space. */
8058 /* If we don't need this section, strip it from the
8059 output file. This is mostly to handle .rel(a).bss and
8060 .rel(a).plt. We must create both sections in
8061 create_dynamic_sections, because they must be created
8062 before the linker maps input sections to output
8063 sections. The linker does that before
8064 adjust_dynamic_symbol is called, and it is that
8065 function which decides whether anything needs to go
8066 into these sections. */
8067 s->flags |= SEC_EXCLUDE;
8071 if ((s->flags & SEC_HAS_CONTENTS) == 0)
8074 /* Allocate memory for the section contents. */
8075 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
8076 if (s->contents == NULL)
8080 if (elf_hash_table (info)->dynamic_sections_created)
8082 /* Add some entries to the .dynamic section. We fill in the
8083 values later, in elf32_arm_finish_dynamic_sections, but we
8084 must add the entries now so that we get the correct size for
8085 the .dynamic section. The DT_DEBUG entry is filled in by the
8086 dynamic linker and used by the debugger. */
8087 #define add_dynamic_entry(TAG, VAL) \
8088 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
8090 if (info->executable)
8092 if (!add_dynamic_entry (DT_DEBUG, 0))
8098 if ( !add_dynamic_entry (DT_PLTGOT, 0)
8099 || !add_dynamic_entry (DT_PLTRELSZ, 0)
8100 || !add_dynamic_entry (DT_PLTREL,
8101 htab->use_rel ? DT_REL : DT_RELA)
8102 || !add_dynamic_entry (DT_JMPREL, 0))
8110 if (!add_dynamic_entry (DT_REL, 0)
8111 || !add_dynamic_entry (DT_RELSZ, 0)
8112 || !add_dynamic_entry (DT_RELENT, RELOC_SIZE (htab)))
8117 if (!add_dynamic_entry (DT_RELA, 0)
8118 || !add_dynamic_entry (DT_RELASZ, 0)
8119 || !add_dynamic_entry (DT_RELAENT, RELOC_SIZE (htab)))
8124 /* If any dynamic relocs apply to a read-only section,
8125 then we need a DT_TEXTREL entry. */
8126 if ((info->flags & DF_TEXTREL) == 0)
8127 elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs,
8130 if ((info->flags & DF_TEXTREL) != 0)
8132 if (!add_dynamic_entry (DT_TEXTREL, 0))
8136 #undef add_dynamic_entry
8141 /* Finish up dynamic symbol handling. We set the contents of various
8142 dynamic sections here. */
8145 elf32_arm_finish_dynamic_symbol (bfd * output_bfd, struct bfd_link_info * info,
8146 struct elf_link_hash_entry * h, Elf_Internal_Sym * sym)
8149 struct elf32_arm_link_hash_table *htab;
8150 struct elf32_arm_link_hash_entry *eh;
8152 dynobj = elf_hash_table (info)->dynobj;
8153 htab = elf32_arm_hash_table (info);
8154 eh = (struct elf32_arm_link_hash_entry *) h;
8156 if (h->plt.offset != (bfd_vma) -1)
8162 Elf_Internal_Rela rel;
8164 /* This symbol has an entry in the procedure linkage table. Set
8167 BFD_ASSERT (h->dynindx != -1);
8169 splt = bfd_get_section_by_name (dynobj, ".plt");
8170 srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (htab, ".plt"));
8171 BFD_ASSERT (splt != NULL && srel != NULL);
8173 /* Fill in the entry in the procedure linkage table. */
8174 if (htab->symbian_p)
8176 put_arm_insn (htab, output_bfd,
8177 elf32_arm_symbian_plt_entry[0],
8178 splt->contents + h->plt.offset);
8179 bfd_put_32 (output_bfd,
8180 elf32_arm_symbian_plt_entry[1],
8181 splt->contents + h->plt.offset + 4);
8183 /* Fill in the entry in the .rel.plt section. */
8184 rel.r_offset = (splt->output_section->vma
8185 + splt->output_offset
8186 + h->plt.offset + 4);
8187 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
8189 /* Get the index in the procedure linkage table which
8190 corresponds to this symbol. This is the index of this symbol
8191 in all the symbols for which we are making plt entries. The
8192 first entry in the procedure linkage table is reserved. */
8193 plt_index = ((h->plt.offset - htab->plt_header_size)
8194 / htab->plt_entry_size);
8198 bfd_vma got_offset, got_address, plt_address;
8199 bfd_vma got_displacement;
8203 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
8204 BFD_ASSERT (sgot != NULL);
8206 /* Get the offset into the .got.plt table of the entry that
8207 corresponds to this function. */
8208 got_offset = eh->plt_got_offset;
8210 /* Get the index in the procedure linkage table which
8211 corresponds to this symbol. This is the index of this symbol
8212 in all the symbols for which we are making plt entries. The
8213 first three entries in .got.plt are reserved; after that
8214 symbols appear in the same order as in .plt. */
8215 plt_index = (got_offset - 12) / 4;
8217 /* Calculate the address of the GOT entry. */
8218 got_address = (sgot->output_section->vma
8219 + sgot->output_offset
8222 /* ...and the address of the PLT entry. */
8223 plt_address = (splt->output_section->vma
8224 + splt->output_offset
8227 ptr = htab->splt->contents + h->plt.offset;
8228 if (htab->vxworks_p && info->shared)
8233 for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
8235 val = elf32_arm_vxworks_shared_plt_entry[i];
8237 val |= got_address - sgot->output_section->vma;
8239 val |= plt_index * RELOC_SIZE (htab);
8240 if (i == 2 || i == 5)
8241 bfd_put_32 (output_bfd, val, ptr);
8243 put_arm_insn (htab, output_bfd, val, ptr);
8246 else if (htab->vxworks_p)
8251 for (i = 0; i != htab->plt_entry_size / 4; i++)
8253 val = elf32_arm_vxworks_exec_plt_entry[i];
8257 val |= 0xffffff & -((h->plt.offset + i * 4 + 8) >> 2);
8259 val |= plt_index * RELOC_SIZE (htab);
8260 if (i == 2 || i == 5)
8261 bfd_put_32 (output_bfd, val, ptr);
8263 put_arm_insn (htab, output_bfd, val, ptr);
8266 loc = (htab->srelplt2->contents
8267 + (plt_index * 2 + 1) * RELOC_SIZE (htab));
8269 /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
8270 referencing the GOT for this PLT entry. */
8271 rel.r_offset = plt_address + 8;
8272 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
8273 rel.r_addend = got_offset;
8274 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
8275 loc += RELOC_SIZE (htab);
8277 /* Create the R_ARM_ABS32 relocation referencing the
8278 beginning of the PLT for this GOT entry. */
8279 rel.r_offset = got_address;
8280 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
8282 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
8286 /* Calculate the displacement between the PLT slot and the
8287 entry in the GOT. The eight-byte offset accounts for the
8288 value produced by adding to pc in the first instruction
8290 got_displacement = got_address - (plt_address + 8);
8292 BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
8294 if (!htab->use_blx && eh->plt_thumb_refcount > 0)
8296 put_thumb_insn (htab, output_bfd,
8297 elf32_arm_plt_thumb_stub[0], ptr - 4);
8298 put_thumb_insn (htab, output_bfd,
8299 elf32_arm_plt_thumb_stub[1], ptr - 2);
8302 put_arm_insn (htab, output_bfd,
8303 elf32_arm_plt_entry[0]
8304 | ((got_displacement & 0x0ff00000) >> 20),
8306 put_arm_insn (htab, output_bfd,
8307 elf32_arm_plt_entry[1]
8308 | ((got_displacement & 0x000ff000) >> 12),
8310 put_arm_insn (htab, output_bfd,
8311 elf32_arm_plt_entry[2]
8312 | (got_displacement & 0x00000fff),
8314 #ifdef FOUR_WORD_PLT
8315 bfd_put_32 (output_bfd, elf32_arm_plt_entry[3], ptr + 12);
8319 /* Fill in the entry in the global offset table. */
8320 bfd_put_32 (output_bfd,
8321 (splt->output_section->vma
8322 + splt->output_offset),
8323 sgot->contents + got_offset);
8325 /* Fill in the entry in the .rel(a).plt section. */
8327 rel.r_offset = got_address;
8328 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_JUMP_SLOT);
8331 loc = srel->contents + plt_index * RELOC_SIZE (htab);
8332 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
8334 if (!h->def_regular)
8336 /* Mark the symbol as undefined, rather than as defined in
8337 the .plt section. Leave the value alone. */
8338 sym->st_shndx = SHN_UNDEF;
8339 /* If the symbol is weak, we do need to clear the value.
8340 Otherwise, the PLT entry would provide a definition for
8341 the symbol even if the symbol wasn't defined anywhere,
8342 and so the symbol would never be NULL. */
8343 if (!h->ref_regular_nonweak)
8348 if (h->got.offset != (bfd_vma) -1
8349 && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
8350 && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
8354 Elf_Internal_Rela rel;
8358 /* This symbol has an entry in the global offset table. Set it
8360 sgot = bfd_get_section_by_name (dynobj, ".got");
8361 srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (htab, ".got"));
8362 BFD_ASSERT (sgot != NULL && srel != NULL);
8364 offset = (h->got.offset & ~(bfd_vma) 1);
8366 rel.r_offset = (sgot->output_section->vma
8367 + sgot->output_offset
8370 /* If this is a static link, or it is a -Bsymbolic link and the
8371 symbol is defined locally or was forced to be local because
8372 of a version file, we just want to emit a RELATIVE reloc.
8373 The entry in the global offset table will already have been
8374 initialized in the relocate_section function. */
8376 && SYMBOL_REFERENCES_LOCAL (info, h))
8378 BFD_ASSERT((h->got.offset & 1) != 0);
8379 rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
8382 rel.r_addend = bfd_get_32 (output_bfd, sgot->contents + offset);
8383 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
8388 BFD_ASSERT((h->got.offset & 1) == 0);
8389 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
8390 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
8393 loc = srel->contents + srel->reloc_count++ * RELOC_SIZE (htab);
8394 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
8400 Elf_Internal_Rela rel;
8403 /* This symbol needs a copy reloc. Set it up. */
8404 BFD_ASSERT (h->dynindx != -1
8405 && (h->root.type == bfd_link_hash_defined
8406 || h->root.type == bfd_link_hash_defweak));
8408 s = bfd_get_section_by_name (h->root.u.def.section->owner,
8409 RELOC_SECTION (htab, ".bss"));
8410 BFD_ASSERT (s != NULL);
8413 rel.r_offset = (h->root.u.def.value
8414 + h->root.u.def.section->output_section->vma
8415 + h->root.u.def.section->output_offset);
8416 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
8417 loc = s->contents + s->reloc_count++ * RELOC_SIZE (htab);
8418 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
8421 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. On VxWorks,
8422 the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it is relative
8423 to the ".got" section. */
8424 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
8425 || (!htab->vxworks_p && h == htab->root.hgot))
8426 sym->st_shndx = SHN_ABS;
8431 /* Finish up the dynamic sections. */
8434 elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
8440 dynobj = elf_hash_table (info)->dynobj;
8442 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
8443 BFD_ASSERT (elf32_arm_hash_table (info)->symbian_p || sgot != NULL);
8444 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
8446 if (elf_hash_table (info)->dynamic_sections_created)
8449 Elf32_External_Dyn *dyncon, *dynconend;
8450 struct elf32_arm_link_hash_table *htab;
8452 htab = elf32_arm_hash_table (info);
8453 splt = bfd_get_section_by_name (dynobj, ".plt");
8454 BFD_ASSERT (splt != NULL && sdyn != NULL);
8456 dyncon = (Elf32_External_Dyn *) sdyn->contents;
8457 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
8459 for (; dyncon < dynconend; dyncon++)
8461 Elf_Internal_Dyn dyn;
8465 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
8476 goto get_vma_if_bpabi;
8479 goto get_vma_if_bpabi;
8482 goto get_vma_if_bpabi;
8484 name = ".gnu.version";
8485 goto get_vma_if_bpabi;
8487 name = ".gnu.version_d";
8488 goto get_vma_if_bpabi;
8490 name = ".gnu.version_r";
8491 goto get_vma_if_bpabi;
8497 name = RELOC_SECTION (htab, ".plt");
8499 s = bfd_get_section_by_name (output_bfd, name);
8500 BFD_ASSERT (s != NULL);
8501 if (!htab->symbian_p)
8502 dyn.d_un.d_ptr = s->vma;
8504 /* In the BPABI, tags in the PT_DYNAMIC section point
8505 at the file offset, not the memory address, for the
8506 convenience of the post linker. */
8507 dyn.d_un.d_ptr = s->filepos;
8508 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
8512 if (htab->symbian_p)
8517 s = bfd_get_section_by_name (output_bfd,
8518 RELOC_SECTION (htab, ".plt"));
8519 BFD_ASSERT (s != NULL);
8520 dyn.d_un.d_val = s->size;
8521 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
8526 if (!htab->symbian_p)
8528 /* My reading of the SVR4 ABI indicates that the
8529 procedure linkage table relocs (DT_JMPREL) should be
8530 included in the overall relocs (DT_REL). This is
8531 what Solaris does. However, UnixWare can not handle
8532 that case. Therefore, we override the DT_RELSZ entry
8533 here to make it not include the JMPREL relocs. Since
8534 the linker script arranges for .rel(a).plt to follow all
8535 other relocation sections, we don't have to worry
8536 about changing the DT_REL entry. */
8537 s = bfd_get_section_by_name (output_bfd,
8538 RELOC_SECTION (htab, ".plt"));
8540 dyn.d_un.d_val -= s->size;
8541 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
8548 /* In the BPABI, the DT_REL tag must point at the file
8549 offset, not the VMA, of the first relocation
8550 section. So, we use code similar to that in
8551 elflink.c, but do not check for SHF_ALLOC on the
8552 relcoation section, since relocations sections are
8553 never allocated under the BPABI. The comments above
8554 about Unixware notwithstanding, we include all of the
8555 relocations here. */
8556 if (htab->symbian_p)
8559 type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
8560 ? SHT_REL : SHT_RELA);
8562 for (i = 1; i < elf_numsections (output_bfd); i++)
8564 Elf_Internal_Shdr *hdr
8565 = elf_elfsections (output_bfd)[i];
8566 if (hdr->sh_type == type)
8568 if (dyn.d_tag == DT_RELSZ
8569 || dyn.d_tag == DT_RELASZ)
8570 dyn.d_un.d_val += hdr->sh_size;
8571 else if ((ufile_ptr) hdr->sh_offset
8572 <= dyn.d_un.d_val - 1)
8573 dyn.d_un.d_val = hdr->sh_offset;
8576 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
8580 /* Set the bottom bit of DT_INIT/FINI if the
8581 corresponding function is Thumb. */
8583 name = info->init_function;
8586 name = info->fini_function;
8588 /* If it wasn't set by elf_bfd_final_link
8589 then there is nothing to adjust. */
8590 if (dyn.d_un.d_val != 0)
8592 struct elf_link_hash_entry * eh;
8594 eh = elf_link_hash_lookup (elf_hash_table (info), name,
8595 FALSE, FALSE, TRUE);
8596 if (eh != (struct elf_link_hash_entry *) NULL
8597 && ELF_ST_TYPE (eh->type) == STT_ARM_TFUNC)
8599 dyn.d_un.d_val |= 1;
8600 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
8607 /* Fill in the first entry in the procedure linkage table. */
8608 if (splt->size > 0 && elf32_arm_hash_table (info)->plt_header_size)
8610 const bfd_vma *plt0_entry;
8611 bfd_vma got_address, plt_address, got_displacement;
8613 /* Calculate the addresses of the GOT and PLT. */
8614 got_address = sgot->output_section->vma + sgot->output_offset;
8615 plt_address = splt->output_section->vma + splt->output_offset;
8617 if (htab->vxworks_p)
8619 /* The VxWorks GOT is relocated by the dynamic linker.
8620 Therefore, we must emit relocations rather than simply
8621 computing the values now. */
8622 Elf_Internal_Rela rel;
8624 plt0_entry = elf32_arm_vxworks_exec_plt0_entry;
8625 put_arm_insn (htab, output_bfd, plt0_entry[0],
8626 splt->contents + 0);
8627 put_arm_insn (htab, output_bfd, plt0_entry[1],
8628 splt->contents + 4);
8629 put_arm_insn (htab, output_bfd, plt0_entry[2],
8630 splt->contents + 8);
8631 bfd_put_32 (output_bfd, got_address, splt->contents + 12);
8633 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_. */
8634 rel.r_offset = plt_address + 12;
8635 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
8637 SWAP_RELOC_OUT (htab) (output_bfd, &rel,
8638 htab->srelplt2->contents);
8642 got_displacement = got_address - (plt_address + 16);
8644 plt0_entry = elf32_arm_plt0_entry;
8645 put_arm_insn (htab, output_bfd, plt0_entry[0],
8646 splt->contents + 0);
8647 put_arm_insn (htab, output_bfd, plt0_entry[1],
8648 splt->contents + 4);
8649 put_arm_insn (htab, output_bfd, plt0_entry[2],
8650 splt->contents + 8);
8651 put_arm_insn (htab, output_bfd, plt0_entry[3],
8652 splt->contents + 12);
8654 #ifdef FOUR_WORD_PLT
8655 /* The displacement value goes in the otherwise-unused
8656 last word of the second entry. */
8657 bfd_put_32 (output_bfd, got_displacement, splt->contents + 28);
8659 bfd_put_32 (output_bfd, got_displacement, splt->contents + 16);
8664 /* UnixWare sets the entsize of .plt to 4, although that doesn't
8665 really seem like the right value. */
8666 if (splt->output_section->owner == output_bfd)
8667 elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
8669 if (htab->vxworks_p && !info->shared && htab->splt->size > 0)
8671 /* Correct the .rel(a).plt.unloaded relocations. They will have
8672 incorrect symbol indexes. */
8676 num_plts = ((htab->splt->size - htab->plt_header_size)
8677 / htab->plt_entry_size);
8678 p = htab->srelplt2->contents + RELOC_SIZE (htab);
8680 for (; num_plts; num_plts--)
8682 Elf_Internal_Rela rel;
8684 SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
8685 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
8686 SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
8687 p += RELOC_SIZE (htab);
8689 SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
8690 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
8691 SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
8692 p += RELOC_SIZE (htab);
8697 /* Fill in the first three entries in the global offset table. */
8703 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
8705 bfd_put_32 (output_bfd,
8706 sdyn->output_section->vma + sdyn->output_offset,
8708 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
8709 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
8712 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
8719 elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
8721 Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
8722 struct elf32_arm_link_hash_table *globals;
8724 i_ehdrp = elf_elfheader (abfd);
8726 if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
8727 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
8729 i_ehdrp->e_ident[EI_OSABI] = 0;
8730 i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
8734 globals = elf32_arm_hash_table (link_info);
8735 if (globals->byteswap_code)
8736 i_ehdrp->e_flags |= EF_ARM_BE8;
8740 static enum elf_reloc_type_class
8741 elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
8743 switch ((int) ELF32_R_TYPE (rela->r_info))
8745 case R_ARM_RELATIVE:
8746 return reloc_class_relative;
8747 case R_ARM_JUMP_SLOT:
8748 return reloc_class_plt;
8750 return reloc_class_copy;
8752 return reloc_class_normal;
8756 /* Set the right machine number for an Arm ELF file. */
8759 elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
8761 if (hdr->sh_type == SHT_NOTE)
8762 *flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_CONTENTS;
8768 elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
8770 bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
8773 /* Return TRUE if this is an unwinding table entry. */
8776 is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
8778 return (CONST_STRNEQ (name, ELF_STRING_ARM_unwind)
8779 || CONST_STRNEQ (name, ELF_STRING_ARM_unwind_once));
8783 /* Set the type and flags for an ARM section. We do this by
8784 the section name, which is a hack, but ought to work. */
8787 elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
8791 name = bfd_get_section_name (abfd, sec);
8793 if (is_arm_elf_unwind_section_name (abfd, name))
8795 hdr->sh_type = SHT_ARM_EXIDX;
8796 hdr->sh_flags |= SHF_LINK_ORDER;
8798 else if (strcmp(name, ".ARM.attributes") == 0)
8800 hdr->sh_type = SHT_ARM_ATTRIBUTES;
8805 /* Parse an Arm EABI attributes section. */
8807 elf32_arm_parse_attributes (bfd *abfd, Elf_Internal_Shdr * hdr)
8813 contents = bfd_malloc (hdr->sh_size);
8816 if (!bfd_get_section_contents (abfd, hdr->bfd_section, contents, 0,
8825 len = hdr->sh_size - 1;
8829 bfd_vma section_len;
8831 section_len = bfd_get_32 (abfd, p);
8833 if (section_len > len)
8836 namelen = strlen ((char *)p) + 1;
8837 section_len -= namelen + 4;
8838 if (strcmp((char *)p, "aeabi") != 0)
8840 /* Vendor section. Ignore it. */
8841 p += namelen + section_len;
8846 while (section_len > 0)
8851 bfd_vma subsection_len;
8854 tag = read_unsigned_leb128 (abfd, p, &n);
8856 subsection_len = bfd_get_32 (abfd, p);
8858 if (subsection_len > section_len)
8859 subsection_len = section_len;
8860 section_len -= subsection_len;
8861 subsection_len -= n + 4;
8862 end = p + subsection_len;
8868 bfd_boolean is_string;
8870 tag = read_unsigned_leb128 (abfd, p, &n);
8872 if (tag == 4 || tag == 5)
8877 is_string = (tag & 1) != 0;
8878 if (tag == Tag_compatibility)
8880 val = read_unsigned_leb128 (abfd, p, &n);
8882 elf32_arm_add_eabi_attr_compat (abfd, val,
8884 p += strlen ((char *)p) + 1;
8888 elf32_arm_add_eabi_attr_string (abfd, tag,
8890 p += strlen ((char *)p) + 1;
8894 val = read_unsigned_leb128 (abfd, p, &n);
8896 elf32_arm_add_eabi_attr_int (abfd, tag, val);
8902 /* Don't have anywhere convenient to attach these.
8903 Fall through for now. */
8905 /* Ignore things we don't kow about. */
8906 p += subsection_len;
8917 /* Handle an ARM specific section when reading an object file. This is
8918 called when bfd_section_from_shdr finds a section with an unknown
8922 elf32_arm_section_from_shdr (bfd *abfd,
8923 Elf_Internal_Shdr * hdr,
8927 /* There ought to be a place to keep ELF backend specific flags, but
8928 at the moment there isn't one. We just keep track of the
8929 sections by their name, instead. Fortunately, the ABI gives
8930 names for all the ARM specific sections, so we will probably get
8932 switch (hdr->sh_type)
8935 case SHT_ARM_PREEMPTMAP:
8936 case SHT_ARM_ATTRIBUTES:
8943 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
8946 if (hdr->sh_type == SHT_ARM_ATTRIBUTES)
8947 elf32_arm_parse_attributes(abfd, hdr);
8951 /* A structure used to record a list of sections, independently
8952 of the next and prev fields in the asection structure. */
8953 typedef struct section_list
8956 struct section_list * next;
8957 struct section_list * prev;
8961 /* Unfortunately we need to keep a list of sections for which
8962 an _arm_elf_section_data structure has been allocated. This
8963 is because it is possible for functions like elf32_arm_write_section
8964 to be called on a section which has had an elf_data_structure
8965 allocated for it (and so the used_by_bfd field is valid) but
8966 for which the ARM extended version of this structure - the
8967 _arm_elf_section_data structure - has not been allocated. */
8968 static section_list * sections_with_arm_elf_section_data = NULL;
8971 record_section_with_arm_elf_section_data (asection * sec)
8973 struct section_list * entry;
8975 entry = bfd_malloc (sizeof (* entry));
8979 entry->next = sections_with_arm_elf_section_data;
8981 if (entry->next != NULL)
8982 entry->next->prev = entry;
8983 sections_with_arm_elf_section_data = entry;
8986 static struct section_list *
8987 find_arm_elf_section_entry (asection * sec)
8989 struct section_list * entry;
8990 static struct section_list * last_entry = NULL;
8992 /* This is a short cut for the typical case where the sections are added
8993 to the sections_with_arm_elf_section_data list in forward order and
8994 then looked up here in backwards order. This makes a real difference
8995 to the ld-srec/sec64k.exp linker test. */
8996 entry = sections_with_arm_elf_section_data;
8997 if (last_entry != NULL)
8999 if (last_entry->sec == sec)
9001 else if (last_entry->next != NULL
9002 && last_entry->next->sec == sec)
9003 entry = last_entry->next;
9006 for (; entry; entry = entry->next)
9007 if (entry->sec == sec)
9011 /* Record the entry prior to this one - it is the entry we are most
9012 likely to want to locate next time. Also this way if we have been
9013 called from unrecord_section_with_arm_elf_section_data() we will not
9014 be caching a pointer that is about to be freed. */
9015 last_entry = entry->prev;
9020 static _arm_elf_section_data *
9021 get_arm_elf_section_data (asection * sec)
9023 struct section_list * entry;
9025 entry = find_arm_elf_section_entry (sec);
9028 return elf32_arm_section_data (entry->sec);
9034 unrecord_section_with_arm_elf_section_data (asection * sec)
9036 struct section_list * entry;
9038 entry = find_arm_elf_section_entry (sec);
9042 if (entry->prev != NULL)
9043 entry->prev->next = entry->next;
9044 if (entry->next != NULL)
9045 entry->next->prev = entry->prev;
9046 if (entry == sections_with_arm_elf_section_data)
9047 sections_with_arm_elf_section_data = entry->next;
9052 /* Called for each symbol. Builds a section map based on mapping symbols.
9053 Does not alter any of the symbols. */
9056 elf32_arm_output_symbol_hook (struct bfd_link_info *info,
9058 Elf_Internal_Sym *elfsym,
9059 asection *input_sec,
9060 struct elf_link_hash_entry *h)
9063 elf32_arm_section_map *map;
9064 elf32_arm_section_map *newmap;
9065 _arm_elf_section_data *arm_data;
9066 struct elf32_arm_link_hash_table *globals;
9068 globals = elf32_arm_hash_table (info);
9069 if (globals->vxworks_p
9070 && !elf_vxworks_link_output_symbol_hook (info, name, elfsym,
9074 /* Only do this on final link. */
9075 if (info->relocatable)
9078 /* Only build a map if we need to byteswap code. */
9079 if (!globals->byteswap_code)
9082 /* We only want mapping symbols. */
9083 if (!bfd_is_arm_special_symbol_name (name, BFD_ARM_SPECIAL_SYM_TYPE_MAP))
9086 /* If this section has not been allocated an _arm_elf_section_data
9087 structure then we cannot record anything. */
9088 arm_data = get_arm_elf_section_data (input_sec);
9089 if (arm_data == NULL)
9092 mapcount = arm_data->mapcount + 1;
9093 map = arm_data->map;
9095 /* TODO: This may be inefficient, but we probably don't usually have many
9096 mapping symbols per section. */
9097 newmap = bfd_realloc (map, mapcount * sizeof (* map));
9100 arm_data->map = newmap;
9101 arm_data->mapcount = mapcount;
9103 newmap[mapcount - 1].vma = elfsym->st_value;
9104 newmap[mapcount - 1].type = name[1];
9113 struct bfd_link_info *info;
9116 bfd_boolean (*func) (void *, const char *, Elf_Internal_Sym *,
9117 asection *, struct elf_link_hash_entry *);
9118 } output_arch_syminfo;
9120 enum map_symbol_type
9128 /* Output a single PLT mapping symbol. */
9131 elf32_arm_ouput_plt_map_sym (output_arch_syminfo *osi,
9132 enum map_symbol_type type,
9135 static const char *names[3] = {"$a", "$t", "$d"};
9136 struct elf32_arm_link_hash_table *htab;
9137 Elf_Internal_Sym sym;
9139 htab = elf32_arm_hash_table (osi->info);
9140 sym.st_value = osi->plt_offset + offset;
9143 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
9144 sym.st_shndx = osi->plt_shndx;
9145 if (!osi->func (osi->finfo, names[type], &sym, htab->splt, NULL))
9151 /* Output mapping symbols for PLT entries associated with H. */
9154 elf32_arm_output_plt_map (struct elf_link_hash_entry *h, void *inf)
9156 output_arch_syminfo *osi = (output_arch_syminfo *) inf;
9157 struct elf32_arm_link_hash_table *htab;
9158 struct elf32_arm_link_hash_entry *eh;
9161 htab = elf32_arm_hash_table (osi->info);
9163 if (h->root.type == bfd_link_hash_indirect)
9166 if (h->root.type == bfd_link_hash_warning)
9167 /* When warning symbols are created, they **replace** the "real"
9168 entry in the hash table, thus we never get to see the real
9169 symbol in a hash traversal. So look at it now. */
9170 h = (struct elf_link_hash_entry *) h->root.u.i.link;
9172 if (h->plt.offset == (bfd_vma) -1)
9175 eh = (struct elf32_arm_link_hash_entry *) h;
9176 addr = h->plt.offset;
9177 if (htab->symbian_p)
9179 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_ARM, addr))
9181 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_DATA, addr + 4))
9184 else if (htab->vxworks_p)
9186 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_ARM, addr))
9188 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_DATA, addr + 8))
9190 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_ARM, addr + 12))
9192 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_DATA, addr + 20))
9197 bfd_boolean thumb_stub;
9199 thumb_stub = eh->plt_thumb_refcount > 0 && !htab->use_blx;
9202 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_THUMB, addr - 4))
9205 #ifdef FOUR_WORD_PLT
9206 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_ARM, addr))
9208 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_DATA, addr + 12))
9211 /* A three-word PLT with no Thumb thunk contains only Arm code,
9212 so only need to output a mapping symbol for the first PLT entry and
9213 entries with thumb thunks. */
9214 if (thumb_stub || addr == 20)
9216 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_ARM, addr))
9226 /* Output mapping symbols for the PLT. */
9229 elf32_arm_output_arch_local_syms (bfd *output_bfd,
9230 struct bfd_link_info *info,
9231 void *finfo, bfd_boolean (*func) (void *, const char *,
9234 struct elf_link_hash_entry *))
9236 output_arch_syminfo osi;
9237 struct elf32_arm_link_hash_table *htab;
9239 htab = elf32_arm_hash_table (info);
9240 if (!htab->splt || htab->splt->size == 0)
9243 check_use_blx(htab);
9247 osi.plt_shndx = _bfd_elf_section_from_bfd_section (output_bfd,
9248 htab->splt->output_section);
9249 osi.plt_offset = htab->splt->output_section->vma;
9251 /* Output mapping symbols for the plt header. SymbianOS does not have a
9253 if (htab->vxworks_p)
9255 /* VxWorks shared libraries have no PLT header. */
9258 if (!elf32_arm_ouput_plt_map_sym (&osi, ARM_MAP_ARM, 0))
9260 if (!elf32_arm_ouput_plt_map_sym (&osi, ARM_MAP_DATA, 12))
9264 else if (!htab->symbian_p)
9266 if (!elf32_arm_ouput_plt_map_sym (&osi, ARM_MAP_ARM, 0))
9268 #ifndef FOUR_WORD_PLT
9269 if (!elf32_arm_ouput_plt_map_sym (&osi, ARM_MAP_DATA, 16))
9274 elf_link_hash_traverse (&htab->root, elf32_arm_output_plt_map, (void *) &osi);
9278 /* Allocate target specific section data. */
9281 elf32_arm_new_section_hook (bfd *abfd, asection *sec)
9283 if (!sec->used_by_bfd)
9285 _arm_elf_section_data *sdata;
9286 bfd_size_type amt = sizeof (*sdata);
9288 sdata = bfd_zalloc (abfd, amt);
9291 sec->used_by_bfd = sdata;
9294 record_section_with_arm_elf_section_data (sec);
9296 return _bfd_elf_new_section_hook (abfd, sec);
9300 /* Used to order a list of mapping symbols by address. */
9303 elf32_arm_compare_mapping (const void * a, const void * b)
9305 return ((const elf32_arm_section_map *) a)->vma
9306 > ((const elf32_arm_section_map *) b)->vma;
9310 /* Do code byteswapping. Return FALSE afterwards so that the section is
9311 written out as normal. */
9314 elf32_arm_write_section (bfd *output_bfd ATTRIBUTE_UNUSED, asection *sec,
9318 _arm_elf_section_data *arm_data;
9319 elf32_arm_section_map *map;
9326 /* If this section has not been allocated an _arm_elf_section_data
9327 structure then we cannot record anything. */
9328 arm_data = get_arm_elf_section_data (sec);
9329 if (arm_data == NULL)
9332 mapcount = arm_data->mapcount;
9333 map = arm_data->map;
9338 qsort (map, mapcount, sizeof (* map), elf32_arm_compare_mapping);
9340 offset = sec->output_section->vma + sec->output_offset;
9341 ptr = map[0].vma - offset;
9342 for (i = 0; i < mapcount; i++)
9344 if (i == mapcount - 1)
9347 end = map[i + 1].vma - offset;
9349 switch (map[i].type)
9352 /* Byte swap code words. */
9353 while (ptr + 3 < end)
9355 tmp = contents[ptr];
9356 contents[ptr] = contents[ptr + 3];
9357 contents[ptr + 3] = tmp;
9358 tmp = contents[ptr + 1];
9359 contents[ptr + 1] = contents[ptr + 2];
9360 contents[ptr + 2] = tmp;
9366 /* Byte swap code halfwords. */
9367 while (ptr + 1 < end)
9369 tmp = contents[ptr];
9370 contents[ptr] = contents[ptr + 1];
9371 contents[ptr + 1] = tmp;
9377 /* Leave data alone. */
9384 arm_data->mapcount = 0;
9385 arm_data->map = NULL;
9386 unrecord_section_with_arm_elf_section_data (sec);
9392 unrecord_section_via_map_over_sections (bfd * abfd ATTRIBUTE_UNUSED,
9394 void * ignore ATTRIBUTE_UNUSED)
9396 unrecord_section_with_arm_elf_section_data (sec);
9400 elf32_arm_close_and_cleanup (bfd * abfd)
9403 bfd_map_over_sections (abfd,
9404 unrecord_section_via_map_over_sections,
9407 return _bfd_elf_close_and_cleanup (abfd);
9411 elf32_arm_bfd_free_cached_info (bfd * abfd)
9414 bfd_map_over_sections (abfd,
9415 unrecord_section_via_map_over_sections,
9418 return _bfd_free_cached_info (abfd);
9421 /* Display STT_ARM_TFUNC symbols as functions. */
9424 elf32_arm_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
9427 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
9429 if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_ARM_TFUNC)
9430 elfsym->symbol.flags |= BSF_FUNCTION;
9434 /* Mangle thumb function symbols as we read them in. */
9437 elf32_arm_swap_symbol_in (bfd * abfd,
9440 Elf_Internal_Sym *dst)
9442 if (!bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst))
9445 /* New EABI objects mark thumb function symbols by setting the low bit of
9446 the address. Turn these into STT_ARM_TFUNC. */
9447 if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
9448 && (dst->st_value & 1))
9450 dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC);
9451 dst->st_value &= ~(bfd_vma) 1;
9457 /* Mangle thumb function symbols as we write them out. */
9460 elf32_arm_swap_symbol_out (bfd *abfd,
9461 const Elf_Internal_Sym *src,
9465 Elf_Internal_Sym newsym;
9467 /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
9468 of the address set, as per the new EABI. We do this unconditionally
9469 because objcopy does not set the elf header flags until after
9470 it writes out the symbol table. */
9471 if (ELF_ST_TYPE (src->st_info) == STT_ARM_TFUNC)
9474 newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
9475 if (newsym.st_shndx != SHN_UNDEF)
9477 /* Do this only for defined symbols. At link type, the static
9478 linker will simulate the work of dynamic linker of resolving
9479 symbols and will carry over the thumbness of found symbols to
9480 the output symbol table. It's not clear how it happens, but
9481 the thumbness of undefined symbols can well be different at
9482 runtime, and writing '1' for them will be confusing for users
9483 and possibly for dynamic linker itself.
9485 newsym.st_value |= 1;
9490 bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
9493 /* Add the PT_ARM_EXIDX program header. */
9496 elf32_arm_modify_segment_map (bfd *abfd,
9497 struct bfd_link_info *info ATTRIBUTE_UNUSED)
9499 struct elf_segment_map *m;
9502 sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
9503 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
9505 /* If there is already a PT_ARM_EXIDX header, then we do not
9506 want to add another one. This situation arises when running
9507 "strip"; the input binary already has the header. */
9508 m = elf_tdata (abfd)->segment_map;
9509 while (m && m->p_type != PT_ARM_EXIDX)
9513 m = bfd_zalloc (abfd, sizeof (struct elf_segment_map));
9516 m->p_type = PT_ARM_EXIDX;
9518 m->sections[0] = sec;
9520 m->next = elf_tdata (abfd)->segment_map;
9521 elf_tdata (abfd)->segment_map = m;
9528 /* We may add a PT_ARM_EXIDX program header. */
9531 elf32_arm_additional_program_headers (bfd *abfd,
9532 struct bfd_link_info *info ATTRIBUTE_UNUSED)
9536 sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
9537 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
9543 /* We use this to override swap_symbol_in and swap_symbol_out. */
9544 const struct elf_size_info elf32_arm_size_info = {
9545 sizeof (Elf32_External_Ehdr),
9546 sizeof (Elf32_External_Phdr),
9547 sizeof (Elf32_External_Shdr),
9548 sizeof (Elf32_External_Rel),
9549 sizeof (Elf32_External_Rela),
9550 sizeof (Elf32_External_Sym),
9551 sizeof (Elf32_External_Dyn),
9552 sizeof (Elf_External_Note),
9556 ELFCLASS32, EV_CURRENT,
9557 bfd_elf32_write_out_phdrs,
9558 bfd_elf32_write_shdrs_and_ehdr,
9559 bfd_elf32_write_relocs,
9560 elf32_arm_swap_symbol_in,
9561 elf32_arm_swap_symbol_out,
9562 bfd_elf32_slurp_reloc_table,
9563 bfd_elf32_slurp_symbol_table,
9564 bfd_elf32_swap_dyn_in,
9565 bfd_elf32_swap_dyn_out,
9566 bfd_elf32_swap_reloc_in,
9567 bfd_elf32_swap_reloc_out,
9568 bfd_elf32_swap_reloca_in,
9569 bfd_elf32_swap_reloca_out
9572 #define ELF_ARCH bfd_arch_arm
9573 #define ELF_MACHINE_CODE EM_ARM
9574 #ifdef __QNXTARGET__
9575 #define ELF_MAXPAGESIZE 0x1000
9577 #define ELF_MAXPAGESIZE 0x8000
9579 #define ELF_MINPAGESIZE 0x1000
9580 #define ELF_COMMONPAGESIZE 0x1000
9582 #define bfd_elf32_mkobject elf32_arm_mkobject
9584 #define bfd_elf32_bfd_copy_private_bfd_data elf32_arm_copy_private_bfd_data
9585 #define bfd_elf32_bfd_merge_private_bfd_data elf32_arm_merge_private_bfd_data
9586 #define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
9587 #define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
9588 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
9589 #define bfd_elf32_bfd_reloc_type_lookup elf32_arm_reloc_type_lookup
9590 #define bfd_elf32_find_nearest_line elf32_arm_find_nearest_line
9591 #define bfd_elf32_find_inliner_info elf32_arm_find_inliner_info
9592 #define bfd_elf32_new_section_hook elf32_arm_new_section_hook
9593 #define bfd_elf32_bfd_is_target_special_symbol elf32_arm_is_target_special_symbol
9594 #define bfd_elf32_close_and_cleanup elf32_arm_close_and_cleanup
9595 #define bfd_elf32_bfd_free_cached_info elf32_arm_bfd_free_cached_info
9596 #define bfd_elf32_bfd_final_link elf32_arm_bfd_final_link
9598 #define elf_backend_get_symbol_type elf32_arm_get_symbol_type
9599 #define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook
9600 #define elf_backend_gc_sweep_hook elf32_arm_gc_sweep_hook
9601 #define elf_backend_check_relocs elf32_arm_check_relocs
9602 #define elf_backend_relocate_section elf32_arm_relocate_section
9603 #define elf_backend_write_section elf32_arm_write_section
9604 #define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol
9605 #define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections
9606 #define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol
9607 #define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections
9608 #define elf_backend_link_output_symbol_hook elf32_arm_output_symbol_hook
9609 #define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections
9610 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections
9611 #define elf_backend_post_process_headers elf32_arm_post_process_headers
9612 #define elf_backend_reloc_type_class elf32_arm_reloc_type_class
9613 #define elf_backend_object_p elf32_arm_object_p
9614 #define elf_backend_section_flags elf32_arm_section_flags
9615 #define elf_backend_fake_sections elf32_arm_fake_sections
9616 #define elf_backend_section_from_shdr elf32_arm_section_from_shdr
9617 #define elf_backend_final_write_processing elf32_arm_final_write_processing
9618 #define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol
9619 #define elf_backend_symbol_processing elf32_arm_symbol_processing
9620 #define elf_backend_size_info elf32_arm_size_info
9621 #define elf_backend_modify_segment_map elf32_arm_modify_segment_map
9622 #define elf_backend_additional_program_headers \
9623 elf32_arm_additional_program_headers
9624 #define elf_backend_output_arch_local_syms \
9625 elf32_arm_output_arch_local_syms
9626 #define elf_backend_begin_write_processing \
9627 elf32_arm_begin_write_processing
9629 #define elf_backend_can_refcount 1
9630 #define elf_backend_can_gc_sections 1
9631 #define elf_backend_plt_readonly 1
9632 #define elf_backend_want_got_plt 1
9633 #define elf_backend_want_plt_sym 0
9634 #define elf_backend_may_use_rel_p 1
9635 #define elf_backend_may_use_rela_p 0
9636 #define elf_backend_default_use_rela_p 0
9637 #define elf_backend_rela_normal 0
9639 #define elf_backend_got_header_size 12
9641 #include "elf32-target.h"
9643 /* VxWorks Targets */
9645 #undef TARGET_LITTLE_SYM
9646 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vxworks_vec
9647 #undef TARGET_LITTLE_NAME
9648 #define TARGET_LITTLE_NAME "elf32-littlearm-vxworks"
9649 #undef TARGET_BIG_SYM
9650 #define TARGET_BIG_SYM bfd_elf32_bigarm_vxworks_vec
9651 #undef TARGET_BIG_NAME
9652 #define TARGET_BIG_NAME "elf32-bigarm-vxworks"
9654 /* Like elf32_arm_link_hash_table_create -- but overrides
9655 appropriately for VxWorks. */
9656 static struct bfd_link_hash_table *
9657 elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
9659 struct bfd_link_hash_table *ret;
9661 ret = elf32_arm_link_hash_table_create (abfd);
9664 struct elf32_arm_link_hash_table *htab
9665 = (struct elf32_arm_link_hash_table *) ret;
9667 htab->vxworks_p = 1;
9673 elf32_arm_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
9675 elf32_arm_final_write_processing (abfd, linker);
9676 elf_vxworks_final_write_processing (abfd, linker);
9680 #define elf32_bed elf32_arm_vxworks_bed
9682 #undef bfd_elf32_bfd_link_hash_table_create
9683 #define bfd_elf32_bfd_link_hash_table_create \
9684 elf32_arm_vxworks_link_hash_table_create
9685 #undef elf_backend_add_symbol_hook
9686 #define elf_backend_add_symbol_hook \
9687 elf_vxworks_add_symbol_hook
9688 #undef elf_backend_final_write_processing
9689 #define elf_backend_final_write_processing \
9690 elf32_arm_vxworks_final_write_processing
9691 #undef elf_backend_emit_relocs
9692 #define elf_backend_emit_relocs \
9693 elf_vxworks_emit_relocs
9695 #undef elf_backend_may_use_rel_p
9696 #define elf_backend_may_use_rel_p 0
9697 #undef elf_backend_may_use_rela_p
9698 #define elf_backend_may_use_rela_p 1
9699 #undef elf_backend_default_use_rela_p
9700 #define elf_backend_default_use_rela_p 1
9701 #undef elf_backend_rela_normal
9702 #define elf_backend_rela_normal 1
9703 #undef elf_backend_want_plt_sym
9704 #define elf_backend_want_plt_sym 1
9705 #undef ELF_MAXPAGESIZE
9706 #define ELF_MAXPAGESIZE 0x1000
9708 #include "elf32-target.h"
9711 /* Symbian OS Targets */
9713 #undef TARGET_LITTLE_SYM
9714 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_symbian_vec
9715 #undef TARGET_LITTLE_NAME
9716 #define TARGET_LITTLE_NAME "elf32-littlearm-symbian"
9717 #undef TARGET_BIG_SYM
9718 #define TARGET_BIG_SYM bfd_elf32_bigarm_symbian_vec
9719 #undef TARGET_BIG_NAME
9720 #define TARGET_BIG_NAME "elf32-bigarm-symbian"
9722 /* Like elf32_arm_link_hash_table_create -- but overrides
9723 appropriately for Symbian OS. */
9724 static struct bfd_link_hash_table *
9725 elf32_arm_symbian_link_hash_table_create (bfd *abfd)
9727 struct bfd_link_hash_table *ret;
9729 ret = elf32_arm_link_hash_table_create (abfd);
9732 struct elf32_arm_link_hash_table *htab
9733 = (struct elf32_arm_link_hash_table *)ret;
9734 /* There is no PLT header for Symbian OS. */
9735 htab->plt_header_size = 0;
9736 /* The PLT entries are each three instructions. */
9737 htab->plt_entry_size = 4 * NUM_ELEM (elf32_arm_symbian_plt_entry);
9738 htab->symbian_p = 1;
9739 /* Symbian uses armv5t or above, so use_blx is always true. */
9741 htab->root.is_relocatable_executable = 1;
9746 static const struct bfd_elf_special_section
9747 elf32_arm_symbian_special_sections[] =
9749 /* In a BPABI executable, the dynamic linking sections do not go in
9750 the loadable read-only segment. The post-linker may wish to
9751 refer to these sections, but they are not part of the final
9753 { STRING_COMMA_LEN (".dynamic"), 0, SHT_DYNAMIC, 0 },
9754 { STRING_COMMA_LEN (".dynstr"), 0, SHT_STRTAB, 0 },
9755 { STRING_COMMA_LEN (".dynsym"), 0, SHT_DYNSYM, 0 },
9756 { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS, 0 },
9757 { STRING_COMMA_LEN (".hash"), 0, SHT_HASH, 0 },
9758 /* These sections do not need to be writable as the SymbianOS
9759 postlinker will arrange things so that no dynamic relocation is
9761 { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC },
9762 { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC },
9763 { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC },
9764 { NULL, 0, 0, 0, 0 }
9768 elf32_arm_symbian_begin_write_processing (bfd *abfd,
9769 struct bfd_link_info *link_info)
9771 /* BPABI objects are never loaded directly by an OS kernel; they are
9772 processed by a postlinker first, into an OS-specific format. If
9773 the D_PAGED bit is set on the file, BFD will align segments on
9774 page boundaries, so that an OS can directly map the file. With
9775 BPABI objects, that just results in wasted space. In addition,
9776 because we clear the D_PAGED bit, map_sections_to_segments will
9777 recognize that the program headers should not be mapped into any
9778 loadable segment. */
9779 abfd->flags &= ~D_PAGED;
9780 elf32_arm_begin_write_processing(abfd, link_info);
9784 elf32_arm_symbian_modify_segment_map (bfd *abfd,
9785 struct bfd_link_info *info)
9787 struct elf_segment_map *m;
9790 /* BPABI shared libraries and executables should have a PT_DYNAMIC
9791 segment. However, because the .dynamic section is not marked
9792 with SEC_LOAD, the generic ELF code will not create such a
9794 dynsec = bfd_get_section_by_name (abfd, ".dynamic");
9797 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
9798 if (m->p_type == PT_DYNAMIC)
9803 m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
9804 m->next = elf_tdata (abfd)->segment_map;
9805 elf_tdata (abfd)->segment_map = m;
9809 /* Also call the generic arm routine. */
9810 return elf32_arm_modify_segment_map (abfd, info);
9814 #define elf32_bed elf32_arm_symbian_bed
9816 /* The dynamic sections are not allocated on SymbianOS; the postlinker
9817 will process them and then discard them. */
9818 #undef ELF_DYNAMIC_SEC_FLAGS
9819 #define ELF_DYNAMIC_SEC_FLAGS \
9820 (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
9822 #undef bfd_elf32_bfd_link_hash_table_create
9823 #define bfd_elf32_bfd_link_hash_table_create \
9824 elf32_arm_symbian_link_hash_table_create
9825 #undef elf_backend_add_symbol_hook
9827 #undef elf_backend_special_sections
9828 #define elf_backend_special_sections elf32_arm_symbian_special_sections
9830 #undef elf_backend_begin_write_processing
9831 #define elf_backend_begin_write_processing \
9832 elf32_arm_symbian_begin_write_processing
9833 #undef elf_backend_final_write_processing
9834 #define elf_backend_final_write_processing \
9835 elf32_arm_final_write_processing
9836 #undef elf_backend_emit_relocs
9838 #undef elf_backend_modify_segment_map
9839 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
9841 /* There is no .got section for BPABI objects, and hence no header. */
9842 #undef elf_backend_got_header_size
9843 #define elf_backend_got_header_size 0
9845 /* Similarly, there is no .got.plt section. */
9846 #undef elf_backend_want_got_plt
9847 #define elf_backend_want_got_plt 0
9849 #undef elf_backend_may_use_rel_p
9850 #define elf_backend_may_use_rel_p 1
9851 #undef elf_backend_may_use_rela_p
9852 #define elf_backend_may_use_rela_p 0
9853 #undef elf_backend_default_use_rela_p
9854 #define elf_backend_default_use_rela_p 0
9855 #undef elf_backend_rela_normal
9856 #define elf_backend_rela_normal 0
9857 #undef elf_backend_want_plt_sym
9858 #define elf_backend_want_plt_sym 0
9859 #undef ELF_MAXPAGESIZE
9860 #define ELF_MAXPAGESIZE 0x8000
9862 #include "elf32-target.h"