1 /* 32-bit ELF support for ARM
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
24 #include "libiberty.h"
27 #include "elf-vxworks.h"
30 /* Return the relocation section associated with NAME. HTAB is the
31 bfd's elf32_arm_link_hash_entry. */
32 #define RELOC_SECTION(HTAB, NAME) \
33 ((HTAB)->use_rel ? ".rel" NAME : ".rela" NAME)
35 /* Return size of a relocation entry. HTAB is the bfd's
36 elf32_arm_link_hash_entry. */
37 #define RELOC_SIZE(HTAB) \
39 ? sizeof (Elf32_External_Rel) \
40 : sizeof (Elf32_External_Rela))
42 /* Return function to swap relocations in. HTAB is the bfd's
43 elf32_arm_link_hash_entry. */
44 #define SWAP_RELOC_IN(HTAB) \
46 ? bfd_elf32_swap_reloc_in \
47 : bfd_elf32_swap_reloca_in)
49 /* Return function to swap relocations out. HTAB is the bfd's
50 elf32_arm_link_hash_entry. */
51 #define SWAP_RELOC_OUT(HTAB) \
53 ? bfd_elf32_swap_reloc_out \
54 : bfd_elf32_swap_reloca_out)
56 #define elf_info_to_howto 0
57 #define elf_info_to_howto_rel elf32_arm_info_to_howto
59 #define ARM_ELF_ABI_VERSION 0
60 #define ARM_ELF_OS_ABI_VERSION ELFOSABI_ARM
62 static struct elf_backend_data elf32_arm_vxworks_bed
;
64 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
65 R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
68 static reloc_howto_type elf32_arm_howto_table_1
[] =
71 HOWTO (R_ARM_NONE
, /* type */
73 0, /* size (0 = byte, 1 = short, 2 = long) */
75 FALSE
, /* pc_relative */
77 complain_overflow_dont
,/* complain_on_overflow */
78 bfd_elf_generic_reloc
, /* special_function */
79 "R_ARM_NONE", /* name */
80 FALSE
, /* partial_inplace */
83 FALSE
), /* pcrel_offset */
85 HOWTO (R_ARM_PC24
, /* type */
87 2, /* size (0 = byte, 1 = short, 2 = long) */
89 TRUE
, /* pc_relative */
91 complain_overflow_signed
,/* complain_on_overflow */
92 bfd_elf_generic_reloc
, /* special_function */
93 "R_ARM_PC24", /* name */
94 FALSE
, /* partial_inplace */
95 0x00ffffff, /* src_mask */
96 0x00ffffff, /* dst_mask */
97 TRUE
), /* pcrel_offset */
100 HOWTO (R_ARM_ABS32
, /* type */
102 2, /* size (0 = byte, 1 = short, 2 = long) */
104 FALSE
, /* pc_relative */
106 complain_overflow_bitfield
,/* complain_on_overflow */
107 bfd_elf_generic_reloc
, /* special_function */
108 "R_ARM_ABS32", /* name */
109 FALSE
, /* partial_inplace */
110 0xffffffff, /* src_mask */
111 0xffffffff, /* dst_mask */
112 FALSE
), /* pcrel_offset */
114 /* standard 32bit pc-relative reloc */
115 HOWTO (R_ARM_REL32
, /* type */
117 2, /* size (0 = byte, 1 = short, 2 = long) */
119 TRUE
, /* pc_relative */
121 complain_overflow_bitfield
,/* complain_on_overflow */
122 bfd_elf_generic_reloc
, /* special_function */
123 "R_ARM_REL32", /* name */
124 FALSE
, /* partial_inplace */
125 0xffffffff, /* src_mask */
126 0xffffffff, /* dst_mask */
127 TRUE
), /* pcrel_offset */
129 /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
130 HOWTO (R_ARM_LDR_PC_G0
, /* type */
132 0, /* size (0 = byte, 1 = short, 2 = long) */
134 TRUE
, /* pc_relative */
136 complain_overflow_dont
,/* complain_on_overflow */
137 bfd_elf_generic_reloc
, /* special_function */
138 "R_ARM_LDR_PC_G0", /* name */
139 FALSE
, /* partial_inplace */
140 0xffffffff, /* src_mask */
141 0xffffffff, /* dst_mask */
142 TRUE
), /* pcrel_offset */
144 /* 16 bit absolute */
145 HOWTO (R_ARM_ABS16
, /* type */
147 1, /* size (0 = byte, 1 = short, 2 = long) */
149 FALSE
, /* pc_relative */
151 complain_overflow_bitfield
,/* complain_on_overflow */
152 bfd_elf_generic_reloc
, /* special_function */
153 "R_ARM_ABS16", /* name */
154 FALSE
, /* partial_inplace */
155 0x0000ffff, /* src_mask */
156 0x0000ffff, /* dst_mask */
157 FALSE
), /* pcrel_offset */
159 /* 12 bit absolute */
160 HOWTO (R_ARM_ABS12
, /* type */
162 2, /* size (0 = byte, 1 = short, 2 = long) */
164 FALSE
, /* pc_relative */
166 complain_overflow_bitfield
,/* complain_on_overflow */
167 bfd_elf_generic_reloc
, /* special_function */
168 "R_ARM_ABS12", /* name */
169 FALSE
, /* partial_inplace */
170 0x00000fff, /* src_mask */
171 0x00000fff, /* dst_mask */
172 FALSE
), /* pcrel_offset */
174 HOWTO (R_ARM_THM_ABS5
, /* type */
176 1, /* size (0 = byte, 1 = short, 2 = long) */
178 FALSE
, /* pc_relative */
180 complain_overflow_bitfield
,/* complain_on_overflow */
181 bfd_elf_generic_reloc
, /* special_function */
182 "R_ARM_THM_ABS5", /* name */
183 FALSE
, /* partial_inplace */
184 0x000007e0, /* src_mask */
185 0x000007e0, /* dst_mask */
186 FALSE
), /* pcrel_offset */
189 HOWTO (R_ARM_ABS8
, /* type */
191 0, /* size (0 = byte, 1 = short, 2 = long) */
193 FALSE
, /* pc_relative */
195 complain_overflow_bitfield
,/* complain_on_overflow */
196 bfd_elf_generic_reloc
, /* special_function */
197 "R_ARM_ABS8", /* name */
198 FALSE
, /* partial_inplace */
199 0x000000ff, /* src_mask */
200 0x000000ff, /* dst_mask */
201 FALSE
), /* pcrel_offset */
203 HOWTO (R_ARM_SBREL32
, /* type */
205 2, /* size (0 = byte, 1 = short, 2 = long) */
207 FALSE
, /* pc_relative */
209 complain_overflow_dont
,/* complain_on_overflow */
210 bfd_elf_generic_reloc
, /* special_function */
211 "R_ARM_SBREL32", /* name */
212 FALSE
, /* partial_inplace */
213 0xffffffff, /* src_mask */
214 0xffffffff, /* dst_mask */
215 FALSE
), /* pcrel_offset */
217 HOWTO (R_ARM_THM_CALL
, /* type */
219 2, /* size (0 = byte, 1 = short, 2 = long) */
221 TRUE
, /* pc_relative */
223 complain_overflow_signed
,/* complain_on_overflow */
224 bfd_elf_generic_reloc
, /* special_function */
225 "R_ARM_THM_CALL", /* name */
226 FALSE
, /* partial_inplace */
227 0x07ff07ff, /* src_mask */
228 0x07ff07ff, /* dst_mask */
229 TRUE
), /* pcrel_offset */
231 HOWTO (R_ARM_THM_PC8
, /* type */
233 1, /* size (0 = byte, 1 = short, 2 = long) */
235 TRUE
, /* pc_relative */
237 complain_overflow_signed
,/* complain_on_overflow */
238 bfd_elf_generic_reloc
, /* special_function */
239 "R_ARM_THM_PC8", /* name */
240 FALSE
, /* partial_inplace */
241 0x000000ff, /* src_mask */
242 0x000000ff, /* dst_mask */
243 TRUE
), /* pcrel_offset */
245 HOWTO (R_ARM_BREL_ADJ
, /* type */
247 1, /* size (0 = byte, 1 = short, 2 = long) */
249 FALSE
, /* pc_relative */
251 complain_overflow_signed
,/* complain_on_overflow */
252 bfd_elf_generic_reloc
, /* special_function */
253 "R_ARM_BREL_ADJ", /* name */
254 FALSE
, /* partial_inplace */
255 0xffffffff, /* src_mask */
256 0xffffffff, /* dst_mask */
257 FALSE
), /* pcrel_offset */
259 HOWTO (R_ARM_SWI24
, /* type */
261 0, /* size (0 = byte, 1 = short, 2 = long) */
263 FALSE
, /* pc_relative */
265 complain_overflow_signed
,/* complain_on_overflow */
266 bfd_elf_generic_reloc
, /* special_function */
267 "R_ARM_SWI24", /* name */
268 FALSE
, /* partial_inplace */
269 0x00000000, /* src_mask */
270 0x00000000, /* dst_mask */
271 FALSE
), /* pcrel_offset */
273 HOWTO (R_ARM_THM_SWI8
, /* type */
275 0, /* size (0 = byte, 1 = short, 2 = long) */
277 FALSE
, /* pc_relative */
279 complain_overflow_signed
,/* complain_on_overflow */
280 bfd_elf_generic_reloc
, /* special_function */
281 "R_ARM_SWI8", /* name */
282 FALSE
, /* partial_inplace */
283 0x00000000, /* src_mask */
284 0x00000000, /* dst_mask */
285 FALSE
), /* pcrel_offset */
287 /* BLX instruction for the ARM. */
288 HOWTO (R_ARM_XPC25
, /* type */
290 2, /* size (0 = byte, 1 = short, 2 = long) */
292 TRUE
, /* pc_relative */
294 complain_overflow_signed
,/* complain_on_overflow */
295 bfd_elf_generic_reloc
, /* special_function */
296 "R_ARM_XPC25", /* name */
297 FALSE
, /* partial_inplace */
298 0x00ffffff, /* src_mask */
299 0x00ffffff, /* dst_mask */
300 TRUE
), /* pcrel_offset */
302 /* BLX instruction for the Thumb. */
303 HOWTO (R_ARM_THM_XPC22
, /* type */
305 2, /* size (0 = byte, 1 = short, 2 = long) */
307 TRUE
, /* pc_relative */
309 complain_overflow_signed
,/* complain_on_overflow */
310 bfd_elf_generic_reloc
, /* special_function */
311 "R_ARM_THM_XPC22", /* name */
312 FALSE
, /* partial_inplace */
313 0x07ff07ff, /* src_mask */
314 0x07ff07ff, /* dst_mask */
315 TRUE
), /* pcrel_offset */
317 /* Dynamic TLS relocations. */
319 HOWTO (R_ARM_TLS_DTPMOD32
, /* type */
321 2, /* size (0 = byte, 1 = short, 2 = long) */
323 FALSE
, /* pc_relative */
325 complain_overflow_bitfield
,/* complain_on_overflow */
326 bfd_elf_generic_reloc
, /* special_function */
327 "R_ARM_TLS_DTPMOD32", /* name */
328 TRUE
, /* partial_inplace */
329 0xffffffff, /* src_mask */
330 0xffffffff, /* dst_mask */
331 FALSE
), /* pcrel_offset */
333 HOWTO (R_ARM_TLS_DTPOFF32
, /* type */
335 2, /* size (0 = byte, 1 = short, 2 = long) */
337 FALSE
, /* pc_relative */
339 complain_overflow_bitfield
,/* complain_on_overflow */
340 bfd_elf_generic_reloc
, /* special_function */
341 "R_ARM_TLS_DTPOFF32", /* name */
342 TRUE
, /* partial_inplace */
343 0xffffffff, /* src_mask */
344 0xffffffff, /* dst_mask */
345 FALSE
), /* pcrel_offset */
347 HOWTO (R_ARM_TLS_TPOFF32
, /* type */
349 2, /* size (0 = byte, 1 = short, 2 = long) */
351 FALSE
, /* pc_relative */
353 complain_overflow_bitfield
,/* complain_on_overflow */
354 bfd_elf_generic_reloc
, /* special_function */
355 "R_ARM_TLS_TPOFF32", /* name */
356 TRUE
, /* partial_inplace */
357 0xffffffff, /* src_mask */
358 0xffffffff, /* dst_mask */
359 FALSE
), /* pcrel_offset */
361 /* Relocs used in ARM Linux */
363 HOWTO (R_ARM_COPY
, /* type */
365 2, /* size (0 = byte, 1 = short, 2 = long) */
367 FALSE
, /* pc_relative */
369 complain_overflow_bitfield
,/* complain_on_overflow */
370 bfd_elf_generic_reloc
, /* special_function */
371 "R_ARM_COPY", /* name */
372 TRUE
, /* partial_inplace */
373 0xffffffff, /* src_mask */
374 0xffffffff, /* dst_mask */
375 FALSE
), /* pcrel_offset */
377 HOWTO (R_ARM_GLOB_DAT
, /* type */
379 2, /* size (0 = byte, 1 = short, 2 = long) */
381 FALSE
, /* pc_relative */
383 complain_overflow_bitfield
,/* complain_on_overflow */
384 bfd_elf_generic_reloc
, /* special_function */
385 "R_ARM_GLOB_DAT", /* name */
386 TRUE
, /* partial_inplace */
387 0xffffffff, /* src_mask */
388 0xffffffff, /* dst_mask */
389 FALSE
), /* pcrel_offset */
391 HOWTO (R_ARM_JUMP_SLOT
, /* type */
393 2, /* size (0 = byte, 1 = short, 2 = long) */
395 FALSE
, /* pc_relative */
397 complain_overflow_bitfield
,/* complain_on_overflow */
398 bfd_elf_generic_reloc
, /* special_function */
399 "R_ARM_JUMP_SLOT", /* name */
400 TRUE
, /* partial_inplace */
401 0xffffffff, /* src_mask */
402 0xffffffff, /* dst_mask */
403 FALSE
), /* pcrel_offset */
405 HOWTO (R_ARM_RELATIVE
, /* type */
407 2, /* size (0 = byte, 1 = short, 2 = long) */
409 FALSE
, /* pc_relative */
411 complain_overflow_bitfield
,/* complain_on_overflow */
412 bfd_elf_generic_reloc
, /* special_function */
413 "R_ARM_RELATIVE", /* name */
414 TRUE
, /* partial_inplace */
415 0xffffffff, /* src_mask */
416 0xffffffff, /* dst_mask */
417 FALSE
), /* pcrel_offset */
419 HOWTO (R_ARM_GOTOFF32
, /* type */
421 2, /* size (0 = byte, 1 = short, 2 = long) */
423 FALSE
, /* pc_relative */
425 complain_overflow_bitfield
,/* complain_on_overflow */
426 bfd_elf_generic_reloc
, /* special_function */
427 "R_ARM_GOTOFF32", /* name */
428 TRUE
, /* partial_inplace */
429 0xffffffff, /* src_mask */
430 0xffffffff, /* dst_mask */
431 FALSE
), /* pcrel_offset */
433 HOWTO (R_ARM_GOTPC
, /* type */
435 2, /* size (0 = byte, 1 = short, 2 = long) */
437 TRUE
, /* pc_relative */
439 complain_overflow_bitfield
,/* complain_on_overflow */
440 bfd_elf_generic_reloc
, /* special_function */
441 "R_ARM_GOTPC", /* name */
442 TRUE
, /* partial_inplace */
443 0xffffffff, /* src_mask */
444 0xffffffff, /* dst_mask */
445 TRUE
), /* pcrel_offset */
447 HOWTO (R_ARM_GOT32
, /* type */
449 2, /* size (0 = byte, 1 = short, 2 = long) */
451 FALSE
, /* pc_relative */
453 complain_overflow_bitfield
,/* complain_on_overflow */
454 bfd_elf_generic_reloc
, /* special_function */
455 "R_ARM_GOT32", /* name */
456 TRUE
, /* partial_inplace */
457 0xffffffff, /* src_mask */
458 0xffffffff, /* dst_mask */
459 FALSE
), /* pcrel_offset */
461 HOWTO (R_ARM_PLT32
, /* type */
463 2, /* size (0 = byte, 1 = short, 2 = long) */
465 TRUE
, /* pc_relative */
467 complain_overflow_bitfield
,/* complain_on_overflow */
468 bfd_elf_generic_reloc
, /* special_function */
469 "R_ARM_PLT32", /* name */
470 FALSE
, /* partial_inplace */
471 0x00ffffff, /* src_mask */
472 0x00ffffff, /* dst_mask */
473 TRUE
), /* pcrel_offset */
475 HOWTO (R_ARM_CALL
, /* type */
477 2, /* size (0 = byte, 1 = short, 2 = long) */
479 TRUE
, /* pc_relative */
481 complain_overflow_signed
,/* complain_on_overflow */
482 bfd_elf_generic_reloc
, /* special_function */
483 "R_ARM_CALL", /* name */
484 FALSE
, /* partial_inplace */
485 0x00ffffff, /* src_mask */
486 0x00ffffff, /* dst_mask */
487 TRUE
), /* pcrel_offset */
489 HOWTO (R_ARM_JUMP24
, /* type */
491 2, /* size (0 = byte, 1 = short, 2 = long) */
493 TRUE
, /* pc_relative */
495 complain_overflow_signed
,/* complain_on_overflow */
496 bfd_elf_generic_reloc
, /* special_function */
497 "R_ARM_JUMP24", /* name */
498 FALSE
, /* partial_inplace */
499 0x00ffffff, /* src_mask */
500 0x00ffffff, /* dst_mask */
501 TRUE
), /* pcrel_offset */
503 HOWTO (R_ARM_THM_JUMP24
, /* type */
505 2, /* size (0 = byte, 1 = short, 2 = long) */
507 TRUE
, /* pc_relative */
509 complain_overflow_signed
,/* complain_on_overflow */
510 bfd_elf_generic_reloc
, /* special_function */
511 "R_ARM_THM_JUMP24", /* name */
512 FALSE
, /* partial_inplace */
513 0x07ff2fff, /* src_mask */
514 0x07ff2fff, /* dst_mask */
515 TRUE
), /* pcrel_offset */
517 HOWTO (R_ARM_BASE_ABS
, /* type */
519 2, /* size (0 = byte, 1 = short, 2 = long) */
521 FALSE
, /* pc_relative */
523 complain_overflow_dont
,/* complain_on_overflow */
524 bfd_elf_generic_reloc
, /* special_function */
525 "R_ARM_BASE_ABS", /* name */
526 FALSE
, /* partial_inplace */
527 0xffffffff, /* src_mask */
528 0xffffffff, /* dst_mask */
529 FALSE
), /* pcrel_offset */
531 HOWTO (R_ARM_ALU_PCREL7_0
, /* type */
533 2, /* size (0 = byte, 1 = short, 2 = long) */
535 TRUE
, /* pc_relative */
537 complain_overflow_dont
,/* complain_on_overflow */
538 bfd_elf_generic_reloc
, /* special_function */
539 "R_ARM_ALU_PCREL_7_0", /* name */
540 FALSE
, /* partial_inplace */
541 0x00000fff, /* src_mask */
542 0x00000fff, /* dst_mask */
543 TRUE
), /* pcrel_offset */
545 HOWTO (R_ARM_ALU_PCREL15_8
, /* type */
547 2, /* size (0 = byte, 1 = short, 2 = long) */
549 TRUE
, /* pc_relative */
551 complain_overflow_dont
,/* complain_on_overflow */
552 bfd_elf_generic_reloc
, /* special_function */
553 "R_ARM_ALU_PCREL_15_8",/* name */
554 FALSE
, /* partial_inplace */
555 0x00000fff, /* src_mask */
556 0x00000fff, /* dst_mask */
557 TRUE
), /* pcrel_offset */
559 HOWTO (R_ARM_ALU_PCREL23_15
, /* type */
561 2, /* size (0 = byte, 1 = short, 2 = long) */
563 TRUE
, /* pc_relative */
565 complain_overflow_dont
,/* complain_on_overflow */
566 bfd_elf_generic_reloc
, /* special_function */
567 "R_ARM_ALU_PCREL_23_15",/* name */
568 FALSE
, /* partial_inplace */
569 0x00000fff, /* src_mask */
570 0x00000fff, /* dst_mask */
571 TRUE
), /* pcrel_offset */
573 HOWTO (R_ARM_LDR_SBREL_11_0
, /* type */
575 2, /* size (0 = byte, 1 = short, 2 = long) */
577 FALSE
, /* pc_relative */
579 complain_overflow_dont
,/* complain_on_overflow */
580 bfd_elf_generic_reloc
, /* special_function */
581 "R_ARM_LDR_SBREL_11_0",/* name */
582 FALSE
, /* partial_inplace */
583 0x00000fff, /* src_mask */
584 0x00000fff, /* dst_mask */
585 FALSE
), /* pcrel_offset */
587 HOWTO (R_ARM_ALU_SBREL_19_12
, /* type */
589 2, /* size (0 = byte, 1 = short, 2 = long) */
591 FALSE
, /* pc_relative */
593 complain_overflow_dont
,/* complain_on_overflow */
594 bfd_elf_generic_reloc
, /* special_function */
595 "R_ARM_ALU_SBREL_19_12",/* name */
596 FALSE
, /* partial_inplace */
597 0x000ff000, /* src_mask */
598 0x000ff000, /* dst_mask */
599 FALSE
), /* pcrel_offset */
601 HOWTO (R_ARM_ALU_SBREL_27_20
, /* type */
603 2, /* size (0 = byte, 1 = short, 2 = long) */
605 FALSE
, /* pc_relative */
607 complain_overflow_dont
,/* complain_on_overflow */
608 bfd_elf_generic_reloc
, /* special_function */
609 "R_ARM_ALU_SBREL_27_20",/* name */
610 FALSE
, /* partial_inplace */
611 0x0ff00000, /* src_mask */
612 0x0ff00000, /* dst_mask */
613 FALSE
), /* pcrel_offset */
615 HOWTO (R_ARM_TARGET1
, /* type */
617 2, /* size (0 = byte, 1 = short, 2 = long) */
619 FALSE
, /* pc_relative */
621 complain_overflow_dont
,/* complain_on_overflow */
622 bfd_elf_generic_reloc
, /* special_function */
623 "R_ARM_TARGET1", /* name */
624 FALSE
, /* partial_inplace */
625 0xffffffff, /* src_mask */
626 0xffffffff, /* dst_mask */
627 FALSE
), /* pcrel_offset */
629 HOWTO (R_ARM_ROSEGREL32
, /* type */
631 2, /* size (0 = byte, 1 = short, 2 = long) */
633 FALSE
, /* pc_relative */
635 complain_overflow_dont
,/* complain_on_overflow */
636 bfd_elf_generic_reloc
, /* special_function */
637 "R_ARM_ROSEGREL32", /* name */
638 FALSE
, /* partial_inplace */
639 0xffffffff, /* src_mask */
640 0xffffffff, /* dst_mask */
641 FALSE
), /* pcrel_offset */
643 HOWTO (R_ARM_V4BX
, /* type */
645 2, /* size (0 = byte, 1 = short, 2 = long) */
647 FALSE
, /* pc_relative */
649 complain_overflow_dont
,/* complain_on_overflow */
650 bfd_elf_generic_reloc
, /* special_function */
651 "R_ARM_V4BX", /* name */
652 FALSE
, /* partial_inplace */
653 0xffffffff, /* src_mask */
654 0xffffffff, /* dst_mask */
655 FALSE
), /* pcrel_offset */
657 HOWTO (R_ARM_TARGET2
, /* type */
659 2, /* size (0 = byte, 1 = short, 2 = long) */
661 FALSE
, /* pc_relative */
663 complain_overflow_signed
,/* complain_on_overflow */
664 bfd_elf_generic_reloc
, /* special_function */
665 "R_ARM_TARGET2", /* name */
666 FALSE
, /* partial_inplace */
667 0xffffffff, /* src_mask */
668 0xffffffff, /* dst_mask */
669 TRUE
), /* pcrel_offset */
671 HOWTO (R_ARM_PREL31
, /* type */
673 2, /* size (0 = byte, 1 = short, 2 = long) */
675 TRUE
, /* pc_relative */
677 complain_overflow_signed
,/* complain_on_overflow */
678 bfd_elf_generic_reloc
, /* special_function */
679 "R_ARM_PREL31", /* name */
680 FALSE
, /* partial_inplace */
681 0x7fffffff, /* src_mask */
682 0x7fffffff, /* dst_mask */
683 TRUE
), /* pcrel_offset */
685 HOWTO (R_ARM_MOVW_ABS_NC
, /* type */
687 2, /* size (0 = byte, 1 = short, 2 = long) */
689 FALSE
, /* pc_relative */
691 complain_overflow_dont
,/* complain_on_overflow */
692 bfd_elf_generic_reloc
, /* special_function */
693 "R_ARM_MOVW_ABS_NC", /* name */
694 FALSE
, /* partial_inplace */
695 0x000f0fff, /* src_mask */
696 0x000f0fff, /* dst_mask */
697 FALSE
), /* pcrel_offset */
699 HOWTO (R_ARM_MOVT_ABS
, /* type */
701 2, /* size (0 = byte, 1 = short, 2 = long) */
703 FALSE
, /* pc_relative */
705 complain_overflow_bitfield
,/* complain_on_overflow */
706 bfd_elf_generic_reloc
, /* special_function */
707 "R_ARM_MOVT_ABS", /* name */
708 FALSE
, /* partial_inplace */
709 0x000f0fff, /* src_mask */
710 0x000f0fff, /* dst_mask */
711 FALSE
), /* pcrel_offset */
713 HOWTO (R_ARM_MOVW_PREL_NC
, /* type */
715 2, /* size (0 = byte, 1 = short, 2 = long) */
717 TRUE
, /* pc_relative */
719 complain_overflow_dont
,/* complain_on_overflow */
720 bfd_elf_generic_reloc
, /* special_function */
721 "R_ARM_MOVW_PREL_NC", /* name */
722 FALSE
, /* partial_inplace */
723 0x000f0fff, /* src_mask */
724 0x000f0fff, /* dst_mask */
725 TRUE
), /* pcrel_offset */
727 HOWTO (R_ARM_MOVT_PREL
, /* type */
729 2, /* size (0 = byte, 1 = short, 2 = long) */
731 TRUE
, /* pc_relative */
733 complain_overflow_bitfield
,/* complain_on_overflow */
734 bfd_elf_generic_reloc
, /* special_function */
735 "R_ARM_MOVT_PREL", /* name */
736 FALSE
, /* partial_inplace */
737 0x000f0fff, /* src_mask */
738 0x000f0fff, /* dst_mask */
739 TRUE
), /* pcrel_offset */
741 HOWTO (R_ARM_THM_MOVW_ABS_NC
, /* type */
743 2, /* size (0 = byte, 1 = short, 2 = long) */
745 FALSE
, /* pc_relative */
747 complain_overflow_dont
,/* complain_on_overflow */
748 bfd_elf_generic_reloc
, /* special_function */
749 "R_ARM_THM_MOVW_ABS_NC",/* name */
750 FALSE
, /* partial_inplace */
751 0x040f70ff, /* src_mask */
752 0x040f70ff, /* dst_mask */
753 FALSE
), /* pcrel_offset */
755 HOWTO (R_ARM_THM_MOVT_ABS
, /* type */
757 2, /* size (0 = byte, 1 = short, 2 = long) */
759 FALSE
, /* pc_relative */
761 complain_overflow_bitfield
,/* complain_on_overflow */
762 bfd_elf_generic_reloc
, /* special_function */
763 "R_ARM_THM_MOVT_ABS", /* name */
764 FALSE
, /* partial_inplace */
765 0x040f70ff, /* src_mask */
766 0x040f70ff, /* dst_mask */
767 FALSE
), /* pcrel_offset */
769 HOWTO (R_ARM_THM_MOVW_PREL_NC
,/* type */
771 2, /* size (0 = byte, 1 = short, 2 = long) */
773 TRUE
, /* pc_relative */
775 complain_overflow_dont
,/* complain_on_overflow */
776 bfd_elf_generic_reloc
, /* special_function */
777 "R_ARM_THM_MOVW_PREL_NC",/* name */
778 FALSE
, /* partial_inplace */
779 0x040f70ff, /* src_mask */
780 0x040f70ff, /* dst_mask */
781 TRUE
), /* pcrel_offset */
783 HOWTO (R_ARM_THM_MOVT_PREL
, /* type */
785 2, /* size (0 = byte, 1 = short, 2 = long) */
787 TRUE
, /* pc_relative */
789 complain_overflow_bitfield
,/* complain_on_overflow */
790 bfd_elf_generic_reloc
, /* special_function */
791 "R_ARM_THM_MOVT_PREL", /* name */
792 FALSE
, /* partial_inplace */
793 0x040f70ff, /* src_mask */
794 0x040f70ff, /* dst_mask */
795 TRUE
), /* pcrel_offset */
797 HOWTO (R_ARM_THM_JUMP19
, /* type */
799 2, /* size (0 = byte, 1 = short, 2 = long) */
801 TRUE
, /* pc_relative */
803 complain_overflow_signed
,/* complain_on_overflow */
804 bfd_elf_generic_reloc
, /* special_function */
805 "R_ARM_THM_JUMP19", /* name */
806 FALSE
, /* partial_inplace */
807 0x043f2fff, /* src_mask */
808 0x043f2fff, /* dst_mask */
809 TRUE
), /* pcrel_offset */
811 HOWTO (R_ARM_THM_JUMP6
, /* type */
813 1, /* size (0 = byte, 1 = short, 2 = long) */
815 TRUE
, /* pc_relative */
817 complain_overflow_unsigned
,/* complain_on_overflow */
818 bfd_elf_generic_reloc
, /* special_function */
819 "R_ARM_THM_JUMP6", /* name */
820 FALSE
, /* partial_inplace */
821 0x02f8, /* src_mask */
822 0x02f8, /* dst_mask */
823 TRUE
), /* pcrel_offset */
825 /* These are declared as 13-bit signed relocations because we can
826 address -4095 .. 4095(base) by altering ADDW to SUBW or vice
828 HOWTO (R_ARM_THM_ALU_PREL_11_0
,/* type */
830 2, /* size (0 = byte, 1 = short, 2 = long) */
832 TRUE
, /* pc_relative */
834 complain_overflow_dont
,/* complain_on_overflow */
835 bfd_elf_generic_reloc
, /* special_function */
836 "R_ARM_THM_ALU_PREL_11_0",/* name */
837 FALSE
, /* partial_inplace */
838 0xffffffff, /* src_mask */
839 0xffffffff, /* dst_mask */
840 TRUE
), /* pcrel_offset */
842 HOWTO (R_ARM_THM_PC12
, /* type */
844 2, /* size (0 = byte, 1 = short, 2 = long) */
846 TRUE
, /* pc_relative */
848 complain_overflow_dont
,/* complain_on_overflow */
849 bfd_elf_generic_reloc
, /* special_function */
850 "R_ARM_THM_PC12", /* name */
851 FALSE
, /* partial_inplace */
852 0xffffffff, /* src_mask */
853 0xffffffff, /* dst_mask */
854 TRUE
), /* pcrel_offset */
856 HOWTO (R_ARM_ABS32_NOI
, /* type */
858 2, /* size (0 = byte, 1 = short, 2 = long) */
860 FALSE
, /* pc_relative */
862 complain_overflow_dont
,/* complain_on_overflow */
863 bfd_elf_generic_reloc
, /* special_function */
864 "R_ARM_ABS32_NOI", /* name */
865 FALSE
, /* partial_inplace */
866 0xffffffff, /* src_mask */
867 0xffffffff, /* dst_mask */
868 FALSE
), /* pcrel_offset */
870 HOWTO (R_ARM_REL32_NOI
, /* type */
872 2, /* size (0 = byte, 1 = short, 2 = long) */
874 TRUE
, /* pc_relative */
876 complain_overflow_dont
,/* complain_on_overflow */
877 bfd_elf_generic_reloc
, /* special_function */
878 "R_ARM_REL32_NOI", /* name */
879 FALSE
, /* partial_inplace */
880 0xffffffff, /* src_mask */
881 0xffffffff, /* dst_mask */
882 FALSE
), /* pcrel_offset */
884 /* Group relocations. */
886 HOWTO (R_ARM_ALU_PC_G0_NC
, /* type */
888 2, /* size (0 = byte, 1 = short, 2 = long) */
890 TRUE
, /* pc_relative */
892 complain_overflow_dont
,/* complain_on_overflow */
893 bfd_elf_generic_reloc
, /* special_function */
894 "R_ARM_ALU_PC_G0_NC", /* name */
895 FALSE
, /* partial_inplace */
896 0xffffffff, /* src_mask */
897 0xffffffff, /* dst_mask */
898 TRUE
), /* pcrel_offset */
900 HOWTO (R_ARM_ALU_PC_G0
, /* type */
902 2, /* size (0 = byte, 1 = short, 2 = long) */
904 TRUE
, /* pc_relative */
906 complain_overflow_dont
,/* complain_on_overflow */
907 bfd_elf_generic_reloc
, /* special_function */
908 "R_ARM_ALU_PC_G0", /* name */
909 FALSE
, /* partial_inplace */
910 0xffffffff, /* src_mask */
911 0xffffffff, /* dst_mask */
912 TRUE
), /* pcrel_offset */
914 HOWTO (R_ARM_ALU_PC_G1_NC
, /* type */
916 2, /* size (0 = byte, 1 = short, 2 = long) */
918 TRUE
, /* pc_relative */
920 complain_overflow_dont
,/* complain_on_overflow */
921 bfd_elf_generic_reloc
, /* special_function */
922 "R_ARM_ALU_PC_G1_NC", /* name */
923 FALSE
, /* partial_inplace */
924 0xffffffff, /* src_mask */
925 0xffffffff, /* dst_mask */
926 TRUE
), /* pcrel_offset */
928 HOWTO (R_ARM_ALU_PC_G1
, /* type */
930 2, /* size (0 = byte, 1 = short, 2 = long) */
932 TRUE
, /* pc_relative */
934 complain_overflow_dont
,/* complain_on_overflow */
935 bfd_elf_generic_reloc
, /* special_function */
936 "R_ARM_ALU_PC_G1", /* name */
937 FALSE
, /* partial_inplace */
938 0xffffffff, /* src_mask */
939 0xffffffff, /* dst_mask */
940 TRUE
), /* pcrel_offset */
942 HOWTO (R_ARM_ALU_PC_G2
, /* type */
944 2, /* size (0 = byte, 1 = short, 2 = long) */
946 TRUE
, /* pc_relative */
948 complain_overflow_dont
,/* complain_on_overflow */
949 bfd_elf_generic_reloc
, /* special_function */
950 "R_ARM_ALU_PC_G2", /* name */
951 FALSE
, /* partial_inplace */
952 0xffffffff, /* src_mask */
953 0xffffffff, /* dst_mask */
954 TRUE
), /* pcrel_offset */
956 HOWTO (R_ARM_LDR_PC_G1
, /* type */
958 2, /* size (0 = byte, 1 = short, 2 = long) */
960 TRUE
, /* pc_relative */
962 complain_overflow_dont
,/* complain_on_overflow */
963 bfd_elf_generic_reloc
, /* special_function */
964 "R_ARM_LDR_PC_G1", /* name */
965 FALSE
, /* partial_inplace */
966 0xffffffff, /* src_mask */
967 0xffffffff, /* dst_mask */
968 TRUE
), /* pcrel_offset */
970 HOWTO (R_ARM_LDR_PC_G2
, /* type */
972 2, /* size (0 = byte, 1 = short, 2 = long) */
974 TRUE
, /* pc_relative */
976 complain_overflow_dont
,/* complain_on_overflow */
977 bfd_elf_generic_reloc
, /* special_function */
978 "R_ARM_LDR_PC_G2", /* name */
979 FALSE
, /* partial_inplace */
980 0xffffffff, /* src_mask */
981 0xffffffff, /* dst_mask */
982 TRUE
), /* pcrel_offset */
984 HOWTO (R_ARM_LDRS_PC_G0
, /* type */
986 2, /* size (0 = byte, 1 = short, 2 = long) */
988 TRUE
, /* pc_relative */
990 complain_overflow_dont
,/* complain_on_overflow */
991 bfd_elf_generic_reloc
, /* special_function */
992 "R_ARM_LDRS_PC_G0", /* name */
993 FALSE
, /* partial_inplace */
994 0xffffffff, /* src_mask */
995 0xffffffff, /* dst_mask */
996 TRUE
), /* pcrel_offset */
998 HOWTO (R_ARM_LDRS_PC_G1
, /* type */
1000 2, /* size (0 = byte, 1 = short, 2 = long) */
1002 TRUE
, /* pc_relative */
1004 complain_overflow_dont
,/* complain_on_overflow */
1005 bfd_elf_generic_reloc
, /* special_function */
1006 "R_ARM_LDRS_PC_G1", /* name */
1007 FALSE
, /* partial_inplace */
1008 0xffffffff, /* src_mask */
1009 0xffffffff, /* dst_mask */
1010 TRUE
), /* pcrel_offset */
1012 HOWTO (R_ARM_LDRS_PC_G2
, /* type */
1014 2, /* size (0 = byte, 1 = short, 2 = long) */
1016 TRUE
, /* pc_relative */
1018 complain_overflow_dont
,/* complain_on_overflow */
1019 bfd_elf_generic_reloc
, /* special_function */
1020 "R_ARM_LDRS_PC_G2", /* name */
1021 FALSE
, /* partial_inplace */
1022 0xffffffff, /* src_mask */
1023 0xffffffff, /* dst_mask */
1024 TRUE
), /* pcrel_offset */
1026 HOWTO (R_ARM_LDC_PC_G0
, /* type */
1028 2, /* size (0 = byte, 1 = short, 2 = long) */
1030 TRUE
, /* pc_relative */
1032 complain_overflow_dont
,/* complain_on_overflow */
1033 bfd_elf_generic_reloc
, /* special_function */
1034 "R_ARM_LDC_PC_G0", /* name */
1035 FALSE
, /* partial_inplace */
1036 0xffffffff, /* src_mask */
1037 0xffffffff, /* dst_mask */
1038 TRUE
), /* pcrel_offset */
1040 HOWTO (R_ARM_LDC_PC_G1
, /* type */
1042 2, /* size (0 = byte, 1 = short, 2 = long) */
1044 TRUE
, /* pc_relative */
1046 complain_overflow_dont
,/* complain_on_overflow */
1047 bfd_elf_generic_reloc
, /* special_function */
1048 "R_ARM_LDC_PC_G1", /* name */
1049 FALSE
, /* partial_inplace */
1050 0xffffffff, /* src_mask */
1051 0xffffffff, /* dst_mask */
1052 TRUE
), /* pcrel_offset */
1054 HOWTO (R_ARM_LDC_PC_G2
, /* type */
1056 2, /* size (0 = byte, 1 = short, 2 = long) */
1058 TRUE
, /* pc_relative */
1060 complain_overflow_dont
,/* complain_on_overflow */
1061 bfd_elf_generic_reloc
, /* special_function */
1062 "R_ARM_LDC_PC_G2", /* name */
1063 FALSE
, /* partial_inplace */
1064 0xffffffff, /* src_mask */
1065 0xffffffff, /* dst_mask */
1066 TRUE
), /* pcrel_offset */
1068 HOWTO (R_ARM_ALU_SB_G0_NC
, /* type */
1070 2, /* size (0 = byte, 1 = short, 2 = long) */
1072 TRUE
, /* pc_relative */
1074 complain_overflow_dont
,/* complain_on_overflow */
1075 bfd_elf_generic_reloc
, /* special_function */
1076 "R_ARM_ALU_SB_G0_NC", /* name */
1077 FALSE
, /* partial_inplace */
1078 0xffffffff, /* src_mask */
1079 0xffffffff, /* dst_mask */
1080 TRUE
), /* pcrel_offset */
1082 HOWTO (R_ARM_ALU_SB_G0
, /* type */
1084 2, /* size (0 = byte, 1 = short, 2 = long) */
1086 TRUE
, /* pc_relative */
1088 complain_overflow_dont
,/* complain_on_overflow */
1089 bfd_elf_generic_reloc
, /* special_function */
1090 "R_ARM_ALU_SB_G0", /* name */
1091 FALSE
, /* partial_inplace */
1092 0xffffffff, /* src_mask */
1093 0xffffffff, /* dst_mask */
1094 TRUE
), /* pcrel_offset */
1096 HOWTO (R_ARM_ALU_SB_G1_NC
, /* type */
1098 2, /* size (0 = byte, 1 = short, 2 = long) */
1100 TRUE
, /* pc_relative */
1102 complain_overflow_dont
,/* complain_on_overflow */
1103 bfd_elf_generic_reloc
, /* special_function */
1104 "R_ARM_ALU_SB_G1_NC", /* name */
1105 FALSE
, /* partial_inplace */
1106 0xffffffff, /* src_mask */
1107 0xffffffff, /* dst_mask */
1108 TRUE
), /* pcrel_offset */
1110 HOWTO (R_ARM_ALU_SB_G1
, /* type */
1112 2, /* size (0 = byte, 1 = short, 2 = long) */
1114 TRUE
, /* pc_relative */
1116 complain_overflow_dont
,/* complain_on_overflow */
1117 bfd_elf_generic_reloc
, /* special_function */
1118 "R_ARM_ALU_SB_G1", /* name */
1119 FALSE
, /* partial_inplace */
1120 0xffffffff, /* src_mask */
1121 0xffffffff, /* dst_mask */
1122 TRUE
), /* pcrel_offset */
1124 HOWTO (R_ARM_ALU_SB_G2
, /* type */
1126 2, /* size (0 = byte, 1 = short, 2 = long) */
1128 TRUE
, /* pc_relative */
1130 complain_overflow_dont
,/* complain_on_overflow */
1131 bfd_elf_generic_reloc
, /* special_function */
1132 "R_ARM_ALU_SB_G2", /* name */
1133 FALSE
, /* partial_inplace */
1134 0xffffffff, /* src_mask */
1135 0xffffffff, /* dst_mask */
1136 TRUE
), /* pcrel_offset */
1138 HOWTO (R_ARM_LDR_SB_G0
, /* type */
1140 2, /* size (0 = byte, 1 = short, 2 = long) */
1142 TRUE
, /* pc_relative */
1144 complain_overflow_dont
,/* complain_on_overflow */
1145 bfd_elf_generic_reloc
, /* special_function */
1146 "R_ARM_LDR_SB_G0", /* name */
1147 FALSE
, /* partial_inplace */
1148 0xffffffff, /* src_mask */
1149 0xffffffff, /* dst_mask */
1150 TRUE
), /* pcrel_offset */
1152 HOWTO (R_ARM_LDR_SB_G1
, /* type */
1154 2, /* size (0 = byte, 1 = short, 2 = long) */
1156 TRUE
, /* pc_relative */
1158 complain_overflow_dont
,/* complain_on_overflow */
1159 bfd_elf_generic_reloc
, /* special_function */
1160 "R_ARM_LDR_SB_G1", /* name */
1161 FALSE
, /* partial_inplace */
1162 0xffffffff, /* src_mask */
1163 0xffffffff, /* dst_mask */
1164 TRUE
), /* pcrel_offset */
1166 HOWTO (R_ARM_LDR_SB_G2
, /* type */
1168 2, /* size (0 = byte, 1 = short, 2 = long) */
1170 TRUE
, /* pc_relative */
1172 complain_overflow_dont
,/* complain_on_overflow */
1173 bfd_elf_generic_reloc
, /* special_function */
1174 "R_ARM_LDR_SB_G2", /* name */
1175 FALSE
, /* partial_inplace */
1176 0xffffffff, /* src_mask */
1177 0xffffffff, /* dst_mask */
1178 TRUE
), /* pcrel_offset */
1180 HOWTO (R_ARM_LDRS_SB_G0
, /* type */
1182 2, /* size (0 = byte, 1 = short, 2 = long) */
1184 TRUE
, /* pc_relative */
1186 complain_overflow_dont
,/* complain_on_overflow */
1187 bfd_elf_generic_reloc
, /* special_function */
1188 "R_ARM_LDRS_SB_G0", /* name */
1189 FALSE
, /* partial_inplace */
1190 0xffffffff, /* src_mask */
1191 0xffffffff, /* dst_mask */
1192 TRUE
), /* pcrel_offset */
1194 HOWTO (R_ARM_LDRS_SB_G1
, /* type */
1196 2, /* size (0 = byte, 1 = short, 2 = long) */
1198 TRUE
, /* pc_relative */
1200 complain_overflow_dont
,/* complain_on_overflow */
1201 bfd_elf_generic_reloc
, /* special_function */
1202 "R_ARM_LDRS_SB_G1", /* name */
1203 FALSE
, /* partial_inplace */
1204 0xffffffff, /* src_mask */
1205 0xffffffff, /* dst_mask */
1206 TRUE
), /* pcrel_offset */
1208 HOWTO (R_ARM_LDRS_SB_G2
, /* type */
1210 2, /* size (0 = byte, 1 = short, 2 = long) */
1212 TRUE
, /* pc_relative */
1214 complain_overflow_dont
,/* complain_on_overflow */
1215 bfd_elf_generic_reloc
, /* special_function */
1216 "R_ARM_LDRS_SB_G2", /* name */
1217 FALSE
, /* partial_inplace */
1218 0xffffffff, /* src_mask */
1219 0xffffffff, /* dst_mask */
1220 TRUE
), /* pcrel_offset */
1222 HOWTO (R_ARM_LDC_SB_G0
, /* type */
1224 2, /* size (0 = byte, 1 = short, 2 = long) */
1226 TRUE
, /* pc_relative */
1228 complain_overflow_dont
,/* complain_on_overflow */
1229 bfd_elf_generic_reloc
, /* special_function */
1230 "R_ARM_LDC_SB_G0", /* name */
1231 FALSE
, /* partial_inplace */
1232 0xffffffff, /* src_mask */
1233 0xffffffff, /* dst_mask */
1234 TRUE
), /* pcrel_offset */
1236 HOWTO (R_ARM_LDC_SB_G1
, /* type */
1238 2, /* size (0 = byte, 1 = short, 2 = long) */
1240 TRUE
, /* pc_relative */
1242 complain_overflow_dont
,/* complain_on_overflow */
1243 bfd_elf_generic_reloc
, /* special_function */
1244 "R_ARM_LDC_SB_G1", /* name */
1245 FALSE
, /* partial_inplace */
1246 0xffffffff, /* src_mask */
1247 0xffffffff, /* dst_mask */
1248 TRUE
), /* pcrel_offset */
1250 HOWTO (R_ARM_LDC_SB_G2
, /* type */
1252 2, /* size (0 = byte, 1 = short, 2 = long) */
1254 TRUE
, /* pc_relative */
1256 complain_overflow_dont
,/* complain_on_overflow */
1257 bfd_elf_generic_reloc
, /* special_function */
1258 "R_ARM_LDC_SB_G2", /* name */
1259 FALSE
, /* partial_inplace */
1260 0xffffffff, /* src_mask */
1261 0xffffffff, /* dst_mask */
1262 TRUE
), /* pcrel_offset */
1264 /* End of group relocations. */
1266 HOWTO (R_ARM_MOVW_BREL_NC
, /* type */
1268 2, /* size (0 = byte, 1 = short, 2 = long) */
1270 FALSE
, /* pc_relative */
1272 complain_overflow_dont
,/* complain_on_overflow */
1273 bfd_elf_generic_reloc
, /* special_function */
1274 "R_ARM_MOVW_BREL_NC", /* name */
1275 FALSE
, /* partial_inplace */
1276 0x0000ffff, /* src_mask */
1277 0x0000ffff, /* dst_mask */
1278 FALSE
), /* pcrel_offset */
1280 HOWTO (R_ARM_MOVT_BREL
, /* type */
1282 2, /* size (0 = byte, 1 = short, 2 = long) */
1284 FALSE
, /* pc_relative */
1286 complain_overflow_bitfield
,/* complain_on_overflow */
1287 bfd_elf_generic_reloc
, /* special_function */
1288 "R_ARM_MOVT_BREL", /* name */
1289 FALSE
, /* partial_inplace */
1290 0x0000ffff, /* src_mask */
1291 0x0000ffff, /* dst_mask */
1292 FALSE
), /* pcrel_offset */
1294 HOWTO (R_ARM_MOVW_BREL
, /* type */
1296 2, /* size (0 = byte, 1 = short, 2 = long) */
1298 FALSE
, /* pc_relative */
1300 complain_overflow_dont
,/* complain_on_overflow */
1301 bfd_elf_generic_reloc
, /* special_function */
1302 "R_ARM_MOVW_BREL", /* name */
1303 FALSE
, /* partial_inplace */
1304 0x0000ffff, /* src_mask */
1305 0x0000ffff, /* dst_mask */
1306 FALSE
), /* pcrel_offset */
1308 HOWTO (R_ARM_THM_MOVW_BREL_NC
,/* type */
1310 2, /* size (0 = byte, 1 = short, 2 = long) */
1312 FALSE
, /* pc_relative */
1314 complain_overflow_dont
,/* complain_on_overflow */
1315 bfd_elf_generic_reloc
, /* special_function */
1316 "R_ARM_THM_MOVW_BREL_NC",/* name */
1317 FALSE
, /* partial_inplace */
1318 0x040f70ff, /* src_mask */
1319 0x040f70ff, /* dst_mask */
1320 FALSE
), /* pcrel_offset */
1322 HOWTO (R_ARM_THM_MOVT_BREL
, /* type */
1324 2, /* size (0 = byte, 1 = short, 2 = long) */
1326 FALSE
, /* pc_relative */
1328 complain_overflow_bitfield
,/* complain_on_overflow */
1329 bfd_elf_generic_reloc
, /* special_function */
1330 "R_ARM_THM_MOVT_BREL", /* name */
1331 FALSE
, /* partial_inplace */
1332 0x040f70ff, /* src_mask */
1333 0x040f70ff, /* dst_mask */
1334 FALSE
), /* pcrel_offset */
1336 HOWTO (R_ARM_THM_MOVW_BREL
, /* type */
1338 2, /* size (0 = byte, 1 = short, 2 = long) */
1340 FALSE
, /* pc_relative */
1342 complain_overflow_dont
,/* complain_on_overflow */
1343 bfd_elf_generic_reloc
, /* special_function */
1344 "R_ARM_THM_MOVW_BREL", /* name */
1345 FALSE
, /* partial_inplace */
1346 0x040f70ff, /* src_mask */
1347 0x040f70ff, /* dst_mask */
1348 FALSE
), /* pcrel_offset */
1350 EMPTY_HOWTO (90), /* Unallocated. */
1355 HOWTO (R_ARM_PLT32_ABS
, /* type */
1357 2, /* size (0 = byte, 1 = short, 2 = long) */
1359 FALSE
, /* pc_relative */
1361 complain_overflow_dont
,/* complain_on_overflow */
1362 bfd_elf_generic_reloc
, /* special_function */
1363 "R_ARM_PLT32_ABS", /* name */
1364 FALSE
, /* partial_inplace */
1365 0xffffffff, /* src_mask */
1366 0xffffffff, /* dst_mask */
1367 FALSE
), /* pcrel_offset */
1369 HOWTO (R_ARM_GOT_ABS
, /* type */
1371 2, /* size (0 = byte, 1 = short, 2 = long) */
1373 FALSE
, /* pc_relative */
1375 complain_overflow_dont
,/* complain_on_overflow */
1376 bfd_elf_generic_reloc
, /* special_function */
1377 "R_ARM_GOT_ABS", /* name */
1378 FALSE
, /* partial_inplace */
1379 0xffffffff, /* src_mask */
1380 0xffffffff, /* dst_mask */
1381 FALSE
), /* pcrel_offset */
1383 HOWTO (R_ARM_GOT_PREL
, /* type */
1385 2, /* size (0 = byte, 1 = short, 2 = long) */
1387 TRUE
, /* pc_relative */
1389 complain_overflow_dont
, /* complain_on_overflow */
1390 bfd_elf_generic_reloc
, /* special_function */
1391 "R_ARM_GOT_PREL", /* name */
1392 FALSE
, /* partial_inplace */
1393 0xffffffff, /* src_mask */
1394 0xffffffff, /* dst_mask */
1395 TRUE
), /* pcrel_offset */
1397 HOWTO (R_ARM_GOT_BREL12
, /* type */
1399 2, /* size (0 = byte, 1 = short, 2 = long) */
1401 FALSE
, /* pc_relative */
1403 complain_overflow_bitfield
,/* complain_on_overflow */
1404 bfd_elf_generic_reloc
, /* special_function */
1405 "R_ARM_GOT_BREL12", /* name */
1406 FALSE
, /* partial_inplace */
1407 0x00000fff, /* src_mask */
1408 0x00000fff, /* dst_mask */
1409 FALSE
), /* pcrel_offset */
1411 HOWTO (R_ARM_GOTOFF12
, /* type */
1413 2, /* size (0 = byte, 1 = short, 2 = long) */
1415 FALSE
, /* pc_relative */
1417 complain_overflow_bitfield
,/* complain_on_overflow */
1418 bfd_elf_generic_reloc
, /* special_function */
1419 "R_ARM_GOTOFF12", /* name */
1420 FALSE
, /* partial_inplace */
1421 0x00000fff, /* src_mask */
1422 0x00000fff, /* dst_mask */
1423 FALSE
), /* pcrel_offset */
1425 EMPTY_HOWTO (R_ARM_GOTRELAX
), /* reserved for future GOT-load optimizations */
1427 /* GNU extension to record C++ vtable member usage */
1428 HOWTO (R_ARM_GNU_VTENTRY
, /* type */
1430 2, /* size (0 = byte, 1 = short, 2 = long) */
1432 FALSE
, /* pc_relative */
1434 complain_overflow_dont
, /* complain_on_overflow */
1435 _bfd_elf_rel_vtable_reloc_fn
, /* special_function */
1436 "R_ARM_GNU_VTENTRY", /* name */
1437 FALSE
, /* partial_inplace */
1440 FALSE
), /* pcrel_offset */
1442 /* GNU extension to record C++ vtable hierarchy */
1443 HOWTO (R_ARM_GNU_VTINHERIT
, /* type */
1445 2, /* size (0 = byte, 1 = short, 2 = long) */
1447 FALSE
, /* pc_relative */
1449 complain_overflow_dont
, /* complain_on_overflow */
1450 NULL
, /* special_function */
1451 "R_ARM_GNU_VTINHERIT", /* name */
1452 FALSE
, /* partial_inplace */
1455 FALSE
), /* pcrel_offset */
1457 HOWTO (R_ARM_THM_JUMP11
, /* type */
1459 1, /* size (0 = byte, 1 = short, 2 = long) */
1461 TRUE
, /* pc_relative */
1463 complain_overflow_signed
, /* complain_on_overflow */
1464 bfd_elf_generic_reloc
, /* special_function */
1465 "R_ARM_THM_JUMP11", /* name */
1466 FALSE
, /* partial_inplace */
1467 0x000007ff, /* src_mask */
1468 0x000007ff, /* dst_mask */
1469 TRUE
), /* pcrel_offset */
1471 HOWTO (R_ARM_THM_JUMP8
, /* type */
1473 1, /* size (0 = byte, 1 = short, 2 = long) */
1475 TRUE
, /* pc_relative */
1477 complain_overflow_signed
, /* complain_on_overflow */
1478 bfd_elf_generic_reloc
, /* special_function */
1479 "R_ARM_THM_JUMP8", /* name */
1480 FALSE
, /* partial_inplace */
1481 0x000000ff, /* src_mask */
1482 0x000000ff, /* dst_mask */
1483 TRUE
), /* pcrel_offset */
1485 /* TLS relocations */
1486 HOWTO (R_ARM_TLS_GD32
, /* type */
1488 2, /* size (0 = byte, 1 = short, 2 = long) */
1490 FALSE
, /* pc_relative */
1492 complain_overflow_bitfield
,/* complain_on_overflow */
1493 NULL
, /* special_function */
1494 "R_ARM_TLS_GD32", /* name */
1495 TRUE
, /* partial_inplace */
1496 0xffffffff, /* src_mask */
1497 0xffffffff, /* dst_mask */
1498 FALSE
), /* pcrel_offset */
1500 HOWTO (R_ARM_TLS_LDM32
, /* type */
1502 2, /* size (0 = byte, 1 = short, 2 = long) */
1504 FALSE
, /* pc_relative */
1506 complain_overflow_bitfield
,/* complain_on_overflow */
1507 bfd_elf_generic_reloc
, /* special_function */
1508 "R_ARM_TLS_LDM32", /* name */
1509 TRUE
, /* partial_inplace */
1510 0xffffffff, /* src_mask */
1511 0xffffffff, /* dst_mask */
1512 FALSE
), /* pcrel_offset */
1514 HOWTO (R_ARM_TLS_LDO32
, /* type */
1516 2, /* size (0 = byte, 1 = short, 2 = long) */
1518 FALSE
, /* pc_relative */
1520 complain_overflow_bitfield
,/* complain_on_overflow */
1521 bfd_elf_generic_reloc
, /* special_function */
1522 "R_ARM_TLS_LDO32", /* name */
1523 TRUE
, /* partial_inplace */
1524 0xffffffff, /* src_mask */
1525 0xffffffff, /* dst_mask */
1526 FALSE
), /* pcrel_offset */
1528 HOWTO (R_ARM_TLS_IE32
, /* type */
1530 2, /* size (0 = byte, 1 = short, 2 = long) */
1532 FALSE
, /* pc_relative */
1534 complain_overflow_bitfield
,/* complain_on_overflow */
1535 NULL
, /* special_function */
1536 "R_ARM_TLS_IE32", /* name */
1537 TRUE
, /* partial_inplace */
1538 0xffffffff, /* src_mask */
1539 0xffffffff, /* dst_mask */
1540 FALSE
), /* pcrel_offset */
1542 HOWTO (R_ARM_TLS_LE32
, /* type */
1544 2, /* size (0 = byte, 1 = short, 2 = long) */
1546 FALSE
, /* pc_relative */
1548 complain_overflow_bitfield
,/* complain_on_overflow */
1549 bfd_elf_generic_reloc
, /* special_function */
1550 "R_ARM_TLS_LE32", /* name */
1551 TRUE
, /* partial_inplace */
1552 0xffffffff, /* src_mask */
1553 0xffffffff, /* dst_mask */
1554 FALSE
), /* pcrel_offset */
1556 HOWTO (R_ARM_TLS_LDO12
, /* type */
1558 2, /* size (0 = byte, 1 = short, 2 = long) */
1560 FALSE
, /* pc_relative */
1562 complain_overflow_bitfield
,/* complain_on_overflow */
1563 bfd_elf_generic_reloc
, /* special_function */
1564 "R_ARM_TLS_LDO12", /* name */
1565 FALSE
, /* partial_inplace */
1566 0x00000fff, /* src_mask */
1567 0x00000fff, /* dst_mask */
1568 FALSE
), /* pcrel_offset */
1570 HOWTO (R_ARM_TLS_LE12
, /* type */
1572 2, /* size (0 = byte, 1 = short, 2 = long) */
1574 FALSE
, /* pc_relative */
1576 complain_overflow_bitfield
,/* complain_on_overflow */
1577 bfd_elf_generic_reloc
, /* special_function */
1578 "R_ARM_TLS_LE12", /* name */
1579 FALSE
, /* partial_inplace */
1580 0x00000fff, /* src_mask */
1581 0x00000fff, /* dst_mask */
1582 FALSE
), /* pcrel_offset */
1584 HOWTO (R_ARM_TLS_IE12GP
, /* type */
1586 2, /* size (0 = byte, 1 = short, 2 = long) */
1588 FALSE
, /* pc_relative */
1590 complain_overflow_bitfield
,/* complain_on_overflow */
1591 bfd_elf_generic_reloc
, /* special_function */
1592 "R_ARM_TLS_IE12GP", /* name */
1593 FALSE
, /* partial_inplace */
1594 0x00000fff, /* src_mask */
1595 0x00000fff, /* dst_mask */
1596 FALSE
), /* pcrel_offset */
1599 /* 112-127 private relocations
1600 128 R_ARM_ME_TOO, obsolete
1601 129-255 unallocated in AAELF.
1603 249-255 extended, currently unused, relocations: */
1605 static reloc_howto_type elf32_arm_howto_table_2
[4] =
1607 HOWTO (R_ARM_RREL32
, /* type */
1609 0, /* size (0 = byte, 1 = short, 2 = long) */
1611 FALSE
, /* pc_relative */
1613 complain_overflow_dont
,/* complain_on_overflow */
1614 bfd_elf_generic_reloc
, /* special_function */
1615 "R_ARM_RREL32", /* name */
1616 FALSE
, /* partial_inplace */
1619 FALSE
), /* pcrel_offset */
1621 HOWTO (R_ARM_RABS32
, /* type */
1623 0, /* size (0 = byte, 1 = short, 2 = long) */
1625 FALSE
, /* pc_relative */
1627 complain_overflow_dont
,/* complain_on_overflow */
1628 bfd_elf_generic_reloc
, /* special_function */
1629 "R_ARM_RABS32", /* name */
1630 FALSE
, /* partial_inplace */
1633 FALSE
), /* pcrel_offset */
1635 HOWTO (R_ARM_RPC24
, /* type */
1637 0, /* size (0 = byte, 1 = short, 2 = long) */
1639 FALSE
, /* pc_relative */
1641 complain_overflow_dont
,/* complain_on_overflow */
1642 bfd_elf_generic_reloc
, /* special_function */
1643 "R_ARM_RPC24", /* name */
1644 FALSE
, /* partial_inplace */
1647 FALSE
), /* pcrel_offset */
1649 HOWTO (R_ARM_RBASE
, /* type */
1651 0, /* size (0 = byte, 1 = short, 2 = long) */
1653 FALSE
, /* pc_relative */
1655 complain_overflow_dont
,/* complain_on_overflow */
1656 bfd_elf_generic_reloc
, /* special_function */
1657 "R_ARM_RBASE", /* name */
1658 FALSE
, /* partial_inplace */
1661 FALSE
) /* pcrel_offset */
1664 static reloc_howto_type
*
1665 elf32_arm_howto_from_type (unsigned int r_type
)
1667 if (r_type
< ARRAY_SIZE (elf32_arm_howto_table_1
))
1668 return &elf32_arm_howto_table_1
[r_type
];
1670 if (r_type
>= R_ARM_RREL32
1671 && r_type
< R_ARM_RREL32
+ ARRAY_SIZE (elf32_arm_howto_table_2
))
1672 return &elf32_arm_howto_table_2
[r_type
- R_ARM_RREL32
];
1678 elf32_arm_info_to_howto (bfd
* abfd ATTRIBUTE_UNUSED
, arelent
* bfd_reloc
,
1679 Elf_Internal_Rela
* elf_reloc
)
1681 unsigned int r_type
;
1683 r_type
= ELF32_R_TYPE (elf_reloc
->r_info
);
1684 bfd_reloc
->howto
= elf32_arm_howto_from_type (r_type
);
1687 struct elf32_arm_reloc_map
1689 bfd_reloc_code_real_type bfd_reloc_val
;
1690 unsigned char elf_reloc_val
;
1693 /* All entries in this list must also be present in elf32_arm_howto_table. */
1694 static const struct elf32_arm_reloc_map elf32_arm_reloc_map
[] =
1696 {BFD_RELOC_NONE
, R_ARM_NONE
},
1697 {BFD_RELOC_ARM_PCREL_BRANCH
, R_ARM_PC24
},
1698 {BFD_RELOC_ARM_PCREL_CALL
, R_ARM_CALL
},
1699 {BFD_RELOC_ARM_PCREL_JUMP
, R_ARM_JUMP24
},
1700 {BFD_RELOC_ARM_PCREL_BLX
, R_ARM_XPC25
},
1701 {BFD_RELOC_THUMB_PCREL_BLX
, R_ARM_THM_XPC22
},
1702 {BFD_RELOC_32
, R_ARM_ABS32
},
1703 {BFD_RELOC_32_PCREL
, R_ARM_REL32
},
1704 {BFD_RELOC_8
, R_ARM_ABS8
},
1705 {BFD_RELOC_16
, R_ARM_ABS16
},
1706 {BFD_RELOC_ARM_OFFSET_IMM
, R_ARM_ABS12
},
1707 {BFD_RELOC_ARM_THUMB_OFFSET
, R_ARM_THM_ABS5
},
1708 {BFD_RELOC_THUMB_PCREL_BRANCH25
, R_ARM_THM_JUMP24
},
1709 {BFD_RELOC_THUMB_PCREL_BRANCH23
, R_ARM_THM_CALL
},
1710 {BFD_RELOC_THUMB_PCREL_BRANCH12
, R_ARM_THM_JUMP11
},
1711 {BFD_RELOC_THUMB_PCREL_BRANCH20
, R_ARM_THM_JUMP19
},
1712 {BFD_RELOC_THUMB_PCREL_BRANCH9
, R_ARM_THM_JUMP8
},
1713 {BFD_RELOC_THUMB_PCREL_BRANCH7
, R_ARM_THM_JUMP6
},
1714 {BFD_RELOC_ARM_GLOB_DAT
, R_ARM_GLOB_DAT
},
1715 {BFD_RELOC_ARM_JUMP_SLOT
, R_ARM_JUMP_SLOT
},
1716 {BFD_RELOC_ARM_RELATIVE
, R_ARM_RELATIVE
},
1717 {BFD_RELOC_ARM_GOTOFF
, R_ARM_GOTOFF32
},
1718 {BFD_RELOC_ARM_GOTPC
, R_ARM_GOTPC
},
1719 {BFD_RELOC_ARM_GOT32
, R_ARM_GOT32
},
1720 {BFD_RELOC_ARM_PLT32
, R_ARM_PLT32
},
1721 {BFD_RELOC_ARM_TARGET1
, R_ARM_TARGET1
},
1722 {BFD_RELOC_ARM_ROSEGREL32
, R_ARM_ROSEGREL32
},
1723 {BFD_RELOC_ARM_SBREL32
, R_ARM_SBREL32
},
1724 {BFD_RELOC_ARM_PREL31
, R_ARM_PREL31
},
1725 {BFD_RELOC_ARM_TARGET2
, R_ARM_TARGET2
},
1726 {BFD_RELOC_ARM_PLT32
, R_ARM_PLT32
},
1727 {BFD_RELOC_ARM_TLS_GD32
, R_ARM_TLS_GD32
},
1728 {BFD_RELOC_ARM_TLS_LDO32
, R_ARM_TLS_LDO32
},
1729 {BFD_RELOC_ARM_TLS_LDM32
, R_ARM_TLS_LDM32
},
1730 {BFD_RELOC_ARM_TLS_DTPMOD32
, R_ARM_TLS_DTPMOD32
},
1731 {BFD_RELOC_ARM_TLS_DTPOFF32
, R_ARM_TLS_DTPOFF32
},
1732 {BFD_RELOC_ARM_TLS_TPOFF32
, R_ARM_TLS_TPOFF32
},
1733 {BFD_RELOC_ARM_TLS_IE32
, R_ARM_TLS_IE32
},
1734 {BFD_RELOC_ARM_TLS_LE32
, R_ARM_TLS_LE32
},
1735 {BFD_RELOC_VTABLE_INHERIT
, R_ARM_GNU_VTINHERIT
},
1736 {BFD_RELOC_VTABLE_ENTRY
, R_ARM_GNU_VTENTRY
},
1737 {BFD_RELOC_ARM_MOVW
, R_ARM_MOVW_ABS_NC
},
1738 {BFD_RELOC_ARM_MOVT
, R_ARM_MOVT_ABS
},
1739 {BFD_RELOC_ARM_MOVW_PCREL
, R_ARM_MOVW_PREL_NC
},
1740 {BFD_RELOC_ARM_MOVT_PCREL
, R_ARM_MOVT_PREL
},
1741 {BFD_RELOC_ARM_THUMB_MOVW
, R_ARM_THM_MOVW_ABS_NC
},
1742 {BFD_RELOC_ARM_THUMB_MOVT
, R_ARM_THM_MOVT_ABS
},
1743 {BFD_RELOC_ARM_THUMB_MOVW_PCREL
, R_ARM_THM_MOVW_PREL_NC
},
1744 {BFD_RELOC_ARM_THUMB_MOVT_PCREL
, R_ARM_THM_MOVT_PREL
},
1745 {BFD_RELOC_ARM_ALU_PC_G0_NC
, R_ARM_ALU_PC_G0_NC
},
1746 {BFD_RELOC_ARM_ALU_PC_G0
, R_ARM_ALU_PC_G0
},
1747 {BFD_RELOC_ARM_ALU_PC_G1_NC
, R_ARM_ALU_PC_G1_NC
},
1748 {BFD_RELOC_ARM_ALU_PC_G1
, R_ARM_ALU_PC_G1
},
1749 {BFD_RELOC_ARM_ALU_PC_G2
, R_ARM_ALU_PC_G2
},
1750 {BFD_RELOC_ARM_LDR_PC_G0
, R_ARM_LDR_PC_G0
},
1751 {BFD_RELOC_ARM_LDR_PC_G1
, R_ARM_LDR_PC_G1
},
1752 {BFD_RELOC_ARM_LDR_PC_G2
, R_ARM_LDR_PC_G2
},
1753 {BFD_RELOC_ARM_LDRS_PC_G0
, R_ARM_LDRS_PC_G0
},
1754 {BFD_RELOC_ARM_LDRS_PC_G1
, R_ARM_LDRS_PC_G1
},
1755 {BFD_RELOC_ARM_LDRS_PC_G2
, R_ARM_LDRS_PC_G2
},
1756 {BFD_RELOC_ARM_LDC_PC_G0
, R_ARM_LDC_PC_G0
},
1757 {BFD_RELOC_ARM_LDC_PC_G1
, R_ARM_LDC_PC_G1
},
1758 {BFD_RELOC_ARM_LDC_PC_G2
, R_ARM_LDC_PC_G2
},
1759 {BFD_RELOC_ARM_ALU_SB_G0_NC
, R_ARM_ALU_SB_G0_NC
},
1760 {BFD_RELOC_ARM_ALU_SB_G0
, R_ARM_ALU_SB_G0
},
1761 {BFD_RELOC_ARM_ALU_SB_G1_NC
, R_ARM_ALU_SB_G1_NC
},
1762 {BFD_RELOC_ARM_ALU_SB_G1
, R_ARM_ALU_SB_G1
},
1763 {BFD_RELOC_ARM_ALU_SB_G2
, R_ARM_ALU_SB_G2
},
1764 {BFD_RELOC_ARM_LDR_SB_G0
, R_ARM_LDR_SB_G0
},
1765 {BFD_RELOC_ARM_LDR_SB_G1
, R_ARM_LDR_SB_G1
},
1766 {BFD_RELOC_ARM_LDR_SB_G2
, R_ARM_LDR_SB_G2
},
1767 {BFD_RELOC_ARM_LDRS_SB_G0
, R_ARM_LDRS_SB_G0
},
1768 {BFD_RELOC_ARM_LDRS_SB_G1
, R_ARM_LDRS_SB_G1
},
1769 {BFD_RELOC_ARM_LDRS_SB_G2
, R_ARM_LDRS_SB_G2
},
1770 {BFD_RELOC_ARM_LDC_SB_G0
, R_ARM_LDC_SB_G0
},
1771 {BFD_RELOC_ARM_LDC_SB_G1
, R_ARM_LDC_SB_G1
},
1772 {BFD_RELOC_ARM_LDC_SB_G2
, R_ARM_LDC_SB_G2
},
1773 {BFD_RELOC_ARM_V4BX
, R_ARM_V4BX
}
1776 static reloc_howto_type
*
1777 elf32_arm_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1778 bfd_reloc_code_real_type code
)
1782 for (i
= 0; i
< ARRAY_SIZE (elf32_arm_reloc_map
); i
++)
1783 if (elf32_arm_reloc_map
[i
].bfd_reloc_val
== code
)
1784 return elf32_arm_howto_from_type (elf32_arm_reloc_map
[i
].elf_reloc_val
);
1789 static reloc_howto_type
*
1790 elf32_arm_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1795 for (i
= 0; i
< ARRAY_SIZE (elf32_arm_howto_table_1
); i
++)
1796 if (elf32_arm_howto_table_1
[i
].name
!= NULL
1797 && strcasecmp (elf32_arm_howto_table_1
[i
].name
, r_name
) == 0)
1798 return &elf32_arm_howto_table_1
[i
];
1800 for (i
= 0; i
< ARRAY_SIZE (elf32_arm_howto_table_2
); i
++)
1801 if (elf32_arm_howto_table_2
[i
].name
!= NULL
1802 && strcasecmp (elf32_arm_howto_table_2
[i
].name
, r_name
) == 0)
1803 return &elf32_arm_howto_table_2
[i
];
1808 /* Support for core dump NOTE sections. */
1811 elf32_arm_nabi_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
1816 switch (note
->descsz
)
1821 case 148: /* Linux/ARM 32-bit. */
1823 elf_tdata (abfd
)->core_signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
1826 elf_tdata (abfd
)->core_pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
1835 /* Make a ".reg/999" section. */
1836 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
1837 size
, note
->descpos
+ offset
);
1841 elf32_arm_nabi_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
1843 switch (note
->descsz
)
1848 case 124: /* Linux/ARM elf_prpsinfo. */
1849 elf_tdata (abfd
)->core_program
1850 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 28, 16);
1851 elf_tdata (abfd
)->core_command
1852 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 44, 80);
1855 /* Note that for some reason, a spurious space is tacked
1856 onto the end of the args in some (at least one anyway)
1857 implementations, so strip it off if it exists. */
1859 char *command
= elf_tdata (abfd
)->core_command
;
1860 int n
= strlen (command
);
1862 if (0 < n
&& command
[n
- 1] == ' ')
1863 command
[n
- 1] = '\0';
1869 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vec
1870 #define TARGET_LITTLE_NAME "elf32-littlearm"
1871 #define TARGET_BIG_SYM bfd_elf32_bigarm_vec
1872 #define TARGET_BIG_NAME "elf32-bigarm"
1874 #define elf_backend_grok_prstatus elf32_arm_nabi_grok_prstatus
1875 #define elf_backend_grok_psinfo elf32_arm_nabi_grok_psinfo
1877 typedef unsigned long int insn32
;
1878 typedef unsigned short int insn16
;
1880 /* In lieu of proper flags, assume all EABIv4 or later objects are
1882 #define INTERWORK_FLAG(abfd) \
1883 (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) >= EF_ARM_EABI_VER4 \
1884 || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK))
1886 /* The linker script knows the section names for placement.
1887 The entry_names are used to do simple name mangling on the stubs.
1888 Given a function name, and its type, the stub can be found. The
1889 name can be changed. The only requirement is the %s be present. */
1890 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
1891 #define THUMB2ARM_GLUE_ENTRY_NAME "__%s_from_thumb"
1893 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
1894 #define ARM2THUMB_GLUE_ENTRY_NAME "__%s_from_arm"
1896 #define VFP11_ERRATUM_VENEER_SECTION_NAME ".vfp11_veneer"
1897 #define VFP11_ERRATUM_VENEER_ENTRY_NAME "__vfp11_veneer_%x"
1899 #define ARM_BX_GLUE_SECTION_NAME ".v4_bx"
1900 #define ARM_BX_GLUE_ENTRY_NAME "__bx_r%d"
1902 #define STUB_ENTRY_NAME "__%s_veneer"
1904 /* The name of the dynamic interpreter. This is put in the .interp
1906 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
1908 #ifdef FOUR_WORD_PLT
1910 /* The first entry in a procedure linkage table looks like
1911 this. It is set up so that any shared library function that is
1912 called before the relocation has been set up calls the dynamic
1914 static const bfd_vma elf32_arm_plt0_entry
[] =
1916 0xe52de004, /* str lr, [sp, #-4]! */
1917 0xe59fe010, /* ldr lr, [pc, #16] */
1918 0xe08fe00e, /* add lr, pc, lr */
1919 0xe5bef008, /* ldr pc, [lr, #8]! */
1922 /* Subsequent entries in a procedure linkage table look like
1924 static const bfd_vma elf32_arm_plt_entry
[] =
1926 0xe28fc600, /* add ip, pc, #NN */
1927 0xe28cca00, /* add ip, ip, #NN */
1928 0xe5bcf000, /* ldr pc, [ip, #NN]! */
1929 0x00000000, /* unused */
1934 /* The first entry in a procedure linkage table looks like
1935 this. It is set up so that any shared library function that is
1936 called before the relocation has been set up calls the dynamic
1938 static const bfd_vma elf32_arm_plt0_entry
[] =
1940 0xe52de004, /* str lr, [sp, #-4]! */
1941 0xe59fe004, /* ldr lr, [pc, #4] */
1942 0xe08fe00e, /* add lr, pc, lr */
1943 0xe5bef008, /* ldr pc, [lr, #8]! */
1944 0x00000000, /* &GOT[0] - . */
1947 /* Subsequent entries in a procedure linkage table look like
1949 static const bfd_vma elf32_arm_plt_entry
[] =
1951 0xe28fc600, /* add ip, pc, #0xNN00000 */
1952 0xe28cca00, /* add ip, ip, #0xNN000 */
1953 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */
1958 /* The format of the first entry in the procedure linkage table
1959 for a VxWorks executable. */
1960 static const bfd_vma elf32_arm_vxworks_exec_plt0_entry
[] =
1962 0xe52dc008, /* str ip,[sp,#-8]! */
1963 0xe59fc000, /* ldr ip,[pc] */
1964 0xe59cf008, /* ldr pc,[ip,#8] */
1965 0x00000000, /* .long _GLOBAL_OFFSET_TABLE_ */
1968 /* The format of subsequent entries in a VxWorks executable. */
1969 static const bfd_vma elf32_arm_vxworks_exec_plt_entry
[] =
1971 0xe59fc000, /* ldr ip,[pc] */
1972 0xe59cf000, /* ldr pc,[ip] */
1973 0x00000000, /* .long @got */
1974 0xe59fc000, /* ldr ip,[pc] */
1975 0xea000000, /* b _PLT */
1976 0x00000000, /* .long @pltindex*sizeof(Elf32_Rela) */
1979 /* The format of entries in a VxWorks shared library. */
1980 static const bfd_vma elf32_arm_vxworks_shared_plt_entry
[] =
1982 0xe59fc000, /* ldr ip,[pc] */
1983 0xe79cf009, /* ldr pc,[ip,r9] */
1984 0x00000000, /* .long @got */
1985 0xe59fc000, /* ldr ip,[pc] */
1986 0xe599f008, /* ldr pc,[r9,#8] */
1987 0x00000000, /* .long @pltindex*sizeof(Elf32_Rela) */
1990 /* An initial stub used if the PLT entry is referenced from Thumb code. */
1991 #define PLT_THUMB_STUB_SIZE 4
1992 static const bfd_vma elf32_arm_plt_thumb_stub
[] =
1998 /* The entries in a PLT when using a DLL-based target with multiple
2000 static const bfd_vma elf32_arm_symbian_plt_entry
[] =
2002 0xe51ff004, /* ldr pc, [pc, #-4] */
2003 0x00000000, /* dcd R_ARM_GLOB_DAT(X) */
2006 #define ARM_MAX_FWD_BRANCH_OFFSET ((((1 << 23) - 1) << 2) + 8)
2007 #define ARM_MAX_BWD_BRANCH_OFFSET ((-((1 << 23) << 2)) + 8)
2008 #define THM_MAX_FWD_BRANCH_OFFSET ((1 << 22) -2 + 4)
2009 #define THM_MAX_BWD_BRANCH_OFFSET (-(1 << 22) + 4)
2010 #define THM2_MAX_FWD_BRANCH_OFFSET (((1 << 24) - 2) + 4)
2011 #define THM2_MAX_BWD_BRANCH_OFFSET (-(1 << 24) + 4)
2013 /* Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
2014 to reach the stub if necessary. */
2015 static const bfd_vma elf32_arm_stub_long_branch_any_any
[] =
2017 0xe51ff004, /* ldr pc, [pc, #-4] */
2018 0x00000000, /* dcd R_ARM_ABS32(X) */
2021 /* V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
2023 static const bfd_vma elf32_arm_stub_long_branch_v4t_arm_thumb
[] =
2025 0xe59fc000, /* ldr ip, [pc, #0] */
2026 0xe12fff1c, /* bx ip */
2027 0x00000000, /* dcd R_ARM_ABS32(X) */
2030 /* Thumb -> Thumb long branch stub. Used on architectures which
2031 support only this mode, or on V4T where it is expensive to switch
2033 static const bfd_vma elf32_arm_stub_long_branch_thumb_only
[] =
2035 0x4802b401, /* push {r0} */
2036 /* ldr r0, [pc, #8] */
2037 0xbc014684, /* mov ip, r0 */
2039 0xbf004760, /* bx ip */
2041 0x00000000, /* dcd R_ARM_ABS32(X) */
2044 /* V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
2046 static const bfd_vma elf32_arm_stub_long_branch_v4t_thumb_arm
[] =
2048 0x46c04778, /* bx pc */
2050 0xe51ff004, /* ldr pc, [pc, #-4] */
2051 0x00000000, /* dcd R_ARM_ABS32(X) */
2054 /* V4T Thumb -> ARM short branch stub. Shorter variant of the above
2055 one, when the destination is close enough. */
2056 static const bfd_vma elf32_arm_stub_short_branch_v4t_thumb_arm
[] =
2058 0x46c04778, /* bx pc */
2060 0xea000000, /* b (X) */
2063 /* ARM/Thumb -> ARM/Thumb long branch stub, PIC. On V5T and above, use
2064 blx to reach the stub if necessary. */
2065 static const bfd_vma elf32_arm_stub_long_branch_any_any_pic
[] =
2067 0xe59fc000, /* ldr r12, [pc] */
2068 0xe08ff00c, /* add pc, pc, ip */
2069 0x00000000, /* dcd R_ARM_REL32(X-4) */
2072 /* Section name for stubs is the associated section name plus this
2074 #define STUB_SUFFIX ".stub"
2076 enum elf32_arm_stub_type
2079 arm_stub_long_branch_any_any
,
2080 arm_stub_long_branch_v4t_arm_thumb
,
2081 arm_stub_long_branch_thumb_only
,
2082 arm_stub_long_branch_v4t_thumb_arm
,
2083 arm_stub_short_branch_v4t_thumb_arm
,
2084 arm_stub_long_branch_any_any_pic
,
2087 struct elf32_arm_stub_hash_entry
2089 /* Base hash table entry structure. */
2090 struct bfd_hash_entry root
;
2092 /* The stub section. */
2095 /* Offset within stub_sec of the beginning of this stub. */
2096 bfd_vma stub_offset
;
2098 /* Given the symbol's value and its section we can determine its final
2099 value when building the stubs (so the stub knows where to jump). */
2100 bfd_vma target_value
;
2101 asection
*target_section
;
2103 enum elf32_arm_stub_type stub_type
;
2105 /* The symbol table entry, if any, that this was derived from. */
2106 struct elf32_arm_link_hash_entry
*h
;
2108 /* Destination symbol type (STT_ARM_TFUNC, ...) */
2109 unsigned char st_type
;
2111 /* Where this stub is being called from, or, in the case of combined
2112 stub sections, the first input section in the group. */
2115 /* The name for the local symbol at the start of this stub. The
2116 stub name in the hash table has to be unique; this does not, so
2117 it can be friendlier. */
2121 /* Used to build a map of a section. This is required for mixed-endian
2124 typedef struct elf32_elf_section_map
2129 elf32_arm_section_map
;
2131 /* Information about a VFP11 erratum veneer, or a branch to such a veneer. */
2135 VFP11_ERRATUM_BRANCH_TO_ARM_VENEER
,
2136 VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER
,
2137 VFP11_ERRATUM_ARM_VENEER
,
2138 VFP11_ERRATUM_THUMB_VENEER
2140 elf32_vfp11_erratum_type
;
2142 typedef struct elf32_vfp11_erratum_list
2144 struct elf32_vfp11_erratum_list
*next
;
2150 struct elf32_vfp11_erratum_list
*veneer
;
2151 unsigned int vfp_insn
;
2155 struct elf32_vfp11_erratum_list
*branch
;
2159 elf32_vfp11_erratum_type type
;
2161 elf32_vfp11_erratum_list
;
2163 typedef struct _arm_elf_section_data
2165 struct bfd_elf_section_data elf
;
2166 unsigned int mapcount
;
2167 unsigned int mapsize
;
2168 elf32_arm_section_map
*map
;
2169 unsigned int erratumcount
;
2170 elf32_vfp11_erratum_list
*erratumlist
;
2172 _arm_elf_section_data
;
2174 #define elf32_arm_section_data(sec) \
2175 ((_arm_elf_section_data *) elf_section_data (sec))
2177 /* The size of the thread control block. */
2180 struct elf_arm_obj_tdata
2182 struct elf_obj_tdata root
;
2184 /* tls_type for each local got entry. */
2185 char *local_got_tls_type
;
2187 /* Zero to warn when linking objects with incompatible enum sizes. */
2188 int no_enum_size_warning
;
2190 /* Zero to warn when linking objects with incompatible wchar_t sizes. */
2191 int no_wchar_size_warning
;
2194 #define elf_arm_tdata(bfd) \
2195 ((struct elf_arm_obj_tdata *) (bfd)->tdata.any)
2197 #define elf32_arm_local_got_tls_type(bfd) \
2198 (elf_arm_tdata (bfd)->local_got_tls_type)
2200 #define is_arm_elf(bfd) \
2201 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2202 && elf_tdata (bfd) != NULL \
2203 && elf_object_id (bfd) == ARM_ELF_TDATA)
2206 elf32_arm_mkobject (bfd
*abfd
)
2208 return bfd_elf_allocate_object (abfd
, sizeof (struct elf_arm_obj_tdata
),
2212 /* The ARM linker needs to keep track of the number of relocs that it
2213 decides to copy in check_relocs for each symbol. This is so that
2214 it can discard PC relative relocs if it doesn't need them when
2215 linking with -Bsymbolic. We store the information in a field
2216 extending the regular ELF linker hash table. */
2218 /* This structure keeps track of the number of relocs we have copied
2219 for a given symbol. */
2220 struct elf32_arm_relocs_copied
2223 struct elf32_arm_relocs_copied
* next
;
2224 /* A section in dynobj. */
2226 /* Number of relocs copied in this section. */
2227 bfd_size_type count
;
2228 /* Number of PC-relative relocs copied in this section. */
2229 bfd_size_type pc_count
;
2232 #define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
2234 /* Arm ELF linker hash entry. */
2235 struct elf32_arm_link_hash_entry
2237 struct elf_link_hash_entry root
;
2239 /* Number of PC relative relocs copied for this symbol. */
2240 struct elf32_arm_relocs_copied
* relocs_copied
;
2242 /* We reference count Thumb references to a PLT entry separately,
2243 so that we can emit the Thumb trampoline only if needed. */
2244 bfd_signed_vma plt_thumb_refcount
;
2246 /* Some references from Thumb code may be eliminated by BL->BLX
2247 conversion, so record them separately. */
2248 bfd_signed_vma plt_maybe_thumb_refcount
;
2250 /* Since PLT entries have variable size if the Thumb prologue is
2251 used, we need to record the index into .got.plt instead of
2252 recomputing it from the PLT offset. */
2253 bfd_signed_vma plt_got_offset
;
2255 #define GOT_UNKNOWN 0
2256 #define GOT_NORMAL 1
2257 #define GOT_TLS_GD 2
2258 #define GOT_TLS_IE 4
2259 unsigned char tls_type
;
2261 /* The symbol marking the real symbol location for exported thumb
2262 symbols with Arm stubs. */
2263 struct elf_link_hash_entry
*export_glue
;
2265 /* A pointer to the most recently used stub hash entry against this
2267 struct elf32_arm_stub_hash_entry
*stub_cache
;
2270 /* Traverse an arm ELF linker hash table. */
2271 #define elf32_arm_link_hash_traverse(table, func, info) \
2272 (elf_link_hash_traverse \
2274 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
2277 /* Get the ARM elf linker hash table from a link_info structure. */
2278 #define elf32_arm_hash_table(info) \
2279 ((struct elf32_arm_link_hash_table *) ((info)->hash))
2281 #define arm_stub_hash_lookup(table, string, create, copy) \
2282 ((struct elf32_arm_stub_hash_entry *) \
2283 bfd_hash_lookup ((table), (string), (create), (copy)))
2285 /* ARM ELF linker hash table. */
2286 struct elf32_arm_link_hash_table
2288 /* The main hash table. */
2289 struct elf_link_hash_table root
;
2291 /* The size in bytes of the section containing the Thumb-to-ARM glue. */
2292 bfd_size_type thumb_glue_size
;
2294 /* The size in bytes of the section containing the ARM-to-Thumb glue. */
2295 bfd_size_type arm_glue_size
;
2297 /* The size in bytes of section containing the ARMv4 BX veneers. */
2298 bfd_size_type bx_glue_size
;
2300 /* Offsets of ARMv4 BX veneers. Bit1 set if present, and Bit0 set when
2301 veneer has been populated. */
2302 bfd_vma bx_glue_offset
[15];
2304 /* The size in bytes of the section containing glue for VFP11 erratum
2306 bfd_size_type vfp11_erratum_glue_size
;
2308 /* An arbitrary input BFD chosen to hold the glue sections. */
2309 bfd
* bfd_of_glue_owner
;
2311 /* Nonzero to output a BE8 image. */
2314 /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
2315 Nonzero if R_ARM_TARGET1 means R_ARM_REL32. */
2318 /* The relocation to use for R_ARM_TARGET2 relocations. */
2321 /* 0 = Ignore R_ARM_V4BX.
2322 1 = Convert BX to MOV PC.
2323 2 = Generate v4 interworing stubs. */
2326 /* Nonzero if the ARM/Thumb BLX instructions are available for use. */
2329 /* What sort of code sequences we should look for which may trigger the
2330 VFP11 denorm erratum. */
2331 bfd_arm_vfp11_fix vfp11_fix
;
2333 /* Global counter for the number of fixes we have emitted. */
2334 int num_vfp11_fixes
;
2336 /* Nonzero to force PIC branch veneers. */
2339 /* The number of bytes in the initial entry in the PLT. */
2340 bfd_size_type plt_header_size
;
2342 /* The number of bytes in the subsequent PLT etries. */
2343 bfd_size_type plt_entry_size
;
2345 /* True if the target system is VxWorks. */
2348 /* True if the target system is Symbian OS. */
2351 /* True if the target uses REL relocations. */
2354 /* Short-cuts to get to dynamic linker sections. */
2363 /* The (unloaded but important) VxWorks .rela.plt.unloaded section. */
2366 /* Data for R_ARM_TLS_LDM32 relocations. */
2369 bfd_signed_vma refcount
;
2373 /* Small local sym to section mapping cache. */
2374 struct sym_sec_cache sym_sec
;
2376 /* For convenience in allocate_dynrelocs. */
2379 /* The stub hash table. */
2380 struct bfd_hash_table stub_hash_table
;
2382 /* Linker stub bfd. */
2385 /* Linker call-backs. */
2386 asection
* (*add_stub_section
) (const char *, asection
*);
2387 void (*layout_sections_again
) (void);
2389 /* Array to keep track of which stub sections have been created, and
2390 information on stub grouping. */
2393 /* This is the section to which stubs in the group will be
2396 /* The stub section. */
2400 /* Assorted information used by elf32_arm_size_stubs. */
2401 unsigned int bfd_count
;
2403 asection
**input_list
;
2406 /* Create an entry in an ARM ELF linker hash table. */
2408 static struct bfd_hash_entry
*
2409 elf32_arm_link_hash_newfunc (struct bfd_hash_entry
* entry
,
2410 struct bfd_hash_table
* table
,
2411 const char * string
)
2413 struct elf32_arm_link_hash_entry
* ret
=
2414 (struct elf32_arm_link_hash_entry
*) entry
;
2416 /* Allocate the structure if it has not already been allocated by a
2419 ret
= bfd_hash_allocate (table
, sizeof (struct elf32_arm_link_hash_entry
));
2421 return (struct bfd_hash_entry
*) ret
;
2423 /* Call the allocation method of the superclass. */
2424 ret
= ((struct elf32_arm_link_hash_entry
*)
2425 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
2429 ret
->relocs_copied
= NULL
;
2430 ret
->tls_type
= GOT_UNKNOWN
;
2431 ret
->plt_thumb_refcount
= 0;
2432 ret
->plt_maybe_thumb_refcount
= 0;
2433 ret
->plt_got_offset
= -1;
2434 ret
->export_glue
= NULL
;
2436 ret
->stub_cache
= NULL
;
2439 return (struct bfd_hash_entry
*) ret
;
2442 /* Initialize an entry in the stub hash table. */
2444 static struct bfd_hash_entry
*
2445 stub_hash_newfunc (struct bfd_hash_entry
*entry
,
2446 struct bfd_hash_table
*table
,
2449 /* Allocate the structure if it has not already been allocated by a
2453 entry
= bfd_hash_allocate (table
,
2454 sizeof (struct elf32_arm_stub_hash_entry
));
2459 /* Call the allocation method of the superclass. */
2460 entry
= bfd_hash_newfunc (entry
, table
, string
);
2463 struct elf32_arm_stub_hash_entry
*eh
;
2465 /* Initialize the local fields. */
2466 eh
= (struct elf32_arm_stub_hash_entry
*) entry
;
2467 eh
->stub_sec
= NULL
;
2468 eh
->stub_offset
= 0;
2469 eh
->target_value
= 0;
2470 eh
->target_section
= NULL
;
2471 eh
->stub_type
= arm_stub_none
;
2479 /* Create .got, .gotplt, and .rel(a).got sections in DYNOBJ, and set up
2480 shortcuts to them in our hash table. */
2483 create_got_section (bfd
*dynobj
, struct bfd_link_info
*info
)
2485 struct elf32_arm_link_hash_table
*htab
;
2487 htab
= elf32_arm_hash_table (info
);
2488 /* BPABI objects never have a GOT, or associated sections. */
2489 if (htab
->symbian_p
)
2492 if (! _bfd_elf_create_got_section (dynobj
, info
))
2495 htab
->sgot
= bfd_get_section_by_name (dynobj
, ".got");
2496 htab
->sgotplt
= bfd_get_section_by_name (dynobj
, ".got.plt");
2497 if (!htab
->sgot
|| !htab
->sgotplt
)
2500 htab
->srelgot
= bfd_make_section_with_flags (dynobj
,
2501 RELOC_SECTION (htab
, ".got"),
2502 (SEC_ALLOC
| SEC_LOAD
2505 | SEC_LINKER_CREATED
2507 if (htab
->srelgot
== NULL
2508 || ! bfd_set_section_alignment (dynobj
, htab
->srelgot
, 2))
2513 /* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
2514 .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
2518 elf32_arm_create_dynamic_sections (bfd
*dynobj
, struct bfd_link_info
*info
)
2520 struct elf32_arm_link_hash_table
*htab
;
2522 htab
= elf32_arm_hash_table (info
);
2523 if (!htab
->sgot
&& !create_got_section (dynobj
, info
))
2526 if (!_bfd_elf_create_dynamic_sections (dynobj
, info
))
2529 htab
->splt
= bfd_get_section_by_name (dynobj
, ".plt");
2530 htab
->srelplt
= bfd_get_section_by_name (dynobj
,
2531 RELOC_SECTION (htab
, ".plt"));
2532 htab
->sdynbss
= bfd_get_section_by_name (dynobj
, ".dynbss");
2534 htab
->srelbss
= bfd_get_section_by_name (dynobj
,
2535 RELOC_SECTION (htab
, ".bss"));
2537 if (htab
->vxworks_p
)
2539 if (!elf_vxworks_create_dynamic_sections (dynobj
, info
, &htab
->srelplt2
))
2544 htab
->plt_header_size
= 0;
2545 htab
->plt_entry_size
2546 = 4 * ARRAY_SIZE (elf32_arm_vxworks_shared_plt_entry
);
2550 htab
->plt_header_size
2551 = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt0_entry
);
2552 htab
->plt_entry_size
2553 = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt_entry
);
2560 || (!info
->shared
&& !htab
->srelbss
))
2566 /* Copy the extra info we tack onto an elf_link_hash_entry. */
2569 elf32_arm_copy_indirect_symbol (struct bfd_link_info
*info
,
2570 struct elf_link_hash_entry
*dir
,
2571 struct elf_link_hash_entry
*ind
)
2573 struct elf32_arm_link_hash_entry
*edir
, *eind
;
2575 edir
= (struct elf32_arm_link_hash_entry
*) dir
;
2576 eind
= (struct elf32_arm_link_hash_entry
*) ind
;
2578 if (eind
->relocs_copied
!= NULL
)
2580 if (edir
->relocs_copied
!= NULL
)
2582 struct elf32_arm_relocs_copied
**pp
;
2583 struct elf32_arm_relocs_copied
*p
;
2585 /* Add reloc counts against the indirect sym to the direct sym
2586 list. Merge any entries against the same section. */
2587 for (pp
= &eind
->relocs_copied
; (p
= *pp
) != NULL
; )
2589 struct elf32_arm_relocs_copied
*q
;
2591 for (q
= edir
->relocs_copied
; q
!= NULL
; q
= q
->next
)
2592 if (q
->section
== p
->section
)
2594 q
->pc_count
+= p
->pc_count
;
2595 q
->count
+= p
->count
;
2602 *pp
= edir
->relocs_copied
;
2605 edir
->relocs_copied
= eind
->relocs_copied
;
2606 eind
->relocs_copied
= NULL
;
2609 if (ind
->root
.type
== bfd_link_hash_indirect
)
2611 /* Copy over PLT info. */
2612 edir
->plt_thumb_refcount
+= eind
->plt_thumb_refcount
;
2613 eind
->plt_thumb_refcount
= 0;
2614 edir
->plt_maybe_thumb_refcount
+= eind
->plt_maybe_thumb_refcount
;
2615 eind
->plt_maybe_thumb_refcount
= 0;
2617 if (dir
->got
.refcount
<= 0)
2619 edir
->tls_type
= eind
->tls_type
;
2620 eind
->tls_type
= GOT_UNKNOWN
;
2624 _bfd_elf_link_hash_copy_indirect (info
, dir
, ind
);
2627 /* Create an ARM elf linker hash table. */
2629 static struct bfd_link_hash_table
*
2630 elf32_arm_link_hash_table_create (bfd
*abfd
)
2632 struct elf32_arm_link_hash_table
*ret
;
2633 bfd_size_type amt
= sizeof (struct elf32_arm_link_hash_table
);
2635 ret
= bfd_malloc (amt
);
2639 if (!_bfd_elf_link_hash_table_init (& ret
->root
, abfd
,
2640 elf32_arm_link_hash_newfunc
,
2641 sizeof (struct elf32_arm_link_hash_entry
)))
2648 ret
->sgotplt
= NULL
;
2649 ret
->srelgot
= NULL
;
2651 ret
->srelplt
= NULL
;
2652 ret
->sdynbss
= NULL
;
2653 ret
->srelbss
= NULL
;
2654 ret
->srelplt2
= NULL
;
2655 ret
->thumb_glue_size
= 0;
2656 ret
->arm_glue_size
= 0;
2657 ret
->bx_glue_size
= 0;
2658 memset (ret
->bx_glue_offset
, 0, sizeof (ret
->bx_glue_offset
));
2659 ret
->vfp11_fix
= BFD_ARM_VFP11_FIX_NONE
;
2660 ret
->vfp11_erratum_glue_size
= 0;
2661 ret
->num_vfp11_fixes
= 0;
2662 ret
->bfd_of_glue_owner
= NULL
;
2663 ret
->byteswap_code
= 0;
2664 ret
->target1_is_rel
= 0;
2665 ret
->target2_reloc
= R_ARM_NONE
;
2666 #ifdef FOUR_WORD_PLT
2667 ret
->plt_header_size
= 16;
2668 ret
->plt_entry_size
= 16;
2670 ret
->plt_header_size
= 20;
2671 ret
->plt_entry_size
= 12;
2678 ret
->sym_sec
.abfd
= NULL
;
2680 ret
->tls_ldm_got
.refcount
= 0;
2681 ret
->stub_bfd
= NULL
;
2682 ret
->add_stub_section
= NULL
;
2683 ret
->layout_sections_again
= NULL
;
2684 ret
->stub_group
= NULL
;
2687 ret
->input_list
= NULL
;
2689 if (!bfd_hash_table_init (&ret
->stub_hash_table
, stub_hash_newfunc
,
2690 sizeof (struct elf32_arm_stub_hash_entry
)))
2696 return &ret
->root
.root
;
2699 /* Free the derived linker hash table. */
2702 elf32_arm_hash_table_free (struct bfd_link_hash_table
*hash
)
2704 struct elf32_arm_link_hash_table
*ret
2705 = (struct elf32_arm_link_hash_table
*) hash
;
2707 bfd_hash_table_free (&ret
->stub_hash_table
);
2708 _bfd_generic_link_hash_table_free (hash
);
2711 /* Determine if we're dealing with a Thumb only architecture. */
2714 using_thumb_only (struct elf32_arm_link_hash_table
*globals
)
2716 int arch
= bfd_elf_get_obj_attr_int (globals
->obfd
, OBJ_ATTR_PROC
,
2720 if (arch
!= TAG_CPU_ARCH_V7
)
2723 profile
= bfd_elf_get_obj_attr_int (globals
->obfd
, OBJ_ATTR_PROC
,
2724 Tag_CPU_arch_profile
);
2726 return profile
== 'M';
2729 /* Determine if we're dealing with a Thumb-2 object. */
2732 using_thumb2 (struct elf32_arm_link_hash_table
*globals
)
2734 int arch
= bfd_elf_get_obj_attr_int (globals
->obfd
, OBJ_ATTR_PROC
,
2736 return arch
== TAG_CPU_ARCH_V6T2
|| arch
>= TAG_CPU_ARCH_V7
;
2740 arm_stub_is_thumb (enum elf32_arm_stub_type stub_type
)
2744 case arm_stub_long_branch_thumb_only
:
2745 case arm_stub_long_branch_v4t_thumb_arm
:
2746 case arm_stub_short_branch_v4t_thumb_arm
:
2757 /* Determine the type of stub needed, if any, for a call. */
2759 static enum elf32_arm_stub_type
2760 arm_type_of_stub (struct bfd_link_info
*info
,
2761 asection
*input_sec
,
2762 const Elf_Internal_Rela
*rel
,
2763 unsigned char st_type
,
2764 struct elf32_arm_link_hash_entry
*hash
,
2765 bfd_vma destination
,
2771 bfd_signed_vma branch_offset
;
2772 unsigned int r_type
;
2773 struct elf32_arm_link_hash_table
* globals
;
2776 enum elf32_arm_stub_type stub_type
= arm_stub_none
;
2778 /* We don't know the actual type of destination in case it is of
2779 type STT_SECTION: give up. */
2780 if (st_type
== STT_SECTION
)
2783 globals
= elf32_arm_hash_table (info
);
2785 thumb_only
= using_thumb_only (globals
);
2787 thumb2
= using_thumb2 (globals
);
2789 /* Determine where the call point is. */
2790 location
= (input_sec
->output_offset
2791 + input_sec
->output_section
->vma
2794 branch_offset
= (bfd_signed_vma
)(destination
- location
);
2796 r_type
= ELF32_R_TYPE (rel
->r_info
);
2798 /* If the call will go through a PLT entry then we do not need
2800 if (globals
->splt
!= NULL
&& hash
!= NULL
&& hash
->root
.plt
.offset
!= (bfd_vma
) -1)
2803 if (r_type
== R_ARM_THM_CALL
)
2806 && (branch_offset
> THM_MAX_FWD_BRANCH_OFFSET
2807 || (branch_offset
< THM_MAX_BWD_BRANCH_OFFSET
)))
2809 && (branch_offset
> THM2_MAX_FWD_BRANCH_OFFSET
2810 || (branch_offset
< THM2_MAX_BWD_BRANCH_OFFSET
)))
2811 || ((st_type
!= STT_ARM_TFUNC
) && !globals
->use_blx
))
2813 if (st_type
== STT_ARM_TFUNC
)
2815 /* Thumb to thumb. */
2818 stub_type
= (info
->shared
| globals
->pic_veneer
)
2820 ? ((globals
->use_blx
)
2821 /* V5T and above. */
2822 ? arm_stub_long_branch_any_any_pic
2823 /* not yet supported on V4T. */
2826 /* non-PIC stubs. */
2827 : ((globals
->use_blx
)
2828 /* V5T and above. */
2829 ? arm_stub_long_branch_any_any
2831 : arm_stub_long_branch_thumb_only
);
2835 stub_type
= (info
->shared
| globals
->pic_veneer
)
2836 /* PIC stub not yet supported on V4T. */
2839 : arm_stub_long_branch_thumb_only
;
2846 && sym_sec
->owner
!= NULL
2847 && !INTERWORK_FLAG (sym_sec
->owner
))
2849 (*_bfd_error_handler
)
2850 (_("%B(%s): warning: interworking not enabled.\n"
2851 " first occurrence: %B: Thumb call to ARM"),
2852 sym_sec
->owner
, input_bfd
, name
);
2855 stub_type
= (info
->shared
| globals
->pic_veneer
)
2857 ? ((globals
->use_blx
)
2858 /* V5T and above. */
2859 ? arm_stub_long_branch_any_any_pic
2860 /* not yet supported on V4T. */
2863 /* non-PIC stubs. */
2864 : ((globals
->use_blx
)
2865 /* V5T and above. */
2866 ? arm_stub_long_branch_any_any
2868 : arm_stub_long_branch_v4t_thumb_arm
);
2870 /* Handle v4t short branches. */
2871 if ((stub_type
== arm_stub_long_branch_v4t_thumb_arm
)
2872 && (branch_offset
<= THM_MAX_FWD_BRANCH_OFFSET
)
2873 && (branch_offset
>= THM_MAX_BWD_BRANCH_OFFSET
))
2874 stub_type
= arm_stub_short_branch_v4t_thumb_arm
;
2878 else if (r_type
== R_ARM_CALL
)
2880 if (st_type
== STT_ARM_TFUNC
)
2885 && sym_sec
->owner
!= NULL
2886 && !INTERWORK_FLAG (sym_sec
->owner
))
2888 (*_bfd_error_handler
)
2889 (_("%B(%s): warning: interworking not enabled.\n"
2890 " first occurrence: %B: ARM call to Thumb"),
2891 sym_sec
->owner
, input_bfd
, name
);
2894 /* We have an extra 2-bytes reach because of
2895 the mode change (bit 24 (H) of BLX encoding). */
2896 if (branch_offset
> (ARM_MAX_FWD_BRANCH_OFFSET
+ 2)
2897 || (branch_offset
< ARM_MAX_BWD_BRANCH_OFFSET
)
2898 || !globals
->use_blx
)
2900 stub_type
= (info
->shared
| globals
->pic_veneer
)
2902 ? arm_stub_long_branch_any_any_pic
2903 /* non-PIC stubs. */
2904 : ((globals
->use_blx
)
2905 /* V5T and above. */
2906 ? arm_stub_long_branch_any_any
2908 : arm_stub_long_branch_v4t_arm_thumb
);
2914 if (branch_offset
> ARM_MAX_FWD_BRANCH_OFFSET
2915 || (branch_offset
< ARM_MAX_BWD_BRANCH_OFFSET
))
2917 stub_type
= (info
->shared
| globals
->pic_veneer
)
2919 ? arm_stub_long_branch_any_any_pic
2920 /* non-PIC stubs. */
2921 : arm_stub_long_branch_any_any
;
2929 /* Build a name for an entry in the stub hash table. */
2932 elf32_arm_stub_name (const asection
*input_section
,
2933 const asection
*sym_sec
,
2934 const struct elf32_arm_link_hash_entry
*hash
,
2935 const Elf_Internal_Rela
*rel
)
2942 len
= 8 + 1 + strlen (hash
->root
.root
.root
.string
) + 1 + 8 + 1;
2943 stub_name
= bfd_malloc (len
);
2944 if (stub_name
!= NULL
)
2945 sprintf (stub_name
, "%08x_%s+%x",
2946 input_section
->id
& 0xffffffff,
2947 hash
->root
.root
.root
.string
,
2948 (int) rel
->r_addend
& 0xffffffff);
2952 len
= 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
2953 stub_name
= bfd_malloc (len
);
2954 if (stub_name
!= NULL
)
2955 sprintf (stub_name
, "%08x_%x:%x+%x",
2956 input_section
->id
& 0xffffffff,
2957 sym_sec
->id
& 0xffffffff,
2958 (int) ELF32_R_SYM (rel
->r_info
) & 0xffffffff,
2959 (int) rel
->r_addend
& 0xffffffff);
2965 /* Look up an entry in the stub hash. Stub entries are cached because
2966 creating the stub name takes a bit of time. */
2968 static struct elf32_arm_stub_hash_entry
*
2969 elf32_arm_get_stub_entry (const asection
*input_section
,
2970 const asection
*sym_sec
,
2971 struct elf_link_hash_entry
*hash
,
2972 const Elf_Internal_Rela
*rel
,
2973 struct elf32_arm_link_hash_table
*htab
)
2975 struct elf32_arm_stub_hash_entry
*stub_entry
;
2976 struct elf32_arm_link_hash_entry
*h
= (struct elf32_arm_link_hash_entry
*) hash
;
2977 const asection
*id_sec
;
2979 if ((input_section
->flags
& SEC_CODE
) == 0)
2982 /* If this input section is part of a group of sections sharing one
2983 stub section, then use the id of the first section in the group.
2984 Stub names need to include a section id, as there may well be
2985 more than one stub used to reach say, printf, and we need to
2986 distinguish between them. */
2987 id_sec
= htab
->stub_group
[input_section
->id
].link_sec
;
2989 if (h
!= NULL
&& h
->stub_cache
!= NULL
2990 && h
->stub_cache
->h
== h
2991 && h
->stub_cache
->id_sec
== id_sec
)
2993 stub_entry
= h
->stub_cache
;
2999 stub_name
= elf32_arm_stub_name (id_sec
, sym_sec
, h
, rel
);
3000 if (stub_name
== NULL
)
3003 stub_entry
= arm_stub_hash_lookup (&htab
->stub_hash_table
,
3004 stub_name
, FALSE
, FALSE
);
3006 h
->stub_cache
= stub_entry
;
3014 /* Add a new stub entry to the stub hash. Not all fields of the new
3015 stub entry are initialised. */
3017 static struct elf32_arm_stub_hash_entry
*
3018 elf32_arm_add_stub (const char *stub_name
,
3020 struct elf32_arm_link_hash_table
*htab
)
3024 struct elf32_arm_stub_hash_entry
*stub_entry
;
3026 link_sec
= htab
->stub_group
[section
->id
].link_sec
;
3027 stub_sec
= htab
->stub_group
[section
->id
].stub_sec
;
3028 if (stub_sec
== NULL
)
3030 stub_sec
= htab
->stub_group
[link_sec
->id
].stub_sec
;
3031 if (stub_sec
== NULL
)
3037 namelen
= strlen (link_sec
->name
);
3038 len
= namelen
+ sizeof (STUB_SUFFIX
);
3039 s_name
= bfd_alloc (htab
->stub_bfd
, len
);
3043 memcpy (s_name
, link_sec
->name
, namelen
);
3044 memcpy (s_name
+ namelen
, STUB_SUFFIX
, sizeof (STUB_SUFFIX
));
3045 stub_sec
= (*htab
->add_stub_section
) (s_name
, link_sec
);
3046 if (stub_sec
== NULL
)
3048 htab
->stub_group
[link_sec
->id
].stub_sec
= stub_sec
;
3050 htab
->stub_group
[section
->id
].stub_sec
= stub_sec
;
3053 /* Enter this entry into the linker stub hash table. */
3054 stub_entry
= arm_stub_hash_lookup (&htab
->stub_hash_table
, stub_name
,
3056 if (stub_entry
== NULL
)
3058 (*_bfd_error_handler
) (_("%s: cannot create stub entry %s"),
3064 stub_entry
->stub_sec
= stub_sec
;
3065 stub_entry
->stub_offset
= 0;
3066 stub_entry
->id_sec
= link_sec
;
3071 /* Store an Arm insn into an output section not processed by
3072 elf32_arm_write_section. */
3075 put_arm_insn (struct elf32_arm_link_hash_table
* htab
,
3076 bfd
* output_bfd
, bfd_vma val
, void * ptr
)
3078 if (htab
->byteswap_code
!= bfd_little_endian (output_bfd
))
3079 bfd_putl32 (val
, ptr
);
3081 bfd_putb32 (val
, ptr
);
3084 /* Store a 16-bit Thumb insn into an output section not processed by
3085 elf32_arm_write_section. */
3088 put_thumb_insn (struct elf32_arm_link_hash_table
* htab
,
3089 bfd
* output_bfd
, bfd_vma val
, void * ptr
)
3091 if (htab
->byteswap_code
!= bfd_little_endian (output_bfd
))
3092 bfd_putl16 (val
, ptr
);
3094 bfd_putb16 (val
, ptr
);
3098 arm_build_one_stub (struct bfd_hash_entry
*gen_entry
,
3101 struct elf32_arm_stub_hash_entry
*stub_entry
;
3102 struct bfd_link_info
*info
;
3103 struct elf32_arm_link_hash_table
*htab
;
3111 const bfd_vma
*template;
3113 struct elf32_arm_link_hash_table
* globals
;
3115 /* Massage our args to the form they really have. */
3116 stub_entry
= (struct elf32_arm_stub_hash_entry
*) gen_entry
;
3117 info
= (struct bfd_link_info
*) in_arg
;
3119 globals
= elf32_arm_hash_table (info
);
3121 htab
= elf32_arm_hash_table (info
);
3122 stub_sec
= stub_entry
->stub_sec
;
3124 /* Make a note of the offset within the stubs for this entry. */
3125 stub_entry
->stub_offset
= stub_sec
->size
;
3126 loc
= stub_sec
->contents
+ stub_entry
->stub_offset
;
3128 stub_bfd
= stub_sec
->owner
;
3130 /* This is the address of the start of the stub. */
3131 stub_addr
= stub_sec
->output_section
->vma
+ stub_sec
->output_offset
3132 + stub_entry
->stub_offset
;
3134 /* This is the address of the stub destination. */
3135 sym_value
= (stub_entry
->target_value
3136 + stub_entry
->target_section
->output_offset
3137 + stub_entry
->target_section
->output_section
->vma
);
3139 switch (stub_entry
->stub_type
)
3141 case arm_stub_long_branch_any_any
:
3142 template = elf32_arm_stub_long_branch_any_any
;
3143 template_size
= (sizeof (elf32_arm_stub_long_branch_any_any
) / sizeof (bfd_vma
)) * 4;
3145 case arm_stub_long_branch_v4t_arm_thumb
:
3146 template = elf32_arm_stub_long_branch_v4t_arm_thumb
;
3147 template_size
= (sizeof (elf32_arm_stub_long_branch_v4t_arm_thumb
) / sizeof (bfd_vma
)) * 4;
3149 case arm_stub_long_branch_thumb_only
:
3150 template = elf32_arm_stub_long_branch_thumb_only
;
3151 template_size
= (sizeof (elf32_arm_stub_long_branch_thumb_only
) / sizeof (bfd_vma
)) * 4;
3153 case arm_stub_long_branch_v4t_thumb_arm
:
3154 template = elf32_arm_stub_long_branch_v4t_thumb_arm
;
3155 template_size
= (sizeof (elf32_arm_stub_long_branch_v4t_thumb_arm
) / sizeof (bfd_vma
)) * 4;
3157 case arm_stub_short_branch_v4t_thumb_arm
:
3158 template = elf32_arm_stub_short_branch_v4t_thumb_arm
;
3159 template_size
= (sizeof(elf32_arm_stub_short_branch_v4t_thumb_arm
) / sizeof (bfd_vma
)) * 4;
3161 case arm_stub_long_branch_any_any_pic
:
3162 template = elf32_arm_stub_long_branch_any_any_pic
;
3163 template_size
= (sizeof (elf32_arm_stub_long_branch_any_any_pic
) / sizeof (bfd_vma
)) * 4;
3171 for (i
= 0; i
< (template_size
/ 4); i
++)
3173 /* A 0 pattern is a placeholder, every other pattern is an
3175 if (template[i
] != 0)
3176 put_arm_insn (globals
, stub_bfd
, template[i
], loc
+ size
);
3178 bfd_put_32 (stub_bfd
, template[i
], loc
+ size
);
3182 stub_sec
->size
+= size
;
3184 /* Destination is Thumb. Force bit 0 to 1 to reflect this. */
3185 if (stub_entry
->st_type
== STT_ARM_TFUNC
)
3188 switch (stub_entry
->stub_type
)
3190 case arm_stub_long_branch_any_any
:
3191 _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32
),
3192 stub_bfd
, stub_sec
, stub_sec
->contents
,
3193 stub_entry
->stub_offset
+ 4, sym_value
, 0);
3195 case arm_stub_long_branch_v4t_arm_thumb
:
3196 _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32
),
3197 stub_bfd
, stub_sec
, stub_sec
->contents
,
3198 stub_entry
->stub_offset
+ 8, sym_value
, 0);
3200 case arm_stub_long_branch_thumb_only
:
3201 _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32
),
3202 stub_bfd
, stub_sec
, stub_sec
->contents
,
3203 stub_entry
->stub_offset
+ 12, sym_value
, 0);
3205 case arm_stub_long_branch_v4t_thumb_arm
:
3206 _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32
),
3207 stub_bfd
, stub_sec
, stub_sec
->contents
,
3208 stub_entry
->stub_offset
+ 8, sym_value
, 0);
3210 case arm_stub_short_branch_v4t_thumb_arm
:
3212 long int rel_offset
;
3213 static const insn32 t2a3_b_insn
= 0xea000000;
3215 rel_offset
= sym_value
- (stub_addr
+ 8 + 4);
3217 put_arm_insn (globals
, stub_bfd
,
3218 (bfd_vma
) t2a3_b_insn
| ((rel_offset
>> 2) & 0x00FFFFFF),
3223 case arm_stub_long_branch_any_any_pic
:
3224 /* We want the value relative to the address 8 bytes from the
3225 start of the stub. */
3226 _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_REL32
),
3227 stub_bfd
, stub_sec
, stub_sec
->contents
,
3228 stub_entry
->stub_offset
+ 8, sym_value
, -4);
3238 /* As above, but don't actually build the stub. Just bump offset so
3239 we know stub section sizes. */
3242 arm_size_one_stub (struct bfd_hash_entry
*gen_entry
,
3245 struct elf32_arm_stub_hash_entry
*stub_entry
;
3246 struct elf32_arm_link_hash_table
*htab
;
3247 const bfd_vma
*template;
3252 /* Massage our args to the form they really have. */
3253 stub_entry
= (struct elf32_arm_stub_hash_entry
*) gen_entry
;
3254 htab
= (struct elf32_arm_link_hash_table
*) in_arg
;
3256 switch (stub_entry
->stub_type
)
3258 case arm_stub_long_branch_any_any
:
3259 template = elf32_arm_stub_long_branch_any_any
;
3260 template_size
= (sizeof (elf32_arm_stub_long_branch_any_any
) / sizeof (bfd_vma
)) * 4;
3262 case arm_stub_long_branch_v4t_arm_thumb
:
3263 template = elf32_arm_stub_long_branch_v4t_arm_thumb
;
3264 template_size
= (sizeof (elf32_arm_stub_long_branch_v4t_arm_thumb
) / sizeof (bfd_vma
)) * 4;
3266 case arm_stub_long_branch_thumb_only
:
3267 template = elf32_arm_stub_long_branch_thumb_only
;
3268 template_size
= (sizeof (elf32_arm_stub_long_branch_thumb_only
) / sizeof (bfd_vma
)) * 4;
3270 case arm_stub_long_branch_v4t_thumb_arm
:
3271 template = elf32_arm_stub_long_branch_v4t_thumb_arm
;
3272 template_size
= (sizeof (elf32_arm_stub_long_branch_v4t_thumb_arm
) / sizeof (bfd_vma
)) * 4;
3274 case arm_stub_short_branch_v4t_thumb_arm
:
3275 template = elf32_arm_stub_short_branch_v4t_thumb_arm
;
3276 template_size
= (sizeof(elf32_arm_stub_short_branch_v4t_thumb_arm
) / sizeof (bfd_vma
)) * 4;
3278 case arm_stub_long_branch_any_any_pic
:
3279 template = elf32_arm_stub_long_branch_any_any_pic
;
3280 template_size
= (sizeof (elf32_arm_stub_long_branch_any_any_pic
) / sizeof (bfd_vma
)) * 4;
3289 for (i
= 0; i
< (template_size
/ 4); i
++)
3291 size
= (size
+ 7) & ~7;
3292 stub_entry
->stub_sec
->size
+= size
;
3296 /* External entry points for sizing and building linker stubs. */
3298 /* Set up various things so that we can make a list of input sections
3299 for each output section included in the link. Returns -1 on error,
3300 0 when no stubs will be needed, and 1 on success. */
3303 elf32_arm_setup_section_lists (bfd
*output_bfd
,
3304 struct bfd_link_info
*info
)
3307 unsigned int bfd_count
;
3308 int top_id
, top_index
;
3310 asection
**input_list
, **list
;
3312 struct elf32_arm_link_hash_table
*htab
= elf32_arm_hash_table (info
);
3314 if (! is_elf_hash_table (htab
))
3317 /* Count the number of input BFDs and find the top input section id. */
3318 for (input_bfd
= info
->input_bfds
, bfd_count
= 0, top_id
= 0;
3320 input_bfd
= input_bfd
->link_next
)
3323 for (section
= input_bfd
->sections
;
3325 section
= section
->next
)
3327 if (top_id
< section
->id
)
3328 top_id
= section
->id
;
3331 htab
->bfd_count
= bfd_count
;
3333 amt
= sizeof (struct map_stub
) * (top_id
+ 1);
3334 htab
->stub_group
= bfd_zmalloc (amt
);
3335 if (htab
->stub_group
== NULL
)
3338 /* We can't use output_bfd->section_count here to find the top output
3339 section index as some sections may have been removed, and
3340 _bfd_strip_section_from_output doesn't renumber the indices. */
3341 for (section
= output_bfd
->sections
, top_index
= 0;
3343 section
= section
->next
)
3345 if (top_index
< section
->index
)
3346 top_index
= section
->index
;
3349 htab
->top_index
= top_index
;
3350 amt
= sizeof (asection
*) * (top_index
+ 1);
3351 input_list
= bfd_malloc (amt
);
3352 htab
->input_list
= input_list
;
3353 if (input_list
== NULL
)
3356 /* For sections we aren't interested in, mark their entries with a
3357 value we can check later. */
3358 list
= input_list
+ top_index
;
3360 *list
= bfd_abs_section_ptr
;
3361 while (list
-- != input_list
);
3363 for (section
= output_bfd
->sections
;
3365 section
= section
->next
)
3367 if ((section
->flags
& SEC_CODE
) != 0)
3368 input_list
[section
->index
] = NULL
;
3374 /* The linker repeatedly calls this function for each input section,
3375 in the order that input sections are linked into output sections.
3376 Build lists of input sections to determine groupings between which
3377 we may insert linker stubs. */
3380 elf32_arm_next_input_section (struct bfd_link_info
*info
,
3383 struct elf32_arm_link_hash_table
*htab
= elf32_arm_hash_table (info
);
3385 if (isec
->output_section
->index
<= htab
->top_index
)
3387 asection
**list
= htab
->input_list
+ isec
->output_section
->index
;
3389 if (*list
!= bfd_abs_section_ptr
)
3391 /* Steal the link_sec pointer for our list. */
3392 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
3393 /* This happens to make the list in reverse order,
3394 which is what we want. */
3395 PREV_SEC (isec
) = *list
;
3401 /* See whether we can group stub sections together. Grouping stub
3402 sections may result in fewer stubs. More importantly, we need to
3403 put all .init* and .fini* stubs at the beginning of the .init or
3404 .fini output sections respectively, because glibc splits the
3405 _init and _fini functions into multiple parts. Putting a stub in
3406 the middle of a function is not a good idea. */
3409 group_sections (struct elf32_arm_link_hash_table
*htab
,
3410 bfd_size_type stub_group_size
,
3411 bfd_boolean stubs_always_before_branch
)
3413 asection
**list
= htab
->input_list
+ htab
->top_index
;
3417 asection
*tail
= *list
;
3419 if (tail
== bfd_abs_section_ptr
)
3422 while (tail
!= NULL
)
3426 bfd_size_type total
;
3430 while ((prev
= PREV_SEC (curr
)) != NULL
3431 && ((total
+= curr
->output_offset
- prev
->output_offset
)
3435 /* OK, the size from the start of CURR to the end is less
3436 than stub_group_size and thus can be handled by one stub
3437 section. (Or the tail section is itself larger than
3438 stub_group_size, in which case we may be toast.)
3439 We should really be keeping track of the total size of
3440 stubs added here, as stubs contribute to the final output
3444 prev
= PREV_SEC (tail
);
3445 /* Set up this stub group. */
3446 htab
->stub_group
[tail
->id
].link_sec
= curr
;
3448 while (tail
!= curr
&& (tail
= prev
) != NULL
);
3450 /* But wait, there's more! Input sections up to stub_group_size
3451 bytes before the stub section can be handled by it too. */
3452 if (!stubs_always_before_branch
)
3456 && ((total
+= tail
->output_offset
- prev
->output_offset
)
3460 prev
= PREV_SEC (tail
);
3461 htab
->stub_group
[tail
->id
].link_sec
= curr
;
3467 while (list
-- != htab
->input_list
);
3469 free (htab
->input_list
);
3473 /* Determine and set the size of the stub section for a final link.
3475 The basic idea here is to examine all the relocations looking for
3476 PC-relative calls to a target that is unreachable with a "bl"
3480 elf32_arm_size_stubs (bfd
*output_bfd
,
3482 struct bfd_link_info
*info
,
3483 bfd_signed_vma group_size
,
3484 asection
* (*add_stub_section
) (const char *, asection
*),
3485 void (*layout_sections_again
) (void))
3487 bfd_size_type stub_group_size
;
3488 bfd_boolean stubs_always_before_branch
;
3489 bfd_boolean stub_changed
= 0;
3490 struct elf32_arm_link_hash_table
*htab
= elf32_arm_hash_table (info
);
3492 /* Propagate mach to stub bfd, because it may not have been
3493 finalized when we created stub_bfd. */
3494 bfd_set_arch_mach (stub_bfd
, bfd_get_arch (output_bfd
),
3495 bfd_get_mach (output_bfd
));
3497 /* Stash our params away. */
3498 htab
->stub_bfd
= stub_bfd
;
3499 htab
->add_stub_section
= add_stub_section
;
3500 htab
->layout_sections_again
= layout_sections_again
;
3501 stubs_always_before_branch
= group_size
< 0;
3503 stub_group_size
= -group_size
;
3505 stub_group_size
= group_size
;
3507 if (stub_group_size
== 1)
3509 /* Default values. */
3510 /* Thumb branch range is +-4MB has to be used as the default
3511 maximum size (a given section can contain both ARM and Thumb
3512 code, so the worst case has to be taken into account).
3514 This value is 24K less than that, which allows for 2025
3515 12-byte stubs. If we exceed that, then we will fail to link.
3516 The user will have to relink with an explicit group size
3518 stub_group_size
= 4170000;
3521 group_sections (htab
, stub_group_size
, stubs_always_before_branch
);
3526 unsigned int bfd_indx
;
3529 for (input_bfd
= info
->input_bfds
, bfd_indx
= 0;
3531 input_bfd
= input_bfd
->link_next
, bfd_indx
++)
3533 Elf_Internal_Shdr
*symtab_hdr
;
3535 Elf_Internal_Sym
*local_syms
= NULL
;
3537 /* We'll need the symbol table in a second. */
3538 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
3539 if (symtab_hdr
->sh_info
== 0)
3542 /* Walk over each section attached to the input bfd. */
3543 for (section
= input_bfd
->sections
;
3545 section
= section
->next
)
3547 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
3549 /* If there aren't any relocs, then there's nothing more
3551 if ((section
->flags
& SEC_RELOC
) == 0
3552 || section
->reloc_count
== 0
3553 || (section
->flags
& SEC_CODE
) == 0)
3556 /* If this section is a link-once section that will be
3557 discarded, then don't create any stubs. */
3558 if (section
->output_section
== NULL
3559 || section
->output_section
->owner
!= output_bfd
)
3562 /* Get the relocs. */
3564 = _bfd_elf_link_read_relocs (input_bfd
, section
, NULL
,
3565 NULL
, info
->keep_memory
);
3566 if (internal_relocs
== NULL
)
3567 goto error_ret_free_local
;
3569 /* Now examine each relocation. */
3570 irela
= internal_relocs
;
3571 irelaend
= irela
+ section
->reloc_count
;
3572 for (; irela
< irelaend
; irela
++)
3574 unsigned int r_type
, r_indx
;
3575 enum elf32_arm_stub_type stub_type
;
3576 struct elf32_arm_stub_hash_entry
*stub_entry
;
3579 bfd_vma destination
;
3580 struct elf32_arm_link_hash_entry
*hash
;
3581 const char *sym_name
;
3583 const asection
*id_sec
;
3584 unsigned char st_type
;
3586 r_type
= ELF32_R_TYPE (irela
->r_info
);
3587 r_indx
= ELF32_R_SYM (irela
->r_info
);
3589 if (r_type
>= (unsigned int) R_ARM_max
)
3591 bfd_set_error (bfd_error_bad_value
);
3592 error_ret_free_internal
:
3593 if (elf_section_data (section
)->relocs
== NULL
)
3594 free (internal_relocs
);
3595 goto error_ret_free_local
;
3598 /* Only look for stubs on call instructions. */
3599 if ((r_type
!= (unsigned int) R_ARM_CALL
)
3600 && (r_type
!= (unsigned int) R_ARM_THM_CALL
))
3603 /* Now determine the call target, its name, value,
3610 if (r_indx
< symtab_hdr
->sh_info
)
3612 /* It's a local symbol. */
3613 Elf_Internal_Sym
*sym
;
3614 Elf_Internal_Shdr
*hdr
;
3616 if (local_syms
== NULL
)
3619 = (Elf_Internal_Sym
*) symtab_hdr
->contents
;
3620 if (local_syms
== NULL
)
3622 = bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
3623 symtab_hdr
->sh_info
, 0,
3625 if (local_syms
== NULL
)
3626 goto error_ret_free_internal
;
3629 sym
= local_syms
+ r_indx
;
3630 hdr
= elf_elfsections (input_bfd
)[sym
->st_shndx
];
3631 sym_sec
= hdr
->bfd_section
;
3632 if (ELF_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3633 sym_value
= sym
->st_value
;
3634 destination
= (sym_value
+ irela
->r_addend
3635 + sym_sec
->output_offset
3636 + sym_sec
->output_section
->vma
);
3637 st_type
= ELF_ST_TYPE (sym
->st_info
);
3639 = bfd_elf_string_from_elf_section (input_bfd
,
3640 symtab_hdr
->sh_link
,
3645 /* It's an external symbol. */
3648 e_indx
= r_indx
- symtab_hdr
->sh_info
;
3649 hash
= ((struct elf32_arm_link_hash_entry
*)
3650 elf_sym_hashes (input_bfd
)[e_indx
]);
3652 while (hash
->root
.root
.type
== bfd_link_hash_indirect
3653 || hash
->root
.root
.type
== bfd_link_hash_warning
)
3654 hash
= ((struct elf32_arm_link_hash_entry
*)
3655 hash
->root
.root
.u
.i
.link
);
3657 if (hash
->root
.root
.type
== bfd_link_hash_defined
3658 || hash
->root
.root
.type
== bfd_link_hash_defweak
)
3660 sym_sec
= hash
->root
.root
.u
.def
.section
;
3661 sym_value
= hash
->root
.root
.u
.def
.value
;
3662 if (sym_sec
->output_section
!= NULL
)
3663 destination
= (sym_value
+ irela
->r_addend
3664 + sym_sec
->output_offset
3665 + sym_sec
->output_section
->vma
);
3667 else if (hash
->root
.root
.type
== bfd_link_hash_undefweak
3668 || hash
->root
.root
.type
== bfd_link_hash_undefined
)
3669 /* For a shared library, these will need a PLT stub,
3670 which is treated separately.
3671 For absolute code, they cannot be handled. */
3675 bfd_set_error (bfd_error_bad_value
);
3676 goto error_ret_free_internal
;
3678 st_type
= ELF_ST_TYPE (hash
->root
.type
);
3679 sym_name
= hash
->root
.root
.root
.string
;
3682 /* Determine what (if any) linker stub is needed. */
3683 stub_type
= arm_type_of_stub (info
, section
, irela
, st_type
,
3684 hash
, destination
, sym_sec
,
3685 input_bfd
, sym_name
);
3686 if (stub_type
== arm_stub_none
)
3689 /* Support for grouping stub sections. */
3690 id_sec
= htab
->stub_group
[section
->id
].link_sec
;
3692 /* Get the name of this stub. */
3693 stub_name
= elf32_arm_stub_name (id_sec
, sym_sec
, hash
, irela
);
3695 goto error_ret_free_internal
;
3697 stub_entry
= arm_stub_hash_lookup (&htab
->stub_hash_table
,
3700 if (stub_entry
!= NULL
)
3702 /* The proper stub has already been created. */
3707 stub_entry
= elf32_arm_add_stub (stub_name
, section
, htab
);
3708 if (stub_entry
== NULL
)
3711 goto error_ret_free_internal
;
3714 stub_entry
->target_value
= sym_value
;
3715 stub_entry
->target_section
= sym_sec
;
3716 stub_entry
->stub_type
= stub_type
;
3717 stub_entry
->h
= hash
;
3718 stub_entry
->st_type
= st_type
;
3720 if (sym_name
== NULL
)
3721 sym_name
= "unnamed";
3722 stub_entry
->output_name
3723 = bfd_alloc (htab
->stub_bfd
,
3724 sizeof (THUMB2ARM_GLUE_ENTRY_NAME
)
3725 + strlen (sym_name
));
3726 if (stub_entry
->output_name
== NULL
)
3729 goto error_ret_free_internal
;
3732 /* For historical reasons, use the existing names for
3733 ARM-to-Thumb and Thumb-to-ARM stubs. */
3734 if (r_type
== (unsigned int) R_ARM_THM_CALL
3735 && st_type
!= STT_ARM_TFUNC
)
3736 sprintf (stub_entry
->output_name
, THUMB2ARM_GLUE_ENTRY_NAME
,
3738 else if (r_type
== (unsigned int) R_ARM_CALL
3739 && st_type
== STT_ARM_TFUNC
)
3740 sprintf (stub_entry
->output_name
, ARM2THUMB_GLUE_ENTRY_NAME
,
3743 sprintf (stub_entry
->output_name
, STUB_ENTRY_NAME
,
3746 stub_changed
= TRUE
;
3749 /* We're done with the internal relocs, free them. */
3750 if (elf_section_data (section
)->relocs
== NULL
)
3751 free (internal_relocs
);
3758 /* OK, we've added some stubs. Find out the new size of the
3760 for (stub_sec
= htab
->stub_bfd
->sections
;
3762 stub_sec
= stub_sec
->next
)
3765 bfd_hash_traverse (&htab
->stub_hash_table
, arm_size_one_stub
, htab
);
3767 /* Ask the linker to do its stuff. */
3768 (*htab
->layout_sections_again
) ();
3769 stub_changed
= FALSE
;
3774 error_ret_free_local
:
3778 /* Build all the stubs associated with the current output file. The
3779 stubs are kept in a hash table attached to the main linker hash
3780 table. We also set up the .plt entries for statically linked PIC
3781 functions here. This function is called via arm_elf_finish in the
3785 elf32_arm_build_stubs (struct bfd_link_info
*info
)
3788 struct bfd_hash_table
*table
;
3789 struct elf32_arm_link_hash_table
*htab
;
3791 htab
= elf32_arm_hash_table (info
);
3793 for (stub_sec
= htab
->stub_bfd
->sections
;
3795 stub_sec
= stub_sec
->next
)
3799 /* Ignore non-stub sections. */
3800 if (!strstr (stub_sec
->name
, STUB_SUFFIX
))
3803 /* Allocate memory to hold the linker stubs. */
3804 size
= stub_sec
->size
;
3805 stub_sec
->contents
= bfd_zalloc (htab
->stub_bfd
, size
);
3806 if (stub_sec
->contents
== NULL
&& size
!= 0)
3811 /* Build the stubs as directed by the stub hash table. */
3812 table
= &htab
->stub_hash_table
;
3813 bfd_hash_traverse (table
, arm_build_one_stub
, info
);
3818 /* Locate the Thumb encoded calling stub for NAME. */
3820 static struct elf_link_hash_entry
*
3821 find_thumb_glue (struct bfd_link_info
*link_info
,
3823 char **error_message
)
3826 struct elf_link_hash_entry
*hash
;
3827 struct elf32_arm_link_hash_table
*hash_table
;
3829 /* We need a pointer to the armelf specific hash table. */
3830 hash_table
= elf32_arm_hash_table (link_info
);
3832 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
)
3833 + strlen (THUMB2ARM_GLUE_ENTRY_NAME
) + 1);
3835 BFD_ASSERT (tmp_name
);
3837 sprintf (tmp_name
, THUMB2ARM_GLUE_ENTRY_NAME
, name
);
3839 hash
= elf_link_hash_lookup
3840 (&(hash_table
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
3843 && asprintf (error_message
, _("unable to find THUMB glue '%s' for '%s'"),
3844 tmp_name
, name
) == -1)
3845 *error_message
= (char *) bfd_errmsg (bfd_error_system_call
);
3852 /* Locate the ARM encoded calling stub for NAME. */
3854 static struct elf_link_hash_entry
*
3855 find_arm_glue (struct bfd_link_info
*link_info
,
3857 char **error_message
)
3860 struct elf_link_hash_entry
*myh
;
3861 struct elf32_arm_link_hash_table
*hash_table
;
3863 /* We need a pointer to the elfarm specific hash table. */
3864 hash_table
= elf32_arm_hash_table (link_info
);
3866 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
)
3867 + strlen (ARM2THUMB_GLUE_ENTRY_NAME
) + 1);
3869 BFD_ASSERT (tmp_name
);
3871 sprintf (tmp_name
, ARM2THUMB_GLUE_ENTRY_NAME
, name
);
3873 myh
= elf_link_hash_lookup
3874 (&(hash_table
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
3877 && asprintf (error_message
, _("unable to find ARM glue '%s' for '%s'"),
3878 tmp_name
, name
) == -1)
3879 *error_message
= (char *) bfd_errmsg (bfd_error_system_call
);
3886 /* ARM->Thumb glue (static images):
3890 ldr r12, __func_addr
3893 .word func @ behave as if you saw a ARM_32 reloc.
3900 .word func @ behave as if you saw a ARM_32 reloc.
3902 (relocatable images)
3905 ldr r12, __func_offset
3911 #define ARM2THUMB_STATIC_GLUE_SIZE 12
3912 static const insn32 a2t1_ldr_insn
= 0xe59fc000;
3913 static const insn32 a2t2_bx_r12_insn
= 0xe12fff1c;
3914 static const insn32 a2t3_func_addr_insn
= 0x00000001;
3916 #define ARM2THUMB_V5_STATIC_GLUE_SIZE 8
3917 static const insn32 a2t1v5_ldr_insn
= 0xe51ff004;
3918 static const insn32 a2t2v5_func_addr_insn
= 0x00000001;
3920 #define ARM2THUMB_PIC_GLUE_SIZE 16
3921 static const insn32 a2t1p_ldr_insn
= 0xe59fc004;
3922 static const insn32 a2t2p_add_pc_insn
= 0xe08cc00f;
3923 static const insn32 a2t3p_bx_r12_insn
= 0xe12fff1c;
3925 /* Thumb->ARM: Thumb->(non-interworking aware) ARM
3929 __func_from_thumb: __func_from_thumb:
3931 nop ldr r6, __func_addr
3941 #define THUMB2ARM_GLUE_SIZE 8
3942 static const insn16 t2a1_bx_pc_insn
= 0x4778;
3943 static const insn16 t2a2_noop_insn
= 0x46c0;
3944 static const insn32 t2a3_b_insn
= 0xea000000;
3946 #define VFP11_ERRATUM_VENEER_SIZE 8
3948 #define ARM_BX_VENEER_SIZE 12
3949 static const insn32 armbx1_tst_insn
= 0xe3100001;
3950 static const insn32 armbx2_moveq_insn
= 0x01a0f000;
3951 static const insn32 armbx3_bx_insn
= 0xe12fff10;
3953 #ifndef ELFARM_NABI_C_INCLUDED
3955 arm_allocate_glue_section_space (bfd
* abfd
, bfd_size_type size
, const char * name
)
3958 bfd_byte
* contents
;
3963 BFD_ASSERT (abfd
!= NULL
);
3965 s
= bfd_get_section_by_name (abfd
, name
);
3966 BFD_ASSERT (s
!= NULL
);
3968 contents
= bfd_alloc (abfd
, size
);
3970 BFD_ASSERT (s
->size
== size
);
3971 s
->contents
= contents
;
3975 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info
* info
)
3977 struct elf32_arm_link_hash_table
* globals
;
3979 globals
= elf32_arm_hash_table (info
);
3980 BFD_ASSERT (globals
!= NULL
);
3982 arm_allocate_glue_section_space (globals
->bfd_of_glue_owner
,
3983 globals
->arm_glue_size
,
3984 ARM2THUMB_GLUE_SECTION_NAME
);
3986 arm_allocate_glue_section_space (globals
->bfd_of_glue_owner
,
3987 globals
->thumb_glue_size
,
3988 THUMB2ARM_GLUE_SECTION_NAME
);
3990 arm_allocate_glue_section_space (globals
->bfd_of_glue_owner
,
3991 globals
->vfp11_erratum_glue_size
,
3992 VFP11_ERRATUM_VENEER_SECTION_NAME
);
3994 arm_allocate_glue_section_space (globals
->bfd_of_glue_owner
,
3995 globals
->bx_glue_size
,
3996 ARM_BX_GLUE_SECTION_NAME
);
4001 /* Allocate space and symbols for calling a Thumb function from Arm mode.
4002 returns the symbol identifying the stub. */
4004 static struct elf_link_hash_entry
*
4005 record_arm_to_thumb_glue (struct bfd_link_info
* link_info
,
4006 struct elf_link_hash_entry
* h
)
4008 const char * name
= h
->root
.root
.string
;
4011 struct elf_link_hash_entry
* myh
;
4012 struct bfd_link_hash_entry
* bh
;
4013 struct elf32_arm_link_hash_table
* globals
;
4017 globals
= elf32_arm_hash_table (link_info
);
4019 BFD_ASSERT (globals
!= NULL
);
4020 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
4022 s
= bfd_get_section_by_name
4023 (globals
->bfd_of_glue_owner
, ARM2THUMB_GLUE_SECTION_NAME
);
4025 BFD_ASSERT (s
!= NULL
);
4027 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
) + strlen (ARM2THUMB_GLUE_ENTRY_NAME
) + 1);
4029 BFD_ASSERT (tmp_name
);
4031 sprintf (tmp_name
, ARM2THUMB_GLUE_ENTRY_NAME
, name
);
4033 myh
= elf_link_hash_lookup
4034 (&(globals
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
4038 /* We've already seen this guy. */
4043 /* The only trick here is using hash_table->arm_glue_size as the value.
4044 Even though the section isn't allocated yet, this is where we will be
4045 putting it. The +1 on the value marks that the stub has not been
4046 output yet - not that it is a Thumb function. */
4048 val
= globals
->arm_glue_size
+ 1;
4049 _bfd_generic_link_add_one_symbol (link_info
, globals
->bfd_of_glue_owner
,
4050 tmp_name
, BSF_GLOBAL
, s
, val
,
4051 NULL
, TRUE
, FALSE
, &bh
);
4053 myh
= (struct elf_link_hash_entry
*) bh
;
4054 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_FUNC
);
4055 myh
->forced_local
= 1;
4059 if (link_info
->shared
|| globals
->root
.is_relocatable_executable
4060 || globals
->pic_veneer
)
4061 size
= ARM2THUMB_PIC_GLUE_SIZE
;
4062 else if (globals
->use_blx
)
4063 size
= ARM2THUMB_V5_STATIC_GLUE_SIZE
;
4065 size
= ARM2THUMB_STATIC_GLUE_SIZE
;
4068 globals
->arm_glue_size
+= size
;
4074 record_thumb_to_arm_glue (struct bfd_link_info
*link_info
,
4075 struct elf_link_hash_entry
*h
)
4077 const char *name
= h
->root
.root
.string
;
4080 struct elf_link_hash_entry
*myh
;
4081 struct bfd_link_hash_entry
*bh
;
4082 struct elf32_arm_link_hash_table
*hash_table
;
4085 hash_table
= elf32_arm_hash_table (link_info
);
4087 BFD_ASSERT (hash_table
!= NULL
);
4088 BFD_ASSERT (hash_table
->bfd_of_glue_owner
!= NULL
);
4090 s
= bfd_get_section_by_name
4091 (hash_table
->bfd_of_glue_owner
, THUMB2ARM_GLUE_SECTION_NAME
);
4093 BFD_ASSERT (s
!= NULL
);
4095 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
)
4096 + strlen (THUMB2ARM_GLUE_ENTRY_NAME
) + 1);
4098 BFD_ASSERT (tmp_name
);
4100 sprintf (tmp_name
, THUMB2ARM_GLUE_ENTRY_NAME
, name
);
4102 myh
= elf_link_hash_lookup
4103 (&(hash_table
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
4107 /* We've already seen this guy. */
4112 /* The only trick here is using hash_table->thumb_glue_size as the value.
4113 Even though the section isn't allocated yet, this is where we will be
4114 putting it. The +1 on the value marks that the stub has not been
4115 output yet - not that it is a Thumb function. */
4117 val
= hash_table
->thumb_glue_size
+ 1;
4118 _bfd_generic_link_add_one_symbol (link_info
, hash_table
->bfd_of_glue_owner
,
4119 tmp_name
, BSF_GLOBAL
, s
, val
,
4120 NULL
, TRUE
, FALSE
, &bh
);
4122 /* If we mark it 'Thumb', the disassembler will do a better job. */
4123 myh
= (struct elf_link_hash_entry
*) bh
;
4124 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_ARM_TFUNC
);
4125 myh
->forced_local
= 1;
4129 #define CHANGE_TO_ARM "__%s_change_to_arm"
4130 #define BACK_FROM_ARM "__%s_back_from_arm"
4132 /* Allocate another symbol to mark where we switch to Arm mode. */
4133 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
)
4134 + strlen (CHANGE_TO_ARM
) + 1);
4136 BFD_ASSERT (tmp_name
);
4138 sprintf (tmp_name
, CHANGE_TO_ARM
, name
);
4141 val
= hash_table
->thumb_glue_size
+ 4,
4142 _bfd_generic_link_add_one_symbol (link_info
, hash_table
->bfd_of_glue_owner
,
4143 tmp_name
, BSF_LOCAL
, s
, val
,
4144 NULL
, TRUE
, FALSE
, &bh
);
4148 s
->size
+= THUMB2ARM_GLUE_SIZE
;
4149 hash_table
->thumb_glue_size
+= THUMB2ARM_GLUE_SIZE
;
4153 /* Allocate space for ARMv4 BX veneers. */
4156 record_arm_bx_glue (struct bfd_link_info
* link_info
, int reg
)
4159 struct elf32_arm_link_hash_table
*globals
;
4161 struct elf_link_hash_entry
*myh
;
4162 struct bfd_link_hash_entry
*bh
;
4165 /* BX PC does not need a veneer. */
4169 globals
= elf32_arm_hash_table (link_info
);
4171 BFD_ASSERT (globals
!= NULL
);
4172 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
4174 /* Check if this veneer has already been allocated. */
4175 if (globals
->bx_glue_offset
[reg
])
4178 s
= bfd_get_section_by_name
4179 (globals
->bfd_of_glue_owner
, ARM_BX_GLUE_SECTION_NAME
);
4181 BFD_ASSERT (s
!= NULL
);
4183 /* Add symbol for veneer. */
4184 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (ARM_BX_GLUE_ENTRY_NAME
) + 1);
4186 BFD_ASSERT (tmp_name
);
4188 sprintf (tmp_name
, ARM_BX_GLUE_ENTRY_NAME
, reg
);
4190 myh
= elf_link_hash_lookup
4191 (&(globals
)->root
, tmp_name
, FALSE
, FALSE
, FALSE
);
4193 BFD_ASSERT (myh
== NULL
);
4196 val
= globals
->bx_glue_size
;
4197 _bfd_generic_link_add_one_symbol (link_info
, globals
->bfd_of_glue_owner
,
4198 tmp_name
, BSF_FUNCTION
| BSF_LOCAL
, s
, val
,
4199 NULL
, TRUE
, FALSE
, &bh
);
4201 myh
= (struct elf_link_hash_entry
*) bh
;
4202 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_FUNC
);
4203 myh
->forced_local
= 1;
4205 s
->size
+= ARM_BX_VENEER_SIZE
;
4206 globals
->bx_glue_offset
[reg
] = globals
->bx_glue_size
| 2;
4207 globals
->bx_glue_size
+= ARM_BX_VENEER_SIZE
;
4211 /* Add an entry to the code/data map for section SEC. */
4214 elf32_arm_section_map_add (asection
*sec
, char type
, bfd_vma vma
)
4216 struct _arm_elf_section_data
*sec_data
= elf32_arm_section_data (sec
);
4217 unsigned int newidx
;
4219 if (sec_data
->map
== NULL
)
4221 sec_data
->map
= bfd_malloc (sizeof (elf32_arm_section_map
));
4222 sec_data
->mapcount
= 0;
4223 sec_data
->mapsize
= 1;
4226 newidx
= sec_data
->mapcount
++;
4228 if (sec_data
->mapcount
> sec_data
->mapsize
)
4230 sec_data
->mapsize
*= 2;
4231 sec_data
->map
= bfd_realloc_or_free (sec_data
->map
, sec_data
->mapsize
4232 * sizeof (elf32_arm_section_map
));
4237 sec_data
->map
[newidx
].vma
= vma
;
4238 sec_data
->map
[newidx
].type
= type
;
4243 /* Record information about a VFP11 denorm-erratum veneer. Only ARM-mode
4244 veneers are handled for now. */
4247 record_vfp11_erratum_veneer (struct bfd_link_info
*link_info
,
4248 elf32_vfp11_erratum_list
*branch
,
4250 asection
*branch_sec
,
4251 unsigned int offset
)
4254 struct elf32_arm_link_hash_table
*hash_table
;
4256 struct elf_link_hash_entry
*myh
;
4257 struct bfd_link_hash_entry
*bh
;
4259 struct _arm_elf_section_data
*sec_data
;
4261 elf32_vfp11_erratum_list
*newerr
;
4263 hash_table
= elf32_arm_hash_table (link_info
);
4265 BFD_ASSERT (hash_table
!= NULL
);
4266 BFD_ASSERT (hash_table
->bfd_of_glue_owner
!= NULL
);
4268 s
= bfd_get_section_by_name
4269 (hash_table
->bfd_of_glue_owner
, VFP11_ERRATUM_VENEER_SECTION_NAME
);
4271 sec_data
= elf32_arm_section_data (s
);
4273 BFD_ASSERT (s
!= NULL
);
4275 tmp_name
= bfd_malloc ((bfd_size_type
) strlen
4276 (VFP11_ERRATUM_VENEER_ENTRY_NAME
) + 10);
4278 BFD_ASSERT (tmp_name
);
4280 sprintf (tmp_name
, VFP11_ERRATUM_VENEER_ENTRY_NAME
,
4281 hash_table
->num_vfp11_fixes
);
4283 myh
= elf_link_hash_lookup
4284 (&(hash_table
)->root
, tmp_name
, FALSE
, FALSE
, FALSE
);
4286 BFD_ASSERT (myh
== NULL
);
4289 val
= hash_table
->vfp11_erratum_glue_size
;
4290 _bfd_generic_link_add_one_symbol (link_info
, hash_table
->bfd_of_glue_owner
,
4291 tmp_name
, BSF_FUNCTION
| BSF_LOCAL
, s
, val
,
4292 NULL
, TRUE
, FALSE
, &bh
);
4294 myh
= (struct elf_link_hash_entry
*) bh
;
4295 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_FUNC
);
4296 myh
->forced_local
= 1;
4298 /* Link veneer back to calling location. */
4299 errcount
= ++(sec_data
->erratumcount
);
4300 newerr
= bfd_zmalloc (sizeof (elf32_vfp11_erratum_list
));
4302 newerr
->type
= VFP11_ERRATUM_ARM_VENEER
;
4304 newerr
->u
.v
.branch
= branch
;
4305 newerr
->u
.v
.id
= hash_table
->num_vfp11_fixes
;
4306 branch
->u
.b
.veneer
= newerr
;
4308 newerr
->next
= sec_data
->erratumlist
;
4309 sec_data
->erratumlist
= newerr
;
4311 /* A symbol for the return from the veneer. */
4312 sprintf (tmp_name
, VFP11_ERRATUM_VENEER_ENTRY_NAME
"_r",
4313 hash_table
->num_vfp11_fixes
);
4315 myh
= elf_link_hash_lookup
4316 (&(hash_table
)->root
, tmp_name
, FALSE
, FALSE
, FALSE
);
4323 _bfd_generic_link_add_one_symbol (link_info
, branch_bfd
, tmp_name
, BSF_LOCAL
,
4324 branch_sec
, val
, NULL
, TRUE
, FALSE
, &bh
);
4326 myh
= (struct elf_link_hash_entry
*) bh
;
4327 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_FUNC
);
4328 myh
->forced_local
= 1;
4332 /* Generate a mapping symbol for the veneer section, and explicitly add an
4333 entry for that symbol to the code/data map for the section. */
4334 if (hash_table
->vfp11_erratum_glue_size
== 0)
4337 /* FIXME: Creates an ARM symbol. Thumb mode will need attention if it
4338 ever requires this erratum fix. */
4339 _bfd_generic_link_add_one_symbol (link_info
,
4340 hash_table
->bfd_of_glue_owner
, "$a",
4341 BSF_LOCAL
, s
, 0, NULL
,
4344 myh
= (struct elf_link_hash_entry
*) bh
;
4345 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_NOTYPE
);
4346 myh
->forced_local
= 1;
4348 /* The elf32_arm_init_maps function only cares about symbols from input
4349 BFDs. We must make a note of this generated mapping symbol
4350 ourselves so that code byteswapping works properly in
4351 elf32_arm_write_section. */
4352 elf32_arm_section_map_add (s
, 'a', 0);
4355 s
->size
+= VFP11_ERRATUM_VENEER_SIZE
;
4356 hash_table
->vfp11_erratum_glue_size
+= VFP11_ERRATUM_VENEER_SIZE
;
4357 hash_table
->num_vfp11_fixes
++;
4359 /* The offset of the veneer. */
4363 /* Note: we do not include the flag SEC_LINKER_CREATED, as that
4364 would prevent elf_link_input_bfd() from processing the contents
4366 #define ARM_GLUE_SECTION_FLAGS \
4367 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY)
4369 /* Create a fake section for use by the ARM backend of the linker. */
4372 arm_make_glue_section (bfd
* abfd
, const char * name
)
4376 sec
= bfd_get_section_by_name (abfd
, name
);
4381 sec
= bfd_make_section_with_flags (abfd
, name
, ARM_GLUE_SECTION_FLAGS
);
4384 || !bfd_set_section_alignment (abfd
, sec
, 2))
4387 /* Set the gc mark to prevent the section from being removed by garbage
4388 collection, despite the fact that no relocs refer to this section. */
4394 /* Add the glue sections to ABFD. This function is called from the
4395 linker scripts in ld/emultempl/{armelf}.em. */
4398 bfd_elf32_arm_add_glue_sections_to_bfd (bfd
*abfd
,
4399 struct bfd_link_info
*info
)
4401 /* If we are only performing a partial
4402 link do not bother adding the glue. */
4403 if (info
->relocatable
)
4406 /* Linker stubs don't need glue. */
4407 if (!strcmp (abfd
->filename
, "linker stubs"))
4410 return arm_make_glue_section (abfd
, ARM2THUMB_GLUE_SECTION_NAME
)
4411 && arm_make_glue_section (abfd
, THUMB2ARM_GLUE_SECTION_NAME
)
4412 && arm_make_glue_section (abfd
, VFP11_ERRATUM_VENEER_SECTION_NAME
)
4413 && arm_make_glue_section (abfd
, ARM_BX_GLUE_SECTION_NAME
);
4416 /* Select a BFD to be used to hold the sections used by the glue code.
4417 This function is called from the linker scripts in ld/emultempl/
4421 bfd_elf32_arm_get_bfd_for_interworking (bfd
*abfd
, struct bfd_link_info
*info
)
4423 struct elf32_arm_link_hash_table
*globals
;
4425 /* If we are only performing a partial link
4426 do not bother getting a bfd to hold the glue. */
4427 if (info
->relocatable
)
4430 /* Make sure we don't attach the glue sections to a dynamic object. */
4431 BFD_ASSERT (!(abfd
->flags
& DYNAMIC
));
4433 globals
= elf32_arm_hash_table (info
);
4435 BFD_ASSERT (globals
!= NULL
);
4437 if (globals
->bfd_of_glue_owner
!= NULL
)
4440 /* Save the bfd for later use. */
4441 globals
->bfd_of_glue_owner
= abfd
;
4447 check_use_blx (struct elf32_arm_link_hash_table
*globals
)
4449 if (bfd_elf_get_obj_attr_int (globals
->obfd
, OBJ_ATTR_PROC
,
4451 globals
->use_blx
= 1;
4455 bfd_elf32_arm_process_before_allocation (bfd
*abfd
,
4456 struct bfd_link_info
*link_info
)
4458 Elf_Internal_Shdr
*symtab_hdr
;
4459 Elf_Internal_Rela
*internal_relocs
= NULL
;
4460 Elf_Internal_Rela
*irel
, *irelend
;
4461 bfd_byte
*contents
= NULL
;
4464 struct elf32_arm_link_hash_table
*globals
;
4466 /* If we are only performing a partial link do not bother
4467 to construct any glue. */
4468 if (link_info
->relocatable
)
4471 /* Here we have a bfd that is to be included on the link. We have a
4472 hook to do reloc rummaging, before section sizes are nailed down. */
4473 globals
= elf32_arm_hash_table (link_info
);
4475 BFD_ASSERT (globals
!= NULL
);
4477 check_use_blx (globals
);
4479 if (globals
->byteswap_code
&& !bfd_big_endian (abfd
))
4481 _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
4486 /* PR 5398: If we have not decided to include any loadable sections in
4487 the output then we will not have a glue owner bfd. This is OK, it
4488 just means that there is nothing else for us to do here. */
4489 if (globals
->bfd_of_glue_owner
== NULL
)
4492 /* Rummage around all the relocs and map the glue vectors. */
4493 sec
= abfd
->sections
;
4498 for (; sec
!= NULL
; sec
= sec
->next
)
4500 if (sec
->reloc_count
== 0)
4503 if ((sec
->flags
& SEC_EXCLUDE
) != 0)
4506 symtab_hdr
= & elf_symtab_hdr (abfd
);
4508 /* Load the relocs. */
4510 = _bfd_elf_link_read_relocs (abfd
, sec
, NULL
, NULL
, FALSE
);
4512 if (internal_relocs
== NULL
)
4515 irelend
= internal_relocs
+ sec
->reloc_count
;
4516 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
4519 unsigned long r_index
;
4521 struct elf_link_hash_entry
*h
;
4523 r_type
= ELF32_R_TYPE (irel
->r_info
);
4524 r_index
= ELF32_R_SYM (irel
->r_info
);
4526 /* These are the only relocation types we care about. */
4527 if ( r_type
!= R_ARM_PC24
4528 && r_type
!= R_ARM_PLT32
4529 && r_type
!= R_ARM_JUMP24
4530 && r_type
!= R_ARM_THM_JUMP24
4531 && (r_type
!= R_ARM_V4BX
|| globals
->fix_v4bx
< 2))
4534 /* Get the section contents if we haven't done so already. */
4535 if (contents
== NULL
)
4537 /* Get cached copy if it exists. */
4538 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
4539 contents
= elf_section_data (sec
)->this_hdr
.contents
;
4542 /* Go get them off disk. */
4543 if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
4548 if (r_type
== R_ARM_V4BX
)
4552 reg
= bfd_get_32 (abfd
, contents
+ irel
->r_offset
) & 0xf;
4553 record_arm_bx_glue (link_info
, reg
);
4557 /* If the relocation is not against a symbol it cannot concern us. */
4560 /* We don't care about local symbols. */
4561 if (r_index
< symtab_hdr
->sh_info
)
4564 /* This is an external symbol. */
4565 r_index
-= symtab_hdr
->sh_info
;
4566 h
= (struct elf_link_hash_entry
*)
4567 elf_sym_hashes (abfd
)[r_index
];
4569 /* If the relocation is against a static symbol it must be within
4570 the current section and so cannot be a cross ARM/Thumb relocation. */
4574 /* If the call will go through a PLT entry then we do not need
4576 if (globals
->splt
!= NULL
&& h
->plt
.offset
!= (bfd_vma
) -1)
4584 /* This one is a call from arm code. We need to look up
4585 the target of the call. If it is a thumb target, we
4587 if (ELF_ST_TYPE (h
->type
) == STT_ARM_TFUNC
4588 && !(r_type
== R_ARM_CALL
&& globals
->use_blx
))
4589 record_arm_to_thumb_glue (link_info
, h
);
4592 case R_ARM_THM_JUMP24
:
4593 /* This one is a call from thumb code. We look
4594 up the target of the call. If it is not a thumb
4595 target, we insert glue. */
4596 if (ELF_ST_TYPE (h
->type
) != STT_ARM_TFUNC
4597 && !(globals
->use_blx
&& r_type
== R_ARM_THM_CALL
)
4598 && h
->root
.type
!= bfd_link_hash_undefweak
)
4599 record_thumb_to_arm_glue (link_info
, h
);
4607 if (contents
!= NULL
4608 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
4612 if (internal_relocs
!= NULL
4613 && elf_section_data (sec
)->relocs
!= internal_relocs
)
4614 free (internal_relocs
);
4615 internal_relocs
= NULL
;
4621 if (contents
!= NULL
4622 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
4624 if (internal_relocs
!= NULL
4625 && elf_section_data (sec
)->relocs
!= internal_relocs
)
4626 free (internal_relocs
);
4633 /* Initialise maps of ARM/Thumb/data for input BFDs. */
4636 bfd_elf32_arm_init_maps (bfd
*abfd
)
4638 Elf_Internal_Sym
*isymbuf
;
4639 Elf_Internal_Shdr
*hdr
;
4640 unsigned int i
, localsyms
;
4642 /* PR 7093: Make sure that we are dealing with an arm elf binary. */
4643 if (! is_arm_elf (abfd
))
4646 if ((abfd
->flags
& DYNAMIC
) != 0)
4649 hdr
= & elf_symtab_hdr (abfd
);
4650 localsyms
= hdr
->sh_info
;
4652 /* Obtain a buffer full of symbols for this BFD. The hdr->sh_info field
4653 should contain the number of local symbols, which should come before any
4654 global symbols. Mapping symbols are always local. */
4655 isymbuf
= bfd_elf_get_elf_syms (abfd
, hdr
, localsyms
, 0, NULL
, NULL
,
4658 /* No internal symbols read? Skip this BFD. */
4659 if (isymbuf
== NULL
)
4662 for (i
= 0; i
< localsyms
; i
++)
4664 Elf_Internal_Sym
*isym
= &isymbuf
[i
];
4665 asection
*sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
4669 && ELF_ST_BIND (isym
->st_info
) == STB_LOCAL
)
4671 name
= bfd_elf_string_from_elf_section (abfd
,
4672 hdr
->sh_link
, isym
->st_name
);
4674 if (bfd_is_arm_special_symbol_name (name
,
4675 BFD_ARM_SPECIAL_SYM_TYPE_MAP
))
4676 elf32_arm_section_map_add (sec
, name
[1], isym
->st_value
);
4683 bfd_elf32_arm_set_vfp11_fix (bfd
*obfd
, struct bfd_link_info
*link_info
)
4685 struct elf32_arm_link_hash_table
*globals
= elf32_arm_hash_table (link_info
);
4686 obj_attribute
*out_attr
= elf_known_obj_attributes_proc (obfd
);
4688 /* We assume that ARMv7+ does not need the VFP11 denorm erratum fix. */
4689 if (out_attr
[Tag_CPU_arch
].i
>= TAG_CPU_ARCH_V7
)
4691 switch (globals
->vfp11_fix
)
4693 case BFD_ARM_VFP11_FIX_DEFAULT
:
4694 case BFD_ARM_VFP11_FIX_NONE
:
4695 globals
->vfp11_fix
= BFD_ARM_VFP11_FIX_NONE
;
4699 /* Give a warning, but do as the user requests anyway. */
4700 (*_bfd_error_handler
) (_("%B: warning: selected VFP11 erratum "
4701 "workaround is not necessary for target architecture"), obfd
);
4704 else if (globals
->vfp11_fix
== BFD_ARM_VFP11_FIX_DEFAULT
)
4705 /* For earlier architectures, we might need the workaround, but do not
4706 enable it by default. If users is running with broken hardware, they
4707 must enable the erratum fix explicitly. */
4708 globals
->vfp11_fix
= BFD_ARM_VFP11_FIX_NONE
;
4712 enum bfd_arm_vfp11_pipe
4720 /* Return a VFP register number. This is encoded as RX:X for single-precision
4721 registers, or X:RX for double-precision registers, where RX is the group of
4722 four bits in the instruction encoding and X is the single extension bit.
4723 RX and X fields are specified using their lowest (starting) bit. The return
4726 0...31: single-precision registers s0...s31
4727 32...63: double-precision registers d0...d31.
4729 Although X should be zero for VFP11 (encoding d0...d15 only), we might
4730 encounter VFP3 instructions, so we allow the full range for DP registers. */
4733 bfd_arm_vfp11_regno (unsigned int insn
, bfd_boolean is_double
, unsigned int rx
,
4737 return (((insn
>> rx
) & 0xf) | (((insn
>> x
) & 1) << 4)) + 32;
4739 return (((insn
>> rx
) & 0xf) << 1) | ((insn
>> x
) & 1);
4742 /* Set bits in *WMASK according to a register number REG as encoded by
4743 bfd_arm_vfp11_regno(). Ignore d16-d31. */
4746 bfd_arm_vfp11_write_mask (unsigned int *wmask
, unsigned int reg
)
4751 *wmask
|= 3 << ((reg
- 32) * 2);
4754 /* Return TRUE if WMASK overwrites anything in REGS. */
4757 bfd_arm_vfp11_antidependency (unsigned int wmask
, int *regs
, int numregs
)
4761 for (i
= 0; i
< numregs
; i
++)
4763 unsigned int reg
= regs
[i
];
4765 if (reg
< 32 && (wmask
& (1 << reg
)) != 0)
4773 if ((wmask
& (3 << (reg
* 2))) != 0)
4780 /* In this function, we're interested in two things: finding input registers
4781 for VFP data-processing instructions, and finding the set of registers which
4782 arbitrary VFP instructions may write to. We use a 32-bit unsigned int to
4783 hold the written set, so FLDM etc. are easy to deal with (we're only
4784 interested in 32 SP registers or 16 dp registers, due to the VFP version
4785 implemented by the chip in question). DP registers are marked by setting
4786 both SP registers in the write mask). */
4788 static enum bfd_arm_vfp11_pipe
4789 bfd_arm_vfp11_insn_decode (unsigned int insn
, unsigned int *destmask
, int *regs
,
4792 enum bfd_arm_vfp11_pipe pipe
= VFP11_BAD
;
4793 bfd_boolean is_double
= ((insn
& 0xf00) == 0xb00) ? 1 : 0;
4795 if ((insn
& 0x0f000e10) == 0x0e000a00) /* A data-processing insn. */
4798 unsigned int fd
= bfd_arm_vfp11_regno (insn
, is_double
, 12, 22);
4799 unsigned int fm
= bfd_arm_vfp11_regno (insn
, is_double
, 0, 5);
4801 pqrs
= ((insn
& 0x00800000) >> 20)
4802 | ((insn
& 0x00300000) >> 19)
4803 | ((insn
& 0x00000040) >> 6);
4807 case 0: /* fmac[sd]. */
4808 case 1: /* fnmac[sd]. */
4809 case 2: /* fmsc[sd]. */
4810 case 3: /* fnmsc[sd]. */
4812 bfd_arm_vfp11_write_mask (destmask
, fd
);
4814 regs
[1] = bfd_arm_vfp11_regno (insn
, is_double
, 16, 7); /* Fn. */
4819 case 4: /* fmul[sd]. */
4820 case 5: /* fnmul[sd]. */
4821 case 6: /* fadd[sd]. */
4822 case 7: /* fsub[sd]. */
4826 case 8: /* fdiv[sd]. */
4829 bfd_arm_vfp11_write_mask (destmask
, fd
);
4830 regs
[0] = bfd_arm_vfp11_regno (insn
, is_double
, 16, 7); /* Fn. */
4835 case 15: /* extended opcode. */
4837 unsigned int extn
= ((insn
>> 15) & 0x1e)
4838 | ((insn
>> 7) & 1);
4842 case 0: /* fcpy[sd]. */
4843 case 1: /* fabs[sd]. */
4844 case 2: /* fneg[sd]. */
4845 case 8: /* fcmp[sd]. */
4846 case 9: /* fcmpe[sd]. */
4847 case 10: /* fcmpz[sd]. */
4848 case 11: /* fcmpez[sd]. */
4849 case 16: /* fuito[sd]. */
4850 case 17: /* fsito[sd]. */
4851 case 24: /* ftoui[sd]. */
4852 case 25: /* ftouiz[sd]. */
4853 case 26: /* ftosi[sd]. */
4854 case 27: /* ftosiz[sd]. */
4855 /* These instructions will not bounce due to underflow. */
4860 case 3: /* fsqrt[sd]. */
4861 /* fsqrt cannot underflow, but it can (perhaps) overwrite
4862 registers to cause the erratum in previous instructions. */
4863 bfd_arm_vfp11_write_mask (destmask
, fd
);
4867 case 15: /* fcvt{ds,sd}. */
4871 bfd_arm_vfp11_write_mask (destmask
, fd
);
4873 /* Only FCVTSD can underflow. */
4874 if ((insn
& 0x100) != 0)
4893 /* Two-register transfer. */
4894 else if ((insn
& 0x0fe00ed0) == 0x0c400a10)
4896 unsigned int fm
= bfd_arm_vfp11_regno (insn
, is_double
, 0, 5);
4898 if ((insn
& 0x100000) == 0)
4901 bfd_arm_vfp11_write_mask (destmask
, fm
);
4904 bfd_arm_vfp11_write_mask (destmask
, fm
);
4905 bfd_arm_vfp11_write_mask (destmask
, fm
+ 1);
4911 else if ((insn
& 0x0e100e00) == 0x0c100a00) /* A load insn. */
4913 int fd
= bfd_arm_vfp11_regno (insn
, is_double
, 12, 22);
4914 unsigned int puw
= ((insn
>> 21) & 0x1) | (((insn
>> 23) & 3) << 1);
4918 case 0: /* Two-reg transfer. We should catch these above. */
4921 case 2: /* fldm[sdx]. */
4925 unsigned int i
, offset
= insn
& 0xff;
4930 for (i
= fd
; i
< fd
+ offset
; i
++)
4931 bfd_arm_vfp11_write_mask (destmask
, i
);
4935 case 4: /* fld[sd]. */
4937 bfd_arm_vfp11_write_mask (destmask
, fd
);
4946 /* Single-register transfer. Note L==0. */
4947 else if ((insn
& 0x0f100e10) == 0x0e000a10)
4949 unsigned int opcode
= (insn
>> 21) & 7;
4950 unsigned int fn
= bfd_arm_vfp11_regno (insn
, is_double
, 16, 7);
4954 case 0: /* fmsr/fmdlr. */
4955 case 1: /* fmdhr. */
4956 /* Mark fmdhr and fmdlr as writing to the whole of the DP
4957 destination register. I don't know if this is exactly right,
4958 but it is the conservative choice. */
4959 bfd_arm_vfp11_write_mask (destmask
, fn
);
4973 static int elf32_arm_compare_mapping (const void * a
, const void * b
);
4976 /* Look for potentially-troublesome code sequences which might trigger the
4977 VFP11 denormal/antidependency erratum. See, e.g., the ARM1136 errata sheet
4978 (available from ARM) for details of the erratum. A short version is
4979 described in ld.texinfo. */
4982 bfd_elf32_arm_vfp11_erratum_scan (bfd
*abfd
, struct bfd_link_info
*link_info
)
4985 bfd_byte
*contents
= NULL
;
4987 int regs
[3], numregs
= 0;
4988 struct elf32_arm_link_hash_table
*globals
= elf32_arm_hash_table (link_info
);
4989 int use_vector
= (globals
->vfp11_fix
== BFD_ARM_VFP11_FIX_VECTOR
);
4991 /* We use a simple FSM to match troublesome VFP11 instruction sequences.
4992 The states transition as follows:
4994 0 -> 1 (vector) or 0 -> 2 (scalar)
4995 A VFP FMAC-pipeline instruction has been seen. Fill
4996 regs[0]..regs[numregs-1] with its input operands. Remember this
4997 instruction in 'first_fmac'.
5000 Any instruction, except for a VFP instruction which overwrites
5005 A VFP instruction has been seen which overwrites any of regs[*].
5006 We must make a veneer! Reset state to 0 before examining next
5010 If we fail to match anything in state 2, reset to state 0 and reset
5011 the instruction pointer to the instruction after 'first_fmac'.
5013 If the VFP11 vector mode is in use, there must be at least two unrelated
5014 instructions between anti-dependent VFP11 instructions to properly avoid
5015 triggering the erratum, hence the use of the extra state 1. */
5017 /* If we are only performing a partial link do not bother
5018 to construct any glue. */
5019 if (link_info
->relocatable
)
5022 /* Skip if this bfd does not correspond to an ELF image. */
5023 if (! is_arm_elf (abfd
))
5026 /* We should have chosen a fix type by the time we get here. */
5027 BFD_ASSERT (globals
->vfp11_fix
!= BFD_ARM_VFP11_FIX_DEFAULT
);
5029 if (globals
->vfp11_fix
== BFD_ARM_VFP11_FIX_NONE
)
5032 /* Skip this BFD if it corresponds to an executable or dynamic object. */
5033 if ((abfd
->flags
& (EXEC_P
| DYNAMIC
)) != 0)
5036 for (sec
= abfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
5038 unsigned int i
, span
, first_fmac
= 0, veneer_of_insn
= 0;
5039 struct _arm_elf_section_data
*sec_data
;
5041 /* If we don't have executable progbits, we're not interested in this
5042 section. Also skip if section is to be excluded. */
5043 if (elf_section_type (sec
) != SHT_PROGBITS
5044 || (elf_section_flags (sec
) & SHF_EXECINSTR
) == 0
5045 || (sec
->flags
& SEC_EXCLUDE
) != 0
5046 || sec
->sec_info_type
== ELF_INFO_TYPE_JUST_SYMS
5047 || sec
->output_section
== bfd_abs_section_ptr
5048 || strcmp (sec
->name
, VFP11_ERRATUM_VENEER_SECTION_NAME
) == 0)
5051 sec_data
= elf32_arm_section_data (sec
);
5053 if (sec_data
->mapcount
== 0)
5056 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
5057 contents
= elf_section_data (sec
)->this_hdr
.contents
;
5058 else if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
5061 qsort (sec_data
->map
, sec_data
->mapcount
, sizeof (elf32_arm_section_map
),
5062 elf32_arm_compare_mapping
);
5064 for (span
= 0; span
< sec_data
->mapcount
; span
++)
5066 unsigned int span_start
= sec_data
->map
[span
].vma
;
5067 unsigned int span_end
= (span
== sec_data
->mapcount
- 1)
5068 ? sec
->size
: sec_data
->map
[span
+ 1].vma
;
5069 char span_type
= sec_data
->map
[span
].type
;
5071 /* FIXME: Only ARM mode is supported at present. We may need to
5072 support Thumb-2 mode also at some point. */
5073 if (span_type
!= 'a')
5076 for (i
= span_start
; i
< span_end
;)
5078 unsigned int next_i
= i
+ 4;
5079 unsigned int insn
= bfd_big_endian (abfd
)
5080 ? (contents
[i
] << 24)
5081 | (contents
[i
+ 1] << 16)
5082 | (contents
[i
+ 2] << 8)
5084 : (contents
[i
+ 3] << 24)
5085 | (contents
[i
+ 2] << 16)
5086 | (contents
[i
+ 1] << 8)
5088 unsigned int writemask
= 0;
5089 enum bfd_arm_vfp11_pipe pipe
;
5094 pipe
= bfd_arm_vfp11_insn_decode (insn
, &writemask
, regs
,
5096 /* I'm assuming the VFP11 erratum can trigger with denorm
5097 operands on either the FMAC or the DS pipeline. This might
5098 lead to slightly overenthusiastic veneer insertion. */
5099 if (pipe
== VFP11_FMAC
|| pipe
== VFP11_DS
)
5101 state
= use_vector
? 1 : 2;
5103 veneer_of_insn
= insn
;
5109 int other_regs
[3], other_numregs
;
5110 pipe
= bfd_arm_vfp11_insn_decode (insn
, &writemask
,
5113 if (pipe
!= VFP11_BAD
5114 && bfd_arm_vfp11_antidependency (writemask
, regs
,
5124 int other_regs
[3], other_numregs
;
5125 pipe
= bfd_arm_vfp11_insn_decode (insn
, &writemask
,
5128 if (pipe
!= VFP11_BAD
5129 && bfd_arm_vfp11_antidependency (writemask
, regs
,
5135 next_i
= first_fmac
+ 4;
5141 abort (); /* Should be unreachable. */
5146 elf32_vfp11_erratum_list
*newerr
5147 = bfd_zmalloc (sizeof (elf32_vfp11_erratum_list
));
5150 errcount
= ++(elf32_arm_section_data (sec
)->erratumcount
);
5152 newerr
->u
.b
.vfp_insn
= veneer_of_insn
;
5157 newerr
->type
= VFP11_ERRATUM_BRANCH_TO_ARM_VENEER
;
5164 record_vfp11_erratum_veneer (link_info
, newerr
, abfd
, sec
,
5169 newerr
->next
= sec_data
->erratumlist
;
5170 sec_data
->erratumlist
= newerr
;
5179 if (contents
!= NULL
5180 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
5188 if (contents
!= NULL
5189 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
5195 /* Find virtual-memory addresses for VFP11 erratum veneers and return locations
5196 after sections have been laid out, using specially-named symbols. */
5199 bfd_elf32_arm_vfp11_fix_veneer_locations (bfd
*abfd
,
5200 struct bfd_link_info
*link_info
)
5203 struct elf32_arm_link_hash_table
*globals
;
5206 if (link_info
->relocatable
)
5209 /* Skip if this bfd does not correspond to an ELF image. */
5210 if (! is_arm_elf (abfd
))
5213 globals
= elf32_arm_hash_table (link_info
);
5215 tmp_name
= bfd_malloc ((bfd_size_type
) strlen
5216 (VFP11_ERRATUM_VENEER_ENTRY_NAME
) + 10);
5218 for (sec
= abfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
5220 struct _arm_elf_section_data
*sec_data
= elf32_arm_section_data (sec
);
5221 elf32_vfp11_erratum_list
*errnode
= sec_data
->erratumlist
;
5223 for (; errnode
!= NULL
; errnode
= errnode
->next
)
5225 struct elf_link_hash_entry
*myh
;
5228 switch (errnode
->type
)
5230 case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER
:
5231 case VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER
:
5232 /* Find veneer symbol. */
5233 sprintf (tmp_name
, VFP11_ERRATUM_VENEER_ENTRY_NAME
,
5234 errnode
->u
.b
.veneer
->u
.v
.id
);
5236 myh
= elf_link_hash_lookup
5237 (&(globals
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
5240 (*_bfd_error_handler
) (_("%B: unable to find VFP11 veneer "
5241 "`%s'"), abfd
, tmp_name
);
5243 vma
= myh
->root
.u
.def
.section
->output_section
->vma
5244 + myh
->root
.u
.def
.section
->output_offset
5245 + myh
->root
.u
.def
.value
;
5247 errnode
->u
.b
.veneer
->vma
= vma
;
5250 case VFP11_ERRATUM_ARM_VENEER
:
5251 case VFP11_ERRATUM_THUMB_VENEER
:
5252 /* Find return location. */
5253 sprintf (tmp_name
, VFP11_ERRATUM_VENEER_ENTRY_NAME
"_r",
5256 myh
= elf_link_hash_lookup
5257 (&(globals
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
5260 (*_bfd_error_handler
) (_("%B: unable to find VFP11 veneer "
5261 "`%s'"), abfd
, tmp_name
);
5263 vma
= myh
->root
.u
.def
.section
->output_section
->vma
5264 + myh
->root
.u
.def
.section
->output_offset
5265 + myh
->root
.u
.def
.value
;
5267 errnode
->u
.v
.branch
->vma
= vma
;
5280 /* Set target relocation values needed during linking. */
5283 bfd_elf32_arm_set_target_relocs (struct bfd
*output_bfd
,
5284 struct bfd_link_info
*link_info
,
5286 char * target2_type
,
5289 bfd_arm_vfp11_fix vfp11_fix
,
5290 int no_enum_warn
, int no_wchar_warn
,
5293 struct elf32_arm_link_hash_table
*globals
;
5295 globals
= elf32_arm_hash_table (link_info
);
5297 globals
->target1_is_rel
= target1_is_rel
;
5298 if (strcmp (target2_type
, "rel") == 0)
5299 globals
->target2_reloc
= R_ARM_REL32
;
5300 else if (strcmp (target2_type
, "abs") == 0)
5301 globals
->target2_reloc
= R_ARM_ABS32
;
5302 else if (strcmp (target2_type
, "got-rel") == 0)
5303 globals
->target2_reloc
= R_ARM_GOT_PREL
;
5306 _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
5309 globals
->fix_v4bx
= fix_v4bx
;
5310 globals
->use_blx
|= use_blx
;
5311 globals
->vfp11_fix
= vfp11_fix
;
5312 globals
->pic_veneer
= pic_veneer
;
5314 BFD_ASSERT (is_arm_elf (output_bfd
));
5315 elf_arm_tdata (output_bfd
)->no_enum_size_warning
= no_enum_warn
;
5316 elf_arm_tdata (output_bfd
)->no_wchar_size_warning
= no_wchar_warn
;
5319 /* Replace the target offset of a Thumb bl or b.w instruction. */
5322 insert_thumb_branch (bfd
*abfd
, long int offset
, bfd_byte
*insn
)
5328 BFD_ASSERT ((offset
& 1) == 0);
5330 upper
= bfd_get_16 (abfd
, insn
);
5331 lower
= bfd_get_16 (abfd
, insn
+ 2);
5332 reloc_sign
= (offset
< 0) ? 1 : 0;
5333 upper
= (upper
& ~(bfd_vma
) 0x7ff)
5334 | ((offset
>> 12) & 0x3ff)
5335 | (reloc_sign
<< 10);
5336 lower
= (lower
& ~(bfd_vma
) 0x2fff)
5337 | (((!((offset
>> 23) & 1)) ^ reloc_sign
) << 13)
5338 | (((!((offset
>> 22) & 1)) ^ reloc_sign
) << 11)
5339 | ((offset
>> 1) & 0x7ff);
5340 bfd_put_16 (abfd
, upper
, insn
);
5341 bfd_put_16 (abfd
, lower
, insn
+ 2);
5344 /* Thumb code calling an ARM function. */
5347 elf32_thumb_to_arm_stub (struct bfd_link_info
* info
,
5351 asection
* input_section
,
5352 bfd_byte
* hit_data
,
5355 bfd_signed_vma addend
,
5357 char **error_message
)
5361 long int ret_offset
;
5362 struct elf_link_hash_entry
* myh
;
5363 struct elf32_arm_link_hash_table
* globals
;
5365 myh
= find_thumb_glue (info
, name
, error_message
);
5369 globals
= elf32_arm_hash_table (info
);
5371 BFD_ASSERT (globals
!= NULL
);
5372 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
5374 my_offset
= myh
->root
.u
.def
.value
;
5376 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
5377 THUMB2ARM_GLUE_SECTION_NAME
);
5379 BFD_ASSERT (s
!= NULL
);
5380 BFD_ASSERT (s
->contents
!= NULL
);
5381 BFD_ASSERT (s
->output_section
!= NULL
);
5383 if ((my_offset
& 0x01) == 0x01)
5386 && sym_sec
->owner
!= NULL
5387 && !INTERWORK_FLAG (sym_sec
->owner
))
5389 (*_bfd_error_handler
)
5390 (_("%B(%s): warning: interworking not enabled.\n"
5391 " first occurrence: %B: thumb call to arm"),
5392 sym_sec
->owner
, input_bfd
, name
);
5398 myh
->root
.u
.def
.value
= my_offset
;
5400 put_thumb_insn (globals
, output_bfd
, (bfd_vma
) t2a1_bx_pc_insn
,
5401 s
->contents
+ my_offset
);
5403 put_thumb_insn (globals
, output_bfd
, (bfd_vma
) t2a2_noop_insn
,
5404 s
->contents
+ my_offset
+ 2);
5407 /* Address of destination of the stub. */
5408 ((bfd_signed_vma
) val
)
5410 /* Offset from the start of the current section
5411 to the start of the stubs. */
5413 /* Offset of the start of this stub from the start of the stubs. */
5415 /* Address of the start of the current section. */
5416 + s
->output_section
->vma
)
5417 /* The branch instruction is 4 bytes into the stub. */
5419 /* ARM branches work from the pc of the instruction + 8. */
5422 put_arm_insn (globals
, output_bfd
,
5423 (bfd_vma
) t2a3_b_insn
| ((ret_offset
>> 2) & 0x00FFFFFF),
5424 s
->contents
+ my_offset
+ 4);
5427 BFD_ASSERT (my_offset
<= globals
->thumb_glue_size
);
5429 /* Now go back and fix up the original BL insn to point to here. */
5431 /* Address of where the stub is located. */
5432 (s
->output_section
->vma
+ s
->output_offset
+ my_offset
)
5433 /* Address of where the BL is located. */
5434 - (input_section
->output_section
->vma
+ input_section
->output_offset
5436 /* Addend in the relocation. */
5438 /* Biassing for PC-relative addressing. */
5441 insert_thumb_branch (input_bfd
, ret_offset
, hit_data
- input_section
->vma
);
5446 /* Populate an Arm to Thumb stub. Returns the stub symbol. */
5448 static struct elf_link_hash_entry
*
5449 elf32_arm_create_thumb_stub (struct bfd_link_info
* info
,
5456 char ** error_message
)
5459 long int ret_offset
;
5460 struct elf_link_hash_entry
* myh
;
5461 struct elf32_arm_link_hash_table
* globals
;
5463 myh
= find_arm_glue (info
, name
, error_message
);
5467 globals
= elf32_arm_hash_table (info
);
5469 BFD_ASSERT (globals
!= NULL
);
5470 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
5472 my_offset
= myh
->root
.u
.def
.value
;
5474 if ((my_offset
& 0x01) == 0x01)
5477 && sym_sec
->owner
!= NULL
5478 && !INTERWORK_FLAG (sym_sec
->owner
))
5480 (*_bfd_error_handler
)
5481 (_("%B(%s): warning: interworking not enabled.\n"
5482 " first occurrence: %B: arm call to thumb"),
5483 sym_sec
->owner
, input_bfd
, name
);
5487 myh
->root
.u
.def
.value
= my_offset
;
5489 if (info
->shared
|| globals
->root
.is_relocatable_executable
5490 || globals
->pic_veneer
)
5492 /* For relocatable objects we can't use absolute addresses,
5493 so construct the address from a relative offset. */
5494 /* TODO: If the offset is small it's probably worth
5495 constructing the address with adds. */
5496 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t1p_ldr_insn
,
5497 s
->contents
+ my_offset
);
5498 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t2p_add_pc_insn
,
5499 s
->contents
+ my_offset
+ 4);
5500 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t3p_bx_r12_insn
,
5501 s
->contents
+ my_offset
+ 8);
5502 /* Adjust the offset by 4 for the position of the add,
5503 and 8 for the pipeline offset. */
5504 ret_offset
= (val
- (s
->output_offset
5505 + s
->output_section
->vma
5508 bfd_put_32 (output_bfd
, ret_offset
,
5509 s
->contents
+ my_offset
+ 12);
5511 else if (globals
->use_blx
)
5513 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t1v5_ldr_insn
,
5514 s
->contents
+ my_offset
);
5516 /* It's a thumb address. Add the low order bit. */
5517 bfd_put_32 (output_bfd
, val
| a2t2v5_func_addr_insn
,
5518 s
->contents
+ my_offset
+ 4);
5522 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t1_ldr_insn
,
5523 s
->contents
+ my_offset
);
5525 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t2_bx_r12_insn
,
5526 s
->contents
+ my_offset
+ 4);
5528 /* It's a thumb address. Add the low order bit. */
5529 bfd_put_32 (output_bfd
, val
| a2t3_func_addr_insn
,
5530 s
->contents
+ my_offset
+ 8);
5536 BFD_ASSERT (my_offset
<= globals
->arm_glue_size
);
5541 /* Arm code calling a Thumb function. */
5544 elf32_arm_to_thumb_stub (struct bfd_link_info
* info
,
5548 asection
* input_section
,
5549 bfd_byte
* hit_data
,
5552 bfd_signed_vma addend
,
5554 char **error_message
)
5556 unsigned long int tmp
;
5559 long int ret_offset
;
5560 struct elf_link_hash_entry
* myh
;
5561 struct elf32_arm_link_hash_table
* globals
;
5563 globals
= elf32_arm_hash_table (info
);
5565 BFD_ASSERT (globals
!= NULL
);
5566 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
5568 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
5569 ARM2THUMB_GLUE_SECTION_NAME
);
5570 BFD_ASSERT (s
!= NULL
);
5571 BFD_ASSERT (s
->contents
!= NULL
);
5572 BFD_ASSERT (s
->output_section
!= NULL
);
5574 myh
= elf32_arm_create_thumb_stub (info
, name
, input_bfd
, output_bfd
,
5575 sym_sec
, val
, s
, error_message
);
5579 my_offset
= myh
->root
.u
.def
.value
;
5580 tmp
= bfd_get_32 (input_bfd
, hit_data
);
5581 tmp
= tmp
& 0xFF000000;
5583 /* Somehow these are both 4 too far, so subtract 8. */
5584 ret_offset
= (s
->output_offset
5586 + s
->output_section
->vma
5587 - (input_section
->output_offset
5588 + input_section
->output_section
->vma
5592 tmp
= tmp
| ((ret_offset
>> 2) & 0x00FFFFFF);
5594 bfd_put_32 (output_bfd
, (bfd_vma
) tmp
, hit_data
- input_section
->vma
);
5599 /* Populate Arm stub for an exported Thumb function. */
5602 elf32_arm_to_thumb_export_stub (struct elf_link_hash_entry
*h
, void * inf
)
5604 struct bfd_link_info
* info
= (struct bfd_link_info
*) inf
;
5606 struct elf_link_hash_entry
* myh
;
5607 struct elf32_arm_link_hash_entry
*eh
;
5608 struct elf32_arm_link_hash_table
* globals
;
5611 char *error_message
;
5613 eh
= elf32_arm_hash_entry (h
);
5614 /* Allocate stubs for exported Thumb functions on v4t. */
5615 if (eh
->export_glue
== NULL
)
5618 globals
= elf32_arm_hash_table (info
);
5620 BFD_ASSERT (globals
!= NULL
);
5621 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
5623 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
5624 ARM2THUMB_GLUE_SECTION_NAME
);
5625 BFD_ASSERT (s
!= NULL
);
5626 BFD_ASSERT (s
->contents
!= NULL
);
5627 BFD_ASSERT (s
->output_section
!= NULL
);
5629 sec
= eh
->export_glue
->root
.u
.def
.section
;
5631 BFD_ASSERT (sec
->output_section
!= NULL
);
5633 val
= eh
->export_glue
->root
.u
.def
.value
+ sec
->output_offset
5634 + sec
->output_section
->vma
;
5636 myh
= elf32_arm_create_thumb_stub (info
, h
->root
.root
.string
,
5637 h
->root
.u
.def
.section
->owner
,
5638 globals
->obfd
, sec
, val
, s
,
5644 /* Populate ARMv4 BX veneers. Returns the absolute adress of the veneer. */
5647 elf32_arm_bx_glue (struct bfd_link_info
* info
, int reg
)
5652 struct elf32_arm_link_hash_table
*globals
;
5654 globals
= elf32_arm_hash_table (info
);
5656 BFD_ASSERT (globals
!= NULL
);
5657 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
5659 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
5660 ARM_BX_GLUE_SECTION_NAME
);
5661 BFD_ASSERT (s
!= NULL
);
5662 BFD_ASSERT (s
->contents
!= NULL
);
5663 BFD_ASSERT (s
->output_section
!= NULL
);
5665 BFD_ASSERT (globals
->bx_glue_offset
[reg
] & 2);
5667 glue_addr
= globals
->bx_glue_offset
[reg
] & ~(bfd_vma
)3;
5669 if ((globals
->bx_glue_offset
[reg
] & 1) == 0)
5671 p
= s
->contents
+ glue_addr
;
5672 bfd_put_32 (globals
->obfd
, armbx1_tst_insn
+ (reg
<< 16), p
);
5673 bfd_put_32 (globals
->obfd
, armbx2_moveq_insn
+ reg
, p
+ 4);
5674 bfd_put_32 (globals
->obfd
, armbx3_bx_insn
+ reg
, p
+ 8);
5675 globals
->bx_glue_offset
[reg
] |= 1;
5678 return glue_addr
+ s
->output_section
->vma
+ s
->output_offset
;
5681 /* Generate Arm stubs for exported Thumb symbols. */
5683 elf32_arm_begin_write_processing (bfd
*abfd ATTRIBUTE_UNUSED
,
5684 struct bfd_link_info
*link_info
)
5686 struct elf32_arm_link_hash_table
* globals
;
5688 if (link_info
== NULL
)
5689 /* Ignore this if we are not called by the ELF backend linker. */
5692 globals
= elf32_arm_hash_table (link_info
);
5693 /* If blx is available then exported Thumb symbols are OK and there is
5695 if (globals
->use_blx
)
5698 elf_link_hash_traverse (&globals
->root
, elf32_arm_to_thumb_export_stub
,
5702 /* Some relocations map to different relocations depending on the
5703 target. Return the real relocation. */
5706 arm_real_reloc_type (struct elf32_arm_link_hash_table
* globals
,
5712 if (globals
->target1_is_rel
)
5718 return globals
->target2_reloc
;
5725 /* Return the base VMA address which should be subtracted from real addresses
5726 when resolving @dtpoff relocation.
5727 This is PT_TLS segment p_vaddr. */
5730 dtpoff_base (struct bfd_link_info
*info
)
5732 /* If tls_sec is NULL, we should have signalled an error already. */
5733 if (elf_hash_table (info
)->tls_sec
== NULL
)
5735 return elf_hash_table (info
)->tls_sec
->vma
;
5738 /* Return the relocation value for @tpoff relocation
5739 if STT_TLS virtual address is ADDRESS. */
5742 tpoff (struct bfd_link_info
*info
, bfd_vma address
)
5744 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
5747 /* If tls_sec is NULL, we should have signalled an error already. */
5748 if (htab
->tls_sec
== NULL
)
5750 base
= align_power ((bfd_vma
) TCB_SIZE
, htab
->tls_sec
->alignment_power
);
5751 return address
- htab
->tls_sec
->vma
+ base
;
5754 /* Perform an R_ARM_ABS12 relocation on the field pointed to by DATA.
5755 VALUE is the relocation value. */
5757 static bfd_reloc_status_type
5758 elf32_arm_abs12_reloc (bfd
*abfd
, void *data
, bfd_vma value
)
5761 return bfd_reloc_overflow
;
5763 value
|= bfd_get_32 (abfd
, data
) & 0xfffff000;
5764 bfd_put_32 (abfd
, value
, data
);
5765 return bfd_reloc_ok
;
5768 /* For a given value of n, calculate the value of G_n as required to
5769 deal with group relocations. We return it in the form of an
5770 encoded constant-and-rotation, together with the final residual. If n is
5771 specified as less than zero, then final_residual is filled with the
5772 input value and no further action is performed. */
5775 calculate_group_reloc_mask (bfd_vma value
, int n
, bfd_vma
*final_residual
)
5779 bfd_vma encoded_g_n
= 0;
5780 bfd_vma residual
= value
; /* Also known as Y_n. */
5782 for (current_n
= 0; current_n
<= n
; current_n
++)
5786 /* Calculate which part of the value to mask. */
5793 /* Determine the most significant bit in the residual and
5794 align the resulting value to a 2-bit boundary. */
5795 for (msb
= 30; msb
>= 0; msb
-= 2)
5796 if (residual
& (3 << msb
))
5799 /* The desired shift is now (msb - 6), or zero, whichever
5806 /* Calculate g_n in 32-bit as well as encoded constant+rotation form. */
5807 g_n
= residual
& (0xff << shift
);
5808 encoded_g_n
= (g_n
>> shift
)
5809 | ((g_n
<= 0xff ? 0 : (32 - shift
) / 2) << 8);
5811 /* Calculate the residual for the next time around. */
5815 *final_residual
= residual
;
5820 /* Given an ARM instruction, determine whether it is an ADD or a SUB.
5821 Returns 1 if it is an ADD, -1 if it is a SUB, and 0 otherwise. */
5824 identify_add_or_sub (bfd_vma insn
)
5826 int opcode
= insn
& 0x1e00000;
5828 if (opcode
== 1 << 23) /* ADD */
5831 if (opcode
== 1 << 22) /* SUB */
5837 /* Perform a relocation as part of a final link. */
5839 static bfd_reloc_status_type
5840 elf32_arm_final_link_relocate (reloc_howto_type
* howto
,
5843 asection
* input_section
,
5844 bfd_byte
* contents
,
5845 Elf_Internal_Rela
* rel
,
5847 struct bfd_link_info
* info
,
5849 const char * sym_name
,
5851 struct elf_link_hash_entry
* h
,
5852 bfd_boolean
* unresolved_reloc_p
,
5853 char ** error_message
)
5855 unsigned long r_type
= howto
->type
;
5856 unsigned long r_symndx
;
5857 bfd_byte
* hit_data
= contents
+ rel
->r_offset
;
5858 bfd
* dynobj
= NULL
;
5859 Elf_Internal_Shdr
* symtab_hdr
;
5860 struct elf_link_hash_entry
** sym_hashes
;
5861 bfd_vma
* local_got_offsets
;
5862 asection
* sgot
= NULL
;
5863 asection
* splt
= NULL
;
5864 asection
* sreloc
= NULL
;
5866 bfd_signed_vma signed_addend
;
5867 struct elf32_arm_link_hash_table
* globals
;
5869 globals
= elf32_arm_hash_table (info
);
5871 BFD_ASSERT (is_arm_elf (input_bfd
));
5873 /* Some relocation types map to different relocations depending on the
5874 target. We pick the right one here. */
5875 r_type
= arm_real_reloc_type (globals
, r_type
);
5876 if (r_type
!= howto
->type
)
5877 howto
= elf32_arm_howto_from_type (r_type
);
5879 /* If the start address has been set, then set the EF_ARM_HASENTRY
5880 flag. Setting this more than once is redundant, but the cost is
5881 not too high, and it keeps the code simple.
5883 The test is done here, rather than somewhere else, because the
5884 start address is only set just before the final link commences.
5886 Note - if the user deliberately sets a start address of 0, the
5887 flag will not be set. */
5888 if (bfd_get_start_address (output_bfd
) != 0)
5889 elf_elfheader (output_bfd
)->e_flags
|= EF_ARM_HASENTRY
;
5891 dynobj
= elf_hash_table (info
)->dynobj
;
5894 sgot
= bfd_get_section_by_name (dynobj
, ".got");
5895 splt
= bfd_get_section_by_name (dynobj
, ".plt");
5897 symtab_hdr
= & elf_symtab_hdr (input_bfd
);
5898 sym_hashes
= elf_sym_hashes (input_bfd
);
5899 local_got_offsets
= elf_local_got_offsets (input_bfd
);
5900 r_symndx
= ELF32_R_SYM (rel
->r_info
);
5902 if (globals
->use_rel
)
5904 addend
= bfd_get_32 (input_bfd
, hit_data
) & howto
->src_mask
;
5906 if (addend
& ((howto
->src_mask
+ 1) >> 1))
5909 signed_addend
&= ~ howto
->src_mask
;
5910 signed_addend
|= addend
;
5913 signed_addend
= addend
;
5916 addend
= signed_addend
= rel
->r_addend
;
5921 /* We don't need to find a value for this symbol. It's just a
5923 *unresolved_reloc_p
= FALSE
;
5924 return bfd_reloc_ok
;
5927 if (!globals
->vxworks_p
)
5928 return elf32_arm_abs12_reloc (input_bfd
, hit_data
, value
+ addend
);
5932 case R_ARM_ABS32_NOI
:
5934 case R_ARM_REL32_NOI
:
5940 /* Handle relocations which should use the PLT entry. ABS32/REL32
5941 will use the symbol's value, which may point to a PLT entry, but we
5942 don't need to handle that here. If we created a PLT entry, all
5943 branches in this object should go to it. */
5944 if ((r_type
!= R_ARM_ABS32
&& r_type
!= R_ARM_REL32
5945 && r_type
!= R_ARM_ABS32_NOI
&& r_type
!= R_ARM_REL32_NOI
)
5948 && h
->plt
.offset
!= (bfd_vma
) -1)
5950 /* If we've created a .plt section, and assigned a PLT entry to
5951 this function, it should not be known to bind locally. If
5952 it were, we would have cleared the PLT entry. */
5953 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info
, h
));
5955 value
= (splt
->output_section
->vma
5956 + splt
->output_offset
5958 *unresolved_reloc_p
= FALSE
;
5959 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
5960 contents
, rel
->r_offset
, value
,
5964 /* When generating a shared object or relocatable executable, these
5965 relocations are copied into the output file to be resolved at
5967 if ((info
->shared
|| globals
->root
.is_relocatable_executable
)
5968 && (input_section
->flags
& SEC_ALLOC
)
5969 && !(elf32_arm_hash_table (info
)->vxworks_p
5970 && strcmp (input_section
->output_section
->name
,
5972 && ((r_type
!= R_ARM_REL32
&& r_type
!= R_ARM_REL32_NOI
)
5973 || !SYMBOL_CALLS_LOCAL (info
, h
))
5975 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
5976 || h
->root
.type
!= bfd_link_hash_undefweak
)
5977 && r_type
!= R_ARM_PC24
5978 && r_type
!= R_ARM_CALL
5979 && r_type
!= R_ARM_JUMP24
5980 && r_type
!= R_ARM_PREL31
5981 && r_type
!= R_ARM_PLT32
)
5983 Elf_Internal_Rela outrel
;
5985 bfd_boolean skip
, relocate
;
5987 *unresolved_reloc_p
= FALSE
;
5991 sreloc
= _bfd_elf_get_dynamic_reloc_section (input_bfd
, input_section
,
5992 ! globals
->use_rel
);
5995 return bfd_reloc_notsupported
;
6001 outrel
.r_addend
= addend
;
6003 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
6005 if (outrel
.r_offset
== (bfd_vma
) -1)
6007 else if (outrel
.r_offset
== (bfd_vma
) -2)
6008 skip
= TRUE
, relocate
= TRUE
;
6009 outrel
.r_offset
+= (input_section
->output_section
->vma
6010 + input_section
->output_offset
);
6013 memset (&outrel
, 0, sizeof outrel
);
6018 || !h
->def_regular
))
6019 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
6024 /* This symbol is local, or marked to become local. */
6025 if (sym_flags
== STT_ARM_TFUNC
)
6027 if (globals
->symbian_p
)
6031 /* On Symbian OS, the data segment and text segement
6032 can be relocated independently. Therefore, we
6033 must indicate the segment to which this
6034 relocation is relative. The BPABI allows us to
6035 use any symbol in the right segment; we just use
6036 the section symbol as it is convenient. (We
6037 cannot use the symbol given by "h" directly as it
6038 will not appear in the dynamic symbol table.)
6040 Note that the dynamic linker ignores the section
6041 symbol value, so we don't subtract osec->vma
6042 from the emitted reloc addend. */
6044 osec
= sym_sec
->output_section
;
6046 osec
= input_section
->output_section
;
6047 symbol
= elf_section_data (osec
)->dynindx
;
6050 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
6052 if ((osec
->flags
& SEC_READONLY
) == 0
6053 && htab
->data_index_section
!= NULL
)
6054 osec
= htab
->data_index_section
;
6056 osec
= htab
->text_index_section
;
6057 symbol
= elf_section_data (osec
)->dynindx
;
6059 BFD_ASSERT (symbol
!= 0);
6062 /* On SVR4-ish systems, the dynamic loader cannot
6063 relocate the text and data segments independently,
6064 so the symbol does not matter. */
6066 outrel
.r_info
= ELF32_R_INFO (symbol
, R_ARM_RELATIVE
);
6067 if (globals
->use_rel
)
6070 outrel
.r_addend
+= value
;
6073 loc
= sreloc
->contents
;
6074 loc
+= sreloc
->reloc_count
++ * RELOC_SIZE (globals
);
6075 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
6077 /* If this reloc is against an external symbol, we do not want to
6078 fiddle with the addend. Otherwise, we need to include the symbol
6079 value so that it becomes an addend for the dynamic reloc. */
6081 return bfd_reloc_ok
;
6083 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
6084 contents
, rel
->r_offset
, value
,
6087 else switch (r_type
)
6090 return elf32_arm_abs12_reloc (input_bfd
, hit_data
, value
+ addend
);
6092 case R_ARM_XPC25
: /* Arm BLX instruction. */
6095 case R_ARM_PC24
: /* Arm B/BL instruction. */
6099 bfd_signed_vma branch_offset
;
6100 struct elf32_arm_stub_hash_entry
*stub_entry
= NULL
;
6102 from
= (input_section
->output_section
->vma
6103 + input_section
->output_offset
6105 branch_offset
= (bfd_signed_vma
)(value
- from
);
6107 if (r_type
== R_ARM_XPC25
)
6109 /* Check for Arm calling Arm function. */
6110 /* FIXME: Should we translate the instruction into a BL
6111 instruction instead ? */
6112 if (sym_flags
!= STT_ARM_TFUNC
)
6113 (*_bfd_error_handler
)
6114 (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
6116 h
? h
->root
.root
.string
: "(local)");
6118 else if (r_type
!= R_ARM_CALL
)
6120 /* Check for Arm calling Thumb function. */
6121 if (sym_flags
== STT_ARM_TFUNC
)
6123 if (elf32_arm_to_thumb_stub (info
, sym_name
, input_bfd
,
6124 output_bfd
, input_section
,
6125 hit_data
, sym_sec
, rel
->r_offset
,
6126 signed_addend
, value
,
6128 return bfd_reloc_ok
;
6130 return bfd_reloc_dangerous
;
6134 /* Check if a stub has to be inserted because the
6135 destination is too far or we are changing mode. */
6136 if (r_type
== R_ARM_CALL
)
6138 if (branch_offset
> ARM_MAX_FWD_BRANCH_OFFSET
6139 || branch_offset
< ARM_MAX_BWD_BRANCH_OFFSET
6140 || sym_flags
== STT_ARM_TFUNC
)
6142 /* The target is out of reach, so redirect the
6143 branch to the local stub for this function. */
6145 stub_entry
= elf32_arm_get_stub_entry (input_section
,
6148 if (stub_entry
!= NULL
)
6149 value
= (stub_entry
->stub_offset
6150 + stub_entry
->stub_sec
->output_offset
6151 + stub_entry
->stub_sec
->output_section
->vma
);
6155 /* The ARM ELF ABI says that this reloc is computed as: S - P + A
6157 S is the address of the symbol in the relocation.
6158 P is address of the instruction being relocated.
6159 A is the addend (extracted from the instruction) in bytes.
6161 S is held in 'value'.
6162 P is the base address of the section containing the
6163 instruction plus the offset of the reloc into that
6165 (input_section->output_section->vma +
6166 input_section->output_offset +
6168 A is the addend, converted into bytes, ie:
6171 Note: None of these operations have knowledge of the pipeline
6172 size of the processor, thus it is up to the assembler to
6173 encode this information into the addend. */
6174 value
-= (input_section
->output_section
->vma
6175 + input_section
->output_offset
);
6176 value
-= rel
->r_offset
;
6177 if (globals
->use_rel
)
6178 value
+= (signed_addend
<< howto
->size
);
6180 /* RELA addends do not have to be adjusted by howto->size. */
6181 value
+= signed_addend
;
6183 signed_addend
= value
;
6184 signed_addend
>>= howto
->rightshift
;
6186 /* A branch to an undefined weak symbol is turned into a jump to
6187 the next instruction. */
6188 if (h
&& h
->root
.type
== bfd_link_hash_undefweak
)
6190 value
= (bfd_get_32 (input_bfd
, hit_data
) & 0xf0000000)
6195 /* Perform a signed range check. */
6196 if ( signed_addend
> ((bfd_signed_vma
) (howto
->dst_mask
>> 1))
6197 || signed_addend
< - ((bfd_signed_vma
) ((howto
->dst_mask
+ 1) >> 1)))
6198 return bfd_reloc_overflow
;
6200 addend
= (value
& 2);
6202 value
= (signed_addend
& howto
->dst_mask
)
6203 | (bfd_get_32 (input_bfd
, hit_data
) & (~ howto
->dst_mask
));
6205 /* Set the H bit in the BLX instruction. */
6206 if (sym_flags
== STT_ARM_TFUNC
)
6211 value
&= ~(bfd_vma
)(1 << 24);
6213 if (r_type
== R_ARM_CALL
)
6215 /* Select the correct instruction (BL or BLX). */
6216 /* Only if we are not handling a BL to a stub. In this
6217 case, mode switching is performed by the stub. */
6218 if (sym_flags
== STT_ARM_TFUNC
&& !stub_entry
)
6222 value
&= ~(bfd_vma
)(1 << 28);
6232 if (sym_flags
== STT_ARM_TFUNC
)
6236 case R_ARM_ABS32_NOI
:
6242 if (sym_flags
== STT_ARM_TFUNC
)
6244 value
-= (input_section
->output_section
->vma
6245 + input_section
->output_offset
+ rel
->r_offset
);
6248 case R_ARM_REL32_NOI
:
6250 value
-= (input_section
->output_section
->vma
6251 + input_section
->output_offset
+ rel
->r_offset
);
6255 value
-= (input_section
->output_section
->vma
6256 + input_section
->output_offset
+ rel
->r_offset
);
6257 value
+= signed_addend
;
6258 if (! h
|| h
->root
.type
!= bfd_link_hash_undefweak
)
6260 /* Check for overflow. */
6261 if ((value
^ (value
>> 1)) & (1 << 30))
6262 return bfd_reloc_overflow
;
6264 value
&= 0x7fffffff;
6265 value
|= (bfd_get_32 (input_bfd
, hit_data
) & 0x80000000);
6266 if (sym_flags
== STT_ARM_TFUNC
)
6271 bfd_put_32 (input_bfd
, value
, hit_data
);
6272 return bfd_reloc_ok
;
6276 if ((long) value
> 0x7f || (long) value
< -0x80)
6277 return bfd_reloc_overflow
;
6279 bfd_put_8 (input_bfd
, value
, hit_data
);
6280 return bfd_reloc_ok
;
6285 if ((long) value
> 0x7fff || (long) value
< -0x8000)
6286 return bfd_reloc_overflow
;
6288 bfd_put_16 (input_bfd
, value
, hit_data
);
6289 return bfd_reloc_ok
;
6291 case R_ARM_THM_ABS5
:
6292 /* Support ldr and str instructions for the thumb. */
6293 if (globals
->use_rel
)
6295 /* Need to refetch addend. */
6296 addend
= bfd_get_16 (input_bfd
, hit_data
) & howto
->src_mask
;
6297 /* ??? Need to determine shift amount from operand size. */
6298 addend
>>= howto
->rightshift
;
6302 /* ??? Isn't value unsigned? */
6303 if ((long) value
> 0x1f || (long) value
< -0x10)
6304 return bfd_reloc_overflow
;
6306 /* ??? Value needs to be properly shifted into place first. */
6307 value
|= bfd_get_16 (input_bfd
, hit_data
) & 0xf83f;
6308 bfd_put_16 (input_bfd
, value
, hit_data
);
6309 return bfd_reloc_ok
;
6311 case R_ARM_THM_ALU_PREL_11_0
:
6312 /* Corresponds to: addw.w reg, pc, #offset (and similarly for subw). */
6315 bfd_signed_vma relocation
;
6317 insn
= (bfd_get_16 (input_bfd
, hit_data
) << 16)
6318 | bfd_get_16 (input_bfd
, hit_data
+ 2);
6320 if (globals
->use_rel
)
6322 signed_addend
= (insn
& 0xff) | ((insn
& 0x7000) >> 4)
6323 | ((insn
& (1 << 26)) >> 15);
6324 if (insn
& 0xf00000)
6325 signed_addend
= -signed_addend
;
6328 relocation
= value
+ signed_addend
;
6329 relocation
-= (input_section
->output_section
->vma
6330 + input_section
->output_offset
6333 value
= abs (relocation
);
6335 if (value
>= 0x1000)
6336 return bfd_reloc_overflow
;
6338 insn
= (insn
& 0xfb0f8f00) | (value
& 0xff)
6339 | ((value
& 0x700) << 4)
6340 | ((value
& 0x800) << 15);
6344 bfd_put_16 (input_bfd
, insn
>> 16, hit_data
);
6345 bfd_put_16 (input_bfd
, insn
& 0xffff, hit_data
+ 2);
6347 return bfd_reloc_ok
;
6350 case R_ARM_THM_PC12
:
6351 /* Corresponds to: ldr.w reg, [pc, #offset]. */
6354 bfd_signed_vma relocation
;
6356 insn
= (bfd_get_16 (input_bfd
, hit_data
) << 16)
6357 | bfd_get_16 (input_bfd
, hit_data
+ 2);
6359 if (globals
->use_rel
)
6361 signed_addend
= insn
& 0xfff;
6362 if (!(insn
& (1 << 23)))
6363 signed_addend
= -signed_addend
;
6366 relocation
= value
+ signed_addend
;
6367 relocation
-= (input_section
->output_section
->vma
6368 + input_section
->output_offset
6371 value
= abs (relocation
);
6373 if (value
>= 0x1000)
6374 return bfd_reloc_overflow
;
6376 insn
= (insn
& 0xff7ff000) | value
;
6377 if (relocation
>= 0)
6380 bfd_put_16 (input_bfd
, insn
>> 16, hit_data
);
6381 bfd_put_16 (input_bfd
, insn
& 0xffff, hit_data
+ 2);
6383 return bfd_reloc_ok
;
6386 case R_ARM_THM_XPC22
:
6387 case R_ARM_THM_CALL
:
6388 case R_ARM_THM_JUMP24
:
6389 /* Thumb BL (branch long instruction). */
6393 bfd_boolean overflow
= FALSE
;
6394 bfd_vma upper_insn
= bfd_get_16 (input_bfd
, hit_data
);
6395 bfd_vma lower_insn
= bfd_get_16 (input_bfd
, hit_data
+ 2);
6396 bfd_signed_vma reloc_signed_max
;
6397 bfd_signed_vma reloc_signed_min
;
6399 bfd_signed_vma signed_check
;
6401 int thumb2
= using_thumb2 (globals
);
6403 /* A branch to an undefined weak symbol is turned into a jump to
6404 the next instruction unless a PLT entry will be created. */
6405 if (h
&& h
->root
.type
== bfd_link_hash_undefweak
6406 && !(splt
!= NULL
&& h
->plt
.offset
!= (bfd_vma
) -1))
6408 bfd_put_16 (input_bfd
, 0xe000, hit_data
);
6409 bfd_put_16 (input_bfd
, 0xbf00, hit_data
+ 2);
6410 return bfd_reloc_ok
;
6413 /* Fetch the addend. We use the Thumb-2 encoding (backwards compatible
6414 with Thumb-1) involving the J1 and J2 bits. */
6415 if (globals
->use_rel
)
6417 bfd_vma s
= (upper_insn
& (1 << 10)) >> 10;
6418 bfd_vma upper
= upper_insn
& 0x3ff;
6419 bfd_vma lower
= lower_insn
& 0x7ff;
6420 bfd_vma j1
= (lower_insn
& (1 << 13)) >> 13;
6421 bfd_vma j2
= (lower_insn
& (1 << 11)) >> 11;
6422 bfd_vma i1
= j1
^ s
? 0 : 1;
6423 bfd_vma i2
= j2
^ s
? 0 : 1;
6425 addend
= (i1
<< 23) | (i2
<< 22) | (upper
<< 12) | (lower
<< 1);
6427 addend
= (addend
| ((s
? 0 : 1) << 24)) - (1 << 24);
6429 signed_addend
= addend
;
6432 if (r_type
== R_ARM_THM_XPC22
)
6434 /* Check for Thumb to Thumb call. */
6435 /* FIXME: Should we translate the instruction into a BL
6436 instruction instead ? */
6437 if (sym_flags
== STT_ARM_TFUNC
)
6438 (*_bfd_error_handler
)
6439 (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
6441 h
? h
->root
.root
.string
: "(local)");
6445 /* If it is not a call to Thumb, assume call to Arm.
6446 If it is a call relative to a section name, then it is not a
6447 function call at all, but rather a long jump. Calls through
6448 the PLT do not require stubs. */
6449 if (sym_flags
!= STT_ARM_TFUNC
&& sym_flags
!= STT_SECTION
6450 && (h
== NULL
|| splt
== NULL
6451 || h
->plt
.offset
== (bfd_vma
) -1))
6453 if (globals
->use_blx
&& r_type
== R_ARM_THM_CALL
)
6455 /* Convert BL to BLX. */
6456 lower_insn
= (lower_insn
& ~0x1000) | 0x0800;
6458 else if (r_type
!= R_ARM_THM_CALL
)
6460 if (elf32_thumb_to_arm_stub
6461 (info
, sym_name
, input_bfd
, output_bfd
, input_section
,
6462 hit_data
, sym_sec
, rel
->r_offset
, signed_addend
, value
,
6464 return bfd_reloc_ok
;
6466 return bfd_reloc_dangerous
;
6469 else if (sym_flags
== STT_ARM_TFUNC
&& globals
->use_blx
6470 && r_type
== R_ARM_THM_CALL
)
6472 /* Make sure this is a BL. */
6473 lower_insn
|= 0x1800;
6477 /* Handle calls via the PLT. */
6478 if (h
!= NULL
&& splt
!= NULL
&& h
->plt
.offset
!= (bfd_vma
) -1)
6480 value
= (splt
->output_section
->vma
6481 + splt
->output_offset
6483 if (globals
->use_blx
&& r_type
== R_ARM_THM_CALL
)
6485 /* If the Thumb BLX instruction is available, convert the
6486 BL to a BLX instruction to call the ARM-mode PLT entry. */
6487 lower_insn
= (lower_insn
& ~0x1000) | 0x0800;
6490 /* Target the Thumb stub before the ARM PLT entry. */
6491 value
-= PLT_THUMB_STUB_SIZE
;
6492 *unresolved_reloc_p
= FALSE
;
6495 if (r_type
== R_ARM_THM_CALL
)
6497 /* Check if a stub has to be inserted because the destination
6500 bfd_signed_vma branch_offset
;
6501 struct elf32_arm_stub_hash_entry
*stub_entry
= NULL
;
6503 from
= (input_section
->output_section
->vma
6504 + input_section
->output_offset
6506 branch_offset
= (bfd_signed_vma
)(value
- from
);
6509 && (branch_offset
> THM_MAX_FWD_BRANCH_OFFSET
6510 || (branch_offset
< THM_MAX_BWD_BRANCH_OFFSET
)))
6513 && (branch_offset
> THM2_MAX_FWD_BRANCH_OFFSET
6514 || (branch_offset
< THM2_MAX_BWD_BRANCH_OFFSET
)))
6515 || ((sym_flags
!= STT_ARM_TFUNC
) && !globals
->use_blx
))
6517 /* The target is out of reach or we are changing modes, so
6518 redirect the branch to the local stub for this
6520 stub_entry
= elf32_arm_get_stub_entry (input_section
,
6523 if (stub_entry
!= NULL
)
6524 value
= (stub_entry
->stub_offset
6525 + stub_entry
->stub_sec
->output_offset
6526 + stub_entry
->stub_sec
->output_section
->vma
);
6528 /* If this call becomes a call to Arm, force BLX. */
6529 if (globals
->use_blx
)
6532 && !arm_stub_is_thumb (stub_entry
->stub_type
))
6533 || (sym_flags
!= STT_ARM_TFUNC
))
6534 lower_insn
= (lower_insn
& ~0x1000) | 0x0800;
6539 relocation
= value
+ signed_addend
;
6541 relocation
-= (input_section
->output_section
->vma
6542 + input_section
->output_offset
6545 check
= relocation
>> howto
->rightshift
;
6547 /* If this is a signed value, the rightshift just dropped
6548 leading 1 bits (assuming twos complement). */
6549 if ((bfd_signed_vma
) relocation
>= 0)
6550 signed_check
= check
;
6552 signed_check
= check
| ~((bfd_vma
) -1 >> howto
->rightshift
);
6554 /* Calculate the permissable maximum and minimum values for
6555 this relocation according to whether we're relocating for
6557 bitsize
= howto
->bitsize
;
6560 reloc_signed_max
= ((1 << (bitsize
- 1)) - 1) >> howto
->rightshift
;
6561 reloc_signed_min
= ~reloc_signed_max
;
6563 /* Assumes two's complement. */
6564 if (signed_check
> reloc_signed_max
|| signed_check
< reloc_signed_min
)
6567 if ((lower_insn
& 0x5000) == 0x4000)
6568 /* For a BLX instruction, make sure that the relocation is rounded up
6569 to a word boundary. This follows the semantics of the instruction
6570 which specifies that bit 1 of the target address will come from bit
6571 1 of the base address. */
6572 relocation
= (relocation
+ 2) & ~ 3;
6574 /* Put RELOCATION back into the insn. Assumes two's complement.
6575 We use the Thumb-2 encoding, which is safe even if dealing with
6576 a Thumb-1 instruction by virtue of our overflow check above. */
6577 reloc_sign
= (signed_check
< 0) ? 1 : 0;
6578 upper_insn
= (upper_insn
& ~(bfd_vma
) 0x7ff)
6579 | ((relocation
>> 12) & 0x3ff)
6580 | (reloc_sign
<< 10);
6581 lower_insn
= (lower_insn
& ~(bfd_vma
) 0x2fff)
6582 | (((!((relocation
>> 23) & 1)) ^ reloc_sign
) << 13)
6583 | (((!((relocation
>> 22) & 1)) ^ reloc_sign
) << 11)
6584 | ((relocation
>> 1) & 0x7ff);
6586 /* Put the relocated value back in the object file: */
6587 bfd_put_16 (input_bfd
, upper_insn
, hit_data
);
6588 bfd_put_16 (input_bfd
, lower_insn
, hit_data
+ 2);
6590 return (overflow
? bfd_reloc_overflow
: bfd_reloc_ok
);
6594 case R_ARM_THM_JUMP19
:
6595 /* Thumb32 conditional branch instruction. */
6598 bfd_boolean overflow
= FALSE
;
6599 bfd_vma upper_insn
= bfd_get_16 (input_bfd
, hit_data
);
6600 bfd_vma lower_insn
= bfd_get_16 (input_bfd
, hit_data
+ 2);
6601 bfd_signed_vma reloc_signed_max
= 0xffffe;
6602 bfd_signed_vma reloc_signed_min
= -0x100000;
6603 bfd_signed_vma signed_check
;
6605 /* Need to refetch the addend, reconstruct the top three bits,
6606 and squish the two 11 bit pieces together. */
6607 if (globals
->use_rel
)
6609 bfd_vma S
= (upper_insn
& 0x0400) >> 10;
6610 bfd_vma upper
= (upper_insn
& 0x003f);
6611 bfd_vma J1
= (lower_insn
& 0x2000) >> 13;
6612 bfd_vma J2
= (lower_insn
& 0x0800) >> 11;
6613 bfd_vma lower
= (lower_insn
& 0x07ff);
6618 upper
-= 0x0100; /* Sign extend. */
6620 addend
= (upper
<< 12) | (lower
<< 1);
6621 signed_addend
= addend
;
6624 /* Handle calls via the PLT. */
6625 if (h
!= NULL
&& splt
!= NULL
&& h
->plt
.offset
!= (bfd_vma
) -1)
6627 value
= (splt
->output_section
->vma
6628 + splt
->output_offset
6630 /* Target the Thumb stub before the ARM PLT entry. */
6631 value
-= PLT_THUMB_STUB_SIZE
;
6632 *unresolved_reloc_p
= FALSE
;
6635 /* ??? Should handle interworking? GCC might someday try to
6636 use this for tail calls. */
6638 relocation
= value
+ signed_addend
;
6639 relocation
-= (input_section
->output_section
->vma
6640 + input_section
->output_offset
6642 signed_check
= (bfd_signed_vma
) relocation
;
6644 if (signed_check
> reloc_signed_max
|| signed_check
< reloc_signed_min
)
6647 /* Put RELOCATION back into the insn. */
6649 bfd_vma S
= (relocation
& 0x00100000) >> 20;
6650 bfd_vma J2
= (relocation
& 0x00080000) >> 19;
6651 bfd_vma J1
= (relocation
& 0x00040000) >> 18;
6652 bfd_vma hi
= (relocation
& 0x0003f000) >> 12;
6653 bfd_vma lo
= (relocation
& 0x00000ffe) >> 1;
6655 upper_insn
= (upper_insn
& 0xfbc0) | (S
<< 10) | hi
;
6656 lower_insn
= (lower_insn
& 0xd000) | (J1
<< 13) | (J2
<< 11) | lo
;
6659 /* Put the relocated value back in the object file: */
6660 bfd_put_16 (input_bfd
, upper_insn
, hit_data
);
6661 bfd_put_16 (input_bfd
, lower_insn
, hit_data
+ 2);
6663 return (overflow
? bfd_reloc_overflow
: bfd_reloc_ok
);
6666 case R_ARM_THM_JUMP11
:
6667 case R_ARM_THM_JUMP8
:
6668 case R_ARM_THM_JUMP6
:
6669 /* Thumb B (branch) instruction). */
6671 bfd_signed_vma relocation
;
6672 bfd_signed_vma reloc_signed_max
= (1 << (howto
->bitsize
- 1)) - 1;
6673 bfd_signed_vma reloc_signed_min
= ~ reloc_signed_max
;
6674 bfd_signed_vma signed_check
;
6676 /* CZB cannot jump backward. */
6677 if (r_type
== R_ARM_THM_JUMP6
)
6678 reloc_signed_min
= 0;
6680 if (globals
->use_rel
)
6682 /* Need to refetch addend. */
6683 addend
= bfd_get_16 (input_bfd
, hit_data
) & howto
->src_mask
;
6684 if (addend
& ((howto
->src_mask
+ 1) >> 1))
6687 signed_addend
&= ~ howto
->src_mask
;
6688 signed_addend
|= addend
;
6691 signed_addend
= addend
;
6692 /* The value in the insn has been right shifted. We need to
6693 undo this, so that we can perform the address calculation
6694 in terms of bytes. */
6695 signed_addend
<<= howto
->rightshift
;
6697 relocation
= value
+ signed_addend
;
6699 relocation
-= (input_section
->output_section
->vma
6700 + input_section
->output_offset
6703 relocation
>>= howto
->rightshift
;
6704 signed_check
= relocation
;
6706 if (r_type
== R_ARM_THM_JUMP6
)
6707 relocation
= ((relocation
& 0x0020) << 4) | ((relocation
& 0x001f) << 3);
6709 relocation
&= howto
->dst_mask
;
6710 relocation
|= (bfd_get_16 (input_bfd
, hit_data
) & (~ howto
->dst_mask
));
6712 bfd_put_16 (input_bfd
, relocation
, hit_data
);
6714 /* Assumes two's complement. */
6715 if (signed_check
> reloc_signed_max
|| signed_check
< reloc_signed_min
)
6716 return bfd_reloc_overflow
;
6718 return bfd_reloc_ok
;
6721 case R_ARM_ALU_PCREL7_0
:
6722 case R_ARM_ALU_PCREL15_8
:
6723 case R_ARM_ALU_PCREL23_15
:
6728 insn
= bfd_get_32 (input_bfd
, hit_data
);
6729 if (globals
->use_rel
)
6731 /* Extract the addend. */
6732 addend
= (insn
& 0xff) << ((insn
& 0xf00) >> 7);
6733 signed_addend
= addend
;
6735 relocation
= value
+ signed_addend
;
6737 relocation
-= (input_section
->output_section
->vma
6738 + input_section
->output_offset
6740 insn
= (insn
& ~0xfff)
6741 | ((howto
->bitpos
<< 7) & 0xf00)
6742 | ((relocation
>> howto
->bitpos
) & 0xff);
6743 bfd_put_32 (input_bfd
, value
, hit_data
);
6745 return bfd_reloc_ok
;
6747 case R_ARM_GNU_VTINHERIT
:
6748 case R_ARM_GNU_VTENTRY
:
6749 return bfd_reloc_ok
;
6751 case R_ARM_GOTOFF32
:
6752 /* Relocation is relative to the start of the
6753 global offset table. */
6755 BFD_ASSERT (sgot
!= NULL
);
6757 return bfd_reloc_notsupported
;
6759 /* If we are addressing a Thumb function, we need to adjust the
6760 address by one, so that attempts to call the function pointer will
6761 correctly interpret it as Thumb code. */
6762 if (sym_flags
== STT_ARM_TFUNC
)
6765 /* Note that sgot->output_offset is not involved in this
6766 calculation. We always want the start of .got. If we
6767 define _GLOBAL_OFFSET_TABLE in a different way, as is
6768 permitted by the ABI, we might have to change this
6770 value
-= sgot
->output_section
->vma
;
6771 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
6772 contents
, rel
->r_offset
, value
,
6776 /* Use global offset table as symbol value. */
6777 BFD_ASSERT (sgot
!= NULL
);
6780 return bfd_reloc_notsupported
;
6782 *unresolved_reloc_p
= FALSE
;
6783 value
= sgot
->output_section
->vma
;
6784 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
6785 contents
, rel
->r_offset
, value
,
6789 case R_ARM_GOT_PREL
:
6790 /* Relocation is to the entry for this symbol in the
6791 global offset table. */
6793 return bfd_reloc_notsupported
;
6800 off
= h
->got
.offset
;
6801 BFD_ASSERT (off
!= (bfd_vma
) -1);
6802 dyn
= globals
->root
.dynamic_sections_created
;
6804 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
6806 && SYMBOL_REFERENCES_LOCAL (info
, h
))
6807 || (ELF_ST_VISIBILITY (h
->other
)
6808 && h
->root
.type
== bfd_link_hash_undefweak
))
6810 /* This is actually a static link, or it is a -Bsymbolic link
6811 and the symbol is defined locally. We must initialize this
6812 entry in the global offset table. Since the offset must
6813 always be a multiple of 4, we use the least significant bit
6814 to record whether we have initialized it already.
6816 When doing a dynamic link, we create a .rel(a).got relocation
6817 entry to initialize the value. This is done in the
6818 finish_dynamic_symbol routine. */
6823 /* If we are addressing a Thumb function, we need to
6824 adjust the address by one, so that attempts to
6825 call the function pointer will correctly
6826 interpret it as Thumb code. */
6827 if (sym_flags
== STT_ARM_TFUNC
)
6830 bfd_put_32 (output_bfd
, value
, sgot
->contents
+ off
);
6835 *unresolved_reloc_p
= FALSE
;
6837 value
= sgot
->output_offset
+ off
;
6843 BFD_ASSERT (local_got_offsets
!= NULL
&&
6844 local_got_offsets
[r_symndx
] != (bfd_vma
) -1);
6846 off
= local_got_offsets
[r_symndx
];
6848 /* The offset must always be a multiple of 4. We use the
6849 least significant bit to record whether we have already
6850 generated the necessary reloc. */
6855 /* If we are addressing a Thumb function, we need to
6856 adjust the address by one, so that attempts to
6857 call the function pointer will correctly
6858 interpret it as Thumb code. */
6859 if (sym_flags
== STT_ARM_TFUNC
)
6862 if (globals
->use_rel
)
6863 bfd_put_32 (output_bfd
, value
, sgot
->contents
+ off
);
6868 Elf_Internal_Rela outrel
;
6871 srelgot
= (bfd_get_section_by_name
6872 (dynobj
, RELOC_SECTION (globals
, ".got")));
6873 BFD_ASSERT (srelgot
!= NULL
);
6875 outrel
.r_addend
= addend
+ value
;
6876 outrel
.r_offset
= (sgot
->output_section
->vma
6877 + sgot
->output_offset
6879 outrel
.r_info
= ELF32_R_INFO (0, R_ARM_RELATIVE
);
6880 loc
= srelgot
->contents
;
6881 loc
+= srelgot
->reloc_count
++ * RELOC_SIZE (globals
);
6882 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
6885 local_got_offsets
[r_symndx
] |= 1;
6888 value
= sgot
->output_offset
+ off
;
6890 if (r_type
!= R_ARM_GOT32
)
6891 value
+= sgot
->output_section
->vma
;
6893 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
6894 contents
, rel
->r_offset
, value
,
6897 case R_ARM_TLS_LDO32
:
6898 value
= value
- dtpoff_base (info
);
6900 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
6901 contents
, rel
->r_offset
, value
,
6904 case R_ARM_TLS_LDM32
:
6908 if (globals
->sgot
== NULL
)
6911 off
= globals
->tls_ldm_got
.offset
;
6917 /* If we don't know the module number, create a relocation
6921 Elf_Internal_Rela outrel
;
6924 if (globals
->srelgot
== NULL
)
6927 outrel
.r_addend
= 0;
6928 outrel
.r_offset
= (globals
->sgot
->output_section
->vma
6929 + globals
->sgot
->output_offset
+ off
);
6930 outrel
.r_info
= ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32
);
6932 if (globals
->use_rel
)
6933 bfd_put_32 (output_bfd
, outrel
.r_addend
,
6934 globals
->sgot
->contents
+ off
);
6936 loc
= globals
->srelgot
->contents
;
6937 loc
+= globals
->srelgot
->reloc_count
++ * RELOC_SIZE (globals
);
6938 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
6941 bfd_put_32 (output_bfd
, 1, globals
->sgot
->contents
+ off
);
6943 globals
->tls_ldm_got
.offset
|= 1;
6946 value
= globals
->sgot
->output_section
->vma
+ globals
->sgot
->output_offset
+ off
6947 - (input_section
->output_section
->vma
+ input_section
->output_offset
+ rel
->r_offset
);
6949 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
6950 contents
, rel
->r_offset
, value
,
6954 case R_ARM_TLS_GD32
:
6955 case R_ARM_TLS_IE32
:
6961 if (globals
->sgot
== NULL
)
6968 dyn
= globals
->root
.dynamic_sections_created
;
6969 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
6971 || !SYMBOL_REFERENCES_LOCAL (info
, h
)))
6973 *unresolved_reloc_p
= FALSE
;
6976 off
= h
->got
.offset
;
6977 tls_type
= ((struct elf32_arm_link_hash_entry
*) h
)->tls_type
;
6981 if (local_got_offsets
== NULL
)
6983 off
= local_got_offsets
[r_symndx
];
6984 tls_type
= elf32_arm_local_got_tls_type (input_bfd
)[r_symndx
];
6987 if (tls_type
== GOT_UNKNOWN
)
6994 bfd_boolean need_relocs
= FALSE
;
6995 Elf_Internal_Rela outrel
;
6996 bfd_byte
*loc
= NULL
;
6999 /* The GOT entries have not been initialized yet. Do it
7000 now, and emit any relocations. If both an IE GOT and a
7001 GD GOT are necessary, we emit the GD first. */
7003 if ((info
->shared
|| indx
!= 0)
7005 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
7006 || h
->root
.type
!= bfd_link_hash_undefweak
))
7009 if (globals
->srelgot
== NULL
)
7011 loc
= globals
->srelgot
->contents
;
7012 loc
+= globals
->srelgot
->reloc_count
* RELOC_SIZE (globals
);
7015 if (tls_type
& GOT_TLS_GD
)
7019 outrel
.r_addend
= 0;
7020 outrel
.r_offset
= (globals
->sgot
->output_section
->vma
7021 + globals
->sgot
->output_offset
7023 outrel
.r_info
= ELF32_R_INFO (indx
, R_ARM_TLS_DTPMOD32
);
7025 if (globals
->use_rel
)
7026 bfd_put_32 (output_bfd
, outrel
.r_addend
,
7027 globals
->sgot
->contents
+ cur_off
);
7029 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
7030 globals
->srelgot
->reloc_count
++;
7031 loc
+= RELOC_SIZE (globals
);
7034 bfd_put_32 (output_bfd
, value
- dtpoff_base (info
),
7035 globals
->sgot
->contents
+ cur_off
+ 4);
7038 outrel
.r_addend
= 0;
7039 outrel
.r_info
= ELF32_R_INFO (indx
,
7040 R_ARM_TLS_DTPOFF32
);
7041 outrel
.r_offset
+= 4;
7043 if (globals
->use_rel
)
7044 bfd_put_32 (output_bfd
, outrel
.r_addend
,
7045 globals
->sgot
->contents
+ cur_off
+ 4);
7048 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
7049 globals
->srelgot
->reloc_count
++;
7050 loc
+= RELOC_SIZE (globals
);
7055 /* If we are not emitting relocations for a
7056 general dynamic reference, then we must be in a
7057 static link or an executable link with the
7058 symbol binding locally. Mark it as belonging
7059 to module 1, the executable. */
7060 bfd_put_32 (output_bfd
, 1,
7061 globals
->sgot
->contents
+ cur_off
);
7062 bfd_put_32 (output_bfd
, value
- dtpoff_base (info
),
7063 globals
->sgot
->contents
+ cur_off
+ 4);
7069 if (tls_type
& GOT_TLS_IE
)
7074 outrel
.r_addend
= value
- dtpoff_base (info
);
7076 outrel
.r_addend
= 0;
7077 outrel
.r_offset
= (globals
->sgot
->output_section
->vma
7078 + globals
->sgot
->output_offset
7080 outrel
.r_info
= ELF32_R_INFO (indx
, R_ARM_TLS_TPOFF32
);
7082 if (globals
->use_rel
)
7083 bfd_put_32 (output_bfd
, outrel
.r_addend
,
7084 globals
->sgot
->contents
+ cur_off
);
7086 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
7087 globals
->srelgot
->reloc_count
++;
7088 loc
+= RELOC_SIZE (globals
);
7091 bfd_put_32 (output_bfd
, tpoff (info
, value
),
7092 globals
->sgot
->contents
+ cur_off
);
7099 local_got_offsets
[r_symndx
] |= 1;
7102 if ((tls_type
& GOT_TLS_GD
) && r_type
!= R_ARM_TLS_GD32
)
7104 value
= globals
->sgot
->output_section
->vma
+ globals
->sgot
->output_offset
+ off
7105 - (input_section
->output_section
->vma
+ input_section
->output_offset
+ rel
->r_offset
);
7107 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
7108 contents
, rel
->r_offset
, value
,
7112 case R_ARM_TLS_LE32
:
7115 (*_bfd_error_handler
)
7116 (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
7117 input_bfd
, input_section
,
7118 (long) rel
->r_offset
, howto
->name
);
7122 value
= tpoff (info
, value
);
7124 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
7125 contents
, rel
->r_offset
, value
,
7129 if (globals
->fix_v4bx
)
7131 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
7133 /* Ensure that we have a BX instruction. */
7134 BFD_ASSERT ((insn
& 0x0ffffff0) == 0x012fff10);
7136 if (globals
->fix_v4bx
== 2 && (insn
& 0xf) != 0xf)
7138 /* Branch to veneer. */
7140 glue_addr
= elf32_arm_bx_glue (info
, insn
& 0xf);
7141 glue_addr
-= input_section
->output_section
->vma
7142 + input_section
->output_offset
7143 + rel
->r_offset
+ 8;
7144 insn
= (insn
& 0xf0000000) | 0x0a000000
7145 | ((glue_addr
>> 2) & 0x00ffffff);
7149 /* Preserve Rm (lowest four bits) and the condition code
7150 (highest four bits). Other bits encode MOV PC,Rm. */
7151 insn
= (insn
& 0xf000000f) | 0x01a0f000;
7154 bfd_put_32 (input_bfd
, insn
, hit_data
);
7156 return bfd_reloc_ok
;
7158 case R_ARM_MOVW_ABS_NC
:
7159 case R_ARM_MOVT_ABS
:
7160 case R_ARM_MOVW_PREL_NC
:
7161 case R_ARM_MOVT_PREL
:
7162 /* Until we properly support segment-base-relative addressing then
7163 we assume the segment base to be zero, as for the group relocations.
7164 Thus R_ARM_MOVW_BREL_NC has the same semantics as R_ARM_MOVW_ABS_NC
7165 and R_ARM_MOVT_BREL has the same semantics as R_ARM_MOVT_ABS. */
7166 case R_ARM_MOVW_BREL_NC
:
7167 case R_ARM_MOVW_BREL
:
7168 case R_ARM_MOVT_BREL
:
7170 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
7172 if (globals
->use_rel
)
7174 addend
= ((insn
>> 4) & 0xf000) | (insn
& 0xfff);
7175 signed_addend
= (addend
^ 0x8000) - 0x8000;
7178 value
+= signed_addend
;
7180 if (r_type
== R_ARM_MOVW_PREL_NC
|| r_type
== R_ARM_MOVT_PREL
)
7181 value
-= (input_section
->output_section
->vma
7182 + input_section
->output_offset
+ rel
->r_offset
);
7184 if (r_type
== R_ARM_MOVW_BREL
&& value
>= 0x10000)
7185 return bfd_reloc_overflow
;
7187 if (sym_flags
== STT_ARM_TFUNC
)
7190 if (r_type
== R_ARM_MOVT_ABS
|| r_type
== R_ARM_MOVT_PREL
7191 || r_type
== R_ARM_MOVT_BREL
)
7195 insn
|= value
& 0xfff;
7196 insn
|= (value
& 0xf000) << 4;
7197 bfd_put_32 (input_bfd
, insn
, hit_data
);
7199 return bfd_reloc_ok
;
7201 case R_ARM_THM_MOVW_ABS_NC
:
7202 case R_ARM_THM_MOVT_ABS
:
7203 case R_ARM_THM_MOVW_PREL_NC
:
7204 case R_ARM_THM_MOVT_PREL
:
7205 /* Until we properly support segment-base-relative addressing then
7206 we assume the segment base to be zero, as for the above relocations.
7207 Thus R_ARM_THM_MOVW_BREL_NC has the same semantics as
7208 R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_BREL has the same semantics
7209 as R_ARM_THM_MOVT_ABS. */
7210 case R_ARM_THM_MOVW_BREL_NC
:
7211 case R_ARM_THM_MOVW_BREL
:
7212 case R_ARM_THM_MOVT_BREL
:
7216 insn
= bfd_get_16 (input_bfd
, hit_data
) << 16;
7217 insn
|= bfd_get_16 (input_bfd
, hit_data
+ 2);
7219 if (globals
->use_rel
)
7221 addend
= ((insn
>> 4) & 0xf000)
7222 | ((insn
>> 15) & 0x0800)
7223 | ((insn
>> 4) & 0x0700)
7225 signed_addend
= (addend
^ 0x8000) - 0x8000;
7228 value
+= signed_addend
;
7230 if (r_type
== R_ARM_THM_MOVW_PREL_NC
|| r_type
== R_ARM_THM_MOVT_PREL
)
7231 value
-= (input_section
->output_section
->vma
7232 + input_section
->output_offset
+ rel
->r_offset
);
7234 if (r_type
== R_ARM_THM_MOVW_BREL
&& value
>= 0x10000)
7235 return bfd_reloc_overflow
;
7237 if (sym_flags
== STT_ARM_TFUNC
)
7240 if (r_type
== R_ARM_THM_MOVT_ABS
|| r_type
== R_ARM_THM_MOVT_PREL
7241 || r_type
== R_ARM_THM_MOVT_BREL
)
7245 insn
|= (value
& 0xf000) << 4;
7246 insn
|= (value
& 0x0800) << 15;
7247 insn
|= (value
& 0x0700) << 4;
7248 insn
|= (value
& 0x00ff);
7250 bfd_put_16 (input_bfd
, insn
>> 16, hit_data
);
7251 bfd_put_16 (input_bfd
, insn
& 0xffff, hit_data
+ 2);
7253 return bfd_reloc_ok
;
7255 case R_ARM_ALU_PC_G0_NC
:
7256 case R_ARM_ALU_PC_G1_NC
:
7257 case R_ARM_ALU_PC_G0
:
7258 case R_ARM_ALU_PC_G1
:
7259 case R_ARM_ALU_PC_G2
:
7260 case R_ARM_ALU_SB_G0_NC
:
7261 case R_ARM_ALU_SB_G1_NC
:
7262 case R_ARM_ALU_SB_G0
:
7263 case R_ARM_ALU_SB_G1
:
7264 case R_ARM_ALU_SB_G2
:
7266 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
7267 bfd_vma pc
= input_section
->output_section
->vma
7268 + input_section
->output_offset
+ rel
->r_offset
;
7269 /* sb should be the origin of the *segment* containing the symbol.
7270 It is not clear how to obtain this OS-dependent value, so we
7271 make an arbitrary choice of zero. */
7275 bfd_signed_vma signed_value
;
7278 /* Determine which group of bits to select. */
7281 case R_ARM_ALU_PC_G0_NC
:
7282 case R_ARM_ALU_PC_G0
:
7283 case R_ARM_ALU_SB_G0_NC
:
7284 case R_ARM_ALU_SB_G0
:
7288 case R_ARM_ALU_PC_G1_NC
:
7289 case R_ARM_ALU_PC_G1
:
7290 case R_ARM_ALU_SB_G1_NC
:
7291 case R_ARM_ALU_SB_G1
:
7295 case R_ARM_ALU_PC_G2
:
7296 case R_ARM_ALU_SB_G2
:
7304 /* If REL, extract the addend from the insn. If RELA, it will
7305 have already been fetched for us. */
7306 if (globals
->use_rel
)
7309 bfd_vma constant
= insn
& 0xff;
7310 bfd_vma rotation
= (insn
& 0xf00) >> 8;
7313 signed_addend
= constant
;
7316 /* Compensate for the fact that in the instruction, the
7317 rotation is stored in multiples of 2 bits. */
7320 /* Rotate "constant" right by "rotation" bits. */
7321 signed_addend
= (constant
>> rotation
) |
7322 (constant
<< (8 * sizeof (bfd_vma
) - rotation
));
7325 /* Determine if the instruction is an ADD or a SUB.
7326 (For REL, this determines the sign of the addend.) */
7327 negative
= identify_add_or_sub (insn
);
7330 (*_bfd_error_handler
)
7331 (_("%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group relocations"),
7332 input_bfd
, input_section
,
7333 (long) rel
->r_offset
, howto
->name
);
7334 return bfd_reloc_overflow
;
7337 signed_addend
*= negative
;
7340 /* Compute the value (X) to go in the place. */
7341 if (r_type
== R_ARM_ALU_PC_G0_NC
7342 || r_type
== R_ARM_ALU_PC_G1_NC
7343 || r_type
== R_ARM_ALU_PC_G0
7344 || r_type
== R_ARM_ALU_PC_G1
7345 || r_type
== R_ARM_ALU_PC_G2
)
7347 signed_value
= value
- pc
+ signed_addend
;
7349 /* Section base relative. */
7350 signed_value
= value
- sb
+ signed_addend
;
7352 /* If the target symbol is a Thumb function, then set the
7353 Thumb bit in the address. */
7354 if (sym_flags
== STT_ARM_TFUNC
)
7357 /* Calculate the value of the relevant G_n, in encoded
7358 constant-with-rotation format. */
7359 g_n
= calculate_group_reloc_mask (abs (signed_value
), group
,
7362 /* Check for overflow if required. */
7363 if ((r_type
== R_ARM_ALU_PC_G0
7364 || r_type
== R_ARM_ALU_PC_G1
7365 || r_type
== R_ARM_ALU_PC_G2
7366 || r_type
== R_ARM_ALU_SB_G0
7367 || r_type
== R_ARM_ALU_SB_G1
7368 || r_type
== R_ARM_ALU_SB_G2
) && residual
!= 0)
7370 (*_bfd_error_handler
)
7371 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7372 input_bfd
, input_section
,
7373 (long) rel
->r_offset
, abs (signed_value
), howto
->name
);
7374 return bfd_reloc_overflow
;
7377 /* Mask out the value and the ADD/SUB part of the opcode; take care
7378 not to destroy the S bit. */
7381 /* Set the opcode according to whether the value to go in the
7382 place is negative. */
7383 if (signed_value
< 0)
7388 /* Encode the offset. */
7391 bfd_put_32 (input_bfd
, insn
, hit_data
);
7393 return bfd_reloc_ok
;
7395 case R_ARM_LDR_PC_G0
:
7396 case R_ARM_LDR_PC_G1
:
7397 case R_ARM_LDR_PC_G2
:
7398 case R_ARM_LDR_SB_G0
:
7399 case R_ARM_LDR_SB_G1
:
7400 case R_ARM_LDR_SB_G2
:
7402 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
7403 bfd_vma pc
= input_section
->output_section
->vma
7404 + input_section
->output_offset
+ rel
->r_offset
;
7405 bfd_vma sb
= 0; /* See note above. */
7407 bfd_signed_vma signed_value
;
7410 /* Determine which groups of bits to calculate. */
7413 case R_ARM_LDR_PC_G0
:
7414 case R_ARM_LDR_SB_G0
:
7418 case R_ARM_LDR_PC_G1
:
7419 case R_ARM_LDR_SB_G1
:
7423 case R_ARM_LDR_PC_G2
:
7424 case R_ARM_LDR_SB_G2
:
7432 /* If REL, extract the addend from the insn. If RELA, it will
7433 have already been fetched for us. */
7434 if (globals
->use_rel
)
7436 int negative
= (insn
& (1 << 23)) ? 1 : -1;
7437 signed_addend
= negative
* (insn
& 0xfff);
7440 /* Compute the value (X) to go in the place. */
7441 if (r_type
== R_ARM_LDR_PC_G0
7442 || r_type
== R_ARM_LDR_PC_G1
7443 || r_type
== R_ARM_LDR_PC_G2
)
7445 signed_value
= value
- pc
+ signed_addend
;
7447 /* Section base relative. */
7448 signed_value
= value
- sb
+ signed_addend
;
7450 /* Calculate the value of the relevant G_{n-1} to obtain
7451 the residual at that stage. */
7452 calculate_group_reloc_mask (abs (signed_value
), group
- 1, &residual
);
7454 /* Check for overflow. */
7455 if (residual
>= 0x1000)
7457 (*_bfd_error_handler
)
7458 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7459 input_bfd
, input_section
,
7460 (long) rel
->r_offset
, abs (signed_value
), howto
->name
);
7461 return bfd_reloc_overflow
;
7464 /* Mask out the value and U bit. */
7467 /* Set the U bit if the value to go in the place is non-negative. */
7468 if (signed_value
>= 0)
7471 /* Encode the offset. */
7474 bfd_put_32 (input_bfd
, insn
, hit_data
);
7476 return bfd_reloc_ok
;
7478 case R_ARM_LDRS_PC_G0
:
7479 case R_ARM_LDRS_PC_G1
:
7480 case R_ARM_LDRS_PC_G2
:
7481 case R_ARM_LDRS_SB_G0
:
7482 case R_ARM_LDRS_SB_G1
:
7483 case R_ARM_LDRS_SB_G2
:
7485 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
7486 bfd_vma pc
= input_section
->output_section
->vma
7487 + input_section
->output_offset
+ rel
->r_offset
;
7488 bfd_vma sb
= 0; /* See note above. */
7490 bfd_signed_vma signed_value
;
7493 /* Determine which groups of bits to calculate. */
7496 case R_ARM_LDRS_PC_G0
:
7497 case R_ARM_LDRS_SB_G0
:
7501 case R_ARM_LDRS_PC_G1
:
7502 case R_ARM_LDRS_SB_G1
:
7506 case R_ARM_LDRS_PC_G2
:
7507 case R_ARM_LDRS_SB_G2
:
7515 /* If REL, extract the addend from the insn. If RELA, it will
7516 have already been fetched for us. */
7517 if (globals
->use_rel
)
7519 int negative
= (insn
& (1 << 23)) ? 1 : -1;
7520 signed_addend
= negative
* (((insn
& 0xf00) >> 4) + (insn
& 0xf));
7523 /* Compute the value (X) to go in the place. */
7524 if (r_type
== R_ARM_LDRS_PC_G0
7525 || r_type
== R_ARM_LDRS_PC_G1
7526 || r_type
== R_ARM_LDRS_PC_G2
)
7528 signed_value
= value
- pc
+ signed_addend
;
7530 /* Section base relative. */
7531 signed_value
= value
- sb
+ signed_addend
;
7533 /* Calculate the value of the relevant G_{n-1} to obtain
7534 the residual at that stage. */
7535 calculate_group_reloc_mask (abs (signed_value
), group
- 1, &residual
);
7537 /* Check for overflow. */
7538 if (residual
>= 0x100)
7540 (*_bfd_error_handler
)
7541 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7542 input_bfd
, input_section
,
7543 (long) rel
->r_offset
, abs (signed_value
), howto
->name
);
7544 return bfd_reloc_overflow
;
7547 /* Mask out the value and U bit. */
7550 /* Set the U bit if the value to go in the place is non-negative. */
7551 if (signed_value
>= 0)
7554 /* Encode the offset. */
7555 insn
|= ((residual
& 0xf0) << 4) | (residual
& 0xf);
7557 bfd_put_32 (input_bfd
, insn
, hit_data
);
7559 return bfd_reloc_ok
;
7561 case R_ARM_LDC_PC_G0
:
7562 case R_ARM_LDC_PC_G1
:
7563 case R_ARM_LDC_PC_G2
:
7564 case R_ARM_LDC_SB_G0
:
7565 case R_ARM_LDC_SB_G1
:
7566 case R_ARM_LDC_SB_G2
:
7568 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
7569 bfd_vma pc
= input_section
->output_section
->vma
7570 + input_section
->output_offset
+ rel
->r_offset
;
7571 bfd_vma sb
= 0; /* See note above. */
7573 bfd_signed_vma signed_value
;
7576 /* Determine which groups of bits to calculate. */
7579 case R_ARM_LDC_PC_G0
:
7580 case R_ARM_LDC_SB_G0
:
7584 case R_ARM_LDC_PC_G1
:
7585 case R_ARM_LDC_SB_G1
:
7589 case R_ARM_LDC_PC_G2
:
7590 case R_ARM_LDC_SB_G2
:
7598 /* If REL, extract the addend from the insn. If RELA, it will
7599 have already been fetched for us. */
7600 if (globals
->use_rel
)
7602 int negative
= (insn
& (1 << 23)) ? 1 : -1;
7603 signed_addend
= negative
* ((insn
& 0xff) << 2);
7606 /* Compute the value (X) to go in the place. */
7607 if (r_type
== R_ARM_LDC_PC_G0
7608 || r_type
== R_ARM_LDC_PC_G1
7609 || r_type
== R_ARM_LDC_PC_G2
)
7611 signed_value
= value
- pc
+ signed_addend
;
7613 /* Section base relative. */
7614 signed_value
= value
- sb
+ signed_addend
;
7616 /* Calculate the value of the relevant G_{n-1} to obtain
7617 the residual at that stage. */
7618 calculate_group_reloc_mask (abs (signed_value
), group
- 1, &residual
);
7620 /* Check for overflow. (The absolute value to go in the place must be
7621 divisible by four and, after having been divided by four, must
7622 fit in eight bits.) */
7623 if ((residual
& 0x3) != 0 || residual
>= 0x400)
7625 (*_bfd_error_handler
)
7626 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7627 input_bfd
, input_section
,
7628 (long) rel
->r_offset
, abs (signed_value
), howto
->name
);
7629 return bfd_reloc_overflow
;
7632 /* Mask out the value and U bit. */
7635 /* Set the U bit if the value to go in the place is non-negative. */
7636 if (signed_value
>= 0)
7639 /* Encode the offset. */
7640 insn
|= residual
>> 2;
7642 bfd_put_32 (input_bfd
, insn
, hit_data
);
7644 return bfd_reloc_ok
;
7647 return bfd_reloc_notsupported
;
7651 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS. */
7653 arm_add_to_rel (bfd
* abfd
,
7655 reloc_howto_type
* howto
,
7656 bfd_signed_vma increment
)
7658 bfd_signed_vma addend
;
7660 if (howto
->type
== R_ARM_THM_CALL
7661 || howto
->type
== R_ARM_THM_JUMP24
)
7663 int upper_insn
, lower_insn
;
7666 upper_insn
= bfd_get_16 (abfd
, address
);
7667 lower_insn
= bfd_get_16 (abfd
, address
+ 2);
7668 upper
= upper_insn
& 0x7ff;
7669 lower
= lower_insn
& 0x7ff;
7671 addend
= (upper
<< 12) | (lower
<< 1);
7672 addend
+= increment
;
7675 upper_insn
= (upper_insn
& 0xf800) | ((addend
>> 11) & 0x7ff);
7676 lower_insn
= (lower_insn
& 0xf800) | (addend
& 0x7ff);
7678 bfd_put_16 (abfd
, (bfd_vma
) upper_insn
, address
);
7679 bfd_put_16 (abfd
, (bfd_vma
) lower_insn
, address
+ 2);
7685 contents
= bfd_get_32 (abfd
, address
);
7687 /* Get the (signed) value from the instruction. */
7688 addend
= contents
& howto
->src_mask
;
7689 if (addend
& ((howto
->src_mask
+ 1) >> 1))
7691 bfd_signed_vma mask
;
7694 mask
&= ~ howto
->src_mask
;
7698 /* Add in the increment, (which is a byte value). */
7699 switch (howto
->type
)
7702 addend
+= increment
;
7709 addend
<<= howto
->size
;
7710 addend
+= increment
;
7712 /* Should we check for overflow here ? */
7714 /* Drop any undesired bits. */
7715 addend
>>= howto
->rightshift
;
7719 contents
= (contents
& ~ howto
->dst_mask
) | (addend
& howto
->dst_mask
);
7721 bfd_put_32 (abfd
, contents
, address
);
7725 #define IS_ARM_TLS_RELOC(R_TYPE) \
7726 ((R_TYPE) == R_ARM_TLS_GD32 \
7727 || (R_TYPE) == R_ARM_TLS_LDO32 \
7728 || (R_TYPE) == R_ARM_TLS_LDM32 \
7729 || (R_TYPE) == R_ARM_TLS_DTPOFF32 \
7730 || (R_TYPE) == R_ARM_TLS_DTPMOD32 \
7731 || (R_TYPE) == R_ARM_TLS_TPOFF32 \
7732 || (R_TYPE) == R_ARM_TLS_LE32 \
7733 || (R_TYPE) == R_ARM_TLS_IE32)
7735 /* Relocate an ARM ELF section. */
7738 elf32_arm_relocate_section (bfd
* output_bfd
,
7739 struct bfd_link_info
* info
,
7741 asection
* input_section
,
7742 bfd_byte
* contents
,
7743 Elf_Internal_Rela
* relocs
,
7744 Elf_Internal_Sym
* local_syms
,
7745 asection
** local_sections
)
7747 Elf_Internal_Shdr
*symtab_hdr
;
7748 struct elf_link_hash_entry
**sym_hashes
;
7749 Elf_Internal_Rela
*rel
;
7750 Elf_Internal_Rela
*relend
;
7752 struct elf32_arm_link_hash_table
* globals
;
7754 globals
= elf32_arm_hash_table (info
);
7756 symtab_hdr
= & elf_symtab_hdr (input_bfd
);
7757 sym_hashes
= elf_sym_hashes (input_bfd
);
7760 relend
= relocs
+ input_section
->reloc_count
;
7761 for (; rel
< relend
; rel
++)
7764 reloc_howto_type
* howto
;
7765 unsigned long r_symndx
;
7766 Elf_Internal_Sym
* sym
;
7768 struct elf_link_hash_entry
* h
;
7770 bfd_reloc_status_type r
;
7773 bfd_boolean unresolved_reloc
= FALSE
;
7774 char *error_message
= NULL
;
7776 r_symndx
= ELF32_R_SYM (rel
->r_info
);
7777 r_type
= ELF32_R_TYPE (rel
->r_info
);
7778 r_type
= arm_real_reloc_type (globals
, r_type
);
7780 if ( r_type
== R_ARM_GNU_VTENTRY
7781 || r_type
== R_ARM_GNU_VTINHERIT
)
7784 bfd_reloc
.howto
= elf32_arm_howto_from_type (r_type
);
7785 howto
= bfd_reloc
.howto
;
7791 if (r_symndx
< symtab_hdr
->sh_info
)
7793 sym
= local_syms
+ r_symndx
;
7794 sym_type
= ELF32_ST_TYPE (sym
->st_info
);
7795 sec
= local_sections
[r_symndx
];
7796 if (globals
->use_rel
)
7798 relocation
= (sec
->output_section
->vma
7799 + sec
->output_offset
7801 if (!info
->relocatable
7802 && (sec
->flags
& SEC_MERGE
)
7803 && ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
7806 bfd_vma addend
, value
;
7810 case R_ARM_MOVW_ABS_NC
:
7811 case R_ARM_MOVT_ABS
:
7812 value
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
7813 addend
= ((value
& 0xf0000) >> 4) | (value
& 0xfff);
7814 addend
= (addend
^ 0x8000) - 0x8000;
7817 case R_ARM_THM_MOVW_ABS_NC
:
7818 case R_ARM_THM_MOVT_ABS
:
7819 value
= bfd_get_16 (input_bfd
, contents
+ rel
->r_offset
)
7821 value
|= bfd_get_16 (input_bfd
,
7822 contents
+ rel
->r_offset
+ 2);
7823 addend
= ((value
& 0xf7000) >> 4) | (value
& 0xff)
7824 | ((value
& 0x04000000) >> 15);
7825 addend
= (addend
^ 0x8000) - 0x8000;
7829 if (howto
->rightshift
7830 || (howto
->src_mask
& (howto
->src_mask
+ 1)))
7832 (*_bfd_error_handler
)
7833 (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
7834 input_bfd
, input_section
,
7835 (long) rel
->r_offset
, howto
->name
);
7839 value
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
7841 /* Get the (signed) value from the instruction. */
7842 addend
= value
& howto
->src_mask
;
7843 if (addend
& ((howto
->src_mask
+ 1) >> 1))
7845 bfd_signed_vma mask
;
7848 mask
&= ~ howto
->src_mask
;
7856 _bfd_elf_rel_local_sym (output_bfd
, sym
, &msec
, addend
)
7858 addend
+= msec
->output_section
->vma
+ msec
->output_offset
;
7860 /* Cases here must match those in the preceeding
7861 switch statement. */
7864 case R_ARM_MOVW_ABS_NC
:
7865 case R_ARM_MOVT_ABS
:
7866 value
= (value
& 0xfff0f000) | ((addend
& 0xf000) << 4)
7868 bfd_put_32 (input_bfd
, value
, contents
+ rel
->r_offset
);
7871 case R_ARM_THM_MOVW_ABS_NC
:
7872 case R_ARM_THM_MOVT_ABS
:
7873 value
= (value
& 0xfbf08f00) | ((addend
& 0xf700) << 4)
7874 | (addend
& 0xff) | ((addend
& 0x0800) << 15);
7875 bfd_put_16 (input_bfd
, value
>> 16,
7876 contents
+ rel
->r_offset
);
7877 bfd_put_16 (input_bfd
, value
,
7878 contents
+ rel
->r_offset
+ 2);
7882 value
= (value
& ~ howto
->dst_mask
)
7883 | (addend
& howto
->dst_mask
);
7884 bfd_put_32 (input_bfd
, value
, contents
+ rel
->r_offset
);
7890 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
7896 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
7897 r_symndx
, symtab_hdr
, sym_hashes
,
7899 unresolved_reloc
, warned
);
7904 if (sec
!= NULL
&& elf_discarded_section (sec
))
7906 /* For relocs against symbols from removed linkonce sections,
7907 or sections discarded by a linker script, we just want the
7908 section contents zeroed. Avoid any special processing. */
7909 _bfd_clear_contents (howto
, input_bfd
, contents
+ rel
->r_offset
);
7915 if (info
->relocatable
)
7917 /* This is a relocatable link. We don't have to change
7918 anything, unless the reloc is against a section symbol,
7919 in which case we have to adjust according to where the
7920 section symbol winds up in the output section. */
7921 if (sym
!= NULL
&& ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
7923 if (globals
->use_rel
)
7924 arm_add_to_rel (input_bfd
, contents
+ rel
->r_offset
,
7925 howto
, (bfd_signed_vma
) sec
->output_offset
);
7927 rel
->r_addend
+= sec
->output_offset
;
7933 name
= h
->root
.root
.string
;
7936 name
= (bfd_elf_string_from_elf_section
7937 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
7938 if (name
== NULL
|| *name
== '\0')
7939 name
= bfd_section_name (input_bfd
, sec
);
7943 && r_type
!= R_ARM_NONE
7945 || h
->root
.type
== bfd_link_hash_defined
7946 || h
->root
.type
== bfd_link_hash_defweak
)
7947 && IS_ARM_TLS_RELOC (r_type
) != (sym_type
== STT_TLS
))
7949 (*_bfd_error_handler
)
7950 ((sym_type
== STT_TLS
7951 ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
7952 : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
7955 (long) rel
->r_offset
,
7960 r
= elf32_arm_final_link_relocate (howto
, input_bfd
, output_bfd
,
7961 input_section
, contents
, rel
,
7962 relocation
, info
, sec
, name
,
7963 (h
? ELF_ST_TYPE (h
->type
) :
7964 ELF_ST_TYPE (sym
->st_info
)), h
,
7965 &unresolved_reloc
, &error_message
);
7967 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
7968 because such sections are not SEC_ALLOC and thus ld.so will
7969 not process them. */
7970 if (unresolved_reloc
7971 && !((input_section
->flags
& SEC_DEBUGGING
) != 0
7974 (*_bfd_error_handler
)
7975 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
7978 (long) rel
->r_offset
,
7980 h
->root
.root
.string
);
7984 if (r
!= bfd_reloc_ok
)
7988 case bfd_reloc_overflow
:
7989 /* If the overflowing reloc was to an undefined symbol,
7990 we have already printed one error message and there
7991 is no point complaining again. */
7993 h
->root
.type
!= bfd_link_hash_undefined
)
7994 && (!((*info
->callbacks
->reloc_overflow
)
7995 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
7996 (bfd_vma
) 0, input_bfd
, input_section
,
8001 case bfd_reloc_undefined
:
8002 if (!((*info
->callbacks
->undefined_symbol
)
8003 (info
, name
, input_bfd
, input_section
,
8004 rel
->r_offset
, TRUE
)))
8008 case bfd_reloc_outofrange
:
8009 error_message
= _("out of range");
8012 case bfd_reloc_notsupported
:
8013 error_message
= _("unsupported relocation");
8016 case bfd_reloc_dangerous
:
8017 /* error_message should already be set. */
8021 error_message
= _("unknown error");
8025 BFD_ASSERT (error_message
!= NULL
);
8026 if (!((*info
->callbacks
->reloc_dangerous
)
8027 (info
, error_message
, input_bfd
, input_section
,
8038 /* Set the right machine number. */
8041 elf32_arm_object_p (bfd
*abfd
)
8045 mach
= bfd_arm_get_mach_from_notes (abfd
, ARM_NOTE_SECTION
);
8047 if (mach
!= bfd_mach_arm_unknown
)
8048 bfd_default_set_arch_mach (abfd
, bfd_arch_arm
, mach
);
8050 else if (elf_elfheader (abfd
)->e_flags
& EF_ARM_MAVERICK_FLOAT
)
8051 bfd_default_set_arch_mach (abfd
, bfd_arch_arm
, bfd_mach_arm_ep9312
);
8054 bfd_default_set_arch_mach (abfd
, bfd_arch_arm
, mach
);
8059 /* Function to keep ARM specific flags in the ELF header. */
8062 elf32_arm_set_private_flags (bfd
*abfd
, flagword flags
)
8064 if (elf_flags_init (abfd
)
8065 && elf_elfheader (abfd
)->e_flags
!= flags
)
8067 if (EF_ARM_EABI_VERSION (flags
) == EF_ARM_EABI_UNKNOWN
)
8069 if (flags
& EF_ARM_INTERWORK
)
8070 (*_bfd_error_handler
)
8071 (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
8075 (_("Warning: Clearing the interworking flag of %B due to outside request"),
8081 elf_elfheader (abfd
)->e_flags
= flags
;
8082 elf_flags_init (abfd
) = TRUE
;
8088 /* Copy backend specific data from one object module to another. */
8091 elf32_arm_copy_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
8096 if (! is_arm_elf (ibfd
) || ! is_arm_elf (obfd
))
8099 in_flags
= elf_elfheader (ibfd
)->e_flags
;
8100 out_flags
= elf_elfheader (obfd
)->e_flags
;
8102 if (elf_flags_init (obfd
)
8103 && EF_ARM_EABI_VERSION (out_flags
) == EF_ARM_EABI_UNKNOWN
8104 && in_flags
!= out_flags
)
8106 /* Cannot mix APCS26 and APCS32 code. */
8107 if ((in_flags
& EF_ARM_APCS_26
) != (out_flags
& EF_ARM_APCS_26
))
8110 /* Cannot mix float APCS and non-float APCS code. */
8111 if ((in_flags
& EF_ARM_APCS_FLOAT
) != (out_flags
& EF_ARM_APCS_FLOAT
))
8114 /* If the src and dest have different interworking flags
8115 then turn off the interworking bit. */
8116 if ((in_flags
& EF_ARM_INTERWORK
) != (out_flags
& EF_ARM_INTERWORK
))
8118 if (out_flags
& EF_ARM_INTERWORK
)
8120 (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
8123 in_flags
&= ~EF_ARM_INTERWORK
;
8126 /* Likewise for PIC, though don't warn for this case. */
8127 if ((in_flags
& EF_ARM_PIC
) != (out_flags
& EF_ARM_PIC
))
8128 in_flags
&= ~EF_ARM_PIC
;
8131 elf_elfheader (obfd
)->e_flags
= in_flags
;
8132 elf_flags_init (obfd
) = TRUE
;
8134 /* Also copy the EI_OSABI field. */
8135 elf_elfheader (obfd
)->e_ident
[EI_OSABI
] =
8136 elf_elfheader (ibfd
)->e_ident
[EI_OSABI
];
8138 /* Copy object attributes. */
8139 _bfd_elf_copy_obj_attributes (ibfd
, obfd
);
8144 /* Values for Tag_ABI_PCS_R9_use. */
8153 /* Values for Tag_ABI_PCS_RW_data. */
8156 AEABI_PCS_RW_data_absolute
,
8157 AEABI_PCS_RW_data_PCrel
,
8158 AEABI_PCS_RW_data_SBrel
,
8159 AEABI_PCS_RW_data_unused
8162 /* Values for Tag_ABI_enum_size. */
8168 AEABI_enum_forced_wide
8171 /* Determine whether an object attribute tag takes an integer, a
8175 elf32_arm_obj_attrs_arg_type (int tag
)
8177 if (tag
== Tag_compatibility
)
8178 return ATTR_TYPE_FLAG_INT_VAL
| ATTR_TYPE_FLAG_STR_VAL
;
8179 else if (tag
== Tag_nodefaults
)
8180 return ATTR_TYPE_FLAG_INT_VAL
| ATTR_TYPE_FLAG_NO_DEFAULT
;
8181 else if (tag
== Tag_CPU_raw_name
|| tag
== Tag_CPU_name
)
8182 return ATTR_TYPE_FLAG_STR_VAL
;
8184 return ATTR_TYPE_FLAG_INT_VAL
;
8186 return (tag
& 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL
: ATTR_TYPE_FLAG_INT_VAL
;
8189 /* The ABI defines that Tag_conformance should be emitted first, and that
8190 Tag_nodefaults should be second (if either is defined). This sets those
8191 two positions, and bumps up the position of all the remaining tags to
8194 elf32_arm_obj_attrs_order (int num
)
8197 return Tag_conformance
;
8199 return Tag_nodefaults
;
8200 if ((num
- 2) < Tag_nodefaults
)
8202 if ((num
- 1) < Tag_conformance
)
8207 /* Read the architecture from the Tag_also_compatible_with attribute, if any.
8208 Returns -1 if no architecture could be read. */
8211 get_secondary_compatible_arch (bfd
*abfd
)
8213 obj_attribute
*attr
=
8214 &elf_known_obj_attributes_proc (abfd
)[Tag_also_compatible_with
];
8216 /* Note: the tag and its argument below are uleb128 values, though
8217 currently-defined values fit in one byte for each. */
8219 && attr
->s
[0] == Tag_CPU_arch
8220 && (attr
->s
[1] & 128) != 128
8224 /* This tag is "safely ignorable", so don't complain if it looks funny. */
8228 /* Set, or unset, the architecture of the Tag_also_compatible_with attribute.
8229 The tag is removed if ARCH is -1. */
8232 set_secondary_compatible_arch (bfd
*abfd
, int arch
)
8234 obj_attribute
*attr
=
8235 &elf_known_obj_attributes_proc (abfd
)[Tag_also_compatible_with
];
8243 /* Note: the tag and its argument below are uleb128 values, though
8244 currently-defined values fit in one byte for each. */
8246 attr
->s
= bfd_alloc (abfd
, 3);
8247 attr
->s
[0] = Tag_CPU_arch
;
8252 /* Combine two values for Tag_CPU_arch, taking secondary compatibility tags
8256 tag_cpu_arch_combine (bfd
*ibfd
, int oldtag
, int *secondary_compat_out
,
8257 int newtag
, int secondary_compat
)
8259 #define T(X) TAG_CPU_ARCH_##X
8260 int tagl
, tagh
, result
;
8263 T(V6T2
), /* PRE_V4. */
8267 T(V6T2
), /* V5TE. */
8268 T(V6T2
), /* V5TEJ. */
8275 T(V6K
), /* PRE_V4. */
8280 T(V6K
), /* V5TEJ. */
8282 T(V6KZ
), /* V6KZ. */
8288 T(V7
), /* PRE_V4. */
8307 T(V6K
), /* V5TEJ. */
8309 T(V6KZ
), /* V6KZ. */
8322 T(V6K
), /* V5TEJ. */
8324 T(V6KZ
), /* V6KZ. */
8328 T(V6S_M
), /* V6_M. */
8329 T(V6S_M
) /* V6S_M. */
8331 const int v4t_plus_v6_m
[] =
8337 T(V5TE
), /* V5TE. */
8338 T(V5TEJ
), /* V5TEJ. */
8340 T(V6KZ
), /* V6KZ. */
8341 T(V6T2
), /* V6T2. */
8344 T(V6_M
), /* V6_M. */
8345 T(V6S_M
), /* V6S_M. */
8346 T(V4T_PLUS_V6_M
) /* V4T plus V6_M. */
8355 /* Pseudo-architecture. */
8359 /* Check we've not got a higher architecture than we know about. */
8361 if (oldtag
>= MAX_TAG_CPU_ARCH
|| newtag
>= MAX_TAG_CPU_ARCH
)
8363 _bfd_error_handler (_("ERROR: %B: Unknown CPU architecture"), ibfd
);
8367 /* Override old tag if we have a Tag_also_compatible_with on the output. */
8369 if ((oldtag
== T(V6_M
) && *secondary_compat_out
== T(V4T
))
8370 || (oldtag
== T(V4T
) && *secondary_compat_out
== T(V6_M
)))
8371 oldtag
= T(V4T_PLUS_V6_M
);
8373 /* And override the new tag if we have a Tag_also_compatible_with on the
8376 if ((newtag
== T(V6_M
) && secondary_compat
== T(V4T
))
8377 || (newtag
== T(V4T
) && secondary_compat
== T(V6_M
)))
8378 newtag
= T(V4T_PLUS_V6_M
);
8380 tagl
= (oldtag
< newtag
) ? oldtag
: newtag
;
8381 result
= tagh
= (oldtag
> newtag
) ? oldtag
: newtag
;
8383 /* Architectures before V6KZ add features monotonically. */
8384 if (tagh
<= TAG_CPU_ARCH_V6KZ
)
8387 result
= comb
[tagh
- T(V6T2
)][tagl
];
8389 /* Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
8390 as the canonical version. */
8391 if (result
== T(V4T_PLUS_V6_M
))
8394 *secondary_compat_out
= T(V6_M
);
8397 *secondary_compat_out
= -1;
8401 _bfd_error_handler (_("ERROR: %B: Conflicting CPU architectures %d/%d"),
8402 ibfd
, oldtag
, newtag
);
8410 /* Merge EABI object attributes from IBFD into OBFD. Raise an error if there
8411 are conflicting attributes. */
8414 elf32_arm_merge_eabi_attributes (bfd
*ibfd
, bfd
*obfd
)
8416 obj_attribute
*in_attr
;
8417 obj_attribute
*out_attr
;
8418 obj_attribute_list
*in_list
;
8419 obj_attribute_list
*out_list
;
8420 obj_attribute_list
**out_listp
;
8421 /* Some tags have 0 = don't care, 1 = strong requirement,
8422 2 = weak requirement. */
8423 static const int order_021
[3] = {0, 2, 1};
8424 /* For use with Tag_VFP_arch. */
8425 static const int order_01243
[5] = {0, 1, 2, 4, 3};
8427 bfd_boolean result
= TRUE
;
8429 if (!elf_known_obj_attributes_proc (obfd
)[0].i
)
8431 /* This is the first object. Copy the attributes. */
8432 _bfd_elf_copy_obj_attributes (ibfd
, obfd
);
8434 /* Use the Tag_null value to indicate the attributes have been
8436 elf_known_obj_attributes_proc (obfd
)[0].i
= 1;
8441 in_attr
= elf_known_obj_attributes_proc (ibfd
);
8442 out_attr
= elf_known_obj_attributes_proc (obfd
);
8443 /* This needs to happen before Tag_ABI_FP_number_model is merged. */
8444 if (in_attr
[Tag_ABI_VFP_args
].i
!= out_attr
[Tag_ABI_VFP_args
].i
)
8446 /* Ignore mismatches if the object doesn't use floating point. */
8447 if (out_attr
[Tag_ABI_FP_number_model
].i
== 0)
8448 out_attr
[Tag_ABI_VFP_args
].i
= in_attr
[Tag_ABI_VFP_args
].i
;
8449 else if (in_attr
[Tag_ABI_FP_number_model
].i
!= 0)
8452 (_("ERROR: %B uses VFP register arguments, %B does not"),
8458 for (i
= 4; i
< NUM_KNOWN_OBJ_ATTRIBUTES
; i
++)
8460 /* Merge this attribute with existing attributes. */
8463 case Tag_CPU_raw_name
:
8465 /* These are merged after Tag_CPU_arch. */
8468 case Tag_ABI_optimization_goals
:
8469 case Tag_ABI_FP_optimization_goals
:
8470 /* Use the first value seen. */
8475 int secondary_compat
= -1, secondary_compat_out
= -1;
8476 unsigned int saved_out_attr
= out_attr
[i
].i
;
8477 static const char *name_table
[] = {
8478 /* These aren't real CPU names, but we can't guess
8479 that from the architecture version alone. */
8495 /* Merge Tag_CPU_arch and Tag_also_compatible_with. */
8496 secondary_compat
= get_secondary_compatible_arch (ibfd
);
8497 secondary_compat_out
= get_secondary_compatible_arch (obfd
);
8498 out_attr
[i
].i
= tag_cpu_arch_combine (ibfd
, out_attr
[i
].i
,
8499 &secondary_compat_out
,
8502 set_secondary_compatible_arch (obfd
, secondary_compat_out
);
8504 /* Merge Tag_CPU_name and Tag_CPU_raw_name. */
8505 if (out_attr
[i
].i
== saved_out_attr
)
8506 ; /* Leave the names alone. */
8507 else if (out_attr
[i
].i
== in_attr
[i
].i
)
8509 /* The output architecture has been changed to match the
8510 input architecture. Use the input names. */
8511 out_attr
[Tag_CPU_name
].s
= in_attr
[Tag_CPU_name
].s
8512 ? _bfd_elf_attr_strdup (obfd
, in_attr
[Tag_CPU_name
].s
)
8514 out_attr
[Tag_CPU_raw_name
].s
= in_attr
[Tag_CPU_raw_name
].s
8515 ? _bfd_elf_attr_strdup (obfd
, in_attr
[Tag_CPU_raw_name
].s
)
8520 out_attr
[Tag_CPU_name
].s
= NULL
;
8521 out_attr
[Tag_CPU_raw_name
].s
= NULL
;
8524 /* If we still don't have a value for Tag_CPU_name,
8525 make one up now. Tag_CPU_raw_name remains blank. */
8526 if (out_attr
[Tag_CPU_name
].s
== NULL
8527 && out_attr
[i
].i
< ARRAY_SIZE (name_table
))
8528 out_attr
[Tag_CPU_name
].s
=
8529 _bfd_elf_attr_strdup (obfd
, name_table
[out_attr
[i
].i
]);
8533 case Tag_ARM_ISA_use
:
8534 case Tag_THUMB_ISA_use
:
8536 case Tag_Advanced_SIMD_arch
:
8537 /* ??? Do Advanced_SIMD (NEON) and WMMX conflict? */
8538 case Tag_ABI_FP_rounding
:
8539 case Tag_ABI_FP_exceptions
:
8540 case Tag_ABI_FP_user_exceptions
:
8541 case Tag_ABI_FP_number_model
:
8542 case Tag_VFP_HP_extension
:
8543 case Tag_CPU_unaligned_access
:
8545 case Tag_Virtualization_use
:
8546 case Tag_MPextension_use
:
8547 /* Use the largest value specified. */
8548 if (in_attr
[i
].i
> out_attr
[i
].i
)
8549 out_attr
[i
].i
= in_attr
[i
].i
;
8552 case Tag_ABI_align8_preserved
:
8553 case Tag_ABI_PCS_RO_data
:
8554 /* Use the smallest value specified. */
8555 if (in_attr
[i
].i
< out_attr
[i
].i
)
8556 out_attr
[i
].i
= in_attr
[i
].i
;
8559 case Tag_ABI_align8_needed
:
8560 if ((in_attr
[i
].i
> 0 || out_attr
[i
].i
> 0)
8561 && (in_attr
[Tag_ABI_align8_preserved
].i
== 0
8562 || out_attr
[Tag_ABI_align8_preserved
].i
== 0))
8564 /* This error message should be enabled once all non-conformant
8565 binaries in the toolchain have had the attributes set
8568 (_("ERROR: %B: 8-byte data alignment conflicts with %B"),
8573 case Tag_ABI_FP_denormal
:
8574 case Tag_ABI_PCS_GOT_use
:
8575 /* Use the "greatest" from the sequence 0, 2, 1, or the largest
8576 value if greater than 2 (for future-proofing). */
8577 if ((in_attr
[i
].i
> 2 && in_attr
[i
].i
> out_attr
[i
].i
)
8578 || (in_attr
[i
].i
<= 2 && out_attr
[i
].i
<= 2
8579 && order_021
[in_attr
[i
].i
] > order_021
[out_attr
[i
].i
]))
8580 out_attr
[i
].i
= in_attr
[i
].i
;
8584 case Tag_CPU_arch_profile
:
8585 if (out_attr
[i
].i
!= in_attr
[i
].i
)
8587 /* 0 will merge with anything.
8588 'A' and 'S' merge to 'A'.
8589 'R' and 'S' merge to 'R'.
8590 'M' and 'A|R|S' is an error. */
8591 if (out_attr
[i
].i
== 0
8592 || (out_attr
[i
].i
== 'S'
8593 && (in_attr
[i
].i
== 'A' || in_attr
[i
].i
== 'R')))
8594 out_attr
[i
].i
= in_attr
[i
].i
;
8595 else if (in_attr
[i
].i
== 0
8596 || (in_attr
[i
].i
== 'S'
8597 && (out_attr
[i
].i
== 'A' || out_attr
[i
].i
== 'R')))
8602 (_("ERROR: %B: Conflicting architecture profiles %c/%c"),
8604 in_attr
[i
].i
? in_attr
[i
].i
: '0',
8605 out_attr
[i
].i
? out_attr
[i
].i
: '0');
8611 /* Use the "greatest" from the sequence 0, 1, 2, 4, 3, or the
8612 largest value if greater than 4 (for future-proofing). */
8613 if ((in_attr
[i
].i
> 4 && in_attr
[i
].i
> out_attr
[i
].i
)
8614 || (in_attr
[i
].i
<= 4 && out_attr
[i
].i
<= 4
8615 && order_01243
[in_attr
[i
].i
] > order_01243
[out_attr
[i
].i
]))
8616 out_attr
[i
].i
= in_attr
[i
].i
;
8618 case Tag_PCS_config
:
8619 if (out_attr
[i
].i
== 0)
8620 out_attr
[i
].i
= in_attr
[i
].i
;
8621 else if (in_attr
[i
].i
!= 0 && out_attr
[i
].i
!= 0)
8623 /* It's sometimes ok to mix different configs, so this is only
8626 (_("Warning: %B: Conflicting platform configuration"), ibfd
);
8629 case Tag_ABI_PCS_R9_use
:
8630 if (in_attr
[i
].i
!= out_attr
[i
].i
8631 && out_attr
[i
].i
!= AEABI_R9_unused
8632 && in_attr
[i
].i
!= AEABI_R9_unused
)
8635 (_("ERROR: %B: Conflicting use of R9"), ibfd
);
8638 if (out_attr
[i
].i
== AEABI_R9_unused
)
8639 out_attr
[i
].i
= in_attr
[i
].i
;
8641 case Tag_ABI_PCS_RW_data
:
8642 if (in_attr
[i
].i
== AEABI_PCS_RW_data_SBrel
8643 && out_attr
[Tag_ABI_PCS_R9_use
].i
!= AEABI_R9_SB
8644 && out_attr
[Tag_ABI_PCS_R9_use
].i
!= AEABI_R9_unused
)
8647 (_("ERROR: %B: SB relative addressing conflicts with use of R9"),
8651 /* Use the smallest value specified. */
8652 if (in_attr
[i
].i
< out_attr
[i
].i
)
8653 out_attr
[i
].i
= in_attr
[i
].i
;
8655 case Tag_ABI_PCS_wchar_t
:
8656 if (out_attr
[i
].i
&& in_attr
[i
].i
&& out_attr
[i
].i
!= in_attr
[i
].i
8657 && !elf_arm_tdata (obfd
)->no_wchar_size_warning
)
8660 (_("warning: %B uses %u-byte wchar_t yet the output is to use %u-byte wchar_t; use of wchar_t values across objects may fail"),
8661 ibfd
, in_attr
[i
].i
, out_attr
[i
].i
);
8663 else if (in_attr
[i
].i
&& !out_attr
[i
].i
)
8664 out_attr
[i
].i
= in_attr
[i
].i
;
8666 case Tag_ABI_enum_size
:
8667 if (in_attr
[i
].i
!= AEABI_enum_unused
)
8669 if (out_attr
[i
].i
== AEABI_enum_unused
8670 || out_attr
[i
].i
== AEABI_enum_forced_wide
)
8672 /* The existing object is compatible with anything.
8673 Use whatever requirements the new object has. */
8674 out_attr
[i
].i
= in_attr
[i
].i
;
8676 else if (in_attr
[i
].i
!= AEABI_enum_forced_wide
8677 && out_attr
[i
].i
!= in_attr
[i
].i
8678 && !elf_arm_tdata (obfd
)->no_enum_size_warning
)
8680 static const char *aeabi_enum_names
[] =
8681 { "", "variable-size", "32-bit", "" };
8682 const char *in_name
=
8683 in_attr
[i
].i
< ARRAY_SIZE(aeabi_enum_names
)
8684 ? aeabi_enum_names
[in_attr
[i
].i
]
8686 const char *out_name
=
8687 out_attr
[i
].i
< ARRAY_SIZE(aeabi_enum_names
)
8688 ? aeabi_enum_names
[out_attr
[i
].i
]
8691 (_("warning: %B uses %s enums yet the output is to use %s enums; use of enum values across objects may fail"),
8692 ibfd
, in_name
, out_name
);
8696 case Tag_ABI_VFP_args
:
8699 case Tag_ABI_WMMX_args
:
8700 if (in_attr
[i
].i
!= out_attr
[i
].i
)
8703 (_("ERROR: %B uses iWMMXt register arguments, %B does not"),
8708 case Tag_compatibility
:
8709 /* Merged in target-independent code. */
8711 case Tag_ABI_HardFP_use
:
8712 /* 1 (SP) and 2 (DP) conflict, so combine to 3 (SP & DP). */
8713 if ((in_attr
[i
].i
== 1 && out_attr
[i
].i
== 2)
8714 || (in_attr
[i
].i
== 2 && out_attr
[i
].i
== 1))
8716 else if (in_attr
[i
].i
> out_attr
[i
].i
)
8717 out_attr
[i
].i
= in_attr
[i
].i
;
8719 case Tag_ABI_FP_16bit_format
:
8720 if (in_attr
[i
].i
!= 0 && out_attr
[i
].i
!= 0)
8722 if (in_attr
[i
].i
!= out_attr
[i
].i
)
8725 (_("ERROR: fp16 format mismatch between %B and %B"),
8730 if (in_attr
[i
].i
!= 0)
8731 out_attr
[i
].i
= in_attr
[i
].i
;
8734 case Tag_nodefaults
:
8735 /* This tag is set if it exists, but the value is unused (and is
8736 typically zero). We don't actually need to do anything here -
8737 the merge happens automatically when the type flags are merged
8740 case Tag_also_compatible_with
:
8741 /* Already done in Tag_CPU_arch. */
8743 case Tag_conformance
:
8744 /* Keep the attribute if it matches. Throw it away otherwise.
8745 No attribute means no claim to conform. */
8746 if (!in_attr
[i
].s
|| !out_attr
[i
].s
8747 || strcmp (in_attr
[i
].s
, out_attr
[i
].s
) != 0)
8748 out_attr
[i
].s
= NULL
;
8753 bfd
*err_bfd
= NULL
;
8755 /* The "known_obj_attributes" table does contain some undefined
8756 attributes. Ensure that there are unused. */
8757 if (out_attr
[i
].i
!= 0 || out_attr
[i
].s
!= NULL
)
8759 else if (in_attr
[i
].i
!= 0 || in_attr
[i
].s
!= NULL
)
8762 if (err_bfd
!= NULL
)
8764 /* Attribute numbers >=64 (mod 128) can be safely ignored. */
8768 (_("%B: Unknown mandatory EABI object attribute %d"),
8770 bfd_set_error (bfd_error_bad_value
);
8776 (_("Warning: %B: Unknown EABI object attribute %d"),
8781 /* Only pass on attributes that match in both inputs. */
8782 if (in_attr
[i
].i
!= out_attr
[i
].i
8783 || in_attr
[i
].s
!= out_attr
[i
].s
8784 || (in_attr
[i
].s
!= NULL
&& out_attr
[i
].s
!= NULL
8785 && strcmp (in_attr
[i
].s
, out_attr
[i
].s
) != 0))
8788 out_attr
[i
].s
= NULL
;
8793 /* If out_attr was copied from in_attr then it won't have a type yet. */
8794 if (in_attr
[i
].type
&& !out_attr
[i
].type
)
8795 out_attr
[i
].type
= in_attr
[i
].type
;
8798 /* Merge Tag_compatibility attributes and any common GNU ones. */
8799 _bfd_elf_merge_object_attributes (ibfd
, obfd
);
8801 /* Check for any attributes not known on ARM. */
8802 in_list
= elf_other_obj_attributes_proc (ibfd
);
8803 out_listp
= &elf_other_obj_attributes_proc (obfd
);
8804 out_list
= *out_listp
;
8806 for (; in_list
|| out_list
; )
8808 bfd
*err_bfd
= NULL
;
8811 /* The tags for each list are in numerical order. */
8812 /* If the tags are equal, then merge. */
8813 if (out_list
&& (!in_list
|| in_list
->tag
> out_list
->tag
))
8815 /* This attribute only exists in obfd. We can't merge, and we don't
8816 know what the tag means, so delete it. */
8818 err_tag
= out_list
->tag
;
8819 *out_listp
= out_list
->next
;
8820 out_list
= *out_listp
;
8822 else if (in_list
&& (!out_list
|| in_list
->tag
< out_list
->tag
))
8824 /* This attribute only exists in ibfd. We can't merge, and we don't
8825 know what the tag means, so ignore it. */
8827 err_tag
= in_list
->tag
;
8828 in_list
= in_list
->next
;
8830 else /* The tags are equal. */
8832 /* As present, all attributes in the list are unknown, and
8833 therefore can't be merged meaningfully. */
8835 err_tag
= out_list
->tag
;
8837 /* Only pass on attributes that match in both inputs. */
8838 if (in_list
->attr
.i
!= out_list
->attr
.i
8839 || in_list
->attr
.s
!= out_list
->attr
.s
8840 || (in_list
->attr
.s
&& out_list
->attr
.s
8841 && strcmp (in_list
->attr
.s
, out_list
->attr
.s
) != 0))
8843 /* No match. Delete the attribute. */
8844 *out_listp
= out_list
->next
;
8845 out_list
= *out_listp
;
8849 /* Matched. Keep the attribute and move to the next. */
8850 out_list
= out_list
->next
;
8851 in_list
= in_list
->next
;
8857 /* Attribute numbers >=64 (mod 128) can be safely ignored. */
8858 if ((err_tag
& 127) < 64)
8861 (_("%B: Unknown mandatory EABI object attribute %d"),
8863 bfd_set_error (bfd_error_bad_value
);
8869 (_("Warning: %B: Unknown EABI object attribute %d"),
8878 /* Return TRUE if the two EABI versions are incompatible. */
8881 elf32_arm_versions_compatible (unsigned iver
, unsigned over
)
8883 /* v4 and v5 are the same spec before and after it was released,
8884 so allow mixing them. */
8885 if ((iver
== EF_ARM_EABI_VER4
&& over
== EF_ARM_EABI_VER5
)
8886 || (iver
== EF_ARM_EABI_VER5
&& over
== EF_ARM_EABI_VER4
))
8889 return (iver
== over
);
8892 /* Merge backend specific data from an object file to the output
8893 object file when linking. */
8896 elf32_arm_merge_private_bfd_data (bfd
* ibfd
, bfd
* obfd
)
8900 bfd_boolean flags_compatible
= TRUE
;
8903 /* Check if we have the same endianess. */
8904 if (! _bfd_generic_verify_endian_match (ibfd
, obfd
))
8907 if (! is_arm_elf (ibfd
) || ! is_arm_elf (obfd
))
8910 if (!elf32_arm_merge_eabi_attributes (ibfd
, obfd
))
8913 /* The input BFD must have had its flags initialised. */
8914 /* The following seems bogus to me -- The flags are initialized in
8915 the assembler but I don't think an elf_flags_init field is
8916 written into the object. */
8917 /* BFD_ASSERT (elf_flags_init (ibfd)); */
8919 in_flags
= elf_elfheader (ibfd
)->e_flags
;
8920 out_flags
= elf_elfheader (obfd
)->e_flags
;
8922 /* In theory there is no reason why we couldn't handle this. However
8923 in practice it isn't even close to working and there is no real
8924 reason to want it. */
8925 if (EF_ARM_EABI_VERSION (in_flags
) >= EF_ARM_EABI_VER4
8926 && !(ibfd
->flags
& DYNAMIC
)
8927 && (in_flags
& EF_ARM_BE8
))
8929 _bfd_error_handler (_("ERROR: %B is already in final BE8 format"),
8934 if (!elf_flags_init (obfd
))
8936 /* If the input is the default architecture and had the default
8937 flags then do not bother setting the flags for the output
8938 architecture, instead allow future merges to do this. If no
8939 future merges ever set these flags then they will retain their
8940 uninitialised values, which surprise surprise, correspond
8941 to the default values. */
8942 if (bfd_get_arch_info (ibfd
)->the_default
8943 && elf_elfheader (ibfd
)->e_flags
== 0)
8946 elf_flags_init (obfd
) = TRUE
;
8947 elf_elfheader (obfd
)->e_flags
= in_flags
;
8949 if (bfd_get_arch (obfd
) == bfd_get_arch (ibfd
)
8950 && bfd_get_arch_info (obfd
)->the_default
)
8951 return bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
), bfd_get_mach (ibfd
));
8956 /* Determine what should happen if the input ARM architecture
8957 does not match the output ARM architecture. */
8958 if (! bfd_arm_merge_machines (ibfd
, obfd
))
8961 /* Identical flags must be compatible. */
8962 if (in_flags
== out_flags
)
8965 /* Check to see if the input BFD actually contains any sections. If
8966 not, its flags may not have been initialised either, but it
8967 cannot actually cause any incompatiblity. Do not short-circuit
8968 dynamic objects; their section list may be emptied by
8969 elf_link_add_object_symbols.
8971 Also check to see if there are no code sections in the input.
8972 In this case there is no need to check for code specific flags.
8973 XXX - do we need to worry about floating-point format compatability
8974 in data sections ? */
8975 if (!(ibfd
->flags
& DYNAMIC
))
8977 bfd_boolean null_input_bfd
= TRUE
;
8978 bfd_boolean only_data_sections
= TRUE
;
8980 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
8982 /* Ignore synthetic glue sections. */
8983 if (strcmp (sec
->name
, ".glue_7")
8984 && strcmp (sec
->name
, ".glue_7t"))
8986 if ((bfd_get_section_flags (ibfd
, sec
)
8987 & (SEC_LOAD
| SEC_CODE
| SEC_HAS_CONTENTS
))
8988 == (SEC_LOAD
| SEC_CODE
| SEC_HAS_CONTENTS
))
8989 only_data_sections
= FALSE
;
8991 null_input_bfd
= FALSE
;
8996 if (null_input_bfd
|| only_data_sections
)
9000 /* Complain about various flag mismatches. */
9001 if (!elf32_arm_versions_compatible (EF_ARM_EABI_VERSION (in_flags
),
9002 EF_ARM_EABI_VERSION (out_flags
)))
9005 (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
9007 (in_flags
& EF_ARM_EABIMASK
) >> 24,
9008 (out_flags
& EF_ARM_EABIMASK
) >> 24);
9012 /* Not sure what needs to be checked for EABI versions >= 1. */
9013 /* VxWorks libraries do not use these flags. */
9014 if (get_elf_backend_data (obfd
) != &elf32_arm_vxworks_bed
9015 && get_elf_backend_data (ibfd
) != &elf32_arm_vxworks_bed
9016 && EF_ARM_EABI_VERSION (in_flags
) == EF_ARM_EABI_UNKNOWN
)
9018 if ((in_flags
& EF_ARM_APCS_26
) != (out_flags
& EF_ARM_APCS_26
))
9021 (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
9023 in_flags
& EF_ARM_APCS_26
? 26 : 32,
9024 out_flags
& EF_ARM_APCS_26
? 26 : 32);
9025 flags_compatible
= FALSE
;
9028 if ((in_flags
& EF_ARM_APCS_FLOAT
) != (out_flags
& EF_ARM_APCS_FLOAT
))
9030 if (in_flags
& EF_ARM_APCS_FLOAT
)
9032 (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"),
9036 (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"),
9039 flags_compatible
= FALSE
;
9042 if ((in_flags
& EF_ARM_VFP_FLOAT
) != (out_flags
& EF_ARM_VFP_FLOAT
))
9044 if (in_flags
& EF_ARM_VFP_FLOAT
)
9046 (_("ERROR: %B uses VFP instructions, whereas %B does not"),
9050 (_("ERROR: %B uses FPA instructions, whereas %B does not"),
9053 flags_compatible
= FALSE
;
9056 if ((in_flags
& EF_ARM_MAVERICK_FLOAT
) != (out_flags
& EF_ARM_MAVERICK_FLOAT
))
9058 if (in_flags
& EF_ARM_MAVERICK_FLOAT
)
9060 (_("ERROR: %B uses Maverick instructions, whereas %B does not"),
9064 (_("ERROR: %B does not use Maverick instructions, whereas %B does"),
9067 flags_compatible
= FALSE
;
9070 #ifdef EF_ARM_SOFT_FLOAT
9071 if ((in_flags
& EF_ARM_SOFT_FLOAT
) != (out_flags
& EF_ARM_SOFT_FLOAT
))
9073 /* We can allow interworking between code that is VFP format
9074 layout, and uses either soft float or integer regs for
9075 passing floating point arguments and results. We already
9076 know that the APCS_FLOAT flags match; similarly for VFP
9078 if ((in_flags
& EF_ARM_APCS_FLOAT
) != 0
9079 || (in_flags
& EF_ARM_VFP_FLOAT
) == 0)
9081 if (in_flags
& EF_ARM_SOFT_FLOAT
)
9083 (_("ERROR: %B uses software FP, whereas %B uses hardware FP"),
9087 (_("ERROR: %B uses hardware FP, whereas %B uses software FP"),
9090 flags_compatible
= FALSE
;
9095 /* Interworking mismatch is only a warning. */
9096 if ((in_flags
& EF_ARM_INTERWORK
) != (out_flags
& EF_ARM_INTERWORK
))
9098 if (in_flags
& EF_ARM_INTERWORK
)
9101 (_("Warning: %B supports interworking, whereas %B does not"),
9107 (_("Warning: %B does not support interworking, whereas %B does"),
9113 return flags_compatible
;
9116 /* Display the flags field. */
9119 elf32_arm_print_private_bfd_data (bfd
*abfd
, void * ptr
)
9121 FILE * file
= (FILE *) ptr
;
9122 unsigned long flags
;
9124 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
9126 /* Print normal ELF private data. */
9127 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
9129 flags
= elf_elfheader (abfd
)->e_flags
;
9130 /* Ignore init flag - it may not be set, despite the flags field
9131 containing valid data. */
9133 /* xgettext:c-format */
9134 fprintf (file
, _("private flags = %lx:"), elf_elfheader (abfd
)->e_flags
);
9136 switch (EF_ARM_EABI_VERSION (flags
))
9138 case EF_ARM_EABI_UNKNOWN
:
9139 /* The following flag bits are GNU extensions and not part of the
9140 official ARM ELF extended ABI. Hence they are only decoded if
9141 the EABI version is not set. */
9142 if (flags
& EF_ARM_INTERWORK
)
9143 fprintf (file
, _(" [interworking enabled]"));
9145 if (flags
& EF_ARM_APCS_26
)
9146 fprintf (file
, " [APCS-26]");
9148 fprintf (file
, " [APCS-32]");
9150 if (flags
& EF_ARM_VFP_FLOAT
)
9151 fprintf (file
, _(" [VFP float format]"));
9152 else if (flags
& EF_ARM_MAVERICK_FLOAT
)
9153 fprintf (file
, _(" [Maverick float format]"));
9155 fprintf (file
, _(" [FPA float format]"));
9157 if (flags
& EF_ARM_APCS_FLOAT
)
9158 fprintf (file
, _(" [floats passed in float registers]"));
9160 if (flags
& EF_ARM_PIC
)
9161 fprintf (file
, _(" [position independent]"));
9163 if (flags
& EF_ARM_NEW_ABI
)
9164 fprintf (file
, _(" [new ABI]"));
9166 if (flags
& EF_ARM_OLD_ABI
)
9167 fprintf (file
, _(" [old ABI]"));
9169 if (flags
& EF_ARM_SOFT_FLOAT
)
9170 fprintf (file
, _(" [software FP]"));
9172 flags
&= ~(EF_ARM_INTERWORK
| EF_ARM_APCS_26
| EF_ARM_APCS_FLOAT
9173 | EF_ARM_PIC
| EF_ARM_NEW_ABI
| EF_ARM_OLD_ABI
9174 | EF_ARM_SOFT_FLOAT
| EF_ARM_VFP_FLOAT
9175 | EF_ARM_MAVERICK_FLOAT
);
9178 case EF_ARM_EABI_VER1
:
9179 fprintf (file
, _(" [Version1 EABI]"));
9181 if (flags
& EF_ARM_SYMSARESORTED
)
9182 fprintf (file
, _(" [sorted symbol table]"));
9184 fprintf (file
, _(" [unsorted symbol table]"));
9186 flags
&= ~ EF_ARM_SYMSARESORTED
;
9189 case EF_ARM_EABI_VER2
:
9190 fprintf (file
, _(" [Version2 EABI]"));
9192 if (flags
& EF_ARM_SYMSARESORTED
)
9193 fprintf (file
, _(" [sorted symbol table]"));
9195 fprintf (file
, _(" [unsorted symbol table]"));
9197 if (flags
& EF_ARM_DYNSYMSUSESEGIDX
)
9198 fprintf (file
, _(" [dynamic symbols use segment index]"));
9200 if (flags
& EF_ARM_MAPSYMSFIRST
)
9201 fprintf (file
, _(" [mapping symbols precede others]"));
9203 flags
&= ~(EF_ARM_SYMSARESORTED
| EF_ARM_DYNSYMSUSESEGIDX
9204 | EF_ARM_MAPSYMSFIRST
);
9207 case EF_ARM_EABI_VER3
:
9208 fprintf (file
, _(" [Version3 EABI]"));
9211 case EF_ARM_EABI_VER4
:
9212 fprintf (file
, _(" [Version4 EABI]"));
9215 case EF_ARM_EABI_VER5
:
9216 fprintf (file
, _(" [Version5 EABI]"));
9218 if (flags
& EF_ARM_BE8
)
9219 fprintf (file
, _(" [BE8]"));
9221 if (flags
& EF_ARM_LE8
)
9222 fprintf (file
, _(" [LE8]"));
9224 flags
&= ~(EF_ARM_LE8
| EF_ARM_BE8
);
9228 fprintf (file
, _(" <EABI version unrecognised>"));
9232 flags
&= ~ EF_ARM_EABIMASK
;
9234 if (flags
& EF_ARM_RELEXEC
)
9235 fprintf (file
, _(" [relocatable executable]"));
9237 if (flags
& EF_ARM_HASENTRY
)
9238 fprintf (file
, _(" [has entry point]"));
9240 flags
&= ~ (EF_ARM_RELEXEC
| EF_ARM_HASENTRY
);
9243 fprintf (file
, _("<Unrecognised flag bits set>"));
9251 elf32_arm_get_symbol_type (Elf_Internal_Sym
* elf_sym
, int type
)
9253 switch (ELF_ST_TYPE (elf_sym
->st_info
))
9256 return ELF_ST_TYPE (elf_sym
->st_info
);
9259 /* If the symbol is not an object, return the STT_ARM_16BIT flag.
9260 This allows us to distinguish between data used by Thumb instructions
9261 and non-data (which is probably code) inside Thumb regions of an
9263 if (type
!= STT_OBJECT
&& type
!= STT_TLS
)
9264 return ELF_ST_TYPE (elf_sym
->st_info
);
9275 elf32_arm_gc_mark_hook (asection
*sec
,
9276 struct bfd_link_info
*info
,
9277 Elf_Internal_Rela
*rel
,
9278 struct elf_link_hash_entry
*h
,
9279 Elf_Internal_Sym
*sym
)
9282 switch (ELF32_R_TYPE (rel
->r_info
))
9284 case R_ARM_GNU_VTINHERIT
:
9285 case R_ARM_GNU_VTENTRY
:
9289 return _bfd_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
);
9292 /* Update the got entry reference counts for the section being removed. */
9295 elf32_arm_gc_sweep_hook (bfd
* abfd
,
9296 struct bfd_link_info
* info
,
9298 const Elf_Internal_Rela
* relocs
)
9300 Elf_Internal_Shdr
*symtab_hdr
;
9301 struct elf_link_hash_entry
**sym_hashes
;
9302 bfd_signed_vma
*local_got_refcounts
;
9303 const Elf_Internal_Rela
*rel
, *relend
;
9304 struct elf32_arm_link_hash_table
* globals
;
9306 if (info
->relocatable
)
9309 globals
= elf32_arm_hash_table (info
);
9311 elf_section_data (sec
)->local_dynrel
= NULL
;
9313 symtab_hdr
= & elf_symtab_hdr (abfd
);
9314 sym_hashes
= elf_sym_hashes (abfd
);
9315 local_got_refcounts
= elf_local_got_refcounts (abfd
);
9317 check_use_blx (globals
);
9319 relend
= relocs
+ sec
->reloc_count
;
9320 for (rel
= relocs
; rel
< relend
; rel
++)
9322 unsigned long r_symndx
;
9323 struct elf_link_hash_entry
*h
= NULL
;
9326 r_symndx
= ELF32_R_SYM (rel
->r_info
);
9327 if (r_symndx
>= symtab_hdr
->sh_info
)
9329 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
9330 while (h
->root
.type
== bfd_link_hash_indirect
9331 || h
->root
.type
== bfd_link_hash_warning
)
9332 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
9335 r_type
= ELF32_R_TYPE (rel
->r_info
);
9336 r_type
= arm_real_reloc_type (globals
, r_type
);
9340 case R_ARM_GOT_PREL
:
9341 case R_ARM_TLS_GD32
:
9342 case R_ARM_TLS_IE32
:
9345 if (h
->got
.refcount
> 0)
9346 h
->got
.refcount
-= 1;
9348 else if (local_got_refcounts
!= NULL
)
9350 if (local_got_refcounts
[r_symndx
] > 0)
9351 local_got_refcounts
[r_symndx
] -= 1;
9355 case R_ARM_TLS_LDM32
:
9356 elf32_arm_hash_table (info
)->tls_ldm_got
.refcount
-= 1;
9360 case R_ARM_ABS32_NOI
:
9362 case R_ARM_REL32_NOI
:
9368 case R_ARM_THM_CALL
:
9369 case R_ARM_THM_JUMP24
:
9370 case R_ARM_THM_JUMP19
:
9371 case R_ARM_MOVW_ABS_NC
:
9372 case R_ARM_MOVT_ABS
:
9373 case R_ARM_MOVW_PREL_NC
:
9374 case R_ARM_MOVT_PREL
:
9375 case R_ARM_THM_MOVW_ABS_NC
:
9376 case R_ARM_THM_MOVT_ABS
:
9377 case R_ARM_THM_MOVW_PREL_NC
:
9378 case R_ARM_THM_MOVT_PREL
:
9379 /* Should the interworking branches be here also? */
9383 struct elf32_arm_link_hash_entry
*eh
;
9384 struct elf32_arm_relocs_copied
**pp
;
9385 struct elf32_arm_relocs_copied
*p
;
9387 eh
= (struct elf32_arm_link_hash_entry
*) h
;
9389 if (h
->plt
.refcount
> 0)
9391 h
->plt
.refcount
-= 1;
9392 if (r_type
== R_ARM_THM_CALL
)
9393 eh
->plt_maybe_thumb_refcount
--;
9395 if (r_type
== R_ARM_THM_JUMP24
9396 || r_type
== R_ARM_THM_JUMP19
)
9397 eh
->plt_thumb_refcount
--;
9400 if (r_type
== R_ARM_ABS32
9401 || r_type
== R_ARM_REL32
9402 || r_type
== R_ARM_ABS32_NOI
9403 || r_type
== R_ARM_REL32_NOI
)
9405 for (pp
= &eh
->relocs_copied
; (p
= *pp
) != NULL
;
9407 if (p
->section
== sec
)
9410 if (ELF32_R_TYPE (rel
->r_info
) == R_ARM_REL32
9411 || ELF32_R_TYPE (rel
->r_info
) == R_ARM_REL32_NOI
)
9429 /* Look through the relocs for a section during the first phase. */
9432 elf32_arm_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
,
9433 asection
*sec
, const Elf_Internal_Rela
*relocs
)
9435 Elf_Internal_Shdr
*symtab_hdr
;
9436 struct elf_link_hash_entry
**sym_hashes
;
9437 const Elf_Internal_Rela
*rel
;
9438 const Elf_Internal_Rela
*rel_end
;
9441 bfd_vma
*local_got_offsets
;
9442 struct elf32_arm_link_hash_table
*htab
;
9443 bfd_boolean needs_plt
;
9445 if (info
->relocatable
)
9448 BFD_ASSERT (is_arm_elf (abfd
));
9450 htab
= elf32_arm_hash_table (info
);
9453 /* Create dynamic sections for relocatable executables so that we can
9454 copy relocations. */
9455 if (htab
->root
.is_relocatable_executable
9456 && ! htab
->root
.dynamic_sections_created
)
9458 if (! _bfd_elf_link_create_dynamic_sections (abfd
, info
))
9462 dynobj
= elf_hash_table (info
)->dynobj
;
9463 local_got_offsets
= elf_local_got_offsets (abfd
);
9465 symtab_hdr
= & elf_symtab_hdr (abfd
);
9466 sym_hashes
= elf_sym_hashes (abfd
);
9468 rel_end
= relocs
+ sec
->reloc_count
;
9469 for (rel
= relocs
; rel
< rel_end
; rel
++)
9471 struct elf_link_hash_entry
*h
;
9472 struct elf32_arm_link_hash_entry
*eh
;
9473 unsigned long r_symndx
;
9476 r_symndx
= ELF32_R_SYM (rel
->r_info
);
9477 r_type
= ELF32_R_TYPE (rel
->r_info
);
9478 r_type
= arm_real_reloc_type (htab
, r_type
);
9480 if (r_symndx
>= NUM_SHDR_ENTRIES (symtab_hdr
))
9482 (*_bfd_error_handler
) (_("%B: bad symbol index: %d"), abfd
,
9487 if (r_symndx
< symtab_hdr
->sh_info
)
9491 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
9492 while (h
->root
.type
== bfd_link_hash_indirect
9493 || h
->root
.type
== bfd_link_hash_warning
)
9494 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
9497 eh
= (struct elf32_arm_link_hash_entry
*) h
;
9502 case R_ARM_GOT_PREL
:
9503 case R_ARM_TLS_GD32
:
9504 case R_ARM_TLS_IE32
:
9505 /* This symbol requires a global offset table entry. */
9507 int tls_type
, old_tls_type
;
9511 case R_ARM_TLS_GD32
: tls_type
= GOT_TLS_GD
; break;
9512 case R_ARM_TLS_IE32
: tls_type
= GOT_TLS_IE
; break;
9513 default: tls_type
= GOT_NORMAL
; break;
9519 old_tls_type
= elf32_arm_hash_entry (h
)->tls_type
;
9523 bfd_signed_vma
*local_got_refcounts
;
9525 /* This is a global offset table entry for a local symbol. */
9526 local_got_refcounts
= elf_local_got_refcounts (abfd
);
9527 if (local_got_refcounts
== NULL
)
9531 size
= symtab_hdr
->sh_info
;
9532 size
*= (sizeof (bfd_signed_vma
) + sizeof (char));
9533 local_got_refcounts
= bfd_zalloc (abfd
, size
);
9534 if (local_got_refcounts
== NULL
)
9536 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
9537 elf32_arm_local_got_tls_type (abfd
)
9538 = (char *) (local_got_refcounts
+ symtab_hdr
->sh_info
);
9540 local_got_refcounts
[r_symndx
] += 1;
9541 old_tls_type
= elf32_arm_local_got_tls_type (abfd
) [r_symndx
];
9544 /* We will already have issued an error message if there is a
9545 TLS / non-TLS mismatch, based on the symbol type. We don't
9546 support any linker relaxations. So just combine any TLS
9548 if (old_tls_type
!= GOT_UNKNOWN
&& old_tls_type
!= GOT_NORMAL
9549 && tls_type
!= GOT_NORMAL
)
9550 tls_type
|= old_tls_type
;
9552 if (old_tls_type
!= tls_type
)
9555 elf32_arm_hash_entry (h
)->tls_type
= tls_type
;
9557 elf32_arm_local_got_tls_type (abfd
) [r_symndx
] = tls_type
;
9562 case R_ARM_TLS_LDM32
:
9563 if (r_type
== R_ARM_TLS_LDM32
)
9564 htab
->tls_ldm_got
.refcount
++;
9567 case R_ARM_GOTOFF32
:
9569 if (htab
->sgot
== NULL
)
9571 if (htab
->root
.dynobj
== NULL
)
9572 htab
->root
.dynobj
= abfd
;
9573 if (!create_got_section (htab
->root
.dynobj
, info
))
9579 /* VxWorks uses dynamic R_ARM_ABS12 relocations for
9580 ldr __GOTT_INDEX__ offsets. */
9581 if (!htab
->vxworks_p
)
9590 case R_ARM_THM_CALL
:
9591 case R_ARM_THM_JUMP24
:
9592 case R_ARM_THM_JUMP19
:
9597 case R_ARM_ABS32_NOI
:
9599 case R_ARM_REL32_NOI
:
9600 case R_ARM_MOVW_ABS_NC
:
9601 case R_ARM_MOVT_ABS
:
9602 case R_ARM_MOVW_PREL_NC
:
9603 case R_ARM_MOVT_PREL
:
9604 case R_ARM_THM_MOVW_ABS_NC
:
9605 case R_ARM_THM_MOVT_ABS
:
9606 case R_ARM_THM_MOVW_PREL_NC
:
9607 case R_ARM_THM_MOVT_PREL
:
9611 /* Should the interworking branches be listed here? */
9614 /* If this reloc is in a read-only section, we might
9615 need a copy reloc. We can't check reliably at this
9616 stage whether the section is read-only, as input
9617 sections have not yet been mapped to output sections.
9618 Tentatively set the flag for now, and correct in
9619 adjust_dynamic_symbol. */
9623 /* We may need a .plt entry if the function this reloc
9624 refers to is in a different object. We can't tell for
9625 sure yet, because something later might force the
9630 /* If we create a PLT entry, this relocation will reference
9631 it, even if it's an ABS32 relocation. */
9632 h
->plt
.refcount
+= 1;
9634 /* It's too early to use htab->use_blx here, so we have to
9635 record possible blx references separately from
9636 relocs that definitely need a thumb stub. */
9638 if (r_type
== R_ARM_THM_CALL
)
9639 eh
->plt_maybe_thumb_refcount
+= 1;
9641 if (r_type
== R_ARM_THM_JUMP24
9642 || r_type
== R_ARM_THM_JUMP19
)
9643 eh
->plt_thumb_refcount
+= 1;
9646 /* If we are creating a shared library or relocatable executable,
9647 and this is a reloc against a global symbol, or a non PC
9648 relative reloc against a local symbol, then we need to copy
9649 the reloc into the shared library. However, if we are linking
9650 with -Bsymbolic, we do not need to copy a reloc against a
9651 global symbol which is defined in an object we are
9652 including in the link (i.e., DEF_REGULAR is set). At
9653 this point we have not seen all the input files, so it is
9654 possible that DEF_REGULAR is not set now but will be set
9655 later (it is never cleared). We account for that
9656 possibility below by storing information in the
9657 relocs_copied field of the hash table entry. */
9658 if ((info
->shared
|| htab
->root
.is_relocatable_executable
)
9659 && (sec
->flags
& SEC_ALLOC
) != 0
9660 && ((r_type
== R_ARM_ABS32
|| r_type
== R_ARM_ABS32_NOI
)
9661 || (h
!= NULL
&& ! h
->needs_plt
9662 && (! info
->symbolic
|| ! h
->def_regular
))))
9664 struct elf32_arm_relocs_copied
*p
, **head
;
9666 /* When creating a shared object, we must copy these
9667 reloc types into the output file. We create a reloc
9668 section in dynobj and make room for this reloc. */
9671 sreloc
= _bfd_elf_make_dynamic_reloc_section
9672 (sec
, dynobj
, 2, abfd
, ! htab
->use_rel
);
9677 /* BPABI objects never have dynamic relocations mapped. */
9678 if (! htab
->symbian_p
)
9682 flags
= bfd_get_section_flags (dynobj
, sreloc
);
9683 flags
|= (SEC_LOAD
| SEC_ALLOC
);
9684 bfd_set_section_flags (dynobj
, sreloc
, flags
);
9688 /* If this is a global symbol, we count the number of
9689 relocations we need for this symbol. */
9692 head
= &((struct elf32_arm_link_hash_entry
*) h
)->relocs_copied
;
9696 /* Track dynamic relocs needed for local syms too.
9697 We really need local syms available to do this
9703 s
= bfd_section_from_r_symndx (abfd
, &htab
->sym_sec
,
9708 vpp
= &elf_section_data (s
)->local_dynrel
;
9709 head
= (struct elf32_arm_relocs_copied
**) vpp
;
9713 if (p
== NULL
|| p
->section
!= sec
)
9715 bfd_size_type amt
= sizeof *p
;
9717 p
= bfd_alloc (htab
->root
.dynobj
, amt
);
9727 if (r_type
== R_ARM_REL32
|| r_type
== R_ARM_REL32_NOI
)
9733 /* This relocation describes the C++ object vtable hierarchy.
9734 Reconstruct it for later use during GC. */
9735 case R_ARM_GNU_VTINHERIT
:
9736 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
9740 /* This relocation describes which C++ vtable entries are actually
9741 used. Record for later use during GC. */
9742 case R_ARM_GNU_VTENTRY
:
9743 BFD_ASSERT (h
!= NULL
);
9745 && !bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_offset
))
9754 /* Unwinding tables are not referenced directly. This pass marks them as
9755 required if the corresponding code section is marked. */
9758 elf32_arm_gc_mark_extra_sections (struct bfd_link_info
*info
,
9759 elf_gc_mark_hook_fn gc_mark_hook
)
9762 Elf_Internal_Shdr
**elf_shdrp
;
9765 /* Marking EH data may cause additional code sections to be marked,
9766 requiring multiple passes. */
9771 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link_next
)
9775 if (! is_arm_elf (sub
))
9778 elf_shdrp
= elf_elfsections (sub
);
9779 for (o
= sub
->sections
; o
!= NULL
; o
= o
->next
)
9781 Elf_Internal_Shdr
*hdr
;
9783 hdr
= &elf_section_data (o
)->this_hdr
;
9784 if (hdr
->sh_type
== SHT_ARM_EXIDX
9786 && hdr
->sh_link
< elf_numsections (sub
)
9788 && elf_shdrp
[hdr
->sh_link
]->bfd_section
->gc_mark
)
9791 if (!_bfd_elf_gc_mark (info
, o
, gc_mark_hook
))
9801 /* Treat mapping symbols as special target symbols. */
9804 elf32_arm_is_target_special_symbol (bfd
* abfd ATTRIBUTE_UNUSED
, asymbol
* sym
)
9806 return bfd_is_arm_special_symbol_name (sym
->name
,
9807 BFD_ARM_SPECIAL_SYM_TYPE_ANY
);
9810 /* This is a copy of elf_find_function() from elf.c except that
9811 ARM mapping symbols are ignored when looking for function names
9812 and STT_ARM_TFUNC is considered to a function type. */
9815 arm_elf_find_function (bfd
* abfd ATTRIBUTE_UNUSED
,
9819 const char ** filename_ptr
,
9820 const char ** functionname_ptr
)
9822 const char * filename
= NULL
;
9823 asymbol
* func
= NULL
;
9824 bfd_vma low_func
= 0;
9827 for (p
= symbols
; *p
!= NULL
; p
++)
9831 q
= (elf_symbol_type
*) *p
;
9833 switch (ELF_ST_TYPE (q
->internal_elf_sym
.st_info
))
9838 filename
= bfd_asymbol_name (&q
->symbol
);
9843 /* Skip mapping symbols. */
9844 if ((q
->symbol
.flags
& BSF_LOCAL
)
9845 && bfd_is_arm_special_symbol_name (q
->symbol
.name
,
9846 BFD_ARM_SPECIAL_SYM_TYPE_ANY
))
9849 if (bfd_get_section (&q
->symbol
) == section
9850 && q
->symbol
.value
>= low_func
9851 && q
->symbol
.value
<= offset
)
9853 func
= (asymbol
*) q
;
9854 low_func
= q
->symbol
.value
;
9864 *filename_ptr
= filename
;
9865 if (functionname_ptr
)
9866 *functionname_ptr
= bfd_asymbol_name (func
);
9872 /* Find the nearest line to a particular section and offset, for error
9873 reporting. This code is a duplicate of the code in elf.c, except
9874 that it uses arm_elf_find_function. */
9877 elf32_arm_find_nearest_line (bfd
* abfd
,
9881 const char ** filename_ptr
,
9882 const char ** functionname_ptr
,
9883 unsigned int * line_ptr
)
9885 bfd_boolean found
= FALSE
;
9887 /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it. */
9889 if (_bfd_dwarf2_find_nearest_line (abfd
, section
, symbols
, offset
,
9890 filename_ptr
, functionname_ptr
,
9892 & elf_tdata (abfd
)->dwarf2_find_line_info
))
9894 if (!*functionname_ptr
)
9895 arm_elf_find_function (abfd
, section
, symbols
, offset
,
9896 *filename_ptr
? NULL
: filename_ptr
,
9902 if (! _bfd_stab_section_find_nearest_line (abfd
, symbols
, section
, offset
,
9903 & found
, filename_ptr
,
9904 functionname_ptr
, line_ptr
,
9905 & elf_tdata (abfd
)->line_info
))
9908 if (found
&& (*functionname_ptr
|| *line_ptr
))
9911 if (symbols
== NULL
)
9914 if (! arm_elf_find_function (abfd
, section
, symbols
, offset
,
9915 filename_ptr
, functionname_ptr
))
9923 elf32_arm_find_inliner_info (bfd
* abfd
,
9924 const char ** filename_ptr
,
9925 const char ** functionname_ptr
,
9926 unsigned int * line_ptr
)
9929 found
= _bfd_dwarf2_find_inliner_info (abfd
, filename_ptr
,
9930 functionname_ptr
, line_ptr
,
9931 & elf_tdata (abfd
)->dwarf2_find_line_info
);
9935 /* Adjust a symbol defined by a dynamic object and referenced by a
9936 regular object. The current definition is in some section of the
9937 dynamic object, but we're not including those sections. We have to
9938 change the definition to something the rest of the link can
9942 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info
* info
,
9943 struct elf_link_hash_entry
* h
)
9947 struct elf32_arm_link_hash_entry
* eh
;
9948 struct elf32_arm_link_hash_table
*globals
;
9950 globals
= elf32_arm_hash_table (info
);
9951 dynobj
= elf_hash_table (info
)->dynobj
;
9953 /* Make sure we know what is going on here. */
9954 BFD_ASSERT (dynobj
!= NULL
9956 || h
->u
.weakdef
!= NULL
9959 && !h
->def_regular
)));
9961 eh
= (struct elf32_arm_link_hash_entry
*) h
;
9963 /* If this is a function, put it in the procedure linkage table. We
9964 will fill in the contents of the procedure linkage table later,
9965 when we know the address of the .got section. */
9966 if (h
->type
== STT_FUNC
|| h
->type
== STT_ARM_TFUNC
9969 if (h
->plt
.refcount
<= 0
9970 || SYMBOL_CALLS_LOCAL (info
, h
)
9971 || (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
9972 && h
->root
.type
== bfd_link_hash_undefweak
))
9974 /* This case can occur if we saw a PLT32 reloc in an input
9975 file, but the symbol was never referred to by a dynamic
9976 object, or if all references were garbage collected. In
9977 such a case, we don't actually need to build a procedure
9978 linkage table, and we can just do a PC24 reloc instead. */
9979 h
->plt
.offset
= (bfd_vma
) -1;
9980 eh
->plt_thumb_refcount
= 0;
9981 eh
->plt_maybe_thumb_refcount
= 0;
9989 /* It's possible that we incorrectly decided a .plt reloc was
9990 needed for an R_ARM_PC24 or similar reloc to a non-function sym
9991 in check_relocs. We can't decide accurately between function
9992 and non-function syms in check-relocs; Objects loaded later in
9993 the link may change h->type. So fix it now. */
9994 h
->plt
.offset
= (bfd_vma
) -1;
9995 eh
->plt_thumb_refcount
= 0;
9996 eh
->plt_maybe_thumb_refcount
= 0;
9999 /* If this is a weak symbol, and there is a real definition, the
10000 processor independent code will have arranged for us to see the
10001 real definition first, and we can just use the same value. */
10002 if (h
->u
.weakdef
!= NULL
)
10004 BFD_ASSERT (h
->u
.weakdef
->root
.type
== bfd_link_hash_defined
10005 || h
->u
.weakdef
->root
.type
== bfd_link_hash_defweak
);
10006 h
->root
.u
.def
.section
= h
->u
.weakdef
->root
.u
.def
.section
;
10007 h
->root
.u
.def
.value
= h
->u
.weakdef
->root
.u
.def
.value
;
10011 /* If there are no non-GOT references, we do not need a copy
10013 if (!h
->non_got_ref
)
10016 /* This is a reference to a symbol defined by a dynamic object which
10017 is not a function. */
10019 /* If we are creating a shared library, we must presume that the
10020 only references to the symbol are via the global offset table.
10021 For such cases we need not do anything here; the relocations will
10022 be handled correctly by relocate_section. Relocatable executables
10023 can reference data in shared objects directly, so we don't need to
10024 do anything here. */
10025 if (info
->shared
|| globals
->root
.is_relocatable_executable
)
10030 (*_bfd_error_handler
) (_("dynamic variable `%s' is zero size"),
10031 h
->root
.root
.string
);
10035 /* We must allocate the symbol in our .dynbss section, which will
10036 become part of the .bss section of the executable. There will be
10037 an entry for this symbol in the .dynsym section. The dynamic
10038 object will contain position independent code, so all references
10039 from the dynamic object to this symbol will go through the global
10040 offset table. The dynamic linker will use the .dynsym entry to
10041 determine the address it must put in the global offset table, so
10042 both the dynamic object and the regular object will refer to the
10043 same memory location for the variable. */
10044 s
= bfd_get_section_by_name (dynobj
, ".dynbss");
10045 BFD_ASSERT (s
!= NULL
);
10047 /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
10048 copy the initial value out of the dynamic object and into the
10049 runtime process image. We need to remember the offset into the
10050 .rel(a).bss section we are going to use. */
10051 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
10055 srel
= bfd_get_section_by_name (dynobj
, RELOC_SECTION (globals
, ".bss"));
10056 BFD_ASSERT (srel
!= NULL
);
10057 srel
->size
+= RELOC_SIZE (globals
);
10061 return _bfd_elf_adjust_dynamic_copy (h
, s
);
10064 /* Allocate space in .plt, .got and associated reloc sections for
10068 allocate_dynrelocs (struct elf_link_hash_entry
*h
, void * inf
)
10070 struct bfd_link_info
*info
;
10071 struct elf32_arm_link_hash_table
*htab
;
10072 struct elf32_arm_link_hash_entry
*eh
;
10073 struct elf32_arm_relocs_copied
*p
;
10074 bfd_signed_vma thumb_refs
;
10076 eh
= (struct elf32_arm_link_hash_entry
*) h
;
10078 if (h
->root
.type
== bfd_link_hash_indirect
)
10081 if (h
->root
.type
== bfd_link_hash_warning
)
10082 /* When warning symbols are created, they **replace** the "real"
10083 entry in the hash table, thus we never get to see the real
10084 symbol in a hash traversal. So look at it now. */
10085 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
10087 info
= (struct bfd_link_info
*) inf
;
10088 htab
= elf32_arm_hash_table (info
);
10090 if (htab
->root
.dynamic_sections_created
10091 && h
->plt
.refcount
> 0)
10093 /* Make sure this symbol is output as a dynamic symbol.
10094 Undefined weak syms won't yet be marked as dynamic. */
10095 if (h
->dynindx
== -1
10096 && !h
->forced_local
)
10098 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
10103 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h
))
10105 asection
*s
= htab
->splt
;
10107 /* If this is the first .plt entry, make room for the special
10110 s
->size
+= htab
->plt_header_size
;
10112 h
->plt
.offset
= s
->size
;
10114 /* If we will insert a Thumb trampoline before this PLT, leave room
10116 thumb_refs
= eh
->plt_thumb_refcount
;
10117 if (!htab
->use_blx
)
10118 thumb_refs
+= eh
->plt_maybe_thumb_refcount
;
10120 if (thumb_refs
> 0)
10122 h
->plt
.offset
+= PLT_THUMB_STUB_SIZE
;
10123 s
->size
+= PLT_THUMB_STUB_SIZE
;
10126 /* If this symbol is not defined in a regular file, and we are
10127 not generating a shared library, then set the symbol to this
10128 location in the .plt. This is required to make function
10129 pointers compare as equal between the normal executable and
10130 the shared library. */
10132 && !h
->def_regular
)
10134 h
->root
.u
.def
.section
= s
;
10135 h
->root
.u
.def
.value
= h
->plt
.offset
;
10137 /* Make sure the function is not marked as Thumb, in case
10138 it is the target of an ABS32 relocation, which will
10139 point to the PLT entry. */
10140 if (ELF_ST_TYPE (h
->type
) == STT_ARM_TFUNC
)
10141 h
->type
= ELF_ST_INFO (ELF_ST_BIND (h
->type
), STT_FUNC
);
10144 /* Make room for this entry. */
10145 s
->size
+= htab
->plt_entry_size
;
10147 if (!htab
->symbian_p
)
10149 /* We also need to make an entry in the .got.plt section, which
10150 will be placed in the .got section by the linker script. */
10151 eh
->plt_got_offset
= htab
->sgotplt
->size
;
10152 htab
->sgotplt
->size
+= 4;
10155 /* We also need to make an entry in the .rel(a).plt section. */
10156 htab
->srelplt
->size
+= RELOC_SIZE (htab
);
10158 /* VxWorks executables have a second set of relocations for
10159 each PLT entry. They go in a separate relocation section,
10160 which is processed by the kernel loader. */
10161 if (htab
->vxworks_p
&& !info
->shared
)
10163 /* There is a relocation for the initial PLT entry:
10164 an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_. */
10165 if (h
->plt
.offset
== htab
->plt_header_size
)
10166 htab
->srelplt2
->size
+= RELOC_SIZE (htab
);
10168 /* There are two extra relocations for each subsequent
10169 PLT entry: an R_ARM_32 relocation for the GOT entry,
10170 and an R_ARM_32 relocation for the PLT entry. */
10171 htab
->srelplt2
->size
+= RELOC_SIZE (htab
) * 2;
10176 h
->plt
.offset
= (bfd_vma
) -1;
10182 h
->plt
.offset
= (bfd_vma
) -1;
10186 if (h
->got
.refcount
> 0)
10190 int tls_type
= elf32_arm_hash_entry (h
)->tls_type
;
10193 /* Make sure this symbol is output as a dynamic symbol.
10194 Undefined weak syms won't yet be marked as dynamic. */
10195 if (h
->dynindx
== -1
10196 && !h
->forced_local
)
10198 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
10202 if (!htab
->symbian_p
)
10205 h
->got
.offset
= s
->size
;
10207 if (tls_type
== GOT_UNKNOWN
)
10210 if (tls_type
== GOT_NORMAL
)
10211 /* Non-TLS symbols need one GOT slot. */
10215 if (tls_type
& GOT_TLS_GD
)
10216 /* R_ARM_TLS_GD32 needs 2 consecutive GOT slots. */
10218 if (tls_type
& GOT_TLS_IE
)
10219 /* R_ARM_TLS_IE32 needs one GOT slot. */
10223 dyn
= htab
->root
.dynamic_sections_created
;
10226 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
10228 || !SYMBOL_REFERENCES_LOCAL (info
, h
)))
10231 if (tls_type
!= GOT_NORMAL
10232 && (info
->shared
|| indx
!= 0)
10233 && (ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
10234 || h
->root
.type
!= bfd_link_hash_undefweak
))
10236 if (tls_type
& GOT_TLS_IE
)
10237 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
10239 if (tls_type
& GOT_TLS_GD
)
10240 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
10242 if ((tls_type
& GOT_TLS_GD
) && indx
!= 0)
10243 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
10245 else if ((ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
10246 || h
->root
.type
!= bfd_link_hash_undefweak
)
10248 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, 0, h
)))
10249 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
10253 h
->got
.offset
= (bfd_vma
) -1;
10255 /* Allocate stubs for exported Thumb functions on v4t. */
10256 if (!htab
->use_blx
&& h
->dynindx
!= -1
10258 && ELF_ST_TYPE (h
->type
) == STT_ARM_TFUNC
10259 && ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
)
10261 struct elf_link_hash_entry
* th
;
10262 struct bfd_link_hash_entry
* bh
;
10263 struct elf_link_hash_entry
* myh
;
10267 /* Create a new symbol to regist the real location of the function. */
10268 s
= h
->root
.u
.def
.section
;
10269 sprintf (name
, "__real_%s", h
->root
.root
.string
);
10270 _bfd_generic_link_add_one_symbol (info
, s
->owner
,
10271 name
, BSF_GLOBAL
, s
,
10272 h
->root
.u
.def
.value
,
10273 NULL
, TRUE
, FALSE
, &bh
);
10275 myh
= (struct elf_link_hash_entry
*) bh
;
10276 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_ARM_TFUNC
);
10277 myh
->forced_local
= 1;
10278 eh
->export_glue
= myh
;
10279 th
= record_arm_to_thumb_glue (info
, h
);
10280 /* Point the symbol at the stub. */
10281 h
->type
= ELF_ST_INFO (ELF_ST_BIND (h
->type
), STT_FUNC
);
10282 h
->root
.u
.def
.section
= th
->root
.u
.def
.section
;
10283 h
->root
.u
.def
.value
= th
->root
.u
.def
.value
& ~1;
10286 if (eh
->relocs_copied
== NULL
)
10289 /* In the shared -Bsymbolic case, discard space allocated for
10290 dynamic pc-relative relocs against symbols which turn out to be
10291 defined in regular objects. For the normal shared case, discard
10292 space for pc-relative relocs that have become local due to symbol
10293 visibility changes. */
10295 if (info
->shared
|| htab
->root
.is_relocatable_executable
)
10297 /* The only relocs that use pc_count are R_ARM_REL32 and
10298 R_ARM_REL32_NOI, which will appear on something like
10299 ".long foo - .". We want calls to protected symbols to resolve
10300 directly to the function rather than going via the plt. If people
10301 want function pointer comparisons to work as expected then they
10302 should avoid writing assembly like ".long foo - .". */
10303 if (SYMBOL_CALLS_LOCAL (info
, h
))
10305 struct elf32_arm_relocs_copied
**pp
;
10307 for (pp
= &eh
->relocs_copied
; (p
= *pp
) != NULL
; )
10309 p
->count
-= p
->pc_count
;
10318 if (elf32_arm_hash_table (info
)->vxworks_p
)
10320 struct elf32_arm_relocs_copied
**pp
;
10322 for (pp
= &eh
->relocs_copied
; (p
= *pp
) != NULL
; )
10324 if (strcmp (p
->section
->output_section
->name
, ".tls_vars") == 0)
10331 /* Also discard relocs on undefined weak syms with non-default
10333 if (eh
->relocs_copied
!= NULL
10334 && h
->root
.type
== bfd_link_hash_undefweak
)
10336 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
)
10337 eh
->relocs_copied
= NULL
;
10339 /* Make sure undefined weak symbols are output as a dynamic
10341 else if (h
->dynindx
== -1
10342 && !h
->forced_local
)
10344 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
10349 else if (htab
->root
.is_relocatable_executable
&& h
->dynindx
== -1
10350 && h
->root
.type
== bfd_link_hash_new
)
10352 /* Output absolute symbols so that we can create relocations
10353 against them. For normal symbols we output a relocation
10354 against the section that contains them. */
10355 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
10362 /* For the non-shared case, discard space for relocs against
10363 symbols which turn out to need copy relocs or are not
10366 if (!h
->non_got_ref
10367 && ((h
->def_dynamic
10368 && !h
->def_regular
)
10369 || (htab
->root
.dynamic_sections_created
10370 && (h
->root
.type
== bfd_link_hash_undefweak
10371 || h
->root
.type
== bfd_link_hash_undefined
))))
10373 /* Make sure this symbol is output as a dynamic symbol.
10374 Undefined weak syms won't yet be marked as dynamic. */
10375 if (h
->dynindx
== -1
10376 && !h
->forced_local
)
10378 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
10382 /* If that succeeded, we know we'll be keeping all the
10384 if (h
->dynindx
!= -1)
10388 eh
->relocs_copied
= NULL
;
10393 /* Finally, allocate space. */
10394 for (p
= eh
->relocs_copied
; p
!= NULL
; p
= p
->next
)
10396 asection
*sreloc
= elf_section_data (p
->section
)->sreloc
;
10397 sreloc
->size
+= p
->count
* RELOC_SIZE (htab
);
10403 /* Find any dynamic relocs that apply to read-only sections. */
10406 elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry
* h
, void * inf
)
10408 struct elf32_arm_link_hash_entry
* eh
;
10409 struct elf32_arm_relocs_copied
* p
;
10411 if (h
->root
.type
== bfd_link_hash_warning
)
10412 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
10414 eh
= (struct elf32_arm_link_hash_entry
*) h
;
10415 for (p
= eh
->relocs_copied
; p
!= NULL
; p
= p
->next
)
10417 asection
*s
= p
->section
;
10419 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
10421 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
10423 info
->flags
|= DF_TEXTREL
;
10425 /* Not an error, just cut short the traversal. */
10433 bfd_elf32_arm_set_byteswap_code (struct bfd_link_info
*info
,
10436 struct elf32_arm_link_hash_table
*globals
;
10438 globals
= elf32_arm_hash_table (info
);
10439 globals
->byteswap_code
= byteswap_code
;
10442 /* Set the sizes of the dynamic sections. */
10445 elf32_arm_size_dynamic_sections (bfd
* output_bfd ATTRIBUTE_UNUSED
,
10446 struct bfd_link_info
* info
)
10451 bfd_boolean relocs
;
10453 struct elf32_arm_link_hash_table
*htab
;
10455 htab
= elf32_arm_hash_table (info
);
10456 dynobj
= elf_hash_table (info
)->dynobj
;
10457 BFD_ASSERT (dynobj
!= NULL
);
10458 check_use_blx (htab
);
10460 if (elf_hash_table (info
)->dynamic_sections_created
)
10462 /* Set the contents of the .interp section to the interpreter. */
10463 if (info
->executable
)
10465 s
= bfd_get_section_by_name (dynobj
, ".interp");
10466 BFD_ASSERT (s
!= NULL
);
10467 s
->size
= sizeof ELF_DYNAMIC_INTERPRETER
;
10468 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
10472 /* Set up .got offsets for local syms, and space for local dynamic
10474 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
10476 bfd_signed_vma
*local_got
;
10477 bfd_signed_vma
*end_local_got
;
10478 char *local_tls_type
;
10479 bfd_size_type locsymcount
;
10480 Elf_Internal_Shdr
*symtab_hdr
;
10482 bfd_boolean is_vxworks
= elf32_arm_hash_table (info
)->vxworks_p
;
10484 if (! is_arm_elf (ibfd
))
10487 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
10489 struct elf32_arm_relocs_copied
*p
;
10491 for (p
= elf_section_data (s
)->local_dynrel
; p
!= NULL
; p
= p
->next
)
10493 if (!bfd_is_abs_section (p
->section
)
10494 && bfd_is_abs_section (p
->section
->output_section
))
10496 /* Input section has been discarded, either because
10497 it is a copy of a linkonce section or due to
10498 linker script /DISCARD/, so we'll be discarding
10501 else if (is_vxworks
10502 && strcmp (p
->section
->output_section
->name
,
10505 /* Relocations in vxworks .tls_vars sections are
10506 handled specially by the loader. */
10508 else if (p
->count
!= 0)
10510 srel
= elf_section_data (p
->section
)->sreloc
;
10511 srel
->size
+= p
->count
* RELOC_SIZE (htab
);
10512 if ((p
->section
->output_section
->flags
& SEC_READONLY
) != 0)
10513 info
->flags
|= DF_TEXTREL
;
10518 local_got
= elf_local_got_refcounts (ibfd
);
10522 symtab_hdr
= & elf_symtab_hdr (ibfd
);
10523 locsymcount
= symtab_hdr
->sh_info
;
10524 end_local_got
= local_got
+ locsymcount
;
10525 local_tls_type
= elf32_arm_local_got_tls_type (ibfd
);
10527 srel
= htab
->srelgot
;
10528 for (; local_got
< end_local_got
; ++local_got
, ++local_tls_type
)
10530 if (*local_got
> 0)
10532 *local_got
= s
->size
;
10533 if (*local_tls_type
& GOT_TLS_GD
)
10534 /* TLS_GD relocs need an 8-byte structure in the GOT. */
10536 if (*local_tls_type
& GOT_TLS_IE
)
10538 if (*local_tls_type
== GOT_NORMAL
)
10541 if (info
->shared
|| *local_tls_type
== GOT_TLS_GD
)
10542 srel
->size
+= RELOC_SIZE (htab
);
10545 *local_got
= (bfd_vma
) -1;
10549 if (htab
->tls_ldm_got
.refcount
> 0)
10551 /* Allocate two GOT entries and one dynamic relocation (if necessary)
10552 for R_ARM_TLS_LDM32 relocations. */
10553 htab
->tls_ldm_got
.offset
= htab
->sgot
->size
;
10554 htab
->sgot
->size
+= 8;
10556 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
10559 htab
->tls_ldm_got
.offset
= -1;
10561 /* Allocate global sym .plt and .got entries, and space for global
10562 sym dynamic relocs. */
10563 elf_link_hash_traverse (& htab
->root
, allocate_dynrelocs
, info
);
10565 /* Here we rummage through the found bfds to collect glue information. */
10566 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
10568 if (! is_arm_elf (ibfd
))
10571 /* Initialise mapping tables for code/data. */
10572 bfd_elf32_arm_init_maps (ibfd
);
10574 if (!bfd_elf32_arm_process_before_allocation (ibfd
, info
)
10575 || !bfd_elf32_arm_vfp11_erratum_scan (ibfd
, info
))
10576 /* xgettext:c-format */
10577 _bfd_error_handler (_("Errors encountered processing file %s"),
10581 /* The check_relocs and adjust_dynamic_symbol entry points have
10582 determined the sizes of the various dynamic sections. Allocate
10583 memory for them. */
10586 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
10590 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
10593 /* It's OK to base decisions on the section name, because none
10594 of the dynobj section names depend upon the input files. */
10595 name
= bfd_get_section_name (dynobj
, s
);
10597 if (strcmp (name
, ".plt") == 0)
10599 /* Remember whether there is a PLT. */
10600 plt
= s
->size
!= 0;
10602 else if (CONST_STRNEQ (name
, ".rel"))
10606 /* Remember whether there are any reloc sections other
10607 than .rel(a).plt and .rela.plt.unloaded. */
10608 if (s
!= htab
->srelplt
&& s
!= htab
->srelplt2
)
10611 /* We use the reloc_count field as a counter if we need
10612 to copy relocs into the output file. */
10613 s
->reloc_count
= 0;
10616 else if (! CONST_STRNEQ (name
, ".got")
10617 && strcmp (name
, ".dynbss") != 0)
10619 /* It's not one of our sections, so don't allocate space. */
10625 /* If we don't need this section, strip it from the
10626 output file. This is mostly to handle .rel(a).bss and
10627 .rel(a).plt. We must create both sections in
10628 create_dynamic_sections, because they must be created
10629 before the linker maps input sections to output
10630 sections. The linker does that before
10631 adjust_dynamic_symbol is called, and it is that
10632 function which decides whether anything needs to go
10633 into these sections. */
10634 s
->flags
|= SEC_EXCLUDE
;
10638 if ((s
->flags
& SEC_HAS_CONTENTS
) == 0)
10641 /* Allocate memory for the section contents. */
10642 s
->contents
= bfd_zalloc (dynobj
, s
->size
);
10643 if (s
->contents
== NULL
)
10647 if (elf_hash_table (info
)->dynamic_sections_created
)
10649 /* Add some entries to the .dynamic section. We fill in the
10650 values later, in elf32_arm_finish_dynamic_sections, but we
10651 must add the entries now so that we get the correct size for
10652 the .dynamic section. The DT_DEBUG entry is filled in by the
10653 dynamic linker and used by the debugger. */
10654 #define add_dynamic_entry(TAG, VAL) \
10655 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
10657 if (info
->executable
)
10659 if (!add_dynamic_entry (DT_DEBUG
, 0))
10665 if ( !add_dynamic_entry (DT_PLTGOT
, 0)
10666 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
10667 || !add_dynamic_entry (DT_PLTREL
,
10668 htab
->use_rel
? DT_REL
: DT_RELA
)
10669 || !add_dynamic_entry (DT_JMPREL
, 0))
10677 if (!add_dynamic_entry (DT_REL
, 0)
10678 || !add_dynamic_entry (DT_RELSZ
, 0)
10679 || !add_dynamic_entry (DT_RELENT
, RELOC_SIZE (htab
)))
10684 if (!add_dynamic_entry (DT_RELA
, 0)
10685 || !add_dynamic_entry (DT_RELASZ
, 0)
10686 || !add_dynamic_entry (DT_RELAENT
, RELOC_SIZE (htab
)))
10691 /* If any dynamic relocs apply to a read-only section,
10692 then we need a DT_TEXTREL entry. */
10693 if ((info
->flags
& DF_TEXTREL
) == 0)
10694 elf_link_hash_traverse (& htab
->root
, elf32_arm_readonly_dynrelocs
,
10697 if ((info
->flags
& DF_TEXTREL
) != 0)
10699 if (!add_dynamic_entry (DT_TEXTREL
, 0))
10702 if (htab
->vxworks_p
10703 && !elf_vxworks_add_dynamic_entries (output_bfd
, info
))
10706 #undef add_dynamic_entry
10711 /* Finish up dynamic symbol handling. We set the contents of various
10712 dynamic sections here. */
10715 elf32_arm_finish_dynamic_symbol (bfd
* output_bfd
,
10716 struct bfd_link_info
* info
,
10717 struct elf_link_hash_entry
* h
,
10718 Elf_Internal_Sym
* sym
)
10721 struct elf32_arm_link_hash_table
*htab
;
10722 struct elf32_arm_link_hash_entry
*eh
;
10724 dynobj
= elf_hash_table (info
)->dynobj
;
10725 htab
= elf32_arm_hash_table (info
);
10726 eh
= (struct elf32_arm_link_hash_entry
*) h
;
10728 if (h
->plt
.offset
!= (bfd_vma
) -1)
10734 Elf_Internal_Rela rel
;
10736 /* This symbol has an entry in the procedure linkage table. Set
10739 BFD_ASSERT (h
->dynindx
!= -1);
10741 splt
= bfd_get_section_by_name (dynobj
, ".plt");
10742 srel
= bfd_get_section_by_name (dynobj
, RELOC_SECTION (htab
, ".plt"));
10743 BFD_ASSERT (splt
!= NULL
&& srel
!= NULL
);
10745 /* Fill in the entry in the procedure linkage table. */
10746 if (htab
->symbian_p
)
10748 put_arm_insn (htab
, output_bfd
,
10749 elf32_arm_symbian_plt_entry
[0],
10750 splt
->contents
+ h
->plt
.offset
);
10751 bfd_put_32 (output_bfd
,
10752 elf32_arm_symbian_plt_entry
[1],
10753 splt
->contents
+ h
->plt
.offset
+ 4);
10755 /* Fill in the entry in the .rel.plt section. */
10756 rel
.r_offset
= (splt
->output_section
->vma
10757 + splt
->output_offset
10758 + h
->plt
.offset
+ 4);
10759 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_GLOB_DAT
);
10761 /* Get the index in the procedure linkage table which
10762 corresponds to this symbol. This is the index of this symbol
10763 in all the symbols for which we are making plt entries. The
10764 first entry in the procedure linkage table is reserved. */
10765 plt_index
= ((h
->plt
.offset
- htab
->plt_header_size
)
10766 / htab
->plt_entry_size
);
10770 bfd_vma got_offset
, got_address
, plt_address
;
10771 bfd_vma got_displacement
;
10775 sgot
= bfd_get_section_by_name (dynobj
, ".got.plt");
10776 BFD_ASSERT (sgot
!= NULL
);
10778 /* Get the offset into the .got.plt table of the entry that
10779 corresponds to this function. */
10780 got_offset
= eh
->plt_got_offset
;
10782 /* Get the index in the procedure linkage table which
10783 corresponds to this symbol. This is the index of this symbol
10784 in all the symbols for which we are making plt entries. The
10785 first three entries in .got.plt are reserved; after that
10786 symbols appear in the same order as in .plt. */
10787 plt_index
= (got_offset
- 12) / 4;
10789 /* Calculate the address of the GOT entry. */
10790 got_address
= (sgot
->output_section
->vma
10791 + sgot
->output_offset
10794 /* ...and the address of the PLT entry. */
10795 plt_address
= (splt
->output_section
->vma
10796 + splt
->output_offset
10799 ptr
= htab
->splt
->contents
+ h
->plt
.offset
;
10800 if (htab
->vxworks_p
&& info
->shared
)
10805 for (i
= 0; i
!= htab
->plt_entry_size
/ 4; i
++, ptr
+= 4)
10807 val
= elf32_arm_vxworks_shared_plt_entry
[i
];
10809 val
|= got_address
- sgot
->output_section
->vma
;
10811 val
|= plt_index
* RELOC_SIZE (htab
);
10812 if (i
== 2 || i
== 5)
10813 bfd_put_32 (output_bfd
, val
, ptr
);
10815 put_arm_insn (htab
, output_bfd
, val
, ptr
);
10818 else if (htab
->vxworks_p
)
10823 for (i
= 0; i
!= htab
->plt_entry_size
/ 4; i
++, ptr
+= 4)
10825 val
= elf32_arm_vxworks_exec_plt_entry
[i
];
10827 val
|= got_address
;
10829 val
|= 0xffffff & -((h
->plt
.offset
+ i
* 4 + 8) >> 2);
10831 val
|= plt_index
* RELOC_SIZE (htab
);
10832 if (i
== 2 || i
== 5)
10833 bfd_put_32 (output_bfd
, val
, ptr
);
10835 put_arm_insn (htab
, output_bfd
, val
, ptr
);
10838 loc
= (htab
->srelplt2
->contents
10839 + (plt_index
* 2 + 1) * RELOC_SIZE (htab
));
10841 /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
10842 referencing the GOT for this PLT entry. */
10843 rel
.r_offset
= plt_address
+ 8;
10844 rel
.r_info
= ELF32_R_INFO (htab
->root
.hgot
->indx
, R_ARM_ABS32
);
10845 rel
.r_addend
= got_offset
;
10846 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
10847 loc
+= RELOC_SIZE (htab
);
10849 /* Create the R_ARM_ABS32 relocation referencing the
10850 beginning of the PLT for this GOT entry. */
10851 rel
.r_offset
= got_address
;
10852 rel
.r_info
= ELF32_R_INFO (htab
->root
.hplt
->indx
, R_ARM_ABS32
);
10854 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
10858 bfd_signed_vma thumb_refs
;
10859 /* Calculate the displacement between the PLT slot and the
10860 entry in the GOT. The eight-byte offset accounts for the
10861 value produced by adding to pc in the first instruction
10862 of the PLT stub. */
10863 got_displacement
= got_address
- (plt_address
+ 8);
10865 BFD_ASSERT ((got_displacement
& 0xf0000000) == 0);
10867 thumb_refs
= eh
->plt_thumb_refcount
;
10868 if (!htab
->use_blx
)
10869 thumb_refs
+= eh
->plt_maybe_thumb_refcount
;
10871 if (thumb_refs
> 0)
10873 put_thumb_insn (htab
, output_bfd
,
10874 elf32_arm_plt_thumb_stub
[0], ptr
- 4);
10875 put_thumb_insn (htab
, output_bfd
,
10876 elf32_arm_plt_thumb_stub
[1], ptr
- 2);
10879 put_arm_insn (htab
, output_bfd
,
10880 elf32_arm_plt_entry
[0]
10881 | ((got_displacement
& 0x0ff00000) >> 20),
10883 put_arm_insn (htab
, output_bfd
,
10884 elf32_arm_plt_entry
[1]
10885 | ((got_displacement
& 0x000ff000) >> 12),
10887 put_arm_insn (htab
, output_bfd
,
10888 elf32_arm_plt_entry
[2]
10889 | (got_displacement
& 0x00000fff),
10891 #ifdef FOUR_WORD_PLT
10892 bfd_put_32 (output_bfd
, elf32_arm_plt_entry
[3], ptr
+ 12);
10896 /* Fill in the entry in the global offset table. */
10897 bfd_put_32 (output_bfd
,
10898 (splt
->output_section
->vma
10899 + splt
->output_offset
),
10900 sgot
->contents
+ got_offset
);
10902 /* Fill in the entry in the .rel(a).plt section. */
10904 rel
.r_offset
= got_address
;
10905 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_JUMP_SLOT
);
10908 loc
= srel
->contents
+ plt_index
* RELOC_SIZE (htab
);
10909 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
10911 if (!h
->def_regular
)
10913 /* Mark the symbol as undefined, rather than as defined in
10914 the .plt section. Leave the value alone. */
10915 sym
->st_shndx
= SHN_UNDEF
;
10916 /* If the symbol is weak, we do need to clear the value.
10917 Otherwise, the PLT entry would provide a definition for
10918 the symbol even if the symbol wasn't defined anywhere,
10919 and so the symbol would never be NULL. */
10920 if (!h
->ref_regular_nonweak
)
10925 if (h
->got
.offset
!= (bfd_vma
) -1
10926 && (elf32_arm_hash_entry (h
)->tls_type
& GOT_TLS_GD
) == 0
10927 && (elf32_arm_hash_entry (h
)->tls_type
& GOT_TLS_IE
) == 0)
10931 Elf_Internal_Rela rel
;
10935 /* This symbol has an entry in the global offset table. Set it
10937 sgot
= bfd_get_section_by_name (dynobj
, ".got");
10938 srel
= bfd_get_section_by_name (dynobj
, RELOC_SECTION (htab
, ".got"));
10939 BFD_ASSERT (sgot
!= NULL
&& srel
!= NULL
);
10941 offset
= (h
->got
.offset
& ~(bfd_vma
) 1);
10943 rel
.r_offset
= (sgot
->output_section
->vma
10944 + sgot
->output_offset
10947 /* If this is a static link, or it is a -Bsymbolic link and the
10948 symbol is defined locally or was forced to be local because
10949 of a version file, we just want to emit a RELATIVE reloc.
10950 The entry in the global offset table will already have been
10951 initialized in the relocate_section function. */
10953 && SYMBOL_REFERENCES_LOCAL (info
, h
))
10955 BFD_ASSERT ((h
->got
.offset
& 1) != 0);
10956 rel
.r_info
= ELF32_R_INFO (0, R_ARM_RELATIVE
);
10957 if (!htab
->use_rel
)
10959 rel
.r_addend
= bfd_get_32 (output_bfd
, sgot
->contents
+ offset
);
10960 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ offset
);
10965 BFD_ASSERT ((h
->got
.offset
& 1) == 0);
10966 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ offset
);
10967 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_GLOB_DAT
);
10970 loc
= srel
->contents
+ srel
->reloc_count
++ * RELOC_SIZE (htab
);
10971 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
10977 Elf_Internal_Rela rel
;
10980 /* This symbol needs a copy reloc. Set it up. */
10981 BFD_ASSERT (h
->dynindx
!= -1
10982 && (h
->root
.type
== bfd_link_hash_defined
10983 || h
->root
.type
== bfd_link_hash_defweak
));
10985 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
,
10986 RELOC_SECTION (htab
, ".bss"));
10987 BFD_ASSERT (s
!= NULL
);
10990 rel
.r_offset
= (h
->root
.u
.def
.value
10991 + h
->root
.u
.def
.section
->output_section
->vma
10992 + h
->root
.u
.def
.section
->output_offset
);
10993 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_COPY
);
10994 loc
= s
->contents
+ s
->reloc_count
++ * RELOC_SIZE (htab
);
10995 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
10998 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. On VxWorks,
10999 the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it is relative
11000 to the ".got" section. */
11001 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
11002 || (!htab
->vxworks_p
&& h
== htab
->root
.hgot
))
11003 sym
->st_shndx
= SHN_ABS
;
11008 /* Finish up the dynamic sections. */
11011 elf32_arm_finish_dynamic_sections (bfd
* output_bfd
, struct bfd_link_info
* info
)
11017 dynobj
= elf_hash_table (info
)->dynobj
;
11019 sgot
= bfd_get_section_by_name (dynobj
, ".got.plt");
11020 BFD_ASSERT (elf32_arm_hash_table (info
)->symbian_p
|| sgot
!= NULL
);
11021 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
11023 if (elf_hash_table (info
)->dynamic_sections_created
)
11026 Elf32_External_Dyn
*dyncon
, *dynconend
;
11027 struct elf32_arm_link_hash_table
*htab
;
11029 htab
= elf32_arm_hash_table (info
);
11030 splt
= bfd_get_section_by_name (dynobj
, ".plt");
11031 BFD_ASSERT (splt
!= NULL
&& sdyn
!= NULL
);
11033 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
11034 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
11036 for (; dyncon
< dynconend
; dyncon
++)
11038 Elf_Internal_Dyn dyn
;
11042 bfd_elf32_swap_dyn_in (dynobj
, dyncon
, &dyn
);
11049 if (htab
->vxworks_p
11050 && elf_vxworks_finish_dynamic_entry (output_bfd
, &dyn
))
11051 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
11056 goto get_vma_if_bpabi
;
11059 goto get_vma_if_bpabi
;
11062 goto get_vma_if_bpabi
;
11064 name
= ".gnu.version";
11065 goto get_vma_if_bpabi
;
11067 name
= ".gnu.version_d";
11068 goto get_vma_if_bpabi
;
11070 name
= ".gnu.version_r";
11071 goto get_vma_if_bpabi
;
11077 name
= RELOC_SECTION (htab
, ".plt");
11079 s
= bfd_get_section_by_name (output_bfd
, name
);
11080 BFD_ASSERT (s
!= NULL
);
11081 if (!htab
->symbian_p
)
11082 dyn
.d_un
.d_ptr
= s
->vma
;
11084 /* In the BPABI, tags in the PT_DYNAMIC section point
11085 at the file offset, not the memory address, for the
11086 convenience of the post linker. */
11087 dyn
.d_un
.d_ptr
= s
->filepos
;
11088 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
11092 if (htab
->symbian_p
)
11097 s
= bfd_get_section_by_name (output_bfd
,
11098 RELOC_SECTION (htab
, ".plt"));
11099 BFD_ASSERT (s
!= NULL
);
11100 dyn
.d_un
.d_val
= s
->size
;
11101 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
11106 if (!htab
->symbian_p
)
11108 /* My reading of the SVR4 ABI indicates that the
11109 procedure linkage table relocs (DT_JMPREL) should be
11110 included in the overall relocs (DT_REL). This is
11111 what Solaris does. However, UnixWare can not handle
11112 that case. Therefore, we override the DT_RELSZ entry
11113 here to make it not include the JMPREL relocs. Since
11114 the linker script arranges for .rel(a).plt to follow all
11115 other relocation sections, we don't have to worry
11116 about changing the DT_REL entry. */
11117 s
= bfd_get_section_by_name (output_bfd
,
11118 RELOC_SECTION (htab
, ".plt"));
11120 dyn
.d_un
.d_val
-= s
->size
;
11121 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
11124 /* Fall through. */
11128 /* In the BPABI, the DT_REL tag must point at the file
11129 offset, not the VMA, of the first relocation
11130 section. So, we use code similar to that in
11131 elflink.c, but do not check for SHF_ALLOC on the
11132 relcoation section, since relocations sections are
11133 never allocated under the BPABI. The comments above
11134 about Unixware notwithstanding, we include all of the
11135 relocations here. */
11136 if (htab
->symbian_p
)
11139 type
= ((dyn
.d_tag
== DT_REL
|| dyn
.d_tag
== DT_RELSZ
)
11140 ? SHT_REL
: SHT_RELA
);
11141 dyn
.d_un
.d_val
= 0;
11142 for (i
= 1; i
< elf_numsections (output_bfd
); i
++)
11144 Elf_Internal_Shdr
*hdr
11145 = elf_elfsections (output_bfd
)[i
];
11146 if (hdr
->sh_type
== type
)
11148 if (dyn
.d_tag
== DT_RELSZ
11149 || dyn
.d_tag
== DT_RELASZ
)
11150 dyn
.d_un
.d_val
+= hdr
->sh_size
;
11151 else if ((ufile_ptr
) hdr
->sh_offset
11152 <= dyn
.d_un
.d_val
- 1)
11153 dyn
.d_un
.d_val
= hdr
->sh_offset
;
11156 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
11160 /* Set the bottom bit of DT_INIT/FINI if the
11161 corresponding function is Thumb. */
11163 name
= info
->init_function
;
11166 name
= info
->fini_function
;
11168 /* If it wasn't set by elf_bfd_final_link
11169 then there is nothing to adjust. */
11170 if (dyn
.d_un
.d_val
!= 0)
11172 struct elf_link_hash_entry
* eh
;
11174 eh
= elf_link_hash_lookup (elf_hash_table (info
), name
,
11175 FALSE
, FALSE
, TRUE
);
11177 && ELF_ST_TYPE (eh
->type
) == STT_ARM_TFUNC
)
11179 dyn
.d_un
.d_val
|= 1;
11180 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
11187 /* Fill in the first entry in the procedure linkage table. */
11188 if (splt
->size
> 0 && elf32_arm_hash_table (info
)->plt_header_size
)
11190 const bfd_vma
*plt0_entry
;
11191 bfd_vma got_address
, plt_address
, got_displacement
;
11193 /* Calculate the addresses of the GOT and PLT. */
11194 got_address
= sgot
->output_section
->vma
+ sgot
->output_offset
;
11195 plt_address
= splt
->output_section
->vma
+ splt
->output_offset
;
11197 if (htab
->vxworks_p
)
11199 /* The VxWorks GOT is relocated by the dynamic linker.
11200 Therefore, we must emit relocations rather than simply
11201 computing the values now. */
11202 Elf_Internal_Rela rel
;
11204 plt0_entry
= elf32_arm_vxworks_exec_plt0_entry
;
11205 put_arm_insn (htab
, output_bfd
, plt0_entry
[0],
11206 splt
->contents
+ 0);
11207 put_arm_insn (htab
, output_bfd
, plt0_entry
[1],
11208 splt
->contents
+ 4);
11209 put_arm_insn (htab
, output_bfd
, plt0_entry
[2],
11210 splt
->contents
+ 8);
11211 bfd_put_32 (output_bfd
, got_address
, splt
->contents
+ 12);
11213 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_. */
11214 rel
.r_offset
= plt_address
+ 12;
11215 rel
.r_info
= ELF32_R_INFO (htab
->root
.hgot
->indx
, R_ARM_ABS32
);
11217 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
,
11218 htab
->srelplt2
->contents
);
11222 got_displacement
= got_address
- (plt_address
+ 16);
11224 plt0_entry
= elf32_arm_plt0_entry
;
11225 put_arm_insn (htab
, output_bfd
, plt0_entry
[0],
11226 splt
->contents
+ 0);
11227 put_arm_insn (htab
, output_bfd
, plt0_entry
[1],
11228 splt
->contents
+ 4);
11229 put_arm_insn (htab
, output_bfd
, plt0_entry
[2],
11230 splt
->contents
+ 8);
11231 put_arm_insn (htab
, output_bfd
, plt0_entry
[3],
11232 splt
->contents
+ 12);
11234 #ifdef FOUR_WORD_PLT
11235 /* The displacement value goes in the otherwise-unused
11236 last word of the second entry. */
11237 bfd_put_32 (output_bfd
, got_displacement
, splt
->contents
+ 28);
11239 bfd_put_32 (output_bfd
, got_displacement
, splt
->contents
+ 16);
11244 /* UnixWare sets the entsize of .plt to 4, although that doesn't
11245 really seem like the right value. */
11246 if (splt
->output_section
->owner
== output_bfd
)
11247 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
= 4;
11249 if (htab
->vxworks_p
&& !info
->shared
&& htab
->splt
->size
> 0)
11251 /* Correct the .rel(a).plt.unloaded relocations. They will have
11252 incorrect symbol indexes. */
11256 num_plts
= ((htab
->splt
->size
- htab
->plt_header_size
)
11257 / htab
->plt_entry_size
);
11258 p
= htab
->srelplt2
->contents
+ RELOC_SIZE (htab
);
11260 for (; num_plts
; num_plts
--)
11262 Elf_Internal_Rela rel
;
11264 SWAP_RELOC_IN (htab
) (output_bfd
, p
, &rel
);
11265 rel
.r_info
= ELF32_R_INFO (htab
->root
.hgot
->indx
, R_ARM_ABS32
);
11266 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, p
);
11267 p
+= RELOC_SIZE (htab
);
11269 SWAP_RELOC_IN (htab
) (output_bfd
, p
, &rel
);
11270 rel
.r_info
= ELF32_R_INFO (htab
->root
.hplt
->indx
, R_ARM_ABS32
);
11271 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, p
);
11272 p
+= RELOC_SIZE (htab
);
11277 /* Fill in the first three entries in the global offset table. */
11280 if (sgot
->size
> 0)
11283 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
);
11285 bfd_put_32 (output_bfd
,
11286 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
11288 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 4);
11289 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 8);
11292 elf_section_data (sgot
->output_section
)->this_hdr
.sh_entsize
= 4;
11299 elf32_arm_post_process_headers (bfd
* abfd
, struct bfd_link_info
* link_info ATTRIBUTE_UNUSED
)
11301 Elf_Internal_Ehdr
* i_ehdrp
; /* ELF file header, internal form. */
11302 struct elf32_arm_link_hash_table
*globals
;
11304 i_ehdrp
= elf_elfheader (abfd
);
11306 if (EF_ARM_EABI_VERSION (i_ehdrp
->e_flags
) == EF_ARM_EABI_UNKNOWN
)
11307 i_ehdrp
->e_ident
[EI_OSABI
] = ELFOSABI_ARM
;
11309 i_ehdrp
->e_ident
[EI_OSABI
] = 0;
11310 i_ehdrp
->e_ident
[EI_ABIVERSION
] = ARM_ELF_ABI_VERSION
;
11314 globals
= elf32_arm_hash_table (link_info
);
11315 if (globals
->byteswap_code
)
11316 i_ehdrp
->e_flags
|= EF_ARM_BE8
;
11320 static enum elf_reloc_type_class
11321 elf32_arm_reloc_type_class (const Elf_Internal_Rela
*rela
)
11323 switch ((int) ELF32_R_TYPE (rela
->r_info
))
11325 case R_ARM_RELATIVE
:
11326 return reloc_class_relative
;
11327 case R_ARM_JUMP_SLOT
:
11328 return reloc_class_plt
;
11330 return reloc_class_copy
;
11332 return reloc_class_normal
;
11336 /* Set the right machine number for an Arm ELF file. */
11339 elf32_arm_section_flags (flagword
*flags
, const Elf_Internal_Shdr
*hdr
)
11341 if (hdr
->sh_type
== SHT_NOTE
)
11342 *flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_SAME_CONTENTS
;
11348 elf32_arm_final_write_processing (bfd
*abfd
, bfd_boolean linker ATTRIBUTE_UNUSED
)
11350 bfd_arm_update_notes (abfd
, ARM_NOTE_SECTION
);
11353 /* Return TRUE if this is an unwinding table entry. */
11356 is_arm_elf_unwind_section_name (bfd
* abfd ATTRIBUTE_UNUSED
, const char * name
)
11358 return (CONST_STRNEQ (name
, ELF_STRING_ARM_unwind
)
11359 || CONST_STRNEQ (name
, ELF_STRING_ARM_unwind_once
));
11363 /* Set the type and flags for an ARM section. We do this by
11364 the section name, which is a hack, but ought to work. */
11367 elf32_arm_fake_sections (bfd
* abfd
, Elf_Internal_Shdr
* hdr
, asection
* sec
)
11371 name
= bfd_get_section_name (abfd
, sec
);
11373 if (is_arm_elf_unwind_section_name (abfd
, name
))
11375 hdr
->sh_type
= SHT_ARM_EXIDX
;
11376 hdr
->sh_flags
|= SHF_LINK_ORDER
;
11381 /* Handle an ARM specific section when reading an object file. This is
11382 called when bfd_section_from_shdr finds a section with an unknown
11386 elf32_arm_section_from_shdr (bfd
*abfd
,
11387 Elf_Internal_Shdr
* hdr
,
11391 /* There ought to be a place to keep ELF backend specific flags, but
11392 at the moment there isn't one. We just keep track of the
11393 sections by their name, instead. Fortunately, the ABI gives
11394 names for all the ARM specific sections, so we will probably get
11396 switch (hdr
->sh_type
)
11398 case SHT_ARM_EXIDX
:
11399 case SHT_ARM_PREEMPTMAP
:
11400 case SHT_ARM_ATTRIBUTES
:
11407 if (! _bfd_elf_make_section_from_shdr (abfd
, hdr
, name
, shindex
))
11413 /* A structure used to record a list of sections, independently
11414 of the next and prev fields in the asection structure. */
11415 typedef struct section_list
11418 struct section_list
* next
;
11419 struct section_list
* prev
;
11423 /* Unfortunately we need to keep a list of sections for which
11424 an _arm_elf_section_data structure has been allocated. This
11425 is because it is possible for functions like elf32_arm_write_section
11426 to be called on a section which has had an elf_data_structure
11427 allocated for it (and so the used_by_bfd field is valid) but
11428 for which the ARM extended version of this structure - the
11429 _arm_elf_section_data structure - has not been allocated. */
11430 static section_list
* sections_with_arm_elf_section_data
= NULL
;
11433 record_section_with_arm_elf_section_data (asection
* sec
)
11435 struct section_list
* entry
;
11437 entry
= bfd_malloc (sizeof (* entry
));
11441 entry
->next
= sections_with_arm_elf_section_data
;
11442 entry
->prev
= NULL
;
11443 if (entry
->next
!= NULL
)
11444 entry
->next
->prev
= entry
;
11445 sections_with_arm_elf_section_data
= entry
;
11448 static struct section_list
*
11449 find_arm_elf_section_entry (asection
* sec
)
11451 struct section_list
* entry
;
11452 static struct section_list
* last_entry
= NULL
;
11454 /* This is a short cut for the typical case where the sections are added
11455 to the sections_with_arm_elf_section_data list in forward order and
11456 then looked up here in backwards order. This makes a real difference
11457 to the ld-srec/sec64k.exp linker test. */
11458 entry
= sections_with_arm_elf_section_data
;
11459 if (last_entry
!= NULL
)
11461 if (last_entry
->sec
== sec
)
11462 entry
= last_entry
;
11463 else if (last_entry
->next
!= NULL
11464 && last_entry
->next
->sec
== sec
)
11465 entry
= last_entry
->next
;
11468 for (; entry
; entry
= entry
->next
)
11469 if (entry
->sec
== sec
)
11473 /* Record the entry prior to this one - it is the entry we are most
11474 likely to want to locate next time. Also this way if we have been
11475 called from unrecord_section_with_arm_elf_section_data() we will not
11476 be caching a pointer that is about to be freed. */
11477 last_entry
= entry
->prev
;
11482 static _arm_elf_section_data
*
11483 get_arm_elf_section_data (asection
* sec
)
11485 struct section_list
* entry
;
11487 entry
= find_arm_elf_section_entry (sec
);
11490 return elf32_arm_section_data (entry
->sec
);
11496 unrecord_section_with_arm_elf_section_data (asection
* sec
)
11498 struct section_list
* entry
;
11500 entry
= find_arm_elf_section_entry (sec
);
11504 if (entry
->prev
!= NULL
)
11505 entry
->prev
->next
= entry
->next
;
11506 if (entry
->next
!= NULL
)
11507 entry
->next
->prev
= entry
->prev
;
11508 if (entry
== sections_with_arm_elf_section_data
)
11509 sections_with_arm_elf_section_data
= entry
->next
;
11518 struct bfd_link_info
*info
;
11521 bfd_boolean (*func
) (void *, const char *, Elf_Internal_Sym
*,
11522 asection
*, struct elf_link_hash_entry
*);
11523 } output_arch_syminfo
;
11525 enum map_symbol_type
11533 /* Output a single mapping symbol. */
11536 elf32_arm_output_map_sym (output_arch_syminfo
*osi
,
11537 enum map_symbol_type type
,
11540 static const char *names
[3] = {"$a", "$t", "$d"};
11541 struct elf32_arm_link_hash_table
*htab
;
11542 Elf_Internal_Sym sym
;
11544 htab
= elf32_arm_hash_table (osi
->info
);
11545 sym
.st_value
= osi
->sec
->output_section
->vma
11546 + osi
->sec
->output_offset
11550 sym
.st_info
= ELF_ST_INFO (STB_LOCAL
, STT_NOTYPE
);
11551 sym
.st_shndx
= osi
->sec_shndx
;
11552 if (!osi
->func (osi
->finfo
, names
[type
], &sym
, osi
->sec
, NULL
))
11558 /* Output mapping symbols for PLT entries associated with H. */
11561 elf32_arm_output_plt_map (struct elf_link_hash_entry
*h
, void *inf
)
11563 output_arch_syminfo
*osi
= (output_arch_syminfo
*) inf
;
11564 struct elf32_arm_link_hash_table
*htab
;
11565 struct elf32_arm_link_hash_entry
*eh
;
11568 htab
= elf32_arm_hash_table (osi
->info
);
11570 if (h
->root
.type
== bfd_link_hash_indirect
)
11573 if (h
->root
.type
== bfd_link_hash_warning
)
11574 /* When warning symbols are created, they **replace** the "real"
11575 entry in the hash table, thus we never get to see the real
11576 symbol in a hash traversal. So look at it now. */
11577 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
11579 if (h
->plt
.offset
== (bfd_vma
) -1)
11582 eh
= (struct elf32_arm_link_hash_entry
*) h
;
11583 addr
= h
->plt
.offset
;
11584 if (htab
->symbian_p
)
11586 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
))
11588 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 4))
11591 else if (htab
->vxworks_p
)
11593 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
))
11595 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 8))
11597 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
+ 12))
11599 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 20))
11604 bfd_signed_vma thumb_refs
;
11606 thumb_refs
= eh
->plt_thumb_refcount
;
11607 if (!htab
->use_blx
)
11608 thumb_refs
+= eh
->plt_maybe_thumb_refcount
;
11610 if (thumb_refs
> 0)
11612 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_THUMB
, addr
- 4))
11615 #ifdef FOUR_WORD_PLT
11616 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
))
11618 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 12))
11621 /* A three-word PLT with no Thumb thunk contains only Arm code,
11622 so only need to output a mapping symbol for the first PLT entry and
11623 entries with thumb thunks. */
11624 if (thumb_refs
> 0 || addr
== 20)
11626 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
))
11635 /* Output a single local symbol for a generated stub. */
11638 elf32_arm_output_stub_sym (output_arch_syminfo
*osi
, const char *name
,
11639 bfd_vma offset
, bfd_vma size
)
11641 struct elf32_arm_link_hash_table
*htab
;
11642 Elf_Internal_Sym sym
;
11644 htab
= elf32_arm_hash_table (osi
->info
);
11645 sym
.st_value
= osi
->sec
->output_section
->vma
11646 + osi
->sec
->output_offset
11648 sym
.st_size
= size
;
11650 sym
.st_info
= ELF_ST_INFO (STB_LOCAL
, STT_FUNC
);
11651 sym
.st_shndx
= osi
->sec_shndx
;
11652 if (!osi
->func (osi
->finfo
, name
, &sym
, osi
->sec
, NULL
))
11658 arm_map_one_stub (struct bfd_hash_entry
* gen_entry
,
11661 struct elf32_arm_stub_hash_entry
*stub_entry
;
11662 struct bfd_link_info
*info
;
11663 struct elf32_arm_link_hash_table
*htab
;
11664 asection
*stub_sec
;
11667 output_arch_syminfo
*osi
;
11669 /* Massage our args to the form they really have. */
11670 stub_entry
= (struct elf32_arm_stub_hash_entry
*) gen_entry
;
11671 osi
= (output_arch_syminfo
*) in_arg
;
11675 htab
= elf32_arm_hash_table (info
);
11676 stub_sec
= stub_entry
->stub_sec
;
11678 /* Ensure this stub is attached to the current section being
11680 if (stub_sec
!= osi
->sec
)
11683 addr
= (bfd_vma
) stub_entry
->stub_offset
;
11684 stub_name
= stub_entry
->output_name
;
11686 switch (stub_entry
->stub_type
)
11688 case arm_stub_long_branch_any_any
:
11689 if (!elf32_arm_output_stub_sym (osi
, stub_name
, addr
, 8))
11691 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
))
11693 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 4))
11696 case arm_stub_long_branch_v4t_arm_thumb
:
11697 if (!elf32_arm_output_stub_sym (osi
, stub_name
, addr
, 12))
11699 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
))
11701 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 8))
11704 case arm_stub_long_branch_thumb_only
:
11705 if (!elf32_arm_output_stub_sym (osi
, stub_name
, addr
| 1, 16))
11707 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_THUMB
, addr
))
11709 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 12))
11712 case arm_stub_long_branch_v4t_thumb_arm
:
11713 if (!elf32_arm_output_stub_sym (osi
, stub_name
, addr
| 1, 20))
11715 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_THUMB
, addr
))
11717 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
+ 4))
11719 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 8))
11722 case arm_stub_short_branch_v4t_thumb_arm
:
11723 if (!elf32_arm_output_stub_sym (osi
, stub_name
, addr
| 1, 8))
11725 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_THUMB
, addr
))
11727 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
+ 4))
11730 case arm_stub_long_branch_any_any_pic
:
11731 if (!elf32_arm_output_stub_sym (osi
, stub_name
, addr
, 12))
11733 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_ARM
, addr
))
11735 if (!elf32_arm_output_map_sym (osi
, ARM_MAP_DATA
, addr
+ 8))
11745 /* Output mapping symbols for linker generated sections. */
11748 elf32_arm_output_arch_local_syms (bfd
*output_bfd
,
11749 struct bfd_link_info
*info
,
11751 bfd_boolean (*func
) (void *, const char *,
11752 Elf_Internal_Sym
*,
11754 struct elf_link_hash_entry
*))
11756 output_arch_syminfo osi
;
11757 struct elf32_arm_link_hash_table
*htab
;
11759 bfd_size_type size
;
11761 htab
= elf32_arm_hash_table (info
);
11762 check_use_blx (htab
);
11768 /* ARM->Thumb glue. */
11769 if (htab
->arm_glue_size
> 0)
11771 osi
.sec
= bfd_get_section_by_name (htab
->bfd_of_glue_owner
,
11772 ARM2THUMB_GLUE_SECTION_NAME
);
11774 osi
.sec_shndx
= _bfd_elf_section_from_bfd_section
11775 (output_bfd
, osi
.sec
->output_section
);
11776 if (info
->shared
|| htab
->root
.is_relocatable_executable
11777 || htab
->pic_veneer
)
11778 size
= ARM2THUMB_PIC_GLUE_SIZE
;
11779 else if (htab
->use_blx
)
11780 size
= ARM2THUMB_V5_STATIC_GLUE_SIZE
;
11782 size
= ARM2THUMB_STATIC_GLUE_SIZE
;
11784 for (offset
= 0; offset
< htab
->arm_glue_size
; offset
+= size
)
11786 elf32_arm_output_map_sym (&osi
, ARM_MAP_ARM
, offset
);
11787 elf32_arm_output_map_sym (&osi
, ARM_MAP_DATA
, offset
+ size
- 4);
11791 /* Thumb->ARM glue. */
11792 if (htab
->thumb_glue_size
> 0)
11794 osi
.sec
= bfd_get_section_by_name (htab
->bfd_of_glue_owner
,
11795 THUMB2ARM_GLUE_SECTION_NAME
);
11797 osi
.sec_shndx
= _bfd_elf_section_from_bfd_section
11798 (output_bfd
, osi
.sec
->output_section
);
11799 size
= THUMB2ARM_GLUE_SIZE
;
11801 for (offset
= 0; offset
< htab
->thumb_glue_size
; offset
+= size
)
11803 elf32_arm_output_map_sym (&osi
, ARM_MAP_THUMB
, offset
);
11804 elf32_arm_output_map_sym (&osi
, ARM_MAP_ARM
, offset
+ 4);
11808 /* ARMv4 BX veneers. */
11809 if (htab
->bx_glue_size
> 0)
11811 osi
.sec
= bfd_get_section_by_name (htab
->bfd_of_glue_owner
,
11812 ARM_BX_GLUE_SECTION_NAME
);
11814 osi
.sec_shndx
= _bfd_elf_section_from_bfd_section
11815 (output_bfd
, osi
.sec
->output_section
);
11817 elf32_arm_output_map_sym (&osi
, ARM_MAP_ARM
, 0);
11820 /* Long calls stubs. */
11821 if (htab
->stub_bfd
&& htab
->stub_bfd
->sections
)
11823 asection
* stub_sec
;
11825 for (stub_sec
= htab
->stub_bfd
->sections
;
11827 stub_sec
= stub_sec
->next
)
11829 /* Ignore non-stub sections. */
11830 if (!strstr (stub_sec
->name
, STUB_SUFFIX
))
11833 osi
.sec
= stub_sec
;
11835 osi
.sec_shndx
= _bfd_elf_section_from_bfd_section
11836 (output_bfd
, osi
.sec
->output_section
);
11838 bfd_hash_traverse (&htab
->stub_hash_table
, arm_map_one_stub
, &osi
);
11842 /* Finally, output mapping symbols for the PLT. */
11843 if (!htab
->splt
|| htab
->splt
->size
== 0)
11846 osi
.sec_shndx
= _bfd_elf_section_from_bfd_section (output_bfd
,
11847 htab
->splt
->output_section
);
11848 osi
.sec
= htab
->splt
;
11849 /* Output mapping symbols for the plt header. SymbianOS does not have a
11851 if (htab
->vxworks_p
)
11853 /* VxWorks shared libraries have no PLT header. */
11856 if (!elf32_arm_output_map_sym (&osi
, ARM_MAP_ARM
, 0))
11858 if (!elf32_arm_output_map_sym (&osi
, ARM_MAP_DATA
, 12))
11862 else if (!htab
->symbian_p
)
11864 if (!elf32_arm_output_map_sym (&osi
, ARM_MAP_ARM
, 0))
11866 #ifndef FOUR_WORD_PLT
11867 if (!elf32_arm_output_map_sym (&osi
, ARM_MAP_DATA
, 16))
11872 elf_link_hash_traverse (&htab
->root
, elf32_arm_output_plt_map
, (void *) &osi
);
11876 /* Allocate target specific section data. */
11879 elf32_arm_new_section_hook (bfd
*abfd
, asection
*sec
)
11881 if (!sec
->used_by_bfd
)
11883 _arm_elf_section_data
*sdata
;
11884 bfd_size_type amt
= sizeof (*sdata
);
11886 sdata
= bfd_zalloc (abfd
, amt
);
11889 sec
->used_by_bfd
= sdata
;
11892 record_section_with_arm_elf_section_data (sec
);
11894 return _bfd_elf_new_section_hook (abfd
, sec
);
11898 /* Used to order a list of mapping symbols by address. */
11901 elf32_arm_compare_mapping (const void * a
, const void * b
)
11903 const elf32_arm_section_map
*amap
= (const elf32_arm_section_map
*) a
;
11904 const elf32_arm_section_map
*bmap
= (const elf32_arm_section_map
*) b
;
11906 if (amap
->vma
> bmap
->vma
)
11908 else if (amap
->vma
< bmap
->vma
)
11910 else if (amap
->type
> bmap
->type
)
11911 /* Ensure results do not depend on the host qsort for objects with
11912 multiple mapping symbols at the same address by sorting on type
11915 else if (amap
->type
< bmap
->type
)
11922 /* Do code byteswapping. Return FALSE afterwards so that the section is
11923 written out as normal. */
11926 elf32_arm_write_section (bfd
*output_bfd
,
11927 struct bfd_link_info
*link_info
,
11929 bfd_byte
*contents
)
11931 int mapcount
, errcount
;
11932 _arm_elf_section_data
*arm_data
;
11933 struct elf32_arm_link_hash_table
*globals
= elf32_arm_hash_table (link_info
);
11934 elf32_arm_section_map
*map
;
11935 elf32_vfp11_erratum_list
*errnode
;
11938 bfd_vma offset
= sec
->output_section
->vma
+ sec
->output_offset
;
11942 /* If this section has not been allocated an _arm_elf_section_data
11943 structure then we cannot record anything. */
11944 arm_data
= get_arm_elf_section_data (sec
);
11945 if (arm_data
== NULL
)
11948 mapcount
= arm_data
->mapcount
;
11949 map
= arm_data
->map
;
11950 errcount
= arm_data
->erratumcount
;
11954 unsigned int endianflip
= bfd_big_endian (output_bfd
) ? 3 : 0;
11956 for (errnode
= arm_data
->erratumlist
; errnode
!= 0;
11957 errnode
= errnode
->next
)
11959 bfd_vma index
= errnode
->vma
- offset
;
11961 switch (errnode
->type
)
11963 case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER
:
11965 bfd_vma branch_to_veneer
;
11966 /* Original condition code of instruction, plus bit mask for
11967 ARM B instruction. */
11968 unsigned int insn
= (errnode
->u
.b
.vfp_insn
& 0xf0000000)
11971 /* The instruction is before the label. */
11974 /* Above offset included in -4 below. */
11975 branch_to_veneer
= errnode
->u
.b
.veneer
->vma
11976 - errnode
->vma
- 4;
11978 if ((signed) branch_to_veneer
< -(1 << 25)
11979 || (signed) branch_to_veneer
>= (1 << 25))
11980 (*_bfd_error_handler
) (_("%B: error: VFP11 veneer out of "
11981 "range"), output_bfd
);
11983 insn
|= (branch_to_veneer
>> 2) & 0xffffff;
11984 contents
[endianflip
^ index
] = insn
& 0xff;
11985 contents
[endianflip
^ (index
+ 1)] = (insn
>> 8) & 0xff;
11986 contents
[endianflip
^ (index
+ 2)] = (insn
>> 16) & 0xff;
11987 contents
[endianflip
^ (index
+ 3)] = (insn
>> 24) & 0xff;
11991 case VFP11_ERRATUM_ARM_VENEER
:
11993 bfd_vma branch_from_veneer
;
11996 /* Take size of veneer into account. */
11997 branch_from_veneer
= errnode
->u
.v
.branch
->vma
11998 - errnode
->vma
- 12;
12000 if ((signed) branch_from_veneer
< -(1 << 25)
12001 || (signed) branch_from_veneer
>= (1 << 25))
12002 (*_bfd_error_handler
) (_("%B: error: VFP11 veneer out of "
12003 "range"), output_bfd
);
12005 /* Original instruction. */
12006 insn
= errnode
->u
.v
.branch
->u
.b
.vfp_insn
;
12007 contents
[endianflip
^ index
] = insn
& 0xff;
12008 contents
[endianflip
^ (index
+ 1)] = (insn
>> 8) & 0xff;
12009 contents
[endianflip
^ (index
+ 2)] = (insn
>> 16) & 0xff;
12010 contents
[endianflip
^ (index
+ 3)] = (insn
>> 24) & 0xff;
12012 /* Branch back to insn after original insn. */
12013 insn
= 0xea000000 | ((branch_from_veneer
>> 2) & 0xffffff);
12014 contents
[endianflip
^ (index
+ 4)] = insn
& 0xff;
12015 contents
[endianflip
^ (index
+ 5)] = (insn
>> 8) & 0xff;
12016 contents
[endianflip
^ (index
+ 6)] = (insn
>> 16) & 0xff;
12017 contents
[endianflip
^ (index
+ 7)] = (insn
>> 24) & 0xff;
12030 if (globals
->byteswap_code
)
12032 qsort (map
, mapcount
, sizeof (* map
), elf32_arm_compare_mapping
);
12035 for (i
= 0; i
< mapcount
; i
++)
12037 if (i
== mapcount
- 1)
12040 end
= map
[i
+ 1].vma
;
12042 switch (map
[i
].type
)
12045 /* Byte swap code words. */
12046 while (ptr
+ 3 < end
)
12048 tmp
= contents
[ptr
];
12049 contents
[ptr
] = contents
[ptr
+ 3];
12050 contents
[ptr
+ 3] = tmp
;
12051 tmp
= contents
[ptr
+ 1];
12052 contents
[ptr
+ 1] = contents
[ptr
+ 2];
12053 contents
[ptr
+ 2] = tmp
;
12059 /* Byte swap code halfwords. */
12060 while (ptr
+ 1 < end
)
12062 tmp
= contents
[ptr
];
12063 contents
[ptr
] = contents
[ptr
+ 1];
12064 contents
[ptr
+ 1] = tmp
;
12070 /* Leave data alone. */
12078 arm_data
->mapcount
= 0;
12079 arm_data
->mapsize
= 0;
12080 arm_data
->map
= NULL
;
12081 unrecord_section_with_arm_elf_section_data (sec
);
12087 unrecord_section_via_map_over_sections (bfd
* abfd ATTRIBUTE_UNUSED
,
12089 void * ignore ATTRIBUTE_UNUSED
)
12091 unrecord_section_with_arm_elf_section_data (sec
);
12095 elf32_arm_close_and_cleanup (bfd
* abfd
)
12097 if (abfd
->sections
)
12098 bfd_map_over_sections (abfd
,
12099 unrecord_section_via_map_over_sections
,
12102 return _bfd_elf_close_and_cleanup (abfd
);
12106 elf32_arm_bfd_free_cached_info (bfd
* abfd
)
12108 if (abfd
->sections
)
12109 bfd_map_over_sections (abfd
,
12110 unrecord_section_via_map_over_sections
,
12113 return _bfd_free_cached_info (abfd
);
12116 /* Display STT_ARM_TFUNC symbols as functions. */
12119 elf32_arm_symbol_processing (bfd
*abfd ATTRIBUTE_UNUSED
,
12122 elf_symbol_type
*elfsym
= (elf_symbol_type
*) asym
;
12124 if (ELF_ST_TYPE (elfsym
->internal_elf_sym
.st_info
) == STT_ARM_TFUNC
)
12125 elfsym
->symbol
.flags
|= BSF_FUNCTION
;
12129 /* Mangle thumb function symbols as we read them in. */
12132 elf32_arm_swap_symbol_in (bfd
* abfd
,
12135 Elf_Internal_Sym
*dst
)
12137 if (!bfd_elf32_swap_symbol_in (abfd
, psrc
, pshn
, dst
))
12140 /* New EABI objects mark thumb function symbols by setting the low bit of
12141 the address. Turn these into STT_ARM_TFUNC. */
12142 if ((ELF_ST_TYPE (dst
->st_info
) == STT_FUNC
)
12143 && (dst
->st_value
& 1))
12145 dst
->st_info
= ELF_ST_INFO (ELF_ST_BIND (dst
->st_info
), STT_ARM_TFUNC
);
12146 dst
->st_value
&= ~(bfd_vma
) 1;
12152 /* Mangle thumb function symbols as we write them out. */
12155 elf32_arm_swap_symbol_out (bfd
*abfd
,
12156 const Elf_Internal_Sym
*src
,
12160 Elf_Internal_Sym newsym
;
12162 /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
12163 of the address set, as per the new EABI. We do this unconditionally
12164 because objcopy does not set the elf header flags until after
12165 it writes out the symbol table. */
12166 if (ELF_ST_TYPE (src
->st_info
) == STT_ARM_TFUNC
)
12169 newsym
.st_info
= ELF_ST_INFO (ELF_ST_BIND (src
->st_info
), STT_FUNC
);
12170 if (newsym
.st_shndx
!= SHN_UNDEF
)
12172 /* Do this only for defined symbols. At link type, the static
12173 linker will simulate the work of dynamic linker of resolving
12174 symbols and will carry over the thumbness of found symbols to
12175 the output symbol table. It's not clear how it happens, but
12176 the thumbness of undefined symbols can well be different at
12177 runtime, and writing '1' for them will be confusing for users
12178 and possibly for dynamic linker itself.
12180 newsym
.st_value
|= 1;
12185 bfd_elf32_swap_symbol_out (abfd
, src
, cdst
, shndx
);
12188 /* Add the PT_ARM_EXIDX program header. */
12191 elf32_arm_modify_segment_map (bfd
*abfd
,
12192 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
12194 struct elf_segment_map
*m
;
12197 sec
= bfd_get_section_by_name (abfd
, ".ARM.exidx");
12198 if (sec
!= NULL
&& (sec
->flags
& SEC_LOAD
) != 0)
12200 /* If there is already a PT_ARM_EXIDX header, then we do not
12201 want to add another one. This situation arises when running
12202 "strip"; the input binary already has the header. */
12203 m
= elf_tdata (abfd
)->segment_map
;
12204 while (m
&& m
->p_type
!= PT_ARM_EXIDX
)
12208 m
= bfd_zalloc (abfd
, sizeof (struct elf_segment_map
));
12211 m
->p_type
= PT_ARM_EXIDX
;
12213 m
->sections
[0] = sec
;
12215 m
->next
= elf_tdata (abfd
)->segment_map
;
12216 elf_tdata (abfd
)->segment_map
= m
;
12223 /* We may add a PT_ARM_EXIDX program header. */
12226 elf32_arm_additional_program_headers (bfd
*abfd
,
12227 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
12231 sec
= bfd_get_section_by_name (abfd
, ".ARM.exidx");
12232 if (sec
!= NULL
&& (sec
->flags
& SEC_LOAD
) != 0)
12238 /* We have two function types: STT_FUNC and STT_ARM_TFUNC. */
12241 elf32_arm_is_function_type (unsigned int type
)
12243 return (type
== STT_FUNC
) || (type
== STT_ARM_TFUNC
);
12246 /* We use this to override swap_symbol_in and swap_symbol_out. */
12247 const struct elf_size_info elf32_arm_size_info
=
12249 sizeof (Elf32_External_Ehdr
),
12250 sizeof (Elf32_External_Phdr
),
12251 sizeof (Elf32_External_Shdr
),
12252 sizeof (Elf32_External_Rel
),
12253 sizeof (Elf32_External_Rela
),
12254 sizeof (Elf32_External_Sym
),
12255 sizeof (Elf32_External_Dyn
),
12256 sizeof (Elf_External_Note
),
12260 ELFCLASS32
, EV_CURRENT
,
12261 bfd_elf32_write_out_phdrs
,
12262 bfd_elf32_write_shdrs_and_ehdr
,
12263 bfd_elf32_checksum_contents
,
12264 bfd_elf32_write_relocs
,
12265 elf32_arm_swap_symbol_in
,
12266 elf32_arm_swap_symbol_out
,
12267 bfd_elf32_slurp_reloc_table
,
12268 bfd_elf32_slurp_symbol_table
,
12269 bfd_elf32_swap_dyn_in
,
12270 bfd_elf32_swap_dyn_out
,
12271 bfd_elf32_swap_reloc_in
,
12272 bfd_elf32_swap_reloc_out
,
12273 bfd_elf32_swap_reloca_in
,
12274 bfd_elf32_swap_reloca_out
12277 #define ELF_ARCH bfd_arch_arm
12278 #define ELF_MACHINE_CODE EM_ARM
12279 #ifdef __QNXTARGET__
12280 #define ELF_MAXPAGESIZE 0x1000
12282 #define ELF_MAXPAGESIZE 0x8000
12284 #define ELF_MINPAGESIZE 0x1000
12285 #define ELF_COMMONPAGESIZE 0x1000
12287 #define bfd_elf32_mkobject elf32_arm_mkobject
12289 #define bfd_elf32_bfd_copy_private_bfd_data elf32_arm_copy_private_bfd_data
12290 #define bfd_elf32_bfd_merge_private_bfd_data elf32_arm_merge_private_bfd_data
12291 #define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
12292 #define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
12293 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
12294 #define bfd_elf32_bfd_link_hash_table_free elf32_arm_hash_table_free
12295 #define bfd_elf32_bfd_reloc_type_lookup elf32_arm_reloc_type_lookup
12296 #define bfd_elf32_bfd_reloc_name_lookup elf32_arm_reloc_name_lookup
12297 #define bfd_elf32_find_nearest_line elf32_arm_find_nearest_line
12298 #define bfd_elf32_find_inliner_info elf32_arm_find_inliner_info
12299 #define bfd_elf32_new_section_hook elf32_arm_new_section_hook
12300 #define bfd_elf32_bfd_is_target_special_symbol elf32_arm_is_target_special_symbol
12301 #define bfd_elf32_close_and_cleanup elf32_arm_close_and_cleanup
12302 #define bfd_elf32_bfd_free_cached_info elf32_arm_bfd_free_cached_info
12304 #define elf_backend_get_symbol_type elf32_arm_get_symbol_type
12305 #define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook
12306 #define elf_backend_gc_mark_extra_sections elf32_arm_gc_mark_extra_sections
12307 #define elf_backend_gc_sweep_hook elf32_arm_gc_sweep_hook
12308 #define elf_backend_check_relocs elf32_arm_check_relocs
12309 #define elf_backend_relocate_section elf32_arm_relocate_section
12310 #define elf_backend_write_section elf32_arm_write_section
12311 #define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol
12312 #define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections
12313 #define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol
12314 #define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections
12315 #define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections
12316 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections
12317 #define elf_backend_post_process_headers elf32_arm_post_process_headers
12318 #define elf_backend_reloc_type_class elf32_arm_reloc_type_class
12319 #define elf_backend_object_p elf32_arm_object_p
12320 #define elf_backend_section_flags elf32_arm_section_flags
12321 #define elf_backend_fake_sections elf32_arm_fake_sections
12322 #define elf_backend_section_from_shdr elf32_arm_section_from_shdr
12323 #define elf_backend_final_write_processing elf32_arm_final_write_processing
12324 #define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol
12325 #define elf_backend_symbol_processing elf32_arm_symbol_processing
12326 #define elf_backend_size_info elf32_arm_size_info
12327 #define elf_backend_modify_segment_map elf32_arm_modify_segment_map
12328 #define elf_backend_additional_program_headers elf32_arm_additional_program_headers
12329 #define elf_backend_output_arch_local_syms elf32_arm_output_arch_local_syms
12330 #define elf_backend_begin_write_processing elf32_arm_begin_write_processing
12331 #define elf_backend_is_function_type elf32_arm_is_function_type
12333 #define elf_backend_can_refcount 1
12334 #define elf_backend_can_gc_sections 1
12335 #define elf_backend_plt_readonly 1
12336 #define elf_backend_want_got_plt 1
12337 #define elf_backend_want_plt_sym 0
12338 #define elf_backend_may_use_rel_p 1
12339 #define elf_backend_may_use_rela_p 0
12340 #define elf_backend_default_use_rela_p 0
12342 #define elf_backend_got_header_size 12
12344 #undef elf_backend_obj_attrs_vendor
12345 #define elf_backend_obj_attrs_vendor "aeabi"
12346 #undef elf_backend_obj_attrs_section
12347 #define elf_backend_obj_attrs_section ".ARM.attributes"
12348 #undef elf_backend_obj_attrs_arg_type
12349 #define elf_backend_obj_attrs_arg_type elf32_arm_obj_attrs_arg_type
12350 #undef elf_backend_obj_attrs_section_type
12351 #define elf_backend_obj_attrs_section_type SHT_ARM_ATTRIBUTES
12352 #define elf_backend_obj_attrs_order elf32_arm_obj_attrs_order
12354 #include "elf32-target.h"
12356 /* VxWorks Targets. */
12358 #undef TARGET_LITTLE_SYM
12359 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vxworks_vec
12360 #undef TARGET_LITTLE_NAME
12361 #define TARGET_LITTLE_NAME "elf32-littlearm-vxworks"
12362 #undef TARGET_BIG_SYM
12363 #define TARGET_BIG_SYM bfd_elf32_bigarm_vxworks_vec
12364 #undef TARGET_BIG_NAME
12365 #define TARGET_BIG_NAME "elf32-bigarm-vxworks"
12367 /* Like elf32_arm_link_hash_table_create -- but overrides
12368 appropriately for VxWorks. */
12370 static struct bfd_link_hash_table
*
12371 elf32_arm_vxworks_link_hash_table_create (bfd
*abfd
)
12373 struct bfd_link_hash_table
*ret
;
12375 ret
= elf32_arm_link_hash_table_create (abfd
);
12378 struct elf32_arm_link_hash_table
*htab
12379 = (struct elf32_arm_link_hash_table
*) ret
;
12381 htab
->vxworks_p
= 1;
12387 elf32_arm_vxworks_final_write_processing (bfd
*abfd
, bfd_boolean linker
)
12389 elf32_arm_final_write_processing (abfd
, linker
);
12390 elf_vxworks_final_write_processing (abfd
, linker
);
12394 #define elf32_bed elf32_arm_vxworks_bed
12396 #undef bfd_elf32_bfd_link_hash_table_create
12397 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_vxworks_link_hash_table_create
12398 #undef elf_backend_add_symbol_hook
12399 #define elf_backend_add_symbol_hook elf_vxworks_add_symbol_hook
12400 #undef elf_backend_final_write_processing
12401 #define elf_backend_final_write_processing elf32_arm_vxworks_final_write_processing
12402 #undef elf_backend_emit_relocs
12403 #define elf_backend_emit_relocs elf_vxworks_emit_relocs
12405 #undef elf_backend_may_use_rel_p
12406 #define elf_backend_may_use_rel_p 0
12407 #undef elf_backend_may_use_rela_p
12408 #define elf_backend_may_use_rela_p 1
12409 #undef elf_backend_default_use_rela_p
12410 #define elf_backend_default_use_rela_p 1
12411 #undef elf_backend_want_plt_sym
12412 #define elf_backend_want_plt_sym 1
12413 #undef ELF_MAXPAGESIZE
12414 #define ELF_MAXPAGESIZE 0x1000
12416 #include "elf32-target.h"
12419 /* Symbian OS Targets. */
12421 #undef TARGET_LITTLE_SYM
12422 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_symbian_vec
12423 #undef TARGET_LITTLE_NAME
12424 #define TARGET_LITTLE_NAME "elf32-littlearm-symbian"
12425 #undef TARGET_BIG_SYM
12426 #define TARGET_BIG_SYM bfd_elf32_bigarm_symbian_vec
12427 #undef TARGET_BIG_NAME
12428 #define TARGET_BIG_NAME "elf32-bigarm-symbian"
12430 /* Like elf32_arm_link_hash_table_create -- but overrides
12431 appropriately for Symbian OS. */
12433 static struct bfd_link_hash_table
*
12434 elf32_arm_symbian_link_hash_table_create (bfd
*abfd
)
12436 struct bfd_link_hash_table
*ret
;
12438 ret
= elf32_arm_link_hash_table_create (abfd
);
12441 struct elf32_arm_link_hash_table
*htab
12442 = (struct elf32_arm_link_hash_table
*)ret
;
12443 /* There is no PLT header for Symbian OS. */
12444 htab
->plt_header_size
= 0;
12445 /* The PLT entries are each one instruction and one word. */
12446 htab
->plt_entry_size
= 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry
);
12447 htab
->symbian_p
= 1;
12448 /* Symbian uses armv5t or above, so use_blx is always true. */
12450 htab
->root
.is_relocatable_executable
= 1;
12455 static const struct bfd_elf_special_section
12456 elf32_arm_symbian_special_sections
[] =
12458 /* In a BPABI executable, the dynamic linking sections do not go in
12459 the loadable read-only segment. The post-linker may wish to
12460 refer to these sections, but they are not part of the final
12462 { STRING_COMMA_LEN (".dynamic"), 0, SHT_DYNAMIC
, 0 },
12463 { STRING_COMMA_LEN (".dynstr"), 0, SHT_STRTAB
, 0 },
12464 { STRING_COMMA_LEN (".dynsym"), 0, SHT_DYNSYM
, 0 },
12465 { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS
, 0 },
12466 { STRING_COMMA_LEN (".hash"), 0, SHT_HASH
, 0 },
12467 /* These sections do not need to be writable as the SymbianOS
12468 postlinker will arrange things so that no dynamic relocation is
12470 { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY
, SHF_ALLOC
},
12471 { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY
, SHF_ALLOC
},
12472 { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY
, SHF_ALLOC
},
12473 { NULL
, 0, 0, 0, 0 }
12477 elf32_arm_symbian_begin_write_processing (bfd
*abfd
,
12478 struct bfd_link_info
*link_info
)
12480 /* BPABI objects are never loaded directly by an OS kernel; they are
12481 processed by a postlinker first, into an OS-specific format. If
12482 the D_PAGED bit is set on the file, BFD will align segments on
12483 page boundaries, so that an OS can directly map the file. With
12484 BPABI objects, that just results in wasted space. In addition,
12485 because we clear the D_PAGED bit, map_sections_to_segments will
12486 recognize that the program headers should not be mapped into any
12487 loadable segment. */
12488 abfd
->flags
&= ~D_PAGED
;
12489 elf32_arm_begin_write_processing (abfd
, link_info
);
12493 elf32_arm_symbian_modify_segment_map (bfd
*abfd
,
12494 struct bfd_link_info
*info
)
12496 struct elf_segment_map
*m
;
12499 /* BPABI shared libraries and executables should have a PT_DYNAMIC
12500 segment. However, because the .dynamic section is not marked
12501 with SEC_LOAD, the generic ELF code will not create such a
12503 dynsec
= bfd_get_section_by_name (abfd
, ".dynamic");
12506 for (m
= elf_tdata (abfd
)->segment_map
; m
!= NULL
; m
= m
->next
)
12507 if (m
->p_type
== PT_DYNAMIC
)
12512 m
= _bfd_elf_make_dynamic_segment (abfd
, dynsec
);
12513 m
->next
= elf_tdata (abfd
)->segment_map
;
12514 elf_tdata (abfd
)->segment_map
= m
;
12518 /* Also call the generic arm routine. */
12519 return elf32_arm_modify_segment_map (abfd
, info
);
12522 /* Return address for Ith PLT stub in section PLT, for relocation REL
12523 or (bfd_vma) -1 if it should not be included. */
12526 elf32_arm_symbian_plt_sym_val (bfd_vma i
, const asection
*plt
,
12527 const arelent
*rel ATTRIBUTE_UNUSED
)
12529 return plt
->vma
+ 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry
) * i
;
12534 #define elf32_bed elf32_arm_symbian_bed
12536 /* The dynamic sections are not allocated on SymbianOS; the postlinker
12537 will process them and then discard them. */
12538 #undef ELF_DYNAMIC_SEC_FLAGS
12539 #define ELF_DYNAMIC_SEC_FLAGS \
12540 (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
12542 #undef elf_backend_add_symbol_hook
12543 #undef elf_backend_emit_relocs
12545 #undef bfd_elf32_bfd_link_hash_table_create
12546 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_symbian_link_hash_table_create
12547 #undef elf_backend_special_sections
12548 #define elf_backend_special_sections elf32_arm_symbian_special_sections
12549 #undef elf_backend_begin_write_processing
12550 #define elf_backend_begin_write_processing elf32_arm_symbian_begin_write_processing
12551 #undef elf_backend_final_write_processing
12552 #define elf_backend_final_write_processing elf32_arm_final_write_processing
12554 #undef elf_backend_modify_segment_map
12555 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
12557 /* There is no .got section for BPABI objects, and hence no header. */
12558 #undef elf_backend_got_header_size
12559 #define elf_backend_got_header_size 0
12561 /* Similarly, there is no .got.plt section. */
12562 #undef elf_backend_want_got_plt
12563 #define elf_backend_want_got_plt 0
12565 #undef elf_backend_plt_sym_val
12566 #define elf_backend_plt_sym_val elf32_arm_symbian_plt_sym_val
12568 #undef elf_backend_may_use_rel_p
12569 #define elf_backend_may_use_rel_p 1
12570 #undef elf_backend_may_use_rela_p
12571 #define elf_backend_may_use_rela_p 0
12572 #undef elf_backend_default_use_rela_p
12573 #define elf_backend_default_use_rela_p 0
12574 #undef elf_backend_want_plt_sym
12575 #define elf_backend_want_plt_sym 0
12576 #undef ELF_MAXPAGESIZE
12577 #define ELF_MAXPAGESIZE 0x8000
12579 #include "elf32-target.h"