1 /* 32-bit ELF support for ARM
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
23 #include "libiberty.h"
26 #include "elf-vxworks.h"
30 #define NUM_ELEM(a) (sizeof (a) / (sizeof (a)[0]))
33 /* Return the relocation section associated with NAME. HTAB is the
34 bfd's elf32_arm_link_hash_entry. */
35 #define RELOC_SECTION(HTAB, NAME) \
36 ((HTAB)->use_rel ? ".rel" NAME : ".rela" NAME)
38 /* Return size of a relocation entry. HTAB is the bfd's
39 elf32_arm_link_hash_entry. */
40 #define RELOC_SIZE(HTAB) \
42 ? sizeof (Elf32_External_Rel) \
43 : sizeof (Elf32_External_Rela))
45 /* Return function to swap relocations in. HTAB is the bfd's
46 elf32_arm_link_hash_entry. */
47 #define SWAP_RELOC_IN(HTAB) \
49 ? bfd_elf32_swap_reloc_in \
50 : bfd_elf32_swap_reloca_in)
52 /* Return function to swap relocations out. HTAB is the bfd's
53 elf32_arm_link_hash_entry. */
54 #define SWAP_RELOC_OUT(HTAB) \
56 ? bfd_elf32_swap_reloc_out \
57 : bfd_elf32_swap_reloca_out)
59 #define elf_info_to_howto 0
60 #define elf_info_to_howto_rel elf32_arm_info_to_howto
62 #define ARM_ELF_ABI_VERSION 0
63 #define ARM_ELF_OS_ABI_VERSION ELFOSABI_ARM
65 static struct elf_backend_data elf32_arm_vxworks_bed
;
67 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
68 R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
71 static reloc_howto_type elf32_arm_howto_table_1
[] =
74 HOWTO (R_ARM_NONE
, /* type */
76 0, /* size (0 = byte, 1 = short, 2 = long) */
78 FALSE
, /* pc_relative */
80 complain_overflow_dont
,/* complain_on_overflow */
81 bfd_elf_generic_reloc
, /* special_function */
82 "R_ARM_NONE", /* name */
83 FALSE
, /* partial_inplace */
86 FALSE
), /* pcrel_offset */
88 HOWTO (R_ARM_PC24
, /* type */
90 2, /* size (0 = byte, 1 = short, 2 = long) */
92 TRUE
, /* pc_relative */
94 complain_overflow_signed
,/* complain_on_overflow */
95 bfd_elf_generic_reloc
, /* special_function */
96 "R_ARM_PC24", /* name */
97 FALSE
, /* partial_inplace */
98 0x00ffffff, /* src_mask */
99 0x00ffffff, /* dst_mask */
100 TRUE
), /* pcrel_offset */
102 /* 32 bit absolute */
103 HOWTO (R_ARM_ABS32
, /* type */
105 2, /* size (0 = byte, 1 = short, 2 = long) */
107 FALSE
, /* pc_relative */
109 complain_overflow_bitfield
,/* complain_on_overflow */
110 bfd_elf_generic_reloc
, /* special_function */
111 "R_ARM_ABS32", /* name */
112 FALSE
, /* partial_inplace */
113 0xffffffff, /* src_mask */
114 0xffffffff, /* dst_mask */
115 FALSE
), /* pcrel_offset */
117 /* standard 32bit pc-relative reloc */
118 HOWTO (R_ARM_REL32
, /* type */
120 2, /* size (0 = byte, 1 = short, 2 = long) */
122 TRUE
, /* pc_relative */
124 complain_overflow_bitfield
,/* complain_on_overflow */
125 bfd_elf_generic_reloc
, /* special_function */
126 "R_ARM_REL32", /* name */
127 FALSE
, /* partial_inplace */
128 0xffffffff, /* src_mask */
129 0xffffffff, /* dst_mask */
130 TRUE
), /* pcrel_offset */
132 /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
133 HOWTO (R_ARM_LDR_PC_G0
, /* type */
135 0, /* size (0 = byte, 1 = short, 2 = long) */
137 TRUE
, /* pc_relative */
139 complain_overflow_dont
,/* complain_on_overflow */
140 bfd_elf_generic_reloc
, /* special_function */
141 "R_ARM_LDR_PC_G0", /* name */
142 FALSE
, /* partial_inplace */
143 0xffffffff, /* src_mask */
144 0xffffffff, /* dst_mask */
145 TRUE
), /* pcrel_offset */
147 /* 16 bit absolute */
148 HOWTO (R_ARM_ABS16
, /* type */
150 1, /* size (0 = byte, 1 = short, 2 = long) */
152 FALSE
, /* pc_relative */
154 complain_overflow_bitfield
,/* complain_on_overflow */
155 bfd_elf_generic_reloc
, /* special_function */
156 "R_ARM_ABS16", /* name */
157 FALSE
, /* partial_inplace */
158 0x0000ffff, /* src_mask */
159 0x0000ffff, /* dst_mask */
160 FALSE
), /* pcrel_offset */
162 /* 12 bit absolute */
163 HOWTO (R_ARM_ABS12
, /* type */
165 2, /* size (0 = byte, 1 = short, 2 = long) */
167 FALSE
, /* pc_relative */
169 complain_overflow_bitfield
,/* complain_on_overflow */
170 bfd_elf_generic_reloc
, /* special_function */
171 "R_ARM_ABS12", /* name */
172 FALSE
, /* partial_inplace */
173 0x00000fff, /* src_mask */
174 0x00000fff, /* dst_mask */
175 FALSE
), /* pcrel_offset */
177 HOWTO (R_ARM_THM_ABS5
, /* type */
179 1, /* size (0 = byte, 1 = short, 2 = long) */
181 FALSE
, /* pc_relative */
183 complain_overflow_bitfield
,/* complain_on_overflow */
184 bfd_elf_generic_reloc
, /* special_function */
185 "R_ARM_THM_ABS5", /* name */
186 FALSE
, /* partial_inplace */
187 0x000007e0, /* src_mask */
188 0x000007e0, /* dst_mask */
189 FALSE
), /* pcrel_offset */
192 HOWTO (R_ARM_ABS8
, /* type */
194 0, /* size (0 = byte, 1 = short, 2 = long) */
196 FALSE
, /* pc_relative */
198 complain_overflow_bitfield
,/* complain_on_overflow */
199 bfd_elf_generic_reloc
, /* special_function */
200 "R_ARM_ABS8", /* name */
201 FALSE
, /* partial_inplace */
202 0x000000ff, /* src_mask */
203 0x000000ff, /* dst_mask */
204 FALSE
), /* pcrel_offset */
206 HOWTO (R_ARM_SBREL32
, /* type */
208 2, /* size (0 = byte, 1 = short, 2 = long) */
210 FALSE
, /* pc_relative */
212 complain_overflow_dont
,/* complain_on_overflow */
213 bfd_elf_generic_reloc
, /* special_function */
214 "R_ARM_SBREL32", /* name */
215 FALSE
, /* partial_inplace */
216 0xffffffff, /* src_mask */
217 0xffffffff, /* dst_mask */
218 FALSE
), /* pcrel_offset */
220 /* FIXME: Has two more bits of offset in Thumb32. */
221 HOWTO (R_ARM_THM_CALL
, /* type */
223 2, /* size (0 = byte, 1 = short, 2 = long) */
225 TRUE
, /* pc_relative */
227 complain_overflow_signed
,/* complain_on_overflow */
228 bfd_elf_generic_reloc
, /* special_function */
229 "R_ARM_THM_CALL", /* name */
230 FALSE
, /* partial_inplace */
231 0x07ff07ff, /* src_mask */
232 0x07ff07ff, /* dst_mask */
233 TRUE
), /* pcrel_offset */
235 HOWTO (R_ARM_THM_PC8
, /* type */
237 1, /* size (0 = byte, 1 = short, 2 = long) */
239 TRUE
, /* pc_relative */
241 complain_overflow_signed
,/* complain_on_overflow */
242 bfd_elf_generic_reloc
, /* special_function */
243 "R_ARM_THM_PC8", /* name */
244 FALSE
, /* partial_inplace */
245 0x000000ff, /* src_mask */
246 0x000000ff, /* dst_mask */
247 TRUE
), /* pcrel_offset */
249 HOWTO (R_ARM_BREL_ADJ
, /* type */
251 1, /* size (0 = byte, 1 = short, 2 = long) */
253 FALSE
, /* pc_relative */
255 complain_overflow_signed
,/* complain_on_overflow */
256 bfd_elf_generic_reloc
, /* special_function */
257 "R_ARM_BREL_ADJ", /* name */
258 FALSE
, /* partial_inplace */
259 0xffffffff, /* src_mask */
260 0xffffffff, /* dst_mask */
261 FALSE
), /* pcrel_offset */
263 HOWTO (R_ARM_SWI24
, /* type */
265 0, /* size (0 = byte, 1 = short, 2 = long) */
267 FALSE
, /* pc_relative */
269 complain_overflow_signed
,/* complain_on_overflow */
270 bfd_elf_generic_reloc
, /* special_function */
271 "R_ARM_SWI24", /* name */
272 FALSE
, /* partial_inplace */
273 0x00000000, /* src_mask */
274 0x00000000, /* dst_mask */
275 FALSE
), /* pcrel_offset */
277 HOWTO (R_ARM_THM_SWI8
, /* type */
279 0, /* size (0 = byte, 1 = short, 2 = long) */
281 FALSE
, /* pc_relative */
283 complain_overflow_signed
,/* complain_on_overflow */
284 bfd_elf_generic_reloc
, /* special_function */
285 "R_ARM_SWI8", /* name */
286 FALSE
, /* partial_inplace */
287 0x00000000, /* src_mask */
288 0x00000000, /* dst_mask */
289 FALSE
), /* pcrel_offset */
291 /* BLX instruction for the ARM. */
292 HOWTO (R_ARM_XPC25
, /* type */
294 2, /* size (0 = byte, 1 = short, 2 = long) */
296 TRUE
, /* pc_relative */
298 complain_overflow_signed
,/* complain_on_overflow */
299 bfd_elf_generic_reloc
, /* special_function */
300 "R_ARM_XPC25", /* name */
301 FALSE
, /* partial_inplace */
302 0x00ffffff, /* src_mask */
303 0x00ffffff, /* dst_mask */
304 TRUE
), /* pcrel_offset */
306 /* BLX instruction for the Thumb. */
307 HOWTO (R_ARM_THM_XPC22
, /* type */
309 2, /* size (0 = byte, 1 = short, 2 = long) */
311 TRUE
, /* pc_relative */
313 complain_overflow_signed
,/* complain_on_overflow */
314 bfd_elf_generic_reloc
, /* special_function */
315 "R_ARM_THM_XPC22", /* name */
316 FALSE
, /* partial_inplace */
317 0x07ff07ff, /* src_mask */
318 0x07ff07ff, /* dst_mask */
319 TRUE
), /* pcrel_offset */
321 /* Dynamic TLS relocations. */
323 HOWTO (R_ARM_TLS_DTPMOD32
, /* type */
325 2, /* size (0 = byte, 1 = short, 2 = long) */
327 FALSE
, /* pc_relative */
329 complain_overflow_bitfield
,/* complain_on_overflow */
330 bfd_elf_generic_reloc
, /* special_function */
331 "R_ARM_TLS_DTPMOD32", /* name */
332 TRUE
, /* partial_inplace */
333 0xffffffff, /* src_mask */
334 0xffffffff, /* dst_mask */
335 FALSE
), /* pcrel_offset */
337 HOWTO (R_ARM_TLS_DTPOFF32
, /* type */
339 2, /* size (0 = byte, 1 = short, 2 = long) */
341 FALSE
, /* pc_relative */
343 complain_overflow_bitfield
,/* complain_on_overflow */
344 bfd_elf_generic_reloc
, /* special_function */
345 "R_ARM_TLS_DTPOFF32", /* name */
346 TRUE
, /* partial_inplace */
347 0xffffffff, /* src_mask */
348 0xffffffff, /* dst_mask */
349 FALSE
), /* pcrel_offset */
351 HOWTO (R_ARM_TLS_TPOFF32
, /* type */
353 2, /* size (0 = byte, 1 = short, 2 = long) */
355 FALSE
, /* pc_relative */
357 complain_overflow_bitfield
,/* complain_on_overflow */
358 bfd_elf_generic_reloc
, /* special_function */
359 "R_ARM_TLS_TPOFF32", /* name */
360 TRUE
, /* partial_inplace */
361 0xffffffff, /* src_mask */
362 0xffffffff, /* dst_mask */
363 FALSE
), /* pcrel_offset */
365 /* Relocs used in ARM Linux */
367 HOWTO (R_ARM_COPY
, /* type */
369 2, /* size (0 = byte, 1 = short, 2 = long) */
371 FALSE
, /* pc_relative */
373 complain_overflow_bitfield
,/* complain_on_overflow */
374 bfd_elf_generic_reloc
, /* special_function */
375 "R_ARM_COPY", /* name */
376 TRUE
, /* partial_inplace */
377 0xffffffff, /* src_mask */
378 0xffffffff, /* dst_mask */
379 FALSE
), /* pcrel_offset */
381 HOWTO (R_ARM_GLOB_DAT
, /* type */
383 2, /* size (0 = byte, 1 = short, 2 = long) */
385 FALSE
, /* pc_relative */
387 complain_overflow_bitfield
,/* complain_on_overflow */
388 bfd_elf_generic_reloc
, /* special_function */
389 "R_ARM_GLOB_DAT", /* name */
390 TRUE
, /* partial_inplace */
391 0xffffffff, /* src_mask */
392 0xffffffff, /* dst_mask */
393 FALSE
), /* pcrel_offset */
395 HOWTO (R_ARM_JUMP_SLOT
, /* type */
397 2, /* size (0 = byte, 1 = short, 2 = long) */
399 FALSE
, /* pc_relative */
401 complain_overflow_bitfield
,/* complain_on_overflow */
402 bfd_elf_generic_reloc
, /* special_function */
403 "R_ARM_JUMP_SLOT", /* name */
404 TRUE
, /* partial_inplace */
405 0xffffffff, /* src_mask */
406 0xffffffff, /* dst_mask */
407 FALSE
), /* pcrel_offset */
409 HOWTO (R_ARM_RELATIVE
, /* type */
411 2, /* size (0 = byte, 1 = short, 2 = long) */
413 FALSE
, /* pc_relative */
415 complain_overflow_bitfield
,/* complain_on_overflow */
416 bfd_elf_generic_reloc
, /* special_function */
417 "R_ARM_RELATIVE", /* name */
418 TRUE
, /* partial_inplace */
419 0xffffffff, /* src_mask */
420 0xffffffff, /* dst_mask */
421 FALSE
), /* pcrel_offset */
423 HOWTO (R_ARM_GOTOFF32
, /* type */
425 2, /* size (0 = byte, 1 = short, 2 = long) */
427 FALSE
, /* pc_relative */
429 complain_overflow_bitfield
,/* complain_on_overflow */
430 bfd_elf_generic_reloc
, /* special_function */
431 "R_ARM_GOTOFF32", /* name */
432 TRUE
, /* partial_inplace */
433 0xffffffff, /* src_mask */
434 0xffffffff, /* dst_mask */
435 FALSE
), /* pcrel_offset */
437 HOWTO (R_ARM_GOTPC
, /* type */
439 2, /* size (0 = byte, 1 = short, 2 = long) */
441 TRUE
, /* pc_relative */
443 complain_overflow_bitfield
,/* complain_on_overflow */
444 bfd_elf_generic_reloc
, /* special_function */
445 "R_ARM_GOTPC", /* name */
446 TRUE
, /* partial_inplace */
447 0xffffffff, /* src_mask */
448 0xffffffff, /* dst_mask */
449 TRUE
), /* pcrel_offset */
451 HOWTO (R_ARM_GOT32
, /* type */
453 2, /* size (0 = byte, 1 = short, 2 = long) */
455 FALSE
, /* pc_relative */
457 complain_overflow_bitfield
,/* complain_on_overflow */
458 bfd_elf_generic_reloc
, /* special_function */
459 "R_ARM_GOT32", /* name */
460 TRUE
, /* partial_inplace */
461 0xffffffff, /* src_mask */
462 0xffffffff, /* dst_mask */
463 FALSE
), /* pcrel_offset */
465 HOWTO (R_ARM_PLT32
, /* type */
467 2, /* size (0 = byte, 1 = short, 2 = long) */
469 TRUE
, /* pc_relative */
471 complain_overflow_bitfield
,/* complain_on_overflow */
472 bfd_elf_generic_reloc
, /* special_function */
473 "R_ARM_PLT32", /* name */
474 FALSE
, /* partial_inplace */
475 0x00ffffff, /* src_mask */
476 0x00ffffff, /* dst_mask */
477 TRUE
), /* pcrel_offset */
479 HOWTO (R_ARM_CALL
, /* type */
481 2, /* size (0 = byte, 1 = short, 2 = long) */
483 TRUE
, /* pc_relative */
485 complain_overflow_signed
,/* complain_on_overflow */
486 bfd_elf_generic_reloc
, /* special_function */
487 "R_ARM_CALL", /* name */
488 FALSE
, /* partial_inplace */
489 0x00ffffff, /* src_mask */
490 0x00ffffff, /* dst_mask */
491 TRUE
), /* pcrel_offset */
493 HOWTO (R_ARM_JUMP24
, /* type */
495 2, /* size (0 = byte, 1 = short, 2 = long) */
497 TRUE
, /* pc_relative */
499 complain_overflow_signed
,/* complain_on_overflow */
500 bfd_elf_generic_reloc
, /* special_function */
501 "R_ARM_JUMP24", /* name */
502 FALSE
, /* partial_inplace */
503 0x00ffffff, /* src_mask */
504 0x00ffffff, /* dst_mask */
505 TRUE
), /* pcrel_offset */
507 HOWTO (R_ARM_THM_JUMP24
, /* type */
509 2, /* size (0 = byte, 1 = short, 2 = long) */
511 TRUE
, /* pc_relative */
513 complain_overflow_signed
,/* complain_on_overflow */
514 bfd_elf_generic_reloc
, /* special_function */
515 "R_ARM_THM_JUMP24", /* name */
516 FALSE
, /* partial_inplace */
517 0x07ff2fff, /* src_mask */
518 0x07ff2fff, /* dst_mask */
519 TRUE
), /* pcrel_offset */
521 HOWTO (R_ARM_BASE_ABS
, /* type */
523 2, /* size (0 = byte, 1 = short, 2 = long) */
525 FALSE
, /* pc_relative */
527 complain_overflow_dont
,/* complain_on_overflow */
528 bfd_elf_generic_reloc
, /* special_function */
529 "R_ARM_BASE_ABS", /* name */
530 FALSE
, /* partial_inplace */
531 0xffffffff, /* src_mask */
532 0xffffffff, /* dst_mask */
533 FALSE
), /* pcrel_offset */
535 HOWTO (R_ARM_ALU_PCREL7_0
, /* type */
537 2, /* size (0 = byte, 1 = short, 2 = long) */
539 TRUE
, /* pc_relative */
541 complain_overflow_dont
,/* complain_on_overflow */
542 bfd_elf_generic_reloc
, /* special_function */
543 "R_ARM_ALU_PCREL_7_0", /* name */
544 FALSE
, /* partial_inplace */
545 0x00000fff, /* src_mask */
546 0x00000fff, /* dst_mask */
547 TRUE
), /* pcrel_offset */
549 HOWTO (R_ARM_ALU_PCREL15_8
, /* type */
551 2, /* size (0 = byte, 1 = short, 2 = long) */
553 TRUE
, /* pc_relative */
555 complain_overflow_dont
,/* complain_on_overflow */
556 bfd_elf_generic_reloc
, /* special_function */
557 "R_ARM_ALU_PCREL_15_8",/* name */
558 FALSE
, /* partial_inplace */
559 0x00000fff, /* src_mask */
560 0x00000fff, /* dst_mask */
561 TRUE
), /* pcrel_offset */
563 HOWTO (R_ARM_ALU_PCREL23_15
, /* type */
565 2, /* size (0 = byte, 1 = short, 2 = long) */
567 TRUE
, /* pc_relative */
569 complain_overflow_dont
,/* complain_on_overflow */
570 bfd_elf_generic_reloc
, /* special_function */
571 "R_ARM_ALU_PCREL_23_15",/* name */
572 FALSE
, /* partial_inplace */
573 0x00000fff, /* src_mask */
574 0x00000fff, /* dst_mask */
575 TRUE
), /* pcrel_offset */
577 HOWTO (R_ARM_LDR_SBREL_11_0
, /* type */
579 2, /* size (0 = byte, 1 = short, 2 = long) */
581 FALSE
, /* pc_relative */
583 complain_overflow_dont
,/* complain_on_overflow */
584 bfd_elf_generic_reloc
, /* special_function */
585 "R_ARM_LDR_SBREL_11_0",/* name */
586 FALSE
, /* partial_inplace */
587 0x00000fff, /* src_mask */
588 0x00000fff, /* dst_mask */
589 FALSE
), /* pcrel_offset */
591 HOWTO (R_ARM_ALU_SBREL_19_12
, /* type */
593 2, /* size (0 = byte, 1 = short, 2 = long) */
595 FALSE
, /* pc_relative */
597 complain_overflow_dont
,/* complain_on_overflow */
598 bfd_elf_generic_reloc
, /* special_function */
599 "R_ARM_ALU_SBREL_19_12",/* name */
600 FALSE
, /* partial_inplace */
601 0x000ff000, /* src_mask */
602 0x000ff000, /* dst_mask */
603 FALSE
), /* pcrel_offset */
605 HOWTO (R_ARM_ALU_SBREL_27_20
, /* type */
607 2, /* size (0 = byte, 1 = short, 2 = long) */
609 FALSE
, /* pc_relative */
611 complain_overflow_dont
,/* complain_on_overflow */
612 bfd_elf_generic_reloc
, /* special_function */
613 "R_ARM_ALU_SBREL_27_20",/* name */
614 FALSE
, /* partial_inplace */
615 0x0ff00000, /* src_mask */
616 0x0ff00000, /* dst_mask */
617 FALSE
), /* pcrel_offset */
619 HOWTO (R_ARM_TARGET1
, /* type */
621 2, /* size (0 = byte, 1 = short, 2 = long) */
623 FALSE
, /* pc_relative */
625 complain_overflow_dont
,/* complain_on_overflow */
626 bfd_elf_generic_reloc
, /* special_function */
627 "R_ARM_TARGET1", /* name */
628 FALSE
, /* partial_inplace */
629 0xffffffff, /* src_mask */
630 0xffffffff, /* dst_mask */
631 FALSE
), /* pcrel_offset */
633 HOWTO (R_ARM_ROSEGREL32
, /* type */
635 2, /* size (0 = byte, 1 = short, 2 = long) */
637 FALSE
, /* pc_relative */
639 complain_overflow_dont
,/* complain_on_overflow */
640 bfd_elf_generic_reloc
, /* special_function */
641 "R_ARM_ROSEGREL32", /* name */
642 FALSE
, /* partial_inplace */
643 0xffffffff, /* src_mask */
644 0xffffffff, /* dst_mask */
645 FALSE
), /* pcrel_offset */
647 HOWTO (R_ARM_V4BX
, /* type */
649 2, /* size (0 = byte, 1 = short, 2 = long) */
651 FALSE
, /* pc_relative */
653 complain_overflow_dont
,/* complain_on_overflow */
654 bfd_elf_generic_reloc
, /* special_function */
655 "R_ARM_V4BX", /* name */
656 FALSE
, /* partial_inplace */
657 0xffffffff, /* src_mask */
658 0xffffffff, /* dst_mask */
659 FALSE
), /* pcrel_offset */
661 HOWTO (R_ARM_TARGET2
, /* type */
663 2, /* size (0 = byte, 1 = short, 2 = long) */
665 FALSE
, /* pc_relative */
667 complain_overflow_signed
,/* complain_on_overflow */
668 bfd_elf_generic_reloc
, /* special_function */
669 "R_ARM_TARGET2", /* name */
670 FALSE
, /* partial_inplace */
671 0xffffffff, /* src_mask */
672 0xffffffff, /* dst_mask */
673 TRUE
), /* pcrel_offset */
675 HOWTO (R_ARM_PREL31
, /* type */
677 2, /* size (0 = byte, 1 = short, 2 = long) */
679 TRUE
, /* pc_relative */
681 complain_overflow_signed
,/* complain_on_overflow */
682 bfd_elf_generic_reloc
, /* special_function */
683 "R_ARM_PREL31", /* name */
684 FALSE
, /* partial_inplace */
685 0x7fffffff, /* src_mask */
686 0x7fffffff, /* dst_mask */
687 TRUE
), /* pcrel_offset */
689 HOWTO (R_ARM_MOVW_ABS_NC
, /* type */
691 2, /* size (0 = byte, 1 = short, 2 = long) */
693 FALSE
, /* pc_relative */
695 complain_overflow_dont
,/* complain_on_overflow */
696 bfd_elf_generic_reloc
, /* special_function */
697 "R_ARM_MOVW_ABS_NC", /* name */
698 FALSE
, /* partial_inplace */
699 0x0000ffff, /* src_mask */
700 0x0000ffff, /* dst_mask */
701 FALSE
), /* pcrel_offset */
703 HOWTO (R_ARM_MOVT_ABS
, /* type */
705 2, /* size (0 = byte, 1 = short, 2 = long) */
707 FALSE
, /* pc_relative */
709 complain_overflow_bitfield
,/* complain_on_overflow */
710 bfd_elf_generic_reloc
, /* special_function */
711 "R_ARM_MOVT_ABS", /* name */
712 FALSE
, /* partial_inplace */
713 0x0000ffff, /* src_mask */
714 0x0000ffff, /* dst_mask */
715 FALSE
), /* pcrel_offset */
717 HOWTO (R_ARM_MOVW_PREL_NC
, /* type */
719 2, /* size (0 = byte, 1 = short, 2 = long) */
721 TRUE
, /* pc_relative */
723 complain_overflow_dont
,/* complain_on_overflow */
724 bfd_elf_generic_reloc
, /* special_function */
725 "R_ARM_MOVW_PREL_NC", /* name */
726 FALSE
, /* partial_inplace */
727 0x0000ffff, /* src_mask */
728 0x0000ffff, /* dst_mask */
729 TRUE
), /* pcrel_offset */
731 HOWTO (R_ARM_MOVT_PREL
, /* type */
733 2, /* size (0 = byte, 1 = short, 2 = long) */
735 TRUE
, /* pc_relative */
737 complain_overflow_bitfield
,/* complain_on_overflow */
738 bfd_elf_generic_reloc
, /* special_function */
739 "R_ARM_MOVT_PREL", /* name */
740 FALSE
, /* partial_inplace */
741 0x0000ffff, /* src_mask */
742 0x0000ffff, /* dst_mask */
743 TRUE
), /* pcrel_offset */
745 HOWTO (R_ARM_THM_MOVW_ABS_NC
, /* type */
747 2, /* size (0 = byte, 1 = short, 2 = long) */
749 FALSE
, /* pc_relative */
751 complain_overflow_dont
,/* complain_on_overflow */
752 bfd_elf_generic_reloc
, /* special_function */
753 "R_ARM_THM_MOVW_ABS_NC",/* name */
754 FALSE
, /* partial_inplace */
755 0x040f70ff, /* src_mask */
756 0x040f70ff, /* dst_mask */
757 FALSE
), /* pcrel_offset */
759 HOWTO (R_ARM_THM_MOVT_ABS
, /* type */
761 2, /* size (0 = byte, 1 = short, 2 = long) */
763 FALSE
, /* pc_relative */
765 complain_overflow_bitfield
,/* complain_on_overflow */
766 bfd_elf_generic_reloc
, /* special_function */
767 "R_ARM_THM_MOVT_ABS", /* name */
768 FALSE
, /* partial_inplace */
769 0x040f70ff, /* src_mask */
770 0x040f70ff, /* dst_mask */
771 FALSE
), /* pcrel_offset */
773 HOWTO (R_ARM_THM_MOVW_PREL_NC
,/* type */
775 2, /* size (0 = byte, 1 = short, 2 = long) */
777 TRUE
, /* pc_relative */
779 complain_overflow_dont
,/* complain_on_overflow */
780 bfd_elf_generic_reloc
, /* special_function */
781 "R_ARM_THM_MOVW_PREL_NC",/* name */
782 FALSE
, /* partial_inplace */
783 0x040f70ff, /* src_mask */
784 0x040f70ff, /* dst_mask */
785 TRUE
), /* pcrel_offset */
787 HOWTO (R_ARM_THM_MOVT_PREL
, /* type */
789 2, /* size (0 = byte, 1 = short, 2 = long) */
791 TRUE
, /* pc_relative */
793 complain_overflow_bitfield
,/* complain_on_overflow */
794 bfd_elf_generic_reloc
, /* special_function */
795 "R_ARM_THM_MOVT_PREL", /* name */
796 FALSE
, /* partial_inplace */
797 0x040f70ff, /* src_mask */
798 0x040f70ff, /* dst_mask */
799 TRUE
), /* pcrel_offset */
801 HOWTO (R_ARM_THM_JUMP19
, /* type */
803 2, /* size (0 = byte, 1 = short, 2 = long) */
805 TRUE
, /* pc_relative */
807 complain_overflow_signed
,/* complain_on_overflow */
808 bfd_elf_generic_reloc
, /* special_function */
809 "R_ARM_THM_JUMP19", /* name */
810 FALSE
, /* partial_inplace */
811 0x043f2fff, /* src_mask */
812 0x043f2fff, /* dst_mask */
813 TRUE
), /* pcrel_offset */
815 HOWTO (R_ARM_THM_JUMP6
, /* type */
817 1, /* size (0 = byte, 1 = short, 2 = long) */
819 TRUE
, /* pc_relative */
821 complain_overflow_unsigned
,/* complain_on_overflow */
822 bfd_elf_generic_reloc
, /* special_function */
823 "R_ARM_THM_JUMP6", /* name */
824 FALSE
, /* partial_inplace */
825 0x02f8, /* src_mask */
826 0x02f8, /* dst_mask */
827 TRUE
), /* pcrel_offset */
829 /* These are declared as 13-bit signed relocations because we can
830 address -4095 .. 4095(base) by altering ADDW to SUBW or vice
832 HOWTO (R_ARM_THM_ALU_PREL_11_0
,/* type */
834 2, /* size (0 = byte, 1 = short, 2 = long) */
836 TRUE
, /* pc_relative */
838 complain_overflow_signed
,/* complain_on_overflow */
839 bfd_elf_generic_reloc
, /* special_function */
840 "R_ARM_THM_ALU_PREL_11_0",/* name */
841 FALSE
, /* partial_inplace */
842 0x040070ff, /* src_mask */
843 0x040070ff, /* dst_mask */
844 TRUE
), /* pcrel_offset */
846 HOWTO (R_ARM_THM_PC12
, /* type */
848 2, /* size (0 = byte, 1 = short, 2 = long) */
850 TRUE
, /* pc_relative */
852 complain_overflow_signed
,/* complain_on_overflow */
853 bfd_elf_generic_reloc
, /* special_function */
854 "R_ARM_THM_PC12", /* name */
855 FALSE
, /* partial_inplace */
856 0x040070ff, /* src_mask */
857 0x040070ff, /* dst_mask */
858 TRUE
), /* pcrel_offset */
860 HOWTO (R_ARM_ABS32_NOI
, /* type */
862 2, /* size (0 = byte, 1 = short, 2 = long) */
864 FALSE
, /* pc_relative */
866 complain_overflow_dont
,/* complain_on_overflow */
867 bfd_elf_generic_reloc
, /* special_function */
868 "R_ARM_ABS32_NOI", /* name */
869 FALSE
, /* partial_inplace */
870 0xffffffff, /* src_mask */
871 0xffffffff, /* dst_mask */
872 FALSE
), /* pcrel_offset */
874 HOWTO (R_ARM_REL32_NOI
, /* type */
876 2, /* size (0 = byte, 1 = short, 2 = long) */
878 TRUE
, /* pc_relative */
880 complain_overflow_dont
,/* complain_on_overflow */
881 bfd_elf_generic_reloc
, /* special_function */
882 "R_ARM_REL32_NOI", /* name */
883 FALSE
, /* partial_inplace */
884 0xffffffff, /* src_mask */
885 0xffffffff, /* dst_mask */
886 FALSE
), /* pcrel_offset */
888 /* Group relocations. */
890 HOWTO (R_ARM_ALU_PC_G0_NC
, /* type */
892 2, /* size (0 = byte, 1 = short, 2 = long) */
894 TRUE
, /* pc_relative */
896 complain_overflow_dont
,/* complain_on_overflow */
897 bfd_elf_generic_reloc
, /* special_function */
898 "R_ARM_ALU_PC_G0_NC", /* name */
899 FALSE
, /* partial_inplace */
900 0xffffffff, /* src_mask */
901 0xffffffff, /* dst_mask */
902 TRUE
), /* pcrel_offset */
904 HOWTO (R_ARM_ALU_PC_G0
, /* type */
906 2, /* size (0 = byte, 1 = short, 2 = long) */
908 TRUE
, /* pc_relative */
910 complain_overflow_dont
,/* complain_on_overflow */
911 bfd_elf_generic_reloc
, /* special_function */
912 "R_ARM_ALU_PC_G0", /* name */
913 FALSE
, /* partial_inplace */
914 0xffffffff, /* src_mask */
915 0xffffffff, /* dst_mask */
916 TRUE
), /* pcrel_offset */
918 HOWTO (R_ARM_ALU_PC_G1_NC
, /* type */
920 2, /* size (0 = byte, 1 = short, 2 = long) */
922 TRUE
, /* pc_relative */
924 complain_overflow_dont
,/* complain_on_overflow */
925 bfd_elf_generic_reloc
, /* special_function */
926 "R_ARM_ALU_PC_G1_NC", /* name */
927 FALSE
, /* partial_inplace */
928 0xffffffff, /* src_mask */
929 0xffffffff, /* dst_mask */
930 TRUE
), /* pcrel_offset */
932 HOWTO (R_ARM_ALU_PC_G1
, /* type */
934 2, /* size (0 = byte, 1 = short, 2 = long) */
936 TRUE
, /* pc_relative */
938 complain_overflow_dont
,/* complain_on_overflow */
939 bfd_elf_generic_reloc
, /* special_function */
940 "R_ARM_ALU_PC_G1", /* name */
941 FALSE
, /* partial_inplace */
942 0xffffffff, /* src_mask */
943 0xffffffff, /* dst_mask */
944 TRUE
), /* pcrel_offset */
946 HOWTO (R_ARM_ALU_PC_G2
, /* type */
948 2, /* size (0 = byte, 1 = short, 2 = long) */
950 TRUE
, /* pc_relative */
952 complain_overflow_dont
,/* complain_on_overflow */
953 bfd_elf_generic_reloc
, /* special_function */
954 "R_ARM_ALU_PC_G2", /* name */
955 FALSE
, /* partial_inplace */
956 0xffffffff, /* src_mask */
957 0xffffffff, /* dst_mask */
958 TRUE
), /* pcrel_offset */
960 HOWTO (R_ARM_LDR_PC_G1
, /* type */
962 2, /* size (0 = byte, 1 = short, 2 = long) */
964 TRUE
, /* pc_relative */
966 complain_overflow_dont
,/* complain_on_overflow */
967 bfd_elf_generic_reloc
, /* special_function */
968 "R_ARM_LDR_PC_G1", /* name */
969 FALSE
, /* partial_inplace */
970 0xffffffff, /* src_mask */
971 0xffffffff, /* dst_mask */
972 TRUE
), /* pcrel_offset */
974 HOWTO (R_ARM_LDR_PC_G2
, /* type */
976 2, /* size (0 = byte, 1 = short, 2 = long) */
978 TRUE
, /* pc_relative */
980 complain_overflow_dont
,/* complain_on_overflow */
981 bfd_elf_generic_reloc
, /* special_function */
982 "R_ARM_LDR_PC_G2", /* name */
983 FALSE
, /* partial_inplace */
984 0xffffffff, /* src_mask */
985 0xffffffff, /* dst_mask */
986 TRUE
), /* pcrel_offset */
988 HOWTO (R_ARM_LDRS_PC_G0
, /* type */
990 2, /* size (0 = byte, 1 = short, 2 = long) */
992 TRUE
, /* pc_relative */
994 complain_overflow_dont
,/* complain_on_overflow */
995 bfd_elf_generic_reloc
, /* special_function */
996 "R_ARM_LDRS_PC_G0", /* name */
997 FALSE
, /* partial_inplace */
998 0xffffffff, /* src_mask */
999 0xffffffff, /* dst_mask */
1000 TRUE
), /* pcrel_offset */
1002 HOWTO (R_ARM_LDRS_PC_G1
, /* type */
1004 2, /* size (0 = byte, 1 = short, 2 = long) */
1006 TRUE
, /* pc_relative */
1008 complain_overflow_dont
,/* complain_on_overflow */
1009 bfd_elf_generic_reloc
, /* special_function */
1010 "R_ARM_LDRS_PC_G1", /* name */
1011 FALSE
, /* partial_inplace */
1012 0xffffffff, /* src_mask */
1013 0xffffffff, /* dst_mask */
1014 TRUE
), /* pcrel_offset */
1016 HOWTO (R_ARM_LDRS_PC_G2
, /* type */
1018 2, /* size (0 = byte, 1 = short, 2 = long) */
1020 TRUE
, /* pc_relative */
1022 complain_overflow_dont
,/* complain_on_overflow */
1023 bfd_elf_generic_reloc
, /* special_function */
1024 "R_ARM_LDRS_PC_G2", /* name */
1025 FALSE
, /* partial_inplace */
1026 0xffffffff, /* src_mask */
1027 0xffffffff, /* dst_mask */
1028 TRUE
), /* pcrel_offset */
1030 HOWTO (R_ARM_LDC_PC_G0
, /* type */
1032 2, /* size (0 = byte, 1 = short, 2 = long) */
1034 TRUE
, /* pc_relative */
1036 complain_overflow_dont
,/* complain_on_overflow */
1037 bfd_elf_generic_reloc
, /* special_function */
1038 "R_ARM_LDC_PC_G0", /* name */
1039 FALSE
, /* partial_inplace */
1040 0xffffffff, /* src_mask */
1041 0xffffffff, /* dst_mask */
1042 TRUE
), /* pcrel_offset */
1044 HOWTO (R_ARM_LDC_PC_G1
, /* type */
1046 2, /* size (0 = byte, 1 = short, 2 = long) */
1048 TRUE
, /* pc_relative */
1050 complain_overflow_dont
,/* complain_on_overflow */
1051 bfd_elf_generic_reloc
, /* special_function */
1052 "R_ARM_LDC_PC_G1", /* name */
1053 FALSE
, /* partial_inplace */
1054 0xffffffff, /* src_mask */
1055 0xffffffff, /* dst_mask */
1056 TRUE
), /* pcrel_offset */
1058 HOWTO (R_ARM_LDC_PC_G2
, /* type */
1060 2, /* size (0 = byte, 1 = short, 2 = long) */
1062 TRUE
, /* pc_relative */
1064 complain_overflow_dont
,/* complain_on_overflow */
1065 bfd_elf_generic_reloc
, /* special_function */
1066 "R_ARM_LDC_PC_G2", /* name */
1067 FALSE
, /* partial_inplace */
1068 0xffffffff, /* src_mask */
1069 0xffffffff, /* dst_mask */
1070 TRUE
), /* pcrel_offset */
1072 HOWTO (R_ARM_ALU_SB_G0_NC
, /* type */
1074 2, /* size (0 = byte, 1 = short, 2 = long) */
1076 TRUE
, /* pc_relative */
1078 complain_overflow_dont
,/* complain_on_overflow */
1079 bfd_elf_generic_reloc
, /* special_function */
1080 "R_ARM_ALU_SB_G0_NC", /* name */
1081 FALSE
, /* partial_inplace */
1082 0xffffffff, /* src_mask */
1083 0xffffffff, /* dst_mask */
1084 TRUE
), /* pcrel_offset */
1086 HOWTO (R_ARM_ALU_SB_G0
, /* type */
1088 2, /* size (0 = byte, 1 = short, 2 = long) */
1090 TRUE
, /* pc_relative */
1092 complain_overflow_dont
,/* complain_on_overflow */
1093 bfd_elf_generic_reloc
, /* special_function */
1094 "R_ARM_ALU_SB_G0", /* name */
1095 FALSE
, /* partial_inplace */
1096 0xffffffff, /* src_mask */
1097 0xffffffff, /* dst_mask */
1098 TRUE
), /* pcrel_offset */
1100 HOWTO (R_ARM_ALU_SB_G1_NC
, /* type */
1102 2, /* size (0 = byte, 1 = short, 2 = long) */
1104 TRUE
, /* pc_relative */
1106 complain_overflow_dont
,/* complain_on_overflow */
1107 bfd_elf_generic_reloc
, /* special_function */
1108 "R_ARM_ALU_SB_G1_NC", /* name */
1109 FALSE
, /* partial_inplace */
1110 0xffffffff, /* src_mask */
1111 0xffffffff, /* dst_mask */
1112 TRUE
), /* pcrel_offset */
1114 HOWTO (R_ARM_ALU_SB_G1
, /* type */
1116 2, /* size (0 = byte, 1 = short, 2 = long) */
1118 TRUE
, /* pc_relative */
1120 complain_overflow_dont
,/* complain_on_overflow */
1121 bfd_elf_generic_reloc
, /* special_function */
1122 "R_ARM_ALU_SB_G1", /* name */
1123 FALSE
, /* partial_inplace */
1124 0xffffffff, /* src_mask */
1125 0xffffffff, /* dst_mask */
1126 TRUE
), /* pcrel_offset */
1128 HOWTO (R_ARM_ALU_SB_G2
, /* type */
1130 2, /* size (0 = byte, 1 = short, 2 = long) */
1132 TRUE
, /* pc_relative */
1134 complain_overflow_dont
,/* complain_on_overflow */
1135 bfd_elf_generic_reloc
, /* special_function */
1136 "R_ARM_ALU_SB_G2", /* name */
1137 FALSE
, /* partial_inplace */
1138 0xffffffff, /* src_mask */
1139 0xffffffff, /* dst_mask */
1140 TRUE
), /* pcrel_offset */
1142 HOWTO (R_ARM_LDR_SB_G0
, /* type */
1144 2, /* size (0 = byte, 1 = short, 2 = long) */
1146 TRUE
, /* pc_relative */
1148 complain_overflow_dont
,/* complain_on_overflow */
1149 bfd_elf_generic_reloc
, /* special_function */
1150 "R_ARM_LDR_SB_G0", /* name */
1151 FALSE
, /* partial_inplace */
1152 0xffffffff, /* src_mask */
1153 0xffffffff, /* dst_mask */
1154 TRUE
), /* pcrel_offset */
1156 HOWTO (R_ARM_LDR_SB_G1
, /* type */
1158 2, /* size (0 = byte, 1 = short, 2 = long) */
1160 TRUE
, /* pc_relative */
1162 complain_overflow_dont
,/* complain_on_overflow */
1163 bfd_elf_generic_reloc
, /* special_function */
1164 "R_ARM_LDR_SB_G1", /* name */
1165 FALSE
, /* partial_inplace */
1166 0xffffffff, /* src_mask */
1167 0xffffffff, /* dst_mask */
1168 TRUE
), /* pcrel_offset */
1170 HOWTO (R_ARM_LDR_SB_G2
, /* type */
1172 2, /* size (0 = byte, 1 = short, 2 = long) */
1174 TRUE
, /* pc_relative */
1176 complain_overflow_dont
,/* complain_on_overflow */
1177 bfd_elf_generic_reloc
, /* special_function */
1178 "R_ARM_LDR_SB_G2", /* name */
1179 FALSE
, /* partial_inplace */
1180 0xffffffff, /* src_mask */
1181 0xffffffff, /* dst_mask */
1182 TRUE
), /* pcrel_offset */
1184 HOWTO (R_ARM_LDRS_SB_G0
, /* type */
1186 2, /* size (0 = byte, 1 = short, 2 = long) */
1188 TRUE
, /* pc_relative */
1190 complain_overflow_dont
,/* complain_on_overflow */
1191 bfd_elf_generic_reloc
, /* special_function */
1192 "R_ARM_LDRS_SB_G0", /* name */
1193 FALSE
, /* partial_inplace */
1194 0xffffffff, /* src_mask */
1195 0xffffffff, /* dst_mask */
1196 TRUE
), /* pcrel_offset */
1198 HOWTO (R_ARM_LDRS_SB_G1
, /* type */
1200 2, /* size (0 = byte, 1 = short, 2 = long) */
1202 TRUE
, /* pc_relative */
1204 complain_overflow_dont
,/* complain_on_overflow */
1205 bfd_elf_generic_reloc
, /* special_function */
1206 "R_ARM_LDRS_SB_G1", /* name */
1207 FALSE
, /* partial_inplace */
1208 0xffffffff, /* src_mask */
1209 0xffffffff, /* dst_mask */
1210 TRUE
), /* pcrel_offset */
1212 HOWTO (R_ARM_LDRS_SB_G2
, /* type */
1214 2, /* size (0 = byte, 1 = short, 2 = long) */
1216 TRUE
, /* pc_relative */
1218 complain_overflow_dont
,/* complain_on_overflow */
1219 bfd_elf_generic_reloc
, /* special_function */
1220 "R_ARM_LDRS_SB_G2", /* name */
1221 FALSE
, /* partial_inplace */
1222 0xffffffff, /* src_mask */
1223 0xffffffff, /* dst_mask */
1224 TRUE
), /* pcrel_offset */
1226 HOWTO (R_ARM_LDC_SB_G0
, /* type */
1228 2, /* size (0 = byte, 1 = short, 2 = long) */
1230 TRUE
, /* pc_relative */
1232 complain_overflow_dont
,/* complain_on_overflow */
1233 bfd_elf_generic_reloc
, /* special_function */
1234 "R_ARM_LDC_SB_G0", /* name */
1235 FALSE
, /* partial_inplace */
1236 0xffffffff, /* src_mask */
1237 0xffffffff, /* dst_mask */
1238 TRUE
), /* pcrel_offset */
1240 HOWTO (R_ARM_LDC_SB_G1
, /* type */
1242 2, /* size (0 = byte, 1 = short, 2 = long) */
1244 TRUE
, /* pc_relative */
1246 complain_overflow_dont
,/* complain_on_overflow */
1247 bfd_elf_generic_reloc
, /* special_function */
1248 "R_ARM_LDC_SB_G1", /* name */
1249 FALSE
, /* partial_inplace */
1250 0xffffffff, /* src_mask */
1251 0xffffffff, /* dst_mask */
1252 TRUE
), /* pcrel_offset */
1254 HOWTO (R_ARM_LDC_SB_G2
, /* type */
1256 2, /* size (0 = byte, 1 = short, 2 = long) */
1258 TRUE
, /* pc_relative */
1260 complain_overflow_dont
,/* complain_on_overflow */
1261 bfd_elf_generic_reloc
, /* special_function */
1262 "R_ARM_LDC_SB_G2", /* name */
1263 FALSE
, /* partial_inplace */
1264 0xffffffff, /* src_mask */
1265 0xffffffff, /* dst_mask */
1266 TRUE
), /* pcrel_offset */
1268 /* End of group relocations. */
1270 HOWTO (R_ARM_MOVW_BREL_NC
, /* type */
1272 2, /* size (0 = byte, 1 = short, 2 = long) */
1274 FALSE
, /* pc_relative */
1276 complain_overflow_dont
,/* complain_on_overflow */
1277 bfd_elf_generic_reloc
, /* special_function */
1278 "R_ARM_MOVW_BREL_NC", /* name */
1279 FALSE
, /* partial_inplace */
1280 0x0000ffff, /* src_mask */
1281 0x0000ffff, /* dst_mask */
1282 FALSE
), /* pcrel_offset */
1284 HOWTO (R_ARM_MOVT_BREL
, /* type */
1286 2, /* size (0 = byte, 1 = short, 2 = long) */
1288 FALSE
, /* pc_relative */
1290 complain_overflow_bitfield
,/* complain_on_overflow */
1291 bfd_elf_generic_reloc
, /* special_function */
1292 "R_ARM_MOVT_BREL", /* name */
1293 FALSE
, /* partial_inplace */
1294 0x0000ffff, /* src_mask */
1295 0x0000ffff, /* dst_mask */
1296 FALSE
), /* pcrel_offset */
1298 HOWTO (R_ARM_MOVW_BREL
, /* type */
1300 2, /* size (0 = byte, 1 = short, 2 = long) */
1302 FALSE
, /* pc_relative */
1304 complain_overflow_dont
,/* complain_on_overflow */
1305 bfd_elf_generic_reloc
, /* special_function */
1306 "R_ARM_MOVW_BREL", /* name */
1307 FALSE
, /* partial_inplace */
1308 0x0000ffff, /* src_mask */
1309 0x0000ffff, /* dst_mask */
1310 FALSE
), /* pcrel_offset */
1312 HOWTO (R_ARM_THM_MOVW_BREL_NC
,/* type */
1314 2, /* size (0 = byte, 1 = short, 2 = long) */
1316 FALSE
, /* pc_relative */
1318 complain_overflow_dont
,/* complain_on_overflow */
1319 bfd_elf_generic_reloc
, /* special_function */
1320 "R_ARM_THM_MOVW_BREL_NC",/* name */
1321 FALSE
, /* partial_inplace */
1322 0x040f70ff, /* src_mask */
1323 0x040f70ff, /* dst_mask */
1324 FALSE
), /* pcrel_offset */
1326 HOWTO (R_ARM_THM_MOVT_BREL
, /* type */
1328 2, /* size (0 = byte, 1 = short, 2 = long) */
1330 FALSE
, /* pc_relative */
1332 complain_overflow_bitfield
,/* complain_on_overflow */
1333 bfd_elf_generic_reloc
, /* special_function */
1334 "R_ARM_THM_MOVT_BREL", /* name */
1335 FALSE
, /* partial_inplace */
1336 0x040f70ff, /* src_mask */
1337 0x040f70ff, /* dst_mask */
1338 FALSE
), /* pcrel_offset */
1340 HOWTO (R_ARM_THM_MOVW_BREL
, /* type */
1342 2, /* size (0 = byte, 1 = short, 2 = long) */
1344 FALSE
, /* pc_relative */
1346 complain_overflow_dont
,/* complain_on_overflow */
1347 bfd_elf_generic_reloc
, /* special_function */
1348 "R_ARM_THM_MOVW_BREL", /* name */
1349 FALSE
, /* partial_inplace */
1350 0x040f70ff, /* src_mask */
1351 0x040f70ff, /* dst_mask */
1352 FALSE
), /* pcrel_offset */
1354 EMPTY_HOWTO (90), /* unallocated */
1359 HOWTO (R_ARM_PLT32_ABS
, /* type */
1361 2, /* size (0 = byte, 1 = short, 2 = long) */
1363 FALSE
, /* pc_relative */
1365 complain_overflow_dont
,/* complain_on_overflow */
1366 bfd_elf_generic_reloc
, /* special_function */
1367 "R_ARM_PLT32_ABS", /* name */
1368 FALSE
, /* partial_inplace */
1369 0xffffffff, /* src_mask */
1370 0xffffffff, /* dst_mask */
1371 FALSE
), /* pcrel_offset */
1373 HOWTO (R_ARM_GOT_ABS
, /* type */
1375 2, /* size (0 = byte, 1 = short, 2 = long) */
1377 FALSE
, /* pc_relative */
1379 complain_overflow_dont
,/* complain_on_overflow */
1380 bfd_elf_generic_reloc
, /* special_function */
1381 "R_ARM_GOT_ABS", /* name */
1382 FALSE
, /* partial_inplace */
1383 0xffffffff, /* src_mask */
1384 0xffffffff, /* dst_mask */
1385 FALSE
), /* pcrel_offset */
1387 HOWTO (R_ARM_GOT_PREL
, /* type */
1389 2, /* size (0 = byte, 1 = short, 2 = long) */
1391 TRUE
, /* pc_relative */
1393 complain_overflow_dont
, /* complain_on_overflow */
1394 bfd_elf_generic_reloc
, /* special_function */
1395 "R_ARM_GOT_PREL", /* name */
1396 FALSE
, /* partial_inplace */
1397 0xffffffff, /* src_mask */
1398 0xffffffff, /* dst_mask */
1399 TRUE
), /* pcrel_offset */
1401 HOWTO (R_ARM_GOT_BREL12
, /* type */
1403 2, /* size (0 = byte, 1 = short, 2 = long) */
1405 FALSE
, /* pc_relative */
1407 complain_overflow_bitfield
,/* complain_on_overflow */
1408 bfd_elf_generic_reloc
, /* special_function */
1409 "R_ARM_GOT_BREL12", /* name */
1410 FALSE
, /* partial_inplace */
1411 0x00000fff, /* src_mask */
1412 0x00000fff, /* dst_mask */
1413 FALSE
), /* pcrel_offset */
1415 HOWTO (R_ARM_GOTOFF12
, /* type */
1417 2, /* size (0 = byte, 1 = short, 2 = long) */
1419 FALSE
, /* pc_relative */
1421 complain_overflow_bitfield
,/* complain_on_overflow */
1422 bfd_elf_generic_reloc
, /* special_function */
1423 "R_ARM_GOTOFF12", /* name */
1424 FALSE
, /* partial_inplace */
1425 0x00000fff, /* src_mask */
1426 0x00000fff, /* dst_mask */
1427 FALSE
), /* pcrel_offset */
1429 EMPTY_HOWTO (R_ARM_GOTRELAX
), /* reserved for future GOT-load optimizations */
1431 /* GNU extension to record C++ vtable member usage */
1432 HOWTO (R_ARM_GNU_VTENTRY
, /* type */
1434 2, /* size (0 = byte, 1 = short, 2 = long) */
1436 FALSE
, /* pc_relative */
1438 complain_overflow_dont
, /* complain_on_overflow */
1439 _bfd_elf_rel_vtable_reloc_fn
, /* special_function */
1440 "R_ARM_GNU_VTENTRY", /* name */
1441 FALSE
, /* partial_inplace */
1444 FALSE
), /* pcrel_offset */
1446 /* GNU extension to record C++ vtable hierarchy */
1447 HOWTO (R_ARM_GNU_VTINHERIT
, /* type */
1449 2, /* size (0 = byte, 1 = short, 2 = long) */
1451 FALSE
, /* pc_relative */
1453 complain_overflow_dont
, /* complain_on_overflow */
1454 NULL
, /* special_function */
1455 "R_ARM_GNU_VTINHERIT", /* name */
1456 FALSE
, /* partial_inplace */
1459 FALSE
), /* pcrel_offset */
1461 HOWTO (R_ARM_THM_JUMP11
, /* type */
1463 1, /* size (0 = byte, 1 = short, 2 = long) */
1465 TRUE
, /* pc_relative */
1467 complain_overflow_signed
, /* complain_on_overflow */
1468 bfd_elf_generic_reloc
, /* special_function */
1469 "R_ARM_THM_JUMP11", /* name */
1470 FALSE
, /* partial_inplace */
1471 0x000007ff, /* src_mask */
1472 0x000007ff, /* dst_mask */
1473 TRUE
), /* pcrel_offset */
1475 HOWTO (R_ARM_THM_JUMP8
, /* type */
1477 1, /* size (0 = byte, 1 = short, 2 = long) */
1479 TRUE
, /* pc_relative */
1481 complain_overflow_signed
, /* complain_on_overflow */
1482 bfd_elf_generic_reloc
, /* special_function */
1483 "R_ARM_THM_JUMP8", /* name */
1484 FALSE
, /* partial_inplace */
1485 0x000000ff, /* src_mask */
1486 0x000000ff, /* dst_mask */
1487 TRUE
), /* pcrel_offset */
1489 /* TLS relocations */
1490 HOWTO (R_ARM_TLS_GD32
, /* type */
1492 2, /* size (0 = byte, 1 = short, 2 = long) */
1494 FALSE
, /* pc_relative */
1496 complain_overflow_bitfield
,/* complain_on_overflow */
1497 NULL
, /* special_function */
1498 "R_ARM_TLS_GD32", /* name */
1499 TRUE
, /* partial_inplace */
1500 0xffffffff, /* src_mask */
1501 0xffffffff, /* dst_mask */
1502 FALSE
), /* pcrel_offset */
1504 HOWTO (R_ARM_TLS_LDM32
, /* type */
1506 2, /* size (0 = byte, 1 = short, 2 = long) */
1508 FALSE
, /* pc_relative */
1510 complain_overflow_bitfield
,/* complain_on_overflow */
1511 bfd_elf_generic_reloc
, /* special_function */
1512 "R_ARM_TLS_LDM32", /* name */
1513 TRUE
, /* partial_inplace */
1514 0xffffffff, /* src_mask */
1515 0xffffffff, /* dst_mask */
1516 FALSE
), /* pcrel_offset */
1518 HOWTO (R_ARM_TLS_LDO32
, /* type */
1520 2, /* size (0 = byte, 1 = short, 2 = long) */
1522 FALSE
, /* pc_relative */
1524 complain_overflow_bitfield
,/* complain_on_overflow */
1525 bfd_elf_generic_reloc
, /* special_function */
1526 "R_ARM_TLS_LDO32", /* name */
1527 TRUE
, /* partial_inplace */
1528 0xffffffff, /* src_mask */
1529 0xffffffff, /* dst_mask */
1530 FALSE
), /* pcrel_offset */
1532 HOWTO (R_ARM_TLS_IE32
, /* type */
1534 2, /* size (0 = byte, 1 = short, 2 = long) */
1536 FALSE
, /* pc_relative */
1538 complain_overflow_bitfield
,/* complain_on_overflow */
1539 NULL
, /* special_function */
1540 "R_ARM_TLS_IE32", /* name */
1541 TRUE
, /* partial_inplace */
1542 0xffffffff, /* src_mask */
1543 0xffffffff, /* dst_mask */
1544 FALSE
), /* pcrel_offset */
1546 HOWTO (R_ARM_TLS_LE32
, /* type */
1548 2, /* size (0 = byte, 1 = short, 2 = long) */
1550 FALSE
, /* pc_relative */
1552 complain_overflow_bitfield
,/* complain_on_overflow */
1553 bfd_elf_generic_reloc
, /* special_function */
1554 "R_ARM_TLS_LE32", /* name */
1555 TRUE
, /* partial_inplace */
1556 0xffffffff, /* src_mask */
1557 0xffffffff, /* dst_mask */
1558 FALSE
), /* pcrel_offset */
1560 HOWTO (R_ARM_TLS_LDO12
, /* type */
1562 2, /* size (0 = byte, 1 = short, 2 = long) */
1564 FALSE
, /* pc_relative */
1566 complain_overflow_bitfield
,/* complain_on_overflow */
1567 bfd_elf_generic_reloc
, /* special_function */
1568 "R_ARM_TLS_LDO12", /* name */
1569 FALSE
, /* partial_inplace */
1570 0x00000fff, /* src_mask */
1571 0x00000fff, /* dst_mask */
1572 FALSE
), /* pcrel_offset */
1574 HOWTO (R_ARM_TLS_LE12
, /* type */
1576 2, /* size (0 = byte, 1 = short, 2 = long) */
1578 FALSE
, /* pc_relative */
1580 complain_overflow_bitfield
,/* complain_on_overflow */
1581 bfd_elf_generic_reloc
, /* special_function */
1582 "R_ARM_TLS_LE12", /* name */
1583 FALSE
, /* partial_inplace */
1584 0x00000fff, /* src_mask */
1585 0x00000fff, /* dst_mask */
1586 FALSE
), /* pcrel_offset */
1588 HOWTO (R_ARM_TLS_IE12GP
, /* type */
1590 2, /* size (0 = byte, 1 = short, 2 = long) */
1592 FALSE
, /* pc_relative */
1594 complain_overflow_bitfield
,/* complain_on_overflow */
1595 bfd_elf_generic_reloc
, /* special_function */
1596 "R_ARM_TLS_IE12GP", /* name */
1597 FALSE
, /* partial_inplace */
1598 0x00000fff, /* src_mask */
1599 0x00000fff, /* dst_mask */
1600 FALSE
), /* pcrel_offset */
1603 /* 112-127 private relocations
1604 128 R_ARM_ME_TOO, obsolete
1605 129-255 unallocated in AAELF.
1607 249-255 extended, currently unused, relocations: */
1609 static reloc_howto_type elf32_arm_howto_table_2
[4] =
1611 HOWTO (R_ARM_RREL32
, /* type */
1613 0, /* size (0 = byte, 1 = short, 2 = long) */
1615 FALSE
, /* pc_relative */
1617 complain_overflow_dont
,/* complain_on_overflow */
1618 bfd_elf_generic_reloc
, /* special_function */
1619 "R_ARM_RREL32", /* name */
1620 FALSE
, /* partial_inplace */
1623 FALSE
), /* pcrel_offset */
1625 HOWTO (R_ARM_RABS32
, /* type */
1627 0, /* size (0 = byte, 1 = short, 2 = long) */
1629 FALSE
, /* pc_relative */
1631 complain_overflow_dont
,/* complain_on_overflow */
1632 bfd_elf_generic_reloc
, /* special_function */
1633 "R_ARM_RABS32", /* name */
1634 FALSE
, /* partial_inplace */
1637 FALSE
), /* pcrel_offset */
1639 HOWTO (R_ARM_RPC24
, /* type */
1641 0, /* size (0 = byte, 1 = short, 2 = long) */
1643 FALSE
, /* pc_relative */
1645 complain_overflow_dont
,/* complain_on_overflow */
1646 bfd_elf_generic_reloc
, /* special_function */
1647 "R_ARM_RPC24", /* name */
1648 FALSE
, /* partial_inplace */
1651 FALSE
), /* pcrel_offset */
1653 HOWTO (R_ARM_RBASE
, /* type */
1655 0, /* size (0 = byte, 1 = short, 2 = long) */
1657 FALSE
, /* pc_relative */
1659 complain_overflow_dont
,/* complain_on_overflow */
1660 bfd_elf_generic_reloc
, /* special_function */
1661 "R_ARM_RBASE", /* name */
1662 FALSE
, /* partial_inplace */
1665 FALSE
) /* pcrel_offset */
1668 static reloc_howto_type
*
1669 elf32_arm_howto_from_type (unsigned int r_type
)
1671 if (r_type
< NUM_ELEM (elf32_arm_howto_table_1
))
1672 return &elf32_arm_howto_table_1
[r_type
];
1674 if (r_type
>= R_ARM_RREL32
1675 && r_type
< R_ARM_RREL32
+ NUM_ELEM (elf32_arm_howto_table_2
))
1676 return &elf32_arm_howto_table_2
[r_type
- R_ARM_RREL32
];
1682 elf32_arm_info_to_howto (bfd
* abfd ATTRIBUTE_UNUSED
, arelent
* bfd_reloc
,
1683 Elf_Internal_Rela
* elf_reloc
)
1685 unsigned int r_type
;
1687 r_type
= ELF32_R_TYPE (elf_reloc
->r_info
);
1688 bfd_reloc
->howto
= elf32_arm_howto_from_type (r_type
);
1691 struct elf32_arm_reloc_map
1693 bfd_reloc_code_real_type bfd_reloc_val
;
1694 unsigned char elf_reloc_val
;
1697 /* All entries in this list must also be present in elf32_arm_howto_table. */
1698 static const struct elf32_arm_reloc_map elf32_arm_reloc_map
[] =
1700 {BFD_RELOC_NONE
, R_ARM_NONE
},
1701 {BFD_RELOC_ARM_PCREL_BRANCH
, R_ARM_PC24
},
1702 {BFD_RELOC_ARM_PCREL_CALL
, R_ARM_CALL
},
1703 {BFD_RELOC_ARM_PCREL_JUMP
, R_ARM_JUMP24
},
1704 {BFD_RELOC_ARM_PCREL_BLX
, R_ARM_XPC25
},
1705 {BFD_RELOC_THUMB_PCREL_BLX
, R_ARM_THM_XPC22
},
1706 {BFD_RELOC_32
, R_ARM_ABS32
},
1707 {BFD_RELOC_32_PCREL
, R_ARM_REL32
},
1708 {BFD_RELOC_8
, R_ARM_ABS8
},
1709 {BFD_RELOC_16
, R_ARM_ABS16
},
1710 {BFD_RELOC_ARM_OFFSET_IMM
, R_ARM_ABS12
},
1711 {BFD_RELOC_ARM_THUMB_OFFSET
, R_ARM_THM_ABS5
},
1712 {BFD_RELOC_THUMB_PCREL_BRANCH25
, R_ARM_THM_JUMP24
},
1713 {BFD_RELOC_THUMB_PCREL_BRANCH23
, R_ARM_THM_CALL
},
1714 {BFD_RELOC_THUMB_PCREL_BRANCH12
, R_ARM_THM_JUMP11
},
1715 {BFD_RELOC_THUMB_PCREL_BRANCH20
, R_ARM_THM_JUMP19
},
1716 {BFD_RELOC_THUMB_PCREL_BRANCH9
, R_ARM_THM_JUMP8
},
1717 {BFD_RELOC_THUMB_PCREL_BRANCH7
, R_ARM_THM_JUMP6
},
1718 {BFD_RELOC_ARM_GLOB_DAT
, R_ARM_GLOB_DAT
},
1719 {BFD_RELOC_ARM_JUMP_SLOT
, R_ARM_JUMP_SLOT
},
1720 {BFD_RELOC_ARM_RELATIVE
, R_ARM_RELATIVE
},
1721 {BFD_RELOC_ARM_GOTOFF
, R_ARM_GOTOFF32
},
1722 {BFD_RELOC_ARM_GOTPC
, R_ARM_GOTPC
},
1723 {BFD_RELOC_ARM_GOT32
, R_ARM_GOT32
},
1724 {BFD_RELOC_ARM_PLT32
, R_ARM_PLT32
},
1725 {BFD_RELOC_ARM_TARGET1
, R_ARM_TARGET1
},
1726 {BFD_RELOC_ARM_ROSEGREL32
, R_ARM_ROSEGREL32
},
1727 {BFD_RELOC_ARM_SBREL32
, R_ARM_SBREL32
},
1728 {BFD_RELOC_ARM_PREL31
, R_ARM_PREL31
},
1729 {BFD_RELOC_ARM_TARGET2
, R_ARM_TARGET2
},
1730 {BFD_RELOC_ARM_PLT32
, R_ARM_PLT32
},
1731 {BFD_RELOC_ARM_TLS_GD32
, R_ARM_TLS_GD32
},
1732 {BFD_RELOC_ARM_TLS_LDO32
, R_ARM_TLS_LDO32
},
1733 {BFD_RELOC_ARM_TLS_LDM32
, R_ARM_TLS_LDM32
},
1734 {BFD_RELOC_ARM_TLS_DTPMOD32
, R_ARM_TLS_DTPMOD32
},
1735 {BFD_RELOC_ARM_TLS_DTPOFF32
, R_ARM_TLS_DTPOFF32
},
1736 {BFD_RELOC_ARM_TLS_TPOFF32
, R_ARM_TLS_TPOFF32
},
1737 {BFD_RELOC_ARM_TLS_IE32
, R_ARM_TLS_IE32
},
1738 {BFD_RELOC_ARM_TLS_LE32
, R_ARM_TLS_LE32
},
1739 {BFD_RELOC_VTABLE_INHERIT
, R_ARM_GNU_VTINHERIT
},
1740 {BFD_RELOC_VTABLE_ENTRY
, R_ARM_GNU_VTENTRY
},
1741 {BFD_RELOC_ARM_MOVW
, R_ARM_MOVW_ABS_NC
},
1742 {BFD_RELOC_ARM_MOVT
, R_ARM_MOVT_ABS
},
1743 {BFD_RELOC_ARM_MOVW_PCREL
, R_ARM_MOVW_PREL_NC
},
1744 {BFD_RELOC_ARM_MOVT_PCREL
, R_ARM_MOVT_PREL
},
1745 {BFD_RELOC_ARM_THUMB_MOVW
, R_ARM_THM_MOVW_ABS_NC
},
1746 {BFD_RELOC_ARM_THUMB_MOVT
, R_ARM_THM_MOVT_ABS
},
1747 {BFD_RELOC_ARM_THUMB_MOVW_PCREL
, R_ARM_THM_MOVW_PREL_NC
},
1748 {BFD_RELOC_ARM_THUMB_MOVT_PCREL
, R_ARM_THM_MOVT_PREL
},
1749 {BFD_RELOC_ARM_ALU_PC_G0_NC
, R_ARM_ALU_PC_G0_NC
},
1750 {BFD_RELOC_ARM_ALU_PC_G0
, R_ARM_ALU_PC_G0
},
1751 {BFD_RELOC_ARM_ALU_PC_G1_NC
, R_ARM_ALU_PC_G1_NC
},
1752 {BFD_RELOC_ARM_ALU_PC_G1
, R_ARM_ALU_PC_G1
},
1753 {BFD_RELOC_ARM_ALU_PC_G2
, R_ARM_ALU_PC_G2
},
1754 {BFD_RELOC_ARM_LDR_PC_G0
, R_ARM_LDR_PC_G0
},
1755 {BFD_RELOC_ARM_LDR_PC_G1
, R_ARM_LDR_PC_G1
},
1756 {BFD_RELOC_ARM_LDR_PC_G2
, R_ARM_LDR_PC_G2
},
1757 {BFD_RELOC_ARM_LDRS_PC_G0
, R_ARM_LDRS_PC_G0
},
1758 {BFD_RELOC_ARM_LDRS_PC_G1
, R_ARM_LDRS_PC_G1
},
1759 {BFD_RELOC_ARM_LDRS_PC_G2
, R_ARM_LDRS_PC_G2
},
1760 {BFD_RELOC_ARM_LDC_PC_G0
, R_ARM_LDC_PC_G0
},
1761 {BFD_RELOC_ARM_LDC_PC_G1
, R_ARM_LDC_PC_G1
},
1762 {BFD_RELOC_ARM_LDC_PC_G2
, R_ARM_LDC_PC_G2
},
1763 {BFD_RELOC_ARM_ALU_SB_G0_NC
, R_ARM_ALU_SB_G0_NC
},
1764 {BFD_RELOC_ARM_ALU_SB_G0
, R_ARM_ALU_SB_G0
},
1765 {BFD_RELOC_ARM_ALU_SB_G1_NC
, R_ARM_ALU_SB_G1_NC
},
1766 {BFD_RELOC_ARM_ALU_SB_G1
, R_ARM_ALU_SB_G1
},
1767 {BFD_RELOC_ARM_ALU_SB_G2
, R_ARM_ALU_SB_G2
},
1768 {BFD_RELOC_ARM_LDR_SB_G0
, R_ARM_LDR_SB_G0
},
1769 {BFD_RELOC_ARM_LDR_SB_G1
, R_ARM_LDR_SB_G1
},
1770 {BFD_RELOC_ARM_LDR_SB_G2
, R_ARM_LDR_SB_G2
},
1771 {BFD_RELOC_ARM_LDRS_SB_G0
, R_ARM_LDRS_SB_G0
},
1772 {BFD_RELOC_ARM_LDRS_SB_G1
, R_ARM_LDRS_SB_G1
},
1773 {BFD_RELOC_ARM_LDRS_SB_G2
, R_ARM_LDRS_SB_G2
},
1774 {BFD_RELOC_ARM_LDC_SB_G0
, R_ARM_LDC_SB_G0
},
1775 {BFD_RELOC_ARM_LDC_SB_G1
, R_ARM_LDC_SB_G1
},
1776 {BFD_RELOC_ARM_LDC_SB_G2
, R_ARM_LDC_SB_G2
}
1779 static reloc_howto_type
*
1780 elf32_arm_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1781 bfd_reloc_code_real_type code
)
1784 for (i
= 0; i
< NUM_ELEM (elf32_arm_reloc_map
); i
++)
1785 if (elf32_arm_reloc_map
[i
].bfd_reloc_val
== code
)
1786 return elf32_arm_howto_from_type (elf32_arm_reloc_map
[i
].elf_reloc_val
);
1791 /* Support for core dump NOTE sections */
1793 elf32_arm_nabi_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
1798 switch (note
->descsz
)
1803 case 148: /* Linux/ARM 32-bit*/
1805 elf_tdata (abfd
)->core_signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
1808 elf_tdata (abfd
)->core_pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
1817 /* Make a ".reg/999" section. */
1818 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
1819 size
, note
->descpos
+ offset
);
1823 elf32_arm_nabi_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
1825 switch (note
->descsz
)
1830 case 124: /* Linux/ARM elf_prpsinfo */
1831 elf_tdata (abfd
)->core_program
1832 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 28, 16);
1833 elf_tdata (abfd
)->core_command
1834 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 44, 80);
1837 /* Note that for some reason, a spurious space is tacked
1838 onto the end of the args in some (at least one anyway)
1839 implementations, so strip it off if it exists. */
1842 char *command
= elf_tdata (abfd
)->core_command
;
1843 int n
= strlen (command
);
1845 if (0 < n
&& command
[n
- 1] == ' ')
1846 command
[n
- 1] = '\0';
1852 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vec
1853 #define TARGET_LITTLE_NAME "elf32-littlearm"
1854 #define TARGET_BIG_SYM bfd_elf32_bigarm_vec
1855 #define TARGET_BIG_NAME "elf32-bigarm"
1857 #define elf_backend_grok_prstatus elf32_arm_nabi_grok_prstatus
1858 #define elf_backend_grok_psinfo elf32_arm_nabi_grok_psinfo
1860 typedef unsigned long int insn32
;
1861 typedef unsigned short int insn16
;
1863 /* In lieu of proper flags, assume all EABIv4 or later objects are
1865 #define INTERWORK_FLAG(abfd) \
1866 (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) >= EF_ARM_EABI_VER4 \
1867 || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK))
1869 /* The linker script knows the section names for placement.
1870 The entry_names are used to do simple name mangling on the stubs.
1871 Given a function name, and its type, the stub can be found. The
1872 name can be changed. The only requirement is the %s be present. */
1873 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
1874 #define THUMB2ARM_GLUE_ENTRY_NAME "__%s_from_thumb"
1876 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
1877 #define ARM2THUMB_GLUE_ENTRY_NAME "__%s_from_arm"
1879 /* The name of the dynamic interpreter. This is put in the .interp
1881 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
1883 #ifdef FOUR_WORD_PLT
1885 /* The first entry in a procedure linkage table looks like
1886 this. It is set up so that any shared library function that is
1887 called before the relocation has been set up calls the dynamic
1889 static const bfd_vma elf32_arm_plt0_entry
[] =
1891 0xe52de004, /* str lr, [sp, #-4]! */
1892 0xe59fe010, /* ldr lr, [pc, #16] */
1893 0xe08fe00e, /* add lr, pc, lr */
1894 0xe5bef008, /* ldr pc, [lr, #8]! */
1897 /* Subsequent entries in a procedure linkage table look like
1899 static const bfd_vma elf32_arm_plt_entry
[] =
1901 0xe28fc600, /* add ip, pc, #NN */
1902 0xe28cca00, /* add ip, ip, #NN */
1903 0xe5bcf000, /* ldr pc, [ip, #NN]! */
1904 0x00000000, /* unused */
1909 /* The first entry in a procedure linkage table looks like
1910 this. It is set up so that any shared library function that is
1911 called before the relocation has been set up calls the dynamic
1913 static const bfd_vma elf32_arm_plt0_entry
[] =
1915 0xe52de004, /* str lr, [sp, #-4]! */
1916 0xe59fe004, /* ldr lr, [pc, #4] */
1917 0xe08fe00e, /* add lr, pc, lr */
1918 0xe5bef008, /* ldr pc, [lr, #8]! */
1919 0x00000000, /* &GOT[0] - . */
1922 /* Subsequent entries in a procedure linkage table look like
1924 static const bfd_vma elf32_arm_plt_entry
[] =
1926 0xe28fc600, /* add ip, pc, #0xNN00000 */
1927 0xe28cca00, /* add ip, ip, #0xNN000 */
1928 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */
1933 /* The format of the first entry in the procedure linkage table
1934 for a VxWorks executable. */
1935 static const bfd_vma elf32_arm_vxworks_exec_plt0_entry
[] =
1937 0xe52dc008, /* str ip,[sp,#-8]! */
1938 0xe59fc000, /* ldr ip,[pc] */
1939 0xe59cf008, /* ldr pc,[ip,#8] */
1940 0x00000000, /* .long _GLOBAL_OFFSET_TABLE_ */
1943 /* The format of subsequent entries in a VxWorks executable. */
1944 static const bfd_vma elf32_arm_vxworks_exec_plt_entry
[] =
1946 0xe59fc000, /* ldr ip,[pc] */
1947 0xe59cf000, /* ldr pc,[ip] */
1948 0x00000000, /* .long @got */
1949 0xe59fc000, /* ldr ip,[pc] */
1950 0xea000000, /* b _PLT */
1951 0x00000000, /* .long @pltindex*sizeof(Elf32_Rela) */
1954 /* The format of entries in a VxWorks shared library. */
1955 static const bfd_vma elf32_arm_vxworks_shared_plt_entry
[] =
1957 0xe59fc000, /* ldr ip,[pc] */
1958 0xe79cf009, /* ldr pc,[ip,r9] */
1959 0x00000000, /* .long @got */
1960 0xe59fc000, /* ldr ip,[pc] */
1961 0xe599f008, /* ldr pc,[r9,#8] */
1962 0x00000000, /* .long @pltindex*sizeof(Elf32_Rela) */
1965 /* An initial stub used if the PLT entry is referenced from Thumb code. */
1966 #define PLT_THUMB_STUB_SIZE 4
1967 static const bfd_vma elf32_arm_plt_thumb_stub
[] =
1973 /* The entries in a PLT when using a DLL-based target with multiple
1975 static const bfd_vma elf32_arm_symbian_plt_entry
[] =
1977 0xe51ff004, /* ldr pc, [pc, #-4] */
1978 0x00000000, /* dcd R_ARM_GLOB_DAT(X) */
1981 /* Used to build a map of a section. This is required for mixed-endian
1984 typedef struct elf32_elf_section_map
1989 elf32_arm_section_map
;
1991 typedef struct _arm_elf_section_data
1993 struct bfd_elf_section_data elf
;
1994 unsigned int mapcount
;
1995 elf32_arm_section_map
*map
;
1997 _arm_elf_section_data
;
1999 #define elf32_arm_section_data(sec) \
2000 ((_arm_elf_section_data *) elf_section_data (sec))
2002 /* The size of the thread control block. */
2005 #define NUM_KNOWN_ATTRIBUTES 32
2007 typedef struct aeabi_attribute
2014 typedef struct aeabi_attribute_list
2016 struct aeabi_attribute_list
*next
;
2018 aeabi_attribute attr
;
2019 } aeabi_attribute_list
;
2021 struct elf32_arm_obj_tdata
2023 struct elf_obj_tdata root
;
2025 /* tls_type for each local got entry. */
2026 char *local_got_tls_type
;
2028 aeabi_attribute known_eabi_attributes
[NUM_KNOWN_ATTRIBUTES
];
2029 aeabi_attribute_list
*other_eabi_attributes
;
2032 #define elf32_arm_tdata(abfd) \
2033 ((struct elf32_arm_obj_tdata *) (abfd)->tdata.any)
2035 #define elf32_arm_local_got_tls_type(abfd) \
2036 (elf32_arm_tdata (abfd)->local_got_tls_type)
2039 elf32_arm_mkobject (bfd
*abfd
)
2041 if (abfd
->tdata
.any
== NULL
)
2043 bfd_size_type amt
= sizeof (struct elf32_arm_obj_tdata
);
2044 abfd
->tdata
.any
= bfd_zalloc (abfd
, amt
);
2045 if (abfd
->tdata
.any
== NULL
)
2048 return bfd_elf_mkobject (abfd
);
2051 /* The ARM linker needs to keep track of the number of relocs that it
2052 decides to copy in check_relocs for each symbol. This is so that
2053 it can discard PC relative relocs if it doesn't need them when
2054 linking with -Bsymbolic. We store the information in a field
2055 extending the regular ELF linker hash table. */
2057 /* This structure keeps track of the number of relocs we have copied
2058 for a given symbol. */
2059 struct elf32_arm_relocs_copied
2062 struct elf32_arm_relocs_copied
* next
;
2063 /* A section in dynobj. */
2065 /* Number of relocs copied in this section. */
2066 bfd_size_type count
;
2067 /* Number of PC-relative relocs copied in this section. */
2068 bfd_size_type pc_count
;
2071 #define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
2073 /* Arm ELF linker hash entry. */
2074 struct elf32_arm_link_hash_entry
2076 struct elf_link_hash_entry root
;
2078 /* Number of PC relative relocs copied for this symbol. */
2079 struct elf32_arm_relocs_copied
* relocs_copied
;
2081 /* We reference count Thumb references to a PLT entry separately,
2082 so that we can emit the Thumb trampoline only if needed. */
2083 bfd_signed_vma plt_thumb_refcount
;
2085 /* Since PLT entries have variable size if the Thumb prologue is
2086 used, we need to record the index into .got.plt instead of
2087 recomputing it from the PLT offset. */
2088 bfd_signed_vma plt_got_offset
;
2090 #define GOT_UNKNOWN 0
2091 #define GOT_NORMAL 1
2092 #define GOT_TLS_GD 2
2093 #define GOT_TLS_IE 4
2094 unsigned char tls_type
;
2097 /* Traverse an arm ELF linker hash table. */
2098 #define elf32_arm_link_hash_traverse(table, func, info) \
2099 (elf_link_hash_traverse \
2101 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
2104 /* Get the ARM elf linker hash table from a link_info structure. */
2105 #define elf32_arm_hash_table(info) \
2106 ((struct elf32_arm_link_hash_table *) ((info)->hash))
2108 /* ARM ELF linker hash table. */
2109 struct elf32_arm_link_hash_table
2111 /* The main hash table. */
2112 struct elf_link_hash_table root
;
2114 /* The size in bytes of the section containing the Thumb-to-ARM glue. */
2115 bfd_size_type thumb_glue_size
;
2117 /* The size in bytes of the section containing the ARM-to-Thumb glue. */
2118 bfd_size_type arm_glue_size
;
2120 /* An arbitrary input BFD chosen to hold the glue sections. */
2121 bfd
* bfd_of_glue_owner
;
2123 /* Nonzero to output a BE8 image. */
2126 /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
2127 Nonzero if R_ARM_TARGET1 means R_ARM_ABS32. */
2130 /* The relocation to use for R_ARM_TARGET2 relocations. */
2133 /* Nonzero to fix BX instructions for ARMv4 targets. */
2136 /* Nonzero if the ARM/Thumb BLX instructions are available for use. */
2139 /* The number of bytes in the initial entry in the PLT. */
2140 bfd_size_type plt_header_size
;
2142 /* The number of bytes in the subsequent PLT etries. */
2143 bfd_size_type plt_entry_size
;
2145 /* True if the target system is VxWorks. */
2148 /* True if the target system is Symbian OS. */
2151 /* True if the target uses REL relocations. */
2154 /* Short-cuts to get to dynamic linker sections. */
2163 /* The (unloaded but important) VxWorks .rela.plt.unloaded section. */
2166 /* Data for R_ARM_TLS_LDM32 relocations. */
2168 bfd_signed_vma refcount
;
2172 /* Small local sym to section mapping cache. */
2173 struct sym_sec_cache sym_sec
;
2175 /* For convenience in allocate_dynrelocs. */
2179 /* Create an entry in an ARM ELF linker hash table. */
2181 static struct bfd_hash_entry
*
2182 elf32_arm_link_hash_newfunc (struct bfd_hash_entry
* entry
,
2183 struct bfd_hash_table
* table
,
2184 const char * string
)
2186 struct elf32_arm_link_hash_entry
* ret
=
2187 (struct elf32_arm_link_hash_entry
*) entry
;
2189 /* Allocate the structure if it has not already been allocated by a
2191 if (ret
== (struct elf32_arm_link_hash_entry
*) NULL
)
2192 ret
= bfd_hash_allocate (table
, sizeof (struct elf32_arm_link_hash_entry
));
2194 return (struct bfd_hash_entry
*) ret
;
2196 /* Call the allocation method of the superclass. */
2197 ret
= ((struct elf32_arm_link_hash_entry
*)
2198 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
2202 ret
->relocs_copied
= NULL
;
2203 ret
->tls_type
= GOT_UNKNOWN
;
2204 ret
->plt_thumb_refcount
= 0;
2205 ret
->plt_got_offset
= -1;
2208 return (struct bfd_hash_entry
*) ret
;
2211 /* Return true if NAME is the name of the relocation section associated
2215 reloc_section_p (struct elf32_arm_link_hash_table
*htab
,
2216 const char *name
, asection
*s
)
2219 return strncmp (name
, ".rel", 4) == 0 && strcmp (s
->name
, name
+ 4) == 0;
2221 return strncmp (name
, ".rela", 5) == 0 && strcmp (s
->name
, name
+ 5) == 0;
2224 /* Create .got, .gotplt, and .rel(a).got sections in DYNOBJ, and set up
2225 shortcuts to them in our hash table. */
2228 create_got_section (bfd
*dynobj
, struct bfd_link_info
*info
)
2230 struct elf32_arm_link_hash_table
*htab
;
2232 htab
= elf32_arm_hash_table (info
);
2233 /* BPABI objects never have a GOT, or associated sections. */
2234 if (htab
->symbian_p
)
2237 if (! _bfd_elf_create_got_section (dynobj
, info
))
2240 htab
->sgot
= bfd_get_section_by_name (dynobj
, ".got");
2241 htab
->sgotplt
= bfd_get_section_by_name (dynobj
, ".got.plt");
2242 if (!htab
->sgot
|| !htab
->sgotplt
)
2245 htab
->srelgot
= bfd_make_section_with_flags (dynobj
,
2246 RELOC_SECTION (htab
, ".got"),
2247 (SEC_ALLOC
| SEC_LOAD
2250 | SEC_LINKER_CREATED
2252 if (htab
->srelgot
== NULL
2253 || ! bfd_set_section_alignment (dynobj
, htab
->srelgot
, 2))
2258 /* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
2259 .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
2263 elf32_arm_create_dynamic_sections (bfd
*dynobj
, struct bfd_link_info
*info
)
2265 struct elf32_arm_link_hash_table
*htab
;
2267 htab
= elf32_arm_hash_table (info
);
2268 if (!htab
->sgot
&& !create_got_section (dynobj
, info
))
2271 if (!_bfd_elf_create_dynamic_sections (dynobj
, info
))
2274 htab
->splt
= bfd_get_section_by_name (dynobj
, ".plt");
2275 htab
->srelplt
= bfd_get_section_by_name (dynobj
,
2276 RELOC_SECTION (htab
, ".plt"));
2277 htab
->sdynbss
= bfd_get_section_by_name (dynobj
, ".dynbss");
2279 htab
->srelbss
= bfd_get_section_by_name (dynobj
,
2280 RELOC_SECTION (htab
, ".bss"));
2282 if (htab
->vxworks_p
)
2284 if (!elf_vxworks_create_dynamic_sections (dynobj
, info
, &htab
->srelplt2
))
2289 htab
->plt_header_size
= 0;
2290 htab
->plt_entry_size
2291 = 4 * ARRAY_SIZE (elf32_arm_vxworks_shared_plt_entry
);
2295 htab
->plt_header_size
2296 = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt0_entry
);
2297 htab
->plt_entry_size
2298 = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt_entry
);
2305 || (!info
->shared
&& !htab
->srelbss
))
2311 /* Copy the extra info we tack onto an elf_link_hash_entry. */
2314 elf32_arm_copy_indirect_symbol (struct bfd_link_info
*info
,
2315 struct elf_link_hash_entry
*dir
,
2316 struct elf_link_hash_entry
*ind
)
2318 struct elf32_arm_link_hash_entry
*edir
, *eind
;
2320 edir
= (struct elf32_arm_link_hash_entry
*) dir
;
2321 eind
= (struct elf32_arm_link_hash_entry
*) ind
;
2323 if (eind
->relocs_copied
!= NULL
)
2325 if (edir
->relocs_copied
!= NULL
)
2327 struct elf32_arm_relocs_copied
**pp
;
2328 struct elf32_arm_relocs_copied
*p
;
2330 /* Add reloc counts against the indirect sym to the direct sym
2331 list. Merge any entries against the same section. */
2332 for (pp
= &eind
->relocs_copied
; (p
= *pp
) != NULL
; )
2334 struct elf32_arm_relocs_copied
*q
;
2336 for (q
= edir
->relocs_copied
; q
!= NULL
; q
= q
->next
)
2337 if (q
->section
== p
->section
)
2339 q
->pc_count
+= p
->pc_count
;
2340 q
->count
+= p
->count
;
2347 *pp
= edir
->relocs_copied
;
2350 edir
->relocs_copied
= eind
->relocs_copied
;
2351 eind
->relocs_copied
= NULL
;
2354 /* Copy over PLT info. */
2355 edir
->plt_thumb_refcount
+= eind
->plt_thumb_refcount
;
2356 eind
->plt_thumb_refcount
= 0;
2358 if (ind
->root
.type
== bfd_link_hash_indirect
2359 && dir
->got
.refcount
<= 0)
2361 edir
->tls_type
= eind
->tls_type
;
2362 eind
->tls_type
= GOT_UNKNOWN
;
2365 _bfd_elf_link_hash_copy_indirect (info
, dir
, ind
);
2368 /* Create an ARM elf linker hash table. */
2370 static struct bfd_link_hash_table
*
2371 elf32_arm_link_hash_table_create (bfd
*abfd
)
2373 struct elf32_arm_link_hash_table
*ret
;
2374 bfd_size_type amt
= sizeof (struct elf32_arm_link_hash_table
);
2376 ret
= bfd_malloc (amt
);
2380 if (!_bfd_elf_link_hash_table_init (& ret
->root
, abfd
,
2381 elf32_arm_link_hash_newfunc
,
2382 sizeof (struct elf32_arm_link_hash_entry
)))
2389 ret
->sgotplt
= NULL
;
2390 ret
->srelgot
= NULL
;
2392 ret
->srelplt
= NULL
;
2393 ret
->sdynbss
= NULL
;
2394 ret
->srelbss
= NULL
;
2395 ret
->srelplt2
= NULL
;
2396 ret
->thumb_glue_size
= 0;
2397 ret
->arm_glue_size
= 0;
2398 ret
->bfd_of_glue_owner
= NULL
;
2399 ret
->byteswap_code
= 0;
2400 ret
->target1_is_rel
= 0;
2401 ret
->target2_reloc
= R_ARM_NONE
;
2402 #ifdef FOUR_WORD_PLT
2403 ret
->plt_header_size
= 16;
2404 ret
->plt_entry_size
= 16;
2406 ret
->plt_header_size
= 20;
2407 ret
->plt_entry_size
= 12;
2414 ret
->sym_sec
.abfd
= NULL
;
2416 ret
->tls_ldm_got
.refcount
= 0;
2418 return &ret
->root
.root
;
2421 /* Locate the Thumb encoded calling stub for NAME. */
2423 static struct elf_link_hash_entry
*
2424 find_thumb_glue (struct bfd_link_info
*link_info
,
2429 struct elf_link_hash_entry
*hash
;
2430 struct elf32_arm_link_hash_table
*hash_table
;
2432 /* We need a pointer to the armelf specific hash table. */
2433 hash_table
= elf32_arm_hash_table (link_info
);
2435 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
)
2436 + strlen (THUMB2ARM_GLUE_ENTRY_NAME
) + 1);
2438 BFD_ASSERT (tmp_name
);
2440 sprintf (tmp_name
, THUMB2ARM_GLUE_ENTRY_NAME
, name
);
2442 hash
= elf_link_hash_lookup
2443 (&(hash_table
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
2446 /* xgettext:c-format */
2447 (*_bfd_error_handler
) (_("%B: unable to find THUMB glue '%s' for `%s'"),
2448 input_bfd
, tmp_name
, name
);
2455 /* Locate the ARM encoded calling stub for NAME. */
2457 static struct elf_link_hash_entry
*
2458 find_arm_glue (struct bfd_link_info
*link_info
,
2463 struct elf_link_hash_entry
*myh
;
2464 struct elf32_arm_link_hash_table
*hash_table
;
2466 /* We need a pointer to the elfarm specific hash table. */
2467 hash_table
= elf32_arm_hash_table (link_info
);
2469 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
)
2470 + strlen (ARM2THUMB_GLUE_ENTRY_NAME
) + 1);
2472 BFD_ASSERT (tmp_name
);
2474 sprintf (tmp_name
, ARM2THUMB_GLUE_ENTRY_NAME
, name
);
2476 myh
= elf_link_hash_lookup
2477 (&(hash_table
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
2480 /* xgettext:c-format */
2481 (*_bfd_error_handler
) (_("%B: unable to find ARM glue '%s' for `%s'"),
2482 input_bfd
, tmp_name
, name
);
2489 /* ARM->Thumb glue (static images):
2493 ldr r12, __func_addr
2496 .word func @ behave as if you saw a ARM_32 reloc.
2498 (relocatable images)
2501 ldr r12, __func_offset
2508 #define ARM2THUMB_STATIC_GLUE_SIZE 12
2509 static const insn32 a2t1_ldr_insn
= 0xe59fc000;
2510 static const insn32 a2t2_bx_r12_insn
= 0xe12fff1c;
2511 static const insn32 a2t3_func_addr_insn
= 0x00000001;
2513 #define ARM2THUMB_PIC_GLUE_SIZE 16
2514 static const insn32 a2t1p_ldr_insn
= 0xe59fc004;
2515 static const insn32 a2t2p_add_pc_insn
= 0xe08cc00f;
2516 static const insn32 a2t3p_bx_r12_insn
= 0xe12fff1c;
2518 /* Thumb->ARM: Thumb->(non-interworking aware) ARM
2522 __func_from_thumb: __func_from_thumb:
2524 nop ldr r6, __func_addr
2526 __func_change_to_arm: bx r6
2528 __func_back_to_thumb:
2534 #define THUMB2ARM_GLUE_SIZE 8
2535 static const insn16 t2a1_bx_pc_insn
= 0x4778;
2536 static const insn16 t2a2_noop_insn
= 0x46c0;
2537 static const insn32 t2a3_b_insn
= 0xea000000;
2539 #ifndef ELFARM_NABI_C_INCLUDED
2541 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info
* info
)
2545 struct elf32_arm_link_hash_table
* globals
;
2547 globals
= elf32_arm_hash_table (info
);
2549 BFD_ASSERT (globals
!= NULL
);
2551 if (globals
->arm_glue_size
!= 0)
2553 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
2555 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
2556 ARM2THUMB_GLUE_SECTION_NAME
);
2558 BFD_ASSERT (s
!= NULL
);
2560 foo
= bfd_alloc (globals
->bfd_of_glue_owner
, globals
->arm_glue_size
);
2562 s
->size
= globals
->arm_glue_size
;
2566 if (globals
->thumb_glue_size
!= 0)
2568 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
2570 s
= bfd_get_section_by_name
2571 (globals
->bfd_of_glue_owner
, THUMB2ARM_GLUE_SECTION_NAME
);
2573 BFD_ASSERT (s
!= NULL
);
2575 foo
= bfd_alloc (globals
->bfd_of_glue_owner
, globals
->thumb_glue_size
);
2577 s
->size
= globals
->thumb_glue_size
;
2585 record_arm_to_thumb_glue (struct bfd_link_info
* link_info
,
2586 struct elf_link_hash_entry
* h
)
2588 const char * name
= h
->root
.root
.string
;
2591 struct elf_link_hash_entry
* myh
;
2592 struct bfd_link_hash_entry
* bh
;
2593 struct elf32_arm_link_hash_table
* globals
;
2596 globals
= elf32_arm_hash_table (link_info
);
2598 BFD_ASSERT (globals
!= NULL
);
2599 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
2601 s
= bfd_get_section_by_name
2602 (globals
->bfd_of_glue_owner
, ARM2THUMB_GLUE_SECTION_NAME
);
2604 BFD_ASSERT (s
!= NULL
);
2606 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
) + strlen (ARM2THUMB_GLUE_ENTRY_NAME
) + 1);
2608 BFD_ASSERT (tmp_name
);
2610 sprintf (tmp_name
, ARM2THUMB_GLUE_ENTRY_NAME
, name
);
2612 myh
= elf_link_hash_lookup
2613 (&(globals
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
2617 /* We've already seen this guy. */
2622 /* The only trick here is using hash_table->arm_glue_size as the value.
2623 Even though the section isn't allocated yet, this is where we will be
2626 val
= globals
->arm_glue_size
+ 1;
2627 _bfd_generic_link_add_one_symbol (link_info
, globals
->bfd_of_glue_owner
,
2628 tmp_name
, BSF_GLOBAL
, s
, val
,
2629 NULL
, TRUE
, FALSE
, &bh
);
2631 myh
= (struct elf_link_hash_entry
*) bh
;
2632 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_FUNC
);
2633 myh
->forced_local
= 1;
2637 if ((link_info
->shared
|| globals
->root
.is_relocatable_executable
))
2638 globals
->arm_glue_size
+= ARM2THUMB_PIC_GLUE_SIZE
;
2640 globals
->arm_glue_size
+= ARM2THUMB_STATIC_GLUE_SIZE
;
2646 record_thumb_to_arm_glue (struct bfd_link_info
*link_info
,
2647 struct elf_link_hash_entry
*h
)
2649 const char *name
= h
->root
.root
.string
;
2652 struct elf_link_hash_entry
*myh
;
2653 struct bfd_link_hash_entry
*bh
;
2654 struct elf32_arm_link_hash_table
*hash_table
;
2657 hash_table
= elf32_arm_hash_table (link_info
);
2659 BFD_ASSERT (hash_table
!= NULL
);
2660 BFD_ASSERT (hash_table
->bfd_of_glue_owner
!= NULL
);
2662 s
= bfd_get_section_by_name
2663 (hash_table
->bfd_of_glue_owner
, THUMB2ARM_GLUE_SECTION_NAME
);
2665 BFD_ASSERT (s
!= NULL
);
2667 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
)
2668 + strlen (THUMB2ARM_GLUE_ENTRY_NAME
) + 1);
2670 BFD_ASSERT (tmp_name
);
2672 sprintf (tmp_name
, THUMB2ARM_GLUE_ENTRY_NAME
, name
);
2674 myh
= elf_link_hash_lookup
2675 (&(hash_table
)->root
, tmp_name
, FALSE
, FALSE
, TRUE
);
2679 /* We've already seen this guy. */
2685 val
= hash_table
->thumb_glue_size
+ 1;
2686 _bfd_generic_link_add_one_symbol (link_info
, hash_table
->bfd_of_glue_owner
,
2687 tmp_name
, BSF_GLOBAL
, s
, val
,
2688 NULL
, TRUE
, FALSE
, &bh
);
2690 /* If we mark it 'Thumb', the disassembler will do a better job. */
2691 myh
= (struct elf_link_hash_entry
*) bh
;
2692 myh
->type
= ELF_ST_INFO (STB_LOCAL
, STT_ARM_TFUNC
);
2693 myh
->forced_local
= 1;
2697 #define CHANGE_TO_ARM "__%s_change_to_arm"
2698 #define BACK_FROM_ARM "__%s_back_from_arm"
2700 /* Allocate another symbol to mark where we switch to Arm mode. */
2701 tmp_name
= bfd_malloc ((bfd_size_type
) strlen (name
)
2702 + strlen (CHANGE_TO_ARM
) + 1);
2704 BFD_ASSERT (tmp_name
);
2706 sprintf (tmp_name
, CHANGE_TO_ARM
, name
);
2709 val
= hash_table
->thumb_glue_size
+ 4,
2710 _bfd_generic_link_add_one_symbol (link_info
, hash_table
->bfd_of_glue_owner
,
2711 tmp_name
, BSF_LOCAL
, s
, val
,
2712 NULL
, TRUE
, FALSE
, &bh
);
2716 hash_table
->thumb_glue_size
+= THUMB2ARM_GLUE_SIZE
;
2721 /* Add the glue sections to ABFD. This function is called from the
2722 linker scripts in ld/emultempl/{armelf}.em. */
2725 bfd_elf32_arm_add_glue_sections_to_bfd (bfd
*abfd
,
2726 struct bfd_link_info
*info
)
2731 /* If we are only performing a partial
2732 link do not bother adding the glue. */
2733 if (info
->relocatable
)
2736 sec
= bfd_get_section_by_name (abfd
, ARM2THUMB_GLUE_SECTION_NAME
);
2740 /* Note: we do not include the flag SEC_LINKER_CREATED, as this
2741 will prevent elf_link_input_bfd() from processing the contents
2743 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_CODE
| SEC_READONLY
;
2745 sec
= bfd_make_section_with_flags (abfd
,
2746 ARM2THUMB_GLUE_SECTION_NAME
,
2750 || !bfd_set_section_alignment (abfd
, sec
, 2))
2753 /* Set the gc mark to prevent the section from being removed by garbage
2754 collection, despite the fact that no relocs refer to this section. */
2758 sec
= bfd_get_section_by_name (abfd
, THUMB2ARM_GLUE_SECTION_NAME
);
2762 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
2763 | SEC_CODE
| SEC_READONLY
;
2765 sec
= bfd_make_section_with_flags (abfd
,
2766 THUMB2ARM_GLUE_SECTION_NAME
,
2770 || !bfd_set_section_alignment (abfd
, sec
, 2))
2779 /* Select a BFD to be used to hold the sections used by the glue code.
2780 This function is called from the linker scripts in ld/emultempl/
2784 bfd_elf32_arm_get_bfd_for_interworking (bfd
*abfd
, struct bfd_link_info
*info
)
2786 struct elf32_arm_link_hash_table
*globals
;
2788 /* If we are only performing a partial link
2789 do not bother getting a bfd to hold the glue. */
2790 if (info
->relocatable
)
2793 /* Make sure we don't attach the glue sections to a dynamic object. */
2794 BFD_ASSERT (!(abfd
->flags
& DYNAMIC
));
2796 globals
= elf32_arm_hash_table (info
);
2798 BFD_ASSERT (globals
!= NULL
);
2800 if (globals
->bfd_of_glue_owner
!= NULL
)
2803 /* Save the bfd for later use. */
2804 globals
->bfd_of_glue_owner
= abfd
;
2809 static void check_use_blx(struct elf32_arm_link_hash_table
*globals
)
2811 if (elf32_arm_get_eabi_attr_int (globals
->obfd
, Tag_CPU_arch
) > 2)
2812 globals
->use_blx
= 1;
2816 bfd_elf32_arm_process_before_allocation (bfd
*abfd
,
2817 struct bfd_link_info
*link_info
,
2820 Elf_Internal_Shdr
*symtab_hdr
;
2821 Elf_Internal_Rela
*internal_relocs
= NULL
;
2822 Elf_Internal_Rela
*irel
, *irelend
;
2823 bfd_byte
*contents
= NULL
;
2826 struct elf32_arm_link_hash_table
*globals
;
2828 /* If we are only performing a partial link do not bother
2829 to construct any glue. */
2830 if (link_info
->relocatable
)
2833 /* Here we have a bfd that is to be included on the link. We have a hook
2834 to do reloc rummaging, before section sizes are nailed down. */
2835 globals
= elf32_arm_hash_table (link_info
);
2836 check_use_blx (globals
);
2838 BFD_ASSERT (globals
!= NULL
);
2839 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
2841 if (byteswap_code
&& !bfd_big_endian (abfd
))
2843 _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
2847 globals
->byteswap_code
= byteswap_code
;
2849 /* Rummage around all the relocs and map the glue vectors. */
2850 sec
= abfd
->sections
;
2855 for (; sec
!= NULL
; sec
= sec
->next
)
2857 if (sec
->reloc_count
== 0)
2860 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
2862 /* Load the relocs. */
2864 = _bfd_elf_link_read_relocs (abfd
, sec
, (void *) NULL
,
2865 (Elf_Internal_Rela
*) NULL
, FALSE
);
2867 if (internal_relocs
== NULL
)
2870 irelend
= internal_relocs
+ sec
->reloc_count
;
2871 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2874 unsigned long r_index
;
2876 struct elf_link_hash_entry
*h
;
2878 r_type
= ELF32_R_TYPE (irel
->r_info
);
2879 r_index
= ELF32_R_SYM (irel
->r_info
);
2881 /* These are the only relocation types we care about. */
2882 if ( r_type
!= R_ARM_PC24
2883 && r_type
!= R_ARM_PLT32
2884 && r_type
!= R_ARM_CALL
2885 && r_type
!= R_ARM_JUMP24
2886 && r_type
!= R_ARM_THM_CALL
)
2889 /* Get the section contents if we haven't done so already. */
2890 if (contents
== NULL
)
2892 /* Get cached copy if it exists. */
2893 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
2894 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2897 /* Go get them off disk. */
2898 if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
2903 /* If the relocation is not against a symbol it cannot concern us. */
2906 /* We don't care about local symbols. */
2907 if (r_index
< symtab_hdr
->sh_info
)
2910 /* This is an external symbol. */
2911 r_index
-= symtab_hdr
->sh_info
;
2912 h
= (struct elf_link_hash_entry
*)
2913 elf_sym_hashes (abfd
)[r_index
];
2915 /* If the relocation is against a static symbol it must be within
2916 the current section and so cannot be a cross ARM/Thumb relocation. */
2920 /* If the call will go through a PLT entry then we do not need
2922 if (globals
->splt
!= NULL
&& h
->plt
.offset
!= (bfd_vma
) -1)
2931 /* This one is a call from arm code. We need to look up
2932 the target of the call. If it is a thumb target, we
2934 if (ELF_ST_TYPE(h
->type
) == STT_ARM_TFUNC
2935 && !(r_type
== R_ARM_CALL
&& globals
->use_blx
))
2936 record_arm_to_thumb_glue (link_info
, h
);
2939 case R_ARM_THM_CALL
:
2940 /* This one is a call from thumb code. We look
2941 up the target of the call. If it is not a thumb
2942 target, we insert glue. */
2943 if (ELF_ST_TYPE (h
->type
) != STT_ARM_TFUNC
&& !globals
->use_blx
)
2944 record_thumb_to_arm_glue (link_info
, h
);
2952 if (contents
!= NULL
2953 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2957 if (internal_relocs
!= NULL
2958 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2959 free (internal_relocs
);
2960 internal_relocs
= NULL
;
2966 if (contents
!= NULL
2967 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2969 if (internal_relocs
!= NULL
2970 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2971 free (internal_relocs
);
2978 /* Set target relocation values needed during linking. */
2981 bfd_elf32_arm_set_target_relocs (struct bfd_link_info
*link_info
,
2983 char * target2_type
,
2987 struct elf32_arm_link_hash_table
*globals
;
2989 globals
= elf32_arm_hash_table (link_info
);
2991 globals
->target1_is_rel
= target1_is_rel
;
2992 if (strcmp (target2_type
, "rel") == 0)
2993 globals
->target2_reloc
= R_ARM_REL32
;
2994 else if (strcmp (target2_type
, "abs") == 0)
2995 globals
->target2_reloc
= R_ARM_ABS32
;
2996 else if (strcmp (target2_type
, "got-rel") == 0)
2997 globals
->target2_reloc
= R_ARM_GOT_PREL
;
3000 _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
3003 globals
->fix_v4bx
= fix_v4bx
;
3004 globals
->use_blx
|= use_blx
;
3007 /* The thumb form of a long branch is a bit finicky, because the offset
3008 encoding is split over two fields, each in it's own instruction. They
3009 can occur in any order. So given a thumb form of long branch, and an
3010 offset, insert the offset into the thumb branch and return finished
3013 It takes two thumb instructions to encode the target address. Each has
3014 11 bits to invest. The upper 11 bits are stored in one (identified by
3015 H-0.. see below), the lower 11 bits are stored in the other (identified
3018 Combine together and shifted left by 1 (it's a half word address) and
3022 H-0, upper address-0 = 000
3024 H-1, lower address-0 = 800
3026 They can be ordered either way, but the arm tools I've seen always put
3027 the lower one first. It probably doesn't matter. krk@cygnus.com
3029 XXX: Actually the order does matter. The second instruction (H-1)
3030 moves the computed address into the PC, so it must be the second one
3031 in the sequence. The problem, however is that whilst little endian code
3032 stores the instructions in HI then LOW order, big endian code does the
3033 reverse. nickc@cygnus.com. */
3035 #define LOW_HI_ORDER 0xF800F000
3036 #define HI_LOW_ORDER 0xF000F800
3039 insert_thumb_branch (insn32 br_insn
, int rel_off
)
3041 unsigned int low_bits
;
3042 unsigned int high_bits
;
3044 BFD_ASSERT ((rel_off
& 1) != 1);
3046 rel_off
>>= 1; /* Half word aligned address. */
3047 low_bits
= rel_off
& 0x000007FF; /* The bottom 11 bits. */
3048 high_bits
= (rel_off
>> 11) & 0x000007FF; /* The top 11 bits. */
3050 if ((br_insn
& LOW_HI_ORDER
) == LOW_HI_ORDER
)
3051 br_insn
= LOW_HI_ORDER
| (low_bits
<< 16) | high_bits
;
3052 else if ((br_insn
& HI_LOW_ORDER
) == HI_LOW_ORDER
)
3053 br_insn
= HI_LOW_ORDER
| (high_bits
<< 16) | low_bits
;
3055 /* FIXME: abort is probably not the right call. krk@cygnus.com */
3056 abort (); /* Error - not a valid branch instruction form. */
3062 /* Store an Arm insn into an output section not processed by
3063 elf32_arm_write_section. */
3066 put_arm_insn (struct elf32_arm_link_hash_table
*htab
,
3067 bfd
* output_bfd
, bfd_vma val
, void * ptr
)
3069 if (htab
->byteswap_code
!= bfd_little_endian (output_bfd
))
3070 bfd_putl32 (val
, ptr
);
3072 bfd_putb32 (val
, ptr
);
3076 /* Store a 16-bit Thumb insn into an output section not processed by
3077 elf32_arm_write_section. */
3080 put_thumb_insn (struct elf32_arm_link_hash_table
*htab
,
3081 bfd
* output_bfd
, bfd_vma val
, void * ptr
)
3083 if (htab
->byteswap_code
!= bfd_little_endian (output_bfd
))
3084 bfd_putl16 (val
, ptr
);
3086 bfd_putb16 (val
, ptr
);
3090 /* Thumb code calling an ARM function. */
3093 elf32_thumb_to_arm_stub (struct bfd_link_info
* info
,
3097 asection
* input_section
,
3098 bfd_byte
* hit_data
,
3101 bfd_signed_vma addend
,
3106 unsigned long int tmp
;
3107 long int ret_offset
;
3108 struct elf_link_hash_entry
* myh
;
3109 struct elf32_arm_link_hash_table
* globals
;
3111 myh
= find_thumb_glue (info
, name
, input_bfd
);
3115 globals
= elf32_arm_hash_table (info
);
3117 BFD_ASSERT (globals
!= NULL
);
3118 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
3120 my_offset
= myh
->root
.u
.def
.value
;
3122 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
3123 THUMB2ARM_GLUE_SECTION_NAME
);
3125 BFD_ASSERT (s
!= NULL
);
3126 BFD_ASSERT (s
->contents
!= NULL
);
3127 BFD_ASSERT (s
->output_section
!= NULL
);
3129 if ((my_offset
& 0x01) == 0x01)
3132 && sym_sec
->owner
!= NULL
3133 && !INTERWORK_FLAG (sym_sec
->owner
))
3135 (*_bfd_error_handler
)
3136 (_("%B(%s): warning: interworking not enabled.\n"
3137 " first occurrence: %B: thumb call to arm"),
3138 sym_sec
->owner
, input_bfd
, name
);
3144 myh
->root
.u
.def
.value
= my_offset
;
3146 put_thumb_insn (globals
, output_bfd
, (bfd_vma
) t2a1_bx_pc_insn
,
3147 s
->contents
+ my_offset
);
3149 put_thumb_insn (globals
, output_bfd
, (bfd_vma
) t2a2_noop_insn
,
3150 s
->contents
+ my_offset
+ 2);
3153 /* Address of destination of the stub. */
3154 ((bfd_signed_vma
) val
)
3156 /* Offset from the start of the current section
3157 to the start of the stubs. */
3159 /* Offset of the start of this stub from the start of the stubs. */
3161 /* Address of the start of the current section. */
3162 + s
->output_section
->vma
)
3163 /* The branch instruction is 4 bytes into the stub. */
3165 /* ARM branches work from the pc of the instruction + 8. */
3168 put_arm_insn (globals
, output_bfd
,
3169 (bfd_vma
) t2a3_b_insn
| ((ret_offset
>> 2) & 0x00FFFFFF),
3170 s
->contents
+ my_offset
+ 4);
3173 BFD_ASSERT (my_offset
<= globals
->thumb_glue_size
);
3175 /* Now go back and fix up the original BL insn to point to here. */
3177 /* Address of where the stub is located. */
3178 (s
->output_section
->vma
+ s
->output_offset
+ my_offset
)
3179 /* Address of where the BL is located. */
3180 - (input_section
->output_section
->vma
+ input_section
->output_offset
3182 /* Addend in the relocation. */
3184 /* Biassing for PC-relative addressing. */
3187 tmp
= bfd_get_32 (input_bfd
, hit_data
3188 - input_section
->vma
);
3190 bfd_put_32 (output_bfd
,
3191 (bfd_vma
) insert_thumb_branch (tmp
, ret_offset
),
3192 hit_data
- input_section
->vma
);
3197 /* Arm code calling a Thumb function. */
3200 elf32_arm_to_thumb_stub (struct bfd_link_info
* info
,
3204 asection
* input_section
,
3205 bfd_byte
* hit_data
,
3208 bfd_signed_vma addend
,
3211 unsigned long int tmp
;
3214 long int ret_offset
;
3215 struct elf_link_hash_entry
* myh
;
3216 struct elf32_arm_link_hash_table
* globals
;
3218 myh
= find_arm_glue (info
, name
, input_bfd
);
3222 globals
= elf32_arm_hash_table (info
);
3224 BFD_ASSERT (globals
!= NULL
);
3225 BFD_ASSERT (globals
->bfd_of_glue_owner
!= NULL
);
3227 my_offset
= myh
->root
.u
.def
.value
;
3228 s
= bfd_get_section_by_name (globals
->bfd_of_glue_owner
,
3229 ARM2THUMB_GLUE_SECTION_NAME
);
3230 BFD_ASSERT (s
!= NULL
);
3231 BFD_ASSERT (s
->contents
!= NULL
);
3232 BFD_ASSERT (s
->output_section
!= NULL
);
3234 if ((my_offset
& 0x01) == 0x01)
3237 && sym_sec
->owner
!= NULL
3238 && !INTERWORK_FLAG (sym_sec
->owner
))
3240 (*_bfd_error_handler
)
3241 (_("%B(%s): warning: interworking not enabled.\n"
3242 " first occurrence: %B: arm call to thumb"),
3243 sym_sec
->owner
, input_bfd
, name
);
3247 myh
->root
.u
.def
.value
= my_offset
;
3249 if ((info
->shared
|| globals
->root
.is_relocatable_executable
))
3251 /* For relocatable objects we can't use absolute addresses,
3252 so construct the address from a relative offset. */
3253 /* TODO: If the offset is small it's probably worth
3254 constructing the address with adds. */
3255 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t1p_ldr_insn
,
3256 s
->contents
+ my_offset
);
3257 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t2p_add_pc_insn
,
3258 s
->contents
+ my_offset
+ 4);
3259 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t3p_bx_r12_insn
,
3260 s
->contents
+ my_offset
+ 8);
3261 /* Adjust the offset by 4 for the position of the add,
3262 and 8 for the pipeline offset. */
3263 ret_offset
= (val
- (s
->output_offset
3264 + s
->output_section
->vma
3267 bfd_put_32 (output_bfd
, ret_offset
,
3268 s
->contents
+ my_offset
+ 12);
3272 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t1_ldr_insn
,
3273 s
->contents
+ my_offset
);
3275 put_arm_insn (globals
, output_bfd
, (bfd_vma
) a2t2_bx_r12_insn
,
3276 s
->contents
+ my_offset
+ 4);
3278 /* It's a thumb address. Add the low order bit. */
3279 bfd_put_32 (output_bfd
, val
| a2t3_func_addr_insn
,
3280 s
->contents
+ my_offset
+ 8);
3284 BFD_ASSERT (my_offset
<= globals
->arm_glue_size
);
3286 tmp
= bfd_get_32 (input_bfd
, hit_data
);
3287 tmp
= tmp
& 0xFF000000;
3289 /* Somehow these are both 4 too far, so subtract 8. */
3290 ret_offset
= (s
->output_offset
3292 + s
->output_section
->vma
3293 - (input_section
->output_offset
3294 + input_section
->output_section
->vma
3298 tmp
= tmp
| ((ret_offset
>> 2) & 0x00FFFFFF);
3300 bfd_put_32 (output_bfd
, (bfd_vma
) tmp
, hit_data
- input_section
->vma
);
3305 /* Some relocations map to different relocations depending on the
3306 target. Return the real relocation. */
3308 arm_real_reloc_type (struct elf32_arm_link_hash_table
* globals
,
3314 if (globals
->target1_is_rel
)
3320 return globals
->target2_reloc
;
3327 /* Return the base VMA address which should be subtracted from real addresses
3328 when resolving @dtpoff relocation.
3329 This is PT_TLS segment p_vaddr. */
3332 dtpoff_base (struct bfd_link_info
*info
)
3334 /* If tls_sec is NULL, we should have signalled an error already. */
3335 if (elf_hash_table (info
)->tls_sec
== NULL
)
3337 return elf_hash_table (info
)->tls_sec
->vma
;
3340 /* Return the relocation value for @tpoff relocation
3341 if STT_TLS virtual address is ADDRESS. */
3344 tpoff (struct bfd_link_info
*info
, bfd_vma address
)
3346 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
3349 /* If tls_sec is NULL, we should have signalled an error already. */
3350 if (htab
->tls_sec
== NULL
)
3352 base
= align_power ((bfd_vma
) TCB_SIZE
, htab
->tls_sec
->alignment_power
);
3353 return address
- htab
->tls_sec
->vma
+ base
;
3356 /* Perform an R_ARM_ABS12 relocation on the field pointed to by DATA.
3357 VALUE is the relocation value. */
3359 static bfd_reloc_status_type
3360 elf32_arm_abs12_reloc (bfd
*abfd
, void *data
, bfd_vma value
)
3363 return bfd_reloc_overflow
;
3365 value
|= bfd_get_32 (abfd
, data
) & 0xfffff000;
3366 bfd_put_32 (abfd
, value
, data
);
3367 return bfd_reloc_ok
;
3370 /* For a given value of n, calculate the value of G_n as required to
3371 deal with group relocations. We return it in the form of an
3372 encoded constant-and-rotation, together with the final residual. If n is
3373 specified as less than zero, then final_residual is filled with the
3374 input value and no further action is performed. */
3377 calculate_group_reloc_mask (bfd_vma value
, int n
, bfd_vma
*final_residual
)
3381 bfd_vma encoded_g_n
= 0;
3382 bfd_vma residual
= value
; /* Also known as Y_n. */
3384 for (current_n
= 0; current_n
<= n
; current_n
++)
3388 /* Calculate which part of the value to mask. */
3395 /* Determine the most significant bit in the residual and
3396 align the resulting value to a 2-bit boundary. */
3397 for (msb
= 30; msb
>= 0; msb
-= 2)
3398 if (residual
& (3 << msb
))
3401 /* The desired shift is now (msb - 6), or zero, whichever
3408 /* Calculate g_n in 32-bit as well as encoded constant+rotation form. */
3409 g_n
= residual
& (0xff << shift
);
3410 encoded_g_n
= (g_n
>> shift
)
3411 | ((g_n
<= 0xff ? 0 : (32 - shift
) / 2) << 8);
3413 /* Calculate the residual for the next time around. */
3417 *final_residual
= residual
;
3422 /* Given an ARM instruction, determine whether it is an ADD or a SUB.
3423 Returns 1 if it is an ADD, -1 if it is a SUB, and 0 otherwise. */
3425 identify_add_or_sub(bfd_vma insn
)
3427 int opcode
= insn
& 0x1e00000;
3429 if (opcode
== 1 << 23) /* ADD */
3432 if (opcode
== 1 << 22) /* SUB */
3438 /* Perform a relocation as part of a final link. */
3440 static bfd_reloc_status_type
3441 elf32_arm_final_link_relocate (reloc_howto_type
* howto
,
3444 asection
* input_section
,
3445 bfd_byte
* contents
,
3446 Elf_Internal_Rela
* rel
,
3448 struct bfd_link_info
* info
,
3450 const char * sym_name
,
3452 struct elf_link_hash_entry
* h
,
3453 bfd_boolean
* unresolved_reloc_p
)
3455 unsigned long r_type
= howto
->type
;
3456 unsigned long r_symndx
;
3457 bfd_byte
* hit_data
= contents
+ rel
->r_offset
;
3458 bfd
* dynobj
= NULL
;
3459 Elf_Internal_Shdr
* symtab_hdr
;
3460 struct elf_link_hash_entry
** sym_hashes
;
3461 bfd_vma
* local_got_offsets
;
3462 asection
* sgot
= NULL
;
3463 asection
* splt
= NULL
;
3464 asection
* sreloc
= NULL
;
3466 bfd_signed_vma signed_addend
;
3467 struct elf32_arm_link_hash_table
* globals
;
3469 globals
= elf32_arm_hash_table (info
);
3471 /* Some relocation type map to different relocations depending on the
3472 target. We pick the right one here. */
3473 r_type
= arm_real_reloc_type (globals
, r_type
);
3474 if (r_type
!= howto
->type
)
3475 howto
= elf32_arm_howto_from_type (r_type
);
3477 /* If the start address has been set, then set the EF_ARM_HASENTRY
3478 flag. Setting this more than once is redundant, but the cost is
3479 not too high, and it keeps the code simple.
3481 The test is done here, rather than somewhere else, because the
3482 start address is only set just before the final link commences.
3484 Note - if the user deliberately sets a start address of 0, the
3485 flag will not be set. */
3486 if (bfd_get_start_address (output_bfd
) != 0)
3487 elf_elfheader (output_bfd
)->e_flags
|= EF_ARM_HASENTRY
;
3489 dynobj
= elf_hash_table (info
)->dynobj
;
3492 sgot
= bfd_get_section_by_name (dynobj
, ".got");
3493 splt
= bfd_get_section_by_name (dynobj
, ".plt");
3495 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
3496 sym_hashes
= elf_sym_hashes (input_bfd
);
3497 local_got_offsets
= elf_local_got_offsets (input_bfd
);
3498 r_symndx
= ELF32_R_SYM (rel
->r_info
);
3500 if (globals
->use_rel
)
3502 addend
= bfd_get_32 (input_bfd
, hit_data
) & howto
->src_mask
;
3504 if (addend
& ((howto
->src_mask
+ 1) >> 1))
3507 signed_addend
&= ~ howto
->src_mask
;
3508 signed_addend
|= addend
;
3511 signed_addend
= addend
;
3514 addend
= signed_addend
= rel
->r_addend
;
3519 /* We don't need to find a value for this symbol. It's just a
3521 *unresolved_reloc_p
= FALSE
;
3522 return bfd_reloc_ok
;
3525 if (!globals
->vxworks_p
)
3526 return elf32_arm_abs12_reloc (input_bfd
, hit_data
, value
+ addend
);
3536 /* r_symndx will be zero only for relocs against symbols
3537 from removed linkonce sections, or sections discarded by
3540 return bfd_reloc_ok
;
3542 /* Handle relocations which should use the PLT entry. ABS32/REL32
3543 will use the symbol's value, which may point to a PLT entry, but we
3544 don't need to handle that here. If we created a PLT entry, all
3545 branches in this object should go to it. */
3546 if ((r_type
!= R_ARM_ABS32
&& r_type
!= R_ARM_REL32
)
3549 && h
->plt
.offset
!= (bfd_vma
) -1)
3551 /* If we've created a .plt section, and assigned a PLT entry to
3552 this function, it should not be known to bind locally. If
3553 it were, we would have cleared the PLT entry. */
3554 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info
, h
));
3556 value
= (splt
->output_section
->vma
3557 + splt
->output_offset
3559 *unresolved_reloc_p
= FALSE
;
3560 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
3561 contents
, rel
->r_offset
, value
,
3565 /* When generating a shared object or relocatable executable, these
3566 relocations are copied into the output file to be resolved at
3568 if ((info
->shared
|| globals
->root
.is_relocatable_executable
)
3569 && (input_section
->flags
& SEC_ALLOC
)
3570 && (r_type
!= R_ARM_REL32
3571 || !SYMBOL_CALLS_LOCAL (info
, h
))
3573 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
3574 || h
->root
.type
!= bfd_link_hash_undefweak
)
3575 && r_type
!= R_ARM_PC24
3576 && r_type
!= R_ARM_CALL
3577 && r_type
!= R_ARM_JUMP24
3578 && r_type
!= R_ARM_PREL31
3579 && r_type
!= R_ARM_PLT32
)
3581 Elf_Internal_Rela outrel
;
3583 bfd_boolean skip
, relocate
;
3585 *unresolved_reloc_p
= FALSE
;
3591 name
= (bfd_elf_string_from_elf_section
3593 elf_elfheader (input_bfd
)->e_shstrndx
,
3594 elf_section_data (input_section
)->rel_hdr
.sh_name
));
3596 return bfd_reloc_notsupported
;
3598 BFD_ASSERT (reloc_section_p (globals
, name
, input_section
));
3600 sreloc
= bfd_get_section_by_name (dynobj
, name
);
3601 BFD_ASSERT (sreloc
!= NULL
);
3607 outrel
.r_addend
= addend
;
3609 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
3611 if (outrel
.r_offset
== (bfd_vma
) -1)
3613 else if (outrel
.r_offset
== (bfd_vma
) -2)
3614 skip
= TRUE
, relocate
= TRUE
;
3615 outrel
.r_offset
+= (input_section
->output_section
->vma
3616 + input_section
->output_offset
);
3619 memset (&outrel
, 0, sizeof outrel
);
3624 || !h
->def_regular
))
3625 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
3630 /* This symbol is local, or marked to become local. */
3631 if (sym_flags
== STT_ARM_TFUNC
)
3633 if (globals
->symbian_p
)
3635 /* On Symbian OS, the data segment and text segement
3636 can be relocated independently. Therefore, we
3637 must indicate the segment to which this
3638 relocation is relative. The BPABI allows us to
3639 use any symbol in the right segment; we just use
3640 the section symbol as it is convenient. (We
3641 cannot use the symbol given by "h" directly as it
3642 will not appear in the dynamic symbol table.) */
3644 symbol
= elf_section_data (sym_sec
->output_section
)->dynindx
;
3646 symbol
= elf_section_data (input_section
->output_section
)->dynindx
;
3647 BFD_ASSERT (symbol
!= 0);
3650 /* On SVR4-ish systems, the dynamic loader cannot
3651 relocate the text and data segments independently,
3652 so the symbol does not matter. */
3654 outrel
.r_info
= ELF32_R_INFO (symbol
, R_ARM_RELATIVE
);
3655 if (globals
->use_rel
)
3658 outrel
.r_addend
+= value
;
3661 loc
= sreloc
->contents
;
3662 loc
+= sreloc
->reloc_count
++ * RELOC_SIZE (globals
);
3663 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
3665 /* If this reloc is against an external symbol, we do not want to
3666 fiddle with the addend. Otherwise, we need to include the symbol
3667 value so that it becomes an addend for the dynamic reloc. */
3669 return bfd_reloc_ok
;
3671 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
3672 contents
, rel
->r_offset
, value
,
3675 else switch (r_type
)
3678 return elf32_arm_abs12_reloc (input_bfd
, hit_data
, value
+ addend
);
3680 case R_ARM_XPC25
: /* Arm BLX instruction. */
3683 case R_ARM_PC24
: /* Arm B/BL instruction */
3685 if (r_type
== R_ARM_XPC25
)
3687 /* Check for Arm calling Arm function. */
3688 /* FIXME: Should we translate the instruction into a BL
3689 instruction instead ? */
3690 if (sym_flags
!= STT_ARM_TFUNC
)
3691 (*_bfd_error_handler
)
3692 (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
3694 h
? h
->root
.root
.string
: "(local)");
3696 else if (r_type
!= R_ARM_CALL
|| !globals
->use_blx
)
3698 /* Check for Arm calling Thumb function. */
3699 if (sym_flags
== STT_ARM_TFUNC
)
3701 elf32_arm_to_thumb_stub (info
, sym_name
, input_bfd
,
3702 output_bfd
, input_section
,
3703 hit_data
, sym_sec
, rel
->r_offset
,
3704 signed_addend
, value
);
3705 return bfd_reloc_ok
;
3709 /* The ARM ELF ABI says that this reloc is computed as: S - P + A
3711 S is the address of the symbol in the relocation.
3712 P is address of the instruction being relocated.
3713 A is the addend (extracted from the instruction) in bytes.
3715 S is held in 'value'.
3716 P is the base address of the section containing the
3717 instruction plus the offset of the reloc into that
3719 (input_section->output_section->vma +
3720 input_section->output_offset +
3722 A is the addend, converted into bytes, ie:
3725 Note: None of these operations have knowledge of the pipeline
3726 size of the processor, thus it is up to the assembler to
3727 encode this information into the addend. */
3728 value
-= (input_section
->output_section
->vma
3729 + input_section
->output_offset
);
3730 value
-= rel
->r_offset
;
3731 if (globals
->use_rel
)
3732 value
+= (signed_addend
<< howto
->size
);
3734 /* RELA addends do not have to be adjusted by howto->size. */
3735 value
+= signed_addend
;
3737 signed_addend
= value
;
3738 signed_addend
>>= howto
->rightshift
;
3740 /* It is not an error for an undefined weak reference to be
3741 out of range. Any program that branches to such a symbol
3742 is going to crash anyway, so there is no point worrying
3743 about getting the destination exactly right. */
3744 if (! h
|| h
->root
.type
!= bfd_link_hash_undefweak
)
3746 /* Perform a signed range check. */
3747 if ( signed_addend
> ((bfd_signed_vma
) (howto
->dst_mask
>> 1))
3748 || signed_addend
< - ((bfd_signed_vma
) ((howto
->dst_mask
+ 1) >> 1)))
3749 return bfd_reloc_overflow
;
3752 addend
= (value
& 2);
3754 value
= (signed_addend
& howto
->dst_mask
)
3755 | (bfd_get_32 (input_bfd
, hit_data
) & (~ howto
->dst_mask
));
3757 /* Set the H bit in the BLX instruction. */
3758 if (sym_flags
== STT_ARM_TFUNC
)
3763 value
&= ~(bfd_vma
)(1 << 24);
3765 if (r_type
== R_ARM_CALL
)
3767 /* Select the correct instruction (BL or BLX). */
3768 if (sym_flags
== STT_ARM_TFUNC
)
3772 value
&= ~(bfd_vma
)(1 << 28);
3780 if (sym_flags
== STT_ARM_TFUNC
)
3786 if (sym_flags
== STT_ARM_TFUNC
)
3788 value
-= (input_section
->output_section
->vma
3789 + input_section
->output_offset
+ rel
->r_offset
);
3793 value
-= (input_section
->output_section
->vma
3794 + input_section
->output_offset
+ rel
->r_offset
);
3795 value
+= signed_addend
;
3796 if (! h
|| h
->root
.type
!= bfd_link_hash_undefweak
)
3798 /* Check for overflow */
3799 if ((value
^ (value
>> 1)) & (1 << 30))
3800 return bfd_reloc_overflow
;
3802 value
&= 0x7fffffff;
3803 value
|= (bfd_get_32 (input_bfd
, hit_data
) & 0x80000000);
3804 if (sym_flags
== STT_ARM_TFUNC
)
3809 bfd_put_32 (input_bfd
, value
, hit_data
);
3810 return bfd_reloc_ok
;
3814 if ((long) value
> 0x7f || (long) value
< -0x80)
3815 return bfd_reloc_overflow
;
3817 bfd_put_8 (input_bfd
, value
, hit_data
);
3818 return bfd_reloc_ok
;
3823 if ((long) value
> 0x7fff || (long) value
< -0x8000)
3824 return bfd_reloc_overflow
;
3826 bfd_put_16 (input_bfd
, value
, hit_data
);
3827 return bfd_reloc_ok
;
3829 case R_ARM_THM_ABS5
:
3830 /* Support ldr and str instructions for the thumb. */
3831 if (globals
->use_rel
)
3833 /* Need to refetch addend. */
3834 addend
= bfd_get_16 (input_bfd
, hit_data
) & howto
->src_mask
;
3835 /* ??? Need to determine shift amount from operand size. */
3836 addend
>>= howto
->rightshift
;
3840 /* ??? Isn't value unsigned? */
3841 if ((long) value
> 0x1f || (long) value
< -0x10)
3842 return bfd_reloc_overflow
;
3844 /* ??? Value needs to be properly shifted into place first. */
3845 value
|= bfd_get_16 (input_bfd
, hit_data
) & 0xf83f;
3846 bfd_put_16 (input_bfd
, value
, hit_data
);
3847 return bfd_reloc_ok
;
3849 case R_ARM_THM_XPC22
:
3850 case R_ARM_THM_CALL
:
3851 /* Thumb BL (branch long instruction). */
3854 bfd_boolean overflow
= FALSE
;
3855 bfd_vma upper_insn
= bfd_get_16 (input_bfd
, hit_data
);
3856 bfd_vma lower_insn
= bfd_get_16 (input_bfd
, hit_data
+ 2);
3857 bfd_signed_vma reloc_signed_max
= ((1 << (howto
->bitsize
- 1)) - 1) >> howto
->rightshift
;
3858 bfd_signed_vma reloc_signed_min
= ~ reloc_signed_max
;
3860 bfd_signed_vma signed_check
;
3862 /* Need to refetch the addend and squish the two 11 bit pieces
3864 if (globals
->use_rel
)
3866 bfd_vma upper
= upper_insn
& 0x7ff;
3867 bfd_vma lower
= lower_insn
& 0x7ff;
3868 upper
= (upper
^ 0x400) - 0x400; /* Sign extend. */
3869 addend
= (upper
<< 12) | (lower
<< 1);
3870 signed_addend
= addend
;
3873 if (r_type
== R_ARM_THM_XPC22
)
3875 /* Check for Thumb to Thumb call. */
3876 /* FIXME: Should we translate the instruction into a BL
3877 instruction instead ? */
3878 if (sym_flags
== STT_ARM_TFUNC
)
3879 (*_bfd_error_handler
)
3880 (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
3882 h
? h
->root
.root
.string
: "(local)");
3886 /* If it is not a call to Thumb, assume call to Arm.
3887 If it is a call relative to a section name, then it is not a
3888 function call at all, but rather a long jump. Calls through
3889 the PLT do not require stubs. */
3890 if (sym_flags
!= STT_ARM_TFUNC
&& sym_flags
!= STT_SECTION
3891 && (h
== NULL
|| splt
== NULL
3892 || h
->plt
.offset
== (bfd_vma
) -1))
3894 if (globals
->use_blx
)
3896 /* Convert BL to BLX. */
3897 lower_insn
= (lower_insn
& ~0x1000) | 0x0800;
3899 else if (elf32_thumb_to_arm_stub
3900 (info
, sym_name
, input_bfd
, output_bfd
, input_section
,
3901 hit_data
, sym_sec
, rel
->r_offset
, signed_addend
, value
))
3902 return bfd_reloc_ok
;
3904 return bfd_reloc_dangerous
;
3906 else if (sym_flags
== STT_ARM_TFUNC
&& globals
->use_blx
)
3908 /* Make sure this is a BL. */
3909 lower_insn
|= 0x1800;
3913 /* Handle calls via the PLT. */
3914 if (h
!= NULL
&& splt
!= NULL
&& h
->plt
.offset
!= (bfd_vma
) -1)
3916 value
= (splt
->output_section
->vma
3917 + splt
->output_offset
3919 if (globals
->use_blx
)
3921 /* If the Thumb BLX instruction is available, convert the
3922 BL to a BLX instruction to call the ARM-mode PLT entry. */
3923 lower_insn
= (lower_insn
& ~0x1000) | 0x0800;
3926 /* Target the Thumb stub before the ARM PLT entry. */
3927 value
-= PLT_THUMB_STUB_SIZE
;
3928 *unresolved_reloc_p
= FALSE
;
3931 relocation
= value
+ signed_addend
;
3933 relocation
-= (input_section
->output_section
->vma
3934 + input_section
->output_offset
3937 check
= relocation
>> howto
->rightshift
;
3939 /* If this is a signed value, the rightshift just dropped
3940 leading 1 bits (assuming twos complement). */
3941 if ((bfd_signed_vma
) relocation
>= 0)
3942 signed_check
= check
;
3944 signed_check
= check
| ~((bfd_vma
) -1 >> howto
->rightshift
);
3946 /* Assumes two's complement. */
3947 if (signed_check
> reloc_signed_max
|| signed_check
< reloc_signed_min
)
3950 if ((lower_insn
& 0x1800) == 0x0800)
3951 /* For a BLX instruction, make sure that the relocation is rounded up
3952 to a word boundary. This follows the semantics of the instruction
3953 which specifies that bit 1 of the target address will come from bit
3954 1 of the base address. */
3955 relocation
= (relocation
+ 2) & ~ 3;
3957 /* Put RELOCATION back into the insn. */
3958 upper_insn
= (upper_insn
& ~(bfd_vma
) 0x7ff) | ((relocation
>> 12) & 0x7ff);
3959 lower_insn
= (lower_insn
& ~(bfd_vma
) 0x7ff) | ((relocation
>> 1) & 0x7ff);
3961 /* Put the relocated value back in the object file: */
3962 bfd_put_16 (input_bfd
, upper_insn
, hit_data
);
3963 bfd_put_16 (input_bfd
, lower_insn
, hit_data
+ 2);
3965 return (overflow
? bfd_reloc_overflow
: bfd_reloc_ok
);
3969 case R_ARM_THM_JUMP24
:
3970 /* Thumb32 unconditional branch instruction. */
3973 bfd_boolean overflow
= FALSE
;
3974 bfd_vma upper_insn
= bfd_get_16 (input_bfd
, hit_data
);
3975 bfd_vma lower_insn
= bfd_get_16 (input_bfd
, hit_data
+ 2);
3976 bfd_signed_vma reloc_signed_max
= ((1 << (howto
->bitsize
- 1)) - 1) >> howto
->rightshift
;
3977 bfd_signed_vma reloc_signed_min
= ~ reloc_signed_max
;
3979 bfd_signed_vma signed_check
;
3981 /* Need to refetch the addend, reconstruct the top three bits, and glue the
3982 two pieces together. */
3983 if (globals
->use_rel
)
3985 bfd_vma S
= (upper_insn
& 0x0400) >> 10;
3986 bfd_vma hi
= (upper_insn
& 0x03ff);
3987 bfd_vma I1
= (lower_insn
& 0x2000) >> 13;
3988 bfd_vma I2
= (lower_insn
& 0x0800) >> 11;
3989 bfd_vma lo
= (lower_insn
& 0x07ff);
3995 signed_addend
= (S
<< 24) | (I1
<< 23) | (I2
<< 22) | (hi
<< 12) | (lo
<< 1);
3996 signed_addend
-= (1 << 24); /* Sign extend. */
3999 /* ??? Should handle interworking? GCC might someday try to
4000 use this for tail calls. */
4002 relocation
= value
+ signed_addend
;
4003 relocation
-= (input_section
->output_section
->vma
4004 + input_section
->output_offset
4007 check
= relocation
>> howto
->rightshift
;
4009 /* If this is a signed value, the rightshift just dropped
4010 leading 1 bits (assuming twos complement). */
4011 if ((bfd_signed_vma
) relocation
>= 0)
4012 signed_check
= check
;
4014 signed_check
= check
| ~((bfd_vma
) -1 >> howto
->rightshift
);
4016 /* Assumes two's complement. */
4017 if (signed_check
> reloc_signed_max
|| signed_check
< reloc_signed_min
)
4020 /* Put RELOCATION back into the insn. */
4022 bfd_vma S
= (relocation
& 0x01000000) >> 24;
4023 bfd_vma I1
= (relocation
& 0x00800000) >> 23;
4024 bfd_vma I2
= (relocation
& 0x00400000) >> 22;
4025 bfd_vma hi
= (relocation
& 0x003ff000) >> 12;
4026 bfd_vma lo
= (relocation
& 0x00000ffe) >> 1;
4031 upper_insn
= (upper_insn
& (bfd_vma
) 0xf800) | (S
<< 10) | hi
;
4032 lower_insn
= (lower_insn
& (bfd_vma
) 0xd000) | (I1
<< 13) | (I2
<< 11) | lo
;
4035 /* Put the relocated value back in the object file: */
4036 bfd_put_16 (input_bfd
, upper_insn
, hit_data
);
4037 bfd_put_16 (input_bfd
, lower_insn
, hit_data
+ 2);
4039 return (overflow
? bfd_reloc_overflow
: bfd_reloc_ok
);
4042 case R_ARM_THM_JUMP19
:
4043 /* Thumb32 conditional branch instruction. */
4046 bfd_boolean overflow
= FALSE
;
4047 bfd_vma upper_insn
= bfd_get_16 (input_bfd
, hit_data
);
4048 bfd_vma lower_insn
= bfd_get_16 (input_bfd
, hit_data
+ 2);
4049 bfd_signed_vma reloc_signed_max
= ((1 << (howto
->bitsize
- 1)) - 1) >> howto
->rightshift
;
4050 bfd_signed_vma reloc_signed_min
= ~ reloc_signed_max
;
4052 bfd_signed_vma signed_check
;
4054 /* Need to refetch the addend, reconstruct the top three bits,
4055 and squish the two 11 bit pieces together. */
4056 if (globals
->use_rel
)
4058 bfd_vma S
= (upper_insn
& 0x0400) >> 10;
4059 bfd_vma upper
= (upper_insn
& 0x001f);
4060 bfd_vma J1
= (lower_insn
& 0x2000) >> 13;
4061 bfd_vma J2
= (lower_insn
& 0x0800) >> 11;
4062 bfd_vma lower
= (lower_insn
& 0x07ff);
4067 upper
-= 0x0100; /* Sign extend. */
4069 addend
= (upper
<< 12) | (lower
<< 1);
4070 signed_addend
= addend
;
4073 /* ??? Should handle interworking? GCC might someday try to
4074 use this for tail calls. */
4076 relocation
= value
+ signed_addend
;
4077 relocation
-= (input_section
->output_section
->vma
4078 + input_section
->output_offset
4081 check
= relocation
>> howto
->rightshift
;
4083 /* If this is a signed value, the rightshift just dropped
4084 leading 1 bits (assuming twos complement). */
4085 if ((bfd_signed_vma
) relocation
>= 0)
4086 signed_check
= check
;
4088 signed_check
= check
| ~((bfd_vma
) -1 >> howto
->rightshift
);
4090 /* Assumes two's complement. */
4091 if (signed_check
> reloc_signed_max
|| signed_check
< reloc_signed_min
)
4094 /* Put RELOCATION back into the insn. */
4096 bfd_vma S
= (relocation
& 0x00100000) >> 20;
4097 bfd_vma J2
= (relocation
& 0x00080000) >> 19;
4098 bfd_vma J1
= (relocation
& 0x00040000) >> 18;
4099 bfd_vma hi
= (relocation
& 0x0003f000) >> 12;
4100 bfd_vma lo
= (relocation
& 0x00000ffe) >> 1;
4102 upper_insn
= (upper_insn
& 0xfb30) | (S
<< 10) | hi
;
4103 lower_insn
= (lower_insn
& 0xd000) | (J1
<< 13) | (J2
<< 11) | lo
;
4106 /* Put the relocated value back in the object file: */
4107 bfd_put_16 (input_bfd
, upper_insn
, hit_data
);
4108 bfd_put_16 (input_bfd
, lower_insn
, hit_data
+ 2);
4110 return (overflow
? bfd_reloc_overflow
: bfd_reloc_ok
);
4113 case R_ARM_THM_JUMP11
:
4114 case R_ARM_THM_JUMP8
:
4115 case R_ARM_THM_JUMP6
:
4116 /* Thumb B (branch) instruction). */
4118 bfd_signed_vma relocation
;
4119 bfd_signed_vma reloc_signed_max
= (1 << (howto
->bitsize
- 1)) - 1;
4120 bfd_signed_vma reloc_signed_min
= ~ reloc_signed_max
;
4121 bfd_signed_vma signed_check
;
4123 /* CZB cannot jump backward. */
4124 if (r_type
== R_ARM_THM_JUMP6
)
4125 reloc_signed_min
= 0;
4127 if (globals
->use_rel
)
4129 /* Need to refetch addend. */
4130 addend
= bfd_get_16 (input_bfd
, hit_data
) & howto
->src_mask
;
4131 if (addend
& ((howto
->src_mask
+ 1) >> 1))
4134 signed_addend
&= ~ howto
->src_mask
;
4135 signed_addend
|= addend
;
4138 signed_addend
= addend
;
4139 /* The value in the insn has been right shifted. We need to
4140 undo this, so that we can perform the address calculation
4141 in terms of bytes. */
4142 signed_addend
<<= howto
->rightshift
;
4144 relocation
= value
+ signed_addend
;
4146 relocation
-= (input_section
->output_section
->vma
4147 + input_section
->output_offset
4150 relocation
>>= howto
->rightshift
;
4151 signed_check
= relocation
;
4153 if (r_type
== R_ARM_THM_JUMP6
)
4154 relocation
= ((relocation
& 0x0020) << 4) | ((relocation
& 0x001f) << 3);
4156 relocation
&= howto
->dst_mask
;
4157 relocation
|= (bfd_get_16 (input_bfd
, hit_data
) & (~ howto
->dst_mask
));
4159 bfd_put_16 (input_bfd
, relocation
, hit_data
);
4161 /* Assumes two's complement. */
4162 if (signed_check
> reloc_signed_max
|| signed_check
< reloc_signed_min
)
4163 return bfd_reloc_overflow
;
4165 return bfd_reloc_ok
;
4168 case R_ARM_ALU_PCREL7_0
:
4169 case R_ARM_ALU_PCREL15_8
:
4170 case R_ARM_ALU_PCREL23_15
:
4175 insn
= bfd_get_32 (input_bfd
, hit_data
);
4176 if (globals
->use_rel
)
4178 /* Extract the addend. */
4179 addend
= (insn
& 0xff) << ((insn
& 0xf00) >> 7);
4180 signed_addend
= addend
;
4182 relocation
= value
+ signed_addend
;
4184 relocation
-= (input_section
->output_section
->vma
4185 + input_section
->output_offset
4187 insn
= (insn
& ~0xfff)
4188 | ((howto
->bitpos
<< 7) & 0xf00)
4189 | ((relocation
>> howto
->bitpos
) & 0xff);
4190 bfd_put_32 (input_bfd
, value
, hit_data
);
4192 return bfd_reloc_ok
;
4194 case R_ARM_GNU_VTINHERIT
:
4195 case R_ARM_GNU_VTENTRY
:
4196 return bfd_reloc_ok
;
4198 case R_ARM_GOTOFF32
:
4199 /* Relocation is relative to the start of the
4200 global offset table. */
4202 BFD_ASSERT (sgot
!= NULL
);
4204 return bfd_reloc_notsupported
;
4206 /* If we are addressing a Thumb function, we need to adjust the
4207 address by one, so that attempts to call the function pointer will
4208 correctly interpret it as Thumb code. */
4209 if (sym_flags
== STT_ARM_TFUNC
)
4212 /* Note that sgot->output_offset is not involved in this
4213 calculation. We always want the start of .got. If we
4214 define _GLOBAL_OFFSET_TABLE in a different way, as is
4215 permitted by the ABI, we might have to change this
4217 value
-= sgot
->output_section
->vma
;
4218 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
4219 contents
, rel
->r_offset
, value
,
4223 /* Use global offset table as symbol value. */
4224 BFD_ASSERT (sgot
!= NULL
);
4227 return bfd_reloc_notsupported
;
4229 *unresolved_reloc_p
= FALSE
;
4230 value
= sgot
->output_section
->vma
;
4231 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
4232 contents
, rel
->r_offset
, value
,
4236 case R_ARM_GOT_PREL
:
4237 /* Relocation is to the entry for this symbol in the
4238 global offset table. */
4240 return bfd_reloc_notsupported
;
4247 off
= h
->got
.offset
;
4248 BFD_ASSERT (off
!= (bfd_vma
) -1);
4249 dyn
= globals
->root
.dynamic_sections_created
;
4251 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
4253 && SYMBOL_REFERENCES_LOCAL (info
, h
))
4254 || (ELF_ST_VISIBILITY (h
->other
)
4255 && h
->root
.type
== bfd_link_hash_undefweak
))
4257 /* This is actually a static link, or it is a -Bsymbolic link
4258 and the symbol is defined locally. We must initialize this
4259 entry in the global offset table. Since the offset must
4260 always be a multiple of 4, we use the least significant bit
4261 to record whether we have initialized it already.
4263 When doing a dynamic link, we create a .rel(a).got relocation
4264 entry to initialize the value. This is done in the
4265 finish_dynamic_symbol routine. */
4270 /* If we are addressing a Thumb function, we need to
4271 adjust the address by one, so that attempts to
4272 call the function pointer will correctly
4273 interpret it as Thumb code. */
4274 if (sym_flags
== STT_ARM_TFUNC
)
4277 bfd_put_32 (output_bfd
, value
, sgot
->contents
+ off
);
4282 *unresolved_reloc_p
= FALSE
;
4284 value
= sgot
->output_offset
+ off
;
4290 BFD_ASSERT (local_got_offsets
!= NULL
&&
4291 local_got_offsets
[r_symndx
] != (bfd_vma
) -1);
4293 off
= local_got_offsets
[r_symndx
];
4295 /* The offset must always be a multiple of 4. We use the
4296 least significant bit to record whether we have already
4297 generated the necessary reloc. */
4302 /* If we are addressing a Thumb function, we need to
4303 adjust the address by one, so that attempts to
4304 call the function pointer will correctly
4305 interpret it as Thumb code. */
4306 if (sym_flags
== STT_ARM_TFUNC
)
4309 if (globals
->use_rel
)
4310 bfd_put_32 (output_bfd
, value
, sgot
->contents
+ off
);
4315 Elf_Internal_Rela outrel
;
4318 srelgot
= (bfd_get_section_by_name
4319 (dynobj
, RELOC_SECTION (globals
, ".got")));
4320 BFD_ASSERT (srelgot
!= NULL
);
4322 outrel
.r_addend
= addend
+ value
;
4323 outrel
.r_offset
= (sgot
->output_section
->vma
4324 + sgot
->output_offset
4326 outrel
.r_info
= ELF32_R_INFO (0, R_ARM_RELATIVE
);
4327 loc
= srelgot
->contents
;
4328 loc
+= srelgot
->reloc_count
++ * RELOC_SIZE (globals
);
4329 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
4332 local_got_offsets
[r_symndx
] |= 1;
4335 value
= sgot
->output_offset
+ off
;
4337 if (r_type
!= R_ARM_GOT32
)
4338 value
+= sgot
->output_section
->vma
;
4340 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
4341 contents
, rel
->r_offset
, value
,
4344 case R_ARM_TLS_LDO32
:
4345 value
= value
- dtpoff_base (info
);
4347 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
4348 contents
, rel
->r_offset
, value
,
4351 case R_ARM_TLS_LDM32
:
4355 if (globals
->sgot
== NULL
)
4358 off
= globals
->tls_ldm_got
.offset
;
4364 /* If we don't know the module number, create a relocation
4368 Elf_Internal_Rela outrel
;
4371 if (globals
->srelgot
== NULL
)
4374 outrel
.r_addend
= 0;
4375 outrel
.r_offset
= (globals
->sgot
->output_section
->vma
4376 + globals
->sgot
->output_offset
+ off
);
4377 outrel
.r_info
= ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32
);
4379 if (globals
->use_rel
)
4380 bfd_put_32 (output_bfd
, outrel
.r_addend
,
4381 globals
->sgot
->contents
+ off
);
4383 loc
= globals
->srelgot
->contents
;
4384 loc
+= globals
->srelgot
->reloc_count
++ * RELOC_SIZE (globals
);
4385 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
4388 bfd_put_32 (output_bfd
, 1, globals
->sgot
->contents
+ off
);
4390 globals
->tls_ldm_got
.offset
|= 1;
4393 value
= globals
->sgot
->output_section
->vma
+ globals
->sgot
->output_offset
+ off
4394 - (input_section
->output_section
->vma
+ input_section
->output_offset
+ rel
->r_offset
);
4396 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
4397 contents
, rel
->r_offset
, value
,
4401 case R_ARM_TLS_GD32
:
4402 case R_ARM_TLS_IE32
:
4408 if (globals
->sgot
== NULL
)
4415 dyn
= globals
->root
.dynamic_sections_created
;
4416 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
4418 || !SYMBOL_REFERENCES_LOCAL (info
, h
)))
4420 *unresolved_reloc_p
= FALSE
;
4423 off
= h
->got
.offset
;
4424 tls_type
= ((struct elf32_arm_link_hash_entry
*) h
)->tls_type
;
4428 if (local_got_offsets
== NULL
)
4430 off
= local_got_offsets
[r_symndx
];
4431 tls_type
= elf32_arm_local_got_tls_type (input_bfd
)[r_symndx
];
4434 if (tls_type
== GOT_UNKNOWN
)
4441 bfd_boolean need_relocs
= FALSE
;
4442 Elf_Internal_Rela outrel
;
4443 bfd_byte
*loc
= NULL
;
4446 /* The GOT entries have not been initialized yet. Do it
4447 now, and emit any relocations. If both an IE GOT and a
4448 GD GOT are necessary, we emit the GD first. */
4450 if ((info
->shared
|| indx
!= 0)
4452 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
4453 || h
->root
.type
!= bfd_link_hash_undefweak
))
4456 if (globals
->srelgot
== NULL
)
4458 loc
= globals
->srelgot
->contents
;
4459 loc
+= globals
->srelgot
->reloc_count
* RELOC_SIZE (globals
);
4462 if (tls_type
& GOT_TLS_GD
)
4466 outrel
.r_addend
= 0;
4467 outrel
.r_offset
= (globals
->sgot
->output_section
->vma
4468 + globals
->sgot
->output_offset
4470 outrel
.r_info
= ELF32_R_INFO (indx
, R_ARM_TLS_DTPMOD32
);
4472 if (globals
->use_rel
)
4473 bfd_put_32 (output_bfd
, outrel
.r_addend
,
4474 globals
->sgot
->contents
+ cur_off
);
4476 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
4477 globals
->srelgot
->reloc_count
++;
4478 loc
+= RELOC_SIZE (globals
);
4481 bfd_put_32 (output_bfd
, value
- dtpoff_base (info
),
4482 globals
->sgot
->contents
+ cur_off
+ 4);
4485 outrel
.r_addend
= 0;
4486 outrel
.r_info
= ELF32_R_INFO (indx
,
4487 R_ARM_TLS_DTPOFF32
);
4488 outrel
.r_offset
+= 4;
4490 if (globals
->use_rel
)
4491 bfd_put_32 (output_bfd
, outrel
.r_addend
,
4492 globals
->sgot
->contents
+ cur_off
+ 4);
4495 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
4496 globals
->srelgot
->reloc_count
++;
4497 loc
+= RELOC_SIZE (globals
);
4502 /* If we are not emitting relocations for a
4503 general dynamic reference, then we must be in a
4504 static link or an executable link with the
4505 symbol binding locally. Mark it as belonging
4506 to module 1, the executable. */
4507 bfd_put_32 (output_bfd
, 1,
4508 globals
->sgot
->contents
+ cur_off
);
4509 bfd_put_32 (output_bfd
, value
- dtpoff_base (info
),
4510 globals
->sgot
->contents
+ cur_off
+ 4);
4516 if (tls_type
& GOT_TLS_IE
)
4521 outrel
.r_addend
= value
- dtpoff_base (info
);
4523 outrel
.r_addend
= 0;
4524 outrel
.r_offset
= (globals
->sgot
->output_section
->vma
4525 + globals
->sgot
->output_offset
4527 outrel
.r_info
= ELF32_R_INFO (indx
, R_ARM_TLS_TPOFF32
);
4529 if (globals
->use_rel
)
4530 bfd_put_32 (output_bfd
, outrel
.r_addend
,
4531 globals
->sgot
->contents
+ cur_off
);
4533 SWAP_RELOC_OUT (globals
) (output_bfd
, &outrel
, loc
);
4534 globals
->srelgot
->reloc_count
++;
4535 loc
+= RELOC_SIZE (globals
);
4538 bfd_put_32 (output_bfd
, tpoff (info
, value
),
4539 globals
->sgot
->contents
+ cur_off
);
4546 local_got_offsets
[r_symndx
] |= 1;
4549 if ((tls_type
& GOT_TLS_GD
) && r_type
!= R_ARM_TLS_GD32
)
4551 value
= globals
->sgot
->output_section
->vma
+ globals
->sgot
->output_offset
+ off
4552 - (input_section
->output_section
->vma
+ input_section
->output_offset
+ rel
->r_offset
);
4554 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
4555 contents
, rel
->r_offset
, value
,
4559 case R_ARM_TLS_LE32
:
4562 (*_bfd_error_handler
)
4563 (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
4564 input_bfd
, input_section
,
4565 (long) rel
->r_offset
, howto
->name
);
4569 value
= tpoff (info
, value
);
4571 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
4572 contents
, rel
->r_offset
, value
,
4576 if (globals
->fix_v4bx
)
4578 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
4580 /* Ensure that we have a BX instruction. */
4581 BFD_ASSERT ((insn
& 0x0ffffff0) == 0x012fff10);
4583 /* Preserve Rm (lowest four bits) and the condition code
4584 (highest four bits). Other bits encode MOV PC,Rm. */
4585 insn
= (insn
& 0xf000000f) | 0x01a0f000;
4587 bfd_put_32 (input_bfd
, insn
, hit_data
);
4589 return bfd_reloc_ok
;
4591 case R_ARM_MOVW_ABS_NC
:
4592 case R_ARM_MOVT_ABS
:
4593 case R_ARM_MOVW_PREL_NC
:
4594 case R_ARM_MOVT_PREL
:
4596 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
4598 if (globals
->use_rel
)
4600 addend
= ((insn
>> 4) & 0xf000) | (insn
& 0xfff);
4601 signed_addend
= (addend
^ 0x10000) - 0x10000;
4603 value
+= signed_addend
;
4604 if (sym_flags
== STT_ARM_TFUNC
)
4607 if (r_type
== R_ARM_MOVW_PREL_NC
|| r_type
== R_ARM_MOVT_PREL
)
4608 value
-= (input_section
->output_section
->vma
4609 + input_section
->output_offset
+ rel
->r_offset
);
4611 if (r_type
== R_ARM_MOVT_ABS
|| r_type
== R_ARM_MOVT_PREL
)
4615 insn
|= value
& 0xfff;
4616 insn
|= (value
& 0xf000) << 4;
4617 bfd_put_32 (input_bfd
, insn
, hit_data
);
4619 return bfd_reloc_ok
;
4621 case R_ARM_THM_MOVW_ABS_NC
:
4622 case R_ARM_THM_MOVT_ABS
:
4623 case R_ARM_THM_MOVW_PREL_NC
:
4624 case R_ARM_THM_MOVT_PREL
:
4628 insn
= bfd_get_16 (input_bfd
, hit_data
) << 16;
4629 insn
|= bfd_get_16 (input_bfd
, hit_data
+ 2);
4631 if (globals
->use_rel
)
4633 addend
= ((insn
>> 4) & 0xf000)
4634 | ((insn
>> 15) & 0x0800)
4635 | ((insn
>> 4) & 0x0700)
4637 signed_addend
= (addend
^ 0x10000) - 0x10000;
4639 value
+= signed_addend
;
4640 if (sym_flags
== STT_ARM_TFUNC
)
4643 if (r_type
== R_ARM_THM_MOVW_PREL_NC
|| r_type
== R_ARM_THM_MOVT_PREL
)
4644 value
-= (input_section
->output_section
->vma
4645 + input_section
->output_offset
+ rel
->r_offset
);
4647 if (r_type
== R_ARM_THM_MOVT_ABS
|| r_type
== R_ARM_THM_MOVT_PREL
)
4651 insn
|= (value
& 0xf000) << 4;
4652 insn
|= (value
& 0x0800) << 15;
4653 insn
|= (value
& 0x0700) << 4;
4654 insn
|= (value
& 0x00ff);
4656 bfd_put_16 (input_bfd
, insn
>> 16, hit_data
);
4657 bfd_put_16 (input_bfd
, insn
& 0xffff, hit_data
+ 2);
4659 return bfd_reloc_ok
;
4661 case R_ARM_ALU_PC_G0_NC
:
4662 case R_ARM_ALU_PC_G1_NC
:
4663 case R_ARM_ALU_PC_G0
:
4664 case R_ARM_ALU_PC_G1
:
4665 case R_ARM_ALU_PC_G2
:
4666 case R_ARM_ALU_SB_G0_NC
:
4667 case R_ARM_ALU_SB_G1_NC
:
4668 case R_ARM_ALU_SB_G0
:
4669 case R_ARM_ALU_SB_G1
:
4670 case R_ARM_ALU_SB_G2
:
4672 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
4673 bfd_vma pc
= input_section
->output_section
->vma
4674 + input_section
->output_offset
+ rel
->r_offset
;
4675 /* sb should be the origin of the *segment* containing the symbol.
4676 It is not clear how to obtain this OS-dependent value, so we
4677 make an arbitrary choice of zero. */
4681 bfd_signed_vma signed_value
;
4684 /* Determine which group of bits to select. */
4687 case R_ARM_ALU_PC_G0_NC
:
4688 case R_ARM_ALU_PC_G0
:
4689 case R_ARM_ALU_SB_G0_NC
:
4690 case R_ARM_ALU_SB_G0
:
4694 case R_ARM_ALU_PC_G1_NC
:
4695 case R_ARM_ALU_PC_G1
:
4696 case R_ARM_ALU_SB_G1_NC
:
4697 case R_ARM_ALU_SB_G1
:
4701 case R_ARM_ALU_PC_G2
:
4702 case R_ARM_ALU_SB_G2
:
4710 /* If REL, extract the addend from the insn. If RELA, it will
4711 have already been fetched for us. */
4712 if (globals
->use_rel
)
4715 bfd_vma constant
= insn
& 0xff;
4716 bfd_vma rotation
= (insn
& 0xf00) >> 8;
4719 signed_addend
= constant
;
4722 /* Compensate for the fact that in the instruction, the
4723 rotation is stored in multiples of 2 bits. */
4726 /* Rotate "constant" right by "rotation" bits. */
4727 signed_addend
= (constant
>> rotation
) |
4728 (constant
<< (8 * sizeof (bfd_vma
) - rotation
));
4731 /* Determine if the instruction is an ADD or a SUB.
4732 (For REL, this determines the sign of the addend.) */
4733 negative
= identify_add_or_sub (insn
);
4736 (*_bfd_error_handler
)
4737 (_("%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group relocations"),
4738 input_bfd
, input_section
,
4739 (long) rel
->r_offset
, howto
->name
);
4740 return bfd_reloc_overflow
;
4743 signed_addend
*= negative
;
4746 /* Compute the value (X) to go in the place. */
4747 if (r_type
== R_ARM_ALU_PC_G0_NC
4748 || r_type
== R_ARM_ALU_PC_G1_NC
4749 || r_type
== R_ARM_ALU_PC_G0
4750 || r_type
== R_ARM_ALU_PC_G1
4751 || r_type
== R_ARM_ALU_PC_G2
)
4753 signed_value
= value
- pc
+ signed_addend
;
4755 /* Section base relative. */
4756 signed_value
= value
- sb
+ signed_addend
;
4758 /* If the target symbol is a Thumb function, then set the
4759 Thumb bit in the address. */
4760 if (sym_flags
== STT_ARM_TFUNC
)
4763 /* Calculate the value of the relevant G_n, in encoded
4764 constant-with-rotation format. */
4765 g_n
= calculate_group_reloc_mask (abs (signed_value
), group
,
4768 /* Check for overflow if required. */
4769 if ((r_type
== R_ARM_ALU_PC_G0
4770 || r_type
== R_ARM_ALU_PC_G1
4771 || r_type
== R_ARM_ALU_PC_G2
4772 || r_type
== R_ARM_ALU_SB_G0
4773 || r_type
== R_ARM_ALU_SB_G1
4774 || r_type
== R_ARM_ALU_SB_G2
) && residual
!= 0)
4776 (*_bfd_error_handler
)
4777 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
4778 input_bfd
, input_section
,
4779 (long) rel
->r_offset
, abs (signed_value
), howto
->name
);
4780 return bfd_reloc_overflow
;
4783 /* Mask out the value and the ADD/SUB part of the opcode; take care
4784 not to destroy the S bit. */
4787 /* Set the opcode according to whether the value to go in the
4788 place is negative. */
4789 if (signed_value
< 0)
4794 /* Encode the offset. */
4797 bfd_put_32 (input_bfd
, insn
, hit_data
);
4799 return bfd_reloc_ok
;
4801 case R_ARM_LDR_PC_G0
:
4802 case R_ARM_LDR_PC_G1
:
4803 case R_ARM_LDR_PC_G2
:
4804 case R_ARM_LDR_SB_G0
:
4805 case R_ARM_LDR_SB_G1
:
4806 case R_ARM_LDR_SB_G2
:
4808 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
4809 bfd_vma pc
= input_section
->output_section
->vma
4810 + input_section
->output_offset
+ rel
->r_offset
;
4811 bfd_vma sb
= 0; /* See note above. */
4813 bfd_signed_vma signed_value
;
4816 /* Determine which groups of bits to calculate. */
4819 case R_ARM_LDR_PC_G0
:
4820 case R_ARM_LDR_SB_G0
:
4824 case R_ARM_LDR_PC_G1
:
4825 case R_ARM_LDR_SB_G1
:
4829 case R_ARM_LDR_PC_G2
:
4830 case R_ARM_LDR_SB_G2
:
4838 /* If REL, extract the addend from the insn. If RELA, it will
4839 have already been fetched for us. */
4840 if (globals
->use_rel
)
4842 int negative
= (insn
& (1 << 23)) ? 1 : -1;
4843 signed_addend
= negative
* (insn
& 0xfff);
4846 /* Compute the value (X) to go in the place. */
4847 if (r_type
== R_ARM_LDR_PC_G0
4848 || r_type
== R_ARM_LDR_PC_G1
4849 || r_type
== R_ARM_LDR_PC_G2
)
4851 signed_value
= value
- pc
+ signed_addend
;
4853 /* Section base relative. */
4854 signed_value
= value
- sb
+ signed_addend
;
4856 /* Calculate the value of the relevant G_{n-1} to obtain
4857 the residual at that stage. */
4858 calculate_group_reloc_mask (abs (signed_value
), group
- 1, &residual
);
4860 /* Check for overflow. */
4861 if (residual
>= 0x1000)
4863 (*_bfd_error_handler
)
4864 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
4865 input_bfd
, input_section
,
4866 (long) rel
->r_offset
, abs (signed_value
), howto
->name
);
4867 return bfd_reloc_overflow
;
4870 /* Mask out the value and U bit. */
4873 /* Set the U bit if the value to go in the place is non-negative. */
4874 if (signed_value
>= 0)
4877 /* Encode the offset. */
4880 bfd_put_32 (input_bfd
, insn
, hit_data
);
4882 return bfd_reloc_ok
;
4884 case R_ARM_LDRS_PC_G0
:
4885 case R_ARM_LDRS_PC_G1
:
4886 case R_ARM_LDRS_PC_G2
:
4887 case R_ARM_LDRS_SB_G0
:
4888 case R_ARM_LDRS_SB_G1
:
4889 case R_ARM_LDRS_SB_G2
:
4891 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
4892 bfd_vma pc
= input_section
->output_section
->vma
4893 + input_section
->output_offset
+ rel
->r_offset
;
4894 bfd_vma sb
= 0; /* See note above. */
4896 bfd_signed_vma signed_value
;
4899 /* Determine which groups of bits to calculate. */
4902 case R_ARM_LDRS_PC_G0
:
4903 case R_ARM_LDRS_SB_G0
:
4907 case R_ARM_LDRS_PC_G1
:
4908 case R_ARM_LDRS_SB_G1
:
4912 case R_ARM_LDRS_PC_G2
:
4913 case R_ARM_LDRS_SB_G2
:
4921 /* If REL, extract the addend from the insn. If RELA, it will
4922 have already been fetched for us. */
4923 if (globals
->use_rel
)
4925 int negative
= (insn
& (1 << 23)) ? 1 : -1;
4926 signed_addend
= negative
* (((insn
& 0xf00) >> 4) + (insn
& 0xf));
4929 /* Compute the value (X) to go in the place. */
4930 if (r_type
== R_ARM_LDRS_PC_G0
4931 || r_type
== R_ARM_LDRS_PC_G1
4932 || r_type
== R_ARM_LDRS_PC_G2
)
4934 signed_value
= value
- pc
+ signed_addend
;
4936 /* Section base relative. */
4937 signed_value
= value
- sb
+ signed_addend
;
4939 /* Calculate the value of the relevant G_{n-1} to obtain
4940 the residual at that stage. */
4941 calculate_group_reloc_mask (abs (signed_value
), group
- 1, &residual
);
4943 /* Check for overflow. */
4944 if (residual
>= 0x100)
4946 (*_bfd_error_handler
)
4947 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
4948 input_bfd
, input_section
,
4949 (long) rel
->r_offset
, abs (signed_value
), howto
->name
);
4950 return bfd_reloc_overflow
;
4953 /* Mask out the value and U bit. */
4956 /* Set the U bit if the value to go in the place is non-negative. */
4957 if (signed_value
>= 0)
4960 /* Encode the offset. */
4961 insn
|= ((residual
& 0xf0) << 4) | (residual
& 0xf);
4963 bfd_put_32 (input_bfd
, insn
, hit_data
);
4965 return bfd_reloc_ok
;
4967 case R_ARM_LDC_PC_G0
:
4968 case R_ARM_LDC_PC_G1
:
4969 case R_ARM_LDC_PC_G2
:
4970 case R_ARM_LDC_SB_G0
:
4971 case R_ARM_LDC_SB_G1
:
4972 case R_ARM_LDC_SB_G2
:
4974 bfd_vma insn
= bfd_get_32 (input_bfd
, hit_data
);
4975 bfd_vma pc
= input_section
->output_section
->vma
4976 + input_section
->output_offset
+ rel
->r_offset
;
4977 bfd_vma sb
= 0; /* See note above. */
4979 bfd_signed_vma signed_value
;
4982 /* Determine which groups of bits to calculate. */
4985 case R_ARM_LDC_PC_G0
:
4986 case R_ARM_LDC_SB_G0
:
4990 case R_ARM_LDC_PC_G1
:
4991 case R_ARM_LDC_SB_G1
:
4995 case R_ARM_LDC_PC_G2
:
4996 case R_ARM_LDC_SB_G2
:
5004 /* If REL, extract the addend from the insn. If RELA, it will
5005 have already been fetched for us. */
5006 if (globals
->use_rel
)
5008 int negative
= (insn
& (1 << 23)) ? 1 : -1;
5009 signed_addend
= negative
* ((insn
& 0xff) << 2);
5012 /* Compute the value (X) to go in the place. */
5013 if (r_type
== R_ARM_LDC_PC_G0
5014 || r_type
== R_ARM_LDC_PC_G1
5015 || r_type
== R_ARM_LDC_PC_G2
)
5017 signed_value
= value
- pc
+ signed_addend
;
5019 /* Section base relative. */
5020 signed_value
= value
- sb
+ signed_addend
;
5022 /* Calculate the value of the relevant G_{n-1} to obtain
5023 the residual at that stage. */
5024 calculate_group_reloc_mask (abs (signed_value
), group
- 1, &residual
);
5026 /* Check for overflow. (The absolute value to go in the place must be
5027 divisible by four and, after having been divided by four, must
5028 fit in eight bits.) */
5029 if ((residual
& 0x3) != 0 || residual
>= 0x400)
5031 (*_bfd_error_handler
)
5032 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
5033 input_bfd
, input_section
,
5034 (long) rel
->r_offset
, abs (signed_value
), howto
->name
);
5035 return bfd_reloc_overflow
;
5038 /* Mask out the value and U bit. */
5041 /* Set the U bit if the value to go in the place is non-negative. */
5042 if (signed_value
>= 0)
5045 /* Encode the offset. */
5046 insn
|= residual
>> 2;
5048 bfd_put_32 (input_bfd
, insn
, hit_data
);
5050 return bfd_reloc_ok
;
5053 return bfd_reloc_notsupported
;
5059 uleb128_size (unsigned int i
)
5071 /* Return TRUE if the attribute has the default value (0/""). */
5073 is_default_attr (aeabi_attribute
*attr
)
5075 if ((attr
->type
& 1) && attr
->i
!= 0)
5077 if ((attr
->type
& 2) && attr
->s
&& *attr
->s
)
5083 /* Return the size of a single attribute. */
5085 eabi_attr_size(int tag
, aeabi_attribute
*attr
)
5089 if (is_default_attr (attr
))
5092 size
= uleb128_size (tag
);
5094 size
+= uleb128_size (attr
->i
);
5096 size
+= strlen ((char *)attr
->s
) + 1;
5100 /* Returns the size of the eabi object attributess section. */
5102 elf32_arm_eabi_attr_size (bfd
*abfd
)
5105 aeabi_attribute
*attr
;
5106 aeabi_attribute_list
*list
;
5109 attr
= elf32_arm_tdata (abfd
)->known_eabi_attributes
;
5110 size
= 16; /* 'A' <size> "aeabi" 0x1 <size>. */
5111 for (i
= 4; i
< NUM_KNOWN_ATTRIBUTES
; i
++)
5112 size
+= eabi_attr_size (i
, &attr
[i
]);
5114 for (list
= elf32_arm_tdata (abfd
)->other_eabi_attributes
;
5117 size
+= eabi_attr_size (list
->tag
, &list
->attr
);
5123 write_uleb128 (bfd_byte
*p
, unsigned int val
)
5138 /* Write attribute ATTR to butter P, and return a pointer to the following
5141 write_eabi_attribute (bfd_byte
*p
, int tag
, aeabi_attribute
*attr
)
5143 /* Suppress default entries. */
5144 if (is_default_attr(attr
))
5147 p
= write_uleb128 (p
, tag
);
5149 p
= write_uleb128 (p
, attr
->i
);
5154 len
= strlen (attr
->s
) + 1;
5155 memcpy (p
, attr
->s
, len
);
5162 /* Write the contents of the eabi attributes section to p. */
5164 elf32_arm_set_eabi_attr_contents (bfd
*abfd
, bfd_byte
*contents
, bfd_vma size
)
5167 aeabi_attribute
*attr
;
5168 aeabi_attribute_list
*list
;
5173 bfd_put_32 (abfd
, size
- 1, p
);
5175 memcpy (p
, "aeabi", 6);
5178 bfd_put_32 (abfd
, size
- 11, p
);
5181 attr
= elf32_arm_tdata (abfd
)->known_eabi_attributes
;
5182 for (i
= 4; i
< NUM_KNOWN_ATTRIBUTES
; i
++)
5183 p
= write_eabi_attribute (p
, i
, &attr
[i
]);
5185 for (list
= elf32_arm_tdata (abfd
)->other_eabi_attributes
;
5188 p
= write_eabi_attribute (p
, list
->tag
, &list
->attr
);
5191 /* Override final_link to handle EABI object attribute sections. */
5194 elf32_arm_bfd_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
5197 struct bfd_link_order
*p
;
5198 asection
*attr_section
= NULL
;
5202 /* elf32_arm_merge_private_bfd_data will already have merged the
5203 object attributes. Remove the input sections from the link, and set
5204 the contents of the output secton. */
5205 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
5207 if (strcmp (o
->name
, ".ARM.attributes") == 0)
5209 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
5211 asection
*input_section
;
5213 if (p
->type
!= bfd_indirect_link_order
)
5215 input_section
= p
->u
.indirect
.section
;
5216 /* Hack: reset the SEC_HAS_CONTENTS flag so that
5217 elf_link_input_bfd ignores this section. */
5218 input_section
->flags
&= ~SEC_HAS_CONTENTS
;
5221 size
= elf32_arm_eabi_attr_size (abfd
);
5222 bfd_set_section_size (abfd
, o
, size
);
5224 /* Skip this section later on. */
5225 o
->map_head
.link_order
= NULL
;
5228 /* Invoke the ELF linker to do all the work. */
5229 if (!bfd_elf_final_link (abfd
, info
))
5234 contents
= bfd_malloc(size
);
5235 if (contents
== NULL
)
5237 elf32_arm_set_eabi_attr_contents (abfd
, contents
, size
);
5238 bfd_set_section_contents (abfd
, attr_section
, contents
, 0, size
);
5245 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS. */
5247 arm_add_to_rel (bfd
* abfd
,
5249 reloc_howto_type
* howto
,
5250 bfd_signed_vma increment
)
5252 bfd_signed_vma addend
;
5254 if (howto
->type
== R_ARM_THM_CALL
)
5256 int upper_insn
, lower_insn
;
5259 upper_insn
= bfd_get_16 (abfd
, address
);
5260 lower_insn
= bfd_get_16 (abfd
, address
+ 2);
5261 upper
= upper_insn
& 0x7ff;
5262 lower
= lower_insn
& 0x7ff;
5264 addend
= (upper
<< 12) | (lower
<< 1);
5265 addend
+= increment
;
5268 upper_insn
= (upper_insn
& 0xf800) | ((addend
>> 11) & 0x7ff);
5269 lower_insn
= (lower_insn
& 0xf800) | (addend
& 0x7ff);
5271 bfd_put_16 (abfd
, (bfd_vma
) upper_insn
, address
);
5272 bfd_put_16 (abfd
, (bfd_vma
) lower_insn
, address
+ 2);
5278 contents
= bfd_get_32 (abfd
, address
);
5280 /* Get the (signed) value from the instruction. */
5281 addend
= contents
& howto
->src_mask
;
5282 if (addend
& ((howto
->src_mask
+ 1) >> 1))
5284 bfd_signed_vma mask
;
5287 mask
&= ~ howto
->src_mask
;
5291 /* Add in the increment, (which is a byte value). */
5292 switch (howto
->type
)
5295 addend
+= increment
;
5302 addend
<<= howto
->size
;
5303 addend
+= increment
;
5305 /* Should we check for overflow here ? */
5307 /* Drop any undesired bits. */
5308 addend
>>= howto
->rightshift
;
5312 contents
= (contents
& ~ howto
->dst_mask
) | (addend
& howto
->dst_mask
);
5314 bfd_put_32 (abfd
, contents
, address
);
5318 #define IS_ARM_TLS_RELOC(R_TYPE) \
5319 ((R_TYPE) == R_ARM_TLS_GD32 \
5320 || (R_TYPE) == R_ARM_TLS_LDO32 \
5321 || (R_TYPE) == R_ARM_TLS_LDM32 \
5322 || (R_TYPE) == R_ARM_TLS_DTPOFF32 \
5323 || (R_TYPE) == R_ARM_TLS_DTPMOD32 \
5324 || (R_TYPE) == R_ARM_TLS_TPOFF32 \
5325 || (R_TYPE) == R_ARM_TLS_LE32 \
5326 || (R_TYPE) == R_ARM_TLS_IE32)
5328 /* Relocate an ARM ELF section. */
5330 elf32_arm_relocate_section (bfd
* output_bfd
,
5331 struct bfd_link_info
* info
,
5333 asection
* input_section
,
5334 bfd_byte
* contents
,
5335 Elf_Internal_Rela
* relocs
,
5336 Elf_Internal_Sym
* local_syms
,
5337 asection
** local_sections
)
5339 Elf_Internal_Shdr
*symtab_hdr
;
5340 struct elf_link_hash_entry
**sym_hashes
;
5341 Elf_Internal_Rela
*rel
;
5342 Elf_Internal_Rela
*relend
;
5344 struct elf32_arm_link_hash_table
* globals
;
5346 globals
= elf32_arm_hash_table (info
);
5347 if (info
->relocatable
&& !globals
->use_rel
)
5350 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
5351 sym_hashes
= elf_sym_hashes (input_bfd
);
5354 relend
= relocs
+ input_section
->reloc_count
;
5355 for (; rel
< relend
; rel
++)
5358 reloc_howto_type
* howto
;
5359 unsigned long r_symndx
;
5360 Elf_Internal_Sym
* sym
;
5362 struct elf_link_hash_entry
* h
;
5364 bfd_reloc_status_type r
;
5367 bfd_boolean unresolved_reloc
= FALSE
;
5369 r_symndx
= ELF32_R_SYM (rel
->r_info
);
5370 r_type
= ELF32_R_TYPE (rel
->r_info
);
5371 r_type
= arm_real_reloc_type (globals
, r_type
);
5373 if ( r_type
== R_ARM_GNU_VTENTRY
5374 || r_type
== R_ARM_GNU_VTINHERIT
)
5377 bfd_reloc
.howto
= elf32_arm_howto_from_type (r_type
);
5378 howto
= bfd_reloc
.howto
;
5380 if (info
->relocatable
&& globals
->use_rel
)
5382 /* This is a relocatable link. We don't have to change
5383 anything, unless the reloc is against a section symbol,
5384 in which case we have to adjust according to where the
5385 section symbol winds up in the output section. */
5386 if (r_symndx
< symtab_hdr
->sh_info
)
5388 sym
= local_syms
+ r_symndx
;
5389 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
5391 sec
= local_sections
[r_symndx
];
5392 arm_add_to_rel (input_bfd
, contents
+ rel
->r_offset
,
5394 (bfd_signed_vma
) (sec
->output_offset
5402 /* This is a final link. */
5407 if (r_symndx
< symtab_hdr
->sh_info
)
5409 sym
= local_syms
+ r_symndx
;
5410 sym_type
= ELF32_ST_TYPE (sym
->st_info
);
5411 sec
= local_sections
[r_symndx
];
5412 if (globals
->use_rel
)
5414 relocation
= (sec
->output_section
->vma
5415 + sec
->output_offset
5417 if ((sec
->flags
& SEC_MERGE
)
5418 && ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
5421 bfd_vma addend
, value
;
5423 if (howto
->rightshift
)
5425 (*_bfd_error_handler
)
5426 (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
5427 input_bfd
, input_section
,
5428 (long) rel
->r_offset
, howto
->name
);
5432 value
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
5434 /* Get the (signed) value from the instruction. */
5435 addend
= value
& howto
->src_mask
;
5436 if (addend
& ((howto
->src_mask
+ 1) >> 1))
5438 bfd_signed_vma mask
;
5441 mask
&= ~ howto
->src_mask
;
5446 _bfd_elf_rel_local_sym (output_bfd
, sym
, &msec
, addend
)
5448 addend
+= msec
->output_section
->vma
+ msec
->output_offset
;
5449 value
= (value
& ~ howto
->dst_mask
) | (addend
& howto
->dst_mask
);
5450 bfd_put_32 (input_bfd
, value
, contents
+ rel
->r_offset
);
5454 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
5460 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
5461 r_symndx
, symtab_hdr
, sym_hashes
,
5463 unresolved_reloc
, warned
);
5469 name
= h
->root
.root
.string
;
5472 name
= (bfd_elf_string_from_elf_section
5473 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
5474 if (name
== NULL
|| *name
== '\0')
5475 name
= bfd_section_name (input_bfd
, sec
);
5479 && r_type
!= R_ARM_NONE
5481 || h
->root
.type
== bfd_link_hash_defined
5482 || h
->root
.type
== bfd_link_hash_defweak
)
5483 && IS_ARM_TLS_RELOC (r_type
) != (sym_type
== STT_TLS
))
5485 (*_bfd_error_handler
)
5486 ((sym_type
== STT_TLS
5487 ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
5488 : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
5491 (long) rel
->r_offset
,
5496 r
= elf32_arm_final_link_relocate (howto
, input_bfd
, output_bfd
,
5497 input_section
, contents
, rel
,
5498 relocation
, info
, sec
, name
,
5499 (h
? ELF_ST_TYPE (h
->type
) :
5500 ELF_ST_TYPE (sym
->st_info
)), h
,
5503 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5504 because such sections are not SEC_ALLOC and thus ld.so will
5505 not process them. */
5506 if (unresolved_reloc
5507 && !((input_section
->flags
& SEC_DEBUGGING
) != 0
5510 (*_bfd_error_handler
)
5511 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5514 (long) rel
->r_offset
,
5516 h
->root
.root
.string
);
5520 if (r
!= bfd_reloc_ok
)
5522 const char * msg
= (const char *) 0;
5526 case bfd_reloc_overflow
:
5527 /* If the overflowing reloc was to an undefined symbol,
5528 we have already printed one error message and there
5529 is no point complaining again. */
5531 h
->root
.type
!= bfd_link_hash_undefined
)
5532 && (!((*info
->callbacks
->reloc_overflow
)
5533 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
5534 (bfd_vma
) 0, input_bfd
, input_section
,
5539 case bfd_reloc_undefined
:
5540 if (!((*info
->callbacks
->undefined_symbol
)
5541 (info
, name
, input_bfd
, input_section
,
5542 rel
->r_offset
, TRUE
)))
5546 case bfd_reloc_outofrange
:
5547 msg
= _("internal error: out of range error");
5550 case bfd_reloc_notsupported
:
5551 msg
= _("internal error: unsupported relocation error");
5554 case bfd_reloc_dangerous
:
5555 msg
= _("internal error: dangerous error");
5559 msg
= _("internal error: unknown error");
5563 if (!((*info
->callbacks
->warning
)
5564 (info
, msg
, name
, input_bfd
, input_section
,
5575 /* Allocate/find an object attribute. */
5576 static aeabi_attribute
*
5577 elf32_arm_new_eabi_attr (bfd
*abfd
, int tag
)
5579 aeabi_attribute
*attr
;
5580 aeabi_attribute_list
*list
;
5581 aeabi_attribute_list
*p
;
5582 aeabi_attribute_list
**lastp
;
5585 if (tag
< NUM_KNOWN_ATTRIBUTES
)
5587 /* Knwon tags are preallocated. */
5588 attr
= &elf32_arm_tdata (abfd
)->known_eabi_attributes
[tag
];
5592 /* Create a new tag. */
5593 list
= (aeabi_attribute_list
*)
5594 bfd_alloc (abfd
, sizeof (aeabi_attribute_list
));
5595 memset (list
, 0, sizeof (aeabi_attribute_list
));
5597 /* Keep the tag list in order. */
5598 lastp
= &elf32_arm_tdata (abfd
)->other_eabi_attributes
;
5599 for (p
= *lastp
; p
; p
= p
->next
)
5605 list
->next
= *lastp
;
5614 elf32_arm_get_eabi_attr_int (bfd
*abfd
, int tag
)
5616 aeabi_attribute_list
*p
;
5618 if (tag
< NUM_KNOWN_ATTRIBUTES
)
5620 /* Knwon tags are preallocated. */
5621 return elf32_arm_tdata (abfd
)->known_eabi_attributes
[tag
].i
;
5625 for (p
= elf32_arm_tdata (abfd
)->other_eabi_attributes
;
5639 elf32_arm_add_eabi_attr_int (bfd
*abfd
, int tag
, unsigned int i
)
5641 aeabi_attribute
*attr
;
5643 attr
= elf32_arm_new_eabi_attr (abfd
, tag
);
5649 attr_strdup (bfd
*abfd
, const char * s
)
5654 len
= strlen (s
) + 1;
5655 p
= (char *)bfd_alloc(abfd
, len
);
5656 return memcpy (p
, s
, len
);
5660 elf32_arm_add_eabi_attr_string (bfd
*abfd
, int tag
, const char *s
)
5662 aeabi_attribute
*attr
;
5664 attr
= elf32_arm_new_eabi_attr (abfd
, tag
);
5666 attr
->s
= attr_strdup (abfd
, s
);
5670 elf32_arm_add_eabi_attr_compat (bfd
*abfd
, unsigned int i
, const char *s
)
5672 aeabi_attribute_list
*list
;
5673 aeabi_attribute_list
*p
;
5674 aeabi_attribute_list
**lastp
;
5676 list
= (aeabi_attribute_list
*)
5677 bfd_alloc (abfd
, sizeof (aeabi_attribute_list
));
5678 memset (list
, 0, sizeof (aeabi_attribute_list
));
5679 list
->tag
= Tag_compatibility
;
5680 list
->attr
.type
= 3;
5682 list
->attr
.s
= attr_strdup (abfd
, s
);
5684 lastp
= &elf32_arm_tdata (abfd
)->other_eabi_attributes
;
5685 for (p
= *lastp
; p
; p
= p
->next
)
5688 if (p
->tag
!= Tag_compatibility
)
5690 cmp
= strcmp(s
, p
->attr
.s
);
5691 if (cmp
< 0 || (cmp
== 0 && i
< p
->attr
.i
))
5695 list
->next
= *lastp
;
5699 /* Set the right machine number. */
5702 elf32_arm_object_p (bfd
*abfd
)
5706 mach
= bfd_arm_get_mach_from_notes (abfd
, ARM_NOTE_SECTION
);
5708 if (mach
!= bfd_mach_arm_unknown
)
5709 bfd_default_set_arch_mach (abfd
, bfd_arch_arm
, mach
);
5711 else if (elf_elfheader (abfd
)->e_flags
& EF_ARM_MAVERICK_FLOAT
)
5712 bfd_default_set_arch_mach (abfd
, bfd_arch_arm
, bfd_mach_arm_ep9312
);
5715 bfd_default_set_arch_mach (abfd
, bfd_arch_arm
, mach
);
5720 /* Function to keep ARM specific flags in the ELF header. */
5723 elf32_arm_set_private_flags (bfd
*abfd
, flagword flags
)
5725 if (elf_flags_init (abfd
)
5726 && elf_elfheader (abfd
)->e_flags
!= flags
)
5728 if (EF_ARM_EABI_VERSION (flags
) == EF_ARM_EABI_UNKNOWN
)
5730 if (flags
& EF_ARM_INTERWORK
)
5731 (*_bfd_error_handler
)
5732 (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
5736 (_("Warning: Clearing the interworking flag of %B due to outside request"),
5742 elf_elfheader (abfd
)->e_flags
= flags
;
5743 elf_flags_init (abfd
) = TRUE
;
5749 /* Copy the eabi object attribute from IBFD to OBFD. */
5751 copy_eabi_attributes (bfd
*ibfd
, bfd
*obfd
)
5753 aeabi_attribute
*in_attr
;
5754 aeabi_attribute
*out_attr
;
5755 aeabi_attribute_list
*list
;
5758 in_attr
= elf32_arm_tdata (ibfd
)->known_eabi_attributes
;
5759 out_attr
= elf32_arm_tdata (obfd
)->known_eabi_attributes
;
5760 for (i
= 4; i
< NUM_KNOWN_ATTRIBUTES
; i
++)
5762 out_attr
->i
= in_attr
->i
;
5763 if (in_attr
->s
&& *in_attr
->s
)
5764 out_attr
->s
= attr_strdup (obfd
, in_attr
->s
);
5769 for (list
= elf32_arm_tdata (ibfd
)->other_eabi_attributes
;
5773 in_attr
= &list
->attr
;
5774 switch (in_attr
->type
)
5777 elf32_arm_add_eabi_attr_int (obfd
, list
->tag
, in_attr
->i
);
5780 elf32_arm_add_eabi_attr_string (obfd
, list
->tag
, in_attr
->s
);
5783 elf32_arm_add_eabi_attr_compat (obfd
, in_attr
->i
, in_attr
->s
);
5792 /* Copy backend specific data from one object module to another. */
5795 elf32_arm_copy_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
5800 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
5801 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
5804 in_flags
= elf_elfheader (ibfd
)->e_flags
;
5805 out_flags
= elf_elfheader (obfd
)->e_flags
;
5807 if (elf_flags_init (obfd
)
5808 && EF_ARM_EABI_VERSION (out_flags
) == EF_ARM_EABI_UNKNOWN
5809 && in_flags
!= out_flags
)
5811 /* Cannot mix APCS26 and APCS32 code. */
5812 if ((in_flags
& EF_ARM_APCS_26
) != (out_flags
& EF_ARM_APCS_26
))
5815 /* Cannot mix float APCS and non-float APCS code. */
5816 if ((in_flags
& EF_ARM_APCS_FLOAT
) != (out_flags
& EF_ARM_APCS_FLOAT
))
5819 /* If the src and dest have different interworking flags
5820 then turn off the interworking bit. */
5821 if ((in_flags
& EF_ARM_INTERWORK
) != (out_flags
& EF_ARM_INTERWORK
))
5823 if (out_flags
& EF_ARM_INTERWORK
)
5825 (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
5828 in_flags
&= ~EF_ARM_INTERWORK
;
5831 /* Likewise for PIC, though don't warn for this case. */
5832 if ((in_flags
& EF_ARM_PIC
) != (out_flags
& EF_ARM_PIC
))
5833 in_flags
&= ~EF_ARM_PIC
;
5836 elf_elfheader (obfd
)->e_flags
= in_flags
;
5837 elf_flags_init (obfd
) = TRUE
;
5839 /* Also copy the EI_OSABI field. */
5840 elf_elfheader (obfd
)->e_ident
[EI_OSABI
] =
5841 elf_elfheader (ibfd
)->e_ident
[EI_OSABI
];
5843 /* Copy EABI object attributes. */
5844 copy_eabi_attributes (ibfd
, obfd
);
5849 /* Values for Tag_ABI_PCS_R9_use. */
5858 /* Values for Tag_ABI_PCS_RW_data. */
5861 AEABI_PCS_RW_data_absolute
,
5862 AEABI_PCS_RW_data_PCrel
,
5863 AEABI_PCS_RW_data_SBrel
,
5864 AEABI_PCS_RW_data_unused
5867 /* Values for Tag_ABI_enum_size. */
5873 AEABI_enum_forced_wide
5876 /* Merge EABI object attributes from IBFD into OBFD. Raise an error if there
5877 are conflicting attributes. */
5879 elf32_arm_merge_eabi_attributes (bfd
*ibfd
, bfd
*obfd
)
5881 aeabi_attribute
*in_attr
;
5882 aeabi_attribute
*out_attr
;
5883 aeabi_attribute_list
*in_list
;
5884 aeabi_attribute_list
*out_list
;
5885 /* Some tags have 0 = don't care, 1 = strong requirement,
5886 2 = weak requirement. */
5887 static const int order_312
[3] = {3, 1, 2};
5890 if (!elf32_arm_tdata (ibfd
)->known_eabi_attributes
[0].i
)
5892 /* This is the first object. Copy the attributes. */
5893 copy_eabi_attributes (ibfd
, obfd
);
5897 /* Use the Tag_null value to indicate the attributes have been
5899 elf32_arm_tdata (ibfd
)->known_eabi_attributes
[0].i
= 1;
5901 in_attr
= elf32_arm_tdata (ibfd
)->known_eabi_attributes
;
5902 out_attr
= elf32_arm_tdata (obfd
)->known_eabi_attributes
;
5903 /* This needs to happen before Tag_ABI_FP_number_model is merged. */
5904 if (in_attr
[Tag_ABI_VFP_args
].i
!= out_attr
[Tag_ABI_VFP_args
].i
)
5906 /* Ignore mismatches if teh object doesn't use floating point. */
5907 if (out_attr
[Tag_ABI_FP_number_model
].i
== 0)
5908 out_attr
[Tag_ABI_VFP_args
].i
= in_attr
[Tag_ABI_VFP_args
].i
;
5909 else if (in_attr
[Tag_ABI_FP_number_model
].i
!= 0)
5912 (_("ERROR: %B uses VFP register arguments, %B does not"),
5918 for (i
= 4; i
< NUM_KNOWN_ATTRIBUTES
; i
++)
5920 /* Merge this attribute with existing attributes. */
5923 case Tag_CPU_raw_name
:
5925 /* Use whichever has the greatest architecture requirements. */
5926 if (in_attr
[Tag_CPU_arch
].i
> out_attr
[Tag_CPU_arch
].i
)
5927 out_attr
[i
].s
= attr_strdup(obfd
, in_attr
[i
].s
);
5930 case Tag_ABI_optimization_goals
:
5931 case Tag_ABI_FP_optimization_goals
:
5932 /* Use the first value seen. */
5936 case Tag_ARM_ISA_use
:
5937 case Tag_THUMB_ISA_use
:
5941 /* ??? Do NEON and WMMX conflict? */
5942 case Tag_ABI_FP_rounding
:
5943 case Tag_ABI_FP_denormal
:
5944 case Tag_ABI_FP_exceptions
:
5945 case Tag_ABI_FP_user_exceptions
:
5946 case Tag_ABI_FP_number_model
:
5947 case Tag_ABI_align8_preserved
:
5948 case Tag_ABI_HardFP_use
:
5949 /* Use the largest value specified. */
5950 if (in_attr
[i
].i
> out_attr
[i
].i
)
5951 out_attr
[i
].i
= in_attr
[i
].i
;
5954 case Tag_CPU_arch_profile
:
5955 /* Warn if conflicting architecture profiles used. */
5956 if (out_attr
[i
].i
&& in_attr
[i
].i
&& in_attr
[i
].i
!= out_attr
[i
].i
)
5959 (_("ERROR: %B: Conflicting architecture profiles %c/%c"),
5960 ibfd
, in_attr
[i
].i
, out_attr
[i
].i
);
5964 out_attr
[i
].i
= in_attr
[i
].i
;
5966 case Tag_PCS_config
:
5967 if (out_attr
[i
].i
== 0)
5968 out_attr
[i
].i
= in_attr
[i
].i
;
5969 else if (in_attr
[i
].i
!= 0 && out_attr
[i
].i
!= 0)
5971 /* It's sometimes ok to mix different configs, so this is only
5974 (_("Warning: %B: Conflicting platform configuration"), ibfd
);
5977 case Tag_ABI_PCS_R9_use
:
5978 if (out_attr
[i
].i
!= AEABI_R9_unused
5979 && in_attr
[i
].i
!= AEABI_R9_unused
)
5982 (_("ERROR: %B: Conflicting use of R9"), ibfd
);
5985 if (out_attr
[i
].i
== AEABI_R9_unused
)
5986 out_attr
[i
].i
= in_attr
[i
].i
;
5988 case Tag_ABI_PCS_RW_data
:
5989 if (in_attr
[i
].i
== AEABI_PCS_RW_data_SBrel
5990 && out_attr
[Tag_ABI_PCS_R9_use
].i
!= AEABI_R9_SB
5991 && out_attr
[Tag_ABI_PCS_R9_use
].i
!= AEABI_R9_unused
)
5994 (_("ERROR: %B: SB relative addressing conflicts with use of R9"),
5998 /* Use the smallest value specified. */
5999 if (in_attr
[i
].i
< out_attr
[i
].i
)
6000 out_attr
[i
].i
= in_attr
[i
].i
;
6002 case Tag_ABI_PCS_RO_data
:
6003 /* Use the smallest value specified. */
6004 if (in_attr
[i
].i
< out_attr
[i
].i
)
6005 out_attr
[i
].i
= in_attr
[i
].i
;
6007 case Tag_ABI_PCS_GOT_use
:
6008 if (in_attr
[i
].i
> 2 || out_attr
[i
].i
> 2
6009 || order_312
[in_attr
[i
].i
] < order_312
[out_attr
[i
].i
])
6010 out_attr
[i
].i
= in_attr
[i
].i
;
6012 case Tag_ABI_PCS_wchar_t
:
6013 if (out_attr
[i
].i
&& in_attr
[i
].i
&& out_attr
[i
].i
!= in_attr
[i
].i
)
6016 (_("ERROR: %B: Conflicting definitions of wchar_t"), ibfd
);
6020 out_attr
[i
].i
= in_attr
[i
].i
;
6022 case Tag_ABI_align8_needed
:
6023 /* ??? Check against Tag_ABI_align8_preserved. */
6024 if (in_attr
[i
].i
> 2 || out_attr
[i
].i
> 2
6025 || order_312
[in_attr
[i
].i
] < order_312
[out_attr
[i
].i
])
6026 out_attr
[i
].i
= in_attr
[i
].i
;
6028 case Tag_ABI_enum_size
:
6029 if (in_attr
[i
].i
!= AEABI_enum_unused
)
6031 if (out_attr
[i
].i
== AEABI_enum_unused
6032 || out_attr
[i
].i
== AEABI_enum_forced_wide
)
6034 /* The existing object is compatible with anything.
6035 Use whatever requirements the new object has. */
6036 out_attr
[i
].i
= in_attr
[i
].i
;
6038 else if (in_attr
[i
].i
!= AEABI_enum_forced_wide
6039 && out_attr
[i
].i
!= in_attr
[i
].i
)
6042 (_("ERROR: %B: Conflicting enum sizes"), ibfd
);
6046 case Tag_ABI_VFP_args
:
6049 case Tag_ABI_WMMX_args
:
6050 if (in_attr
[i
].i
!= out_attr
[i
].i
)
6053 (_("ERROR: %B uses iWMMXt register arguments, %B does not"),
6058 default: /* All known attributes should be explicitly covered. */
6063 in_list
= elf32_arm_tdata (ibfd
)->other_eabi_attributes
;
6064 out_list
= elf32_arm_tdata (ibfd
)->other_eabi_attributes
;
6065 while (in_list
&& in_list
->tag
== Tag_compatibility
)
6067 in_attr
= &in_list
->attr
;
6068 if (in_attr
->i
== 0)
6070 if (in_attr
->i
== 1)
6073 (_("ERROR: %B: Must be processed by '%s' toolchain"),
6077 if (!out_list
|| out_list
->tag
!= Tag_compatibility
6078 || strcmp (in_attr
->s
, out_list
->attr
.s
) != 0)
6080 /* Add this compatibility tag to the output. */
6081 elf32_arm_add_eabi_attr_compat (obfd
, in_attr
->i
, in_attr
->s
);
6084 out_attr
= &out_list
->attr
;
6085 /* Check all the input tags with the same identifier. */
6088 if (out_list
->tag
!= Tag_compatibility
6089 || in_attr
->i
!= out_attr
->i
6090 || strcmp (in_attr
->s
, out_attr
->s
) != 0)
6093 (_("ERROR: %B: Incompatible object tag '%s':%d"),
6094 ibfd
, in_attr
->s
, in_attr
->i
);
6097 in_list
= in_list
->next
;
6098 if (in_list
->tag
!= Tag_compatibility
6099 || strcmp (in_attr
->s
, in_list
->attr
.s
) != 0)
6101 in_attr
= &in_list
->attr
;
6102 out_list
= out_list
->next
;
6104 out_attr
= &out_list
->attr
;
6107 /* Check the output doesn't have extra tags with this identifier. */
6108 if (out_list
&& out_list
->tag
== Tag_compatibility
6109 && strcmp (in_attr
->s
, out_list
->attr
.s
) == 0)
6112 (_("ERROR: %B: Incompatible object tag '%s':%d"),
6113 ibfd
, in_attr
->s
, out_list
->attr
.i
);
6118 for (; in_list
; in_list
= in_list
->next
)
6120 if ((in_list
->tag
& 128) < 64)
6123 (_("Warning: %B: Unknown EABI object attribute %d"),
6124 ibfd
, in_list
->tag
);
6132 /* Return TRUE if the two EABI versions are incompatible. */
6135 elf32_arm_versions_compatible (unsigned iver
, unsigned over
)
6137 /* v4 and v5 are the same spec before and after it was released,
6138 so allow mixing them. */
6139 if ((iver
== EF_ARM_EABI_VER4
&& over
== EF_ARM_EABI_VER5
)
6140 || (iver
== EF_ARM_EABI_VER5
&& over
== EF_ARM_EABI_VER4
))
6143 return (iver
== over
);
6146 /* Merge backend specific data from an object file to the output
6147 object file when linking. */
6150 elf32_arm_merge_private_bfd_data (bfd
* ibfd
, bfd
* obfd
)
6154 bfd_boolean flags_compatible
= TRUE
;
6157 /* Check if we have the same endianess. */
6158 if (! _bfd_generic_verify_endian_match (ibfd
, obfd
))
6161 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
6162 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
6165 if (!elf32_arm_merge_eabi_attributes (ibfd
, obfd
))
6168 /* The input BFD must have had its flags initialised. */
6169 /* The following seems bogus to me -- The flags are initialized in
6170 the assembler but I don't think an elf_flags_init field is
6171 written into the object. */
6172 /* BFD_ASSERT (elf_flags_init (ibfd)); */
6174 in_flags
= elf_elfheader (ibfd
)->e_flags
;
6175 out_flags
= elf_elfheader (obfd
)->e_flags
;
6177 if (!elf_flags_init (obfd
))
6179 /* If the input is the default architecture and had the default
6180 flags then do not bother setting the flags for the output
6181 architecture, instead allow future merges to do this. If no
6182 future merges ever set these flags then they will retain their
6183 uninitialised values, which surprise surprise, correspond
6184 to the default values. */
6185 if (bfd_get_arch_info (ibfd
)->the_default
6186 && elf_elfheader (ibfd
)->e_flags
== 0)
6189 elf_flags_init (obfd
) = TRUE
;
6190 elf_elfheader (obfd
)->e_flags
= in_flags
;
6192 if (bfd_get_arch (obfd
) == bfd_get_arch (ibfd
)
6193 && bfd_get_arch_info (obfd
)->the_default
)
6194 return bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
), bfd_get_mach (ibfd
));
6199 /* Determine what should happen if the input ARM architecture
6200 does not match the output ARM architecture. */
6201 if (! bfd_arm_merge_machines (ibfd
, obfd
))
6204 /* Identical flags must be compatible. */
6205 if (in_flags
== out_flags
)
6208 /* Check to see if the input BFD actually contains any sections. If
6209 not, its flags may not have been initialised either, but it
6210 cannot actually cause any incompatiblity. Do not short-circuit
6211 dynamic objects; their section list may be emptied by
6212 elf_link_add_object_symbols.
6214 Also check to see if there are no code sections in the input.
6215 In this case there is no need to check for code specific flags.
6216 XXX - do we need to worry about floating-point format compatability
6217 in data sections ? */
6218 if (!(ibfd
->flags
& DYNAMIC
))
6220 bfd_boolean null_input_bfd
= TRUE
;
6221 bfd_boolean only_data_sections
= TRUE
;
6223 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
6225 /* Ignore synthetic glue sections. */
6226 if (strcmp (sec
->name
, ".glue_7")
6227 && strcmp (sec
->name
, ".glue_7t"))
6229 if ((bfd_get_section_flags (ibfd
, sec
)
6230 & (SEC_LOAD
| SEC_CODE
| SEC_HAS_CONTENTS
))
6231 == (SEC_LOAD
| SEC_CODE
| SEC_HAS_CONTENTS
))
6232 only_data_sections
= FALSE
;
6234 null_input_bfd
= FALSE
;
6239 if (null_input_bfd
|| only_data_sections
)
6243 /* Complain about various flag mismatches. */
6244 if (!elf32_arm_versions_compatible (EF_ARM_EABI_VERSION (in_flags
),
6245 EF_ARM_EABI_VERSION (out_flags
)))
6248 (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
6250 (in_flags
& EF_ARM_EABIMASK
) >> 24,
6251 (out_flags
& EF_ARM_EABIMASK
) >> 24);
6255 /* Not sure what needs to be checked for EABI versions >= 1. */
6256 /* VxWorks libraries do not use these flags. */
6257 if (get_elf_backend_data (obfd
) != &elf32_arm_vxworks_bed
6258 && get_elf_backend_data (ibfd
) != &elf32_arm_vxworks_bed
6259 && EF_ARM_EABI_VERSION (in_flags
) == EF_ARM_EABI_UNKNOWN
)
6261 if ((in_flags
& EF_ARM_APCS_26
) != (out_flags
& EF_ARM_APCS_26
))
6264 (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
6266 in_flags
& EF_ARM_APCS_26
? 26 : 32,
6267 out_flags
& EF_ARM_APCS_26
? 26 : 32);
6268 flags_compatible
= FALSE
;
6271 if ((in_flags
& EF_ARM_APCS_FLOAT
) != (out_flags
& EF_ARM_APCS_FLOAT
))
6273 if (in_flags
& EF_ARM_APCS_FLOAT
)
6275 (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"),
6279 (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"),
6282 flags_compatible
= FALSE
;
6285 if ((in_flags
& EF_ARM_VFP_FLOAT
) != (out_flags
& EF_ARM_VFP_FLOAT
))
6287 if (in_flags
& EF_ARM_VFP_FLOAT
)
6289 (_("ERROR: %B uses VFP instructions, whereas %B does not"),
6293 (_("ERROR: %B uses FPA instructions, whereas %B does not"),
6296 flags_compatible
= FALSE
;
6299 if ((in_flags
& EF_ARM_MAVERICK_FLOAT
) != (out_flags
& EF_ARM_MAVERICK_FLOAT
))
6301 if (in_flags
& EF_ARM_MAVERICK_FLOAT
)
6303 (_("ERROR: %B uses Maverick instructions, whereas %B does not"),
6307 (_("ERROR: %B does not use Maverick instructions, whereas %B does"),
6310 flags_compatible
= FALSE
;
6313 #ifdef EF_ARM_SOFT_FLOAT
6314 if ((in_flags
& EF_ARM_SOFT_FLOAT
) != (out_flags
& EF_ARM_SOFT_FLOAT
))
6316 /* We can allow interworking between code that is VFP format
6317 layout, and uses either soft float or integer regs for
6318 passing floating point arguments and results. We already
6319 know that the APCS_FLOAT flags match; similarly for VFP
6321 if ((in_flags
& EF_ARM_APCS_FLOAT
) != 0
6322 || (in_flags
& EF_ARM_VFP_FLOAT
) == 0)
6324 if (in_flags
& EF_ARM_SOFT_FLOAT
)
6326 (_("ERROR: %B uses software FP, whereas %B uses hardware FP"),
6330 (_("ERROR: %B uses hardware FP, whereas %B uses software FP"),
6333 flags_compatible
= FALSE
;
6338 /* Interworking mismatch is only a warning. */
6339 if ((in_flags
& EF_ARM_INTERWORK
) != (out_flags
& EF_ARM_INTERWORK
))
6341 if (in_flags
& EF_ARM_INTERWORK
)
6344 (_("Warning: %B supports interworking, whereas %B does not"),
6350 (_("Warning: %B does not support interworking, whereas %B does"),
6356 return flags_compatible
;
6359 /* Display the flags field. */
6362 elf32_arm_print_private_bfd_data (bfd
*abfd
, void * ptr
)
6364 FILE * file
= (FILE *) ptr
;
6365 unsigned long flags
;
6367 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
6369 /* Print normal ELF private data. */
6370 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
6372 flags
= elf_elfheader (abfd
)->e_flags
;
6373 /* Ignore init flag - it may not be set, despite the flags field
6374 containing valid data. */
6376 /* xgettext:c-format */
6377 fprintf (file
, _("private flags = %lx:"), elf_elfheader (abfd
)->e_flags
);
6379 switch (EF_ARM_EABI_VERSION (flags
))
6381 case EF_ARM_EABI_UNKNOWN
:
6382 /* The following flag bits are GNU extensions and not part of the
6383 official ARM ELF extended ABI. Hence they are only decoded if
6384 the EABI version is not set. */
6385 if (flags
& EF_ARM_INTERWORK
)
6386 fprintf (file
, _(" [interworking enabled]"));
6388 if (flags
& EF_ARM_APCS_26
)
6389 fprintf (file
, " [APCS-26]");
6391 fprintf (file
, " [APCS-32]");
6393 if (flags
& EF_ARM_VFP_FLOAT
)
6394 fprintf (file
, _(" [VFP float format]"));
6395 else if (flags
& EF_ARM_MAVERICK_FLOAT
)
6396 fprintf (file
, _(" [Maverick float format]"));
6398 fprintf (file
, _(" [FPA float format]"));
6400 if (flags
& EF_ARM_APCS_FLOAT
)
6401 fprintf (file
, _(" [floats passed in float registers]"));
6403 if (flags
& EF_ARM_PIC
)
6404 fprintf (file
, _(" [position independent]"));
6406 if (flags
& EF_ARM_NEW_ABI
)
6407 fprintf (file
, _(" [new ABI]"));
6409 if (flags
& EF_ARM_OLD_ABI
)
6410 fprintf (file
, _(" [old ABI]"));
6412 if (flags
& EF_ARM_SOFT_FLOAT
)
6413 fprintf (file
, _(" [software FP]"));
6415 flags
&= ~(EF_ARM_INTERWORK
| EF_ARM_APCS_26
| EF_ARM_APCS_FLOAT
6416 | EF_ARM_PIC
| EF_ARM_NEW_ABI
| EF_ARM_OLD_ABI
6417 | EF_ARM_SOFT_FLOAT
| EF_ARM_VFP_FLOAT
6418 | EF_ARM_MAVERICK_FLOAT
);
6421 case EF_ARM_EABI_VER1
:
6422 fprintf (file
, _(" [Version1 EABI]"));
6424 if (flags
& EF_ARM_SYMSARESORTED
)
6425 fprintf (file
, _(" [sorted symbol table]"));
6427 fprintf (file
, _(" [unsorted symbol table]"));
6429 flags
&= ~ EF_ARM_SYMSARESORTED
;
6432 case EF_ARM_EABI_VER2
:
6433 fprintf (file
, _(" [Version2 EABI]"));
6435 if (flags
& EF_ARM_SYMSARESORTED
)
6436 fprintf (file
, _(" [sorted symbol table]"));
6438 fprintf (file
, _(" [unsorted symbol table]"));
6440 if (flags
& EF_ARM_DYNSYMSUSESEGIDX
)
6441 fprintf (file
, _(" [dynamic symbols use segment index]"));
6443 if (flags
& EF_ARM_MAPSYMSFIRST
)
6444 fprintf (file
, _(" [mapping symbols precede others]"));
6446 flags
&= ~(EF_ARM_SYMSARESORTED
| EF_ARM_DYNSYMSUSESEGIDX
6447 | EF_ARM_MAPSYMSFIRST
);
6450 case EF_ARM_EABI_VER3
:
6451 fprintf (file
, _(" [Version3 EABI]"));
6454 case EF_ARM_EABI_VER4
:
6455 fprintf (file
, _(" [Version4 EABI]"));
6458 case EF_ARM_EABI_VER5
:
6459 fprintf (file
, _(" [Version5 EABI]"));
6461 if (flags
& EF_ARM_BE8
)
6462 fprintf (file
, _(" [BE8]"));
6464 if (flags
& EF_ARM_LE8
)
6465 fprintf (file
, _(" [LE8]"));
6467 flags
&= ~(EF_ARM_LE8
| EF_ARM_BE8
);
6471 fprintf (file
, _(" <EABI version unrecognised>"));
6475 flags
&= ~ EF_ARM_EABIMASK
;
6477 if (flags
& EF_ARM_RELEXEC
)
6478 fprintf (file
, _(" [relocatable executable]"));
6480 if (flags
& EF_ARM_HASENTRY
)
6481 fprintf (file
, _(" [has entry point]"));
6483 flags
&= ~ (EF_ARM_RELEXEC
| EF_ARM_HASENTRY
);
6486 fprintf (file
, _("<Unrecognised flag bits set>"));
6494 elf32_arm_get_symbol_type (Elf_Internal_Sym
* elf_sym
, int type
)
6496 switch (ELF_ST_TYPE (elf_sym
->st_info
))
6499 return ELF_ST_TYPE (elf_sym
->st_info
);
6502 /* If the symbol is not an object, return the STT_ARM_16BIT flag.
6503 This allows us to distinguish between data used by Thumb instructions
6504 and non-data (which is probably code) inside Thumb regions of an
6506 if (type
!= STT_OBJECT
&& type
!= STT_TLS
)
6507 return ELF_ST_TYPE (elf_sym
->st_info
);
6518 elf32_arm_gc_mark_hook (asection
* sec
,
6519 struct bfd_link_info
* info ATTRIBUTE_UNUSED
,
6520 Elf_Internal_Rela
* rel
,
6521 struct elf_link_hash_entry
* h
,
6522 Elf_Internal_Sym
* sym
)
6526 switch (ELF32_R_TYPE (rel
->r_info
))
6528 case R_ARM_GNU_VTINHERIT
:
6529 case R_ARM_GNU_VTENTRY
:
6533 switch (h
->root
.type
)
6535 case bfd_link_hash_defined
:
6536 case bfd_link_hash_defweak
:
6537 return h
->root
.u
.def
.section
;
6539 case bfd_link_hash_common
:
6540 return h
->root
.u
.c
.p
->section
;
6548 return bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
6553 /* Update the got entry reference counts for the section being removed. */
6556 elf32_arm_gc_sweep_hook (bfd
* abfd
,
6557 struct bfd_link_info
* info
,
6559 const Elf_Internal_Rela
* relocs
)
6561 Elf_Internal_Shdr
*symtab_hdr
;
6562 struct elf_link_hash_entry
**sym_hashes
;
6563 bfd_signed_vma
*local_got_refcounts
;
6564 const Elf_Internal_Rela
*rel
, *relend
;
6565 struct elf32_arm_link_hash_table
* globals
;
6567 globals
= elf32_arm_hash_table (info
);
6569 elf_section_data (sec
)->local_dynrel
= NULL
;
6571 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
6572 sym_hashes
= elf_sym_hashes (abfd
);
6573 local_got_refcounts
= elf_local_got_refcounts (abfd
);
6575 relend
= relocs
+ sec
->reloc_count
;
6576 for (rel
= relocs
; rel
< relend
; rel
++)
6578 unsigned long r_symndx
;
6579 struct elf_link_hash_entry
*h
= NULL
;
6582 r_symndx
= ELF32_R_SYM (rel
->r_info
);
6583 if (r_symndx
>= symtab_hdr
->sh_info
)
6585 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
6586 while (h
->root
.type
== bfd_link_hash_indirect
6587 || h
->root
.type
== bfd_link_hash_warning
)
6588 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
6591 r_type
= ELF32_R_TYPE (rel
->r_info
);
6592 r_type
= arm_real_reloc_type (globals
, r_type
);
6596 case R_ARM_GOT_PREL
:
6597 case R_ARM_TLS_GD32
:
6598 case R_ARM_TLS_IE32
:
6601 if (h
->got
.refcount
> 0)
6602 h
->got
.refcount
-= 1;
6604 else if (local_got_refcounts
!= NULL
)
6606 if (local_got_refcounts
[r_symndx
] > 0)
6607 local_got_refcounts
[r_symndx
] -= 1;
6611 case R_ARM_TLS_LDM32
:
6612 elf32_arm_hash_table (info
)->tls_ldm_got
.refcount
-= 1;
6622 case R_ARM_THM_CALL
:
6623 case R_ARM_MOVW_ABS_NC
:
6624 case R_ARM_MOVT_ABS
:
6625 case R_ARM_MOVW_PREL_NC
:
6626 case R_ARM_MOVT_PREL
:
6627 case R_ARM_THM_MOVW_ABS_NC
:
6628 case R_ARM_THM_MOVT_ABS
:
6629 case R_ARM_THM_MOVW_PREL_NC
:
6630 case R_ARM_THM_MOVT_PREL
:
6631 /* Should the interworking branches be here also? */
6635 struct elf32_arm_link_hash_entry
*eh
;
6636 struct elf32_arm_relocs_copied
**pp
;
6637 struct elf32_arm_relocs_copied
*p
;
6639 eh
= (struct elf32_arm_link_hash_entry
*) h
;
6641 if (h
->plt
.refcount
> 0)
6643 h
->plt
.refcount
-= 1;
6644 if (ELF32_R_TYPE (rel
->r_info
) == R_ARM_THM_CALL
)
6645 eh
->plt_thumb_refcount
--;
6648 if (r_type
== R_ARM_ABS32
6649 || r_type
== R_ARM_REL32
)
6651 for (pp
= &eh
->relocs_copied
; (p
= *pp
) != NULL
;
6653 if (p
->section
== sec
)
6656 if (ELF32_R_TYPE (rel
->r_info
) == R_ARM_REL32
)
6674 /* Look through the relocs for a section during the first phase. */
6677 elf32_arm_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
,
6678 asection
*sec
, const Elf_Internal_Rela
*relocs
)
6680 Elf_Internal_Shdr
*symtab_hdr
;
6681 struct elf_link_hash_entry
**sym_hashes
;
6682 struct elf_link_hash_entry
**sym_hashes_end
;
6683 const Elf_Internal_Rela
*rel
;
6684 const Elf_Internal_Rela
*rel_end
;
6687 bfd_vma
*local_got_offsets
;
6688 struct elf32_arm_link_hash_table
*htab
;
6690 if (info
->relocatable
)
6693 htab
= elf32_arm_hash_table (info
);
6696 /* Create dynamic sections for relocatable executables so that we can
6697 copy relocations. */
6698 if (htab
->root
.is_relocatable_executable
6699 && ! htab
->root
.dynamic_sections_created
)
6701 if (! _bfd_elf_link_create_dynamic_sections (abfd
, info
))
6705 dynobj
= elf_hash_table (info
)->dynobj
;
6706 local_got_offsets
= elf_local_got_offsets (abfd
);
6708 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
6709 sym_hashes
= elf_sym_hashes (abfd
);
6710 sym_hashes_end
= sym_hashes
6711 + symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
);
6713 if (!elf_bad_symtab (abfd
))
6714 sym_hashes_end
-= symtab_hdr
->sh_info
;
6716 rel_end
= relocs
+ sec
->reloc_count
;
6717 for (rel
= relocs
; rel
< rel_end
; rel
++)
6719 struct elf_link_hash_entry
*h
;
6720 struct elf32_arm_link_hash_entry
*eh
;
6721 unsigned long r_symndx
;
6724 r_symndx
= ELF32_R_SYM (rel
->r_info
);
6725 r_type
= ELF32_R_TYPE (rel
->r_info
);
6726 r_type
= arm_real_reloc_type (htab
, r_type
);
6728 if (r_symndx
>= NUM_SHDR_ENTRIES (symtab_hdr
))
6730 (*_bfd_error_handler
) (_("%B: bad symbol index: %d"), abfd
,
6735 if (r_symndx
< symtab_hdr
->sh_info
)
6739 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
6740 while (h
->root
.type
== bfd_link_hash_indirect
6741 || h
->root
.type
== bfd_link_hash_warning
)
6742 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
6745 eh
= (struct elf32_arm_link_hash_entry
*) h
;
6750 case R_ARM_GOT_PREL
:
6751 case R_ARM_TLS_GD32
:
6752 case R_ARM_TLS_IE32
:
6753 /* This symbol requires a global offset table entry. */
6755 int tls_type
, old_tls_type
;
6759 case R_ARM_TLS_GD32
: tls_type
= GOT_TLS_GD
; break;
6760 case R_ARM_TLS_IE32
: tls_type
= GOT_TLS_IE
; break;
6761 default: tls_type
= GOT_NORMAL
; break;
6767 old_tls_type
= elf32_arm_hash_entry (h
)->tls_type
;
6771 bfd_signed_vma
*local_got_refcounts
;
6773 /* This is a global offset table entry for a local symbol. */
6774 local_got_refcounts
= elf_local_got_refcounts (abfd
);
6775 if (local_got_refcounts
== NULL
)
6779 size
= symtab_hdr
->sh_info
;
6780 size
*= (sizeof (bfd_signed_vma
) + sizeof(char));
6781 local_got_refcounts
= bfd_zalloc (abfd
, size
);
6782 if (local_got_refcounts
== NULL
)
6784 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
6785 elf32_arm_local_got_tls_type (abfd
)
6786 = (char *) (local_got_refcounts
+ symtab_hdr
->sh_info
);
6788 local_got_refcounts
[r_symndx
] += 1;
6789 old_tls_type
= elf32_arm_local_got_tls_type (abfd
) [r_symndx
];
6792 /* We will already have issued an error message if there is a
6793 TLS / non-TLS mismatch, based on the symbol type. We don't
6794 support any linker relaxations. So just combine any TLS
6796 if (old_tls_type
!= GOT_UNKNOWN
&& old_tls_type
!= GOT_NORMAL
6797 && tls_type
!= GOT_NORMAL
)
6798 tls_type
|= old_tls_type
;
6800 if (old_tls_type
!= tls_type
)
6803 elf32_arm_hash_entry (h
)->tls_type
= tls_type
;
6805 elf32_arm_local_got_tls_type (abfd
) [r_symndx
] = tls_type
;
6810 case R_ARM_TLS_LDM32
:
6811 if (r_type
== R_ARM_TLS_LDM32
)
6812 htab
->tls_ldm_got
.refcount
++;
6815 case R_ARM_GOTOFF32
:
6817 if (htab
->sgot
== NULL
)
6819 if (htab
->root
.dynobj
== NULL
)
6820 htab
->root
.dynobj
= abfd
;
6821 if (!create_got_section (htab
->root
.dynobj
, info
))
6827 /* VxWorks uses dynamic R_ARM_ABS12 relocations for
6828 ldr __GOTT_INDEX__ offsets. */
6829 if (!htab
->vxworks_p
)
6840 case R_ARM_THM_CALL
:
6841 case R_ARM_MOVW_ABS_NC
:
6842 case R_ARM_MOVT_ABS
:
6843 case R_ARM_MOVW_PREL_NC
:
6844 case R_ARM_MOVT_PREL
:
6845 case R_ARM_THM_MOVW_ABS_NC
:
6846 case R_ARM_THM_MOVT_ABS
:
6847 case R_ARM_THM_MOVW_PREL_NC
:
6848 case R_ARM_THM_MOVT_PREL
:
6849 /* Should the interworking branches be listed here? */
6852 /* If this reloc is in a read-only section, we might
6853 need a copy reloc. We can't check reliably at this
6854 stage whether the section is read-only, as input
6855 sections have not yet been mapped to output sections.
6856 Tentatively set the flag for now, and correct in
6857 adjust_dynamic_symbol. */
6861 /* We may need a .plt entry if the function this reloc
6862 refers to is in a different object. We can't tell for
6863 sure yet, because something later might force the
6865 if (r_type
!= R_ARM_ABS32
&& r_type
!= R_ARM_REL32
)
6868 /* If we create a PLT entry, this relocation will reference
6869 it, even if it's an ABS32 relocation. */
6870 h
->plt
.refcount
+= 1;
6872 if (r_type
== R_ARM_THM_CALL
)
6873 eh
->plt_thumb_refcount
+= 1;
6876 /* If we are creating a shared library or relocatable executable,
6877 and this is a reloc against a global symbol, or a non PC
6878 relative reloc against a local symbol, then we need to copy
6879 the reloc into the shared library. However, if we are linking
6880 with -Bsymbolic, we do not need to copy a reloc against a
6881 global symbol which is defined in an object we are
6882 including in the link (i.e., DEF_REGULAR is set). At
6883 this point we have not seen all the input files, so it is
6884 possible that DEF_REGULAR is not set now but will be set
6885 later (it is never cleared). We account for that
6886 possibility below by storing information in the
6887 relocs_copied field of the hash table entry. */
6888 if ((info
->shared
|| htab
->root
.is_relocatable_executable
)
6889 && (sec
->flags
& SEC_ALLOC
) != 0
6890 && (r_type
== R_ARM_ABS32
6891 || (h
!= NULL
&& ! h
->needs_plt
6892 && (! info
->symbolic
|| ! h
->def_regular
))))
6894 struct elf32_arm_relocs_copied
*p
, **head
;
6896 /* When creating a shared object, we must copy these
6897 reloc types into the output file. We create a reloc
6898 section in dynobj and make room for this reloc. */
6903 name
= (bfd_elf_string_from_elf_section
6905 elf_elfheader (abfd
)->e_shstrndx
,
6906 elf_section_data (sec
)->rel_hdr
.sh_name
));
6910 BFD_ASSERT (reloc_section_p (htab
, name
, sec
));
6912 sreloc
= bfd_get_section_by_name (dynobj
, name
);
6917 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
6918 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
6919 if ((sec
->flags
& SEC_ALLOC
) != 0
6920 /* BPABI objects never have dynamic
6921 relocations mapped. */
6922 && !htab
->symbian_p
)
6923 flags
|= SEC_ALLOC
| SEC_LOAD
;
6924 sreloc
= bfd_make_section_with_flags (dynobj
,
6928 || ! bfd_set_section_alignment (dynobj
, sreloc
, 2))
6932 elf_section_data (sec
)->sreloc
= sreloc
;
6935 /* If this is a global symbol, we count the number of
6936 relocations we need for this symbol. */
6939 head
= &((struct elf32_arm_link_hash_entry
*) h
)->relocs_copied
;
6943 /* Track dynamic relocs needed for local syms too.
6944 We really need local syms available to do this
6950 s
= bfd_section_from_r_symndx (abfd
, &htab
->sym_sec
,
6955 vpp
= &elf_section_data (s
)->local_dynrel
;
6956 head
= (struct elf32_arm_relocs_copied
**) vpp
;
6960 if (p
== NULL
|| p
->section
!= sec
)
6962 bfd_size_type amt
= sizeof *p
;
6964 p
= bfd_alloc (htab
->root
.dynobj
, amt
);
6974 if (r_type
== R_ARM_REL32
)
6980 /* This relocation describes the C++ object vtable hierarchy.
6981 Reconstruct it for later use during GC. */
6982 case R_ARM_GNU_VTINHERIT
:
6983 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
6987 /* This relocation describes which C++ vtable entries are actually
6988 used. Record for later use during GC. */
6989 case R_ARM_GNU_VTENTRY
:
6990 if (!bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_offset
))
6999 /* Treat mapping symbols as special target symbols. */
7002 elf32_arm_is_target_special_symbol (bfd
* abfd ATTRIBUTE_UNUSED
, asymbol
* sym
)
7004 return bfd_is_arm_special_symbol_name (sym
->name
,
7005 BFD_ARM_SPECIAL_SYM_TYPE_ANY
);
7008 /* This is a copy of elf_find_function() from elf.c except that
7009 ARM mapping symbols are ignored when looking for function names
7010 and STT_ARM_TFUNC is considered to a function type. */
7013 arm_elf_find_function (bfd
* abfd ATTRIBUTE_UNUSED
,
7017 const char ** filename_ptr
,
7018 const char ** functionname_ptr
)
7020 const char * filename
= NULL
;
7021 asymbol
* func
= NULL
;
7022 bfd_vma low_func
= 0;
7025 for (p
= symbols
; *p
!= NULL
; p
++)
7029 q
= (elf_symbol_type
*) *p
;
7031 switch (ELF_ST_TYPE (q
->internal_elf_sym
.st_info
))
7036 filename
= bfd_asymbol_name (&q
->symbol
);
7041 /* Skip mapping symbols. */
7042 if ((q
->symbol
.flags
& BSF_LOCAL
)
7043 && bfd_is_arm_special_symbol_name (q
->symbol
.name
,
7044 BFD_ARM_SPECIAL_SYM_TYPE_ANY
))
7047 if (bfd_get_section (&q
->symbol
) == section
7048 && q
->symbol
.value
>= low_func
7049 && q
->symbol
.value
<= offset
)
7051 func
= (asymbol
*) q
;
7052 low_func
= q
->symbol
.value
;
7062 *filename_ptr
= filename
;
7063 if (functionname_ptr
)
7064 *functionname_ptr
= bfd_asymbol_name (func
);
7070 /* Find the nearest line to a particular section and offset, for error
7071 reporting. This code is a duplicate of the code in elf.c, except
7072 that it uses arm_elf_find_function. */
7075 elf32_arm_find_nearest_line (bfd
* abfd
,
7079 const char ** filename_ptr
,
7080 const char ** functionname_ptr
,
7081 unsigned int * line_ptr
)
7083 bfd_boolean found
= FALSE
;
7085 /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it. */
7087 if (_bfd_dwarf2_find_nearest_line (abfd
, section
, symbols
, offset
,
7088 filename_ptr
, functionname_ptr
,
7090 & elf_tdata (abfd
)->dwarf2_find_line_info
))
7092 if (!*functionname_ptr
)
7093 arm_elf_find_function (abfd
, section
, symbols
, offset
,
7094 *filename_ptr
? NULL
: filename_ptr
,
7100 if (! _bfd_stab_section_find_nearest_line (abfd
, symbols
, section
, offset
,
7101 & found
, filename_ptr
,
7102 functionname_ptr
, line_ptr
,
7103 & elf_tdata (abfd
)->line_info
))
7106 if (found
&& (*functionname_ptr
|| *line_ptr
))
7109 if (symbols
== NULL
)
7112 if (! arm_elf_find_function (abfd
, section
, symbols
, offset
,
7113 filename_ptr
, functionname_ptr
))
7121 elf32_arm_find_inliner_info (bfd
* abfd
,
7122 const char ** filename_ptr
,
7123 const char ** functionname_ptr
,
7124 unsigned int * line_ptr
)
7127 found
= _bfd_dwarf2_find_inliner_info (abfd
, filename_ptr
,
7128 functionname_ptr
, line_ptr
,
7129 & elf_tdata (abfd
)->dwarf2_find_line_info
);
7133 /* Adjust a symbol defined by a dynamic object and referenced by a
7134 regular object. The current definition is in some section of the
7135 dynamic object, but we're not including those sections. We have to
7136 change the definition to something the rest of the link can
7140 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info
* info
,
7141 struct elf_link_hash_entry
* h
)
7145 unsigned int power_of_two
;
7146 struct elf32_arm_link_hash_entry
* eh
;
7147 struct elf32_arm_link_hash_table
*globals
;
7149 globals
= elf32_arm_hash_table (info
);
7150 dynobj
= elf_hash_table (info
)->dynobj
;
7152 /* Make sure we know what is going on here. */
7153 BFD_ASSERT (dynobj
!= NULL
7155 || h
->u
.weakdef
!= NULL
7158 && !h
->def_regular
)));
7160 eh
= (struct elf32_arm_link_hash_entry
*) h
;
7162 /* If this is a function, put it in the procedure linkage table. We
7163 will fill in the contents of the procedure linkage table later,
7164 when we know the address of the .got section. */
7165 if (h
->type
== STT_FUNC
|| h
->type
== STT_ARM_TFUNC
7168 if (h
->plt
.refcount
<= 0
7169 || SYMBOL_CALLS_LOCAL (info
, h
)
7170 || (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
7171 && h
->root
.type
== bfd_link_hash_undefweak
))
7173 /* This case can occur if we saw a PLT32 reloc in an input
7174 file, but the symbol was never referred to by a dynamic
7175 object, or if all references were garbage collected. In
7176 such a case, we don't actually need to build a procedure
7177 linkage table, and we can just do a PC24 reloc instead. */
7178 h
->plt
.offset
= (bfd_vma
) -1;
7179 eh
->plt_thumb_refcount
= 0;
7187 /* It's possible that we incorrectly decided a .plt reloc was
7188 needed for an R_ARM_PC24 or similar reloc to a non-function sym
7189 in check_relocs. We can't decide accurately between function
7190 and non-function syms in check-relocs; Objects loaded later in
7191 the link may change h->type. So fix it now. */
7192 h
->plt
.offset
= (bfd_vma
) -1;
7193 eh
->plt_thumb_refcount
= 0;
7196 /* If this is a weak symbol, and there is a real definition, the
7197 processor independent code will have arranged for us to see the
7198 real definition first, and we can just use the same value. */
7199 if (h
->u
.weakdef
!= NULL
)
7201 BFD_ASSERT (h
->u
.weakdef
->root
.type
== bfd_link_hash_defined
7202 || h
->u
.weakdef
->root
.type
== bfd_link_hash_defweak
);
7203 h
->root
.u
.def
.section
= h
->u
.weakdef
->root
.u
.def
.section
;
7204 h
->root
.u
.def
.value
= h
->u
.weakdef
->root
.u
.def
.value
;
7208 /* If there are no non-GOT references, we do not need a copy
7210 if (!h
->non_got_ref
)
7213 /* This is a reference to a symbol defined by a dynamic object which
7214 is not a function. */
7216 /* If we are creating a shared library, we must presume that the
7217 only references to the symbol are via the global offset table.
7218 For such cases we need not do anything here; the relocations will
7219 be handled correctly by relocate_section. Relocatable executables
7220 can reference data in shared objects directly, so we don't need to
7221 do anything here. */
7222 if (info
->shared
|| globals
->root
.is_relocatable_executable
)
7227 (*_bfd_error_handler
) (_("dynamic variable `%s' is zero size"),
7228 h
->root
.root
.string
);
7232 /* We must allocate the symbol in our .dynbss section, which will
7233 become part of the .bss section of the executable. There will be
7234 an entry for this symbol in the .dynsym section. The dynamic
7235 object will contain position independent code, so all references
7236 from the dynamic object to this symbol will go through the global
7237 offset table. The dynamic linker will use the .dynsym entry to
7238 determine the address it must put in the global offset table, so
7239 both the dynamic object and the regular object will refer to the
7240 same memory location for the variable. */
7241 s
= bfd_get_section_by_name (dynobj
, ".dynbss");
7242 BFD_ASSERT (s
!= NULL
);
7244 /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
7245 copy the initial value out of the dynamic object and into the
7246 runtime process image. We need to remember the offset into the
7247 .rel(a).bss section we are going to use. */
7248 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
7252 srel
= bfd_get_section_by_name (dynobj
, RELOC_SECTION (globals
, ".bss"));
7253 BFD_ASSERT (srel
!= NULL
);
7254 srel
->size
+= RELOC_SIZE (globals
);
7258 /* We need to figure out the alignment required for this symbol. I
7259 have no idea how ELF linkers handle this. */
7260 power_of_two
= bfd_log2 (h
->size
);
7261 if (power_of_two
> 3)
7264 /* Apply the required alignment. */
7265 s
->size
= BFD_ALIGN (s
->size
, (bfd_size_type
) (1 << power_of_two
));
7266 if (power_of_two
> bfd_get_section_alignment (dynobj
, s
))
7268 if (! bfd_set_section_alignment (dynobj
, s
, power_of_two
))
7272 /* Define the symbol as being at this point in the section. */
7273 h
->root
.u
.def
.section
= s
;
7274 h
->root
.u
.def
.value
= s
->size
;
7276 /* Increment the section size to make room for the symbol. */
7282 /* Allocate space in .plt, .got and associated reloc sections for
7286 allocate_dynrelocs (struct elf_link_hash_entry
*h
, void * inf
)
7288 struct bfd_link_info
*info
;
7289 struct elf32_arm_link_hash_table
*htab
;
7290 struct elf32_arm_link_hash_entry
*eh
;
7291 struct elf32_arm_relocs_copied
*p
;
7293 eh
= (struct elf32_arm_link_hash_entry
*) h
;
7295 if (h
->root
.type
== bfd_link_hash_indirect
)
7298 if (h
->root
.type
== bfd_link_hash_warning
)
7299 /* When warning symbols are created, they **replace** the "real"
7300 entry in the hash table, thus we never get to see the real
7301 symbol in a hash traversal. So look at it now. */
7302 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
7304 info
= (struct bfd_link_info
*) inf
;
7305 htab
= elf32_arm_hash_table (info
);
7307 if (htab
->root
.dynamic_sections_created
7308 && h
->plt
.refcount
> 0)
7310 /* Make sure this symbol is output as a dynamic symbol.
7311 Undefined weak syms won't yet be marked as dynamic. */
7312 if (h
->dynindx
== -1
7313 && !h
->forced_local
)
7315 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
7320 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h
))
7322 asection
*s
= htab
->splt
;
7324 /* If this is the first .plt entry, make room for the special
7327 s
->size
+= htab
->plt_header_size
;
7329 h
->plt
.offset
= s
->size
;
7331 /* If we will insert a Thumb trampoline before this PLT, leave room
7333 if (!htab
->use_blx
&& eh
->plt_thumb_refcount
> 0)
7335 h
->plt
.offset
+= PLT_THUMB_STUB_SIZE
;
7336 s
->size
+= PLT_THUMB_STUB_SIZE
;
7339 /* If this symbol is not defined in a regular file, and we are
7340 not generating a shared library, then set the symbol to this
7341 location in the .plt. This is required to make function
7342 pointers compare as equal between the normal executable and
7343 the shared library. */
7347 h
->root
.u
.def
.section
= s
;
7348 h
->root
.u
.def
.value
= h
->plt
.offset
;
7350 /* Make sure the function is not marked as Thumb, in case
7351 it is the target of an ABS32 relocation, which will
7352 point to the PLT entry. */
7353 if (ELF_ST_TYPE (h
->type
) == STT_ARM_TFUNC
)
7354 h
->type
= ELF_ST_INFO (ELF_ST_BIND (h
->type
), STT_FUNC
);
7357 /* Make room for this entry. */
7358 s
->size
+= htab
->plt_entry_size
;
7360 if (!htab
->symbian_p
)
7362 /* We also need to make an entry in the .got.plt section, which
7363 will be placed in the .got section by the linker script. */
7364 eh
->plt_got_offset
= htab
->sgotplt
->size
;
7365 htab
->sgotplt
->size
+= 4;
7368 /* We also need to make an entry in the .rel(a).plt section. */
7369 htab
->srelplt
->size
+= RELOC_SIZE (htab
);
7371 /* VxWorks executables have a second set of relocations for
7372 each PLT entry. They go in a separate relocation section,
7373 which is processed by the kernel loader. */
7374 if (htab
->vxworks_p
&& !info
->shared
)
7376 /* There is a relocation for the initial PLT entry:
7377 an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_. */
7378 if (h
->plt
.offset
== htab
->plt_header_size
)
7379 htab
->srelplt2
->size
+= RELOC_SIZE (htab
);
7381 /* There are two extra relocations for each subsequent
7382 PLT entry: an R_ARM_32 relocation for the GOT entry,
7383 and an R_ARM_32 relocation for the PLT entry. */
7384 htab
->srelplt2
->size
+= RELOC_SIZE (htab
) * 2;
7389 h
->plt
.offset
= (bfd_vma
) -1;
7395 h
->plt
.offset
= (bfd_vma
) -1;
7399 if (h
->got
.refcount
> 0)
7403 int tls_type
= elf32_arm_hash_entry (h
)->tls_type
;
7406 /* Make sure this symbol is output as a dynamic symbol.
7407 Undefined weak syms won't yet be marked as dynamic. */
7408 if (h
->dynindx
== -1
7409 && !h
->forced_local
)
7411 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
7415 if (!htab
->symbian_p
)
7418 h
->got
.offset
= s
->size
;
7420 if (tls_type
== GOT_UNKNOWN
)
7423 if (tls_type
== GOT_NORMAL
)
7424 /* Non-TLS symbols need one GOT slot. */
7428 if (tls_type
& GOT_TLS_GD
)
7429 /* R_ARM_TLS_GD32 needs 2 consecutive GOT slots. */
7431 if (tls_type
& GOT_TLS_IE
)
7432 /* R_ARM_TLS_IE32 needs one GOT slot. */
7436 dyn
= htab
->root
.dynamic_sections_created
;
7439 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
7441 || !SYMBOL_REFERENCES_LOCAL (info
, h
)))
7444 if (tls_type
!= GOT_NORMAL
7445 && (info
->shared
|| indx
!= 0)
7446 && (ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
7447 || h
->root
.type
!= bfd_link_hash_undefweak
))
7449 if (tls_type
& GOT_TLS_IE
)
7450 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
7452 if (tls_type
& GOT_TLS_GD
)
7453 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
7455 if ((tls_type
& GOT_TLS_GD
) && indx
!= 0)
7456 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
7458 else if ((ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
7459 || h
->root
.type
!= bfd_link_hash_undefweak
)
7461 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, 0, h
)))
7462 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
7466 h
->got
.offset
= (bfd_vma
) -1;
7468 if (eh
->relocs_copied
== NULL
)
7471 /* In the shared -Bsymbolic case, discard space allocated for
7472 dynamic pc-relative relocs against symbols which turn out to be
7473 defined in regular objects. For the normal shared case, discard
7474 space for pc-relative relocs that have become local due to symbol
7475 visibility changes. */
7477 if (info
->shared
|| htab
->root
.is_relocatable_executable
)
7479 /* The only reloc that uses pc_count is R_ARM_REL32, which will
7480 appear on something like ".long foo - .". We want calls to
7481 protected symbols to resolve directly to the function rather
7482 than going via the plt. If people want function pointer
7483 comparisons to work as expected then they should avoid
7484 writing assembly like ".long foo - .". */
7485 if (SYMBOL_CALLS_LOCAL (info
, h
))
7487 struct elf32_arm_relocs_copied
**pp
;
7489 for (pp
= &eh
->relocs_copied
; (p
= *pp
) != NULL
; )
7491 p
->count
-= p
->pc_count
;
7500 /* Also discard relocs on undefined weak syms with non-default
7502 if (eh
->relocs_copied
!= NULL
7503 && h
->root
.type
== bfd_link_hash_undefweak
)
7505 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
)
7506 eh
->relocs_copied
= NULL
;
7508 /* Make sure undefined weak symbols are output as a dynamic
7510 else if (h
->dynindx
== -1
7511 && !h
->forced_local
)
7513 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
7518 else if (htab
->root
.is_relocatable_executable
&& h
->dynindx
== -1
7519 && h
->root
.type
== bfd_link_hash_new
)
7521 /* Output absolute symbols so that we can create relocations
7522 against them. For normal symbols we output a relocation
7523 against the section that contains them. */
7524 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
7531 /* For the non-shared case, discard space for relocs against
7532 symbols which turn out to need copy relocs or are not
7538 || (htab
->root
.dynamic_sections_created
7539 && (h
->root
.type
== bfd_link_hash_undefweak
7540 || h
->root
.type
== bfd_link_hash_undefined
))))
7542 /* Make sure this symbol is output as a dynamic symbol.
7543 Undefined weak syms won't yet be marked as dynamic. */
7544 if (h
->dynindx
== -1
7545 && !h
->forced_local
)
7547 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
7551 /* If that succeeded, we know we'll be keeping all the
7553 if (h
->dynindx
!= -1)
7557 eh
->relocs_copied
= NULL
;
7562 /* Finally, allocate space. */
7563 for (p
= eh
->relocs_copied
; p
!= NULL
; p
= p
->next
)
7565 asection
*sreloc
= elf_section_data (p
->section
)->sreloc
;
7566 sreloc
->size
+= p
->count
* RELOC_SIZE (htab
);
7572 /* Find any dynamic relocs that apply to read-only sections. */
7575 elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry
*h
, PTR inf
)
7577 struct elf32_arm_link_hash_entry
*eh
;
7578 struct elf32_arm_relocs_copied
*p
;
7580 if (h
->root
.type
== bfd_link_hash_warning
)
7581 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
7583 eh
= (struct elf32_arm_link_hash_entry
*) h
;
7584 for (p
= eh
->relocs_copied
; p
!= NULL
; p
= p
->next
)
7586 asection
*s
= p
->section
;
7588 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
7590 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
7592 info
->flags
|= DF_TEXTREL
;
7594 /* Not an error, just cut short the traversal. */
7601 /* Set the sizes of the dynamic sections. */
7604 elf32_arm_size_dynamic_sections (bfd
* output_bfd ATTRIBUTE_UNUSED
,
7605 struct bfd_link_info
* info
)
7612 struct elf32_arm_link_hash_table
*htab
;
7614 htab
= elf32_arm_hash_table (info
);
7615 dynobj
= elf_hash_table (info
)->dynobj
;
7616 BFD_ASSERT (dynobj
!= NULL
);
7617 check_use_blx (htab
);
7619 if (elf_hash_table (info
)->dynamic_sections_created
)
7621 /* Set the contents of the .interp section to the interpreter. */
7622 if (info
->executable
)
7624 s
= bfd_get_section_by_name (dynobj
, ".interp");
7625 BFD_ASSERT (s
!= NULL
);
7626 s
->size
= sizeof ELF_DYNAMIC_INTERPRETER
;
7627 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
7631 /* Set up .got offsets for local syms, and space for local dynamic
7633 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
7635 bfd_signed_vma
*local_got
;
7636 bfd_signed_vma
*end_local_got
;
7637 char *local_tls_type
;
7638 bfd_size_type locsymcount
;
7639 Elf_Internal_Shdr
*symtab_hdr
;
7642 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
7645 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
7647 struct elf32_arm_relocs_copied
*p
;
7649 for (p
= elf_section_data (s
)->local_dynrel
; p
!= NULL
; p
= p
->next
)
7651 if (!bfd_is_abs_section (p
->section
)
7652 && bfd_is_abs_section (p
->section
->output_section
))
7654 /* Input section has been discarded, either because
7655 it is a copy of a linkonce section or due to
7656 linker script /DISCARD/, so we'll be discarding
7659 else if (p
->count
!= 0)
7661 srel
= elf_section_data (p
->section
)->sreloc
;
7662 srel
->size
+= p
->count
* RELOC_SIZE (htab
);
7663 if ((p
->section
->output_section
->flags
& SEC_READONLY
) != 0)
7664 info
->flags
|= DF_TEXTREL
;
7669 local_got
= elf_local_got_refcounts (ibfd
);
7673 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
7674 locsymcount
= symtab_hdr
->sh_info
;
7675 end_local_got
= local_got
+ locsymcount
;
7676 local_tls_type
= elf32_arm_local_got_tls_type (ibfd
);
7678 srel
= htab
->srelgot
;
7679 for (; local_got
< end_local_got
; ++local_got
, ++local_tls_type
)
7683 *local_got
= s
->size
;
7684 if (*local_tls_type
& GOT_TLS_GD
)
7685 /* TLS_GD relocs need an 8-byte structure in the GOT. */
7687 if (*local_tls_type
& GOT_TLS_IE
)
7689 if (*local_tls_type
== GOT_NORMAL
)
7692 if (info
->shared
|| *local_tls_type
== GOT_TLS_GD
)
7693 srel
->size
+= RELOC_SIZE (htab
);
7696 *local_got
= (bfd_vma
) -1;
7700 if (htab
->tls_ldm_got
.refcount
> 0)
7702 /* Allocate two GOT entries and one dynamic relocation (if necessary)
7703 for R_ARM_TLS_LDM32 relocations. */
7704 htab
->tls_ldm_got
.offset
= htab
->sgot
->size
;
7705 htab
->sgot
->size
+= 8;
7707 htab
->srelgot
->size
+= RELOC_SIZE (htab
);
7710 htab
->tls_ldm_got
.offset
= -1;
7712 /* Allocate global sym .plt and .got entries, and space for global
7713 sym dynamic relocs. */
7714 elf_link_hash_traverse (& htab
->root
, allocate_dynrelocs
, info
);
7716 /* The check_relocs and adjust_dynamic_symbol entry points have
7717 determined the sizes of the various dynamic sections. Allocate
7721 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
7725 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
7728 /* It's OK to base decisions on the section name, because none
7729 of the dynobj section names depend upon the input files. */
7730 name
= bfd_get_section_name (dynobj
, s
);
7732 if (strcmp (name
, ".plt") == 0)
7734 /* Remember whether there is a PLT. */
7737 else if (strncmp (name
, ".rel", 4) == 0)
7741 /* Remember whether there are any reloc sections other
7742 than .rel(a).plt and .rela.plt.unloaded. */
7743 if (s
!= htab
->srelplt
&& s
!= htab
->srelplt2
)
7746 /* We use the reloc_count field as a counter if we need
7747 to copy relocs into the output file. */
7751 else if (strncmp (name
, ".got", 4) != 0
7752 && strcmp (name
, ".dynbss") != 0)
7754 /* It's not one of our sections, so don't allocate space. */
7760 /* If we don't need this section, strip it from the
7761 output file. This is mostly to handle .rel(a).bss and
7762 .rel(a).plt. We must create both sections in
7763 create_dynamic_sections, because they must be created
7764 before the linker maps input sections to output
7765 sections. The linker does that before
7766 adjust_dynamic_symbol is called, and it is that
7767 function which decides whether anything needs to go
7768 into these sections. */
7769 s
->flags
|= SEC_EXCLUDE
;
7773 if ((s
->flags
& SEC_HAS_CONTENTS
) == 0)
7776 /* Allocate memory for the section contents. */
7777 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->size
);
7778 if (s
->contents
== NULL
)
7782 if (elf_hash_table (info
)->dynamic_sections_created
)
7784 /* Add some entries to the .dynamic section. We fill in the
7785 values later, in elf32_arm_finish_dynamic_sections, but we
7786 must add the entries now so that we get the correct size for
7787 the .dynamic section. The DT_DEBUG entry is filled in by the
7788 dynamic linker and used by the debugger. */
7789 #define add_dynamic_entry(TAG, VAL) \
7790 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
7792 if (info
->executable
)
7794 if (!add_dynamic_entry (DT_DEBUG
, 0))
7800 if ( !add_dynamic_entry (DT_PLTGOT
, 0)
7801 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
7802 || !add_dynamic_entry (DT_PLTREL
,
7803 htab
->use_rel
? DT_REL
: DT_RELA
)
7804 || !add_dynamic_entry (DT_JMPREL
, 0))
7812 if (!add_dynamic_entry (DT_REL
, 0)
7813 || !add_dynamic_entry (DT_RELSZ
, 0)
7814 || !add_dynamic_entry (DT_RELENT
, RELOC_SIZE (htab
)))
7819 if (!add_dynamic_entry (DT_RELA
, 0)
7820 || !add_dynamic_entry (DT_RELASZ
, 0)
7821 || !add_dynamic_entry (DT_RELAENT
, RELOC_SIZE (htab
)))
7826 /* If any dynamic relocs apply to a read-only section,
7827 then we need a DT_TEXTREL entry. */
7828 if ((info
->flags
& DF_TEXTREL
) == 0)
7829 elf_link_hash_traverse (&htab
->root
, elf32_arm_readonly_dynrelocs
,
7832 if ((info
->flags
& DF_TEXTREL
) != 0)
7834 if (!add_dynamic_entry (DT_TEXTREL
, 0))
7838 #undef add_dynamic_entry
7843 /* Finish up dynamic symbol handling. We set the contents of various
7844 dynamic sections here. */
7847 elf32_arm_finish_dynamic_symbol (bfd
* output_bfd
, struct bfd_link_info
* info
,
7848 struct elf_link_hash_entry
* h
, Elf_Internal_Sym
* sym
)
7851 struct elf32_arm_link_hash_table
*htab
;
7852 struct elf32_arm_link_hash_entry
*eh
;
7854 dynobj
= elf_hash_table (info
)->dynobj
;
7855 htab
= elf32_arm_hash_table (info
);
7856 eh
= (struct elf32_arm_link_hash_entry
*) h
;
7858 if (h
->plt
.offset
!= (bfd_vma
) -1)
7864 Elf_Internal_Rela rel
;
7866 /* This symbol has an entry in the procedure linkage table. Set
7869 BFD_ASSERT (h
->dynindx
!= -1);
7871 splt
= bfd_get_section_by_name (dynobj
, ".plt");
7872 srel
= bfd_get_section_by_name (dynobj
, RELOC_SECTION (htab
, ".plt"));
7873 BFD_ASSERT (splt
!= NULL
&& srel
!= NULL
);
7875 /* Fill in the entry in the procedure linkage table. */
7876 if (htab
->symbian_p
)
7878 put_arm_insn (htab
, output_bfd
,
7879 elf32_arm_symbian_plt_entry
[0],
7880 splt
->contents
+ h
->plt
.offset
);
7881 bfd_put_32 (output_bfd
,
7882 elf32_arm_symbian_plt_entry
[1],
7883 splt
->contents
+ h
->plt
.offset
+ 4);
7885 /* Fill in the entry in the .rel.plt section. */
7886 rel
.r_offset
= (splt
->output_section
->vma
7887 + splt
->output_offset
7888 + h
->plt
.offset
+ 4);
7889 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_GLOB_DAT
);
7891 /* Get the index in the procedure linkage table which
7892 corresponds to this symbol. This is the index of this symbol
7893 in all the symbols for which we are making plt entries. The
7894 first entry in the procedure linkage table is reserved. */
7895 plt_index
= ((h
->plt
.offset
- htab
->plt_header_size
)
7896 / htab
->plt_entry_size
);
7900 bfd_vma got_offset
, got_address
, plt_address
;
7901 bfd_vma got_displacement
;
7905 sgot
= bfd_get_section_by_name (dynobj
, ".got.plt");
7906 BFD_ASSERT (sgot
!= NULL
);
7908 /* Get the offset into the .got.plt table of the entry that
7909 corresponds to this function. */
7910 got_offset
= eh
->plt_got_offset
;
7912 /* Get the index in the procedure linkage table which
7913 corresponds to this symbol. This is the index of this symbol
7914 in all the symbols for which we are making plt entries. The
7915 first three entries in .got.plt are reserved; after that
7916 symbols appear in the same order as in .plt. */
7917 plt_index
= (got_offset
- 12) / 4;
7919 /* Calculate the address of the GOT entry. */
7920 got_address
= (sgot
->output_section
->vma
7921 + sgot
->output_offset
7924 /* ...and the address of the PLT entry. */
7925 plt_address
= (splt
->output_section
->vma
7926 + splt
->output_offset
7929 ptr
= htab
->splt
->contents
+ h
->plt
.offset
;
7930 if (htab
->vxworks_p
&& info
->shared
)
7935 for (i
= 0; i
!= htab
->plt_entry_size
/ 4; i
++, ptr
+= 4)
7937 val
= elf32_arm_vxworks_shared_plt_entry
[i
];
7939 val
|= got_address
- sgot
->output_section
->vma
;
7941 val
|= plt_index
* RELOC_SIZE (htab
);
7942 if (i
== 2 || i
== 5)
7943 bfd_put_32 (output_bfd
, val
, ptr
);
7945 put_arm_insn (htab
, output_bfd
, val
, ptr
);
7948 else if (htab
->vxworks_p
)
7953 for (i
= 0; i
!= htab
->plt_entry_size
/ 4; i
++)
7955 val
= elf32_arm_vxworks_exec_plt_entry
[i
];
7959 val
|= 0xffffff & -((h
->plt
.offset
+ i
* 4 + 8) >> 2);
7961 val
|= plt_index
* RELOC_SIZE (htab
);
7962 if (i
== 2 || i
== 5)
7963 bfd_put_32 (output_bfd
, val
, ptr
);
7965 put_arm_insn (htab
, output_bfd
, val
, ptr
);
7968 loc
= (htab
->srelplt2
->contents
7969 + (plt_index
* 2 + 1) * RELOC_SIZE (htab
));
7971 /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
7972 referencing the GOT for this PLT entry. */
7973 rel
.r_offset
= plt_address
+ 8;
7974 rel
.r_info
= ELF32_R_INFO (htab
->root
.hgot
->indx
, R_ARM_ABS32
);
7975 rel
.r_addend
= got_offset
;
7976 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
7977 loc
+= RELOC_SIZE (htab
);
7979 /* Create the R_ARM_ABS32 relocation referencing the
7980 beginning of the PLT for this GOT entry. */
7981 rel
.r_offset
= got_address
;
7982 rel
.r_info
= ELF32_R_INFO (htab
->root
.hplt
->indx
, R_ARM_ABS32
);
7984 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
7988 /* Calculate the displacement between the PLT slot and the
7989 entry in the GOT. The eight-byte offset accounts for the
7990 value produced by adding to pc in the first instruction
7992 got_displacement
= got_address
- (plt_address
+ 8);
7994 BFD_ASSERT ((got_displacement
& 0xf0000000) == 0);
7996 if (!htab
->use_blx
&& eh
->plt_thumb_refcount
> 0)
7998 put_thumb_insn (htab
, output_bfd
,
7999 elf32_arm_plt_thumb_stub
[0], ptr
- 4);
8000 put_thumb_insn (htab
, output_bfd
,
8001 elf32_arm_plt_thumb_stub
[1], ptr
- 2);
8004 put_arm_insn (htab
, output_bfd
,
8005 elf32_arm_plt_entry
[0]
8006 | ((got_displacement
& 0x0ff00000) >> 20),
8008 put_arm_insn (htab
, output_bfd
,
8009 elf32_arm_plt_entry
[1]
8010 | ((got_displacement
& 0x000ff000) >> 12),
8012 put_arm_insn (htab
, output_bfd
,
8013 elf32_arm_plt_entry
[2]
8014 | (got_displacement
& 0x00000fff),
8016 #ifdef FOUR_WORD_PLT
8017 bfd_put_32 (output_bfd
, elf32_arm_plt_entry
[3], ptr
+ 12);
8021 /* Fill in the entry in the global offset table. */
8022 bfd_put_32 (output_bfd
,
8023 (splt
->output_section
->vma
8024 + splt
->output_offset
),
8025 sgot
->contents
+ got_offset
);
8027 /* Fill in the entry in the .rel(a).plt section. */
8029 rel
.r_offset
= got_address
;
8030 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_JUMP_SLOT
);
8033 loc
= srel
->contents
+ plt_index
* RELOC_SIZE (htab
);
8034 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
8036 if (!h
->def_regular
)
8038 /* Mark the symbol as undefined, rather than as defined in
8039 the .plt section. Leave the value alone. */
8040 sym
->st_shndx
= SHN_UNDEF
;
8041 /* If the symbol is weak, we do need to clear the value.
8042 Otherwise, the PLT entry would provide a definition for
8043 the symbol even if the symbol wasn't defined anywhere,
8044 and so the symbol would never be NULL. */
8045 if (!h
->ref_regular_nonweak
)
8050 if (h
->got
.offset
!= (bfd_vma
) -1
8051 && (elf32_arm_hash_entry (h
)->tls_type
& GOT_TLS_GD
) == 0
8052 && (elf32_arm_hash_entry (h
)->tls_type
& GOT_TLS_IE
) == 0)
8056 Elf_Internal_Rela rel
;
8060 /* This symbol has an entry in the global offset table. Set it
8062 sgot
= bfd_get_section_by_name (dynobj
, ".got");
8063 srel
= bfd_get_section_by_name (dynobj
, RELOC_SECTION (htab
, ".got"));
8064 BFD_ASSERT (sgot
!= NULL
&& srel
!= NULL
);
8066 offset
= (h
->got
.offset
& ~(bfd_vma
) 1);
8068 rel
.r_offset
= (sgot
->output_section
->vma
8069 + sgot
->output_offset
8072 /* If this is a static link, or it is a -Bsymbolic link and the
8073 symbol is defined locally or was forced to be local because
8074 of a version file, we just want to emit a RELATIVE reloc.
8075 The entry in the global offset table will already have been
8076 initialized in the relocate_section function. */
8078 && SYMBOL_REFERENCES_LOCAL (info
, h
))
8080 BFD_ASSERT((h
->got
.offset
& 1) != 0);
8081 rel
.r_info
= ELF32_R_INFO (0, R_ARM_RELATIVE
);
8084 rel
.r_addend
= bfd_get_32 (output_bfd
, sgot
->contents
+ offset
);
8085 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ offset
);
8090 BFD_ASSERT((h
->got
.offset
& 1) == 0);
8091 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ offset
);
8092 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_GLOB_DAT
);
8095 loc
= srel
->contents
+ srel
->reloc_count
++ * RELOC_SIZE (htab
);
8096 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
8102 Elf_Internal_Rela rel
;
8105 /* This symbol needs a copy reloc. Set it up. */
8106 BFD_ASSERT (h
->dynindx
!= -1
8107 && (h
->root
.type
== bfd_link_hash_defined
8108 || h
->root
.type
== bfd_link_hash_defweak
));
8110 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
,
8111 RELOC_SECTION (htab
, ".bss"));
8112 BFD_ASSERT (s
!= NULL
);
8115 rel
.r_offset
= (h
->root
.u
.def
.value
8116 + h
->root
.u
.def
.section
->output_section
->vma
8117 + h
->root
.u
.def
.section
->output_offset
);
8118 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_ARM_COPY
);
8119 loc
= s
->contents
+ s
->reloc_count
++ * RELOC_SIZE (htab
);
8120 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, loc
);
8123 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. On VxWorks,
8124 the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it is relative
8125 to the ".got" section. */
8126 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
8127 || (!htab
->vxworks_p
&& h
== htab
->root
.hgot
))
8128 sym
->st_shndx
= SHN_ABS
;
8133 /* Finish up the dynamic sections. */
8136 elf32_arm_finish_dynamic_sections (bfd
* output_bfd
, struct bfd_link_info
* info
)
8142 dynobj
= elf_hash_table (info
)->dynobj
;
8144 sgot
= bfd_get_section_by_name (dynobj
, ".got.plt");
8145 BFD_ASSERT (elf32_arm_hash_table (info
)->symbian_p
|| sgot
!= NULL
);
8146 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
8148 if (elf_hash_table (info
)->dynamic_sections_created
)
8151 Elf32_External_Dyn
*dyncon
, *dynconend
;
8152 struct elf32_arm_link_hash_table
*htab
;
8154 htab
= elf32_arm_hash_table (info
);
8155 splt
= bfd_get_section_by_name (dynobj
, ".plt");
8156 BFD_ASSERT (splt
!= NULL
&& sdyn
!= NULL
);
8158 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
8159 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
8161 for (; dyncon
< dynconend
; dyncon
++)
8163 Elf_Internal_Dyn dyn
;
8167 bfd_elf32_swap_dyn_in (dynobj
, dyncon
, &dyn
);
8178 goto get_vma_if_bpabi
;
8181 goto get_vma_if_bpabi
;
8184 goto get_vma_if_bpabi
;
8186 name
= ".gnu.version";
8187 goto get_vma_if_bpabi
;
8189 name
= ".gnu.version_d";
8190 goto get_vma_if_bpabi
;
8192 name
= ".gnu.version_r";
8193 goto get_vma_if_bpabi
;
8199 name
= RELOC_SECTION (htab
, ".plt");
8201 s
= bfd_get_section_by_name (output_bfd
, name
);
8202 BFD_ASSERT (s
!= NULL
);
8203 if (!htab
->symbian_p
)
8204 dyn
.d_un
.d_ptr
= s
->vma
;
8206 /* In the BPABI, tags in the PT_DYNAMIC section point
8207 at the file offset, not the memory address, for the
8208 convenience of the post linker. */
8209 dyn
.d_un
.d_ptr
= s
->filepos
;
8210 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
8214 if (htab
->symbian_p
)
8219 s
= bfd_get_section_by_name (output_bfd
,
8220 RELOC_SECTION (htab
, ".plt"));
8221 BFD_ASSERT (s
!= NULL
);
8222 dyn
.d_un
.d_val
= s
->size
;
8223 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
8228 if (!htab
->symbian_p
)
8230 /* My reading of the SVR4 ABI indicates that the
8231 procedure linkage table relocs (DT_JMPREL) should be
8232 included in the overall relocs (DT_REL). This is
8233 what Solaris does. However, UnixWare can not handle
8234 that case. Therefore, we override the DT_RELSZ entry
8235 here to make it not include the JMPREL relocs. Since
8236 the linker script arranges for .rel(a).plt to follow all
8237 other relocation sections, we don't have to worry
8238 about changing the DT_REL entry. */
8239 s
= bfd_get_section_by_name (output_bfd
,
8240 RELOC_SECTION (htab
, ".plt"));
8242 dyn
.d_un
.d_val
-= s
->size
;
8243 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
8250 /* In the BPABI, the DT_REL tag must point at the file
8251 offset, not the VMA, of the first relocation
8252 section. So, we use code similar to that in
8253 elflink.c, but do not check for SHF_ALLOC on the
8254 relcoation section, since relocations sections are
8255 never allocated under the BPABI. The comments above
8256 about Unixware notwithstanding, we include all of the
8257 relocations here. */
8258 if (htab
->symbian_p
)
8261 type
= ((dyn
.d_tag
== DT_REL
|| dyn
.d_tag
== DT_RELSZ
)
8262 ? SHT_REL
: SHT_RELA
);
8264 for (i
= 1; i
< elf_numsections (output_bfd
); i
++)
8266 Elf_Internal_Shdr
*hdr
8267 = elf_elfsections (output_bfd
)[i
];
8268 if (hdr
->sh_type
== type
)
8270 if (dyn
.d_tag
== DT_RELSZ
8271 || dyn
.d_tag
== DT_RELASZ
)
8272 dyn
.d_un
.d_val
+= hdr
->sh_size
;
8273 else if ((ufile_ptr
) hdr
->sh_offset
8274 <= dyn
.d_un
.d_val
- 1)
8275 dyn
.d_un
.d_val
= hdr
->sh_offset
;
8278 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
8282 /* Set the bottom bit of DT_INIT/FINI if the
8283 corresponding function is Thumb. */
8285 name
= info
->init_function
;
8288 name
= info
->fini_function
;
8290 /* If it wasn't set by elf_bfd_final_link
8291 then there is nothing to adjust. */
8292 if (dyn
.d_un
.d_val
!= 0)
8294 struct elf_link_hash_entry
* eh
;
8296 eh
= elf_link_hash_lookup (elf_hash_table (info
), name
,
8297 FALSE
, FALSE
, TRUE
);
8298 if (eh
!= (struct elf_link_hash_entry
*) NULL
8299 && ELF_ST_TYPE (eh
->type
) == STT_ARM_TFUNC
)
8301 dyn
.d_un
.d_val
|= 1;
8302 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
8309 /* Fill in the first entry in the procedure linkage table. */
8310 if (splt
->size
> 0 && elf32_arm_hash_table (info
)->plt_header_size
)
8312 const bfd_vma
*plt0_entry
;
8313 bfd_vma got_address
, plt_address
, got_displacement
;
8315 /* Calculate the addresses of the GOT and PLT. */
8316 got_address
= sgot
->output_section
->vma
+ sgot
->output_offset
;
8317 plt_address
= splt
->output_section
->vma
+ splt
->output_offset
;
8319 if (htab
->vxworks_p
)
8321 /* The VxWorks GOT is relocated by the dynamic linker.
8322 Therefore, we must emit relocations rather than simply
8323 computing the values now. */
8324 Elf_Internal_Rela rel
;
8326 plt0_entry
= elf32_arm_vxworks_exec_plt0_entry
;
8327 put_arm_insn (htab
, output_bfd
, plt0_entry
[0],
8328 splt
->contents
+ 0);
8329 put_arm_insn (htab
, output_bfd
, plt0_entry
[1],
8330 splt
->contents
+ 4);
8331 put_arm_insn (htab
, output_bfd
, plt0_entry
[2],
8332 splt
->contents
+ 8);
8333 bfd_put_32 (output_bfd
, got_address
, splt
->contents
+ 12);
8335 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_. */
8336 rel
.r_offset
= plt_address
+ 12;
8337 rel
.r_info
= ELF32_R_INFO (htab
->root
.hgot
->indx
, R_ARM_ABS32
);
8339 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
,
8340 htab
->srelplt2
->contents
);
8344 got_displacement
= got_address
- (plt_address
+ 16);
8346 plt0_entry
= elf32_arm_plt0_entry
;
8347 put_arm_insn (htab
, output_bfd
, plt0_entry
[0],
8348 splt
->contents
+ 0);
8349 put_arm_insn (htab
, output_bfd
, plt0_entry
[1],
8350 splt
->contents
+ 4);
8351 put_arm_insn (htab
, output_bfd
, plt0_entry
[2],
8352 splt
->contents
+ 8);
8353 put_arm_insn (htab
, output_bfd
, plt0_entry
[3],
8354 splt
->contents
+ 12);
8356 #ifdef FOUR_WORD_PLT
8357 /* The displacement value goes in the otherwise-unused
8358 last word of the second entry. */
8359 bfd_put_32 (output_bfd
, got_displacement
, splt
->contents
+ 28);
8361 bfd_put_32 (output_bfd
, got_displacement
, splt
->contents
+ 16);
8366 /* UnixWare sets the entsize of .plt to 4, although that doesn't
8367 really seem like the right value. */
8368 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
= 4;
8370 if (htab
->vxworks_p
&& !info
->shared
&& htab
->splt
->size
> 0)
8372 /* Correct the .rel(a).plt.unloaded relocations. They will have
8373 incorrect symbol indexes. */
8377 num_plts
= ((htab
->splt
->size
- htab
->plt_header_size
)
8378 / htab
->plt_entry_size
);
8379 p
= htab
->srelplt2
->contents
+ RELOC_SIZE (htab
);
8381 for (; num_plts
; num_plts
--)
8383 Elf_Internal_Rela rel
;
8385 SWAP_RELOC_IN (htab
) (output_bfd
, p
, &rel
);
8386 rel
.r_info
= ELF32_R_INFO (htab
->root
.hgot
->indx
, R_ARM_ABS32
);
8387 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, p
);
8388 p
+= RELOC_SIZE (htab
);
8390 SWAP_RELOC_IN (htab
) (output_bfd
, p
, &rel
);
8391 rel
.r_info
= ELF32_R_INFO (htab
->root
.hplt
->indx
, R_ARM_ABS32
);
8392 SWAP_RELOC_OUT (htab
) (output_bfd
, &rel
, p
);
8393 p
+= RELOC_SIZE (htab
);
8398 /* Fill in the first three entries in the global offset table. */
8404 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
);
8406 bfd_put_32 (output_bfd
,
8407 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
8409 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 4);
8410 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 8);
8413 elf_section_data (sgot
->output_section
)->this_hdr
.sh_entsize
= 4;
8420 elf32_arm_post_process_headers (bfd
* abfd
, struct bfd_link_info
* link_info ATTRIBUTE_UNUSED
)
8422 Elf_Internal_Ehdr
* i_ehdrp
; /* ELF file header, internal form. */
8423 struct elf32_arm_link_hash_table
*globals
;
8425 i_ehdrp
= elf_elfheader (abfd
);
8427 if (EF_ARM_EABI_VERSION (i_ehdrp
->e_flags
) == EF_ARM_EABI_UNKNOWN
)
8428 i_ehdrp
->e_ident
[EI_OSABI
] = ELFOSABI_ARM
;
8430 i_ehdrp
->e_ident
[EI_OSABI
] = 0;
8431 i_ehdrp
->e_ident
[EI_ABIVERSION
] = ARM_ELF_ABI_VERSION
;
8435 globals
= elf32_arm_hash_table (link_info
);
8436 if (globals
->byteswap_code
)
8437 i_ehdrp
->e_flags
|= EF_ARM_BE8
;
8441 static enum elf_reloc_type_class
8442 elf32_arm_reloc_type_class (const Elf_Internal_Rela
*rela
)
8444 switch ((int) ELF32_R_TYPE (rela
->r_info
))
8446 case R_ARM_RELATIVE
:
8447 return reloc_class_relative
;
8448 case R_ARM_JUMP_SLOT
:
8449 return reloc_class_plt
;
8451 return reloc_class_copy
;
8453 return reloc_class_normal
;
8457 /* Set the right machine number for an Arm ELF file. */
8460 elf32_arm_section_flags (flagword
*flags
, const Elf_Internal_Shdr
*hdr
)
8462 if (hdr
->sh_type
== SHT_NOTE
)
8463 *flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_SAME_CONTENTS
;
8469 elf32_arm_final_write_processing (bfd
*abfd
, bfd_boolean linker ATTRIBUTE_UNUSED
)
8471 bfd_arm_update_notes (abfd
, ARM_NOTE_SECTION
);
8474 /* Return TRUE if this is an unwinding table entry. */
8477 is_arm_elf_unwind_section_name (bfd
* abfd ATTRIBUTE_UNUSED
, const char * name
)
8481 len1
= sizeof (ELF_STRING_ARM_unwind
) - 1;
8482 len2
= sizeof (ELF_STRING_ARM_unwind_once
) - 1;
8483 return (strncmp (name
, ELF_STRING_ARM_unwind
, len1
) == 0
8484 || strncmp (name
, ELF_STRING_ARM_unwind_once
, len2
) == 0);
8488 /* Set the type and flags for an ARM section. We do this by
8489 the section name, which is a hack, but ought to work. */
8492 elf32_arm_fake_sections (bfd
* abfd
, Elf_Internal_Shdr
* hdr
, asection
* sec
)
8496 name
= bfd_get_section_name (abfd
, sec
);
8498 if (is_arm_elf_unwind_section_name (abfd
, name
))
8500 hdr
->sh_type
= SHT_ARM_EXIDX
;
8501 hdr
->sh_flags
|= SHF_LINK_ORDER
;
8503 else if (strcmp(name
, ".ARM.attributes") == 0)
8505 hdr
->sh_type
= SHT_ARM_ATTRIBUTES
;
8510 /* Parse an Arm EABI attributes section. */
8512 elf32_arm_parse_attributes (bfd
*abfd
, Elf_Internal_Shdr
* hdr
)
8518 contents
= bfd_malloc (hdr
->sh_size
);
8521 if (!bfd_get_section_contents (abfd
, hdr
->bfd_section
, contents
, 0,
8530 len
= hdr
->sh_size
- 1;
8534 bfd_vma section_len
;
8536 section_len
= bfd_get_32 (abfd
, p
);
8538 if (section_len
> len
)
8541 namelen
= strlen ((char *)p
) + 1;
8542 section_len
-= namelen
+ 4;
8543 if (strcmp((char *)p
, "aeabi") != 0)
8545 /* Vendor section. Ignore it. */
8546 p
+= namelen
+ section_len
;
8551 while (section_len
> 0)
8556 bfd_vma subsection_len
;
8559 tag
= read_unsigned_leb128 (abfd
, p
, &n
);
8561 subsection_len
= bfd_get_32 (abfd
, p
);
8563 if (subsection_len
> section_len
)
8564 subsection_len
= section_len
;
8565 section_len
-= subsection_len
;
8566 subsection_len
-= n
+ 4;
8567 end
= p
+ subsection_len
;
8573 bfd_boolean is_string
;
8575 tag
= read_unsigned_leb128 (abfd
, p
, &n
);
8577 if (tag
== 4 || tag
== 5)
8582 is_string
= (tag
& 1) != 0;
8583 if (tag
== Tag_compatibility
)
8585 val
= read_unsigned_leb128 (abfd
, p
, &n
);
8587 elf32_arm_add_eabi_attr_compat (abfd
, val
,
8589 p
+= strlen ((char *)p
) + 1;
8593 elf32_arm_add_eabi_attr_string (abfd
, tag
,
8595 p
+= strlen ((char *)p
) + 1;
8599 val
= read_unsigned_leb128 (abfd
, p
, &n
);
8601 elf32_arm_add_eabi_attr_int (abfd
, tag
, val
);
8607 /* Don't have anywhere convenient to attach these.
8608 Fall through for now. */
8610 /* Ignore things we don't kow about. */
8611 p
+= subsection_len
;
8622 /* Handle an ARM specific section when reading an object file. This is
8623 called when bfd_section_from_shdr finds a section with an unknown
8627 elf32_arm_section_from_shdr (bfd
*abfd
,
8628 Elf_Internal_Shdr
* hdr
,
8632 /* There ought to be a place to keep ELF backend specific flags, but
8633 at the moment there isn't one. We just keep track of the
8634 sections by their name, instead. Fortunately, the ABI gives
8635 names for all the ARM specific sections, so we will probably get
8637 switch (hdr
->sh_type
)
8640 case SHT_ARM_PREEMPTMAP
:
8641 case SHT_ARM_ATTRIBUTES
:
8648 if (! _bfd_elf_make_section_from_shdr (abfd
, hdr
, name
, shindex
))
8651 if (hdr
->sh_type
== SHT_ARM_ATTRIBUTES
)
8652 elf32_arm_parse_attributes(abfd
, hdr
);
8656 /* A structure used to record a list of sections, independently
8657 of the next and prev fields in the asection structure. */
8658 typedef struct section_list
8661 struct section_list
* next
;
8662 struct section_list
* prev
;
8666 /* Unfortunately we need to keep a list of sections for which
8667 an _arm_elf_section_data structure has been allocated. This
8668 is because it is possible for functions like elf32_arm_write_section
8669 to be called on a section which has had an elf_data_structure
8670 allocated for it (and so the used_by_bfd field is valid) but
8671 for which the ARM extended version of this structure - the
8672 _arm_elf_section_data structure - has not been allocated. */
8673 static section_list
* sections_with_arm_elf_section_data
= NULL
;
8676 record_section_with_arm_elf_section_data (asection
* sec
)
8678 struct section_list
* entry
;
8680 entry
= bfd_malloc (sizeof (* entry
));
8684 entry
->next
= sections_with_arm_elf_section_data
;
8686 if (entry
->next
!= NULL
)
8687 entry
->next
->prev
= entry
;
8688 sections_with_arm_elf_section_data
= entry
;
8691 static struct section_list
*
8692 find_arm_elf_section_entry (asection
* sec
)
8694 struct section_list
* entry
;
8695 static struct section_list
* last_entry
= NULL
;
8697 /* This is a short cut for the typical case where the sections are added
8698 to the sections_with_arm_elf_section_data list in forward order and
8699 then looked up here in backwards order. This makes a real difference
8700 to the ld-srec/sec64k.exp linker test. */
8701 entry
= sections_with_arm_elf_section_data
;
8702 if (last_entry
!= NULL
)
8704 if (last_entry
->sec
== sec
)
8706 else if (last_entry
->next
!= NULL
8707 && last_entry
->next
->sec
== sec
)
8708 entry
= last_entry
->next
;
8711 for (; entry
; entry
= entry
->next
)
8712 if (entry
->sec
== sec
)
8716 /* Record the entry prior to this one - it is the entry we are most
8717 likely to want to locate next time. Also this way if we have been
8718 called from unrecord_section_with_arm_elf_section_data() we will not
8719 be caching a pointer that is about to be freed. */
8720 last_entry
= entry
->prev
;
8725 static _arm_elf_section_data
*
8726 get_arm_elf_section_data (asection
* sec
)
8728 struct section_list
* entry
;
8730 entry
= find_arm_elf_section_entry (sec
);
8733 return elf32_arm_section_data (entry
->sec
);
8739 unrecord_section_with_arm_elf_section_data (asection
* sec
)
8741 struct section_list
* entry
;
8743 entry
= find_arm_elf_section_entry (sec
);
8747 if (entry
->prev
!= NULL
)
8748 entry
->prev
->next
= entry
->next
;
8749 if (entry
->next
!= NULL
)
8750 entry
->next
->prev
= entry
->prev
;
8751 if (entry
== sections_with_arm_elf_section_data
)
8752 sections_with_arm_elf_section_data
= entry
->next
;
8757 /* Called for each symbol. Builds a section map based on mapping symbols.
8758 Does not alter any of the symbols. */
8761 elf32_arm_output_symbol_hook (struct bfd_link_info
*info
,
8763 Elf_Internal_Sym
*elfsym
,
8764 asection
*input_sec
,
8765 struct elf_link_hash_entry
*h
)
8768 elf32_arm_section_map
*map
;
8769 elf32_arm_section_map
*newmap
;
8770 _arm_elf_section_data
*arm_data
;
8771 struct elf32_arm_link_hash_table
*globals
;
8773 globals
= elf32_arm_hash_table (info
);
8774 if (globals
->vxworks_p
8775 && !elf_vxworks_link_output_symbol_hook (info
, name
, elfsym
,
8779 /* Only do this on final link. */
8780 if (info
->relocatable
)
8783 /* Only build a map if we need to byteswap code. */
8784 if (!globals
->byteswap_code
)
8787 /* We only want mapping symbols. */
8788 if (!bfd_is_arm_special_symbol_name (name
, BFD_ARM_SPECIAL_SYM_TYPE_MAP
))
8791 /* If this section has not been allocated an _arm_elf_section_data
8792 structure then we cannot record anything. */
8793 arm_data
= get_arm_elf_section_data (input_sec
);
8794 if (arm_data
== NULL
)
8797 mapcount
= arm_data
->mapcount
+ 1;
8798 map
= arm_data
->map
;
8800 /* TODO: This may be inefficient, but we probably don't usually have many
8801 mapping symbols per section. */
8802 newmap
= bfd_realloc (map
, mapcount
* sizeof (* map
));
8805 arm_data
->map
= newmap
;
8806 arm_data
->mapcount
= mapcount
;
8808 newmap
[mapcount
- 1].vma
= elfsym
->st_value
;
8809 newmap
[mapcount
- 1].type
= name
[1];
8818 struct bfd_link_info
*info
;
8821 bfd_boolean (*func
) (void *, const char *, Elf_Internal_Sym
*,
8822 asection
*, struct elf_link_hash_entry
*);
8823 } output_arch_syminfo
;
8825 enum map_symbol_type
8833 /* Output a single PLT mapping symbol. */
8836 elf32_arm_ouput_plt_map_sym (output_arch_syminfo
*osi
,
8837 enum map_symbol_type type
,
8840 static const char *names
[3] = {"$a", "$t", "$d"};
8841 struct elf32_arm_link_hash_table
*htab
;
8842 Elf_Internal_Sym sym
;
8844 htab
= elf32_arm_hash_table (osi
->info
);
8845 sym
.st_value
= osi
->plt_offset
+ offset
;
8848 sym
.st_info
= ELF_ST_INFO (STB_LOCAL
, STT_NOTYPE
);
8849 sym
.st_shndx
= osi
->plt_shndx
;
8850 if (!osi
->func (osi
->finfo
, names
[type
], &sym
, htab
->splt
, NULL
))
8856 /* Output mapping symbols for PLT entries associated with H. */
8859 elf32_arm_output_plt_map (struct elf_link_hash_entry
*h
, void *inf
)
8861 output_arch_syminfo
*osi
= (output_arch_syminfo
*) inf
;
8862 struct elf32_arm_link_hash_table
*htab
;
8863 struct elf32_arm_link_hash_entry
*eh
;
8866 htab
= elf32_arm_hash_table (osi
->info
);
8868 if (h
->root
.type
== bfd_link_hash_indirect
)
8871 if (h
->root
.type
== bfd_link_hash_warning
)
8872 /* When warning symbols are created, they **replace** the "real"
8873 entry in the hash table, thus we never get to see the real
8874 symbol in a hash traversal. So look at it now. */
8875 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
8877 if (h
->plt
.offset
== (bfd_vma
) -1)
8880 eh
= (struct elf32_arm_link_hash_entry
*) h
;
8881 addr
= h
->plt
.offset
;
8882 if (htab
->symbian_p
)
8884 if (!elf32_arm_ouput_plt_map_sym (osi
, ARM_MAP_ARM
, addr
))
8886 if (!elf32_arm_ouput_plt_map_sym (osi
, ARM_MAP_DATA
, addr
+ 4))
8889 else if (htab
->vxworks_p
)
8891 if (!elf32_arm_ouput_plt_map_sym (osi
, ARM_MAP_ARM
, addr
))
8893 if (!elf32_arm_ouput_plt_map_sym (osi
, ARM_MAP_DATA
, addr
+ 8))
8895 if (!elf32_arm_ouput_plt_map_sym (osi
, ARM_MAP_ARM
, addr
+ 12))
8897 if (!elf32_arm_ouput_plt_map_sym (osi
, ARM_MAP_DATA
, addr
+ 20))
8902 bfd_boolean thumb_stub
;
8904 thumb_stub
= eh
->plt_thumb_refcount
> 0 && !htab
->use_blx
;
8907 if (!elf32_arm_ouput_plt_map_sym (osi
, ARM_MAP_THUMB
, addr
- 4))
8910 #ifdef FOUR_WORD_PLT
8911 if (!elf32_arm_ouput_plt_map_sym (osi
, ARM_MAP_ARM
, addr
))
8913 if (!elf32_arm_ouput_plt_map_sym (osi
, ARM_MAP_DATA
, addr
+ 12))
8916 /* A three-word PLT with no Thumb thunk contains only Arm code,
8917 so only need to output a mapping symbol for the first PLT entry and
8918 entries with thumb thunks. */
8919 if (thumb_stub
|| addr
== 20)
8921 if (!elf32_arm_ouput_plt_map_sym (osi
, ARM_MAP_ARM
, addr
))
8931 /* Output mapping symbols for the PLT. */
8934 elf32_arm_output_arch_local_syms (bfd
*output_bfd
,
8935 struct bfd_link_info
*info
,
8936 void *finfo
, bfd_boolean (*func
) (void *, const char *,
8939 struct elf_link_hash_entry
*))
8941 output_arch_syminfo osi
;
8942 struct elf32_arm_link_hash_table
*htab
;
8944 htab
= elf32_arm_hash_table (info
);
8945 if (!htab
->splt
|| htab
->splt
->size
== 0)
8948 check_use_blx(htab
);
8952 osi
.plt_shndx
= _bfd_elf_section_from_bfd_section (output_bfd
,
8953 htab
->splt
->output_section
);
8954 osi
.plt_offset
= htab
->splt
->output_section
->vma
;
8956 /* Output mapping symbols for the plt header. SymbianOS does not have a
8958 if (htab
->vxworks_p
)
8960 /* VxWorks shared libraries have no PLT header. */
8963 if (!elf32_arm_ouput_plt_map_sym (&osi
, ARM_MAP_ARM
, 0))
8965 if (!elf32_arm_ouput_plt_map_sym (&osi
, ARM_MAP_DATA
, 12))
8969 else if (!htab
->symbian_p
)
8971 if (!elf32_arm_ouput_plt_map_sym (&osi
, ARM_MAP_ARM
, 0))
8973 #ifndef FOUR_WORD_PLT
8974 if (!elf32_arm_ouput_plt_map_sym (&osi
, ARM_MAP_DATA
, 16))
8979 elf_link_hash_traverse (&htab
->root
, elf32_arm_output_plt_map
, (void *) &osi
);
8983 /* Allocate target specific section data. */
8986 elf32_arm_new_section_hook (bfd
*abfd
, asection
*sec
)
8988 if (!sec
->used_by_bfd
)
8990 _arm_elf_section_data
*sdata
;
8991 bfd_size_type amt
= sizeof (*sdata
);
8993 sdata
= bfd_zalloc (abfd
, amt
);
8996 sec
->used_by_bfd
= sdata
;
8999 record_section_with_arm_elf_section_data (sec
);
9001 return _bfd_elf_new_section_hook (abfd
, sec
);
9005 /* Used to order a list of mapping symbols by address. */
9008 elf32_arm_compare_mapping (const void * a
, const void * b
)
9010 return ((const elf32_arm_section_map
*) a
)->vma
9011 > ((const elf32_arm_section_map
*) b
)->vma
;
9015 /* Do code byteswapping. Return FALSE afterwards so that the section is
9016 written out as normal. */
9019 elf32_arm_write_section (bfd
*output_bfd ATTRIBUTE_UNUSED
, asection
*sec
,
9023 _arm_elf_section_data
*arm_data
;
9024 elf32_arm_section_map
*map
;
9031 /* If this section has not been allocated an _arm_elf_section_data
9032 structure then we cannot record anything. */
9033 arm_data
= get_arm_elf_section_data (sec
);
9034 if (arm_data
== NULL
)
9037 mapcount
= arm_data
->mapcount
;
9038 map
= arm_data
->map
;
9043 qsort (map
, mapcount
, sizeof (* map
), elf32_arm_compare_mapping
);
9045 offset
= sec
->output_section
->vma
+ sec
->output_offset
;
9046 ptr
= map
[0].vma
- offset
;
9047 for (i
= 0; i
< mapcount
; i
++)
9049 if (i
== mapcount
- 1)
9052 end
= map
[i
+ 1].vma
- offset
;
9054 switch (map
[i
].type
)
9057 /* Byte swap code words. */
9058 while (ptr
+ 3 < end
)
9060 tmp
= contents
[ptr
];
9061 contents
[ptr
] = contents
[ptr
+ 3];
9062 contents
[ptr
+ 3] = tmp
;
9063 tmp
= contents
[ptr
+ 1];
9064 contents
[ptr
+ 1] = contents
[ptr
+ 2];
9065 contents
[ptr
+ 2] = tmp
;
9071 /* Byte swap code halfwords. */
9072 while (ptr
+ 1 < end
)
9074 tmp
= contents
[ptr
];
9075 contents
[ptr
] = contents
[ptr
+ 1];
9076 contents
[ptr
+ 1] = tmp
;
9082 /* Leave data alone. */
9089 arm_data
->mapcount
= 0;
9090 arm_data
->map
= NULL
;
9091 unrecord_section_with_arm_elf_section_data (sec
);
9097 unrecord_section_via_map_over_sections (bfd
* abfd ATTRIBUTE_UNUSED
,
9099 void * ignore ATTRIBUTE_UNUSED
)
9101 unrecord_section_with_arm_elf_section_data (sec
);
9105 elf32_arm_close_and_cleanup (bfd
* abfd
)
9108 bfd_map_over_sections (abfd
,
9109 unrecord_section_via_map_over_sections
,
9112 return _bfd_elf_close_and_cleanup (abfd
);
9116 elf32_arm_bfd_free_cached_info (bfd
* abfd
)
9119 bfd_map_over_sections (abfd
,
9120 unrecord_section_via_map_over_sections
,
9123 return _bfd_free_cached_info (abfd
);
9126 /* Display STT_ARM_TFUNC symbols as functions. */
9129 elf32_arm_symbol_processing (bfd
*abfd ATTRIBUTE_UNUSED
,
9132 elf_symbol_type
*elfsym
= (elf_symbol_type
*) asym
;
9134 if (ELF_ST_TYPE (elfsym
->internal_elf_sym
.st_info
) == STT_ARM_TFUNC
)
9135 elfsym
->symbol
.flags
|= BSF_FUNCTION
;
9139 /* Mangle thumb function symbols as we read them in. */
9142 elf32_arm_swap_symbol_in (bfd
* abfd
,
9145 Elf_Internal_Sym
*dst
)
9147 bfd_elf32_swap_symbol_in (abfd
, psrc
, pshn
, dst
);
9149 /* New EABI objects mark thumb function symbols by setting the low bit of
9150 the address. Turn these into STT_ARM_TFUNC. */
9151 if (ELF_ST_TYPE (dst
->st_info
) == STT_FUNC
9152 && (dst
->st_value
& 1))
9154 dst
->st_info
= ELF_ST_INFO (ELF_ST_BIND (dst
->st_info
), STT_ARM_TFUNC
);
9155 dst
->st_value
&= ~(bfd_vma
) 1;
9160 /* Mangle thumb function symbols as we write them out. */
9163 elf32_arm_swap_symbol_out (bfd
*abfd
,
9164 const Elf_Internal_Sym
*src
,
9168 Elf_Internal_Sym newsym
;
9170 /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
9171 of the address set, as per the new EABI. We do this unconditionally
9172 because objcopy does not set the elf header flags until after
9173 it writes out the symbol table. */
9174 if (ELF_ST_TYPE (src
->st_info
) == STT_ARM_TFUNC
)
9177 newsym
.st_info
= ELF_ST_INFO (ELF_ST_BIND (src
->st_info
), STT_FUNC
);
9178 if (newsym
.st_shndx
!= SHN_UNDEF
)
9180 /* Do this only for defined symbols. At link type, the static
9181 linker will simulate the work of dynamic linker of resolving
9182 symbols and will carry over the thumbness of found symbols to
9183 the output symbol table. It's not clear how it happens, but
9184 the thumbness of underfined symbols can well be different at
9185 runtime, and writing '1' for them will be confusing for users
9186 and possibly for dynamic linker itself.
9188 newsym
.st_value
|= 1;
9191 newsym
.st_value
|= 1;
9195 bfd_elf32_swap_symbol_out (abfd
, src
, cdst
, shndx
);
9198 /* Add the PT_ARM_EXIDX program header. */
9201 elf32_arm_modify_segment_map (bfd
*abfd
,
9202 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
9204 struct elf_segment_map
*m
;
9207 sec
= bfd_get_section_by_name (abfd
, ".ARM.exidx");
9208 if (sec
!= NULL
&& (sec
->flags
& SEC_LOAD
) != 0)
9210 /* If there is already a PT_ARM_EXIDX header, then we do not
9211 want to add another one. This situation arises when running
9212 "strip"; the input binary already has the header. */
9213 m
= elf_tdata (abfd
)->segment_map
;
9214 while (m
&& m
->p_type
!= PT_ARM_EXIDX
)
9218 m
= bfd_zalloc (abfd
, sizeof (struct elf_segment_map
));
9221 m
->p_type
= PT_ARM_EXIDX
;
9223 m
->sections
[0] = sec
;
9225 m
->next
= elf_tdata (abfd
)->segment_map
;
9226 elf_tdata (abfd
)->segment_map
= m
;
9233 /* We may add a PT_ARM_EXIDX program header. */
9236 elf32_arm_additional_program_headers (bfd
*abfd
,
9237 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
9241 sec
= bfd_get_section_by_name (abfd
, ".ARM.exidx");
9242 if (sec
!= NULL
&& (sec
->flags
& SEC_LOAD
) != 0)
9248 /* We use this to override swap_symbol_in and swap_symbol_out. */
9249 const struct elf_size_info elf32_arm_size_info
= {
9250 sizeof (Elf32_External_Ehdr
),
9251 sizeof (Elf32_External_Phdr
),
9252 sizeof (Elf32_External_Shdr
),
9253 sizeof (Elf32_External_Rel
),
9254 sizeof (Elf32_External_Rela
),
9255 sizeof (Elf32_External_Sym
),
9256 sizeof (Elf32_External_Dyn
),
9257 sizeof (Elf_External_Note
),
9261 ELFCLASS32
, EV_CURRENT
,
9262 bfd_elf32_write_out_phdrs
,
9263 bfd_elf32_write_shdrs_and_ehdr
,
9264 bfd_elf32_write_relocs
,
9265 elf32_arm_swap_symbol_in
,
9266 elf32_arm_swap_symbol_out
,
9267 bfd_elf32_slurp_reloc_table
,
9268 bfd_elf32_slurp_symbol_table
,
9269 bfd_elf32_swap_dyn_in
,
9270 bfd_elf32_swap_dyn_out
,
9271 bfd_elf32_swap_reloc_in
,
9272 bfd_elf32_swap_reloc_out
,
9273 bfd_elf32_swap_reloca_in
,
9274 bfd_elf32_swap_reloca_out
9277 #define ELF_ARCH bfd_arch_arm
9278 #define ELF_MACHINE_CODE EM_ARM
9279 #ifdef __QNXTARGET__
9280 #define ELF_MAXPAGESIZE 0x1000
9282 #define ELF_MAXPAGESIZE 0x8000
9284 #define ELF_MINPAGESIZE 0x1000
9285 #define ELF_COMMONPAGESIZE 0x1000
9287 #define bfd_elf32_mkobject elf32_arm_mkobject
9289 #define bfd_elf32_bfd_copy_private_bfd_data elf32_arm_copy_private_bfd_data
9290 #define bfd_elf32_bfd_merge_private_bfd_data elf32_arm_merge_private_bfd_data
9291 #define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
9292 #define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
9293 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
9294 #define bfd_elf32_bfd_reloc_type_lookup elf32_arm_reloc_type_lookup
9295 #define bfd_elf32_find_nearest_line elf32_arm_find_nearest_line
9296 #define bfd_elf32_find_inliner_info elf32_arm_find_inliner_info
9297 #define bfd_elf32_new_section_hook elf32_arm_new_section_hook
9298 #define bfd_elf32_bfd_is_target_special_symbol elf32_arm_is_target_special_symbol
9299 #define bfd_elf32_close_and_cleanup elf32_arm_close_and_cleanup
9300 #define bfd_elf32_bfd_free_cached_info elf32_arm_bfd_free_cached_info
9301 #define bfd_elf32_bfd_final_link elf32_arm_bfd_final_link
9303 #define elf_backend_get_symbol_type elf32_arm_get_symbol_type
9304 #define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook
9305 #define elf_backend_gc_sweep_hook elf32_arm_gc_sweep_hook
9306 #define elf_backend_check_relocs elf32_arm_check_relocs
9307 #define elf_backend_relocate_section elf32_arm_relocate_section
9308 #define elf_backend_write_section elf32_arm_write_section
9309 #define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol
9310 #define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections
9311 #define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol
9312 #define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections
9313 #define elf_backend_link_output_symbol_hook elf32_arm_output_symbol_hook
9314 #define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections
9315 #define elf_backend_post_process_headers elf32_arm_post_process_headers
9316 #define elf_backend_reloc_type_class elf32_arm_reloc_type_class
9317 #define elf_backend_object_p elf32_arm_object_p
9318 #define elf_backend_section_flags elf32_arm_section_flags
9319 #define elf_backend_fake_sections elf32_arm_fake_sections
9320 #define elf_backend_section_from_shdr elf32_arm_section_from_shdr
9321 #define elf_backend_final_write_processing elf32_arm_final_write_processing
9322 #define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol
9323 #define elf_backend_symbol_processing elf32_arm_symbol_processing
9324 #define elf_backend_size_info elf32_arm_size_info
9325 #define elf_backend_modify_segment_map elf32_arm_modify_segment_map
9326 #define elf_backend_additional_program_headers \
9327 elf32_arm_additional_program_headers
9328 #define elf_backend_output_arch_local_syms \
9329 elf32_arm_output_arch_local_syms
9331 #define elf_backend_can_refcount 1
9332 #define elf_backend_can_gc_sections 1
9333 #define elf_backend_plt_readonly 1
9334 #define elf_backend_want_got_plt 1
9335 #define elf_backend_want_plt_sym 0
9336 #define elf_backend_may_use_rel_p 1
9337 #define elf_backend_may_use_rela_p 0
9338 #define elf_backend_default_use_rela_p 0
9339 #define elf_backend_rela_normal 0
9341 #define elf_backend_got_header_size 12
9343 #include "elf32-target.h"
9345 /* VxWorks Targets */
9347 #undef TARGET_LITTLE_SYM
9348 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vxworks_vec
9349 #undef TARGET_LITTLE_NAME
9350 #define TARGET_LITTLE_NAME "elf32-littlearm-vxworks"
9351 #undef TARGET_BIG_SYM
9352 #define TARGET_BIG_SYM bfd_elf32_bigarm_vxworks_vec
9353 #undef TARGET_BIG_NAME
9354 #define TARGET_BIG_NAME "elf32-bigarm-vxworks"
9356 /* Like elf32_arm_link_hash_table_create -- but overrides
9357 appropriately for VxWorks. */
9358 static struct bfd_link_hash_table
*
9359 elf32_arm_vxworks_link_hash_table_create (bfd
*abfd
)
9361 struct bfd_link_hash_table
*ret
;
9363 ret
= elf32_arm_link_hash_table_create (abfd
);
9366 struct elf32_arm_link_hash_table
*htab
9367 = (struct elf32_arm_link_hash_table
*) ret
;
9369 htab
->vxworks_p
= 1;
9375 elf32_arm_vxworks_final_write_processing (bfd
*abfd
, bfd_boolean linker
)
9377 elf32_arm_final_write_processing (abfd
, linker
);
9378 elf_vxworks_final_write_processing (abfd
, linker
);
9382 #define elf32_bed elf32_arm_vxworks_bed
9384 #undef bfd_elf32_bfd_link_hash_table_create
9385 #define bfd_elf32_bfd_link_hash_table_create \
9386 elf32_arm_vxworks_link_hash_table_create
9387 #undef elf_backend_add_symbol_hook
9388 #define elf_backend_add_symbol_hook \
9389 elf_vxworks_add_symbol_hook
9390 #undef elf_backend_final_write_processing
9391 #define elf_backend_final_write_processing \
9392 elf32_arm_vxworks_final_write_processing
9393 #undef elf_backend_emit_relocs
9394 #define elf_backend_emit_relocs \
9395 elf_vxworks_emit_relocs
9397 #undef elf_backend_may_use_rel_p
9398 #define elf_backend_may_use_rel_p 0
9399 #undef elf_backend_may_use_rela_p
9400 #define elf_backend_may_use_rela_p 1
9401 #undef elf_backend_default_use_rela_p
9402 #define elf_backend_default_use_rela_p 1
9403 #undef elf_backend_rela_normal
9404 #define elf_backend_rela_normal 1
9405 #undef elf_backend_want_plt_sym
9406 #define elf_backend_want_plt_sym 1
9407 #undef ELF_MAXPAGESIZE
9408 #define ELF_MAXPAGESIZE 0x1000
9410 #include "elf32-target.h"
9413 /* Symbian OS Targets */
9415 #undef TARGET_LITTLE_SYM
9416 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_symbian_vec
9417 #undef TARGET_LITTLE_NAME
9418 #define TARGET_LITTLE_NAME "elf32-littlearm-symbian"
9419 #undef TARGET_BIG_SYM
9420 #define TARGET_BIG_SYM bfd_elf32_bigarm_symbian_vec
9421 #undef TARGET_BIG_NAME
9422 #define TARGET_BIG_NAME "elf32-bigarm-symbian"
9424 /* Like elf32_arm_link_hash_table_create -- but overrides
9425 appropriately for Symbian OS. */
9426 static struct bfd_link_hash_table
*
9427 elf32_arm_symbian_link_hash_table_create (bfd
*abfd
)
9429 struct bfd_link_hash_table
*ret
;
9431 ret
= elf32_arm_link_hash_table_create (abfd
);
9434 struct elf32_arm_link_hash_table
*htab
9435 = (struct elf32_arm_link_hash_table
*)ret
;
9436 /* There is no PLT header for Symbian OS. */
9437 htab
->plt_header_size
= 0;
9438 /* The PLT entries are each three instructions. */
9439 htab
->plt_entry_size
= 4 * NUM_ELEM (elf32_arm_symbian_plt_entry
);
9440 htab
->symbian_p
= 1;
9441 /* Symbian uses armv5t or above, so use_blx is always true. */
9443 htab
->root
.is_relocatable_executable
= 1;
9448 static const struct bfd_elf_special_section
9449 elf32_arm_symbian_special_sections
[] =
9451 /* In a BPABI executable, the dynamic linking sections do not go in
9452 the loadable read-only segment. The post-linker may wish to
9453 refer to these sections, but they are not part of the final
9455 { ".dynamic", 8, 0, SHT_DYNAMIC
, 0 },
9456 { ".dynstr", 7, 0, SHT_STRTAB
, 0 },
9457 { ".dynsym", 7, 0, SHT_DYNSYM
, 0 },
9458 { ".got", 4, 0, SHT_PROGBITS
, 0 },
9459 { ".hash", 5, 0, SHT_HASH
, 0 },
9460 /* These sections do not need to be writable as the SymbianOS
9461 postlinker will arrange things so that no dynamic relocation is
9463 { ".init_array", 11, 0, SHT_INIT_ARRAY
, SHF_ALLOC
},
9464 { ".fini_array", 11, 0, SHT_FINI_ARRAY
, SHF_ALLOC
},
9465 { ".preinit_array", 14, 0, SHT_PREINIT_ARRAY
, SHF_ALLOC
},
9466 { NULL
, 0, 0, 0, 0 }
9470 elf32_arm_symbian_begin_write_processing (bfd
*abfd
,
9471 struct bfd_link_info
*link_info
9474 /* BPABI objects are never loaded directly by an OS kernel; they are
9475 processed by a postlinker first, into an OS-specific format. If
9476 the D_PAGED bit is set on the file, BFD will align segments on
9477 page boundaries, so that an OS can directly map the file. With
9478 BPABI objects, that just results in wasted space. In addition,
9479 because we clear the D_PAGED bit, map_sections_to_segments will
9480 recognize that the program headers should not be mapped into any
9481 loadable segment. */
9482 abfd
->flags
&= ~D_PAGED
;
9486 elf32_arm_symbian_modify_segment_map (bfd
*abfd
,
9487 struct bfd_link_info
*info
)
9489 struct elf_segment_map
*m
;
9492 /* BPABI shared libraries and executables should have a PT_DYNAMIC
9493 segment. However, because the .dynamic section is not marked
9494 with SEC_LOAD, the generic ELF code will not create such a
9496 dynsec
= bfd_get_section_by_name (abfd
, ".dynamic");
9499 for (m
= elf_tdata (abfd
)->segment_map
; m
!= NULL
; m
= m
->next
)
9500 if (m
->p_type
== PT_DYNAMIC
)
9505 m
= _bfd_elf_make_dynamic_segment (abfd
, dynsec
);
9506 m
->next
= elf_tdata (abfd
)->segment_map
;
9507 elf_tdata (abfd
)->segment_map
= m
;
9511 /* Also call the generic arm routine. */
9512 return elf32_arm_modify_segment_map (abfd
, info
);
9516 #define elf32_bed elf32_arm_symbian_bed
9518 /* The dynamic sections are not allocated on SymbianOS; the postlinker
9519 will process them and then discard them. */
9520 #undef ELF_DYNAMIC_SEC_FLAGS
9521 #define ELF_DYNAMIC_SEC_FLAGS \
9522 (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
9524 #undef bfd_elf32_bfd_link_hash_table_create
9525 #define bfd_elf32_bfd_link_hash_table_create \
9526 elf32_arm_symbian_link_hash_table_create
9527 #undef elf_backend_add_symbol_hook
9529 #undef elf_backend_special_sections
9530 #define elf_backend_special_sections elf32_arm_symbian_special_sections
9532 #undef elf_backend_begin_write_processing
9533 #define elf_backend_begin_write_processing \
9534 elf32_arm_symbian_begin_write_processing
9535 #undef elf_backend_final_write_processing
9536 #define elf_backend_final_write_processing \
9537 elf32_arm_final_write_processing
9538 #undef elf_backend_emit_relocs
9540 #undef elf_backend_modify_segment_map
9541 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
9543 /* There is no .got section for BPABI objects, and hence no header. */
9544 #undef elf_backend_got_header_size
9545 #define elf_backend_got_header_size 0
9547 /* Similarly, there is no .got.plt section. */
9548 #undef elf_backend_want_got_plt
9549 #define elf_backend_want_got_plt 0
9551 #undef elf_backend_may_use_rel_p
9552 #define elf_backend_may_use_rel_p 1
9553 #undef elf_backend_may_use_rela_p
9554 #define elf_backend_may_use_rela_p 0
9555 #undef elf_backend_default_use_rela_p
9556 #define elf_backend_default_use_rela_p 0
9557 #undef elf_backend_rela_normal
9558 #define elf_backend_rela_normal 0
9559 #undef elf_backend_want_plt_sym
9560 #define elf_backend_want_plt_sym 0
9561 #undef ELF_MAXPAGESIZE
9562 #define ELF_MAXPAGESIZE 0x8000
9564 #include "elf32-target.h"