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 #define NUM_KNOWN_ATTRIBUTES 32
1534 typedef struct aeabi_attribute
1541 typedef struct aeabi_attribute_list
1543 struct aeabi_attribute_list *next;
1545 aeabi_attribute attr;
1546 } aeabi_attribute_list;
1548 struct elf32_arm_obj_tdata
1550 struct elf_obj_tdata root;
1552 /* tls_type for each local got entry. */
1553 char *local_got_tls_type;
1555 aeabi_attribute known_eabi_attributes[NUM_KNOWN_ATTRIBUTES];
1556 aeabi_attribute_list *other_eabi_attributes;
1559 #define elf32_arm_tdata(abfd) \
1560 ((struct elf32_arm_obj_tdata *) (abfd)->tdata.any)
1562 #define elf32_arm_local_got_tls_type(abfd) \
1563 (elf32_arm_tdata (abfd)->local_got_tls_type)
1566 elf32_arm_mkobject (bfd *abfd)
1568 bfd_size_type amt = sizeof (struct elf32_arm_obj_tdata);
1569 abfd->tdata.any = bfd_zalloc (abfd, amt);
1570 if (abfd->tdata.any == NULL)
1575 /* The ARM linker needs to keep track of the number of relocs that it
1576 decides to copy in check_relocs for each symbol. This is so that
1577 it can discard PC relative relocs if it doesn't need them when
1578 linking with -Bsymbolic. We store the information in a field
1579 extending the regular ELF linker hash table. */
1581 /* This structure keeps track of the number of relocs we have copied
1582 for a given symbol. */
1583 struct elf32_arm_relocs_copied
1586 struct elf32_arm_relocs_copied * next;
1587 /* A section in dynobj. */
1589 /* Number of relocs copied in this section. */
1590 bfd_size_type count;
1591 /* Number of PC-relative relocs copied in this section. */
1592 bfd_size_type pc_count;
1595 #define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
1597 /* Arm ELF linker hash entry. */
1598 struct elf32_arm_link_hash_entry
1600 struct elf_link_hash_entry root;
1602 /* Number of PC relative relocs copied for this symbol. */
1603 struct elf32_arm_relocs_copied * relocs_copied;
1605 /* We reference count Thumb references to a PLT entry separately,
1606 so that we can emit the Thumb trampoline only if needed. */
1607 bfd_signed_vma plt_thumb_refcount;
1609 /* Since PLT entries have variable size if the Thumb prologue is
1610 used, we need to record the index into .got.plt instead of
1611 recomputing it from the PLT offset. */
1612 bfd_signed_vma plt_got_offset;
1614 #define GOT_UNKNOWN 0
1615 #define GOT_NORMAL 1
1616 #define GOT_TLS_GD 2
1617 #define GOT_TLS_IE 4
1618 unsigned char tls_type;
1621 /* Traverse an arm ELF linker hash table. */
1622 #define elf32_arm_link_hash_traverse(table, func, info) \
1623 (elf_link_hash_traverse \
1625 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
1628 /* Get the ARM elf linker hash table from a link_info structure. */
1629 #define elf32_arm_hash_table(info) \
1630 ((struct elf32_arm_link_hash_table *) ((info)->hash))
1632 /* ARM ELF linker hash table. */
1633 struct elf32_arm_link_hash_table
1635 /* The main hash table. */
1636 struct elf_link_hash_table root;
1638 /* The size in bytes of the section containing the Thumb-to-ARM glue. */
1639 bfd_size_type thumb_glue_size;
1641 /* The size in bytes of the section containing the ARM-to-Thumb glue. */
1642 bfd_size_type arm_glue_size;
1644 /* An arbitrary input BFD chosen to hold the glue sections. */
1645 bfd * bfd_of_glue_owner;
1647 /* Nonzero to output a BE8 image. */
1650 /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
1651 Nonzero if R_ARM_TARGET1 means R_ARM_ABS32. */
1654 /* The relocation to use for R_ARM_TARGET2 relocations. */
1657 /* Nonzero to fix BX instructions for ARMv4 targets. */
1660 /* Nonzero if the ARM/Thumb BLX instructions are available for use. */
1663 /* The number of bytes in the initial entry in the PLT. */
1664 bfd_size_type plt_header_size;
1666 /* The number of bytes in the subsequent PLT etries. */
1667 bfd_size_type plt_entry_size;
1669 /* True if the target system is Symbian OS. */
1672 /* True if the target uses REL relocations. */
1675 /* Short-cuts to get to dynamic linker sections. */
1684 /* Data for R_ARM_TLS_LDM32 relocations. */
1686 bfd_signed_vma refcount;
1690 /* Small local sym to section mapping cache. */
1691 struct sym_sec_cache sym_sec;
1693 /* For convenience in allocate_dynrelocs. */
1697 /* Create an entry in an ARM ELF linker hash table. */
1699 static struct bfd_hash_entry *
1700 elf32_arm_link_hash_newfunc (struct bfd_hash_entry * entry,
1701 struct bfd_hash_table * table,
1702 const char * string)
1704 struct elf32_arm_link_hash_entry * ret =
1705 (struct elf32_arm_link_hash_entry *) entry;
1707 /* Allocate the structure if it has not already been allocated by a
1709 if (ret == (struct elf32_arm_link_hash_entry *) NULL)
1710 ret = bfd_hash_allocate (table, sizeof (struct elf32_arm_link_hash_entry));
1712 return (struct bfd_hash_entry *) ret;
1714 /* Call the allocation method of the superclass. */
1715 ret = ((struct elf32_arm_link_hash_entry *)
1716 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1720 ret->relocs_copied = NULL;
1721 ret->tls_type = GOT_UNKNOWN;
1722 ret->plt_thumb_refcount = 0;
1723 ret->plt_got_offset = -1;
1726 return (struct bfd_hash_entry *) ret;
1729 /* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up
1730 shortcuts to them in our hash table. */
1733 create_got_section (bfd *dynobj, struct bfd_link_info *info)
1735 struct elf32_arm_link_hash_table *htab;
1737 htab = elf32_arm_hash_table (info);
1738 /* BPABI objects never have a GOT, or associated sections. */
1739 if (htab->symbian_p)
1742 if (! _bfd_elf_create_got_section (dynobj, info))
1745 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
1746 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
1747 if (!htab->sgot || !htab->sgotplt)
1750 htab->srelgot = bfd_make_section_with_flags (dynobj, ".rel.got",
1751 (SEC_ALLOC | SEC_LOAD
1754 | SEC_LINKER_CREATED
1756 if (htab->srelgot == NULL
1757 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
1762 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
1763 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
1767 elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1769 struct elf32_arm_link_hash_table *htab;
1771 htab = elf32_arm_hash_table (info);
1772 if (!htab->sgot && !create_got_section (dynobj, info))
1775 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1778 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
1779 htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt");
1780 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
1782 htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss");
1787 || (!info->shared && !htab->srelbss))
1793 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1796 elf32_arm_copy_indirect_symbol (const struct elf_backend_data *bed,
1797 struct elf_link_hash_entry *dir,
1798 struct elf_link_hash_entry *ind)
1800 struct elf32_arm_link_hash_entry *edir, *eind;
1802 edir = (struct elf32_arm_link_hash_entry *) dir;
1803 eind = (struct elf32_arm_link_hash_entry *) ind;
1805 if (eind->relocs_copied != NULL)
1807 if (edir->relocs_copied != NULL)
1809 struct elf32_arm_relocs_copied **pp;
1810 struct elf32_arm_relocs_copied *p;
1812 if (ind->root.type == bfd_link_hash_indirect)
1815 /* Add reloc counts against the weak sym to the strong sym
1816 list. Merge any entries against the same section. */
1817 for (pp = &eind->relocs_copied; (p = *pp) != NULL; )
1819 struct elf32_arm_relocs_copied *q;
1821 for (q = edir->relocs_copied; q != NULL; q = q->next)
1822 if (q->section == p->section)
1824 q->pc_count += p->pc_count;
1825 q->count += p->count;
1832 *pp = edir->relocs_copied;
1835 edir->relocs_copied = eind->relocs_copied;
1836 eind->relocs_copied = NULL;
1839 /* If the direct symbol already has an associated PLT entry, the
1840 indirect symbol should not. If it doesn't, swap refcount information
1841 from the indirect symbol. */
1842 if (edir->plt_thumb_refcount == 0)
1844 edir->plt_thumb_refcount = eind->plt_thumb_refcount;
1845 eind->plt_thumb_refcount = 0;
1848 BFD_ASSERT (eind->plt_thumb_refcount == 0);
1850 if (ind->root.type == bfd_link_hash_indirect
1851 && dir->got.refcount <= 0)
1853 edir->tls_type = eind->tls_type;
1854 eind->tls_type = GOT_UNKNOWN;
1857 _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
1860 /* Create an ARM elf linker hash table. */
1862 static struct bfd_link_hash_table *
1863 elf32_arm_link_hash_table_create (bfd *abfd)
1865 struct elf32_arm_link_hash_table *ret;
1866 bfd_size_type amt = sizeof (struct elf32_arm_link_hash_table);
1868 ret = bfd_malloc (amt);
1872 if (!_bfd_elf_link_hash_table_init (& ret->root, abfd,
1873 elf32_arm_link_hash_newfunc))
1880 ret->sgotplt = NULL;
1881 ret->srelgot = NULL;
1883 ret->srelplt = NULL;
1884 ret->sdynbss = NULL;
1885 ret->srelbss = NULL;
1886 ret->thumb_glue_size = 0;
1887 ret->arm_glue_size = 0;
1888 ret->bfd_of_glue_owner = NULL;
1889 ret->byteswap_code = 0;
1890 ret->target1_is_rel = 0;
1891 ret->target2_reloc = R_ARM_NONE;
1892 #ifdef FOUR_WORD_PLT
1893 ret->plt_header_size = 16;
1894 ret->plt_entry_size = 16;
1896 ret->plt_header_size = 20;
1897 ret->plt_entry_size = 12;
1903 ret->sym_sec.abfd = NULL;
1905 ret->tls_ldm_got.refcount = 0;
1907 return &ret->root.root;
1910 /* Locate the Thumb encoded calling stub for NAME. */
1912 static struct elf_link_hash_entry *
1913 find_thumb_glue (struct bfd_link_info *link_info,
1918 struct elf_link_hash_entry *hash;
1919 struct elf32_arm_link_hash_table *hash_table;
1921 /* We need a pointer to the armelf specific hash table. */
1922 hash_table = elf32_arm_hash_table (link_info);
1924 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
1925 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
1927 BFD_ASSERT (tmp_name);
1929 sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
1931 hash = elf_link_hash_lookup
1932 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
1935 /* xgettext:c-format */
1936 (*_bfd_error_handler) (_("%B: unable to find THUMB glue '%s' for `%s'"),
1937 input_bfd, tmp_name, name);
1944 /* Locate the ARM encoded calling stub for NAME. */
1946 static struct elf_link_hash_entry *
1947 find_arm_glue (struct bfd_link_info *link_info,
1952 struct elf_link_hash_entry *myh;
1953 struct elf32_arm_link_hash_table *hash_table;
1955 /* We need a pointer to the elfarm specific hash table. */
1956 hash_table = elf32_arm_hash_table (link_info);
1958 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
1959 + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
1961 BFD_ASSERT (tmp_name);
1963 sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
1965 myh = elf_link_hash_lookup
1966 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
1969 /* xgettext:c-format */
1970 (*_bfd_error_handler) (_("%B: unable to find ARM glue '%s' for `%s'"),
1971 input_bfd, tmp_name, name);
1978 /* ARM->Thumb glue (static images):
1982 ldr r12, __func_addr
1985 .word func @ behave as if you saw a ARM_32 reloc.
1987 (relocatable images)
1990 ldr r12, __func_offset
1997 #define ARM2THUMB_STATIC_GLUE_SIZE 12
1998 static const insn32 a2t1_ldr_insn = 0xe59fc000;
1999 static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
2000 static const insn32 a2t3_func_addr_insn = 0x00000001;
2002 #define ARM2THUMB_PIC_GLUE_SIZE 16
2003 static const insn32 a2t1p_ldr_insn = 0xe59fc004;
2004 static const insn32 a2t2p_add_pc_insn = 0xe08cc00f;
2005 static const insn32 a2t3p_bx_r12_insn = 0xe12fff1c;
2007 /* Thumb->ARM: Thumb->(non-interworking aware) ARM
2011 __func_from_thumb: __func_from_thumb:
2013 nop ldr r6, __func_addr
2015 __func_change_to_arm: bx r6
2017 __func_back_to_thumb:
2023 #define THUMB2ARM_GLUE_SIZE 8
2024 static const insn16 t2a1_bx_pc_insn = 0x4778;
2025 static const insn16 t2a2_noop_insn = 0x46c0;
2026 static const insn32 t2a3_b_insn = 0xea000000;
2028 #ifndef ELFARM_NABI_C_INCLUDED
2030 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
2034 struct elf32_arm_link_hash_table * globals;
2036 globals = elf32_arm_hash_table (info);
2038 BFD_ASSERT (globals != NULL);
2040 if (globals->arm_glue_size != 0)
2042 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2044 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2045 ARM2THUMB_GLUE_SECTION_NAME);
2047 BFD_ASSERT (s != NULL);
2049 foo = bfd_alloc (globals->bfd_of_glue_owner, globals->arm_glue_size);
2051 s->size = globals->arm_glue_size;
2055 if (globals->thumb_glue_size != 0)
2057 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2059 s = bfd_get_section_by_name
2060 (globals->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
2062 BFD_ASSERT (s != NULL);
2064 foo = bfd_alloc (globals->bfd_of_glue_owner, globals->thumb_glue_size);
2066 s->size = globals->thumb_glue_size;
2074 record_arm_to_thumb_glue (struct bfd_link_info * link_info,
2075 struct elf_link_hash_entry * h)
2077 const char * name = h->root.root.string;
2080 struct elf_link_hash_entry * myh;
2081 struct bfd_link_hash_entry * bh;
2082 struct elf32_arm_link_hash_table * globals;
2085 globals = elf32_arm_hash_table (link_info);
2087 BFD_ASSERT (globals != NULL);
2088 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2090 s = bfd_get_section_by_name
2091 (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
2093 BFD_ASSERT (s != NULL);
2095 tmp_name = bfd_malloc ((bfd_size_type) strlen (name) + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
2097 BFD_ASSERT (tmp_name);
2099 sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
2101 myh = elf_link_hash_lookup
2102 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
2106 /* We've already seen this guy. */
2111 /* The only trick here is using hash_table->arm_glue_size as the value.
2112 Even though the section isn't allocated yet, this is where we will be
2115 val = globals->arm_glue_size + 1;
2116 _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
2117 tmp_name, BSF_GLOBAL, s, val,
2118 NULL, TRUE, FALSE, &bh);
2120 myh = (struct elf_link_hash_entry *) bh;
2121 myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
2122 myh->forced_local = 1;
2126 if ((link_info->shared || globals->root.is_relocatable_executable))
2127 globals->arm_glue_size += ARM2THUMB_PIC_GLUE_SIZE;
2129 globals->arm_glue_size += ARM2THUMB_STATIC_GLUE_SIZE;
2135 record_thumb_to_arm_glue (struct bfd_link_info *link_info,
2136 struct elf_link_hash_entry *h)
2138 const char *name = h->root.root.string;
2141 struct elf_link_hash_entry *myh;
2142 struct bfd_link_hash_entry *bh;
2143 struct elf32_arm_link_hash_table *hash_table;
2146 hash_table = elf32_arm_hash_table (link_info);
2148 BFD_ASSERT (hash_table != NULL);
2149 BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
2151 s = bfd_get_section_by_name
2152 (hash_table->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
2154 BFD_ASSERT (s != NULL);
2156 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2157 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
2159 BFD_ASSERT (tmp_name);
2161 sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
2163 myh = elf_link_hash_lookup
2164 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
2168 /* We've already seen this guy. */
2174 val = hash_table->thumb_glue_size + 1;
2175 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
2176 tmp_name, BSF_GLOBAL, s, val,
2177 NULL, TRUE, FALSE, &bh);
2179 /* If we mark it 'Thumb', the disassembler will do a better job. */
2180 myh = (struct elf_link_hash_entry *) bh;
2181 myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
2182 myh->forced_local = 1;
2186 #define CHANGE_TO_ARM "__%s_change_to_arm"
2187 #define BACK_FROM_ARM "__%s_back_from_arm"
2189 /* Allocate another symbol to mark where we switch to Arm mode. */
2190 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2191 + strlen (CHANGE_TO_ARM) + 1);
2193 BFD_ASSERT (tmp_name);
2195 sprintf (tmp_name, CHANGE_TO_ARM, name);
2198 val = hash_table->thumb_glue_size + 4,
2199 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
2200 tmp_name, BSF_LOCAL, s, val,
2201 NULL, TRUE, FALSE, &bh);
2205 hash_table->thumb_glue_size += THUMB2ARM_GLUE_SIZE;
2210 /* Add the glue sections to ABFD. This function is called from the
2211 linker scripts in ld/emultempl/{armelf}.em. */
2214 bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
2215 struct bfd_link_info *info)
2220 /* If we are only performing a partial
2221 link do not bother adding the glue. */
2222 if (info->relocatable)
2225 sec = bfd_get_section_by_name (abfd, ARM2THUMB_GLUE_SECTION_NAME);
2229 /* Note: we do not include the flag SEC_LINKER_CREATED, as this
2230 will prevent elf_link_input_bfd() from processing the contents
2232 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY;
2234 sec = bfd_make_section_with_flags (abfd,
2235 ARM2THUMB_GLUE_SECTION_NAME,
2239 || !bfd_set_section_alignment (abfd, sec, 2))
2242 /* Set the gc mark to prevent the section from being removed by garbage
2243 collection, despite the fact that no relocs refer to this section. */
2247 sec = bfd_get_section_by_name (abfd, THUMB2ARM_GLUE_SECTION_NAME);
2251 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2252 | SEC_CODE | SEC_READONLY;
2254 sec = bfd_make_section_with_flags (abfd,
2255 THUMB2ARM_GLUE_SECTION_NAME,
2259 || !bfd_set_section_alignment (abfd, sec, 2))
2268 /* Select a BFD to be used to hold the sections used by the glue code.
2269 This function is called from the linker scripts in ld/emultempl/
2273 bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
2275 struct elf32_arm_link_hash_table *globals;
2277 /* If we are only performing a partial link
2278 do not bother getting a bfd to hold the glue. */
2279 if (info->relocatable)
2282 /* Make sure we don't attach the glue sections to a dynamic object. */
2283 BFD_ASSERT (!(abfd->flags & DYNAMIC));
2285 globals = elf32_arm_hash_table (info);
2287 BFD_ASSERT (globals != NULL);
2289 if (globals->bfd_of_glue_owner != NULL)
2292 /* Save the bfd for later use. */
2293 globals->bfd_of_glue_owner = abfd;
2299 bfd_elf32_arm_process_before_allocation (bfd *abfd,
2300 struct bfd_link_info *link_info,
2303 Elf_Internal_Shdr *symtab_hdr;
2304 Elf_Internal_Rela *internal_relocs = NULL;
2305 Elf_Internal_Rela *irel, *irelend;
2306 bfd_byte *contents = NULL;
2309 struct elf32_arm_link_hash_table *globals;
2311 /* If we are only performing a partial link do not bother
2312 to construct any glue. */
2313 if (link_info->relocatable)
2316 /* Here we have a bfd that is to be included on the link. We have a hook
2317 to do reloc rummaging, before section sizes are nailed down. */
2318 globals = elf32_arm_hash_table (link_info);
2320 BFD_ASSERT (globals != NULL);
2321 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2323 if (byteswap_code && !bfd_big_endian (abfd))
2325 _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
2329 globals->byteswap_code = byteswap_code;
2331 /* Rummage around all the relocs and map the glue vectors. */
2332 sec = abfd->sections;
2337 for (; sec != NULL; sec = sec->next)
2339 if (sec->reloc_count == 0)
2342 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2344 /* Load the relocs. */
2346 = _bfd_elf_link_read_relocs (abfd, sec, (void *) NULL,
2347 (Elf_Internal_Rela *) NULL, FALSE);
2349 if (internal_relocs == NULL)
2352 irelend = internal_relocs + sec->reloc_count;
2353 for (irel = internal_relocs; irel < irelend; irel++)
2356 unsigned long r_index;
2358 struct elf_link_hash_entry *h;
2360 r_type = ELF32_R_TYPE (irel->r_info);
2361 r_index = ELF32_R_SYM (irel->r_info);
2363 /* These are the only relocation types we care about. */
2364 if ( r_type != R_ARM_PC24
2365 && r_type != R_ARM_PLT32
2366 && r_type != R_ARM_CALL
2367 && r_type != R_ARM_JUMP24
2368 && r_type != R_ARM_THM_CALL)
2371 /* Get the section contents if we haven't done so already. */
2372 if (contents == NULL)
2374 /* Get cached copy if it exists. */
2375 if (elf_section_data (sec)->this_hdr.contents != NULL)
2376 contents = elf_section_data (sec)->this_hdr.contents;
2379 /* Go get them off disk. */
2380 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2385 /* If the relocation is not against a symbol it cannot concern us. */
2388 /* We don't care about local symbols. */
2389 if (r_index < symtab_hdr->sh_info)
2392 /* This is an external symbol. */
2393 r_index -= symtab_hdr->sh_info;
2394 h = (struct elf_link_hash_entry *)
2395 elf_sym_hashes (abfd)[r_index];
2397 /* If the relocation is against a static symbol it must be within
2398 the current section and so cannot be a cross ARM/Thumb relocation. */
2402 /* If the call will go through a PLT entry then we do not need
2404 if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1)
2413 /* This one is a call from arm code. We need to look up
2414 the target of the call. If it is a thumb target, we
2416 if (ELF_ST_TYPE(h->type) == STT_ARM_TFUNC)
2417 record_arm_to_thumb_glue (link_info, h);
2420 case R_ARM_THM_CALL:
2421 /* This one is a call from thumb code. We look
2422 up the target of the call. If it is not a thumb
2423 target, we insert glue. */
2424 if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC)
2425 record_thumb_to_arm_glue (link_info, h);
2433 if (contents != NULL
2434 && elf_section_data (sec)->this_hdr.contents != contents)
2438 if (internal_relocs != NULL
2439 && elf_section_data (sec)->relocs != internal_relocs)
2440 free (internal_relocs);
2441 internal_relocs = NULL;
2447 if (contents != NULL
2448 && elf_section_data (sec)->this_hdr.contents != contents)
2450 if (internal_relocs != NULL
2451 && elf_section_data (sec)->relocs != internal_relocs)
2452 free (internal_relocs);
2459 /* Set target relocation values needed during linking. */
2462 bfd_elf32_arm_set_target_relocs (struct bfd_link_info *link_info,
2464 char * target2_type,
2468 struct elf32_arm_link_hash_table *globals;
2470 globals = elf32_arm_hash_table (link_info);
2472 globals->target1_is_rel = target1_is_rel;
2473 if (strcmp (target2_type, "rel") == 0)
2474 globals->target2_reloc = R_ARM_REL32;
2475 else if (strcmp (target2_type, "abs") == 0)
2476 globals->target2_reloc = R_ARM_ABS32;
2477 else if (strcmp (target2_type, "got-rel") == 0)
2478 globals->target2_reloc = R_ARM_GOT_PREL;
2481 _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
2484 globals->fix_v4bx = fix_v4bx;
2485 globals->use_blx |= use_blx;
2488 /* The thumb form of a long branch is a bit finicky, because the offset
2489 encoding is split over two fields, each in it's own instruction. They
2490 can occur in any order. So given a thumb form of long branch, and an
2491 offset, insert the offset into the thumb branch and return finished
2494 It takes two thumb instructions to encode the target address. Each has
2495 11 bits to invest. The upper 11 bits are stored in one (identified by
2496 H-0.. see below), the lower 11 bits are stored in the other (identified
2499 Combine together and shifted left by 1 (it's a half word address) and
2503 H-0, upper address-0 = 000
2505 H-1, lower address-0 = 800
2507 They can be ordered either way, but the arm tools I've seen always put
2508 the lower one first. It probably doesn't matter. krk@cygnus.com
2510 XXX: Actually the order does matter. The second instruction (H-1)
2511 moves the computed address into the PC, so it must be the second one
2512 in the sequence. The problem, however is that whilst little endian code
2513 stores the instructions in HI then LOW order, big endian code does the
2514 reverse. nickc@cygnus.com. */
2516 #define LOW_HI_ORDER 0xF800F000
2517 #define HI_LOW_ORDER 0xF000F800
2520 insert_thumb_branch (insn32 br_insn, int rel_off)
2522 unsigned int low_bits;
2523 unsigned int high_bits;
2525 BFD_ASSERT ((rel_off & 1) != 1);
2527 rel_off >>= 1; /* Half word aligned address. */
2528 low_bits = rel_off & 0x000007FF; /* The bottom 11 bits. */
2529 high_bits = (rel_off >> 11) & 0x000007FF; /* The top 11 bits. */
2531 if ((br_insn & LOW_HI_ORDER) == LOW_HI_ORDER)
2532 br_insn = LOW_HI_ORDER | (low_bits << 16) | high_bits;
2533 else if ((br_insn & HI_LOW_ORDER) == HI_LOW_ORDER)
2534 br_insn = HI_LOW_ORDER | (high_bits << 16) | low_bits;
2536 /* FIXME: abort is probably not the right call. krk@cygnus.com */
2537 abort (); /* Error - not a valid branch instruction form. */
2542 /* Thumb code calling an ARM function. */
2545 elf32_thumb_to_arm_stub (struct bfd_link_info * info,
2549 asection * input_section,
2550 bfd_byte * hit_data,
2553 bfd_signed_vma addend,
2558 unsigned long int tmp;
2559 long int ret_offset;
2560 struct elf_link_hash_entry * myh;
2561 struct elf32_arm_link_hash_table * globals;
2563 myh = find_thumb_glue (info, name, input_bfd);
2567 globals = elf32_arm_hash_table (info);
2569 BFD_ASSERT (globals != NULL);
2570 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2572 my_offset = myh->root.u.def.value;
2574 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2575 THUMB2ARM_GLUE_SECTION_NAME);
2577 BFD_ASSERT (s != NULL);
2578 BFD_ASSERT (s->contents != NULL);
2579 BFD_ASSERT (s->output_section != NULL);
2581 if ((my_offset & 0x01) == 0x01)
2584 && sym_sec->owner != NULL
2585 && !INTERWORK_FLAG (sym_sec->owner))
2587 (*_bfd_error_handler)
2588 (_("%B(%s): warning: interworking not enabled.\n"
2589 " first occurrence: %B: thumb call to arm"),
2590 sym_sec->owner, input_bfd, name);
2596 myh->root.u.def.value = my_offset;
2598 bfd_put_16 (output_bfd, (bfd_vma) t2a1_bx_pc_insn,
2599 s->contents + my_offset);
2601 bfd_put_16 (output_bfd, (bfd_vma) t2a2_noop_insn,
2602 s->contents + my_offset + 2);
2605 /* Address of destination of the stub. */
2606 ((bfd_signed_vma) val)
2608 /* Offset from the start of the current section
2609 to the start of the stubs. */
2611 /* Offset of the start of this stub from the start of the stubs. */
2613 /* Address of the start of the current section. */
2614 + s->output_section->vma)
2615 /* The branch instruction is 4 bytes into the stub. */
2617 /* ARM branches work from the pc of the instruction + 8. */
2620 bfd_put_32 (output_bfd,
2621 (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
2622 s->contents + my_offset + 4);
2625 BFD_ASSERT (my_offset <= globals->thumb_glue_size);
2627 /* Now go back and fix up the original BL insn to point to here. */
2629 /* Address of where the stub is located. */
2630 (s->output_section->vma + s->output_offset + my_offset)
2631 /* Address of where the BL is located. */
2632 - (input_section->output_section->vma + input_section->output_offset
2634 /* Addend in the relocation. */
2636 /* Biassing for PC-relative addressing. */
2639 tmp = bfd_get_32 (input_bfd, hit_data
2640 - input_section->vma);
2642 bfd_put_32 (output_bfd,
2643 (bfd_vma) insert_thumb_branch (tmp, ret_offset),
2644 hit_data - input_section->vma);
2649 /* Arm code calling a Thumb function. */
2652 elf32_arm_to_thumb_stub (struct bfd_link_info * info,
2656 asection * input_section,
2657 bfd_byte * hit_data,
2660 bfd_signed_vma addend,
2663 unsigned long int tmp;
2666 long int ret_offset;
2667 struct elf_link_hash_entry * myh;
2668 struct elf32_arm_link_hash_table * globals;
2670 myh = find_arm_glue (info, name, input_bfd);
2674 globals = elf32_arm_hash_table (info);
2676 BFD_ASSERT (globals != NULL);
2677 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2679 my_offset = myh->root.u.def.value;
2680 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2681 ARM2THUMB_GLUE_SECTION_NAME);
2682 BFD_ASSERT (s != NULL);
2683 BFD_ASSERT (s->contents != NULL);
2684 BFD_ASSERT (s->output_section != NULL);
2686 if ((my_offset & 0x01) == 0x01)
2689 && sym_sec->owner != NULL
2690 && !INTERWORK_FLAG (sym_sec->owner))
2692 (*_bfd_error_handler)
2693 (_("%B(%s): warning: interworking not enabled.\n"
2694 " first occurrence: %B: arm call to thumb"),
2695 sym_sec->owner, input_bfd, name);
2699 myh->root.u.def.value = my_offset;
2701 if ((info->shared || globals->root.is_relocatable_executable))
2703 /* For relocatable objects we can't use absolute addresses,
2704 so construct the address from a relative offset. */
2705 /* TODO: If the offset is small it's probably worth
2706 constructing the address with adds. */
2707 bfd_put_32 (output_bfd, (bfd_vma) a2t1p_ldr_insn,
2708 s->contents + my_offset);
2709 bfd_put_32 (output_bfd, (bfd_vma) a2t2p_add_pc_insn,
2710 s->contents + my_offset + 4);
2711 bfd_put_32 (output_bfd, (bfd_vma) a2t3p_bx_r12_insn,
2712 s->contents + my_offset + 8);
2713 /* Adjust the offset by 4 for the position of the add,
2714 and 8 for the pipeline offset. */
2715 ret_offset = (val - (s->output_offset
2716 + s->output_section->vma
2719 bfd_put_32 (output_bfd, ret_offset,
2720 s->contents + my_offset + 12);
2724 bfd_put_32 (output_bfd, (bfd_vma) a2t1_ldr_insn,
2725 s->contents + my_offset);
2727 bfd_put_32 (output_bfd, (bfd_vma) a2t2_bx_r12_insn,
2728 s->contents + my_offset + 4);
2730 /* It's a thumb address. Add the low order bit. */
2731 bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
2732 s->contents + my_offset + 8);
2736 BFD_ASSERT (my_offset <= globals->arm_glue_size);
2738 tmp = bfd_get_32 (input_bfd, hit_data);
2739 tmp = tmp & 0xFF000000;
2741 /* Somehow these are both 4 too far, so subtract 8. */
2742 ret_offset = (s->output_offset
2744 + s->output_section->vma
2745 - (input_section->output_offset
2746 + input_section->output_section->vma
2750 tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
2752 bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
2757 /* Some relocations map to different relocations depending on the
2758 target. Return the real relocation. */
2760 arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
2766 if (globals->target1_is_rel)
2772 return globals->target2_reloc;
2779 /* Return the base VMA address which should be subtracted from real addresses
2780 when resolving @dtpoff relocation.
2781 This is PT_TLS segment p_vaddr. */
2784 dtpoff_base (struct bfd_link_info *info)
2786 /* If tls_sec is NULL, we should have signalled an error already. */
2787 if (elf_hash_table (info)->tls_sec == NULL)
2789 return elf_hash_table (info)->tls_sec->vma;
2792 /* Return the relocation value for @tpoff relocation
2793 if STT_TLS virtual address is ADDRESS. */
2796 tpoff (struct bfd_link_info *info, bfd_vma address)
2798 struct elf_link_hash_table *htab = elf_hash_table (info);
2801 /* If tls_sec is NULL, we should have signalled an error already. */
2802 if (htab->tls_sec == NULL)
2804 base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
2805 return address - htab->tls_sec->vma + base;
2808 /* Perform a relocation as part of a final link. */
2810 static bfd_reloc_status_type
2811 elf32_arm_final_link_relocate (reloc_howto_type * howto,
2814 asection * input_section,
2815 bfd_byte * contents,
2816 Elf_Internal_Rela * rel,
2818 struct bfd_link_info * info,
2820 const char * sym_name,
2822 struct elf_link_hash_entry * h,
2823 bfd_boolean * unresolved_reloc_p)
2825 unsigned long r_type = howto->type;
2826 unsigned long r_symndx;
2827 bfd_byte * hit_data = contents + rel->r_offset;
2828 bfd * dynobj = NULL;
2829 Elf_Internal_Shdr * symtab_hdr;
2830 struct elf_link_hash_entry ** sym_hashes;
2831 bfd_vma * local_got_offsets;
2832 asection * sgot = NULL;
2833 asection * splt = NULL;
2834 asection * sreloc = NULL;
2836 bfd_signed_vma signed_addend;
2837 struct elf32_arm_link_hash_table * globals;
2839 globals = elf32_arm_hash_table (info);
2841 /* Some relocation type map to different relocations depending on the
2842 target. We pick the right one here. */
2843 r_type = arm_real_reloc_type (globals, r_type);
2844 if (r_type != howto->type)
2845 howto = elf32_arm_howto_from_type (r_type);
2847 /* If the start address has been set, then set the EF_ARM_HASENTRY
2848 flag. Setting this more than once is redundant, but the cost is
2849 not too high, and it keeps the code simple.
2851 The test is done here, rather than somewhere else, because the
2852 start address is only set just before the final link commences.
2854 Note - if the user deliberately sets a start address of 0, the
2855 flag will not be set. */
2856 if (bfd_get_start_address (output_bfd) != 0)
2857 elf_elfheader (output_bfd)->e_flags |= EF_ARM_HASENTRY;
2859 dynobj = elf_hash_table (info)->dynobj;
2862 sgot = bfd_get_section_by_name (dynobj, ".got");
2863 splt = bfd_get_section_by_name (dynobj, ".plt");
2865 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
2866 sym_hashes = elf_sym_hashes (input_bfd);
2867 local_got_offsets = elf_local_got_offsets (input_bfd);
2868 r_symndx = ELF32_R_SYM (rel->r_info);
2870 if (globals->use_rel)
2872 addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
2874 if (addend & ((howto->src_mask + 1) >> 1))
2877 signed_addend &= ~ howto->src_mask;
2878 signed_addend |= addend;
2881 signed_addend = addend;
2884 addend = signed_addend = rel->r_addend;
2889 /* We don't need to find a value for this symbol. It's just a
2891 *unresolved_reloc_p = FALSE;
2892 return bfd_reloc_ok;
2902 /* r_symndx will be zero only for relocs against symbols
2903 from removed linkonce sections, or sections discarded by
2906 return bfd_reloc_ok;
2908 /* Handle relocations which should use the PLT entry. ABS32/REL32
2909 will use the symbol's value, which may point to a PLT entry, but we
2910 don't need to handle that here. If we created a PLT entry, all
2911 branches in this object should go to it. */
2912 if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32)
2915 && h->plt.offset != (bfd_vma) -1)
2917 /* If we've created a .plt section, and assigned a PLT entry to
2918 this function, it should not be known to bind locally. If
2919 it were, we would have cleared the PLT entry. */
2920 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
2922 value = (splt->output_section->vma
2923 + splt->output_offset
2925 *unresolved_reloc_p = FALSE;
2926 return _bfd_final_link_relocate (howto, input_bfd, input_section,
2927 contents, rel->r_offset, value,
2931 /* When generating a shared object or relocatable executable, these
2932 relocations are copied into the output file to be resolved at
2934 if ((info->shared || globals->root.is_relocatable_executable)
2935 && (input_section->flags & SEC_ALLOC)
2936 && (r_type != R_ARM_REL32
2937 || !SYMBOL_CALLS_LOCAL (info, h))
2939 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2940 || h->root.type != bfd_link_hash_undefweak)
2941 && r_type != R_ARM_PC24
2942 && r_type != R_ARM_CALL
2943 && r_type != R_ARM_JUMP24
2944 && r_type != R_ARM_PREL31
2945 && r_type != R_ARM_PLT32)
2947 Elf_Internal_Rela outrel;
2949 bfd_boolean skip, relocate;
2951 *unresolved_reloc_p = FALSE;
2957 name = (bfd_elf_string_from_elf_section
2959 elf_elfheader (input_bfd)->e_shstrndx,
2960 elf_section_data (input_section)->rel_hdr.sh_name));
2962 return bfd_reloc_notsupported;
2964 BFD_ASSERT (strncmp (name, ".rel", 4) == 0
2965 && strcmp (bfd_get_section_name (input_bfd,
2969 sreloc = bfd_get_section_by_name (dynobj, name);
2970 BFD_ASSERT (sreloc != NULL);
2977 _bfd_elf_section_offset (output_bfd, info, input_section,
2979 if (outrel.r_offset == (bfd_vma) -1)
2981 else if (outrel.r_offset == (bfd_vma) -2)
2982 skip = TRUE, relocate = TRUE;
2983 outrel.r_offset += (input_section->output_section->vma
2984 + input_section->output_offset);
2987 memset (&outrel, 0, sizeof outrel);
2992 || !h->def_regular))
2993 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2998 /* This symbol is local, or marked to become local. */
3000 if (sym_flags == STT_ARM_TFUNC)
3002 if (globals->symbian_p)
3004 /* On Symbian OS, the data segment and text segement
3005 can be relocated independently. Therefore, we
3006 must indicate the segment to which this
3007 relocation is relative. The BPABI allows us to
3008 use any symbol in the right segment; we just use
3009 the section symbol as it is convenient. (We
3010 cannot use the symbol given by "h" directly as it
3011 will not appear in the dynamic symbol table.) */
3013 symbol = elf_section_data (sym_sec->output_section)->dynindx;
3015 symbol = elf_section_data (input_section->output_section)->dynindx;
3016 BFD_ASSERT (symbol != 0);
3019 /* On SVR4-ish systems, the dynamic loader cannot
3020 relocate the text and data segments independently,
3021 so the symbol does not matter. */
3023 outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
3026 loc = sreloc->contents;
3027 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
3028 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3030 /* If this reloc is against an external symbol, we do not want to
3031 fiddle with the addend. Otherwise, we need to include the symbol
3032 value so that it becomes an addend for the dynamic reloc. */
3034 return bfd_reloc_ok;
3036 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3037 contents, rel->r_offset, value,
3040 else switch (r_type)
3042 case R_ARM_XPC25: /* Arm BLX instruction. */
3045 case R_ARM_PC24: /* Arm B/BL instruction */
3047 if (r_type == R_ARM_XPC25)
3049 /* Check for Arm calling Arm function. */
3050 /* FIXME: Should we translate the instruction into a BL
3051 instruction instead ? */
3052 if (sym_flags != STT_ARM_TFUNC)
3053 (*_bfd_error_handler)
3054 (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
3056 h ? h->root.root.string : "(local)");
3060 /* Check for Arm calling Thumb function. */
3061 if (sym_flags == STT_ARM_TFUNC)
3063 elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
3064 output_bfd, input_section,
3065 hit_data, sym_sec, rel->r_offset,
3066 signed_addend, value);
3067 return bfd_reloc_ok;
3071 /* The ARM ELF ABI says that this reloc is computed as: S - P + A
3073 S is the address of the symbol in the relocation.
3074 P is address of the instruction being relocated.
3075 A is the addend (extracted from the instruction) in bytes.
3077 S is held in 'value'.
3078 P is the base address of the section containing the
3079 instruction plus the offset of the reloc into that
3081 (input_section->output_section->vma +
3082 input_section->output_offset +
3084 A is the addend, converted into bytes, ie:
3087 Note: None of these operations have knowledge of the pipeline
3088 size of the processor, thus it is up to the assembler to
3089 encode this information into the addend. */
3090 value -= (input_section->output_section->vma
3091 + input_section->output_offset);
3092 value -= rel->r_offset;
3093 if (globals->use_rel)
3094 value += (signed_addend << howto->size);
3096 /* RELA addends do not have to be adjusted by howto->size. */
3097 value += signed_addend;
3099 signed_addend = value;
3100 signed_addend >>= howto->rightshift;
3102 /* It is not an error for an undefined weak reference to be
3103 out of range. Any program that branches to such a symbol
3104 is going to crash anyway, so there is no point worrying
3105 about getting the destination exactly right. */
3106 if (! h || h->root.type != bfd_link_hash_undefweak)
3108 /* Perform a signed range check. */
3109 if ( signed_addend > ((bfd_signed_vma) (howto->dst_mask >> 1))
3110 || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
3111 return bfd_reloc_overflow;
3114 /* If necessary set the H bit in the BLX instruction. */
3115 if (r_type == R_ARM_XPC25 && ((value & 2) == 2))
3116 value = (signed_addend & howto->dst_mask)
3117 | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask))
3120 value = (signed_addend & howto->dst_mask)
3121 | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
3126 if (sym_flags == STT_ARM_TFUNC)
3131 value -= (input_section->output_section->vma
3132 + input_section->output_offset + rel->r_offset);
3137 value -= (input_section->output_section->vma
3138 + input_section->output_offset + rel->r_offset);
3139 value += signed_addend;
3140 if (! h || h->root.type != bfd_link_hash_undefweak)
3142 /* Check for overflow */
3143 if ((value ^ (value >> 1)) & (1 << 30))
3144 return bfd_reloc_overflow;
3146 value &= 0x7fffffff;
3147 value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
3148 if (sym_flags == STT_ARM_TFUNC)
3153 bfd_put_32 (input_bfd, value, hit_data);
3154 return bfd_reloc_ok;
3158 if ((long) value > 0x7f || (long) value < -0x80)
3159 return bfd_reloc_overflow;
3161 bfd_put_8 (input_bfd, value, hit_data);
3162 return bfd_reloc_ok;
3167 if ((long) value > 0x7fff || (long) value < -0x8000)
3168 return bfd_reloc_overflow;
3170 bfd_put_16 (input_bfd, value, hit_data);
3171 return bfd_reloc_ok;
3174 /* Support ldr and str instruction for the arm */
3175 /* Also thumb b (unconditional branch). ??? Really? */
3178 if ((long) value > 0x7ff || (long) value < -0x800)
3179 return bfd_reloc_overflow;
3181 value |= (bfd_get_32 (input_bfd, hit_data) & 0xfffff000);
3182 bfd_put_32 (input_bfd, value, hit_data);
3183 return bfd_reloc_ok;
3185 case R_ARM_THM_ABS5:
3186 /* Support ldr and str instructions for the thumb. */
3187 if (globals->use_rel)
3189 /* Need to refetch addend. */
3190 addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
3191 /* ??? Need to determine shift amount from operand size. */
3192 addend >>= howto->rightshift;
3196 /* ??? Isn't value unsigned? */
3197 if ((long) value > 0x1f || (long) value < -0x10)
3198 return bfd_reloc_overflow;
3200 /* ??? Value needs to be properly shifted into place first. */
3201 value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
3202 bfd_put_16 (input_bfd, value, hit_data);
3203 return bfd_reloc_ok;
3205 case R_ARM_THM_XPC22:
3206 case R_ARM_THM_CALL:
3207 /* Thumb BL (branch long instruction). */
3210 bfd_boolean overflow = FALSE;
3211 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
3212 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
3213 bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
3214 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3216 bfd_signed_vma signed_check;
3217 bfd_boolean thumb_plt_call = FALSE;
3219 /* Need to refetch the addend and squish the two 11 bit pieces
3221 if (globals->use_rel)
3223 bfd_vma upper = upper_insn & 0x7ff;
3224 bfd_vma lower = lower_insn & 0x7ff;
3225 upper = (upper ^ 0x400) - 0x400; /* Sign extend. */
3226 addend = (upper << 12) | (lower << 1);
3227 signed_addend = addend;
3230 if (r_type == R_ARM_THM_XPC22)
3232 /* Check for Thumb to Thumb call. */
3233 /* FIXME: Should we translate the instruction into a BL
3234 instruction instead ? */
3235 if (sym_flags == STT_ARM_TFUNC)
3236 (*_bfd_error_handler)
3237 (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
3239 h ? h->root.root.string : "(local)");
3243 /* If it is not a call to Thumb, assume call to Arm.
3244 If it is a call relative to a section name, then it is not a
3245 function call at all, but rather a long jump. Calls through
3246 the PLT do not require stubs. */
3247 if (sym_flags != STT_ARM_TFUNC && sym_flags != STT_SECTION
3248 && (h == NULL || splt == NULL
3249 || h->plt.offset == (bfd_vma) -1))
3251 if (elf32_thumb_to_arm_stub
3252 (info, sym_name, input_bfd, output_bfd, input_section,
3253 hit_data, sym_sec, rel->r_offset, signed_addend, value))
3254 return bfd_reloc_ok;
3256 return bfd_reloc_dangerous;
3260 /* Handle calls via the PLT. */
3261 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
3263 value = (splt->output_section->vma
3264 + splt->output_offset
3266 if (globals->use_blx)
3268 /* If the Thumb BLX instruction is available, convert the
3269 BL to a BLX instruction to call the ARM-mode PLT entry. */
3270 if ((lower_insn & (0x3 << 11)) == 0x3 << 11)
3272 lower_insn = (lower_insn & ~(0x3 << 11)) | 0x1 << 11;
3273 thumb_plt_call = TRUE;
3277 /* Target the Thumb stub before the ARM PLT entry. */
3278 value -= PLT_THUMB_STUB_SIZE;
3279 *unresolved_reloc_p = FALSE;
3282 relocation = value + signed_addend;
3284 relocation -= (input_section->output_section->vma
3285 + input_section->output_offset
3288 check = relocation >> howto->rightshift;
3290 /* If this is a signed value, the rightshift just dropped
3291 leading 1 bits (assuming twos complement). */
3292 if ((bfd_signed_vma) relocation >= 0)
3293 signed_check = check;
3295 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
3297 /* Assumes two's complement. */
3298 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3301 if ((r_type == R_ARM_THM_XPC22
3302 && ((lower_insn & 0x1800) == 0x0800))
3304 /* For a BLX instruction, make sure that the relocation is rounded up
3305 to a word boundary. This follows the semantics of the instruction
3306 which specifies that bit 1 of the target address will come from bit
3307 1 of the base address. */
3308 relocation = (relocation + 2) & ~ 3;
3310 /* Put RELOCATION back into the insn. */
3311 upper_insn = (upper_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 12) & 0x7ff);
3312 lower_insn = (lower_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 1) & 0x7ff);
3314 /* Put the relocated value back in the object file: */
3315 bfd_put_16 (input_bfd, upper_insn, hit_data);
3316 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
3318 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
3322 case R_ARM_THM_JUMP24:
3323 /* Thumb32 unconditional branch instruction. */
3326 bfd_boolean overflow = FALSE;
3327 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
3328 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
3329 bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
3330 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3332 bfd_signed_vma signed_check;
3334 /* Need to refetch the addend, reconstruct the top three bits, and glue the
3335 two pieces together. */
3336 if (globals->use_rel)
3338 bfd_vma S = (upper_insn & 0x0400) >> 10;
3339 bfd_vma hi = (upper_insn & 0x03ff);
3340 bfd_vma I1 = (lower_insn & 0x2000) >> 13;
3341 bfd_vma I2 = (lower_insn & 0x0800) >> 11;
3342 bfd_vma lo = (lower_insn & 0x07ff);
3348 signed_addend = (S << 24) | (I1 << 23) | (I2 << 22) | (hi << 12) | (lo << 1);
3349 signed_addend -= (1 << 24); /* Sign extend. */
3352 /* ??? Should handle interworking? GCC might someday try to
3353 use this for tail calls. */
3355 relocation = value + signed_addend;
3356 relocation -= (input_section->output_section->vma
3357 + input_section->output_offset
3360 check = relocation >> howto->rightshift;
3362 /* If this is a signed value, the rightshift just dropped
3363 leading 1 bits (assuming twos complement). */
3364 if ((bfd_signed_vma) relocation >= 0)
3365 signed_check = check;
3367 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
3369 /* Assumes two's complement. */
3370 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3373 /* Put RELOCATION back into the insn. */
3375 bfd_vma S = (relocation & 0x01000000) >> 24;
3376 bfd_vma I1 = (relocation & 0x00800000) >> 23;
3377 bfd_vma I2 = (relocation & 0x00400000) >> 22;
3378 bfd_vma hi = (relocation & 0x003ff000) >> 12;
3379 bfd_vma lo = (relocation & 0x00000ffe) >> 1;
3384 upper_insn = (upper_insn & (bfd_vma) 0xf800) | (S << 10) | hi;
3385 lower_insn = (lower_insn & (bfd_vma) 0xd000) | (I1 << 13) | (I2 << 11) | lo;
3388 /* Put the relocated value back in the object file: */
3389 bfd_put_16 (input_bfd, upper_insn, hit_data);
3390 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
3392 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
3395 case R_ARM_THM_JUMP19:
3396 /* Thumb32 conditional branch instruction. */
3399 bfd_boolean overflow = FALSE;
3400 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
3401 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
3402 bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
3403 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3405 bfd_signed_vma signed_check;
3407 /* Need to refetch the addend, reconstruct the top three bits,
3408 and squish the two 11 bit pieces together. */
3409 if (globals->use_rel)
3411 bfd_vma S = (upper_insn & 0x0400) >> 10;
3412 bfd_vma upper = (upper_insn & 0x001f);
3413 bfd_vma J1 = (lower_insn & 0x2000) >> 13;
3414 bfd_vma J2 = (lower_insn & 0x0800) >> 11;
3415 bfd_vma lower = (lower_insn & 0x07ff);
3420 upper -= 0x0100; /* Sign extend. */
3422 addend = (upper << 12) | (lower << 1);
3423 signed_addend = addend;
3426 /* ??? Should handle interworking? GCC might someday try to
3427 use this for tail calls. */
3429 relocation = value + signed_addend;
3430 relocation -= (input_section->output_section->vma
3431 + input_section->output_offset
3434 check = relocation >> howto->rightshift;
3436 /* If this is a signed value, the rightshift just dropped
3437 leading 1 bits (assuming twos complement). */
3438 if ((bfd_signed_vma) relocation >= 0)
3439 signed_check = check;
3441 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
3443 /* Assumes two's complement. */
3444 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3447 /* Put RELOCATION back into the insn. */
3449 bfd_vma S = (relocation & 0x00100000) >> 20;
3450 bfd_vma J2 = (relocation & 0x00080000) >> 19;
3451 bfd_vma J1 = (relocation & 0x00040000) >> 18;
3452 bfd_vma hi = (relocation & 0x0003f000) >> 12;
3453 bfd_vma lo = (relocation & 0x00000ffe) >> 1;
3455 upper_insn = (upper_insn & 0xfb30) | (S << 10) | hi;
3456 lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
3459 /* Put the relocated value back in the object file: */
3460 bfd_put_16 (input_bfd, upper_insn, hit_data);
3461 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
3463 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
3466 case R_ARM_THM_JUMP11:
3467 case R_ARM_THM_JUMP8:
3468 case R_ARM_THM_JUMP6:
3469 /* Thumb B (branch) instruction). */
3471 bfd_signed_vma relocation;
3472 bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
3473 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3474 bfd_signed_vma signed_check;
3476 /* CZB cannot jump backward. */
3477 if (r_type == R_ARM_THM_JUMP6)
3478 reloc_signed_min = 0;
3480 if (globals->use_rel)
3482 /* Need to refetch addend. */
3483 addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
3484 if (addend & ((howto->src_mask + 1) >> 1))
3487 signed_addend &= ~ howto->src_mask;
3488 signed_addend |= addend;
3491 signed_addend = addend;
3492 /* The value in the insn has been right shifted. We need to
3493 undo this, so that we can perform the address calculation
3494 in terms of bytes. */
3495 signed_addend <<= howto->rightshift;
3497 relocation = value + signed_addend;
3499 relocation -= (input_section->output_section->vma
3500 + input_section->output_offset
3503 relocation >>= howto->rightshift;
3504 signed_check = relocation;
3506 if (r_type == R_ARM_THM_JUMP6)
3507 relocation = ((relocation & 0x0020) << 4) | ((relocation & 0x001f) << 3);
3509 relocation &= howto->dst_mask;
3510 relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
3512 bfd_put_16 (input_bfd, relocation, hit_data);
3514 /* Assumes two's complement. */
3515 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3516 return bfd_reloc_overflow;
3518 return bfd_reloc_ok;
3521 case R_ARM_ALU_PCREL7_0:
3522 case R_ARM_ALU_PCREL15_8:
3523 case R_ARM_ALU_PCREL23_15:
3528 insn = bfd_get_32 (input_bfd, hit_data);
3529 if (globals->use_rel)
3531 /* Extract the addend. */
3532 addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
3533 signed_addend = addend;
3535 relocation = value + signed_addend;
3537 relocation -= (input_section->output_section->vma
3538 + input_section->output_offset
3540 insn = (insn & ~0xfff)
3541 | ((howto->bitpos << 7) & 0xf00)
3542 | ((relocation >> howto->bitpos) & 0xff);
3543 bfd_put_32 (input_bfd, value, hit_data);
3545 return bfd_reloc_ok;
3547 case R_ARM_GNU_VTINHERIT:
3548 case R_ARM_GNU_VTENTRY:
3549 return bfd_reloc_ok;
3551 case R_ARM_GOTOFF32:
3552 /* Relocation is relative to the start of the
3553 global offset table. */
3555 BFD_ASSERT (sgot != NULL);
3557 return bfd_reloc_notsupported;
3559 /* If we are addressing a Thumb function, we need to adjust the
3560 address by one, so that attempts to call the function pointer will
3561 correctly interpret it as Thumb code. */
3562 if (sym_flags == STT_ARM_TFUNC)
3565 /* Note that sgot->output_offset is not involved in this
3566 calculation. We always want the start of .got. If we
3567 define _GLOBAL_OFFSET_TABLE in a different way, as is
3568 permitted by the ABI, we might have to change this
3570 value -= sgot->output_section->vma;
3571 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3572 contents, rel->r_offset, value,
3576 /* Use global offset table as symbol value. */
3577 BFD_ASSERT (sgot != NULL);
3580 return bfd_reloc_notsupported;
3582 *unresolved_reloc_p = FALSE;
3583 value = sgot->output_section->vma;
3584 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3585 contents, rel->r_offset, value,
3589 case R_ARM_GOT_PREL:
3590 /* Relocation is to the entry for this symbol in the
3591 global offset table. */
3593 return bfd_reloc_notsupported;
3600 off = h->got.offset;
3601 BFD_ASSERT (off != (bfd_vma) -1);
3602 dyn = globals->root.dynamic_sections_created;
3604 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3606 && SYMBOL_REFERENCES_LOCAL (info, h))
3607 || (ELF_ST_VISIBILITY (h->other)
3608 && h->root.type == bfd_link_hash_undefweak))
3610 /* This is actually a static link, or it is a -Bsymbolic link
3611 and the symbol is defined locally. We must initialize this
3612 entry in the global offset table. Since the offset must
3613 always be a multiple of 4, we use the least significant bit
3614 to record whether we have initialized it already.
3616 When doing a dynamic link, we create a .rel.got relocation
3617 entry to initialize the value. This is done in the
3618 finish_dynamic_symbol routine. */
3623 /* If we are addressing a Thumb function, we need to
3624 adjust the address by one, so that attempts to
3625 call the function pointer will correctly
3626 interpret it as Thumb code. */
3627 if (sym_flags == STT_ARM_TFUNC)
3630 bfd_put_32 (output_bfd, value, sgot->contents + off);
3635 *unresolved_reloc_p = FALSE;
3637 value = sgot->output_offset + off;
3643 BFD_ASSERT (local_got_offsets != NULL &&
3644 local_got_offsets[r_symndx] != (bfd_vma) -1);
3646 off = local_got_offsets[r_symndx];
3648 /* The offset must always be a multiple of 4. We use the
3649 least significant bit to record whether we have already
3650 generated the necessary reloc. */
3655 /* If we are addressing a Thumb function, we need to
3656 adjust the address by one, so that attempts to
3657 call the function pointer will correctly
3658 interpret it as Thumb code. */
3659 if (sym_flags == STT_ARM_TFUNC)
3662 bfd_put_32 (output_bfd, value, sgot->contents + off);
3667 Elf_Internal_Rela outrel;
3670 srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
3671 BFD_ASSERT (srelgot != NULL);
3673 outrel.r_offset = (sgot->output_section->vma
3674 + sgot->output_offset
3676 outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
3677 loc = srelgot->contents;
3678 loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
3679 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3682 local_got_offsets[r_symndx] |= 1;
3685 value = sgot->output_offset + off;
3687 if (r_type != R_ARM_GOT32)
3688 value += sgot->output_section->vma;
3690 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3691 contents, rel->r_offset, value,
3694 case R_ARM_TLS_LDO32:
3695 value = value - dtpoff_base (info);
3697 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3698 contents, rel->r_offset, value, (bfd_vma) 0);
3700 case R_ARM_TLS_LDM32:
3704 if (globals->sgot == NULL)
3707 off = globals->tls_ldm_got.offset;
3713 /* If we don't know the module number, create a relocation
3717 Elf_Internal_Rela outrel;
3720 if (globals->srelgot == NULL)
3723 outrel.r_offset = (globals->sgot->output_section->vma
3724 + globals->sgot->output_offset + off);
3725 outrel.r_info = ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32);
3727 bfd_put_32 (output_bfd, 0, globals->sgot->contents + off);
3729 loc = globals->srelgot->contents;
3730 loc += globals->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
3731 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3734 bfd_put_32 (output_bfd, 1, globals->sgot->contents + off);
3736 globals->tls_ldm_got.offset |= 1;
3739 value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
3740 - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
3742 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3743 contents, rel->r_offset, value,
3747 case R_ARM_TLS_GD32:
3748 case R_ARM_TLS_IE32:
3754 if (globals->sgot == NULL)
3761 dyn = globals->root.dynamic_sections_created;
3762 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3764 || !SYMBOL_REFERENCES_LOCAL (info, h)))
3766 *unresolved_reloc_p = FALSE;
3769 off = h->got.offset;
3770 tls_type = ((struct elf32_arm_link_hash_entry *) h)->tls_type;
3774 if (local_got_offsets == NULL)
3776 off = local_got_offsets[r_symndx];
3777 tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
3780 if (tls_type == GOT_UNKNOWN)
3787 bfd_boolean need_relocs = FALSE;
3788 Elf_Internal_Rela outrel;
3789 bfd_byte *loc = NULL;
3792 /* The GOT entries have not been initialized yet. Do it
3793 now, and emit any relocations. If both an IE GOT and a
3794 GD GOT are necessary, we emit the GD first. */
3796 if ((info->shared || indx != 0)
3798 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3799 || h->root.type != bfd_link_hash_undefweak))
3802 if (globals->srelgot == NULL)
3804 loc = globals->srelgot->contents;
3805 loc += globals->srelgot->reloc_count * sizeof (Elf32_External_Rel);
3808 if (tls_type & GOT_TLS_GD)
3812 outrel.r_offset = (globals->sgot->output_section->vma
3813 + globals->sgot->output_offset + cur_off);
3814 outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DTPMOD32);
3815 bfd_put_32 (output_bfd, 0, globals->sgot->contents + cur_off);
3817 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3818 globals->srelgot->reloc_count++;
3819 loc += sizeof (Elf32_External_Rel);
3822 bfd_put_32 (output_bfd, value - dtpoff_base (info),
3823 globals->sgot->contents + cur_off + 4);
3826 bfd_put_32 (output_bfd, 0,
3827 globals->sgot->contents + cur_off + 4);
3829 outrel.r_info = ELF32_R_INFO (indx,
3830 R_ARM_TLS_DTPOFF32);
3831 outrel.r_offset += 4;
3832 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3833 globals->srelgot->reloc_count++;
3834 loc += sizeof (Elf32_External_Rel);
3839 /* If we are not emitting relocations for a
3840 general dynamic reference, then we must be in a
3841 static link or an executable link with the
3842 symbol binding locally. Mark it as belonging
3843 to module 1, the executable. */
3844 bfd_put_32 (output_bfd, 1,
3845 globals->sgot->contents + cur_off);
3846 bfd_put_32 (output_bfd, value - dtpoff_base (info),
3847 globals->sgot->contents + cur_off + 4);
3853 if (tls_type & GOT_TLS_IE)
3857 outrel.r_offset = (globals->sgot->output_section->vma
3858 + globals->sgot->output_offset
3860 outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_TPOFF32);
3863 bfd_put_32 (output_bfd, value - dtpoff_base (info),
3864 globals->sgot->contents + cur_off);
3866 bfd_put_32 (output_bfd, 0,
3867 globals->sgot->contents + cur_off);
3869 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3870 globals->srelgot->reloc_count++;
3871 loc += sizeof (Elf32_External_Rel);
3874 bfd_put_32 (output_bfd, tpoff (info, value),
3875 globals->sgot->contents + cur_off);
3882 local_got_offsets[r_symndx] |= 1;
3885 if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32)
3887 value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
3888 - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
3890 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3891 contents, rel->r_offset, value,
3895 case R_ARM_TLS_LE32:
3898 (*_bfd_error_handler)
3899 (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
3900 input_bfd, input_section,
3901 (long) rel->r_offset, howto->name);
3905 value = tpoff (info, value);
3907 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3908 contents, rel->r_offset, value, (bfd_vma) 0);
3911 if (globals->fix_v4bx)
3913 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
3915 /* Ensure that we have a BX instruction. */
3916 BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
3918 /* Preserve Rm (lowest four bits) and the condition code
3919 (highest four bits). Other bits encode MOV PC,Rm. */
3920 insn = (insn & 0xf000000f) | 0x01a0f000;
3922 bfd_put_32 (input_bfd, insn, hit_data);
3924 return bfd_reloc_ok;
3927 return bfd_reloc_notsupported;
3933 uleb128_size (unsigned int i)
3945 /* Return TRUE if the attribute has the default value (0/""). */
3947 is_default_attr (aeabi_attribute *attr)
3949 if ((attr->type & 1) && attr->i != 0)
3951 if ((attr->type & 2) && attr->s && *attr->s)
3957 /* Return the size of a single attribute. */
3959 eabi_attr_size(int tag, aeabi_attribute *attr)
3963 if (is_default_attr (attr))
3966 size = uleb128_size (tag);
3968 size += uleb128_size (attr->i);
3970 size += strlen ((char *)attr->s) + 1;
3974 /* Returns the size of the eabi object attributess section. */
3976 elf32_arm_eabi_attr_size (bfd *abfd)
3979 aeabi_attribute *attr;
3980 aeabi_attribute_list *list;
3983 attr = elf32_arm_tdata (abfd)->known_eabi_attributes;
3984 size = 16; /* 'A' <size> "aeabi" 0x1 <size>. */
3985 for (i = 4; i < NUM_KNOWN_ATTRIBUTES; i++)
3986 size += eabi_attr_size (i, &attr[i]);
3988 for (list = elf32_arm_tdata (abfd)->other_eabi_attributes;
3991 size += eabi_attr_size (list->tag, &list->attr);
3997 write_uleb128 (bfd_byte *p, unsigned int val)
4012 /* Write attribute ATTR to butter P, and return a pointer to the following
4015 write_eabi_attribute (bfd_byte *p, int tag, aeabi_attribute *attr)
4017 /* Suppress default entries. */
4018 if (is_default_attr(attr))
4021 p = write_uleb128 (p, tag);
4023 p = write_uleb128 (p, attr->i);
4028 len = strlen (attr->s) + 1;
4029 memcpy (p, attr->s, len);
4036 /* Write the contents of the eabi attributes section to p. */
4038 elf32_arm_set_eabi_attr_contents (bfd *abfd, bfd_byte *contents, bfd_vma size)
4041 aeabi_attribute *attr;
4042 aeabi_attribute_list *list;
4047 bfd_put_32 (abfd, size - 1, p);
4049 memcpy (p, "aeabi", 6);
4052 bfd_put_32 (abfd, size - 11, p);
4055 attr = elf32_arm_tdata (abfd)->known_eabi_attributes;
4056 for (i = 4; i < NUM_KNOWN_ATTRIBUTES; i++)
4057 p = write_eabi_attribute (p, i, &attr[i]);
4059 for (list = elf32_arm_tdata (abfd)->other_eabi_attributes;
4062 p = write_eabi_attribute (p, list->tag, &list->attr);
4065 /* Override final_link to handle EABI object attribute sections. */
4068 elf32_arm_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
4071 struct bfd_link_order *p;
4072 asection *attr_section = NULL;
4076 /* elf32_arm_merge_private_bfd_data will already have merged the
4077 object attributes. Remove the input sections from the link, and set
4078 the contents of the output secton. */
4079 for (o = abfd->sections; o != NULL; o = o->next)
4081 if (strcmp (o->name, ".ARM.attributes") == 0)
4083 for (p = o->map_head.link_order; p != NULL; p = p->next)
4085 asection *input_section;
4087 if (p->type != bfd_indirect_link_order)
4089 input_section = p->u.indirect.section;
4090 /* Hack: reset the SEC_HAS_CONTENTS flag so that
4091 elf_link_input_bfd ignores this section. */
4092 input_section->flags &= ~SEC_HAS_CONTENTS;
4095 size = elf32_arm_eabi_attr_size (abfd);
4096 bfd_set_section_size (abfd, o, size);
4098 /* Skip this section later on. */
4099 o->map_head.link_order = NULL;
4102 /* Invoke the ELF linker to do all the work. */
4103 if (!bfd_elf_final_link (abfd, info))
4108 contents = bfd_malloc(size);
4109 if (contents == NULL)
4111 elf32_arm_set_eabi_attr_contents (abfd, contents, size);
4112 bfd_set_section_contents (abfd, attr_section, contents, 0, size);
4119 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS. */
4121 arm_add_to_rel (bfd * abfd,
4123 reloc_howto_type * howto,
4124 bfd_signed_vma increment)
4126 bfd_signed_vma addend;
4128 if (howto->type == R_ARM_THM_CALL)
4130 int upper_insn, lower_insn;
4133 upper_insn = bfd_get_16 (abfd, address);
4134 lower_insn = bfd_get_16 (abfd, address + 2);
4135 upper = upper_insn & 0x7ff;
4136 lower = lower_insn & 0x7ff;
4138 addend = (upper << 12) | (lower << 1);
4139 addend += increment;
4142 upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
4143 lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
4145 bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
4146 bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
4152 contents = bfd_get_32 (abfd, address);
4154 /* Get the (signed) value from the instruction. */
4155 addend = contents & howto->src_mask;
4156 if (addend & ((howto->src_mask + 1) >> 1))
4158 bfd_signed_vma mask;
4161 mask &= ~ howto->src_mask;
4165 /* Add in the increment, (which is a byte value). */
4166 switch (howto->type)
4169 addend += increment;
4176 addend <<= howto->size;
4177 addend += increment;
4179 /* Should we check for overflow here ? */
4181 /* Drop any undesired bits. */
4182 addend >>= howto->rightshift;
4186 contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
4188 bfd_put_32 (abfd, contents, address);
4192 #define IS_ARM_TLS_RELOC(R_TYPE) \
4193 ((R_TYPE) == R_ARM_TLS_GD32 \
4194 || (R_TYPE) == R_ARM_TLS_LDO32 \
4195 || (R_TYPE) == R_ARM_TLS_LDM32 \
4196 || (R_TYPE) == R_ARM_TLS_DTPOFF32 \
4197 || (R_TYPE) == R_ARM_TLS_DTPMOD32 \
4198 || (R_TYPE) == R_ARM_TLS_TPOFF32 \
4199 || (R_TYPE) == R_ARM_TLS_LE32 \
4200 || (R_TYPE) == R_ARM_TLS_IE32)
4202 /* Relocate an ARM ELF section. */
4204 elf32_arm_relocate_section (bfd * output_bfd,
4205 struct bfd_link_info * info,
4207 asection * input_section,
4208 bfd_byte * contents,
4209 Elf_Internal_Rela * relocs,
4210 Elf_Internal_Sym * local_syms,
4211 asection ** local_sections)
4213 Elf_Internal_Shdr *symtab_hdr;
4214 struct elf_link_hash_entry **sym_hashes;
4215 Elf_Internal_Rela *rel;
4216 Elf_Internal_Rela *relend;
4218 struct elf32_arm_link_hash_table * globals;
4220 globals = elf32_arm_hash_table (info);
4221 if (info->relocatable && !globals->use_rel)
4224 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
4225 sym_hashes = elf_sym_hashes (input_bfd);
4228 relend = relocs + input_section->reloc_count;
4229 for (; rel < relend; rel++)
4232 reloc_howto_type * howto;
4233 unsigned long r_symndx;
4234 Elf_Internal_Sym * sym;
4236 struct elf_link_hash_entry * h;
4238 bfd_reloc_status_type r;
4241 bfd_boolean unresolved_reloc = FALSE;
4243 r_symndx = ELF32_R_SYM (rel->r_info);
4244 r_type = ELF32_R_TYPE (rel->r_info);
4245 r_type = arm_real_reloc_type (globals, r_type);
4247 if ( r_type == R_ARM_GNU_VTENTRY
4248 || r_type == R_ARM_GNU_VTINHERIT)
4251 bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
4252 howto = bfd_reloc.howto;
4254 if (info->relocatable && globals->use_rel)
4256 /* This is a relocatable link. We don't have to change
4257 anything, unless the reloc is against a section symbol,
4258 in which case we have to adjust according to where the
4259 section symbol winds up in the output section. */
4260 if (r_symndx < symtab_hdr->sh_info)
4262 sym = local_syms + r_symndx;
4263 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4265 sec = local_sections[r_symndx];
4266 arm_add_to_rel (input_bfd, contents + rel->r_offset,
4268 (bfd_signed_vma) (sec->output_offset
4276 /* This is a final link. */
4281 if (r_symndx < symtab_hdr->sh_info)
4283 sym = local_syms + r_symndx;
4284 sym_type = ELF32_ST_TYPE (sym->st_info);
4285 sec = local_sections[r_symndx];
4286 if (globals->use_rel)
4288 relocation = (sec->output_section->vma
4289 + sec->output_offset
4291 if ((sec->flags & SEC_MERGE)
4292 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4295 bfd_vma addend, value;
4297 if (howto->rightshift)
4299 (*_bfd_error_handler)
4300 (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
4301 input_bfd, input_section,
4302 (long) rel->r_offset, howto->name);
4306 value = bfd_get_32 (input_bfd, contents + rel->r_offset);
4308 /* Get the (signed) value from the instruction. */
4309 addend = value & howto->src_mask;
4310 if (addend & ((howto->src_mask + 1) >> 1))
4312 bfd_signed_vma mask;
4315 mask &= ~ howto->src_mask;
4320 _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
4322 addend += msec->output_section->vma + msec->output_offset;
4323 value = (value & ~ howto->dst_mask) | (addend & howto->dst_mask);
4324 bfd_put_32 (input_bfd, value, contents + rel->r_offset);
4328 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4334 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4335 r_symndx, symtab_hdr, sym_hashes,
4337 unresolved_reloc, warned);
4343 name = h->root.root.string;
4346 name = (bfd_elf_string_from_elf_section
4347 (input_bfd, symtab_hdr->sh_link, sym->st_name));
4348 if (name == NULL || *name == '\0')
4349 name = bfd_section_name (input_bfd, sec);
4353 && r_type != R_ARM_NONE
4355 || h->root.type == bfd_link_hash_defined
4356 || h->root.type == bfd_link_hash_defweak)
4357 && IS_ARM_TLS_RELOC (r_type) != (sym_type == STT_TLS))
4359 (*_bfd_error_handler)
4360 ((sym_type == STT_TLS
4361 ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
4362 : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
4365 (long) rel->r_offset,
4370 r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
4371 input_section, contents, rel,
4372 relocation, info, sec, name,
4373 (h ? ELF_ST_TYPE (h->type) :
4374 ELF_ST_TYPE (sym->st_info)), h,
4377 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4378 because such sections are not SEC_ALLOC and thus ld.so will
4379 not process them. */
4380 if (unresolved_reloc
4381 && !((input_section->flags & SEC_DEBUGGING) != 0
4384 (*_bfd_error_handler)
4385 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
4388 (long) rel->r_offset,
4390 h->root.root.string);
4394 if (r != bfd_reloc_ok)
4396 const char * msg = (const char *) 0;
4400 case bfd_reloc_overflow:
4401 /* If the overflowing reloc was to an undefined symbol,
4402 we have already printed one error message and there
4403 is no point complaining again. */
4405 h->root.type != bfd_link_hash_undefined)
4406 && (!((*info->callbacks->reloc_overflow)
4407 (info, (h ? &h->root : NULL), name, howto->name,
4408 (bfd_vma) 0, input_bfd, input_section,
4413 case bfd_reloc_undefined:
4414 if (!((*info->callbacks->undefined_symbol)
4415 (info, name, input_bfd, input_section,
4416 rel->r_offset, TRUE)))
4420 case bfd_reloc_outofrange:
4421 msg = _("internal error: out of range error");
4424 case bfd_reloc_notsupported:
4425 msg = _("internal error: unsupported relocation error");
4428 case bfd_reloc_dangerous:
4429 msg = _("internal error: dangerous error");
4433 msg = _("internal error: unknown error");
4437 if (!((*info->callbacks->warning)
4438 (info, msg, name, input_bfd, input_section,
4449 /* Allocate/find an object attribute. */
4450 static aeabi_attribute *
4451 elf32_arm_new_eabi_attr (bfd *abfd, int tag)
4453 aeabi_attribute *attr;
4454 aeabi_attribute_list *list;
4455 aeabi_attribute_list *p;
4456 aeabi_attribute_list **lastp;
4459 if (tag < NUM_KNOWN_ATTRIBUTES)
4461 /* Knwon tags are preallocated. */
4462 attr = &elf32_arm_tdata (abfd)->known_eabi_attributes[tag];
4466 /* Create a new tag. */
4467 list = (aeabi_attribute_list *)
4468 bfd_alloc (abfd, sizeof (aeabi_attribute_list));
4469 memset (list, 0, sizeof (aeabi_attribute_list));
4471 /* Keep the tag list in order. */
4472 lastp = &elf32_arm_tdata (abfd)->other_eabi_attributes;
4473 for (p = *lastp; p; p = p->next)
4479 list->next = *lastp;
4488 elf32_arm_add_eabi_attr_int (bfd *abfd, int tag, unsigned int i)
4490 aeabi_attribute *attr;
4492 attr = elf32_arm_new_eabi_attr (abfd, tag);
4498 attr_strdup (bfd *abfd, const char * s)
4503 len = strlen (s) + 1;
4504 p = (char *)bfd_alloc(abfd, len);
4505 return memcpy (p, s, len);
4509 elf32_arm_add_eabi_attr_string (bfd *abfd, int tag, const char *s)
4511 aeabi_attribute *attr;
4513 attr = elf32_arm_new_eabi_attr (abfd, tag);
4515 attr->s = attr_strdup (abfd, s);
4519 elf32_arm_add_eabi_attr_compat (bfd *abfd, unsigned int i, const char *s)
4521 aeabi_attribute_list *list;
4522 aeabi_attribute_list *p;
4523 aeabi_attribute_list **lastp;
4525 list = (aeabi_attribute_list *)
4526 bfd_alloc (abfd, sizeof (aeabi_attribute_list));
4527 memset (list, 0, sizeof (aeabi_attribute_list));
4528 list->tag = Tag_compatibility;
4529 list->attr.type = 3;
4531 list->attr.s = attr_strdup (abfd, s);
4533 lastp = &elf32_arm_tdata (abfd)->other_eabi_attributes;
4534 for (p = *lastp; p; p = p->next)
4537 if (p->tag != Tag_compatibility)
4539 cmp = strcmp(s, p->attr.s);
4540 if (cmp < 0 || (cmp == 0 && i < p->attr.i))
4544 list->next = *lastp;
4548 /* Set the right machine number. */
4551 elf32_arm_object_p (bfd *abfd)
4555 mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
4557 if (mach != bfd_mach_arm_unknown)
4558 bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
4560 else if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
4561 bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
4564 bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
4569 /* Function to keep ARM specific flags in the ELF header. */
4572 elf32_arm_set_private_flags (bfd *abfd, flagword flags)
4574 if (elf_flags_init (abfd)
4575 && elf_elfheader (abfd)->e_flags != flags)
4577 if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
4579 if (flags & EF_ARM_INTERWORK)
4580 (*_bfd_error_handler)
4581 (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
4585 (_("Warning: Clearing the interworking flag of %B due to outside request"),
4591 elf_elfheader (abfd)->e_flags = flags;
4592 elf_flags_init (abfd) = TRUE;
4598 /* Copy the eabi object attribute from IBFD to OBFD. */
4600 copy_eabi_attributes (bfd *ibfd, bfd *obfd)
4602 aeabi_attribute *in_attr;
4603 aeabi_attribute *out_attr;
4604 aeabi_attribute_list *list;
4607 in_attr = elf32_arm_tdata (ibfd)->known_eabi_attributes;
4608 out_attr = elf32_arm_tdata (obfd)->known_eabi_attributes;
4609 for (i = 4; i < NUM_KNOWN_ATTRIBUTES; i++)
4611 out_attr->i = in_attr->i;
4612 if (in_attr->s && *in_attr->s)
4613 out_attr->s = attr_strdup (obfd, in_attr->s);
4618 for (list = elf32_arm_tdata (ibfd)->other_eabi_attributes;
4622 in_attr = &list->attr;
4623 switch (in_attr->type)
4626 elf32_arm_add_eabi_attr_int (obfd, list->tag, in_attr->i);
4629 elf32_arm_add_eabi_attr_string (obfd, list->tag, in_attr->s);
4632 elf32_arm_add_eabi_attr_compat (obfd, in_attr->i, in_attr->s);
4641 /* Copy backend specific data from one object module to another. */
4644 elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
4649 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4650 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4653 in_flags = elf_elfheader (ibfd)->e_flags;
4654 out_flags = elf_elfheader (obfd)->e_flags;
4656 if (elf_flags_init (obfd)
4657 && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
4658 && in_flags != out_flags)
4660 /* Cannot mix APCS26 and APCS32 code. */
4661 if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
4664 /* Cannot mix float APCS and non-float APCS code. */
4665 if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
4668 /* If the src and dest have different interworking flags
4669 then turn off the interworking bit. */
4670 if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
4672 if (out_flags & EF_ARM_INTERWORK)
4674 (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
4677 in_flags &= ~EF_ARM_INTERWORK;
4680 /* Likewise for PIC, though don't warn for this case. */
4681 if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
4682 in_flags &= ~EF_ARM_PIC;
4685 elf_elfheader (obfd)->e_flags = in_flags;
4686 elf_flags_init (obfd) = TRUE;
4688 /* Also copy the EI_OSABI field. */
4689 elf_elfheader (obfd)->e_ident[EI_OSABI] =
4690 elf_elfheader (ibfd)->e_ident[EI_OSABI];
4692 /* Copy EABI object attributes. */
4693 copy_eabi_attributes (ibfd, obfd);
4698 /* Values for Tag_ABI_PCS_R9_use. */
4707 /* Values for Tag_ABI_PCS_RW_data. */
4710 AEABI_PCS_RW_data_absolute,
4711 AEABI_PCS_RW_data_PCrel,
4712 AEABI_PCS_RW_data_SBrel,
4713 AEABI_PCS_RW_data_unused
4716 /* Values for Tag_ABI_enum_size. */
4722 AEABI_enum_forced_wide
4725 /* Merge EABI object attributes from IBFD into OBFD. Raise an error if there
4726 are conflicting attributes. */
4728 elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
4730 aeabi_attribute *in_attr;
4731 aeabi_attribute *out_attr;
4732 aeabi_attribute_list *in_list;
4733 aeabi_attribute_list *out_list;
4734 /* Some tags have 0 = don't care, 1 = strong requirement,
4735 2 = weak requirement. */
4736 static const int order_312[3] = {3, 1, 2};
4739 if (!elf32_arm_tdata (ibfd)->known_eabi_attributes[0].i)
4741 /* This is the first object. Copy the attributes. */
4742 copy_eabi_attributes (ibfd, obfd);
4746 /* Use the Tag_null value to indicate the attributes have been
4748 elf32_arm_tdata (ibfd)->known_eabi_attributes[0].i = 1;
4750 in_attr = elf32_arm_tdata (ibfd)->known_eabi_attributes;
4751 out_attr = elf32_arm_tdata (obfd)->known_eabi_attributes;
4752 /* This needs to happen before Tag_ABI_FP_number_model is merged. */
4753 if (in_attr[Tag_ABI_VFP_args].i != out_attr[Tag_ABI_VFP_args].i)
4755 /* Ignore mismatches if teh object doesn't use floating point. */
4756 if (out_attr[Tag_ABI_FP_number_model].i == 0)
4757 out_attr[Tag_ABI_VFP_args].i = in_attr[Tag_ABI_VFP_args].i;
4758 else if (in_attr[Tag_ABI_FP_number_model].i != 0)
4761 (_("ERROR: %B uses VFP register arguments, %B does not"),
4767 for (i = 4; i < NUM_KNOWN_ATTRIBUTES; i++)
4769 /* Merge this attribute with existing attributes. */
4772 case Tag_CPU_raw_name:
4774 /* Use whichever has the greatest architecture requirements. */
4775 if (in_attr[Tag_CPU_arch].i > out_attr[Tag_CPU_arch].i)
4776 out_attr[i].s = attr_strdup(obfd, in_attr[i].s);
4779 case Tag_ABI_optimization_goals:
4780 case Tag_ABI_FP_optimization_goals:
4781 /* Use the first value seen. */
4785 case Tag_ARM_ISA_use:
4786 case Tag_THUMB_ISA_use:
4790 /* ??? Do NEON and WMMX conflict? */
4791 case Tag_ABI_FP_rounding:
4792 case Tag_ABI_FP_denormal:
4793 case Tag_ABI_FP_exceptions:
4794 case Tag_ABI_FP_user_exceptions:
4795 case Tag_ABI_FP_number_model:
4796 case Tag_ABI_align8_preserved:
4797 case Tag_ABI_HardFP_use:
4798 /* Use the largest value specified. */
4799 if (in_attr[i].i > out_attr[i].i)
4800 out_attr[i].i = in_attr[i].i;
4803 case Tag_CPU_arch_profile:
4804 /* Warn if conflicting architecture profiles used. */
4805 if (out_attr[i].i && in_attr[i].i && in_attr[i].i != out_attr[i].i)
4808 (_("ERROR: %B: Conflicting architecture profiles %c/%c"),
4809 ibfd, in_attr[i].i, out_attr[i].i);
4813 out_attr[i].i = in_attr[i].i;
4815 case Tag_PCS_config:
4816 if (out_attr[i].i == 0)
4817 out_attr[i].i = in_attr[i].i;
4818 else if (in_attr[i].i != 0 && out_attr[i].i != 0)
4820 /* It's sometimes ok to mix different configs, so this is only
4823 (_("Warning: %B: Conflicting platform configuration"), ibfd);
4826 case Tag_ABI_PCS_R9_use:
4827 if (out_attr[i].i != AEABI_R9_unused
4828 && in_attr[i].i != AEABI_R9_unused)
4831 (_("ERROR: %B: Conflicting use of R9"), ibfd);
4834 if (out_attr[i].i == AEABI_R9_unused)
4835 out_attr[i].i = in_attr[i].i;
4837 case Tag_ABI_PCS_RW_data:
4838 if (in_attr[i].i == AEABI_PCS_RW_data_SBrel
4839 && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_SB
4840 && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_unused)
4843 (_("ERROR: %B: SB relative addressing conflicts with use of R9"),
4847 /* Use the smallest value specified. */
4848 if (in_attr[i].i < out_attr[i].i)
4849 out_attr[i].i = in_attr[i].i;
4851 case Tag_ABI_PCS_RO_data:
4852 /* Use the smallest value specified. */
4853 if (in_attr[i].i < out_attr[i].i)
4854 out_attr[i].i = in_attr[i].i;
4856 case Tag_ABI_PCS_GOT_use:
4857 if (in_attr[i].i > 2 || out_attr[i].i > 2
4858 || order_312[in_attr[i].i] < order_312[out_attr[i].i])
4859 out_attr[i].i = in_attr[i].i;
4861 case Tag_ABI_PCS_wchar_t:
4862 if (out_attr[i].i && in_attr[i].i && out_attr[i].i != in_attr[i].i)
4865 (_("ERROR: %B: Conflicting definitions of wchar_t"), ibfd);
4869 out_attr[i].i = in_attr[i].i;
4871 case Tag_ABI_align8_needed:
4872 /* ??? Check against Tag_ABI_align8_preserved. */
4873 if (in_attr[i].i > 2 || out_attr[i].i > 2
4874 || order_312[in_attr[i].i] < order_312[out_attr[i].i])
4875 out_attr[i].i = in_attr[i].i;
4877 case Tag_ABI_enum_size:
4878 if (in_attr[i].i != AEABI_enum_unused)
4880 if (out_attr[i].i == AEABI_enum_unused
4881 || out_attr[i].i == AEABI_enum_forced_wide)
4883 /* The existing object is compatible with anything.
4884 Use whatever requirements the new object has. */
4885 out_attr[i].i = in_attr[i].i;
4887 else if (in_attr[i].i != AEABI_enum_forced_wide
4888 && out_attr[i].i != in_attr[i].i)
4891 (_("ERROR: %B: Conflicting enum sizes"), ibfd);
4895 case Tag_ABI_VFP_args:
4898 case Tag_ABI_WMMX_args:
4899 if (in_attr[i].i != out_attr[i].i)
4902 (_("ERROR: %B uses iWMMXt register arguments, %B does not"),
4907 default: /* All known attributes should be explicitly covered. */
4912 in_list = elf32_arm_tdata (ibfd)->other_eabi_attributes;
4913 out_list = elf32_arm_tdata (ibfd)->other_eabi_attributes;
4914 while (in_list && in_list->tag == Tag_compatibility)
4916 in_attr = &in_list->attr;
4917 if (in_attr->i == 0)
4919 if (in_attr->i == 1)
4922 (_("ERROR: %B: Must be processed by '%s' toolchain"),
4926 if (!out_list || out_list->tag != Tag_compatibility
4927 || strcmp (in_attr->s, out_list->attr.s) != 0)
4929 /* Add this compatibility tag to the output. */
4930 elf32_arm_add_eabi_attr_compat (obfd, in_attr->i, in_attr->s);
4933 out_attr = &out_list->attr;
4934 /* Check all the input tags with the same identifier. */
4937 if (out_list->tag != Tag_compatibility
4938 || in_attr->i != out_attr->i
4939 || strcmp (in_attr->s, out_attr->s) != 0)
4942 (_("ERROR: %B: Incompatible object tag '%s':%d"),
4943 ibfd, in_attr->s, in_attr->i);
4946 in_list = in_list->next;
4947 if (in_list->tag != Tag_compatibility
4948 || strcmp (in_attr->s, in_list->attr.s) != 0)
4950 in_attr = &in_list->attr;
4951 out_list = out_list->next;
4953 out_attr = &out_list->attr;
4956 /* Check the output doesn't have extra tags with this identifier. */
4957 if (out_list && out_list->tag == Tag_compatibility
4958 && strcmp (in_attr->s, out_list->attr.s) == 0)
4961 (_("ERROR: %B: Incompatible object tag '%s':%d"),
4962 ibfd, in_attr->s, out_list->attr.i);
4967 for (; in_list; in_list = in_list->next)
4969 if ((in_list->tag & 128) < 64)
4971 (_("Warning: %B: Unknown EABI object attribute %d"),
4972 ibfd, in_list->tag);
4978 /* Merge backend specific data from an object file to the output
4979 object file when linking. */
4982 elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
4986 bfd_boolean flags_compatible = TRUE;
4989 /* Check if we have the same endianess. */
4990 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
4993 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4994 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4997 if (!elf32_arm_merge_eabi_attributes (ibfd, obfd))
5000 /* The input BFD must have had its flags initialised. */
5001 /* The following seems bogus to me -- The flags are initialized in
5002 the assembler but I don't think an elf_flags_init field is
5003 written into the object. */
5004 /* BFD_ASSERT (elf_flags_init (ibfd)); */
5006 in_flags = elf_elfheader (ibfd)->e_flags;
5007 out_flags = elf_elfheader (obfd)->e_flags;
5009 if (!elf_flags_init (obfd))
5011 /* If the input is the default architecture and had the default
5012 flags then do not bother setting the flags for the output
5013 architecture, instead allow future merges to do this. If no
5014 future merges ever set these flags then they will retain their
5015 uninitialised values, which surprise surprise, correspond
5016 to the default values. */
5017 if (bfd_get_arch_info (ibfd)->the_default
5018 && elf_elfheader (ibfd)->e_flags == 0)
5021 elf_flags_init (obfd) = TRUE;
5022 elf_elfheader (obfd)->e_flags = in_flags;
5024 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
5025 && bfd_get_arch_info (obfd)->the_default)
5026 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
5031 /* Determine what should happen if the input ARM architecture
5032 does not match the output ARM architecture. */
5033 if (! bfd_arm_merge_machines (ibfd, obfd))
5036 /* Identical flags must be compatible. */
5037 if (in_flags == out_flags)
5040 /* Check to see if the input BFD actually contains any sections. If
5041 not, its flags may not have been initialised either, but it
5042 cannot actually cause any incompatiblity. Do not short-circuit
5043 dynamic objects; their section list may be emptied by
5044 elf_link_add_object_symbols.
5046 Also check to see if there are no code sections in the input.
5047 In this case there is no need to check for code specific flags.
5048 XXX - do we need to worry about floating-point format compatability
5049 in data sections ? */
5050 if (!(ibfd->flags & DYNAMIC))
5052 bfd_boolean null_input_bfd = TRUE;
5053 bfd_boolean only_data_sections = TRUE;
5055 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
5057 /* Ignore synthetic glue sections. */
5058 if (strcmp (sec->name, ".glue_7")
5059 && strcmp (sec->name, ".glue_7t"))
5061 if ((bfd_get_section_flags (ibfd, sec)
5062 & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
5063 == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
5064 only_data_sections = FALSE;
5066 null_input_bfd = FALSE;
5071 if (null_input_bfd || only_data_sections)
5075 /* Complain about various flag mismatches. */
5076 if (EF_ARM_EABI_VERSION (in_flags) != EF_ARM_EABI_VERSION (out_flags))
5079 (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
5081 (in_flags & EF_ARM_EABIMASK) >> 24,
5082 (out_flags & EF_ARM_EABIMASK) >> 24);
5086 /* Not sure what needs to be checked for EABI versions >= 1. */
5087 if (EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
5089 if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
5092 (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
5094 in_flags & EF_ARM_APCS_26 ? 26 : 32,
5095 out_flags & EF_ARM_APCS_26 ? 26 : 32);
5096 flags_compatible = FALSE;
5099 if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
5101 if (in_flags & EF_ARM_APCS_FLOAT)
5103 (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"),
5107 (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"),
5110 flags_compatible = FALSE;
5113 if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
5115 if (in_flags & EF_ARM_VFP_FLOAT)
5117 (_("ERROR: %B uses VFP instructions, whereas %B does not"),
5121 (_("ERROR: %B uses FPA instructions, whereas %B does not"),
5124 flags_compatible = FALSE;
5127 if ((in_flags & EF_ARM_MAVERICK_FLOAT) != (out_flags & EF_ARM_MAVERICK_FLOAT))
5129 if (in_flags & EF_ARM_MAVERICK_FLOAT)
5131 (_("ERROR: %B uses Maverick instructions, whereas %B does not"),
5135 (_("ERROR: %B does not use Maverick instructions, whereas %B does"),
5138 flags_compatible = FALSE;
5141 #ifdef EF_ARM_SOFT_FLOAT
5142 if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
5144 /* We can allow interworking between code that is VFP format
5145 layout, and uses either soft float or integer regs for
5146 passing floating point arguments and results. We already
5147 know that the APCS_FLOAT flags match; similarly for VFP
5149 if ((in_flags & EF_ARM_APCS_FLOAT) != 0
5150 || (in_flags & EF_ARM_VFP_FLOAT) == 0)
5152 if (in_flags & EF_ARM_SOFT_FLOAT)
5154 (_("ERROR: %B uses software FP, whereas %B uses hardware FP"),
5158 (_("ERROR: %B uses hardware FP, whereas %B uses software FP"),
5161 flags_compatible = FALSE;
5166 /* Interworking mismatch is only a warning. */
5167 if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
5169 if (in_flags & EF_ARM_INTERWORK)
5172 (_("Warning: %B supports interworking, whereas %B does not"),
5178 (_("Warning: %B does not support interworking, whereas %B does"),
5184 return flags_compatible;
5187 /* Display the flags field. */
5190 elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
5192 FILE * file = (FILE *) ptr;
5193 unsigned long flags;
5195 BFD_ASSERT (abfd != NULL && ptr != NULL);
5197 /* Print normal ELF private data. */
5198 _bfd_elf_print_private_bfd_data (abfd, ptr);
5200 flags = elf_elfheader (abfd)->e_flags;
5201 /* Ignore init flag - it may not be set, despite the flags field
5202 containing valid data. */
5204 /* xgettext:c-format */
5205 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
5207 switch (EF_ARM_EABI_VERSION (flags))
5209 case EF_ARM_EABI_UNKNOWN:
5210 /* The following flag bits are GNU extensions and not part of the
5211 official ARM ELF extended ABI. Hence they are only decoded if
5212 the EABI version is not set. */
5213 if (flags & EF_ARM_INTERWORK)
5214 fprintf (file, _(" [interworking enabled]"));
5216 if (flags & EF_ARM_APCS_26)
5217 fprintf (file, " [APCS-26]");
5219 fprintf (file, " [APCS-32]");
5221 if (flags & EF_ARM_VFP_FLOAT)
5222 fprintf (file, _(" [VFP float format]"));
5223 else if (flags & EF_ARM_MAVERICK_FLOAT)
5224 fprintf (file, _(" [Maverick float format]"));
5226 fprintf (file, _(" [FPA float format]"));
5228 if (flags & EF_ARM_APCS_FLOAT)
5229 fprintf (file, _(" [floats passed in float registers]"));
5231 if (flags & EF_ARM_PIC)
5232 fprintf (file, _(" [position independent]"));
5234 if (flags & EF_ARM_NEW_ABI)
5235 fprintf (file, _(" [new ABI]"));
5237 if (flags & EF_ARM_OLD_ABI)
5238 fprintf (file, _(" [old ABI]"));
5240 if (flags & EF_ARM_SOFT_FLOAT)
5241 fprintf (file, _(" [software FP]"));
5243 flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
5244 | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
5245 | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT
5246 | EF_ARM_MAVERICK_FLOAT);
5249 case EF_ARM_EABI_VER1:
5250 fprintf (file, _(" [Version1 EABI]"));
5252 if (flags & EF_ARM_SYMSARESORTED)
5253 fprintf (file, _(" [sorted symbol table]"));
5255 fprintf (file, _(" [unsorted symbol table]"));
5257 flags &= ~ EF_ARM_SYMSARESORTED;
5260 case EF_ARM_EABI_VER2:
5261 fprintf (file, _(" [Version2 EABI]"));
5263 if (flags & EF_ARM_SYMSARESORTED)
5264 fprintf (file, _(" [sorted symbol table]"));
5266 fprintf (file, _(" [unsorted symbol table]"));
5268 if (flags & EF_ARM_DYNSYMSUSESEGIDX)
5269 fprintf (file, _(" [dynamic symbols use segment index]"));
5271 if (flags & EF_ARM_MAPSYMSFIRST)
5272 fprintf (file, _(" [mapping symbols precede others]"));
5274 flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
5275 | EF_ARM_MAPSYMSFIRST);
5278 case EF_ARM_EABI_VER3:
5279 fprintf (file, _(" [Version3 EABI]"));
5282 case EF_ARM_EABI_VER4:
5283 fprintf (file, _(" [Version4 EABI]"));
5285 if (flags & EF_ARM_BE8)
5286 fprintf (file, _(" [BE8]"));
5288 if (flags & EF_ARM_LE8)
5289 fprintf (file, _(" [LE8]"));
5291 flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
5295 fprintf (file, _(" <EABI version unrecognised>"));
5299 flags &= ~ EF_ARM_EABIMASK;
5301 if (flags & EF_ARM_RELEXEC)
5302 fprintf (file, _(" [relocatable executable]"));
5304 if (flags & EF_ARM_HASENTRY)
5305 fprintf (file, _(" [has entry point]"));
5307 flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
5310 fprintf (file, _("<Unrecognised flag bits set>"));
5318 elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
5320 switch (ELF_ST_TYPE (elf_sym->st_info))
5323 return ELF_ST_TYPE (elf_sym->st_info);
5326 /* If the symbol is not an object, return the STT_ARM_16BIT flag.
5327 This allows us to distinguish between data used by Thumb instructions
5328 and non-data (which is probably code) inside Thumb regions of an
5330 if (type != STT_OBJECT)
5331 return ELF_ST_TYPE (elf_sym->st_info);
5342 elf32_arm_gc_mark_hook (asection * sec,
5343 struct bfd_link_info * info ATTRIBUTE_UNUSED,
5344 Elf_Internal_Rela * rel,
5345 struct elf_link_hash_entry * h,
5346 Elf_Internal_Sym * sym)
5350 switch (ELF32_R_TYPE (rel->r_info))
5352 case R_ARM_GNU_VTINHERIT:
5353 case R_ARM_GNU_VTENTRY:
5357 switch (h->root.type)
5359 case bfd_link_hash_defined:
5360 case bfd_link_hash_defweak:
5361 return h->root.u.def.section;
5363 case bfd_link_hash_common:
5364 return h->root.u.c.p->section;
5372 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
5377 /* Update the got entry reference counts for the section being removed. */
5380 elf32_arm_gc_sweep_hook (bfd * abfd,
5381 struct bfd_link_info * info,
5383 const Elf_Internal_Rela * relocs)
5385 Elf_Internal_Shdr *symtab_hdr;
5386 struct elf_link_hash_entry **sym_hashes;
5387 bfd_signed_vma *local_got_refcounts;
5388 const Elf_Internal_Rela *rel, *relend;
5389 struct elf32_arm_link_hash_table * globals;
5391 globals = elf32_arm_hash_table (info);
5393 elf_section_data (sec)->local_dynrel = NULL;
5395 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5396 sym_hashes = elf_sym_hashes (abfd);
5397 local_got_refcounts = elf_local_got_refcounts (abfd);
5399 relend = relocs + sec->reloc_count;
5400 for (rel = relocs; rel < relend; rel++)
5402 unsigned long r_symndx;
5403 struct elf_link_hash_entry *h = NULL;
5406 r_symndx = ELF32_R_SYM (rel->r_info);
5407 if (r_symndx >= symtab_hdr->sh_info)
5409 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5410 while (h->root.type == bfd_link_hash_indirect
5411 || h->root.type == bfd_link_hash_warning)
5412 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5415 r_type = ELF32_R_TYPE (rel->r_info);
5416 r_type = arm_real_reloc_type (globals, r_type);
5420 case R_ARM_GOT_PREL:
5421 case R_ARM_TLS_GD32:
5422 case R_ARM_TLS_IE32:
5425 if (h->got.refcount > 0)
5426 h->got.refcount -= 1;
5428 else if (local_got_refcounts != NULL)
5430 if (local_got_refcounts[r_symndx] > 0)
5431 local_got_refcounts[r_symndx] -= 1;
5435 case R_ARM_TLS_LDM32:
5436 elf32_arm_hash_table (info)->tls_ldm_got.refcount -= 1;
5446 case R_ARM_THM_CALL:
5447 /* Should the interworking branches be here also? */
5451 struct elf32_arm_link_hash_entry *eh;
5452 struct elf32_arm_relocs_copied **pp;
5453 struct elf32_arm_relocs_copied *p;
5455 eh = (struct elf32_arm_link_hash_entry *) h;
5457 if (h->plt.refcount > 0)
5459 h->plt.refcount -= 1;
5460 if (ELF32_R_TYPE (rel->r_info) == R_ARM_THM_CALL)
5461 eh->plt_thumb_refcount--;
5464 if (r_type == R_ARM_ABS32
5465 || r_type == R_ARM_REL32)
5467 for (pp = &eh->relocs_copied; (p = *pp) != NULL;
5469 if (p->section == sec)
5472 if (ELF32_R_TYPE (rel->r_info) == R_ARM_REL32)
5490 /* Look through the relocs for a section during the first phase. */
5493 elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
5494 asection *sec, const Elf_Internal_Rela *relocs)
5496 Elf_Internal_Shdr *symtab_hdr;
5497 struct elf_link_hash_entry **sym_hashes;
5498 struct elf_link_hash_entry **sym_hashes_end;
5499 const Elf_Internal_Rela *rel;
5500 const Elf_Internal_Rela *rel_end;
5503 bfd_vma *local_got_offsets;
5504 struct elf32_arm_link_hash_table *htab;
5506 if (info->relocatable)
5509 htab = elf32_arm_hash_table (info);
5512 /* Create dynamic sections for relocatable executables so that we can
5513 copy relocations. */
5514 if (htab->root.is_relocatable_executable
5515 && ! htab->root.dynamic_sections_created)
5517 if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
5521 dynobj = elf_hash_table (info)->dynobj;
5522 local_got_offsets = elf_local_got_offsets (abfd);
5524 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5525 sym_hashes = elf_sym_hashes (abfd);
5526 sym_hashes_end = sym_hashes
5527 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
5529 if (!elf_bad_symtab (abfd))
5530 sym_hashes_end -= symtab_hdr->sh_info;
5532 rel_end = relocs + sec->reloc_count;
5533 for (rel = relocs; rel < rel_end; rel++)
5535 struct elf_link_hash_entry *h;
5536 struct elf32_arm_link_hash_entry *eh;
5537 unsigned long r_symndx;
5540 r_symndx = ELF32_R_SYM (rel->r_info);
5541 r_type = ELF32_R_TYPE (rel->r_info);
5542 r_type = arm_real_reloc_type (htab, r_type);
5544 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
5546 (*_bfd_error_handler) (_("%B: bad symbol index: %d"), abfd,
5551 if (r_symndx < symtab_hdr->sh_info)
5555 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5556 while (h->root.type == bfd_link_hash_indirect
5557 || h->root.type == bfd_link_hash_warning)
5558 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5561 eh = (struct elf32_arm_link_hash_entry *) h;
5566 case R_ARM_GOT_PREL:
5567 case R_ARM_TLS_GD32:
5568 case R_ARM_TLS_IE32:
5569 /* This symbol requires a global offset table entry. */
5571 int tls_type, old_tls_type;
5575 case R_ARM_TLS_GD32: tls_type = GOT_TLS_GD; break;
5576 case R_ARM_TLS_IE32: tls_type = GOT_TLS_IE; break;
5577 default: tls_type = GOT_NORMAL; break;
5583 old_tls_type = elf32_arm_hash_entry (h)->tls_type;
5587 bfd_signed_vma *local_got_refcounts;
5589 /* This is a global offset table entry for a local symbol. */
5590 local_got_refcounts = elf_local_got_refcounts (abfd);
5591 if (local_got_refcounts == NULL)
5595 size = symtab_hdr->sh_info;
5596 size *= (sizeof (bfd_signed_vma) + sizeof(char));
5597 local_got_refcounts = bfd_zalloc (abfd, size);
5598 if (local_got_refcounts == NULL)
5600 elf_local_got_refcounts (abfd) = local_got_refcounts;
5601 elf32_arm_local_got_tls_type (abfd)
5602 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
5604 local_got_refcounts[r_symndx] += 1;
5605 old_tls_type = elf32_arm_local_got_tls_type (abfd) [r_symndx];
5608 /* We will already have issued an error message if there is a
5609 TLS / non-TLS mismatch, based on the symbol type. We don't
5610 support any linker relaxations. So just combine any TLS
5612 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
5613 && tls_type != GOT_NORMAL)
5614 tls_type |= old_tls_type;
5616 if (old_tls_type != tls_type)
5619 elf32_arm_hash_entry (h)->tls_type = tls_type;
5621 elf32_arm_local_got_tls_type (abfd) [r_symndx] = tls_type;
5626 case R_ARM_TLS_LDM32:
5627 if (r_type == R_ARM_TLS_LDM32)
5628 htab->tls_ldm_got.refcount++;
5631 case R_ARM_GOTOFF32:
5633 if (htab->sgot == NULL)
5635 if (htab->root.dynobj == NULL)
5636 htab->root.dynobj = abfd;
5637 if (!create_got_section (htab->root.dynobj, info))
5649 case R_ARM_THM_CALL:
5650 /* Should the interworking branches be listed here? */
5653 /* If this reloc is in a read-only section, we might
5654 need a copy reloc. We can't check reliably at this
5655 stage whether the section is read-only, as input
5656 sections have not yet been mapped to output sections.
5657 Tentatively set the flag for now, and correct in
5658 adjust_dynamic_symbol. */
5662 /* We may need a .plt entry if the function this reloc
5663 refers to is in a different object. We can't tell for
5664 sure yet, because something later might force the
5666 if (r_type == R_ARM_PC24
5667 || r_type == R_ARM_CALL
5668 || r_type == R_ARM_JUMP24
5669 || r_type == R_ARM_PREL31
5670 || r_type == R_ARM_PLT32
5671 || r_type == R_ARM_THM_CALL)
5674 /* If we create a PLT entry, this relocation will reference
5675 it, even if it's an ABS32 relocation. */
5676 h->plt.refcount += 1;
5678 if (r_type == R_ARM_THM_CALL)
5679 eh->plt_thumb_refcount += 1;
5682 /* If we are creating a shared library or relocatable executable,
5683 and this is a reloc against a global symbol, or a non PC
5684 relative reloc against a local symbol, then we need to copy
5685 the reloc into the shared library. However, if we are linking
5686 with -Bsymbolic, we do not need to copy a reloc against a
5687 global symbol which is defined in an object we are
5688 including in the link (i.e., DEF_REGULAR is set). At
5689 this point we have not seen all the input files, so it is
5690 possible that DEF_REGULAR is not set now but will be set
5691 later (it is never cleared). We account for that
5692 possibility below by storing information in the
5693 relocs_copied field of the hash table entry. */
5694 if ((info->shared || htab->root.is_relocatable_executable)
5695 && (sec->flags & SEC_ALLOC) != 0
5696 && (r_type == R_ARM_ABS32
5697 || (h != NULL && ! h->needs_plt
5698 && (! info->symbolic || ! h->def_regular))))
5700 struct elf32_arm_relocs_copied *p, **head;
5702 /* When creating a shared object, we must copy these
5703 reloc types into the output file. We create a reloc
5704 section in dynobj and make room for this reloc. */
5709 name = (bfd_elf_string_from_elf_section
5711 elf_elfheader (abfd)->e_shstrndx,
5712 elf_section_data (sec)->rel_hdr.sh_name));
5716 BFD_ASSERT (strncmp (name, ".rel", 4) == 0
5717 && strcmp (bfd_get_section_name (abfd, sec),
5720 sreloc = bfd_get_section_by_name (dynobj, name);
5725 flags = (SEC_HAS_CONTENTS | SEC_READONLY
5726 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
5727 if ((sec->flags & SEC_ALLOC) != 0
5728 /* BPABI objects never have dynamic
5729 relocations mapped. */
5730 && !htab->symbian_p)
5731 flags |= SEC_ALLOC | SEC_LOAD;
5732 sreloc = bfd_make_section_with_flags (dynobj,
5736 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
5740 elf_section_data (sec)->sreloc = sreloc;
5743 /* If this is a global symbol, we count the number of
5744 relocations we need for this symbol. */
5747 head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied;
5751 /* Track dynamic relocs needed for local syms too.
5752 We really need local syms available to do this
5758 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
5763 vpp = &elf_section_data (s)->local_dynrel;
5764 head = (struct elf32_arm_relocs_copied **) vpp;
5768 if (p == NULL || p->section != sec)
5770 bfd_size_type amt = sizeof *p;
5772 p = bfd_alloc (htab->root.dynobj, amt);
5782 if (r_type == R_ARM_REL32)
5788 /* This relocation describes the C++ object vtable hierarchy.
5789 Reconstruct it for later use during GC. */
5790 case R_ARM_GNU_VTINHERIT:
5791 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5795 /* This relocation describes which C++ vtable entries are actually
5796 used. Record for later use during GC. */
5797 case R_ARM_GNU_VTENTRY:
5798 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
5807 /* Treat mapping symbols as special target symbols. */
5810 elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
5812 return bfd_is_arm_mapping_symbol_name (sym->name);
5815 /* This is a copy of elf_find_function() from elf.c except that
5816 ARM mapping symbols are ignored when looking for function names
5817 and STT_ARM_TFUNC is considered to a function type. */
5820 arm_elf_find_function (bfd * abfd ATTRIBUTE_UNUSED,
5824 const char ** filename_ptr,
5825 const char ** functionname_ptr)
5827 const char * filename = NULL;
5828 asymbol * func = NULL;
5829 bfd_vma low_func = 0;
5832 for (p = symbols; *p != NULL; p++)
5836 q = (elf_symbol_type *) *p;
5838 switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
5843 filename = bfd_asymbol_name (&q->symbol);
5848 /* Skip $a and $t symbols. */
5849 if ((q->symbol.flags & BSF_LOCAL)
5850 && bfd_is_arm_mapping_symbol_name (q->symbol.name))
5853 if (bfd_get_section (&q->symbol) == section
5854 && q->symbol.value >= low_func
5855 && q->symbol.value <= offset)
5857 func = (asymbol *) q;
5858 low_func = q->symbol.value;
5868 *filename_ptr = filename;
5869 if (functionname_ptr)
5870 *functionname_ptr = bfd_asymbol_name (func);
5876 /* Find the nearest line to a particular section and offset, for error
5877 reporting. This code is a duplicate of the code in elf.c, except
5878 that it uses arm_elf_find_function. */
5881 elf32_arm_find_nearest_line (bfd * abfd,
5885 const char ** filename_ptr,
5886 const char ** functionname_ptr,
5887 unsigned int * line_ptr)
5889 bfd_boolean found = FALSE;
5891 /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it. */
5893 if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
5894 filename_ptr, functionname_ptr,
5896 & elf_tdata (abfd)->dwarf2_find_line_info))
5898 if (!*functionname_ptr)
5899 arm_elf_find_function (abfd, section, symbols, offset,
5900 *filename_ptr ? NULL : filename_ptr,
5906 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
5907 & found, filename_ptr,
5908 functionname_ptr, line_ptr,
5909 & elf_tdata (abfd)->line_info))
5912 if (found && (*functionname_ptr || *line_ptr))
5915 if (symbols == NULL)
5918 if (! arm_elf_find_function (abfd, section, symbols, offset,
5919 filename_ptr, functionname_ptr))
5927 elf32_arm_find_inliner_info (bfd * abfd,
5928 const char ** filename_ptr,
5929 const char ** functionname_ptr,
5930 unsigned int * line_ptr)
5933 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
5934 functionname_ptr, line_ptr,
5935 & elf_tdata (abfd)->dwarf2_find_line_info);
5939 /* Adjust a symbol defined by a dynamic object and referenced by a
5940 regular object. The current definition is in some section of the
5941 dynamic object, but we're not including those sections. We have to
5942 change the definition to something the rest of the link can
5946 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
5947 struct elf_link_hash_entry * h)
5951 unsigned int power_of_two;
5952 struct elf32_arm_link_hash_entry * eh;
5953 struct elf32_arm_link_hash_table *globals;
5955 globals = elf32_arm_hash_table (info);
5956 dynobj = elf_hash_table (info)->dynobj;
5958 /* Make sure we know what is going on here. */
5959 BFD_ASSERT (dynobj != NULL
5961 || h->u.weakdef != NULL
5964 && !h->def_regular)));
5966 eh = (struct elf32_arm_link_hash_entry *) h;
5968 /* If this is a function, put it in the procedure linkage table. We
5969 will fill in the contents of the procedure linkage table later,
5970 when we know the address of the .got section. */
5971 if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC
5974 if (h->plt.refcount <= 0
5975 || SYMBOL_CALLS_LOCAL (info, h)
5976 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5977 && h->root.type == bfd_link_hash_undefweak))
5979 /* This case can occur if we saw a PLT32 reloc in an input
5980 file, but the symbol was never referred to by a dynamic
5981 object, or if all references were garbage collected. In
5982 such a case, we don't actually need to build a procedure
5983 linkage table, and we can just do a PC24 reloc instead. */
5984 h->plt.offset = (bfd_vma) -1;
5985 eh->plt_thumb_refcount = 0;
5993 /* It's possible that we incorrectly decided a .plt reloc was
5994 needed for an R_ARM_PC24 or similar reloc to a non-function sym
5995 in check_relocs. We can't decide accurately between function
5996 and non-function syms in check-relocs; Objects loaded later in
5997 the link may change h->type. So fix it now. */
5998 h->plt.offset = (bfd_vma) -1;
5999 eh->plt_thumb_refcount = 0;
6002 /* If this is a weak symbol, and there is a real definition, the
6003 processor independent code will have arranged for us to see the
6004 real definition first, and we can just use the same value. */
6005 if (h->u.weakdef != NULL)
6007 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
6008 || h->u.weakdef->root.type == bfd_link_hash_defweak);
6009 h->root.u.def.section = h->u.weakdef->root.u.def.section;
6010 h->root.u.def.value = h->u.weakdef->root.u.def.value;
6014 /* If there are no non-GOT references, we do not need a copy
6016 if (!h->non_got_ref)
6019 /* This is a reference to a symbol defined by a dynamic object which
6020 is not a function. */
6022 /* If we are creating a shared library, we must presume that the
6023 only references to the symbol are via the global offset table.
6024 For such cases we need not do anything here; the relocations will
6025 be handled correctly by relocate_section. Relocatable executables
6026 can reference data in shared objects directly, so we don't need to
6027 do anything here. */
6028 if (info->shared || globals->root.is_relocatable_executable)
6033 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
6034 h->root.root.string);
6038 /* We must allocate the symbol in our .dynbss section, which will
6039 become part of the .bss section of the executable. There will be
6040 an entry for this symbol in the .dynsym section. The dynamic
6041 object will contain position independent code, so all references
6042 from the dynamic object to this symbol will go through the global
6043 offset table. The dynamic linker will use the .dynsym entry to
6044 determine the address it must put in the global offset table, so
6045 both the dynamic object and the regular object will refer to the
6046 same memory location for the variable. */
6047 s = bfd_get_section_by_name (dynobj, ".dynbss");
6048 BFD_ASSERT (s != NULL);
6050 /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
6051 copy the initial value out of the dynamic object and into the
6052 runtime process image. We need to remember the offset into the
6053 .rel.bss section we are going to use. */
6054 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
6058 srel = bfd_get_section_by_name (dynobj, ".rel.bss");
6059 BFD_ASSERT (srel != NULL);
6060 srel->size += sizeof (Elf32_External_Rel);
6064 /* We need to figure out the alignment required for this symbol. I
6065 have no idea how ELF linkers handle this. */
6066 power_of_two = bfd_log2 (h->size);
6067 if (power_of_two > 3)
6070 /* Apply the required alignment. */
6071 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
6072 if (power_of_two > bfd_get_section_alignment (dynobj, s))
6074 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
6078 /* Define the symbol as being at this point in the section. */
6079 h->root.u.def.section = s;
6080 h->root.u.def.value = s->size;
6082 /* Increment the section size to make room for the symbol. */
6088 /* Allocate space in .plt, .got and associated reloc sections for
6092 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
6094 struct bfd_link_info *info;
6095 struct elf32_arm_link_hash_table *htab;
6096 struct elf32_arm_link_hash_entry *eh;
6097 struct elf32_arm_relocs_copied *p;
6099 eh = (struct elf32_arm_link_hash_entry *) h;
6101 if (h->root.type == bfd_link_hash_indirect)
6104 if (h->root.type == bfd_link_hash_warning)
6105 /* When warning symbols are created, they **replace** the "real"
6106 entry in the hash table, thus we never get to see the real
6107 symbol in a hash traversal. So look at it now. */
6108 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6110 info = (struct bfd_link_info *) inf;
6111 htab = elf32_arm_hash_table (info);
6113 if (htab->root.dynamic_sections_created
6114 && h->plt.refcount > 0)
6116 /* Make sure this symbol is output as a dynamic symbol.
6117 Undefined weak syms won't yet be marked as dynamic. */
6118 if (h->dynindx == -1
6119 && !h->forced_local)
6121 if (! bfd_elf_link_record_dynamic_symbol (info, h))
6126 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
6128 asection *s = htab->splt;
6130 /* If this is the first .plt entry, make room for the special
6133 s->size += htab->plt_header_size;
6135 h->plt.offset = s->size;
6137 /* If we will insert a Thumb trampoline before this PLT, leave room
6139 if (!htab->use_blx && eh->plt_thumb_refcount > 0)
6141 h->plt.offset += PLT_THUMB_STUB_SIZE;
6142 s->size += PLT_THUMB_STUB_SIZE;
6145 /* If this symbol is not defined in a regular file, and we are
6146 not generating a shared library, then set the symbol to this
6147 location in the .plt. This is required to make function
6148 pointers compare as equal between the normal executable and
6149 the shared library. */
6153 h->root.u.def.section = s;
6154 h->root.u.def.value = h->plt.offset;
6156 /* Make sure the function is not marked as Thumb, in case
6157 it is the target of an ABS32 relocation, which will
6158 point to the PLT entry. */
6159 if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
6160 h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
6163 /* Make room for this entry. */
6164 s->size += htab->plt_entry_size;
6166 if (!htab->symbian_p)
6168 /* We also need to make an entry in the .got.plt section, which
6169 will be placed in the .got section by the linker script. */
6170 eh->plt_got_offset = htab->sgotplt->size;
6171 htab->sgotplt->size += 4;
6174 /* We also need to make an entry in the .rel.plt section. */
6175 htab->srelplt->size += sizeof (Elf32_External_Rel);
6179 h->plt.offset = (bfd_vma) -1;
6185 h->plt.offset = (bfd_vma) -1;
6189 if (h->got.refcount > 0)
6193 int tls_type = elf32_arm_hash_entry (h)->tls_type;
6196 /* Make sure this symbol is output as a dynamic symbol.
6197 Undefined weak syms won't yet be marked as dynamic. */
6198 if (h->dynindx == -1
6199 && !h->forced_local)
6201 if (! bfd_elf_link_record_dynamic_symbol (info, h))
6205 if (!htab->symbian_p)
6208 h->got.offset = s->size;
6210 if (tls_type == GOT_UNKNOWN)
6213 if (tls_type == GOT_NORMAL)
6214 /* Non-TLS symbols need one GOT slot. */
6218 if (tls_type & GOT_TLS_GD)
6219 /* R_ARM_TLS_GD32 needs 2 consecutive GOT slots. */
6221 if (tls_type & GOT_TLS_IE)
6222 /* R_ARM_TLS_IE32 needs one GOT slot. */
6226 dyn = htab->root.dynamic_sections_created;
6229 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
6231 || !SYMBOL_REFERENCES_LOCAL (info, h)))
6234 if (tls_type != GOT_NORMAL
6235 && (info->shared || indx != 0)
6236 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6237 || h->root.type != bfd_link_hash_undefweak))
6239 if (tls_type & GOT_TLS_IE)
6240 htab->srelgot->size += sizeof (Elf32_External_Rel);
6242 if (tls_type & GOT_TLS_GD)
6243 htab->srelgot->size += sizeof (Elf32_External_Rel);
6245 if ((tls_type & GOT_TLS_GD) && indx != 0)
6246 htab->srelgot->size += sizeof (Elf32_External_Rel);
6248 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6249 || h->root.type != bfd_link_hash_undefweak)
6251 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
6252 htab->srelgot->size += sizeof (Elf32_External_Rel);
6256 h->got.offset = (bfd_vma) -1;
6258 if (eh->relocs_copied == NULL)
6261 /* In the shared -Bsymbolic case, discard space allocated for
6262 dynamic pc-relative relocs against symbols which turn out to be
6263 defined in regular objects. For the normal shared case, discard
6264 space for pc-relative relocs that have become local due to symbol
6265 visibility changes. */
6267 if (info->shared || htab->root.is_relocatable_executable)
6269 /* The only reloc that uses pc_count is R_ARM_REL32, which will
6270 appear on something like ".long foo - .". We want calls to
6271 protected symbols to resolve directly to the function rather
6272 than going via the plt. If people want function pointer
6273 comparisons to work as expected then they should avoid
6274 writing assembly like ".long foo - .". */
6275 if (SYMBOL_CALLS_LOCAL (info, h))
6277 struct elf32_arm_relocs_copied **pp;
6279 for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
6281 p->count -= p->pc_count;
6290 /* Also discard relocs on undefined weak syms with non-default
6292 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6293 && h->root.type == bfd_link_hash_undefweak)
6294 eh->relocs_copied = NULL;
6295 else if (htab->root.is_relocatable_executable && h->dynindx == -1
6296 && h->root.type == bfd_link_hash_new)
6298 /* Output absolute symbols so that we can create relocations
6299 against them. For normal symbols we output a relocation
6300 against the section that contains them. */
6301 if (! bfd_elf_link_record_dynamic_symbol (info, h))
6308 /* For the non-shared case, discard space for relocs against
6309 symbols which turn out to need copy relocs or are not
6315 || (htab->root.dynamic_sections_created
6316 && (h->root.type == bfd_link_hash_undefweak
6317 || h->root.type == bfd_link_hash_undefined))))
6319 /* Make sure this symbol is output as a dynamic symbol.
6320 Undefined weak syms won't yet be marked as dynamic. */
6321 if (h->dynindx == -1
6322 && !h->forced_local)
6324 if (! bfd_elf_link_record_dynamic_symbol (info, h))
6328 /* If that succeeded, we know we'll be keeping all the
6330 if (h->dynindx != -1)
6334 eh->relocs_copied = NULL;
6339 /* Finally, allocate space. */
6340 for (p = eh->relocs_copied; p != NULL; p = p->next)
6342 asection *sreloc = elf_section_data (p->section)->sreloc;
6343 sreloc->size += p->count * sizeof (Elf32_External_Rel);
6349 /* Find any dynamic relocs that apply to read-only sections. */
6352 elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
6354 struct elf32_arm_link_hash_entry *eh;
6355 struct elf32_arm_relocs_copied *p;
6357 if (h->root.type == bfd_link_hash_warning)
6358 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6360 eh = (struct elf32_arm_link_hash_entry *) h;
6361 for (p = eh->relocs_copied; p != NULL; p = p->next)
6363 asection *s = p->section;
6365 if (s != NULL && (s->flags & SEC_READONLY) != 0)
6367 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6369 info->flags |= DF_TEXTREL;
6371 /* Not an error, just cut short the traversal. */
6378 /* Set the sizes of the dynamic sections. */
6381 elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
6382 struct bfd_link_info * info)
6389 struct elf32_arm_link_hash_table *htab;
6391 htab = elf32_arm_hash_table (info);
6392 dynobj = elf_hash_table (info)->dynobj;
6393 BFD_ASSERT (dynobj != NULL);
6395 if (elf_hash_table (info)->dynamic_sections_created)
6397 /* Set the contents of the .interp section to the interpreter. */
6398 if (info->executable)
6400 s = bfd_get_section_by_name (dynobj, ".interp");
6401 BFD_ASSERT (s != NULL);
6402 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
6403 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
6407 /* Set up .got offsets for local syms, and space for local dynamic
6409 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6411 bfd_signed_vma *local_got;
6412 bfd_signed_vma *end_local_got;
6413 char *local_tls_type;
6414 bfd_size_type locsymcount;
6415 Elf_Internal_Shdr *symtab_hdr;
6418 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
6421 for (s = ibfd->sections; s != NULL; s = s->next)
6423 struct elf32_arm_relocs_copied *p;
6425 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
6427 if (!bfd_is_abs_section (p->section)
6428 && bfd_is_abs_section (p->section->output_section))
6430 /* Input section has been discarded, either because
6431 it is a copy of a linkonce section or due to
6432 linker script /DISCARD/, so we'll be discarding
6435 else if (p->count != 0)
6437 srel = elf_section_data (p->section)->sreloc;
6438 srel->size += p->count * sizeof (Elf32_External_Rel);
6439 if ((p->section->output_section->flags & SEC_READONLY) != 0)
6440 info->flags |= DF_TEXTREL;
6445 local_got = elf_local_got_refcounts (ibfd);
6449 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
6450 locsymcount = symtab_hdr->sh_info;
6451 end_local_got = local_got + locsymcount;
6452 local_tls_type = elf32_arm_local_got_tls_type (ibfd);
6454 srel = htab->srelgot;
6455 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
6459 *local_got = s->size;
6460 if (*local_tls_type & GOT_TLS_GD)
6461 /* TLS_GD relocs need an 8-byte structure in the GOT. */
6463 if (*local_tls_type & GOT_TLS_IE)
6465 if (*local_tls_type == GOT_NORMAL)
6468 if (info->shared || *local_tls_type == GOT_TLS_GD)
6469 srel->size += sizeof (Elf32_External_Rel);
6472 *local_got = (bfd_vma) -1;
6476 if (htab->tls_ldm_got.refcount > 0)
6478 /* Allocate two GOT entries and one dynamic relocation (if necessary)
6479 for R_ARM_TLS_LDM32 relocations. */
6480 htab->tls_ldm_got.offset = htab->sgot->size;
6481 htab->sgot->size += 8;
6483 htab->srelgot->size += sizeof (Elf32_External_Rel);
6486 htab->tls_ldm_got.offset = -1;
6488 /* Allocate global sym .plt and .got entries, and space for global
6489 sym dynamic relocs. */
6490 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
6492 /* The check_relocs and adjust_dynamic_symbol entry points have
6493 determined the sizes of the various dynamic sections. Allocate
6497 for (s = dynobj->sections; s != NULL; s = s->next)
6501 if ((s->flags & SEC_LINKER_CREATED) == 0)
6504 /* It's OK to base decisions on the section name, because none
6505 of the dynobj section names depend upon the input files. */
6506 name = bfd_get_section_name (dynobj, s);
6508 if (strcmp (name, ".plt") == 0)
6510 /* Remember whether there is a PLT. */
6513 else if (strncmp (name, ".rel", 4) == 0)
6517 /* Remember whether there are any reloc sections other
6519 if (strcmp (name, ".rel.plt") != 0)
6522 /* We use the reloc_count field as a counter if we need
6523 to copy relocs into the output file. */
6527 else if (strncmp (name, ".got", 4) != 0
6528 && strcmp (name, ".dynbss") != 0)
6530 /* It's not one of our sections, so don't allocate space. */
6536 /* If we don't need this section, strip it from the
6537 output file. This is mostly to handle .rel.bss and
6538 .rel.plt. We must create both sections in
6539 create_dynamic_sections, because they must be created
6540 before the linker maps input sections to output
6541 sections. The linker does that before
6542 adjust_dynamic_symbol is called, and it is that
6543 function which decides whether anything needs to go
6544 into these sections. */
6545 s->flags |= SEC_EXCLUDE;
6549 if ((s->flags & SEC_HAS_CONTENTS) == 0)
6552 /* Allocate memory for the section contents. */
6553 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
6554 if (s->contents == NULL)
6558 if (elf_hash_table (info)->dynamic_sections_created)
6560 /* Add some entries to the .dynamic section. We fill in the
6561 values later, in elf32_arm_finish_dynamic_sections, but we
6562 must add the entries now so that we get the correct size for
6563 the .dynamic section. The DT_DEBUG entry is filled in by the
6564 dynamic linker and used by the debugger. */
6565 #define add_dynamic_entry(TAG, VAL) \
6566 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
6568 if (info->executable)
6570 if (!add_dynamic_entry (DT_DEBUG, 0))
6576 if ( !add_dynamic_entry (DT_PLTGOT, 0)
6577 || !add_dynamic_entry (DT_PLTRELSZ, 0)
6578 || !add_dynamic_entry (DT_PLTREL, DT_REL)
6579 || !add_dynamic_entry (DT_JMPREL, 0))
6585 if ( !add_dynamic_entry (DT_REL, 0)
6586 || !add_dynamic_entry (DT_RELSZ, 0)
6587 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
6591 /* If any dynamic relocs apply to a read-only section,
6592 then we need a DT_TEXTREL entry. */
6593 if ((info->flags & DF_TEXTREL) == 0)
6594 elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs,
6597 if ((info->flags & DF_TEXTREL) != 0)
6599 if (!add_dynamic_entry (DT_TEXTREL, 0))
6603 #undef add_dynamic_entry
6608 /* Finish up dynamic symbol handling. We set the contents of various
6609 dynamic sections here. */
6612 elf32_arm_finish_dynamic_symbol (bfd * output_bfd, struct bfd_link_info * info,
6613 struct elf_link_hash_entry * h, Elf_Internal_Sym * sym)
6616 struct elf32_arm_link_hash_table *htab;
6617 struct elf32_arm_link_hash_entry *eh;
6619 dynobj = elf_hash_table (info)->dynobj;
6620 htab = elf32_arm_hash_table (info);
6621 eh = (struct elf32_arm_link_hash_entry *) h;
6623 if (h->plt.offset != (bfd_vma) -1)
6629 Elf_Internal_Rela rel;
6631 /* This symbol has an entry in the procedure linkage table. Set
6634 BFD_ASSERT (h->dynindx != -1);
6636 splt = bfd_get_section_by_name (dynobj, ".plt");
6637 srel = bfd_get_section_by_name (dynobj, ".rel.plt");
6638 BFD_ASSERT (splt != NULL && srel != NULL);
6640 /* Fill in the entry in the procedure linkage table. */
6641 if (htab->symbian_p)
6644 for (i = 0; i < htab->plt_entry_size / 4; ++i)
6645 bfd_put_32 (output_bfd,
6646 elf32_arm_symbian_plt_entry[i],
6647 splt->contents + h->plt.offset + 4 * i);
6649 /* Fill in the entry in the .rel.plt section. */
6650 rel.r_offset = (splt->output_section->vma
6651 + splt->output_offset
6652 + h->plt.offset + 4 * (i - 1));
6653 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
6655 /* Get the index in the procedure linkage table which
6656 corresponds to this symbol. This is the index of this symbol
6657 in all the symbols for which we are making plt entries. The
6658 first entry in the procedure linkage table is reserved. */
6659 plt_index = ((h->plt.offset - htab->plt_header_size)
6660 / htab->plt_entry_size);
6665 bfd_vma got_displacement;
6668 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
6669 BFD_ASSERT (sgot != NULL);
6671 /* Get the offset into the .got.plt table of the entry that
6672 corresponds to this function. */
6673 got_offset = eh->plt_got_offset;
6675 /* Get the index in the procedure linkage table which
6676 corresponds to this symbol. This is the index of this symbol
6677 in all the symbols for which we are making plt entries. The
6678 first three entries in .got.plt are reserved; after that
6679 symbols appear in the same order as in .plt. */
6680 plt_index = (got_offset - 12) / 4;
6682 /* Calculate the displacement between the PLT slot and the
6683 entry in the GOT. The eight-byte offset accounts for the
6684 value produced by adding to pc in the first instruction
6686 got_displacement = (sgot->output_section->vma
6687 + sgot->output_offset
6689 - splt->output_section->vma
6690 - splt->output_offset
6694 BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
6696 if (!htab->use_blx && eh->plt_thumb_refcount > 0)
6698 bfd_put_16 (output_bfd, elf32_arm_plt_thumb_stub[0],
6699 splt->contents + h->plt.offset - 4);
6700 bfd_put_16 (output_bfd, elf32_arm_plt_thumb_stub[1],
6701 splt->contents + h->plt.offset - 2);
6704 bfd_put_32 (output_bfd, elf32_arm_plt_entry[0] | ((got_displacement & 0x0ff00000) >> 20),
6705 splt->contents + h->plt.offset + 0);
6706 bfd_put_32 (output_bfd, elf32_arm_plt_entry[1] | ((got_displacement & 0x000ff000) >> 12),
6707 splt->contents + h->plt.offset + 4);
6708 bfd_put_32 (output_bfd, elf32_arm_plt_entry[2] | (got_displacement & 0x00000fff),
6709 splt->contents + h->plt.offset + 8);
6710 #ifdef FOUR_WORD_PLT
6711 bfd_put_32 (output_bfd, elf32_arm_plt_entry[3],
6712 splt->contents + h->plt.offset + 12);
6715 /* Fill in the entry in the global offset table. */
6716 bfd_put_32 (output_bfd,
6717 (splt->output_section->vma
6718 + splt->output_offset),
6719 sgot->contents + got_offset);
6721 /* Fill in the entry in the .rel.plt section. */
6722 rel.r_offset = (sgot->output_section->vma
6723 + sgot->output_offset
6725 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_JUMP_SLOT);
6728 loc = srel->contents + plt_index * sizeof (Elf32_External_Rel);
6729 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
6731 if (!h->def_regular)
6733 /* Mark the symbol as undefined, rather than as defined in
6734 the .plt section. Leave the value alone. */
6735 sym->st_shndx = SHN_UNDEF;
6736 /* If the symbol is weak, we do need to clear the value.
6737 Otherwise, the PLT entry would provide a definition for
6738 the symbol even if the symbol wasn't defined anywhere,
6739 and so the symbol would never be NULL. */
6740 if (!h->ref_regular_nonweak)
6745 if (h->got.offset != (bfd_vma) -1
6746 && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
6747 && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
6751 Elf_Internal_Rela rel;
6754 /* This symbol has an entry in the global offset table. Set it
6756 sgot = bfd_get_section_by_name (dynobj, ".got");
6757 srel = bfd_get_section_by_name (dynobj, ".rel.got");
6758 BFD_ASSERT (sgot != NULL && srel != NULL);
6760 rel.r_offset = (sgot->output_section->vma
6761 + sgot->output_offset
6762 + (h->got.offset &~ (bfd_vma) 1));
6764 /* If this is a static link, or it is a -Bsymbolic link and the
6765 symbol is defined locally or was forced to be local because
6766 of a version file, we just want to emit a RELATIVE reloc.
6767 The entry in the global offset table will already have been
6768 initialized in the relocate_section function. */
6770 && SYMBOL_REFERENCES_LOCAL (info, h))
6772 BFD_ASSERT((h->got.offset & 1) != 0);
6773 rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
6777 BFD_ASSERT((h->got.offset & 1) == 0);
6778 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
6779 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
6782 loc = srel->contents + srel->reloc_count++ * sizeof (Elf32_External_Rel);
6783 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
6789 Elf_Internal_Rela rel;
6792 /* This symbol needs a copy reloc. Set it up. */
6793 BFD_ASSERT (h->dynindx != -1
6794 && (h->root.type == bfd_link_hash_defined
6795 || h->root.type == bfd_link_hash_defweak));
6797 s = bfd_get_section_by_name (h->root.u.def.section->owner,
6799 BFD_ASSERT (s != NULL);
6801 rel.r_offset = (h->root.u.def.value
6802 + h->root.u.def.section->output_section->vma
6803 + h->root.u.def.section->output_offset);
6804 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
6805 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rel);
6806 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
6809 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
6810 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
6811 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
6812 sym->st_shndx = SHN_ABS;
6817 /* Finish up the dynamic sections. */
6820 elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
6826 dynobj = elf_hash_table (info)->dynobj;
6828 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
6829 BFD_ASSERT (elf32_arm_hash_table (info)->symbian_p || sgot != NULL);
6830 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
6832 if (elf_hash_table (info)->dynamic_sections_created)
6835 Elf32_External_Dyn *dyncon, *dynconend;
6836 struct elf32_arm_link_hash_table *htab;
6838 htab = elf32_arm_hash_table (info);
6839 splt = bfd_get_section_by_name (dynobj, ".plt");
6840 BFD_ASSERT (splt != NULL && sdyn != NULL);
6842 dyncon = (Elf32_External_Dyn *) sdyn->contents;
6843 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
6845 for (; dyncon < dynconend; dyncon++)
6847 Elf_Internal_Dyn dyn;
6851 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
6862 goto get_vma_if_bpabi;
6865 goto get_vma_if_bpabi;
6868 goto get_vma_if_bpabi;
6870 name = ".gnu.version";
6871 goto get_vma_if_bpabi;
6873 name = ".gnu.version_d";
6874 goto get_vma_if_bpabi;
6876 name = ".gnu.version_r";
6877 goto get_vma_if_bpabi;
6885 s = bfd_get_section_by_name (output_bfd, name);
6886 BFD_ASSERT (s != NULL);
6887 if (!htab->symbian_p)
6888 dyn.d_un.d_ptr = s->vma;
6890 /* In the BPABI, tags in the PT_DYNAMIC section point
6891 at the file offset, not the memory address, for the
6892 convenience of the post linker. */
6893 dyn.d_un.d_ptr = s->filepos;
6894 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6898 if (htab->symbian_p)
6903 s = bfd_get_section_by_name (output_bfd, ".rel.plt");
6904 BFD_ASSERT (s != NULL);
6905 dyn.d_un.d_val = s->size;
6906 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6910 if (!htab->symbian_p)
6912 /* My reading of the SVR4 ABI indicates that the
6913 procedure linkage table relocs (DT_JMPREL) should be
6914 included in the overall relocs (DT_REL). This is
6915 what Solaris does. However, UnixWare can not handle
6916 that case. Therefore, we override the DT_RELSZ entry
6917 here to make it not include the JMPREL relocs. Since
6918 the linker script arranges for .rel.plt to follow all
6919 other relocation sections, we don't have to worry
6920 about changing the DT_REL entry. */
6921 s = bfd_get_section_by_name (output_bfd, ".rel.plt");
6923 dyn.d_un.d_val -= s->size;
6924 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6932 /* In the BPABI, the DT_REL tag must point at the file
6933 offset, not the VMA, of the first relocation
6934 section. So, we use code similar to that in
6935 elflink.c, but do not check for SHF_ALLOC on the
6936 relcoation section, since relocations sections are
6937 never allocated under the BPABI. The comments above
6938 about Unixware notwithstanding, we include all of the
6939 relocations here. */
6940 if (htab->symbian_p)
6943 type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
6944 ? SHT_REL : SHT_RELA);
6946 for (i = 1; i < elf_numsections (output_bfd); i++)
6948 Elf_Internal_Shdr *hdr
6949 = elf_elfsections (output_bfd)[i];
6950 if (hdr->sh_type == type)
6952 if (dyn.d_tag == DT_RELSZ
6953 || dyn.d_tag == DT_RELASZ)
6954 dyn.d_un.d_val += hdr->sh_size;
6955 else if ((ufile_ptr) hdr->sh_offset
6956 <= dyn.d_un.d_val - 1)
6957 dyn.d_un.d_val = hdr->sh_offset;
6960 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6964 /* Set the bottom bit of DT_INIT/FINI if the
6965 corresponding function is Thumb. */
6967 name = info->init_function;
6970 name = info->fini_function;
6972 /* If it wasn't set by elf_bfd_final_link
6973 then there is nothing to adjust. */
6974 if (dyn.d_un.d_val != 0)
6976 struct elf_link_hash_entry * eh;
6978 eh = elf_link_hash_lookup (elf_hash_table (info), name,
6979 FALSE, FALSE, TRUE);
6980 if (eh != (struct elf_link_hash_entry *) NULL
6981 && ELF_ST_TYPE (eh->type) == STT_ARM_TFUNC)
6983 dyn.d_un.d_val |= 1;
6984 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6991 /* Fill in the first entry in the procedure linkage table. */
6992 if (splt->size > 0 && elf32_arm_hash_table (info)->plt_header_size)
6994 bfd_vma got_displacement;
6996 /* Calculate the displacement between the PLT slot and &GOT[0]. */
6997 got_displacement = (sgot->output_section->vma
6998 + sgot->output_offset
6999 - splt->output_section->vma
7000 - splt->output_offset
7003 bfd_put_32 (output_bfd, elf32_arm_plt0_entry[0], splt->contents + 0);
7004 bfd_put_32 (output_bfd, elf32_arm_plt0_entry[1], splt->contents + 4);
7005 bfd_put_32 (output_bfd, elf32_arm_plt0_entry[2], splt->contents + 8);
7006 bfd_put_32 (output_bfd, elf32_arm_plt0_entry[3], splt->contents + 12);
7007 #ifdef FOUR_WORD_PLT
7008 /* The displacement value goes in the otherwise-unused last word of
7009 the second entry. */
7010 bfd_put_32 (output_bfd, got_displacement, splt->contents + 28);
7012 bfd_put_32 (output_bfd, got_displacement, splt->contents + 16);
7016 /* UnixWare sets the entsize of .plt to 4, although that doesn't
7017 really seem like the right value. */
7018 elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
7021 /* Fill in the first three entries in the global offset table. */
7027 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
7029 bfd_put_32 (output_bfd,
7030 sdyn->output_section->vma + sdyn->output_offset,
7032 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
7033 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
7036 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
7043 elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
7045 Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
7046 struct elf32_arm_link_hash_table *globals;
7048 i_ehdrp = elf_elfheader (abfd);
7050 if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
7051 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
7053 i_ehdrp->e_ident[EI_OSABI] = 0;
7054 i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
7058 globals = elf32_arm_hash_table (link_info);
7059 if (globals->byteswap_code)
7060 i_ehdrp->e_flags |= EF_ARM_BE8;
7064 static enum elf_reloc_type_class
7065 elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
7067 switch ((int) ELF32_R_TYPE (rela->r_info))
7069 case R_ARM_RELATIVE:
7070 return reloc_class_relative;
7071 case R_ARM_JUMP_SLOT:
7072 return reloc_class_plt;
7074 return reloc_class_copy;
7076 return reloc_class_normal;
7080 /* Set the right machine number for an Arm ELF file. */
7083 elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
7085 if (hdr->sh_type == SHT_NOTE)
7086 *flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_CONTENTS;
7092 elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
7094 bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
7097 /* Return TRUE if this is an unwinding table entry. */
7100 is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
7104 len1 = sizeof (ELF_STRING_ARM_unwind) - 1;
7105 len2 = sizeof (ELF_STRING_ARM_unwind_once) - 1;
7106 return (strncmp (name, ELF_STRING_ARM_unwind, len1) == 0
7107 || strncmp (name, ELF_STRING_ARM_unwind_once, len2) == 0);
7111 /* Set the type and flags for an ARM section. We do this by
7112 the section name, which is a hack, but ought to work. */
7115 elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
7119 name = bfd_get_section_name (abfd, sec);
7121 if (is_arm_elf_unwind_section_name (abfd, name))
7123 hdr->sh_type = SHT_ARM_EXIDX;
7124 hdr->sh_flags |= SHF_LINK_ORDER;
7126 else if (strcmp(name, ".ARM.attributes") == 0)
7128 hdr->sh_type = SHT_ARM_ATTRIBUTES;
7133 /* Parse an Arm EABI attributes section. */
7135 elf32_arm_parse_attributes (bfd *abfd, Elf_Internal_Shdr * hdr)
7141 contents = bfd_malloc (hdr->sh_size);
7144 if (!bfd_get_section_contents (abfd, hdr->bfd_section, contents, 0,
7153 len = hdr->sh_size - 1;
7157 bfd_vma section_len;
7159 section_len = bfd_get_32 (abfd, p);
7161 if (section_len > len)
7164 namelen = strlen ((char *)p) + 1;
7165 section_len -= namelen + 4;
7166 if (strcmp((char *)p, "aeabi") != 0)
7168 /* Vendor section. Ignore it. */
7169 p += namelen + section_len;
7174 while (section_len > 0)
7179 bfd_vma subsection_len;
7182 tag = read_unsigned_leb128 (abfd, p, &n);
7184 subsection_len = bfd_get_32 (abfd, p);
7186 if (subsection_len > section_len)
7187 subsection_len = section_len;
7188 section_len -= subsection_len;
7189 subsection_len -= n + 4;
7190 end = p + subsection_len;
7196 bfd_boolean is_string;
7198 tag = read_unsigned_leb128 (abfd, p, &n);
7200 if (tag == 4 || tag == 5)
7205 is_string = (tag & 1) != 0;
7206 if (tag == Tag_compatibility)
7208 val = read_unsigned_leb128 (abfd, p, &n);
7210 elf32_arm_add_eabi_attr_compat (abfd, val,
7212 p += strlen ((char *)p) + 1;
7216 elf32_arm_add_eabi_attr_string (abfd, tag,
7218 p += strlen ((char *)p) + 1;
7222 val = read_unsigned_leb128 (abfd, p, &n);
7224 elf32_arm_add_eabi_attr_int (abfd, tag, val);
7230 /* Don't have anywhere convenient to attach these.
7231 Fall through for now. */
7233 /* Ignore things we don't kow about. */
7234 p += subsection_len;
7245 /* Handle an ARM specific section when reading an object file. This is
7246 called when bfd_section_from_shdr finds a section with an unknown
7250 elf32_arm_section_from_shdr (bfd *abfd,
7251 Elf_Internal_Shdr * hdr,
7255 /* There ought to be a place to keep ELF backend specific flags, but
7256 at the moment there isn't one. We just keep track of the
7257 sections by their name, instead. Fortunately, the ABI gives
7258 names for all the ARM specific sections, so we will probably get
7260 switch (hdr->sh_type)
7263 case SHT_ARM_PREEMPTMAP:
7264 case SHT_ARM_ATTRIBUTES:
7271 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
7274 if (hdr->sh_type == SHT_ARM_ATTRIBUTES)
7275 elf32_arm_parse_attributes(abfd, hdr);
7279 /* A structure used to record a list of sections, independently
7280 of the next and prev fields in the asection structure. */
7281 typedef struct section_list
7284 struct section_list * next;
7285 struct section_list * prev;
7289 /* Unfortunately we need to keep a list of sections for which
7290 an _arm_elf_section_data structure has been allocated. This
7291 is because it is possible for functions like elf32_arm_write_section
7292 to be called on a section which has had an elf_data_structure
7293 allocated for it (and so the used_by_bfd field is valid) but
7294 for which the ARM extended version of this structure - the
7295 _arm_elf_section_data structure - has not been allocated. */
7296 static section_list * sections_with_arm_elf_section_data = NULL;
7299 record_section_with_arm_elf_section_data (asection * sec)
7301 struct section_list * entry;
7303 entry = bfd_malloc (sizeof (* entry));
7307 entry->next = sections_with_arm_elf_section_data;
7309 if (entry->next != NULL)
7310 entry->next->prev = entry;
7311 sections_with_arm_elf_section_data = entry;
7314 static _arm_elf_section_data *
7315 get_arm_elf_section_data (asection * sec)
7317 struct section_list * entry;
7318 static struct section_list * last_entry = NULL;
7320 /* This is a short cut for the typical case where the sections are added
7321 to the sections_with_arm_elf_section_data list in forward order and
7322 then looked up here in backwards order. This makes a real difference
7323 to the ld-srec/sec64k.exp linker test. */
7324 if (last_entry != NULL)
7326 if (last_entry->sec == sec)
7327 return elf32_arm_section_data (sec);
7329 if (last_entry->prev != NULL
7330 && last_entry->prev->sec == sec)
7332 last_entry = last_entry->prev;
7333 return elf32_arm_section_data (sec);
7337 for (entry = sections_with_arm_elf_section_data; entry; entry = entry->next)
7338 if (entry->sec == sec)
7341 return elf32_arm_section_data (sec);
7348 unrecord_section_with_arm_elf_section_data (asection * sec)
7350 struct section_list * entry;
7352 for (entry = sections_with_arm_elf_section_data; entry; entry = entry->next)
7353 if (entry->sec == sec)
7355 if (entry->prev != NULL)
7356 entry->prev->next = entry->next;
7357 if (entry->next != NULL)
7358 entry->next->prev = entry->prev;
7359 if (entry == sections_with_arm_elf_section_data)
7360 sections_with_arm_elf_section_data = entry->next;
7366 /* Called for each symbol. Builds a section map based on mapping symbols.
7367 Does not alter any of the symbols. */
7370 elf32_arm_output_symbol_hook (struct bfd_link_info *info,
7372 Elf_Internal_Sym *elfsym,
7373 asection *input_sec,
7374 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
7377 elf32_arm_section_map *map;
7378 elf32_arm_section_map *newmap;
7379 _arm_elf_section_data *arm_data;
7380 struct elf32_arm_link_hash_table *globals;
7382 /* Only do this on final link. */
7383 if (info->relocatable)
7386 /* Only build a map if we need to byteswap code. */
7387 globals = elf32_arm_hash_table (info);
7388 if (!globals->byteswap_code)
7391 /* We only want mapping symbols. */
7392 if (! bfd_is_arm_mapping_symbol_name (name))
7395 /* If this section has not been allocated an _arm_elf_section_data
7396 structure then we cannot record anything. */
7397 arm_data = get_arm_elf_section_data (input_sec);
7398 if (arm_data == NULL)
7401 mapcount = arm_data->mapcount + 1;
7402 map = arm_data->map;
7403 /* TODO: This may be inefficient, but we probably don't usually have many
7404 mapping symbols per section. */
7405 newmap = bfd_realloc (map, mapcount * sizeof (* map));
7408 arm_data->map = newmap;
7409 arm_data->mapcount = mapcount;
7411 map[mapcount - 1].vma = elfsym->st_value;
7412 map[mapcount - 1].type = name[1];
7418 /* Allocate target specific section data. */
7421 elf32_arm_new_section_hook (bfd *abfd, asection *sec)
7423 _arm_elf_section_data *sdata;
7424 bfd_size_type amt = sizeof (*sdata);
7426 sdata = bfd_zalloc (abfd, amt);
7429 sec->used_by_bfd = sdata;
7431 record_section_with_arm_elf_section_data (sec);
7433 return _bfd_elf_new_section_hook (abfd, sec);
7437 /* Used to order a list of mapping symbols by address. */
7440 elf32_arm_compare_mapping (const void * a, const void * b)
7442 return ((const elf32_arm_section_map *) a)->vma
7443 > ((const elf32_arm_section_map *) b)->vma;
7447 /* Do code byteswapping. Return FALSE afterwards so that the section is
7448 written out as normal. */
7451 elf32_arm_write_section (bfd *output_bfd ATTRIBUTE_UNUSED, asection *sec,
7455 _arm_elf_section_data *arm_data;
7456 elf32_arm_section_map *map;
7463 /* If this section has not been allocated an _arm_elf_section_data
7464 structure then we cannot record anything. */
7465 arm_data = get_arm_elf_section_data (sec);
7466 if (arm_data == NULL)
7469 mapcount = arm_data->mapcount;
7470 map = arm_data->map;
7475 qsort (map, mapcount, sizeof (* map), elf32_arm_compare_mapping);
7477 offset = sec->output_section->vma + sec->output_offset;
7478 ptr = map[0].vma - offset;
7479 for (i = 0; i < mapcount; i++)
7481 if (i == mapcount - 1)
7484 end = map[i + 1].vma - offset;
7486 switch (map[i].type)
7489 /* Byte swap code words. */
7490 while (ptr + 3 < end)
7492 tmp = contents[ptr];
7493 contents[ptr] = contents[ptr + 3];
7494 contents[ptr + 3] = tmp;
7495 tmp = contents[ptr + 1];
7496 contents[ptr + 1] = contents[ptr + 2];
7497 contents[ptr + 2] = tmp;
7503 /* Byte swap code halfwords. */
7504 while (ptr + 1 < end)
7506 tmp = contents[ptr];
7507 contents[ptr] = contents[ptr + 1];
7508 contents[ptr + 1] = tmp;
7514 /* Leave data alone. */
7521 arm_data->mapcount = 0;
7522 arm_data->map = NULL;
7523 unrecord_section_with_arm_elf_section_data (sec);
7529 unrecord_section_via_map_over_sections (bfd * abfd ATTRIBUTE_UNUSED,
7531 void * ignore ATTRIBUTE_UNUSED)
7533 unrecord_section_with_arm_elf_section_data (sec);
7537 elf32_arm_close_and_cleanup (bfd * abfd)
7539 bfd_map_over_sections (abfd, unrecord_section_via_map_over_sections, NULL);
7541 return _bfd_elf_close_and_cleanup (abfd);
7544 /* Display STT_ARM_TFUNC symbols as functions. */
7547 elf32_arm_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
7550 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
7552 if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_ARM_TFUNC)
7553 elfsym->symbol.flags |= BSF_FUNCTION;
7557 /* Mangle thumb function symbols as we read them in. */
7560 elf32_arm_swap_symbol_in (bfd * abfd,
7563 Elf_Internal_Sym *dst)
7565 bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst);
7567 /* New EABI objects mark thumb function symbols by setting the low bit of
7568 the address. Turn these into STT_ARM_TFUNC. */
7569 if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
7570 && (dst->st_value & 1))
7572 dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC);
7573 dst->st_value &= ~(bfd_vma) 1;
7578 /* Mangle thumb function symbols as we write them out. */
7581 elf32_arm_swap_symbol_out (bfd *abfd,
7582 const Elf_Internal_Sym *src,
7586 Elf_Internal_Sym newsym;
7588 /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
7589 of the address set, as per the new EABI. We do this unconditionally
7590 because objcopy does not set the elf header flags until after
7591 it writes out the symbol table. */
7592 if (ELF_ST_TYPE (src->st_info) == STT_ARM_TFUNC)
7595 newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
7596 newsym.st_value |= 1;
7600 bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
7603 /* Add the PT_ARM_EXIDX program header. */
7606 elf32_arm_modify_segment_map (bfd *abfd,
7607 struct bfd_link_info *info ATTRIBUTE_UNUSED)
7609 struct elf_segment_map *m;
7612 sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
7613 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
7615 /* If there is already a PT_ARM_EXIDX header, then we do not
7616 want to add another one. This situation arises when running
7617 "strip"; the input binary already has the header. */
7618 m = elf_tdata (abfd)->segment_map;
7619 while (m && m->p_type != PT_ARM_EXIDX)
7623 m = bfd_zalloc (abfd, sizeof (struct elf_segment_map));
7626 m->p_type = PT_ARM_EXIDX;
7628 m->sections[0] = sec;
7630 m->next = elf_tdata (abfd)->segment_map;
7631 elf_tdata (abfd)->segment_map = m;
7638 /* We may add a PT_ARM_EXIDX program header. */
7641 elf32_arm_additional_program_headers (bfd *abfd)
7645 sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
7646 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
7652 /* We use this to override swap_symbol_in and swap_symbol_out. */
7653 const struct elf_size_info elf32_arm_size_info = {
7654 sizeof (Elf32_External_Ehdr),
7655 sizeof (Elf32_External_Phdr),
7656 sizeof (Elf32_External_Shdr),
7657 sizeof (Elf32_External_Rel),
7658 sizeof (Elf32_External_Rela),
7659 sizeof (Elf32_External_Sym),
7660 sizeof (Elf32_External_Dyn),
7661 sizeof (Elf_External_Note),
7665 ELFCLASS32, EV_CURRENT,
7666 bfd_elf32_write_out_phdrs,
7667 bfd_elf32_write_shdrs_and_ehdr,
7668 bfd_elf32_write_relocs,
7669 elf32_arm_swap_symbol_in,
7670 elf32_arm_swap_symbol_out,
7671 bfd_elf32_slurp_reloc_table,
7672 bfd_elf32_slurp_symbol_table,
7673 bfd_elf32_swap_dyn_in,
7674 bfd_elf32_swap_dyn_out,
7675 bfd_elf32_swap_reloc_in,
7676 bfd_elf32_swap_reloc_out,
7677 bfd_elf32_swap_reloca_in,
7678 bfd_elf32_swap_reloca_out
7681 #define ELF_ARCH bfd_arch_arm
7682 #define ELF_MACHINE_CODE EM_ARM
7683 #ifdef __QNXTARGET__
7684 #define ELF_MAXPAGESIZE 0x1000
7686 #define ELF_MAXPAGESIZE 0x8000
7688 #define ELF_MINPAGESIZE 0x1000
7690 #define bfd_elf32_mkobject elf32_arm_mkobject
7692 #define bfd_elf32_bfd_copy_private_bfd_data elf32_arm_copy_private_bfd_data
7693 #define bfd_elf32_bfd_merge_private_bfd_data elf32_arm_merge_private_bfd_data
7694 #define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
7695 #define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
7696 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
7697 #define bfd_elf32_bfd_reloc_type_lookup elf32_arm_reloc_type_lookup
7698 #define bfd_elf32_find_nearest_line elf32_arm_find_nearest_line
7699 #define bfd_elf32_find_inliner_info elf32_arm_find_inliner_info
7700 #define bfd_elf32_new_section_hook elf32_arm_new_section_hook
7701 #define bfd_elf32_bfd_is_target_special_symbol elf32_arm_is_target_special_symbol
7702 #define bfd_elf32_close_and_cleanup elf32_arm_close_and_cleanup
7703 #define bfd_elf32_bfd_final_link elf32_arm_bfd_final_link
7705 #define elf_backend_get_symbol_type elf32_arm_get_symbol_type
7706 #define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook
7707 #define elf_backend_gc_sweep_hook elf32_arm_gc_sweep_hook
7708 #define elf_backend_check_relocs elf32_arm_check_relocs
7709 #define elf_backend_relocate_section elf32_arm_relocate_section
7710 #define elf_backend_write_section elf32_arm_write_section
7711 #define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol
7712 #define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections
7713 #define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol
7714 #define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections
7715 #define elf_backend_link_output_symbol_hook elf32_arm_output_symbol_hook
7716 #define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections
7717 #define elf_backend_post_process_headers elf32_arm_post_process_headers
7718 #define elf_backend_reloc_type_class elf32_arm_reloc_type_class
7719 #define elf_backend_object_p elf32_arm_object_p
7720 #define elf_backend_section_flags elf32_arm_section_flags
7721 #define elf_backend_fake_sections elf32_arm_fake_sections
7722 #define elf_backend_section_from_shdr elf32_arm_section_from_shdr
7723 #define elf_backend_final_write_processing elf32_arm_final_write_processing
7724 #define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol
7725 #define elf_backend_symbol_processing elf32_arm_symbol_processing
7726 #define elf_backend_size_info elf32_arm_size_info
7727 #define elf_backend_modify_segment_map elf32_arm_modify_segment_map
7728 #define elf_backend_additional_program_headers \
7729 elf32_arm_additional_program_headers
7731 #define elf_backend_can_refcount 1
7732 #define elf_backend_can_gc_sections 1
7733 #define elf_backend_plt_readonly 1
7734 #define elf_backend_want_got_plt 1
7735 #define elf_backend_want_plt_sym 0
7736 #define elf_backend_may_use_rel_p 1
7737 #define elf_backend_may_use_rela_p 0
7738 #define elf_backend_default_use_rela_p 0
7739 #define elf_backend_rela_normal 0
7741 #define elf_backend_got_header_size 12
7743 #include "elf32-target.h"
7745 /* VxWorks Targets */
7747 #undef TARGET_LITTLE_SYM
7748 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vxworks_vec
7749 #undef TARGET_LITTLE_NAME
7750 #define TARGET_LITTLE_NAME "elf32-littlearm-vxworks"
7751 #undef TARGET_BIG_SYM
7752 #define TARGET_BIG_SYM bfd_elf32_bigarm_vxworks_vec
7753 #undef TARGET_BIG_NAME
7754 #define TARGET_BIG_NAME "elf32-bigarm-vxworks"
7756 /* Like elf32_arm_link_hash_table_create -- but overrides
7757 appropriately for VxWorks. */
7758 static struct bfd_link_hash_table *
7759 elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
7761 struct bfd_link_hash_table *ret;
7763 ret = elf32_arm_link_hash_table_create (abfd);
7766 struct elf32_arm_link_hash_table *htab
7767 = (struct elf32_arm_link_hash_table *)ret;
7774 #define elf32_bed elf32_arm_vxworks_bed
7776 #undef bfd_elf32_bfd_link_hash_table_create
7777 #define bfd_elf32_bfd_link_hash_table_create \
7778 elf32_arm_vxworks_link_hash_table_create
7780 #undef elf_backend_may_use_rel_p
7781 #define elf_backend_may_use_rel_p 0
7782 #undef elf_backend_may_use_rela_p
7783 #define elf_backend_may_use_rela_p 1
7784 #undef elf_backend_default_use_rela_p
7785 #define elf_backend_default_use_rela_p 1
7786 #undef elf_backend_rela_normal
7787 #define elf_backend_rela_normal 1
7789 #include "elf32-target.h"
7792 /* Symbian OS Targets */
7794 #undef TARGET_LITTLE_SYM
7795 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_symbian_vec
7796 #undef TARGET_LITTLE_NAME
7797 #define TARGET_LITTLE_NAME "elf32-littlearm-symbian"
7798 #undef TARGET_BIG_SYM
7799 #define TARGET_BIG_SYM bfd_elf32_bigarm_symbian_vec
7800 #undef TARGET_BIG_NAME
7801 #define TARGET_BIG_NAME "elf32-bigarm-symbian"
7803 /* Like elf32_arm_link_hash_table_create -- but overrides
7804 appropriately for Symbian OS. */
7805 static struct bfd_link_hash_table *
7806 elf32_arm_symbian_link_hash_table_create (bfd *abfd)
7808 struct bfd_link_hash_table *ret;
7810 ret = elf32_arm_link_hash_table_create (abfd);
7813 struct elf32_arm_link_hash_table *htab
7814 = (struct elf32_arm_link_hash_table *)ret;
7815 /* There is no PLT header for Symbian OS. */
7816 htab->plt_header_size = 0;
7817 /* The PLT entries are each three instructions. */
7818 htab->plt_entry_size = 4 * NUM_ELEM (elf32_arm_symbian_plt_entry);
7819 htab->symbian_p = 1;
7820 /* Symbian uses armv5t or above, so use_blx is always true. */
7822 htab->root.is_relocatable_executable = 1;
7827 static const struct bfd_elf_special_section
7828 elf32_arm_symbian_special_sections[] =
7830 /* In a BPABI executable, the dynamic linking sections do not go in
7831 the loadable read-only segment. The post-linker may wish to
7832 refer to these sections, but they are not part of the final
7834 { ".dynamic", 8, 0, SHT_DYNAMIC, 0 },
7835 { ".dynstr", 7, 0, SHT_STRTAB, 0 },
7836 { ".dynsym", 7, 0, SHT_DYNSYM, 0 },
7837 { ".got", 4, 0, SHT_PROGBITS, 0 },
7838 { ".hash", 5, 0, SHT_HASH, 0 },
7839 /* These sections do not need to be writable as the SymbianOS
7840 postlinker will arrange things so that no dynamic relocation is
7842 { ".init_array", 11, 0, SHT_INIT_ARRAY, SHF_ALLOC },
7843 { ".fini_array", 11, 0, SHT_FINI_ARRAY, SHF_ALLOC },
7844 { ".preinit_array", 14, 0, SHT_PREINIT_ARRAY, SHF_ALLOC },
7845 { NULL, 0, 0, 0, 0 }
7849 elf32_arm_symbian_begin_write_processing (bfd *abfd,
7850 struct bfd_link_info *link_info
7853 /* BPABI objects are never loaded directly by an OS kernel; they are
7854 processed by a postlinker first, into an OS-specific format. If
7855 the D_PAGED bit is set on the file, BFD will align segments on
7856 page boundaries, so that an OS can directly map the file. With
7857 BPABI objects, that just results in wasted space. In addition,
7858 because we clear the D_PAGED bit, map_sections_to_segments will
7859 recognize that the program headers should not be mapped into any
7860 loadable segment. */
7861 abfd->flags &= ~D_PAGED;
7865 elf32_arm_symbian_modify_segment_map (bfd *abfd,
7866 struct bfd_link_info *info)
7868 struct elf_segment_map *m;
7871 /* BPABI shared libraries and executables should have a PT_DYNAMIC
7872 segment. However, because the .dynamic section is not marked
7873 with SEC_LOAD, the generic ELF code will not create such a
7875 dynsec = bfd_get_section_by_name (abfd, ".dynamic");
7878 m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
7879 m->next = elf_tdata (abfd)->segment_map;
7880 elf_tdata (abfd)->segment_map = m;
7883 /* Also call the generic arm routine. */
7884 return elf32_arm_modify_segment_map (abfd, info);
7888 #define elf32_bed elf32_arm_symbian_bed
7890 /* The dynamic sections are not allocated on SymbianOS; the postlinker
7891 will process them and then discard them. */
7892 #undef ELF_DYNAMIC_SEC_FLAGS
7893 #define ELF_DYNAMIC_SEC_FLAGS \
7894 (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
7896 #undef bfd_elf32_bfd_link_hash_table_create
7897 #define bfd_elf32_bfd_link_hash_table_create \
7898 elf32_arm_symbian_link_hash_table_create
7900 #undef elf_backend_special_sections
7901 #define elf_backend_special_sections elf32_arm_symbian_special_sections
7903 #undef elf_backend_begin_write_processing
7904 #define elf_backend_begin_write_processing \
7905 elf32_arm_symbian_begin_write_processing
7907 #undef elf_backend_modify_segment_map
7908 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
7910 /* There is no .got section for BPABI objects, and hence no header. */
7911 #undef elf_backend_got_header_size
7912 #define elf_backend_got_header_size 0
7914 /* Similarly, there is no .got.plt section. */
7915 #undef elf_backend_want_got_plt
7916 #define elf_backend_want_got_plt 0
7918 #undef elf_backend_may_use_rel_p
7919 #define elf_backend_may_use_rel_p 1
7920 #undef elf_backend_may_use_rela_p
7921 #define elf_backend_may_use_rela_p 0
7922 #undef elf_backend_default_use_rela_p
7923 #define elf_backend_default_use_rela_p 0
7924 #undef elf_backend_rela_normal
7925 #define elf_backend_rela_normal 0
7927 #include "elf32-target.h"