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