]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf32-arm.c
* elf32-arm.c (elf32_arm_modify_segment_map): New function.
[thirdparty/binutils-gdb.git] / bfd / elf32-arm.c
CommitLineData
252b5132 1/* 32-bit ELF support for ARM
4e7fd91e 2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
d1f161ea 3 Free Software Foundation, Inc.
252b5132
RH
4
5 This file is part of BFD, the Binary File Descriptor library.
6
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.
11
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.
16
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
7f266840
DJ
21#include "elf/arm.h"
22#include "bfd.h"
23#include "sysdep.h"
24#include "libbfd.h"
25#include "elf-bfd.h"
26
27#ifndef NUM_ELEM
28#define NUM_ELEM(a) (sizeof (a) / (sizeof (a)[0]))
29#endif
30
7f266840
DJ
31#define elf_info_to_howto 0
32#define elf_info_to_howto_rel elf32_arm_info_to_howto
33
34#define ARM_ELF_ABI_VERSION 0
35#define ARM_ELF_OS_ABI_VERSION ELFOSABI_ARM
36
37static reloc_howto_type * elf32_arm_reloc_type_lookup
38 PARAMS ((bfd * abfd, bfd_reloc_code_real_type code));
39static bfd_boolean elf32_arm_nabi_grok_prstatus
40 PARAMS ((bfd *abfd, Elf_Internal_Note *note));
41static bfd_boolean elf32_arm_nabi_grok_psinfo
42 PARAMS ((bfd *abfd, Elf_Internal_Note *note));
43
44/* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
45 R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
46 in that slot. */
47
48static reloc_howto_type elf32_arm_howto_table[] =
49{
50 /* No relocation */
51 HOWTO (R_ARM_NONE, /* type */
52 0, /* rightshift */
53 0, /* size (0 = byte, 1 = short, 2 = long) */
54 0, /* bitsize */
55 FALSE, /* pc_relative */
56 0, /* bitpos */
57 complain_overflow_dont,/* complain_on_overflow */
58 bfd_elf_generic_reloc, /* special_function */
59 "R_ARM_NONE", /* name */
60 FALSE, /* partial_inplace */
61 0, /* src_mask */
62 0, /* dst_mask */
63 FALSE), /* pcrel_offset */
64
65 HOWTO (R_ARM_PC24, /* type */
66 2, /* rightshift */
67 2, /* size (0 = byte, 1 = short, 2 = long) */
68 24, /* bitsize */
69 TRUE, /* pc_relative */
70 0, /* bitpos */
71 complain_overflow_signed,/* complain_on_overflow */
72 bfd_elf_generic_reloc, /* special_function */
73 "R_ARM_PC24", /* name */
74 FALSE, /* partial_inplace */
75 0x00ffffff, /* src_mask */
76 0x00ffffff, /* dst_mask */
77 TRUE), /* pcrel_offset */
78
79 /* 32 bit absolute */
80 HOWTO (R_ARM_ABS32, /* type */
81 0, /* rightshift */
82 2, /* size (0 = byte, 1 = short, 2 = long) */
83 32, /* bitsize */
84 FALSE, /* pc_relative */
85 0, /* bitpos */
86 complain_overflow_bitfield,/* complain_on_overflow */
87 bfd_elf_generic_reloc, /* special_function */
88 "R_ARM_ABS32", /* name */
89 FALSE, /* partial_inplace */
90 0xffffffff, /* src_mask */
91 0xffffffff, /* dst_mask */
92 FALSE), /* pcrel_offset */
93
94 /* standard 32bit pc-relative reloc */
95 HOWTO (R_ARM_REL32, /* type */
96 0, /* rightshift */
97 2, /* size (0 = byte, 1 = short, 2 = long) */
98 32, /* bitsize */
99 TRUE, /* pc_relative */
100 0, /* bitpos */
101 complain_overflow_bitfield,/* complain_on_overflow */
102 bfd_elf_generic_reloc, /* special_function */
103 "R_ARM_REL32", /* name */
104 FALSE, /* partial_inplace */
105 0xffffffff, /* src_mask */
106 0xffffffff, /* dst_mask */
107 TRUE), /* pcrel_offset */
108
109 /* 8 bit absolute */
110 HOWTO (R_ARM_PC13, /* type */
111 0, /* rightshift */
112 0, /* size (0 = byte, 1 = short, 2 = long) */
113 8, /* bitsize */
114 FALSE, /* pc_relative */
115 0, /* bitpos */
116 complain_overflow_bitfield,/* complain_on_overflow */
117 bfd_elf_generic_reloc, /* special_function */
118 "R_ARM_PC13", /* name */
119 FALSE, /* partial_inplace */
120 0x000000ff, /* src_mask */
121 0x000000ff, /* dst_mask */
122 FALSE), /* pcrel_offset */
123
124 /* 16 bit absolute */
125 HOWTO (R_ARM_ABS16, /* type */
126 0, /* rightshift */
127 1, /* size (0 = byte, 1 = short, 2 = long) */
128 16, /* bitsize */
129 FALSE, /* pc_relative */
130 0, /* bitpos */
131 complain_overflow_bitfield,/* complain_on_overflow */
132 bfd_elf_generic_reloc, /* special_function */
133 "R_ARM_ABS16", /* name */
134 FALSE, /* partial_inplace */
135 0x0000ffff, /* src_mask */
136 0x0000ffff, /* dst_mask */
137 FALSE), /* pcrel_offset */
138
139 /* 12 bit absolute */
140 HOWTO (R_ARM_ABS12, /* type */
141 0, /* rightshift */
142 2, /* size (0 = byte, 1 = short, 2 = long) */
143 12, /* bitsize */
144 FALSE, /* pc_relative */
145 0, /* bitpos */
146 complain_overflow_bitfield,/* complain_on_overflow */
147 bfd_elf_generic_reloc, /* special_function */
148 "R_ARM_ABS12", /* name */
149 FALSE, /* partial_inplace */
150 0x000008ff, /* src_mask */
151 0x000008ff, /* dst_mask */
152 FALSE), /* pcrel_offset */
153
154 HOWTO (R_ARM_THM_ABS5, /* type */
155 6, /* rightshift */
156 1, /* size (0 = byte, 1 = short, 2 = long) */
157 5, /* bitsize */
158 FALSE, /* pc_relative */
159 0, /* bitpos */
160 complain_overflow_bitfield,/* complain_on_overflow */
161 bfd_elf_generic_reloc, /* special_function */
162 "R_ARM_THM_ABS5", /* name */
163 FALSE, /* partial_inplace */
164 0x000007e0, /* src_mask */
165 0x000007e0, /* dst_mask */
166 FALSE), /* pcrel_offset */
167
168 /* 8 bit absolute */
169 HOWTO (R_ARM_ABS8, /* type */
170 0, /* rightshift */
171 0, /* size (0 = byte, 1 = short, 2 = long) */
172 8, /* bitsize */
173 FALSE, /* pc_relative */
174 0, /* bitpos */
175 complain_overflow_bitfield,/* complain_on_overflow */
176 bfd_elf_generic_reloc, /* special_function */
177 "R_ARM_ABS8", /* name */
178 FALSE, /* partial_inplace */
179 0x000000ff, /* src_mask */
180 0x000000ff, /* dst_mask */
181 FALSE), /* pcrel_offset */
182
183 HOWTO (R_ARM_SBREL32, /* type */
184 0, /* rightshift */
185 2, /* size (0 = byte, 1 = short, 2 = long) */
186 32, /* bitsize */
187 FALSE, /* pc_relative */
188 0, /* bitpos */
189 complain_overflow_dont,/* complain_on_overflow */
190 bfd_elf_generic_reloc, /* special_function */
191 "R_ARM_SBREL32", /* name */
192 FALSE, /* partial_inplace */
193 0xffffffff, /* src_mask */
194 0xffffffff, /* dst_mask */
195 FALSE), /* pcrel_offset */
196
197 HOWTO (R_ARM_THM_PC22, /* type */
198 1, /* rightshift */
199 2, /* size (0 = byte, 1 = short, 2 = long) */
200 23, /* bitsize */
201 TRUE, /* pc_relative */
202 0, /* bitpos */
203 complain_overflow_signed,/* complain_on_overflow */
204 bfd_elf_generic_reloc, /* special_function */
205 "R_ARM_THM_PC22", /* name */
206 FALSE, /* partial_inplace */
207 0x07ff07ff, /* src_mask */
208 0x07ff07ff, /* dst_mask */
209 TRUE), /* pcrel_offset */
210
211 HOWTO (R_ARM_THM_PC8, /* type */
212 1, /* rightshift */
213 1, /* size (0 = byte, 1 = short, 2 = long) */
214 8, /* bitsize */
215 TRUE, /* pc_relative */
216 0, /* bitpos */
217 complain_overflow_signed,/* complain_on_overflow */
218 bfd_elf_generic_reloc, /* special_function */
219 "R_ARM_THM_PC8", /* name */
220 FALSE, /* partial_inplace */
221 0x000000ff, /* src_mask */
222 0x000000ff, /* dst_mask */
223 TRUE), /* pcrel_offset */
224
225 HOWTO (R_ARM_AMP_VCALL9, /* type */
226 1, /* rightshift */
227 1, /* size (0 = byte, 1 = short, 2 = long) */
228 8, /* bitsize */
229 TRUE, /* pc_relative */
230 0, /* bitpos */
231 complain_overflow_signed,/* complain_on_overflow */
232 bfd_elf_generic_reloc, /* special_function */
233 "R_ARM_AMP_VCALL9", /* name */
234 FALSE, /* partial_inplace */
235 0x000000ff, /* src_mask */
236 0x000000ff, /* dst_mask */
237 TRUE), /* pcrel_offset */
238
239 HOWTO (R_ARM_SWI24, /* type */
240 0, /* rightshift */
241 0, /* size (0 = byte, 1 = short, 2 = long) */
242 0, /* bitsize */
243 FALSE, /* pc_relative */
244 0, /* bitpos */
245 complain_overflow_signed,/* complain_on_overflow */
246 bfd_elf_generic_reloc, /* special_function */
247 "R_ARM_SWI24", /* name */
248 FALSE, /* partial_inplace */
249 0x00000000, /* src_mask */
250 0x00000000, /* dst_mask */
251 FALSE), /* pcrel_offset */
252
253 HOWTO (R_ARM_THM_SWI8, /* type */
254 0, /* rightshift */
255 0, /* size (0 = byte, 1 = short, 2 = long) */
256 0, /* bitsize */
257 FALSE, /* pc_relative */
258 0, /* bitpos */
259 complain_overflow_signed,/* complain_on_overflow */
260 bfd_elf_generic_reloc, /* special_function */
261 "R_ARM_SWI8", /* name */
262 FALSE, /* partial_inplace */
263 0x00000000, /* src_mask */
264 0x00000000, /* dst_mask */
265 FALSE), /* pcrel_offset */
266
267 /* BLX instruction for the ARM. */
268 HOWTO (R_ARM_XPC25, /* type */
269 2, /* rightshift */
270 2, /* size (0 = byte, 1 = short, 2 = long) */
271 25, /* bitsize */
272 TRUE, /* pc_relative */
273 0, /* bitpos */
274 complain_overflow_signed,/* complain_on_overflow */
275 bfd_elf_generic_reloc, /* special_function */
276 "R_ARM_XPC25", /* name */
277 FALSE, /* partial_inplace */
278 0x00ffffff, /* src_mask */
279 0x00ffffff, /* dst_mask */
280 TRUE), /* pcrel_offset */
281
282 /* BLX instruction for the Thumb. */
283 HOWTO (R_ARM_THM_XPC22, /* type */
284 2, /* rightshift */
285 2, /* size (0 = byte, 1 = short, 2 = long) */
286 22, /* bitsize */
287 TRUE, /* pc_relative */
288 0, /* bitpos */
289 complain_overflow_signed,/* complain_on_overflow */
290 bfd_elf_generic_reloc, /* special_function */
291 "R_ARM_THM_XPC22", /* name */
292 FALSE, /* partial_inplace */
293 0x07ff07ff, /* src_mask */
294 0x07ff07ff, /* dst_mask */
295 TRUE), /* pcrel_offset */
296
297 /* These next three relocs are not defined, but we need to fill the space. */
298
299 HOWTO (R_ARM_NONE, /* type */
300 0, /* rightshift */
301 0, /* size (0 = byte, 1 = short, 2 = long) */
302 0, /* bitsize */
303 FALSE, /* pc_relative */
304 0, /* bitpos */
305 complain_overflow_dont,/* complain_on_overflow */
306 bfd_elf_generic_reloc, /* special_function */
307 "R_ARM_unknown_17", /* name */
308 FALSE, /* partial_inplace */
309 0, /* src_mask */
310 0, /* dst_mask */
311 FALSE), /* pcrel_offset */
312
313 HOWTO (R_ARM_NONE, /* type */
314 0, /* rightshift */
315 0, /* size (0 = byte, 1 = short, 2 = long) */
316 0, /* bitsize */
317 FALSE, /* pc_relative */
318 0, /* bitpos */
319 complain_overflow_dont,/* complain_on_overflow */
320 bfd_elf_generic_reloc, /* special_function */
321 "R_ARM_unknown_18", /* name */
322 FALSE, /* partial_inplace */
323 0, /* src_mask */
324 0, /* dst_mask */
325 FALSE), /* pcrel_offset */
326
327 HOWTO (R_ARM_NONE, /* type */
328 0, /* rightshift */
329 0, /* size (0 = byte, 1 = short, 2 = long) */
330 0, /* bitsize */
331 FALSE, /* pc_relative */
332 0, /* bitpos */
333 complain_overflow_dont,/* complain_on_overflow */
334 bfd_elf_generic_reloc, /* special_function */
335 "R_ARM_unknown_19", /* name */
336 FALSE, /* partial_inplace */
337 0, /* src_mask */
338 0, /* dst_mask */
339 FALSE), /* pcrel_offset */
340
341 /* Relocs used in ARM Linux */
342
343 HOWTO (R_ARM_COPY, /* type */
344 0, /* rightshift */
345 2, /* size (0 = byte, 1 = short, 2 = long) */
346 32, /* bitsize */
347 FALSE, /* pc_relative */
348 0, /* bitpos */
349 complain_overflow_bitfield,/* complain_on_overflow */
350 bfd_elf_generic_reloc, /* special_function */
351 "R_ARM_COPY", /* name */
352 TRUE, /* partial_inplace */
353 0xffffffff, /* src_mask */
354 0xffffffff, /* dst_mask */
355 FALSE), /* pcrel_offset */
356
357 HOWTO (R_ARM_GLOB_DAT, /* type */
358 0, /* rightshift */
359 2, /* size (0 = byte, 1 = short, 2 = long) */
360 32, /* bitsize */
361 FALSE, /* pc_relative */
362 0, /* bitpos */
363 complain_overflow_bitfield,/* complain_on_overflow */
364 bfd_elf_generic_reloc, /* special_function */
365 "R_ARM_GLOB_DAT", /* name */
366 TRUE, /* partial_inplace */
367 0xffffffff, /* src_mask */
368 0xffffffff, /* dst_mask */
369 FALSE), /* pcrel_offset */
370
371 HOWTO (R_ARM_JUMP_SLOT, /* type */
372 0, /* rightshift */
373 2, /* size (0 = byte, 1 = short, 2 = long) */
374 32, /* bitsize */
375 FALSE, /* pc_relative */
376 0, /* bitpos */
377 complain_overflow_bitfield,/* complain_on_overflow */
378 bfd_elf_generic_reloc, /* special_function */
379 "R_ARM_JUMP_SLOT", /* name */
380 TRUE, /* partial_inplace */
381 0xffffffff, /* src_mask */
382 0xffffffff, /* dst_mask */
383 FALSE), /* pcrel_offset */
384
385 HOWTO (R_ARM_RELATIVE, /* type */
386 0, /* rightshift */
387 2, /* size (0 = byte, 1 = short, 2 = long) */
388 32, /* bitsize */
389 FALSE, /* pc_relative */
390 0, /* bitpos */
391 complain_overflow_bitfield,/* complain_on_overflow */
392 bfd_elf_generic_reloc, /* special_function */
393 "R_ARM_RELATIVE", /* name */
394 TRUE, /* partial_inplace */
395 0xffffffff, /* src_mask */
396 0xffffffff, /* dst_mask */
397 FALSE), /* pcrel_offset */
398
399 HOWTO (R_ARM_GOTOFF, /* type */
400 0, /* rightshift */
401 2, /* size (0 = byte, 1 = short, 2 = long) */
402 32, /* bitsize */
403 FALSE, /* pc_relative */
404 0, /* bitpos */
405 complain_overflow_bitfield,/* complain_on_overflow */
406 bfd_elf_generic_reloc, /* special_function */
407 "R_ARM_GOTOFF", /* name */
408 TRUE, /* partial_inplace */
409 0xffffffff, /* src_mask */
410 0xffffffff, /* dst_mask */
411 FALSE), /* pcrel_offset */
412
413 HOWTO (R_ARM_GOTPC, /* type */
414 0, /* rightshift */
415 2, /* size (0 = byte, 1 = short, 2 = long) */
416 32, /* bitsize */
417 TRUE, /* pc_relative */
418 0, /* bitpos */
419 complain_overflow_bitfield,/* complain_on_overflow */
420 bfd_elf_generic_reloc, /* special_function */
421 "R_ARM_GOTPC", /* name */
422 TRUE, /* partial_inplace */
423 0xffffffff, /* src_mask */
424 0xffffffff, /* dst_mask */
425 TRUE), /* pcrel_offset */
426
427 HOWTO (R_ARM_GOT32, /* type */
428 0, /* rightshift */
429 2, /* size (0 = byte, 1 = short, 2 = long) */
430 32, /* bitsize */
431 FALSE, /* pc_relative */
432 0, /* bitpos */
433 complain_overflow_bitfield,/* complain_on_overflow */
434 bfd_elf_generic_reloc, /* special_function */
435 "R_ARM_GOT32", /* name */
436 TRUE, /* partial_inplace */
437 0xffffffff, /* src_mask */
438 0xffffffff, /* dst_mask */
439 FALSE), /* pcrel_offset */
440
441 HOWTO (R_ARM_PLT32, /* type */
442 2, /* rightshift */
443 2, /* size (0 = byte, 1 = short, 2 = long) */
444 26, /* bitsize */
445 TRUE, /* pc_relative */
446 0, /* bitpos */
447 complain_overflow_bitfield,/* complain_on_overflow */
448 bfd_elf_generic_reloc, /* special_function */
449 "R_ARM_PLT32", /* name */
450 TRUE, /* partial_inplace */
451 0x00ffffff, /* src_mask */
452 0x00ffffff, /* dst_mask */
453 TRUE), /* pcrel_offset */
454
455 HOWTO (R_ARM_CALL, /* type */
456 2, /* rightshift */
457 2, /* size (0 = byte, 1 = short, 2 = long) */
458 24, /* bitsize */
459 TRUE, /* pc_relative */
460 0, /* bitpos */
461 complain_overflow_signed,/* complain_on_overflow */
462 bfd_elf_generic_reloc, /* special_function */
463 "R_ARM_CALL", /* name */
464 FALSE, /* partial_inplace */
465 0x00ffffff, /* src_mask */
466 0x00ffffff, /* dst_mask */
467 TRUE), /* pcrel_offset */
468
469 HOWTO (R_ARM_JUMP24, /* type */
470 2, /* rightshift */
471 2, /* size (0 = byte, 1 = short, 2 = long) */
472 24, /* bitsize */
473 TRUE, /* pc_relative */
474 0, /* bitpos */
475 complain_overflow_signed,/* complain_on_overflow */
476 bfd_elf_generic_reloc, /* special_function */
477 "R_ARM_JUMP24", /* name */
478 FALSE, /* partial_inplace */
479 0x00ffffff, /* src_mask */
480 0x00ffffff, /* dst_mask */
481 TRUE), /* pcrel_offset */
482
483 HOWTO (R_ARM_NONE, /* type */
484 0, /* rightshift */
485 0, /* size (0 = byte, 1 = short, 2 = long) */
486 0, /* bitsize */
487 FALSE, /* pc_relative */
488 0, /* bitpos */
489 complain_overflow_dont,/* complain_on_overflow */
490 bfd_elf_generic_reloc, /* special_function */
491 "R_ARM_unknown_30", /* name */
492 FALSE, /* partial_inplace */
493 0, /* src_mask */
494 0, /* dst_mask */
495 FALSE), /* pcrel_offset */
496
497 HOWTO (R_ARM_NONE, /* type */
498 0, /* rightshift */
499 0, /* size (0 = byte, 1 = short, 2 = long) */
500 0, /* bitsize */
501 FALSE, /* pc_relative */
502 0, /* bitpos */
503 complain_overflow_dont,/* complain_on_overflow */
504 bfd_elf_generic_reloc, /* special_function */
505 "R_ARM_unknown_31", /* name */
506 FALSE, /* partial_inplace */
507 0, /* src_mask */
508 0, /* dst_mask */
509 FALSE), /* pcrel_offset */
510
511 HOWTO (R_ARM_ALU_PCREL7_0, /* type */
512 0, /* rightshift */
513 2, /* size (0 = byte, 1 = short, 2 = long) */
514 12, /* bitsize */
515 TRUE, /* pc_relative */
516 0, /* bitpos */
517 complain_overflow_dont,/* complain_on_overflow */
518 bfd_elf_generic_reloc, /* special_function */
519 "R_ARM_ALU_PCREL_7_0", /* name */
520 FALSE, /* partial_inplace */
521 0x00000fff, /* src_mask */
522 0x00000fff, /* dst_mask */
523 TRUE), /* pcrel_offset */
524
525 HOWTO (R_ARM_ALU_PCREL15_8, /* type */
526 0, /* rightshift */
527 2, /* size (0 = byte, 1 = short, 2 = long) */
528 12, /* bitsize */
529 TRUE, /* pc_relative */
530 8, /* bitpos */
531 complain_overflow_dont,/* complain_on_overflow */
532 bfd_elf_generic_reloc, /* special_function */
533 "R_ARM_ALU_PCREL_15_8",/* name */
534 FALSE, /* partial_inplace */
535 0x00000fff, /* src_mask */
536 0x00000fff, /* dst_mask */
537 TRUE), /* pcrel_offset */
538
539 HOWTO (R_ARM_ALU_PCREL23_15, /* type */
540 0, /* rightshift */
541 2, /* size (0 = byte, 1 = short, 2 = long) */
542 12, /* bitsize */
543 TRUE, /* pc_relative */
544 16, /* bitpos */
545 complain_overflow_dont,/* complain_on_overflow */
546 bfd_elf_generic_reloc, /* special_function */
547 "R_ARM_ALU_PCREL_23_15",/* name */
548 FALSE, /* partial_inplace */
549 0x00000fff, /* src_mask */
550 0x00000fff, /* dst_mask */
551 TRUE), /* pcrel_offset */
552
553 HOWTO (R_ARM_LDR_SBREL_11_0, /* type */
554 0, /* rightshift */
555 2, /* size (0 = byte, 1 = short, 2 = long) */
556 12, /* bitsize */
557 FALSE, /* pc_relative */
558 0, /* bitpos */
559 complain_overflow_dont,/* complain_on_overflow */
560 bfd_elf_generic_reloc, /* special_function */
561 "R_ARM_LDR_SBREL_11_0",/* name */
562 FALSE, /* partial_inplace */
563 0x00000fff, /* src_mask */
564 0x00000fff, /* dst_mask */
565 FALSE), /* pcrel_offset */
566
567 HOWTO (R_ARM_ALU_SBREL_19_12, /* type */
568 0, /* rightshift */
569 2, /* size (0 = byte, 1 = short, 2 = long) */
570 8, /* bitsize */
571 FALSE, /* pc_relative */
572 12, /* bitpos */
573 complain_overflow_dont,/* complain_on_overflow */
574 bfd_elf_generic_reloc, /* special_function */
575 "R_ARM_ALU_SBREL_19_12",/* name */
576 FALSE, /* partial_inplace */
577 0x000ff000, /* src_mask */
578 0x000ff000, /* dst_mask */
579 FALSE), /* pcrel_offset */
580
581 HOWTO (R_ARM_ALU_SBREL_27_20, /* type */
582 0, /* rightshift */
583 2, /* size (0 = byte, 1 = short, 2 = long) */
584 8, /* bitsize */
585 FALSE, /* pc_relative */
586 20, /* bitpos */
587 complain_overflow_dont,/* complain_on_overflow */
588 bfd_elf_generic_reloc, /* special_function */
589 "R_ARM_ALU_SBREL_27_20",/* name */
590 FALSE, /* partial_inplace */
591 0x0ff00000, /* src_mask */
592 0x0ff00000, /* dst_mask */
593 FALSE), /* pcrel_offset */
594
595 HOWTO (R_ARM_TARGET1, /* type */
596 0, /* rightshift */
597 2, /* size (0 = byte, 1 = short, 2 = long) */
598 32, /* bitsize */
599 FALSE, /* pc_relative */
600 0, /* bitpos */
601 complain_overflow_dont,/* complain_on_overflow */
602 bfd_elf_generic_reloc, /* special_function */
603 "R_ARM_TARGET1", /* name */
604 FALSE, /* partial_inplace */
605 0xffffffff, /* src_mask */
606 0xffffffff, /* dst_mask */
607 FALSE), /* pcrel_offset */
608
609 HOWTO (R_ARM_ROSEGREL32, /* type */
610 0, /* rightshift */
611 2, /* size (0 = byte, 1 = short, 2 = long) */
612 32, /* bitsize */
613 FALSE, /* pc_relative */
614 0, /* bitpos */
615 complain_overflow_dont,/* complain_on_overflow */
616 bfd_elf_generic_reloc, /* special_function */
617 "R_ARM_ROSEGREL32", /* name */
618 FALSE, /* partial_inplace */
619 0xffffffff, /* src_mask */
620 0xffffffff, /* dst_mask */
621 FALSE), /* pcrel_offset */
622
623 HOWTO (R_ARM_V4BX, /* type */
624 0, /* rightshift */
625 2, /* size (0 = byte, 1 = short, 2 = long) */
626 32, /* bitsize */
627 FALSE, /* pc_relative */
628 0, /* bitpos */
629 complain_overflow_dont,/* complain_on_overflow */
630 bfd_elf_generic_reloc, /* special_function */
631 "R_ARM_V4BX", /* name */
632 FALSE, /* partial_inplace */
633 0xffffffff, /* src_mask */
634 0xffffffff, /* dst_mask */
635 FALSE), /* pcrel_offset */
636
637 HOWTO (R_ARM_TARGET2, /* type */
638 0, /* rightshift */
639 2, /* size (0 = byte, 1 = short, 2 = long) */
640 32, /* bitsize */
641 FALSE, /* pc_relative */
642 0, /* bitpos */
643 complain_overflow_signed,/* complain_on_overflow */
644 bfd_elf_generic_reloc, /* special_function */
645 "R_ARM_TARGET2", /* name */
646 FALSE, /* partial_inplace */
647 0xffffffff, /* src_mask */
648 0xffffffff, /* dst_mask */
649 TRUE), /* pcrel_offset */
650
651 HOWTO (R_ARM_PREL31, /* type */
652 0, /* rightshift */
653 2, /* size (0 = byte, 1 = short, 2 = long) */
654 31, /* bitsize */
655 TRUE, /* pc_relative */
656 0, /* bitpos */
657 complain_overflow_signed,/* complain_on_overflow */
658 bfd_elf_generic_reloc, /* special_function */
659 "R_ARM_PREL31", /* name */
660 FALSE, /* partial_inplace */
661 0x7fffffff, /* src_mask */
662 0x7fffffff, /* dst_mask */
663 TRUE), /* pcrel_offset */
664};
665
666 /* GNU extension to record C++ vtable hierarchy */
667static reloc_howto_type elf32_arm_vtinherit_howto =
668 HOWTO (R_ARM_GNU_VTINHERIT, /* type */
669 0, /* rightshift */
670 2, /* size (0 = byte, 1 = short, 2 = long) */
671 0, /* bitsize */
672 FALSE, /* pc_relative */
673 0, /* bitpos */
674 complain_overflow_dont, /* complain_on_overflow */
675 NULL, /* special_function */
676 "R_ARM_GNU_VTINHERIT", /* name */
677 FALSE, /* partial_inplace */
678 0, /* src_mask */
679 0, /* dst_mask */
680 FALSE); /* pcrel_offset */
681
682 /* GNU extension to record C++ vtable member usage */
683static reloc_howto_type elf32_arm_vtentry_howto =
684 HOWTO (R_ARM_GNU_VTENTRY, /* type */
685 0, /* rightshift */
686 2, /* size (0 = byte, 1 = short, 2 = long) */
687 0, /* bitsize */
688 FALSE, /* pc_relative */
689 0, /* bitpos */
690 complain_overflow_dont, /* complain_on_overflow */
691 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
692 "R_ARM_GNU_VTENTRY", /* name */
693 FALSE, /* partial_inplace */
694 0, /* src_mask */
695 0, /* dst_mask */
696 FALSE); /* pcrel_offset */
697
698 /* 12 bit pc relative */
699static reloc_howto_type elf32_arm_thm_pc11_howto =
700 HOWTO (R_ARM_THM_PC11, /* type */
701 1, /* rightshift */
702 1, /* size (0 = byte, 1 = short, 2 = long) */
703 11, /* bitsize */
704 TRUE, /* pc_relative */
705 0, /* bitpos */
706 complain_overflow_signed, /* complain_on_overflow */
707 bfd_elf_generic_reloc, /* special_function */
708 "R_ARM_THM_PC11", /* name */
709 FALSE, /* partial_inplace */
710 0x000007ff, /* src_mask */
711 0x000007ff, /* dst_mask */
712 TRUE); /* pcrel_offset */
713
714 /* 12 bit pc relative */
715static reloc_howto_type elf32_arm_thm_pc9_howto =
716 HOWTO (R_ARM_THM_PC9, /* type */
717 1, /* rightshift */
718 1, /* size (0 = byte, 1 = short, 2 = long) */
719 8, /* bitsize */
720 TRUE, /* pc_relative */
721 0, /* bitpos */
722 complain_overflow_signed, /* complain_on_overflow */
723 bfd_elf_generic_reloc, /* special_function */
724 "R_ARM_THM_PC9", /* name */
725 FALSE, /* partial_inplace */
726 0x000000ff, /* src_mask */
727 0x000000ff, /* dst_mask */
728 TRUE); /* pcrel_offset */
729
730/* Place relative GOT-indirect. */
731static reloc_howto_type elf32_arm_got_prel =
732 HOWTO (R_ARM_GOT_PREL, /* type */
733 0, /* rightshift */
734 2, /* size (0 = byte, 1 = short, 2 = long) */
735 32, /* bitsize */
736 TRUE, /* pc_relative */
737 0, /* bitpos */
738 complain_overflow_dont, /* complain_on_overflow */
739 bfd_elf_generic_reloc, /* special_function */
740 "R_ARM_GOT_PREL", /* name */
741 FALSE, /* partial_inplace */
742 0xffffffff, /* src_mask */
743 0xffffffff, /* dst_mask */
744 TRUE); /* pcrel_offset */
745
746/* Currently unused relocations. */
747static reloc_howto_type elf32_arm_r_howto[4] =
748{
749 HOWTO (R_ARM_RREL32, /* type */
750 0, /* rightshift */
751 0, /* size (0 = byte, 1 = short, 2 = long) */
752 0, /* bitsize */
753 FALSE, /* pc_relative */
754 0, /* bitpos */
755 complain_overflow_dont,/* complain_on_overflow */
756 bfd_elf_generic_reloc, /* special_function */
757 "R_ARM_RREL32", /* name */
758 FALSE, /* partial_inplace */
759 0, /* src_mask */
760 0, /* dst_mask */
761 FALSE), /* pcrel_offset */
762
763 HOWTO (R_ARM_RABS32, /* type */
764 0, /* rightshift */
765 0, /* size (0 = byte, 1 = short, 2 = long) */
766 0, /* bitsize */
767 FALSE, /* pc_relative */
768 0, /* bitpos */
769 complain_overflow_dont,/* complain_on_overflow */
770 bfd_elf_generic_reloc, /* special_function */
771 "R_ARM_RABS32", /* name */
772 FALSE, /* partial_inplace */
773 0, /* src_mask */
774 0, /* dst_mask */
775 FALSE), /* pcrel_offset */
776
777 HOWTO (R_ARM_RPC24, /* type */
778 0, /* rightshift */
779 0, /* size (0 = byte, 1 = short, 2 = long) */
780 0, /* bitsize */
781 FALSE, /* pc_relative */
782 0, /* bitpos */
783 complain_overflow_dont,/* complain_on_overflow */
784 bfd_elf_generic_reloc, /* special_function */
785 "R_ARM_RPC24", /* name */
786 FALSE, /* partial_inplace */
787 0, /* src_mask */
788 0, /* dst_mask */
789 FALSE), /* pcrel_offset */
790
791 HOWTO (R_ARM_RBASE, /* type */
792 0, /* rightshift */
793 0, /* size (0 = byte, 1 = short, 2 = long) */
794 0, /* bitsize */
795 FALSE, /* pc_relative */
796 0, /* bitpos */
797 complain_overflow_dont,/* complain_on_overflow */
798 bfd_elf_generic_reloc, /* special_function */
799 "R_ARM_RBASE", /* name */
800 FALSE, /* partial_inplace */
801 0, /* src_mask */
802 0, /* dst_mask */
803 FALSE) /* pcrel_offset */
804};
805
806static reloc_howto_type *
807elf32_arm_howto_from_type (unsigned int r_type)
808{
809 if (r_type < NUM_ELEM (elf32_arm_howto_table))
810 return &elf32_arm_howto_table[r_type];
811
812 switch (r_type)
813 {
814 case R_ARM_GOT_PREL:
815 return &elf32_arm_got_prel;
816
817 case R_ARM_GNU_VTINHERIT:
818 return &elf32_arm_vtinherit_howto;
819
820 case R_ARM_GNU_VTENTRY:
821 return &elf32_arm_vtentry_howto;
822
823 case R_ARM_THM_PC11:
824 return &elf32_arm_thm_pc11_howto;
825
826 case R_ARM_THM_PC9:
827 return &elf32_arm_thm_pc9_howto;
828
829 case R_ARM_RREL32:
830 case R_ARM_RABS32:
831 case R_ARM_RPC24:
832 case R_ARM_RBASE:
833 return &elf32_arm_r_howto[r_type - R_ARM_RREL32];
834
835 default:
836 return NULL;
837 }
838}
839
840static void
841elf32_arm_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED, arelent * bfd_reloc,
842 Elf_Internal_Rela * elf_reloc)
843{
844 unsigned int r_type;
845
846 r_type = ELF32_R_TYPE (elf_reloc->r_info);
847 bfd_reloc->howto = elf32_arm_howto_from_type (r_type);
848}
849
850struct elf32_arm_reloc_map
851 {
852 bfd_reloc_code_real_type bfd_reloc_val;
853 unsigned char elf_reloc_val;
854 };
855
856/* All entries in this list must also be present in elf32_arm_howto_table. */
857static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
858 {
859 {BFD_RELOC_NONE, R_ARM_NONE},
860 {BFD_RELOC_ARM_PCREL_BRANCH, R_ARM_PC24},
861 {BFD_RELOC_ARM_PCREL_BLX, R_ARM_XPC25},
862 {BFD_RELOC_THUMB_PCREL_BLX, R_ARM_THM_XPC22},
863 {BFD_RELOC_32, R_ARM_ABS32},
864 {BFD_RELOC_32_PCREL, R_ARM_REL32},
865 {BFD_RELOC_8, R_ARM_ABS8},
866 {BFD_RELOC_16, R_ARM_ABS16},
867 {BFD_RELOC_ARM_OFFSET_IMM, R_ARM_ABS12},
868 {BFD_RELOC_ARM_THUMB_OFFSET, R_ARM_THM_ABS5},
869 {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_PC22},
870 {BFD_RELOC_ARM_COPY, R_ARM_COPY},
871 {BFD_RELOC_ARM_GLOB_DAT, R_ARM_GLOB_DAT},
872 {BFD_RELOC_ARM_JUMP_SLOT, R_ARM_JUMP_SLOT},
873 {BFD_RELOC_ARM_RELATIVE, R_ARM_RELATIVE},
874 {BFD_RELOC_ARM_GOTOFF, R_ARM_GOTOFF},
875 {BFD_RELOC_ARM_GOTPC, R_ARM_GOTPC},
876 {BFD_RELOC_ARM_GOT32, R_ARM_GOT32},
877 {BFD_RELOC_ARM_PLT32, R_ARM_PLT32},
878 {BFD_RELOC_ARM_TARGET1, R_ARM_TARGET1},
879 {BFD_RELOC_ARM_ROSEGREL32, R_ARM_ROSEGREL32},
880 {BFD_RELOC_ARM_SBREL32, R_ARM_SBREL32},
881 {BFD_RELOC_ARM_PREL31, R_ARM_PREL31},
882 {BFD_RELOC_ARM_TARGET2, R_ARM_TARGET2}
883 };
884
885static reloc_howto_type *
886elf32_arm_reloc_type_lookup (abfd, code)
887 bfd *abfd ATTRIBUTE_UNUSED;
888 bfd_reloc_code_real_type code;
889{
890 unsigned int i;
891
892 switch (code)
893 {
894 case BFD_RELOC_VTABLE_INHERIT:
895 return & elf32_arm_vtinherit_howto;
896
897 case BFD_RELOC_VTABLE_ENTRY:
898 return & elf32_arm_vtentry_howto;
899
900 case BFD_RELOC_THUMB_PCREL_BRANCH12:
901 return & elf32_arm_thm_pc11_howto;
902
903 case BFD_RELOC_THUMB_PCREL_BRANCH9:
904 return & elf32_arm_thm_pc9_howto;
905
906 default:
907 for (i = 0; i < NUM_ELEM (elf32_arm_reloc_map); i ++)
908 if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
909 return & elf32_arm_howto_table[elf32_arm_reloc_map[i].elf_reloc_val];
910
911 return NULL;
912 }
913}
914
915/* Support for core dump NOTE sections */
916static bfd_boolean
917elf32_arm_nabi_grok_prstatus (abfd, note)
918 bfd *abfd;
919 Elf_Internal_Note *note;
920{
921 int offset;
922 size_t size;
923
924 switch (note->descsz)
925 {
926 default:
927 return FALSE;
928
929 case 148: /* Linux/ARM 32-bit*/
930 /* pr_cursig */
931 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
932
933 /* pr_pid */
934 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
935
936 /* pr_reg */
937 offset = 72;
938 size = 72;
939
940 break;
941 }
942
943 /* Make a ".reg/999" section. */
944 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
945 size, note->descpos + offset);
946}
947
948static bfd_boolean
949elf32_arm_nabi_grok_psinfo (abfd, note)
950 bfd *abfd;
951 Elf_Internal_Note *note;
952{
953 switch (note->descsz)
954 {
955 default:
956 return FALSE;
957
958 case 124: /* Linux/ARM elf_prpsinfo */
959 elf_tdata (abfd)->core_program
960 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
961 elf_tdata (abfd)->core_command
962 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
963 }
964
965 /* Note that for some reason, a spurious space is tacked
966 onto the end of the args in some (at least one anyway)
967 implementations, so strip it off if it exists. */
968
969 {
970 char *command = elf_tdata (abfd)->core_command;
971 int n = strlen (command);
972
973 if (0 < n && command[n - 1] == ' ')
974 command[n - 1] = '\0';
975 }
976
977 return TRUE;
978}
979
980#define TARGET_LITTLE_SYM bfd_elf32_littlearm_vec
981#define TARGET_LITTLE_NAME "elf32-littlearm"
982#define TARGET_BIG_SYM bfd_elf32_bigarm_vec
983#define TARGET_BIG_NAME "elf32-bigarm"
984
985#define elf_backend_grok_prstatus elf32_arm_nabi_grok_prstatus
986#define elf_backend_grok_psinfo elf32_arm_nabi_grok_psinfo
987
252b5132
RH
988typedef unsigned long int insn32;
989typedef unsigned short int insn16;
990
8cb51566 991/* In lieu of proper flags, assume all EABIv4 objects are interworkable. */
57e8b36a 992#define INTERWORK_FLAG(abfd) \
8cb51566 993 (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) == EF_ARM_EABI_VER4 \
85a84e7a 994 || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK))
9b485d32 995
252b5132
RH
996/* The linker script knows the section names for placement.
997 The entry_names are used to do simple name mangling on the stubs.
998 Given a function name, and its type, the stub can be found. The
9b485d32 999 name can be changed. The only requirement is the %s be present. */
252b5132
RH
1000#define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
1001#define THUMB2ARM_GLUE_ENTRY_NAME "__%s_from_thumb"
1002
1003#define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
1004#define ARM2THUMB_GLUE_ENTRY_NAME "__%s_from_arm"
1005
1006/* The name of the dynamic interpreter. This is put in the .interp
1007 section. */
1008#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
1009
5e681ec4
PB
1010#ifdef FOUR_WORD_PLT
1011
252b5132
RH
1012/* The first entry in a procedure linkage table looks like
1013 this. It is set up so that any shared library function that is
59f2c4e7 1014 called before the relocation has been set up calls the dynamic
9b485d32 1015 linker first. */
e5a52504 1016static const bfd_vma elf32_arm_plt0_entry [] =
5e681ec4
PB
1017 {
1018 0xe52de004, /* str lr, [sp, #-4]! */
1019 0xe59fe010, /* ldr lr, [pc, #16] */
1020 0xe08fe00e, /* add lr, pc, lr */
1021 0xe5bef008, /* ldr pc, [lr, #8]! */
1022 };
1023
1024/* Subsequent entries in a procedure linkage table look like
1025 this. */
e5a52504 1026static const bfd_vma elf32_arm_plt_entry [] =
5e681ec4
PB
1027 {
1028 0xe28fc600, /* add ip, pc, #NN */
1029 0xe28cca00, /* add ip, ip, #NN */
1030 0xe5bcf000, /* ldr pc, [ip, #NN]! */
1031 0x00000000, /* unused */
1032 };
1033
1034#else
1035
5e681ec4
PB
1036/* The first entry in a procedure linkage table looks like
1037 this. It is set up so that any shared library function that is
1038 called before the relocation has been set up calls the dynamic
1039 linker first. */
e5a52504 1040static const bfd_vma elf32_arm_plt0_entry [] =
917583ad 1041 {
5e681ec4
PB
1042 0xe52de004, /* str lr, [sp, #-4]! */
1043 0xe59fe004, /* ldr lr, [pc, #4] */
1044 0xe08fe00e, /* add lr, pc, lr */
1045 0xe5bef008, /* ldr pc, [lr, #8]! */
1046 0x00000000, /* &GOT[0] - . */
917583ad 1047 };
252b5132
RH
1048
1049/* Subsequent entries in a procedure linkage table look like
1050 this. */
e5a52504 1051static const bfd_vma elf32_arm_plt_entry [] =
5e681ec4
PB
1052 {
1053 0xe28fc600, /* add ip, pc, #0xNN00000 */
1054 0xe28cca00, /* add ip, ip, #0xNN000 */
1055 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */
1056 };
1057
1058#endif
252b5132 1059
b7693d02
DJ
1060/* An initial stub used if the PLT entry is referenced from Thumb code. */
1061#define PLT_THUMB_STUB_SIZE 4
1062static const bfd_vma elf32_arm_plt_thumb_stub [] =
1063 {
1064 0x4778, /* bx pc */
1065 0x46c0 /* nop */
1066 };
1067
e5a52504
MM
1068/* The entries in a PLT when using a DLL-based target with multiple
1069 address spaces. */
1070static const bfd_vma elf32_arm_symbian_plt_entry [] =
1071 {
83a358aa 1072 0xe51ff004, /* ldr pc, [pc, #-4] */
e5a52504
MM
1073 0x00000000, /* dcd R_ARM_GLOB_DAT(X) */
1074 };
1075
e489d0ae
PB
1076/* Used to build a map of a section. This is required for mixed-endian
1077 code/data. */
1078
1079typedef struct elf32_elf_section_map
1080{
1081 bfd_vma vma;
1082 char type;
1083}
1084elf32_arm_section_map;
1085
1086struct _arm_elf_section_data
1087{
1088 struct bfd_elf_section_data elf;
1089 int mapcount;
1090 elf32_arm_section_map *map;
1091};
1092
1093#define elf32_arm_section_data(sec) \
1094 ((struct _arm_elf_section_data *) elf_section_data (sec))
1095
252b5132
RH
1096/* The ARM linker needs to keep track of the number of relocs that it
1097 decides to copy in check_relocs for each symbol. This is so that
1098 it can discard PC relative relocs if it doesn't need them when
1099 linking with -Bsymbolic. We store the information in a field
1100 extending the regular ELF linker hash table. */
1101
1102/* This structure keeps track of the number of PC relative relocs we
1103 have copied for a given symbol. */
5e681ec4 1104struct elf32_arm_relocs_copied
917583ad
NC
1105 {
1106 /* Next section. */
5e681ec4 1107 struct elf32_arm_relocs_copied * next;
917583ad
NC
1108 /* A section in dynobj. */
1109 asection * section;
1110 /* Number of relocs copied in this section. */
1111 bfd_size_type count;
1112 };
252b5132 1113
ba96a88f 1114/* Arm ELF linker hash entry. */
252b5132 1115struct elf32_arm_link_hash_entry
917583ad
NC
1116 {
1117 struct elf_link_hash_entry root;
252b5132 1118
917583ad 1119 /* Number of PC relative relocs copied for this symbol. */
5e681ec4 1120 struct elf32_arm_relocs_copied * relocs_copied;
b7693d02
DJ
1121
1122 /* We reference count Thumb references to a PLT entry separately,
1123 so that we can emit the Thumb trampoline only if needed. */
1124 bfd_signed_vma plt_thumb_refcount;
1125
1126 /* Since PLT entries have variable size if the Thumb prologue is
1127 used, we need to record the index into .got.plt instead of
1128 recomputing it from the PLT offset. */
1129 bfd_signed_vma plt_got_offset;
917583ad 1130 };
252b5132 1131
252b5132 1132/* Traverse an arm ELF linker hash table. */
252b5132
RH
1133#define elf32_arm_link_hash_traverse(table, func, info) \
1134 (elf_link_hash_traverse \
1135 (&(table)->root, \
b7693d02 1136 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
252b5132
RH
1137 (info)))
1138
1139/* Get the ARM elf linker hash table from a link_info structure. */
1140#define elf32_arm_hash_table(info) \
1141 ((struct elf32_arm_link_hash_table *) ((info)->hash))
1142
9b485d32 1143/* ARM ELF linker hash table. */
252b5132 1144struct elf32_arm_link_hash_table
917583ad
NC
1145 {
1146 /* The main hash table. */
1147 struct elf_link_hash_table root;
252b5132 1148
4cc11e76 1149 /* The size in bytes of the section containing the Thumb-to-ARM glue. */
dc810e39 1150 bfd_size_type thumb_glue_size;
252b5132 1151
4cc11e76 1152 /* The size in bytes of the section containing the ARM-to-Thumb glue. */
dc810e39 1153 bfd_size_type arm_glue_size;
252b5132 1154
4cc11e76 1155 /* An arbitrary input BFD chosen to hold the glue sections. */
917583ad 1156 bfd * bfd_of_glue_owner;
ba96a88f 1157
e489d0ae
PB
1158 /* Nonzero to output a BE8 image. */
1159 int byteswap_code;
1160
9c504268
PB
1161 /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
1162 Nonzero if R_ARM_TARGET1 means R_ARM_ABS32. */
1163 int target1_is_rel;
1164
eb043451
PB
1165 /* The relocation to use for R_ARM_TARGET2 relocations. */
1166 int target2_reloc;
1167
319850b4
JB
1168 /* Nonzero to fix BX instructions for ARMv4 targets. */
1169 int fix_v4bx;
1170
e5a52504
MM
1171 /* The number of bytes in the initial entry in the PLT. */
1172 bfd_size_type plt_header_size;
1173
1174 /* The number of bytes in the subsequent PLT etries. */
1175 bfd_size_type plt_entry_size;
1176
1177 /* True if the target system is Symbian OS. */
1178 int symbian_p;
1179
4e7fd91e
PB
1180 /* True if the target uses REL relocations. */
1181 int use_rel;
1182
5e681ec4
PB
1183 /* Short-cuts to get to dynamic linker sections. */
1184 asection *sgot;
1185 asection *sgotplt;
1186 asection *srelgot;
1187 asection *splt;
1188 asection *srelplt;
1189 asection *sdynbss;
1190 asection *srelbss;
1191
1192 /* Small local sym to section mapping cache. */
1193 struct sym_sec_cache sym_sec;
b7693d02
DJ
1194
1195 /* For convenience in allocate_dynrelocs. */
1196 bfd * obfd;
917583ad 1197 };
252b5132 1198
780a67af
NC
1199/* Create an entry in an ARM ELF linker hash table. */
1200
1201static struct bfd_hash_entry *
57e8b36a
NC
1202elf32_arm_link_hash_newfunc (struct bfd_hash_entry * entry,
1203 struct bfd_hash_table * table,
1204 const char * string)
780a67af
NC
1205{
1206 struct elf32_arm_link_hash_entry * ret =
1207 (struct elf32_arm_link_hash_entry *) entry;
1208
1209 /* Allocate the structure if it has not already been allocated by a
1210 subclass. */
1211 if (ret == (struct elf32_arm_link_hash_entry *) NULL)
57e8b36a
NC
1212 ret = bfd_hash_allocate (table, sizeof (struct elf32_arm_link_hash_entry));
1213 if (ret == NULL)
780a67af
NC
1214 return (struct bfd_hash_entry *) ret;
1215
1216 /* Call the allocation method of the superclass. */
1217 ret = ((struct elf32_arm_link_hash_entry *)
1218 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1219 table, string));
57e8b36a 1220 if (ret != NULL)
b7693d02
DJ
1221 {
1222 ret->relocs_copied = NULL;
1223 ret->plt_thumb_refcount = 0;
1224 ret->plt_got_offset = -1;
1225 }
780a67af
NC
1226
1227 return (struct bfd_hash_entry *) ret;
1228}
1229
5e681ec4
PB
1230/* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up
1231 shortcuts to them in our hash table. */
1232
1233static bfd_boolean
57e8b36a 1234create_got_section (bfd *dynobj, struct bfd_link_info *info)
5e681ec4
PB
1235{
1236 struct elf32_arm_link_hash_table *htab;
1237
e5a52504
MM
1238 htab = elf32_arm_hash_table (info);
1239 /* BPABI objects never have a GOT, or associated sections. */
1240 if (htab->symbian_p)
1241 return TRUE;
1242
5e681ec4
PB
1243 if (! _bfd_elf_create_got_section (dynobj, info))
1244 return FALSE;
1245
5e681ec4
PB
1246 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
1247 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
1248 if (!htab->sgot || !htab->sgotplt)
1249 abort ();
1250
1251 htab->srelgot = bfd_make_section (dynobj, ".rel.got");
1252 if (htab->srelgot == NULL
1253 || ! bfd_set_section_flags (dynobj, htab->srelgot,
1254 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1255 | SEC_IN_MEMORY | SEC_LINKER_CREATED
1256 | SEC_READONLY))
1257 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
1258 return FALSE;
1259 return TRUE;
1260}
1261
1262/* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
1263 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
1264 hash table. */
1265
1266static bfd_boolean
57e8b36a 1267elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
5e681ec4
PB
1268{
1269 struct elf32_arm_link_hash_table *htab;
1270
1271 htab = elf32_arm_hash_table (info);
1272 if (!htab->sgot && !create_got_section (dynobj, info))
1273 return FALSE;
1274
1275 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1276 return FALSE;
1277
1278 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
1279 htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt");
1280 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
1281 if (!info->shared)
1282 htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss");
1283
e5a52504
MM
1284 if (!htab->splt
1285 || !htab->srelplt
1286 || !htab->sdynbss
5e681ec4
PB
1287 || (!info->shared && !htab->srelbss))
1288 abort ();
1289
1290 return TRUE;
1291}
1292
1293/* Copy the extra info we tack onto an elf_link_hash_entry. */
1294
1295static void
1296elf32_arm_copy_indirect_symbol (const struct elf_backend_data *bed,
1297 struct elf_link_hash_entry *dir,
1298 struct elf_link_hash_entry *ind)
1299{
1300 struct elf32_arm_link_hash_entry *edir, *eind;
1301
1302 edir = (struct elf32_arm_link_hash_entry *) dir;
1303 eind = (struct elf32_arm_link_hash_entry *) ind;
1304
1305 if (eind->relocs_copied != NULL)
1306 {
1307 if (edir->relocs_copied != NULL)
1308 {
1309 struct elf32_arm_relocs_copied **pp;
1310 struct elf32_arm_relocs_copied *p;
1311
1312 if (ind->root.type == bfd_link_hash_indirect)
1313 abort ();
1314
1315 /* Add reloc counts against the weak sym to the strong sym
1316 list. Merge any entries against the same section. */
1317 for (pp = &eind->relocs_copied; (p = *pp) != NULL; )
1318 {
1319 struct elf32_arm_relocs_copied *q;
1320
1321 for (q = edir->relocs_copied; q != NULL; q = q->next)
1322 if (q->section == p->section)
1323 {
5e681ec4
PB
1324 q->count += p->count;
1325 *pp = p->next;
1326 break;
1327 }
1328 if (q == NULL)
1329 pp = &p->next;
1330 }
1331 *pp = edir->relocs_copied;
1332 }
1333
1334 edir->relocs_copied = eind->relocs_copied;
1335 eind->relocs_copied = NULL;
1336 }
1337
b7693d02
DJ
1338 /* If the direct symbol already has an associated PLT entry, the
1339 indirect symbol should not. If it doesn't, swap refcount information
1340 from the indirect symbol. */
1341 if (edir->plt_thumb_refcount == 0)
1342 {
1343 edir->plt_thumb_refcount = eind->plt_thumb_refcount;
1344 eind->plt_thumb_refcount = 0;
1345 }
1346 else
1347 BFD_ASSERT (eind->plt_thumb_refcount == 0);
1348
5e681ec4
PB
1349 _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
1350}
1351
9b485d32 1352/* Create an ARM elf linker hash table. */
252b5132
RH
1353
1354static struct bfd_link_hash_table *
57e8b36a 1355elf32_arm_link_hash_table_create (bfd *abfd)
252b5132
RH
1356{
1357 struct elf32_arm_link_hash_table *ret;
dc810e39 1358 bfd_size_type amt = sizeof (struct elf32_arm_link_hash_table);
252b5132 1359
57e8b36a
NC
1360 ret = bfd_malloc (amt);
1361 if (ret == NULL)
252b5132
RH
1362 return NULL;
1363
57e8b36a 1364 if (!_bfd_elf_link_hash_table_init (& ret->root, abfd,
780a67af 1365 elf32_arm_link_hash_newfunc))
252b5132 1366 {
e2d34d7d 1367 free (ret);
252b5132
RH
1368 return NULL;
1369 }
1370
5e681ec4
PB
1371 ret->sgot = NULL;
1372 ret->sgotplt = NULL;
1373 ret->srelgot = NULL;
1374 ret->splt = NULL;
1375 ret->srelplt = NULL;
1376 ret->sdynbss = NULL;
1377 ret->srelbss = NULL;
252b5132
RH
1378 ret->thumb_glue_size = 0;
1379 ret->arm_glue_size = 0;
1380 ret->bfd_of_glue_owner = NULL;
e489d0ae 1381 ret->byteswap_code = 0;
9c504268 1382 ret->target1_is_rel = 0;
eb043451 1383 ret->target2_reloc = R_ARM_NONE;
e5a52504
MM
1384#ifdef FOUR_WORD_PLT
1385 ret->plt_header_size = 16;
1386 ret->plt_entry_size = 16;
1387#else
1388 ret->plt_header_size = 20;
1389 ret->plt_entry_size = 12;
1390#endif
1391 ret->symbian_p = 0;
4e7fd91e 1392 ret->use_rel = 1;
5e681ec4 1393 ret->sym_sec.abfd = NULL;
b7693d02 1394 ret->obfd = abfd;
252b5132
RH
1395
1396 return &ret->root.root;
1397}
1398
9b485d32
NC
1399/* Locate the Thumb encoded calling stub for NAME. */
1400
252b5132 1401static struct elf_link_hash_entry *
57e8b36a
NC
1402find_thumb_glue (struct bfd_link_info *link_info,
1403 const char *name,
1404 bfd *input_bfd)
252b5132
RH
1405{
1406 char *tmp_name;
1407 struct elf_link_hash_entry *hash;
1408 struct elf32_arm_link_hash_table *hash_table;
1409
1410 /* We need a pointer to the armelf specific hash table. */
1411 hash_table = elf32_arm_hash_table (link_info);
1412
57e8b36a
NC
1413 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
1414 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
252b5132
RH
1415
1416 BFD_ASSERT (tmp_name);
1417
1418 sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
1419
1420 hash = elf_link_hash_lookup
b34976b6 1421 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
252b5132
RH
1422
1423 if (hash == NULL)
1424 /* xgettext:c-format */
d003868e
AM
1425 (*_bfd_error_handler) (_("%B: unable to find THUMB glue '%s' for `%s'"),
1426 input_bfd, tmp_name, name);
252b5132
RH
1427
1428 free (tmp_name);
1429
1430 return hash;
1431}
1432
9b485d32
NC
1433/* Locate the ARM encoded calling stub for NAME. */
1434
252b5132 1435static struct elf_link_hash_entry *
57e8b36a
NC
1436find_arm_glue (struct bfd_link_info *link_info,
1437 const char *name,
1438 bfd *input_bfd)
252b5132
RH
1439{
1440 char *tmp_name;
1441 struct elf_link_hash_entry *myh;
1442 struct elf32_arm_link_hash_table *hash_table;
1443
1444 /* We need a pointer to the elfarm specific hash table. */
1445 hash_table = elf32_arm_hash_table (link_info);
1446
57e8b36a
NC
1447 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
1448 + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
252b5132
RH
1449
1450 BFD_ASSERT (tmp_name);
1451
1452 sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
1453
1454 myh = elf_link_hash_lookup
b34976b6 1455 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
252b5132
RH
1456
1457 if (myh == NULL)
1458 /* xgettext:c-format */
d003868e
AM
1459 (*_bfd_error_handler) (_("%B: unable to find ARM glue '%s' for `%s'"),
1460 input_bfd, tmp_name, name);
252b5132
RH
1461
1462 free (tmp_name);
1463
1464 return myh;
1465}
1466
9b485d32 1467/* ARM->Thumb glue:
252b5132
RH
1468
1469 .arm
1470 __func_from_arm:
1471 ldr r12, __func_addr
1472 bx r12
1473 __func_addr:
9b485d32 1474 .word func @ behave as if you saw a ARM_32 reloc. */
252b5132
RH
1475
1476#define ARM2THUMB_GLUE_SIZE 12
1477static const insn32 a2t1_ldr_insn = 0xe59fc000;
1478static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
1479static const insn32 a2t3_func_addr_insn = 0x00000001;
1480
9b485d32 1481/* Thumb->ARM: Thumb->(non-interworking aware) ARM
252b5132
RH
1482
1483 .thumb .thumb
1484 .align 2 .align 2
1485 __func_from_thumb: __func_from_thumb:
1486 bx pc push {r6, lr}
1487 nop ldr r6, __func_addr
1488 .arm mov lr, pc
1489 __func_change_to_arm: bx r6
1490 b func .arm
1491 __func_back_to_thumb:
1492 ldmia r13! {r6, lr}
1493 bx lr
1494 __func_addr:
9b485d32 1495 .word func */
252b5132
RH
1496
1497#define THUMB2ARM_GLUE_SIZE 8
1498static const insn16 t2a1_bx_pc_insn = 0x4778;
1499static const insn16 t2a2_noop_insn = 0x46c0;
1500static const insn32 t2a3_b_insn = 0xea000000;
1501
7e392df6 1502#ifndef ELFARM_NABI_C_INCLUDED
b34976b6 1503bfd_boolean
57e8b36a 1504bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
252b5132
RH
1505{
1506 asection * s;
1507 bfd_byte * foo;
1508 struct elf32_arm_link_hash_table * globals;
1509
1510 globals = elf32_arm_hash_table (info);
1511
1512 BFD_ASSERT (globals != NULL);
1513
1514 if (globals->arm_glue_size != 0)
1515 {
1516 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
1517
dc810e39
AM
1518 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
1519 ARM2THUMB_GLUE_SECTION_NAME);
252b5132
RH
1520
1521 BFD_ASSERT (s != NULL);
1522
57e8b36a 1523 foo = bfd_alloc (globals->bfd_of_glue_owner, globals->arm_glue_size);
252b5132 1524
eea6121a 1525 s->size = globals->arm_glue_size;
252b5132
RH
1526 s->contents = foo;
1527 }
1528
1529 if (globals->thumb_glue_size != 0)
1530 {
1531 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
1532
1533 s = bfd_get_section_by_name
1534 (globals->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
1535
1536 BFD_ASSERT (s != NULL);
1537
57e8b36a 1538 foo = bfd_alloc (globals->bfd_of_glue_owner, globals->thumb_glue_size);
252b5132 1539
eea6121a 1540 s->size = globals->thumb_glue_size;
252b5132
RH
1541 s->contents = foo;
1542 }
1543
b34976b6 1544 return TRUE;
252b5132
RH
1545}
1546
1547static void
57e8b36a
NC
1548record_arm_to_thumb_glue (struct bfd_link_info * link_info,
1549 struct elf_link_hash_entry * h)
252b5132
RH
1550{
1551 const char * name = h->root.root.string;
63b0f745 1552 asection * s;
252b5132
RH
1553 char * tmp_name;
1554 struct elf_link_hash_entry * myh;
14a793b2 1555 struct bfd_link_hash_entry * bh;
252b5132 1556 struct elf32_arm_link_hash_table * globals;
dc810e39 1557 bfd_vma val;
252b5132
RH
1558
1559 globals = elf32_arm_hash_table (link_info);
1560
1561 BFD_ASSERT (globals != NULL);
1562 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
1563
1564 s = bfd_get_section_by_name
1565 (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
1566
252b5132
RH
1567 BFD_ASSERT (s != NULL);
1568
57e8b36a 1569 tmp_name = bfd_malloc ((bfd_size_type) strlen (name) + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
252b5132
RH
1570
1571 BFD_ASSERT (tmp_name);
1572
1573 sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
1574
1575 myh = elf_link_hash_lookup
b34976b6 1576 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
252b5132
RH
1577
1578 if (myh != NULL)
1579 {
9b485d32 1580 /* We've already seen this guy. */
252b5132 1581 free (tmp_name);
9b485d32 1582 return;
252b5132
RH
1583 }
1584
57e8b36a
NC
1585 /* The only trick here is using hash_table->arm_glue_size as the value.
1586 Even though the section isn't allocated yet, this is where we will be
1587 putting it. */
14a793b2 1588 bh = NULL;
dc810e39
AM
1589 val = globals->arm_glue_size + 1;
1590 _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
1591 tmp_name, BSF_GLOBAL, s, val,
b34976b6 1592 NULL, TRUE, FALSE, &bh);
252b5132 1593
b7693d02
DJ
1594 myh = (struct elf_link_hash_entry *) bh;
1595 myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
1596 myh->forced_local = 1;
1597
252b5132
RH
1598 free (tmp_name);
1599
1600 globals->arm_glue_size += ARM2THUMB_GLUE_SIZE;
1601
1602 return;
1603}
1604
1605static void
57e8b36a
NC
1606record_thumb_to_arm_glue (struct bfd_link_info *link_info,
1607 struct elf_link_hash_entry *h)
252b5132
RH
1608{
1609 const char *name = h->root.root.string;
63b0f745 1610 asection *s;
252b5132
RH
1611 char *tmp_name;
1612 struct elf_link_hash_entry *myh;
14a793b2 1613 struct bfd_link_hash_entry *bh;
252b5132 1614 struct elf32_arm_link_hash_table *hash_table;
dc810e39 1615 bfd_vma val;
252b5132
RH
1616
1617 hash_table = elf32_arm_hash_table (link_info);
1618
1619 BFD_ASSERT (hash_table != NULL);
1620 BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
1621
1622 s = bfd_get_section_by_name
1623 (hash_table->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
1624
1625 BFD_ASSERT (s != NULL);
1626
57e8b36a
NC
1627 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
1628 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
252b5132
RH
1629
1630 BFD_ASSERT (tmp_name);
1631
1632 sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
1633
1634 myh = elf_link_hash_lookup
b34976b6 1635 (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
252b5132
RH
1636
1637 if (myh != NULL)
1638 {
9b485d32 1639 /* We've already seen this guy. */
252b5132 1640 free (tmp_name);
9b485d32 1641 return;
252b5132
RH
1642 }
1643
14a793b2 1644 bh = NULL;
dc810e39
AM
1645 val = hash_table->thumb_glue_size + 1;
1646 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
1647 tmp_name, BSF_GLOBAL, s, val,
b34976b6 1648 NULL, TRUE, FALSE, &bh);
252b5132 1649
9b485d32 1650 /* If we mark it 'Thumb', the disassembler will do a better job. */
14a793b2 1651 myh = (struct elf_link_hash_entry *) bh;
b7693d02
DJ
1652 myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
1653 myh->forced_local = 1;
252b5132
RH
1654
1655 free (tmp_name);
1656
252b5132
RH
1657#define CHANGE_TO_ARM "__%s_change_to_arm"
1658#define BACK_FROM_ARM "__%s_back_from_arm"
1659
9b485d32 1660 /* Allocate another symbol to mark where we switch to Arm mode. */
57e8b36a
NC
1661 tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
1662 + strlen (CHANGE_TO_ARM) + 1);
252b5132
RH
1663
1664 BFD_ASSERT (tmp_name);
1665
1666 sprintf (tmp_name, CHANGE_TO_ARM, name);
1667
14a793b2 1668 bh = NULL;
dc810e39
AM
1669 val = hash_table->thumb_glue_size + 4,
1670 _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
1671 tmp_name, BSF_LOCAL, s, val,
b34976b6 1672 NULL, TRUE, FALSE, &bh);
252b5132
RH
1673
1674 free (tmp_name);
1675
1676 hash_table->thumb_glue_size += THUMB2ARM_GLUE_SIZE;
1677
1678 return;
1679}
1680
8afb0e02
NC
1681/* Add the glue sections to ABFD. This function is called from the
1682 linker scripts in ld/emultempl/{armelf}.em. */
9b485d32 1683
b34976b6 1684bfd_boolean
57e8b36a
NC
1685bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
1686 struct bfd_link_info *info)
252b5132 1687{
252b5132
RH
1688 flagword flags;
1689 asection *sec;
1690
8afb0e02
NC
1691 /* If we are only performing a partial
1692 link do not bother adding the glue. */
1049f94e 1693 if (info->relocatable)
b34976b6 1694 return TRUE;
252b5132 1695
252b5132
RH
1696 sec = bfd_get_section_by_name (abfd, ARM2THUMB_GLUE_SECTION_NAME);
1697
1698 if (sec == NULL)
1699 {
57db232e
NC
1700 /* Note: we do not include the flag SEC_LINKER_CREATED, as this
1701 will prevent elf_link_input_bfd() from processing the contents
1702 of this section. */
811b4bf6 1703 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY;
252b5132
RH
1704
1705 sec = bfd_make_section (abfd, ARM2THUMB_GLUE_SECTION_NAME);
1706
1707 if (sec == NULL
1708 || !bfd_set_section_flags (abfd, sec, flags)
1709 || !bfd_set_section_alignment (abfd, sec, 2))
b34976b6 1710 return FALSE;
9a5aca8c 1711
57db232e
NC
1712 /* Set the gc mark to prevent the section from being removed by garbage
1713 collection, despite the fact that no relocs refer to this section. */
1714 sec->gc_mark = 1;
252b5132
RH
1715 }
1716
1717 sec = bfd_get_section_by_name (abfd, THUMB2ARM_GLUE_SECTION_NAME);
1718
1719 if (sec == NULL)
1720 {
57e8b36a
NC
1721 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1722 | SEC_CODE | SEC_READONLY;
252b5132
RH
1723
1724 sec = bfd_make_section (abfd, THUMB2ARM_GLUE_SECTION_NAME);
1725
1726 if (sec == NULL
1727 || !bfd_set_section_flags (abfd, sec, flags)
1728 || !bfd_set_section_alignment (abfd, sec, 2))
b34976b6 1729 return FALSE;
9a5aca8c 1730
57db232e 1731 sec->gc_mark = 1;
252b5132
RH
1732 }
1733
b34976b6 1734 return TRUE;
8afb0e02
NC
1735}
1736
1737/* Select a BFD to be used to hold the sections used by the glue code.
1738 This function is called from the linker scripts in ld/emultempl/
1739 {armelf/pe}.em */
1740
b34976b6 1741bfd_boolean
57e8b36a 1742bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
8afb0e02
NC
1743{
1744 struct elf32_arm_link_hash_table *globals;
1745
1746 /* If we are only performing a partial link
1747 do not bother getting a bfd to hold the glue. */
1049f94e 1748 if (info->relocatable)
b34976b6 1749 return TRUE;
8afb0e02 1750
b7693d02
DJ
1751 /* Make sure we don't attach the glue sections to a dynamic object. */
1752 BFD_ASSERT (!(abfd->flags & DYNAMIC));
1753
8afb0e02
NC
1754 globals = elf32_arm_hash_table (info);
1755
1756 BFD_ASSERT (globals != NULL);
1757
1758 if (globals->bfd_of_glue_owner != NULL)
b34976b6 1759 return TRUE;
8afb0e02 1760
252b5132
RH
1761 /* Save the bfd for later use. */
1762 globals->bfd_of_glue_owner = abfd;
cedb70c5 1763
b34976b6 1764 return TRUE;
252b5132
RH
1765}
1766
b34976b6 1767bfd_boolean
57e8b36a
NC
1768bfd_elf32_arm_process_before_allocation (bfd *abfd,
1769 struct bfd_link_info *link_info,
eb043451 1770 int byteswap_code)
252b5132
RH
1771{
1772 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 1773 Elf_Internal_Rela *internal_relocs = NULL;
252b5132
RH
1774 Elf_Internal_Rela *irel, *irelend;
1775 bfd_byte *contents = NULL;
252b5132
RH
1776
1777 asection *sec;
1778 struct elf32_arm_link_hash_table *globals;
1779
1780 /* If we are only performing a partial link do not bother
1781 to construct any glue. */
1049f94e 1782 if (link_info->relocatable)
b34976b6 1783 return TRUE;
252b5132
RH
1784
1785 /* Here we have a bfd that is to be included on the link. We have a hook
1786 to do reloc rummaging, before section sizes are nailed down. */
252b5132
RH
1787 globals = elf32_arm_hash_table (link_info);
1788
1789 BFD_ASSERT (globals != NULL);
1790 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
1791
e489d0ae
PB
1792 if (byteswap_code && !bfd_big_endian (abfd))
1793 {
d003868e
AM
1794 _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
1795 abfd);
e489d0ae
PB
1796 return FALSE;
1797 }
1798 globals->byteswap_code = byteswap_code;
f21f3fe0 1799
252b5132
RH
1800 /* Rummage around all the relocs and map the glue vectors. */
1801 sec = abfd->sections;
1802
1803 if (sec == NULL)
b34976b6 1804 return TRUE;
252b5132
RH
1805
1806 for (; sec != NULL; sec = sec->next)
1807 {
1808 if (sec->reloc_count == 0)
1809 continue;
1810
1811 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
252b5132 1812
9b485d32 1813 /* Load the relocs. */
6cdc0ccc 1814 internal_relocs
57e8b36a 1815 = _bfd_elf_link_read_relocs (abfd, sec, (void *) NULL,
45d6a902 1816 (Elf_Internal_Rela *) NULL, FALSE);
252b5132 1817
6cdc0ccc
AM
1818 if (internal_relocs == NULL)
1819 goto error_return;
252b5132 1820
6cdc0ccc
AM
1821 irelend = internal_relocs + sec->reloc_count;
1822 for (irel = internal_relocs; irel < irelend; irel++)
252b5132
RH
1823 {
1824 long r_type;
1825 unsigned long r_index;
252b5132
RH
1826
1827 struct elf_link_hash_entry *h;
1828
1829 r_type = ELF32_R_TYPE (irel->r_info);
1830 r_index = ELF32_R_SYM (irel->r_info);
1831
9b485d32 1832 /* These are the only relocation types we care about. */
ba96a88f 1833 if ( r_type != R_ARM_PC24
b7693d02 1834 && r_type != R_ARM_PLT32
5b5bb741
PB
1835#ifndef OLD_ARM_ABI
1836 && r_type != R_ARM_CALL
1837 && r_type != R_ARM_JUMP24
1838#endif
252b5132
RH
1839 && r_type != R_ARM_THM_PC22)
1840 continue;
1841
1842 /* Get the section contents if we haven't done so already. */
1843 if (contents == NULL)
1844 {
1845 /* Get cached copy if it exists. */
1846 if (elf_section_data (sec)->this_hdr.contents != NULL)
1847 contents = elf_section_data (sec)->this_hdr.contents;
1848 else
1849 {
1850 /* Go get them off disk. */
57e8b36a 1851 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
252b5132
RH
1852 goto error_return;
1853 }
1854 }
1855
a7c10850 1856 /* If the relocation is not against a symbol it cannot concern us. */
252b5132
RH
1857 h = NULL;
1858
9b485d32 1859 /* We don't care about local symbols. */
252b5132
RH
1860 if (r_index < symtab_hdr->sh_info)
1861 continue;
1862
9b485d32 1863 /* This is an external symbol. */
252b5132
RH
1864 r_index -= symtab_hdr->sh_info;
1865 h = (struct elf_link_hash_entry *)
1866 elf_sym_hashes (abfd)[r_index];
1867
1868 /* If the relocation is against a static symbol it must be within
1869 the current section and so cannot be a cross ARM/Thumb relocation. */
1870 if (h == NULL)
1871 continue;
1872
b7693d02
DJ
1873 /* If the call will go through a PLT entry then we do not need
1874 glue. */
1875 if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1)
1876 continue;
1877
252b5132
RH
1878 switch (r_type)
1879 {
1880 case R_ARM_PC24:
5b5bb741
PB
1881#ifndef OLD_ARM_ABI
1882 case R_ARM_CALL:
1883 case R_ARM_JUMP24:
1884#endif
252b5132 1885 /* This one is a call from arm code. We need to look up
2f0ca46a 1886 the target of the call. If it is a thumb target, we
252b5132 1887 insert glue. */
252b5132
RH
1888 if (ELF_ST_TYPE(h->type) == STT_ARM_TFUNC)
1889 record_arm_to_thumb_glue (link_info, h);
1890 break;
1891
1892 case R_ARM_THM_PC22:
f21f3fe0 1893 /* This one is a call from thumb code. We look
2f0ca46a 1894 up the target of the call. If it is not a thumb
bcbdc74c 1895 target, we insert glue. */
252b5132
RH
1896 if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC)
1897 record_thumb_to_arm_glue (link_info, h);
1898 break;
1899
1900 default:
1901 break;
1902 }
1903 }
6cdc0ccc
AM
1904
1905 if (contents != NULL
1906 && elf_section_data (sec)->this_hdr.contents != contents)
1907 free (contents);
1908 contents = NULL;
1909
1910 if (internal_relocs != NULL
1911 && elf_section_data (sec)->relocs != internal_relocs)
1912 free (internal_relocs);
1913 internal_relocs = NULL;
252b5132
RH
1914 }
1915
b34976b6 1916 return TRUE;
9a5aca8c 1917
252b5132 1918error_return:
6cdc0ccc
AM
1919 if (contents != NULL
1920 && elf_section_data (sec)->this_hdr.contents != contents)
1921 free (contents);
1922 if (internal_relocs != NULL
1923 && elf_section_data (sec)->relocs != internal_relocs)
1924 free (internal_relocs);
9a5aca8c 1925
b34976b6 1926 return FALSE;
252b5132 1927}
7e392df6 1928#endif
252b5132 1929
eb043451
PB
1930
1931#ifndef OLD_ARM_ABI
1932/* Set target relocation values needed during linking. */
1933
1934void
1935bfd_elf32_arm_set_target_relocs (struct bfd_link_info *link_info,
1936 int target1_is_rel,
319850b4
JB
1937 char * target2_type,
1938 int fix_v4bx)
eb043451
PB
1939{
1940 struct elf32_arm_link_hash_table *globals;
1941
1942 globals = elf32_arm_hash_table (link_info);
1943
1944 globals->target1_is_rel = target1_is_rel;
1945 if (strcmp (target2_type, "rel") == 0)
1946 globals->target2_reloc = R_ARM_REL32;
eeac373a
PB
1947 else if (strcmp (target2_type, "abs") == 0)
1948 globals->target2_reloc = R_ARM_ABS32;
eb043451
PB
1949 else if (strcmp (target2_type, "got-rel") == 0)
1950 globals->target2_reloc = R_ARM_GOT_PREL;
1951 else
1952 {
1953 _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
1954 target2_type);
1955 }
319850b4 1956 globals->fix_v4bx = fix_v4bx;
eb043451
PB
1957}
1958#endif
1959
252b5132
RH
1960/* The thumb form of a long branch is a bit finicky, because the offset
1961 encoding is split over two fields, each in it's own instruction. They
f21f3fe0 1962 can occur in any order. So given a thumb form of long branch, and an
252b5132 1963 offset, insert the offset into the thumb branch and return finished
f21f3fe0 1964 instruction.
252b5132 1965
f21f3fe0 1966 It takes two thumb instructions to encode the target address. Each has
4cc11e76 1967 11 bits to invest. The upper 11 bits are stored in one (identified by
f21f3fe0
UD
1968 H-0.. see below), the lower 11 bits are stored in the other (identified
1969 by H-1).
252b5132 1970
f21f3fe0 1971 Combine together and shifted left by 1 (it's a half word address) and
252b5132
RH
1972 there you have it.
1973
1974 Op: 1111 = F,
1975 H-0, upper address-0 = 000
1976 Op: 1111 = F,
1977 H-1, lower address-0 = 800
1978
f21f3fe0 1979 They can be ordered either way, but the arm tools I've seen always put
252b5132
RH
1980 the lower one first. It probably doesn't matter. krk@cygnus.com
1981
1982 XXX: Actually the order does matter. The second instruction (H-1)
1983 moves the computed address into the PC, so it must be the second one
1984 in the sequence. The problem, however is that whilst little endian code
1985 stores the instructions in HI then LOW order, big endian code does the
dfc5f959 1986 reverse. nickc@cygnus.com. */
252b5132 1987
dfc5f959
NC
1988#define LOW_HI_ORDER 0xF800F000
1989#define HI_LOW_ORDER 0xF000F800
252b5132
RH
1990
1991static insn32
57e8b36a 1992insert_thumb_branch (insn32 br_insn, int rel_off)
252b5132
RH
1993{
1994 unsigned int low_bits;
1995 unsigned int high_bits;
1996
252b5132
RH
1997 BFD_ASSERT ((rel_off & 1) != 1);
1998
dfc5f959
NC
1999 rel_off >>= 1; /* Half word aligned address. */
2000 low_bits = rel_off & 0x000007FF; /* The bottom 11 bits. */
2001 high_bits = (rel_off >> 11) & 0x000007FF; /* The top 11 bits. */
252b5132
RH
2002
2003 if ((br_insn & LOW_HI_ORDER) == LOW_HI_ORDER)
2004 br_insn = LOW_HI_ORDER | (low_bits << 16) | high_bits;
2005 else if ((br_insn & HI_LOW_ORDER) == HI_LOW_ORDER)
2006 br_insn = HI_LOW_ORDER | (high_bits << 16) | low_bits;
2007 else
9b485d32 2008 /* FIXME: abort is probably not the right call. krk@cygnus.com */
57e8b36a 2009 abort (); /* Error - not a valid branch instruction form. */
252b5132 2010
252b5132
RH
2011 return br_insn;
2012}
2013
9b485d32
NC
2014/* Thumb code calling an ARM function. */
2015
252b5132 2016static int
57e8b36a
NC
2017elf32_thumb_to_arm_stub (struct bfd_link_info * info,
2018 const char * name,
2019 bfd * input_bfd,
2020 bfd * output_bfd,
2021 asection * input_section,
2022 bfd_byte * hit_data,
2023 asection * sym_sec,
2024 bfd_vma offset,
2025 bfd_signed_vma addend,
2026 bfd_vma val)
252b5132 2027{
bcbdc74c 2028 asection * s = 0;
dc810e39 2029 bfd_vma my_offset;
252b5132
RH
2030 unsigned long int tmp;
2031 long int ret_offset;
bcbdc74c
NC
2032 struct elf_link_hash_entry * myh;
2033 struct elf32_arm_link_hash_table * globals;
252b5132
RH
2034
2035 myh = find_thumb_glue (info, name, input_bfd);
2036 if (myh == NULL)
b34976b6 2037 return FALSE;
252b5132
RH
2038
2039 globals = elf32_arm_hash_table (info);
2040
2041 BFD_ASSERT (globals != NULL);
2042 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2043
2044 my_offset = myh->root.u.def.value;
2045
2046 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2047 THUMB2ARM_GLUE_SECTION_NAME);
2048
2049 BFD_ASSERT (s != NULL);
2050 BFD_ASSERT (s->contents != NULL);
2051 BFD_ASSERT (s->output_section != NULL);
2052
2053 if ((my_offset & 0x01) == 0x01)
2054 {
2055 if (sym_sec != NULL
2056 && sym_sec->owner != NULL
2057 && !INTERWORK_FLAG (sym_sec->owner))
2058 {
8f615d07 2059 (*_bfd_error_handler)
d003868e
AM
2060 (_("%B(%s): warning: interworking not enabled.\n"
2061 " first occurrence: %B: thumb call to arm"),
2062 sym_sec->owner, input_bfd, name);
252b5132 2063
b34976b6 2064 return FALSE;
252b5132
RH
2065 }
2066
2067 --my_offset;
2068 myh->root.u.def.value = my_offset;
2069
dc810e39 2070 bfd_put_16 (output_bfd, (bfd_vma) t2a1_bx_pc_insn,
252b5132
RH
2071 s->contents + my_offset);
2072
dc810e39 2073 bfd_put_16 (output_bfd, (bfd_vma) t2a2_noop_insn,
252b5132
RH
2074 s->contents + my_offset + 2);
2075
2076 ret_offset =
9b485d32
NC
2077 /* Address of destination of the stub. */
2078 ((bfd_signed_vma) val)
252b5132 2079 - ((bfd_signed_vma)
57e8b36a
NC
2080 /* Offset from the start of the current section
2081 to the start of the stubs. */
9b485d32
NC
2082 (s->output_offset
2083 /* Offset of the start of this stub from the start of the stubs. */
2084 + my_offset
2085 /* Address of the start of the current section. */
2086 + s->output_section->vma)
2087 /* The branch instruction is 4 bytes into the stub. */
2088 + 4
2089 /* ARM branches work from the pc of the instruction + 8. */
2090 + 8);
252b5132
RH
2091
2092 bfd_put_32 (output_bfd,
dc810e39 2093 (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
252b5132
RH
2094 s->contents + my_offset + 4);
2095 }
2096
2097 BFD_ASSERT (my_offset <= globals->thumb_glue_size);
2098
427bfd90
NC
2099 /* Now go back and fix up the original BL insn to point to here. */
2100 ret_offset =
2101 /* Address of where the stub is located. */
2102 (s->output_section->vma + s->output_offset + my_offset)
2103 /* Address of where the BL is located. */
57e8b36a
NC
2104 - (input_section->output_section->vma + input_section->output_offset
2105 + offset)
427bfd90
NC
2106 /* Addend in the relocation. */
2107 - addend
2108 /* Biassing for PC-relative addressing. */
2109 - 8;
252b5132
RH
2110
2111 tmp = bfd_get_32 (input_bfd, hit_data
2112 - input_section->vma);
2113
2114 bfd_put_32 (output_bfd,
dc810e39 2115 (bfd_vma) insert_thumb_branch (tmp, ret_offset),
252b5132
RH
2116 hit_data - input_section->vma);
2117
b34976b6 2118 return TRUE;
252b5132
RH
2119}
2120
9b485d32
NC
2121/* Arm code calling a Thumb function. */
2122
252b5132 2123static int
57e8b36a
NC
2124elf32_arm_to_thumb_stub (struct bfd_link_info * info,
2125 const char * name,
2126 bfd * input_bfd,
2127 bfd * output_bfd,
2128 asection * input_section,
2129 bfd_byte * hit_data,
2130 asection * sym_sec,
2131 bfd_vma offset,
2132 bfd_signed_vma addend,
2133 bfd_vma val)
252b5132
RH
2134{
2135 unsigned long int tmp;
dc810e39 2136 bfd_vma my_offset;
bcbdc74c 2137 asection * s;
252b5132 2138 long int ret_offset;
bcbdc74c
NC
2139 struct elf_link_hash_entry * myh;
2140 struct elf32_arm_link_hash_table * globals;
252b5132
RH
2141
2142 myh = find_arm_glue (info, name, input_bfd);
2143 if (myh == NULL)
b34976b6 2144 return FALSE;
252b5132
RH
2145
2146 globals = elf32_arm_hash_table (info);
2147
2148 BFD_ASSERT (globals != NULL);
2149 BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2150
2151 my_offset = myh->root.u.def.value;
2152 s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2153 ARM2THUMB_GLUE_SECTION_NAME);
2154 BFD_ASSERT (s != NULL);
2155 BFD_ASSERT (s->contents != NULL);
2156 BFD_ASSERT (s->output_section != NULL);
2157
2158 if ((my_offset & 0x01) == 0x01)
2159 {
2160 if (sym_sec != NULL
2161 && sym_sec->owner != NULL
2162 && !INTERWORK_FLAG (sym_sec->owner))
2163 {
8f615d07 2164 (*_bfd_error_handler)
d003868e
AM
2165 (_("%B(%s): warning: interworking not enabled.\n"
2166 " first occurrence: %B: arm call to thumb"),
2167 sym_sec->owner, input_bfd, name);
252b5132 2168 }
9b485d32 2169
252b5132
RH
2170 --my_offset;
2171 myh->root.u.def.value = my_offset;
2172
dc810e39 2173 bfd_put_32 (output_bfd, (bfd_vma) a2t1_ldr_insn,
252b5132
RH
2174 s->contents + my_offset);
2175
dc810e39 2176 bfd_put_32 (output_bfd, (bfd_vma) a2t2_bx_r12_insn,
252b5132
RH
2177 s->contents + my_offset + 4);
2178
2179 /* It's a thumb address. Add the low order bit. */
2180 bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
2181 s->contents + my_offset + 8);
2182 }
2183
2184 BFD_ASSERT (my_offset <= globals->arm_glue_size);
2185
2186 tmp = bfd_get_32 (input_bfd, hit_data);
2187 tmp = tmp & 0xFF000000;
2188
9b485d32 2189 /* Somehow these are both 4 too far, so subtract 8. */
dc810e39
AM
2190 ret_offset = (s->output_offset
2191 + my_offset
2192 + s->output_section->vma
2193 - (input_section->output_offset
2194 + input_section->output_section->vma
2195 + offset + addend)
2196 - 8);
9a5aca8c 2197
252b5132
RH
2198 tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
2199
dc810e39 2200 bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
252b5132 2201
b34976b6 2202 return TRUE;
252b5132
RH
2203}
2204
eb043451
PB
2205
2206#ifndef OLD_ARM_ABI
2207/* Some relocations map to different relocations depending on the
2208 target. Return the real relocation. */
2209static int
2210arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
2211 int r_type)
2212{
2213 switch (r_type)
2214 {
2215 case R_ARM_TARGET1:
2216 if (globals->target1_is_rel)
2217 return R_ARM_REL32;
2218 else
2219 return R_ARM_ABS32;
2220
2221 case R_ARM_TARGET2:
2222 return globals->target2_reloc;
2223
2224 default:
2225 return r_type;
2226 }
2227}
2228#endif /* OLD_ARM_ABI */
2229
2230
252b5132 2231/* Perform a relocation as part of a final link. */
9b485d32 2232
252b5132 2233static bfd_reloc_status_type
57e8b36a
NC
2234elf32_arm_final_link_relocate (reloc_howto_type * howto,
2235 bfd * input_bfd,
2236 bfd * output_bfd,
2237 asection * input_section,
2238 bfd_byte * contents,
2239 Elf_Internal_Rela * rel,
2240 bfd_vma value,
2241 struct bfd_link_info * info,
2242 asection * sym_sec,
2243 const char * sym_name,
2244 int sym_flags,
2245 struct elf_link_hash_entry * h)
252b5132
RH
2246{
2247 unsigned long r_type = howto->type;
2248 unsigned long r_symndx;
2249 bfd_byte * hit_data = contents + rel->r_offset;
2250 bfd * dynobj = NULL;
2251 Elf_Internal_Shdr * symtab_hdr;
2252 struct elf_link_hash_entry ** sym_hashes;
2253 bfd_vma * local_got_offsets;
2254 asection * sgot = NULL;
2255 asection * splt = NULL;
2256 asection * sreloc = NULL;
252b5132 2257 bfd_vma addend;
ba96a88f
NC
2258 bfd_signed_vma signed_addend;
2259 struct elf32_arm_link_hash_table * globals;
f21f3fe0 2260
9c504268
PB
2261 globals = elf32_arm_hash_table (info);
2262
2263#ifndef OLD_ARM_ABI
2264 /* Some relocation type map to different relocations depending on the
2265 target. We pick the right one here. */
eb043451
PB
2266 r_type = arm_real_reloc_type (globals, r_type);
2267 if (r_type != howto->type)
2268 howto = elf32_arm_howto_from_type (r_type);
9c504268
PB
2269#endif /* OLD_ARM_ABI */
2270
cac15327
NC
2271 /* If the start address has been set, then set the EF_ARM_HASENTRY
2272 flag. Setting this more than once is redundant, but the cost is
2273 not too high, and it keeps the code simple.
99e4ae17 2274
cac15327
NC
2275 The test is done here, rather than somewhere else, because the
2276 start address is only set just before the final link commences.
2277
2278 Note - if the user deliberately sets a start address of 0, the
2279 flag will not be set. */
2280 if (bfd_get_start_address (output_bfd) != 0)
2281 elf_elfheader (output_bfd)->e_flags |= EF_ARM_HASENTRY;
99e4ae17 2282
252b5132
RH
2283 dynobj = elf_hash_table (info)->dynobj;
2284 if (dynobj)
2285 {
2286 sgot = bfd_get_section_by_name (dynobj, ".got");
2287 splt = bfd_get_section_by_name (dynobj, ".plt");
2288 }
2289 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
2290 sym_hashes = elf_sym_hashes (input_bfd);
2291 local_got_offsets = elf_local_got_offsets (input_bfd);
2292 r_symndx = ELF32_R_SYM (rel->r_info);
2293
4e7fd91e 2294 if (globals->use_rel)
ba96a88f 2295 {
4e7fd91e
PB
2296 addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
2297
2298 if (addend & ((howto->src_mask + 1) >> 1))
2299 {
2300 signed_addend = -1;
2301 signed_addend &= ~ howto->src_mask;
2302 signed_addend |= addend;
2303 }
2304 else
2305 signed_addend = addend;
ba96a88f
NC
2306 }
2307 else
4e7fd91e 2308 addend = signed_addend = rel->r_addend;
f21f3fe0 2309
252b5132
RH
2310 switch (r_type)
2311 {
2312 case R_ARM_NONE:
2313 return bfd_reloc_ok;
2314
2315 case R_ARM_PC24:
2316 case R_ARM_ABS32:
2317 case R_ARM_REL32:
dfc5f959 2318#ifndef OLD_ARM_ABI
5b5bb741
PB
2319 case R_ARM_CALL:
2320 case R_ARM_JUMP24:
dfc5f959 2321 case R_ARM_XPC25:
eb043451 2322 case R_ARM_PREL31:
dfc5f959 2323#endif
7359ea65 2324 case R_ARM_PLT32:
5e681ec4
PB
2325 /* r_symndx will be zero only for relocs against symbols
2326 from removed linkonce sections, or sections discarded by
2327 a linker script. */
2328 if (r_symndx == 0)
2329 return bfd_reloc_ok;
2330
7359ea65
DJ
2331 /* Handle relocations which should use the PLT entry. ABS32/REL32
2332 will use the symbol's value, which may point to a PLT entry, but we
2333 don't need to handle that here. If we created a PLT entry, all
2334 branches in this object should go to it. */
ee06dc07 2335 if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32)
7359ea65 2336 && h != NULL
c84cd8ee 2337 && splt != NULL
7359ea65
DJ
2338 && h->plt.offset != (bfd_vma) -1)
2339 {
c84cd8ee
DJ
2340 /* If we've created a .plt section, and assigned a PLT entry to
2341 this function, it should not be known to bind locally. If
2342 it were, we would have cleared the PLT entry. */
7359ea65
DJ
2343 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
2344
2345 value = (splt->output_section->vma
2346 + splt->output_offset
2347 + h->plt.offset);
2348 return _bfd_final_link_relocate (howto, input_bfd, input_section,
2349 contents, rel->r_offset, value,
2350 (bfd_vma) 0);
2351 }
2352
67687978
PB
2353 /* When generating a shared object or relocatable executable, these
2354 relocations are copied into the output file to be resolved at
2355 run time. */
2356 if ((info->shared || globals->root.is_relocatable_executable)
7359ea65 2357 && (input_section->flags & SEC_ALLOC)
ee06dc07
PB
2358 && (r_type != R_ARM_REL32
2359 || !SYMBOL_CALLS_LOCAL (info, h))
7359ea65
DJ
2360 && (h == NULL
2361 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2362 || h->root.type != bfd_link_hash_undefweak)
2363 && r_type != R_ARM_PC24
5b5bb741
PB
2364#ifndef OLD_ARM_ABI
2365 && r_type != R_ARM_CALL
2366 && r_type != R_ARM_JUMP24
ee06dc07 2367 && r_type != R_ARM_PREL31
5b5bb741 2368#endif
7359ea65 2369 && r_type != R_ARM_PLT32)
252b5132 2370 {
947216bf
AM
2371 Elf_Internal_Rela outrel;
2372 bfd_byte *loc;
b34976b6 2373 bfd_boolean skip, relocate;
f21f3fe0 2374
252b5132
RH
2375 if (sreloc == NULL)
2376 {
2377 const char * name;
f21f3fe0 2378
252b5132
RH
2379 name = (bfd_elf_string_from_elf_section
2380 (input_bfd,
2381 elf_elfheader (input_bfd)->e_shstrndx,
2382 elf_section_data (input_section)->rel_hdr.sh_name));
2383 if (name == NULL)
2384 return bfd_reloc_notsupported;
f21f3fe0 2385
252b5132
RH
2386 BFD_ASSERT (strncmp (name, ".rel", 4) == 0
2387 && strcmp (bfd_get_section_name (input_bfd,
2388 input_section),
2389 name + 4) == 0);
f21f3fe0 2390
252b5132
RH
2391 sreloc = bfd_get_section_by_name (dynobj, name);
2392 BFD_ASSERT (sreloc != NULL);
2393 }
f21f3fe0 2394
b34976b6
AM
2395 skip = FALSE;
2396 relocate = FALSE;
f21f3fe0 2397
c629eae0
JJ
2398 outrel.r_offset =
2399 _bfd_elf_section_offset (output_bfd, info, input_section,
2400 rel->r_offset);
2401 if (outrel.r_offset == (bfd_vma) -1)
b34976b6 2402 skip = TRUE;
0bb2d96a 2403 else if (outrel.r_offset == (bfd_vma) -2)
b34976b6 2404 skip = TRUE, relocate = TRUE;
252b5132
RH
2405 outrel.r_offset += (input_section->output_section->vma
2406 + input_section->output_offset);
f21f3fe0 2407
252b5132 2408 if (skip)
0bb2d96a 2409 memset (&outrel, 0, sizeof outrel);
5e681ec4
PB
2410 else if (h != NULL
2411 && h->dynindx != -1
7359ea65 2412 && (!info->shared
5e681ec4 2413 || !info->symbolic
f5385ebf 2414 || !h->def_regular))
5e681ec4 2415 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
252b5132
RH
2416 else
2417 {
a16385dc
MM
2418 int symbol;
2419
5e681ec4
PB
2420 /* This symbol is local, or marked to become local. */
2421 relocate = TRUE;
b7693d02
DJ
2422 if (sym_flags == STT_ARM_TFUNC)
2423 value |= 1;
a16385dc 2424 if (globals->symbian_p)
6366ff1e
MM
2425 {
2426 /* On Symbian OS, the data segment and text segement
2427 can be relocated independently. Therefore, we
2428 must indicate the segment to which this
2429 relocation is relative. The BPABI allows us to
2430 use any symbol in the right segment; we just use
2431 the section symbol as it is convenient. (We
2432 cannot use the symbol given by "h" directly as it
2433 will not appear in the dynamic symbol table.) */
2434 symbol = elf_section_data (sym_sec->output_section)->dynindx;
2435 BFD_ASSERT (symbol != 0);
2436 }
a16385dc
MM
2437 else
2438 /* On SVR4-ish systems, the dynamic loader cannot
2439 relocate the text and data segments independently,
2440 so the symbol does not matter. */
2441 symbol = 0;
2442 outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
252b5132 2443 }
f21f3fe0 2444
947216bf
AM
2445 loc = sreloc->contents;
2446 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
2447 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
9a5aca8c 2448
f21f3fe0 2449 /* If this reloc is against an external symbol, we do not want to
252b5132 2450 fiddle with the addend. Otherwise, we need to include the symbol
9b485d32 2451 value so that it becomes an addend for the dynamic reloc. */
252b5132
RH
2452 if (! relocate)
2453 return bfd_reloc_ok;
9a5aca8c 2454
f21f3fe0 2455 return _bfd_final_link_relocate (howto, input_bfd, input_section,
252b5132
RH
2456 contents, rel->r_offset, value,
2457 (bfd_vma) 0);
2458 }
2459 else switch (r_type)
2460 {
dfc5f959
NC
2461#ifndef OLD_ARM_ABI
2462 case R_ARM_XPC25: /* Arm BLX instruction. */
5b5bb741
PB
2463 case R_ARM_CALL:
2464 case R_ARM_JUMP24:
dfc5f959
NC
2465#endif
2466 case R_ARM_PC24: /* Arm B/BL instruction */
7359ea65 2467 case R_ARM_PLT32:
dfc5f959
NC
2468#ifndef OLD_ARM_ABI
2469 if (r_type == R_ARM_XPC25)
252b5132 2470 {
dfc5f959
NC
2471 /* Check for Arm calling Arm function. */
2472 /* FIXME: Should we translate the instruction into a BL
2473 instruction instead ? */
2474 if (sym_flags != STT_ARM_TFUNC)
d003868e
AM
2475 (*_bfd_error_handler)
2476 (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
2477 input_bfd,
2478 h ? h->root.root.string : "(local)");
dfc5f959
NC
2479 }
2480 else
2481#endif
2482 {
2483 /* Check for Arm calling Thumb function. */
2484 if (sym_flags == STT_ARM_TFUNC)
2485 {
57e8b36a
NC
2486 elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
2487 output_bfd, input_section,
2488 hit_data, sym_sec, rel->r_offset,
dfc5f959
NC
2489 signed_addend, value);
2490 return bfd_reloc_ok;
2491 }
252b5132 2492 }
ba96a88f 2493
dea514f5
PB
2494 /* The ARM ELF ABI says that this reloc is computed as: S - P + A
2495 where:
2496 S is the address of the symbol in the relocation.
2497 P is address of the instruction being relocated.
2498 A is the addend (extracted from the instruction) in bytes.
2499
2500 S is held in 'value'.
2501 P is the base address of the section containing the
2502 instruction plus the offset of the reloc into that
2503 section, ie:
2504 (input_section->output_section->vma +
2505 input_section->output_offset +
2506 rel->r_offset).
2507 A is the addend, converted into bytes, ie:
2508 (signed_addend * 4)
2509
2510 Note: None of these operations have knowledge of the pipeline
2511 size of the processor, thus it is up to the assembler to
2512 encode this information into the addend. */
2513 value -= (input_section->output_section->vma
2514 + input_section->output_offset);
2515 value -= rel->r_offset;
4e7fd91e
PB
2516 if (globals->use_rel)
2517 value += (signed_addend << howto->size);
2518 else
2519 /* RELA addends do not have to be adjusted by howto->size. */
2520 value += signed_addend;
23080146 2521
dcb5e6e6
NC
2522 signed_addend = value;
2523 signed_addend >>= howto->rightshift;
9a5aca8c 2524
59f2c4e7
NC
2525 /* It is not an error for an undefined weak reference to be
2526 out of range. Any program that branches to such a symbol
9a5aca8c
AM
2527 is going to crash anyway, so there is no point worrying
2528 about getting the destination exactly right. */
59f2c4e7
NC
2529 if (! h || h->root.type != bfd_link_hash_undefweak)
2530 {
9b485d32 2531 /* Perform a signed range check. */
dcb5e6e6 2532 if ( signed_addend > ((bfd_signed_vma) (howto->dst_mask >> 1))
59f2c4e7
NC
2533 || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
2534 return bfd_reloc_overflow;
2535 }
9a5aca8c 2536
dcb5e6e6
NC
2537#ifndef OLD_ARM_ABI
2538 /* If necessary set the H bit in the BLX instruction. */
2539 if (r_type == R_ARM_XPC25 && ((value & 2) == 2))
2540 value = (signed_addend & howto->dst_mask)
2541 | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask))
2542 | (1 << 24);
2543 else
2544#endif
2545 value = (signed_addend & howto->dst_mask)
2546 | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
252b5132 2547 break;
f21f3fe0 2548
252b5132
RH
2549 case R_ARM_ABS32:
2550 value += addend;
2551 if (sym_flags == STT_ARM_TFUNC)
2552 value |= 1;
2553 break;
f21f3fe0 2554
252b5132
RH
2555 case R_ARM_REL32:
2556 value -= (input_section->output_section->vma
62efb346 2557 + input_section->output_offset + rel->r_offset);
252b5132
RH
2558 value += addend;
2559 break;
eb043451
PB
2560
2561#ifndef OLD_ARM_ABI
2562 case R_ARM_PREL31:
2563 value -= (input_section->output_section->vma
2564 + input_section->output_offset + rel->r_offset);
2565 value += signed_addend;
2566 if (! h || h->root.type != bfd_link_hash_undefweak)
2567 {
2568 /* Check for overflow */
2569 if ((value ^ (value >> 1)) & (1 << 30))
2570 return bfd_reloc_overflow;
2571 }
2572 value &= 0x7fffffff;
2573 value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
2574 if (sym_flags == STT_ARM_TFUNC)
2575 value |= 1;
2576 break;
2577#endif
252b5132 2578 }
f21f3fe0 2579
252b5132
RH
2580 bfd_put_32 (input_bfd, value, hit_data);
2581 return bfd_reloc_ok;
2582
2583 case R_ARM_ABS8:
2584 value += addend;
2585 if ((long) value > 0x7f || (long) value < -0x80)
2586 return bfd_reloc_overflow;
2587
2588 bfd_put_8 (input_bfd, value, hit_data);
2589 return bfd_reloc_ok;
2590
2591 case R_ARM_ABS16:
2592 value += addend;
2593
2594 if ((long) value > 0x7fff || (long) value < -0x8000)
2595 return bfd_reloc_overflow;
2596
2597 bfd_put_16 (input_bfd, value, hit_data);
2598 return bfd_reloc_ok;
2599
2600 case R_ARM_ABS12:
2601 /* Support ldr and str instruction for the arm */
2602 /* Also thumb b (unconditional branch). ??? Really? */
2603 value += addend;
2604
2605 if ((long) value > 0x7ff || (long) value < -0x800)
2606 return bfd_reloc_overflow;
2607
2608 value |= (bfd_get_32 (input_bfd, hit_data) & 0xfffff000);
2609 bfd_put_32 (input_bfd, value, hit_data);
2610 return bfd_reloc_ok;
2611
2612 case R_ARM_THM_ABS5:
9b485d32 2613 /* Support ldr and str instructions for the thumb. */
4e7fd91e
PB
2614 if (globals->use_rel)
2615 {
2616 /* Need to refetch addend. */
2617 addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
2618 /* ??? Need to determine shift amount from operand size. */
2619 addend >>= howto->rightshift;
2620 }
252b5132
RH
2621 value += addend;
2622
2623 /* ??? Isn't value unsigned? */
2624 if ((long) value > 0x1f || (long) value < -0x10)
2625 return bfd_reloc_overflow;
2626
2627 /* ??? Value needs to be properly shifted into place first. */
2628 value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
2629 bfd_put_16 (input_bfd, value, hit_data);
2630 return bfd_reloc_ok;
2631
dfc5f959
NC
2632#ifndef OLD_ARM_ABI
2633 case R_ARM_THM_XPC22:
2634#endif
252b5132 2635 case R_ARM_THM_PC22:
dfc5f959 2636 /* Thumb BL (branch long instruction). */
252b5132 2637 {
b34976b6
AM
2638 bfd_vma relocation;
2639 bfd_boolean overflow = FALSE;
2640 bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
2641 bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
df212a7e 2642 bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
ba96a88f 2643 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
b34976b6 2644 bfd_vma check;
252b5132 2645 bfd_signed_vma signed_check;
252b5132 2646
252b5132
RH
2647 /* Need to refetch the addend and squish the two 11 bit pieces
2648 together. */
4e7fd91e
PB
2649 if (globals->use_rel)
2650 {
2651 bfd_vma upper = upper_insn & 0x7ff;
2652 bfd_vma lower = lower_insn & 0x7ff;
2653 upper = (upper ^ 0x400) - 0x400; /* Sign extend. */
2654 addend = (upper << 12) | (lower << 1);
2655 signed_addend = addend;
2656 }
dfc5f959
NC
2657#ifndef OLD_ARM_ABI
2658 if (r_type == R_ARM_THM_XPC22)
2659 {
2660 /* Check for Thumb to Thumb call. */
2661 /* FIXME: Should we translate the instruction into a BL
2662 instruction instead ? */
2663 if (sym_flags == STT_ARM_TFUNC)
d003868e
AM
2664 (*_bfd_error_handler)
2665 (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
2666 input_bfd,
2667 h ? h->root.root.string : "(local)");
dfc5f959
NC
2668 }
2669 else
2670#endif
252b5132 2671 {
dfc5f959
NC
2672 /* If it is not a call to Thumb, assume call to Arm.
2673 If it is a call relative to a section name, then it is not a
b7693d02
DJ
2674 function call at all, but rather a long jump. Calls through
2675 the PLT do not require stubs. */
2676 if (sym_flags != STT_ARM_TFUNC && sym_flags != STT_SECTION
2677 && (h == NULL || splt == NULL
2678 || h->plt.offset == (bfd_vma) -1))
dfc5f959
NC
2679 {
2680 if (elf32_thumb_to_arm_stub
2681 (info, sym_name, input_bfd, output_bfd, input_section,
2682 hit_data, sym_sec, rel->r_offset, signed_addend, value))
2683 return bfd_reloc_ok;
2684 else
2685 return bfd_reloc_dangerous;
2686 }
252b5132 2687 }
f21f3fe0 2688
b7693d02
DJ
2689 /* Handle calls via the PLT. */
2690 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
2691 {
2692 value = (splt->output_section->vma
2693 + splt->output_offset
2694 + h->plt.offset);
2695 /* Target the Thumb stub before the ARM PLT entry. */
2696 value -= 4;
2697 }
2698
ba96a88f 2699 relocation = value + signed_addend;
f21f3fe0 2700
252b5132 2701 relocation -= (input_section->output_section->vma
ba96a88f
NC
2702 + input_section->output_offset
2703 + rel->r_offset);
9a5aca8c 2704
252b5132
RH
2705 check = relocation >> howto->rightshift;
2706
2707 /* If this is a signed value, the rightshift just dropped
2708 leading 1 bits (assuming twos complement). */
2709 if ((bfd_signed_vma) relocation >= 0)
2710 signed_check = check;
2711 else
2712 signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
2713
252b5132 2714 /* Assumes two's complement. */
ba96a88f 2715 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
b34976b6 2716 overflow = TRUE;
252b5132 2717
df425bc0 2718#ifndef OLD_ARM_ABI
4f3c3dbb
NC
2719 if (r_type == R_ARM_THM_XPC22
2720 && ((lower_insn & 0x1800) == 0x0800))
c62e1cc3
NC
2721 /* For a BLX instruction, make sure that the relocation is rounded up
2722 to a word boundary. This follows the semantics of the instruction
2723 which specifies that bit 1 of the target address will come from bit
2724 1 of the base address. */
2725 relocation = (relocation + 2) & ~ 3;
99e4ae17 2726#endif
c62e1cc3
NC
2727 /* Put RELOCATION back into the insn. */
2728 upper_insn = (upper_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 12) & 0x7ff);
2729 lower_insn = (lower_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 1) & 0x7ff);
2730
252b5132
RH
2731 /* Put the relocated value back in the object file: */
2732 bfd_put_16 (input_bfd, upper_insn, hit_data);
2733 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
2734
2735 return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
2736 }
2737 break;
2738
51c5503b 2739 case R_ARM_THM_PC11:
e37c699c 2740 case R_ARM_THM_PC9:
51c5503b
NC
2741 /* Thumb B (branch) instruction). */
2742 {
6cf9e9fe 2743 bfd_signed_vma relocation;
51c5503b
NC
2744 bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
2745 bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
51c5503b
NC
2746 bfd_signed_vma signed_check;
2747
4e7fd91e 2748 if (globals->use_rel)
6cf9e9fe 2749 {
4e7fd91e
PB
2750 /* Need to refetch addend. */
2751 addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
2752 if (addend & ((howto->src_mask + 1) >> 1))
2753 {
2754 signed_addend = -1;
2755 signed_addend &= ~ howto->src_mask;
2756 signed_addend |= addend;
2757 }
2758 else
2759 signed_addend = addend;
2760 /* The value in the insn has been right shifted. We need to
2761 undo this, so that we can perform the address calculation
2762 in terms of bytes. */
2763 signed_addend <<= howto->rightshift;
6cf9e9fe 2764 }
6cf9e9fe 2765 relocation = value + signed_addend;
51c5503b
NC
2766
2767 relocation -= (input_section->output_section->vma
2768 + input_section->output_offset
2769 + rel->r_offset);
2770
6cf9e9fe
NC
2771 relocation >>= howto->rightshift;
2772 signed_check = relocation;
2773 relocation &= howto->dst_mask;
51c5503b 2774 relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
cedb70c5 2775
51c5503b
NC
2776 bfd_put_16 (input_bfd, relocation, hit_data);
2777
2778 /* Assumes two's complement. */
2779 if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
2780 return bfd_reloc_overflow;
2781
2782 return bfd_reloc_ok;
2783 }
cedb70c5 2784
1f433d93 2785#ifndef OLD_ARM_ABI
8375c36b
PB
2786 case R_ARM_ALU_PCREL7_0:
2787 case R_ARM_ALU_PCREL15_8:
2788 case R_ARM_ALU_PCREL23_15:
2789 {
2790 bfd_vma insn;
2791 bfd_vma relocation;
2792
2793 insn = bfd_get_32 (input_bfd, hit_data);
4e7fd91e
PB
2794 if (globals->use_rel)
2795 {
2796 /* Extract the addend. */
2797 addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
2798 signed_addend = addend;
2799 }
8375c36b
PB
2800 relocation = value + signed_addend;
2801
2802 relocation -= (input_section->output_section->vma
2803 + input_section->output_offset
2804 + rel->r_offset);
2805 insn = (insn & ~0xfff)
2806 | ((howto->bitpos << 7) & 0xf00)
2807 | ((relocation >> howto->bitpos) & 0xff);
2808 bfd_put_32 (input_bfd, value, hit_data);
2809 }
2810 return bfd_reloc_ok;
1f433d93 2811#endif
8375c36b 2812
252b5132
RH
2813 case R_ARM_GNU_VTINHERIT:
2814 case R_ARM_GNU_VTENTRY:
2815 return bfd_reloc_ok;
2816
2817 case R_ARM_COPY:
2818 return bfd_reloc_notsupported;
2819
2820 case R_ARM_GLOB_DAT:
2821 return bfd_reloc_notsupported;
2822
2823 case R_ARM_JUMP_SLOT:
2824 return bfd_reloc_notsupported;
2825
2826 case R_ARM_RELATIVE:
2827 return bfd_reloc_notsupported;
2828
2829 case R_ARM_GOTOFF:
2830 /* Relocation is relative to the start of the
2831 global offset table. */
2832
2833 BFD_ASSERT (sgot != NULL);
2834 if (sgot == NULL)
2835 return bfd_reloc_notsupported;
9a5aca8c 2836
cedb70c5 2837 /* If we are addressing a Thumb function, we need to adjust the
ee29b9fb
RE
2838 address by one, so that attempts to call the function pointer will
2839 correctly interpret it as Thumb code. */
2840 if (sym_flags == STT_ARM_TFUNC)
2841 value += 1;
2842
252b5132
RH
2843 /* Note that sgot->output_offset is not involved in this
2844 calculation. We always want the start of .got. If we
2845 define _GLOBAL_OFFSET_TABLE in a different way, as is
2846 permitted by the ABI, we might have to change this
9b485d32 2847 calculation. */
252b5132 2848 value -= sgot->output_section->vma;
f21f3fe0 2849 return _bfd_final_link_relocate (howto, input_bfd, input_section,
99e4ae17
AJ
2850 contents, rel->r_offset, value,
2851 (bfd_vma) 0);
252b5132
RH
2852
2853 case R_ARM_GOTPC:
a7c10850 2854 /* Use global offset table as symbol value. */
252b5132 2855 BFD_ASSERT (sgot != NULL);
f21f3fe0 2856
252b5132
RH
2857 if (sgot == NULL)
2858 return bfd_reloc_notsupported;
2859
2860 value = sgot->output_section->vma;
f21f3fe0 2861 return _bfd_final_link_relocate (howto, input_bfd, input_section,
99e4ae17
AJ
2862 contents, rel->r_offset, value,
2863 (bfd_vma) 0);
f21f3fe0 2864
252b5132 2865 case R_ARM_GOT32:
eb043451
PB
2866#ifndef OLD_ARM_ABI
2867 case R_ARM_GOT_PREL:
2868#endif
252b5132 2869 /* Relocation is to the entry for this symbol in the
9b485d32 2870 global offset table. */
252b5132
RH
2871 if (sgot == NULL)
2872 return bfd_reloc_notsupported;
f21f3fe0 2873
252b5132
RH
2874 if (h != NULL)
2875 {
2876 bfd_vma off;
5e681ec4 2877 bfd_boolean dyn;
f21f3fe0 2878
252b5132
RH
2879 off = h->got.offset;
2880 BFD_ASSERT (off != (bfd_vma) -1);
5e681ec4 2881 dyn = globals->root.dynamic_sections_created;
f21f3fe0 2882
5e681ec4 2883 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
50d6c878 2884 || (info->shared
5e681ec4
PB
2885 && SYMBOL_REFERENCES_LOCAL (info, h))
2886 || (ELF_ST_VISIBILITY (h->other)
2887 && h->root.type == bfd_link_hash_undefweak))
252b5132
RH
2888 {
2889 /* This is actually a static link, or it is a -Bsymbolic link
2890 and the symbol is defined locally. We must initialize this
2891 entry in the global offset table. Since the offset must
2892 always be a multiple of 4, we use the least significant bit
2893 to record whether we have initialized it already.
f21f3fe0 2894
252b5132 2895 When doing a dynamic link, we create a .rel.got relocation
f21f3fe0 2896 entry to initialize the value. This is done in the
9b485d32 2897 finish_dynamic_symbol routine. */
252b5132
RH
2898 if ((off & 1) != 0)
2899 off &= ~1;
2900 else
2901 {
ee29b9fb
RE
2902 /* If we are addressing a Thumb function, we need to
2903 adjust the address by one, so that attempts to
2904 call the function pointer will correctly
2905 interpret it as Thumb code. */
2906 if (sym_flags == STT_ARM_TFUNC)
2907 value |= 1;
2908
252b5132
RH
2909 bfd_put_32 (output_bfd, value, sgot->contents + off);
2910 h->got.offset |= 1;
2911 }
2912 }
f21f3fe0 2913
252b5132
RH
2914 value = sgot->output_offset + off;
2915 }
2916 else
2917 {
2918 bfd_vma off;
f21f3fe0 2919
252b5132
RH
2920 BFD_ASSERT (local_got_offsets != NULL &&
2921 local_got_offsets[r_symndx] != (bfd_vma) -1);
f21f3fe0 2922
252b5132 2923 off = local_got_offsets[r_symndx];
f21f3fe0 2924
252b5132
RH
2925 /* The offset must always be a multiple of 4. We use the
2926 least significant bit to record whether we have already
9b485d32 2927 generated the necessary reloc. */
252b5132
RH
2928 if ((off & 1) != 0)
2929 off &= ~1;
2930 else
2931 {
b7693d02
DJ
2932 /* If we are addressing a Thumb function, we need to
2933 adjust the address by one, so that attempts to
2934 call the function pointer will correctly
2935 interpret it as Thumb code. */
2936 if (sym_flags == STT_ARM_TFUNC)
2937 value |= 1;
2938
252b5132 2939 bfd_put_32 (output_bfd, value, sgot->contents + off);
f21f3fe0 2940
252b5132
RH
2941 if (info->shared)
2942 {
2943 asection * srelgot;
947216bf
AM
2944 Elf_Internal_Rela outrel;
2945 bfd_byte *loc;
f21f3fe0 2946
252b5132
RH
2947 srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
2948 BFD_ASSERT (srelgot != NULL);
f21f3fe0 2949
252b5132 2950 outrel.r_offset = (sgot->output_section->vma
f21f3fe0 2951 + sgot->output_offset
252b5132
RH
2952 + off);
2953 outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
947216bf
AM
2954 loc = srelgot->contents;
2955 loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
2956 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
252b5132 2957 }
f21f3fe0 2958
252b5132
RH
2959 local_got_offsets[r_symndx] |= 1;
2960 }
f21f3fe0 2961
252b5132
RH
2962 value = sgot->output_offset + off;
2963 }
eb043451
PB
2964 if (r_type != R_ARM_GOT32)
2965 value += sgot->output_section->vma;
9a5aca8c 2966
f21f3fe0 2967 return _bfd_final_link_relocate (howto, input_bfd, input_section,
99e4ae17
AJ
2968 contents, rel->r_offset, value,
2969 (bfd_vma) 0);
f21f3fe0 2970
252b5132
RH
2971 case R_ARM_SBREL32:
2972 return bfd_reloc_notsupported;
2973
2974 case R_ARM_AMP_VCALL9:
2975 return bfd_reloc_notsupported;
2976
2977 case R_ARM_RSBREL32:
2978 return bfd_reloc_notsupported;
2979
2980 case R_ARM_THM_RPC22:
2981 return bfd_reloc_notsupported;
2982
2983 case R_ARM_RREL32:
2984 return bfd_reloc_notsupported;
2985
2986 case R_ARM_RABS32:
2987 return bfd_reloc_notsupported;
2988
2989 case R_ARM_RPC24:
2990 return bfd_reloc_notsupported;
2991
2992 case R_ARM_RBASE:
2993 return bfd_reloc_notsupported;
2994
319850b4
JB
2995 case R_ARM_V4BX:
2996 if (globals->fix_v4bx)
2997 {
2998 bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
2999
3000 /* Ensure that we have a BX instruction. */
3001 BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
3002
3003 /* Preserve Rm (lowest four bits) and the condition code
3004 (highest four bits). Other bits encode MOV PC,Rm. */
3005 insn = (insn & 0xf000000f) | 0x01a0f000;
3006
3007 bfd_put_32 (input_bfd, insn, hit_data);
3008 }
3009 return bfd_reloc_ok;
3010
252b5132
RH
3011 default:
3012 return bfd_reloc_notsupported;
3013 }
3014}
3015
98c1d4aa
NC
3016/* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS. */
3017static void
57e8b36a
NC
3018arm_add_to_rel (bfd * abfd,
3019 bfd_byte * address,
3020 reloc_howto_type * howto,
3021 bfd_signed_vma increment)
98c1d4aa 3022{
98c1d4aa
NC
3023 bfd_signed_vma addend;
3024
9a5aca8c 3025 if (howto->type == R_ARM_THM_PC22)
98c1d4aa 3026 {
9a5aca8c
AM
3027 int upper_insn, lower_insn;
3028 int upper, lower;
98c1d4aa 3029
9a5aca8c
AM
3030 upper_insn = bfd_get_16 (abfd, address);
3031 lower_insn = bfd_get_16 (abfd, address + 2);
3032 upper = upper_insn & 0x7ff;
3033 lower = lower_insn & 0x7ff;
3034
3035 addend = (upper << 12) | (lower << 1);
ddda4409 3036 addend += increment;
9a5aca8c 3037 addend >>= 1;
98c1d4aa 3038
9a5aca8c
AM
3039 upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
3040 lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
3041
dc810e39
AM
3042 bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
3043 bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
9a5aca8c
AM
3044 }
3045 else
3046 {
3047 bfd_vma contents;
3048
3049 contents = bfd_get_32 (abfd, address);
3050
3051 /* Get the (signed) value from the instruction. */
3052 addend = contents & howto->src_mask;
3053 if (addend & ((howto->src_mask + 1) >> 1))
3054 {
3055 bfd_signed_vma mask;
3056
3057 mask = -1;
3058 mask &= ~ howto->src_mask;
3059 addend |= mask;
3060 }
3061
3062 /* Add in the increment, (which is a byte value). */
3063 switch (howto->type)
3064 {
3065 default:
3066 addend += increment;
3067 break;
3068
3069 case R_ARM_PC24:
5b5bb741
PB
3070#ifndef OLD_ARM_ABI
3071 case R_ARM_CALL:
3072 case R_ARM_JUMP24:
3073#endif
9a5aca8c 3074 addend <<= howto->size;
dc810e39 3075 addend += increment;
9a5aca8c
AM
3076
3077 /* Should we check for overflow here ? */
3078
3079 /* Drop any undesired bits. */
3080 addend >>= howto->rightshift;
3081 break;
3082 }
3083
3084 contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
3085
3086 bfd_put_32 (abfd, contents, address);
ddda4409 3087 }
98c1d4aa 3088}
252b5132
RH
3089
3090/* Relocate an ARM ELF section. */
b34976b6 3091static bfd_boolean
57e8b36a
NC
3092elf32_arm_relocate_section (bfd * output_bfd,
3093 struct bfd_link_info * info,
3094 bfd * input_bfd,
3095 asection * input_section,
3096 bfd_byte * contents,
3097 Elf_Internal_Rela * relocs,
3098 Elf_Internal_Sym * local_syms,
3099 asection ** local_sections)
252b5132 3100{
b34976b6
AM
3101 Elf_Internal_Shdr *symtab_hdr;
3102 struct elf_link_hash_entry **sym_hashes;
3103 Elf_Internal_Rela *rel;
3104 Elf_Internal_Rela *relend;
3105 const char *name;
b32d3aa2 3106 struct elf32_arm_link_hash_table * globals;
252b5132 3107
4e7fd91e
PB
3108 globals = elf32_arm_hash_table (info);
3109 if (info->relocatable && !globals->use_rel)
b34976b6 3110 return TRUE;
b491616a 3111
252b5132
RH
3112 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
3113 sym_hashes = elf_sym_hashes (input_bfd);
3114
3115 rel = relocs;
3116 relend = relocs + input_section->reloc_count;
3117 for (; rel < relend; rel++)
3118 {
ba96a88f
NC
3119 int r_type;
3120 reloc_howto_type * howto;
3121 unsigned long r_symndx;
3122 Elf_Internal_Sym * sym;
3123 asection * sec;
252b5132 3124 struct elf_link_hash_entry * h;
ba96a88f
NC
3125 bfd_vma relocation;
3126 bfd_reloc_status_type r;
3127 arelent bfd_reloc;
f21f3fe0 3128
252b5132 3129 r_symndx = ELF32_R_SYM (rel->r_info);
ba96a88f 3130 r_type = ELF32_R_TYPE (rel->r_info);
b32d3aa2 3131 r_type = arm_real_reloc_type (globals, r_type);
252b5132 3132
ba96a88f
NC
3133 if ( r_type == R_ARM_GNU_VTENTRY
3134 || r_type == R_ARM_GNU_VTINHERIT)
252b5132
RH
3135 continue;
3136
b32d3aa2 3137 bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
ba96a88f 3138 howto = bfd_reloc.howto;
252b5132 3139
4e7fd91e 3140 if (info->relocatable && globals->use_rel)
252b5132 3141 {
1049f94e 3142 /* This is a relocatable link. We don't have to change
252b5132
RH
3143 anything, unless the reloc is against a section symbol,
3144 in which case we have to adjust according to where the
3145 section symbol winds up in the output section. */
3146 if (r_symndx < symtab_hdr->sh_info)
3147 {
3148 sym = local_syms + r_symndx;
3149 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
3150 {
3151 sec = local_sections[r_symndx];
98c1d4aa 3152 arm_add_to_rel (input_bfd, contents + rel->r_offset,
dc810e39
AM
3153 howto,
3154 (bfd_signed_vma) (sec->output_offset
3155 + sym->st_value));
252b5132
RH
3156 }
3157 }
3158
3159 continue;
3160 }
3161
3162 /* This is a final link. */
3163 h = NULL;
3164 sym = NULL;
3165 sec = NULL;
9b485d32 3166
252b5132
RH
3167 if (r_symndx < symtab_hdr->sh_info)
3168 {
3169 sym = local_syms + r_symndx;
3170 sec = local_sections[r_symndx];
4e7fd91e 3171 if (globals->use_rel)
f8df10f4 3172 {
4e7fd91e
PB
3173 relocation = (sec->output_section->vma
3174 + sec->output_offset
3175 + sym->st_value);
3176 if ((sec->flags & SEC_MERGE)
3177 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
f8df10f4 3178 {
4e7fd91e
PB
3179 asection *msec;
3180 bfd_vma addend, value;
3181
3182 if (howto->rightshift)
3183 {
3184 (*_bfd_error_handler)
3185 (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
3186 input_bfd, input_section,
3187 (long) rel->r_offset, howto->name);
3188 return FALSE;
3189 }
f8df10f4 3190
4e7fd91e 3191 value = bfd_get_32 (input_bfd, contents + rel->r_offset);
f8df10f4 3192
4e7fd91e
PB
3193 /* Get the (signed) value from the instruction. */
3194 addend = value & howto->src_mask;
3195 if (addend & ((howto->src_mask + 1) >> 1))
3196 {
3197 bfd_signed_vma mask;
f8df10f4 3198
4e7fd91e
PB
3199 mask = -1;
3200 mask &= ~ howto->src_mask;
3201 addend |= mask;
3202 }
3203 msec = sec;
3204 addend =
3205 _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
3206 - relocation;
3207 addend += msec->output_section->vma + msec->output_offset;
3208 value = (value & ~ howto->dst_mask) | (addend & howto->dst_mask);
3209 bfd_put_32 (input_bfd, value, contents + rel->r_offset);
f8df10f4 3210 }
f8df10f4 3211 }
4e7fd91e
PB
3212 else
3213 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
252b5132
RH
3214 }
3215 else
3216 {
560e09e9
NC
3217 bfd_boolean warned;
3218 bfd_boolean unresolved_reloc;
3219
b2a8e766
AM
3220 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3221 r_symndx, symtab_hdr, sym_hashes,
3222 h, sec, relocation,
3223 unresolved_reloc, warned);
57e8b36a 3224
560e09e9 3225 if (unresolved_reloc || relocation != 0)
252b5132 3226 {
252b5132 3227 /* In these cases, we don't need the relocation value.
f21f3fe0 3228 We check specially because in some obscure cases
9b485d32 3229 sec->output_section will be NULL. */
252b5132
RH
3230 switch (r_type)
3231 {
3232 case R_ARM_PC24:
5b5bb741
PB
3233#ifndef OLD_ARM_ABI
3234 case R_ARM_CALL:
3235 case R_ARM_JUMP24:
ee06dc07 3236 case R_ARM_PREL31:
5b5bb741 3237#endif
252b5132 3238 case R_ARM_ABS32:
6a360bf4 3239 case R_ARM_THM_PC22:
ecb2d096
DJ
3240 case R_ARM_PLT32:
3241
252b5132 3242 if (info->shared
f5385ebf
AM
3243 && ((!info->symbolic && h->dynindx != -1)
3244 || !h->def_regular)
5e681ec4 3245 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
05924f36
PB
3246 && ((input_section->flags & SEC_ALLOC) != 0
3247 /* DWARF will emit R_ARM_ABS32 relocations in its
3248 sections against symbols defined externally
3249 in shared libraries. We can't do anything
3250 with them here. */
3251 || ((input_section->flags & SEC_DEBUGGING) != 0
f5385ebf 3252 && h->def_dynamic))
252b5132 3253 )
560e09e9 3254 relocation = 0;
252b5132 3255 break;
f21f3fe0 3256
252b5132 3257 case R_ARM_GOTPC:
560e09e9 3258 relocation = 0;
252b5132 3259 break;
f21f3fe0 3260
252b5132 3261 case R_ARM_GOT32:
eb043451
PB
3262#ifndef OLD_ARM_ABI
3263 case R_ARM_GOT_PREL:
3264#endif
50d6c878 3265 if ((WILL_CALL_FINISH_DYNAMIC_SYMBOL
560e09e9 3266 (elf_hash_table (info)->dynamic_sections_created,
50d6c878
DJ
3267 info->shared, h))
3268 && (!info->shared
252b5132 3269 || (!info->symbolic && h->dynindx != -1)
f5385ebf 3270 || !h->def_regular))
560e09e9 3271 relocation = 0;
252b5132 3272 break;
f21f3fe0 3273
252b5132 3274 default:
560e09e9
NC
3275 if (unresolved_reloc)
3276 _bfd_error_handler
d003868e
AM
3277 (_("%B(%A): warning: unresolvable relocation %d against symbol `%s'"),
3278 input_bfd, input_section,
560e09e9 3279 r_type,
d003868e 3280 h->root.root.string);
560e09e9 3281 break;
252b5132 3282 }
252b5132
RH
3283 }
3284 }
3285
3286 if (h != NULL)
3287 name = h->root.root.string;
3288 else
3289 {
3290 name = (bfd_elf_string_from_elf_section
3291 (input_bfd, symtab_hdr->sh_link, sym->st_name));
3292 if (name == NULL || *name == '\0')
3293 name = bfd_section_name (input_bfd, sec);
3294 }
f21f3fe0 3295
252b5132
RH
3296 r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
3297 input_section, contents, rel,
3298 relocation, info, sec, name,
3299 (h ? ELF_ST_TYPE (h->type) :
780a67af 3300 ELF_ST_TYPE (sym->st_info)), h);
252b5132
RH
3301
3302 if (r != bfd_reloc_ok)
3303 {
3304 const char * msg = (const char *) 0;
3305
3306 switch (r)
3307 {
3308 case bfd_reloc_overflow:
cf919dfd
PB
3309 /* If the overflowing reloc was to an undefined symbol,
3310 we have already printed one error message and there
3311 is no point complaining again. */
3312 if ((! h ||
3313 h->root.type != bfd_link_hash_undefined)
3314 && (!((*info->callbacks->reloc_overflow)
dfeffb9f
L
3315 (info, (h ? &h->root : NULL), name, howto->name,
3316 (bfd_vma) 0, input_bfd, input_section,
3317 rel->r_offset))))
b34976b6 3318 return FALSE;
252b5132
RH
3319 break;
3320
3321 case bfd_reloc_undefined:
3322 if (!((*info->callbacks->undefined_symbol)
3323 (info, name, input_bfd, input_section,
b34976b6
AM
3324 rel->r_offset, TRUE)))
3325 return FALSE;
252b5132
RH
3326 break;
3327
3328 case bfd_reloc_outofrange:
9b485d32 3329 msg = _("internal error: out of range error");
252b5132
RH
3330 goto common_error;
3331
3332 case bfd_reloc_notsupported:
9b485d32 3333 msg = _("internal error: unsupported relocation error");
252b5132
RH
3334 goto common_error;
3335
3336 case bfd_reloc_dangerous:
9b485d32 3337 msg = _("internal error: dangerous error");
252b5132
RH
3338 goto common_error;
3339
3340 default:
9b485d32 3341 msg = _("internal error: unknown error");
252b5132
RH
3342 /* fall through */
3343
3344 common_error:
3345 if (!((*info->callbacks->warning)
3346 (info, msg, name, input_bfd, input_section,
3347 rel->r_offset)))
b34976b6 3348 return FALSE;
252b5132
RH
3349 break;
3350 }
3351 }
3352 }
3353
b34976b6 3354 return TRUE;
252b5132
RH
3355}
3356
c178919b
NC
3357/* Set the right machine number. */
3358
3359static bfd_boolean
57e8b36a 3360elf32_arm_object_p (bfd *abfd)
c178919b 3361{
5a6c6817 3362 unsigned int mach;
57e8b36a 3363
5a6c6817 3364 mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
c178919b 3365
5a6c6817
NC
3366 if (mach != bfd_mach_arm_unknown)
3367 bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
3368
3369 else if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
3370 bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
e16bb312 3371
e16bb312 3372 else
5a6c6817 3373 bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
c178919b
NC
3374
3375 return TRUE;
3376}
3377
fc830a83 3378/* Function to keep ARM specific flags in the ELF header. */
3c9458e9 3379
b34976b6 3380static bfd_boolean
57e8b36a 3381elf32_arm_set_private_flags (bfd *abfd, flagword flags)
252b5132
RH
3382{
3383 if (elf_flags_init (abfd)
3384 && elf_elfheader (abfd)->e_flags != flags)
3385 {
fc830a83
NC
3386 if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
3387 {
fd2ec330 3388 if (flags & EF_ARM_INTERWORK)
d003868e
AM
3389 (*_bfd_error_handler)
3390 (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
3391 abfd);
fc830a83 3392 else
d003868e
AM
3393 _bfd_error_handler
3394 (_("Warning: Clearing the interworking flag of %B due to outside request"),
3395 abfd);
fc830a83 3396 }
252b5132
RH
3397 }
3398 else
3399 {
3400 elf_elfheader (abfd)->e_flags = flags;
b34976b6 3401 elf_flags_init (abfd) = TRUE;
252b5132
RH
3402 }
3403
b34976b6 3404 return TRUE;
252b5132
RH
3405}
3406
fc830a83 3407/* Copy backend specific data from one object module to another. */
9b485d32 3408
b34976b6 3409static bfd_boolean
57e8b36a 3410elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
252b5132
RH
3411{
3412 flagword in_flags;
3413 flagword out_flags;
3414
fc830a83 3415 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
252b5132 3416 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 3417 return TRUE;
252b5132 3418
fc830a83 3419 in_flags = elf_elfheader (ibfd)->e_flags;
252b5132
RH
3420 out_flags = elf_elfheader (obfd)->e_flags;
3421
fc830a83
NC
3422 if (elf_flags_init (obfd)
3423 && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
3424 && in_flags != out_flags)
252b5132 3425 {
252b5132 3426 /* Cannot mix APCS26 and APCS32 code. */
fd2ec330 3427 if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
b34976b6 3428 return FALSE;
252b5132
RH
3429
3430 /* Cannot mix float APCS and non-float APCS code. */
fd2ec330 3431 if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
b34976b6 3432 return FALSE;
252b5132
RH
3433
3434 /* If the src and dest have different interworking flags
3435 then turn off the interworking bit. */
fd2ec330 3436 if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
252b5132 3437 {
fd2ec330 3438 if (out_flags & EF_ARM_INTERWORK)
d003868e
AM
3439 _bfd_error_handler
3440 (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
3441 obfd, ibfd);
252b5132 3442
fd2ec330 3443 in_flags &= ~EF_ARM_INTERWORK;
252b5132 3444 }
1006ba19
PB
3445
3446 /* Likewise for PIC, though don't warn for this case. */
fd2ec330
PB
3447 if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
3448 in_flags &= ~EF_ARM_PIC;
252b5132
RH
3449 }
3450
3451 elf_elfheader (obfd)->e_flags = in_flags;
b34976b6 3452 elf_flags_init (obfd) = TRUE;
252b5132 3453
94a3258f
PB
3454 /* Also copy the EI_OSABI field. */
3455 elf_elfheader (obfd)->e_ident[EI_OSABI] =
3456 elf_elfheader (ibfd)->e_ident[EI_OSABI];
3457
b34976b6 3458 return TRUE;
252b5132
RH
3459}
3460
3461/* Merge backend specific data from an object file to the output
3462 object file when linking. */
9b485d32 3463
b34976b6 3464static bfd_boolean
57e8b36a 3465elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
252b5132
RH
3466{
3467 flagword out_flags;
3468 flagword in_flags;
b34976b6 3469 bfd_boolean flags_compatible = TRUE;
cf919dfd 3470 asection *sec;
252b5132 3471
9b485d32 3472 /* Check if we have the same endianess. */
82e51918 3473 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
b34976b6 3474 return FALSE;
1fe494a5 3475
252b5132
RH
3476 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3477 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 3478 return TRUE;
252b5132 3479
252b5132
RH
3480 /* The input BFD must have had its flags initialised. */
3481 /* The following seems bogus to me -- The flags are initialized in
3482 the assembler but I don't think an elf_flags_init field is
9b485d32 3483 written into the object. */
252b5132
RH
3484 /* BFD_ASSERT (elf_flags_init (ibfd)); */
3485
3486 in_flags = elf_elfheader (ibfd)->e_flags;
3487 out_flags = elf_elfheader (obfd)->e_flags;
3488
3489 if (!elf_flags_init (obfd))
3490 {
fe077fa6
NC
3491 /* If the input is the default architecture and had the default
3492 flags then do not bother setting the flags for the output
3493 architecture, instead allow future merges to do this. If no
3494 future merges ever set these flags then they will retain their
3495 uninitialised values, which surprise surprise, correspond
252b5132 3496 to the default values. */
fe077fa6
NC
3497 if (bfd_get_arch_info (ibfd)->the_default
3498 && elf_elfheader (ibfd)->e_flags == 0)
b34976b6 3499 return TRUE;
252b5132 3500
b34976b6 3501 elf_flags_init (obfd) = TRUE;
252b5132
RH
3502 elf_elfheader (obfd)->e_flags = in_flags;
3503
3504 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
3505 && bfd_get_arch_info (obfd)->the_default)
3506 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
3507
b34976b6 3508 return TRUE;
252b5132
RH
3509 }
3510
5a6c6817
NC
3511 /* Determine what should happen if the input ARM architecture
3512 does not match the output ARM architecture. */
3513 if (! bfd_arm_merge_machines (ibfd, obfd))
3514 return FALSE;
e16bb312 3515
1006ba19 3516 /* Identical flags must be compatible. */
252b5132 3517 if (in_flags == out_flags)
b34976b6 3518 return TRUE;
252b5132 3519
35a0f415
DJ
3520 /* Check to see if the input BFD actually contains any sections. If
3521 not, its flags may not have been initialised either, but it
3522 cannot actually cause any incompatibility. Do not short-circuit
3523 dynamic objects; their section list may be emptied by
d1f161ea 3524 elf_link_add_object_symbols.
35a0f415 3525
d1f161ea
NC
3526 Also check to see if there are no code sections in the input.
3527 In this case there is no need to check for code specific flags.
3528 XXX - do we need to worry about floating-point format compatability
3529 in data sections ? */
35a0f415 3530 if (!(ibfd->flags & DYNAMIC))
cf919dfd 3531 {
35a0f415 3532 bfd_boolean null_input_bfd = TRUE;
d1f161ea 3533 bfd_boolean only_data_sections = TRUE;
35a0f415
DJ
3534
3535 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
cf919dfd 3536 {
35a0f415
DJ
3537 /* Ignore synthetic glue sections. */
3538 if (strcmp (sec->name, ".glue_7")
3539 && strcmp (sec->name, ".glue_7t"))
3540 {
d1f161ea
NC
3541 if ((bfd_get_section_flags (ibfd, sec)
3542 & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
3543 == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
3544 only_data_sections = FALSE;
3545
35a0f415
DJ
3546 null_input_bfd = FALSE;
3547 break;
3548 }
cf919dfd 3549 }
d1f161ea
NC
3550
3551 if (null_input_bfd || only_data_sections)
35a0f415 3552 return TRUE;
cf919dfd 3553 }
cf919dfd 3554
252b5132 3555 /* Complain about various flag mismatches. */
fc830a83
NC
3556 if (EF_ARM_EABI_VERSION (in_flags) != EF_ARM_EABI_VERSION (out_flags))
3557 {
d003868e 3558 _bfd_error_handler
3656d5e3 3559 (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
d003868e
AM
3560 ibfd, obfd,
3561 (in_flags & EF_ARM_EABIMASK) >> 24,
3562 (out_flags & EF_ARM_EABIMASK) >> 24);
b34976b6 3563 return FALSE;
fc830a83 3564 }
252b5132 3565
1006ba19
PB
3566 /* Not sure what needs to be checked for EABI versions >= 1. */
3567 if (EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
3568 {
fd2ec330 3569 if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
1006ba19 3570 {
d003868e
AM
3571 _bfd_error_handler
3572 (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
3573 ibfd, obfd,
3574 in_flags & EF_ARM_APCS_26 ? 26 : 32,
3575 out_flags & EF_ARM_APCS_26 ? 26 : 32);
b34976b6 3576 flags_compatible = FALSE;
1006ba19 3577 }
252b5132 3578
fd2ec330 3579 if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
1006ba19 3580 {
5eefb65f 3581 if (in_flags & EF_ARM_APCS_FLOAT)
d003868e
AM
3582 _bfd_error_handler
3583 (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"),
3584 ibfd, obfd);
5eefb65f 3585 else
d003868e
AM
3586 _bfd_error_handler
3587 (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"),
3588 ibfd, obfd);
63b0f745 3589
b34976b6 3590 flags_compatible = FALSE;
1006ba19 3591 }
252b5132 3592
96a846ea 3593 if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
1006ba19 3594 {
96a846ea 3595 if (in_flags & EF_ARM_VFP_FLOAT)
d003868e
AM
3596 _bfd_error_handler
3597 (_("ERROR: %B uses VFP instructions, whereas %B does not"),
3598 ibfd, obfd);
5eefb65f 3599 else
d003868e
AM
3600 _bfd_error_handler
3601 (_("ERROR: %B uses FPA instructions, whereas %B does not"),
3602 ibfd, obfd);
fde78edd
NC
3603
3604 flags_compatible = FALSE;
3605 }
3606
3607 if ((in_flags & EF_ARM_MAVERICK_FLOAT) != (out_flags & EF_ARM_MAVERICK_FLOAT))
3608 {
3609 if (in_flags & EF_ARM_MAVERICK_FLOAT)
d003868e
AM
3610 _bfd_error_handler
3611 (_("ERROR: %B uses Maverick instructions, whereas %B does not"),
3612 ibfd, obfd);
fde78edd 3613 else
d003868e
AM
3614 _bfd_error_handler
3615 (_("ERROR: %B does not use Maverick instructions, whereas %B does"),
3616 ibfd, obfd);
63b0f745 3617
b34976b6 3618 flags_compatible = FALSE;
1006ba19 3619 }
96a846ea
RE
3620
3621#ifdef EF_ARM_SOFT_FLOAT
3622 if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
3623 {
3624 /* We can allow interworking between code that is VFP format
3625 layout, and uses either soft float or integer regs for
3626 passing floating point arguments and results. We already
3627 know that the APCS_FLOAT flags match; similarly for VFP
3628 flags. */
3629 if ((in_flags & EF_ARM_APCS_FLOAT) != 0
3630 || (in_flags & EF_ARM_VFP_FLOAT) == 0)
3631 {
3632 if (in_flags & EF_ARM_SOFT_FLOAT)
d003868e
AM
3633 _bfd_error_handler
3634 (_("ERROR: %B uses software FP, whereas %B uses hardware FP"),
3635 ibfd, obfd);
96a846ea 3636 else
d003868e
AM
3637 _bfd_error_handler
3638 (_("ERROR: %B uses hardware FP, whereas %B uses software FP"),
3639 ibfd, obfd);
96a846ea 3640
b34976b6 3641 flags_compatible = FALSE;
96a846ea
RE
3642 }
3643 }
ee43f35e 3644#endif
252b5132 3645
1006ba19 3646 /* Interworking mismatch is only a warning. */
fd2ec330 3647 if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
8f615d07 3648 {
e3c8793a
NC
3649 if (in_flags & EF_ARM_INTERWORK)
3650 {
d003868e
AM
3651 _bfd_error_handler
3652 (_("Warning: %B supports interworking, whereas %B does not"),
3653 ibfd, obfd);
e3c8793a
NC
3654 }
3655 else
3656 {
d003868e
AM
3657 _bfd_error_handler
3658 (_("Warning: %B does not support interworking, whereas %B does"),
3659 ibfd, obfd);
e3c8793a 3660 }
8f615d07 3661 }
252b5132 3662 }
63b0f745 3663
1006ba19 3664 return flags_compatible;
252b5132
RH
3665}
3666
9b485d32
NC
3667/* Display the flags field. */
3668
b34976b6 3669static bfd_boolean
57e8b36a 3670elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
252b5132 3671{
fc830a83
NC
3672 FILE * file = (FILE *) ptr;
3673 unsigned long flags;
252b5132
RH
3674
3675 BFD_ASSERT (abfd != NULL && ptr != NULL);
3676
3677 /* Print normal ELF private data. */
3678 _bfd_elf_print_private_bfd_data (abfd, ptr);
3679
fc830a83 3680 flags = elf_elfheader (abfd)->e_flags;
9b485d32
NC
3681 /* Ignore init flag - it may not be set, despite the flags field
3682 containing valid data. */
252b5132
RH
3683
3684 /* xgettext:c-format */
9b485d32 3685 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
252b5132 3686
fc830a83
NC
3687 switch (EF_ARM_EABI_VERSION (flags))
3688 {
3689 case EF_ARM_EABI_UNKNOWN:
4cc11e76 3690 /* The following flag bits are GNU extensions and not part of the
fc830a83
NC
3691 official ARM ELF extended ABI. Hence they are only decoded if
3692 the EABI version is not set. */
fd2ec330 3693 if (flags & EF_ARM_INTERWORK)
9b485d32 3694 fprintf (file, _(" [interworking enabled]"));
9a5aca8c 3695
fd2ec330 3696 if (flags & EF_ARM_APCS_26)
6c571f00 3697 fprintf (file, " [APCS-26]");
fc830a83 3698 else
6c571f00 3699 fprintf (file, " [APCS-32]");
9a5aca8c 3700
96a846ea
RE
3701 if (flags & EF_ARM_VFP_FLOAT)
3702 fprintf (file, _(" [VFP float format]"));
fde78edd
NC
3703 else if (flags & EF_ARM_MAVERICK_FLOAT)
3704 fprintf (file, _(" [Maverick float format]"));
96a846ea
RE
3705 else
3706 fprintf (file, _(" [FPA float format]"));
3707
fd2ec330 3708 if (flags & EF_ARM_APCS_FLOAT)
9b485d32 3709 fprintf (file, _(" [floats passed in float registers]"));
9a5aca8c 3710
fd2ec330 3711 if (flags & EF_ARM_PIC)
9b485d32 3712 fprintf (file, _(" [position independent]"));
fc830a83 3713
fd2ec330 3714 if (flags & EF_ARM_NEW_ABI)
9b485d32 3715 fprintf (file, _(" [new ABI]"));
9a5aca8c 3716
fd2ec330 3717 if (flags & EF_ARM_OLD_ABI)
9b485d32 3718 fprintf (file, _(" [old ABI]"));
9a5aca8c 3719
fd2ec330 3720 if (flags & EF_ARM_SOFT_FLOAT)
9b485d32 3721 fprintf (file, _(" [software FP]"));
9a5aca8c 3722
96a846ea
RE
3723 flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
3724 | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
fde78edd
NC
3725 | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT
3726 | EF_ARM_MAVERICK_FLOAT);
fc830a83 3727 break;
9a5aca8c 3728
fc830a83 3729 case EF_ARM_EABI_VER1:
9b485d32 3730 fprintf (file, _(" [Version1 EABI]"));
9a5aca8c 3731
fc830a83 3732 if (flags & EF_ARM_SYMSARESORTED)
9b485d32 3733 fprintf (file, _(" [sorted symbol table]"));
fc830a83 3734 else
9b485d32 3735 fprintf (file, _(" [unsorted symbol table]"));
9a5aca8c 3736
fc830a83
NC
3737 flags &= ~ EF_ARM_SYMSARESORTED;
3738 break;
9a5aca8c 3739
fd2ec330
PB
3740 case EF_ARM_EABI_VER2:
3741 fprintf (file, _(" [Version2 EABI]"));
3742
3743 if (flags & EF_ARM_SYMSARESORTED)
3744 fprintf (file, _(" [sorted symbol table]"));
3745 else
3746 fprintf (file, _(" [unsorted symbol table]"));
3747
3748 if (flags & EF_ARM_DYNSYMSUSESEGIDX)
3749 fprintf (file, _(" [dynamic symbols use segment index]"));
3750
3751 if (flags & EF_ARM_MAPSYMSFIRST)
3752 fprintf (file, _(" [mapping symbols precede others]"));
3753
99e4ae17 3754 flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
fd2ec330
PB
3755 | EF_ARM_MAPSYMSFIRST);
3756 break;
3757
d507cf36
PB
3758 case EF_ARM_EABI_VER3:
3759 fprintf (file, _(" [Version3 EABI]"));
8cb51566
PB
3760 break;
3761
3762 case EF_ARM_EABI_VER4:
3763 fprintf (file, _(" [Version4 EABI]"));
d507cf36
PB
3764
3765 if (flags & EF_ARM_BE8)
3766 fprintf (file, _(" [BE8]"));
3767
3768 if (flags & EF_ARM_LE8)
3769 fprintf (file, _(" [LE8]"));
3770
3771 flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
3772 break;
3773
fc830a83 3774 default:
9b485d32 3775 fprintf (file, _(" <EABI version unrecognised>"));
fc830a83
NC
3776 break;
3777 }
252b5132 3778
fc830a83 3779 flags &= ~ EF_ARM_EABIMASK;
252b5132 3780
fc830a83 3781 if (flags & EF_ARM_RELEXEC)
9b485d32 3782 fprintf (file, _(" [relocatable executable]"));
252b5132 3783
fc830a83 3784 if (flags & EF_ARM_HASENTRY)
9b485d32 3785 fprintf (file, _(" [has entry point]"));
252b5132 3786
fc830a83
NC
3787 flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
3788
3789 if (flags)
9b485d32 3790 fprintf (file, _("<Unrecognised flag bits set>"));
9a5aca8c 3791
252b5132
RH
3792 fputc ('\n', file);
3793
b34976b6 3794 return TRUE;
252b5132
RH
3795}
3796
3797static int
57e8b36a 3798elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
252b5132 3799{
2f0ca46a
NC
3800 switch (ELF_ST_TYPE (elf_sym->st_info))
3801 {
3802 case STT_ARM_TFUNC:
3803 return ELF_ST_TYPE (elf_sym->st_info);
ce855c42 3804
2f0ca46a
NC
3805 case STT_ARM_16BIT:
3806 /* If the symbol is not an object, return the STT_ARM_16BIT flag.
3807 This allows us to distinguish between data used by Thumb instructions
3808 and non-data (which is probably code) inside Thumb regions of an
3809 executable. */
3810 if (type != STT_OBJECT)
3811 return ELF_ST_TYPE (elf_sym->st_info);
3812 break;
9a5aca8c 3813
ce855c42
NC
3814 default:
3815 break;
2f0ca46a
NC
3816 }
3817
3818 return type;
252b5132 3819}
f21f3fe0 3820
252b5132 3821static asection *
57e8b36a
NC
3822elf32_arm_gc_mark_hook (asection * sec,
3823 struct bfd_link_info * info ATTRIBUTE_UNUSED,
3824 Elf_Internal_Rela * rel,
3825 struct elf_link_hash_entry * h,
3826 Elf_Internal_Sym * sym)
252b5132
RH
3827{
3828 if (h != NULL)
3829 {
3830 switch (ELF32_R_TYPE (rel->r_info))
3831 {
3832 case R_ARM_GNU_VTINHERIT:
3833 case R_ARM_GNU_VTENTRY:
3834 break;
3835
3836 default:
3837 switch (h->root.type)
3838 {
3839 case bfd_link_hash_defined:
3840 case bfd_link_hash_defweak:
3841 return h->root.u.def.section;
3842
3843 case bfd_link_hash_common:
3844 return h->root.u.c.p->section;
e049a0de
ILT
3845
3846 default:
3847 break;
252b5132
RH
3848 }
3849 }
3850 }
3851 else
1e2f5b6e 3852 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
9ad5cbcf 3853
252b5132
RH
3854 return NULL;
3855}
3856
780a67af
NC
3857/* Update the got entry reference counts for the section being removed. */
3858
b34976b6 3859static bfd_boolean
57e8b36a
NC
3860elf32_arm_gc_sweep_hook (bfd * abfd ATTRIBUTE_UNUSED,
3861 struct bfd_link_info * info ATTRIBUTE_UNUSED,
3862 asection * sec ATTRIBUTE_UNUSED,
3863 const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED)
252b5132 3864{
5e681ec4
PB
3865 Elf_Internal_Shdr *symtab_hdr;
3866 struct elf_link_hash_entry **sym_hashes;
3867 bfd_signed_vma *local_got_refcounts;
3868 const Elf_Internal_Rela *rel, *relend;
eb043451
PB
3869 struct elf32_arm_link_hash_table * globals;
3870
3871 globals = elf32_arm_hash_table (info);
5e681ec4
PB
3872
3873 elf_section_data (sec)->local_dynrel = NULL;
3874
3875 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3876 sym_hashes = elf_sym_hashes (abfd);
3877 local_got_refcounts = elf_local_got_refcounts (abfd);
3878
3879 relend = relocs + sec->reloc_count;
3880 for (rel = relocs; rel < relend; rel++)
eb043451 3881 {
3eb128b2
AM
3882 unsigned long r_symndx;
3883 struct elf_link_hash_entry *h = NULL;
eb043451 3884 int r_type;
5e681ec4 3885
3eb128b2
AM
3886 r_symndx = ELF32_R_SYM (rel->r_info);
3887 if (r_symndx >= symtab_hdr->sh_info)
3888 {
3889 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3890 while (h->root.type == bfd_link_hash_indirect
3891 || h->root.type == bfd_link_hash_warning)
3892 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3893 }
3894
eb043451 3895 r_type = ELF32_R_TYPE (rel->r_info);
b6ee372a 3896#ifndef OLD_ARM_ABI
eb043451 3897 r_type = arm_real_reloc_type (globals, r_type);
b6ee372a 3898#endif
eb043451
PB
3899 switch (r_type)
3900 {
3901 case R_ARM_GOT32:
3902#ifndef OLD_ARM_ABI
3903 case R_ARM_GOT_PREL:
3904#endif
3eb128b2 3905 if (h != NULL)
eb043451 3906 {
eb043451
PB
3907 if (h->got.refcount > 0)
3908 h->got.refcount -= 1;
3909 }
3910 else if (local_got_refcounts != NULL)
3911 {
3912 if (local_got_refcounts[r_symndx] > 0)
3913 local_got_refcounts[r_symndx] -= 1;
3914 }
3915 break;
3916
3917 case R_ARM_ABS32:
3918 case R_ARM_REL32:
3919 case R_ARM_PC24:
3920 case R_ARM_PLT32:
3921#ifndef OLD_ARM_ABI
5b5bb741
PB
3922 case R_ARM_CALL:
3923 case R_ARM_JUMP24:
eb043451
PB
3924 case R_ARM_PREL31:
3925#endif
b7693d02
DJ
3926 case R_ARM_THM_PC22:
3927 /* Should the interworking branches be here also? */
3928
3eb128b2 3929 if (h != NULL)
eb043451
PB
3930 {
3931 struct elf32_arm_link_hash_entry *eh;
3932 struct elf32_arm_relocs_copied **pp;
3933 struct elf32_arm_relocs_copied *p;
5e681ec4 3934
b7693d02 3935 eh = (struct elf32_arm_link_hash_entry *) h;
5e681ec4 3936
eb043451 3937 if (h->plt.refcount > 0)
b7693d02
DJ
3938 {
3939 h->plt.refcount -= 1;
3940 if (ELF32_R_TYPE (rel->r_info) == R_ARM_THM_PC22)
3941 eh->plt_thumb_refcount--;
3942 }
5e681ec4 3943
eb043451 3944 if (r_type == R_ARM_ABS32
eb043451
PB
3945 || r_type == R_ARM_REL32)
3946 {
eb043451
PB
3947 for (pp = &eh->relocs_copied; (p = *pp) != NULL;
3948 pp = &p->next)
3949 if (p->section == sec)
3950 {
3951 p->count -= 1;
3952 if (p->count == 0)
3953 *pp = p->next;
3954 break;
3955 }
3956 }
3957 }
3958 break;
5e681ec4 3959
eb043451
PB
3960 default:
3961 break;
3962 }
3963 }
5e681ec4 3964
b34976b6 3965 return TRUE;
252b5132
RH
3966}
3967
780a67af
NC
3968/* Look through the relocs for a section during the first phase. */
3969
b34976b6 3970static bfd_boolean
57e8b36a
NC
3971elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
3972 asection *sec, const Elf_Internal_Rela *relocs)
252b5132 3973{
b34976b6
AM
3974 Elf_Internal_Shdr *symtab_hdr;
3975 struct elf_link_hash_entry **sym_hashes;
3976 struct elf_link_hash_entry **sym_hashes_end;
3977 const Elf_Internal_Rela *rel;
3978 const Elf_Internal_Rela *rel_end;
3979 bfd *dynobj;
5e681ec4 3980 asection *sreloc;
b34976b6 3981 bfd_vma *local_got_offsets;
5e681ec4 3982 struct elf32_arm_link_hash_table *htab;
9a5aca8c 3983
1049f94e 3984 if (info->relocatable)
b34976b6 3985 return TRUE;
9a5aca8c 3986
5e681ec4
PB
3987 htab = elf32_arm_hash_table (info);
3988 sreloc = NULL;
9a5aca8c 3989
67687978
PB
3990 /* Create dynamic sections for relocatable executables so that we can
3991 copy relocations. */
3992 if (htab->root.is_relocatable_executable
3993 && ! htab->root.dynamic_sections_created)
3994 {
3995 if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
3996 return FALSE;
3997 }
3998
252b5132
RH
3999 dynobj = elf_hash_table (info)->dynobj;
4000 local_got_offsets = elf_local_got_offsets (abfd);
f21f3fe0 4001
252b5132
RH
4002 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4003 sym_hashes = elf_sym_hashes (abfd);
9b485d32
NC
4004 sym_hashes_end = sym_hashes
4005 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
4006
252b5132
RH
4007 if (!elf_bad_symtab (abfd))
4008 sym_hashes_end -= symtab_hdr->sh_info;
9b485d32 4009
252b5132
RH
4010 rel_end = relocs + sec->reloc_count;
4011 for (rel = relocs; rel < rel_end; rel++)
4012 {
4013 struct elf_link_hash_entry *h;
b7693d02 4014 struct elf32_arm_link_hash_entry *eh;
252b5132 4015 unsigned long r_symndx;
eb043451 4016 int r_type;
9a5aca8c 4017
252b5132 4018 r_symndx = ELF32_R_SYM (rel->r_info);
eb043451
PB
4019 r_type = ELF32_R_TYPE (rel->r_info);
4020#ifndef OLD_ARM_ABI
4021 r_type = arm_real_reloc_type (htab, r_type);
4022#endif
252b5132
RH
4023 if (r_symndx < symtab_hdr->sh_info)
4024 h = NULL;
4025 else
4026 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
9a5aca8c 4027
b7693d02
DJ
4028 eh = (struct elf32_arm_link_hash_entry *) h;
4029
eb043451 4030 switch (r_type)
252b5132 4031 {
5e681ec4 4032 case R_ARM_GOT32:
eb043451
PB
4033#ifndef OLD_ARM_ABI
4034 case R_ARM_GOT_PREL:
4035#endif
5e681ec4 4036 /* This symbol requires a global offset table entry. */
252b5132
RH
4037 if (h != NULL)
4038 {
5e681ec4 4039 h->got.refcount++;
252b5132
RH
4040 }
4041 else
4042 {
5e681ec4
PB
4043 bfd_signed_vma *local_got_refcounts;
4044
4045 /* This is a global offset table entry for a local symbol. */
4046 local_got_refcounts = elf_local_got_refcounts (abfd);
4047 if (local_got_refcounts == NULL)
252b5132 4048 {
dc810e39 4049 bfd_size_type size;
252b5132 4050
dc810e39 4051 size = symtab_hdr->sh_info;
57e8b36a
NC
4052 size *= (sizeof (bfd_signed_vma) + sizeof (char));
4053 local_got_refcounts = bfd_zalloc (abfd, size);
5e681ec4 4054 if (local_got_refcounts == NULL)
b34976b6 4055 return FALSE;
5e681ec4 4056 elf_local_got_refcounts (abfd) = local_got_refcounts;
252b5132 4057 }
5e681ec4 4058 local_got_refcounts[r_symndx] += 1;
252b5132 4059 }
eb043451
PB
4060 if (r_type == R_ARM_GOT32)
4061 break;
4062 /* Fall through. */
252b5132 4063
5e681ec4
PB
4064 case R_ARM_GOTOFF:
4065 case R_ARM_GOTPC:
4066 if (htab->sgot == NULL)
4067 {
4068 if (htab->root.dynobj == NULL)
4069 htab->root.dynobj = abfd;
4070 if (!create_got_section (htab->root.dynobj, info))
4071 return FALSE;
4072 }
252b5132
RH
4073 break;
4074
4075 case R_ARM_ABS32:
4076 case R_ARM_REL32:
4077 case R_ARM_PC24:
7359ea65 4078 case R_ARM_PLT32:
eb043451 4079#ifndef OLD_ARM_ABI
5b5bb741
PB
4080 case R_ARM_CALL:
4081 case R_ARM_JUMP24:
eb043451
PB
4082 case R_ARM_PREL31:
4083#endif
b7693d02
DJ
4084 case R_ARM_THM_PC22:
4085 /* Should the interworking branches be listed here? */
7359ea65 4086 if (h != NULL)
5e681ec4
PB
4087 {
4088 /* If this reloc is in a read-only section, we might
4089 need a copy reloc. We can't check reliably at this
4090 stage whether the section is read-only, as input
4091 sections have not yet been mapped to output sections.
4092 Tentatively set the flag for now, and correct in
4093 adjust_dynamic_symbol. */
7359ea65 4094 if (!info->shared)
f5385ebf 4095 h->non_got_ref = 1;
7359ea65 4096
5e681ec4 4097 /* We may need a .plt entry if the function this reloc
c84cd8ee
DJ
4098 refers to is in a different object. We can't tell for
4099 sure yet, because something later might force the
4100 symbol local. */
eb043451 4101 if (r_type == R_ARM_PC24
5b5bb741
PB
4102#ifndef OLD_ARM_ABI
4103 || r_type == R_ARM_CALL
4104 || r_type == R_ARM_JUMP24
ee06dc07 4105 || r_type == R_ARM_PREL31
5b5bb741 4106#endif
b7693d02
DJ
4107 || r_type == R_ARM_PLT32
4108 || r_type == R_ARM_THM_PC22)
f5385ebf 4109 h->needs_plt = 1;
4f199be3
DJ
4110
4111 /* If we create a PLT entry, this relocation will reference
4112 it, even if it's an ABS32 relocation. */
4113 h->plt.refcount += 1;
b7693d02
DJ
4114
4115 if (r_type == R_ARM_THM_PC22)
4116 eh->plt_thumb_refcount += 1;
5e681ec4
PB
4117 }
4118
67687978
PB
4119 /* If we are creating a shared library or relocatable executable,
4120 and this is a reloc against a global symbol, or a non PC
4121 relative reloc against a local symbol, then we need to copy
4122 the reloc into the shared library. However, if we are linking
4123 with -Bsymbolic, we do not need to copy a reloc against a
252b5132
RH
4124 global symbol which is defined in an object we are
4125 including in the link (i.e., DEF_REGULAR is set). At
4126 this point we have not seen all the input files, so it is
4127 possible that DEF_REGULAR is not set now but will be set
4128 later (it is never cleared). We account for that
4129 possibility below by storing information in the
5e681ec4 4130 relocs_copied field of the hash table entry. */
67687978 4131 if ((info->shared || htab->root.is_relocatable_executable)
5e681ec4 4132 && (sec->flags & SEC_ALLOC) != 0
eb043451
PB
4133 && ((r_type != R_ARM_PC24
4134 && r_type != R_ARM_PLT32
b6ee372a 4135#ifndef OLD_ARM_ABI
5b5bb741
PB
4136 && r_type != R_ARM_CALL
4137 && r_type != R_ARM_JUMP24
eb043451 4138 && r_type != R_ARM_PREL31
b6ee372a 4139#endif
b7693d02
DJ
4140 && r_type != R_ARM_REL32
4141 && r_type != R_ARM_THM_PC22)
5e681ec4
PB
4142 || (h != NULL
4143 && (! info->symbolic
f5385ebf 4144 || !h->def_regular))))
252b5132 4145 {
5e681ec4
PB
4146 struct elf32_arm_relocs_copied *p, **head;
4147
252b5132
RH
4148 /* When creating a shared object, we must copy these
4149 reloc types into the output file. We create a reloc
4150 section in dynobj and make room for this reloc. */
4151 if (sreloc == NULL)
4152 {
4153 const char * name;
4154
4155 name = (bfd_elf_string_from_elf_section
4156 (abfd,
4157 elf_elfheader (abfd)->e_shstrndx,
4158 elf_section_data (sec)->rel_hdr.sh_name));
4159 if (name == NULL)
b34976b6 4160 return FALSE;
252b5132
RH
4161
4162 BFD_ASSERT (strncmp (name, ".rel", 4) == 0
99e4ae17 4163 && strcmp (bfd_get_section_name (abfd, sec),
252b5132
RH
4164 name + 4) == 0);
4165
4166 sreloc = bfd_get_section_by_name (dynobj, name);
4167 if (sreloc == NULL)
4168 {
4169 flagword flags;
4170
4171 sreloc = bfd_make_section (dynobj, name);
4172 flags = (SEC_HAS_CONTENTS | SEC_READONLY
4173 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
e5a52504
MM
4174 if ((sec->flags & SEC_ALLOC) != 0
4175 /* BPABI objects never have dynamic
4176 relocations mapped. */
4177 && !htab->symbian_p)
252b5132
RH
4178 flags |= SEC_ALLOC | SEC_LOAD;
4179 if (sreloc == NULL
4180 || ! bfd_set_section_flags (dynobj, sreloc, flags)
4181 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
b34976b6 4182 return FALSE;
252b5132 4183 }
5e681ec4
PB
4184
4185 elf_section_data (sec)->sreloc = sreloc;
252b5132
RH
4186 }
4187
5e681ec4
PB
4188 /* If this is a global symbol, we count the number of
4189 relocations we need for this symbol. */
4190 if (h != NULL)
252b5132 4191 {
5e681ec4
PB
4192 head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied;
4193 }
4194 else
4195 {
4196 /* Track dynamic relocs needed for local syms too.
4197 We really need local syms available to do this
4198 easily. Oh well. */
57e8b36a 4199
5e681ec4
PB
4200 asection *s;
4201 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
4202 sec, r_symndx);
4203 if (s == NULL)
4204 return FALSE;
57e8b36a 4205
5e681ec4
PB
4206 head = ((struct elf32_arm_relocs_copied **)
4207 &elf_section_data (s)->local_dynrel);
4208 }
57e8b36a 4209
5e681ec4
PB
4210 p = *head;
4211 if (p == NULL || p->section != sec)
4212 {
4213 bfd_size_type amt = sizeof *p;
57e8b36a 4214
5e681ec4 4215 p = bfd_alloc (htab->root.dynobj, amt);
252b5132 4216 if (p == NULL)
5e681ec4
PB
4217 return FALSE;
4218 p->next = *head;
4219 *head = p;
4220 p->section = sec;
4221 p->count = 0;
252b5132 4222 }
57e8b36a 4223
eb043451 4224 if (r_type == R_ARM_ABS32
eb043451 4225 || r_type == R_ARM_REL32)
7359ea65 4226 p->count += 1;
252b5132
RH
4227 }
4228 break;
4229
4230 /* This relocation describes the C++ object vtable hierarchy.
4231 Reconstruct it for later use during GC. */
4232 case R_ARM_GNU_VTINHERIT:
c152c796 4233 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 4234 return FALSE;
252b5132 4235 break;
9a5aca8c 4236
252b5132
RH
4237 /* This relocation describes which C++ vtable entries are actually
4238 used. Record for later use during GC. */
4239 case R_ARM_GNU_VTENTRY:
c152c796 4240 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
b34976b6 4241 return FALSE;
252b5132
RH
4242 break;
4243 }
4244 }
f21f3fe0 4245
b34976b6 4246 return TRUE;
252b5132
RH
4247}
4248
b34976b6 4249static bfd_boolean
0367ecfb 4250is_arm_mapping_symbol_name (const char * name)
252b5132 4251{
0367ecfb
NC
4252 return (name != NULL)
4253 && (name[0] == '$')
4254 && ((name[1] == 'a') || (name[1] == 't') || (name[1] == 'd'))
4255 && (name[2] == 0);
4256}
f21f3fe0 4257
3c9458e9
NC
4258/* Treat mapping symbols as special target symbols. */
4259
4260static bfd_boolean
4261elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
4262{
4263 return is_arm_mapping_symbol_name (sym->name);
4264}
4265
0367ecfb
NC
4266/* This is a copy of elf_find_function() from elf.c except that
4267 ARM mapping symbols are ignored when looking for function names
4268 and STT_ARM_TFUNC is considered to a function type. */
252b5132 4269
0367ecfb
NC
4270static bfd_boolean
4271arm_elf_find_function (bfd * abfd ATTRIBUTE_UNUSED,
4272 asection * section,
4273 asymbol ** symbols,
4274 bfd_vma offset,
4275 const char ** filename_ptr,
4276 const char ** functionname_ptr)
4277{
4278 const char * filename = NULL;
4279 asymbol * func = NULL;
4280 bfd_vma low_func = 0;
4281 asymbol ** p;
252b5132
RH
4282
4283 for (p = symbols; *p != NULL; p++)
4284 {
4285 elf_symbol_type *q;
4286
4287 q = (elf_symbol_type *) *p;
4288
252b5132
RH
4289 switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
4290 {
4291 default:
4292 break;
4293 case STT_FILE:
4294 filename = bfd_asymbol_name (&q->symbol);
4295 break;
252b5132
RH
4296 case STT_FUNC:
4297 case STT_ARM_TFUNC:
0367ecfb
NC
4298 /* Skip $a and $t symbols. */
4299 if ((q->symbol.flags & BSF_LOCAL)
4300 && is_arm_mapping_symbol_name (q->symbol.name))
4301 continue;
4302 /* Fall through. */
4303 case STT_NOTYPE:
6b40fcba 4304 if (bfd_get_section (&q->symbol) == section
252b5132
RH
4305 && q->symbol.value >= low_func
4306 && q->symbol.value <= offset)
4307 {
4308 func = (asymbol *) q;
4309 low_func = q->symbol.value;
4310 }
4311 break;
4312 }
4313 }
4314
4315 if (func == NULL)
b34976b6 4316 return FALSE;
252b5132 4317
0367ecfb
NC
4318 if (filename_ptr)
4319 *filename_ptr = filename;
4320 if (functionname_ptr)
4321 *functionname_ptr = bfd_asymbol_name (func);
4322
4323 return TRUE;
4324}
4325
4326
4327/* Find the nearest line to a particular section and offset, for error
4328 reporting. This code is a duplicate of the code in elf.c, except
4329 that it uses arm_elf_find_function. */
4330
4331static bfd_boolean
4332elf32_arm_find_nearest_line (bfd * abfd,
4333 asection * section,
4334 asymbol ** symbols,
4335 bfd_vma offset,
4336 const char ** filename_ptr,
4337 const char ** functionname_ptr,
4338 unsigned int * line_ptr)
4339{
4340 bfd_boolean found = FALSE;
4341
4342 /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it. */
4343
4344 if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
4345 filename_ptr, functionname_ptr,
4346 line_ptr, 0,
4347 & elf_tdata (abfd)->dwarf2_find_line_info))
4348 {
4349 if (!*functionname_ptr)
4350 arm_elf_find_function (abfd, section, symbols, offset,
4351 *filename_ptr ? NULL : filename_ptr,
4352 functionname_ptr);
f21f3fe0 4353
0367ecfb
NC
4354 return TRUE;
4355 }
4356
4357 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
4358 & found, filename_ptr,
4359 functionname_ptr, line_ptr,
4360 & elf_tdata (abfd)->line_info))
4361 return FALSE;
4362
4363 if (found && (*functionname_ptr || *line_ptr))
4364 return TRUE;
4365
4366 if (symbols == NULL)
4367 return FALSE;
4368
4369 if (! arm_elf_find_function (abfd, section, symbols, offset,
4370 filename_ptr, functionname_ptr))
4371 return FALSE;
4372
4373 *line_ptr = 0;
b34976b6 4374 return TRUE;
252b5132
RH
4375}
4376
4377/* Adjust a symbol defined by a dynamic object and referenced by a
4378 regular object. The current definition is in some section of the
4379 dynamic object, but we're not including those sections. We have to
4380 change the definition to something the rest of the link can
4381 understand. */
4382
b34976b6 4383static bfd_boolean
57e8b36a
NC
4384elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
4385 struct elf_link_hash_entry * h)
252b5132
RH
4386{
4387 bfd * dynobj;
4388 asection * s;
4389 unsigned int power_of_two;
b7693d02 4390 struct elf32_arm_link_hash_entry * eh;
67687978 4391 struct elf32_arm_link_hash_table *globals;
252b5132 4392
67687978 4393 globals = elf32_arm_hash_table (info);
252b5132
RH
4394 dynobj = elf_hash_table (info)->dynobj;
4395
4396 /* Make sure we know what is going on here. */
4397 BFD_ASSERT (dynobj != NULL
f5385ebf 4398 && (h->needs_plt
f6e332e6 4399 || h->u.weakdef != NULL
f5385ebf
AM
4400 || (h->def_dynamic
4401 && h->ref_regular
4402 && !h->def_regular)));
252b5132 4403
b7693d02
DJ
4404 eh = (struct elf32_arm_link_hash_entry *) h;
4405
252b5132
RH
4406 /* If this is a function, put it in the procedure linkage table. We
4407 will fill in the contents of the procedure linkage table later,
4408 when we know the address of the .got section. */
b7693d02 4409 if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC
f5385ebf 4410 || h->needs_plt)
252b5132 4411 {
5e681ec4
PB
4412 if (h->plt.refcount <= 0
4413 || SYMBOL_CALLS_LOCAL (info, h)
4414 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4415 && h->root.type == bfd_link_hash_undefweak))
252b5132
RH
4416 {
4417 /* This case can occur if we saw a PLT32 reloc in an input
5e681ec4
PB
4418 file, but the symbol was never referred to by a dynamic
4419 object, or if all references were garbage collected. In
4420 such a case, we don't actually need to build a procedure
4421 linkage table, and we can just do a PC24 reloc instead. */
4422 h->plt.offset = (bfd_vma) -1;
b7693d02 4423 eh->plt_thumb_refcount = 0;
f5385ebf 4424 h->needs_plt = 0;
252b5132
RH
4425 }
4426
b34976b6 4427 return TRUE;
252b5132 4428 }
5e681ec4 4429 else
b7693d02
DJ
4430 {
4431 /* It's possible that we incorrectly decided a .plt reloc was
4432 needed for an R_ARM_PC24 or similar reloc to a non-function sym
4433 in check_relocs. We can't decide accurately between function
4434 and non-function syms in check-relocs; Objects loaded later in
4435 the link may change h->type. So fix it now. */
4436 h->plt.offset = (bfd_vma) -1;
4437 eh->plt_thumb_refcount = 0;
4438 }
252b5132
RH
4439
4440 /* If this is a weak symbol, and there is a real definition, the
4441 processor independent code will have arranged for us to see the
4442 real definition first, and we can just use the same value. */
f6e332e6 4443 if (h->u.weakdef != NULL)
252b5132 4444 {
f6e332e6
AM
4445 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
4446 || h->u.weakdef->root.type == bfd_link_hash_defweak);
4447 h->root.u.def.section = h->u.weakdef->root.u.def.section;
4448 h->root.u.def.value = h->u.weakdef->root.u.def.value;
b34976b6 4449 return TRUE;
252b5132
RH
4450 }
4451
4452 /* This is a reference to a symbol defined by a dynamic object which
4453 is not a function. */
4454
4455 /* If we are creating a shared library, we must presume that the
4456 only references to the symbol are via the global offset table.
4457 For such cases we need not do anything here; the relocations will
67687978
PB
4458 be handled correctly by relocate_section. Relocatable executables
4459 can reference data in shared objects directly, so we don't need to
4460 do anything here. */
4461 if (info->shared || globals->root.is_relocatable_executable)
b34976b6 4462 return TRUE;
252b5132
RH
4463
4464 /* We must allocate the symbol in our .dynbss section, which will
4465 become part of the .bss section of the executable. There will be
4466 an entry for this symbol in the .dynsym section. The dynamic
4467 object will contain position independent code, so all references
4468 from the dynamic object to this symbol will go through the global
4469 offset table. The dynamic linker will use the .dynsym entry to
4470 determine the address it must put in the global offset table, so
4471 both the dynamic object and the regular object will refer to the
4472 same memory location for the variable. */
252b5132
RH
4473 s = bfd_get_section_by_name (dynobj, ".dynbss");
4474 BFD_ASSERT (s != NULL);
4475
4476 /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
4477 copy the initial value out of the dynamic object and into the
4478 runtime process image. We need to remember the offset into the
4479 .rel.bss section we are going to use. */
4480 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
4481 {
4482 asection *srel;
4483
4484 srel = bfd_get_section_by_name (dynobj, ".rel.bss");
4485 BFD_ASSERT (srel != NULL);
eea6121a 4486 srel->size += sizeof (Elf32_External_Rel);
f5385ebf 4487 h->needs_copy = 1;
252b5132
RH
4488 }
4489
4490 /* We need to figure out the alignment required for this symbol. I
4491 have no idea how ELF linkers handle this. */
4492 power_of_two = bfd_log2 (h->size);
4493 if (power_of_two > 3)
4494 power_of_two = 3;
4495
4496 /* Apply the required alignment. */
eea6121a 4497 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
252b5132
RH
4498 if (power_of_two > bfd_get_section_alignment (dynobj, s))
4499 {
4500 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
b34976b6 4501 return FALSE;
252b5132
RH
4502 }
4503
4504 /* Define the symbol as being at this point in the section. */
4505 h->root.u.def.section = s;
eea6121a 4506 h->root.u.def.value = s->size;
252b5132
RH
4507
4508 /* Increment the section size to make room for the symbol. */
eea6121a 4509 s->size += h->size;
252b5132 4510
b34976b6 4511 return TRUE;
252b5132
RH
4512}
4513
5e681ec4
PB
4514/* Allocate space in .plt, .got and associated reloc sections for
4515 dynamic relocs. */
4516
4517static bfd_boolean
57e8b36a 4518allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
5e681ec4
PB
4519{
4520 struct bfd_link_info *info;
4521 struct elf32_arm_link_hash_table *htab;
4522 struct elf32_arm_link_hash_entry *eh;
4523 struct elf32_arm_relocs_copied *p;
4524
b7693d02
DJ
4525 eh = (struct elf32_arm_link_hash_entry *) h;
4526
5e681ec4
PB
4527 if (h->root.type == bfd_link_hash_indirect)
4528 return TRUE;
4529
4530 if (h->root.type == bfd_link_hash_warning)
4531 /* When warning symbols are created, they **replace** the "real"
4532 entry in the hash table, thus we never get to see the real
4533 symbol in a hash traversal. So look at it now. */
4534 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4535
4536 info = (struct bfd_link_info *) inf;
4537 htab = elf32_arm_hash_table (info);
4538
4539 if (htab->root.dynamic_sections_created
4540 && h->plt.refcount > 0)
4541 {
4542 /* Make sure this symbol is output as a dynamic symbol.
4543 Undefined weak syms won't yet be marked as dynamic. */
4544 if (h->dynindx == -1
f5385ebf 4545 && !h->forced_local)
5e681ec4 4546 {
c152c796 4547 if (! bfd_elf_link_record_dynamic_symbol (info, h))
5e681ec4
PB
4548 return FALSE;
4549 }
4550
4551 if (info->shared
7359ea65 4552 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
5e681ec4
PB
4553 {
4554 asection *s = htab->splt;
4555
4556 /* If this is the first .plt entry, make room for the special
4557 first entry. */
eea6121a 4558 if (s->size == 0)
e5a52504 4559 s->size += htab->plt_header_size;
5e681ec4 4560
eea6121a 4561 h->plt.offset = s->size;
5e681ec4 4562
b7693d02
DJ
4563 /* If we will insert a Thumb trampoline before this PLT, leave room
4564 for it. */
4565 if (!htab->symbian_p && eh->plt_thumb_refcount > 0)
4566 {
4567 h->plt.offset += PLT_THUMB_STUB_SIZE;
4568 s->size += PLT_THUMB_STUB_SIZE;
4569 }
4570
5e681ec4
PB
4571 /* If this symbol is not defined in a regular file, and we are
4572 not generating a shared library, then set the symbol to this
4573 location in the .plt. This is required to make function
4574 pointers compare as equal between the normal executable and
4575 the shared library. */
4576 if (! info->shared
f5385ebf 4577 && !h->def_regular)
5e681ec4
PB
4578 {
4579 h->root.u.def.section = s;
4580 h->root.u.def.value = h->plt.offset;
b7693d02
DJ
4581
4582 /* Make sure the function is not marked as Thumb, in case
4583 it is the target of an ABS32 relocation, which will
4584 point to the PLT entry. */
4585 if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
4586 h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
5e681ec4
PB
4587 }
4588
4589 /* Make room for this entry. */
e5a52504 4590 s->size += htab->plt_entry_size;
5e681ec4 4591
e5a52504 4592 if (!htab->symbian_p)
b7693d02
DJ
4593 {
4594 /* We also need to make an entry in the .got.plt section, which
4595 will be placed in the .got section by the linker script. */
4596 eh->plt_got_offset = htab->sgotplt->size;
4597 htab->sgotplt->size += 4;
4598 }
5e681ec4
PB
4599
4600 /* We also need to make an entry in the .rel.plt section. */
eea6121a 4601 htab->srelplt->size += sizeof (Elf32_External_Rel);
5e681ec4
PB
4602 }
4603 else
4604 {
4605 h->plt.offset = (bfd_vma) -1;
f5385ebf 4606 h->needs_plt = 0;
5e681ec4
PB
4607 }
4608 }
4609 else
4610 {
4611 h->plt.offset = (bfd_vma) -1;
f5385ebf 4612 h->needs_plt = 0;
5e681ec4
PB
4613 }
4614
4615 if (h->got.refcount > 0)
4616 {
4617 asection *s;
4618 bfd_boolean dyn;
4619
4620 /* Make sure this symbol is output as a dynamic symbol.
4621 Undefined weak syms won't yet be marked as dynamic. */
4622 if (h->dynindx == -1
f5385ebf 4623 && !h->forced_local)
5e681ec4 4624 {
c152c796 4625 if (! bfd_elf_link_record_dynamic_symbol (info, h))
5e681ec4
PB
4626 return FALSE;
4627 }
4628
e5a52504
MM
4629 if (!htab->symbian_p)
4630 {
4631 s = htab->sgot;
4632 h->got.offset = s->size;
4633 s->size += 4;
4634 dyn = htab->root.dynamic_sections_created;
4635 if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4636 || h->root.type != bfd_link_hash_undefweak)
4637 && (info->shared
4638 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
4639 htab->srelgot->size += sizeof (Elf32_External_Rel);
4640 }
5e681ec4
PB
4641 }
4642 else
4643 h->got.offset = (bfd_vma) -1;
4644
5e681ec4
PB
4645 if (eh->relocs_copied == NULL)
4646 return TRUE;
4647
4648 /* In the shared -Bsymbolic case, discard space allocated for
4649 dynamic pc-relative relocs against symbols which turn out to be
4650 defined in regular objects. For the normal shared case, discard
4651 space for pc-relative relocs that have become local due to symbol
4652 visibility changes. */
4653
67687978 4654 if (info->shared || htab->root.is_relocatable_executable)
5e681ec4 4655 {
7359ea65
DJ
4656 /* Discard relocs on undefined weak syms with non-default
4657 visibility. */
5e681ec4
PB
4658 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4659 && h->root.type == bfd_link_hash_undefweak)
4660 eh->relocs_copied = NULL;
67687978
PB
4661 else if (htab->root.is_relocatable_executable && h->dynindx == -1
4662 && h->root.type == bfd_link_hash_new)
4663 {
4664 /* Output absolute symbols so that we can create relocations
4665 against them. For normal symbols we output a relocation
4666 against the section that contains them. */
4667 if (! bfd_elf_link_record_dynamic_symbol (info, h))
4668 return FALSE;
4669 }
4670
5e681ec4
PB
4671 }
4672 else
4673 {
4674 /* For the non-shared case, discard space for relocs against
4675 symbols which turn out to need copy relocs or are not
4676 dynamic. */
4677
f5385ebf
AM
4678 if (!h->non_got_ref
4679 && ((h->def_dynamic
4680 && !h->def_regular)
5e681ec4
PB
4681 || (htab->root.dynamic_sections_created
4682 && (h->root.type == bfd_link_hash_undefweak
4683 || h->root.type == bfd_link_hash_undefined))))
4684 {
4685 /* Make sure this symbol is output as a dynamic symbol.
4686 Undefined weak syms won't yet be marked as dynamic. */
4687 if (h->dynindx == -1
f5385ebf 4688 && !h->forced_local)
5e681ec4 4689 {
c152c796 4690 if (! bfd_elf_link_record_dynamic_symbol (info, h))
5e681ec4
PB
4691 return FALSE;
4692 }
4693
4694 /* If that succeeded, we know we'll be keeping all the
4695 relocs. */
4696 if (h->dynindx != -1)
4697 goto keep;
4698 }
4699
4700 eh->relocs_copied = NULL;
4701
4702 keep: ;
4703 }
4704
4705 /* Finally, allocate space. */
4706 for (p = eh->relocs_copied; p != NULL; p = p->next)
4707 {
4708 asection *sreloc = elf_section_data (p->section)->sreloc;
eea6121a 4709 sreloc->size += p->count * sizeof (Elf32_External_Rel);
5e681ec4
PB
4710 }
4711
4712 return TRUE;
4713}
4714
08d1f311
DJ
4715/* Find any dynamic relocs that apply to read-only sections. */
4716
4717static bfd_boolean
4718elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
4719{
4720 struct elf32_arm_link_hash_entry *eh;
4721 struct elf32_arm_relocs_copied *p;
4722
4723 if (h->root.type == bfd_link_hash_warning)
4724 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4725
4726 eh = (struct elf32_arm_link_hash_entry *) h;
4727 for (p = eh->relocs_copied; p != NULL; p = p->next)
4728 {
4729 asection *s = p->section;
4730
4731 if (s != NULL && (s->flags & SEC_READONLY) != 0)
4732 {
4733 struct bfd_link_info *info = (struct bfd_link_info *) inf;
4734
4735 info->flags |= DF_TEXTREL;
4736
4737 /* Not an error, just cut short the traversal. */
4738 return FALSE;
4739 }
4740 }
4741 return TRUE;
4742}
4743
252b5132
RH
4744/* Set the sizes of the dynamic sections. */
4745
b34976b6 4746static bfd_boolean
57e8b36a
NC
4747elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
4748 struct bfd_link_info * info)
252b5132
RH
4749{
4750 bfd * dynobj;
4751 asection * s;
b34976b6
AM
4752 bfd_boolean plt;
4753 bfd_boolean relocs;
5e681ec4
PB
4754 bfd *ibfd;
4755 struct elf32_arm_link_hash_table *htab;
252b5132 4756
5e681ec4 4757 htab = elf32_arm_hash_table (info);
252b5132
RH
4758 dynobj = elf_hash_table (info)->dynobj;
4759 BFD_ASSERT (dynobj != NULL);
4760
4761 if (elf_hash_table (info)->dynamic_sections_created)
4762 {
4763 /* Set the contents of the .interp section to the interpreter. */
893c4fe2 4764 if (info->executable)
252b5132
RH
4765 {
4766 s = bfd_get_section_by_name (dynobj, ".interp");
4767 BFD_ASSERT (s != NULL);
eea6121a 4768 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
252b5132
RH
4769 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4770 }
4771 }
5e681ec4
PB
4772
4773 /* Set up .got offsets for local syms, and space for local dynamic
4774 relocs. */
4775 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
252b5132 4776 {
5e681ec4
PB
4777 bfd_signed_vma *local_got;
4778 bfd_signed_vma *end_local_got;
4779 char *local_tls_type;
4780 bfd_size_type locsymcount;
4781 Elf_Internal_Shdr *symtab_hdr;
4782 asection *srel;
4783
4784 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
4785 continue;
4786
4787 for (s = ibfd->sections; s != NULL; s = s->next)
4788 {
4789 struct elf32_arm_relocs_copied *p;
4790
4791 for (p = *((struct elf32_arm_relocs_copied **)
4792 &elf_section_data (s)->local_dynrel);
4793 p != NULL;
4794 p = p->next)
4795 {
4796 if (!bfd_is_abs_section (p->section)
4797 && bfd_is_abs_section (p->section->output_section))
4798 {
4799 /* Input section has been discarded, either because
4800 it is a copy of a linkonce section or due to
4801 linker script /DISCARD/, so we'll be discarding
4802 the relocs too. */
4803 }
4804 else if (p->count != 0)
4805 {
4806 srel = elf_section_data (p->section)->sreloc;
eea6121a 4807 srel->size += p->count * sizeof (Elf32_External_Rel);
5e681ec4
PB
4808 if ((p->section->output_section->flags & SEC_READONLY) != 0)
4809 info->flags |= DF_TEXTREL;
4810 }
4811 }
4812 }
4813
4814 local_got = elf_local_got_refcounts (ibfd);
4815 if (!local_got)
4816 continue;
4817
4818 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4819 locsymcount = symtab_hdr->sh_info;
4820 end_local_got = local_got + locsymcount;
4821 s = htab->sgot;
4822 srel = htab->srelgot;
4823 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
4824 {
4825 if (*local_got > 0)
4826 {
eea6121a
AM
4827 *local_got = s->size;
4828 s->size += 4;
5e681ec4 4829 if (info->shared)
eea6121a 4830 srel->size += sizeof (Elf32_External_Rel);
5e681ec4
PB
4831 }
4832 else
4833 *local_got = (bfd_vma) -1;
4834 }
252b5132
RH
4835 }
4836
5e681ec4
PB
4837 /* Allocate global sym .plt and .got entries, and space for global
4838 sym dynamic relocs. */
57e8b36a 4839 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
252b5132
RH
4840
4841 /* The check_relocs and adjust_dynamic_symbol entry points have
4842 determined the sizes of the various dynamic sections. Allocate
4843 memory for them. */
b34976b6
AM
4844 plt = FALSE;
4845 relocs = FALSE;
252b5132
RH
4846 for (s = dynobj->sections; s != NULL; s = s->next)
4847 {
4848 const char * name;
b34976b6 4849 bfd_boolean strip;
252b5132
RH
4850
4851 if ((s->flags & SEC_LINKER_CREATED) == 0)
4852 continue;
4853
4854 /* It's OK to base decisions on the section name, because none
4855 of the dynobj section names depend upon the input files. */
4856 name = bfd_get_section_name (dynobj, s);
4857
b34976b6 4858 strip = FALSE;
252b5132 4859
24a1ba0f 4860 if (strcmp (name, ".plt") == 0)
252b5132 4861 {
eea6121a 4862 if (s->size == 0)
252b5132
RH
4863 {
4864 /* Strip this section if we don't need it; see the
4865 comment below. */
b34976b6 4866 strip = TRUE;
252b5132
RH
4867 }
4868 else
4869 {
4870 /* Remember whether there is a PLT. */
b34976b6 4871 plt = TRUE;
252b5132
RH
4872 }
4873 }
4874 else if (strncmp (name, ".rel", 4) == 0)
4875 {
eea6121a 4876 if (s->size == 0)
252b5132
RH
4877 {
4878 /* If we don't need this section, strip it from the
4879 output file. This is mostly to handle .rel.bss and
4880 .rel.plt. We must create both sections in
4881 create_dynamic_sections, because they must be created
4882 before the linker maps input sections to output
4883 sections. The linker does that before
4884 adjust_dynamic_symbol is called, and it is that
4885 function which decides whether anything needs to go
4886 into these sections. */
b34976b6 4887 strip = TRUE;
252b5132
RH
4888 }
4889 else
4890 {
252b5132
RH
4891 /* Remember whether there are any reloc sections other
4892 than .rel.plt. */
4893 if (strcmp (name, ".rel.plt") != 0)
b34976b6 4894 relocs = TRUE;
252b5132
RH
4895
4896 /* We use the reloc_count field as a counter if we need
4897 to copy relocs into the output file. */
4898 s->reloc_count = 0;
4899 }
4900 }
4901 else if (strncmp (name, ".got", 4) != 0)
4902 {
4903 /* It's not one of our sections, so don't allocate space. */
4904 continue;
4905 }
4906
4907 if (strip)
4908 {
52585bb8 4909 _bfd_strip_section_from_output (info, s);
252b5132
RH
4910 continue;
4911 }
4912
4913 /* Allocate memory for the section contents. */
eea6121a
AM
4914 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
4915 if (s->contents == NULL && s->size != 0)
b34976b6 4916 return FALSE;
252b5132
RH
4917 }
4918
4919 if (elf_hash_table (info)->dynamic_sections_created)
4920 {
4921 /* Add some entries to the .dynamic section. We fill in the
4922 values later, in elf32_arm_finish_dynamic_sections, but we
4923 must add the entries now so that we get the correct size for
4924 the .dynamic section. The DT_DEBUG entry is filled in by the
4925 dynamic linker and used by the debugger. */
dc810e39 4926#define add_dynamic_entry(TAG, VAL) \
5a580b3a 4927 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39
AM
4928
4929 if (!info->shared)
252b5132 4930 {
dc810e39 4931 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 4932 return FALSE;
252b5132
RH
4933 }
4934
4935 if (plt)
4936 {
dc810e39
AM
4937 if ( !add_dynamic_entry (DT_PLTGOT, 0)
4938 || !add_dynamic_entry (DT_PLTRELSZ, 0)
4939 || !add_dynamic_entry (DT_PLTREL, DT_REL)
4940 || !add_dynamic_entry (DT_JMPREL, 0))
b34976b6 4941 return FALSE;
252b5132
RH
4942 }
4943
4944 if (relocs)
4945 {
dc810e39
AM
4946 if ( !add_dynamic_entry (DT_REL, 0)
4947 || !add_dynamic_entry (DT_RELSZ, 0)
4948 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
b34976b6 4949 return FALSE;
252b5132
RH
4950 }
4951
08d1f311
DJ
4952 /* If any dynamic relocs apply to a read-only section,
4953 then we need a DT_TEXTREL entry. */
4954 if ((info->flags & DF_TEXTREL) == 0)
4955 elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs,
4956 (PTR) info);
4957
99e4ae17 4958 if ((info->flags & DF_TEXTREL) != 0)
252b5132 4959 {
dc810e39 4960 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 4961 return FALSE;
d6cf2879 4962 info->flags |= DF_TEXTREL;
252b5132
RH
4963 }
4964 }
dc810e39 4965#undef add_synamic_entry
252b5132 4966
b34976b6 4967 return TRUE;
252b5132
RH
4968}
4969
252b5132
RH
4970/* Finish up dynamic symbol handling. We set the contents of various
4971 dynamic sections here. */
4972
b34976b6 4973static bfd_boolean
57e8b36a
NC
4974elf32_arm_finish_dynamic_symbol (bfd * output_bfd, struct bfd_link_info * info,
4975 struct elf_link_hash_entry * h, Elf_Internal_Sym * sym)
252b5132
RH
4976{
4977 bfd * dynobj;
e5a52504 4978 struct elf32_arm_link_hash_table *htab;
b7693d02 4979 struct elf32_arm_link_hash_entry *eh;
252b5132
RH
4980
4981 dynobj = elf_hash_table (info)->dynobj;
e5a52504 4982 htab = elf32_arm_hash_table (info);
b7693d02 4983 eh = (struct elf32_arm_link_hash_entry *) h;
252b5132
RH
4984
4985 if (h->plt.offset != (bfd_vma) -1)
4986 {
4987 asection * splt;
252b5132 4988 asection * srel;
e5a52504 4989 bfd_byte *loc;
24a1ba0f 4990 bfd_vma plt_index;
947216bf 4991 Elf_Internal_Rela rel;
252b5132
RH
4992
4993 /* This symbol has an entry in the procedure linkage table. Set
4994 it up. */
4995
4996 BFD_ASSERT (h->dynindx != -1);
4997
4998 splt = bfd_get_section_by_name (dynobj, ".plt");
252b5132 4999 srel = bfd_get_section_by_name (dynobj, ".rel.plt");
e5a52504 5000 BFD_ASSERT (splt != NULL && srel != NULL);
252b5132 5001
e5a52504
MM
5002 /* Fill in the entry in the procedure linkage table. */
5003 if (htab->symbian_p)
5004 {
5005 unsigned i;
5006 for (i = 0; i < htab->plt_entry_size / 4; ++i)
5007 bfd_put_32 (output_bfd,
5008 elf32_arm_symbian_plt_entry[i],
5009 splt->contents + h->plt.offset + 4 * i);
5010
5011 /* Fill in the entry in the .rel.plt section. */
2a1b9a48
MM
5012 rel.r_offset = (splt->output_section->vma
5013 + splt->output_offset
e5a52504
MM
5014 + h->plt.offset + 4 * (i - 1));
5015 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
b7693d02
DJ
5016
5017 /* Get the index in the procedure linkage table which
5018 corresponds to this symbol. This is the index of this symbol
5019 in all the symbols for which we are making plt entries. The
5020 first entry in the procedure linkage table is reserved. */
5021 plt_index = ((h->plt.offset - htab->plt_header_size)
5022 / htab->plt_entry_size);
e5a52504
MM
5023 }
5024 else
5025 {
5026 bfd_vma got_offset;
5027 bfd_vma got_displacement;
5028 asection * sgot;
5029
5030 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
5031 BFD_ASSERT (sgot != NULL);
5032
b7693d02
DJ
5033 /* Get the offset into the .got.plt table of the entry that
5034 corresponds to this function. */
5035 got_offset = eh->plt_got_offset;
5036
5037 /* Get the index in the procedure linkage table which
5038 corresponds to this symbol. This is the index of this symbol
5039 in all the symbols for which we are making plt entries. The
5040 first three entries in .got.plt are reserved; after that
5041 symbols appear in the same order as in .plt. */
5042 plt_index = (got_offset - 12) / 4;
e5a52504
MM
5043
5044 /* Calculate the displacement between the PLT slot and the
b7693d02
DJ
5045 entry in the GOT. The eight-byte offset accounts for the
5046 value produced by adding to pc in the first instruction
5047 of the PLT stub. */
e5a52504
MM
5048 got_displacement = (sgot->output_section->vma
5049 + sgot->output_offset
5050 + got_offset
5051 - splt->output_section->vma
5052 - splt->output_offset
5053 - h->plt.offset
5054 - 8);
5e681ec4 5055
e5a52504 5056 BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
5e681ec4 5057
b7693d02
DJ
5058 if (eh->plt_thumb_refcount > 0)
5059 {
5060 bfd_put_16 (output_bfd, elf32_arm_plt_thumb_stub[0],
5061 splt->contents + h->plt.offset - 4);
5062 bfd_put_16 (output_bfd, elf32_arm_plt_thumb_stub[1],
5063 splt->contents + h->plt.offset - 2);
5064 }
5065
e5a52504
MM
5066 bfd_put_32 (output_bfd, elf32_arm_plt_entry[0] | ((got_displacement & 0x0ff00000) >> 20),
5067 splt->contents + h->plt.offset + 0);
5068 bfd_put_32 (output_bfd, elf32_arm_plt_entry[1] | ((got_displacement & 0x000ff000) >> 12),
5069 splt->contents + h->plt.offset + 4);
5070 bfd_put_32 (output_bfd, elf32_arm_plt_entry[2] | (got_displacement & 0x00000fff),
5071 splt->contents + h->plt.offset + 8);
5e681ec4 5072#ifdef FOUR_WORD_PLT
e5a52504
MM
5073 bfd_put_32 (output_bfd, elf32_arm_plt_entry[3],
5074 splt->contents + h->plt.offset + 12);
5e681ec4 5075#endif
252b5132 5076
e5a52504
MM
5077 /* Fill in the entry in the global offset table. */
5078 bfd_put_32 (output_bfd,
5079 (splt->output_section->vma
5080 + splt->output_offset),
5081 sgot->contents + got_offset);
5082
5083 /* Fill in the entry in the .rel.plt section. */
5084 rel.r_offset = (sgot->output_section->vma
5085 + sgot->output_offset
5086 + got_offset);
5087 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_JUMP_SLOT);
5088 }
57e8b36a 5089
947216bf
AM
5090 loc = srel->contents + plt_index * sizeof (Elf32_External_Rel);
5091 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
252b5132 5092
f5385ebf 5093 if (!h->def_regular)
252b5132
RH
5094 {
5095 /* Mark the symbol as undefined, rather than as defined in
5096 the .plt section. Leave the value alone. */
5097 sym->st_shndx = SHN_UNDEF;
d982ba73
PB
5098 /* If the symbol is weak, we do need to clear the value.
5099 Otherwise, the PLT entry would provide a definition for
5100 the symbol even if the symbol wasn't defined anywhere,
5101 and so the symbol would never be NULL. */
f5385ebf 5102 if (!h->ref_regular_nonweak)
d982ba73 5103 sym->st_value = 0;
252b5132
RH
5104 }
5105 }
5106
5107 if (h->got.offset != (bfd_vma) -1)
5108 {
5109 asection * sgot;
5110 asection * srel;
947216bf
AM
5111 Elf_Internal_Rela rel;
5112 bfd_byte *loc;
252b5132
RH
5113
5114 /* This symbol has an entry in the global offset table. Set it
5115 up. */
252b5132
RH
5116 sgot = bfd_get_section_by_name (dynobj, ".got");
5117 srel = bfd_get_section_by_name (dynobj, ".rel.got");
5118 BFD_ASSERT (sgot != NULL && srel != NULL);
5119
5120 rel.r_offset = (sgot->output_section->vma
5121 + sgot->output_offset
dc810e39 5122 + (h->got.offset &~ (bfd_vma) 1));
252b5132 5123
5e681ec4
PB
5124 /* If this is a static link, or it is a -Bsymbolic link and the
5125 symbol is defined locally or was forced to be local because
5126 of a version file, we just want to emit a RELATIVE reloc.
5127 The entry in the global offset table will already have been
5128 initialized in the relocate_section function. */
252b5132 5129 if (info->shared
5e681ec4
PB
5130 && SYMBOL_REFERENCES_LOCAL (info, h))
5131 {
5132 BFD_ASSERT((h->got.offset & 1) != 0);
5133 rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
5134 }
252b5132
RH
5135 else
5136 {
5e681ec4 5137 BFD_ASSERT((h->got.offset & 1) == 0);
252b5132
RH
5138 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
5139 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
5140 }
5141
947216bf
AM
5142 loc = srel->contents + srel->reloc_count++ * sizeof (Elf32_External_Rel);
5143 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
252b5132
RH
5144 }
5145
f5385ebf 5146 if (h->needs_copy)
252b5132
RH
5147 {
5148 asection * s;
947216bf
AM
5149 Elf_Internal_Rela rel;
5150 bfd_byte *loc;
252b5132
RH
5151
5152 /* This symbol needs a copy reloc. Set it up. */
252b5132
RH
5153 BFD_ASSERT (h->dynindx != -1
5154 && (h->root.type == bfd_link_hash_defined
5155 || h->root.type == bfd_link_hash_defweak));
5156
5157 s = bfd_get_section_by_name (h->root.u.def.section->owner,
5158 ".rel.bss");
5159 BFD_ASSERT (s != NULL);
5160
5161 rel.r_offset = (h->root.u.def.value
5162 + h->root.u.def.section->output_section->vma
5163 + h->root.u.def.section->output_offset);
5164 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
947216bf
AM
5165 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rel);
5166 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
252b5132
RH
5167 }
5168
5169 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
5170 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
5171 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
5172 sym->st_shndx = SHN_ABS;
5173
b34976b6 5174 return TRUE;
252b5132
RH
5175}
5176
5177/* Finish up the dynamic sections. */
5178
b34976b6 5179static bfd_boolean
57e8b36a 5180elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
252b5132
RH
5181{
5182 bfd * dynobj;
5183 asection * sgot;
5184 asection * sdyn;
5185
5186 dynobj = elf_hash_table (info)->dynobj;
5187
5188 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
229fcec5 5189 BFD_ASSERT (elf32_arm_hash_table (info)->symbian_p || sgot != NULL);
252b5132
RH
5190 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
5191
5192 if (elf_hash_table (info)->dynamic_sections_created)
5193 {
5194 asection *splt;
5195 Elf32_External_Dyn *dyncon, *dynconend;
229fcec5 5196 struct elf32_arm_link_hash_table *htab;
252b5132 5197
229fcec5 5198 htab = elf32_arm_hash_table (info);
252b5132 5199 splt = bfd_get_section_by_name (dynobj, ".plt");
24a1ba0f 5200 BFD_ASSERT (splt != NULL && sdyn != NULL);
252b5132
RH
5201
5202 dyncon = (Elf32_External_Dyn *) sdyn->contents;
eea6121a 5203 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
9b485d32 5204
252b5132
RH
5205 for (; dyncon < dynconend; dyncon++)
5206 {
5207 Elf_Internal_Dyn dyn;
5208 const char * name;
5209 asection * s;
5210
5211 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5212
5213 switch (dyn.d_tag)
5214 {
229fcec5
MM
5215 unsigned int type;
5216
252b5132
RH
5217 default:
5218 break;
5219
229fcec5
MM
5220 case DT_HASH:
5221 name = ".hash";
5222 goto get_vma_if_bpabi;
5223 case DT_STRTAB:
5224 name = ".dynstr";
5225 goto get_vma_if_bpabi;
5226 case DT_SYMTAB:
5227 name = ".dynsym";
5228 goto get_vma_if_bpabi;
c0042f5d
MM
5229 case DT_VERSYM:
5230 name = ".gnu.version";
5231 goto get_vma_if_bpabi;
5232 case DT_VERDEF:
5233 name = ".gnu.version_d";
5234 goto get_vma_if_bpabi;
5235 case DT_VERNEED:
5236 name = ".gnu.version_r";
5237 goto get_vma_if_bpabi;
5238
252b5132
RH
5239 case DT_PLTGOT:
5240 name = ".got";
5241 goto get_vma;
5242 case DT_JMPREL:
5243 name = ".rel.plt";
5244 get_vma:
5245 s = bfd_get_section_by_name (output_bfd, name);
5246 BFD_ASSERT (s != NULL);
229fcec5
MM
5247 if (!htab->symbian_p)
5248 dyn.d_un.d_ptr = s->vma;
5249 else
5250 /* In the BPABI, tags in the PT_DYNAMIC section point
5251 at the file offset, not the memory address, for the
5252 convenience of the post linker. */
5253 dyn.d_un.d_ptr = s->filepos;
252b5132
RH
5254 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5255 break;
5256
229fcec5
MM
5257 get_vma_if_bpabi:
5258 if (htab->symbian_p)
5259 goto get_vma;
5260 break;
5261
252b5132
RH
5262 case DT_PLTRELSZ:
5263 s = bfd_get_section_by_name (output_bfd, ".rel.plt");
5264 BFD_ASSERT (s != NULL);
eea6121a 5265 dyn.d_un.d_val = s->size;
252b5132
RH
5266 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5267 break;
229fcec5 5268
252b5132 5269 case DT_RELSZ:
229fcec5
MM
5270 if (!htab->symbian_p)
5271 {
5272 /* My reading of the SVR4 ABI indicates that the
5273 procedure linkage table relocs (DT_JMPREL) should be
5274 included in the overall relocs (DT_REL). This is
5275 what Solaris does. However, UnixWare can not handle
5276 that case. Therefore, we override the DT_RELSZ entry
5277 here to make it not include the JMPREL relocs. Since
5278 the linker script arranges for .rel.plt to follow all
5279 other relocation sections, we don't have to worry
5280 about changing the DT_REL entry. */
5281 s = bfd_get_section_by_name (output_bfd, ".rel.plt");
5282 if (s != NULL)
5283 dyn.d_un.d_val -= s->size;
5284 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5285 break;
5286 }
5287 /* Fall through */
5288
5289 case DT_REL:
5290 case DT_RELA:
5291 case DT_RELASZ:
5292 /* In the BPABI, the DT_REL tag must point at the file
5293 offset, not the VMA, of the first relocation
5294 section. So, we use code similar to that in
5295 elflink.c, but do not check for SHF_ALLOC on the
5296 relcoation section, since relocations sections are
5297 never allocated under the BPABI. The comments above
5298 about Unixware notwithstanding, we include all of the
5299 relocations here. */
5300 if (htab->symbian_p)
5301 {
5302 unsigned int i;
5303 type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
5304 ? SHT_REL : SHT_RELA);
5305 dyn.d_un.d_val = 0;
5306 for (i = 1; i < elf_numsections (output_bfd); i++)
5307 {
5308 Elf_Internal_Shdr *hdr
5309 = elf_elfsections (output_bfd)[i];
5310 if (hdr->sh_type == type)
5311 {
5312 if (dyn.d_tag == DT_RELSZ
5313 || dyn.d_tag == DT_RELASZ)
5314 dyn.d_un.d_val += hdr->sh_size;
de52dba4
AM
5315 else if ((ufile_ptr) hdr->sh_offset
5316 <= dyn.d_un.d_val - 1)
229fcec5
MM
5317 dyn.d_un.d_val = hdr->sh_offset;
5318 }
5319 }
5320 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5321 }
252b5132 5322 break;
88f7bcd5
NC
5323
5324 /* Set the bottom bit of DT_INIT/FINI if the
5325 corresponding function is Thumb. */
5326 case DT_INIT:
5327 name = info->init_function;
5328 goto get_sym;
5329 case DT_FINI:
5330 name = info->fini_function;
5331 get_sym:
5332 /* If it wasn't set by elf_bfd_final_link
4cc11e76 5333 then there is nothing to adjust. */
88f7bcd5
NC
5334 if (dyn.d_un.d_val != 0)
5335 {
5336 struct elf_link_hash_entry * eh;
5337
5338 eh = elf_link_hash_lookup (elf_hash_table (info), name,
b34976b6 5339 FALSE, FALSE, TRUE);
88f7bcd5
NC
5340 if (eh != (struct elf_link_hash_entry *) NULL
5341 && ELF_ST_TYPE (eh->type) == STT_ARM_TFUNC)
5342 {
5343 dyn.d_un.d_val |= 1;
b34976b6 5344 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
88f7bcd5
NC
5345 }
5346 }
5347 break;
252b5132
RH
5348 }
5349 }
5350
24a1ba0f 5351 /* Fill in the first entry in the procedure linkage table. */
e5a52504 5352 if (splt->size > 0 && elf32_arm_hash_table (info)->plt_header_size)
f7a74f8c 5353 {
5e681ec4
PB
5354 bfd_vma got_displacement;
5355
5356 /* Calculate the displacement between the PLT slot and &GOT[0]. */
5357 got_displacement = (sgot->output_section->vma
5358 + sgot->output_offset
5359 - splt->output_section->vma
5360 - splt->output_offset
5361 - 16);
5362
f7a74f8c
NC
5363 bfd_put_32 (output_bfd, elf32_arm_plt0_entry[0], splt->contents + 0);
5364 bfd_put_32 (output_bfd, elf32_arm_plt0_entry[1], splt->contents + 4);
5365 bfd_put_32 (output_bfd, elf32_arm_plt0_entry[2], splt->contents + 8);
5366 bfd_put_32 (output_bfd, elf32_arm_plt0_entry[3], splt->contents + 12);
5e681ec4
PB
5367#ifdef FOUR_WORD_PLT
5368 /* The displacement value goes in the otherwise-unused last word of
5369 the second entry. */
5370 bfd_put_32 (output_bfd, got_displacement, splt->contents + 28);
5371#else
5372 bfd_put_32 (output_bfd, got_displacement, splt->contents + 16);
5373#endif
f7a74f8c 5374 }
252b5132
RH
5375
5376 /* UnixWare sets the entsize of .plt to 4, although that doesn't
5377 really seem like the right value. */
5378 elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
5379 }
5380
5381 /* Fill in the first three entries in the global offset table. */
229fcec5 5382 if (sgot)
252b5132 5383 {
229fcec5
MM
5384 if (sgot->size > 0)
5385 {
5386 if (sdyn == NULL)
5387 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
5388 else
5389 bfd_put_32 (output_bfd,
5390 sdyn->output_section->vma + sdyn->output_offset,
5391 sgot->contents);
5392 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
5393 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
5394 }
252b5132 5395
229fcec5
MM
5396 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
5397 }
252b5132 5398
b34976b6 5399 return TRUE;
252b5132
RH
5400}
5401
ba96a88f 5402static void
57e8b36a 5403elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
ba96a88f 5404{
9b485d32 5405 Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
e489d0ae 5406 struct elf32_arm_link_hash_table *globals;
ba96a88f
NC
5407
5408 i_ehdrp = elf_elfheader (abfd);
5409
94a3258f
PB
5410 if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
5411 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
5412 else
5413 i_ehdrp->e_ident[EI_OSABI] = 0;
ba96a88f 5414 i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
e489d0ae 5415
93204d3a
PB
5416 if (link_info)
5417 {
5418 globals = elf32_arm_hash_table (link_info);
5419 if (globals->byteswap_code)
5420 i_ehdrp->e_flags |= EF_ARM_BE8;
5421 }
ba96a88f
NC
5422}
5423
99e4ae17 5424static enum elf_reloc_type_class
57e8b36a 5425elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
99e4ae17 5426{
f51e552e 5427 switch ((int) ELF32_R_TYPE (rela->r_info))
99e4ae17
AJ
5428 {
5429 case R_ARM_RELATIVE:
5430 return reloc_class_relative;
5431 case R_ARM_JUMP_SLOT:
5432 return reloc_class_plt;
5433 case R_ARM_COPY:
5434 return reloc_class_copy;
5435 default:
5436 return reloc_class_normal;
5437 }
5438}
5439
e16bb312
NC
5440/* Set the right machine number for an Arm ELF file. */
5441
5442static bfd_boolean
57e8b36a 5443elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
e16bb312
NC
5444{
5445 if (hdr->sh_type == SHT_NOTE)
5446 *flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_CONTENTS;
5447
5448 return TRUE;
5449}
5450
e489d0ae 5451static void
57e8b36a 5452elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
e16bb312 5453{
5a6c6817 5454 bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
e16bb312
NC
5455}
5456
40a18ebd
NC
5457/* Return TRUE if this is an unwinding table entry. */
5458
5459static bfd_boolean
5460is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
5461{
5462 size_t len1, len2;
5463
5464 len1 = sizeof (ELF_STRING_ARM_unwind) - 1;
5465 len2 = sizeof (ELF_STRING_ARM_unwind_once) - 1;
5466 return (strncmp (name, ELF_STRING_ARM_unwind, len1) == 0
5467 || strncmp (name, ELF_STRING_ARM_unwind_once, len2) == 0);
5468}
5469
5470
5471/* Set the type and flags for an ARM section. We do this by
5472 the section name, which is a hack, but ought to work. */
5473
5474static bfd_boolean
5475elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
5476{
5477 const char * name;
5478
5479 name = bfd_get_section_name (abfd, sec);
5480
5481 if (is_arm_elf_unwind_section_name (abfd, name))
5482 {
5483 hdr->sh_type = SHT_ARM_EXIDX;
5484 hdr->sh_flags |= SHF_LINK_ORDER;
5485 }
5486 return TRUE;
5487}
5488
5489/* Handle an ARM specific section when reading an object file.
5490 This is called when elf.c finds a section with an unknown type. */
5491
5492static bfd_boolean
5493elf32_arm_section_from_shdr (bfd *abfd,
5494 Elf_Internal_Shdr * hdr,
5495 const char *name)
5496{
5497 /* There ought to be a place to keep ELF backend specific flags, but
5498 at the moment there isn't one. We just keep track of the
5499 sections by their name, instead. Fortunately, the ABI gives
5500 names for all the ARM specific sections, so we will probably get
5501 away with this. */
5502 switch (hdr->sh_type)
5503 {
5504 case SHT_ARM_EXIDX:
5505 break;
5506
5507 default:
5508 return FALSE;
5509 }
5510
5511 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
5512 return FALSE;
5513
5514 return TRUE;
5515}
e489d0ae
PB
5516
5517/* Called for each symbol. Builds a section map based on mapping symbols.
5518 Does not alter any of the symbols. */
5519
5520static bfd_boolean
5521elf32_arm_output_symbol_hook (struct bfd_link_info *info,
5522 const char *name,
5523 Elf_Internal_Sym *elfsym,
5524 asection *input_sec,
5525 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
5526{
5527 int mapcount;
5528 elf32_arm_section_map *map;
5529 struct elf32_arm_link_hash_table *globals;
5530
5531 /* Only do this on final link. */
5532 if (info->relocatable)
5533 return TRUE;
5534
5535 /* Only build a map if we need to byteswap code. */
5536 globals = elf32_arm_hash_table (info);
5537 if (!globals->byteswap_code)
5538 return TRUE;
5539
5540 /* We only want mapping symbols. */
0367ecfb 5541 if (! is_arm_mapping_symbol_name (name))
e489d0ae
PB
5542 return TRUE;
5543
5544 mapcount = ++(elf32_arm_section_data (input_sec)->mapcount);
5545 map = elf32_arm_section_data (input_sec)->map;
5546 /* TODO: This may be inefficient, but we probably don't usually have many
5547 mapping symbols per section. */
5548 map = bfd_realloc (map, mapcount * sizeof (elf32_arm_section_map));
5549 elf32_arm_section_data (input_sec)->map = map;
57e8b36a 5550
e489d0ae
PB
5551 map[mapcount - 1].vma = elfsym->st_value;
5552 map[mapcount - 1].type = name[1];
5553 return TRUE;
5554}
5555
5556
5557/* Allocate target specific section data. */
5558
5559static bfd_boolean
5560elf32_arm_new_section_hook (bfd *abfd, asection *sec)
5561{
5562 struct _arm_elf_section_data *sdata;
5563 bfd_size_type amt = sizeof (*sdata);
5564
5565 sdata = bfd_zalloc (abfd, amt);
5566 if (sdata == NULL)
5567 return FALSE;
5568 sec->used_by_bfd = sdata;
5569
5570 return _bfd_elf_new_section_hook (abfd, sec);
5571}
5572
5573
5574/* Used to order a list of mapping symbols by address. */
5575
5576static int
5577elf32_arm_compare_mapping (const void * a, const void * b)
5578{
5579 return ((const elf32_arm_section_map *) a)->vma
5580 > ((const elf32_arm_section_map *) b)->vma;
5581}
5582
5583
5584/* Do code byteswapping. Return FALSE afterwards so that the section is
5585 written out as normal. */
5586
5587static bfd_boolean
5588elf32_arm_write_section (bfd *output_bfd ATTRIBUTE_UNUSED, asection *sec,
5589 bfd_byte *contents)
5590{
5591 int mapcount;
5592 elf32_arm_section_map *map;
5593 bfd_vma ptr;
5594 bfd_vma end;
5595 bfd_vma offset;
5596 bfd_byte tmp;
5597 int i;
57e8b36a 5598
e489d0ae
PB
5599 mapcount = elf32_arm_section_data (sec)->mapcount;
5600 map = elf32_arm_section_data (sec)->map;
5601
5602 if (mapcount == 0)
5603 return FALSE;
5604
5605 qsort (map, mapcount, sizeof (elf32_arm_section_map),
5606 elf32_arm_compare_mapping);
5607
5608 offset = sec->output_section->vma + sec->output_offset;
5609 ptr = map[0].vma - offset;
5610 for (i = 0; i < mapcount; i++)
5611 {
5612 if (i == mapcount - 1)
eea6121a 5613 end = sec->size;
e489d0ae
PB
5614 else
5615 end = map[i + 1].vma - offset;
57e8b36a 5616
e489d0ae
PB
5617 switch (map[i].type)
5618 {
5619 case 'a':
5620 /* Byte swap code words. */
5621 while (ptr + 3 < end)
5622 {
5623 tmp = contents[ptr];
5624 contents[ptr] = contents[ptr + 3];
5625 contents[ptr + 3] = tmp;
5626 tmp = contents[ptr + 1];
5627 contents[ptr + 1] = contents[ptr + 2];
5628 contents[ptr + 2] = tmp;
5629 ptr += 4;
5630 }
5631 break;
5632
5633 case 't':
5634 /* Byte swap code halfwords. */
5635 while (ptr + 1 < end)
5636 {
5637 tmp = contents[ptr];
5638 contents[ptr] = contents[ptr + 1];
5639 contents[ptr + 1] = tmp;
5640 ptr += 2;
5641 }
5642 break;
5643
5644 case 'd':
5645 /* Leave data alone. */
5646 break;
5647 }
5648 ptr = end;
5649 }
93204d3a 5650 free (map);
e489d0ae
PB
5651 return FALSE;
5652}
5653
b7693d02
DJ
5654/* Display STT_ARM_TFUNC symbols as functions. */
5655
5656static void
5657elf32_arm_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
5658 asymbol *asym)
5659{
5660 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
5661
5662 if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_ARM_TFUNC)
5663 elfsym->symbol.flags |= BSF_FUNCTION;
5664}
5665
0beaef2b
PB
5666
5667/* Mangle thumb function symbols as we read them in. */
5668
5669static void
5670elf32_arm_swap_symbol_in (bfd * abfd,
5671 const void *psrc,
5672 const void *pshn,
5673 Elf_Internal_Sym *dst)
5674{
5675 bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst);
5676
5677 /* New EABI objects mark thumb function symbols by setting the low bit of
5678 the address. Turn these into STT_ARM_TFUNC. */
5679 if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
5680 && (dst->st_value & 1))
5681 {
5682 dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC);
5683 dst->st_value &= ~(bfd_vma) 1;
5684 }
5685}
5686
5687
5688/* Mangle thumb function symbols as we write them out. */
5689
5690static void
5691elf32_arm_swap_symbol_out (bfd *abfd,
5692 const Elf_Internal_Sym *src,
5693 void *cdst,
5694 void *shndx)
5695{
5696 Elf_Internal_Sym newsym;
5697
5698 /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
5699 of the address set, as per the new EABI. We do this unconditionally
5700 because objcopy does not set the elf header flags until after
5701 it writes out the symbol table. */
5702 if (ELF_ST_TYPE (src->st_info) == STT_ARM_TFUNC)
5703 {
5704 newsym = *src;
5705 newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
5706 newsym.st_value |= 1;
5707
5708 src = &newsym;
5709 }
5710 bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
5711}
5712
b294bdf8
MM
5713/* Add the PT_ARM_EXIDX program header. */
5714
5715static bfd_boolean
5716elf32_arm_modify_segment_map (bfd *abfd,
5717 struct bfd_link_info *info ATTRIBUTE_UNUSED)
5718{
5719 struct elf_segment_map *m;
5720 asection *sec;
5721
5722 sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
5723 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
5724 {
5725 /* If there is already a PT_ARM_EXIDX header, then we do not
5726 want to add another one. This situation arises when running
5727 "strip"; the input binary already has the header. */
5728 m = elf_tdata (abfd)->segment_map;
5729 while (m && m->p_type != PT_ARM_EXIDX)
5730 m = m->next;
5731 if (!m)
5732 {
5733 m = bfd_zalloc (abfd, sizeof (struct elf_segment_map));
5734 if (m == NULL)
5735 return FALSE;
5736 m->p_type = PT_ARM_EXIDX;
5737 m->count = 1;
5738 m->sections[0] = sec;
5739
5740 m->next = elf_tdata (abfd)->segment_map;
5741 elf_tdata (abfd)->segment_map = m;
5742 }
5743 }
5744
5745 return TRUE;
5746}
5747
5748/* We may add a PT_ARM_EXIDX program header. */
5749
5750static int
5751elf32_arm_additional_program_headers (bfd *abfd)
5752{
5753 asection *sec;
5754
5755 sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
5756 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
5757 return 1;
5758 else
5759 return 0;
5760}
5761
0beaef2b
PB
5762/* We use this to override swap_symbol_in and swap_symbol_out. */
5763const struct elf_size_info elf32_arm_size_info = {
5764 sizeof (Elf32_External_Ehdr),
5765 sizeof (Elf32_External_Phdr),
5766 sizeof (Elf32_External_Shdr),
5767 sizeof (Elf32_External_Rel),
5768 sizeof (Elf32_External_Rela),
5769 sizeof (Elf32_External_Sym),
5770 sizeof (Elf32_External_Dyn),
5771 sizeof (Elf_External_Note),
5772 4,
5773 1,
5774 32, 2,
5775 ELFCLASS32, EV_CURRENT,
5776 bfd_elf32_write_out_phdrs,
5777 bfd_elf32_write_shdrs_and_ehdr,
5778 bfd_elf32_write_relocs,
5779 elf32_arm_swap_symbol_in,
5780 elf32_arm_swap_symbol_out,
5781 bfd_elf32_slurp_reloc_table,
5782 bfd_elf32_slurp_symbol_table,
5783 bfd_elf32_swap_dyn_in,
5784 bfd_elf32_swap_dyn_out,
5785 bfd_elf32_swap_reloc_in,
5786 bfd_elf32_swap_reloc_out,
5787 bfd_elf32_swap_reloca_in,
5788 bfd_elf32_swap_reloca_out
5789};
5790
252b5132
RH
5791#define ELF_ARCH bfd_arch_arm
5792#define ELF_MACHINE_CODE EM_ARM
d0facd1b
NC
5793#ifdef __QNXTARGET__
5794#define ELF_MAXPAGESIZE 0x1000
5795#else
f21f3fe0 5796#define ELF_MAXPAGESIZE 0x8000
d0facd1b 5797#endif
b1342370 5798#define ELF_MINPAGESIZE 0x1000
252b5132 5799
99e4ae17
AJ
5800#define bfd_elf32_bfd_copy_private_bfd_data elf32_arm_copy_private_bfd_data
5801#define bfd_elf32_bfd_merge_private_bfd_data elf32_arm_merge_private_bfd_data
252b5132
RH
5802#define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
5803#define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
5804#define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
dc810e39 5805#define bfd_elf32_bfd_reloc_type_lookup elf32_arm_reloc_type_lookup
252b5132 5806#define bfd_elf32_find_nearest_line elf32_arm_find_nearest_line
e489d0ae 5807#define bfd_elf32_new_section_hook elf32_arm_new_section_hook
3c9458e9 5808#define bfd_elf32_bfd_is_target_special_symbol elf32_arm_is_target_special_symbol
252b5132
RH
5809
5810#define elf_backend_get_symbol_type elf32_arm_get_symbol_type
5811#define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook
5812#define elf_backend_gc_sweep_hook elf32_arm_gc_sweep_hook
5813#define elf_backend_check_relocs elf32_arm_check_relocs
dc810e39 5814#define elf_backend_relocate_section elf32_arm_relocate_section
e489d0ae 5815#define elf_backend_write_section elf32_arm_write_section
252b5132 5816#define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol
5e681ec4 5817#define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections
252b5132
RH
5818#define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol
5819#define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections
e489d0ae 5820#define elf_backend_link_output_symbol_hook elf32_arm_output_symbol_hook
252b5132 5821#define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections
ba96a88f 5822#define elf_backend_post_process_headers elf32_arm_post_process_headers
99e4ae17 5823#define elf_backend_reloc_type_class elf32_arm_reloc_type_class
c178919b 5824#define elf_backend_object_p elf32_arm_object_p
e16bb312 5825#define elf_backend_section_flags elf32_arm_section_flags
40a18ebd
NC
5826#define elf_backend_fake_sections elf32_arm_fake_sections
5827#define elf_backend_section_from_shdr elf32_arm_section_from_shdr
e16bb312 5828#define elf_backend_final_write_processing elf32_arm_final_write_processing
5e681ec4 5829#define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol
b7693d02 5830#define elf_backend_symbol_processing elf32_arm_symbol_processing
0beaef2b 5831#define elf_backend_size_info elf32_arm_size_info
b294bdf8
MM
5832#define elf_backend_modify_segment_map elf32_arm_modify_segment_map
5833#define elf_backend_additional_program_headers \
5834 elf32_arm_additional_program_headers
252b5132 5835
5e681ec4 5836#define elf_backend_can_refcount 1
252b5132
RH
5837#define elf_backend_can_gc_sections 1
5838#define elf_backend_plt_readonly 1
5839#define elf_backend_want_got_plt 1
5840#define elf_backend_want_plt_sym 0
4e7fd91e
PB
5841#define elf_backend_may_use_rel_p 1
5842#define elf_backend_may_use_rela_p 0
5843#define elf_backend_default_use_rela_p 0
5844#define elf_backend_rela_normal 0
252b5132 5845
04f7c78d 5846#define elf_backend_got_header_size 12
04f7c78d 5847
252b5132 5848#include "elf32-target.h"
7f266840 5849
4e7fd91e
PB
5850/* VxWorks Targets */
5851
5852#undef TARGET_LITTLE_SYM
5853#define TARGET_LITTLE_SYM bfd_elf32_littlearm_vxworks_vec
5854#undef TARGET_LITTLE_NAME
5855#define TARGET_LITTLE_NAME "elf32-littlearm-vxworks"
5856#undef TARGET_BIG_SYM
5857#define TARGET_BIG_SYM bfd_elf32_bigarm_vxworks_vec
5858#undef TARGET_BIG_NAME
5859#define TARGET_BIG_NAME "elf32-bigarm-vxworks"
5860
5861/* Like elf32_arm_link_hash_table_create -- but overrides
5862 appropriately for VxWorks. */
5863static struct bfd_link_hash_table *
5864elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
5865{
5866 struct bfd_link_hash_table *ret;
5867
5868 ret = elf32_arm_link_hash_table_create (abfd);
5869 if (ret)
5870 {
5871 struct elf32_arm_link_hash_table *htab
5872 = (struct elf32_arm_link_hash_table *)ret;
5873 htab->use_rel = 0;
5874 }
5875 return ret;
5876}
5877
5878#undef elf32_bed
5879#define elf32_bed elf32_arm_vxworks_bed
5880
5881#undef bfd_elf32_bfd_link_hash_table_create
5882#define bfd_elf32_bfd_link_hash_table_create \
5883 elf32_arm_vxworks_link_hash_table_create
5884
5885#undef elf_backend_may_use_rel_p
5886#define elf_backend_may_use_rel_p 0
5887#undef elf_backend_may_use_rela_p
5888#define elf_backend_may_use_rela_p 1
5889#undef elf_backend_default_use_rela_p
5890#define elf_backend_default_use_rela_p 1
5891#undef elf_backend_rela_normal
5892#define elf_backend_rela_normal 1
5893
5894#include "elf32-target.h"
5895
5896
7f266840
DJ
5897/* Symbian OS Targets */
5898
5899#undef TARGET_LITTLE_SYM
5900#define TARGET_LITTLE_SYM bfd_elf32_littlearm_symbian_vec
5901#undef TARGET_LITTLE_NAME
5902#define TARGET_LITTLE_NAME "elf32-littlearm-symbian"
5903#undef TARGET_BIG_SYM
5904#define TARGET_BIG_SYM bfd_elf32_bigarm_symbian_vec
5905#undef TARGET_BIG_NAME
5906#define TARGET_BIG_NAME "elf32-bigarm-symbian"
5907
5908/* Like elf32_arm_link_hash_table_create -- but overrides
5909 appropriately for Symbian OS. */
5910static struct bfd_link_hash_table *
5911elf32_arm_symbian_link_hash_table_create (bfd *abfd)
5912{
5913 struct bfd_link_hash_table *ret;
5914
5915 ret = elf32_arm_link_hash_table_create (abfd);
5916 if (ret)
5917 {
5918 struct elf32_arm_link_hash_table *htab
5919 = (struct elf32_arm_link_hash_table *)ret;
5920 /* There is no PLT header for Symbian OS. */
5921 htab->plt_header_size = 0;
5922 /* The PLT entries are each three instructions. */
5923 htab->plt_entry_size = 4 * NUM_ELEM (elf32_arm_symbian_plt_entry);
5924 htab->symbian_p = 1;
67687978 5925 htab->root.is_relocatable_executable = 1;
7f266840
DJ
5926 }
5927 return ret;
5928}
5929
7f266840
DJ
5930static struct bfd_elf_special_section const
5931 elf32_arm_symbian_special_sections[]=
5932{
5cd3778d
MM
5933 /* In a BPABI executable, the dynamic linking sections do not go in
5934 the loadable read-only segment. The post-linker may wish to
5935 refer to these sections, but they are not part of the final
5936 program image. */
7f266840
DJ
5937 { ".dynamic", 8, 0, SHT_DYNAMIC, 0 },
5938 { ".dynstr", 7, 0, SHT_STRTAB, 0 },
5939 { ".dynsym", 7, 0, SHT_DYNSYM, 0 },
5940 { ".got", 4, 0, SHT_PROGBITS, 0 },
5941 { ".hash", 5, 0, SHT_HASH, 0 },
5cd3778d
MM
5942 /* These sections do not need to be writable as the SymbianOS
5943 postlinker will arrange things so that no dynamic relocation is
5944 required. */
5945 { ".init_array", 11, 0, SHT_INIT_ARRAY, SHF_ALLOC },
5946 { ".fini_array", 11, 0, SHT_FINI_ARRAY, SHF_ALLOC },
5947 { ".preinit_array", 14, 0, SHT_PREINIT_ARRAY, SHF_ALLOC },
7f266840
DJ
5948 { NULL, 0, 0, 0, 0 }
5949};
5950
c3c76620 5951static void
b34af79c
MM
5952elf32_arm_symbian_begin_write_processing (bfd *abfd,
5953 struct bfd_link_info *link_info
5954 ATTRIBUTE_UNUSED)
c3c76620
MM
5955{
5956 /* BPABI objects are never loaded directly by an OS kernel; they are
5957 processed by a postlinker first, into an OS-specific format. If
5958 the D_PAGED bit is set on the file, BFD will align segments on
5959 page boundaries, so that an OS can directly map the file. With
5960 BPABI objects, that just results in wasted space. In addition,
5961 because we clear the D_PAGED bit, map_sections_to_segments will
5962 recognize that the program headers should not be mapped into any
5963 loadable segment. */
5964 abfd->flags &= ~D_PAGED;
5965}
7f266840
DJ
5966
5967static bfd_boolean
b34af79c 5968elf32_arm_symbian_modify_segment_map (bfd *abfd,
b294bdf8 5969 struct bfd_link_info *info)
7f266840
DJ
5970{
5971 struct elf_segment_map *m;
5972 asection *dynsec;
5973
7f266840
DJ
5974 /* BPABI shared libraries and executables should have a PT_DYNAMIC
5975 segment. However, because the .dynamic section is not marked
5976 with SEC_LOAD, the generic ELF code will not create such a
5977 segment. */
5978 dynsec = bfd_get_section_by_name (abfd, ".dynamic");
5979 if (dynsec)
5980 {
5981 m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
5982 m->next = elf_tdata (abfd)->segment_map;
5983 elf_tdata (abfd)->segment_map = m;
5984 }
5985
b294bdf8
MM
5986 /* Also call the generic arm routine. */
5987 return elf32_arm_modify_segment_map (abfd, info);
7f266840
DJ
5988}
5989
5990#undef elf32_bed
5991#define elf32_bed elf32_arm_symbian_bed
5992
5993/* The dynamic sections are not allocated on SymbianOS; the postlinker
5994 will process them and then discard them. */
5995#undef ELF_DYNAMIC_SEC_FLAGS
5996#define ELF_DYNAMIC_SEC_FLAGS \
5997 (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
5998
5999#undef bfd_elf32_bfd_link_hash_table_create
6000#define bfd_elf32_bfd_link_hash_table_create \
6001 elf32_arm_symbian_link_hash_table_create
6002
6003#undef elf_backend_special_sections
6004#define elf_backend_special_sections elf32_arm_symbian_special_sections
6005
c3c76620
MM
6006#undef elf_backend_begin_write_processing
6007#define elf_backend_begin_write_processing \
6008 elf32_arm_symbian_begin_write_processing
6009
7f266840
DJ
6010#undef elf_backend_modify_segment_map
6011#define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
6012
6013/* There is no .got section for BPABI objects, and hence no header. */
6014#undef elf_backend_got_header_size
6015#define elf_backend_got_header_size 0
6016
6017/* Similarly, there is no .got.plt section. */
6018#undef elf_backend_want_got_plt
6019#define elf_backend_want_got_plt 0
6020
4e7fd91e
PB
6021#undef elf_backend_may_use_rel_p
6022#define elf_backend_may_use_rel_p 1
6023#undef elf_backend_may_use_rela_p
6024#define elf_backend_may_use_rela_p 0
6025#undef elf_backend_default_use_rela_p
dc4c9c19 6026#define elf_backend_default_use_rela_p 0
4e7fd91e
PB
6027#undef elf_backend_rela_normal
6028#define elf_backend_rela_normal 0
6029
7f266840 6030#include "elf32-target.h"