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