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