* ld-mips-elf/tlslib-o32-ver.got, ld-mips-elf/tlslib-o32.got:
[binutils.git] / bfd / elf32-arm.c
bloba458d46ce92a7828cdbe6c203edcafc930a3252f
1 /* 32-bit ELF support for ARM
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "libiberty.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf-vxworks.h"
27 #include "elf/arm.h"
29 #ifndef NUM_ELEM
30 #define NUM_ELEM(a) (sizeof (a) / (sizeof (a)[0]))
31 #endif
33 /* Return the relocation section associated with NAME. HTAB is the
34 bfd's elf32_arm_link_hash_entry. */
35 #define RELOC_SECTION(HTAB, NAME) \
36 ((HTAB)->use_rel ? ".rel" NAME : ".rela" NAME)
38 /* Return size of a relocation entry. HTAB is the bfd's
39 elf32_arm_link_hash_entry. */
40 #define RELOC_SIZE(HTAB) \
41 ((HTAB)->use_rel \
42 ? sizeof (Elf32_External_Rel) \
43 : sizeof (Elf32_External_Rela))
45 /* Return function to swap relocations in. HTAB is the bfd's
46 elf32_arm_link_hash_entry. */
47 #define SWAP_RELOC_IN(HTAB) \
48 ((HTAB)->use_rel \
49 ? bfd_elf32_swap_reloc_in \
50 : bfd_elf32_swap_reloca_in)
52 /* Return function to swap relocations out. HTAB is the bfd's
53 elf32_arm_link_hash_entry. */
54 #define SWAP_RELOC_OUT(HTAB) \
55 ((HTAB)->use_rel \
56 ? bfd_elf32_swap_reloc_out \
57 : bfd_elf32_swap_reloca_out)
59 #define elf_info_to_howto 0
60 #define elf_info_to_howto_rel elf32_arm_info_to_howto
62 #define ARM_ELF_ABI_VERSION 0
63 #define ARM_ELF_OS_ABI_VERSION ELFOSABI_ARM
65 static struct elf_backend_data elf32_arm_vxworks_bed;
67 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
68 R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
69 in that slot. */
71 static reloc_howto_type elf32_arm_howto_table_1[] =
73 /* No relocation */
74 HOWTO (R_ARM_NONE, /* type */
75 0, /* rightshift */
76 0, /* size (0 = byte, 1 = short, 2 = long) */
77 0, /* bitsize */
78 FALSE, /* pc_relative */
79 0, /* bitpos */
80 complain_overflow_dont,/* complain_on_overflow */
81 bfd_elf_generic_reloc, /* special_function */
82 "R_ARM_NONE", /* name */
83 FALSE, /* partial_inplace */
84 0, /* src_mask */
85 0, /* dst_mask */
86 FALSE), /* pcrel_offset */
88 HOWTO (R_ARM_PC24, /* type */
89 2, /* rightshift */
90 2, /* size (0 = byte, 1 = short, 2 = long) */
91 24, /* bitsize */
92 TRUE, /* pc_relative */
93 0, /* bitpos */
94 complain_overflow_signed,/* complain_on_overflow */
95 bfd_elf_generic_reloc, /* special_function */
96 "R_ARM_PC24", /* name */
97 FALSE, /* partial_inplace */
98 0x00ffffff, /* src_mask */
99 0x00ffffff, /* dst_mask */
100 TRUE), /* pcrel_offset */
102 /* 32 bit absolute */
103 HOWTO (R_ARM_ABS32, /* type */
104 0, /* rightshift */
105 2, /* size (0 = byte, 1 = short, 2 = long) */
106 32, /* bitsize */
107 FALSE, /* pc_relative */
108 0, /* bitpos */
109 complain_overflow_bitfield,/* complain_on_overflow */
110 bfd_elf_generic_reloc, /* special_function */
111 "R_ARM_ABS32", /* name */
112 FALSE, /* partial_inplace */
113 0xffffffff, /* src_mask */
114 0xffffffff, /* dst_mask */
115 FALSE), /* pcrel_offset */
117 /* standard 32bit pc-relative reloc */
118 HOWTO (R_ARM_REL32, /* type */
119 0, /* rightshift */
120 2, /* size (0 = byte, 1 = short, 2 = long) */
121 32, /* bitsize */
122 TRUE, /* pc_relative */
123 0, /* bitpos */
124 complain_overflow_bitfield,/* complain_on_overflow */
125 bfd_elf_generic_reloc, /* special_function */
126 "R_ARM_REL32", /* name */
127 FALSE, /* partial_inplace */
128 0xffffffff, /* src_mask */
129 0xffffffff, /* dst_mask */
130 TRUE), /* pcrel_offset */
132 /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
133 HOWTO (R_ARM_LDR_PC_G0, /* type */
134 0, /* rightshift */
135 0, /* size (0 = byte, 1 = short, 2 = long) */
136 32, /* bitsize */
137 TRUE, /* pc_relative */
138 0, /* bitpos */
139 complain_overflow_dont,/* complain_on_overflow */
140 bfd_elf_generic_reloc, /* special_function */
141 "R_ARM_LDR_PC_G0", /* name */
142 FALSE, /* partial_inplace */
143 0xffffffff, /* src_mask */
144 0xffffffff, /* dst_mask */
145 TRUE), /* pcrel_offset */
147 /* 16 bit absolute */
148 HOWTO (R_ARM_ABS16, /* type */
149 0, /* rightshift */
150 1, /* size (0 = byte, 1 = short, 2 = long) */
151 16, /* bitsize */
152 FALSE, /* pc_relative */
153 0, /* bitpos */
154 complain_overflow_bitfield,/* complain_on_overflow */
155 bfd_elf_generic_reloc, /* special_function */
156 "R_ARM_ABS16", /* name */
157 FALSE, /* partial_inplace */
158 0x0000ffff, /* src_mask */
159 0x0000ffff, /* dst_mask */
160 FALSE), /* pcrel_offset */
162 /* 12 bit absolute */
163 HOWTO (R_ARM_ABS12, /* type */
164 0, /* rightshift */
165 2, /* size (0 = byte, 1 = short, 2 = long) */
166 12, /* bitsize */
167 FALSE, /* pc_relative */
168 0, /* bitpos */
169 complain_overflow_bitfield,/* complain_on_overflow */
170 bfd_elf_generic_reloc, /* special_function */
171 "R_ARM_ABS12", /* name */
172 FALSE, /* partial_inplace */
173 0x00000fff, /* src_mask */
174 0x00000fff, /* dst_mask */
175 FALSE), /* pcrel_offset */
177 HOWTO (R_ARM_THM_ABS5, /* type */
178 6, /* rightshift */
179 1, /* size (0 = byte, 1 = short, 2 = long) */
180 5, /* bitsize */
181 FALSE, /* pc_relative */
182 0, /* bitpos */
183 complain_overflow_bitfield,/* complain_on_overflow */
184 bfd_elf_generic_reloc, /* special_function */
185 "R_ARM_THM_ABS5", /* name */
186 FALSE, /* partial_inplace */
187 0x000007e0, /* src_mask */
188 0x000007e0, /* dst_mask */
189 FALSE), /* pcrel_offset */
191 /* 8 bit absolute */
192 HOWTO (R_ARM_ABS8, /* type */
193 0, /* rightshift */
194 0, /* size (0 = byte, 1 = short, 2 = long) */
195 8, /* bitsize */
196 FALSE, /* pc_relative */
197 0, /* bitpos */
198 complain_overflow_bitfield,/* complain_on_overflow */
199 bfd_elf_generic_reloc, /* special_function */
200 "R_ARM_ABS8", /* name */
201 FALSE, /* partial_inplace */
202 0x000000ff, /* src_mask */
203 0x000000ff, /* dst_mask */
204 FALSE), /* pcrel_offset */
206 HOWTO (R_ARM_SBREL32, /* type */
207 0, /* rightshift */
208 2, /* size (0 = byte, 1 = short, 2 = long) */
209 32, /* bitsize */
210 FALSE, /* pc_relative */
211 0, /* bitpos */
212 complain_overflow_dont,/* complain_on_overflow */
213 bfd_elf_generic_reloc, /* special_function */
214 "R_ARM_SBREL32", /* name */
215 FALSE, /* partial_inplace */
216 0xffffffff, /* src_mask */
217 0xffffffff, /* dst_mask */
218 FALSE), /* pcrel_offset */
220 /* FIXME: Has two more bits of offset in Thumb32. */
221 HOWTO (R_ARM_THM_CALL, /* type */
222 1, /* rightshift */
223 2, /* size (0 = byte, 1 = short, 2 = long) */
224 23, /* bitsize */
225 TRUE, /* pc_relative */
226 0, /* bitpos */
227 complain_overflow_signed,/* complain_on_overflow */
228 bfd_elf_generic_reloc, /* special_function */
229 "R_ARM_THM_CALL", /* name */
230 FALSE, /* partial_inplace */
231 0x07ff07ff, /* src_mask */
232 0x07ff07ff, /* dst_mask */
233 TRUE), /* pcrel_offset */
235 HOWTO (R_ARM_THM_PC8, /* type */
236 1, /* rightshift */
237 1, /* size (0 = byte, 1 = short, 2 = long) */
238 8, /* bitsize */
239 TRUE, /* pc_relative */
240 0, /* bitpos */
241 complain_overflow_signed,/* complain_on_overflow */
242 bfd_elf_generic_reloc, /* special_function */
243 "R_ARM_THM_PC8", /* name */
244 FALSE, /* partial_inplace */
245 0x000000ff, /* src_mask */
246 0x000000ff, /* dst_mask */
247 TRUE), /* pcrel_offset */
249 HOWTO (R_ARM_BREL_ADJ, /* type */
250 1, /* rightshift */
251 1, /* size (0 = byte, 1 = short, 2 = long) */
252 32, /* bitsize */
253 FALSE, /* pc_relative */
254 0, /* bitpos */
255 complain_overflow_signed,/* complain_on_overflow */
256 bfd_elf_generic_reloc, /* special_function */
257 "R_ARM_BREL_ADJ", /* name */
258 FALSE, /* partial_inplace */
259 0xffffffff, /* src_mask */
260 0xffffffff, /* dst_mask */
261 FALSE), /* pcrel_offset */
263 HOWTO (R_ARM_SWI24, /* type */
264 0, /* rightshift */
265 0, /* size (0 = byte, 1 = short, 2 = long) */
266 0, /* bitsize */
267 FALSE, /* pc_relative */
268 0, /* bitpos */
269 complain_overflow_signed,/* complain_on_overflow */
270 bfd_elf_generic_reloc, /* special_function */
271 "R_ARM_SWI24", /* name */
272 FALSE, /* partial_inplace */
273 0x00000000, /* src_mask */
274 0x00000000, /* dst_mask */
275 FALSE), /* pcrel_offset */
277 HOWTO (R_ARM_THM_SWI8, /* type */
278 0, /* rightshift */
279 0, /* size (0 = byte, 1 = short, 2 = long) */
280 0, /* bitsize */
281 FALSE, /* pc_relative */
282 0, /* bitpos */
283 complain_overflow_signed,/* complain_on_overflow */
284 bfd_elf_generic_reloc, /* special_function */
285 "R_ARM_SWI8", /* name */
286 FALSE, /* partial_inplace */
287 0x00000000, /* src_mask */
288 0x00000000, /* dst_mask */
289 FALSE), /* pcrel_offset */
291 /* BLX instruction for the ARM. */
292 HOWTO (R_ARM_XPC25, /* type */
293 2, /* rightshift */
294 2, /* size (0 = byte, 1 = short, 2 = long) */
295 25, /* bitsize */
296 TRUE, /* pc_relative */
297 0, /* bitpos */
298 complain_overflow_signed,/* complain_on_overflow */
299 bfd_elf_generic_reloc, /* special_function */
300 "R_ARM_XPC25", /* name */
301 FALSE, /* partial_inplace */
302 0x00ffffff, /* src_mask */
303 0x00ffffff, /* dst_mask */
304 TRUE), /* pcrel_offset */
306 /* BLX instruction for the Thumb. */
307 HOWTO (R_ARM_THM_XPC22, /* type */
308 2, /* rightshift */
309 2, /* size (0 = byte, 1 = short, 2 = long) */
310 22, /* bitsize */
311 TRUE, /* pc_relative */
312 0, /* bitpos */
313 complain_overflow_signed,/* complain_on_overflow */
314 bfd_elf_generic_reloc, /* special_function */
315 "R_ARM_THM_XPC22", /* name */
316 FALSE, /* partial_inplace */
317 0x07ff07ff, /* src_mask */
318 0x07ff07ff, /* dst_mask */
319 TRUE), /* pcrel_offset */
321 /* Dynamic TLS relocations. */
323 HOWTO (R_ARM_TLS_DTPMOD32, /* type */
324 0, /* rightshift */
325 2, /* size (0 = byte, 1 = short, 2 = long) */
326 32, /* bitsize */
327 FALSE, /* pc_relative */
328 0, /* bitpos */
329 complain_overflow_bitfield,/* complain_on_overflow */
330 bfd_elf_generic_reloc, /* special_function */
331 "R_ARM_TLS_DTPMOD32", /* name */
332 TRUE, /* partial_inplace */
333 0xffffffff, /* src_mask */
334 0xffffffff, /* dst_mask */
335 FALSE), /* pcrel_offset */
337 HOWTO (R_ARM_TLS_DTPOFF32, /* type */
338 0, /* rightshift */
339 2, /* size (0 = byte, 1 = short, 2 = long) */
340 32, /* bitsize */
341 FALSE, /* pc_relative */
342 0, /* bitpos */
343 complain_overflow_bitfield,/* complain_on_overflow */
344 bfd_elf_generic_reloc, /* special_function */
345 "R_ARM_TLS_DTPOFF32", /* name */
346 TRUE, /* partial_inplace */
347 0xffffffff, /* src_mask */
348 0xffffffff, /* dst_mask */
349 FALSE), /* pcrel_offset */
351 HOWTO (R_ARM_TLS_TPOFF32, /* type */
352 0, /* rightshift */
353 2, /* size (0 = byte, 1 = short, 2 = long) */
354 32, /* bitsize */
355 FALSE, /* pc_relative */
356 0, /* bitpos */
357 complain_overflow_bitfield,/* complain_on_overflow */
358 bfd_elf_generic_reloc, /* special_function */
359 "R_ARM_TLS_TPOFF32", /* name */
360 TRUE, /* partial_inplace */
361 0xffffffff, /* src_mask */
362 0xffffffff, /* dst_mask */
363 FALSE), /* pcrel_offset */
365 /* Relocs used in ARM Linux */
367 HOWTO (R_ARM_COPY, /* type */
368 0, /* rightshift */
369 2, /* size (0 = byte, 1 = short, 2 = long) */
370 32, /* bitsize */
371 FALSE, /* pc_relative */
372 0, /* bitpos */
373 complain_overflow_bitfield,/* complain_on_overflow */
374 bfd_elf_generic_reloc, /* special_function */
375 "R_ARM_COPY", /* name */
376 TRUE, /* partial_inplace */
377 0xffffffff, /* src_mask */
378 0xffffffff, /* dst_mask */
379 FALSE), /* pcrel_offset */
381 HOWTO (R_ARM_GLOB_DAT, /* type */
382 0, /* rightshift */
383 2, /* size (0 = byte, 1 = short, 2 = long) */
384 32, /* bitsize */
385 FALSE, /* pc_relative */
386 0, /* bitpos */
387 complain_overflow_bitfield,/* complain_on_overflow */
388 bfd_elf_generic_reloc, /* special_function */
389 "R_ARM_GLOB_DAT", /* name */
390 TRUE, /* partial_inplace */
391 0xffffffff, /* src_mask */
392 0xffffffff, /* dst_mask */
393 FALSE), /* pcrel_offset */
395 HOWTO (R_ARM_JUMP_SLOT, /* type */
396 0, /* rightshift */
397 2, /* size (0 = byte, 1 = short, 2 = long) */
398 32, /* bitsize */
399 FALSE, /* pc_relative */
400 0, /* bitpos */
401 complain_overflow_bitfield,/* complain_on_overflow */
402 bfd_elf_generic_reloc, /* special_function */
403 "R_ARM_JUMP_SLOT", /* name */
404 TRUE, /* partial_inplace */
405 0xffffffff, /* src_mask */
406 0xffffffff, /* dst_mask */
407 FALSE), /* pcrel_offset */
409 HOWTO (R_ARM_RELATIVE, /* type */
410 0, /* rightshift */
411 2, /* size (0 = byte, 1 = short, 2 = long) */
412 32, /* bitsize */
413 FALSE, /* pc_relative */
414 0, /* bitpos */
415 complain_overflow_bitfield,/* complain_on_overflow */
416 bfd_elf_generic_reloc, /* special_function */
417 "R_ARM_RELATIVE", /* name */
418 TRUE, /* partial_inplace */
419 0xffffffff, /* src_mask */
420 0xffffffff, /* dst_mask */
421 FALSE), /* pcrel_offset */
423 HOWTO (R_ARM_GOTOFF32, /* type */
424 0, /* rightshift */
425 2, /* size (0 = byte, 1 = short, 2 = long) */
426 32, /* bitsize */
427 FALSE, /* pc_relative */
428 0, /* bitpos */
429 complain_overflow_bitfield,/* complain_on_overflow */
430 bfd_elf_generic_reloc, /* special_function */
431 "R_ARM_GOTOFF32", /* name */
432 TRUE, /* partial_inplace */
433 0xffffffff, /* src_mask */
434 0xffffffff, /* dst_mask */
435 FALSE), /* pcrel_offset */
437 HOWTO (R_ARM_GOTPC, /* type */
438 0, /* rightshift */
439 2, /* size (0 = byte, 1 = short, 2 = long) */
440 32, /* bitsize */
441 TRUE, /* pc_relative */
442 0, /* bitpos */
443 complain_overflow_bitfield,/* complain_on_overflow */
444 bfd_elf_generic_reloc, /* special_function */
445 "R_ARM_GOTPC", /* name */
446 TRUE, /* partial_inplace */
447 0xffffffff, /* src_mask */
448 0xffffffff, /* dst_mask */
449 TRUE), /* pcrel_offset */
451 HOWTO (R_ARM_GOT32, /* type */
452 0, /* rightshift */
453 2, /* size (0 = byte, 1 = short, 2 = long) */
454 32, /* bitsize */
455 FALSE, /* pc_relative */
456 0, /* bitpos */
457 complain_overflow_bitfield,/* complain_on_overflow */
458 bfd_elf_generic_reloc, /* special_function */
459 "R_ARM_GOT32", /* name */
460 TRUE, /* partial_inplace */
461 0xffffffff, /* src_mask */
462 0xffffffff, /* dst_mask */
463 FALSE), /* pcrel_offset */
465 HOWTO (R_ARM_PLT32, /* type */
466 2, /* rightshift */
467 2, /* size (0 = byte, 1 = short, 2 = long) */
468 24, /* bitsize */
469 TRUE, /* pc_relative */
470 0, /* bitpos */
471 complain_overflow_bitfield,/* complain_on_overflow */
472 bfd_elf_generic_reloc, /* special_function */
473 "R_ARM_PLT32", /* name */
474 FALSE, /* partial_inplace */
475 0x00ffffff, /* src_mask */
476 0x00ffffff, /* dst_mask */
477 TRUE), /* pcrel_offset */
479 HOWTO (R_ARM_CALL, /* type */
480 2, /* rightshift */
481 2, /* size (0 = byte, 1 = short, 2 = long) */
482 24, /* bitsize */
483 TRUE, /* pc_relative */
484 0, /* bitpos */
485 complain_overflow_signed,/* complain_on_overflow */
486 bfd_elf_generic_reloc, /* special_function */
487 "R_ARM_CALL", /* name */
488 FALSE, /* partial_inplace */
489 0x00ffffff, /* src_mask */
490 0x00ffffff, /* dst_mask */
491 TRUE), /* pcrel_offset */
493 HOWTO (R_ARM_JUMP24, /* type */
494 2, /* rightshift */
495 2, /* size (0 = byte, 1 = short, 2 = long) */
496 24, /* bitsize */
497 TRUE, /* pc_relative */
498 0, /* bitpos */
499 complain_overflow_signed,/* complain_on_overflow */
500 bfd_elf_generic_reloc, /* special_function */
501 "R_ARM_JUMP24", /* name */
502 FALSE, /* partial_inplace */
503 0x00ffffff, /* src_mask */
504 0x00ffffff, /* dst_mask */
505 TRUE), /* pcrel_offset */
507 HOWTO (R_ARM_THM_JUMP24, /* type */
508 1, /* rightshift */
509 2, /* size (0 = byte, 1 = short, 2 = long) */
510 24, /* bitsize */
511 TRUE, /* pc_relative */
512 0, /* bitpos */
513 complain_overflow_signed,/* complain_on_overflow */
514 bfd_elf_generic_reloc, /* special_function */
515 "R_ARM_THM_JUMP24", /* name */
516 FALSE, /* partial_inplace */
517 0x07ff2fff, /* src_mask */
518 0x07ff2fff, /* dst_mask */
519 TRUE), /* pcrel_offset */
521 HOWTO (R_ARM_BASE_ABS, /* type */
522 0, /* rightshift */
523 2, /* size (0 = byte, 1 = short, 2 = long) */
524 32, /* bitsize */
525 FALSE, /* pc_relative */
526 0, /* bitpos */
527 complain_overflow_dont,/* complain_on_overflow */
528 bfd_elf_generic_reloc, /* special_function */
529 "R_ARM_BASE_ABS", /* name */
530 FALSE, /* partial_inplace */
531 0xffffffff, /* src_mask */
532 0xffffffff, /* dst_mask */
533 FALSE), /* pcrel_offset */
535 HOWTO (R_ARM_ALU_PCREL7_0, /* type */
536 0, /* rightshift */
537 2, /* size (0 = byte, 1 = short, 2 = long) */
538 12, /* bitsize */
539 TRUE, /* pc_relative */
540 0, /* bitpos */
541 complain_overflow_dont,/* complain_on_overflow */
542 bfd_elf_generic_reloc, /* special_function */
543 "R_ARM_ALU_PCREL_7_0", /* name */
544 FALSE, /* partial_inplace */
545 0x00000fff, /* src_mask */
546 0x00000fff, /* dst_mask */
547 TRUE), /* pcrel_offset */
549 HOWTO (R_ARM_ALU_PCREL15_8, /* type */
550 0, /* rightshift */
551 2, /* size (0 = byte, 1 = short, 2 = long) */
552 12, /* bitsize */
553 TRUE, /* pc_relative */
554 8, /* bitpos */
555 complain_overflow_dont,/* complain_on_overflow */
556 bfd_elf_generic_reloc, /* special_function */
557 "R_ARM_ALU_PCREL_15_8",/* name */
558 FALSE, /* partial_inplace */
559 0x00000fff, /* src_mask */
560 0x00000fff, /* dst_mask */
561 TRUE), /* pcrel_offset */
563 HOWTO (R_ARM_ALU_PCREL23_15, /* type */
564 0, /* rightshift */
565 2, /* size (0 = byte, 1 = short, 2 = long) */
566 12, /* bitsize */
567 TRUE, /* pc_relative */
568 16, /* bitpos */
569 complain_overflow_dont,/* complain_on_overflow */
570 bfd_elf_generic_reloc, /* special_function */
571 "R_ARM_ALU_PCREL_23_15",/* name */
572 FALSE, /* partial_inplace */
573 0x00000fff, /* src_mask */
574 0x00000fff, /* dst_mask */
575 TRUE), /* pcrel_offset */
577 HOWTO (R_ARM_LDR_SBREL_11_0, /* type */
578 0, /* rightshift */
579 2, /* size (0 = byte, 1 = short, 2 = long) */
580 12, /* bitsize */
581 FALSE, /* pc_relative */
582 0, /* bitpos */
583 complain_overflow_dont,/* complain_on_overflow */
584 bfd_elf_generic_reloc, /* special_function */
585 "R_ARM_LDR_SBREL_11_0",/* name */
586 FALSE, /* partial_inplace */
587 0x00000fff, /* src_mask */
588 0x00000fff, /* dst_mask */
589 FALSE), /* pcrel_offset */
591 HOWTO (R_ARM_ALU_SBREL_19_12, /* type */
592 0, /* rightshift */
593 2, /* size (0 = byte, 1 = short, 2 = long) */
594 8, /* bitsize */
595 FALSE, /* pc_relative */
596 12, /* bitpos */
597 complain_overflow_dont,/* complain_on_overflow */
598 bfd_elf_generic_reloc, /* special_function */
599 "R_ARM_ALU_SBREL_19_12",/* name */
600 FALSE, /* partial_inplace */
601 0x000ff000, /* src_mask */
602 0x000ff000, /* dst_mask */
603 FALSE), /* pcrel_offset */
605 HOWTO (R_ARM_ALU_SBREL_27_20, /* type */
606 0, /* rightshift */
607 2, /* size (0 = byte, 1 = short, 2 = long) */
608 8, /* bitsize */
609 FALSE, /* pc_relative */
610 20, /* bitpos */
611 complain_overflow_dont,/* complain_on_overflow */
612 bfd_elf_generic_reloc, /* special_function */
613 "R_ARM_ALU_SBREL_27_20",/* name */
614 FALSE, /* partial_inplace */
615 0x0ff00000, /* src_mask */
616 0x0ff00000, /* dst_mask */
617 FALSE), /* pcrel_offset */
619 HOWTO (R_ARM_TARGET1, /* type */
620 0, /* rightshift */
621 2, /* size (0 = byte, 1 = short, 2 = long) */
622 32, /* bitsize */
623 FALSE, /* pc_relative */
624 0, /* bitpos */
625 complain_overflow_dont,/* complain_on_overflow */
626 bfd_elf_generic_reloc, /* special_function */
627 "R_ARM_TARGET1", /* name */
628 FALSE, /* partial_inplace */
629 0xffffffff, /* src_mask */
630 0xffffffff, /* dst_mask */
631 FALSE), /* pcrel_offset */
633 HOWTO (R_ARM_ROSEGREL32, /* type */
634 0, /* rightshift */
635 2, /* size (0 = byte, 1 = short, 2 = long) */
636 32, /* bitsize */
637 FALSE, /* pc_relative */
638 0, /* bitpos */
639 complain_overflow_dont,/* complain_on_overflow */
640 bfd_elf_generic_reloc, /* special_function */
641 "R_ARM_ROSEGREL32", /* name */
642 FALSE, /* partial_inplace */
643 0xffffffff, /* src_mask */
644 0xffffffff, /* dst_mask */
645 FALSE), /* pcrel_offset */
647 HOWTO (R_ARM_V4BX, /* type */
648 0, /* rightshift */
649 2, /* size (0 = byte, 1 = short, 2 = long) */
650 32, /* bitsize */
651 FALSE, /* pc_relative */
652 0, /* bitpos */
653 complain_overflow_dont,/* complain_on_overflow */
654 bfd_elf_generic_reloc, /* special_function */
655 "R_ARM_V4BX", /* name */
656 FALSE, /* partial_inplace */
657 0xffffffff, /* src_mask */
658 0xffffffff, /* dst_mask */
659 FALSE), /* pcrel_offset */
661 HOWTO (R_ARM_TARGET2, /* type */
662 0, /* rightshift */
663 2, /* size (0 = byte, 1 = short, 2 = long) */
664 32, /* bitsize */
665 FALSE, /* pc_relative */
666 0, /* bitpos */
667 complain_overflow_signed,/* complain_on_overflow */
668 bfd_elf_generic_reloc, /* special_function */
669 "R_ARM_TARGET2", /* name */
670 FALSE, /* partial_inplace */
671 0xffffffff, /* src_mask */
672 0xffffffff, /* dst_mask */
673 TRUE), /* pcrel_offset */
675 HOWTO (R_ARM_PREL31, /* type */
676 0, /* rightshift */
677 2, /* size (0 = byte, 1 = short, 2 = long) */
678 31, /* bitsize */
679 TRUE, /* pc_relative */
680 0, /* bitpos */
681 complain_overflow_signed,/* complain_on_overflow */
682 bfd_elf_generic_reloc, /* special_function */
683 "R_ARM_PREL31", /* name */
684 FALSE, /* partial_inplace */
685 0x7fffffff, /* src_mask */
686 0x7fffffff, /* dst_mask */
687 TRUE), /* pcrel_offset */
689 HOWTO (R_ARM_MOVW_ABS_NC, /* type */
690 0, /* rightshift */
691 2, /* size (0 = byte, 1 = short, 2 = long) */
692 16, /* bitsize */
693 FALSE, /* pc_relative */
694 0, /* bitpos */
695 complain_overflow_dont,/* complain_on_overflow */
696 bfd_elf_generic_reloc, /* special_function */
697 "R_ARM_MOVW_ABS_NC", /* name */
698 FALSE, /* partial_inplace */
699 0x0000ffff, /* src_mask */
700 0x0000ffff, /* dst_mask */
701 FALSE), /* pcrel_offset */
703 HOWTO (R_ARM_MOVT_ABS, /* type */
704 0, /* rightshift */
705 2, /* size (0 = byte, 1 = short, 2 = long) */
706 16, /* bitsize */
707 FALSE, /* pc_relative */
708 0, /* bitpos */
709 complain_overflow_bitfield,/* complain_on_overflow */
710 bfd_elf_generic_reloc, /* special_function */
711 "R_ARM_MOVT_ABS", /* name */
712 FALSE, /* partial_inplace */
713 0x0000ffff, /* src_mask */
714 0x0000ffff, /* dst_mask */
715 FALSE), /* pcrel_offset */
717 HOWTO (R_ARM_MOVW_PREL_NC, /* type */
718 0, /* rightshift */
719 2, /* size (0 = byte, 1 = short, 2 = long) */
720 16, /* bitsize */
721 TRUE, /* pc_relative */
722 0, /* bitpos */
723 complain_overflow_dont,/* complain_on_overflow */
724 bfd_elf_generic_reloc, /* special_function */
725 "R_ARM_MOVW_PREL_NC", /* name */
726 FALSE, /* partial_inplace */
727 0x0000ffff, /* src_mask */
728 0x0000ffff, /* dst_mask */
729 TRUE), /* pcrel_offset */
731 HOWTO (R_ARM_MOVT_PREL, /* type */
732 0, /* rightshift */
733 2, /* size (0 = byte, 1 = short, 2 = long) */
734 16, /* bitsize */
735 TRUE, /* pc_relative */
736 0, /* bitpos */
737 complain_overflow_bitfield,/* complain_on_overflow */
738 bfd_elf_generic_reloc, /* special_function */
739 "R_ARM_MOVT_PREL", /* name */
740 FALSE, /* partial_inplace */
741 0x0000ffff, /* src_mask */
742 0x0000ffff, /* dst_mask */
743 TRUE), /* pcrel_offset */
745 HOWTO (R_ARM_THM_MOVW_ABS_NC, /* type */
746 0, /* rightshift */
747 2, /* size (0 = byte, 1 = short, 2 = long) */
748 16, /* bitsize */
749 FALSE, /* pc_relative */
750 0, /* bitpos */
751 complain_overflow_dont,/* complain_on_overflow */
752 bfd_elf_generic_reloc, /* special_function */
753 "R_ARM_THM_MOVW_ABS_NC",/* name */
754 FALSE, /* partial_inplace */
755 0x040f70ff, /* src_mask */
756 0x040f70ff, /* dst_mask */
757 FALSE), /* pcrel_offset */
759 HOWTO (R_ARM_THM_MOVT_ABS, /* type */
760 0, /* rightshift */
761 2, /* size (0 = byte, 1 = short, 2 = long) */
762 16, /* bitsize */
763 FALSE, /* pc_relative */
764 0, /* bitpos */
765 complain_overflow_bitfield,/* complain_on_overflow */
766 bfd_elf_generic_reloc, /* special_function */
767 "R_ARM_THM_MOVT_ABS", /* name */
768 FALSE, /* partial_inplace */
769 0x040f70ff, /* src_mask */
770 0x040f70ff, /* dst_mask */
771 FALSE), /* pcrel_offset */
773 HOWTO (R_ARM_THM_MOVW_PREL_NC,/* type */
774 0, /* rightshift */
775 2, /* size (0 = byte, 1 = short, 2 = long) */
776 16, /* bitsize */
777 TRUE, /* pc_relative */
778 0, /* bitpos */
779 complain_overflow_dont,/* complain_on_overflow */
780 bfd_elf_generic_reloc, /* special_function */
781 "R_ARM_THM_MOVW_PREL_NC",/* name */
782 FALSE, /* partial_inplace */
783 0x040f70ff, /* src_mask */
784 0x040f70ff, /* dst_mask */
785 TRUE), /* pcrel_offset */
787 HOWTO (R_ARM_THM_MOVT_PREL, /* type */
788 0, /* rightshift */
789 2, /* size (0 = byte, 1 = short, 2 = long) */
790 16, /* bitsize */
791 TRUE, /* pc_relative */
792 0, /* bitpos */
793 complain_overflow_bitfield,/* complain_on_overflow */
794 bfd_elf_generic_reloc, /* special_function */
795 "R_ARM_THM_MOVT_PREL", /* name */
796 FALSE, /* partial_inplace */
797 0x040f70ff, /* src_mask */
798 0x040f70ff, /* dst_mask */
799 TRUE), /* pcrel_offset */
801 HOWTO (R_ARM_THM_JUMP19, /* type */
802 1, /* rightshift */
803 2, /* size (0 = byte, 1 = short, 2 = long) */
804 19, /* bitsize */
805 TRUE, /* pc_relative */
806 0, /* bitpos */
807 complain_overflow_signed,/* complain_on_overflow */
808 bfd_elf_generic_reloc, /* special_function */
809 "R_ARM_THM_JUMP19", /* name */
810 FALSE, /* partial_inplace */
811 0x043f2fff, /* src_mask */
812 0x043f2fff, /* dst_mask */
813 TRUE), /* pcrel_offset */
815 HOWTO (R_ARM_THM_JUMP6, /* type */
816 1, /* rightshift */
817 1, /* size (0 = byte, 1 = short, 2 = long) */
818 6, /* bitsize */
819 TRUE, /* pc_relative */
820 0, /* bitpos */
821 complain_overflow_unsigned,/* complain_on_overflow */
822 bfd_elf_generic_reloc, /* special_function */
823 "R_ARM_THM_JUMP6", /* name */
824 FALSE, /* partial_inplace */
825 0x02f8, /* src_mask */
826 0x02f8, /* dst_mask */
827 TRUE), /* pcrel_offset */
829 /* These are declared as 13-bit signed relocations because we can
830 address -4095 .. 4095(base) by altering ADDW to SUBW or vice
831 versa. */
832 HOWTO (R_ARM_THM_ALU_PREL_11_0,/* type */
833 0, /* rightshift */
834 2, /* size (0 = byte, 1 = short, 2 = long) */
835 13, /* bitsize */
836 TRUE, /* pc_relative */
837 0, /* bitpos */
838 complain_overflow_signed,/* complain_on_overflow */
839 bfd_elf_generic_reloc, /* special_function */
840 "R_ARM_THM_ALU_PREL_11_0",/* name */
841 FALSE, /* partial_inplace */
842 0x040070ff, /* src_mask */
843 0x040070ff, /* dst_mask */
844 TRUE), /* pcrel_offset */
846 HOWTO (R_ARM_THM_PC12, /* type */
847 0, /* rightshift */
848 2, /* size (0 = byte, 1 = short, 2 = long) */
849 13, /* bitsize */
850 TRUE, /* pc_relative */
851 0, /* bitpos */
852 complain_overflow_signed,/* complain_on_overflow */
853 bfd_elf_generic_reloc, /* special_function */
854 "R_ARM_THM_PC12", /* name */
855 FALSE, /* partial_inplace */
856 0x040070ff, /* src_mask */
857 0x040070ff, /* dst_mask */
858 TRUE), /* pcrel_offset */
860 HOWTO (R_ARM_ABS32_NOI, /* type */
861 0, /* rightshift */
862 2, /* size (0 = byte, 1 = short, 2 = long) */
863 32, /* bitsize */
864 FALSE, /* pc_relative */
865 0, /* bitpos */
866 complain_overflow_dont,/* complain_on_overflow */
867 bfd_elf_generic_reloc, /* special_function */
868 "R_ARM_ABS32_NOI", /* name */
869 FALSE, /* partial_inplace */
870 0xffffffff, /* src_mask */
871 0xffffffff, /* dst_mask */
872 FALSE), /* pcrel_offset */
874 HOWTO (R_ARM_REL32_NOI, /* type */
875 0, /* rightshift */
876 2, /* size (0 = byte, 1 = short, 2 = long) */
877 32, /* bitsize */
878 TRUE, /* pc_relative */
879 0, /* bitpos */
880 complain_overflow_dont,/* complain_on_overflow */
881 bfd_elf_generic_reloc, /* special_function */
882 "R_ARM_REL32_NOI", /* name */
883 FALSE, /* partial_inplace */
884 0xffffffff, /* src_mask */
885 0xffffffff, /* dst_mask */
886 FALSE), /* pcrel_offset */
888 /* Group relocations. */
890 HOWTO (R_ARM_ALU_PC_G0_NC, /* type */
891 0, /* rightshift */
892 2, /* size (0 = byte, 1 = short, 2 = long) */
893 32, /* bitsize */
894 TRUE, /* pc_relative */
895 0, /* bitpos */
896 complain_overflow_dont,/* complain_on_overflow */
897 bfd_elf_generic_reloc, /* special_function */
898 "R_ARM_ALU_PC_G0_NC", /* name */
899 FALSE, /* partial_inplace */
900 0xffffffff, /* src_mask */
901 0xffffffff, /* dst_mask */
902 TRUE), /* pcrel_offset */
904 HOWTO (R_ARM_ALU_PC_G0, /* type */
905 0, /* rightshift */
906 2, /* size (0 = byte, 1 = short, 2 = long) */
907 32, /* bitsize */
908 TRUE, /* pc_relative */
909 0, /* bitpos */
910 complain_overflow_dont,/* complain_on_overflow */
911 bfd_elf_generic_reloc, /* special_function */
912 "R_ARM_ALU_PC_G0", /* name */
913 FALSE, /* partial_inplace */
914 0xffffffff, /* src_mask */
915 0xffffffff, /* dst_mask */
916 TRUE), /* pcrel_offset */
918 HOWTO (R_ARM_ALU_PC_G1_NC, /* type */
919 0, /* rightshift */
920 2, /* size (0 = byte, 1 = short, 2 = long) */
921 32, /* bitsize */
922 TRUE, /* pc_relative */
923 0, /* bitpos */
924 complain_overflow_dont,/* complain_on_overflow */
925 bfd_elf_generic_reloc, /* special_function */
926 "R_ARM_ALU_PC_G1_NC", /* name */
927 FALSE, /* partial_inplace */
928 0xffffffff, /* src_mask */
929 0xffffffff, /* dst_mask */
930 TRUE), /* pcrel_offset */
932 HOWTO (R_ARM_ALU_PC_G1, /* type */
933 0, /* rightshift */
934 2, /* size (0 = byte, 1 = short, 2 = long) */
935 32, /* bitsize */
936 TRUE, /* pc_relative */
937 0, /* bitpos */
938 complain_overflow_dont,/* complain_on_overflow */
939 bfd_elf_generic_reloc, /* special_function */
940 "R_ARM_ALU_PC_G1", /* name */
941 FALSE, /* partial_inplace */
942 0xffffffff, /* src_mask */
943 0xffffffff, /* dst_mask */
944 TRUE), /* pcrel_offset */
946 HOWTO (R_ARM_ALU_PC_G2, /* type */
947 0, /* rightshift */
948 2, /* size (0 = byte, 1 = short, 2 = long) */
949 32, /* bitsize */
950 TRUE, /* pc_relative */
951 0, /* bitpos */
952 complain_overflow_dont,/* complain_on_overflow */
953 bfd_elf_generic_reloc, /* special_function */
954 "R_ARM_ALU_PC_G2", /* name */
955 FALSE, /* partial_inplace */
956 0xffffffff, /* src_mask */
957 0xffffffff, /* dst_mask */
958 TRUE), /* pcrel_offset */
960 HOWTO (R_ARM_LDR_PC_G1, /* type */
961 0, /* rightshift */
962 2, /* size (0 = byte, 1 = short, 2 = long) */
963 32, /* bitsize */
964 TRUE, /* pc_relative */
965 0, /* bitpos */
966 complain_overflow_dont,/* complain_on_overflow */
967 bfd_elf_generic_reloc, /* special_function */
968 "R_ARM_LDR_PC_G1", /* name */
969 FALSE, /* partial_inplace */
970 0xffffffff, /* src_mask */
971 0xffffffff, /* dst_mask */
972 TRUE), /* pcrel_offset */
974 HOWTO (R_ARM_LDR_PC_G2, /* type */
975 0, /* rightshift */
976 2, /* size (0 = byte, 1 = short, 2 = long) */
977 32, /* bitsize */
978 TRUE, /* pc_relative */
979 0, /* bitpos */
980 complain_overflow_dont,/* complain_on_overflow */
981 bfd_elf_generic_reloc, /* special_function */
982 "R_ARM_LDR_PC_G2", /* name */
983 FALSE, /* partial_inplace */
984 0xffffffff, /* src_mask */
985 0xffffffff, /* dst_mask */
986 TRUE), /* pcrel_offset */
988 HOWTO (R_ARM_LDRS_PC_G0, /* type */
989 0, /* rightshift */
990 2, /* size (0 = byte, 1 = short, 2 = long) */
991 32, /* bitsize */
992 TRUE, /* pc_relative */
993 0, /* bitpos */
994 complain_overflow_dont,/* complain_on_overflow */
995 bfd_elf_generic_reloc, /* special_function */
996 "R_ARM_LDRS_PC_G0", /* name */
997 FALSE, /* partial_inplace */
998 0xffffffff, /* src_mask */
999 0xffffffff, /* dst_mask */
1000 TRUE), /* pcrel_offset */
1002 HOWTO (R_ARM_LDRS_PC_G1, /* type */
1003 0, /* rightshift */
1004 2, /* size (0 = byte, 1 = short, 2 = long) */
1005 32, /* bitsize */
1006 TRUE, /* pc_relative */
1007 0, /* bitpos */
1008 complain_overflow_dont,/* complain_on_overflow */
1009 bfd_elf_generic_reloc, /* special_function */
1010 "R_ARM_LDRS_PC_G1", /* name */
1011 FALSE, /* partial_inplace */
1012 0xffffffff, /* src_mask */
1013 0xffffffff, /* dst_mask */
1014 TRUE), /* pcrel_offset */
1016 HOWTO (R_ARM_LDRS_PC_G2, /* type */
1017 0, /* rightshift */
1018 2, /* size (0 = byte, 1 = short, 2 = long) */
1019 32, /* bitsize */
1020 TRUE, /* pc_relative */
1021 0, /* bitpos */
1022 complain_overflow_dont,/* complain_on_overflow */
1023 bfd_elf_generic_reloc, /* special_function */
1024 "R_ARM_LDRS_PC_G2", /* name */
1025 FALSE, /* partial_inplace */
1026 0xffffffff, /* src_mask */
1027 0xffffffff, /* dst_mask */
1028 TRUE), /* pcrel_offset */
1030 HOWTO (R_ARM_LDC_PC_G0, /* type */
1031 0, /* rightshift */
1032 2, /* size (0 = byte, 1 = short, 2 = long) */
1033 32, /* bitsize */
1034 TRUE, /* pc_relative */
1035 0, /* bitpos */
1036 complain_overflow_dont,/* complain_on_overflow */
1037 bfd_elf_generic_reloc, /* special_function */
1038 "R_ARM_LDC_PC_G0", /* name */
1039 FALSE, /* partial_inplace */
1040 0xffffffff, /* src_mask */
1041 0xffffffff, /* dst_mask */
1042 TRUE), /* pcrel_offset */
1044 HOWTO (R_ARM_LDC_PC_G1, /* type */
1045 0, /* rightshift */
1046 2, /* size (0 = byte, 1 = short, 2 = long) */
1047 32, /* bitsize */
1048 TRUE, /* pc_relative */
1049 0, /* bitpos */
1050 complain_overflow_dont,/* complain_on_overflow */
1051 bfd_elf_generic_reloc, /* special_function */
1052 "R_ARM_LDC_PC_G1", /* name */
1053 FALSE, /* partial_inplace */
1054 0xffffffff, /* src_mask */
1055 0xffffffff, /* dst_mask */
1056 TRUE), /* pcrel_offset */
1058 HOWTO (R_ARM_LDC_PC_G2, /* type */
1059 0, /* rightshift */
1060 2, /* size (0 = byte, 1 = short, 2 = long) */
1061 32, /* bitsize */
1062 TRUE, /* pc_relative */
1063 0, /* bitpos */
1064 complain_overflow_dont,/* complain_on_overflow */
1065 bfd_elf_generic_reloc, /* special_function */
1066 "R_ARM_LDC_PC_G2", /* name */
1067 FALSE, /* partial_inplace */
1068 0xffffffff, /* src_mask */
1069 0xffffffff, /* dst_mask */
1070 TRUE), /* pcrel_offset */
1072 HOWTO (R_ARM_ALU_SB_G0_NC, /* type */
1073 0, /* rightshift */
1074 2, /* size (0 = byte, 1 = short, 2 = long) */
1075 32, /* bitsize */
1076 TRUE, /* pc_relative */
1077 0, /* bitpos */
1078 complain_overflow_dont,/* complain_on_overflow */
1079 bfd_elf_generic_reloc, /* special_function */
1080 "R_ARM_ALU_SB_G0_NC", /* name */
1081 FALSE, /* partial_inplace */
1082 0xffffffff, /* src_mask */
1083 0xffffffff, /* dst_mask */
1084 TRUE), /* pcrel_offset */
1086 HOWTO (R_ARM_ALU_SB_G0, /* type */
1087 0, /* rightshift */
1088 2, /* size (0 = byte, 1 = short, 2 = long) */
1089 32, /* bitsize */
1090 TRUE, /* pc_relative */
1091 0, /* bitpos */
1092 complain_overflow_dont,/* complain_on_overflow */
1093 bfd_elf_generic_reloc, /* special_function */
1094 "R_ARM_ALU_SB_G0", /* name */
1095 FALSE, /* partial_inplace */
1096 0xffffffff, /* src_mask */
1097 0xffffffff, /* dst_mask */
1098 TRUE), /* pcrel_offset */
1100 HOWTO (R_ARM_ALU_SB_G1_NC, /* type */
1101 0, /* rightshift */
1102 2, /* size (0 = byte, 1 = short, 2 = long) */
1103 32, /* bitsize */
1104 TRUE, /* pc_relative */
1105 0, /* bitpos */
1106 complain_overflow_dont,/* complain_on_overflow */
1107 bfd_elf_generic_reloc, /* special_function */
1108 "R_ARM_ALU_SB_G1_NC", /* name */
1109 FALSE, /* partial_inplace */
1110 0xffffffff, /* src_mask */
1111 0xffffffff, /* dst_mask */
1112 TRUE), /* pcrel_offset */
1114 HOWTO (R_ARM_ALU_SB_G1, /* type */
1115 0, /* rightshift */
1116 2, /* size (0 = byte, 1 = short, 2 = long) */
1117 32, /* bitsize */
1118 TRUE, /* pc_relative */
1119 0, /* bitpos */
1120 complain_overflow_dont,/* complain_on_overflow */
1121 bfd_elf_generic_reloc, /* special_function */
1122 "R_ARM_ALU_SB_G1", /* name */
1123 FALSE, /* partial_inplace */
1124 0xffffffff, /* src_mask */
1125 0xffffffff, /* dst_mask */
1126 TRUE), /* pcrel_offset */
1128 HOWTO (R_ARM_ALU_SB_G2, /* type */
1129 0, /* rightshift */
1130 2, /* size (0 = byte, 1 = short, 2 = long) */
1131 32, /* bitsize */
1132 TRUE, /* pc_relative */
1133 0, /* bitpos */
1134 complain_overflow_dont,/* complain_on_overflow */
1135 bfd_elf_generic_reloc, /* special_function */
1136 "R_ARM_ALU_SB_G2", /* name */
1137 FALSE, /* partial_inplace */
1138 0xffffffff, /* src_mask */
1139 0xffffffff, /* dst_mask */
1140 TRUE), /* pcrel_offset */
1142 HOWTO (R_ARM_LDR_SB_G0, /* type */
1143 0, /* rightshift */
1144 2, /* size (0 = byte, 1 = short, 2 = long) */
1145 32, /* bitsize */
1146 TRUE, /* pc_relative */
1147 0, /* bitpos */
1148 complain_overflow_dont,/* complain_on_overflow */
1149 bfd_elf_generic_reloc, /* special_function */
1150 "R_ARM_LDR_SB_G0", /* name */
1151 FALSE, /* partial_inplace */
1152 0xffffffff, /* src_mask */
1153 0xffffffff, /* dst_mask */
1154 TRUE), /* pcrel_offset */
1156 HOWTO (R_ARM_LDR_SB_G1, /* type */
1157 0, /* rightshift */
1158 2, /* size (0 = byte, 1 = short, 2 = long) */
1159 32, /* bitsize */
1160 TRUE, /* pc_relative */
1161 0, /* bitpos */
1162 complain_overflow_dont,/* complain_on_overflow */
1163 bfd_elf_generic_reloc, /* special_function */
1164 "R_ARM_LDR_SB_G1", /* name */
1165 FALSE, /* partial_inplace */
1166 0xffffffff, /* src_mask */
1167 0xffffffff, /* dst_mask */
1168 TRUE), /* pcrel_offset */
1170 HOWTO (R_ARM_LDR_SB_G2, /* type */
1171 0, /* rightshift */
1172 2, /* size (0 = byte, 1 = short, 2 = long) */
1173 32, /* bitsize */
1174 TRUE, /* pc_relative */
1175 0, /* bitpos */
1176 complain_overflow_dont,/* complain_on_overflow */
1177 bfd_elf_generic_reloc, /* special_function */
1178 "R_ARM_LDR_SB_G2", /* name */
1179 FALSE, /* partial_inplace */
1180 0xffffffff, /* src_mask */
1181 0xffffffff, /* dst_mask */
1182 TRUE), /* pcrel_offset */
1184 HOWTO (R_ARM_LDRS_SB_G0, /* type */
1185 0, /* rightshift */
1186 2, /* size (0 = byte, 1 = short, 2 = long) */
1187 32, /* bitsize */
1188 TRUE, /* pc_relative */
1189 0, /* bitpos */
1190 complain_overflow_dont,/* complain_on_overflow */
1191 bfd_elf_generic_reloc, /* special_function */
1192 "R_ARM_LDRS_SB_G0", /* name */
1193 FALSE, /* partial_inplace */
1194 0xffffffff, /* src_mask */
1195 0xffffffff, /* dst_mask */
1196 TRUE), /* pcrel_offset */
1198 HOWTO (R_ARM_LDRS_SB_G1, /* type */
1199 0, /* rightshift */
1200 2, /* size (0 = byte, 1 = short, 2 = long) */
1201 32, /* bitsize */
1202 TRUE, /* pc_relative */
1203 0, /* bitpos */
1204 complain_overflow_dont,/* complain_on_overflow */
1205 bfd_elf_generic_reloc, /* special_function */
1206 "R_ARM_LDRS_SB_G1", /* name */
1207 FALSE, /* partial_inplace */
1208 0xffffffff, /* src_mask */
1209 0xffffffff, /* dst_mask */
1210 TRUE), /* pcrel_offset */
1212 HOWTO (R_ARM_LDRS_SB_G2, /* type */
1213 0, /* rightshift */
1214 2, /* size (0 = byte, 1 = short, 2 = long) */
1215 32, /* bitsize */
1216 TRUE, /* pc_relative */
1217 0, /* bitpos */
1218 complain_overflow_dont,/* complain_on_overflow */
1219 bfd_elf_generic_reloc, /* special_function */
1220 "R_ARM_LDRS_SB_G2", /* name */
1221 FALSE, /* partial_inplace */
1222 0xffffffff, /* src_mask */
1223 0xffffffff, /* dst_mask */
1224 TRUE), /* pcrel_offset */
1226 HOWTO (R_ARM_LDC_SB_G0, /* type */
1227 0, /* rightshift */
1228 2, /* size (0 = byte, 1 = short, 2 = long) */
1229 32, /* bitsize */
1230 TRUE, /* pc_relative */
1231 0, /* bitpos */
1232 complain_overflow_dont,/* complain_on_overflow */
1233 bfd_elf_generic_reloc, /* special_function */
1234 "R_ARM_LDC_SB_G0", /* name */
1235 FALSE, /* partial_inplace */
1236 0xffffffff, /* src_mask */
1237 0xffffffff, /* dst_mask */
1238 TRUE), /* pcrel_offset */
1240 HOWTO (R_ARM_LDC_SB_G1, /* type */
1241 0, /* rightshift */
1242 2, /* size (0 = byte, 1 = short, 2 = long) */
1243 32, /* bitsize */
1244 TRUE, /* pc_relative */
1245 0, /* bitpos */
1246 complain_overflow_dont,/* complain_on_overflow */
1247 bfd_elf_generic_reloc, /* special_function */
1248 "R_ARM_LDC_SB_G1", /* name */
1249 FALSE, /* partial_inplace */
1250 0xffffffff, /* src_mask */
1251 0xffffffff, /* dst_mask */
1252 TRUE), /* pcrel_offset */
1254 HOWTO (R_ARM_LDC_SB_G2, /* type */
1255 0, /* rightshift */
1256 2, /* size (0 = byte, 1 = short, 2 = long) */
1257 32, /* bitsize */
1258 TRUE, /* pc_relative */
1259 0, /* bitpos */
1260 complain_overflow_dont,/* complain_on_overflow */
1261 bfd_elf_generic_reloc, /* special_function */
1262 "R_ARM_LDC_SB_G2", /* name */
1263 FALSE, /* partial_inplace */
1264 0xffffffff, /* src_mask */
1265 0xffffffff, /* dst_mask */
1266 TRUE), /* pcrel_offset */
1268 /* End of group relocations. */
1270 HOWTO (R_ARM_MOVW_BREL_NC, /* type */
1271 0, /* rightshift */
1272 2, /* size (0 = byte, 1 = short, 2 = long) */
1273 16, /* bitsize */
1274 FALSE, /* pc_relative */
1275 0, /* bitpos */
1276 complain_overflow_dont,/* complain_on_overflow */
1277 bfd_elf_generic_reloc, /* special_function */
1278 "R_ARM_MOVW_BREL_NC", /* name */
1279 FALSE, /* partial_inplace */
1280 0x0000ffff, /* src_mask */
1281 0x0000ffff, /* dst_mask */
1282 FALSE), /* pcrel_offset */
1284 HOWTO (R_ARM_MOVT_BREL, /* type */
1285 0, /* rightshift */
1286 2, /* size (0 = byte, 1 = short, 2 = long) */
1287 16, /* bitsize */
1288 FALSE, /* pc_relative */
1289 0, /* bitpos */
1290 complain_overflow_bitfield,/* complain_on_overflow */
1291 bfd_elf_generic_reloc, /* special_function */
1292 "R_ARM_MOVT_BREL", /* name */
1293 FALSE, /* partial_inplace */
1294 0x0000ffff, /* src_mask */
1295 0x0000ffff, /* dst_mask */
1296 FALSE), /* pcrel_offset */
1298 HOWTO (R_ARM_MOVW_BREL, /* type */
1299 0, /* rightshift */
1300 2, /* size (0 = byte, 1 = short, 2 = long) */
1301 16, /* bitsize */
1302 FALSE, /* pc_relative */
1303 0, /* bitpos */
1304 complain_overflow_dont,/* complain_on_overflow */
1305 bfd_elf_generic_reloc, /* special_function */
1306 "R_ARM_MOVW_BREL", /* name */
1307 FALSE, /* partial_inplace */
1308 0x0000ffff, /* src_mask */
1309 0x0000ffff, /* dst_mask */
1310 FALSE), /* pcrel_offset */
1312 HOWTO (R_ARM_THM_MOVW_BREL_NC,/* type */
1313 0, /* rightshift */
1314 2, /* size (0 = byte, 1 = short, 2 = long) */
1315 16, /* bitsize */
1316 FALSE, /* pc_relative */
1317 0, /* bitpos */
1318 complain_overflow_dont,/* complain_on_overflow */
1319 bfd_elf_generic_reloc, /* special_function */
1320 "R_ARM_THM_MOVW_BREL_NC",/* name */
1321 FALSE, /* partial_inplace */
1322 0x040f70ff, /* src_mask */
1323 0x040f70ff, /* dst_mask */
1324 FALSE), /* pcrel_offset */
1326 HOWTO (R_ARM_THM_MOVT_BREL, /* type */
1327 0, /* rightshift */
1328 2, /* size (0 = byte, 1 = short, 2 = long) */
1329 16, /* bitsize */
1330 FALSE, /* pc_relative */
1331 0, /* bitpos */
1332 complain_overflow_bitfield,/* complain_on_overflow */
1333 bfd_elf_generic_reloc, /* special_function */
1334 "R_ARM_THM_MOVT_BREL", /* name */
1335 FALSE, /* partial_inplace */
1336 0x040f70ff, /* src_mask */
1337 0x040f70ff, /* dst_mask */
1338 FALSE), /* pcrel_offset */
1340 HOWTO (R_ARM_THM_MOVW_BREL, /* type */
1341 0, /* rightshift */
1342 2, /* size (0 = byte, 1 = short, 2 = long) */
1343 16, /* bitsize */
1344 FALSE, /* pc_relative */
1345 0, /* bitpos */
1346 complain_overflow_dont,/* complain_on_overflow */
1347 bfd_elf_generic_reloc, /* special_function */
1348 "R_ARM_THM_MOVW_BREL", /* name */
1349 FALSE, /* partial_inplace */
1350 0x040f70ff, /* src_mask */
1351 0x040f70ff, /* dst_mask */
1352 FALSE), /* pcrel_offset */
1354 EMPTY_HOWTO (90), /* unallocated */
1355 EMPTY_HOWTO (91),
1356 EMPTY_HOWTO (92),
1357 EMPTY_HOWTO (93),
1359 HOWTO (R_ARM_PLT32_ABS, /* type */
1360 0, /* rightshift */
1361 2, /* size (0 = byte, 1 = short, 2 = long) */
1362 32, /* bitsize */
1363 FALSE, /* pc_relative */
1364 0, /* bitpos */
1365 complain_overflow_dont,/* complain_on_overflow */
1366 bfd_elf_generic_reloc, /* special_function */
1367 "R_ARM_PLT32_ABS", /* name */
1368 FALSE, /* partial_inplace */
1369 0xffffffff, /* src_mask */
1370 0xffffffff, /* dst_mask */
1371 FALSE), /* pcrel_offset */
1373 HOWTO (R_ARM_GOT_ABS, /* type */
1374 0, /* rightshift */
1375 2, /* size (0 = byte, 1 = short, 2 = long) */
1376 32, /* bitsize */
1377 FALSE, /* pc_relative */
1378 0, /* bitpos */
1379 complain_overflow_dont,/* complain_on_overflow */
1380 bfd_elf_generic_reloc, /* special_function */
1381 "R_ARM_GOT_ABS", /* name */
1382 FALSE, /* partial_inplace */
1383 0xffffffff, /* src_mask */
1384 0xffffffff, /* dst_mask */
1385 FALSE), /* pcrel_offset */
1387 HOWTO (R_ARM_GOT_PREL, /* type */
1388 0, /* rightshift */
1389 2, /* size (0 = byte, 1 = short, 2 = long) */
1390 32, /* bitsize */
1391 TRUE, /* pc_relative */
1392 0, /* bitpos */
1393 complain_overflow_dont, /* complain_on_overflow */
1394 bfd_elf_generic_reloc, /* special_function */
1395 "R_ARM_GOT_PREL", /* name */
1396 FALSE, /* partial_inplace */
1397 0xffffffff, /* src_mask */
1398 0xffffffff, /* dst_mask */
1399 TRUE), /* pcrel_offset */
1401 HOWTO (R_ARM_GOT_BREL12, /* type */
1402 0, /* rightshift */
1403 2, /* size (0 = byte, 1 = short, 2 = long) */
1404 12, /* bitsize */
1405 FALSE, /* pc_relative */
1406 0, /* bitpos */
1407 complain_overflow_bitfield,/* complain_on_overflow */
1408 bfd_elf_generic_reloc, /* special_function */
1409 "R_ARM_GOT_BREL12", /* name */
1410 FALSE, /* partial_inplace */
1411 0x00000fff, /* src_mask */
1412 0x00000fff, /* dst_mask */
1413 FALSE), /* pcrel_offset */
1415 HOWTO (R_ARM_GOTOFF12, /* type */
1416 0, /* rightshift */
1417 2, /* size (0 = byte, 1 = short, 2 = long) */
1418 12, /* bitsize */
1419 FALSE, /* pc_relative */
1420 0, /* bitpos */
1421 complain_overflow_bitfield,/* complain_on_overflow */
1422 bfd_elf_generic_reloc, /* special_function */
1423 "R_ARM_GOTOFF12", /* name */
1424 FALSE, /* partial_inplace */
1425 0x00000fff, /* src_mask */
1426 0x00000fff, /* dst_mask */
1427 FALSE), /* pcrel_offset */
1429 EMPTY_HOWTO (R_ARM_GOTRELAX), /* reserved for future GOT-load optimizations */
1431 /* GNU extension to record C++ vtable member usage */
1432 HOWTO (R_ARM_GNU_VTENTRY, /* type */
1433 0, /* rightshift */
1434 2, /* size (0 = byte, 1 = short, 2 = long) */
1435 0, /* bitsize */
1436 FALSE, /* pc_relative */
1437 0, /* bitpos */
1438 complain_overflow_dont, /* complain_on_overflow */
1439 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1440 "R_ARM_GNU_VTENTRY", /* name */
1441 FALSE, /* partial_inplace */
1442 0, /* src_mask */
1443 0, /* dst_mask */
1444 FALSE), /* pcrel_offset */
1446 /* GNU extension to record C++ vtable hierarchy */
1447 HOWTO (R_ARM_GNU_VTINHERIT, /* type */
1448 0, /* rightshift */
1449 2, /* size (0 = byte, 1 = short, 2 = long) */
1450 0, /* bitsize */
1451 FALSE, /* pc_relative */
1452 0, /* bitpos */
1453 complain_overflow_dont, /* complain_on_overflow */
1454 NULL, /* special_function */
1455 "R_ARM_GNU_VTINHERIT", /* name */
1456 FALSE, /* partial_inplace */
1457 0, /* src_mask */
1458 0, /* dst_mask */
1459 FALSE), /* pcrel_offset */
1461 HOWTO (R_ARM_THM_JUMP11, /* type */
1462 1, /* rightshift */
1463 1, /* size (0 = byte, 1 = short, 2 = long) */
1464 11, /* bitsize */
1465 TRUE, /* pc_relative */
1466 0, /* bitpos */
1467 complain_overflow_signed, /* complain_on_overflow */
1468 bfd_elf_generic_reloc, /* special_function */
1469 "R_ARM_THM_JUMP11", /* name */
1470 FALSE, /* partial_inplace */
1471 0x000007ff, /* src_mask */
1472 0x000007ff, /* dst_mask */
1473 TRUE), /* pcrel_offset */
1475 HOWTO (R_ARM_THM_JUMP8, /* type */
1476 1, /* rightshift */
1477 1, /* size (0 = byte, 1 = short, 2 = long) */
1478 8, /* bitsize */
1479 TRUE, /* pc_relative */
1480 0, /* bitpos */
1481 complain_overflow_signed, /* complain_on_overflow */
1482 bfd_elf_generic_reloc, /* special_function */
1483 "R_ARM_THM_JUMP8", /* name */
1484 FALSE, /* partial_inplace */
1485 0x000000ff, /* src_mask */
1486 0x000000ff, /* dst_mask */
1487 TRUE), /* pcrel_offset */
1489 /* TLS relocations */
1490 HOWTO (R_ARM_TLS_GD32, /* type */
1491 0, /* rightshift */
1492 2, /* size (0 = byte, 1 = short, 2 = long) */
1493 32, /* bitsize */
1494 FALSE, /* pc_relative */
1495 0, /* bitpos */
1496 complain_overflow_bitfield,/* complain_on_overflow */
1497 NULL, /* special_function */
1498 "R_ARM_TLS_GD32", /* name */
1499 TRUE, /* partial_inplace */
1500 0xffffffff, /* src_mask */
1501 0xffffffff, /* dst_mask */
1502 FALSE), /* pcrel_offset */
1504 HOWTO (R_ARM_TLS_LDM32, /* type */
1505 0, /* rightshift */
1506 2, /* size (0 = byte, 1 = short, 2 = long) */
1507 32, /* bitsize */
1508 FALSE, /* pc_relative */
1509 0, /* bitpos */
1510 complain_overflow_bitfield,/* complain_on_overflow */
1511 bfd_elf_generic_reloc, /* special_function */
1512 "R_ARM_TLS_LDM32", /* name */
1513 TRUE, /* partial_inplace */
1514 0xffffffff, /* src_mask */
1515 0xffffffff, /* dst_mask */
1516 FALSE), /* pcrel_offset */
1518 HOWTO (R_ARM_TLS_LDO32, /* type */
1519 0, /* rightshift */
1520 2, /* size (0 = byte, 1 = short, 2 = long) */
1521 32, /* bitsize */
1522 FALSE, /* pc_relative */
1523 0, /* bitpos */
1524 complain_overflow_bitfield,/* complain_on_overflow */
1525 bfd_elf_generic_reloc, /* special_function */
1526 "R_ARM_TLS_LDO32", /* name */
1527 TRUE, /* partial_inplace */
1528 0xffffffff, /* src_mask */
1529 0xffffffff, /* dst_mask */
1530 FALSE), /* pcrel_offset */
1532 HOWTO (R_ARM_TLS_IE32, /* type */
1533 0, /* rightshift */
1534 2, /* size (0 = byte, 1 = short, 2 = long) */
1535 32, /* bitsize */
1536 FALSE, /* pc_relative */
1537 0, /* bitpos */
1538 complain_overflow_bitfield,/* complain_on_overflow */
1539 NULL, /* special_function */
1540 "R_ARM_TLS_IE32", /* name */
1541 TRUE, /* partial_inplace */
1542 0xffffffff, /* src_mask */
1543 0xffffffff, /* dst_mask */
1544 FALSE), /* pcrel_offset */
1546 HOWTO (R_ARM_TLS_LE32, /* type */
1547 0, /* rightshift */
1548 2, /* size (0 = byte, 1 = short, 2 = long) */
1549 32, /* bitsize */
1550 FALSE, /* pc_relative */
1551 0, /* bitpos */
1552 complain_overflow_bitfield,/* complain_on_overflow */
1553 bfd_elf_generic_reloc, /* special_function */
1554 "R_ARM_TLS_LE32", /* name */
1555 TRUE, /* partial_inplace */
1556 0xffffffff, /* src_mask */
1557 0xffffffff, /* dst_mask */
1558 FALSE), /* pcrel_offset */
1560 HOWTO (R_ARM_TLS_LDO12, /* type */
1561 0, /* rightshift */
1562 2, /* size (0 = byte, 1 = short, 2 = long) */
1563 12, /* bitsize */
1564 FALSE, /* pc_relative */
1565 0, /* bitpos */
1566 complain_overflow_bitfield,/* complain_on_overflow */
1567 bfd_elf_generic_reloc, /* special_function */
1568 "R_ARM_TLS_LDO12", /* name */
1569 FALSE, /* partial_inplace */
1570 0x00000fff, /* src_mask */
1571 0x00000fff, /* dst_mask */
1572 FALSE), /* pcrel_offset */
1574 HOWTO (R_ARM_TLS_LE12, /* type */
1575 0, /* rightshift */
1576 2, /* size (0 = byte, 1 = short, 2 = long) */
1577 12, /* bitsize */
1578 FALSE, /* pc_relative */
1579 0, /* bitpos */
1580 complain_overflow_bitfield,/* complain_on_overflow */
1581 bfd_elf_generic_reloc, /* special_function */
1582 "R_ARM_TLS_LE12", /* name */
1583 FALSE, /* partial_inplace */
1584 0x00000fff, /* src_mask */
1585 0x00000fff, /* dst_mask */
1586 FALSE), /* pcrel_offset */
1588 HOWTO (R_ARM_TLS_IE12GP, /* type */
1589 0, /* rightshift */
1590 2, /* size (0 = byte, 1 = short, 2 = long) */
1591 12, /* bitsize */
1592 FALSE, /* pc_relative */
1593 0, /* bitpos */
1594 complain_overflow_bitfield,/* complain_on_overflow */
1595 bfd_elf_generic_reloc, /* special_function */
1596 "R_ARM_TLS_IE12GP", /* name */
1597 FALSE, /* partial_inplace */
1598 0x00000fff, /* src_mask */
1599 0x00000fff, /* dst_mask */
1600 FALSE), /* pcrel_offset */
1603 /* 112-127 private relocations
1604 128 R_ARM_ME_TOO, obsolete
1605 129-255 unallocated in AAELF.
1607 249-255 extended, currently unused, relocations: */
1609 static reloc_howto_type elf32_arm_howto_table_2[4] =
1611 HOWTO (R_ARM_RREL32, /* type */
1612 0, /* rightshift */
1613 0, /* size (0 = byte, 1 = short, 2 = long) */
1614 0, /* bitsize */
1615 FALSE, /* pc_relative */
1616 0, /* bitpos */
1617 complain_overflow_dont,/* complain_on_overflow */
1618 bfd_elf_generic_reloc, /* special_function */
1619 "R_ARM_RREL32", /* name */
1620 FALSE, /* partial_inplace */
1621 0, /* src_mask */
1622 0, /* dst_mask */
1623 FALSE), /* pcrel_offset */
1625 HOWTO (R_ARM_RABS32, /* type */
1626 0, /* rightshift */
1627 0, /* size (0 = byte, 1 = short, 2 = long) */
1628 0, /* bitsize */
1629 FALSE, /* pc_relative */
1630 0, /* bitpos */
1631 complain_overflow_dont,/* complain_on_overflow */
1632 bfd_elf_generic_reloc, /* special_function */
1633 "R_ARM_RABS32", /* name */
1634 FALSE, /* partial_inplace */
1635 0, /* src_mask */
1636 0, /* dst_mask */
1637 FALSE), /* pcrel_offset */
1639 HOWTO (R_ARM_RPC24, /* type */
1640 0, /* rightshift */
1641 0, /* size (0 = byte, 1 = short, 2 = long) */
1642 0, /* bitsize */
1643 FALSE, /* pc_relative */
1644 0, /* bitpos */
1645 complain_overflow_dont,/* complain_on_overflow */
1646 bfd_elf_generic_reloc, /* special_function */
1647 "R_ARM_RPC24", /* name */
1648 FALSE, /* partial_inplace */
1649 0, /* src_mask */
1650 0, /* dst_mask */
1651 FALSE), /* pcrel_offset */
1653 HOWTO (R_ARM_RBASE, /* type */
1654 0, /* rightshift */
1655 0, /* size (0 = byte, 1 = short, 2 = long) */
1656 0, /* bitsize */
1657 FALSE, /* pc_relative */
1658 0, /* bitpos */
1659 complain_overflow_dont,/* complain_on_overflow */
1660 bfd_elf_generic_reloc, /* special_function */
1661 "R_ARM_RBASE", /* name */
1662 FALSE, /* partial_inplace */
1663 0, /* src_mask */
1664 0, /* dst_mask */
1665 FALSE) /* pcrel_offset */
1668 static reloc_howto_type *
1669 elf32_arm_howto_from_type (unsigned int r_type)
1671 if (r_type < NUM_ELEM (elf32_arm_howto_table_1))
1672 return &elf32_arm_howto_table_1[r_type];
1674 if (r_type >= R_ARM_RREL32
1675 && r_type < R_ARM_RREL32 + NUM_ELEM (elf32_arm_howto_table_2))
1676 return &elf32_arm_howto_table_2[r_type - R_ARM_RREL32];
1678 return NULL;
1681 static void
1682 elf32_arm_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED, arelent * bfd_reloc,
1683 Elf_Internal_Rela * elf_reloc)
1685 unsigned int r_type;
1687 r_type = ELF32_R_TYPE (elf_reloc->r_info);
1688 bfd_reloc->howto = elf32_arm_howto_from_type (r_type);
1691 struct elf32_arm_reloc_map
1693 bfd_reloc_code_real_type bfd_reloc_val;
1694 unsigned char elf_reloc_val;
1697 /* All entries in this list must also be present in elf32_arm_howto_table. */
1698 static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
1700 {BFD_RELOC_NONE, R_ARM_NONE},
1701 {BFD_RELOC_ARM_PCREL_BRANCH, R_ARM_PC24},
1702 {BFD_RELOC_ARM_PCREL_CALL, R_ARM_CALL},
1703 {BFD_RELOC_ARM_PCREL_JUMP, R_ARM_JUMP24},
1704 {BFD_RELOC_ARM_PCREL_BLX, R_ARM_XPC25},
1705 {BFD_RELOC_THUMB_PCREL_BLX, R_ARM_THM_XPC22},
1706 {BFD_RELOC_32, R_ARM_ABS32},
1707 {BFD_RELOC_32_PCREL, R_ARM_REL32},
1708 {BFD_RELOC_8, R_ARM_ABS8},
1709 {BFD_RELOC_16, R_ARM_ABS16},
1710 {BFD_RELOC_ARM_OFFSET_IMM, R_ARM_ABS12},
1711 {BFD_RELOC_ARM_THUMB_OFFSET, R_ARM_THM_ABS5},
1712 {BFD_RELOC_THUMB_PCREL_BRANCH25, R_ARM_THM_JUMP24},
1713 {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_CALL},
1714 {BFD_RELOC_THUMB_PCREL_BRANCH12, R_ARM_THM_JUMP11},
1715 {BFD_RELOC_THUMB_PCREL_BRANCH20, R_ARM_THM_JUMP19},
1716 {BFD_RELOC_THUMB_PCREL_BRANCH9, R_ARM_THM_JUMP8},
1717 {BFD_RELOC_THUMB_PCREL_BRANCH7, R_ARM_THM_JUMP6},
1718 {BFD_RELOC_ARM_GLOB_DAT, R_ARM_GLOB_DAT},
1719 {BFD_RELOC_ARM_JUMP_SLOT, R_ARM_JUMP_SLOT},
1720 {BFD_RELOC_ARM_RELATIVE, R_ARM_RELATIVE},
1721 {BFD_RELOC_ARM_GOTOFF, R_ARM_GOTOFF32},
1722 {BFD_RELOC_ARM_GOTPC, R_ARM_GOTPC},
1723 {BFD_RELOC_ARM_GOT32, R_ARM_GOT32},
1724 {BFD_RELOC_ARM_PLT32, R_ARM_PLT32},
1725 {BFD_RELOC_ARM_TARGET1, R_ARM_TARGET1},
1726 {BFD_RELOC_ARM_ROSEGREL32, R_ARM_ROSEGREL32},
1727 {BFD_RELOC_ARM_SBREL32, R_ARM_SBREL32},
1728 {BFD_RELOC_ARM_PREL31, R_ARM_PREL31},
1729 {BFD_RELOC_ARM_TARGET2, R_ARM_TARGET2},
1730 {BFD_RELOC_ARM_PLT32, R_ARM_PLT32},
1731 {BFD_RELOC_ARM_TLS_GD32, R_ARM_TLS_GD32},
1732 {BFD_RELOC_ARM_TLS_LDO32, R_ARM_TLS_LDO32},
1733 {BFD_RELOC_ARM_TLS_LDM32, R_ARM_TLS_LDM32},
1734 {BFD_RELOC_ARM_TLS_DTPMOD32, R_ARM_TLS_DTPMOD32},
1735 {BFD_RELOC_ARM_TLS_DTPOFF32, R_ARM_TLS_DTPOFF32},
1736 {BFD_RELOC_ARM_TLS_TPOFF32, R_ARM_TLS_TPOFF32},
1737 {BFD_RELOC_ARM_TLS_IE32, R_ARM_TLS_IE32},
1738 {BFD_RELOC_ARM_TLS_LE32, R_ARM_TLS_LE32},
1739 {BFD_RELOC_VTABLE_INHERIT, R_ARM_GNU_VTINHERIT},
1740 {BFD_RELOC_VTABLE_ENTRY, R_ARM_GNU_VTENTRY},
1741 {BFD_RELOC_ARM_MOVW, R_ARM_MOVW_ABS_NC},
1742 {BFD_RELOC_ARM_MOVT, R_ARM_MOVT_ABS},
1743 {BFD_RELOC_ARM_MOVW_PCREL, R_ARM_MOVW_PREL_NC},
1744 {BFD_RELOC_ARM_MOVT_PCREL, R_ARM_MOVT_PREL},
1745 {BFD_RELOC_ARM_THUMB_MOVW, R_ARM_THM_MOVW_ABS_NC},
1746 {BFD_RELOC_ARM_THUMB_MOVT, R_ARM_THM_MOVT_ABS},
1747 {BFD_RELOC_ARM_THUMB_MOVW_PCREL, R_ARM_THM_MOVW_PREL_NC},
1748 {BFD_RELOC_ARM_THUMB_MOVT_PCREL, R_ARM_THM_MOVT_PREL},
1749 {BFD_RELOC_ARM_ALU_PC_G0_NC, R_ARM_ALU_PC_G0_NC},
1750 {BFD_RELOC_ARM_ALU_PC_G0, R_ARM_ALU_PC_G0},
1751 {BFD_RELOC_ARM_ALU_PC_G1_NC, R_ARM_ALU_PC_G1_NC},
1752 {BFD_RELOC_ARM_ALU_PC_G1, R_ARM_ALU_PC_G1},
1753 {BFD_RELOC_ARM_ALU_PC_G2, R_ARM_ALU_PC_G2},
1754 {BFD_RELOC_ARM_LDR_PC_G0, R_ARM_LDR_PC_G0},
1755 {BFD_RELOC_ARM_LDR_PC_G1, R_ARM_LDR_PC_G1},
1756 {BFD_RELOC_ARM_LDR_PC_G2, R_ARM_LDR_PC_G2},
1757 {BFD_RELOC_ARM_LDRS_PC_G0, R_ARM_LDRS_PC_G0},
1758 {BFD_RELOC_ARM_LDRS_PC_G1, R_ARM_LDRS_PC_G1},
1759 {BFD_RELOC_ARM_LDRS_PC_G2, R_ARM_LDRS_PC_G2},
1760 {BFD_RELOC_ARM_LDC_PC_G0, R_ARM_LDC_PC_G0},
1761 {BFD_RELOC_ARM_LDC_PC_G1, R_ARM_LDC_PC_G1},
1762 {BFD_RELOC_ARM_LDC_PC_G2, R_ARM_LDC_PC_G2},
1763 {BFD_RELOC_ARM_ALU_SB_G0_NC, R_ARM_ALU_SB_G0_NC},
1764 {BFD_RELOC_ARM_ALU_SB_G0, R_ARM_ALU_SB_G0},
1765 {BFD_RELOC_ARM_ALU_SB_G1_NC, R_ARM_ALU_SB_G1_NC},
1766 {BFD_RELOC_ARM_ALU_SB_G1, R_ARM_ALU_SB_G1},
1767 {BFD_RELOC_ARM_ALU_SB_G2, R_ARM_ALU_SB_G2},
1768 {BFD_RELOC_ARM_LDR_SB_G0, R_ARM_LDR_SB_G0},
1769 {BFD_RELOC_ARM_LDR_SB_G1, R_ARM_LDR_SB_G1},
1770 {BFD_RELOC_ARM_LDR_SB_G2, R_ARM_LDR_SB_G2},
1771 {BFD_RELOC_ARM_LDRS_SB_G0, R_ARM_LDRS_SB_G0},
1772 {BFD_RELOC_ARM_LDRS_SB_G1, R_ARM_LDRS_SB_G1},
1773 {BFD_RELOC_ARM_LDRS_SB_G2, R_ARM_LDRS_SB_G2},
1774 {BFD_RELOC_ARM_LDC_SB_G0, R_ARM_LDC_SB_G0},
1775 {BFD_RELOC_ARM_LDC_SB_G1, R_ARM_LDC_SB_G1},
1776 {BFD_RELOC_ARM_LDC_SB_G2, R_ARM_LDC_SB_G2}
1779 static reloc_howto_type *
1780 elf32_arm_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1781 bfd_reloc_code_real_type code)
1783 unsigned int i;
1784 for (i = 0; i < NUM_ELEM (elf32_arm_reloc_map); i ++)
1785 if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
1786 return elf32_arm_howto_from_type (elf32_arm_reloc_map[i].elf_reloc_val);
1788 return NULL;
1791 /* Support for core dump NOTE sections */
1792 static bfd_boolean
1793 elf32_arm_nabi_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1795 int offset;
1796 size_t size;
1798 switch (note->descsz)
1800 default:
1801 return FALSE;
1803 case 148: /* Linux/ARM 32-bit*/
1804 /* pr_cursig */
1805 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1807 /* pr_pid */
1808 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1810 /* pr_reg */
1811 offset = 72;
1812 size = 72;
1814 break;
1817 /* Make a ".reg/999" section. */
1818 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1819 size, note->descpos + offset);
1822 static bfd_boolean
1823 elf32_arm_nabi_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1825 switch (note->descsz)
1827 default:
1828 return FALSE;
1830 case 124: /* Linux/ARM elf_prpsinfo */
1831 elf_tdata (abfd)->core_program
1832 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1833 elf_tdata (abfd)->core_command
1834 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1837 /* Note that for some reason, a spurious space is tacked
1838 onto the end of the args in some (at least one anyway)
1839 implementations, so strip it off if it exists. */
1842 char *command = elf_tdata (abfd)->core_command;
1843 int n = strlen (command);
1845 if (0 < n && command[n - 1] == ' ')
1846 command[n - 1] = '\0';
1849 return TRUE;
1852 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vec
1853 #define TARGET_LITTLE_NAME "elf32-littlearm"
1854 #define TARGET_BIG_SYM bfd_elf32_bigarm_vec
1855 #define TARGET_BIG_NAME "elf32-bigarm"
1857 #define elf_backend_grok_prstatus elf32_arm_nabi_grok_prstatus
1858 #define elf_backend_grok_psinfo elf32_arm_nabi_grok_psinfo
1860 typedef unsigned long int insn32;
1861 typedef unsigned short int insn16;
1863 /* In lieu of proper flags, assume all EABIv4 or later objects are
1864 interworkable. */
1865 #define INTERWORK_FLAG(abfd) \
1866 (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) >= EF_ARM_EABI_VER4 \
1867 || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK))
1869 /* The linker script knows the section names for placement.
1870 The entry_names are used to do simple name mangling on the stubs.
1871 Given a function name, and its type, the stub can be found. The
1872 name can be changed. The only requirement is the %s be present. */
1873 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
1874 #define THUMB2ARM_GLUE_ENTRY_NAME "__%s_from_thumb"
1876 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
1877 #define ARM2THUMB_GLUE_ENTRY_NAME "__%s_from_arm"
1879 /* The name of the dynamic interpreter. This is put in the .interp
1880 section. */
1881 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
1883 #ifdef FOUR_WORD_PLT
1885 /* The first entry in a procedure linkage table looks like
1886 this. It is set up so that any shared library function that is
1887 called before the relocation has been set up calls the dynamic
1888 linker first. */
1889 static const bfd_vma elf32_arm_plt0_entry [] =
1891 0xe52de004, /* str lr, [sp, #-4]! */
1892 0xe59fe010, /* ldr lr, [pc, #16] */
1893 0xe08fe00e, /* add lr, pc, lr */
1894 0xe5bef008, /* ldr pc, [lr, #8]! */
1897 /* Subsequent entries in a procedure linkage table look like
1898 this. */
1899 static const bfd_vma elf32_arm_plt_entry [] =
1901 0xe28fc600, /* add ip, pc, #NN */
1902 0xe28cca00, /* add ip, ip, #NN */
1903 0xe5bcf000, /* ldr pc, [ip, #NN]! */
1904 0x00000000, /* unused */
1907 #else
1909 /* The first entry in a procedure linkage table looks like
1910 this. It is set up so that any shared library function that is
1911 called before the relocation has been set up calls the dynamic
1912 linker first. */
1913 static const bfd_vma elf32_arm_plt0_entry [] =
1915 0xe52de004, /* str lr, [sp, #-4]! */
1916 0xe59fe004, /* ldr lr, [pc, #4] */
1917 0xe08fe00e, /* add lr, pc, lr */
1918 0xe5bef008, /* ldr pc, [lr, #8]! */
1919 0x00000000, /* &GOT[0] - . */
1922 /* Subsequent entries in a procedure linkage table look like
1923 this. */
1924 static const bfd_vma elf32_arm_plt_entry [] =
1926 0xe28fc600, /* add ip, pc, #0xNN00000 */
1927 0xe28cca00, /* add ip, ip, #0xNN000 */
1928 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */
1931 #endif
1933 /* The format of the first entry in the procedure linkage table
1934 for a VxWorks executable. */
1935 static const bfd_vma elf32_arm_vxworks_exec_plt0_entry[] =
1937 0xe52dc008, /* str ip,[sp,#-8]! */
1938 0xe59fc000, /* ldr ip,[pc] */
1939 0xe59cf008, /* ldr pc,[ip,#8] */
1940 0x00000000, /* .long _GLOBAL_OFFSET_TABLE_ */
1943 /* The format of subsequent entries in a VxWorks executable. */
1944 static const bfd_vma elf32_arm_vxworks_exec_plt_entry[] =
1946 0xe59fc000, /* ldr ip,[pc] */
1947 0xe59cf000, /* ldr pc,[ip] */
1948 0x00000000, /* .long @got */
1949 0xe59fc000, /* ldr ip,[pc] */
1950 0xea000000, /* b _PLT */
1951 0x00000000, /* .long @pltindex*sizeof(Elf32_Rela) */
1954 /* The format of entries in a VxWorks shared library. */
1955 static const bfd_vma elf32_arm_vxworks_shared_plt_entry[] =
1957 0xe59fc000, /* ldr ip,[pc] */
1958 0xe79cf009, /* ldr pc,[ip,r9] */
1959 0x00000000, /* .long @got */
1960 0xe59fc000, /* ldr ip,[pc] */
1961 0xe599f008, /* ldr pc,[r9,#8] */
1962 0x00000000, /* .long @pltindex*sizeof(Elf32_Rela) */
1965 /* An initial stub used if the PLT entry is referenced from Thumb code. */
1966 #define PLT_THUMB_STUB_SIZE 4
1967 static const bfd_vma elf32_arm_plt_thumb_stub [] =
1969 0x4778, /* bx pc */
1970 0x46c0 /* nop */
1973 /* The entries in a PLT when using a DLL-based target with multiple
1974 address spaces. */
1975 static const bfd_vma elf32_arm_symbian_plt_entry [] =
1977 0xe51ff004, /* ldr pc, [pc, #-4] */
1978 0x00000000, /* dcd R_ARM_GLOB_DAT(X) */
1981 /* Used to build a map of a section. This is required for mixed-endian
1982 code/data. */
1984 typedef struct elf32_elf_section_map
1986 bfd_vma vma;
1987 char type;
1989 elf32_arm_section_map;
1991 typedef struct _arm_elf_section_data
1993 struct bfd_elf_section_data elf;
1994 unsigned int mapcount;
1995 elf32_arm_section_map *map;
1997 _arm_elf_section_data;
1999 #define elf32_arm_section_data(sec) \
2000 ((_arm_elf_section_data *) elf_section_data (sec))
2002 /* The size of the thread control block. */
2003 #define TCB_SIZE 8
2005 #define NUM_KNOWN_ATTRIBUTES 32
2007 typedef struct aeabi_attribute
2009 int type;
2010 unsigned int i;
2011 char *s;
2012 } aeabi_attribute;
2014 typedef struct aeabi_attribute_list
2016 struct aeabi_attribute_list *next;
2017 int tag;
2018 aeabi_attribute attr;
2019 } aeabi_attribute_list;
2021 struct elf32_arm_obj_tdata
2023 struct elf_obj_tdata root;
2025 /* tls_type for each local got entry. */
2026 char *local_got_tls_type;
2028 aeabi_attribute known_eabi_attributes[NUM_KNOWN_ATTRIBUTES];
2029 aeabi_attribute_list *other_eabi_attributes;
2032 #define elf32_arm_tdata(abfd) \
2033 ((struct elf32_arm_obj_tdata *) (abfd)->tdata.any)
2035 #define elf32_arm_local_got_tls_type(abfd) \
2036 (elf32_arm_tdata (abfd)->local_got_tls_type)
2038 static bfd_boolean
2039 elf32_arm_mkobject (bfd *abfd)
2041 if (abfd->tdata.any == NULL)
2043 bfd_size_type amt = sizeof (struct elf32_arm_obj_tdata);
2044 abfd->tdata.any = bfd_zalloc (abfd, amt);
2045 if (abfd->tdata.any == NULL)
2046 return FALSE;
2048 return bfd_elf_mkobject (abfd);
2051 /* The ARM linker needs to keep track of the number of relocs that it
2052 decides to copy in check_relocs for each symbol. This is so that
2053 it can discard PC relative relocs if it doesn't need them when
2054 linking with -Bsymbolic. We store the information in a field
2055 extending the regular ELF linker hash table. */
2057 /* This structure keeps track of the number of relocs we have copied
2058 for a given symbol. */
2059 struct elf32_arm_relocs_copied
2061 /* Next section. */
2062 struct elf32_arm_relocs_copied * next;
2063 /* A section in dynobj. */
2064 asection * section;
2065 /* Number of relocs copied in this section. */
2066 bfd_size_type count;
2067 /* Number of PC-relative relocs copied in this section. */
2068 bfd_size_type pc_count;
2071 #define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
2073 /* Arm ELF linker hash entry. */
2074 struct elf32_arm_link_hash_entry
2076 struct elf_link_hash_entry root;
2078 /* Number of PC relative relocs copied for this symbol. */
2079 struct elf32_arm_relocs_copied * relocs_copied;
2081 /* We reference count Thumb references to a PLT entry separately,
2082 so that we can emit the Thumb trampoline only if needed. */
2083 bfd_signed_vma plt_thumb_refcount;
2085 /* Since PLT entries have variable size if the Thumb prologue is
2086 used, we need to record the index into .got.plt instead of
2087 recomputing it from the PLT offset. */
2088 bfd_signed_vma plt_got_offset;
2090 #define GOT_UNKNOWN 0
2091 #define GOT_NORMAL 1
2092 #define GOT_TLS_GD 2
2093 #define GOT_TLS_IE 4
2094 unsigned char tls_type;
2097 /* Traverse an arm ELF linker hash table. */
2098 #define elf32_arm_link_hash_traverse(table, func, info) \
2099 (elf_link_hash_traverse \
2100 (&(table)->root, \
2101 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
2102 (info)))
2104 /* Get the ARM elf linker hash table from a link_info structure. */
2105 #define elf32_arm_hash_table(info) \
2106 ((struct elf32_arm_link_hash_table *) ((info)->hash))
2108 /* ARM ELF linker hash table. */
2109 struct elf32_arm_link_hash_table
2111 /* The main hash table. */
2112 struct elf_link_hash_table root;
2114 /* The size in bytes of the section containing the Thumb-to-ARM glue. */
2115 bfd_size_type thumb_glue_size;
2117 /* The size in bytes of the section containing the ARM-to-Thumb glue. */
2118 bfd_size_type arm_glue_size;
2120 /* An arbitrary input BFD chosen to hold the glue sections. */
2121 bfd * bfd_of_glue_owner;
2123 /* Nonzero to output a BE8 image. */
2124 int byteswap_code;
2126 /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
2127 Nonzero if R_ARM_TARGET1 means R_ARM_ABS32. */
2128 int target1_is_rel;
2130 /* The relocation to use for R_ARM_TARGET2 relocations. */
2131 int target2_reloc;
2133 /* Nonzero to fix BX instructions for ARMv4 targets. */
2134 int fix_v4bx;
2136 /* Nonzero if the ARM/Thumb BLX instructions are available for use. */
2137 int use_blx;
2139 /* The number of bytes in the initial entry in the PLT. */
2140 bfd_size_type plt_header_size;
2142 /* The number of bytes in the subsequent PLT etries. */
2143 bfd_size_type plt_entry_size;
2145 /* True if the target system is VxWorks. */
2146 int vxworks_p;
2148 /* True if the target system is Symbian OS. */
2149 int symbian_p;
2151 /* True if the target uses REL relocations. */
2152 int use_rel;
2154 /* Short-cuts to get to dynamic linker sections. */
2155 asection *sgot;
2156 asection *sgotplt;
2157 asection *srelgot;
2158 asection *splt;
2159 asection *srelplt;
2160 asection *sdynbss;
2161 asection *srelbss;
2163 /* The (unloaded but important) VxWorks .rela.plt.unloaded section. */
2164 asection *srelplt2;
2166 /* Data for R_ARM_TLS_LDM32 relocations. */
2167 union {
2168 bfd_signed_vma refcount;
2169 bfd_vma offset;
2170 } tls_ldm_got;
2172 /* Small local sym to section mapping cache. */
2173 struct sym_sec_cache sym_sec;
2175 /* For convenience in allocate_dynrelocs. */
2176 bfd * obfd;
2179 /* Create an entry in an ARM ELF linker hash table. */
2181 static struct bfd_hash_entry *
2182 elf32_arm_link_hash_newfunc (struct bfd_hash_entry * entry,
2183 struct bfd_hash_table * table,
2184 const char * string)
2186 struct elf32_arm_link_hash_entry * ret =
2187 (struct elf32_arm_link_hash_entry *) entry;
2189 /* Allocate the structure if it has not already been allocated by a
2190 subclass. */
2191 if (ret == (struct elf32_arm_link_hash_entry *) NULL)
2192 ret = bfd_hash_allocate (table, sizeof (struct elf32_arm_link_hash_entry));
2193 if (ret == NULL)
2194 return (struct bfd_hash_entry *) ret;
2196 /* Call the allocation method of the superclass. */
2197 ret = ((struct elf32_arm_link_hash_entry *)
2198 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2199 table, string));
2200 if (ret != NULL)
2202 ret->relocs_copied = NULL;
2203 ret->tls_type = GOT_UNKNOWN;
2204 ret->plt_thumb_refcount = 0;
2205 ret->plt_got_offset = -1;
2208 return (struct bfd_hash_entry *) ret;
2211 /* Return true if NAME is the name of the relocation section associated
2212 with S. */
2214 static bfd_boolean
2215 reloc_section_p (struct elf32_arm_link_hash_table *htab,
2216 const char *name, asection *s)
2218 if (htab->use_rel)
2219 return strncmp (name, ".rel", 4) == 0 && strcmp (s->name, name + 4) == 0;
2220 else
2221 return strncmp (name, ".rela", 5) == 0 && strcmp (s->name, name + 5) == 0;
2224 /* Create .got, .gotplt, and .rel(a).got sections in DYNOBJ, and set up
2225 shortcuts to them in our hash table. */
2227 static bfd_boolean
2228 create_got_section (bfd *dynobj, struct bfd_link_info *info)
2230 struct elf32_arm_link_hash_table *htab;
2232 htab = elf32_arm_hash_table (info);
2233 /* BPABI objects never have a GOT, or associated sections. */
2234 if (htab->symbian_p)
2235 return TRUE;
2237 if (! _bfd_elf_create_got_section (dynobj, info))
2238 return FALSE;
2240 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
2241 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
2242 if (!htab->sgot || !htab->sgotplt)
2243 abort ();
2245 htab->srelgot = bfd_make_section_with_flags (dynobj,
2246 RELOC_SECTION (htab, ".got"),
2247 (SEC_ALLOC | SEC_LOAD
2248 | SEC_HAS_CONTENTS
2249 | SEC_IN_MEMORY
2250 | SEC_LINKER_CREATED
2251 | SEC_READONLY));
2252 if (htab->srelgot == NULL
2253 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
2254 return FALSE;
2255 return TRUE;
2258 /* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
2259 .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
2260 hash table. */
2262 static bfd_boolean
2263 elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
2265 struct elf32_arm_link_hash_table *htab;
2267 htab = elf32_arm_hash_table (info);
2268 if (!htab->sgot && !create_got_section (dynobj, info))
2269 return FALSE;
2271 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
2272 return FALSE;
2274 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
2275 htab->srelplt = bfd_get_section_by_name (dynobj,
2276 RELOC_SECTION (htab, ".plt"));
2277 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
2278 if (!info->shared)
2279 htab->srelbss = bfd_get_section_by_name (dynobj,
2280 RELOC_SECTION (htab, ".bss"));
2282 if (htab->vxworks_p)
2284 if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
2285 return FALSE;
2287 if (info->shared)
2289 htab->plt_header_size = 0;
2290 htab->plt_entry_size
2291 = 4 * ARRAY_SIZE (elf32_arm_vxworks_shared_plt_entry);
2293 else
2295 htab->plt_header_size
2296 = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt0_entry);
2297 htab->plt_entry_size
2298 = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt_entry);
2302 if (!htab->splt
2303 || !htab->srelplt
2304 || !htab->sdynbss
2305 || (!info->shared && !htab->srelbss))
2306 abort ();
2308 return TRUE;
2311 /* Copy the extra info we tack onto an elf_link_hash_entry. */
2313 static void
2314 elf32_arm_copy_indirect_symbol (struct bfd_link_info *info,
2315 struct elf_link_hash_entry *dir,
2316 struct elf_link_hash_entry *ind)
2318 struct elf32_arm_link_hash_entry *edir, *eind;
2320 edir = (struct elf32_arm_link_hash_entry *) dir;
2321 eind = (struct elf32_arm_link_hash_entry *) ind;
2323 if (eind->relocs_copied != NULL)
2325 if (edir->relocs_copied != NULL)
2327 struct elf32_arm_relocs_copied **pp;
2328 struct elf32_arm_relocs_copied *p;
2330 /* Add reloc counts against the indirect sym to the direct sym
2331 list. Merge any entries against the same section. */
2332 for (pp = &eind->relocs_copied; (p = *pp) != NULL; )
2334 struct elf32_arm_relocs_copied *q;
2336 for (q = edir->relocs_copied; q != NULL; q = q->next)
2337 if (q->section == p->section)
2339 q->pc_count += p->pc_count;
2340 q->count += p->count;
2341 *pp = p->next;
2342 break;
2344 if (q == NULL)
2345 pp = &p->next;
2347 *pp = edir->relocs_copied;
2350 edir->relocs_copied = eind->relocs_copied;
2351 eind->relocs_copied = NULL;
2354 /* Copy over PLT info. */
2355 edir->plt_thumb_refcount += eind->plt_thumb_refcount;
2356 eind->plt_thumb_refcount = 0;
2358 if (ind->root.type == bfd_link_hash_indirect
2359 && dir->got.refcount <= 0)
2361 edir->tls_type = eind->tls_type;
2362 eind->tls_type = GOT_UNKNOWN;
2365 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
2368 /* Create an ARM elf linker hash table. */
2370 static struct bfd_link_hash_table *
2371 elf32_arm_link_hash_table_create (bfd *abfd)
2373 struct elf32_arm_link_hash_table *ret;
2374 bfd_size_type amt = sizeof (struct elf32_arm_link_hash_table);
2376 ret = bfd_malloc (amt);
2377 if (ret == NULL)
2378 return NULL;
2380 if (!_bfd_elf_link_hash_table_init (& ret->root, abfd,
2381 elf32_arm_link_hash_newfunc,
2382 sizeof (struct elf32_arm_link_hash_entry)))
2384 free (ret);
2385 return NULL;
2388 ret->sgot = NULL;
2389 ret->sgotplt = NULL;
2390 ret->srelgot = NULL;
2391 ret->splt = NULL;
2392 ret->srelplt = NULL;
2393 ret->sdynbss = NULL;
2394 ret->srelbss = NULL;
2395 ret->srelplt2 = NULL;
2396 ret->thumb_glue_size = 0;
2397 ret->arm_glue_size = 0;
2398 ret->bfd_of_glue_owner = NULL;
2399 ret->byteswap_code = 0;
2400 ret->target1_is_rel = 0;
2401 ret->target2_reloc = R_ARM_NONE;
2402 #ifdef FOUR_WORD_PLT
2403 ret->plt_header_size = 16;
2404 ret->plt_entry_size = 16;
2405 #else
2406 ret->plt_header_size = 20;
2407 ret->plt_entry_size = 12;
2408 #endif
2409 ret->fix_v4bx = 0;
2410 ret->use_blx = 0;
2411 ret->vxworks_p = 0;
2412 ret->symbian_p = 0;
2413 ret->use_rel = 1;
2414 ret->sym_sec.abfd = NULL;
2415 ret->obfd = abfd;
2416 ret->tls_ldm_got.refcount = 0;
2418 return &ret->root.root;
2421 /* Locate the Thumb encoded calling stub for NAME. */
2423 static struct elf_link_hash_entry *
2424 find_thumb_glue (struct bfd_link_info *link_info,
2425 const char *name,
2426 bfd *input_bfd)
2428 char *tmp_name;
2429 struct elf_link_hash_entry *hash;
2430 struct elf32_arm_link_hash_table *hash_table;
2432 /* We need a pointer to the armelf specific hash table. */
2433 hash_table = elf32_arm_hash_table (link_info);
2435 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2436 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
2438 BFD_ASSERT (tmp_name);
2440 sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
2442 hash = elf_link_hash_lookup
2443 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
2445 if (hash == NULL)
2446 /* xgettext:c-format */
2447 (*_bfd_error_handler) (_("%B: unable to find THUMB glue '%s' for `%s'"),
2448 input_bfd, tmp_name, name);
2450 free (tmp_name);
2452 return hash;
2455 /* Locate the ARM encoded calling stub for NAME. */
2457 static struct elf_link_hash_entry *
2458 find_arm_glue (struct bfd_link_info *link_info,
2459 const char *name,
2460 bfd *input_bfd)
2462 char *tmp_name;
2463 struct elf_link_hash_entry *myh;
2464 struct elf32_arm_link_hash_table *hash_table;
2466 /* We need a pointer to the elfarm specific hash table. */
2467 hash_table = elf32_arm_hash_table (link_info);
2469 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2470 + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
2472 BFD_ASSERT (tmp_name);
2474 sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
2476 myh = elf_link_hash_lookup
2477 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
2479 if (myh == NULL)
2480 /* xgettext:c-format */
2481 (*_bfd_error_handler) (_("%B: unable to find ARM glue '%s' for `%s'"),
2482 input_bfd, tmp_name, name);
2484 free (tmp_name);
2486 return myh;
2489 /* ARM->Thumb glue (static images):
2491 .arm
2492 __func_from_arm:
2493 ldr r12, __func_addr
2494 bx r12
2495 __func_addr:
2496 .word func @ behave as if you saw a ARM_32 reloc.
2498 (relocatable images)
2499 .arm
2500 __func_from_arm:
2501 ldr r12, __func_offset
2502 add r12, r12, pc
2503 bx r12
2504 __func_offset:
2505 .word func - .
2508 #define ARM2THUMB_STATIC_GLUE_SIZE 12
2509 static const insn32 a2t1_ldr_insn = 0xe59fc000;
2510 static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
2511 static const insn32 a2t3_func_addr_insn = 0x00000001;
2513 #define ARM2THUMB_PIC_GLUE_SIZE 16
2514 static const insn32 a2t1p_ldr_insn = 0xe59fc004;
2515 static const insn32 a2t2p_add_pc_insn = 0xe08cc00f;
2516 static const insn32 a2t3p_bx_r12_insn = 0xe12fff1c;
2518 /* Thumb->ARM: Thumb->(non-interworking aware) ARM
2520 .thumb .thumb
2521 .align 2 .align 2
2522 __func_from_thumb: __func_from_thumb:
2523 bx pc push {r6, lr}
2524 nop ldr r6, __func_addr
2525 .arm mov lr, pc
2526 __func_change_to_arm: bx r6
2527 b func .arm
2528 __func_back_to_thumb:
2529 ldmia r13! {r6, lr}
2530 bx lr
2531 __func_addr:
2532 .word func */
2534 #define THUMB2ARM_GLUE_SIZE 8
2535 static const insn16 t2a1_bx_pc_insn = 0x4778;
2536 static const insn16 t2a2_noop_insn = 0x46c0;
2537 static const insn32 t2a3_b_insn = 0xea000000;
2539 #ifndef ELFARM_NABI_C_INCLUDED
2540 bfd_boolean
2541 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
2543 asection * s;
2544 bfd_byte * foo;
2545 struct elf32_arm_link_hash_table * globals;
2547 globals = elf32_arm_hash_table (info);
2549 BFD_ASSERT (globals != NULL);
2551 if (globals->arm_glue_size != 0)
2553 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2555 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2556 ARM2THUMB_GLUE_SECTION_NAME);
2558 BFD_ASSERT (s != NULL);
2560 foo = bfd_alloc (globals->bfd_of_glue_owner, globals->arm_glue_size);
2562 s->size = globals->arm_glue_size;
2563 s->contents = foo;
2566 if (globals->thumb_glue_size != 0)
2568 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2570 s = bfd_get_section_by_name
2571 (globals->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
2573 BFD_ASSERT (s != NULL);
2575 foo = bfd_alloc (globals->bfd_of_glue_owner, globals->thumb_glue_size);
2577 s->size = globals->thumb_glue_size;
2578 s->contents = foo;
2581 return TRUE;
2584 static void
2585 record_arm_to_thumb_glue (struct bfd_link_info * link_info,
2586 struct elf_link_hash_entry * h)
2588 const char * name = h->root.root.string;
2589 asection * s;
2590 char * tmp_name;
2591 struct elf_link_hash_entry * myh;
2592 struct bfd_link_hash_entry * bh;
2593 struct elf32_arm_link_hash_table * globals;
2594 bfd_vma val;
2596 globals = elf32_arm_hash_table (link_info);
2598 BFD_ASSERT (globals != NULL);
2599 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2601 s = bfd_get_section_by_name
2602 (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
2604 BFD_ASSERT (s != NULL);
2606 tmp_name = bfd_malloc ((bfd_size_type) strlen (name) + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
2608 BFD_ASSERT (tmp_name);
2610 sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
2612 myh = elf_link_hash_lookup
2613 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
2615 if (myh != NULL)
2617 /* We've already seen this guy. */
2618 free (tmp_name);
2619 return;
2622 /* The only trick here is using hash_table->arm_glue_size as the value.
2623 Even though the section isn't allocated yet, this is where we will be
2624 putting it. */
2625 bh = NULL;
2626 val = globals->arm_glue_size + 1;
2627 _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
2628 tmp_name, BSF_GLOBAL, s, val,
2629 NULL, TRUE, FALSE, &bh);
2631 myh = (struct elf_link_hash_entry *) bh;
2632 myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
2633 myh->forced_local = 1;
2635 free (tmp_name);
2637 if ((link_info->shared || globals->root.is_relocatable_executable))
2638 globals->arm_glue_size += ARM2THUMB_PIC_GLUE_SIZE;
2639 else
2640 globals->arm_glue_size += ARM2THUMB_STATIC_GLUE_SIZE;
2642 return;
2645 static void
2646 record_thumb_to_arm_glue (struct bfd_link_info *link_info,
2647 struct elf_link_hash_entry *h)
2649 const char *name = h->root.root.string;
2650 asection *s;
2651 char *tmp_name;
2652 struct elf_link_hash_entry *myh;
2653 struct bfd_link_hash_entry *bh;
2654 struct elf32_arm_link_hash_table *hash_table;
2655 bfd_vma val;
2657 hash_table = elf32_arm_hash_table (link_info);
2659 BFD_ASSERT (hash_table != NULL);
2660 BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
2662 s = bfd_get_section_by_name
2663 (hash_table->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
2665 BFD_ASSERT (s != NULL);
2667 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2668 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
2670 BFD_ASSERT (tmp_name);
2672 sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
2674 myh = elf_link_hash_lookup
2675 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
2677 if (myh != NULL)
2679 /* We've already seen this guy. */
2680 free (tmp_name);
2681 return;
2684 bh = NULL;
2685 val = hash_table->thumb_glue_size + 1;
2686 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
2687 tmp_name, BSF_GLOBAL, s, val,
2688 NULL, TRUE, FALSE, &bh);
2690 /* If we mark it 'Thumb', the disassembler will do a better job. */
2691 myh = (struct elf_link_hash_entry *) bh;
2692 myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
2693 myh->forced_local = 1;
2695 free (tmp_name);
2697 #define CHANGE_TO_ARM "__%s_change_to_arm"
2698 #define BACK_FROM_ARM "__%s_back_from_arm"
2700 /* Allocate another symbol to mark where we switch to Arm mode. */
2701 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2702 + strlen (CHANGE_TO_ARM) + 1);
2704 BFD_ASSERT (tmp_name);
2706 sprintf (tmp_name, CHANGE_TO_ARM, name);
2708 bh = NULL;
2709 val = hash_table->thumb_glue_size + 4,
2710 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
2711 tmp_name, BSF_LOCAL, s, val,
2712 NULL, TRUE, FALSE, &bh);
2714 free (tmp_name);
2716 hash_table->thumb_glue_size += THUMB2ARM_GLUE_SIZE;
2718 return;
2721 /* Add the glue sections to ABFD. This function is called from the
2722 linker scripts in ld/emultempl/{armelf}.em. */
2724 bfd_boolean
2725 bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
2726 struct bfd_link_info *info)
2728 flagword flags;
2729 asection *sec;
2731 /* If we are only performing a partial
2732 link do not bother adding the glue. */
2733 if (info->relocatable)
2734 return TRUE;
2736 sec = bfd_get_section_by_name (abfd, ARM2THUMB_GLUE_SECTION_NAME);
2738 if (sec == NULL)
2740 /* Note: we do not include the flag SEC_LINKER_CREATED, as this
2741 will prevent elf_link_input_bfd() from processing the contents
2742 of this section. */
2743 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY;
2745 sec = bfd_make_section_with_flags (abfd,
2746 ARM2THUMB_GLUE_SECTION_NAME,
2747 flags);
2749 if (sec == NULL
2750 || !bfd_set_section_alignment (abfd, sec, 2))
2751 return FALSE;
2753 /* Set the gc mark to prevent the section from being removed by garbage
2754 collection, despite the fact that no relocs refer to this section. */
2755 sec->gc_mark = 1;
2758 sec = bfd_get_section_by_name (abfd, THUMB2ARM_GLUE_SECTION_NAME);
2760 if (sec == NULL)
2762 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2763 | SEC_CODE | SEC_READONLY;
2765 sec = bfd_make_section_with_flags (abfd,
2766 THUMB2ARM_GLUE_SECTION_NAME,
2767 flags);
2769 if (sec == NULL
2770 || !bfd_set_section_alignment (abfd, sec, 2))
2771 return FALSE;
2773 sec->gc_mark = 1;
2776 return TRUE;
2779 /* Select a BFD to be used to hold the sections used by the glue code.
2780 This function is called from the linker scripts in ld/emultempl/
2781 {armelf/pe}.em */
2783 bfd_boolean
2784 bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
2786 struct elf32_arm_link_hash_table *globals;
2788 /* If we are only performing a partial link
2789 do not bother getting a bfd to hold the glue. */
2790 if (info->relocatable)
2791 return TRUE;
2793 /* Make sure we don't attach the glue sections to a dynamic object. */
2794 BFD_ASSERT (!(abfd->flags & DYNAMIC));
2796 globals = elf32_arm_hash_table (info);
2798 BFD_ASSERT (globals != NULL);
2800 if (globals->bfd_of_glue_owner != NULL)
2801 return TRUE;
2803 /* Save the bfd for later use. */
2804 globals->bfd_of_glue_owner = abfd;
2806 return TRUE;
2809 static void check_use_blx(struct elf32_arm_link_hash_table *globals)
2811 if (elf32_arm_get_eabi_attr_int (globals->obfd, Tag_CPU_arch) > 2)
2812 globals->use_blx = 1;
2815 bfd_boolean
2816 bfd_elf32_arm_process_before_allocation (bfd *abfd,
2817 struct bfd_link_info *link_info,
2818 int byteswap_code)
2820 Elf_Internal_Shdr *symtab_hdr;
2821 Elf_Internal_Rela *internal_relocs = NULL;
2822 Elf_Internal_Rela *irel, *irelend;
2823 bfd_byte *contents = NULL;
2825 asection *sec;
2826 struct elf32_arm_link_hash_table *globals;
2828 /* If we are only performing a partial link do not bother
2829 to construct any glue. */
2830 if (link_info->relocatable)
2831 return TRUE;
2833 /* Here we have a bfd that is to be included on the link. We have a hook
2834 to do reloc rummaging, before section sizes are nailed down. */
2835 globals = elf32_arm_hash_table (link_info);
2836 check_use_blx (globals);
2838 BFD_ASSERT (globals != NULL);
2839 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2841 if (byteswap_code && !bfd_big_endian (abfd))
2843 _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
2844 abfd);
2845 return FALSE;
2847 globals->byteswap_code = byteswap_code;
2849 /* Rummage around all the relocs and map the glue vectors. */
2850 sec = abfd->sections;
2852 if (sec == NULL)
2853 return TRUE;
2855 for (; sec != NULL; sec = sec->next)
2857 if (sec->reloc_count == 0)
2858 continue;
2860 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2862 /* Load the relocs. */
2863 internal_relocs
2864 = _bfd_elf_link_read_relocs (abfd, sec, (void *) NULL,
2865 (Elf_Internal_Rela *) NULL, FALSE);
2867 if (internal_relocs == NULL)
2868 goto error_return;
2870 irelend = internal_relocs + sec->reloc_count;
2871 for (irel = internal_relocs; irel < irelend; irel++)
2873 long r_type;
2874 unsigned long r_index;
2876 struct elf_link_hash_entry *h;
2878 r_type = ELF32_R_TYPE (irel->r_info);
2879 r_index = ELF32_R_SYM (irel->r_info);
2881 /* These are the only relocation types we care about. */
2882 if ( r_type != R_ARM_PC24
2883 && r_type != R_ARM_PLT32
2884 && r_type != R_ARM_CALL
2885 && r_type != R_ARM_JUMP24
2886 && r_type != R_ARM_THM_CALL)
2887 continue;
2889 /* Get the section contents if we haven't done so already. */
2890 if (contents == NULL)
2892 /* Get cached copy if it exists. */
2893 if (elf_section_data (sec)->this_hdr.contents != NULL)
2894 contents = elf_section_data (sec)->this_hdr.contents;
2895 else
2897 /* Go get them off disk. */
2898 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2899 goto error_return;
2903 /* If the relocation is not against a symbol it cannot concern us. */
2904 h = NULL;
2906 /* We don't care about local symbols. */
2907 if (r_index < symtab_hdr->sh_info)
2908 continue;
2910 /* This is an external symbol. */
2911 r_index -= symtab_hdr->sh_info;
2912 h = (struct elf_link_hash_entry *)
2913 elf_sym_hashes (abfd)[r_index];
2915 /* If the relocation is against a static symbol it must be within
2916 the current section and so cannot be a cross ARM/Thumb relocation. */
2917 if (h == NULL)
2918 continue;
2920 /* If the call will go through a PLT entry then we do not need
2921 glue. */
2922 if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1)
2923 continue;
2925 switch (r_type)
2927 case R_ARM_PC24:
2928 case R_ARM_PLT32:
2929 case R_ARM_CALL:
2930 case R_ARM_JUMP24:
2931 /* This one is a call from arm code. We need to look up
2932 the target of the call. If it is a thumb target, we
2933 insert glue. */
2934 if (ELF_ST_TYPE(h->type) == STT_ARM_TFUNC
2935 && !(r_type == R_ARM_CALL && globals->use_blx))
2936 record_arm_to_thumb_glue (link_info, h);
2937 break;
2939 case R_ARM_THM_CALL:
2940 /* This one is a call from thumb code. We look
2941 up the target of the call. If it is not a thumb
2942 target, we insert glue. */
2943 if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC && !globals->use_blx)
2944 record_thumb_to_arm_glue (link_info, h);
2945 break;
2947 default:
2948 abort ();
2952 if (contents != NULL
2953 && elf_section_data (sec)->this_hdr.contents != contents)
2954 free (contents);
2955 contents = NULL;
2957 if (internal_relocs != NULL
2958 && elf_section_data (sec)->relocs != internal_relocs)
2959 free (internal_relocs);
2960 internal_relocs = NULL;
2963 return TRUE;
2965 error_return:
2966 if (contents != NULL
2967 && elf_section_data (sec)->this_hdr.contents != contents)
2968 free (contents);
2969 if (internal_relocs != NULL
2970 && elf_section_data (sec)->relocs != internal_relocs)
2971 free (internal_relocs);
2973 return FALSE;
2975 #endif
2978 /* Set target relocation values needed during linking. */
2980 void
2981 bfd_elf32_arm_set_target_relocs (struct bfd_link_info *link_info,
2982 int target1_is_rel,
2983 char * target2_type,
2984 int fix_v4bx,
2985 int use_blx)
2987 struct elf32_arm_link_hash_table *globals;
2989 globals = elf32_arm_hash_table (link_info);
2991 globals->target1_is_rel = target1_is_rel;
2992 if (strcmp (target2_type, "rel") == 0)
2993 globals->target2_reloc = R_ARM_REL32;
2994 else if (strcmp (target2_type, "abs") == 0)
2995 globals->target2_reloc = R_ARM_ABS32;
2996 else if (strcmp (target2_type, "got-rel") == 0)
2997 globals->target2_reloc = R_ARM_GOT_PREL;
2998 else
3000 _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
3001 target2_type);
3003 globals->fix_v4bx = fix_v4bx;
3004 globals->use_blx |= use_blx;
3007 /* The thumb form of a long branch is a bit finicky, because the offset
3008 encoding is split over two fields, each in it's own instruction. They
3009 can occur in any order. So given a thumb form of long branch, and an
3010 offset, insert the offset into the thumb branch and return finished
3011 instruction.
3013 It takes two thumb instructions to encode the target address. Each has
3014 11 bits to invest. The upper 11 bits are stored in one (identified by
3015 H-0.. see below), the lower 11 bits are stored in the other (identified
3016 by H-1).
3018 Combine together and shifted left by 1 (it's a half word address) and
3019 there you have it.
3021 Op: 1111 = F,
3022 H-0, upper address-0 = 000
3023 Op: 1111 = F,
3024 H-1, lower address-0 = 800
3026 They can be ordered either way, but the arm tools I've seen always put
3027 the lower one first. It probably doesn't matter. krk@cygnus.com
3029 XXX: Actually the order does matter. The second instruction (H-1)
3030 moves the computed address into the PC, so it must be the second one
3031 in the sequence. The problem, however is that whilst little endian code
3032 stores the instructions in HI then LOW order, big endian code does the
3033 reverse. nickc@cygnus.com. */
3035 #define LOW_HI_ORDER 0xF800F000
3036 #define HI_LOW_ORDER 0xF000F800
3038 static insn32
3039 insert_thumb_branch (insn32 br_insn, int rel_off)
3041 unsigned int low_bits;
3042 unsigned int high_bits;
3044 BFD_ASSERT ((rel_off & 1) != 1);
3046 rel_off >>= 1; /* Half word aligned address. */
3047 low_bits = rel_off & 0x000007FF; /* The bottom 11 bits. */
3048 high_bits = (rel_off >> 11) & 0x000007FF; /* The top 11 bits. */
3050 if ((br_insn & LOW_HI_ORDER) == LOW_HI_ORDER)
3051 br_insn = LOW_HI_ORDER | (low_bits << 16) | high_bits;
3052 else if ((br_insn & HI_LOW_ORDER) == HI_LOW_ORDER)
3053 br_insn = HI_LOW_ORDER | (high_bits << 16) | low_bits;
3054 else
3055 /* FIXME: abort is probably not the right call. krk@cygnus.com */
3056 abort (); /* Error - not a valid branch instruction form. */
3058 return br_insn;
3062 /* Store an Arm insn into an output section not processed by
3063 elf32_arm_write_section. */
3065 static void
3066 put_arm_insn (struct elf32_arm_link_hash_table *htab,
3067 bfd * output_bfd, bfd_vma val, void * ptr)
3069 if (htab->byteswap_code != bfd_little_endian (output_bfd))
3070 bfd_putl32 (val, ptr);
3071 else
3072 bfd_putb32 (val, ptr);
3076 /* Store a 16-bit Thumb insn into an output section not processed by
3077 elf32_arm_write_section. */
3079 static void
3080 put_thumb_insn (struct elf32_arm_link_hash_table *htab,
3081 bfd * output_bfd, bfd_vma val, void * ptr)
3083 if (htab->byteswap_code != bfd_little_endian (output_bfd))
3084 bfd_putl16 (val, ptr);
3085 else
3086 bfd_putb16 (val, ptr);
3090 /* Thumb code calling an ARM function. */
3092 static int
3093 elf32_thumb_to_arm_stub (struct bfd_link_info * info,
3094 const char * name,
3095 bfd * input_bfd,
3096 bfd * output_bfd,
3097 asection * input_section,
3098 bfd_byte * hit_data,
3099 asection * sym_sec,
3100 bfd_vma offset,
3101 bfd_signed_vma addend,
3102 bfd_vma val)
3104 asection * s = 0;
3105 bfd_vma my_offset;
3106 unsigned long int tmp;
3107 long int ret_offset;
3108 struct elf_link_hash_entry * myh;
3109 struct elf32_arm_link_hash_table * globals;
3111 myh = find_thumb_glue (info, name, input_bfd);
3112 if (myh == NULL)
3113 return FALSE;
3115 globals = elf32_arm_hash_table (info);
3117 BFD_ASSERT (globals != NULL);
3118 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
3120 my_offset = myh->root.u.def.value;
3122 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
3123 THUMB2ARM_GLUE_SECTION_NAME);
3125 BFD_ASSERT (s != NULL);
3126 BFD_ASSERT (s->contents != NULL);
3127 BFD_ASSERT (s->output_section != NULL);
3129 if ((my_offset & 0x01) == 0x01)
3131 if (sym_sec != NULL
3132 && sym_sec->owner != NULL
3133 && !INTERWORK_FLAG (sym_sec->owner))
3135 (*_bfd_error_handler)
3136 (_("%B(%s): warning: interworking not enabled.\n"
3137 " first occurrence: %B: thumb call to arm"),
3138 sym_sec->owner, input_bfd, name);
3140 return FALSE;
3143 --my_offset;
3144 myh->root.u.def.value = my_offset;
3146 put_thumb_insn (globals, output_bfd, (bfd_vma) t2a1_bx_pc_insn,
3147 s->contents + my_offset);
3149 put_thumb_insn (globals, output_bfd, (bfd_vma) t2a2_noop_insn,
3150 s->contents + my_offset + 2);
3152 ret_offset =
3153 /* Address of destination of the stub. */
3154 ((bfd_signed_vma) val)
3155 - ((bfd_signed_vma)
3156 /* Offset from the start of the current section
3157 to the start of the stubs. */
3158 (s->output_offset
3159 /* Offset of the start of this stub from the start of the stubs. */
3160 + my_offset
3161 /* Address of the start of the current section. */
3162 + s->output_section->vma)
3163 /* The branch instruction is 4 bytes into the stub. */
3165 /* ARM branches work from the pc of the instruction + 8. */
3166 + 8);
3168 put_arm_insn (globals, output_bfd,
3169 (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
3170 s->contents + my_offset + 4);
3173 BFD_ASSERT (my_offset <= globals->thumb_glue_size);
3175 /* Now go back and fix up the original BL insn to point to here. */
3176 ret_offset =
3177 /* Address of where the stub is located. */
3178 (s->output_section->vma + s->output_offset + my_offset)
3179 /* Address of where the BL is located. */
3180 - (input_section->output_section->vma + input_section->output_offset
3181 + offset)
3182 /* Addend in the relocation. */
3183 - addend
3184 /* Biassing for PC-relative addressing. */
3185 - 8;
3187 tmp = bfd_get_32 (input_bfd, hit_data
3188 - input_section->vma);
3190 bfd_put_32 (output_bfd,
3191 (bfd_vma) insert_thumb_branch (tmp, ret_offset),
3192 hit_data - input_section->vma);
3194 return TRUE;
3197 /* Arm code calling a Thumb function. */
3199 static int
3200 elf32_arm_to_thumb_stub (struct bfd_link_info * info,
3201 const char * name,
3202 bfd * input_bfd,
3203 bfd * output_bfd,
3204 asection * input_section,
3205 bfd_byte * hit_data,
3206 asection * sym_sec,
3207 bfd_vma offset,
3208 bfd_signed_vma addend,
3209 bfd_vma val)
3211 unsigned long int tmp;
3212 bfd_vma my_offset;
3213 asection * s;
3214 long int ret_offset;
3215 struct elf_link_hash_entry * myh;
3216 struct elf32_arm_link_hash_table * globals;
3218 myh = find_arm_glue (info, name, input_bfd);
3219 if (myh == NULL)
3220 return FALSE;
3222 globals = elf32_arm_hash_table (info);
3224 BFD_ASSERT (globals != NULL);
3225 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
3227 my_offset = myh->root.u.def.value;
3228 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
3229 ARM2THUMB_GLUE_SECTION_NAME);
3230 BFD_ASSERT (s != NULL);
3231 BFD_ASSERT (s->contents != NULL);
3232 BFD_ASSERT (s->output_section != NULL);
3234 if ((my_offset & 0x01) == 0x01)
3236 if (sym_sec != NULL
3237 && sym_sec->owner != NULL
3238 && !INTERWORK_FLAG (sym_sec->owner))
3240 (*_bfd_error_handler)
3241 (_("%B(%s): warning: interworking not enabled.\n"
3242 " first occurrence: %B: arm call to thumb"),
3243 sym_sec->owner, input_bfd, name);
3246 --my_offset;
3247 myh->root.u.def.value = my_offset;
3249 if ((info->shared || globals->root.is_relocatable_executable))
3251 /* For relocatable objects we can't use absolute addresses,
3252 so construct the address from a relative offset. */
3253 /* TODO: If the offset is small it's probably worth
3254 constructing the address with adds. */
3255 put_arm_insn (globals, output_bfd, (bfd_vma) a2t1p_ldr_insn,
3256 s->contents + my_offset);
3257 put_arm_insn (globals, output_bfd, (bfd_vma) a2t2p_add_pc_insn,
3258 s->contents + my_offset + 4);
3259 put_arm_insn (globals, output_bfd, (bfd_vma) a2t3p_bx_r12_insn,
3260 s->contents + my_offset + 8);
3261 /* Adjust the offset by 4 for the position of the add,
3262 and 8 for the pipeline offset. */
3263 ret_offset = (val - (s->output_offset
3264 + s->output_section->vma
3265 + my_offset + 12))
3266 | 1;
3267 bfd_put_32 (output_bfd, ret_offset,
3268 s->contents + my_offset + 12);
3270 else
3272 put_arm_insn (globals, output_bfd, (bfd_vma) a2t1_ldr_insn,
3273 s->contents + my_offset);
3275 put_arm_insn (globals, output_bfd, (bfd_vma) a2t2_bx_r12_insn,
3276 s->contents + my_offset + 4);
3278 /* It's a thumb address. Add the low order bit. */
3279 bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
3280 s->contents + my_offset + 8);
3284 BFD_ASSERT (my_offset <= globals->arm_glue_size);
3286 tmp = bfd_get_32 (input_bfd, hit_data);
3287 tmp = tmp & 0xFF000000;
3289 /* Somehow these are both 4 too far, so subtract 8. */
3290 ret_offset = (s->output_offset
3291 + my_offset
3292 + s->output_section->vma
3293 - (input_section->output_offset
3294 + input_section->output_section->vma
3295 + offset + addend)
3296 - 8);
3298 tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
3300 bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
3302 return TRUE;
3305 /* Some relocations map to different relocations depending on the
3306 target. Return the real relocation. */
3307 static int
3308 arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
3309 int r_type)
3311 switch (r_type)
3313 case R_ARM_TARGET1:
3314 if (globals->target1_is_rel)
3315 return R_ARM_REL32;
3316 else
3317 return R_ARM_ABS32;
3319 case R_ARM_TARGET2:
3320 return globals->target2_reloc;
3322 default:
3323 return r_type;
3327 /* Return the base VMA address which should be subtracted from real addresses
3328 when resolving @dtpoff relocation.
3329 This is PT_TLS segment p_vaddr. */
3331 static bfd_vma
3332 dtpoff_base (struct bfd_link_info *info)
3334 /* If tls_sec is NULL, we should have signalled an error already. */
3335 if (elf_hash_table (info)->tls_sec == NULL)
3336 return 0;
3337 return elf_hash_table (info)->tls_sec->vma;
3340 /* Return the relocation value for @tpoff relocation
3341 if STT_TLS virtual address is ADDRESS. */
3343 static bfd_vma
3344 tpoff (struct bfd_link_info *info, bfd_vma address)
3346 struct elf_link_hash_table *htab = elf_hash_table (info);
3347 bfd_vma base;
3349 /* If tls_sec is NULL, we should have signalled an error already. */
3350 if (htab->tls_sec == NULL)
3351 return 0;
3352 base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
3353 return address - htab->tls_sec->vma + base;
3356 /* Perform an R_ARM_ABS12 relocation on the field pointed to by DATA.
3357 VALUE is the relocation value. */
3359 static bfd_reloc_status_type
3360 elf32_arm_abs12_reloc (bfd *abfd, void *data, bfd_vma value)
3362 if (value > 0xfff)
3363 return bfd_reloc_overflow;
3365 value |= bfd_get_32 (abfd, data) & 0xfffff000;
3366 bfd_put_32 (abfd, value, data);
3367 return bfd_reloc_ok;
3370 /* For a given value of n, calculate the value of G_n as required to
3371 deal with group relocations. We return it in the form of an
3372 encoded constant-and-rotation, together with the final residual. If n is
3373 specified as less than zero, then final_residual is filled with the
3374 input value and no further action is performed. */
3376 static bfd_vma
3377 calculate_group_reloc_mask (bfd_vma value, int n, bfd_vma *final_residual)
3379 int current_n;
3380 bfd_vma g_n;
3381 bfd_vma encoded_g_n = 0;
3382 bfd_vma residual = value; /* Also known as Y_n. */
3384 for (current_n = 0; current_n <= n; current_n++)
3386 int shift;
3388 /* Calculate which part of the value to mask. */
3389 if (residual == 0)
3390 shift = 0;
3391 else
3393 int msb;
3395 /* Determine the most significant bit in the residual and
3396 align the resulting value to a 2-bit boundary. */
3397 for (msb = 30; msb >= 0; msb -= 2)
3398 if (residual & (3 << msb))
3399 break;
3401 /* The desired shift is now (msb - 6), or zero, whichever
3402 is the greater. */
3403 shift = msb - 6;
3404 if (shift < 0)
3405 shift = 0;
3408 /* Calculate g_n in 32-bit as well as encoded constant+rotation form. */
3409 g_n = residual & (0xff << shift);
3410 encoded_g_n = (g_n >> shift)
3411 | ((g_n <= 0xff ? 0 : (32 - shift) / 2) << 8);
3413 /* Calculate the residual for the next time around. */
3414 residual &= ~g_n;
3417 *final_residual = residual;
3419 return encoded_g_n;
3422 /* Given an ARM instruction, determine whether it is an ADD or a SUB.
3423 Returns 1 if it is an ADD, -1 if it is a SUB, and 0 otherwise. */
3424 static int
3425 identify_add_or_sub(bfd_vma insn)
3427 int opcode = insn & 0x1e00000;
3429 if (opcode == 1 << 23) /* ADD */
3430 return 1;
3432 if (opcode == 1 << 22) /* SUB */
3433 return -1;
3435 return 0;
3438 /* Perform a relocation as part of a final link. */
3440 static bfd_reloc_status_type
3441 elf32_arm_final_link_relocate (reloc_howto_type * howto,
3442 bfd * input_bfd,
3443 bfd * output_bfd,
3444 asection * input_section,
3445 bfd_byte * contents,
3446 Elf_Internal_Rela * rel,
3447 bfd_vma value,
3448 struct bfd_link_info * info,
3449 asection * sym_sec,
3450 const char * sym_name,
3451 int sym_flags,
3452 struct elf_link_hash_entry * h,
3453 bfd_boolean * unresolved_reloc_p)
3455 unsigned long r_type = howto->type;
3456 unsigned long r_symndx;
3457 bfd_byte * hit_data = contents + rel->r_offset;
3458 bfd * dynobj = NULL;
3459 Elf_Internal_Shdr * symtab_hdr;
3460 struct elf_link_hash_entry ** sym_hashes;
3461 bfd_vma * local_got_offsets;
3462 asection * sgot = NULL;
3463 asection * splt = NULL;
3464 asection * sreloc = NULL;
3465 bfd_vma addend;
3466 bfd_signed_vma signed_addend;
3467 struct elf32_arm_link_hash_table * globals;
3469 globals = elf32_arm_hash_table (info);
3471 /* Some relocation type map to different relocations depending on the
3472 target. We pick the right one here. */
3473 r_type = arm_real_reloc_type (globals, r_type);
3474 if (r_type != howto->type)
3475 howto = elf32_arm_howto_from_type (r_type);
3477 /* If the start address has been set, then set the EF_ARM_HASENTRY
3478 flag. Setting this more than once is redundant, but the cost is
3479 not too high, and it keeps the code simple.
3481 The test is done here, rather than somewhere else, because the
3482 start address is only set just before the final link commences.
3484 Note - if the user deliberately sets a start address of 0, the
3485 flag will not be set. */
3486 if (bfd_get_start_address (output_bfd) != 0)
3487 elf_elfheader (output_bfd)->e_flags |= EF_ARM_HASENTRY;
3489 dynobj = elf_hash_table (info)->dynobj;
3490 if (dynobj)
3492 sgot = bfd_get_section_by_name (dynobj, ".got");
3493 splt = bfd_get_section_by_name (dynobj, ".plt");
3495 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
3496 sym_hashes = elf_sym_hashes (input_bfd);
3497 local_got_offsets = elf_local_got_offsets (input_bfd);
3498 r_symndx = ELF32_R_SYM (rel->r_info);
3500 if (globals->use_rel)
3502 addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
3504 if (addend & ((howto->src_mask + 1) >> 1))
3506 signed_addend = -1;
3507 signed_addend &= ~ howto->src_mask;
3508 signed_addend |= addend;
3510 else
3511 signed_addend = addend;
3513 else
3514 addend = signed_addend = rel->r_addend;
3516 switch (r_type)
3518 case R_ARM_NONE:
3519 /* We don't need to find a value for this symbol. It's just a
3520 marker. */
3521 *unresolved_reloc_p = FALSE;
3522 return bfd_reloc_ok;
3524 case R_ARM_ABS12:
3525 if (!globals->vxworks_p)
3526 return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
3528 case R_ARM_PC24:
3529 case R_ARM_ABS32:
3530 case R_ARM_REL32:
3531 case R_ARM_CALL:
3532 case R_ARM_JUMP24:
3533 case R_ARM_XPC25:
3534 case R_ARM_PREL31:
3535 case R_ARM_PLT32:
3536 /* r_symndx will be zero only for relocs against symbols
3537 from removed linkonce sections, or sections discarded by
3538 a linker script. */
3539 if (r_symndx == 0)
3540 return bfd_reloc_ok;
3542 /* Handle relocations which should use the PLT entry. ABS32/REL32
3543 will use the symbol's value, which may point to a PLT entry, but we
3544 don't need to handle that here. If we created a PLT entry, all
3545 branches in this object should go to it. */
3546 if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32)
3547 && h != NULL
3548 && splt != NULL
3549 && h->plt.offset != (bfd_vma) -1)
3551 /* If we've created a .plt section, and assigned a PLT entry to
3552 this function, it should not be known to bind locally. If
3553 it were, we would have cleared the PLT entry. */
3554 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
3556 value = (splt->output_section->vma
3557 + splt->output_offset
3558 + h->plt.offset);
3559 *unresolved_reloc_p = FALSE;
3560 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3561 contents, rel->r_offset, value,
3562 rel->r_addend);
3565 /* When generating a shared object or relocatable executable, these
3566 relocations are copied into the output file to be resolved at
3567 run time. */
3568 if ((info->shared || globals->root.is_relocatable_executable)
3569 && (input_section->flags & SEC_ALLOC)
3570 && (r_type != R_ARM_REL32
3571 || !SYMBOL_CALLS_LOCAL (info, h))
3572 && (h == NULL
3573 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3574 || h->root.type != bfd_link_hash_undefweak)
3575 && r_type != R_ARM_PC24
3576 && r_type != R_ARM_CALL
3577 && r_type != R_ARM_JUMP24
3578 && r_type != R_ARM_PREL31
3579 && r_type != R_ARM_PLT32)
3581 Elf_Internal_Rela outrel;
3582 bfd_byte *loc;
3583 bfd_boolean skip, relocate;
3585 *unresolved_reloc_p = FALSE;
3587 if (sreloc == NULL)
3589 const char * name;
3591 name = (bfd_elf_string_from_elf_section
3592 (input_bfd,
3593 elf_elfheader (input_bfd)->e_shstrndx,
3594 elf_section_data (input_section)->rel_hdr.sh_name));
3595 if (name == NULL)
3596 return bfd_reloc_notsupported;
3598 BFD_ASSERT (reloc_section_p (globals, name, input_section));
3600 sreloc = bfd_get_section_by_name (dynobj, name);
3601 BFD_ASSERT (sreloc != NULL);
3604 skip = FALSE;
3605 relocate = FALSE;
3607 outrel.r_addend = addend;
3608 outrel.r_offset =
3609 _bfd_elf_section_offset (output_bfd, info, input_section,
3610 rel->r_offset);
3611 if (outrel.r_offset == (bfd_vma) -1)
3612 skip = TRUE;
3613 else if (outrel.r_offset == (bfd_vma) -2)
3614 skip = TRUE, relocate = TRUE;
3615 outrel.r_offset += (input_section->output_section->vma
3616 + input_section->output_offset);
3618 if (skip)
3619 memset (&outrel, 0, sizeof outrel);
3620 else if (h != NULL
3621 && h->dynindx != -1
3622 && (!info->shared
3623 || !info->symbolic
3624 || !h->def_regular))
3625 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3626 else
3628 int symbol;
3630 /* This symbol is local, or marked to become local. */
3631 if (sym_flags == STT_ARM_TFUNC)
3632 value |= 1;
3633 if (globals->symbian_p)
3635 /* On Symbian OS, the data segment and text segement
3636 can be relocated independently. Therefore, we
3637 must indicate the segment to which this
3638 relocation is relative. The BPABI allows us to
3639 use any symbol in the right segment; we just use
3640 the section symbol as it is convenient. (We
3641 cannot use the symbol given by "h" directly as it
3642 will not appear in the dynamic symbol table.) */
3643 if (sym_sec)
3644 symbol = elf_section_data (sym_sec->output_section)->dynindx;
3645 else
3646 symbol = elf_section_data (input_section->output_section)->dynindx;
3647 BFD_ASSERT (symbol != 0);
3649 else
3650 /* On SVR4-ish systems, the dynamic loader cannot
3651 relocate the text and data segments independently,
3652 so the symbol does not matter. */
3653 symbol = 0;
3654 outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
3655 if (globals->use_rel)
3656 relocate = TRUE;
3657 else
3658 outrel.r_addend += value;
3661 loc = sreloc->contents;
3662 loc += sreloc->reloc_count++ * RELOC_SIZE (globals);
3663 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
3665 /* If this reloc is against an external symbol, we do not want to
3666 fiddle with the addend. Otherwise, we need to include the symbol
3667 value so that it becomes an addend for the dynamic reloc. */
3668 if (! relocate)
3669 return bfd_reloc_ok;
3671 return _bfd_final_link_relocate (howto, input_bfd, input_section,
3672 contents, rel->r_offset, value,
3673 (bfd_vma) 0);
3675 else switch (r_type)
3677 case R_ARM_ABS12:
3678 return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
3680 case R_ARM_XPC25: /* Arm BLX instruction. */
3681 case R_ARM_CALL:
3682 case R_ARM_JUMP24:
3683 case R_ARM_PC24: /* Arm B/BL instruction */
3684 case R_ARM_PLT32:
3685 if (r_type == R_ARM_XPC25)
3687 /* Check for Arm calling Arm function. */
3688 /* FIXME: Should we translate the instruction into a BL
3689 instruction instead ? */
3690 if (sym_flags != STT_ARM_TFUNC)
3691 (*_bfd_error_handler)
3692 (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
3693 input_bfd,
3694 h ? h->root.root.string : "(local)");
3696 else if (r_type != R_ARM_CALL || !globals->use_blx)
3698 /* Check for Arm calling Thumb function. */
3699 if (sym_flags == STT_ARM_TFUNC)
3701 elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
3702 output_bfd, input_section,
3703 hit_data, sym_sec, rel->r_offset,
3704 signed_addend, value);
3705 return bfd_reloc_ok;
3709 /* The ARM ELF ABI says that this reloc is computed as: S - P + A
3710 where:
3711 S is the address of the symbol in the relocation.
3712 P is address of the instruction being relocated.
3713 A is the addend (extracted from the instruction) in bytes.
3715 S is held in 'value'.
3716 P is the base address of the section containing the
3717 instruction plus the offset of the reloc into that
3718 section, ie:
3719 (input_section->output_section->vma +
3720 input_section->output_offset +
3721 rel->r_offset).
3722 A is the addend, converted into bytes, ie:
3723 (signed_addend * 4)
3725 Note: None of these operations have knowledge of the pipeline
3726 size of the processor, thus it is up to the assembler to
3727 encode this information into the addend. */
3728 value -= (input_section->output_section->vma
3729 + input_section->output_offset);
3730 value -= rel->r_offset;
3731 if (globals->use_rel)
3732 value += (signed_addend << howto->size);
3733 else
3734 /* RELA addends do not have to be adjusted by howto->size. */
3735 value += signed_addend;
3737 signed_addend = value;
3738 signed_addend >>= howto->rightshift;
3740 /* It is not an error for an undefined weak reference to be
3741 out of range. Any program that branches to such a symbol
3742 is going to crash anyway, so there is no point worrying
3743 about getting the destination exactly right. */
3744 if (! h || h->root.type != bfd_link_hash_undefweak)
3746 /* Perform a signed range check. */
3747 if ( signed_addend > ((bfd_signed_vma) (howto->dst_mask >> 1))
3748 || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
3749 return bfd_reloc_overflow;
3752 addend = (value & 2);
3754 value = (signed_addend & howto->dst_mask)
3755 | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
3757 /* Set the H bit in the BLX instruction. */
3758 if (sym_flags == STT_ARM_TFUNC)
3760 if (addend)
3761 value |= (1 << 24);
3762 else
3763 value &= ~(bfd_vma)(1 << 24);
3765 if (r_type == R_ARM_CALL)
3767 /* Select the correct instruction (BL or BLX). */
3768 if (sym_flags == STT_ARM_TFUNC)
3769 value |= (1 << 28);
3770 else
3772 value &= ~(bfd_vma)(1 << 28);
3773 value |= (1 << 24);
3776 break;
3778 case R_ARM_ABS32:
3779 value += addend;
3780 if (sym_flags == STT_ARM_TFUNC)
3781 value |= 1;
3782 break;
3784 case R_ARM_REL32:
3785 value += addend;
3786 if (sym_flags == STT_ARM_TFUNC)
3787 value |= 1;
3788 value -= (input_section->output_section->vma
3789 + input_section->output_offset + rel->r_offset);
3790 break;
3792 case R_ARM_PREL31:
3793 value -= (input_section->output_section->vma
3794 + input_section->output_offset + rel->r_offset);
3795 value += signed_addend;
3796 if (! h || h->root.type != bfd_link_hash_undefweak)
3798 /* Check for overflow */
3799 if ((value ^ (value >> 1)) & (1 << 30))
3800 return bfd_reloc_overflow;
3802 value &= 0x7fffffff;
3803 value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
3804 if (sym_flags == STT_ARM_TFUNC)
3805 value |= 1;
3806 break;
3809 bfd_put_32 (input_bfd, value, hit_data);
3810 return bfd_reloc_ok;
3812 case R_ARM_ABS8:
3813 value += addend;
3814 if ((long) value > 0x7f || (long) value < -0x80)
3815 return bfd_reloc_overflow;
3817 bfd_put_8 (input_bfd, value, hit_data);
3818 return bfd_reloc_ok;
3820 case R_ARM_ABS16:
3821 value += addend;
3823 if ((long) value > 0x7fff || (long) value < -0x8000)
3824 return bfd_reloc_overflow;
3826 bfd_put_16 (input_bfd, value, hit_data);
3827 return bfd_reloc_ok;
3829 case R_ARM_THM_ABS5:
3830 /* Support ldr and str instructions for the thumb. */
3831 if (globals->use_rel)
3833 /* Need to refetch addend. */
3834 addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
3835 /* ??? Need to determine shift amount from operand size. */
3836 addend >>= howto->rightshift;
3838 value += addend;
3840 /* ??? Isn't value unsigned? */
3841 if ((long) value > 0x1f || (long) value < -0x10)
3842 return bfd_reloc_overflow;
3844 /* ??? Value needs to be properly shifted into place first. */
3845 value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
3846 bfd_put_16 (input_bfd, value, hit_data);
3847 return bfd_reloc_ok;
3849 case R_ARM_THM_XPC22:
3850 case R_ARM_THM_CALL:
3851 /* Thumb BL (branch long instruction). */
3853 bfd_vma relocation;
3854 bfd_boolean overflow = FALSE;
3855 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
3856 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
3857 bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
3858 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3859 bfd_vma check;
3860 bfd_signed_vma signed_check;
3862 /* Need to refetch the addend and squish the two 11 bit pieces
3863 together. */
3864 if (globals->use_rel)
3866 bfd_vma upper = upper_insn & 0x7ff;
3867 bfd_vma lower = lower_insn & 0x7ff;
3868 upper = (upper ^ 0x400) - 0x400; /* Sign extend. */
3869 addend = (upper << 12) | (lower << 1);
3870 signed_addend = addend;
3873 if (r_type == R_ARM_THM_XPC22)
3875 /* Check for Thumb to Thumb call. */
3876 /* FIXME: Should we translate the instruction into a BL
3877 instruction instead ? */
3878 if (sym_flags == STT_ARM_TFUNC)
3879 (*_bfd_error_handler)
3880 (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
3881 input_bfd,
3882 h ? h->root.root.string : "(local)");
3884 else
3886 /* If it is not a call to Thumb, assume call to Arm.
3887 If it is a call relative to a section name, then it is not a
3888 function call at all, but rather a long jump. Calls through
3889 the PLT do not require stubs. */
3890 if (sym_flags != STT_ARM_TFUNC && sym_flags != STT_SECTION
3891 && (h == NULL || splt == NULL
3892 || h->plt.offset == (bfd_vma) -1))
3894 if (globals->use_blx)
3896 /* Convert BL to BLX. */
3897 lower_insn = (lower_insn & ~0x1000) | 0x0800;
3899 else if (elf32_thumb_to_arm_stub
3900 (info, sym_name, input_bfd, output_bfd, input_section,
3901 hit_data, sym_sec, rel->r_offset, signed_addend, value))
3902 return bfd_reloc_ok;
3903 else
3904 return bfd_reloc_dangerous;
3906 else if (sym_flags == STT_ARM_TFUNC && globals->use_blx)
3908 /* Make sure this is a BL. */
3909 lower_insn |= 0x1800;
3913 /* Handle calls via the PLT. */
3914 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
3916 value = (splt->output_section->vma
3917 + splt->output_offset
3918 + h->plt.offset);
3919 if (globals->use_blx)
3921 /* If the Thumb BLX instruction is available, convert the
3922 BL to a BLX instruction to call the ARM-mode PLT entry. */
3923 lower_insn = (lower_insn & ~0x1000) | 0x0800;
3925 else
3926 /* Target the Thumb stub before the ARM PLT entry. */
3927 value -= PLT_THUMB_STUB_SIZE;
3928 *unresolved_reloc_p = FALSE;
3931 relocation = value + signed_addend;
3933 relocation -= (input_section->output_section->vma
3934 + input_section->output_offset
3935 + rel->r_offset);
3937 check = relocation >> howto->rightshift;
3939 /* If this is a signed value, the rightshift just dropped
3940 leading 1 bits (assuming twos complement). */
3941 if ((bfd_signed_vma) relocation >= 0)
3942 signed_check = check;
3943 else
3944 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
3946 /* Assumes two's complement. */
3947 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3948 overflow = TRUE;
3950 if ((lower_insn & 0x1800) == 0x0800)
3951 /* For a BLX instruction, make sure that the relocation is rounded up
3952 to a word boundary. This follows the semantics of the instruction
3953 which specifies that bit 1 of the target address will come from bit
3954 1 of the base address. */
3955 relocation = (relocation + 2) & ~ 3;
3957 /* Put RELOCATION back into the insn. */
3958 upper_insn = (upper_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 12) & 0x7ff);
3959 lower_insn = (lower_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 1) & 0x7ff);
3961 /* Put the relocated value back in the object file: */
3962 bfd_put_16 (input_bfd, upper_insn, hit_data);
3963 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
3965 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
3967 break;
3969 case R_ARM_THM_JUMP24:
3970 /* Thumb32 unconditional branch instruction. */
3972 bfd_vma relocation;
3973 bfd_boolean overflow = FALSE;
3974 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
3975 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
3976 bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
3977 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3978 bfd_vma check;
3979 bfd_signed_vma signed_check;
3981 /* Need to refetch the addend, reconstruct the top three bits, and glue the
3982 two pieces together. */
3983 if (globals->use_rel)
3985 bfd_vma S = (upper_insn & 0x0400) >> 10;
3986 bfd_vma hi = (upper_insn & 0x03ff);
3987 bfd_vma I1 = (lower_insn & 0x2000) >> 13;
3988 bfd_vma I2 = (lower_insn & 0x0800) >> 11;
3989 bfd_vma lo = (lower_insn & 0x07ff);
3991 I1 = !(I1 ^ S);
3992 I2 = !(I2 ^ S);
3993 S = !S;
3995 signed_addend = (S << 24) | (I1 << 23) | (I2 << 22) | (hi << 12) | (lo << 1);
3996 signed_addend -= (1 << 24); /* Sign extend. */
3999 /* ??? Should handle interworking? GCC might someday try to
4000 use this for tail calls. */
4002 relocation = value + signed_addend;
4003 relocation -= (input_section->output_section->vma
4004 + input_section->output_offset
4005 + rel->r_offset);
4007 check = relocation >> howto->rightshift;
4009 /* If this is a signed value, the rightshift just dropped
4010 leading 1 bits (assuming twos complement). */
4011 if ((bfd_signed_vma) relocation >= 0)
4012 signed_check = check;
4013 else
4014 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
4016 /* Assumes two's complement. */
4017 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
4018 overflow = TRUE;
4020 /* Put RELOCATION back into the insn. */
4022 bfd_vma S = (relocation & 0x01000000) >> 24;
4023 bfd_vma I1 = (relocation & 0x00800000) >> 23;
4024 bfd_vma I2 = (relocation & 0x00400000) >> 22;
4025 bfd_vma hi = (relocation & 0x003ff000) >> 12;
4026 bfd_vma lo = (relocation & 0x00000ffe) >> 1;
4028 I1 = !(I1 ^ S);
4029 I2 = !(I2 ^ S);
4031 upper_insn = (upper_insn & (bfd_vma) 0xf800) | (S << 10) | hi;
4032 lower_insn = (lower_insn & (bfd_vma) 0xd000) | (I1 << 13) | (I2 << 11) | lo;
4035 /* Put the relocated value back in the object file: */
4036 bfd_put_16 (input_bfd, upper_insn, hit_data);
4037 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
4039 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
4042 case R_ARM_THM_JUMP19:
4043 /* Thumb32 conditional branch instruction. */
4045 bfd_vma relocation;
4046 bfd_boolean overflow = FALSE;
4047 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
4048 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
4049 bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
4050 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
4051 bfd_vma check;
4052 bfd_signed_vma signed_check;
4054 /* Need to refetch the addend, reconstruct the top three bits,
4055 and squish the two 11 bit pieces together. */
4056 if (globals->use_rel)
4058 bfd_vma S = (upper_insn & 0x0400) >> 10;
4059 bfd_vma upper = (upper_insn & 0x001f);
4060 bfd_vma J1 = (lower_insn & 0x2000) >> 13;
4061 bfd_vma J2 = (lower_insn & 0x0800) >> 11;
4062 bfd_vma lower = (lower_insn & 0x07ff);
4064 upper |= J2 << 6;
4065 upper |= J1 << 7;
4066 upper |= ~S << 8;
4067 upper -= 0x0100; /* Sign extend. */
4069 addend = (upper << 12) | (lower << 1);
4070 signed_addend = addend;
4073 /* ??? Should handle interworking? GCC might someday try to
4074 use this for tail calls. */
4076 relocation = value + signed_addend;
4077 relocation -= (input_section->output_section->vma
4078 + input_section->output_offset
4079 + rel->r_offset);
4081 check = relocation >> howto->rightshift;
4083 /* If this is a signed value, the rightshift just dropped
4084 leading 1 bits (assuming twos complement). */
4085 if ((bfd_signed_vma) relocation >= 0)
4086 signed_check = check;
4087 else
4088 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
4090 /* Assumes two's complement. */
4091 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
4092 overflow = TRUE;
4094 /* Put RELOCATION back into the insn. */
4096 bfd_vma S = (relocation & 0x00100000) >> 20;
4097 bfd_vma J2 = (relocation & 0x00080000) >> 19;
4098 bfd_vma J1 = (relocation & 0x00040000) >> 18;
4099 bfd_vma hi = (relocation & 0x0003f000) >> 12;
4100 bfd_vma lo = (relocation & 0x00000ffe) >> 1;
4102 upper_insn = (upper_insn & 0xfb30) | (S << 10) | hi;
4103 lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
4106 /* Put the relocated value back in the object file: */
4107 bfd_put_16 (input_bfd, upper_insn, hit_data);
4108 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
4110 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
4113 case R_ARM_THM_JUMP11:
4114 case R_ARM_THM_JUMP8:
4115 case R_ARM_THM_JUMP6:
4116 /* Thumb B (branch) instruction). */
4118 bfd_signed_vma relocation;
4119 bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
4120 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
4121 bfd_signed_vma signed_check;
4123 /* CZB cannot jump backward. */
4124 if (r_type == R_ARM_THM_JUMP6)
4125 reloc_signed_min = 0;
4127 if (globals->use_rel)
4129 /* Need to refetch addend. */
4130 addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
4131 if (addend & ((howto->src_mask + 1) >> 1))
4133 signed_addend = -1;
4134 signed_addend &= ~ howto->src_mask;
4135 signed_addend |= addend;
4137 else
4138 signed_addend = addend;
4139 /* The value in the insn has been right shifted. We need to
4140 undo this, so that we can perform the address calculation
4141 in terms of bytes. */
4142 signed_addend <<= howto->rightshift;
4144 relocation = value + signed_addend;
4146 relocation -= (input_section->output_section->vma
4147 + input_section->output_offset
4148 + rel->r_offset);
4150 relocation >>= howto->rightshift;
4151 signed_check = relocation;
4153 if (r_type == R_ARM_THM_JUMP6)
4154 relocation = ((relocation & 0x0020) << 4) | ((relocation & 0x001f) << 3);
4155 else
4156 relocation &= howto->dst_mask;
4157 relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
4159 bfd_put_16 (input_bfd, relocation, hit_data);
4161 /* Assumes two's complement. */
4162 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
4163 return bfd_reloc_overflow;
4165 return bfd_reloc_ok;
4168 case R_ARM_ALU_PCREL7_0:
4169 case R_ARM_ALU_PCREL15_8:
4170 case R_ARM_ALU_PCREL23_15:
4172 bfd_vma insn;
4173 bfd_vma relocation;
4175 insn = bfd_get_32 (input_bfd, hit_data);
4176 if (globals->use_rel)
4178 /* Extract the addend. */
4179 addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
4180 signed_addend = addend;
4182 relocation = value + signed_addend;
4184 relocation -= (input_section->output_section->vma
4185 + input_section->output_offset
4186 + rel->r_offset);
4187 insn = (insn & ~0xfff)
4188 | ((howto->bitpos << 7) & 0xf00)
4189 | ((relocation >> howto->bitpos) & 0xff);
4190 bfd_put_32 (input_bfd, value, hit_data);
4192 return bfd_reloc_ok;
4194 case R_ARM_GNU_VTINHERIT:
4195 case R_ARM_GNU_VTENTRY:
4196 return bfd_reloc_ok;
4198 case R_ARM_GOTOFF32:
4199 /* Relocation is relative to the start of the
4200 global offset table. */
4202 BFD_ASSERT (sgot != NULL);
4203 if (sgot == NULL)
4204 return bfd_reloc_notsupported;
4206 /* If we are addressing a Thumb function, we need to adjust the
4207 address by one, so that attempts to call the function pointer will
4208 correctly interpret it as Thumb code. */
4209 if (sym_flags == STT_ARM_TFUNC)
4210 value += 1;
4212 /* Note that sgot->output_offset is not involved in this
4213 calculation. We always want the start of .got. If we
4214 define _GLOBAL_OFFSET_TABLE in a different way, as is
4215 permitted by the ABI, we might have to change this
4216 calculation. */
4217 value -= sgot->output_section->vma;
4218 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4219 contents, rel->r_offset, value,
4220 rel->r_addend);
4222 case R_ARM_GOTPC:
4223 /* Use global offset table as symbol value. */
4224 BFD_ASSERT (sgot != NULL);
4226 if (sgot == NULL)
4227 return bfd_reloc_notsupported;
4229 *unresolved_reloc_p = FALSE;
4230 value = sgot->output_section->vma;
4231 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4232 contents, rel->r_offset, value,
4233 rel->r_addend);
4235 case R_ARM_GOT32:
4236 case R_ARM_GOT_PREL:
4237 /* Relocation is to the entry for this symbol in the
4238 global offset table. */
4239 if (sgot == NULL)
4240 return bfd_reloc_notsupported;
4242 if (h != NULL)
4244 bfd_vma off;
4245 bfd_boolean dyn;
4247 off = h->got.offset;
4248 BFD_ASSERT (off != (bfd_vma) -1);
4249 dyn = globals->root.dynamic_sections_created;
4251 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
4252 || (info->shared
4253 && SYMBOL_REFERENCES_LOCAL (info, h))
4254 || (ELF_ST_VISIBILITY (h->other)
4255 && h->root.type == bfd_link_hash_undefweak))
4257 /* This is actually a static link, or it is a -Bsymbolic link
4258 and the symbol is defined locally. We must initialize this
4259 entry in the global offset table. Since the offset must
4260 always be a multiple of 4, we use the least significant bit
4261 to record whether we have initialized it already.
4263 When doing a dynamic link, we create a .rel(a).got relocation
4264 entry to initialize the value. This is done in the
4265 finish_dynamic_symbol routine. */
4266 if ((off & 1) != 0)
4267 off &= ~1;
4268 else
4270 /* If we are addressing a Thumb function, we need to
4271 adjust the address by one, so that attempts to
4272 call the function pointer will correctly
4273 interpret it as Thumb code. */
4274 if (sym_flags == STT_ARM_TFUNC)
4275 value |= 1;
4277 bfd_put_32 (output_bfd, value, sgot->contents + off);
4278 h->got.offset |= 1;
4281 else
4282 *unresolved_reloc_p = FALSE;
4284 value = sgot->output_offset + off;
4286 else
4288 bfd_vma off;
4290 BFD_ASSERT (local_got_offsets != NULL &&
4291 local_got_offsets[r_symndx] != (bfd_vma) -1);
4293 off = local_got_offsets[r_symndx];
4295 /* The offset must always be a multiple of 4. We use the
4296 least significant bit to record whether we have already
4297 generated the necessary reloc. */
4298 if ((off & 1) != 0)
4299 off &= ~1;
4300 else
4302 /* If we are addressing a Thumb function, we need to
4303 adjust the address by one, so that attempts to
4304 call the function pointer will correctly
4305 interpret it as Thumb code. */
4306 if (sym_flags == STT_ARM_TFUNC)
4307 value |= 1;
4309 if (globals->use_rel)
4310 bfd_put_32 (output_bfd, value, sgot->contents + off);
4312 if (info->shared)
4314 asection * srelgot;
4315 Elf_Internal_Rela outrel;
4316 bfd_byte *loc;
4318 srelgot = (bfd_get_section_by_name
4319 (dynobj, RELOC_SECTION (globals, ".got")));
4320 BFD_ASSERT (srelgot != NULL);
4322 outrel.r_addend = addend + value;
4323 outrel.r_offset = (sgot->output_section->vma
4324 + sgot->output_offset
4325 + off);
4326 outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
4327 loc = srelgot->contents;
4328 loc += srelgot->reloc_count++ * RELOC_SIZE (globals);
4329 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
4332 local_got_offsets[r_symndx] |= 1;
4335 value = sgot->output_offset + off;
4337 if (r_type != R_ARM_GOT32)
4338 value += sgot->output_section->vma;
4340 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4341 contents, rel->r_offset, value,
4342 rel->r_addend);
4344 case R_ARM_TLS_LDO32:
4345 value = value - dtpoff_base (info);
4347 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4348 contents, rel->r_offset, value,
4349 rel->r_addend);
4351 case R_ARM_TLS_LDM32:
4353 bfd_vma off;
4355 if (globals->sgot == NULL)
4356 abort ();
4358 off = globals->tls_ldm_got.offset;
4360 if ((off & 1) != 0)
4361 off &= ~1;
4362 else
4364 /* If we don't know the module number, create a relocation
4365 for it. */
4366 if (info->shared)
4368 Elf_Internal_Rela outrel;
4369 bfd_byte *loc;
4371 if (globals->srelgot == NULL)
4372 abort ();
4374 outrel.r_addend = 0;
4375 outrel.r_offset = (globals->sgot->output_section->vma
4376 + globals->sgot->output_offset + off);
4377 outrel.r_info = ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32);
4379 if (globals->use_rel)
4380 bfd_put_32 (output_bfd, outrel.r_addend,
4381 globals->sgot->contents + off);
4383 loc = globals->srelgot->contents;
4384 loc += globals->srelgot->reloc_count++ * RELOC_SIZE (globals);
4385 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
4387 else
4388 bfd_put_32 (output_bfd, 1, globals->sgot->contents + off);
4390 globals->tls_ldm_got.offset |= 1;
4393 value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
4394 - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
4396 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4397 contents, rel->r_offset, value,
4398 rel->r_addend);
4401 case R_ARM_TLS_GD32:
4402 case R_ARM_TLS_IE32:
4404 bfd_vma off;
4405 int indx;
4406 char tls_type;
4408 if (globals->sgot == NULL)
4409 abort ();
4411 indx = 0;
4412 if (h != NULL)
4414 bfd_boolean dyn;
4415 dyn = globals->root.dynamic_sections_created;
4416 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
4417 && (!info->shared
4418 || !SYMBOL_REFERENCES_LOCAL (info, h)))
4420 *unresolved_reloc_p = FALSE;
4421 indx = h->dynindx;
4423 off = h->got.offset;
4424 tls_type = ((struct elf32_arm_link_hash_entry *) h)->tls_type;
4426 else
4428 if (local_got_offsets == NULL)
4429 abort ();
4430 off = local_got_offsets[r_symndx];
4431 tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
4434 if (tls_type == GOT_UNKNOWN)
4435 abort ();
4437 if ((off & 1) != 0)
4438 off &= ~1;
4439 else
4441 bfd_boolean need_relocs = FALSE;
4442 Elf_Internal_Rela outrel;
4443 bfd_byte *loc = NULL;
4444 int cur_off = off;
4446 /* The GOT entries have not been initialized yet. Do it
4447 now, and emit any relocations. If both an IE GOT and a
4448 GD GOT are necessary, we emit the GD first. */
4450 if ((info->shared || indx != 0)
4451 && (h == NULL
4452 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4453 || h->root.type != bfd_link_hash_undefweak))
4455 need_relocs = TRUE;
4456 if (globals->srelgot == NULL)
4457 abort ();
4458 loc = globals->srelgot->contents;
4459 loc += globals->srelgot->reloc_count * RELOC_SIZE (globals);
4462 if (tls_type & GOT_TLS_GD)
4464 if (need_relocs)
4466 outrel.r_addend = 0;
4467 outrel.r_offset = (globals->sgot->output_section->vma
4468 + globals->sgot->output_offset
4469 + cur_off);
4470 outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DTPMOD32);
4472 if (globals->use_rel)
4473 bfd_put_32 (output_bfd, outrel.r_addend,
4474 globals->sgot->contents + cur_off);
4476 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
4477 globals->srelgot->reloc_count++;
4478 loc += RELOC_SIZE (globals);
4480 if (indx == 0)
4481 bfd_put_32 (output_bfd, value - dtpoff_base (info),
4482 globals->sgot->contents + cur_off + 4);
4483 else
4485 outrel.r_addend = 0;
4486 outrel.r_info = ELF32_R_INFO (indx,
4487 R_ARM_TLS_DTPOFF32);
4488 outrel.r_offset += 4;
4490 if (globals->use_rel)
4491 bfd_put_32 (output_bfd, outrel.r_addend,
4492 globals->sgot->contents + cur_off + 4);
4495 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
4496 globals->srelgot->reloc_count++;
4497 loc += RELOC_SIZE (globals);
4500 else
4502 /* If we are not emitting relocations for a
4503 general dynamic reference, then we must be in a
4504 static link or an executable link with the
4505 symbol binding locally. Mark it as belonging
4506 to module 1, the executable. */
4507 bfd_put_32 (output_bfd, 1,
4508 globals->sgot->contents + cur_off);
4509 bfd_put_32 (output_bfd, value - dtpoff_base (info),
4510 globals->sgot->contents + cur_off + 4);
4513 cur_off += 8;
4516 if (tls_type & GOT_TLS_IE)
4518 if (need_relocs)
4520 if (indx == 0)
4521 outrel.r_addend = value - dtpoff_base (info);
4522 else
4523 outrel.r_addend = 0;
4524 outrel.r_offset = (globals->sgot->output_section->vma
4525 + globals->sgot->output_offset
4526 + cur_off);
4527 outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_TPOFF32);
4529 if (globals->use_rel)
4530 bfd_put_32 (output_bfd, outrel.r_addend,
4531 globals->sgot->contents + cur_off);
4533 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
4534 globals->srelgot->reloc_count++;
4535 loc += RELOC_SIZE (globals);
4537 else
4538 bfd_put_32 (output_bfd, tpoff (info, value),
4539 globals->sgot->contents + cur_off);
4540 cur_off += 4;
4543 if (h != NULL)
4544 h->got.offset |= 1;
4545 else
4546 local_got_offsets[r_symndx] |= 1;
4549 if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32)
4550 off += 8;
4551 value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
4552 - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
4554 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4555 contents, rel->r_offset, value,
4556 rel->r_addend);
4559 case R_ARM_TLS_LE32:
4560 if (info->shared)
4562 (*_bfd_error_handler)
4563 (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
4564 input_bfd, input_section,
4565 (long) rel->r_offset, howto->name);
4566 return FALSE;
4568 else
4569 value = tpoff (info, value);
4571 return _bfd_final_link_relocate (howto, input_bfd, input_section,
4572 contents, rel->r_offset, value,
4573 rel->r_addend);
4575 case R_ARM_V4BX:
4576 if (globals->fix_v4bx)
4578 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
4580 /* Ensure that we have a BX instruction. */
4581 BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
4583 /* Preserve Rm (lowest four bits) and the condition code
4584 (highest four bits). Other bits encode MOV PC,Rm. */
4585 insn = (insn & 0xf000000f) | 0x01a0f000;
4587 bfd_put_32 (input_bfd, insn, hit_data);
4589 return bfd_reloc_ok;
4591 case R_ARM_MOVW_ABS_NC:
4592 case R_ARM_MOVT_ABS:
4593 case R_ARM_MOVW_PREL_NC:
4594 case R_ARM_MOVT_PREL:
4596 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
4598 if (globals->use_rel)
4600 addend = ((insn >> 4) & 0xf000) | (insn & 0xfff);
4601 signed_addend = (addend ^ 0x10000) - 0x10000;
4603 value += signed_addend;
4604 if (sym_flags == STT_ARM_TFUNC)
4605 value |= 1;
4607 if (r_type == R_ARM_MOVW_PREL_NC || r_type == R_ARM_MOVT_PREL)
4608 value -= (input_section->output_section->vma
4609 + input_section->output_offset + rel->r_offset);
4611 if (r_type == R_ARM_MOVT_ABS || r_type == R_ARM_MOVT_PREL)
4612 value >>= 16;
4614 insn &= 0xfff0f000;
4615 insn |= value & 0xfff;
4616 insn |= (value & 0xf000) << 4;
4617 bfd_put_32 (input_bfd, insn, hit_data);
4619 return bfd_reloc_ok;
4621 case R_ARM_THM_MOVW_ABS_NC:
4622 case R_ARM_THM_MOVT_ABS:
4623 case R_ARM_THM_MOVW_PREL_NC:
4624 case R_ARM_THM_MOVT_PREL:
4626 bfd_vma insn;
4628 insn = bfd_get_16 (input_bfd, hit_data) << 16;
4629 insn |= bfd_get_16 (input_bfd, hit_data + 2);
4631 if (globals->use_rel)
4633 addend = ((insn >> 4) & 0xf000)
4634 | ((insn >> 15) & 0x0800)
4635 | ((insn >> 4) & 0x0700)
4636 | (insn & 0x00ff);
4637 signed_addend = (addend ^ 0x10000) - 0x10000;
4639 value += signed_addend;
4640 if (sym_flags == STT_ARM_TFUNC)
4641 value |= 1;
4643 if (r_type == R_ARM_THM_MOVW_PREL_NC || r_type == R_ARM_THM_MOVT_PREL)
4644 value -= (input_section->output_section->vma
4645 + input_section->output_offset + rel->r_offset);
4647 if (r_type == R_ARM_THM_MOVT_ABS || r_type == R_ARM_THM_MOVT_PREL)
4648 value >>= 16;
4650 insn &= 0xfbf08f00;
4651 insn |= (value & 0xf000) << 4;
4652 insn |= (value & 0x0800) << 15;
4653 insn |= (value & 0x0700) << 4;
4654 insn |= (value & 0x00ff);
4656 bfd_put_16 (input_bfd, insn >> 16, hit_data);
4657 bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
4659 return bfd_reloc_ok;
4661 case R_ARM_ALU_PC_G0_NC:
4662 case R_ARM_ALU_PC_G1_NC:
4663 case R_ARM_ALU_PC_G0:
4664 case R_ARM_ALU_PC_G1:
4665 case R_ARM_ALU_PC_G2:
4666 case R_ARM_ALU_SB_G0_NC:
4667 case R_ARM_ALU_SB_G1_NC:
4668 case R_ARM_ALU_SB_G0:
4669 case R_ARM_ALU_SB_G1:
4670 case R_ARM_ALU_SB_G2:
4672 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
4673 bfd_vma pc = input_section->output_section->vma
4674 + input_section->output_offset + rel->r_offset;
4675 /* sb should be the origin of the *segment* containing the symbol.
4676 It is not clear how to obtain this OS-dependent value, so we
4677 make an arbitrary choice of zero. */
4678 bfd_vma sb = 0;
4679 bfd_vma residual;
4680 bfd_vma g_n;
4681 bfd_signed_vma signed_value;
4682 int group = 0;
4684 /* Determine which group of bits to select. */
4685 switch (r_type)
4687 case R_ARM_ALU_PC_G0_NC:
4688 case R_ARM_ALU_PC_G0:
4689 case R_ARM_ALU_SB_G0_NC:
4690 case R_ARM_ALU_SB_G0:
4691 group = 0;
4692 break;
4694 case R_ARM_ALU_PC_G1_NC:
4695 case R_ARM_ALU_PC_G1:
4696 case R_ARM_ALU_SB_G1_NC:
4697 case R_ARM_ALU_SB_G1:
4698 group = 1;
4699 break;
4701 case R_ARM_ALU_PC_G2:
4702 case R_ARM_ALU_SB_G2:
4703 group = 2;
4704 break;
4706 default:
4707 abort();
4710 /* If REL, extract the addend from the insn. If RELA, it will
4711 have already been fetched for us. */
4712 if (globals->use_rel)
4714 int negative;
4715 bfd_vma constant = insn & 0xff;
4716 bfd_vma rotation = (insn & 0xf00) >> 8;
4718 if (rotation == 0)
4719 signed_addend = constant;
4720 else
4722 /* Compensate for the fact that in the instruction, the
4723 rotation is stored in multiples of 2 bits. */
4724 rotation *= 2;
4726 /* Rotate "constant" right by "rotation" bits. */
4727 signed_addend = (constant >> rotation) |
4728 (constant << (8 * sizeof (bfd_vma) - rotation));
4731 /* Determine if the instruction is an ADD or a SUB.
4732 (For REL, this determines the sign of the addend.) */
4733 negative = identify_add_or_sub (insn);
4734 if (negative == 0)
4736 (*_bfd_error_handler)
4737 (_("%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group relocations"),
4738 input_bfd, input_section,
4739 (long) rel->r_offset, howto->name);
4740 return bfd_reloc_overflow;
4743 signed_addend *= negative;
4746 /* Compute the value (X) to go in the place. */
4747 if (r_type == R_ARM_ALU_PC_G0_NC
4748 || r_type == R_ARM_ALU_PC_G1_NC
4749 || r_type == R_ARM_ALU_PC_G0
4750 || r_type == R_ARM_ALU_PC_G1
4751 || r_type == R_ARM_ALU_PC_G2)
4752 /* PC relative. */
4753 signed_value = value - pc + signed_addend;
4754 else
4755 /* Section base relative. */
4756 signed_value = value - sb + signed_addend;
4758 /* If the target symbol is a Thumb function, then set the
4759 Thumb bit in the address. */
4760 if (sym_flags == STT_ARM_TFUNC)
4761 signed_value |= 1;
4763 /* Calculate the value of the relevant G_n, in encoded
4764 constant-with-rotation format. */
4765 g_n = calculate_group_reloc_mask (abs (signed_value), group,
4766 &residual);
4768 /* Check for overflow if required. */
4769 if ((r_type == R_ARM_ALU_PC_G0
4770 || r_type == R_ARM_ALU_PC_G1
4771 || r_type == R_ARM_ALU_PC_G2
4772 || r_type == R_ARM_ALU_SB_G0
4773 || r_type == R_ARM_ALU_SB_G1
4774 || r_type == R_ARM_ALU_SB_G2) && residual != 0)
4776 (*_bfd_error_handler)
4777 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
4778 input_bfd, input_section,
4779 (long) rel->r_offset, abs (signed_value), howto->name);
4780 return bfd_reloc_overflow;
4783 /* Mask out the value and the ADD/SUB part of the opcode; take care
4784 not to destroy the S bit. */
4785 insn &= 0xff1ff000;
4787 /* Set the opcode according to whether the value to go in the
4788 place is negative. */
4789 if (signed_value < 0)
4790 insn |= 1 << 22;
4791 else
4792 insn |= 1 << 23;
4794 /* Encode the offset. */
4795 insn |= g_n;
4797 bfd_put_32 (input_bfd, insn, hit_data);
4799 return bfd_reloc_ok;
4801 case R_ARM_LDR_PC_G0:
4802 case R_ARM_LDR_PC_G1:
4803 case R_ARM_LDR_PC_G2:
4804 case R_ARM_LDR_SB_G0:
4805 case R_ARM_LDR_SB_G1:
4806 case R_ARM_LDR_SB_G2:
4808 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
4809 bfd_vma pc = input_section->output_section->vma
4810 + input_section->output_offset + rel->r_offset;
4811 bfd_vma sb = 0; /* See note above. */
4812 bfd_vma residual;
4813 bfd_signed_vma signed_value;
4814 int group = 0;
4816 /* Determine which groups of bits to calculate. */
4817 switch (r_type)
4819 case R_ARM_LDR_PC_G0:
4820 case R_ARM_LDR_SB_G0:
4821 group = 0;
4822 break;
4824 case R_ARM_LDR_PC_G1:
4825 case R_ARM_LDR_SB_G1:
4826 group = 1;
4827 break;
4829 case R_ARM_LDR_PC_G2:
4830 case R_ARM_LDR_SB_G2:
4831 group = 2;
4832 break;
4834 default:
4835 abort();
4838 /* If REL, extract the addend from the insn. If RELA, it will
4839 have already been fetched for us. */
4840 if (globals->use_rel)
4842 int negative = (insn & (1 << 23)) ? 1 : -1;
4843 signed_addend = negative * (insn & 0xfff);
4846 /* Compute the value (X) to go in the place. */
4847 if (r_type == R_ARM_LDR_PC_G0
4848 || r_type == R_ARM_LDR_PC_G1
4849 || r_type == R_ARM_LDR_PC_G2)
4850 /* PC relative. */
4851 signed_value = value - pc + signed_addend;
4852 else
4853 /* Section base relative. */
4854 signed_value = value - sb + signed_addend;
4856 /* Calculate the value of the relevant G_{n-1} to obtain
4857 the residual at that stage. */
4858 calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
4860 /* Check for overflow. */
4861 if (residual >= 0x1000)
4863 (*_bfd_error_handler)
4864 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
4865 input_bfd, input_section,
4866 (long) rel->r_offset, abs (signed_value), howto->name);
4867 return bfd_reloc_overflow;
4870 /* Mask out the value and U bit. */
4871 insn &= 0xff7ff000;
4873 /* Set the U bit if the value to go in the place is non-negative. */
4874 if (signed_value >= 0)
4875 insn |= 1 << 23;
4877 /* Encode the offset. */
4878 insn |= residual;
4880 bfd_put_32 (input_bfd, insn, hit_data);
4882 return bfd_reloc_ok;
4884 case R_ARM_LDRS_PC_G0:
4885 case R_ARM_LDRS_PC_G1:
4886 case R_ARM_LDRS_PC_G2:
4887 case R_ARM_LDRS_SB_G0:
4888 case R_ARM_LDRS_SB_G1:
4889 case R_ARM_LDRS_SB_G2:
4891 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
4892 bfd_vma pc = input_section->output_section->vma
4893 + input_section->output_offset + rel->r_offset;
4894 bfd_vma sb = 0; /* See note above. */
4895 bfd_vma residual;
4896 bfd_signed_vma signed_value;
4897 int group = 0;
4899 /* Determine which groups of bits to calculate. */
4900 switch (r_type)
4902 case R_ARM_LDRS_PC_G0:
4903 case R_ARM_LDRS_SB_G0:
4904 group = 0;
4905 break;
4907 case R_ARM_LDRS_PC_G1:
4908 case R_ARM_LDRS_SB_G1:
4909 group = 1;
4910 break;
4912 case R_ARM_LDRS_PC_G2:
4913 case R_ARM_LDRS_SB_G2:
4914 group = 2;
4915 break;
4917 default:
4918 abort();
4921 /* If REL, extract the addend from the insn. If RELA, it will
4922 have already been fetched for us. */
4923 if (globals->use_rel)
4925 int negative = (insn & (1 << 23)) ? 1 : -1;
4926 signed_addend = negative * (((insn & 0xf00) >> 4) + (insn & 0xf));
4929 /* Compute the value (X) to go in the place. */
4930 if (r_type == R_ARM_LDRS_PC_G0
4931 || r_type == R_ARM_LDRS_PC_G1
4932 || r_type == R_ARM_LDRS_PC_G2)
4933 /* PC relative. */
4934 signed_value = value - pc + signed_addend;
4935 else
4936 /* Section base relative. */
4937 signed_value = value - sb + signed_addend;
4939 /* Calculate the value of the relevant G_{n-1} to obtain
4940 the residual at that stage. */
4941 calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
4943 /* Check for overflow. */
4944 if (residual >= 0x100)
4946 (*_bfd_error_handler)
4947 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
4948 input_bfd, input_section,
4949 (long) rel->r_offset, abs (signed_value), howto->name);
4950 return bfd_reloc_overflow;
4953 /* Mask out the value and U bit. */
4954 insn &= 0xff7ff0f0;
4956 /* Set the U bit if the value to go in the place is non-negative. */
4957 if (signed_value >= 0)
4958 insn |= 1 << 23;
4960 /* Encode the offset. */
4961 insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
4963 bfd_put_32 (input_bfd, insn, hit_data);
4965 return bfd_reloc_ok;
4967 case R_ARM_LDC_PC_G0:
4968 case R_ARM_LDC_PC_G1:
4969 case R_ARM_LDC_PC_G2:
4970 case R_ARM_LDC_SB_G0:
4971 case R_ARM_LDC_SB_G1:
4972 case R_ARM_LDC_SB_G2:
4974 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
4975 bfd_vma pc = input_section->output_section->vma
4976 + input_section->output_offset + rel->r_offset;
4977 bfd_vma sb = 0; /* See note above. */
4978 bfd_vma residual;
4979 bfd_signed_vma signed_value;
4980 int group = 0;
4982 /* Determine which groups of bits to calculate. */
4983 switch (r_type)
4985 case R_ARM_LDC_PC_G0:
4986 case R_ARM_LDC_SB_G0:
4987 group = 0;
4988 break;
4990 case R_ARM_LDC_PC_G1:
4991 case R_ARM_LDC_SB_G1:
4992 group = 1;
4993 break;
4995 case R_ARM_LDC_PC_G2:
4996 case R_ARM_LDC_SB_G2:
4997 group = 2;
4998 break;
5000 default:
5001 abort();
5004 /* If REL, extract the addend from the insn. If RELA, it will
5005 have already been fetched for us. */
5006 if (globals->use_rel)
5008 int negative = (insn & (1 << 23)) ? 1 : -1;
5009 signed_addend = negative * ((insn & 0xff) << 2);
5012 /* Compute the value (X) to go in the place. */
5013 if (r_type == R_ARM_LDC_PC_G0
5014 || r_type == R_ARM_LDC_PC_G1
5015 || r_type == R_ARM_LDC_PC_G2)
5016 /* PC relative. */
5017 signed_value = value - pc + signed_addend;
5018 else
5019 /* Section base relative. */
5020 signed_value = value - sb + signed_addend;
5022 /* Calculate the value of the relevant G_{n-1} to obtain
5023 the residual at that stage. */
5024 calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
5026 /* Check for overflow. (The absolute value to go in the place must be
5027 divisible by four and, after having been divided by four, must
5028 fit in eight bits.) */
5029 if ((residual & 0x3) != 0 || residual >= 0x400)
5031 (*_bfd_error_handler)
5032 (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
5033 input_bfd, input_section,
5034 (long) rel->r_offset, abs (signed_value), howto->name);
5035 return bfd_reloc_overflow;
5038 /* Mask out the value and U bit. */
5039 insn &= 0xff7fff00;
5041 /* Set the U bit if the value to go in the place is non-negative. */
5042 if (signed_value >= 0)
5043 insn |= 1 << 23;
5045 /* Encode the offset. */
5046 insn |= residual >> 2;
5048 bfd_put_32 (input_bfd, insn, hit_data);
5050 return bfd_reloc_ok;
5052 default:
5053 return bfd_reloc_notsupported;
5058 static int
5059 uleb128_size (unsigned int i)
5061 int size;
5062 size = 1;
5063 while (i >= 0x80)
5065 i >>= 7;
5066 size++;
5068 return size;
5071 /* Return TRUE if the attribute has the default value (0/""). */
5072 static bfd_boolean
5073 is_default_attr (aeabi_attribute *attr)
5075 if ((attr->type & 1) && attr->i != 0)
5076 return FALSE;
5077 if ((attr->type & 2) && attr->s && *attr->s)
5078 return FALSE;
5080 return TRUE;
5083 /* Return the size of a single attribute. */
5084 static bfd_vma
5085 eabi_attr_size(int tag, aeabi_attribute *attr)
5087 bfd_vma size;
5089 if (is_default_attr (attr))
5090 return 0;
5092 size = uleb128_size (tag);
5093 if (attr->type & 1)
5094 size += uleb128_size (attr->i);
5095 if (attr->type & 2)
5096 size += strlen ((char *)attr->s) + 1;
5097 return size;
5100 /* Returns the size of the eabi object attributess section. */
5101 bfd_vma
5102 elf32_arm_eabi_attr_size (bfd *abfd)
5104 bfd_vma size;
5105 aeabi_attribute *attr;
5106 aeabi_attribute_list *list;
5107 int i;
5109 attr = elf32_arm_tdata (abfd)->known_eabi_attributes;
5110 size = 16; /* 'A' <size> "aeabi" 0x1 <size>. */
5111 for (i = 4; i < NUM_KNOWN_ATTRIBUTES; i++)
5112 size += eabi_attr_size (i, &attr[i]);
5114 for (list = elf32_arm_tdata (abfd)->other_eabi_attributes;
5115 list;
5116 list = list->next)
5117 size += eabi_attr_size (list->tag, &list->attr);
5119 return size;
5122 static bfd_byte *
5123 write_uleb128 (bfd_byte *p, unsigned int val)
5125 bfd_byte c;
5128 c = val & 0x7f;
5129 val >>= 7;
5130 if (val)
5131 c |= 0x80;
5132 *(p++) = c;
5134 while (val);
5135 return p;
5138 /* Write attribute ATTR to butter P, and return a pointer to the following
5139 byte. */
5140 static bfd_byte *
5141 write_eabi_attribute (bfd_byte *p, int tag, aeabi_attribute *attr)
5143 /* Suppress default entries. */
5144 if (is_default_attr(attr))
5145 return p;
5147 p = write_uleb128 (p, tag);
5148 if (attr->type & 1)
5149 p = write_uleb128 (p, attr->i);
5150 if (attr->type & 2)
5152 int len;
5154 len = strlen (attr->s) + 1;
5155 memcpy (p, attr->s, len);
5156 p += len;
5159 return p;
5162 /* Write the contents of the eabi attributes section to p. */
5163 void
5164 elf32_arm_set_eabi_attr_contents (bfd *abfd, bfd_byte *contents, bfd_vma size)
5166 bfd_byte *p;
5167 aeabi_attribute *attr;
5168 aeabi_attribute_list *list;
5169 int i;
5171 p = contents;
5172 *(p++) = 'A';
5173 bfd_put_32 (abfd, size - 1, p);
5174 p += 4;
5175 memcpy (p, "aeabi", 6);
5176 p += 6;
5177 *(p++) = Tag_File;
5178 bfd_put_32 (abfd, size - 11, p);
5179 p += 4;
5181 attr = elf32_arm_tdata (abfd)->known_eabi_attributes;
5182 for (i = 4; i < NUM_KNOWN_ATTRIBUTES; i++)
5183 p = write_eabi_attribute (p, i, &attr[i]);
5185 for (list = elf32_arm_tdata (abfd)->other_eabi_attributes;
5186 list;
5187 list = list->next)
5188 p = write_eabi_attribute (p, list->tag, &list->attr);
5191 /* Override final_link to handle EABI object attribute sections. */
5193 static bfd_boolean
5194 elf32_arm_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
5196 asection *o;
5197 struct bfd_link_order *p;
5198 asection *attr_section = NULL;
5199 bfd_byte *contents;
5200 bfd_vma size = 0;
5202 /* elf32_arm_merge_private_bfd_data will already have merged the
5203 object attributes. Remove the input sections from the link, and set
5204 the contents of the output secton. */
5205 for (o = abfd->sections; o != NULL; o = o->next)
5207 if (strcmp (o->name, ".ARM.attributes") == 0)
5209 for (p = o->map_head.link_order; p != NULL; p = p->next)
5211 asection *input_section;
5213 if (p->type != bfd_indirect_link_order)
5214 continue;
5215 input_section = p->u.indirect.section;
5216 /* Hack: reset the SEC_HAS_CONTENTS flag so that
5217 elf_link_input_bfd ignores this section. */
5218 input_section->flags &= ~SEC_HAS_CONTENTS;
5221 size = elf32_arm_eabi_attr_size (abfd);
5222 bfd_set_section_size (abfd, o, size);
5223 attr_section = o;
5224 /* Skip this section later on. */
5225 o->map_head.link_order = NULL;
5228 /* Invoke the ELF linker to do all the work. */
5229 if (!bfd_elf_final_link (abfd, info))
5230 return FALSE;
5232 if (attr_section)
5234 contents = bfd_malloc(size);
5235 if (contents == NULL)
5236 return FALSE;
5237 elf32_arm_set_eabi_attr_contents (abfd, contents, size);
5238 bfd_set_section_contents (abfd, attr_section, contents, 0, size);
5239 free (contents);
5241 return TRUE;
5245 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS. */
5246 static void
5247 arm_add_to_rel (bfd * abfd,
5248 bfd_byte * address,
5249 reloc_howto_type * howto,
5250 bfd_signed_vma increment)
5252 bfd_signed_vma addend;
5254 if (howto->type == R_ARM_THM_CALL)
5256 int upper_insn, lower_insn;
5257 int upper, lower;
5259 upper_insn = bfd_get_16 (abfd, address);
5260 lower_insn = bfd_get_16 (abfd, address + 2);
5261 upper = upper_insn & 0x7ff;
5262 lower = lower_insn & 0x7ff;
5264 addend = (upper << 12) | (lower << 1);
5265 addend += increment;
5266 addend >>= 1;
5268 upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
5269 lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
5271 bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
5272 bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
5274 else
5276 bfd_vma contents;
5278 contents = bfd_get_32 (abfd, address);
5280 /* Get the (signed) value from the instruction. */
5281 addend = contents & howto->src_mask;
5282 if (addend & ((howto->src_mask + 1) >> 1))
5284 bfd_signed_vma mask;
5286 mask = -1;
5287 mask &= ~ howto->src_mask;
5288 addend |= mask;
5291 /* Add in the increment, (which is a byte value). */
5292 switch (howto->type)
5294 default:
5295 addend += increment;
5296 break;
5298 case R_ARM_PC24:
5299 case R_ARM_PLT32:
5300 case R_ARM_CALL:
5301 case R_ARM_JUMP24:
5302 addend <<= howto->size;
5303 addend += increment;
5305 /* Should we check for overflow here ? */
5307 /* Drop any undesired bits. */
5308 addend >>= howto->rightshift;
5309 break;
5312 contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
5314 bfd_put_32 (abfd, contents, address);
5318 #define IS_ARM_TLS_RELOC(R_TYPE) \
5319 ((R_TYPE) == R_ARM_TLS_GD32 \
5320 || (R_TYPE) == R_ARM_TLS_LDO32 \
5321 || (R_TYPE) == R_ARM_TLS_LDM32 \
5322 || (R_TYPE) == R_ARM_TLS_DTPOFF32 \
5323 || (R_TYPE) == R_ARM_TLS_DTPMOD32 \
5324 || (R_TYPE) == R_ARM_TLS_TPOFF32 \
5325 || (R_TYPE) == R_ARM_TLS_LE32 \
5326 || (R_TYPE) == R_ARM_TLS_IE32)
5328 /* Relocate an ARM ELF section. */
5329 static bfd_boolean
5330 elf32_arm_relocate_section (bfd * output_bfd,
5331 struct bfd_link_info * info,
5332 bfd * input_bfd,
5333 asection * input_section,
5334 bfd_byte * contents,
5335 Elf_Internal_Rela * relocs,
5336 Elf_Internal_Sym * local_syms,
5337 asection ** local_sections)
5339 Elf_Internal_Shdr *symtab_hdr;
5340 struct elf_link_hash_entry **sym_hashes;
5341 Elf_Internal_Rela *rel;
5342 Elf_Internal_Rela *relend;
5343 const char *name;
5344 struct elf32_arm_link_hash_table * globals;
5346 globals = elf32_arm_hash_table (info);
5347 if (info->relocatable && !globals->use_rel)
5348 return TRUE;
5350 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
5351 sym_hashes = elf_sym_hashes (input_bfd);
5353 rel = relocs;
5354 relend = relocs + input_section->reloc_count;
5355 for (; rel < relend; rel++)
5357 int r_type;
5358 reloc_howto_type * howto;
5359 unsigned long r_symndx;
5360 Elf_Internal_Sym * sym;
5361 asection * sec;
5362 struct elf_link_hash_entry * h;
5363 bfd_vma relocation;
5364 bfd_reloc_status_type r;
5365 arelent bfd_reloc;
5366 char sym_type;
5367 bfd_boolean unresolved_reloc = FALSE;
5369 r_symndx = ELF32_R_SYM (rel->r_info);
5370 r_type = ELF32_R_TYPE (rel->r_info);
5371 r_type = arm_real_reloc_type (globals, r_type);
5373 if ( r_type == R_ARM_GNU_VTENTRY
5374 || r_type == R_ARM_GNU_VTINHERIT)
5375 continue;
5377 bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
5378 howto = bfd_reloc.howto;
5380 if (info->relocatable && globals->use_rel)
5382 /* This is a relocatable link. We don't have to change
5383 anything, unless the reloc is against a section symbol,
5384 in which case we have to adjust according to where the
5385 section symbol winds up in the output section. */
5386 if (r_symndx < symtab_hdr->sh_info)
5388 sym = local_syms + r_symndx;
5389 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5391 sec = local_sections[r_symndx];
5392 arm_add_to_rel (input_bfd, contents + rel->r_offset,
5393 howto,
5394 (bfd_signed_vma) (sec->output_offset
5395 + sym->st_value));
5399 continue;
5402 /* This is a final link. */
5403 h = NULL;
5404 sym = NULL;
5405 sec = NULL;
5407 if (r_symndx < symtab_hdr->sh_info)
5409 sym = local_syms + r_symndx;
5410 sym_type = ELF32_ST_TYPE (sym->st_info);
5411 sec = local_sections[r_symndx];
5412 if (globals->use_rel)
5414 relocation = (sec->output_section->vma
5415 + sec->output_offset
5416 + sym->st_value);
5417 if ((sec->flags & SEC_MERGE)
5418 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5420 asection *msec;
5421 bfd_vma addend, value;
5423 if (howto->rightshift)
5425 (*_bfd_error_handler)
5426 (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
5427 input_bfd, input_section,
5428 (long) rel->r_offset, howto->name);
5429 return FALSE;
5432 value = bfd_get_32 (input_bfd, contents + rel->r_offset);
5434 /* Get the (signed) value from the instruction. */
5435 addend = value & howto->src_mask;
5436 if (addend & ((howto->src_mask + 1) >> 1))
5438 bfd_signed_vma mask;
5440 mask = -1;
5441 mask &= ~ howto->src_mask;
5442 addend |= mask;
5444 msec = sec;
5445 addend =
5446 _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
5447 - relocation;
5448 addend += msec->output_section->vma + msec->output_offset;
5449 value = (value & ~ howto->dst_mask) | (addend & howto->dst_mask);
5450 bfd_put_32 (input_bfd, value, contents + rel->r_offset);
5453 else
5454 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
5456 else
5458 bfd_boolean warned;
5460 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
5461 r_symndx, symtab_hdr, sym_hashes,
5462 h, sec, relocation,
5463 unresolved_reloc, warned);
5465 sym_type = h->type;
5468 if (h != NULL)
5469 name = h->root.root.string;
5470 else
5472 name = (bfd_elf_string_from_elf_section
5473 (input_bfd, symtab_hdr->sh_link, sym->st_name));
5474 if (name == NULL || *name == '\0')
5475 name = bfd_section_name (input_bfd, sec);
5478 if (r_symndx != 0
5479 && r_type != R_ARM_NONE
5480 && (h == NULL
5481 || h->root.type == bfd_link_hash_defined
5482 || h->root.type == bfd_link_hash_defweak)
5483 && IS_ARM_TLS_RELOC (r_type) != (sym_type == STT_TLS))
5485 (*_bfd_error_handler)
5486 ((sym_type == STT_TLS
5487 ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
5488 : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
5489 input_bfd,
5490 input_section,
5491 (long) rel->r_offset,
5492 howto->name,
5493 name);
5496 r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
5497 input_section, contents, rel,
5498 relocation, info, sec, name,
5499 (h ? ELF_ST_TYPE (h->type) :
5500 ELF_ST_TYPE (sym->st_info)), h,
5501 &unresolved_reloc);
5503 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5504 because such sections are not SEC_ALLOC and thus ld.so will
5505 not process them. */
5506 if (unresolved_reloc
5507 && !((input_section->flags & SEC_DEBUGGING) != 0
5508 && h->def_dynamic))
5510 (*_bfd_error_handler)
5511 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5512 input_bfd,
5513 input_section,
5514 (long) rel->r_offset,
5515 howto->name,
5516 h->root.root.string);
5517 return FALSE;
5520 if (r != bfd_reloc_ok)
5522 const char * msg = (const char *) 0;
5524 switch (r)
5526 case bfd_reloc_overflow:
5527 /* If the overflowing reloc was to an undefined symbol,
5528 we have already printed one error message and there
5529 is no point complaining again. */
5530 if ((! h ||
5531 h->root.type != bfd_link_hash_undefined)
5532 && (!((*info->callbacks->reloc_overflow)
5533 (info, (h ? &h->root : NULL), name, howto->name,
5534 (bfd_vma) 0, input_bfd, input_section,
5535 rel->r_offset))))
5536 return FALSE;
5537 break;
5539 case bfd_reloc_undefined:
5540 if (!((*info->callbacks->undefined_symbol)
5541 (info, name, input_bfd, input_section,
5542 rel->r_offset, TRUE)))
5543 return FALSE;
5544 break;
5546 case bfd_reloc_outofrange:
5547 msg = _("internal error: out of range error");
5548 goto common_error;
5550 case bfd_reloc_notsupported:
5551 msg = _("internal error: unsupported relocation error");
5552 goto common_error;
5554 case bfd_reloc_dangerous:
5555 msg = _("internal error: dangerous error");
5556 goto common_error;
5558 default:
5559 msg = _("internal error: unknown error");
5560 /* fall through */
5562 common_error:
5563 if (!((*info->callbacks->warning)
5564 (info, msg, name, input_bfd, input_section,
5565 rel->r_offset)))
5566 return FALSE;
5567 break;
5572 return TRUE;
5575 /* Allocate/find an object attribute. */
5576 static aeabi_attribute *
5577 elf32_arm_new_eabi_attr (bfd *abfd, int tag)
5579 aeabi_attribute *attr;
5580 aeabi_attribute_list *list;
5581 aeabi_attribute_list *p;
5582 aeabi_attribute_list **lastp;
5585 if (tag < NUM_KNOWN_ATTRIBUTES)
5587 /* Knwon tags are preallocated. */
5588 attr = &elf32_arm_tdata (abfd)->known_eabi_attributes[tag];
5590 else
5592 /* Create a new tag. */
5593 list = (aeabi_attribute_list *)
5594 bfd_alloc (abfd, sizeof (aeabi_attribute_list));
5595 memset (list, 0, sizeof (aeabi_attribute_list));
5596 list->tag = tag;
5597 /* Keep the tag list in order. */
5598 lastp = &elf32_arm_tdata (abfd)->other_eabi_attributes;
5599 for (p = *lastp; p; p = p->next)
5601 if (tag < p->tag)
5602 break;
5603 lastp = &p->next;
5605 list->next = *lastp;
5606 *lastp = list;
5607 attr = &list->attr;
5610 return attr;
5614 elf32_arm_get_eabi_attr_int (bfd *abfd, int tag)
5616 aeabi_attribute_list *p;
5618 if (tag < NUM_KNOWN_ATTRIBUTES)
5620 /* Knwon tags are preallocated. */
5621 return elf32_arm_tdata (abfd)->known_eabi_attributes[tag].i;
5623 else
5625 for (p = elf32_arm_tdata (abfd)->other_eabi_attributes;
5627 p = p->next)
5629 if (tag == p->tag)
5630 return p->attr.i;
5631 if (tag < p->tag)
5632 break;
5634 return 0;
5638 void
5639 elf32_arm_add_eabi_attr_int (bfd *abfd, int tag, unsigned int i)
5641 aeabi_attribute *attr;
5643 attr = elf32_arm_new_eabi_attr (abfd, tag);
5644 attr->type = 1;
5645 attr->i = i;
5648 static char *
5649 attr_strdup (bfd *abfd, const char * s)
5651 char * p;
5652 int len;
5654 len = strlen (s) + 1;
5655 p = (char *)bfd_alloc(abfd, len);
5656 return memcpy (p, s, len);
5659 void
5660 elf32_arm_add_eabi_attr_string (bfd *abfd, int tag, const char *s)
5662 aeabi_attribute *attr;
5664 attr = elf32_arm_new_eabi_attr (abfd, tag);
5665 attr->type = 2;
5666 attr->s = attr_strdup (abfd, s);
5669 void
5670 elf32_arm_add_eabi_attr_compat (bfd *abfd, unsigned int i, const char *s)
5672 aeabi_attribute_list *list;
5673 aeabi_attribute_list *p;
5674 aeabi_attribute_list **lastp;
5676 list = (aeabi_attribute_list *)
5677 bfd_alloc (abfd, sizeof (aeabi_attribute_list));
5678 memset (list, 0, sizeof (aeabi_attribute_list));
5679 list->tag = Tag_compatibility;
5680 list->attr.type = 3;
5681 list->attr.i = i;
5682 list->attr.s = attr_strdup (abfd, s);
5684 lastp = &elf32_arm_tdata (abfd)->other_eabi_attributes;
5685 for (p = *lastp; p; p = p->next)
5687 int cmp;
5688 if (p->tag != Tag_compatibility)
5689 break;
5690 cmp = strcmp(s, p->attr.s);
5691 if (cmp < 0 || (cmp == 0 && i < p->attr.i))
5692 break;
5693 lastp = &p->next;
5695 list->next = *lastp;
5696 *lastp = list;
5699 /* Set the right machine number. */
5701 static bfd_boolean
5702 elf32_arm_object_p (bfd *abfd)
5704 unsigned int mach;
5706 mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
5708 if (mach != bfd_mach_arm_unknown)
5709 bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
5711 else if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
5712 bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
5714 else
5715 bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
5717 return TRUE;
5720 /* Function to keep ARM specific flags in the ELF header. */
5722 static bfd_boolean
5723 elf32_arm_set_private_flags (bfd *abfd, flagword flags)
5725 if (elf_flags_init (abfd)
5726 && elf_elfheader (abfd)->e_flags != flags)
5728 if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
5730 if (flags & EF_ARM_INTERWORK)
5731 (*_bfd_error_handler)
5732 (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
5733 abfd);
5734 else
5735 _bfd_error_handler
5736 (_("Warning: Clearing the interworking flag of %B due to outside request"),
5737 abfd);
5740 else
5742 elf_elfheader (abfd)->e_flags = flags;
5743 elf_flags_init (abfd) = TRUE;
5746 return TRUE;
5749 /* Copy the eabi object attribute from IBFD to OBFD. */
5750 static void
5751 copy_eabi_attributes (bfd *ibfd, bfd *obfd)
5753 aeabi_attribute *in_attr;
5754 aeabi_attribute *out_attr;
5755 aeabi_attribute_list *list;
5756 int i;
5758 in_attr = elf32_arm_tdata (ibfd)->known_eabi_attributes;
5759 out_attr = elf32_arm_tdata (obfd)->known_eabi_attributes;
5760 for (i = 4; i < NUM_KNOWN_ATTRIBUTES; i++)
5762 out_attr->i = in_attr->i;
5763 if (in_attr->s && *in_attr->s)
5764 out_attr->s = attr_strdup (obfd, in_attr->s);
5765 in_attr++;
5766 out_attr++;
5769 for (list = elf32_arm_tdata (ibfd)->other_eabi_attributes;
5770 list;
5771 list = list->next)
5773 in_attr = &list->attr;
5774 switch (in_attr->type)
5776 case 1:
5777 elf32_arm_add_eabi_attr_int (obfd, list->tag, in_attr->i);
5778 break;
5779 case 2:
5780 elf32_arm_add_eabi_attr_string (obfd, list->tag, in_attr->s);
5781 break;
5782 case 3:
5783 elf32_arm_add_eabi_attr_compat (obfd, in_attr->i, in_attr->s);
5784 break;
5785 default:
5786 abort();
5792 /* Copy backend specific data from one object module to another. */
5794 static bfd_boolean
5795 elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
5797 flagword in_flags;
5798 flagword out_flags;
5800 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
5801 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
5802 return TRUE;
5804 in_flags = elf_elfheader (ibfd)->e_flags;
5805 out_flags = elf_elfheader (obfd)->e_flags;
5807 if (elf_flags_init (obfd)
5808 && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
5809 && in_flags != out_flags)
5811 /* Cannot mix APCS26 and APCS32 code. */
5812 if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
5813 return FALSE;
5815 /* Cannot mix float APCS and non-float APCS code. */
5816 if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
5817 return FALSE;
5819 /* If the src and dest have different interworking flags
5820 then turn off the interworking bit. */
5821 if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
5823 if (out_flags & EF_ARM_INTERWORK)
5824 _bfd_error_handler
5825 (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
5826 obfd, ibfd);
5828 in_flags &= ~EF_ARM_INTERWORK;
5831 /* Likewise for PIC, though don't warn for this case. */
5832 if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
5833 in_flags &= ~EF_ARM_PIC;
5836 elf_elfheader (obfd)->e_flags = in_flags;
5837 elf_flags_init (obfd) = TRUE;
5839 /* Also copy the EI_OSABI field. */
5840 elf_elfheader (obfd)->e_ident[EI_OSABI] =
5841 elf_elfheader (ibfd)->e_ident[EI_OSABI];
5843 /* Copy EABI object attributes. */
5844 copy_eabi_attributes (ibfd, obfd);
5846 return TRUE;
5849 /* Values for Tag_ABI_PCS_R9_use. */
5850 enum
5852 AEABI_R9_V6,
5853 AEABI_R9_SB,
5854 AEABI_R9_TLS,
5855 AEABI_R9_unused
5858 /* Values for Tag_ABI_PCS_RW_data. */
5859 enum
5861 AEABI_PCS_RW_data_absolute,
5862 AEABI_PCS_RW_data_PCrel,
5863 AEABI_PCS_RW_data_SBrel,
5864 AEABI_PCS_RW_data_unused
5867 /* Values for Tag_ABI_enum_size. */
5868 enum
5870 AEABI_enum_unused,
5871 AEABI_enum_short,
5872 AEABI_enum_wide,
5873 AEABI_enum_forced_wide
5876 /* Merge EABI object attributes from IBFD into OBFD. Raise an error if there
5877 are conflicting attributes. */
5878 static bfd_boolean
5879 elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
5881 aeabi_attribute *in_attr;
5882 aeabi_attribute *out_attr;
5883 aeabi_attribute_list *in_list;
5884 aeabi_attribute_list *out_list;
5885 /* Some tags have 0 = don't care, 1 = strong requirement,
5886 2 = weak requirement. */
5887 static const int order_312[3] = {3, 1, 2};
5888 int i;
5890 if (!elf32_arm_tdata (ibfd)->known_eabi_attributes[0].i)
5892 /* This is the first object. Copy the attributes. */
5893 copy_eabi_attributes (ibfd, obfd);
5894 return TRUE;
5897 /* Use the Tag_null value to indicate the attributes have been
5898 initialized. */
5899 elf32_arm_tdata (ibfd)->known_eabi_attributes[0].i = 1;
5901 in_attr = elf32_arm_tdata (ibfd)->known_eabi_attributes;
5902 out_attr = elf32_arm_tdata (obfd)->known_eabi_attributes;
5903 /* This needs to happen before Tag_ABI_FP_number_model is merged. */
5904 if (in_attr[Tag_ABI_VFP_args].i != out_attr[Tag_ABI_VFP_args].i)
5906 /* Ignore mismatches if teh object doesn't use floating point. */
5907 if (out_attr[Tag_ABI_FP_number_model].i == 0)
5908 out_attr[Tag_ABI_VFP_args].i = in_attr[Tag_ABI_VFP_args].i;
5909 else if (in_attr[Tag_ABI_FP_number_model].i != 0)
5911 _bfd_error_handler
5912 (_("ERROR: %B uses VFP register arguments, %B does not"),
5913 ibfd, obfd);
5914 return FALSE;
5918 for (i = 4; i < NUM_KNOWN_ATTRIBUTES; i++)
5920 /* Merge this attribute with existing attributes. */
5921 switch (i)
5923 case Tag_CPU_raw_name:
5924 case Tag_CPU_name:
5925 /* Use whichever has the greatest architecture requirements. */
5926 if (in_attr[Tag_CPU_arch].i > out_attr[Tag_CPU_arch].i)
5927 out_attr[i].s = attr_strdup(obfd, in_attr[i].s);
5928 break;
5930 case Tag_ABI_optimization_goals:
5931 case Tag_ABI_FP_optimization_goals:
5932 /* Use the first value seen. */
5933 break;
5935 case Tag_CPU_arch:
5936 case Tag_ARM_ISA_use:
5937 case Tag_THUMB_ISA_use:
5938 case Tag_VFP_arch:
5939 case Tag_WMMX_arch:
5940 case Tag_NEON_arch:
5941 /* ??? Do NEON and WMMX conflict? */
5942 case Tag_ABI_FP_rounding:
5943 case Tag_ABI_FP_denormal:
5944 case Tag_ABI_FP_exceptions:
5945 case Tag_ABI_FP_user_exceptions:
5946 case Tag_ABI_FP_number_model:
5947 case Tag_ABI_align8_preserved:
5948 case Tag_ABI_HardFP_use:
5949 /* Use the largest value specified. */
5950 if (in_attr[i].i > out_attr[i].i)
5951 out_attr[i].i = in_attr[i].i;
5952 break;
5954 case Tag_CPU_arch_profile:
5955 /* Warn if conflicting architecture profiles used. */
5956 if (out_attr[i].i && in_attr[i].i && in_attr[i].i != out_attr[i].i)
5958 _bfd_error_handler
5959 (_("ERROR: %B: Conflicting architecture profiles %c/%c"),
5960 ibfd, in_attr[i].i, out_attr[i].i);
5961 return FALSE;
5963 if (in_attr[i].i)
5964 out_attr[i].i = in_attr[i].i;
5965 break;
5966 case Tag_PCS_config:
5967 if (out_attr[i].i == 0)
5968 out_attr[i].i = in_attr[i].i;
5969 else if (in_attr[i].i != 0 && out_attr[i].i != 0)
5971 /* It's sometimes ok to mix different configs, so this is only
5972 a warning. */
5973 _bfd_error_handler
5974 (_("Warning: %B: Conflicting platform configuration"), ibfd);
5976 break;
5977 case Tag_ABI_PCS_R9_use:
5978 if (out_attr[i].i != AEABI_R9_unused
5979 && in_attr[i].i != AEABI_R9_unused)
5981 _bfd_error_handler
5982 (_("ERROR: %B: Conflicting use of R9"), ibfd);
5983 return FALSE;
5985 if (out_attr[i].i == AEABI_R9_unused)
5986 out_attr[i].i = in_attr[i].i;
5987 break;
5988 case Tag_ABI_PCS_RW_data:
5989 if (in_attr[i].i == AEABI_PCS_RW_data_SBrel
5990 && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_SB
5991 && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_unused)
5993 _bfd_error_handler
5994 (_("ERROR: %B: SB relative addressing conflicts with use of R9"),
5995 ibfd);
5996 return FALSE;
5998 /* Use the smallest value specified. */
5999 if (in_attr[i].i < out_attr[i].i)
6000 out_attr[i].i = in_attr[i].i;
6001 break;
6002 case Tag_ABI_PCS_RO_data:
6003 /* Use the smallest value specified. */
6004 if (in_attr[i].i < out_attr[i].i)
6005 out_attr[i].i = in_attr[i].i;
6006 break;
6007 case Tag_ABI_PCS_GOT_use:
6008 if (in_attr[i].i > 2 || out_attr[i].i > 2
6009 || order_312[in_attr[i].i] < order_312[out_attr[i].i])
6010 out_attr[i].i = in_attr[i].i;
6011 break;
6012 case Tag_ABI_PCS_wchar_t:
6013 if (out_attr[i].i && in_attr[i].i && out_attr[i].i != in_attr[i].i)
6015 _bfd_error_handler
6016 (_("ERROR: %B: Conflicting definitions of wchar_t"), ibfd);
6017 return FALSE;
6019 if (in_attr[i].i)
6020 out_attr[i].i = in_attr[i].i;
6021 break;
6022 case Tag_ABI_align8_needed:
6023 /* ??? Check against Tag_ABI_align8_preserved. */
6024 if (in_attr[i].i > 2 || out_attr[i].i > 2
6025 || order_312[in_attr[i].i] < order_312[out_attr[i].i])
6026 out_attr[i].i = in_attr[i].i;
6027 break;
6028 case Tag_ABI_enum_size:
6029 if (in_attr[i].i != AEABI_enum_unused)
6031 if (out_attr[i].i == AEABI_enum_unused
6032 || out_attr[i].i == AEABI_enum_forced_wide)
6034 /* The existing object is compatible with anything.
6035 Use whatever requirements the new object has. */
6036 out_attr[i].i = in_attr[i].i;
6038 else if (in_attr[i].i != AEABI_enum_forced_wide
6039 && out_attr[i].i != in_attr[i].i)
6041 _bfd_error_handler
6042 (_("ERROR: %B: Conflicting enum sizes"), ibfd);
6045 break;
6046 case Tag_ABI_VFP_args:
6047 /* Aready done. */
6048 break;
6049 case Tag_ABI_WMMX_args:
6050 if (in_attr[i].i != out_attr[i].i)
6052 _bfd_error_handler
6053 (_("ERROR: %B uses iWMMXt register arguments, %B does not"),
6054 ibfd, obfd);
6055 return FALSE;
6057 break;
6058 default: /* All known attributes should be explicitly covered. */
6059 abort ();
6063 in_list = elf32_arm_tdata (ibfd)->other_eabi_attributes;
6064 out_list = elf32_arm_tdata (ibfd)->other_eabi_attributes;
6065 while (in_list && in_list->tag == Tag_compatibility)
6067 in_attr = &in_list->attr;
6068 if (in_attr->i == 0)
6069 continue;
6070 if (in_attr->i == 1)
6072 _bfd_error_handler
6073 (_("ERROR: %B: Must be processed by '%s' toolchain"),
6074 ibfd, in_attr->s);
6075 return FALSE;
6077 if (!out_list || out_list->tag != Tag_compatibility
6078 || strcmp (in_attr->s, out_list->attr.s) != 0)
6080 /* Add this compatibility tag to the output. */
6081 elf32_arm_add_eabi_attr_compat (obfd, in_attr->i, in_attr->s);
6082 continue;
6084 out_attr = &out_list->attr;
6085 /* Check all the input tags with the same identifier. */
6086 for (;;)
6088 if (out_list->tag != Tag_compatibility
6089 || in_attr->i != out_attr->i
6090 || strcmp (in_attr->s, out_attr->s) != 0)
6092 _bfd_error_handler
6093 (_("ERROR: %B: Incompatible object tag '%s':%d"),
6094 ibfd, in_attr->s, in_attr->i);
6095 return FALSE;
6097 in_list = in_list->next;
6098 if (in_list->tag != Tag_compatibility
6099 || strcmp (in_attr->s, in_list->attr.s) != 0)
6100 break;
6101 in_attr = &in_list->attr;
6102 out_list = out_list->next;
6103 if (out_list)
6104 out_attr = &out_list->attr;
6107 /* Check the output doesn't have extra tags with this identifier. */
6108 if (out_list && out_list->tag == Tag_compatibility
6109 && strcmp (in_attr->s, out_list->attr.s) == 0)
6111 _bfd_error_handler
6112 (_("ERROR: %B: Incompatible object tag '%s':%d"),
6113 ibfd, in_attr->s, out_list->attr.i);
6114 return FALSE;
6118 for (; in_list; in_list = in_list->next)
6120 if ((in_list->tag & 128) < 64)
6122 _bfd_error_handler
6123 (_("Warning: %B: Unknown EABI object attribute %d"),
6124 ibfd, in_list->tag);
6125 break;
6128 return TRUE;
6132 /* Return TRUE if the two EABI versions are incompatible. */
6134 static bfd_boolean
6135 elf32_arm_versions_compatible (unsigned iver, unsigned over)
6137 /* v4 and v5 are the same spec before and after it was released,
6138 so allow mixing them. */
6139 if ((iver == EF_ARM_EABI_VER4 && over == EF_ARM_EABI_VER5)
6140 || (iver == EF_ARM_EABI_VER5 && over == EF_ARM_EABI_VER4))
6141 return TRUE;
6143 return (iver == over);
6146 /* Merge backend specific data from an object file to the output
6147 object file when linking. */
6149 static bfd_boolean
6150 elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
6152 flagword out_flags;
6153 flagword in_flags;
6154 bfd_boolean flags_compatible = TRUE;
6155 asection *sec;
6157 /* Check if we have the same endianess. */
6158 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
6159 return FALSE;
6161 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6162 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6163 return TRUE;
6165 if (!elf32_arm_merge_eabi_attributes (ibfd, obfd))
6166 return FALSE;
6168 /* The input BFD must have had its flags initialised. */
6169 /* The following seems bogus to me -- The flags are initialized in
6170 the assembler but I don't think an elf_flags_init field is
6171 written into the object. */
6172 /* BFD_ASSERT (elf_flags_init (ibfd)); */
6174 in_flags = elf_elfheader (ibfd)->e_flags;
6175 out_flags = elf_elfheader (obfd)->e_flags;
6177 if (!elf_flags_init (obfd))
6179 /* If the input is the default architecture and had the default
6180 flags then do not bother setting the flags for the output
6181 architecture, instead allow future merges to do this. If no
6182 future merges ever set these flags then they will retain their
6183 uninitialised values, which surprise surprise, correspond
6184 to the default values. */
6185 if (bfd_get_arch_info (ibfd)->the_default
6186 && elf_elfheader (ibfd)->e_flags == 0)
6187 return TRUE;
6189 elf_flags_init (obfd) = TRUE;
6190 elf_elfheader (obfd)->e_flags = in_flags;
6192 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
6193 && bfd_get_arch_info (obfd)->the_default)
6194 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
6196 return TRUE;
6199 /* Determine what should happen if the input ARM architecture
6200 does not match the output ARM architecture. */
6201 if (! bfd_arm_merge_machines (ibfd, obfd))
6202 return FALSE;
6204 /* Identical flags must be compatible. */
6205 if (in_flags == out_flags)
6206 return TRUE;
6208 /* Check to see if the input BFD actually contains any sections. If
6209 not, its flags may not have been initialised either, but it
6210 cannot actually cause any incompatiblity. Do not short-circuit
6211 dynamic objects; their section list may be emptied by
6212 elf_link_add_object_symbols.
6214 Also check to see if there are no code sections in the input.
6215 In this case there is no need to check for code specific flags.
6216 XXX - do we need to worry about floating-point format compatability
6217 in data sections ? */
6218 if (!(ibfd->flags & DYNAMIC))
6220 bfd_boolean null_input_bfd = TRUE;
6221 bfd_boolean only_data_sections = TRUE;
6223 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
6225 /* Ignore synthetic glue sections. */
6226 if (strcmp (sec->name, ".glue_7")
6227 && strcmp (sec->name, ".glue_7t"))
6229 if ((bfd_get_section_flags (ibfd, sec)
6230 & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
6231 == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
6232 only_data_sections = FALSE;
6234 null_input_bfd = FALSE;
6235 break;
6239 if (null_input_bfd || only_data_sections)
6240 return TRUE;
6243 /* Complain about various flag mismatches. */
6244 if (!elf32_arm_versions_compatible (EF_ARM_EABI_VERSION (in_flags),
6245 EF_ARM_EABI_VERSION (out_flags)))
6247 _bfd_error_handler
6248 (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
6249 ibfd, obfd,
6250 (in_flags & EF_ARM_EABIMASK) >> 24,
6251 (out_flags & EF_ARM_EABIMASK) >> 24);
6252 return FALSE;
6255 /* Not sure what needs to be checked for EABI versions >= 1. */
6256 /* VxWorks libraries do not use these flags. */
6257 if (get_elf_backend_data (obfd) != &elf32_arm_vxworks_bed
6258 && get_elf_backend_data (ibfd) != &elf32_arm_vxworks_bed
6259 && EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
6261 if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
6263 _bfd_error_handler
6264 (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
6265 ibfd, obfd,
6266 in_flags & EF_ARM_APCS_26 ? 26 : 32,
6267 out_flags & EF_ARM_APCS_26 ? 26 : 32);
6268 flags_compatible = FALSE;
6271 if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
6273 if (in_flags & EF_ARM_APCS_FLOAT)
6274 _bfd_error_handler
6275 (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"),
6276 ibfd, obfd);
6277 else
6278 _bfd_error_handler
6279 (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"),
6280 ibfd, obfd);
6282 flags_compatible = FALSE;
6285 if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
6287 if (in_flags & EF_ARM_VFP_FLOAT)
6288 _bfd_error_handler
6289 (_("ERROR: %B uses VFP instructions, whereas %B does not"),
6290 ibfd, obfd);
6291 else
6292 _bfd_error_handler
6293 (_("ERROR: %B uses FPA instructions, whereas %B does not"),
6294 ibfd, obfd);
6296 flags_compatible = FALSE;
6299 if ((in_flags & EF_ARM_MAVERICK_FLOAT) != (out_flags & EF_ARM_MAVERICK_FLOAT))
6301 if (in_flags & EF_ARM_MAVERICK_FLOAT)
6302 _bfd_error_handler
6303 (_("ERROR: %B uses Maverick instructions, whereas %B does not"),
6304 ibfd, obfd);
6305 else
6306 _bfd_error_handler
6307 (_("ERROR: %B does not use Maverick instructions, whereas %B does"),
6308 ibfd, obfd);
6310 flags_compatible = FALSE;
6313 #ifdef EF_ARM_SOFT_FLOAT
6314 if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
6316 /* We can allow interworking between code that is VFP format
6317 layout, and uses either soft float or integer regs for
6318 passing floating point arguments and results. We already
6319 know that the APCS_FLOAT flags match; similarly for VFP
6320 flags. */
6321 if ((in_flags & EF_ARM_APCS_FLOAT) != 0
6322 || (in_flags & EF_ARM_VFP_FLOAT) == 0)
6324 if (in_flags & EF_ARM_SOFT_FLOAT)
6325 _bfd_error_handler
6326 (_("ERROR: %B uses software FP, whereas %B uses hardware FP"),
6327 ibfd, obfd);
6328 else
6329 _bfd_error_handler
6330 (_("ERROR: %B uses hardware FP, whereas %B uses software FP"),
6331 ibfd, obfd);
6333 flags_compatible = FALSE;
6336 #endif
6338 /* Interworking mismatch is only a warning. */
6339 if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
6341 if (in_flags & EF_ARM_INTERWORK)
6343 _bfd_error_handler
6344 (_("Warning: %B supports interworking, whereas %B does not"),
6345 ibfd, obfd);
6347 else
6349 _bfd_error_handler
6350 (_("Warning: %B does not support interworking, whereas %B does"),
6351 ibfd, obfd);
6356 return flags_compatible;
6359 /* Display the flags field. */
6361 static bfd_boolean
6362 elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
6364 FILE * file = (FILE *) ptr;
6365 unsigned long flags;
6367 BFD_ASSERT (abfd != NULL && ptr != NULL);
6369 /* Print normal ELF private data. */
6370 _bfd_elf_print_private_bfd_data (abfd, ptr);
6372 flags = elf_elfheader (abfd)->e_flags;
6373 /* Ignore init flag - it may not be set, despite the flags field
6374 containing valid data. */
6376 /* xgettext:c-format */
6377 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
6379 switch (EF_ARM_EABI_VERSION (flags))
6381 case EF_ARM_EABI_UNKNOWN:
6382 /* The following flag bits are GNU extensions and not part of the
6383 official ARM ELF extended ABI. Hence they are only decoded if
6384 the EABI version is not set. */
6385 if (flags & EF_ARM_INTERWORK)
6386 fprintf (file, _(" [interworking enabled]"));
6388 if (flags & EF_ARM_APCS_26)
6389 fprintf (file, " [APCS-26]");
6390 else
6391 fprintf (file, " [APCS-32]");
6393 if (flags & EF_ARM_VFP_FLOAT)
6394 fprintf (file, _(" [VFP float format]"));
6395 else if (flags & EF_ARM_MAVERICK_FLOAT)
6396 fprintf (file, _(" [Maverick float format]"));
6397 else
6398 fprintf (file, _(" [FPA float format]"));
6400 if (flags & EF_ARM_APCS_FLOAT)
6401 fprintf (file, _(" [floats passed in float registers]"));
6403 if (flags & EF_ARM_PIC)
6404 fprintf (file, _(" [position independent]"));
6406 if (flags & EF_ARM_NEW_ABI)
6407 fprintf (file, _(" [new ABI]"));
6409 if (flags & EF_ARM_OLD_ABI)
6410 fprintf (file, _(" [old ABI]"));
6412 if (flags & EF_ARM_SOFT_FLOAT)
6413 fprintf (file, _(" [software FP]"));
6415 flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
6416 | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
6417 | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT
6418 | EF_ARM_MAVERICK_FLOAT);
6419 break;
6421 case EF_ARM_EABI_VER1:
6422 fprintf (file, _(" [Version1 EABI]"));
6424 if (flags & EF_ARM_SYMSARESORTED)
6425 fprintf (file, _(" [sorted symbol table]"));
6426 else
6427 fprintf (file, _(" [unsorted symbol table]"));
6429 flags &= ~ EF_ARM_SYMSARESORTED;
6430 break;
6432 case EF_ARM_EABI_VER2:
6433 fprintf (file, _(" [Version2 EABI]"));
6435 if (flags & EF_ARM_SYMSARESORTED)
6436 fprintf (file, _(" [sorted symbol table]"));
6437 else
6438 fprintf (file, _(" [unsorted symbol table]"));
6440 if (flags & EF_ARM_DYNSYMSUSESEGIDX)
6441 fprintf (file, _(" [dynamic symbols use segment index]"));
6443 if (flags & EF_ARM_MAPSYMSFIRST)
6444 fprintf (file, _(" [mapping symbols precede others]"));
6446 flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
6447 | EF_ARM_MAPSYMSFIRST);
6448 break;
6450 case EF_ARM_EABI_VER3:
6451 fprintf (file, _(" [Version3 EABI]"));
6452 break;
6454 case EF_ARM_EABI_VER4:
6455 fprintf (file, _(" [Version4 EABI]"));
6456 goto eabi;
6458 case EF_ARM_EABI_VER5:
6459 fprintf (file, _(" [Version5 EABI]"));
6460 eabi:
6461 if (flags & EF_ARM_BE8)
6462 fprintf (file, _(" [BE8]"));
6464 if (flags & EF_ARM_LE8)
6465 fprintf (file, _(" [LE8]"));
6467 flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
6468 break;
6470 default:
6471 fprintf (file, _(" <EABI version unrecognised>"));
6472 break;
6475 flags &= ~ EF_ARM_EABIMASK;
6477 if (flags & EF_ARM_RELEXEC)
6478 fprintf (file, _(" [relocatable executable]"));
6480 if (flags & EF_ARM_HASENTRY)
6481 fprintf (file, _(" [has entry point]"));
6483 flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
6485 if (flags)
6486 fprintf (file, _("<Unrecognised flag bits set>"));
6488 fputc ('\n', file);
6490 return TRUE;
6493 static int
6494 elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
6496 switch (ELF_ST_TYPE (elf_sym->st_info))
6498 case STT_ARM_TFUNC:
6499 return ELF_ST_TYPE (elf_sym->st_info);
6501 case STT_ARM_16BIT:
6502 /* If the symbol is not an object, return the STT_ARM_16BIT flag.
6503 This allows us to distinguish between data used by Thumb instructions
6504 and non-data (which is probably code) inside Thumb regions of an
6505 executable. */
6506 if (type != STT_OBJECT && type != STT_TLS)
6507 return ELF_ST_TYPE (elf_sym->st_info);
6508 break;
6510 default:
6511 break;
6514 return type;
6517 static asection *
6518 elf32_arm_gc_mark_hook (asection * sec,
6519 struct bfd_link_info * info ATTRIBUTE_UNUSED,
6520 Elf_Internal_Rela * rel,
6521 struct elf_link_hash_entry * h,
6522 Elf_Internal_Sym * sym)
6524 if (h != NULL)
6526 switch (ELF32_R_TYPE (rel->r_info))
6528 case R_ARM_GNU_VTINHERIT:
6529 case R_ARM_GNU_VTENTRY:
6530 break;
6532 default:
6533 switch (h->root.type)
6535 case bfd_link_hash_defined:
6536 case bfd_link_hash_defweak:
6537 return h->root.u.def.section;
6539 case bfd_link_hash_common:
6540 return h->root.u.c.p->section;
6542 default:
6543 break;
6547 else
6548 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6550 return NULL;
6553 /* Update the got entry reference counts for the section being removed. */
6555 static bfd_boolean
6556 elf32_arm_gc_sweep_hook (bfd * abfd,
6557 struct bfd_link_info * info,
6558 asection * sec,
6559 const Elf_Internal_Rela * relocs)
6561 Elf_Internal_Shdr *symtab_hdr;
6562 struct elf_link_hash_entry **sym_hashes;
6563 bfd_signed_vma *local_got_refcounts;
6564 const Elf_Internal_Rela *rel, *relend;
6565 struct elf32_arm_link_hash_table * globals;
6567 globals = elf32_arm_hash_table (info);
6569 elf_section_data (sec)->local_dynrel = NULL;
6571 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6572 sym_hashes = elf_sym_hashes (abfd);
6573 local_got_refcounts = elf_local_got_refcounts (abfd);
6575 relend = relocs + sec->reloc_count;
6576 for (rel = relocs; rel < relend; rel++)
6578 unsigned long r_symndx;
6579 struct elf_link_hash_entry *h = NULL;
6580 int r_type;
6582 r_symndx = ELF32_R_SYM (rel->r_info);
6583 if (r_symndx >= symtab_hdr->sh_info)
6585 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6586 while (h->root.type == bfd_link_hash_indirect
6587 || h->root.type == bfd_link_hash_warning)
6588 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6591 r_type = ELF32_R_TYPE (rel->r_info);
6592 r_type = arm_real_reloc_type (globals, r_type);
6593 switch (r_type)
6595 case R_ARM_GOT32:
6596 case R_ARM_GOT_PREL:
6597 case R_ARM_TLS_GD32:
6598 case R_ARM_TLS_IE32:
6599 if (h != NULL)
6601 if (h->got.refcount > 0)
6602 h->got.refcount -= 1;
6604 else if (local_got_refcounts != NULL)
6606 if (local_got_refcounts[r_symndx] > 0)
6607 local_got_refcounts[r_symndx] -= 1;
6609 break;
6611 case R_ARM_TLS_LDM32:
6612 elf32_arm_hash_table (info)->tls_ldm_got.refcount -= 1;
6613 break;
6615 case R_ARM_ABS32:
6616 case R_ARM_REL32:
6617 case R_ARM_PC24:
6618 case R_ARM_PLT32:
6619 case R_ARM_CALL:
6620 case R_ARM_JUMP24:
6621 case R_ARM_PREL31:
6622 case R_ARM_THM_CALL:
6623 case R_ARM_MOVW_ABS_NC:
6624 case R_ARM_MOVT_ABS:
6625 case R_ARM_MOVW_PREL_NC:
6626 case R_ARM_MOVT_PREL:
6627 case R_ARM_THM_MOVW_ABS_NC:
6628 case R_ARM_THM_MOVT_ABS:
6629 case R_ARM_THM_MOVW_PREL_NC:
6630 case R_ARM_THM_MOVT_PREL:
6631 /* Should the interworking branches be here also? */
6633 if (h != NULL)
6635 struct elf32_arm_link_hash_entry *eh;
6636 struct elf32_arm_relocs_copied **pp;
6637 struct elf32_arm_relocs_copied *p;
6639 eh = (struct elf32_arm_link_hash_entry *) h;
6641 if (h->plt.refcount > 0)
6643 h->plt.refcount -= 1;
6644 if (ELF32_R_TYPE (rel->r_info) == R_ARM_THM_CALL)
6645 eh->plt_thumb_refcount--;
6648 if (r_type == R_ARM_ABS32
6649 || r_type == R_ARM_REL32)
6651 for (pp = &eh->relocs_copied; (p = *pp) != NULL;
6652 pp = &p->next)
6653 if (p->section == sec)
6655 p->count -= 1;
6656 if (ELF32_R_TYPE (rel->r_info) == R_ARM_REL32)
6657 p->pc_count -= 1;
6658 if (p->count == 0)
6659 *pp = p->next;
6660 break;
6664 break;
6666 default:
6667 break;
6671 return TRUE;
6674 /* Look through the relocs for a section during the first phase. */
6676 static bfd_boolean
6677 elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
6678 asection *sec, const Elf_Internal_Rela *relocs)
6680 Elf_Internal_Shdr *symtab_hdr;
6681 struct elf_link_hash_entry **sym_hashes;
6682 struct elf_link_hash_entry **sym_hashes_end;
6683 const Elf_Internal_Rela *rel;
6684 const Elf_Internal_Rela *rel_end;
6685 bfd *dynobj;
6686 asection *sreloc;
6687 bfd_vma *local_got_offsets;
6688 struct elf32_arm_link_hash_table *htab;
6690 if (info->relocatable)
6691 return TRUE;
6693 htab = elf32_arm_hash_table (info);
6694 sreloc = NULL;
6696 /* Create dynamic sections for relocatable executables so that we can
6697 copy relocations. */
6698 if (htab->root.is_relocatable_executable
6699 && ! htab->root.dynamic_sections_created)
6701 if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
6702 return FALSE;
6705 dynobj = elf_hash_table (info)->dynobj;
6706 local_got_offsets = elf_local_got_offsets (abfd);
6708 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6709 sym_hashes = elf_sym_hashes (abfd);
6710 sym_hashes_end = sym_hashes
6711 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
6713 if (!elf_bad_symtab (abfd))
6714 sym_hashes_end -= symtab_hdr->sh_info;
6716 rel_end = relocs + sec->reloc_count;
6717 for (rel = relocs; rel < rel_end; rel++)
6719 struct elf_link_hash_entry *h;
6720 struct elf32_arm_link_hash_entry *eh;
6721 unsigned long r_symndx;
6722 int r_type;
6724 r_symndx = ELF32_R_SYM (rel->r_info);
6725 r_type = ELF32_R_TYPE (rel->r_info);
6726 r_type = arm_real_reloc_type (htab, r_type);
6728 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
6730 (*_bfd_error_handler) (_("%B: bad symbol index: %d"), abfd,
6731 r_symndx);
6732 return FALSE;
6735 if (r_symndx < symtab_hdr->sh_info)
6736 h = NULL;
6737 else
6739 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6740 while (h->root.type == bfd_link_hash_indirect
6741 || h->root.type == bfd_link_hash_warning)
6742 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6745 eh = (struct elf32_arm_link_hash_entry *) h;
6747 switch (r_type)
6749 case R_ARM_GOT32:
6750 case R_ARM_GOT_PREL:
6751 case R_ARM_TLS_GD32:
6752 case R_ARM_TLS_IE32:
6753 /* This symbol requires a global offset table entry. */
6755 int tls_type, old_tls_type;
6757 switch (r_type)
6759 case R_ARM_TLS_GD32: tls_type = GOT_TLS_GD; break;
6760 case R_ARM_TLS_IE32: tls_type = GOT_TLS_IE; break;
6761 default: tls_type = GOT_NORMAL; break;
6764 if (h != NULL)
6766 h->got.refcount++;
6767 old_tls_type = elf32_arm_hash_entry (h)->tls_type;
6769 else
6771 bfd_signed_vma *local_got_refcounts;
6773 /* This is a global offset table entry for a local symbol. */
6774 local_got_refcounts = elf_local_got_refcounts (abfd);
6775 if (local_got_refcounts == NULL)
6777 bfd_size_type size;
6779 size = symtab_hdr->sh_info;
6780 size *= (sizeof (bfd_signed_vma) + sizeof(char));
6781 local_got_refcounts = bfd_zalloc (abfd, size);
6782 if (local_got_refcounts == NULL)
6783 return FALSE;
6784 elf_local_got_refcounts (abfd) = local_got_refcounts;
6785 elf32_arm_local_got_tls_type (abfd)
6786 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
6788 local_got_refcounts[r_symndx] += 1;
6789 old_tls_type = elf32_arm_local_got_tls_type (abfd) [r_symndx];
6792 /* We will already have issued an error message if there is a
6793 TLS / non-TLS mismatch, based on the symbol type. We don't
6794 support any linker relaxations. So just combine any TLS
6795 types needed. */
6796 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
6797 && tls_type != GOT_NORMAL)
6798 tls_type |= old_tls_type;
6800 if (old_tls_type != tls_type)
6802 if (h != NULL)
6803 elf32_arm_hash_entry (h)->tls_type = tls_type;
6804 else
6805 elf32_arm_local_got_tls_type (abfd) [r_symndx] = tls_type;
6808 /* Fall through */
6810 case R_ARM_TLS_LDM32:
6811 if (r_type == R_ARM_TLS_LDM32)
6812 htab->tls_ldm_got.refcount++;
6813 /* Fall through */
6815 case R_ARM_GOTOFF32:
6816 case R_ARM_GOTPC:
6817 if (htab->sgot == NULL)
6819 if (htab->root.dynobj == NULL)
6820 htab->root.dynobj = abfd;
6821 if (!create_got_section (htab->root.dynobj, info))
6822 return FALSE;
6824 break;
6826 case R_ARM_ABS12:
6827 /* VxWorks uses dynamic R_ARM_ABS12 relocations for
6828 ldr __GOTT_INDEX__ offsets. */
6829 if (!htab->vxworks_p)
6830 break;
6831 /* Fall through */
6833 case R_ARM_ABS32:
6834 case R_ARM_REL32:
6835 case R_ARM_PC24:
6836 case R_ARM_PLT32:
6837 case R_ARM_CALL:
6838 case R_ARM_JUMP24:
6839 case R_ARM_PREL31:
6840 case R_ARM_THM_CALL:
6841 case R_ARM_MOVW_ABS_NC:
6842 case R_ARM_MOVT_ABS:
6843 case R_ARM_MOVW_PREL_NC:
6844 case R_ARM_MOVT_PREL:
6845 case R_ARM_THM_MOVW_ABS_NC:
6846 case R_ARM_THM_MOVT_ABS:
6847 case R_ARM_THM_MOVW_PREL_NC:
6848 case R_ARM_THM_MOVT_PREL:
6849 /* Should the interworking branches be listed here? */
6850 if (h != NULL)
6852 /* If this reloc is in a read-only section, we might
6853 need a copy reloc. We can't check reliably at this
6854 stage whether the section is read-only, as input
6855 sections have not yet been mapped to output sections.
6856 Tentatively set the flag for now, and correct in
6857 adjust_dynamic_symbol. */
6858 if (!info->shared)
6859 h->non_got_ref = 1;
6861 /* We may need a .plt entry if the function this reloc
6862 refers to is in a different object. We can't tell for
6863 sure yet, because something later might force the
6864 symbol local. */
6865 if (r_type != R_ARM_ABS32 && r_type != R_ARM_REL32)
6866 h->needs_plt = 1;
6868 /* If we create a PLT entry, this relocation will reference
6869 it, even if it's an ABS32 relocation. */
6870 h->plt.refcount += 1;
6872 if (r_type == R_ARM_THM_CALL)
6873 eh->plt_thumb_refcount += 1;
6876 /* If we are creating a shared library or relocatable executable,
6877 and this is a reloc against a global symbol, or a non PC
6878 relative reloc against a local symbol, then we need to copy
6879 the reloc into the shared library. However, if we are linking
6880 with -Bsymbolic, we do not need to copy a reloc against a
6881 global symbol which is defined in an object we are
6882 including in the link (i.e., DEF_REGULAR is set). At
6883 this point we have not seen all the input files, so it is
6884 possible that DEF_REGULAR is not set now but will be set
6885 later (it is never cleared). We account for that
6886 possibility below by storing information in the
6887 relocs_copied field of the hash table entry. */
6888 if ((info->shared || htab->root.is_relocatable_executable)
6889 && (sec->flags & SEC_ALLOC) != 0
6890 && (r_type == R_ARM_ABS32
6891 || (h != NULL && ! h->needs_plt
6892 && (! info->symbolic || ! h->def_regular))))
6894 struct elf32_arm_relocs_copied *p, **head;
6896 /* When creating a shared object, we must copy these
6897 reloc types into the output file. We create a reloc
6898 section in dynobj and make room for this reloc. */
6899 if (sreloc == NULL)
6901 const char * name;
6903 name = (bfd_elf_string_from_elf_section
6904 (abfd,
6905 elf_elfheader (abfd)->e_shstrndx,
6906 elf_section_data (sec)->rel_hdr.sh_name));
6907 if (name == NULL)
6908 return FALSE;
6910 BFD_ASSERT (reloc_section_p (htab, name, sec));
6912 sreloc = bfd_get_section_by_name (dynobj, name);
6913 if (sreloc == NULL)
6915 flagword flags;
6917 flags = (SEC_HAS_CONTENTS | SEC_READONLY
6918 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
6919 if ((sec->flags & SEC_ALLOC) != 0
6920 /* BPABI objects never have dynamic
6921 relocations mapped. */
6922 && !htab->symbian_p)
6923 flags |= SEC_ALLOC | SEC_LOAD;
6924 sreloc = bfd_make_section_with_flags (dynobj,
6925 name,
6926 flags);
6927 if (sreloc == NULL
6928 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
6929 return FALSE;
6932 elf_section_data (sec)->sreloc = sreloc;
6935 /* If this is a global symbol, we count the number of
6936 relocations we need for this symbol. */
6937 if (h != NULL)
6939 head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied;
6941 else
6943 /* Track dynamic relocs needed for local syms too.
6944 We really need local syms available to do this
6945 easily. Oh well. */
6947 asection *s;
6948 void *vpp;
6950 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
6951 sec, r_symndx);
6952 if (s == NULL)
6953 return FALSE;
6955 vpp = &elf_section_data (s)->local_dynrel;
6956 head = (struct elf32_arm_relocs_copied **) vpp;
6959 p = *head;
6960 if (p == NULL || p->section != sec)
6962 bfd_size_type amt = sizeof *p;
6964 p = bfd_alloc (htab->root.dynobj, amt);
6965 if (p == NULL)
6966 return FALSE;
6967 p->next = *head;
6968 *head = p;
6969 p->section = sec;
6970 p->count = 0;
6971 p->pc_count = 0;
6974 if (r_type == R_ARM_REL32)
6975 p->pc_count += 1;
6976 p->count += 1;
6978 break;
6980 /* This relocation describes the C++ object vtable hierarchy.
6981 Reconstruct it for later use during GC. */
6982 case R_ARM_GNU_VTINHERIT:
6983 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
6984 return FALSE;
6985 break;
6987 /* This relocation describes which C++ vtable entries are actually
6988 used. Record for later use during GC. */
6989 case R_ARM_GNU_VTENTRY:
6990 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
6991 return FALSE;
6992 break;
6996 return TRUE;
6999 /* Treat mapping symbols as special target symbols. */
7001 static bfd_boolean
7002 elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
7004 return bfd_is_arm_special_symbol_name (sym->name,
7005 BFD_ARM_SPECIAL_SYM_TYPE_ANY);
7008 /* This is a copy of elf_find_function() from elf.c except that
7009 ARM mapping symbols are ignored when looking for function names
7010 and STT_ARM_TFUNC is considered to a function type. */
7012 static bfd_boolean
7013 arm_elf_find_function (bfd * abfd ATTRIBUTE_UNUSED,
7014 asection * section,
7015 asymbol ** symbols,
7016 bfd_vma offset,
7017 const char ** filename_ptr,
7018 const char ** functionname_ptr)
7020 const char * filename = NULL;
7021 asymbol * func = NULL;
7022 bfd_vma low_func = 0;
7023 asymbol ** p;
7025 for (p = symbols; *p != NULL; p++)
7027 elf_symbol_type *q;
7029 q = (elf_symbol_type *) *p;
7031 switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
7033 default:
7034 break;
7035 case STT_FILE:
7036 filename = bfd_asymbol_name (&q->symbol);
7037 break;
7038 case STT_FUNC:
7039 case STT_ARM_TFUNC:
7040 case STT_NOTYPE:
7041 /* Skip mapping symbols. */
7042 if ((q->symbol.flags & BSF_LOCAL)
7043 && bfd_is_arm_special_symbol_name (q->symbol.name,
7044 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
7045 continue;
7046 /* Fall through. */
7047 if (bfd_get_section (&q->symbol) == section
7048 && q->symbol.value >= low_func
7049 && q->symbol.value <= offset)
7051 func = (asymbol *) q;
7052 low_func = q->symbol.value;
7054 break;
7058 if (func == NULL)
7059 return FALSE;
7061 if (filename_ptr)
7062 *filename_ptr = filename;
7063 if (functionname_ptr)
7064 *functionname_ptr = bfd_asymbol_name (func);
7066 return TRUE;
7070 /* Find the nearest line to a particular section and offset, for error
7071 reporting. This code is a duplicate of the code in elf.c, except
7072 that it uses arm_elf_find_function. */
7074 static bfd_boolean
7075 elf32_arm_find_nearest_line (bfd * abfd,
7076 asection * section,
7077 asymbol ** symbols,
7078 bfd_vma offset,
7079 const char ** filename_ptr,
7080 const char ** functionname_ptr,
7081 unsigned int * line_ptr)
7083 bfd_boolean found = FALSE;
7085 /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it. */
7087 if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
7088 filename_ptr, functionname_ptr,
7089 line_ptr, 0,
7090 & elf_tdata (abfd)->dwarf2_find_line_info))
7092 if (!*functionname_ptr)
7093 arm_elf_find_function (abfd, section, symbols, offset,
7094 *filename_ptr ? NULL : filename_ptr,
7095 functionname_ptr);
7097 return TRUE;
7100 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
7101 & found, filename_ptr,
7102 functionname_ptr, line_ptr,
7103 & elf_tdata (abfd)->line_info))
7104 return FALSE;
7106 if (found && (*functionname_ptr || *line_ptr))
7107 return TRUE;
7109 if (symbols == NULL)
7110 return FALSE;
7112 if (! arm_elf_find_function (abfd, section, symbols, offset,
7113 filename_ptr, functionname_ptr))
7114 return FALSE;
7116 *line_ptr = 0;
7117 return TRUE;
7120 static bfd_boolean
7121 elf32_arm_find_inliner_info (bfd * abfd,
7122 const char ** filename_ptr,
7123 const char ** functionname_ptr,
7124 unsigned int * line_ptr)
7126 bfd_boolean found;
7127 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
7128 functionname_ptr, line_ptr,
7129 & elf_tdata (abfd)->dwarf2_find_line_info);
7130 return found;
7133 /* Adjust a symbol defined by a dynamic object and referenced by a
7134 regular object. The current definition is in some section of the
7135 dynamic object, but we're not including those sections. We have to
7136 change the definition to something the rest of the link can
7137 understand. */
7139 static bfd_boolean
7140 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
7141 struct elf_link_hash_entry * h)
7143 bfd * dynobj;
7144 asection * s;
7145 unsigned int power_of_two;
7146 struct elf32_arm_link_hash_entry * eh;
7147 struct elf32_arm_link_hash_table *globals;
7149 globals = elf32_arm_hash_table (info);
7150 dynobj = elf_hash_table (info)->dynobj;
7152 /* Make sure we know what is going on here. */
7153 BFD_ASSERT (dynobj != NULL
7154 && (h->needs_plt
7155 || h->u.weakdef != NULL
7156 || (h->def_dynamic
7157 && h->ref_regular
7158 && !h->def_regular)));
7160 eh = (struct elf32_arm_link_hash_entry *) h;
7162 /* If this is a function, put it in the procedure linkage table. We
7163 will fill in the contents of the procedure linkage table later,
7164 when we know the address of the .got section. */
7165 if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC
7166 || h->needs_plt)
7168 if (h->plt.refcount <= 0
7169 || SYMBOL_CALLS_LOCAL (info, h)
7170 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
7171 && h->root.type == bfd_link_hash_undefweak))
7173 /* This case can occur if we saw a PLT32 reloc in an input
7174 file, but the symbol was never referred to by a dynamic
7175 object, or if all references were garbage collected. In
7176 such a case, we don't actually need to build a procedure
7177 linkage table, and we can just do a PC24 reloc instead. */
7178 h->plt.offset = (bfd_vma) -1;
7179 eh->plt_thumb_refcount = 0;
7180 h->needs_plt = 0;
7183 return TRUE;
7185 else
7187 /* It's possible that we incorrectly decided a .plt reloc was
7188 needed for an R_ARM_PC24 or similar reloc to a non-function sym
7189 in check_relocs. We can't decide accurately between function
7190 and non-function syms in check-relocs; Objects loaded later in
7191 the link may change h->type. So fix it now. */
7192 h->plt.offset = (bfd_vma) -1;
7193 eh->plt_thumb_refcount = 0;
7196 /* If this is a weak symbol, and there is a real definition, the
7197 processor independent code will have arranged for us to see the
7198 real definition first, and we can just use the same value. */
7199 if (h->u.weakdef != NULL)
7201 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
7202 || h->u.weakdef->root.type == bfd_link_hash_defweak);
7203 h->root.u.def.section = h->u.weakdef->root.u.def.section;
7204 h->root.u.def.value = h->u.weakdef->root.u.def.value;
7205 return TRUE;
7208 /* If there are no non-GOT references, we do not need a copy
7209 relocation. */
7210 if (!h->non_got_ref)
7211 return TRUE;
7213 /* This is a reference to a symbol defined by a dynamic object which
7214 is not a function. */
7216 /* If we are creating a shared library, we must presume that the
7217 only references to the symbol are via the global offset table.
7218 For such cases we need not do anything here; the relocations will
7219 be handled correctly by relocate_section. Relocatable executables
7220 can reference data in shared objects directly, so we don't need to
7221 do anything here. */
7222 if (info->shared || globals->root.is_relocatable_executable)
7223 return TRUE;
7225 if (h->size == 0)
7227 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
7228 h->root.root.string);
7229 return TRUE;
7232 /* We must allocate the symbol in our .dynbss section, which will
7233 become part of the .bss section of the executable. There will be
7234 an entry for this symbol in the .dynsym section. The dynamic
7235 object will contain position independent code, so all references
7236 from the dynamic object to this symbol will go through the global
7237 offset table. The dynamic linker will use the .dynsym entry to
7238 determine the address it must put in the global offset table, so
7239 both the dynamic object and the regular object will refer to the
7240 same memory location for the variable. */
7241 s = bfd_get_section_by_name (dynobj, ".dynbss");
7242 BFD_ASSERT (s != NULL);
7244 /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
7245 copy the initial value out of the dynamic object and into the
7246 runtime process image. We need to remember the offset into the
7247 .rel(a).bss section we are going to use. */
7248 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
7250 asection *srel;
7252 srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (globals, ".bss"));
7253 BFD_ASSERT (srel != NULL);
7254 srel->size += RELOC_SIZE (globals);
7255 h->needs_copy = 1;
7258 /* We need to figure out the alignment required for this symbol. I
7259 have no idea how ELF linkers handle this. */
7260 power_of_two = bfd_log2 (h->size);
7261 if (power_of_two > 3)
7262 power_of_two = 3;
7264 /* Apply the required alignment. */
7265 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
7266 if (power_of_two > bfd_get_section_alignment (dynobj, s))
7268 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
7269 return FALSE;
7272 /* Define the symbol as being at this point in the section. */
7273 h->root.u.def.section = s;
7274 h->root.u.def.value = s->size;
7276 /* Increment the section size to make room for the symbol. */
7277 s->size += h->size;
7279 return TRUE;
7282 /* Allocate space in .plt, .got and associated reloc sections for
7283 dynamic relocs. */
7285 static bfd_boolean
7286 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
7288 struct bfd_link_info *info;
7289 struct elf32_arm_link_hash_table *htab;
7290 struct elf32_arm_link_hash_entry *eh;
7291 struct elf32_arm_relocs_copied *p;
7293 eh = (struct elf32_arm_link_hash_entry *) h;
7295 if (h->root.type == bfd_link_hash_indirect)
7296 return TRUE;
7298 if (h->root.type == bfd_link_hash_warning)
7299 /* When warning symbols are created, they **replace** the "real"
7300 entry in the hash table, thus we never get to see the real
7301 symbol in a hash traversal. So look at it now. */
7302 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7304 info = (struct bfd_link_info *) inf;
7305 htab = elf32_arm_hash_table (info);
7307 if (htab->root.dynamic_sections_created
7308 && h->plt.refcount > 0)
7310 /* Make sure this symbol is output as a dynamic symbol.
7311 Undefined weak syms won't yet be marked as dynamic. */
7312 if (h->dynindx == -1
7313 && !h->forced_local)
7315 if (! bfd_elf_link_record_dynamic_symbol (info, h))
7316 return FALSE;
7319 if (info->shared
7320 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
7322 asection *s = htab->splt;
7324 /* If this is the first .plt entry, make room for the special
7325 first entry. */
7326 if (s->size == 0)
7327 s->size += htab->plt_header_size;
7329 h->plt.offset = s->size;
7331 /* If we will insert a Thumb trampoline before this PLT, leave room
7332 for it. */
7333 if (!htab->use_blx && eh->plt_thumb_refcount > 0)
7335 h->plt.offset += PLT_THUMB_STUB_SIZE;
7336 s->size += PLT_THUMB_STUB_SIZE;
7339 /* If this symbol is not defined in a regular file, and we are
7340 not generating a shared library, then set the symbol to this
7341 location in the .plt. This is required to make function
7342 pointers compare as equal between the normal executable and
7343 the shared library. */
7344 if (! info->shared
7345 && !h->def_regular)
7347 h->root.u.def.section = s;
7348 h->root.u.def.value = h->plt.offset;
7350 /* Make sure the function is not marked as Thumb, in case
7351 it is the target of an ABS32 relocation, which will
7352 point to the PLT entry. */
7353 if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
7354 h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
7357 /* Make room for this entry. */
7358 s->size += htab->plt_entry_size;
7360 if (!htab->symbian_p)
7362 /* We also need to make an entry in the .got.plt section, which
7363 will be placed in the .got section by the linker script. */
7364 eh->plt_got_offset = htab->sgotplt->size;
7365 htab->sgotplt->size += 4;
7368 /* We also need to make an entry in the .rel(a).plt section. */
7369 htab->srelplt->size += RELOC_SIZE (htab);
7371 /* VxWorks executables have a second set of relocations for
7372 each PLT entry. They go in a separate relocation section,
7373 which is processed by the kernel loader. */
7374 if (htab->vxworks_p && !info->shared)
7376 /* There is a relocation for the initial PLT entry:
7377 an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_. */
7378 if (h->plt.offset == htab->plt_header_size)
7379 htab->srelplt2->size += RELOC_SIZE (htab);
7381 /* There are two extra relocations for each subsequent
7382 PLT entry: an R_ARM_32 relocation for the GOT entry,
7383 and an R_ARM_32 relocation for the PLT entry. */
7384 htab->srelplt2->size += RELOC_SIZE (htab) * 2;
7387 else
7389 h->plt.offset = (bfd_vma) -1;
7390 h->needs_plt = 0;
7393 else
7395 h->plt.offset = (bfd_vma) -1;
7396 h->needs_plt = 0;
7399 if (h->got.refcount > 0)
7401 asection *s;
7402 bfd_boolean dyn;
7403 int tls_type = elf32_arm_hash_entry (h)->tls_type;
7404 int indx;
7406 /* Make sure this symbol is output as a dynamic symbol.
7407 Undefined weak syms won't yet be marked as dynamic. */
7408 if (h->dynindx == -1
7409 && !h->forced_local)
7411 if (! bfd_elf_link_record_dynamic_symbol (info, h))
7412 return FALSE;
7415 if (!htab->symbian_p)
7417 s = htab->sgot;
7418 h->got.offset = s->size;
7420 if (tls_type == GOT_UNKNOWN)
7421 abort ();
7423 if (tls_type == GOT_NORMAL)
7424 /* Non-TLS symbols need one GOT slot. */
7425 s->size += 4;
7426 else
7428 if (tls_type & GOT_TLS_GD)
7429 /* R_ARM_TLS_GD32 needs 2 consecutive GOT slots. */
7430 s->size += 8;
7431 if (tls_type & GOT_TLS_IE)
7432 /* R_ARM_TLS_IE32 needs one GOT slot. */
7433 s->size += 4;
7436 dyn = htab->root.dynamic_sections_created;
7438 indx = 0;
7439 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
7440 && (!info->shared
7441 || !SYMBOL_REFERENCES_LOCAL (info, h)))
7442 indx = h->dynindx;
7444 if (tls_type != GOT_NORMAL
7445 && (info->shared || indx != 0)
7446 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
7447 || h->root.type != bfd_link_hash_undefweak))
7449 if (tls_type & GOT_TLS_IE)
7450 htab->srelgot->size += RELOC_SIZE (htab);
7452 if (tls_type & GOT_TLS_GD)
7453 htab->srelgot->size += RELOC_SIZE (htab);
7455 if ((tls_type & GOT_TLS_GD) && indx != 0)
7456 htab->srelgot->size += RELOC_SIZE (htab);
7458 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
7459 || h->root.type != bfd_link_hash_undefweak)
7460 && (info->shared
7461 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
7462 htab->srelgot->size += RELOC_SIZE (htab);
7465 else
7466 h->got.offset = (bfd_vma) -1;
7468 if (eh->relocs_copied == NULL)
7469 return TRUE;
7471 /* In the shared -Bsymbolic case, discard space allocated for
7472 dynamic pc-relative relocs against symbols which turn out to be
7473 defined in regular objects. For the normal shared case, discard
7474 space for pc-relative relocs that have become local due to symbol
7475 visibility changes. */
7477 if (info->shared || htab->root.is_relocatable_executable)
7479 /* The only reloc that uses pc_count is R_ARM_REL32, which will
7480 appear on something like ".long foo - .". We want calls to
7481 protected symbols to resolve directly to the function rather
7482 than going via the plt. If people want function pointer
7483 comparisons to work as expected then they should avoid
7484 writing assembly like ".long foo - .". */
7485 if (SYMBOL_CALLS_LOCAL (info, h))
7487 struct elf32_arm_relocs_copied **pp;
7489 for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
7491 p->count -= p->pc_count;
7492 p->pc_count = 0;
7493 if (p->count == 0)
7494 *pp = p->next;
7495 else
7496 pp = &p->next;
7500 /* Also discard relocs on undefined weak syms with non-default
7501 visibility. */
7502 if (eh->relocs_copied != NULL
7503 && h->root.type == bfd_link_hash_undefweak)
7505 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
7506 eh->relocs_copied = NULL;
7508 /* Make sure undefined weak symbols are output as a dynamic
7509 symbol in PIEs. */
7510 else if (h->dynindx == -1
7511 && !h->forced_local)
7513 if (! bfd_elf_link_record_dynamic_symbol (info, h))
7514 return FALSE;
7518 else if (htab->root.is_relocatable_executable && h->dynindx == -1
7519 && h->root.type == bfd_link_hash_new)
7521 /* Output absolute symbols so that we can create relocations
7522 against them. For normal symbols we output a relocation
7523 against the section that contains them. */
7524 if (! bfd_elf_link_record_dynamic_symbol (info, h))
7525 return FALSE;
7529 else
7531 /* For the non-shared case, discard space for relocs against
7532 symbols which turn out to need copy relocs or are not
7533 dynamic. */
7535 if (!h->non_got_ref
7536 && ((h->def_dynamic
7537 && !h->def_regular)
7538 || (htab->root.dynamic_sections_created
7539 && (h->root.type == bfd_link_hash_undefweak
7540 || h->root.type == bfd_link_hash_undefined))))
7542 /* Make sure this symbol is output as a dynamic symbol.
7543 Undefined weak syms won't yet be marked as dynamic. */
7544 if (h->dynindx == -1
7545 && !h->forced_local)
7547 if (! bfd_elf_link_record_dynamic_symbol (info, h))
7548 return FALSE;
7551 /* If that succeeded, we know we'll be keeping all the
7552 relocs. */
7553 if (h->dynindx != -1)
7554 goto keep;
7557 eh->relocs_copied = NULL;
7559 keep: ;
7562 /* Finally, allocate space. */
7563 for (p = eh->relocs_copied; p != NULL; p = p->next)
7565 asection *sreloc = elf_section_data (p->section)->sreloc;
7566 sreloc->size += p->count * RELOC_SIZE (htab);
7569 return TRUE;
7572 /* Find any dynamic relocs that apply to read-only sections. */
7574 static bfd_boolean
7575 elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
7577 struct elf32_arm_link_hash_entry *eh;
7578 struct elf32_arm_relocs_copied *p;
7580 if (h->root.type == bfd_link_hash_warning)
7581 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7583 eh = (struct elf32_arm_link_hash_entry *) h;
7584 for (p = eh->relocs_copied; p != NULL; p = p->next)
7586 asection *s = p->section;
7588 if (s != NULL && (s->flags & SEC_READONLY) != 0)
7590 struct bfd_link_info *info = (struct bfd_link_info *) inf;
7592 info->flags |= DF_TEXTREL;
7594 /* Not an error, just cut short the traversal. */
7595 return FALSE;
7598 return TRUE;
7601 /* Set the sizes of the dynamic sections. */
7603 static bfd_boolean
7604 elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
7605 struct bfd_link_info * info)
7607 bfd * dynobj;
7608 asection * s;
7609 bfd_boolean plt;
7610 bfd_boolean relocs;
7611 bfd *ibfd;
7612 struct elf32_arm_link_hash_table *htab;
7614 htab = elf32_arm_hash_table (info);
7615 dynobj = elf_hash_table (info)->dynobj;
7616 BFD_ASSERT (dynobj != NULL);
7617 check_use_blx (htab);
7619 if (elf_hash_table (info)->dynamic_sections_created)
7621 /* Set the contents of the .interp section to the interpreter. */
7622 if (info->executable)
7624 s = bfd_get_section_by_name (dynobj, ".interp");
7625 BFD_ASSERT (s != NULL);
7626 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
7627 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
7631 /* Set up .got offsets for local syms, and space for local dynamic
7632 relocs. */
7633 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7635 bfd_signed_vma *local_got;
7636 bfd_signed_vma *end_local_got;
7637 char *local_tls_type;
7638 bfd_size_type locsymcount;
7639 Elf_Internal_Shdr *symtab_hdr;
7640 asection *srel;
7642 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
7643 continue;
7645 for (s = ibfd->sections; s != NULL; s = s->next)
7647 struct elf32_arm_relocs_copied *p;
7649 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
7651 if (!bfd_is_abs_section (p->section)
7652 && bfd_is_abs_section (p->section->output_section))
7654 /* Input section has been discarded, either because
7655 it is a copy of a linkonce section or due to
7656 linker script /DISCARD/, so we'll be discarding
7657 the relocs too. */
7659 else if (p->count != 0)
7661 srel = elf_section_data (p->section)->sreloc;
7662 srel->size += p->count * RELOC_SIZE (htab);
7663 if ((p->section->output_section->flags & SEC_READONLY) != 0)
7664 info->flags |= DF_TEXTREL;
7669 local_got = elf_local_got_refcounts (ibfd);
7670 if (!local_got)
7671 continue;
7673 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
7674 locsymcount = symtab_hdr->sh_info;
7675 end_local_got = local_got + locsymcount;
7676 local_tls_type = elf32_arm_local_got_tls_type (ibfd);
7677 s = htab->sgot;
7678 srel = htab->srelgot;
7679 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
7681 if (*local_got > 0)
7683 *local_got = s->size;
7684 if (*local_tls_type & GOT_TLS_GD)
7685 /* TLS_GD relocs need an 8-byte structure in the GOT. */
7686 s->size += 8;
7687 if (*local_tls_type & GOT_TLS_IE)
7688 s->size += 4;
7689 if (*local_tls_type == GOT_NORMAL)
7690 s->size += 4;
7692 if (info->shared || *local_tls_type == GOT_TLS_GD)
7693 srel->size += RELOC_SIZE (htab);
7695 else
7696 *local_got = (bfd_vma) -1;
7700 if (htab->tls_ldm_got.refcount > 0)
7702 /* Allocate two GOT entries and one dynamic relocation (if necessary)
7703 for R_ARM_TLS_LDM32 relocations. */
7704 htab->tls_ldm_got.offset = htab->sgot->size;
7705 htab->sgot->size += 8;
7706 if (info->shared)
7707 htab->srelgot->size += RELOC_SIZE (htab);
7709 else
7710 htab->tls_ldm_got.offset = -1;
7712 /* Allocate global sym .plt and .got entries, and space for global
7713 sym dynamic relocs. */
7714 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
7716 /* The check_relocs and adjust_dynamic_symbol entry points have
7717 determined the sizes of the various dynamic sections. Allocate
7718 memory for them. */
7719 plt = FALSE;
7720 relocs = FALSE;
7721 for (s = dynobj->sections; s != NULL; s = s->next)
7723 const char * name;
7725 if ((s->flags & SEC_LINKER_CREATED) == 0)
7726 continue;
7728 /* It's OK to base decisions on the section name, because none
7729 of the dynobj section names depend upon the input files. */
7730 name = bfd_get_section_name (dynobj, s);
7732 if (strcmp (name, ".plt") == 0)
7734 /* Remember whether there is a PLT. */
7735 plt = s->size != 0;
7737 else if (strncmp (name, ".rel", 4) == 0)
7739 if (s->size != 0)
7741 /* Remember whether there are any reloc sections other
7742 than .rel(a).plt and .rela.plt.unloaded. */
7743 if (s != htab->srelplt && s != htab->srelplt2)
7744 relocs = TRUE;
7746 /* We use the reloc_count field as a counter if we need
7747 to copy relocs into the output file. */
7748 s->reloc_count = 0;
7751 else if (strncmp (name, ".got", 4) != 0
7752 && strcmp (name, ".dynbss") != 0)
7754 /* It's not one of our sections, so don't allocate space. */
7755 continue;
7758 if (s->size == 0)
7760 /* If we don't need this section, strip it from the
7761 output file. This is mostly to handle .rel(a).bss and
7762 .rel(a).plt. We must create both sections in
7763 create_dynamic_sections, because they must be created
7764 before the linker maps input sections to output
7765 sections. The linker does that before
7766 adjust_dynamic_symbol is called, and it is that
7767 function which decides whether anything needs to go
7768 into these sections. */
7769 s->flags |= SEC_EXCLUDE;
7770 continue;
7773 if ((s->flags & SEC_HAS_CONTENTS) == 0)
7774 continue;
7776 /* Allocate memory for the section contents. */
7777 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
7778 if (s->contents == NULL)
7779 return FALSE;
7782 if (elf_hash_table (info)->dynamic_sections_created)
7784 /* Add some entries to the .dynamic section. We fill in the
7785 values later, in elf32_arm_finish_dynamic_sections, but we
7786 must add the entries now so that we get the correct size for
7787 the .dynamic section. The DT_DEBUG entry is filled in by the
7788 dynamic linker and used by the debugger. */
7789 #define add_dynamic_entry(TAG, VAL) \
7790 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
7792 if (info->executable)
7794 if (!add_dynamic_entry (DT_DEBUG, 0))
7795 return FALSE;
7798 if (plt)
7800 if ( !add_dynamic_entry (DT_PLTGOT, 0)
7801 || !add_dynamic_entry (DT_PLTRELSZ, 0)
7802 || !add_dynamic_entry (DT_PLTREL,
7803 htab->use_rel ? DT_REL : DT_RELA)
7804 || !add_dynamic_entry (DT_JMPREL, 0))
7805 return FALSE;
7808 if (relocs)
7810 if (htab->use_rel)
7812 if (!add_dynamic_entry (DT_REL, 0)
7813 || !add_dynamic_entry (DT_RELSZ, 0)
7814 || !add_dynamic_entry (DT_RELENT, RELOC_SIZE (htab)))
7815 return FALSE;
7817 else
7819 if (!add_dynamic_entry (DT_RELA, 0)
7820 || !add_dynamic_entry (DT_RELASZ, 0)
7821 || !add_dynamic_entry (DT_RELAENT, RELOC_SIZE (htab)))
7822 return FALSE;
7826 /* If any dynamic relocs apply to a read-only section,
7827 then we need a DT_TEXTREL entry. */
7828 if ((info->flags & DF_TEXTREL) == 0)
7829 elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs,
7830 (PTR) info);
7832 if ((info->flags & DF_TEXTREL) != 0)
7834 if (!add_dynamic_entry (DT_TEXTREL, 0))
7835 return FALSE;
7838 #undef add_dynamic_entry
7840 return TRUE;
7843 /* Finish up dynamic symbol handling. We set the contents of various
7844 dynamic sections here. */
7846 static bfd_boolean
7847 elf32_arm_finish_dynamic_symbol (bfd * output_bfd, struct bfd_link_info * info,
7848 struct elf_link_hash_entry * h, Elf_Internal_Sym * sym)
7850 bfd * dynobj;
7851 struct elf32_arm_link_hash_table *htab;
7852 struct elf32_arm_link_hash_entry *eh;
7854 dynobj = elf_hash_table (info)->dynobj;
7855 htab = elf32_arm_hash_table (info);
7856 eh = (struct elf32_arm_link_hash_entry *) h;
7858 if (h->plt.offset != (bfd_vma) -1)
7860 asection * splt;
7861 asection * srel;
7862 bfd_byte *loc;
7863 bfd_vma plt_index;
7864 Elf_Internal_Rela rel;
7866 /* This symbol has an entry in the procedure linkage table. Set
7867 it up. */
7869 BFD_ASSERT (h->dynindx != -1);
7871 splt = bfd_get_section_by_name (dynobj, ".plt");
7872 srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (htab, ".plt"));
7873 BFD_ASSERT (splt != NULL && srel != NULL);
7875 /* Fill in the entry in the procedure linkage table. */
7876 if (htab->symbian_p)
7878 put_arm_insn (htab, output_bfd,
7879 elf32_arm_symbian_plt_entry[0],
7880 splt->contents + h->plt.offset);
7881 bfd_put_32 (output_bfd,
7882 elf32_arm_symbian_plt_entry[1],
7883 splt->contents + h->plt.offset + 4);
7885 /* Fill in the entry in the .rel.plt section. */
7886 rel.r_offset = (splt->output_section->vma
7887 + splt->output_offset
7888 + h->plt.offset + 4);
7889 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
7891 /* Get the index in the procedure linkage table which
7892 corresponds to this symbol. This is the index of this symbol
7893 in all the symbols for which we are making plt entries. The
7894 first entry in the procedure linkage table is reserved. */
7895 plt_index = ((h->plt.offset - htab->plt_header_size)
7896 / htab->plt_entry_size);
7898 else
7900 bfd_vma got_offset, got_address, plt_address;
7901 bfd_vma got_displacement;
7902 asection * sgot;
7903 bfd_byte * ptr;
7905 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
7906 BFD_ASSERT (sgot != NULL);
7908 /* Get the offset into the .got.plt table of the entry that
7909 corresponds to this function. */
7910 got_offset = eh->plt_got_offset;
7912 /* Get the index in the procedure linkage table which
7913 corresponds to this symbol. This is the index of this symbol
7914 in all the symbols for which we are making plt entries. The
7915 first three entries in .got.plt are reserved; after that
7916 symbols appear in the same order as in .plt. */
7917 plt_index = (got_offset - 12) / 4;
7919 /* Calculate the address of the GOT entry. */
7920 got_address = (sgot->output_section->vma
7921 + sgot->output_offset
7922 + got_offset);
7924 /* ...and the address of the PLT entry. */
7925 plt_address = (splt->output_section->vma
7926 + splt->output_offset
7927 + h->plt.offset);
7929 ptr = htab->splt->contents + h->plt.offset;
7930 if (htab->vxworks_p && info->shared)
7932 unsigned int i;
7933 bfd_vma val;
7935 for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
7937 val = elf32_arm_vxworks_shared_plt_entry[i];
7938 if (i == 2)
7939 val |= got_address - sgot->output_section->vma;
7940 if (i == 5)
7941 val |= plt_index * RELOC_SIZE (htab);
7942 if (i == 2 || i == 5)
7943 bfd_put_32 (output_bfd, val, ptr);
7944 else
7945 put_arm_insn (htab, output_bfd, val, ptr);
7948 else if (htab->vxworks_p)
7950 unsigned int i;
7951 bfd_vma val;
7953 for (i = 0; i != htab->plt_entry_size / 4; i++)
7955 val = elf32_arm_vxworks_exec_plt_entry[i];
7956 if (i == 2)
7957 val |= got_address;
7958 if (i == 4)
7959 val |= 0xffffff & -((h->plt.offset + i * 4 + 8) >> 2);
7960 if (i == 5)
7961 val |= plt_index * RELOC_SIZE (htab);
7962 if (i == 2 || i == 5)
7963 bfd_put_32 (output_bfd, val, ptr);
7964 else
7965 put_arm_insn (htab, output_bfd, val, ptr);
7968 loc = (htab->srelplt2->contents
7969 + (plt_index * 2 + 1) * RELOC_SIZE (htab));
7971 /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
7972 referencing the GOT for this PLT entry. */
7973 rel.r_offset = plt_address + 8;
7974 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
7975 rel.r_addend = got_offset;
7976 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
7977 loc += RELOC_SIZE (htab);
7979 /* Create the R_ARM_ABS32 relocation referencing the
7980 beginning of the PLT for this GOT entry. */
7981 rel.r_offset = got_address;
7982 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
7983 rel.r_addend = 0;
7984 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
7986 else
7988 /* Calculate the displacement between the PLT slot and the
7989 entry in the GOT. The eight-byte offset accounts for the
7990 value produced by adding to pc in the first instruction
7991 of the PLT stub. */
7992 got_displacement = got_address - (plt_address + 8);
7994 BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
7996 if (!htab->use_blx && eh->plt_thumb_refcount > 0)
7998 put_thumb_insn (htab, output_bfd,
7999 elf32_arm_plt_thumb_stub[0], ptr - 4);
8000 put_thumb_insn (htab, output_bfd,
8001 elf32_arm_plt_thumb_stub[1], ptr - 2);
8004 put_arm_insn (htab, output_bfd,
8005 elf32_arm_plt_entry[0]
8006 | ((got_displacement & 0x0ff00000) >> 20),
8007 ptr + 0);
8008 put_arm_insn (htab, output_bfd,
8009 elf32_arm_plt_entry[1]
8010 | ((got_displacement & 0x000ff000) >> 12),
8011 ptr+ 4);
8012 put_arm_insn (htab, output_bfd,
8013 elf32_arm_plt_entry[2]
8014 | (got_displacement & 0x00000fff),
8015 ptr + 8);
8016 #ifdef FOUR_WORD_PLT
8017 bfd_put_32 (output_bfd, elf32_arm_plt_entry[3], ptr + 12);
8018 #endif
8021 /* Fill in the entry in the global offset table. */
8022 bfd_put_32 (output_bfd,
8023 (splt->output_section->vma
8024 + splt->output_offset),
8025 sgot->contents + got_offset);
8027 /* Fill in the entry in the .rel(a).plt section. */
8028 rel.r_addend = 0;
8029 rel.r_offset = got_address;
8030 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_JUMP_SLOT);
8033 loc = srel->contents + plt_index * RELOC_SIZE (htab);
8034 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
8036 if (!h->def_regular)
8038 /* Mark the symbol as undefined, rather than as defined in
8039 the .plt section. Leave the value alone. */
8040 sym->st_shndx = SHN_UNDEF;
8041 /* If the symbol is weak, we do need to clear the value.
8042 Otherwise, the PLT entry would provide a definition for
8043 the symbol even if the symbol wasn't defined anywhere,
8044 and so the symbol would never be NULL. */
8045 if (!h->ref_regular_nonweak)
8046 sym->st_value = 0;
8050 if (h->got.offset != (bfd_vma) -1
8051 && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
8052 && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
8054 asection * sgot;
8055 asection * srel;
8056 Elf_Internal_Rela rel;
8057 bfd_byte *loc;
8058 bfd_vma offset;
8060 /* This symbol has an entry in the global offset table. Set it
8061 up. */
8062 sgot = bfd_get_section_by_name (dynobj, ".got");
8063 srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (htab, ".got"));
8064 BFD_ASSERT (sgot != NULL && srel != NULL);
8066 offset = (h->got.offset & ~(bfd_vma) 1);
8067 rel.r_addend = 0;
8068 rel.r_offset = (sgot->output_section->vma
8069 + sgot->output_offset
8070 + offset);
8072 /* If this is a static link, or it is a -Bsymbolic link and the
8073 symbol is defined locally or was forced to be local because
8074 of a version file, we just want to emit a RELATIVE reloc.
8075 The entry in the global offset table will already have been
8076 initialized in the relocate_section function. */
8077 if (info->shared
8078 && SYMBOL_REFERENCES_LOCAL (info, h))
8080 BFD_ASSERT((h->got.offset & 1) != 0);
8081 rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
8082 if (!htab->use_rel)
8084 rel.r_addend = bfd_get_32 (output_bfd, sgot->contents + offset);
8085 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
8088 else
8090 BFD_ASSERT((h->got.offset & 1) == 0);
8091 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
8092 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
8095 loc = srel->contents + srel->reloc_count++ * RELOC_SIZE (htab);
8096 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
8099 if (h->needs_copy)
8101 asection * s;
8102 Elf_Internal_Rela rel;
8103 bfd_byte *loc;
8105 /* This symbol needs a copy reloc. Set it up. */
8106 BFD_ASSERT (h->dynindx != -1
8107 && (h->root.type == bfd_link_hash_defined
8108 || h->root.type == bfd_link_hash_defweak));
8110 s = bfd_get_section_by_name (h->root.u.def.section->owner,
8111 RELOC_SECTION (htab, ".bss"));
8112 BFD_ASSERT (s != NULL);
8114 rel.r_addend = 0;
8115 rel.r_offset = (h->root.u.def.value
8116 + h->root.u.def.section->output_section->vma
8117 + h->root.u.def.section->output_offset);
8118 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
8119 loc = s->contents + s->reloc_count++ * RELOC_SIZE (htab);
8120 SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
8123 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. On VxWorks,
8124 the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it is relative
8125 to the ".got" section. */
8126 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
8127 || (!htab->vxworks_p && h == htab->root.hgot))
8128 sym->st_shndx = SHN_ABS;
8130 return TRUE;
8133 /* Finish up the dynamic sections. */
8135 static bfd_boolean
8136 elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
8138 bfd * dynobj;
8139 asection * sgot;
8140 asection * sdyn;
8142 dynobj = elf_hash_table (info)->dynobj;
8144 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
8145 BFD_ASSERT (elf32_arm_hash_table (info)->symbian_p || sgot != NULL);
8146 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
8148 if (elf_hash_table (info)->dynamic_sections_created)
8150 asection *splt;
8151 Elf32_External_Dyn *dyncon, *dynconend;
8152 struct elf32_arm_link_hash_table *htab;
8154 htab = elf32_arm_hash_table (info);
8155 splt = bfd_get_section_by_name (dynobj, ".plt");
8156 BFD_ASSERT (splt != NULL && sdyn != NULL);
8158 dyncon = (Elf32_External_Dyn *) sdyn->contents;
8159 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
8161 for (; dyncon < dynconend; dyncon++)
8163 Elf_Internal_Dyn dyn;
8164 const char * name;
8165 asection * s;
8167 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
8169 switch (dyn.d_tag)
8171 unsigned int type;
8173 default:
8174 break;
8176 case DT_HASH:
8177 name = ".hash";
8178 goto get_vma_if_bpabi;
8179 case DT_STRTAB:
8180 name = ".dynstr";
8181 goto get_vma_if_bpabi;
8182 case DT_SYMTAB:
8183 name = ".dynsym";
8184 goto get_vma_if_bpabi;
8185 case DT_VERSYM:
8186 name = ".gnu.version";
8187 goto get_vma_if_bpabi;
8188 case DT_VERDEF:
8189 name = ".gnu.version_d";
8190 goto get_vma_if_bpabi;
8191 case DT_VERNEED:
8192 name = ".gnu.version_r";
8193 goto get_vma_if_bpabi;
8195 case DT_PLTGOT:
8196 name = ".got";
8197 goto get_vma;
8198 case DT_JMPREL:
8199 name = RELOC_SECTION (htab, ".plt");
8200 get_vma:
8201 s = bfd_get_section_by_name (output_bfd, name);
8202 BFD_ASSERT (s != NULL);
8203 if (!htab->symbian_p)
8204 dyn.d_un.d_ptr = s->vma;
8205 else
8206 /* In the BPABI, tags in the PT_DYNAMIC section point
8207 at the file offset, not the memory address, for the
8208 convenience of the post linker. */
8209 dyn.d_un.d_ptr = s->filepos;
8210 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
8211 break;
8213 get_vma_if_bpabi:
8214 if (htab->symbian_p)
8215 goto get_vma;
8216 break;
8218 case DT_PLTRELSZ:
8219 s = bfd_get_section_by_name (output_bfd,
8220 RELOC_SECTION (htab, ".plt"));
8221 BFD_ASSERT (s != NULL);
8222 dyn.d_un.d_val = s->size;
8223 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
8224 break;
8226 case DT_RELSZ:
8227 case DT_RELASZ:
8228 if (!htab->symbian_p)
8230 /* My reading of the SVR4 ABI indicates that the
8231 procedure linkage table relocs (DT_JMPREL) should be
8232 included in the overall relocs (DT_REL). This is
8233 what Solaris does. However, UnixWare can not handle
8234 that case. Therefore, we override the DT_RELSZ entry
8235 here to make it not include the JMPREL relocs. Since
8236 the linker script arranges for .rel(a).plt to follow all
8237 other relocation sections, we don't have to worry
8238 about changing the DT_REL entry. */
8239 s = bfd_get_section_by_name (output_bfd,
8240 RELOC_SECTION (htab, ".plt"));
8241 if (s != NULL)
8242 dyn.d_un.d_val -= s->size;
8243 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
8244 break;
8246 /* Fall through */
8248 case DT_REL:
8249 case DT_RELA:
8250 /* In the BPABI, the DT_REL tag must point at the file
8251 offset, not the VMA, of the first relocation
8252 section. So, we use code similar to that in
8253 elflink.c, but do not check for SHF_ALLOC on the
8254 relcoation section, since relocations sections are
8255 never allocated under the BPABI. The comments above
8256 about Unixware notwithstanding, we include all of the
8257 relocations here. */
8258 if (htab->symbian_p)
8260 unsigned int i;
8261 type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
8262 ? SHT_REL : SHT_RELA);
8263 dyn.d_un.d_val = 0;
8264 for (i = 1; i < elf_numsections (output_bfd); i++)
8266 Elf_Internal_Shdr *hdr
8267 = elf_elfsections (output_bfd)[i];
8268 if (hdr->sh_type == type)
8270 if (dyn.d_tag == DT_RELSZ
8271 || dyn.d_tag == DT_RELASZ)
8272 dyn.d_un.d_val += hdr->sh_size;
8273 else if ((ufile_ptr) hdr->sh_offset
8274 <= dyn.d_un.d_val - 1)
8275 dyn.d_un.d_val = hdr->sh_offset;
8278 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
8280 break;
8282 /* Set the bottom bit of DT_INIT/FINI if the
8283 corresponding function is Thumb. */
8284 case DT_INIT:
8285 name = info->init_function;
8286 goto get_sym;
8287 case DT_FINI:
8288 name = info->fini_function;
8289 get_sym:
8290 /* If it wasn't set by elf_bfd_final_link
8291 then there is nothing to adjust. */
8292 if (dyn.d_un.d_val != 0)
8294 struct elf_link_hash_entry * eh;
8296 eh = elf_link_hash_lookup (elf_hash_table (info), name,
8297 FALSE, FALSE, TRUE);
8298 if (eh != (struct elf_link_hash_entry *) NULL
8299 && ELF_ST_TYPE (eh->type) == STT_ARM_TFUNC)
8301 dyn.d_un.d_val |= 1;
8302 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
8305 break;
8309 /* Fill in the first entry in the procedure linkage table. */
8310 if (splt->size > 0 && elf32_arm_hash_table (info)->plt_header_size)
8312 const bfd_vma *plt0_entry;
8313 bfd_vma got_address, plt_address, got_displacement;
8315 /* Calculate the addresses of the GOT and PLT. */
8316 got_address = sgot->output_section->vma + sgot->output_offset;
8317 plt_address = splt->output_section->vma + splt->output_offset;
8319 if (htab->vxworks_p)
8321 /* The VxWorks GOT is relocated by the dynamic linker.
8322 Therefore, we must emit relocations rather than simply
8323 computing the values now. */
8324 Elf_Internal_Rela rel;
8326 plt0_entry = elf32_arm_vxworks_exec_plt0_entry;
8327 put_arm_insn (htab, output_bfd, plt0_entry[0],
8328 splt->contents + 0);
8329 put_arm_insn (htab, output_bfd, plt0_entry[1],
8330 splt->contents + 4);
8331 put_arm_insn (htab, output_bfd, plt0_entry[2],
8332 splt->contents + 8);
8333 bfd_put_32 (output_bfd, got_address, splt->contents + 12);
8335 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_. */
8336 rel.r_offset = plt_address + 12;
8337 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
8338 rel.r_addend = 0;
8339 SWAP_RELOC_OUT (htab) (output_bfd, &rel,
8340 htab->srelplt2->contents);
8342 else
8344 got_displacement = got_address - (plt_address + 16);
8346 plt0_entry = elf32_arm_plt0_entry;
8347 put_arm_insn (htab, output_bfd, plt0_entry[0],
8348 splt->contents + 0);
8349 put_arm_insn (htab, output_bfd, plt0_entry[1],
8350 splt->contents + 4);
8351 put_arm_insn (htab, output_bfd, plt0_entry[2],
8352 splt->contents + 8);
8353 put_arm_insn (htab, output_bfd, plt0_entry[3],
8354 splt->contents + 12);
8356 #ifdef FOUR_WORD_PLT
8357 /* The displacement value goes in the otherwise-unused
8358 last word of the second entry. */
8359 bfd_put_32 (output_bfd, got_displacement, splt->contents + 28);
8360 #else
8361 bfd_put_32 (output_bfd, got_displacement, splt->contents + 16);
8362 #endif
8366 /* UnixWare sets the entsize of .plt to 4, although that doesn't
8367 really seem like the right value. */
8368 elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
8370 if (htab->vxworks_p && !info->shared && htab->splt->size > 0)
8372 /* Correct the .rel(a).plt.unloaded relocations. They will have
8373 incorrect symbol indexes. */
8374 int num_plts;
8375 unsigned char *p;
8377 num_plts = ((htab->splt->size - htab->plt_header_size)
8378 / htab->plt_entry_size);
8379 p = htab->srelplt2->contents + RELOC_SIZE (htab);
8381 for (; num_plts; num_plts--)
8383 Elf_Internal_Rela rel;
8385 SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
8386 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
8387 SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
8388 p += RELOC_SIZE (htab);
8390 SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
8391 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
8392 SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
8393 p += RELOC_SIZE (htab);
8398 /* Fill in the first three entries in the global offset table. */
8399 if (sgot)
8401 if (sgot->size > 0)
8403 if (sdyn == NULL)
8404 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
8405 else
8406 bfd_put_32 (output_bfd,
8407 sdyn->output_section->vma + sdyn->output_offset,
8408 sgot->contents);
8409 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
8410 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
8413 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
8416 return TRUE;
8419 static void
8420 elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
8422 Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
8423 struct elf32_arm_link_hash_table *globals;
8425 i_ehdrp = elf_elfheader (abfd);
8427 if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
8428 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
8429 else
8430 i_ehdrp->e_ident[EI_OSABI] = 0;
8431 i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
8433 if (link_info)
8435 globals = elf32_arm_hash_table (link_info);
8436 if (globals->byteswap_code)
8437 i_ehdrp->e_flags |= EF_ARM_BE8;
8441 static enum elf_reloc_type_class
8442 elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
8444 switch ((int) ELF32_R_TYPE (rela->r_info))
8446 case R_ARM_RELATIVE:
8447 return reloc_class_relative;
8448 case R_ARM_JUMP_SLOT:
8449 return reloc_class_plt;
8450 case R_ARM_COPY:
8451 return reloc_class_copy;
8452 default:
8453 return reloc_class_normal;
8457 /* Set the right machine number for an Arm ELF file. */
8459 static bfd_boolean
8460 elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
8462 if (hdr->sh_type == SHT_NOTE)
8463 *flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_CONTENTS;
8465 return TRUE;
8468 static void
8469 elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
8471 bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
8474 /* Return TRUE if this is an unwinding table entry. */
8476 static bfd_boolean
8477 is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
8479 size_t len1, len2;
8481 len1 = sizeof (ELF_STRING_ARM_unwind) - 1;
8482 len2 = sizeof (ELF_STRING_ARM_unwind_once) - 1;
8483 return (strncmp (name, ELF_STRING_ARM_unwind, len1) == 0
8484 || strncmp (name, ELF_STRING_ARM_unwind_once, len2) == 0);
8488 /* Set the type and flags for an ARM section. We do this by
8489 the section name, which is a hack, but ought to work. */
8491 static bfd_boolean
8492 elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
8494 const char * name;
8496 name = bfd_get_section_name (abfd, sec);
8498 if (is_arm_elf_unwind_section_name (abfd, name))
8500 hdr->sh_type = SHT_ARM_EXIDX;
8501 hdr->sh_flags |= SHF_LINK_ORDER;
8503 else if (strcmp(name, ".ARM.attributes") == 0)
8505 hdr->sh_type = SHT_ARM_ATTRIBUTES;
8507 return TRUE;
8510 /* Parse an Arm EABI attributes section. */
8511 static void
8512 elf32_arm_parse_attributes (bfd *abfd, Elf_Internal_Shdr * hdr)
8514 bfd_byte *contents;
8515 bfd_byte *p;
8516 bfd_vma len;
8518 contents = bfd_malloc (hdr->sh_size);
8519 if (!contents)
8520 return;
8521 if (!bfd_get_section_contents (abfd, hdr->bfd_section, contents, 0,
8522 hdr->sh_size))
8524 free (contents);
8525 return;
8527 p = contents;
8528 if (*(p++) == 'A')
8530 len = hdr->sh_size - 1;
8531 while (len > 0)
8533 int namelen;
8534 bfd_vma section_len;
8536 section_len = bfd_get_32 (abfd, p);
8537 p += 4;
8538 if (section_len > len)
8539 section_len = len;
8540 len -= section_len;
8541 namelen = strlen ((char *)p) + 1;
8542 section_len -= namelen + 4;
8543 if (strcmp((char *)p, "aeabi") != 0)
8545 /* Vendor section. Ignore it. */
8546 p += namelen + section_len;
8548 else
8550 p += namelen;
8551 while (section_len > 0)
8553 int tag;
8554 unsigned int n;
8555 unsigned int val;
8556 bfd_vma subsection_len;
8557 bfd_byte *end;
8559 tag = read_unsigned_leb128 (abfd, p, &n);
8560 p += n;
8561 subsection_len = bfd_get_32 (abfd, p);
8562 p += 4;
8563 if (subsection_len > section_len)
8564 subsection_len = section_len;
8565 section_len -= subsection_len;
8566 subsection_len -= n + 4;
8567 end = p + subsection_len;
8568 switch (tag)
8570 case Tag_File:
8571 while (p < end)
8573 bfd_boolean is_string;
8575 tag = read_unsigned_leb128 (abfd, p, &n);
8576 p += n;
8577 if (tag == 4 || tag == 5)
8578 is_string = 1;
8579 else if (tag < 32)
8580 is_string = 0;
8581 else
8582 is_string = (tag & 1) != 0;
8583 if (tag == Tag_compatibility)
8585 val = read_unsigned_leb128 (abfd, p, &n);
8586 p += n;
8587 elf32_arm_add_eabi_attr_compat (abfd, val,
8588 (char *)p);
8589 p += strlen ((char *)p) + 1;
8591 else if (is_string)
8593 elf32_arm_add_eabi_attr_string (abfd, tag,
8594 (char *)p);
8595 p += strlen ((char *)p) + 1;
8597 else
8599 val = read_unsigned_leb128 (abfd, p, &n);
8600 p += n;
8601 elf32_arm_add_eabi_attr_int (abfd, tag, val);
8604 break;
8605 case Tag_Section:
8606 case Tag_Symbol:
8607 /* Don't have anywhere convenient to attach these.
8608 Fall through for now. */
8609 default:
8610 /* Ignore things we don't kow about. */
8611 p += subsection_len;
8612 subsection_len = 0;
8613 break;
8619 free (contents);
8622 /* Handle an ARM specific section when reading an object file. This is
8623 called when bfd_section_from_shdr finds a section with an unknown
8624 type. */
8626 static bfd_boolean
8627 elf32_arm_section_from_shdr (bfd *abfd,
8628 Elf_Internal_Shdr * hdr,
8629 const char *name,
8630 int shindex)
8632 /* There ought to be a place to keep ELF backend specific flags, but
8633 at the moment there isn't one. We just keep track of the
8634 sections by their name, instead. Fortunately, the ABI gives
8635 names for all the ARM specific sections, so we will probably get
8636 away with this. */
8637 switch (hdr->sh_type)
8639 case SHT_ARM_EXIDX:
8640 case SHT_ARM_PREEMPTMAP:
8641 case SHT_ARM_ATTRIBUTES:
8642 break;
8644 default:
8645 return FALSE;
8648 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
8649 return FALSE;
8651 if (hdr->sh_type == SHT_ARM_ATTRIBUTES)
8652 elf32_arm_parse_attributes(abfd, hdr);
8653 return TRUE;
8656 /* A structure used to record a list of sections, independently
8657 of the next and prev fields in the asection structure. */
8658 typedef struct section_list
8660 asection * sec;
8661 struct section_list * next;
8662 struct section_list * prev;
8664 section_list;
8666 /* Unfortunately we need to keep a list of sections for which
8667 an _arm_elf_section_data structure has been allocated. This
8668 is because it is possible for functions like elf32_arm_write_section
8669 to be called on a section which has had an elf_data_structure
8670 allocated for it (and so the used_by_bfd field is valid) but
8671 for which the ARM extended version of this structure - the
8672 _arm_elf_section_data structure - has not been allocated. */
8673 static section_list * sections_with_arm_elf_section_data = NULL;
8675 static void
8676 record_section_with_arm_elf_section_data (asection * sec)
8678 struct section_list * entry;
8680 entry = bfd_malloc (sizeof (* entry));
8681 if (entry == NULL)
8682 return;
8683 entry->sec = sec;
8684 entry->next = sections_with_arm_elf_section_data;
8685 entry->prev = NULL;
8686 if (entry->next != NULL)
8687 entry->next->prev = entry;
8688 sections_with_arm_elf_section_data = entry;
8691 static struct section_list *
8692 find_arm_elf_section_entry (asection * sec)
8694 struct section_list * entry;
8695 static struct section_list * last_entry = NULL;
8697 /* This is a short cut for the typical case where the sections are added
8698 to the sections_with_arm_elf_section_data list in forward order and
8699 then looked up here in backwards order. This makes a real difference
8700 to the ld-srec/sec64k.exp linker test. */
8701 entry = sections_with_arm_elf_section_data;
8702 if (last_entry != NULL)
8704 if (last_entry->sec == sec)
8705 entry = last_entry;
8706 else if (last_entry->next != NULL
8707 && last_entry->next->sec == sec)
8708 entry = last_entry->next;
8711 for (; entry; entry = entry->next)
8712 if (entry->sec == sec)
8713 break;
8715 if (entry)
8716 /* Record the entry prior to this one - it is the entry we are most
8717 likely to want to locate next time. Also this way if we have been
8718 called from unrecord_section_with_arm_elf_section_data() we will not
8719 be caching a pointer that is about to be freed. */
8720 last_entry = entry->prev;
8722 return entry;
8725 static _arm_elf_section_data *
8726 get_arm_elf_section_data (asection * sec)
8728 struct section_list * entry;
8730 entry = find_arm_elf_section_entry (sec);
8732 if (entry)
8733 return elf32_arm_section_data (entry->sec);
8734 else
8735 return NULL;
8738 static void
8739 unrecord_section_with_arm_elf_section_data (asection * sec)
8741 struct section_list * entry;
8743 entry = find_arm_elf_section_entry (sec);
8745 if (entry)
8747 if (entry->prev != NULL)
8748 entry->prev->next = entry->next;
8749 if (entry->next != NULL)
8750 entry->next->prev = entry->prev;
8751 if (entry == sections_with_arm_elf_section_data)
8752 sections_with_arm_elf_section_data = entry->next;
8753 free (entry);
8757 /* Called for each symbol. Builds a section map based on mapping symbols.
8758 Does not alter any of the symbols. */
8760 static bfd_boolean
8761 elf32_arm_output_symbol_hook (struct bfd_link_info *info,
8762 const char *name,
8763 Elf_Internal_Sym *elfsym,
8764 asection *input_sec,
8765 struct elf_link_hash_entry *h)
8767 int mapcount;
8768 elf32_arm_section_map *map;
8769 elf32_arm_section_map *newmap;
8770 _arm_elf_section_data *arm_data;
8771 struct elf32_arm_link_hash_table *globals;
8773 globals = elf32_arm_hash_table (info);
8774 if (globals->vxworks_p
8775 && !elf_vxworks_link_output_symbol_hook (info, name, elfsym,
8776 input_sec, h))
8777 return FALSE;
8779 /* Only do this on final link. */
8780 if (info->relocatable)
8781 return TRUE;
8783 /* Only build a map if we need to byteswap code. */
8784 if (!globals->byteswap_code)
8785 return TRUE;
8787 /* We only want mapping symbols. */
8788 if (!bfd_is_arm_special_symbol_name (name, BFD_ARM_SPECIAL_SYM_TYPE_MAP))
8789 return TRUE;
8791 /* If this section has not been allocated an _arm_elf_section_data
8792 structure then we cannot record anything. */
8793 arm_data = get_arm_elf_section_data (input_sec);
8794 if (arm_data == NULL)
8795 return TRUE;
8797 mapcount = arm_data->mapcount + 1;
8798 map = arm_data->map;
8800 /* TODO: This may be inefficient, but we probably don't usually have many
8801 mapping symbols per section. */
8802 newmap = bfd_realloc (map, mapcount * sizeof (* map));
8803 if (newmap != NULL)
8805 arm_data->map = newmap;
8806 arm_data->mapcount = mapcount;
8808 newmap[mapcount - 1].vma = elfsym->st_value;
8809 newmap[mapcount - 1].type = name[1];
8812 return TRUE;
8815 typedef struct
8817 void *finfo;
8818 struct bfd_link_info *info;
8819 int plt_shndx;
8820 bfd_vma plt_offset;
8821 bfd_boolean (*func) (void *, const char *, Elf_Internal_Sym *,
8822 asection *, struct elf_link_hash_entry *);
8823 } output_arch_syminfo;
8825 enum map_symbol_type
8827 ARM_MAP_ARM,
8828 ARM_MAP_THUMB,
8829 ARM_MAP_DATA
8833 /* Output a single PLT mapping symbol. */
8835 static bfd_boolean
8836 elf32_arm_ouput_plt_map_sym (output_arch_syminfo *osi,
8837 enum map_symbol_type type,
8838 bfd_vma offset)
8840 static const char *names[3] = {"$a", "$t", "$d"};
8841 struct elf32_arm_link_hash_table *htab;
8842 Elf_Internal_Sym sym;
8844 htab = elf32_arm_hash_table (osi->info);
8845 sym.st_value = osi->plt_offset + offset;
8846 sym.st_size = 0;
8847 sym.st_other = 0;
8848 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
8849 sym.st_shndx = osi->plt_shndx;
8850 if (!osi->func (osi->finfo, names[type], &sym, htab->splt, NULL))
8851 return FALSE;
8852 return TRUE;
8856 /* Output mapping symbols for PLT entries associated with H. */
8858 static bfd_boolean
8859 elf32_arm_output_plt_map (struct elf_link_hash_entry *h, void *inf)
8861 output_arch_syminfo *osi = (output_arch_syminfo *) inf;
8862 struct elf32_arm_link_hash_table *htab;
8863 struct elf32_arm_link_hash_entry *eh;
8864 bfd_vma addr;
8866 htab = elf32_arm_hash_table (osi->info);
8868 if (h->root.type == bfd_link_hash_indirect)
8869 return TRUE;
8871 if (h->root.type == bfd_link_hash_warning)
8872 /* When warning symbols are created, they **replace** the "real"
8873 entry in the hash table, thus we never get to see the real
8874 symbol in a hash traversal. So look at it now. */
8875 h = (struct elf_link_hash_entry *) h->root.u.i.link;
8877 if (h->plt.offset == (bfd_vma) -1)
8878 return TRUE;
8880 eh = (struct elf32_arm_link_hash_entry *) h;
8881 addr = h->plt.offset;
8882 if (htab->symbian_p)
8884 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_ARM, addr))
8885 return FALSE;
8886 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_DATA, addr + 4))
8887 return FALSE;
8889 else if (htab->vxworks_p)
8891 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_ARM, addr))
8892 return FALSE;
8893 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_DATA, addr + 8))
8894 return FALSE;
8895 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_ARM, addr + 12))
8896 return FALSE;
8897 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_DATA, addr + 20))
8898 return FALSE;
8900 else
8902 bfd_boolean thumb_stub;
8904 thumb_stub = eh->plt_thumb_refcount > 0 && !htab->use_blx;
8905 if (thumb_stub)
8907 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_THUMB, addr - 4))
8908 return FALSE;
8910 #ifdef FOUR_WORD_PLT
8911 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_ARM, addr))
8912 return FALSE;
8913 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_DATA, addr + 12))
8914 return FALSE;
8915 #else
8916 /* A three-word PLT with no Thumb thunk contains only Arm code,
8917 so only need to output a mapping symbol for the first PLT entry and
8918 entries with thumb thunks. */
8919 if (thumb_stub || addr == 20)
8921 if (!elf32_arm_ouput_plt_map_sym (osi, ARM_MAP_ARM, addr))
8922 return FALSE;
8924 #endif
8927 return TRUE;
8931 /* Output mapping symbols for the PLT. */
8933 static bfd_boolean
8934 elf32_arm_output_arch_local_syms (bfd *output_bfd,
8935 struct bfd_link_info *info,
8936 void *finfo, bfd_boolean (*func) (void *, const char *,
8937 Elf_Internal_Sym *,
8938 asection *,
8939 struct elf_link_hash_entry *))
8941 output_arch_syminfo osi;
8942 struct elf32_arm_link_hash_table *htab;
8944 htab = elf32_arm_hash_table (info);
8945 if (!htab->splt || htab->splt->size == 0)
8946 return TRUE;
8948 check_use_blx(htab);
8949 osi.finfo = finfo;
8950 osi.info = info;
8951 osi.func = func;
8952 osi.plt_shndx = _bfd_elf_section_from_bfd_section (output_bfd,
8953 htab->splt->output_section);
8954 osi.plt_offset = htab->splt->output_section->vma;
8956 /* Output mapping symbols for the plt header. SymbianOS does not have a
8957 plt header. */
8958 if (htab->vxworks_p)
8960 /* VxWorks shared libraries have no PLT header. */
8961 if (!info->shared)
8963 if (!elf32_arm_ouput_plt_map_sym (&osi, ARM_MAP_ARM, 0))
8964 return FALSE;
8965 if (!elf32_arm_ouput_plt_map_sym (&osi, ARM_MAP_DATA, 12))
8966 return FALSE;
8969 else if (!htab->symbian_p)
8971 if (!elf32_arm_ouput_plt_map_sym (&osi, ARM_MAP_ARM, 0))
8972 return FALSE;
8973 #ifndef FOUR_WORD_PLT
8974 if (!elf32_arm_ouput_plt_map_sym (&osi, ARM_MAP_DATA, 16))
8975 return FALSE;
8976 #endif
8979 elf_link_hash_traverse (&htab->root, elf32_arm_output_plt_map, (void *) &osi);
8980 return TRUE;
8983 /* Allocate target specific section data. */
8985 static bfd_boolean
8986 elf32_arm_new_section_hook (bfd *abfd, asection *sec)
8988 if (!sec->used_by_bfd)
8990 _arm_elf_section_data *sdata;
8991 bfd_size_type amt = sizeof (*sdata);
8993 sdata = bfd_zalloc (abfd, amt);
8994 if (sdata == NULL)
8995 return FALSE;
8996 sec->used_by_bfd = sdata;
8999 record_section_with_arm_elf_section_data (sec);
9001 return _bfd_elf_new_section_hook (abfd, sec);
9005 /* Used to order a list of mapping symbols by address. */
9007 static int
9008 elf32_arm_compare_mapping (const void * a, const void * b)
9010 return ((const elf32_arm_section_map *) a)->vma
9011 > ((const elf32_arm_section_map *) b)->vma;
9015 /* Do code byteswapping. Return FALSE afterwards so that the section is
9016 written out as normal. */
9018 static bfd_boolean
9019 elf32_arm_write_section (bfd *output_bfd ATTRIBUTE_UNUSED, asection *sec,
9020 bfd_byte *contents)
9022 int mapcount;
9023 _arm_elf_section_data *arm_data;
9024 elf32_arm_section_map *map;
9025 bfd_vma ptr;
9026 bfd_vma end;
9027 bfd_vma offset;
9028 bfd_byte tmp;
9029 int i;
9031 /* If this section has not been allocated an _arm_elf_section_data
9032 structure then we cannot record anything. */
9033 arm_data = get_arm_elf_section_data (sec);
9034 if (arm_data == NULL)
9035 return FALSE;
9037 mapcount = arm_data->mapcount;
9038 map = arm_data->map;
9040 if (mapcount == 0)
9041 return FALSE;
9043 qsort (map, mapcount, sizeof (* map), elf32_arm_compare_mapping);
9045 offset = sec->output_section->vma + sec->output_offset;
9046 ptr = map[0].vma - offset;
9047 for (i = 0; i < mapcount; i++)
9049 if (i == mapcount - 1)
9050 end = sec->size;
9051 else
9052 end = map[i + 1].vma - offset;
9054 switch (map[i].type)
9056 case 'a':
9057 /* Byte swap code words. */
9058 while (ptr + 3 < end)
9060 tmp = contents[ptr];
9061 contents[ptr] = contents[ptr + 3];
9062 contents[ptr + 3] = tmp;
9063 tmp = contents[ptr + 1];
9064 contents[ptr + 1] = contents[ptr + 2];
9065 contents[ptr + 2] = tmp;
9066 ptr += 4;
9068 break;
9070 case 't':
9071 /* Byte swap code halfwords. */
9072 while (ptr + 1 < end)
9074 tmp = contents[ptr];
9075 contents[ptr] = contents[ptr + 1];
9076 contents[ptr + 1] = tmp;
9077 ptr += 2;
9079 break;
9081 case 'd':
9082 /* Leave data alone. */
9083 break;
9085 ptr = end;
9088 free (map);
9089 arm_data->mapcount = 0;
9090 arm_data->map = NULL;
9091 unrecord_section_with_arm_elf_section_data (sec);
9093 return FALSE;
9096 static void
9097 unrecord_section_via_map_over_sections (bfd * abfd ATTRIBUTE_UNUSED,
9098 asection * sec,
9099 void * ignore ATTRIBUTE_UNUSED)
9101 unrecord_section_with_arm_elf_section_data (sec);
9104 static bfd_boolean
9105 elf32_arm_close_and_cleanup (bfd * abfd)
9107 if (abfd->sections)
9108 bfd_map_over_sections (abfd,
9109 unrecord_section_via_map_over_sections,
9110 NULL);
9112 return _bfd_elf_close_and_cleanup (abfd);
9115 static bfd_boolean
9116 elf32_arm_bfd_free_cached_info (bfd * abfd)
9118 if (abfd->sections)
9119 bfd_map_over_sections (abfd,
9120 unrecord_section_via_map_over_sections,
9121 NULL);
9123 return _bfd_free_cached_info (abfd);
9126 /* Display STT_ARM_TFUNC symbols as functions. */
9128 static void
9129 elf32_arm_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
9130 asymbol *asym)
9132 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
9134 if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_ARM_TFUNC)
9135 elfsym->symbol.flags |= BSF_FUNCTION;
9139 /* Mangle thumb function symbols as we read them in. */
9141 static void
9142 elf32_arm_swap_symbol_in (bfd * abfd,
9143 const void *psrc,
9144 const void *pshn,
9145 Elf_Internal_Sym *dst)
9147 bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst);
9149 /* New EABI objects mark thumb function symbols by setting the low bit of
9150 the address. Turn these into STT_ARM_TFUNC. */
9151 if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
9152 && (dst->st_value & 1))
9154 dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC);
9155 dst->st_value &= ~(bfd_vma) 1;
9160 /* Mangle thumb function symbols as we write them out. */
9162 static void
9163 elf32_arm_swap_symbol_out (bfd *abfd,
9164 const Elf_Internal_Sym *src,
9165 void *cdst,
9166 void *shndx)
9168 Elf_Internal_Sym newsym;
9170 /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
9171 of the address set, as per the new EABI. We do this unconditionally
9172 because objcopy does not set the elf header flags until after
9173 it writes out the symbol table. */
9174 if (ELF_ST_TYPE (src->st_info) == STT_ARM_TFUNC)
9176 newsym = *src;
9177 newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
9178 if (newsym.st_shndx != SHN_UNDEF)
9180 /* Do this only for defined symbols. At link type, the static
9181 linker will simulate the work of dynamic linker of resolving
9182 symbols and will carry over the thumbness of found symbols to
9183 the output symbol table. It's not clear how it happens, but
9184 the thumbness of underfined symbols can well be different at
9185 runtime, and writing '1' for them will be confusing for users
9186 and possibly for dynamic linker itself.
9188 newsym.st_value |= 1;
9191 newsym.st_value |= 1;
9193 src = &newsym;
9195 bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
9198 /* Add the PT_ARM_EXIDX program header. */
9200 static bfd_boolean
9201 elf32_arm_modify_segment_map (bfd *abfd,
9202 struct bfd_link_info *info ATTRIBUTE_UNUSED)
9204 struct elf_segment_map *m;
9205 asection *sec;
9207 sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
9208 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
9210 /* If there is already a PT_ARM_EXIDX header, then we do not
9211 want to add another one. This situation arises when running
9212 "strip"; the input binary already has the header. */
9213 m = elf_tdata (abfd)->segment_map;
9214 while (m && m->p_type != PT_ARM_EXIDX)
9215 m = m->next;
9216 if (!m)
9218 m = bfd_zalloc (abfd, sizeof (struct elf_segment_map));
9219 if (m == NULL)
9220 return FALSE;
9221 m->p_type = PT_ARM_EXIDX;
9222 m->count = 1;
9223 m->sections[0] = sec;
9225 m->next = elf_tdata (abfd)->segment_map;
9226 elf_tdata (abfd)->segment_map = m;
9230 return TRUE;
9233 /* We may add a PT_ARM_EXIDX program header. */
9235 static int
9236 elf32_arm_additional_program_headers (bfd *abfd,
9237 struct bfd_link_info *info ATTRIBUTE_UNUSED)
9239 asection *sec;
9241 sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
9242 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
9243 return 1;
9244 else
9245 return 0;
9248 /* We use this to override swap_symbol_in and swap_symbol_out. */
9249 const struct elf_size_info elf32_arm_size_info = {
9250 sizeof (Elf32_External_Ehdr),
9251 sizeof (Elf32_External_Phdr),
9252 sizeof (Elf32_External_Shdr),
9253 sizeof (Elf32_External_Rel),
9254 sizeof (Elf32_External_Rela),
9255 sizeof (Elf32_External_Sym),
9256 sizeof (Elf32_External_Dyn),
9257 sizeof (Elf_External_Note),
9260 32, 2,
9261 ELFCLASS32, EV_CURRENT,
9262 bfd_elf32_write_out_phdrs,
9263 bfd_elf32_write_shdrs_and_ehdr,
9264 bfd_elf32_write_relocs,
9265 elf32_arm_swap_symbol_in,
9266 elf32_arm_swap_symbol_out,
9267 bfd_elf32_slurp_reloc_table,
9268 bfd_elf32_slurp_symbol_table,
9269 bfd_elf32_swap_dyn_in,
9270 bfd_elf32_swap_dyn_out,
9271 bfd_elf32_swap_reloc_in,
9272 bfd_elf32_swap_reloc_out,
9273 bfd_elf32_swap_reloca_in,
9274 bfd_elf32_swap_reloca_out
9277 #define ELF_ARCH bfd_arch_arm
9278 #define ELF_MACHINE_CODE EM_ARM
9279 #ifdef __QNXTARGET__
9280 #define ELF_MAXPAGESIZE 0x1000
9281 #else
9282 #define ELF_MAXPAGESIZE 0x8000
9283 #endif
9284 #define ELF_MINPAGESIZE 0x1000
9285 #define ELF_COMMONPAGESIZE 0x1000
9287 #define bfd_elf32_mkobject elf32_arm_mkobject
9289 #define bfd_elf32_bfd_copy_private_bfd_data elf32_arm_copy_private_bfd_data
9290 #define bfd_elf32_bfd_merge_private_bfd_data elf32_arm_merge_private_bfd_data
9291 #define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
9292 #define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
9293 #define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
9294 #define bfd_elf32_bfd_reloc_type_lookup elf32_arm_reloc_type_lookup
9295 #define bfd_elf32_find_nearest_line elf32_arm_find_nearest_line
9296 #define bfd_elf32_find_inliner_info elf32_arm_find_inliner_info
9297 #define bfd_elf32_new_section_hook elf32_arm_new_section_hook
9298 #define bfd_elf32_bfd_is_target_special_symbol elf32_arm_is_target_special_symbol
9299 #define bfd_elf32_close_and_cleanup elf32_arm_close_and_cleanup
9300 #define bfd_elf32_bfd_free_cached_info elf32_arm_bfd_free_cached_info
9301 #define bfd_elf32_bfd_final_link elf32_arm_bfd_final_link
9303 #define elf_backend_get_symbol_type elf32_arm_get_symbol_type
9304 #define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook
9305 #define elf_backend_gc_sweep_hook elf32_arm_gc_sweep_hook
9306 #define elf_backend_check_relocs elf32_arm_check_relocs
9307 #define elf_backend_relocate_section elf32_arm_relocate_section
9308 #define elf_backend_write_section elf32_arm_write_section
9309 #define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol
9310 #define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections
9311 #define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol
9312 #define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections
9313 #define elf_backend_link_output_symbol_hook elf32_arm_output_symbol_hook
9314 #define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections
9315 #define elf_backend_post_process_headers elf32_arm_post_process_headers
9316 #define elf_backend_reloc_type_class elf32_arm_reloc_type_class
9317 #define elf_backend_object_p elf32_arm_object_p
9318 #define elf_backend_section_flags elf32_arm_section_flags
9319 #define elf_backend_fake_sections elf32_arm_fake_sections
9320 #define elf_backend_section_from_shdr elf32_arm_section_from_shdr
9321 #define elf_backend_final_write_processing elf32_arm_final_write_processing
9322 #define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol
9323 #define elf_backend_symbol_processing elf32_arm_symbol_processing
9324 #define elf_backend_size_info elf32_arm_size_info
9325 #define elf_backend_modify_segment_map elf32_arm_modify_segment_map
9326 #define elf_backend_additional_program_headers \
9327 elf32_arm_additional_program_headers
9328 #define elf_backend_output_arch_local_syms \
9329 elf32_arm_output_arch_local_syms
9331 #define elf_backend_can_refcount 1
9332 #define elf_backend_can_gc_sections 1
9333 #define elf_backend_plt_readonly 1
9334 #define elf_backend_want_got_plt 1
9335 #define elf_backend_want_plt_sym 0
9336 #define elf_backend_may_use_rel_p 1
9337 #define elf_backend_may_use_rela_p 0
9338 #define elf_backend_default_use_rela_p 0
9339 #define elf_backend_rela_normal 0
9341 #define elf_backend_got_header_size 12
9343 #include "elf32-target.h"
9345 /* VxWorks Targets */
9347 #undef TARGET_LITTLE_SYM
9348 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_vxworks_vec
9349 #undef TARGET_LITTLE_NAME
9350 #define TARGET_LITTLE_NAME "elf32-littlearm-vxworks"
9351 #undef TARGET_BIG_SYM
9352 #define TARGET_BIG_SYM bfd_elf32_bigarm_vxworks_vec
9353 #undef TARGET_BIG_NAME
9354 #define TARGET_BIG_NAME "elf32-bigarm-vxworks"
9356 /* Like elf32_arm_link_hash_table_create -- but overrides
9357 appropriately for VxWorks. */
9358 static struct bfd_link_hash_table *
9359 elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
9361 struct bfd_link_hash_table *ret;
9363 ret = elf32_arm_link_hash_table_create (abfd);
9364 if (ret)
9366 struct elf32_arm_link_hash_table *htab
9367 = (struct elf32_arm_link_hash_table *) ret;
9368 htab->use_rel = 0;
9369 htab->vxworks_p = 1;
9371 return ret;
9374 static void
9375 elf32_arm_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
9377 elf32_arm_final_write_processing (abfd, linker);
9378 elf_vxworks_final_write_processing (abfd, linker);
9381 #undef elf32_bed
9382 #define elf32_bed elf32_arm_vxworks_bed
9384 #undef bfd_elf32_bfd_link_hash_table_create
9385 #define bfd_elf32_bfd_link_hash_table_create \
9386 elf32_arm_vxworks_link_hash_table_create
9387 #undef elf_backend_add_symbol_hook
9388 #define elf_backend_add_symbol_hook \
9389 elf_vxworks_add_symbol_hook
9390 #undef elf_backend_final_write_processing
9391 #define elf_backend_final_write_processing \
9392 elf32_arm_vxworks_final_write_processing
9393 #undef elf_backend_emit_relocs
9394 #define elf_backend_emit_relocs \
9395 elf_vxworks_emit_relocs
9397 #undef elf_backend_may_use_rel_p
9398 #define elf_backend_may_use_rel_p 0
9399 #undef elf_backend_may_use_rela_p
9400 #define elf_backend_may_use_rela_p 1
9401 #undef elf_backend_default_use_rela_p
9402 #define elf_backend_default_use_rela_p 1
9403 #undef elf_backend_rela_normal
9404 #define elf_backend_rela_normal 1
9405 #undef elf_backend_want_plt_sym
9406 #define elf_backend_want_plt_sym 1
9407 #undef ELF_MAXPAGESIZE
9408 #define ELF_MAXPAGESIZE 0x1000
9410 #include "elf32-target.h"
9413 /* Symbian OS Targets */
9415 #undef TARGET_LITTLE_SYM
9416 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_symbian_vec
9417 #undef TARGET_LITTLE_NAME
9418 #define TARGET_LITTLE_NAME "elf32-littlearm-symbian"
9419 #undef TARGET_BIG_SYM
9420 #define TARGET_BIG_SYM bfd_elf32_bigarm_symbian_vec
9421 #undef TARGET_BIG_NAME
9422 #define TARGET_BIG_NAME "elf32-bigarm-symbian"
9424 /* Like elf32_arm_link_hash_table_create -- but overrides
9425 appropriately for Symbian OS. */
9426 static struct bfd_link_hash_table *
9427 elf32_arm_symbian_link_hash_table_create (bfd *abfd)
9429 struct bfd_link_hash_table *ret;
9431 ret = elf32_arm_link_hash_table_create (abfd);
9432 if (ret)
9434 struct elf32_arm_link_hash_table *htab
9435 = (struct elf32_arm_link_hash_table *)ret;
9436 /* There is no PLT header for Symbian OS. */
9437 htab->plt_header_size = 0;
9438 /* The PLT entries are each three instructions. */
9439 htab->plt_entry_size = 4 * NUM_ELEM (elf32_arm_symbian_plt_entry);
9440 htab->symbian_p = 1;
9441 /* Symbian uses armv5t or above, so use_blx is always true. */
9442 htab->use_blx = 1;
9443 htab->root.is_relocatable_executable = 1;
9445 return ret;
9448 static const struct bfd_elf_special_section
9449 elf32_arm_symbian_special_sections[] =
9451 /* In a BPABI executable, the dynamic linking sections do not go in
9452 the loadable read-only segment. The post-linker may wish to
9453 refer to these sections, but they are not part of the final
9454 program image. */
9455 { ".dynamic", 8, 0, SHT_DYNAMIC, 0 },
9456 { ".dynstr", 7, 0, SHT_STRTAB, 0 },
9457 { ".dynsym", 7, 0, SHT_DYNSYM, 0 },
9458 { ".got", 4, 0, SHT_PROGBITS, 0 },
9459 { ".hash", 5, 0, SHT_HASH, 0 },
9460 /* These sections do not need to be writable as the SymbianOS
9461 postlinker will arrange things so that no dynamic relocation is
9462 required. */
9463 { ".init_array", 11, 0, SHT_INIT_ARRAY, SHF_ALLOC },
9464 { ".fini_array", 11, 0, SHT_FINI_ARRAY, SHF_ALLOC },
9465 { ".preinit_array", 14, 0, SHT_PREINIT_ARRAY, SHF_ALLOC },
9466 { NULL, 0, 0, 0, 0 }
9469 static void
9470 elf32_arm_symbian_begin_write_processing (bfd *abfd,
9471 struct bfd_link_info *link_info
9472 ATTRIBUTE_UNUSED)
9474 /* BPABI objects are never loaded directly by an OS kernel; they are
9475 processed by a postlinker first, into an OS-specific format. If
9476 the D_PAGED bit is set on the file, BFD will align segments on
9477 page boundaries, so that an OS can directly map the file. With
9478 BPABI objects, that just results in wasted space. In addition,
9479 because we clear the D_PAGED bit, map_sections_to_segments will
9480 recognize that the program headers should not be mapped into any
9481 loadable segment. */
9482 abfd->flags &= ~D_PAGED;
9485 static bfd_boolean
9486 elf32_arm_symbian_modify_segment_map (bfd *abfd,
9487 struct bfd_link_info *info)
9489 struct elf_segment_map *m;
9490 asection *dynsec;
9492 /* BPABI shared libraries and executables should have a PT_DYNAMIC
9493 segment. However, because the .dynamic section is not marked
9494 with SEC_LOAD, the generic ELF code will not create such a
9495 segment. */
9496 dynsec = bfd_get_section_by_name (abfd, ".dynamic");
9497 if (dynsec)
9499 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
9500 if (m->p_type == PT_DYNAMIC)
9501 break;
9503 if (m == NULL)
9505 m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
9506 m->next = elf_tdata (abfd)->segment_map;
9507 elf_tdata (abfd)->segment_map = m;
9511 /* Also call the generic arm routine. */
9512 return elf32_arm_modify_segment_map (abfd, info);
9515 #undef elf32_bed
9516 #define elf32_bed elf32_arm_symbian_bed
9518 /* The dynamic sections are not allocated on SymbianOS; the postlinker
9519 will process them and then discard them. */
9520 #undef ELF_DYNAMIC_SEC_FLAGS
9521 #define ELF_DYNAMIC_SEC_FLAGS \
9522 (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
9524 #undef bfd_elf32_bfd_link_hash_table_create
9525 #define bfd_elf32_bfd_link_hash_table_create \
9526 elf32_arm_symbian_link_hash_table_create
9527 #undef elf_backend_add_symbol_hook
9529 #undef elf_backend_special_sections
9530 #define elf_backend_special_sections elf32_arm_symbian_special_sections
9532 #undef elf_backend_begin_write_processing
9533 #define elf_backend_begin_write_processing \
9534 elf32_arm_symbian_begin_write_processing
9535 #undef elf_backend_final_write_processing
9536 #define elf_backend_final_write_processing \
9537 elf32_arm_final_write_processing
9538 #undef elf_backend_emit_relocs
9540 #undef elf_backend_modify_segment_map
9541 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
9543 /* There is no .got section for BPABI objects, and hence no header. */
9544 #undef elf_backend_got_header_size
9545 #define elf_backend_got_header_size 0
9547 /* Similarly, there is no .got.plt section. */
9548 #undef elf_backend_want_got_plt
9549 #define elf_backend_want_got_plt 0
9551 #undef elf_backend_may_use_rel_p
9552 #define elf_backend_may_use_rel_p 1
9553 #undef elf_backend_may_use_rela_p
9554 #define elf_backend_may_use_rela_p 0
9555 #undef elf_backend_default_use_rela_p
9556 #define elf_backend_default_use_rela_p 0
9557 #undef elf_backend_rela_normal
9558 #define elf_backend_rela_normal 0
9559 #undef elf_backend_want_plt_sym
9560 #define elf_backend_want_plt_sym 0
9561 #undef ELF_MAXPAGESIZE
9562 #define ELF_MAXPAGESIZE 0x8000
9564 #include "elf32-target.h"