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