OSDN Git Service

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