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