* elf32-arm.c: Fix up comment describing Thumb to ARM interworking
[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                                         .arm
3917                                     ;; back_to_thumb       
3918                                         ldmia r13! {r6, lr}
3919                                         bx    lr           
3920                                     __func_addr:
3921                                         .word        func  */
3922
3923 #define THUMB2ARM_GLUE_SIZE 8
3924 static const insn16 t2a1_bx_pc_insn = 0x4778;
3925 static const insn16 t2a2_noop_insn = 0x46c0;
3926 static const insn32 t2a3_b_insn = 0xea000000;
3927
3928 #define VFP11_ERRATUM_VENEER_SIZE 8
3929
3930 #define ARM_BX_VENEER_SIZE 12
3931 static const insn32 armbx1_tst_insn = 0xe3100001;
3932 static const insn32 armbx2_moveq_insn = 0x01a0f000;
3933 static const insn32 armbx3_bx_insn = 0xe12fff10;
3934
3935 #ifndef ELFARM_NABI_C_INCLUDED
3936 static void
3937 arm_allocate_glue_section_space (bfd * abfd, bfd_size_type size, const char * name)
3938 {
3939   asection * s;
3940   bfd_byte * contents;
3941
3942   if (size == 0)
3943     return;
3944
3945   BFD_ASSERT (abfd != NULL);
3946
3947   s = bfd_get_section_by_name (abfd, name);
3948   BFD_ASSERT (s != NULL);
3949
3950   contents = bfd_alloc (abfd, size);
3951
3952   BFD_ASSERT (s->size == size);
3953   s->contents = contents;
3954 }
3955
3956 bfd_boolean
3957 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
3958 {
3959   struct elf32_arm_link_hash_table * globals;
3960
3961   globals = elf32_arm_hash_table (info);
3962   BFD_ASSERT (globals != NULL);
3963
3964   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
3965                                    globals->arm_glue_size,
3966                                    ARM2THUMB_GLUE_SECTION_NAME);
3967
3968   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
3969                                    globals->thumb_glue_size,
3970                                    THUMB2ARM_GLUE_SECTION_NAME);
3971
3972   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
3973                                    globals->vfp11_erratum_glue_size,
3974                                    VFP11_ERRATUM_VENEER_SECTION_NAME);
3975
3976   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
3977                                    globals->bx_glue_size,
3978                                    ARM_BX_GLUE_SECTION_NAME);
3979
3980   return TRUE;
3981 }
3982
3983 /* Allocate space and symbols for calling a Thumb function from Arm mode.
3984    returns the symbol identifying the stub.  */
3985
3986 static struct elf_link_hash_entry *
3987 record_arm_to_thumb_glue (struct bfd_link_info * link_info,
3988                           struct elf_link_hash_entry * h)
3989 {
3990   const char * name = h->root.root.string;
3991   asection * s;
3992   char * tmp_name;
3993   struct elf_link_hash_entry * myh;
3994   struct bfd_link_hash_entry * bh;
3995   struct elf32_arm_link_hash_table * globals;
3996   bfd_vma val;
3997   bfd_size_type size;
3998
3999   globals = elf32_arm_hash_table (link_info);
4000
4001   BFD_ASSERT (globals != NULL);
4002   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
4003
4004   s = bfd_get_section_by_name
4005     (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
4006
4007   BFD_ASSERT (s != NULL);
4008
4009   tmp_name = bfd_malloc ((bfd_size_type) strlen (name) + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
4010
4011   BFD_ASSERT (tmp_name);
4012
4013   sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
4014
4015   myh = elf_link_hash_lookup
4016     (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
4017
4018   if (myh != NULL)
4019     {
4020       /* We've already seen this guy.  */
4021       free (tmp_name);
4022       return myh;
4023     }
4024
4025   /* The only trick here is using hash_table->arm_glue_size as the value.
4026      Even though the section isn't allocated yet, this is where we will be
4027      putting it.  The +1 on the value marks that the stub has not been
4028      output yet - not that it is a Thumb function.  */
4029   bh = NULL;
4030   val = globals->arm_glue_size + 1;
4031   _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
4032                                     tmp_name, BSF_GLOBAL, s, val,
4033                                     NULL, TRUE, FALSE, &bh);
4034
4035   myh = (struct elf_link_hash_entry *) bh;
4036   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
4037   myh->forced_local = 1;
4038
4039   free (tmp_name);
4040
4041   if (link_info->shared || globals->root.is_relocatable_executable
4042       || globals->pic_veneer)
4043     size = ARM2THUMB_PIC_GLUE_SIZE;
4044   else if (globals->use_blx)
4045     size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
4046   else
4047     size = ARM2THUMB_STATIC_GLUE_SIZE;
4048
4049   s->size += size;
4050   globals->arm_glue_size += size;
4051
4052   return myh;
4053 }
4054
4055 static void
4056 record_thumb_to_arm_glue (struct bfd_link_info *link_info,
4057                           struct elf_link_hash_entry *h)
4058 {
4059   const char *name = h->root.root.string;
4060   asection *s;
4061   char *tmp_name;
4062   struct elf_link_hash_entry *myh;
4063   struct bfd_link_hash_entry *bh;
4064   struct elf32_arm_link_hash_table *hash_table;
4065   bfd_vma val;
4066
4067   hash_table = elf32_arm_hash_table (link_info);
4068
4069   BFD_ASSERT (hash_table != NULL);
4070   BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
4071
4072   s = bfd_get_section_by_name
4073     (hash_table->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
4074
4075   BFD_ASSERT (s != NULL);
4076
4077   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
4078                          + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
4079
4080   BFD_ASSERT (tmp_name);
4081
4082   sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
4083
4084   myh = elf_link_hash_lookup
4085     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
4086
4087   if (myh != NULL)
4088     {
4089       /* We've already seen this guy.  */
4090       free (tmp_name);
4091       return;
4092     }
4093
4094   /* The only trick here is using hash_table->thumb_glue_size as the value.
4095      Even though the section isn't allocated yet, this is where we will be
4096      putting it.  The +1 on the value marks that the stub has not been
4097      output yet - not that it is a Thumb function.  */
4098   bh = NULL;
4099   val = hash_table->thumb_glue_size + 1;
4100   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
4101                                     tmp_name, BSF_GLOBAL, s, val,
4102                                     NULL, TRUE, FALSE, &bh);
4103
4104   /* If we mark it 'Thumb', the disassembler will do a better job.  */
4105   myh = (struct elf_link_hash_entry *) bh;
4106   myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
4107   myh->forced_local = 1;
4108
4109   free (tmp_name);
4110
4111 #define CHANGE_TO_ARM "__%s_change_to_arm"
4112 #define BACK_FROM_ARM "__%s_back_from_arm"
4113
4114   /* Allocate another symbol to mark where we switch to Arm mode.  */
4115   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
4116                          + strlen (CHANGE_TO_ARM) + 1);
4117
4118   BFD_ASSERT (tmp_name);
4119
4120   sprintf (tmp_name, CHANGE_TO_ARM, name);
4121
4122   bh = NULL;
4123   val = hash_table->thumb_glue_size + 4,
4124   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
4125                                     tmp_name, BSF_LOCAL, s, val,
4126                                     NULL, TRUE, FALSE, &bh);
4127
4128   free (tmp_name);
4129
4130   s->size += THUMB2ARM_GLUE_SIZE;
4131   hash_table->thumb_glue_size += THUMB2ARM_GLUE_SIZE;
4132 }
4133
4134
4135 /* Allocate space for ARMv4 BX veneers.  */
4136
4137 static void
4138 record_arm_bx_glue (struct bfd_link_info * link_info, int reg)
4139 {
4140   asection * s;
4141   struct elf32_arm_link_hash_table *globals;
4142   char *tmp_name;
4143   struct elf_link_hash_entry *myh;
4144   struct bfd_link_hash_entry *bh;
4145   bfd_vma val;
4146
4147   /* BX PC does not need a veneer.  */
4148   if (reg == 15)
4149     return;
4150
4151   globals = elf32_arm_hash_table (link_info);
4152
4153   BFD_ASSERT (globals != NULL);
4154   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
4155
4156   /* Check if this veneer has already been allocated.  */
4157   if (globals->bx_glue_offset[reg])
4158     return;
4159
4160   s = bfd_get_section_by_name
4161     (globals->bfd_of_glue_owner, ARM_BX_GLUE_SECTION_NAME);
4162
4163   BFD_ASSERT (s != NULL);
4164
4165   /* Add symbol for veneer.  */
4166   tmp_name = bfd_malloc ((bfd_size_type) strlen (ARM_BX_GLUE_ENTRY_NAME) + 1);
4167
4168   BFD_ASSERT (tmp_name);
4169
4170   sprintf (tmp_name, ARM_BX_GLUE_ENTRY_NAME, reg);
4171
4172   myh = elf_link_hash_lookup
4173     (&(globals)->root, tmp_name, FALSE, FALSE, FALSE);
4174
4175   BFD_ASSERT (myh == NULL);
4176
4177   bh = NULL;
4178   val = globals->bx_glue_size;
4179   _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
4180                                     tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
4181                                     NULL, TRUE, FALSE, &bh);
4182
4183   myh = (struct elf_link_hash_entry *) bh;
4184   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
4185   myh->forced_local = 1;
4186
4187   s->size += ARM_BX_VENEER_SIZE;
4188   globals->bx_glue_offset[reg] = globals->bx_glue_size | 2;
4189   globals->bx_glue_size += ARM_BX_VENEER_SIZE;
4190 }
4191
4192
4193 /* Add an entry to the code/data map for section SEC.  */
4194
4195 static void
4196 elf32_arm_section_map_add (asection *sec, char type, bfd_vma vma)
4197 {
4198   struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
4199   unsigned int newidx;
4200
4201   if (sec_data->map == NULL)
4202     {
4203       sec_data->map = bfd_malloc (sizeof (elf32_arm_section_map));
4204       sec_data->mapcount = 0;
4205       sec_data->mapsize = 1;
4206     }
4207
4208   newidx = sec_data->mapcount++;
4209
4210   if (sec_data->mapcount > sec_data->mapsize)
4211     {
4212       sec_data->mapsize *= 2;
4213       sec_data->map = bfd_realloc_or_free (sec_data->map, sec_data->mapsize
4214                                            * sizeof (elf32_arm_section_map));
4215     }
4216
4217   if (sec_data->map)
4218     {
4219       sec_data->map[newidx].vma = vma;
4220       sec_data->map[newidx].type = type;
4221     }
4222 }
4223
4224
4225 /* Record information about a VFP11 denorm-erratum veneer.  Only ARM-mode
4226    veneers are handled for now.  */
4227
4228 static bfd_vma
4229 record_vfp11_erratum_veneer (struct bfd_link_info *link_info,
4230                              elf32_vfp11_erratum_list *branch,
4231                              bfd *branch_bfd,
4232                              asection *branch_sec,
4233                              unsigned int offset)
4234 {
4235   asection *s;
4236   struct elf32_arm_link_hash_table *hash_table;
4237   char *tmp_name;
4238   struct elf_link_hash_entry *myh;
4239   struct bfd_link_hash_entry *bh;
4240   bfd_vma val;
4241   struct _arm_elf_section_data *sec_data;
4242   int errcount;
4243   elf32_vfp11_erratum_list *newerr;
4244
4245   hash_table = elf32_arm_hash_table (link_info);
4246
4247   BFD_ASSERT (hash_table != NULL);
4248   BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
4249
4250   s = bfd_get_section_by_name
4251     (hash_table->bfd_of_glue_owner, VFP11_ERRATUM_VENEER_SECTION_NAME);
4252
4253   sec_data = elf32_arm_section_data (s);
4254
4255   BFD_ASSERT (s != NULL);
4256
4257   tmp_name = bfd_malloc ((bfd_size_type) strlen
4258                          (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
4259
4260   BFD_ASSERT (tmp_name);
4261
4262   sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
4263            hash_table->num_vfp11_fixes);
4264
4265   myh = elf_link_hash_lookup
4266     (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
4267
4268   BFD_ASSERT (myh == NULL);
4269
4270   bh = NULL;
4271   val = hash_table->vfp11_erratum_glue_size;
4272   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
4273                                     tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
4274                                     NULL, TRUE, FALSE, &bh);
4275
4276   myh = (struct elf_link_hash_entry *) bh;
4277   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
4278   myh->forced_local = 1;
4279
4280   /* Link veneer back to calling location.  */
4281   errcount = ++(sec_data->erratumcount);
4282   newerr = bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
4283
4284   newerr->type = VFP11_ERRATUM_ARM_VENEER;
4285   newerr->vma = -1;
4286   newerr->u.v.branch = branch;
4287   newerr->u.v.id = hash_table->num_vfp11_fixes;
4288   branch->u.b.veneer = newerr;
4289
4290   newerr->next = sec_data->erratumlist;
4291   sec_data->erratumlist = newerr;
4292
4293   /* A symbol for the return from the veneer.  */
4294   sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
4295            hash_table->num_vfp11_fixes);
4296
4297   myh = elf_link_hash_lookup
4298     (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
4299
4300   if (myh != NULL)
4301     abort ();
4302
4303   bh = NULL;
4304   val = offset + 4;
4305   _bfd_generic_link_add_one_symbol (link_info, branch_bfd, tmp_name, BSF_LOCAL,
4306                                     branch_sec, val, NULL, TRUE, FALSE, &bh);
4307
4308   myh = (struct elf_link_hash_entry *) bh;
4309   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
4310   myh->forced_local = 1;
4311
4312   free (tmp_name);
4313
4314   /* Generate a mapping symbol for the veneer section, and explicitly add an
4315      entry for that symbol to the code/data map for the section.  */
4316   if (hash_table->vfp11_erratum_glue_size == 0)
4317     {
4318       bh = NULL;
4319       /* FIXME: Creates an ARM symbol.  Thumb mode will need attention if it
4320          ever requires this erratum fix.  */
4321       _bfd_generic_link_add_one_symbol (link_info,
4322                                         hash_table->bfd_of_glue_owner, "$a",
4323                                         BSF_LOCAL, s, 0, NULL,
4324                                         TRUE, FALSE, &bh);
4325
4326       myh = (struct elf_link_hash_entry *) bh;
4327       myh->type = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
4328       myh->forced_local = 1;
4329
4330       /* The elf32_arm_init_maps function only cares about symbols from input
4331          BFDs.  We must make a note of this generated mapping symbol
4332          ourselves so that code byteswapping works properly in
4333          elf32_arm_write_section.  */
4334       elf32_arm_section_map_add (s, 'a', 0);
4335     }
4336
4337   s->size += VFP11_ERRATUM_VENEER_SIZE;
4338   hash_table->vfp11_erratum_glue_size += VFP11_ERRATUM_VENEER_SIZE;
4339   hash_table->num_vfp11_fixes++;
4340
4341   /* The offset of the veneer.  */
4342   return val;
4343 }
4344
4345 /* Note: we do not include the flag SEC_LINKER_CREATED, as that
4346    would prevent elf_link_input_bfd() from processing the contents
4347    of the section.  */
4348 #define ARM_GLUE_SECTION_FLAGS \
4349   (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY)
4350
4351 /* Create a fake section for use by the ARM backend of the linker.  */
4352
4353 static bfd_boolean
4354 arm_make_glue_section (bfd * abfd, const char * name)
4355 {
4356   asection * sec;
4357
4358   sec = bfd_get_section_by_name (abfd, name);
4359   if (sec != NULL)
4360     /* Already made.  */
4361     return TRUE;
4362
4363   sec = bfd_make_section_with_flags (abfd, name, ARM_GLUE_SECTION_FLAGS);
4364
4365   if (sec == NULL
4366       || !bfd_set_section_alignment (abfd, sec, 2))
4367     return FALSE;
4368
4369   /* Set the gc mark to prevent the section from being removed by garbage
4370      collection, despite the fact that no relocs refer to this section.  */
4371   sec->gc_mark = 1;
4372
4373   return TRUE;
4374 }
4375
4376 /* Add the glue sections to ABFD.  This function is called from the
4377    linker scripts in ld/emultempl/{armelf}.em.  */
4378
4379 bfd_boolean
4380 bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
4381                                         struct bfd_link_info *info)
4382 {
4383   /* If we are only performing a partial
4384      link do not bother adding the glue.  */
4385   if (info->relocatable)
4386     return TRUE;
4387
4388   /* Linker stubs don't need glue.  */
4389   if (!strcmp (abfd->filename, "linker stubs"))
4390     return TRUE;
4391
4392   return arm_make_glue_section (abfd, ARM2THUMB_GLUE_SECTION_NAME)
4393     && arm_make_glue_section (abfd, THUMB2ARM_GLUE_SECTION_NAME)
4394     && arm_make_glue_section (abfd, VFP11_ERRATUM_VENEER_SECTION_NAME)
4395     && arm_make_glue_section (abfd, ARM_BX_GLUE_SECTION_NAME);
4396 }
4397
4398 /* Select a BFD to be used to hold the sections used by the glue code.
4399    This function is called from the linker scripts in ld/emultempl/
4400    {armelf/pe}.em.  */
4401
4402 bfd_boolean
4403 bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
4404 {
4405   struct elf32_arm_link_hash_table *globals;
4406
4407   /* If we are only performing a partial link
4408      do not bother getting a bfd to hold the glue.  */
4409   if (info->relocatable)
4410     return TRUE;
4411
4412   /* Make sure we don't attach the glue sections to a dynamic object.  */
4413   BFD_ASSERT (!(abfd->flags & DYNAMIC));
4414
4415   globals = elf32_arm_hash_table (info);
4416
4417   BFD_ASSERT (globals != NULL);
4418
4419   if (globals->bfd_of_glue_owner != NULL)
4420     return TRUE;
4421
4422   /* Save the bfd for later use.  */
4423   globals->bfd_of_glue_owner = abfd;
4424
4425   return TRUE;
4426 }
4427
4428 static void
4429 check_use_blx (struct elf32_arm_link_hash_table *globals)
4430 {
4431   if (bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
4432                                 Tag_CPU_arch) > 2)
4433     globals->use_blx = 1;
4434 }
4435
4436 bfd_boolean
4437 bfd_elf32_arm_process_before_allocation (bfd *abfd,
4438                                          struct bfd_link_info *link_info)
4439 {
4440   Elf_Internal_Shdr *symtab_hdr;
4441   Elf_Internal_Rela *internal_relocs = NULL;
4442   Elf_Internal_Rela *irel, *irelend;
4443   bfd_byte *contents = NULL;
4444
4445   asection *sec;
4446   struct elf32_arm_link_hash_table *globals;
4447
4448   /* If we are only performing a partial link do not bother
4449      to construct any glue.  */
4450   if (link_info->relocatable)
4451     return TRUE;
4452
4453   /* Here we have a bfd that is to be included on the link.  We have a
4454      hook to do reloc rummaging, before section sizes are nailed down.  */
4455   globals = elf32_arm_hash_table (link_info);
4456
4457   BFD_ASSERT (globals != NULL);
4458
4459   check_use_blx (globals);
4460
4461   if (globals->byteswap_code && !bfd_big_endian (abfd))
4462     {
4463       _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
4464                           abfd);
4465       return FALSE;
4466     }
4467
4468   /* PR 5398: If we have not decided to include any loadable sections in
4469      the output then we will not have a glue owner bfd.  This is OK, it
4470      just means that there is nothing else for us to do here.  */
4471   if (globals->bfd_of_glue_owner == NULL)
4472     return TRUE;
4473
4474   /* Rummage around all the relocs and map the glue vectors.  */
4475   sec = abfd->sections;
4476
4477   if (sec == NULL)
4478     return TRUE;
4479
4480   for (; sec != NULL; sec = sec->next)
4481     {
4482       if (sec->reloc_count == 0)
4483         continue;
4484
4485       if ((sec->flags & SEC_EXCLUDE) != 0)
4486         continue;
4487
4488       symtab_hdr = & elf_symtab_hdr (abfd);
4489
4490       /* Load the relocs.  */
4491       internal_relocs
4492         = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, FALSE);
4493
4494       if (internal_relocs == NULL)
4495         goto error_return;
4496
4497       irelend = internal_relocs + sec->reloc_count;
4498       for (irel = internal_relocs; irel < irelend; irel++)
4499         {
4500           long r_type;
4501           unsigned long r_index;
4502
4503           struct elf_link_hash_entry *h;
4504
4505           r_type = ELF32_R_TYPE (irel->r_info);
4506           r_index = ELF32_R_SYM (irel->r_info);
4507
4508           /* These are the only relocation types we care about.  */
4509           if (   r_type != R_ARM_PC24
4510               && r_type != R_ARM_PLT32
4511               && r_type != R_ARM_JUMP24
4512               && r_type != R_ARM_THM_JUMP24
4513               && (r_type != R_ARM_V4BX || globals->fix_v4bx < 2))
4514             continue;
4515
4516           /* Get the section contents if we haven't done so already.  */
4517           if (contents == NULL)
4518             {
4519               /* Get cached copy if it exists.  */
4520               if (elf_section_data (sec)->this_hdr.contents != NULL)
4521                 contents = elf_section_data (sec)->this_hdr.contents;
4522               else
4523                 {
4524                   /* Go get them off disk.  */
4525                   if (! bfd_malloc_and_get_section (abfd, sec, &contents))
4526                     goto error_return;
4527                 }
4528             }
4529
4530           if (r_type == R_ARM_V4BX)
4531             {
4532               int reg;
4533
4534               reg = bfd_get_32 (abfd, contents + irel->r_offset) & 0xf;
4535               record_arm_bx_glue (link_info, reg);
4536               continue;
4537             }
4538
4539           /* If the relocation is not against a symbol it cannot concern us.  */
4540           h = NULL;
4541
4542           /* We don't care about local symbols.  */
4543           if (r_index < symtab_hdr->sh_info)
4544             continue;
4545
4546           /* This is an external symbol.  */
4547           r_index -= symtab_hdr->sh_info;
4548           h = (struct elf_link_hash_entry *)
4549             elf_sym_hashes (abfd)[r_index];
4550
4551           /* If the relocation is against a static symbol it must be within
4552              the current section and so cannot be a cross ARM/Thumb relocation.  */
4553           if (h == NULL)
4554             continue;
4555
4556           /* If the call will go through a PLT entry then we do not need
4557              glue.  */
4558           if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1)
4559             continue;
4560
4561           switch (r_type)
4562             {
4563             case R_ARM_PC24:
4564             case R_ARM_PLT32:
4565             case R_ARM_JUMP24:
4566               /* This one is a call from arm code.  We need to look up
4567                  the target of the call.  If it is a thumb target, we
4568                  insert glue.  */
4569               if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC
4570                   && !(r_type == R_ARM_CALL && globals->use_blx))
4571                 record_arm_to_thumb_glue (link_info, h);
4572               break;
4573
4574             case R_ARM_THM_JUMP24:
4575               /* This one is a call from thumb code.  We look
4576                  up the target of the call.  If it is not a thumb
4577                  target, we insert glue.  */
4578               if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC
4579                   && !(globals->use_blx && r_type == R_ARM_THM_CALL)
4580                   && h->root.type != bfd_link_hash_undefweak)
4581                 record_thumb_to_arm_glue (link_info, h);
4582               break;
4583
4584             default:
4585               abort ();
4586             }
4587         }
4588
4589       if (contents != NULL
4590           && elf_section_data (sec)->this_hdr.contents != contents)
4591         free (contents);
4592       contents = NULL;
4593
4594       if (internal_relocs != NULL
4595           && elf_section_data (sec)->relocs != internal_relocs)
4596         free (internal_relocs);
4597       internal_relocs = NULL;
4598     }
4599
4600   return TRUE;
4601
4602 error_return:
4603   if (contents != NULL
4604       && elf_section_data (sec)->this_hdr.contents != contents)
4605     free (contents);
4606   if (internal_relocs != NULL
4607       && elf_section_data (sec)->relocs != internal_relocs)
4608     free (internal_relocs);
4609
4610   return FALSE;
4611 }
4612 #endif
4613
4614
4615 /* Initialise maps of ARM/Thumb/data for input BFDs.  */
4616
4617 void
4618 bfd_elf32_arm_init_maps (bfd *abfd)
4619 {
4620   Elf_Internal_Sym *isymbuf;
4621   Elf_Internal_Shdr *hdr;
4622   unsigned int i, localsyms;
4623
4624   if ((abfd->flags & DYNAMIC) != 0)
4625     return;
4626
4627   hdr = & elf_symtab_hdr (abfd);
4628   localsyms = hdr->sh_info;
4629
4630   /* Obtain a buffer full of symbols for this BFD. The hdr->sh_info field
4631      should contain the number of local symbols, which should come before any
4632      global symbols.  Mapping symbols are always local.  */
4633   isymbuf = bfd_elf_get_elf_syms (abfd, hdr, localsyms, 0, NULL, NULL,
4634                                   NULL);
4635
4636   /* No internal symbols read?  Skip this BFD.  */
4637   if (isymbuf == NULL)
4638     return;
4639
4640   for (i = 0; i < localsyms; i++)
4641     {
4642       Elf_Internal_Sym *isym = &isymbuf[i];
4643       asection *sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
4644       const char *name;
4645
4646       if (sec != NULL
4647           && ELF_ST_BIND (isym->st_info) == STB_LOCAL)
4648         {
4649           name = bfd_elf_string_from_elf_section (abfd,
4650             hdr->sh_link, isym->st_name);
4651
4652           if (bfd_is_arm_special_symbol_name (name,
4653                                               BFD_ARM_SPECIAL_SYM_TYPE_MAP))
4654             elf32_arm_section_map_add (sec, name[1], isym->st_value);
4655         }
4656     }
4657 }
4658
4659
4660 void
4661 bfd_elf32_arm_set_vfp11_fix (bfd *obfd, struct bfd_link_info *link_info)
4662 {
4663   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
4664   obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd);
4665
4666   /* We assume that ARMv7+ does not need the VFP11 denorm erratum fix.  */
4667   if (out_attr[Tag_CPU_arch].i >= TAG_CPU_ARCH_V7)
4668     {
4669       switch (globals->vfp11_fix)
4670         {
4671         case BFD_ARM_VFP11_FIX_DEFAULT:
4672         case BFD_ARM_VFP11_FIX_NONE:
4673           globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
4674           break;
4675
4676         default:
4677           /* Give a warning, but do as the user requests anyway.  */
4678           (*_bfd_error_handler) (_("%B: warning: selected VFP11 erratum "
4679             "workaround is not necessary for target architecture"), obfd);
4680         }
4681     }
4682   else if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_DEFAULT)
4683     /* For earlier architectures, we might need the workaround, but do not
4684        enable it by default.  If users is running with broken hardware, they
4685        must enable the erratum fix explicitly.  */
4686     globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
4687 }
4688
4689
4690 enum bfd_arm_vfp11_pipe
4691 {
4692   VFP11_FMAC,
4693   VFP11_LS,
4694   VFP11_DS,
4695   VFP11_BAD
4696 };
4697
4698 /* Return a VFP register number.  This is encoded as RX:X for single-precision
4699    registers, or X:RX for double-precision registers, where RX is the group of
4700    four bits in the instruction encoding and X is the single extension bit.
4701    RX and X fields are specified using their lowest (starting) bit.  The return
4702    value is:
4703
4704      0...31: single-precision registers s0...s31
4705      32...63: double-precision registers d0...d31.
4706
4707    Although X should be zero for VFP11 (encoding d0...d15 only), we might
4708    encounter VFP3 instructions, so we allow the full range for DP registers.  */
4709
4710 static unsigned int
4711 bfd_arm_vfp11_regno (unsigned int insn, bfd_boolean is_double, unsigned int rx,
4712                      unsigned int x)
4713 {
4714   if (is_double)
4715     return (((insn >> rx) & 0xf) | (((insn >> x) & 1) << 4)) + 32;
4716   else
4717     return (((insn >> rx) & 0xf) << 1) | ((insn >> x) & 1);
4718 }
4719
4720 /* Set bits in *WMASK according to a register number REG as encoded by
4721    bfd_arm_vfp11_regno().  Ignore d16-d31.  */
4722
4723 static void
4724 bfd_arm_vfp11_write_mask (unsigned int *wmask, unsigned int reg)
4725 {
4726   if (reg < 32)
4727     *wmask |= 1 << reg;
4728   else if (reg < 48)
4729     *wmask |= 3 << ((reg - 32) * 2);
4730 }
4731
4732 /* Return TRUE if WMASK overwrites anything in REGS.  */
4733
4734 static bfd_boolean
4735 bfd_arm_vfp11_antidependency (unsigned int wmask, int *regs, int numregs)
4736 {
4737   int i;
4738
4739   for (i = 0; i < numregs; i++)
4740     {
4741       unsigned int reg = regs[i];
4742
4743       if (reg < 32 && (wmask & (1 << reg)) != 0)
4744         return TRUE;
4745
4746       reg -= 32;
4747
4748       if (reg >= 16)
4749         continue;
4750
4751       if ((wmask & (3 << (reg * 2))) != 0)
4752         return TRUE;
4753     }
4754
4755   return FALSE;
4756 }
4757
4758 /* In this function, we're interested in two things: finding input registers
4759    for VFP data-processing instructions, and finding the set of registers which
4760    arbitrary VFP instructions may write to.  We use a 32-bit unsigned int to
4761    hold the written set, so FLDM etc. are easy to deal with (we're only
4762    interested in 32 SP registers or 16 dp registers, due to the VFP version
4763    implemented by the chip in question).  DP registers are marked by setting
4764    both SP registers in the write mask).  */
4765
4766 static enum bfd_arm_vfp11_pipe
4767 bfd_arm_vfp11_insn_decode (unsigned int insn, unsigned int *destmask, int *regs,
4768                            int *numregs)
4769 {
4770   enum bfd_arm_vfp11_pipe pipe = VFP11_BAD;
4771   bfd_boolean is_double = ((insn & 0xf00) == 0xb00) ? 1 : 0;
4772
4773   if ((insn & 0x0f000e10) == 0x0e000a00)  /* A data-processing insn.  */
4774     {
4775       unsigned int pqrs;
4776       unsigned int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
4777       unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
4778
4779       pqrs = ((insn & 0x00800000) >> 20)
4780            | ((insn & 0x00300000) >> 19)
4781            | ((insn & 0x00000040) >> 6);
4782
4783       switch (pqrs)
4784         {
4785         case 0: /* fmac[sd].  */
4786         case 1: /* fnmac[sd].  */
4787         case 2: /* fmsc[sd].  */
4788         case 3: /* fnmsc[sd].  */
4789           pipe = VFP11_FMAC;
4790           bfd_arm_vfp11_write_mask (destmask, fd);
4791           regs[0] = fd;
4792           regs[1] = bfd_arm_vfp11_regno (insn, is_double, 16, 7);  /* Fn.  */
4793           regs[2] = fm;
4794           *numregs = 3;
4795           break;
4796
4797         case 4: /* fmul[sd].  */
4798         case 5: /* fnmul[sd].  */
4799         case 6: /* fadd[sd].  */
4800         case 7: /* fsub[sd].  */
4801           pipe = VFP11_FMAC;
4802           goto vfp_binop;
4803
4804         case 8: /* fdiv[sd].  */
4805           pipe = VFP11_DS;
4806           vfp_binop:
4807           bfd_arm_vfp11_write_mask (destmask, fd);
4808           regs[0] = bfd_arm_vfp11_regno (insn, is_double, 16, 7);   /* Fn.  */
4809           regs[1] = fm;
4810           *numregs = 2;
4811           break;
4812
4813         case 15: /* extended opcode.  */
4814           {
4815             unsigned int extn = ((insn >> 15) & 0x1e)
4816                               | ((insn >> 7) & 1);
4817
4818             switch (extn)
4819               {
4820               case 0: /* fcpy[sd].  */
4821               case 1: /* fabs[sd].  */
4822               case 2: /* fneg[sd].  */
4823               case 8: /* fcmp[sd].  */
4824               case 9: /* fcmpe[sd].  */
4825               case 10: /* fcmpz[sd].  */
4826               case 11: /* fcmpez[sd].  */
4827               case 16: /* fuito[sd].  */
4828               case 17: /* fsito[sd].  */
4829               case 24: /* ftoui[sd].  */
4830               case 25: /* ftouiz[sd].  */
4831               case 26: /* ftosi[sd].  */
4832               case 27: /* ftosiz[sd].  */
4833                 /* These instructions will not bounce due to underflow.  */
4834                 *numregs = 0;
4835                 pipe = VFP11_FMAC;
4836                 break;
4837
4838               case 3: /* fsqrt[sd].  */
4839                 /* fsqrt cannot underflow, but it can (perhaps) overwrite
4840                    registers to cause the erratum in previous instructions.  */
4841                 bfd_arm_vfp11_write_mask (destmask, fd);
4842                 pipe = VFP11_DS;
4843                 break;
4844
4845               case 15: /* fcvt{ds,sd}.  */
4846                 {
4847                   int rnum = 0;
4848
4849                   bfd_arm_vfp11_write_mask (destmask, fd);
4850
4851                   /* Only FCVTSD can underflow.  */
4852                   if ((insn & 0x100) != 0)
4853                     regs[rnum++] = fm;
4854
4855                   *numregs = rnum;
4856
4857                   pipe = VFP11_FMAC;
4858                 }
4859                 break;
4860
4861               default:
4862                 return VFP11_BAD;
4863               }
4864           }
4865           break;
4866
4867         default:
4868           return VFP11_BAD;
4869         }
4870     }
4871   /* Two-register transfer.  */
4872   else if ((insn & 0x0fe00ed0) == 0x0c400a10)
4873     {
4874       unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
4875
4876       if ((insn & 0x100000) == 0)
4877         {
4878           if (is_double)
4879             bfd_arm_vfp11_write_mask (destmask, fm);
4880           else
4881             {
4882               bfd_arm_vfp11_write_mask (destmask, fm);
4883               bfd_arm_vfp11_write_mask (destmask, fm + 1);
4884             }
4885         }
4886
4887       pipe = VFP11_LS;
4888     }
4889   else if ((insn & 0x0e100e00) == 0x0c100a00)  /* A load insn.  */
4890     {
4891       int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
4892       unsigned int puw = ((insn >> 21) & 0x1) | (((insn >> 23) & 3) << 1);
4893
4894       switch (puw)
4895         {
4896         case 0: /* Two-reg transfer.  We should catch these above.  */
4897           abort ();
4898
4899         case 2: /* fldm[sdx].  */
4900         case 3:
4901         case 5:
4902           {
4903             unsigned int i, offset = insn & 0xff;
4904
4905             if (is_double)
4906               offset >>= 1;
4907
4908             for (i = fd; i < fd + offset; i++)
4909               bfd_arm_vfp11_write_mask (destmask, i);
4910           }
4911           break;
4912
4913         case 4: /* fld[sd].  */
4914         case 6:
4915           bfd_arm_vfp11_write_mask (destmask, fd);
4916           break;
4917
4918         default:
4919           return VFP11_BAD;
4920         }
4921
4922       pipe = VFP11_LS;
4923     }
4924   /* Single-register transfer. Note L==0.  */
4925   else if ((insn & 0x0f100e10) == 0x0e000a10)
4926     {
4927       unsigned int opcode = (insn >> 21) & 7;
4928       unsigned int fn = bfd_arm_vfp11_regno (insn, is_double, 16, 7);
4929
4930       switch (opcode)
4931         {
4932         case 0: /* fmsr/fmdlr.  */
4933         case 1: /* fmdhr.  */
4934           /* Mark fmdhr and fmdlr as writing to the whole of the DP
4935              destination register.  I don't know if this is exactly right,
4936              but it is the conservative choice.  */
4937           bfd_arm_vfp11_write_mask (destmask, fn);
4938           break;
4939
4940         case 7: /* fmxr.  */
4941           break;
4942         }
4943
4944       pipe = VFP11_LS;
4945     }
4946
4947   return pipe;
4948 }
4949
4950
4951 static int elf32_arm_compare_mapping (const void * a, const void * b);
4952
4953
4954 /* Look for potentially-troublesome code sequences which might trigger the
4955    VFP11 denormal/antidependency erratum.  See, e.g., the ARM1136 errata sheet
4956    (available from ARM) for details of the erratum.  A short version is
4957    described in ld.texinfo.  */
4958
4959 bfd_boolean
4960 bfd_elf32_arm_vfp11_erratum_scan (bfd *abfd, struct bfd_link_info *link_info)
4961 {
4962   asection *sec;
4963   bfd_byte *contents = NULL;
4964   int state = 0;
4965   int regs[3], numregs = 0;
4966   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
4967   int use_vector = (globals->vfp11_fix == BFD_ARM_VFP11_FIX_VECTOR);
4968
4969   /* We use a simple FSM to match troublesome VFP11 instruction sequences.
4970      The states transition as follows:
4971
4972        0 -> 1 (vector) or 0 -> 2 (scalar)
4973            A VFP FMAC-pipeline instruction has been seen. Fill
4974            regs[0]..regs[numregs-1] with its input operands. Remember this
4975            instruction in 'first_fmac'.
4976
4977        1 -> 2
4978            Any instruction, except for a VFP instruction which overwrites
4979            regs[*].
4980
4981        1 -> 3 [ -> 0 ]  or
4982        2 -> 3 [ -> 0 ]
4983            A VFP instruction has been seen which overwrites any of regs[*].
4984            We must make a veneer!  Reset state to 0 before examining next
4985            instruction.
4986
4987        2 -> 0
4988            If we fail to match anything in state 2, reset to state 0 and reset
4989            the instruction pointer to the instruction after 'first_fmac'.
4990
4991      If the VFP11 vector mode is in use, there must be at least two unrelated
4992      instructions between anti-dependent VFP11 instructions to properly avoid
4993      triggering the erratum, hence the use of the extra state 1.  */
4994
4995   /* If we are only performing a partial link do not bother
4996      to construct any glue.  */
4997   if (link_info->relocatable)
4998     return TRUE;
4999
5000   /* Skip if this bfd does not correspond to an ELF image.  */
5001   if (! is_arm_elf (abfd))
5002     return TRUE;
5003
5004   /* We should have chosen a fix type by the time we get here.  */
5005   BFD_ASSERT (globals->vfp11_fix != BFD_ARM_VFP11_FIX_DEFAULT);
5006
5007   if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_NONE)
5008     return TRUE;
5009
5010   for (sec = abfd->sections; sec != NULL; sec = sec->next)
5011     {
5012       unsigned int i, span, first_fmac = 0, veneer_of_insn = 0;
5013       struct _arm_elf_section_data *sec_data;
5014
5015       /* If we don't have executable progbits, we're not interested in this
5016          section.  Also skip if section is to be excluded.  */
5017       if (elf_section_type (sec) != SHT_PROGBITS
5018           || (elf_section_flags (sec) & SHF_EXECINSTR) == 0
5019           || (sec->flags & SEC_EXCLUDE) != 0
5020           || strcmp (sec->name, VFP11_ERRATUM_VENEER_SECTION_NAME) == 0)
5021         continue;
5022
5023       sec_data = elf32_arm_section_data (sec);
5024
5025       if (sec_data->mapcount == 0)
5026         continue;
5027
5028       if (elf_section_data (sec)->this_hdr.contents != NULL)
5029         contents = elf_section_data (sec)->this_hdr.contents;
5030       else if (! bfd_malloc_and_get_section (abfd, sec, &contents))
5031         goto error_return;
5032
5033       qsort (sec_data->map, sec_data->mapcount, sizeof (elf32_arm_section_map),
5034              elf32_arm_compare_mapping);
5035
5036       for (span = 0; span < sec_data->mapcount; span++)
5037         {
5038           unsigned int span_start = sec_data->map[span].vma;
5039           unsigned int span_end = (span == sec_data->mapcount - 1)
5040                                   ? sec->size : sec_data->map[span + 1].vma;
5041           char span_type = sec_data->map[span].type;
5042
5043           /* FIXME: Only ARM mode is supported at present.  We may need to
5044              support Thumb-2 mode also at some point.  */
5045           if (span_type != 'a')
5046             continue;
5047
5048           for (i = span_start; i < span_end;)
5049             {
5050               unsigned int next_i = i + 4;
5051               unsigned int insn = bfd_big_endian (abfd)
5052                 ? (contents[i] << 24)
5053                   | (contents[i + 1] << 16)
5054                   | (contents[i + 2] << 8)
5055                   | contents[i + 3]
5056                 : (contents[i + 3] << 24)
5057                   | (contents[i + 2] << 16)
5058                   | (contents[i + 1] << 8)
5059                   | contents[i];
5060               unsigned int writemask = 0;
5061               enum bfd_arm_vfp11_pipe pipe;
5062
5063               switch (state)
5064                 {
5065                 case 0:
5066                   pipe = bfd_arm_vfp11_insn_decode (insn, &writemask, regs,
5067                                                     &numregs);
5068                   /* I'm assuming the VFP11 erratum can trigger with denorm
5069                      operands on either the FMAC or the DS pipeline. This might
5070                      lead to slightly overenthusiastic veneer insertion.  */
5071                   if (pipe == VFP11_FMAC || pipe == VFP11_DS)
5072                     {
5073                       state = use_vector ? 1 : 2;
5074                       first_fmac = i;
5075                       veneer_of_insn = insn;
5076                     }
5077                   break;
5078
5079                 case 1:
5080                   {
5081                     int other_regs[3], other_numregs;
5082                     pipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
5083                                                       other_regs,
5084                                                       &other_numregs);
5085                     if (pipe != VFP11_BAD
5086                         && bfd_arm_vfp11_antidependency (writemask, regs,
5087                                                          numregs))
5088                       state = 3;
5089                     else
5090                       state = 2;
5091                   }
5092                   break;
5093
5094                 case 2:
5095                   {
5096                     int other_regs[3], other_numregs;
5097                     pipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
5098                                                       other_regs,
5099                                                       &other_numregs);
5100                     if (pipe != VFP11_BAD
5101                         && bfd_arm_vfp11_antidependency (writemask, regs,
5102                                                          numregs))
5103                       state = 3;
5104                     else
5105                       {
5106                         state = 0;
5107                         next_i = first_fmac + 4;
5108                       }
5109                   }
5110                   break;
5111
5112                 case 3:
5113                   abort ();  /* Should be unreachable.  */
5114                 }
5115
5116               if (state == 3)
5117                 {
5118                   elf32_vfp11_erratum_list *newerr
5119                     = bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
5120                   int errcount;
5121
5122                   errcount = ++(elf32_arm_section_data (sec)->erratumcount);
5123
5124                   newerr->u.b.vfp_insn = veneer_of_insn;
5125
5126                   switch (span_type)
5127                     {
5128                     case 'a':
5129                       newerr->type = VFP11_ERRATUM_BRANCH_TO_ARM_VENEER;
5130                       break;
5131
5132                     default:
5133                       abort ();
5134                     }
5135
5136                   record_vfp11_erratum_veneer (link_info, newerr, abfd, sec,
5137                                                first_fmac);
5138
5139                   newerr->vma = -1;
5140
5141                   newerr->next = sec_data->erratumlist;
5142                   sec_data->erratumlist = newerr;
5143
5144                   state = 0;
5145                 }
5146
5147               i = next_i;
5148             }
5149         }
5150
5151       if (contents != NULL
5152           && elf_section_data (sec)->this_hdr.contents != contents)
5153         free (contents);
5154       contents = NULL;
5155     }
5156
5157   return TRUE;
5158
5159 error_return:
5160   if (contents != NULL
5161       && elf_section_data (sec)->this_hdr.contents != contents)
5162     free (contents);
5163
5164   return FALSE;
5165 }
5166
5167 /* Find virtual-memory addresses for VFP11 erratum veneers and return locations
5168    after sections have been laid out, using specially-named symbols.  */
5169
5170 void
5171 bfd_elf32_arm_vfp11_fix_veneer_locations (bfd *abfd,
5172                                           struct bfd_link_info *link_info)
5173 {
5174   asection *sec;
5175   struct elf32_arm_link_hash_table *globals;
5176   char *tmp_name;
5177
5178   if (link_info->relocatable)
5179     return;
5180
5181   /* Skip if this bfd does not correspond to an ELF image.  */
5182   if (! is_arm_elf (abfd))
5183     return;
5184
5185   globals = elf32_arm_hash_table (link_info);
5186
5187   tmp_name = bfd_malloc ((bfd_size_type) strlen
5188                            (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
5189
5190   for (sec = abfd->sections; sec != NULL; sec = sec->next)
5191     {
5192       struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
5193       elf32_vfp11_erratum_list *errnode = sec_data->erratumlist;
5194
5195       for (; errnode != NULL; errnode = errnode->next)
5196         {
5197           struct elf_link_hash_entry *myh;
5198           bfd_vma vma;
5199
5200           switch (errnode->type)
5201             {
5202             case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
5203             case VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER:
5204               /* Find veneer symbol.  */
5205               sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
5206                        errnode->u.b.veneer->u.v.id);
5207
5208               myh = elf_link_hash_lookup
5209                 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
5210
5211               if (myh == NULL)
5212                 (*_bfd_error_handler) (_("%B: unable to find VFP11 veneer "
5213                                          "`%s'"), abfd, tmp_name);
5214
5215               vma = myh->root.u.def.section->output_section->vma
5216                     + myh->root.u.def.section->output_offset
5217                     + myh->root.u.def.value;
5218
5219               errnode->u.b.veneer->vma = vma;
5220               break;
5221
5222             case VFP11_ERRATUM_ARM_VENEER:
5223             case VFP11_ERRATUM_THUMB_VENEER:
5224               /* Find return location.  */
5225               sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
5226                        errnode->u.v.id);
5227
5228               myh = elf_link_hash_lookup
5229                 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
5230
5231               if (myh == NULL)
5232                 (*_bfd_error_handler) (_("%B: unable to find VFP11 veneer "
5233                                          "`%s'"), abfd, tmp_name);
5234
5235               vma = myh->root.u.def.section->output_section->vma
5236                     + myh->root.u.def.section->output_offset
5237                     + myh->root.u.def.value;
5238
5239               errnode->u.v.branch->vma = vma;
5240               break;
5241
5242             default:
5243               abort ();
5244             }
5245         }
5246     }
5247
5248   free (tmp_name);
5249 }
5250
5251
5252 /* Set target relocation values needed during linking.  */
5253
5254 void
5255 bfd_elf32_arm_set_target_relocs (struct bfd *output_bfd,
5256                                  struct bfd_link_info *link_info,
5257                                  int target1_is_rel,
5258                                  char * target2_type,
5259                                  int fix_v4bx,
5260                                  int use_blx,
5261                                  bfd_arm_vfp11_fix vfp11_fix,
5262                                  int no_enum_warn, int no_wchar_warn,
5263                                  int pic_veneer)
5264 {
5265   struct elf32_arm_link_hash_table *globals;
5266
5267   globals = elf32_arm_hash_table (link_info);
5268
5269   globals->target1_is_rel = target1_is_rel;
5270   if (strcmp (target2_type, "rel") == 0)
5271     globals->target2_reloc = R_ARM_REL32;
5272   else if (strcmp (target2_type, "abs") == 0)
5273     globals->target2_reloc = R_ARM_ABS32;
5274   else if (strcmp (target2_type, "got-rel") == 0)
5275     globals->target2_reloc = R_ARM_GOT_PREL;
5276   else
5277     {
5278       _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
5279                           target2_type);
5280     }
5281   globals->fix_v4bx = fix_v4bx;
5282   globals->use_blx |= use_blx;
5283   globals->vfp11_fix = vfp11_fix;
5284   globals->pic_veneer = pic_veneer;
5285
5286   BFD_ASSERT (is_arm_elf (output_bfd));
5287   elf_arm_tdata (output_bfd)->no_enum_size_warning = no_enum_warn;
5288   elf_arm_tdata (output_bfd)->no_wchar_size_warning = no_wchar_warn;
5289 }
5290
5291 /* Replace the target offset of a Thumb bl or b.w instruction.  */
5292
5293 static void
5294 insert_thumb_branch (bfd *abfd, long int offset, bfd_byte *insn)
5295 {
5296   bfd_vma upper;
5297   bfd_vma lower;
5298   int reloc_sign;
5299
5300   BFD_ASSERT ((offset & 1) == 0);
5301
5302   upper = bfd_get_16 (abfd, insn);
5303   lower = bfd_get_16 (abfd, insn + 2);
5304   reloc_sign = (offset < 0) ? 1 : 0;
5305   upper = (upper & ~(bfd_vma) 0x7ff)
5306           | ((offset >> 12) & 0x3ff)
5307           | (reloc_sign << 10);
5308   lower = (lower & ~(bfd_vma) 0x2fff)
5309           | (((!((offset >> 23) & 1)) ^ reloc_sign) << 13)
5310           | (((!((offset >> 22) & 1)) ^ reloc_sign) << 11)
5311           | ((offset >> 1) & 0x7ff);
5312   bfd_put_16 (abfd, upper, insn);
5313   bfd_put_16 (abfd, lower, insn + 2);
5314 }
5315
5316 /* Thumb code calling an ARM function.  */
5317
5318 static int
5319 elf32_thumb_to_arm_stub (struct bfd_link_info * info,
5320                          const char *           name,
5321                          bfd *                  input_bfd,
5322                          bfd *                  output_bfd,
5323                          asection *             input_section,
5324                          bfd_byte *             hit_data,
5325                          asection *             sym_sec,
5326                          bfd_vma                offset,
5327                          bfd_signed_vma         addend,
5328                          bfd_vma                val,
5329                          char **error_message)
5330 {
5331   asection * s = 0;
5332   bfd_vma my_offset;
5333   long int ret_offset;
5334   struct elf_link_hash_entry * myh;
5335   struct elf32_arm_link_hash_table * globals;
5336
5337   myh = find_thumb_glue (info, name, error_message);
5338   if (myh == NULL)
5339     return FALSE;
5340
5341   globals = elf32_arm_hash_table (info);
5342
5343   BFD_ASSERT (globals != NULL);
5344   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5345
5346   my_offset = myh->root.u.def.value;
5347
5348   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
5349                                THUMB2ARM_GLUE_SECTION_NAME);
5350
5351   BFD_ASSERT (s != NULL);
5352   BFD_ASSERT (s->contents != NULL);
5353   BFD_ASSERT (s->output_section != NULL);
5354
5355   if ((my_offset & 0x01) == 0x01)
5356     {
5357       if (sym_sec != NULL
5358           && sym_sec->owner != NULL
5359           && !INTERWORK_FLAG (sym_sec->owner))
5360         {
5361           (*_bfd_error_handler)
5362             (_("%B(%s): warning: interworking not enabled.\n"
5363                "  first occurrence: %B: thumb call to arm"),
5364              sym_sec->owner, input_bfd, name);
5365
5366           return FALSE;
5367         }
5368
5369       --my_offset;
5370       myh->root.u.def.value = my_offset;
5371
5372       put_thumb_insn (globals, output_bfd, (bfd_vma) t2a1_bx_pc_insn,
5373                       s->contents + my_offset);
5374
5375       put_thumb_insn (globals, output_bfd, (bfd_vma) t2a2_noop_insn,
5376                       s->contents + my_offset + 2);
5377
5378       ret_offset =
5379         /* Address of destination of the stub.  */
5380         ((bfd_signed_vma) val)
5381         - ((bfd_signed_vma)
5382            /* Offset from the start of the current section
5383               to the start of the stubs.  */
5384            (s->output_offset
5385             /* Offset of the start of this stub from the start of the stubs.  */
5386             + my_offset
5387             /* Address of the start of the current section.  */
5388             + s->output_section->vma)
5389            /* The branch instruction is 4 bytes into the stub.  */
5390            + 4
5391            /* ARM branches work from the pc of the instruction + 8.  */
5392            + 8);
5393
5394       put_arm_insn (globals, output_bfd,
5395                     (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
5396                     s->contents + my_offset + 4);
5397     }
5398
5399   BFD_ASSERT (my_offset <= globals->thumb_glue_size);
5400
5401   /* Now go back and fix up the original BL insn to point to here.  */
5402   ret_offset =
5403     /* Address of where the stub is located.  */
5404     (s->output_section->vma + s->output_offset + my_offset)
5405      /* Address of where the BL is located.  */
5406     - (input_section->output_section->vma + input_section->output_offset
5407        + offset)
5408     /* Addend in the relocation.  */
5409     - addend
5410     /* Biassing for PC-relative addressing.  */
5411     - 8;
5412
5413   insert_thumb_branch (input_bfd, ret_offset, hit_data - input_section->vma);
5414
5415   return TRUE;
5416 }
5417
5418 /* Populate an Arm to Thumb stub.  Returns the stub symbol.  */
5419
5420 static struct elf_link_hash_entry *
5421 elf32_arm_create_thumb_stub (struct bfd_link_info * info,
5422                              const char *           name,
5423                              bfd *                  input_bfd,
5424                              bfd *                  output_bfd,
5425                              asection *             sym_sec,
5426                              bfd_vma                val,
5427                              asection *             s,
5428                              char **                error_message)
5429 {
5430   bfd_vma my_offset;
5431   long int ret_offset;
5432   struct elf_link_hash_entry * myh;
5433   struct elf32_arm_link_hash_table * globals;
5434
5435   myh = find_arm_glue (info, name, error_message);
5436   if (myh == NULL)
5437     return NULL;
5438
5439   globals = elf32_arm_hash_table (info);
5440
5441   BFD_ASSERT (globals != NULL);
5442   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5443
5444   my_offset = myh->root.u.def.value;
5445
5446   if ((my_offset & 0x01) == 0x01)
5447     {
5448       if (sym_sec != NULL
5449           && sym_sec->owner != NULL
5450           && !INTERWORK_FLAG (sym_sec->owner))
5451         {
5452           (*_bfd_error_handler)
5453             (_("%B(%s): warning: interworking not enabled.\n"
5454                "  first occurrence: %B: arm call to thumb"),
5455              sym_sec->owner, input_bfd, name);
5456         }
5457
5458       --my_offset;
5459       myh->root.u.def.value = my_offset;
5460
5461       if (info->shared || globals->root.is_relocatable_executable
5462           || globals->pic_veneer)
5463         {
5464           /* For relocatable objects we can't use absolute addresses,
5465              so construct the address from a relative offset.  */
5466           /* TODO: If the offset is small it's probably worth
5467              constructing the address with adds.  */
5468           put_arm_insn (globals, output_bfd, (bfd_vma) a2t1p_ldr_insn,
5469                         s->contents + my_offset);
5470           put_arm_insn (globals, output_bfd, (bfd_vma) a2t2p_add_pc_insn,
5471                         s->contents + my_offset + 4);
5472           put_arm_insn (globals, output_bfd, (bfd_vma) a2t3p_bx_r12_insn,
5473                         s->contents + my_offset + 8);
5474           /* Adjust the offset by 4 for the position of the add,
5475              and 8 for the pipeline offset.  */
5476           ret_offset = (val - (s->output_offset
5477                                + s->output_section->vma
5478                                + my_offset + 12))
5479                        | 1;
5480           bfd_put_32 (output_bfd, ret_offset,
5481                       s->contents + my_offset + 12);
5482         }
5483       else if (globals->use_blx)
5484         {
5485           put_arm_insn (globals, output_bfd, (bfd_vma) a2t1v5_ldr_insn,
5486                         s->contents + my_offset);
5487
5488           /* It's a thumb address.  Add the low order bit.  */
5489           bfd_put_32 (output_bfd, val | a2t2v5_func_addr_insn,
5490                       s->contents + my_offset + 4);
5491         }
5492       else
5493         {
5494           put_arm_insn (globals, output_bfd, (bfd_vma) a2t1_ldr_insn,
5495                         s->contents + my_offset);
5496
5497           put_arm_insn (globals, output_bfd, (bfd_vma) a2t2_bx_r12_insn,
5498                         s->contents + my_offset + 4);
5499
5500           /* It's a thumb address.  Add the low order bit.  */
5501           bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
5502                       s->contents + my_offset + 8);
5503
5504           my_offset += 12;
5505         }
5506     }
5507
5508   BFD_ASSERT (my_offset <= globals->arm_glue_size);
5509
5510   return myh;
5511 }
5512
5513 /* Arm code calling a Thumb function.  */
5514
5515 static int
5516 elf32_arm_to_thumb_stub (struct bfd_link_info * info,
5517                          const char *           name,
5518                          bfd *                  input_bfd,
5519                          bfd *                  output_bfd,
5520                          asection *             input_section,
5521                          bfd_byte *             hit_data,
5522                          asection *             sym_sec,
5523                          bfd_vma                offset,
5524                          bfd_signed_vma         addend,
5525                          bfd_vma                val,
5526                          char **error_message)
5527 {
5528   unsigned long int tmp;
5529   bfd_vma my_offset;
5530   asection * s;
5531   long int ret_offset;
5532   struct elf_link_hash_entry * myh;
5533   struct elf32_arm_link_hash_table * globals;
5534
5535   globals = elf32_arm_hash_table (info);
5536
5537   BFD_ASSERT (globals != NULL);
5538   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5539
5540   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
5541                                ARM2THUMB_GLUE_SECTION_NAME);
5542   BFD_ASSERT (s != NULL);
5543   BFD_ASSERT (s->contents != NULL);
5544   BFD_ASSERT (s->output_section != NULL);
5545
5546   myh = elf32_arm_create_thumb_stub (info, name, input_bfd, output_bfd,
5547                                      sym_sec, val, s, error_message);
5548   if (!myh)
5549     return FALSE;
5550
5551   my_offset = myh->root.u.def.value;
5552   tmp = bfd_get_32 (input_bfd, hit_data);
5553   tmp = tmp & 0xFF000000;
5554
5555   /* Somehow these are both 4 too far, so subtract 8.  */
5556   ret_offset = (s->output_offset
5557                 + my_offset
5558                 + s->output_section->vma
5559                 - (input_section->output_offset
5560                    + input_section->output_section->vma
5561                    + offset + addend)
5562                 - 8);
5563
5564   tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
5565
5566   bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
5567
5568   return TRUE;
5569 }
5570
5571 /* Populate Arm stub for an exported Thumb function.  */
5572
5573 static bfd_boolean
5574 elf32_arm_to_thumb_export_stub (struct elf_link_hash_entry *h, void * inf)
5575 {
5576   struct bfd_link_info * info = (struct bfd_link_info *) inf;
5577   asection * s;
5578   struct elf_link_hash_entry * myh;
5579   struct elf32_arm_link_hash_entry *eh;
5580   struct elf32_arm_link_hash_table * globals;
5581   asection *sec;
5582   bfd_vma val;
5583   char *error_message;
5584
5585   eh = elf32_arm_hash_entry (h);
5586   /* Allocate stubs for exported Thumb functions on v4t.  */
5587   if (eh->export_glue == NULL)
5588     return TRUE;
5589
5590   globals = elf32_arm_hash_table (info);
5591
5592   BFD_ASSERT (globals != NULL);
5593   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5594
5595   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
5596                                ARM2THUMB_GLUE_SECTION_NAME);
5597   BFD_ASSERT (s != NULL);
5598   BFD_ASSERT (s->contents != NULL);
5599   BFD_ASSERT (s->output_section != NULL);
5600
5601   sec = eh->export_glue->root.u.def.section;
5602
5603   BFD_ASSERT (sec->output_section != NULL);
5604
5605   val = eh->export_glue->root.u.def.value + sec->output_offset
5606         + sec->output_section->vma;
5607
5608   myh = elf32_arm_create_thumb_stub (info, h->root.root.string,
5609                                      h->root.u.def.section->owner,
5610                                      globals->obfd, sec, val, s,
5611                                      &error_message);
5612   BFD_ASSERT (myh);
5613   return TRUE;
5614 }
5615
5616 /* Populate ARMv4 BX veneers.  Returns the absolute adress of the veneer.  */
5617
5618 static bfd_vma
5619 elf32_arm_bx_glue (struct bfd_link_info * info, int reg)
5620 {
5621   bfd_byte *p;
5622   bfd_vma glue_addr;
5623   asection *s;
5624   struct elf32_arm_link_hash_table *globals;
5625
5626   globals = elf32_arm_hash_table (info);
5627
5628   BFD_ASSERT (globals != NULL);
5629   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
5630
5631   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
5632                                ARM_BX_GLUE_SECTION_NAME);
5633   BFD_ASSERT (s != NULL);
5634   BFD_ASSERT (s->contents != NULL);
5635   BFD_ASSERT (s->output_section != NULL);
5636
5637   BFD_ASSERT (globals->bx_glue_offset[reg] & 2);
5638
5639   glue_addr = globals->bx_glue_offset[reg] & ~(bfd_vma)3;
5640
5641   if ((globals->bx_glue_offset[reg] & 1) == 0)
5642     {
5643       p = s->contents + glue_addr;
5644       bfd_put_32 (globals->obfd, armbx1_tst_insn + (reg << 16), p);
5645       bfd_put_32 (globals->obfd, armbx2_moveq_insn + reg, p + 4);
5646       bfd_put_32 (globals->obfd, armbx3_bx_insn + reg, p + 8);
5647       globals->bx_glue_offset[reg] |= 1;
5648     }
5649
5650   return glue_addr + s->output_section->vma + s->output_offset;
5651 }
5652
5653 /* Generate Arm stubs for exported Thumb symbols.  */
5654 static void
5655 elf32_arm_begin_write_processing (bfd *abfd ATTRIBUTE_UNUSED,
5656                                   struct bfd_link_info *link_info)
5657 {
5658   struct elf32_arm_link_hash_table * globals;
5659
5660   if (link_info == NULL)
5661     /* Ignore this if we are not called by the ELF backend linker.  */
5662     return;
5663
5664   globals = elf32_arm_hash_table (link_info);
5665   /* If blx is available then exported Thumb symbols are OK and there is
5666      nothing to do.  */
5667   if (globals->use_blx)
5668     return;
5669
5670   elf_link_hash_traverse (&globals->root, elf32_arm_to_thumb_export_stub,
5671                           link_info);
5672 }
5673
5674 /* Some relocations map to different relocations depending on the
5675    target.  Return the real relocation.  */
5676
5677 static int
5678 arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
5679                      int r_type)
5680 {
5681   switch (r_type)
5682     {
5683     case R_ARM_TARGET1:
5684       if (globals->target1_is_rel)
5685         return R_ARM_REL32;
5686       else
5687         return R_ARM_ABS32;
5688
5689     case R_ARM_TARGET2:
5690       return globals->target2_reloc;
5691
5692     default:
5693       return r_type;
5694     }
5695 }
5696
5697 /* Return the base VMA address which should be subtracted from real addresses
5698    when resolving @dtpoff relocation.
5699    This is PT_TLS segment p_vaddr.  */
5700
5701 static bfd_vma
5702 dtpoff_base (struct bfd_link_info *info)
5703 {
5704   /* If tls_sec is NULL, we should have signalled an error already.  */
5705   if (elf_hash_table (info)->tls_sec == NULL)
5706     return 0;
5707   return elf_hash_table (info)->tls_sec->vma;
5708 }
5709
5710 /* Return the relocation value for @tpoff relocation
5711    if STT_TLS virtual address is ADDRESS.  */
5712
5713 static bfd_vma
5714 tpoff (struct bfd_link_info *info, bfd_vma address)
5715 {
5716   struct elf_link_hash_table *htab = elf_hash_table (info);
5717   bfd_vma base;
5718
5719   /* If tls_sec is NULL, we should have signalled an error already.  */
5720   if (htab->tls_sec == NULL)
5721     return 0;
5722   base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
5723   return address - htab->tls_sec->vma + base;
5724 }
5725
5726 /* Perform an R_ARM_ABS12 relocation on the field pointed to by DATA.
5727    VALUE is the relocation value.  */
5728
5729 static bfd_reloc_status_type
5730 elf32_arm_abs12_reloc (bfd *abfd, void *data, bfd_vma value)
5731 {
5732   if (value > 0xfff)
5733     return bfd_reloc_overflow;
5734
5735   value |= bfd_get_32 (abfd, data) & 0xfffff000;
5736   bfd_put_32 (abfd, value, data);
5737   return bfd_reloc_ok;
5738 }
5739
5740 /* For a given value of n, calculate the value of G_n as required to
5741    deal with group relocations.  We return it in the form of an
5742    encoded constant-and-rotation, together with the final residual.  If n is
5743    specified as less than zero, then final_residual is filled with the
5744    input value and no further action is performed.  */
5745
5746 static bfd_vma
5747 calculate_group_reloc_mask (bfd_vma value, int n, bfd_vma *final_residual)
5748 {
5749   int current_n;
5750   bfd_vma g_n;
5751   bfd_vma encoded_g_n = 0;
5752   bfd_vma residual = value; /* Also known as Y_n.  */
5753
5754   for (current_n = 0; current_n <= n; current_n++)
5755     {
5756       int shift;
5757
5758       /* Calculate which part of the value to mask.  */
5759       if (residual == 0)
5760         shift = 0;
5761       else
5762         {
5763           int msb;
5764
5765           /* Determine the most significant bit in the residual and
5766              align the resulting value to a 2-bit boundary.  */
5767           for (msb = 30; msb >= 0; msb -= 2)
5768             if (residual & (3 << msb))
5769               break;
5770
5771           /* The desired shift is now (msb - 6), or zero, whichever
5772              is the greater.  */
5773           shift = msb - 6;
5774           if (shift < 0)
5775             shift = 0;
5776         }
5777
5778       /* Calculate g_n in 32-bit as well as encoded constant+rotation form.  */
5779       g_n = residual & (0xff << shift);
5780       encoded_g_n = (g_n >> shift)
5781                     | ((g_n <= 0xff ? 0 : (32 - shift) / 2) << 8);
5782
5783       /* Calculate the residual for the next time around.  */
5784       residual &= ~g_n;
5785     }
5786
5787   *final_residual = residual;
5788
5789   return encoded_g_n;
5790 }
5791
5792 /* Given an ARM instruction, determine whether it is an ADD or a SUB.
5793    Returns 1 if it is an ADD, -1 if it is a SUB, and 0 otherwise.  */
5794
5795 static int
5796 identify_add_or_sub (bfd_vma insn)
5797 {
5798   int opcode = insn & 0x1e00000;
5799
5800   if (opcode == 1 << 23) /* ADD */
5801     return 1;
5802
5803   if (opcode == 1 << 22) /* SUB */
5804     return -1;
5805
5806   return 0;
5807 }
5808
5809 /* Perform a relocation as part of a final link.  */
5810
5811 static bfd_reloc_status_type
5812 elf32_arm_final_link_relocate (reloc_howto_type *           howto,
5813                                bfd *                        input_bfd,
5814                                bfd *                        output_bfd,
5815                                asection *                   input_section,
5816                                bfd_byte *                   contents,
5817                                Elf_Internal_Rela *          rel,
5818                                bfd_vma                      value,
5819                                struct bfd_link_info *       info,
5820                                asection *                   sym_sec,
5821                                const char *                 sym_name,
5822                                int                          sym_flags,
5823                                struct elf_link_hash_entry * h,
5824                                bfd_boolean *                unresolved_reloc_p,
5825                                char **                      error_message)
5826 {
5827   unsigned long                 r_type = howto->type;
5828   unsigned long                 r_symndx;
5829   bfd_byte *                    hit_data = contents + rel->r_offset;
5830   bfd *                         dynobj = NULL;
5831   Elf_Internal_Shdr *           symtab_hdr;
5832   struct elf_link_hash_entry ** sym_hashes;
5833   bfd_vma *                     local_got_offsets;
5834   asection *                    sgot = NULL;
5835   asection *                    splt = NULL;
5836   asection *                    sreloc = NULL;
5837   bfd_vma                       addend;
5838   bfd_signed_vma                signed_addend;
5839   struct elf32_arm_link_hash_table * globals;
5840
5841   globals = elf32_arm_hash_table (info);
5842
5843   BFD_ASSERT (is_arm_elf (input_bfd));
5844
5845   /* Some relocation types map to different relocations depending on the
5846      target.  We pick the right one here.  */
5847   r_type = arm_real_reloc_type (globals, r_type);
5848   if (r_type != howto->type)
5849     howto = elf32_arm_howto_from_type (r_type);
5850
5851   /* If the start address has been set, then set the EF_ARM_HASENTRY
5852      flag.  Setting this more than once is redundant, but the cost is
5853      not too high, and it keeps the code simple.
5854
5855      The test is done  here, rather than somewhere else, because the
5856      start address is only set just before the final link commences.
5857
5858      Note - if the user deliberately sets a start address of 0, the
5859      flag will not be set.  */
5860   if (bfd_get_start_address (output_bfd) != 0)
5861     elf_elfheader (output_bfd)->e_flags |= EF_ARM_HASENTRY;
5862
5863   dynobj = elf_hash_table (info)->dynobj;
5864   if (dynobj)
5865     {
5866       sgot = bfd_get_section_by_name (dynobj, ".got");
5867       splt = bfd_get_section_by_name (dynobj, ".plt");
5868     }
5869   symtab_hdr = & elf_symtab_hdr (input_bfd);
5870   sym_hashes = elf_sym_hashes (input_bfd);
5871   local_got_offsets = elf_local_got_offsets (input_bfd);
5872   r_symndx = ELF32_R_SYM (rel->r_info);
5873
5874   if (globals->use_rel)
5875     {
5876       addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
5877
5878       if (addend & ((howto->src_mask + 1) >> 1))
5879         {
5880           signed_addend = -1;
5881           signed_addend &= ~ howto->src_mask;
5882           signed_addend |= addend;
5883         }
5884       else
5885         signed_addend = addend;
5886     }
5887   else
5888     addend = signed_addend = rel->r_addend;
5889
5890   switch (r_type)
5891     {
5892     case R_ARM_NONE:
5893       /* We don't need to find a value for this symbol.  It's just a
5894          marker.  */
5895       *unresolved_reloc_p = FALSE;
5896       return bfd_reloc_ok;
5897
5898     case R_ARM_ABS12:
5899       if (!globals->vxworks_p)
5900         return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
5901
5902     case R_ARM_PC24:
5903     case R_ARM_ABS32:
5904     case R_ARM_ABS32_NOI:
5905     case R_ARM_REL32:
5906     case R_ARM_REL32_NOI:
5907     case R_ARM_CALL:
5908     case R_ARM_JUMP24:
5909     case R_ARM_XPC25:
5910     case R_ARM_PREL31:
5911     case R_ARM_PLT32:
5912       /* Handle relocations which should use the PLT entry.  ABS32/REL32
5913          will use the symbol's value, which may point to a PLT entry, but we
5914          don't need to handle that here.  If we created a PLT entry, all
5915          branches in this object should go to it.  */
5916       if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32
5917            && r_type != R_ARM_ABS32_NOI && r_type != R_ARM_REL32_NOI)
5918           && h != NULL
5919           && splt != NULL
5920           && h->plt.offset != (bfd_vma) -1)
5921         {
5922           /* If we've created a .plt section, and assigned a PLT entry to
5923              this function, it should not be known to bind locally.  If
5924              it were, we would have cleared the PLT entry.  */
5925           BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
5926
5927           value = (splt->output_section->vma
5928                    + splt->output_offset
5929                    + h->plt.offset);
5930           *unresolved_reloc_p = FALSE;
5931           return _bfd_final_link_relocate (howto, input_bfd, input_section,
5932                                            contents, rel->r_offset, value,
5933                                            rel->r_addend);
5934         }
5935
5936       /* When generating a shared object or relocatable executable, these
5937          relocations are copied into the output file to be resolved at
5938          run time.  */
5939       if ((info->shared || globals->root.is_relocatable_executable)
5940           && (input_section->flags & SEC_ALLOC)
5941           && !(elf32_arm_hash_table (info)->vxworks_p
5942                && strcmp (input_section->output_section->name,
5943                           ".tls_vars") == 0)
5944           && ((r_type != R_ARM_REL32 && r_type != R_ARM_REL32_NOI)
5945               || !SYMBOL_CALLS_LOCAL (info, h))
5946           && (h == NULL
5947               || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5948               || h->root.type != bfd_link_hash_undefweak)
5949           && r_type != R_ARM_PC24
5950           && r_type != R_ARM_CALL
5951           && r_type != R_ARM_JUMP24
5952           && r_type != R_ARM_PREL31
5953           && r_type != R_ARM_PLT32)
5954         {
5955           Elf_Internal_Rela outrel;
5956           bfd_byte *loc;
5957           bfd_boolean skip, relocate;
5958
5959           *unresolved_reloc_p = FALSE;
5960
5961           if (sreloc == NULL)
5962             {
5963               const char * name;
5964
5965               name = (bfd_elf_string_from_elf_section
5966                       (input_bfd,
5967                        elf_elfheader (input_bfd)->e_shstrndx,
5968                        elf_section_data (input_section)->rel_hdr.sh_name));
5969               if (name == NULL)
5970                 return bfd_reloc_notsupported;
5971
5972               BFD_ASSERT (reloc_section_p (globals, name, input_section));
5973
5974               sreloc = bfd_get_section_by_name (dynobj, name);
5975               BFD_ASSERT (sreloc != NULL);
5976             }
5977
5978           skip = FALSE;
5979           relocate = FALSE;
5980
5981           outrel.r_addend = addend;
5982           outrel.r_offset =
5983             _bfd_elf_section_offset (output_bfd, info, input_section,
5984                                      rel->r_offset);
5985           if (outrel.r_offset == (bfd_vma) -1)
5986             skip = TRUE;
5987           else if (outrel.r_offset == (bfd_vma) -2)
5988             skip = TRUE, relocate = TRUE;
5989           outrel.r_offset += (input_section->output_section->vma
5990                               + input_section->output_offset);
5991
5992           if (skip)
5993             memset (&outrel, 0, sizeof outrel);
5994           else if (h != NULL
5995                    && h->dynindx != -1
5996                    && (!info->shared
5997                        || !info->symbolic
5998                        || !h->def_regular))
5999             outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
6000           else
6001             {
6002               int symbol;
6003
6004               /* This symbol is local, or marked to become local.  */
6005               if (sym_flags == STT_ARM_TFUNC)
6006                 value |= 1;
6007               if (globals->symbian_p)
6008                 {
6009                   asection *osec;
6010
6011                   /* On Symbian OS, the data segment and text segement
6012                      can be relocated independently.  Therefore, we
6013                      must indicate the segment to which this
6014                      relocation is relative.  The BPABI allows us to
6015                      use any symbol in the right segment; we just use
6016                      the section symbol as it is convenient.  (We
6017                      cannot use the symbol given by "h" directly as it
6018                      will not appear in the dynamic symbol table.)
6019
6020                      Note that the dynamic linker ignores the section
6021                      symbol value, so we don't subtract osec->vma
6022                      from the emitted reloc addend.  */
6023                   if (sym_sec)
6024                     osec = sym_sec->output_section;
6025                   else
6026                     osec = input_section->output_section;
6027                   symbol = elf_section_data (osec)->dynindx;
6028                   if (symbol == 0)
6029                     {
6030                       struct elf_link_hash_table *htab = elf_hash_table (info);
6031
6032                       if ((osec->flags & SEC_READONLY) == 0
6033                           && htab->data_index_section != NULL)
6034                         osec = htab->data_index_section;
6035                       else
6036                         osec = htab->text_index_section;
6037                       symbol = elf_section_data (osec)->dynindx;
6038                     }
6039                   BFD_ASSERT (symbol != 0);
6040                 }
6041               else
6042                 /* On SVR4-ish systems, the dynamic loader cannot
6043                    relocate the text and data segments independently,
6044                    so the symbol does not matter.  */
6045                 symbol = 0;
6046               outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
6047               if (globals->use_rel)
6048                 relocate = TRUE;
6049               else
6050                 outrel.r_addend += value;
6051             }
6052
6053           loc = sreloc->contents;
6054           loc += sreloc->reloc_count++ * RELOC_SIZE (globals);
6055           SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
6056
6057           /* If this reloc is against an external symbol, we do not want to
6058              fiddle with the addend.  Otherwise, we need to include the symbol
6059              value so that it becomes an addend for the dynamic reloc.  */
6060           if (! relocate)
6061             return bfd_reloc_ok;
6062
6063           return _bfd_final_link_relocate (howto, input_bfd, input_section,
6064                                            contents, rel->r_offset, value,
6065                                            (bfd_vma) 0);
6066         }
6067       else switch (r_type)
6068         {
6069         case R_ARM_ABS12:
6070           return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
6071
6072         case R_ARM_XPC25:         /* Arm BLX instruction.  */
6073         case R_ARM_CALL:
6074         case R_ARM_JUMP24:
6075         case R_ARM_PC24:          /* Arm B/BL instruction.  */
6076         case R_ARM_PLT32:
6077           {
6078           bfd_vma from;
6079           bfd_signed_vma branch_offset;
6080           struct elf32_arm_stub_hash_entry *stub_entry = NULL;
6081
6082           from = (input_section->output_section->vma
6083                   + input_section->output_offset
6084                   + rel->r_offset);
6085           branch_offset = (bfd_signed_vma)(value - from);
6086
6087           if (r_type == R_ARM_XPC25)
6088             {
6089               /* Check for Arm calling Arm function.  */
6090               /* FIXME: Should we translate the instruction into a BL
6091                  instruction instead ?  */
6092               if (sym_flags != STT_ARM_TFUNC)
6093                 (*_bfd_error_handler)
6094                   (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
6095                    input_bfd,
6096                    h ? h->root.root.string : "(local)");
6097             }
6098           else if (r_type != R_ARM_CALL)
6099             {
6100               /* Check for Arm calling Thumb function.  */
6101               if (sym_flags == STT_ARM_TFUNC)
6102                 {
6103                   if (elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
6104                                                output_bfd, input_section,
6105                                                hit_data, sym_sec, rel->r_offset,
6106                                                signed_addend, value,
6107                                                error_message))
6108                     return bfd_reloc_ok;
6109                   else
6110                     return bfd_reloc_dangerous;
6111                 }
6112             }
6113
6114           /* Check if a stub has to be inserted because the
6115              destination is too far or we are changing mode.  */
6116           if (r_type == R_ARM_CALL)
6117             {
6118               if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
6119                   || branch_offset < ARM_MAX_BWD_BRANCH_OFFSET
6120                   || sym_flags == STT_ARM_TFUNC)
6121                 {
6122                   /* The target is out of reach, so redirect the
6123                      branch to the local stub for this function.  */
6124
6125                   stub_entry = elf32_arm_get_stub_entry (input_section,
6126                                                          sym_sec, h,
6127                                                          rel, globals);
6128                   if (stub_entry != NULL)
6129                     value = (stub_entry->stub_offset
6130                              + stub_entry->stub_sec->output_offset
6131                              + stub_entry->stub_sec->output_section->vma);
6132                 }
6133             }
6134
6135           /* The ARM ELF ABI says that this reloc is computed as: S - P + A
6136              where:
6137               S is the address of the symbol in the relocation.
6138               P is address of the instruction being relocated.
6139               A is the addend (extracted from the instruction) in bytes.
6140
6141              S is held in 'value'.
6142              P is the base address of the section containing the
6143                instruction plus the offset of the reloc into that
6144                section, ie:
6145                  (input_section->output_section->vma +
6146                   input_section->output_offset +
6147                   rel->r_offset).
6148              A is the addend, converted into bytes, ie:
6149                  (signed_addend * 4)
6150
6151              Note: None of these operations have knowledge of the pipeline
6152              size of the processor, thus it is up to the assembler to
6153              encode this information into the addend.  */
6154           value -= (input_section->output_section->vma
6155                     + input_section->output_offset);
6156           value -= rel->r_offset;
6157           if (globals->use_rel)
6158             value += (signed_addend << howto->size);
6159           else
6160             /* RELA addends do not have to be adjusted by howto->size.  */
6161             value += signed_addend;
6162
6163           signed_addend = value;
6164           signed_addend >>= howto->rightshift;
6165
6166           /* A branch to an undefined weak symbol is turned into a jump to
6167              the next instruction.  */
6168           if (h && h->root.type == bfd_link_hash_undefweak)
6169             {
6170               value = (bfd_get_32 (input_bfd, hit_data) & 0xf0000000)
6171                       | 0x0affffff;
6172             }
6173           else
6174             {
6175               /* Perform a signed range check.  */
6176               if (   signed_addend >   ((bfd_signed_vma)  (howto->dst_mask >> 1))
6177                   || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
6178                 return bfd_reloc_overflow;
6179
6180               addend = (value & 2);
6181
6182               value = (signed_addend & howto->dst_mask)
6183                 | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
6184
6185               /* Set the H bit in the BLX instruction.  */
6186               if (sym_flags == STT_ARM_TFUNC)
6187                 {
6188                   if (addend)
6189                     value |= (1 << 24);
6190                   else
6191                     value &= ~(bfd_vma)(1 << 24);
6192                 }
6193               if (r_type == R_ARM_CALL)
6194                 {
6195                   /* Select the correct instruction (BL or BLX).  */
6196                   /* Only if we are not handling a BL to a stub. In this
6197                      case, mode switching is performed by the stub.  */
6198                   if (sym_flags == STT_ARM_TFUNC && !stub_entry)
6199                     value |= (1 << 28);
6200                   else
6201                     {
6202                       value &= ~(bfd_vma)(1 << 28);
6203                       value |= (1 << 24);
6204                     }
6205                 }
6206             }
6207           }
6208           break;
6209
6210         case R_ARM_ABS32:
6211           value += addend;
6212           if (sym_flags == STT_ARM_TFUNC)
6213             value |= 1;
6214           break;
6215
6216         case R_ARM_ABS32_NOI:
6217           value += addend;
6218           break;
6219
6220         case R_ARM_REL32:
6221           value += addend;
6222           if (sym_flags == STT_ARM_TFUNC)
6223             value |= 1;
6224           value -= (input_section->output_section->vma
6225                     + input_section->output_offset + rel->r_offset);
6226           break;
6227
6228         case R_ARM_REL32_NOI:
6229           value += addend;
6230           value -= (input_section->output_section->vma
6231                     + input_section->output_offset + rel->r_offset);
6232           break;
6233
6234         case R_ARM_PREL31:
6235           value -= (input_section->output_section->vma
6236                     + input_section->output_offset + rel->r_offset);
6237           value += signed_addend;
6238           if (! h || h->root.type != bfd_link_hash_undefweak)
6239             {
6240               /* Check for overflow.  */
6241               if ((value ^ (value >> 1)) & (1 << 30))
6242                 return bfd_reloc_overflow;
6243             }
6244           value &= 0x7fffffff;
6245           value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
6246           if (sym_flags == STT_ARM_TFUNC)
6247             value |= 1;
6248           break;
6249         }
6250
6251       bfd_put_32 (input_bfd, value, hit_data);
6252       return bfd_reloc_ok;
6253
6254     case R_ARM_ABS8:
6255       value += addend;
6256       if ((long) value > 0x7f || (long) value < -0x80)
6257         return bfd_reloc_overflow;
6258
6259       bfd_put_8 (input_bfd, value, hit_data);
6260       return bfd_reloc_ok;
6261
6262     case R_ARM_ABS16:
6263       value += addend;
6264
6265       if ((long) value > 0x7fff || (long) value < -0x8000)
6266         return bfd_reloc_overflow;
6267
6268       bfd_put_16 (input_bfd, value, hit_data);
6269       return bfd_reloc_ok;
6270
6271     case R_ARM_THM_ABS5:
6272       /* Support ldr and str instructions for the thumb.  */
6273       if (globals->use_rel)
6274         {
6275           /* Need to refetch addend.  */
6276           addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
6277           /* ??? Need to determine shift amount from operand size.  */
6278           addend >>= howto->rightshift;
6279         }
6280       value += addend;
6281
6282       /* ??? Isn't value unsigned?  */
6283       if ((long) value > 0x1f || (long) value < -0x10)
6284         return bfd_reloc_overflow;
6285
6286       /* ??? Value needs to be properly shifted into place first.  */
6287       value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
6288       bfd_put_16 (input_bfd, value, hit_data);
6289       return bfd_reloc_ok;
6290
6291     case R_ARM_THM_ALU_PREL_11_0:
6292       /* Corresponds to: addw.w reg, pc, #offset (and similarly for subw).  */
6293       {
6294         bfd_vma insn;
6295         bfd_signed_vma relocation;
6296
6297         insn = (bfd_get_16 (input_bfd, hit_data) << 16)
6298              | bfd_get_16 (input_bfd, hit_data + 2);
6299
6300         if (globals->use_rel)
6301           {
6302             signed_addend = (insn & 0xff) | ((insn & 0x7000) >> 4)
6303                           | ((insn & (1 << 26)) >> 15);
6304             if (insn & 0xf00000)
6305               signed_addend = -signed_addend;
6306           }
6307
6308         relocation = value + signed_addend;
6309         relocation -= (input_section->output_section->vma
6310                        + input_section->output_offset
6311                        + rel->r_offset);
6312
6313         value = abs (relocation);
6314
6315         if (value >= 0x1000)
6316           return bfd_reloc_overflow;
6317
6318         insn = (insn & 0xfb0f8f00) | (value & 0xff)
6319              | ((value & 0x700) << 4)
6320              | ((value & 0x800) << 15);
6321         if (relocation < 0)
6322           insn |= 0xa00000;
6323
6324         bfd_put_16 (input_bfd, insn >> 16, hit_data);
6325         bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
6326
6327         return bfd_reloc_ok;
6328       }
6329
6330     case R_ARM_THM_PC12:
6331       /* Corresponds to: ldr.w reg, [pc, #offset].  */
6332       {
6333         bfd_vma insn;
6334         bfd_signed_vma relocation;
6335
6336         insn = (bfd_get_16 (input_bfd, hit_data) << 16)
6337              | bfd_get_16 (input_bfd, hit_data + 2);
6338
6339         if (globals->use_rel)
6340           {
6341             signed_addend = insn & 0xfff;
6342             if (!(insn & (1 << 23)))
6343               signed_addend = -signed_addend;
6344           }
6345
6346         relocation = value + signed_addend;
6347         relocation -= (input_section->output_section->vma
6348                        + input_section->output_offset
6349                        + rel->r_offset);
6350
6351         value = abs (relocation);
6352
6353         if (value >= 0x1000)
6354           return bfd_reloc_overflow;
6355
6356         insn = (insn & 0xff7ff000) | value;
6357         if (relocation >= 0)
6358           insn |= (1 << 23);
6359
6360         bfd_put_16 (input_bfd, insn >> 16, hit_data);
6361         bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
6362
6363         return bfd_reloc_ok;
6364       }
6365
6366     case R_ARM_THM_XPC22:
6367     case R_ARM_THM_CALL:
6368     case R_ARM_THM_JUMP24:
6369       /* Thumb BL (branch long instruction).  */
6370       {
6371         bfd_vma relocation;
6372         bfd_vma reloc_sign;
6373         bfd_boolean overflow = FALSE;
6374         bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
6375         bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
6376         bfd_signed_vma reloc_signed_max;
6377         bfd_signed_vma reloc_signed_min;
6378         bfd_vma check;
6379         bfd_signed_vma signed_check;
6380         int bitsize;
6381         int thumb2 = using_thumb2 (globals);
6382
6383         /* A branch to an undefined weak symbol is turned into a jump to
6384            the next instruction.  */
6385         if (h && h->root.type == bfd_link_hash_undefweak)
6386           {
6387             bfd_put_16 (input_bfd, 0xe000, hit_data);
6388             bfd_put_16 (input_bfd, 0xbf00, hit_data + 2);
6389             return bfd_reloc_ok;
6390           }
6391
6392         /* Fetch the addend.  We use the Thumb-2 encoding (backwards compatible
6393            with Thumb-1) involving the J1 and J2 bits.  */
6394         if (globals->use_rel)
6395           {
6396             bfd_vma s = (upper_insn & (1 << 10)) >> 10;
6397             bfd_vma upper = upper_insn & 0x3ff;
6398             bfd_vma lower = lower_insn & 0x7ff;
6399             bfd_vma j1 = (lower_insn & (1 << 13)) >> 13;
6400             bfd_vma j2 = (lower_insn & (1 << 11)) >> 11;
6401             bfd_vma i1 = j1 ^ s ? 0 : 1;
6402             bfd_vma i2 = j2 ^ s ? 0 : 1;
6403
6404             addend = (i1 << 23) | (i2 << 22) | (upper << 12) | (lower << 1);
6405             /* Sign extend.  */
6406             addend = (addend | ((s ? 0 : 1) << 24)) - (1 << 24);
6407
6408             signed_addend = addend;
6409           }
6410
6411         if (r_type == R_ARM_THM_XPC22)
6412           {
6413             /* Check for Thumb to Thumb call.  */
6414             /* FIXME: Should we translate the instruction into a BL
6415                instruction instead ?  */
6416             if (sym_flags == STT_ARM_TFUNC)
6417               (*_bfd_error_handler)
6418                 (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
6419                  input_bfd,
6420                  h ? h->root.root.string : "(local)");
6421           }
6422         else
6423           {
6424             /* If it is not a call to Thumb, assume call to Arm.
6425                If it is a call relative to a section name, then it is not a
6426                function call at all, but rather a long jump.  Calls through
6427                the PLT do not require stubs.  */
6428             if (sym_flags != STT_ARM_TFUNC && sym_flags != STT_SECTION
6429                 && (h == NULL || splt == NULL
6430                     || h->plt.offset == (bfd_vma) -1))
6431               {
6432                 if (globals->use_blx && r_type == R_ARM_THM_CALL)
6433                   {
6434                     /* Convert BL to BLX.  */
6435                     lower_insn = (lower_insn & ~0x1000) | 0x0800;
6436                   }
6437                 else if (r_type != R_ARM_THM_CALL)
6438                   {
6439                     if (elf32_thumb_to_arm_stub
6440                         (info, sym_name, input_bfd, output_bfd, input_section,
6441                          hit_data, sym_sec, rel->r_offset, signed_addend, value,
6442                          error_message))
6443                       return bfd_reloc_ok;
6444                     else
6445                       return bfd_reloc_dangerous;
6446                   }
6447               }
6448             else if (sym_flags == STT_ARM_TFUNC && globals->use_blx
6449                      && r_type == R_ARM_THM_CALL)
6450               {
6451                 /* Make sure this is a BL.  */
6452                 lower_insn |= 0x1800;
6453               }
6454           }
6455
6456         /* Handle calls via the PLT.  */
6457         if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
6458           {
6459             value = (splt->output_section->vma
6460                      + splt->output_offset
6461                      + h->plt.offset);
6462             if (globals->use_blx && r_type == R_ARM_THM_CALL)
6463               {
6464                 /* If the Thumb BLX instruction is available, convert the
6465                    BL to a BLX instruction to call the ARM-mode PLT entry.  */
6466                 lower_insn = (lower_insn & ~0x1000) | 0x0800;
6467               }
6468             else
6469               /* Target the Thumb stub before the ARM PLT entry.  */
6470               value -= PLT_THUMB_STUB_SIZE;
6471             *unresolved_reloc_p = FALSE;
6472           }
6473
6474         if (r_type == R_ARM_THM_CALL)
6475           {
6476             /* Check if a stub has to be inserted because the destination
6477                is too far.  */
6478             bfd_vma from;
6479             bfd_signed_vma branch_offset;
6480             struct elf32_arm_stub_hash_entry *stub_entry = NULL;
6481
6482             from = (input_section->output_section->vma
6483                     + input_section->output_offset
6484                     + rel->r_offset);
6485             branch_offset = (bfd_signed_vma)(value - from);
6486
6487             if ((!thumb2
6488                  && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
6489                      || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
6490                 ||
6491                 (thumb2
6492                  && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
6493                      || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
6494                 || ((sym_flags != STT_ARM_TFUNC) && !globals->use_blx))
6495               {
6496                 /* The target is out of reach or we are changing modes, so
6497                    redirect the branch to the local stub for this
6498                    function.  */
6499                 stub_entry = elf32_arm_get_stub_entry (input_section,
6500                                                        sym_sec, h,
6501                                                        rel, globals);
6502                 if (stub_entry != NULL)
6503                   value = (stub_entry->stub_offset
6504                            + stub_entry->stub_sec->output_offset
6505                            + stub_entry->stub_sec->output_section->vma);
6506
6507                 /* If this call becomes a call to Arm, force BLX.  */
6508                 if (globals->use_blx)
6509                   {
6510                     if ((stub_entry
6511                          && !arm_stub_is_thumb (stub_entry->stub_type))
6512                         || (sym_flags != STT_ARM_TFUNC))
6513                       lower_insn = (lower_insn & ~0x1000) | 0x0800;
6514                   }
6515               }
6516           }
6517
6518         relocation = value + signed_addend;
6519
6520         relocation -= (input_section->output_section->vma
6521                        + input_section->output_offset
6522                        + rel->r_offset);
6523
6524         check = relocation >> howto->rightshift;
6525
6526         /* If this is a signed value, the rightshift just dropped
6527            leading 1 bits (assuming twos complement).  */
6528         if ((bfd_signed_vma) relocation >= 0)
6529           signed_check = check;
6530         else
6531           signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
6532
6533         /* Calculate the permissable maximum and minimum values for
6534            this relocation according to whether we're relocating for
6535            Thumb-2 or not.  */
6536         bitsize = howto->bitsize;
6537         if (!thumb2)
6538           bitsize -= 2;
6539         reloc_signed_max = ((1 << (bitsize - 1)) - 1) >> howto->rightshift;
6540         reloc_signed_min = ~reloc_signed_max;
6541
6542         /* Assumes two's complement.  */
6543         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
6544           overflow = TRUE;
6545
6546         if ((lower_insn & 0x5000) == 0x4000)
6547           /* For a BLX instruction, make sure that the relocation is rounded up
6548              to a word boundary.  This follows the semantics of the instruction
6549              which specifies that bit 1 of the target address will come from bit
6550              1 of the base address.  */
6551           relocation = (relocation + 2) & ~ 3;
6552
6553         /* Put RELOCATION back into the insn.  Assumes two's complement.
6554            We use the Thumb-2 encoding, which is safe even if dealing with
6555            a Thumb-1 instruction by virtue of our overflow check above.  */
6556         reloc_sign = (signed_check < 0) ? 1 : 0;
6557         upper_insn = (upper_insn & ~(bfd_vma) 0x7ff)
6558                      | ((relocation >> 12) & 0x3ff)
6559                      | (reloc_sign << 10);
6560         lower_insn = (lower_insn & ~(bfd_vma) 0x2fff)
6561                      | (((!((relocation >> 23) & 1)) ^ reloc_sign) << 13)
6562                      | (((!((relocation >> 22) & 1)) ^ reloc_sign) << 11)
6563                      | ((relocation >> 1) & 0x7ff);
6564
6565         /* Put the relocated value back in the object file:  */
6566         bfd_put_16 (input_bfd, upper_insn, hit_data);
6567         bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
6568
6569         return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
6570       }
6571       break;
6572
6573     case R_ARM_THM_JUMP19:
6574       /* Thumb32 conditional branch instruction.  */
6575       {
6576         bfd_vma relocation;
6577         bfd_boolean overflow = FALSE;
6578         bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
6579         bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
6580         bfd_signed_vma reloc_signed_max = 0xffffe;
6581         bfd_signed_vma reloc_signed_min = -0x100000;
6582         bfd_signed_vma signed_check;
6583
6584         /* Need to refetch the addend, reconstruct the top three bits,
6585            and squish the two 11 bit pieces together.  */
6586         if (globals->use_rel)
6587           {
6588             bfd_vma S     = (upper_insn & 0x0400) >> 10;
6589             bfd_vma upper = (upper_insn & 0x003f);
6590             bfd_vma J1    = (lower_insn & 0x2000) >> 13;
6591             bfd_vma J2    = (lower_insn & 0x0800) >> 11;
6592             bfd_vma lower = (lower_insn & 0x07ff);
6593
6594             upper |= J1 << 6;
6595             upper |= J2 << 7;
6596             upper |= (!S) << 8;
6597             upper -= 0x0100; /* Sign extend.  */
6598
6599             addend = (upper << 12) | (lower << 1);
6600             signed_addend = addend;
6601           }
6602
6603         /* Handle calls via the PLT.  */
6604         if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
6605           {
6606             value = (splt->output_section->vma
6607                      + splt->output_offset
6608                      + h->plt.offset);
6609             /* Target the Thumb stub before the ARM PLT entry.  */
6610             value -= PLT_THUMB_STUB_SIZE;
6611             *unresolved_reloc_p = FALSE;
6612           }
6613
6614         /* ??? Should handle interworking?  GCC might someday try to
6615            use this for tail calls.  */
6616
6617         relocation = value + signed_addend;
6618         relocation -= (input_section->output_section->vma
6619                        + input_section->output_offset
6620                        + rel->r_offset);
6621         signed_check = (bfd_signed_vma) relocation;
6622
6623         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
6624           overflow = TRUE;
6625
6626         /* Put RELOCATION back into the insn.  */
6627         {
6628           bfd_vma S  = (relocation & 0x00100000) >> 20;
6629           bfd_vma J2 = (relocation & 0x00080000) >> 19;
6630           bfd_vma J1 = (relocation & 0x00040000) >> 18;
6631           bfd_vma hi = (relocation & 0x0003f000) >> 12;
6632           bfd_vma lo = (relocation & 0x00000ffe) >>  1;
6633
6634           upper_insn = (upper_insn & 0xfbc0) | (S << 10) | hi;
6635           lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
6636         }
6637
6638         /* Put the relocated value back in the object file:  */
6639         bfd_put_16 (input_bfd, upper_insn, hit_data);
6640         bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
6641
6642         return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
6643       }
6644
6645     case R_ARM_THM_JUMP11:
6646     case R_ARM_THM_JUMP8:
6647     case R_ARM_THM_JUMP6:
6648       /* Thumb B (branch) instruction).  */
6649       {
6650         bfd_signed_vma relocation;
6651         bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
6652         bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
6653         bfd_signed_vma signed_check;
6654
6655         /* CZB cannot jump backward.  */
6656         if (r_type == R_ARM_THM_JUMP6)
6657           reloc_signed_min = 0;
6658
6659         if (globals->use_rel)
6660           {
6661             /* Need to refetch addend.  */
6662             addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
6663             if (addend & ((howto->src_mask + 1) >> 1))
6664               {
6665                 signed_addend = -1;
6666                 signed_addend &= ~ howto->src_mask;
6667                 signed_addend |= addend;
6668               }
6669             else
6670               signed_addend = addend;
6671             /* The value in the insn has been right shifted.  We need to
6672                undo this, so that we can perform the address calculation
6673                in terms of bytes.  */
6674             signed_addend <<= howto->rightshift;
6675           }
6676         relocation = value + signed_addend;
6677
6678         relocation -= (input_section->output_section->vma
6679                        + input_section->output_offset
6680                        + rel->r_offset);
6681
6682         relocation >>= howto->rightshift;
6683         signed_check = relocation;
6684
6685         if (r_type == R_ARM_THM_JUMP6)
6686           relocation = ((relocation & 0x0020) << 4) | ((relocation & 0x001f) << 3);
6687         else
6688           relocation &= howto->dst_mask;
6689         relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
6690
6691         bfd_put_16 (input_bfd, relocation, hit_data);
6692
6693         /* Assumes two's complement.  */
6694         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
6695           return bfd_reloc_overflow;
6696
6697         return bfd_reloc_ok;
6698       }
6699
6700     case R_ARM_ALU_PCREL7_0:
6701     case R_ARM_ALU_PCREL15_8:
6702     case R_ARM_ALU_PCREL23_15:
6703       {
6704         bfd_vma insn;
6705         bfd_vma relocation;
6706
6707         insn = bfd_get_32 (input_bfd, hit_data);
6708         if (globals->use_rel)
6709           {
6710             /* Extract the addend.  */
6711             addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
6712             signed_addend = addend;
6713           }
6714         relocation = value + signed_addend;
6715
6716         relocation -= (input_section->output_section->vma
6717                        + input_section->output_offset
6718                        + rel->r_offset);
6719         insn = (insn & ~0xfff)
6720                | ((howto->bitpos << 7) & 0xf00)
6721                | ((relocation >> howto->bitpos) & 0xff);
6722         bfd_put_32 (input_bfd, value, hit_data);
6723       }
6724       return bfd_reloc_ok;
6725
6726     case R_ARM_GNU_VTINHERIT:
6727     case R_ARM_GNU_VTENTRY:
6728       return bfd_reloc_ok;
6729
6730     case R_ARM_GOTOFF32:
6731       /* Relocation is relative to the start of the
6732          global offset table.  */
6733
6734       BFD_ASSERT (sgot != NULL);
6735       if (sgot == NULL)
6736         return bfd_reloc_notsupported;
6737
6738       /* If we are addressing a Thumb function, we need to adjust the
6739          address by one, so that attempts to call the function pointer will
6740          correctly interpret it as Thumb code.  */
6741       if (sym_flags == STT_ARM_TFUNC)
6742         value += 1;
6743
6744       /* Note that sgot->output_offset is not involved in this
6745          calculation.  We always want the start of .got.  If we
6746          define _GLOBAL_OFFSET_TABLE in a different way, as is
6747          permitted by the ABI, we might have to change this
6748          calculation.  */
6749       value -= sgot->output_section->vma;
6750       return _bfd_final_link_relocate (howto, input_bfd, input_section,
6751                                        contents, rel->r_offset, value,
6752                                        rel->r_addend);
6753
6754     case R_ARM_GOTPC:
6755       /* Use global offset table as symbol value.  */
6756       BFD_ASSERT (sgot != NULL);
6757
6758       if (sgot == NULL)
6759         return bfd_reloc_notsupported;
6760
6761       *unresolved_reloc_p = FALSE;
6762       value = sgot->output_section->vma;
6763       return _bfd_final_link_relocate (howto, input_bfd, input_section,
6764                                        contents, rel->r_offset, value,
6765                                        rel->r_addend);
6766
6767     case R_ARM_GOT32:
6768     case R_ARM_GOT_PREL:
6769       /* Relocation is to the entry for this symbol in the
6770          global offset table.  */
6771       if (sgot == NULL)
6772         return bfd_reloc_notsupported;
6773
6774       if (h != NULL)
6775         {
6776           bfd_vma off;
6777           bfd_boolean dyn;
6778
6779           off = h->got.offset;
6780           BFD_ASSERT (off != (bfd_vma) -1);
6781           dyn = globals->root.dynamic_sections_created;
6782
6783           if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
6784               || (info->shared
6785                   && SYMBOL_REFERENCES_LOCAL (info, h))
6786               || (ELF_ST_VISIBILITY (h->other)
6787                   && h->root.type == bfd_link_hash_undefweak))
6788             {
6789               /* This is actually a static link, or it is a -Bsymbolic link
6790                  and the symbol is defined locally.  We must initialize this
6791                  entry in the global offset table.  Since the offset must
6792                  always be a multiple of 4, we use the least significant bit
6793                  to record whether we have initialized it already.
6794
6795                  When doing a dynamic link, we create a .rel(a).got relocation
6796                  entry to initialize the value.  This is done in the
6797                  finish_dynamic_symbol routine.  */
6798               if ((off & 1) != 0)
6799                 off &= ~1;
6800               else
6801                 {
6802                   /* If we are addressing a Thumb function, we need to
6803                      adjust the address by one, so that attempts to
6804                      call the function pointer will correctly
6805                      interpret it as Thumb code.  */
6806                   if (sym_flags == STT_ARM_TFUNC)
6807                     value |= 1;
6808
6809                   bfd_put_32 (output_bfd, value, sgot->contents + off);
6810                   h->got.offset |= 1;
6811                 }
6812             }
6813           else
6814             *unresolved_reloc_p = FALSE;
6815
6816           value = sgot->output_offset + off;
6817         }
6818       else
6819         {
6820           bfd_vma off;
6821
6822           BFD_ASSERT (local_got_offsets != NULL &&
6823                       local_got_offsets[r_symndx] != (bfd_vma) -1);
6824
6825           off = local_got_offsets[r_symndx];
6826
6827           /* The offset must always be a multiple of 4.  We use the
6828              least significant bit to record whether we have already
6829              generated the necessary reloc.  */
6830           if ((off & 1) != 0)
6831             off &= ~1;
6832           else
6833             {
6834               /* If we are addressing a Thumb function, we need to
6835                  adjust the address by one, so that attempts to
6836                  call the function pointer will correctly
6837                  interpret it as Thumb code.  */
6838               if (sym_flags == STT_ARM_TFUNC)
6839                 value |= 1;
6840
6841               if (globals->use_rel)
6842                 bfd_put_32 (output_bfd, value, sgot->contents + off);
6843
6844               if (info->shared)
6845                 {
6846                   asection * srelgot;
6847                   Elf_Internal_Rela outrel;
6848                   bfd_byte *loc;
6849
6850                   srelgot = (bfd_get_section_by_name
6851                              (dynobj, RELOC_SECTION (globals, ".got")));
6852                   BFD_ASSERT (srelgot != NULL);
6853
6854                   outrel.r_addend = addend + value;
6855                   outrel.r_offset = (sgot->output_section->vma
6856                                      + sgot->output_offset
6857                                      + off);
6858                   outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
6859                   loc = srelgot->contents;
6860                   loc += srelgot->reloc_count++ * RELOC_SIZE (globals);
6861                   SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
6862                 }
6863
6864               local_got_offsets[r_symndx] |= 1;
6865             }
6866
6867           value = sgot->output_offset + off;
6868         }
6869       if (r_type != R_ARM_GOT32)
6870         value += sgot->output_section->vma;
6871
6872       return _bfd_final_link_relocate (howto, input_bfd, input_section,
6873                                        contents, rel->r_offset, value,
6874                                        rel->r_addend);
6875
6876     case R_ARM_TLS_LDO32:
6877       value = value - dtpoff_base (info);
6878
6879       return _bfd_final_link_relocate (howto, input_bfd, input_section,
6880                                        contents, rel->r_offset, value,
6881                                        rel->r_addend);
6882
6883     case R_ARM_TLS_LDM32:
6884       {
6885         bfd_vma off;
6886
6887         if (globals->sgot == NULL)
6888           abort ();
6889
6890         off = globals->tls_ldm_got.offset;
6891
6892         if ((off & 1) != 0)
6893           off &= ~1;
6894         else
6895           {
6896             /* If we don't know the module number, create a relocation
6897                for it.  */
6898             if (info->shared)
6899               {
6900                 Elf_Internal_Rela outrel;
6901                 bfd_byte *loc;
6902
6903                 if (globals->srelgot == NULL)
6904                   abort ();
6905
6906                 outrel.r_addend = 0;
6907                 outrel.r_offset = (globals->sgot->output_section->vma
6908                                    + globals->sgot->output_offset + off);
6909                 outrel.r_info = ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32);
6910
6911                 if (globals->use_rel)
6912                   bfd_put_32 (output_bfd, outrel.r_addend,
6913                               globals->sgot->contents + off);
6914
6915                 loc = globals->srelgot->contents;
6916                 loc += globals->srelgot->reloc_count++ * RELOC_SIZE (globals);
6917                 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
6918               }
6919             else
6920               bfd_put_32 (output_bfd, 1, globals->sgot->contents + off);
6921
6922             globals->tls_ldm_got.offset |= 1;
6923           }
6924
6925         value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
6926           - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
6927
6928         return _bfd_final_link_relocate (howto, input_bfd, input_section,
6929                                          contents, rel->r_offset, value,
6930                                          rel->r_addend);
6931       }
6932
6933     case R_ARM_TLS_GD32:
6934     case R_ARM_TLS_IE32:
6935       {
6936         bfd_vma off;
6937         int indx;
6938         char tls_type;
6939
6940         if (globals->sgot == NULL)
6941           abort ();
6942
6943         indx = 0;
6944         if (h != NULL)
6945           {
6946             bfd_boolean dyn;
6947             dyn = globals->root.dynamic_sections_created;
6948             if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
6949                 && (!info->shared
6950                     || !SYMBOL_REFERENCES_LOCAL (info, h)))
6951               {
6952                 *unresolved_reloc_p = FALSE;
6953                 indx = h->dynindx;
6954               }
6955             off = h->got.offset;
6956             tls_type = ((struct elf32_arm_link_hash_entry *) h)->tls_type;
6957           }
6958         else
6959           {
6960             if (local_got_offsets == NULL)
6961               abort ();
6962             off = local_got_offsets[r_symndx];
6963             tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
6964           }
6965
6966         if (tls_type == GOT_UNKNOWN)
6967           abort ();
6968
6969         if ((off & 1) != 0)
6970           off &= ~1;
6971         else
6972           {
6973             bfd_boolean need_relocs = FALSE;
6974             Elf_Internal_Rela outrel;
6975             bfd_byte *loc = NULL;
6976             int cur_off = off;
6977
6978             /* The GOT entries have not been initialized yet.  Do it
6979                now, and emit any relocations.  If both an IE GOT and a
6980                GD GOT are necessary, we emit the GD first.  */
6981
6982             if ((info->shared || indx != 0)
6983                 && (h == NULL
6984                     || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6985                     || h->root.type != bfd_link_hash_undefweak))
6986               {
6987                 need_relocs = TRUE;
6988                 if (globals->srelgot == NULL)
6989                   abort ();
6990                 loc = globals->srelgot->contents;
6991                 loc += globals->srelgot->reloc_count * RELOC_SIZE (globals);
6992               }
6993
6994             if (tls_type & GOT_TLS_GD)
6995               {
6996                 if (need_relocs)
6997                   {
6998                     outrel.r_addend = 0;
6999                     outrel.r_offset = (globals->sgot->output_section->vma
7000                                        + globals->sgot->output_offset
7001                                        + cur_off);
7002                     outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DTPMOD32);
7003
7004                     if (globals->use_rel)
7005                       bfd_put_32 (output_bfd, outrel.r_addend,
7006                                   globals->sgot->contents + cur_off);
7007
7008                     SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
7009                     globals->srelgot->reloc_count++;
7010                     loc += RELOC_SIZE (globals);
7011
7012                     if (indx == 0)
7013                       bfd_put_32 (output_bfd, value - dtpoff_base (info),
7014                                   globals->sgot->contents + cur_off + 4);
7015                     else
7016                       {
7017                         outrel.r_addend = 0;
7018                         outrel.r_info = ELF32_R_INFO (indx,
7019                                                       R_ARM_TLS_DTPOFF32);
7020                         outrel.r_offset += 4;
7021
7022                         if (globals->use_rel)
7023                           bfd_put_32 (output_bfd, outrel.r_addend,
7024                                       globals->sgot->contents + cur_off + 4);
7025
7026
7027                         SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
7028                         globals->srelgot->reloc_count++;
7029                         loc += RELOC_SIZE (globals);
7030                       }
7031                   }
7032                 else
7033                   {
7034                     /* If we are not emitting relocations for a
7035                        general dynamic reference, then we must be in a
7036                        static link or an executable link with the
7037                        symbol binding locally.  Mark it as belonging
7038                        to module 1, the executable.  */
7039                     bfd_put_32 (output_bfd, 1,
7040                                 globals->sgot->contents + cur_off);
7041                     bfd_put_32 (output_bfd, value - dtpoff_base (info),
7042                                 globals->sgot->contents + cur_off + 4);
7043                   }
7044
7045                 cur_off += 8;
7046               }
7047
7048             if (tls_type & GOT_TLS_IE)
7049               {
7050                 if (need_relocs)
7051                   {
7052                     if (indx == 0)
7053                       outrel.r_addend = value - dtpoff_base (info);
7054                     else
7055                       outrel.r_addend = 0;
7056                     outrel.r_offset = (globals->sgot->output_section->vma
7057                                        + globals->sgot->output_offset
7058                                        + cur_off);
7059                     outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_TPOFF32);
7060
7061                     if (globals->use_rel)
7062                       bfd_put_32 (output_bfd, outrel.r_addend,
7063                                   globals->sgot->contents + cur_off);
7064
7065                     SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
7066                     globals->srelgot->reloc_count++;
7067                     loc += RELOC_SIZE (globals);
7068                   }
7069                 else
7070                   bfd_put_32 (output_bfd, tpoff (info, value),
7071                               globals->sgot->contents + cur_off);
7072                 cur_off += 4;
7073               }
7074
7075             if (h != NULL)
7076               h->got.offset |= 1;
7077             else
7078               local_got_offsets[r_symndx] |= 1;
7079           }
7080
7081         if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32)
7082           off += 8;
7083         value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
7084           - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
7085
7086         return _bfd_final_link_relocate (howto, input_bfd, input_section,
7087                                          contents, rel->r_offset, value,
7088                                          rel->r_addend);
7089       }
7090
7091     case R_ARM_TLS_LE32:
7092       if (info->shared)
7093         {
7094           (*_bfd_error_handler)
7095             (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
7096              input_bfd, input_section,
7097              (long) rel->r_offset, howto->name);
7098           return FALSE;
7099         }
7100       else
7101         value = tpoff (info, value);
7102
7103       return _bfd_final_link_relocate (howto, input_bfd, input_section,
7104                                        contents, rel->r_offset, value,
7105                                        rel->r_addend);
7106
7107     case R_ARM_V4BX:
7108       if (globals->fix_v4bx)
7109         {
7110           bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7111
7112           /* Ensure that we have a BX instruction.  */
7113           BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
7114
7115           if (globals->fix_v4bx == 2 && (insn & 0xf) != 0xf)
7116             {
7117               /* Branch to veneer.  */
7118               bfd_vma glue_addr;
7119               glue_addr = elf32_arm_bx_glue (info, insn & 0xf);
7120               glue_addr -= input_section->output_section->vma
7121                            + input_section->output_offset
7122                            + rel->r_offset + 8;
7123               insn = (insn & 0xf0000000) | 0x0a000000
7124                      | ((glue_addr >> 2) & 0x00ffffff);
7125             }
7126           else
7127             {
7128               /* Preserve Rm (lowest four bits) and the condition code
7129                  (highest four bits). Other bits encode MOV PC,Rm.  */
7130               insn = (insn & 0xf000000f) | 0x01a0f000;
7131             }
7132
7133           bfd_put_32 (input_bfd, insn, hit_data);
7134         }
7135       return bfd_reloc_ok;
7136
7137     case R_ARM_MOVW_ABS_NC:
7138     case R_ARM_MOVT_ABS:
7139     case R_ARM_MOVW_PREL_NC:
7140     case R_ARM_MOVT_PREL:
7141     /* Until we properly support segment-base-relative addressing then
7142        we assume the segment base to be zero, as for the group relocations.
7143        Thus R_ARM_MOVW_BREL_NC has the same semantics as R_ARM_MOVW_ABS_NC
7144        and R_ARM_MOVT_BREL has the same semantics as R_ARM_MOVT_ABS.  */
7145     case R_ARM_MOVW_BREL_NC:
7146     case R_ARM_MOVW_BREL:
7147     case R_ARM_MOVT_BREL:
7148       {
7149         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7150
7151         if (globals->use_rel)
7152           {
7153             addend = ((insn >> 4) & 0xf000) | (insn & 0xfff);
7154             signed_addend = (addend ^ 0x8000) - 0x8000;
7155           }
7156
7157         value += signed_addend;
7158
7159         if (r_type == R_ARM_MOVW_PREL_NC || r_type == R_ARM_MOVT_PREL)
7160           value -= (input_section->output_section->vma
7161                     + input_section->output_offset + rel->r_offset);
7162
7163         if (r_type == R_ARM_MOVW_BREL && value >= 0x10000)
7164           return bfd_reloc_overflow;
7165
7166         if (sym_flags == STT_ARM_TFUNC)
7167           value |= 1;
7168
7169         if (r_type == R_ARM_MOVT_ABS || r_type == R_ARM_MOVT_PREL
7170             || r_type == R_ARM_MOVT_BREL)
7171           value >>= 16;
7172
7173         insn &= 0xfff0f000;
7174         insn |= value & 0xfff;
7175         insn |= (value & 0xf000) << 4;
7176         bfd_put_32 (input_bfd, insn, hit_data);
7177       }
7178       return bfd_reloc_ok;
7179
7180     case R_ARM_THM_MOVW_ABS_NC:
7181     case R_ARM_THM_MOVT_ABS:
7182     case R_ARM_THM_MOVW_PREL_NC:
7183     case R_ARM_THM_MOVT_PREL:
7184     /* Until we properly support segment-base-relative addressing then
7185        we assume the segment base to be zero, as for the above relocations.
7186        Thus R_ARM_THM_MOVW_BREL_NC has the same semantics as
7187        R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_BREL has the same semantics
7188        as R_ARM_THM_MOVT_ABS.  */
7189     case R_ARM_THM_MOVW_BREL_NC:
7190     case R_ARM_THM_MOVW_BREL:
7191     case R_ARM_THM_MOVT_BREL:
7192       {
7193         bfd_vma insn;
7194
7195         insn = bfd_get_16 (input_bfd, hit_data) << 16;
7196         insn |= bfd_get_16 (input_bfd, hit_data + 2);
7197
7198         if (globals->use_rel)
7199           {
7200             addend = ((insn >> 4)  & 0xf000)
7201                    | ((insn >> 15) & 0x0800)
7202                    | ((insn >> 4)  & 0x0700)
7203                    | (insn         & 0x00ff);
7204             signed_addend = (addend ^ 0x8000) - 0x8000;
7205           }
7206
7207         value += signed_addend;
7208
7209         if (r_type == R_ARM_THM_MOVW_PREL_NC || r_type == R_ARM_THM_MOVT_PREL)
7210           value -= (input_section->output_section->vma
7211                     + input_section->output_offset + rel->r_offset);
7212
7213         if (r_type == R_ARM_THM_MOVW_BREL && value >= 0x10000)
7214           return bfd_reloc_overflow;
7215
7216         if (sym_flags == STT_ARM_TFUNC)
7217           value |= 1;
7218
7219         if (r_type == R_ARM_THM_MOVT_ABS || r_type == R_ARM_THM_MOVT_PREL
7220             || r_type == R_ARM_THM_MOVT_BREL)
7221           value >>= 16;
7222
7223         insn &= 0xfbf08f00;
7224         insn |= (value & 0xf000) << 4;
7225         insn |= (value & 0x0800) << 15;
7226         insn |= (value & 0x0700) << 4;
7227         insn |= (value & 0x00ff);
7228
7229         bfd_put_16 (input_bfd, insn >> 16, hit_data);
7230         bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
7231       }
7232       return bfd_reloc_ok;
7233
7234     case R_ARM_ALU_PC_G0_NC:
7235     case R_ARM_ALU_PC_G1_NC:
7236     case R_ARM_ALU_PC_G0:
7237     case R_ARM_ALU_PC_G1:
7238     case R_ARM_ALU_PC_G2:
7239     case R_ARM_ALU_SB_G0_NC:
7240     case R_ARM_ALU_SB_G1_NC:
7241     case R_ARM_ALU_SB_G0:
7242     case R_ARM_ALU_SB_G1:
7243     case R_ARM_ALU_SB_G2:
7244       {
7245         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7246         bfd_vma pc = input_section->output_section->vma
7247                      + input_section->output_offset + rel->r_offset;
7248         /* sb should be the origin of the *segment* containing the symbol.
7249            It is not clear how to obtain this OS-dependent value, so we
7250            make an arbitrary choice of zero.  */
7251         bfd_vma sb = 0;
7252         bfd_vma residual;
7253         bfd_vma g_n;
7254         bfd_signed_vma signed_value;
7255         int group = 0;
7256
7257         /* Determine which group of bits to select.  */
7258         switch (r_type)
7259           {
7260           case R_ARM_ALU_PC_G0_NC:
7261           case R_ARM_ALU_PC_G0:
7262           case R_ARM_ALU_SB_G0_NC:
7263           case R_ARM_ALU_SB_G0:
7264             group = 0;
7265             break;
7266
7267           case R_ARM_ALU_PC_G1_NC:
7268           case R_ARM_ALU_PC_G1:
7269           case R_ARM_ALU_SB_G1_NC:
7270           case R_ARM_ALU_SB_G1:
7271             group = 1;
7272             break;
7273
7274           case R_ARM_ALU_PC_G2:
7275           case R_ARM_ALU_SB_G2:
7276             group = 2;
7277             break;
7278
7279           default:
7280             abort ();
7281           }
7282
7283         /* If REL, extract the addend from the insn.  If RELA, it will
7284            have already been fetched for us.  */
7285         if (globals->use_rel)
7286           {
7287             int negative;
7288             bfd_vma constant = insn & 0xff;
7289             bfd_vma rotation = (insn & 0xf00) >> 8;
7290
7291             if (rotation == 0)
7292               signed_addend = constant;
7293             else
7294               {
7295                 /* Compensate for the fact that in the instruction, the
7296                    rotation is stored in multiples of 2 bits.  */
7297                 rotation *= 2;
7298
7299                 /* Rotate "constant" right by "rotation" bits.  */
7300                 signed_addend = (constant >> rotation) |
7301                                 (constant << (8 * sizeof (bfd_vma) - rotation));
7302               }
7303
7304             /* Determine if the instruction is an ADD or a SUB.
7305                (For REL, this determines the sign of the addend.)  */
7306             negative = identify_add_or_sub (insn);
7307             if (negative == 0)
7308               {
7309                 (*_bfd_error_handler)
7310                   (_("%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group relocations"),
7311                   input_bfd, input_section,
7312                   (long) rel->r_offset, howto->name);
7313                 return bfd_reloc_overflow;
7314               }
7315
7316             signed_addend *= negative;
7317           }
7318
7319         /* Compute the value (X) to go in the place.  */
7320         if (r_type == R_ARM_ALU_PC_G0_NC
7321             || r_type == R_ARM_ALU_PC_G1_NC
7322             || r_type == R_ARM_ALU_PC_G0
7323             || r_type == R_ARM_ALU_PC_G1
7324             || r_type == R_ARM_ALU_PC_G2)
7325           /* PC relative.  */
7326           signed_value = value - pc + signed_addend;
7327         else
7328           /* Section base relative.  */
7329           signed_value = value - sb + signed_addend;
7330
7331         /* If the target symbol is a Thumb function, then set the
7332            Thumb bit in the address.  */
7333         if (sym_flags == STT_ARM_TFUNC)
7334           signed_value |= 1;
7335
7336         /* Calculate the value of the relevant G_n, in encoded
7337            constant-with-rotation format.  */
7338         g_n = calculate_group_reloc_mask (abs (signed_value), group,
7339                                           &residual);
7340
7341         /* Check for overflow if required.  */
7342         if ((r_type == R_ARM_ALU_PC_G0
7343              || r_type == R_ARM_ALU_PC_G1
7344              || r_type == R_ARM_ALU_PC_G2
7345              || r_type == R_ARM_ALU_SB_G0
7346              || r_type == R_ARM_ALU_SB_G1
7347              || r_type == R_ARM_ALU_SB_G2) && residual != 0)
7348           {
7349             (*_bfd_error_handler)
7350               (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7351               input_bfd, input_section,
7352               (long) rel->r_offset, abs (signed_value), howto->name);
7353             return bfd_reloc_overflow;
7354           }
7355
7356         /* Mask out the value and the ADD/SUB part of the opcode; take care
7357            not to destroy the S bit.  */
7358         insn &= 0xff1ff000;
7359
7360         /* Set the opcode according to whether the value to go in the
7361            place is negative.  */
7362         if (signed_value < 0)
7363           insn |= 1 << 22;
7364         else
7365           insn |= 1 << 23;
7366
7367         /* Encode the offset.  */
7368         insn |= g_n;
7369
7370         bfd_put_32 (input_bfd, insn, hit_data);
7371       }
7372       return bfd_reloc_ok;
7373
7374     case R_ARM_LDR_PC_G0:
7375     case R_ARM_LDR_PC_G1:
7376     case R_ARM_LDR_PC_G2:
7377     case R_ARM_LDR_SB_G0:
7378     case R_ARM_LDR_SB_G1:
7379     case R_ARM_LDR_SB_G2:
7380       {
7381         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7382         bfd_vma pc = input_section->output_section->vma
7383                      + input_section->output_offset + rel->r_offset;
7384         bfd_vma sb = 0; /* See note above.  */
7385         bfd_vma residual;
7386         bfd_signed_vma signed_value;
7387         int group = 0;
7388
7389         /* Determine which groups of bits to calculate.  */
7390         switch (r_type)
7391           {
7392           case R_ARM_LDR_PC_G0:
7393           case R_ARM_LDR_SB_G0:
7394             group = 0;
7395             break;
7396
7397           case R_ARM_LDR_PC_G1:
7398           case R_ARM_LDR_SB_G1:
7399             group = 1;
7400             break;
7401
7402           case R_ARM_LDR_PC_G2:
7403           case R_ARM_LDR_SB_G2:
7404             group = 2;
7405             break;
7406
7407           default:
7408             abort ();
7409           }
7410
7411         /* If REL, extract the addend from the insn.  If RELA, it will
7412            have already been fetched for us.  */
7413         if (globals->use_rel)
7414           {
7415             int negative = (insn & (1 << 23)) ? 1 : -1;
7416             signed_addend = negative * (insn & 0xfff);
7417           }
7418
7419         /* Compute the value (X) to go in the place.  */
7420         if (r_type == R_ARM_LDR_PC_G0
7421             || r_type == R_ARM_LDR_PC_G1
7422             || r_type == R_ARM_LDR_PC_G2)
7423           /* PC relative.  */
7424           signed_value = value - pc + signed_addend;
7425         else
7426           /* Section base relative.  */
7427           signed_value = value - sb + signed_addend;
7428
7429         /* Calculate the value of the relevant G_{n-1} to obtain
7430            the residual at that stage.  */
7431         calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
7432
7433         /* Check for overflow.  */
7434         if (residual >= 0x1000)
7435           {
7436             (*_bfd_error_handler)
7437               (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7438               input_bfd, input_section,
7439               (long) rel->r_offset, abs (signed_value), howto->name);
7440             return bfd_reloc_overflow;
7441           }
7442
7443         /* Mask out the value and U bit.  */
7444         insn &= 0xff7ff000;
7445
7446         /* Set the U bit if the value to go in the place is non-negative.  */
7447         if (signed_value >= 0)
7448           insn |= 1 << 23;
7449
7450         /* Encode the offset.  */
7451         insn |= residual;
7452
7453         bfd_put_32 (input_bfd, insn, hit_data);
7454       }
7455       return bfd_reloc_ok;
7456
7457     case R_ARM_LDRS_PC_G0:
7458     case R_ARM_LDRS_PC_G1:
7459     case R_ARM_LDRS_PC_G2:
7460     case R_ARM_LDRS_SB_G0:
7461     case R_ARM_LDRS_SB_G1:
7462     case R_ARM_LDRS_SB_G2:
7463       {
7464         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7465         bfd_vma pc = input_section->output_section->vma
7466                      + input_section->output_offset + rel->r_offset;
7467         bfd_vma sb = 0; /* See note above.  */
7468         bfd_vma residual;
7469         bfd_signed_vma signed_value;
7470         int group = 0;
7471
7472         /* Determine which groups of bits to calculate.  */
7473         switch (r_type)
7474           {
7475           case R_ARM_LDRS_PC_G0:
7476           case R_ARM_LDRS_SB_G0:
7477             group = 0;
7478             break;
7479
7480           case R_ARM_LDRS_PC_G1:
7481           case R_ARM_LDRS_SB_G1:
7482             group = 1;
7483             break;
7484
7485           case R_ARM_LDRS_PC_G2:
7486           case R_ARM_LDRS_SB_G2:
7487             group = 2;
7488             break;
7489
7490           default:
7491             abort ();
7492           }
7493
7494         /* If REL, extract the addend from the insn.  If RELA, it will
7495            have already been fetched for us.  */
7496         if (globals->use_rel)
7497           {
7498             int negative = (insn & (1 << 23)) ? 1 : -1;
7499             signed_addend = negative * (((insn & 0xf00) >> 4) + (insn & 0xf));
7500           }
7501
7502         /* Compute the value (X) to go in the place.  */
7503         if (r_type == R_ARM_LDRS_PC_G0
7504             || r_type == R_ARM_LDRS_PC_G1
7505             || r_type == R_ARM_LDRS_PC_G2)
7506           /* PC relative.  */
7507           signed_value = value - pc + signed_addend;
7508         else
7509           /* Section base relative.  */
7510           signed_value = value - sb + signed_addend;
7511
7512         /* Calculate the value of the relevant G_{n-1} to obtain
7513            the residual at that stage.  */
7514         calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
7515
7516         /* Check for overflow.  */
7517         if (residual >= 0x100)
7518           {
7519             (*_bfd_error_handler)
7520               (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7521               input_bfd, input_section,
7522               (long) rel->r_offset, abs (signed_value), howto->name);
7523             return bfd_reloc_overflow;
7524           }
7525
7526         /* Mask out the value and U bit.  */
7527         insn &= 0xff7ff0f0;
7528
7529         /* Set the U bit if the value to go in the place is non-negative.  */
7530         if (signed_value >= 0)
7531           insn |= 1 << 23;
7532
7533         /* Encode the offset.  */
7534         insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
7535
7536         bfd_put_32 (input_bfd, insn, hit_data);
7537       }
7538       return bfd_reloc_ok;
7539
7540     case R_ARM_LDC_PC_G0:
7541     case R_ARM_LDC_PC_G1:
7542     case R_ARM_LDC_PC_G2:
7543     case R_ARM_LDC_SB_G0:
7544     case R_ARM_LDC_SB_G1:
7545     case R_ARM_LDC_SB_G2:
7546       {
7547         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
7548         bfd_vma pc = input_section->output_section->vma
7549                      + input_section->output_offset + rel->r_offset;
7550         bfd_vma sb = 0; /* See note above.  */
7551         bfd_vma residual;
7552         bfd_signed_vma signed_value;
7553         int group = 0;
7554
7555         /* Determine which groups of bits to calculate.  */
7556         switch (r_type)
7557           {
7558           case R_ARM_LDC_PC_G0:
7559           case R_ARM_LDC_SB_G0:
7560             group = 0;
7561             break;
7562
7563           case R_ARM_LDC_PC_G1:
7564           case R_ARM_LDC_SB_G1:
7565             group = 1;
7566             break;
7567
7568           case R_ARM_LDC_PC_G2:
7569           case R_ARM_LDC_SB_G2:
7570             group = 2;
7571             break;
7572
7573           default:
7574             abort ();
7575           }
7576
7577         /* If REL, extract the addend from the insn.  If RELA, it will
7578            have already been fetched for us.  */
7579         if (globals->use_rel)
7580           {
7581             int negative = (insn & (1 << 23)) ? 1 : -1;
7582             signed_addend = negative * ((insn & 0xff) << 2);
7583           }
7584
7585         /* Compute the value (X) to go in the place.  */
7586         if (r_type == R_ARM_LDC_PC_G0
7587             || r_type == R_ARM_LDC_PC_G1
7588             || r_type == R_ARM_LDC_PC_G2)
7589           /* PC relative.  */
7590           signed_value = value - pc + signed_addend;
7591         else
7592           /* Section base relative.  */
7593           signed_value = value - sb + signed_addend;
7594
7595         /* Calculate the value of the relevant G_{n-1} to obtain
7596            the residual at that stage.  */
7597         calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
7598
7599         /* Check for overflow.  (The absolute value to go in the place must be
7600            divisible by four and, after having been divided by four, must
7601            fit in eight bits.)  */
7602         if ((residual & 0x3) != 0 || residual >= 0x400)
7603           {
7604             (*_bfd_error_handler)
7605               (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
7606               input_bfd, input_section,
7607               (long) rel->r_offset, abs (signed_value), howto->name);
7608             return bfd_reloc_overflow;
7609           }
7610
7611         /* Mask out the value and U bit.  */
7612         insn &= 0xff7fff00;
7613
7614         /* Set the U bit if the value to go in the place is non-negative.  */
7615         if (signed_value >= 0)
7616           insn |= 1 << 23;
7617
7618         /* Encode the offset.  */
7619         insn |= residual >> 2;
7620
7621         bfd_put_32 (input_bfd, insn, hit_data);
7622       }
7623       return bfd_reloc_ok;
7624
7625     default:
7626       return bfd_reloc_notsupported;
7627     }
7628 }
7629
7630 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS.  */
7631 static void
7632 arm_add_to_rel (bfd *              abfd,
7633                 bfd_byte *         address,
7634                 reloc_howto_type * howto,
7635                 bfd_signed_vma     increment)
7636 {
7637   bfd_signed_vma addend;
7638
7639   if (howto->type == R_ARM_THM_CALL
7640       || howto->type == R_ARM_THM_JUMP24)
7641     {
7642       int upper_insn, lower_insn;
7643       int upper, lower;
7644
7645       upper_insn = bfd_get_16 (abfd, address);
7646       lower_insn = bfd_get_16 (abfd, address + 2);
7647       upper = upper_insn & 0x7ff;
7648       lower = lower_insn & 0x7ff;
7649
7650       addend = (upper << 12) | (lower << 1);
7651       addend += increment;
7652       addend >>= 1;
7653
7654       upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
7655       lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
7656
7657       bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
7658       bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
7659     }
7660   else
7661     {
7662       bfd_vma        contents;
7663
7664       contents = bfd_get_32 (abfd, address);
7665
7666       /* Get the (signed) value from the instruction.  */
7667       addend = contents & howto->src_mask;
7668       if (addend & ((howto->src_mask + 1) >> 1))
7669         {
7670           bfd_signed_vma mask;
7671
7672           mask = -1;
7673           mask &= ~ howto->src_mask;
7674           addend |= mask;
7675         }
7676
7677       /* Add in the increment, (which is a byte value).  */
7678       switch (howto->type)
7679         {
7680         default:
7681           addend += increment;
7682           break;
7683
7684         case R_ARM_PC24:
7685         case R_ARM_PLT32:
7686         case R_ARM_CALL:
7687         case R_ARM_JUMP24:
7688           addend <<= howto->size;
7689           addend += increment;
7690
7691           /* Should we check for overflow here ?  */
7692
7693           /* Drop any undesired bits.  */
7694           addend >>= howto->rightshift;
7695           break;
7696         }
7697
7698       contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
7699
7700       bfd_put_32 (abfd, contents, address);
7701     }
7702 }
7703
7704 #define IS_ARM_TLS_RELOC(R_TYPE)        \
7705   ((R_TYPE) == R_ARM_TLS_GD32           \
7706    || (R_TYPE) == R_ARM_TLS_LDO32       \
7707    || (R_TYPE) == R_ARM_TLS_LDM32       \
7708    || (R_TYPE) == R_ARM_TLS_DTPOFF32    \
7709    || (R_TYPE) == R_ARM_TLS_DTPMOD32    \
7710    || (R_TYPE) == R_ARM_TLS_TPOFF32     \
7711    || (R_TYPE) == R_ARM_TLS_LE32        \
7712    || (R_TYPE) == R_ARM_TLS_IE32)
7713
7714 /* Relocate an ARM ELF section.  */
7715
7716 static bfd_boolean
7717 elf32_arm_relocate_section (bfd *                  output_bfd,
7718                             struct bfd_link_info * info,
7719                             bfd *                  input_bfd,
7720                             asection *             input_section,
7721                             bfd_byte *             contents,
7722                             Elf_Internal_Rela *    relocs,
7723                             Elf_Internal_Sym *     local_syms,
7724                             asection **            local_sections)
7725 {
7726   Elf_Internal_Shdr *symtab_hdr;
7727   struct elf_link_hash_entry **sym_hashes;
7728   Elf_Internal_Rela *rel;
7729   Elf_Internal_Rela *relend;
7730   const char *name;
7731   struct elf32_arm_link_hash_table * globals;
7732
7733   globals = elf32_arm_hash_table (info);
7734
7735   symtab_hdr = & elf_symtab_hdr (input_bfd);
7736   sym_hashes = elf_sym_hashes (input_bfd);
7737
7738   rel = relocs;
7739   relend = relocs + input_section->reloc_count;
7740   for (; rel < relend; rel++)
7741     {
7742       int                          r_type;
7743       reloc_howto_type *           howto;
7744       unsigned long                r_symndx;
7745       Elf_Internal_Sym *           sym;
7746       asection *                   sec;
7747       struct elf_link_hash_entry * h;
7748       bfd_vma                      relocation;
7749       bfd_reloc_status_type        r;
7750       arelent                      bfd_reloc;
7751       char                         sym_type;
7752       bfd_boolean                  unresolved_reloc = FALSE;
7753       char *error_message = NULL;
7754
7755       r_symndx = ELF32_R_SYM (rel->r_info);
7756       r_type   = ELF32_R_TYPE (rel->r_info);
7757       r_type   = arm_real_reloc_type (globals, r_type);
7758
7759       if (   r_type == R_ARM_GNU_VTENTRY
7760           || r_type == R_ARM_GNU_VTINHERIT)
7761         continue;
7762
7763       bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
7764       howto = bfd_reloc.howto;
7765
7766       h = NULL;
7767       sym = NULL;
7768       sec = NULL;
7769
7770       if (r_symndx < symtab_hdr->sh_info)
7771         {
7772           sym = local_syms + r_symndx;
7773           sym_type = ELF32_ST_TYPE (sym->st_info);
7774           sec = local_sections[r_symndx];
7775           if (globals->use_rel)
7776             {
7777               relocation = (sec->output_section->vma
7778                             + sec->output_offset
7779                             + sym->st_value);
7780               if (!info->relocatable
7781                   && (sec->flags & SEC_MERGE)
7782                   && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7783                 {
7784                   asection *msec;
7785                   bfd_vma addend, value;
7786
7787                   switch (r_type)
7788                     {
7789                     case R_ARM_MOVW_ABS_NC:
7790                     case R_ARM_MOVT_ABS:
7791                       value = bfd_get_32 (input_bfd, contents + rel->r_offset);
7792                       addend = ((value & 0xf0000) >> 4) | (value & 0xfff);
7793                       addend = (addend ^ 0x8000) - 0x8000;
7794                       break;
7795
7796                     case R_ARM_THM_MOVW_ABS_NC:
7797                     case R_ARM_THM_MOVT_ABS:
7798                       value = bfd_get_16 (input_bfd, contents + rel->r_offset)
7799                               << 16;
7800                       value |= bfd_get_16 (input_bfd,
7801                                            contents + rel->r_offset + 2);
7802                       addend = ((value & 0xf7000) >> 4) | (value & 0xff)
7803                                | ((value & 0x04000000) >> 15);
7804                       addend = (addend ^ 0x8000) - 0x8000;
7805                       break;
7806
7807                     default:
7808                       if (howto->rightshift
7809                           || (howto->src_mask & (howto->src_mask + 1)))
7810                         {
7811                           (*_bfd_error_handler)
7812                             (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
7813                              input_bfd, input_section,
7814                              (long) rel->r_offset, howto->name);
7815                           return FALSE;
7816                         }
7817
7818                       value = bfd_get_32 (input_bfd, contents + rel->r_offset);
7819
7820                       /* Get the (signed) value from the instruction.  */
7821                       addend = value & howto->src_mask;
7822                       if (addend & ((howto->src_mask + 1) >> 1))
7823                         {
7824                           bfd_signed_vma mask;
7825
7826                           mask = -1;
7827                           mask &= ~ howto->src_mask;
7828                           addend |= mask;
7829                         }
7830                       break;
7831                     }
7832
7833                   msec = sec;
7834                   addend =
7835                     _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
7836                     - relocation;
7837                   addend += msec->output_section->vma + msec->output_offset;
7838
7839                   /* Cases here must match those in the preceeding
7840                      switch statement.  */
7841                   switch (r_type)
7842                     {
7843                     case R_ARM_MOVW_ABS_NC:
7844                     case R_ARM_MOVT_ABS:
7845                       value = (value & 0xfff0f000) | ((addend & 0xf000) << 4)
7846                               | (addend & 0xfff);
7847                       bfd_put_32 (input_bfd, value, contents + rel->r_offset);
7848                       break;
7849
7850                     case R_ARM_THM_MOVW_ABS_NC:
7851                     case R_ARM_THM_MOVT_ABS:
7852                       value = (value & 0xfbf08f00) | ((addend & 0xf700) << 4)
7853                               | (addend & 0xff) | ((addend & 0x0800) << 15);
7854                       bfd_put_16 (input_bfd, value >> 16,
7855                                   contents + rel->r_offset);
7856                       bfd_put_16 (input_bfd, value,
7857                                   contents + rel->r_offset + 2);
7858                       break;
7859
7860                     default:
7861                       value = (value & ~ howto->dst_mask)
7862                               | (addend & howto->dst_mask);
7863                       bfd_put_32 (input_bfd, value, contents + rel->r_offset);
7864                       break;
7865                     }
7866                 }
7867             }
7868           else
7869             relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
7870         }
7871       else
7872         {
7873           bfd_boolean warned;
7874
7875           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
7876                                    r_symndx, symtab_hdr, sym_hashes,
7877                                    h, sec, relocation,
7878                                    unresolved_reloc, warned);
7879
7880           sym_type = h->type;
7881         }
7882
7883       if (sec != NULL && elf_discarded_section (sec))
7884         {
7885           /* For relocs against symbols from removed linkonce sections,
7886              or sections discarded by a linker script, we just want the
7887              section contents zeroed.  Avoid any special processing.  */
7888           _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
7889           rel->r_info = 0;
7890           rel->r_addend = 0;
7891           continue;
7892         }
7893
7894       if (info->relocatable)
7895         {
7896           /* This is a relocatable link.  We don't have to change
7897              anything, unless the reloc is against a section symbol,
7898              in which case we have to adjust according to where the
7899              section symbol winds up in the output section.  */
7900           if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7901             {
7902               if (globals->use_rel)
7903                 arm_add_to_rel (input_bfd, contents + rel->r_offset,
7904                                 howto, (bfd_signed_vma) sec->output_offset);
7905               else
7906                 rel->r_addend += sec->output_offset;
7907             }
7908           continue;
7909         }
7910
7911       if (h != NULL)
7912         name = h->root.root.string;
7913       else
7914         {
7915           name = (bfd_elf_string_from_elf_section
7916                   (input_bfd, symtab_hdr->sh_link, sym->st_name));
7917           if (name == NULL || *name == '\0')
7918             name = bfd_section_name (input_bfd, sec);
7919         }
7920
7921       if (r_symndx != 0
7922           && r_type != R_ARM_NONE
7923           && (h == NULL
7924               || h->root.type == bfd_link_hash_defined
7925               || h->root.type == bfd_link_hash_defweak)
7926           && IS_ARM_TLS_RELOC (r_type) != (sym_type == STT_TLS))
7927         {
7928           (*_bfd_error_handler)
7929             ((sym_type == STT_TLS
7930               ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
7931               : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
7932              input_bfd,
7933              input_section,
7934              (long) rel->r_offset,
7935              howto->name,
7936              name);
7937         }
7938
7939       r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
7940                                          input_section, contents, rel,
7941                                          relocation, info, sec, name,
7942                                          (h ? ELF_ST_TYPE (h->type) :
7943                                           ELF_ST_TYPE (sym->st_info)), h,
7944                                          &unresolved_reloc, &error_message);
7945
7946       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
7947          because such sections are not SEC_ALLOC and thus ld.so will
7948          not process them.  */
7949       if (unresolved_reloc
7950           && !((input_section->flags & SEC_DEBUGGING) != 0
7951                && h->def_dynamic))
7952         {
7953           (*_bfd_error_handler)
7954             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
7955              input_bfd,
7956              input_section,
7957              (long) rel->r_offset,
7958              howto->name,
7959              h->root.root.string);
7960           return FALSE;
7961         }
7962
7963       if (r != bfd_reloc_ok)
7964         {
7965           switch (r)
7966             {
7967             case bfd_reloc_overflow:
7968               /* If the overflowing reloc was to an undefined symbol,
7969                  we have already printed one error message and there
7970                  is no point complaining again.  */
7971               if ((! h ||
7972                    h->root.type != bfd_link_hash_undefined)
7973                   && (!((*info->callbacks->reloc_overflow)
7974                         (info, (h ? &h->root : NULL), name, howto->name,
7975                          (bfd_vma) 0, input_bfd, input_section,
7976                          rel->r_offset))))
7977                   return FALSE;
7978               break;
7979
7980             case bfd_reloc_undefined:
7981               if (!((*info->callbacks->undefined_symbol)
7982                     (info, name, input_bfd, input_section,
7983                      rel->r_offset, TRUE)))
7984                 return FALSE;
7985               break;
7986
7987             case bfd_reloc_outofrange:
7988               error_message = _("out of range");
7989               goto common_error;
7990
7991             case bfd_reloc_notsupported:
7992               error_message = _("unsupported relocation");
7993               goto common_error;
7994
7995             case bfd_reloc_dangerous:
7996               /* error_message should already be set.  */
7997               goto common_error;
7998
7999             default:
8000               error_message = _("unknown error");
8001               /* Fall through.  */
8002
8003             common_error:
8004               BFD_ASSERT (error_message != NULL);
8005               if (!((*info->callbacks->reloc_dangerous)
8006                     (info, error_message, input_bfd, input_section,
8007                      rel->r_offset)))
8008                 return FALSE;
8009               break;
8010             }
8011         }
8012     }
8013
8014   return TRUE;
8015 }
8016
8017 /* Set the right machine number.  */
8018
8019 static bfd_boolean
8020 elf32_arm_object_p (bfd *abfd)
8021 {
8022   unsigned int mach;
8023
8024   mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
8025
8026   if (mach != bfd_mach_arm_unknown)
8027     bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
8028
8029   else if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
8030     bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
8031
8032   else
8033     bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
8034
8035   return TRUE;
8036 }
8037
8038 /* Function to keep ARM specific flags in the ELF header.  */
8039
8040 static bfd_boolean
8041 elf32_arm_set_private_flags (bfd *abfd, flagword flags)
8042 {
8043   if (elf_flags_init (abfd)
8044       && elf_elfheader (abfd)->e_flags != flags)
8045     {
8046       if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
8047         {
8048           if (flags & EF_ARM_INTERWORK)
8049             (*_bfd_error_handler)
8050               (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
8051                abfd);
8052           else
8053             _bfd_error_handler
8054               (_("Warning: Clearing the interworking flag of %B due to outside request"),
8055                abfd);
8056         }
8057     }
8058   else
8059     {
8060       elf_elfheader (abfd)->e_flags = flags;
8061       elf_flags_init (abfd) = TRUE;
8062     }
8063
8064   return TRUE;
8065 }
8066
8067 /* Copy backend specific data from one object module to another.  */
8068
8069 static bfd_boolean
8070 elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
8071 {
8072   flagword in_flags;
8073   flagword out_flags;
8074
8075   if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
8076     return TRUE;
8077
8078   in_flags  = elf_elfheader (ibfd)->e_flags;
8079   out_flags = elf_elfheader (obfd)->e_flags;
8080
8081   if (elf_flags_init (obfd)
8082       && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
8083       && in_flags != out_flags)
8084     {
8085       /* Cannot mix APCS26 and APCS32 code.  */
8086       if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
8087         return FALSE;
8088
8089       /* Cannot mix float APCS and non-float APCS code.  */
8090       if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
8091         return FALSE;
8092
8093       /* If the src and dest have different interworking flags
8094          then turn off the interworking bit.  */
8095       if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
8096         {
8097           if (out_flags & EF_ARM_INTERWORK)
8098             _bfd_error_handler
8099               (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
8100                obfd, ibfd);
8101
8102           in_flags &= ~EF_ARM_INTERWORK;
8103         }
8104
8105       /* Likewise for PIC, though don't warn for this case.  */
8106       if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
8107         in_flags &= ~EF_ARM_PIC;
8108     }
8109
8110   elf_elfheader (obfd)->e_flags = in_flags;
8111   elf_flags_init (obfd) = TRUE;
8112
8113   /* Also copy the EI_OSABI field.  */
8114   elf_elfheader (obfd)->e_ident[EI_OSABI] =
8115     elf_elfheader (ibfd)->e_ident[EI_OSABI];
8116
8117   /* Copy object attributes.  */
8118   _bfd_elf_copy_obj_attributes (ibfd, obfd);
8119
8120   return TRUE;
8121 }
8122
8123 /* Values for Tag_ABI_PCS_R9_use.  */
8124 enum
8125 {
8126   AEABI_R9_V6,
8127   AEABI_R9_SB,
8128   AEABI_R9_TLS,
8129   AEABI_R9_unused
8130 };
8131
8132 /* Values for Tag_ABI_PCS_RW_data.  */
8133 enum
8134 {
8135   AEABI_PCS_RW_data_absolute,
8136   AEABI_PCS_RW_data_PCrel,
8137   AEABI_PCS_RW_data_SBrel,
8138   AEABI_PCS_RW_data_unused
8139 };
8140
8141 /* Values for Tag_ABI_enum_size.  */
8142 enum
8143 {
8144   AEABI_enum_unused,
8145   AEABI_enum_short,
8146   AEABI_enum_wide,
8147   AEABI_enum_forced_wide
8148 };
8149
8150 /* Determine whether an object attribute tag takes an integer, a
8151    string or both.  */
8152
8153 static int
8154 elf32_arm_obj_attrs_arg_type (int tag)
8155 {
8156   if (tag == Tag_compatibility)
8157     return 3;
8158   else if (tag == 4 || tag == 5)
8159     return 2;
8160   else if (tag < 32)
8161     return 1;
8162   else
8163     return (tag & 1) != 0 ? 2 : 1;
8164 }
8165
8166 /* Merge EABI object attributes from IBFD into OBFD.  Raise an error if there
8167    are conflicting attributes.  */
8168
8169 static bfd_boolean
8170 elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
8171 {
8172   obj_attribute *in_attr;
8173   obj_attribute *out_attr;
8174   obj_attribute_list *in_list;
8175   /* Some tags have 0 = don't care, 1 = strong requirement,
8176      2 = weak requirement.  */
8177   static const int order_312[3] = {3, 1, 2};
8178   /* For use with Tag_VFP_arch.  */
8179   static const int order_01243[5] = {0, 1, 2, 4, 3};
8180   int i;
8181
8182   if (!elf_known_obj_attributes_proc (obfd)[0].i)
8183     {
8184       /* This is the first object.  Copy the attributes.  */
8185       _bfd_elf_copy_obj_attributes (ibfd, obfd);
8186
8187       /* Use the Tag_null value to indicate the attributes have been
8188          initialized.  */
8189       elf_known_obj_attributes_proc (obfd)[0].i = 1;
8190
8191       return TRUE;
8192     }
8193
8194   in_attr = elf_known_obj_attributes_proc (ibfd);
8195   out_attr = elf_known_obj_attributes_proc (obfd);
8196   /* This needs to happen before Tag_ABI_FP_number_model is merged.  */
8197   if (in_attr[Tag_ABI_VFP_args].i != out_attr[Tag_ABI_VFP_args].i)
8198     {
8199       /* Ignore mismatches if teh object doesn't use floating point.  */
8200       if (out_attr[Tag_ABI_FP_number_model].i == 0)
8201         out_attr[Tag_ABI_VFP_args].i = in_attr[Tag_ABI_VFP_args].i;
8202       else if (in_attr[Tag_ABI_FP_number_model].i != 0)
8203         {
8204           _bfd_error_handler
8205             (_("ERROR: %B uses VFP register arguments, %B does not"),
8206              ibfd, obfd);
8207           return FALSE;
8208         }
8209     }
8210
8211   for (i = 4; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++)
8212     {
8213       /* Merge this attribute with existing attributes.  */
8214       switch (i)
8215         {
8216         case Tag_CPU_raw_name:
8217         case Tag_CPU_name:
8218           /* Use whichever has the greatest architecture requirements.  We
8219              won't necessarily have both the above tags, so make sure input
8220              name is non-NULL.  */
8221           if (in_attr[Tag_CPU_arch].i > out_attr[Tag_CPU_arch].i
8222               && in_attr[i].s)
8223             out_attr[i].s = _bfd_elf_attr_strdup (obfd, in_attr[i].s);
8224           break;
8225
8226         case Tag_ABI_optimization_goals:
8227         case Tag_ABI_FP_optimization_goals:
8228           /* Use the first value seen.  */
8229           break;
8230
8231         case Tag_CPU_arch:
8232         case Tag_ARM_ISA_use:
8233         case Tag_THUMB_ISA_use:
8234         case Tag_WMMX_arch:
8235         case Tag_NEON_arch:
8236           /* ??? Do NEON and WMMX conflict?  */
8237         case Tag_ABI_FP_rounding:
8238         case Tag_ABI_FP_denormal:
8239         case Tag_ABI_FP_exceptions:
8240         case Tag_ABI_FP_user_exceptions:
8241         case Tag_ABI_FP_number_model:
8242         case Tag_ABI_align8_preserved:
8243         case Tag_ABI_HardFP_use:
8244           /* Use the largest value specified.  */
8245           if (in_attr[i].i > out_attr[i].i)
8246             out_attr[i].i = in_attr[i].i;
8247           break;
8248
8249         case Tag_CPU_arch_profile:
8250           /* Warn if conflicting architecture profiles used.  */
8251           if (out_attr[i].i && in_attr[i].i && in_attr[i].i != out_attr[i].i)
8252             {
8253               _bfd_error_handler
8254                 (_("ERROR: %B: Conflicting architecture profiles %c/%c"),
8255                  ibfd, in_attr[i].i, out_attr[i].i);
8256               return FALSE;
8257             }
8258           if (in_attr[i].i)
8259             out_attr[i].i = in_attr[i].i;
8260           break;
8261         case Tag_VFP_arch:
8262           if (in_attr[i].i > 4 || out_attr[i].i > 4
8263               || order_01243[in_attr[i].i] > order_01243[out_attr[i].i])
8264             out_attr[i].i = in_attr[i].i;
8265           break;
8266         case Tag_PCS_config:
8267           if (out_attr[i].i == 0)
8268             out_attr[i].i = in_attr[i].i;
8269           else if (in_attr[i].i != 0 && out_attr[i].i != 0)
8270             {
8271               /* It's sometimes ok to mix different configs, so this is only
8272                  a warning.  */
8273               _bfd_error_handler
8274                 (_("Warning: %B: Conflicting platform configuration"), ibfd);
8275             }
8276           break;
8277         case Tag_ABI_PCS_R9_use:
8278           if (in_attr[i].i != out_attr[i].i
8279               && out_attr[i].i != AEABI_R9_unused
8280               && in_attr[i].i != AEABI_R9_unused)
8281             {
8282               _bfd_error_handler
8283                 (_("ERROR: %B: Conflicting use of R9"), ibfd);
8284               return FALSE;
8285             }
8286           if (out_attr[i].i == AEABI_R9_unused)
8287             out_attr[i].i = in_attr[i].i;
8288           break;
8289         case Tag_ABI_PCS_RW_data:
8290           if (in_attr[i].i == AEABI_PCS_RW_data_SBrel
8291               && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_SB
8292               && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_unused)
8293             {
8294               _bfd_error_handler
8295                 (_("ERROR: %B: SB relative addressing conflicts with use of R9"),
8296                  ibfd);
8297               return FALSE;
8298             }
8299           /* Use the smallest value specified.  */
8300           if (in_attr[i].i < out_attr[i].i)
8301             out_attr[i].i = in_attr[i].i;
8302           break;
8303         case Tag_ABI_PCS_RO_data:
8304           /* Use the smallest value specified.  */
8305           if (in_attr[i].i < out_attr[i].i)
8306             out_attr[i].i = in_attr[i].i;
8307           break;
8308         case Tag_ABI_PCS_GOT_use:
8309           if (in_attr[i].i > 2 || out_attr[i].i > 2
8310               || order_312[in_attr[i].i] < order_312[out_attr[i].i])
8311             out_attr[i].i = in_attr[i].i;
8312           break;
8313         case Tag_ABI_PCS_wchar_t:
8314           if (out_attr[i].i && in_attr[i].i && out_attr[i].i != in_attr[i].i
8315               && !elf_arm_tdata (obfd)->no_wchar_size_warning)
8316             {
8317               _bfd_error_handler
8318                 (_("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"),
8319                  ibfd, in_attr[i].i, out_attr[i].i);
8320             }
8321           else if (in_attr[i].i && !out_attr[i].i)
8322             out_attr[i].i = in_attr[i].i;
8323           break;
8324         case Tag_ABI_align8_needed:
8325           /* ??? Check against Tag_ABI_align8_preserved.  */
8326           if (in_attr[i].i > 2 || out_attr[i].i > 2
8327               || order_312[in_attr[i].i] < order_312[out_attr[i].i])
8328             out_attr[i].i = in_attr[i].i;
8329           break;
8330         case Tag_ABI_enum_size:
8331           if (in_attr[i].i != AEABI_enum_unused)
8332             {
8333               if (out_attr[i].i == AEABI_enum_unused
8334                   || out_attr[i].i == AEABI_enum_forced_wide)
8335                 {
8336                   /* The existing object is compatible with anything.
8337                      Use whatever requirements the new object has.  */
8338                   out_attr[i].i = in_attr[i].i;
8339                 }
8340               else if (in_attr[i].i != AEABI_enum_forced_wide
8341                        && out_attr[i].i != in_attr[i].i
8342                        && !elf_arm_tdata (obfd)->no_enum_size_warning)
8343                 {
8344                   const char *aeabi_enum_names[] =
8345                     { "", "variable-size", "32-bit", "" };
8346                   _bfd_error_handler
8347                     (_("warning: %B uses %s enums yet the output is to use %s enums; use of enum values across objects may fail"),
8348                      ibfd, aeabi_enum_names[in_attr[i].i],
8349                      aeabi_enum_names[out_attr[i].i]);
8350                 }
8351             }
8352           break;
8353         case Tag_ABI_VFP_args:
8354           /* Aready done.  */
8355           break;
8356         case Tag_ABI_WMMX_args:
8357           if (in_attr[i].i != out_attr[i].i)
8358             {
8359               _bfd_error_handler
8360                 (_("ERROR: %B uses iWMMXt register arguments, %B does not"),
8361                  ibfd, obfd);
8362               return FALSE;
8363             }
8364           break;
8365         default: /* All known attributes should be explicitly covered.   */
8366           abort ();
8367         }
8368
8369       if (in_attr[i].type && !out_attr[i].type)
8370         switch (in_attr[i].type)
8371           {
8372           case 1:
8373             if (out_attr[i].i)
8374               out_attr[i].type = 1;
8375             break;
8376
8377           case 2:
8378             if (out_attr[i].s)
8379               out_attr[i].type = 2;
8380             break;
8381
8382           default:
8383             abort ();
8384           }
8385     }
8386
8387   /* Merge Tag_compatibility attributes and any common GNU ones.  */
8388   _bfd_elf_merge_object_attributes (ibfd, obfd);
8389
8390   /* Check for any attributes not known on ARM.  */
8391   in_list = elf_other_obj_attributes_proc (ibfd);
8392   while (in_list && in_list->tag == Tag_compatibility)
8393     in_list = in_list->next;
8394
8395   for (; in_list; in_list = in_list->next)
8396     {
8397       if ((in_list->tag & 128) < 64)
8398         {
8399           _bfd_error_handler
8400             (_("Warning: %B: Unknown EABI object attribute %d"),
8401              ibfd, in_list->tag);
8402           break;
8403         }
8404     }
8405   return TRUE;
8406 }
8407
8408
8409 /* Return TRUE if the two EABI versions are incompatible.  */
8410
8411 static bfd_boolean
8412 elf32_arm_versions_compatible (unsigned iver, unsigned over)
8413 {
8414   /* v4 and v5 are the same spec before and after it was released,
8415      so allow mixing them.  */
8416   if ((iver == EF_ARM_EABI_VER4 && over == EF_ARM_EABI_VER5)
8417       || (iver == EF_ARM_EABI_VER5 && over == EF_ARM_EABI_VER4))
8418     return TRUE;
8419
8420   return (iver == over);
8421 }
8422
8423 /* Merge backend specific data from an object file to the output
8424    object file when linking.  */
8425
8426 static bfd_boolean
8427 elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
8428 {
8429   flagword out_flags;
8430   flagword in_flags;
8431   bfd_boolean flags_compatible = TRUE;
8432   asection *sec;
8433
8434   /* Check if we have the same endianess.  */
8435   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
8436     return FALSE;
8437
8438   if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
8439     return TRUE;
8440
8441   if (!elf32_arm_merge_eabi_attributes (ibfd, obfd))
8442     return FALSE;
8443
8444   /* The input BFD must have had its flags initialised.  */
8445   /* The following seems bogus to me -- The flags are initialized in
8446      the assembler but I don't think an elf_flags_init field is
8447      written into the object.  */
8448   /* BFD_ASSERT (elf_flags_init (ibfd)); */
8449
8450   in_flags  = elf_elfheader (ibfd)->e_flags;
8451   out_flags = elf_elfheader (obfd)->e_flags;
8452
8453   /* In theory there is no reason why we couldn't handle this.  However
8454      in practice it isn't even close to working and there is no real
8455      reason to want it.  */
8456   if (EF_ARM_EABI_VERSION (in_flags) >= EF_ARM_EABI_VER4
8457       && !(ibfd->flags & DYNAMIC)
8458       && (in_flags & EF_ARM_BE8))
8459     {
8460       _bfd_error_handler (_("ERROR: %B is already in final BE8 format"),
8461                           ibfd);
8462       return FALSE;
8463     }
8464
8465   if (!elf_flags_init (obfd))
8466     {
8467       /* If the input is the default architecture and had the default
8468          flags then do not bother setting the flags for the output
8469          architecture, instead allow future merges to do this.  If no
8470          future merges ever set these flags then they will retain their
8471          uninitialised values, which surprise surprise, correspond
8472          to the default values.  */
8473       if (bfd_get_arch_info (ibfd)->the_default
8474           && elf_elfheader (ibfd)->e_flags == 0)
8475         return TRUE;
8476
8477       elf_flags_init (obfd) = TRUE;
8478       elf_elfheader (obfd)->e_flags = in_flags;
8479
8480       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
8481           && bfd_get_arch_info (obfd)->the_default)
8482         return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
8483
8484       return TRUE;
8485     }
8486
8487   /* Determine what should happen if the input ARM architecture
8488      does not match the output ARM architecture.  */
8489   if (! bfd_arm_merge_machines (ibfd, obfd))
8490     return FALSE;
8491
8492   /* Identical flags must be compatible.  */
8493   if (in_flags == out_flags)
8494     return TRUE;
8495
8496   /* Check to see if the input BFD actually contains any sections.  If
8497      not, its flags may not have been initialised either, but it
8498      cannot actually cause any incompatiblity.  Do not short-circuit
8499      dynamic objects; their section list may be emptied by
8500     elf_link_add_object_symbols.
8501
8502     Also check to see if there are no code sections in the input.
8503     In this case there is no need to check for code specific flags.
8504     XXX - do we need to worry about floating-point format compatability
8505     in data sections ?  */
8506   if (!(ibfd->flags & DYNAMIC))
8507     {
8508       bfd_boolean null_input_bfd = TRUE;
8509       bfd_boolean only_data_sections = TRUE;
8510
8511       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8512         {
8513           /* Ignore synthetic glue sections.  */
8514           if (strcmp (sec->name, ".glue_7")
8515               && strcmp (sec->name, ".glue_7t"))
8516             {
8517               if ((bfd_get_section_flags (ibfd, sec)
8518                    & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
8519                   == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
8520                 only_data_sections = FALSE;
8521
8522               null_input_bfd = FALSE;
8523               break;
8524             }
8525         }
8526
8527       if (null_input_bfd || only_data_sections)
8528         return TRUE;
8529     }
8530
8531   /* Complain about various flag mismatches.  */
8532   if (!elf32_arm_versions_compatible (EF_ARM_EABI_VERSION (in_flags),
8533                                       EF_ARM_EABI_VERSION (out_flags)))
8534     {
8535       _bfd_error_handler
8536         (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
8537          ibfd, obfd,
8538          (in_flags & EF_ARM_EABIMASK) >> 24,
8539          (out_flags & EF_ARM_EABIMASK) >> 24);
8540       return FALSE;
8541     }
8542
8543   /* Not sure what needs to be checked for EABI versions >= 1.  */
8544   /* VxWorks libraries do not use these flags.  */
8545   if (get_elf_backend_data (obfd) != &elf32_arm_vxworks_bed
8546       && get_elf_backend_data (ibfd) != &elf32_arm_vxworks_bed
8547       && EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
8548     {
8549       if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
8550         {
8551           _bfd_error_handler
8552             (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
8553              ibfd, obfd,
8554              in_flags & EF_ARM_APCS_26 ? 26 : 32,
8555              out_flags & EF_ARM_APCS_26 ? 26 : 32);
8556           flags_compatible = FALSE;
8557         }
8558
8559       if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
8560         {
8561           if (in_flags & EF_ARM_APCS_FLOAT)
8562             _bfd_error_handler
8563               (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"),
8564                ibfd, obfd);
8565           else
8566             _bfd_error_handler
8567               (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"),
8568                ibfd, obfd);
8569
8570           flags_compatible = FALSE;
8571         }
8572
8573       if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
8574         {
8575           if (in_flags & EF_ARM_VFP_FLOAT)
8576             _bfd_error_handler
8577               (_("ERROR: %B uses VFP instructions, whereas %B does not"),
8578                ibfd, obfd);
8579           else
8580             _bfd_error_handler
8581               (_("ERROR: %B uses FPA instructions, whereas %B does not"),
8582                ibfd, obfd);
8583
8584           flags_compatible = FALSE;
8585         }
8586
8587       if ((in_flags & EF_ARM_MAVERICK_FLOAT) != (out_flags & EF_ARM_MAVERICK_FLOAT))
8588         {
8589           if (in_flags & EF_ARM_MAVERICK_FLOAT)
8590             _bfd_error_handler
8591               (_("ERROR: %B uses Maverick instructions, whereas %B does not"),
8592                ibfd, obfd);
8593           else
8594             _bfd_error_handler
8595               (_("ERROR: %B does not use Maverick instructions, whereas %B does"),
8596                ibfd, obfd);
8597
8598           flags_compatible = FALSE;
8599         }
8600
8601 #ifdef EF_ARM_SOFT_FLOAT
8602       if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
8603         {
8604           /* We can allow interworking between code that is VFP format
8605              layout, and uses either soft float or integer regs for
8606              passing floating point arguments and results.  We already
8607              know that the APCS_FLOAT flags match; similarly for VFP
8608              flags.  */
8609           if ((in_flags & EF_ARM_APCS_FLOAT) != 0
8610               || (in_flags & EF_ARM_VFP_FLOAT) == 0)
8611             {
8612               if (in_flags & EF_ARM_SOFT_FLOAT)
8613                 _bfd_error_handler
8614                   (_("ERROR: %B uses software FP, whereas %B uses hardware FP"),
8615                    ibfd, obfd);
8616               else
8617                 _bfd_error_handler
8618                   (_("ERROR: %B uses hardware FP, whereas %B uses software FP"),
8619                    ibfd, obfd);
8620
8621               flags_compatible = FALSE;
8622             }
8623         }
8624 #endif
8625
8626       /* Interworking mismatch is only a warning.  */
8627       if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
8628         {
8629           if (in_flags & EF_ARM_INTERWORK)
8630             {
8631               _bfd_error_handler
8632                 (_("Warning: %B supports interworking, whereas %B does not"),
8633                  ibfd, obfd);
8634             }
8635           else
8636             {
8637               _bfd_error_handler
8638                 (_("Warning: %B does not support interworking, whereas %B does"),
8639                  ibfd, obfd);
8640             }
8641         }
8642     }
8643
8644   return flags_compatible;
8645 }
8646
8647 /* Display the flags field.  */
8648
8649 static bfd_boolean
8650 elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
8651 {
8652   FILE * file = (FILE *) ptr;
8653   unsigned long flags;
8654
8655   BFD_ASSERT (abfd != NULL && ptr != NULL);
8656
8657   /* Print normal ELF private data.  */
8658   _bfd_elf_print_private_bfd_data (abfd, ptr);
8659
8660   flags = elf_elfheader (abfd)->e_flags;
8661   /* Ignore init flag - it may not be set, despite the flags field
8662      containing valid data.  */
8663
8664   /* xgettext:c-format */
8665   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
8666
8667   switch (EF_ARM_EABI_VERSION (flags))
8668     {
8669     case EF_ARM_EABI_UNKNOWN:
8670       /* The following flag bits are GNU extensions and not part of the
8671          official ARM ELF extended ABI.  Hence they are only decoded if
8672          the EABI version is not set.  */
8673       if (flags & EF_ARM_INTERWORK)
8674         fprintf (file, _(" [interworking enabled]"));
8675
8676       if (flags & EF_ARM_APCS_26)
8677         fprintf (file, " [APCS-26]");
8678       else
8679         fprintf (file, " [APCS-32]");
8680
8681       if (flags & EF_ARM_VFP_FLOAT)
8682         fprintf (file, _(" [VFP float format]"));
8683       else if (flags & EF_ARM_MAVERICK_FLOAT)
8684         fprintf (file, _(" [Maverick float format]"));
8685       else
8686         fprintf (file, _(" [FPA float format]"));
8687
8688       if (flags & EF_ARM_APCS_FLOAT)
8689         fprintf (file, _(" [floats passed in float registers]"));
8690
8691       if (flags & EF_ARM_PIC)
8692         fprintf (file, _(" [position independent]"));
8693
8694       if (flags & EF_ARM_NEW_ABI)
8695         fprintf (file, _(" [new ABI]"));
8696
8697       if (flags & EF_ARM_OLD_ABI)
8698         fprintf (file, _(" [old ABI]"));
8699
8700       if (flags & EF_ARM_SOFT_FLOAT)
8701         fprintf (file, _(" [software FP]"));
8702
8703       flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
8704                  | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
8705                  | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT
8706                  | EF_ARM_MAVERICK_FLOAT);
8707       break;
8708
8709     case EF_ARM_EABI_VER1:
8710       fprintf (file, _(" [Version1 EABI]"));
8711
8712       if (flags & EF_ARM_SYMSARESORTED)
8713         fprintf (file, _(" [sorted symbol table]"));
8714       else
8715         fprintf (file, _(" [unsorted symbol table]"));
8716
8717       flags &= ~ EF_ARM_SYMSARESORTED;
8718       break;
8719
8720     case EF_ARM_EABI_VER2:
8721       fprintf (file, _(" [Version2 EABI]"));
8722
8723       if (flags & EF_ARM_SYMSARESORTED)
8724         fprintf (file, _(" [sorted symbol table]"));
8725       else
8726         fprintf (file, _(" [unsorted symbol table]"));
8727
8728       if (flags & EF_ARM_DYNSYMSUSESEGIDX)
8729         fprintf (file, _(" [dynamic symbols use segment index]"));
8730
8731       if (flags & EF_ARM_MAPSYMSFIRST)
8732         fprintf (file, _(" [mapping symbols precede others]"));
8733
8734       flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
8735                  | EF_ARM_MAPSYMSFIRST);
8736       break;
8737
8738     case EF_ARM_EABI_VER3:
8739       fprintf (file, _(" [Version3 EABI]"));
8740       break;
8741
8742     case EF_ARM_EABI_VER4:
8743       fprintf (file, _(" [Version4 EABI]"));
8744       goto eabi;
8745
8746     case EF_ARM_EABI_VER5:
8747       fprintf (file, _(" [Version5 EABI]"));
8748     eabi:
8749       if (flags & EF_ARM_BE8)
8750         fprintf (file, _(" [BE8]"));
8751
8752       if (flags & EF_ARM_LE8)
8753         fprintf (file, _(" [LE8]"));
8754
8755       flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
8756       break;
8757
8758     default:
8759       fprintf (file, _(" <EABI version unrecognised>"));
8760       break;
8761     }
8762
8763   flags &= ~ EF_ARM_EABIMASK;
8764
8765   if (flags & EF_ARM_RELEXEC)
8766     fprintf (file, _(" [relocatable executable]"));
8767
8768   if (flags & EF_ARM_HASENTRY)
8769     fprintf (file, _(" [has entry point]"));
8770
8771   flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
8772
8773   if (flags)
8774     fprintf (file, _("<Unrecognised flag bits set>"));
8775
8776   fputc ('\n', file);
8777
8778   return TRUE;
8779 }
8780
8781 static int
8782 elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
8783 {
8784   switch (ELF_ST_TYPE (elf_sym->st_info))
8785     {
8786     case STT_ARM_TFUNC:
8787       return ELF_ST_TYPE (elf_sym->st_info);
8788
8789     case STT_ARM_16BIT:
8790       /* If the symbol is not an object, return the STT_ARM_16BIT flag.
8791          This allows us to distinguish between data used by Thumb instructions
8792          and non-data (which is probably code) inside Thumb regions of an
8793          executable.  */
8794       if (type != STT_OBJECT && type != STT_TLS)
8795         return ELF_ST_TYPE (elf_sym->st_info);
8796       break;
8797
8798     default:
8799       break;
8800     }
8801
8802   return type;
8803 }
8804
8805 static asection *
8806 elf32_arm_gc_mark_hook (asection *sec,
8807                         struct bfd_link_info *info,
8808                         Elf_Internal_Rela *rel,
8809                         struct elf_link_hash_entry *h,
8810                         Elf_Internal_Sym *sym)
8811 {
8812   if (h != NULL)
8813     switch (ELF32_R_TYPE (rel->r_info))
8814       {
8815       case R_ARM_GNU_VTINHERIT:
8816       case R_ARM_GNU_VTENTRY:
8817         return NULL;
8818       }
8819
8820   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
8821 }
8822
8823 /* Update the got entry reference counts for the section being removed.  */
8824
8825 static bfd_boolean
8826 elf32_arm_gc_sweep_hook (bfd *                     abfd,
8827                          struct bfd_link_info *    info,
8828                          asection *                sec,
8829                          const Elf_Internal_Rela * relocs)
8830 {
8831   Elf_Internal_Shdr *symtab_hdr;
8832   struct elf_link_hash_entry **sym_hashes;
8833   bfd_signed_vma *local_got_refcounts;
8834   const Elf_Internal_Rela *rel, *relend;
8835   struct elf32_arm_link_hash_table * globals;
8836
8837   if (info->relocatable)
8838     return TRUE;
8839
8840   globals = elf32_arm_hash_table (info);
8841
8842   elf_section_data (sec)->local_dynrel = NULL;
8843
8844   symtab_hdr = & elf_symtab_hdr (abfd);
8845   sym_hashes = elf_sym_hashes (abfd);
8846   local_got_refcounts = elf_local_got_refcounts (abfd);
8847
8848   check_use_blx (globals);
8849
8850   relend = relocs + sec->reloc_count;
8851   for (rel = relocs; rel < relend; rel++)
8852     {
8853       unsigned long r_symndx;
8854       struct elf_link_hash_entry *h = NULL;
8855       int r_type;
8856
8857       r_symndx = ELF32_R_SYM (rel->r_info);
8858       if (r_symndx >= symtab_hdr->sh_info)
8859         {
8860           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
8861           while (h->root.type == bfd_link_hash_indirect
8862                  || h->root.type == bfd_link_hash_warning)
8863             h = (struct elf_link_hash_entry *) h->root.u.i.link;
8864         }
8865
8866       r_type = ELF32_R_TYPE (rel->r_info);
8867       r_type = arm_real_reloc_type (globals, r_type);
8868       switch (r_type)
8869         {
8870         case R_ARM_GOT32:
8871         case R_ARM_GOT_PREL:
8872         case R_ARM_TLS_GD32:
8873         case R_ARM_TLS_IE32:
8874           if (h != NULL)
8875             {
8876               if (h->got.refcount > 0)
8877                 h->got.refcount -= 1;
8878             }
8879           else if (local_got_refcounts != NULL)
8880             {
8881               if (local_got_refcounts[r_symndx] > 0)
8882                 local_got_refcounts[r_symndx] -= 1;
8883             }
8884           break;
8885
8886         case R_ARM_TLS_LDM32:
8887           elf32_arm_hash_table (info)->tls_ldm_got.refcount -= 1;
8888           break;
8889
8890         case R_ARM_ABS32:
8891         case R_ARM_ABS32_NOI:
8892         case R_ARM_REL32:
8893         case R_ARM_REL32_NOI:
8894         case R_ARM_PC24:
8895         case R_ARM_PLT32:
8896         case R_ARM_CALL:
8897         case R_ARM_JUMP24:
8898         case R_ARM_PREL31:
8899         case R_ARM_THM_CALL:
8900         case R_ARM_THM_JUMP24:
8901         case R_ARM_THM_JUMP19:
8902         case R_ARM_MOVW_ABS_NC:
8903         case R_ARM_MOVT_ABS:
8904         case R_ARM_MOVW_PREL_NC:
8905         case R_ARM_MOVT_PREL:
8906         case R_ARM_THM_MOVW_ABS_NC:
8907         case R_ARM_THM_MOVT_ABS:
8908         case R_ARM_THM_MOVW_PREL_NC:
8909         case R_ARM_THM_MOVT_PREL:
8910           /* Should the interworking branches be here also?  */
8911
8912           if (h != NULL)
8913             {
8914               struct elf32_arm_link_hash_entry *eh;
8915               struct elf32_arm_relocs_copied **pp;
8916               struct elf32_arm_relocs_copied *p;
8917
8918               eh = (struct elf32_arm_link_hash_entry *) h;
8919
8920               if (h->plt.refcount > 0)
8921                 {
8922                   h->plt.refcount -= 1;
8923                   if (r_type == R_ARM_THM_CALL)
8924                     eh->plt_maybe_thumb_refcount--;
8925
8926                   if (r_type == R_ARM_THM_JUMP24
8927                       || r_type == R_ARM_THM_JUMP19)
8928                     eh->plt_thumb_refcount--;
8929                 }
8930
8931               if (r_type == R_ARM_ABS32
8932                   || r_type == R_ARM_REL32
8933                   || r_type == R_ARM_ABS32_NOI
8934                   || r_type == R_ARM_REL32_NOI)
8935                 {
8936                   for (pp = &eh->relocs_copied; (p = *pp) != NULL;
8937                        pp = &p->next)
8938                   if (p->section == sec)
8939                     {
8940                       p->count -= 1;
8941                       if (ELF32_R_TYPE (rel->r_info) == R_ARM_REL32
8942                           || ELF32_R_TYPE (rel->r_info) == R_ARM_REL32_NOI)
8943                         p->pc_count -= 1;
8944                       if (p->count == 0)
8945                         *pp = p->next;
8946                       break;
8947                     }
8948                 }
8949             }
8950           break;
8951
8952         default:
8953           break;
8954         }
8955     }
8956
8957   return TRUE;
8958 }
8959
8960 /* Look through the relocs for a section during the first phase.  */
8961
8962 static bfd_boolean
8963 elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
8964                         asection *sec, const Elf_Internal_Rela *relocs)
8965 {
8966   Elf_Internal_Shdr *symtab_hdr;
8967   struct elf_link_hash_entry **sym_hashes;
8968   const Elf_Internal_Rela *rel;
8969   const Elf_Internal_Rela *rel_end;
8970   bfd *dynobj;
8971   asection *sreloc;
8972   bfd_vma *local_got_offsets;
8973   struct elf32_arm_link_hash_table *htab;
8974   bfd_boolean needs_plt;
8975
8976   if (info->relocatable)
8977     return TRUE;
8978
8979   BFD_ASSERT (is_arm_elf (abfd));
8980
8981   htab = elf32_arm_hash_table (info);
8982   sreloc = NULL;
8983
8984   /* Create dynamic sections for relocatable executables so that we can
8985      copy relocations.  */
8986   if (htab->root.is_relocatable_executable
8987       && ! htab->root.dynamic_sections_created)
8988     {
8989       if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
8990         return FALSE;
8991     }
8992
8993   dynobj = elf_hash_table (info)->dynobj;
8994   local_got_offsets = elf_local_got_offsets (abfd);
8995
8996   symtab_hdr = & elf_symtab_hdr (abfd);
8997   sym_hashes = elf_sym_hashes (abfd);
8998
8999   rel_end = relocs + sec->reloc_count;
9000   for (rel = relocs; rel < rel_end; rel++)
9001     {
9002       struct elf_link_hash_entry *h;
9003       struct elf32_arm_link_hash_entry *eh;
9004       unsigned long r_symndx;
9005       int r_type;
9006
9007       r_symndx = ELF32_R_SYM (rel->r_info);
9008       r_type = ELF32_R_TYPE (rel->r_info);
9009       r_type = arm_real_reloc_type (htab, r_type);
9010
9011       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
9012         {
9013           (*_bfd_error_handler) (_("%B: bad symbol index: %d"), abfd,
9014                                  r_symndx);
9015           return FALSE;
9016         }
9017
9018       if (r_symndx < symtab_hdr->sh_info)
9019         h = NULL;
9020       else
9021         {
9022           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
9023           while (h->root.type == bfd_link_hash_indirect
9024                  || h->root.type == bfd_link_hash_warning)
9025             h = (struct elf_link_hash_entry *) h->root.u.i.link;
9026         }
9027
9028       eh = (struct elf32_arm_link_hash_entry *) h;
9029
9030       switch (r_type)
9031         {
9032           case R_ARM_GOT32:
9033           case R_ARM_GOT_PREL:
9034           case R_ARM_TLS_GD32:
9035           case R_ARM_TLS_IE32:
9036             /* This symbol requires a global offset table entry.  */
9037             {
9038               int tls_type, old_tls_type;
9039
9040               switch (r_type)
9041                 {
9042                 case R_ARM_TLS_GD32: tls_type = GOT_TLS_GD; break;
9043                 case R_ARM_TLS_IE32: tls_type = GOT_TLS_IE; break;
9044                 default: tls_type = GOT_NORMAL; break;
9045                 }
9046
9047               if (h != NULL)
9048                 {
9049                   h->got.refcount++;
9050                   old_tls_type = elf32_arm_hash_entry (h)->tls_type;
9051                 }
9052               else
9053                 {
9054                   bfd_signed_vma *local_got_refcounts;
9055
9056                   /* This is a global offset table entry for a local symbol.  */
9057                   local_got_refcounts = elf_local_got_refcounts (abfd);
9058                   if (local_got_refcounts == NULL)
9059                     {
9060                       bfd_size_type size;
9061
9062                       size = symtab_hdr->sh_info;
9063                       size *= (sizeof (bfd_signed_vma) + sizeof (char));
9064                       local_got_refcounts = bfd_zalloc (abfd, size);
9065                       if (local_got_refcounts == NULL)
9066                         return FALSE;
9067                       elf_local_got_refcounts (abfd) = local_got_refcounts;
9068                       elf32_arm_local_got_tls_type (abfd)
9069                         = (char *) (local_got_refcounts + symtab_hdr->sh_info);
9070                     }
9071                   local_got_refcounts[r_symndx] += 1;
9072                   old_tls_type = elf32_arm_local_got_tls_type (abfd) [r_symndx];
9073                 }
9074
9075               /* We will already have issued an error message if there is a
9076                  TLS / non-TLS mismatch, based on the symbol type.  We don't
9077                  support any linker relaxations.  So just combine any TLS
9078                  types needed.  */
9079               if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
9080                   && tls_type != GOT_NORMAL)
9081                 tls_type |= old_tls_type;
9082
9083               if (old_tls_type != tls_type)
9084                 {
9085                   if (h != NULL)
9086                     elf32_arm_hash_entry (h)->tls_type = tls_type;
9087                   else
9088                     elf32_arm_local_got_tls_type (abfd) [r_symndx] = tls_type;
9089                 }
9090             }
9091             /* Fall through.  */
9092
9093           case R_ARM_TLS_LDM32:
9094             if (r_type == R_ARM_TLS_LDM32)
9095                 htab->tls_ldm_got.refcount++;
9096             /* Fall through.  */
9097
9098           case R_ARM_GOTOFF32:
9099           case R_ARM_GOTPC:
9100             if (htab->sgot == NULL)
9101               {
9102                 if (htab->root.dynobj == NULL)
9103                   htab->root.dynobj = abfd;
9104                 if (!create_got_section (htab->root.dynobj, info))
9105                   return FALSE;
9106               }
9107             break;
9108
9109           case R_ARM_ABS12:
9110             /* VxWorks uses dynamic R_ARM_ABS12 relocations for
9111                ldr __GOTT_INDEX__ offsets.  */
9112             if (!htab->vxworks_p)
9113               break;
9114             /* Fall through.  */
9115
9116           case R_ARM_PC24:
9117           case R_ARM_PLT32:
9118           case R_ARM_CALL:
9119           case R_ARM_JUMP24:
9120           case R_ARM_PREL31:
9121           case R_ARM_THM_CALL:
9122           case R_ARM_THM_JUMP24:
9123           case R_ARM_THM_JUMP19:
9124             needs_plt = 1;
9125             goto normal_reloc;
9126
9127           case R_ARM_ABS32:
9128           case R_ARM_ABS32_NOI:
9129           case R_ARM_REL32:
9130           case R_ARM_REL32_NOI:
9131           case R_ARM_MOVW_ABS_NC:
9132           case R_ARM_MOVT_ABS:
9133           case R_ARM_MOVW_PREL_NC:
9134           case R_ARM_MOVT_PREL:
9135           case R_ARM_THM_MOVW_ABS_NC:
9136           case R_ARM_THM_MOVT_ABS:
9137           case R_ARM_THM_MOVW_PREL_NC:
9138           case R_ARM_THM_MOVT_PREL:
9139             needs_plt = 0;
9140           normal_reloc:
9141
9142             /* Should the interworking branches be listed here?  */
9143             if (h != NULL)
9144               {
9145                 /* If this reloc is in a read-only section, we might
9146                    need a copy reloc.  We can't check reliably at this
9147                    stage whether the section is read-only, as input
9148                    sections have not yet been mapped to output sections.
9149                    Tentatively set the flag for now, and correct in
9150                    adjust_dynamic_symbol.  */
9151                 if (!info->shared)
9152                   h->non_got_ref = 1;
9153
9154                 /* We may need a .plt entry if the function this reloc
9155                    refers to is in a different object.  We can't tell for
9156                    sure yet, because something later might force the
9157                    symbol local.  */
9158                 if (needs_plt)
9159                   h->needs_plt = 1;
9160
9161                 /* If we create a PLT entry, this relocation will reference
9162                    it, even if it's an ABS32 relocation.  */
9163                 h->plt.refcount += 1;
9164
9165                 /* It's too early to use htab->use_blx here, so we have to
9166                    record possible blx references separately from
9167                    relocs that definitely need a thumb stub.  */
9168
9169                 if (r_type == R_ARM_THM_CALL)
9170                   eh->plt_maybe_thumb_refcount += 1;
9171
9172                 if (r_type == R_ARM_THM_JUMP24
9173                     || r_type == R_ARM_THM_JUMP19)
9174                   eh->plt_thumb_refcount += 1;
9175               }
9176
9177             /* If we are creating a shared library or relocatable executable,
9178                and this is a reloc against a global symbol, or a non PC
9179                relative reloc against a local symbol, then we need to copy
9180                the reloc into the shared library.  However, if we are linking
9181                with -Bsymbolic, we do not need to copy a reloc against a
9182                global symbol which is defined in an object we are
9183                including in the link (i.e., DEF_REGULAR is set).  At
9184                this point we have not seen all the input files, so it is
9185                possible that DEF_REGULAR is not set now but will be set
9186                later (it is never cleared).  We account for that
9187                possibility below by storing information in the
9188                relocs_copied field of the hash table entry.  */
9189             if ((info->shared || htab->root.is_relocatable_executable)
9190                 && (sec->flags & SEC_ALLOC) != 0
9191                 && ((r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI)
9192                     || (h != NULL && ! h->needs_plt
9193                         && (! info->symbolic || ! h->def_regular))))
9194               {
9195                 struct elf32_arm_relocs_copied *p, **head;
9196
9197                 /* When creating a shared object, we must copy these
9198                    reloc types into the output file.  We create a reloc
9199                    section in dynobj and make room for this reloc.  */
9200                 if (sreloc == NULL)
9201                   {
9202                     const char * name;
9203
9204                     name = (bfd_elf_string_from_elf_section
9205                             (abfd,
9206                              elf_elfheader (abfd)->e_shstrndx,
9207                              elf_section_data (sec)->rel_hdr.sh_name));
9208                     if (name == NULL)
9209                       return FALSE;
9210
9211                     BFD_ASSERT (reloc_section_p (htab, name, sec));
9212
9213                     sreloc = bfd_get_section_by_name (dynobj, name);
9214                     if (sreloc == NULL)
9215                       {
9216                         flagword flags;
9217
9218                         flags = (SEC_HAS_CONTENTS | SEC_READONLY
9219                                  | SEC_IN_MEMORY | SEC_LINKER_CREATED);
9220                         if ((sec->flags & SEC_ALLOC) != 0
9221                             /* BPABI objects never have dynamic
9222                                relocations mapped.  */
9223                             && !htab->symbian_p)
9224                           flags |= SEC_ALLOC | SEC_LOAD;
9225                         sreloc = bfd_make_section_with_flags (dynobj,
9226                                                               name,
9227                                                               flags);
9228                         if (sreloc == NULL
9229                             || ! bfd_set_section_alignment (dynobj, sreloc, 2))
9230                           return FALSE;
9231                       }
9232
9233                     elf_section_data (sec)->sreloc = sreloc;
9234                   }
9235
9236                 /* If this is a global symbol, we count the number of
9237                    relocations we need for this symbol.  */
9238                 if (h != NULL)
9239                   {
9240                     head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied;
9241                   }
9242                 else
9243                   {
9244                     /* Track dynamic relocs needed for local syms too.
9245                        We really need local syms available to do this
9246                        easily.  Oh well.  */
9247
9248                     asection *s;
9249                     void *vpp;
9250
9251                     s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
9252                                                    sec, r_symndx);
9253                     if (s == NULL)
9254                       return FALSE;
9255
9256                     vpp = &elf_section_data (s)->local_dynrel;
9257                     head = (struct elf32_arm_relocs_copied **) vpp;
9258                   }
9259
9260                 p = *head;
9261                 if (p == NULL || p->section != sec)
9262                   {
9263                     bfd_size_type amt = sizeof *p;
9264
9265                     p = bfd_alloc (htab->root.dynobj, amt);
9266                     if (p == NULL)
9267                       return FALSE;
9268                     p->next = *head;
9269                     *head = p;
9270                     p->section = sec;
9271                     p->count = 0;
9272                     p->pc_count = 0;
9273                   }
9274
9275                 if (r_type == R_ARM_REL32 || r_type == R_ARM_REL32_NOI)
9276                   p->pc_count += 1;
9277                 p->count += 1;
9278               }
9279             break;
9280
9281         /* This relocation describes the C++ object vtable hierarchy.
9282            Reconstruct it for later use during GC.  */
9283         case R_ARM_GNU_VTINHERIT:
9284           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
9285             return FALSE;
9286           break;
9287
9288         /* This relocation describes which C++ vtable entries are actually
9289            used.  Record for later use during GC.  */
9290         case R_ARM_GNU_VTENTRY:
9291           BFD_ASSERT (h != NULL);
9292           if (h != NULL
9293               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
9294             return FALSE;
9295           break;
9296         }
9297     }
9298
9299   return TRUE;
9300 }
9301
9302 /* Unwinding tables are not referenced directly.  This pass marks them as
9303    required if the corresponding code section is marked.  */
9304
9305 static bfd_boolean
9306 elf32_arm_gc_mark_extra_sections (struct bfd_link_info *info,
9307                                   elf_gc_mark_hook_fn gc_mark_hook)
9308 {
9309   bfd *sub;
9310   Elf_Internal_Shdr **elf_shdrp;
9311   bfd_boolean again;
9312
9313   /* Marking EH data may cause additional code sections to be marked,
9314      requiring multiple passes.  */
9315   again = TRUE;
9316   while (again)
9317     {
9318       again = FALSE;
9319       for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
9320         {
9321           asection *o;
9322
9323           if (! is_arm_elf (sub))
9324             continue;
9325
9326           elf_shdrp = elf_elfsections (sub);
9327           for (o = sub->sections; o != NULL; o = o->next)
9328             {
9329               Elf_Internal_Shdr *hdr;
9330
9331               hdr = &elf_section_data (o)->this_hdr;
9332               if (hdr->sh_type == SHT_ARM_EXIDX
9333                   && hdr->sh_link
9334                   && hdr->sh_link < elf_numsections (sub)
9335                   && !o->gc_mark
9336                   && elf_shdrp[hdr->sh_link]->bfd_section->gc_mark)
9337                 {
9338                   again = TRUE;
9339                   if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
9340                     return FALSE;
9341                 }
9342             }
9343         }
9344     }
9345
9346   return TRUE;
9347 }
9348
9349 /* Treat mapping symbols as special target symbols.  */
9350
9351 static bfd_boolean
9352 elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
9353 {
9354   return bfd_is_arm_special_symbol_name (sym->name,
9355                                          BFD_ARM_SPECIAL_SYM_TYPE_ANY);
9356 }
9357
9358 /* This is a copy of elf_find_function() from elf.c except that
9359    ARM mapping symbols are ignored when looking for function names
9360    and STT_ARM_TFUNC is considered to a function type.  */
9361
9362 static bfd_boolean
9363 arm_elf_find_function (bfd *         abfd ATTRIBUTE_UNUSED,
9364                        asection *    section,
9365                        asymbol **    symbols,
9366                        bfd_vma       offset,
9367                        const char ** filename_ptr,
9368                        const char ** functionname_ptr)
9369 {
9370   const char * filename = NULL;
9371   asymbol * func = NULL;
9372   bfd_vma low_func = 0;
9373   asymbol ** p;
9374
9375   for (p = symbols; *p != NULL; p++)
9376     {
9377       elf_symbol_type *q;
9378
9379       q = (elf_symbol_type *) *p;
9380
9381       switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
9382         {
9383         default:
9384           break;
9385         case STT_FILE:
9386           filename = bfd_asymbol_name (&q->symbol);
9387           break;
9388         case STT_FUNC:
9389         case STT_ARM_TFUNC:
9390         case STT_NOTYPE:
9391           /* Skip mapping symbols.  */
9392           if ((q->symbol.flags & BSF_LOCAL)
9393               && bfd_is_arm_special_symbol_name (q->symbol.name,
9394                     BFD_ARM_SPECIAL_SYM_TYPE_ANY))
9395             continue;
9396           /* Fall through.  */
9397           if (bfd_get_section (&q->symbol) == section
9398               && q->symbol.value >= low_func
9399               && q->symbol.value <= offset)
9400             {
9401               func = (asymbol *) q;
9402               low_func = q->symbol.value;
9403             }
9404           break;
9405         }
9406     }
9407
9408   if (func == NULL)
9409     return FALSE;
9410
9411   if (filename_ptr)
9412     *filename_ptr = filename;
9413   if (functionname_ptr)
9414     *functionname_ptr = bfd_asymbol_name (func);
9415
9416   return TRUE;
9417 }
9418
9419
9420 /* Find the nearest line to a particular section and offset, for error
9421    reporting.   This code is a duplicate of the code in elf.c, except
9422    that it uses arm_elf_find_function.  */
9423
9424 static bfd_boolean
9425 elf32_arm_find_nearest_line (bfd *          abfd,
9426                              asection *     section,
9427                              asymbol **     symbols,
9428                              bfd_vma        offset,
9429                              const char **  filename_ptr,
9430                              const char **  functionname_ptr,
9431                              unsigned int * line_ptr)
9432 {
9433   bfd_boolean found = FALSE;
9434
9435   /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it.  */
9436
9437   if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
9438                                      filename_ptr, functionname_ptr,
9439                                      line_ptr, 0,
9440                                      & elf_tdata (abfd)->dwarf2_find_line_info))
9441     {
9442       if (!*functionname_ptr)
9443         arm_elf_find_function (abfd, section, symbols, offset,
9444                                *filename_ptr ? NULL : filename_ptr,
9445                                functionname_ptr);
9446
9447       return TRUE;
9448     }
9449
9450   if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
9451                                              & found, filename_ptr,
9452                                              functionname_ptr, line_ptr,
9453                                              & elf_tdata (abfd)->line_info))
9454     return FALSE;
9455
9456   if (found && (*functionname_ptr || *line_ptr))
9457     return TRUE;
9458
9459   if (symbols == NULL)
9460     return FALSE;
9461
9462   if (! arm_elf_find_function (abfd, section, symbols, offset,
9463                                filename_ptr, functionname_ptr))
9464     return FALSE;
9465
9466   *line_ptr = 0;
9467   return TRUE;
9468 }
9469
9470 static bfd_boolean
9471 elf32_arm_find_inliner_info (bfd *          abfd,
9472                              const char **  filename_ptr,
9473                              const char **  functionname_ptr,
9474                              unsigned int * line_ptr)
9475 {
9476   bfd_boolean found;
9477   found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
9478                                          functionname_ptr, line_ptr,
9479                                          & elf_tdata (abfd)->dwarf2_find_line_info);
9480   return found;
9481 }
9482
9483 /* Adjust a symbol defined by a dynamic object and referenced by a
9484    regular object.  The current definition is in some section of the
9485    dynamic object, but we're not including those sections.  We have to
9486    change the definition to something the rest of the link can
9487    understand.  */
9488
9489 static bfd_boolean
9490 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
9491                                  struct elf_link_hash_entry * h)
9492 {
9493   bfd * dynobj;
9494   asection * s;
9495   struct elf32_arm_link_hash_entry * eh;
9496   struct elf32_arm_link_hash_table *globals;
9497
9498   globals = elf32_arm_hash_table (info);
9499   dynobj = elf_hash_table (info)->dynobj;
9500
9501   /* Make sure we know what is going on here.  */
9502   BFD_ASSERT (dynobj != NULL
9503               && (h->needs_plt
9504                   || h->u.weakdef != NULL
9505                   || (h->def_dynamic
9506                       && h->ref_regular
9507                       && !h->def_regular)));
9508
9509   eh = (struct elf32_arm_link_hash_entry *) h;
9510
9511   /* If this is a function, put it in the procedure linkage table.  We
9512      will fill in the contents of the procedure linkage table later,
9513      when we know the address of the .got section.  */
9514   if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC
9515       || h->needs_plt)
9516     {
9517       if (h->plt.refcount <= 0
9518           || SYMBOL_CALLS_LOCAL (info, h)
9519           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
9520               && h->root.type == bfd_link_hash_undefweak))
9521         {
9522           /* This case can occur if we saw a PLT32 reloc in an input
9523              file, but the symbol was never referred to by a dynamic
9524              object, or if all references were garbage collected.  In
9525              such a case, we don't actually need to build a procedure
9526              linkage table, and we can just do a PC24 reloc instead.  */
9527           h->plt.offset = (bfd_vma) -1;
9528           eh->plt_thumb_refcount = 0;
9529           eh->plt_maybe_thumb_refcount = 0;
9530           h->needs_plt = 0;
9531         }
9532
9533       return TRUE;
9534     }
9535   else
9536     {
9537       /* It's possible that we incorrectly decided a .plt reloc was
9538          needed for an R_ARM_PC24 or similar reloc to a non-function sym
9539          in check_relocs.  We can't decide accurately between function
9540          and non-function syms in check-relocs; Objects loaded later in
9541          the link may change h->type.  So fix it now.  */
9542       h->plt.offset = (bfd_vma) -1;
9543       eh->plt_thumb_refcount = 0;
9544       eh->plt_maybe_thumb_refcount = 0;
9545     }
9546
9547   /* If this is a weak symbol, and there is a real definition, the
9548      processor independent code will have arranged for us to see the
9549      real definition first, and we can just use the same value.  */
9550   if (h->u.weakdef != NULL)
9551     {
9552       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
9553                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
9554       h->root.u.def.section = h->u.weakdef->root.u.def.section;
9555       h->root.u.def.value = h->u.weakdef->root.u.def.value;
9556       return TRUE;
9557     }
9558
9559   /* If there are no non-GOT references, we do not need a copy
9560      relocation.  */
9561   if (!h->non_got_ref)
9562     return TRUE;
9563
9564   /* This is a reference to a symbol defined by a dynamic object which
9565      is not a function.  */
9566
9567   /* If we are creating a shared library, we must presume that the
9568      only references to the symbol are via the global offset table.
9569      For such cases we need not do anything here; the relocations will
9570      be handled correctly by relocate_section.  Relocatable executables
9571      can reference data in shared objects directly, so we don't need to
9572      do anything here.  */
9573   if (info->shared || globals->root.is_relocatable_executable)
9574     return TRUE;
9575
9576   if (h->size == 0)
9577     {
9578       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
9579                              h->root.root.string);
9580       return TRUE;
9581     }
9582
9583   /* We must allocate the symbol in our .dynbss section, which will
9584      become part of the .bss section of the executable.  There will be
9585      an entry for this symbol in the .dynsym section.  The dynamic
9586      object will contain position independent code, so all references
9587      from the dynamic object to this symbol will go through the global
9588      offset table.  The dynamic linker will use the .dynsym entry to
9589      determine the address it must put in the global offset table, so
9590      both the dynamic object and the regular object will refer to the
9591      same memory location for the variable.  */
9592   s = bfd_get_section_by_name (dynobj, ".dynbss");
9593   BFD_ASSERT (s != NULL);
9594
9595   /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
9596      copy the initial value out of the dynamic object and into the
9597      runtime process image.  We need to remember the offset into the
9598      .rel(a).bss section we are going to use.  */
9599   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
9600     {
9601       asection *srel;
9602
9603       srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (globals, ".bss"));
9604       BFD_ASSERT (srel != NULL);
9605       srel->size += RELOC_SIZE (globals);
9606       h->needs_copy = 1;
9607     }
9608
9609   return _bfd_elf_adjust_dynamic_copy (h, s);
9610 }
9611
9612 /* Allocate space in .plt, .got and associated reloc sections for
9613    dynamic relocs.  */
9614
9615 static bfd_boolean
9616 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
9617 {
9618   struct bfd_link_info *info;
9619   struct elf32_arm_link_hash_table *htab;
9620   struct elf32_arm_link_hash_entry *eh;
9621   struct elf32_arm_relocs_copied *p;
9622   bfd_signed_vma thumb_refs;
9623
9624   eh = (struct elf32_arm_link_hash_entry *) h;
9625
9626   if (h->root.type == bfd_link_hash_indirect)
9627     return TRUE;
9628
9629   if (h->root.type == bfd_link_hash_warning)
9630     /* When warning symbols are created, they **replace** the "real"
9631        entry in the hash table, thus we never get to see the real
9632        symbol in a hash traversal.  So look at it now.  */
9633     h = (struct elf_link_hash_entry *) h->root.u.i.link;
9634
9635   info = (struct bfd_link_info *) inf;
9636   htab = elf32_arm_hash_table (info);
9637
9638   if (htab->root.dynamic_sections_created
9639       && h->plt.refcount > 0)
9640     {
9641       /* Make sure this symbol is output as a dynamic symbol.
9642          Undefined weak syms won't yet be marked as dynamic.  */
9643       if (h->dynindx == -1
9644           && !h->forced_local)
9645         {
9646           if (! bfd_elf_link_record_dynamic_symbol (info, h))
9647             return FALSE;
9648         }
9649
9650       if (info->shared
9651           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
9652         {
9653           asection *s = htab->splt;
9654
9655           /* If this is the first .plt entry, make room for the special
9656              first entry.  */
9657           if (s->size == 0)
9658             s->size += htab->plt_header_size;
9659
9660           h->plt.offset = s->size;
9661
9662           /* If we will insert a Thumb trampoline before this PLT, leave room
9663              for it.  */
9664           thumb_refs = eh->plt_thumb_refcount;
9665           if (!htab->use_blx)
9666             thumb_refs += eh->plt_maybe_thumb_refcount;
9667
9668           if (thumb_refs > 0)
9669             {
9670               h->plt.offset += PLT_THUMB_STUB_SIZE;
9671               s->size += PLT_THUMB_STUB_SIZE;
9672             }
9673
9674           /* If this symbol is not defined in a regular file, and we are
9675              not generating a shared library, then set the symbol to this
9676              location in the .plt.  This is required to make function
9677              pointers compare as equal between the normal executable and
9678              the shared library.  */
9679           if (! info->shared
9680               && !h->def_regular)
9681             {
9682               h->root.u.def.section = s;
9683               h->root.u.def.value = h->plt.offset;
9684
9685               /* Make sure the function is not marked as Thumb, in case
9686                  it is the target of an ABS32 relocation, which will
9687                  point to the PLT entry.  */
9688               if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
9689                 h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
9690             }
9691
9692           /* Make room for this entry.  */
9693           s->size += htab->plt_entry_size;
9694
9695           if (!htab->symbian_p)
9696             {
9697               /* We also need to make an entry in the .got.plt section, which
9698                  will be placed in the .got section by the linker script.  */
9699               eh->plt_got_offset = htab->sgotplt->size;
9700               htab->sgotplt->size += 4;
9701             }
9702
9703           /* We also need to make an entry in the .rel(a).plt section.  */
9704           htab->srelplt->size += RELOC_SIZE (htab);
9705
9706           /* VxWorks executables have a second set of relocations for
9707              each PLT entry.  They go in a separate relocation section,
9708              which is processed by the kernel loader.  */
9709           if (htab->vxworks_p && !info->shared)
9710             {
9711               /* There is a relocation for the initial PLT entry:
9712                  an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_.  */
9713               if (h->plt.offset == htab->plt_header_size)
9714                 htab->srelplt2->size += RELOC_SIZE (htab);
9715
9716               /* There are two extra relocations for each subsequent
9717                  PLT entry: an R_ARM_32 relocation for the GOT entry,
9718                  and an R_ARM_32 relocation for the PLT entry.  */
9719               htab->srelplt2->size += RELOC_SIZE (htab) * 2;
9720             }
9721         }
9722       else
9723         {
9724           h->plt.offset = (bfd_vma) -1;
9725           h->needs_plt = 0;
9726         }
9727     }
9728   else
9729     {
9730       h->plt.offset = (bfd_vma) -1;
9731       h->needs_plt = 0;
9732     }
9733
9734   if (h->got.refcount > 0)
9735     {
9736       asection *s;
9737       bfd_boolean dyn;
9738       int tls_type = elf32_arm_hash_entry (h)->tls_type;
9739       int indx;
9740
9741       /* Make sure this symbol is output as a dynamic symbol.
9742          Undefined weak syms won't yet be marked as dynamic.  */
9743       if (h->dynindx == -1
9744           && !h->forced_local)
9745         {
9746           if (! bfd_elf_link_record_dynamic_symbol (info, h))
9747             return FALSE;
9748         }
9749
9750       if (!htab->symbian_p)
9751         {
9752           s = htab->sgot;
9753           h->got.offset = s->size;
9754
9755           if (tls_type == GOT_UNKNOWN)
9756             abort ();
9757
9758           if (tls_type == GOT_NORMAL)
9759             /* Non-TLS symbols need one GOT slot.  */
9760             s->size += 4;
9761           else
9762             {
9763               if (tls_type & GOT_TLS_GD)
9764                 /* R_ARM_TLS_GD32 needs 2 consecutive GOT slots.  */
9765                 s->size += 8;
9766               if (tls_type & GOT_TLS_IE)
9767                 /* R_ARM_TLS_IE32 needs one GOT slot.  */
9768                 s->size += 4;
9769             }
9770
9771           dyn = htab->root.dynamic_sections_created;
9772
9773           indx = 0;
9774           if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
9775               && (!info->shared
9776                   || !SYMBOL_REFERENCES_LOCAL (info, h)))
9777             indx = h->dynindx;
9778
9779           if (tls_type != GOT_NORMAL
9780               && (info->shared || indx != 0)
9781               && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9782                   || h->root.type != bfd_link_hash_undefweak))
9783             {
9784               if (tls_type & GOT_TLS_IE)
9785                 htab->srelgot->size += RELOC_SIZE (htab);
9786
9787               if (tls_type & GOT_TLS_GD)
9788                 htab->srelgot->size += RELOC_SIZE (htab);
9789
9790               if ((tls_type & GOT_TLS_GD) && indx != 0)
9791                 htab->srelgot->size += RELOC_SIZE (htab);
9792             }
9793           else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9794                     || h->root.type != bfd_link_hash_undefweak)
9795                    && (info->shared
9796                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
9797             htab->srelgot->size += RELOC_SIZE (htab);
9798         }
9799     }
9800   else
9801     h->got.offset = (bfd_vma) -1;
9802
9803   /* Allocate stubs for exported Thumb functions on v4t.  */
9804   if (!htab->use_blx && h->dynindx != -1
9805       && h->def_regular
9806       && ELF_ST_TYPE (h->type) == STT_ARM_TFUNC
9807       && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9808     {
9809       struct elf_link_hash_entry * th;
9810       struct bfd_link_hash_entry * bh;
9811       struct elf_link_hash_entry * myh;
9812       char name[1024];
9813       asection *s;
9814       bh = NULL;
9815       /* Create a new symbol to regist the real location of the function.  */
9816       s = h->root.u.def.section;
9817       sprintf (name, "__real_%s", h->root.root.string);
9818       _bfd_generic_link_add_one_symbol (info, s->owner,
9819                                         name, BSF_GLOBAL, s,
9820                                         h->root.u.def.value,
9821                                         NULL, TRUE, FALSE, &bh);
9822
9823       myh = (struct elf_link_hash_entry *) bh;
9824       myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
9825       myh->forced_local = 1;
9826       eh->export_glue = myh;
9827       th = record_arm_to_thumb_glue (info, h);
9828       /* Point the symbol at the stub.  */
9829       h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
9830       h->root.u.def.section = th->root.u.def.section;
9831       h->root.u.def.value = th->root.u.def.value & ~1;
9832     }
9833
9834   if (eh->relocs_copied == NULL)
9835     return TRUE;
9836
9837   /* In the shared -Bsymbolic case, discard space allocated for
9838      dynamic pc-relative relocs against symbols which turn out to be
9839      defined in regular objects.  For the normal shared case, discard
9840      space for pc-relative relocs that have become local due to symbol
9841      visibility changes.  */
9842
9843   if (info->shared || htab->root.is_relocatable_executable)
9844     {
9845       /* The only relocs that use pc_count are R_ARM_REL32 and
9846          R_ARM_REL32_NOI, which will appear on something like
9847          ".long foo - .".  We want calls to protected symbols to resolve
9848          directly to the function rather than going via the plt.  If people
9849          want function pointer comparisons to work as expected then they
9850          should avoid writing assembly like ".long foo - .".  */
9851       if (SYMBOL_CALLS_LOCAL (info, h))
9852         {
9853           struct elf32_arm_relocs_copied **pp;
9854
9855           for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
9856             {
9857               p->count -= p->pc_count;
9858               p->pc_count = 0;
9859               if (p->count == 0)
9860                 *pp = p->next;
9861               else
9862                 pp = &p->next;
9863             }
9864         }
9865
9866       if (elf32_arm_hash_table (info)->vxworks_p)
9867         {
9868           struct elf32_arm_relocs_copied **pp;
9869
9870           for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
9871             {
9872               if (strcmp (p->section->output_section->name, ".tls_vars") == 0)
9873                 *pp = p->next;
9874               else
9875                 pp = &p->next;
9876             }
9877         }
9878
9879       /* Also discard relocs on undefined weak syms with non-default
9880          visibility.  */
9881       if (eh->relocs_copied != NULL
9882           && h->root.type == bfd_link_hash_undefweak)
9883         {
9884           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9885             eh->relocs_copied = NULL;
9886
9887           /* Make sure undefined weak symbols are output as a dynamic
9888              symbol in PIEs.  */
9889           else if (h->dynindx == -1
9890                    && !h->forced_local)
9891             {
9892               if (! bfd_elf_link_record_dynamic_symbol (info, h))
9893                 return FALSE;
9894             }
9895         }
9896
9897       else if (htab->root.is_relocatable_executable && h->dynindx == -1
9898                && h->root.type == bfd_link_hash_new)
9899         {
9900           /* Output absolute symbols so that we can create relocations
9901              against them.  For normal symbols we output a relocation
9902              against the section that contains them.  */
9903           if (! bfd_elf_link_record_dynamic_symbol (info, h))
9904             return FALSE;
9905         }
9906
9907     }
9908   else
9909     {
9910       /* For the non-shared case, discard space for relocs against
9911          symbols which turn out to need copy relocs or are not
9912          dynamic.  */
9913
9914       if (!h->non_got_ref
9915           && ((h->def_dynamic
9916                && !h->def_regular)
9917               || (htab->root.dynamic_sections_created
9918                   && (h->root.type == bfd_link_hash_undefweak
9919                       || h->root.type == bfd_link_hash_undefined))))
9920         {
9921           /* Make sure this symbol is output as a dynamic symbol.
9922              Undefined weak syms won't yet be marked as dynamic.  */
9923           if (h->dynindx == -1
9924               && !h->forced_local)
9925             {
9926               if (! bfd_elf_link_record_dynamic_symbol (info, h))
9927                 return FALSE;
9928             }
9929
9930           /* If that succeeded, we know we'll be keeping all the
9931              relocs.  */
9932           if (h->dynindx != -1)
9933             goto keep;
9934         }
9935
9936       eh->relocs_copied = NULL;
9937
9938     keep: ;
9939     }
9940
9941   /* Finally, allocate space.  */
9942   for (p = eh->relocs_copied; p != NULL; p = p->next)
9943     {
9944       asection *sreloc = elf_section_data (p->section)->sreloc;
9945       sreloc->size += p->count * RELOC_SIZE (htab);
9946     }
9947
9948   return TRUE;
9949 }
9950
9951 /* Find any dynamic relocs that apply to read-only sections.  */
9952
9953 static bfd_boolean
9954 elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry * h, void * inf)
9955 {
9956   struct elf32_arm_link_hash_entry * eh;
9957   struct elf32_arm_relocs_copied * p;
9958
9959   if (h->root.type == bfd_link_hash_warning)
9960     h = (struct elf_link_hash_entry *) h->root.u.i.link;
9961
9962   eh = (struct elf32_arm_link_hash_entry *) h;
9963   for (p = eh->relocs_copied; p != NULL; p = p->next)
9964     {
9965       asection *s = p->section;
9966
9967       if (s != NULL && (s->flags & SEC_READONLY) != 0)
9968         {
9969           struct bfd_link_info *info = (struct bfd_link_info *) inf;
9970
9971           info->flags |= DF_TEXTREL;
9972
9973           /* Not an error, just cut short the traversal.  */
9974           return FALSE;
9975         }
9976     }
9977   return TRUE;
9978 }
9979
9980 void
9981 bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *info,
9982                                  int byteswap_code)
9983 {
9984   struct elf32_arm_link_hash_table *globals;
9985
9986   globals = elf32_arm_hash_table (info);
9987   globals->byteswap_code = byteswap_code;
9988 }
9989
9990 /* Set the sizes of the dynamic sections.  */
9991
9992 static bfd_boolean
9993 elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
9994                                  struct bfd_link_info * info)
9995 {
9996   bfd * dynobj;
9997   asection * s;
9998   bfd_boolean plt;
9999   bfd_boolean relocs;
10000   bfd *ibfd;
10001   struct elf32_arm_link_hash_table *htab;
10002
10003   htab = elf32_arm_hash_table (info);
10004   dynobj = elf_hash_table (info)->dynobj;
10005   BFD_ASSERT (dynobj != NULL);
10006   check_use_blx (htab);
10007
10008   if (elf_hash_table (info)->dynamic_sections_created)
10009     {
10010       /* Set the contents of the .interp section to the interpreter.  */
10011       if (info->executable)
10012         {
10013           s = bfd_get_section_by_name (dynobj, ".interp");
10014           BFD_ASSERT (s != NULL);
10015           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
10016           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
10017         }
10018     }
10019
10020   /* Set up .got offsets for local syms, and space for local dynamic
10021      relocs.  */
10022   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10023     {
10024       bfd_signed_vma *local_got;
10025       bfd_signed_vma *end_local_got;
10026       char *local_tls_type;
10027       bfd_size_type locsymcount;
10028       Elf_Internal_Shdr *symtab_hdr;
10029       asection *srel;
10030       bfd_boolean is_vxworks = elf32_arm_hash_table (info)->vxworks_p;
10031
10032       if (! is_arm_elf (ibfd))
10033         continue;
10034
10035       for (s = ibfd->sections; s != NULL; s = s->next)
10036         {
10037           struct elf32_arm_relocs_copied *p;
10038
10039           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
10040             {
10041               if (!bfd_is_abs_section (p->section)
10042                   && bfd_is_abs_section (p->section->output_section))
10043                 {
10044                   /* Input section has been discarded, either because
10045                      it is a copy of a linkonce section or due to
10046                      linker script /DISCARD/, so we'll be discarding
10047                      the relocs too.  */
10048                 }
10049               else if (is_vxworks
10050                        && strcmp (p->section->output_section->name,
10051                                   ".tls_vars") == 0)
10052                 {
10053                   /* Relocations in vxworks .tls_vars sections are
10054                      handled specially by the loader.  */
10055                 }
10056               else if (p->count != 0)
10057                 {
10058                   srel = elf_section_data (p->section)->sreloc;
10059                   srel->size += p->count * RELOC_SIZE (htab);
10060                   if ((p->section->output_section->flags & SEC_READONLY) != 0)
10061                     info->flags |= DF_TEXTREL;
10062                 }
10063             }
10064         }
10065
10066       local_got = elf_local_got_refcounts (ibfd);
10067       if (!local_got)
10068         continue;
10069
10070       symtab_hdr = & elf_symtab_hdr (ibfd);
10071       locsymcount = symtab_hdr->sh_info;
10072       end_local_got = local_got + locsymcount;
10073       local_tls_type = elf32_arm_local_got_tls_type (ibfd);
10074       s = htab->sgot;
10075       srel = htab->srelgot;
10076       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
10077         {
10078           if (*local_got > 0)
10079             {
10080               *local_got = s->size;
10081               if (*local_tls_type & GOT_TLS_GD)
10082                 /* TLS_GD relocs need an 8-byte structure in the GOT.  */
10083                 s->size += 8;
10084               if (*local_tls_type & GOT_TLS_IE)
10085                 s->size += 4;
10086               if (*local_tls_type == GOT_NORMAL)
10087                 s->size += 4;
10088
10089               if (info->shared || *local_tls_type == GOT_TLS_GD)
10090                 srel->size += RELOC_SIZE (htab);
10091             }
10092           else
10093             *local_got = (bfd_vma) -1;
10094         }
10095     }
10096
10097   if (htab->tls_ldm_got.refcount > 0)
10098     {
10099       /* Allocate two GOT entries and one dynamic relocation (if necessary)
10100          for R_ARM_TLS_LDM32 relocations.  */
10101       htab->tls_ldm_got.offset = htab->sgot->size;
10102       htab->sgot->size += 8;
10103       if (info->shared)
10104         htab->srelgot->size += RELOC_SIZE (htab);
10105     }
10106   else
10107     htab->tls_ldm_got.offset = -1;
10108
10109   /* Allocate global sym .plt and .got entries, and space for global
10110      sym dynamic relocs.  */
10111   elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
10112
10113   /* Here we rummage through the found bfds to collect glue information.  */
10114   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10115     {
10116       if (! is_arm_elf (ibfd))
10117         continue;
10118
10119       /* Initialise mapping tables for code/data.  */
10120       bfd_elf32_arm_init_maps (ibfd);
10121
10122       if (!bfd_elf32_arm_process_before_allocation (ibfd, info)
10123           || !bfd_elf32_arm_vfp11_erratum_scan (ibfd, info))
10124         /* xgettext:c-format */
10125         _bfd_error_handler (_("Errors encountered processing file %s"),
10126                             ibfd->filename);
10127     }
10128
10129   /* The check_relocs and adjust_dynamic_symbol entry points have
10130      determined the sizes of the various dynamic sections.  Allocate
10131      memory for them.  */
10132   plt = FALSE;
10133   relocs = FALSE;
10134   for (s = dynobj->sections; s != NULL; s = s->next)
10135     {
10136       const char * name;
10137
10138       if ((s->flags & SEC_LINKER_CREATED) == 0)
10139         continue;
10140
10141       /* It's OK to base decisions on the section name, because none
10142          of the dynobj section names depend upon the input files.  */
10143       name = bfd_get_section_name (dynobj, s);
10144
10145       if (strcmp (name, ".plt") == 0)
10146         {
10147           /* Remember whether there is a PLT.  */
10148           plt = s->size != 0;
10149         }
10150       else if (CONST_STRNEQ (name, ".rel"))
10151         {
10152           if (s->size != 0)
10153             {
10154               /* Remember whether there are any reloc sections other
10155                  than .rel(a).plt and .rela.plt.unloaded.  */
10156               if (s != htab->srelplt && s != htab->srelplt2)
10157                 relocs = TRUE;
10158
10159               /* We use the reloc_count field as a counter if we need
10160                  to copy relocs into the output file.  */
10161               s->reloc_count = 0;
10162             }
10163         }
10164       else if (! CONST_STRNEQ (name, ".got")
10165                && strcmp (name, ".dynbss") != 0)
10166         {
10167           /* It's not one of our sections, so don't allocate space.  */
10168           continue;
10169         }
10170
10171       if (s->size == 0)
10172         {
10173           /* If we don't need this section, strip it from the
10174              output file.  This is mostly to handle .rel(a).bss and
10175              .rel(a).plt.  We must create both sections in
10176              create_dynamic_sections, because they must be created
10177              before the linker maps input sections to output
10178              sections.  The linker does that before
10179              adjust_dynamic_symbol is called, and it is that
10180              function which decides whether anything needs to go
10181              into these sections.  */
10182           s->flags |= SEC_EXCLUDE;
10183           continue;
10184         }
10185
10186       if ((s->flags & SEC_HAS_CONTENTS) == 0)
10187         continue;
10188
10189       /* Allocate memory for the section contents.  */
10190       s->contents = bfd_zalloc (dynobj, s->size);
10191       if (s->contents == NULL)
10192         return FALSE;
10193     }
10194
10195   if (elf_hash_table (info)->dynamic_sections_created)
10196     {
10197       /* Add some entries to the .dynamic section.  We fill in the
10198          values later, in elf32_arm_finish_dynamic_sections, but we
10199          must add the entries now so that we get the correct size for
10200          the .dynamic section.  The DT_DEBUG entry is filled in by the
10201          dynamic linker and used by the debugger.  */
10202 #define add_dynamic_entry(TAG, VAL) \
10203   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
10204
10205      if (info->executable)
10206         {
10207           if (!add_dynamic_entry (DT_DEBUG, 0))
10208             return FALSE;
10209         }
10210
10211       if (plt)
10212         {
10213           if (   !add_dynamic_entry (DT_PLTGOT, 0)
10214               || !add_dynamic_entry (DT_PLTRELSZ, 0)
10215               || !add_dynamic_entry (DT_PLTREL,
10216                                      htab->use_rel ? DT_REL : DT_RELA)
10217               || !add_dynamic_entry (DT_JMPREL, 0))
10218             return FALSE;
10219         }
10220
10221       if (relocs)
10222         {
10223           if (htab->use_rel)
10224             {
10225               if (!add_dynamic_entry (DT_REL, 0)
10226                   || !add_dynamic_entry (DT_RELSZ, 0)
10227                   || !add_dynamic_entry (DT_RELENT, RELOC_SIZE (htab)))
10228                 return FALSE;
10229             }
10230           else
10231             {
10232               if (!add_dynamic_entry (DT_RELA, 0)
10233                   || !add_dynamic_entry (DT_RELASZ, 0)
10234                   || !add_dynamic_entry (DT_RELAENT, RELOC_SIZE (htab)))
10235                 return FALSE;
10236             }
10237         }
10238
10239       /* If any dynamic relocs apply to a read-only section,
10240          then we need a DT_TEXTREL entry.  */
10241       if ((info->flags & DF_TEXTREL) == 0)
10242         elf_link_hash_traverse (& htab->root, elf32_arm_readonly_dynrelocs,
10243                                 info);
10244
10245       if ((info->flags & DF_TEXTREL) != 0)
10246         {
10247           if (!add_dynamic_entry (DT_TEXTREL, 0))
10248             return FALSE;
10249         }
10250       if (htab->vxworks_p
10251           && !elf_vxworks_add_dynamic_entries (output_bfd, info))
10252         return FALSE;
10253     }
10254 #undef add_dynamic_entry
10255
10256   return TRUE;
10257 }
10258
10259 /* Finish up dynamic symbol handling.  We set the contents of various
10260    dynamic sections here.  */
10261
10262 static bfd_boolean
10263 elf32_arm_finish_dynamic_symbol (bfd * output_bfd,
10264                                  struct bfd_link_info * info,
10265                                  struct elf_link_hash_entry * h,
10266                                  Elf_Internal_Sym * sym)
10267 {
10268   bfd * dynobj;
10269   struct elf32_arm_link_hash_table *htab;
10270   struct elf32_arm_link_hash_entry *eh;
10271
10272   dynobj = elf_hash_table (info)->dynobj;
10273   htab = elf32_arm_hash_table (info);
10274   eh = (struct elf32_arm_link_hash_entry *) h;
10275
10276   if (h->plt.offset != (bfd_vma) -1)
10277     {
10278       asection * splt;
10279       asection * srel;
10280       bfd_byte *loc;
10281       bfd_vma plt_index;
10282       Elf_Internal_Rela rel;
10283
10284       /* This symbol has an entry in the procedure linkage table.  Set
10285          it up.  */
10286
10287       BFD_ASSERT (h->dynindx != -1);
10288
10289       splt = bfd_get_section_by_name (dynobj, ".plt");
10290       srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (htab, ".plt"));
10291       BFD_ASSERT (splt != NULL && srel != NULL);
10292
10293       /* Fill in the entry in the procedure linkage table.  */
10294       if (htab->symbian_p)
10295         {
10296           put_arm_insn (htab, output_bfd,
10297                       elf32_arm_symbian_plt_entry[0],
10298                       splt->contents + h->plt.offset);
10299           bfd_put_32 (output_bfd,
10300                       elf32_arm_symbian_plt_entry[1],
10301                       splt->contents + h->plt.offset + 4);
10302
10303           /* Fill in the entry in the .rel.plt section.  */
10304           rel.r_offset = (splt->output_section->vma
10305                           + splt->output_offset
10306                           + h->plt.offset + 4);
10307           rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
10308
10309           /* Get the index in the procedure linkage table which
10310              corresponds to this symbol.  This is the index of this symbol
10311              in all the symbols for which we are making plt entries.  The
10312              first entry in the procedure linkage table is reserved.  */
10313           plt_index = ((h->plt.offset - htab->plt_header_size)
10314                        / htab->plt_entry_size);
10315         }
10316       else
10317         {
10318           bfd_vma got_offset, got_address, plt_address;
10319           bfd_vma got_displacement;
10320           asection * sgot;
10321           bfd_byte * ptr;
10322
10323           sgot = bfd_get_section_by_name (dynobj, ".got.plt");
10324           BFD_ASSERT (sgot != NULL);
10325
10326           /* Get the offset into the .got.plt table of the entry that
10327              corresponds to this function.  */
10328           got_offset = eh->plt_got_offset;
10329
10330           /* Get the index in the procedure linkage table which
10331              corresponds to this symbol.  This is the index of this symbol
10332              in all the symbols for which we are making plt entries.  The
10333              first three entries in .got.plt are reserved; after that
10334              symbols appear in the same order as in .plt.  */
10335           plt_index = (got_offset - 12) / 4;
10336
10337           /* Calculate the address of the GOT entry.  */
10338           got_address = (sgot->output_section->vma
10339                          + sgot->output_offset
10340                          + got_offset);
10341
10342           /* ...and the address of the PLT entry.  */
10343           plt_address = (splt->output_section->vma
10344                          + splt->output_offset
10345                          + h->plt.offset);
10346
10347           ptr = htab->splt->contents + h->plt.offset;
10348           if (htab->vxworks_p && info->shared)
10349             {
10350               unsigned int i;
10351               bfd_vma val;
10352
10353               for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
10354                 {
10355                   val = elf32_arm_vxworks_shared_plt_entry[i];
10356                   if (i == 2)
10357                     val |= got_address - sgot->output_section->vma;
10358                   if (i == 5)
10359                     val |= plt_index * RELOC_SIZE (htab);
10360                   if (i == 2 || i == 5)
10361                     bfd_put_32 (output_bfd, val, ptr);
10362                   else
10363                     put_arm_insn (htab, output_bfd, val, ptr);
10364                 }
10365             }
10366           else if (htab->vxworks_p)
10367             {
10368               unsigned int i;
10369               bfd_vma val;
10370
10371               for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
10372                 {
10373                   val = elf32_arm_vxworks_exec_plt_entry[i];
10374                   if (i == 2)
10375                     val |= got_address;
10376                   if (i == 4)
10377                     val |= 0xffffff & -((h->plt.offset + i * 4 + 8) >> 2);
10378                   if (i == 5)
10379                     val |= plt_index * RELOC_SIZE (htab);
10380                   if (i == 2 || i == 5)
10381                     bfd_put_32 (output_bfd, val, ptr);
10382                   else
10383                     put_arm_insn (htab, output_bfd, val, ptr);
10384                 }
10385
10386               loc = (htab->srelplt2->contents
10387                      + (plt_index * 2 + 1) * RELOC_SIZE (htab));
10388
10389               /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
10390                  referencing the GOT for this PLT entry.  */
10391               rel.r_offset = plt_address + 8;
10392               rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
10393               rel.r_addend = got_offset;
10394               SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10395               loc += RELOC_SIZE (htab);
10396
10397               /* Create the R_ARM_ABS32 relocation referencing the
10398                  beginning of the PLT for this GOT entry.  */
10399               rel.r_offset = got_address;
10400               rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
10401               rel.r_addend = 0;
10402               SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10403             }
10404           else
10405             {
10406               bfd_signed_vma thumb_refs;
10407               /* Calculate the displacement between the PLT slot and the
10408                  entry in the GOT.  The eight-byte offset accounts for the
10409                  value produced by adding to pc in the first instruction
10410                  of the PLT stub.  */
10411               got_displacement = got_address - (plt_address + 8);
10412
10413               BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
10414
10415               thumb_refs = eh->plt_thumb_refcount;
10416               if (!htab->use_blx)
10417                 thumb_refs += eh->plt_maybe_thumb_refcount;
10418
10419               if (thumb_refs > 0)
10420                 {
10421                   put_thumb_insn (htab, output_bfd,
10422                                   elf32_arm_plt_thumb_stub[0], ptr - 4);
10423                   put_thumb_insn (htab, output_bfd,
10424                                   elf32_arm_plt_thumb_stub[1], ptr - 2);
10425                 }
10426
10427               put_arm_insn (htab, output_bfd,
10428                             elf32_arm_plt_entry[0]
10429                             | ((got_displacement & 0x0ff00000) >> 20),
10430                             ptr + 0);
10431               put_arm_insn (htab, output_bfd,
10432                             elf32_arm_plt_entry[1]
10433                             | ((got_displacement & 0x000ff000) >> 12),
10434                             ptr+ 4);
10435               put_arm_insn (htab, output_bfd,
10436                             elf32_arm_plt_entry[2]
10437                             | (got_displacement & 0x00000fff),
10438                             ptr + 8);
10439 #ifdef FOUR_WORD_PLT
10440               bfd_put_32 (output_bfd, elf32_arm_plt_entry[3], ptr + 12);
10441 #endif
10442             }
10443
10444           /* Fill in the entry in the global offset table.  */
10445           bfd_put_32 (output_bfd,
10446                       (splt->output_section->vma
10447                        + splt->output_offset),
10448                       sgot->contents + got_offset);
10449
10450           /* Fill in the entry in the .rel(a).plt section.  */
10451           rel.r_addend = 0;
10452           rel.r_offset = got_address;
10453           rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_JUMP_SLOT);
10454         }
10455
10456       loc = srel->contents + plt_index * RELOC_SIZE (htab);
10457       SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10458
10459       if (!h->def_regular)
10460         {
10461           /* Mark the symbol as undefined, rather than as defined in
10462              the .plt section.  Leave the value alone.  */
10463           sym->st_shndx = SHN_UNDEF;
10464           /* If the symbol is weak, we do need to clear the value.
10465              Otherwise, the PLT entry would provide a definition for
10466              the symbol even if the symbol wasn't defined anywhere,
10467              and so the symbol would never be NULL.  */
10468           if (!h->ref_regular_nonweak)
10469             sym->st_value = 0;
10470         }
10471     }
10472
10473   if (h->got.offset != (bfd_vma) -1
10474       && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
10475       && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
10476     {
10477       asection * sgot;
10478       asection * srel;
10479       Elf_Internal_Rela rel;
10480       bfd_byte *loc;
10481       bfd_vma offset;
10482
10483       /* This symbol has an entry in the global offset table.  Set it
10484          up.  */
10485       sgot = bfd_get_section_by_name (dynobj, ".got");
10486       srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (htab, ".got"));
10487       BFD_ASSERT (sgot != NULL && srel != NULL);
10488
10489       offset = (h->got.offset & ~(bfd_vma) 1);
10490       rel.r_addend = 0;
10491       rel.r_offset = (sgot->output_section->vma
10492                       + sgot->output_offset
10493                       + offset);
10494
10495       /* If this is a static link, or it is a -Bsymbolic link and the
10496          symbol is defined locally or was forced to be local because
10497          of a version file, we just want to emit a RELATIVE reloc.
10498          The entry in the global offset table will already have been
10499          initialized in the relocate_section function.  */
10500       if (info->shared
10501           && SYMBOL_REFERENCES_LOCAL (info, h))
10502         {
10503           BFD_ASSERT ((h->got.offset & 1) != 0);
10504           rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
10505           if (!htab->use_rel)
10506             {
10507               rel.r_addend = bfd_get_32 (output_bfd, sgot->contents + offset);
10508               bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
10509             }
10510         }
10511       else
10512         {
10513           BFD_ASSERT ((h->got.offset & 1) == 0);
10514           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
10515           rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
10516         }
10517
10518       loc = srel->contents + srel->reloc_count++ * RELOC_SIZE (htab);
10519       SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10520     }
10521
10522   if (h->needs_copy)
10523     {
10524       asection * s;
10525       Elf_Internal_Rela rel;
10526       bfd_byte *loc;
10527
10528       /* This symbol needs a copy reloc.  Set it up.  */
10529       BFD_ASSERT (h->dynindx != -1
10530                   && (h->root.type == bfd_link_hash_defined
10531                       || h->root.type == bfd_link_hash_defweak));
10532
10533       s = bfd_get_section_by_name (h->root.u.def.section->owner,
10534                                    RELOC_SECTION (htab, ".bss"));
10535       BFD_ASSERT (s != NULL);
10536
10537       rel.r_addend = 0;
10538       rel.r_offset = (h->root.u.def.value
10539                       + h->root.u.def.section->output_section->vma
10540                       + h->root.u.def.section->output_offset);
10541       rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
10542       loc = s->contents + s->reloc_count++ * RELOC_SIZE (htab);
10543       SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
10544     }
10545
10546   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  On VxWorks,
10547      the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it is relative
10548      to the ".got" section.  */
10549   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
10550       || (!htab->vxworks_p && h == htab->root.hgot))
10551     sym->st_shndx = SHN_ABS;
10552
10553   return TRUE;
10554 }
10555
10556 /* Finish up the dynamic sections.  */
10557
10558 static bfd_boolean
10559 elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
10560 {
10561   bfd * dynobj;
10562   asection * sgot;
10563   asection * sdyn;
10564
10565   dynobj = elf_hash_table (info)->dynobj;
10566
10567   sgot = bfd_get_section_by_name (dynobj, ".got.plt");
10568   BFD_ASSERT (elf32_arm_hash_table (info)->symbian_p || sgot != NULL);
10569   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
10570
10571   if (elf_hash_table (info)->dynamic_sections_created)
10572     {
10573       asection *splt;
10574       Elf32_External_Dyn *dyncon, *dynconend;
10575       struct elf32_arm_link_hash_table *htab;
10576
10577       htab = elf32_arm_hash_table (info);
10578       splt = bfd_get_section_by_name (dynobj, ".plt");
10579       BFD_ASSERT (splt != NULL && sdyn != NULL);
10580
10581       dyncon = (Elf32_External_Dyn *) sdyn->contents;
10582       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
10583
10584       for (; dyncon < dynconend; dyncon++)
10585         {
10586           Elf_Internal_Dyn dyn;
10587           const char * name;
10588           asection * s;
10589
10590           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
10591
10592           switch (dyn.d_tag)
10593             {
10594               unsigned int type;
10595
10596             default:
10597               if (htab->vxworks_p
10598                   && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
10599                 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10600               break;
10601
10602             case DT_HASH:
10603               name = ".hash";
10604               goto get_vma_if_bpabi;
10605             case DT_STRTAB:
10606               name = ".dynstr";
10607               goto get_vma_if_bpabi;
10608             case DT_SYMTAB:
10609               name = ".dynsym";
10610               goto get_vma_if_bpabi;
10611             case DT_VERSYM:
10612               name = ".gnu.version";
10613               goto get_vma_if_bpabi;
10614             case DT_VERDEF:
10615               name = ".gnu.version_d";
10616               goto get_vma_if_bpabi;
10617             case DT_VERNEED:
10618               name = ".gnu.version_r";
10619               goto get_vma_if_bpabi;
10620
10621             case DT_PLTGOT:
10622               name = ".got";
10623               goto get_vma;
10624             case DT_JMPREL:
10625               name = RELOC_SECTION (htab, ".plt");
10626             get_vma:
10627               s = bfd_get_section_by_name (output_bfd, name);
10628               BFD_ASSERT (s != NULL);
10629               if (!htab->symbian_p)
10630                 dyn.d_un.d_ptr = s->vma;
10631               else
10632                 /* In the BPABI, tags in the PT_DYNAMIC section point
10633                    at the file offset, not the memory address, for the
10634                    convenience of the post linker.  */
10635                 dyn.d_un.d_ptr = s->filepos;
10636               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10637               break;
10638
10639             get_vma_if_bpabi:
10640               if (htab->symbian_p)
10641                 goto get_vma;
10642               break;
10643
10644             case DT_PLTRELSZ:
10645               s = bfd_get_section_by_name (output_bfd,
10646                                            RELOC_SECTION (htab, ".plt"));
10647               BFD_ASSERT (s != NULL);
10648               dyn.d_un.d_val = s->size;
10649               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10650               break;
10651
10652             case DT_RELSZ:
10653             case DT_RELASZ:
10654               if (!htab->symbian_p)
10655                 {
10656                   /* My reading of the SVR4 ABI indicates that the
10657                      procedure linkage table relocs (DT_JMPREL) should be
10658                      included in the overall relocs (DT_REL).  This is
10659                      what Solaris does.  However, UnixWare can not handle
10660                      that case.  Therefore, we override the DT_RELSZ entry
10661                      here to make it not include the JMPREL relocs.  Since
10662                      the linker script arranges for .rel(a).plt to follow all
10663                      other relocation sections, we don't have to worry
10664                      about changing the DT_REL entry.  */
10665                   s = bfd_get_section_by_name (output_bfd,
10666                                                RELOC_SECTION (htab, ".plt"));
10667                   if (s != NULL)
10668                     dyn.d_un.d_val -= s->size;
10669                   bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10670                   break;
10671                 }
10672               /* Fall through.  */
10673
10674             case DT_REL:
10675             case DT_RELA:
10676               /* In the BPABI, the DT_REL tag must point at the file
10677                  offset, not the VMA, of the first relocation
10678                  section.  So, we use code similar to that in
10679                  elflink.c, but do not check for SHF_ALLOC on the
10680                  relcoation section, since relocations sections are
10681                  never allocated under the BPABI.  The comments above
10682                  about Unixware notwithstanding, we include all of the
10683                  relocations here.  */
10684               if (htab->symbian_p)
10685                 {
10686                   unsigned int i;
10687                   type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
10688                           ? SHT_REL : SHT_RELA);
10689                   dyn.d_un.d_val = 0;
10690                   for (i = 1; i < elf_numsections (output_bfd); i++)
10691                     {
10692                       Elf_Internal_Shdr *hdr
10693                         = elf_elfsections (output_bfd)[i];
10694                       if (hdr->sh_type == type)
10695                         {
10696                           if (dyn.d_tag == DT_RELSZ
10697                               || dyn.d_tag == DT_RELASZ)
10698                             dyn.d_un.d_val += hdr->sh_size;
10699                           else if ((ufile_ptr) hdr->sh_offset
10700                                    <= dyn.d_un.d_val - 1)
10701                             dyn.d_un.d_val = hdr->sh_offset;
10702                         }
10703                     }
10704                   bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10705                 }
10706               break;
10707
10708               /* Set the bottom bit of DT_INIT/FINI if the
10709                  corresponding function is Thumb.  */
10710             case DT_INIT:
10711               name = info->init_function;
10712               goto get_sym;
10713             case DT_FINI:
10714               name = info->fini_function;
10715             get_sym:
10716               /* If it wasn't set by elf_bfd_final_link
10717                  then there is nothing to adjust.  */
10718               if (dyn.d_un.d_val != 0)
10719                 {
10720                   struct elf_link_hash_entry * eh;
10721
10722                   eh = elf_link_hash_lookup (elf_hash_table (info), name,
10723                                              FALSE, FALSE, TRUE);
10724                   if (eh != NULL
10725                       && ELF_ST_TYPE (eh->type) == STT_ARM_TFUNC)
10726                     {
10727                       dyn.d_un.d_val |= 1;
10728                       bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10729                     }
10730                 }
10731               break;
10732             }
10733         }
10734
10735       /* Fill in the first entry in the procedure linkage table.  */
10736       if (splt->size > 0 && elf32_arm_hash_table (info)->plt_header_size)
10737         {
10738           const bfd_vma *plt0_entry;
10739           bfd_vma got_address, plt_address, got_displacement;
10740
10741           /* Calculate the addresses of the GOT and PLT.  */
10742           got_address = sgot->output_section->vma + sgot->output_offset;
10743           plt_address = splt->output_section->vma + splt->output_offset;
10744
10745           if (htab->vxworks_p)
10746             {
10747               /* The VxWorks GOT is relocated by the dynamic linker.
10748                  Therefore, we must emit relocations rather than simply
10749                  computing the values now.  */
10750               Elf_Internal_Rela rel;
10751
10752               plt0_entry = elf32_arm_vxworks_exec_plt0_entry;
10753               put_arm_insn (htab, output_bfd, plt0_entry[0],
10754                             splt->contents + 0);
10755               put_arm_insn (htab, output_bfd, plt0_entry[1],
10756                             splt->contents + 4);
10757               put_arm_insn (htab, output_bfd, plt0_entry[2],
10758                             splt->contents + 8);
10759               bfd_put_32 (output_bfd, got_address, splt->contents + 12);
10760
10761               /* Generate a relocation for _GLOBAL_OFFSET_TABLE_.  */
10762               rel.r_offset = plt_address + 12;
10763               rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
10764               rel.r_addend = 0;
10765               SWAP_RELOC_OUT (htab) (output_bfd, &rel,
10766                                      htab->srelplt2->contents);
10767             }
10768           else
10769             {
10770               got_displacement = got_address - (plt_address + 16);
10771
10772               plt0_entry = elf32_arm_plt0_entry;
10773               put_arm_insn (htab, output_bfd, plt0_entry[0],
10774                             splt->contents + 0);
10775               put_arm_insn (htab, output_bfd, plt0_entry[1],
10776                             splt->contents + 4);
10777               put_arm_insn (htab, output_bfd, plt0_entry[2],
10778                             splt->contents + 8);
10779               put_arm_insn (htab, output_bfd, plt0_entry[3],
10780                             splt->contents + 12);
10781
10782 #ifdef FOUR_WORD_PLT
10783               /* The displacement value goes in the otherwise-unused
10784                  last word of the second entry.  */
10785               bfd_put_32 (output_bfd, got_displacement, splt->contents + 28);
10786 #else
10787               bfd_put_32 (output_bfd, got_displacement, splt->contents + 16);
10788 #endif
10789             }
10790         }
10791
10792       /* UnixWare sets the entsize of .plt to 4, although that doesn't
10793          really seem like the right value.  */
10794       if (splt->output_section->owner == output_bfd)
10795         elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
10796
10797       if (htab->vxworks_p && !info->shared && htab->splt->size > 0)
10798         {
10799           /* Correct the .rel(a).plt.unloaded relocations.  They will have
10800              incorrect symbol indexes.  */
10801           int num_plts;
10802           unsigned char *p;
10803
10804           num_plts = ((htab->splt->size - htab->plt_header_size)
10805                       / htab->plt_entry_size);
10806           p = htab->srelplt2->contents + RELOC_SIZE (htab);
10807
10808           for (; num_plts; num_plts--)
10809             {
10810               Elf_Internal_Rela rel;
10811
10812               SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
10813               rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
10814               SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
10815               p += RELOC_SIZE (htab);
10816
10817               SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
10818               rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
10819               SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
10820               p += RELOC_SIZE (htab);
10821             }
10822         }
10823     }
10824
10825   /* Fill in the first three entries in the global offset table.  */
10826   if (sgot)
10827     {
10828       if (sgot->size > 0)
10829         {
10830           if (sdyn == NULL)
10831             bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
10832           else
10833             bfd_put_32 (output_bfd,
10834                         sdyn->output_section->vma + sdyn->output_offset,
10835                         sgot->contents);
10836           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
10837           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
10838         }
10839
10840       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
10841     }
10842
10843   return TRUE;
10844 }
10845
10846 static void
10847 elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
10848 {
10849   Elf_Internal_Ehdr * i_ehdrp;  /* ELF file header, internal form.  */
10850   struct elf32_arm_link_hash_table *globals;
10851
10852   i_ehdrp = elf_elfheader (abfd);
10853
10854   if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
10855     i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
10856   else
10857     i_ehdrp->e_ident[EI_OSABI] = 0;
10858   i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
10859
10860   if (link_info)
10861     {
10862       globals = elf32_arm_hash_table (link_info);
10863       if (globals->byteswap_code)
10864         i_ehdrp->e_flags |= EF_ARM_BE8;
10865     }
10866 }
10867
10868 static enum elf_reloc_type_class
10869 elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
10870 {
10871   switch ((int) ELF32_R_TYPE (rela->r_info))
10872     {
10873     case R_ARM_RELATIVE:
10874       return reloc_class_relative;
10875     case R_ARM_JUMP_SLOT:
10876       return reloc_class_plt;
10877     case R_ARM_COPY:
10878       return reloc_class_copy;
10879     default:
10880       return reloc_class_normal;
10881     }
10882 }
10883
10884 /* Set the right machine number for an Arm ELF file.  */
10885
10886 static bfd_boolean
10887 elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
10888 {
10889   if (hdr->sh_type == SHT_NOTE)
10890     *flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_CONTENTS;
10891
10892   return TRUE;
10893 }
10894
10895 static void
10896 elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
10897 {
10898   bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
10899 }
10900
10901 /* Return TRUE if this is an unwinding table entry.  */
10902
10903 static bfd_boolean
10904 is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
10905 {
10906   return (CONST_STRNEQ (name, ELF_STRING_ARM_unwind)
10907           || CONST_STRNEQ (name, ELF_STRING_ARM_unwind_once));
10908 }
10909
10910
10911 /* Set the type and flags for an ARM section.  We do this by
10912    the section name, which is a hack, but ought to work.  */
10913
10914 static bfd_boolean
10915 elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
10916 {
10917   const char * name;
10918
10919   name = bfd_get_section_name (abfd, sec);
10920
10921   if (is_arm_elf_unwind_section_name (abfd, name))
10922     {
10923       hdr->sh_type = SHT_ARM_EXIDX;
10924       hdr->sh_flags |= SHF_LINK_ORDER;
10925     }
10926   return TRUE;
10927 }
10928
10929 /* Handle an ARM specific section when reading an object file.  This is
10930    called when bfd_section_from_shdr finds a section with an unknown
10931    type.  */
10932
10933 static bfd_boolean
10934 elf32_arm_section_from_shdr (bfd *abfd,
10935                              Elf_Internal_Shdr * hdr,
10936                              const char *name,
10937                              int shindex)
10938 {
10939   /* There ought to be a place to keep ELF backend specific flags, but
10940      at the moment there isn't one.  We just keep track of the
10941      sections by their name, instead.  Fortunately, the ABI gives
10942      names for all the ARM specific sections, so we will probably get
10943      away with this.  */
10944   switch (hdr->sh_type)
10945     {
10946     case SHT_ARM_EXIDX:
10947     case SHT_ARM_PREEMPTMAP:
10948     case SHT_ARM_ATTRIBUTES:
10949       break;
10950
10951     default:
10952       return FALSE;
10953     }
10954
10955   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
10956     return FALSE;
10957
10958   return TRUE;
10959 }
10960
10961 /* A structure used to record a list of sections, independently
10962    of the next and prev fields in the asection structure.  */
10963 typedef struct section_list
10964 {
10965   asection * sec;
10966   struct section_list * next;
10967   struct section_list * prev;
10968 }
10969 section_list;
10970
10971 /* Unfortunately we need to keep a list of sections for which
10972    an _arm_elf_section_data structure has been allocated.  This
10973    is because it is possible for functions like elf32_arm_write_section
10974    to be called on a section which has had an elf_data_structure
10975    allocated for it (and so the used_by_bfd field is valid) but
10976    for which the ARM extended version of this structure - the
10977    _arm_elf_section_data structure - has not been allocated.  */
10978 static section_list * sections_with_arm_elf_section_data = NULL;
10979
10980 static void
10981 record_section_with_arm_elf_section_data (asection * sec)
10982 {
10983   struct section_list * entry;
10984
10985   entry = bfd_malloc (sizeof (* entry));
10986   if (entry == NULL)
10987     return;
10988   entry->sec = sec;
10989   entry->next = sections_with_arm_elf_section_data;
10990   entry->prev = NULL;
10991   if (entry->next != NULL)
10992     entry->next->prev = entry;
10993   sections_with_arm_elf_section_data = entry;
10994 }
10995
10996 static struct section_list *
10997 find_arm_elf_section_entry (asection * sec)
10998 {
10999   struct section_list * entry;
11000   static struct section_list * last_entry = NULL;
11001
11002   /* This is a short cut for the typical case where the sections are added
11003      to the sections_with_arm_elf_section_data list in forward order and
11004      then looked up here in backwards order.  This makes a real difference
11005      to the ld-srec/sec64k.exp linker test.  */
11006   entry = sections_with_arm_elf_section_data;
11007   if (last_entry != NULL)
11008     {
11009       if (last_entry->sec == sec)
11010         entry = last_entry;
11011       else if (last_entry->next != NULL
11012                && last_entry->next->sec == sec)
11013         entry = last_entry->next;
11014     }
11015
11016   for (; entry; entry = entry->next)
11017     if (entry->sec == sec)
11018       break;
11019
11020   if (entry)
11021     /* Record the entry prior to this one - it is the entry we are most
11022        likely to want to locate next time.  Also this way if we have been
11023        called from unrecord_section_with_arm_elf_section_data() we will not
11024        be caching a pointer that is about to be freed.  */
11025     last_entry = entry->prev;
11026
11027   return entry;
11028 }
11029
11030 static _arm_elf_section_data *
11031 get_arm_elf_section_data (asection * sec)
11032 {
11033   struct section_list * entry;
11034
11035   entry = find_arm_elf_section_entry (sec);
11036
11037   if (entry)
11038     return elf32_arm_section_data (entry->sec);
11039   else
11040     return NULL;
11041 }
11042
11043 static void
11044 unrecord_section_with_arm_elf_section_data (asection * sec)
11045 {
11046   struct section_list * entry;
11047
11048   entry = find_arm_elf_section_entry (sec);
11049
11050   if (entry)
11051     {
11052       if (entry->prev != NULL)
11053         entry->prev->next = entry->next;
11054       if (entry->next != NULL)
11055         entry->next->prev = entry->prev;
11056       if (entry == sections_with_arm_elf_section_data)
11057         sections_with_arm_elf_section_data = entry->next;
11058       free (entry);
11059     }
11060 }
11061
11062
11063 typedef struct
11064 {
11065   void *finfo;
11066   struct bfd_link_info *info;
11067   asection *sec;
11068   int sec_shndx;
11069   bfd_boolean (*func) (void *, const char *, Elf_Internal_Sym *,
11070                        asection *, struct elf_link_hash_entry *);
11071 } output_arch_syminfo;
11072
11073 enum map_symbol_type
11074 {
11075   ARM_MAP_ARM,
11076   ARM_MAP_THUMB,
11077   ARM_MAP_DATA
11078 };
11079
11080
11081 /* Output a single mapping symbol.  */
11082
11083 static bfd_boolean
11084 elf32_arm_output_map_sym (output_arch_syminfo *osi,
11085                           enum map_symbol_type type,
11086                           bfd_vma offset)
11087 {
11088   static const char *names[3] = {"$a", "$t", "$d"};
11089   struct elf32_arm_link_hash_table *htab;
11090   Elf_Internal_Sym sym;
11091
11092   htab = elf32_arm_hash_table (osi->info);
11093   sym.st_value = osi->sec->output_section->vma
11094                  + osi->sec->output_offset
11095                  + offset;
11096   sym.st_size = 0;
11097   sym.st_other = 0;
11098   sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
11099   sym.st_shndx = osi->sec_shndx;
11100   if (!osi->func (osi->finfo, names[type], &sym, osi->sec, NULL))
11101     return FALSE;
11102   return TRUE;
11103 }
11104
11105
11106 /* Output mapping symbols for PLT entries associated with H.  */
11107
11108 static bfd_boolean
11109 elf32_arm_output_plt_map (struct elf_link_hash_entry *h, void *inf)
11110 {
11111   output_arch_syminfo *osi = (output_arch_syminfo *) inf;
11112   struct elf32_arm_link_hash_table *htab;
11113   struct elf32_arm_link_hash_entry *eh;
11114   bfd_vma addr;
11115
11116   htab = elf32_arm_hash_table (osi->info);
11117
11118   if (h->root.type == bfd_link_hash_indirect)
11119     return TRUE;
11120
11121   if (h->root.type == bfd_link_hash_warning)
11122     /* When warning symbols are created, they **replace** the "real"
11123        entry in the hash table, thus we never get to see the real
11124        symbol in a hash traversal.  So look at it now.  */
11125     h = (struct elf_link_hash_entry *) h->root.u.i.link;
11126
11127   if (h->plt.offset == (bfd_vma) -1)
11128     return TRUE;
11129
11130   eh = (struct elf32_arm_link_hash_entry *) h;
11131   addr = h->plt.offset;
11132   if (htab->symbian_p)
11133     {
11134       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11135         return FALSE;
11136       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 4))
11137         return FALSE;
11138     }
11139   else if (htab->vxworks_p)
11140     {
11141       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11142         return FALSE;
11143       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
11144         return FALSE;
11145       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 12))
11146         return FALSE;
11147       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 20))
11148         return FALSE;
11149     }
11150   else
11151     {
11152       bfd_signed_vma thumb_refs;
11153
11154       thumb_refs = eh->plt_thumb_refcount;
11155       if (!htab->use_blx)
11156         thumb_refs += eh->plt_maybe_thumb_refcount;
11157
11158       if (thumb_refs > 0)
11159         {
11160           if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr - 4))
11161             return FALSE;
11162         }
11163 #ifdef FOUR_WORD_PLT
11164       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11165         return FALSE;
11166       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 12))
11167         return FALSE;
11168 #else
11169       /* A three-word PLT with no Thumb thunk contains only Arm code,
11170          so only need to output a mapping symbol for the first PLT entry and
11171          entries with thumb thunks.  */
11172       if (thumb_refs > 0 || addr == 20)
11173         {
11174           if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11175             return FALSE;
11176         }
11177 #endif
11178     }
11179
11180   return TRUE;
11181 }
11182
11183 /* Output a single local symbol for a generated stub.  */
11184
11185 static bfd_boolean
11186 elf32_arm_output_stub_sym (output_arch_syminfo *osi, const char *name,
11187                            bfd_vma offset, bfd_vma size)
11188 {
11189   struct elf32_arm_link_hash_table *htab;
11190   Elf_Internal_Sym sym;
11191
11192   htab = elf32_arm_hash_table (osi->info);
11193   sym.st_value = osi->sec->output_section->vma
11194                  + osi->sec->output_offset
11195                  + offset;
11196   sym.st_size = size;
11197   sym.st_other = 0;
11198   sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
11199   sym.st_shndx = osi->sec_shndx;
11200   if (!osi->func (osi->finfo, name, &sym, osi->sec, NULL))
11201     return FALSE;
11202   return TRUE;
11203 }
11204
11205 static bfd_boolean
11206 arm_map_one_stub (struct bfd_hash_entry * gen_entry,
11207                   void * in_arg)
11208 {
11209   struct elf32_arm_stub_hash_entry *stub_entry;
11210   struct bfd_link_info *info;
11211   struct elf32_arm_link_hash_table *htab;
11212   asection *stub_sec;
11213   bfd_vma addr;
11214   char *stub_name;
11215   output_arch_syminfo *osi;
11216
11217   /* Massage our args to the form they really have.  */
11218   stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
11219   osi = (output_arch_syminfo *) in_arg;
11220
11221   info = osi->info;
11222
11223   htab = elf32_arm_hash_table (info);
11224   stub_sec = stub_entry->stub_sec;
11225
11226   /* Ensure this stub is attached to the current section being
11227      processed.  */
11228   if (stub_sec != osi->sec)
11229     return TRUE;
11230
11231   addr = (bfd_vma) stub_entry->stub_offset;
11232   stub_name = stub_entry->output_name;
11233
11234   switch (stub_entry->stub_type)
11235     {
11236     case arm_stub_long_branch:
11237       if (!elf32_arm_output_stub_sym (osi, stub_name, addr, 8))
11238         return FALSE;
11239       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11240         return FALSE;
11241       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 4))
11242         return FALSE;
11243       break;
11244     case arm_thumb_v4t_stub_long_branch:
11245       if (!elf32_arm_output_stub_sym (osi, stub_name, addr, 12))
11246         return FALSE;
11247       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11248         return FALSE;
11249       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
11250         return FALSE;
11251       break;
11252     case arm_thumb_thumb_stub_long_branch:
11253       if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, 16))
11254         return FALSE;
11255       if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr))
11256         return FALSE;
11257       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 12))
11258         return FALSE;
11259       break;
11260     case arm_thumb_arm_v4t_stub_long_branch:
11261       if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, 20))
11262         return FALSE;
11263       if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr))
11264         return FALSE;
11265       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 8))
11266         return FALSE;
11267       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 16))
11268         return FALSE;
11269       break;
11270     case arm_thumb_arm_v4t_stub_short_branch:
11271       if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, 8))
11272         return FALSE;
11273       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 4))
11274         return FALSE;
11275       break;
11276     case arm_stub_pic_long_branch:
11277       if (!elf32_arm_output_stub_sym (osi, stub_name, addr, 12))
11278         return FALSE;
11279       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
11280         return FALSE;
11281       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
11282         return FALSE;
11283       break;
11284     default:
11285       BFD_FAIL ();
11286     }
11287
11288   return TRUE;
11289 }
11290
11291 /* Output mapping symbols for linker generated sections.  */
11292
11293 static bfd_boolean
11294 elf32_arm_output_arch_local_syms (bfd *output_bfd,
11295                                   struct bfd_link_info *info,
11296                                   void *finfo,
11297                                   bfd_boolean (*func) (void *, const char *,
11298                                                        Elf_Internal_Sym *,
11299                                                        asection *,
11300                                                        struct elf_link_hash_entry *))
11301 {
11302   output_arch_syminfo osi;
11303   struct elf32_arm_link_hash_table *htab;
11304   bfd_vma offset;
11305   bfd_size_type size;
11306
11307   htab = elf32_arm_hash_table (info);
11308   check_use_blx (htab);
11309
11310   osi.finfo = finfo;
11311   osi.info = info;
11312   osi.func = func;
11313
11314   /* ARM->Thumb glue.  */
11315   if (htab->arm_glue_size > 0)
11316     {
11317       osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
11318                                          ARM2THUMB_GLUE_SECTION_NAME);
11319
11320       osi.sec_shndx = _bfd_elf_section_from_bfd_section
11321           (output_bfd, osi.sec->output_section);
11322       if (info->shared || htab->root.is_relocatable_executable
11323           || htab->pic_veneer)
11324         size = ARM2THUMB_PIC_GLUE_SIZE;
11325       else if (htab->use_blx)
11326         size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
11327       else
11328         size = ARM2THUMB_STATIC_GLUE_SIZE;
11329
11330       for (offset = 0; offset < htab->arm_glue_size; offset += size)
11331         {
11332           elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset);
11333           elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, offset + size - 4);
11334         }
11335     }
11336
11337   /* Thumb->ARM glue.  */
11338   if (htab->thumb_glue_size > 0)
11339     {
11340       osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
11341                                          THUMB2ARM_GLUE_SECTION_NAME);
11342
11343       osi.sec_shndx = _bfd_elf_section_from_bfd_section
11344           (output_bfd, osi.sec->output_section);
11345       size = THUMB2ARM_GLUE_SIZE;
11346
11347       for (offset = 0; offset < htab->thumb_glue_size; offset += size)
11348         {
11349           elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, offset);
11350           elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset + 4);
11351         }
11352     }
11353
11354   /* ARMv4 BX veneers.  */
11355   if (htab->bx_glue_size > 0)
11356     {
11357       osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
11358                                          ARM_BX_GLUE_SECTION_NAME);
11359
11360       osi.sec_shndx = _bfd_elf_section_from_bfd_section
11361           (output_bfd, osi.sec->output_section);
11362
11363       elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0);
11364     }
11365
11366   /* Long calls stubs.  */
11367   if (htab->stub_bfd && htab->stub_bfd->sections)
11368     {
11369       asection* stub_sec;
11370
11371       for (stub_sec = htab->stub_bfd->sections;
11372            stub_sec != NULL;
11373            stub_sec = stub_sec->next)
11374         {
11375           /* Ignore non-stub sections.  */
11376           if (!strstr (stub_sec->name, STUB_SUFFIX))
11377             continue;
11378
11379           osi.sec = stub_sec;
11380
11381           osi.sec_shndx = _bfd_elf_section_from_bfd_section
11382             (output_bfd, osi.sec->output_section);
11383
11384           bfd_hash_traverse (&htab->stub_hash_table, arm_map_one_stub, &osi);
11385         }
11386     }
11387
11388   /* Finally, output mapping symbols for the PLT.  */
11389   if (!htab->splt || htab->splt->size == 0)
11390     return TRUE;
11391
11392   osi.sec_shndx = _bfd_elf_section_from_bfd_section (output_bfd,
11393                                                      htab->splt->output_section);
11394   osi.sec = htab->splt;
11395   /* Output mapping symbols for the plt header.  SymbianOS does not have a
11396      plt header.  */
11397   if (htab->vxworks_p)
11398     {
11399       /* VxWorks shared libraries have no PLT header.  */
11400       if (!info->shared)
11401         {
11402           if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
11403             return FALSE;
11404           if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 12))
11405             return FALSE;
11406         }
11407     }
11408   else if (!htab->symbian_p)
11409     {
11410       if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
11411         return FALSE;
11412 #ifndef FOUR_WORD_PLT
11413       if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 16))
11414         return FALSE;
11415 #endif
11416     }
11417
11418   elf_link_hash_traverse (&htab->root, elf32_arm_output_plt_map, (void *) &osi);
11419   return TRUE;
11420 }
11421
11422 /* Allocate target specific section data.  */
11423
11424 static bfd_boolean
11425 elf32_arm_new_section_hook (bfd *abfd, asection *sec)
11426 {
11427   if (!sec->used_by_bfd)
11428     {
11429       _arm_elf_section_data *sdata;
11430       bfd_size_type amt = sizeof (*sdata);
11431
11432       sdata = bfd_zalloc (abfd, amt);
11433       if (sdata == NULL)
11434         return FALSE;
11435       sec->used_by_bfd = sdata;
11436     }
11437
11438   record_section_with_arm_elf_section_data (sec);
11439
11440   return _bfd_elf_new_section_hook (abfd, sec);
11441 }
11442
11443
11444 /* Used to order a list of mapping symbols by address.  */
11445
11446 static int
11447 elf32_arm_compare_mapping (const void * a, const void * b)
11448 {
11449   const elf32_arm_section_map *amap = (const elf32_arm_section_map *) a;
11450   const elf32_arm_section_map *bmap = (const elf32_arm_section_map *) b;
11451
11452   if (amap->vma > bmap->vma)
11453     return 1;
11454   else if (amap->vma < bmap->vma)
11455     return -1;
11456   else if (amap->type > bmap->type)
11457     /* Ensure results do not depend on the host qsort for objects with
11458        multiple mapping symbols at the same address by sorting on type
11459        after vma.  */
11460     return 1;
11461   else if (amap->type < bmap->type)
11462     return -1;
11463   else
11464     return 0;
11465 }
11466
11467
11468 /* Do code byteswapping.  Return FALSE afterwards so that the section is
11469    written out as normal.  */
11470
11471 static bfd_boolean
11472 elf32_arm_write_section (bfd *output_bfd,
11473                          struct bfd_link_info *link_info,
11474                          asection *sec,
11475                          bfd_byte *contents)
11476 {
11477   int mapcount, errcount;
11478   _arm_elf_section_data *arm_data;
11479   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
11480   elf32_arm_section_map *map;
11481   elf32_vfp11_erratum_list *errnode;
11482   bfd_vma ptr;
11483   bfd_vma end;
11484   bfd_vma offset = sec->output_section->vma + sec->output_offset;
11485   bfd_byte tmp;
11486   int i;
11487
11488   /* If this section has not been allocated an _arm_elf_section_data
11489      structure then we cannot record anything.  */
11490   arm_data = get_arm_elf_section_data (sec);
11491   if (arm_data == NULL)
11492     return FALSE;
11493
11494   mapcount = arm_data->mapcount;
11495   map = arm_data->map;
11496   errcount = arm_data->erratumcount;
11497
11498   if (errcount != 0)
11499     {
11500       unsigned int endianflip = bfd_big_endian (output_bfd) ? 3 : 0;
11501
11502       for (errnode = arm_data->erratumlist; errnode != 0;
11503            errnode = errnode->next)
11504         {
11505           bfd_vma index = errnode->vma - offset;
11506
11507           switch (errnode->type)
11508             {
11509             case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
11510               {
11511                 bfd_vma branch_to_veneer;
11512                 /* Original condition code of instruction, plus bit mask for
11513                    ARM B instruction.  */
11514                 unsigned int insn = (errnode->u.b.vfp_insn & 0xf0000000)
11515                                   | 0x0a000000;
11516
11517                 /* The instruction is before the label.  */
11518                 index -= 4;
11519
11520                 /* Above offset included in -4 below.  */
11521                 branch_to_veneer = errnode->u.b.veneer->vma
11522                                    - errnode->vma - 4;
11523
11524                 if ((signed) branch_to_veneer < -(1 << 25)
11525                     || (signed) branch_to_veneer >= (1 << 25))
11526                   (*_bfd_error_handler) (_("%B: error: VFP11 veneer out of "
11527                                            "range"), output_bfd);
11528
11529                 insn |= (branch_to_veneer >> 2) & 0xffffff;
11530                 contents[endianflip ^ index] = insn & 0xff;
11531                 contents[endianflip ^ (index + 1)] = (insn >> 8) & 0xff;
11532                 contents[endianflip ^ (index + 2)] = (insn >> 16) & 0xff;
11533                 contents[endianflip ^ (index + 3)] = (insn >> 24) & 0xff;
11534               }
11535               break;
11536
11537             case VFP11_ERRATUM_ARM_VENEER:
11538               {
11539                 bfd_vma branch_from_veneer;
11540                 unsigned int insn;
11541
11542                 /* Take size of veneer into account.  */
11543                 branch_from_veneer = errnode->u.v.branch->vma
11544                                      - errnode->vma - 12;
11545
11546                 if ((signed) branch_from_veneer < -(1 << 25)
11547                     || (signed) branch_from_veneer >= (1 << 25))
11548                   (*_bfd_error_handler) (_("%B: error: VFP11 veneer out of "
11549                                            "range"), output_bfd);
11550
11551                 /* Original instruction.  */
11552                 insn = errnode->u.v.branch->u.b.vfp_insn;
11553                 contents[endianflip ^ index] = insn & 0xff;
11554                 contents[endianflip ^ (index + 1)] = (insn >> 8) & 0xff;
11555                 contents[endianflip ^ (index + 2)] = (insn >> 16) & 0xff;
11556                 contents[endianflip ^ (index + 3)] = (insn >> 24) & 0xff;
11557
11558                 /* Branch back to insn after original insn.  */
11559                 insn = 0xea000000 | ((branch_from_veneer >> 2) & 0xffffff);
11560                 contents[endianflip ^ (index + 4)] = insn & 0xff;
11561                 contents[endianflip ^ (index + 5)] = (insn >> 8) & 0xff;
11562                 contents[endianflip ^ (index + 6)] = (insn >> 16) & 0xff;
11563                 contents[endianflip ^ (index + 7)] = (insn >> 24) & 0xff;
11564               }
11565               break;
11566
11567             default:
11568               abort ();
11569             }
11570         }
11571     }
11572
11573   if (mapcount == 0)
11574     return FALSE;
11575
11576   if (globals->byteswap_code)
11577     {
11578       qsort (map, mapcount, sizeof (* map), elf32_arm_compare_mapping);
11579
11580       ptr = map[0].vma;
11581       for (i = 0; i < mapcount; i++)
11582         {
11583           if (i == mapcount - 1)
11584             end = sec->size;
11585           else
11586             end = map[i + 1].vma;
11587
11588           switch (map[i].type)
11589             {
11590             case 'a':
11591               /* Byte swap code words.  */
11592               while (ptr + 3 < end)
11593                 {
11594                   tmp = contents[ptr];
11595                   contents[ptr] = contents[ptr + 3];
11596                   contents[ptr + 3] = tmp;
11597                   tmp = contents[ptr + 1];
11598                   contents[ptr + 1] = contents[ptr + 2];
11599                   contents[ptr + 2] = tmp;
11600                   ptr += 4;
11601                 }
11602               break;
11603
11604             case 't':
11605               /* Byte swap code halfwords.  */
11606               while (ptr + 1 < end)
11607                 {
11608                   tmp = contents[ptr];
11609                   contents[ptr] = contents[ptr + 1];
11610                   contents[ptr + 1] = tmp;
11611                   ptr += 2;
11612                 }
11613               break;
11614
11615             case 'd':
11616               /* Leave data alone.  */
11617               break;
11618             }
11619           ptr = end;
11620         }
11621     }
11622
11623   free (map);
11624   arm_data->mapcount = 0;
11625   arm_data->mapsize = 0;
11626   arm_data->map = NULL;
11627   unrecord_section_with_arm_elf_section_data (sec);
11628
11629   return FALSE;
11630 }
11631
11632 static void
11633 unrecord_section_via_map_over_sections (bfd * abfd ATTRIBUTE_UNUSED,
11634                                         asection * sec,
11635                                         void * ignore ATTRIBUTE_UNUSED)
11636 {
11637   unrecord_section_with_arm_elf_section_data (sec);
11638 }
11639
11640 static bfd_boolean
11641 elf32_arm_close_and_cleanup (bfd * abfd)
11642 {
11643   if (abfd->sections)
11644     bfd_map_over_sections (abfd,
11645                            unrecord_section_via_map_over_sections,
11646                            NULL);
11647
11648   return _bfd_elf_close_and_cleanup (abfd);
11649 }
11650
11651 static bfd_boolean
11652 elf32_arm_bfd_free_cached_info (bfd * abfd)
11653 {
11654   if (abfd->sections)
11655     bfd_map_over_sections (abfd,
11656                            unrecord_section_via_map_over_sections,
11657                            NULL);
11658
11659   return _bfd_free_cached_info (abfd);
11660 }
11661
11662 /* Display STT_ARM_TFUNC symbols as functions.  */
11663
11664 static void
11665 elf32_arm_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
11666                              asymbol *asym)
11667 {
11668   elf_symbol_type *elfsym = (elf_symbol_type *) asym;
11669
11670   if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_ARM_TFUNC)
11671     elfsym->symbol.flags |= BSF_FUNCTION;
11672 }
11673
11674
11675 /* Mangle thumb function symbols as we read them in.  */
11676
11677 static bfd_boolean
11678 elf32_arm_swap_symbol_in (bfd * abfd,
11679                           const void *psrc,
11680                           const void *pshn,
11681                           Elf_Internal_Sym *dst)
11682 {
11683   if (!bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst))
11684     return FALSE;
11685
11686   /* New EABI objects mark thumb function symbols by setting the low bit of
11687      the address.  Turn these into STT_ARM_TFUNC.  */
11688   if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
11689       && (dst->st_value & 1))
11690     {
11691       dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC);
11692       dst->st_value &= ~(bfd_vma) 1;
11693     }
11694   return TRUE;
11695 }
11696
11697
11698 /* Mangle thumb function symbols as we write them out.  */
11699
11700 static void
11701 elf32_arm_swap_symbol_out (bfd *abfd,
11702                            const Elf_Internal_Sym *src,
11703                            void *cdst,
11704                            void *shndx)
11705 {
11706   Elf_Internal_Sym newsym;
11707
11708   /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
11709      of the address set, as per the new EABI.  We do this unconditionally
11710      because objcopy does not set the elf header flags until after
11711      it writes out the symbol table.  */
11712   if (ELF_ST_TYPE (src->st_info) == STT_ARM_TFUNC)
11713     {
11714       newsym = *src;
11715       newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
11716       if (newsym.st_shndx != SHN_UNDEF)
11717         {
11718           /* Do this only for defined symbols. At link type, the static
11719              linker will simulate the work of dynamic linker of resolving
11720              symbols and will carry over the thumbness of found symbols to
11721              the output symbol table. It's not clear how it happens, but
11722              the thumbness of undefined symbols can well be different at
11723              runtime, and writing '1' for them will be confusing for users
11724              and possibly for dynamic linker itself.
11725           */
11726           newsym.st_value |= 1;
11727         }
11728
11729       src = &newsym;
11730     }
11731   bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
11732 }
11733
11734 /* Add the PT_ARM_EXIDX program header.  */
11735
11736 static bfd_boolean
11737 elf32_arm_modify_segment_map (bfd *abfd,
11738                               struct bfd_link_info *info ATTRIBUTE_UNUSED)
11739 {
11740   struct elf_segment_map *m;
11741   asection *sec;
11742
11743   sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
11744   if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
11745     {
11746       /* If there is already a PT_ARM_EXIDX header, then we do not
11747          want to add another one.  This situation arises when running
11748          "strip"; the input binary already has the header.  */
11749       m = elf_tdata (abfd)->segment_map;
11750       while (m && m->p_type != PT_ARM_EXIDX)
11751         m = m->next;
11752       if (!m)
11753         {
11754           m = bfd_zalloc (abfd, sizeof (struct elf_segment_map));
11755           if (m == NULL)
11756             return FALSE;
11757           m->p_type = PT_ARM_EXIDX;
11758           m->count = 1;
11759           m->sections[0] = sec;
11760
11761           m->next = elf_tdata (abfd)->segment_map;
11762           elf_tdata (abfd)->segment_map = m;
11763         }
11764     }
11765
11766   return TRUE;
11767 }
11768
11769 /* We may add a PT_ARM_EXIDX program header.  */
11770
11771 static int
11772 elf32_arm_additional_program_headers (bfd *abfd,
11773                                       struct bfd_link_info *info ATTRIBUTE_UNUSED)
11774 {
11775   asection *sec;
11776
11777   sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
11778   if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
11779     return 1;
11780   else
11781     return 0;
11782 }
11783
11784 /* We have two function types: STT_FUNC and STT_ARM_TFUNC.  */
11785
11786 static bfd_boolean
11787 elf32_arm_is_function_type (unsigned int type)
11788 {
11789   return (type == STT_FUNC) || (type == STT_ARM_TFUNC);
11790 }
11791
11792 /* We use this to override swap_symbol_in and swap_symbol_out.  */
11793 const struct elf_size_info elf32_arm_size_info =
11794 {
11795   sizeof (Elf32_External_Ehdr),
11796   sizeof (Elf32_External_Phdr),
11797   sizeof (Elf32_External_Shdr),
11798   sizeof (Elf32_External_Rel),
11799   sizeof (Elf32_External_Rela),
11800   sizeof (Elf32_External_Sym),
11801   sizeof (Elf32_External_Dyn),
11802   sizeof (Elf_External_Note),
11803   4,
11804   1,
11805   32, 2,
11806   ELFCLASS32, EV_CURRENT,
11807   bfd_elf32_write_out_phdrs,
11808   bfd_elf32_write_shdrs_and_ehdr,
11809   bfd_elf32_checksum_contents,
11810   bfd_elf32_write_relocs,
11811   elf32_arm_swap_symbol_in,
11812   elf32_arm_swap_symbol_out,
11813   bfd_elf32_slurp_reloc_table,
11814   bfd_elf32_slurp_symbol_table,
11815   bfd_elf32_swap_dyn_in,
11816   bfd_elf32_swap_dyn_out,
11817   bfd_elf32_swap_reloc_in,
11818   bfd_elf32_swap_reloc_out,
11819   bfd_elf32_swap_reloca_in,
11820   bfd_elf32_swap_reloca_out
11821 };
11822
11823 #define ELF_ARCH                        bfd_arch_arm
11824 #define ELF_MACHINE_CODE                EM_ARM
11825 #ifdef __QNXTARGET__
11826 #define ELF_MAXPAGESIZE                 0x1000
11827 #else
11828 #define ELF_MAXPAGESIZE                 0x8000
11829 #endif
11830 #define ELF_MINPAGESIZE                 0x1000
11831 #define ELF_COMMONPAGESIZE              0x1000
11832
11833 #define bfd_elf32_mkobject                      elf32_arm_mkobject
11834
11835 #define bfd_elf32_bfd_copy_private_bfd_data     elf32_arm_copy_private_bfd_data
11836 #define bfd_elf32_bfd_merge_private_bfd_data    elf32_arm_merge_private_bfd_data
11837 #define bfd_elf32_bfd_set_private_flags         elf32_arm_set_private_flags
11838 #define bfd_elf32_bfd_print_private_bfd_data    elf32_arm_print_private_bfd_data
11839 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_link_hash_table_create
11840 #define bfd_elf32_bfd_link_hash_table_free      elf32_arm_hash_table_free
11841 #define bfd_elf32_bfd_reloc_type_lookup         elf32_arm_reloc_type_lookup
11842 #define bfd_elf32_bfd_reloc_name_lookup elf32_arm_reloc_name_lookup
11843 #define bfd_elf32_find_nearest_line             elf32_arm_find_nearest_line
11844 #define bfd_elf32_find_inliner_info             elf32_arm_find_inliner_info
11845 #define bfd_elf32_new_section_hook              elf32_arm_new_section_hook
11846 #define bfd_elf32_bfd_is_target_special_symbol  elf32_arm_is_target_special_symbol
11847 #define bfd_elf32_close_and_cleanup             elf32_arm_close_and_cleanup
11848 #define bfd_elf32_bfd_free_cached_info          elf32_arm_bfd_free_cached_info
11849
11850 #define elf_backend_get_symbol_type             elf32_arm_get_symbol_type
11851 #define elf_backend_gc_mark_hook                elf32_arm_gc_mark_hook
11852 #define elf_backend_gc_mark_extra_sections      elf32_arm_gc_mark_extra_sections
11853 #define elf_backend_gc_sweep_hook               elf32_arm_gc_sweep_hook
11854 #define elf_backend_check_relocs                elf32_arm_check_relocs
11855 #define elf_backend_relocate_section            elf32_arm_relocate_section
11856 #define elf_backend_write_section               elf32_arm_write_section
11857 #define elf_backend_adjust_dynamic_symbol       elf32_arm_adjust_dynamic_symbol
11858 #define elf_backend_create_dynamic_sections     elf32_arm_create_dynamic_sections
11859 #define elf_backend_finish_dynamic_symbol       elf32_arm_finish_dynamic_symbol
11860 #define elf_backend_finish_dynamic_sections     elf32_arm_finish_dynamic_sections
11861 #define elf_backend_size_dynamic_sections       elf32_arm_size_dynamic_sections
11862 #define elf_backend_init_index_section          _bfd_elf_init_2_index_sections
11863 #define elf_backend_post_process_headers        elf32_arm_post_process_headers
11864 #define elf_backend_reloc_type_class            elf32_arm_reloc_type_class
11865 #define elf_backend_object_p                    elf32_arm_object_p
11866 #define elf_backend_section_flags               elf32_arm_section_flags
11867 #define elf_backend_fake_sections               elf32_arm_fake_sections
11868 #define elf_backend_section_from_shdr           elf32_arm_section_from_shdr
11869 #define elf_backend_final_write_processing      elf32_arm_final_write_processing
11870 #define elf_backend_copy_indirect_symbol        elf32_arm_copy_indirect_symbol
11871 #define elf_backend_symbol_processing           elf32_arm_symbol_processing
11872 #define elf_backend_size_info                   elf32_arm_size_info
11873 #define elf_backend_modify_segment_map          elf32_arm_modify_segment_map
11874 #define elf_backend_additional_program_headers  elf32_arm_additional_program_headers
11875 #define elf_backend_output_arch_local_syms      elf32_arm_output_arch_local_syms
11876 #define elf_backend_begin_write_processing      elf32_arm_begin_write_processing
11877 #define elf_backend_is_function_type            elf32_arm_is_function_type
11878
11879 #define elf_backend_can_refcount       1
11880 #define elf_backend_can_gc_sections    1
11881 #define elf_backend_plt_readonly       1
11882 #define elf_backend_want_got_plt       1
11883 #define elf_backend_want_plt_sym       0
11884 #define elf_backend_may_use_rel_p      1
11885 #define elf_backend_may_use_rela_p     0
11886 #define elf_backend_default_use_rela_p 0
11887
11888 #define elf_backend_got_header_size     12
11889
11890 #undef  elf_backend_obj_attrs_vendor
11891 #define elf_backend_obj_attrs_vendor            "aeabi"
11892 #undef  elf_backend_obj_attrs_section
11893 #define elf_backend_obj_attrs_section           ".ARM.attributes"
11894 #undef  elf_backend_obj_attrs_arg_type
11895 #define elf_backend_obj_attrs_arg_type          elf32_arm_obj_attrs_arg_type
11896 #undef  elf_backend_obj_attrs_section_type
11897 #define elf_backend_obj_attrs_section_type      SHT_ARM_ATTRIBUTES
11898
11899 #include "elf32-target.h"
11900
11901 /* VxWorks Targets.  */
11902
11903 #undef  TARGET_LITTLE_SYM
11904 #define TARGET_LITTLE_SYM               bfd_elf32_littlearm_vxworks_vec
11905 #undef  TARGET_LITTLE_NAME
11906 #define TARGET_LITTLE_NAME              "elf32-littlearm-vxworks"
11907 #undef  TARGET_BIG_SYM
11908 #define TARGET_BIG_SYM                  bfd_elf32_bigarm_vxworks_vec
11909 #undef  TARGET_BIG_NAME
11910 #define TARGET_BIG_NAME                 "elf32-bigarm-vxworks"
11911
11912 /* Like elf32_arm_link_hash_table_create -- but overrides
11913    appropriately for VxWorks.  */
11914
11915 static struct bfd_link_hash_table *
11916 elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
11917 {
11918   struct bfd_link_hash_table *ret;
11919
11920   ret = elf32_arm_link_hash_table_create (abfd);
11921   if (ret)
11922     {
11923       struct elf32_arm_link_hash_table *htab
11924         = (struct elf32_arm_link_hash_table *) ret;
11925       htab->use_rel = 0;
11926       htab->vxworks_p = 1;
11927     }
11928   return ret;
11929 }
11930
11931 static void
11932 elf32_arm_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
11933 {
11934   elf32_arm_final_write_processing (abfd, linker);
11935   elf_vxworks_final_write_processing (abfd, linker);
11936 }
11937
11938 #undef  elf32_bed
11939 #define elf32_bed elf32_arm_vxworks_bed
11940
11941 #undef  bfd_elf32_bfd_link_hash_table_create
11942 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_vxworks_link_hash_table_create
11943 #undef  elf_backend_add_symbol_hook
11944 #define elf_backend_add_symbol_hook             elf_vxworks_add_symbol_hook
11945 #undef  elf_backend_final_write_processing
11946 #define elf_backend_final_write_processing      elf32_arm_vxworks_final_write_processing
11947 #undef  elf_backend_emit_relocs
11948 #define elf_backend_emit_relocs                 elf_vxworks_emit_relocs
11949
11950 #undef  elf_backend_may_use_rel_p
11951 #define elf_backend_may_use_rel_p       0
11952 #undef  elf_backend_may_use_rela_p
11953 #define elf_backend_may_use_rela_p      1
11954 #undef  elf_backend_default_use_rela_p
11955 #define elf_backend_default_use_rela_p  1
11956 #undef  elf_backend_want_plt_sym
11957 #define elf_backend_want_plt_sym        1
11958 #undef  ELF_MAXPAGESIZE
11959 #define ELF_MAXPAGESIZE                 0x1000
11960
11961 #include "elf32-target.h"
11962
11963
11964 /* Symbian OS Targets.  */
11965
11966 #undef  TARGET_LITTLE_SYM
11967 #define TARGET_LITTLE_SYM               bfd_elf32_littlearm_symbian_vec
11968 #undef  TARGET_LITTLE_NAME
11969 #define TARGET_LITTLE_NAME              "elf32-littlearm-symbian"
11970 #undef  TARGET_BIG_SYM
11971 #define TARGET_BIG_SYM                  bfd_elf32_bigarm_symbian_vec
11972 #undef  TARGET_BIG_NAME
11973 #define TARGET_BIG_NAME                 "elf32-bigarm-symbian"
11974
11975 /* Like elf32_arm_link_hash_table_create -- but overrides
11976    appropriately for Symbian OS.  */
11977
11978 static struct bfd_link_hash_table *
11979 elf32_arm_symbian_link_hash_table_create (bfd *abfd)
11980 {
11981   struct bfd_link_hash_table *ret;
11982
11983   ret = elf32_arm_link_hash_table_create (abfd);
11984   if (ret)
11985     {
11986       struct elf32_arm_link_hash_table *htab
11987         = (struct elf32_arm_link_hash_table *)ret;
11988       /* There is no PLT header for Symbian OS.  */
11989       htab->plt_header_size = 0;
11990       /* The PLT entries are each one instruction and one word.  */
11991       htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry);
11992       htab->symbian_p = 1;
11993       /* Symbian uses armv5t or above, so use_blx is always true.  */
11994       htab->use_blx = 1;
11995       htab->root.is_relocatable_executable = 1;
11996     }
11997   return ret;
11998 }
11999
12000 static const struct bfd_elf_special_section
12001 elf32_arm_symbian_special_sections[] =
12002 {
12003   /* In a BPABI executable, the dynamic linking sections do not go in
12004      the loadable read-only segment.  The post-linker may wish to
12005      refer to these sections, but they are not part of the final
12006      program image.  */
12007   { STRING_COMMA_LEN (".dynamic"),       0, SHT_DYNAMIC,  0 },
12008   { STRING_COMMA_LEN (".dynstr"),        0, SHT_STRTAB,   0 },
12009   { STRING_COMMA_LEN (".dynsym"),        0, SHT_DYNSYM,   0 },
12010   { STRING_COMMA_LEN (".got"),           0, SHT_PROGBITS, 0 },
12011   { STRING_COMMA_LEN (".hash"),          0, SHT_HASH,     0 },
12012   /* These sections do not need to be writable as the SymbianOS
12013      postlinker will arrange things so that no dynamic relocation is
12014      required.  */
12015   { STRING_COMMA_LEN (".init_array"),    0, SHT_INIT_ARRAY,    SHF_ALLOC },
12016   { STRING_COMMA_LEN (".fini_array"),    0, SHT_FINI_ARRAY,    SHF_ALLOC },
12017   { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC },
12018   { NULL,                             0, 0, 0,                 0 }
12019 };
12020
12021 static void
12022 elf32_arm_symbian_begin_write_processing (bfd *abfd,
12023                                           struct bfd_link_info *link_info)
12024 {
12025   /* BPABI objects are never loaded directly by an OS kernel; they are
12026      processed by a postlinker first, into an OS-specific format.  If
12027      the D_PAGED bit is set on the file, BFD will align segments on
12028      page boundaries, so that an OS can directly map the file.  With
12029      BPABI objects, that just results in wasted space.  In addition,
12030      because we clear the D_PAGED bit, map_sections_to_segments will
12031      recognize that the program headers should not be mapped into any
12032      loadable segment.  */
12033   abfd->flags &= ~D_PAGED;
12034   elf32_arm_begin_write_processing (abfd, link_info);
12035 }
12036
12037 static bfd_boolean
12038 elf32_arm_symbian_modify_segment_map (bfd *abfd,
12039                                       struct bfd_link_info *info)
12040 {
12041   struct elf_segment_map *m;
12042   asection *dynsec;
12043
12044   /* BPABI shared libraries and executables should have a PT_DYNAMIC
12045      segment.  However, because the .dynamic section is not marked
12046      with SEC_LOAD, the generic ELF code will not create such a
12047      segment.  */
12048   dynsec = bfd_get_section_by_name (abfd, ".dynamic");
12049   if (dynsec)
12050     {
12051       for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
12052         if (m->p_type == PT_DYNAMIC)
12053           break;
12054
12055       if (m == NULL)
12056         {
12057           m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
12058           m->next = elf_tdata (abfd)->segment_map;
12059           elf_tdata (abfd)->segment_map = m;
12060         }
12061     }
12062
12063   /* Also call the generic arm routine.  */
12064   return elf32_arm_modify_segment_map (abfd, info);
12065 }
12066
12067 /* Return address for Ith PLT stub in section PLT, for relocation REL
12068    or (bfd_vma) -1 if it should not be included.  */
12069
12070 static bfd_vma
12071 elf32_arm_symbian_plt_sym_val (bfd_vma i, const asection *plt,
12072                                const arelent *rel ATTRIBUTE_UNUSED)
12073 {
12074   return plt->vma + 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry) * i;
12075 }
12076
12077
12078 #undef  elf32_bed
12079 #define elf32_bed elf32_arm_symbian_bed
12080
12081 /* The dynamic sections are not allocated on SymbianOS; the postlinker
12082    will process them and then discard them.  */
12083 #undef  ELF_DYNAMIC_SEC_FLAGS
12084 #define ELF_DYNAMIC_SEC_FLAGS \
12085   (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
12086
12087 #undef elf_backend_add_symbol_hook
12088 #undef elf_backend_emit_relocs
12089
12090 #undef  bfd_elf32_bfd_link_hash_table_create
12091 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_symbian_link_hash_table_create
12092 #undef  elf_backend_special_sections
12093 #define elf_backend_special_sections            elf32_arm_symbian_special_sections
12094 #undef  elf_backend_begin_write_processing
12095 #define elf_backend_begin_write_processing      elf32_arm_symbian_begin_write_processing
12096 #undef  elf_backend_final_write_processing
12097 #define elf_backend_final_write_processing      elf32_arm_final_write_processing
12098
12099 #undef  elf_backend_modify_segment_map
12100 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
12101
12102 /* There is no .got section for BPABI objects, and hence no header.  */
12103 #undef  elf_backend_got_header_size
12104 #define elf_backend_got_header_size 0
12105
12106 /* Similarly, there is no .got.plt section.  */
12107 #undef  elf_backend_want_got_plt
12108 #define elf_backend_want_got_plt 0
12109
12110 #undef  elf_backend_plt_sym_val
12111 #define elf_backend_plt_sym_val         elf32_arm_symbian_plt_sym_val
12112
12113 #undef  elf_backend_may_use_rel_p
12114 #define elf_backend_may_use_rel_p       1
12115 #undef  elf_backend_may_use_rela_p
12116 #define elf_backend_may_use_rela_p      0
12117 #undef  elf_backend_default_use_rela_p
12118 #define elf_backend_default_use_rela_p  0
12119 #undef  elf_backend_want_plt_sym
12120 #define elf_backend_want_plt_sym        0
12121 #undef  ELF_MAXPAGESIZE
12122 #define ELF_MAXPAGESIZE                 0x8000
12123
12124 #include "elf32-target.h"