6601c4588a60b8e8ff0eb0ab0acb3e171a5fb29e
[platform/upstream/binutils.git] / bfd / elf32-arm.c
1 /* 32-bit ELF support for ARM
2    Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3    2008 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 3 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,
20    MA 02110-1301, USA.  */
21
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "libiberty.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27 #include "elf-vxworks.h"
28 #include "elf/arm.h"
29
30 /* Return the relocation section associated with NAME.  HTAB is the
31    bfd's elf32_arm_link_hash_entry.  */
32 #define RELOC_SECTION(HTAB, NAME) \
33   ((HTAB)->use_rel ? ".rel" NAME : ".rela" NAME)
34
35 /* Return size of a relocation entry.  HTAB is the bfd's
36    elf32_arm_link_hash_entry.  */
37 #define RELOC_SIZE(HTAB) \
38   ((HTAB)->use_rel \
39    ? sizeof (Elf32_External_Rel) \
40    : sizeof (Elf32_External_Rela))
41
42 /* Return function to swap relocations in.  HTAB is the bfd's
43    elf32_arm_link_hash_entry.  */
44 #define SWAP_RELOC_IN(HTAB) \
45   ((HTAB)->use_rel \
46    ? bfd_elf32_swap_reloc_in \
47    : bfd_elf32_swap_reloca_in)
48
49 /* Return function to swap relocations out.  HTAB is the bfd's
50    elf32_arm_link_hash_entry.  */
51 #define SWAP_RELOC_OUT(HTAB) \
52   ((HTAB)->use_rel \
53    ? bfd_elf32_swap_reloc_out \
54    : bfd_elf32_swap_reloca_out)
55
56 #define elf_info_to_howto               0
57 #define elf_info_to_howto_rel           elf32_arm_info_to_howto
58
59 #define ARM_ELF_ABI_VERSION             0
60 #define ARM_ELF_OS_ABI_VERSION          ELFOSABI_ARM
61
62 static struct elf_backend_data elf32_arm_vxworks_bed;
63
64 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
65    R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
66    in that slot.  */
67
68 static reloc_howto_type elf32_arm_howto_table_1[] =
69 {
70   /* No relocation.  */
71   HOWTO (R_ARM_NONE,            /* type */
72          0,                     /* rightshift */
73          0,                     /* size (0 = byte, 1 = short, 2 = long) */
74          0,                     /* bitsize */
75          FALSE,                 /* pc_relative */
76          0,                     /* bitpos */
77          complain_overflow_dont,/* complain_on_overflow */
78          bfd_elf_generic_reloc, /* special_function */
79          "R_ARM_NONE",          /* name */
80          FALSE,                 /* partial_inplace */
81          0,                     /* src_mask */
82          0,                     /* dst_mask */
83          FALSE),                /* pcrel_offset */
84
85   HOWTO (R_ARM_PC24,            /* type */
86          2,                     /* rightshift */
87          2,                     /* size (0 = byte, 1 = short, 2 = long) */
88          24,                    /* bitsize */
89          TRUE,                  /* pc_relative */
90          0,                     /* bitpos */
91          complain_overflow_signed,/* complain_on_overflow */
92          bfd_elf_generic_reloc, /* special_function */
93          "R_ARM_PC24",          /* name */
94          FALSE,                 /* partial_inplace */
95          0x00ffffff,            /* src_mask */
96          0x00ffffff,            /* dst_mask */
97          TRUE),                 /* pcrel_offset */
98
99   /* 32 bit absolute */
100   HOWTO (R_ARM_ABS32,           /* type */
101          0,                     /* rightshift */
102          2,                     /* size (0 = byte, 1 = short, 2 = long) */
103          32,                    /* bitsize */
104          FALSE,                 /* pc_relative */
105          0,                     /* bitpos */
106          complain_overflow_bitfield,/* complain_on_overflow */
107          bfd_elf_generic_reloc, /* special_function */
108          "R_ARM_ABS32",         /* name */
109          FALSE,                 /* partial_inplace */
110          0xffffffff,            /* src_mask */
111          0xffffffff,            /* dst_mask */
112          FALSE),                /* pcrel_offset */
113
114   /* standard 32bit pc-relative reloc */
115   HOWTO (R_ARM_REL32,           /* type */
116          0,                     /* rightshift */
117          2,                     /* size (0 = byte, 1 = short, 2 = long) */
118          32,                    /* bitsize */
119          TRUE,                  /* pc_relative */
120          0,                     /* bitpos */
121          complain_overflow_bitfield,/* complain_on_overflow */
122          bfd_elf_generic_reloc, /* special_function */
123          "R_ARM_REL32",         /* name */
124          FALSE,                 /* partial_inplace */
125          0xffffffff,            /* src_mask */
126          0xffffffff,            /* dst_mask */
127          TRUE),                 /* pcrel_offset */
128
129   /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
130   HOWTO (R_ARM_LDR_PC_G0,       /* type */
131          0,                     /* rightshift */
132          0,                     /* size (0 = byte, 1 = short, 2 = long) */
133          32,                    /* bitsize */
134          TRUE,                  /* pc_relative */
135          0,                     /* bitpos */
136          complain_overflow_dont,/* complain_on_overflow */
137          bfd_elf_generic_reloc, /* special_function */
138          "R_ARM_LDR_PC_G0",     /* name */
139          FALSE,                 /* partial_inplace */
140          0xffffffff,            /* src_mask */
141          0xffffffff,            /* dst_mask */
142          TRUE),                 /* pcrel_offset */
143
144    /* 16 bit absolute */
145   HOWTO (R_ARM_ABS16,           /* type */
146          0,                     /* rightshift */
147          1,                     /* size (0 = byte, 1 = short, 2 = long) */
148          16,                    /* bitsize */
149          FALSE,                 /* pc_relative */
150          0,                     /* bitpos */
151          complain_overflow_bitfield,/* complain_on_overflow */
152          bfd_elf_generic_reloc, /* special_function */
153          "R_ARM_ABS16",         /* name */
154          FALSE,                 /* partial_inplace */
155          0x0000ffff,            /* src_mask */
156          0x0000ffff,            /* dst_mask */
157          FALSE),                /* pcrel_offset */
158
159   /* 12 bit absolute */
160   HOWTO (R_ARM_ABS12,           /* type */
161          0,                     /* rightshift */
162          2,                     /* size (0 = byte, 1 = short, 2 = long) */
163          12,                    /* bitsize */
164          FALSE,                 /* pc_relative */
165          0,                     /* bitpos */
166          complain_overflow_bitfield,/* complain_on_overflow */
167          bfd_elf_generic_reloc, /* special_function */
168          "R_ARM_ABS12",         /* name */
169          FALSE,                 /* partial_inplace */
170          0x00000fff,            /* src_mask */
171          0x00000fff,            /* dst_mask */
172          FALSE),                /* pcrel_offset */
173
174   HOWTO (R_ARM_THM_ABS5,        /* type */
175          6,                     /* rightshift */
176          1,                     /* size (0 = byte, 1 = short, 2 = long) */
177          5,                     /* bitsize */
178          FALSE,                 /* pc_relative */
179          0,                     /* bitpos */
180          complain_overflow_bitfield,/* complain_on_overflow */
181          bfd_elf_generic_reloc, /* special_function */
182          "R_ARM_THM_ABS5",      /* name */
183          FALSE,                 /* partial_inplace */
184          0x000007e0,            /* src_mask */
185          0x000007e0,            /* dst_mask */
186          FALSE),                /* pcrel_offset */
187
188   /* 8 bit absolute */
189   HOWTO (R_ARM_ABS8,            /* type */
190          0,                     /* rightshift */
191          0,                     /* size (0 = byte, 1 = short, 2 = long) */
192          8,                     /* bitsize */
193          FALSE,                 /* pc_relative */
194          0,                     /* bitpos */
195          complain_overflow_bitfield,/* complain_on_overflow */
196          bfd_elf_generic_reloc, /* special_function */
197          "R_ARM_ABS8",          /* name */
198          FALSE,                 /* partial_inplace */
199          0x000000ff,            /* src_mask */
200          0x000000ff,            /* dst_mask */
201          FALSE),                /* pcrel_offset */
202
203   HOWTO (R_ARM_SBREL32,         /* type */
204          0,                     /* rightshift */
205          2,                     /* size (0 = byte, 1 = short, 2 = long) */
206          32,                    /* bitsize */
207          FALSE,                 /* pc_relative */
208          0,                     /* bitpos */
209          complain_overflow_dont,/* complain_on_overflow */
210          bfd_elf_generic_reloc, /* special_function */
211          "R_ARM_SBREL32",       /* name */
212          FALSE,                 /* partial_inplace */
213          0xffffffff,            /* src_mask */
214          0xffffffff,            /* dst_mask */
215          FALSE),                /* pcrel_offset */
216
217   HOWTO (R_ARM_THM_CALL,        /* type */
218          1,                     /* rightshift */
219          2,                     /* size (0 = byte, 1 = short, 2 = long) */
220          25,                    /* bitsize */
221          TRUE,                  /* pc_relative */
222          0,                     /* bitpos */
223          complain_overflow_signed,/* complain_on_overflow */
224          bfd_elf_generic_reloc, /* special_function */
225          "R_ARM_THM_CALL",      /* name */
226          FALSE,                 /* partial_inplace */
227          0x07ff07ff,            /* src_mask */
228          0x07ff07ff,            /* dst_mask */
229          TRUE),                 /* pcrel_offset */
230
231   HOWTO (R_ARM_THM_PC8,         /* type */
232          1,                     /* rightshift */
233          1,                     /* size (0 = byte, 1 = short, 2 = long) */
234          8,                     /* bitsize */
235          TRUE,                  /* pc_relative */
236          0,                     /* bitpos */
237          complain_overflow_signed,/* complain_on_overflow */
238          bfd_elf_generic_reloc, /* special_function */
239          "R_ARM_THM_PC8",       /* name */
240          FALSE,                 /* partial_inplace */
241          0x000000ff,            /* src_mask */
242          0x000000ff,            /* dst_mask */
243          TRUE),                 /* pcrel_offset */
244
245   HOWTO (R_ARM_BREL_ADJ,        /* type */
246          1,                     /* rightshift */
247          1,                     /* size (0 = byte, 1 = short, 2 = long) */
248          32,                    /* bitsize */
249          FALSE,                 /* pc_relative */
250          0,                     /* bitpos */
251          complain_overflow_signed,/* complain_on_overflow */
252          bfd_elf_generic_reloc, /* special_function */
253          "R_ARM_BREL_ADJ",      /* name */
254          FALSE,                 /* partial_inplace */
255          0xffffffff,            /* src_mask */
256          0xffffffff,            /* dst_mask */
257          FALSE),                /* pcrel_offset */
258
259   HOWTO (R_ARM_SWI24,           /* type */
260          0,                     /* rightshift */
261          0,                     /* size (0 = byte, 1 = short, 2 = long) */
262          0,                     /* bitsize */
263          FALSE,                 /* pc_relative */
264          0,                     /* bitpos */
265          complain_overflow_signed,/* complain_on_overflow */
266          bfd_elf_generic_reloc, /* special_function */
267          "R_ARM_SWI24",         /* name */
268          FALSE,                 /* partial_inplace */
269          0x00000000,            /* src_mask */
270          0x00000000,            /* dst_mask */
271          FALSE),                /* pcrel_offset */
272
273   HOWTO (R_ARM_THM_SWI8,        /* type */
274          0,                     /* rightshift */
275          0,                     /* size (0 = byte, 1 = short, 2 = long) */
276          0,                     /* bitsize */
277          FALSE,                 /* pc_relative */
278          0,                     /* bitpos */
279          complain_overflow_signed,/* complain_on_overflow */
280          bfd_elf_generic_reloc, /* special_function */
281          "R_ARM_SWI8",          /* name */
282          FALSE,                 /* partial_inplace */
283          0x00000000,            /* src_mask */
284          0x00000000,            /* dst_mask */
285          FALSE),                /* pcrel_offset */
286
287   /* BLX instruction for the ARM.  */
288   HOWTO (R_ARM_XPC25,           /* type */
289          2,                     /* rightshift */
290          2,                     /* size (0 = byte, 1 = short, 2 = long) */
291          25,                    /* bitsize */
292          TRUE,                  /* pc_relative */
293          0,                     /* bitpos */
294          complain_overflow_signed,/* complain_on_overflow */
295          bfd_elf_generic_reloc, /* special_function */
296          "R_ARM_XPC25",         /* name */
297          FALSE,                 /* partial_inplace */
298          0x00ffffff,            /* src_mask */
299          0x00ffffff,            /* dst_mask */
300          TRUE),                 /* pcrel_offset */
301
302   /* BLX instruction for the Thumb.  */
303   HOWTO (R_ARM_THM_XPC22,       /* type */
304          2,                     /* rightshift */
305          2,                     /* size (0 = byte, 1 = short, 2 = long) */
306          22,                    /* bitsize */
307          TRUE,                  /* pc_relative */
308          0,                     /* bitpos */
309          complain_overflow_signed,/* complain_on_overflow */
310          bfd_elf_generic_reloc, /* special_function */
311          "R_ARM_THM_XPC22",     /* name */
312          FALSE,                 /* partial_inplace */
313          0x07ff07ff,            /* src_mask */
314          0x07ff07ff,            /* dst_mask */
315          TRUE),                 /* pcrel_offset */
316
317   /* Dynamic TLS relocations.  */
318
319   HOWTO (R_ARM_TLS_DTPMOD32,    /* type */
320          0,                     /* rightshift */
321          2,                     /* size (0 = byte, 1 = short, 2 = long) */
322          32,                    /* bitsize */
323          FALSE,                 /* pc_relative */
324          0,                     /* bitpos */
325          complain_overflow_bitfield,/* complain_on_overflow */
326          bfd_elf_generic_reloc, /* special_function */
327          "R_ARM_TLS_DTPMOD32",  /* name */
328          TRUE,                  /* partial_inplace */
329          0xffffffff,            /* src_mask */
330          0xffffffff,            /* dst_mask */
331          FALSE),                /* pcrel_offset */
332
333   HOWTO (R_ARM_TLS_DTPOFF32,    /* type */
334          0,                     /* rightshift */
335          2,                     /* size (0 = byte, 1 = short, 2 = long) */
336          32,                    /* bitsize */
337          FALSE,                 /* pc_relative */
338          0,                     /* bitpos */
339          complain_overflow_bitfield,/* complain_on_overflow */
340          bfd_elf_generic_reloc, /* special_function */
341          "R_ARM_TLS_DTPOFF32",  /* name */
342          TRUE,                  /* partial_inplace */
343          0xffffffff,            /* src_mask */
344          0xffffffff,            /* dst_mask */
345          FALSE),                /* pcrel_offset */
346
347   HOWTO (R_ARM_TLS_TPOFF32,     /* type */
348          0,                     /* rightshift */
349          2,                     /* size (0 = byte, 1 = short, 2 = long) */
350          32,                    /* bitsize */
351          FALSE,                 /* pc_relative */
352          0,                     /* bitpos */
353          complain_overflow_bitfield,/* complain_on_overflow */
354          bfd_elf_generic_reloc, /* special_function */
355          "R_ARM_TLS_TPOFF32",   /* name */
356          TRUE,                  /* partial_inplace */
357          0xffffffff,            /* src_mask */
358          0xffffffff,            /* dst_mask */
359          FALSE),                /* pcrel_offset */
360
361   /* Relocs used in ARM Linux */
362
363   HOWTO (R_ARM_COPY,            /* type */
364          0,                     /* rightshift */
365          2,                     /* size (0 = byte, 1 = short, 2 = long) */
366          32,                    /* bitsize */
367          FALSE,                 /* pc_relative */
368          0,                     /* bitpos */
369          complain_overflow_bitfield,/* complain_on_overflow */
370          bfd_elf_generic_reloc, /* special_function */
371          "R_ARM_COPY",          /* name */
372          TRUE,                  /* partial_inplace */
373          0xffffffff,            /* src_mask */
374          0xffffffff,            /* dst_mask */
375          FALSE),                /* pcrel_offset */
376
377   HOWTO (R_ARM_GLOB_DAT,        /* type */
378          0,                     /* rightshift */
379          2,                     /* size (0 = byte, 1 = short, 2 = long) */
380          32,                    /* bitsize */
381          FALSE,                 /* pc_relative */
382          0,                     /* bitpos */
383          complain_overflow_bitfield,/* complain_on_overflow */
384          bfd_elf_generic_reloc, /* special_function */
385          "R_ARM_GLOB_DAT",      /* name */
386          TRUE,                  /* partial_inplace */
387          0xffffffff,            /* src_mask */
388          0xffffffff,            /* dst_mask */
389          FALSE),                /* pcrel_offset */
390
391   HOWTO (R_ARM_JUMP_SLOT,       /* type */
392          0,                     /* rightshift */
393          2,                     /* size (0 = byte, 1 = short, 2 = long) */
394          32,                    /* bitsize */
395          FALSE,                 /* pc_relative */
396          0,                     /* bitpos */
397          complain_overflow_bitfield,/* complain_on_overflow */
398          bfd_elf_generic_reloc, /* special_function */
399          "R_ARM_JUMP_SLOT",     /* name */
400          TRUE,                  /* partial_inplace */
401          0xffffffff,            /* src_mask */
402          0xffffffff,            /* dst_mask */
403          FALSE),                /* pcrel_offset */
404
405   HOWTO (R_ARM_RELATIVE,        /* type */
406          0,                     /* rightshift */
407          2,                     /* size (0 = byte, 1 = short, 2 = long) */
408          32,                    /* bitsize */
409          FALSE,                 /* pc_relative */
410          0,                     /* bitpos */
411          complain_overflow_bitfield,/* complain_on_overflow */
412          bfd_elf_generic_reloc, /* special_function */
413          "R_ARM_RELATIVE",      /* name */
414          TRUE,                  /* partial_inplace */
415          0xffffffff,            /* src_mask */
416          0xffffffff,            /* dst_mask */
417          FALSE),                /* pcrel_offset */
418
419   HOWTO (R_ARM_GOTOFF32,        /* type */
420          0,                     /* rightshift */
421          2,                     /* size (0 = byte, 1 = short, 2 = long) */
422          32,                    /* bitsize */
423          FALSE,                 /* pc_relative */
424          0,                     /* bitpos */
425          complain_overflow_bitfield,/* complain_on_overflow */
426          bfd_elf_generic_reloc, /* special_function */
427          "R_ARM_GOTOFF32",      /* name */
428          TRUE,                  /* partial_inplace */
429          0xffffffff,            /* src_mask */
430          0xffffffff,            /* dst_mask */
431          FALSE),                /* pcrel_offset */
432
433   HOWTO (R_ARM_GOTPC,           /* type */
434          0,                     /* rightshift */
435          2,                     /* size (0 = byte, 1 = short, 2 = long) */
436          32,                    /* bitsize */
437          TRUE,                  /* pc_relative */
438          0,                     /* bitpos */
439          complain_overflow_bitfield,/* complain_on_overflow */
440          bfd_elf_generic_reloc, /* special_function */
441          "R_ARM_GOTPC",         /* name */
442          TRUE,                  /* partial_inplace */
443          0xffffffff,            /* src_mask */
444          0xffffffff,            /* dst_mask */
445          TRUE),                 /* pcrel_offset */
446
447   HOWTO (R_ARM_GOT32,           /* type */
448          0,                     /* rightshift */
449          2,                     /* size (0 = byte, 1 = short, 2 = long) */
450          32,                    /* bitsize */
451          FALSE,                 /* pc_relative */
452          0,                     /* bitpos */
453          complain_overflow_bitfield,/* complain_on_overflow */
454          bfd_elf_generic_reloc, /* special_function */
455          "R_ARM_GOT32",         /* name */
456          TRUE,                  /* partial_inplace */
457          0xffffffff,            /* src_mask */
458          0xffffffff,            /* dst_mask */
459          FALSE),                /* pcrel_offset */
460
461   HOWTO (R_ARM_PLT32,           /* type */
462          2,                     /* rightshift */
463          2,                     /* size (0 = byte, 1 = short, 2 = long) */
464          24,                    /* bitsize */
465          TRUE,                  /* pc_relative */
466          0,                     /* bitpos */
467          complain_overflow_bitfield,/* complain_on_overflow */
468          bfd_elf_generic_reloc, /* special_function */
469          "R_ARM_PLT32",         /* name */
470          FALSE,                 /* partial_inplace */
471          0x00ffffff,            /* src_mask */
472          0x00ffffff,            /* dst_mask */
473          TRUE),                 /* pcrel_offset */
474
475   HOWTO (R_ARM_CALL,            /* type */
476          2,                     /* rightshift */
477          2,                     /* size (0 = byte, 1 = short, 2 = long) */
478          24,                    /* bitsize */
479          TRUE,                  /* pc_relative */
480          0,                     /* bitpos */
481          complain_overflow_signed,/* complain_on_overflow */
482          bfd_elf_generic_reloc, /* special_function */
483          "R_ARM_CALL",          /* name */
484          FALSE,                 /* partial_inplace */
485          0x00ffffff,            /* src_mask */
486          0x00ffffff,            /* dst_mask */
487          TRUE),                 /* pcrel_offset */
488
489   HOWTO (R_ARM_JUMP24,          /* type */
490          2,                     /* rightshift */
491          2,                     /* size (0 = byte, 1 = short, 2 = long) */
492          24,                    /* bitsize */
493          TRUE,                  /* pc_relative */
494          0,                     /* bitpos */
495          complain_overflow_signed,/* complain_on_overflow */
496          bfd_elf_generic_reloc, /* special_function */
497          "R_ARM_JUMP24",        /* name */
498          FALSE,                 /* partial_inplace */
499          0x00ffffff,            /* src_mask */
500          0x00ffffff,            /* dst_mask */
501          TRUE),                 /* pcrel_offset */
502
503   HOWTO (R_ARM_THM_JUMP24,      /* type */
504          1,                     /* rightshift */
505          2,                     /* size (0 = byte, 1 = short, 2 = long) */
506          24,                    /* bitsize */
507          TRUE,                  /* pc_relative */
508          0,                     /* bitpos */
509          complain_overflow_signed,/* complain_on_overflow */
510          bfd_elf_generic_reloc, /* special_function */
511          "R_ARM_THM_JUMP24",    /* name */
512          FALSE,                 /* partial_inplace */
513          0x07ff2fff,            /* src_mask */
514          0x07ff2fff,            /* dst_mask */
515          TRUE),                 /* pcrel_offset */
516
517   HOWTO (R_ARM_BASE_ABS,        /* type */
518          0,                     /* rightshift */
519          2,                     /* size (0 = byte, 1 = short, 2 = long) */
520          32,                    /* bitsize */
521          FALSE,                 /* pc_relative */
522          0,                     /* bitpos */
523          complain_overflow_dont,/* complain_on_overflow */
524          bfd_elf_generic_reloc, /* special_function */
525          "R_ARM_BASE_ABS",      /* name */
526          FALSE,                 /* partial_inplace */
527          0xffffffff,            /* src_mask */
528          0xffffffff,            /* dst_mask */
529          FALSE),                /* pcrel_offset */
530
531   HOWTO (R_ARM_ALU_PCREL7_0,    /* type */
532          0,                     /* rightshift */
533          2,                     /* size (0 = byte, 1 = short, 2 = long) */
534          12,                    /* bitsize */
535          TRUE,                  /* pc_relative */
536          0,                     /* bitpos */
537          complain_overflow_dont,/* complain_on_overflow */
538          bfd_elf_generic_reloc, /* special_function */
539          "R_ARM_ALU_PCREL_7_0", /* name */
540          FALSE,                 /* partial_inplace */
541          0x00000fff,            /* src_mask */
542          0x00000fff,            /* dst_mask */
543          TRUE),                 /* pcrel_offset */
544
545   HOWTO (R_ARM_ALU_PCREL15_8,   /* type */
546          0,                     /* rightshift */
547          2,                     /* size (0 = byte, 1 = short, 2 = long) */
548          12,                    /* bitsize */
549          TRUE,                  /* pc_relative */
550          8,                     /* bitpos */
551          complain_overflow_dont,/* complain_on_overflow */
552          bfd_elf_generic_reloc, /* special_function */
553          "R_ARM_ALU_PCREL_15_8",/* name */
554          FALSE,                 /* partial_inplace */
555          0x00000fff,            /* src_mask */
556          0x00000fff,            /* dst_mask */
557          TRUE),                 /* pcrel_offset */
558
559   HOWTO (R_ARM_ALU_PCREL23_15,  /* type */
560          0,                     /* rightshift */
561          2,                     /* size (0 = byte, 1 = short, 2 = long) */
562          12,                    /* bitsize */
563          TRUE,                  /* pc_relative */
564          16,                    /* bitpos */
565          complain_overflow_dont,/* complain_on_overflow */
566          bfd_elf_generic_reloc, /* special_function */
567          "R_ARM_ALU_PCREL_23_15",/* name */
568          FALSE,                 /* partial_inplace */
569          0x00000fff,            /* src_mask */
570          0x00000fff,            /* dst_mask */
571          TRUE),                 /* pcrel_offset */
572
573   HOWTO (R_ARM_LDR_SBREL_11_0,  /* type */
574          0,                     /* rightshift */
575          2,                     /* size (0 = byte, 1 = short, 2 = long) */
576          12,                    /* bitsize */
577          FALSE,                 /* pc_relative */
578          0,                     /* bitpos */
579          complain_overflow_dont,/* complain_on_overflow */
580          bfd_elf_generic_reloc, /* special_function */
581          "R_ARM_LDR_SBREL_11_0",/* name */
582          FALSE,                 /* partial_inplace */
583          0x00000fff,            /* src_mask */
584          0x00000fff,            /* dst_mask */
585          FALSE),                /* pcrel_offset */
586
587   HOWTO (R_ARM_ALU_SBREL_19_12, /* type */
588          0,                     /* rightshift */
589          2,                     /* size (0 = byte, 1 = short, 2 = long) */
590          8,                     /* bitsize */
591          FALSE,                 /* pc_relative */
592          12,                    /* bitpos */
593          complain_overflow_dont,/* complain_on_overflow */
594          bfd_elf_generic_reloc, /* special_function */
595          "R_ARM_ALU_SBREL_19_12",/* name */
596          FALSE,                 /* partial_inplace */
597          0x000ff000,            /* src_mask */
598          0x000ff000,            /* dst_mask */
599          FALSE),                /* pcrel_offset */
600
601   HOWTO (R_ARM_ALU_SBREL_27_20, /* type */
602          0,                     /* rightshift */
603          2,                     /* size (0 = byte, 1 = short, 2 = long) */
604          8,                     /* bitsize */
605          FALSE,                 /* pc_relative */
606          20,                    /* bitpos */
607          complain_overflow_dont,/* complain_on_overflow */
608          bfd_elf_generic_reloc, /* special_function */
609          "R_ARM_ALU_SBREL_27_20",/* name */
610          FALSE,                 /* partial_inplace */
611          0x0ff00000,            /* src_mask */
612          0x0ff00000,            /* dst_mask */
613          FALSE),                /* pcrel_offset */
614
615   HOWTO (R_ARM_TARGET1,         /* type */
616          0,                     /* rightshift */
617          2,                     /* size (0 = byte, 1 = short, 2 = long) */
618          32,                    /* bitsize */
619          FALSE,                 /* pc_relative */
620          0,                     /* bitpos */
621          complain_overflow_dont,/* complain_on_overflow */
622          bfd_elf_generic_reloc, /* special_function */
623          "R_ARM_TARGET1",       /* name */
624          FALSE,                 /* partial_inplace */
625          0xffffffff,            /* src_mask */
626          0xffffffff,            /* dst_mask */
627          FALSE),                /* pcrel_offset */
628
629   HOWTO (R_ARM_ROSEGREL32,      /* type */
630          0,                     /* rightshift */
631          2,                     /* size (0 = byte, 1 = short, 2 = long) */
632          32,                    /* bitsize */
633          FALSE,                 /* pc_relative */
634          0,                     /* bitpos */
635          complain_overflow_dont,/* complain_on_overflow */
636          bfd_elf_generic_reloc, /* special_function */
637          "R_ARM_ROSEGREL32",    /* name */
638          FALSE,                 /* partial_inplace */
639          0xffffffff,            /* src_mask */
640          0xffffffff,            /* dst_mask */
641          FALSE),                /* pcrel_offset */
642
643   HOWTO (R_ARM_V4BX,            /* type */
644          0,                     /* rightshift */
645          2,                     /* size (0 = byte, 1 = short, 2 = long) */
646          32,                    /* bitsize */
647          FALSE,                 /* pc_relative */
648          0,                     /* bitpos */
649          complain_overflow_dont,/* complain_on_overflow */
650          bfd_elf_generic_reloc, /* special_function */
651          "R_ARM_V4BX",          /* name */
652          FALSE,                 /* partial_inplace */
653          0xffffffff,            /* src_mask */
654          0xffffffff,            /* dst_mask */
655          FALSE),                /* pcrel_offset */
656
657   HOWTO (R_ARM_TARGET2,         /* type */
658          0,                     /* rightshift */
659          2,                     /* size (0 = byte, 1 = short, 2 = long) */
660          32,                    /* bitsize */
661          FALSE,                 /* pc_relative */
662          0,                     /* bitpos */
663          complain_overflow_signed,/* complain_on_overflow */
664          bfd_elf_generic_reloc, /* special_function */
665          "R_ARM_TARGET2",       /* name */
666          FALSE,                 /* partial_inplace */
667          0xffffffff,            /* src_mask */
668          0xffffffff,            /* dst_mask */
669          TRUE),                 /* pcrel_offset */
670
671   HOWTO (R_ARM_PREL31,          /* type */
672          0,                     /* rightshift */
673          2,                     /* size (0 = byte, 1 = short, 2 = long) */
674          31,                    /* bitsize */
675          TRUE,                  /* pc_relative */
676          0,                     /* bitpos */
677          complain_overflow_signed,/* complain_on_overflow */
678          bfd_elf_generic_reloc, /* special_function */
679          "R_ARM_PREL31",        /* name */
680          FALSE,                 /* partial_inplace */
681          0x7fffffff,            /* src_mask */
682          0x7fffffff,            /* dst_mask */
683          TRUE),                 /* pcrel_offset */
684
685   HOWTO (R_ARM_MOVW_ABS_NC,     /* type */
686          0,                     /* rightshift */
687          2,                     /* size (0 = byte, 1 = short, 2 = long) */
688          16,                    /* bitsize */
689          FALSE,                 /* pc_relative */
690          0,                     /* bitpos */
691          complain_overflow_dont,/* complain_on_overflow */
692          bfd_elf_generic_reloc, /* special_function */
693          "R_ARM_MOVW_ABS_NC",   /* name */
694          FALSE,                 /* partial_inplace */
695          0x000f0fff,            /* src_mask */
696          0x000f0fff,            /* dst_mask */
697          FALSE),                /* pcrel_offset */
698
699   HOWTO (R_ARM_MOVT_ABS,        /* type */
700          0,                     /* rightshift */
701          2,                     /* size (0 = byte, 1 = short, 2 = long) */
702          16,                    /* bitsize */
703          FALSE,                 /* pc_relative */
704          0,                     /* bitpos */
705          complain_overflow_bitfield,/* complain_on_overflow */
706          bfd_elf_generic_reloc, /* special_function */
707          "R_ARM_MOVT_ABS",      /* name */
708          FALSE,                 /* partial_inplace */
709          0x000f0fff,            /* src_mask */
710          0x000f0fff,            /* dst_mask */
711          FALSE),                /* pcrel_offset */
712
713   HOWTO (R_ARM_MOVW_PREL_NC,    /* type */
714          0,                     /* rightshift */
715          2,                     /* size (0 = byte, 1 = short, 2 = long) */
716          16,                    /* bitsize */
717          TRUE,                  /* pc_relative */
718          0,                     /* bitpos */
719          complain_overflow_dont,/* complain_on_overflow */
720          bfd_elf_generic_reloc, /* special_function */
721          "R_ARM_MOVW_PREL_NC",  /* name */
722          FALSE,                 /* partial_inplace */
723          0x000f0fff,            /* src_mask */
724          0x000f0fff,            /* dst_mask */
725          TRUE),                 /* pcrel_offset */
726
727   HOWTO (R_ARM_MOVT_PREL,       /* type */
728          0,                     /* rightshift */
729          2,                     /* size (0 = byte, 1 = short, 2 = long) */
730          16,                    /* bitsize */
731          TRUE,                  /* pc_relative */
732          0,                     /* bitpos */
733          complain_overflow_bitfield,/* complain_on_overflow */
734          bfd_elf_generic_reloc, /* special_function */
735          "R_ARM_MOVT_PREL",     /* name */
736          FALSE,                 /* partial_inplace */
737          0x000f0fff,            /* src_mask */
738          0x000f0fff,            /* dst_mask */
739          TRUE),                 /* pcrel_offset */
740
741   HOWTO (R_ARM_THM_MOVW_ABS_NC, /* type */
742          0,                     /* rightshift */
743          2,                     /* size (0 = byte, 1 = short, 2 = long) */
744          16,                    /* bitsize */
745          FALSE,                 /* pc_relative */
746          0,                     /* bitpos */
747          complain_overflow_dont,/* complain_on_overflow */
748          bfd_elf_generic_reloc, /* special_function */
749          "R_ARM_THM_MOVW_ABS_NC",/* name */
750          FALSE,                 /* partial_inplace */
751          0x040f70ff,            /* src_mask */
752          0x040f70ff,            /* dst_mask */
753          FALSE),                /* pcrel_offset */
754
755   HOWTO (R_ARM_THM_MOVT_ABS,    /* type */
756          0,                     /* rightshift */
757          2,                     /* size (0 = byte, 1 = short, 2 = long) */
758          16,                    /* bitsize */
759          FALSE,                 /* pc_relative */
760          0,                     /* bitpos */
761          complain_overflow_bitfield,/* complain_on_overflow */
762          bfd_elf_generic_reloc, /* special_function */
763          "R_ARM_THM_MOVT_ABS",  /* name */
764          FALSE,                 /* partial_inplace */
765          0x040f70ff,            /* src_mask */
766          0x040f70ff,            /* dst_mask */
767          FALSE),                /* pcrel_offset */
768
769   HOWTO (R_ARM_THM_MOVW_PREL_NC,/* type */
770          0,                     /* rightshift */
771          2,                     /* size (0 = byte, 1 = short, 2 = long) */
772          16,                    /* bitsize */
773          TRUE,                  /* pc_relative */
774          0,                     /* bitpos */
775          complain_overflow_dont,/* complain_on_overflow */
776          bfd_elf_generic_reloc, /* special_function */
777          "R_ARM_THM_MOVW_PREL_NC",/* name */
778          FALSE,                 /* partial_inplace */
779          0x040f70ff,            /* src_mask */
780          0x040f70ff,            /* dst_mask */
781          TRUE),                 /* pcrel_offset */
782
783   HOWTO (R_ARM_THM_MOVT_PREL,   /* type */
784          0,                     /* rightshift */
785          2,                     /* size (0 = byte, 1 = short, 2 = long) */
786          16,                    /* bitsize */
787          TRUE,                  /* pc_relative */
788          0,                     /* bitpos */
789          complain_overflow_bitfield,/* complain_on_overflow */
790          bfd_elf_generic_reloc, /* special_function */
791          "R_ARM_THM_MOVT_PREL", /* name */
792          FALSE,                 /* partial_inplace */
793          0x040f70ff,            /* src_mask */
794          0x040f70ff,            /* dst_mask */
795          TRUE),                 /* pcrel_offset */
796
797   HOWTO (R_ARM_THM_JUMP19,      /* type */
798          1,                     /* rightshift */
799          2,                     /* size (0 = byte, 1 = short, 2 = long) */
800          19,                    /* bitsize */
801          TRUE,                  /* pc_relative */
802          0,                     /* bitpos */
803          complain_overflow_signed,/* complain_on_overflow */
804          bfd_elf_generic_reloc, /* special_function */
805          "R_ARM_THM_JUMP19",    /* name */
806          FALSE,                 /* partial_inplace */
807          0x043f2fff,            /* src_mask */
808          0x043f2fff,            /* dst_mask */
809          TRUE),                 /* pcrel_offset */
810
811   HOWTO (R_ARM_THM_JUMP6,       /* type */
812          1,                     /* rightshift */
813          1,                     /* size (0 = byte, 1 = short, 2 = long) */
814          6,                     /* bitsize */
815          TRUE,                  /* pc_relative */
816          0,                     /* bitpos */
817          complain_overflow_unsigned,/* complain_on_overflow */
818          bfd_elf_generic_reloc, /* special_function */
819          "R_ARM_THM_JUMP6",     /* name */
820          FALSE,                 /* partial_inplace */
821          0x02f8,                /* src_mask */
822          0x02f8,                /* dst_mask */
823          TRUE),                 /* pcrel_offset */
824
825   /* These are declared as 13-bit signed relocations because we can
826      address -4095 .. 4095(base) by altering ADDW to SUBW or vice
827      versa.  */
828   HOWTO (R_ARM_THM_ALU_PREL_11_0,/* type */
829          0,                     /* rightshift */
830          2,                     /* size (0 = byte, 1 = short, 2 = long) */
831          13,                    /* bitsize */
832          TRUE,                  /* pc_relative */
833          0,                     /* bitpos */
834          complain_overflow_dont,/* complain_on_overflow */
835          bfd_elf_generic_reloc, /* special_function */
836          "R_ARM_THM_ALU_PREL_11_0",/* name */
837          FALSE,                 /* partial_inplace */
838          0xffffffff,            /* src_mask */
839          0xffffffff,            /* dst_mask */
840          TRUE),                 /* pcrel_offset */
841
842   HOWTO (R_ARM_THM_PC12,        /* type */
843          0,                     /* rightshift */
844          2,                     /* size (0 = byte, 1 = short, 2 = long) */
845          13,                    /* bitsize */
846          TRUE,                  /* pc_relative */
847          0,                     /* bitpos */
848          complain_overflow_dont,/* complain_on_overflow */
849          bfd_elf_generic_reloc, /* special_function */
850          "R_ARM_THM_PC12",      /* name */
851          FALSE,                 /* partial_inplace */
852          0xffffffff,            /* src_mask */
853          0xffffffff,            /* dst_mask */
854          TRUE),                 /* pcrel_offset */
855
856   HOWTO (R_ARM_ABS32_NOI,       /* type */
857          0,                     /* rightshift */
858          2,                     /* size (0 = byte, 1 = short, 2 = long) */
859          32,                    /* bitsize */
860          FALSE,                 /* pc_relative */
861          0,                     /* bitpos */
862          complain_overflow_dont,/* complain_on_overflow */
863          bfd_elf_generic_reloc, /* special_function */
864          "R_ARM_ABS32_NOI",     /* name */
865          FALSE,                 /* partial_inplace */
866          0xffffffff,            /* src_mask */
867          0xffffffff,            /* dst_mask */
868          FALSE),                /* pcrel_offset */
869
870   HOWTO (R_ARM_REL32_NOI,       /* type */
871          0,                     /* rightshift */
872          2,                     /* size (0 = byte, 1 = short, 2 = long) */
873          32,                    /* bitsize */
874          TRUE,                  /* pc_relative */
875          0,                     /* bitpos */
876          complain_overflow_dont,/* complain_on_overflow */
877          bfd_elf_generic_reloc, /* special_function */
878          "R_ARM_REL32_NOI",     /* name */
879          FALSE,                 /* partial_inplace */
880          0xffffffff,            /* src_mask */
881          0xffffffff,            /* dst_mask */
882          FALSE),                /* pcrel_offset */
883
884   /* Group relocations.  */
885
886   HOWTO (R_ARM_ALU_PC_G0_NC,    /* type */
887          0,                     /* rightshift */
888          2,                     /* size (0 = byte, 1 = short, 2 = long) */
889          32,                    /* bitsize */
890          TRUE,                  /* pc_relative */
891          0,                     /* bitpos */
892          complain_overflow_dont,/* complain_on_overflow */
893          bfd_elf_generic_reloc, /* special_function */
894          "R_ARM_ALU_PC_G0_NC",  /* name */
895          FALSE,                 /* partial_inplace */
896          0xffffffff,            /* src_mask */
897          0xffffffff,            /* dst_mask */
898          TRUE),                 /* pcrel_offset */
899
900   HOWTO (R_ARM_ALU_PC_G0,       /* type */
901          0,                     /* rightshift */
902          2,                     /* size (0 = byte, 1 = short, 2 = long) */
903          32,                    /* bitsize */
904          TRUE,                  /* pc_relative */
905          0,                     /* bitpos */
906          complain_overflow_dont,/* complain_on_overflow */
907          bfd_elf_generic_reloc, /* special_function */
908          "R_ARM_ALU_PC_G0",     /* name */
909          FALSE,                 /* partial_inplace */
910          0xffffffff,            /* src_mask */
911          0xffffffff,            /* dst_mask */
912          TRUE),                 /* pcrel_offset */
913
914   HOWTO (R_ARM_ALU_PC_G1_NC,    /* type */
915          0,                     /* rightshift */
916          2,                     /* size (0 = byte, 1 = short, 2 = long) */
917          32,                    /* bitsize */
918          TRUE,                  /* pc_relative */
919          0,                     /* bitpos */
920          complain_overflow_dont,/* complain_on_overflow */
921          bfd_elf_generic_reloc, /* special_function */
922          "R_ARM_ALU_PC_G1_NC",  /* name */
923          FALSE,                 /* partial_inplace */
924          0xffffffff,            /* src_mask */
925          0xffffffff,            /* dst_mask */
926          TRUE),                 /* pcrel_offset */
927
928   HOWTO (R_ARM_ALU_PC_G1,       /* type */
929          0,                     /* rightshift */
930          2,                     /* size (0 = byte, 1 = short, 2 = long) */
931          32,                    /* bitsize */
932          TRUE,                  /* pc_relative */
933          0,                     /* bitpos */
934          complain_overflow_dont,/* complain_on_overflow */
935          bfd_elf_generic_reloc, /* special_function */
936          "R_ARM_ALU_PC_G1",     /* name */
937          FALSE,                 /* partial_inplace */
938          0xffffffff,            /* src_mask */
939          0xffffffff,            /* dst_mask */
940          TRUE),                 /* pcrel_offset */
941
942   HOWTO (R_ARM_ALU_PC_G2,       /* type */
943          0,                     /* rightshift */
944          2,                     /* size (0 = byte, 1 = short, 2 = long) */
945          32,                    /* bitsize */
946          TRUE,                  /* pc_relative */
947          0,                     /* bitpos */
948          complain_overflow_dont,/* complain_on_overflow */
949          bfd_elf_generic_reloc, /* special_function */
950          "R_ARM_ALU_PC_G2",     /* name */
951          FALSE,                 /* partial_inplace */
952          0xffffffff,            /* src_mask */
953          0xffffffff,            /* dst_mask */
954          TRUE),                 /* pcrel_offset */
955
956   HOWTO (R_ARM_LDR_PC_G1,       /* type */
957          0,                     /* rightshift */
958          2,                     /* size (0 = byte, 1 = short, 2 = long) */
959          32,                    /* bitsize */
960          TRUE,                  /* pc_relative */
961          0,                     /* bitpos */
962          complain_overflow_dont,/* complain_on_overflow */
963          bfd_elf_generic_reloc, /* special_function */
964          "R_ARM_LDR_PC_G1",     /* name */
965          FALSE,                 /* partial_inplace */
966          0xffffffff,            /* src_mask */
967          0xffffffff,            /* dst_mask */
968          TRUE),                 /* pcrel_offset */
969
970   HOWTO (R_ARM_LDR_PC_G2,       /* type */
971          0,                     /* rightshift */
972          2,                     /* size (0 = byte, 1 = short, 2 = long) */
973          32,                    /* bitsize */
974          TRUE,                  /* pc_relative */
975          0,                     /* bitpos */
976          complain_overflow_dont,/* complain_on_overflow */
977          bfd_elf_generic_reloc, /* special_function */
978          "R_ARM_LDR_PC_G2",     /* name */
979          FALSE,                 /* partial_inplace */
980          0xffffffff,            /* src_mask */
981          0xffffffff,            /* dst_mask */
982          TRUE),                 /* pcrel_offset */
983
984   HOWTO (R_ARM_LDRS_PC_G0,      /* type */
985          0,                     /* rightshift */
986          2,                     /* size (0 = byte, 1 = short, 2 = long) */
987          32,                    /* bitsize */
988          TRUE,                  /* pc_relative */
989          0,                     /* bitpos */
990          complain_overflow_dont,/* complain_on_overflow */
991          bfd_elf_generic_reloc, /* special_function */
992          "R_ARM_LDRS_PC_G0",    /* name */
993          FALSE,                 /* partial_inplace */
994          0xffffffff,            /* src_mask */
995          0xffffffff,            /* dst_mask */
996          TRUE),                 /* pcrel_offset */
997
998   HOWTO (R_ARM_LDRS_PC_G1,      /* type */
999          0,                     /* rightshift */
1000          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1001          32,                    /* bitsize */
1002          TRUE,                  /* pc_relative */
1003          0,                     /* bitpos */
1004          complain_overflow_dont,/* complain_on_overflow */
1005          bfd_elf_generic_reloc, /* special_function */
1006          "R_ARM_LDRS_PC_G1",    /* name */
1007          FALSE,                 /* partial_inplace */
1008          0xffffffff,            /* src_mask */
1009          0xffffffff,            /* dst_mask */
1010          TRUE),                 /* pcrel_offset */
1011
1012   HOWTO (R_ARM_LDRS_PC_G2,      /* type */
1013          0,                     /* rightshift */
1014          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1015          32,                    /* bitsize */
1016          TRUE,                  /* pc_relative */
1017          0,                     /* bitpos */
1018          complain_overflow_dont,/* complain_on_overflow */
1019          bfd_elf_generic_reloc, /* special_function */
1020          "R_ARM_LDRS_PC_G2",    /* name */
1021          FALSE,                 /* partial_inplace */
1022          0xffffffff,            /* src_mask */
1023          0xffffffff,            /* dst_mask */
1024          TRUE),                 /* pcrel_offset */
1025
1026   HOWTO (R_ARM_LDC_PC_G0,       /* type */
1027          0,                     /* rightshift */
1028          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1029          32,                    /* bitsize */
1030          TRUE,                  /* pc_relative */
1031          0,                     /* bitpos */
1032          complain_overflow_dont,/* complain_on_overflow */
1033          bfd_elf_generic_reloc, /* special_function */
1034          "R_ARM_LDC_PC_G0",     /* name */
1035          FALSE,                 /* partial_inplace */
1036          0xffffffff,            /* src_mask */
1037          0xffffffff,            /* dst_mask */
1038          TRUE),                 /* pcrel_offset */
1039
1040   HOWTO (R_ARM_LDC_PC_G1,       /* type */
1041          0,                     /* rightshift */
1042          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1043          32,                    /* bitsize */
1044          TRUE,                  /* pc_relative */
1045          0,                     /* bitpos */
1046          complain_overflow_dont,/* complain_on_overflow */
1047          bfd_elf_generic_reloc, /* special_function */
1048          "R_ARM_LDC_PC_G1",     /* name */
1049          FALSE,                 /* partial_inplace */
1050          0xffffffff,            /* src_mask */
1051          0xffffffff,            /* dst_mask */
1052          TRUE),                 /* pcrel_offset */
1053
1054   HOWTO (R_ARM_LDC_PC_G2,       /* type */
1055          0,                     /* rightshift */
1056          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1057          32,                    /* bitsize */
1058          TRUE,                  /* pc_relative */
1059          0,                     /* bitpos */
1060          complain_overflow_dont,/* complain_on_overflow */
1061          bfd_elf_generic_reloc, /* special_function */
1062          "R_ARM_LDC_PC_G2",     /* name */
1063          FALSE,                 /* partial_inplace */
1064          0xffffffff,            /* src_mask */
1065          0xffffffff,            /* dst_mask */
1066          TRUE),                 /* pcrel_offset */
1067
1068   HOWTO (R_ARM_ALU_SB_G0_NC,    /* type */
1069          0,                     /* rightshift */
1070          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1071          32,                    /* bitsize */
1072          TRUE,                  /* pc_relative */
1073          0,                     /* bitpos */
1074          complain_overflow_dont,/* complain_on_overflow */
1075          bfd_elf_generic_reloc, /* special_function */
1076          "R_ARM_ALU_SB_G0_NC",  /* name */
1077          FALSE,                 /* partial_inplace */
1078          0xffffffff,            /* src_mask */
1079          0xffffffff,            /* dst_mask */
1080          TRUE),                 /* pcrel_offset */
1081
1082   HOWTO (R_ARM_ALU_SB_G0,       /* type */
1083          0,                     /* rightshift */
1084          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1085          32,                    /* bitsize */
1086          TRUE,                  /* pc_relative */
1087          0,                     /* bitpos */
1088          complain_overflow_dont,/* complain_on_overflow */
1089          bfd_elf_generic_reloc, /* special_function */
1090          "R_ARM_ALU_SB_G0",     /* name */
1091          FALSE,                 /* partial_inplace */
1092          0xffffffff,            /* src_mask */
1093          0xffffffff,            /* dst_mask */
1094          TRUE),                 /* pcrel_offset */
1095
1096   HOWTO (R_ARM_ALU_SB_G1_NC,    /* type */
1097          0,                     /* rightshift */
1098          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1099          32,                    /* bitsize */
1100          TRUE,                  /* pc_relative */
1101          0,                     /* bitpos */
1102          complain_overflow_dont,/* complain_on_overflow */
1103          bfd_elf_generic_reloc, /* special_function */
1104          "R_ARM_ALU_SB_G1_NC",  /* name */
1105          FALSE,                 /* partial_inplace */
1106          0xffffffff,            /* src_mask */
1107          0xffffffff,            /* dst_mask */
1108          TRUE),                 /* pcrel_offset */
1109
1110   HOWTO (R_ARM_ALU_SB_G1,       /* type */
1111          0,                     /* rightshift */
1112          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1113          32,                    /* bitsize */
1114          TRUE,                  /* pc_relative */
1115          0,                     /* bitpos */
1116          complain_overflow_dont,/* complain_on_overflow */
1117          bfd_elf_generic_reloc, /* special_function */
1118          "R_ARM_ALU_SB_G1",     /* name */
1119          FALSE,                 /* partial_inplace */
1120          0xffffffff,            /* src_mask */
1121          0xffffffff,            /* dst_mask */
1122          TRUE),                 /* pcrel_offset */
1123
1124   HOWTO (R_ARM_ALU_SB_G2,       /* type */
1125          0,                     /* rightshift */
1126          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1127          32,                    /* bitsize */
1128          TRUE,                  /* pc_relative */
1129          0,                     /* bitpos */
1130          complain_overflow_dont,/* complain_on_overflow */
1131          bfd_elf_generic_reloc, /* special_function */
1132          "R_ARM_ALU_SB_G2",     /* name */
1133          FALSE,                 /* partial_inplace */
1134          0xffffffff,            /* src_mask */
1135          0xffffffff,            /* dst_mask */
1136          TRUE),                 /* pcrel_offset */
1137
1138   HOWTO (R_ARM_LDR_SB_G0,       /* type */
1139          0,                     /* rightshift */
1140          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1141          32,                    /* bitsize */
1142          TRUE,                  /* pc_relative */
1143          0,                     /* bitpos */
1144          complain_overflow_dont,/* complain_on_overflow */
1145          bfd_elf_generic_reloc, /* special_function */
1146          "R_ARM_LDR_SB_G0",     /* name */
1147          FALSE,                 /* partial_inplace */
1148          0xffffffff,            /* src_mask */
1149          0xffffffff,            /* dst_mask */
1150          TRUE),                 /* pcrel_offset */
1151
1152   HOWTO (R_ARM_LDR_SB_G1,       /* type */
1153          0,                     /* rightshift */
1154          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1155          32,                    /* bitsize */
1156          TRUE,                  /* pc_relative */
1157          0,                     /* bitpos */
1158          complain_overflow_dont,/* complain_on_overflow */
1159          bfd_elf_generic_reloc, /* special_function */
1160          "R_ARM_LDR_SB_G1",     /* name */
1161          FALSE,                 /* partial_inplace */
1162          0xffffffff,            /* src_mask */
1163          0xffffffff,            /* dst_mask */
1164          TRUE),                 /* pcrel_offset */
1165
1166   HOWTO (R_ARM_LDR_SB_G2,       /* type */
1167          0,                     /* rightshift */
1168          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1169          32,                    /* bitsize */
1170          TRUE,                  /* pc_relative */
1171          0,                     /* bitpos */
1172          complain_overflow_dont,/* complain_on_overflow */
1173          bfd_elf_generic_reloc, /* special_function */
1174          "R_ARM_LDR_SB_G2",     /* name */
1175          FALSE,                 /* partial_inplace */
1176          0xffffffff,            /* src_mask */
1177          0xffffffff,            /* dst_mask */
1178          TRUE),                 /* pcrel_offset */
1179
1180   HOWTO (R_ARM_LDRS_SB_G0,      /* type */
1181          0,                     /* rightshift */
1182          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1183          32,                    /* bitsize */
1184          TRUE,                  /* pc_relative */
1185          0,                     /* bitpos */
1186          complain_overflow_dont,/* complain_on_overflow */
1187          bfd_elf_generic_reloc, /* special_function */
1188          "R_ARM_LDRS_SB_G0",    /* name */
1189          FALSE,                 /* partial_inplace */
1190          0xffffffff,            /* src_mask */
1191          0xffffffff,            /* dst_mask */
1192          TRUE),                 /* pcrel_offset */
1193
1194   HOWTO (R_ARM_LDRS_SB_G1,      /* type */
1195          0,                     /* rightshift */
1196          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1197          32,                    /* bitsize */
1198          TRUE,                  /* pc_relative */
1199          0,                     /* bitpos */
1200          complain_overflow_dont,/* complain_on_overflow */
1201          bfd_elf_generic_reloc, /* special_function */
1202          "R_ARM_LDRS_SB_G1",    /* name */
1203          FALSE,                 /* partial_inplace */
1204          0xffffffff,            /* src_mask */
1205          0xffffffff,            /* dst_mask */
1206          TRUE),                 /* pcrel_offset */
1207
1208   HOWTO (R_ARM_LDRS_SB_G2,      /* type */
1209          0,                     /* rightshift */
1210          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1211          32,                    /* bitsize */
1212          TRUE,                  /* pc_relative */
1213          0,                     /* bitpos */
1214          complain_overflow_dont,/* complain_on_overflow */
1215          bfd_elf_generic_reloc, /* special_function */
1216          "R_ARM_LDRS_SB_G2",    /* name */
1217          FALSE,                 /* partial_inplace */
1218          0xffffffff,            /* src_mask */
1219          0xffffffff,            /* dst_mask */
1220          TRUE),                 /* pcrel_offset */
1221
1222   HOWTO (R_ARM_LDC_SB_G0,       /* type */
1223          0,                     /* rightshift */
1224          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1225          32,                    /* bitsize */
1226          TRUE,                  /* pc_relative */
1227          0,                     /* bitpos */
1228          complain_overflow_dont,/* complain_on_overflow */
1229          bfd_elf_generic_reloc, /* special_function */
1230          "R_ARM_LDC_SB_G0",     /* name */
1231          FALSE,                 /* partial_inplace */
1232          0xffffffff,            /* src_mask */
1233          0xffffffff,            /* dst_mask */
1234          TRUE),                 /* pcrel_offset */
1235
1236   HOWTO (R_ARM_LDC_SB_G1,       /* type */
1237          0,                     /* rightshift */
1238          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1239          32,                    /* bitsize */
1240          TRUE,                  /* pc_relative */
1241          0,                     /* bitpos */
1242          complain_overflow_dont,/* complain_on_overflow */
1243          bfd_elf_generic_reloc, /* special_function */
1244          "R_ARM_LDC_SB_G1",     /* name */
1245          FALSE,                 /* partial_inplace */
1246          0xffffffff,            /* src_mask */
1247          0xffffffff,            /* dst_mask */
1248          TRUE),                 /* pcrel_offset */
1249
1250   HOWTO (R_ARM_LDC_SB_G2,       /* type */
1251          0,                     /* rightshift */
1252          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1253          32,                    /* bitsize */
1254          TRUE,                  /* pc_relative */
1255          0,                     /* bitpos */
1256          complain_overflow_dont,/* complain_on_overflow */
1257          bfd_elf_generic_reloc, /* special_function */
1258          "R_ARM_LDC_SB_G2",     /* name */
1259          FALSE,                 /* partial_inplace */
1260          0xffffffff,            /* src_mask */
1261          0xffffffff,            /* dst_mask */
1262          TRUE),                 /* pcrel_offset */
1263
1264   /* End of group relocations.  */
1265
1266   HOWTO (R_ARM_MOVW_BREL_NC,    /* type */
1267          0,                     /* rightshift */
1268          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1269          16,                    /* bitsize */
1270          FALSE,                 /* pc_relative */
1271          0,                     /* bitpos */
1272          complain_overflow_dont,/* complain_on_overflow */
1273          bfd_elf_generic_reloc, /* special_function */
1274          "R_ARM_MOVW_BREL_NC",  /* name */
1275          FALSE,                 /* partial_inplace */
1276          0x0000ffff,            /* src_mask */
1277          0x0000ffff,            /* dst_mask */
1278          FALSE),                /* pcrel_offset */
1279
1280   HOWTO (R_ARM_MOVT_BREL,       /* type */
1281          0,                     /* rightshift */
1282          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1283          16,                    /* bitsize */
1284          FALSE,                 /* pc_relative */
1285          0,                     /* bitpos */
1286          complain_overflow_bitfield,/* complain_on_overflow */
1287          bfd_elf_generic_reloc, /* special_function */
1288          "R_ARM_MOVT_BREL",     /* name */
1289          FALSE,                 /* partial_inplace */
1290          0x0000ffff,            /* src_mask */
1291          0x0000ffff,            /* dst_mask */
1292          FALSE),                /* pcrel_offset */
1293
1294   HOWTO (R_ARM_MOVW_BREL,       /* type */
1295          0,                     /* rightshift */
1296          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1297          16,                    /* bitsize */
1298          FALSE,                 /* pc_relative */
1299          0,                     /* bitpos */
1300          complain_overflow_dont,/* complain_on_overflow */
1301          bfd_elf_generic_reloc, /* special_function */
1302          "R_ARM_MOVW_BREL",     /* name */
1303          FALSE,                 /* partial_inplace */
1304          0x0000ffff,            /* src_mask */
1305          0x0000ffff,            /* dst_mask */
1306          FALSE),                /* pcrel_offset */
1307
1308   HOWTO (R_ARM_THM_MOVW_BREL_NC,/* type */
1309          0,                     /* rightshift */
1310          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1311          16,                    /* bitsize */
1312          FALSE,                 /* pc_relative */
1313          0,                     /* bitpos */
1314          complain_overflow_dont,/* complain_on_overflow */
1315          bfd_elf_generic_reloc, /* special_function */
1316          "R_ARM_THM_MOVW_BREL_NC",/* name */
1317          FALSE,                 /* partial_inplace */
1318          0x040f70ff,            /* src_mask */
1319          0x040f70ff,            /* dst_mask */
1320          FALSE),                /* pcrel_offset */
1321
1322   HOWTO (R_ARM_THM_MOVT_BREL,   /* type */
1323          0,                     /* rightshift */
1324          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1325          16,                    /* bitsize */
1326          FALSE,                 /* pc_relative */
1327          0,                     /* bitpos */
1328          complain_overflow_bitfield,/* complain_on_overflow */
1329          bfd_elf_generic_reloc, /* special_function */
1330          "R_ARM_THM_MOVT_BREL", /* name */
1331          FALSE,                 /* partial_inplace */
1332          0x040f70ff,            /* src_mask */
1333          0x040f70ff,            /* dst_mask */
1334          FALSE),                /* pcrel_offset */
1335
1336   HOWTO (R_ARM_THM_MOVW_BREL,   /* type */
1337          0,                     /* rightshift */
1338          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1339          16,                    /* bitsize */
1340          FALSE,                 /* pc_relative */
1341          0,                     /* bitpos */
1342          complain_overflow_dont,/* complain_on_overflow */
1343          bfd_elf_generic_reloc, /* special_function */
1344          "R_ARM_THM_MOVW_BREL", /* name */
1345          FALSE,                 /* partial_inplace */
1346          0x040f70ff,            /* src_mask */
1347          0x040f70ff,            /* dst_mask */
1348          FALSE),                /* pcrel_offset */
1349
1350   EMPTY_HOWTO (90),   /* Unallocated.  */
1351   EMPTY_HOWTO (91),
1352   EMPTY_HOWTO (92),
1353   EMPTY_HOWTO (93),
1354
1355   HOWTO (R_ARM_PLT32_ABS,       /* type */
1356          0,                     /* rightshift */
1357          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1358          32,                    /* bitsize */
1359          FALSE,                 /* pc_relative */
1360          0,                     /* bitpos */
1361          complain_overflow_dont,/* complain_on_overflow */
1362          bfd_elf_generic_reloc, /* special_function */
1363          "R_ARM_PLT32_ABS",     /* name */
1364          FALSE,                 /* partial_inplace */
1365          0xffffffff,            /* src_mask */
1366          0xffffffff,            /* dst_mask */
1367          FALSE),                /* pcrel_offset */
1368
1369   HOWTO (R_ARM_GOT_ABS,         /* type */
1370          0,                     /* rightshift */
1371          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1372          32,                    /* bitsize */
1373          FALSE,                 /* pc_relative */
1374          0,                     /* bitpos */
1375          complain_overflow_dont,/* complain_on_overflow */
1376          bfd_elf_generic_reloc, /* special_function */
1377          "R_ARM_GOT_ABS",       /* name */
1378          FALSE,                 /* partial_inplace */
1379          0xffffffff,            /* src_mask */
1380          0xffffffff,            /* dst_mask */
1381          FALSE),                        /* pcrel_offset */
1382
1383   HOWTO (R_ARM_GOT_PREL,        /* type */
1384          0,                     /* rightshift */
1385          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1386          32,                    /* bitsize */
1387          TRUE,                  /* pc_relative */
1388          0,                     /* bitpos */
1389          complain_overflow_dont,        /* complain_on_overflow */
1390          bfd_elf_generic_reloc, /* special_function */
1391          "R_ARM_GOT_PREL",      /* name */
1392          FALSE,                 /* partial_inplace */
1393          0xffffffff,            /* src_mask */
1394          0xffffffff,            /* dst_mask */
1395          TRUE),                 /* pcrel_offset */
1396
1397   HOWTO (R_ARM_GOT_BREL12,      /* type */
1398          0,                     /* rightshift */
1399          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1400          12,                    /* bitsize */
1401          FALSE,                 /* pc_relative */
1402          0,                     /* bitpos */
1403          complain_overflow_bitfield,/* complain_on_overflow */
1404          bfd_elf_generic_reloc, /* special_function */
1405          "R_ARM_GOT_BREL12",    /* name */
1406          FALSE,                 /* partial_inplace */
1407          0x00000fff,            /* src_mask */
1408          0x00000fff,            /* dst_mask */
1409          FALSE),                /* pcrel_offset */
1410
1411   HOWTO (R_ARM_GOTOFF12,        /* type */
1412          0,                     /* rightshift */
1413          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1414          12,                    /* bitsize */
1415          FALSE,                 /* pc_relative */
1416          0,                     /* bitpos */
1417          complain_overflow_bitfield,/* complain_on_overflow */
1418          bfd_elf_generic_reloc, /* special_function */
1419          "R_ARM_GOTOFF12",      /* name */
1420          FALSE,                 /* partial_inplace */
1421          0x00000fff,            /* src_mask */
1422          0x00000fff,            /* dst_mask */
1423          FALSE),                /* pcrel_offset */
1424
1425   EMPTY_HOWTO (R_ARM_GOTRELAX),  /* reserved for future GOT-load optimizations */
1426
1427   /* GNU extension to record C++ vtable member usage */
1428   HOWTO (R_ARM_GNU_VTENTRY,     /* type */
1429          0,                     /* rightshift */
1430          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1431          0,                     /* bitsize */
1432          FALSE,                 /* pc_relative */
1433          0,                     /* bitpos */
1434          complain_overflow_dont, /* complain_on_overflow */
1435          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
1436          "R_ARM_GNU_VTENTRY",   /* name */
1437          FALSE,                 /* partial_inplace */
1438          0,                     /* src_mask */
1439          0,                     /* dst_mask */
1440          FALSE),                /* pcrel_offset */
1441
1442   /* GNU extension to record C++ vtable hierarchy */
1443   HOWTO (R_ARM_GNU_VTINHERIT, /* type */
1444          0,                     /* rightshift */
1445          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1446          0,                     /* bitsize */
1447          FALSE,                 /* pc_relative */
1448          0,                     /* bitpos */
1449          complain_overflow_dont, /* complain_on_overflow */
1450          NULL,                  /* special_function */
1451          "R_ARM_GNU_VTINHERIT", /* name */
1452          FALSE,                 /* partial_inplace */
1453          0,                     /* src_mask */
1454          0,                     /* dst_mask */
1455          FALSE),                /* pcrel_offset */
1456
1457   HOWTO (R_ARM_THM_JUMP11,      /* type */
1458          1,                     /* rightshift */
1459          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1460          11,                    /* bitsize */
1461          TRUE,                  /* pc_relative */
1462          0,                     /* bitpos */
1463          complain_overflow_signed,      /* complain_on_overflow */
1464          bfd_elf_generic_reloc, /* special_function */
1465          "R_ARM_THM_JUMP11",    /* name */
1466          FALSE,                 /* partial_inplace */
1467          0x000007ff,            /* src_mask */
1468          0x000007ff,            /* dst_mask */
1469          TRUE),                 /* pcrel_offset */
1470
1471   HOWTO (R_ARM_THM_JUMP8,       /* type */
1472          1,                     /* rightshift */
1473          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1474          8,                     /* bitsize */
1475          TRUE,                  /* pc_relative */
1476          0,                     /* bitpos */
1477          complain_overflow_signed,      /* complain_on_overflow */
1478          bfd_elf_generic_reloc, /* special_function */
1479          "R_ARM_THM_JUMP8",     /* name */
1480          FALSE,                 /* partial_inplace */
1481          0x000000ff,            /* src_mask */
1482          0x000000ff,            /* dst_mask */
1483          TRUE),                 /* pcrel_offset */
1484
1485   /* TLS relocations */
1486   HOWTO (R_ARM_TLS_GD32,        /* type */
1487          0,                     /* rightshift */
1488          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1489          32,                    /* bitsize */
1490          FALSE,                 /* pc_relative */
1491          0,                     /* bitpos */
1492          complain_overflow_bitfield,/* complain_on_overflow */
1493          NULL,                  /* special_function */
1494          "R_ARM_TLS_GD32",      /* name */
1495          TRUE,                  /* partial_inplace */
1496          0xffffffff,            /* src_mask */
1497          0xffffffff,            /* dst_mask */
1498          FALSE),                /* pcrel_offset */
1499
1500   HOWTO (R_ARM_TLS_LDM32,       /* type */
1501          0,                     /* rightshift */
1502          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1503          32,                    /* bitsize */
1504          FALSE,                 /* pc_relative */
1505          0,                     /* bitpos */
1506          complain_overflow_bitfield,/* complain_on_overflow */
1507          bfd_elf_generic_reloc, /* special_function */
1508          "R_ARM_TLS_LDM32",     /* name */
1509          TRUE,                  /* partial_inplace */
1510          0xffffffff,            /* src_mask */
1511          0xffffffff,            /* dst_mask */
1512          FALSE),                /* pcrel_offset */
1513
1514   HOWTO (R_ARM_TLS_LDO32,       /* type */
1515          0,                     /* rightshift */
1516          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1517          32,                    /* bitsize */
1518          FALSE,                 /* pc_relative */
1519          0,                     /* bitpos */
1520          complain_overflow_bitfield,/* complain_on_overflow */
1521          bfd_elf_generic_reloc, /* special_function */
1522          "R_ARM_TLS_LDO32",     /* name */
1523          TRUE,                  /* partial_inplace */
1524          0xffffffff,            /* src_mask */
1525          0xffffffff,            /* dst_mask */
1526          FALSE),                /* pcrel_offset */
1527
1528   HOWTO (R_ARM_TLS_IE32,        /* type */
1529          0,                     /* rightshift */
1530          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1531          32,                    /* bitsize */
1532          FALSE,                  /* pc_relative */
1533          0,                     /* bitpos */
1534          complain_overflow_bitfield,/* complain_on_overflow */
1535          NULL,                  /* special_function */
1536          "R_ARM_TLS_IE32",      /* name */
1537          TRUE,                  /* partial_inplace */
1538          0xffffffff,            /* src_mask */
1539          0xffffffff,            /* dst_mask */
1540          FALSE),                /* pcrel_offset */
1541
1542   HOWTO (R_ARM_TLS_LE32,        /* type */
1543          0,                     /* rightshift */
1544          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1545          32,                    /* bitsize */
1546          FALSE,                 /* pc_relative */
1547          0,                     /* bitpos */
1548          complain_overflow_bitfield,/* complain_on_overflow */
1549          bfd_elf_generic_reloc, /* special_function */
1550          "R_ARM_TLS_LE32",      /* name */
1551          TRUE,                  /* partial_inplace */
1552          0xffffffff,            /* src_mask */
1553          0xffffffff,            /* dst_mask */
1554          FALSE),                /* pcrel_offset */
1555
1556   HOWTO (R_ARM_TLS_LDO12,       /* type */
1557          0,                     /* rightshift */
1558          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1559          12,                    /* bitsize */
1560          FALSE,                 /* pc_relative */
1561          0,                     /* bitpos */
1562          complain_overflow_bitfield,/* complain_on_overflow */
1563          bfd_elf_generic_reloc, /* special_function */
1564          "R_ARM_TLS_LDO12",     /* name */
1565          FALSE,                 /* partial_inplace */
1566          0x00000fff,            /* src_mask */
1567          0x00000fff,            /* dst_mask */
1568          FALSE),                /* pcrel_offset */
1569
1570   HOWTO (R_ARM_TLS_LE12,        /* type */
1571          0,                     /* rightshift */
1572          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1573          12,                    /* bitsize */
1574          FALSE,                 /* pc_relative */
1575          0,                     /* bitpos */
1576          complain_overflow_bitfield,/* complain_on_overflow */
1577          bfd_elf_generic_reloc, /* special_function */
1578          "R_ARM_TLS_LE12",      /* name */
1579          FALSE,                 /* partial_inplace */
1580          0x00000fff,            /* src_mask */
1581          0x00000fff,            /* dst_mask */
1582          FALSE),                /* pcrel_offset */
1583
1584   HOWTO (R_ARM_TLS_IE12GP,      /* type */
1585          0,                     /* rightshift */
1586          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1587          12,                    /* bitsize */
1588          FALSE,                 /* pc_relative */
1589          0,                     /* bitpos */
1590          complain_overflow_bitfield,/* complain_on_overflow */
1591          bfd_elf_generic_reloc, /* special_function */
1592          "R_ARM_TLS_IE12GP",    /* name */
1593          FALSE,                 /* partial_inplace */
1594          0x00000fff,            /* src_mask */
1595          0x00000fff,            /* dst_mask */
1596          FALSE),                /* pcrel_offset */
1597 };
1598
1599 /* 112-127 private relocations
1600    128 R_ARM_ME_TOO, obsolete
1601    129-255 unallocated in AAELF.
1602
1603    249-255 extended, currently unused, relocations:  */
1604
1605 static reloc_howto_type elf32_arm_howto_table_2[4] =
1606 {
1607   HOWTO (R_ARM_RREL32,          /* type */
1608          0,                     /* rightshift */
1609          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1610          0,                     /* bitsize */
1611          FALSE,                 /* pc_relative */
1612          0,                     /* bitpos */
1613          complain_overflow_dont,/* complain_on_overflow */
1614          bfd_elf_generic_reloc, /* special_function */
1615          "R_ARM_RREL32",        /* name */
1616          FALSE,                 /* partial_inplace */
1617          0,                     /* src_mask */
1618          0,                     /* dst_mask */
1619          FALSE),                /* pcrel_offset */
1620
1621   HOWTO (R_ARM_RABS32,          /* type */
1622          0,                     /* rightshift */
1623          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1624          0,                     /* bitsize */
1625          FALSE,                 /* pc_relative */
1626          0,                     /* bitpos */
1627          complain_overflow_dont,/* complain_on_overflow */
1628          bfd_elf_generic_reloc, /* special_function */
1629          "R_ARM_RABS32",        /* name */
1630          FALSE,                 /* partial_inplace */
1631          0,                     /* src_mask */
1632          0,                     /* dst_mask */
1633          FALSE),                /* pcrel_offset */
1634
1635   HOWTO (R_ARM_RPC24,           /* type */
1636          0,                     /* rightshift */
1637          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1638          0,                     /* bitsize */
1639          FALSE,                 /* pc_relative */
1640          0,                     /* bitpos */
1641          complain_overflow_dont,/* complain_on_overflow */
1642          bfd_elf_generic_reloc, /* special_function */
1643          "R_ARM_RPC24",         /* name */
1644          FALSE,                 /* partial_inplace */
1645          0,                     /* src_mask */
1646          0,                     /* dst_mask */
1647          FALSE),                /* pcrel_offset */
1648
1649   HOWTO (R_ARM_RBASE,           /* type */
1650          0,                     /* rightshift */
1651          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1652          0,                     /* bitsize */
1653          FALSE,                 /* pc_relative */
1654          0,                     /* bitpos */
1655          complain_overflow_dont,/* complain_on_overflow */
1656          bfd_elf_generic_reloc, /* special_function */
1657          "R_ARM_RBASE",         /* name */
1658          FALSE,                 /* partial_inplace */
1659          0,                     /* src_mask */
1660          0,                     /* dst_mask */
1661          FALSE)                 /* pcrel_offset */
1662 };
1663
1664 static reloc_howto_type *
1665 elf32_arm_howto_from_type (unsigned int r_type)
1666 {
1667   if (r_type < ARRAY_SIZE (elf32_arm_howto_table_1))
1668     return &elf32_arm_howto_table_1[r_type];
1669
1670   if (r_type >= R_ARM_RREL32
1671       && r_type < R_ARM_RREL32 + ARRAY_SIZE (elf32_arm_howto_table_2))
1672     return &elf32_arm_howto_table_2[r_type - R_ARM_RREL32];
1673
1674   return NULL;
1675 }
1676
1677 static void
1678 elf32_arm_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED, arelent * bfd_reloc,
1679                          Elf_Internal_Rela * elf_reloc)
1680 {
1681   unsigned int r_type;
1682
1683   r_type = ELF32_R_TYPE (elf_reloc->r_info);
1684   bfd_reloc->howto = elf32_arm_howto_from_type (r_type);
1685 }
1686
1687 struct elf32_arm_reloc_map
1688   {
1689     bfd_reloc_code_real_type  bfd_reloc_val;
1690     unsigned char             elf_reloc_val;
1691   };
1692
1693 /* All entries in this list must also be present in elf32_arm_howto_table.  */
1694 static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
1695   {
1696     {BFD_RELOC_NONE,                 R_ARM_NONE},
1697     {BFD_RELOC_ARM_PCREL_BRANCH,     R_ARM_PC24},
1698     {BFD_RELOC_ARM_PCREL_CALL,       R_ARM_CALL},
1699     {BFD_RELOC_ARM_PCREL_JUMP,       R_ARM_JUMP24},
1700     {BFD_RELOC_ARM_PCREL_BLX,        R_ARM_XPC25},
1701     {BFD_RELOC_THUMB_PCREL_BLX,      R_ARM_THM_XPC22},
1702     {BFD_RELOC_32,                   R_ARM_ABS32},
1703     {BFD_RELOC_32_PCREL,             R_ARM_REL32},
1704     {BFD_RELOC_8,                    R_ARM_ABS8},
1705     {BFD_RELOC_16,                   R_ARM_ABS16},
1706     {BFD_RELOC_ARM_OFFSET_IMM,       R_ARM_ABS12},
1707     {BFD_RELOC_ARM_THUMB_OFFSET,     R_ARM_THM_ABS5},
1708     {BFD_RELOC_THUMB_PCREL_BRANCH25, R_ARM_THM_JUMP24},
1709     {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_CALL},
1710     {BFD_RELOC_THUMB_PCREL_BRANCH12, R_ARM_THM_JUMP11},
1711     {BFD_RELOC_THUMB_PCREL_BRANCH20, R_ARM_THM_JUMP19},
1712     {BFD_RELOC_THUMB_PCREL_BRANCH9,  R_ARM_THM_JUMP8},
1713     {BFD_RELOC_THUMB_PCREL_BRANCH7,  R_ARM_THM_JUMP6},
1714     {BFD_RELOC_ARM_GLOB_DAT,         R_ARM_GLOB_DAT},
1715     {BFD_RELOC_ARM_JUMP_SLOT,        R_ARM_JUMP_SLOT},
1716     {BFD_RELOC_ARM_RELATIVE,         R_ARM_RELATIVE},
1717     {BFD_RELOC_ARM_GOTOFF,           R_ARM_GOTOFF32},
1718     {BFD_RELOC_ARM_GOTPC,            R_ARM_GOTPC},
1719     {BFD_RELOC_ARM_GOT32,            R_ARM_GOT32},
1720     {BFD_RELOC_ARM_PLT32,            R_ARM_PLT32},
1721     {BFD_RELOC_ARM_TARGET1,          R_ARM_TARGET1},
1722     {BFD_RELOC_ARM_ROSEGREL32,       R_ARM_ROSEGREL32},
1723     {BFD_RELOC_ARM_SBREL32,          R_ARM_SBREL32},
1724     {BFD_RELOC_ARM_PREL31,           R_ARM_PREL31},
1725     {BFD_RELOC_ARM_TARGET2,          R_ARM_TARGET2},
1726     {BFD_RELOC_ARM_PLT32,            R_ARM_PLT32},
1727     {BFD_RELOC_ARM_TLS_GD32,         R_ARM_TLS_GD32},
1728     {BFD_RELOC_ARM_TLS_LDO32,        R_ARM_TLS_LDO32},
1729     {BFD_RELOC_ARM_TLS_LDM32,        R_ARM_TLS_LDM32},
1730     {BFD_RELOC_ARM_TLS_DTPMOD32,     R_ARM_TLS_DTPMOD32},
1731     {BFD_RELOC_ARM_TLS_DTPOFF32,     R_ARM_TLS_DTPOFF32},
1732     {BFD_RELOC_ARM_TLS_TPOFF32,      R_ARM_TLS_TPOFF32},
1733     {BFD_RELOC_ARM_TLS_IE32,         R_ARM_TLS_IE32},
1734     {BFD_RELOC_ARM_TLS_LE32,         R_ARM_TLS_LE32},
1735     {BFD_RELOC_VTABLE_INHERIT,       R_ARM_GNU_VTINHERIT},
1736     {BFD_RELOC_VTABLE_ENTRY,         R_ARM_GNU_VTENTRY},
1737     {BFD_RELOC_ARM_MOVW,             R_ARM_MOVW_ABS_NC},
1738     {BFD_RELOC_ARM_MOVT,             R_ARM_MOVT_ABS},
1739     {BFD_RELOC_ARM_MOVW_PCREL,       R_ARM_MOVW_PREL_NC},
1740     {BFD_RELOC_ARM_MOVT_PCREL,       R_ARM_MOVT_PREL},
1741     {BFD_RELOC_ARM_THUMB_MOVW,       R_ARM_THM_MOVW_ABS_NC},
1742     {BFD_RELOC_ARM_THUMB_MOVT,       R_ARM_THM_MOVT_ABS},
1743     {BFD_RELOC_ARM_THUMB_MOVW_PCREL, R_ARM_THM_MOVW_PREL_NC},
1744     {BFD_RELOC_ARM_THUMB_MOVT_PCREL, R_ARM_THM_MOVT_PREL},
1745     {BFD_RELOC_ARM_ALU_PC_G0_NC, R_ARM_ALU_PC_G0_NC},
1746     {BFD_RELOC_ARM_ALU_PC_G0, R_ARM_ALU_PC_G0},
1747     {BFD_RELOC_ARM_ALU_PC_G1_NC, R_ARM_ALU_PC_G1_NC},
1748     {BFD_RELOC_ARM_ALU_PC_G1, R_ARM_ALU_PC_G1},
1749     {BFD_RELOC_ARM_ALU_PC_G2, R_ARM_ALU_PC_G2},
1750     {BFD_RELOC_ARM_LDR_PC_G0, R_ARM_LDR_PC_G0},
1751     {BFD_RELOC_ARM_LDR_PC_G1, R_ARM_LDR_PC_G1},
1752     {BFD_RELOC_ARM_LDR_PC_G2, R_ARM_LDR_PC_G2},
1753     {BFD_RELOC_ARM_LDRS_PC_G0, R_ARM_LDRS_PC_G0},
1754     {BFD_RELOC_ARM_LDRS_PC_G1, R_ARM_LDRS_PC_G1},
1755     {BFD_RELOC_ARM_LDRS_PC_G2, R_ARM_LDRS_PC_G2},
1756     {BFD_RELOC_ARM_LDC_PC_G0, R_ARM_LDC_PC_G0},
1757     {BFD_RELOC_ARM_LDC_PC_G1, R_ARM_LDC_PC_G1},
1758     {BFD_RELOC_ARM_LDC_PC_G2, R_ARM_LDC_PC_G2},
1759     {BFD_RELOC_ARM_ALU_SB_G0_NC, R_ARM_ALU_SB_G0_NC},
1760     {BFD_RELOC_ARM_ALU_SB_G0, R_ARM_ALU_SB_G0},
1761     {BFD_RELOC_ARM_ALU_SB_G1_NC, R_ARM_ALU_SB_G1_NC},
1762     {BFD_RELOC_ARM_ALU_SB_G1, R_ARM_ALU_SB_G1},
1763     {BFD_RELOC_ARM_ALU_SB_G2, R_ARM_ALU_SB_G2},
1764     {BFD_RELOC_ARM_LDR_SB_G0, R_ARM_LDR_SB_G0},
1765     {BFD_RELOC_ARM_LDR_SB_G1, R_ARM_LDR_SB_G1},
1766     {BFD_RELOC_ARM_LDR_SB_G2, R_ARM_LDR_SB_G2},
1767     {BFD_RELOC_ARM_LDRS_SB_G0, R_ARM_LDRS_SB_G0},
1768     {BFD_RELOC_ARM_LDRS_SB_G1, R_ARM_LDRS_SB_G1},
1769     {BFD_RELOC_ARM_LDRS_SB_G2, R_ARM_LDRS_SB_G2},
1770     {BFD_RELOC_ARM_LDC_SB_G0, R_ARM_LDC_SB_G0},
1771     {BFD_RELOC_ARM_LDC_SB_G1, R_ARM_LDC_SB_G1},
1772     {BFD_RELOC_ARM_LDC_SB_G2, R_ARM_LDC_SB_G2},
1773     {BFD_RELOC_ARM_V4BX,             R_ARM_V4BX}
1774   };
1775
1776 static reloc_howto_type *
1777 elf32_arm_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1778                              bfd_reloc_code_real_type code)
1779 {
1780   unsigned int i;
1781
1782   for (i = 0; i < ARRAY_SIZE (elf32_arm_reloc_map); i ++)
1783     if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
1784       return elf32_arm_howto_from_type (elf32_arm_reloc_map[i].elf_reloc_val);
1785
1786   return NULL;
1787 }
1788
1789 static reloc_howto_type *
1790 elf32_arm_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1791                              const char *r_name)
1792 {
1793   unsigned int i;
1794
1795   for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_1); i++)
1796     if (elf32_arm_howto_table_1[i].name != NULL
1797         && strcasecmp (elf32_arm_howto_table_1[i].name, r_name) == 0)
1798       return &elf32_arm_howto_table_1[i];
1799
1800   for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_2); i++)
1801     if (elf32_arm_howto_table_2[i].name != NULL
1802         && strcasecmp (elf32_arm_howto_table_2[i].name, r_name) == 0)
1803       return &elf32_arm_howto_table_2[i];
1804
1805   return NULL;
1806 }
1807
1808 /* Support for core dump NOTE sections.  */
1809
1810 static bfd_boolean
1811 elf32_arm_nabi_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1812 {
1813   int offset;
1814   size_t size;
1815
1816   switch (note->descsz)
1817     {
1818       default:
1819         return FALSE;
1820
1821       case 148:         /* Linux/ARM 32-bit.  */
1822         /* pr_cursig */
1823         elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1824
1825         /* pr_pid */
1826         elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1827
1828         /* pr_reg */
1829         offset = 72;
1830         size = 72;
1831
1832         break;
1833     }
1834
1835   /* Make a ".reg/999" section.  */
1836   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1837                                           size, note->descpos + offset);
1838 }
1839
1840 static bfd_boolean
1841 elf32_arm_nabi_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1842 {
1843   switch (note->descsz)
1844     {
1845       default:
1846         return FALSE;
1847
1848       case 124:         /* Linux/ARM elf_prpsinfo.  */
1849         elf_tdata (abfd)->core_program
1850          = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1851         elf_tdata (abfd)->core_command
1852          = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1853     }
1854
1855   /* Note that for some reason, a spurious space is tacked
1856      onto the end of the args in some (at least one anyway)
1857      implementations, so strip it off if it exists.  */
1858   {
1859     char *command = elf_tdata (abfd)->core_command;
1860     int n = strlen (command);
1861
1862     if (0 < n && command[n - 1] == ' ')
1863       command[n - 1] = '\0';
1864   }
1865
1866   return TRUE;
1867 }
1868
1869 #define TARGET_LITTLE_SYM               bfd_elf32_littlearm_vec
1870 #define TARGET_LITTLE_NAME              "elf32-littlearm"
1871 #define TARGET_BIG_SYM                  bfd_elf32_bigarm_vec
1872 #define TARGET_BIG_NAME                 "elf32-bigarm"
1873
1874 #define elf_backend_grok_prstatus       elf32_arm_nabi_grok_prstatus
1875 #define elf_backend_grok_psinfo         elf32_arm_nabi_grok_psinfo
1876
1877 typedef unsigned long int insn32;
1878 typedef unsigned short int insn16;
1879
1880 /* In lieu of proper flags, assume all EABIv4 or later objects are
1881    interworkable.  */
1882 #define INTERWORK_FLAG(abfd)  \
1883   (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) >= EF_ARM_EABI_VER4 \
1884   || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK))
1885
1886 /* The linker script knows the section names for placement.
1887    The entry_names are used to do simple name mangling on the stubs.
1888    Given a function name, and its type, the stub can be found. The
1889    name can be changed. The only requirement is the %s be present.  */
1890 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
1891 #define THUMB2ARM_GLUE_ENTRY_NAME   "__%s_from_thumb"
1892
1893 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
1894 #define ARM2THUMB_GLUE_ENTRY_NAME   "__%s_from_arm"
1895
1896 #define VFP11_ERRATUM_VENEER_SECTION_NAME ".vfp11_veneer"
1897 #define VFP11_ERRATUM_VENEER_ENTRY_NAME   "__vfp11_veneer_%x"
1898
1899 #define ARM_BX_GLUE_SECTION_NAME ".v4_bx"
1900 #define ARM_BX_GLUE_ENTRY_NAME   "__bx_r%d"
1901
1902 #define STUB_ENTRY_NAME   "__%s_veneer"
1903
1904 /* The name of the dynamic interpreter.  This is put in the .interp
1905    section.  */
1906 #define ELF_DYNAMIC_INTERPRETER     "/usr/lib/ld.so.1"
1907
1908 #ifdef FOUR_WORD_PLT
1909
1910 /* The first entry in a procedure linkage table looks like
1911    this.  It is set up so that any shared library function that is
1912    called before the relocation has been set up calls the dynamic
1913    linker first.  */
1914 static const bfd_vma elf32_arm_plt0_entry [] =
1915   {
1916     0xe52de004,         /* str   lr, [sp, #-4]! */
1917     0xe59fe010,         /* ldr   lr, [pc, #16]  */
1918     0xe08fe00e,         /* add   lr, pc, lr     */
1919     0xe5bef008,         /* ldr   pc, [lr, #8]!  */
1920   };
1921
1922 /* Subsequent entries in a procedure linkage table look like
1923    this.  */
1924 static const bfd_vma elf32_arm_plt_entry [] =
1925   {
1926     0xe28fc600,         /* add   ip, pc, #NN    */
1927     0xe28cca00,         /* add   ip, ip, #NN    */
1928     0xe5bcf000,         /* ldr   pc, [ip, #NN]! */
1929     0x00000000,         /* unused               */
1930   };
1931
1932 #else
1933
1934 /* The first entry in a procedure linkage table looks like
1935    this.  It is set up so that any shared library function that is
1936    called before the relocation has been set up calls the dynamic
1937    linker first.  */
1938 static const bfd_vma elf32_arm_plt0_entry [] =
1939   {
1940     0xe52de004,         /* str   lr, [sp, #-4]! */
1941     0xe59fe004,         /* ldr   lr, [pc, #4]   */
1942     0xe08fe00e,         /* add   lr, pc, lr     */
1943     0xe5bef008,         /* ldr   pc, [lr, #8]!  */
1944     0x00000000,         /* &GOT[0] - .          */
1945   };
1946
1947 /* Subsequent entries in a procedure linkage table look like
1948    this.  */
1949 static const bfd_vma elf32_arm_plt_entry [] =
1950   {
1951     0xe28fc600,         /* add   ip, pc, #0xNN00000 */
1952     0xe28cca00,         /* add   ip, ip, #0xNN000   */
1953     0xe5bcf000,         /* ldr   pc, [ip, #0xNNN]!  */
1954   };
1955
1956 #endif
1957
1958 /* The format of the first entry in the procedure linkage table
1959    for a VxWorks executable.  */
1960 static const bfd_vma elf32_arm_vxworks_exec_plt0_entry[] =
1961   {
1962     0xe52dc008,         /* str    ip,[sp,#-8]!                  */
1963     0xe59fc000,         /* ldr    ip,[pc]                       */
1964     0xe59cf008,         /* ldr    pc,[ip,#8]                    */
1965     0x00000000,         /* .long  _GLOBAL_OFFSET_TABLE_         */
1966   };
1967
1968 /* The format of subsequent entries in a VxWorks executable.  */
1969 static const bfd_vma elf32_arm_vxworks_exec_plt_entry[] =
1970   {
1971     0xe59fc000,         /* ldr    ip,[pc]                       */
1972     0xe59cf000,         /* ldr    pc,[ip]                       */
1973     0x00000000,         /* .long  @got                          */
1974     0xe59fc000,         /* ldr    ip,[pc]                       */
1975     0xea000000,         /* b      _PLT                          */
1976     0x00000000,         /* .long  @pltindex*sizeof(Elf32_Rela)  */
1977   };
1978
1979 /* The format of entries in a VxWorks shared library.  */
1980 static const bfd_vma elf32_arm_vxworks_shared_plt_entry[] =
1981   {
1982     0xe59fc000,         /* ldr    ip,[pc]                       */
1983     0xe79cf009,         /* ldr    pc,[ip,r9]                    */
1984     0x00000000,         /* .long  @got                          */
1985     0xe59fc000,         /* ldr    ip,[pc]                       */
1986     0xe599f008,         /* ldr    pc,[r9,#8]                    */
1987     0x00000000,         /* .long  @pltindex*sizeof(Elf32_Rela)  */
1988   };
1989
1990 /* An initial stub used if the PLT entry is referenced from Thumb code.  */
1991 #define PLT_THUMB_STUB_SIZE 4
1992 static const bfd_vma elf32_arm_plt_thumb_stub [] =
1993   {
1994     0x4778,             /* bx pc */
1995     0x46c0              /* nop   */
1996   };
1997
1998 /* The entries in a PLT when using a DLL-based target with multiple
1999    address spaces.  */
2000 static const bfd_vma elf32_arm_symbian_plt_entry [] =
2001   {
2002     0xe51ff004,         /* ldr   pc, [pc, #-4] */
2003     0x00000000,         /* dcd   R_ARM_GLOB_DAT(X) */
2004   };
2005
2006 #define ARM_MAX_FWD_BRANCH_OFFSET  ((((1 << 23) - 1) << 2) + 8)
2007 #define ARM_MAX_BWD_BRANCH_OFFSET  ((-((1 << 23) << 2)) + 8)
2008 #define THM_MAX_FWD_BRANCH_OFFSET  ((1 << 22) -2 + 4)
2009 #define THM_MAX_BWD_BRANCH_OFFSET  (-(1 << 22) + 4)
2010 #define THM2_MAX_FWD_BRANCH_OFFSET (((1 << 24) - 2) + 4)
2011 #define THM2_MAX_BWD_BRANCH_OFFSET (-(1 << 24) + 4)
2012
2013 static const bfd_vma arm_long_branch_stub[] =
2014   {
2015     0xe51ff004,         /* ldr   pc, [pc, #-4] */
2016     0x00000000,         /* dcd   R_ARM_ABS32(X) */
2017   };
2018
2019 static const bfd_vma arm_thumb_v4t_long_branch_stub[] =
2020   {
2021     0xe59fc000,         /* ldr   ip, [pc, #0] */
2022     0xe12fff1c,         /* bx    ip */
2023     0x00000000,         /* dcd   R_ARM_ABS32(X) */
2024   };
2025
2026 static const bfd_vma arm_thumb_thumb_long_branch_stub[] =
2027   {
2028     0x4e02b540,         /* push {r6, lr} */
2029                         /* ldr  r6, [pc, #8] */
2030     0x473046fe,         /* mov  lr, pc */
2031                         /* bx   r6 */
2032     0xbf00bd40,         /* pop  {r6, pc} */
2033                         /* nop */
2034     0x00000000,         /* dcd  R_ARM_ABS32(X) */
2035   };
2036
2037 static const bfd_vma arm_thumb_arm_v4t_long_branch_stub[] =
2038   {
2039     0x4e03b540,         /* push {r6, lr} */
2040                         /* ldr  r6, [pc, #12] */
2041     0x473046fe,         /* mov  lr, pc */
2042                         /* bx   r6 */
2043     0xe8bd4040,         /* pop  {r6, pc} */
2044     0xe12fff1e,         /* bx   lr */
2045     0x00000000,         /* dcd  R_ARM_ABS32(X) */
2046   };
2047
2048 static const bfd_vma arm_thumb_arm_v4t_short_branch_stub[] =
2049   {
2050     0x46c04778,         /* bx   pc */
2051                         /* nop   */
2052     0xea000000,         /* b    (X) */
2053   };
2054
2055 static const bfd_vma arm_pic_long_branch_stub[] =
2056   {
2057     0xe59fc000,         /* ldr   r12, [pc] */
2058     0xe08ff00c,         /* add   pc, pc, ip */
2059     0x00000000,         /* dcd   R_ARM_REL32(X) */
2060   };
2061
2062 /* Section name for stubs is the associated section name plus this
2063    string.  */
2064 #define STUB_SUFFIX ".stub"
2065
2066 enum elf32_arm_stub_type
2067 {
2068   arm_stub_none,
2069   arm_stub_long_branch,
2070   arm_thumb_v4t_stub_long_branch,
2071   arm_thumb_thumb_stub_long_branch,
2072   arm_thumb_arm_v4t_stub_long_branch,
2073   arm_thumb_arm_v4t_stub_short_branch,
2074   arm_stub_pic_long_branch,
2075 };
2076
2077 struct elf32_arm_stub_hash_entry
2078 {
2079   /* Base hash table entry structure.  */
2080   struct bfd_hash_entry root;
2081
2082   /* The stub section.  */
2083   asection *stub_sec;
2084
2085   /* Offset within stub_sec of the beginning of this stub.  */
2086   bfd_vma stub_offset;
2087
2088   /* Given the symbol's value and its section we can determine its final
2089      value when building the stubs (so the stub knows where to jump).  */
2090   bfd_vma target_value;
2091   asection *target_section;
2092
2093   enum elf32_arm_stub_type stub_type;
2094
2095   /* The symbol table entry, if any, that this was derived from.  */
2096   struct elf32_arm_link_hash_entry *h;
2097
2098   /* Destination symbol type (STT_ARM_TFUNC, ...) */
2099   unsigned char st_type;
2100
2101   /* Where this stub is being called from, or, in the case of combined
2102      stub sections, the first input section in the group.  */
2103   asection *id_sec;
2104
2105   /* The name for the local symbol at the start of this stub.  The
2106      stub name in the hash table has to be unique; this does not, so
2107      it can be friendlier.  */
2108   char *output_name;
2109 };
2110
2111 /* Used to build a map of a section.  This is required for mixed-endian
2112    code/data.  */
2113
2114 typedef struct elf32_elf_section_map
2115 {
2116   bfd_vma vma;
2117   char type;
2118 }
2119 elf32_arm_section_map;
2120
2121 /* Information about a VFP11 erratum veneer, or a branch to such a veneer.  */
2122
2123 typedef enum
2124 {
2125   VFP11_ERRATUM_BRANCH_TO_ARM_VENEER,
2126   VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER,
2127   VFP11_ERRATUM_ARM_VENEER,
2128   VFP11_ERRATUM_THUMB_VENEER
2129 }
2130 elf32_vfp11_erratum_type;
2131
2132 typedef struct elf32_vfp11_erratum_list
2133 {
2134   struct elf32_vfp11_erratum_list *next;
2135   bfd_vma vma;
2136   union
2137   {
2138     struct
2139     {
2140       struct elf32_vfp11_erratum_list *veneer;
2141       unsigned int vfp_insn;
2142     } b;
2143     struct
2144     {
2145       struct elf32_vfp11_erratum_list *branch;
2146       unsigned int id;
2147     } v;
2148   } u;
2149   elf32_vfp11_erratum_type type;
2150 }
2151 elf32_vfp11_erratum_list;
2152
2153 typedef struct _arm_elf_section_data
2154 {
2155   struct bfd_elf_section_data elf;
2156   unsigned int mapcount;
2157   unsigned int mapsize;
2158   elf32_arm_section_map *map;
2159   unsigned int erratumcount;
2160   elf32_vfp11_erratum_list *erratumlist;
2161 }
2162 _arm_elf_section_data;
2163
2164 #define elf32_arm_section_data(sec) \
2165   ((_arm_elf_section_data *) elf_section_data (sec))
2166
2167 /* The size of the thread control block.  */
2168 #define TCB_SIZE        8
2169
2170 struct elf_arm_obj_tdata
2171 {
2172   struct elf_obj_tdata root;
2173
2174   /* tls_type for each local got entry.  */
2175   char *local_got_tls_type;
2176
2177   /* Zero to warn when linking objects with incompatible enum sizes.  */
2178   int no_enum_size_warning;
2179
2180   /* Zero to warn when linking objects with incompatible wchar_t sizes.  */
2181   int no_wchar_size_warning;
2182 };
2183
2184 #define elf_arm_tdata(bfd) \
2185   ((struct elf_arm_obj_tdata *) (bfd)->tdata.any)
2186
2187 #define elf32_arm_local_got_tls_type(bfd) \
2188   (elf_arm_tdata (bfd)->local_got_tls_type)
2189
2190 #define is_arm_elf(bfd) \
2191   (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2192    && elf_tdata (bfd) != NULL \
2193    && elf_object_id (bfd) == ARM_ELF_TDATA)
2194
2195 static bfd_boolean
2196 elf32_arm_mkobject (bfd *abfd)
2197 {
2198   return bfd_elf_allocate_object (abfd, sizeof (struct elf_arm_obj_tdata),
2199                                   ARM_ELF_TDATA);
2200 }
2201
2202 /* The ARM linker needs to keep track of the number of relocs that it
2203    decides to copy in check_relocs for each symbol.  This is so that
2204    it can discard PC relative relocs if it doesn't need them when
2205    linking with -Bsymbolic.  We store the information in a field
2206    extending the regular ELF linker hash table.  */
2207
2208 /* This structure keeps track of the number of relocs we have copied
2209    for a given symbol.  */
2210 struct elf32_arm_relocs_copied
2211   {
2212     /* Next section.  */
2213     struct elf32_arm_relocs_copied * next;
2214     /* A section in dynobj.  */
2215     asection * section;
2216     /* Number of relocs copied in this section.  */
2217     bfd_size_type count;
2218     /* Number of PC-relative relocs copied in this section.  */
2219     bfd_size_type pc_count;
2220   };
2221
2222 #define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
2223
2224 /* Arm ELF linker hash entry.  */
2225 struct elf32_arm_link_hash_entry
2226   {
2227     struct elf_link_hash_entry root;
2228
2229     /* Number of PC relative relocs copied for this symbol.  */
2230     struct elf32_arm_relocs_copied * relocs_copied;
2231
2232     /* We reference count Thumb references to a PLT entry separately,
2233        so that we can emit the Thumb trampoline only if needed.  */
2234     bfd_signed_vma plt_thumb_refcount;
2235
2236     /* Some references from Thumb code may be eliminated by BL->BLX
2237        conversion, so record them separately.  */
2238     bfd_signed_vma plt_maybe_thumb_refcount;
2239
2240     /* Since PLT entries have variable size if the Thumb prologue is
2241        used, we need to record the index into .got.plt instead of
2242        recomputing it from the PLT offset.  */
2243     bfd_signed_vma plt_got_offset;
2244
2245 #define GOT_UNKNOWN     0
2246 #define GOT_NORMAL      1
2247 #define GOT_TLS_GD      2
2248 #define GOT_TLS_IE      4
2249     unsigned char tls_type;
2250
2251     /* The symbol marking the real symbol location for exported thumb
2252        symbols with Arm stubs.  */
2253     struct elf_link_hash_entry *export_glue;
2254
2255    /* A pointer to the most recently used stub hash entry against this
2256      symbol.  */
2257     struct elf32_arm_stub_hash_entry *stub_cache;
2258   };
2259
2260 /* Traverse an arm ELF linker hash table.  */
2261 #define elf32_arm_link_hash_traverse(table, func, info)                 \
2262   (elf_link_hash_traverse                                               \
2263    (&(table)->root,                                                     \
2264     (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func),    \
2265     (info)))
2266
2267 /* Get the ARM elf linker hash table from a link_info structure.  */
2268 #define elf32_arm_hash_table(info) \
2269   ((struct elf32_arm_link_hash_table *) ((info)->hash))
2270
2271 #define arm_stub_hash_lookup(table, string, create, copy) \
2272   ((struct elf32_arm_stub_hash_entry *) \
2273    bfd_hash_lookup ((table), (string), (create), (copy)))
2274
2275 /* ARM ELF linker hash table.  */
2276 struct elf32_arm_link_hash_table
2277 {
2278   /* The main hash table.  */
2279   struct elf_link_hash_table root;
2280
2281   /* The size in bytes of the section containing the Thumb-to-ARM glue.  */
2282   bfd_size_type thumb_glue_size;
2283
2284   /* The size in bytes of the section containing the ARM-to-Thumb glue.  */
2285   bfd_size_type arm_glue_size;
2286
2287   /* The size in bytes of section containing the ARMv4 BX veneers.  */
2288   bfd_size_type bx_glue_size;
2289
2290   /* Offsets of ARMv4 BX veneers.  Bit1 set if present, and Bit0 set when
2291      veneer has been populated.  */
2292   bfd_vma bx_glue_offset[15];
2293
2294   /* The size in bytes of the section containing glue for VFP11 erratum
2295      veneers.  */
2296   bfd_size_type vfp11_erratum_glue_size;
2297
2298   /* An arbitrary input BFD chosen to hold the glue sections.  */
2299   bfd * bfd_of_glue_owner;
2300
2301   /* Nonzero to output a BE8 image.  */
2302   int byteswap_code;
2303
2304   /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
2305      Nonzero if R_ARM_TARGET1 means R_ARM_REL32.  */
2306   int target1_is_rel;
2307
2308   /* The relocation to use for R_ARM_TARGET2 relocations.  */
2309   int target2_reloc;
2310
2311   /* 0 = Ignore R_ARM_V4BX.
2312      1 = Convert BX to MOV PC.
2313      2 = Generate v4 interworing stubs.  */
2314   int fix_v4bx;
2315
2316   /* Nonzero if the ARM/Thumb BLX instructions are available for use.  */
2317   int use_blx;
2318
2319   /* What sort of code sequences we should look for which may trigger the
2320      VFP11 denorm erratum.  */
2321   bfd_arm_vfp11_fix vfp11_fix;
2322
2323   /* Global counter for the number of fixes we have emitted.  */
2324   int num_vfp11_fixes;
2325
2326   /* Nonzero to force PIC branch veneers.  */
2327   int pic_veneer;
2328
2329   /* The number of bytes in the initial entry in the PLT.  */
2330   bfd_size_type plt_header_size;
2331
2332   /* The number of bytes in the subsequent PLT etries.  */
2333   bfd_size_type plt_entry_size;
2334
2335   /* True if the target system is VxWorks.  */
2336   int vxworks_p;
2337
2338   /* True if the target system is Symbian OS.  */
2339   int symbian_p;
2340
2341   /* True if the target uses REL relocations.  */
2342   int use_rel;
2343
2344   /* Short-cuts to get to dynamic linker sections.  */
2345   asection *sgot;
2346   asection *sgotplt;
2347   asection *srelgot;
2348   asection *splt;
2349   asection *srelplt;
2350   asection *sdynbss;
2351   asection *srelbss;
2352
2353   /* The (unloaded but important) VxWorks .rela.plt.unloaded section.  */
2354   asection *srelplt2;
2355
2356   /* Data for R_ARM_TLS_LDM32 relocations.  */
2357   union
2358   {
2359     bfd_signed_vma refcount;
2360     bfd_vma offset;
2361   } tls_ldm_got;
2362
2363   /* Small local sym to section mapping cache.  */
2364   struct sym_sec_cache sym_sec;
2365
2366   /* For convenience in allocate_dynrelocs.  */
2367   bfd * obfd;
2368
2369   /* The stub hash table.  */
2370   struct bfd_hash_table stub_hash_table;
2371
2372   /* Linker stub bfd.  */
2373   bfd *stub_bfd;
2374
2375   /* Linker call-backs.  */
2376   asection * (*add_stub_section) (const char *, asection *);
2377   void (*layout_sections_again) (void);
2378
2379   /* Array to keep track of which stub sections have been created, and
2380      information on stub grouping.  */
2381   struct map_stub
2382   {
2383     /* This is the section to which stubs in the group will be
2384        attached.  */
2385     asection *link_sec;
2386     /* The stub section.  */
2387     asection *stub_sec;
2388   } *stub_group;
2389
2390   /* Assorted information used by elf32_arm_size_stubs.  */
2391   unsigned int bfd_count;
2392   int top_index;
2393   asection **input_list;
2394 };
2395
2396 /* Create an entry in an ARM ELF linker hash table.  */
2397
2398 static struct bfd_hash_entry *
2399 elf32_arm_link_hash_newfunc (struct bfd_hash_entry * entry,
2400                              struct bfd_hash_table * table,
2401                              const char * string)
2402 {
2403   struct elf32_arm_link_hash_entry * ret =
2404     (struct elf32_arm_link_hash_entry *) entry;
2405
2406   /* Allocate the structure if it has not already been allocated by a
2407      subclass.  */
2408   if (ret == NULL)
2409     ret = bfd_hash_allocate (table, sizeof (struct elf32_arm_link_hash_entry));
2410   if (ret == NULL)
2411     return (struct bfd_hash_entry *) ret;
2412
2413   /* Call the allocation method of the superclass.  */
2414   ret = ((struct elf32_arm_link_hash_entry *)
2415          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2416                                      table, string));
2417   if (ret != NULL)
2418     {
2419       ret->relocs_copied = NULL;
2420       ret->tls_type = GOT_UNKNOWN;
2421       ret->plt_thumb_refcount = 0;
2422       ret->plt_maybe_thumb_refcount = 0;
2423       ret->plt_got_offset = -1;
2424       ret->export_glue = NULL;
2425
2426       ret->stub_cache = NULL;
2427     }
2428
2429   return (struct bfd_hash_entry *) ret;
2430 }
2431
2432 /* Initialize an entry in the stub hash table.  */
2433
2434 static struct bfd_hash_entry *
2435 stub_hash_newfunc (struct bfd_hash_entry *entry,
2436                    struct bfd_hash_table *table,
2437                    const char *string)
2438 {
2439   /* Allocate the structure if it has not already been allocated by a
2440      subclass.  */
2441   if (entry == NULL)
2442     {
2443       entry = bfd_hash_allocate (table,
2444                                  sizeof (struct elf32_arm_stub_hash_entry));
2445       if (entry == NULL)
2446         return entry;
2447     }
2448
2449   /* Call the allocation method of the superclass.  */
2450   entry = bfd_hash_newfunc (entry, table, string);
2451   if (entry != NULL)
2452     {
2453       struct elf32_arm_stub_hash_entry *eh;
2454
2455       /* Initialize the local fields.  */
2456       eh = (struct elf32_arm_stub_hash_entry *) entry;
2457       eh->stub_sec = NULL;
2458       eh->stub_offset = 0;
2459       eh->target_value = 0;
2460       eh->target_section = NULL;
2461       eh->stub_type = arm_stub_none;
2462       eh->h = NULL;
2463       eh->id_sec = NULL;
2464     }
2465
2466   return entry;
2467 }
2468
2469 /* Return true if NAME is the name of the relocation section associated
2470    with S.  */
2471
2472 static bfd_boolean
2473 reloc_section_p (struct elf32_arm_link_hash_table *htab,
2474                  const char *name, asection *s)
2475 {
2476   if (htab->use_rel)
2477     return CONST_STRNEQ (name, ".rel") && strcmp (s->name, name + 4) == 0;
2478   else
2479     return CONST_STRNEQ (name, ".rela") && strcmp (s->name, name + 5) == 0;
2480 }
2481
2482 /* Create .got, .gotplt, and .rel(a).got sections in DYNOBJ, and set up
2483    shortcuts to them in our hash table.  */
2484
2485 static bfd_boolean
2486 create_got_section (bfd *dynobj, struct bfd_link_info *info)
2487 {
2488   struct elf32_arm_link_hash_table *htab;
2489
2490   htab = elf32_arm_hash_table (info);
2491   /* BPABI objects never have a GOT, or associated sections.  */
2492   if (htab->symbian_p)
2493     return TRUE;
2494
2495   if (! _bfd_elf_create_got_section (dynobj, info))
2496     return FALSE;
2497
2498   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
2499   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
2500   if (!htab->sgot || !htab->sgotplt)
2501     abort ();
2502
2503   htab->srelgot = bfd_make_section_with_flags (dynobj,
2504                                                RELOC_SECTION (htab, ".got"),
2505                                                (SEC_ALLOC | SEC_LOAD
2506                                                 | SEC_HAS_CONTENTS
2507                                                 | SEC_IN_MEMORY
2508                                                 | SEC_LINKER_CREATED
2509                                                 | SEC_READONLY));
2510   if (htab->srelgot == NULL
2511       || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
2512     return FALSE;
2513   return TRUE;
2514 }
2515
2516 /* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
2517    .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
2518    hash table.  */
2519
2520 static bfd_boolean
2521 elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
2522 {
2523   struct elf32_arm_link_hash_table *htab;
2524
2525   htab = elf32_arm_hash_table (info);
2526   if (!htab->sgot && !create_got_section (dynobj, info))
2527     return FALSE;
2528
2529   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
2530     return FALSE;
2531
2532   htab->splt = bfd_get_section_by_name (dynobj, ".plt");
2533   htab->srelplt = bfd_get_section_by_name (dynobj,
2534                                            RELOC_SECTION (htab, ".plt"));
2535   htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
2536   if (!info->shared)
2537     htab->srelbss = bfd_get_section_by_name (dynobj,
2538                                              RELOC_SECTION (htab, ".bss"));
2539
2540   if (htab->vxworks_p)
2541     {
2542       if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
2543         return FALSE;
2544
2545       if (info->shared)
2546         {
2547           htab->plt_header_size = 0;
2548           htab->plt_entry_size
2549             = 4 * ARRAY_SIZE (elf32_arm_vxworks_shared_plt_entry);
2550         }
2551       else
2552         {
2553           htab->plt_header_size
2554             = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt0_entry);
2555           htab->plt_entry_size
2556             = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt_entry);
2557         }
2558     }
2559
2560   if (!htab->splt
2561       || !htab->srelplt
2562       || !htab->sdynbss
2563       || (!info->shared && !htab->srelbss))
2564     abort ();
2565
2566   return TRUE;
2567 }
2568
2569 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
2570
2571 static void
2572 elf32_arm_copy_indirect_symbol (struct bfd_link_info *info,
2573                                 struct elf_link_hash_entry *dir,
2574                                 struct elf_link_hash_entry *ind)
2575 {
2576   struct elf32_arm_link_hash_entry *edir, *eind;
2577
2578   edir = (struct elf32_arm_link_hash_entry *) dir;
2579   eind = (struct elf32_arm_link_hash_entry *) ind;
2580
2581   if (eind->relocs_copied != NULL)
2582     {
2583       if (edir->relocs_copied != NULL)
2584         {
2585           struct elf32_arm_relocs_copied **pp;
2586           struct elf32_arm_relocs_copied *p;
2587
2588           /* Add reloc counts against the indirect sym to the direct sym
2589              list.  Merge any entries against the same section.  */
2590           for (pp = &eind->relocs_copied; (p = *pp) != NULL; )
2591             {
2592               struct elf32_arm_relocs_copied *q;
2593
2594               for (q = edir->relocs_copied; q != NULL; q = q->next)
2595                 if (q->section == p->section)
2596                   {
2597                     q->pc_count += p->pc_count;
2598                     q->count += p->count;
2599                     *pp = p->next;
2600                     break;
2601                   }
2602               if (q == NULL)
2603                 pp = &p->next;
2604             }
2605           *pp = edir->relocs_copied;
2606         }
2607
2608       edir->relocs_copied = eind->relocs_copied;
2609       eind->relocs_copied = NULL;
2610     }
2611
2612   if (ind->root.type == bfd_link_hash_indirect)
2613     {
2614       /* Copy over PLT info.  */
2615       edir->plt_thumb_refcount += eind->plt_thumb_refcount;
2616       eind->plt_thumb_refcount = 0;
2617       edir->plt_maybe_thumb_refcount += eind->plt_maybe_thumb_refcount;
2618       eind->plt_maybe_thumb_refcount = 0;
2619
2620       if (dir->got.refcount <= 0)
2621         {
2622           edir->tls_type = eind->tls_type;
2623           eind->tls_type = GOT_UNKNOWN;
2624         }
2625     }
2626
2627   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
2628 }
2629
2630 /* Create an ARM elf linker hash table.  */
2631
2632 static struct bfd_link_hash_table *
2633 elf32_arm_link_hash_table_create (bfd *abfd)
2634 {
2635   struct elf32_arm_link_hash_table *ret;
2636   bfd_size_type amt = sizeof (struct elf32_arm_link_hash_table);
2637
2638   ret = bfd_malloc (amt);
2639   if (ret == NULL)
2640     return NULL;
2641
2642   if (!_bfd_elf_link_hash_table_init (& ret->root, abfd,
2643                                       elf32_arm_link_hash_newfunc,
2644                                       sizeof (struct elf32_arm_link_hash_entry)))
2645     {
2646       free (ret);
2647       return NULL;
2648     }
2649
2650   ret->sgot = NULL;
2651   ret->sgotplt = NULL;
2652   ret->srelgot = NULL;
2653   ret->splt = NULL;
2654   ret->srelplt = NULL;
2655   ret->sdynbss = NULL;
2656   ret->srelbss = NULL;
2657   ret->srelplt2 = NULL;
2658   ret->thumb_glue_size = 0;
2659   ret->arm_glue_size = 0;
2660   ret->bx_glue_size = 0;
2661   memset (ret->bx_glue_offset, 0, sizeof (ret->bx_glue_offset));
2662   ret->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
2663   ret->vfp11_erratum_glue_size = 0;
2664   ret->num_vfp11_fixes = 0;
2665   ret->bfd_of_glue_owner = NULL;
2666   ret->byteswap_code = 0;
2667   ret->target1_is_rel = 0;
2668   ret->target2_reloc = R_ARM_NONE;
2669 #ifdef FOUR_WORD_PLT
2670   ret->plt_header_size = 16;
2671   ret->plt_entry_size = 16;
2672 #else
2673   ret->plt_header_size = 20;
2674   ret->plt_entry_size = 12;
2675 #endif
2676   ret->fix_v4bx = 0;
2677   ret->use_blx = 0;
2678   ret->vxworks_p = 0;
2679   ret->symbian_p = 0;
2680   ret->use_rel = 1;
2681   ret->sym_sec.abfd = NULL;
2682   ret->obfd = abfd;
2683   ret->tls_ldm_got.refcount = 0;
2684   ret->stub_bfd = NULL;
2685   ret->add_stub_section = NULL;
2686   ret->layout_sections_again = NULL;
2687   ret->stub_group = NULL;
2688   ret->bfd_count = 0;
2689   ret->top_index = 0;
2690   ret->input_list = NULL;
2691
2692   if (!bfd_hash_table_init (&ret->stub_hash_table, stub_hash_newfunc,
2693                             sizeof (struct elf32_arm_stub_hash_entry)))
2694     {
2695       free (ret);
2696       return NULL;
2697     }
2698
2699   return &ret->root.root;
2700 }
2701
2702 /* Free the derived linker hash table.  */
2703
2704 static void
2705 elf32_arm_hash_table_free (struct bfd_link_hash_table *hash)
2706 {
2707   struct elf32_arm_link_hash_table *ret
2708     = (struct elf32_arm_link_hash_table *) hash;
2709
2710   bfd_hash_table_free (&ret->stub_hash_table);
2711   _bfd_generic_link_hash_table_free (hash);
2712 }
2713
2714 /* Determine if we're dealing with a Thumb only architecture.  */
2715
2716 static bfd_boolean
2717 using_thumb_only (struct elf32_arm_link_hash_table *globals)
2718 {
2719   int arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
2720                                        Tag_CPU_arch);
2721   int profile;
2722
2723   if (arch != TAG_CPU_ARCH_V7)
2724     return FALSE;
2725
2726   profile = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
2727                                       Tag_CPU_arch_profile);
2728
2729   return profile == 'M';
2730 }
2731
2732 /* Determine if we're dealing with a Thumb-2 object.  */
2733
2734 static bfd_boolean
2735 using_thumb2 (struct elf32_arm_link_hash_table *globals)
2736 {
2737   int arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
2738                                        Tag_CPU_arch);
2739   return arch == TAG_CPU_ARCH_V6T2 || arch >= TAG_CPU_ARCH_V7;
2740 }
2741
2742 static bfd_boolean
2743 arm_stub_is_thumb (enum elf32_arm_stub_type stub_type)
2744 {
2745   switch (stub_type)
2746     {
2747     case arm_thumb_thumb_stub_long_branch:
2748     case arm_thumb_arm_v4t_stub_long_branch:
2749     case arm_thumb_arm_v4t_stub_short_branch:
2750       return TRUE;
2751     case arm_stub_none:
2752       BFD_FAIL ();
2753       return FALSE;
2754       break;
2755     default:
2756       return FALSE;
2757     }
2758 }
2759
2760 /* Determine the type of stub needed, if any, for a call.  */
2761
2762 static enum elf32_arm_stub_type
2763 arm_type_of_stub (struct bfd_link_info *info,
2764                   asection *input_sec,
2765                   const Elf_Internal_Rela *rel,
2766                   unsigned char st_type,
2767                   struct elf32_arm_link_hash_entry *hash,
2768                   bfd_vma destination,
2769                   asection *sym_sec,
2770                   bfd *input_bfd,
2771                   const char *name)
2772 {
2773   bfd_vma location;
2774   bfd_signed_vma branch_offset;
2775   unsigned int r_type;
2776   struct elf32_arm_link_hash_table * globals;
2777   int thumb2;
2778   int thumb_only;
2779   enum elf32_arm_stub_type stub_type = arm_stub_none;
2780
2781   /* We don't know the actual type of destination in case it is of
2782      type STT_SECTION: give up.  */
2783   if (st_type == STT_SECTION)
2784     return stub_type;
2785
2786   globals = elf32_arm_hash_table (info);
2787
2788   thumb_only = using_thumb_only (globals);
2789
2790   thumb2 = using_thumb2 (globals);
2791
2792   /* Determine where the call point is.  */
2793   location = (input_sec->output_offset
2794               + input_sec->output_section->vma
2795               + rel->r_offset);
2796
2797   branch_offset = (bfd_signed_vma)(destination - location);
2798
2799   r_type = ELF32_R_TYPE (rel->r_info);
2800
2801   /* If the call will go through a PLT entry then we do not need
2802      glue.  */
2803   if (globals->splt != NULL && hash != NULL && hash->root.plt.offset != (bfd_vma) -1)
2804     return stub_type;
2805
2806   if (r_type == R_ARM_THM_CALL)
2807     {
2808       if ((!thumb2
2809             && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
2810                 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
2811           || (thumb2
2812               && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
2813                   || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
2814           || ((st_type != STT_ARM_TFUNC) && !globals->use_blx))
2815         {
2816           if (st_type == STT_ARM_TFUNC)
2817             {
2818               /* Thumb to thumb.  */
2819               if (!thumb_only)
2820                 {
2821                   stub_type = (info->shared | globals->pic_veneer)
2822                     ? ((globals->use_blx)
2823                        ? arm_stub_pic_long_branch
2824                        : arm_stub_none)
2825                     : (globals->use_blx)
2826                     ? arm_stub_long_branch
2827                     : arm_stub_none;
2828                 }
2829               else
2830                 {
2831                   stub_type = (info->shared | globals->pic_veneer)
2832                     ? arm_stub_none
2833                     : (globals->use_blx)
2834                     ? arm_thumb_thumb_stub_long_branch
2835                     : arm_stub_none;
2836                 }
2837             }
2838           else
2839             {
2840               /* Thumb to arm.  */
2841               if (sym_sec != NULL
2842                   && sym_sec->owner != NULL
2843                   && !INTERWORK_FLAG (sym_sec->owner))
2844                 {
2845                   (*_bfd_error_handler)
2846                     (_("%B(%s): warning: interworking not enabled.\n"
2847                        "  first occurrence: %B: Thumb call to ARM"),
2848                      sym_sec->owner, input_bfd, name);
2849                 }
2850
2851               stub_type = (info->shared | globals->pic_veneer)
2852                 ? ((globals->use_blx)
2853                    ? arm_stub_pic_long_branch
2854                    : arm_stub_none)
2855                 : (globals->use_blx)
2856                 ? arm_stub_long_branch
2857                 : arm_thumb_arm_v4t_stub_long_branch;
2858
2859               /* Handle v4t short branches.  */
2860               if ((stub_type == arm_thumb_arm_v4t_stub_long_branch)
2861                   && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
2862                   && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
2863                 stub_type = arm_thumb_arm_v4t_stub_short_branch;
2864             }
2865         }
2866     }
2867   else if (r_type == R_ARM_CALL)
2868     {
2869       if (st_type == STT_ARM_TFUNC)
2870         {
2871           /* Arm to thumb.  */
2872
2873           if (sym_sec != NULL
2874               && sym_sec->owner != NULL
2875               && !INTERWORK_FLAG (sym_sec->owner))
2876             {
2877               (*_bfd_error_handler)
2878                 (_("%B(%s): warning: interworking not enabled.\n"
2879                    "  first occurrence: %B: Thumb call to ARM"),
2880                  sym_sec->owner, input_bfd, name);
2881             }
2882
2883           /* We have an extra 2-bytes reach because of
2884              the mode change (bit 24 (H) of BLX encoding).  */
2885           if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
2886               || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
2887               || !globals->use_blx)
2888             {
2889               stub_type = (info->shared | globals->pic_veneer)
2890                 ? arm_stub_pic_long_branch
2891                 : (globals->use_blx)
2892                 ? arm_stub_long_branch
2893                 : arm_thumb_v4t_stub_long_branch;
2894             }
2895         }
2896       else
2897         {
2898           /* Arm to arm.  */
2899           if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
2900               || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
2901             {
2902               stub_type = (info->shared | globals->pic_veneer)
2903                 ? arm_stub_pic_long_branch
2904                 : arm_stub_long_branch;
2905             }
2906         }
2907     }
2908
2909   return stub_type;
2910 }
2911
2912 /* Build a name for an entry in the stub hash table.  */
2913
2914 static char *
2915 elf32_arm_stub_name (const asection *input_section,
2916                      const asection *sym_sec,
2917                      const struct elf32_arm_link_hash_entry *hash,
2918                      const Elf_Internal_Rela *rel)
2919 {
2920   char *stub_name;
2921   bfd_size_type len;
2922
2923   if (hash)
2924     {
2925       len = 8 + 1 + strlen (hash->root.root.root.string) + 1 + 8 + 1;
2926       stub_name = bfd_malloc (len);
2927       if (stub_name != NULL)
2928         sprintf (stub_name, "%08x_%s+%x",
2929                  input_section->id & 0xffffffff,
2930                  hash->root.root.root.string,
2931                  (int) rel->r_addend & 0xffffffff);
2932     }
2933   else
2934     {
2935       len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
2936       stub_name = bfd_malloc (len);
2937       if (stub_name != NULL)
2938         sprintf (stub_name, "%08x_%x:%x+%x",
2939                  input_section->id & 0xffffffff,
2940                  sym_sec->id & 0xffffffff,
2941                  (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
2942                  (int) rel->r_addend & 0xffffffff);
2943     }
2944
2945   return stub_name;
2946 }
2947
2948 /* Look up an entry in the stub hash.  Stub entries are cached because
2949    creating the stub name takes a bit of time.  */
2950
2951 static struct elf32_arm_stub_hash_entry *
2952 elf32_arm_get_stub_entry (const asection *input_section,
2953                           const asection *sym_sec,
2954                           struct elf_link_hash_entry *hash,
2955                           const Elf_Internal_Rela *rel,
2956                           struct elf32_arm_link_hash_table *htab)
2957 {
2958   struct elf32_arm_stub_hash_entry *stub_entry;
2959   struct elf32_arm_link_hash_entry *h = (struct elf32_arm_link_hash_entry *) hash;
2960   const asection *id_sec;
2961
2962   if ((input_section->flags & SEC_CODE) == 0)
2963     return NULL;
2964
2965   /* If this input section is part of a group of sections sharing one
2966      stub section, then use the id of the first section in the group.
2967      Stub names need to include a section id, as there may well be
2968      more than one stub used to reach say, printf, and we need to
2969      distinguish between them.  */
2970   id_sec = htab->stub_group[input_section->id].link_sec;
2971
2972   if (h != NULL && h->stub_cache != NULL
2973       && h->stub_cache->h == h
2974       && h->stub_cache->id_sec == id_sec)
2975     {
2976       stub_entry = h->stub_cache;
2977     }
2978   else
2979     {
2980       char *stub_name;
2981
2982       stub_name = elf32_arm_stub_name (id_sec, sym_sec, h, rel);
2983       if (stub_name == NULL)
2984         return NULL;
2985
2986       stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table,
2987                                         stub_name, FALSE, FALSE);
2988       if (h != NULL)
2989         h->stub_cache = stub_entry;
2990
2991       free (stub_name);
2992     }
2993
2994   return stub_entry;
2995 }
2996
2997 /* Add a new stub entry to the stub hash.  Not all fields of the new
2998    stub entry are initialised.  */
2999
3000 static struct elf32_arm_stub_hash_entry *
3001 elf32_arm_add_stub (const char *stub_name,
3002                     asection *section,
3003                     struct elf32_arm_link_hash_table *htab)
3004 {
3005   asection *link_sec;
3006   asection *stub_sec;
3007   struct elf32_arm_stub_hash_entry *stub_entry;
3008
3009   link_sec = htab->stub_group[section->id].link_sec;
3010   stub_sec = htab->stub_group[section->id].stub_sec;
3011   if (stub_sec == NULL)
3012     {
3013       stub_sec = htab->stub_group[link_sec->id].stub_sec;
3014       if (stub_sec == NULL)
3015         {
3016           size_t namelen;
3017           bfd_size_type len;
3018           char *s_name;
3019
3020           namelen = strlen (link_sec->name);
3021           len = namelen + sizeof (STUB_SUFFIX);
3022           s_name = bfd_alloc (htab->stub_bfd, len);
3023           if (s_name == NULL)
3024             return NULL;
3025
3026           memcpy (s_name, link_sec->name, namelen);
3027           memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3028           stub_sec = (*htab->add_stub_section) (s_name, link_sec);
3029           if (stub_sec == NULL)
3030             return NULL;
3031           htab->stub_group[link_sec->id].stub_sec = stub_sec;
3032         }
3033       htab->stub_group[section->id].stub_sec = stub_sec;
3034     }
3035
3036   /* Enter this entry into the linker stub hash table.  */
3037   stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, stub_name,
3038                                      TRUE, FALSE);
3039   if (stub_entry == NULL)
3040     {
3041       (*_bfd_error_handler) (_("%s: cannot create stub entry %s"),
3042                              section->owner,
3043                              stub_name);
3044       return NULL;
3045     }
3046
3047   stub_entry->stub_sec = stub_sec;
3048   stub_entry->stub_offset = 0;
3049   stub_entry->id_sec = link_sec;
3050
3051   return stub_entry;
3052 }
3053
3054 /* Store an Arm insn into an output section not processed by
3055    elf32_arm_write_section.  */
3056
3057 static void
3058 put_arm_insn (struct elf32_arm_link_hash_table * htab,
3059               bfd * output_bfd, bfd_vma val, void * ptr)
3060 {
3061   if (htab->byteswap_code != bfd_little_endian (output_bfd))
3062     bfd_putl32 (val, ptr);
3063   else
3064     bfd_putb32 (val, ptr);
3065 }
3066
3067 /* Store a 16-bit Thumb insn into an output section not processed by
3068    elf32_arm_write_section.  */
3069
3070 static void
3071 put_thumb_insn (struct elf32_arm_link_hash_table * htab,
3072                 bfd * output_bfd, bfd_vma val, void * ptr)
3073 {
3074   if (htab->byteswap_code != bfd_little_endian (output_bfd))
3075     bfd_putl16 (val, ptr);
3076   else
3077     bfd_putb16 (val, ptr);
3078 }
3079
3080 static bfd_boolean
3081 arm_build_one_stub (struct bfd_hash_entry *gen_entry,
3082                     void * in_arg)
3083 {
3084   struct elf32_arm_stub_hash_entry *stub_entry;
3085   struct bfd_link_info *info;
3086   struct elf32_arm_link_hash_table *htab;
3087   asection *stub_sec;
3088   bfd *stub_bfd;
3089   bfd_vma stub_addr;
3090   bfd_byte *loc;
3091   bfd_vma sym_value;
3092   int template_size;
3093   int size;
3094   const bfd_vma *template;
3095   int i;
3096   struct elf32_arm_link_hash_table * globals;
3097
3098   /* Massage our args to the form they really have.  */
3099   stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
3100   info = (struct bfd_link_info *) in_arg;
3101
3102   globals = elf32_arm_hash_table (info);
3103
3104   htab = elf32_arm_hash_table (info);
3105   stub_sec = stub_entry->stub_sec;
3106
3107   /* Make a note of the offset within the stubs for this entry.  */
3108   stub_entry->stub_offset = stub_sec->size;
3109   loc = stub_sec->contents + stub_entry->stub_offset;
3110
3111   stub_bfd = stub_sec->owner;
3112
3113   /* This is the address of the start of the stub.  */
3114   stub_addr = stub_sec->output_section->vma + stub_sec->output_offset
3115     + stub_entry->stub_offset;
3116
3117   /* This is the address of the stub destination.  */
3118   sym_value = (stub_entry->target_value
3119                + stub_entry->target_section->output_offset
3120                + stub_entry->target_section->output_section->vma);
3121
3122   switch (stub_entry->stub_type)
3123     {
3124     case arm_stub_long_branch:
3125       template = arm_long_branch_stub;
3126       template_size = (sizeof (arm_long_branch_stub) / sizeof (bfd_vma)) * 4;
3127       break;
3128     case arm_thumb_v4t_stub_long_branch:
3129       template =  arm_thumb_v4t_long_branch_stub;
3130       template_size = (sizeof (arm_thumb_v4t_long_branch_stub) / sizeof (bfd_vma)) * 4;
3131       break;
3132     case arm_thumb_thumb_stub_long_branch:
3133       template =  arm_thumb_thumb_long_branch_stub;
3134       template_size = (sizeof (arm_thumb_thumb_long_branch_stub) / sizeof (bfd_vma)) * 4;
3135       break;
3136     case arm_thumb_arm_v4t_stub_long_branch:
3137       template =  arm_thumb_arm_v4t_long_branch_stub;
3138       template_size = (sizeof (arm_thumb_arm_v4t_long_branch_stub) / sizeof (bfd_vma)) * 4;
3139       break;
3140     case arm_thumb_arm_v4t_stub_short_branch:
3141       template =  arm_thumb_arm_v4t_short_branch_stub;
3142       template_size = (sizeof(arm_thumb_arm_v4t_short_branch_stub) / sizeof (bfd_vma)) * 4;
3143       break;
3144     case arm_stub_pic_long_branch:
3145       template = arm_pic_long_branch_stub;
3146       template_size = (sizeof (arm_pic_long_branch_stub) / sizeof (bfd_vma)) * 4;
3147       break;
3148     default:
3149       BFD_FAIL ();
3150       return FALSE;
3151     }
3152
3153   size = 0;
3154   for (i = 0; i < (template_size / 4); i++)
3155     {
3156       /* A 0 pattern is a placeholder, every other pattern is an
3157          instruction.  */
3158       if (template[i] != 0)
3159         put_arm_insn (globals, stub_bfd, template[i], loc + size);
3160       else
3161         bfd_put_32 (stub_bfd, template[i], loc + size);
3162
3163       size += 4;
3164     }
3165   stub_sec->size += size;
3166
3167   /* Destination is Thumb. Force bit 0 to 1 to reflect this.  */
3168   if (stub_entry->st_type == STT_ARM_TFUNC)
3169     sym_value |= 1;
3170
3171   switch (stub_entry->stub_type)
3172     {
3173     case arm_stub_long_branch:
3174       _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32),
3175                                 stub_bfd, stub_sec, stub_sec->contents,
3176                                 stub_entry->stub_offset + 4, sym_value, 0);
3177       break;
3178     case arm_thumb_v4t_stub_long_branch:
3179       _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32),
3180                                 stub_bfd, stub_sec, stub_sec->contents,
3181                                 stub_entry->stub_offset + 8, sym_value, 0);
3182       break;
3183     case arm_thumb_thumb_stub_long_branch:
3184       _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32),
3185                                 stub_bfd, stub_sec, stub_sec->contents,
3186                                 stub_entry->stub_offset + 12, sym_value, 0);
3187       break;
3188     case arm_thumb_arm_v4t_stub_long_branch:
3189       _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32),
3190                                 stub_bfd, stub_sec, stub_sec->contents,
3191                                 stub_entry->stub_offset + 16, sym_value, 0);
3192       break;
3193     case arm_thumb_arm_v4t_stub_short_branch:
3194       {
3195         long int rel_offset;
3196         static const insn32 t2a3_b_insn = 0xea000000;
3197
3198         rel_offset = sym_value - (stub_addr + 8 + 4);
3199
3200         put_arm_insn (globals, stub_bfd,
3201                       (bfd_vma) t2a3_b_insn | ((rel_offset >> 2) & 0x00FFFFFF),
3202                       loc + 4);
3203       }
3204       break;
3205
3206     case arm_stub_pic_long_branch:
3207       /* We want the value relative to the address 8 bytes from the
3208          start of the stub.  */
3209       _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_REL32),
3210                                 stub_bfd, stub_sec, stub_sec->contents,
3211                                 stub_entry->stub_offset + 8, sym_value, 0);
3212       break;
3213     default:
3214       break;
3215     }
3216
3217   return TRUE;
3218 }
3219
3220 /* As above, but don't actually build the stub.  Just bump offset so
3221    we know stub section sizes.  */
3222
3223 static bfd_boolean
3224 arm_size_one_stub (struct bfd_hash_entry *gen_entry,
3225                    void * in_arg)
3226 {
3227   struct elf32_arm_stub_hash_entry *stub_entry;
3228   struct elf32_arm_link_hash_table *htab;
3229   const bfd_vma *template;
3230   int template_size;
3231   int size;
3232   int i;
3233
3234   /* Massage our args to the form they really have.  */
3235   stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
3236   htab = (struct elf32_arm_link_hash_table *) in_arg;
3237
3238   switch (stub_entry->stub_type)
3239     {
3240     case arm_stub_long_branch:
3241       template =  arm_long_branch_stub;
3242       template_size = (sizeof (arm_long_branch_stub) / sizeof (bfd_vma)) * 4;
3243       break;
3244     case arm_thumb_v4t_stub_long_branch:
3245       template =  arm_thumb_v4t_long_branch_stub;
3246       template_size = (sizeof (arm_thumb_v4t_long_branch_stub) / sizeof (bfd_vma)) * 4;
3247       break;
3248     case arm_thumb_thumb_stub_long_branch:
3249       template =  arm_thumb_thumb_long_branch_stub;
3250       template_size = (sizeof (arm_thumb_thumb_long_branch_stub) / sizeof (bfd_vma)) * 4;
3251       break;
3252     case arm_thumb_arm_v4t_stub_long_branch:
3253       template =  arm_thumb_arm_v4t_long_branch_stub;
3254       template_size = (sizeof (arm_thumb_arm_v4t_long_branch_stub) / sizeof (bfd_vma)) * 4;
3255       break;
3256     case arm_thumb_arm_v4t_stub_short_branch:
3257       template =  arm_thumb_arm_v4t_short_branch_stub;
3258       template_size = (sizeof(arm_thumb_arm_v4t_short_branch_stub) / sizeof (bfd_vma)) * 4;
3259       break;
3260     case arm_stub_pic_long_branch:
3261       template = arm_pic_long_branch_stub;
3262       template_size = (sizeof (arm_pic_long_branch_stub) / sizeof (bfd_vma)) * 4;
3263       break;
3264     default:
3265       BFD_FAIL ();
3266       return FALSE;
3267       break;
3268     }
3269
3270   size = 0;
3271   for (i = 0; i < (template_size / 4); i++)
3272       size += 4;
3273   size = (size + 7) & ~7;
3274   stub_entry->stub_sec->size += size;
3275   return TRUE;
3276 }
3277
3278 /* External entry points for sizing and building linker stubs.  */
3279
3280 /* Set up various things so that we can make a list of input sections
3281    for each output section included in the link.  Returns -1 on error,
3282    0 when no stubs will be needed, and 1 on success.  */
3283
3284 int
3285 elf32_arm_setup_section_lists (bfd *output_bfd,
3286                                struct bfd_link_info *info)
3287 {
3288   bfd *input_bfd;
3289   unsigned int bfd_count;
3290   int top_id, top_index;
3291   asection *section;
3292   asection **input_list, **list;
3293   bfd_size_type amt;
3294   struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
3295
3296   if (! is_elf_hash_table (htab))
3297     return 0;
3298
3299   /* Count the number of input BFDs and find the top input section id.  */
3300   for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
3301        input_bfd != NULL;
3302        input_bfd = input_bfd->link_next)
3303     {
3304       bfd_count += 1;
3305       for (section = input_bfd->sections;
3306            section != NULL;
3307            section = section->next)
3308         {
3309           if (top_id < section->id)
3310             top_id = section->id;
3311         }
3312     }
3313   htab->bfd_count = bfd_count;
3314
3315   amt = sizeof (struct map_stub) * (top_id + 1);
3316   htab->stub_group = bfd_zmalloc (amt);
3317   if (htab->stub_group == NULL)
3318     return -1;
3319
3320   /* We can't use output_bfd->section_count here to find the top output
3321      section index as some sections may have been removed, and
3322      _bfd_strip_section_from_output doesn't renumber the indices.  */
3323   for (section = output_bfd->sections, top_index = 0;
3324        section != NULL;
3325        section = section->next)
3326     {
3327       if (top_index < section->index)
3328         top_index = section->index;
3329     }
3330
3331   htab->top_index = top_index;
3332   amt = sizeof (asection *) * (top_index + 1);
3333   input_list = bfd_malloc (amt);
3334   htab->input_list = input_list;
3335   if (input_list == NULL)
3336     return -1;
3337
3338   /* For sections we aren't interested in, mark their entries with a
3339      value we can check later.  */
3340   list = input_list + top_index;
3341   do
3342     *list = bfd_abs_section_ptr;
3343   while (list-- != input_list);
3344
3345   for (section = output_bfd->sections;
3346        section != NULL;
3347        section = section->next)
3348     {
3349       if ((section->flags & SEC_CODE) != 0)
3350         input_list[section->index] = NULL;
3351     }
3352
3353   return 1;
3354 }
3355
3356 /* The linker repeatedly calls this function for each input section,
3357    in the order that input sections are linked into output sections.
3358    Build lists of input sections to determine groupings between which
3359    we may insert linker stubs.  */
3360
3361 void
3362 elf32_arm_next_input_section (struct bfd_link_info *info,
3363                               asection *isec)
3364 {
3365   struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
3366
3367   if (isec->output_section->index <= htab->top_index)
3368     {
3369       asection **list = htab->input_list + isec->output_section->index;
3370
3371       if (*list != bfd_abs_section_ptr)
3372         {
3373           /* Steal the link_sec pointer for our list.  */
3374 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
3375           /* This happens to make the list in reverse order,
3376              which is what we want.  */
3377           PREV_SEC (isec) = *list;
3378           *list = isec;
3379         }
3380     }
3381 }
3382
3383 /* See whether we can group stub sections together.  Grouping stub
3384    sections may result in fewer stubs.  More importantly, we need to
3385    put all .init* and .fini* stubs at the beginning of the .init or
3386    .fini output sections respectively, because glibc splits the
3387    _init and _fini functions into multiple parts.  Putting a stub in
3388    the middle of a function is not a good idea.  */
3389
3390 static void
3391 group_sections (struct elf32_arm_link_hash_table *htab,
3392                 bfd_size_type stub_group_size,
3393                 bfd_boolean stubs_always_before_branch)
3394 {
3395   asection **list = htab->input_list + htab->top_index;
3396
3397   do
3398     {
3399       asection *tail = *list;
3400
3401       if (tail == bfd_abs_section_ptr)
3402         continue;
3403
3404       while (tail != NULL)
3405         {
3406           asection *curr;
3407           asection *prev;
3408           bfd_size_type total;
3409
3410           curr = tail;
3411           total = tail->size;
3412           while ((prev = PREV_SEC (curr)) != NULL
3413                  && ((total += curr->output_offset - prev->output_offset)
3414                      < stub_group_size))
3415             curr = prev;
3416
3417           /* OK, the size from the start of CURR to the end is less
3418              than stub_group_size and thus can be handled by one stub
3419              section.  (Or the tail section is itself larger than
3420              stub_group_size, in which case we may be toast.)
3421              We should really be keeping track of the total size of
3422              stubs added here, as stubs contribute to the final output
3423              section size.  */
3424           do
3425             {
3426               prev = PREV_SEC (tail);
3427               /* Set up this stub group.  */
3428               htab->stub_group[tail->id].link_sec = curr;
3429             }
3430           while (tail != curr && (tail = prev) != NULL);
3431
3432           /* But wait, there's more!  Input sections up to stub_group_size
3433              bytes before the stub section can be handled by it too.  */
3434           if (!stubs_always_before_branch)
3435             {
3436               total = 0;
3437               while (prev != NULL
3438                      && ((total += tail->output_offset - prev->output_offset)
3439                          < stub_group_size))
3440                 {
3441                   tail = prev;
3442                   prev = PREV_SEC (tail);
3443                   htab->stub_group[tail->id].link_sec = curr;
3444                 }
3445             }
3446           tail = prev;
3447         }
3448     }
3449   while (list-- != htab->input_list);
3450
3451   free (htab->input_list);
3452 #undef PREV_SEC
3453 }
3454
3455 /* Determine and set the size of the stub section for a final link.
3456
3457    The basic idea here is to examine all the relocations looking for
3458    PC-relative calls to a target that is unreachable with a "bl"
3459    instruction.  */
3460
3461 bfd_boolean
3462 elf32_arm_size_stubs (bfd *output_bfd,
3463                       bfd *stub_bfd,
3464                       struct bfd_link_info *info,
3465                       bfd_signed_vma group_size,
3466                       asection * (*add_stub_section) (const char *, asection *),
3467                       void (*layout_sections_again) (void))
3468 {
3469   bfd_size_type stub_group_size;
3470   bfd_boolean stubs_always_before_branch;
3471   bfd_boolean stub_changed = 0;
3472   struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
3473
3474   /* Propagate mach to stub bfd, because it may not have been
3475      finalized when we created stub_bfd.  */
3476   bfd_set_arch_mach (stub_bfd, bfd_get_arch (output_bfd),
3477                      bfd_get_mach (output_bfd));
3478
3479   /* Stash our params away.  */
3480   htab->stub_bfd = stub_bfd;
3481   htab->add_stub_section = add_stub_section;
3482   htab->layout_sections_again = layout_sections_again;
3483   stubs_always_before_branch = group_size < 0;
3484   if (group_size < 0)
3485     stub_group_size = -group_size;
3486   else
3487     stub_group_size = group_size;
3488
3489   if (stub_group_size == 1)
3490     {
3491       /* Default values.  */
3492       /* Thumb branch range is +-4MB has to be used as the default
3493          maximum size (a given section can contain both ARM and Thumb
3494          code, so the worst case has to be taken into account).
3495
3496          This value is 24K less than that, which allows for 2025
3497          12-byte stubs.  If we exceed that, then we will fail to link.
3498          The user will have to relink with an explicit group size
3499          option.  */
3500       stub_group_size = 4170000;
3501     }
3502
3503   group_sections (htab, stub_group_size, stubs_always_before_branch);
3504
3505   while (1)
3506     {
3507       bfd *input_bfd;
3508       unsigned int bfd_indx;
3509       asection *stub_sec;
3510
3511       for (input_bfd = info->input_bfds, bfd_indx = 0;
3512            input_bfd != NULL;
3513            input_bfd = input_bfd->link_next, bfd_indx++)
3514         {
3515           Elf_Internal_Shdr *symtab_hdr;
3516           asection *section;
3517           Elf_Internal_Sym *local_syms = NULL;
3518
3519           /* We'll need the symbol table in a second.  */
3520           symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3521           if (symtab_hdr->sh_info == 0)
3522             continue;
3523
3524           /* Walk over each section attached to the input bfd.  */
3525           for (section = input_bfd->sections;
3526                section != NULL;
3527                section = section->next)
3528             {
3529               Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
3530
3531               /* If there aren't any relocs, then there's nothing more
3532                  to do.  */
3533               if ((section->flags & SEC_RELOC) == 0
3534                   || section->reloc_count == 0
3535                   || (section->flags & SEC_CODE) == 0)
3536                 continue;
3537
3538               /* If this section is a link-once section that will be
3539                  discarded, then don't create any stubs.  */
3540               if (section->output_section == NULL
3541                   || section->output_section->owner != output_bfd)
3542                 continue;
3543
3544               /* Get the relocs.  */
3545               internal_relocs
3546                 = _bfd_elf_link_read_relocs (input_bfd, section, NULL,
3547                                              NULL, info->keep_memory);
3548               if (internal_relocs == NULL)
3549                 goto error_ret_free_local;
3550
3551               /* Now examine each relocation.  */
3552               irela = internal_relocs;
3553               irelaend = irela + section->reloc_count;
3554               for (; irela < irelaend; irela++)
3555                 {
3556                   unsigned int r_type, r_indx;
3557                   enum elf32_arm_stub_type stub_type;
3558                   struct elf32_arm_stub_hash_entry *stub_entry;
3559                   asection *sym_sec;
3560                   bfd_vma sym_value;
3561                   bfd_vma destination;
3562                   struct elf32_arm_link_hash_entry *hash;
3563                   const char *sym_name;
3564                   char *stub_name;
3565                   const asection *id_sec;
3566                   unsigned char st_type;
3567
3568                   r_type = ELF32_R_TYPE (irela->r_info);
3569                   r_indx = ELF32_R_SYM (irela->r_info);
3570
3571                   if (r_type >= (unsigned int) R_ARM_max)
3572                     {
3573                       bfd_set_error (bfd_error_bad_value);
3574                     error_ret_free_internal:
3575                       if (elf_section_data (section)->relocs == NULL)
3576                         free (internal_relocs);
3577                       goto error_ret_free_local;
3578                     }
3579
3580                   /* Only look for stubs on call instructions.  */
3581                   if ((r_type != (unsigned int) R_ARM_CALL)
3582                       && (r_type != (unsigned int) R_ARM_THM_CALL))
3583                     continue;
3584
3585                   /* Now determine the call target, its name, value,
3586                      section.  */
3587                   sym_sec = NULL;
3588                   sym_value = 0;
3589                   destination = 0;
3590                   hash = NULL;
3591                   sym_name = NULL;
3592                   if (r_indx < symtab_hdr->sh_info)
3593                     {
3594                       /* It's a local symbol.  */
3595                       Elf_Internal_Sym *sym;
3596                       Elf_Internal_Shdr *hdr;
3597
3598                       if (local_syms == NULL)
3599                         {
3600                           local_syms
3601                             = (Elf_Internal_Sym *) symtab_hdr->contents;
3602                           if (local_syms == NULL)
3603                             local_syms
3604                               = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
3605                                                       symtab_hdr->sh_info, 0,
3606                                                       NULL, NULL, NULL);
3607                           if (local_syms == NULL)
3608                             goto error_ret_free_internal;
3609                         }
3610
3611                       sym = local_syms + r_indx;
3612                       hdr = elf_elfsections (input_bfd)[sym->st_shndx];
3613                       sym_sec = hdr->bfd_section;
3614                       if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
3615                         sym_value = sym->st_value;
3616                       destination = (sym_value + irela->r_addend
3617                                      + sym_sec->output_offset
3618                                      + sym_sec->output_section->vma);
3619                       st_type = ELF_ST_TYPE (sym->st_info);
3620                       sym_name
3621                         = bfd_elf_string_from_elf_section (input_bfd,
3622                                                            symtab_hdr->sh_link,
3623                                                            sym->st_name);
3624                     }
3625                   else
3626                     {
3627                       /* It's an external symbol.  */
3628                       int e_indx;
3629
3630                       e_indx = r_indx - symtab_hdr->sh_info;
3631                       hash = ((struct elf32_arm_link_hash_entry *)
3632                               elf_sym_hashes (input_bfd)[e_indx]);
3633
3634                       while (hash->root.root.type == bfd_link_hash_indirect
3635                              || hash->root.root.type == bfd_link_hash_warning)
3636                         hash = ((struct elf32_arm_link_hash_entry *)
3637                                 hash->root.root.u.i.link);
3638
3639                       if (hash->root.root.type == bfd_link_hash_defined
3640                           || hash->root.root.type == bfd_link_hash_defweak)
3641                         {
3642                           sym_sec = hash->root.root.u.def.section;
3643                           sym_value = hash->root.root.u.def.value;
3644                           if (sym_sec->output_section != NULL)
3645                             destination = (sym_value + irela->r_addend
3646                                            + sym_sec->output_offset
3647                                            + sym_sec->output_section->vma);
3648                         }
3649                       else if (hash->root.root.type == bfd_link_hash_undefweak
3650                                || hash->root.root.type == bfd_link_hash_undefined)
3651                         /* For a shared library, these will need a PLT stub,
3652                            which is treated separately.
3653                            For absolute code, they cannot be handled.  */
3654                         continue;
3655                       else
3656                         {
3657                           bfd_set_error (bfd_error_bad_value);
3658                           goto error_ret_free_internal;
3659                         }
3660                       st_type = ELF_ST_TYPE (hash->root.type);
3661                       sym_name = hash->root.root.root.string;
3662                     }
3663
3664                   /* Determine what (if any) linker stub is needed.  */
3665                   stub_type = arm_type_of_stub (info, section, irela, st_type,
3666                                                 hash, destination, sym_sec,
3667                                                 input_bfd, sym_name);
3668                   if (stub_type == arm_stub_none)
3669                     continue;
3670
3671                   /* Support for grouping stub sections.  */
3672                   id_sec = htab->stub_group[section->id].link_sec;
3673
3674                   /* Get the name of this stub.  */
3675                   stub_name = elf32_arm_stub_name (id_sec, sym_sec, hash, irela);
3676                   if (!stub_name)
3677                     goto error_ret_free_internal;
3678
3679                   stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table,
3680                                                     stub_name,
3681                                                     FALSE, FALSE);
3682                   if (stub_entry != NULL)
3683                     {
3684                       /* The proper stub has already been created.  */
3685                       free (stub_name);
3686                       continue;
3687                     }
3688
3689                   stub_entry = elf32_arm_add_stub (stub_name, section, htab);
3690                   if (stub_entry == NULL)
3691                     {
3692                       free (stub_name);
3693                       goto error_ret_free_internal;
3694                     }
3695
3696                   stub_entry->target_value = sym_value;
3697                   stub_entry->target_section = sym_sec;
3698                   stub_entry->stub_type = stub_type;
3699                   stub_entry->h = hash;
3700                   stub_entry->st_type = st_type;
3701
3702                   if (sym_name == NULL)
3703                     sym_name = "unnamed";
3704                   stub_entry->output_name
3705                     = bfd_alloc (htab->stub_bfd,
3706                                  sizeof (THUMB2ARM_GLUE_ENTRY_NAME)
3707                                  + strlen (sym_name));
3708                   if (stub_entry->output_name == NULL)
3709                     {
3710                       free (stub_name);
3711                       goto error_ret_free_internal;
3712                     }
3713
3714                   /* For historical reasons, use the existing names for
3715                      ARM-to-Thumb and Thumb-to-ARM stubs.  */
3716                   if (r_type == (unsigned int) R_ARM_THM_CALL
3717                       && st_type != STT_ARM_TFUNC)
3718                     sprintf (stub_entry->output_name, THUMB2ARM_GLUE_ENTRY_NAME,
3719                              sym_name);
3720                   else if (r_type == (unsigned int) R_ARM_CALL
3721                            && st_type == STT_ARM_TFUNC)
3722                     sprintf (stub_entry->output_name, ARM2THUMB_GLUE_ENTRY_NAME,
3723                              sym_name);
3724                   else
3725                     sprintf (stub_entry->output_name, STUB_ENTRY_NAME,
3726                              sym_name);
3727
3728                   stub_changed = TRUE;
3729                 }
3730
3731               /* We're done with the internal relocs, free them.  */
3732               if (elf_section_data (section)->relocs == NULL)
3733                 free (internal_relocs);
3734             }
3735         }
3736
3737       if (!stub_changed)
3738         break;
3739
3740       /* OK, we've added some stubs.  Find out the new size of the
3741          stub sections.  */
3742       for (stub_sec = htab->stub_bfd->sections;
3743            stub_sec != NULL;
3744            stub_sec = stub_sec->next)
3745         stub_sec->size = 0;
3746
3747       bfd_hash_traverse (&htab->stub_hash_table, arm_size_one_stub, htab);
3748
3749       /* Ask the linker to do its stuff.  */
3750       (*htab->layout_sections_again) ();
3751       stub_changed = FALSE;
3752     }
3753
3754   return TRUE;
3755
3756  error_ret_free_local:
3757   return FALSE;
3758 }
3759
3760 /* Build all the stubs associated with the current output file.  The
3761    stubs are kept in a hash table attached to the main linker hash
3762    table.  We also set up the .plt entries for statically linked PIC
3763    functions here.  This function is called via arm_elf_finish in the
3764    linker.  */
3765
3766 bfd_boolean
3767 elf32_arm_build_stubs (struct bfd_link_info *info)
3768 {
3769   asection *stub_sec;
3770   struct bfd_hash_table *table;
3771   struct elf32_arm_link_hash_table *htab;
3772
3773   htab = elf32_arm_hash_table (info);
3774
3775   for (stub_sec = htab->stub_bfd->sections;
3776        stub_sec != NULL;
3777        stub_sec = stub_sec->next)
3778     {
3779       bfd_size_type size;
3780
3781       /* Ignore non-stub sections.  */
3782       if (!strstr (stub_sec->name, STUB_SUFFIX))
3783         continue;
3784
3785       /* Allocate memory to hold the linker stubs.  */
3786       size = stub_sec->size;
3787       stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3788       if (stub_sec->contents == NULL && size != 0)
3789         return FALSE;
3790       stub_sec->size = 0;
3791     }
3792
3793   /* Build the stubs as directed by the stub hash table.  */
3794   table = &htab->stub_hash_table;
3795   bfd_hash_traverse (table, arm_build_one_stub, info);
3796
3797   return TRUE;
3798 }
3799
3800 /* Locate the Thumb encoded calling stub for NAME.  */
3801
3802 static struct elf_link_hash_entry *
3803 find_thumb_glue (struct bfd_link_info *link_info,
3804                  const char *name,
3805                  char **error_message)
3806 {
3807   char *tmp_name;
3808   struct elf_link_hash_entry *hash;
3809   struct elf32_arm_link_hash_table *hash_table;
3810
3811   /* We need a pointer to the armelf specific hash table.  */
3812   hash_table = elf32_arm_hash_table (link_info);
3813
3814   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
3815                          + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
3816
3817   BFD_ASSERT (tmp_name);
3818
3819   sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
3820
3821   hash = elf_link_hash_lookup
3822     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
3823
3824   if (hash == NULL
3825       && asprintf (error_message, _("unable to find THUMB glue '%s' for '%s'"),
3826                    tmp_name, name) == -1)
3827     *error_message = (char *) bfd_errmsg (bfd_error_system_call);
3828
3829   free (tmp_name);
3830
3831   return hash;
3832 }
3833
3834 /* Locate the ARM encoded calling stub for NAME.  */
3835
3836 static struct elf_link_hash_entry *
3837 find_arm_glue (struct bfd_link_info *link_info,
3838                const char *name,
3839                char **error_message)
3840 {
3841   char *tmp_name;
3842   struct elf_link_hash_entry *myh;
3843   struct elf32_arm_link_hash_table *hash_table;
3844
3845   /* We need a pointer to the elfarm specific hash table.  */
3846   hash_table = elf32_arm_hash_table (link_info);
3847
3848   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
3849                          + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
3850
3851   BFD_ASSERT (tmp_name);
3852
3853   sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
3854
3855   myh = elf_link_hash_lookup
3856     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
3857
3858   if (myh == NULL
3859       && asprintf (error_message, _("unable to find ARM glue '%s' for '%s'"),
3860                    tmp_name, name) == -1)
3861     *error_message = (char *) bfd_errmsg (bfd_error_system_call);
3862
3863   free (tmp_name);
3864
3865   return myh;
3866 }
3867
3868 /* ARM->Thumb glue (static images):
3869
3870    .arm
3871    __func_from_arm:
3872    ldr r12, __func_addr
3873    bx  r12
3874    __func_addr:
3875    .word func    @ behave as if you saw a ARM_32 reloc.
3876
3877    (v5t static images)
3878    .arm
3879    __func_from_arm:
3880    ldr pc, __func_addr
3881    __func_addr:
3882    .word func    @ behave as if you saw a ARM_32 reloc.
3883
3884    (relocatable images)
3885    .arm
3886    __func_from_arm:
3887    ldr r12, __func_offset
3888    add r12, r12, pc
3889    bx  r12
3890    __func_offset:
3891    .word func - .   */
3892
3893 #define ARM2THUMB_STATIC_GLUE_SIZE 12
3894 static const insn32 a2t1_ldr_insn = 0xe59fc000;
3895 static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
3896 static const insn32 a2t3_func_addr_insn = 0x00000001;
3897
3898 #define ARM2THUMB_V5_STATIC_GLUE_SIZE 8
3899 static const insn32 a2t1v5_ldr_insn = 0xe51ff004;
3900 static const insn32 a2t2v5_func_addr_insn = 0x00000001;
3901
3902 #define ARM2THUMB_PIC_GLUE_SIZE 16
3903 static const insn32 a2t1p_ldr_insn = 0xe59fc004;
3904 static const insn32 a2t2p_add_pc_insn = 0xe08cc00f;
3905 static const insn32 a2t3p_bx_r12_insn = 0xe12fff1c;
3906
3907 /* Thumb->ARM:                          Thumb->(non-interworking aware) ARM
3908
3909      .thumb                             .thumb
3910      .align 2                           .align 2
3911  __func_from_thumb:                 __func_from_thumb:
3912      bx pc                              push {r6, lr}
3913      nop                                ldr  r6, __func_addr
3914      .arm                               mov  lr, pc
3915      b func                             bx   r6
3916  ;; back_to_thumb                       .arm
3917      ldmia r13! {r6, lr}                ldmia r13! {r6, lr}
3918      bx    lr                           bx    lr
3919                                     __func_addr:
3920                                         .word        func  */
3921
3922 #define THUMB2ARM_GLUE_SIZE 8
3923 static const insn16 t2a1_bx_pc_insn = 0x4778;
3924 static const insn16 t2a2_noop_insn = 0x46c0;
3925 static const insn32 t2a3_b_insn = 0xea000000;
3926
3927 #define VFP11_ERRATUM_VENEER_SIZE 8
3928
3929 #define ARM_BX_VENEER_SIZE 12
3930 static const insn32 armbx1_tst_insn = 0xe3100001;
3931 static const insn32 armbx2_moveq_insn = 0x01a0f000;
3932 static const insn32 armbx3_bx_insn = 0xe12fff10;
3933
3934 #ifndef ELFARM_NABI_C_INCLUDED
3935 static void
3936 arm_allocate_glue_section_space (bfd * abfd, bfd_size_type size, const char * name)
3937 {
3938   asection * s;
3939   bfd_byte * contents;
3940
3941   if (size == 0)
3942     return;
3943
3944   BFD_ASSERT (abfd != NULL);
3945
3946   s = bfd_get_section_by_name (abfd, name);
3947   BFD_ASSERT (s != NULL);
3948
3949   contents = bfd_alloc (abfd, size);
3950
3951   BFD_ASSERT (s->size == size);
3952   s->contents = contents;
3953 }
3954
3955 bfd_boolean
3956 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
3957 {
3958   struct elf32_arm_link_hash_table * globals;
3959
3960   globals = elf32_arm_hash_table (info);
3961   BFD_ASSERT (globals != NULL);
3962
3963   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
3964                                    globals->arm_glue_size,
3965                                    ARM2THUMB_GLUE_SECTION_NAME);
3966
3967   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
3968                                    globals->thumb_glue_size,
3969                                    THUMB2ARM_GLUE_SECTION_NAME);
3970
3971   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
3972                                    globals->vfp11_erratum_glue_size,
3973                                    VFP11_ERRATUM_VENEER_SECTION_NAME);
3974
3975   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
3976                                    globals->bx_glue_size,
3977                                    ARM_BX_GLUE_SECTION_NAME);
3978
3979   return TRUE;
3980 }
3981
3982 /* Allocate space and symbols for calling a Thumb function from Arm mode.
3983    returns the symbol identifying the stub.  */
3984
3985 static struct elf_link_hash_entry *
3986 record_arm_to_thumb_glue (struct bfd_link_info * link_info,
3987                           struct elf_link_hash_entry * h)
3988 {
3989   const char * name = h->root.root.string;
3990   asection * s;
3991   char * tmp_name;
3992   struct elf_link_hash_entry * myh;
3993   struct bfd_link_hash_entry * bh;
3994   struct elf32_arm_link_hash_table * globals;
3995   bfd_vma val;
3996   bfd_size_type size;
3997
3998   globals = elf32_arm_hash_table (link_info);
3999
4000   BFD_ASSERT (globals != NULL);
4001   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
4002
4003   s = bfd_get_section_by_name
4004     (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
4005
4006   BFD_ASSERT (s != NULL);
4007
4008   tmp_name = bfd_malloc ((bfd_size_type) strlen (name) + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
4009
4010   BFD_ASSERT (tmp_name);
4011
4012   sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
4013
4014   myh = elf_link_hash_lookup
4015     (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
4016
4017   if (myh != NULL)
4018     {
4019       /* We've already seen this guy.  */
4020       free (tmp_name);
4021       return myh;
4022     }
4023
4024   /* The only trick here is using hash_table->arm_glue_size as the value.
4025      Even though the section isn't allocated yet, this is where we will be
4026      putting it.  The +1 on the value marks that the stub has not been
4027      output yet - not that it is a Thumb function.  */
4028   bh = NULL;
4029   val = globals->arm_glue_size + 1;
4030   _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
4031                                     tmp_name, BSF_GLOBAL, s, val,
4032                                     NULL, TRUE, FALSE, &bh);
4033
4034   myh = (struct elf_link_hash_entry *) bh;
4035   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
4036   myh->forced_local = 1;
4037
4038   free (tmp_name);
4039
4040   if (link_info->shared || globals->root.is_relocatable_executable
4041       || globals->pic_veneer)
4042     size = ARM2THUMB_PIC_GLUE_SIZE;
4043   else if (globals->use_blx)
4044     size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
4045   else
4046     size = ARM2THUMB_STATIC_GLUE_SIZE;
4047
4048   s->size += size;
4049   globals->arm_glue_size += size;
4050
4051   return myh;
4052 }
4053
4054 static void
4055 record_thumb_to_arm_glue (struct bfd_link_info *link_info,
4056                           struct elf_link_hash_entry *h)
4057 {
4058   const char *name = h->root.root.string;
4059   asection *s;
4060   char *tmp_name;
4061   struct elf_link_hash_entry *myh;
4062   struct bfd_link_hash_entry *bh;
4063   struct elf32_arm_link_hash_table *hash_table;
4064   bfd_vma val;
4065
4066   hash_table = elf32_arm_hash_table (link_info);
4067
4068   BFD_ASSERT (hash_table != NULL);
4069   BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
4070
4071   s = bfd_get_section_by_name
4072     (hash_table->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
4073
4074   BFD_ASSERT (s != NULL);
4075
4076   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
4077                          + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
4078
4079   BFD_ASSERT (tmp_name);
4080
4081   sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
4082
4083   myh = elf_link_hash_lookup
4084     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
4085
4086   if (myh != NULL)
4087     {
4088       /* We've already seen this guy.  */
4089       free (tmp_name);
4090       return;
4091     }
4092
4093   /* The only trick here is using hash_table->thumb_glue_size as the value.
4094      Even though the section isn't allocated yet, this is where we will be
4095      putting it.  The +1 on the value marks that the stub has not been
4096      output yet - not that it is a Thumb function.  */
4097   bh = NULL;
4098   val = hash_table->thumb_glue_size + 1;
4099   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
4100                                     tmp_name, BSF_GLOBAL, s, val,
4101                                     NULL, TRUE, FALSE, &bh);
4102
4103   /* If we mark it 'Thumb', the disassembler will do a better job.  */
4104   myh = (struct elf_link_hash_entry *) bh;
4105   myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
4106   myh->forced_local = 1;
4107
4108   free (tmp_name);
4109
4110 #define CHANGE_TO_ARM "__%s_change_to_arm"
4111 #define BACK_FROM_ARM "__%s_back_from_arm"
4112
4113   /* Allocate another symbol to mark where we switch to Arm mode.  */
4114   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
4115                          + strlen (CHANGE_TO_ARM) + 1);
4116
4117   BFD_ASSERT (tmp_name);
4118
4119   sprintf (tmp_name, CHANGE_TO_ARM, name);
4120
4121   bh = NULL;
4122   val = hash_table->thumb_glue_size + 4,
4123   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
4124                                     tmp_name, BSF_LOCAL, s, val,
4125                                     NULL, TRUE, FALSE, &bh);
4126
4127   free (tmp_name);
4128
4129   s->size += THUMB2ARM_GLUE_SIZE;
4130   hash_table->thumb_glue_size += THUMB2ARM_GLUE_SIZE;
4131 }
4132
4133
4134 /* Allocate space for ARMv4 BX veneers.  */
4135
4136 static void
4137 record_arm_bx_glue (struct bfd_link_info * link_info, int reg)
4138 {
4139   asection * s;
4140   struct elf32_arm_link_hash_table *globals;
4141   char *tmp_name;
4142   struct elf_link_hash_entry *myh;
4143   struct bfd_link_hash_entry *bh;
4144   bfd_vma val;
4145
4146   /* BX PC does not need a veneer.  */
4147   if (reg == 15)
4148     return;
4149
4150   globals = elf32_arm_hash_table (link_info);
4151
4152   BFD_ASSERT (globals != NULL);
4153   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
4154
4155   /* Check if this veneer has already been allocated.  */
4156   if (globals->bx_glue_offset[reg])
4157     return;
4158
4159   s = bfd_get_section_by_name
4160     (globals->bfd_of_glue_owner, ARM_BX_GLUE_SECTION_NAME);
4161
4162   BFD_ASSERT (s != NULL);
4163
4164   /* Add symbol for veneer.  */
4165   tmp_name = bfd_malloc ((bfd_size_type) strlen (ARM_BX_GLUE_ENTRY_NAME) + 1);
4166
4167   BFD_ASSERT (tmp_name);
4168
4169   sprintf (tmp_name, ARM_BX_GLUE_ENTRY_NAME, reg);
4170
4171   myh = elf_link_hash_lookup
4172     (&(globals)->root, tmp_name, FALSE, FALSE, FALSE);
4173
4174   BFD_ASSERT (myh == NULL);
4175
4176   bh = NULL;
4177   val = globals->bx_glue_size;
4178   _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
4179                                     tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
4180                                     NULL, TRUE, FALSE, &bh);
4181
4182   myh = (struct elf_link_hash_entry *) bh;
4183   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
4184   myh->forced_local = 1;
4185
4186   s->size += ARM_BX_VENEER_SIZE;
4187   globals->bx_glue_offset[reg] = globals->bx_glue_size | 2;
4188   globals->bx_glue_size += ARM_BX_VENEER_SIZE;
4189 }
4190
4191
4192 /* Add an entry to the code/data map for section SEC.  */
4193
4194 static void
4195 elf32_arm_section_map_add (asection *sec, char type, bfd_vma vma)
4196 {
4197   struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
4198   unsigned int newidx;
4199
4200   if (sec_data->map == NULL)
4201     {
4202       sec_data->map = bfd_malloc (sizeof (elf32_arm_section_map));
4203       sec_data->mapcount = 0;
4204       sec_data->mapsize = 1;
4205     }
4206
4207   newidx = sec_data->mapcount++;
4208
4209   if (sec_data->mapcount > sec_data->mapsize)
4210     {
4211       sec_data->mapsize *= 2;
4212       sec_data->map = bfd_realloc_or_free (sec_data->map, sec_data->mapsize
4213                                            * sizeof (elf32_arm_section_map));
4214     }
4215
4216   if (sec_data->map)
4217     {
4218       sec_data->map[newidx].vma = vma;
4219       sec_data->map[newidx].type = type;
4220     }
4221 }
4222
4223
4224 /* Record information about a VFP11 denorm-erratum veneer.  Only ARM-mode
4225    veneers are handled for now.  */
4226
4227 static bfd_vma
4228 record_vfp11_erratum_veneer (struct bfd_link_info *link_info,
4229                              elf32_vfp11_erratum_list *branch,
4230                              bfd *branch_bfd,
4231                              asection *branch_sec,
4232                              unsigned int offset)
4233 {
4234   asection *s;
4235   struct elf32_arm_link_hash_table *hash_table;
4236   char *tmp_name;
4237   struct elf_link_hash_entry *myh;
4238   struct bfd_link_hash_entry *bh;
4239   bfd_vma val;
4240   struct _arm_elf_section_data *sec_data;
4241   int errcount;
4242   elf32_vfp11_erratum_list *newerr;
4243
4244   hash_table = elf32_arm_hash_table (link_info);
4245
4246   BFD_ASSERT (hash_table != NULL);
4247   BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
4248
4249   s = bfd_get_section_by_name
4250     (hash_table->bfd_of_glue_owner, VFP11_ERRATUM_VENEER_SECTION_NAME);
4251
4252   sec_data = elf32_arm_section_data (s);
4253
4254   BFD_ASSERT (s != NULL);
4255
4256   tmp_name = bfd_malloc ((bfd_size_type) strlen
4257                          (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
4258
4259   BFD_ASSERT (tmp_name);
4260
4261   sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
4262            hash_table->num_vfp11_fixes);
4263
4264   myh = elf_link_hash_lookup
4265     (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
4266
4267   BFD_ASSERT (myh == NULL);
4268
4269   bh = NULL;
4270   val = hash_table->vfp11_erratum_glue_size;
4271   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
4272                                     tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
4273                                     NULL, TRUE, FALSE, &bh);
4274
4275   myh = (struct elf_link_hash_entry *) bh;
4276   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
4277   myh->forced_local = 1;
4278
4279   /* Link veneer back to calling location.  */
4280   errcount = ++(sec_data->erratumcount);
4281   newerr = bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
4282
4283   newerr->type = VFP11_ERRATUM_ARM_VENEER;
4284   newerr->vma = -1;
4285   newerr->u.v.branch = branch;
4286   newerr->u.v.id = hash_table->num_vfp11_fixes;
4287   branch->u.b.veneer = newerr;
4288
4289   newerr->next = sec_data->erratumlist;
4290   sec_data->erratumlist = newerr;
4291
4292   /* A symbol for the return from the veneer.  */
4293   sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
4294            hash_table->num_vfp11_fixes);
4295
4296   myh = elf_link_hash_lookup
4297     (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
4298
4299   if (myh != NULL)
4300     abort ();
4301
4302   bh = NULL;
4303   val = offset + 4;
4304   _bfd_generic_link_add_one_symbol (link_info, branch_bfd, tmp_name, BSF_LOCAL,
4305                                     branch_sec, val, NULL, TRUE, FALSE, &bh);
4306
4307   myh = (struct elf_link_hash_entry *) bh;
4308   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
4309   myh->forced_local = 1;
4310
4311   free (tmp_name);
4312
4313   /* Generate a mapping symbol for the veneer section, and explicitly add an
4314      entry for that symbol to the code/data map for the section.  */
4315   if (hash_table->vfp11_erratum_glue_size == 0)
4316     {
4317       bh = NULL;
4318       /* FIXME: Creates an ARM symbol.  Thumb mode will need attention if it
4319          ever requires this erratum fix.  */
4320       _bfd_generic_link_add_one_symbol (link_info,
4321                                         hash_table->bfd_of_glue_owner, "$a",
4322                                         BSF_LOCAL, s, 0, NULL,
4323                                         TRUE, FALSE, &bh);
4324
4325       myh = (struct elf_link_hash_entry *) bh;
4326       myh->type = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
4327       myh->forced_local = 1;
4328
4329       /* The elf32_arm_init_maps function only cares about symbols from input
4330          BFDs.  We must make a note of this generated mapping symbol
4331          ourselves so that code byteswapping works properly in
4332          elf32_arm_write_section.  */
4333       elf32_arm_section_map_add (s, 'a', 0);
4334     }
4335
4336   s->size += VFP11_ERRATUM_VENEER_SIZE;
4337   hash_table->vfp11_erratum_glue_size += VFP11_ERRATUM_VENEER_SIZE;
4338   hash_table->num_vfp11_fixes++;
4339
4340   /* The offset of the veneer.  */
4341   return val;
4342 }
4343
4344 /* Note: we do not include the flag SEC_LINKER_CREATED, as that
4345    would prevent elf_link_input_bfd() from processing the contents
4346    of the section.  */
4347 #define ARM_GLUE_SECTION_FLAGS \
4348   (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY)
4349
4350 /* Create a fake section for use by the ARM backend of the linker.  */
4351
4352 static bfd_boolean
4353 arm_make_glue_section (bfd * abfd, const char * name)
4354 {
4355   asection * sec;
4356
4357   sec = bfd_get_section_by_name (abfd, name);
4358   if (sec != NULL)
4359     /* Already made.  */
4360     return TRUE;
4361
4362   sec = bfd_make_section_with_flags (abfd, name, ARM_GLUE_SECTION_FLAGS);
4363
4364   if (sec == NULL
4365       || !bfd_set_section_alignment (abfd, sec, 2))
4366     return FALSE;
4367
4368   /* Set the gc mark to prevent the section from being removed by garbage
4369      collection, despite the fact that no relocs refer to this section.  */
4370   sec->gc_mark = 1;
4371
4372   return TRUE;
4373 }
4374
4375 /* Add the glue sections to ABFD.  This function is called from the
4376    linker scripts in ld/emultempl/{armelf}.em.  */
4377
4378 bfd_boolean
4379 bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
4380                                         struct bfd_link_info *info)
4381 {
4382   /* If we are only performing a partial
4383      link do not bother adding the glue.  */
4384   if (info->relocatable)
4385     return TRUE;
4386
4387   /* Linker stubs don't need glue.  */
4388   if (!strcmp (abfd->filename, "linker stubs"))
4389     return TRUE;
4390
4391   return arm_make_glue_section (abfd, ARM2THUMB_GLUE_SECTION_NAME)
4392     && arm_make_glue_section (abfd, THUMB2ARM_GLUE_SECTION_NAME)
4393     && arm_make_glue_section (abfd, VFP11_ERRATUM_VENEER_SECTION_NAME)
4394     && arm_make_glue_section (abfd, ARM_BX_GLUE_SECTION_NAME);
4395 }
4396
4397 /* Select a BFD to be used to hold the sections used by the glue code.
4398    This function is called from the linker scripts in ld/emultempl/
4399    {armelf/pe}.em.  */
4400
4401 bfd_boolean
4402 bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
4403 {
4404   struct elf32_arm_link_hash_table *globals;
4405
4406   /* If we are only performing a partial link
4407      do not bother getting a bfd to hold the glue.  */
4408   if (info->relocatable)
4409     return TRUE;
4410
4411   /* Make sure we don't attach the glue sections to a dynamic object.  */
4412   BFD_ASSERT (!(abfd->flags & DYNAMIC));
4413
4414   globals = elf32_arm_hash_table (info);
4415
4416   BFD_ASSERT (globals != NULL);
4417
4418   if (globals->bfd_of_glue_owner != NULL)
4419     return TRUE;
4420
4421   /* Save the bfd for later use.  */
4422   globals->bfd_of_glue_owner = abfd;
4423
4424   return TRUE;
4425 }
4426
4427 static void
4428 check_use_blx (struct elf32_arm_link_hash_table *globals)
4429 {
4430   if (bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
4431                                 Tag_CPU_arch) > 2)
4432     globals->use_blx = 1;
4433 }
4434
4435 bfd_boolean
4436 bfd_elf32_arm_process_before_allocation (bfd *abfd,
4437                                          struct bfd_link_info *link_info)
4438 {
4439   Elf_Internal_Shdr *symtab_hdr;
4440   Elf_Internal_Rela *internal_relocs = NULL;
4441   Elf_Internal_Rela *irel, *irelend;
4442   bfd_byte *contents = NULL;
4443
4444   asection *sec;
4445   struct elf32_arm_link_hash_table *globals;
4446
4447   /* If we are only performing a partial link do not bother
4448      to construct any glue.  */
4449   if (link_info->relocatable)
4450     return TRUE;
4451
4452   /* Here we have a bfd that is to be included on the link.  We have a
4453      hook to do reloc rummaging, before section sizes are nailed down.  */
4454   globals = elf32_arm_hash_table (link_info);
4455
4456   BFD_ASSERT (globals != NULL);
4457
4458   check_use_blx (globals);
4459
4460   if (globals->byteswap_code && !bfd_big_endian (abfd))
4461     {
4462       _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
4463                           abfd);
4464       return FALSE;
4465     }
4466
4467   /* PR 5398: If we have not decided to include any loadable sections in
4468      the output then we will not have a glue owner bfd.  This is OK, it
4469      just means that there is nothing else for us to do here.  */
4470   if (globals->bfd_of_glue_owner == NULL)
4471     return TRUE;
4472
4473   /* Rummage around all the relocs and map the glue vectors.  */
4474   sec = abfd->sections;
4475
4476   if (sec == NULL)
4477     return TRUE;
4478
4479   for (; sec != NULL; sec = sec->next)
4480     {
4481       if (sec->reloc_count == 0)
4482         continue;
4483
4484       if ((sec->flags & SEC_EXCLUDE) != 0)
4485         continue;
4486
4487       symtab_hdr = & elf_symtab_hdr (abfd);
4488
4489       /* Load the relocs.  */
4490       internal_relocs
4491         = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, FALSE);
4492
4493       if (internal_relocs == NULL)
4494         goto error_return;
4495
4496       irelend = internal_relocs + sec->reloc_count;
4497       for (irel = internal_relocs; irel < irelend; irel++)
4498         {
4499           long r_type;
4500           unsigned long r_index;
4501
4502           struct elf_link_hash_entry *h;
4503
4504           r_type = ELF32_R_TYPE (irel->r_info);
4505           r_index = ELF32_R_SYM (irel->r_info);
4506
4507           /* These are the only relocation types we care about.  */
4508           if (   r_type != R_ARM_PC24
4509               && r_type != R_ARM_PLT32
4510               && r_type != R_ARM_JUMP24
4511               && r_type != R_ARM_THM_JUMP24
4512               && (r_type != R_ARM_V4BX || globals->fix_v4bx < 2))
4513             continue;
4514
4515           /* Get the section contents if we haven't done so already.  */
4516           if (contents == NULL)
4517             {
4518               /* Get cached copy if it exists.  */
4519               if (elf_section_data (sec)->this_hdr.contents != NULL)
4520                 contents = elf_section_data (sec)->this_hdr.contents;
4521               else
4522                 {
4523                   /* Go get them off disk.  */
4524                   if (! bfd_malloc_and_get_section (abfd, sec, &contents))
4525                     goto error_return;
4526                 }
4527             }
4528
4529           if (r_type == R_ARM_V4BX)
4530             {
4531               int reg;
4532
4533               reg = bfd_get_32 (abfd, contents + irel->r_offset) & 0xf;
4534               record_arm_bx_glue (link_info, reg);
4535               continue;
4536             }
4537
4538           /* If the relocation is not against a symbol it cannot concern us.  */
4539           h = NULL;
4540
4541           /* We don't care about local symbols.  */
4542           if (r_index < symtab_hdr->sh_info)
4543             continue;
4544
4545           /* This is an external symbol.  */
4546           r_index -= symtab_hdr->sh_info;
4547           h = (struct elf_link_hash_entry *)
4548             elf_sym_hashes (abfd)[r_index];
4549
4550           /* If the relocation is against a static symbol it must be within
4551              the current section and so cannot be a cross ARM/Thumb relocation.  */
4552           if (h == NULL)
4553             continue;
4554
4555           /* If the call will go through a PLT entry then we do not need
4556              glue.  */
4557           if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1)
4558             continue;
4559
4560           switch (r_type)
4561             {
4562             case R_ARM_PC24:
4563             case R_ARM_PLT32:
4564             case R_ARM_JUMP24:
4565               /* This one is a call from arm code.  We need to look up
4566                  the target of the call.  If it is a thumb target, we
4567                  insert glue.  */
4568               if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC
4569                   && !(r_type == R_ARM_CALL && globals->use_blx))
4570                 record_arm_to_thumb_glue (link_info, h);
4571               break;
4572
4573             case R_ARM_THM_JUMP24:
4574               /* This one is a call from thumb code.  We look
4575                  up the target of the call.  If it is not a thumb
4576                  target, we insert glue.  */
4577               if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC
4578                   && !(globals->use_blx && r_type == R_ARM_THM_CALL)
4579                   && h->root.type != bfd_link_hash_undefweak)
4580                 record_thumb_to_arm_glue (link_info, h);
4581               break;
4582
4583             default:
4584               abort ();
4585             }
4586         }
4587
4588       if (contents != NULL
4589           && elf_section_data (sec)->this_hdr.contents != contents)
4590         free (contents);
4591       contents = NULL;
4592
4593       if (internal_relocs != NULL
4594           && elf_section_data (sec)->relocs != internal_relocs)
4595         free (internal_relocs);
4596       internal_relocs = NULL;
4597     }
4598
4599   return TRUE;
4600
4601 error_return:
4602   if (contents != NULL
4603       && elf_section_data (sec)->this_hdr.contents != contents)
4604     free (contents);
4605   if (internal_relocs != NULL
4606       && elf_section_data (sec)->relocs != internal_relocs)
4607     free (internal_relocs);
4608
4609   return FALSE;
4610 }
4611 #endif
4612
4613
4614 /* Initialise maps of ARM/Thumb/data for input BFDs.  */
4615
4616 void
4617 bfd_elf32_arm_init_maps (bfd *abfd)
4618 {
4619   Elf_Internal_Sym *isymbuf;
4620   Elf_Internal_Shdr *hdr;
4621   unsigned int i, localsyms;
4622
4623   if ((abfd->flags & DYNAMIC) != 0)
4624     return;
4625
4626   hdr = & elf_symtab_hdr (abfd);
4627   localsyms = hdr->sh_info;
4628
4629   /* Obtain a buffer full of symbols for this BFD. The hdr->sh_info field
4630      should contain the number of local symbols, which should come before any
4631      global symbols.  Mapping symbols are always local.  */
4632   isymbuf = bfd_elf_get_elf_syms (abfd, hdr, localsyms, 0, NULL, NULL,
4633                                   NULL);
4634
4635   /* No internal symbols read?  Skip this BFD.  */
4636   if (isymbuf == NULL)
4637     return;
4638
4639   for (i = 0; i < localsyms; i++)
4640     {
4641       Elf_Internal_Sym *isym = &isymbuf[i];
4642       asection *sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
4643       const char *name;
4644
4645       if (sec != NULL
4646           && ELF_ST_BIND (isym->st_info) == STB_LOCAL)
4647         {
4648           name = bfd_elf_string_from_elf_section (abfd,
4649             hdr->sh_link, isym->st_name);
4650
4651           if (bfd_is_arm_special_symbol_name (name,
4652                                               BFD_ARM_SPECIAL_SYM_TYPE_MAP))
4653             elf32_arm_section_map_add (sec, name[1], isym->st_value);
4654         }
4655     }
4656 }
4657
4658
4659 void
4660 bfd_elf32_arm_set_vfp11_fix (bfd *obfd, struct bfd_link_info *link_info)
4661 {
4662   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
4663   obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd);
4664
4665   /* We assume that ARMv7+ does not need the VFP11 denorm erratum fix.  */
4666   if (out_attr[Tag_CPU_arch].i >= TAG_CPU_ARCH_V7)
4667     {
4668       switch (globals->vfp11_fix)
4669         {
4670         case BFD_ARM_VFP11_FIX_DEFAULT:
4671         case BFD_ARM_VFP11_FIX_NONE:
4672           globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
4673           break;
4674
4675         default:
4676           /* Give a warning, but do as the user requests anyway.  */
4677           (*_bfd_error_handler) (_("%B: warning: selected VFP11 erratum "
4678             "workaround is not necessary for target architecture"), obfd);
4679         }
4680     }
4681   else if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_DEFAULT)
4682     /* For earlier architectures, we might need the workaround, but do not
4683        enable it by default.  If users is running with broken hardware, they
4684        must enable the erratum fix explicitly.  */
4685     globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
4686 }
4687
4688
4689 enum bfd_arm_vfp11_pipe
4690 {
4691   VFP11_FMAC,
4692   VFP11_LS,
4693   VFP11_DS,
4694   VFP11_BAD
4695 };
4696
4697 /* Return a VFP register number.  This is encoded as RX:X for single-precision
4698    registers, or X:RX for double-precision registers, where RX is the group of
4699    four bits in the instruction encoding and X is the single extension bit.
4700    RX and X fields are specified using their lowest (starting) bit.  The return
4701    value is:
4702
4703      0...31: single-precision registers s0...s31
4704      32...63: double-precision registers d0...d31.
4705
4706    Although X should be zero for VFP11 (encoding d0...d15 only), we might
4707    encounter VFP3 instructions, so we allow the full range for DP registers.  */
4708
4709 static unsigned int
4710 bfd_arm_vfp11_regno (unsigned int insn, bfd_boolean is_double, unsigned int rx,
4711                      unsigned int x)
4712 {
4713   if (is_double)
4714     return (((insn >> rx) & 0xf) | (((insn >> x) & 1) << 4)) + 32;
4715   else
4716     return (((insn >> rx) & 0xf) << 1) | ((insn >> x) & 1);
4717 }
4718
4719 /* Set bits in *WMASK according to a register number REG as encoded by
4720    bfd_arm_vfp11_regno().  Ignore d16-d31.  */
4721
4722 static void
4723 bfd_arm_vfp11_write_mask (unsigned int *wmask, unsigned int reg)
4724 {
4725   if (reg < 32)
4726     *wmask |= 1 << reg;
4727   else if (reg < 48)
4728     *wmask |= 3 << ((reg - 32) * 2);
4729 }
4730
4731 /* Return TRUE if WMASK overwrites anything in REGS.  */
4732
4733 static bfd_boolean
4734 bfd_arm_vfp11_antidependency (unsigned int wmask, int *regs, int numregs)
4735 {
4736   int i;
4737
4738   for (i = 0; i < numregs; i++)
4739     {
4740       unsigned int reg = regs[i];
4741
4742       if (reg < 32 && (wmask & (1 << reg)) != 0)
4743         return TRUE;
4744
4745       reg -= 32;
4746
4747       if (reg >= 16)
4748         continue;
4749
4750       if ((wmask & (3 << (reg * 2))) != 0)
4751         return TRUE;
4752     }
4753
4754   return FALSE;
4755 }
4756
4757 /* In this function, we're interested in two things: finding input registers
4758    for VFP data-processing instructions, and finding the set of registers which
4759    arbitrary VFP instructions may write to.  We use a 32-bit unsigned int to
4760    hold the written set, so FLDM etc. are easy to deal with (we're only
4761    interested in 32 SP registers or 16 dp registers, due to the VFP version
4762    implemented by the chip in question).  DP registers are marked by setting
4763    both SP registers in the write mask).  */
4764
4765 static enum bfd_arm_vfp11_pipe
4766 bfd_arm_vfp11_insn_decode (unsigned int insn, unsigned int *destmask, int *regs,
4767                            int *numregs)
4768 {
4769   enum bfd_arm_vfp11_pipe pipe = VFP11_BAD;
4770   bfd_boolean is_double = ((insn & 0xf00) == 0xb00) ? 1 : 0;
4771
4772   if ((insn & 0x0f000e10) == 0x0e000a00)  /* A data-processing insn.  */
4773     {
4774       unsigned int pqrs;
4775       unsigned int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
4776       unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
4777
4778       pqrs = ((insn & 0x00800000) >> 20)
4779            | ((insn & 0x00300000) >> 19)
4780            | ((insn & 0x00000040) >> 6);
4781
4782       switch (pqrs)
4783         {
4784         case 0: /* fmac[sd].  */
4785         case 1: /* fnmac[sd].  */
4786         case 2: /* fmsc[sd].  */
4787         case 3: /* fnmsc[sd].  */
4788           pipe = VFP11_FMAC;
4789           bfd_arm_vfp11_write_mask (destmask, fd);
4790           regs[0] = fd;
4791           regs[1] = bfd_arm_vfp11_regno (insn, is_double, 16, 7);  /* Fn.  */
4792           regs[2] = fm;
4793           *numregs = 3;
4794           break;
4795
4796         case 4: /* fmul[sd].  */
4797         case 5: /* fnmul[sd].  */
4798         case 6: /* fadd[sd].  */
4799         case 7: /* fsub[sd].  */
4800           pipe = VFP11_FMAC;
4801           goto vfp_binop;
4802
4803         case 8: /* fdiv[sd].  */
4804           pipe = VFP11_DS;
4805           vfp_binop:
4806           bfd_arm_vfp11_write_mask (destmask, fd);
4807           regs[0] = bfd_arm_vfp11_regno (insn, is_double, 16, 7);   /* Fn.  */
4808           regs[1] = fm;
4809           *numregs = 2;
4810           break;
4811
4812         case 15: /* extended opcode.  */
4813           {
4814             unsigned int extn = ((insn >> 15) & 0x1e)
4815                               | ((insn >> 7) & 1);
4816
4817             switch (extn)
4818               {
4819               case 0: /* fcpy[sd].  */
4820               case 1: /* fabs[sd].  */
4821               case 2: /* fneg[sd].  */
4822               case 8: /* fcmp[sd].  */
4823               case 9: /* fcmpe[sd].  */
4824               case 10: /* fcmpz[sd].  */
4825               case 11: /* fcmpez[sd].  */
4826               case 16: /* fuito[sd].  */
4827               case 17: /* fsito[sd].  */
4828               case 24: /* ftoui[sd].  */
4829               case 25: /* ftouiz[sd].  */
4830               case 26: /* ftosi[sd].  */
4831               case 27: /* ftosiz[sd].  */
4832                 /* These instructions will not bounce due to underflow.  */
4833                 *numregs = 0;
4834                 pipe = VFP11_FMAC;
4835                 break;
4836
4837               case 3: /* fsqrt[sd].  */
4838                 /* fsqrt cannot underflow, but it can (perhaps) overwrite
4839                    registers to cause the erratum in previous instructions.  */
4840                 bfd_arm_vfp11_write_mask (destmask, fd);
4841                 pipe = VFP11_DS;
4842                 break;
4843
4844               case 15: /* fcvt{ds,sd}.  */
4845                 {
4846                   int rnum = 0;
4847
4848                   bfd_arm_vfp11_write_mask (destmask, fd);
4849
4850                   /* Only FCVTSD can underflow.  */
4851                   if ((insn & 0x100) != 0)
4852                     regs[rnum++] = fm;
4853
4854                   *numregs = rnum;
4855
4856                   pipe = VFP11_FMAC;
4857                 }
4858                 break;
4859
4860               default:
4861                 return VFP11_BAD;
4862               }
4863           }
4864           break;
4865
4866         default:
4867           return VFP11_BAD;
4868         }
4869     }
4870   /* Two-register transfer.  */
4871   else if ((insn & 0x0fe00ed0) == 0x0c400a10)
4872     {
4873       unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
4874
4875       if ((insn & 0x100000) == 0)
4876         {
4877           if (is_double)
4878             bfd_arm_vfp11_write_mask (destmask, fm);
4879           else
4880             {
4881               bfd_arm_vfp11_write_mask (destmask, fm);
4882               bfd_arm_vfp11_write_mask (destmask, fm + 1);
4883             }
4884         }
4885
4886       pipe = VFP11_LS;
4887     }
4888   else if ((insn & 0x0e100e00) == 0x0c100a00)  /* A load insn.  */
4889     {
4890       int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
4891       unsigned int puw = ((insn >> 21) & 0x1) | (((insn >> 23) & 3) << 1);
4892
4893       switch (puw)
4894         {
4895         case 0: /* Two-reg transfer.  We should catch these above.  */
4896           abort ();
4897
4898         case 2: /* fldm[sdx].  */
4899         case 3:
4900         case 5:
4901           {
4902             unsigned int i, offset = insn & 0xff;
4903
4904             if (is_double)
4905               offset >>= 1;
4906
4907             for (i = fd; i < fd + offset; i++)
4908               bfd_arm_vfp11_write_mask (destmask, i);
4909           }
4910           break;
4911
4912         case 4: /* fld[sd].  */
4913         case 6:
4914           bfd_arm_vfp11_write_mask (destmask, fd);
4915           break;
4916
4917         default:
4918           return VFP11_BAD;
4919         }
4920
4921       pipe = VFP11_LS;
4922     }
4923   /* Single-register transfer. Note L==0.  */
4924   else if ((insn & 0x0f100e10) == 0x0e000a10)
4925     {
4926       unsigned int opcode = (insn >> 21) & 7;
4927       unsigned int fn = bfd_arm_vfp11_regno (insn, is_double, 16, 7);
4928
4929       switch (opcode)
4930         {
4931         case 0: /* fmsr/fmdlr.  */
4932         case 1: /* fmdhr.  */
4933           /* Mark fmdhr and fmdlr as writing to the whole of the DP
4934              destination register.  I don't know if this is exactly right,
4935              but it is the conservative choice.  */
4936           bfd_arm_vfp11_write_mask (destmask, fn);
4937           break;
4938
4939         case 7: /* fmxr.  */
4940           break;
4941         }
4942
4943       pipe = VFP11_LS;
4944     }
4945
4946   return pipe;
4947 }
4948
4949
4950 static int elf32_arm_compare_mapping (const void * a, const void * b);
4951
4952
4953 /* Look for potentially-troublesome code sequences which might trigger the
4954    VFP11 denormal/antidependency erratum.  See, e.g., the ARM1136 errata sheet
4955    (available from ARM) for details of the erratum.  A short version is
4956    described in ld.texinfo.  */
4957
4958 bfd_boolean
4959 bfd_elf32_arm_vfp11_erratum_scan (bfd *abfd, struct bfd_link_info *link_info)
4960 {
4961   asection *sec;
4962   bfd_byte *contents = NULL;
4963   int state = 0;
4964   int regs[3], numregs = 0;
4965   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
4966   int use_vector = (globals->vfp11_fix == BFD_ARM_VFP11_FIX_VECTOR);
4967
4968   /* We use a simple FSM to match troublesome VFP11 instruction sequences.
4969      The states transition as follows:
4970
4971        0 -> 1 (vector) or 0 -> 2 (scalar)
4972            A VFP FMAC-pipeline instruction has been seen. Fill
4973            regs[0]..regs[numregs-1] with its input operands. Remember this
4974            instruction in 'first_fmac'.
4975
4976        1 -> 2
4977            Any instruction, except for a VFP instruction which overwrites
4978            regs[*].
4979
4980        1 -> 3 [ -> 0 ]  or
4981        2 -> 3 [ -> 0 ]
4982            A VFP instruction has been seen which overwrites any of regs[*].
4983            We must make a veneer!  Reset state to 0 before examining next
4984            instruction.
4985
4986        2 -> 0
4987            If we fail to match anything in state 2, reset to state 0 and reset
4988            the instruction pointer to the instruction after 'first_fmac'.
4989
4990      If the VFP11 vector mode is in use, there must be at least two unrelated
4991      instructions between anti-dependent VFP11 instructions to properly avoid
4992      triggering the erratum, hence the use of the extra state 1.  */
4993
4994   /* If we are only performing a partial link do not bother
4995      to construct any glue.  */
4996   if (link_info->relocatable)
4997     return TRUE;
4998
4999   /* Skip if this bfd does not correspond to an ELF image.  */
5000   if (! is_arm_elf (abfd))
5001     return TRUE;
5002
5003   /* We should have chosen a fix type by the time we get here.  */
5004   BFD_ASSERT (globals->vfp11_fix != BFD_ARM_VFP11_FIX_DEFAULT);
5005
5006   if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_NONE)
5007     return TRUE;
5008
5009   for (sec = abfd->sections; sec != NULL; sec = sec->next)
5010     {
5011       unsigned int i, span, first_fmac = 0, veneer_of_insn = 0;
5012       struct _arm_elf_section_data *sec_data;
5013
5014       /* If we don't have executable progbits, we're not interested in this
5015          section.  Also skip if section is to be excluded.  */
5016       if (elf_section_type (sec) != SHT_PROGBITS
5017           || (elf_section_flags (sec) & SHF_EXECINSTR) == 0
5018           || (sec->flags & SEC_EXCLUDE) != 0
5019           || strcmp (sec->name, VFP11_ERRATUM_VENEER_SECTION_NAME) == 0)
5020         continue;
5021
5022       sec_data = elf32_arm_section_data (sec);
5023
5024       if (sec_data->mapcount == 0)
5025         continue;
5026
5027       if (elf_section_data (sec)->this_hdr.contents != NULL)
5028         contents = elf_section_data (sec)->this_hdr.contents;
5029       else if (! bfd_malloc_and_get_section (abfd, sec, &contents))
5030         goto error_return;
5031
5032       qsort (sec_data->map, sec_data->mapcount, sizeof (elf32_arm_section_map),
5033              elf32_arm_compare_mapping);
5034
5035       for (span = 0; span < sec_data->mapcount; span++)
5036         {
5037           unsigned int span_start = sec_data->map[span].vma;
5038           unsigned int span_end = (span == sec_data->mapcount - 1)
5039                                   ? sec->size : sec_data->map[span + 1].vma;
5040           char span_type = sec_data->map[span].type;
5041
5042           /* FIXME: Only ARM mode is supported at present.  We may need to
5043              support Thumb-2 mode also at some point.  */
5044           if (span_type != 'a')
5045             continue;
5046
5047           for (i = span_start; i < span_end;)
5048             {
5049               unsigned int next_i = i + 4;
5050               unsigned int insn = bfd_big_endian (abfd)
5051                 ? (contents[i] << 24)
5052                   | (contents[i + 1] << 16)
5053                   | (contents[i + 2] << 8)
5054                   | contents[i + 3]
5055                 : (contents[i + 3] << 24)
5056                   | (contents[i + 2] << 16)
5057                   | (contents[i + 1] << 8)
5058                   | contents[i];
5059               unsigned int writemask = 0;
5060               enum bfd_arm_vfp11_pipe pipe;
5061
5062               switch (state)
5063                 {
5064                 case 0:
5065                   pipe = bfd_arm_vfp11_insn_decode (insn, &writemask, regs,
5066                                                     &numregs);
5067                   /* I'm assuming the VFP11 erratum can trigger with denorm
5068                      operands on either the FMAC or the DS pipeline. This might
5069                      lead to slightly overenthusiastic veneer insertion.  */
5070                   if (pipe == VFP11_FMAC || pipe == VFP11_DS)
5071                     {
5072                       state = use_vector ? 1 : 2;
5073                       first_fmac = i;
5074                       veneer_of_insn = insn;
5075                     }
5076                   break;
5077
5078                 case 1:
5079                   {
5080                     int other_regs[3], other_numregs;
5081                     pipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
5082                                                       other_regs,
5083                                                       &other_numregs);
5084                     if (pipe != VFP11_BAD
5085                         && bfd_arm_vfp11_antidependency (writemask, regs,
5086                                                          numregs))
5087                       state = 3;
5088                     else
5089                       state = 2;
5090                   }
5091                   break;
5092
5093                 case 2:
5094                   {
5095                     int other_regs[3], other_numregs;
5096                     pipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
5097                                                       other_regs,
5098                                                       &other_numregs);
5099                     if (pipe != VFP11_BAD
5100                         && bfd_arm_vfp11_antidependency (writemask, regs,
5101                                                          numregs))
5102                       state = 3;
5103                     else
5104                       {
5105                         state = 0;
5106                         next_i = first_fmac + 4;
5107                       }
5108                   }
5109                   break;
5110
5111                 case 3:
5112                   abort ();  /* Should be unreachable.  */
5113                 }
5114
5115               if (state == 3)
5116                 {
5117                   elf32_vfp11_erratum_list *newerr
5118                     = bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
5119                   int errcount;
5120
5121                   errcount = ++(elf32_arm_section_data (sec)->erratumcount);
5122
5123                   newerr->u.b.vfp_insn = veneer_of_insn;
5124
5125                   switch (span_type)
5126                     {
5127                     case 'a':
5128                       newerr->type = VFP11_ERRATUM_BRANCH_TO_ARM_VENEER;
5129                       break;
5130
5131                     default:
5132                       abort ();
5133                     }
5134
5135                   record_vfp11_erratum_veneer (link_info, newerr, abfd, sec,
5136                                                first_fmac);
5137
5138                   newerr->vma = -1;
5139
5140                   newerr->next = sec_data->erratumlist;
5141                   sec_data->erratumlist = newerr;
5142
5143                   state = 0;
5144                 }
5145
5146               i = next_i;
5147             }
5148         }
5149
5150       if (contents != NULL
5151           && elf_section_data (sec)->this_hdr.contents != contents)
5152         free (contents);
5153       contents = NULL;
5154     }
5155
5156   return TRUE;
5157
5158 error_return:
5159   if (contents != NULL
5160       && elf_section_data (sec)->this_hdr.contents != contents)
5161     free (contents);
5162
5163   return FALSE;
5164 }
5165
5166 /* Find virtual-memory addresses for VFP11 erratum veneers and return locations
5167    after sections have been laid out, using specially-named symbols.  */
5168
5169 void
5170 bfd_elf32_arm_vfp11_fix_veneer_locations (bfd *abfd,
5171                                           struct bfd_link_info *link_info)
5172 {
5173   asection *sec;
5174   struct elf32_arm_link_hash_table *globals;
5175   char *tmp_name;
5176
5177   if (link_info->relocatable)
5178     return;
5179
5180   /* Skip if this bfd does not correspond to an ELF image.  */
5181   if (! is_arm_elf (abfd))
5182     return;
5183
5184   globals = elf32_arm_hash_table (link_info);
5185
5186   tmp_name = bfd_malloc ((bfd_size_type) strlen
5187                            (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
5188
5189   for (sec = abfd->sections; sec != NULL; sec = sec->next)
5190     {
5191       struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
5192       elf32_vfp11_erratum_list *errnode = sec_data->erratumlist;
5193
5194       for (; errnode != NULL; errnode = errnode->next)
5195         {
5196           struct elf_link_hash_entry *myh;
5197           bfd_vma vma;
5198
5199           switch (errnode->type)
5200             {
5201             case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
5202             case VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER:
5203               /* Find veneer symbol.  */
5204               sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
5205                        errnode->u.b.veneer->u.v.id);
5206
5207               myh = elf_link_hash_lookup
5208                 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
5209
5210               if (myh == NULL)
5211                 (*_bfd_error_handler) (_("%B: unable to find VFP11 veneer "
5212                                          "`%s'"), abfd, tmp_name);
5213
5214               vma = myh->root.u.def.section->output_section->vma
5215                     + myh->root.u.def.section->output_offset
5216                     + myh->root.u.def.value;
5217
5218               errnode->u.b.veneer->vma = vma;
5219               break;
5220
5221             case VFP11_ERRATUM_ARM_VENEER:
5222             case VFP11_ERRATUM_THUMB_VENEER:
5223               /* Find return location.  */
5224               sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
5225                        errnode->u.v.id);
5226
5227               myh = elf_link_hash_lookup
5228                 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
5229
5230               if (myh == NULL)
5231                 (*_bfd_error_handler) (_("%B: unable to find VFP11 veneer "
5232                                          "`%s'"), abfd, tmp_name);
5233
5234               vma = myh->root.u.def.section->output_section->vma
5235                     + myh->root.u.def.section->output_offset
5236                     + myh->root.u.def.value;
5237
5238               errnode->u.v.branch->vma = vma;
5239               break;
5240
5241             default:
5242               abort ();
5243             }
5244         }
5245     }
5246
5247   free (tmp_name);
5248 }
5249
5250
5251 /* Set target relocation values needed during linking.  */
5252
5253 void
5254 bfd_elf32_arm_set_target_relocs (struct bfd *output_bfd,
5255                                  struct bfd_link_info *link_info,
5256                                  int target1_is_rel,
5257                                  char * target2_type,
5258                                  int fix_v4bx,
5259                                  int use_blx,
5260                                  bfd_arm_vfp11_fix vfp11_fix,
5261                                  int no_enum_warn, int no_wchar_warn,
5262                                  int pic_veneer)
5263 {
5264   struct elf32_arm_link_hash_table *globals;
5265
5266   globals = elf32_arm_hash_table (link_info);
5267
5268   globals->target1_is_rel = target1_is_rel;
5269   if (strcmp (target2_type, "rel") == 0)
5270     globals->target2_reloc = R_ARM_REL32;
5271   else if (strcmp (target2_type, "abs") == 0)
5272     globals->target2_reloc = R_ARM_ABS32;
5273   else if (strcmp (target2_type, "got-rel") == 0)
5274     globals->target2_reloc = R_ARM_GOT_PREL;
5275   else
5276     {
5277       _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
5278                           target2_type);
5279     }
5280   globals->fix_v4bx = fix_v4bx;
5281   globals->use_blx |= use_blx;
5282   globals->vfp11_fix = vfp11_fix;
5283   globals->pic_veneer = pic_veneer;
5284
5285   BFD_ASSERT (is_arm_elf (output_bfd));
5286   elf_arm_tdata (output_bfd)->no_enum_size_warning = no_enum_warn;
5287   elf_arm_tdata (output_bfd)->no_wchar_size_warning = no_wchar_warn;
5288 }
5289
5290 /* Replace the target offset of a Thumb bl or b.w instruction.  */
5291
5292 static void
5293 insert_thumb_branch (bfd *abfd, long int offset, bfd_byte *insn)
5294 {
5295   bfd_vma upper;
5296   bfd_vma lower;
5297   int reloc_sign;
5298
5299   BFD_ASSERT ((offset & 1) == 0);
5300
5301   upper = bfd_get_16 (abfd, insn);
5302   lower = bfd_get_16 (abfd, insn + 2);
5303   reloc_sign = (offset < 0) ? 1 : 0;
5304   upper = (upper & ~(bfd_vma) 0x7ff)
5305           | ((offset >> 12) & 0x3ff)
5306           | (reloc_sign << 10);
5307   lower = (lower & ~(bfd_vma) 0x2fff)
5308           | (((!((offset >> 23) & 1)) ^ reloc_sign) << 13)
5309           | (((!((offset >> 22) & 1)) ^ reloc_sign) << 11)
5310           | ((offset >> 1) & 0x7ff);
5311   bfd_put_16 (abfd, upper, insn);
5312   bfd_put_16 (abfd, lower, insn + 2);
5313 }
5314
5315 /* Thumb code calling an ARM function.  */
5316
5317 static int
5318 elf32_thumb_to_arm_stub (struct bfd_link_info * info,
5319                          const char *           name,
5320                          bfd *                  input_bfd,
5321                          bfd *                  output_bfd,
5322                          asection *             input_section,
5323                          bfd_byte *             hit_data,
5324                          asection *             sym_sec,
5325                          bfd_vma                offset,
5326                          bfd_signed_vma         addend,
5327                          bfd_vma                val,
5328                          char **error_message)
5329 {
5330   asection * s = 0;
5331   bfd_vma my_offset;
5332   long int ret_offset;
5333   struct elf_link_hash_entry * myh;
5334   struct elf32_arm_link_hash_table * globals;
5335
5336   myh = find_thumb_glue (info, name, error_message);
5337   if (myh == NULL)
5338     return FALSE;
5339
5340   globals = elf32_arm_hash_table (info);
5341
5342   BFD_ASSERT (globals != NULL);
5343   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5344
5345   my_offset = myh->root.u.def.value;
5346
5347   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
5348                                THUMB2ARM_GLUE_SECTION_NAME);
5349
5350   BFD_ASSERT (s != NULL);
5351   BFD_ASSERT (s->contents != NULL);
5352   BFD_ASSERT (s->output_section != NULL);
5353
5354   if ((my_offset & 0x01) == 0x01)
5355     {
5356       if (sym_sec != NULL
5357           && sym_sec->owner != NULL
5358           && !INTERWORK_FLAG (sym_sec->owner))
5359         {
5360           (*_bfd_error_handler)
5361             (_("%B(%s): warning: interworking not enabled.\n"
5362                "  first occurrence: %B: thumb call to arm"),
5363              sym_sec->owner, input_bfd, name);
5364
5365           return FALSE;
5366         }
5367
5368       --my_offset;
5369       myh->root.u.def.value = my_offset;
5370
5371       put_thumb_insn (globals, output_bfd, (bfd_vma) t2a1_bx_pc_insn,
5372                       s->contents + my_offset);
5373
5374       put_thumb_insn (globals, output_bfd, (bfd_vma) t2a2_noop_insn,
5375                       s->contents + my_offset + 2);
5376
5377       ret_offset =
5378         /* Address of destination of the stub.  */
5379         ((bfd_signed_vma) val)
5380         - ((bfd_signed_vma)
5381            /* Offset from the start of the current section
5382               to the start of the stubs.  */
5383            (s->output_offset
5384             /* Offset of the start of this stub from the start of the stubs.  */
5385             + my_offset
5386             /* Address of the start of the current section.  */
5387             + s->output_section->vma)
5388            /* The branch instruction is 4 bytes into the stub.  */
5389            + 4
5390            /* ARM branches work from the pc of the instruction + 8.  */
5391            + 8);
5392
5393       put_arm_insn (globals, output_bfd,
5394                     (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
5395                     s->contents + my_offset + 4);
5396     }
5397
5398   BFD_ASSERT (my_offset <= globals->thumb_glue_size);
5399
5400   /* Now go back and fix up the original BL insn to point to here.  */
5401   ret_offset =
5402     /* Address of where the stub is located.  */
5403     (s->output_section->vma + s->output_offset + my_offset)
5404      /* Address of where the BL is located.  */
5405     - (input_section->output_section->vma + input_section->output_offset
5406        + offset)
5407     /* Addend in the relocation.  */
5408     - addend
5409     /* Biassing for PC-relative addressing.  */
5410     - 8;
5411
5412   insert_thumb_branch (input_bfd, ret_offset, hit_data - input_section->vma);
5413
5414   return TRUE;
5415 }
5416
5417 /* Populate an Arm to Thumb stub.  Returns the stub symbol.  */
5418
5419 static struct elf_link_hash_entry *
5420 elf32_arm_create_thumb_stub (struct bfd_link_info * info,
5421                              const char *           name,
5422                              bfd *                  input_bfd,
5423                              bfd *                  output_bfd,
5424                              asection *             sym_sec,
5425                              bfd_vma                val,
5426                              asection *             s,
5427                              char **                error_message)
5428 {
5429   bfd_vma my_offset;
5430   long int ret_offset;
5431   struct elf_link_hash_entry * myh;
5432   struct elf32_arm_link_hash_table * globals;
5433
5434   myh = find_arm_glue (info, name, error_message);
5435   if (myh == NULL)
5436     return NULL;
5437
5438   globals = elf32_arm_hash_table (info);
5439
5440   BFD_ASSERT (globals != NULL);
5441   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5442
5443   my_offset = myh->root.u.def.value;
5444
5445   if ((my_offset & 0x01) == 0x01)
5446     {
5447       if (sym_sec != NULL
5448           && sym_sec->owner != NULL
5449           && !INTERWORK_FLAG (sym_sec->owner))
5450         {
5451           (*_bfd_error_handler)
5452             (_("%B(%s): warning: interworking not enabled.\n"
5453                "  first occurrence: %B: arm call to thumb"),
5454              sym_sec->owner, input_bfd, name);
5455         }
5456
5457       --my_offset;
5458       myh->root.u.def.value = my_offset;
5459
5460       if (info->shared || globals->root.is_relocatable_executable
5461           || globals->pic_veneer)
5462         {
5463           /* For relocatable objects we can't use absolute addresses,
5464              so construct the address from a relative offset.  */
5465           /* TODO: If the offset is small it's probably worth
5466              constructing the address with adds.  */
5467           put_arm_insn (globals, output_bfd, (bfd_vma) a2t1p_ldr_insn,
5468                         s->contents + my_offset);
5469           put_arm_insn (globals, output_bfd, (bfd_vma) a2t2p_add_pc_insn,
5470                         s->contents + my_offset + 4);
5471           put_arm_insn (globals, output_bfd, (bfd_vma) a2t3p_bx_r12_insn,
5472                         s->contents + my_offset + 8);
5473           /* Adjust the offset by 4 for the position of the add,
5474              and 8 for the pipeline offset.  */
5475           ret_offset = (val - (s->output_offset
5476                                + s->output_section->vma
5477                                + my_offset + 12))
5478                        | 1;
5479           bfd_put_32 (output_bfd, ret_offset,
5480                       s->contents + my_offset + 12);
5481         }
5482       else if (globals->use_blx)
5483         {
5484           put_arm_insn (globals, output_bfd, (bfd_vma) a2t1v5_ldr_insn,
5485                         s->contents + my_offset);
5486
5487           /* It's a thumb address.  Add the low order bit.  */
5488           bfd_put_32 (output_bfd, val | a2t2v5_func_addr_insn,
5489                       s->contents + my_offset + 4);
5490         }
5491       else
5492         {
5493           put_arm_insn (globals, output_bfd, (bfd_vma) a2t1_ldr_insn,
5494                         s->contents + my_offset);
5495
5496           put_arm_insn (globals, output_bfd, (bfd_vma) a2t2_bx_r12_insn,
5497                         s->contents + my_offset + 4);
5498
5499           /* It's a thumb address.  Add the low order bit.  */
5500           bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
5501                       s->contents + my_offset + 8);
5502
5503           my_offset += 12;
5504         }
5505     }
5506
5507   BFD_ASSERT (my_offset <= globals->arm_glue_size);
5508
5509   return myh;
5510 }
5511
5512 /* Arm code calling a Thumb function.  */
5513
5514 static int
5515 elf32_arm_to_thumb_stub (struct bfd_link_info * info,
5516                          const char *           name,
5517                          bfd *                  input_bfd,
5518                          bfd *                  output_bfd,
5519                          asection *             input_section,
5520                          bfd_byte *             hit_data,
5521                          asection *             sym_sec,
5522                          bfd_vma                offset,
5523                          bfd_signed_vma         addend,
5524                          bfd_vma                val,
5525                          char **error_message)
5526 {
5527   unsigned long int tmp;
5528   bfd_vma my_offset;
5529   asection * s;
5530   long int ret_offset;
5531   struct elf_link_hash_entry * myh;
5532   struct elf32_arm_link_hash_table * globals;
5533
5534   globals = elf32_arm_hash_table (info);
5535
5536   BFD_ASSERT (globals != NULL);
5537   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5538
5539   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
5540                                ARM2THUMB_GLUE_SECTION_NAME);
5541   BFD_ASSERT (s != NULL);
5542   BFD_ASSERT (s->contents != NULL);
5543   BFD_ASSERT (s->output_section != NULL);
5544
5545   myh = elf32_arm_create_thumb_stub (info, name, input_bfd, output_bfd,
5546                                      sym_sec, val, s, error_message);
5547   if (!myh)
5548     return FALSE;
5549
5550   my_offset = myh->root.u.def.value;
5551   tmp = bfd_get_32 (input_bfd, hit_data);
5552   tmp = tmp & 0xFF000000;
5553
5554   /* Somehow these are both 4 too far, so subtract 8.  */
5555   ret_offset = (s->output_offset
5556                 + my_offset
5557                 + s->output_section->vma
5558                 - (input_section->output_offset
5559                    + input_section->output_section->vma
5560                    + offset + addend)
5561                 - 8);
5562
5563   tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
5564
5565   bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
5566
5567   return TRUE;
5568 }
5569
5570 /* Populate Arm stub for an exported Thumb function.  */
5571
5572 static bfd_boolean
5573 elf32_arm_to_thumb_export_stub (struct elf_link_hash_entry *h, void * inf)
5574 {
5575   struct bfd_link_info * info = (struct bfd_link_info *) inf;
5576   asection * s;
5577   struct elf_link_hash_entry * myh;
5578   struct elf32_arm_link_hash_entry *eh;
5579   struct elf32_arm_link_hash_table * globals;
5580   asection *sec;
5581   bfd_vma val;
5582   char *error_message;
5583
5584   eh = elf32_arm_hash_entry (h);
5585   /* Allocate stubs for exported Thumb functions on v4t.  */
5586   if (eh->export_glue == NULL)
5587     return TRUE;
5588
5589   globals = elf32_arm_hash_table (info);
5590
5591   BFD_ASSERT (globals != NULL);
5592   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5593
5594   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
5595                                ARM2THUMB_GLUE_SECTION_NAME);
5596   BFD_ASSERT (s != NULL);
5597   BFD_ASSERT (s->contents != NULL);
5598   BFD_ASSERT (s->output_section != NULL);
5599
5600   sec = eh->export_glue->root.u.def.section;
5601
5602   BFD_ASSERT (sec->output_section != NULL);
5603
5604   val = eh->export_glue->root.u.def.value + sec->output_offset
5605         + sec->output_section->vma;
5606
5607   myh = elf32_arm_create_thumb_stub (info, h->root.root.string,
5608                                      h->root.u.def.section->owner,
5609                                      globals->obfd, sec, val, s,
5610                                      &error_message);
5611   BFD_ASSERT (myh);
5612   return TRUE;
5613 }
5614
5615 /* Populate ARMv4 BX veneers.  Returns the absolute adress of the veneer.  */
5616
5617 static bfd_vma
5618 elf32_arm_bx_glue (struct bfd_link_info * info, int reg)
5619 {
5620   bfd_byte *p;
5621   bfd_vma glue_addr;
5622   asection *s;
5623   struct elf32_arm_link_hash_table *globals;
5624
5625   globals = elf32_arm_hash_table (info);
5626
5627   BFD_ASSERT (globals != NULL);
5628   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5629
5630   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
5631                                ARM_BX_GLUE_SECTION_NAME);
5632   BFD_ASSERT (s != NULL);
5633   BFD_ASSERT (s->contents != NULL);
5634   BFD_ASSERT (s->output_section != NULL);
5635
5636   BFD_ASSERT (globals->bx_glue_offset[reg] & 2);
5637
5638   glue_addr = globals->bx_glue_offset[reg] & ~(bfd_vma)3;
5639
5640   if ((globals->bx_glue_offset[reg] & 1) == 0)
5641     {
5642       p = s->contents + glue_addr;
5643       bfd_put_32 (globals->obfd, armbx1_tst_insn + (reg << 16), p);
5644       bfd_put_32 (globals->obfd, armbx2_moveq_insn + reg, p + 4);
5645       bfd_put_32 (globals->obfd, armbx3_bx_insn + reg, p + 8);
5646       globals->bx_glue_offset[reg] |= 1;
5647     }
5648
5649   return glue_addr + s->output_section->vma + s->output_offset;
5650 }
5651
5652 /* Generate Arm stubs for exported Thumb symbols.  */
5653 static void
5654 elf32_arm_begin_write_processing (bfd *abfd ATTRIBUTE_UNUSED,
5655                                   struct bfd_link_info *link_info)
5656 {
5657   struct elf32_arm_link_hash_table * globals;
5658
5659   if (link_info == NULL)
5660     /* Ignore this if we are not called by the ELF backend linker.  */
5661     return;
5662
5663   globals = elf32_arm_hash_table (link_info);
5664   /* If blx is available then exported Thumb symbols are OK and there is
5665      nothing to do.  */
5666   if (globals->use_blx)
5667     return;
5668
5669   elf_link_hash_traverse (&globals->root, elf32_arm_to_thumb_export_stub,
5670                           link_info);
5671 }
5672
5673 /* Some relocations map to different relocations depending on the
5674    target.  Return the real relocation.  */
5675
5676 static int
5677 arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
5678                      int r_type)
5679 {
5680   switch (r_type)
5681     {
5682     case R_ARM_TARGET1:
5683       if (globals->target1_is_rel)
5684         return R_ARM_REL32;
5685       else
5686         return R_ARM_ABS32;
5687
5688     case R_ARM_TARGET2:
5689       return globals->target2_reloc;
5690
5691     default:
5692       return r_type;
5693     }
5694 }
5695
5696 /* Return the base VMA address which should be subtracted from real addresses
5697    when resolving @dtpoff relocation.
5698    This is PT_TLS segment p_vaddr.  */
5699
5700 static bfd_vma
5701 dtpoff_base (struct bfd_link_info *info)
5702 {
5703   /* If tls_sec is NULL, we should have signalled an error already.  */
5704   if (elf_hash_table (info)->tls_sec == NULL)
5705     return 0;
5706   return elf_hash_table (info)->tls_sec->vma;
5707 }
5708
5709 /* Return the relocation value for @tpoff relocation
5710    if STT_TLS virtual address is ADDRESS.  */
5711
5712 static bfd_vma
5713 tpoff (struct bfd_link_info *info, bfd_vma address)
5714 {
5715   struct elf_link_hash_table *htab = elf_hash_table (info);
5716   bfd_vma base;
5717
5718   /* If tls_sec is NULL, we should have signalled an error already.  */
5719   if (htab->tls_sec == NULL)
5720     return 0;
5721   base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
5722   return address - htab->tls_sec->vma + base;
5723 }
5724
5725 /* Perform an R_ARM_ABS12 relocation on the field pointed to by DATA.
5726    VALUE is the relocation value.  */
5727
5728 static bfd_reloc_status_type
5729 elf32_arm_abs12_reloc (bfd *abfd, void *data, bfd_vma value)
5730 {
5731   if (value > 0xfff)
5732     return bfd_reloc_overflow;
5733
5734   value |= bfd_get_32 (abfd, data) & 0xfffff000;
5735   bfd_put_32 (abfd, value, data);
5736   return bfd_reloc_ok;
5737 }
5738
5739 /* For a given value of n, calculate the value of G_n as required to
5740    deal with group relocations.  We return it in the form of an
5741    encoded constant-and-rotation, together with the final residual.  If n is
5742    specified as less than zero, then final_residual is filled with the
5743    input value and no further action is performed.  */
5744
5745 static bfd_vma
5746 calculate_group_reloc_mask (bfd_vma value, int n, bfd_vma *final_residual)
5747 {
5748   int current_n;
5749   bfd_vma g_n;
5750   bfd_vma encoded_g_n = 0;
5751   bfd_vma residual = value; /* Also known as Y_n.  */
5752
5753   for (current_n = 0; current_n <= n; current_n++)
5754     {
5755       int shift;
5756
5757       /* Calculate which part of the value to mask.  */
5758       if (residual == 0)
5759         shift = 0;
5760       else
5761         {
5762           int msb;
5763
5764           /* Determine the most significant bit in the residual and
5765              align the resulting value to a 2-bit boundary.  */
5766           for (msb = 30; msb >= 0; msb -= 2)
5767             if (residual & (3 << msb))
5768               break;
5769
5770           /* The desired shift is now (msb - 6), or zero, whichever
5771              is the greater.  */
5772           shift = msb - 6;
5773           if (shift < 0)
5774             shift = 0;
5775         }
5776
5777       /* Calculate g_n in 32-bit as well as encoded constant+rotation form.  */
5778       g_n = residual & (0xff << shift);
5779       encoded_g_n = (g_n >> shift)
5780                     | ((g_n <= 0xff ? 0 : (32 - shift) / 2) << 8);
5781
5782       /* Calculate the residual for the next time around.  */
5783       residual &= ~g_n;
5784     }
5785
5786   *final_residual = residual;
5787
5788   return encoded_g_n;
5789 }
5790
5791 /* Given an ARM instruction, determine whether it is an ADD or a SUB.
5792    Returns 1 if it is an ADD, -1 if it is a SUB, and 0 otherwise.  */
5793
5794 static int
5795 identify_add_or_sub (bfd_vma insn)
5796 {
5797   int opcode = insn & 0x1e00000;
5798
5799   if (opcode == 1 << 23) /* ADD */
5800     return 1;
5801
5802   if (opcode == 1 << 22) /* SUB */
5803     return -1;
5804
5805   return 0;
5806 }
5807
5808 /* Perform a relocation as part of a final link.  */
5809
5810 static bfd_reloc_status_type
5811 elf32_arm_final_link_relocate (reloc_howto_type *           howto,
5812                                bfd *                        input_bfd,
5813                                bfd *                        output_bfd,
5814                                asection *                   input_section,
5815                                bfd_byte *                   contents,
5816                                Elf_Internal_Rela *          rel,
5817                                bfd_vma                      value,
5818                                struct bfd_link_info *       info,
5819                                asection *                   sym_sec,
5820                                const char *                 sym_name,
5821                                int                          sym_flags,
5822                                struct elf_link_hash_entry * h,
5823                                bfd_boolean *                unresolved_reloc_p,
5824                                char **                      error_message)
5825 {
5826   unsigned long                 r_type = howto->type;
5827   unsigned long                 r_symndx;
5828   bfd_byte *                    hit_data = contents + rel->r_offset;
5829   bfd *                         dynobj = NULL;
5830   Elf_Internal_Shdr *           symtab_hdr;
5831   struct elf_link_hash_entry ** sym_hashes;
5832   bfd_vma *                     local_got_offsets;
5833   asection *                    sgot = NULL;
5834   asection *                    splt = NULL;
5835   asection *                    sreloc = NULL;
5836   bfd_vma                       addend;
5837   bfd_signed_vma                signed_addend;
5838   struct elf32_arm_link_hash_table * globals;
5839
5840   globals = elf32_arm_hash_table (info);
5841
5842   BFD_ASSERT (is_arm_elf (input_bfd));
5843
5844   /* Some relocation types map to different relocations depending on the
5845      target.  We pick the right one here.  */
5846   r_type = arm_real_reloc_type (globals, r_type);
5847   if (r_type != howto->type)
5848     howto = elf32_arm_howto_from_type (r_type);
5849
5850   /* If the start address has been set, then set the EF_ARM_HASENTRY
5851      flag.  Setting this more than once is redundant, but the cost is
5852      not too high, and it keeps the code simple.
5853
5854      The test is done  here, rather than somewhere else, because the
5855      start address is only set just before the final link commences.
5856
5857      Note - if the user deliberately sets a start address of 0, the
5858      flag will not be set.  */
5859   if (bfd_get_start_address (output_bfd) != 0)
5860     elf_elfheader (output_bfd)->e_flags |= EF_ARM_HASENTRY;
5861
5862   dynobj = elf_hash_table (info)->dynobj;
5863   if (dynobj)
5864     {
5865       sgot = bfd_get_section_by_name (dynobj, ".got");
5866       splt = bfd_get_section_by_name (dynobj, ".plt");
5867     }
5868   symtab_hdr = & elf_symtab_hdr (input_bfd);
5869   sym_hashes = elf_sym_hashes (input_bfd);
5870   local_got_offsets = elf_local_got_offsets (input_bfd);
5871   r_symndx = ELF32_R_SYM (rel->r_info);
5872
5873   if (globals->use_rel)
5874     {
5875       addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
5876
5877       if (addend & ((howto->src_mask + 1) >> 1))
5878         {
5879           signed_addend = -1;
5880           signed_addend &= ~ howto->src_mask;
5881           signed_addend |= addend;
5882         }
5883       else
5884         signed_addend = addend;
5885     }
5886   else
5887     addend = signed_addend = rel->r_addend;
5888
5889   switch (r_type)
5890     {
5891     case R_ARM_NONE:
5892       /* We don't need to find a value for this symbol.  It's just a
5893          marker.  */
5894       *unresolved_reloc_p = FALSE;
5895       return bfd_reloc_ok;
5896
5897     case R_ARM_ABS12:
5898       if (!globals->vxworks_p)
5899         return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
5900
5901     case R_ARM_PC24:
5902     case R_ARM_ABS32:
5903     case R_ARM_ABS32_NOI:
5904     case R_ARM_REL32:
5905     case R_ARM_REL32_NOI:
5906     case R_ARM_CALL:
5907     case R_ARM_JUMP24:
5908     case R_ARM_XPC25:
5909     case R_ARM_PREL31:
5910     case R_ARM_PLT32:
5911       /* Handle relocations which should use the PLT entry.  ABS32/REL32
5912          will use the symbol's value, which may point to a PLT entry, but we
5913          don't need to handle that here.  If we created a PLT entry, all
5914          branches in this object should go to it.  */
5915       if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32
5916            && r_type != R_ARM_ABS32_NOI && r_type != R_ARM_REL32_NOI)
5917           && h != NULL
5918           && splt != NULL
5919           && h->plt.offset != (bfd_vma) -1)
5920         {
5921           /* If we've created a .plt section, and assigned a PLT entry to
5922              this function, it should not be known to bind locally.  If
5923              it were, we would have cleared the PLT entry.  */
5924           BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
5925
5926           value = (splt->output_section->vma
5927                    + splt->output_offset
5928                    + h->plt.offset);
5929           *unresolved_reloc_p = FALSE;
5930           return _bfd_final_link_relocate (howto, input_bfd, input_section,
5931                                            contents, rel->r_offset, value,
5932                                            rel->r_addend);
5933         }
5934
5935       /* When generating a shared object or relocatable executable, these
5936          relocations are copied into the output file to be resolved at
5937          run time.  */
5938       if ((info->shared || globals->root.is_relocatable_executable)
5939           && (input_section->flags & SEC_ALLOC)
5940           && !(elf32_arm_hash_table (info)->vxworks_p
5941                && strcmp (input_section->output_section->name,
5942                           ".tls_vars") == 0)
5943           && ((r_type != R_ARM_REL32 && r_type != R_ARM_REL32_NOI)
5944               || !SYMBOL_CALLS_LOCAL (info, h))
5945           && (h == NULL
5946               || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5947               || h->root.type != bfd_link_hash_undefweak)
5948           && r_type != R_ARM_PC24
5949           && r_type != R_ARM_CALL
5950           && r_type != R_ARM_JUMP24
5951           && r_type != R_ARM_PREL31
5952           && r_type != R_ARM_PLT32)
5953         {
5954           Elf_Internal_Rela outrel;
5955           bfd_byte *loc;
5956           bfd_boolean skip, relocate;
5957
5958           *unresolved_reloc_p = FALSE;
5959
5960           if (sreloc == NULL)
5961             {
5962               const char * name;
5963
5964               name = (bfd_elf_string_from_elf_section
5965                       (input_bfd,
5966                        elf_elfheader (input_bfd)->e_shstrndx,
5967                        elf_section_data (input_section)->rel_hdr.sh_name));
5968               if (name == NULL)
5969                 return bfd_reloc_notsupported;
5970
5971               BFD_ASSERT (reloc_section_p (globals, name, input_section));
5972
5973               sreloc = bfd_get_section_by_name (dynobj, name);
5974               BFD_ASSERT (sreloc != NULL);
5975             }
5976
5977           skip = FALSE;
5978           relocate = FALSE;
5979
5980           outrel.r_addend = addend;
5981           outrel.r_offset =
5982             _bfd_elf_section_offset (output_bfd, info, input_section,
5983                                      rel->r_offset);
5984           if (outrel.r_offset == (bfd_vma) -1)
5985             skip = TRUE;
5986           else if (outrel.r_offset == (bfd_vma) -2)
5987             skip = TRUE, relocate = TRUE;
5988           outrel.r_offset += (input_section->output_section->vma
5989                               + input_section->output_offset);
5990
5991           if (skip)
5992             memset (&outrel, 0, sizeof outrel);
5993           else if (h != NULL
5994                    && h->dynindx != -1
5995                    && (!info->shared
5996                        || !info->symbolic
5997                        || !h->def_regular))
5998             outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
5999           else
6000             {
6001               int symbol;
6002
6003               /* This symbol is local, or marked to become local.  */
6004               if (sym_flags == STT_ARM_TFUNC)
6005                 value |= 1;
6006               if (globals->symbian_p)
6007                 {
6008                   asection *osec;
6009
6010                   /* On Symbian OS, the data segment and text segement
6011                      can be relocated independently.  Therefore, we
6012                      must indicate the segment to which this
6013                      relocation is relative.  The BPABI allows us to
6014                      use any symbol in the right segment; we just use
6015                      the section symbol as it is convenient.  (We
6016                      cannot use the symbol given by "h" directly as it
6017                      will not appear in the dynamic symbol table.)
6018
6019                      Note that the dynamic linker ignores the section
6020                      symbol value, so we don't subtract osec->vma
6021                      from the emitted reloc addend.  */
6022                   if (sym_sec)
6023                     osec = sym_sec->output_section;
6024                   else
6025                     osec = input_section->output_section;
6026                   symbol = elf_section_data (osec)->dynindx;
6027                   if (symbol == 0)
6028                     {
6029                       struct elf_link_hash_table *htab = elf_hash_table (info);
6030
6031                       if ((osec->flags & SEC_READONLY) == 0
6032                           && htab->data_index_section != NULL)
6033                         osec = htab->data_index_section;
6034                       else
6035                         osec = htab->text_index_section;
6036                       symbol = elf_section_data (osec)->dynindx;
6037                     }
6038                   BFD_ASSERT (symbol != 0);
6039                 }
6040               else
6041                 /* On SVR4-ish systems, the dynamic loader cannot
6042                    relocate the text and data segments independently,
6043                    so the symbol does not matter.  */
6044                 symbol = 0;
6045               outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
6046               if (globals->use_rel)
6047                 relocate = TRUE;
6048               else
6049                 outrel.r_addend += value;
6050             }
6051
6052           loc = sreloc->contents;
6053           loc += sreloc->reloc_count++ * RELOC_SIZE (globals);
6054           SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
6055
6056           /* If this reloc is against an external symbol, we do not want to
6057              fiddle with the addend.  Otherwise, we need to include the symbol
6058              value so that it becomes an addend for the dynamic reloc.  */
6059           if (! relocate)
6060             return bfd_reloc_ok;
6061
6062           return _bfd_final_link_relocate (howto, input_bfd, input_section,
6063                                            contents, rel->r_offset, value,
6064                                            (bfd_vma) 0);
6065         }
6066       else switch (r_type)
6067         {
6068         case R_ARM_ABS12:
6069           return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
6070
6071         case R_ARM_XPC25:         /* Arm BLX instruction.  */
6072         case R_ARM_CALL:
6073         case R_ARM_JUMP24:
6074         case R_ARM_PC24:          /* Arm B/BL instruction.  */
6075         case R_ARM_PLT32:
6076           {
6077           bfd_vma from;
6078           bfd_signed_vma branch_offset;
6079           struct elf32_arm_stub_hash_entry *stub_entry = NULL;
6080
6081           from = (input_section->output_section->vma
6082                   + input_section->output_offset
6083                   + rel->r_offset);
6084           branch_offset = (bfd_signed_vma)(value - from);
6085
6086           if (r_type == R_ARM_XPC25)
6087             {
6088               /* Check for Arm calling Arm function.  */
6089               /* FIXME: Should we translate the instruction into a BL
6090                  instruction instead ?  */
6091               if (sym_flags != STT_ARM_TFUNC)
6092                 (*_bfd_error_handler)
6093                   (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
6094                    input_bfd,
6095                    h ? h->root.root.string : "(local)");
6096             }
6097           else if (r_type != R_ARM_CALL)
6098             {
6099               /* Check for Arm calling Thumb function.  */
6100               if (sym_flags == STT_ARM_TFUNC)
6101                 {
6102                   if (elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
6103                                                output_bfd, input_section,
6104                                                hit_data, sym_sec, rel->r_offset,
6105                                                signed_addend, value,
6106                                                error_message))
6107                     return bfd_reloc_ok;
6108                   else
6109                     return bfd_reloc_dangerous;
6110                 }
6111             }
6112
6113           /* Check if a stub has to be inserted because the
6114              destination is too far or we are changing mode.  */
6115           if (r_type == R_ARM_CALL)
6116             {
6117               if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
6118                   || branch_offset < ARM_MAX_BWD_BRANCH_OFFSET
6119                   || sym_flags == STT_ARM_TFUNC)
6120                 {
6121                   /* The target is out of reach, so redirect the
6122                      branch to the local stub for this function.  */
6123
6124                   stub_entry = elf32_arm_get_stub_entry (input_section,
6125                                                          sym_sec, h,
6126                                                          rel, globals);
6127                   if (stub_entry != NULL)
6128                     value = (stub_entry->stub_offset
6129                              + stub_entry->stub_sec->output_offset
6130                              + stub_entry->stub_sec->output_section->vma);
6131                 }
6132             }
6133
6134           /* The ARM ELF ABI says that this reloc is computed as: S - P + A
6135              where:
6136               S is the address of the symbol in the relocation.
6137               P is address of the instruction being relocated.
6138               A is the addend (extracted from the instruction) in bytes.
6139
6140              S is held in 'value'.
6141              P is the base address of the section containing the
6142                instruction plus the offset of the reloc into that
6143                section, ie:
6144                  (input_section->output_section->vma +
6145                   input_section->output_offset +
6146                   rel->r_offset).
6147              A is the addend, converted into bytes, ie:
6148                  (signed_addend * 4)
6149
6150              Note: None of these operations have knowledge of the pipeline
6151              size of the processor, thus it is up to the assembler to
6152              encode this information into the addend.  */
6153           value -= (input_section->output_section->vma
6154                     + input_section->output_offset);
6155           value -= rel->r_offset;
6156           if (globals->use_rel)
6157             value += (signed_addend << howto->size);
6158           else
6159             /* RELA addends do not have to be adjusted by howto->size.  */
6160             value += signed_addend;
6161
6162           signed_addend = value;
6163           signed_addend >>= howto->rightshift;
6164
6165           /* A branch to an undefined weak symbol is turned into a jump to
6166              the next instruction.  */
6167           if (h && h->root.type == bfd_link_hash_undefweak)
6168             {
6169               value = (bfd_get_32 (input_bfd, hit_data) & 0xf0000000)
6170                       | 0x0affffff;
6171             }
6172           else
6173             {
6174               /* Perform a signed range check.  */
6175               if (   signed_addend >   ((bfd_signed_vma)  (howto->dst_mask >> 1))
6176                   || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
6177                 return bfd_reloc_overflow;
6178
6179               addend = (value & 2);
6180
6181               value = (signed_addend & howto->dst_mask)
6182                 | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
6183
6184               /* Set the H bit in the BLX instruction.  */
6185               if (sym_flags == STT_ARM_TFUNC)
6186                 {
6187                   if (addend)
6188                     value |= (1 << 24);
6189                   else
6190                     value &= ~(bfd_vma)(1 << 24);
6191                 }
6192               if (r_type == R_ARM_CALL)
6193                 {
6194                   /* Select the correct instruction (BL or BLX).  */
6195                   /* Only if we are not handling a BL to a stub. In this
6196                      case, mode switching is performed by the stub.  */
6197                   if (sym_flags == STT_ARM_TFUNC && !stub_entry)
6198                     value |= (1 << 28);
6199                   else
6200                     {
6201                       value &= ~(bfd_vma)(1 << 28);
6202                       value |= (1 << 24);
6203                     }
6204                 }
6205             }
6206           }
6207           break;
6208
6209         case R_ARM_ABS32:
6210           value += addend;
6211           if (sym_flags == STT_ARM_TFUNC)
6212             value |= 1;
6213           break;
6214
6215         case R_ARM_ABS32_NOI:
6216           value += addend;
6217           break;
6218
6219         case R_ARM_REL32:
6220           value += addend;
6221           if (sym_flags == STT_ARM_TFUNC)
6222             value |= 1;
6223           value -= (input_section->output_section->vma
6224                     + input_section->output_offset + rel->r_offset);
6225           break;
6226
6227         case R_ARM_REL32_NOI:
6228           value += addend;
6229           value -= (input_section->output_section->vma
6230                     + input_section->output_offset + rel->r_offset);
6231           break;
6232
6233         case R_ARM_PREL31:
6234           value -= (input_section->output_section->vma
6235                     + input_section->output_offset + rel->r_offset);
6236           value += signed_addend;
6237           if (! h || h->root.type != bfd_link_hash_undefweak)
6238             {
6239               /* Check for overflow.  */
6240               if ((value ^ (value >> 1)) & (1 << 30))
6241                 return bfd_reloc_overflow;
6242             }
6243           value &= 0x7fffffff;
6244           value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
6245           if (sym_flags == STT_ARM_TFUNC)
6246             value |= 1;
6247           break;
6248         }
6249
6250       bfd_put_32 (input_bfd, value, hit_data);
6251       return bfd_reloc_ok;
6252
6253     case R_ARM_ABS8:
6254       value += addend;
6255       if ((long) value > 0x7f || (long) value < -0x80)
6256         return bfd_reloc_overflow;
6257
6258       bfd_put_8 (input_bfd, value, hit_data);
6259       return bfd_reloc_ok;
6260
6261     case R_ARM_ABS16:
6262       value += addend;
6263
6264       if ((long) value > 0x7fff || (long) value < -0x8000)
6265         return bfd_reloc_overflow;
6266
6267       bfd_put_16 (input_bfd, value, hit_data);
6268       return bfd_reloc_ok;
6269
6270     case R_ARM_THM_ABS5:
6271       /* Support ldr and str instructions for the thumb.  */
6272       if (globals->use_rel)
6273         {
6274           /* Need to refetch addend.  */
6275           addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
6276           /* ??? Need to determine shift amount from operand size.  */
6277           addend >>= howto->rightshift;
6278         }
6279       value += addend;
6280
6281       /* ??? Isn't value unsigned?  */
6282       if ((long) value > 0x1f || (long) value < -0x10)
6283         return bfd_reloc_overflow;
6284
6285       /* ??? Value needs to be properly shifted into place first.  */
6286       value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
6287       bfd_put_16 (input_bfd, value, hit_data);
6288       return bfd_reloc_ok;
6289
6290     case R_ARM_THM_ALU_PREL_11_0:
6291       /* Corresponds to: addw.w reg, pc, #offset (and similarly for subw).  */
6292       {
6293         bfd_vma insn;
6294         bfd_signed_vma relocation;
6295
6296         insn = (bfd_get_16 (input_bfd, hit_data) << 16)
6297              | bfd_get_16 (input_bfd, hit_data + 2);
6298
6299         if (globals->use_rel)
6300           {
6301             signed_addend = (insn & 0xff) | ((insn & 0x7000) >> 4)
6302                           | ((insn & (1 << 26)) >> 15);
6303             if (insn & 0xf00000)
6304               signed_addend = -signed_addend;
6305           }
6306
6307         relocation = value + signed_addend;
6308         relocation -= (input_section->output_section->vma
6309                        + input_section->output_offset
6310                        + rel->r_offset);
6311
6312         value = abs (relocation);
6313
6314         if (value >= 0x1000)
6315           return bfd_reloc_overflow;
6316
6317         insn = (insn & 0xfb0f8f00) | (value & 0xff)
6318              | ((value & 0x700) << 4)
6319              | ((value & 0x800) << 15);
6320         if (relocation < 0)
6321           insn |= 0xa00000;
6322
6323         bfd_put_16 (input_bfd, insn >> 16, hit_data);
6324         bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
6325
6326         return bfd_reloc_ok;
6327       }
6328
6329     case R_ARM_THM_PC12:
6330       /* Corresponds to: ldr.w reg, [pc, #offset].  */
6331       {
6332         bfd_vma insn;
6333         bfd_signed_vma relocation;
6334
6335         insn = (bfd_get_16 (input_bfd, hit_data) << 16)
6336              | bfd_get_16 (input_bfd, hit_data + 2);
6337
6338         if (globals->use_rel)
6339           {
6340             signed_addend = insn & 0xfff;
6341             if (!(insn & (1 << 23)))
6342               signed_addend = -signed_addend;
6343           }
6344
6345         relocation = value + signed_addend;
6346         relocation -= (input_section->output_section->vma
6347                        + input_section->output_offset
6348                        + rel->r_offset);
6349
6350         value = abs (relocation);
6351
6352         if (value >= 0x1000)
6353           return bfd_reloc_overflow;
6354
6355         insn = (insn & 0xff7ff000) | value;
6356         if (relocation >= 0)
6357           insn |= (1 << 23);
6358
6359         bfd_put_16 (input_bfd, insn >> 16, hit_data);
6360         bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
6361
6362         return bfd_reloc_ok;
6363       }
6364
6365     case R_ARM_THM_XPC22:
6366     case R_ARM_THM_CALL:
6367     case R_ARM_THM_JUMP24:
6368       /* Thumb BL (branch long instruction).  */
6369       {
6370         bfd_vma relocation;
6371         bfd_vma reloc_sign;
6372         bfd_boolean overflow = FALSE;
6373         bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
6374         bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
6375         bfd_signed_vma reloc_signed_max;
6376         bfd_signed_vma reloc_signed_min;
6377         bfd_vma check;
6378         bfd_signed_vma signed_check;
6379         int bitsize;
6380         int thumb2 = using_thumb2 (globals);
6381
6382         /* A branch to an undefined weak symbol is turned into a jump to
6383            the next instruction.  */
6384         if (h && h->root.type == bfd_link_hash_undefweak)
6385           {
6386             bfd_put_16 (input_bfd, 0xe000, hit_data);
6387             bfd_put_16 (input_bfd, 0xbf00, hit_data + 2);
6388             return bfd_reloc_ok;
6389           }
6390
6391         /* Fetch the addend.  We use the Thumb-2 encoding (backwards compatible
6392            with Thumb-1) involving the J1 and J2 bits.  */
6393         if (globals->use_rel)
6394           {
6395             bfd_vma s = (upper_insn & (1 << 10)) >> 10;
6396             bfd_vma upper = upper_insn & 0x3ff;
6397             bfd_vma lower = lower_insn & 0x7ff;
6398             bfd_vma j1 = (lower_insn & (1 << 13)) >> 13;
6399             bfd_vma j2 = (lower_insn & (1 << 11)) >> 11;
6400             bfd_vma i1 = j1 ^ s ? 0 : 1;
6401             bfd_vma i2 = j2 ^ s ? 0 : 1;
6402
6403             addend = (i1 << 23) | (i2 << 22) | (upper << 12) | (lower << 1);
6404             /* Sign extend.  */
6405             addend = (addend | ((s ? 0 : 1) << 24)) - (1 << 24);
6406
6407             signed_addend = addend;
6408           }
6409
6410         if (r_type == R_ARM_THM_XPC22)
6411           {
6412             /* Check for Thumb to Thumb call.  */
6413             /* FIXME: Should we translate the instruction into a BL
6414                instruction instead ?  */
6415             if (sym_flags == STT_ARM_TFUNC)
6416               (*_bfd_error_handler)
6417                 (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
6418                  input_bfd,
6419                  h ? h->root.root.string : "(local)");
6420           }
6421         else
6422           {
6423             /* If it is not a call to Thumb, assume call to Arm.
6424                If it is a call relative to a section name, then it is not a
6425                function call at all, but rather a long jump.  Calls through
6426                the PLT do not require stubs.  */
6427             if (sym_flags != STT_ARM_TFUNC && sym_flags != STT_SECTION
6428                 && (h == NULL || splt == NULL
6429                     || h->plt.offset == (bfd_vma) -1))
6430               {
6431                 if (globals->use_blx && r_type == R_ARM_THM_CALL)
6432                   {
6433                     /* Convert BL to BLX.  */
6434                     lower_insn = (lower_insn & ~0x1000) | 0x0800;
6435                   }
6436                 else if (r_type != R_ARM_THM_CALL)
6437                   {
6438                     if (elf32_thumb_to_arm_stub
6439                         (info, sym_name, input_bfd, output_bfd, input_section,
6440                          hit_data, sym_sec, rel->r_offset, signed_addend, value,
6441                          error_message))
6442                       return bfd_reloc_ok;
6443                     else
6444                       return bfd_reloc_dangerous;
6445                   }
6446               }
6447             else if (sym_flags == STT_ARM_TFUNC && globals->use_blx
6448                      && r_type == R_ARM_THM_CALL)
6449               {
6450                 /* Make sure this is a BL.  */
6451                 lower_insn |= 0x1800;
6452               }
6453           }
6454
6455         /* Handle calls via the PLT.  */
6456         if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
6457           {
6458             value = (splt->output_section->vma
6459                      + splt->output_offset
6460                      + h->plt.offset);
6461             if (globals->use_blx && r_type == R_ARM_THM_CALL)
6462               {
6463                 /* If the Thumb BLX instruction is available, convert the
6464                    BL to a BLX instruction to call the ARM-mode PLT entry.  */
6465                 lower_insn = (lower_insn & ~0x1000) | 0x0800;
6466               }
6467             else
6468               /* Target the Thumb stub before the ARM PLT entry.  */
6469               value -= PLT_THUMB_STUB_SIZE;
6470             *unresolved_reloc_p = FALSE;
6471           }
6472
6473         if (r_type == R_ARM_THM_CALL)
6474           {
6475             /* Check if a stub has to be inserted because the destination
6476                is too far.  */
6477             bfd_vma from;
6478             bfd_signed_vma branch_offset;
6479             struct elf32_arm_stub_hash_entry *stub_entry = NULL;
6480
6481             from = (input_section->output_section->vma
6482                     + input_section->output_offset
6483                     + rel->r_offset);
6484             branch_offset = (bfd_signed_vma)(value - from);
6485
6486             if ((!thumb2
6487                  && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
6488                      || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
6489                 ||
6490                 (thumb2
6491                  && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
6492                      || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
6493                 || ((sym_flags != STT_ARM_TFUNC) && !globals->use_blx))
6494               {
6495                 /* The target is out of reach or we are changing modes, so
6496                    redirect the branch to the local stub for this
6497                    function.  */
6498                 stub_entry = elf32_arm_get_stub_entry (input_section,
6499                                                        sym_sec, h,
6500                                                        rel, globals);
6501                 if (stub_entry != NULL)
6502                   value = (stub_entry->stub_offset
6503                            + stub_entry->stub_sec->output_offset
6504                            + stub_entry->stub_sec->output_section->vma);
6505
6506                 /* If this call becomes a call to Arm, force BLX.  */
6507                 if (globals->use_blx)
6508                   {
6509                     if ((stub_entry
6510                          && !arm_stub_is_thumb (stub_entry->stub_type))
6511                         || (sym_flags != STT_ARM_TFUNC))
6512                       lower_insn = (lower_insn & ~0x1000) | 0x0800;
6513                   }
6514               }
6515           }
6516
6517         relocation = value + signed_addend;
6518
6519         relocation -= (input_section->output_section->vma
6520                        + input_section->output_offset
6521                        + rel->r_offset);
6522
6523         check = relocation >> howto->rightshift;
6524
6525         /* If this is a signed value, the rightshift just dropped
6526            leading 1 bits (assuming twos complement).  */
6527         if ((bfd_signed_vma) relocation >= 0)
6528           signed_check = check;
6529         else
6530           signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
6531
6532         /* Calculate the permissable maximum and minimum values for
6533            this relocation according to whether we're relocating for
6534            Thumb-2 or not.  */
6535         bitsize = howto->bitsize;
6536         if (!thumb2)
6537           bitsize -= 2;
6538         reloc_signed_max = ((1 << (bitsize - 1)) - 1) >> howto->rightshift;
6539         reloc_signed_min = ~reloc_signed_max;
6540
6541         /* Assumes two's complement.  */
6542         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
6543           overflow = TRUE;
6544
6545         if ((lower_insn & 0x5000) == 0x4000)
6546           /* For a BLX instruction, make sure that the relocation is rounded up
6547              to a word boundary.  This follows the semantics of the instruction
6548              which specifies that bit 1 of the target address will come from bit
6549              1 of the base address.  */
6550           relocation = (relocation + 2) & ~ 3;
6551
6552         /* Put RELOCATION back into the insn.  Assumes two's complement.
6553            We use the Thumb-2 encoding, which is safe even if dealing with
6554            a Thumb-1 instruction by virtue of our overflow check above.  */
6555         reloc_sign = (signed_check < 0) ? 1 : 0;
6556         upper_insn = (upper_insn & ~(bfd_vma) 0x7ff)
6557                      | ((relocation >> 12) & 0x3ff)
6558                      | (reloc_sign << 10);
6559         lower_insn = (lower_insn & ~(bfd_vma) 0x2fff)
6560                      | (((!((relocation >> 23) & 1)) ^ reloc_sign) << 13)
6561                      | (((!((relocation >> 22) & 1)) ^ reloc_sign) << 11)
6562                      | ((relocation >> 1) & 0x7ff);
6563
6564         /* Put the relocated value back in the object file:  */
6565         bfd_put_16 (input_bfd, upper_insn, hit_data);
6566         bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
6567
6568         return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
6569       }
6570       break;
6571
6572     case R_ARM_THM_JUMP19:
6573       /* Thumb32 conditional branch instruction.  */
6574       {
6575         bfd_vma relocation;
6576         bfd_boolean overflow = FALSE;
6577         bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
6578         bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
6579         bfd_signed_vma reloc_signed_max = 0xffffe;
6580         bfd_signed_vma reloc_signed_min = -0x100000;
6581         bfd_signed_vma signed_check;
6582
6583         /* Need to refetch the addend, reconstruct the top three bits,
6584            and squish the two 11 bit pieces together.  */
6585         if (globals->use_rel)
6586           {
6587             bfd_vma S     = (upper_insn & 0x0400) >> 10;
6588             bfd_vma upper = (upper_insn & 0x003f);
6589             bfd_vma J1    = (lower_insn & 0x2000) >> 13;
6590             bfd_vma J2    = (lower_insn & 0x0800) >> 11;
6591             bfd_vma lower = (lower_insn & 0x07ff);
6592
6593             upper |= J1 << 6;
6594             upper |= J2 << 7;
6595             upper |= (!S) << 8;
6596             upper -= 0x0100; /* Sign extend.  */
6597
6598             addend = (upper << 12) | (lower << 1);
6599             signed_addend = addend;
6600           }
6601
6602         /* Handle calls via the PLT.  */
6603         if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
6604           {
6605             value = (splt->output_section->vma
6606                      + splt->output_offset
6607                      + h->plt.offset);
6608             /* Target the Thumb stub before the ARM PLT entry.  */
6609             value -= PLT_THUMB_STUB_SIZE;
6610             *unresolved_reloc_p = FALSE;
6611           }
6612
6613         /* ??? Should handle interworking?  GCC might someday try to
6614            use this for tail calls.  */
6615
6616         relocation = value + signed_addend;
6617         relocation -= (input_section->output_section->vma
6618                        + input_section->output_offset
6619                        + rel->r_offset);
6620         signed_check = (bfd_signed_vma) relocation;
6621
6622         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
6623           overflow = TRUE;
6624
6625         /* Put RELOCATION back into the insn.  */
6626         {
6627           bfd_vma S  = (relocation & 0x00100000) >> 20;
6628           bfd_vma J2 = (relocation & 0x00080000) >> 19;
6629           bfd_vma J1 = (relocation & 0x00040000) >> 18;
6630           bfd_vma hi = (relocation & 0x0003f000) >> 12;
6631           bfd_vma lo = (relocation & 0x00000ffe) >>  1;
6632
6633           upper_insn = (upper_insn & 0xfbc0) | (S << 10) | hi;
6634           lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
6635         }
6636
6637         /* Put the relocated value back in the object file:  */
6638         bfd_put_16 (input_bfd, upper_insn, hit_data);
6639         bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
6640
6641         return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
6642       }
6643
6644     case R_ARM_THM_JUMP11:
6645     case R_ARM_THM_JUMP8:
6646     case R_ARM_THM_JUMP6:
6647       /* Thumb B (branch) instruction).  */
6648       {
6649         bfd_signed_vma relocation;
6650         bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
6651         bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
6652         bfd_signed_vma signed_check;
6653
6654         /* CZB cannot jump backward.  */
6655         if (r_type == R_ARM_THM_JUMP6)
6656           reloc_signed_min = 0;
6657
6658         if (globals->use_rel)
6659           {
6660             /* Need to refetch addend.  */
6661             addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
6662             if (addend & ((howto->src_mask + 1) >> 1))
6663               {
6664                 signed_addend = -1;
6665                 signed_addend &= ~ howto->src_mask;
6666                 signed_addend |= addend;
6667               }
6668             else
6669               signed_addend = addend;
6670             /* The value in the insn has been right shifted.  We need to
6671                undo this, so that we can perform the address calculation
6672                in terms of bytes.  */
6673             signed_addend <<= howto->rightshift;
6674           }
6675         relocation = value + signed_addend;
6676
6677         relocation -= (input_section->output_section->vma
6678                        + input_section->output_offset
6679                        + rel->r_offset);
6680
6681         relocation >>= howto->rightshift;
6682         signed_check = relocation;
6683
6684         if (r_type == R_ARM_THM_JUMP6)
6685           relocation = ((relocation & 0x0020) << 4) | ((relocation & 0x001f) << 3);
6686         else
6687           relocation &= howto->dst_mask;
6688         relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
6689
6690         bfd_put_16 (input_bfd, relocation, hit_data);
6691
6692         /* Assumes two's complement.  */
6693         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
6694           return bfd_reloc_overflow;
6695
6696         return bfd_reloc_ok;
6697       }
6698
6699     case R_ARM_ALU_PCREL7_0:
6700     case R_ARM_ALU_PCREL15_8:
6701     case R_ARM_ALU_PCREL23_15:
6702       {
6703         bfd_vma insn;
6704         bfd_vma relocation;
6705
6706         insn = bfd_get_32 (input_bfd, hit_data);
6707         if (globals->use_rel)
6708           {
6709             /* Extract the addend.  */
6710             addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
6711             signed_addend = addend;
6712           }
6713         relocation = value + signed_addend;
6714
6715         relocation -= (input_section->output_section->vma
6716                        + input_section->output_offset
6717                        + rel->r_offset);
6718         insn = (insn & ~0xfff)
6719                | ((howto->bitpos << 7) & 0xf00)
6720                | ((relocation >> howto->bitpos) & 0xff);
6721         bfd_put_32 (input_bfd, value, hit_data);
6722       }
6723       return bfd_reloc_ok;
6724
6725     case R_ARM_GNU_VTINHERIT:
6726     case R_ARM_GNU_VTENTRY:
6727       return bfd_reloc_ok;
6728
6729     case R_ARM_GOTOFF32:
6730       /* Relocation is relative to the start of the
6731          global offset table.  */
6732
6733       BFD_ASSERT (sgot != NULL);
6734       if (sgot == NULL)
6735         return bfd_reloc_notsupported;
6736
6737       /* If we are addressing a Thumb function, we need to adjust the
6738          address by one, so that attempts to call the function pointer will
6739          correctly interpret it as Thumb code.  */
6740       if (sym_flags == STT_ARM_TFUNC)
6741         value += 1;
6742
6743       /* Note that sgot->output_offset is not involved in this
6744          calculation.  We always want the start of .got.  If we
6745          define _GLOBAL_OFFSET_TABLE in a different way, as is
6746          permitted by the ABI, we might have to change this
6747          calculation.  */
6748       value -= sgot->output_section->vma;
6749       return _bfd_final_link_relocate (howto, input_bfd, input_section,
6750                                        contents, rel->r_offset, value,
6751                                        rel->r_addend);
6752
6753     case R_ARM_GOTPC:
6754       /* Use global offset table as symbol value.  */
6755       BFD_ASSERT (sgot != NULL);
6756
6757       if (sgot == NULL)
6758         return bfd_reloc_notsupported;
6759
6760       *unresolved_reloc_p = FALSE;
6761       value = sgot->output_section->vma;
6762       return _bfd_final_link_relocate (howto, input_bfd, input_section,
6763                                        contents, rel->r_offset, value,
6764                                        rel->r_addend);
6765
6766     case R_ARM_GOT32:
6767     case R_ARM_GOT_PREL:
6768       /* Relocation is to the entry for this symbol in the
6769          global offset table.  */
6770       if (sgot == NULL)
6771         return bfd_reloc_notsupported;
6772
6773       if (h != NULL)
6774         {
6775           bfd_vma off;
6776           bfd_boolean dyn;
6777
6778           off = h->got.offset;
6779           BFD_ASSERT (off != (bfd_vma) -1);
6780           dyn = globals->root.dynamic_sections_created;
6781
6782           if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
6783               || (info->shared
6784                   && SYMBOL_REFERENCES_LOCAL (info, h))
6785               || (ELF_ST_VISIBILITY (h->other)
6786                   && h->root.type == bfd_link_hash_undefweak))
6787             {
6788               /* This is actually a static link, or it is a -Bsymbolic link
6789                  and the symbol is defined locally.  We must initialize this
6790                  entry in the global offset table.  Since the offset must
6791                  always be a multiple of 4, we use the least significant bit
6792                  to record whether we have initialized it already.
6793
6794                  When doing a dynamic link, we create a .rel(a).got relocation
6795                  entry to initialize the value.  This is done in the
6796                  finish_dynamic_symbol routine.  */
6797               if ((off & 1) != 0)
6798                 off &= ~1;
6799               else
6800                 {
6801                   /* If we are addressing a Thumb function, we need to
6802                      adjust the address by one, so that attempts to
6803                      call the function pointer will correctly
6804                      interpret it as Thumb code.  */
6805                   if (sym_flags == STT_ARM_TFUNC)
6806                     value |= 1;
6807
6808                   bfd_put_32 (output_bfd, value, sgot->contents + off);
6809                   h->got.offset |= 1;
6810                 }
6811             }
6812           else
6813             *unresolved_reloc_p = FALSE;
6814
6815           value = sgot->output_offset + off;
6816         }
6817       else
6818         {
6819           bfd_vma off;
6820
6821           BFD_ASSERT (local_got_offsets != NULL &&
6822                       local_got_offsets[r_symndx] != (bfd_vma) -1);
6823
6824           off = local_got_offsets[r_symndx];
6825
6826           /* The offset must always be a multiple of 4.  We use the
6827              least significant bit to record whether we have already
6828              generated the necessary reloc.  */
6829           if ((off & 1) != 0)
6830             off &= ~1;
6831           else
6832             {
6833               /* If we are addressing a Thumb function, we need to
6834                  adjust the address by one, so that attempts to
6835                  call the function pointer will correctly
6836                  interpret it as Thumb code.  */
6837               if (sym_flags == STT_ARM_TFUNC)
6838                 value |= 1;
6839
6840               if (globals->use_rel)
6841                 bfd_put_32 (output_bfd, value, sgot->contents + off);
6842
6843               if (info->shared)
6844                 {
6845                   asection * srelgot;
6846                   Elf_Internal_Rela outrel;
6847                   bfd_byte *loc;
6848
6849                   srelgot = (bfd_get_section_by_name
6850                              (dynobj, RELOC_SECTION (globals, ".got")));
6851                   BFD_ASSERT (srelgot != NULL);
6852
6853                   outrel.r_addend = addend + value;
6854                   outrel.r_offset = (sgot->output_section->vma
6855                                      + sgot->output_offset
6856                                      + off);
6857                   outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
6858                   loc = srelgot->contents;
6859                   loc += srelgot->reloc_count++ * RELOC_SIZE (globals);
6860                   SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
6861                 }
6862
6863               local_got_offsets[r_symndx] |= 1;
6864             }
6865
6866           value = sgot->output_offset + off;
6867         }
6868       if (r_type != R_ARM_GOT32)
6869         value += sgot->output_section->vma;
6870
6871       return _bfd_final_link_relocate (howto, input_bfd, input_section,
6872                                        contents, rel->r_offset, value,
6873                                        rel->r_addend);
6874
6875     case R_ARM_TLS_LDO32:
6876       value = value - dtpoff_base (info);
6877
6878       return _bfd_final_link_relocate (howto, input_bfd, input_section,
6879                                        contents, rel->r_offset, value,
6880                                        rel->r_addend);
6881
6882     case R_ARM_TLS_LDM32:
6883       {
6884         bfd_vma off;
6885
6886         if (globals->sgot == NULL)
6887           abort ();
6888
6889         off = globals->tls_ldm_got.offset;
6890
6891         if ((off & 1) != 0)
6892           off &= ~1;
6893         else
6894           {
6895             /* If we don't know the module number, create a relocation
6896                for it.  */
6897             if (info->shared)
6898               {
6899                 Elf_Internal_Rela outrel;
6900                 bfd_byte *loc;
6901
6902                 if (globals->srelgot == NULL)
6903                   abort ();
6904
6905                 outrel.r_addend = 0;
6906                 outrel.r_offset = (globals->sgot->output_section->vma
6907                                    + globals->sgot->output_offset + off);
6908                 outrel.r_info = ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32);
6909
6910                 if (globals->use_rel)
6911                   bfd_put_32 (output_bfd, outrel.r_addend,
6912                               globals->sgot->contents + off);
6913
6914                 loc = globals->srelgot->contents;
6915                 loc += globals->srelgot->reloc_count++ * RELOC_SIZE (globals);
6916                 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
6917               }
6918             else
6919               bfd_put_32 (output_bfd, 1, globals->sgot->contents + off);
6920
6921             globals->tls_ldm_got.offset |= 1;
6922           }
6923
6924         value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
6925           - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
6926
6927         return _bfd_final_link_relocate (howto, input_bfd, input_section,
6928                                          contents, rel->r_offset, value,
6929                                          rel->r_addend);
6930       }
6931
6932     case R_ARM_TLS_GD32:
6933     case R_ARM_TLS_IE32:
6934       {
6935         bfd_vma off;
6936         int indx;
6937         char tls_type;
6938
6939         if (globals->sgot == NULL)
6940           abort ();
6941
6942         indx = 0;
6943         if (h != NULL)
6944           {
6945             bfd_boolean dyn;
6946             dyn = globals->root.dynamic_sections_created;
6947             if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
6948                 && (!info->shared
6949                     || !SYMBOL_REFERENCES_LOCAL (info, h)))
6950               {
6951                 *unresolved_reloc_p = FALSE;
6952                 indx = h->dynindx;
6953               }
6954             off = h->got.offset;
6955             tls_type = ((struct elf32_arm_link_hash_entry *) h)->tls_type;
6956           }
6957         else
6958           {
6959             if (local_got_offsets == NULL)
6960               abort ();
6961             off = local_got_offsets[r_symndx];
6962             tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
6963           }
6964
6965         if (tls_type == GOT_UNKNOWN)
6966           abort ();
6967
6968         if ((off & 1) != 0)
6969           off &= ~1;
6970         else
6971           {
6972             bfd_boolean need_relocs = FALSE;
6973             Elf_Internal_Rela outrel;
6974             bfd_byte *loc = NULL;
6975             int cur_off = off;
6976
6977             /* The GOT entries have not been initialized yet.  Do it
6978                now, and emit any relocations.  If both an IE GOT and a
6979                GD GOT are necessary, we emit the GD first.  */
6980
6981             if ((info->shared || indx != 0)
6982                 && (h == NULL
6983                     || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6984                     || h->root.type != bfd_link_hash_undefweak))
6985               {
6986                 need_relocs = TRUE;
6987                 if (globals->srelgot == NULL)
6988                   abort ();
6989                 loc = globals->srelgot->contents;
6990                 loc += globals->srelgot->reloc_count * RELOC_SIZE (globals);
6991               }
6992
6993             if (tls_type & GOT_TLS_GD)
6994               {
6995                 if (need_relocs)
6996                   {
6997                     outrel.r_addend = 0;
6998                     outrel.r_offset = (globals->sgot->output_section->vma
6999                                        + globals->sgot->output_offset
7000                                        + cur_off);
7001                     outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DTPMOD32);
7002
7003                     if (globals->use_rel)
7004                       bfd_put_32 (output_bfd, outrel.r_addend,
7005                                   globals->sgot->contents + cur_off);
7006
7007                     SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
7008                     globals->srelgot->reloc_count++;
7009                     loc += RELOC_SIZE (globals);
7010
7011                     if (indx == 0)
7012                       bfd_put_32 (output_bfd, value - dtpoff_base (info),
7013                                   globals->sgot->contents + cur_off + 4);
7014                     else
7015                       {
7016                         outrel.r_addend = 0;
7017                         outrel.r_info = ELF32_R_INFO (indx,
7018                                                       R_ARM_TLS_DTPOFF32);
7019                         outrel.r_offset += 4;
7020
7021                         if (globals->use_rel)
7022                           bfd_put_32 (output_bfd, outrel.r_addend,
7023                                       globals->sgot->contents + cur_off + 4);
7024
7025
7026                         SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
7027                         globals->srelgot->reloc_count++;
7028                         loc += RELOC_SIZE (globals);
7029                       }
7030                   }
7031                 else
7032                   {
7033                     /* If we are not emitting relocations for a
7034                        general dynamic reference, then we must be in a
7035                        static link or an executable link with the
7036                        symbol binding locally.  Mark it as belonging
7037                        to module 1, the executable.  */
7038                     bfd_put_32 (output_bfd, 1,
7039                                 globals->sgot->contents + cur_off);
7040                     bfd_put_32 (output_bfd, value - dtpoff_base (info),
7041                                 globals->sgot->contents + cur_off + 4);
7042                   }
7043
7044                 cur_off += 8;
7045               }
7046
7047             if (tls_type & GOT_TLS_IE)
7048               {
7049                 if (need_relocs)
7050                   {
7051                     if (indx == 0)
7052                       outrel.r_addend = value - dtpoff_base (info);
7053                     else
7054                       outrel.r_addend = 0;
7055                     outrel.r_offset = (globals->sgot->output_section->vma
7056                                        + globals->sgot->output_offset
7057                                        + cur_off);
7058                     outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_TPOFF32);
7059
7060                     if (globals->use_rel)
7061                       bfd_put_32 (output_bfd, outrel.r_addend,
7062                                   globals->sgot->contents + cur_off);
7063
7064                     SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
7065                     globals->srelgot->reloc_count++;
7066                     loc += RELOC_SIZE (globals);
7067                   }
7068                 else
7069                   bfd_put_32 (output_bfd, tpoff (info, value),
7070                               globals->sgot->contents + cur_off);
7071                 cur_off += 4;
7072               }
7073
7074             if (h != NULL)
7075               h->got.offset |= 1;
7076             else
7077               local_got_offsets[r_symndx] |= 1;
7078           }
7079
7080         if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32)
7081           off += 8;
7082         value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
7083           - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
7084
7085         return _bfd_final_link_relocate (howto, input_bfd, input_section,
7086                                          contents, rel->r_offset, value,
7087                                          rel->r_addend);
7088       }
7089
7090     case R_ARM_TLS_LE32:
7091       if (info->shared)
7092         {
7093           (*_bfd_error_handler)
7094             (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
7095              input_bfd, input_section,
7096              (long) rel->r_offset, howto->name);
7097           return FALSE;
7098         }
7099       else
7100         value = tpoff (info, value);
7101
7102       return _bfd_final_link_relocate (howto, input_bfd, input_section,
7103                                        contents, rel->r_offset, value,
7104                                        rel->r_addend);
7105
7106     case R_ARM_V4BX:
7107       if (globals->fix_v4bx)
7108         {
7109           bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7110
7111           /* Ensure that we have a BX instruction.  */
7112           BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
7113
7114           if (globals->fix_v4bx == 2 && (insn & 0xf) != 0xf)
7115             {
7116               /* Branch to veneer.  */
7117               bfd_vma glue_addr;
7118               glue_addr = elf32_arm_bx_glue (info, insn & 0xf);
7119               glue_addr -= input_section->output_section->vma
7120                            + input_section->output_offset
7121                            + rel->r_offset + 8;
7122               insn = (insn & 0xf0000000) | 0x0a000000
7123                      | ((glue_addr >> 2) & 0x00ffffff);
7124             }
7125           else
7126             {
7127               /* Preserve Rm (lowest four bits) and the condition code
7128                  (highest four bits). Other bits encode MOV PC,Rm.  */
7129               insn = (insn & 0xf000000f) | 0x01a0f000;
7130             }
7131
7132           bfd_put_32 (input_bfd, insn, hit_data);
7133         }
7134       return bfd_reloc_ok;
7135
7136     case R_ARM_MOVW_ABS_NC:
7137     case R_ARM_MOVT_ABS:
7138     case R_ARM_MOVW_PREL_NC:
7139     case R_ARM_MOVT_PREL:
7140     /* Until we properly support segment-base-relative addressing then
7141        we assume the segment base to be zero, as for the group relocations.
7142        Thus R_ARM_MOVW_BREL_NC has the same semantics as R_ARM_MOVW_ABS_NC
7143        and R_ARM_MOVT_BREL has the same semantics as R_ARM_MOVT_ABS.  */
7144     case R_ARM_MOVW_BREL_NC:
7145     case R_ARM_MOVW_BREL:
7146     case R_ARM_MOVT_BREL:
7147       {
7148         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7149
7150         if (globals->use_rel)
7151           {
7152             addend = ((insn >> 4) & 0xf000) | (insn & 0xfff);
7153             signed_addend = (addend ^ 0x8000) - 0x8000;
7154           }
7155
7156         value += signed_addend;
7157
7158         if (r_type == R_ARM_MOVW_PREL_NC || r_type == R_ARM_MOVT_PREL)
7159           value -= (input_section->output_section->vma
7160                     + input_section->output_offset + rel->r_offset);
7161
7162         if (r_type == R_ARM_MOVW_BREL && value >= 0x10000)
7163           return bfd_reloc_overflow;
7164
7165         if (sym_flags == STT_ARM_TFUNC)
7166           value |= 1;
7167
7168         if (r_type == R_ARM_MOVT_ABS || r_type == R_ARM_MOVT_PREL
7169             || r_type == R_ARM_MOVT_BREL)
7170           value >>= 16;
7171
7172         insn &= 0xfff0f000;
7173         insn |= value & 0xfff;
7174         insn |= (value & 0xf000) << 4;
7175         bfd_put_32 (input_bfd, insn, hit_data);
7176       }
7177       return bfd_reloc_ok;
7178
7179     case R_ARM_THM_MOVW_ABS_NC:
7180     case R_ARM_THM_MOVT_ABS:
7181     case R_ARM_THM_MOVW_PREL_NC:
7182     case R_ARM_THM_MOVT_PREL:
7183     /* Until we properly support segment-base-relative addressing then
7184        we assume the segment base to be zero, as for the above relocations.
7185        Thus R_ARM_THM_MOVW_BREL_NC has the same semantics as
7186        R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_BREL has the same semantics
7187        as R_ARM_THM_MOVT_ABS.  */
7188     case R_ARM_THM_MOVW_BREL_NC:
7189     case R_ARM_THM_MOVW_BREL:
7190     case R_ARM_THM_MOVT_BREL:
7191       {
7192         bfd_vma insn;
7193
7194         insn = bfd_get_16 (input_bfd, hit_data) << 16;
7195         insn |= bfd_get_16 (input_bfd, hit_data + 2);
7196
7197         if (globals->use_rel)
7198           {
7199             addend = ((insn >> 4)  & 0xf000)
7200                    | ((insn >> 15) & 0x0800)
7201                    | ((insn >> 4)  & 0x0700)
7202                    | (insn         & 0x00ff);
7203             signed_addend = (addend ^ 0x8000) - 0x8000;
7204           }
7205
7206         value += signed_addend;
7207
7208         if (r_type == R_ARM_THM_MOVW_PREL_NC || r_type == R_ARM_THM_MOVT_PREL)
7209           value -= (input_section->output_section->vma
7210                     + input_section->output_offset + rel->r_offset);
7211
7212         if (r_type == R_ARM_THM_MOVW_BREL && value >= 0x10000)
7213           return bfd_reloc_overflow;
7214
7215         if (sym_flags == STT_ARM_TFUNC)
7216           value |= 1;
7217
7218         if (r_type == R_ARM_THM_MOVT_ABS || r_type == R_ARM_THM_MOVT_PREL
7219             || r_type == R_ARM_THM_MOVT_BREL)
7220           value >>= 16;
7221
7222         insn &= 0xfbf08f00;
7223         insn |= (value & 0xf000) << 4;
7224         insn |= (value & 0x0800) << 15;
7225         insn |= (value & 0x0700) << 4;
7226         insn |= (value & 0x00ff);
7227
7228         bfd_put_16 (input_bfd, insn >> 16, hit_data);
7229         bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
7230       }
7231       return bfd_reloc_ok;
7232
7233     case R_ARM_ALU_PC_G0_NC:
7234     case R_ARM_ALU_PC_G1_NC:
7235     case R_ARM_ALU_PC_G0:
7236     case R_ARM_ALU_PC_G1:
7237     case R_ARM_ALU_PC_G2:
7238     case R_ARM_ALU_SB_G0_NC:
7239     case R_ARM_ALU_SB_G1_NC:
7240     case R_ARM_ALU_SB_G0:
7241     case R_ARM_ALU_SB_G1:
7242     case R_ARM_ALU_SB_G2:
7243       {
7244         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7245         bfd_vma pc = input_section->output_section->vma
7246                      + input_section->output_offset + rel->r_offset;
7247         /* sb should be the origin of the *segment* containing the symbol.
7248            It is not clear how to obtain this OS-dependent value, so we
7249            make an arbitrary choice of zero.  */
7250         bfd_vma sb = 0;
7251         bfd_vma residual;
7252         bfd_vma g_n;
7253         bfd_signed_vma signed_value;
7254         int group = 0;
7255
7256         /* Determine which group of bits to select.  */
7257         switch (r_type)
7258           {
7259           case R_ARM_ALU_PC_G0_NC:
7260           case R_ARM_ALU_PC_G0:
7261           case R_ARM_ALU_SB_G0_NC:
7262           case R_ARM_ALU_SB_G0:
7263             group = 0;
7264             break;
7265
7266           case R_ARM_ALU_PC_G1_NC:
7267           case R_ARM_ALU_PC_G1:
7268           case R_ARM_ALU_SB_G1_NC:
7269           case R_ARM_ALU_SB_G1:
7270             group = 1;
7271             break;
7272
7273           case R_ARM_ALU_PC_G2:
7274           case R_ARM_ALU_SB_G2:
7275             group = 2;
7276             break;
7277
7278           default:
7279             abort ();
7280           }
7281
7282         /* If REL, extract the addend from the insn.  If RELA, it will
7283            have already been fetched for us.  */
7284         if (globals->use_rel)
7285           {
7286             int negative;
7287             bfd_vma constant = insn & 0xff;
7288             bfd_vma rotation = (insn & 0xf00) >> 8;
7289
7290             if (rotation == 0)
7291               signed_addend = constant;
7292             else
7293               {
7294                 /* Compensate for the fact that in the instruction, the
7295                    rotation is stored in multiples of 2 bits.  */
7296                 rotation *= 2;
7297
7298                 /* Rotate "constant" right by "rotation" bits.  */
7299                 signed_addend = (constant >> rotation) |
7300                                 (constant << (8 * sizeof (bfd_vma) - rotation));
7301               }
7302
7303             /* Determine if the instruction is an ADD or a SUB.
7304                (For REL, this determines the sign of the addend.)  */
7305             negative = identify_add_or_sub (insn);
7306             if (negative == 0)
7307               {
7308                 (*_bfd_error_handler)
7309                   (_("%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group relocations"),
7310                   input_bfd, input_section,
7311                   (long) rel->r_offset, howto->name);
7312                 return bfd_reloc_overflow;
7313               }
7314
7315             signed_addend *= negative;
7316           }
7317
7318         /* Compute the value (X) to go in the place.  */
7319         if (r_type == R_ARM_ALU_PC_G0_NC
7320             || r_type == R_ARM_ALU_PC_G1_NC
7321             || r_type == R_ARM_ALU_PC_G0
7322             || r_type == R_ARM_ALU_PC_G1
7323             || r_type == R_ARM_ALU_PC_G2)
7324           /* PC relative.  */
7325           signed_value = value - pc + signed_addend;
7326         else
7327           /* Section base relative.  */
7328           signed_value = value - sb + signed_addend;
7329
7330         /* If the target symbol is a Thumb function, then set the
7331            Thumb bit in the address.  */
7332         if (sym_flags == STT_ARM_TFUNC)
7333           signed_value |= 1;
7334
7335         /* Calculate the value of the relevant G_n, in encoded
7336            constant-with-rotation format.  */
7337         g_n = calculate_group_reloc_mask (abs (signed_value), group,
7338                                           &residual);
7339
7340         /* Check for overflow if required.  */
7341         if ((r_type == R_ARM_ALU_PC_G0
7342              || r_type == R_ARM_ALU_PC_G1
7343              || r_type == R_ARM_ALU_PC_G2
7344              || r_type == R_ARM_ALU_SB_G0
7345              || r_type == R_ARM_ALU_SB_G1
7346              || r_type == R_ARM_ALU_SB_G2) && residual != 0)
7347           {
7348             (*_bfd_error_handler)
7349               (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7350               input_bfd, input_section,
7351               (long) rel->r_offset, abs (signed_value), howto->name);
7352             return bfd_reloc_overflow;
7353           }
7354
7355         /* Mask out the value and the ADD/SUB part of the opcode; take care
7356            not to destroy the S bit.  */
7357         insn &= 0xff1ff000;
7358
7359         /* Set the opcode according to whether the value to go in the
7360            place is negative.  */
7361         if (signed_value < 0)
7362           insn |= 1 << 22;
7363         else
7364           insn |= 1 << 23;
7365
7366         /* Encode the offset.  */
7367         insn |= g_n;
7368
7369         bfd_put_32 (input_bfd, insn, hit_data);
7370       }
7371       return bfd_reloc_ok;
7372
7373     case R_ARM_LDR_PC_G0:
7374     case R_ARM_LDR_PC_G1:
7375     case R_ARM_LDR_PC_G2:
7376     case R_ARM_LDR_SB_G0:
7377     case R_ARM_LDR_SB_G1:
7378     case R_ARM_LDR_SB_G2:
7379       {
7380         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7381         bfd_vma pc = input_section->output_section->vma
7382                      + input_section->output_offset + rel->r_offset;
7383         bfd_vma sb = 0; /* See note above.  */
7384         bfd_vma residual;
7385         bfd_signed_vma signed_value;
7386         int group = 0;
7387
7388         /* Determine which groups of bits to calculate.  */
7389         switch (r_type)
7390           {
7391           case R_ARM_LDR_PC_G0:
7392           case R_ARM_LDR_SB_G0:
7393             group = 0;
7394             break;
7395
7396           case R_ARM_LDR_PC_G1:
7397           case R_ARM_LDR_SB_G1:
7398             group = 1;
7399             break;
7400
7401           case R_ARM_LDR_PC_G2:
7402           case R_ARM_LDR_SB_G2:
7403             group = 2;
7404             break;
7405
7406           default:
7407             abort ();
7408           }
7409
7410         /* If REL, extract the addend from the insn.  If RELA, it will
7411            have already been fetched for us.  */
7412         if (globals->use_rel)
7413           {
7414             int negative = (insn & (1 << 23)) ? 1 : -1;
7415             signed_addend = negative * (insn & 0xfff);
7416           }
7417
7418         /* Compute the value (X) to go in the place.  */
7419         if (r_type == R_ARM_LDR_PC_G0
7420             || r_type == R_ARM_LDR_PC_G1
7421             || r_type == R_ARM_LDR_PC_G2)
7422           /* PC relative.  */
7423           signed_value = value - pc + signed_addend;
7424         else
7425           /* Section base relative.  */
7426           signed_value = value - sb + signed_addend;
7427
7428         /* Calculate the value of the relevant G_{n-1} to obtain
7429            the residual at that stage.  */
7430         calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
7431
7432         /* Check for overflow.  */
7433         if (residual >= 0x1000)
7434           {
7435             (*_bfd_error_handler)
7436               (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7437               input_bfd, input_section,
7438               (long) rel->r_offset, abs (signed_value), howto->name);
7439             return bfd_reloc_overflow;
7440           }
7441
7442         /* Mask out the value and U bit.  */
7443         insn &= 0xff7ff000;
7444
7445         /* Set the U bit if the value to go in the place is non-negative.  */
7446         if (signed_value >= 0)
7447           insn |= 1 << 23;
7448
7449         /* Encode the offset.  */
7450         insn |= residual;
7451
7452         bfd_put_32 (input_bfd, insn, hit_data);
7453       }
7454       return bfd_reloc_ok;
7455
7456     case R_ARM_LDRS_PC_G0:
7457     case R_ARM_LDRS_PC_G1:
7458     case R_ARM_LDRS_PC_G2:
7459     case R_ARM_LDRS_SB_G0:
7460     case R_ARM_LDRS_SB_G1:
7461     case R_ARM_LDRS_SB_G2:
7462       {
7463         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7464         bfd_vma pc = input_section->output_section->vma
7465                      + input_section->output_offset + rel->r_offset;
7466         bfd_vma sb = 0; /* See note above.  */
7467         bfd_vma residual;
7468         bfd_signed_vma signed_value;
7469         int group = 0;
7470
7471         /* Determine which groups of bits to calculate.  */
7472         switch (r_type)
7473           {
7474           case R_ARM_LDRS_PC_G0:
7475           case R_ARM_LDRS_SB_G0:
7476             group = 0;
7477             break;
7478
7479           case R_ARM_LDRS_PC_G1:
7480           case R_ARM_LDRS_SB_G1:
7481             group = 1;
7482             break;
7483
7484           case R_ARM_LDRS_PC_G2:
7485           case R_ARM_LDRS_SB_G2:
7486             group = 2;
7487             break;
7488
7489           default:
7490             abort ();
7491           }
7492
7493         /* If REL, extract the addend from the insn.  If RELA, it will
7494            have already been fetched for us.  */
7495         if (globals->use_rel)
7496           {
7497             int negative = (insn & (1 << 23)) ? 1 : -1;
7498             signed_addend = negative * (((insn & 0xf00) >> 4) + (insn & 0xf));
7499           }
7500
7501         /* Compute the value (X) to go in the place.  */
7502         if (r_type == R_ARM_LDRS_PC_G0
7503             || r_type == R_ARM_LDRS_PC_G1
7504             || r_type == R_ARM_LDRS_PC_G2)
7505           /* PC relative.  */
7506           signed_value = value - pc + signed_addend;
7507         else
7508           /* Section base relative.  */
7509           signed_value = value - sb + signed_addend;
7510
7511         /* Calculate the value of the relevant G_{n-1} to obtain
7512            the residual at that stage.  */
7513         calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
7514
7515         /* Check for overflow.  */
7516         if (residual >= 0x100)
7517           {
7518             (*_bfd_error_handler)
7519               (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7520               input_bfd, input_section,
7521               (long) rel->r_offset, abs (signed_value), howto->name);
7522             return bfd_reloc_overflow;
7523           }
7524
7525         /* Mask out the value and U bit.  */
7526         insn &= 0xff7ff0f0;
7527
7528         /* Set the U bit if the value to go in the place is non-negative.  */
7529         if (signed_value >= 0)
7530           insn |= 1 << 23;
7531
7532         /* Encode the offset.  */
7533         insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
7534
7535         bfd_put_32 (input_bfd, insn, hit_data);
7536       }
7537       return bfd_reloc_ok;
7538
7539     case R_ARM_LDC_PC_G0:
7540     case R_ARM_LDC_PC_G1:
7541     case R_ARM_LDC_PC_G2:
7542     case R_ARM_LDC_SB_G0:
7543     case R_ARM_LDC_SB_G1:
7544     case R_ARM_LDC_SB_G2:
7545       {
7546         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7547         bfd_vma pc = input_section->output_section->vma
7548                      + input_section->output_offset + rel->r_offset;
7549         bfd_vma sb = 0; /* See note above.  */
7550         bfd_vma residual;
7551         bfd_signed_vma signed_value;
7552         int group = 0;
7553
7554         /* Determine which groups of bits to calculate.  */
7555         switch (r_type)
7556           {
7557           case R_ARM_LDC_PC_G0:
7558           case R_ARM_LDC_SB_G0:
7559             group = 0;
7560             break;
7561
7562           case R_ARM_LDC_PC_G1:
7563           case R_ARM_LDC_SB_G1:
7564             group = 1;
7565             break;
7566
7567           case R_ARM_LDC_PC_G2:
7568           case R_ARM_LDC_SB_G2:
7569             group = 2;
7570             break;
7571
7572           default:
7573             abort ();
7574           }
7575
7576         /* If REL, extract the addend from the insn.  If RELA, it will
7577            have already been fetched for us.  */
7578         if (globals->use_rel)
7579           {
7580             int negative = (insn & (1 << 23)) ? 1 : -1;
7581             signed_addend = negative * ((insn & 0xff) << 2);
7582           }
7583
7584         /* Compute the value (X) to go in the place.  */
7585         if (r_type == R_ARM_LDC_PC_G0
7586             || r_type == R_ARM_LDC_PC_G1
7587             || r_type == R_ARM_LDC_PC_G2)
7588           /* PC relative.  */
7589           signed_value = value - pc + signed_addend;
7590         else
7591           /* Section base relative.  */
7592           signed_value = value - sb + signed_addend;
7593
7594         /* Calculate the value of the relevant G_{n-1} to obtain
7595            the residual at that stage.  */
7596         calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
7597
7598         /* Check for overflow.  (The absolute value to go in the place must be
7599            divisible by four and, after having been divided by four, must
7600            fit in eight bits.)  */
7601         if ((residual & 0x3) != 0 || residual >= 0x400)
7602           {
7603             (*_bfd_error_handler)
7604               (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7605               input_bfd, input_section,
7606               (long) rel->r_offset, abs (signed_value), howto->name);
7607             return bfd_reloc_overflow;
7608           }
7609
7610         /* Mask out the value and U bit.  */
7611         insn &= 0xff7fff00;
7612
7613         /* Set the U bit if the value to go in the place is non-negative.  */
7614         if (signed_value >= 0)
7615           insn |= 1 << 23;
7616
7617         /* Encode the offset.  */
7618         insn |= residual >> 2;
7619
7620         bfd_put_32 (input_bfd, insn, hit_data);
7621       }
7622       return bfd_reloc_ok;
7623
7624     default:
7625       return bfd_reloc_notsupported;
7626     }
7627 }
7628
7629 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS.  */
7630 static void
7631 arm_add_to_rel (bfd *              abfd,
7632                 bfd_byte *         address,
7633                 reloc_howto_type * howto,
7634                 bfd_signed_vma     increment)
7635 {
7636   bfd_signed_vma addend;
7637
7638   if (howto->type == R_ARM_THM_CALL
7639       || howto->type == R_ARM_THM_JUMP24)
7640     {
7641       int upper_insn, lower_insn;
7642       int upper, lower;
7643
7644       upper_insn = bfd_get_16 (abfd, address);
7645       lower_insn = bfd_get_16 (abfd, address + 2);
7646       upper = upper_insn & 0x7ff;
7647       lower = lower_insn & 0x7ff;
7648
7649       addend = (upper << 12) | (lower << 1);
7650       addend += increment;
7651       addend >>= 1;
7652
7653       upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
7654       lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
7655
7656       bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
7657       bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
7658     }
7659   else
7660     {
7661       bfd_vma        contents;
7662
7663       contents = bfd_get_32 (abfd, address);
7664
7665       /* Get the (signed) value from the instruction.  */
7666       addend = contents & howto->src_mask;
7667       if (addend & ((howto->src_mask + 1) >> 1))
7668         {
7669           bfd_signed_vma mask;
7670
7671           mask = -1;
7672           mask &= ~ howto->src_mask;
7673           addend |= mask;
7674         }
7675
7676       /* Add in the increment, (which is a byte value).  */
7677       switch (howto->type)
7678         {
7679         default:
7680           addend += increment;
7681           break;
7682
7683         case R_ARM_PC24:
7684         case R_ARM_PLT32:
7685         case R_ARM_CALL:
7686         case R_ARM_JUMP24:
7687           addend <<= howto->size;
7688           addend += increment;
7689
7690           /* Should we check for overflow here ?  */
7691
7692           /* Drop any undesired bits.  */
7693           addend >>= howto->rightshift;
7694           break;
7695         }
7696
7697       contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
7698
7699       bfd_put_32 (abfd, contents, address);
7700     }
7701 }
7702
7703 #define IS_ARM_TLS_RELOC(R_TYPE)        \
7704   ((R_TYPE) == R_ARM_TLS_GD32           \
7705    || (R_TYPE) == R_ARM_TLS_LDO32       \
7706    || (R_TYPE) == R_ARM_TLS_LDM32       \
7707    || (R_TYPE) == R_ARM_TLS_DTPOFF32    \
7708    || (R_TYPE) == R_ARM_TLS_DTPMOD32    \
7709    || (R_TYPE) == R_ARM_TLS_TPOFF32     \
7710    || (R_TYPE) == R_ARM_TLS_LE32        \
7711    || (R_TYPE) == R_ARM_TLS_IE32)
7712
7713 /* Relocate an ARM ELF section.  */
7714
7715 static bfd_boolean
7716 elf32_arm_relocate_section (bfd *                  output_bfd,
7717                             struct bfd_link_info * info,
7718                             bfd *                  input_bfd,
7719                             asection *             input_section,
7720                             bfd_byte *             contents,
7721                             Elf_Internal_Rela *    relocs,
7722                             Elf_Internal_Sym *     local_syms,
7723                             asection **            local_sections)
7724 {
7725   Elf_Internal_Shdr *symtab_hdr;
7726   struct elf_link_hash_entry **sym_hashes;
7727   Elf_Internal_Rela *rel;
7728   Elf_Internal_Rela *relend;
7729   const char *name;
7730   struct elf32_arm_link_hash_table * globals;
7731
7732   globals = elf32_arm_hash_table (info);
7733
7734   symtab_hdr = & elf_symtab_hdr (input_bfd);
7735   sym_hashes = elf_sym_hashes (input_bfd);
7736
7737   rel = relocs;
7738   relend = relocs + input_section->reloc_count;
7739   for (; rel < relend; rel++)
7740     {
7741       int                          r_type;
7742       reloc_howto_type *           howto;
7743       unsigned long                r_symndx;
7744       Elf_Internal_Sym *           sym;
7745       asection *                   sec;
7746       struct elf_link_hash_entry * h;
7747       bfd_vma                      relocation;
7748       bfd_reloc_status_type        r;
7749       arelent                      bfd_reloc;
7750       char                         sym_type;
7751       bfd_boolean                  unresolved_reloc = FALSE;
7752       char *error_message = NULL;
7753
7754       r_symndx = ELF32_R_SYM (rel->r_info);
7755       r_type   = ELF32_R_TYPE (rel->r_info);
7756       r_type   = arm_real_reloc_type (globals, r_type);
7757
7758       if (   r_type == R_ARM_GNU_VTENTRY
7759           || r_type == R_ARM_GNU_VTINHERIT)
7760         continue;
7761
7762       bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
7763       howto = bfd_reloc.howto;
7764
7765       h = NULL;
7766       sym = NULL;
7767       sec = NULL;
7768
7769       if (r_symndx < symtab_hdr->sh_info)
7770         {
7771           sym = local_syms + r_symndx;
7772           sym_type = ELF32_ST_TYPE (sym->st_info);
7773           sec = local_sections[r_symndx];
7774           if (globals->use_rel)
7775             {
7776               relocation = (sec->output_section->vma
7777                             + sec->output_offset
7778                             + sym->st_value);
7779               if (!info->relocatable
7780                   && (sec->flags & SEC_MERGE)
7781                   && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7782                 {
7783                   asection *msec;
7784                   bfd_vma addend, value;
7785
7786                   switch (r_type)
7787                     {
7788                     case R_ARM_MOVW_ABS_NC:
7789                     case R_ARM_MOVT_ABS:
7790                       value = bfd_get_32 (input_bfd, contents + rel->r_offset);
7791                       addend = ((value & 0xf0000) >> 4) | (value & 0xfff);
7792                       addend = (addend ^ 0x8000) - 0x8000;
7793                       break;
7794
7795                     case R_ARM_THM_MOVW_ABS_NC:
7796                     case R_ARM_THM_MOVT_ABS:
7797                       value = bfd_get_16 (input_bfd, contents + rel->r_offset)
7798                               << 16;
7799                       value |= bfd_get_16 (input_bfd,
7800                                            contents + rel->r_offset + 2);
7801                       addend = ((value & 0xf7000) >> 4) | (value & 0xff)
7802                                | ((value & 0x04000000) >> 15);
7803                       addend = (addend ^ 0x8000) - 0x8000;
7804                       break;
7805
7806                     default:
7807                       if (howto->rightshift
7808                           || (howto->src_mask & (howto->src_mask + 1)))
7809                         {
7810                           (*_bfd_error_handler)
7811                             (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
7812                              input_bfd, input_section,
7813                              (long) rel->r_offset, howto->name);
7814                           return FALSE;
7815                         }
7816
7817                       value = bfd_get_32 (input_bfd, contents + rel->r_offset);
7818
7819                       /* Get the (signed) value from the instruction.  */
7820                       addend = value & howto->src_mask;
7821                       if (addend & ((howto->src_mask + 1) >> 1))
7822                         {
7823                           bfd_signed_vma mask;
7824
7825                           mask = -1;
7826                           mask &= ~ howto->src_mask;
7827                           addend |= mask;
7828                         }
7829                       break;
7830                     }
7831
7832                   msec = sec;
7833                   addend =
7834                     _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
7835                     - relocation;
7836                   addend += msec->output_section->vma + msec->output_offset;
7837
7838                   /* Cases here must match those in the preceeding
7839                      switch statement.  */
7840                   switch (r_type)
7841                     {
7842                     case R_ARM_MOVW_ABS_NC:
7843                     case R_ARM_MOVT_ABS:
7844                       value = (value & 0xfff0f000) | ((addend & 0xf000) << 4)
7845                               | (addend & 0xfff);
7846                       bfd_put_32 (input_bfd, value, contents + rel->r_offset);
7847                       break;
7848
7849                     case R_ARM_THM_MOVW_ABS_NC:
7850                     case R_ARM_THM_MOVT_ABS:
7851                       value = (value & 0xfbf08f00) | ((addend & 0xf700) << 4)
7852                               | (addend & 0xff) | ((addend & 0x0800) << 15);
7853                       bfd_put_16 (input_bfd, value >> 16,
7854                                   contents + rel->r_offset);
7855                       bfd_put_16 (input_bfd, value,
7856                                   contents + rel->r_offset + 2);
7857                       break;
7858
7859                     default:
7860                       value = (value & ~ howto->dst_mask)
7861                               | (addend & howto->dst_mask);
7862                       bfd_put_32 (input_bfd, value, contents + rel->r_offset);
7863                       break;
7864                     }
7865                 }
7866             }
7867           else
7868             relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
7869         }
7870       else
7871         {
7872           bfd_boolean warned;
7873
7874           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
7875                                    r_symndx, symtab_hdr, sym_hashes,
7876                                    h, sec, relocation,
7877                                    unresolved_reloc, warned);
7878
7879           sym_type = h->type;
7880         }
7881
7882       if (sec != NULL && elf_discarded_section (sec))
7883         {
7884           /* For relocs against symbols from removed linkonce sections,
7885              or sections discarded by a linker script, we just want the
7886              section contents zeroed.  Avoid any special processing.  */
7887           _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
7888           rel->r_info = 0;
7889           rel->r_addend = 0;
7890           continue;
7891         }
7892
7893       if (info->relocatable)
7894         {
7895           /* This is a relocatable link.  We don't have to change
7896              anything, unless the reloc is against a section symbol,
7897              in which case we have to adjust according to where the
7898              section symbol winds up in the output section.  */
7899           if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7900             {
7901               if (globals->use_rel)
7902                 arm_add_to_rel (input_bfd, contents + rel->r_offset,
7903                                 howto, (bfd_signed_vma) sec->output_offset);
7904               else
7905                 rel->r_addend += sec->output_offset;
7906             }
7907           continue;
7908         }
7909
7910       if (h != NULL)
7911         name = h->root.root.string;
7912       else
7913         {
7914           name = (bfd_elf_string_from_elf_section
7915                   (input_bfd, symtab_hdr->sh_link, sym->st_name));
7916           if (name == NULL || *name == '\0')
7917             name = bfd_section_name (input_bfd, sec);
7918         }
7919
7920       if (r_symndx != 0
7921           && r_type != R_ARM_NONE
7922           && (h == NULL
7923               || h->root.type == bfd_link_hash_defined
7924               || h->root.type == bfd_link_hash_defweak)
7925           && IS_ARM_TLS_RELOC (r_type) != (sym_type == STT_TLS))
7926         {
7927           (*_bfd_error_handler)
7928             ((sym_type == STT_TLS
7929               ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
7930               : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
7931              input_bfd,
7932              input_section,
7933              (long) rel->r_offset,
7934              howto->name,
7935              name);
7936         }
7937
7938       r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
7939                                          input_section, contents, rel,
7940                                          relocation, info, sec, name,
7941                                          (h ? ELF_ST_TYPE (h->type) :
7942                                           ELF_ST_TYPE (sym->st_info)), h,
7943                                          &unresolved_reloc, &error_message);
7944
7945       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
7946          because such sections are not SEC_ALLOC and thus ld.so will
7947          not process them.  */
7948       if (unresolved_reloc
7949           && !((input_section->flags & SEC_DEBUGGING) != 0
7950                && h->def_dynamic))
7951         {
7952           (*_bfd_error_handler)
7953             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
7954              input_bfd,
7955              input_section,
7956              (long) rel->r_offset,
7957              howto->name,
7958              h->root.root.string);
7959           return FALSE;
7960         }
7961
7962       if (r != bfd_reloc_ok)
7963         {
7964           switch (r)
7965             {
7966             case bfd_reloc_overflow:
7967               /* If the overflowing reloc was to an undefined symbol,
7968                  we have already printed one error message and there
7969                  is no point complaining again.  */
7970               if ((! h ||
7971                    h->root.type != bfd_link_hash_undefined)
7972                   && (!((*info->callbacks->reloc_overflow)
7973                         (info, (h ? &h->root : NULL), name, howto->name,
7974                          (bfd_vma) 0, input_bfd, input_section,
7975                          rel->r_offset))))
7976                   return FALSE;
7977               break;
7978
7979             case bfd_reloc_undefined:
7980               if (!((*info->callbacks->undefined_symbol)
7981                     (info, name, input_bfd, input_section,
7982                      rel->r_offset, TRUE)))
7983                 return FALSE;
7984               break;
7985
7986             case bfd_reloc_outofrange:
7987               error_message = _("out of range");
7988               goto common_error;
7989
7990             case bfd_reloc_notsupported:
7991               error_message = _("unsupported relocation");
7992               goto common_error;
7993
7994             case bfd_reloc_dangerous:
7995               /* error_message should already be set.  */
7996               goto common_error;
7997
7998             default:
7999               error_message = _("unknown error");
8000               /* Fall through.  */
8001
8002             common_error:
8003               BFD_ASSERT (error_message != NULL);
8004               if (!((*info->callbacks->reloc_dangerous)
8005                     (info, error_message, input_bfd, input_section,
8006                      rel->r_offset)))
8007                 return FALSE;
8008               break;
8009             }
8010         }
8011     }
8012
8013   return TRUE;
8014 }
8015
8016 /* Set the right machine number.  */
8017
8018 static bfd_boolean
8019 elf32_arm_object_p (bfd *abfd)
8020 {
8021   unsigned int mach;
8022
8023   mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
8024
8025   if (mach != bfd_mach_arm_unknown)
8026     bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
8027
8028   else if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
8029     bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
8030
8031   else
8032     bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
8033
8034   return TRUE;
8035 }
8036
8037 /* Function to keep ARM specific flags in the ELF header.  */
8038
8039 static bfd_boolean
8040 elf32_arm_set_private_flags (bfd *abfd, flagword flags)
8041 {
8042   if (elf_flags_init (abfd)
8043       && elf_elfheader (abfd)->e_flags != flags)
8044     {
8045       if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
8046         {
8047           if (flags & EF_ARM_INTERWORK)
8048             (*_bfd_error_handler)
8049               (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
8050                abfd);
8051           else
8052             _bfd_error_handler
8053               (_("Warning: Clearing the interworking flag of %B due to outside request"),
8054                abfd);
8055         }
8056     }
8057   else
8058     {
8059       elf_elfheader (abfd)->e_flags = flags;
8060       elf_flags_init (abfd) = TRUE;
8061     }
8062
8063   return TRUE;
8064 }
8065
8066 /* Copy backend specific data from one object module to another.  */
8067
8068 static bfd_boolean
8069 elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
8070 {
8071   flagword in_flags;
8072   flagword out_flags;
8073
8074   if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
8075     return TRUE;
8076
8077   in_flags  = elf_elfheader (ibfd)->e_flags;
8078   out_flags = elf_elfheader (obfd)->e_flags;
8079
8080   if (elf_flags_init (obfd)
8081       && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
8082       && in_flags != out_flags)
8083     {
8084       /* Cannot mix APCS26 and APCS32 code.  */
8085       if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
8086         return FALSE;
8087
8088       /* Cannot mix float APCS and non-float APCS code.  */
8089       if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
8090         return FALSE;
8091
8092       /* If the src and dest have different interworking flags
8093          then turn off the interworking bit.  */
8094       if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
8095         {
8096           if (out_flags & EF_ARM_INTERWORK)
8097             _bfd_error_handler
8098               (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
8099                obfd, ibfd);
8100
8101           in_flags &= ~EF_ARM_INTERWORK;
8102         }
8103
8104       /* Likewise for PIC, though don't warn for this case.  */
8105       if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
8106         in_flags &= ~EF_ARM_PIC;
8107     }
8108
8109   elf_elfheader (obfd)->e_flags = in_flags;
8110   elf_flags_init (obfd) = TRUE;
8111
8112   /* Also copy the EI_OSABI field.  */
8113   elf_elfheader (obfd)->e_ident[EI_OSABI] =
8114     elf_elfheader (ibfd)->e_ident[EI_OSABI];
8115
8116   /* Copy object attributes.  */
8117   _bfd_elf_copy_obj_attributes (ibfd, obfd);
8118
8119   return TRUE;
8120 }
8121
8122 /* Values for Tag_ABI_PCS_R9_use.  */
8123 enum
8124 {
8125   AEABI_R9_V6,
8126   AEABI_R9_SB,
8127   AEABI_R9_TLS,
8128   AEABI_R9_unused
8129 };
8130
8131 /* Values for Tag_ABI_PCS_RW_data.  */
8132 enum
8133 {
8134   AEABI_PCS_RW_data_absolute,
8135   AEABI_PCS_RW_data_PCrel,
8136   AEABI_PCS_RW_data_SBrel,
8137   AEABI_PCS_RW_data_unused
8138 };
8139
8140 /* Values for Tag_ABI_enum_size.  */
8141 enum
8142 {
8143   AEABI_enum_unused,
8144   AEABI_enum_short,
8145   AEABI_enum_wide,
8146   AEABI_enum_forced_wide
8147 };
8148
8149 /* Determine whether an object attribute tag takes an integer, a
8150    string or both.  */
8151
8152 static int
8153 elf32_arm_obj_attrs_arg_type (int tag)
8154 {
8155   if (tag == Tag_compatibility)
8156     return 3;
8157   else if (tag == 4 || tag == 5)
8158     return 2;
8159   else if (tag < 32)
8160     return 1;
8161   else
8162     return (tag & 1) != 0 ? 2 : 1;
8163 }
8164
8165 /* Merge EABI object attributes from IBFD into OBFD.  Raise an error if there
8166    are conflicting attributes.  */
8167
8168 static bfd_boolean
8169 elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
8170 {
8171   obj_attribute *in_attr;
8172   obj_attribute *out_attr;
8173   obj_attribute_list *in_list;
8174   /* Some tags have 0 = don't care, 1 = strong requirement,
8175      2 = weak requirement.  */
8176   static const int order_312[3] = {3, 1, 2};
8177   /* For use with Tag_VFP_arch.  */
8178   static const int order_01243[5] = {0, 1, 2, 4, 3};
8179   int i;
8180
8181   if (!elf_known_obj_attributes_proc (obfd)[0].i)
8182     {
8183       /* This is the first object.  Copy the attributes.  */
8184       _bfd_elf_copy_obj_attributes (ibfd, obfd);
8185
8186       /* Use the Tag_null value to indicate the attributes have been
8187          initialized.  */
8188       elf_known_obj_attributes_proc (obfd)[0].i = 1;
8189
8190       return TRUE;
8191     }
8192
8193   in_attr = elf_known_obj_attributes_proc (ibfd);
8194   out_attr = elf_known_obj_attributes_proc (obfd);
8195   /* This needs to happen before Tag_ABI_FP_number_model is merged.  */
8196   if (in_attr[Tag_ABI_VFP_args].i != out_attr[Tag_ABI_VFP_args].i)
8197     {
8198       /* Ignore mismatches if teh object doesn't use floating point.  */
8199       if (out_attr[Tag_ABI_FP_number_model].i == 0)
8200         out_attr[Tag_ABI_VFP_args].i = in_attr[Tag_ABI_VFP_args].i;
8201       else if (in_attr[Tag_ABI_FP_number_model].i != 0)
8202         {
8203           _bfd_error_handler
8204             (_("ERROR: %B uses VFP register arguments, %B does not"),
8205              ibfd, obfd);
8206           return FALSE;
8207         }
8208     }
8209
8210   for (i = 4; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++)
8211     {
8212       /* Merge this attribute with existing attributes.  */
8213       switch (i)
8214         {
8215         case Tag_CPU_raw_name:
8216         case Tag_CPU_name:
8217           /* Use whichever has the greatest architecture requirements.  We
8218              won't necessarily have both the above tags, so make sure input
8219              name is non-NULL.  */
8220           if (in_attr[Tag_CPU_arch].i > out_attr[Tag_CPU_arch].i
8221               && in_attr[i].s)
8222             out_attr[i].s = _bfd_elf_attr_strdup (obfd, in_attr[i].s);
8223           break;
8224
8225         case Tag_ABI_optimization_goals:
8226         case Tag_ABI_FP_optimization_goals:
8227           /* Use the first value seen.  */
8228           break;
8229
8230         case Tag_CPU_arch:
8231         case Tag_ARM_ISA_use:
8232         case Tag_THUMB_ISA_use:
8233         case Tag_WMMX_arch:
8234         case Tag_NEON_arch:
8235           /* ??? Do NEON and WMMX conflict?  */
8236         case Tag_ABI_FP_rounding:
8237         case Tag_ABI_FP_denormal:
8238         case Tag_ABI_FP_exceptions:
8239         case Tag_ABI_FP_user_exceptions:
8240         case Tag_ABI_FP_number_model:
8241         case Tag_ABI_align8_preserved:
8242         case Tag_ABI_HardFP_use:
8243           /* Use the largest value specified.  */
8244           if (in_attr[i].i > out_attr[i].i)
8245             out_attr[i].i = in_attr[i].i;
8246           break;
8247
8248         case Tag_CPU_arch_profile:
8249           /* Warn if conflicting architecture profiles used.  */
8250           if (out_attr[i].i && in_attr[i].i && in_attr[i].i != out_attr[i].i)
8251             {
8252               _bfd_error_handler
8253                 (_("ERROR: %B: Conflicting architecture profiles %c/%c"),
8254                  ibfd, in_attr[i].i, out_attr[i].i);
8255               return FALSE;
8256             }
8257           if (in_attr[i].i)
8258             out_attr[i].i = in_attr[i].i;
8259           break;
8260         case Tag_VFP_arch:
8261           if (in_attr[i].i > 4 || out_attr[i].i > 4
8262               || order_01243[in_attr[i].i] > order_01243[out_attr[i].i])
8263             out_attr[i].i = in_attr[i].i;
8264           break;
8265         case Tag_PCS_config:
8266           if (out_attr[i].i == 0)
8267             out_attr[i].i = in_attr[i].i;
8268           else if (in_attr[i].i != 0 && out_attr[i].i != 0)
8269             {
8270               /* It's sometimes ok to mix different configs, so this is only
8271                  a warning.  */
8272               _bfd_error_handler
8273                 (_("Warning: %B: Conflicting platform configuration"), ibfd);
8274             }
8275           break;
8276         case Tag_ABI_PCS_R9_use:
8277           if (in_attr[i].i != out_attr[i].i
8278               && out_attr[i].i != AEABI_R9_unused
8279               && in_attr[i].i != AEABI_R9_unused)
8280             {
8281               _bfd_error_handler
8282                 (_("ERROR: %B: Conflicting use of R9"), ibfd);
8283               return FALSE;
8284             }
8285           if (out_attr[i].i == AEABI_R9_unused)
8286             out_attr[i].i = in_attr[i].i;
8287           break;
8288         case Tag_ABI_PCS_RW_data:
8289           if (in_attr[i].i == AEABI_PCS_RW_data_SBrel
8290               && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_SB
8291               && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_unused)
8292             {
8293               _bfd_error_handler
8294                 (_("ERROR: %B: SB relative addressing conflicts with use of R9"),
8295                  ibfd);
8296               return FALSE;
8297             }
8298           /* Use the smallest value specified.  */
8299           if (in_attr[i].i < out_attr[i].i)
8300             out_attr[i].i = in_attr[i].i;
8301           break;
8302         case Tag_ABI_PCS_RO_data:
8303           /* Use the smallest value specified.  */
8304           if (in_attr[i].i < out_attr[i].i)
8305             out_attr[i].i = in_attr[i].i;
8306           break;
8307         case Tag_ABI_PCS_GOT_use:
8308           if (in_attr[i].i > 2 || out_attr[i].i > 2
8309               || order_312[in_attr[i].i] < order_312[out_attr[i].i])
8310             out_attr[i].i = in_attr[i].i;
8311           break;
8312         case Tag_ABI_PCS_wchar_t:
8313           if (out_attr[i].i && in_attr[i].i && out_attr[i].i != in_attr[i].i
8314               && !elf_arm_tdata (obfd)->no_wchar_size_warning)
8315             {
8316               _bfd_error_handler
8317                 (_("warning: %B uses %u-byte wchar_t yet the output is to use %u-byte wchar_t; use of wchar_t values across objects may fail"),
8318                  ibfd, in_attr[i].i, out_attr[i].i);
8319             }
8320           else if (in_attr[i].i && !out_attr[i].i)
8321             out_attr[i].i = in_attr[i].i;
8322           break;
8323         case Tag_ABI_align8_needed:
8324           /* ??? Check against Tag_ABI_align8_preserved.  */
8325           if (in_attr[i].i > 2 || out_attr[i].i > 2
8326               || order_312[in_attr[i].i] < order_312[out_attr[i].i])
8327             out_attr[i].i = in_attr[i].i;
8328           break;
8329         case Tag_ABI_enum_size:
8330           if (in_attr[i].i != AEABI_enum_unused)
8331             {
8332               if (out_attr[i].i == AEABI_enum_unused
8333                   || out_attr[i].i == AEABI_enum_forced_wide)
8334                 {
8335                   /* The existing object is compatible with anything.
8336                      Use whatever requirements the new object has.  */
8337                   out_attr[i].i = in_attr[i].i;
8338                 }
8339               else if (in_attr[i].i != AEABI_enum_forced_wide
8340                        && out_attr[i].i != in_attr[i].i
8341                        && !elf_arm_tdata (obfd)->no_enum_size_warning)
8342                 {
8343                   const char *aeabi_enum_names[] =
8344                     { "", "variable-size", "32-bit", "" };
8345                   _bfd_error_handler
8346                     (_("warning: %B uses %s enums yet the output is to use %s enums; use of enum values across objects may fail"),
8347                      ibfd, aeabi_enum_names[in_attr[i].i],
8348                      aeabi_enum_names[out_attr[i].i]);
8349                 }
8350             }
8351           break;
8352         case Tag_ABI_VFP_args:
8353           /* Aready done.  */
8354           break;
8355         case Tag_ABI_WMMX_args:
8356           if (in_attr[i].i != out_attr[i].i)
8357             {
8358               _bfd_error_handler
8359                 (_("ERROR: %B uses iWMMXt register arguments, %B does not"),
8360                  ibfd, obfd);
8361               return FALSE;
8362             }
8363           break;
8364         default: /* All known attributes should be explicitly covered.   */
8365           abort ();
8366         }
8367
8368       if (in_attr[i].type && !out_attr[i].type)
8369         switch (in_attr[i].type)
8370           {
8371           case 1:
8372             if (out_attr[i].i)
8373               out_attr[i].type = 1;
8374             break;
8375
8376           case 2:
8377             if (out_attr[i].s)
8378               out_attr[i].type = 2;
8379             break;
8380
8381           default:
8382             abort ();
8383           }
8384     }
8385
8386   /* Merge Tag_compatibility attributes and any common GNU ones.  */
8387   _bfd_elf_merge_object_attributes (ibfd, obfd);
8388
8389   /* Check for any attributes not known on ARM.  */
8390   in_list = elf_other_obj_attributes_proc (ibfd);
8391   while (in_list && in_list->tag == Tag_compatibility)
8392     in_list = in_list->next;
8393
8394   for (; in_list; in_list = in_list->next)
8395     {
8396       if ((in_list->tag & 128) < 64)
8397         {
8398           _bfd_error_handler
8399             (_("Warning: %B: Unknown EABI object attribute %d"),
8400              ibfd, in_list->tag);
8401           break;
8402         }
8403     }
8404   return TRUE;
8405 }
8406
8407
8408 /* Return TRUE if the two EABI versions are incompatible.  */
8409
8410 static bfd_boolean
8411 elf32_arm_versions_compatible (unsigned iver, unsigned over)
8412 {
8413   /* v4 and v5 are the same spec before and after it was released,
8414      so allow mixing them.  */
8415   if ((iver == EF_ARM_EABI_VER4 && over == EF_ARM_EABI_VER5)
8416       || (iver == EF_ARM_EABI_VER5 && over == EF_ARM_EABI_VER4))
8417     return TRUE;
8418
8419   return (iver == over);
8420 }
8421
8422 /* Merge backend specific data from an object file to the output
8423    object file when linking.  */
8424
8425 static bfd_boolean
8426 elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
8427 {
8428   flagword out_flags;
8429   flagword in_flags;
8430   bfd_boolean flags_compatible = TRUE;
8431   asection *sec;
8432
8433   /* Check if we have the same endianess.  */
8434   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
8435     return FALSE;
8436
8437   if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
8438     return TRUE;
8439
8440   if (!elf32_arm_merge_eabi_attributes (ibfd, obfd))
8441     return FALSE;
8442
8443   /* The input BFD must have had its flags initialised.  */
8444   /* The following seems bogus to me -- The flags are initialized in
8445      the assembler but I don't think an elf_flags_init field is
8446      written into the object.  */
8447   /* BFD_ASSERT (elf_flags_init (ibfd)); */
8448
8449   in_flags  = elf_elfheader (ibfd)->e_flags;
8450   out_flags = elf_elfheader (obfd)->e_flags;
8451
8452   /* In theory there is no reason why we couldn't handle this.  However
8453      in practice it isn't even close to working and there is no real
8454      reason to want it.  */
8455   if (EF_ARM_EABI_VERSION (in_flags) >= EF_ARM_EABI_VER4
8456       && !(ibfd->flags & DYNAMIC)
8457       && (in_flags & EF_ARM_BE8))
8458     {
8459       _bfd_error_handler (_("ERROR: %B is already in final BE8 format"),
8460                           ibfd);
8461       return FALSE;
8462     }
8463
8464   if (!elf_flags_init (obfd))
8465     {
8466       /* If the input is the default architecture and had the default
8467          flags then do not bother setting the flags for the output
8468          architecture, instead allow future merges to do this.  If no
8469          future merges ever set these flags then they will retain their
8470          uninitialised values, which surprise surprise, correspond
8471          to the default values.  */
8472       if (bfd_get_arch_info (ibfd)->the_default
8473           && elf_elfheader (ibfd)->e_flags == 0)
8474         return TRUE;
8475
8476       elf_flags_init (obfd) = TRUE;
8477       elf_elfheader (obfd)->e_flags = in_flags;
8478
8479       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
8480           && bfd_get_arch_info (obfd)->the_default)
8481         return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
8482
8483       return TRUE;
8484     }
8485
8486   /* Determine what should happen if the input ARM architecture
8487      does not match the output ARM architecture.  */
8488   if (! bfd_arm_merge_machines (ibfd, obfd))
8489     return FALSE;
8490
8491   /* Identical flags must be compatible.  */
8492   if (in_flags == out_flags)
8493     return TRUE;
8494
8495   /* Check to see if the input BFD actually contains any sections.  If
8496      not, its flags may not have been initialised either, but it
8497      cannot actually cause any incompatiblity.  Do not short-circuit
8498      dynamic objects; their section list may be emptied by
8499     elf_link_add_object_symbols.
8500
8501     Also check to see if there are no code sections in the input.
8502     In this case there is no need to check for code specific flags.
8503     XXX - do we need to worry about floating-point format compatability
8504     in data sections ?  */
8505   if (!(ibfd->flags & DYNAMIC))
8506     {
8507       bfd_boolean null_input_bfd = TRUE;
8508       bfd_boolean only_data_sections = TRUE;
8509
8510       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8511         {
8512           /* Ignore synthetic glue sections.  */
8513           if (strcmp (sec->name, ".glue_7")
8514               && strcmp (sec->name, ".glue_7t"))
8515             {
8516               if ((bfd_get_section_flags (ibfd, sec)
8517                    & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
8518                   == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
8519                 only_data_sections = FALSE;
8520
8521               null_input_bfd = FALSE;
8522               break;
8523             }
8524         }
8525
8526       if (null_input_bfd || only_data_sections)
8527         return TRUE;
8528     }
8529
8530   /* Complain about various flag mismatches.  */
8531   if (!elf32_arm_versions_compatible (EF_ARM_EABI_VERSION (in_flags),
8532                                       EF_ARM_EABI_VERSION (out_flags)))
8533     {
8534       _bfd_error_handler
8535         (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
8536          ibfd, obfd,
8537          (in_flags & EF_ARM_EABIMASK) >> 24,
8538          (out_flags & EF_ARM_EABIMASK) >> 24);
8539       return FALSE;
8540     }
8541
8542   /* Not sure what needs to be checked for EABI versions >= 1.  */
8543   /* VxWorks libraries do not use these flags.  */
8544   if (get_elf_backend_data (obfd) != &elf32_arm_vxworks_bed
8545       && get_elf_backend_data (ibfd) != &elf32_arm_vxworks_bed
8546       && EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
8547     {
8548       if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
8549         {
8550           _bfd_error_handler
8551             (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
8552              ibfd, obfd,
8553              in_flags & EF_ARM_APCS_26 ? 26 : 32,
8554              out_flags & EF_ARM_APCS_26 ? 26 : 32);
8555           flags_compatible = FALSE;
8556         }
8557
8558       if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
8559         {
8560           if (in_flags & EF_ARM_APCS_FLOAT)
8561             _bfd_error_handler
8562               (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"),
8563                ibfd, obfd);
8564           else
8565             _bfd_error_handler
8566               (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"),
8567                ibfd, obfd);
8568
8569           flags_compatible = FALSE;
8570         }
8571
8572       if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
8573         {
8574           if (in_flags & EF_ARM_VFP_FLOAT)
8575             _bfd_error_handler
8576               (_("ERROR: %B uses VFP instructions, whereas %B does not"),
8577                ibfd, obfd);
8578           else
8579             _bfd_error_handler
8580               (_("ERROR: %B uses FPA instructions, whereas %B does not"),
8581                ibfd, obfd);
8582
8583           flags_compatible = FALSE;
8584         }
8585
8586       if ((in_flags & EF_ARM_MAVERICK_FLOAT) != (out_flags & EF_ARM_MAVERICK_FLOAT))
8587         {
8588           if (in_flags & EF_ARM_MAVERICK_FLOAT)
8589             _bfd_error_handler
8590               (_("ERROR: %B uses Maverick instructions, whereas %B does not"),
8591                ibfd, obfd);
8592           else
8593             _bfd_error_handler
8594               (_("ERROR: %B does not use Maverick instructions, whereas %B does"),
8595                ibfd, obfd);
8596
8597           flags_compatible = FALSE;
8598         }
8599
8600 #ifdef EF_ARM_SOFT_FLOAT
8601       if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
8602         {
8603           /* We can allow interworking between code that is VFP format
8604              layout, and uses either soft float or integer regs for
8605              passing floating point arguments and results.  We already
8606              know that the APCS_FLOAT flags match; similarly for VFP
8607              flags.  */
8608           if ((in_flags & EF_ARM_APCS_FLOAT) != 0
8609               || (in_flags & EF_ARM_VFP_FLOAT) == 0)
8610             {
8611               if (in_flags & EF_ARM_SOFT_FLOAT)
8612                 _bfd_error_handler
8613                   (_("ERROR: %B uses software FP, whereas %B uses hardware FP"),
8614                    ibfd, obfd);
8615               else
8616                 _bfd_error_handler
8617                   (_("ERROR: %B uses hardware FP, whereas %B uses software FP"),
8618                    ibfd, obfd);
8619
8620               flags_compatible = FALSE;
8621             }
8622         }
8623 #endif
8624
8625       /* Interworking mismatch is only a warning.  */
8626       if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
8627         {
8628           if (in_flags & EF_ARM_INTERWORK)
8629             {
8630               _bfd_error_handler
8631                 (_("Warning: %B supports interworking, whereas %B does not"),
8632                  ibfd, obfd);
8633             }
8634           else
8635             {
8636               _bfd_error_handler
8637                 (_("Warning: %B does not support interworking, whereas %B does"),
8638                  ibfd, obfd);
8639             }
8640         }
8641     }
8642
8643   return flags_compatible;
8644 }
8645
8646 /* Display the flags field.  */
8647
8648 static bfd_boolean
8649 elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
8650 {
8651   FILE * file = (FILE *) ptr;
8652   unsigned long flags;
8653
8654   BFD_ASSERT (abfd != NULL && ptr != NULL);
8655
8656   /* Print normal ELF private data.  */
8657   _bfd_elf_print_private_bfd_data (abfd, ptr);
8658
8659   flags = elf_elfheader (abfd)->e_flags;
8660   /* Ignore init flag - it may not be set, despite the flags field
8661      containing valid data.  */
8662
8663   /* xgettext:c-format */
8664   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
8665
8666   switch (EF_ARM_EABI_VERSION (flags))
8667     {
8668     case EF_ARM_EABI_UNKNOWN:
8669       /* The following flag bits are GNU extensions and not part of the
8670          official ARM ELF extended ABI.  Hence they are only decoded if
8671          the EABI version is not set.  */
8672       if (flags & EF_ARM_INTERWORK)
8673         fprintf (file, _(" [interworking enabled]"));
8674
8675       if (flags & EF_ARM_APCS_26)
8676         fprintf (file, " [APCS-26]");
8677       else
8678         fprintf (file, " [APCS-32]");
8679
8680       if (flags & EF_ARM_VFP_FLOAT)
8681         fprintf (file, _(" [VFP float format]"));
8682       else if (flags & EF_ARM_MAVERICK_FLOAT)
8683         fprintf (file, _(" [Maverick float format]"));
8684       else
8685         fprintf (file, _(" [FPA float format]"));
8686
8687       if (flags & EF_ARM_APCS_FLOAT)
8688         fprintf (file, _(" [floats passed in float registers]"));
8689
8690       if (flags & EF_ARM_PIC)
8691         fprintf (file, _(" [position independent]"));
8692
8693       if (flags & EF_ARM_NEW_ABI)
8694         fprintf (file, _(" [new ABI]"));
8695
8696       if (flags & EF_ARM_OLD_ABI)
8697         fprintf (file, _(" [old ABI]"));
8698
8699       if (flags & EF_ARM_SOFT_FLOAT)
8700         fprintf (file, _(" [software FP]"));
8701
8702       flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
8703                  | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
8704                  | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT
8705                  | EF_ARM_MAVERICK_FLOAT);
8706       break;
8707
8708     case EF_ARM_EABI_VER1:
8709       fprintf (file, _(" [Version1 EABI]"));
8710
8711       if (flags & EF_ARM_SYMSARESORTED)
8712         fprintf (file, _(" [sorted symbol table]"));
8713       else
8714         fprintf (file, _(" [unsorted symbol table]"));
8715
8716       flags &= ~ EF_ARM_SYMSARESORTED;
8717       break;
8718
8719     case EF_ARM_EABI_VER2:
8720       fprintf (file, _(" [Version2 EABI]"));
8721
8722       if (flags & EF_ARM_SYMSARESORTED)
8723         fprintf (file, _(" [sorted symbol table]"));
8724       else
8725         fprintf (file, _(" [unsorted symbol table]"));
8726
8727       if (flags & EF_ARM_DYNSYMSUSESEGIDX)
8728         fprintf (file, _(" [dynamic symbols use segment index]"));
8729
8730       if (flags & EF_ARM_MAPSYMSFIRST)
8731         fprintf (file, _(" [mapping symbols precede others]"));
8732
8733       flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
8734                  | EF_ARM_MAPSYMSFIRST);
8735       break;
8736
8737     case EF_ARM_EABI_VER3:
8738       fprintf (file, _(" [Version3 EABI]"));
8739       break;
8740
8741     case EF_ARM_EABI_VER4:
8742       fprintf (file, _(" [Version4 EABI]"));
8743       goto eabi;
8744
8745     case EF_ARM_EABI_VER5:
8746       fprintf (file, _(" [Version5 EABI]"));
8747     eabi:
8748       if (flags & EF_ARM_BE8)
8749         fprintf (file, _(" [BE8]"));
8750
8751       if (flags & EF_ARM_LE8)
8752         fprintf (file, _(" [LE8]"));
8753
8754       flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
8755       break;
8756
8757     default:
8758       fprintf (file, _(" <EABI version unrecognised>"));
8759       break;
8760     }
8761
8762   flags &= ~ EF_ARM_EABIMASK;
8763
8764   if (flags & EF_ARM_RELEXEC)
8765     fprintf (file, _(" [relocatable executable]"));
8766
8767   if (flags & EF_ARM_HASENTRY)
8768     fprintf (file, _(" [has entry point]"));
8769
8770   flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
8771
8772   if (flags)
8773     fprintf (file, _("<Unrecognised flag bits set>"));
8774
8775   fputc ('\n', file);
8776
8777   return TRUE;
8778 }
8779
8780 static int
8781 elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
8782 {
8783   switch (ELF_ST_TYPE (elf_sym->st_info))
8784     {
8785     case STT_ARM_TFUNC:
8786       return ELF_ST_TYPE (elf_sym->st_info);
8787
8788     case STT_ARM_16BIT:
8789       /* If the symbol is not an object, return the STT_ARM_16BIT flag.
8790          This allows us to distinguish between data used by Thumb instructions
8791          and non-data (which is probably code) inside Thumb regions of an
8792          executable.  */
8793       if (type != STT_OBJECT && type != STT_TLS)
8794         return ELF_ST_TYPE (elf_sym->st_info);
8795       break;
8796
8797     default:
8798       break;
8799     }
8800
8801   return type;
8802 }
8803
8804 static asection *
8805 elf32_arm_gc_mark_hook (asection *sec,
8806                         struct bfd_link_info *info,
8807                         Elf_Internal_Rela *rel,
8808                         struct elf_link_hash_entry *h,
8809                         Elf_Internal_Sym *sym)
8810 {
8811   if (h != NULL)
8812     switch (ELF32_R_TYPE (rel->r_info))
8813       {
8814       case R_ARM_GNU_VTINHERIT:
8815       case R_ARM_GNU_VTENTRY:
8816         return NULL;
8817       }
8818
8819   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
8820 }
8821
8822 /* Update the got entry reference counts for the section being removed.  */
8823
8824 static bfd_boolean
8825 elf32_arm_gc_sweep_hook (bfd *                     abfd,
8826                          struct bfd_link_info *    info,
8827                          asection *                sec,
8828                          const Elf_Internal_Rela * relocs)
8829 {
8830   Elf_Internal_Shdr *symtab_hdr;
8831   struct elf_link_hash_entry **sym_hashes;
8832   bfd_signed_vma *local_got_refcounts;
8833   const Elf_Internal_Rela *rel, *relend;
8834   struct elf32_arm_link_hash_table * globals;
8835
8836   if (info->relocatable)
8837     return TRUE;
8838
8839   globals = elf32_arm_hash_table (info);
8840
8841   elf_section_data (sec)->local_dynrel = NULL;
8842
8843   symtab_hdr = & elf_symtab_hdr (abfd);
8844   sym_hashes = elf_sym_hashes (abfd);
8845   local_got_refcounts = elf_local_got_refcounts (abfd);
8846
8847   check_use_blx (globals);
8848
8849   relend = relocs + sec->reloc_count;
8850   for (rel = relocs; rel < relend; rel++)
8851     {
8852       unsigned long r_symndx;
8853       struct elf_link_hash_entry *h = NULL;
8854       int r_type;
8855
8856       r_symndx = ELF32_R_SYM (rel->r_info);
8857       if (r_symndx >= symtab_hdr->sh_info)
8858         {
8859           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
8860           while (h->root.type == bfd_link_hash_indirect
8861                  || h->root.type == bfd_link_hash_warning)
8862             h = (struct elf_link_hash_entry *) h->root.u.i.link;
8863         }
8864
8865       r_type = ELF32_R_TYPE (rel->r_info);
8866       r_type = arm_real_reloc_type (globals, r_type);
8867       switch (r_type)
8868         {
8869         case R_ARM_GOT32:
8870         case R_ARM_GOT_PREL:
8871         case R_ARM_TLS_GD32:
8872         case R_ARM_TLS_IE32:
8873           if (h != NULL)
8874             {
8875               if (h->got.refcount > 0)
8876                 h->got.refcount -= 1;
8877             }
8878           else if (local_got_refcounts != NULL)
8879             {
8880               if (local_got_refcounts[r_symndx] > 0)
8881                 local_got_refcounts[r_symndx] -= 1;
8882             }
8883           break;
8884
8885         case R_ARM_TLS_LDM32:
8886           elf32_arm_hash_table (info)->tls_ldm_got.refcount -= 1;
8887           break;
8888
8889         case R_ARM_ABS32:
8890         case R_ARM_ABS32_NOI:
8891         case R_ARM_REL32:
8892         case R_ARM_REL32_NOI:
8893         case R_ARM_PC24:
8894         case R_ARM_PLT32:
8895         case R_ARM_CALL:
8896         case R_ARM_JUMP24:
8897         case R_ARM_PREL31:
8898         case R_ARM_THM_CALL:
8899         case R_ARM_THM_JUMP24:
8900         case R_ARM_THM_JUMP19:
8901         case R_ARM_MOVW_ABS_NC:
8902         case R_ARM_MOVT_ABS:
8903         case R_ARM_MOVW_PREL_NC:
8904         case R_ARM_MOVT_PREL:
8905         case R_ARM_THM_MOVW_ABS_NC:
8906         case R_ARM_THM_MOVT_ABS:
8907         case R_ARM_THM_MOVW_PREL_NC:
8908         case R_ARM_THM_MOVT_PREL:
8909           /* Should the interworking branches be here also?  */
8910
8911           if (h != NULL)
8912             {
8913               struct elf32_arm_link_hash_entry *eh;
8914               struct elf32_arm_relocs_copied **pp;
8915               struct elf32_arm_relocs_copied *p;
8916
8917               eh = (struct elf32_arm_link_hash_entry *) h;
8918
8919               if (h->plt.refcount > 0)
8920                 {
8921                   h->plt.refcount -= 1;
8922                   if (r_type == R_ARM_THM_CALL)
8923                     eh->plt_maybe_thumb_refcount--;
8924
8925                   if (r_type == R_ARM_THM_JUMP24
8926                       || r_type == R_ARM_THM_JUMP19)
8927                     eh->plt_thumb_refcount--;
8928                 }
8929
8930               if (r_type == R_ARM_ABS32
8931                   || r_type == R_ARM_REL32
8932                   || r_type == R_ARM_ABS32_NOI
8933                   || r_type == R_ARM_REL32_NOI)
8934                 {
8935                   for (pp = &eh->relocs_copied; (p = *pp) != NULL;
8936                        pp = &p->next)
8937                   if (p->section == sec)
8938                     {
8939                       p->count -= 1;
8940                       if (ELF32_R_TYPE (rel->r_info) == R_ARM_REL32
8941                           || ELF32_R_TYPE (rel->r_info) == R_ARM_REL32_NOI)
8942                         p->pc_count -= 1;
8943                       if (p->count == 0)
8944                         *pp = p->next;
8945                       break;
8946                     }
8947                 }
8948             }
8949           break;
8950
8951         default:
8952           break;
8953         }
8954     }
8955
8956   return TRUE;
8957 }
8958
8959 /* Look through the relocs for a section during the first phase.  */
8960
8961 static bfd_boolean
8962 elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
8963                         asection *sec, const Elf_Internal_Rela *relocs)
8964 {
8965   Elf_Internal_Shdr *symtab_hdr;
8966   struct elf_link_hash_entry **sym_hashes;
8967   const Elf_Internal_Rela *rel;
8968   const Elf_Internal_Rela *rel_end;
8969   bfd *dynobj;
8970   asection *sreloc;
8971   bfd_vma *local_got_offsets;
8972   struct elf32_arm_link_hash_table *htab;
8973   bfd_boolean needs_plt;
8974
8975   if (info->relocatable)
8976     return TRUE;
8977
8978   BFD_ASSERT (is_arm_elf (abfd));
8979
8980   htab = elf32_arm_hash_table (info);
8981   sreloc = NULL;
8982
8983   /* Create dynamic sections for relocatable executables so that we can
8984      copy relocations.  */
8985   if (htab->root.is_relocatable_executable
8986       && ! htab->root.dynamic_sections_created)
8987     {
8988       if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
8989         return FALSE;
8990     }
8991
8992   dynobj = elf_hash_table (info)->dynobj;
8993   local_got_offsets = elf_local_got_offsets (abfd);
8994
8995   symtab_hdr = & elf_symtab_hdr (abfd);
8996   sym_hashes = elf_sym_hashes (abfd);
8997
8998   rel_end = relocs + sec->reloc_count;
8999   for (rel = relocs; rel < rel_end; rel++)
9000     {
9001       struct elf_link_hash_entry *h;
9002       struct elf32_arm_link_hash_entry *eh;
9003       unsigned long r_symndx;
9004       int r_type;
9005
9006       r_symndx = ELF32_R_SYM (rel->r_info);
9007       r_type = ELF32_R_TYPE (rel->r_info);
9008       r_type = arm_real_reloc_type (htab, r_type);
9009
9010       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
9011         {
9012           (*_bfd_error_handler) (_("%B: bad symbol index: %d"), abfd,
9013                                  r_symndx);
9014           return FALSE;
9015         }
9016
9017       if (r_symndx < symtab_hdr->sh_info)
9018         h = NULL;
9019       else
9020         {
9021           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
9022           while (h->root.type == bfd_link_hash_indirect
9023                  || h->root.type == bfd_link_hash_warning)
9024             h = (struct elf_link_hash_entry *) h->root.u.i.link;
9025         }
9026
9027       eh = (struct elf32_arm_link_hash_entry *) h;
9028
9029       switch (r_type)
9030         {
9031           case R_ARM_GOT32:
9032           case R_ARM_GOT_PREL:
9033           case R_ARM_TLS_GD32:
9034           case R_ARM_TLS_IE32:
9035             /* This symbol requires a global offset table entry.  */
9036             {
9037               int tls_type, old_tls_type;
9038
9039               switch (r_type)
9040                 {
9041                 case R_ARM_TLS_GD32: tls_type = GOT_TLS_GD; break;
9042                 case R_ARM_TLS_IE32: tls_type = GOT_TLS_IE; break;
9043                 default: tls_type = GOT_NORMAL; break;
9044                 }
9045
9046               if (h != NULL)
9047                 {
9048                   h->got.refcount++;
9049                   old_tls_type = elf32_arm_hash_entry (h)->tls_type;
9050                 }
9051               else
9052                 {
9053                   bfd_signed_vma *local_got_refcounts;
9054
9055                   /* This is a global offset table entry for a local symbol.  */
9056                   local_got_refcounts = elf_local_got_refcounts (abfd);
9057                   if (local_got_refcounts == NULL)
9058                     {
9059                       bfd_size_type size;
9060
9061                       size = symtab_hdr->sh_info;
9062                       size *= (sizeof (bfd_signed_vma) + sizeof (char));
9063                       local_got_refcounts = bfd_zalloc (abfd, size);
9064                       if (local_got_refcounts == NULL)
9065                         return FALSE;
9066                       elf_local_got_refcounts (abfd) = local_got_refcounts;
9067                       elf32_arm_local_got_tls_type (abfd)
9068                         = (char *) (local_got_refcounts + symtab_hdr->sh_info);
9069                     }
9070                   local_got_refcounts[r_symndx] += 1;
9071                   old_tls_type = elf32_arm_local_got_tls_type (abfd) [r_symndx];
9072                 }
9073
9074               /* We will already have issued an error message if there is a
9075                  TLS / non-TLS mismatch, based on the symbol type.  We don't
9076                  support any linker relaxations.  So just combine any TLS
9077                  types needed.  */
9078               if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
9079                   && tls_type != GOT_NORMAL)
9080                 tls_type |= old_tls_type;
9081
9082               if (old_tls_type != tls_type)
9083                 {
9084                   if (h != NULL)
9085                     elf32_arm_hash_entry (h)->tls_type = tls_type;
9086                   else
9087                     elf32_arm_local_got_tls_type (abfd) [r_symndx] = tls_type;
9088                 }
9089             }
9090             /* Fall through.  */
9091
9092           case R_ARM_TLS_LDM32:
9093             if (r_type == R_ARM_TLS_LDM32)
9094                 htab->tls_ldm_got.refcount++;
9095             /* Fall through.  */
9096
9097           case R_ARM_GOTOFF32:
9098           case R_ARM_GOTPC:
9099             if (htab->sgot == NULL)
9100               {
9101                 if (htab->root.dynobj == NULL)
9102                   htab->root.dynobj = abfd;
9103                 if (!create_got_section (htab->root.dynobj, info))
9104                   return FALSE;
9105               }
9106             break;
9107
9108           case R_ARM_ABS12:
9109             /* VxWorks uses dynamic R_ARM_ABS12 relocations for
9110                ldr __GOTT_INDEX__ offsets.  */
9111             if (!htab->vxworks_p)
9112               break;
9113             /* Fall through.  */
9114
9115           case R_ARM_PC24:
9116           case R_ARM_PLT32:
9117           case R_ARM_CALL:
9118           case R_ARM_JUMP24:
9119           case R_ARM_PREL31:
9120           case R_ARM_THM_CALL:
9121           case R_ARM_THM_JUMP24:
9122           case R_ARM_THM_JUMP19:
9123             needs_plt = 1;
9124             goto normal_reloc;
9125
9126           case R_ARM_ABS32:
9127           case R_ARM_ABS32_NOI:
9128           case R_ARM_REL32:
9129           case R_ARM_REL32_NOI:
9130           case R_ARM_MOVW_ABS_NC:
9131           case R_ARM_MOVT_ABS:
9132           case R_ARM_MOVW_PREL_NC:
9133           case R_ARM_MOVT_PREL:
9134           case R_ARM_THM_MOVW_ABS_NC:
9135           case R_ARM_THM_MOVT_ABS:
9136           case R_ARM_THM_MOVW_PREL_NC:
9137           case R_ARM_THM_MOVT_PREL:
9138             needs_plt = 0;
9139           normal_reloc:
9140
9141             /* Should the interworking branches be listed here?  */
9142             if (h != NULL)
9143               {
9144                 /* If this reloc is in a read-only section, we might
9145                    need a copy reloc.  We can't check reliably at this
9146                    stage whether the section is read-only, as input
9147                    sections have not yet been mapped to output sections.
9148                    Tentatively set the flag for now, and correct in
9149                    adjust_dynamic_symbol.  */
9150                 if (!info->shared)
9151                   h->non_got_ref = 1;
9152
9153                 /* We may need a .plt entry if the function this reloc
9154                    refers to is in a different object.  We can't tell for
9155                    sure yet, because something later might force the
9156                    symbol local.  */
9157                 if (needs_plt)
9158                   h->needs_plt = 1;
9159
9160                 /* If we create a PLT entry, this relocation will reference
9161                    it, even if it's an ABS32 relocation.  */
9162                 h->plt.refcount += 1;
9163
9164                 /* It's too early to use htab->use_blx here, so we have to
9165                    record possible blx references separately from
9166                    relocs that definitely need a thumb stub.  */
9167
9168                 if (r_type == R_ARM_THM_CALL)
9169                   eh->plt_maybe_thumb_refcount += 1;
9170
9171                 if (r_type == R_ARM_THM_JUMP24
9172                     || r_type == R_ARM_THM_JUMP19)
9173                   eh->plt_thumb_refcount += 1;
9174               }
9175
9176             /* If we are creating a shared library or relocatable executable,
9177                and this is a reloc against a global symbol, or a non PC
9178                relative reloc against a local symbol, then we need to copy
9179                the reloc into the shared library.  However, if we are linking
9180                with -Bsymbolic, we do not need to copy a reloc against a
9181                global symbol which is defined in an object we are
9182                including in the link (i.e., DEF_REGULAR is set).  At
9183                this point we have not seen all the input files, so it is
9184                possible that DEF_REGULAR is not set now but will be set
9185                later (it is never cleared).  We account for that
9186                possibility below by storing information in the
9187                relocs_copied field of the hash table entry.  */
9188             if ((info->shared || htab->root.is_relocatable_executable)
9189                 && (sec->flags & SEC_ALLOC) != 0
9190                 && ((r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI)
9191                     || (h != NULL && ! h->needs_plt
9192                         && (! info->symbolic || ! h->def_regular))))
9193               {
9194                 struct elf32_arm_relocs_copied *p, **head;
9195
9196                 /* When creating a shared object, we must copy these
9197                    reloc types into the output file.  We create a reloc
9198                    section in dynobj and make room for this reloc.  */
9199                 if (sreloc == NULL)
9200                   {
9201                     const char * name;
9202
9203                     name = (bfd_elf_string_from_elf_section
9204                             (abfd,
9205                              elf_elfheader (abfd)->e_shstrndx,
9206                              elf_section_data (sec)->rel_hdr.sh_name));
9207                     if (name == NULL)
9208                       return FALSE;
9209
9210                     BFD_ASSERT (reloc_section_p (htab, name, sec));
9211
9212                     sreloc = bfd_get_section_by_name (dynobj, name);
9213                     if (sreloc == NULL)
9214                       {
9215                         flagword flags;
9216
9217                         flags = (SEC_HAS_CONTENTS | SEC_READONLY
9218                                  | SEC_IN_MEMORY | SEC_LINKER_CREATED);
9219                         if ((sec->flags & SEC_ALLOC) != 0
9220                             /* BPABI objects never have dynamic
9221                                relocations mapped.  */
9222                             && !htab->symbian_p)
9223                           flags |= SEC_ALLOC | SEC_LOAD;
9224                         sreloc = bfd_make_section_with_flags (dynobj,
9225                                                               name,
9226                                                               flags);
9227                         if (sreloc == NULL
9228                             || ! bfd_set_section_alignment (dynobj, sreloc, 2))
9229                           return FALSE;
9230                       }
9231
9232                     elf_section_data (sec)->sreloc = sreloc;
9233                   }
9234
9235                 /* If this is a global symbol, we count the number of
9236                    relocations we need for this symbol.  */
9237                 if (h != NULL)
9238                   {
9239                     head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied;
9240                   }
9241                 else
9242                   {
9243                     /* Track dynamic relocs needed for local syms too.
9244                        We really need local syms available to do this
9245                        easily.  Oh well.  */
9246
9247                     asection *s;
9248                     void *vpp;
9249
9250                     s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
9251                                                    sec, r_symndx);
9252                     if (s == NULL)
9253                       return FALSE;
9254
9255                     vpp = &elf_section_data (s)->local_dynrel;
9256                     head = (struct elf32_arm_relocs_copied **) vpp;
9257                   }
9258
9259                 p = *head;
9260                 if (p == NULL || p->section != sec)
9261                   {
9262                     bfd_size_type amt = sizeof *p;
9263
9264                     p = bfd_alloc (htab->root.dynobj, amt);
9265                     if (p == NULL)
9266                       return FALSE;
9267                     p->next = *head;
9268                     *head = p;
9269                     p->section = sec;
9270                     p->count = 0;
9271                     p->pc_count = 0;
9272                   }
9273
9274                 if (r_type == R_ARM_REL32 || r_type == R_ARM_REL32_NOI)
9275                   p->pc_count += 1;
9276                 p->count += 1;
9277               }
9278             break;
9279
9280         /* This relocation describes the C++ object vtable hierarchy.
9281            Reconstruct it for later use during GC.  */
9282         case R_ARM_GNU_VTINHERIT:
9283           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
9284             return FALSE;
9285           break;
9286
9287         /* This relocation describes which C++ vtable entries are actually
9288            used.  Record for later use during GC.  */
9289         case R_ARM_GNU_VTENTRY:
9290           BFD_ASSERT (h != NULL);
9291           if (h != NULL
9292               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
9293             return FALSE;
9294           break;
9295         }
9296     }
9297
9298   return TRUE;
9299 }
9300
9301 /* Unwinding tables are not referenced directly.  This pass marks them as
9302    required if the corresponding code section is marked.  */
9303
9304 static bfd_boolean
9305 elf32_arm_gc_mark_extra_sections (struct bfd_link_info *info,
9306                                   elf_gc_mark_hook_fn gc_mark_hook)
9307 {
9308   bfd *sub;
9309   Elf_Internal_Shdr **elf_shdrp;
9310   bfd_boolean again;
9311
9312   /* Marking EH data may cause additional code sections to be marked,
9313      requiring multiple passes.  */
9314   again = TRUE;
9315   while (again)
9316     {
9317       again = FALSE;
9318       for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
9319         {
9320           asection *o;
9321
9322           if (! is_arm_elf (sub))
9323             continue;
9324
9325           elf_shdrp = elf_elfsections (sub);
9326           for (o = sub->sections; o != NULL; o = o->next)
9327             {
9328               Elf_Internal_Shdr *hdr;
9329
9330               hdr = &elf_section_data (o)->this_hdr;
9331               if (hdr->sh_type == SHT_ARM_EXIDX
9332                   && hdr->sh_link
9333                   && hdr->sh_link < elf_numsections (sub)
9334                   && !o->gc_mark
9335                   && elf_shdrp[hdr->sh_link]->bfd_section->gc_mark)
9336                 {
9337                   again = TRUE;
9338                   if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
9339                     return FALSE;
9340                 }
9341             }
9342         }
9343     }
9344
9345   return TRUE;
9346 }
9347
9348 /* Treat mapping symbols as special target symbols.  */
9349
9350 static bfd_boolean
9351 elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
9352 {
9353   return bfd_is_arm_special_symbol_name (sym->name,
9354                                          BFD_ARM_SPECIAL_SYM_TYPE_ANY);
9355 }
9356
9357 /* This is a copy of elf_find_function() from elf.c except that
9358    ARM mapping symbols are ignored when looking for function names
9359    and STT_ARM_TFUNC is considered to a function type.  */
9360
9361 static bfd_boolean
9362 arm_elf_find_function (bfd *         abfd ATTRIBUTE_UNUSED,
9363                        asection *    section,
9364                        asymbol **    symbols,
9365                        bfd_vma       offset,
9366                        const char ** filename_ptr,
9367                        const char ** functionname_ptr)
9368 {
9369   const char * filename = NULL;
9370   asymbol * func = NULL;
9371   bfd_vma low_func = 0;
9372   asymbol ** p;
9373
9374   for (p = symbols; *p != NULL; p++)
9375     {
9376       elf_symbol_type *q;
9377
9378       q = (elf_symbol_type *) *p;
9379
9380       switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
9381         {
9382         default:
9383           break;
9384         case STT_FILE:
9385           filename = bfd_asymbol_name (&q->symbol);
9386           break;
9387         case STT_FUNC:
9388         case STT_ARM_TFUNC:
9389         case STT_NOTYPE:
9390           /* Skip mapping symbols.  */
9391           if ((q->symbol.flags & BSF_LOCAL)
9392               && bfd_is_arm_special_symbol_name (q->symbol.name,
9393                     BFD_ARM_SPECIAL_SYM_TYPE_ANY))
9394             continue;
9395           /* Fall through.  */
9396           if (bfd_get_section (&q->symbol) == section
9397               && q->symbol.value >= low_func
9398               && q->symbol.value <= offset)
9399             {
9400               func = (asymbol *) q;
9401               low_func = q->symbol.value;
9402             }
9403           break;
9404         }
9405     }
9406
9407   if (func == NULL)
9408     return FALSE;
9409
9410   if (filename_ptr)
9411     *filename_ptr = filename;
9412   if (functionname_ptr)
9413     *functionname_ptr = bfd_asymbol_name (func);
9414
9415   return TRUE;
9416 }
9417
9418
9419 /* Find the nearest line to a particular section and offset, for error
9420    reporting.   This code is a duplicate of the code in elf.c, except
9421    that it uses arm_elf_find_function.  */
9422
9423 static bfd_boolean
9424 elf32_arm_find_nearest_line (bfd *          abfd,
9425                              asection *     section,
9426                              asymbol **     symbols,
9427                              bfd_vma        offset,
9428                              const char **  filename_ptr,
9429                              const char **  functionname_ptr,
9430                              unsigned int * line_ptr)
9431 {
9432   bfd_boolean found = FALSE;
9433
9434   /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it.  */
9435
9436   if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
9437                                      filename_ptr, functionname_ptr,
9438                                      line_ptr, 0,
9439                                      & elf_tdata (abfd)->dwarf2_find_line_info))
9440     {
9441       if (!*functionname_ptr)
9442         arm_elf_find_function (abfd, section, symbols, offset,
9443                                *filename_ptr ? NULL : filename_ptr,
9444                                functionname_ptr);
9445
9446       return TRUE;
9447     }
9448
9449   if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
9450                                              & found, filename_ptr,
9451                                              functionname_ptr, line_ptr,
9452                                              & elf_tdata (abfd)->line_info))
9453     return FALSE;
9454
9455   if (found && (*functionname_ptr || *line_ptr))
9456     return TRUE;
9457
9458   if (symbols == NULL)
9459     return FALSE;
9460
9461   if (! arm_elf_find_function (abfd, section, symbols, offset,
9462                                filename_ptr, functionname_ptr))
9463     return FALSE;
9464
9465   *line_ptr = 0;
9466   return TRUE;
9467 }
9468
9469 static bfd_boolean
9470 elf32_arm_find_inliner_info (bfd *          abfd,
9471                              const char **  filename_ptr,
9472                              const char **  functionname_ptr,
9473                              unsigned int * line_ptr)
9474 {
9475   bfd_boolean found;
9476   found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
9477                                          functionname_ptr, line_ptr,
9478                                          & elf_tdata (abfd)->dwarf2_find_line_info);
9479   return found;
9480 }
9481
9482 /* Adjust a symbol defined by a dynamic object and referenced by a
9483    regular object.  The current definition is in some section of the
9484    dynamic object, but we're not including those sections.  We have to
9485    change the definition to something the rest of the link can
9486    understand.  */
9487
9488 static bfd_boolean
9489 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
9490                                  struct elf_link_hash_entry * h)
9491 {
9492   bfd * dynobj;
9493   asection * s;
9494   struct elf32_arm_link_hash_entry * eh;
9495   struct elf32_arm_link_hash_table *globals;
9496
9497   globals = elf32_arm_hash_table (info);
9498   dynobj = elf_hash_table (info)->dynobj;
9499
9500   /* Make sure we know what is going on here.  */
9501   BFD_ASSERT (dynobj != NULL
9502               && (h->needs_plt
9503                   || h->u.weakdef != NULL
9504                   || (h->def_dynamic
9505                       && h->ref_regular
9506                       && !h->def_regular)));
9507
9508   eh = (struct elf32_arm_link_hash_entry *) h;
9509
9510   /* If this is a function, put it in the procedure linkage table.  We
9511      will fill in the contents of the procedure linkage table later,
9512      when we know the address of the .got section.  */
9513   if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC
9514       || h->needs_plt)
9515     {
9516       if (h->plt.refcount <= 0
9517           || SYMBOL_CALLS_LOCAL (info, h)
9518           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
9519               && h->root.type == bfd_link_hash_undefweak))
9520         {
9521           /* This case can occur if we saw a PLT32 reloc in an input
9522              file, but the symbol was never referred to by a dynamic
9523              object, or if all references were garbage collected.  In
9524              such a case, we don't actually need to build a procedure
9525              linkage table, and we can just do a PC24 reloc instead.  */
9526           h->plt.offset = (bfd_vma) -1;
9527           eh->plt_thumb_refcount = 0;
9528           eh->plt_maybe_thumb_refcount = 0;
9529           h->needs_plt = 0;
9530         }
9531
9532       return TRUE;
9533     }
9534   else
9535     {
9536       /* It's possible that we incorrectly decided a .plt reloc was
9537          needed for an R_ARM_PC24 or similar reloc to a non-function sym
9538          in check_relocs.  We can't decide accurately between function
9539          and non-function syms in check-relocs; Objects loaded later in
9540          the link may change h->type.  So fix it now.  */
9541       h->plt.offset = (bfd_vma) -1;
9542       eh->plt_thumb_refcount = 0;
9543       eh->plt_maybe_thumb_refcount = 0;
9544     }
9545
9546   /* If this is a weak symbol, and there is a real definition, the
9547      processor independent code will have arranged for us to see the
9548      real definition first, and we can just use the same value.  */
9549   if (h->u.weakdef != NULL)
9550     {
9551       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
9552                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
9553       h->root.u.def.section = h->u.weakdef->root.u.def.section;
9554       h->root.u.def.value = h->u.weakdef->root.u.def.value;
9555       return TRUE;
9556     }
9557
9558   /* If there are no non-GOT references, we do not need a copy
9559      relocation.  */
9560   if (!h->non_got_ref)
9561     return TRUE;
9562
9563   /* This is a reference to a symbol defined by a dynamic object which
9564      is not a function.  */
9565
9566   /* If we are creating a shared library, we must presume that the
9567      only references to the symbol are via the global offset table.
9568      For such cases we need not do anything here; the relocations will
9569      be handled correctly by relocate_section.  Relocatable executables
9570      can reference data in shared objects directly, so we don't need to
9571      do anything here.  */
9572   if (info->shared || globals->root.is_relocatable_executable)
9573     return TRUE;
9574
9575   if (h->size == 0)
9576     {
9577       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
9578                              h->root.root.string);
9579       return TRUE;
9580     }
9581
9582   /* We must allocate the symbol in our .dynbss section, which will
9583      become part of the .bss section of the executable.  There will be
9584      an entry for this symbol in the .dynsym section.  The dynamic
9585      object will contain position independent code, so all references
9586      from the dynamic object to this symbol will go through the global
9587      offset table.  The dynamic linker will use the .dynsym entry to
9588      determine the address it must put in the global offset table, so
9589      both the dynamic object and the regular object will refer to the
9590      same memory location for the variable.  */
9591   s = bfd_get_section_by_name (dynobj, ".dynbss");
9592   BFD_ASSERT (s != NULL);
9593
9594   /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
9595      copy the initial value out of the dynamic object and into the
9596      runtime process image.  We need to remember the offset into the
9597      .rel(a).bss section we are going to use.  */
9598   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
9599     {
9600       asection *srel;
9601
9602       srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (globals, ".bss"));
9603       BFD_ASSERT (srel != NULL);
9604       srel->size += RELOC_SIZE (globals);
9605       h->needs_copy = 1;
9606     }
9607
9608   return _bfd_elf_adjust_dynamic_copy (h, s);
9609 }
9610
9611 /* Allocate space in .plt, .got and associated reloc sections for
9612    dynamic relocs.  */
9613
9614 static bfd_boolean
9615 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
9616 {
9617   struct bfd_link_info *info;
9618   struct elf32_arm_link_hash_table *htab;
9619   struct elf32_arm_link_hash_entry *eh;
9620   struct elf32_arm_relocs_copied *p;
9621   bfd_signed_vma thumb_refs;
9622
9623   eh = (struct elf32_arm_link_hash_entry *) h;
9624
9625   if (h->root.type == bfd_link_hash_indirect)
9626     return TRUE;
9627
9628   if (h->root.type == bfd_link_hash_warning)
9629     /* When warning symbols are created, they **replace** the "real"
9630        entry in the hash table, thus we never get to see the real
9631        symbol in a hash traversal.  So look at it now.  */
9632     h = (struct elf_link_hash_entry *) h->root.u.i.link;
9633
9634   info = (struct bfd_link_info *) inf;
9635   htab = elf32_arm_hash_table (info);
9636
9637   if (htab->root.dynamic_sections_created
9638       && h->plt.refcount > 0)
9639     {
9640       /* Make sure this symbol is output as a dynamic symbol.
9641          Undefined weak syms won't yet be marked as dynamic.  */
9642       if (h->dynindx == -1
9643           && !h->forced_local)
9644         {
9645           if (! bfd_elf_link_record_dynamic_symbol (info, h))
9646             return FALSE;
9647         }
9648
9649       if (info->shared
9650           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
9651         {
9652           asection *s = htab->splt;
9653
9654           /* If this is the first .plt entry, make room for the special
9655              first entry.  */
9656           if (s->size == 0)
9657             s->size += htab->plt_header_size;
9658
9659           h->plt.offset = s->size;
9660
9661           /* If we will insert a Thumb trampoline before this PLT, leave room
9662              for it.  */
9663           thumb_refs = eh->plt_thumb_refcount;
9664           if (!htab->use_blx)
9665             thumb_refs += eh->plt_maybe_thumb_refcount;
9666
9667           if (thumb_refs > 0)
9668             {
9669               h->plt.offset += PLT_THUMB_STUB_SIZE;
9670               s->size += PLT_THUMB_STUB_SIZE;
9671             }
9672
9673           /* If this symbol is not defined in a regular file, and we are
9674              not generating a shared library, then set the symbol to this
9675              location in the .plt.  This is required to make function
9676              pointers compare as equal between the normal executable and
9677              the shared library.  */
9678           if (! info->shared
9679               && !h->def_regular)
9680             {
9681               h->root.u.def.section = s;
9682               h->root.u.def.value = h->plt.offset;
9683
9684               /* Make sure the function is not marked as Thumb, in case
9685                  it is the target of an ABS32 relocation, which will
9686                  point to the PLT entry.  */
9687               if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
9688                 h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
9689             }
9690
9691           /* Make room for this entry.  */
9692           s->size += htab->plt_entry_size;
9693
9694           if (!htab->symbian_p)
9695             {
9696               /* We also need to make an entry in the .got.plt section, which
9697                  will be placed in the .got section by the linker script.  */
9698               eh->plt_got_offset = htab->sgotplt->size;
9699               htab->sgotplt->size += 4;
9700             }
9701
9702           /* We also need to make an entry in the .rel(a).plt section.  */
9703           htab->srelplt->size += RELOC_SIZE (htab);
9704
9705           /* VxWorks executables have a second set of relocations for
9706              each PLT entry.  They go in a separate relocation section,
9707              which is processed by the kernel loader.  */
9708           if (htab->vxworks_p && !info->shared)
9709             {
9710               /* There is a relocation for the initial PLT entry:
9711                  an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_.  */
9712               if (h->plt.offset == htab->plt_header_size)
9713                 htab->srelplt2->size += RELOC_SIZE (htab);
9714
9715               /* There are two extra relocations for each subsequent
9716                  PLT entry: an R_ARM_32 relocation for the GOT entry,
9717                  and an R_ARM_32 relocation for the PLT entry.  */
9718               htab->srelplt2->size += RELOC_SIZE (htab) * 2;
9719             }
9720         }
9721       else
9722         {
9723           h->plt.offset = (bfd_vma) -1;
9724           h->needs_plt = 0;
9725         }
9726     }
9727   else
9728     {
9729       h->plt.offset = (bfd_vma) -1;
9730       h->needs_plt = 0;
9731     }
9732
9733   if (h->got.refcount > 0)
9734     {
9735       asection *s;
9736       bfd_boolean dyn;
9737       int tls_type = elf32_arm_hash_entry (h)->tls_type;
9738       int indx;
9739
9740       /* Make sure this symbol is output as a dynamic symbol.
9741          Undefined weak syms won't yet be marked as dynamic.  */
9742       if (h->dynindx == -1
9743           && !h->forced_local)
9744         {
9745           if (! bfd_elf_link_record_dynamic_symbol (info, h))
9746             return FALSE;
9747         }
9748
9749       if (!htab->symbian_p)
9750         {
9751           s = htab->sgot;
9752           h->got.offset = s->size;
9753
9754           if (tls_type == GOT_UNKNOWN)
9755             abort ();
9756
9757           if (tls_type == GOT_NORMAL)
9758             /* Non-TLS symbols need one GOT slot.  */
9759             s->size += 4;
9760           else
9761             {
9762               if (tls_type & GOT_TLS_GD)
9763                 /* R_ARM_TLS_GD32 needs 2 consecutive GOT slots.  */
9764                 s->size += 8;
9765               if (tls_type & GOT_TLS_IE)
9766                 /* R_ARM_TLS_IE32 needs one GOT slot.  */
9767                 s->size += 4;
9768             }
9769
9770           dyn = htab->root.dynamic_sections_created;
9771
9772           indx = 0;
9773           if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
9774               && (!info->shared
9775                   || !SYMBOL_REFERENCES_LOCAL (info, h)))
9776             indx = h->dynindx;
9777
9778           if (tls_type != GOT_NORMAL
9779               && (info->shared || indx != 0)
9780               && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9781                   || h->root.type != bfd_link_hash_undefweak))
9782             {
9783               if (tls_type & GOT_TLS_IE)
9784                 htab->srelgot->size += RELOC_SIZE (htab);
9785
9786               if (tls_type & GOT_TLS_GD)
9787                 htab->srelgot->size += RELOC_SIZE (htab);
9788
9789               if ((tls_type & GOT_TLS_GD) && indx != 0)
9790                 htab->srelgot->size += RELOC_SIZE (htab);
9791             }
9792           else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9793                     || h->root.type != bfd_link_hash_undefweak)
9794                    && (info->shared
9795                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
9796             htab->srelgot->size += RELOC_SIZE (htab);
9797         }
9798     }
9799   else
9800     h->got.offset = (bfd_vma) -1;
9801
9802   /* Allocate stubs for exported Thumb functions on v4t.  */
9803   if (!htab->use_blx && h->dynindx != -1
9804       && h->def_regular
9805       && ELF_ST_TYPE (h->type) == STT_ARM_TFUNC
9806       && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9807     {
9808       struct elf_link_hash_entry * th;
9809       struct bfd_link_hash_entry * bh;
9810       struct elf_link_hash_entry * myh;
9811       char name[1024];
9812       asection *s;
9813       bh = NULL;
9814       /* Create a new symbol to regist the real location of the function.  */
9815       s = h->root.u.def.section;
9816       sprintf (name, "__real_%s", h->root.root.string);
9817       _bfd_generic_link_add_one_symbol (info, s->owner,
9818                                         name, BSF_GLOBAL, s,
9819                                         h->root.u.def.value,
9820                                         NULL, TRUE, FALSE, &bh);
9821
9822       myh = (struct elf_link_hash_entry *) bh;
9823       myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
9824       myh->forced_local = 1;
9825       eh->export_glue = myh;
9826       th = record_arm_to_thumb_glue (info, h);
9827       /* Point the symbol at the stub.  */
9828       h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
9829       h->root.u.def.section = th->root.u.def.section;
9830       h->root.u.def.value = th->root.u.def.value & ~1;
9831     }
9832
9833   if (eh->relocs_copied == NULL)
9834     return TRUE;
9835
9836   /* In the shared -Bsymbolic case, discard space allocated for
9837      dynamic pc-relative relocs against symbols which turn out to be
9838      defined in regular objects.  For the normal shared case, discard
9839      space for pc-relative relocs that have become local due to symbol
9840      visibility changes.  */
9841
9842   if (info->shared || htab->root.is_relocatable_executable)
9843     {
9844       /* The only relocs that use pc_count are R_ARM_REL32 and
9845          R_ARM_REL32_NOI, which will appear on something like
9846          ".long foo - .".  We want calls to protected symbols to resolve
9847          directly to the function rather than going via the plt.  If people
9848          want function pointer comparisons to work as expected then they
9849          should avoid writing assembly like ".long foo - .".  */
9850       if (SYMBOL_CALLS_LOCAL (info, h))
9851         {
9852           struct elf32_arm_relocs_copied **pp;
9853
9854           for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
9855             {
9856               p->count -= p->pc_count;
9857               p->pc_count = 0;
9858               if (p->count == 0)
9859                 *pp = p->next;
9860               else
9861                 pp = &p->next;
9862             }
9863         }
9864
9865       if (elf32_arm_hash_table (info)->vxworks_p)
9866         {
9867           struct elf32_arm_relocs_copied **pp;
9868
9869           for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
9870             {
9871               if (strcmp (p->section->output_section->name, ".tls_vars") == 0)
9872                 *pp = p->next;
9873               else
9874                 pp = &p->next;
9875             }
9876         }
9877
9878       /* Also discard relocs on undefined weak syms with non-default
9879          visibility.  */
9880       if (eh->relocs_copied != NULL
9881           && h->root.type == bfd_link_hash_undefweak)
9882         {
9883           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9884             eh->relocs_copied = NULL;
9885
9886           /* Make sure undefined weak symbols are output as a dynamic
9887              symbol in PIEs.  */
9888           else if (h->dynindx == -1
9889                    && !h->forced_local)
9890             {
9891               if (! bfd_elf_link_record_dynamic_symbol (info, h))
9892                 return FALSE;
9893             }
9894         }
9895
9896       else if (htab->root.is_relocatable_executable && h->dynindx == -1
9897                && h->root.type == bfd_link_hash_new)
9898         {
9899           /* Output absolute symbols so that we can create relocations
9900              against them.  For normal symbols we output a relocation
9901              against the section that contains them.  */
9902           if (! bfd_elf_link_record_dynamic_symbol (info, h))
9903             return FALSE;
9904         }
9905
9906     }
9907   else
9908     {
9909       /* For the non-shared case, discard space for relocs against
9910          symbols which turn out to need copy relocs or are not
9911          dynamic.  */
9912
9913       if (!h->non_got_ref
9914           && ((h->def_dynamic
9915                && !h->def_regular)
9916               || (htab->root.dynamic_sections_created
9917                   && (h->root.type == bfd_link_hash_undefweak
9918                       || h->root.type == bfd_link_hash_undefined))))
9919         {
9920           /* Make sure this symbol is output as a dynamic symbol.
9921              Undefined weak syms won't yet be marked as dynamic.  */
9922           if (h->dynindx == -1
9923               && !h->forced_local)
9924             {
9925               if (! bfd_elf_link_record_dynamic_symbol (info, h))
9926                 return FALSE;
9927             }
9928
9929           /* If that succeeded, we know we'll be keeping all the
9930              relocs.  */
9931           if (h->dynindx != -1)
9932             goto keep;
9933         }
9934
9935       eh->relocs_copied = NULL;
9936
9937     keep: ;
9938     }
9939
9940   /* Finally, allocate space.  */
9941   for (p = eh->relocs_copied; p != NULL; p = p->next)
9942     {
9943       asection *sreloc = elf_section_data (p->section)->sreloc;
9944       sreloc->size += p->count * RELOC_SIZE (htab);
9945     }
9946
9947   return TRUE;
9948 }
9949
9950 /* Find any dynamic relocs that apply to read-only sections.  */
9951
9952 static bfd_boolean
9953 elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry * h, void * inf)
9954 {
9955   struct elf32_arm_link_hash_entry * eh;
9956   struct elf32_arm_relocs_copied * p;
9957
9958   if (h->root.type == bfd_link_hash_warning)
9959     h = (struct elf_link_hash_entry *) h->root.u.i.link;
9960
9961   eh = (struct elf32_arm_link_hash_entry *) h;
9962   for (p = eh->relocs_copied; p != NULL; p = p->next)
9963     {
9964       asection *s = p->section;
9965
9966       if (s != NULL && (s->flags & SEC_READONLY) != 0)
9967         {
9968           struct bfd_link_info *info = (struct bfd_link_info *) inf;
9969
9970           info->flags |= DF_TEXTREL;
9971
9972           /* Not an error, just cut short the traversal.  */
9973           return FALSE;
9974         }
9975     }
9976   return TRUE;
9977 }
9978
9979 void
9980 bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *info,
9981                                  int byteswap_code)
9982 {
9983   struct elf32_arm_link_hash_table *globals;
9984
9985   globals = elf32_arm_hash_table (info);
9986   globals->byteswap_code = byteswap_code;
9987 }
9988
9989 /* Set the sizes of the dynamic sections.  */
9990
9991 static bfd_boolean
9992 elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
9993                                  struct bfd_link_info * info)
9994 {
9995   bfd * dynobj;
9996   asection * s;
9997   bfd_boolean plt;
9998   bfd_boolean relocs;
9999   bfd *ibfd;
10000   struct elf32_arm_link_hash_table *htab;
10001
10002   htab = elf32_arm_hash_table (info);
10003   dynobj = elf_hash_table (info)->dynobj;
10004   BFD_ASSERT (dynobj != NULL);
10005   check_use_blx (htab);
10006
10007   if (elf_hash_table (info)->dynamic_sections_created)
10008     {
10009       /* Set the contents of the .interp section to the interpreter.  */
10010       if (info->executable)
10011         {
10012           s = bfd_get_section_by_name (dynobj, ".interp");
10013           BFD_ASSERT (s != NULL);
10014           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
10015           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
10016         }
10017     }
10018
10019   /* Set up .got offsets for local syms, and space for local dynamic
10020      relocs.  */
10021   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10022     {
10023       bfd_signed_vma *local_got;
10024       bfd_signed_vma *end_local_got;
10025       char *local_tls_type;
10026       bfd_size_type locsymcount;
10027       Elf_Internal_Shdr *symtab_hdr;
10028       asection *srel;
10029       bfd_boolean is_vxworks = elf32_arm_hash_table (info)->vxworks_p;
10030
10031       if (! is_arm_elf (ibfd))
10032         continue;
10033
10034       for (s = ibfd->sections; s != NULL; s = s->next)
10035         {
10036           struct elf32_arm_relocs_copied *p;
10037
10038           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
10039             {
10040               if (!bfd_is_abs_section (p->section)
10041                   && bfd_is_abs_section (p->section->output_section))
10042                 {
10043                   /* Input section has been discarded, either because
10044                      it is a copy of a linkonce section or due to
10045                      linker script /DISCARD/, so we'll be discarding
10046                      the relocs too.  */
10047                 }
10048               else if (is_vxworks
10049                        && strcmp (p->section->output_section->name,
10050                                   ".tls_vars") == 0)
10051                 {
10052                   /* Relocations in vxworks .tls_vars sections are
10053                      handled specially by the loader.  */
10054                 }
10055               else if (p->count != 0)
10056                 {
10057                   srel = elf_section_data (p->section)->sreloc;
10058                   srel->size += p->count * RELOC_SIZE (htab);
10059                   if ((p->section->output_section->flags & SEC_READONLY) != 0)
10060                     info->flags |= DF_TEXTREL;
10061                 }
10062             }
10063         }
10064
10065       local_got = elf_local_got_refcounts (ibfd);
10066       if (!local_got)
10067         continue;
10068
10069       symtab_hdr = & elf_symtab_hdr (ibfd);
10070       locsymcount = symtab_hdr->sh_info;
10071       end_local_got = local_got + locsymcount;
10072       local_tls_type = elf32_arm_local_got_tls_type (ibfd);
10073       s = htab->sgot;
10074       srel = htab->srelgot;
10075       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
10076         {
10077           if (*local_got > 0)
10078             {
10079               *local_got = s->size;
10080               if (*local_tls_type & GOT_TLS_GD)
10081                 /* TLS_GD relocs need an 8-byte structure in the GOT.  */
10082                 s->size += 8;
10083               if (*local_tls_type & GOT_TLS_IE)
10084                 s->size += 4;
10085               if (*local_tls_type == GOT_NORMAL)
10086                 s->size += 4;
10087
10088               if (info->shared || *local_tls_type == GOT_TLS_GD)
10089                 srel->size += RELOC_SIZE (htab);
10090             }
10091           else
10092             *local_got = (bfd_vma) -1;
10093         }
10094     }
10095
10096   if (htab->tls_ldm_got.refcount > 0)
10097     {
10098       /* Allocate two GOT entries and one dynamic relocation (if necessary)
10099          for R_ARM_TLS_LDM32 relocations.  */
10100       htab->tls_ldm_got.offset = htab->sgot->size;
10101       htab->sgot->size += 8;
10102       if (info->shared)
10103         htab->srelgot->size += RELOC_SIZE (htab);
10104     }
10105   else
10106     htab->tls_ldm_got.offset = -1;
10107
10108   /* Allocate global sym .plt and .got entries, and space for global
10109      sym dynamic relocs.  */
10110   elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
10111
10112   /* Here we rummage through the found bfds to collect glue information.  */
10113   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10114     {
10115       if (! is_arm_elf (ibfd))
10116         continue;
10117
10118       /* Initialise mapping tables for code/data.  */
10119       bfd_elf32_arm_init_maps (ibfd);
10120
10121       if (!bfd_elf32_arm_process_before_allocation (ibfd, info)
10122           || !bfd_elf32_arm_vfp11_erratum_scan (ibfd, info))
10123         /* xgettext:c-format */
10124         _bfd_error_handler (_("Errors encountered processing file %s"),
10125                             ibfd->filename);
10126     }
10127
10128   /* The check_relocs and adjust_dynamic_symbol entry points have
10129      determined the sizes of the various dynamic sections.  Allocate
10130      memory for them.  */
10131   plt = FALSE;
10132   relocs = FALSE;
10133   for (s = dynobj->sections; s != NULL; s = s->next)
10134     {
10135       const char * name;
10136
10137       if ((s->flags & SEC_LINKER_CREATED) == 0)
10138         continue;
10139
10140       /* It's OK to base decisions on the section name, because none
10141          of the dynobj section names depend upon the input files.  */
10142       name = bfd_get_section_name (dynobj, s);
10143
10144       if (strcmp (name, ".plt") == 0)
10145         {
10146           /* Remember whether there is a PLT.  */
10147           plt = s->size != 0;
10148         }
10149       else if (CONST_STRNEQ (name, ".rel"))
10150         {
10151           if (s->size != 0)
10152             {
10153               /* Remember whether there are any reloc sections other
10154                  than .rel(a).plt and .rela.plt.unloaded.  */
10155               if (s != htab->srelplt && s != htab->srelplt2)
10156                 relocs = TRUE;
10157
10158               /* We use the reloc_count field as a counter if we need
10159                  to copy relocs into the output file.  */
10160               s->reloc_count = 0;
10161             }
10162         }
10163       else if (! CONST_STRNEQ (name, ".got")
10164                && strcmp (name, ".dynbss") != 0)
10165         {
10166           /* It's not one of our sections, so don't allocate space.  */
10167           continue;
10168         }
10169
10170       if (s->size == 0)
10171         {
10172           /* If we don't need this section, strip it from the
10173              output file.  This is mostly to handle .rel(a).bss and
10174              .rel(a).plt.  We must create both sections in
10175              create_dynamic_sections, because they must be created
10176              before the linker maps input sections to output
10177              sections.  The linker does that before
10178              adjust_dynamic_symbol is called, and it is that
10179              function which decides whether anything needs to go
10180              into these sections.  */
10181           s->flags |= SEC_EXCLUDE;
10182           continue;
10183         }
10184
10185       if ((s->flags & SEC_HAS_CONTENTS) == 0)
10186         continue;
10187
10188       /* Allocate memory for the section contents.  */
10189       s->contents = bfd_zalloc (dynobj, s->size);
10190       if (s->contents == NULL)
10191         return FALSE;
10192     }
10193
10194   if (elf_hash_table (info)->dynamic_sections_created)
10195     {
10196       /* Add some entries to the .dynamic section.  We fill in the
10197          values later, in elf32_arm_finish_dynamic_sections, but we
10198          must add the entries now so that we get the correct size for
10199          the .dynamic section.  The DT_DEBUG entry is filled in by the
10200          dynamic linker and used by the debugger.  */
10201 #define add_dynamic_entry(TAG, VAL) \
10202   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
10203
10204      if (info->executable)
10205         {
10206           if (!add_dynamic_entry (DT_DEBUG, 0))
10207             return FALSE;
10208         }
10209
10210       if (plt)
10211         {
10212           if (   !add_dynamic_entry (DT_PLTGOT, 0)
10213               || !add_dynamic_entry (DT_PLTRELSZ, 0)
10214               || !add_dynamic_entry (DT_PLTREL,
10215                                      htab->use_rel ? DT_REL : DT_RELA)
10216               || !add_dynamic_entry (DT_JMPREL, 0))
10217             return FALSE;
10218         }
10219
10220       if (relocs)
10221         {
10222           if (htab->use_rel)
10223             {
10224               if (!add_dynamic_entry (DT_REL, 0)
10225                   || !add_dynamic_entry (DT_RELSZ, 0)
10226                   || !add_dynamic_entry (DT_RELENT, RELOC_SIZE (htab)))
10227                 return FALSE;
10228             }
10229           else
10230             {
10231               if (!add_dynamic_entry (DT_RELA, 0)
10232                   || !add_dynamic_entry (DT_RELASZ, 0)
10233                   || !add_dynamic_entry (DT_RELAENT, RELOC_SIZE (htab)))
10234                 return FALSE;
10235             }
10236         }
10237
10238       /* If any dynamic relocs apply to a read-only section,
10239          then we need a DT_TEXTREL entry.  */
10240       if ((info->flags & DF_TEXTREL) == 0)
10241         elf_link_hash_traverse (& htab->root, elf32_arm_readonly_dynrelocs,
10242                                 info);
10243
10244       if ((info->flags & DF_TEXTREL) != 0)
10245         {
10246           if (!add_dynamic_entry (DT_TEXTREL, 0))
10247             return FALSE;
10248         }
10249       if (htab->vxworks_p
10250           && !elf_vxworks_add_dynamic_entries (output_bfd, info))
10251         return FALSE;
10252     }
10253 #undef add_dynamic_entry
10254
10255   return TRUE;
10256 }
10257
10258 /* Finish up dynamic symbol handling.  We set the contents of various
10259    dynamic sections here.  */
10260
10261 static bfd_boolean
10262 elf32_arm_finish_dynamic_symbol (bfd * output_bfd,
10263                                  struct bfd_link_info * info,
10264                                  struct elf_link_hash_entry * h,
10265                                  Elf_Internal_Sym * sym)
10266 {
10267   bfd * dynobj;
10268   struct elf32_arm_link_hash_table *htab;
10269   struct elf32_arm_link_hash_entry *eh;
10270
10271   dynobj = elf_hash_table (info)->dynobj;
10272   htab = elf32_arm_hash_table (info);
10273   eh = (struct elf32_arm_link_hash_entry *) h;
10274
10275   if (h->plt.offset != (bfd_vma) -1)
10276     {
10277       asection * splt;
10278       asection * srel;
10279       bfd_byte *loc;
10280       bfd_vma plt_index;
10281       Elf_Internal_Rela rel;
10282
10283       /* This symbol has an entry in the procedure linkage table.  Set
10284          it up.  */
10285
10286       BFD_ASSERT (h->dynindx != -1);
10287
10288       splt = bfd_get_section_by_name (dynobj, ".plt");
10289       srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (htab, ".plt"));
10290       BFD_ASSERT (splt != NULL && srel != NULL);
10291
10292       /* Fill in the entry in the procedure linkage table.  */
10293       if (htab->symbian_p)
10294         {
10295           put_arm_insn (htab, output_bfd,
10296                       elf32_arm_symbian_plt_entry[0],
10297                       splt->contents + h->plt.offset);
10298           bfd_put_32 (output_bfd,
10299                       elf32_arm_symbian_plt_entry[1],
10300                       splt->contents + h->plt.offset + 4);
10301
10302           /* Fill in the entry in the .rel.plt section.  */
10303           rel.r_offset = (splt->output_section->vma
10304                           + splt->output_offset
10305                           + h->plt.offset + 4);
10306           rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
10307
10308           /* Get the index in the procedure linkage table which
10309              corresponds to this symbol.  This is the index of this symbol
10310              in all the symbols for which we are making plt entries.  The
10311              first entry in the procedure linkage table is reserved.  */
10312           plt_index = ((h->plt.offset - htab->plt_header_size)
10313                        / htab->plt_entry_size);
10314         }
10315       else
10316         {
10317           bfd_vma got_offset, got_address, plt_address;
10318           bfd_vma got_displacement;
10319           asection * sgot;
10320           bfd_byte * ptr;
10321
10322           sgot = bfd_get_section_by_name (dynobj, ".got.plt");
10323           BFD_ASSERT (sgot != NULL);
10324
10325           /* Get the offset into the .got.plt table of the entry that
10326              corresponds to this function.  */
10327           got_offset = eh->plt_got_offset;
10328
10329           /* Get the index in the procedure linkage table which
10330              corresponds to this symbol.  This is the index of this symbol
10331              in all the symbols for which we are making plt entries.  The
10332              first three entries in .got.plt are reserved; after that
10333              symbols appear in the same order as in .plt.  */
10334           plt_index = (got_offset - 12) / 4;
10335
10336           /* Calculate the address of the GOT entry.  */
10337           got_address = (sgot->output_section->vma
10338                          + sgot->output_offset
10339                          + got_offset);
10340
10341           /* ...and the address of the PLT entry.  */
10342           plt_address = (splt->output_section->vma
10343                          + splt->output_offset
10344                          + h->plt.offset);
10345
10346           ptr = htab->splt->contents + h->plt.offset;
10347           if (htab->vxworks_p && info->shared)
10348             {
10349               unsigned int i;
10350               bfd_vma val;
10351
10352               for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
10353                 {
10354                   val = elf32_arm_vxworks_shared_plt_entry[i];
10355                   if (i == 2)
10356                     val |= got_address - sgot->output_section->vma;
10357                   if (i == 5)
10358                     val |= plt_index * RELOC_SIZE (htab);
10359                   if (i == 2 || i == 5)
10360                     bfd_put_32 (output_bfd, val, ptr);
10361                   else
10362                     put_arm_insn (htab, output_bfd, val, ptr);
10363                 }
10364             }
10365           else if (htab->vxworks_p)
10366             {
10367               unsigned int i;
10368               bfd_vma val;
10369
10370               for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
10371                 {
10372                   val = elf32_arm_vxworks_exec_plt_entry[i];
10373                   if (i == 2)
10374                     val |= got_address;
10375                   if (i == 4)
10376                     val |= 0xffffff & -((h->plt.offset + i * 4 + 8) >> 2);
10377                   if (i == 5)
10378                     val |= plt_index * RELOC_SIZE (htab);
10379                   if (i == 2 || i == 5)
10380                     bfd_put_32 (output_bfd, val, ptr);
10381                   else
10382                     put_arm_insn (htab, output_bfd, val, ptr);
10383                 }
10384
10385               loc = (htab->srelplt2->contents
10386                      + (plt_index * 2 + 1) * RELOC_SIZE (htab));
10387
10388               /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
10389                  referencing the GOT for this PLT entry.  */
10390               rel.r_offset = plt_address + 8;
10391               rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
10392               rel.r_addend = got_offset;
10393               SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10394               loc += RELOC_SIZE (htab);
10395
10396               /* Create the R_ARM_ABS32 relocation referencing the
10397                  beginning of the PLT for this GOT entry.  */
10398               rel.r_offset = got_address;
10399               rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
10400               rel.r_addend = 0;
10401               SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10402             }
10403           else
10404             {
10405               bfd_signed_vma thumb_refs;
10406               /* Calculate the displacement between the PLT slot and the
10407                  entry in the GOT.  The eight-byte offset accounts for the
10408                  value produced by adding to pc in the first instruction
10409                  of the PLT stub.  */
10410               got_displacement = got_address - (plt_address + 8);
10411
10412               BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
10413
10414               thumb_refs = eh->plt_thumb_refcount;
10415               if (!htab->use_blx)
10416                 thumb_refs += eh->plt_maybe_thumb_refcount;
10417
10418               if (thumb_refs > 0)
10419                 {
10420                   put_thumb_insn (htab, output_bfd,
10421                                   elf32_arm_plt_thumb_stub[0], ptr - 4);
10422                   put_thumb_insn (htab, output_bfd,
10423                                   elf32_arm_plt_thumb_stub[1], ptr - 2);
10424                 }
10425
10426               put_arm_insn (htab, output_bfd,
10427                             elf32_arm_plt_entry[0]
10428                             | ((got_displacement & 0x0ff00000) >> 20),
10429                             ptr + 0);
10430               put_arm_insn (htab, output_bfd,
10431                             elf32_arm_plt_entry[1]
10432                             | ((got_displacement & 0x000ff000) >> 12),
10433                             ptr+ 4);
10434               put_arm_insn (htab, output_bfd,
10435                             elf32_arm_plt_entry[2]
10436                             | (got_displacement & 0x00000fff),
10437                             ptr + 8);
10438 #ifdef FOUR_WORD_PLT
10439               bfd_put_32 (output_bfd, elf32_arm_plt_entry[3], ptr + 12);
10440 #endif
10441             }
10442
10443           /* Fill in the entry in the global offset table.  */
10444           bfd_put_32 (output_bfd,
10445                       (splt->output_section->vma
10446                        + splt->output_offset),
10447                       sgot->contents + got_offset);
10448
10449           /* Fill in the entry in the .rel(a).plt section.  */
10450           rel.r_addend = 0;
10451           rel.r_offset = got_address;
10452           rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_JUMP_SLOT);
10453         }
10454
10455       loc = srel->contents + plt_index * RELOC_SIZE (htab);
10456       SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10457
10458       if (!h->def_regular)
10459         {
10460           /* Mark the symbol as undefined, rather than as defined in
10461              the .plt section.  Leave the value alone.  */
10462           sym->st_shndx = SHN_UNDEF;
10463           /* If the symbol is weak, we do need to clear the value.
10464              Otherwise, the PLT entry would provide a definition for
10465              the symbol even if the symbol wasn't defined anywhere,
10466              and so the symbol would never be NULL.  */
10467           if (!h->ref_regular_nonweak)
10468             sym->st_value = 0;
10469         }
10470     }
10471
10472   if (h->got.offset != (bfd_vma) -1
10473       && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
10474       && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
10475     {
10476       asection * sgot;
10477       asection * srel;
10478       Elf_Internal_Rela rel;
10479       bfd_byte *loc;
10480       bfd_vma offset;
10481
10482       /* This symbol has an entry in the global offset table.  Set it
10483          up.  */
10484       sgot = bfd_get_section_by_name (dynobj, ".got");
10485       srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (htab, ".got"));
10486       BFD_ASSERT (sgot != NULL && srel != NULL);
10487
10488       offset = (h->got.offset & ~(bfd_vma) 1);
10489       rel.r_addend = 0;
10490       rel.r_offset = (sgot->output_section->vma
10491                       + sgot->output_offset
10492                       + offset);
10493
10494       /* If this is a static link, or it is a -Bsymbolic link and the
10495          symbol is defined locally or was forced to be local because
10496          of a version file, we just want to emit a RELATIVE reloc.
10497          The entry in the global offset table will already have been
10498          initialized in the relocate_section function.  */
10499       if (info->shared
10500           && SYMBOL_REFERENCES_LOCAL (info, h))
10501         {
10502           BFD_ASSERT ((h->got.offset & 1) != 0);
10503           rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
10504           if (!htab->use_rel)
10505             {
10506               rel.r_addend = bfd_get_32 (output_bfd, sgot->contents + offset);
10507               bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
10508             }
10509         }
10510       else
10511         {
10512           BFD_ASSERT ((h->got.offset & 1) == 0);
10513           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
10514           rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
10515         }
10516
10517       loc = srel->contents + srel->reloc_count++ * RELOC_SIZE (htab);
10518       SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10519     }
10520
10521   if (h->needs_copy)
10522     {
10523       asection * s;
10524       Elf_Internal_Rela rel;
10525       bfd_byte *loc;
10526
10527       /* This symbol needs a copy reloc.  Set it up.  */
10528       BFD_ASSERT (h->dynindx != -1
10529                   && (h->root.type == bfd_link_hash_defined
10530                       || h->root.type == bfd_link_hash_defweak));
10531
10532       s = bfd_get_section_by_name (h->root.u.def.section->owner,
10533                                    RELOC_SECTION (htab, ".bss"));
10534       BFD_ASSERT (s != NULL);
10535
10536       rel.r_addend = 0;
10537       rel.r_offset = (h->root.u.def.value
10538                       + h->root.u.def.section->output_section->vma
10539                       + h->root.u.def.section->output_offset);
10540       rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
10541       loc = s->contents + s->reloc_count++ * RELOC_SIZE (htab);
10542       SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10543     }
10544
10545   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  On VxWorks,
10546      the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it is relative
10547      to the ".got" section.  */
10548   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
10549       || (!htab->vxworks_p && h == htab->root.hgot))
10550     sym->st_shndx = SHN_ABS;
10551
10552   return TRUE;
10553 }
10554
10555 /* Finish up the dynamic sections.  */
10556
10557 static bfd_boolean
10558 elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
10559 {
10560   bfd * dynobj;
10561   asection * sgot;
10562   asection * sdyn;
10563
10564   dynobj = elf_hash_table (info)->dynobj;
10565
10566   sgot = bfd_get_section_by_name (dynobj, ".got.plt");
10567   BFD_ASSERT (elf32_arm_hash_table (info)->symbian_p || sgot != NULL);
10568   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
10569
10570   if (elf_hash_table (info)->dynamic_sections_created)
10571     {
10572       asection *splt;
10573       Elf32_External_Dyn *dyncon, *dynconend;
10574       struct elf32_arm_link_hash_table *htab;
10575
10576       htab = elf32_arm_hash_table (info);
10577       splt = bfd_get_section_by_name (dynobj, ".plt");
10578       BFD_ASSERT (splt != NULL && sdyn != NULL);
10579
10580       dyncon = (Elf32_External_Dyn *) sdyn->contents;
10581       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
10582
10583       for (; dyncon < dynconend; dyncon++)
10584         {
10585           Elf_Internal_Dyn dyn;
10586           const char * name;
10587           asection * s;
10588
10589           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
10590
10591           switch (dyn.d_tag)
10592             {
10593               unsigned int type;
10594
10595             default:
10596               if (htab->vxworks_p
10597                   && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
10598                 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10599               break;
10600
10601             case DT_HASH:
10602               name = ".hash";
10603               goto get_vma_if_bpabi;
10604             case DT_STRTAB:
10605               name = ".dynstr";
10606               goto get_vma_if_bpabi;
10607             case DT_SYMTAB:
10608               name = ".dynsym";
10609               goto get_vma_if_bpabi;
10610             case DT_VERSYM:
10611               name = ".gnu.version";
10612               goto get_vma_if_bpabi;
10613             case DT_VERDEF:
10614               name = ".gnu.version_d";
10615               goto get_vma_if_bpabi;
10616             case DT_VERNEED:
10617               name = ".gnu.version_r";
10618               goto get_vma_if_bpabi;
10619
10620             case DT_PLTGOT:
10621               name = ".got";
10622               goto get_vma;
10623             case DT_JMPREL:
10624               name = RELOC_SECTION (htab, ".plt");
10625             get_vma:
10626               s = bfd_get_section_by_name (output_bfd, name);
10627               BFD_ASSERT (s != NULL);
10628               if (!htab->symbian_p)
10629                 dyn.d_un.d_ptr = s->vma;
10630               else
10631                 /* In the BPABI, tags in the PT_DYNAMIC section point
10632                    at the file offset, not the memory address, for the
10633                    convenience of the post linker.  */
10634                 dyn.d_un.d_ptr = s->filepos;
10635               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10636               break;
10637
10638             get_vma_if_bpabi:
10639               if (htab->symbian_p)
10640                 goto get_vma;
10641               break;
10642
10643             case DT_PLTRELSZ:
10644               s = bfd_get_section_by_name (output_bfd,
10645                                            RELOC_SECTION (htab, ".plt"));
10646               BFD_ASSERT (s != NULL);
10647               dyn.d_un.d_val = s->size;
10648               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10649               break;
10650
10651             case DT_RELSZ:
10652             case DT_RELASZ:
10653               if (!htab->symbian_p)
10654                 {
10655                   /* My reading of the SVR4 ABI indicates that the
10656                      procedure linkage table relocs (DT_JMPREL) should be
10657                      included in the overall relocs (DT_REL).  This is
10658                      what Solaris does.  However, UnixWare can not handle
10659                      that case.  Therefore, we override the DT_RELSZ entry
10660                      here to make it not include the JMPREL relocs.  Since
10661                      the linker script arranges for .rel(a).plt to follow all
10662                      other relocation sections, we don't have to worry
10663                      about changing the DT_REL entry.  */
10664                   s = bfd_get_section_by_name (output_bfd,
10665                                                RELOC_SECTION (htab, ".plt"));
10666                   if (s != NULL)
10667                     dyn.d_un.d_val -= s->size;
10668                   bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10669                   break;
10670                 }
10671               /* Fall through.  */
10672
10673             case DT_REL:
10674             case DT_RELA:
10675               /* In the BPABI, the DT_REL tag must point at the file
10676                  offset, not the VMA, of the first relocation
10677                  section.  So, we use code similar to that in
10678                  elflink.c, but do not check for SHF_ALLOC on the
10679                  relcoation section, since relocations sections are
10680                  never allocated under the BPABI.  The comments above
10681                  about Unixware notwithstanding, we include all of the
10682                  relocations here.  */
10683               if (htab->symbian_p)
10684                 {
10685                   unsigned int i;
10686                   type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
10687                           ? SHT_REL : SHT_RELA);
10688                   dyn.d_un.d_val = 0;
10689                   for (i = 1; i < elf_numsections (output_bfd); i++)
10690                     {
10691                       Elf_Internal_Shdr *hdr
10692                         = elf_elfsections (output_bfd)[i];
10693                       if (hdr->sh_type == type)
10694                         {
10695                           if (dyn.d_tag == DT_RELSZ
10696                               || dyn.d_tag == DT_RELASZ)
10697                             dyn.d_un.d_val += hdr->sh_size;
10698                           else if ((ufile_ptr) hdr->sh_offset
10699                                    <= dyn.d_un.d_val - 1)
10700                             dyn.d_un.d_val = hdr->sh_offset;
10701                         }
10702                     }
10703                   bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10704                 }
10705               break;
10706
10707               /* Set the bottom bit of DT_INIT/FINI if the
10708                  corresponding function is Thumb.  */
10709             case DT_INIT:
10710               name = info->init_function;
10711               goto get_sym;
10712             case DT_FINI:
10713               name = info->fini_function;
10714             get_sym:
10715               /* If it wasn't set by elf_bfd_final_link
10716                  then there is nothing to adjust.  */
10717               if (dyn.d_un.d_val != 0)
10718                 {
10719                   struct elf_link_hash_entry * eh;
10720
10721                   eh = elf_link_hash_lookup (elf_hash_table (info), name,
10722                                              FALSE, FALSE, TRUE);
10723                   if (eh != NULL
10724                       && ELF_ST_TYPE (eh->type) == STT_ARM_TFUNC)
10725                     {
10726                       dyn.d_un.d_val |= 1;
10727                       bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10728                     }
10729                 }
10730               break;
10731             }
10732         }
10733
10734       /* Fill in the first entry in the procedure linkage table.  */
10735       if (splt->size > 0 && elf32_arm_hash_table (info)->plt_header_size)
10736         {
10737           const bfd_vma *plt0_entry;
10738           bfd_vma got_address, plt_address, got_displacement;
10739
10740           /* Calculate the addresses of the GOT and PLT.  */
10741           got_address = sgot->output_section->vma + sgot->output_offset;
10742           plt_address = splt->output_section->vma + splt->output_offset;
10743
10744           if (htab->vxworks_p)
10745             {
10746               /* The VxWorks GOT is relocated by the dynamic linker.
10747                  Therefore, we must emit relocations rather than simply
10748                  computing the values now.  */
10749               Elf_Internal_Rela rel;
10750
10751               plt0_entry = elf32_arm_vxworks_exec_plt0_entry;
10752               put_arm_insn (htab, output_bfd, plt0_entry[0],
10753                             splt->contents + 0);
10754               put_arm_insn (htab, output_bfd, plt0_entry[1],
10755                             splt->contents + 4);
10756               put_arm_insn (htab, output_bfd, plt0_entry[2],
10757                             splt->contents + 8);
10758               bfd_put_32 (output_bfd, got_address, splt->contents + 12);
10759
10760               /* Generate a relocation for _GLOBAL_OFFSET_TABLE_.  */
10761               rel.r_offset = plt_address + 12;
10762               rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
10763               rel.r_addend = 0;
10764               SWAP_RELOC_OUT (htab) (output_bfd, &rel,
10765                                      htab->srelplt2->contents);
10766             }
10767           else
10768             {
10769               got_displacement = got_address - (plt_address + 16);
10770
10771               plt0_entry = elf32_arm_plt0_entry;
10772               put_arm_insn (htab, output_bfd, plt0_entry[0],
10773                             splt->contents + 0);
10774               put_arm_insn (htab, output_bfd, plt0_entry[1],
10775                             splt->contents + 4);
10776               put_arm_insn (htab, output_bfd, plt0_entry[2],
10777                             splt->contents + 8);
10778               put_arm_insn (htab, output_bfd, plt0_entry[3],
10779                             splt->contents + 12);
10780
10781 #ifdef FOUR_WORD_PLT
10782               /* The displacement value goes in the otherwise-unused
10783                  last word of the second entry.  */
10784               bfd_put_32 (output_bfd, got_displacement, splt->contents + 28);
10785 #else
10786               bfd_put_32 (output_bfd, got_displacement, splt->contents + 16);
10787 #endif
10788             }
10789         }
10790
10791       /* UnixWare sets the entsize of .plt to 4, although that doesn't
10792          really seem like the right value.  */
10793       if (splt->output_section->owner == output_bfd)
10794         elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
10795
10796       if (htab->vxworks_p && !info->shared && htab->splt->size > 0)
10797         {
10798           /* Correct the .rel(a).plt.unloaded relocations.  They will have
10799              incorrect symbol indexes.  */
10800           int num_plts;
10801           unsigned char *p;
10802
10803           num_plts = ((htab->splt->size - htab->plt_header_size)
10804                       / htab->plt_entry_size);
10805           p = htab->srelplt2->contents + RELOC_SIZE (htab);
10806
10807           for (; num_plts; num_plts--)
10808             {
10809               Elf_Internal_Rela rel;
10810
10811               SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
10812               rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
10813               SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
10814               p += RELOC_SIZE (htab);
10815
10816               SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
10817               rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
10818               SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
10819               p += RELOC_SIZE (htab);
10820             }
10821         }
10822     }
10823
10824   /* Fill in the first three entries in the global offset table.  */
10825   if (sgot)
10826     {
10827       if (sgot->size > 0)
10828         {
10829           if (sdyn == NULL)
10830             bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
10831           else
10832             bfd_put_32 (output_bfd,
10833                         sdyn->output_section->vma + sdyn->output_offset,
10834                         sgot->contents);
10835           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
10836           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
10837         }
10838
10839       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
10840     }
10841
10842   return TRUE;
10843 }
10844
10845 static void
10846 elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
10847 {
10848   Elf_Internal_Ehdr * i_ehdrp;  /* ELF file header, internal form.  */
10849   struct elf32_arm_link_hash_table *globals;
10850
10851   i_ehdrp = elf_elfheader (abfd);
10852
10853   if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
10854     i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
10855   else
10856     i_ehdrp->e_ident[EI_OSABI] = 0;
10857   i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
10858
10859   if (link_info)
10860     {
10861       globals = elf32_arm_hash_table (link_info);
10862       if (globals->byteswap_code)
10863         i_ehdrp->e_flags |= EF_ARM_BE8;
10864     }
10865 }
10866
10867 static enum elf_reloc_type_class
10868 elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
10869 {
10870   switch ((int) ELF32_R_TYPE (rela->r_info))
10871     {
10872     case R_ARM_RELATIVE:
10873       return reloc_class_relative;
10874     case R_ARM_JUMP_SLOT:
10875       return reloc_class_plt;
10876     case R_ARM_COPY:
10877       return reloc_class_copy;
10878     default:
10879       return reloc_class_normal;
10880     }
10881 }
10882
10883 /* Set the right machine number for an Arm ELF file.  */
10884
10885 static bfd_boolean
10886 elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
10887 {
10888   if (hdr->sh_type == SHT_NOTE)
10889     *flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_CONTENTS;
10890
10891   return TRUE;
10892 }
10893
10894 static void
10895 elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
10896 {
10897   bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
10898 }
10899
10900 /* Return TRUE if this is an unwinding table entry.  */
10901
10902 static bfd_boolean
10903 is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
10904 {
10905   return (CONST_STRNEQ (name, ELF_STRING_ARM_unwind)
10906           || CONST_STRNEQ (name, ELF_STRING_ARM_unwind_once));
10907 }
10908
10909
10910 /* Set the type and flags for an ARM section.  We do this by
10911    the section name, which is a hack, but ought to work.  */
10912
10913 static bfd_boolean
10914 elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
10915 {
10916   const char * name;
10917
10918   name = bfd_get_section_name (abfd, sec);
10919
10920   if (is_arm_elf_unwind_section_name (abfd, name))
10921     {
10922       hdr->sh_type = SHT_ARM_EXIDX;
10923       hdr->sh_flags |= SHF_LINK_ORDER;
10924     }
10925   return TRUE;
10926 }
10927
10928 /* Handle an ARM specific section when reading an object file.  This is
10929    called when bfd_section_from_shdr finds a section with an unknown
10930    type.  */
10931
10932 static bfd_boolean
10933 elf32_arm_section_from_shdr (bfd *abfd,
10934                              Elf_Internal_Shdr * hdr,
10935                              const char *name,
10936                              int shindex)
10937 {
10938   /* There ought to be a place to keep ELF backend specific flags, but
10939      at the moment there isn't one.  We just keep track of the
10940      sections by their name, instead.  Fortunately, the ABI gives
10941      names for all the ARM specific sections, so we will probably get
10942      away with this.  */
10943   switch (hdr->sh_type)
10944     {
10945     case SHT_ARM_EXIDX:
10946     case SHT_ARM_PREEMPTMAP:
10947     case SHT_ARM_ATTRIBUTES:
10948       break;
10949
10950     default:
10951       return FALSE;
10952     }
10953
10954   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
10955     return FALSE;
10956
10957   return TRUE;
10958 }
10959
10960 /* A structure used to record a list of sections, independently
10961    of the next and prev fields in the asection structure.  */
10962 typedef struct section_list
10963 {
10964   asection * sec;
10965   struct section_list * next;
10966   struct section_list * prev;
10967 }
10968 section_list;
10969
10970 /* Unfortunately we need to keep a list of sections for which
10971    an _arm_elf_section_data structure has been allocated.  This
10972    is because it is possible for functions like elf32_arm_write_section
10973    to be called on a section which has had an elf_data_structure
10974    allocated for it (and so the used_by_bfd field is valid) but
10975    for which the ARM extended version of this structure - the
10976    _arm_elf_section_data structure - has not been allocated.  */
10977 static section_list * sections_with_arm_elf_section_data = NULL;
10978
10979 static void
10980 record_section_with_arm_elf_section_data (asection * sec)
10981 {
10982   struct section_list * entry;
10983
10984   entry = bfd_malloc (sizeof (* entry));
10985   if (entry == NULL)
10986     return;
10987   entry->sec = sec;
10988   entry->next = sections_with_arm_elf_section_data;
10989   entry->prev = NULL;
10990   if (entry->next != NULL)
10991     entry->next->prev = entry;
10992   sections_with_arm_elf_section_data = entry;
10993 }
10994
10995 static struct section_list *
10996 find_arm_elf_section_entry (asection * sec)
10997 {
10998   struct section_list * entry;
10999   static struct section_list * last_entry = NULL;
11000
11001   /* This is a short cut for the typical case where the sections are added
11002      to the sections_with_arm_elf_section_data list in forward order and
11003      then looked up here in backwards order.  This makes a real difference
11004      to the ld-srec/sec64k.exp linker test.  */
11005   entry = sections_with_arm_elf_section_data;
11006   if (last_entry != NULL)
11007     {
11008       if (last_entry->sec == sec)
11009         entry = last_entry;
11010       else if (last_entry->next != NULL
11011                && last_entry->next->sec == sec)
11012         entry = last_entry->next;
11013     }
11014
11015   for (; entry; entry = entry->next)
11016     if (entry->sec == sec)
11017       break;
11018
11019   if (entry)
11020     /* Record the entry prior to this one - it is the entry we are most
11021        likely to want to locate next time.  Also this way if we have been
11022        called from unrecord_section_with_arm_elf_section_data() we will not
11023        be caching a pointer that is about to be freed.  */
11024     last_entry = entry->prev;
11025
11026   return entry;
11027 }
11028
11029 static _arm_elf_section_data *
11030 get_arm_elf_section_data (asection * sec)
11031 {
11032   struct section_list * entry;
11033
11034   entry = find_arm_elf_section_entry (sec);
11035
11036   if (entry)
11037     return elf32_arm_section_data (entry->sec);
11038   else
11039     return NULL;
11040 }
11041
11042 static void
11043 unrecord_section_with_arm_elf_section_data (asection * sec)
11044 {
11045   struct section_list * entry;
11046
11047   entry = find_arm_elf_section_entry (sec);
11048
11049   if (entry)
11050     {
11051       if (entry->prev != NULL)
11052         entry->prev->next = entry->next;
11053       if (entry->next != NULL)
11054         entry->next->prev = entry->prev;
11055       if (entry == sections_with_arm_elf_section_data)
11056         sections_with_arm_elf_section_data = entry->next;
11057       free (entry);
11058     }
11059 }
11060
11061
11062 typedef struct
11063 {
11064   void *finfo;
11065   struct bfd_link_info *info;
11066   asection *sec;
11067   int sec_shndx;
11068   bfd_boolean (*func) (void *, const char *, Elf_Internal_Sym *,
11069                        asection *, struct elf_link_hash_entry *);
11070 } output_arch_syminfo;
11071
11072 enum map_symbol_type
11073 {
11074   ARM_MAP_ARM,
11075   ARM_MAP_THUMB,
11076   ARM_MAP_DATA
11077 };
11078
11079
11080 /* Output a single mapping symbol.  */
11081
11082 static bfd_boolean
11083 elf32_arm_output_map_sym (output_arch_syminfo *osi,
11084                           enum map_symbol_type type,
11085                           bfd_vma offset)
11086 {
11087   static const char *names[3] = {"$a", "$t", "$d"};
11088   struct elf32_arm_link_hash_table *htab;
11089   Elf_Internal_Sym sym;
11090
11091   htab = elf32_arm_hash_table (osi->info);
11092   sym.st_value = osi->sec->output_section->vma
11093                  + osi->sec->output_offset
11094                  + offset;
11095   sym.st_size = 0;
11096   sym.st_other = 0;
11097   sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
11098   sym.st_shndx = osi->sec_shndx;
11099   if (!osi->func (osi->finfo, names[type], &sym, osi->sec, NULL))
11100     return FALSE;
11101   return TRUE;
11102 }
11103
11104
11105 /* Output mapping symbols for PLT entries associated with H.  */
11106
11107 static bfd_boolean
11108 elf32_arm_output_plt_map (struct elf_link_hash_entry *h, void *inf)
11109 {
11110   output_arch_syminfo *osi = (output_arch_syminfo *) inf;
11111   struct elf32_arm_link_hash_table *htab;
11112   struct elf32_arm_link_hash_entry *eh;
11113   bfd_vma addr;
11114
11115   htab = elf32_arm_hash_table (osi->info);
11116
11117   if (h->root.type == bfd_link_hash_indirect)
11118     return TRUE;
11119
11120   if (h->root.type == bfd_link_hash_warning)
11121     /* When warning symbols are created, they **replace** the "real"
11122        entry in the hash table, thus we never get to see the real
11123        symbol in a hash traversal.  So look at it now.  */
11124     h = (struct elf_link_hash_entry *) h->root.u.i.link;
11125
11126   if (h->plt.offset == (bfd_vma) -1)
11127     return TRUE;
11128
11129   eh = (struct elf32_arm_link_hash_entry *) h;
11130   addr = h->plt.offset;
11131   if (htab->symbian_p)
11132     {
11133       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11134         return FALSE;
11135       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 4))
11136         return FALSE;
11137     }
11138   else if (htab->vxworks_p)
11139     {
11140       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11141         return FALSE;
11142       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
11143         return FALSE;
11144       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 12))
11145         return FALSE;
11146       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 20))
11147         return FALSE;
11148     }
11149   else
11150     {
11151       bfd_signed_vma thumb_refs;
11152
11153       thumb_refs = eh->plt_thumb_refcount;
11154       if (!htab->use_blx)
11155         thumb_refs += eh->plt_maybe_thumb_refcount;
11156
11157       if (thumb_refs > 0)
11158         {
11159           if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr - 4))
11160             return FALSE;
11161         }
11162 #ifdef FOUR_WORD_PLT
11163       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11164         return FALSE;
11165       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 12))
11166         return FALSE;
11167 #else
11168       /* A three-word PLT with no Thumb thunk contains only Arm code,
11169          so only need to output a mapping symbol for the first PLT entry and
11170          entries with thumb thunks.  */
11171       if (thumb_refs > 0 || addr == 20)
11172         {
11173           if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11174             return FALSE;
11175         }
11176 #endif
11177     }
11178
11179   return TRUE;
11180 }
11181
11182 /* Output a single local symbol for a generated stub.  */
11183
11184 static bfd_boolean
11185 elf32_arm_output_stub_sym (output_arch_syminfo *osi, const char *name,
11186                            bfd_vma offset, bfd_vma size)
11187 {
11188   struct elf32_arm_link_hash_table *htab;
11189   Elf_Internal_Sym sym;
11190
11191   htab = elf32_arm_hash_table (osi->info);
11192   sym.st_value = osi->sec->output_section->vma
11193                  + osi->sec->output_offset
11194                  + offset;
11195   sym.st_size = size;
11196   sym.st_other = 0;
11197   sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
11198   sym.st_shndx = osi->sec_shndx;
11199   if (!osi->func (osi->finfo, name, &sym, osi->sec, NULL))
11200     return FALSE;
11201   return TRUE;
11202 }
11203
11204 static bfd_boolean
11205 arm_map_one_stub (struct bfd_hash_entry * gen_entry,
11206                   void * in_arg)
11207 {
11208   struct elf32_arm_stub_hash_entry *stub_entry;
11209   struct bfd_link_info *info;
11210   struct elf32_arm_link_hash_table *htab;
11211   asection *stub_sec;
11212   bfd_vma addr;
11213   char *stub_name;
11214   output_arch_syminfo *osi;
11215
11216   /* Massage our args to the form they really have.  */
11217   stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
11218   osi = (output_arch_syminfo *) in_arg;
11219
11220   info = osi->info;
11221
11222   htab = elf32_arm_hash_table (info);
11223   stub_sec = stub_entry->stub_sec;
11224
11225   /* Ensure this stub is attached to the current section being
11226      processed.  */
11227   if (stub_sec != osi->sec)
11228     return TRUE;
11229
11230   addr = (bfd_vma) stub_entry->stub_offset;
11231   stub_name = stub_entry->output_name;
11232
11233   switch (stub_entry->stub_type)
11234     {
11235     case arm_stub_long_branch:
11236       if (!elf32_arm_output_stub_sym (osi, stub_name, addr, 8))
11237         return FALSE;
11238       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11239         return FALSE;
11240       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 4))
11241         return FALSE;
11242       break;
11243     case arm_thumb_v4t_stub_long_branch:
11244       if (!elf32_arm_output_stub_sym (osi, stub_name, addr, 12))
11245         return FALSE;
11246       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11247         return FALSE;
11248       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
11249         return FALSE;
11250       break;
11251     case arm_thumb_thumb_stub_long_branch:
11252       if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, 16))
11253         return FALSE;
11254       if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr))
11255         return FALSE;
11256       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 12))
11257         return FALSE;
11258       break;
11259     case arm_thumb_arm_v4t_stub_long_branch:
11260       if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, 20))
11261         return FALSE;
11262       if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr))
11263         return FALSE;
11264       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 8))
11265         return FALSE;
11266       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 16))
11267         return FALSE;
11268       break;
11269     case arm_thumb_arm_v4t_stub_short_branch:
11270       if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, 8))
11271         return FALSE;
11272       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 4))
11273         return FALSE;
11274       break;
11275     case arm_stub_pic_long_branch:
11276       if (!elf32_arm_output_stub_sym (osi, stub_name, addr, 12))
11277         return FALSE;
11278       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11279         return FALSE;
11280       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
11281         return FALSE;
11282       break;
11283     default:
11284       BFD_FAIL ();
11285     }
11286
11287   return TRUE;
11288 }
11289
11290 /* Output mapping symbols for linker generated sections.  */
11291
11292 static bfd_boolean
11293 elf32_arm_output_arch_local_syms (bfd *output_bfd,
11294                                   struct bfd_link_info *info,
11295                                   void *finfo,
11296                                   bfd_boolean (*func) (void *, const char *,
11297                                                        Elf_Internal_Sym *,
11298                                                        asection *,
11299                                                        struct elf_link_hash_entry *))
11300 {
11301   output_arch_syminfo osi;
11302   struct elf32_arm_link_hash_table *htab;
11303   bfd_vma offset;
11304   bfd_size_type size;
11305
11306   htab = elf32_arm_hash_table (info);
11307   check_use_blx (htab);
11308
11309   osi.finfo = finfo;
11310   osi.info = info;
11311   osi.func = func;
11312
11313   /* ARM->Thumb glue.  */
11314   if (htab->arm_glue_size > 0)
11315     {
11316       osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
11317                                          ARM2THUMB_GLUE_SECTION_NAME);
11318
11319       osi.sec_shndx = _bfd_elf_section_from_bfd_section
11320           (output_bfd, osi.sec->output_section);
11321       if (info->shared || htab->root.is_relocatable_executable
11322           || htab->pic_veneer)
11323         size = ARM2THUMB_PIC_GLUE_SIZE;
11324       else if (htab->use_blx)
11325         size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
11326       else
11327         size = ARM2THUMB_STATIC_GLUE_SIZE;
11328
11329       for (offset = 0; offset < htab->arm_glue_size; offset += size)
11330         {
11331           elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset);
11332           elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, offset + size - 4);
11333         }
11334     }
11335
11336   /* Thumb->ARM glue.  */
11337   if (htab->thumb_glue_size > 0)
11338     {
11339       osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
11340                                          THUMB2ARM_GLUE_SECTION_NAME);
11341
11342       osi.sec_shndx = _bfd_elf_section_from_bfd_section
11343           (output_bfd, osi.sec->output_section);
11344       size = THUMB2ARM_GLUE_SIZE;
11345
11346       for (offset = 0; offset < htab->thumb_glue_size; offset += size)
11347         {
11348           elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, offset);
11349           elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset + 4);
11350         }
11351     }
11352
11353   /* ARMv4 BX veneers.  */
11354   if (htab->bx_glue_size > 0)
11355     {
11356       osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
11357                                          ARM_BX_GLUE_SECTION_NAME);
11358
11359       osi.sec_shndx = _bfd_elf_section_from_bfd_section
11360           (output_bfd, osi.sec->output_section);
11361
11362       elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0);
11363     }
11364
11365   /* Long calls stubs.  */
11366   if (htab->stub_bfd && htab->stub_bfd->sections)
11367     {
11368       asection* stub_sec;
11369
11370       for (stub_sec = htab->stub_bfd->sections;
11371            stub_sec != NULL;
11372            stub_sec = stub_sec->next)
11373         {
11374           /* Ignore non-stub sections.  */
11375           if (!strstr (stub_sec->name, STUB_SUFFIX))
11376             continue;
11377
11378           osi.sec = stub_sec;
11379
11380           osi.sec_shndx = _bfd_elf_section_from_bfd_section
11381             (output_bfd, osi.sec->output_section);
11382
11383           bfd_hash_traverse (&htab->stub_hash_table, arm_map_one_stub, &osi);
11384         }
11385     }
11386
11387   /* Finally, output mapping symbols for the PLT.  */
11388   if (!htab->splt || htab->splt->size == 0)
11389     return TRUE;
11390
11391   osi.sec_shndx = _bfd_elf_section_from_bfd_section (output_bfd,
11392                                                      htab->splt->output_section);
11393   osi.sec = htab->splt;
11394   /* Output mapping symbols for the plt header.  SymbianOS does not have a
11395      plt header.  */
11396   if (htab->vxworks_p)
11397     {
11398       /* VxWorks shared libraries have no PLT header.  */
11399       if (!info->shared)
11400         {
11401           if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
11402             return FALSE;
11403           if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 12))
11404             return FALSE;
11405         }
11406     }
11407   else if (!htab->symbian_p)
11408     {
11409       if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
11410         return FALSE;
11411 #ifndef FOUR_WORD_PLT
11412       if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 16))
11413         return FALSE;
11414 #endif
11415     }
11416
11417   elf_link_hash_traverse (&htab->root, elf32_arm_output_plt_map, (void *) &osi);
11418   return TRUE;
11419 }
11420
11421 /* Allocate target specific section data.  */
11422
11423 static bfd_boolean
11424 elf32_arm_new_section_hook (bfd *abfd, asection *sec)
11425 {
11426   if (!sec->used_by_bfd)
11427     {
11428       _arm_elf_section_data *sdata;
11429       bfd_size_type amt = sizeof (*sdata);
11430
11431       sdata = bfd_zalloc (abfd, amt);
11432       if (sdata == NULL)
11433         return FALSE;
11434       sec->used_by_bfd = sdata;
11435     }
11436
11437   record_section_with_arm_elf_section_data (sec);
11438
11439   return _bfd_elf_new_section_hook (abfd, sec);
11440 }
11441
11442
11443 /* Used to order a list of mapping symbols by address.  */
11444
11445 static int
11446 elf32_arm_compare_mapping (const void * a, const void * b)
11447 {
11448   const elf32_arm_section_map *amap = (const elf32_arm_section_map *) a;
11449   const elf32_arm_section_map *bmap = (const elf32_arm_section_map *) b;
11450
11451   if (amap->vma > bmap->vma)
11452     return 1;
11453   else if (amap->vma < bmap->vma)
11454     return -1;
11455   else if (amap->type > bmap->type)
11456     /* Ensure results do not depend on the host qsort for objects with
11457        multiple mapping symbols at the same address by sorting on type
11458        after vma.  */
11459     return 1;
11460   else if (amap->type < bmap->type)
11461     return -1;
11462   else
11463     return 0;
11464 }
11465
11466
11467 /* Do code byteswapping.  Return FALSE afterwards so that the section is
11468    written out as normal.  */
11469
11470 static bfd_boolean
11471 elf32_arm_write_section (bfd *output_bfd,
11472                          struct bfd_link_info *link_info,
11473                          asection *sec,
11474                          bfd_byte *contents)
11475 {
11476   int mapcount, errcount;
11477   _arm_elf_section_data *arm_data;
11478   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
11479   elf32_arm_section_map *map;
11480   elf32_vfp11_erratum_list *errnode;
11481   bfd_vma ptr;
11482   bfd_vma end;
11483   bfd_vma offset = sec->output_section->vma + sec->output_offset;
11484   bfd_byte tmp;
11485   int i;
11486
11487   /* If this section has not been allocated an _arm_elf_section_data
11488      structure then we cannot record anything.  */
11489   arm_data = get_arm_elf_section_data (sec);
11490   if (arm_data == NULL)
11491     return FALSE;
11492
11493   mapcount = arm_data->mapcount;
11494   map = arm_data->map;
11495   errcount = arm_data->erratumcount;
11496
11497   if (errcount != 0)
11498     {
11499       unsigned int endianflip = bfd_big_endian (output_bfd) ? 3 : 0;
11500
11501       for (errnode = arm_data->erratumlist; errnode != 0;
11502            errnode = errnode->next)
11503         {
11504           bfd_vma index = errnode->vma - offset;
11505
11506           switch (errnode->type)
11507             {
11508             case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
11509               {
11510                 bfd_vma branch_to_veneer;
11511                 /* Original condition code of instruction, plus bit mask for
11512                    ARM B instruction.  */
11513                 unsigned int insn = (errnode->u.b.vfp_insn & 0xf0000000)
11514                                   | 0x0a000000;
11515
11516                 /* The instruction is before the label.  */
11517                 index -= 4;
11518
11519                 /* Above offset included in -4 below.  */
11520                 branch_to_veneer = errnode->u.b.veneer->vma
11521                                    - errnode->vma - 4;
11522
11523                 if ((signed) branch_to_veneer < -(1 << 25)
11524                     || (signed) branch_to_veneer >= (1 << 25))
11525                   (*_bfd_error_handler) (_("%B: error: VFP11 veneer out of "
11526                                            "range"), output_bfd);
11527
11528                 insn |= (branch_to_veneer >> 2) & 0xffffff;
11529                 contents[endianflip ^ index] = insn & 0xff;
11530                 contents[endianflip ^ (index + 1)] = (insn >> 8) & 0xff;
11531                 contents[endianflip ^ (index + 2)] = (insn >> 16) & 0xff;
11532                 contents[endianflip ^ (index + 3)] = (insn >> 24) & 0xff;
11533               }
11534               break;
11535
11536             case VFP11_ERRATUM_ARM_VENEER:
11537               {
11538                 bfd_vma branch_from_veneer;
11539                 unsigned int insn;
11540
11541                 /* Take size of veneer into account.  */
11542                 branch_from_veneer = errnode->u.v.branch->vma
11543                                      - errnode->vma - 12;
11544
11545                 if ((signed) branch_from_veneer < -(1 << 25)
11546                     || (signed) branch_from_veneer >= (1 << 25))
11547                   (*_bfd_error_handler) (_("%B: error: VFP11 veneer out of "
11548                                            "range"), output_bfd);
11549
11550                 /* Original instruction.  */
11551                 insn = errnode->u.v.branch->u.b.vfp_insn;
11552                 contents[endianflip ^ index] = insn & 0xff;
11553                 contents[endianflip ^ (index + 1)] = (insn >> 8) & 0xff;
11554                 contents[endianflip ^ (index + 2)] = (insn >> 16) & 0xff;
11555                 contents[endianflip ^ (index + 3)] = (insn >> 24) & 0xff;
11556
11557                 /* Branch back to insn after original insn.  */
11558                 insn = 0xea000000 | ((branch_from_veneer >> 2) & 0xffffff);
11559                 contents[endianflip ^ (index + 4)] = insn & 0xff;
11560                 contents[endianflip ^ (index + 5)] = (insn >> 8) & 0xff;
11561                 contents[endianflip ^ (index + 6)] = (insn >> 16) & 0xff;
11562                 contents[endianflip ^ (index + 7)] = (insn >> 24) & 0xff;
11563               }
11564               break;
11565
11566             default:
11567               abort ();
11568             }
11569         }
11570     }
11571
11572   if (mapcount == 0)
11573     return FALSE;
11574
11575   if (globals->byteswap_code)
11576     {
11577       qsort (map, mapcount, sizeof (* map), elf32_arm_compare_mapping);
11578
11579       ptr = map[0].vma;
11580       for (i = 0; i < mapcount; i++)
11581         {
11582           if (i == mapcount - 1)
11583             end = sec->size;
11584           else
11585             end = map[i + 1].vma;
11586
11587           switch (map[i].type)
11588             {
11589             case 'a':
11590               /* Byte swap code words.  */
11591               while (ptr + 3 < end)
11592                 {
11593                   tmp = contents[ptr];
11594                   contents[ptr] = contents[ptr + 3];
11595                   contents[ptr + 3] = tmp;
11596                   tmp = contents[ptr + 1];
11597                   contents[ptr + 1] = contents[ptr + 2];
11598                   contents[ptr + 2] = tmp;
11599                   ptr += 4;
11600                 }
11601               break;
11602
11603             case 't':
11604               /* Byte swap code halfwords.  */
11605               while (ptr + 1 < end)
11606                 {
11607                   tmp = contents[ptr];
11608                   contents[ptr] = contents[ptr + 1];
11609                   contents[ptr + 1] = tmp;
11610                   ptr += 2;
11611                 }
11612               break;
11613
11614             case 'd':
11615               /* Leave data alone.  */
11616               break;
11617             }
11618           ptr = end;
11619         }
11620     }
11621
11622   free (map);
11623   arm_data->mapcount = 0;
11624   arm_data->mapsize = 0;
11625   arm_data->map = NULL;
11626   unrecord_section_with_arm_elf_section_data (sec);
11627
11628   return FALSE;
11629 }
11630
11631 static void
11632 unrecord_section_via_map_over_sections (bfd * abfd ATTRIBUTE_UNUSED,
11633                                         asection * sec,
11634                                         void * ignore ATTRIBUTE_UNUSED)
11635 {
11636   unrecord_section_with_arm_elf_section_data (sec);
11637 }
11638
11639 static bfd_boolean
11640 elf32_arm_close_and_cleanup (bfd * abfd)
11641 {
11642   if (abfd->sections)
11643     bfd_map_over_sections (abfd,
11644                            unrecord_section_via_map_over_sections,
11645                            NULL);
11646
11647   return _bfd_elf_close_and_cleanup (abfd);
11648 }
11649
11650 static bfd_boolean
11651 elf32_arm_bfd_free_cached_info (bfd * abfd)
11652 {
11653   if (abfd->sections)
11654     bfd_map_over_sections (abfd,
11655                            unrecord_section_via_map_over_sections,
11656                            NULL);
11657
11658   return _bfd_free_cached_info (abfd);
11659 }
11660
11661 /* Display STT_ARM_TFUNC symbols as functions.  */
11662
11663 static void
11664 elf32_arm_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
11665                              asymbol *asym)
11666 {
11667   elf_symbol_type *elfsym = (elf_symbol_type *) asym;
11668
11669   if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_ARM_TFUNC)
11670     elfsym->symbol.flags |= BSF_FUNCTION;
11671 }
11672
11673
11674 /* Mangle thumb function symbols as we read them in.  */
11675
11676 static bfd_boolean
11677 elf32_arm_swap_symbol_in (bfd * abfd,
11678                           const void *psrc,
11679                           const void *pshn,
11680                           Elf_Internal_Sym *dst)
11681 {
11682   if (!bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst))
11683     return FALSE;
11684
11685   /* New EABI objects mark thumb function symbols by setting the low bit of
11686      the address.  Turn these into STT_ARM_TFUNC.  */
11687   if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
11688       && (dst->st_value & 1))
11689     {
11690       dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC);
11691       dst->st_value &= ~(bfd_vma) 1;
11692     }
11693   return TRUE;
11694 }
11695
11696
11697 /* Mangle thumb function symbols as we write them out.  */
11698
11699 static void
11700 elf32_arm_swap_symbol_out (bfd *abfd,
11701                            const Elf_Internal_Sym *src,
11702                            void *cdst,
11703                            void *shndx)
11704 {
11705   Elf_Internal_Sym newsym;
11706
11707   /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
11708      of the address set, as per the new EABI.  We do this unconditionally
11709      because objcopy does not set the elf header flags until after
11710      it writes out the symbol table.  */
11711   if (ELF_ST_TYPE (src->st_info) == STT_ARM_TFUNC)
11712     {
11713       newsym = *src;
11714       newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
11715       if (newsym.st_shndx != SHN_UNDEF)
11716         {
11717           /* Do this only for defined symbols. At link type, the static
11718              linker will simulate the work of dynamic linker of resolving
11719              symbols and will carry over the thumbness of found symbols to
11720              the output symbol table. It's not clear how it happens, but
11721              the thumbness of undefined symbols can well be different at
11722              runtime, and writing '1' for them will be confusing for users
11723              and possibly for dynamic linker itself.
11724           */
11725           newsym.st_value |= 1;
11726         }
11727
11728       src = &newsym;
11729     }
11730   bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
11731 }
11732
11733 /* Add the PT_ARM_EXIDX program header.  */
11734
11735 static bfd_boolean
11736 elf32_arm_modify_segment_map (bfd *abfd,
11737                               struct bfd_link_info *info ATTRIBUTE_UNUSED)
11738 {
11739   struct elf_segment_map *m;
11740   asection *sec;
11741
11742   sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
11743   if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
11744     {
11745       /* If there is already a PT_ARM_EXIDX header, then we do not
11746          want to add another one.  This situation arises when running
11747          "strip"; the input binary already has the header.  */
11748       m = elf_tdata (abfd)->segment_map;
11749       while (m && m->p_type != PT_ARM_EXIDX)
11750         m = m->next;
11751       if (!m)
11752         {
11753           m = bfd_zalloc (abfd, sizeof (struct elf_segment_map));
11754           if (m == NULL)
11755             return FALSE;
11756           m->p_type = PT_ARM_EXIDX;
11757           m->count = 1;
11758           m->sections[0] = sec;
11759
11760           m->next = elf_tdata (abfd)->segment_map;
11761           elf_tdata (abfd)->segment_map = m;
11762         }
11763     }
11764
11765   return TRUE;
11766 }
11767
11768 /* We may add a PT_ARM_EXIDX program header.  */
11769
11770 static int
11771 elf32_arm_additional_program_headers (bfd *abfd,
11772                                       struct bfd_link_info *info ATTRIBUTE_UNUSED)
11773 {
11774   asection *sec;
11775
11776   sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
11777   if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
11778     return 1;
11779   else
11780     return 0;
11781 }
11782
11783 /* We have two function types: STT_FUNC and STT_ARM_TFUNC.  */
11784
11785 static bfd_boolean
11786 elf32_arm_is_function_type (unsigned int type)
11787 {
11788   return (type == STT_FUNC) || (type == STT_ARM_TFUNC);
11789 }
11790
11791 /* We use this to override swap_symbol_in and swap_symbol_out.  */
11792 const struct elf_size_info elf32_arm_size_info =
11793 {
11794   sizeof (Elf32_External_Ehdr),
11795   sizeof (Elf32_External_Phdr),
11796   sizeof (Elf32_External_Shdr),
11797   sizeof (Elf32_External_Rel),
11798   sizeof (Elf32_External_Rela),
11799   sizeof (Elf32_External_Sym),
11800   sizeof (Elf32_External_Dyn),
11801   sizeof (Elf_External_Note),
11802   4,
11803   1,
11804   32, 2,
11805   ELFCLASS32, EV_CURRENT,
11806   bfd_elf32_write_out_phdrs,
11807   bfd_elf32_write_shdrs_and_ehdr,
11808   bfd_elf32_checksum_contents,
11809   bfd_elf32_write_relocs,
11810   elf32_arm_swap_symbol_in,
11811   elf32_arm_swap_symbol_out,
11812   bfd_elf32_slurp_reloc_table,
11813   bfd_elf32_slurp_symbol_table,
11814   bfd_elf32_swap_dyn_in,
11815   bfd_elf32_swap_dyn_out,
11816   bfd_elf32_swap_reloc_in,
11817   bfd_elf32_swap_reloc_out,
11818   bfd_elf32_swap_reloca_in,
11819   bfd_elf32_swap_reloca_out
11820 };
11821
11822 #define ELF_ARCH                        bfd_arch_arm
11823 #define ELF_MACHINE_CODE                EM_ARM
11824 #ifdef __QNXTARGET__
11825 #define ELF_MAXPAGESIZE                 0x1000
11826 #else
11827 #define ELF_MAXPAGESIZE                 0x8000
11828 #endif
11829 #define ELF_MINPAGESIZE                 0x1000
11830 #define ELF_COMMONPAGESIZE              0x1000
11831
11832 #define bfd_elf32_mkobject                      elf32_arm_mkobject
11833
11834 #define bfd_elf32_bfd_copy_private_bfd_data     elf32_arm_copy_private_bfd_data
11835 #define bfd_elf32_bfd_merge_private_bfd_data    elf32_arm_merge_private_bfd_data
11836 #define bfd_elf32_bfd_set_private_flags         elf32_arm_set_private_flags
11837 #define bfd_elf32_bfd_print_private_bfd_data    elf32_arm_print_private_bfd_data
11838 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_link_hash_table_create
11839 #define bfd_elf32_bfd_link_hash_table_free      elf32_arm_hash_table_free
11840 #define bfd_elf32_bfd_reloc_type_lookup         elf32_arm_reloc_type_lookup
11841 #define bfd_elf32_bfd_reloc_name_lookup elf32_arm_reloc_name_lookup
11842 #define bfd_elf32_find_nearest_line             elf32_arm_find_nearest_line
11843 #define bfd_elf32_find_inliner_info             elf32_arm_find_inliner_info
11844 #define bfd_elf32_new_section_hook              elf32_arm_new_section_hook
11845 #define bfd_elf32_bfd_is_target_special_symbol  elf32_arm_is_target_special_symbol
11846 #define bfd_elf32_close_and_cleanup             elf32_arm_close_and_cleanup
11847 #define bfd_elf32_bfd_free_cached_info          elf32_arm_bfd_free_cached_info
11848
11849 #define elf_backend_get_symbol_type             elf32_arm_get_symbol_type
11850 #define elf_backend_gc_mark_hook                elf32_arm_gc_mark_hook
11851 #define elf_backend_gc_mark_extra_sections      elf32_arm_gc_mark_extra_sections
11852 #define elf_backend_gc_sweep_hook               elf32_arm_gc_sweep_hook
11853 #define elf_backend_check_relocs                elf32_arm_check_relocs
11854 #define elf_backend_relocate_section            elf32_arm_relocate_section
11855 #define elf_backend_write_section               elf32_arm_write_section
11856 #define elf_backend_adjust_dynamic_symbol       elf32_arm_adjust_dynamic_symbol
11857 #define elf_backend_create_dynamic_sections     elf32_arm_create_dynamic_sections
11858 #define elf_backend_finish_dynamic_symbol       elf32_arm_finish_dynamic_symbol
11859 #define elf_backend_finish_dynamic_sections     elf32_arm_finish_dynamic_sections
11860 #define elf_backend_size_dynamic_sections       elf32_arm_size_dynamic_sections
11861 #define elf_backend_init_index_section          _bfd_elf_init_2_index_sections
11862 #define elf_backend_post_process_headers        elf32_arm_post_process_headers
11863 #define elf_backend_reloc_type_class            elf32_arm_reloc_type_class
11864 #define elf_backend_object_p                    elf32_arm_object_p
11865 #define elf_backend_section_flags               elf32_arm_section_flags
11866 #define elf_backend_fake_sections               elf32_arm_fake_sections
11867 #define elf_backend_section_from_shdr           elf32_arm_section_from_shdr
11868 #define elf_backend_final_write_processing      elf32_arm_final_write_processing
11869 #define elf_backend_copy_indirect_symbol        elf32_arm_copy_indirect_symbol
11870 #define elf_backend_symbol_processing           elf32_arm_symbol_processing
11871 #define elf_backend_size_info                   elf32_arm_size_info
11872 #define elf_backend_modify_segment_map          elf32_arm_modify_segment_map
11873 #define elf_backend_additional_program_headers  elf32_arm_additional_program_headers
11874 #define elf_backend_output_arch_local_syms      elf32_arm_output_arch_local_syms
11875 #define elf_backend_begin_write_processing      elf32_arm_begin_write_processing
11876 #define elf_backend_is_function_type            elf32_arm_is_function_type
11877
11878 #define elf_backend_can_refcount       1
11879 #define elf_backend_can_gc_sections    1
11880 #define elf_backend_plt_readonly       1
11881 #define elf_backend_want_got_plt       1
11882 #define elf_backend_want_plt_sym       0
11883 #define elf_backend_may_use_rel_p      1
11884 #define elf_backend_may_use_rela_p     0
11885 #define elf_backend_default_use_rela_p 0
11886
11887 #define elf_backend_got_header_size     12
11888
11889 #undef  elf_backend_obj_attrs_vendor
11890 #define elf_backend_obj_attrs_vendor            "aeabi"
11891 #undef  elf_backend_obj_attrs_section
11892 #define elf_backend_obj_attrs_section           ".ARM.attributes"
11893 #undef  elf_backend_obj_attrs_arg_type
11894 #define elf_backend_obj_attrs_arg_type          elf32_arm_obj_attrs_arg_type
11895 #undef  elf_backend_obj_attrs_section_type
11896 #define elf_backend_obj_attrs_section_type      SHT_ARM_ATTRIBUTES
11897
11898 #include "elf32-target.h"
11899
11900 /* VxWorks Targets.  */
11901
11902 #undef  TARGET_LITTLE_SYM
11903 #define TARGET_LITTLE_SYM               bfd_elf32_littlearm_vxworks_vec
11904 #undef  TARGET_LITTLE_NAME
11905 #define TARGET_LITTLE_NAME              "elf32-littlearm-vxworks"
11906 #undef  TARGET_BIG_SYM
11907 #define TARGET_BIG_SYM                  bfd_elf32_bigarm_vxworks_vec
11908 #undef  TARGET_BIG_NAME
11909 #define TARGET_BIG_NAME                 "elf32-bigarm-vxworks"
11910
11911 /* Like elf32_arm_link_hash_table_create -- but overrides
11912    appropriately for VxWorks.  */
11913
11914 static struct bfd_link_hash_table *
11915 elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
11916 {
11917   struct bfd_link_hash_table *ret;
11918
11919   ret = elf32_arm_link_hash_table_create (abfd);
11920   if (ret)
11921     {
11922       struct elf32_arm_link_hash_table *htab
11923         = (struct elf32_arm_link_hash_table *) ret;
11924       htab->use_rel = 0;
11925       htab->vxworks_p = 1;
11926     }
11927   return ret;
11928 }
11929
11930 static void
11931 elf32_arm_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
11932 {
11933   elf32_arm_final_write_processing (abfd, linker);
11934   elf_vxworks_final_write_processing (abfd, linker);
11935 }
11936
11937 #undef  elf32_bed
11938 #define elf32_bed elf32_arm_vxworks_bed
11939
11940 #undef  bfd_elf32_bfd_link_hash_table_create
11941 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_vxworks_link_hash_table_create
11942 #undef  elf_backend_add_symbol_hook
11943 #define elf_backend_add_symbol_hook             elf_vxworks_add_symbol_hook
11944 #undef  elf_backend_final_write_processing
11945 #define elf_backend_final_write_processing      elf32_arm_vxworks_final_write_processing
11946 #undef  elf_backend_emit_relocs
11947 #define elf_backend_emit_relocs                 elf_vxworks_emit_relocs
11948
11949 #undef  elf_backend_may_use_rel_p
11950 #define elf_backend_may_use_rel_p       0
11951 #undef  elf_backend_may_use_rela_p
11952 #define elf_backend_may_use_rela_p      1
11953 #undef  elf_backend_default_use_rela_p
11954 #define elf_backend_default_use_rela_p  1
11955 #undef  elf_backend_want_plt_sym
11956 #define elf_backend_want_plt_sym        1
11957 #undef  ELF_MAXPAGESIZE
11958 #define ELF_MAXPAGESIZE                 0x1000
11959
11960 #include "elf32-target.h"
11961
11962
11963 /* Symbian OS Targets.  */
11964
11965 #undef  TARGET_LITTLE_SYM
11966 #define TARGET_LITTLE_SYM               bfd_elf32_littlearm_symbian_vec
11967 #undef  TARGET_LITTLE_NAME
11968 #define TARGET_LITTLE_NAME              "elf32-littlearm-symbian"
11969 #undef  TARGET_BIG_SYM
11970 #define TARGET_BIG_SYM                  bfd_elf32_bigarm_symbian_vec
11971 #undef  TARGET_BIG_NAME
11972 #define TARGET_BIG_NAME                 "elf32-bigarm-symbian"
11973
11974 /* Like elf32_arm_link_hash_table_create -- but overrides
11975    appropriately for Symbian OS.  */
11976
11977 static struct bfd_link_hash_table *
11978 elf32_arm_symbian_link_hash_table_create (bfd *abfd)
11979 {
11980   struct bfd_link_hash_table *ret;
11981
11982   ret = elf32_arm_link_hash_table_create (abfd);
11983   if (ret)
11984     {
11985       struct elf32_arm_link_hash_table *htab
11986         = (struct elf32_arm_link_hash_table *)ret;
11987       /* There is no PLT header for Symbian OS.  */
11988       htab->plt_header_size = 0;
11989       /* The PLT entries are each one instruction and one word.  */
11990       htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry);
11991       htab->symbian_p = 1;
11992       /* Symbian uses armv5t or above, so use_blx is always true.  */
11993       htab->use_blx = 1;
11994       htab->root.is_relocatable_executable = 1;
11995     }
11996   return ret;
11997 }
11998
11999 static const struct bfd_elf_special_section
12000 elf32_arm_symbian_special_sections[] =
12001 {
12002   /* In a BPABI executable, the dynamic linking sections do not go in
12003      the loadable read-only segment.  The post-linker may wish to
12004      refer to these sections, but they are not part of the final
12005      program image.  */
12006   { STRING_COMMA_LEN (".dynamic"),       0, SHT_DYNAMIC,  0 },
12007   { STRING_COMMA_LEN (".dynstr"),        0, SHT_STRTAB,   0 },
12008   { STRING_COMMA_LEN (".dynsym"),        0, SHT_DYNSYM,   0 },
12009   { STRING_COMMA_LEN (".got"),           0, SHT_PROGBITS, 0 },
12010   { STRING_COMMA_LEN (".hash"),          0, SHT_HASH,     0 },
12011   /* These sections do not need to be writable as the SymbianOS
12012      postlinker will arrange things so that no dynamic relocation is
12013      required.  */
12014   { STRING_COMMA_LEN (".init_array"),    0, SHT_INIT_ARRAY,    SHF_ALLOC },
12015   { STRING_COMMA_LEN (".fini_array"),    0, SHT_FINI_ARRAY,    SHF_ALLOC },
12016   { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC },
12017   { NULL,                             0, 0, 0,                 0 }
12018 };
12019
12020 static void
12021 elf32_arm_symbian_begin_write_processing (bfd *abfd,
12022                                           struct bfd_link_info *link_info)
12023 {
12024   /* BPABI objects are never loaded directly by an OS kernel; they are
12025      processed by a postlinker first, into an OS-specific format.  If
12026      the D_PAGED bit is set on the file, BFD will align segments on
12027      page boundaries, so that an OS can directly map the file.  With
12028      BPABI objects, that just results in wasted space.  In addition,
12029      because we clear the D_PAGED bit, map_sections_to_segments will
12030      recognize that the program headers should not be mapped into any
12031      loadable segment.  */
12032   abfd->flags &= ~D_PAGED;
12033   elf32_arm_begin_write_processing (abfd, link_info);
12034 }
12035
12036 static bfd_boolean
12037 elf32_arm_symbian_modify_segment_map (bfd *abfd,
12038                                       struct bfd_link_info *info)
12039 {
12040   struct elf_segment_map *m;
12041   asection *dynsec;
12042
12043   /* BPABI shared libraries and executables should have a PT_DYNAMIC
12044      segment.  However, because the .dynamic section is not marked
12045      with SEC_LOAD, the generic ELF code will not create such a
12046      segment.  */
12047   dynsec = bfd_get_section_by_name (abfd, ".dynamic");
12048   if (dynsec)
12049     {
12050       for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
12051         if (m->p_type == PT_DYNAMIC)
12052           break;
12053
12054       if (m == NULL)
12055         {
12056           m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
12057           m->next = elf_tdata (abfd)->segment_map;
12058           elf_tdata (abfd)->segment_map = m;
12059         }
12060     }
12061
12062   /* Also call the generic arm routine.  */
12063   return elf32_arm_modify_segment_map (abfd, info);
12064 }
12065
12066 /* Return address for Ith PLT stub in section PLT, for relocation REL
12067    or (bfd_vma) -1 if it should not be included.  */
12068
12069 static bfd_vma
12070 elf32_arm_symbian_plt_sym_val (bfd_vma i, const asection *plt,
12071                                const arelent *rel ATTRIBUTE_UNUSED)
12072 {
12073   return plt->vma + 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry) * i;
12074 }
12075
12076
12077 #undef  elf32_bed
12078 #define elf32_bed elf32_arm_symbian_bed
12079
12080 /* The dynamic sections are not allocated on SymbianOS; the postlinker
12081    will process them and then discard them.  */
12082 #undef  ELF_DYNAMIC_SEC_FLAGS
12083 #define ELF_DYNAMIC_SEC_FLAGS \
12084   (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
12085
12086 #undef elf_backend_add_symbol_hook
12087 #undef elf_backend_emit_relocs
12088
12089 #undef  bfd_elf32_bfd_link_hash_table_create
12090 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_symbian_link_hash_table_create
12091 #undef  elf_backend_special_sections
12092 #define elf_backend_special_sections            elf32_arm_symbian_special_sections
12093 #undef  elf_backend_begin_write_processing
12094 #define elf_backend_begin_write_processing      elf32_arm_symbian_begin_write_processing
12095 #undef  elf_backend_final_write_processing
12096 #define elf_backend_final_write_processing      elf32_arm_final_write_processing
12097
12098 #undef  elf_backend_modify_segment_map
12099 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
12100
12101 /* There is no .got section for BPABI objects, and hence no header.  */
12102 #undef  elf_backend_got_header_size
12103 #define elf_backend_got_header_size 0
12104
12105 /* Similarly, there is no .got.plt section.  */
12106 #undef  elf_backend_want_got_plt
12107 #define elf_backend_want_got_plt 0
12108
12109 #undef  elf_backend_plt_sym_val
12110 #define elf_backend_plt_sym_val         elf32_arm_symbian_plt_sym_val
12111
12112 #undef  elf_backend_may_use_rel_p
12113 #define elf_backend_may_use_rel_p       1
12114 #undef  elf_backend_may_use_rela_p
12115 #define elf_backend_may_use_rela_p      0
12116 #undef  elf_backend_default_use_rela_p
12117 #define elf_backend_default_use_rela_p  0
12118 #undef  elf_backend_want_plt_sym
12119 #define elf_backend_want_plt_sym        0
12120 #undef  ELF_MAXPAGESIZE
12121 #define ELF_MAXPAGESIZE                 0x8000
12122
12123 #include "elf32-target.h"