1 /* 32-bit ELF support for ARM
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
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. */
28 #define NUM_ELEM(a) (sizeof (a) / (sizeof (a)[0]))
31 #define elf_info_to_howto 0
32 #define elf_info_to_howto_rel elf32_arm_info_to_howto
34 #define ARM_ELF_ABI_VERSION 0
35 #define ARM_ELF_OS_ABI_VERSION ELFOSABI_ARM
37 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
38 R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
41 static reloc_howto_type elf32_arm_howto_table_1[] =
44 HOWTO (R_ARM_NONE, /* type */
46 0, /* size (0 = byte, 1 = short, 2 = long) */
48 FALSE, /* pc_relative */
50 complain_overflow_dont,/* complain_on_overflow */
51 bfd_elf_generic_reloc, /* special_function */
52 "R_ARM_NONE", /* name */
53 FALSE, /* partial_inplace */
56 FALSE), /* pcrel_offset */
58 HOWTO (R_ARM_PC24, /* type */
60 2, /* size (0 = byte, 1 = short, 2 = long) */
62 TRUE, /* pc_relative */
64 complain_overflow_signed,/* complain_on_overflow */
65 bfd_elf_generic_reloc, /* special_function */
66 "R_ARM_PC24", /* name */
67 FALSE, /* partial_inplace */
68 0x00ffffff, /* src_mask */
69 0x00ffffff, /* dst_mask */
70 TRUE), /* pcrel_offset */
73 HOWTO (R_ARM_ABS32, /* type */
75 2, /* size (0 = byte, 1 = short, 2 = long) */
77 FALSE, /* pc_relative */
79 complain_overflow_bitfield,/* complain_on_overflow */
80 bfd_elf_generic_reloc, /* special_function */
81 "R_ARM_ABS32", /* name */
82 FALSE, /* partial_inplace */
83 0xffffffff, /* src_mask */
84 0xffffffff, /* dst_mask */
85 FALSE), /* pcrel_offset */
87 /* standard 32bit pc-relative reloc */
88 HOWTO (R_ARM_REL32, /* type */
90 2, /* size (0 = byte, 1 = short, 2 = long) */
92 TRUE, /* pc_relative */
94 complain_overflow_bitfield,/* complain_on_overflow */
95 bfd_elf_generic_reloc, /* special_function */
96 "R_ARM_REL32", /* name */
97 FALSE, /* partial_inplace */
98 0xffffffff, /* src_mask */
99 0xffffffff, /* dst_mask */
100 TRUE), /* pcrel_offset */
102 /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
103 HOWTO (R_ARM_PC13, /* type */
105 0, /* 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_PC13", /* name */
112 FALSE, /* partial_inplace */
113 0x000000ff, /* src_mask */
114 0x000000ff, /* dst_mask */
115 FALSE), /* pcrel_offset */
117 /* 16 bit absolute */
118 HOWTO (R_ARM_ABS16, /* type */
120 1, /* size (0 = byte, 1 = short, 2 = long) */
122 FALSE, /* pc_relative */
124 complain_overflow_bitfield,/* complain_on_overflow */
125 bfd_elf_generic_reloc, /* special_function */
126 "R_ARM_ABS16", /* name */
127 FALSE, /* partial_inplace */
128 0x0000ffff, /* src_mask */
129 0x0000ffff, /* dst_mask */
130 FALSE), /* pcrel_offset */
132 /* 12 bit absolute */
133 HOWTO (R_ARM_ABS12, /* type */
135 2, /* size (0 = byte, 1 = short, 2 = long) */
137 FALSE, /* pc_relative */
139 complain_overflow_bitfield,/* complain_on_overflow */
140 bfd_elf_generic_reloc, /* special_function */
141 "R_ARM_ABS12", /* name */
142 FALSE, /* partial_inplace */
143 0x000008ff, /* src_mask */
144 0x000008ff, /* dst_mask */
145 FALSE), /* pcrel_offset */
147 HOWTO (R_ARM_THM_ABS5, /* type */
149 1, /* size (0 = byte, 1 = short, 2 = long) */
151 FALSE, /* pc_relative */
153 complain_overflow_bitfield,/* complain_on_overflow */
154 bfd_elf_generic_reloc, /* special_function */
155 "R_ARM_THM_ABS5", /* name */
156 FALSE, /* partial_inplace */
157 0x000007e0, /* src_mask */
158 0x000007e0, /* dst_mask */
159 FALSE), /* pcrel_offset */
162 HOWTO (R_ARM_ABS8, /* type */
164 0, /* size (0 = byte, 1 = short, 2 = long) */
166 FALSE, /* pc_relative */
168 complain_overflow_bitfield,/* complain_on_overflow */
169 bfd_elf_generic_reloc, /* special_function */
170 "R_ARM_ABS8", /* name */
171 FALSE, /* partial_inplace */
172 0x000000ff, /* src_mask */
173 0x000000ff, /* dst_mask */
174 FALSE), /* pcrel_offset */
176 HOWTO (R_ARM_SBREL32, /* type */
178 2, /* size (0 = byte, 1 = short, 2 = long) */
180 FALSE, /* pc_relative */
182 complain_overflow_dont,/* complain_on_overflow */
183 bfd_elf_generic_reloc, /* special_function */
184 "R_ARM_SBREL32", /* name */
185 FALSE, /* partial_inplace */
186 0xffffffff, /* src_mask */
187 0xffffffff, /* dst_mask */
188 FALSE), /* pcrel_offset */
190 /* FIXME: Has two more bits of offset in Thumb32. */
191 HOWTO (R_ARM_THM_CALL, /* type */
193 2, /* size (0 = byte, 1 = short, 2 = long) */
195 TRUE, /* pc_relative */
197 complain_overflow_signed,/* complain_on_overflow */
198 bfd_elf_generic_reloc, /* special_function */
199 "R_ARM_THM_CALL", /* name */
200 FALSE, /* partial_inplace */
201 0x07ff07ff, /* src_mask */
202 0x07ff07ff, /* dst_mask */
203 TRUE), /* pcrel_offset */
205 HOWTO (R_ARM_THM_PC8, /* type */
207 1, /* size (0 = byte, 1 = short, 2 = long) */
209 TRUE, /* pc_relative */
211 complain_overflow_signed,/* complain_on_overflow */
212 bfd_elf_generic_reloc, /* special_function */
213 "R_ARM_THM_PC8", /* name */
214 FALSE, /* partial_inplace */
215 0x000000ff, /* src_mask */
216 0x000000ff, /* dst_mask */
217 TRUE), /* pcrel_offset */
219 HOWTO (R_ARM_BREL_ADJ, /* type */
221 1, /* size (0 = byte, 1 = short, 2 = long) */
223 FALSE, /* pc_relative */
225 complain_overflow_signed,/* complain_on_overflow */
226 bfd_elf_generic_reloc, /* special_function */
227 "R_ARM_BREL_ADJ", /* name */
228 FALSE, /* partial_inplace */
229 0xffffffff, /* src_mask */
230 0xffffffff, /* dst_mask */
231 FALSE), /* pcrel_offset */
233 HOWTO (R_ARM_SWI24, /* type */
235 0, /* size (0 = byte, 1 = short, 2 = long) */
237 FALSE, /* pc_relative */
239 complain_overflow_signed,/* complain_on_overflow */
240 bfd_elf_generic_reloc, /* special_function */
241 "R_ARM_SWI24", /* name */
242 FALSE, /* partial_inplace */
243 0x00000000, /* src_mask */
244 0x00000000, /* dst_mask */
245 FALSE), /* pcrel_offset */
247 HOWTO (R_ARM_THM_SWI8, /* type */
249 0, /* size (0 = byte, 1 = short, 2 = long) */
251 FALSE, /* pc_relative */
253 complain_overflow_signed,/* complain_on_overflow */
254 bfd_elf_generic_reloc, /* special_function */
255 "R_ARM_SWI8", /* name */
256 FALSE, /* partial_inplace */
257 0x00000000, /* src_mask */
258 0x00000000, /* dst_mask */
259 FALSE), /* pcrel_offset */
261 /* BLX instruction for the ARM. */
262 HOWTO (R_ARM_XPC25, /* type */
264 2, /* size (0 = byte, 1 = short, 2 = long) */
266 TRUE, /* pc_relative */
268 complain_overflow_signed,/* complain_on_overflow */
269 bfd_elf_generic_reloc, /* special_function */
270 "R_ARM_XPC25", /* name */
271 FALSE, /* partial_inplace */
272 0x00ffffff, /* src_mask */
273 0x00ffffff, /* dst_mask */
274 TRUE), /* pcrel_offset */
276 /* BLX instruction for the Thumb. */
277 HOWTO (R_ARM_THM_XPC22, /* type */
279 2, /* size (0 = byte, 1 = short, 2 = long) */
281 TRUE, /* pc_relative */
283 complain_overflow_signed,/* complain_on_overflow */
284 bfd_elf_generic_reloc, /* special_function */
285 "R_ARM_THM_XPC22", /* name */
286 FALSE, /* partial_inplace */
287 0x07ff07ff, /* src_mask */
288 0x07ff07ff, /* dst_mask */
289 TRUE), /* pcrel_offset */
291 /* Dynamic TLS relocations. */
293 HOWTO (R_ARM_TLS_DTPMOD32, /* type */
295 2, /* size (0 = byte, 1 = short, 2 = long) */
297 FALSE, /* pc_relative */
299 complain_overflow_bitfield,/* complain_on_overflow */
300 bfd_elf_generic_reloc, /* special_function */
301 "R_ARM_TLS_DTPMOD32", /* name */
302 TRUE, /* partial_inplace */
303 0xffffffff, /* src_mask */
304 0xffffffff, /* dst_mask */
305 FALSE), /* pcrel_offset */
307 HOWTO (R_ARM_TLS_DTPOFF32, /* type */
309 2, /* size (0 = byte, 1 = short, 2 = long) */
311 FALSE, /* pc_relative */
313 complain_overflow_bitfield,/* complain_on_overflow */
314 bfd_elf_generic_reloc, /* special_function */
315 "R_ARM_TLS_DTPOFF32", /* name */
316 TRUE, /* partial_inplace */
317 0xffffffff, /* src_mask */
318 0xffffffff, /* dst_mask */
319 FALSE), /* pcrel_offset */
321 HOWTO (R_ARM_TLS_TPOFF32, /* type */
323 2, /* size (0 = byte, 1 = short, 2 = long) */
325 FALSE, /* pc_relative */
327 complain_overflow_bitfield,/* complain_on_overflow */
328 bfd_elf_generic_reloc, /* special_function */
329 "R_ARM_TLS_TPOFF32", /* name */
330 TRUE, /* partial_inplace */
331 0xffffffff, /* src_mask */
332 0xffffffff, /* dst_mask */
333 FALSE), /* pcrel_offset */
335 /* Relocs used in ARM Linux */
337 HOWTO (R_ARM_COPY, /* 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_COPY", /* name */
346 TRUE, /* partial_inplace */
347 0xffffffff, /* src_mask */
348 0xffffffff, /* dst_mask */
349 FALSE), /* pcrel_offset */
351 HOWTO (R_ARM_GLOB_DAT, /* 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_GLOB_DAT", /* name */
360 TRUE, /* partial_inplace */
361 0xffffffff, /* src_mask */
362 0xffffffff, /* dst_mask */
363 FALSE), /* pcrel_offset */
365 HOWTO (R_ARM_JUMP_SLOT, /* type */
367 2, /* size (0 = byte, 1 = short, 2 = long) */
369 FALSE, /* pc_relative */
371 complain_overflow_bitfield,/* complain_on_overflow */
372 bfd_elf_generic_reloc, /* special_function */
373 "R_ARM_JUMP_SLOT", /* name */
374 TRUE, /* partial_inplace */
375 0xffffffff, /* src_mask */
376 0xffffffff, /* dst_mask */
377 FALSE), /* pcrel_offset */
379 HOWTO (R_ARM_RELATIVE, /* type */
381 2, /* size (0 = byte, 1 = short, 2 = long) */
383 FALSE, /* pc_relative */
385 complain_overflow_bitfield,/* complain_on_overflow */
386 bfd_elf_generic_reloc, /* special_function */
387 "R_ARM_RELATIVE", /* name */
388 TRUE, /* partial_inplace */
389 0xffffffff, /* src_mask */
390 0xffffffff, /* dst_mask */
391 FALSE), /* pcrel_offset */
393 HOWTO (R_ARM_GOTOFF32, /* type */
395 2, /* size (0 = byte, 1 = short, 2 = long) */
397 FALSE, /* pc_relative */
399 complain_overflow_bitfield,/* complain_on_overflow */
400 bfd_elf_generic_reloc, /* special_function */
401 "R_ARM_GOTOFF32", /* name */
402 TRUE, /* partial_inplace */
403 0xffffffff, /* src_mask */
404 0xffffffff, /* dst_mask */
405 FALSE), /* pcrel_offset */
407 HOWTO (R_ARM_GOTPC, /* type */
409 2, /* size (0 = byte, 1 = short, 2 = long) */
411 TRUE, /* pc_relative */
413 complain_overflow_bitfield,/* complain_on_overflow */
414 bfd_elf_generic_reloc, /* special_function */
415 "R_ARM_GOTPC", /* name */
416 TRUE, /* partial_inplace */
417 0xffffffff, /* src_mask */
418 0xffffffff, /* dst_mask */
419 TRUE), /* pcrel_offset */
421 HOWTO (R_ARM_GOT32, /* type */
423 2, /* size (0 = byte, 1 = short, 2 = long) */
425 FALSE, /* pc_relative */
427 complain_overflow_bitfield,/* complain_on_overflow */
428 bfd_elf_generic_reloc, /* special_function */
429 "R_ARM_GOT32", /* name */
430 TRUE, /* partial_inplace */
431 0xffffffff, /* src_mask */
432 0xffffffff, /* dst_mask */
433 FALSE), /* pcrel_offset */
435 HOWTO (R_ARM_PLT32, /* type */
437 2, /* size (0 = byte, 1 = short, 2 = long) */
439 TRUE, /* pc_relative */
441 complain_overflow_bitfield,/* complain_on_overflow */
442 bfd_elf_generic_reloc, /* special_function */
443 "R_ARM_PLT32", /* name */
444 FALSE, /* partial_inplace */
445 0x00ffffff, /* src_mask */
446 0x00ffffff, /* dst_mask */
447 TRUE), /* pcrel_offset */
449 HOWTO (R_ARM_CALL, /* type */
451 2, /* size (0 = byte, 1 = short, 2 = long) */
453 TRUE, /* pc_relative */
455 complain_overflow_signed,/* complain_on_overflow */
456 bfd_elf_generic_reloc, /* special_function */
457 "R_ARM_CALL", /* name */
458 FALSE, /* partial_inplace */
459 0x00ffffff, /* src_mask */
460 0x00ffffff, /* dst_mask */
461 TRUE), /* pcrel_offset */
463 HOWTO (R_ARM_JUMP24, /* type */
465 2, /* size (0 = byte, 1 = short, 2 = long) */
467 TRUE, /* pc_relative */
469 complain_overflow_signed,/* complain_on_overflow */
470 bfd_elf_generic_reloc, /* special_function */
471 "R_ARM_JUMP24", /* name */
472 FALSE, /* partial_inplace */
473 0x00ffffff, /* src_mask */
474 0x00ffffff, /* dst_mask */
475 TRUE), /* pcrel_offset */
477 HOWTO (R_ARM_THM_JUMP24, /* type */
479 2, /* size (0 = byte, 1 = short, 2 = long) */
481 TRUE, /* pc_relative */
483 complain_overflow_signed,/* complain_on_overflow */
484 bfd_elf_generic_reloc, /* special_function */
485 "R_ARM_THM_JUMP24", /* name */
486 FALSE, /* partial_inplace */
487 0x07ff2fff, /* src_mask */
488 0x07ff2fff, /* dst_mask */
489 TRUE), /* pcrel_offset */
491 HOWTO (R_ARM_BASE_ABS, /* type */
493 2, /* size (0 = byte, 1 = short, 2 = long) */
495 FALSE, /* pc_relative */
497 complain_overflow_dont,/* complain_on_overflow */
498 bfd_elf_generic_reloc, /* special_function */
499 "R_ARM_BASE_ABS", /* name */
500 FALSE, /* partial_inplace */
501 0xffffffff, /* src_mask */
502 0xffffffff, /* dst_mask */
503 FALSE), /* pcrel_offset */
505 HOWTO (R_ARM_ALU_PCREL7_0, /* type */
507 2, /* size (0 = byte, 1 = short, 2 = long) */
509 TRUE, /* pc_relative */
511 complain_overflow_dont,/* complain_on_overflow */
512 bfd_elf_generic_reloc, /* special_function */
513 "R_ARM_ALU_PCREL_7_0", /* name */
514 FALSE, /* partial_inplace */
515 0x00000fff, /* src_mask */
516 0x00000fff, /* dst_mask */
517 TRUE), /* pcrel_offset */
519 HOWTO (R_ARM_ALU_PCREL15_8, /* type */
521 2, /* size (0 = byte, 1 = short, 2 = long) */
523 TRUE, /* pc_relative */
525 complain_overflow_dont,/* complain_on_overflow */
526 bfd_elf_generic_reloc, /* special_function */
527 "R_ARM_ALU_PCREL_15_8",/* name */
528 FALSE, /* partial_inplace */
529 0x00000fff, /* src_mask */
530 0x00000fff, /* dst_mask */
531 TRUE), /* pcrel_offset */
533 HOWTO (R_ARM_ALU_PCREL23_15, /* type */
535 2, /* size (0 = byte, 1 = short, 2 = long) */
537 TRUE, /* pc_relative */
539 complain_overflow_dont,/* complain_on_overflow */
540 bfd_elf_generic_reloc, /* special_function */
541 "R_ARM_ALU_PCREL_23_15",/* name */
542 FALSE, /* partial_inplace */
543 0x00000fff, /* src_mask */
544 0x00000fff, /* dst_mask */
545 TRUE), /* pcrel_offset */
547 HOWTO (R_ARM_LDR_SBREL_11_0, /* type */
549 2, /* size (0 = byte, 1 = short, 2 = long) */
551 FALSE, /* pc_relative */
553 complain_overflow_dont,/* complain_on_overflow */
554 bfd_elf_generic_reloc, /* special_function */
555 "R_ARM_LDR_SBREL_11_0",/* name */
556 FALSE, /* partial_inplace */
557 0x00000fff, /* src_mask */
558 0x00000fff, /* dst_mask */
559 FALSE), /* pcrel_offset */
561 HOWTO (R_ARM_ALU_SBREL_19_12, /* type */
563 2, /* size (0 = byte, 1 = short, 2 = long) */
565 FALSE, /* pc_relative */
567 complain_overflow_dont,/* complain_on_overflow */
568 bfd_elf_generic_reloc, /* special_function */
569 "R_ARM_ALU_SBREL_19_12",/* name */
570 FALSE, /* partial_inplace */
571 0x000ff000, /* src_mask */
572 0x000ff000, /* dst_mask */
573 FALSE), /* pcrel_offset */
575 HOWTO (R_ARM_ALU_SBREL_27_20, /* type */
577 2, /* size (0 = byte, 1 = short, 2 = long) */
579 FALSE, /* pc_relative */
581 complain_overflow_dont,/* complain_on_overflow */
582 bfd_elf_generic_reloc, /* special_function */
583 "R_ARM_ALU_SBREL_27_20",/* name */
584 FALSE, /* partial_inplace */
585 0x0ff00000, /* src_mask */
586 0x0ff00000, /* dst_mask */
587 FALSE), /* pcrel_offset */
589 HOWTO (R_ARM_TARGET1, /* type */
591 2, /* size (0 = byte, 1 = short, 2 = long) */
593 FALSE, /* pc_relative */
595 complain_overflow_dont,/* complain_on_overflow */
596 bfd_elf_generic_reloc, /* special_function */
597 "R_ARM_TARGET1", /* name */
598 FALSE, /* partial_inplace */
599 0xffffffff, /* src_mask */
600 0xffffffff, /* dst_mask */
601 FALSE), /* pcrel_offset */
603 HOWTO (R_ARM_ROSEGREL32, /* type */
605 2, /* size (0 = byte, 1 = short, 2 = long) */
607 FALSE, /* pc_relative */
609 complain_overflow_dont,/* complain_on_overflow */
610 bfd_elf_generic_reloc, /* special_function */
611 "R_ARM_ROSEGREL32", /* name */
612 FALSE, /* partial_inplace */
613 0xffffffff, /* src_mask */
614 0xffffffff, /* dst_mask */
615 FALSE), /* pcrel_offset */
617 HOWTO (R_ARM_V4BX, /* type */
619 2, /* size (0 = byte, 1 = short, 2 = long) */
621 FALSE, /* pc_relative */
623 complain_overflow_dont,/* complain_on_overflow */
624 bfd_elf_generic_reloc, /* special_function */
625 "R_ARM_V4BX", /* name */
626 FALSE, /* partial_inplace */
627 0xffffffff, /* src_mask */
628 0xffffffff, /* dst_mask */
629 FALSE), /* pcrel_offset */
631 HOWTO (R_ARM_TARGET2, /* type */
633 2, /* size (0 = byte, 1 = short, 2 = long) */
635 FALSE, /* pc_relative */
637 complain_overflow_signed,/* complain_on_overflow */
638 bfd_elf_generic_reloc, /* special_function */
639 "R_ARM_TARGET2", /* name */
640 FALSE, /* partial_inplace */
641 0xffffffff, /* src_mask */
642 0xffffffff, /* dst_mask */
643 TRUE), /* pcrel_offset */
645 HOWTO (R_ARM_PREL31, /* type */
647 2, /* size (0 = byte, 1 = short, 2 = long) */
649 TRUE, /* pc_relative */
651 complain_overflow_signed,/* complain_on_overflow */
652 bfd_elf_generic_reloc, /* special_function */
653 "R_ARM_PREL31", /* name */
654 FALSE, /* partial_inplace */
655 0x7fffffff, /* src_mask */
656 0x7fffffff, /* dst_mask */
657 TRUE), /* pcrel_offset */
659 HOWTO (R_ARM_MOVW_ABS_NC, /* type */
661 2, /* size (0 = byte, 1 = short, 2 = long) */
663 FALSE, /* pc_relative */
665 complain_overflow_dont,/* complain_on_overflow */
666 bfd_elf_generic_reloc, /* special_function */
667 "R_ARM_MOVW_ABS_NC", /* name */
668 FALSE, /* partial_inplace */
669 0x0000ffff, /* src_mask */
670 0x0000ffff, /* dst_mask */
671 FALSE), /* pcrel_offset */
673 HOWTO (R_ARM_MOVT_ABS, /* type */
675 2, /* size (0 = byte, 1 = short, 2 = long) */
677 FALSE, /* pc_relative */
679 complain_overflow_bitfield,/* complain_on_overflow */
680 bfd_elf_generic_reloc, /* special_function */
681 "R_ARM_MOVT_ABS", /* name */
682 FALSE, /* partial_inplace */
683 0x0000ffff, /* src_mask */
684 0x0000ffff, /* dst_mask */
685 FALSE), /* pcrel_offset */
687 HOWTO (R_ARM_MOVW_PREL_NC, /* type */
689 2, /* size (0 = byte, 1 = short, 2 = long) */
691 TRUE, /* pc_relative */
693 complain_overflow_dont,/* complain_on_overflow */
694 bfd_elf_generic_reloc, /* special_function */
695 "R_ARM_MOVW_PREL_NC", /* name */
696 FALSE, /* partial_inplace */
697 0x0000ffff, /* src_mask */
698 0x0000ffff, /* dst_mask */
699 TRUE), /* pcrel_offset */
701 HOWTO (R_ARM_MOVT_PREL, /* type */
703 2, /* size (0 = byte, 1 = short, 2 = long) */
705 TRUE, /* pc_relative */
707 complain_overflow_bitfield,/* complain_on_overflow */
708 bfd_elf_generic_reloc, /* special_function */
709 "R_ARM_MOVT_PREL", /* name */
710 FALSE, /* partial_inplace */
711 0x0000ffff, /* src_mask */
712 0x0000ffff, /* dst_mask */
713 TRUE), /* pcrel_offset */
715 HOWTO (R_ARM_THM_MOVW_ABS_NC, /* type */
717 2, /* size (0 = byte, 1 = short, 2 = long) */
719 FALSE, /* pc_relative */
721 complain_overflow_dont,/* complain_on_overflow */
722 bfd_elf_generic_reloc, /* special_function */
723 "R_ARM_THM_MOVW_ABS_NC",/* name */
724 FALSE, /* partial_inplace */
725 0x040f70ff, /* src_mask */
726 0x040f70ff, /* dst_mask */
727 FALSE), /* pcrel_offset */
729 HOWTO (R_ARM_THM_MOVT_ABS, /* type */
731 2, /* size (0 = byte, 1 = short, 2 = long) */
733 FALSE, /* pc_relative */
735 complain_overflow_bitfield,/* complain_on_overflow */
736 bfd_elf_generic_reloc, /* special_function */
737 "R_ARM_THM_MOVT_ABS", /* name */
738 FALSE, /* partial_inplace */
739 0x040f70ff, /* src_mask */
740 0x040f70ff, /* dst_mask */
741 FALSE), /* pcrel_offset */
743 HOWTO (R_ARM_THM_MOVW_PREL_NC,/* type */
745 2, /* size (0 = byte, 1 = short, 2 = long) */
747 TRUE, /* pc_relative */
749 complain_overflow_dont,/* complain_on_overflow */
750 bfd_elf_generic_reloc, /* special_function */
751 "R_ARM_THM_MOVW_PREL_NC",/* name */
752 FALSE, /* partial_inplace */
753 0x040f70ff, /* src_mask */
754 0x040f70ff, /* dst_mask */
755 TRUE), /* pcrel_offset */
757 HOWTO (R_ARM_THM_MOVT_PREL, /* type */
759 2, /* size (0 = byte, 1 = short, 2 = long) */
761 TRUE, /* pc_relative */
763 complain_overflow_bitfield,/* complain_on_overflow */
764 bfd_elf_generic_reloc, /* special_function */
765 "R_ARM_THM_MOVT_PREL", /* name */
766 FALSE, /* partial_inplace */
767 0x040f70ff, /* src_mask */
768 0x040f70ff, /* dst_mask */
769 TRUE), /* pcrel_offset */
771 HOWTO (R_ARM_THM_JUMP19, /* type */
773 2, /* size (0 = byte, 1 = short, 2 = long) */
775 TRUE, /* pc_relative */
777 complain_overflow_signed,/* complain_on_overflow */
778 bfd_elf_generic_reloc, /* special_function */
779 "R_ARM_THM_JUMP19", /* name */
780 FALSE, /* partial_inplace */
781 0x043f2fff, /* src_mask */
782 0x043f2fff, /* dst_mask */
783 TRUE), /* pcrel_offset */
785 HOWTO (R_ARM_THM_JUMP6, /* type */
787 1, /* size (0 = byte, 1 = short, 2 = long) */
789 TRUE, /* pc_relative */
791 complain_overflow_unsigned,/* complain_on_overflow */
792 bfd_elf_generic_reloc, /* special_function */
793 "R_ARM_THM_JUMP6", /* name */
794 FALSE, /* partial_inplace */
795 0x02f8, /* src_mask */
796 0x02f8, /* dst_mask */
797 TRUE), /* pcrel_offset */
799 /* These are declared as 13-bit signed relocations because we can
800 address -4095 .. 4095(base) by altering ADDW to SUBW or vice
802 HOWTO (R_ARM_THM_ALU_PREL_11_0,/* type */
804 2, /* size (0 = byte, 1 = short, 2 = long) */
806 TRUE, /* pc_relative */
808 complain_overflow_signed,/* complain_on_overflow */
809 bfd_elf_generic_reloc, /* special_function */
810 "R_ARM_THM_ALU_PREL_11_0",/* name */
811 FALSE, /* partial_inplace */
812 0x040070ff, /* src_mask */
813 0x040070ff, /* dst_mask */
814 TRUE), /* pcrel_offset */
816 HOWTO (R_ARM_THM_PC12, /* type */
818 2, /* size (0 = byte, 1 = short, 2 = long) */
820 TRUE, /* pc_relative */
822 complain_overflow_signed,/* complain_on_overflow */
823 bfd_elf_generic_reloc, /* special_function */
824 "R_ARM_THM_PC12", /* name */
825 FALSE, /* partial_inplace */
826 0x040070ff, /* src_mask */
827 0x040070ff, /* dst_mask */
828 TRUE), /* pcrel_offset */
830 HOWTO (R_ARM_ABS32_NOI, /* type */
832 2, /* size (0 = byte, 1 = short, 2 = long) */
834 FALSE, /* pc_relative */
836 complain_overflow_dont,/* complain_on_overflow */
837 bfd_elf_generic_reloc, /* special_function */
838 "R_ARM_ABS32_NOI", /* name */
839 FALSE, /* partial_inplace */
840 0xffffffff, /* src_mask */
841 0xffffffff, /* dst_mask */
842 FALSE), /* pcrel_offset */
844 HOWTO (R_ARM_REL32_NOI, /* type */
846 2, /* size (0 = byte, 1 = short, 2 = long) */
848 TRUE, /* pc_relative */
850 complain_overflow_dont,/* complain_on_overflow */
851 bfd_elf_generic_reloc, /* special_function */
852 "R_ARM_REL32_NOI", /* name */
853 FALSE, /* partial_inplace */
854 0xffffffff, /* src_mask */
855 0xffffffff, /* dst_mask */
856 FALSE), /* pcrel_offset */
859 /* Relocations 57 .. 83 are the "group relocations" which we do not
862 static reloc_howto_type elf32_arm_howto_table_2[] =
864 HOWTO (R_ARM_MOVW_BREL_NC, /* type */
866 2, /* size (0 = byte, 1 = short, 2 = long) */
868 FALSE, /* pc_relative */
870 complain_overflow_dont,/* complain_on_overflow */
871 bfd_elf_generic_reloc, /* special_function */
872 "R_ARM_MOVW_BREL_NC", /* name */
873 FALSE, /* partial_inplace */
874 0x0000ffff, /* src_mask */
875 0x0000ffff, /* dst_mask */
876 FALSE), /* pcrel_offset */
878 HOWTO (R_ARM_MOVT_BREL, /* type */
880 2, /* size (0 = byte, 1 = short, 2 = long) */
882 FALSE, /* pc_relative */
884 complain_overflow_bitfield,/* complain_on_overflow */
885 bfd_elf_generic_reloc, /* special_function */
886 "R_ARM_MOVT_BREL", /* name */
887 FALSE, /* partial_inplace */
888 0x0000ffff, /* src_mask */
889 0x0000ffff, /* dst_mask */
890 FALSE), /* pcrel_offset */
892 HOWTO (R_ARM_MOVW_BREL, /* type */
894 2, /* size (0 = byte, 1 = short, 2 = long) */
896 FALSE, /* pc_relative */
898 complain_overflow_dont,/* complain_on_overflow */
899 bfd_elf_generic_reloc, /* special_function */
900 "R_ARM_MOVW_BREL", /* name */
901 FALSE, /* partial_inplace */
902 0x0000ffff, /* src_mask */
903 0x0000ffff, /* dst_mask */
904 FALSE), /* pcrel_offset */
906 HOWTO (R_ARM_THM_MOVW_BREL_NC,/* type */
908 2, /* size (0 = byte, 1 = short, 2 = long) */
910 FALSE, /* pc_relative */
912 complain_overflow_dont,/* complain_on_overflow */
913 bfd_elf_generic_reloc, /* special_function */
914 "R_ARM_THM_MOVW_BREL_NC",/* name */
915 FALSE, /* partial_inplace */
916 0x040f70ff, /* src_mask */
917 0x040f70ff, /* dst_mask */
918 FALSE), /* pcrel_offset */
920 HOWTO (R_ARM_THM_MOVT_BREL, /* type */
922 2, /* size (0 = byte, 1 = short, 2 = long) */
924 FALSE, /* pc_relative */
926 complain_overflow_bitfield,/* complain_on_overflow */
927 bfd_elf_generic_reloc, /* special_function */
928 "R_ARM_THM_MOVT_BREL", /* name */
929 FALSE, /* partial_inplace */
930 0x040f70ff, /* src_mask */
931 0x040f70ff, /* dst_mask */
932 FALSE), /* pcrel_offset */
934 HOWTO (R_ARM_THM_MOVW_BREL, /* type */
936 2, /* size (0 = byte, 1 = short, 2 = long) */
938 FALSE, /* pc_relative */
940 complain_overflow_dont,/* complain_on_overflow */
941 bfd_elf_generic_reloc, /* special_function */
942 "R_ARM_THM_MOVW_BREL", /* name */
943 FALSE, /* partial_inplace */
944 0x040f70ff, /* src_mask */
945 0x040f70ff, /* dst_mask */
946 FALSE), /* pcrel_offset */
948 EMPTY_HOWTO (90), /* unallocated */
953 HOWTO (R_ARM_PLT32_ABS, /* type */
955 2, /* size (0 = byte, 1 = short, 2 = long) */
957 FALSE, /* pc_relative */
959 complain_overflow_dont,/* complain_on_overflow */
960 bfd_elf_generic_reloc, /* special_function */
961 "R_ARM_PLT32_ABS", /* name */
962 FALSE, /* partial_inplace */
963 0xffffffff, /* src_mask */
964 0xffffffff, /* dst_mask */
965 FALSE), /* pcrel_offset */
967 HOWTO (R_ARM_GOT_ABS, /* type */
969 2, /* size (0 = byte, 1 = short, 2 = long) */
971 FALSE, /* pc_relative */
973 complain_overflow_dont,/* complain_on_overflow */
974 bfd_elf_generic_reloc, /* special_function */
975 "R_ARM_GOT_ABS", /* name */
976 FALSE, /* partial_inplace */
977 0xffffffff, /* src_mask */
978 0xffffffff, /* dst_mask */
979 FALSE), /* pcrel_offset */
981 HOWTO (R_ARM_GOT_PREL, /* type */
983 2, /* size (0 = byte, 1 = short, 2 = long) */
985 TRUE, /* pc_relative */
987 complain_overflow_dont, /* complain_on_overflow */
988 bfd_elf_generic_reloc, /* special_function */
989 "R_ARM_GOT_PREL", /* name */
990 FALSE, /* partial_inplace */
991 0xffffffff, /* src_mask */
992 0xffffffff, /* dst_mask */
993 TRUE), /* pcrel_offset */
995 HOWTO (R_ARM_GOT_BREL12, /* type */
997 2, /* size (0 = byte, 1 = short, 2 = long) */
999 FALSE, /* pc_relative */
1001 complain_overflow_bitfield,/* complain_on_overflow */
1002 bfd_elf_generic_reloc, /* special_function */
1003 "R_ARM_GOT_BREL12", /* name */
1004 FALSE, /* partial_inplace */
1005 0x00000fff, /* src_mask */
1006 0x00000fff, /* dst_mask */
1007 FALSE), /* pcrel_offset */
1009 HOWTO (R_ARM_GOTOFF12, /* type */
1011 2, /* size (0 = byte, 1 = short, 2 = long) */
1013 FALSE, /* pc_relative */
1015 complain_overflow_bitfield,/* complain_on_overflow */
1016 bfd_elf_generic_reloc, /* special_function */
1017 "R_ARM_GOTOFF12", /* name */
1018 FALSE, /* partial_inplace */
1019 0x00000fff, /* src_mask */
1020 0x00000fff, /* dst_mask */
1021 FALSE), /* pcrel_offset */
1023 EMPTY_HOWTO (R_ARM_GOTRELAX), /* reserved for future GOT-load optimizations */
1025 /* GNU extension to record C++ vtable member usage */
1026 HOWTO (R_ARM_GNU_VTENTRY, /* type */
1028 2, /* size (0 = byte, 1 = short, 2 = long) */
1030 FALSE, /* pc_relative */
1032 complain_overflow_dont, /* complain_on_overflow */
1033 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1034 "R_ARM_GNU_VTENTRY", /* name */
1035 FALSE, /* partial_inplace */
1038 FALSE), /* pcrel_offset */
1040 /* GNU extension to record C++ vtable hierarchy */
1041 HOWTO (R_ARM_GNU_VTINHERIT, /* type */
1043 2, /* size (0 = byte, 1 = short, 2 = long) */
1045 FALSE, /* pc_relative */
1047 complain_overflow_dont, /* complain_on_overflow */
1048 NULL, /* special_function */
1049 "R_ARM_GNU_VTINHERIT", /* name */
1050 FALSE, /* partial_inplace */
1053 FALSE), /* pcrel_offset */
1055 HOWTO (R_ARM_THM_JUMP11, /* type */
1057 1, /* size (0 = byte, 1 = short, 2 = long) */
1059 TRUE, /* pc_relative */
1061 complain_overflow_signed, /* complain_on_overflow */
1062 bfd_elf_generic_reloc, /* special_function */
1063 "R_ARM_THM_JUMP11", /* name */
1064 FALSE, /* partial_inplace */
1065 0x000007ff, /* src_mask */
1066 0x000007ff, /* dst_mask */
1067 TRUE), /* pcrel_offset */
1069 HOWTO (R_ARM_THM_JUMP8, /* type */
1071 1, /* size (0 = byte, 1 = short, 2 = long) */
1073 TRUE, /* pc_relative */
1075 complain_overflow_signed, /* complain_on_overflow */
1076 bfd_elf_generic_reloc, /* special_function */
1077 "R_ARM_THM_JUMP8", /* name */
1078 FALSE, /* partial_inplace */
1079 0x000000ff, /* src_mask */
1080 0x000000ff, /* dst_mask */
1081 TRUE), /* pcrel_offset */
1083 /* TLS relocations */
1084 HOWTO (R_ARM_TLS_GD32, /* type */
1086 2, /* size (0 = byte, 1 = short, 2 = long) */
1088 FALSE, /* pc_relative */
1090 complain_overflow_bitfield,/* complain_on_overflow */
1091 NULL, /* special_function */
1092 "R_ARM_TLS_GD32", /* name */
1093 TRUE, /* partial_inplace */
1094 0xffffffff, /* src_mask */
1095 0xffffffff, /* dst_mask */
1096 FALSE), /* pcrel_offset */
1098 HOWTO (R_ARM_TLS_LDM32, /* type */
1100 2, /* size (0 = byte, 1 = short, 2 = long) */
1102 FALSE, /* pc_relative */
1104 complain_overflow_bitfield,/* complain_on_overflow */
1105 bfd_elf_generic_reloc, /* special_function */
1106 "R_ARM_TLS_LDM32", /* name */
1107 TRUE, /* partial_inplace */
1108 0xffffffff, /* src_mask */
1109 0xffffffff, /* dst_mask */
1110 FALSE), /* pcrel_offset */
1112 HOWTO (R_ARM_TLS_LDO32, /* type */
1114 2, /* size (0 = byte, 1 = short, 2 = long) */
1116 FALSE, /* pc_relative */
1118 complain_overflow_bitfield,/* complain_on_overflow */
1119 bfd_elf_generic_reloc, /* special_function */
1120 "R_ARM_TLS_LDO32", /* name */
1121 TRUE, /* partial_inplace */
1122 0xffffffff, /* src_mask */
1123 0xffffffff, /* dst_mask */
1124 FALSE), /* pcrel_offset */
1126 HOWTO (R_ARM_TLS_IE32, /* type */
1128 2, /* size (0 = byte, 1 = short, 2 = long) */
1130 FALSE, /* pc_relative */
1132 complain_overflow_bitfield,/* complain_on_overflow */
1133 NULL, /* special_function */
1134 "R_ARM_TLS_IE32", /* name */
1135 TRUE, /* partial_inplace */
1136 0xffffffff, /* src_mask */
1137 0xffffffff, /* dst_mask */
1138 FALSE), /* pcrel_offset */
1140 HOWTO (R_ARM_TLS_LE32, /* type */
1142 2, /* size (0 = byte, 1 = short, 2 = long) */
1144 FALSE, /* pc_relative */
1146 complain_overflow_bitfield,/* complain_on_overflow */
1147 bfd_elf_generic_reloc, /* special_function */
1148 "R_ARM_TLS_LE32", /* name */
1149 TRUE, /* partial_inplace */
1150 0xffffffff, /* src_mask */
1151 0xffffffff, /* dst_mask */
1152 FALSE), /* pcrel_offset */
1154 HOWTO (R_ARM_TLS_LDO12, /* type */
1156 2, /* size (0 = byte, 1 = short, 2 = long) */
1158 FALSE, /* pc_relative */
1160 complain_overflow_bitfield,/* complain_on_overflow */
1161 bfd_elf_generic_reloc, /* special_function */
1162 "R_ARM_TLS_LDO12", /* name */
1163 FALSE, /* partial_inplace */
1164 0x00000fff, /* src_mask */
1165 0x00000fff, /* dst_mask */
1166 FALSE), /* pcrel_offset */
1168 HOWTO (R_ARM_TLS_LE12, /* type */
1170 2, /* size (0 = byte, 1 = short, 2 = long) */
1172 FALSE, /* pc_relative */
1174 complain_overflow_bitfield,/* complain_on_overflow */
1175 bfd_elf_generic_reloc, /* special_function */
1176 "R_ARM_TLS_LE12", /* name */
1177 FALSE, /* partial_inplace */
1178 0x00000fff, /* src_mask */
1179 0x00000fff, /* dst_mask */
1180 FALSE), /* pcrel_offset */
1182 HOWTO (R_ARM_TLS_IE12GP, /* type */
1184 2, /* size (0 = byte, 1 = short, 2 = long) */
1186 FALSE, /* pc_relative */
1188 complain_overflow_bitfield,/* complain_on_overflow */
1189 bfd_elf_generic_reloc, /* special_function */
1190 "R_ARM_TLS_IE12GP", /* name */
1191 FALSE, /* partial_inplace */
1192 0x00000fff, /* src_mask */
1193 0x00000fff, /* dst_mask */
1194 FALSE), /* pcrel_offset */
1197 /* 112-127 private relocations
1198 128 R_ARM_ME_TOO, obsolete
1199 129-255 unallocated in AAELF.
1201 249-255 extended, currently unused, relocations: */
1203 static reloc_howto_type elf32_arm_howto_table_3[4] =
1205 HOWTO (R_ARM_RREL32, /* type */
1207 0, /* size (0 = byte, 1 = short, 2 = long) */
1209 FALSE, /* pc_relative */
1211 complain_overflow_dont,/* complain_on_overflow */
1212 bfd_elf_generic_reloc, /* special_function */
1213 "R_ARM_RREL32", /* name */
1214 FALSE, /* partial_inplace */
1217 FALSE), /* pcrel_offset */
1219 HOWTO (R_ARM_RABS32, /* type */
1221 0, /* size (0 = byte, 1 = short, 2 = long) */
1223 FALSE, /* pc_relative */
1225 complain_overflow_dont,/* complain_on_overflow */
1226 bfd_elf_generic_reloc, /* special_function */
1227 "R_ARM_RABS32", /* name */
1228 FALSE, /* partial_inplace */
1231 FALSE), /* pcrel_offset */
1233 HOWTO (R_ARM_RPC24, /* type */
1235 0, /* size (0 = byte, 1 = short, 2 = long) */
1237 FALSE, /* pc_relative */
1239 complain_overflow_dont,/* complain_on_overflow */
1240 bfd_elf_generic_reloc, /* special_function */
1241 "R_ARM_RPC24", /* name */
1242 FALSE, /* partial_inplace */
1245 FALSE), /* pcrel_offset */
1247 HOWTO (R_ARM_RBASE, /* type */
1249 0, /* size (0 = byte, 1 = short, 2 = long) */
1251 FALSE, /* pc_relative */
1253 complain_overflow_dont,/* complain_on_overflow */
1254 bfd_elf_generic_reloc, /* special_function */
1255 "R_ARM_RBASE", /* name */
1256 FALSE, /* partial_inplace */
1259 FALSE) /* pcrel_offset */
1262 static reloc_howto_type *
1263 elf32_arm_howto_from_type (unsigned int r_type)
1265 if (r_type < NUM_ELEM (elf32_arm_howto_table_1))
1266 return &elf32_arm_howto_table_1[r_type];
1268 if (r_type >= R_ARM_MOVW_BREL_NC
1269 && r_type < R_ARM_MOVW_BREL_NC + NUM_ELEM (elf32_arm_howto_table_2))
1270 return &elf32_arm_howto_table_2[r_type - R_ARM_MOVW_BREL_NC];
1272 if (r_type >= R_ARM_RREL32
1273 && r_type < R_ARM_RREL32 + NUM_ELEM (elf32_arm_howto_table_2))
1274 return &elf32_arm_howto_table_3[r_type - R_ARM_RREL32];
1280 elf32_arm_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED, arelent * bfd_reloc,
1281 Elf_Internal_Rela * elf_reloc)
1283 unsigned int r_type;
1285 r_type = ELF32_R_TYPE (elf_reloc->r_info);
1286 bfd_reloc->howto = elf32_arm_howto_from_type (r_type);
1289 struct elf32_arm_reloc_map
1291 bfd_reloc_code_real_type bfd_reloc_val;
1292 unsigned char elf_reloc_val;
1295 /* All entries in this list must also be present in elf32_arm_howto_table. */
1296 static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
1298 {BFD_RELOC_NONE, R_ARM_NONE},
1299 {BFD_RELOC_ARM_PCREL_BRANCH, R_ARM_PC24},
1300 {BFD_RELOC_ARM_PCREL_BLX, R_ARM_XPC25},
1301 {BFD_RELOC_THUMB_PCREL_BLX, R_ARM_THM_XPC22},
1302 {BFD_RELOC_32, R_ARM_ABS32},
1303 {BFD_RELOC_32_PCREL, R_ARM_REL32},
1304 {BFD_RELOC_8, R_ARM_ABS8},
1305 {BFD_RELOC_16, R_ARM_ABS16},
1306 {BFD_RELOC_ARM_OFFSET_IMM, R_ARM_ABS12},
1307 {BFD_RELOC_ARM_THUMB_OFFSET, R_ARM_THM_ABS5},
1308 {BFD_RELOC_THUMB_PCREL_BRANCH25, R_ARM_THM_JUMP24},
1309 {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_CALL},
1310 {BFD_RELOC_THUMB_PCREL_BRANCH12, R_ARM_THM_JUMP11},
1311 {BFD_RELOC_THUMB_PCREL_BRANCH20, R_ARM_THM_JUMP19},
1312 {BFD_RELOC_THUMB_PCREL_BRANCH9, R_ARM_THM_JUMP8},
1313 {BFD_RELOC_THUMB_PCREL_BRANCH7, R_ARM_THM_JUMP6},
1314 {BFD_RELOC_ARM_GLOB_DAT, R_ARM_GLOB_DAT},
1315 {BFD_RELOC_ARM_JUMP_SLOT, R_ARM_JUMP_SLOT},
1316 {BFD_RELOC_ARM_RELATIVE, R_ARM_RELATIVE},
1317 {BFD_RELOC_ARM_GOTOFF, R_ARM_GOTOFF32},
1318 {BFD_RELOC_ARM_GOTPC, R_ARM_GOTPC},
1319 {BFD_RELOC_ARM_GOT32, R_ARM_GOT32},
1320 {BFD_RELOC_ARM_PLT32, R_ARM_PLT32},
1321 {BFD_RELOC_ARM_TARGET1, R_ARM_TARGET1},
1322 {BFD_RELOC_ARM_ROSEGREL32, R_ARM_ROSEGREL32},
1323 {BFD_RELOC_ARM_SBREL32, R_ARM_SBREL32},
1324 {BFD_RELOC_ARM_PREL31, R_ARM_PREL31},
1325 {BFD_RELOC_ARM_TARGET2, R_ARM_TARGET2},
1326 {BFD_RELOC_ARM_PLT32, R_ARM_PLT32},
1327 {BFD_RELOC_ARM_TLS_GD32, R_ARM_TLS_GD32},
1328 {BFD_RELOC_ARM_TLS_LDO32, R_ARM_TLS_LDO32},
1329 {BFD_RELOC_ARM_TLS_LDM32, R_ARM_TLS_LDM32},
1330 {BFD_RELOC_ARM_TLS_DTPMOD32, R_ARM_TLS_DTPMOD32},
1331 {BFD_RELOC_ARM_TLS_DTPOFF32, R_ARM_TLS_DTPOFF32},
1332 {BFD_RELOC_ARM_TLS_TPOFF32, R_ARM_TLS_TPOFF32},
1333 {BFD_RELOC_ARM_TLS_IE32, R_ARM_TLS_IE32},
1334 {BFD_RELOC_ARM_TLS_LE32, R_ARM_TLS_LE32},
1335 {BFD_RELOC_VTABLE_INHERIT, R_ARM_GNU_VTINHERIT},
1336 {BFD_RELOC_VTABLE_ENTRY, R_ARM_GNU_VTENTRY},
1339 static reloc_howto_type *
1340 elf32_arm_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1341 bfd_reloc_code_real_type code)
1344 for (i = 0; i < NUM_ELEM (elf32_arm_reloc_map); i ++)
1345 if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
1346 return elf32_arm_howto_from_type (elf32_arm_reloc_map[i].elf_reloc_val);
1351 /* Support for core dump NOTE sections */
1353 elf32_arm_nabi_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1358 switch (note->descsz)
1363 case 148: /* Linux/ARM 32-bit*/
1365 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1368 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1377 /* Make a ".reg/999" section. */
1378 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1379 size, note->descpos + offset);
1383 elf32_arm_nabi_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1385 switch (note->descsz)
1390 case 124: /* Linux/ARM elf_prpsinfo */
1391 elf_tdata (abfd)->core_program
1392 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1393 elf_tdata (abfd)->core_command
1394 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1397 /* Note that for some reason, a spurious space is tacked
1398 onto the end of the args in some (at least one anyway)
1399 implementations, so strip it off if it exists. */
1402 char *command = elf_tdata (abfd)->core_command;
1403 int n = strlen (command);
1405 if (0 < n && command[n - 1] == ' ')
1406 command[n - 1] = '\0';
1412 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vec
1413 #define TARGET_LITTLE_NAME "elf32-littlearm"
1414 #define TARGET_BIG_SYM bfd_elf32_bigarm_vec
1415 #define TARGET_BIG_NAME "elf32-bigarm"
1417 #define elf_backend_grok_prstatus elf32_arm_nabi_grok_prstatus
1418 #define elf_backend_grok_psinfo elf32_arm_nabi_grok_psinfo
1420 typedef unsigned long int insn32;
1421 typedef unsigned short int insn16;
1423 /* In lieu of proper flags, assume all EABIv4 objects are interworkable. */
1424 #define INTERWORK_FLAG(abfd) \
1425 (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) == EF_ARM_EABI_VER4 \
1426 || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK))
1428 /* The linker script knows the section names for placement.
1429 The entry_names are used to do simple name mangling on the stubs.
1430 Given a function name, and its type, the stub can be found. The
1431 name can be changed. The only requirement is the %s be present. */
1432 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
1433 #define THUMB2ARM_GLUE_ENTRY_NAME "__%s_from_thumb"
1435 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
1436 #define ARM2THUMB_GLUE_ENTRY_NAME "__%s_from_arm"
1438 /* The name of the dynamic interpreter. This is put in the .interp
1440 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
1442 #ifdef FOUR_WORD_PLT
1444 /* The first entry in a procedure linkage table looks like
1445 this. It is set up so that any shared library function that is
1446 called before the relocation has been set up calls the dynamic
1448 static const bfd_vma elf32_arm_plt0_entry [] =
1450 0xe52de004, /* str lr, [sp, #-4]! */
1451 0xe59fe010, /* ldr lr, [pc, #16] */
1452 0xe08fe00e, /* add lr, pc, lr */
1453 0xe5bef008, /* ldr pc, [lr, #8]! */
1456 /* Subsequent entries in a procedure linkage table look like
1458 static const bfd_vma elf32_arm_plt_entry [] =
1460 0xe28fc600, /* add ip, pc, #NN */
1461 0xe28cca00, /* add ip, ip, #NN */
1462 0xe5bcf000, /* ldr pc, [ip, #NN]! */
1463 0x00000000, /* unused */
1468 /* The first entry in a procedure linkage table looks like
1469 this. It is set up so that any shared library function that is
1470 called before the relocation has been set up calls the dynamic
1472 static const bfd_vma elf32_arm_plt0_entry [] =
1474 0xe52de004, /* str lr, [sp, #-4]! */
1475 0xe59fe004, /* ldr lr, [pc, #4] */
1476 0xe08fe00e, /* add lr, pc, lr */
1477 0xe5bef008, /* ldr pc, [lr, #8]! */
1478 0x00000000, /* &GOT[0] - . */
1481 /* Subsequent entries in a procedure linkage table look like
1483 static const bfd_vma elf32_arm_plt_entry [] =
1485 0xe28fc600, /* add ip, pc, #0xNN00000 */
1486 0xe28cca00, /* add ip, ip, #0xNN000 */
1487 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */
1492 /* An initial stub used if the PLT entry is referenced from Thumb code. */
1493 #define PLT_THUMB_STUB_SIZE 4
1494 static const bfd_vma elf32_arm_plt_thumb_stub [] =
1500 /* The entries in a PLT when using a DLL-based target with multiple
1502 static const bfd_vma elf32_arm_symbian_plt_entry [] =
1504 0xe51ff004, /* ldr pc, [pc, #-4] */
1505 0x00000000, /* dcd R_ARM_GLOB_DAT(X) */
1508 /* Used to build a map of a section. This is required for mixed-endian
1511 typedef struct elf32_elf_section_map
1516 elf32_arm_section_map;
1518 typedef struct _arm_elf_section_data
1520 struct bfd_elf_section_data elf;
1521 unsigned int mapcount;
1522 elf32_arm_section_map *map;
1524 _arm_elf_section_data;
1526 #define elf32_arm_section_data(sec) \
1527 ((_arm_elf_section_data *) elf_section_data (sec))
1529 /* The size of the thread control block. */
1532 struct elf32_arm_obj_tdata
1534 struct elf_obj_tdata root;
1536 /* tls_type for each local got entry. */
1537 char *local_got_tls_type;
1540 #define elf32_arm_tdata(abfd) \
1541 ((struct elf32_arm_obj_tdata *) (abfd)->tdata.any)
1543 #define elf32_arm_local_got_tls_type(abfd) \
1544 (elf32_arm_tdata (abfd)->local_got_tls_type)
1547 elf32_arm_mkobject (bfd *abfd)
1549 bfd_size_type amt = sizeof (struct elf32_arm_obj_tdata);
1550 abfd->tdata.any = bfd_zalloc (abfd, amt);
1551 if (abfd->tdata.any == NULL)
1556 /* The ARM linker needs to keep track of the number of relocs that it
1557 decides to copy in check_relocs for each symbol. This is so that
1558 it can discard PC relative relocs if it doesn't need them when
1559 linking with -Bsymbolic. We store the information in a field
1560 extending the regular ELF linker hash table. */
1562 /* This structure keeps track of the number of relocs we have copied
1563 for a given symbol. */
1564 struct elf32_arm_relocs_copied
1567 struct elf32_arm_relocs_copied * next;
1568 /* A section in dynobj. */
1570 /* Number of relocs copied in this section. */
1571 bfd_size_type count;
1572 /* Number of PC-relative relocs copied in this section. */
1573 bfd_size_type pc_count;
1576 #define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
1578 /* Arm ELF linker hash entry. */
1579 struct elf32_arm_link_hash_entry
1581 struct elf_link_hash_entry root;
1583 /* Number of PC relative relocs copied for this symbol. */
1584 struct elf32_arm_relocs_copied * relocs_copied;
1586 /* We reference count Thumb references to a PLT entry separately,
1587 so that we can emit the Thumb trampoline only if needed. */
1588 bfd_signed_vma plt_thumb_refcount;
1590 /* Since PLT entries have variable size if the Thumb prologue is
1591 used, we need to record the index into .got.plt instead of
1592 recomputing it from the PLT offset. */
1593 bfd_signed_vma plt_got_offset;
1595 #define GOT_UNKNOWN 0
1596 #define GOT_NORMAL 1
1597 #define GOT_TLS_GD 2
1598 #define GOT_TLS_IE 4
1599 unsigned char tls_type;
1602 /* Traverse an arm ELF linker hash table. */
1603 #define elf32_arm_link_hash_traverse(table, func, info) \
1604 (elf_link_hash_traverse \
1606 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
1609 /* Get the ARM elf linker hash table from a link_info structure. */
1610 #define elf32_arm_hash_table(info) \
1611 ((struct elf32_arm_link_hash_table *) ((info)->hash))
1613 /* ARM ELF linker hash table. */
1614 struct elf32_arm_link_hash_table
1616 /* The main hash table. */
1617 struct elf_link_hash_table root;
1619 /* The size in bytes of the section containing the Thumb-to-ARM glue. */
1620 bfd_size_type thumb_glue_size;
1622 /* The size in bytes of the section containing the ARM-to-Thumb glue. */
1623 bfd_size_type arm_glue_size;
1625 /* An arbitrary input BFD chosen to hold the glue sections. */
1626 bfd * bfd_of_glue_owner;
1628 /* Nonzero to output a BE8 image. */
1631 /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
1632 Nonzero if R_ARM_TARGET1 means R_ARM_ABS32. */
1635 /* The relocation to use for R_ARM_TARGET2 relocations. */
1638 /* Nonzero to fix BX instructions for ARMv4 targets. */
1641 /* Nonzero if the ARM/Thumb BLX instructions are available for use. */
1644 /* The number of bytes in the initial entry in the PLT. */
1645 bfd_size_type plt_header_size;
1647 /* The number of bytes in the subsequent PLT etries. */
1648 bfd_size_type plt_entry_size;
1650 /* True if the target system is Symbian OS. */
1653 /* True if the target uses REL relocations. */
1656 /* Short-cuts to get to dynamic linker sections. */
1665 /* Data for R_ARM_TLS_LDM32 relocations. */
1667 bfd_signed_vma refcount;
1671 /* Small local sym to section mapping cache. */
1672 struct sym_sec_cache sym_sec;
1674 /* For convenience in allocate_dynrelocs. */
1678 /* Create an entry in an ARM ELF linker hash table. */
1680 static struct bfd_hash_entry *
1681 elf32_arm_link_hash_newfunc (struct bfd_hash_entry * entry,
1682 struct bfd_hash_table * table,
1683 const char * string)
1685 struct elf32_arm_link_hash_entry * ret =
1686 (struct elf32_arm_link_hash_entry *) entry;
1688 /* Allocate the structure if it has not already been allocated by a
1690 if (ret == (struct elf32_arm_link_hash_entry *) NULL)
1691 ret = bfd_hash_allocate (table, sizeof (struct elf32_arm_link_hash_entry));
1693 return (struct bfd_hash_entry *) ret;
1695 /* Call the allocation method of the superclass. */
1696 ret = ((struct elf32_arm_link_hash_entry *)
1697 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1701 ret->relocs_copied = NULL;
1702 ret->tls_type = GOT_UNKNOWN;
1703 ret->plt_thumb_refcount = 0;
1704 ret->plt_got_offset = -1;
1707 return (struct bfd_hash_entry *) ret;
1710 /* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up
1711 shortcuts to them in our hash table. */
1714 create_got_section (bfd *dynobj, struct bfd_link_info *info)
1716 struct elf32_arm_link_hash_table *htab;
1718 htab = elf32_arm_hash_table (info);
1719 /* BPABI objects never have a GOT, or associated sections. */
1720 if (htab->symbian_p)
1723 if (! _bfd_elf_create_got_section (dynobj, info))
1726 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
1727 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
1728 if (!htab->sgot || !htab->sgotplt)
1731 htab->srelgot = bfd_make_section_with_flags (dynobj, ".rel.got",
1732 (SEC_ALLOC | SEC_LOAD
1735 | SEC_LINKER_CREATED
1737 if (htab->srelgot == NULL
1738 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
1743 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
1744 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
1748 elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1750 struct elf32_arm_link_hash_table *htab;
1752 htab = elf32_arm_hash_table (info);
1753 if (!htab->sgot && !create_got_section (dynobj, info))
1756 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1759 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
1760 htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt");
1761 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
1763 htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss");
1768 || (!info->shared && !htab->srelbss))
1774 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1777 elf32_arm_copy_indirect_symbol (const struct elf_backend_data *bed,
1778 struct elf_link_hash_entry *dir,
1779 struct elf_link_hash_entry *ind)
1781 struct elf32_arm_link_hash_entry *edir, *eind;
1783 edir = (struct elf32_arm_link_hash_entry *) dir;
1784 eind = (struct elf32_arm_link_hash_entry *) ind;
1786 if (eind->relocs_copied != NULL)
1788 if (edir->relocs_copied != NULL)
1790 struct elf32_arm_relocs_copied **pp;
1791 struct elf32_arm_relocs_copied *p;
1793 if (ind->root.type == bfd_link_hash_indirect)
1796 /* Add reloc counts against the weak sym to the strong sym
1797 list. Merge any entries against the same section. */
1798 for (pp = &eind->relocs_copied; (p = *pp) != NULL; )
1800 struct elf32_arm_relocs_copied *q;
1802 for (q = edir->relocs_copied; q != NULL; q = q->next)
1803 if (q->section == p->section)
1805 q->pc_count += p->pc_count;
1806 q->count += p->count;
1813 *pp = edir->relocs_copied;
1816 edir->relocs_copied = eind->relocs_copied;
1817 eind->relocs_copied = NULL;
1820 /* If the direct symbol already has an associated PLT entry, the
1821 indirect symbol should not. If it doesn't, swap refcount information
1822 from the indirect symbol. */
1823 if (edir->plt_thumb_refcount == 0)
1825 edir->plt_thumb_refcount = eind->plt_thumb_refcount;
1826 eind->plt_thumb_refcount = 0;
1829 BFD_ASSERT (eind->plt_thumb_refcount == 0);
1831 if (ind->root.type == bfd_link_hash_indirect
1832 && dir->got.refcount <= 0)
1834 edir->tls_type = eind->tls_type;
1835 eind->tls_type = GOT_UNKNOWN;
1838 _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
1841 /* Create an ARM elf linker hash table. */
1843 static struct bfd_link_hash_table *
1844 elf32_arm_link_hash_table_create (bfd *abfd)
1846 struct elf32_arm_link_hash_table *ret;
1847 bfd_size_type amt = sizeof (struct elf32_arm_link_hash_table);
1849 ret = bfd_malloc (amt);
1853 if (!_bfd_elf_link_hash_table_init (& ret->root, abfd,
1854 elf32_arm_link_hash_newfunc))
1861 ret->sgotplt = NULL;
1862 ret->srelgot = NULL;
1864 ret->srelplt = NULL;
1865 ret->sdynbss = NULL;
1866 ret->srelbss = NULL;
1867 ret->thumb_glue_size = 0;
1868 ret->arm_glue_size = 0;
1869 ret->bfd_of_glue_owner = NULL;
1870 ret->byteswap_code = 0;
1871 ret->target1_is_rel = 0;
1872 ret->target2_reloc = R_ARM_NONE;
1873 #ifdef FOUR_WORD_PLT
1874 ret->plt_header_size = 16;
1875 ret->plt_entry_size = 16;
1877 ret->plt_header_size = 20;
1878 ret->plt_entry_size = 12;
1884 ret->sym_sec.abfd = NULL;
1886 ret->tls_ldm_got.refcount = 0;
1888 return &ret->root.root;
1891 /* Locate the Thumb encoded calling stub for NAME. */
1893 static struct elf_link_hash_entry *
1894 find_thumb_glue (struct bfd_link_info *link_info,
1899 struct elf_link_hash_entry *hash;
1900 struct elf32_arm_link_hash_table *hash_table;
1902 /* We need a pointer to the armelf specific hash table. */
1903 hash_table = elf32_arm_hash_table (link_info);
1905 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
1906 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
1908 BFD_ASSERT (tmp_name);
1910 sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
1912 hash = elf_link_hash_lookup
1913 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
1916 /* xgettext:c-format */
1917 (*_bfd_error_handler) (_("%B: unable to find THUMB glue '%s' for `%s'"),
1918 input_bfd, tmp_name, name);
1925 /* Locate the ARM encoded calling stub for NAME. */
1927 static struct elf_link_hash_entry *
1928 find_arm_glue (struct bfd_link_info *link_info,
1933 struct elf_link_hash_entry *myh;
1934 struct elf32_arm_link_hash_table *hash_table;
1936 /* We need a pointer to the elfarm specific hash table. */
1937 hash_table = elf32_arm_hash_table (link_info);
1939 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
1940 + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
1942 BFD_ASSERT (tmp_name);
1944 sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
1946 myh = elf_link_hash_lookup
1947 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
1950 /* xgettext:c-format */
1951 (*_bfd_error_handler) (_("%B: unable to find ARM glue '%s' for `%s'"),
1952 input_bfd, tmp_name, name);
1959 /* ARM->Thumb glue (static images):
1963 ldr r12, __func_addr
1966 .word func @ behave as if you saw a ARM_32 reloc.
1968 (relocatable images)
1971 ldr r12, __func_offset
1978 #define ARM2THUMB_STATIC_GLUE_SIZE 12
1979 static const insn32 a2t1_ldr_insn = 0xe59fc000;
1980 static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
1981 static const insn32 a2t3_func_addr_insn = 0x00000001;
1983 #define ARM2THUMB_PIC_GLUE_SIZE 16
1984 static const insn32 a2t1p_ldr_insn = 0xe59fc004;
1985 static const insn32 a2t2p_add_pc_insn = 0xe08cc00f;
1986 static const insn32 a2t3p_bx_r12_insn = 0xe12fff1c;
1988 /* Thumb->ARM: Thumb->(non-interworking aware) ARM
1992 __func_from_thumb: __func_from_thumb:
1994 nop ldr r6, __func_addr
1996 __func_change_to_arm: bx r6
1998 __func_back_to_thumb:
2004 #define THUMB2ARM_GLUE_SIZE 8
2005 static const insn16 t2a1_bx_pc_insn = 0x4778;
2006 static const insn16 t2a2_noop_insn = 0x46c0;
2007 static const insn32 t2a3_b_insn = 0xea000000;
2009 #ifndef ELFARM_NABI_C_INCLUDED
2011 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
2015 struct elf32_arm_link_hash_table * globals;
2017 globals = elf32_arm_hash_table (info);
2019 BFD_ASSERT (globals != NULL);
2021 if (globals->arm_glue_size != 0)
2023 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2025 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2026 ARM2THUMB_GLUE_SECTION_NAME);
2028 BFD_ASSERT (s != NULL);
2030 foo = bfd_alloc (globals->bfd_of_glue_owner, globals->arm_glue_size);
2032 s->size = globals->arm_glue_size;
2036 if (globals->thumb_glue_size != 0)
2038 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2040 s = bfd_get_section_by_name
2041 (globals->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
2043 BFD_ASSERT (s != NULL);
2045 foo = bfd_alloc (globals->bfd_of_glue_owner, globals->thumb_glue_size);
2047 s->size = globals->thumb_glue_size;
2055 record_arm_to_thumb_glue (struct bfd_link_info * link_info,
2056 struct elf_link_hash_entry * h)
2058 const char * name = h->root.root.string;
2061 struct elf_link_hash_entry * myh;
2062 struct bfd_link_hash_entry * bh;
2063 struct elf32_arm_link_hash_table * globals;
2066 globals = elf32_arm_hash_table (link_info);
2068 BFD_ASSERT (globals != NULL);
2069 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2071 s = bfd_get_section_by_name
2072 (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
2074 BFD_ASSERT (s != NULL);
2076 tmp_name = bfd_malloc ((bfd_size_type) strlen (name) + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
2078 BFD_ASSERT (tmp_name);
2080 sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
2082 myh = elf_link_hash_lookup
2083 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
2087 /* We've already seen this guy. */
2092 /* The only trick here is using hash_table->arm_glue_size as the value.
2093 Even though the section isn't allocated yet, this is where we will be
2096 val = globals->arm_glue_size + 1;
2097 _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
2098 tmp_name, BSF_GLOBAL, s, val,
2099 NULL, TRUE, FALSE, &bh);
2101 myh = (struct elf_link_hash_entry *) bh;
2102 myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
2103 myh->forced_local = 1;
2107 if ((link_info->shared || globals->root.is_relocatable_executable))
2108 globals->arm_glue_size += ARM2THUMB_PIC_GLUE_SIZE;
2110 globals->arm_glue_size += ARM2THUMB_STATIC_GLUE_SIZE;
2116 record_thumb_to_arm_glue (struct bfd_link_info *link_info,
2117 struct elf_link_hash_entry *h)
2119 const char *name = h->root.root.string;
2122 struct elf_link_hash_entry *myh;
2123 struct bfd_link_hash_entry *bh;
2124 struct elf32_arm_link_hash_table *hash_table;
2127 hash_table = elf32_arm_hash_table (link_info);
2129 BFD_ASSERT (hash_table != NULL);
2130 BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
2132 s = bfd_get_section_by_name
2133 (hash_table->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
2135 BFD_ASSERT (s != NULL);
2137 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2138 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
2140 BFD_ASSERT (tmp_name);
2142 sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
2144 myh = elf_link_hash_lookup
2145 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
2149 /* We've already seen this guy. */
2155 val = hash_table->thumb_glue_size + 1;
2156 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
2157 tmp_name, BSF_GLOBAL, s, val,
2158 NULL, TRUE, FALSE, &bh);
2160 /* If we mark it 'Thumb', the disassembler will do a better job. */
2161 myh = (struct elf_link_hash_entry *) bh;
2162 myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
2163 myh->forced_local = 1;
2167 #define CHANGE_TO_ARM "__%s_change_to_arm"
2168 #define BACK_FROM_ARM "__%s_back_from_arm"
2170 /* Allocate another symbol to mark where we switch to Arm mode. */
2171 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2172 + strlen (CHANGE_TO_ARM) + 1);
2174 BFD_ASSERT (tmp_name);
2176 sprintf (tmp_name, CHANGE_TO_ARM, name);
2179 val = hash_table->thumb_glue_size + 4,
2180 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
2181 tmp_name, BSF_LOCAL, s, val,
2182 NULL, TRUE, FALSE, &bh);
2186 hash_table->thumb_glue_size += THUMB2ARM_GLUE_SIZE;
2191 /* Add the glue sections to ABFD. This function is called from the
2192 linker scripts in ld/emultempl/{armelf}.em. */
2195 bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
2196 struct bfd_link_info *info)
2201 /* If we are only performing a partial
2202 link do not bother adding the glue. */
2203 if (info->relocatable)
2206 sec = bfd_get_section_by_name (abfd, ARM2THUMB_GLUE_SECTION_NAME);
2210 /* Note: we do not include the flag SEC_LINKER_CREATED, as this
2211 will prevent elf_link_input_bfd() from processing the contents
2213 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY;
2215 sec = bfd_make_section_with_flags (abfd,
2216 ARM2THUMB_GLUE_SECTION_NAME,
2220 || !bfd_set_section_alignment (abfd, sec, 2))
2223 /* Set the gc mark to prevent the section from being removed by garbage
2224 collection, despite the fact that no relocs refer to this section. */
2228 sec = bfd_get_section_by_name (abfd, THUMB2ARM_GLUE_SECTION_NAME);
2232 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2233 | SEC_CODE | SEC_READONLY;
2235 sec = bfd_make_section_with_flags (abfd,
2236 THUMB2ARM_GLUE_SECTION_NAME,
2240 || !bfd_set_section_alignment (abfd, sec, 2))
2249 /* Select a BFD to be used to hold the sections used by the glue code.
2250 This function is called from the linker scripts in ld/emultempl/
2254 bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
2256 struct elf32_arm_link_hash_table *globals;
2258 /* If we are only performing a partial link
2259 do not bother getting a bfd to hold the glue. */
2260 if (info->relocatable)
2263 /* Make sure we don't attach the glue sections to a dynamic object. */
2264 BFD_ASSERT (!(abfd->flags & DYNAMIC));
2266 globals = elf32_arm_hash_table (info);
2268 BFD_ASSERT (globals != NULL);
2270 if (globals->bfd_of_glue_owner != NULL)
2273 /* Save the bfd for later use. */
2274 globals->bfd_of_glue_owner = abfd;
2280 bfd_elf32_arm_process_before_allocation (bfd *abfd,
2281 struct bfd_link_info *link_info,
2284 Elf_Internal_Shdr *symtab_hdr;
2285 Elf_Internal_Rela *internal_relocs = NULL;
2286 Elf_Internal_Rela *irel, *irelend;
2287 bfd_byte *contents = NULL;
2290 struct elf32_arm_link_hash_table *globals;
2292 /* If we are only performing a partial link do not bother
2293 to construct any glue. */
2294 if (link_info->relocatable)
2297 /* Here we have a bfd that is to be included on the link. We have a hook
2298 to do reloc rummaging, before section sizes are nailed down. */
2299 globals = elf32_arm_hash_table (link_info);
2301 BFD_ASSERT (globals != NULL);
2302 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2304 if (byteswap_code && !bfd_big_endian (abfd))
2306 _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
2310 globals->byteswap_code = byteswap_code;
2312 /* Rummage around all the relocs and map the glue vectors. */
2313 sec = abfd->sections;
2318 for (; sec != NULL; sec = sec->next)
2320 if (sec->reloc_count == 0)
2323 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2325 /* Load the relocs. */
2327 = _bfd_elf_link_read_relocs (abfd, sec, (void *) NULL,
2328 (Elf_Internal_Rela *) NULL, FALSE);
2330 if (internal_relocs == NULL)
2333 irelend = internal_relocs + sec->reloc_count;
2334 for (irel = internal_relocs; irel < irelend; irel++)
2337 unsigned long r_index;
2339 struct elf_link_hash_entry *h;
2341 r_type = ELF32_R_TYPE (irel->r_info);
2342 r_index = ELF32_R_SYM (irel->r_info);
2344 /* These are the only relocation types we care about. */
2345 if ( r_type != R_ARM_PC24
2346 && r_type != R_ARM_PLT32
2347 && r_type != R_ARM_CALL
2348 && r_type != R_ARM_JUMP24
2349 && r_type != R_ARM_THM_CALL)
2352 /* Get the section contents if we haven't done so already. */
2353 if (contents == NULL)
2355 /* Get cached copy if it exists. */
2356 if (elf_section_data (sec)->this_hdr.contents != NULL)
2357 contents = elf_section_data (sec)->this_hdr.contents;
2360 /* Go get them off disk. */
2361 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2366 /* If the relocation is not against a symbol it cannot concern us. */
2369 /* We don't care about local symbols. */
2370 if (r_index < symtab_hdr->sh_info)
2373 /* This is an external symbol. */
2374 r_index -= symtab_hdr->sh_info;
2375 h = (struct elf_link_hash_entry *)
2376 elf_sym_hashes (abfd)[r_index];
2378 /* If the relocation is against a static symbol it must be within
2379 the current section and so cannot be a cross ARM/Thumb relocation. */
2383 /* If the call will go through a PLT entry then we do not need
2385 if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1)
2394 /* This one is a call from arm code. We need to look up
2395 the target of the call. If it is a thumb target, we
2397 if (ELF_ST_TYPE(h->type) == STT_ARM_TFUNC)
2398 record_arm_to_thumb_glue (link_info, h);
2401 case R_ARM_THM_CALL:
2402 /* This one is a call from thumb code. We look
2403 up the target of the call. If it is not a thumb
2404 target, we insert glue. */
2405 if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC)
2406 record_thumb_to_arm_glue (link_info, h);
2414 if (contents != NULL
2415 && elf_section_data (sec)->this_hdr.contents != contents)
2419 if (internal_relocs != NULL
2420 && elf_section_data (sec)->relocs != internal_relocs)
2421 free (internal_relocs);
2422 internal_relocs = NULL;
2428 if (contents != NULL
2429 && elf_section_data (sec)->this_hdr.contents != contents)
2431 if (internal_relocs != NULL
2432 && elf_section_data (sec)->relocs != internal_relocs)
2433 free (internal_relocs);
2440 /* Set target relocation values needed during linking. */
2443 bfd_elf32_arm_set_target_relocs (struct bfd_link_info *link_info,
2445 char * target2_type,
2449 struct elf32_arm_link_hash_table *globals;
2451 globals = elf32_arm_hash_table (link_info);
2453 globals->target1_is_rel = target1_is_rel;
2454 if (strcmp (target2_type, "rel") == 0)
2455 globals->target2_reloc = R_ARM_REL32;
2456 else if (strcmp (target2_type, "abs") == 0)
2457 globals->target2_reloc = R_ARM_ABS32;
2458 else if (strcmp (target2_type, "got-rel") == 0)
2459 globals->target2_reloc = R_ARM_GOT_PREL;
2462 _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
2465 globals->fix_v4bx = fix_v4bx;
2466 globals->use_blx |= use_blx;
2469 /* The thumb form of a long branch is a bit finicky, because the offset
2470 encoding is split over two fields, each in it's own instruction. They
2471 can occur in any order. So given a thumb form of long branch, and an
2472 offset, insert the offset into the thumb branch and return finished
2475 It takes two thumb instructions to encode the target address. Each has
2476 11 bits to invest. The upper 11 bits are stored in one (identified by
2477 H-0.. see below), the lower 11 bits are stored in the other (identified
2480 Combine together and shifted left by 1 (it's a half word address) and
2484 H-0, upper address-0 = 000
2486 H-1, lower address-0 = 800
2488 They can be ordered either way, but the arm tools I've seen always put
2489 the lower one first. It probably doesn't matter. krk@cygnus.com
2491 XXX: Actually the order does matter. The second instruction (H-1)
2492 moves the computed address into the PC, so it must be the second one
2493 in the sequence. The problem, however is that whilst little endian code
2494 stores the instructions in HI then LOW order, big endian code does the
2495 reverse. nickc@cygnus.com. */
2497 #define LOW_HI_ORDER 0xF800F000
2498 #define HI_LOW_ORDER 0xF000F800
2501 insert_thumb_branch (insn32 br_insn, int rel_off)
2503 unsigned int low_bits;
2504 unsigned int high_bits;
2506 BFD_ASSERT ((rel_off & 1) != 1);
2508 rel_off >>= 1; /* Half word aligned address. */
2509 low_bits = rel_off & 0x000007FF; /* The bottom 11 bits. */
2510 high_bits = (rel_off >> 11) & 0x000007FF; /* The top 11 bits. */
2512 if ((br_insn & LOW_HI_ORDER) == LOW_HI_ORDER)
2513 br_insn = LOW_HI_ORDER | (low_bits << 16) | high_bits;
2514 else if ((br_insn & HI_LOW_ORDER) == HI_LOW_ORDER)
2515 br_insn = HI_LOW_ORDER | (high_bits << 16) | low_bits;
2517 /* FIXME: abort is probably not the right call. krk@cygnus.com */
2518 abort (); /* Error - not a valid branch instruction form. */
2523 /* Thumb code calling an ARM function. */
2526 elf32_thumb_to_arm_stub (struct bfd_link_info * info,
2530 asection * input_section,
2531 bfd_byte * hit_data,
2534 bfd_signed_vma addend,
2539 unsigned long int tmp;
2540 long int ret_offset;
2541 struct elf_link_hash_entry * myh;
2542 struct elf32_arm_link_hash_table * globals;
2544 myh = find_thumb_glue (info, name, input_bfd);
2548 globals = elf32_arm_hash_table (info);
2550 BFD_ASSERT (globals != NULL);
2551 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2553 my_offset = myh->root.u.def.value;
2555 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2556 THUMB2ARM_GLUE_SECTION_NAME);
2558 BFD_ASSERT (s != NULL);
2559 BFD_ASSERT (s->contents != NULL);
2560 BFD_ASSERT (s->output_section != NULL);
2562 if ((my_offset & 0x01) == 0x01)
2565 && sym_sec->owner != NULL
2566 && !INTERWORK_FLAG (sym_sec->owner))
2568 (*_bfd_error_handler)
2569 (_("%B(%s): warning: interworking not enabled.\n"
2570 " first occurrence: %B: thumb call to arm"),
2571 sym_sec->owner, input_bfd, name);
2577 myh->root.u.def.value = my_offset;
2579 bfd_put_16 (output_bfd, (bfd_vma) t2a1_bx_pc_insn,
2580 s->contents + my_offset);
2582 bfd_put_16 (output_bfd, (bfd_vma) t2a2_noop_insn,
2583 s->contents + my_offset + 2);
2586 /* Address of destination of the stub. */
2587 ((bfd_signed_vma) val)
2589 /* Offset from the start of the current section
2590 to the start of the stubs. */
2592 /* Offset of the start of this stub from the start of the stubs. */
2594 /* Address of the start of the current section. */
2595 + s->output_section->vma)
2596 /* The branch instruction is 4 bytes into the stub. */
2598 /* ARM branches work from the pc of the instruction + 8. */
2601 bfd_put_32 (output_bfd,
2602 (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
2603 s->contents + my_offset + 4);
2606 BFD_ASSERT (my_offset <= globals->thumb_glue_size);
2608 /* Now go back and fix up the original BL insn to point to here. */
2610 /* Address of where the stub is located. */
2611 (s->output_section->vma + s->output_offset + my_offset)
2612 /* Address of where the BL is located. */
2613 - (input_section->output_section->vma + input_section->output_offset
2615 /* Addend in the relocation. */
2617 /* Biassing for PC-relative addressing. */
2620 tmp = bfd_get_32 (input_bfd, hit_data
2621 - input_section->vma);
2623 bfd_put_32 (output_bfd,
2624 (bfd_vma) insert_thumb_branch (tmp, ret_offset),
2625 hit_data - input_section->vma);
2630 /* Arm code calling a Thumb function. */
2633 elf32_arm_to_thumb_stub (struct bfd_link_info * info,
2637 asection * input_section,
2638 bfd_byte * hit_data,
2641 bfd_signed_vma addend,
2644 unsigned long int tmp;
2647 long int ret_offset;
2648 struct elf_link_hash_entry * myh;
2649 struct elf32_arm_link_hash_table * globals;
2651 myh = find_arm_glue (info, name, input_bfd);
2655 globals = elf32_arm_hash_table (info);
2657 BFD_ASSERT (globals != NULL);
2658 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2660 my_offset = myh->root.u.def.value;
2661 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2662 ARM2THUMB_GLUE_SECTION_NAME);
2663 BFD_ASSERT (s != NULL);
2664 BFD_ASSERT (s->contents != NULL);
2665 BFD_ASSERT (s->output_section != NULL);
2667 if ((my_offset & 0x01) == 0x01)
2670 && sym_sec->owner != NULL
2671 && !INTERWORK_FLAG (sym_sec->owner))
2673 (*_bfd_error_handler)
2674 (_("%B(%s): warning: interworking not enabled.\n"
2675 " first occurrence: %B: arm call to thumb"),
2676 sym_sec->owner, input_bfd, name);
2680 myh->root.u.def.value = my_offset;
2682 if ((info->shared || globals->root.is_relocatable_executable))
2684 /* For relocatable objects we can't use absolute addresses,
2685 so construct the address from a relative offset. */
2686 /* TODO: If the offset is small it's probably worth
2687 constructing the address with adds. */
2688 bfd_put_32 (output_bfd, (bfd_vma) a2t1p_ldr_insn,
2689 s->contents + my_offset);
2690 bfd_put_32 (output_bfd, (bfd_vma) a2t2p_add_pc_insn,
2691 s->contents + my_offset + 4);
2692 bfd_put_32 (output_bfd, (bfd_vma) a2t3p_bx_r12_insn,
2693 s->contents + my_offset + 8);
2694 /* Adjust the offset by 4 for the position of the add,
2695 and 8 for the pipeline offset. */
2696 ret_offset = (val - (s->output_offset
2697 + s->output_section->vma
2700 bfd_put_32 (output_bfd, ret_offset,
2701 s->contents + my_offset + 12);
2705 bfd_put_32 (output_bfd, (bfd_vma) a2t1_ldr_insn,
2706 s->contents + my_offset);
2708 bfd_put_32 (output_bfd, (bfd_vma) a2t2_bx_r12_insn,
2709 s->contents + my_offset + 4);
2711 /* It's a thumb address. Add the low order bit. */
2712 bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
2713 s->contents + my_offset + 8);
2717 BFD_ASSERT (my_offset <= globals->arm_glue_size);
2719 tmp = bfd_get_32 (input_bfd, hit_data);
2720 tmp = tmp & 0xFF000000;
2722 /* Somehow these are both 4 too far, so subtract 8. */
2723 ret_offset = (s->output_offset
2725 + s->output_section->vma
2726 - (input_section->output_offset
2727 + input_section->output_section->vma
2731 tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
2733 bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
2738 /* Some relocations map to different relocations depending on the
2739 target. Return the real relocation. */
2741 arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
2747 if (globals->target1_is_rel)
2753 return globals->target2_reloc;
2760 /* Return the base VMA address which should be subtracted from real addresses
2761 when resolving @dtpoff relocation.
2762 This is PT_TLS segment p_vaddr. */
2765 dtpoff_base (struct bfd_link_info *info)
2767 /* If tls_sec is NULL, we should have signalled an error already. */
2768 if (elf_hash_table (info)->tls_sec == NULL)
2770 return elf_hash_table (info)->tls_sec->vma;
2773 /* Return the relocation value for @tpoff relocation
2774 if STT_TLS virtual address is ADDRESS. */
2777 tpoff (struct bfd_link_info *info, bfd_vma address)
2779 struct elf_link_hash_table *htab = elf_hash_table (info);
2782 /* If tls_sec is NULL, we should have signalled an error already. */
2783 if (htab->tls_sec == NULL)
2785 base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
2786 return address - htab->tls_sec->vma + base;
2789 /* Perform a relocation as part of a final link. */
2791 static bfd_reloc_status_type
2792 elf32_arm_final_link_relocate (reloc_howto_type * howto,
2795 asection * input_section,
2796 bfd_byte * contents,
2797 Elf_Internal_Rela * rel,
2799 struct bfd_link_info * info,
2801 const char * sym_name,
2803 struct elf_link_hash_entry * h,
2804 bfd_boolean * unresolved_reloc_p)
2806 unsigned long r_type = howto->type;
2807 unsigned long r_symndx;
2808 bfd_byte * hit_data = contents + rel->r_offset;
2809 bfd * dynobj = NULL;
2810 Elf_Internal_Shdr * symtab_hdr;
2811 struct elf_link_hash_entry ** sym_hashes;
2812 bfd_vma * local_got_offsets;
2813 asection * sgot = NULL;
2814 asection * splt = NULL;
2815 asection * sreloc = NULL;
2817 bfd_signed_vma signed_addend;
2818 struct elf32_arm_link_hash_table * globals;
2820 globals = elf32_arm_hash_table (info);
2822 /* Some relocation type map to different relocations depending on the
2823 target. We pick the right one here. */
2824 r_type = arm_real_reloc_type (globals, r_type);
2825 if (r_type != howto->type)
2826 howto = elf32_arm_howto_from_type (r_type);
2828 /* If the start address has been set, then set the EF_ARM_HASENTRY
2829 flag. Setting this more than once is redundant, but the cost is
2830 not too high, and it keeps the code simple.
2832 The test is done here, rather than somewhere else, because the
2833 start address is only set just before the final link commences.
2835 Note - if the user deliberately sets a start address of 0, the
2836 flag will not be set. */
2837 if (bfd_get_start_address (output_bfd) != 0)
2838 elf_elfheader (output_bfd)->e_flags |= EF_ARM_HASENTRY;
2840 dynobj = elf_hash_table (info)->dynobj;
2843 sgot = bfd_get_section_by_name (dynobj, ".got");
2844 splt = bfd_get_section_by_name (dynobj, ".plt");
2846 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
2847 sym_hashes = elf_sym_hashes (input_bfd);
2848 local_got_offsets = elf_local_got_offsets (input_bfd);
2849 r_symndx = ELF32_R_SYM (rel->r_info);
2851 if (globals->use_rel)
2853 addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
2855 if (addend & ((howto->src_mask + 1) >> 1))
2858 signed_addend &= ~ howto->src_mask;
2859 signed_addend |= addend;
2862 signed_addend = addend;
2865 addend = signed_addend = rel->r_addend;
2870 /* We don't need to find a value for this symbol. It's just a
2872 *unresolved_reloc_p = FALSE;
2873 return bfd_reloc_ok;
2883 /* r_symndx will be zero only for relocs against symbols
2884 from removed linkonce sections, or sections discarded by
2887 return bfd_reloc_ok;
2889 /* Handle relocations which should use the PLT entry. ABS32/REL32
2890 will use the symbol's value, which may point to a PLT entry, but we
2891 don't need to handle that here. If we created a PLT entry, all
2892 branches in this object should go to it. */
2893 if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32)
2896 && h->plt.offset != (bfd_vma) -1)
2898 /* If we've created a .plt section, and assigned a PLT entry to
2899 this function, it should not be known to bind locally. If
2900 it were, we would have cleared the PLT entry. */
2901 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
2903 value = (splt->output_section->vma
2904 + splt->output_offset
2906 *unresolved_reloc_p = FALSE;
2907 return _bfd_final_link_relocate (howto, input_bfd, input_section,
2908 contents, rel->r_offset, value,
2912 /* When generating a shared object or relocatable executable, these
2913 relocations are copied into the output file to be resolved at
2915 if ((info->shared || globals->root.is_relocatable_executable)
2916 && (input_section->flags & SEC_ALLOC)
2917 && (r_type != R_ARM_REL32
2918 || !SYMBOL_CALLS_LOCAL (info, h))
2920 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2921 || h->root.type != bfd_link_hash_undefweak)
2922 && r_type != R_ARM_PC24
2923 && r_type != R_ARM_CALL
2924 && r_type != R_ARM_JUMP24
2925 && r_type != R_ARM_PREL31
2926 && r_type != R_ARM_PLT32)
2928 Elf_Internal_Rela outrel;
2930 bfd_boolean skip, relocate;
2932 *unresolved_reloc_p = FALSE;
2938 name = (bfd_elf_string_from_elf_section
2940 elf_elfheader (input_bfd)->e_shstrndx,
2941 elf_section_data (input_section)->rel_hdr.sh_name));
2943 return bfd_reloc_notsupported;
2945 BFD_ASSERT (strncmp (name, ".rel", 4) == 0
2946 && strcmp (bfd_get_section_name (input_bfd,
2950 sreloc = bfd_get_section_by_name (dynobj, name);
2951 BFD_ASSERT (sreloc != NULL);
2958 _bfd_elf_section_offset (output_bfd, info, input_section,
2960 if (outrel.r_offset == (bfd_vma) -1)
2962 else if (outrel.r_offset == (bfd_vma) -2)
2963 skip = TRUE, relocate = TRUE;
2964 outrel.r_offset += (input_section->output_section->vma
2965 + input_section->output_offset);
2968 memset (&outrel, 0, sizeof outrel);
2973 || !h->def_regular))
2974 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2979 /* This symbol is local, or marked to become local. */
2981 if (sym_flags == STT_ARM_TFUNC)
2983 if (globals->symbian_p)
2985 /* On Symbian OS, the data segment and text segement
2986 can be relocated independently. Therefore, we
2987 must indicate the segment to which this
2988 relocation is relative. The BPABI allows us to
2989 use any symbol in the right segment; we just use
2990 the section symbol as it is convenient. (We
2991 cannot use the symbol given by "h" directly as it
2992 will not appear in the dynamic symbol table.) */
2994 symbol = elf_section_data (sym_sec->output_section)->dynindx;
2996 symbol = elf_section_data (input_section->output_section)->dynindx;
2997 BFD_ASSERT (symbol != 0);
3000 /* On SVR4-ish systems, the dynamic loader cannot
3001 relocate the text and data segments independently,
3002 so the symbol does not matter. */
3004 outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
3007 loc = sreloc->contents;
3008 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
3009 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3011 /* If this reloc is against an external symbol, we do not want to
3012 fiddle with the addend. Otherwise, we need to include the symbol
3013 value so that it becomes an addend for the dynamic reloc. */
3015 return bfd_reloc_ok;
3017 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3018 contents, rel->r_offset, value,
3021 else switch (r_type)
3023 case R_ARM_XPC25: /* Arm BLX instruction. */
3026 case R_ARM_PC24: /* Arm B/BL instruction */
3028 if (r_type == R_ARM_XPC25)
3030 /* Check for Arm calling Arm function. */
3031 /* FIXME: Should we translate the instruction into a BL
3032 instruction instead ? */
3033 if (sym_flags != STT_ARM_TFUNC)
3034 (*_bfd_error_handler)
3035 (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
3037 h ? h->root.root.string : "(local)");
3041 /* Check for Arm calling Thumb function. */
3042 if (sym_flags == STT_ARM_TFUNC)
3044 elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
3045 output_bfd, input_section,
3046 hit_data, sym_sec, rel->r_offset,
3047 signed_addend, value);
3048 return bfd_reloc_ok;
3052 /* The ARM ELF ABI says that this reloc is computed as: S - P + A
3054 S is the address of the symbol in the relocation.
3055 P is address of the instruction being relocated.
3056 A is the addend (extracted from the instruction) in bytes.
3058 S is held in 'value'.
3059 P is the base address of the section containing the
3060 instruction plus the offset of the reloc into that
3062 (input_section->output_section->vma +
3063 input_section->output_offset +
3065 A is the addend, converted into bytes, ie:
3068 Note: None of these operations have knowledge of the pipeline
3069 size of the processor, thus it is up to the assembler to
3070 encode this information into the addend. */
3071 value -= (input_section->output_section->vma
3072 + input_section->output_offset);
3073 value -= rel->r_offset;
3074 if (globals->use_rel)
3075 value += (signed_addend << howto->size);
3077 /* RELA addends do not have to be adjusted by howto->size. */
3078 value += signed_addend;
3080 signed_addend = value;
3081 signed_addend >>= howto->rightshift;
3083 /* It is not an error for an undefined weak reference to be
3084 out of range. Any program that branches to such a symbol
3085 is going to crash anyway, so there is no point worrying
3086 about getting the destination exactly right. */
3087 if (! h || h->root.type != bfd_link_hash_undefweak)
3089 /* Perform a signed range check. */
3090 if ( signed_addend > ((bfd_signed_vma) (howto->dst_mask >> 1))
3091 || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
3092 return bfd_reloc_overflow;
3095 /* If necessary set the H bit in the BLX instruction. */
3096 if (r_type == R_ARM_XPC25 && ((value & 2) == 2))
3097 value = (signed_addend & howto->dst_mask)
3098 | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask))
3101 value = (signed_addend & howto->dst_mask)
3102 | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
3107 if (sym_flags == STT_ARM_TFUNC)
3112 value -= (input_section->output_section->vma
3113 + input_section->output_offset + rel->r_offset);
3118 value -= (input_section->output_section->vma
3119 + input_section->output_offset + rel->r_offset);
3120 value += signed_addend;
3121 if (! h || h->root.type != bfd_link_hash_undefweak)
3123 /* Check for overflow */
3124 if ((value ^ (value >> 1)) & (1 << 30))
3125 return bfd_reloc_overflow;
3127 value &= 0x7fffffff;
3128 value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
3129 if (sym_flags == STT_ARM_TFUNC)
3134 bfd_put_32 (input_bfd, value, hit_data);
3135 return bfd_reloc_ok;
3139 if ((long) value > 0x7f || (long) value < -0x80)
3140 return bfd_reloc_overflow;
3142 bfd_put_8 (input_bfd, value, hit_data);
3143 return bfd_reloc_ok;
3148 if ((long) value > 0x7fff || (long) value < -0x8000)
3149 return bfd_reloc_overflow;
3151 bfd_put_16 (input_bfd, value, hit_data);
3152 return bfd_reloc_ok;
3155 /* Support ldr and str instruction for the arm */
3156 /* Also thumb b (unconditional branch). ??? Really? */
3159 if ((long) value > 0x7ff || (long) value < -0x800)
3160 return bfd_reloc_overflow;
3162 value |= (bfd_get_32 (input_bfd, hit_data) & 0xfffff000);
3163 bfd_put_32 (input_bfd, value, hit_data);
3164 return bfd_reloc_ok;
3166 case R_ARM_THM_ABS5:
3167 /* Support ldr and str instructions for the thumb. */
3168 if (globals->use_rel)
3170 /* Need to refetch addend. */
3171 addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
3172 /* ??? Need to determine shift amount from operand size. */
3173 addend >>= howto->rightshift;
3177 /* ??? Isn't value unsigned? */
3178 if ((long) value > 0x1f || (long) value < -0x10)
3179 return bfd_reloc_overflow;
3181 /* ??? Value needs to be properly shifted into place first. */
3182 value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
3183 bfd_put_16 (input_bfd, value, hit_data);
3184 return bfd_reloc_ok;
3186 case R_ARM_THM_XPC22:
3187 case R_ARM_THM_CALL:
3188 /* Thumb BL (branch long instruction). */
3191 bfd_boolean overflow = FALSE;
3192 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
3193 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
3194 bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
3195 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3197 bfd_signed_vma signed_check;
3198 bfd_boolean thumb_plt_call = FALSE;
3200 /* Need to refetch the addend and squish the two 11 bit pieces
3202 if (globals->use_rel)
3204 bfd_vma upper = upper_insn & 0x7ff;
3205 bfd_vma lower = lower_insn & 0x7ff;
3206 upper = (upper ^ 0x400) - 0x400; /* Sign extend. */
3207 addend = (upper << 12) | (lower << 1);
3208 signed_addend = addend;
3211 if (r_type == R_ARM_THM_XPC22)
3213 /* Check for Thumb to Thumb call. */
3214 /* FIXME: Should we translate the instruction into a BL
3215 instruction instead ? */
3216 if (sym_flags == STT_ARM_TFUNC)
3217 (*_bfd_error_handler)
3218 (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
3220 h ? h->root.root.string : "(local)");
3224 /* If it is not a call to Thumb, assume call to Arm.
3225 If it is a call relative to a section name, then it is not a
3226 function call at all, but rather a long jump. Calls through
3227 the PLT do not require stubs. */
3228 if (sym_flags != STT_ARM_TFUNC && sym_flags != STT_SECTION
3229 && (h == NULL || splt == NULL
3230 || h->plt.offset == (bfd_vma) -1))
3232 if (elf32_thumb_to_arm_stub
3233 (info, sym_name, input_bfd, output_bfd, input_section,
3234 hit_data, sym_sec, rel->r_offset, signed_addend, value))
3235 return bfd_reloc_ok;
3237 return bfd_reloc_dangerous;
3241 /* Handle calls via the PLT. */
3242 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
3244 value = (splt->output_section->vma
3245 + splt->output_offset
3247 if (globals->use_blx)
3249 /* If the Thumb BLX instruction is available, convert the
3250 BL to a BLX instruction to call the ARM-mode PLT entry. */
3251 if ((lower_insn & (0x3 << 11)) == 0x3 << 11)
3253 lower_insn = (lower_insn & ~(0x3 << 11)) | 0x1 << 11;
3254 thumb_plt_call = TRUE;
3258 /* Target the Thumb stub before the ARM PLT entry. */
3259 value -= PLT_THUMB_STUB_SIZE;
3260 *unresolved_reloc_p = FALSE;
3263 relocation = value + signed_addend;
3265 relocation -= (input_section->output_section->vma
3266 + input_section->output_offset
3269 check = relocation >> howto->rightshift;
3271 /* If this is a signed value, the rightshift just dropped
3272 leading 1 bits (assuming twos complement). */
3273 if ((bfd_signed_vma) relocation >= 0)
3274 signed_check = check;
3276 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
3278 /* Assumes two's complement. */
3279 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3282 if ((r_type == R_ARM_THM_XPC22
3283 && ((lower_insn & 0x1800) == 0x0800))
3285 /* For a BLX instruction, make sure that the relocation is rounded up
3286 to a word boundary. This follows the semantics of the instruction
3287 which specifies that bit 1 of the target address will come from bit
3288 1 of the base address. */
3289 relocation = (relocation + 2) & ~ 3;
3291 /* Put RELOCATION back into the insn. */
3292 upper_insn = (upper_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 12) & 0x7ff);
3293 lower_insn = (lower_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 1) & 0x7ff);
3295 /* Put the relocated value back in the object file: */
3296 bfd_put_16 (input_bfd, upper_insn, hit_data);
3297 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
3299 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
3303 case R_ARM_THM_JUMP24:
3304 /* Thumb32 unconditional branch instruction. */
3307 bfd_boolean overflow = FALSE;
3308 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
3309 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
3310 bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
3311 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3313 bfd_signed_vma signed_check;
3315 /* Need to refetch the addend, reconstruct the top three bits, and glue the
3316 two pieces together. */
3317 if (globals->use_rel)
3319 bfd_vma S = (upper_insn & 0x0400) >> 10;
3320 bfd_vma hi = (upper_insn & 0x03ff);
3321 bfd_vma I1 = (lower_insn & 0x2000) >> 13;
3322 bfd_vma I2 = (lower_insn & 0x0800) >> 11;
3323 bfd_vma lo = (lower_insn & 0x07ff);
3329 signed_addend = (S << 24) | (I1 << 23) | (I2 << 22) | (hi << 12) | (lo << 1);
3330 signed_addend -= (1 << 24); /* Sign extend. */
3333 /* ??? Should handle interworking? GCC might someday try to
3334 use this for tail calls. */
3336 relocation = value + signed_addend;
3337 relocation -= (input_section->output_section->vma
3338 + input_section->output_offset
3341 check = relocation >> howto->rightshift;
3343 /* If this is a signed value, the rightshift just dropped
3344 leading 1 bits (assuming twos complement). */
3345 if ((bfd_signed_vma) relocation >= 0)
3346 signed_check = check;
3348 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
3350 /* Assumes two's complement. */
3351 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3354 /* Put RELOCATION back into the insn. */
3356 bfd_vma S = (relocation & 0x01000000) >> 24;
3357 bfd_vma I1 = (relocation & 0x00800000) >> 23;
3358 bfd_vma I2 = (relocation & 0x00400000) >> 22;
3359 bfd_vma hi = (relocation & 0x003ff000) >> 12;
3360 bfd_vma lo = (relocation & 0x00000ffe) >> 1;
3365 upper_insn = (upper_insn & (bfd_vma) 0xf800) | (S << 10) | hi;
3366 lower_insn = (lower_insn & (bfd_vma) 0xd000) | (I1 << 13) | (I2 << 11) | lo;
3369 /* Put the relocated value back in the object file: */
3370 bfd_put_16 (input_bfd, upper_insn, hit_data);
3371 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
3373 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
3376 case R_ARM_THM_JUMP19:
3377 /* Thumb32 conditional branch instruction. */
3380 bfd_boolean overflow = FALSE;
3381 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
3382 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
3383 bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
3384 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3386 bfd_signed_vma signed_check;
3388 /* Need to refetch the addend, reconstruct the top three bits,
3389 and squish the two 11 bit pieces together. */
3390 if (globals->use_rel)
3392 bfd_vma S = (upper_insn & 0x0400) >> 10;
3393 bfd_vma upper = (upper_insn & 0x001f);
3394 bfd_vma J1 = (lower_insn & 0x2000) >> 13;
3395 bfd_vma J2 = (lower_insn & 0x0800) >> 11;
3396 bfd_vma lower = (lower_insn & 0x07ff);
3401 upper -= 0x0100; /* Sign extend. */
3403 addend = (upper << 12) | (lower << 1);
3404 signed_addend = addend;
3407 /* ??? Should handle interworking? GCC might someday try to
3408 use this for tail calls. */
3410 relocation = value + signed_addend;
3411 relocation -= (input_section->output_section->vma
3412 + input_section->output_offset
3415 check = relocation >> howto->rightshift;
3417 /* If this is a signed value, the rightshift just dropped
3418 leading 1 bits (assuming twos complement). */
3419 if ((bfd_signed_vma) relocation >= 0)
3420 signed_check = check;
3422 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
3424 /* Assumes two's complement. */
3425 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3428 /* Put RELOCATION back into the insn. */
3430 bfd_vma S = (relocation & 0x00100000) >> 20;
3431 bfd_vma J2 = (relocation & 0x00080000) >> 19;
3432 bfd_vma J1 = (relocation & 0x00040000) >> 18;
3433 bfd_vma hi = (relocation & 0x0003f000) >> 12;
3434 bfd_vma lo = (relocation & 0x00000ffe) >> 1;
3436 upper_insn = (upper_insn & 0xfb30) | (S << 10) | hi;
3437 lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
3440 /* Put the relocated value back in the object file: */
3441 bfd_put_16 (input_bfd, upper_insn, hit_data);
3442 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
3444 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
3447 case R_ARM_THM_JUMP11:
3448 case R_ARM_THM_JUMP8:
3449 case R_ARM_THM_JUMP6:
3450 /* Thumb B (branch) instruction). */
3452 bfd_signed_vma relocation;
3453 bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
3454 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3455 bfd_signed_vma signed_check;
3457 /* CZB cannot jump backward. */
3458 if (r_type == R_ARM_THM_JUMP6)
3459 reloc_signed_min = 0;
3461 if (globals->use_rel)
3463 /* Need to refetch addend. */
3464 addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
3465 if (addend & ((howto->src_mask + 1) >> 1))
3468 signed_addend &= ~ howto->src_mask;
3469 signed_addend |= addend;
3472 signed_addend = addend;
3473 /* The value in the insn has been right shifted. We need to
3474 undo this, so that we can perform the address calculation
3475 in terms of bytes. */
3476 signed_addend <<= howto->rightshift;
3478 relocation = value + signed_addend;
3480 relocation -= (input_section->output_section->vma
3481 + input_section->output_offset
3484 relocation >>= howto->rightshift;
3485 signed_check = relocation;
3487 if (r_type == R_ARM_THM_JUMP6)
3488 relocation = ((relocation & 0x0020) << 4) | ((relocation & 0x001f) << 3);
3490 relocation &= howto->dst_mask;
3491 relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
3493 bfd_put_16 (input_bfd, relocation, hit_data);
3495 /* Assumes two's complement. */
3496 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3497 return bfd_reloc_overflow;
3499 return bfd_reloc_ok;
3502 case R_ARM_ALU_PCREL7_0:
3503 case R_ARM_ALU_PCREL15_8:
3504 case R_ARM_ALU_PCREL23_15:
3509 insn = bfd_get_32 (input_bfd, hit_data);
3510 if (globals->use_rel)
3512 /* Extract the addend. */
3513 addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
3514 signed_addend = addend;
3516 relocation = value + signed_addend;
3518 relocation -= (input_section->output_section->vma
3519 + input_section->output_offset
3521 insn = (insn & ~0xfff)
3522 | ((howto->bitpos << 7) & 0xf00)
3523 | ((relocation >> howto->bitpos) & 0xff);
3524 bfd_put_32 (input_bfd, value, hit_data);
3526 return bfd_reloc_ok;
3528 case R_ARM_GNU_VTINHERIT:
3529 case R_ARM_GNU_VTENTRY:
3530 return bfd_reloc_ok;
3532 case R_ARM_GOTOFF32:
3533 /* Relocation is relative to the start of the
3534 global offset table. */
3536 BFD_ASSERT (sgot != NULL);
3538 return bfd_reloc_notsupported;
3540 /* If we are addressing a Thumb function, we need to adjust the
3541 address by one, so that attempts to call the function pointer will
3542 correctly interpret it as Thumb code. */
3543 if (sym_flags == STT_ARM_TFUNC)
3546 /* Note that sgot->output_offset is not involved in this
3547 calculation. We always want the start of .got. If we
3548 define _GLOBAL_OFFSET_TABLE in a different way, as is
3549 permitted by the ABI, we might have to change this
3551 value -= sgot->output_section->vma;
3552 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3553 contents, rel->r_offset, value,
3557 /* Use global offset table as symbol value. */
3558 BFD_ASSERT (sgot != NULL);
3561 return bfd_reloc_notsupported;
3563 *unresolved_reloc_p = FALSE;
3564 value = sgot->output_section->vma;
3565 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3566 contents, rel->r_offset, value,
3570 case R_ARM_GOT_PREL:
3571 /* Relocation is to the entry for this symbol in the
3572 global offset table. */
3574 return bfd_reloc_notsupported;
3581 off = h->got.offset;
3582 BFD_ASSERT (off != (bfd_vma) -1);
3583 dyn = globals->root.dynamic_sections_created;
3585 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3587 && SYMBOL_REFERENCES_LOCAL (info, h))
3588 || (ELF_ST_VISIBILITY (h->other)
3589 && h->root.type == bfd_link_hash_undefweak))
3591 /* This is actually a static link, or it is a -Bsymbolic link
3592 and the symbol is defined locally. We must initialize this
3593 entry in the global offset table. Since the offset must
3594 always be a multiple of 4, we use the least significant bit
3595 to record whether we have initialized it already.
3597 When doing a dynamic link, we create a .rel.got relocation
3598 entry to initialize the value. This is done in the
3599 finish_dynamic_symbol routine. */
3604 /* If we are addressing a Thumb function, we need to
3605 adjust the address by one, so that attempts to
3606 call the function pointer will correctly
3607 interpret it as Thumb code. */
3608 if (sym_flags == STT_ARM_TFUNC)
3611 bfd_put_32 (output_bfd, value, sgot->contents + off);
3616 *unresolved_reloc_p = FALSE;
3618 value = sgot->output_offset + off;
3624 BFD_ASSERT (local_got_offsets != NULL &&
3625 local_got_offsets[r_symndx] != (bfd_vma) -1);
3627 off = local_got_offsets[r_symndx];
3629 /* The offset must always be a multiple of 4. We use the
3630 least significant bit to record whether we have already
3631 generated the necessary reloc. */
3636 /* If we are addressing a Thumb function, we need to
3637 adjust the address by one, so that attempts to
3638 call the function pointer will correctly
3639 interpret it as Thumb code. */
3640 if (sym_flags == STT_ARM_TFUNC)
3643 bfd_put_32 (output_bfd, value, sgot->contents + off);
3648 Elf_Internal_Rela outrel;
3651 srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
3652 BFD_ASSERT (srelgot != NULL);
3654 outrel.r_offset = (sgot->output_section->vma
3655 + sgot->output_offset
3657 outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
3658 loc = srelgot->contents;
3659 loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
3660 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3663 local_got_offsets[r_symndx] |= 1;
3666 value = sgot->output_offset + off;
3668 if (r_type != R_ARM_GOT32)
3669 value += sgot->output_section->vma;
3671 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3672 contents, rel->r_offset, value,
3675 case R_ARM_TLS_LDO32:
3676 value = value - dtpoff_base (info);
3678 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3679 contents, rel->r_offset, value, (bfd_vma) 0);
3681 case R_ARM_TLS_LDM32:
3685 if (globals->sgot == NULL)
3688 off = globals->tls_ldm_got.offset;
3694 /* If we don't know the module number, create a relocation
3698 Elf_Internal_Rela outrel;
3701 if (globals->srelgot == NULL)
3704 outrel.r_offset = (globals->sgot->output_section->vma
3705 + globals->sgot->output_offset + off);
3706 outrel.r_info = ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32);
3708 bfd_put_32 (output_bfd, 0, globals->sgot->contents + off);
3710 loc = globals->srelgot->contents;
3711 loc += globals->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
3712 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3715 bfd_put_32 (output_bfd, 1, globals->sgot->contents + off);
3717 globals->tls_ldm_got.offset |= 1;
3720 value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
3721 - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
3723 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3724 contents, rel->r_offset, value,
3728 case R_ARM_TLS_GD32:
3729 case R_ARM_TLS_IE32:
3735 if (globals->sgot == NULL)
3742 dyn = globals->root.dynamic_sections_created;
3743 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3745 || !SYMBOL_REFERENCES_LOCAL (info, h)))
3747 *unresolved_reloc_p = FALSE;
3750 off = h->got.offset;
3751 tls_type = ((struct elf32_arm_link_hash_entry *) h)->tls_type;
3755 if (local_got_offsets == NULL)
3757 off = local_got_offsets[r_symndx];
3758 tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
3761 if (tls_type == GOT_UNKNOWN)
3768 bfd_boolean need_relocs = FALSE;
3769 Elf_Internal_Rela outrel;
3770 bfd_byte *loc = NULL;
3773 /* The GOT entries have not been initialized yet. Do it
3774 now, and emit any relocations. If both an IE GOT and a
3775 GD GOT are necessary, we emit the GD first. */
3777 if ((info->shared || indx != 0)
3779 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3780 || h->root.type != bfd_link_hash_undefweak))
3783 if (globals->srelgot == NULL)
3785 loc = globals->srelgot->contents;
3786 loc += globals->srelgot->reloc_count * sizeof (Elf32_External_Rel);
3789 if (tls_type & GOT_TLS_GD)
3793 outrel.r_offset = (globals->sgot->output_section->vma
3794 + globals->sgot->output_offset + cur_off);
3795 outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DTPMOD32);
3796 bfd_put_32 (output_bfd, 0, globals->sgot->contents + cur_off);
3798 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3799 globals->srelgot->reloc_count++;
3800 loc += sizeof (Elf32_External_Rel);
3803 bfd_put_32 (output_bfd, value - dtpoff_base (info),
3804 globals->sgot->contents + cur_off + 4);
3807 bfd_put_32 (output_bfd, 0,
3808 globals->sgot->contents + cur_off + 4);
3810 outrel.r_info = ELF32_R_INFO (indx,
3811 R_ARM_TLS_DTPOFF32);
3812 outrel.r_offset += 4;
3813 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3814 globals->srelgot->reloc_count++;
3815 loc += sizeof (Elf32_External_Rel);
3820 /* If we are not emitting relocations for a
3821 general dynamic reference, then we must be in a
3822 static link or an executable link with the
3823 symbol binding locally. Mark it as belonging
3824 to module 1, the executable. */
3825 bfd_put_32 (output_bfd, 1,
3826 globals->sgot->contents + cur_off);
3827 bfd_put_32 (output_bfd, value - dtpoff_base (info),
3828 globals->sgot->contents + cur_off + 4);
3834 if (tls_type & GOT_TLS_IE)
3838 outrel.r_offset = (globals->sgot->output_section->vma
3839 + globals->sgot->output_offset
3841 outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_TPOFF32);
3844 bfd_put_32 (output_bfd, value - dtpoff_base (info),
3845 globals->sgot->contents + cur_off);
3847 bfd_put_32 (output_bfd, 0,
3848 globals->sgot->contents + cur_off);
3850 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3851 globals->srelgot->reloc_count++;
3852 loc += sizeof (Elf32_External_Rel);
3855 bfd_put_32 (output_bfd, tpoff (info, value),
3856 globals->sgot->contents + cur_off);
3863 local_got_offsets[r_symndx] |= 1;
3866 if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32)
3868 value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
3869 - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
3871 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3872 contents, rel->r_offset, value,
3876 case R_ARM_TLS_LE32:
3879 (*_bfd_error_handler)
3880 (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
3881 input_bfd, input_section,
3882 (long) rel->r_offset, howto->name);
3886 value = tpoff (info, value);
3888 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3889 contents, rel->r_offset, value, (bfd_vma) 0);
3892 if (globals->fix_v4bx)
3894 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
3896 /* Ensure that we have a BX instruction. */
3897 BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
3899 /* Preserve Rm (lowest four bits) and the condition code
3900 (highest four bits). Other bits encode MOV PC,Rm. */
3901 insn = (insn & 0xf000000f) | 0x01a0f000;
3903 bfd_put_32 (input_bfd, insn, hit_data);
3905 return bfd_reloc_ok;
3908 return bfd_reloc_notsupported;
3912 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS. */
3914 arm_add_to_rel (bfd * abfd,
3916 reloc_howto_type * howto,
3917 bfd_signed_vma increment)
3919 bfd_signed_vma addend;
3921 if (howto->type == R_ARM_THM_CALL)
3923 int upper_insn, lower_insn;
3926 upper_insn = bfd_get_16 (abfd, address);
3927 lower_insn = bfd_get_16 (abfd, address + 2);
3928 upper = upper_insn & 0x7ff;
3929 lower = lower_insn & 0x7ff;
3931 addend = (upper << 12) | (lower << 1);
3932 addend += increment;
3935 upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
3936 lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
3938 bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
3939 bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
3945 contents = bfd_get_32 (abfd, address);
3947 /* Get the (signed) value from the instruction. */
3948 addend = contents & howto->src_mask;
3949 if (addend & ((howto->src_mask + 1) >> 1))
3951 bfd_signed_vma mask;
3954 mask &= ~ howto->src_mask;
3958 /* Add in the increment, (which is a byte value). */
3959 switch (howto->type)
3962 addend += increment;
3969 addend <<= howto->size;
3970 addend += increment;
3972 /* Should we check for overflow here ? */
3974 /* Drop any undesired bits. */
3975 addend >>= howto->rightshift;
3979 contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
3981 bfd_put_32 (abfd, contents, address);
3985 #define IS_ARM_TLS_RELOC(R_TYPE) \
3986 ((R_TYPE) == R_ARM_TLS_GD32 \
3987 || (R_TYPE) == R_ARM_TLS_LDO32 \
3988 || (R_TYPE) == R_ARM_TLS_LDM32 \
3989 || (R_TYPE) == R_ARM_TLS_DTPOFF32 \
3990 || (R_TYPE) == R_ARM_TLS_DTPMOD32 \
3991 || (R_TYPE) == R_ARM_TLS_TPOFF32 \
3992 || (R_TYPE) == R_ARM_TLS_LE32 \
3993 || (R_TYPE) == R_ARM_TLS_IE32)
3995 /* Relocate an ARM ELF section. */
3997 elf32_arm_relocate_section (bfd * output_bfd,
3998 struct bfd_link_info * info,
4000 asection * input_section,
4001 bfd_byte * contents,
4002 Elf_Internal_Rela * relocs,
4003 Elf_Internal_Sym * local_syms,
4004 asection ** local_sections)
4006 Elf_Internal_Shdr *symtab_hdr;
4007 struct elf_link_hash_entry **sym_hashes;
4008 Elf_Internal_Rela *rel;
4009 Elf_Internal_Rela *relend;
4011 struct elf32_arm_link_hash_table * globals;
4013 globals = elf32_arm_hash_table (info);
4014 if (info->relocatable && !globals->use_rel)
4017 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
4018 sym_hashes = elf_sym_hashes (input_bfd);
4021 relend = relocs + input_section->reloc_count;
4022 for (; rel < relend; rel++)
4025 reloc_howto_type * howto;
4026 unsigned long r_symndx;
4027 Elf_Internal_Sym * sym;
4029 struct elf_link_hash_entry * h;
4031 bfd_reloc_status_type r;
4034 bfd_boolean unresolved_reloc = FALSE;
4036 r_symndx = ELF32_R_SYM (rel->r_info);
4037 r_type = ELF32_R_TYPE (rel->r_info);
4038 r_type = arm_real_reloc_type (globals, r_type);
4040 if ( r_type == R_ARM_GNU_VTENTRY
4041 || r_type == R_ARM_GNU_VTINHERIT)
4044 bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
4045 howto = bfd_reloc.howto;
4047 if (info->relocatable && globals->use_rel)
4049 /* This is a relocatable link. We don't have to change
4050 anything, unless the reloc is against a section symbol,
4051 in which case we have to adjust according to where the
4052 section symbol winds up in the output section. */
4053 if (r_symndx < symtab_hdr->sh_info)
4055 sym = local_syms + r_symndx;
4056 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4058 sec = local_sections[r_symndx];
4059 arm_add_to_rel (input_bfd, contents + rel->r_offset,
4061 (bfd_signed_vma) (sec->output_offset
4069 /* This is a final link. */
4074 if (r_symndx < symtab_hdr->sh_info)
4076 sym = local_syms + r_symndx;
4077 sym_type = ELF32_ST_TYPE (sym->st_info);
4078 sec = local_sections[r_symndx];
4079 if (globals->use_rel)
4081 relocation = (sec->output_section->vma
4082 + sec->output_offset
4084 if ((sec->flags & SEC_MERGE)
4085 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4088 bfd_vma addend, value;
4090 if (howto->rightshift)
4092 (*_bfd_error_handler)
4093 (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
4094 input_bfd, input_section,
4095 (long) rel->r_offset, howto->name);
4099 value = bfd_get_32 (input_bfd, contents + rel->r_offset);
4101 /* Get the (signed) value from the instruction. */
4102 addend = value & howto->src_mask;
4103 if (addend & ((howto->src_mask + 1) >> 1))
4105 bfd_signed_vma mask;
4108 mask &= ~ howto->src_mask;
4113 _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
4115 addend += msec->output_section->vma + msec->output_offset;
4116 value = (value & ~ howto->dst_mask) | (addend & howto->dst_mask);
4117 bfd_put_32 (input_bfd, value, contents + rel->r_offset);
4121 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4127 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4128 r_symndx, symtab_hdr, sym_hashes,
4130 unresolved_reloc, warned);
4136 name = h->root.root.string;
4139 name = (bfd_elf_string_from_elf_section
4140 (input_bfd, symtab_hdr->sh_link, sym->st_name));
4141 if (name == NULL || *name == '\0')
4142 name = bfd_section_name (input_bfd, sec);
4146 && r_type != R_ARM_NONE
4148 || h->root.type == bfd_link_hash_defined
4149 || h->root.type == bfd_link_hash_defweak)
4150 && IS_ARM_TLS_RELOC (r_type) != (sym_type == STT_TLS))
4152 (*_bfd_error_handler)
4153 ((sym_type == STT_TLS
4154 ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
4155 : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
4158 (long) rel->r_offset,
4163 r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
4164 input_section, contents, rel,
4165 relocation, info, sec, name,
4166 (h ? ELF_ST_TYPE (h->type) :
4167 ELF_ST_TYPE (sym->st_info)), h,
4170 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4171 because such sections are not SEC_ALLOC and thus ld.so will
4172 not process them. */
4173 if (unresolved_reloc
4174 && !((input_section->flags & SEC_DEBUGGING) != 0
4177 (*_bfd_error_handler)
4178 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
4181 (long) rel->r_offset,
4183 h->root.root.string);
4187 if (r != bfd_reloc_ok)
4189 const char * msg = (const char *) 0;
4193 case bfd_reloc_overflow:
4194 /* If the overflowing reloc was to an undefined symbol,
4195 we have already printed one error message and there
4196 is no point complaining again. */
4198 h->root.type != bfd_link_hash_undefined)
4199 && (!((*info->callbacks->reloc_overflow)
4200 (info, (h ? &h->root : NULL), name, howto->name,
4201 (bfd_vma) 0, input_bfd, input_section,
4206 case bfd_reloc_undefined:
4207 if (!((*info->callbacks->undefined_symbol)
4208 (info, name, input_bfd, input_section,
4209 rel->r_offset, TRUE)))
4213 case bfd_reloc_outofrange:
4214 msg = _("internal error: out of range error");
4217 case bfd_reloc_notsupported:
4218 msg = _("internal error: unsupported relocation error");
4221 case bfd_reloc_dangerous:
4222 msg = _("internal error: dangerous error");
4226 msg = _("internal error: unknown error");
4230 if (!((*info->callbacks->warning)
4231 (info, msg, name, input_bfd, input_section,
4242 /* Set the right machine number. */
4245 elf32_arm_object_p (bfd *abfd)
4249 mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
4251 if (mach != bfd_mach_arm_unknown)
4252 bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
4254 else if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
4255 bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
4258 bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
4263 /* Function to keep ARM specific flags in the ELF header. */
4266 elf32_arm_set_private_flags (bfd *abfd, flagword flags)
4268 if (elf_flags_init (abfd)
4269 && elf_elfheader (abfd)->e_flags != flags)
4271 if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
4273 if (flags & EF_ARM_INTERWORK)
4274 (*_bfd_error_handler)
4275 (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
4279 (_("Warning: Clearing the interworking flag of %B due to outside request"),
4285 elf_elfheader (abfd)->e_flags = flags;
4286 elf_flags_init (abfd) = TRUE;
4292 /* Copy backend specific data from one object module to another. */
4295 elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
4300 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4301 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4304 in_flags = elf_elfheader (ibfd)->e_flags;
4305 out_flags = elf_elfheader (obfd)->e_flags;
4307 if (elf_flags_init (obfd)
4308 && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
4309 && in_flags != out_flags)
4311 /* Cannot mix APCS26 and APCS32 code. */
4312 if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
4315 /* Cannot mix float APCS and non-float APCS code. */
4316 if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
4319 /* If the src and dest have different interworking flags
4320 then turn off the interworking bit. */
4321 if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
4323 if (out_flags & EF_ARM_INTERWORK)
4325 (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
4328 in_flags &= ~EF_ARM_INTERWORK;
4331 /* Likewise for PIC, though don't warn for this case. */
4332 if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
4333 in_flags &= ~EF_ARM_PIC;
4336 elf_elfheader (obfd)->e_flags = in_flags;
4337 elf_flags_init (obfd) = TRUE;
4339 /* Also copy the EI_OSABI field. */
4340 elf_elfheader (obfd)->e_ident[EI_OSABI] =
4341 elf_elfheader (ibfd)->e_ident[EI_OSABI];
4346 /* Merge backend specific data from an object file to the output
4347 object file when linking. */
4350 elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
4354 bfd_boolean flags_compatible = TRUE;
4357 /* Check if we have the same endianess. */
4358 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
4361 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4362 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4365 /* The input BFD must have had its flags initialised. */
4366 /* The following seems bogus to me -- The flags are initialized in
4367 the assembler but I don't think an elf_flags_init field is
4368 written into the object. */
4369 /* BFD_ASSERT (elf_flags_init (ibfd)); */
4371 in_flags = elf_elfheader (ibfd)->e_flags;
4372 out_flags = elf_elfheader (obfd)->e_flags;
4374 if (!elf_flags_init (obfd))
4376 /* If the input is the default architecture and had the default
4377 flags then do not bother setting the flags for the output
4378 architecture, instead allow future merges to do this. If no
4379 future merges ever set these flags then they will retain their
4380 uninitialised values, which surprise surprise, correspond
4381 to the default values. */
4382 if (bfd_get_arch_info (ibfd)->the_default
4383 && elf_elfheader (ibfd)->e_flags == 0)
4386 elf_flags_init (obfd) = TRUE;
4387 elf_elfheader (obfd)->e_flags = in_flags;
4389 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
4390 && bfd_get_arch_info (obfd)->the_default)
4391 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
4396 /* Determine what should happen if the input ARM architecture
4397 does not match the output ARM architecture. */
4398 if (! bfd_arm_merge_machines (ibfd, obfd))
4401 /* Identical flags must be compatible. */
4402 if (in_flags == out_flags)
4405 /* Check to see if the input BFD actually contains any sections. If
4406 not, its flags may not have been initialised either, but it
4407 cannot actually cause any incompatiblity. Do not short-circuit
4408 dynamic objects; their section list may be emptied by
4409 elf_link_add_object_symbols.
4411 Also check to see if there are no code sections in the input.
4412 In this case there is no need to check for code specific flags.
4413 XXX - do we need to worry about floating-point format compatability
4414 in data sections ? */
4415 if (!(ibfd->flags & DYNAMIC))
4417 bfd_boolean null_input_bfd = TRUE;
4418 bfd_boolean only_data_sections = TRUE;
4420 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4422 /* Ignore synthetic glue sections. */
4423 if (strcmp (sec->name, ".glue_7")
4424 && strcmp (sec->name, ".glue_7t"))
4426 if ((bfd_get_section_flags (ibfd, sec)
4427 & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
4428 == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
4429 only_data_sections = FALSE;
4431 null_input_bfd = FALSE;
4436 if (null_input_bfd || only_data_sections)
4440 /* Complain about various flag mismatches. */
4441 if (EF_ARM_EABI_VERSION (in_flags) != EF_ARM_EABI_VERSION (out_flags))
4444 (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
4446 (in_flags & EF_ARM_EABIMASK) >> 24,
4447 (out_flags & EF_ARM_EABIMASK) >> 24);
4451 /* Not sure what needs to be checked for EABI versions >= 1. */
4452 if (EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
4454 if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
4457 (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
4459 in_flags & EF_ARM_APCS_26 ? 26 : 32,
4460 out_flags & EF_ARM_APCS_26 ? 26 : 32);
4461 flags_compatible = FALSE;
4464 if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
4466 if (in_flags & EF_ARM_APCS_FLOAT)
4468 (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"),
4472 (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"),
4475 flags_compatible = FALSE;
4478 if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
4480 if (in_flags & EF_ARM_VFP_FLOAT)
4482 (_("ERROR: %B uses VFP instructions, whereas %B does not"),
4486 (_("ERROR: %B uses FPA instructions, whereas %B does not"),
4489 flags_compatible = FALSE;
4492 if ((in_flags & EF_ARM_MAVERICK_FLOAT) != (out_flags & EF_ARM_MAVERICK_FLOAT))
4494 if (in_flags & EF_ARM_MAVERICK_FLOAT)
4496 (_("ERROR: %B uses Maverick instructions, whereas %B does not"),
4500 (_("ERROR: %B does not use Maverick instructions, whereas %B does"),
4503 flags_compatible = FALSE;
4506 #ifdef EF_ARM_SOFT_FLOAT
4507 if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
4509 /* We can allow interworking between code that is VFP format
4510 layout, and uses either soft float or integer regs for
4511 passing floating point arguments and results. We already
4512 know that the APCS_FLOAT flags match; similarly for VFP
4514 if ((in_flags & EF_ARM_APCS_FLOAT) != 0
4515 || (in_flags & EF_ARM_VFP_FLOAT) == 0)
4517 if (in_flags & EF_ARM_SOFT_FLOAT)
4519 (_("ERROR: %B uses software FP, whereas %B uses hardware FP"),
4523 (_("ERROR: %B uses hardware FP, whereas %B uses software FP"),
4526 flags_compatible = FALSE;
4531 /* Interworking mismatch is only a warning. */
4532 if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
4534 if (in_flags & EF_ARM_INTERWORK)
4537 (_("Warning: %B supports interworking, whereas %B does not"),
4543 (_("Warning: %B does not support interworking, whereas %B does"),
4549 return flags_compatible;
4552 /* Display the flags field. */
4555 elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
4557 FILE * file = (FILE *) ptr;
4558 unsigned long flags;
4560 BFD_ASSERT (abfd != NULL && ptr != NULL);
4562 /* Print normal ELF private data. */
4563 _bfd_elf_print_private_bfd_data (abfd, ptr);
4565 flags = elf_elfheader (abfd)->e_flags;
4566 /* Ignore init flag - it may not be set, despite the flags field
4567 containing valid data. */
4569 /* xgettext:c-format */
4570 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
4572 switch (EF_ARM_EABI_VERSION (flags))
4574 case EF_ARM_EABI_UNKNOWN:
4575 /* The following flag bits are GNU extensions and not part of the
4576 official ARM ELF extended ABI. Hence they are only decoded if
4577 the EABI version is not set. */
4578 if (flags & EF_ARM_INTERWORK)
4579 fprintf (file, _(" [interworking enabled]"));
4581 if (flags & EF_ARM_APCS_26)
4582 fprintf (file, " [APCS-26]");
4584 fprintf (file, " [APCS-32]");
4586 if (flags & EF_ARM_VFP_FLOAT)
4587 fprintf (file, _(" [VFP float format]"));
4588 else if (flags & EF_ARM_MAVERICK_FLOAT)
4589 fprintf (file, _(" [Maverick float format]"));
4591 fprintf (file, _(" [FPA float format]"));
4593 if (flags & EF_ARM_APCS_FLOAT)
4594 fprintf (file, _(" [floats passed in float registers]"));
4596 if (flags & EF_ARM_PIC)
4597 fprintf (file, _(" [position independent]"));
4599 if (flags & EF_ARM_NEW_ABI)
4600 fprintf (file, _(" [new ABI]"));
4602 if (flags & EF_ARM_OLD_ABI)
4603 fprintf (file, _(" [old ABI]"));
4605 if (flags & EF_ARM_SOFT_FLOAT)
4606 fprintf (file, _(" [software FP]"));
4608 flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
4609 | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
4610 | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT
4611 | EF_ARM_MAVERICK_FLOAT);
4614 case EF_ARM_EABI_VER1:
4615 fprintf (file, _(" [Version1 EABI]"));
4617 if (flags & EF_ARM_SYMSARESORTED)
4618 fprintf (file, _(" [sorted symbol table]"));
4620 fprintf (file, _(" [unsorted symbol table]"));
4622 flags &= ~ EF_ARM_SYMSARESORTED;
4625 case EF_ARM_EABI_VER2:
4626 fprintf (file, _(" [Version2 EABI]"));
4628 if (flags & EF_ARM_SYMSARESORTED)
4629 fprintf (file, _(" [sorted symbol table]"));
4631 fprintf (file, _(" [unsorted symbol table]"));
4633 if (flags & EF_ARM_DYNSYMSUSESEGIDX)
4634 fprintf (file, _(" [dynamic symbols use segment index]"));
4636 if (flags & EF_ARM_MAPSYMSFIRST)
4637 fprintf (file, _(" [mapping symbols precede others]"));
4639 flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
4640 | EF_ARM_MAPSYMSFIRST);
4643 case EF_ARM_EABI_VER3:
4644 fprintf (file, _(" [Version3 EABI]"));
4647 case EF_ARM_EABI_VER4:
4648 fprintf (file, _(" [Version4 EABI]"));
4650 if (flags & EF_ARM_BE8)
4651 fprintf (file, _(" [BE8]"));
4653 if (flags & EF_ARM_LE8)
4654 fprintf (file, _(" [LE8]"));
4656 flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
4660 fprintf (file, _(" <EABI version unrecognised>"));
4664 flags &= ~ EF_ARM_EABIMASK;
4666 if (flags & EF_ARM_RELEXEC)
4667 fprintf (file, _(" [relocatable executable]"));
4669 if (flags & EF_ARM_HASENTRY)
4670 fprintf (file, _(" [has entry point]"));
4672 flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
4675 fprintf (file, _("<Unrecognised flag bits set>"));
4683 elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
4685 switch (ELF_ST_TYPE (elf_sym->st_info))
4688 return ELF_ST_TYPE (elf_sym->st_info);
4691 /* If the symbol is not an object, return the STT_ARM_16BIT flag.
4692 This allows us to distinguish between data used by Thumb instructions
4693 and non-data (which is probably code) inside Thumb regions of an
4695 if (type != STT_OBJECT)
4696 return ELF_ST_TYPE (elf_sym->st_info);
4707 elf32_arm_gc_mark_hook (asection * sec,
4708 struct bfd_link_info * info ATTRIBUTE_UNUSED,
4709 Elf_Internal_Rela * rel,
4710 struct elf_link_hash_entry * h,
4711 Elf_Internal_Sym * sym)
4715 switch (ELF32_R_TYPE (rel->r_info))
4717 case R_ARM_GNU_VTINHERIT:
4718 case R_ARM_GNU_VTENTRY:
4722 switch (h->root.type)
4724 case bfd_link_hash_defined:
4725 case bfd_link_hash_defweak:
4726 return h->root.u.def.section;
4728 case bfd_link_hash_common:
4729 return h->root.u.c.p->section;
4737 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
4742 /* Update the got entry reference counts for the section being removed. */
4745 elf32_arm_gc_sweep_hook (bfd * abfd,
4746 struct bfd_link_info * info,
4748 const Elf_Internal_Rela * relocs)
4750 Elf_Internal_Shdr *symtab_hdr;
4751 struct elf_link_hash_entry **sym_hashes;
4752 bfd_signed_vma *local_got_refcounts;
4753 const Elf_Internal_Rela *rel, *relend;
4754 struct elf32_arm_link_hash_table * globals;
4756 globals = elf32_arm_hash_table (info);
4758 elf_section_data (sec)->local_dynrel = NULL;
4760 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4761 sym_hashes = elf_sym_hashes (abfd);
4762 local_got_refcounts = elf_local_got_refcounts (abfd);
4764 relend = relocs + sec->reloc_count;
4765 for (rel = relocs; rel < relend; rel++)
4767 unsigned long r_symndx;
4768 struct elf_link_hash_entry *h = NULL;
4771 r_symndx = ELF32_R_SYM (rel->r_info);
4772 if (r_symndx >= symtab_hdr->sh_info)
4774 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4775 while (h->root.type == bfd_link_hash_indirect
4776 || h->root.type == bfd_link_hash_warning)
4777 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4780 r_type = ELF32_R_TYPE (rel->r_info);
4781 r_type = arm_real_reloc_type (globals, r_type);
4785 case R_ARM_GOT_PREL:
4786 case R_ARM_TLS_GD32:
4787 case R_ARM_TLS_IE32:
4790 if (h->got.refcount > 0)
4791 h->got.refcount -= 1;
4793 else if (local_got_refcounts != NULL)
4795 if (local_got_refcounts[r_symndx] > 0)
4796 local_got_refcounts[r_symndx] -= 1;
4800 case R_ARM_TLS_LDM32:
4801 elf32_arm_hash_table (info)->tls_ldm_got.refcount -= 1;
4811 case R_ARM_THM_CALL:
4812 /* Should the interworking branches be here also? */
4816 struct elf32_arm_link_hash_entry *eh;
4817 struct elf32_arm_relocs_copied **pp;
4818 struct elf32_arm_relocs_copied *p;
4820 eh = (struct elf32_arm_link_hash_entry *) h;
4822 if (h->plt.refcount > 0)
4824 h->plt.refcount -= 1;
4825 if (ELF32_R_TYPE (rel->r_info) == R_ARM_THM_CALL)
4826 eh->plt_thumb_refcount--;
4829 if (r_type == R_ARM_ABS32
4830 || r_type == R_ARM_REL32)
4832 for (pp = &eh->relocs_copied; (p = *pp) != NULL;
4834 if (p->section == sec)
4837 if (ELF32_R_TYPE (rel->r_info) == R_ARM_REL32)
4855 /* Look through the relocs for a section during the first phase. */
4858 elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
4859 asection *sec, const Elf_Internal_Rela *relocs)
4861 Elf_Internal_Shdr *symtab_hdr;
4862 struct elf_link_hash_entry **sym_hashes;
4863 struct elf_link_hash_entry **sym_hashes_end;
4864 const Elf_Internal_Rela *rel;
4865 const Elf_Internal_Rela *rel_end;
4868 bfd_vma *local_got_offsets;
4869 struct elf32_arm_link_hash_table *htab;
4871 if (info->relocatable)
4874 htab = elf32_arm_hash_table (info);
4877 /* Create dynamic sections for relocatable executables so that we can
4878 copy relocations. */
4879 if (htab->root.is_relocatable_executable
4880 && ! htab->root.dynamic_sections_created)
4882 if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
4886 dynobj = elf_hash_table (info)->dynobj;
4887 local_got_offsets = elf_local_got_offsets (abfd);
4889 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4890 sym_hashes = elf_sym_hashes (abfd);
4891 sym_hashes_end = sym_hashes
4892 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
4894 if (!elf_bad_symtab (abfd))
4895 sym_hashes_end -= symtab_hdr->sh_info;
4897 rel_end = relocs + sec->reloc_count;
4898 for (rel = relocs; rel < rel_end; rel++)
4900 struct elf_link_hash_entry *h;
4901 struct elf32_arm_link_hash_entry *eh;
4902 unsigned long r_symndx;
4905 r_symndx = ELF32_R_SYM (rel->r_info);
4906 r_type = ELF32_R_TYPE (rel->r_info);
4907 r_type = arm_real_reloc_type (htab, r_type);
4909 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
4911 (*_bfd_error_handler) (_("%B: bad symbol index: %d"), abfd,
4916 if (r_symndx < symtab_hdr->sh_info)
4920 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4921 while (h->root.type == bfd_link_hash_indirect
4922 || h->root.type == bfd_link_hash_warning)
4923 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4926 eh = (struct elf32_arm_link_hash_entry *) h;
4931 case R_ARM_GOT_PREL:
4932 case R_ARM_TLS_GD32:
4933 case R_ARM_TLS_IE32:
4934 /* This symbol requires a global offset table entry. */
4936 int tls_type, old_tls_type;
4940 case R_ARM_TLS_GD32: tls_type = GOT_TLS_GD; break;
4941 case R_ARM_TLS_IE32: tls_type = GOT_TLS_IE; break;
4942 default: tls_type = GOT_NORMAL; break;
4948 old_tls_type = elf32_arm_hash_entry (h)->tls_type;
4952 bfd_signed_vma *local_got_refcounts;
4954 /* This is a global offset table entry for a local symbol. */
4955 local_got_refcounts = elf_local_got_refcounts (abfd);
4956 if (local_got_refcounts == NULL)
4960 size = symtab_hdr->sh_info;
4961 size *= (sizeof (bfd_signed_vma) + sizeof(char));
4962 local_got_refcounts = bfd_zalloc (abfd, size);
4963 if (local_got_refcounts == NULL)
4965 elf_local_got_refcounts (abfd) = local_got_refcounts;
4966 elf32_arm_local_got_tls_type (abfd)
4967 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
4969 local_got_refcounts[r_symndx] += 1;
4970 old_tls_type = elf32_arm_local_got_tls_type (abfd) [r_symndx];
4973 /* We will already have issued an error message if there is a
4974 TLS / non-TLS mismatch, based on the symbol type. We don't
4975 support any linker relaxations. So just combine any TLS
4977 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
4978 && tls_type != GOT_NORMAL)
4979 tls_type |= old_tls_type;
4981 if (old_tls_type != tls_type)
4984 elf32_arm_hash_entry (h)->tls_type = tls_type;
4986 elf32_arm_local_got_tls_type (abfd) [r_symndx] = tls_type;
4991 case R_ARM_TLS_LDM32:
4992 if (r_type == R_ARM_TLS_LDM32)
4993 htab->tls_ldm_got.refcount++;
4996 case R_ARM_GOTOFF32:
4998 if (htab->sgot == NULL)
5000 if (htab->root.dynobj == NULL)
5001 htab->root.dynobj = abfd;
5002 if (!create_got_section (htab->root.dynobj, info))
5014 case R_ARM_THM_CALL:
5015 /* Should the interworking branches be listed here? */
5018 /* If this reloc is in a read-only section, we might
5019 need a copy reloc. We can't check reliably at this
5020 stage whether the section is read-only, as input
5021 sections have not yet been mapped to output sections.
5022 Tentatively set the flag for now, and correct in
5023 adjust_dynamic_symbol. */
5027 /* We may need a .plt entry if the function this reloc
5028 refers to is in a different object. We can't tell for
5029 sure yet, because something later might force the
5031 if (r_type == R_ARM_PC24
5032 || r_type == R_ARM_CALL
5033 || r_type == R_ARM_JUMP24
5034 || r_type == R_ARM_PREL31
5035 || r_type == R_ARM_PLT32
5036 || r_type == R_ARM_THM_CALL)
5039 /* If we create a PLT entry, this relocation will reference
5040 it, even if it's an ABS32 relocation. */
5041 h->plt.refcount += 1;
5043 if (r_type == R_ARM_THM_CALL)
5044 eh->plt_thumb_refcount += 1;
5047 /* If we are creating a shared library or relocatable executable,
5048 and this is a reloc against a global symbol, or a non PC
5049 relative reloc against a local symbol, then we need to copy
5050 the reloc into the shared library. However, if we are linking
5051 with -Bsymbolic, we do not need to copy a reloc against a
5052 global symbol which is defined in an object we are
5053 including in the link (i.e., DEF_REGULAR is set). At
5054 this point we have not seen all the input files, so it is
5055 possible that DEF_REGULAR is not set now but will be set
5056 later (it is never cleared). We account for that
5057 possibility below by storing information in the
5058 relocs_copied field of the hash table entry. */
5059 if ((info->shared || htab->root.is_relocatable_executable)
5060 && (sec->flags & SEC_ALLOC) != 0
5061 && (r_type == R_ARM_ABS32
5062 || (h != NULL && ! h->needs_plt
5063 && (! info->symbolic || ! h->def_regular))))
5065 struct elf32_arm_relocs_copied *p, **head;
5067 /* When creating a shared object, we must copy these
5068 reloc types into the output file. We create a reloc
5069 section in dynobj and make room for this reloc. */
5074 name = (bfd_elf_string_from_elf_section
5076 elf_elfheader (abfd)->e_shstrndx,
5077 elf_section_data (sec)->rel_hdr.sh_name));
5081 BFD_ASSERT (strncmp (name, ".rel", 4) == 0
5082 && strcmp (bfd_get_section_name (abfd, sec),
5085 sreloc = bfd_get_section_by_name (dynobj, name);
5090 flags = (SEC_HAS_CONTENTS | SEC_READONLY
5091 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
5092 if ((sec->flags & SEC_ALLOC) != 0
5093 /* BPABI objects never have dynamic
5094 relocations mapped. */
5095 && !htab->symbian_p)
5096 flags |= SEC_ALLOC | SEC_LOAD;
5097 sreloc = bfd_make_section_with_flags (dynobj,
5101 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
5105 elf_section_data (sec)->sreloc = sreloc;
5108 /* If this is a global symbol, we count the number of
5109 relocations we need for this symbol. */
5112 head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied;
5116 /* Track dynamic relocs needed for local syms too.
5117 We really need local syms available to do this
5121 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
5126 head = ((struct elf32_arm_relocs_copied **)
5127 &elf_section_data (s)->local_dynrel);
5131 if (p == NULL || p->section != sec)
5133 bfd_size_type amt = sizeof *p;
5135 p = bfd_alloc (htab->root.dynobj, amt);
5145 if (r_type == R_ARM_REL32)
5151 /* This relocation describes the C++ object vtable hierarchy.
5152 Reconstruct it for later use during GC. */
5153 case R_ARM_GNU_VTINHERIT:
5154 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5158 /* This relocation describes which C++ vtable entries are actually
5159 used. Record for later use during GC. */
5160 case R_ARM_GNU_VTENTRY:
5161 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
5170 /* Treat mapping symbols as special target symbols. */
5173 elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
5175 return bfd_is_arm_mapping_symbol_name (sym->name);
5178 /* This is a copy of elf_find_function() from elf.c except that
5179 ARM mapping symbols are ignored when looking for function names
5180 and STT_ARM_TFUNC is considered to a function type. */
5183 arm_elf_find_function (bfd * abfd ATTRIBUTE_UNUSED,
5187 const char ** filename_ptr,
5188 const char ** functionname_ptr)
5190 const char * filename = NULL;
5191 asymbol * func = NULL;
5192 bfd_vma low_func = 0;
5195 for (p = symbols; *p != NULL; p++)
5199 q = (elf_symbol_type *) *p;
5201 switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
5206 filename = bfd_asymbol_name (&q->symbol);
5211 /* Skip $a and $t symbols. */
5212 if ((q->symbol.flags & BSF_LOCAL)
5213 && bfd_is_arm_mapping_symbol_name (q->symbol.name))
5216 if (bfd_get_section (&q->symbol) == section
5217 && q->symbol.value >= low_func
5218 && q->symbol.value <= offset)
5220 func = (asymbol *) q;
5221 low_func = q->symbol.value;
5231 *filename_ptr = filename;
5232 if (functionname_ptr)
5233 *functionname_ptr = bfd_asymbol_name (func);
5239 /* Find the nearest line to a particular section and offset, for error
5240 reporting. This code is a duplicate of the code in elf.c, except
5241 that it uses arm_elf_find_function. */
5244 elf32_arm_find_nearest_line (bfd * abfd,
5248 const char ** filename_ptr,
5249 const char ** functionname_ptr,
5250 unsigned int * line_ptr)
5252 bfd_boolean found = FALSE;
5254 /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it. */
5256 if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
5257 filename_ptr, functionname_ptr,
5259 & elf_tdata (abfd)->dwarf2_find_line_info))
5261 if (!*functionname_ptr)
5262 arm_elf_find_function (abfd, section, symbols, offset,
5263 *filename_ptr ? NULL : filename_ptr,
5269 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
5270 & found, filename_ptr,
5271 functionname_ptr, line_ptr,
5272 & elf_tdata (abfd)->line_info))
5275 if (found && (*functionname_ptr || *line_ptr))
5278 if (symbols == NULL)
5281 if (! arm_elf_find_function (abfd, section, symbols, offset,
5282 filename_ptr, functionname_ptr))
5290 elf32_arm_find_inliner_info (bfd * abfd,
5291 const char ** filename_ptr,
5292 const char ** functionname_ptr,
5293 unsigned int * line_ptr)
5296 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
5297 functionname_ptr, line_ptr,
5298 & elf_tdata (abfd)->dwarf2_find_line_info);
5302 /* Adjust a symbol defined by a dynamic object and referenced by a
5303 regular object. The current definition is in some section of the
5304 dynamic object, but we're not including those sections. We have to
5305 change the definition to something the rest of the link can
5309 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
5310 struct elf_link_hash_entry * h)
5314 unsigned int power_of_two;
5315 struct elf32_arm_link_hash_entry * eh;
5316 struct elf32_arm_link_hash_table *globals;
5318 globals = elf32_arm_hash_table (info);
5319 dynobj = elf_hash_table (info)->dynobj;
5321 /* Make sure we know what is going on here. */
5322 BFD_ASSERT (dynobj != NULL
5324 || h->u.weakdef != NULL
5327 && !h->def_regular)));
5329 eh = (struct elf32_arm_link_hash_entry *) h;
5331 /* If this is a function, put it in the procedure linkage table. We
5332 will fill in the contents of the procedure linkage table later,
5333 when we know the address of the .got section. */
5334 if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC
5337 if (h->plt.refcount <= 0
5338 || SYMBOL_CALLS_LOCAL (info, h)
5339 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5340 && h->root.type == bfd_link_hash_undefweak))
5342 /* This case can occur if we saw a PLT32 reloc in an input
5343 file, but the symbol was never referred to by a dynamic
5344 object, or if all references were garbage collected. In
5345 such a case, we don't actually need to build a procedure
5346 linkage table, and we can just do a PC24 reloc instead. */
5347 h->plt.offset = (bfd_vma) -1;
5348 eh->plt_thumb_refcount = 0;
5356 /* It's possible that we incorrectly decided a .plt reloc was
5357 needed for an R_ARM_PC24 or similar reloc to a non-function sym
5358 in check_relocs. We can't decide accurately between function
5359 and non-function syms in check-relocs; Objects loaded later in
5360 the link may change h->type. So fix it now. */
5361 h->plt.offset = (bfd_vma) -1;
5362 eh->plt_thumb_refcount = 0;
5365 /* If this is a weak symbol, and there is a real definition, the
5366 processor independent code will have arranged for us to see the
5367 real definition first, and we can just use the same value. */
5368 if (h->u.weakdef != NULL)
5370 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5371 || h->u.weakdef->root.type == bfd_link_hash_defweak);
5372 h->root.u.def.section = h->u.weakdef->root.u.def.section;
5373 h->root.u.def.value = h->u.weakdef->root.u.def.value;
5377 /* If there are no non-GOT references, we do not need a copy
5379 if (!h->non_got_ref)
5382 /* This is a reference to a symbol defined by a dynamic object which
5383 is not a function. */
5385 /* If we are creating a shared library, we must presume that the
5386 only references to the symbol are via the global offset table.
5387 For such cases we need not do anything here; the relocations will
5388 be handled correctly by relocate_section. Relocatable executables
5389 can reference data in shared objects directly, so we don't need to
5390 do anything here. */
5391 if (info->shared || globals->root.is_relocatable_executable)
5396 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
5397 h->root.root.string);
5401 /* We must allocate the symbol in our .dynbss section, which will
5402 become part of the .bss section of the executable. There will be
5403 an entry for this symbol in the .dynsym section. The dynamic
5404 object will contain position independent code, so all references
5405 from the dynamic object to this symbol will go through the global
5406 offset table. The dynamic linker will use the .dynsym entry to
5407 determine the address it must put in the global offset table, so
5408 both the dynamic object and the regular object will refer to the
5409 same memory location for the variable. */
5410 s = bfd_get_section_by_name (dynobj, ".dynbss");
5411 BFD_ASSERT (s != NULL);
5413 /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
5414 copy the initial value out of the dynamic object and into the
5415 runtime process image. We need to remember the offset into the
5416 .rel.bss section we are going to use. */
5417 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5421 srel = bfd_get_section_by_name (dynobj, ".rel.bss");
5422 BFD_ASSERT (srel != NULL);
5423 srel->size += sizeof (Elf32_External_Rel);
5427 /* We need to figure out the alignment required for this symbol. I
5428 have no idea how ELF linkers handle this. */
5429 power_of_two = bfd_log2 (h->size);
5430 if (power_of_two > 3)
5433 /* Apply the required alignment. */
5434 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
5435 if (power_of_two > bfd_get_section_alignment (dynobj, s))
5437 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
5441 /* Define the symbol as being at this point in the section. */
5442 h->root.u.def.section = s;
5443 h->root.u.def.value = s->size;
5445 /* Increment the section size to make room for the symbol. */
5451 /* Allocate space in .plt, .got and associated reloc sections for
5455 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
5457 struct bfd_link_info *info;
5458 struct elf32_arm_link_hash_table *htab;
5459 struct elf32_arm_link_hash_entry *eh;
5460 struct elf32_arm_relocs_copied *p;
5462 eh = (struct elf32_arm_link_hash_entry *) h;
5464 if (h->root.type == bfd_link_hash_indirect)
5467 if (h->root.type == bfd_link_hash_warning)
5468 /* When warning symbols are created, they **replace** the "real"
5469 entry in the hash table, thus we never get to see the real
5470 symbol in a hash traversal. So look at it now. */
5471 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5473 info = (struct bfd_link_info *) inf;
5474 htab = elf32_arm_hash_table (info);
5476 if (htab->root.dynamic_sections_created
5477 && h->plt.refcount > 0)
5479 /* Make sure this symbol is output as a dynamic symbol.
5480 Undefined weak syms won't yet be marked as dynamic. */
5481 if (h->dynindx == -1
5482 && !h->forced_local)
5484 if (! bfd_elf_link_record_dynamic_symbol (info, h))
5489 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
5491 asection *s = htab->splt;
5493 /* If this is the first .plt entry, make room for the special
5496 s->size += htab->plt_header_size;
5498 h->plt.offset = s->size;
5500 /* If we will insert a Thumb trampoline before this PLT, leave room
5502 if (!htab->use_blx && eh->plt_thumb_refcount > 0)
5504 h->plt.offset += PLT_THUMB_STUB_SIZE;
5505 s->size += PLT_THUMB_STUB_SIZE;
5508 /* If this symbol is not defined in a regular file, and we are
5509 not generating a shared library, then set the symbol to this
5510 location in the .plt. This is required to make function
5511 pointers compare as equal between the normal executable and
5512 the shared library. */
5516 h->root.u.def.section = s;
5517 h->root.u.def.value = h->plt.offset;
5519 /* Make sure the function is not marked as Thumb, in case
5520 it is the target of an ABS32 relocation, which will
5521 point to the PLT entry. */
5522 if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
5523 h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
5526 /* Make room for this entry. */
5527 s->size += htab->plt_entry_size;
5529 if (!htab->symbian_p)
5531 /* We also need to make an entry in the .got.plt section, which
5532 will be placed in the .got section by the linker script. */
5533 eh->plt_got_offset = htab->sgotplt->size;
5534 htab->sgotplt->size += 4;
5537 /* We also need to make an entry in the .rel.plt section. */
5538 htab->srelplt->size += sizeof (Elf32_External_Rel);
5542 h->plt.offset = (bfd_vma) -1;
5548 h->plt.offset = (bfd_vma) -1;
5552 if (h->got.refcount > 0)
5556 int tls_type = elf32_arm_hash_entry (h)->tls_type;
5559 /* Make sure this symbol is output as a dynamic symbol.
5560 Undefined weak syms won't yet be marked as dynamic. */
5561 if (h->dynindx == -1
5562 && !h->forced_local)
5564 if (! bfd_elf_link_record_dynamic_symbol (info, h))
5568 if (!htab->symbian_p)
5571 h->got.offset = s->size;
5573 if (tls_type == GOT_UNKNOWN)
5576 if (tls_type == GOT_NORMAL)
5577 /* Non-TLS symbols need one GOT slot. */
5581 if (tls_type & GOT_TLS_GD)
5582 /* R_ARM_TLS_GD32 needs 2 consecutive GOT slots. */
5584 if (tls_type & GOT_TLS_IE)
5585 /* R_ARM_TLS_IE32 needs one GOT slot. */
5589 dyn = htab->root.dynamic_sections_created;
5592 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
5594 || !SYMBOL_REFERENCES_LOCAL (info, h)))
5597 if (tls_type != GOT_NORMAL
5598 && (info->shared || indx != 0)
5599 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5600 || h->root.type != bfd_link_hash_undefweak))
5602 if (tls_type & GOT_TLS_IE)
5603 htab->srelgot->size += sizeof (Elf32_External_Rel);
5605 if (tls_type & GOT_TLS_GD)
5606 htab->srelgot->size += sizeof (Elf32_External_Rel);
5608 if ((tls_type & GOT_TLS_GD) && indx != 0)
5609 htab->srelgot->size += sizeof (Elf32_External_Rel);
5611 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5612 || h->root.type != bfd_link_hash_undefweak)
5614 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
5615 htab->srelgot->size += sizeof (Elf32_External_Rel);
5619 h->got.offset = (bfd_vma) -1;
5621 if (eh->relocs_copied == NULL)
5624 /* In the shared -Bsymbolic case, discard space allocated for
5625 dynamic pc-relative relocs against symbols which turn out to be
5626 defined in regular objects. For the normal shared case, discard
5627 space for pc-relative relocs that have become local due to symbol
5628 visibility changes. */
5630 if (info->shared || htab->root.is_relocatable_executable)
5632 /* The only reloc that uses pc_count is R_ARM_REL32, which will
5633 appear on something like ".long foo - .". We want calls to
5634 protected symbols to resolve directly to the function rather
5635 than going via the plt. If people want function pointer
5636 comparisons to work as expected then they should avoid
5637 writing assembly like ".long foo - .". */
5638 if (SYMBOL_CALLS_LOCAL (info, h))
5640 struct elf32_arm_relocs_copied **pp;
5642 for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
5644 p->count -= p->pc_count;
5653 /* Also discard relocs on undefined weak syms with non-default
5655 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5656 && h->root.type == bfd_link_hash_undefweak)
5657 eh->relocs_copied = NULL;
5658 else if (htab->root.is_relocatable_executable && h->dynindx == -1
5659 && h->root.type == bfd_link_hash_new)
5661 /* Output absolute symbols so that we can create relocations
5662 against them. For normal symbols we output a relocation
5663 against the section that contains them. */
5664 if (! bfd_elf_link_record_dynamic_symbol (info, h))
5671 /* For the non-shared case, discard space for relocs against
5672 symbols which turn out to need copy relocs or are not
5678 || (htab->root.dynamic_sections_created
5679 && (h->root.type == bfd_link_hash_undefweak
5680 || h->root.type == bfd_link_hash_undefined))))
5682 /* Make sure this symbol is output as a dynamic symbol.
5683 Undefined weak syms won't yet be marked as dynamic. */
5684 if (h->dynindx == -1
5685 && !h->forced_local)
5687 if (! bfd_elf_link_record_dynamic_symbol (info, h))
5691 /* If that succeeded, we know we'll be keeping all the
5693 if (h->dynindx != -1)
5697 eh->relocs_copied = NULL;
5702 /* Finally, allocate space. */
5703 for (p = eh->relocs_copied; p != NULL; p = p->next)
5705 asection *sreloc = elf_section_data (p->section)->sreloc;
5706 sreloc->size += p->count * sizeof (Elf32_External_Rel);
5712 /* Find any dynamic relocs that apply to read-only sections. */
5715 elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
5717 struct elf32_arm_link_hash_entry *eh;
5718 struct elf32_arm_relocs_copied *p;
5720 if (h->root.type == bfd_link_hash_warning)
5721 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5723 eh = (struct elf32_arm_link_hash_entry *) h;
5724 for (p = eh->relocs_copied; p != NULL; p = p->next)
5726 asection *s = p->section;
5728 if (s != NULL && (s->flags & SEC_READONLY) != 0)
5730 struct bfd_link_info *info = (struct bfd_link_info *) inf;
5732 info->flags |= DF_TEXTREL;
5734 /* Not an error, just cut short the traversal. */
5741 /* Set the sizes of the dynamic sections. */
5744 elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
5745 struct bfd_link_info * info)
5752 struct elf32_arm_link_hash_table *htab;
5754 htab = elf32_arm_hash_table (info);
5755 dynobj = elf_hash_table (info)->dynobj;
5756 BFD_ASSERT (dynobj != NULL);
5758 if (elf_hash_table (info)->dynamic_sections_created)
5760 /* Set the contents of the .interp section to the interpreter. */
5761 if (info->executable)
5763 s = bfd_get_section_by_name (dynobj, ".interp");
5764 BFD_ASSERT (s != NULL);
5765 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5766 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5770 /* Set up .got offsets for local syms, and space for local dynamic
5772 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
5774 bfd_signed_vma *local_got;
5775 bfd_signed_vma *end_local_got;
5776 char *local_tls_type;
5777 bfd_size_type locsymcount;
5778 Elf_Internal_Shdr *symtab_hdr;
5781 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
5784 for (s = ibfd->sections; s != NULL; s = s->next)
5786 struct elf32_arm_relocs_copied *p;
5788 for (p = *((struct elf32_arm_relocs_copied **)
5789 &elf_section_data (s)->local_dynrel);
5793 if (!bfd_is_abs_section (p->section)
5794 && bfd_is_abs_section (p->section->output_section))
5796 /* Input section has been discarded, either because
5797 it is a copy of a linkonce section or due to
5798 linker script /DISCARD/, so we'll be discarding
5801 else if (p->count != 0)
5803 srel = elf_section_data (p->section)->sreloc;
5804 srel->size += p->count * sizeof (Elf32_External_Rel);
5805 if ((p->section->output_section->flags & SEC_READONLY) != 0)
5806 info->flags |= DF_TEXTREL;
5811 local_got = elf_local_got_refcounts (ibfd);
5815 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5816 locsymcount = symtab_hdr->sh_info;
5817 end_local_got = local_got + locsymcount;
5818 local_tls_type = elf32_arm_local_got_tls_type (ibfd);
5820 srel = htab->srelgot;
5821 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
5825 *local_got = s->size;
5826 if (*local_tls_type & GOT_TLS_GD)
5827 /* TLS_GD relocs need an 8-byte structure in the GOT. */
5829 if (*local_tls_type & GOT_TLS_IE)
5831 if (*local_tls_type == GOT_NORMAL)
5834 if (info->shared || *local_tls_type == GOT_TLS_GD)
5835 srel->size += sizeof (Elf32_External_Rel);
5838 *local_got = (bfd_vma) -1;
5842 if (htab->tls_ldm_got.refcount > 0)
5844 /* Allocate two GOT entries and one dynamic relocation (if necessary)
5845 for R_ARM_TLS_LDM32 relocations. */
5846 htab->tls_ldm_got.offset = htab->sgot->size;
5847 htab->sgot->size += 8;
5849 htab->srelgot->size += sizeof (Elf32_External_Rel);
5852 htab->tls_ldm_got.offset = -1;
5854 /* Allocate global sym .plt and .got entries, and space for global
5855 sym dynamic relocs. */
5856 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
5858 /* The check_relocs and adjust_dynamic_symbol entry points have
5859 determined the sizes of the various dynamic sections. Allocate
5863 for (s = dynobj->sections; s != NULL; s = s->next)
5867 if ((s->flags & SEC_LINKER_CREATED) == 0)
5870 /* It's OK to base decisions on the section name, because none
5871 of the dynobj section names depend upon the input files. */
5872 name = bfd_get_section_name (dynobj, s);
5874 if (strcmp (name, ".plt") == 0)
5876 /* Remember whether there is a PLT. */
5879 else if (strncmp (name, ".rel", 4) == 0)
5883 /* Remember whether there are any reloc sections other
5885 if (strcmp (name, ".rel.plt") != 0)
5888 /* We use the reloc_count field as a counter if we need
5889 to copy relocs into the output file. */
5893 else if (strncmp (name, ".got", 4) != 0
5894 && strcmp (name, ".dynbss") != 0)
5896 /* It's not one of our sections, so don't allocate space. */
5902 /* If we don't need this section, strip it from the
5903 output file. This is mostly to handle .rel.bss and
5904 .rel.plt. We must create both sections in
5905 create_dynamic_sections, because they must be created
5906 before the linker maps input sections to output
5907 sections. The linker does that before
5908 adjust_dynamic_symbol is called, and it is that
5909 function which decides whether anything needs to go
5910 into these sections. */
5911 s->flags |= SEC_EXCLUDE;
5915 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5918 /* Allocate memory for the section contents. */
5919 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
5920 if (s->contents == NULL)
5924 if (elf_hash_table (info)->dynamic_sections_created)
5926 /* Add some entries to the .dynamic section. We fill in the
5927 values later, in elf32_arm_finish_dynamic_sections, but we
5928 must add the entries now so that we get the correct size for
5929 the .dynamic section. The DT_DEBUG entry is filled in by the
5930 dynamic linker and used by the debugger. */
5931 #define add_dynamic_entry(TAG, VAL) \
5932 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5934 if (info->executable)
5936 if (!add_dynamic_entry (DT_DEBUG, 0))
5942 if ( !add_dynamic_entry (DT_PLTGOT, 0)
5943 || !add_dynamic_entry (DT_PLTRELSZ, 0)
5944 || !add_dynamic_entry (DT_PLTREL, DT_REL)
5945 || !add_dynamic_entry (DT_JMPREL, 0))
5951 if ( !add_dynamic_entry (DT_REL, 0)
5952 || !add_dynamic_entry (DT_RELSZ, 0)
5953 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
5957 /* If any dynamic relocs apply to a read-only section,
5958 then we need a DT_TEXTREL entry. */
5959 if ((info->flags & DF_TEXTREL) == 0)
5960 elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs,
5963 if ((info->flags & DF_TEXTREL) != 0)
5965 if (!add_dynamic_entry (DT_TEXTREL, 0))
5969 #undef add_dynamic_entry
5974 /* Finish up dynamic symbol handling. We set the contents of various
5975 dynamic sections here. */
5978 elf32_arm_finish_dynamic_symbol (bfd * output_bfd, struct bfd_link_info * info,
5979 struct elf_link_hash_entry * h, Elf_Internal_Sym * sym)
5982 struct elf32_arm_link_hash_table *htab;
5983 struct elf32_arm_link_hash_entry *eh;
5985 dynobj = elf_hash_table (info)->dynobj;
5986 htab = elf32_arm_hash_table (info);
5987 eh = (struct elf32_arm_link_hash_entry *) h;
5989 if (h->plt.offset != (bfd_vma) -1)
5995 Elf_Internal_Rela rel;
5997 /* This symbol has an entry in the procedure linkage table. Set
6000 BFD_ASSERT (h->dynindx != -1);
6002 splt = bfd_get_section_by_name (dynobj, ".plt");
6003 srel = bfd_get_section_by_name (dynobj, ".rel.plt");
6004 BFD_ASSERT (splt != NULL && srel != NULL);
6006 /* Fill in the entry in the procedure linkage table. */
6007 if (htab->symbian_p)
6010 for (i = 0; i < htab->plt_entry_size / 4; ++i)
6011 bfd_put_32 (output_bfd,
6012 elf32_arm_symbian_plt_entry[i],
6013 splt->contents + h->plt.offset + 4 * i);
6015 /* Fill in the entry in the .rel.plt section. */
6016 rel.r_offset = (splt->output_section->vma
6017 + splt->output_offset
6018 + h->plt.offset + 4 * (i - 1));
6019 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
6021 /* Get the index in the procedure linkage table which
6022 corresponds to this symbol. This is the index of this symbol
6023 in all the symbols for which we are making plt entries. The
6024 first entry in the procedure linkage table is reserved. */
6025 plt_index = ((h->plt.offset - htab->plt_header_size)
6026 / htab->plt_entry_size);
6031 bfd_vma got_displacement;
6034 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
6035 BFD_ASSERT (sgot != NULL);
6037 /* Get the offset into the .got.plt table of the entry that
6038 corresponds to this function. */
6039 got_offset = eh->plt_got_offset;
6041 /* Get the index in the procedure linkage table which
6042 corresponds to this symbol. This is the index of this symbol
6043 in all the symbols for which we are making plt entries. The
6044 first three entries in .got.plt are reserved; after that
6045 symbols appear in the same order as in .plt. */
6046 plt_index = (got_offset - 12) / 4;
6048 /* Calculate the displacement between the PLT slot and the
6049 entry in the GOT. The eight-byte offset accounts for the
6050 value produced by adding to pc in the first instruction
6052 got_displacement = (sgot->output_section->vma
6053 + sgot->output_offset
6055 - splt->output_section->vma
6056 - splt->output_offset
6060 BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
6062 if (!htab->use_blx && eh->plt_thumb_refcount > 0)
6064 bfd_put_16 (output_bfd, elf32_arm_plt_thumb_stub[0],
6065 splt->contents + h->plt.offset - 4);
6066 bfd_put_16 (output_bfd, elf32_arm_plt_thumb_stub[1],
6067 splt->contents + h->plt.offset - 2);
6070 bfd_put_32 (output_bfd, elf32_arm_plt_entry[0] | ((got_displacement & 0x0ff00000) >> 20),
6071 splt->contents + h->plt.offset + 0);
6072 bfd_put_32 (output_bfd, elf32_arm_plt_entry[1] | ((got_displacement & 0x000ff000) >> 12),
6073 splt->contents + h->plt.offset + 4);
6074 bfd_put_32 (output_bfd, elf32_arm_plt_entry[2] | (got_displacement & 0x00000fff),
6075 splt->contents + h->plt.offset + 8);
6076 #ifdef FOUR_WORD_PLT
6077 bfd_put_32 (output_bfd, elf32_arm_plt_entry[3],
6078 splt->contents + h->plt.offset + 12);
6081 /* Fill in the entry in the global offset table. */
6082 bfd_put_32 (output_bfd,
6083 (splt->output_section->vma
6084 + splt->output_offset),
6085 sgot->contents + got_offset);
6087 /* Fill in the entry in the .rel.plt section. */
6088 rel.r_offset = (sgot->output_section->vma
6089 + sgot->output_offset
6091 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_JUMP_SLOT);
6094 loc = srel->contents + plt_index * sizeof (Elf32_External_Rel);
6095 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
6097 if (!h->def_regular)
6099 /* Mark the symbol as undefined, rather than as defined in
6100 the .plt section. Leave the value alone. */
6101 sym->st_shndx = SHN_UNDEF;
6102 /* If the symbol is weak, we do need to clear the value.
6103 Otherwise, the PLT entry would provide a definition for
6104 the symbol even if the symbol wasn't defined anywhere,
6105 and so the symbol would never be NULL. */
6106 if (!h->ref_regular_nonweak)
6111 if (h->got.offset != (bfd_vma) -1
6112 && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
6113 && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
6117 Elf_Internal_Rela rel;
6120 /* This symbol has an entry in the global offset table. Set it
6122 sgot = bfd_get_section_by_name (dynobj, ".got");
6123 srel = bfd_get_section_by_name (dynobj, ".rel.got");
6124 BFD_ASSERT (sgot != NULL && srel != NULL);
6126 rel.r_offset = (sgot->output_section->vma
6127 + sgot->output_offset
6128 + (h->got.offset &~ (bfd_vma) 1));
6130 /* If this is a static link, or it is a -Bsymbolic link and the
6131 symbol is defined locally or was forced to be local because
6132 of a version file, we just want to emit a RELATIVE reloc.
6133 The entry in the global offset table will already have been
6134 initialized in the relocate_section function. */
6136 && SYMBOL_REFERENCES_LOCAL (info, h))
6138 BFD_ASSERT((h->got.offset & 1) != 0);
6139 rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
6143 BFD_ASSERT((h->got.offset & 1) == 0);
6144 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
6145 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
6148 loc = srel->contents + srel->reloc_count++ * sizeof (Elf32_External_Rel);
6149 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
6155 Elf_Internal_Rela rel;
6158 /* This symbol needs a copy reloc. Set it up. */
6159 BFD_ASSERT (h->dynindx != -1
6160 && (h->root.type == bfd_link_hash_defined
6161 || h->root.type == bfd_link_hash_defweak));
6163 s = bfd_get_section_by_name (h->root.u.def.section->owner,
6165 BFD_ASSERT (s != NULL);
6167 rel.r_offset = (h->root.u.def.value
6168 + h->root.u.def.section->output_section->vma
6169 + h->root.u.def.section->output_offset);
6170 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
6171 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rel);
6172 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
6175 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
6176 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
6177 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
6178 sym->st_shndx = SHN_ABS;
6183 /* Finish up the dynamic sections. */
6186 elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
6192 dynobj = elf_hash_table (info)->dynobj;
6194 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
6195 BFD_ASSERT (elf32_arm_hash_table (info)->symbian_p || sgot != NULL);
6196 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
6198 if (elf_hash_table (info)->dynamic_sections_created)
6201 Elf32_External_Dyn *dyncon, *dynconend;
6202 struct elf32_arm_link_hash_table *htab;
6204 htab = elf32_arm_hash_table (info);
6205 splt = bfd_get_section_by_name (dynobj, ".plt");
6206 BFD_ASSERT (splt != NULL && sdyn != NULL);
6208 dyncon = (Elf32_External_Dyn *) sdyn->contents;
6209 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
6211 for (; dyncon < dynconend; dyncon++)
6213 Elf_Internal_Dyn dyn;
6217 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
6228 goto get_vma_if_bpabi;
6231 goto get_vma_if_bpabi;
6234 goto get_vma_if_bpabi;
6236 name = ".gnu.version";
6237 goto get_vma_if_bpabi;
6239 name = ".gnu.version_d";
6240 goto get_vma_if_bpabi;
6242 name = ".gnu.version_r";
6243 goto get_vma_if_bpabi;
6251 s = bfd_get_section_by_name (output_bfd, name);
6252 BFD_ASSERT (s != NULL);
6253 if (!htab->symbian_p)
6254 dyn.d_un.d_ptr = s->vma;
6256 /* In the BPABI, tags in the PT_DYNAMIC section point
6257 at the file offset, not the memory address, for the
6258 convenience of the post linker. */
6259 dyn.d_un.d_ptr = s->filepos;
6260 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6264 if (htab->symbian_p)
6269 s = bfd_get_section_by_name (output_bfd, ".rel.plt");
6270 BFD_ASSERT (s != NULL);
6271 dyn.d_un.d_val = s->size;
6272 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6276 if (!htab->symbian_p)
6278 /* My reading of the SVR4 ABI indicates that the
6279 procedure linkage table relocs (DT_JMPREL) should be
6280 included in the overall relocs (DT_REL). This is
6281 what Solaris does. However, UnixWare can not handle
6282 that case. Therefore, we override the DT_RELSZ entry
6283 here to make it not include the JMPREL relocs. Since
6284 the linker script arranges for .rel.plt to follow all
6285 other relocation sections, we don't have to worry
6286 about changing the DT_REL entry. */
6287 s = bfd_get_section_by_name (output_bfd, ".rel.plt");
6289 dyn.d_un.d_val -= s->size;
6290 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6298 /* In the BPABI, the DT_REL tag must point at the file
6299 offset, not the VMA, of the first relocation
6300 section. So, we use code similar to that in
6301 elflink.c, but do not check for SHF_ALLOC on the
6302 relcoation section, since relocations sections are
6303 never allocated under the BPABI. The comments above
6304 about Unixware notwithstanding, we include all of the
6305 relocations here. */
6306 if (htab->symbian_p)
6309 type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
6310 ? SHT_REL : SHT_RELA);
6312 for (i = 1; i < elf_numsections (output_bfd); i++)
6314 Elf_Internal_Shdr *hdr
6315 = elf_elfsections (output_bfd)[i];
6316 if (hdr->sh_type == type)
6318 if (dyn.d_tag == DT_RELSZ
6319 || dyn.d_tag == DT_RELASZ)
6320 dyn.d_un.d_val += hdr->sh_size;
6321 else if ((ufile_ptr) hdr->sh_offset
6322 <= dyn.d_un.d_val - 1)
6323 dyn.d_un.d_val = hdr->sh_offset;
6326 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6330 /* Set the bottom bit of DT_INIT/FINI if the
6331 corresponding function is Thumb. */
6333 name = info->init_function;
6336 name = info->fini_function;
6338 /* If it wasn't set by elf_bfd_final_link
6339 then there is nothing to adjust. */
6340 if (dyn.d_un.d_val != 0)
6342 struct elf_link_hash_entry * eh;
6344 eh = elf_link_hash_lookup (elf_hash_table (info), name,
6345 FALSE, FALSE, TRUE);
6346 if (eh != (struct elf_link_hash_entry *) NULL
6347 && ELF_ST_TYPE (eh->type) == STT_ARM_TFUNC)
6349 dyn.d_un.d_val |= 1;
6350 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6357 /* Fill in the first entry in the procedure linkage table. */
6358 if (splt->size > 0 && elf32_arm_hash_table (info)->plt_header_size)
6360 bfd_vma got_displacement;
6362 /* Calculate the displacement between the PLT slot and &GOT[0]. */
6363 got_displacement = (sgot->output_section->vma
6364 + sgot->output_offset
6365 - splt->output_section->vma
6366 - splt->output_offset
6369 bfd_put_32 (output_bfd, elf32_arm_plt0_entry[0], splt->contents + 0);
6370 bfd_put_32 (output_bfd, elf32_arm_plt0_entry[1], splt->contents + 4);
6371 bfd_put_32 (output_bfd, elf32_arm_plt0_entry[2], splt->contents + 8);
6372 bfd_put_32 (output_bfd, elf32_arm_plt0_entry[3], splt->contents + 12);
6373 #ifdef FOUR_WORD_PLT
6374 /* The displacement value goes in the otherwise-unused last word of
6375 the second entry. */
6376 bfd_put_32 (output_bfd, got_displacement, splt->contents + 28);
6378 bfd_put_32 (output_bfd, got_displacement, splt->contents + 16);
6382 /* UnixWare sets the entsize of .plt to 4, although that doesn't
6383 really seem like the right value. */
6384 elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
6387 /* Fill in the first three entries in the global offset table. */
6393 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
6395 bfd_put_32 (output_bfd,
6396 sdyn->output_section->vma + sdyn->output_offset,
6398 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
6399 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
6402 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
6409 elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
6411 Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
6412 struct elf32_arm_link_hash_table *globals;
6414 i_ehdrp = elf_elfheader (abfd);
6416 if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
6417 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
6419 i_ehdrp->e_ident[EI_OSABI] = 0;
6420 i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
6424 globals = elf32_arm_hash_table (link_info);
6425 if (globals->byteswap_code)
6426 i_ehdrp->e_flags |= EF_ARM_BE8;
6430 static enum elf_reloc_type_class
6431 elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
6433 switch ((int) ELF32_R_TYPE (rela->r_info))
6435 case R_ARM_RELATIVE:
6436 return reloc_class_relative;
6437 case R_ARM_JUMP_SLOT:
6438 return reloc_class_plt;
6440 return reloc_class_copy;
6442 return reloc_class_normal;
6446 /* Set the right machine number for an Arm ELF file. */
6449 elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
6451 if (hdr->sh_type == SHT_NOTE)
6452 *flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_CONTENTS;
6458 elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
6460 bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
6463 /* Return TRUE if this is an unwinding table entry. */
6466 is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
6470 len1 = sizeof (ELF_STRING_ARM_unwind) - 1;
6471 len2 = sizeof (ELF_STRING_ARM_unwind_once) - 1;
6472 return (strncmp (name, ELF_STRING_ARM_unwind, len1) == 0
6473 || strncmp (name, ELF_STRING_ARM_unwind_once, len2) == 0);
6477 /* Set the type and flags for an ARM section. We do this by
6478 the section name, which is a hack, but ought to work. */
6481 elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
6485 name = bfd_get_section_name (abfd, sec);
6487 if (is_arm_elf_unwind_section_name (abfd, name))
6489 hdr->sh_type = SHT_ARM_EXIDX;
6490 hdr->sh_flags |= SHF_LINK_ORDER;
6495 /* Handle an ARM specific section when reading an object file. This is
6496 called when bfd_section_from_shdr finds a section with an unknown
6500 elf32_arm_section_from_shdr (bfd *abfd,
6501 Elf_Internal_Shdr * hdr,
6505 /* There ought to be a place to keep ELF backend specific flags, but
6506 at the moment there isn't one. We just keep track of the
6507 sections by their name, instead. Fortunately, the ABI gives
6508 names for all the ARM specific sections, so we will probably get
6510 switch (hdr->sh_type)
6513 case SHT_ARM_PREEMPTMAP:
6514 case SHT_ARM_ATTRIBUTES:
6521 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
6527 /* A structure used to record a list of sections, independently
6528 of the next and prev fields in the asection structure. */
6529 typedef struct section_list
6532 struct section_list * next;
6533 struct section_list * prev;
6537 /* Unfortunately we need to keep a list of sections for which
6538 an _arm_elf_section_data structure has been allocated. This
6539 is because it is possible for functions like elf32_arm_write_section
6540 to be called on a section which has had an elf_data_structure
6541 allocated for it (and so the used_by_bfd field is valid) but
6542 for which the ARM extended version of this structure - the
6543 _arm_elf_section_data structure - has not been allocated. */
6544 static section_list * sections_with_arm_elf_section_data = NULL;
6547 record_section_with_arm_elf_section_data (asection * sec)
6549 struct section_list * entry;
6551 entry = bfd_malloc (sizeof (* entry));
6555 entry->next = sections_with_arm_elf_section_data;
6557 if (entry->next != NULL)
6558 entry->next->prev = entry;
6559 sections_with_arm_elf_section_data = entry;
6562 static _arm_elf_section_data *
6563 get_arm_elf_section_data (asection * sec)
6565 struct section_list * entry;
6566 static struct section_list * last_entry = NULL;
6568 /* This is a short cut for the typical case where the sections are added
6569 to the sections_with_arm_elf_section_data list in forward order and
6570 then looked up here in backwards order. This makes a real difference
6571 to the ld-srec/sec64k.exp linker test. */
6572 if (last_entry != NULL)
6574 if (last_entry->sec == sec)
6575 return elf32_arm_section_data (sec);
6577 if (last_entry->prev != NULL
6578 && last_entry->prev->sec == sec)
6580 last_entry = last_entry->prev;
6581 return elf32_arm_section_data (sec);
6585 for (entry = sections_with_arm_elf_section_data; entry; entry = entry->next)
6586 if (entry->sec == sec)
6589 return elf32_arm_section_data (sec);
6596 unrecord_section_with_arm_elf_section_data (asection * sec)
6598 struct section_list * entry;
6600 for (entry = sections_with_arm_elf_section_data; entry; entry = entry->next)
6601 if (entry->sec == sec)
6603 if (entry->prev != NULL)
6604 entry->prev->next = entry->next;
6605 if (entry->next != NULL)
6606 entry->next->prev = entry->prev;
6607 if (entry == sections_with_arm_elf_section_data)
6608 sections_with_arm_elf_section_data = entry->next;
6614 /* Called for each symbol. Builds a section map based on mapping symbols.
6615 Does not alter any of the symbols. */
6618 elf32_arm_output_symbol_hook (struct bfd_link_info *info,
6620 Elf_Internal_Sym *elfsym,
6621 asection *input_sec,
6622 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
6625 elf32_arm_section_map *map;
6626 elf32_arm_section_map *newmap;
6627 _arm_elf_section_data *arm_data;
6628 struct elf32_arm_link_hash_table *globals;
6630 /* Only do this on final link. */
6631 if (info->relocatable)
6634 /* Only build a map if we need to byteswap code. */
6635 globals = elf32_arm_hash_table (info);
6636 if (!globals->byteswap_code)
6639 /* We only want mapping symbols. */
6640 if (! bfd_is_arm_mapping_symbol_name (name))
6643 /* If this section has not been allocated an _arm_elf_section_data
6644 structure then we cannot record anything. */
6645 arm_data = get_arm_elf_section_data (input_sec);
6646 if (arm_data == NULL)
6649 mapcount = arm_data->mapcount + 1;
6650 map = arm_data->map;
6651 /* TODO: This may be inefficient, but we probably don't usually have many
6652 mapping symbols per section. */
6653 newmap = bfd_realloc (map, mapcount * sizeof (* map));
6656 arm_data->map = newmap;
6657 arm_data->mapcount = mapcount;
6659 map[mapcount - 1].vma = elfsym->st_value;
6660 map[mapcount - 1].type = name[1];
6666 /* Allocate target specific section data. */
6669 elf32_arm_new_section_hook (bfd *abfd, asection *sec)
6671 _arm_elf_section_data *sdata;
6672 bfd_size_type amt = sizeof (*sdata);
6674 sdata = bfd_zalloc (abfd, amt);
6677 sec->used_by_bfd = sdata;
6679 record_section_with_arm_elf_section_data (sec);
6681 return _bfd_elf_new_section_hook (abfd, sec);
6685 /* Used to order a list of mapping symbols by address. */
6688 elf32_arm_compare_mapping (const void * a, const void * b)
6690 return ((const elf32_arm_section_map *) a)->vma
6691 > ((const elf32_arm_section_map *) b)->vma;
6695 /* Do code byteswapping. Return FALSE afterwards so that the section is
6696 written out as normal. */
6699 elf32_arm_write_section (bfd *output_bfd ATTRIBUTE_UNUSED, asection *sec,
6703 _arm_elf_section_data *arm_data;
6704 elf32_arm_section_map *map;
6711 /* If this section has not been allocated an _arm_elf_section_data
6712 structure then we cannot record anything. */
6713 arm_data = get_arm_elf_section_data (sec);
6714 if (arm_data == NULL)
6717 mapcount = arm_data->mapcount;
6718 map = arm_data->map;
6723 qsort (map, mapcount, sizeof (* map), elf32_arm_compare_mapping);
6725 offset = sec->output_section->vma + sec->output_offset;
6726 ptr = map[0].vma - offset;
6727 for (i = 0; i < mapcount; i++)
6729 if (i == mapcount - 1)
6732 end = map[i + 1].vma - offset;
6734 switch (map[i].type)
6737 /* Byte swap code words. */
6738 while (ptr + 3 < end)
6740 tmp = contents[ptr];
6741 contents[ptr] = contents[ptr + 3];
6742 contents[ptr + 3] = tmp;
6743 tmp = contents[ptr + 1];
6744 contents[ptr + 1] = contents[ptr + 2];
6745 contents[ptr + 2] = tmp;
6751 /* Byte swap code halfwords. */
6752 while (ptr + 1 < end)
6754 tmp = contents[ptr];
6755 contents[ptr] = contents[ptr + 1];
6756 contents[ptr + 1] = tmp;
6762 /* Leave data alone. */
6769 arm_data->mapcount = 0;
6770 arm_data->map = NULL;
6771 unrecord_section_with_arm_elf_section_data (sec);
6777 unrecord_section_via_map_over_sections (bfd * abfd ATTRIBUTE_UNUSED,
6779 void * ignore ATTRIBUTE_UNUSED)
6781 unrecord_section_with_arm_elf_section_data (sec);
6785 elf32_arm_close_and_cleanup (bfd * abfd)
6787 bfd_map_over_sections (abfd, unrecord_section_via_map_over_sections, NULL);
6789 return _bfd_elf_close_and_cleanup (abfd);
6792 /* Display STT_ARM_TFUNC symbols as functions. */
6795 elf32_arm_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
6798 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
6800 if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_ARM_TFUNC)
6801 elfsym->symbol.flags |= BSF_FUNCTION;
6805 /* Mangle thumb function symbols as we read them in. */
6808 elf32_arm_swap_symbol_in (bfd * abfd,
6811 Elf_Internal_Sym *dst)
6813 bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst);
6815 /* New EABI objects mark thumb function symbols by setting the low bit of
6816 the address. Turn these into STT_ARM_TFUNC. */
6817 if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
6818 && (dst->st_value & 1))
6820 dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC);
6821 dst->st_value &= ~(bfd_vma) 1;
6826 /* Mangle thumb function symbols as we write them out. */
6829 elf32_arm_swap_symbol_out (bfd *abfd,
6830 const Elf_Internal_Sym *src,
6834 Elf_Internal_Sym newsym;
6836 /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
6837 of the address set, as per the new EABI. We do this unconditionally
6838 because objcopy does not set the elf header flags until after
6839 it writes out the symbol table. */
6840 if (ELF_ST_TYPE (src->st_info) == STT_ARM_TFUNC)
6843 newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
6844 newsym.st_value |= 1;
6848 bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
6851 /* Add the PT_ARM_EXIDX program header. */
6854 elf32_arm_modify_segment_map (bfd *abfd,
6855 struct bfd_link_info *info ATTRIBUTE_UNUSED)
6857 struct elf_segment_map *m;
6860 sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
6861 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
6863 /* If there is already a PT_ARM_EXIDX header, then we do not
6864 want to add another one. This situation arises when running
6865 "strip"; the input binary already has the header. */
6866 m = elf_tdata (abfd)->segment_map;
6867 while (m && m->p_type != PT_ARM_EXIDX)
6871 m = bfd_zalloc (abfd, sizeof (struct elf_segment_map));
6874 m->p_type = PT_ARM_EXIDX;
6876 m->sections[0] = sec;
6878 m->next = elf_tdata (abfd)->segment_map;
6879 elf_tdata (abfd)->segment_map = m;
6886 /* We may add a PT_ARM_EXIDX program header. */
6889 elf32_arm_additional_program_headers (bfd *abfd)
6893 sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
6894 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
6900 /* We use this to override swap_symbol_in and swap_symbol_out. */
6901 const struct elf_size_info elf32_arm_size_info = {
6902 sizeof (Elf32_External_Ehdr),
6903 sizeof (Elf32_External_Phdr),
6904 sizeof (Elf32_External_Shdr),
6905 sizeof (Elf32_External_Rel),
6906 sizeof (Elf32_External_Rela),
6907 sizeof (Elf32_External_Sym),
6908 sizeof (Elf32_External_Dyn),
6909 sizeof (Elf_External_Note),
6913 ELFCLASS32, EV_CURRENT,
6914 bfd_elf32_write_out_phdrs,
6915 bfd_elf32_write_shdrs_and_ehdr,
6916 bfd_elf32_write_relocs,
6917 elf32_arm_swap_symbol_in,
6918 elf32_arm_swap_symbol_out,
6919 bfd_elf32_slurp_reloc_table,
6920 bfd_elf32_slurp_symbol_table,
6921 bfd_elf32_swap_dyn_in,
6922 bfd_elf32_swap_dyn_out,
6923 bfd_elf32_swap_reloc_in,
6924 bfd_elf32_swap_reloc_out,
6925 bfd_elf32_swap_reloca_in,
6926 bfd_elf32_swap_reloca_out
6929 #define ELF_ARCH bfd_arch_arm
6930 #define ELF_MACHINE_CODE EM_ARM
6931 #ifdef __QNXTARGET__
6932 #define ELF_MAXPAGESIZE 0x1000
6934 #define ELF_MAXPAGESIZE 0x8000
6936 #define ELF_MINPAGESIZE 0x1000
6938 #define bfd_elf32_mkobject elf32_arm_mkobject
6940 #define bfd_elf32_bfd_copy_private_bfd_data elf32_arm_copy_private_bfd_data
6941 #define bfd_elf32_bfd_merge_private_bfd_data elf32_arm_merge_private_bfd_data
6942 #define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
6943 #define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
6944 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
6945 #define bfd_elf32_bfd_reloc_type_lookup elf32_arm_reloc_type_lookup
6946 #define bfd_elf32_find_nearest_line elf32_arm_find_nearest_line
6947 #define bfd_elf32_find_inliner_info elf32_arm_find_inliner_info
6948 #define bfd_elf32_new_section_hook elf32_arm_new_section_hook
6949 #define bfd_elf32_bfd_is_target_special_symbol elf32_arm_is_target_special_symbol
6950 #define bfd_elf32_close_and_cleanup elf32_arm_close_and_cleanup
6952 #define elf_backend_get_symbol_type elf32_arm_get_symbol_type
6953 #define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook
6954 #define elf_backend_gc_sweep_hook elf32_arm_gc_sweep_hook
6955 #define elf_backend_check_relocs elf32_arm_check_relocs
6956 #define elf_backend_relocate_section elf32_arm_relocate_section
6957 #define elf_backend_write_section elf32_arm_write_section
6958 #define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol
6959 #define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections
6960 #define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol
6961 #define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections
6962 #define elf_backend_link_output_symbol_hook elf32_arm_output_symbol_hook
6963 #define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections
6964 #define elf_backend_post_process_headers elf32_arm_post_process_headers
6965 #define elf_backend_reloc_type_class elf32_arm_reloc_type_class
6966 #define elf_backend_object_p elf32_arm_object_p
6967 #define elf_backend_section_flags elf32_arm_section_flags
6968 #define elf_backend_fake_sections elf32_arm_fake_sections
6969 #define elf_backend_section_from_shdr elf32_arm_section_from_shdr
6970 #define elf_backend_final_write_processing elf32_arm_final_write_processing
6971 #define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol
6972 #define elf_backend_symbol_processing elf32_arm_symbol_processing
6973 #define elf_backend_size_info elf32_arm_size_info
6974 #define elf_backend_modify_segment_map elf32_arm_modify_segment_map
6975 #define elf_backend_additional_program_headers \
6976 elf32_arm_additional_program_headers
6978 #define elf_backend_can_refcount 1
6979 #define elf_backend_can_gc_sections 1
6980 #define elf_backend_plt_readonly 1
6981 #define elf_backend_want_got_plt 1
6982 #define elf_backend_want_plt_sym 0
6983 #define elf_backend_may_use_rel_p 1
6984 #define elf_backend_may_use_rela_p 0
6985 #define elf_backend_default_use_rela_p 0
6986 #define elf_backend_rela_normal 0
6988 #define elf_backend_got_header_size 12
6990 #include "elf32-target.h"
6992 /* VxWorks Targets */
6994 #undef TARGET_LITTLE_SYM
6995 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vxworks_vec
6996 #undef TARGET_LITTLE_NAME
6997 #define TARGET_LITTLE_NAME "elf32-littlearm-vxworks"
6998 #undef TARGET_BIG_SYM
6999 #define TARGET_BIG_SYM bfd_elf32_bigarm_vxworks_vec
7000 #undef TARGET_BIG_NAME
7001 #define TARGET_BIG_NAME "elf32-bigarm-vxworks"
7003 /* Like elf32_arm_link_hash_table_create -- but overrides
7004 appropriately for VxWorks. */
7005 static struct bfd_link_hash_table *
7006 elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
7008 struct bfd_link_hash_table *ret;
7010 ret = elf32_arm_link_hash_table_create (abfd);
7013 struct elf32_arm_link_hash_table *htab
7014 = (struct elf32_arm_link_hash_table *)ret;
7021 #define elf32_bed elf32_arm_vxworks_bed
7023 #undef bfd_elf32_bfd_link_hash_table_create
7024 #define bfd_elf32_bfd_link_hash_table_create \
7025 elf32_arm_vxworks_link_hash_table_create
7027 #undef elf_backend_may_use_rel_p
7028 #define elf_backend_may_use_rel_p 0
7029 #undef elf_backend_may_use_rela_p
7030 #define elf_backend_may_use_rela_p 1
7031 #undef elf_backend_default_use_rela_p
7032 #define elf_backend_default_use_rela_p 1
7033 #undef elf_backend_rela_normal
7034 #define elf_backend_rela_normal 1
7036 #include "elf32-target.h"
7039 /* Symbian OS Targets */
7041 #undef TARGET_LITTLE_SYM
7042 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_symbian_vec
7043 #undef TARGET_LITTLE_NAME
7044 #define TARGET_LITTLE_NAME "elf32-littlearm-symbian"
7045 #undef TARGET_BIG_SYM
7046 #define TARGET_BIG_SYM bfd_elf32_bigarm_symbian_vec
7047 #undef TARGET_BIG_NAME
7048 #define TARGET_BIG_NAME "elf32-bigarm-symbian"
7050 /* Like elf32_arm_link_hash_table_create -- but overrides
7051 appropriately for Symbian OS. */
7052 static struct bfd_link_hash_table *
7053 elf32_arm_symbian_link_hash_table_create (bfd *abfd)
7055 struct bfd_link_hash_table *ret;
7057 ret = elf32_arm_link_hash_table_create (abfd);
7060 struct elf32_arm_link_hash_table *htab
7061 = (struct elf32_arm_link_hash_table *)ret;
7062 /* There is no PLT header for Symbian OS. */
7063 htab->plt_header_size = 0;
7064 /* The PLT entries are each three instructions. */
7065 htab->plt_entry_size = 4 * NUM_ELEM (elf32_arm_symbian_plt_entry);
7066 htab->symbian_p = 1;
7067 /* Symbian uses armv5t or above, so use_blx is always true. */
7069 htab->root.is_relocatable_executable = 1;
7074 static const struct bfd_elf_special_section
7075 elf32_arm_symbian_special_sections[] =
7077 /* In a BPABI executable, the dynamic linking sections do not go in
7078 the loadable read-only segment. The post-linker may wish to
7079 refer to these sections, but they are not part of the final
7081 { ".dynamic", 8, 0, SHT_DYNAMIC, 0 },
7082 { ".dynstr", 7, 0, SHT_STRTAB, 0 },
7083 { ".dynsym", 7, 0, SHT_DYNSYM, 0 },
7084 { ".got", 4, 0, SHT_PROGBITS, 0 },
7085 { ".hash", 5, 0, SHT_HASH, 0 },
7086 /* These sections do not need to be writable as the SymbianOS
7087 postlinker will arrange things so that no dynamic relocation is
7089 { ".init_array", 11, 0, SHT_INIT_ARRAY, SHF_ALLOC },
7090 { ".fini_array", 11, 0, SHT_FINI_ARRAY, SHF_ALLOC },
7091 { ".preinit_array", 14, 0, SHT_PREINIT_ARRAY, SHF_ALLOC },
7092 { NULL, 0, 0, 0, 0 }
7096 elf32_arm_symbian_begin_write_processing (bfd *abfd,
7097 struct bfd_link_info *link_info
7100 /* BPABI objects are never loaded directly by an OS kernel; they are
7101 processed by a postlinker first, into an OS-specific format. If
7102 the D_PAGED bit is set on the file, BFD will align segments on
7103 page boundaries, so that an OS can directly map the file. With
7104 BPABI objects, that just results in wasted space. In addition,
7105 because we clear the D_PAGED bit, map_sections_to_segments will
7106 recognize that the program headers should not be mapped into any
7107 loadable segment. */
7108 abfd->flags &= ~D_PAGED;
7112 elf32_arm_symbian_modify_segment_map (bfd *abfd,
7113 struct bfd_link_info *info)
7115 struct elf_segment_map *m;
7118 /* BPABI shared libraries and executables should have a PT_DYNAMIC
7119 segment. However, because the .dynamic section is not marked
7120 with SEC_LOAD, the generic ELF code will not create such a
7122 dynsec = bfd_get_section_by_name (abfd, ".dynamic");
7125 m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
7126 m->next = elf_tdata (abfd)->segment_map;
7127 elf_tdata (abfd)->segment_map = m;
7130 /* Also call the generic arm routine. */
7131 return elf32_arm_modify_segment_map (abfd, info);
7135 #define elf32_bed elf32_arm_symbian_bed
7137 /* The dynamic sections are not allocated on SymbianOS; the postlinker
7138 will process them and then discard them. */
7139 #undef ELF_DYNAMIC_SEC_FLAGS
7140 #define ELF_DYNAMIC_SEC_FLAGS \
7141 (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
7143 #undef bfd_elf32_bfd_link_hash_table_create
7144 #define bfd_elf32_bfd_link_hash_table_create \
7145 elf32_arm_symbian_link_hash_table_create
7147 #undef elf_backend_special_sections
7148 #define elf_backend_special_sections elf32_arm_symbian_special_sections
7150 #undef elf_backend_begin_write_processing
7151 #define elf_backend_begin_write_processing \
7152 elf32_arm_symbian_begin_write_processing
7154 #undef elf_backend_modify_segment_map
7155 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
7157 /* There is no .got section for BPABI objects, and hence no header. */
7158 #undef elf_backend_got_header_size
7159 #define elf_backend_got_header_size 0
7161 /* Similarly, there is no .got.plt section. */
7162 #undef elf_backend_want_got_plt
7163 #define elf_backend_want_got_plt 0
7165 #undef elf_backend_may_use_rel_p
7166 #define elf_backend_may_use_rel_p 1
7167 #undef elf_backend_may_use_rela_p
7168 #define elf_backend_may_use_rela_p 0
7169 #undef elf_backend_default_use_rela_p
7170 #define elf_backend_default_use_rela_p 0
7171 #undef elf_backend_rela_normal
7172 #define elf_backend_rela_normal 0
7174 #include "elf32-target.h"