Use DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION to silence GCC 8.1
[external/binutils.git] / bfd / elf32-arm.c
1 /* 32-bit ELF support for ARM
2    Copyright (C) 1998-2018 Free Software Foundation, Inc.
3
4    This file is part of BFD, the Binary File Descriptor library.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20
21 #include "sysdep.h"
22 #include <limits.h>
23
24 #include "bfd.h"
25 #include "bfd_stdint.h"
26 #include "libiberty.h"
27 #include "libbfd.h"
28 #include "elf-bfd.h"
29 #include "elf-nacl.h"
30 #include "elf-vxworks.h"
31 #include "elf/arm.h"
32
33 /* Return the relocation section associated with NAME.  HTAB is the
34    bfd's elf32_arm_link_hash_entry.  */
35 #define RELOC_SECTION(HTAB, NAME) \
36   ((HTAB)->use_rel ? ".rel" NAME : ".rela" NAME)
37
38 /* Return size of a relocation entry.  HTAB is the bfd's
39    elf32_arm_link_hash_entry.  */
40 #define RELOC_SIZE(HTAB) \
41   ((HTAB)->use_rel \
42    ? sizeof (Elf32_External_Rel) \
43    : sizeof (Elf32_External_Rela))
44
45 /* Return function to swap relocations in.  HTAB is the bfd's
46    elf32_arm_link_hash_entry.  */
47 #define SWAP_RELOC_IN(HTAB) \
48   ((HTAB)->use_rel \
49    ? bfd_elf32_swap_reloc_in \
50    : bfd_elf32_swap_reloca_in)
51
52 /* Return function to swap relocations out.  HTAB is the bfd's
53    elf32_arm_link_hash_entry.  */
54 #define SWAP_RELOC_OUT(HTAB) \
55   ((HTAB)->use_rel \
56    ? bfd_elf32_swap_reloc_out \
57    : bfd_elf32_swap_reloca_out)
58
59 #define elf_info_to_howto               NULL
60 #define elf_info_to_howto_rel           elf32_arm_info_to_howto
61
62 #define ARM_ELF_ABI_VERSION             0
63 #define ARM_ELF_OS_ABI_VERSION          ELFOSABI_ARM
64
65 /* The Adjusted Place, as defined by AAELF.  */
66 #define Pa(X) ((X) & 0xfffffffc)
67
68 static bfd_boolean elf32_arm_write_section (bfd *output_bfd,
69                                             struct bfd_link_info *link_info,
70                                             asection *sec,
71                                             bfd_byte *contents);
72
73 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
74    R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
75    in that slot.  */
76
77 static reloc_howto_type elf32_arm_howto_table_1[] =
78 {
79   /* No relocation.  */
80   HOWTO (R_ARM_NONE,            /* type */
81          0,                     /* rightshift */
82          3,                     /* size (0 = byte, 1 = short, 2 = long) */
83          0,                     /* bitsize */
84          FALSE,                 /* pc_relative */
85          0,                     /* bitpos */
86          complain_overflow_dont,/* complain_on_overflow */
87          bfd_elf_generic_reloc, /* special_function */
88          "R_ARM_NONE",          /* name */
89          FALSE,                 /* partial_inplace */
90          0,                     /* src_mask */
91          0,                     /* dst_mask */
92          FALSE),                /* pcrel_offset */
93
94   HOWTO (R_ARM_PC24,            /* type */
95          2,                     /* rightshift */
96          2,                     /* size (0 = byte, 1 = short, 2 = long) */
97          24,                    /* bitsize */
98          TRUE,                  /* pc_relative */
99          0,                     /* bitpos */
100          complain_overflow_signed,/* complain_on_overflow */
101          bfd_elf_generic_reloc, /* special_function */
102          "R_ARM_PC24",          /* name */
103          FALSE,                 /* partial_inplace */
104          0x00ffffff,            /* src_mask */
105          0x00ffffff,            /* dst_mask */
106          TRUE),                 /* pcrel_offset */
107
108   /* 32 bit absolute */
109   HOWTO (R_ARM_ABS32,           /* type */
110          0,                     /* rightshift */
111          2,                     /* size (0 = byte, 1 = short, 2 = long) */
112          32,                    /* bitsize */
113          FALSE,                 /* pc_relative */
114          0,                     /* bitpos */
115          complain_overflow_bitfield,/* complain_on_overflow */
116          bfd_elf_generic_reloc, /* special_function */
117          "R_ARM_ABS32",         /* name */
118          FALSE,                 /* partial_inplace */
119          0xffffffff,            /* src_mask */
120          0xffffffff,            /* dst_mask */
121          FALSE),                /* pcrel_offset */
122
123   /* standard 32bit pc-relative reloc */
124   HOWTO (R_ARM_REL32,           /* type */
125          0,                     /* rightshift */
126          2,                     /* size (0 = byte, 1 = short, 2 = long) */
127          32,                    /* bitsize */
128          TRUE,                  /* pc_relative */
129          0,                     /* bitpos */
130          complain_overflow_bitfield,/* complain_on_overflow */
131          bfd_elf_generic_reloc, /* special_function */
132          "R_ARM_REL32",         /* name */
133          FALSE,                 /* partial_inplace */
134          0xffffffff,            /* src_mask */
135          0xffffffff,            /* dst_mask */
136          TRUE),                 /* pcrel_offset */
137
138   /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
139   HOWTO (R_ARM_LDR_PC_G0,       /* type */
140          0,                     /* rightshift */
141          0,                     /* size (0 = byte, 1 = short, 2 = long) */
142          32,                    /* bitsize */
143          TRUE,                  /* pc_relative */
144          0,                     /* bitpos */
145          complain_overflow_dont,/* complain_on_overflow */
146          bfd_elf_generic_reloc, /* special_function */
147          "R_ARM_LDR_PC_G0",     /* name */
148          FALSE,                 /* partial_inplace */
149          0xffffffff,            /* src_mask */
150          0xffffffff,            /* dst_mask */
151          TRUE),                 /* pcrel_offset */
152
153    /* 16 bit absolute */
154   HOWTO (R_ARM_ABS16,           /* type */
155          0,                     /* rightshift */
156          1,                     /* size (0 = byte, 1 = short, 2 = long) */
157          16,                    /* bitsize */
158          FALSE,                 /* pc_relative */
159          0,                     /* bitpos */
160          complain_overflow_bitfield,/* complain_on_overflow */
161          bfd_elf_generic_reloc, /* special_function */
162          "R_ARM_ABS16",         /* name */
163          FALSE,                 /* partial_inplace */
164          0x0000ffff,            /* src_mask */
165          0x0000ffff,            /* dst_mask */
166          FALSE),                /* pcrel_offset */
167
168   /* 12 bit absolute */
169   HOWTO (R_ARM_ABS12,           /* type */
170          0,                     /* rightshift */
171          2,                     /* size (0 = byte, 1 = short, 2 = long) */
172          12,                    /* bitsize */
173          FALSE,                 /* pc_relative */
174          0,                     /* bitpos */
175          complain_overflow_bitfield,/* complain_on_overflow */
176          bfd_elf_generic_reloc, /* special_function */
177          "R_ARM_ABS12",         /* name */
178          FALSE,                 /* partial_inplace */
179          0x00000fff,            /* src_mask */
180          0x00000fff,            /* dst_mask */
181          FALSE),                /* pcrel_offset */
182
183   HOWTO (R_ARM_THM_ABS5,        /* type */
184          6,                     /* rightshift */
185          1,                     /* size (0 = byte, 1 = short, 2 = long) */
186          5,                     /* bitsize */
187          FALSE,                 /* pc_relative */
188          0,                     /* bitpos */
189          complain_overflow_bitfield,/* complain_on_overflow */
190          bfd_elf_generic_reloc, /* special_function */
191          "R_ARM_THM_ABS5",      /* name */
192          FALSE,                 /* partial_inplace */
193          0x000007e0,            /* src_mask */
194          0x000007e0,            /* dst_mask */
195          FALSE),                /* pcrel_offset */
196
197   /* 8 bit absolute */
198   HOWTO (R_ARM_ABS8,            /* type */
199          0,                     /* rightshift */
200          0,                     /* size (0 = byte, 1 = short, 2 = long) */
201          8,                     /* bitsize */
202          FALSE,                 /* pc_relative */
203          0,                     /* bitpos */
204          complain_overflow_bitfield,/* complain_on_overflow */
205          bfd_elf_generic_reloc, /* special_function */
206          "R_ARM_ABS8",          /* name */
207          FALSE,                 /* partial_inplace */
208          0x000000ff,            /* src_mask */
209          0x000000ff,            /* dst_mask */
210          FALSE),                /* pcrel_offset */
211
212   HOWTO (R_ARM_SBREL32,         /* type */
213          0,                     /* rightshift */
214          2,                     /* size (0 = byte, 1 = short, 2 = long) */
215          32,                    /* bitsize */
216          FALSE,                 /* pc_relative */
217          0,                     /* bitpos */
218          complain_overflow_dont,/* complain_on_overflow */
219          bfd_elf_generic_reloc, /* special_function */
220          "R_ARM_SBREL32",       /* name */
221          FALSE,                 /* partial_inplace */
222          0xffffffff,            /* src_mask */
223          0xffffffff,            /* dst_mask */
224          FALSE),                /* pcrel_offset */
225
226   HOWTO (R_ARM_THM_CALL,        /* type */
227          1,                     /* rightshift */
228          2,                     /* size (0 = byte, 1 = short, 2 = long) */
229          24,                    /* bitsize */
230          TRUE,                  /* pc_relative */
231          0,                     /* bitpos */
232          complain_overflow_signed,/* complain_on_overflow */
233          bfd_elf_generic_reloc, /* special_function */
234          "R_ARM_THM_CALL",      /* name */
235          FALSE,                 /* partial_inplace */
236          0x07ff2fff,            /* src_mask */
237          0x07ff2fff,            /* dst_mask */
238          TRUE),                 /* pcrel_offset */
239
240   HOWTO (R_ARM_THM_PC8,         /* type */
241          1,                     /* rightshift */
242          1,                     /* size (0 = byte, 1 = short, 2 = long) */
243          8,                     /* bitsize */
244          TRUE,                  /* pc_relative */
245          0,                     /* bitpos */
246          complain_overflow_signed,/* complain_on_overflow */
247          bfd_elf_generic_reloc, /* special_function */
248          "R_ARM_THM_PC8",       /* name */
249          FALSE,                 /* partial_inplace */
250          0x000000ff,            /* src_mask */
251          0x000000ff,            /* dst_mask */
252          TRUE),                 /* pcrel_offset */
253
254   HOWTO (R_ARM_BREL_ADJ,        /* type */
255          1,                     /* rightshift */
256          1,                     /* size (0 = byte, 1 = short, 2 = long) */
257          32,                    /* bitsize */
258          FALSE,                 /* pc_relative */
259          0,                     /* bitpos */
260          complain_overflow_signed,/* complain_on_overflow */
261          bfd_elf_generic_reloc, /* special_function */
262          "R_ARM_BREL_ADJ",      /* name */
263          FALSE,                 /* partial_inplace */
264          0xffffffff,            /* src_mask */
265          0xffffffff,            /* dst_mask */
266          FALSE),                /* pcrel_offset */
267
268   HOWTO (R_ARM_TLS_DESC,        /* type */
269          0,                     /* rightshift */
270          2,                     /* size (0 = byte, 1 = short, 2 = long) */
271          32,                    /* bitsize */
272          FALSE,                 /* pc_relative */
273          0,                     /* bitpos */
274          complain_overflow_bitfield,/* complain_on_overflow */
275          bfd_elf_generic_reloc, /* special_function */
276          "R_ARM_TLS_DESC",      /* name */
277          FALSE,                 /* partial_inplace */
278          0xffffffff,            /* src_mask */
279          0xffffffff,            /* dst_mask */
280          FALSE),                /* pcrel_offset */
281
282   HOWTO (R_ARM_THM_SWI8,        /* type */
283          0,                     /* rightshift */
284          0,                     /* size (0 = byte, 1 = short, 2 = long) */
285          0,                     /* bitsize */
286          FALSE,                 /* pc_relative */
287          0,                     /* bitpos */
288          complain_overflow_signed,/* complain_on_overflow */
289          bfd_elf_generic_reloc, /* special_function */
290          "R_ARM_SWI8",          /* name */
291          FALSE,                 /* partial_inplace */
292          0x00000000,            /* src_mask */
293          0x00000000,            /* dst_mask */
294          FALSE),                /* pcrel_offset */
295
296   /* BLX instruction for the ARM.  */
297   HOWTO (R_ARM_XPC25,           /* type */
298          2,                     /* rightshift */
299          2,                     /* size (0 = byte, 1 = short, 2 = long) */
300          24,                    /* bitsize */
301          TRUE,                  /* pc_relative */
302          0,                     /* bitpos */
303          complain_overflow_signed,/* complain_on_overflow */
304          bfd_elf_generic_reloc, /* special_function */
305          "R_ARM_XPC25",         /* name */
306          FALSE,                 /* partial_inplace */
307          0x00ffffff,            /* src_mask */
308          0x00ffffff,            /* dst_mask */
309          TRUE),                 /* pcrel_offset */
310
311   /* BLX instruction for the Thumb.  */
312   HOWTO (R_ARM_THM_XPC22,       /* type */
313          2,                     /* rightshift */
314          2,                     /* size (0 = byte, 1 = short, 2 = long) */
315          24,                    /* bitsize */
316          TRUE,                  /* pc_relative */
317          0,                     /* bitpos */
318          complain_overflow_signed,/* complain_on_overflow */
319          bfd_elf_generic_reloc, /* special_function */
320          "R_ARM_THM_XPC22",     /* name */
321          FALSE,                 /* partial_inplace */
322          0x07ff2fff,            /* src_mask */
323          0x07ff2fff,            /* dst_mask */
324          TRUE),                 /* pcrel_offset */
325
326   /* Dynamic TLS relocations.  */
327
328   HOWTO (R_ARM_TLS_DTPMOD32,    /* type */
329          0,                     /* rightshift */
330          2,                     /* size (0 = byte, 1 = short, 2 = long) */
331          32,                    /* bitsize */
332          FALSE,                 /* pc_relative */
333          0,                     /* bitpos */
334          complain_overflow_bitfield,/* complain_on_overflow */
335          bfd_elf_generic_reloc, /* special_function */
336          "R_ARM_TLS_DTPMOD32",  /* name */
337          TRUE,                  /* partial_inplace */
338          0xffffffff,            /* src_mask */
339          0xffffffff,            /* dst_mask */
340          FALSE),                /* pcrel_offset */
341
342   HOWTO (R_ARM_TLS_DTPOFF32,    /* type */
343          0,                     /* rightshift */
344          2,                     /* size (0 = byte, 1 = short, 2 = long) */
345          32,                    /* bitsize */
346          FALSE,                 /* pc_relative */
347          0,                     /* bitpos */
348          complain_overflow_bitfield,/* complain_on_overflow */
349          bfd_elf_generic_reloc, /* special_function */
350          "R_ARM_TLS_DTPOFF32",  /* name */
351          TRUE,                  /* partial_inplace */
352          0xffffffff,            /* src_mask */
353          0xffffffff,            /* dst_mask */
354          FALSE),                /* pcrel_offset */
355
356   HOWTO (R_ARM_TLS_TPOFF32,     /* type */
357          0,                     /* rightshift */
358          2,                     /* size (0 = byte, 1 = short, 2 = long) */
359          32,                    /* bitsize */
360          FALSE,                 /* pc_relative */
361          0,                     /* bitpos */
362          complain_overflow_bitfield,/* complain_on_overflow */
363          bfd_elf_generic_reloc, /* special_function */
364          "R_ARM_TLS_TPOFF32",   /* name */
365          TRUE,                  /* partial_inplace */
366          0xffffffff,            /* src_mask */
367          0xffffffff,            /* dst_mask */
368          FALSE),                /* pcrel_offset */
369
370   /* Relocs used in ARM Linux */
371
372   HOWTO (R_ARM_COPY,            /* type */
373          0,                     /* rightshift */
374          2,                     /* size (0 = byte, 1 = short, 2 = long) */
375          32,                    /* bitsize */
376          FALSE,                 /* pc_relative */
377          0,                     /* bitpos */
378          complain_overflow_bitfield,/* complain_on_overflow */
379          bfd_elf_generic_reloc, /* special_function */
380          "R_ARM_COPY",          /* name */
381          TRUE,                  /* partial_inplace */
382          0xffffffff,            /* src_mask */
383          0xffffffff,            /* dst_mask */
384          FALSE),                /* pcrel_offset */
385
386   HOWTO (R_ARM_GLOB_DAT,        /* type */
387          0,                     /* rightshift */
388          2,                     /* size (0 = byte, 1 = short, 2 = long) */
389          32,                    /* bitsize */
390          FALSE,                 /* pc_relative */
391          0,                     /* bitpos */
392          complain_overflow_bitfield,/* complain_on_overflow */
393          bfd_elf_generic_reloc, /* special_function */
394          "R_ARM_GLOB_DAT",      /* name */
395          TRUE,                  /* partial_inplace */
396          0xffffffff,            /* src_mask */
397          0xffffffff,            /* dst_mask */
398          FALSE),                /* pcrel_offset */
399
400   HOWTO (R_ARM_JUMP_SLOT,       /* type */
401          0,                     /* rightshift */
402          2,                     /* size (0 = byte, 1 = short, 2 = long) */
403          32,                    /* bitsize */
404          FALSE,                 /* pc_relative */
405          0,                     /* bitpos */
406          complain_overflow_bitfield,/* complain_on_overflow */
407          bfd_elf_generic_reloc, /* special_function */
408          "R_ARM_JUMP_SLOT",     /* name */
409          TRUE,                  /* partial_inplace */
410          0xffffffff,            /* src_mask */
411          0xffffffff,            /* dst_mask */
412          FALSE),                /* pcrel_offset */
413
414   HOWTO (R_ARM_RELATIVE,        /* type */
415          0,                     /* rightshift */
416          2,                     /* size (0 = byte, 1 = short, 2 = long) */
417          32,                    /* bitsize */
418          FALSE,                 /* pc_relative */
419          0,                     /* bitpos */
420          complain_overflow_bitfield,/* complain_on_overflow */
421          bfd_elf_generic_reloc, /* special_function */
422          "R_ARM_RELATIVE",      /* name */
423          TRUE,                  /* partial_inplace */
424          0xffffffff,            /* src_mask */
425          0xffffffff,            /* dst_mask */
426          FALSE),                /* pcrel_offset */
427
428   HOWTO (R_ARM_GOTOFF32,        /* type */
429          0,                     /* rightshift */
430          2,                     /* size (0 = byte, 1 = short, 2 = long) */
431          32,                    /* bitsize */
432          FALSE,                 /* pc_relative */
433          0,                     /* bitpos */
434          complain_overflow_bitfield,/* complain_on_overflow */
435          bfd_elf_generic_reloc, /* special_function */
436          "R_ARM_GOTOFF32",      /* name */
437          TRUE,                  /* partial_inplace */
438          0xffffffff,            /* src_mask */
439          0xffffffff,            /* dst_mask */
440          FALSE),                /* pcrel_offset */
441
442   HOWTO (R_ARM_GOTPC,           /* type */
443          0,                     /* rightshift */
444          2,                     /* size (0 = byte, 1 = short, 2 = long) */
445          32,                    /* bitsize */
446          TRUE,                  /* pc_relative */
447          0,                     /* bitpos */
448          complain_overflow_bitfield,/* complain_on_overflow */
449          bfd_elf_generic_reloc, /* special_function */
450          "R_ARM_GOTPC",         /* name */
451          TRUE,                  /* partial_inplace */
452          0xffffffff,            /* src_mask */
453          0xffffffff,            /* dst_mask */
454          TRUE),                 /* pcrel_offset */
455
456   HOWTO (R_ARM_GOT32,           /* type */
457          0,                     /* rightshift */
458          2,                     /* size (0 = byte, 1 = short, 2 = long) */
459          32,                    /* bitsize */
460          FALSE,                 /* pc_relative */
461          0,                     /* bitpos */
462          complain_overflow_bitfield,/* complain_on_overflow */
463          bfd_elf_generic_reloc, /* special_function */
464          "R_ARM_GOT32",         /* name */
465          TRUE,                  /* partial_inplace */
466          0xffffffff,            /* src_mask */
467          0xffffffff,            /* dst_mask */
468          FALSE),                /* pcrel_offset */
469
470   HOWTO (R_ARM_PLT32,           /* type */
471          2,                     /* rightshift */
472          2,                     /* size (0 = byte, 1 = short, 2 = long) */
473          24,                    /* bitsize */
474          TRUE,                  /* pc_relative */
475          0,                     /* bitpos */
476          complain_overflow_bitfield,/* complain_on_overflow */
477          bfd_elf_generic_reloc, /* special_function */
478          "R_ARM_PLT32",         /* name */
479          FALSE,                 /* partial_inplace */
480          0x00ffffff,            /* src_mask */
481          0x00ffffff,            /* dst_mask */
482          TRUE),                 /* pcrel_offset */
483
484   HOWTO (R_ARM_CALL,            /* type */
485          2,                     /* rightshift */
486          2,                     /* size (0 = byte, 1 = short, 2 = long) */
487          24,                    /* bitsize */
488          TRUE,                  /* pc_relative */
489          0,                     /* bitpos */
490          complain_overflow_signed,/* complain_on_overflow */
491          bfd_elf_generic_reloc, /* special_function */
492          "R_ARM_CALL",          /* name */
493          FALSE,                 /* partial_inplace */
494          0x00ffffff,            /* src_mask */
495          0x00ffffff,            /* dst_mask */
496          TRUE),                 /* pcrel_offset */
497
498   HOWTO (R_ARM_JUMP24,          /* type */
499          2,                     /* rightshift */
500          2,                     /* size (0 = byte, 1 = short, 2 = long) */
501          24,                    /* bitsize */
502          TRUE,                  /* pc_relative */
503          0,                     /* bitpos */
504          complain_overflow_signed,/* complain_on_overflow */
505          bfd_elf_generic_reloc, /* special_function */
506          "R_ARM_JUMP24",        /* name */
507          FALSE,                 /* partial_inplace */
508          0x00ffffff,            /* src_mask */
509          0x00ffffff,            /* dst_mask */
510          TRUE),                 /* pcrel_offset */
511
512   HOWTO (R_ARM_THM_JUMP24,      /* type */
513          1,                     /* rightshift */
514          2,                     /* size (0 = byte, 1 = short, 2 = long) */
515          24,                    /* bitsize */
516          TRUE,                  /* pc_relative */
517          0,                     /* bitpos */
518          complain_overflow_signed,/* complain_on_overflow */
519          bfd_elf_generic_reloc, /* special_function */
520          "R_ARM_THM_JUMP24",    /* name */
521          FALSE,                 /* partial_inplace */
522          0x07ff2fff,            /* src_mask */
523          0x07ff2fff,            /* dst_mask */
524          TRUE),                 /* pcrel_offset */
525
526   HOWTO (R_ARM_BASE_ABS,        /* type */
527          0,                     /* rightshift */
528          2,                     /* size (0 = byte, 1 = short, 2 = long) */
529          32,                    /* bitsize */
530          FALSE,                 /* pc_relative */
531          0,                     /* bitpos */
532          complain_overflow_dont,/* complain_on_overflow */
533          bfd_elf_generic_reloc, /* special_function */
534          "R_ARM_BASE_ABS",      /* name */
535          FALSE,                 /* partial_inplace */
536          0xffffffff,            /* src_mask */
537          0xffffffff,            /* dst_mask */
538          FALSE),                /* pcrel_offset */
539
540   HOWTO (R_ARM_ALU_PCREL7_0,    /* type */
541          0,                     /* rightshift */
542          2,                     /* size (0 = byte, 1 = short, 2 = long) */
543          12,                    /* bitsize */
544          TRUE,                  /* pc_relative */
545          0,                     /* bitpos */
546          complain_overflow_dont,/* complain_on_overflow */
547          bfd_elf_generic_reloc, /* special_function */
548          "R_ARM_ALU_PCREL_7_0", /* name */
549          FALSE,                 /* partial_inplace */
550          0x00000fff,            /* src_mask */
551          0x00000fff,            /* dst_mask */
552          TRUE),                 /* pcrel_offset */
553
554   HOWTO (R_ARM_ALU_PCREL15_8,   /* type */
555          0,                     /* rightshift */
556          2,                     /* size (0 = byte, 1 = short, 2 = long) */
557          12,                    /* bitsize */
558          TRUE,                  /* pc_relative */
559          8,                     /* bitpos */
560          complain_overflow_dont,/* complain_on_overflow */
561          bfd_elf_generic_reloc, /* special_function */
562          "R_ARM_ALU_PCREL_15_8",/* name */
563          FALSE,                 /* partial_inplace */
564          0x00000fff,            /* src_mask */
565          0x00000fff,            /* dst_mask */
566          TRUE),                 /* pcrel_offset */
567
568   HOWTO (R_ARM_ALU_PCREL23_15,  /* type */
569          0,                     /* rightshift */
570          2,                     /* size (0 = byte, 1 = short, 2 = long) */
571          12,                    /* bitsize */
572          TRUE,                  /* pc_relative */
573          16,                    /* bitpos */
574          complain_overflow_dont,/* complain_on_overflow */
575          bfd_elf_generic_reloc, /* special_function */
576          "R_ARM_ALU_PCREL_23_15",/* name */
577          FALSE,                 /* partial_inplace */
578          0x00000fff,            /* src_mask */
579          0x00000fff,            /* dst_mask */
580          TRUE),                 /* pcrel_offset */
581
582   HOWTO (R_ARM_LDR_SBREL_11_0,  /* type */
583          0,                     /* rightshift */
584          2,                     /* size (0 = byte, 1 = short, 2 = long) */
585          12,                    /* bitsize */
586          FALSE,                 /* pc_relative */
587          0,                     /* bitpos */
588          complain_overflow_dont,/* complain_on_overflow */
589          bfd_elf_generic_reloc, /* special_function */
590          "R_ARM_LDR_SBREL_11_0",/* name */
591          FALSE,                 /* partial_inplace */
592          0x00000fff,            /* src_mask */
593          0x00000fff,            /* dst_mask */
594          FALSE),                /* pcrel_offset */
595
596   HOWTO (R_ARM_ALU_SBREL_19_12, /* type */
597          0,                     /* rightshift */
598          2,                     /* size (0 = byte, 1 = short, 2 = long) */
599          8,                     /* bitsize */
600          FALSE,                 /* pc_relative */
601          12,                    /* bitpos */
602          complain_overflow_dont,/* complain_on_overflow */
603          bfd_elf_generic_reloc, /* special_function */
604          "R_ARM_ALU_SBREL_19_12",/* name */
605          FALSE,                 /* partial_inplace */
606          0x000ff000,            /* src_mask */
607          0x000ff000,            /* dst_mask */
608          FALSE),                /* pcrel_offset */
609
610   HOWTO (R_ARM_ALU_SBREL_27_20, /* type */
611          0,                     /* rightshift */
612          2,                     /* size (0 = byte, 1 = short, 2 = long) */
613          8,                     /* bitsize */
614          FALSE,                 /* pc_relative */
615          20,                    /* bitpos */
616          complain_overflow_dont,/* complain_on_overflow */
617          bfd_elf_generic_reloc, /* special_function */
618          "R_ARM_ALU_SBREL_27_20",/* name */
619          FALSE,                 /* partial_inplace */
620          0x0ff00000,            /* src_mask */
621          0x0ff00000,            /* dst_mask */
622          FALSE),                /* pcrel_offset */
623
624   HOWTO (R_ARM_TARGET1,         /* type */
625          0,                     /* rightshift */
626          2,                     /* size (0 = byte, 1 = short, 2 = long) */
627          32,                    /* bitsize */
628          FALSE,                 /* pc_relative */
629          0,                     /* bitpos */
630          complain_overflow_dont,/* complain_on_overflow */
631          bfd_elf_generic_reloc, /* special_function */
632          "R_ARM_TARGET1",       /* name */
633          FALSE,                 /* partial_inplace */
634          0xffffffff,            /* src_mask */
635          0xffffffff,            /* dst_mask */
636          FALSE),                /* pcrel_offset */
637
638   HOWTO (R_ARM_ROSEGREL32,      /* type */
639          0,                     /* rightshift */
640          2,                     /* size (0 = byte, 1 = short, 2 = long) */
641          32,                    /* bitsize */
642          FALSE,                 /* pc_relative */
643          0,                     /* bitpos */
644          complain_overflow_dont,/* complain_on_overflow */
645          bfd_elf_generic_reloc, /* special_function */
646          "R_ARM_ROSEGREL32",    /* name */
647          FALSE,                 /* partial_inplace */
648          0xffffffff,            /* src_mask */
649          0xffffffff,            /* dst_mask */
650          FALSE),                /* pcrel_offset */
651
652   HOWTO (R_ARM_V4BX,            /* type */
653          0,                     /* rightshift */
654          2,                     /* size (0 = byte, 1 = short, 2 = long) */
655          32,                    /* bitsize */
656          FALSE,                 /* pc_relative */
657          0,                     /* bitpos */
658          complain_overflow_dont,/* complain_on_overflow */
659          bfd_elf_generic_reloc, /* special_function */
660          "R_ARM_V4BX",          /* name */
661          FALSE,                 /* partial_inplace */
662          0xffffffff,            /* src_mask */
663          0xffffffff,            /* dst_mask */
664          FALSE),                /* pcrel_offset */
665
666   HOWTO (R_ARM_TARGET2,         /* type */
667          0,                     /* rightshift */
668          2,                     /* size (0 = byte, 1 = short, 2 = long) */
669          32,                    /* bitsize */
670          FALSE,                 /* pc_relative */
671          0,                     /* bitpos */
672          complain_overflow_signed,/* complain_on_overflow */
673          bfd_elf_generic_reloc, /* special_function */
674          "R_ARM_TARGET2",       /* name */
675          FALSE,                 /* partial_inplace */
676          0xffffffff,            /* src_mask */
677          0xffffffff,            /* dst_mask */
678          TRUE),                 /* pcrel_offset */
679
680   HOWTO (R_ARM_PREL31,          /* type */
681          0,                     /* rightshift */
682          2,                     /* size (0 = byte, 1 = short, 2 = long) */
683          31,                    /* bitsize */
684          TRUE,                  /* pc_relative */
685          0,                     /* bitpos */
686          complain_overflow_signed,/* complain_on_overflow */
687          bfd_elf_generic_reloc, /* special_function */
688          "R_ARM_PREL31",        /* name */
689          FALSE,                 /* partial_inplace */
690          0x7fffffff,            /* src_mask */
691          0x7fffffff,            /* dst_mask */
692          TRUE),                 /* pcrel_offset */
693
694   HOWTO (R_ARM_MOVW_ABS_NC,     /* type */
695          0,                     /* rightshift */
696          2,                     /* size (0 = byte, 1 = short, 2 = long) */
697          16,                    /* bitsize */
698          FALSE,                 /* pc_relative */
699          0,                     /* bitpos */
700          complain_overflow_dont,/* complain_on_overflow */
701          bfd_elf_generic_reloc, /* special_function */
702          "R_ARM_MOVW_ABS_NC",   /* name */
703          FALSE,                 /* partial_inplace */
704          0x000f0fff,            /* src_mask */
705          0x000f0fff,            /* dst_mask */
706          FALSE),                /* pcrel_offset */
707
708   HOWTO (R_ARM_MOVT_ABS,        /* type */
709          0,                     /* rightshift */
710          2,                     /* size (0 = byte, 1 = short, 2 = long) */
711          16,                    /* bitsize */
712          FALSE,                 /* pc_relative */
713          0,                     /* bitpos */
714          complain_overflow_bitfield,/* complain_on_overflow */
715          bfd_elf_generic_reloc, /* special_function */
716          "R_ARM_MOVT_ABS",      /* name */
717          FALSE,                 /* partial_inplace */
718          0x000f0fff,            /* src_mask */
719          0x000f0fff,            /* dst_mask */
720          FALSE),                /* pcrel_offset */
721
722   HOWTO (R_ARM_MOVW_PREL_NC,    /* type */
723          0,                     /* rightshift */
724          2,                     /* size (0 = byte, 1 = short, 2 = long) */
725          16,                    /* bitsize */
726          TRUE,                  /* pc_relative */
727          0,                     /* bitpos */
728          complain_overflow_dont,/* complain_on_overflow */
729          bfd_elf_generic_reloc, /* special_function */
730          "R_ARM_MOVW_PREL_NC",  /* name */
731          FALSE,                 /* partial_inplace */
732          0x000f0fff,            /* src_mask */
733          0x000f0fff,            /* dst_mask */
734          TRUE),                 /* pcrel_offset */
735
736   HOWTO (R_ARM_MOVT_PREL,       /* type */
737          0,                     /* rightshift */
738          2,                     /* size (0 = byte, 1 = short, 2 = long) */
739          16,                    /* bitsize */
740          TRUE,                  /* pc_relative */
741          0,                     /* bitpos */
742          complain_overflow_bitfield,/* complain_on_overflow */
743          bfd_elf_generic_reloc, /* special_function */
744          "R_ARM_MOVT_PREL",     /* name */
745          FALSE,                 /* partial_inplace */
746          0x000f0fff,            /* src_mask */
747          0x000f0fff,            /* dst_mask */
748          TRUE),                 /* pcrel_offset */
749
750   HOWTO (R_ARM_THM_MOVW_ABS_NC, /* type */
751          0,                     /* rightshift */
752          2,                     /* size (0 = byte, 1 = short, 2 = long) */
753          16,                    /* bitsize */
754          FALSE,                 /* pc_relative */
755          0,                     /* bitpos */
756          complain_overflow_dont,/* complain_on_overflow */
757          bfd_elf_generic_reloc, /* special_function */
758          "R_ARM_THM_MOVW_ABS_NC",/* name */
759          FALSE,                 /* partial_inplace */
760          0x040f70ff,            /* src_mask */
761          0x040f70ff,            /* dst_mask */
762          FALSE),                /* pcrel_offset */
763
764   HOWTO (R_ARM_THM_MOVT_ABS,    /* type */
765          0,                     /* rightshift */
766          2,                     /* size (0 = byte, 1 = short, 2 = long) */
767          16,                    /* bitsize */
768          FALSE,                 /* pc_relative */
769          0,                     /* bitpos */
770          complain_overflow_bitfield,/* complain_on_overflow */
771          bfd_elf_generic_reloc, /* special_function */
772          "R_ARM_THM_MOVT_ABS",  /* name */
773          FALSE,                 /* partial_inplace */
774          0x040f70ff,            /* src_mask */
775          0x040f70ff,            /* dst_mask */
776          FALSE),                /* pcrel_offset */
777
778   HOWTO (R_ARM_THM_MOVW_PREL_NC,/* type */
779          0,                     /* rightshift */
780          2,                     /* size (0 = byte, 1 = short, 2 = long) */
781          16,                    /* bitsize */
782          TRUE,                  /* pc_relative */
783          0,                     /* bitpos */
784          complain_overflow_dont,/* complain_on_overflow */
785          bfd_elf_generic_reloc, /* special_function */
786          "R_ARM_THM_MOVW_PREL_NC",/* name */
787          FALSE,                 /* partial_inplace */
788          0x040f70ff,            /* src_mask */
789          0x040f70ff,            /* dst_mask */
790          TRUE),                 /* pcrel_offset */
791
792   HOWTO (R_ARM_THM_MOVT_PREL,   /* type */
793          0,                     /* rightshift */
794          2,                     /* size (0 = byte, 1 = short, 2 = long) */
795          16,                    /* bitsize */
796          TRUE,                  /* pc_relative */
797          0,                     /* bitpos */
798          complain_overflow_bitfield,/* complain_on_overflow */
799          bfd_elf_generic_reloc, /* special_function */
800          "R_ARM_THM_MOVT_PREL", /* name */
801          FALSE,                 /* partial_inplace */
802          0x040f70ff,            /* src_mask */
803          0x040f70ff,            /* dst_mask */
804          TRUE),                 /* pcrel_offset */
805
806   HOWTO (R_ARM_THM_JUMP19,      /* type */
807          1,                     /* rightshift */
808          2,                     /* size (0 = byte, 1 = short, 2 = long) */
809          19,                    /* bitsize */
810          TRUE,                  /* pc_relative */
811          0,                     /* bitpos */
812          complain_overflow_signed,/* complain_on_overflow */
813          bfd_elf_generic_reloc, /* special_function */
814          "R_ARM_THM_JUMP19",    /* name */
815          FALSE,                 /* partial_inplace */
816          0x043f2fff,            /* src_mask */
817          0x043f2fff,            /* dst_mask */
818          TRUE),                 /* pcrel_offset */
819
820   HOWTO (R_ARM_THM_JUMP6,       /* type */
821          1,                     /* rightshift */
822          1,                     /* size (0 = byte, 1 = short, 2 = long) */
823          6,                     /* bitsize */
824          TRUE,                  /* pc_relative */
825          0,                     /* bitpos */
826          complain_overflow_unsigned,/* complain_on_overflow */
827          bfd_elf_generic_reloc, /* special_function */
828          "R_ARM_THM_JUMP6",     /* name */
829          FALSE,                 /* partial_inplace */
830          0x02f8,                /* src_mask */
831          0x02f8,                /* dst_mask */
832          TRUE),                 /* pcrel_offset */
833
834   /* These are declared as 13-bit signed relocations because we can
835      address -4095 .. 4095(base) by altering ADDW to SUBW or vice
836      versa.  */
837   HOWTO (R_ARM_THM_ALU_PREL_11_0,/* type */
838          0,                     /* rightshift */
839          2,                     /* size (0 = byte, 1 = short, 2 = long) */
840          13,                    /* bitsize */
841          TRUE,                  /* pc_relative */
842          0,                     /* bitpos */
843          complain_overflow_dont,/* complain_on_overflow */
844          bfd_elf_generic_reloc, /* special_function */
845          "R_ARM_THM_ALU_PREL_11_0",/* name */
846          FALSE,                 /* partial_inplace */
847          0xffffffff,            /* src_mask */
848          0xffffffff,            /* dst_mask */
849          TRUE),                 /* pcrel_offset */
850
851   HOWTO (R_ARM_THM_PC12,        /* type */
852          0,                     /* rightshift */
853          2,                     /* size (0 = byte, 1 = short, 2 = long) */
854          13,                    /* bitsize */
855          TRUE,                  /* pc_relative */
856          0,                     /* bitpos */
857          complain_overflow_dont,/* complain_on_overflow */
858          bfd_elf_generic_reloc, /* special_function */
859          "R_ARM_THM_PC12",      /* name */
860          FALSE,                 /* partial_inplace */
861          0xffffffff,            /* src_mask */
862          0xffffffff,            /* dst_mask */
863          TRUE),                 /* pcrel_offset */
864
865   HOWTO (R_ARM_ABS32_NOI,       /* type */
866          0,                     /* rightshift */
867          2,                     /* size (0 = byte, 1 = short, 2 = long) */
868          32,                    /* bitsize */
869          FALSE,                 /* pc_relative */
870          0,                     /* bitpos */
871          complain_overflow_dont,/* complain_on_overflow */
872          bfd_elf_generic_reloc, /* special_function */
873          "R_ARM_ABS32_NOI",     /* name */
874          FALSE,                 /* partial_inplace */
875          0xffffffff,            /* src_mask */
876          0xffffffff,            /* dst_mask */
877          FALSE),                /* pcrel_offset */
878
879   HOWTO (R_ARM_REL32_NOI,       /* type */
880          0,                     /* rightshift */
881          2,                     /* size (0 = byte, 1 = short, 2 = long) */
882          32,                    /* bitsize */
883          TRUE,                  /* pc_relative */
884          0,                     /* bitpos */
885          complain_overflow_dont,/* complain_on_overflow */
886          bfd_elf_generic_reloc, /* special_function */
887          "R_ARM_REL32_NOI",     /* name */
888          FALSE,                 /* partial_inplace */
889          0xffffffff,            /* src_mask */
890          0xffffffff,            /* dst_mask */
891          FALSE),                /* pcrel_offset */
892
893   /* Group relocations.  */
894
895   HOWTO (R_ARM_ALU_PC_G0_NC,    /* type */
896          0,                     /* rightshift */
897          2,                     /* size (0 = byte, 1 = short, 2 = long) */
898          32,                    /* bitsize */
899          TRUE,                  /* pc_relative */
900          0,                     /* bitpos */
901          complain_overflow_dont,/* complain_on_overflow */
902          bfd_elf_generic_reloc, /* special_function */
903          "R_ARM_ALU_PC_G0_NC",  /* name */
904          FALSE,                 /* partial_inplace */
905          0xffffffff,            /* src_mask */
906          0xffffffff,            /* dst_mask */
907          TRUE),                 /* pcrel_offset */
908
909   HOWTO (R_ARM_ALU_PC_G0,       /* type */
910          0,                     /* rightshift */
911          2,                     /* size (0 = byte, 1 = short, 2 = long) */
912          32,                    /* bitsize */
913          TRUE,                  /* pc_relative */
914          0,                     /* bitpos */
915          complain_overflow_dont,/* complain_on_overflow */
916          bfd_elf_generic_reloc, /* special_function */
917          "R_ARM_ALU_PC_G0",     /* name */
918          FALSE,                 /* partial_inplace */
919          0xffffffff,            /* src_mask */
920          0xffffffff,            /* dst_mask */
921          TRUE),                 /* pcrel_offset */
922
923   HOWTO (R_ARM_ALU_PC_G1_NC,    /* type */
924          0,                     /* rightshift */
925          2,                     /* size (0 = byte, 1 = short, 2 = long) */
926          32,                    /* bitsize */
927          TRUE,                  /* pc_relative */
928          0,                     /* bitpos */
929          complain_overflow_dont,/* complain_on_overflow */
930          bfd_elf_generic_reloc, /* special_function */
931          "R_ARM_ALU_PC_G1_NC",  /* name */
932          FALSE,                 /* partial_inplace */
933          0xffffffff,            /* src_mask */
934          0xffffffff,            /* dst_mask */
935          TRUE),                 /* pcrel_offset */
936
937   HOWTO (R_ARM_ALU_PC_G1,       /* type */
938          0,                     /* rightshift */
939          2,                     /* size (0 = byte, 1 = short, 2 = long) */
940          32,                    /* bitsize */
941          TRUE,                  /* pc_relative */
942          0,                     /* bitpos */
943          complain_overflow_dont,/* complain_on_overflow */
944          bfd_elf_generic_reloc, /* special_function */
945          "R_ARM_ALU_PC_G1",     /* name */
946          FALSE,                 /* partial_inplace */
947          0xffffffff,            /* src_mask */
948          0xffffffff,            /* dst_mask */
949          TRUE),                 /* pcrel_offset */
950
951   HOWTO (R_ARM_ALU_PC_G2,       /* type */
952          0,                     /* rightshift */
953          2,                     /* size (0 = byte, 1 = short, 2 = long) */
954          32,                    /* bitsize */
955          TRUE,                  /* pc_relative */
956          0,                     /* bitpos */
957          complain_overflow_dont,/* complain_on_overflow */
958          bfd_elf_generic_reloc, /* special_function */
959          "R_ARM_ALU_PC_G2",     /* name */
960          FALSE,                 /* partial_inplace */
961          0xffffffff,            /* src_mask */
962          0xffffffff,            /* dst_mask */
963          TRUE),                 /* pcrel_offset */
964
965   HOWTO (R_ARM_LDR_PC_G1,       /* type */
966          0,                     /* rightshift */
967          2,                     /* size (0 = byte, 1 = short, 2 = long) */
968          32,                    /* bitsize */
969          TRUE,                  /* pc_relative */
970          0,                     /* bitpos */
971          complain_overflow_dont,/* complain_on_overflow */
972          bfd_elf_generic_reloc, /* special_function */
973          "R_ARM_LDR_PC_G1",     /* name */
974          FALSE,                 /* partial_inplace */
975          0xffffffff,            /* src_mask */
976          0xffffffff,            /* dst_mask */
977          TRUE),                 /* pcrel_offset */
978
979   HOWTO (R_ARM_LDR_PC_G2,       /* type */
980          0,                     /* rightshift */
981          2,                     /* size (0 = byte, 1 = short, 2 = long) */
982          32,                    /* bitsize */
983          TRUE,                  /* pc_relative */
984          0,                     /* bitpos */
985          complain_overflow_dont,/* complain_on_overflow */
986          bfd_elf_generic_reloc, /* special_function */
987          "R_ARM_LDR_PC_G2",     /* name */
988          FALSE,                 /* partial_inplace */
989          0xffffffff,            /* src_mask */
990          0xffffffff,            /* dst_mask */
991          TRUE),                 /* pcrel_offset */
992
993   HOWTO (R_ARM_LDRS_PC_G0,      /* type */
994          0,                     /* rightshift */
995          2,                     /* size (0 = byte, 1 = short, 2 = long) */
996          32,                    /* bitsize */
997          TRUE,                  /* pc_relative */
998          0,                     /* bitpos */
999          complain_overflow_dont,/* complain_on_overflow */
1000          bfd_elf_generic_reloc, /* special_function */
1001          "R_ARM_LDRS_PC_G0",    /* name */
1002          FALSE,                 /* partial_inplace */
1003          0xffffffff,            /* src_mask */
1004          0xffffffff,            /* dst_mask */
1005          TRUE),                 /* pcrel_offset */
1006
1007   HOWTO (R_ARM_LDRS_PC_G1,      /* type */
1008          0,                     /* rightshift */
1009          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1010          32,                    /* bitsize */
1011          TRUE,                  /* pc_relative */
1012          0,                     /* bitpos */
1013          complain_overflow_dont,/* complain_on_overflow */
1014          bfd_elf_generic_reloc, /* special_function */
1015          "R_ARM_LDRS_PC_G1",    /* name */
1016          FALSE,                 /* partial_inplace */
1017          0xffffffff,            /* src_mask */
1018          0xffffffff,            /* dst_mask */
1019          TRUE),                 /* pcrel_offset */
1020
1021   HOWTO (R_ARM_LDRS_PC_G2,      /* type */
1022          0,                     /* rightshift */
1023          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1024          32,                    /* bitsize */
1025          TRUE,                  /* pc_relative */
1026          0,                     /* bitpos */
1027          complain_overflow_dont,/* complain_on_overflow */
1028          bfd_elf_generic_reloc, /* special_function */
1029          "R_ARM_LDRS_PC_G2",    /* name */
1030          FALSE,                 /* partial_inplace */
1031          0xffffffff,            /* src_mask */
1032          0xffffffff,            /* dst_mask */
1033          TRUE),                 /* pcrel_offset */
1034
1035   HOWTO (R_ARM_LDC_PC_G0,       /* type */
1036          0,                     /* rightshift */
1037          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1038          32,                    /* bitsize */
1039          TRUE,                  /* pc_relative */
1040          0,                     /* bitpos */
1041          complain_overflow_dont,/* complain_on_overflow */
1042          bfd_elf_generic_reloc, /* special_function */
1043          "R_ARM_LDC_PC_G0",     /* name */
1044          FALSE,                 /* partial_inplace */
1045          0xffffffff,            /* src_mask */
1046          0xffffffff,            /* dst_mask */
1047          TRUE),                 /* pcrel_offset */
1048
1049   HOWTO (R_ARM_LDC_PC_G1,       /* type */
1050          0,                     /* rightshift */
1051          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1052          32,                    /* bitsize */
1053          TRUE,                  /* pc_relative */
1054          0,                     /* bitpos */
1055          complain_overflow_dont,/* complain_on_overflow */
1056          bfd_elf_generic_reloc, /* special_function */
1057          "R_ARM_LDC_PC_G1",     /* name */
1058          FALSE,                 /* partial_inplace */
1059          0xffffffff,            /* src_mask */
1060          0xffffffff,            /* dst_mask */
1061          TRUE),                 /* pcrel_offset */
1062
1063   HOWTO (R_ARM_LDC_PC_G2,       /* type */
1064          0,                     /* rightshift */
1065          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1066          32,                    /* bitsize */
1067          TRUE,                  /* pc_relative */
1068          0,                     /* bitpos */
1069          complain_overflow_dont,/* complain_on_overflow */
1070          bfd_elf_generic_reloc, /* special_function */
1071          "R_ARM_LDC_PC_G2",     /* name */
1072          FALSE,                 /* partial_inplace */
1073          0xffffffff,            /* src_mask */
1074          0xffffffff,            /* dst_mask */
1075          TRUE),                 /* pcrel_offset */
1076
1077   HOWTO (R_ARM_ALU_SB_G0_NC,    /* type */
1078          0,                     /* rightshift */
1079          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1080          32,                    /* bitsize */
1081          TRUE,                  /* pc_relative */
1082          0,                     /* bitpos */
1083          complain_overflow_dont,/* complain_on_overflow */
1084          bfd_elf_generic_reloc, /* special_function */
1085          "R_ARM_ALU_SB_G0_NC",  /* name */
1086          FALSE,                 /* partial_inplace */
1087          0xffffffff,            /* src_mask */
1088          0xffffffff,            /* dst_mask */
1089          TRUE),                 /* pcrel_offset */
1090
1091   HOWTO (R_ARM_ALU_SB_G0,       /* type */
1092          0,                     /* rightshift */
1093          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1094          32,                    /* bitsize */
1095          TRUE,                  /* pc_relative */
1096          0,                     /* bitpos */
1097          complain_overflow_dont,/* complain_on_overflow */
1098          bfd_elf_generic_reloc, /* special_function */
1099          "R_ARM_ALU_SB_G0",     /* name */
1100          FALSE,                 /* partial_inplace */
1101          0xffffffff,            /* src_mask */
1102          0xffffffff,            /* dst_mask */
1103          TRUE),                 /* pcrel_offset */
1104
1105   HOWTO (R_ARM_ALU_SB_G1_NC,    /* type */
1106          0,                     /* rightshift */
1107          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1108          32,                    /* bitsize */
1109          TRUE,                  /* pc_relative */
1110          0,                     /* bitpos */
1111          complain_overflow_dont,/* complain_on_overflow */
1112          bfd_elf_generic_reloc, /* special_function */
1113          "R_ARM_ALU_SB_G1_NC",  /* name */
1114          FALSE,                 /* partial_inplace */
1115          0xffffffff,            /* src_mask */
1116          0xffffffff,            /* dst_mask */
1117          TRUE),                 /* pcrel_offset */
1118
1119   HOWTO (R_ARM_ALU_SB_G1,       /* type */
1120          0,                     /* rightshift */
1121          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1122          32,                    /* bitsize */
1123          TRUE,                  /* pc_relative */
1124          0,                     /* bitpos */
1125          complain_overflow_dont,/* complain_on_overflow */
1126          bfd_elf_generic_reloc, /* special_function */
1127          "R_ARM_ALU_SB_G1",     /* name */
1128          FALSE,                 /* partial_inplace */
1129          0xffffffff,            /* src_mask */
1130          0xffffffff,            /* dst_mask */
1131          TRUE),                 /* pcrel_offset */
1132
1133   HOWTO (R_ARM_ALU_SB_G2,       /* type */
1134          0,                     /* rightshift */
1135          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1136          32,                    /* bitsize */
1137          TRUE,                  /* pc_relative */
1138          0,                     /* bitpos */
1139          complain_overflow_dont,/* complain_on_overflow */
1140          bfd_elf_generic_reloc, /* special_function */
1141          "R_ARM_ALU_SB_G2",     /* name */
1142          FALSE,                 /* partial_inplace */
1143          0xffffffff,            /* src_mask */
1144          0xffffffff,            /* dst_mask */
1145          TRUE),                 /* pcrel_offset */
1146
1147   HOWTO (R_ARM_LDR_SB_G0,       /* type */
1148          0,                     /* rightshift */
1149          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1150          32,                    /* bitsize */
1151          TRUE,                  /* pc_relative */
1152          0,                     /* bitpos */
1153          complain_overflow_dont,/* complain_on_overflow */
1154          bfd_elf_generic_reloc, /* special_function */
1155          "R_ARM_LDR_SB_G0",     /* name */
1156          FALSE,                 /* partial_inplace */
1157          0xffffffff,            /* src_mask */
1158          0xffffffff,            /* dst_mask */
1159          TRUE),                 /* pcrel_offset */
1160
1161   HOWTO (R_ARM_LDR_SB_G1,       /* type */
1162          0,                     /* rightshift */
1163          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1164          32,                    /* bitsize */
1165          TRUE,                  /* pc_relative */
1166          0,                     /* bitpos */
1167          complain_overflow_dont,/* complain_on_overflow */
1168          bfd_elf_generic_reloc, /* special_function */
1169          "R_ARM_LDR_SB_G1",     /* name */
1170          FALSE,                 /* partial_inplace */
1171          0xffffffff,            /* src_mask */
1172          0xffffffff,            /* dst_mask */
1173          TRUE),                 /* pcrel_offset */
1174
1175   HOWTO (R_ARM_LDR_SB_G2,       /* type */
1176          0,                     /* rightshift */
1177          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1178          32,                    /* bitsize */
1179          TRUE,                  /* pc_relative */
1180          0,                     /* bitpos */
1181          complain_overflow_dont,/* complain_on_overflow */
1182          bfd_elf_generic_reloc, /* special_function */
1183          "R_ARM_LDR_SB_G2",     /* name */
1184          FALSE,                 /* partial_inplace */
1185          0xffffffff,            /* src_mask */
1186          0xffffffff,            /* dst_mask */
1187          TRUE),                 /* pcrel_offset */
1188
1189   HOWTO (R_ARM_LDRS_SB_G0,      /* type */
1190          0,                     /* rightshift */
1191          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1192          32,                    /* bitsize */
1193          TRUE,                  /* pc_relative */
1194          0,                     /* bitpos */
1195          complain_overflow_dont,/* complain_on_overflow */
1196          bfd_elf_generic_reloc, /* special_function */
1197          "R_ARM_LDRS_SB_G0",    /* name */
1198          FALSE,                 /* partial_inplace */
1199          0xffffffff,            /* src_mask */
1200          0xffffffff,            /* dst_mask */
1201          TRUE),                 /* pcrel_offset */
1202
1203   HOWTO (R_ARM_LDRS_SB_G1,      /* type */
1204          0,                     /* rightshift */
1205          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1206          32,                    /* bitsize */
1207          TRUE,                  /* pc_relative */
1208          0,                     /* bitpos */
1209          complain_overflow_dont,/* complain_on_overflow */
1210          bfd_elf_generic_reloc, /* special_function */
1211          "R_ARM_LDRS_SB_G1",    /* name */
1212          FALSE,                 /* partial_inplace */
1213          0xffffffff,            /* src_mask */
1214          0xffffffff,            /* dst_mask */
1215          TRUE),                 /* pcrel_offset */
1216
1217   HOWTO (R_ARM_LDRS_SB_G2,      /* type */
1218          0,                     /* rightshift */
1219          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1220          32,                    /* bitsize */
1221          TRUE,                  /* pc_relative */
1222          0,                     /* bitpos */
1223          complain_overflow_dont,/* complain_on_overflow */
1224          bfd_elf_generic_reloc, /* special_function */
1225          "R_ARM_LDRS_SB_G2",    /* name */
1226          FALSE,                 /* partial_inplace */
1227          0xffffffff,            /* src_mask */
1228          0xffffffff,            /* dst_mask */
1229          TRUE),                 /* pcrel_offset */
1230
1231   HOWTO (R_ARM_LDC_SB_G0,       /* type */
1232          0,                     /* rightshift */
1233          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1234          32,                    /* bitsize */
1235          TRUE,                  /* pc_relative */
1236          0,                     /* bitpos */
1237          complain_overflow_dont,/* complain_on_overflow */
1238          bfd_elf_generic_reloc, /* special_function */
1239          "R_ARM_LDC_SB_G0",     /* name */
1240          FALSE,                 /* partial_inplace */
1241          0xffffffff,            /* src_mask */
1242          0xffffffff,            /* dst_mask */
1243          TRUE),                 /* pcrel_offset */
1244
1245   HOWTO (R_ARM_LDC_SB_G1,       /* type */
1246          0,                     /* rightshift */
1247          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1248          32,                    /* bitsize */
1249          TRUE,                  /* pc_relative */
1250          0,                     /* bitpos */
1251          complain_overflow_dont,/* complain_on_overflow */
1252          bfd_elf_generic_reloc, /* special_function */
1253          "R_ARM_LDC_SB_G1",     /* name */
1254          FALSE,                 /* partial_inplace */
1255          0xffffffff,            /* src_mask */
1256          0xffffffff,            /* dst_mask */
1257          TRUE),                 /* pcrel_offset */
1258
1259   HOWTO (R_ARM_LDC_SB_G2,       /* type */
1260          0,                     /* rightshift */
1261          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1262          32,                    /* bitsize */
1263          TRUE,                  /* pc_relative */
1264          0,                     /* bitpos */
1265          complain_overflow_dont,/* complain_on_overflow */
1266          bfd_elf_generic_reloc, /* special_function */
1267          "R_ARM_LDC_SB_G2",     /* name */
1268          FALSE,                 /* partial_inplace */
1269          0xffffffff,            /* src_mask */
1270          0xffffffff,            /* dst_mask */
1271          TRUE),                 /* pcrel_offset */
1272
1273   /* End of group relocations.  */
1274
1275   HOWTO (R_ARM_MOVW_BREL_NC,    /* type */
1276          0,                     /* rightshift */
1277          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1278          16,                    /* bitsize */
1279          FALSE,                 /* pc_relative */
1280          0,                     /* bitpos */
1281          complain_overflow_dont,/* complain_on_overflow */
1282          bfd_elf_generic_reloc, /* special_function */
1283          "R_ARM_MOVW_BREL_NC",  /* name */
1284          FALSE,                 /* partial_inplace */
1285          0x0000ffff,            /* src_mask */
1286          0x0000ffff,            /* dst_mask */
1287          FALSE),                /* pcrel_offset */
1288
1289   HOWTO (R_ARM_MOVT_BREL,       /* type */
1290          0,                     /* rightshift */
1291          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1292          16,                    /* bitsize */
1293          FALSE,                 /* pc_relative */
1294          0,                     /* bitpos */
1295          complain_overflow_bitfield,/* complain_on_overflow */
1296          bfd_elf_generic_reloc, /* special_function */
1297          "R_ARM_MOVT_BREL",     /* name */
1298          FALSE,                 /* partial_inplace */
1299          0x0000ffff,            /* src_mask */
1300          0x0000ffff,            /* dst_mask */
1301          FALSE),                /* pcrel_offset */
1302
1303   HOWTO (R_ARM_MOVW_BREL,       /* type */
1304          0,                     /* rightshift */
1305          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1306          16,                    /* bitsize */
1307          FALSE,                 /* pc_relative */
1308          0,                     /* bitpos */
1309          complain_overflow_dont,/* complain_on_overflow */
1310          bfd_elf_generic_reloc, /* special_function */
1311          "R_ARM_MOVW_BREL",     /* name */
1312          FALSE,                 /* partial_inplace */
1313          0x0000ffff,            /* src_mask */
1314          0x0000ffff,            /* dst_mask */
1315          FALSE),                /* pcrel_offset */
1316
1317   HOWTO (R_ARM_THM_MOVW_BREL_NC,/* type */
1318          0,                     /* rightshift */
1319          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1320          16,                    /* bitsize */
1321          FALSE,                 /* pc_relative */
1322          0,                     /* bitpos */
1323          complain_overflow_dont,/* complain_on_overflow */
1324          bfd_elf_generic_reloc, /* special_function */
1325          "R_ARM_THM_MOVW_BREL_NC",/* name */
1326          FALSE,                 /* partial_inplace */
1327          0x040f70ff,            /* src_mask */
1328          0x040f70ff,            /* dst_mask */
1329          FALSE),                /* pcrel_offset */
1330
1331   HOWTO (R_ARM_THM_MOVT_BREL,   /* type */
1332          0,                     /* rightshift */
1333          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1334          16,                    /* bitsize */
1335          FALSE,                 /* pc_relative */
1336          0,                     /* bitpos */
1337          complain_overflow_bitfield,/* complain_on_overflow */
1338          bfd_elf_generic_reloc, /* special_function */
1339          "R_ARM_THM_MOVT_BREL", /* name */
1340          FALSE,                 /* partial_inplace */
1341          0x040f70ff,            /* src_mask */
1342          0x040f70ff,            /* dst_mask */
1343          FALSE),                /* pcrel_offset */
1344
1345   HOWTO (R_ARM_THM_MOVW_BREL,   /* type */
1346          0,                     /* rightshift */
1347          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1348          16,                    /* bitsize */
1349          FALSE,                 /* pc_relative */
1350          0,                     /* bitpos */
1351          complain_overflow_dont,/* complain_on_overflow */
1352          bfd_elf_generic_reloc, /* special_function */
1353          "R_ARM_THM_MOVW_BREL", /* name */
1354          FALSE,                 /* partial_inplace */
1355          0x040f70ff,            /* src_mask */
1356          0x040f70ff,            /* dst_mask */
1357          FALSE),                /* pcrel_offset */
1358
1359   HOWTO (R_ARM_TLS_GOTDESC,     /* type */
1360          0,                     /* rightshift */
1361          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1362          32,                    /* bitsize */
1363          FALSE,                 /* pc_relative */
1364          0,                     /* bitpos */
1365          complain_overflow_bitfield,/* complain_on_overflow */
1366          NULL,                  /* special_function */
1367          "R_ARM_TLS_GOTDESC",   /* name */
1368          TRUE,                  /* partial_inplace */
1369          0xffffffff,            /* src_mask */
1370          0xffffffff,            /* dst_mask */
1371          FALSE),                /* pcrel_offset */
1372
1373   HOWTO (R_ARM_TLS_CALL,        /* type */
1374          0,                     /* rightshift */
1375          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1376          24,                    /* bitsize */
1377          FALSE,                 /* pc_relative */
1378          0,                     /* bitpos */
1379          complain_overflow_dont,/* complain_on_overflow */
1380          bfd_elf_generic_reloc, /* special_function */
1381          "R_ARM_TLS_CALL",      /* name */
1382          FALSE,                 /* partial_inplace */
1383          0x00ffffff,            /* src_mask */
1384          0x00ffffff,            /* dst_mask */
1385          FALSE),                /* pcrel_offset */
1386
1387   HOWTO (R_ARM_TLS_DESCSEQ,     /* type */
1388          0,                     /* rightshift */
1389          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1390          0,                     /* bitsize */
1391          FALSE,                 /* pc_relative */
1392          0,                     /* bitpos */
1393          complain_overflow_bitfield,/* complain_on_overflow */
1394          bfd_elf_generic_reloc, /* special_function */
1395          "R_ARM_TLS_DESCSEQ",   /* name */
1396          FALSE,                 /* partial_inplace */
1397          0x00000000,            /* src_mask */
1398          0x00000000,            /* dst_mask */
1399          FALSE),                /* pcrel_offset */
1400
1401   HOWTO (R_ARM_THM_TLS_CALL,    /* type */
1402          0,                     /* rightshift */
1403          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1404          24,                    /* bitsize */
1405          FALSE,                 /* pc_relative */
1406          0,                     /* bitpos */
1407          complain_overflow_dont,/* complain_on_overflow */
1408          bfd_elf_generic_reloc, /* special_function */
1409          "R_ARM_THM_TLS_CALL",  /* name */
1410          FALSE,                 /* partial_inplace */
1411          0x07ff07ff,            /* src_mask */
1412          0x07ff07ff,            /* dst_mask */
1413          FALSE),                /* pcrel_offset */
1414
1415   HOWTO (R_ARM_PLT32_ABS,       /* type */
1416          0,                     /* rightshift */
1417          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1418          32,                    /* bitsize */
1419          FALSE,                 /* pc_relative */
1420          0,                     /* bitpos */
1421          complain_overflow_dont,/* complain_on_overflow */
1422          bfd_elf_generic_reloc, /* special_function */
1423          "R_ARM_PLT32_ABS",     /* name */
1424          FALSE,                 /* partial_inplace */
1425          0xffffffff,            /* src_mask */
1426          0xffffffff,            /* dst_mask */
1427          FALSE),                /* pcrel_offset */
1428
1429   HOWTO (R_ARM_GOT_ABS,         /* type */
1430          0,                     /* rightshift */
1431          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1432          32,                    /* bitsize */
1433          FALSE,                 /* pc_relative */
1434          0,                     /* bitpos */
1435          complain_overflow_dont,/* complain_on_overflow */
1436          bfd_elf_generic_reloc, /* special_function */
1437          "R_ARM_GOT_ABS",       /* name */
1438          FALSE,                 /* partial_inplace */
1439          0xffffffff,            /* src_mask */
1440          0xffffffff,            /* dst_mask */
1441          FALSE),                        /* pcrel_offset */
1442
1443   HOWTO (R_ARM_GOT_PREL,        /* type */
1444          0,                     /* rightshift */
1445          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1446          32,                    /* bitsize */
1447          TRUE,                  /* pc_relative */
1448          0,                     /* bitpos */
1449          complain_overflow_dont,        /* complain_on_overflow */
1450          bfd_elf_generic_reloc, /* special_function */
1451          "R_ARM_GOT_PREL",      /* name */
1452          FALSE,                 /* partial_inplace */
1453          0xffffffff,            /* src_mask */
1454          0xffffffff,            /* dst_mask */
1455          TRUE),                 /* pcrel_offset */
1456
1457   HOWTO (R_ARM_GOT_BREL12,      /* type */
1458          0,                     /* rightshift */
1459          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1460          12,                    /* bitsize */
1461          FALSE,                 /* pc_relative */
1462          0,                     /* bitpos */
1463          complain_overflow_bitfield,/* complain_on_overflow */
1464          bfd_elf_generic_reloc, /* special_function */
1465          "R_ARM_GOT_BREL12",    /* name */
1466          FALSE,                 /* partial_inplace */
1467          0x00000fff,            /* src_mask */
1468          0x00000fff,            /* dst_mask */
1469          FALSE),                /* pcrel_offset */
1470
1471   HOWTO (R_ARM_GOTOFF12,        /* type */
1472          0,                     /* rightshift */
1473          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1474          12,                    /* bitsize */
1475          FALSE,                 /* pc_relative */
1476          0,                     /* bitpos */
1477          complain_overflow_bitfield,/* complain_on_overflow */
1478          bfd_elf_generic_reloc, /* special_function */
1479          "R_ARM_GOTOFF12",      /* name */
1480          FALSE,                 /* partial_inplace */
1481          0x00000fff,            /* src_mask */
1482          0x00000fff,            /* dst_mask */
1483          FALSE),                /* pcrel_offset */
1484
1485   EMPTY_HOWTO (R_ARM_GOTRELAX),  /* reserved for future GOT-load optimizations */
1486
1487   /* GNU extension to record C++ vtable member usage */
1488   HOWTO (R_ARM_GNU_VTENTRY,     /* type */
1489          0,                     /* rightshift */
1490          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1491          0,                     /* bitsize */
1492          FALSE,                 /* pc_relative */
1493          0,                     /* bitpos */
1494          complain_overflow_dont, /* complain_on_overflow */
1495          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
1496          "R_ARM_GNU_VTENTRY",   /* name */
1497          FALSE,                 /* partial_inplace */
1498          0,                     /* src_mask */
1499          0,                     /* dst_mask */
1500          FALSE),                /* pcrel_offset */
1501
1502   /* GNU extension to record C++ vtable hierarchy */
1503   HOWTO (R_ARM_GNU_VTINHERIT, /* type */
1504          0,                     /* rightshift */
1505          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1506          0,                     /* bitsize */
1507          FALSE,                 /* pc_relative */
1508          0,                     /* bitpos */
1509          complain_overflow_dont, /* complain_on_overflow */
1510          NULL,                  /* special_function */
1511          "R_ARM_GNU_VTINHERIT", /* name */
1512          FALSE,                 /* partial_inplace */
1513          0,                     /* src_mask */
1514          0,                     /* dst_mask */
1515          FALSE),                /* pcrel_offset */
1516
1517   HOWTO (R_ARM_THM_JUMP11,      /* type */
1518          1,                     /* rightshift */
1519          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1520          11,                    /* bitsize */
1521          TRUE,                  /* pc_relative */
1522          0,                     /* bitpos */
1523          complain_overflow_signed,      /* complain_on_overflow */
1524          bfd_elf_generic_reloc, /* special_function */
1525          "R_ARM_THM_JUMP11",    /* name */
1526          FALSE,                 /* partial_inplace */
1527          0x000007ff,            /* src_mask */
1528          0x000007ff,            /* dst_mask */
1529          TRUE),                 /* pcrel_offset */
1530
1531   HOWTO (R_ARM_THM_JUMP8,       /* type */
1532          1,                     /* rightshift */
1533          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1534          8,                     /* bitsize */
1535          TRUE,                  /* pc_relative */
1536          0,                     /* bitpos */
1537          complain_overflow_signed,      /* complain_on_overflow */
1538          bfd_elf_generic_reloc, /* special_function */
1539          "R_ARM_THM_JUMP8",     /* name */
1540          FALSE,                 /* partial_inplace */
1541          0x000000ff,            /* src_mask */
1542          0x000000ff,            /* dst_mask */
1543          TRUE),                 /* pcrel_offset */
1544
1545   /* TLS relocations */
1546   HOWTO (R_ARM_TLS_GD32,        /* type */
1547          0,                     /* rightshift */
1548          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1549          32,                    /* bitsize */
1550          FALSE,                 /* pc_relative */
1551          0,                     /* bitpos */
1552          complain_overflow_bitfield,/* complain_on_overflow */
1553          NULL,                  /* special_function */
1554          "R_ARM_TLS_GD32",      /* name */
1555          TRUE,                  /* partial_inplace */
1556          0xffffffff,            /* src_mask */
1557          0xffffffff,            /* dst_mask */
1558          FALSE),                /* pcrel_offset */
1559
1560   HOWTO (R_ARM_TLS_LDM32,       /* type */
1561          0,                     /* rightshift */
1562          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1563          32,                    /* bitsize */
1564          FALSE,                 /* pc_relative */
1565          0,                     /* bitpos */
1566          complain_overflow_bitfield,/* complain_on_overflow */
1567          bfd_elf_generic_reloc, /* special_function */
1568          "R_ARM_TLS_LDM32",     /* name */
1569          TRUE,                  /* partial_inplace */
1570          0xffffffff,            /* src_mask */
1571          0xffffffff,            /* dst_mask */
1572          FALSE),                /* pcrel_offset */
1573
1574   HOWTO (R_ARM_TLS_LDO32,       /* type */
1575          0,                     /* rightshift */
1576          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1577          32,                    /* bitsize */
1578          FALSE,                 /* pc_relative */
1579          0,                     /* bitpos */
1580          complain_overflow_bitfield,/* complain_on_overflow */
1581          bfd_elf_generic_reloc, /* special_function */
1582          "R_ARM_TLS_LDO32",     /* name */
1583          TRUE,                  /* partial_inplace */
1584          0xffffffff,            /* src_mask */
1585          0xffffffff,            /* dst_mask */
1586          FALSE),                /* pcrel_offset */
1587
1588   HOWTO (R_ARM_TLS_IE32,        /* type */
1589          0,                     /* rightshift */
1590          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1591          32,                    /* bitsize */
1592          FALSE,                  /* pc_relative */
1593          0,                     /* bitpos */
1594          complain_overflow_bitfield,/* complain_on_overflow */
1595          NULL,                  /* special_function */
1596          "R_ARM_TLS_IE32",      /* name */
1597          TRUE,                  /* partial_inplace */
1598          0xffffffff,            /* src_mask */
1599          0xffffffff,            /* dst_mask */
1600          FALSE),                /* pcrel_offset */
1601
1602   HOWTO (R_ARM_TLS_LE32,        /* type */
1603          0,                     /* rightshift */
1604          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1605          32,                    /* bitsize */
1606          FALSE,                 /* pc_relative */
1607          0,                     /* bitpos */
1608          complain_overflow_bitfield,/* complain_on_overflow */
1609          NULL,                  /* special_function */
1610          "R_ARM_TLS_LE32",      /* name */
1611          TRUE,                  /* partial_inplace */
1612          0xffffffff,            /* src_mask */
1613          0xffffffff,            /* dst_mask */
1614          FALSE),                /* pcrel_offset */
1615
1616   HOWTO (R_ARM_TLS_LDO12,       /* type */
1617          0,                     /* rightshift */
1618          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1619          12,                    /* bitsize */
1620          FALSE,                 /* pc_relative */
1621          0,                     /* bitpos */
1622          complain_overflow_bitfield,/* complain_on_overflow */
1623          bfd_elf_generic_reloc, /* special_function */
1624          "R_ARM_TLS_LDO12",     /* name */
1625          FALSE,                 /* partial_inplace */
1626          0x00000fff,            /* src_mask */
1627          0x00000fff,            /* dst_mask */
1628          FALSE),                /* pcrel_offset */
1629
1630   HOWTO (R_ARM_TLS_LE12,        /* type */
1631          0,                     /* rightshift */
1632          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1633          12,                    /* bitsize */
1634          FALSE,                 /* pc_relative */
1635          0,                     /* bitpos */
1636          complain_overflow_bitfield,/* complain_on_overflow */
1637          bfd_elf_generic_reloc, /* special_function */
1638          "R_ARM_TLS_LE12",      /* name */
1639          FALSE,                 /* partial_inplace */
1640          0x00000fff,            /* src_mask */
1641          0x00000fff,            /* dst_mask */
1642          FALSE),                /* pcrel_offset */
1643
1644   HOWTO (R_ARM_TLS_IE12GP,      /* type */
1645          0,                     /* rightshift */
1646          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1647          12,                    /* bitsize */
1648          FALSE,                 /* pc_relative */
1649          0,                     /* bitpos */
1650          complain_overflow_bitfield,/* complain_on_overflow */
1651          bfd_elf_generic_reloc, /* special_function */
1652          "R_ARM_TLS_IE12GP",    /* name */
1653          FALSE,                 /* partial_inplace */
1654          0x00000fff,            /* src_mask */
1655          0x00000fff,            /* dst_mask */
1656          FALSE),                /* pcrel_offset */
1657
1658   /* 112-127 private relocations.  */
1659   EMPTY_HOWTO (112),
1660   EMPTY_HOWTO (113),
1661   EMPTY_HOWTO (114),
1662   EMPTY_HOWTO (115),
1663   EMPTY_HOWTO (116),
1664   EMPTY_HOWTO (117),
1665   EMPTY_HOWTO (118),
1666   EMPTY_HOWTO (119),
1667   EMPTY_HOWTO (120),
1668   EMPTY_HOWTO (121),
1669   EMPTY_HOWTO (122),
1670   EMPTY_HOWTO (123),
1671   EMPTY_HOWTO (124),
1672   EMPTY_HOWTO (125),
1673   EMPTY_HOWTO (126),
1674   EMPTY_HOWTO (127),
1675
1676   /* R_ARM_ME_TOO, obsolete.  */
1677   EMPTY_HOWTO (128),
1678
1679   HOWTO (R_ARM_THM_TLS_DESCSEQ, /* type */
1680          0,                     /* rightshift */
1681          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1682          0,                     /* bitsize */
1683          FALSE,                 /* pc_relative */
1684          0,                     /* bitpos */
1685          complain_overflow_bitfield,/* complain_on_overflow */
1686          bfd_elf_generic_reloc, /* special_function */
1687          "R_ARM_THM_TLS_DESCSEQ",/* name */
1688          FALSE,                 /* partial_inplace */
1689          0x00000000,            /* src_mask */
1690          0x00000000,            /* dst_mask */
1691          FALSE),                /* pcrel_offset */
1692   EMPTY_HOWTO (130),
1693   EMPTY_HOWTO (131),
1694   HOWTO (R_ARM_THM_ALU_ABS_G0_NC,/* type.  */
1695          0,                     /* rightshift.  */
1696          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
1697          16,                    /* bitsize.  */
1698          FALSE,                 /* pc_relative.  */
1699          0,                     /* bitpos.  */
1700          complain_overflow_bitfield,/* complain_on_overflow.  */
1701          bfd_elf_generic_reloc, /* special_function.  */
1702          "R_ARM_THM_ALU_ABS_G0_NC",/* name.  */
1703          FALSE,                 /* partial_inplace.  */
1704          0x00000000,            /* src_mask.  */
1705          0x00000000,            /* dst_mask.  */
1706          FALSE),                /* pcrel_offset.  */
1707   HOWTO (R_ARM_THM_ALU_ABS_G1_NC,/* type.  */
1708          0,                     /* rightshift.  */
1709          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
1710          16,                    /* bitsize.  */
1711          FALSE,                 /* pc_relative.  */
1712          0,                     /* bitpos.  */
1713          complain_overflow_bitfield,/* complain_on_overflow.  */
1714          bfd_elf_generic_reloc, /* special_function.  */
1715          "R_ARM_THM_ALU_ABS_G1_NC",/* name.  */
1716          FALSE,                 /* partial_inplace.  */
1717          0x00000000,            /* src_mask.  */
1718          0x00000000,            /* dst_mask.  */
1719          FALSE),                /* pcrel_offset.  */
1720   HOWTO (R_ARM_THM_ALU_ABS_G2_NC,/* type.  */
1721          0,                     /* rightshift.  */
1722          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
1723          16,                    /* bitsize.  */
1724          FALSE,                 /* pc_relative.  */
1725          0,                     /* bitpos.  */
1726          complain_overflow_bitfield,/* complain_on_overflow.  */
1727          bfd_elf_generic_reloc, /* special_function.  */
1728          "R_ARM_THM_ALU_ABS_G2_NC",/* name.  */
1729          FALSE,                 /* partial_inplace.  */
1730          0x00000000,            /* src_mask.  */
1731          0x00000000,            /* dst_mask.  */
1732          FALSE),                /* pcrel_offset.  */
1733   HOWTO (R_ARM_THM_ALU_ABS_G3_NC,/* type.  */
1734          0,                     /* rightshift.  */
1735          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
1736          16,                    /* bitsize.  */
1737          FALSE,                 /* pc_relative.  */
1738          0,                     /* bitpos.  */
1739          complain_overflow_bitfield,/* complain_on_overflow.  */
1740          bfd_elf_generic_reloc, /* special_function.  */
1741          "R_ARM_THM_ALU_ABS_G3_NC",/* name.  */
1742          FALSE,                 /* partial_inplace.  */
1743          0x00000000,            /* src_mask.  */
1744          0x00000000,            /* dst_mask.  */
1745          FALSE),                /* pcrel_offset.  */
1746 };
1747
1748 /* 160 onwards: */
1749 static reloc_howto_type elf32_arm_howto_table_2[8] =
1750 {
1751   HOWTO (R_ARM_IRELATIVE,       /* type */
1752          0,                     /* rightshift */
1753          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1754          32,                    /* bitsize */
1755          FALSE,                 /* pc_relative */
1756          0,                     /* bitpos */
1757          complain_overflow_bitfield,/* complain_on_overflow */
1758          bfd_elf_generic_reloc, /* special_function */
1759          "R_ARM_IRELATIVE",     /* name */
1760          TRUE,                  /* partial_inplace */
1761          0xffffffff,            /* src_mask */
1762          0xffffffff,            /* dst_mask */
1763          FALSE),                /* pcrel_offset */
1764   HOWTO (R_ARM_GOTFUNCDESC,     /* type */
1765          0,                     /* rightshift */
1766          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1767          32,                    /* bitsize */
1768          FALSE,                 /* pc_relative */
1769          0,                     /* bitpos */
1770          complain_overflow_bitfield,/* complain_on_overflow */
1771          bfd_elf_generic_reloc, /* special_function */
1772          "R_ARM_GOTFUNCDESC",   /* name */
1773          FALSE,                 /* partial_inplace */
1774          0,                     /* src_mask */
1775          0xffffffff,            /* dst_mask */
1776          FALSE),                /* pcrel_offset */
1777   HOWTO (R_ARM_GOTOFFFUNCDESC, /* type */
1778          0,                     /* rightshift */
1779          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1780          32,                    /* bitsize */
1781          FALSE,                 /* pc_relative */
1782          0,                     /* bitpos */
1783          complain_overflow_bitfield,/* complain_on_overflow */
1784          bfd_elf_generic_reloc, /* special_function */
1785          "R_ARM_GOTOFFFUNCDESC",/* name */
1786          FALSE,                 /* partial_inplace */
1787          0,                     /* src_mask */
1788          0xffffffff,            /* dst_mask */
1789          FALSE),                /* pcrel_offset */
1790   HOWTO (R_ARM_FUNCDESC,        /* type */
1791          0,                     /* rightshift */
1792          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1793          32,                    /* bitsize */
1794          FALSE,                 /* pc_relative */
1795          0,                     /* bitpos */
1796          complain_overflow_bitfield,/* complain_on_overflow */
1797          bfd_elf_generic_reloc, /* special_function */
1798          "R_ARM_FUNCDESC",      /* name */
1799          FALSE,                 /* partial_inplace */
1800          0,                     /* src_mask */
1801          0xffffffff,            /* dst_mask */
1802          FALSE),                /* pcrel_offset */
1803   HOWTO (R_ARM_FUNCDESC_VALUE,  /* type */
1804          0,                     /* rightshift */
1805          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1806          64,                    /* bitsize */
1807          FALSE,                 /* pc_relative */
1808          0,                     /* bitpos */
1809          complain_overflow_bitfield,/* complain_on_overflow */
1810          bfd_elf_generic_reloc, /* special_function */
1811          "R_ARM_FUNCDESC_VALUE",/* name */
1812          FALSE,                 /* partial_inplace */
1813          0,                     /* src_mask */
1814          0xffffffff,            /* dst_mask */
1815          FALSE),                /* pcrel_offset */
1816   HOWTO (R_ARM_TLS_GD32_FDPIC,  /* type */
1817          0,                     /* rightshift */
1818          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1819          32,                    /* bitsize */
1820          FALSE,                 /* pc_relative */
1821          0,                     /* bitpos */
1822          complain_overflow_bitfield,/* complain_on_overflow */
1823          bfd_elf_generic_reloc, /* special_function */
1824          "R_ARM_TLS_GD32_FDPIC",/* name */
1825          FALSE,                 /* partial_inplace */
1826          0,                     /* src_mask */
1827          0xffffffff,            /* dst_mask */
1828          FALSE),                /* pcrel_offset */
1829   HOWTO (R_ARM_TLS_LDM32_FDPIC, /* type */
1830          0,                     /* rightshift */
1831          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1832          32,                    /* bitsize */
1833          FALSE,                 /* pc_relative */
1834          0,                     /* bitpos */
1835          complain_overflow_bitfield,/* complain_on_overflow */
1836          bfd_elf_generic_reloc, /* special_function */
1837          "R_ARM_TLS_LDM32_FDPIC",/* name */
1838          FALSE,                 /* partial_inplace */
1839          0,                     /* src_mask */
1840          0xffffffff,            /* dst_mask */
1841          FALSE),                /* pcrel_offset */
1842   HOWTO (R_ARM_TLS_IE32_FDPIC,  /* type */
1843          0,                     /* rightshift */
1844          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1845          32,                    /* bitsize */
1846          FALSE,                 /* pc_relative */
1847          0,                     /* bitpos */
1848          complain_overflow_bitfield,/* complain_on_overflow */
1849          bfd_elf_generic_reloc, /* special_function */
1850          "R_ARM_TLS_IE32_FDPIC",/* name */
1851          FALSE,                 /* partial_inplace */
1852          0,                     /* src_mask */
1853          0xffffffff,            /* dst_mask */
1854          FALSE),                /* pcrel_offset */
1855 };
1856
1857 /* 249-255 extended, currently unused, relocations:  */
1858 static reloc_howto_type elf32_arm_howto_table_3[4] =
1859 {
1860   HOWTO (R_ARM_RREL32,          /* type */
1861          0,                     /* rightshift */
1862          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1863          0,                     /* bitsize */
1864          FALSE,                 /* pc_relative */
1865          0,                     /* bitpos */
1866          complain_overflow_dont,/* complain_on_overflow */
1867          bfd_elf_generic_reloc, /* special_function */
1868          "R_ARM_RREL32",        /* name */
1869          FALSE,                 /* partial_inplace */
1870          0,                     /* src_mask */
1871          0,                     /* dst_mask */
1872          FALSE),                /* pcrel_offset */
1873
1874   HOWTO (R_ARM_RABS32,          /* type */
1875          0,                     /* rightshift */
1876          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1877          0,                     /* bitsize */
1878          FALSE,                 /* pc_relative */
1879          0,                     /* bitpos */
1880          complain_overflow_dont,/* complain_on_overflow */
1881          bfd_elf_generic_reloc, /* special_function */
1882          "R_ARM_RABS32",        /* name */
1883          FALSE,                 /* partial_inplace */
1884          0,                     /* src_mask */
1885          0,                     /* dst_mask */
1886          FALSE),                /* pcrel_offset */
1887
1888   HOWTO (R_ARM_RPC24,           /* type */
1889          0,                     /* rightshift */
1890          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1891          0,                     /* bitsize */
1892          FALSE,                 /* pc_relative */
1893          0,                     /* bitpos */
1894          complain_overflow_dont,/* complain_on_overflow */
1895          bfd_elf_generic_reloc, /* special_function */
1896          "R_ARM_RPC24",         /* name */
1897          FALSE,                 /* partial_inplace */
1898          0,                     /* src_mask */
1899          0,                     /* dst_mask */
1900          FALSE),                /* pcrel_offset */
1901
1902   HOWTO (R_ARM_RBASE,           /* type */
1903          0,                     /* rightshift */
1904          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1905          0,                     /* bitsize */
1906          FALSE,                 /* pc_relative */
1907          0,                     /* bitpos */
1908          complain_overflow_dont,/* complain_on_overflow */
1909          bfd_elf_generic_reloc, /* special_function */
1910          "R_ARM_RBASE",         /* name */
1911          FALSE,                 /* partial_inplace */
1912          0,                     /* src_mask */
1913          0,                     /* dst_mask */
1914          FALSE)                 /* pcrel_offset */
1915 };
1916
1917 static reloc_howto_type *
1918 elf32_arm_howto_from_type (unsigned int r_type)
1919 {
1920   if (r_type < ARRAY_SIZE (elf32_arm_howto_table_1))
1921     return &elf32_arm_howto_table_1[r_type];
1922
1923   if (r_type >= R_ARM_IRELATIVE
1924       && r_type < R_ARM_IRELATIVE + ARRAY_SIZE (elf32_arm_howto_table_2))
1925     return &elf32_arm_howto_table_2[r_type - R_ARM_IRELATIVE];
1926
1927   if (r_type >= R_ARM_RREL32
1928       && r_type < R_ARM_RREL32 + ARRAY_SIZE (elf32_arm_howto_table_3))
1929     return &elf32_arm_howto_table_3[r_type - R_ARM_RREL32];
1930
1931   return NULL;
1932 }
1933
1934 static bfd_boolean
1935 elf32_arm_info_to_howto (bfd * abfd, arelent * bfd_reloc,
1936                          Elf_Internal_Rela * elf_reloc)
1937 {
1938   unsigned int r_type;
1939
1940   r_type = ELF32_R_TYPE (elf_reloc->r_info);
1941   if ((bfd_reloc->howto = elf32_arm_howto_from_type (r_type)) == NULL)
1942     {
1943       /* xgettext:c-format */
1944       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1945                           abfd, r_type);
1946       bfd_set_error (bfd_error_bad_value);
1947       return FALSE;
1948     }
1949   return TRUE;
1950 }
1951
1952 struct elf32_arm_reloc_map
1953   {
1954     bfd_reloc_code_real_type  bfd_reloc_val;
1955     unsigned char             elf_reloc_val;
1956   };
1957
1958 /* All entries in this list must also be present in elf32_arm_howto_table.  */
1959 static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
1960   {
1961     {BFD_RELOC_NONE,                 R_ARM_NONE},
1962     {BFD_RELOC_ARM_PCREL_BRANCH,     R_ARM_PC24},
1963     {BFD_RELOC_ARM_PCREL_CALL,       R_ARM_CALL},
1964     {BFD_RELOC_ARM_PCREL_JUMP,       R_ARM_JUMP24},
1965     {BFD_RELOC_ARM_PCREL_BLX,        R_ARM_XPC25},
1966     {BFD_RELOC_THUMB_PCREL_BLX,      R_ARM_THM_XPC22},
1967     {BFD_RELOC_32,                   R_ARM_ABS32},
1968     {BFD_RELOC_32_PCREL,             R_ARM_REL32},
1969     {BFD_RELOC_8,                    R_ARM_ABS8},
1970     {BFD_RELOC_16,                   R_ARM_ABS16},
1971     {BFD_RELOC_ARM_OFFSET_IMM,       R_ARM_ABS12},
1972     {BFD_RELOC_ARM_THUMB_OFFSET,     R_ARM_THM_ABS5},
1973     {BFD_RELOC_THUMB_PCREL_BRANCH25, R_ARM_THM_JUMP24},
1974     {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_CALL},
1975     {BFD_RELOC_THUMB_PCREL_BRANCH12, R_ARM_THM_JUMP11},
1976     {BFD_RELOC_THUMB_PCREL_BRANCH20, R_ARM_THM_JUMP19},
1977     {BFD_RELOC_THUMB_PCREL_BRANCH9,  R_ARM_THM_JUMP8},
1978     {BFD_RELOC_THUMB_PCREL_BRANCH7,  R_ARM_THM_JUMP6},
1979     {BFD_RELOC_ARM_GLOB_DAT,         R_ARM_GLOB_DAT},
1980     {BFD_RELOC_ARM_JUMP_SLOT,        R_ARM_JUMP_SLOT},
1981     {BFD_RELOC_ARM_RELATIVE,         R_ARM_RELATIVE},
1982     {BFD_RELOC_ARM_GOTOFF,           R_ARM_GOTOFF32},
1983     {BFD_RELOC_ARM_GOTPC,            R_ARM_GOTPC},
1984     {BFD_RELOC_ARM_GOT_PREL,         R_ARM_GOT_PREL},
1985     {BFD_RELOC_ARM_GOT32,            R_ARM_GOT32},
1986     {BFD_RELOC_ARM_PLT32,            R_ARM_PLT32},
1987     {BFD_RELOC_ARM_TARGET1,          R_ARM_TARGET1},
1988     {BFD_RELOC_ARM_ROSEGREL32,       R_ARM_ROSEGREL32},
1989     {BFD_RELOC_ARM_SBREL32,          R_ARM_SBREL32},
1990     {BFD_RELOC_ARM_PREL31,           R_ARM_PREL31},
1991     {BFD_RELOC_ARM_TARGET2,          R_ARM_TARGET2},
1992     {BFD_RELOC_ARM_PLT32,            R_ARM_PLT32},
1993     {BFD_RELOC_ARM_TLS_GOTDESC,      R_ARM_TLS_GOTDESC},
1994     {BFD_RELOC_ARM_TLS_CALL,         R_ARM_TLS_CALL},
1995     {BFD_RELOC_ARM_THM_TLS_CALL,     R_ARM_THM_TLS_CALL},
1996     {BFD_RELOC_ARM_TLS_DESCSEQ,      R_ARM_TLS_DESCSEQ},
1997     {BFD_RELOC_ARM_THM_TLS_DESCSEQ,  R_ARM_THM_TLS_DESCSEQ},
1998     {BFD_RELOC_ARM_TLS_DESC,         R_ARM_TLS_DESC},
1999     {BFD_RELOC_ARM_TLS_GD32,         R_ARM_TLS_GD32},
2000     {BFD_RELOC_ARM_TLS_LDO32,        R_ARM_TLS_LDO32},
2001     {BFD_RELOC_ARM_TLS_LDM32,        R_ARM_TLS_LDM32},
2002     {BFD_RELOC_ARM_TLS_DTPMOD32,     R_ARM_TLS_DTPMOD32},
2003     {BFD_RELOC_ARM_TLS_DTPOFF32,     R_ARM_TLS_DTPOFF32},
2004     {BFD_RELOC_ARM_TLS_TPOFF32,      R_ARM_TLS_TPOFF32},
2005     {BFD_RELOC_ARM_TLS_IE32,         R_ARM_TLS_IE32},
2006     {BFD_RELOC_ARM_TLS_LE32,         R_ARM_TLS_LE32},
2007     {BFD_RELOC_ARM_IRELATIVE,        R_ARM_IRELATIVE},
2008     {BFD_RELOC_ARM_GOTFUNCDESC,      R_ARM_GOTFUNCDESC},
2009     {BFD_RELOC_ARM_GOTOFFFUNCDESC,   R_ARM_GOTOFFFUNCDESC},
2010     {BFD_RELOC_ARM_FUNCDESC,         R_ARM_FUNCDESC},
2011     {BFD_RELOC_ARM_FUNCDESC_VALUE,   R_ARM_FUNCDESC_VALUE},
2012     {BFD_RELOC_ARM_TLS_GD32_FDPIC,   R_ARM_TLS_GD32_FDPIC},
2013     {BFD_RELOC_ARM_TLS_LDM32_FDPIC,  R_ARM_TLS_LDM32_FDPIC},
2014     {BFD_RELOC_ARM_TLS_IE32_FDPIC,   R_ARM_TLS_IE32_FDPIC},
2015     {BFD_RELOC_VTABLE_INHERIT,       R_ARM_GNU_VTINHERIT},
2016     {BFD_RELOC_VTABLE_ENTRY,         R_ARM_GNU_VTENTRY},
2017     {BFD_RELOC_ARM_MOVW,             R_ARM_MOVW_ABS_NC},
2018     {BFD_RELOC_ARM_MOVT,             R_ARM_MOVT_ABS},
2019     {BFD_RELOC_ARM_MOVW_PCREL,       R_ARM_MOVW_PREL_NC},
2020     {BFD_RELOC_ARM_MOVT_PCREL,       R_ARM_MOVT_PREL},
2021     {BFD_RELOC_ARM_THUMB_MOVW,       R_ARM_THM_MOVW_ABS_NC},
2022     {BFD_RELOC_ARM_THUMB_MOVT,       R_ARM_THM_MOVT_ABS},
2023     {BFD_RELOC_ARM_THUMB_MOVW_PCREL, R_ARM_THM_MOVW_PREL_NC},
2024     {BFD_RELOC_ARM_THUMB_MOVT_PCREL, R_ARM_THM_MOVT_PREL},
2025     {BFD_RELOC_ARM_ALU_PC_G0_NC, R_ARM_ALU_PC_G0_NC},
2026     {BFD_RELOC_ARM_ALU_PC_G0, R_ARM_ALU_PC_G0},
2027     {BFD_RELOC_ARM_ALU_PC_G1_NC, R_ARM_ALU_PC_G1_NC},
2028     {BFD_RELOC_ARM_ALU_PC_G1, R_ARM_ALU_PC_G1},
2029     {BFD_RELOC_ARM_ALU_PC_G2, R_ARM_ALU_PC_G2},
2030     {BFD_RELOC_ARM_LDR_PC_G0, R_ARM_LDR_PC_G0},
2031     {BFD_RELOC_ARM_LDR_PC_G1, R_ARM_LDR_PC_G1},
2032     {BFD_RELOC_ARM_LDR_PC_G2, R_ARM_LDR_PC_G2},
2033     {BFD_RELOC_ARM_LDRS_PC_G0, R_ARM_LDRS_PC_G0},
2034     {BFD_RELOC_ARM_LDRS_PC_G1, R_ARM_LDRS_PC_G1},
2035     {BFD_RELOC_ARM_LDRS_PC_G2, R_ARM_LDRS_PC_G2},
2036     {BFD_RELOC_ARM_LDC_PC_G0, R_ARM_LDC_PC_G0},
2037     {BFD_RELOC_ARM_LDC_PC_G1, R_ARM_LDC_PC_G1},
2038     {BFD_RELOC_ARM_LDC_PC_G2, R_ARM_LDC_PC_G2},
2039     {BFD_RELOC_ARM_ALU_SB_G0_NC, R_ARM_ALU_SB_G0_NC},
2040     {BFD_RELOC_ARM_ALU_SB_G0, R_ARM_ALU_SB_G0},
2041     {BFD_RELOC_ARM_ALU_SB_G1_NC, R_ARM_ALU_SB_G1_NC},
2042     {BFD_RELOC_ARM_ALU_SB_G1, R_ARM_ALU_SB_G1},
2043     {BFD_RELOC_ARM_ALU_SB_G2, R_ARM_ALU_SB_G2},
2044     {BFD_RELOC_ARM_LDR_SB_G0, R_ARM_LDR_SB_G0},
2045     {BFD_RELOC_ARM_LDR_SB_G1, R_ARM_LDR_SB_G1},
2046     {BFD_RELOC_ARM_LDR_SB_G2, R_ARM_LDR_SB_G2},
2047     {BFD_RELOC_ARM_LDRS_SB_G0, R_ARM_LDRS_SB_G0},
2048     {BFD_RELOC_ARM_LDRS_SB_G1, R_ARM_LDRS_SB_G1},
2049     {BFD_RELOC_ARM_LDRS_SB_G2, R_ARM_LDRS_SB_G2},
2050     {BFD_RELOC_ARM_LDC_SB_G0, R_ARM_LDC_SB_G0},
2051     {BFD_RELOC_ARM_LDC_SB_G1, R_ARM_LDC_SB_G1},
2052     {BFD_RELOC_ARM_LDC_SB_G2, R_ARM_LDC_SB_G2},
2053     {BFD_RELOC_ARM_V4BX,             R_ARM_V4BX},
2054     {BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC, R_ARM_THM_ALU_ABS_G3_NC},
2055     {BFD_RELOC_ARM_THUMB_ALU_ABS_G2_NC, R_ARM_THM_ALU_ABS_G2_NC},
2056     {BFD_RELOC_ARM_THUMB_ALU_ABS_G1_NC, R_ARM_THM_ALU_ABS_G1_NC},
2057     {BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC, R_ARM_THM_ALU_ABS_G0_NC}
2058   };
2059
2060 static reloc_howto_type *
2061 elf32_arm_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2062                              bfd_reloc_code_real_type code)
2063 {
2064   unsigned int i;
2065
2066   for (i = 0; i < ARRAY_SIZE (elf32_arm_reloc_map); i ++)
2067     if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
2068       return elf32_arm_howto_from_type (elf32_arm_reloc_map[i].elf_reloc_val);
2069
2070   return NULL;
2071 }
2072
2073 static reloc_howto_type *
2074 elf32_arm_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2075                              const char *r_name)
2076 {
2077   unsigned int i;
2078
2079   for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_1); i++)
2080     if (elf32_arm_howto_table_1[i].name != NULL
2081         && strcasecmp (elf32_arm_howto_table_1[i].name, r_name) == 0)
2082       return &elf32_arm_howto_table_1[i];
2083
2084   for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_2); i++)
2085     if (elf32_arm_howto_table_2[i].name != NULL
2086         && strcasecmp (elf32_arm_howto_table_2[i].name, r_name) == 0)
2087       return &elf32_arm_howto_table_2[i];
2088
2089   for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_3); i++)
2090     if (elf32_arm_howto_table_3[i].name != NULL
2091         && strcasecmp (elf32_arm_howto_table_3[i].name, r_name) == 0)
2092       return &elf32_arm_howto_table_3[i];
2093
2094   return NULL;
2095 }
2096
2097 /* Support for core dump NOTE sections.  */
2098
2099 static bfd_boolean
2100 elf32_arm_nabi_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2101 {
2102   int offset;
2103   size_t size;
2104
2105   switch (note->descsz)
2106     {
2107       default:
2108         return FALSE;
2109
2110       case 148:         /* Linux/ARM 32-bit.  */
2111         /* pr_cursig */
2112         elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2113
2114         /* pr_pid */
2115         elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
2116
2117         /* pr_reg */
2118         offset = 72;
2119         size = 72;
2120
2121         break;
2122     }
2123
2124   /* Make a ".reg/999" section.  */
2125   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2126                                           size, note->descpos + offset);
2127 }
2128
2129 static bfd_boolean
2130 elf32_arm_nabi_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2131 {
2132   switch (note->descsz)
2133     {
2134       default:
2135         return FALSE;
2136
2137       case 124:         /* Linux/ARM elf_prpsinfo.  */
2138         elf_tdata (abfd)->core->pid
2139          = bfd_get_32 (abfd, note->descdata + 12);
2140         elf_tdata (abfd)->core->program
2141          = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
2142         elf_tdata (abfd)->core->command
2143          = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
2144     }
2145
2146   /* Note that for some reason, a spurious space is tacked
2147      onto the end of the args in some (at least one anyway)
2148      implementations, so strip it off if it exists.  */
2149   {
2150     char *command = elf_tdata (abfd)->core->command;
2151     int n = strlen (command);
2152
2153     if (0 < n && command[n - 1] == ' ')
2154       command[n - 1] = '\0';
2155   }
2156
2157   return TRUE;
2158 }
2159
2160 static char *
2161 elf32_arm_nabi_write_core_note (bfd *abfd, char *buf, int *bufsiz,
2162                                 int note_type, ...)
2163 {
2164   switch (note_type)
2165     {
2166     default:
2167       return NULL;
2168
2169     case NT_PRPSINFO:
2170       {
2171         char data[124] ATTRIBUTE_NONSTRING;
2172         va_list ap;
2173
2174         va_start (ap, note_type);
2175         memset (data, 0, sizeof (data));
2176         strncpy (data + 28, va_arg (ap, const char *), 16);
2177         DIAGNOSTIC_PUSH;
2178         /* GCC 8.1 warns about 80 equals destination size with
2179            -Wstringop-truncation:
2180            https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643
2181          */
2182 #if GCC_VERSION == 8001
2183         DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION;
2184 #endif
2185         strncpy (data + 44, va_arg (ap, const char *), 80);
2186         DIAGNOSTIC_POP;
2187         va_end (ap);
2188
2189         return elfcore_write_note (abfd, buf, bufsiz,
2190                                    "CORE", note_type, data, sizeof (data));
2191       }
2192
2193     case NT_PRSTATUS:
2194       {
2195         char data[148];
2196         va_list ap;
2197         long pid;
2198         int cursig;
2199         const void *greg;
2200
2201         va_start (ap, note_type);
2202         memset (data, 0, sizeof (data));
2203         pid = va_arg (ap, long);
2204         bfd_put_32 (abfd, pid, data + 24);
2205         cursig = va_arg (ap, int);
2206         bfd_put_16 (abfd, cursig, data + 12);
2207         greg = va_arg (ap, const void *);
2208         memcpy (data + 72, greg, 72);
2209         va_end (ap);
2210
2211         return elfcore_write_note (abfd, buf, bufsiz,
2212                                    "CORE", note_type, data, sizeof (data));
2213       }
2214     }
2215 }
2216
2217 #define TARGET_LITTLE_SYM               arm_elf32_le_vec
2218 #define TARGET_LITTLE_NAME              "elf32-littlearm"
2219 #define TARGET_BIG_SYM                  arm_elf32_be_vec
2220 #define TARGET_BIG_NAME                 "elf32-bigarm"
2221
2222 #define elf_backend_grok_prstatus       elf32_arm_nabi_grok_prstatus
2223 #define elf_backend_grok_psinfo         elf32_arm_nabi_grok_psinfo
2224 #define elf_backend_write_core_note     elf32_arm_nabi_write_core_note
2225
2226 typedef unsigned long int insn32;
2227 typedef unsigned short int insn16;
2228
2229 /* In lieu of proper flags, assume all EABIv4 or later objects are
2230    interworkable.  */
2231 #define INTERWORK_FLAG(abfd)  \
2232   (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) >= EF_ARM_EABI_VER4 \
2233   || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK) \
2234   || ((abfd)->flags & BFD_LINKER_CREATED))
2235
2236 /* The linker script knows the section names for placement.
2237    The entry_names are used to do simple name mangling on the stubs.
2238    Given a function name, and its type, the stub can be found. The
2239    name can be changed. The only requirement is the %s be present.  */
2240 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
2241 #define THUMB2ARM_GLUE_ENTRY_NAME   "__%s_from_thumb"
2242
2243 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
2244 #define ARM2THUMB_GLUE_ENTRY_NAME   "__%s_from_arm"
2245
2246 #define VFP11_ERRATUM_VENEER_SECTION_NAME ".vfp11_veneer"
2247 #define VFP11_ERRATUM_VENEER_ENTRY_NAME   "__vfp11_veneer_%x"
2248
2249 #define STM32L4XX_ERRATUM_VENEER_SECTION_NAME ".text.stm32l4xx_veneer"
2250 #define STM32L4XX_ERRATUM_VENEER_ENTRY_NAME   "__stm32l4xx_veneer_%x"
2251
2252 #define ARM_BX_GLUE_SECTION_NAME ".v4_bx"
2253 #define ARM_BX_GLUE_ENTRY_NAME   "__bx_r%d"
2254
2255 #define STUB_ENTRY_NAME   "__%s_veneer"
2256
2257 #define CMSE_PREFIX "__acle_se_"
2258
2259 /* The name of the dynamic interpreter.  This is put in the .interp
2260    section.  */
2261 #define ELF_DYNAMIC_INTERPRETER     "/usr/lib/ld.so.1"
2262
2263 /* FDPIC default stack size.  */
2264 #define DEFAULT_STACK_SIZE 0x8000
2265
2266 static const unsigned long tls_trampoline [] =
2267 {
2268   0xe08e0000,           /* add r0, lr, r0 */
2269   0xe5901004,           /* ldr r1, [r0,#4] */
2270   0xe12fff11,           /* bx  r1 */
2271 };
2272
2273 static const unsigned long dl_tlsdesc_lazy_trampoline [] =
2274 {
2275   0xe52d2004, /*        push    {r2}                    */
2276   0xe59f200c, /*      ldr     r2, [pc, #3f - . - 8]     */
2277   0xe59f100c, /*      ldr     r1, [pc, #4f - . - 8]     */
2278   0xe79f2002, /* 1:   ldr     r2, [pc, r2]              */
2279   0xe081100f, /* 2:   add     r1, pc                    */
2280   0xe12fff12, /*      bx      r2                        */
2281   0x00000014, /* 3:   .word  _GLOBAL_OFFSET_TABLE_ - 1b - 8
2282                                 + dl_tlsdesc_lazy_resolver(GOT)   */
2283   0x00000018, /* 4:   .word  _GLOBAL_OFFSET_TABLE_ - 2b - 8 */
2284 };
2285
2286 /* ARM FDPIC PLT entry.  */
2287 /* The last 5 words contain PLT lazy fragment code and data.  */
2288 static const bfd_vma elf32_arm_fdpic_plt_entry [] =
2289   {
2290     0xe59fc008,    /* ldr     r12, .L1 */
2291     0xe08cc009,    /* add     r12, r12, r9 */
2292     0xe59c9004,    /* ldr     r9, [r12, #4] */
2293     0xe59cf000,    /* ldr     pc, [r12] */
2294     0x00000000,    /* L1.     .word   foo(GOTOFFFUNCDESC) */
2295     0x00000000,    /* L1.     .word   foo(funcdesc_value_reloc_offset) */
2296     0xe51fc00c,    /* ldr     r12, [pc, #-12] */
2297     0xe92d1000,    /* push    {r12} */
2298     0xe599c004,    /* ldr     r12, [r9, #4] */
2299     0xe599f000,    /* ldr     pc, [r9] */
2300   };
2301
2302 /* Thumb FDPIC PLT entry.  */
2303 /* The last 5 words contain PLT lazy fragment code and data.  */
2304 static const bfd_vma elf32_arm_fdpic_thumb_plt_entry [] =
2305   {
2306     0xc00cf8df,    /* ldr.w   r12, .L1 */
2307     0x0c09eb0c,    /* add.w   r12, r12, r9 */
2308     0x9004f8dc,    /* ldr.w   r9, [r12, #4] */
2309     0xf000f8dc,    /* ldr.w   pc, [r12] */
2310     0x00000000,    /* .L1     .word   foo(GOTOFFFUNCDESC) */
2311     0x00000000,    /* .L2     .word   foo(funcdesc_value_reloc_offset) */
2312     0xc008f85f,    /* ldr.w   r12, .L2 */
2313     0xcd04f84d,    /* push    {r12} */
2314     0xc004f8d9,    /* ldr.w   r12, [r9, #4] */
2315     0xf000f8d9,    /* ldr.w   pc, [r9] */
2316   };
2317
2318 #ifdef FOUR_WORD_PLT
2319
2320 /* The first entry in a procedure linkage table looks like
2321    this.  It is set up so that any shared library function that is
2322    called before the relocation has been set up calls the dynamic
2323    linker first.  */
2324 static const bfd_vma elf32_arm_plt0_entry [] =
2325 {
2326   0xe52de004,           /* str   lr, [sp, #-4]! */
2327   0xe59fe010,           /* ldr   lr, [pc, #16]  */
2328   0xe08fe00e,           /* add   lr, pc, lr     */
2329   0xe5bef008,           /* ldr   pc, [lr, #8]!  */
2330 };
2331
2332 /* Subsequent entries in a procedure linkage table look like
2333    this.  */
2334 static const bfd_vma elf32_arm_plt_entry [] =
2335 {
2336   0xe28fc600,           /* add   ip, pc, #NN    */
2337   0xe28cca00,           /* add   ip, ip, #NN    */
2338   0xe5bcf000,           /* ldr   pc, [ip, #NN]! */
2339   0x00000000,           /* unused               */
2340 };
2341
2342 #else /* not FOUR_WORD_PLT */
2343
2344 /* The first entry in a procedure linkage table looks like
2345    this.  It is set up so that any shared library function that is
2346    called before the relocation has been set up calls the dynamic
2347    linker first.  */
2348 static const bfd_vma elf32_arm_plt0_entry [] =
2349 {
2350   0xe52de004,           /* str   lr, [sp, #-4]! */
2351   0xe59fe004,           /* ldr   lr, [pc, #4]   */
2352   0xe08fe00e,           /* add   lr, pc, lr     */
2353   0xe5bef008,           /* ldr   pc, [lr, #8]!  */
2354   0x00000000,           /* &GOT[0] - .          */
2355 };
2356
2357 /* By default subsequent entries in a procedure linkage table look like
2358    this. Offsets that don't fit into 28 bits will cause link error.  */
2359 static const bfd_vma elf32_arm_plt_entry_short [] =
2360 {
2361   0xe28fc600,           /* add   ip, pc, #0xNN00000 */
2362   0xe28cca00,           /* add   ip, ip, #0xNN000   */
2363   0xe5bcf000,           /* ldr   pc, [ip, #0xNNN]!  */
2364 };
2365
2366 /* When explicitly asked, we'll use this "long" entry format
2367    which can cope with arbitrary displacements.  */
2368 static const bfd_vma elf32_arm_plt_entry_long [] =
2369 {
2370   0xe28fc200,           /* add   ip, pc, #0xN0000000 */
2371   0xe28cc600,           /* add   ip, ip, #0xNN00000  */
2372   0xe28cca00,           /* add   ip, ip, #0xNN000    */
2373   0xe5bcf000,           /* ldr   pc, [ip, #0xNNN]!   */
2374 };
2375
2376 static bfd_boolean elf32_arm_use_long_plt_entry = FALSE;
2377
2378 #endif /* not FOUR_WORD_PLT */
2379
2380 /* The first entry in a procedure linkage table looks like this.
2381    It is set up so that any shared library function that is called before the
2382    relocation has been set up calls the dynamic linker first.  */
2383 static const bfd_vma elf32_thumb2_plt0_entry [] =
2384 {
2385   /* NOTE: As this is a mixture of 16-bit and 32-bit instructions,
2386      an instruction maybe encoded to one or two array elements.  */
2387   0xf8dfb500,           /* push    {lr}          */
2388   0x44fee008,           /* ldr.w   lr, [pc, #8]  */
2389                         /* add     lr, pc        */
2390   0xff08f85e,           /* ldr.w   pc, [lr, #8]! */
2391   0x00000000,           /* &GOT[0] - .           */
2392 };
2393
2394 /* Subsequent entries in a procedure linkage table for thumb only target
2395    look like this.  */
2396 static const bfd_vma elf32_thumb2_plt_entry [] =
2397 {
2398   /* NOTE: As this is a mixture of 16-bit and 32-bit instructions,
2399      an instruction maybe encoded to one or two array elements.  */
2400   0x0c00f240,           /* movw    ip, #0xNNNN    */
2401   0x0c00f2c0,           /* movt    ip, #0xNNNN    */
2402   0xf8dc44fc,           /* add     ip, pc         */
2403   0xbf00f000            /* ldr.w   pc, [ip]       */
2404                         /* nop                    */
2405 };
2406
2407 /* The format of the first entry in the procedure linkage table
2408    for a VxWorks executable.  */
2409 static const bfd_vma elf32_arm_vxworks_exec_plt0_entry[] =
2410 {
2411   0xe52dc008,           /* str    ip,[sp,#-8]!                  */
2412   0xe59fc000,           /* ldr    ip,[pc]                       */
2413   0xe59cf008,           /* ldr    pc,[ip,#8]                    */
2414   0x00000000,           /* .long  _GLOBAL_OFFSET_TABLE_         */
2415 };
2416
2417 /* The format of subsequent entries in a VxWorks executable.  */
2418 static const bfd_vma elf32_arm_vxworks_exec_plt_entry[] =
2419 {
2420   0xe59fc000,         /* ldr    ip,[pc]                 */
2421   0xe59cf000,         /* ldr    pc,[ip]                 */
2422   0x00000000,         /* .long  @got                            */
2423   0xe59fc000,         /* ldr    ip,[pc]                 */
2424   0xea000000,         /* b      _PLT                            */
2425   0x00000000,         /* .long  @pltindex*sizeof(Elf32_Rela)    */
2426 };
2427
2428 /* The format of entries in a VxWorks shared library.  */
2429 static const bfd_vma elf32_arm_vxworks_shared_plt_entry[] =
2430 {
2431   0xe59fc000,         /* ldr    ip,[pc]                 */
2432   0xe79cf009,         /* ldr    pc,[ip,r9]                      */
2433   0x00000000,         /* .long  @got                            */
2434   0xe59fc000,         /* ldr    ip,[pc]                 */
2435   0xe599f008,         /* ldr    pc,[r9,#8]                      */
2436   0x00000000,         /* .long  @pltindex*sizeof(Elf32_Rela)    */
2437 };
2438
2439 /* An initial stub used if the PLT entry is referenced from Thumb code.  */
2440 #define PLT_THUMB_STUB_SIZE 4
2441 static const bfd_vma elf32_arm_plt_thumb_stub [] =
2442 {
2443   0x4778,               /* bx pc */
2444   0x46c0                /* nop   */
2445 };
2446
2447 /* The entries in a PLT when using a DLL-based target with multiple
2448    address spaces.  */
2449 static const bfd_vma elf32_arm_symbian_plt_entry [] =
2450 {
2451   0xe51ff004,         /* ldr   pc, [pc, #-4] */
2452   0x00000000,         /* dcd   R_ARM_GLOB_DAT(X) */
2453 };
2454
2455 /* The first entry in a procedure linkage table looks like
2456    this.  It is set up so that any shared library function that is
2457    called before the relocation has been set up calls the dynamic
2458    linker first.  */
2459 static const bfd_vma elf32_arm_nacl_plt0_entry [] =
2460 {
2461   /* First bundle: */
2462   0xe300c000,           /* movw ip, #:lower16:&GOT[2]-.+8       */
2463   0xe340c000,           /* movt ip, #:upper16:&GOT[2]-.+8       */
2464   0xe08cc00f,           /* add  ip, ip, pc                      */
2465   0xe52dc008,           /* str  ip, [sp, #-8]!                  */
2466   /* Second bundle: */
2467   0xe3ccc103,           /* bic  ip, ip, #0xc0000000             */
2468   0xe59cc000,           /* ldr  ip, [ip]                        */
2469   0xe3ccc13f,           /* bic  ip, ip, #0xc000000f             */
2470   0xe12fff1c,           /* bx   ip                              */
2471   /* Third bundle: */
2472   0xe320f000,           /* nop                                  */
2473   0xe320f000,           /* nop                                  */
2474   0xe320f000,           /* nop                                  */
2475   /* .Lplt_tail: */
2476   0xe50dc004,           /* str  ip, [sp, #-4]                   */
2477   /* Fourth bundle: */
2478   0xe3ccc103,           /* bic  ip, ip, #0xc0000000             */
2479   0xe59cc000,           /* ldr  ip, [ip]                        */
2480   0xe3ccc13f,           /* bic  ip, ip, #0xc000000f             */
2481   0xe12fff1c,           /* bx   ip                              */
2482 };
2483 #define ARM_NACL_PLT_TAIL_OFFSET        (11 * 4)
2484
2485 /* Subsequent entries in a procedure linkage table look like this.  */
2486 static const bfd_vma elf32_arm_nacl_plt_entry [] =
2487 {
2488   0xe300c000,           /* movw ip, #:lower16:&GOT[n]-.+8       */
2489   0xe340c000,           /* movt ip, #:upper16:&GOT[n]-.+8       */
2490   0xe08cc00f,           /* add  ip, ip, pc                      */
2491   0xea000000,           /* b    .Lplt_tail                      */
2492 };
2493
2494 #define ARM_MAX_FWD_BRANCH_OFFSET  ((((1 << 23) - 1) << 2) + 8)
2495 #define ARM_MAX_BWD_BRANCH_OFFSET  ((-((1 << 23) << 2)) + 8)
2496 #define THM_MAX_FWD_BRANCH_OFFSET  ((1 << 22) -2 + 4)
2497 #define THM_MAX_BWD_BRANCH_OFFSET  (-(1 << 22) + 4)
2498 #define THM2_MAX_FWD_BRANCH_OFFSET (((1 << 24) - 2) + 4)
2499 #define THM2_MAX_BWD_BRANCH_OFFSET (-(1 << 24) + 4)
2500 #define THM2_MAX_FWD_COND_BRANCH_OFFSET (((1 << 20) -2) + 4)
2501 #define THM2_MAX_BWD_COND_BRANCH_OFFSET (-(1 << 20) + 4)
2502
2503 enum stub_insn_type
2504 {
2505   THUMB16_TYPE = 1,
2506   THUMB32_TYPE,
2507   ARM_TYPE,
2508   DATA_TYPE
2509 };
2510
2511 #define THUMB16_INSN(X)         {(X), THUMB16_TYPE, R_ARM_NONE, 0}
2512 /* A bit of a hack.  A Thumb conditional branch, in which the proper condition
2513    is inserted in arm_build_one_stub().  */
2514 #define THUMB16_BCOND_INSN(X)   {(X), THUMB16_TYPE, R_ARM_NONE, 1}
2515 #define THUMB32_INSN(X)         {(X), THUMB32_TYPE, R_ARM_NONE, 0}
2516 #define THUMB32_MOVT(X)         {(X), THUMB32_TYPE, R_ARM_THM_MOVT_ABS, 0}
2517 #define THUMB32_MOVW(X)         {(X), THUMB32_TYPE, R_ARM_THM_MOVW_ABS_NC, 0}
2518 #define THUMB32_B_INSN(X, Z)    {(X), THUMB32_TYPE, R_ARM_THM_JUMP24, (Z)}
2519 #define ARM_INSN(X)             {(X), ARM_TYPE, R_ARM_NONE, 0}
2520 #define ARM_REL_INSN(X, Z)      {(X), ARM_TYPE, R_ARM_JUMP24, (Z)}
2521 #define DATA_WORD(X,Y,Z)        {(X), DATA_TYPE, (Y), (Z)}
2522
2523 typedef struct
2524 {
2525   bfd_vma              data;
2526   enum stub_insn_type  type;
2527   unsigned int         r_type;
2528   int                  reloc_addend;
2529 }  insn_sequence;
2530
2531 /* Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx
2532    to reach the stub if necessary.  */
2533 static const insn_sequence elf32_arm_stub_long_branch_any_any[] =
2534 {
2535   ARM_INSN (0xe51ff004),            /* ldr   pc, [pc, #-4] */
2536   DATA_WORD (0, R_ARM_ABS32, 0),    /* dcd   R_ARM_ABS32(X) */
2537 };
2538
2539 /* V4T Arm -> Thumb long branch stub. Used on V4T where blx is not
2540    available.  */
2541 static const insn_sequence elf32_arm_stub_long_branch_v4t_arm_thumb[] =
2542 {
2543   ARM_INSN (0xe59fc000),            /* ldr   ip, [pc, #0] */
2544   ARM_INSN (0xe12fff1c),            /* bx    ip */
2545   DATA_WORD (0, R_ARM_ABS32, 0),    /* dcd   R_ARM_ABS32(X) */
2546 };
2547
2548 /* Thumb -> Thumb long branch stub. Used on M-profile architectures.  */
2549 static const insn_sequence elf32_arm_stub_long_branch_thumb_only[] =
2550 {
2551   THUMB16_INSN (0xb401),             /* push {r0} */
2552   THUMB16_INSN (0x4802),             /* ldr  r0, [pc, #8] */
2553   THUMB16_INSN (0x4684),             /* mov  ip, r0 */
2554   THUMB16_INSN (0xbc01),             /* pop  {r0} */
2555   THUMB16_INSN (0x4760),             /* bx   ip */
2556   THUMB16_INSN (0xbf00),             /* nop */
2557   DATA_WORD (0, R_ARM_ABS32, 0),     /* dcd  R_ARM_ABS32(X) */
2558 };
2559
2560 /* Thumb -> Thumb long branch stub in thumb2 encoding.  Used on armv7.  */
2561 static const insn_sequence elf32_arm_stub_long_branch_thumb2_only[] =
2562 {
2563   THUMB32_INSN (0xf85ff000),         /* ldr.w  pc, [pc, #-0] */
2564   DATA_WORD (0, R_ARM_ABS32, 0),     /* dcd  R_ARM_ABS32(x) */
2565 };
2566
2567 /* Thumb -> Thumb long branch stub. Used for PureCode sections on Thumb2
2568    M-profile architectures.  */
2569 static const insn_sequence elf32_arm_stub_long_branch_thumb2_only_pure[] =
2570 {
2571   THUMB32_MOVW (0xf2400c00),         /* mov.w ip, R_ARM_MOVW_ABS_NC */
2572   THUMB32_MOVT (0xf2c00c00),         /* movt  ip, R_ARM_MOVT_ABS << 16 */
2573   THUMB16_INSN (0x4760),             /* bx   ip */
2574 };
2575
2576 /* V4T Thumb -> Thumb long branch stub. Using the stack is not
2577    allowed.  */
2578 static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_thumb[] =
2579 {
2580   THUMB16_INSN (0x4778),             /* bx   pc */
2581   THUMB16_INSN (0x46c0),             /* nop */
2582   ARM_INSN (0xe59fc000),             /* ldr  ip, [pc, #0] */
2583   ARM_INSN (0xe12fff1c),             /* bx   ip */
2584   DATA_WORD (0, R_ARM_ABS32, 0),     /* dcd  R_ARM_ABS32(X) */
2585 };
2586
2587 /* V4T Thumb -> ARM long branch stub. Used on V4T where blx is not
2588    available.  */
2589 static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_arm[] =
2590 {
2591   THUMB16_INSN (0x4778),             /* bx   pc */
2592   THUMB16_INSN (0x46c0),             /* nop   */
2593   ARM_INSN (0xe51ff004),             /* ldr   pc, [pc, #-4] */
2594   DATA_WORD (0, R_ARM_ABS32, 0),     /* dcd   R_ARM_ABS32(X) */
2595 };
2596
2597 /* V4T Thumb -> ARM short branch stub. Shorter variant of the above
2598    one, when the destination is close enough.  */
2599 static const insn_sequence elf32_arm_stub_short_branch_v4t_thumb_arm[] =
2600 {
2601   THUMB16_INSN (0x4778),             /* bx   pc */
2602   THUMB16_INSN (0x46c0),             /* nop   */
2603   ARM_REL_INSN (0xea000000, -8),     /* b    (X-8) */
2604 };
2605
2606 /* ARM/Thumb -> ARM long branch stub, PIC.  On V5T and above, use
2607    blx to reach the stub if necessary.  */
2608 static const insn_sequence elf32_arm_stub_long_branch_any_arm_pic[] =
2609 {
2610   ARM_INSN (0xe59fc000),             /* ldr   ip, [pc] */
2611   ARM_INSN (0xe08ff00c),             /* add   pc, pc, ip */
2612   DATA_WORD (0, R_ARM_REL32, -4),    /* dcd   R_ARM_REL32(X-4) */
2613 };
2614
2615 /* ARM/Thumb -> Thumb long branch stub, PIC.  On V5T and above, use
2616    blx to reach the stub if necessary.  We can not add into pc;
2617    it is not guaranteed to mode switch (different in ARMv6 and
2618    ARMv7).  */
2619 static const insn_sequence elf32_arm_stub_long_branch_any_thumb_pic[] =
2620 {
2621   ARM_INSN (0xe59fc004),             /* ldr   ip, [pc, #4] */
2622   ARM_INSN (0xe08fc00c),             /* add   ip, pc, ip */
2623   ARM_INSN (0xe12fff1c),             /* bx    ip */
2624   DATA_WORD (0, R_ARM_REL32, 0),     /* dcd   R_ARM_REL32(X) */
2625 };
2626
2627 /* V4T ARM -> ARM long branch stub, PIC.  */
2628 static const insn_sequence elf32_arm_stub_long_branch_v4t_arm_thumb_pic[] =
2629 {
2630   ARM_INSN (0xe59fc004),             /* ldr   ip, [pc, #4] */
2631   ARM_INSN (0xe08fc00c),             /* add   ip, pc, ip */
2632   ARM_INSN (0xe12fff1c),             /* bx    ip */
2633   DATA_WORD (0, R_ARM_REL32, 0),     /* dcd   R_ARM_REL32(X) */
2634 };
2635
2636 /* V4T Thumb -> ARM long branch stub, PIC.  */
2637 static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_arm_pic[] =
2638 {
2639   THUMB16_INSN (0x4778),             /* bx   pc */
2640   THUMB16_INSN (0x46c0),             /* nop  */
2641   ARM_INSN (0xe59fc000),             /* ldr  ip, [pc, #0] */
2642   ARM_INSN (0xe08cf00f),             /* add  pc, ip, pc */
2643   DATA_WORD (0, R_ARM_REL32, -4),     /* dcd  R_ARM_REL32(X) */
2644 };
2645
2646 /* Thumb -> Thumb long branch stub, PIC. Used on M-profile
2647    architectures.  */
2648 static const insn_sequence elf32_arm_stub_long_branch_thumb_only_pic[] =
2649 {
2650   THUMB16_INSN (0xb401),             /* push {r0} */
2651   THUMB16_INSN (0x4802),             /* ldr  r0, [pc, #8] */
2652   THUMB16_INSN (0x46fc),             /* mov  ip, pc */
2653   THUMB16_INSN (0x4484),             /* add  ip, r0 */
2654   THUMB16_INSN (0xbc01),             /* pop  {r0} */
2655   THUMB16_INSN (0x4760),             /* bx   ip */
2656   DATA_WORD (0, R_ARM_REL32, 4),     /* dcd  R_ARM_REL32(X) */
2657 };
2658
2659 /* V4T Thumb -> Thumb long branch stub, PIC. Using the stack is not
2660    allowed.  */
2661 static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_thumb_pic[] =
2662 {
2663   THUMB16_INSN (0x4778),             /* bx   pc */
2664   THUMB16_INSN (0x46c0),             /* nop */
2665   ARM_INSN (0xe59fc004),             /* ldr  ip, [pc, #4] */
2666   ARM_INSN (0xe08fc00c),             /* add   ip, pc, ip */
2667   ARM_INSN (0xe12fff1c),             /* bx   ip */
2668   DATA_WORD (0, R_ARM_REL32, 0),     /* dcd  R_ARM_REL32(X) */
2669 };
2670
2671 /* Thumb2/ARM -> TLS trampoline.  Lowest common denominator, which is a
2672    long PIC stub.  We can use r1 as a scratch -- and cannot use ip.  */
2673 static const insn_sequence elf32_arm_stub_long_branch_any_tls_pic[] =
2674 {
2675   ARM_INSN (0xe59f1000),             /* ldr   r1, [pc] */
2676   ARM_INSN (0xe08ff001),             /* add   pc, pc, r1 */
2677   DATA_WORD (0, R_ARM_REL32, -4),    /* dcd   R_ARM_REL32(X-4) */
2678 };
2679
2680 /* V4T Thumb -> TLS trampoline.  lowest common denominator, which is a
2681    long PIC stub.  We can use r1 as a scratch -- and cannot use ip.  */
2682 static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_tls_pic[] =
2683 {
2684   THUMB16_INSN (0x4778),             /* bx   pc */
2685   THUMB16_INSN (0x46c0),             /* nop */
2686   ARM_INSN (0xe59f1000),             /* ldr  r1, [pc, #0] */
2687   ARM_INSN (0xe081f00f),             /* add  pc, r1, pc */
2688   DATA_WORD (0, R_ARM_REL32, -4),    /* dcd  R_ARM_REL32(X) */
2689 };
2690
2691 /* NaCl ARM -> ARM long branch stub.  */
2692 static const insn_sequence elf32_arm_stub_long_branch_arm_nacl[] =
2693 {
2694   ARM_INSN (0xe59fc00c),                /* ldr  ip, [pc, #12] */
2695   ARM_INSN (0xe3ccc13f),                /* bic  ip, ip, #0xc000000f */
2696   ARM_INSN (0xe12fff1c),                /* bx   ip */
2697   ARM_INSN (0xe320f000),                /* nop */
2698   ARM_INSN (0xe125be70),                /* bkpt 0x5be0 */
2699   DATA_WORD (0, R_ARM_ABS32, 0),        /* dcd  R_ARM_ABS32(X) */
2700   DATA_WORD (0, R_ARM_NONE, 0),         /* .word 0 */
2701   DATA_WORD (0, R_ARM_NONE, 0),         /* .word 0 */
2702 };
2703
2704 /* NaCl ARM -> ARM long branch stub, PIC.  */
2705 static const insn_sequence elf32_arm_stub_long_branch_arm_nacl_pic[] =
2706 {
2707   ARM_INSN (0xe59fc00c),                /* ldr  ip, [pc, #12] */
2708   ARM_INSN (0xe08cc00f),                /* add  ip, ip, pc */
2709   ARM_INSN (0xe3ccc13f),                /* bic  ip, ip, #0xc000000f */
2710   ARM_INSN (0xe12fff1c),                /* bx   ip */
2711   ARM_INSN (0xe125be70),                /* bkpt 0x5be0 */
2712   DATA_WORD (0, R_ARM_REL32, 8),        /* dcd  R_ARM_REL32(X+8) */
2713   DATA_WORD (0, R_ARM_NONE, 0),         /* .word 0 */
2714   DATA_WORD (0, R_ARM_NONE, 0),         /* .word 0 */
2715 };
2716
2717 /* Stub used for transition to secure state (aka SG veneer).  */
2718 static const insn_sequence elf32_arm_stub_cmse_branch_thumb_only[] =
2719 {
2720   THUMB32_INSN (0xe97fe97f),            /* sg.  */
2721   THUMB32_B_INSN (0xf000b800, -4),      /* b.w original_branch_dest.  */
2722 };
2723
2724
2725 /* Cortex-A8 erratum-workaround stubs.  */
2726
2727 /* Stub used for conditional branches (which may be beyond +/-1MB away, so we
2728    can't use a conditional branch to reach this stub).  */
2729
2730 static const insn_sequence elf32_arm_stub_a8_veneer_b_cond[] =
2731 {
2732   THUMB16_BCOND_INSN (0xd001),         /* b<cond>.n true.  */
2733   THUMB32_B_INSN (0xf000b800, -4),     /* b.w insn_after_original_branch.  */
2734   THUMB32_B_INSN (0xf000b800, -4)      /* true: b.w original_branch_dest.  */
2735 };
2736
2737 /* Stub used for b.w and bl.w instructions.  */
2738
2739 static const insn_sequence elf32_arm_stub_a8_veneer_b[] =
2740 {
2741   THUMB32_B_INSN (0xf000b800, -4)       /* b.w original_branch_dest.  */
2742 };
2743
2744 static const insn_sequence elf32_arm_stub_a8_veneer_bl[] =
2745 {
2746   THUMB32_B_INSN (0xf000b800, -4)       /* b.w original_branch_dest.  */
2747 };
2748
2749 /* Stub used for Thumb-2 blx.w instructions.  We modified the original blx.w
2750    instruction (which switches to ARM mode) to point to this stub.  Jump to the
2751    real destination using an ARM-mode branch.  */
2752
2753 static const insn_sequence elf32_arm_stub_a8_veneer_blx[] =
2754 {
2755   ARM_REL_INSN (0xea000000, -8) /* b original_branch_dest.  */
2756 };
2757
2758 /* For each section group there can be a specially created linker section
2759    to hold the stubs for that group.  The name of the stub section is based
2760    upon the name of another section within that group with the suffix below
2761    applied.
2762
2763    PR 13049: STUB_SUFFIX used to be ".stub", but this allowed the user to
2764    create what appeared to be a linker stub section when it actually
2765    contained user code/data.  For example, consider this fragment:
2766
2767      const char * stubborn_problems[] = { "np" };
2768
2769    If this is compiled with "-fPIC -fdata-sections" then gcc produces a
2770    section called:
2771
2772      .data.rel.local.stubborn_problems
2773
2774    This then causes problems in arm32_arm_build_stubs() as it triggers:
2775
2776       // Ignore non-stub sections.
2777       if (!strstr (stub_sec->name, STUB_SUFFIX))
2778         continue;
2779
2780    And so the section would be ignored instead of being processed.  Hence
2781    the change in definition of STUB_SUFFIX to a name that cannot be a valid
2782    C identifier.  */
2783 #define STUB_SUFFIX ".__stub"
2784
2785 /* One entry per long/short branch stub defined above.  */
2786 #define DEF_STUBS \
2787   DEF_STUB(long_branch_any_any) \
2788   DEF_STUB(long_branch_v4t_arm_thumb) \
2789   DEF_STUB(long_branch_thumb_only) \
2790   DEF_STUB(long_branch_v4t_thumb_thumb) \
2791   DEF_STUB(long_branch_v4t_thumb_arm) \
2792   DEF_STUB(short_branch_v4t_thumb_arm) \
2793   DEF_STUB(long_branch_any_arm_pic) \
2794   DEF_STUB(long_branch_any_thumb_pic) \
2795   DEF_STUB(long_branch_v4t_thumb_thumb_pic) \
2796   DEF_STUB(long_branch_v4t_arm_thumb_pic) \
2797   DEF_STUB(long_branch_v4t_thumb_arm_pic) \
2798   DEF_STUB(long_branch_thumb_only_pic) \
2799   DEF_STUB(long_branch_any_tls_pic) \
2800   DEF_STUB(long_branch_v4t_thumb_tls_pic) \
2801   DEF_STUB(long_branch_arm_nacl) \
2802   DEF_STUB(long_branch_arm_nacl_pic) \
2803   DEF_STUB(cmse_branch_thumb_only) \
2804   DEF_STUB(a8_veneer_b_cond) \
2805   DEF_STUB(a8_veneer_b) \
2806   DEF_STUB(a8_veneer_bl) \
2807   DEF_STUB(a8_veneer_blx) \
2808   DEF_STUB(long_branch_thumb2_only) \
2809   DEF_STUB(long_branch_thumb2_only_pure)
2810
2811 #define DEF_STUB(x) arm_stub_##x,
2812 enum elf32_arm_stub_type
2813 {
2814   arm_stub_none,
2815   DEF_STUBS
2816   max_stub_type
2817 };
2818 #undef DEF_STUB
2819
2820 /* Note the first a8_veneer type.  */
2821 const unsigned arm_stub_a8_veneer_lwm = arm_stub_a8_veneer_b_cond;
2822
2823 typedef struct
2824 {
2825   const insn_sequence* template_sequence;
2826   int template_size;
2827 } stub_def;
2828
2829 #define DEF_STUB(x) {elf32_arm_stub_##x, ARRAY_SIZE(elf32_arm_stub_##x)},
2830 static const stub_def stub_definitions[] =
2831 {
2832   {NULL, 0},
2833   DEF_STUBS
2834 };
2835
2836 struct elf32_arm_stub_hash_entry
2837 {
2838   /* Base hash table entry structure.  */
2839   struct bfd_hash_entry root;
2840
2841   /* The stub section.  */
2842   asection *stub_sec;
2843
2844   /* Offset within stub_sec of the beginning of this stub.  */
2845   bfd_vma stub_offset;
2846
2847   /* Given the symbol's value and its section we can determine its final
2848      value when building the stubs (so the stub knows where to jump).  */
2849   bfd_vma target_value;
2850   asection *target_section;
2851
2852   /* Same as above but for the source of the branch to the stub.  Used for
2853      Cortex-A8 erratum workaround to patch it to branch to the stub.  As
2854      such, source section does not need to be recorded since Cortex-A8 erratum
2855      workaround stubs are only generated when both source and target are in the
2856      same section.  */
2857   bfd_vma source_value;
2858
2859   /* The instruction which caused this stub to be generated (only valid for
2860      Cortex-A8 erratum workaround stubs at present).  */
2861   unsigned long orig_insn;
2862
2863   /* The stub type.  */
2864   enum elf32_arm_stub_type stub_type;
2865   /* Its encoding size in bytes.  */
2866   int stub_size;
2867   /* Its template.  */
2868   const insn_sequence *stub_template;
2869   /* The size of the template (number of entries).  */
2870   int stub_template_size;
2871
2872   /* The symbol table entry, if any, that this was derived from.  */
2873   struct elf32_arm_link_hash_entry *h;
2874
2875   /* Type of branch.  */
2876   enum arm_st_branch_type branch_type;
2877
2878   /* Where this stub is being called from, or, in the case of combined
2879      stub sections, the first input section in the group.  */
2880   asection *id_sec;
2881
2882   /* The name for the local symbol at the start of this stub.  The
2883      stub name in the hash table has to be unique; this does not, so
2884      it can be friendlier.  */
2885   char *output_name;
2886 };
2887
2888 /* Used to build a map of a section.  This is required for mixed-endian
2889    code/data.  */
2890
2891 typedef struct elf32_elf_section_map
2892 {
2893   bfd_vma vma;
2894   char type;
2895 }
2896 elf32_arm_section_map;
2897
2898 /* Information about a VFP11 erratum veneer, or a branch to such a veneer.  */
2899
2900 typedef enum
2901 {
2902   VFP11_ERRATUM_BRANCH_TO_ARM_VENEER,
2903   VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER,
2904   VFP11_ERRATUM_ARM_VENEER,
2905   VFP11_ERRATUM_THUMB_VENEER
2906 }
2907 elf32_vfp11_erratum_type;
2908
2909 typedef struct elf32_vfp11_erratum_list
2910 {
2911   struct elf32_vfp11_erratum_list *next;
2912   bfd_vma vma;
2913   union
2914   {
2915     struct
2916     {
2917       struct elf32_vfp11_erratum_list *veneer;
2918       unsigned int vfp_insn;
2919     } b;
2920     struct
2921     {
2922       struct elf32_vfp11_erratum_list *branch;
2923       unsigned int id;
2924     } v;
2925   } u;
2926   elf32_vfp11_erratum_type type;
2927 }
2928 elf32_vfp11_erratum_list;
2929
2930 /* Information about a STM32L4XX erratum veneer, or a branch to such a
2931    veneer.  */
2932 typedef enum
2933 {
2934   STM32L4XX_ERRATUM_BRANCH_TO_VENEER,
2935   STM32L4XX_ERRATUM_VENEER
2936 }
2937 elf32_stm32l4xx_erratum_type;
2938
2939 typedef struct elf32_stm32l4xx_erratum_list
2940 {
2941   struct elf32_stm32l4xx_erratum_list *next;
2942   bfd_vma vma;
2943   union
2944   {
2945     struct
2946     {
2947       struct elf32_stm32l4xx_erratum_list *veneer;
2948       unsigned int insn;
2949     } b;
2950     struct
2951     {
2952       struct elf32_stm32l4xx_erratum_list *branch;
2953       unsigned int id;
2954     } v;
2955   } u;
2956   elf32_stm32l4xx_erratum_type type;
2957 }
2958 elf32_stm32l4xx_erratum_list;
2959
2960 typedef enum
2961 {
2962   DELETE_EXIDX_ENTRY,
2963   INSERT_EXIDX_CANTUNWIND_AT_END
2964 }
2965 arm_unwind_edit_type;
2966
2967 /* A (sorted) list of edits to apply to an unwind table.  */
2968 typedef struct arm_unwind_table_edit
2969 {
2970   arm_unwind_edit_type type;
2971   /* Note: we sometimes want to insert an unwind entry corresponding to a
2972      section different from the one we're currently writing out, so record the
2973      (text) section this edit relates to here.  */
2974   asection *linked_section;
2975   unsigned int index;
2976   struct arm_unwind_table_edit *next;
2977 }
2978 arm_unwind_table_edit;
2979
2980 typedef struct _arm_elf_section_data
2981 {
2982   /* Information about mapping symbols.  */
2983   struct bfd_elf_section_data elf;
2984   unsigned int mapcount;
2985   unsigned int mapsize;
2986   elf32_arm_section_map *map;
2987   /* Information about CPU errata.  */
2988   unsigned int erratumcount;
2989   elf32_vfp11_erratum_list *erratumlist;
2990   unsigned int stm32l4xx_erratumcount;
2991   elf32_stm32l4xx_erratum_list *stm32l4xx_erratumlist;
2992   unsigned int additional_reloc_count;
2993   /* Information about unwind tables.  */
2994   union
2995   {
2996     /* Unwind info attached to a text section.  */
2997     struct
2998     {
2999       asection *arm_exidx_sec;
3000     } text;
3001
3002     /* Unwind info attached to an .ARM.exidx section.  */
3003     struct
3004     {
3005       arm_unwind_table_edit *unwind_edit_list;
3006       arm_unwind_table_edit *unwind_edit_tail;
3007     } exidx;
3008   } u;
3009 }
3010 _arm_elf_section_data;
3011
3012 #define elf32_arm_section_data(sec) \
3013   ((_arm_elf_section_data *) elf_section_data (sec))
3014
3015 /* A fix which might be required for Cortex-A8 Thumb-2 branch/TLB erratum.
3016    These fixes are subject to a relaxation procedure (in elf32_arm_size_stubs),
3017    so may be created multiple times: we use an array of these entries whilst
3018    relaxing which we can refresh easily, then create stubs for each potentially
3019    erratum-triggering instruction once we've settled on a solution.  */
3020
3021 struct a8_erratum_fix
3022 {
3023   bfd *input_bfd;
3024   asection *section;
3025   bfd_vma offset;
3026   bfd_vma target_offset;
3027   unsigned long orig_insn;
3028   char *stub_name;
3029   enum elf32_arm_stub_type stub_type;
3030   enum arm_st_branch_type branch_type;
3031 };
3032
3033 /* A table of relocs applied to branches which might trigger Cortex-A8
3034    erratum.  */
3035
3036 struct a8_erratum_reloc
3037 {
3038   bfd_vma from;
3039   bfd_vma destination;
3040   struct elf32_arm_link_hash_entry *hash;
3041   const char *sym_name;
3042   unsigned int r_type;
3043   enum arm_st_branch_type branch_type;
3044   bfd_boolean non_a8_stub;
3045 };
3046
3047 /* The size of the thread control block.  */
3048 #define TCB_SIZE        8
3049
3050 /* ARM-specific information about a PLT entry, over and above the usual
3051    gotplt_union.  */
3052 struct arm_plt_info
3053 {
3054   /* We reference count Thumb references to a PLT entry separately,
3055      so that we can emit the Thumb trampoline only if needed.  */
3056   bfd_signed_vma thumb_refcount;
3057
3058   /* Some references from Thumb code may be eliminated by BL->BLX
3059      conversion, so record them separately.  */
3060   bfd_signed_vma maybe_thumb_refcount;
3061
3062   /* How many of the recorded PLT accesses were from non-call relocations.
3063      This information is useful when deciding whether anything takes the
3064      address of an STT_GNU_IFUNC PLT.  A value of 0 means that all
3065      non-call references to the function should resolve directly to the
3066      real runtime target.  */
3067   unsigned int noncall_refcount;
3068
3069   /* Since PLT entries have variable size if the Thumb prologue is
3070      used, we need to record the index into .got.plt instead of
3071      recomputing it from the PLT offset.  */
3072   bfd_signed_vma got_offset;
3073 };
3074
3075 /* Information about an .iplt entry for a local STT_GNU_IFUNC symbol.  */
3076 struct arm_local_iplt_info
3077 {
3078   /* The information that is usually found in the generic ELF part of
3079      the hash table entry.  */
3080   union gotplt_union root;
3081
3082   /* The information that is usually found in the ARM-specific part of
3083      the hash table entry.  */
3084   struct arm_plt_info arm;
3085
3086   /* A list of all potential dynamic relocations against this symbol.  */
3087   struct elf_dyn_relocs *dyn_relocs;
3088 };
3089
3090 /* Structure to handle FDPIC support for local functions.  */
3091 struct fdpic_local {
3092   unsigned int funcdesc_cnt;
3093   unsigned int gotofffuncdesc_cnt;
3094   int funcdesc_offset;
3095 };
3096
3097 struct elf_arm_obj_tdata
3098 {
3099   struct elf_obj_tdata root;
3100
3101   /* tls_type for each local got entry.  */
3102   char *local_got_tls_type;
3103
3104   /* GOTPLT entries for TLS descriptors.  */
3105   bfd_vma *local_tlsdesc_gotent;
3106
3107   /* Information for local symbols that need entries in .iplt.  */
3108   struct arm_local_iplt_info **local_iplt;
3109
3110   /* Zero to warn when linking objects with incompatible enum sizes.  */
3111   int no_enum_size_warning;
3112
3113   /* Zero to warn when linking objects with incompatible wchar_t sizes.  */
3114   int no_wchar_size_warning;
3115
3116   /* Maintains FDPIC counters and funcdesc info.  */
3117   struct fdpic_local *local_fdpic_cnts;
3118 };
3119
3120 #define elf_arm_tdata(bfd) \
3121   ((struct elf_arm_obj_tdata *) (bfd)->tdata.any)
3122
3123 #define elf32_arm_local_got_tls_type(bfd) \
3124   (elf_arm_tdata (bfd)->local_got_tls_type)
3125
3126 #define elf32_arm_local_tlsdesc_gotent(bfd) \
3127   (elf_arm_tdata (bfd)->local_tlsdesc_gotent)
3128
3129 #define elf32_arm_local_iplt(bfd) \
3130   (elf_arm_tdata (bfd)->local_iplt)
3131
3132 #define elf32_arm_local_fdpic_cnts(bfd) \
3133   (elf_arm_tdata (bfd)->local_fdpic_cnts)
3134
3135 #define is_arm_elf(bfd) \
3136   (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
3137    && elf_tdata (bfd) != NULL \
3138    && elf_object_id (bfd) == ARM_ELF_DATA)
3139
3140 static bfd_boolean
3141 elf32_arm_mkobject (bfd *abfd)
3142 {
3143   return bfd_elf_allocate_object (abfd, sizeof (struct elf_arm_obj_tdata),
3144                                   ARM_ELF_DATA);
3145 }
3146
3147 #define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
3148
3149 /* Structure to handle FDPIC support for extern functions.  */
3150 struct fdpic_global {
3151   unsigned int gotofffuncdesc_cnt;
3152   unsigned int gotfuncdesc_cnt;
3153   unsigned int funcdesc_cnt;
3154   int funcdesc_offset;
3155   int gotfuncdesc_offset;
3156 };
3157
3158 /* Arm ELF linker hash entry.  */
3159 struct elf32_arm_link_hash_entry
3160 {
3161   struct elf_link_hash_entry root;
3162
3163   /* Track dynamic relocs copied for this symbol.  */
3164   struct elf_dyn_relocs *dyn_relocs;
3165
3166   /* ARM-specific PLT information.  */
3167   struct arm_plt_info plt;
3168
3169 #define GOT_UNKNOWN     0
3170 #define GOT_NORMAL      1
3171 #define GOT_TLS_GD      2
3172 #define GOT_TLS_IE      4
3173 #define GOT_TLS_GDESC   8
3174 #define GOT_TLS_GD_ANY_P(type)  ((type & GOT_TLS_GD) || (type & GOT_TLS_GDESC))
3175   unsigned int tls_type : 8;
3176
3177   /* True if the symbol's PLT entry is in .iplt rather than .plt.  */
3178   unsigned int is_iplt : 1;
3179
3180   unsigned int unused : 23;
3181
3182   /* Offset of the GOTPLT entry reserved for the TLS descriptor,
3183      starting at the end of the jump table.  */
3184   bfd_vma tlsdesc_got;
3185
3186   /* The symbol marking the real symbol location for exported thumb
3187      symbols with Arm stubs.  */
3188   struct elf_link_hash_entry *export_glue;
3189
3190   /* A pointer to the most recently used stub hash entry against this
3191      symbol.  */
3192   struct elf32_arm_stub_hash_entry *stub_cache;
3193
3194   /* Counter for FDPIC relocations against this symbol.  */
3195   struct fdpic_global fdpic_cnts;
3196 };
3197
3198 /* Traverse an arm ELF linker hash table.  */
3199 #define elf32_arm_link_hash_traverse(table, func, info)                 \
3200   (elf_link_hash_traverse                                               \
3201    (&(table)->root,                                                     \
3202     (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func),    \
3203     (info)))
3204
3205 /* Get the ARM elf linker hash table from a link_info structure.  */
3206 #define elf32_arm_hash_table(info) \
3207   (elf_hash_table_id ((struct elf_link_hash_table *) ((info)->hash)) \
3208   == ARM_ELF_DATA ? ((struct elf32_arm_link_hash_table *) ((info)->hash)) : NULL)
3209
3210 #define arm_stub_hash_lookup(table, string, create, copy) \
3211   ((struct elf32_arm_stub_hash_entry *) \
3212    bfd_hash_lookup ((table), (string), (create), (copy)))
3213
3214 /* Array to keep track of which stub sections have been created, and
3215    information on stub grouping.  */
3216 struct map_stub
3217 {
3218   /* This is the section to which stubs in the group will be
3219      attached.  */
3220   asection *link_sec;
3221   /* The stub section.  */
3222   asection *stub_sec;
3223 };
3224
3225 #define elf32_arm_compute_jump_table_size(htab) \
3226   ((htab)->next_tls_desc_index * 4)
3227
3228 /* ARM ELF linker hash table.  */
3229 struct elf32_arm_link_hash_table
3230 {
3231   /* The main hash table.  */
3232   struct elf_link_hash_table root;
3233
3234   /* The size in bytes of the section containing the Thumb-to-ARM glue.  */
3235   bfd_size_type thumb_glue_size;
3236
3237   /* The size in bytes of the section containing the ARM-to-Thumb glue.  */
3238   bfd_size_type arm_glue_size;
3239
3240   /* The size in bytes of section containing the ARMv4 BX veneers.  */
3241   bfd_size_type bx_glue_size;
3242
3243   /* Offsets of ARMv4 BX veneers.  Bit1 set if present, and Bit0 set when
3244      veneer has been populated.  */
3245   bfd_vma bx_glue_offset[15];
3246
3247   /* The size in bytes of the section containing glue for VFP11 erratum
3248      veneers.  */
3249   bfd_size_type vfp11_erratum_glue_size;
3250
3251  /* The size in bytes of the section containing glue for STM32L4XX erratum
3252      veneers.  */
3253   bfd_size_type stm32l4xx_erratum_glue_size;
3254
3255   /* A table of fix locations for Cortex-A8 Thumb-2 branch/TLB erratum.  This
3256      holds Cortex-A8 erratum fix locations between elf32_arm_size_stubs() and
3257      elf32_arm_write_section().  */
3258   struct a8_erratum_fix *a8_erratum_fixes;
3259   unsigned int num_a8_erratum_fixes;
3260
3261   /* An arbitrary input BFD chosen to hold the glue sections.  */
3262   bfd * bfd_of_glue_owner;
3263
3264   /* Nonzero to output a BE8 image.  */
3265   int byteswap_code;
3266
3267   /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
3268      Nonzero if R_ARM_TARGET1 means R_ARM_REL32.  */
3269   int target1_is_rel;
3270
3271   /* The relocation to use for R_ARM_TARGET2 relocations.  */
3272   int target2_reloc;
3273
3274   /* 0 = Ignore R_ARM_V4BX.
3275      1 = Convert BX to MOV PC.
3276      2 = Generate v4 interworing stubs.  */
3277   int fix_v4bx;
3278
3279   /* Whether we should fix the Cortex-A8 Thumb-2 branch/TLB erratum.  */
3280   int fix_cortex_a8;
3281
3282   /* Whether we should fix the ARM1176 BLX immediate issue.  */
3283   int fix_arm1176;
3284
3285   /* Nonzero if the ARM/Thumb BLX instructions are available for use.  */
3286   int use_blx;
3287
3288   /* What sort of code sequences we should look for which may trigger the
3289      VFP11 denorm erratum.  */
3290   bfd_arm_vfp11_fix vfp11_fix;
3291
3292   /* Global counter for the number of fixes we have emitted.  */
3293   int num_vfp11_fixes;
3294
3295   /* What sort of code sequences we should look for which may trigger the
3296      STM32L4XX erratum.  */
3297   bfd_arm_stm32l4xx_fix stm32l4xx_fix;
3298
3299   /* Global counter for the number of fixes we have emitted.  */
3300   int num_stm32l4xx_fixes;
3301
3302   /* Nonzero to force PIC branch veneers.  */
3303   int pic_veneer;
3304
3305   /* The number of bytes in the initial entry in the PLT.  */
3306   bfd_size_type plt_header_size;
3307
3308   /* The number of bytes in the subsequent PLT etries.  */
3309   bfd_size_type plt_entry_size;
3310
3311   /* True if the target system is VxWorks.  */
3312   int vxworks_p;
3313
3314   /* True if the target system is Symbian OS.  */
3315   int symbian_p;
3316
3317   /* True if the target system is Native Client.  */
3318   int nacl_p;
3319
3320   /* True if the target uses REL relocations.  */
3321   bfd_boolean use_rel;
3322
3323   /* Nonzero if import library must be a secure gateway import library
3324      as per ARMv8-M Security Extensions.  */
3325   int cmse_implib;
3326
3327   /* The import library whose symbols' address must remain stable in
3328      the import library generated.  */
3329   bfd *in_implib_bfd;
3330
3331   /* The index of the next unused R_ARM_TLS_DESC slot in .rel.plt.  */
3332   bfd_vma next_tls_desc_index;
3333
3334   /* How many R_ARM_TLS_DESC relocations were generated so far.  */
3335   bfd_vma num_tls_desc;
3336
3337   /* The (unloaded but important) VxWorks .rela.plt.unloaded section.  */
3338   asection *srelplt2;
3339
3340   /* The offset into splt of the PLT entry for the TLS descriptor
3341      resolver.  Special values are 0, if not necessary (or not found
3342      to be necessary yet), and -1 if needed but not determined
3343      yet.  */
3344   bfd_vma dt_tlsdesc_plt;
3345
3346   /* The offset into sgot of the GOT entry used by the PLT entry
3347      above.  */
3348   bfd_vma dt_tlsdesc_got;
3349
3350   /* Offset in .plt section of tls_arm_trampoline.  */
3351   bfd_vma tls_trampoline;
3352
3353   /* Data for R_ARM_TLS_LDM32/R_ARM_TLS_LDM32_FDPIC relocations.  */
3354   union
3355   {
3356     bfd_signed_vma refcount;
3357     bfd_vma offset;
3358   } tls_ldm_got;
3359
3360   /* Small local sym cache.  */
3361   struct sym_cache sym_cache;
3362
3363   /* For convenience in allocate_dynrelocs.  */
3364   bfd * obfd;
3365
3366   /* The amount of space used by the reserved portion of the sgotplt
3367      section, plus whatever space is used by the jump slots.  */
3368   bfd_vma sgotplt_jump_table_size;
3369
3370   /* The stub hash table.  */
3371   struct bfd_hash_table stub_hash_table;
3372
3373   /* Linker stub bfd.  */
3374   bfd *stub_bfd;
3375
3376   /* Linker call-backs.  */
3377   asection * (*add_stub_section) (const char *, asection *, asection *,
3378                                   unsigned int);
3379   void (*layout_sections_again) (void);
3380
3381   /* Array to keep track of which stub sections have been created, and
3382      information on stub grouping.  */
3383   struct map_stub *stub_group;
3384
3385   /* Input stub section holding secure gateway veneers.  */
3386   asection *cmse_stub_sec;
3387
3388   /* Offset in cmse_stub_sec where new SG veneers (not in input import library)
3389      start to be allocated.  */
3390   bfd_vma new_cmse_stub_offset;
3391
3392   /* Number of elements in stub_group.  */
3393   unsigned int top_id;
3394
3395   /* Assorted information used by elf32_arm_size_stubs.  */
3396   unsigned int bfd_count;
3397   unsigned int top_index;
3398   asection **input_list;
3399
3400   /* True if the target system uses FDPIC. */
3401   int fdpic_p;
3402
3403   /* Fixup section. Used for FDPIC.  */
3404   asection *srofixup;
3405 };
3406
3407 /* Add an FDPIC read-only fixup.  */
3408 static void
3409 arm_elf_add_rofixup (bfd *output_bfd, asection *srofixup, bfd_vma offset)
3410 {
3411   bfd_vma fixup_offset;
3412
3413   fixup_offset = srofixup->reloc_count++ * 4;
3414   BFD_ASSERT (fixup_offset < srofixup->size);
3415   bfd_put_32 (output_bfd, offset, srofixup->contents + fixup_offset);
3416 }
3417
3418 static inline int
3419 ctz (unsigned int mask)
3420 {
3421 #if GCC_VERSION >= 3004
3422   return __builtin_ctz (mask);
3423 #else
3424   unsigned int i;
3425
3426   for (i = 0; i < 8 * sizeof (mask); i++)
3427     {
3428       if (mask & 0x1)
3429         break;
3430       mask = (mask >> 1);
3431     }
3432   return i;
3433 #endif
3434 }
3435
3436 static inline int
3437 elf32_arm_popcount (unsigned int mask)
3438 {
3439 #if GCC_VERSION >= 3004
3440   return __builtin_popcount (mask);
3441 #else
3442   unsigned int i;
3443   int sum = 0;
3444
3445   for (i = 0; i < 8 * sizeof (mask); i++)
3446     {
3447       if (mask & 0x1)
3448         sum++;
3449       mask = (mask >> 1);
3450     }
3451   return sum;
3452 #endif
3453 }
3454
3455 static void elf32_arm_add_dynreloc (bfd *output_bfd, struct bfd_link_info *info,
3456                                     asection *sreloc, Elf_Internal_Rela *rel);
3457
3458 static void
3459 arm_elf_fill_funcdesc(bfd *output_bfd,
3460                       struct bfd_link_info *info,
3461                       int *funcdesc_offset,
3462                       int dynindx,
3463                       int offset,
3464                       bfd_vma addr,
3465                       bfd_vma dynreloc_value,
3466                       bfd_vma seg)
3467 {
3468   if ((*funcdesc_offset & 1) == 0)
3469     {
3470       struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
3471       asection *sgot = globals->root.sgot;
3472
3473       if (bfd_link_pic(info))
3474         {
3475           asection *srelgot = globals->root.srelgot;
3476           Elf_Internal_Rela outrel;
3477
3478           outrel.r_info = ELF32_R_INFO (dynindx, R_ARM_FUNCDESC_VALUE);
3479           outrel.r_offset = sgot->output_section->vma + sgot->output_offset + offset;
3480           outrel.r_addend = 0;
3481
3482           elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
3483           bfd_put_32 (output_bfd, addr, sgot->contents + offset);
3484           bfd_put_32 (output_bfd, seg, sgot->contents + offset + 4);
3485         }
3486       else
3487         {
3488           struct elf_link_hash_entry *hgot = globals->root.hgot;
3489           bfd_vma got_value = hgot->root.u.def.value
3490             + hgot->root.u.def.section->output_section->vma
3491             + hgot->root.u.def.section->output_offset;
3492
3493           arm_elf_add_rofixup(output_bfd, globals->srofixup,
3494                               sgot->output_section->vma + sgot->output_offset
3495                               + offset);
3496           arm_elf_add_rofixup(output_bfd, globals->srofixup,
3497                               sgot->output_section->vma + sgot->output_offset
3498                               + offset + 4);
3499           bfd_put_32 (output_bfd, dynreloc_value, sgot->contents + offset);
3500           bfd_put_32 (output_bfd, got_value, sgot->contents + offset + 4);
3501         }
3502       *funcdesc_offset |= 1;
3503     }
3504 }
3505
3506 /* Create an entry in an ARM ELF linker hash table.  */
3507
3508 static struct bfd_hash_entry *
3509 elf32_arm_link_hash_newfunc (struct bfd_hash_entry * entry,
3510                              struct bfd_hash_table * table,
3511                              const char * string)
3512 {
3513   struct elf32_arm_link_hash_entry * ret =
3514     (struct elf32_arm_link_hash_entry *) entry;
3515
3516   /* Allocate the structure if it has not already been allocated by a
3517      subclass.  */
3518   if (ret == NULL)
3519     ret = (struct elf32_arm_link_hash_entry *)
3520         bfd_hash_allocate (table, sizeof (struct elf32_arm_link_hash_entry));
3521   if (ret == NULL)
3522     return (struct bfd_hash_entry *) ret;
3523
3524   /* Call the allocation method of the superclass.  */
3525   ret = ((struct elf32_arm_link_hash_entry *)
3526          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3527                                      table, string));
3528   if (ret != NULL)
3529     {
3530       ret->dyn_relocs = NULL;
3531       ret->tls_type = GOT_UNKNOWN;
3532       ret->tlsdesc_got = (bfd_vma) -1;
3533       ret->plt.thumb_refcount = 0;
3534       ret->plt.maybe_thumb_refcount = 0;
3535       ret->plt.noncall_refcount = 0;
3536       ret->plt.got_offset = -1;
3537       ret->is_iplt = FALSE;
3538       ret->export_glue = NULL;
3539
3540       ret->stub_cache = NULL;
3541
3542       ret->fdpic_cnts.gotofffuncdesc_cnt = 0;
3543       ret->fdpic_cnts.gotfuncdesc_cnt = 0;
3544       ret->fdpic_cnts.funcdesc_cnt = 0;
3545       ret->fdpic_cnts.funcdesc_offset = -1;
3546       ret->fdpic_cnts.gotfuncdesc_offset = -1;
3547     }
3548
3549   return (struct bfd_hash_entry *) ret;
3550 }
3551
3552 /* Ensure that we have allocated bookkeeping structures for ABFD's local
3553    symbols.  */
3554
3555 static bfd_boolean
3556 elf32_arm_allocate_local_sym_info (bfd *abfd)
3557 {
3558   if (elf_local_got_refcounts (abfd) == NULL)
3559     {
3560       bfd_size_type num_syms;
3561       bfd_size_type size;
3562       char *data;
3563
3564       num_syms = elf_tdata (abfd)->symtab_hdr.sh_info;
3565       size = num_syms * (sizeof (bfd_signed_vma)
3566                          + sizeof (struct arm_local_iplt_info *)
3567                          + sizeof (bfd_vma)
3568                          + sizeof (char)
3569                          + sizeof (struct fdpic_local));
3570       data = bfd_zalloc (abfd, size);
3571       if (data == NULL)
3572         return FALSE;
3573
3574       elf32_arm_local_fdpic_cnts (abfd) = (struct fdpic_local *) data;
3575       data += num_syms * sizeof (struct fdpic_local);
3576
3577       elf_local_got_refcounts (abfd) = (bfd_signed_vma *) data;
3578       data += num_syms * sizeof (bfd_signed_vma);
3579
3580       elf32_arm_local_iplt (abfd) = (struct arm_local_iplt_info **) data;
3581       data += num_syms * sizeof (struct arm_local_iplt_info *);
3582
3583       elf32_arm_local_tlsdesc_gotent (abfd) = (bfd_vma *) data;
3584       data += num_syms * sizeof (bfd_vma);
3585
3586       elf32_arm_local_got_tls_type (abfd) = data;
3587     }
3588   return TRUE;
3589 }
3590
3591 /* Return the .iplt information for local symbol R_SYMNDX, which belongs
3592    to input bfd ABFD.  Create the information if it doesn't already exist.
3593    Return null if an allocation fails.  */
3594
3595 static struct arm_local_iplt_info *
3596 elf32_arm_create_local_iplt (bfd *abfd, unsigned long r_symndx)
3597 {
3598   struct arm_local_iplt_info **ptr;
3599
3600   if (!elf32_arm_allocate_local_sym_info (abfd))
3601     return NULL;
3602
3603   BFD_ASSERT (r_symndx < elf_tdata (abfd)->symtab_hdr.sh_info);
3604   ptr = &elf32_arm_local_iplt (abfd)[r_symndx];
3605   if (*ptr == NULL)
3606     *ptr = bfd_zalloc (abfd, sizeof (**ptr));
3607   return *ptr;
3608 }
3609
3610 /* Try to obtain PLT information for the symbol with index R_SYMNDX
3611    in ABFD's symbol table.  If the symbol is global, H points to its
3612    hash table entry, otherwise H is null.
3613
3614    Return true if the symbol does have PLT information.  When returning
3615    true, point *ROOT_PLT at the target-independent reference count/offset
3616    union and *ARM_PLT at the ARM-specific information.  */
3617
3618 static bfd_boolean
3619 elf32_arm_get_plt_info (bfd *abfd, struct elf32_arm_link_hash_table *globals,
3620                         struct elf32_arm_link_hash_entry *h,
3621                         unsigned long r_symndx, union gotplt_union **root_plt,
3622                         struct arm_plt_info **arm_plt)
3623 {
3624   struct arm_local_iplt_info *local_iplt;
3625
3626   if (globals->root.splt == NULL && globals->root.iplt == NULL)
3627     return FALSE;
3628
3629   if (h != NULL)
3630     {
3631       *root_plt = &h->root.plt;
3632       *arm_plt = &h->plt;
3633       return TRUE;
3634     }
3635
3636   if (elf32_arm_local_iplt (abfd) == NULL)
3637     return FALSE;
3638
3639   local_iplt = elf32_arm_local_iplt (abfd)[r_symndx];
3640   if (local_iplt == NULL)
3641     return FALSE;
3642
3643   *root_plt = &local_iplt->root;
3644   *arm_plt = &local_iplt->arm;
3645   return TRUE;
3646 }
3647
3648 static bfd_boolean using_thumb_only (struct elf32_arm_link_hash_table *globals);
3649
3650 /* Return true if the PLT described by ARM_PLT requires a Thumb stub
3651    before it.  */
3652
3653 static bfd_boolean
3654 elf32_arm_plt_needs_thumb_stub_p (struct bfd_link_info *info,
3655                                   struct arm_plt_info *arm_plt)
3656 {
3657   struct elf32_arm_link_hash_table *htab;
3658
3659   htab = elf32_arm_hash_table (info);
3660
3661   return (!using_thumb_only(htab) && (arm_plt->thumb_refcount != 0
3662           || (!htab->use_blx && arm_plt->maybe_thumb_refcount != 0)));
3663 }
3664
3665 /* Return a pointer to the head of the dynamic reloc list that should
3666    be used for local symbol ISYM, which is symbol number R_SYMNDX in
3667    ABFD's symbol table.  Return null if an error occurs.  */
3668
3669 static struct elf_dyn_relocs **
3670 elf32_arm_get_local_dynreloc_list (bfd *abfd, unsigned long r_symndx,
3671                                    Elf_Internal_Sym *isym)
3672 {
3673   if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
3674     {
3675       struct arm_local_iplt_info *local_iplt;
3676
3677       local_iplt = elf32_arm_create_local_iplt (abfd, r_symndx);
3678       if (local_iplt == NULL)
3679         return NULL;
3680       return &local_iplt->dyn_relocs;
3681     }
3682   else
3683     {
3684       /* Track dynamic relocs needed for local syms too.
3685          We really need local syms available to do this
3686          easily.  Oh well.  */
3687       asection *s;
3688       void *vpp;
3689
3690       s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3691       if (s == NULL)
3692         abort ();
3693
3694       vpp = &elf_section_data (s)->local_dynrel;
3695       return (struct elf_dyn_relocs **) vpp;
3696     }
3697 }
3698
3699 /* Initialize an entry in the stub hash table.  */
3700
3701 static struct bfd_hash_entry *
3702 stub_hash_newfunc (struct bfd_hash_entry *entry,
3703                    struct bfd_hash_table *table,
3704                    const char *string)
3705 {
3706   /* Allocate the structure if it has not already been allocated by a
3707      subclass.  */
3708   if (entry == NULL)
3709     {
3710       entry = (struct bfd_hash_entry *)
3711           bfd_hash_allocate (table, sizeof (struct elf32_arm_stub_hash_entry));
3712       if (entry == NULL)
3713         return entry;
3714     }
3715
3716   /* Call the allocation method of the superclass.  */
3717   entry = bfd_hash_newfunc (entry, table, string);
3718   if (entry != NULL)
3719     {
3720       struct elf32_arm_stub_hash_entry *eh;
3721
3722       /* Initialize the local fields.  */
3723       eh = (struct elf32_arm_stub_hash_entry *) entry;
3724       eh->stub_sec = NULL;
3725       eh->stub_offset = (bfd_vma) -1;
3726       eh->source_value = 0;
3727       eh->target_value = 0;
3728       eh->target_section = NULL;
3729       eh->orig_insn = 0;
3730       eh->stub_type = arm_stub_none;
3731       eh->stub_size = 0;
3732       eh->stub_template = NULL;
3733       eh->stub_template_size = -1;
3734       eh->h = NULL;
3735       eh->id_sec = NULL;
3736       eh->output_name = NULL;
3737     }
3738
3739   return entry;
3740 }
3741
3742 /* Create .got, .gotplt, and .rel(a).got sections in DYNOBJ, and set up
3743    shortcuts to them in our hash table.  */
3744
3745 static bfd_boolean
3746 create_got_section (bfd *dynobj, struct bfd_link_info *info)
3747 {
3748   struct elf32_arm_link_hash_table *htab;
3749
3750   htab = elf32_arm_hash_table (info);
3751   if (htab == NULL)
3752     return FALSE;
3753
3754   /* BPABI objects never have a GOT, or associated sections.  */
3755   if (htab->symbian_p)
3756     return TRUE;
3757
3758   if (! _bfd_elf_create_got_section (dynobj, info))
3759     return FALSE;
3760
3761   /* Also create .rofixup.  */
3762   if (htab->fdpic_p)
3763     {
3764       htab->srofixup = bfd_make_section_with_flags (dynobj, ".rofixup",
3765                                                     (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
3766                                                      | SEC_IN_MEMORY | SEC_LINKER_CREATED | SEC_READONLY));
3767       if (htab->srofixup == NULL || ! bfd_set_section_alignment (dynobj, htab->srofixup, 2))
3768         return FALSE;
3769     }
3770
3771   return TRUE;
3772 }
3773
3774 /* Create the .iplt, .rel(a).iplt and .igot.plt sections.  */
3775
3776 static bfd_boolean
3777 create_ifunc_sections (struct bfd_link_info *info)
3778 {
3779   struct elf32_arm_link_hash_table *htab;
3780   const struct elf_backend_data *bed;
3781   bfd *dynobj;
3782   asection *s;
3783   flagword flags;
3784
3785   htab = elf32_arm_hash_table (info);
3786   dynobj = htab->root.dynobj;
3787   bed = get_elf_backend_data (dynobj);
3788   flags = bed->dynamic_sec_flags;
3789
3790   if (htab->root.iplt == NULL)
3791     {
3792       s = bfd_make_section_anyway_with_flags (dynobj, ".iplt",
3793                                               flags | SEC_READONLY | SEC_CODE);
3794       if (s == NULL
3795           || !bfd_set_section_alignment (dynobj, s, bed->plt_alignment))
3796         return FALSE;
3797       htab->root.iplt = s;
3798     }
3799
3800   if (htab->root.irelplt == NULL)
3801     {
3802       s = bfd_make_section_anyway_with_flags (dynobj,
3803                                               RELOC_SECTION (htab, ".iplt"),
3804                                               flags | SEC_READONLY);
3805       if (s == NULL
3806           || !bfd_set_section_alignment (dynobj, s, bed->s->log_file_align))
3807         return FALSE;
3808       htab->root.irelplt = s;
3809     }
3810
3811   if (htab->root.igotplt == NULL)
3812     {
3813       s = bfd_make_section_anyway_with_flags (dynobj, ".igot.plt", flags);
3814       if (s == NULL
3815           || !bfd_set_section_alignment (dynobj, s, bed->s->log_file_align))
3816         return FALSE;
3817       htab->root.igotplt = s;
3818     }
3819   return TRUE;
3820 }
3821
3822 /* Determine if we're dealing with a Thumb only architecture.  */
3823
3824 static bfd_boolean
3825 using_thumb_only (struct elf32_arm_link_hash_table *globals)
3826 {
3827   int arch;
3828   int profile = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
3829                                           Tag_CPU_arch_profile);
3830
3831   if (profile)
3832     return profile == 'M';
3833
3834   arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch);
3835
3836   /* Force return logic to be reviewed for each new architecture.  */
3837   BFD_ASSERT (arch <= TAG_CPU_ARCH_V8M_MAIN);
3838
3839   if (arch == TAG_CPU_ARCH_V6_M
3840       || arch == TAG_CPU_ARCH_V6S_M
3841       || arch == TAG_CPU_ARCH_V7E_M
3842       || arch == TAG_CPU_ARCH_V8M_BASE
3843       || arch == TAG_CPU_ARCH_V8M_MAIN)
3844     return TRUE;
3845
3846   return FALSE;
3847 }
3848
3849 /* Determine if we're dealing with a Thumb-2 object.  */
3850
3851 static bfd_boolean
3852 using_thumb2 (struct elf32_arm_link_hash_table *globals)
3853 {
3854   int arch;
3855   int thumb_isa = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
3856                                             Tag_THUMB_ISA_use);
3857
3858   if (thumb_isa)
3859     return thumb_isa == 2;
3860
3861   arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch);
3862
3863   /* Force return logic to be reviewed for each new architecture.  */
3864   BFD_ASSERT (arch <= TAG_CPU_ARCH_V8M_MAIN);
3865
3866   return (arch == TAG_CPU_ARCH_V6T2
3867           || arch == TAG_CPU_ARCH_V7
3868           || arch == TAG_CPU_ARCH_V7E_M
3869           || arch == TAG_CPU_ARCH_V8
3870           || arch == TAG_CPU_ARCH_V8R
3871           || arch == TAG_CPU_ARCH_V8M_MAIN);
3872 }
3873
3874 /* Determine whether Thumb-2 BL instruction is available.  */
3875
3876 static bfd_boolean
3877 using_thumb2_bl (struct elf32_arm_link_hash_table *globals)
3878 {
3879   int arch =
3880     bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch);
3881
3882   /* Force return logic to be reviewed for each new architecture.  */
3883   BFD_ASSERT (arch <= TAG_CPU_ARCH_V8M_MAIN);
3884
3885   /* Architecture was introduced after ARMv6T2 (eg. ARMv6-M).  */
3886   return (arch == TAG_CPU_ARCH_V6T2
3887           || arch >= TAG_CPU_ARCH_V7);
3888 }
3889
3890 /* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
3891    .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
3892    hash table.  */
3893
3894 static bfd_boolean
3895 elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
3896 {
3897   struct elf32_arm_link_hash_table *htab;
3898
3899   htab = elf32_arm_hash_table (info);
3900   if (htab == NULL)
3901     return FALSE;
3902
3903   if (!htab->root.sgot && !create_got_section (dynobj, info))
3904     return FALSE;
3905
3906   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
3907     return FALSE;
3908
3909   if (htab->vxworks_p)
3910     {
3911       if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
3912         return FALSE;
3913
3914       if (bfd_link_pic (info))
3915         {
3916           htab->plt_header_size = 0;
3917           htab->plt_entry_size
3918             = 4 * ARRAY_SIZE (elf32_arm_vxworks_shared_plt_entry);
3919         }
3920       else
3921         {
3922           htab->plt_header_size
3923             = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt0_entry);
3924           htab->plt_entry_size
3925             = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt_entry);
3926         }
3927
3928       if (elf_elfheader (dynobj))
3929         elf_elfheader (dynobj)->e_ident[EI_CLASS] = ELFCLASS32;
3930     }
3931   else
3932     {
3933       /* PR ld/16017
3934          Test for thumb only architectures.  Note - we cannot just call
3935          using_thumb_only() as the attributes in the output bfd have not been
3936          initialised at this point, so instead we use the input bfd.  */
3937       bfd * saved_obfd = htab->obfd;
3938
3939       htab->obfd = dynobj;
3940       if (using_thumb_only (htab))
3941         {
3942           htab->plt_header_size = 4 * ARRAY_SIZE (elf32_thumb2_plt0_entry);
3943           htab->plt_entry_size  = 4 * ARRAY_SIZE (elf32_thumb2_plt_entry);
3944         }
3945       htab->obfd = saved_obfd;
3946     }
3947
3948   if (htab->fdpic_p) {
3949     htab->plt_header_size = 0;
3950     if (info->flags & DF_BIND_NOW)
3951       htab->plt_entry_size = 4 * (ARRAY_SIZE(elf32_arm_fdpic_plt_entry) - 5);
3952     else
3953       htab->plt_entry_size = 4 * ARRAY_SIZE(elf32_arm_fdpic_plt_entry);
3954   }
3955
3956   if (!htab->root.splt
3957       || !htab->root.srelplt
3958       || !htab->root.sdynbss
3959       || (!bfd_link_pic (info) && !htab->root.srelbss))
3960     abort ();
3961
3962   return TRUE;
3963 }
3964
3965 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
3966
3967 static void
3968 elf32_arm_copy_indirect_symbol (struct bfd_link_info *info,
3969                                 struct elf_link_hash_entry *dir,
3970                                 struct elf_link_hash_entry *ind)
3971 {
3972   struct elf32_arm_link_hash_entry *edir, *eind;
3973
3974   edir = (struct elf32_arm_link_hash_entry *) dir;
3975   eind = (struct elf32_arm_link_hash_entry *) ind;
3976
3977   if (eind->dyn_relocs != NULL)
3978     {
3979       if (edir->dyn_relocs != NULL)
3980         {
3981           struct elf_dyn_relocs **pp;
3982           struct elf_dyn_relocs *p;
3983
3984           /* Add reloc counts against the indirect sym to the direct sym
3985              list.  Merge any entries against the same section.  */
3986           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3987             {
3988               struct elf_dyn_relocs *q;
3989
3990               for (q = edir->dyn_relocs; q != NULL; q = q->next)
3991                 if (q->sec == p->sec)
3992                   {
3993                     q->pc_count += p->pc_count;
3994                     q->count += p->count;
3995                     *pp = p->next;
3996                     break;
3997                   }
3998               if (q == NULL)
3999                 pp = &p->next;
4000             }
4001           *pp = edir->dyn_relocs;
4002         }
4003
4004       edir->dyn_relocs = eind->dyn_relocs;
4005       eind->dyn_relocs = NULL;
4006     }
4007
4008   if (ind->root.type == bfd_link_hash_indirect)
4009     {
4010       /* Copy over PLT info.  */
4011       edir->plt.thumb_refcount += eind->plt.thumb_refcount;
4012       eind->plt.thumb_refcount = 0;
4013       edir->plt.maybe_thumb_refcount += eind->plt.maybe_thumb_refcount;
4014       eind->plt.maybe_thumb_refcount = 0;
4015       edir->plt.noncall_refcount += eind->plt.noncall_refcount;
4016       eind->plt.noncall_refcount = 0;
4017
4018       /* Copy FDPIC counters.  */
4019       edir->fdpic_cnts.gotofffuncdesc_cnt += eind->fdpic_cnts.gotofffuncdesc_cnt;
4020       edir->fdpic_cnts.gotfuncdesc_cnt += eind->fdpic_cnts.gotfuncdesc_cnt;
4021       edir->fdpic_cnts.funcdesc_cnt += eind->fdpic_cnts.funcdesc_cnt;
4022
4023       /* We should only allocate a function to .iplt once the final
4024          symbol information is known.  */
4025       BFD_ASSERT (!eind->is_iplt);
4026
4027       if (dir->got.refcount <= 0)
4028         {
4029           edir->tls_type = eind->tls_type;
4030           eind->tls_type = GOT_UNKNOWN;
4031         }
4032     }
4033
4034   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
4035 }
4036
4037 /* Destroy an ARM elf linker hash table.  */
4038
4039 static void
4040 elf32_arm_link_hash_table_free (bfd *obfd)
4041 {
4042   struct elf32_arm_link_hash_table *ret
4043     = (struct elf32_arm_link_hash_table *) obfd->link.hash;
4044
4045   bfd_hash_table_free (&ret->stub_hash_table);
4046   _bfd_elf_link_hash_table_free (obfd);
4047 }
4048
4049 /* Create an ARM elf linker hash table.  */
4050
4051 static struct bfd_link_hash_table *
4052 elf32_arm_link_hash_table_create (bfd *abfd)
4053 {
4054   struct elf32_arm_link_hash_table *ret;
4055   bfd_size_type amt = sizeof (struct elf32_arm_link_hash_table);
4056
4057   ret = (struct elf32_arm_link_hash_table *) bfd_zmalloc (amt);
4058   if (ret == NULL)
4059     return NULL;
4060
4061   if (!_bfd_elf_link_hash_table_init (& ret->root, abfd,
4062                                       elf32_arm_link_hash_newfunc,
4063                                       sizeof (struct elf32_arm_link_hash_entry),
4064                                       ARM_ELF_DATA))
4065     {
4066       free (ret);
4067       return NULL;
4068     }
4069
4070   ret->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
4071   ret->stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_NONE;
4072 #ifdef FOUR_WORD_PLT
4073   ret->plt_header_size = 16;
4074   ret->plt_entry_size = 16;
4075 #else
4076   ret->plt_header_size = 20;
4077   ret->plt_entry_size = elf32_arm_use_long_plt_entry ? 16 : 12;
4078 #endif
4079   ret->use_rel = TRUE;
4080   ret->obfd = abfd;
4081   ret->fdpic_p = 0;
4082
4083   if (!bfd_hash_table_init (&ret->stub_hash_table, stub_hash_newfunc,
4084                             sizeof (struct elf32_arm_stub_hash_entry)))
4085     {
4086       _bfd_elf_link_hash_table_free (abfd);
4087       return NULL;
4088     }
4089   ret->root.root.hash_table_free = elf32_arm_link_hash_table_free;
4090
4091   return &ret->root.root;
4092 }
4093
4094 /* Determine what kind of NOPs are available.  */
4095
4096 static bfd_boolean
4097 arch_has_arm_nop (struct elf32_arm_link_hash_table *globals)
4098 {
4099   const int arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
4100                                              Tag_CPU_arch);
4101
4102   /* Force return logic to be reviewed for each new architecture.  */
4103   BFD_ASSERT (arch <= TAG_CPU_ARCH_V8M_MAIN);
4104
4105   return (arch == TAG_CPU_ARCH_V6T2
4106           || arch == TAG_CPU_ARCH_V6K
4107           || arch == TAG_CPU_ARCH_V7
4108           || arch == TAG_CPU_ARCH_V8
4109           || arch == TAG_CPU_ARCH_V8R);
4110 }
4111
4112 static bfd_boolean
4113 arm_stub_is_thumb (enum elf32_arm_stub_type stub_type)
4114 {
4115   switch (stub_type)
4116     {
4117     case arm_stub_long_branch_thumb_only:
4118     case arm_stub_long_branch_thumb2_only:
4119     case arm_stub_long_branch_thumb2_only_pure:
4120     case arm_stub_long_branch_v4t_thumb_arm:
4121     case arm_stub_short_branch_v4t_thumb_arm:
4122     case arm_stub_long_branch_v4t_thumb_arm_pic:
4123     case arm_stub_long_branch_v4t_thumb_tls_pic:
4124     case arm_stub_long_branch_thumb_only_pic:
4125     case arm_stub_cmse_branch_thumb_only:
4126       return TRUE;
4127     case arm_stub_none:
4128       BFD_FAIL ();
4129       return FALSE;
4130       break;
4131     default:
4132       return FALSE;
4133     }
4134 }
4135
4136 /* Determine the type of stub needed, if any, for a call.  */
4137
4138 static enum elf32_arm_stub_type
4139 arm_type_of_stub (struct bfd_link_info *info,
4140                   asection *input_sec,
4141                   const Elf_Internal_Rela *rel,
4142                   unsigned char st_type,
4143                   enum arm_st_branch_type *actual_branch_type,
4144                   struct elf32_arm_link_hash_entry *hash,
4145                   bfd_vma destination,
4146                   asection *sym_sec,
4147                   bfd *input_bfd,
4148                   const char *name)
4149 {
4150   bfd_vma location;
4151   bfd_signed_vma branch_offset;
4152   unsigned int r_type;
4153   struct elf32_arm_link_hash_table * globals;
4154   bfd_boolean thumb2, thumb2_bl, thumb_only;
4155   enum elf32_arm_stub_type stub_type = arm_stub_none;
4156   int use_plt = 0;
4157   enum arm_st_branch_type branch_type = *actual_branch_type;
4158   union gotplt_union *root_plt;
4159   struct arm_plt_info *arm_plt;
4160   int arch;
4161   int thumb2_movw;
4162
4163   if (branch_type == ST_BRANCH_LONG)
4164     return stub_type;
4165
4166   globals = elf32_arm_hash_table (info);
4167   if (globals == NULL)
4168     return stub_type;
4169
4170   thumb_only = using_thumb_only (globals);
4171   thumb2 = using_thumb2 (globals);
4172   thumb2_bl = using_thumb2_bl (globals);
4173
4174   arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch);
4175
4176   /* True for architectures that implement the thumb2 movw instruction.  */
4177   thumb2_movw = thumb2 || (arch  == TAG_CPU_ARCH_V8M_BASE);
4178
4179   /* Determine where the call point is.  */
4180   location = (input_sec->output_offset
4181               + input_sec->output_section->vma
4182               + rel->r_offset);
4183
4184   r_type = ELF32_R_TYPE (rel->r_info);
4185
4186   /* ST_BRANCH_TO_ARM is nonsense to thumb-only targets when we
4187      are considering a function call relocation.  */
4188   if (thumb_only && (r_type == R_ARM_THM_CALL || r_type == R_ARM_THM_JUMP24
4189                      || r_type == R_ARM_THM_JUMP19)
4190       && branch_type == ST_BRANCH_TO_ARM)
4191     branch_type = ST_BRANCH_TO_THUMB;
4192
4193   /* For TLS call relocs, it is the caller's responsibility to provide
4194      the address of the appropriate trampoline.  */
4195   if (r_type != R_ARM_TLS_CALL
4196       && r_type != R_ARM_THM_TLS_CALL
4197       && elf32_arm_get_plt_info (input_bfd, globals, hash,
4198                                  ELF32_R_SYM (rel->r_info), &root_plt,
4199                                  &arm_plt)
4200       && root_plt->offset != (bfd_vma) -1)
4201     {
4202       asection *splt;
4203
4204       if (hash == NULL || hash->is_iplt)
4205         splt = globals->root.iplt;
4206       else
4207         splt = globals->root.splt;
4208       if (splt != NULL)
4209         {
4210           use_plt = 1;
4211
4212           /* Note when dealing with PLT entries: the main PLT stub is in
4213              ARM mode, so if the branch is in Thumb mode, another
4214              Thumb->ARM stub will be inserted later just before the ARM
4215              PLT stub. If a long branch stub is needed, we'll add a
4216              Thumb->Arm one and branch directly to the ARM PLT entry.
4217              Here, we have to check if a pre-PLT Thumb->ARM stub
4218              is needed and if it will be close enough.  */
4219
4220           destination = (splt->output_section->vma
4221                          + splt->output_offset
4222                          + root_plt->offset);
4223           st_type = STT_FUNC;
4224
4225           /* Thumb branch/call to PLT: it can become a branch to ARM
4226              or to Thumb. We must perform the same checks and
4227              corrections as in elf32_arm_final_link_relocate.  */
4228           if ((r_type == R_ARM_THM_CALL)
4229               || (r_type == R_ARM_THM_JUMP24))
4230             {
4231               if (globals->use_blx
4232                   && r_type == R_ARM_THM_CALL
4233                   && !thumb_only)
4234                 {
4235                   /* If the Thumb BLX instruction is available, convert
4236                      the BL to a BLX instruction to call the ARM-mode
4237                      PLT entry.  */
4238                   branch_type = ST_BRANCH_TO_ARM;
4239                 }
4240               else
4241                 {
4242                   if (!thumb_only)
4243                     /* Target the Thumb stub before the ARM PLT entry.  */
4244                     destination -= PLT_THUMB_STUB_SIZE;
4245                   branch_type = ST_BRANCH_TO_THUMB;
4246                 }
4247             }
4248           else
4249             {
4250               branch_type = ST_BRANCH_TO_ARM;
4251             }
4252         }
4253     }
4254   /* Calls to STT_GNU_IFUNC symbols should go through a PLT.  */
4255   BFD_ASSERT (st_type != STT_GNU_IFUNC);
4256
4257   branch_offset = (bfd_signed_vma)(destination - location);
4258
4259   if (r_type == R_ARM_THM_CALL || r_type == R_ARM_THM_JUMP24
4260       || r_type == R_ARM_THM_TLS_CALL || r_type == R_ARM_THM_JUMP19)
4261     {
4262       /* Handle cases where:
4263          - this call goes too far (different Thumb/Thumb2 max
4264            distance)
4265          - it's a Thumb->Arm call and blx is not available, or it's a
4266            Thumb->Arm branch (not bl). A stub is needed in this case,
4267            but only if this call is not through a PLT entry. Indeed,
4268            PLT stubs handle mode switching already.  */
4269       if ((!thumb2_bl
4270             && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
4271                 || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
4272           || (thumb2_bl
4273               && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
4274                   || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
4275           || (thumb2
4276               && (branch_offset > THM2_MAX_FWD_COND_BRANCH_OFFSET
4277                   || (branch_offset < THM2_MAX_BWD_COND_BRANCH_OFFSET))
4278               && (r_type == R_ARM_THM_JUMP19))
4279           || (branch_type == ST_BRANCH_TO_ARM
4280               && (((r_type == R_ARM_THM_CALL
4281                     || r_type == R_ARM_THM_TLS_CALL) && !globals->use_blx)
4282                   || (r_type == R_ARM_THM_JUMP24)
4283                   || (r_type == R_ARM_THM_JUMP19))
4284               && !use_plt))
4285         {
4286           /* If we need to insert a Thumb-Thumb long branch stub to a
4287              PLT, use one that branches directly to the ARM PLT
4288              stub. If we pretended we'd use the pre-PLT Thumb->ARM
4289              stub, undo this now.  */
4290           if ((branch_type == ST_BRANCH_TO_THUMB) && use_plt && !thumb_only)
4291             {
4292               branch_type = ST_BRANCH_TO_ARM;
4293               branch_offset += PLT_THUMB_STUB_SIZE;
4294             }
4295
4296           if (branch_type == ST_BRANCH_TO_THUMB)
4297             {
4298               /* Thumb to thumb.  */
4299               if (!thumb_only)
4300                 {
4301                   if (input_sec->flags & SEC_ELF_PURECODE)
4302                     _bfd_error_handler
4303                       (_("%pB(%pA): warning: long branch veneers used in"
4304                          " section with SHF_ARM_PURECODE section"
4305                          " attribute is only supported for M-profile"
4306                          " targets that implement the movw instruction"),
4307                        input_bfd, input_sec);
4308
4309                   stub_type = (bfd_link_pic (info) | globals->pic_veneer)
4310                     /* PIC stubs.  */
4311                     ? ((globals->use_blx
4312                         && (r_type == R_ARM_THM_CALL))
4313                        /* V5T and above. Stub starts with ARM code, so
4314                           we must be able to switch mode before
4315                           reaching it, which is only possible for 'bl'
4316                           (ie R_ARM_THM_CALL relocation).  */
4317                        ? arm_stub_long_branch_any_thumb_pic
4318                        /* On V4T, use Thumb code only.  */
4319                        : arm_stub_long_branch_v4t_thumb_thumb_pic)
4320
4321                     /* non-PIC stubs.  */
4322                     : ((globals->use_blx
4323                         && (r_type == R_ARM_THM_CALL))
4324                        /* V5T and above.  */
4325                        ? arm_stub_long_branch_any_any
4326                        /* V4T.  */
4327                        : arm_stub_long_branch_v4t_thumb_thumb);
4328                 }
4329               else
4330                 {
4331                   if (thumb2_movw && (input_sec->flags & SEC_ELF_PURECODE))
4332                       stub_type = arm_stub_long_branch_thumb2_only_pure;
4333                   else
4334                     {
4335                       if (input_sec->flags & SEC_ELF_PURECODE)
4336                         _bfd_error_handler
4337                           (_("%pB(%pA): warning: long branch veneers used in"
4338                              " section with SHF_ARM_PURECODE section"
4339                              " attribute is only supported for M-profile"
4340                              " targets that implement the movw instruction"),
4341                            input_bfd, input_sec);
4342
4343                       stub_type = (bfd_link_pic (info) | globals->pic_veneer)
4344                         /* PIC stub.  */
4345                         ? arm_stub_long_branch_thumb_only_pic
4346                         /* non-PIC stub.  */
4347                         : (thumb2 ? arm_stub_long_branch_thumb2_only
4348                                   : arm_stub_long_branch_thumb_only);
4349                     }
4350                 }
4351             }
4352           else
4353             {
4354               if (input_sec->flags & SEC_ELF_PURECODE)
4355                 _bfd_error_handler
4356                   (_("%pB(%pA): warning: long branch veneers used in"
4357                      " section with SHF_ARM_PURECODE section"
4358                      " attribute is only supported" " for M-profile"
4359                      " targets that implement the movw instruction"),
4360                    input_bfd, input_sec);
4361
4362               /* Thumb to arm.  */
4363               if (sym_sec != NULL
4364                   && sym_sec->owner != NULL
4365                   && !INTERWORK_FLAG (sym_sec->owner))
4366                 {
4367                   _bfd_error_handler
4368                     (_("%pB(%s): warning: interworking not enabled;"
4369                        " first occurrence: %pB: %s call to %s"),
4370                      sym_sec->owner, name, input_bfd, "Thumb", "ARM");
4371                 }
4372
4373               stub_type =
4374                 (bfd_link_pic (info) | globals->pic_veneer)
4375                 /* PIC stubs.  */
4376                 ? (r_type == R_ARM_THM_TLS_CALL
4377                    /* TLS PIC stubs.  */
4378                    ? (globals->use_blx ? arm_stub_long_branch_any_tls_pic
4379                       : arm_stub_long_branch_v4t_thumb_tls_pic)
4380                    : ((globals->use_blx && r_type == R_ARM_THM_CALL)
4381                       /* V5T PIC and above.  */
4382                       ? arm_stub_long_branch_any_arm_pic
4383                       /* V4T PIC stub.  */
4384                       : arm_stub_long_branch_v4t_thumb_arm_pic))
4385
4386                 /* non-PIC stubs.  */
4387                 : ((globals->use_blx && r_type == R_ARM_THM_CALL)
4388                    /* V5T and above.  */
4389                    ? arm_stub_long_branch_any_any
4390                    /* V4T.  */
4391                    : arm_stub_long_branch_v4t_thumb_arm);
4392
4393               /* Handle v4t short branches.  */
4394               if ((stub_type == arm_stub_long_branch_v4t_thumb_arm)
4395                   && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
4396                   && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
4397                 stub_type = arm_stub_short_branch_v4t_thumb_arm;
4398             }
4399         }
4400     }
4401   else if (r_type == R_ARM_CALL
4402            || r_type == R_ARM_JUMP24
4403            || r_type == R_ARM_PLT32
4404            || r_type == R_ARM_TLS_CALL)
4405     {
4406       if (input_sec->flags & SEC_ELF_PURECODE)
4407         _bfd_error_handler
4408           (_("%pB(%pA): warning: long branch veneers used in"
4409              " section with SHF_ARM_PURECODE section"
4410              " attribute is only supported for M-profile"
4411              " targets that implement the movw instruction"),
4412            input_bfd, input_sec);
4413       if (branch_type == ST_BRANCH_TO_THUMB)
4414         {
4415           /* Arm to thumb.  */
4416
4417           if (sym_sec != NULL
4418               && sym_sec->owner != NULL
4419               && !INTERWORK_FLAG (sym_sec->owner))
4420             {
4421               _bfd_error_handler
4422                 (_("%pB(%s): warning: interworking not enabled;"
4423                    " first occurrence: %pB: %s call to %s"),
4424                  sym_sec->owner, name, input_bfd, "ARM", "Thumb");
4425             }
4426
4427           /* We have an extra 2-bytes reach because of
4428              the mode change (bit 24 (H) of BLX encoding).  */
4429           if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
4430               || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
4431               || (r_type == R_ARM_CALL && !globals->use_blx)
4432               || (r_type == R_ARM_JUMP24)
4433               || (r_type == R_ARM_PLT32))
4434             {
4435               stub_type = (bfd_link_pic (info) | globals->pic_veneer)
4436                 /* PIC stubs.  */
4437                 ? ((globals->use_blx)
4438                    /* V5T and above.  */
4439                    ? arm_stub_long_branch_any_thumb_pic
4440                    /* V4T stub.  */
4441                    : arm_stub_long_branch_v4t_arm_thumb_pic)
4442
4443                 /* non-PIC stubs.  */
4444                 : ((globals->use_blx)
4445                    /* V5T and above.  */
4446                    ? arm_stub_long_branch_any_any
4447                    /* V4T.  */
4448                    : arm_stub_long_branch_v4t_arm_thumb);
4449             }
4450         }
4451       else
4452         {
4453           /* Arm to arm.  */
4454           if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
4455               || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
4456             {
4457               stub_type =
4458                 (bfd_link_pic (info) | globals->pic_veneer)
4459                 /* PIC stubs.  */
4460                 ? (r_type == R_ARM_TLS_CALL
4461                    /* TLS PIC Stub.  */
4462                    ? arm_stub_long_branch_any_tls_pic
4463                    : (globals->nacl_p
4464                       ? arm_stub_long_branch_arm_nacl_pic
4465                       : arm_stub_long_branch_any_arm_pic))
4466                 /* non-PIC stubs.  */
4467                 : (globals->nacl_p
4468                    ? arm_stub_long_branch_arm_nacl
4469                    : arm_stub_long_branch_any_any);
4470             }
4471         }
4472     }
4473
4474   /* If a stub is needed, record the actual destination type.  */
4475   if (stub_type != arm_stub_none)
4476     *actual_branch_type = branch_type;
4477
4478   return stub_type;
4479 }
4480
4481 /* Build a name for an entry in the stub hash table.  */
4482
4483 static char *
4484 elf32_arm_stub_name (const asection *input_section,
4485                      const asection *sym_sec,
4486                      const struct elf32_arm_link_hash_entry *hash,
4487                      const Elf_Internal_Rela *rel,
4488                      enum elf32_arm_stub_type stub_type)
4489 {
4490   char *stub_name;
4491   bfd_size_type len;
4492
4493   if (hash)
4494     {
4495       len = 8 + 1 + strlen (hash->root.root.root.string) + 1 + 8 + 1 + 2 + 1;
4496       stub_name = (char *) bfd_malloc (len);
4497       if (stub_name != NULL)
4498         sprintf (stub_name, "%08x_%s+%x_%d",
4499                  input_section->id & 0xffffffff,
4500                  hash->root.root.root.string,
4501                  (int) rel->r_addend & 0xffffffff,
4502                  (int) stub_type);
4503     }
4504   else
4505     {
4506       len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1 + 2 + 1;
4507       stub_name = (char *) bfd_malloc (len);
4508       if (stub_name != NULL)
4509         sprintf (stub_name, "%08x_%x:%x+%x_%d",
4510                  input_section->id & 0xffffffff,
4511                  sym_sec->id & 0xffffffff,
4512                  ELF32_R_TYPE (rel->r_info) == R_ARM_TLS_CALL
4513                  || ELF32_R_TYPE (rel->r_info) == R_ARM_THM_TLS_CALL
4514                  ? 0 : (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
4515                  (int) rel->r_addend & 0xffffffff,
4516                  (int) stub_type);
4517     }
4518
4519   return stub_name;
4520 }
4521
4522 /* Look up an entry in the stub hash.  Stub entries are cached because
4523    creating the stub name takes a bit of time.  */
4524
4525 static struct elf32_arm_stub_hash_entry *
4526 elf32_arm_get_stub_entry (const asection *input_section,
4527                           const asection *sym_sec,
4528                           struct elf_link_hash_entry *hash,
4529                           const Elf_Internal_Rela *rel,
4530                           struct elf32_arm_link_hash_table *htab,
4531                           enum elf32_arm_stub_type stub_type)
4532 {
4533   struct elf32_arm_stub_hash_entry *stub_entry;
4534   struct elf32_arm_link_hash_entry *h = (struct elf32_arm_link_hash_entry *) hash;
4535   const asection *id_sec;
4536
4537   if ((input_section->flags & SEC_CODE) == 0)
4538     return NULL;
4539
4540   /* If this input section is part of a group of sections sharing one
4541      stub section, then use the id of the first section in the group.
4542      Stub names need to include a section id, as there may well be
4543      more than one stub used to reach say, printf, and we need to
4544      distinguish between them.  */
4545   BFD_ASSERT (input_section->id <= htab->top_id);
4546   id_sec = htab->stub_group[input_section->id].link_sec;
4547
4548   if (h != NULL && h->stub_cache != NULL
4549       && h->stub_cache->h == h
4550       && h->stub_cache->id_sec == id_sec
4551       && h->stub_cache->stub_type == stub_type)
4552     {
4553       stub_entry = h->stub_cache;
4554     }
4555   else
4556     {
4557       char *stub_name;
4558
4559       stub_name = elf32_arm_stub_name (id_sec, sym_sec, h, rel, stub_type);
4560       if (stub_name == NULL)
4561         return NULL;
4562
4563       stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table,
4564                                         stub_name, FALSE, FALSE);
4565       if (h != NULL)
4566         h->stub_cache = stub_entry;
4567
4568       free (stub_name);
4569     }
4570
4571   return stub_entry;
4572 }
4573
4574 /* Whether veneers of type STUB_TYPE require to be in a dedicated output
4575    section.  */
4576
4577 static bfd_boolean
4578 arm_dedicated_stub_output_section_required (enum elf32_arm_stub_type stub_type)
4579 {
4580   if (stub_type >= max_stub_type)
4581     abort ();  /* Should be unreachable.  */
4582
4583   switch (stub_type)
4584     {
4585     case arm_stub_cmse_branch_thumb_only:
4586       return TRUE;
4587
4588     default:
4589       return FALSE;
4590     }
4591
4592   abort ();  /* Should be unreachable.  */
4593 }
4594
4595 /* Required alignment (as a power of 2) for the dedicated section holding
4596    veneers of type STUB_TYPE, or 0 if veneers of this type are interspersed
4597    with input sections.  */
4598
4599 static int
4600 arm_dedicated_stub_output_section_required_alignment
4601   (enum elf32_arm_stub_type stub_type)
4602 {
4603   if (stub_type >= max_stub_type)
4604     abort ();  /* Should be unreachable.  */
4605
4606   switch (stub_type)
4607     {
4608     /* Vectors of Secure Gateway veneers must be aligned on 32byte
4609        boundary.  */
4610     case arm_stub_cmse_branch_thumb_only:
4611       return 5;
4612
4613     default:
4614       BFD_ASSERT (!arm_dedicated_stub_output_section_required (stub_type));
4615       return 0;
4616     }
4617
4618   abort ();  /* Should be unreachable.  */
4619 }
4620
4621 /* Name of the dedicated output section to put veneers of type STUB_TYPE, or
4622    NULL if veneers of this type are interspersed with input sections.  */
4623
4624 static const char *
4625 arm_dedicated_stub_output_section_name (enum elf32_arm_stub_type stub_type)
4626 {
4627   if (stub_type >= max_stub_type)
4628     abort ();  /* Should be unreachable.  */
4629
4630   switch (stub_type)
4631     {
4632     case arm_stub_cmse_branch_thumb_only:
4633       return ".gnu.sgstubs";
4634
4635     default:
4636       BFD_ASSERT (!arm_dedicated_stub_output_section_required (stub_type));
4637       return NULL;
4638     }
4639
4640   abort ();  /* Should be unreachable.  */
4641 }
4642
4643 /* If veneers of type STUB_TYPE should go in a dedicated output section,
4644    returns the address of the hash table field in HTAB holding a pointer to the
4645    corresponding input section.  Otherwise, returns NULL.  */
4646
4647 static asection **
4648 arm_dedicated_stub_input_section_ptr (struct elf32_arm_link_hash_table *htab,
4649                                       enum elf32_arm_stub_type stub_type)
4650 {
4651   if (stub_type >= max_stub_type)
4652     abort ();  /* Should be unreachable.  */
4653
4654   switch (stub_type)
4655     {
4656     case arm_stub_cmse_branch_thumb_only:
4657       return &htab->cmse_stub_sec;
4658
4659     default:
4660       BFD_ASSERT (!arm_dedicated_stub_output_section_required (stub_type));
4661       return NULL;
4662     }
4663
4664   abort ();  /* Should be unreachable.  */
4665 }
4666
4667 /* Find or create a stub section to contain a stub of type STUB_TYPE.  SECTION
4668    is the section that branch into veneer and can be NULL if stub should go in
4669    a dedicated output section.  Returns a pointer to the stub section, and the
4670    section to which the stub section will be attached (in *LINK_SEC_P).
4671    LINK_SEC_P may be NULL.  */
4672
4673 static asection *
4674 elf32_arm_create_or_find_stub_sec (asection **link_sec_p, asection *section,
4675                                    struct elf32_arm_link_hash_table *htab,
4676                                    enum elf32_arm_stub_type stub_type)
4677 {
4678   asection *link_sec, *out_sec, **stub_sec_p;
4679   const char *stub_sec_prefix;
4680   bfd_boolean dedicated_output_section =
4681     arm_dedicated_stub_output_section_required (stub_type);
4682   int align;
4683
4684   if (dedicated_output_section)
4685     {
4686       bfd *output_bfd = htab->obfd;
4687       const char *out_sec_name =
4688         arm_dedicated_stub_output_section_name (stub_type);
4689       link_sec = NULL;
4690       stub_sec_p = arm_dedicated_stub_input_section_ptr (htab, stub_type);
4691       stub_sec_prefix = out_sec_name;
4692       align = arm_dedicated_stub_output_section_required_alignment (stub_type);
4693       out_sec = bfd_get_section_by_name (output_bfd, out_sec_name);
4694       if (out_sec == NULL)
4695         {
4696           _bfd_error_handler (_("no address assigned to the veneers output "
4697                                 "section %s"), out_sec_name);
4698           return NULL;
4699         }
4700     }
4701   else
4702     {
4703       BFD_ASSERT (section->id <= htab->top_id);
4704       link_sec = htab->stub_group[section->id].link_sec;
4705       BFD_ASSERT (link_sec != NULL);
4706       stub_sec_p = &htab->stub_group[section->id].stub_sec;
4707       if (*stub_sec_p == NULL)
4708         stub_sec_p = &htab->stub_group[link_sec->id].stub_sec;
4709       stub_sec_prefix = link_sec->name;
4710       out_sec = link_sec->output_section;
4711       align = htab->nacl_p ? 4 : 3;
4712     }
4713
4714   if (*stub_sec_p == NULL)
4715     {
4716       size_t namelen;
4717       bfd_size_type len;
4718       char *s_name;
4719
4720       namelen = strlen (stub_sec_prefix);
4721       len = namelen + sizeof (STUB_SUFFIX);
4722       s_name = (char *) bfd_alloc (htab->stub_bfd, len);
4723       if (s_name == NULL)
4724         return NULL;
4725
4726       memcpy (s_name, stub_sec_prefix, namelen);
4727       memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4728       *stub_sec_p = (*htab->add_stub_section) (s_name, out_sec, link_sec,
4729                                                align);
4730       if (*stub_sec_p == NULL)
4731         return NULL;
4732
4733       out_sec->flags |= SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
4734                         | SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY
4735                         | SEC_KEEP;
4736     }
4737
4738   if (!dedicated_output_section)
4739     htab->stub_group[section->id].stub_sec = *stub_sec_p;
4740
4741   if (link_sec_p)
4742     *link_sec_p = link_sec;
4743
4744   return *stub_sec_p;
4745 }
4746
4747 /* Add a new stub entry to the stub hash.  Not all fields of the new
4748    stub entry are initialised.  */
4749
4750 static struct elf32_arm_stub_hash_entry *
4751 elf32_arm_add_stub (const char *stub_name, asection *section,
4752                     struct elf32_arm_link_hash_table *htab,
4753                     enum elf32_arm_stub_type stub_type)
4754 {
4755   asection *link_sec;
4756   asection *stub_sec;
4757   struct elf32_arm_stub_hash_entry *stub_entry;
4758
4759   stub_sec = elf32_arm_create_or_find_stub_sec (&link_sec, section, htab,
4760                                                 stub_type);
4761   if (stub_sec == NULL)
4762     return NULL;
4763
4764   /* Enter this entry into the linker stub hash table.  */
4765   stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4766                                      TRUE, FALSE);
4767   if (stub_entry == NULL)
4768     {
4769       if (section == NULL)
4770         section = stub_sec;
4771       _bfd_error_handler (_("%pB: cannot create stub entry %s"),
4772                           section->owner, stub_name);
4773       return NULL;
4774     }
4775
4776   stub_entry->stub_sec = stub_sec;
4777   stub_entry->stub_offset = (bfd_vma) -1;
4778   stub_entry->id_sec = link_sec;
4779
4780   return stub_entry;
4781 }
4782
4783 /* Store an Arm insn into an output section not processed by
4784    elf32_arm_write_section.  */
4785
4786 static void
4787 put_arm_insn (struct elf32_arm_link_hash_table * htab,
4788               bfd * output_bfd, bfd_vma val, void * ptr)
4789 {
4790   if (htab->byteswap_code != bfd_little_endian (output_bfd))
4791     bfd_putl32 (val, ptr);
4792   else
4793     bfd_putb32 (val, ptr);
4794 }
4795
4796 /* Store a 16-bit Thumb insn into an output section not processed by
4797    elf32_arm_write_section.  */
4798
4799 static void
4800 put_thumb_insn (struct elf32_arm_link_hash_table * htab,
4801                 bfd * output_bfd, bfd_vma val, void * ptr)
4802 {
4803   if (htab->byteswap_code != bfd_little_endian (output_bfd))
4804     bfd_putl16 (val, ptr);
4805   else
4806     bfd_putb16 (val, ptr);
4807 }
4808
4809 /* Store a Thumb2 insn into an output section not processed by
4810    elf32_arm_write_section.  */
4811
4812 static void
4813 put_thumb2_insn (struct elf32_arm_link_hash_table * htab,
4814                  bfd * output_bfd, bfd_vma val, bfd_byte * ptr)
4815 {
4816   /* T2 instructions are 16-bit streamed.  */
4817   if (htab->byteswap_code != bfd_little_endian (output_bfd))
4818     {
4819       bfd_putl16 ((val >> 16) & 0xffff, ptr);
4820       bfd_putl16 ((val & 0xffff), ptr + 2);
4821     }
4822   else
4823     {
4824       bfd_putb16 ((val >> 16) & 0xffff, ptr);
4825       bfd_putb16 ((val & 0xffff), ptr + 2);
4826     }
4827 }
4828
4829 /* If it's possible to change R_TYPE to a more efficient access
4830    model, return the new reloc type.  */
4831
4832 static unsigned
4833 elf32_arm_tls_transition (struct bfd_link_info *info, int r_type,
4834                           struct elf_link_hash_entry *h)
4835 {
4836   int is_local = (h == NULL);
4837
4838   if (bfd_link_pic (info)
4839       || (h && h->root.type == bfd_link_hash_undefweak))
4840     return r_type;
4841
4842   /* We do not support relaxations for Old TLS models.  */
4843   switch (r_type)
4844     {
4845     case R_ARM_TLS_GOTDESC:
4846     case R_ARM_TLS_CALL:
4847     case R_ARM_THM_TLS_CALL:
4848     case R_ARM_TLS_DESCSEQ:
4849     case R_ARM_THM_TLS_DESCSEQ:
4850       return is_local ? R_ARM_TLS_LE32 : R_ARM_TLS_IE32;
4851     }
4852
4853   return r_type;
4854 }
4855
4856 static bfd_reloc_status_type elf32_arm_final_link_relocate
4857   (reloc_howto_type *, bfd *, bfd *, asection *, bfd_byte *,
4858    Elf_Internal_Rela *, bfd_vma, struct bfd_link_info *, asection *,
4859    const char *, unsigned char, enum arm_st_branch_type,
4860    struct elf_link_hash_entry *, bfd_boolean *, char **);
4861
4862 static unsigned int
4863 arm_stub_required_alignment (enum elf32_arm_stub_type stub_type)
4864 {
4865   switch (stub_type)
4866     {
4867     case arm_stub_a8_veneer_b_cond:
4868     case arm_stub_a8_veneer_b:
4869     case arm_stub_a8_veneer_bl:
4870       return 2;
4871
4872     case arm_stub_long_branch_any_any:
4873     case arm_stub_long_branch_v4t_arm_thumb:
4874     case arm_stub_long_branch_thumb_only:
4875     case arm_stub_long_branch_thumb2_only:
4876     case arm_stub_long_branch_thumb2_only_pure:
4877     case arm_stub_long_branch_v4t_thumb_thumb:
4878     case arm_stub_long_branch_v4t_thumb_arm:
4879     case arm_stub_short_branch_v4t_thumb_arm:
4880     case arm_stub_long_branch_any_arm_pic:
4881     case arm_stub_long_branch_any_thumb_pic:
4882     case arm_stub_long_branch_v4t_thumb_thumb_pic:
4883     case arm_stub_long_branch_v4t_arm_thumb_pic:
4884     case arm_stub_long_branch_v4t_thumb_arm_pic:
4885     case arm_stub_long_branch_thumb_only_pic:
4886     case arm_stub_long_branch_any_tls_pic:
4887     case arm_stub_long_branch_v4t_thumb_tls_pic:
4888     case arm_stub_cmse_branch_thumb_only:
4889     case arm_stub_a8_veneer_blx:
4890       return 4;
4891
4892     case arm_stub_long_branch_arm_nacl:
4893     case arm_stub_long_branch_arm_nacl_pic:
4894       return 16;
4895
4896     default:
4897       abort ();  /* Should be unreachable.  */
4898     }
4899 }
4900
4901 /* Returns whether stubs of type STUB_TYPE take over the symbol they are
4902    veneering (TRUE) or have their own symbol (FALSE).  */
4903
4904 static bfd_boolean
4905 arm_stub_sym_claimed (enum elf32_arm_stub_type stub_type)
4906 {
4907   if (stub_type >= max_stub_type)
4908     abort ();  /* Should be unreachable.  */
4909
4910   switch (stub_type)
4911     {
4912     case arm_stub_cmse_branch_thumb_only:
4913       return TRUE;
4914
4915     default:
4916       return FALSE;
4917     }
4918
4919   abort ();  /* Should be unreachable.  */
4920 }
4921
4922 /* Returns the padding needed for the dedicated section used stubs of type
4923    STUB_TYPE.  */
4924
4925 static int
4926 arm_dedicated_stub_section_padding (enum elf32_arm_stub_type stub_type)
4927 {
4928   if (stub_type >= max_stub_type)
4929     abort ();  /* Should be unreachable.  */
4930
4931   switch (stub_type)
4932     {
4933     case arm_stub_cmse_branch_thumb_only:
4934       return 32;
4935
4936     default:
4937       return 0;
4938     }
4939
4940   abort ();  /* Should be unreachable.  */
4941 }
4942
4943 /* If veneers of type STUB_TYPE should go in a dedicated output section,
4944    returns the address of the hash table field in HTAB holding the offset at
4945    which new veneers should be layed out in the stub section.  */
4946
4947 static bfd_vma*
4948 arm_new_stubs_start_offset_ptr (struct elf32_arm_link_hash_table *htab,
4949                                 enum elf32_arm_stub_type stub_type)
4950 {
4951   switch (stub_type)
4952     {
4953     case arm_stub_cmse_branch_thumb_only:
4954       return &htab->new_cmse_stub_offset;
4955
4956     default:
4957       BFD_ASSERT (!arm_dedicated_stub_output_section_required (stub_type));
4958       return NULL;
4959     }
4960 }
4961
4962 static bfd_boolean
4963 arm_build_one_stub (struct bfd_hash_entry *gen_entry,
4964                     void * in_arg)
4965 {
4966 #define MAXRELOCS 3
4967   bfd_boolean removed_sg_veneer;
4968   struct elf32_arm_stub_hash_entry *stub_entry;
4969   struct elf32_arm_link_hash_table *globals;
4970   struct bfd_link_info *info;
4971   asection *stub_sec;
4972   bfd *stub_bfd;
4973   bfd_byte *loc;
4974   bfd_vma sym_value;
4975   int template_size;
4976   int size;
4977   const insn_sequence *template_sequence;
4978   int i;
4979   int stub_reloc_idx[MAXRELOCS] = {-1, -1};
4980   int stub_reloc_offset[MAXRELOCS] = {0, 0};
4981   int nrelocs = 0;
4982   int just_allocated = 0;
4983
4984   /* Massage our args to the form they really have.  */
4985   stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
4986   info = (struct bfd_link_info *) in_arg;
4987
4988   globals = elf32_arm_hash_table (info);
4989   if (globals == NULL)
4990     return FALSE;
4991
4992   stub_sec = stub_entry->stub_sec;
4993
4994   if ((globals->fix_cortex_a8 < 0)
4995       != (arm_stub_required_alignment (stub_entry->stub_type) == 2))
4996     /* We have to do less-strictly-aligned fixes last.  */
4997     return TRUE;
4998
4999   /* Assign a slot at the end of section if none assigned yet.  */
5000   if (stub_entry->stub_offset == (bfd_vma) -1)
5001     {
5002       stub_entry->stub_offset = stub_sec->size;
5003       just_allocated = 1;
5004     }
5005   loc = stub_sec->contents + stub_entry->stub_offset;
5006
5007   stub_bfd = stub_sec->owner;
5008
5009   /* This is the address of the stub destination.  */
5010   sym_value = (stub_entry->target_value
5011                + stub_entry->target_section->output_offset
5012                + stub_entry->target_section->output_section->vma);
5013
5014   template_sequence = stub_entry->stub_template;
5015   template_size = stub_entry->stub_template_size;
5016
5017   size = 0;
5018   for (i = 0; i < template_size; i++)
5019     {
5020       switch (template_sequence[i].type)
5021         {
5022         case THUMB16_TYPE:
5023           {
5024             bfd_vma data = (bfd_vma) template_sequence[i].data;
5025             if (template_sequence[i].reloc_addend != 0)
5026               {
5027                 /* We've borrowed the reloc_addend field to mean we should
5028                    insert a condition code into this (Thumb-1 branch)
5029                    instruction.  See THUMB16_BCOND_INSN.  */
5030                 BFD_ASSERT ((data & 0xff00) == 0xd000);
5031                 data |= ((stub_entry->orig_insn >> 22) & 0xf) << 8;
5032               }
5033             bfd_put_16 (stub_bfd, data, loc + size);
5034             size += 2;
5035           }
5036           break;
5037
5038         case THUMB32_TYPE:
5039           bfd_put_16 (stub_bfd,
5040                       (template_sequence[i].data >> 16) & 0xffff,
5041                       loc + size);
5042           bfd_put_16 (stub_bfd, template_sequence[i].data & 0xffff,
5043                       loc + size + 2);
5044           if (template_sequence[i].r_type != R_ARM_NONE)
5045             {
5046               stub_reloc_idx[nrelocs] = i;
5047               stub_reloc_offset[nrelocs++] = size;
5048             }
5049           size += 4;
5050           break;
5051
5052         case ARM_TYPE:
5053           bfd_put_32 (stub_bfd, template_sequence[i].data,
5054                       loc + size);
5055           /* Handle cases where the target is encoded within the
5056              instruction.  */
5057           if (template_sequence[i].r_type == R_ARM_JUMP24)
5058             {
5059               stub_reloc_idx[nrelocs] = i;
5060               stub_reloc_offset[nrelocs++] = size;
5061             }
5062           size += 4;
5063           break;
5064
5065         case DATA_TYPE:
5066           bfd_put_32 (stub_bfd, template_sequence[i].data, loc + size);
5067           stub_reloc_idx[nrelocs] = i;
5068           stub_reloc_offset[nrelocs++] = size;
5069           size += 4;
5070           break;
5071
5072         default:
5073           BFD_FAIL ();
5074           return FALSE;
5075         }
5076     }
5077
5078   if (just_allocated)
5079     stub_sec->size += size;
5080
5081   /* Stub size has already been computed in arm_size_one_stub. Check
5082      consistency.  */
5083   BFD_ASSERT (size == stub_entry->stub_size);
5084
5085   /* Destination is Thumb. Force bit 0 to 1 to reflect this.  */
5086   if (stub_entry->branch_type == ST_BRANCH_TO_THUMB)
5087     sym_value |= 1;
5088
5089   /* Assume non empty slots have at least one and at most MAXRELOCS entries
5090      to relocate in each stub.  */
5091   removed_sg_veneer =
5092     (size == 0 && stub_entry->stub_type == arm_stub_cmse_branch_thumb_only);
5093   BFD_ASSERT (removed_sg_veneer || (nrelocs != 0 && nrelocs <= MAXRELOCS));
5094
5095   for (i = 0; i < nrelocs; i++)
5096     {
5097       Elf_Internal_Rela rel;
5098       bfd_boolean unresolved_reloc;
5099       char *error_message;
5100       bfd_vma points_to =
5101         sym_value + template_sequence[stub_reloc_idx[i]].reloc_addend;
5102
5103       rel.r_offset = stub_entry->stub_offset + stub_reloc_offset[i];
5104       rel.r_info = ELF32_R_INFO (0,
5105                                  template_sequence[stub_reloc_idx[i]].r_type);
5106       rel.r_addend = 0;
5107
5108       if (stub_entry->stub_type == arm_stub_a8_veneer_b_cond && i == 0)
5109         /* The first relocation in the elf32_arm_stub_a8_veneer_b_cond[]
5110            template should refer back to the instruction after the original
5111            branch.  We use target_section as Cortex-A8 erratum workaround stubs
5112            are only generated when both source and target are in the same
5113            section.  */
5114         points_to = stub_entry->target_section->output_section->vma
5115                     + stub_entry->target_section->output_offset
5116                     + stub_entry->source_value;
5117
5118       elf32_arm_final_link_relocate (elf32_arm_howto_from_type
5119           (template_sequence[stub_reloc_idx[i]].r_type),
5120            stub_bfd, info->output_bfd, stub_sec, stub_sec->contents, &rel,
5121            points_to, info, stub_entry->target_section, "", STT_FUNC,
5122            stub_entry->branch_type,
5123            (struct elf_link_hash_entry *) stub_entry->h, &unresolved_reloc,
5124            &error_message);
5125     }
5126
5127   return TRUE;
5128 #undef MAXRELOCS
5129 }
5130
5131 /* Calculate the template, template size and instruction size for a stub.
5132    Return value is the instruction size.  */
5133
5134 static unsigned int
5135 find_stub_size_and_template (enum elf32_arm_stub_type stub_type,
5136                              const insn_sequence **stub_template,
5137                              int *stub_template_size)
5138 {
5139   const insn_sequence *template_sequence = NULL;
5140   int template_size = 0, i;
5141   unsigned int size;
5142
5143   template_sequence = stub_definitions[stub_type].template_sequence;
5144   if (stub_template)
5145     *stub_template = template_sequence;
5146
5147   template_size = stub_definitions[stub_type].template_size;
5148   if (stub_template_size)
5149     *stub_template_size = template_size;
5150
5151   size = 0;
5152   for (i = 0; i < template_size; i++)
5153     {
5154       switch (template_sequence[i].type)
5155         {
5156         case THUMB16_TYPE:
5157           size += 2;
5158           break;
5159
5160         case ARM_TYPE:
5161         case THUMB32_TYPE:
5162         case DATA_TYPE:
5163           size += 4;
5164           break;
5165
5166         default:
5167           BFD_FAIL ();
5168           return 0;
5169         }
5170     }
5171
5172   return size;
5173 }
5174
5175 /* As above, but don't actually build the stub.  Just bump offset so
5176    we know stub section sizes.  */
5177
5178 static bfd_boolean
5179 arm_size_one_stub (struct bfd_hash_entry *gen_entry,
5180                    void *in_arg ATTRIBUTE_UNUSED)
5181 {
5182   struct elf32_arm_stub_hash_entry *stub_entry;
5183   const insn_sequence *template_sequence;
5184   int template_size, size;
5185
5186   /* Massage our args to the form they really have.  */
5187   stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
5188
5189   BFD_ASSERT((stub_entry->stub_type > arm_stub_none)
5190              && stub_entry->stub_type < ARRAY_SIZE(stub_definitions));
5191
5192   size = find_stub_size_and_template (stub_entry->stub_type, &template_sequence,
5193                                       &template_size);
5194
5195   /* Initialized to -1.  Null size indicates an empty slot full of zeros.  */
5196   if (stub_entry->stub_template_size)
5197     {
5198       stub_entry->stub_size = size;
5199       stub_entry->stub_template = template_sequence;
5200       stub_entry->stub_template_size = template_size;
5201     }
5202
5203   /* Already accounted for.  */
5204   if (stub_entry->stub_offset != (bfd_vma) -1)
5205     return TRUE;
5206
5207   size = (size + 7) & ~7;
5208   stub_entry->stub_sec->size += size;
5209
5210   return TRUE;
5211 }
5212
5213 /* External entry points for sizing and building linker stubs.  */
5214
5215 /* Set up various things so that we can make a list of input sections
5216    for each output section included in the link.  Returns -1 on error,
5217    0 when no stubs will be needed, and 1 on success.  */
5218
5219 int
5220 elf32_arm_setup_section_lists (bfd *output_bfd,
5221                                struct bfd_link_info *info)
5222 {
5223   bfd *input_bfd;
5224   unsigned int bfd_count;
5225   unsigned int top_id, top_index;
5226   asection *section;
5227   asection **input_list, **list;
5228   bfd_size_type amt;
5229   struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
5230
5231   if (htab == NULL)
5232     return 0;
5233   if (! is_elf_hash_table (htab))
5234     return 0;
5235
5236   /* Count the number of input BFDs and find the top input section id.  */
5237   for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
5238        input_bfd != NULL;
5239        input_bfd = input_bfd->link.next)
5240     {
5241       bfd_count += 1;
5242       for (section = input_bfd->sections;
5243            section != NULL;
5244            section = section->next)
5245         {
5246           if (top_id < section->id)
5247             top_id = section->id;
5248         }
5249     }
5250   htab->bfd_count = bfd_count;
5251
5252   amt = sizeof (struct map_stub) * (top_id + 1);
5253   htab->stub_group = (struct map_stub *) bfd_zmalloc (amt);
5254   if (htab->stub_group == NULL)
5255     return -1;
5256   htab->top_id = top_id;
5257
5258   /* We can't use output_bfd->section_count here to find the top output
5259      section index as some sections may have been removed, and
5260      _bfd_strip_section_from_output doesn't renumber the indices.  */
5261   for (section = output_bfd->sections, top_index = 0;
5262        section != NULL;
5263        section = section->next)
5264     {
5265       if (top_index < section->index)
5266         top_index = section->index;
5267     }
5268
5269   htab->top_index = top_index;
5270   amt = sizeof (asection *) * (top_index + 1);
5271   input_list = (asection **) bfd_malloc (amt);
5272   htab->input_list = input_list;
5273   if (input_list == NULL)
5274     return -1;
5275
5276   /* For sections we aren't interested in, mark their entries with a
5277      value we can check later.  */
5278   list = input_list + top_index;
5279   do
5280     *list = bfd_abs_section_ptr;
5281   while (list-- != input_list);
5282
5283   for (section = output_bfd->sections;
5284        section != NULL;
5285        section = section->next)
5286     {
5287       if ((section->flags & SEC_CODE) != 0)
5288         input_list[section->index] = NULL;
5289     }
5290
5291   return 1;
5292 }
5293
5294 /* The linker repeatedly calls this function for each input section,
5295    in the order that input sections are linked into output sections.
5296    Build lists of input sections to determine groupings between which
5297    we may insert linker stubs.  */
5298
5299 void
5300 elf32_arm_next_input_section (struct bfd_link_info *info,
5301                               asection *isec)
5302 {
5303   struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
5304
5305   if (htab == NULL)
5306     return;
5307
5308   if (isec->output_section->index <= htab->top_index)
5309     {
5310       asection **list = htab->input_list + isec->output_section->index;
5311
5312       if (*list != bfd_abs_section_ptr && (isec->flags & SEC_CODE) != 0)
5313         {
5314           /* Steal the link_sec pointer for our list.  */
5315 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
5316           /* This happens to make the list in reverse order,
5317              which we reverse later.  */
5318           PREV_SEC (isec) = *list;
5319           *list = isec;
5320         }
5321     }
5322 }
5323
5324 /* See whether we can group stub sections together.  Grouping stub
5325    sections may result in fewer stubs.  More importantly, we need to
5326    put all .init* and .fini* stubs at the end of the .init or
5327    .fini output sections respectively, because glibc splits the
5328    _init and _fini functions into multiple parts.  Putting a stub in
5329    the middle of a function is not a good idea.  */
5330
5331 static void
5332 group_sections (struct elf32_arm_link_hash_table *htab,
5333                 bfd_size_type stub_group_size,
5334                 bfd_boolean stubs_always_after_branch)
5335 {
5336   asection **list = htab->input_list;
5337
5338   do
5339     {
5340       asection *tail = *list;
5341       asection *head;
5342
5343       if (tail == bfd_abs_section_ptr)
5344         continue;
5345
5346       /* Reverse the list: we must avoid placing stubs at the
5347          beginning of the section because the beginning of the text
5348          section may be required for an interrupt vector in bare metal
5349          code.  */
5350 #define NEXT_SEC PREV_SEC
5351       head = NULL;
5352       while (tail != NULL)
5353         {
5354           /* Pop from tail.  */
5355           asection *item = tail;
5356           tail = PREV_SEC (item);
5357
5358           /* Push on head.  */
5359           NEXT_SEC (item) = head;
5360           head = item;
5361         }
5362
5363       while (head != NULL)
5364         {
5365           asection *curr;
5366           asection *next;
5367           bfd_vma stub_group_start = head->output_offset;
5368           bfd_vma end_of_next;
5369
5370           curr = head;
5371           while (NEXT_SEC (curr) != NULL)
5372             {
5373               next = NEXT_SEC (curr);
5374               end_of_next = next->output_offset + next->size;
5375               if (end_of_next - stub_group_start >= stub_group_size)
5376                 /* End of NEXT is too far from start, so stop.  */
5377                 break;
5378               /* Add NEXT to the group.  */
5379               curr = next;
5380             }
5381
5382           /* OK, the size from the start to the start of CURR is less
5383              than stub_group_size and thus can be handled by one stub
5384              section.  (Or the head section is itself larger than
5385              stub_group_size, in which case we may be toast.)
5386              We should really be keeping track of the total size of
5387              stubs added here, as stubs contribute to the final output
5388              section size.  */
5389           do
5390             {
5391               next = NEXT_SEC (head);
5392               /* Set up this stub group.  */
5393               htab->stub_group[head->id].link_sec = curr;
5394             }
5395           while (head != curr && (head = next) != NULL);
5396
5397           /* But wait, there's more!  Input sections up to stub_group_size
5398              bytes after the stub section can be handled by it too.  */
5399           if (!stubs_always_after_branch)
5400             {
5401               stub_group_start = curr->output_offset + curr->size;
5402
5403               while (next != NULL)
5404                 {
5405                   end_of_next = next->output_offset + next->size;
5406                   if (end_of_next - stub_group_start >= stub_group_size)
5407                     /* End of NEXT is too far from stubs, so stop.  */
5408                     break;
5409                   /* Add NEXT to the stub group.  */
5410                   head = next;
5411                   next = NEXT_SEC (head);
5412                   htab->stub_group[head->id].link_sec = curr;
5413                 }
5414             }
5415           head = next;
5416         }
5417     }
5418   while (list++ != htab->input_list + htab->top_index);
5419
5420   free (htab->input_list);
5421 #undef PREV_SEC
5422 #undef NEXT_SEC
5423 }
5424
5425 /* Comparison function for sorting/searching relocations relating to Cortex-A8
5426    erratum fix.  */
5427
5428 static int
5429 a8_reloc_compare (const void *a, const void *b)
5430 {
5431   const struct a8_erratum_reloc *ra = (const struct a8_erratum_reloc *) a;
5432   const struct a8_erratum_reloc *rb = (const struct a8_erratum_reloc *) b;
5433
5434   if (ra->from < rb->from)
5435     return -1;
5436   else if (ra->from > rb->from)
5437     return 1;
5438   else
5439     return 0;
5440 }
5441
5442 static struct elf_link_hash_entry *find_thumb_glue (struct bfd_link_info *,
5443                                                     const char *, char **);
5444
5445 /* Helper function to scan code for sequences which might trigger the Cortex-A8
5446    branch/TLB erratum.  Fill in the table described by A8_FIXES_P,
5447    NUM_A8_FIXES_P, A8_FIX_TABLE_SIZE_P.  Returns true if an error occurs, false
5448    otherwise.  */
5449
5450 static bfd_boolean
5451 cortex_a8_erratum_scan (bfd *input_bfd,
5452                         struct bfd_link_info *info,
5453                         struct a8_erratum_fix **a8_fixes_p,
5454                         unsigned int *num_a8_fixes_p,
5455                         unsigned int *a8_fix_table_size_p,
5456                         struct a8_erratum_reloc *a8_relocs,
5457                         unsigned int num_a8_relocs,
5458                         unsigned prev_num_a8_fixes,
5459                         bfd_boolean *stub_changed_p)
5460 {
5461   asection *section;
5462   struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
5463   struct a8_erratum_fix *a8_fixes = *a8_fixes_p;
5464   unsigned int num_a8_fixes = *num_a8_fixes_p;
5465   unsigned int a8_fix_table_size = *a8_fix_table_size_p;
5466
5467   if (htab == NULL)
5468     return FALSE;
5469
5470   for (section = input_bfd->sections;
5471        section != NULL;
5472        section = section->next)
5473     {
5474       bfd_byte *contents = NULL;
5475       struct _arm_elf_section_data *sec_data;
5476       unsigned int span;
5477       bfd_vma base_vma;
5478
5479       if (elf_section_type (section) != SHT_PROGBITS
5480           || (elf_section_flags (section) & SHF_EXECINSTR) == 0
5481           || (section->flags & SEC_EXCLUDE) != 0
5482           || (section->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
5483           || (section->output_section == bfd_abs_section_ptr))
5484         continue;
5485
5486       base_vma = section->output_section->vma + section->output_offset;
5487
5488       if (elf_section_data (section)->this_hdr.contents != NULL)
5489         contents = elf_section_data (section)->this_hdr.contents;
5490       else if (! bfd_malloc_and_get_section (input_bfd, section, &contents))
5491         return TRUE;
5492
5493       sec_data = elf32_arm_section_data (section);
5494
5495       for (span = 0; span < sec_data->mapcount; span++)
5496         {
5497           unsigned int span_start = sec_data->map[span].vma;
5498           unsigned int span_end = (span == sec_data->mapcount - 1)
5499             ? section->size : sec_data->map[span + 1].vma;
5500           unsigned int i;
5501           char span_type = sec_data->map[span].type;
5502           bfd_boolean last_was_32bit = FALSE, last_was_branch = FALSE;
5503
5504           if (span_type != 't')
5505             continue;
5506
5507           /* Span is entirely within a single 4KB region: skip scanning.  */
5508           if (((base_vma + span_start) & ~0xfff)
5509               == ((base_vma + span_end) & ~0xfff))
5510             continue;
5511
5512           /* Scan for 32-bit Thumb-2 branches which span two 4K regions, where:
5513
5514                * The opcode is BLX.W, BL.W, B.W, Bcc.W
5515                * The branch target is in the same 4KB region as the
5516                  first half of the branch.
5517                * The instruction before the branch is a 32-bit
5518                  length non-branch instruction.  */
5519           for (i = span_start; i < span_end;)
5520             {
5521               unsigned int insn = bfd_getl16 (&contents[i]);
5522               bfd_boolean insn_32bit = FALSE, is_blx = FALSE, is_b = FALSE;
5523               bfd_boolean is_bl = FALSE, is_bcc = FALSE, is_32bit_branch;
5524
5525               if ((insn & 0xe000) == 0xe000 && (insn & 0x1800) != 0x0000)
5526                 insn_32bit = TRUE;
5527
5528               if (insn_32bit)
5529                 {
5530                   /* Load the rest of the insn (in manual-friendly order).  */
5531                   insn = (insn << 16) | bfd_getl16 (&contents[i + 2]);
5532
5533                   /* Encoding T4: B<c>.W.  */
5534                   is_b = (insn & 0xf800d000) == 0xf0009000;
5535                   /* Encoding T1: BL<c>.W.  */
5536                   is_bl = (insn & 0xf800d000) == 0xf000d000;
5537                   /* Encoding T2: BLX<c>.W.  */
5538                   is_blx = (insn & 0xf800d000) == 0xf000c000;
5539                   /* Encoding T3: B<c>.W (not permitted in IT block).  */
5540                   is_bcc = (insn & 0xf800d000) == 0xf0008000
5541                            && (insn & 0x07f00000) != 0x03800000;
5542                 }
5543
5544               is_32bit_branch = is_b || is_bl || is_blx || is_bcc;
5545
5546               if (((base_vma + i) & 0xfff) == 0xffe
5547                   && insn_32bit
5548                   && is_32bit_branch
5549                   && last_was_32bit
5550                   && ! last_was_branch)
5551                 {
5552                   bfd_signed_vma offset = 0;
5553                   bfd_boolean force_target_arm = FALSE;
5554                   bfd_boolean force_target_thumb = FALSE;
5555                   bfd_vma target;
5556                   enum elf32_arm_stub_type stub_type = arm_stub_none;
5557                   struct a8_erratum_reloc key, *found;
5558                   bfd_boolean use_plt = FALSE;
5559
5560                   key.from = base_vma + i;
5561                   found = (struct a8_erratum_reloc *)
5562                       bsearch (&key, a8_relocs, num_a8_relocs,
5563                                sizeof (struct a8_erratum_reloc),
5564                                &a8_reloc_compare);
5565
5566                   if (found)
5567                     {
5568                       char *error_message = NULL;
5569                       struct elf_link_hash_entry *entry;
5570
5571                       /* We don't care about the error returned from this
5572                          function, only if there is glue or not.  */
5573                       entry = find_thumb_glue (info, found->sym_name,
5574                                                &error_message);
5575
5576                       if (entry)
5577                         found->non_a8_stub = TRUE;
5578
5579                       /* Keep a simpler condition, for the sake of clarity.  */
5580                       if (htab->root.splt != NULL && found->hash != NULL
5581                           && found->hash->root.plt.offset != (bfd_vma) -1)
5582                         use_plt = TRUE;
5583
5584                       if (found->r_type == R_ARM_THM_CALL)
5585                         {
5586                           if (found->branch_type == ST_BRANCH_TO_ARM
5587                               || use_plt)
5588                             force_target_arm = TRUE;
5589                           else
5590                             force_target_thumb = TRUE;
5591                         }
5592                     }
5593
5594                   /* Check if we have an offending branch instruction.  */
5595
5596                   if (found && found->non_a8_stub)
5597                     /* We've already made a stub for this instruction, e.g.
5598                        it's a long branch or a Thumb->ARM stub.  Assume that
5599                        stub will suffice to work around the A8 erratum (see
5600                        setting of always_after_branch above).  */
5601                     ;
5602                   else if (is_bcc)
5603                     {
5604                       offset = (insn & 0x7ff) << 1;
5605                       offset |= (insn & 0x3f0000) >> 4;
5606                       offset |= (insn & 0x2000) ? 0x40000 : 0;
5607                       offset |= (insn & 0x800) ? 0x80000 : 0;
5608                       offset |= (insn & 0x4000000) ? 0x100000 : 0;
5609                       if (offset & 0x100000)
5610                         offset |= ~ ((bfd_signed_vma) 0xfffff);
5611                       stub_type = arm_stub_a8_veneer_b_cond;
5612                     }
5613                   else if (is_b || is_bl || is_blx)
5614                     {
5615                       int s = (insn & 0x4000000) != 0;
5616                       int j1 = (insn & 0x2000) != 0;
5617                       int j2 = (insn & 0x800) != 0;
5618                       int i1 = !(j1 ^ s);
5619                       int i2 = !(j2 ^ s);
5620
5621                       offset = (insn & 0x7ff) << 1;
5622                       offset |= (insn & 0x3ff0000) >> 4;
5623                       offset |= i2 << 22;
5624                       offset |= i1 << 23;
5625                       offset |= s << 24;
5626                       if (offset & 0x1000000)
5627                         offset |= ~ ((bfd_signed_vma) 0xffffff);
5628
5629                       if (is_blx)
5630                         offset &= ~ ((bfd_signed_vma) 3);
5631
5632                       stub_type = is_blx ? arm_stub_a8_veneer_blx :
5633                         is_bl ? arm_stub_a8_veneer_bl : arm_stub_a8_veneer_b;
5634                     }
5635
5636                   if (stub_type != arm_stub_none)
5637                     {
5638                       bfd_vma pc_for_insn = base_vma + i + 4;
5639
5640                       /* The original instruction is a BL, but the target is
5641                          an ARM instruction.  If we were not making a stub,
5642                          the BL would have been converted to a BLX.  Use the
5643                          BLX stub instead in that case.  */
5644                       if (htab->use_blx && force_target_arm
5645                           && stub_type == arm_stub_a8_veneer_bl)
5646                         {
5647                           stub_type = arm_stub_a8_veneer_blx;
5648                           is_blx = TRUE;
5649                           is_bl = FALSE;
5650                         }
5651                       /* Conversely, if the original instruction was
5652                          BLX but the target is Thumb mode, use the BL
5653                          stub.  */
5654                       else if (force_target_thumb
5655                                && stub_type == arm_stub_a8_veneer_blx)
5656                         {
5657                           stub_type = arm_stub_a8_veneer_bl;
5658                           is_blx = FALSE;
5659                           is_bl = TRUE;
5660                         }
5661
5662                       if (is_blx)
5663                         pc_for_insn &= ~ ((bfd_vma) 3);
5664
5665                       /* If we found a relocation, use the proper destination,
5666                          not the offset in the (unrelocated) instruction.
5667                          Note this is always done if we switched the stub type
5668                          above.  */
5669                       if (found)
5670                         offset =
5671                           (bfd_signed_vma) (found->destination - pc_for_insn);
5672
5673                       /* If the stub will use a Thumb-mode branch to a
5674                          PLT target, redirect it to the preceding Thumb
5675                          entry point.  */
5676                       if (stub_type != arm_stub_a8_veneer_blx && use_plt)
5677                         offset -= PLT_THUMB_STUB_SIZE;
5678
5679                       target = pc_for_insn + offset;
5680
5681                       /* The BLX stub is ARM-mode code.  Adjust the offset to
5682                          take the different PC value (+8 instead of +4) into
5683                          account.  */
5684                       if (stub_type == arm_stub_a8_veneer_blx)
5685                         offset += 4;
5686
5687                       if (((base_vma + i) & ~0xfff) == (target & ~0xfff))
5688                         {
5689                           char *stub_name = NULL;
5690
5691                           if (num_a8_fixes == a8_fix_table_size)
5692                             {
5693                               a8_fix_table_size *= 2;
5694                               a8_fixes = (struct a8_erratum_fix *)
5695                                   bfd_realloc (a8_fixes,
5696                                                sizeof (struct a8_erratum_fix)
5697                                                * a8_fix_table_size);
5698                             }
5699
5700                           if (num_a8_fixes < prev_num_a8_fixes)
5701                             {
5702                               /* If we're doing a subsequent scan,
5703                                  check if we've found the same fix as
5704                                  before, and try and reuse the stub
5705                                  name.  */
5706                               stub_name = a8_fixes[num_a8_fixes].stub_name;
5707                               if ((a8_fixes[num_a8_fixes].section != section)
5708                                   || (a8_fixes[num_a8_fixes].offset != i))
5709                                 {
5710                                   free (stub_name);
5711                                   stub_name = NULL;
5712                                   *stub_changed_p = TRUE;
5713                                 }
5714                             }
5715
5716                           if (!stub_name)
5717                             {
5718                               stub_name = (char *) bfd_malloc (8 + 1 + 8 + 1);
5719                               if (stub_name != NULL)
5720                                 sprintf (stub_name, "%x:%x", section->id, i);
5721                             }
5722
5723                           a8_fixes[num_a8_fixes].input_bfd = input_bfd;
5724                           a8_fixes[num_a8_fixes].section = section;
5725                           a8_fixes[num_a8_fixes].offset = i;
5726                           a8_fixes[num_a8_fixes].target_offset =
5727                             target - base_vma;
5728                           a8_fixes[num_a8_fixes].orig_insn = insn;
5729                           a8_fixes[num_a8_fixes].stub_name = stub_name;
5730                           a8_fixes[num_a8_fixes].stub_type = stub_type;
5731                           a8_fixes[num_a8_fixes].branch_type =
5732                             is_blx ? ST_BRANCH_TO_ARM : ST_BRANCH_TO_THUMB;
5733
5734                           num_a8_fixes++;
5735                         }
5736                     }
5737                 }
5738
5739               i += insn_32bit ? 4 : 2;
5740               last_was_32bit = insn_32bit;
5741               last_was_branch = is_32bit_branch;
5742             }
5743         }
5744
5745       if (elf_section_data (section)->this_hdr.contents == NULL)
5746         free (contents);
5747     }
5748
5749   *a8_fixes_p = a8_fixes;
5750   *num_a8_fixes_p = num_a8_fixes;
5751   *a8_fix_table_size_p = a8_fix_table_size;
5752
5753   return FALSE;
5754 }
5755
5756 /* Create or update a stub entry depending on whether the stub can already be
5757    found in HTAB.  The stub is identified by:
5758    - its type STUB_TYPE
5759    - its source branch (note that several can share the same stub) whose
5760      section and relocation (if any) are given by SECTION and IRELA
5761      respectively
5762    - its target symbol whose input section, hash, name, value and branch type
5763      are given in SYM_SEC, HASH, SYM_NAME, SYM_VALUE and BRANCH_TYPE
5764      respectively
5765
5766    If found, the value of the stub's target symbol is updated from SYM_VALUE
5767    and *NEW_STUB is set to FALSE.  Otherwise, *NEW_STUB is set to
5768    TRUE and the stub entry is initialized.
5769
5770    Returns the stub that was created or updated, or NULL if an error
5771    occurred.  */
5772
5773 static struct elf32_arm_stub_hash_entry *
5774 elf32_arm_create_stub (struct elf32_arm_link_hash_table *htab,
5775                        enum elf32_arm_stub_type stub_type, asection *section,
5776                        Elf_Internal_Rela *irela, asection *sym_sec,
5777                        struct elf32_arm_link_hash_entry *hash, char *sym_name,
5778                        bfd_vma sym_value, enum arm_st_branch_type branch_type,
5779                        bfd_boolean *new_stub)
5780 {
5781   const asection *id_sec;
5782   char *stub_name;
5783   struct elf32_arm_stub_hash_entry *stub_entry;
5784   unsigned int r_type;
5785   bfd_boolean sym_claimed = arm_stub_sym_claimed (stub_type);
5786
5787   BFD_ASSERT (stub_type != arm_stub_none);
5788   *new_stub = FALSE;
5789
5790   if (sym_claimed)
5791     stub_name = sym_name;
5792   else
5793     {
5794       BFD_ASSERT (irela);
5795       BFD_ASSERT (section);
5796       BFD_ASSERT (section->id <= htab->top_id);
5797
5798       /* Support for grouping stub sections.  */
5799       id_sec = htab->stub_group[section->id].link_sec;
5800
5801       /* Get the name of this stub.  */
5802       stub_name = elf32_arm_stub_name (id_sec, sym_sec, hash, irela,
5803                                        stub_type);
5804       if (!stub_name)
5805         return NULL;
5806     }
5807
5808   stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, stub_name, FALSE,
5809                                      FALSE);
5810   /* The proper stub has already been created, just update its value.  */
5811   if (stub_entry != NULL)
5812     {
5813       if (!sym_claimed)
5814         free (stub_name);
5815       stub_entry->target_value = sym_value;
5816       return stub_entry;
5817     }
5818
5819   stub_entry = elf32_arm_add_stub (stub_name, section, htab, stub_type);
5820   if (stub_entry == NULL)
5821     {
5822       if (!sym_claimed)
5823         free (stub_name);
5824       return NULL;
5825     }
5826
5827   stub_entry->target_value = sym_value;
5828   stub_entry->target_section = sym_sec;
5829   stub_entry->stub_type = stub_type;
5830   stub_entry->h = hash;
5831   stub_entry->branch_type = branch_type;
5832
5833   if (sym_claimed)
5834     stub_entry->output_name = sym_name;
5835   else
5836     {
5837       if (sym_name == NULL)
5838         sym_name = "unnamed";
5839       stub_entry->output_name = (char *)
5840         bfd_alloc (htab->stub_bfd, sizeof (THUMB2ARM_GLUE_ENTRY_NAME)
5841                                    + strlen (sym_name));
5842       if (stub_entry->output_name == NULL)
5843         {
5844           free (stub_name);
5845           return NULL;
5846         }
5847
5848       /* For historical reasons, use the existing names for ARM-to-Thumb and
5849          Thumb-to-ARM stubs.  */
5850       r_type = ELF32_R_TYPE (irela->r_info);
5851       if ((r_type == (unsigned int) R_ARM_THM_CALL
5852            || r_type == (unsigned int) R_ARM_THM_JUMP24
5853            || r_type == (unsigned int) R_ARM_THM_JUMP19)
5854           && branch_type == ST_BRANCH_TO_ARM)
5855         sprintf (stub_entry->output_name, THUMB2ARM_GLUE_ENTRY_NAME, sym_name);
5856       else if ((r_type == (unsigned int) R_ARM_CALL
5857                 || r_type == (unsigned int) R_ARM_JUMP24)
5858                && branch_type == ST_BRANCH_TO_THUMB)
5859         sprintf (stub_entry->output_name, ARM2THUMB_GLUE_ENTRY_NAME, sym_name);
5860       else
5861         sprintf (stub_entry->output_name, STUB_ENTRY_NAME, sym_name);
5862     }
5863
5864   *new_stub = TRUE;
5865   return stub_entry;
5866 }
5867
5868 /* Scan symbols in INPUT_BFD to identify secure entry functions needing a
5869    gateway veneer to transition from non secure to secure state and create them
5870    accordingly.
5871
5872    "ARMv8-M Security Extensions: Requirements on Development Tools" document
5873    defines the conditions that govern Secure Gateway veneer creation for a
5874    given symbol <SYM> as follows:
5875    - it has function type
5876    - it has non local binding
5877    - a symbol named __acle_se_<SYM> (called special symbol) exists with the
5878      same type, binding and value as <SYM> (called normal symbol).
5879    An entry function can handle secure state transition itself in which case
5880    its special symbol would have a different value from the normal symbol.
5881
5882    OUT_ATTR gives the output attributes, SYM_HASHES the symbol index to hash
5883    entry mapping while HTAB gives the name to hash entry mapping.
5884    *CMSE_STUB_CREATED is increased by the number of secure gateway veneer
5885    created.
5886
5887    The return value gives whether a stub failed to be allocated.  */
5888
5889 static bfd_boolean
5890 cmse_scan (bfd *input_bfd, struct elf32_arm_link_hash_table *htab,
5891            obj_attribute *out_attr, struct elf_link_hash_entry **sym_hashes,
5892            int *cmse_stub_created)
5893 {
5894   const struct elf_backend_data *bed;
5895   Elf_Internal_Shdr *symtab_hdr;
5896   unsigned i, j, sym_count, ext_start;
5897   Elf_Internal_Sym *cmse_sym, *local_syms;
5898   struct elf32_arm_link_hash_entry *hash, *cmse_hash = NULL;
5899   enum arm_st_branch_type branch_type;
5900   char *sym_name, *lsym_name;
5901   bfd_vma sym_value;
5902   asection *section;
5903   struct elf32_arm_stub_hash_entry *stub_entry;
5904   bfd_boolean is_v8m, new_stub, cmse_invalid, ret = TRUE;
5905
5906   bed = get_elf_backend_data (input_bfd);
5907   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5908   sym_count = symtab_hdr->sh_size / bed->s->sizeof_sym;
5909   ext_start = symtab_hdr->sh_info;
5910   is_v8m = (out_attr[Tag_CPU_arch].i >= TAG_CPU_ARCH_V8M_BASE
5911             && out_attr[Tag_CPU_arch_profile].i == 'M');
5912
5913   local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
5914   if (local_syms == NULL)
5915     local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
5916                                        symtab_hdr->sh_info, 0, NULL, NULL,
5917                                        NULL);
5918   if (symtab_hdr->sh_info && local_syms == NULL)
5919     return FALSE;
5920
5921   /* Scan symbols.  */
5922   for (i = 0; i < sym_count; i++)
5923     {
5924       cmse_invalid = FALSE;
5925
5926       if (i < ext_start)
5927         {
5928           cmse_sym = &local_syms[i];
5929           /* Not a special symbol.  */
5930           if (!ARM_GET_SYM_CMSE_SPCL (cmse_sym->st_target_internal))
5931             continue;
5932           sym_name = bfd_elf_string_from_elf_section (input_bfd,
5933                                                       symtab_hdr->sh_link,
5934                                                       cmse_sym->st_name);
5935           /* Special symbol with local binding.  */
5936           cmse_invalid = TRUE;
5937         }
5938       else
5939         {
5940           cmse_hash = elf32_arm_hash_entry (sym_hashes[i - ext_start]);
5941           sym_name = (char *) cmse_hash->root.root.root.string;
5942
5943           /* Not a special symbol.  */
5944           if (!ARM_GET_SYM_CMSE_SPCL (cmse_hash->root.target_internal))
5945             continue;
5946
5947           /* Special symbol has incorrect binding or type.  */
5948           if ((cmse_hash->root.root.type != bfd_link_hash_defined
5949                && cmse_hash->root.root.type != bfd_link_hash_defweak)
5950               || cmse_hash->root.type != STT_FUNC)
5951             cmse_invalid = TRUE;
5952         }
5953
5954       if (!is_v8m)
5955         {
5956           _bfd_error_handler (_("%pB: special symbol `%s' only allowed for "
5957                                 "ARMv8-M architecture or later"),
5958                               input_bfd, sym_name);
5959           is_v8m = TRUE; /* Avoid multiple warning.  */
5960           ret = FALSE;
5961         }
5962
5963       if (cmse_invalid)
5964         {
5965           _bfd_error_handler (_("%pB: invalid special symbol `%s'; it must be"
5966                                 " a global or weak function symbol"),
5967                               input_bfd, sym_name);
5968           ret = FALSE;
5969           if (i < ext_start)
5970             continue;
5971         }
5972
5973       sym_name += strlen (CMSE_PREFIX);
5974       hash = (struct elf32_arm_link_hash_entry *)
5975         elf_link_hash_lookup (&(htab)->root, sym_name, FALSE, FALSE, TRUE);
5976
5977       /* No associated normal symbol or it is neither global nor weak.  */
5978       if (!hash
5979           || (hash->root.root.type != bfd_link_hash_defined
5980               && hash->root.root.type != bfd_link_hash_defweak)
5981           || hash->root.type != STT_FUNC)
5982         {
5983           /* Initialize here to avoid warning about use of possibly
5984              uninitialized variable.  */
5985           j = 0;
5986
5987           if (!hash)
5988             {
5989               /* Searching for a normal symbol with local binding.  */
5990               for (; j < ext_start; j++)
5991                 {
5992                   lsym_name =
5993                     bfd_elf_string_from_elf_section (input_bfd,
5994                                                      symtab_hdr->sh_link,
5995                                                      local_syms[j].st_name);
5996                   if (!strcmp (sym_name, lsym_name))
5997                     break;
5998                 }
5999             }
6000
6001           if (hash || j < ext_start)
6002             {
6003               _bfd_error_handler
6004                 (_("%pB: invalid standard symbol `%s'; it must be "
6005                    "a global or weak function symbol"),
6006                  input_bfd, sym_name);
6007             }
6008           else
6009             _bfd_error_handler
6010               (_("%pB: absent standard symbol `%s'"), input_bfd, sym_name);
6011           ret = FALSE;
6012           if (!hash)
6013             continue;
6014         }
6015
6016       sym_value = hash->root.root.u.def.value;
6017       section = hash->root.root.u.def.section;
6018
6019       if (cmse_hash->root.root.u.def.section != section)
6020         {
6021           _bfd_error_handler
6022             (_("%pB: `%s' and its special symbol are in different sections"),
6023              input_bfd, sym_name);
6024           ret = FALSE;
6025         }
6026       if (cmse_hash->root.root.u.def.value != sym_value)
6027         continue; /* Ignore: could be an entry function starting with SG.  */
6028
6029         /* If this section is a link-once section that will be discarded, then
6030            don't create any stubs.  */
6031       if (section->output_section == NULL)
6032         {
6033           _bfd_error_handler
6034             (_("%pB: entry function `%s' not output"), input_bfd, sym_name);
6035           continue;
6036         }
6037
6038       if (hash->root.size == 0)
6039         {
6040           _bfd_error_handler
6041             (_("%pB: entry function `%s' is empty"), input_bfd, sym_name);
6042           ret = FALSE;
6043         }
6044
6045       if (!ret)
6046         continue;
6047       branch_type = ARM_GET_SYM_BRANCH_TYPE (hash->root.target_internal);
6048       stub_entry
6049         = elf32_arm_create_stub (htab, arm_stub_cmse_branch_thumb_only,
6050                                  NULL, NULL, section, hash, sym_name,
6051                                  sym_value, branch_type, &new_stub);
6052
6053       if (stub_entry == NULL)
6054          ret = FALSE;
6055       else
6056         {
6057           BFD_ASSERT (new_stub);
6058           (*cmse_stub_created)++;
6059         }
6060     }
6061
6062   if (!symtab_hdr->contents)
6063     free (local_syms);
6064   return ret;
6065 }
6066
6067 /* Return TRUE iff a symbol identified by its linker HASH entry is a secure
6068    code entry function, ie can be called from non secure code without using a
6069    veneer.  */
6070
6071 static bfd_boolean
6072 cmse_entry_fct_p (struct elf32_arm_link_hash_entry *hash)
6073 {
6074   bfd_byte contents[4];
6075   uint32_t first_insn;
6076   asection *section;
6077   file_ptr offset;
6078   bfd *abfd;
6079
6080   /* Defined symbol of function type.  */
6081   if (hash->root.root.type != bfd_link_hash_defined
6082       && hash->root.root.type != bfd_link_hash_defweak)
6083     return FALSE;
6084   if (hash->root.type != STT_FUNC)
6085     return FALSE;
6086
6087   /* Read first instruction.  */
6088   section = hash->root.root.u.def.section;
6089   abfd = section->owner;
6090   offset = hash->root.root.u.def.value - section->vma;
6091   if (!bfd_get_section_contents (abfd, section, contents, offset,
6092                                  sizeof (contents)))
6093     return FALSE;
6094
6095   first_insn = bfd_get_32 (abfd, contents);
6096
6097   /* Starts by SG instruction.  */
6098   return first_insn == 0xe97fe97f;
6099 }
6100
6101 /* Output the name (in symbol table) of the veneer GEN_ENTRY if it is a new
6102    secure gateway veneers (ie. the veneers was not in the input import library)
6103    and there is no output import library (GEN_INFO->out_implib_bfd is NULL.  */
6104
6105 static bfd_boolean
6106 arm_list_new_cmse_stub (struct bfd_hash_entry *gen_entry, void *gen_info)
6107 {
6108   struct elf32_arm_stub_hash_entry *stub_entry;
6109   struct bfd_link_info *info;
6110
6111   /* Massage our args to the form they really have.  */
6112   stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
6113   info = (struct bfd_link_info *) gen_info;
6114
6115   if (info->out_implib_bfd)
6116     return TRUE;
6117
6118   if (stub_entry->stub_type != arm_stub_cmse_branch_thumb_only)
6119     return TRUE;
6120
6121   if (stub_entry->stub_offset == (bfd_vma) -1)
6122     _bfd_error_handler ("  %s", stub_entry->output_name);
6123
6124   return TRUE;
6125 }
6126
6127 /* Set offset of each secure gateway veneers so that its address remain
6128    identical to the one in the input import library referred by
6129    HTAB->in_implib_bfd.  A warning is issued for veneers that disappeared
6130    (present in input import library but absent from the executable being
6131    linked) or if new veneers appeared and there is no output import library
6132    (INFO->out_implib_bfd is NULL and *CMSE_STUB_CREATED is bigger than the
6133    number of secure gateway veneers found in the input import library.
6134
6135    The function returns whether an error occurred.  If no error occurred,
6136    *CMSE_STUB_CREATED gives the number of SG veneers created by both cmse_scan
6137    and this function and HTAB->new_cmse_stub_offset is set to the biggest
6138    veneer observed set for new veneers to be layed out after.  */
6139
6140 static bfd_boolean
6141 set_cmse_veneer_addr_from_implib (struct bfd_link_info *info,
6142                                   struct elf32_arm_link_hash_table *htab,
6143                                   int *cmse_stub_created)
6144 {
6145   long symsize;
6146   char *sym_name;
6147   flagword flags;
6148   long i, symcount;
6149   bfd *in_implib_bfd;
6150   asection *stub_out_sec;
6151   bfd_boolean ret = TRUE;
6152   Elf_Internal_Sym *intsym;
6153   const char *out_sec_name;
6154   bfd_size_type cmse_stub_size;
6155   asymbol **sympp = NULL, *sym;
6156   struct elf32_arm_link_hash_entry *hash;
6157   const insn_sequence *cmse_stub_template;
6158   struct elf32_arm_stub_hash_entry *stub_entry;
6159   int cmse_stub_template_size, new_cmse_stubs_created = *cmse_stub_created;
6160   bfd_vma veneer_value, stub_offset, next_cmse_stub_offset;
6161   bfd_vma cmse_stub_array_start = (bfd_vma) -1, cmse_stub_sec_vma = 0;
6162
6163   /* No input secure gateway import library.  */
6164   if (!htab->in_implib_bfd)
6165     return TRUE;
6166
6167   in_implib_bfd = htab->in_implib_bfd;
6168   if (!htab->cmse_implib)
6169     {
6170       _bfd_error_handler (_("%pB: --in-implib only supported for Secure "
6171                             "Gateway import libraries"), in_implib_bfd);
6172       return FALSE;
6173     }
6174
6175   /* Get symbol table size.  */
6176   symsize = bfd_get_symtab_upper_bound (in_implib_bfd);
6177   if (symsize < 0)
6178     return FALSE;
6179
6180   /* Read in the input secure gateway import library's symbol table.  */
6181   sympp = (asymbol **) xmalloc (symsize);
6182   symcount = bfd_canonicalize_symtab (in_implib_bfd, sympp);
6183   if (symcount < 0)
6184     {
6185       ret = FALSE;
6186       goto free_sym_buf;
6187     }
6188
6189   htab->new_cmse_stub_offset = 0;
6190   cmse_stub_size =
6191     find_stub_size_and_template (arm_stub_cmse_branch_thumb_only,
6192                                  &cmse_stub_template,
6193                                  &cmse_stub_template_size);
6194   out_sec_name =
6195     arm_dedicated_stub_output_section_name (arm_stub_cmse_branch_thumb_only);
6196   stub_out_sec =
6197     bfd_get_section_by_name (htab->obfd, out_sec_name);
6198   if (stub_out_sec != NULL)
6199     cmse_stub_sec_vma = stub_out_sec->vma;
6200
6201   /* Set addresses of veneers mentionned in input secure gateway import
6202      library's symbol table.  */
6203   for (i = 0; i < symcount; i++)
6204     {
6205       sym = sympp[i];
6206       flags = sym->flags;
6207       sym_name = (char *) bfd_asymbol_name (sym);
6208       intsym = &((elf_symbol_type *) sym)->internal_elf_sym;
6209
6210       if (sym->section != bfd_abs_section_ptr
6211           || !(flags & (BSF_GLOBAL | BSF_WEAK))
6212           || (flags & BSF_FUNCTION) != BSF_FUNCTION
6213           || (ARM_GET_SYM_BRANCH_TYPE (intsym->st_target_internal)
6214               != ST_BRANCH_TO_THUMB))
6215         {
6216           _bfd_error_handler (_("%pB: invalid import library entry: `%s'; "
6217                                 "symbol should be absolute, global and "
6218                                 "refer to Thumb functions"),
6219                               in_implib_bfd, sym_name);
6220           ret = FALSE;
6221           continue;
6222         }
6223
6224       veneer_value = bfd_asymbol_value (sym);
6225       stub_offset = veneer_value - cmse_stub_sec_vma;
6226       stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, sym_name,
6227                                          FALSE, FALSE);
6228       hash = (struct elf32_arm_link_hash_entry *)
6229         elf_link_hash_lookup (&(htab)->root, sym_name, FALSE, FALSE, TRUE);
6230
6231       /* Stub entry should have been created by cmse_scan or the symbol be of
6232          a secure function callable from non secure code.  */
6233       if (!stub_entry && !hash)
6234         {
6235           bfd_boolean new_stub;
6236
6237           _bfd_error_handler
6238             (_("entry function `%s' disappeared from secure code"), sym_name);
6239           hash = (struct elf32_arm_link_hash_entry *)
6240             elf_link_hash_lookup (&(htab)->root, sym_name, TRUE, TRUE, TRUE);
6241           stub_entry
6242             = elf32_arm_create_stub (htab, arm_stub_cmse_branch_thumb_only,
6243                                      NULL, NULL, bfd_abs_section_ptr, hash,
6244                                      sym_name, veneer_value,
6245                                      ST_BRANCH_TO_THUMB, &new_stub);
6246           if (stub_entry == NULL)
6247             ret = FALSE;
6248           else
6249           {
6250             BFD_ASSERT (new_stub);
6251             new_cmse_stubs_created++;
6252             (*cmse_stub_created)++;
6253           }
6254           stub_entry->stub_template_size = stub_entry->stub_size = 0;
6255           stub_entry->stub_offset = stub_offset;
6256         }
6257       /* Symbol found is not callable from non secure code.  */
6258       else if (!stub_entry)
6259         {
6260           if (!cmse_entry_fct_p (hash))
6261             {
6262               _bfd_error_handler (_("`%s' refers to a non entry function"),
6263                                   sym_name);
6264               ret = FALSE;
6265             }
6266           continue;
6267         }
6268       else
6269         {
6270           /* Only stubs for SG veneers should have been created.  */
6271           BFD_ASSERT (stub_entry->stub_type == arm_stub_cmse_branch_thumb_only);
6272
6273           /* Check visibility hasn't changed.  */
6274           if (!!(flags & BSF_GLOBAL)
6275               != (hash->root.root.type == bfd_link_hash_defined))
6276             _bfd_error_handler
6277               (_("%pB: visibility of symbol `%s' has changed"), in_implib_bfd,
6278                sym_name);
6279
6280           stub_entry->stub_offset = stub_offset;
6281         }
6282
6283       /* Size should match that of a SG veneer.  */
6284       if (intsym->st_size != cmse_stub_size)
6285         {
6286           _bfd_error_handler (_("%pB: incorrect size for symbol `%s'"),
6287                               in_implib_bfd, sym_name);
6288           ret = FALSE;
6289         }
6290
6291       /* Previous veneer address is before current SG veneer section.  */
6292       if (veneer_value < cmse_stub_sec_vma)
6293         {
6294           /* Avoid offset underflow.  */
6295           if (stub_entry)
6296             stub_entry->stub_offset = 0;
6297           stub_offset = 0;
6298           ret = FALSE;
6299         }
6300
6301       /* Complain if stub offset not a multiple of stub size.  */
6302       if (stub_offset % cmse_stub_size)
6303         {
6304           _bfd_error_handler
6305             (_("offset of veneer for entry function `%s' not a multiple of "
6306                "its size"), sym_name);
6307           ret = FALSE;
6308         }
6309
6310       if (!ret)
6311         continue;
6312
6313       new_cmse_stubs_created--;
6314       if (veneer_value < cmse_stub_array_start)
6315         cmse_stub_array_start = veneer_value;
6316       next_cmse_stub_offset = stub_offset + ((cmse_stub_size + 7) & ~7);
6317       if (next_cmse_stub_offset > htab->new_cmse_stub_offset)
6318         htab->new_cmse_stub_offset = next_cmse_stub_offset;
6319     }
6320
6321   if (!info->out_implib_bfd && new_cmse_stubs_created != 0)
6322     {
6323       BFD_ASSERT (new_cmse_stubs_created > 0);
6324       _bfd_error_handler
6325         (_("new entry function(s) introduced but no output import library "
6326            "specified:"));
6327       bfd_hash_traverse (&htab->stub_hash_table, arm_list_new_cmse_stub, info);
6328     }
6329
6330   if (cmse_stub_array_start != cmse_stub_sec_vma)
6331     {
6332       _bfd_error_handler
6333         (_("start address of `%s' is different from previous link"),
6334          out_sec_name);
6335       ret = FALSE;
6336     }
6337
6338 free_sym_buf:
6339   free (sympp);
6340   return ret;
6341 }
6342
6343 /* Determine and set the size of the stub section for a final link.
6344
6345    The basic idea here is to examine all the relocations looking for
6346    PC-relative calls to a target that is unreachable with a "bl"
6347    instruction.  */
6348
6349 bfd_boolean
6350 elf32_arm_size_stubs (bfd *output_bfd,
6351                       bfd *stub_bfd,
6352                       struct bfd_link_info *info,
6353                       bfd_signed_vma group_size,
6354                       asection * (*add_stub_section) (const char *, asection *,
6355                                                       asection *,
6356                                                       unsigned int),
6357                       void (*layout_sections_again) (void))
6358 {
6359   bfd_boolean ret = TRUE;
6360   obj_attribute *out_attr;
6361   int cmse_stub_created = 0;
6362   bfd_size_type stub_group_size;
6363   bfd_boolean m_profile, stubs_always_after_branch, first_veneer_scan = TRUE;
6364   struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
6365   struct a8_erratum_fix *a8_fixes = NULL;
6366   unsigned int num_a8_fixes = 0, a8_fix_table_size = 10;
6367   struct a8_erratum_reloc *a8_relocs = NULL;
6368   unsigned int num_a8_relocs = 0, a8_reloc_table_size = 10, i;
6369
6370   if (htab == NULL)
6371     return FALSE;
6372
6373   if (htab->fix_cortex_a8)
6374     {
6375       a8_fixes = (struct a8_erratum_fix *)
6376           bfd_zmalloc (sizeof (struct a8_erratum_fix) * a8_fix_table_size);
6377       a8_relocs = (struct a8_erratum_reloc *)
6378           bfd_zmalloc (sizeof (struct a8_erratum_reloc) * a8_reloc_table_size);
6379     }
6380
6381   /* Propagate mach to stub bfd, because it may not have been
6382      finalized when we created stub_bfd.  */
6383   bfd_set_arch_mach (stub_bfd, bfd_get_arch (output_bfd),
6384                      bfd_get_mach (output_bfd));
6385
6386   /* Stash our params away.  */
6387   htab->stub_bfd = stub_bfd;
6388   htab->add_stub_section = add_stub_section;
6389   htab->layout_sections_again = layout_sections_again;
6390   stubs_always_after_branch = group_size < 0;
6391
6392   out_attr = elf_known_obj_attributes_proc (output_bfd);
6393   m_profile = out_attr[Tag_CPU_arch_profile].i == 'M';
6394
6395   /* The Cortex-A8 erratum fix depends on stubs not being in the same 4K page
6396      as the first half of a 32-bit branch straddling two 4K pages.  This is a
6397      crude way of enforcing that.  */
6398   if (htab->fix_cortex_a8)
6399     stubs_always_after_branch = 1;
6400
6401   if (group_size < 0)
6402     stub_group_size = -group_size;
6403   else
6404     stub_group_size = group_size;
6405
6406   if (stub_group_size == 1)
6407     {
6408       /* Default values.  */
6409       /* Thumb branch range is +-4MB has to be used as the default
6410          maximum size (a given section can contain both ARM and Thumb
6411          code, so the worst case has to be taken into account).
6412
6413          This value is 24K less than that, which allows for 2025
6414          12-byte stubs.  If we exceed that, then we will fail to link.
6415          The user will have to relink with an explicit group size
6416          option.  */
6417       stub_group_size = 4170000;
6418     }
6419
6420   group_sections (htab, stub_group_size, stubs_always_after_branch);
6421
6422   /* If we're applying the cortex A8 fix, we need to determine the
6423      program header size now, because we cannot change it later --
6424      that could alter section placements.  Notice the A8 erratum fix
6425      ends up requiring the section addresses to remain unchanged
6426      modulo the page size.  That's something we cannot represent
6427      inside BFD, and we don't want to force the section alignment to
6428      be the page size.  */
6429   if (htab->fix_cortex_a8)
6430     (*htab->layout_sections_again) ();
6431
6432   while (1)
6433     {
6434       bfd *input_bfd;
6435       unsigned int bfd_indx;
6436       asection *stub_sec;
6437       enum elf32_arm_stub_type stub_type;
6438       bfd_boolean stub_changed = FALSE;
6439       unsigned prev_num_a8_fixes = num_a8_fixes;
6440
6441       num_a8_fixes = 0;
6442       for (input_bfd = info->input_bfds, bfd_indx = 0;
6443            input_bfd != NULL;
6444            input_bfd = input_bfd->link.next, bfd_indx++)
6445         {
6446           Elf_Internal_Shdr *symtab_hdr;
6447           asection *section;
6448           Elf_Internal_Sym *local_syms = NULL;
6449
6450           if (!is_arm_elf (input_bfd))
6451             continue;
6452
6453           num_a8_relocs = 0;
6454
6455           /* We'll need the symbol table in a second.  */
6456           symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
6457           if (symtab_hdr->sh_info == 0)
6458             continue;
6459
6460           /* Limit scan of symbols to object file whose profile is
6461              Microcontroller to not hinder performance in the general case.  */
6462           if (m_profile && first_veneer_scan)
6463             {
6464               struct elf_link_hash_entry **sym_hashes;
6465
6466               sym_hashes = elf_sym_hashes (input_bfd);
6467               if (!cmse_scan (input_bfd, htab, out_attr, sym_hashes,
6468                               &cmse_stub_created))
6469                 goto error_ret_free_local;
6470
6471               if (cmse_stub_created != 0)
6472                 stub_changed = TRUE;
6473             }
6474
6475           /* Walk over each section attached to the input bfd.  */
6476           for (section = input_bfd->sections;
6477                section != NULL;
6478                section = section->next)
6479             {
6480               Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
6481
6482               /* If there aren't any relocs, then there's nothing more
6483                  to do.  */
6484               if ((section->flags & SEC_RELOC) == 0
6485                   || section->reloc_count == 0
6486                   || (section->flags & SEC_CODE) == 0)
6487                 continue;
6488
6489               /* If this section is a link-once section that will be
6490                  discarded, then don't create any stubs.  */
6491               if (section->output_section == NULL
6492                   || section->output_section->owner != output_bfd)
6493                 continue;
6494
6495               /* Get the relocs.  */
6496               internal_relocs
6497                 = _bfd_elf_link_read_relocs (input_bfd, section, NULL,
6498                                              NULL, info->keep_memory);
6499               if (internal_relocs == NULL)
6500                 goto error_ret_free_local;
6501
6502               /* Now examine each relocation.  */
6503               irela = internal_relocs;
6504               irelaend = irela + section->reloc_count;
6505               for (; irela < irelaend; irela++)
6506                 {
6507                   unsigned int r_type, r_indx;
6508                   asection *sym_sec;
6509                   bfd_vma sym_value;
6510                   bfd_vma destination;
6511                   struct elf32_arm_link_hash_entry *hash;
6512                   const char *sym_name;
6513                   unsigned char st_type;
6514                   enum arm_st_branch_type branch_type;
6515                   bfd_boolean created_stub = FALSE;
6516
6517                   r_type = ELF32_R_TYPE (irela->r_info);
6518                   r_indx = ELF32_R_SYM (irela->r_info);
6519
6520                   if (r_type >= (unsigned int) R_ARM_max)
6521                     {
6522                       bfd_set_error (bfd_error_bad_value);
6523                     error_ret_free_internal:
6524                       if (elf_section_data (section)->relocs == NULL)
6525                         free (internal_relocs);
6526                     /* Fall through.  */
6527                     error_ret_free_local:
6528                       if (local_syms != NULL
6529                           && (symtab_hdr->contents
6530                               != (unsigned char *) local_syms))
6531                         free (local_syms);
6532                       return FALSE;
6533                     }
6534
6535                   hash = NULL;
6536                   if (r_indx >= symtab_hdr->sh_info)
6537                     hash = elf32_arm_hash_entry
6538                       (elf_sym_hashes (input_bfd)
6539                        [r_indx - symtab_hdr->sh_info]);
6540
6541                   /* Only look for stubs on branch instructions, or
6542                      non-relaxed TLSCALL  */
6543                   if ((r_type != (unsigned int) R_ARM_CALL)
6544                       && (r_type != (unsigned int) R_ARM_THM_CALL)
6545                       && (r_type != (unsigned int) R_ARM_JUMP24)
6546                       && (r_type != (unsigned int) R_ARM_THM_JUMP19)
6547                       && (r_type != (unsigned int) R_ARM_THM_XPC22)
6548                       && (r_type != (unsigned int) R_ARM_THM_JUMP24)
6549                       && (r_type != (unsigned int) R_ARM_PLT32)
6550                       && !((r_type == (unsigned int) R_ARM_TLS_CALL
6551                             || r_type == (unsigned int) R_ARM_THM_TLS_CALL)
6552                            && r_type == elf32_arm_tls_transition
6553                                (info, r_type, &hash->root)
6554                            && ((hash ? hash->tls_type
6555                                 : (elf32_arm_local_got_tls_type
6556                                    (input_bfd)[r_indx]))
6557                                & GOT_TLS_GDESC) != 0))
6558                     continue;
6559
6560                   /* Now determine the call target, its name, value,
6561                      section.  */
6562                   sym_sec = NULL;
6563                   sym_value = 0;
6564                   destination = 0;
6565                   sym_name = NULL;
6566
6567                   if (r_type == (unsigned int) R_ARM_TLS_CALL
6568                       || r_type == (unsigned int) R_ARM_THM_TLS_CALL)
6569                     {
6570                       /* A non-relaxed TLS call.  The target is the
6571                          plt-resident trampoline and nothing to do
6572                          with the symbol.  */
6573                       BFD_ASSERT (htab->tls_trampoline > 0);
6574                       sym_sec = htab->root.splt;
6575                       sym_value = htab->tls_trampoline;
6576                       hash = 0;
6577                       st_type = STT_FUNC;
6578                       branch_type = ST_BRANCH_TO_ARM;
6579                     }
6580                   else if (!hash)
6581                     {
6582                       /* It's a local symbol.  */
6583                       Elf_Internal_Sym *sym;
6584
6585                       if (local_syms == NULL)
6586                         {
6587                           local_syms
6588                             = (Elf_Internal_Sym *) symtab_hdr->contents;
6589                           if (local_syms == NULL)
6590                             local_syms
6591                               = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
6592                                                       symtab_hdr->sh_info, 0,
6593                                                       NULL, NULL, NULL);
6594                           if (local_syms == NULL)
6595                             goto error_ret_free_internal;
6596                         }
6597
6598                       sym = local_syms + r_indx;
6599                       if (sym->st_shndx == SHN_UNDEF)
6600                         sym_sec = bfd_und_section_ptr;
6601                       else if (sym->st_shndx == SHN_ABS)
6602                         sym_sec = bfd_abs_section_ptr;
6603                       else if (sym->st_shndx == SHN_COMMON)
6604                         sym_sec = bfd_com_section_ptr;
6605                       else
6606                         sym_sec =
6607                           bfd_section_from_elf_index (input_bfd, sym->st_shndx);
6608
6609                       if (!sym_sec)
6610                         /* This is an undefined symbol.  It can never
6611                            be resolved.  */
6612                         continue;
6613
6614                       if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
6615                         sym_value = sym->st_value;
6616                       destination = (sym_value + irela->r_addend
6617                                      + sym_sec->output_offset
6618                                      + sym_sec->output_section->vma);
6619                       st_type = ELF_ST_TYPE (sym->st_info);
6620                       branch_type =
6621                         ARM_GET_SYM_BRANCH_TYPE (sym->st_target_internal);
6622                       sym_name
6623                         = bfd_elf_string_from_elf_section (input_bfd,
6624                                                            symtab_hdr->sh_link,
6625                                                            sym->st_name);
6626                     }
6627                   else
6628                     {
6629                       /* It's an external symbol.  */
6630                       while (hash->root.root.type == bfd_link_hash_indirect
6631                              || hash->root.root.type == bfd_link_hash_warning)
6632                         hash = ((struct elf32_arm_link_hash_entry *)
6633                                 hash->root.root.u.i.link);
6634
6635                       if (hash->root.root.type == bfd_link_hash_defined
6636                           || hash->root.root.type == bfd_link_hash_defweak)
6637                         {
6638                           sym_sec = hash->root.root.u.def.section;
6639                           sym_value = hash->root.root.u.def.value;
6640
6641                           struct elf32_arm_link_hash_table *globals =
6642                                                   elf32_arm_hash_table (info);
6643
6644                           /* For a destination in a shared library,
6645                              use the PLT stub as target address to
6646                              decide whether a branch stub is
6647                              needed.  */
6648                           if (globals != NULL
6649                               && globals->root.splt != NULL
6650                               && hash != NULL
6651                               && hash->root.plt.offset != (bfd_vma) -1)
6652                             {
6653                               sym_sec = globals->root.splt;
6654                               sym_value = hash->root.plt.offset;
6655                               if (sym_sec->output_section != NULL)
6656                                 destination = (sym_value
6657                                                + sym_sec->output_offset
6658                                                + sym_sec->output_section->vma);
6659                             }
6660                           else if (sym_sec->output_section != NULL)
6661                             destination = (sym_value + irela->r_addend
6662                                            + sym_sec->output_offset
6663                                            + sym_sec->output_section->vma);
6664                         }
6665                       else if ((hash->root.root.type == bfd_link_hash_undefined)
6666                                || (hash->root.root.type == bfd_link_hash_undefweak))
6667                         {
6668                           /* For a shared library, use the PLT stub as
6669                              target address to decide whether a long
6670                              branch stub is needed.
6671                              For absolute code, they cannot be handled.  */
6672                           struct elf32_arm_link_hash_table *globals =
6673                             elf32_arm_hash_table (info);
6674
6675                           if (globals != NULL
6676                               && globals->root.splt != NULL
6677                               && hash != NULL
6678                               && hash->root.plt.offset != (bfd_vma) -1)
6679                             {
6680                               sym_sec = globals->root.splt;
6681                               sym_value = hash->root.plt.offset;
6682                               if (sym_sec->output_section != NULL)
6683                                 destination = (sym_value
6684                                                + sym_sec->output_offset
6685                                                + sym_sec->output_section->vma);
6686                             }
6687                           else
6688                             continue;
6689                         }
6690                       else
6691                         {
6692                           bfd_set_error (bfd_error_bad_value);
6693                           goto error_ret_free_internal;
6694                         }
6695                       st_type = hash->root.type;
6696                       branch_type =
6697                         ARM_GET_SYM_BRANCH_TYPE (hash->root.target_internal);
6698                       sym_name = hash->root.root.root.string;
6699                     }
6700
6701                   do
6702                     {
6703                       bfd_boolean new_stub;
6704                       struct elf32_arm_stub_hash_entry *stub_entry;
6705
6706                       /* Determine what (if any) linker stub is needed.  */
6707                       stub_type = arm_type_of_stub (info, section, irela,
6708                                                     st_type, &branch_type,
6709                                                     hash, destination, sym_sec,
6710                                                     input_bfd, sym_name);
6711                       if (stub_type == arm_stub_none)
6712                         break;
6713
6714                       /* We've either created a stub for this reloc already,
6715                          or we are about to.  */
6716                       stub_entry =
6717                         elf32_arm_create_stub (htab, stub_type, section, irela,
6718                                                sym_sec, hash,
6719                                                (char *) sym_name, sym_value,
6720                                                branch_type, &new_stub);
6721
6722                       created_stub = stub_entry != NULL;
6723                       if (!created_stub)
6724                         goto error_ret_free_internal;
6725                       else if (!new_stub)
6726                         break;
6727                       else
6728                         stub_changed = TRUE;
6729                     }
6730                   while (0);
6731
6732                   /* Look for relocations which might trigger Cortex-A8
6733                      erratum.  */
6734                   if (htab->fix_cortex_a8
6735                       && (r_type == (unsigned int) R_ARM_THM_JUMP24
6736                           || r_type == (unsigned int) R_ARM_THM_JUMP19
6737                           || r_type == (unsigned int) R_ARM_THM_CALL
6738                           || r_type == (unsigned int) R_ARM_THM_XPC22))
6739                     {
6740                       bfd_vma from = section->output_section->vma
6741                                      + section->output_offset
6742                                      + irela->r_offset;
6743
6744                       if ((from & 0xfff) == 0xffe)
6745                         {
6746                           /* Found a candidate.  Note we haven't checked the
6747                              destination is within 4K here: if we do so (and
6748                              don't create an entry in a8_relocs) we can't tell
6749                              that a branch should have been relocated when
6750                              scanning later.  */
6751                           if (num_a8_relocs == a8_reloc_table_size)
6752                             {
6753                               a8_reloc_table_size *= 2;
6754                               a8_relocs = (struct a8_erratum_reloc *)
6755                                   bfd_realloc (a8_relocs,
6756                                                sizeof (struct a8_erratum_reloc)
6757                                                * a8_reloc_table_size);
6758                             }
6759
6760                           a8_relocs[num_a8_relocs].from = from;
6761                           a8_relocs[num_a8_relocs].destination = destination;
6762                           a8_relocs[num_a8_relocs].r_type = r_type;
6763                           a8_relocs[num_a8_relocs].branch_type = branch_type;
6764                           a8_relocs[num_a8_relocs].sym_name = sym_name;
6765                           a8_relocs[num_a8_relocs].non_a8_stub = created_stub;
6766                           a8_relocs[num_a8_relocs].hash = hash;
6767
6768                           num_a8_relocs++;
6769                         }
6770                     }
6771                 }
6772
6773               /* We're done with the internal relocs, free them.  */
6774               if (elf_section_data (section)->relocs == NULL)
6775                 free (internal_relocs);
6776             }
6777
6778           if (htab->fix_cortex_a8)
6779             {
6780               /* Sort relocs which might apply to Cortex-A8 erratum.  */
6781               qsort (a8_relocs, num_a8_relocs,
6782                      sizeof (struct a8_erratum_reloc),
6783                      &a8_reloc_compare);
6784
6785               /* Scan for branches which might trigger Cortex-A8 erratum.  */
6786               if (cortex_a8_erratum_scan (input_bfd, info, &a8_fixes,
6787                                           &num_a8_fixes, &a8_fix_table_size,
6788                                           a8_relocs, num_a8_relocs,
6789                                           prev_num_a8_fixes, &stub_changed)
6790                   != 0)
6791                 goto error_ret_free_local;
6792             }
6793
6794           if (local_syms != NULL
6795               && symtab_hdr->contents != (unsigned char *) local_syms)
6796             {
6797               if (!info->keep_memory)
6798                 free (local_syms);
6799               else
6800                 symtab_hdr->contents = (unsigned char *) local_syms;
6801             }
6802         }
6803
6804       if (first_veneer_scan
6805           && !set_cmse_veneer_addr_from_implib (info, htab,
6806                                                 &cmse_stub_created))
6807         ret = FALSE;
6808
6809       if (prev_num_a8_fixes != num_a8_fixes)
6810         stub_changed = TRUE;
6811
6812       if (!stub_changed)
6813         break;
6814
6815       /* OK, we've added some stubs.  Find out the new size of the
6816          stub sections.  */
6817       for (stub_sec = htab->stub_bfd->sections;
6818            stub_sec != NULL;
6819            stub_sec = stub_sec->next)
6820         {
6821           /* Ignore non-stub sections.  */
6822           if (!strstr (stub_sec->name, STUB_SUFFIX))
6823             continue;
6824
6825           stub_sec->size = 0;
6826         }
6827
6828       /* Add new SG veneers after those already in the input import
6829          library.  */
6830       for (stub_type = arm_stub_none + 1; stub_type < max_stub_type;
6831            stub_type++)
6832         {
6833           bfd_vma *start_offset_p;
6834           asection **stub_sec_p;
6835
6836           start_offset_p = arm_new_stubs_start_offset_ptr (htab, stub_type);
6837           stub_sec_p = arm_dedicated_stub_input_section_ptr (htab, stub_type);
6838           if (start_offset_p == NULL)
6839             continue;
6840
6841           BFD_ASSERT (stub_sec_p != NULL);
6842           if (*stub_sec_p != NULL)
6843             (*stub_sec_p)->size = *start_offset_p;
6844         }
6845
6846       /* Compute stub section size, considering padding.  */
6847       bfd_hash_traverse (&htab->stub_hash_table, arm_size_one_stub, htab);
6848       for (stub_type = arm_stub_none + 1; stub_type < max_stub_type;
6849            stub_type++)
6850         {
6851           int size, padding;
6852           asection **stub_sec_p;
6853
6854           padding = arm_dedicated_stub_section_padding (stub_type);
6855           stub_sec_p = arm_dedicated_stub_input_section_ptr (htab, stub_type);
6856           /* Skip if no stub input section or no stub section padding
6857              required.  */
6858           if ((stub_sec_p != NULL && *stub_sec_p == NULL) || padding == 0)
6859             continue;
6860           /* Stub section padding required but no dedicated section.  */
6861           BFD_ASSERT (stub_sec_p);
6862
6863           size = (*stub_sec_p)->size;
6864           size = (size + padding - 1) & ~(padding - 1);
6865           (*stub_sec_p)->size = size;
6866         }
6867
6868       /* Add Cortex-A8 erratum veneers to stub section sizes too.  */
6869       if (htab->fix_cortex_a8)
6870         for (i = 0; i < num_a8_fixes; i++)
6871           {
6872             stub_sec = elf32_arm_create_or_find_stub_sec (NULL,
6873                          a8_fixes[i].section, htab, a8_fixes[i].stub_type);
6874
6875             if (stub_sec == NULL)
6876               return FALSE;
6877
6878             stub_sec->size
6879               += find_stub_size_and_template (a8_fixes[i].stub_type, NULL,
6880                                               NULL);
6881           }
6882
6883
6884       /* Ask the linker to do its stuff.  */
6885       (*htab->layout_sections_again) ();
6886       first_veneer_scan = FALSE;
6887     }
6888
6889   /* Add stubs for Cortex-A8 erratum fixes now.  */
6890   if (htab->fix_cortex_a8)
6891     {
6892       for (i = 0; i < num_a8_fixes; i++)
6893         {
6894           struct elf32_arm_stub_hash_entry *stub_entry;
6895           char *stub_name = a8_fixes[i].stub_name;
6896           asection *section = a8_fixes[i].section;
6897           unsigned int section_id = a8_fixes[i].section->id;
6898           asection *link_sec = htab->stub_group[section_id].link_sec;
6899           asection *stub_sec = htab->stub_group[section_id].stub_sec;
6900           const insn_sequence *template_sequence;
6901           int template_size, size = 0;
6902
6903           stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, stub_name,
6904                                              TRUE, FALSE);
6905           if (stub_entry == NULL)
6906             {
6907               _bfd_error_handler (_("%pB: cannot create stub entry %s"),
6908                                   section->owner, stub_name);
6909               return FALSE;
6910             }
6911
6912           stub_entry->stub_sec = stub_sec;
6913           stub_entry->stub_offset = (bfd_vma) -1;
6914           stub_entry->id_sec = link_sec;
6915           stub_entry->stub_type = a8_fixes[i].stub_type;
6916           stub_entry->source_value = a8_fixes[i].offset;
6917           stub_entry->target_section = a8_fixes[i].section;
6918           stub_entry->target_value = a8_fixes[i].target_offset;
6919           stub_entry->orig_insn = a8_fixes[i].orig_insn;
6920           stub_entry->branch_type = a8_fixes[i].branch_type;
6921
6922           size = find_stub_size_and_template (a8_fixes[i].stub_type,
6923                                               &template_sequence,
6924                                               &template_size);
6925
6926           stub_entry->stub_size = size;
6927           stub_entry->stub_template = template_sequence;
6928           stub_entry->stub_template_size = template_size;
6929         }
6930
6931       /* Stash the Cortex-A8 erratum fix array for use later in
6932          elf32_arm_write_section().  */
6933       htab->a8_erratum_fixes = a8_fixes;
6934       htab->num_a8_erratum_fixes = num_a8_fixes;
6935     }
6936   else
6937     {
6938       htab->a8_erratum_fixes = NULL;
6939       htab->num_a8_erratum_fixes = 0;
6940     }
6941   return ret;
6942 }
6943
6944 /* Build all the stubs associated with the current output file.  The
6945    stubs are kept in a hash table attached to the main linker hash
6946    table.  We also set up the .plt entries for statically linked PIC
6947    functions here.  This function is called via arm_elf_finish in the
6948    linker.  */
6949
6950 bfd_boolean
6951 elf32_arm_build_stubs (struct bfd_link_info *info)
6952 {
6953   asection *stub_sec;
6954   struct bfd_hash_table *table;
6955   enum elf32_arm_stub_type stub_type;
6956   struct elf32_arm_link_hash_table *htab;
6957
6958   htab = elf32_arm_hash_table (info);
6959   if (htab == NULL)
6960     return FALSE;
6961
6962   for (stub_sec = htab->stub_bfd->sections;
6963        stub_sec != NULL;
6964        stub_sec = stub_sec->next)
6965     {
6966       bfd_size_type size;
6967
6968       /* Ignore non-stub sections.  */
6969       if (!strstr (stub_sec->name, STUB_SUFFIX))
6970         continue;
6971
6972       /* Allocate memory to hold the linker stubs.  Zeroing the stub sections
6973          must at least be done for stub section requiring padding and for SG
6974          veneers to ensure that a non secure code branching to a removed SG
6975          veneer causes an error.  */
6976       size = stub_sec->size;
6977       stub_sec->contents = (unsigned char *) bfd_zalloc (htab->stub_bfd, size);
6978       if (stub_sec->contents == NULL && size != 0)
6979         return FALSE;
6980
6981       stub_sec->size = 0;
6982     }
6983
6984   /* Add new SG veneers after those already in the input import library.  */
6985   for (stub_type = arm_stub_none + 1; stub_type < max_stub_type; stub_type++)
6986     {
6987       bfd_vma *start_offset_p;
6988       asection **stub_sec_p;
6989
6990       start_offset_p = arm_new_stubs_start_offset_ptr (htab, stub_type);
6991       stub_sec_p = arm_dedicated_stub_input_section_ptr (htab, stub_type);
6992       if (start_offset_p == NULL)
6993         continue;
6994
6995       BFD_ASSERT (stub_sec_p != NULL);
6996       if (*stub_sec_p != NULL)
6997         (*stub_sec_p)->size = *start_offset_p;
6998     }
6999
7000   /* Build the stubs as directed by the stub hash table.  */
7001   table = &htab->stub_hash_table;
7002   bfd_hash_traverse (table, arm_build_one_stub, info);
7003   if (htab->fix_cortex_a8)
7004     {
7005       /* Place the cortex a8 stubs last.  */
7006       htab->fix_cortex_a8 = -1;
7007       bfd_hash_traverse (table, arm_build_one_stub, info);
7008     }
7009
7010   return TRUE;
7011 }
7012
7013 /* Locate the Thumb encoded calling stub for NAME.  */
7014
7015 static struct elf_link_hash_entry *
7016 find_thumb_glue (struct bfd_link_info *link_info,
7017                  const char *name,
7018                  char **error_message)
7019 {
7020   char *tmp_name;
7021   struct elf_link_hash_entry *hash;
7022   struct elf32_arm_link_hash_table *hash_table;
7023
7024   /* We need a pointer to the armelf specific hash table.  */
7025   hash_table = elf32_arm_hash_table (link_info);
7026   if (hash_table == NULL)
7027     return NULL;
7028
7029   tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
7030                                   + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
7031
7032   BFD_ASSERT (tmp_name);
7033
7034   sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
7035
7036   hash = elf_link_hash_lookup
7037     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
7038
7039   if (hash == NULL
7040       && asprintf (error_message, _("unable to find %s glue '%s' for '%s'"),
7041                    "Thumb", tmp_name, name) == -1)
7042     *error_message = (char *) bfd_errmsg (bfd_error_system_call);
7043
7044   free (tmp_name);
7045
7046   return hash;
7047 }
7048
7049 /* Locate the ARM encoded calling stub for NAME.  */
7050
7051 static struct elf_link_hash_entry *
7052 find_arm_glue (struct bfd_link_info *link_info,
7053                const char *name,
7054                char **error_message)
7055 {
7056   char *tmp_name;
7057   struct elf_link_hash_entry *myh;
7058   struct elf32_arm_link_hash_table *hash_table;
7059
7060   /* We need a pointer to the elfarm specific hash table.  */
7061   hash_table = elf32_arm_hash_table (link_info);
7062   if (hash_table == NULL)
7063     return NULL;
7064
7065   tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
7066                                   + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
7067
7068   BFD_ASSERT (tmp_name);
7069
7070   sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
7071
7072   myh = elf_link_hash_lookup
7073     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
7074
7075   if (myh == NULL
7076       && asprintf (error_message, _("unable to find %s glue '%s' for '%s'"),
7077                    "ARM", tmp_name, name) == -1)
7078     *error_message = (char *) bfd_errmsg (bfd_error_system_call);
7079
7080   free (tmp_name);
7081
7082   return myh;
7083 }
7084
7085 /* ARM->Thumb glue (static images):
7086
7087    .arm
7088    __func_from_arm:
7089    ldr r12, __func_addr
7090    bx  r12
7091    __func_addr:
7092    .word func    @ behave as if you saw a ARM_32 reloc.
7093
7094    (v5t static images)
7095    .arm
7096    __func_from_arm:
7097    ldr pc, __func_addr
7098    __func_addr:
7099    .word func    @ behave as if you saw a ARM_32 reloc.
7100
7101    (relocatable images)
7102    .arm
7103    __func_from_arm:
7104    ldr r12, __func_offset
7105    add r12, r12, pc
7106    bx  r12
7107    __func_offset:
7108    .word func - .   */
7109
7110 #define ARM2THUMB_STATIC_GLUE_SIZE 12
7111 static const insn32 a2t1_ldr_insn = 0xe59fc000;
7112 static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
7113 static const insn32 a2t3_func_addr_insn = 0x00000001;
7114
7115 #define ARM2THUMB_V5_STATIC_GLUE_SIZE 8
7116 static const insn32 a2t1v5_ldr_insn = 0xe51ff004;
7117 static const insn32 a2t2v5_func_addr_insn = 0x00000001;
7118
7119 #define ARM2THUMB_PIC_GLUE_SIZE 16
7120 static const insn32 a2t1p_ldr_insn = 0xe59fc004;
7121 static const insn32 a2t2p_add_pc_insn = 0xe08cc00f;
7122 static const insn32 a2t3p_bx_r12_insn = 0xe12fff1c;
7123
7124 /* Thumb->ARM:                          Thumb->(non-interworking aware) ARM
7125
7126      .thumb                             .thumb
7127      .align 2                           .align 2
7128  __func_from_thumb:                 __func_from_thumb:
7129      bx pc                              push {r6, lr}
7130      nop                                ldr  r6, __func_addr
7131      .arm                               mov  lr, pc
7132      b func                             bx   r6
7133                                         .arm
7134                                     ;; back_to_thumb
7135                                         ldmia r13! {r6, lr}
7136                                         bx    lr
7137                                     __func_addr:
7138                                         .word        func  */
7139
7140 #define THUMB2ARM_GLUE_SIZE 8
7141 static const insn16 t2a1_bx_pc_insn = 0x4778;
7142 static const insn16 t2a2_noop_insn = 0x46c0;
7143 static const insn32 t2a3_b_insn = 0xea000000;
7144
7145 #define VFP11_ERRATUM_VENEER_SIZE 8
7146 #define STM32L4XX_ERRATUM_LDM_VENEER_SIZE 16
7147 #define STM32L4XX_ERRATUM_VLDM_VENEER_SIZE 24
7148
7149 #define ARM_BX_VENEER_SIZE 12
7150 static const insn32 armbx1_tst_insn = 0xe3100001;
7151 static const insn32 armbx2_moveq_insn = 0x01a0f000;
7152 static const insn32 armbx3_bx_insn = 0xe12fff10;
7153
7154 #ifndef ELFARM_NABI_C_INCLUDED
7155 static void
7156 arm_allocate_glue_section_space (bfd * abfd, bfd_size_type size, const char * name)
7157 {
7158   asection * s;
7159   bfd_byte * contents;
7160
7161   if (size == 0)
7162     {
7163       /* Do not include empty glue sections in the output.  */
7164       if (abfd != NULL)
7165         {
7166           s = bfd_get_linker_section (abfd, name);
7167           if (s != NULL)
7168             s->flags |= SEC_EXCLUDE;
7169         }
7170       return;
7171     }
7172
7173   BFD_ASSERT (abfd != NULL);
7174
7175   s = bfd_get_linker_section (abfd, name);
7176   BFD_ASSERT (s != NULL);
7177
7178   contents = (bfd_byte *) bfd_alloc (abfd, size);
7179
7180   BFD_ASSERT (s->size == size);
7181   s->contents = contents;
7182 }
7183
7184 bfd_boolean
7185 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
7186 {
7187   struct elf32_arm_link_hash_table * globals;
7188
7189   globals = elf32_arm_hash_table (info);
7190   BFD_ASSERT (globals != NULL);
7191
7192   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
7193                                    globals->arm_glue_size,
7194                                    ARM2THUMB_GLUE_SECTION_NAME);
7195
7196   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
7197                                    globals->thumb_glue_size,
7198                                    THUMB2ARM_GLUE_SECTION_NAME);
7199
7200   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
7201                                    globals->vfp11_erratum_glue_size,
7202                                    VFP11_ERRATUM_VENEER_SECTION_NAME);
7203
7204   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
7205                                    globals->stm32l4xx_erratum_glue_size,
7206                                    STM32L4XX_ERRATUM_VENEER_SECTION_NAME);
7207
7208   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
7209                                    globals->bx_glue_size,
7210                                    ARM_BX_GLUE_SECTION_NAME);
7211
7212   return TRUE;
7213 }
7214
7215 /* Allocate space and symbols for calling a Thumb function from Arm mode.
7216    returns the symbol identifying the stub.  */
7217
7218 static struct elf_link_hash_entry *
7219 record_arm_to_thumb_glue (struct bfd_link_info * link_info,
7220                           struct elf_link_hash_entry * h)
7221 {
7222   const char * name = h->root.root.string;
7223   asection * s;
7224   char * tmp_name;
7225   struct elf_link_hash_entry * myh;
7226   struct bfd_link_hash_entry * bh;
7227   struct elf32_arm_link_hash_table * globals;
7228   bfd_vma val;
7229   bfd_size_type size;
7230
7231   globals = elf32_arm_hash_table (link_info);
7232   BFD_ASSERT (globals != NULL);
7233   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
7234
7235   s = bfd_get_linker_section
7236     (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
7237
7238   BFD_ASSERT (s != NULL);
7239
7240   tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen (name)
7241                                   + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
7242
7243   BFD_ASSERT (tmp_name);
7244
7245   sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
7246
7247   myh = elf_link_hash_lookup
7248     (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
7249
7250   if (myh != NULL)
7251     {
7252       /* We've already seen this guy.  */
7253       free (tmp_name);
7254       return myh;
7255     }
7256
7257   /* The only trick here is using hash_table->arm_glue_size as the value.
7258      Even though the section isn't allocated yet, this is where we will be
7259      putting it.  The +1 on the value marks that the stub has not been
7260      output yet - not that it is a Thumb function.  */
7261   bh = NULL;
7262   val = globals->arm_glue_size + 1;
7263   _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
7264                                     tmp_name, BSF_GLOBAL, s, val,
7265                                     NULL, TRUE, FALSE, &bh);
7266
7267   myh = (struct elf_link_hash_entry *) bh;
7268   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7269   myh->forced_local = 1;
7270
7271   free (tmp_name);
7272
7273   if (bfd_link_pic (link_info)
7274       || globals->root.is_relocatable_executable
7275       || globals->pic_veneer)
7276     size = ARM2THUMB_PIC_GLUE_SIZE;
7277   else if (globals->use_blx)
7278     size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
7279   else
7280     size = ARM2THUMB_STATIC_GLUE_SIZE;
7281
7282   s->size += size;
7283   globals->arm_glue_size += size;
7284
7285   return myh;
7286 }
7287
7288 /* Allocate space for ARMv4 BX veneers.  */
7289
7290 static void
7291 record_arm_bx_glue (struct bfd_link_info * link_info, int reg)
7292 {
7293   asection * s;
7294   struct elf32_arm_link_hash_table *globals;
7295   char *tmp_name;
7296   struct elf_link_hash_entry *myh;
7297   struct bfd_link_hash_entry *bh;
7298   bfd_vma val;
7299
7300   /* BX PC does not need a veneer.  */
7301   if (reg == 15)
7302     return;
7303
7304   globals = elf32_arm_hash_table (link_info);
7305   BFD_ASSERT (globals != NULL);
7306   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
7307
7308   /* Check if this veneer has already been allocated.  */
7309   if (globals->bx_glue_offset[reg])
7310     return;
7311
7312   s = bfd_get_linker_section
7313     (globals->bfd_of_glue_owner, ARM_BX_GLUE_SECTION_NAME);
7314
7315   BFD_ASSERT (s != NULL);
7316
7317   /* Add symbol for veneer.  */
7318   tmp_name = (char *)
7319       bfd_malloc ((bfd_size_type) strlen (ARM_BX_GLUE_ENTRY_NAME) + 1);
7320
7321   BFD_ASSERT (tmp_name);
7322
7323   sprintf (tmp_name, ARM_BX_GLUE_ENTRY_NAME, reg);
7324
7325   myh = elf_link_hash_lookup
7326     (&(globals)->root, tmp_name, FALSE, FALSE, FALSE);
7327
7328   BFD_ASSERT (myh == NULL);
7329
7330   bh = NULL;
7331   val = globals->bx_glue_size;
7332   _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
7333                                     tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
7334                                     NULL, TRUE, FALSE, &bh);
7335
7336   myh = (struct elf_link_hash_entry *) bh;
7337   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7338   myh->forced_local = 1;
7339
7340   s->size += ARM_BX_VENEER_SIZE;
7341   globals->bx_glue_offset[reg] = globals->bx_glue_size | 2;
7342   globals->bx_glue_size += ARM_BX_VENEER_SIZE;
7343 }
7344
7345
7346 /* Add an entry to the code/data map for section SEC.  */
7347
7348 static void
7349 elf32_arm_section_map_add (asection *sec, char type, bfd_vma vma)
7350 {
7351   struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
7352   unsigned int newidx;
7353
7354   if (sec_data->map == NULL)
7355     {
7356       sec_data->map = (elf32_arm_section_map *)
7357           bfd_malloc (sizeof (elf32_arm_section_map));
7358       sec_data->mapcount = 0;
7359       sec_data->mapsize = 1;
7360     }
7361
7362   newidx = sec_data->mapcount++;
7363
7364   if (sec_data->mapcount > sec_data->mapsize)
7365     {
7366       sec_data->mapsize *= 2;
7367       sec_data->map = (elf32_arm_section_map *)
7368           bfd_realloc_or_free (sec_data->map, sec_data->mapsize
7369                                * sizeof (elf32_arm_section_map));
7370     }
7371
7372   if (sec_data->map)
7373     {
7374       sec_data->map[newidx].vma = vma;
7375       sec_data->map[newidx].type = type;
7376     }
7377 }
7378
7379
7380 /* Record information about a VFP11 denorm-erratum veneer.  Only ARM-mode
7381    veneers are handled for now.  */
7382
7383 static bfd_vma
7384 record_vfp11_erratum_veneer (struct bfd_link_info *link_info,
7385                              elf32_vfp11_erratum_list *branch,
7386                              bfd *branch_bfd,
7387                              asection *branch_sec,
7388                              unsigned int offset)
7389 {
7390   asection *s;
7391   struct elf32_arm_link_hash_table *hash_table;
7392   char *tmp_name;
7393   struct elf_link_hash_entry *myh;
7394   struct bfd_link_hash_entry *bh;
7395   bfd_vma val;
7396   struct _arm_elf_section_data *sec_data;
7397   elf32_vfp11_erratum_list *newerr;
7398
7399   hash_table = elf32_arm_hash_table (link_info);
7400   BFD_ASSERT (hash_table != NULL);
7401   BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
7402
7403   s = bfd_get_linker_section
7404     (hash_table->bfd_of_glue_owner, VFP11_ERRATUM_VENEER_SECTION_NAME);
7405
7406   sec_data = elf32_arm_section_data (s);
7407
7408   BFD_ASSERT (s != NULL);
7409
7410   tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen
7411                                   (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
7412
7413   BFD_ASSERT (tmp_name);
7414
7415   sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
7416            hash_table->num_vfp11_fixes);
7417
7418   myh = elf_link_hash_lookup
7419     (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
7420
7421   BFD_ASSERT (myh == NULL);
7422
7423   bh = NULL;
7424   val = hash_table->vfp11_erratum_glue_size;
7425   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
7426                                     tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
7427                                     NULL, TRUE, FALSE, &bh);
7428
7429   myh = (struct elf_link_hash_entry *) bh;
7430   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7431   myh->forced_local = 1;
7432
7433   /* Link veneer back to calling location.  */
7434   sec_data->erratumcount += 1;
7435   newerr = (elf32_vfp11_erratum_list *)
7436       bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
7437
7438   newerr->type = VFP11_ERRATUM_ARM_VENEER;
7439   newerr->vma = -1;
7440   newerr->u.v.branch = branch;
7441   newerr->u.v.id = hash_table->num_vfp11_fixes;
7442   branch->u.b.veneer = newerr;
7443
7444   newerr->next = sec_data->erratumlist;
7445   sec_data->erratumlist = newerr;
7446
7447   /* A symbol for the return from the veneer.  */
7448   sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
7449            hash_table->num_vfp11_fixes);
7450
7451   myh = elf_link_hash_lookup
7452     (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
7453
7454   if (myh != NULL)
7455     abort ();
7456
7457   bh = NULL;
7458   val = offset + 4;
7459   _bfd_generic_link_add_one_symbol (link_info, branch_bfd, tmp_name, BSF_LOCAL,
7460                                     branch_sec, val, NULL, TRUE, FALSE, &bh);
7461
7462   myh = (struct elf_link_hash_entry *) bh;
7463   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7464   myh->forced_local = 1;
7465
7466   free (tmp_name);
7467
7468   /* Generate a mapping symbol for the veneer section, and explicitly add an
7469      entry for that symbol to the code/data map for the section.  */
7470   if (hash_table->vfp11_erratum_glue_size == 0)
7471     {
7472       bh = NULL;
7473       /* FIXME: Creates an ARM symbol.  Thumb mode will need attention if it
7474          ever requires this erratum fix.  */
7475       _bfd_generic_link_add_one_symbol (link_info,
7476                                         hash_table->bfd_of_glue_owner, "$a",
7477                                         BSF_LOCAL, s, 0, NULL,
7478                                         TRUE, FALSE, &bh);
7479
7480       myh = (struct elf_link_hash_entry *) bh;
7481       myh->type = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
7482       myh->forced_local = 1;
7483
7484       /* The elf32_arm_init_maps function only cares about symbols from input
7485          BFDs.  We must make a note of this generated mapping symbol
7486          ourselves so that code byteswapping works properly in
7487          elf32_arm_write_section.  */
7488       elf32_arm_section_map_add (s, 'a', 0);
7489     }
7490
7491   s->size += VFP11_ERRATUM_VENEER_SIZE;
7492   hash_table->vfp11_erratum_glue_size += VFP11_ERRATUM_VENEER_SIZE;
7493   hash_table->num_vfp11_fixes++;
7494
7495   /* The offset of the veneer.  */
7496   return val;
7497 }
7498
7499 /* Record information about a STM32L4XX STM erratum veneer.  Only THUMB-mode
7500    veneers need to be handled because used only in Cortex-M.  */
7501
7502 static bfd_vma
7503 record_stm32l4xx_erratum_veneer (struct bfd_link_info *link_info,
7504                                  elf32_stm32l4xx_erratum_list *branch,
7505                                  bfd *branch_bfd,
7506                                  asection *branch_sec,
7507                                  unsigned int offset,
7508                                  bfd_size_type veneer_size)
7509 {
7510   asection *s;
7511   struct elf32_arm_link_hash_table *hash_table;
7512   char *tmp_name;
7513   struct elf_link_hash_entry *myh;
7514   struct bfd_link_hash_entry *bh;
7515   bfd_vma val;
7516   struct _arm_elf_section_data *sec_data;
7517   elf32_stm32l4xx_erratum_list *newerr;
7518
7519   hash_table = elf32_arm_hash_table (link_info);
7520   BFD_ASSERT (hash_table != NULL);
7521   BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
7522
7523   s = bfd_get_linker_section
7524     (hash_table->bfd_of_glue_owner, STM32L4XX_ERRATUM_VENEER_SECTION_NAME);
7525
7526   BFD_ASSERT (s != NULL);
7527
7528   sec_data = elf32_arm_section_data (s);
7529
7530   tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen
7531                                   (STM32L4XX_ERRATUM_VENEER_ENTRY_NAME) + 10);
7532
7533   BFD_ASSERT (tmp_name);
7534
7535   sprintf (tmp_name, STM32L4XX_ERRATUM_VENEER_ENTRY_NAME,
7536            hash_table->num_stm32l4xx_fixes);
7537
7538   myh = elf_link_hash_lookup
7539     (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
7540
7541   BFD_ASSERT (myh == NULL);
7542
7543   bh = NULL;
7544   val = hash_table->stm32l4xx_erratum_glue_size;
7545   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
7546                                     tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
7547                                     NULL, TRUE, FALSE, &bh);
7548
7549   myh = (struct elf_link_hash_entry *) bh;
7550   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7551   myh->forced_local = 1;
7552
7553   /* Link veneer back to calling location.  */
7554   sec_data->stm32l4xx_erratumcount += 1;
7555   newerr = (elf32_stm32l4xx_erratum_list *)
7556       bfd_zmalloc (sizeof (elf32_stm32l4xx_erratum_list));
7557
7558   newerr->type = STM32L4XX_ERRATUM_VENEER;
7559   newerr->vma = -1;
7560   newerr->u.v.branch = branch;
7561   newerr->u.v.id = hash_table->num_stm32l4xx_fixes;
7562   branch->u.b.veneer = newerr;
7563
7564   newerr->next = sec_data->stm32l4xx_erratumlist;
7565   sec_data->stm32l4xx_erratumlist = newerr;
7566
7567   /* A symbol for the return from the veneer.  */
7568   sprintf (tmp_name, STM32L4XX_ERRATUM_VENEER_ENTRY_NAME "_r",
7569            hash_table->num_stm32l4xx_fixes);
7570
7571   myh = elf_link_hash_lookup
7572     (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
7573
7574   if (myh != NULL)
7575     abort ();
7576
7577   bh = NULL;
7578   val = offset + 4;
7579   _bfd_generic_link_add_one_symbol (link_info, branch_bfd, tmp_name, BSF_LOCAL,
7580                                     branch_sec, val, NULL, TRUE, FALSE, &bh);
7581
7582   myh = (struct elf_link_hash_entry *) bh;
7583   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7584   myh->forced_local = 1;
7585
7586   free (tmp_name);
7587
7588   /* Generate a mapping symbol for the veneer section, and explicitly add an
7589      entry for that symbol to the code/data map for the section.  */
7590   if (hash_table->stm32l4xx_erratum_glue_size == 0)
7591     {
7592       bh = NULL;
7593       /* Creates a THUMB symbol since there is no other choice.  */
7594       _bfd_generic_link_add_one_symbol (link_info,
7595                                         hash_table->bfd_of_glue_owner, "$t",
7596                                         BSF_LOCAL, s, 0, NULL,
7597                                         TRUE, FALSE, &bh);
7598
7599       myh = (struct elf_link_hash_entry *) bh;
7600       myh->type = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
7601       myh->forced_local = 1;
7602
7603       /* The elf32_arm_init_maps function only cares about symbols from input
7604          BFDs.  We must make a note of this generated mapping symbol
7605          ourselves so that code byteswapping works properly in
7606          elf32_arm_write_section.  */
7607       elf32_arm_section_map_add (s, 't', 0);
7608     }
7609
7610   s->size += veneer_size;
7611   hash_table->stm32l4xx_erratum_glue_size += veneer_size;
7612   hash_table->num_stm32l4xx_fixes++;
7613
7614   /* The offset of the veneer.  */
7615   return val;
7616 }
7617
7618 #define ARM_GLUE_SECTION_FLAGS \
7619   (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE \
7620    | SEC_READONLY | SEC_LINKER_CREATED)
7621
7622 /* Create a fake section for use by the ARM backend of the linker.  */
7623
7624 static bfd_boolean
7625 arm_make_glue_section (bfd * abfd, const char * name)
7626 {
7627   asection * sec;
7628
7629   sec = bfd_get_linker_section (abfd, name);
7630   if (sec != NULL)
7631     /* Already made.  */
7632     return TRUE;
7633
7634   sec = bfd_make_section_anyway_with_flags (abfd, name, ARM_GLUE_SECTION_FLAGS);
7635
7636   if (sec == NULL
7637       || !bfd_set_section_alignment (abfd, sec, 2))
7638     return FALSE;
7639
7640   /* Set the gc mark to prevent the section from being removed by garbage
7641      collection, despite the fact that no relocs refer to this section.  */
7642   sec->gc_mark = 1;
7643
7644   return TRUE;
7645 }
7646
7647 /* Set size of .plt entries.  This function is called from the
7648    linker scripts in ld/emultempl/{armelf}.em.  */
7649
7650 void
7651 bfd_elf32_arm_use_long_plt (void)
7652 {
7653   elf32_arm_use_long_plt_entry = TRUE;
7654 }
7655
7656 /* Add the glue sections to ABFD.  This function is called from the
7657    linker scripts in ld/emultempl/{armelf}.em.  */
7658
7659 bfd_boolean
7660 bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
7661                                         struct bfd_link_info *info)
7662 {
7663   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
7664   bfd_boolean dostm32l4xx = globals
7665     && globals->stm32l4xx_fix != BFD_ARM_STM32L4XX_FIX_NONE;
7666   bfd_boolean addglue;
7667
7668   /* If we are only performing a partial
7669      link do not bother adding the glue.  */
7670   if (bfd_link_relocatable (info))
7671     return TRUE;
7672
7673   addglue = arm_make_glue_section (abfd, ARM2THUMB_GLUE_SECTION_NAME)
7674     && arm_make_glue_section (abfd, THUMB2ARM_GLUE_SECTION_NAME)
7675     && arm_make_glue_section (abfd, VFP11_ERRATUM_VENEER_SECTION_NAME)
7676     && arm_make_glue_section (abfd, ARM_BX_GLUE_SECTION_NAME);
7677
7678   if (!dostm32l4xx)
7679     return addglue;
7680
7681   return addglue
7682     && arm_make_glue_section (abfd, STM32L4XX_ERRATUM_VENEER_SECTION_NAME);
7683 }
7684
7685 /* Mark output sections of veneers needing a dedicated one with SEC_KEEP.  This
7686    ensures they are not marked for deletion by
7687    strip_excluded_output_sections () when veneers are going to be created
7688    later.  Not doing so would trigger assert on empty section size in
7689    lang_size_sections_1 ().  */
7690
7691 void
7692 bfd_elf32_arm_keep_private_stub_output_sections (struct bfd_link_info *info)
7693 {
7694   enum elf32_arm_stub_type stub_type;
7695
7696   /* If we are only performing a partial
7697      link do not bother adding the glue.  */
7698   if (bfd_link_relocatable (info))
7699     return;
7700
7701   for (stub_type = arm_stub_none + 1; stub_type < max_stub_type; stub_type++)
7702     {
7703       asection *out_sec;
7704       const char *out_sec_name;
7705
7706       if (!arm_dedicated_stub_output_section_required (stub_type))
7707         continue;
7708
7709      out_sec_name = arm_dedicated_stub_output_section_name (stub_type);
7710      out_sec = bfd_get_section_by_name (info->output_bfd, out_sec_name);
7711      if (out_sec != NULL)
7712         out_sec->flags |= SEC_KEEP;
7713     }
7714 }
7715
7716 /* Select a BFD to be used to hold the sections used by the glue code.
7717    This function is called from the linker scripts in ld/emultempl/
7718    {armelf/pe}.em.  */
7719
7720 bfd_boolean
7721 bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
7722 {
7723   struct elf32_arm_link_hash_table *globals;
7724
7725   /* If we are only performing a partial link
7726      do not bother getting a bfd to hold the glue.  */
7727   if (bfd_link_relocatable (info))
7728     return TRUE;
7729
7730   /* Make sure we don't attach the glue sections to a dynamic object.  */
7731   BFD_ASSERT (!(abfd->flags & DYNAMIC));
7732
7733   globals = elf32_arm_hash_table (info);
7734   BFD_ASSERT (globals != NULL);
7735
7736   if (globals->bfd_of_glue_owner != NULL)
7737     return TRUE;
7738
7739   /* Save the bfd for later use.  */
7740   globals->bfd_of_glue_owner = abfd;
7741
7742   return TRUE;
7743 }
7744
7745 static void
7746 check_use_blx (struct elf32_arm_link_hash_table *globals)
7747 {
7748   int cpu_arch;
7749
7750   cpu_arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
7751                                        Tag_CPU_arch);
7752
7753   if (globals->fix_arm1176)
7754     {
7755       if (cpu_arch == TAG_CPU_ARCH_V6T2 || cpu_arch > TAG_CPU_ARCH_V6K)
7756         globals->use_blx = 1;
7757     }
7758   else
7759     {
7760       if (cpu_arch > TAG_CPU_ARCH_V4T)
7761         globals->use_blx = 1;
7762     }
7763 }
7764
7765 bfd_boolean
7766 bfd_elf32_arm_process_before_allocation (bfd *abfd,
7767                                          struct bfd_link_info *link_info)
7768 {
7769   Elf_Internal_Shdr *symtab_hdr;
7770   Elf_Internal_Rela *internal_relocs = NULL;
7771   Elf_Internal_Rela *irel, *irelend;
7772   bfd_byte *contents = NULL;
7773
7774   asection *sec;
7775   struct elf32_arm_link_hash_table *globals;
7776
7777   /* If we are only performing a partial link do not bother
7778      to construct any glue.  */
7779   if (bfd_link_relocatable (link_info))
7780     return TRUE;
7781
7782   /* Here we have a bfd that is to be included on the link.  We have a
7783      hook to do reloc rummaging, before section sizes are nailed down.  */
7784   globals = elf32_arm_hash_table (link_info);
7785   BFD_ASSERT (globals != NULL);
7786
7787   check_use_blx (globals);
7788
7789   if (globals->byteswap_code && !bfd_big_endian (abfd))
7790     {
7791       _bfd_error_handler (_("%pB: BE8 images only valid in big-endian mode"),
7792                           abfd);
7793       return FALSE;
7794     }
7795
7796   /* PR 5398: If we have not decided to include any loadable sections in
7797      the output then we will not have a glue owner bfd.  This is OK, it
7798      just means that there is nothing else for us to do here.  */
7799   if (globals->bfd_of_glue_owner == NULL)
7800     return TRUE;
7801
7802   /* Rummage around all the relocs and map the glue vectors.  */
7803   sec = abfd->sections;
7804
7805   if (sec == NULL)
7806     return TRUE;
7807
7808   for (; sec != NULL; sec = sec->next)
7809     {
7810       if (sec->reloc_count == 0)
7811         continue;
7812
7813       if ((sec->flags & SEC_EXCLUDE) != 0)
7814         continue;
7815
7816       symtab_hdr = & elf_symtab_hdr (abfd);
7817
7818       /* Load the relocs.  */
7819       internal_relocs
7820         = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, FALSE);
7821
7822       if (internal_relocs == NULL)
7823         goto error_return;
7824
7825       irelend = internal_relocs + sec->reloc_count;
7826       for (irel = internal_relocs; irel < irelend; irel++)
7827         {
7828           long r_type;
7829           unsigned long r_index;
7830
7831           struct elf_link_hash_entry *h;
7832
7833           r_type = ELF32_R_TYPE (irel->r_info);
7834           r_index = ELF32_R_SYM (irel->r_info);
7835
7836           /* These are the only relocation types we care about.  */
7837           if (   r_type != R_ARM_PC24
7838               && (r_type != R_ARM_V4BX || globals->fix_v4bx < 2))
7839             continue;
7840
7841           /* Get the section contents if we haven't done so already.  */
7842           if (contents == NULL)
7843             {
7844               /* Get cached copy if it exists.  */
7845               if (elf_section_data (sec)->this_hdr.contents != NULL)
7846                 contents = elf_section_data (sec)->this_hdr.contents;
7847               else
7848                 {
7849                   /* Go get them off disk.  */
7850                   if (! bfd_malloc_and_get_section (abfd, sec, &contents))
7851                     goto error_return;
7852                 }
7853             }
7854
7855           if (r_type == R_ARM_V4BX)
7856             {
7857               int reg;
7858
7859               reg = bfd_get_32 (abfd, contents + irel->r_offset) & 0xf;
7860               record_arm_bx_glue (link_info, reg);
7861               continue;
7862             }
7863
7864           /* If the relocation is not against a symbol it cannot concern us.  */
7865           h = NULL;
7866
7867           /* We don't care about local symbols.  */
7868           if (r_index < symtab_hdr->sh_info)
7869             continue;
7870
7871           /* This is an external symbol.  */
7872           r_index -= symtab_hdr->sh_info;
7873           h = (struct elf_link_hash_entry *)
7874             elf_sym_hashes (abfd)[r_index];
7875
7876           /* If the relocation is against a static symbol it must be within
7877              the current section and so cannot be a cross ARM/Thumb relocation.  */
7878           if (h == NULL)
7879             continue;
7880
7881           /* If the call will go through a PLT entry then we do not need
7882              glue.  */
7883           if (globals->root.splt != NULL && h->plt.offset != (bfd_vma) -1)
7884             continue;
7885
7886           switch (r_type)
7887             {
7888             case R_ARM_PC24:
7889               /* This one is a call from arm code.  We need to look up
7890                  the target of the call.  If it is a thumb target, we
7891                  insert glue.  */
7892               if (ARM_GET_SYM_BRANCH_TYPE (h->target_internal)
7893                   == ST_BRANCH_TO_THUMB)
7894                 record_arm_to_thumb_glue (link_info, h);
7895               break;
7896
7897             default:
7898               abort ();
7899             }
7900         }
7901
7902       if (contents != NULL
7903           && elf_section_data (sec)->this_hdr.contents != contents)
7904         free (contents);
7905       contents = NULL;
7906
7907       if (internal_relocs != NULL
7908           && elf_section_data (sec)->relocs != internal_relocs)
7909         free (internal_relocs);
7910       internal_relocs = NULL;
7911     }
7912
7913   return TRUE;
7914
7915 error_return:
7916   if (contents != NULL
7917       && elf_section_data (sec)->this_hdr.contents != contents)
7918     free (contents);
7919   if (internal_relocs != NULL
7920       && elf_section_data (sec)->relocs != internal_relocs)
7921     free (internal_relocs);
7922
7923   return FALSE;
7924 }
7925 #endif
7926
7927
7928 /* Initialise maps of ARM/Thumb/data for input BFDs.  */
7929
7930 void
7931 bfd_elf32_arm_init_maps (bfd *abfd)
7932 {
7933   Elf_Internal_Sym *isymbuf;
7934   Elf_Internal_Shdr *hdr;
7935   unsigned int i, localsyms;
7936
7937   /* PR 7093: Make sure that we are dealing with an arm elf binary.  */
7938   if (! is_arm_elf (abfd))
7939     return;
7940
7941   if ((abfd->flags & DYNAMIC) != 0)
7942     return;
7943
7944   hdr = & elf_symtab_hdr (abfd);
7945   localsyms = hdr->sh_info;
7946
7947   /* Obtain a buffer full of symbols for this BFD. The hdr->sh_info field
7948      should contain the number of local symbols, which should come before any
7949      global symbols.  Mapping symbols are always local.  */
7950   isymbuf = bfd_elf_get_elf_syms (abfd, hdr, localsyms, 0, NULL, NULL,
7951                                   NULL);
7952
7953   /* No internal symbols read?  Skip this BFD.  */
7954   if (isymbuf == NULL)
7955     return;
7956
7957   for (i = 0; i < localsyms; i++)
7958     {
7959       Elf_Internal_Sym *isym = &isymbuf[i];
7960       asection *sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
7961       const char *name;
7962
7963       if (sec != NULL
7964           && ELF_ST_BIND (isym->st_info) == STB_LOCAL)
7965         {
7966           name = bfd_elf_string_from_elf_section (abfd,
7967             hdr->sh_link, isym->st_name);
7968
7969           if (bfd_is_arm_special_symbol_name (name,
7970                                               BFD_ARM_SPECIAL_SYM_TYPE_MAP))
7971             elf32_arm_section_map_add (sec, name[1], isym->st_value);
7972         }
7973     }
7974 }
7975
7976
7977 /* Auto-select enabling of Cortex-A8 erratum fix if the user didn't explicitly
7978    say what they wanted.  */
7979
7980 void
7981 bfd_elf32_arm_set_cortex_a8_fix (bfd *obfd, struct bfd_link_info *link_info)
7982 {
7983   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
7984   obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd);
7985
7986   if (globals == NULL)
7987     return;
7988
7989   if (globals->fix_cortex_a8 == -1)
7990     {
7991       /* Turn on Cortex-A8 erratum workaround for ARMv7-A.  */
7992       if (out_attr[Tag_CPU_arch].i == TAG_CPU_ARCH_V7
7993           && (out_attr[Tag_CPU_arch_profile].i == 'A'
7994               || out_attr[Tag_CPU_arch_profile].i == 0))
7995         globals->fix_cortex_a8 = 1;
7996       else
7997         globals->fix_cortex_a8 = 0;
7998     }
7999 }
8000
8001
8002 void
8003 bfd_elf32_arm_set_vfp11_fix (bfd *obfd, struct bfd_link_info *link_info)
8004 {
8005   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
8006   obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd);
8007
8008   if (globals == NULL)
8009     return;
8010   /* We assume that ARMv7+ does not need the VFP11 denorm erratum fix.  */
8011   if (out_attr[Tag_CPU_arch].i >= TAG_CPU_ARCH_V7)
8012     {
8013       switch (globals->vfp11_fix)
8014         {
8015         case BFD_ARM_VFP11_FIX_DEFAULT:
8016         case BFD_ARM_VFP11_FIX_NONE:
8017           globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
8018           break;
8019
8020         default:
8021           /* Give a warning, but do as the user requests anyway.  */
8022           _bfd_error_handler (_("%pB: warning: selected VFP11 erratum "
8023             "workaround is not necessary for target architecture"), obfd);
8024         }
8025     }
8026   else if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_DEFAULT)
8027     /* For earlier architectures, we might need the workaround, but do not
8028        enable it by default.  If users is running with broken hardware, they
8029        must enable the erratum fix explicitly.  */
8030     globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
8031 }
8032
8033 void
8034 bfd_elf32_arm_set_stm32l4xx_fix (bfd *obfd, struct bfd_link_info *link_info)
8035 {
8036   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
8037   obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd);
8038
8039   if (globals == NULL)
8040     return;
8041
8042   /* We assume only Cortex-M4 may require the fix.  */
8043   if (out_attr[Tag_CPU_arch].i != TAG_CPU_ARCH_V7E_M
8044       || out_attr[Tag_CPU_arch_profile].i != 'M')
8045     {
8046       if (globals->stm32l4xx_fix != BFD_ARM_STM32L4XX_FIX_NONE)
8047         /* Give a warning, but do as the user requests anyway.  */
8048         _bfd_error_handler
8049           (_("%pB: warning: selected STM32L4XX erratum "
8050              "workaround is not necessary for target architecture"), obfd);
8051     }
8052 }
8053
8054 enum bfd_arm_vfp11_pipe
8055 {
8056   VFP11_FMAC,
8057   VFP11_LS,
8058   VFP11_DS,
8059   VFP11_BAD
8060 };
8061
8062 /* Return a VFP register number.  This is encoded as RX:X for single-precision
8063    registers, or X:RX for double-precision registers, where RX is the group of
8064    four bits in the instruction encoding and X is the single extension bit.
8065    RX and X fields are specified using their lowest (starting) bit.  The return
8066    value is:
8067
8068      0...31: single-precision registers s0...s31
8069      32...63: double-precision registers d0...d31.
8070
8071    Although X should be zero for VFP11 (encoding d0...d15 only), we might
8072    encounter VFP3 instructions, so we allow the full range for DP registers.  */
8073
8074 static unsigned int
8075 bfd_arm_vfp11_regno (unsigned int insn, bfd_boolean is_double, unsigned int rx,
8076                      unsigned int x)
8077 {
8078   if (is_double)
8079     return (((insn >> rx) & 0xf) | (((insn >> x) & 1) << 4)) + 32;
8080   else
8081     return (((insn >> rx) & 0xf) << 1) | ((insn >> x) & 1);
8082 }
8083
8084 /* Set bits in *WMASK according to a register number REG as encoded by
8085    bfd_arm_vfp11_regno().  Ignore d16-d31.  */
8086
8087 static void
8088 bfd_arm_vfp11_write_mask (unsigned int *wmask, unsigned int reg)
8089 {
8090   if (reg < 32)
8091     *wmask |= 1 << reg;
8092   else if (reg < 48)
8093     *wmask |= 3 << ((reg - 32) * 2);
8094 }
8095
8096 /* Return TRUE if WMASK overwrites anything in REGS.  */
8097
8098 static bfd_boolean
8099 bfd_arm_vfp11_antidependency (unsigned int wmask, int *regs, int numregs)
8100 {
8101   int i;
8102
8103   for (i = 0; i < numregs; i++)
8104     {
8105       unsigned int reg = regs[i];
8106
8107       if (reg < 32 && (wmask & (1 << reg)) != 0)
8108         return TRUE;
8109
8110       reg -= 32;
8111
8112       if (reg >= 16)
8113         continue;
8114
8115       if ((wmask & (3 << (reg * 2))) != 0)
8116         return TRUE;
8117     }
8118
8119   return FALSE;
8120 }
8121
8122 /* In this function, we're interested in two things: finding input registers
8123    for VFP data-processing instructions, and finding the set of registers which
8124    arbitrary VFP instructions may write to.  We use a 32-bit unsigned int to
8125    hold the written set, so FLDM etc. are easy to deal with (we're only
8126    interested in 32 SP registers or 16 dp registers, due to the VFP version
8127    implemented by the chip in question).  DP registers are marked by setting
8128    both SP registers in the write mask).  */
8129
8130 static enum bfd_arm_vfp11_pipe
8131 bfd_arm_vfp11_insn_decode (unsigned int insn, unsigned int *destmask, int *regs,
8132                            int *numregs)
8133 {
8134   enum bfd_arm_vfp11_pipe vpipe = VFP11_BAD;
8135   bfd_boolean is_double = ((insn & 0xf00) == 0xb00) ? 1 : 0;
8136
8137   if ((insn & 0x0f000e10) == 0x0e000a00)  /* A data-processing insn.  */
8138     {
8139       unsigned int pqrs;
8140       unsigned int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
8141       unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
8142
8143       pqrs = ((insn & 0x00800000) >> 20)
8144            | ((insn & 0x00300000) >> 19)
8145            | ((insn & 0x00000040) >> 6);
8146
8147       switch (pqrs)
8148         {
8149         case 0: /* fmac[sd].  */
8150         case 1: /* fnmac[sd].  */
8151         case 2: /* fmsc[sd].  */
8152         case 3: /* fnmsc[sd].  */
8153           vpipe = VFP11_FMAC;
8154           bfd_arm_vfp11_write_mask (destmask, fd);
8155           regs[0] = fd;
8156           regs[1] = bfd_arm_vfp11_regno (insn, is_double, 16, 7);  /* Fn.  */
8157           regs[2] = fm;
8158           *numregs = 3;
8159           break;
8160
8161         case 4: /* fmul[sd].  */
8162         case 5: /* fnmul[sd].  */
8163         case 6: /* fadd[sd].  */
8164         case 7: /* fsub[sd].  */
8165           vpipe = VFP11_FMAC;
8166           goto vfp_binop;
8167
8168         case 8: /* fdiv[sd].  */
8169           vpipe = VFP11_DS;
8170           vfp_binop:
8171           bfd_arm_vfp11_write_mask (destmask, fd);
8172           regs[0] = bfd_arm_vfp11_regno (insn, is_double, 16, 7);   /* Fn.  */
8173           regs[1] = fm;
8174           *numregs = 2;
8175           break;
8176
8177         case 15: /* extended opcode.  */
8178           {
8179             unsigned int extn = ((insn >> 15) & 0x1e)
8180                               | ((insn >> 7) & 1);
8181
8182             switch (extn)
8183               {
8184               case 0: /* fcpy[sd].  */
8185               case 1: /* fabs[sd].  */
8186               case 2: /* fneg[sd].  */
8187               case 8: /* fcmp[sd].  */
8188               case 9: /* fcmpe[sd].  */
8189               case 10: /* fcmpz[sd].  */
8190               case 11: /* fcmpez[sd].  */
8191               case 16: /* fuito[sd].  */
8192               case 17: /* fsito[sd].  */
8193               case 24: /* ftoui[sd].  */
8194               case 25: /* ftouiz[sd].  */
8195               case 26: /* ftosi[sd].  */
8196               case 27: /* ftosiz[sd].  */
8197                 /* These instructions will not bounce due to underflow.  */
8198                 *numregs = 0;
8199                 vpipe = VFP11_FMAC;
8200                 break;
8201
8202               case 3: /* fsqrt[sd].  */
8203                 /* fsqrt cannot underflow, but it can (perhaps) overwrite
8204                    registers to cause the erratum in previous instructions.  */
8205                 bfd_arm_vfp11_write_mask (destmask, fd);
8206                 vpipe = VFP11_DS;
8207                 break;
8208
8209               case 15: /* fcvt{ds,sd}.  */
8210                 {
8211                   int rnum = 0;
8212
8213                   bfd_arm_vfp11_write_mask (destmask, fd);
8214
8215                   /* Only FCVTSD can underflow.  */
8216                   if ((insn & 0x100) != 0)
8217                     regs[rnum++] = fm;
8218
8219                   *numregs = rnum;
8220
8221                   vpipe = VFP11_FMAC;
8222                 }
8223                 break;
8224
8225               default:
8226                 return VFP11_BAD;
8227               }
8228           }
8229           break;
8230
8231         default:
8232           return VFP11_BAD;
8233         }
8234     }
8235   /* Two-register transfer.  */
8236   else if ((insn & 0x0fe00ed0) == 0x0c400a10)
8237     {
8238       unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
8239
8240       if ((insn & 0x100000) == 0)
8241         {
8242           if (is_double)
8243             bfd_arm_vfp11_write_mask (destmask, fm);
8244           else
8245             {
8246               bfd_arm_vfp11_write_mask (destmask, fm);
8247               bfd_arm_vfp11_write_mask (destmask, fm + 1);
8248             }
8249         }
8250
8251       vpipe = VFP11_LS;
8252     }
8253   else if ((insn & 0x0e100e00) == 0x0c100a00)  /* A load insn.  */
8254     {
8255       int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
8256       unsigned int puw = ((insn >> 21) & 0x1) | (((insn >> 23) & 3) << 1);
8257
8258       switch (puw)
8259         {
8260         case 0: /* Two-reg transfer.  We should catch these above.  */
8261           abort ();
8262
8263         case 2: /* fldm[sdx].  */
8264         case 3:
8265         case 5:
8266           {
8267             unsigned int i, offset = insn & 0xff;
8268
8269             if (is_double)
8270               offset >>= 1;
8271
8272             for (i = fd; i < fd + offset; i++)
8273               bfd_arm_vfp11_write_mask (destmask, i);
8274           }
8275           break;
8276
8277         case 4: /* fld[sd].  */
8278         case 6:
8279           bfd_arm_vfp11_write_mask (destmask, fd);
8280           break;
8281
8282         default:
8283           return VFP11_BAD;
8284         }
8285
8286       vpipe = VFP11_LS;
8287     }
8288   /* Single-register transfer. Note L==0.  */
8289   else if ((insn & 0x0f100e10) == 0x0e000a10)
8290     {
8291       unsigned int opcode = (insn >> 21) & 7;
8292       unsigned int fn = bfd_arm_vfp11_regno (insn, is_double, 16, 7);
8293
8294       switch (opcode)
8295         {
8296         case 0: /* fmsr/fmdlr.  */
8297         case 1: /* fmdhr.  */
8298           /* Mark fmdhr and fmdlr as writing to the whole of the DP
8299              destination register.  I don't know if this is exactly right,
8300              but it is the conservative choice.  */
8301           bfd_arm_vfp11_write_mask (destmask, fn);
8302           break;
8303
8304         case 7: /* fmxr.  */
8305           break;
8306         }
8307
8308       vpipe = VFP11_LS;
8309     }
8310
8311   return vpipe;
8312 }
8313
8314
8315 static int elf32_arm_compare_mapping (const void * a, const void * b);
8316
8317
8318 /* Look for potentially-troublesome code sequences which might trigger the
8319    VFP11 denormal/antidependency erratum.  See, e.g., the ARM1136 errata sheet
8320    (available from ARM) for details of the erratum.  A short version is
8321    described in ld.texinfo.  */
8322
8323 bfd_boolean
8324 bfd_elf32_arm_vfp11_erratum_scan (bfd *abfd, struct bfd_link_info *link_info)
8325 {
8326   asection *sec;
8327   bfd_byte *contents = NULL;
8328   int state = 0;
8329   int regs[3], numregs = 0;
8330   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
8331   int use_vector = (globals->vfp11_fix == BFD_ARM_VFP11_FIX_VECTOR);
8332
8333   if (globals == NULL)
8334     return FALSE;
8335
8336   /* We use a simple FSM to match troublesome VFP11 instruction sequences.
8337      The states transition as follows:
8338
8339        0 -> 1 (vector) or 0 -> 2 (scalar)
8340            A VFP FMAC-pipeline instruction has been seen. Fill
8341            regs[0]..regs[numregs-1] with its input operands. Remember this
8342            instruction in 'first_fmac'.
8343
8344        1 -> 2
8345            Any instruction, except for a VFP instruction which overwrites
8346            regs[*].
8347
8348        1 -> 3 [ -> 0 ]  or
8349        2 -> 3 [ -> 0 ]
8350            A VFP instruction has been seen which overwrites any of regs[*].
8351            We must make a veneer!  Reset state to 0 before examining next
8352            instruction.
8353
8354        2 -> 0
8355            If we fail to match anything in state 2, reset to state 0 and reset
8356            the instruction pointer to the instruction after 'first_fmac'.
8357
8358      If the VFP11 vector mode is in use, there must be at least two unrelated
8359      instructions between anti-dependent VFP11 instructions to properly avoid
8360      triggering the erratum, hence the use of the extra state 1.  */
8361
8362   /* If we are only performing a partial link do not bother
8363      to construct any glue.  */
8364   if (bfd_link_relocatable (link_info))
8365     return TRUE;
8366
8367   /* Skip if this bfd does not correspond to an ELF image.  */
8368   if (! is_arm_elf (abfd))
8369     return TRUE;
8370
8371   /* We should have chosen a fix type by the time we get here.  */
8372   BFD_ASSERT (globals->vfp11_fix != BFD_ARM_VFP11_FIX_DEFAULT);
8373
8374   if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_NONE)
8375     return TRUE;
8376
8377   /* Skip this BFD if it corresponds to an executable or dynamic object.  */
8378   if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
8379     return TRUE;
8380
8381   for (sec = abfd->sections; sec != NULL; sec = sec->next)
8382     {
8383       unsigned int i, span, first_fmac = 0, veneer_of_insn = 0;
8384       struct _arm_elf_section_data *sec_data;
8385
8386       /* If we don't have executable progbits, we're not interested in this
8387          section.  Also skip if section is to be excluded.  */
8388       if (elf_section_type (sec) != SHT_PROGBITS
8389           || (elf_section_flags (sec) & SHF_EXECINSTR) == 0
8390           || (sec->flags & SEC_EXCLUDE) != 0
8391           || sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8392           || sec->output_section == bfd_abs_section_ptr
8393           || strcmp (sec->name, VFP11_ERRATUM_VENEER_SECTION_NAME) == 0)
8394         continue;
8395
8396       sec_data = elf32_arm_section_data (sec);
8397
8398       if (sec_data->mapcount == 0)
8399         continue;
8400
8401       if (elf_section_data (sec)->this_hdr.contents != NULL)
8402         contents = elf_section_data (sec)->this_hdr.contents;
8403       else if (! bfd_malloc_and_get_section (abfd, sec, &contents))
8404         goto error_return;
8405
8406       qsort (sec_data->map, sec_data->mapcount, sizeof (elf32_arm_section_map),
8407              elf32_arm_compare_mapping);
8408
8409       for (span = 0; span < sec_data->mapcount; span++)
8410         {
8411           unsigned int span_start = sec_data->map[span].vma;
8412           unsigned int span_end = (span == sec_data->mapcount - 1)
8413                                   ? sec->size : sec_data->map[span + 1].vma;
8414           char span_type = sec_data->map[span].type;
8415
8416           /* FIXME: Only ARM mode is supported at present.  We may need to
8417              support Thumb-2 mode also at some point.  */
8418           if (span_type != 'a')
8419             continue;
8420
8421           for (i = span_start; i < span_end;)
8422             {
8423               unsigned int next_i = i + 4;
8424               unsigned int insn = bfd_big_endian (abfd)
8425                 ? (contents[i] << 24)
8426                   | (contents[i + 1] << 16)
8427                   | (contents[i + 2] << 8)
8428                   | contents[i + 3]
8429                 : (contents[i + 3] << 24)
8430                   | (contents[i + 2] << 16)
8431                   | (contents[i + 1] << 8)
8432                   | contents[i];
8433               unsigned int writemask = 0;
8434               enum bfd_arm_vfp11_pipe vpipe;
8435
8436               switch (state)
8437                 {
8438                 case 0:
8439                   vpipe = bfd_arm_vfp11_insn_decode (insn, &writemask, regs,
8440                                                     &numregs);
8441                   /* I'm assuming the VFP11 erratum can trigger with denorm
8442                      operands on either the FMAC or the DS pipeline. This might
8443                      lead to slightly overenthusiastic veneer insertion.  */
8444                   if (vpipe == VFP11_FMAC || vpipe == VFP11_DS)
8445                     {
8446                       state = use_vector ? 1 : 2;
8447                       first_fmac = i;
8448                       veneer_of_insn = insn;
8449                     }
8450                   break;
8451
8452                 case 1:
8453                   {
8454                     int other_regs[3], other_numregs;
8455                     vpipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
8456                                                       other_regs,
8457                                                       &other_numregs);
8458                     if (vpipe != VFP11_BAD
8459                         && bfd_arm_vfp11_antidependency (writemask, regs,
8460                                                          numregs))
8461                       state = 3;
8462                     else
8463                       state = 2;
8464                   }
8465                   break;
8466
8467                 case 2:
8468                   {
8469                     int other_regs[3], other_numregs;
8470                     vpipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
8471                                                       other_regs,
8472                                                       &other_numregs);
8473                     if (vpipe != VFP11_BAD
8474                         && bfd_arm_vfp11_antidependency (writemask, regs,
8475                                                          numregs))
8476                       state = 3;
8477                     else
8478                       {
8479                         state = 0;
8480                         next_i = first_fmac + 4;
8481                       }
8482                   }
8483                   break;
8484
8485                 case 3:
8486                   abort ();  /* Should be unreachable.  */
8487                 }
8488
8489               if (state == 3)
8490                 {
8491                   elf32_vfp11_erratum_list *newerr =(elf32_vfp11_erratum_list *)
8492                       bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
8493
8494                   elf32_arm_section_data (sec)->erratumcount += 1;
8495
8496                   newerr->u.b.vfp_insn = veneer_of_insn;
8497
8498                   switch (span_type)
8499                     {
8500                     case 'a':
8501                       newerr->type = VFP11_ERRATUM_BRANCH_TO_ARM_VENEER;
8502                       break;
8503
8504                     default:
8505                       abort ();
8506                     }
8507
8508                   record_vfp11_erratum_veneer (link_info, newerr, abfd, sec,
8509                                                first_fmac);
8510
8511                   newerr->vma = -1;
8512
8513                   newerr->next = sec_data->erratumlist;
8514                   sec_data->erratumlist = newerr;
8515
8516                   state = 0;
8517                 }
8518
8519               i = next_i;
8520             }
8521         }
8522
8523       if (contents != NULL
8524           && elf_section_data (sec)->this_hdr.contents != contents)
8525         free (contents);
8526       contents = NULL;
8527     }
8528
8529   return TRUE;
8530
8531 error_return:
8532   if (contents != NULL
8533       && elf_section_data (sec)->this_hdr.contents != contents)
8534     free (contents);
8535
8536   return FALSE;
8537 }
8538
8539 /* Find virtual-memory addresses for VFP11 erratum veneers and return locations
8540    after sections have been laid out, using specially-named symbols.  */
8541
8542 void
8543 bfd_elf32_arm_vfp11_fix_veneer_locations (bfd *abfd,
8544                                           struct bfd_link_info *link_info)
8545 {
8546   asection *sec;
8547   struct elf32_arm_link_hash_table *globals;
8548   char *tmp_name;
8549
8550   if (bfd_link_relocatable (link_info))
8551     return;
8552
8553   /* Skip if this bfd does not correspond to an ELF image.  */
8554   if (! is_arm_elf (abfd))
8555     return;
8556
8557   globals = elf32_arm_hash_table (link_info);
8558   if (globals == NULL)
8559     return;
8560
8561   tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen
8562                                   (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
8563
8564   for (sec = abfd->sections; sec != NULL; sec = sec->next)
8565     {
8566       struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
8567       elf32_vfp11_erratum_list *errnode = sec_data->erratumlist;
8568
8569       for (; errnode != NULL; errnode = errnode->next)
8570         {
8571           struct elf_link_hash_entry *myh;
8572           bfd_vma vma;
8573
8574           switch (errnode->type)
8575             {
8576             case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
8577             case VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER:
8578               /* Find veneer symbol.  */
8579               sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
8580                        errnode->u.b.veneer->u.v.id);
8581
8582               myh = elf_link_hash_lookup
8583                 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
8584
8585               if (myh == NULL)
8586                 _bfd_error_handler (_("%pB: unable to find %s veneer `%s'"),
8587                                     abfd, "VFP11", tmp_name);
8588
8589               vma = myh->root.u.def.section->output_section->vma
8590                     + myh->root.u.def.section->output_offset
8591                     + myh->root.u.def.value;
8592
8593               errnode->u.b.veneer->vma = vma;
8594               break;
8595
8596             case VFP11_ERRATUM_ARM_VENEER:
8597             case VFP11_ERRATUM_THUMB_VENEER:
8598               /* Find return location.  */
8599               sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
8600                        errnode->u.v.id);
8601
8602               myh = elf_link_hash_lookup
8603                 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
8604
8605               if (myh == NULL)
8606                 _bfd_error_handler (_("%pB: unable to find %s veneer `%s'"),
8607                                     abfd, "VFP11", tmp_name);
8608
8609               vma = myh->root.u.def.section->output_section->vma
8610                     + myh->root.u.def.section->output_offset
8611                     + myh->root.u.def.value;
8612
8613               errnode->u.v.branch->vma = vma;
8614               break;
8615
8616             default:
8617               abort ();
8618             }
8619         }
8620     }
8621
8622   free (tmp_name);
8623 }
8624
8625 /* Find virtual-memory addresses for STM32L4XX erratum veneers and
8626    return locations after sections have been laid out, using
8627    specially-named symbols.  */
8628
8629 void
8630 bfd_elf32_arm_stm32l4xx_fix_veneer_locations (bfd *abfd,
8631                                               struct bfd_link_info *link_info)
8632 {
8633   asection *sec;
8634   struct elf32_arm_link_hash_table *globals;
8635   char *tmp_name;
8636
8637   if (bfd_link_relocatable (link_info))
8638     return;
8639
8640   /* Skip if this bfd does not correspond to an ELF image.  */
8641   if (! is_arm_elf (abfd))
8642     return;
8643
8644   globals = elf32_arm_hash_table (link_info);
8645   if (globals == NULL)
8646     return;
8647
8648   tmp_name = (char *) bfd_malloc ((bfd_size_type) strlen
8649                                   (STM32L4XX_ERRATUM_VENEER_ENTRY_NAME) + 10);
8650
8651   for (sec = abfd->sections; sec != NULL; sec = sec->next)
8652     {
8653       struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
8654       elf32_stm32l4xx_erratum_list *errnode = sec_data->stm32l4xx_erratumlist;
8655
8656       for (; errnode != NULL; errnode = errnode->next)
8657         {
8658           struct elf_link_hash_entry *myh;
8659           bfd_vma vma;
8660
8661           switch (errnode->type)
8662             {
8663             case STM32L4XX_ERRATUM_BRANCH_TO_VENEER:
8664               /* Find veneer symbol.  */
8665               sprintf (tmp_name, STM32L4XX_ERRATUM_VENEER_ENTRY_NAME,
8666                        errnode->u.b.veneer->u.v.id);
8667
8668               myh = elf_link_hash_lookup
8669                 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
8670
8671               if (myh == NULL)
8672                 _bfd_error_handler (_("%pB: unable to find %s veneer `%s'"),
8673                                     abfd, "STM32L4XX", tmp_name);
8674
8675               vma = myh->root.u.def.section->output_section->vma
8676                 + myh->root.u.def.section->output_offset
8677                 + myh->root.u.def.value;
8678
8679               errnode->u.b.veneer->vma = vma;
8680               break;
8681
8682             case STM32L4XX_ERRATUM_VENEER:
8683               /* Find return location.  */
8684               sprintf (tmp_name, STM32L4XX_ERRATUM_VENEER_ENTRY_NAME "_r",
8685                        errnode->u.v.id);
8686
8687               myh = elf_link_hash_lookup
8688                 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
8689
8690               if (myh == NULL)
8691                 _bfd_error_handler (_("%pB: unable to find %s veneer `%s'"),
8692                                     abfd, "STM32L4XX", tmp_name);
8693
8694               vma = myh->root.u.def.section->output_section->vma
8695                 + myh->root.u.def.section->output_offset
8696                 + myh->root.u.def.value;
8697
8698               errnode->u.v.branch->vma = vma;
8699               break;
8700
8701             default:
8702               abort ();
8703             }
8704         }
8705     }
8706
8707   free (tmp_name);
8708 }
8709
8710 static inline bfd_boolean
8711 is_thumb2_ldmia (const insn32 insn)
8712 {
8713   /* Encoding T2: LDM<c>.W <Rn>{!},<registers>
8714      1110 - 1000 - 10W1 - rrrr - PM (0) l - llll - llll - llll.  */
8715   return (insn & 0xffd02000) == 0xe8900000;
8716 }
8717
8718 static inline bfd_boolean
8719 is_thumb2_ldmdb (const insn32 insn)
8720 {
8721   /* Encoding T1: LDMDB<c> <Rn>{!},<registers>
8722      1110 - 1001 - 00W1 - rrrr - PM (0) l - llll - llll - llll.  */
8723   return (insn & 0xffd02000) == 0xe9100000;
8724 }
8725
8726 static inline bfd_boolean
8727 is_thumb2_vldm (const insn32 insn)
8728 {
8729   /* A6.5 Extension register load or store instruction
8730      A7.7.229
8731      We look for SP 32-bit and DP 64-bit registers.
8732      Encoding T1 VLDM{mode}<c> <Rn>{!}, <list>
8733      <list> is consecutive 64-bit registers
8734      1110 - 110P - UDW1 - rrrr - vvvv - 1011 - iiii - iiii
8735      Encoding T2 VLDM{mode}<c> <Rn>{!}, <list>
8736      <list> is consecutive 32-bit registers
8737      1110 - 110P - UDW1 - rrrr - vvvv - 1010 - iiii - iiii
8738      if P==0 && U==1 && W==1 && Rn=1101 VPOP
8739      if PUW=010 || PUW=011 || PUW=101 VLDM.  */
8740   return
8741     (((insn & 0xfe100f00) == 0xec100b00) ||
8742      ((insn & 0xfe100f00) == 0xec100a00))
8743     && /* (IA without !).  */
8744     (((((insn << 7) >> 28) & 0xd) == 0x4)
8745      /* (IA with !), includes VPOP (when reg number is SP).  */
8746      || ((((insn << 7) >> 28) & 0xd) == 0x5)
8747      /* (DB with !).  */
8748      || ((((insn << 7) >> 28) & 0xd) == 0x9));
8749 }
8750
8751 /* STM STM32L4XX erratum : This function assumes that it receives an LDM or
8752    VLDM opcode and:
8753  - computes the number and the mode of memory accesses
8754  - decides if the replacement should be done:
8755    . replaces only if > 8-word accesses
8756    . or (testing purposes only) replaces all accesses.  */
8757
8758 static bfd_boolean
8759 stm32l4xx_need_create_replacing_stub (const insn32 insn,
8760                                       bfd_arm_stm32l4xx_fix stm32l4xx_fix)
8761 {
8762   int nb_words = 0;
8763
8764   /* The field encoding the register list is the same for both LDMIA
8765      and LDMDB encodings.  */
8766   if (is_thumb2_ldmia (insn) || is_thumb2_ldmdb (insn))
8767     nb_words = elf32_arm_popcount (insn & 0x0000ffff);
8768   else if (is_thumb2_vldm (insn))
8769    nb_words = (insn & 0xff);
8770
8771   /* DEFAULT mode accounts for the real bug condition situation,
8772      ALL mode inserts stubs for each LDM/VLDM instruction (testing).  */
8773   return
8774     (stm32l4xx_fix == BFD_ARM_STM32L4XX_FIX_DEFAULT) ? nb_words > 8 :
8775     (stm32l4xx_fix == BFD_ARM_STM32L4XX_FIX_ALL) ? TRUE : FALSE;
8776 }
8777
8778 /* Look for potentially-troublesome code sequences which might trigger
8779    the STM STM32L4XX erratum.  */
8780
8781 bfd_boolean
8782 bfd_elf32_arm_stm32l4xx_erratum_scan (bfd *abfd,
8783                                       struct bfd_link_info *link_info)
8784 {
8785   asection *sec;
8786   bfd_byte *contents = NULL;
8787   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
8788
8789   if (globals == NULL)
8790     return FALSE;
8791
8792   /* If we are only performing a partial link do not bother
8793      to construct any glue.  */
8794   if (bfd_link_relocatable (link_info))
8795     return TRUE;
8796
8797   /* Skip if this bfd does not correspond to an ELF image.  */
8798   if (! is_arm_elf (abfd))
8799     return TRUE;
8800
8801   if (globals->stm32l4xx_fix == BFD_ARM_STM32L4XX_FIX_NONE)
8802     return TRUE;
8803
8804   /* Skip this BFD if it corresponds to an executable or dynamic object.  */
8805   if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
8806     return TRUE;
8807
8808   for (sec = abfd->sections; sec != NULL; sec = sec->next)
8809     {
8810       unsigned int i, span;
8811       struct _arm_elf_section_data *sec_data;
8812
8813       /* If we don't have executable progbits, we're not interested in this
8814          section.  Also skip if section is to be excluded.  */
8815       if (elf_section_type (sec) != SHT_PROGBITS
8816           || (elf_section_flags (sec) & SHF_EXECINSTR) == 0
8817           || (sec->flags & SEC_EXCLUDE) != 0
8818           || sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8819           || sec->output_section == bfd_abs_section_ptr
8820           || strcmp (sec->name, STM32L4XX_ERRATUM_VENEER_SECTION_NAME) == 0)
8821         continue;
8822
8823       sec_data = elf32_arm_section_data (sec);
8824
8825       if (sec_data->mapcount == 0)
8826         continue;
8827
8828       if (elf_section_data (sec)->this_hdr.contents != NULL)
8829         contents = elf_section_data (sec)->this_hdr.contents;
8830       else if (! bfd_malloc_and_get_section (abfd, sec, &contents))
8831         goto error_return;
8832
8833       qsort (sec_data->map, sec_data->mapcount, sizeof (elf32_arm_section_map),
8834              elf32_arm_compare_mapping);
8835
8836       for (span = 0; span < sec_data->mapcount; span++)
8837         {
8838           unsigned int span_start = sec_data->map[span].vma;
8839           unsigned int span_end = (span == sec_data->mapcount - 1)
8840             ? sec->size : sec_data->map[span + 1].vma;
8841           char span_type = sec_data->map[span].type;
8842           int itblock_current_pos = 0;
8843
8844           /* Only Thumb2 mode need be supported with this CM4 specific
8845              code, we should not encounter any arm mode eg span_type
8846              != 'a'.  */
8847           if (span_type != 't')
8848             continue;
8849
8850           for (i = span_start; i < span_end;)
8851             {
8852               unsigned int insn = bfd_get_16 (abfd, &contents[i]);
8853               bfd_boolean insn_32bit = FALSE;
8854               bfd_boolean is_ldm = FALSE;
8855               bfd_boolean is_vldm = FALSE;
8856               bfd_boolean is_not_last_in_it_block = FALSE;
8857
8858               /* The first 16-bits of all 32-bit thumb2 instructions start
8859                  with opcode[15..13]=0b111 and the encoded op1 can be anything
8860                  except opcode[12..11]!=0b00.
8861                  See 32-bit Thumb instruction encoding.  */
8862               if ((insn & 0xe000) == 0xe000 && (insn & 0x1800) != 0x0000)
8863                 insn_32bit = TRUE;
8864
8865               /* Compute the predicate that tells if the instruction
8866                  is concerned by the IT block
8867                  - Creates an error if there is a ldm that is not
8868                    last in the IT block thus cannot be replaced
8869                  - Otherwise we can create a branch at the end of the
8870                    IT block, it will be controlled naturally by IT
8871                    with the proper pseudo-predicate
8872                  - So the only interesting predicate is the one that
8873                    tells that we are not on the last item of an IT
8874                    block.  */
8875               if (itblock_current_pos != 0)
8876                   is_not_last_in_it_block = !!--itblock_current_pos;
8877
8878               if (insn_32bit)
8879                 {
8880                   /* Load the rest of the insn (in manual-friendly order).  */
8881                   insn = (insn << 16) | bfd_get_16 (abfd, &contents[i + 2]);
8882                   is_ldm = is_thumb2_ldmia (insn) || is_thumb2_ldmdb (insn);
8883                   is_vldm = is_thumb2_vldm (insn);
8884
8885                   /* Veneers are created for (v)ldm depending on
8886                      option flags and memory accesses conditions; but
8887                      if the instruction is not the last instruction of
8888                      an IT block, we cannot create a jump there, so we
8889                      bail out.  */
8890                     if ((is_ldm || is_vldm)
8891                         && stm32l4xx_need_create_replacing_stub
8892                         (insn, globals->stm32l4xx_fix))
8893                       {
8894                         if (is_not_last_in_it_block)
8895                           {
8896                             _bfd_error_handler
8897                               /* xgettext:c-format */
8898                               (_("%pB(%pA+%#x): error: multiple load detected"
8899                                  " in non-last IT block instruction:"
8900                                  " STM32L4XX veneer cannot be generated; "
8901                                  "use gcc option -mrestrict-it to generate"
8902                                  " only one instruction per IT block"),
8903                                abfd, sec, i);
8904                           }
8905                         else
8906                           {
8907                             elf32_stm32l4xx_erratum_list *newerr =
8908                               (elf32_stm32l4xx_erratum_list *)
8909                               bfd_zmalloc
8910                               (sizeof (elf32_stm32l4xx_erratum_list));
8911
8912                             elf32_arm_section_data (sec)
8913                               ->stm32l4xx_erratumcount += 1;
8914                             newerr->u.b.insn = insn;
8915                             /* We create only thumb branches.  */
8916                             newerr->type =
8917                               STM32L4XX_ERRATUM_BRANCH_TO_VENEER;
8918                             record_stm32l4xx_erratum_veneer
8919                               (link_info, newerr, abfd, sec,
8920                                i,
8921                                is_ldm ?
8922                                STM32L4XX_ERRATUM_LDM_VENEER_SIZE:
8923                                STM32L4XX_ERRATUM_VLDM_VENEER_SIZE);
8924                             newerr->vma = -1;
8925                             newerr->next = sec_data->stm32l4xx_erratumlist;
8926                             sec_data->stm32l4xx_erratumlist = newerr;
8927                           }
8928                       }
8929                 }
8930               else
8931                 {
8932                   /* A7.7.37 IT p208
8933                      IT blocks are only encoded in T1
8934                      Encoding T1: IT{x{y{z}}} <firstcond>
8935                      1 0 1 1 - 1 1 1 1 - firstcond - mask
8936                      if mask = '0000' then see 'related encodings'
8937                      We don't deal with UNPREDICTABLE, just ignore these.
8938                      There can be no nested IT blocks so an IT block
8939                      is naturally a new one for which it is worth
8940                      computing its size.  */
8941                   bfd_boolean is_newitblock = ((insn & 0xff00) == 0xbf00)
8942                     && ((insn & 0x000f) != 0x0000);
8943                   /* If we have a new IT block we compute its size.  */
8944                   if (is_newitblock)
8945                     {
8946                       /* Compute the number of instructions controlled
8947                          by the IT block, it will be used to decide
8948                          whether we are inside an IT block or not.  */
8949                       unsigned int mask = insn & 0x000f;
8950                       itblock_current_pos = 4 - ctz (mask);
8951                     }
8952                 }
8953
8954               i += insn_32bit ? 4 : 2;
8955             }
8956         }
8957
8958       if (contents != NULL
8959           && elf_section_data (sec)->this_hdr.contents != contents)
8960         free (contents);
8961       contents = NULL;
8962     }
8963
8964   return TRUE;
8965
8966 error_return:
8967   if (contents != NULL
8968       && elf_section_data (sec)->this_hdr.contents != contents)
8969     free (contents);
8970
8971   return FALSE;
8972 }
8973
8974 /* Set target relocation values needed during linking.  */
8975
8976 void
8977 bfd_elf32_arm_set_target_params (struct bfd *output_bfd,
8978                                  struct bfd_link_info *link_info,
8979                                  struct elf32_arm_params *params)
8980 {
8981   struct elf32_arm_link_hash_table *globals;
8982
8983   globals = elf32_arm_hash_table (link_info);
8984   if (globals == NULL)
8985     return;
8986
8987   globals->target1_is_rel = params->target1_is_rel;
8988   if (globals->fdpic_p)
8989     globals->target2_reloc = R_ARM_GOT32;
8990   else if (strcmp (params->target2_type, "rel") == 0)
8991     globals->target2_reloc = R_ARM_REL32;
8992   else if (strcmp (params->target2_type, "abs") == 0)
8993     globals->target2_reloc = R_ARM_ABS32;
8994   else if (strcmp (params->target2_type, "got-rel") == 0)
8995     globals->target2_reloc = R_ARM_GOT_PREL;
8996   else
8997     {
8998       _bfd_error_handler (_("invalid TARGET2 relocation type '%s'"),
8999                           params->target2_type);
9000     }
9001   globals->fix_v4bx = params->fix_v4bx;
9002   globals->use_blx |= params->use_blx;
9003   globals->vfp11_fix = params->vfp11_denorm_fix;
9004   globals->stm32l4xx_fix = params->stm32l4xx_fix;
9005   if (globals->fdpic_p)
9006     globals->pic_veneer = 1;
9007   else
9008     globals->pic_veneer = params->pic_veneer;
9009   globals->fix_cortex_a8 = params->fix_cortex_a8;
9010   globals->fix_arm1176 = params->fix_arm1176;
9011   globals->cmse_implib = params->cmse_implib;
9012   globals->in_implib_bfd = params->in_implib_bfd;
9013
9014   BFD_ASSERT (is_arm_elf (output_bfd));
9015   elf_arm_tdata (output_bfd)->no_enum_size_warning
9016     = params->no_enum_size_warning;
9017   elf_arm_tdata (output_bfd)->no_wchar_size_warning
9018     = params->no_wchar_size_warning;
9019 }
9020
9021 /* Replace the target offset of a Thumb bl or b.w instruction.  */
9022
9023 static void
9024 insert_thumb_branch (bfd *abfd, long int offset, bfd_byte *insn)
9025 {
9026   bfd_vma upper;
9027   bfd_vma lower;
9028   int reloc_sign;
9029
9030   BFD_ASSERT ((offset & 1) == 0);
9031
9032   upper = bfd_get_16 (abfd, insn);
9033   lower = bfd_get_16 (abfd, insn + 2);
9034   reloc_sign = (offset < 0) ? 1 : 0;
9035   upper = (upper & ~(bfd_vma) 0x7ff)
9036           | ((offset >> 12) & 0x3ff)
9037           | (reloc_sign << 10);
9038   lower = (lower & ~(bfd_vma) 0x2fff)
9039           | (((!((offset >> 23) & 1)) ^ reloc_sign) << 13)
9040           | (((!((offset >> 22) & 1)) ^ reloc_sign) << 11)
9041           | ((offset >> 1) & 0x7ff);
9042   bfd_put_16 (abfd, upper, insn);
9043   bfd_put_16 (abfd, lower, insn + 2);
9044 }
9045
9046 /* Thumb code calling an ARM function.  */
9047
9048 static int
9049 elf32_thumb_to_arm_stub (struct bfd_link_info * info,
9050                          const char *           name,
9051                          bfd *                  input_bfd,
9052                          bfd *                  output_bfd,
9053                          asection *             input_section,
9054                          bfd_byte *             hit_data,
9055                          asection *             sym_sec,
9056                          bfd_vma                offset,
9057                          bfd_signed_vma         addend,
9058                          bfd_vma                val,
9059                          char **error_message)
9060 {
9061   asection * s = 0;
9062   bfd_vma my_offset;
9063   long int ret_offset;
9064   struct elf_link_hash_entry * myh;
9065   struct elf32_arm_link_hash_table * globals;
9066
9067   myh = find_thumb_glue (info, name, error_message);
9068   if (myh == NULL)
9069     return FALSE;
9070
9071   globals = elf32_arm_hash_table (info);
9072   BFD_ASSERT (globals != NULL);
9073   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
9074
9075   my_offset = myh->root.u.def.value;
9076
9077   s = bfd_get_linker_section (globals->bfd_of_glue_owner,
9078                               THUMB2ARM_GLUE_SECTION_NAME);
9079
9080   BFD_ASSERT (s != NULL);
9081   BFD_ASSERT (s->contents != NULL);
9082   BFD_ASSERT (s->output_section != NULL);
9083
9084   if ((my_offset & 0x01) == 0x01)
9085     {
9086       if (sym_sec != NULL
9087           && sym_sec->owner != NULL
9088           && !INTERWORK_FLAG (sym_sec->owner))
9089         {
9090           _bfd_error_handler
9091             (_("%pB(%s): warning: interworking not enabled;"
9092                " first occurrence: %pB: %s call to %s"),
9093              sym_sec->owner, name, input_bfd, "Thumb", "ARM");
9094
9095           return FALSE;
9096         }
9097
9098       --my_offset;
9099       myh->root.u.def.value = my_offset;
9100
9101       put_thumb_insn (globals, output_bfd, (bfd_vma) t2a1_bx_pc_insn,
9102                       s->contents + my_offset);
9103
9104       put_thumb_insn (globals, output_bfd, (bfd_vma) t2a2_noop_insn,
9105                       s->contents + my_offset + 2);
9106
9107       ret_offset =
9108         /* Address of destination of the stub.  */
9109         ((bfd_signed_vma) val)
9110         - ((bfd_signed_vma)
9111            /* Offset from the start of the current section
9112               to the start of the stubs.  */
9113            (s->output_offset
9114             /* Offset of the start of this stub from the start of the stubs.  */
9115             + my_offset
9116             /* Address of the start of the current section.  */
9117             + s->output_section->vma)
9118            /* The branch instruction is 4 bytes into the stub.  */
9119            + 4
9120            /* ARM branches work from the pc of the instruction + 8.  */
9121            + 8);
9122
9123       put_arm_insn (globals, output_bfd,
9124                     (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
9125                     s->contents + my_offset + 4);
9126     }
9127
9128   BFD_ASSERT (my_offset <= globals->thumb_glue_size);
9129
9130   /* Now go back and fix up the original BL insn to point to here.  */
9131   ret_offset =
9132     /* Address of where the stub is located.  */
9133     (s->output_section->vma + s->output_offset + my_offset)
9134      /* Address of where the BL is located.  */
9135     - (input_section->output_section->vma + input_section->output_offset
9136        + offset)
9137     /* Addend in the relocation.  */
9138     - addend
9139     /* Biassing for PC-relative addressing.  */
9140     - 8;
9141
9142   insert_thumb_branch (input_bfd, ret_offset, hit_data - input_section->vma);
9143
9144   return TRUE;
9145 }
9146
9147 /* Populate an Arm to Thumb stub.  Returns the stub symbol.  */
9148
9149 static struct elf_link_hash_entry *
9150 elf32_arm_create_thumb_stub (struct bfd_link_info * info,
9151                              const char *           name,
9152                              bfd *                  input_bfd,
9153                              bfd *                  output_bfd,
9154                              asection *             sym_sec,
9155                              bfd_vma                val,
9156                              asection *             s,
9157                              char **                error_message)
9158 {
9159   bfd_vma my_offset;
9160   long int ret_offset;
9161   struct elf_link_hash_entry * myh;
9162   struct elf32_arm_link_hash_table * globals;
9163
9164   myh = find_arm_glue (info, name, error_message);
9165   if (myh == NULL)
9166     return NULL;
9167
9168   globals = elf32_arm_hash_table (info);
9169   BFD_ASSERT (globals != NULL);
9170   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
9171
9172   my_offset = myh->root.u.def.value;
9173
9174   if ((my_offset & 0x01) == 0x01)
9175     {
9176       if (sym_sec != NULL
9177           && sym_sec->owner != NULL
9178           && !INTERWORK_FLAG (sym_sec->owner))
9179         {
9180           _bfd_error_handler
9181             (_("%pB(%s): warning: interworking not enabled;"
9182                " first occurrence: %pB: %s call to %s"),
9183              sym_sec->owner, name, input_bfd, "ARM", "Thumb");
9184         }
9185
9186       --my_offset;
9187       myh->root.u.def.value = my_offset;
9188
9189       if (bfd_link_pic (info)
9190           || globals->root.is_relocatable_executable
9191           || globals->pic_veneer)
9192         {
9193           /* For relocatable objects we can't use absolute addresses,
9194              so construct the address from a relative offset.  */
9195           /* TODO: If the offset is small it's probably worth
9196              constructing the address with adds.  */
9197           put_arm_insn (globals, output_bfd, (bfd_vma) a2t1p_ldr_insn,
9198                         s->contents + my_offset);
9199           put_arm_insn (globals, output_bfd, (bfd_vma) a2t2p_add_pc_insn,
9200                         s->contents + my_offset + 4);
9201           put_arm_insn (globals, output_bfd, (bfd_vma) a2t3p_bx_r12_insn,
9202                         s->contents + my_offset + 8);
9203           /* Adjust the offset by 4 for the position of the add,
9204              and 8 for the pipeline offset.  */
9205           ret_offset = (val - (s->output_offset
9206                                + s->output_section->vma
9207                                + my_offset + 12))
9208                        | 1;
9209           bfd_put_32 (output_bfd, ret_offset,
9210                       s->contents + my_offset + 12);
9211         }
9212       else if (globals->use_blx)
9213         {
9214           put_arm_insn (globals, output_bfd, (bfd_vma) a2t1v5_ldr_insn,
9215                         s->contents + my_offset);
9216
9217           /* It's a thumb address.  Add the low order bit.  */
9218           bfd_put_32 (output_bfd, val | a2t2v5_func_addr_insn,
9219                       s->contents + my_offset + 4);
9220         }
9221       else
9222         {
9223           put_arm_insn (globals, output_bfd, (bfd_vma) a2t1_ldr_insn,
9224                         s->contents + my_offset);
9225
9226           put_arm_insn (globals, output_bfd, (bfd_vma) a2t2_bx_r12_insn,
9227                         s->contents + my_offset + 4);
9228
9229           /* It's a thumb address.  Add the low order bit.  */
9230           bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
9231                       s->contents + my_offset + 8);
9232
9233           my_offset += 12;
9234         }
9235     }
9236
9237   BFD_ASSERT (my_offset <= globals->arm_glue_size);
9238
9239   return myh;
9240 }
9241
9242 /* Arm code calling a Thumb function.  */
9243
9244 static int
9245 elf32_arm_to_thumb_stub (struct bfd_link_info * info,
9246                          const char *           name,
9247                          bfd *                  input_bfd,
9248                          bfd *                  output_bfd,
9249                          asection *             input_section,
9250                          bfd_byte *             hit_data,
9251                          asection *             sym_sec,
9252                          bfd_vma                offset,
9253                          bfd_signed_vma         addend,
9254                          bfd_vma                val,
9255                          char **error_message)
9256 {
9257   unsigned long int tmp;
9258   bfd_vma my_offset;
9259   asection * s;
9260   long int ret_offset;
9261   struct elf_link_hash_entry * myh;
9262   struct elf32_arm_link_hash_table * globals;
9263
9264   globals = elf32_arm_hash_table (info);
9265   BFD_ASSERT (globals != NULL);
9266   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
9267
9268   s = bfd_get_linker_section (globals->bfd_of_glue_owner,
9269                               ARM2THUMB_GLUE_SECTION_NAME);
9270   BFD_ASSERT (s != NULL);
9271   BFD_ASSERT (s->contents != NULL);
9272   BFD_ASSERT (s->output_section != NULL);
9273
9274   myh = elf32_arm_create_thumb_stub (info, name, input_bfd, output_bfd,
9275                                      sym_sec, val, s, error_message);
9276   if (!myh)
9277     return FALSE;
9278
9279   my_offset = myh->root.u.def.value;
9280   tmp = bfd_get_32 (input_bfd, hit_data);
9281   tmp = tmp & 0xFF000000;
9282
9283   /* Somehow these are both 4 too far, so subtract 8.  */
9284   ret_offset = (s->output_offset
9285                 + my_offset
9286                 + s->output_section->vma
9287                 - (input_section->output_offset
9288                    + input_section->output_section->vma
9289                    + offset + addend)
9290                 - 8);
9291
9292   tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
9293
9294   bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
9295
9296   return TRUE;
9297 }
9298
9299 /* Populate Arm stub for an exported Thumb function.  */
9300
9301 static bfd_boolean
9302 elf32_arm_to_thumb_export_stub (struct elf_link_hash_entry *h, void * inf)
9303 {
9304   struct bfd_link_info * info = (struct bfd_link_info *) inf;
9305   asection * s;
9306   struct elf_link_hash_entry * myh;
9307   struct elf32_arm_link_hash_entry *eh;
9308   struct elf32_arm_link_hash_table * globals;
9309   asection *sec;
9310   bfd_vma val;
9311   char *error_message;
9312
9313   eh = elf32_arm_hash_entry (h);
9314   /* Allocate stubs for exported Thumb functions on v4t.  */
9315   if (eh->export_glue == NULL)
9316     return TRUE;
9317
9318   globals = elf32_arm_hash_table (info);
9319   BFD_ASSERT (globals != NULL);
9320   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
9321
9322   s = bfd_get_linker_section (globals->bfd_of_glue_owner,
9323                               ARM2THUMB_GLUE_SECTION_NAME);
9324   BFD_ASSERT (s != NULL);
9325   BFD_ASSERT (s->contents != NULL);
9326   BFD_ASSERT (s->output_section != NULL);
9327
9328   sec = eh->export_glue->root.u.def.section;
9329
9330   BFD_ASSERT (sec->output_section != NULL);
9331
9332   val = eh->export_glue->root.u.def.value + sec->output_offset
9333         + sec->output_section->vma;
9334
9335   myh = elf32_arm_create_thumb_stub (info, h->root.root.string,
9336                                      h->root.u.def.section->owner,
9337                                      globals->obfd, sec, val, s,
9338                                      &error_message);
9339   BFD_ASSERT (myh);
9340   return TRUE;
9341 }
9342
9343 /* Populate ARMv4 BX veneers.  Returns the absolute adress of the veneer.  */
9344
9345 static bfd_vma
9346 elf32_arm_bx_glue (struct bfd_link_info * info, int reg)
9347 {
9348   bfd_byte *p;
9349   bfd_vma glue_addr;
9350   asection *s;
9351   struct elf32_arm_link_hash_table *globals;
9352
9353   globals = elf32_arm_hash_table (info);
9354   BFD_ASSERT (globals != NULL);
9355   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
9356
9357   s = bfd_get_linker_section (globals->bfd_of_glue_owner,
9358                               ARM_BX_GLUE_SECTION_NAME);
9359   BFD_ASSERT (s != NULL);
9360   BFD_ASSERT (s->contents != NULL);
9361   BFD_ASSERT (s->output_section != NULL);
9362
9363   BFD_ASSERT (globals->bx_glue_offset[reg] & 2);
9364
9365   glue_addr = globals->bx_glue_offset[reg] & ~(bfd_vma)3;
9366
9367   if ((globals->bx_glue_offset[reg] & 1) == 0)
9368     {
9369       p = s->contents + glue_addr;
9370       bfd_put_32 (globals->obfd, armbx1_tst_insn + (reg << 16), p);
9371       bfd_put_32 (globals->obfd, armbx2_moveq_insn + reg, p + 4);
9372       bfd_put_32 (globals->obfd, armbx3_bx_insn + reg, p + 8);
9373       globals->bx_glue_offset[reg] |= 1;
9374     }
9375
9376   return glue_addr + s->output_section->vma + s->output_offset;
9377 }
9378
9379 /* Generate Arm stubs for exported Thumb symbols.  */
9380 static void
9381 elf32_arm_begin_write_processing (bfd *abfd ATTRIBUTE_UNUSED,
9382                                   struct bfd_link_info *link_info)
9383 {
9384   struct elf32_arm_link_hash_table * globals;
9385
9386   if (link_info == NULL)
9387     /* Ignore this if we are not called by the ELF backend linker.  */
9388     return;
9389
9390   globals = elf32_arm_hash_table (link_info);
9391   if (globals == NULL)
9392     return;
9393
9394   /* If blx is available then exported Thumb symbols are OK and there is
9395      nothing to do.  */
9396   if (globals->use_blx)
9397     return;
9398
9399   elf_link_hash_traverse (&globals->root, elf32_arm_to_thumb_export_stub,
9400                           link_info);
9401 }
9402
9403 /* Reserve space for COUNT dynamic relocations in relocation selection
9404    SRELOC.  */
9405
9406 static void
9407 elf32_arm_allocate_dynrelocs (struct bfd_link_info *info, asection *sreloc,
9408                               bfd_size_type count)
9409 {
9410   struct elf32_arm_link_hash_table *htab;
9411
9412   htab = elf32_arm_hash_table (info);
9413   BFD_ASSERT (htab->root.dynamic_sections_created);
9414   if (sreloc == NULL)
9415     abort ();
9416   sreloc->size += RELOC_SIZE (htab) * count;
9417 }
9418
9419 /* Reserve space for COUNT R_ARM_IRELATIVE relocations.  If the link is
9420    dynamic, the relocations should go in SRELOC, otherwise they should
9421    go in the special .rel.iplt section.  */
9422
9423 static void
9424 elf32_arm_allocate_irelocs (struct bfd_link_info *info, asection *sreloc,
9425                             bfd_size_type count)
9426 {
9427   struct elf32_arm_link_hash_table *htab;
9428
9429   htab = elf32_arm_hash_table (info);
9430   if (!htab->root.dynamic_sections_created)
9431     htab->root.irelplt->size += RELOC_SIZE (htab) * count;
9432   else
9433     {
9434       BFD_ASSERT (sreloc != NULL);
9435       sreloc->size += RELOC_SIZE (htab) * count;
9436     }
9437 }
9438
9439 /* Add relocation REL to the end of relocation section SRELOC.  */
9440
9441 static void
9442 elf32_arm_add_dynreloc (bfd *output_bfd, struct bfd_link_info *info,
9443                         asection *sreloc, Elf_Internal_Rela *rel)
9444 {
9445   bfd_byte *loc;
9446   struct elf32_arm_link_hash_table *htab;
9447
9448   htab = elf32_arm_hash_table (info);
9449   if (!htab->root.dynamic_sections_created
9450       && ELF32_R_TYPE (rel->r_info) == R_ARM_IRELATIVE)
9451     sreloc = htab->root.irelplt;
9452   if (sreloc == NULL)
9453     abort ();
9454   loc = sreloc->contents;
9455   loc += sreloc->reloc_count++ * RELOC_SIZE (htab);
9456   if (sreloc->reloc_count * RELOC_SIZE (htab) > sreloc->size)
9457     abort ();
9458   SWAP_RELOC_OUT (htab) (output_bfd, rel, loc);
9459 }
9460
9461 /* Allocate room for a PLT entry described by ROOT_PLT and ARM_PLT.
9462    IS_IPLT_ENTRY says whether the entry belongs to .iplt rather than
9463    to .plt.  */
9464
9465 static void
9466 elf32_arm_allocate_plt_entry (struct bfd_link_info *info,
9467                               bfd_boolean is_iplt_entry,
9468                               union gotplt_union *root_plt,
9469                               struct arm_plt_info *arm_plt)
9470 {
9471   struct elf32_arm_link_hash_table *htab;
9472   asection *splt;
9473   asection *sgotplt;
9474
9475   htab = elf32_arm_hash_table (info);
9476
9477   if (is_iplt_entry)
9478     {
9479       splt = htab->root.iplt;
9480       sgotplt = htab->root.igotplt;
9481
9482       /* NaCl uses a special first entry in .iplt too.  */
9483       if (htab->nacl_p && splt->size == 0)
9484         splt->size += htab->plt_header_size;
9485
9486       /* Allocate room for an R_ARM_IRELATIVE relocation in .rel.iplt.  */
9487       elf32_arm_allocate_irelocs (info, htab->root.irelplt, 1);
9488     }
9489   else
9490     {
9491       splt = htab->root.splt;
9492       sgotplt = htab->root.sgotplt;
9493
9494     if (htab->fdpic_p)
9495       {
9496         /* Allocate room for R_ARM_FUNCDESC_VALUE.  */
9497         /* For lazy binding, relocations will be put into .rel.plt, in
9498            .rel.got otherwise.  */
9499         /* FIXME: today we don't support lazy binding so put it in .rel.got */
9500         if (info->flags & DF_BIND_NOW)
9501           elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
9502         else
9503           elf32_arm_allocate_dynrelocs (info, htab->root.srelplt, 1);
9504       }
9505     else
9506       {
9507         /* Allocate room for an R_JUMP_SLOT relocation in .rel.plt.  */
9508         elf32_arm_allocate_dynrelocs (info, htab->root.srelplt, 1);
9509       }
9510
9511       /* If this is the first .plt entry, make room for the special
9512          first entry.  */
9513       if (splt->size == 0)
9514         splt->size += htab->plt_header_size;
9515
9516       htab->next_tls_desc_index++;
9517     }
9518
9519   /* Allocate the PLT entry itself, including any leading Thumb stub.  */
9520   if (elf32_arm_plt_needs_thumb_stub_p (info, arm_plt))
9521     splt->size += PLT_THUMB_STUB_SIZE;
9522   root_plt->offset = splt->size;
9523   splt->size += htab->plt_entry_size;
9524
9525   if (!htab->symbian_p)
9526     {
9527       /* We also need to make an entry in the .got.plt section, which
9528          will be placed in the .got section by the linker script.  */
9529       if (is_iplt_entry)
9530         arm_plt->got_offset = sgotplt->size;
9531       else
9532         arm_plt->got_offset = sgotplt->size - 8 * htab->num_tls_desc;
9533       if (htab->fdpic_p)
9534         /* Function descriptor takes 64 bits in GOT.  */
9535         sgotplt->size += 8;
9536       else
9537         sgotplt->size += 4;
9538     }
9539 }
9540
9541 static bfd_vma
9542 arm_movw_immediate (bfd_vma value)
9543 {
9544   return (value & 0x00000fff) | ((value & 0x0000f000) << 4);
9545 }
9546
9547 static bfd_vma
9548 arm_movt_immediate (bfd_vma value)
9549 {
9550   return ((value & 0x0fff0000) >> 16) | ((value & 0xf0000000) >> 12);
9551 }
9552
9553 /* Fill in a PLT entry and its associated GOT slot.  If DYNINDX == -1,
9554    the entry lives in .iplt and resolves to (*SYM_VALUE)().
9555    Otherwise, DYNINDX is the index of the symbol in the dynamic
9556    symbol table and SYM_VALUE is undefined.
9557
9558    ROOT_PLT points to the offset of the PLT entry from the start of its
9559    section (.iplt or .plt).  ARM_PLT points to the symbol's ARM-specific
9560    bookkeeping information.
9561
9562    Returns FALSE if there was a problem.  */
9563
9564 static bfd_boolean
9565 elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
9566                               union gotplt_union *root_plt,
9567                               struct arm_plt_info *arm_plt,
9568                               int dynindx, bfd_vma sym_value)
9569 {
9570   struct elf32_arm_link_hash_table *htab;
9571   asection *sgot;
9572   asection *splt;
9573   asection *srel;
9574   bfd_byte *loc;
9575   bfd_vma plt_index;
9576   Elf_Internal_Rela rel;
9577   bfd_vma plt_header_size;
9578   bfd_vma got_header_size;
9579
9580   htab = elf32_arm_hash_table (info);
9581
9582   /* Pick the appropriate sections and sizes.  */
9583   if (dynindx == -1)
9584     {
9585       splt = htab->root.iplt;
9586       sgot = htab->root.igotplt;
9587       srel = htab->root.irelplt;
9588
9589       /* There are no reserved entries in .igot.plt, and no special
9590          first entry in .iplt.  */
9591       got_header_size = 0;
9592       plt_header_size = 0;
9593     }
9594   else
9595     {
9596       splt = htab->root.splt;
9597       sgot = htab->root.sgotplt;
9598       srel = htab->root.srelplt;
9599
9600       got_header_size = get_elf_backend_data (output_bfd)->got_header_size;
9601       plt_header_size = htab->plt_header_size;
9602     }
9603   BFD_ASSERT (splt != NULL && srel != NULL);
9604
9605   /* Fill in the entry in the procedure linkage table.  */
9606   if (htab->symbian_p)
9607     {
9608       BFD_ASSERT (dynindx >= 0);
9609       put_arm_insn (htab, output_bfd,
9610                     elf32_arm_symbian_plt_entry[0],
9611                     splt->contents + root_plt->offset);
9612       bfd_put_32 (output_bfd,
9613                   elf32_arm_symbian_plt_entry[1],
9614                   splt->contents + root_plt->offset + 4);
9615
9616       /* Fill in the entry in the .rel.plt section.  */
9617       rel.r_offset = (splt->output_section->vma
9618                       + splt->output_offset
9619                       + root_plt->offset + 4);
9620       rel.r_info = ELF32_R_INFO (dynindx, R_ARM_GLOB_DAT);
9621
9622       /* Get the index in the procedure linkage table which
9623          corresponds to this symbol.  This is the index of this symbol
9624          in all the symbols for which we are making plt entries.  The
9625          first entry in the procedure linkage table is reserved.  */
9626       plt_index = ((root_plt->offset - plt_header_size)
9627                    / htab->plt_entry_size);
9628     }
9629   else
9630     {
9631       bfd_vma got_offset, got_address, plt_address;
9632       bfd_vma got_displacement, initial_got_entry;
9633       bfd_byte * ptr;
9634
9635       BFD_ASSERT (sgot != NULL);
9636
9637       /* Get the offset into the .(i)got.plt table of the entry that
9638          corresponds to this function.  */
9639       got_offset = (arm_plt->got_offset & -2);
9640
9641       /* Get the index in the procedure linkage table which
9642          corresponds to this symbol.  This is the index of this symbol
9643          in all the symbols for which we are making plt entries.
9644          After the reserved .got.plt entries, all symbols appear in
9645          the same order as in .plt.  */
9646       if (htab->fdpic_p)
9647         /* Function descriptor takes 8 bytes.  */
9648         plt_index = (got_offset - got_header_size) / 8;
9649       else
9650         plt_index = (got_offset - got_header_size) / 4;
9651
9652       /* Calculate the address of the GOT entry.  */
9653       got_address = (sgot->output_section->vma
9654                      + sgot->output_offset
9655                      + got_offset);
9656
9657       /* ...and the address of the PLT entry.  */
9658       plt_address = (splt->output_section->vma
9659                      + splt->output_offset
9660                      + root_plt->offset);
9661
9662       ptr = splt->contents + root_plt->offset;
9663       if (htab->vxworks_p && bfd_link_pic (info))
9664         {
9665           unsigned int i;
9666           bfd_vma val;
9667
9668           for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
9669             {
9670               val = elf32_arm_vxworks_shared_plt_entry[i];
9671               if (i == 2)
9672                 val |= got_address - sgot->output_section->vma;
9673               if (i == 5)
9674                 val |= plt_index * RELOC_SIZE (htab);
9675               if (i == 2 || i == 5)
9676                 bfd_put_32 (output_bfd, val, ptr);
9677               else
9678                 put_arm_insn (htab, output_bfd, val, ptr);
9679             }
9680         }
9681       else if (htab->vxworks_p)
9682         {
9683           unsigned int i;
9684           bfd_vma val;
9685
9686           for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
9687             {
9688               val = elf32_arm_vxworks_exec_plt_entry[i];
9689               if (i == 2)
9690                 val |= got_address;
9691               if (i == 4)
9692                 val |= 0xffffff & -((root_plt->offset + i * 4 + 8) >> 2);
9693               if (i == 5)
9694                 val |= plt_index * RELOC_SIZE (htab);
9695               if (i == 2 || i == 5)
9696                 bfd_put_32 (output_bfd, val, ptr);
9697               else
9698                 put_arm_insn (htab, output_bfd, val, ptr);
9699             }
9700
9701           loc = (htab->srelplt2->contents
9702                  + (plt_index * 2 + 1) * RELOC_SIZE (htab));
9703
9704           /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
9705              referencing the GOT for this PLT entry.  */
9706           rel.r_offset = plt_address + 8;
9707           rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
9708           rel.r_addend = got_offset;
9709           SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
9710           loc += RELOC_SIZE (htab);
9711
9712           /* Create the R_ARM_ABS32 relocation referencing the
9713              beginning of the PLT for this GOT entry.  */
9714           rel.r_offset = got_address;
9715           rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
9716           rel.r_addend = 0;
9717           SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
9718         }
9719       else if (htab->nacl_p)
9720         {
9721           /* Calculate the displacement between the PLT slot and the
9722              common tail that's part of the special initial PLT slot.  */
9723           int32_t tail_displacement
9724             = ((splt->output_section->vma + splt->output_offset
9725                 + ARM_NACL_PLT_TAIL_OFFSET)
9726                - (plt_address + htab->plt_entry_size + 4));
9727           BFD_ASSERT ((tail_displacement & 3) == 0);
9728           tail_displacement >>= 2;
9729
9730           BFD_ASSERT ((tail_displacement & 0xff000000) == 0
9731                       || (-tail_displacement & 0xff000000) == 0);
9732
9733           /* Calculate the displacement between the PLT slot and the entry
9734              in the GOT.  The offset accounts for the value produced by
9735              adding to pc in the penultimate instruction of the PLT stub.  */
9736           got_displacement = (got_address
9737                               - (plt_address + htab->plt_entry_size));
9738
9739           /* NaCl does not support interworking at all.  */
9740           BFD_ASSERT (!elf32_arm_plt_needs_thumb_stub_p (info, arm_plt));
9741
9742           put_arm_insn (htab, output_bfd,
9743                         elf32_arm_nacl_plt_entry[0]
9744                         | arm_movw_immediate (got_displacement),
9745                         ptr + 0);
9746           put_arm_insn (htab, output_bfd,
9747                         elf32_arm_nacl_plt_entry[1]
9748                         | arm_movt_immediate (got_displacement),
9749                         ptr + 4);
9750           put_arm_insn (htab, output_bfd,
9751                         elf32_arm_nacl_plt_entry[2],
9752                         ptr + 8);
9753           put_arm_insn (htab, output_bfd,
9754                         elf32_arm_nacl_plt_entry[3]
9755                         | (tail_displacement & 0x00ffffff),
9756                         ptr + 12);
9757         }
9758       else if (htab->fdpic_p)
9759         {
9760           const bfd_vma *plt_entry = using_thumb_only(htab)
9761             ? elf32_arm_fdpic_thumb_plt_entry
9762             : elf32_arm_fdpic_plt_entry;
9763
9764           /* Fill-up Thumb stub if needed.  */
9765           if (elf32_arm_plt_needs_thumb_stub_p (info, arm_plt))
9766             {
9767               put_thumb_insn (htab, output_bfd,
9768                               elf32_arm_plt_thumb_stub[0], ptr - 4);
9769               put_thumb_insn (htab, output_bfd,
9770                               elf32_arm_plt_thumb_stub[1], ptr - 2);
9771             }
9772           /* As we are using 32 bit instructions even for the Thumb
9773              version, we have to use 'put_arm_insn' instead of
9774              'put_thumb_insn'.  */
9775           put_arm_insn(htab, output_bfd, plt_entry[0], ptr + 0);
9776           put_arm_insn(htab, output_bfd, plt_entry[1], ptr + 4);
9777           put_arm_insn(htab, output_bfd, plt_entry[2], ptr + 8);
9778           put_arm_insn(htab, output_bfd, plt_entry[3], ptr + 12);
9779           bfd_put_32 (output_bfd, got_offset, ptr + 16);
9780
9781           if (!(info->flags & DF_BIND_NOW))
9782             {
9783               /* funcdesc_value_reloc_offset.  */
9784               bfd_put_32 (output_bfd,
9785                           htab->root.srelplt->reloc_count * RELOC_SIZE (htab),
9786                           ptr + 20);
9787               put_arm_insn(htab, output_bfd, plt_entry[6], ptr + 24);
9788               put_arm_insn(htab, output_bfd, plt_entry[7], ptr + 28);
9789               put_arm_insn(htab, output_bfd, plt_entry[8], ptr + 32);
9790               put_arm_insn(htab, output_bfd, plt_entry[9], ptr + 36);
9791             }
9792         }
9793       else if (using_thumb_only (htab))
9794         {
9795           /* PR ld/16017: Generate thumb only PLT entries.  */
9796           if (!using_thumb2 (htab))
9797             {
9798               /* FIXME: We ought to be able to generate thumb-1 PLT
9799                  instructions...  */
9800               _bfd_error_handler (_("%pB: warning: thumb-1 mode PLT generation not currently supported"),
9801                                   output_bfd);
9802               return FALSE;
9803             }
9804
9805           /* Calculate the displacement between the PLT slot and the entry in
9806              the GOT.  The 12-byte offset accounts for the value produced by
9807              adding to pc in the 3rd instruction of the PLT stub.  */
9808           got_displacement = got_address - (plt_address + 12);
9809
9810           /* As we are using 32 bit instructions we have to use 'put_arm_insn'
9811              instead of 'put_thumb_insn'.  */
9812           put_arm_insn (htab, output_bfd,
9813                         elf32_thumb2_plt_entry[0]
9814                         | ((got_displacement & 0x000000ff) << 16)
9815                         | ((got_displacement & 0x00000700) << 20)
9816                         | ((got_displacement & 0x00000800) >>  1)
9817                         | ((got_displacement & 0x0000f000) >> 12),
9818                         ptr + 0);
9819           put_arm_insn (htab, output_bfd,
9820                         elf32_thumb2_plt_entry[1]
9821                         | ((got_displacement & 0x00ff0000)      )
9822                         | ((got_displacement & 0x07000000) <<  4)
9823                         | ((got_displacement & 0x08000000) >> 17)
9824                         | ((got_displacement & 0xf0000000) >> 28),
9825                         ptr + 4);
9826           put_arm_insn (htab, output_bfd,
9827                         elf32_thumb2_plt_entry[2],
9828                         ptr + 8);
9829           put_arm_insn (htab, output_bfd,
9830                         elf32_thumb2_plt_entry[3],
9831                         ptr + 12);
9832         }
9833       else
9834         {
9835           /* Calculate the displacement between the PLT slot and the
9836              entry in the GOT.  The eight-byte offset accounts for the
9837              value produced by adding to pc in the first instruction
9838              of the PLT stub.  */
9839           got_displacement = got_address - (plt_address + 8);
9840
9841           if (elf32_arm_plt_needs_thumb_stub_p (info, arm_plt))
9842             {
9843               put_thumb_insn (htab, output_bfd,
9844                               elf32_arm_plt_thumb_stub[0], ptr - 4);
9845               put_thumb_insn (htab, output_bfd,
9846                               elf32_arm_plt_thumb_stub[1], ptr - 2);
9847             }
9848
9849           if (!elf32_arm_use_long_plt_entry)
9850             {
9851               BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
9852
9853               put_arm_insn (htab, output_bfd,
9854                             elf32_arm_plt_entry_short[0]
9855                             | ((got_displacement & 0x0ff00000) >> 20),
9856                             ptr + 0);
9857               put_arm_insn (htab, output_bfd,
9858                             elf32_arm_plt_entry_short[1]
9859                             | ((got_displacement & 0x000ff000) >> 12),
9860                             ptr+ 4);
9861               put_arm_insn (htab, output_bfd,
9862                             elf32_arm_plt_entry_short[2]
9863                             | (got_displacement & 0x00000fff),
9864                             ptr + 8);
9865 #ifdef FOUR_WORD_PLT
9866               bfd_put_32 (output_bfd, elf32_arm_plt_entry_short[3], ptr + 12);
9867 #endif
9868             }
9869           else
9870             {
9871               put_arm_insn (htab, output_bfd,
9872                             elf32_arm_plt_entry_long[0]
9873                             | ((got_displacement & 0xf0000000) >> 28),
9874                             ptr + 0);
9875               put_arm_insn (htab, output_bfd,
9876                             elf32_arm_plt_entry_long[1]
9877                             | ((got_displacement & 0x0ff00000) >> 20),
9878                             ptr + 4);
9879               put_arm_insn (htab, output_bfd,
9880                             elf32_arm_plt_entry_long[2]
9881                             | ((got_displacement & 0x000ff000) >> 12),
9882                             ptr+ 8);
9883               put_arm_insn (htab, output_bfd,
9884                             elf32_arm_plt_entry_long[3]
9885                             | (got_displacement & 0x00000fff),
9886                             ptr + 12);
9887             }
9888         }
9889
9890       /* Fill in the entry in the .rel(a).(i)plt section.  */
9891       rel.r_offset = got_address;
9892       rel.r_addend = 0;
9893       if (dynindx == -1)
9894         {
9895           /* .igot.plt entries use IRELATIVE relocations against SYM_VALUE.
9896              The dynamic linker or static executable then calls SYM_VALUE
9897              to determine the correct run-time value of the .igot.plt entry.  */
9898           rel.r_info = ELF32_R_INFO (0, R_ARM_IRELATIVE);
9899           initial_got_entry = sym_value;
9900         }
9901       else
9902         {
9903           /* For FDPIC we will have to resolve a R_ARM_FUNCDESC_VALUE
9904              used by PLT entry.  */
9905           if (htab->fdpic_p)
9906             {
9907               rel.r_info = ELF32_R_INFO (dynindx, R_ARM_FUNCDESC_VALUE);
9908               initial_got_entry = 0;
9909             }
9910           else
9911             {
9912               rel.r_info = ELF32_R_INFO (dynindx, R_ARM_JUMP_SLOT);
9913               initial_got_entry = (splt->output_section->vma
9914                                    + splt->output_offset);
9915             }
9916         }
9917
9918       /* Fill in the entry in the global offset table.  */
9919       bfd_put_32 (output_bfd, initial_got_entry,
9920                   sgot->contents + got_offset);
9921
9922       if (htab->fdpic_p && !(info->flags & DF_BIND_NOW))
9923         {
9924           /* Setup initial funcdesc value.  */
9925           /* FIXME: we don't support lazy binding because there is a
9926              race condition between both words getting written and
9927              some other thread attempting to read them. The ARM
9928              architecture does not have an atomic 64 bit load/store
9929              instruction that could be used to prevent it; it is
9930              recommended that threaded FDPIC applications run with the
9931              LD_BIND_NOW environment variable set.  */
9932           bfd_put_32(output_bfd, plt_address + 0x18,
9933                      sgot->contents + got_offset);
9934           bfd_put_32(output_bfd, -1 /*TODO*/,
9935                      sgot->contents + got_offset + 4);
9936         }
9937     }
9938
9939   if (dynindx == -1)
9940     elf32_arm_add_dynreloc (output_bfd, info, srel, &rel);
9941   else
9942     {
9943       if (htab->fdpic_p)
9944         {
9945           /* For FDPIC we put PLT relocationss into .rel.got when not
9946              lazy binding otherwise we put them in .rel.plt.  For now,
9947              we don't support lazy binding so put it in .rel.got.  */
9948           if (info->flags & DF_BIND_NOW)
9949             elf32_arm_add_dynreloc(output_bfd, info, htab->root.srelgot, &rel);
9950           else
9951             elf32_arm_add_dynreloc(output_bfd, info, htab->root.srelplt, &rel);
9952         }
9953       else
9954         {
9955           loc = srel->contents + plt_index * RELOC_SIZE (htab);
9956           SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
9957         }
9958     }
9959
9960   return TRUE;
9961 }
9962
9963 /* Some relocations map to different relocations depending on the
9964    target.  Return the real relocation.  */
9965
9966 static int
9967 arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
9968                      int r_type)
9969 {
9970   switch (r_type)
9971     {
9972     case R_ARM_TARGET1:
9973       if (globals->target1_is_rel)
9974         return R_ARM_REL32;
9975       else
9976         return R_ARM_ABS32;
9977
9978     case R_ARM_TARGET2:
9979       return globals->target2_reloc;
9980
9981     default:
9982       return r_type;
9983     }
9984 }
9985
9986 /* Return the base VMA address which should be subtracted from real addresses
9987    when resolving @dtpoff relocation.
9988    This is PT_TLS segment p_vaddr.  */
9989
9990 static bfd_vma
9991 dtpoff_base (struct bfd_link_info *info)
9992 {
9993   /* If tls_sec is NULL, we should have signalled an error already.  */
9994   if (elf_hash_table (info)->tls_sec == NULL)
9995     return 0;
9996   return elf_hash_table (info)->tls_sec->vma;
9997 }
9998
9999 /* Return the relocation value for @tpoff relocation
10000    if STT_TLS virtual address is ADDRESS.  */
10001
10002 static bfd_vma
10003 tpoff (struct bfd_link_info *info, bfd_vma address)
10004 {
10005   struct elf_link_hash_table *htab = elf_hash_table (info);
10006   bfd_vma base;
10007
10008   /* If tls_sec is NULL, we should have signalled an error already.  */
10009   if (htab->tls_sec == NULL)
10010     return 0;
10011   base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
10012   return address - htab->tls_sec->vma + base;
10013 }
10014
10015 /* Perform an R_ARM_ABS12 relocation on the field pointed to by DATA.
10016    VALUE is the relocation value.  */
10017
10018 static bfd_reloc_status_type
10019 elf32_arm_abs12_reloc (bfd *abfd, void *data, bfd_vma value)
10020 {
10021   if (value > 0xfff)
10022     return bfd_reloc_overflow;
10023
10024   value |= bfd_get_32 (abfd, data) & 0xfffff000;
10025   bfd_put_32 (abfd, value, data);
10026   return bfd_reloc_ok;
10027 }
10028
10029 /* Handle TLS relaxations.  Relaxing is possible for symbols that use
10030    R_ARM_GOTDESC, R_ARM_{,THM_}TLS_CALL or
10031    R_ARM_{,THM_}TLS_DESCSEQ relocations, during a static link.
10032
10033    Return bfd_reloc_ok if we're done, bfd_reloc_continue if the caller
10034    is to then call final_link_relocate.  Return other values in the
10035    case of error.
10036
10037    FIXME:When --emit-relocs is in effect, we'll emit relocs describing
10038    the pre-relaxed code.  It would be nice if the relocs were updated
10039    to match the optimization.   */
10040
10041 static bfd_reloc_status_type
10042 elf32_arm_tls_relax (struct elf32_arm_link_hash_table *globals,
10043                      bfd *input_bfd, asection *input_sec, bfd_byte *contents,
10044                      Elf_Internal_Rela *rel, unsigned long is_local)
10045 {
10046   unsigned long insn;
10047
10048   switch (ELF32_R_TYPE (rel->r_info))
10049     {
10050     default:
10051       return bfd_reloc_notsupported;
10052
10053     case R_ARM_TLS_GOTDESC:
10054       if (is_local)
10055         insn = 0;
10056       else
10057         {
10058           insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
10059           if (insn & 1)
10060             insn -= 5; /* THUMB */
10061           else
10062             insn -= 8; /* ARM */
10063         }
10064       bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
10065       return bfd_reloc_continue;
10066
10067     case R_ARM_THM_TLS_DESCSEQ:
10068       /* Thumb insn.  */
10069       insn = bfd_get_16 (input_bfd, contents + rel->r_offset);
10070       if ((insn & 0xff78) == 0x4478)      /* add rx, pc */
10071         {
10072           if (is_local)
10073             /* nop */
10074             bfd_put_16 (input_bfd, 0x46c0, contents + rel->r_offset);
10075         }
10076       else if ((insn & 0xffc0) == 0x6840)  /* ldr rx,[ry,#4] */
10077         {
10078           if (is_local)
10079             /* nop */
10080             bfd_put_16 (input_bfd, 0x46c0, contents + rel->r_offset);
10081           else
10082             /* ldr rx,[ry] */
10083             bfd_put_16 (input_bfd, insn & 0xf83f, contents + rel->r_offset);
10084         }
10085       else if ((insn & 0xff87) == 0x4780)  /* blx rx */
10086         {
10087           if (is_local)
10088             /* nop */
10089             bfd_put_16 (input_bfd, 0x46c0, contents + rel->r_offset);
10090           else
10091             /* mov r0, rx */
10092             bfd_put_16 (input_bfd, 0x4600 | (insn & 0x78),
10093                         contents + rel->r_offset);
10094         }
10095       else
10096         {
10097           if ((insn & 0xf000) == 0xf000 || (insn & 0xf800) == 0xe800)
10098             /* It's a 32 bit instruction, fetch the rest of it for
10099                error generation.  */
10100             insn = (insn << 16)
10101               | bfd_get_16 (input_bfd, contents + rel->r_offset + 2);
10102           _bfd_error_handler
10103             /* xgettext:c-format */
10104             (_("%pB(%pA+%#" PRIx64 "): "
10105                "unexpected %s instruction '%#lx' in TLS trampoline"),
10106              input_bfd, input_sec, (uint64_t) rel->r_offset,
10107              "Thumb", insn);
10108           return bfd_reloc_notsupported;
10109         }
10110       break;
10111
10112     case R_ARM_TLS_DESCSEQ:
10113       /* arm insn.  */
10114       insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
10115       if ((insn & 0xffff0ff0) == 0xe08f0000) /* add rx,pc,ry */
10116         {
10117           if (is_local)
10118             /* mov rx, ry */
10119             bfd_put_32 (input_bfd, 0xe1a00000 | (insn & 0xffff),
10120                         contents + rel->r_offset);
10121         }
10122       else if ((insn & 0xfff00fff) == 0xe5900004) /* ldr rx,[ry,#4]*/
10123         {
10124           if (is_local)
10125             /* nop */
10126             bfd_put_32 (input_bfd, 0xe1a00000, contents + rel->r_offset);
10127           else
10128             /* ldr rx,[ry] */
10129             bfd_put_32 (input_bfd, insn & 0xfffff000,
10130                         contents + rel->r_offset);
10131         }
10132       else if ((insn & 0xfffffff0) == 0xe12fff30) /* blx rx */
10133         {
10134           if (is_local)
10135             /* nop */
10136             bfd_put_32 (input_bfd, 0xe1a00000, contents + rel->r_offset);
10137           else
10138             /* mov r0, rx */
10139             bfd_put_32 (input_bfd, 0xe1a00000 | (insn & 0xf),
10140                         contents + rel->r_offset);
10141         }
10142       else
10143         {
10144           _bfd_error_handler
10145             /* xgettext:c-format */
10146             (_("%pB(%pA+%#" PRIx64 "): "
10147                "unexpected %s instruction '%#lx' in TLS trampoline"),
10148              input_bfd, input_sec, (uint64_t) rel->r_offset,
10149              "ARM", insn);
10150           return bfd_reloc_notsupported;
10151         }
10152       break;
10153
10154     case R_ARM_TLS_CALL:
10155       /* GD->IE relaxation, turn the instruction into 'nop' or
10156          'ldr r0, [pc,r0]'  */
10157       insn = is_local ? 0xe1a00000 : 0xe79f0000;
10158       bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
10159       break;
10160
10161     case R_ARM_THM_TLS_CALL:
10162       /* GD->IE relaxation.  */
10163       if (!is_local)
10164         /* add r0,pc; ldr r0, [r0]  */
10165         insn = 0x44786800;
10166       else if (using_thumb2 (globals))
10167         /* nop.w */
10168         insn = 0xf3af8000;
10169       else
10170         /* nop; nop */
10171         insn = 0xbf00bf00;
10172
10173       bfd_put_16 (input_bfd, insn >> 16, contents + rel->r_offset);
10174       bfd_put_16 (input_bfd, insn & 0xffff, contents + rel->r_offset + 2);
10175       break;
10176     }
10177   return bfd_reloc_ok;
10178 }
10179
10180 /* For a given value of n, calculate the value of G_n as required to
10181    deal with group relocations.  We return it in the form of an
10182    encoded constant-and-rotation, together with the final residual.  If n is
10183    specified as less than zero, then final_residual is filled with the
10184    input value and no further action is performed.  */
10185
10186 static bfd_vma
10187 calculate_group_reloc_mask (bfd_vma value, int n, bfd_vma *final_residual)
10188 {
10189   int current_n;
10190   bfd_vma g_n;
10191   bfd_vma encoded_g_n = 0;
10192   bfd_vma residual = value; /* Also known as Y_n.  */
10193
10194   for (current_n = 0; current_n <= n; current_n++)
10195     {
10196       int shift;
10197
10198       /* Calculate which part of the value to mask.  */
10199       if (residual == 0)
10200         shift = 0;
10201       else
10202         {
10203           int msb;
10204
10205           /* Determine the most significant bit in the residual and
10206              align the resulting value to a 2-bit boundary.  */
10207           for (msb = 30; msb >= 0; msb -= 2)
10208             if (residual & (3 << msb))
10209               break;
10210
10211           /* The desired shift is now (msb - 6), or zero, whichever
10212              is the greater.  */
10213           shift = msb - 6;
10214           if (shift < 0)
10215             shift = 0;
10216         }
10217
10218       /* Calculate g_n in 32-bit as well as encoded constant+rotation form.  */
10219       g_n = residual & (0xff << shift);
10220       encoded_g_n = (g_n >> shift)
10221                     | ((g_n <= 0xff ? 0 : (32 - shift) / 2) << 8);
10222
10223       /* Calculate the residual for the next time around.  */
10224       residual &= ~g_n;
10225     }
10226
10227   *final_residual = residual;
10228
10229   return encoded_g_n;
10230 }
10231
10232 /* Given an ARM instruction, determine whether it is an ADD or a SUB.
10233    Returns 1 if it is an ADD, -1 if it is a SUB, and 0 otherwise.  */
10234
10235 static int
10236 identify_add_or_sub (bfd_vma insn)
10237 {
10238   int opcode = insn & 0x1e00000;
10239
10240   if (opcode == 1 << 23) /* ADD */
10241     return 1;
10242
10243   if (opcode == 1 << 22) /* SUB */
10244     return -1;
10245
10246   return 0;
10247 }
10248
10249 /* Perform a relocation as part of a final link.  */
10250
10251 static bfd_reloc_status_type
10252 elf32_arm_final_link_relocate (reloc_howto_type *           howto,
10253                                bfd *                        input_bfd,
10254                                bfd *                        output_bfd,
10255                                asection *                   input_section,
10256                                bfd_byte *                   contents,
10257                                Elf_Internal_Rela *          rel,
10258                                bfd_vma                      value,
10259                                struct bfd_link_info *       info,
10260                                asection *                   sym_sec,
10261                                const char *                 sym_name,
10262                                unsigned char                st_type,
10263                                enum arm_st_branch_type      branch_type,
10264                                struct elf_link_hash_entry * h,
10265                                bfd_boolean *                unresolved_reloc_p,
10266                                char **                      error_message)
10267 {
10268   unsigned long                 r_type = howto->type;
10269   unsigned long                 r_symndx;
10270   bfd_byte *                    hit_data = contents + rel->r_offset;
10271   bfd_vma *                     local_got_offsets;
10272   bfd_vma *                     local_tlsdesc_gotents;
10273   asection *                    sgot;
10274   asection *                    splt;
10275   asection *                    sreloc = NULL;
10276   asection *                    srelgot;
10277   bfd_vma                       addend;
10278   bfd_signed_vma                signed_addend;
10279   unsigned char                 dynreloc_st_type;
10280   bfd_vma                       dynreloc_value;
10281   struct elf32_arm_link_hash_table * globals;
10282   struct elf32_arm_link_hash_entry *eh;
10283   union gotplt_union           *root_plt;
10284   struct arm_plt_info          *arm_plt;
10285   bfd_vma                       plt_offset;
10286   bfd_vma                       gotplt_offset;
10287   bfd_boolean                   has_iplt_entry;
10288   bfd_boolean                   resolved_to_zero;
10289
10290   globals = elf32_arm_hash_table (info);
10291   if (globals == NULL)
10292     return bfd_reloc_notsupported;
10293
10294   BFD_ASSERT (is_arm_elf (input_bfd));
10295   BFD_ASSERT (howto != NULL);
10296
10297   /* Some relocation types map to different relocations depending on the
10298      target.  We pick the right one here.  */
10299   r_type = arm_real_reloc_type (globals, r_type);
10300
10301   /* It is possible to have linker relaxations on some TLS access
10302      models.  Update our information here.  */
10303   r_type = elf32_arm_tls_transition (info, r_type, h);
10304
10305   if (r_type != howto->type)
10306     howto = elf32_arm_howto_from_type (r_type);
10307
10308   eh = (struct elf32_arm_link_hash_entry *) h;
10309   sgot = globals->root.sgot;
10310   local_got_offsets = elf_local_got_offsets (input_bfd);
10311   local_tlsdesc_gotents = elf32_arm_local_tlsdesc_gotent (input_bfd);
10312
10313   if (globals->root.dynamic_sections_created)
10314     srelgot = globals->root.srelgot;
10315   else
10316     srelgot = NULL;
10317
10318   r_symndx = ELF32_R_SYM (rel->r_info);
10319
10320   if (globals->use_rel)
10321     {
10322       addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
10323
10324       if (addend & ((howto->src_mask + 1) >> 1))
10325         {
10326           signed_addend = -1;
10327           signed_addend &= ~ howto->src_mask;
10328           signed_addend |= addend;
10329         }
10330       else
10331         signed_addend = addend;
10332     }
10333   else
10334     addend = signed_addend = rel->r_addend;
10335
10336   /* ST_BRANCH_TO_ARM is nonsense to thumb-only targets when we
10337      are resolving a function call relocation.  */
10338   if (using_thumb_only (globals)
10339       && (r_type == R_ARM_THM_CALL
10340           || r_type == R_ARM_THM_JUMP24)
10341       && branch_type == ST_BRANCH_TO_ARM)
10342     branch_type = ST_BRANCH_TO_THUMB;
10343
10344   /* Record the symbol information that should be used in dynamic
10345      relocations.  */
10346   dynreloc_st_type = st_type;
10347   dynreloc_value = value;
10348   if (branch_type == ST_BRANCH_TO_THUMB)
10349     dynreloc_value |= 1;
10350
10351   /* Find out whether the symbol has a PLT.  Set ST_VALUE, BRANCH_TYPE and
10352      VALUE appropriately for relocations that we resolve at link time.  */
10353   has_iplt_entry = FALSE;
10354   if (elf32_arm_get_plt_info (input_bfd, globals, eh, r_symndx, &root_plt,
10355                               &arm_plt)
10356       && root_plt->offset != (bfd_vma) -1)
10357     {
10358       plt_offset = root_plt->offset;
10359       gotplt_offset = arm_plt->got_offset;
10360
10361       if (h == NULL || eh->is_iplt)
10362         {
10363           has_iplt_entry = TRUE;
10364           splt = globals->root.iplt;
10365
10366           /* Populate .iplt entries here, because not all of them will
10367              be seen by finish_dynamic_symbol.  The lower bit is set if
10368              we have already populated the entry.  */
10369           if (plt_offset & 1)
10370             plt_offset--;
10371           else
10372             {
10373               if (elf32_arm_populate_plt_entry (output_bfd, info, root_plt, arm_plt,
10374                                                 -1, dynreloc_value))
10375                 root_plt->offset |= 1;
10376               else
10377                 return bfd_reloc_notsupported;
10378             }
10379
10380           /* Static relocations always resolve to the .iplt entry.  */
10381           st_type = STT_FUNC;
10382           value = (splt->output_section->vma
10383                    + splt->output_offset
10384                    + plt_offset);
10385           branch_type = ST_BRANCH_TO_ARM;
10386
10387           /* If there are non-call relocations that resolve to the .iplt
10388              entry, then all dynamic ones must too.  */
10389           if (arm_plt->noncall_refcount != 0)
10390             {
10391               dynreloc_st_type = st_type;
10392               dynreloc_value = value;
10393             }
10394         }
10395       else
10396         /* We populate the .plt entry in finish_dynamic_symbol.  */
10397         splt = globals->root.splt;
10398     }
10399   else
10400     {
10401       splt = NULL;
10402       plt_offset = (bfd_vma) -1;
10403       gotplt_offset = (bfd_vma) -1;
10404     }
10405
10406   resolved_to_zero = (h != NULL
10407                       && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
10408
10409   switch (r_type)
10410     {
10411     case R_ARM_NONE:
10412       /* We don't need to find a value for this symbol.  It's just a
10413          marker.  */
10414       *unresolved_reloc_p = FALSE;
10415       return bfd_reloc_ok;
10416
10417     case R_ARM_ABS12:
10418       if (!globals->vxworks_p)
10419         return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
10420       /* Fall through.  */
10421
10422     case R_ARM_PC24:
10423     case R_ARM_ABS32:
10424     case R_ARM_ABS32_NOI:
10425     case R_ARM_REL32:
10426     case R_ARM_REL32_NOI:
10427     case R_ARM_CALL:
10428     case R_ARM_JUMP24:
10429     case R_ARM_XPC25:
10430     case R_ARM_PREL31:
10431     case R_ARM_PLT32:
10432       /* Handle relocations which should use the PLT entry.  ABS32/REL32
10433          will use the symbol's value, which may point to a PLT entry, but we
10434          don't need to handle that here.  If we created a PLT entry, all
10435          branches in this object should go to it, except if the PLT is too
10436          far away, in which case a long branch stub should be inserted.  */
10437       if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32
10438            && r_type != R_ARM_ABS32_NOI && r_type != R_ARM_REL32_NOI
10439            && r_type != R_ARM_CALL
10440            && r_type != R_ARM_JUMP24
10441            && r_type != R_ARM_PLT32)
10442           && plt_offset != (bfd_vma) -1)
10443         {
10444           /* If we've created a .plt section, and assigned a PLT entry
10445              to this function, it must either be a STT_GNU_IFUNC reference
10446              or not be known to bind locally.  In other cases, we should
10447              have cleared the PLT entry by now.  */
10448           BFD_ASSERT (has_iplt_entry || !SYMBOL_CALLS_LOCAL (info, h));
10449
10450           value = (splt->output_section->vma
10451                    + splt->output_offset
10452                    + plt_offset);
10453           *unresolved_reloc_p = FALSE;
10454           return _bfd_final_link_relocate (howto, input_bfd, input_section,
10455                                            contents, rel->r_offset, value,
10456                                            rel->r_addend);
10457         }
10458
10459       /* When generating a shared object or relocatable executable, these
10460          relocations are copied into the output file to be resolved at
10461          run time.  */
10462       if ((bfd_link_pic (info)
10463            || globals->root.is_relocatable_executable
10464            || globals->fdpic_p)
10465           && (input_section->flags & SEC_ALLOC)
10466           && !(globals->vxworks_p
10467                && strcmp (input_section->output_section->name,
10468                           ".tls_vars") == 0)
10469           && ((r_type != R_ARM_REL32 && r_type != R_ARM_REL32_NOI)
10470               || !SYMBOL_CALLS_LOCAL (info, h))
10471           && !(input_bfd == globals->stub_bfd
10472                && strstr (input_section->name, STUB_SUFFIX))
10473           && (h == NULL
10474               || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
10475                   && !resolved_to_zero)
10476               || h->root.type != bfd_link_hash_undefweak)
10477           && r_type != R_ARM_PC24
10478           && r_type != R_ARM_CALL
10479           && r_type != R_ARM_JUMP24
10480           && r_type != R_ARM_PREL31
10481           && r_type != R_ARM_PLT32)
10482         {
10483           Elf_Internal_Rela outrel;
10484           bfd_boolean skip, relocate;
10485           int isrofixup = 0;
10486
10487           if ((r_type == R_ARM_REL32 || r_type == R_ARM_REL32_NOI)
10488               && !h->def_regular)
10489             {
10490               char *v = _("shared object");
10491
10492               if (bfd_link_executable (info))
10493                 v = _("PIE executable");
10494
10495               _bfd_error_handler
10496                 (_("%pB: relocation %s against external or undefined symbol `%s'"
10497                    " can not be used when making a %s; recompile with -fPIC"), input_bfd,
10498                  elf32_arm_howto_table_1[r_type].name, h->root.root.string, v);
10499               return bfd_reloc_notsupported;
10500             }
10501
10502           *unresolved_reloc_p = FALSE;
10503
10504           if (sreloc == NULL && globals->root.dynamic_sections_created)
10505             {
10506               sreloc = _bfd_elf_get_dynamic_reloc_section (input_bfd, input_section,
10507                                                            ! globals->use_rel);
10508
10509               if (sreloc == NULL)
10510                 return bfd_reloc_notsupported;
10511             }
10512
10513           skip = FALSE;
10514           relocate = FALSE;
10515
10516           outrel.r_addend = addend;
10517           outrel.r_offset =
10518             _bfd_elf_section_offset (output_bfd, info, input_section,
10519                                      rel->r_offset);
10520           if (outrel.r_offset == (bfd_vma) -1)
10521             skip = TRUE;
10522           else if (outrel.r_offset == (bfd_vma) -2)
10523             skip = TRUE, relocate = TRUE;
10524           outrel.r_offset += (input_section->output_section->vma
10525                               + input_section->output_offset);
10526
10527           if (skip)
10528             memset (&outrel, 0, sizeof outrel);
10529           else if (h != NULL
10530                    && h->dynindx != -1
10531                    && (!bfd_link_pic (info)
10532                        || !(bfd_link_pie (info)
10533                             || SYMBOLIC_BIND (info, h))
10534                        || !h->def_regular))
10535             outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
10536           else
10537             {
10538               int symbol;
10539
10540               /* This symbol is local, or marked to become local.  */
10541               BFD_ASSERT (r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI
10542                           || (globals->fdpic_p && !bfd_link_pic(info)));
10543               if (globals->symbian_p)
10544                 {
10545                   asection *osec;
10546
10547                   /* On Symbian OS, the data segment and text segement
10548                      can be relocated independently.  Therefore, we
10549                      must indicate the segment to which this
10550                      relocation is relative.  The BPABI allows us to
10551                      use any symbol in the right segment; we just use
10552                      the section symbol as it is convenient.  (We
10553                      cannot use the symbol given by "h" directly as it
10554                      will not appear in the dynamic symbol table.)
10555
10556                      Note that the dynamic linker ignores the section
10557                      symbol value, so we don't subtract osec->vma
10558                      from the emitted reloc addend.  */
10559                   if (sym_sec)
10560                     osec = sym_sec->output_section;
10561                   else
10562                     osec = input_section->output_section;
10563                   symbol = elf_section_data (osec)->dynindx;
10564                   if (symbol == 0)
10565                     {
10566                       struct elf_link_hash_table *htab = elf_hash_table (info);
10567
10568                       if ((osec->flags & SEC_READONLY) == 0
10569                           && htab->data_index_section != NULL)
10570                         osec = htab->data_index_section;
10571                       else
10572                         osec = htab->text_index_section;
10573                       symbol = elf_section_data (osec)->dynindx;
10574                     }
10575                   BFD_ASSERT (symbol != 0);
10576                 }
10577               else
10578                 /* On SVR4-ish systems, the dynamic loader cannot
10579                    relocate the text and data segments independently,
10580                    so the symbol does not matter.  */
10581                 symbol = 0;
10582               if (dynreloc_st_type == STT_GNU_IFUNC)
10583                 /* We have an STT_GNU_IFUNC symbol that doesn't resolve
10584                    to the .iplt entry.  Instead, every non-call reference
10585                    must use an R_ARM_IRELATIVE relocation to obtain the
10586                    correct run-time address.  */
10587                 outrel.r_info = ELF32_R_INFO (symbol, R_ARM_IRELATIVE);
10588               else if (globals->fdpic_p && !bfd_link_pic(info))
10589                 isrofixup = 1;
10590               else
10591                 outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
10592               if (globals->use_rel)
10593                 relocate = TRUE;
10594               else
10595                 outrel.r_addend += dynreloc_value;
10596             }
10597
10598           if (isrofixup)
10599             arm_elf_add_rofixup(output_bfd, globals->srofixup, outrel.r_offset);
10600           else
10601             elf32_arm_add_dynreloc (output_bfd, info, sreloc, &outrel);
10602
10603           /* If this reloc is against an external symbol, we do not want to
10604              fiddle with the addend.  Otherwise, we need to include the symbol
10605              value so that it becomes an addend for the dynamic reloc.  */
10606           if (! relocate)
10607             return bfd_reloc_ok;
10608
10609           return _bfd_final_link_relocate (howto, input_bfd, input_section,
10610                                            contents, rel->r_offset,
10611                                            dynreloc_value, (bfd_vma) 0);
10612         }
10613       else switch (r_type)
10614         {
10615         case R_ARM_ABS12:
10616           return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
10617
10618         case R_ARM_XPC25:         /* Arm BLX instruction.  */
10619         case R_ARM_CALL:
10620         case R_ARM_JUMP24:
10621         case R_ARM_PC24:          /* Arm B/BL instruction.  */
10622         case R_ARM_PLT32:
10623           {
10624           struct elf32_arm_stub_hash_entry *stub_entry = NULL;
10625
10626           if (r_type == R_ARM_XPC25)
10627             {
10628               /* Check for Arm calling Arm function.  */
10629               /* FIXME: Should we translate the instruction into a BL
10630                  instruction instead ?  */
10631               if (branch_type != ST_BRANCH_TO_THUMB)
10632                 _bfd_error_handler
10633                   (_("\%pB: warning: %s BLX instruction targets"
10634                      " %s function '%s'"),
10635                    input_bfd, "ARM",
10636                    "ARM", h ? h->root.root.string : "(local)");
10637             }
10638           else if (r_type == R_ARM_PC24)
10639             {
10640               /* Check for Arm calling Thumb function.  */
10641               if (branch_type == ST_BRANCH_TO_THUMB)
10642                 {
10643                   if (elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
10644                                                output_bfd, input_section,
10645                                                hit_data, sym_sec, rel->r_offset,
10646                                                signed_addend, value,
10647                                                error_message))
10648                     return bfd_reloc_ok;
10649                   else
10650                     return bfd_reloc_dangerous;
10651                 }
10652             }
10653
10654           /* Check if a stub has to be inserted because the
10655              destination is too far or we are changing mode.  */
10656           if (   r_type == R_ARM_CALL
10657               || r_type == R_ARM_JUMP24
10658               || r_type == R_ARM_PLT32)
10659             {
10660               enum elf32_arm_stub_type stub_type = arm_stub_none;
10661               struct elf32_arm_link_hash_entry *hash;
10662
10663               hash = (struct elf32_arm_link_hash_entry *) h;
10664               stub_type = arm_type_of_stub (info, input_section, rel,
10665                                             st_type, &branch_type,
10666                                             hash, value, sym_sec,
10667                                             input_bfd, sym_name);
10668
10669               if (stub_type != arm_stub_none)
10670                 {
10671                   /* The target is out of reach, so redirect the
10672                      branch to the local stub for this function.  */
10673                   stub_entry = elf32_arm_get_stub_entry (input_section,
10674                                                          sym_sec, h,
10675                                                          rel, globals,
10676                                                          stub_type);
10677                   {
10678                     if (stub_entry != NULL)
10679                       value = (stub_entry->stub_offset
10680                                + stub_entry->stub_sec->output_offset
10681                                + stub_entry->stub_sec->output_section->vma);
10682
10683                     if (plt_offset != (bfd_vma) -1)
10684                       *unresolved_reloc_p = FALSE;
10685                   }
10686                 }
10687               else
10688                 {
10689                   /* If the call goes through a PLT entry, make sure to
10690                      check distance to the right destination address.  */
10691                   if (plt_offset != (bfd_vma) -1)
10692                     {
10693                       value = (splt->output_section->vma
10694                                + splt->output_offset
10695                                + plt_offset);
10696                       *unresolved_reloc_p = FALSE;
10697                       /* The PLT entry is in ARM mode, regardless of the
10698                          target function.  */
10699                       branch_type = ST_BRANCH_TO_ARM;
10700                     }
10701                 }
10702             }
10703
10704           /* The ARM ELF ABI says that this reloc is computed as: S - P + A
10705              where:
10706               S is the address of the symbol in the relocation.
10707               P is address of the instruction being relocated.
10708               A is the addend (extracted from the instruction) in bytes.
10709
10710              S is held in 'value'.
10711              P is the base address of the section containing the
10712                instruction plus the offset of the reloc into that
10713                section, ie:
10714                  (input_section->output_section->vma +
10715                   input_section->output_offset +
10716                   rel->r_offset).
10717              A is the addend, converted into bytes, ie:
10718                  (signed_addend * 4)
10719
10720              Note: None of these operations have knowledge of the pipeline
10721              size of the processor, thus it is up to the assembler to
10722              encode this information into the addend.  */
10723           value -= (input_section->output_section->vma
10724                     + input_section->output_offset);
10725           value -= rel->r_offset;
10726           if (globals->use_rel)
10727             value += (signed_addend << howto->size);
10728           else
10729             /* RELA addends do not have to be adjusted by howto->size.  */
10730             value += signed_addend;
10731
10732           signed_addend = value;
10733           signed_addend >>= howto->rightshift;
10734
10735           /* A branch to an undefined weak symbol is turned into a jump to
10736              the next instruction unless a PLT entry will be created.
10737              Do the same for local undefined symbols (but not for STN_UNDEF).
10738              The jump to the next instruction is optimized as a NOP depending
10739              on the architecture.  */
10740           if (h ? (h->root.type == bfd_link_hash_undefweak
10741                    && plt_offset == (bfd_vma) -1)
10742               : r_symndx != STN_UNDEF && bfd_is_und_section (sym_sec))
10743             {
10744               value = (bfd_get_32 (input_bfd, hit_data) & 0xf0000000);
10745
10746               if (arch_has_arm_nop (globals))
10747                 value |= 0x0320f000;
10748               else
10749                 value |= 0x01a00000; /* Using pre-UAL nop: mov r0, r0.  */
10750             }
10751           else
10752             {
10753               /* Perform a signed range check.  */
10754               if (   signed_addend >   ((bfd_signed_vma)  (howto->dst_mask >> 1))
10755                   || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
10756                 return bfd_reloc_overflow;
10757
10758               addend = (value & 2);
10759
10760               value = (signed_addend & howto->dst_mask)
10761                 | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
10762
10763               if (r_type == R_ARM_CALL)
10764                 {
10765                   /* Set the H bit in the BLX instruction.  */
10766                   if (branch_type == ST_BRANCH_TO_THUMB)
10767                     {
10768                       if (addend)
10769                         value |= (1 << 24);
10770                       else
10771                         value &= ~(bfd_vma)(1 << 24);
10772                     }
10773
10774                   /* Select the correct instruction (BL or BLX).  */
10775                   /* Only if we are not handling a BL to a stub. In this
10776                      case, mode switching is performed by the stub.  */
10777                   if (branch_type == ST_BRANCH_TO_THUMB && !stub_entry)
10778                     value |= (1 << 28);
10779                   else if (stub_entry || branch_type != ST_BRANCH_UNKNOWN)
10780                     {
10781                       value &= ~(bfd_vma)(1 << 28);
10782                       value |= (1 << 24);
10783                     }
10784                 }
10785             }
10786           }
10787           break;
10788
10789         case R_ARM_ABS32:
10790           value += addend;
10791           if (branch_type == ST_BRANCH_TO_THUMB)
10792             value |= 1;
10793           break;
10794
10795         case R_ARM_ABS32_NOI:
10796           value += addend;
10797           break;
10798
10799         case R_ARM_REL32:
10800           value += addend;
10801           if (branch_type == ST_BRANCH_TO_THUMB)
10802             value |= 1;
10803           value -= (input_section->output_section->vma
10804                     + input_section->output_offset + rel->r_offset);
10805           break;
10806
10807         case R_ARM_REL32_NOI:
10808           value += addend;
10809           value -= (input_section->output_section->vma
10810                     + input_section->output_offset + rel->r_offset);
10811           break;
10812
10813         case R_ARM_PREL31:
10814           value -= (input_section->output_section->vma
10815                     + input_section->output_offset + rel->r_offset);
10816           value += signed_addend;
10817           if (! h || h->root.type != bfd_link_hash_undefweak)
10818             {
10819               /* Check for overflow.  */
10820               if ((value ^ (value >> 1)) & (1 << 30))
10821                 return bfd_reloc_overflow;
10822             }
10823           value &= 0x7fffffff;
10824           value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
10825           if (branch_type == ST_BRANCH_TO_THUMB)
10826             value |= 1;
10827           break;
10828         }
10829
10830       bfd_put_32 (input_bfd, value, hit_data);
10831       return bfd_reloc_ok;
10832
10833     case R_ARM_ABS8:
10834       /* PR 16202: Refectch the addend using the correct size.  */
10835       if (globals->use_rel)
10836         addend = bfd_get_8 (input_bfd, hit_data);
10837       value += addend;
10838
10839       /* There is no way to tell whether the user intended to use a signed or
10840          unsigned addend.  When checking for overflow we accept either,
10841          as specified by the AAELF.  */
10842       if ((long) value > 0xff || (long) value < -0x80)
10843         return bfd_reloc_overflow;
10844
10845       bfd_put_8 (input_bfd, value, hit_data);
10846       return bfd_reloc_ok;
10847
10848     case R_ARM_ABS16:
10849       /* PR 16202: Refectch the addend using the correct size.  */
10850       if (globals->use_rel)
10851         addend = bfd_get_16 (input_bfd, hit_data);
10852       value += addend;
10853
10854       /* See comment for R_ARM_ABS8.  */
10855       if ((long) value > 0xffff || (long) value < -0x8000)
10856         return bfd_reloc_overflow;
10857
10858       bfd_put_16 (input_bfd, value, hit_data);
10859       return bfd_reloc_ok;
10860
10861     case R_ARM_THM_ABS5:
10862       /* Support ldr and str instructions for the thumb.  */
10863       if (globals->use_rel)
10864         {
10865           /* Need to refetch addend.  */
10866           addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
10867           /* ??? Need to determine shift amount from operand size.  */
10868           addend >>= howto->rightshift;
10869         }
10870       value += addend;
10871
10872       /* ??? Isn't value unsigned?  */
10873       if ((long) value > 0x1f || (long) value < -0x10)
10874         return bfd_reloc_overflow;
10875
10876       /* ??? Value needs to be properly shifted into place first.  */
10877       value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
10878       bfd_put_16 (input_bfd, value, hit_data);
10879       return bfd_reloc_ok;
10880
10881     case R_ARM_THM_ALU_PREL_11_0:
10882       /* Corresponds to: addw.w reg, pc, #offset (and similarly for subw).  */
10883       {
10884         bfd_vma insn;
10885         bfd_signed_vma relocation;
10886
10887         insn = (bfd_get_16 (input_bfd, hit_data) << 16)
10888              | bfd_get_16 (input_bfd, hit_data + 2);
10889
10890         if (globals->use_rel)
10891           {
10892             signed_addend = (insn & 0xff) | ((insn & 0x7000) >> 4)
10893                           | ((insn & (1 << 26)) >> 15);
10894             if (insn & 0xf00000)
10895               signed_addend = -signed_addend;
10896           }
10897
10898         relocation = value + signed_addend;
10899         relocation -= Pa (input_section->output_section->vma
10900                           + input_section->output_offset
10901                           + rel->r_offset);
10902
10903         /* PR 21523: Use an absolute value.  The user of this reloc will
10904            have already selected an ADD or SUB insn appropriately.  */
10905         value = labs (relocation);
10906
10907         if (value >= 0x1000)
10908           return bfd_reloc_overflow;
10909
10910         /* Destination is Thumb.  Force bit 0 to 1 to reflect this.  */
10911         if (branch_type == ST_BRANCH_TO_THUMB)
10912           value |= 1;
10913
10914         insn = (insn & 0xfb0f8f00) | (value & 0xff)
10915              | ((value & 0x700) << 4)
10916              | ((value & 0x800) << 15);
10917         if (relocation < 0)
10918           insn |= 0xa00000;
10919
10920         bfd_put_16 (input_bfd, insn >> 16, hit_data);
10921         bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
10922
10923         return bfd_reloc_ok;
10924       }
10925
10926     case R_ARM_THM_PC8:
10927       /* PR 10073:  This reloc is not generated by the GNU toolchain,
10928          but it is supported for compatibility with third party libraries
10929          generated by other compilers, specifically the ARM/IAR.  */
10930       {
10931         bfd_vma insn;
10932         bfd_signed_vma relocation;
10933
10934         insn = bfd_get_16 (input_bfd, hit_data);
10935
10936         if (globals->use_rel)
10937           addend = ((((insn & 0x00ff) << 2) + 4) & 0x3ff) -4;
10938
10939         relocation = value + addend;
10940         relocation -= Pa (input_section->output_section->vma
10941                           + input_section->output_offset
10942                           + rel->r_offset);
10943
10944         value = relocation;
10945
10946         /* We do not check for overflow of this reloc.  Although strictly
10947            speaking this is incorrect, it appears to be necessary in order
10948            to work with IAR generated relocs.  Since GCC and GAS do not
10949            generate R_ARM_THM_PC8 relocs, the lack of a check should not be
10950            a problem for them.  */
10951         value &= 0x3fc;
10952
10953         insn = (insn & 0xff00) | (value >> 2);
10954
10955         bfd_put_16 (input_bfd, insn, hit_data);
10956
10957         return bfd_reloc_ok;
10958       }
10959
10960     case R_ARM_THM_PC12:
10961       /* Corresponds to: ldr.w reg, [pc, #offset].  */
10962       {
10963         bfd_vma insn;
10964         bfd_signed_vma relocation;
10965
10966         insn = (bfd_get_16 (input_bfd, hit_data) << 16)
10967              | bfd_get_16 (input_bfd, hit_data + 2);
10968
10969         if (globals->use_rel)
10970           {
10971             signed_addend = insn & 0xfff;
10972             if (!(insn & (1 << 23)))
10973               signed_addend = -signed_addend;
10974           }
10975
10976         relocation = value + signed_addend;
10977         relocation -= Pa (input_section->output_section->vma
10978                           + input_section->output_offset
10979                           + rel->r_offset);
10980
10981         value = relocation;
10982
10983         if (value >= 0x1000)
10984           return bfd_reloc_overflow;
10985
10986         insn = (insn & 0xff7ff000) | value;
10987         if (relocation >= 0)
10988           insn |= (1 << 23);
10989
10990         bfd_put_16 (input_bfd, insn >> 16, hit_data);
10991         bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
10992
10993         return bfd_reloc_ok;
10994       }
10995
10996     case R_ARM_THM_XPC22:
10997     case R_ARM_THM_CALL:
10998     case R_ARM_THM_JUMP24:
10999       /* Thumb BL (branch long instruction).  */
11000       {
11001         bfd_vma relocation;
11002         bfd_vma reloc_sign;
11003         bfd_boolean overflow = FALSE;
11004         bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
11005         bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
11006         bfd_signed_vma reloc_signed_max;
11007         bfd_signed_vma reloc_signed_min;
11008         bfd_vma check;
11009         bfd_signed_vma signed_check;
11010         int bitsize;
11011         const int thumb2 = using_thumb2 (globals);
11012         const int thumb2_bl = using_thumb2_bl (globals);
11013
11014         /* A branch to an undefined weak symbol is turned into a jump to
11015            the next instruction unless a PLT entry will be created.
11016            The jump to the next instruction is optimized as a NOP.W for
11017            Thumb-2 enabled architectures.  */
11018         if (h && h->root.type == bfd_link_hash_undefweak
11019             && plt_offset == (bfd_vma) -1)
11020           {
11021             if (thumb2)
11022               {
11023                 bfd_put_16 (input_bfd, 0xf3af, hit_data);
11024                 bfd_put_16 (input_bfd, 0x8000, hit_data + 2);
11025               }
11026             else
11027               {
11028                 bfd_put_16 (input_bfd, 0xe000, hit_data);
11029                 bfd_put_16 (input_bfd, 0xbf00, hit_data + 2);
11030               }
11031             return bfd_reloc_ok;
11032           }
11033
11034         /* Fetch the addend.  We use the Thumb-2 encoding (backwards compatible
11035            with Thumb-1) involving the J1 and J2 bits.  */
11036         if (globals->use_rel)
11037           {
11038             bfd_vma s = (upper_insn & (1 << 10)) >> 10;
11039             bfd_vma upper = upper_insn & 0x3ff;
11040             bfd_vma lower = lower_insn & 0x7ff;
11041             bfd_vma j1 = (lower_insn & (1 << 13)) >> 13;
11042             bfd_vma j2 = (lower_insn & (1 << 11)) >> 11;
11043             bfd_vma i1 = j1 ^ s ? 0 : 1;
11044             bfd_vma i2 = j2 ^ s ? 0 : 1;
11045
11046             addend = (i1 << 23) | (i2 << 22) | (upper << 12) | (lower << 1);
11047             /* Sign extend.  */
11048             addend = (addend | ((s ? 0 : 1) << 24)) - (1 << 24);
11049
11050             signed_addend = addend;
11051           }
11052
11053         if (r_type == R_ARM_THM_XPC22)
11054           {
11055             /* Check for Thumb to Thumb call.  */
11056             /* FIXME: Should we translate the instruction into a BL
11057                instruction instead ?  */
11058             if (branch_type == ST_BRANCH_TO_THUMB)
11059               _bfd_error_handler
11060                 (_("%pB: warning: %s BLX instruction targets"
11061                    " %s function '%s'"),
11062                  input_bfd, "Thumb",
11063                  "Thumb", h ? h->root.root.string : "(local)");
11064           }
11065         else
11066           {
11067             /* If it is not a call to Thumb, assume call to Arm.
11068                If it is a call relative to a section name, then it is not a
11069                function call at all, but rather a long jump.  Calls through
11070                the PLT do not require stubs.  */
11071             if (branch_type == ST_BRANCH_TO_ARM && plt_offset == (bfd_vma) -1)
11072               {
11073                 if (globals->use_blx && r_type == R_ARM_THM_CALL)
11074                   {
11075                     /* Convert BL to BLX.  */
11076                     lower_insn = (lower_insn & ~0x1000) | 0x0800;
11077                   }
11078                 else if ((   r_type != R_ARM_THM_CALL)
11079                          && (r_type != R_ARM_THM_JUMP24))
11080                   {
11081                     if (elf32_thumb_to_arm_stub
11082                         (info, sym_name, input_bfd, output_bfd, input_section,
11083                          hit_data, sym_sec, rel->r_offset, signed_addend, value,
11084                          error_message))
11085                       return bfd_reloc_ok;
11086                     else
11087                       return bfd_reloc_dangerous;
11088                   }
11089               }
11090             else if (branch_type == ST_BRANCH_TO_THUMB
11091                      && globals->use_blx
11092                      && r_type == R_ARM_THM_CALL)
11093               {
11094                 /* Make sure this is a BL.  */
11095                 lower_insn |= 0x1800;
11096               }
11097           }
11098
11099         enum elf32_arm_stub_type stub_type = arm_stub_none;
11100         if (r_type == R_ARM_THM_CALL || r_type == R_ARM_THM_JUMP24)
11101           {
11102             /* Check if a stub has to be inserted because the destination
11103                is too far.  */
11104             struct elf32_arm_stub_hash_entry *stub_entry;
11105             struct elf32_arm_link_hash_entry *hash;
11106
11107             hash = (struct elf32_arm_link_hash_entry *) h;
11108
11109             stub_type = arm_type_of_stub (info, input_section, rel,
11110                                           st_type, &branch_type,
11111                                           hash, value, sym_sec,
11112                                           input_bfd, sym_name);
11113
11114             if (stub_type != arm_stub_none)
11115               {
11116                 /* The target is out of reach or we are changing modes, so
11117                    redirect the branch to the local stub for this
11118                    function.  */
11119                 stub_entry = elf32_arm_get_stub_entry (input_section,
11120                                                        sym_sec, h,
11121                                                        rel, globals,
11122                                                        stub_type);
11123                 if (stub_entry != NULL)
11124                   {
11125                     value = (stub_entry->stub_offset
11126                              + stub_entry->stub_sec->output_offset
11127                              + stub_entry->stub_sec->output_section->vma);
11128
11129                     if (plt_offset != (bfd_vma) -1)
11130                       *unresolved_reloc_p = FALSE;
11131                   }
11132
11133                 /* If this call becomes a call to Arm, force BLX.  */
11134                 if (globals->use_blx && (r_type == R_ARM_THM_CALL))
11135                   {
11136                     if ((stub_entry
11137                          && !arm_stub_is_thumb (stub_entry->stub_type))
11138                         || branch_type != ST_BRANCH_TO_THUMB)
11139                       lower_insn = (lower_insn & ~0x1000) | 0x0800;
11140                   }
11141               }
11142           }
11143
11144         /* Handle calls via the PLT.  */
11145         if (stub_type == arm_stub_none && plt_offset != (bfd_vma) -1)
11146           {
11147             value = (splt->output_section->vma
11148                      + splt->output_offset
11149                      + plt_offset);
11150
11151             if (globals->use_blx
11152                 && r_type == R_ARM_THM_CALL
11153                 && ! using_thumb_only (globals))
11154               {
11155                 /* If the Thumb BLX instruction is available, convert
11156                    the BL to a BLX instruction to call the ARM-mode
11157                    PLT entry.  */
11158                 lower_insn = (lower_insn & ~0x1000) | 0x0800;
11159                 branch_type = ST_BRANCH_TO_ARM;
11160               }
11161             else
11162               {
11163                 if (! using_thumb_only (globals))
11164                   /* Target the Thumb stub before the ARM PLT entry.  */
11165                   value -= PLT_THUMB_STUB_SIZE;
11166                 branch_type = ST_BRANCH_TO_THUMB;
11167               }
11168             *unresolved_reloc_p = FALSE;
11169           }
11170
11171         relocation = value + signed_addend;
11172
11173         relocation -= (input_section->output_section->vma
11174                        + input_section->output_offset
11175                        + rel->r_offset);
11176
11177         check = relocation >> howto->rightshift;
11178
11179         /* If this is a signed value, the rightshift just dropped
11180            leading 1 bits (assuming twos complement).  */
11181         if ((bfd_signed_vma) relocation >= 0)
11182           signed_check = check;
11183         else
11184           signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
11185
11186         /* Calculate the permissable maximum and minimum values for
11187            this relocation according to whether we're relocating for
11188            Thumb-2 or not.  */
11189         bitsize = howto->bitsize;
11190         if (!thumb2_bl)
11191           bitsize -= 2;
11192         reloc_signed_max = (1 << (bitsize - 1)) - 1;
11193         reloc_signed_min = ~reloc_signed_max;
11194
11195         /* Assumes two's complement.  */
11196         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
11197           overflow = TRUE;
11198
11199         if ((lower_insn & 0x5000) == 0x4000)
11200           /* For a BLX instruction, make sure that the relocation is rounded up
11201              to a word boundary.  This follows the semantics of the instruction
11202              which specifies that bit 1 of the target address will come from bit
11203              1 of the base address.  */
11204           relocation = (relocation + 2) & ~ 3;
11205
11206         /* Put RELOCATION back into the insn.  Assumes two's complement.
11207            We use the Thumb-2 encoding, which is safe even if dealing with
11208            a Thumb-1 instruction by virtue of our overflow check above.  */
11209         reloc_sign = (signed_check < 0) ? 1 : 0;
11210         upper_insn = (upper_insn & ~(bfd_vma) 0x7ff)
11211                      | ((relocation >> 12) & 0x3ff)
11212                      | (reloc_sign << 10);
11213         lower_insn = (lower_insn & ~(bfd_vma) 0x2fff)
11214                      | (((!((relocation >> 23) & 1)) ^ reloc_sign) << 13)
11215                      | (((!((relocation >> 22) & 1)) ^ reloc_sign) << 11)
11216                      | ((relocation >> 1) & 0x7ff);
11217
11218         /* Put the relocated value back in the object file:  */
11219         bfd_put_16 (input_bfd, upper_insn, hit_data);
11220         bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
11221
11222         return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
11223       }
11224       break;
11225
11226     case R_ARM_THM_JUMP19:
11227       /* Thumb32 conditional branch instruction.  */
11228       {
11229         bfd_vma relocation;
11230         bfd_boolean overflow = FALSE;
11231         bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
11232         bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
11233         bfd_signed_vma reloc_signed_max = 0xffffe;
11234         bfd_signed_vma reloc_signed_min = -0x100000;
11235         bfd_signed_vma signed_check;
11236         enum elf32_arm_stub_type stub_type = arm_stub_none;
11237         struct elf32_arm_stub_hash_entry *stub_entry;
11238         struct elf32_arm_link_hash_entry *hash;
11239
11240         /* Need to refetch the addend, reconstruct the top three bits,
11241            and squish the two 11 bit pieces together.  */
11242         if (globals->use_rel)
11243           {
11244             bfd_vma S     = (upper_insn & 0x0400) >> 10;
11245             bfd_vma upper = (upper_insn & 0x003f);
11246             bfd_vma J1    = (lower_insn & 0x2000) >> 13;
11247             bfd_vma J2    = (lower_insn & 0x0800) >> 11;
11248             bfd_vma lower = (lower_insn & 0x07ff);
11249
11250             upper |= J1 << 6;
11251             upper |= J2 << 7;
11252             upper |= (!S) << 8;
11253             upper -= 0x0100; /* Sign extend.  */
11254
11255             addend = (upper << 12) | (lower << 1);
11256             signed_addend = addend;
11257           }
11258
11259         /* Handle calls via the PLT.  */
11260         if (plt_offset != (bfd_vma) -1)
11261           {
11262             value = (splt->output_section->vma
11263                      + splt->output_offset
11264                      + plt_offset);
11265             /* Target the Thumb stub before the ARM PLT entry.  */
11266             value -= PLT_THUMB_STUB_SIZE;
11267             *unresolved_reloc_p = FALSE;
11268           }
11269
11270         hash = (struct elf32_arm_link_hash_entry *)h;
11271
11272         stub_type = arm_type_of_stub (info, input_section, rel,
11273                                       st_type, &branch_type,
11274                                       hash, value, sym_sec,
11275                                       input_bfd, sym_name);
11276         if (stub_type != arm_stub_none)
11277           {
11278             stub_entry = elf32_arm_get_stub_entry (input_section,
11279                                                    sym_sec, h,
11280                                                    rel, globals,
11281                                                    stub_type);
11282             if (stub_entry != NULL)
11283               {
11284                 value = (stub_entry->stub_offset
11285                         + stub_entry->stub_sec->output_offset
11286                         + stub_entry->stub_sec->output_section->vma);
11287               }
11288           }
11289
11290         relocation = value + signed_addend;
11291         relocation -= (input_section->output_section->vma
11292                        + input_section->output_offset
11293                        + rel->r_offset);
11294         signed_check = (bfd_signed_vma) relocation;
11295
11296         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
11297           overflow = TRUE;
11298
11299         /* Put RELOCATION back into the insn.  */
11300         {
11301           bfd_vma S  = (relocation & 0x00100000) >> 20;
11302           bfd_vma J2 = (relocation & 0x00080000) >> 19;
11303           bfd_vma J1 = (relocation & 0x00040000) >> 18;
11304           bfd_vma hi = (relocation & 0x0003f000) >> 12;
11305           bfd_vma lo = (relocation & 0x00000ffe) >>  1;
11306
11307           upper_insn = (upper_insn & 0xfbc0) | (S << 10) | hi;
11308           lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
11309         }
11310
11311         /* Put the relocated value back in the object file:  */
11312         bfd_put_16 (input_bfd, upper_insn, hit_data);
11313         bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
11314
11315         return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
11316       }
11317
11318     case R_ARM_THM_JUMP11:
11319     case R_ARM_THM_JUMP8:
11320     case R_ARM_THM_JUMP6:
11321       /* Thumb B (branch) instruction).  */
11322       {
11323         bfd_signed_vma relocation;
11324         bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
11325         bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
11326         bfd_signed_vma signed_check;
11327
11328         /* CZB cannot jump backward.  */
11329         if (r_type == R_ARM_THM_JUMP6)
11330           reloc_signed_min = 0;
11331
11332         if (globals->use_rel)
11333           {
11334             /* Need to refetch addend.  */
11335             addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
11336             if (addend & ((howto->src_mask + 1) >> 1))
11337               {
11338                 signed_addend = -1;
11339                 signed_addend &= ~ howto->src_mask;
11340                 signed_addend |= addend;
11341               }
11342             else
11343               signed_addend = addend;
11344             /* The value in the insn has been right shifted.  We need to
11345                undo this, so that we can perform the address calculation
11346                in terms of bytes.  */
11347             signed_addend <<= howto->rightshift;
11348           }
11349         relocation = value + signed_addend;
11350
11351         relocation -= (input_section->output_section->vma
11352                        + input_section->output_offset
11353                        + rel->r_offset);
11354
11355         relocation >>= howto->rightshift;
11356         signed_check = relocation;
11357
11358         if (r_type == R_ARM_THM_JUMP6)
11359           relocation = ((relocation & 0x0020) << 4) | ((relocation & 0x001f) << 3);
11360         else
11361           relocation &= howto->dst_mask;
11362         relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
11363
11364         bfd_put_16 (input_bfd, relocation, hit_data);
11365
11366         /* Assumes two's complement.  */
11367         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
11368           return bfd_reloc_overflow;
11369
11370         return bfd_reloc_ok;
11371       }
11372
11373     case R_ARM_ALU_PCREL7_0:
11374     case R_ARM_ALU_PCREL15_8:
11375     case R_ARM_ALU_PCREL23_15:
11376       {
11377         bfd_vma insn;
11378         bfd_vma relocation;
11379
11380         insn = bfd_get_32 (input_bfd, hit_data);
11381         if (globals->use_rel)
11382           {
11383             /* Extract the addend.  */
11384             addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
11385             signed_addend = addend;
11386           }
11387         relocation = value + signed_addend;
11388
11389         relocation -= (input_section->output_section->vma
11390                        + input_section->output_offset
11391                        + rel->r_offset);
11392         insn = (insn & ~0xfff)
11393                | ((howto->bitpos << 7) & 0xf00)
11394                | ((relocation >> howto->bitpos) & 0xff);
11395         bfd_put_32 (input_bfd, value, hit_data);
11396       }
11397       return bfd_reloc_ok;
11398
11399     case R_ARM_GNU_VTINHERIT:
11400     case R_ARM_GNU_VTENTRY:
11401       return bfd_reloc_ok;
11402
11403     case R_ARM_GOTOFF32:
11404       /* Relocation is relative to the start of the
11405          global offset table.  */
11406
11407       BFD_ASSERT (sgot != NULL);
11408       if (sgot == NULL)
11409         return bfd_reloc_notsupported;
11410
11411       /* If we are addressing a Thumb function, we need to adjust the
11412          address by one, so that attempts to call the function pointer will
11413          correctly interpret it as Thumb code.  */
11414       if (branch_type == ST_BRANCH_TO_THUMB)
11415         value += 1;
11416
11417       /* Note that sgot->output_offset is not involved in this
11418          calculation.  We always want the start of .got.  If we
11419          define _GLOBAL_OFFSET_TABLE in a different way, as is
11420          permitted by the ABI, we might have to change this
11421          calculation.  */
11422       value -= sgot->output_section->vma;
11423       return _bfd_final_link_relocate (howto, input_bfd, input_section,
11424                                        contents, rel->r_offset, value,
11425                                        rel->r_addend);
11426
11427     case R_ARM_GOTPC:
11428       /* Use global offset table as symbol value.  */
11429       BFD_ASSERT (sgot != NULL);
11430
11431       if (sgot == NULL)
11432         return bfd_reloc_notsupported;
11433
11434       *unresolved_reloc_p = FALSE;
11435       value = sgot->output_section->vma;
11436       return _bfd_final_link_relocate (howto, input_bfd, input_section,
11437                                        contents, rel->r_offset, value,
11438                                        rel->r_addend);
11439
11440     case R_ARM_GOT32:
11441     case R_ARM_GOT_PREL:
11442       /* Relocation is to the entry for this symbol in the
11443          global offset table.  */
11444       if (sgot == NULL)
11445         return bfd_reloc_notsupported;
11446
11447       if (dynreloc_st_type == STT_GNU_IFUNC
11448           && plt_offset != (bfd_vma) -1
11449           && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, h)))
11450         {
11451           /* We have a relocation against a locally-binding STT_GNU_IFUNC
11452              symbol, and the relocation resolves directly to the runtime
11453              target rather than to the .iplt entry.  This means that any
11454              .got entry would be the same value as the .igot.plt entry,
11455              so there's no point creating both.  */
11456           sgot = globals->root.igotplt;
11457           value = sgot->output_offset + gotplt_offset;
11458         }
11459       else if (h != NULL)
11460         {
11461           bfd_vma off;
11462
11463           off = h->got.offset;
11464           BFD_ASSERT (off != (bfd_vma) -1);
11465           if ((off & 1) != 0)
11466             {
11467               /* We have already processsed one GOT relocation against
11468                  this symbol.  */
11469               off &= ~1;
11470               if (globals->root.dynamic_sections_created
11471                   && !SYMBOL_REFERENCES_LOCAL (info, h))
11472                 *unresolved_reloc_p = FALSE;
11473             }
11474           else
11475             {
11476               Elf_Internal_Rela outrel;
11477               int isrofixup = 0;
11478
11479               if (((h->dynindx != -1) || globals->fdpic_p)
11480                   && !SYMBOL_REFERENCES_LOCAL (info, h))
11481                 {
11482                   /* If the symbol doesn't resolve locally in a static
11483                      object, we have an undefined reference.  If the
11484                      symbol doesn't resolve locally in a dynamic object,
11485                      it should be resolved by the dynamic linker.  */
11486                   if (globals->root.dynamic_sections_created)
11487                     {
11488                       outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
11489                       *unresolved_reloc_p = FALSE;
11490                     }
11491                   else
11492                     outrel.r_info = 0;
11493                   outrel.r_addend = 0;
11494                 }
11495               else
11496                 {
11497                   if (dynreloc_st_type == STT_GNU_IFUNC)
11498                     outrel.r_info = ELF32_R_INFO (0, R_ARM_IRELATIVE);
11499                   else if (bfd_link_pic (info)
11500                            && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
11501                                || h->root.type != bfd_link_hash_undefweak))
11502                     outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
11503                   else if (globals->fdpic_p)
11504                     isrofixup = 1;
11505                   else
11506                     outrel.r_info = 0;
11507                   outrel.r_addend = dynreloc_value;
11508                 }
11509
11510               /* The GOT entry is initialized to zero by default.
11511                  See if we should install a different value.  */
11512               if (outrel.r_addend != 0
11513                   && (outrel.r_info == 0 || globals->use_rel || isrofixup))
11514                 {
11515                   bfd_put_32 (output_bfd, outrel.r_addend,
11516                               sgot->contents + off);
11517                   outrel.r_addend = 0;
11518                 }
11519
11520               if (outrel.r_info != 0 && !isrofixup)
11521                 {
11522                   outrel.r_offset = (sgot->output_section->vma
11523                                      + sgot->output_offset
11524                                      + off);
11525                   elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
11526                 }
11527               else if (isrofixup)
11528                 {
11529                   arm_elf_add_rofixup(output_bfd,
11530                                       elf32_arm_hash_table(info)->srofixup,
11531                                       sgot->output_section->vma
11532                                       + sgot->output_offset + off);
11533                 }
11534               h->got.offset |= 1;
11535             }
11536           value = sgot->output_offset + off;
11537         }
11538       else
11539         {
11540           bfd_vma off;
11541
11542           BFD_ASSERT (local_got_offsets != NULL
11543                       && local_got_offsets[r_symndx] != (bfd_vma) -1);
11544
11545           off = local_got_offsets[r_symndx];
11546
11547           /* The offset must always be a multiple of 4.  We use the
11548              least significant bit to record whether we have already
11549              generated the necessary reloc.  */
11550           if ((off & 1) != 0)
11551             off &= ~1;
11552           else
11553             {
11554               if (globals->use_rel)
11555                 bfd_put_32 (output_bfd, dynreloc_value, sgot->contents + off);
11556
11557               if (bfd_link_pic (info) || dynreloc_st_type == STT_GNU_IFUNC)
11558                 {
11559                   Elf_Internal_Rela outrel;
11560
11561                   outrel.r_addend = addend + dynreloc_value;
11562                   outrel.r_offset = (sgot->output_section->vma
11563                                      + sgot->output_offset
11564                                      + off);
11565                   if (dynreloc_st_type == STT_GNU_IFUNC)
11566                     outrel.r_info = ELF32_R_INFO (0, R_ARM_IRELATIVE);
11567                   else
11568                     outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
11569                   elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
11570                 }
11571               else if (globals->fdpic_p)
11572                 {
11573                   /* For FDPIC executables, we use rofixup to fix
11574                      address at runtime.  */
11575                   arm_elf_add_rofixup(output_bfd, globals->srofixup,
11576                                       sgot->output_section->vma + sgot->output_offset
11577                                       + off);
11578                 }
11579
11580               local_got_offsets[r_symndx] |= 1;
11581             }
11582
11583           value = sgot->output_offset + off;
11584         }
11585       if (r_type != R_ARM_GOT32)
11586         value += sgot->output_section->vma;
11587
11588       return _bfd_final_link_relocate (howto, input_bfd, input_section,
11589                                        contents, rel->r_offset, value,
11590                                        rel->r_addend);
11591
11592     case R_ARM_TLS_LDO32:
11593       value = value - dtpoff_base (info);
11594
11595       return _bfd_final_link_relocate (howto, input_bfd, input_section,
11596                                        contents, rel->r_offset, value,
11597                                        rel->r_addend);
11598
11599     case R_ARM_TLS_LDM32:
11600     case R_ARM_TLS_LDM32_FDPIC:
11601       {
11602         bfd_vma off;
11603
11604         if (sgot == NULL)
11605           abort ();
11606
11607         off = globals->tls_ldm_got.offset;
11608
11609         if ((off & 1) != 0)
11610           off &= ~1;
11611         else
11612           {
11613             /* If we don't know the module number, create a relocation
11614                for it.  */
11615             if (bfd_link_pic (info))
11616               {
11617                 Elf_Internal_Rela outrel;
11618
11619                 if (srelgot == NULL)
11620                   abort ();
11621
11622                 outrel.r_addend = 0;
11623                 outrel.r_offset = (sgot->output_section->vma
11624                                    + sgot->output_offset + off);
11625                 outrel.r_info = ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32);
11626
11627                 if (globals->use_rel)
11628                   bfd_put_32 (output_bfd, outrel.r_addend,
11629                               sgot->contents + off);
11630
11631                 elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
11632               }
11633             else
11634               bfd_put_32 (output_bfd, 1, sgot->contents + off);
11635
11636             globals->tls_ldm_got.offset |= 1;
11637           }
11638
11639         if (r_type == R_ARM_TLS_LDM32_FDPIC)
11640           {
11641             bfd_put_32(output_bfd,
11642                        globals->root.sgot->output_offset + off,
11643                        contents + rel->r_offset);
11644
11645             return bfd_reloc_ok;
11646           }
11647         else
11648           {
11649             value = sgot->output_section->vma + sgot->output_offset + off
11650               - (input_section->output_section->vma
11651                  + input_section->output_offset + rel->r_offset);
11652
11653             return _bfd_final_link_relocate (howto, input_bfd, input_section,
11654                                              contents, rel->r_offset, value,
11655                                              rel->r_addend);
11656           }
11657       }
11658
11659     case R_ARM_TLS_CALL:
11660     case R_ARM_THM_TLS_CALL:
11661     case R_ARM_TLS_GD32:
11662     case R_ARM_TLS_GD32_FDPIC:
11663     case R_ARM_TLS_IE32:
11664     case R_ARM_TLS_IE32_FDPIC:
11665     case R_ARM_TLS_GOTDESC:
11666     case R_ARM_TLS_DESCSEQ:
11667     case R_ARM_THM_TLS_DESCSEQ:
11668       {
11669         bfd_vma off, offplt;
11670         int indx = 0;
11671         char tls_type;
11672
11673         BFD_ASSERT (sgot != NULL);
11674
11675         if (h != NULL)
11676           {
11677             bfd_boolean dyn;
11678             dyn = globals->root.dynamic_sections_created;
11679             if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
11680                                                  bfd_link_pic (info),
11681                                                  h)
11682                 && (!bfd_link_pic (info)
11683                     || !SYMBOL_REFERENCES_LOCAL (info, h)))
11684               {
11685                 *unresolved_reloc_p = FALSE;
11686                 indx = h->dynindx;
11687               }
11688             off = h->got.offset;
11689             offplt = elf32_arm_hash_entry (h)->tlsdesc_got;
11690             tls_type = ((struct elf32_arm_link_hash_entry *) h)->tls_type;
11691           }
11692         else
11693           {
11694             BFD_ASSERT (local_got_offsets != NULL);
11695             off = local_got_offsets[r_symndx];
11696             offplt = local_tlsdesc_gotents[r_symndx];
11697             tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
11698           }
11699
11700         /* Linker relaxations happens from one of the
11701            R_ARM_{GOTDESC,CALL,DESCSEQ} relocations to IE or LE.  */
11702         if (ELF32_R_TYPE(rel->r_info) != r_type)
11703           tls_type = GOT_TLS_IE;
11704
11705         BFD_ASSERT (tls_type != GOT_UNKNOWN);
11706
11707         if ((off & 1) != 0)
11708           off &= ~1;
11709         else
11710           {
11711             bfd_boolean need_relocs = FALSE;
11712             Elf_Internal_Rela outrel;
11713             int cur_off = off;
11714
11715             /* The GOT entries have not been initialized yet.  Do it
11716                now, and emit any relocations.  If both an IE GOT and a
11717                GD GOT are necessary, we emit the GD first.  */
11718
11719             if ((bfd_link_pic (info) || indx != 0)
11720                 && (h == NULL
11721                     || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
11722                         && !resolved_to_zero)
11723                     || h->root.type != bfd_link_hash_undefweak))
11724               {
11725                 need_relocs = TRUE;
11726                 BFD_ASSERT (srelgot != NULL);
11727               }
11728
11729             if (tls_type & GOT_TLS_GDESC)
11730               {
11731                 bfd_byte *loc;
11732
11733                 /* We should have relaxed, unless this is an undefined
11734                    weak symbol.  */
11735                 BFD_ASSERT ((h && (h->root.type == bfd_link_hash_undefweak))
11736                             || bfd_link_pic (info));
11737                 BFD_ASSERT (globals->sgotplt_jump_table_size + offplt + 8
11738                             <= globals->root.sgotplt->size);
11739
11740                 outrel.r_addend = 0;
11741                 outrel.r_offset = (globals->root.sgotplt->output_section->vma
11742                                    + globals->root.sgotplt->output_offset
11743                                    + offplt
11744                                    + globals->sgotplt_jump_table_size);
11745
11746                 outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DESC);
11747                 sreloc = globals->root.srelplt;
11748                 loc = sreloc->contents;
11749                 loc += globals->next_tls_desc_index++ * RELOC_SIZE (globals);
11750                 BFD_ASSERT (loc + RELOC_SIZE (globals)
11751                            <= sreloc->contents + sreloc->size);
11752
11753                 SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
11754
11755                 /* For globals, the first word in the relocation gets
11756                    the relocation index and the top bit set, or zero,
11757                    if we're binding now.  For locals, it gets the
11758                    symbol's offset in the tls section.  */
11759                 bfd_put_32 (output_bfd,
11760                             !h ? value - elf_hash_table (info)->tls_sec->vma
11761                             : info->flags & DF_BIND_NOW ? 0
11762                             : 0x80000000 | ELF32_R_SYM (outrel.r_info),
11763                             globals->root.sgotplt->contents + offplt
11764                             + globals->sgotplt_jump_table_size);
11765
11766                 /* Second word in the relocation is always zero.  */
11767                 bfd_put_32 (output_bfd, 0,
11768                             globals->root.sgotplt->contents + offplt
11769                             + globals->sgotplt_jump_table_size + 4);
11770               }
11771             if (tls_type & GOT_TLS_GD)
11772               {
11773                 if (need_relocs)
11774                   {
11775                     outrel.r_addend = 0;
11776                     outrel.r_offset = (sgot->output_section->vma
11777                                        + sgot->output_offset
11778                                        + cur_off);
11779                     outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DTPMOD32);
11780
11781                     if (globals->use_rel)
11782                       bfd_put_32 (output_bfd, outrel.r_addend,
11783                                   sgot->contents + cur_off);
11784
11785                     elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
11786
11787                     if (indx == 0)
11788                       bfd_put_32 (output_bfd, value - dtpoff_base (info),
11789                                   sgot->contents + cur_off + 4);
11790                     else
11791                       {
11792                         outrel.r_addend = 0;
11793                         outrel.r_info = ELF32_R_INFO (indx,
11794                                                       R_ARM_TLS_DTPOFF32);
11795                         outrel.r_offset += 4;
11796
11797                         if (globals->use_rel)
11798                           bfd_put_32 (output_bfd, outrel.r_addend,
11799                                       sgot->contents + cur_off + 4);
11800
11801                         elf32_arm_add_dynreloc (output_bfd, info,
11802                                                 srelgot, &outrel);
11803                       }
11804                   }
11805                 else
11806                   {
11807                     /* If we are not emitting relocations for a
11808                        general dynamic reference, then we must be in a
11809                        static link or an executable link with the
11810                        symbol binding locally.  Mark it as belonging
11811                        to module 1, the executable.  */
11812                     bfd_put_32 (output_bfd, 1,
11813                                 sgot->contents + cur_off);
11814                     bfd_put_32 (output_bfd, value - dtpoff_base (info),
11815                                 sgot->contents + cur_off + 4);
11816                   }
11817
11818                 cur_off += 8;
11819               }
11820
11821             if (tls_type & GOT_TLS_IE)
11822               {
11823                 if (need_relocs)
11824                   {
11825                     if (indx == 0)
11826                       outrel.r_addend = value - dtpoff_base (info);
11827                     else
11828                       outrel.r_addend = 0;
11829                     outrel.r_offset = (sgot->output_section->vma
11830                                        + sgot->output_offset
11831                                        + cur_off);
11832                     outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_TPOFF32);
11833
11834                     if (globals->use_rel)
11835                       bfd_put_32 (output_bfd, outrel.r_addend,
11836                                   sgot->contents + cur_off);
11837
11838                     elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
11839                   }
11840                 else
11841                   bfd_put_32 (output_bfd, tpoff (info, value),
11842                               sgot->contents + cur_off);
11843                 cur_off += 4;
11844               }
11845
11846             if (h != NULL)
11847               h->got.offset |= 1;
11848             else
11849               local_got_offsets[r_symndx] |= 1;
11850           }
11851
11852         if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32 && r_type != R_ARM_TLS_GD32_FDPIC)
11853           off += 8;
11854         else if (tls_type & GOT_TLS_GDESC)
11855           off = offplt;
11856
11857         if (ELF32_R_TYPE(rel->r_info) == R_ARM_TLS_CALL
11858             || ELF32_R_TYPE(rel->r_info) == R_ARM_THM_TLS_CALL)
11859           {
11860             bfd_signed_vma offset;
11861             /* TLS stubs are arm mode.  The original symbol is a
11862                data object, so branch_type is bogus.  */
11863             branch_type = ST_BRANCH_TO_ARM;
11864             enum elf32_arm_stub_type stub_type
11865               = arm_type_of_stub (info, input_section, rel,
11866                                   st_type, &branch_type,
11867                                   (struct elf32_arm_link_hash_entry *)h,
11868                                   globals->tls_trampoline, globals->root.splt,
11869                                   input_bfd, sym_name);
11870
11871             if (stub_type != arm_stub_none)
11872               {
11873                 struct elf32_arm_stub_hash_entry *stub_entry
11874                   = elf32_arm_get_stub_entry
11875                   (input_section, globals->root.splt, 0, rel,
11876                    globals, stub_type);
11877                 offset = (stub_entry->stub_offset
11878                           + stub_entry->stub_sec->output_offset
11879                           + stub_entry->stub_sec->output_section->vma);
11880               }
11881             else
11882               offset = (globals->root.splt->output_section->vma
11883                         + globals->root.splt->output_offset
11884                         + globals->tls_trampoline);
11885
11886             if (ELF32_R_TYPE(rel->r_info) == R_ARM_TLS_CALL)
11887               {
11888                 unsigned long inst;
11889
11890                 offset -= (input_section->output_section->vma
11891                            + input_section->output_offset
11892                            + rel->r_offset + 8);
11893
11894                 inst = offset >> 2;
11895                 inst &= 0x00ffffff;
11896                 value = inst | (globals->use_blx ? 0xfa000000 : 0xeb000000);
11897               }
11898             else
11899               {
11900                 /* Thumb blx encodes the offset in a complicated
11901                    fashion.  */
11902                 unsigned upper_insn, lower_insn;
11903                 unsigned neg;
11904
11905                 offset -= (input_section->output_section->vma
11906                            + input_section->output_offset
11907                            + rel->r_offset + 4);
11908
11909                 if (stub_type != arm_stub_none
11910                     && arm_stub_is_thumb (stub_type))
11911                   {
11912                     lower_insn = 0xd000;
11913                   }
11914                 else
11915                   {
11916                     lower_insn = 0xc000;
11917                     /* Round up the offset to a word boundary.  */
11918                     offset = (offset + 2) & ~2;
11919                   }
11920
11921                 neg = offset < 0;
11922                 upper_insn = (0xf000
11923                               | ((offset >> 12) & 0x3ff)
11924                               | (neg << 10));
11925                 lower_insn |= (((!((offset >> 23) & 1)) ^ neg) << 13)
11926                               | (((!((offset >> 22) & 1)) ^ neg) << 11)
11927                               | ((offset >> 1) & 0x7ff);
11928                 bfd_put_16 (input_bfd, upper_insn, hit_data);
11929                 bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
11930                 return bfd_reloc_ok;
11931               }
11932           }
11933         /* These relocations needs special care, as besides the fact
11934            they point somewhere in .gotplt, the addend must be
11935            adjusted accordingly depending on the type of instruction
11936            we refer to.  */
11937         else if ((r_type == R_ARM_TLS_GOTDESC) && (tls_type & GOT_TLS_GDESC))
11938           {
11939             unsigned long data, insn;
11940             unsigned thumb;
11941
11942             data = bfd_get_32 (input_bfd, hit_data);
11943             thumb = data & 1;
11944             data &= ~1u;
11945
11946             if (thumb)
11947               {
11948                 insn = bfd_get_16 (input_bfd, contents + rel->r_offset - data);
11949                 if ((insn & 0xf000) == 0xf000 || (insn & 0xf800) == 0xe800)
11950                   insn = (insn << 16)
11951                     | bfd_get_16 (input_bfd,
11952                                   contents + rel->r_offset - data + 2);
11953                 if ((insn & 0xf800c000) == 0xf000c000)
11954                   /* bl/blx */
11955                   value = -6;
11956                 else if ((insn & 0xffffff00) == 0x4400)
11957                   /* add */
11958                   value = -5;
11959                 else
11960                   {
11961                     _bfd_error_handler
11962                       /* xgettext:c-format */
11963                       (_("%pB(%pA+%#" PRIx64 "): "
11964                          "unexpected %s instruction '%#lx' "
11965                          "referenced by TLS_GOTDESC"),
11966                        input_bfd, input_section, (uint64_t) rel->r_offset,
11967                        "Thumb", insn);
11968                     return bfd_reloc_notsupported;
11969                   }
11970               }
11971             else
11972               {
11973                 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - data);
11974
11975                 switch (insn >> 24)
11976                   {
11977                   case 0xeb:  /* bl */
11978                   case 0xfa:  /* blx */
11979                     value = -4;
11980                     break;
11981
11982                   case 0xe0:    /* add */
11983                     value = -8;
11984                     break;
11985
11986                   default:
11987                     _bfd_error_handler
11988                       /* xgettext:c-format */
11989                       (_("%pB(%pA+%#" PRIx64 "): "
11990                          "unexpected %s instruction '%#lx' "
11991                          "referenced by TLS_GOTDESC"),
11992                        input_bfd, input_section, (uint64_t) rel->r_offset,
11993                        "ARM", insn);
11994                     return bfd_reloc_notsupported;
11995                   }
11996               }
11997
11998             value += ((globals->root.sgotplt->output_section->vma
11999                        + globals->root.sgotplt->output_offset + off)
12000                       - (input_section->output_section->vma
12001                          + input_section->output_offset
12002                          + rel->r_offset)
12003                       + globals->sgotplt_jump_table_size);
12004           }
12005         else
12006           value = ((globals->root.sgot->output_section->vma
12007                     + globals->root.sgot->output_offset + off)
12008                    - (input_section->output_section->vma
12009                       + input_section->output_offset + rel->r_offset));
12010
12011         if (globals->fdpic_p && (r_type == R_ARM_TLS_GD32_FDPIC ||
12012                                  r_type == R_ARM_TLS_IE32_FDPIC))
12013           {
12014             /* For FDPIC relocations, resolve to the offset of the GOT
12015                entry from the start of GOT.  */
12016             bfd_put_32(output_bfd,
12017                        globals->root.sgot->output_offset + off,
12018                        contents + rel->r_offset);
12019
12020             return bfd_reloc_ok;
12021           }
12022         else
12023           {
12024             return _bfd_final_link_relocate (howto, input_bfd, input_section,
12025                                              contents, rel->r_offset, value,
12026                                              rel->r_addend);
12027           }
12028       }
12029
12030     case R_ARM_TLS_LE32:
12031       if (bfd_link_dll (info))
12032         {
12033           _bfd_error_handler
12034             /* xgettext:c-format */
12035             (_("%pB(%pA+%#" PRIx64 "): %s relocation not permitted "
12036                "in shared object"),
12037              input_bfd, input_section, (uint64_t) rel->r_offset, howto->name);
12038           return bfd_reloc_notsupported;
12039         }
12040       else
12041         value = tpoff (info, value);
12042
12043       return _bfd_final_link_relocate (howto, input_bfd, input_section,
12044                                        contents, rel->r_offset, value,
12045                                        rel->r_addend);
12046
12047     case R_ARM_V4BX:
12048       if (globals->fix_v4bx)
12049         {
12050           bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
12051
12052           /* Ensure that we have a BX instruction.  */
12053           BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
12054
12055           if (globals->fix_v4bx == 2 && (insn & 0xf) != 0xf)
12056             {
12057               /* Branch to veneer.  */
12058               bfd_vma glue_addr;
12059               glue_addr = elf32_arm_bx_glue (info, insn & 0xf);
12060               glue_addr -= input_section->output_section->vma
12061                            + input_section->output_offset
12062                            + rel->r_offset + 8;
12063               insn = (insn & 0xf0000000) | 0x0a000000
12064                      | ((glue_addr >> 2) & 0x00ffffff);
12065             }
12066           else
12067             {
12068               /* Preserve Rm (lowest four bits) and the condition code
12069                  (highest four bits). Other bits encode MOV PC,Rm.  */
12070               insn = (insn & 0xf000000f) | 0x01a0f000;
12071             }
12072
12073           bfd_put_32 (input_bfd, insn, hit_data);
12074         }
12075       return bfd_reloc_ok;
12076
12077     case R_ARM_MOVW_ABS_NC:
12078     case R_ARM_MOVT_ABS:
12079     case R_ARM_MOVW_PREL_NC:
12080     case R_ARM_MOVT_PREL:
12081     /* Until we properly support segment-base-relative addressing then
12082        we assume the segment base to be zero, as for the group relocations.
12083        Thus R_ARM_MOVW_BREL_NC has the same semantics as R_ARM_MOVW_ABS_NC
12084        and R_ARM_MOVT_BREL has the same semantics as R_ARM_MOVT_ABS.  */
12085     case R_ARM_MOVW_BREL_NC:
12086     case R_ARM_MOVW_BREL:
12087     case R_ARM_MOVT_BREL:
12088       {
12089         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
12090
12091         if (globals->use_rel)
12092           {
12093             addend = ((insn >> 4) & 0xf000) | (insn & 0xfff);
12094             signed_addend = (addend ^ 0x8000) - 0x8000;
12095           }
12096
12097         value += signed_addend;
12098
12099         if (r_type == R_ARM_MOVW_PREL_NC || r_type == R_ARM_MOVT_PREL)
12100           value -= (input_section->output_section->vma
12101                     + input_section->output_offset + rel->r_offset);
12102
12103         if (r_type == R_ARM_MOVW_BREL && value >= 0x10000)
12104           return bfd_reloc_overflow;
12105
12106         if (branch_type == ST_BRANCH_TO_THUMB)
12107           value |= 1;
12108
12109         if (r_type == R_ARM_MOVT_ABS || r_type == R_ARM_MOVT_PREL
12110             || r_type == R_ARM_MOVT_BREL)
12111           value >>= 16;
12112
12113         insn &= 0xfff0f000;
12114         insn |= value & 0xfff;
12115         insn |= (value & 0xf000) << 4;
12116         bfd_put_32 (input_bfd, insn, hit_data);
12117       }
12118       return bfd_reloc_ok;
12119
12120     case R_ARM_THM_MOVW_ABS_NC:
12121     case R_ARM_THM_MOVT_ABS:
12122     case R_ARM_THM_MOVW_PREL_NC:
12123     case R_ARM_THM_MOVT_PREL:
12124     /* Until we properly support segment-base-relative addressing then
12125        we assume the segment base to be zero, as for the above relocations.
12126        Thus R_ARM_THM_MOVW_BREL_NC has the same semantics as
12127        R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_BREL has the same semantics
12128        as R_ARM_THM_MOVT_ABS.  */
12129     case R_ARM_THM_MOVW_BREL_NC:
12130     case R_ARM_THM_MOVW_BREL:
12131     case R_ARM_THM_MOVT_BREL:
12132       {
12133         bfd_vma insn;
12134
12135         insn = bfd_get_16 (input_bfd, hit_data) << 16;
12136         insn |= bfd_get_16 (input_bfd, hit_data + 2);
12137
12138         if (globals->use_rel)
12139           {
12140             addend = ((insn >> 4)  & 0xf000)
12141                    | ((insn >> 15) & 0x0800)
12142                    | ((insn >> 4)  & 0x0700)
12143                    | (insn         & 0x00ff);
12144             signed_addend = (addend ^ 0x8000) - 0x8000;
12145           }
12146
12147         value += signed_addend;
12148
12149         if (r_type == R_ARM_THM_MOVW_PREL_NC || r_type == R_ARM_THM_MOVT_PREL)
12150           value -= (input_section->output_section->vma
12151                     + input_section->output_offset + rel->r_offset);
12152
12153         if (r_type == R_ARM_THM_MOVW_BREL && value >= 0x10000)
12154           return bfd_reloc_overflow;
12155
12156         if (branch_type == ST_BRANCH_TO_THUMB)
12157           value |= 1;
12158
12159         if (r_type == R_ARM_THM_MOVT_ABS || r_type == R_ARM_THM_MOVT_PREL
12160             || r_type == R_ARM_THM_MOVT_BREL)
12161           value >>= 16;
12162
12163         insn &= 0xfbf08f00;
12164         insn |= (value & 0xf000) << 4;
12165         insn |= (value & 0x0800) << 15;
12166         insn |= (value & 0x0700) << 4;
12167         insn |= (value & 0x00ff);
12168
12169         bfd_put_16 (input_bfd, insn >> 16, hit_data);
12170         bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
12171       }
12172       return bfd_reloc_ok;
12173
12174     case R_ARM_ALU_PC_G0_NC:
12175     case R_ARM_ALU_PC_G1_NC:
12176     case R_ARM_ALU_PC_G0:
12177     case R_ARM_ALU_PC_G1:
12178     case R_ARM_ALU_PC_G2:
12179     case R_ARM_ALU_SB_G0_NC:
12180     case R_ARM_ALU_SB_G1_NC:
12181     case R_ARM_ALU_SB_G0:
12182     case R_ARM_ALU_SB_G1:
12183     case R_ARM_ALU_SB_G2:
12184       {
12185         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
12186         bfd_vma pc = input_section->output_section->vma
12187                      + input_section->output_offset + rel->r_offset;
12188         /* sb is the origin of the *segment* containing the symbol.  */
12189         bfd_vma sb = sym_sec ? sym_sec->output_section->vma : 0;
12190         bfd_vma residual;
12191         bfd_vma g_n;
12192         bfd_signed_vma signed_value;
12193         int group = 0;
12194
12195         /* Determine which group of bits to select.  */
12196         switch (r_type)
12197           {
12198           case R_ARM_ALU_PC_G0_NC:
12199           case R_ARM_ALU_PC_G0:
12200           case R_ARM_ALU_SB_G0_NC:
12201           case R_ARM_ALU_SB_G0:
12202             group = 0;
12203             break;
12204
12205           case R_ARM_ALU_PC_G1_NC:
12206           case R_ARM_ALU_PC_G1:
12207           case R_ARM_ALU_SB_G1_NC:
12208           case R_ARM_ALU_SB_G1:
12209             group = 1;
12210             break;
12211
12212           case R_ARM_ALU_PC_G2:
12213           case R_ARM_ALU_SB_G2:
12214             group = 2;
12215             break;
12216
12217           default:
12218             abort ();
12219           }
12220
12221         /* If REL, extract the addend from the insn.  If RELA, it will
12222            have already been fetched for us.  */
12223         if (globals->use_rel)
12224           {
12225             int negative;
12226             bfd_vma constant = insn & 0xff;
12227             bfd_vma rotation = (insn & 0xf00) >> 8;
12228
12229             if (rotation == 0)
12230               signed_addend = constant;
12231             else
12232               {
12233                 /* Compensate for the fact that in the instruction, the
12234                    rotation is stored in multiples of 2 bits.  */
12235                 rotation *= 2;
12236
12237                 /* Rotate "constant" right by "rotation" bits.  */
12238                 signed_addend = (constant >> rotation) |
12239                                 (constant << (8 * sizeof (bfd_vma) - rotation));
12240               }
12241
12242             /* Determine if the instruction is an ADD or a SUB.
12243                (For REL, this determines the sign of the addend.)  */
12244             negative = identify_add_or_sub (insn);
12245             if (negative == 0)
12246               {
12247                 _bfd_error_handler
12248                   /* xgettext:c-format */
12249                   (_("%pB(%pA+%#" PRIx64 "): only ADD or SUB instructions "
12250                      "are allowed for ALU group relocations"),
12251                   input_bfd, input_section, (uint64_t) rel->r_offset);
12252                 return bfd_reloc_overflow;
12253               }
12254
12255             signed_addend *= negative;
12256           }
12257
12258         /* Compute the value (X) to go in the place.  */
12259         if (r_type == R_ARM_ALU_PC_G0_NC
12260             || r_type == R_ARM_ALU_PC_G1_NC
12261             || r_type == R_ARM_ALU_PC_G0
12262             || r_type == R_ARM_ALU_PC_G1
12263             || r_type == R_ARM_ALU_PC_G2)
12264           /* PC relative.  */
12265           signed_value = value - pc + signed_addend;
12266         else
12267           /* Section base relative.  */
12268           signed_value = value - sb + signed_addend;
12269
12270         /* If the target symbol is a Thumb function, then set the
12271            Thumb bit in the address.  */
12272         if (branch_type == ST_BRANCH_TO_THUMB)
12273           signed_value |= 1;
12274
12275         /* Calculate the value of the relevant G_n, in encoded
12276            constant-with-rotation format.  */
12277         g_n = calculate_group_reloc_mask (signed_value < 0 ? - signed_value : signed_value,
12278                                           group, &residual);
12279
12280         /* Check for overflow if required.  */
12281         if ((r_type == R_ARM_ALU_PC_G0
12282              || r_type == R_ARM_ALU_PC_G1
12283              || r_type == R_ARM_ALU_PC_G2
12284              || r_type == R_ARM_ALU_SB_G0
12285              || r_type == R_ARM_ALU_SB_G1
12286              || r_type == R_ARM_ALU_SB_G2) && residual != 0)
12287           {
12288             _bfd_error_handler
12289               /* xgettext:c-format */
12290               (_("%pB(%pA+%#" PRIx64 "): overflow whilst "
12291                  "splitting %#" PRIx64 " for group relocation %s"),
12292                input_bfd, input_section, (uint64_t) rel->r_offset,
12293                (uint64_t) (signed_value < 0 ? -signed_value : signed_value),
12294                howto->name);
12295             return bfd_reloc_overflow;
12296           }
12297
12298         /* Mask out the value and the ADD/SUB part of the opcode; take care
12299            not to destroy the S bit.  */
12300         insn &= 0xff1ff000;
12301
12302         /* Set the opcode according to whether the value to go in the
12303            place is negative.  */
12304         if (signed_value < 0)
12305           insn |= 1 << 22;
12306         else
12307           insn |= 1 << 23;
12308
12309         /* Encode the offset.  */
12310         insn |= g_n;
12311
12312         bfd_put_32 (input_bfd, insn, hit_data);
12313       }
12314       return bfd_reloc_ok;
12315
12316     case R_ARM_LDR_PC_G0:
12317     case R_ARM_LDR_PC_G1:
12318     case R_ARM_LDR_PC_G2:
12319     case R_ARM_LDR_SB_G0:
12320     case R_ARM_LDR_SB_G1:
12321     case R_ARM_LDR_SB_G2:
12322       {
12323         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
12324         bfd_vma pc = input_section->output_section->vma
12325                      + input_section->output_offset + rel->r_offset;
12326         /* sb is the origin of the *segment* containing the symbol.  */
12327         bfd_vma sb = sym_sec ? sym_sec->output_section->vma : 0;
12328         bfd_vma residual;
12329         bfd_signed_vma signed_value;
12330         int group = 0;
12331
12332         /* Determine which groups of bits to calculate.  */
12333         switch (r_type)
12334           {
12335           case R_ARM_LDR_PC_G0:
12336           case R_ARM_LDR_SB_G0:
12337             group = 0;
12338             break;
12339
12340           case R_ARM_LDR_PC_G1:
12341           case R_ARM_LDR_SB_G1:
12342             group = 1;
12343             break;
12344
12345           case R_ARM_LDR_PC_G2:
12346           case R_ARM_LDR_SB_G2:
12347             group = 2;
12348             break;
12349
12350           default:
12351             abort ();
12352           }
12353
12354         /* If REL, extract the addend from the insn.  If RELA, it will
12355            have already been fetched for us.  */
12356         if (globals->use_rel)
12357           {
12358             int negative = (insn & (1 << 23)) ? 1 : -1;
12359             signed_addend = negative * (insn & 0xfff);
12360           }
12361
12362         /* Compute the value (X) to go in the place.  */
12363         if (r_type == R_ARM_LDR_PC_G0
12364             || r_type == R_ARM_LDR_PC_G1
12365             || r_type == R_ARM_LDR_PC_G2)
12366           /* PC relative.  */
12367           signed_value = value - pc + signed_addend;
12368         else
12369           /* Section base relative.  */
12370           signed_value = value - sb + signed_addend;
12371
12372         /* Calculate the value of the relevant G_{n-1} to obtain
12373            the residual at that stage.  */
12374         calculate_group_reloc_mask (signed_value < 0 ? - signed_value : signed_value,
12375                                     group - 1, &residual);
12376
12377         /* Check for overflow.  */
12378         if (residual >= 0x1000)
12379           {
12380             _bfd_error_handler
12381               /* xgettext:c-format */
12382               (_("%pB(%pA+%#" PRIx64 "): overflow whilst "
12383                  "splitting %#" PRIx64 " for group relocation %s"),
12384                input_bfd, input_section, (uint64_t) rel->r_offset,
12385                (uint64_t) (signed_value < 0 ? -signed_value : signed_value),
12386                howto->name);
12387             return bfd_reloc_overflow;
12388           }
12389
12390         /* Mask out the value and U bit.  */
12391         insn &= 0xff7ff000;
12392
12393         /* Set the U bit if the value to go in the place is non-negative.  */
12394         if (signed_value >= 0)
12395           insn |= 1 << 23;
12396
12397         /* Encode the offset.  */
12398         insn |= residual;
12399
12400         bfd_put_32 (input_bfd, insn, hit_data);
12401       }
12402       return bfd_reloc_ok;
12403
12404     case R_ARM_LDRS_PC_G0:
12405     case R_ARM_LDRS_PC_G1:
12406     case R_ARM_LDRS_PC_G2:
12407     case R_ARM_LDRS_SB_G0:
12408     case R_ARM_LDRS_SB_G1:
12409     case R_ARM_LDRS_SB_G2:
12410       {
12411         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
12412         bfd_vma pc = input_section->output_section->vma
12413                      + input_section->output_offset + rel->r_offset;
12414         /* sb is the origin of the *segment* containing the symbol.  */
12415         bfd_vma sb = sym_sec ? sym_sec->output_section->vma : 0;
12416         bfd_vma residual;
12417         bfd_signed_vma signed_value;
12418         int group = 0;
12419
12420         /* Determine which groups of bits to calculate.  */
12421         switch (r_type)
12422           {
12423           case R_ARM_LDRS_PC_G0:
12424           case R_ARM_LDRS_SB_G0:
12425             group = 0;
12426             break;
12427
12428           case R_ARM_LDRS_PC_G1:
12429           case R_ARM_LDRS_SB_G1:
12430             group = 1;
12431             break;
12432
12433           case R_ARM_LDRS_PC_G2:
12434           case R_ARM_LDRS_SB_G2:
12435             group = 2;
12436             break;
12437
12438           default:
12439             abort ();
12440           }
12441
12442         /* If REL, extract the addend from the insn.  If RELA, it will
12443            have already been fetched for us.  */
12444         if (globals->use_rel)
12445           {
12446             int negative = (insn & (1 << 23)) ? 1 : -1;
12447             signed_addend = negative * (((insn & 0xf00) >> 4) + (insn & 0xf));
12448           }
12449
12450         /* Compute the value (X) to go in the place.  */
12451         if (r_type == R_ARM_LDRS_PC_G0
12452             || r_type == R_ARM_LDRS_PC_G1
12453             || r_type == R_ARM_LDRS_PC_G2)
12454           /* PC relative.  */
12455           signed_value = value - pc + signed_addend;
12456         else
12457           /* Section base relative.  */
12458           signed_value = value - sb + signed_addend;
12459
12460         /* Calculate the value of the relevant G_{n-1} to obtain
12461            the residual at that stage.  */
12462         calculate_group_reloc_mask (signed_value < 0 ? - signed_value : signed_value,
12463                                     group - 1, &residual);
12464
12465         /* Check for overflow.  */
12466         if (residual >= 0x100)
12467           {
12468             _bfd_error_handler
12469               /* xgettext:c-format */
12470               (_("%pB(%pA+%#" PRIx64 "): overflow whilst "
12471                  "splitting %#" PRIx64 " for group relocation %s"),
12472                input_bfd, input_section, (uint64_t) rel->r_offset,
12473                (uint64_t) (signed_value < 0 ? -signed_value : signed_value),
12474                howto->name);
12475             return bfd_reloc_overflow;
12476           }
12477
12478         /* Mask out the value and U bit.  */
12479         insn &= 0xff7ff0f0;
12480
12481         /* Set the U bit if the value to go in the place is non-negative.  */
12482         if (signed_value >= 0)
12483           insn |= 1 << 23;
12484
12485         /* Encode the offset.  */
12486         insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
12487
12488         bfd_put_32 (input_bfd, insn, hit_data);
12489       }
12490       return bfd_reloc_ok;
12491
12492     case R_ARM_LDC_PC_G0:
12493     case R_ARM_LDC_PC_G1:
12494     case R_ARM_LDC_PC_G2:
12495     case R_ARM_LDC_SB_G0:
12496     case R_ARM_LDC_SB_G1:
12497     case R_ARM_LDC_SB_G2:
12498       {
12499         bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
12500         bfd_vma pc = input_section->output_section->vma
12501                      + input_section->output_offset + rel->r_offset;
12502         /* sb is the origin of the *segment* containing the symbol.  */
12503         bfd_vma sb = sym_sec ? sym_sec->output_section->vma : 0;
12504         bfd_vma residual;
12505         bfd_signed_vma signed_value;
12506         int group = 0;
12507
12508         /* Determine which groups of bits to calculate.  */
12509         switch (r_type)
12510           {
12511           case R_ARM_LDC_PC_G0:
12512           case R_ARM_LDC_SB_G0:
12513             group = 0;
12514             break;
12515
12516           case R_ARM_LDC_PC_G1:
12517           case R_ARM_LDC_SB_G1:
12518             group = 1;
12519             break;
12520
12521           case R_ARM_LDC_PC_G2:
12522           case R_ARM_LDC_SB_G2:
12523             group = 2;
12524             break;
12525
12526           default:
12527             abort ();
12528           }
12529
12530         /* If REL, extract the addend from the insn.  If RELA, it will
12531            have already been fetched for us.  */
12532         if (globals->use_rel)
12533           {
12534             int negative = (insn & (1 << 23)) ? 1 : -1;
12535             signed_addend = negative * ((insn & 0xff) << 2);
12536           }
12537
12538         /* Compute the value (X) to go in the place.  */
12539         if (r_type == R_ARM_LDC_PC_G0
12540             || r_type == R_ARM_LDC_PC_G1
12541             || r_type == R_ARM_LDC_PC_G2)
12542           /* PC relative.  */
12543           signed_value = value - pc + signed_addend;
12544         else
12545           /* Section base relative.  */
12546           signed_value = value - sb + signed_addend;
12547
12548         /* Calculate the value of the relevant G_{n-1} to obtain
12549            the residual at that stage.  */
12550         calculate_group_reloc_mask (signed_value < 0 ? - signed_value : signed_value,
12551                                     group - 1, &residual);
12552
12553         /* Check for overflow.  (The absolute value to go in the place must be
12554            divisible by four and, after having been divided by four, must
12555            fit in eight bits.)  */
12556         if ((residual & 0x3) != 0 || residual >= 0x400)
12557           {
12558             _bfd_error_handler
12559               /* xgettext:c-format */
12560               (_("%pB(%pA+%#" PRIx64 "): overflow whilst "
12561                  "splitting %#" PRIx64 " for group relocation %s"),
12562                input_bfd, input_section, (uint64_t) rel->r_offset,
12563                (uint64_t) (signed_value < 0 ? -signed_value : signed_value),
12564                howto->name);
12565             return bfd_reloc_overflow;
12566           }
12567
12568         /* Mask out the value and U bit.  */
12569         insn &= 0xff7fff00;
12570
12571         /* Set the U bit if the value to go in the place is non-negative.  */
12572         if (signed_value >= 0)
12573           insn |= 1 << 23;
12574
12575         /* Encode the offset.  */
12576         insn |= residual >> 2;
12577
12578         bfd_put_32 (input_bfd, insn, hit_data);
12579       }
12580       return bfd_reloc_ok;
12581
12582     case R_ARM_THM_ALU_ABS_G0_NC:
12583     case R_ARM_THM_ALU_ABS_G1_NC:
12584     case R_ARM_THM_ALU_ABS_G2_NC:
12585     case R_ARM_THM_ALU_ABS_G3_NC:
12586         {
12587             const int shift_array[4] = {0, 8, 16, 24};
12588             bfd_vma insn = bfd_get_16 (input_bfd, hit_data);
12589             bfd_vma addr = value;
12590             int shift = shift_array[r_type - R_ARM_THM_ALU_ABS_G0_NC];
12591
12592             /* Compute address.  */
12593             if (globals->use_rel)
12594                 signed_addend = insn & 0xff;
12595             addr += signed_addend;
12596             if (branch_type == ST_BRANCH_TO_THUMB)
12597                 addr |= 1;
12598             /* Clean imm8 insn.  */
12599             insn &= 0xff00;
12600             /* And update with correct part of address.  */
12601             insn |= (addr >> shift) & 0xff;
12602             /* Update insn.  */
12603             bfd_put_16 (input_bfd, insn, hit_data);
12604         }
12605
12606         *unresolved_reloc_p = FALSE;
12607         return bfd_reloc_ok;
12608
12609     case R_ARM_GOTOFFFUNCDESC:
12610       {
12611         if (h == NULL)
12612           {
12613             struct fdpic_local *local_fdpic_cnts = elf32_arm_local_fdpic_cnts(input_bfd);
12614             int dynindx = elf_section_data (sym_sec->output_section)->dynindx;
12615             int offset = local_fdpic_cnts[r_symndx].funcdesc_offset & ~1;
12616             bfd_vma addr = dynreloc_value - sym_sec->output_section->vma;
12617             bfd_vma seg = -1;
12618
12619             if (bfd_link_pic(info) && dynindx == 0)
12620               abort();
12621
12622             /* Resolve relocation.  */
12623             bfd_put_32(output_bfd, (offset + sgot->output_offset)
12624                        , contents + rel->r_offset);
12625             /* Emit R_ARM_FUNCDESC_VALUE or two fixups on funcdesc if
12626                not done yet.  */
12627             arm_elf_fill_funcdesc(output_bfd, info,
12628                                   &local_fdpic_cnts[r_symndx].funcdesc_offset,
12629                                   dynindx, offset, addr, dynreloc_value, seg);
12630           }
12631         else
12632           {
12633             int dynindx;
12634             int offset = eh->fdpic_cnts.funcdesc_offset & ~1;
12635             bfd_vma addr;
12636             bfd_vma seg = -1;
12637
12638             /* For static binaries, sym_sec can be null.  */
12639             if (sym_sec)
12640               {
12641                 dynindx = elf_section_data (sym_sec->output_section)->dynindx;
12642                 addr = dynreloc_value - sym_sec->output_section->vma;
12643               }
12644             else
12645               {
12646                 dynindx = 0;
12647                 addr = 0;
12648               }
12649
12650             if (bfd_link_pic(info) && dynindx == 0)
12651               abort();
12652
12653             /* This case cannot occur since funcdesc is allocated by
12654                the dynamic loader so we cannot resolve the relocation.  */
12655             if (h->dynindx != -1)
12656               abort();
12657
12658             /* Resolve relocation.  */
12659             bfd_put_32(output_bfd, (offset + sgot->output_offset),
12660                        contents + rel->r_offset);
12661             /* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet.  */
12662             arm_elf_fill_funcdesc(output_bfd, info,
12663                                   &eh->fdpic_cnts.funcdesc_offset,
12664                                   dynindx, offset, addr, dynreloc_value, seg);
12665           }
12666       }
12667       *unresolved_reloc_p = FALSE;
12668       return bfd_reloc_ok;
12669
12670     case R_ARM_GOTFUNCDESC:
12671       {
12672         if (h != NULL)
12673           {
12674             Elf_Internal_Rela outrel;
12675
12676             /* Resolve relocation.  */
12677             bfd_put_32(output_bfd, ((eh->fdpic_cnts.gotfuncdesc_offset & ~1)
12678                                     + sgot->output_offset),
12679                        contents + rel->r_offset);
12680             /* Add funcdesc and associated R_ARM_FUNCDESC_VALUE.  */
12681             if(h->dynindx == -1)
12682               {
12683                 int dynindx;
12684                 int offset = eh->fdpic_cnts.funcdesc_offset & ~1;
12685                 bfd_vma addr;
12686                 bfd_vma seg = -1;
12687
12688                 /* For static binaries sym_sec can be null.  */
12689                 if (sym_sec)
12690                   {
12691                     dynindx = elf_section_data (sym_sec->output_section)->dynindx;
12692                     addr = dynreloc_value - sym_sec->output_section->vma;
12693                   }
12694                 else
12695                   {
12696                     dynindx = 0;
12697                     addr = 0;
12698                   }
12699
12700                 /* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet.  */
12701                 arm_elf_fill_funcdesc(output_bfd, info,
12702                                       &eh->fdpic_cnts.funcdesc_offset,
12703                                       dynindx, offset, addr, dynreloc_value, seg);
12704               }
12705
12706             /* Add a dynamic relocation on GOT entry if not already done.  */
12707             if ((eh->fdpic_cnts.gotfuncdesc_offset & 1) == 0)
12708               {
12709                 if (h->dynindx == -1)
12710                   {
12711                     outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
12712                     if (h->root.type == bfd_link_hash_undefweak)
12713                       bfd_put_32(output_bfd, 0, sgot->contents
12714                                  + (eh->fdpic_cnts.gotfuncdesc_offset & ~1));
12715                     else
12716                       bfd_put_32(output_bfd, sgot->output_section->vma
12717                                  + sgot->output_offset
12718                                  + (eh->fdpic_cnts.funcdesc_offset & ~1),
12719                                  sgot->contents
12720                                  + (eh->fdpic_cnts.gotfuncdesc_offset & ~1));
12721                   }
12722                 else
12723                   {
12724                     outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_FUNCDESC);
12725                   }
12726                 outrel.r_offset = sgot->output_section->vma
12727                   + sgot->output_offset
12728                   + (eh->fdpic_cnts.gotfuncdesc_offset & ~1);
12729                 outrel.r_addend = 0;
12730                 if (h->dynindx == -1 && !bfd_link_pic(info))
12731                   if (h->root.type == bfd_link_hash_undefweak)
12732                     arm_elf_add_rofixup(output_bfd, globals->srofixup, -1);
12733                   else
12734                     arm_elf_add_rofixup(output_bfd, globals->srofixup, outrel.r_offset);
12735                 else
12736                   elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
12737                 eh->fdpic_cnts.gotfuncdesc_offset |= 1;
12738               }
12739           }
12740         else
12741           {
12742             /* Such relocation on static function should not have been
12743                emitted by the compiler.  */
12744             abort();
12745           }
12746       }
12747       *unresolved_reloc_p = FALSE;
12748       return bfd_reloc_ok;
12749
12750     case R_ARM_FUNCDESC:
12751       {
12752         if (h == NULL)
12753           {
12754             struct fdpic_local *local_fdpic_cnts = elf32_arm_local_fdpic_cnts(input_bfd);
12755             Elf_Internal_Rela outrel;
12756             int dynindx = elf_section_data (sym_sec->output_section)->dynindx;
12757             int offset = local_fdpic_cnts[r_symndx].funcdesc_offset & ~1;
12758             bfd_vma addr = dynreloc_value - sym_sec->output_section->vma;
12759             bfd_vma seg = -1;
12760
12761             if (bfd_link_pic(info) && dynindx == 0)
12762               abort();
12763
12764             /* Replace static FUNCDESC relocation with a
12765                R_ARM_RELATIVE dynamic relocation or with a rofixup for
12766                executable.  */
12767             outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
12768             outrel.r_offset = input_section->output_section->vma
12769               + input_section->output_offset + rel->r_offset;
12770             outrel.r_addend = 0;
12771             if (bfd_link_pic(info))
12772               elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
12773             else
12774               arm_elf_add_rofixup(output_bfd, globals->srofixup, outrel.r_offset);
12775
12776             bfd_put_32 (input_bfd, sgot->output_section->vma
12777                         + sgot->output_offset + offset, hit_data);
12778
12779             /* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet.  */
12780             arm_elf_fill_funcdesc(output_bfd, info,
12781                                   &local_fdpic_cnts[r_symndx].funcdesc_offset,
12782                                   dynindx, offset, addr, dynreloc_value, seg);
12783           }
12784         else
12785           {
12786             if (h->dynindx == -1)
12787               {
12788                 int dynindx;
12789                 int offset = eh->fdpic_cnts.funcdesc_offset & ~1;
12790                 bfd_vma addr;
12791                 bfd_vma seg = -1;
12792                 Elf_Internal_Rela outrel;
12793
12794                 /* For static binaries sym_sec can be null.  */
12795                 if (sym_sec)
12796                   {
12797                     dynindx = elf_section_data (sym_sec->output_section)->dynindx;
12798                     addr = dynreloc_value - sym_sec->output_section->vma;
12799                   }
12800                 else
12801                   {
12802                     dynindx = 0;
12803                     addr = 0;
12804                   }
12805
12806                 if (bfd_link_pic(info) && dynindx == 0)
12807                   abort();
12808
12809                 /* Replace static FUNCDESC relocation with a
12810                    R_ARM_RELATIVE dynamic relocation.  */
12811                 outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
12812                 outrel.r_offset = input_section->output_section->vma
12813                   + input_section->output_offset + rel->r_offset;
12814                 outrel.r_addend = 0;
12815                 if (bfd_link_pic(info))
12816                   elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
12817                 else
12818                   arm_elf_add_rofixup(output_bfd, globals->srofixup, outrel.r_offset);
12819
12820                 bfd_put_32 (input_bfd, sgot->output_section->vma
12821                             + sgot->output_offset + offset, hit_data);
12822
12823                 /* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet.  */
12824                 arm_elf_fill_funcdesc(output_bfd, info,
12825                                       &eh->fdpic_cnts.funcdesc_offset,
12826                                       dynindx, offset, addr, dynreloc_value, seg);
12827               }
12828             else
12829               {
12830                 Elf_Internal_Rela outrel;
12831
12832                 /* Add a dynamic relocation.  */
12833                 outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_FUNCDESC);
12834                 outrel.r_offset = input_section->output_section->vma
12835                   + input_section->output_offset + rel->r_offset;
12836                 outrel.r_addend = 0;
12837                 elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
12838               }
12839           }
12840       }
12841       *unresolved_reloc_p = FALSE;
12842       return bfd_reloc_ok;
12843
12844     default:
12845       return bfd_reloc_notsupported;
12846     }
12847 }
12848
12849 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS.  */
12850 static void
12851 arm_add_to_rel (bfd *              abfd,
12852                 bfd_byte *         address,
12853                 reloc_howto_type * howto,
12854                 bfd_signed_vma     increment)
12855 {
12856   bfd_signed_vma addend;
12857
12858   if (howto->type == R_ARM_THM_CALL
12859       || howto->type == R_ARM_THM_JUMP24)
12860     {
12861       int upper_insn, lower_insn;
12862       int upper, lower;
12863
12864       upper_insn = bfd_get_16 (abfd, address);
12865       lower_insn = bfd_get_16 (abfd, address + 2);
12866       upper = upper_insn & 0x7ff;
12867       lower = lower_insn & 0x7ff;
12868
12869       addend = (upper << 12) | (lower << 1);
12870       addend += increment;
12871       addend >>= 1;
12872
12873       upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
12874       lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
12875
12876       bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
12877       bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
12878     }
12879   else
12880     {
12881       bfd_vma        contents;
12882
12883       contents = bfd_get_32 (abfd, address);
12884
12885       /* Get the (signed) value from the instruction.  */
12886       addend = contents & howto->src_mask;
12887       if (addend & ((howto->src_mask + 1) >> 1))
12888         {
12889           bfd_signed_vma mask;
12890
12891           mask = -1;
12892           mask &= ~ howto->src_mask;
12893           addend |= mask;
12894         }
12895
12896       /* Add in the increment, (which is a byte value).  */
12897       switch (howto->type)
12898         {
12899         default:
12900           addend += increment;
12901           break;
12902
12903         case R_ARM_PC24:
12904         case R_ARM_PLT32:
12905         case R_ARM_CALL:
12906         case R_ARM_JUMP24:
12907           addend <<= howto->size;
12908           addend += increment;
12909
12910           /* Should we check for overflow here ?  */
12911
12912           /* Drop any undesired bits.  */
12913           addend >>= howto->rightshift;
12914           break;
12915         }
12916
12917       contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
12918
12919       bfd_put_32 (abfd, contents, address);
12920     }
12921 }
12922
12923 #define IS_ARM_TLS_RELOC(R_TYPE)        \
12924   ((R_TYPE) == R_ARM_TLS_GD32           \
12925    || (R_TYPE) == R_ARM_TLS_GD32_FDPIC  \
12926    || (R_TYPE) == R_ARM_TLS_LDO32       \
12927    || (R_TYPE) == R_ARM_TLS_LDM32       \
12928    || (R_TYPE) == R_ARM_TLS_LDM32_FDPIC \
12929    || (R_TYPE) == R_ARM_TLS_DTPOFF32    \
12930    || (R_TYPE) == R_ARM_TLS_DTPMOD32    \
12931    || (R_TYPE) == R_ARM_TLS_TPOFF32     \
12932    || (R_TYPE) == R_ARM_TLS_LE32        \
12933    || (R_TYPE) == R_ARM_TLS_IE32        \
12934    || (R_TYPE) == R_ARM_TLS_IE32_FDPIC  \
12935    || IS_ARM_TLS_GNU_RELOC (R_TYPE))
12936
12937 /* Specific set of relocations for the gnu tls dialect.  */
12938 #define IS_ARM_TLS_GNU_RELOC(R_TYPE)    \
12939   ((R_TYPE) == R_ARM_TLS_GOTDESC        \
12940    || (R_TYPE) == R_ARM_TLS_CALL        \
12941    || (R_TYPE) == R_ARM_THM_TLS_CALL    \
12942    || (R_TYPE) == R_ARM_TLS_DESCSEQ     \
12943    || (R_TYPE) == R_ARM_THM_TLS_DESCSEQ)
12944
12945 /* Relocate an ARM ELF section.  */
12946
12947 static bfd_boolean
12948 elf32_arm_relocate_section (bfd *                  output_bfd,
12949                             struct bfd_link_info * info,
12950                             bfd *                  input_bfd,
12951                             asection *             input_section,
12952                             bfd_byte *             contents,
12953                             Elf_Internal_Rela *    relocs,
12954                             Elf_Internal_Sym *     local_syms,
12955                             asection **            local_sections)
12956 {
12957   Elf_Internal_Shdr *symtab_hdr;
12958   struct elf_link_hash_entry **sym_hashes;
12959   Elf_Internal_Rela *rel;
12960   Elf_Internal_Rela *relend;
12961   const char *name;
12962   struct elf32_arm_link_hash_table * globals;
12963
12964   globals = elf32_arm_hash_table (info);
12965   if (globals == NULL)
12966     return FALSE;
12967
12968   symtab_hdr = & elf_symtab_hdr (input_bfd);
12969   sym_hashes = elf_sym_hashes (input_bfd);
12970
12971   rel = relocs;
12972   relend = relocs + input_section->reloc_count;
12973   for (; rel < relend; rel++)
12974     {
12975       int                          r_type;
12976       reloc_howto_type *           howto;
12977       unsigned long                r_symndx;
12978       Elf_Internal_Sym *           sym;
12979       asection *                   sec;
12980       struct elf_link_hash_entry * h;
12981       bfd_vma                      relocation;
12982       bfd_reloc_status_type        r;
12983       arelent                      bfd_reloc;
12984       char                         sym_type;
12985       bfd_boolean                  unresolved_reloc = FALSE;
12986       char *error_message = NULL;
12987
12988       r_symndx = ELF32_R_SYM (rel->r_info);
12989       r_type   = ELF32_R_TYPE (rel->r_info);
12990       r_type   = arm_real_reloc_type (globals, r_type);
12991
12992       if (   r_type == R_ARM_GNU_VTENTRY
12993           || r_type == R_ARM_GNU_VTINHERIT)
12994         continue;
12995
12996       howto = bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
12997
12998       if (howto == NULL)
12999         return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
13000
13001       h = NULL;
13002       sym = NULL;
13003       sec = NULL;
13004
13005       if (r_symndx < symtab_hdr->sh_info)
13006         {
13007           sym = local_syms + r_symndx;
13008           sym_type = ELF32_ST_TYPE (sym->st_info);
13009           sec = local_sections[r_symndx];
13010
13011           /* An object file might have a reference to a local
13012              undefined symbol.  This is a daft object file, but we
13013              should at least do something about it.  V4BX & NONE
13014              relocations do not use the symbol and are explicitly
13015              allowed to use the undefined symbol, so allow those.
13016              Likewise for relocations against STN_UNDEF.  */
13017           if (r_type != R_ARM_V4BX
13018               && r_type != R_ARM_NONE
13019               && r_symndx != STN_UNDEF
13020               && bfd_is_und_section (sec)
13021               && ELF_ST_BIND (sym->st_info) != STB_WEAK)
13022             (*info->callbacks->undefined_symbol)
13023               (info, bfd_elf_string_from_elf_section
13024                (input_bfd, symtab_hdr->sh_link, sym->st_name),
13025                input_bfd, input_section,
13026                rel->r_offset, TRUE);
13027
13028           if (globals->use_rel)
13029             {
13030               relocation = (sec->output_section->vma
13031                             + sec->output_offset
13032                             + sym->st_value);
13033               if (!bfd_link_relocatable (info)
13034                   && (sec->flags & SEC_MERGE)
13035                   && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
13036                 {
13037                   asection *msec;
13038                   bfd_vma addend, value;
13039
13040                   switch (r_type)
13041                     {
13042                     case R_ARM_MOVW_ABS_NC:
13043                     case R_ARM_MOVT_ABS:
13044                       value = bfd_get_32 (input_bfd, contents + rel->r_offset);
13045                       addend = ((value & 0xf0000) >> 4) | (value & 0xfff);
13046                       addend = (addend ^ 0x8000) - 0x8000;
13047                       break;
13048
13049                     case R_ARM_THM_MOVW_ABS_NC:
13050                     case R_ARM_THM_MOVT_ABS:
13051                       value = bfd_get_16 (input_bfd, contents + rel->r_offset)
13052                               << 16;
13053                       value |= bfd_get_16 (input_bfd,
13054                                            contents + rel->r_offset + 2);
13055                       addend = ((value & 0xf7000) >> 4) | (value & 0xff)
13056                                | ((value & 0x04000000) >> 15);
13057                       addend = (addend ^ 0x8000) - 0x8000;
13058                       break;
13059
13060                     default:
13061                       if (howto->rightshift
13062                           || (howto->src_mask & (howto->src_mask + 1)))
13063                         {
13064                           _bfd_error_handler
13065                             /* xgettext:c-format */
13066                             (_("%pB(%pA+%#" PRIx64 "): "
13067                                "%s relocation against SEC_MERGE section"),
13068                              input_bfd, input_section,
13069                              (uint64_t) rel->r_offset, howto->name);
13070                           return FALSE;
13071                         }
13072
13073                       value = bfd_get_32 (input_bfd, contents + rel->r_offset);
13074
13075                       /* Get the (signed) value from the instruction.  */
13076                       addend = value & howto->src_mask;
13077                       if (addend & ((howto->src_mask + 1) >> 1))
13078                         {
13079                           bfd_signed_vma mask;
13080
13081                           mask = -1;
13082                           mask &= ~ howto->src_mask;
13083                           addend |= mask;
13084                         }
13085                       break;
13086                     }
13087
13088                   msec = sec;
13089                   addend =
13090                     _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
13091                     - relocation;
13092                   addend += msec->output_section->vma + msec->output_offset;
13093
13094                   /* Cases here must match those in the preceding
13095                      switch statement.  */
13096                   switch (r_type)
13097                     {
13098                     case R_ARM_MOVW_ABS_NC:
13099                     case R_ARM_MOVT_ABS:
13100                       value = (value & 0xfff0f000) | ((addend & 0xf000) << 4)
13101                               | (addend & 0xfff);
13102                       bfd_put_32 (input_bfd, value, contents + rel->r_offset);
13103                       break;
13104
13105                     case R_ARM_THM_MOVW_ABS_NC:
13106                     case R_ARM_THM_MOVT_ABS:
13107                       value = (value & 0xfbf08f00) | ((addend & 0xf700) << 4)
13108                               | (addend & 0xff) | ((addend & 0x0800) << 15);
13109                       bfd_put_16 (input_bfd, value >> 16,
13110                                   contents + rel->r_offset);
13111                       bfd_put_16 (input_bfd, value,
13112                                   contents + rel->r_offset + 2);
13113                       break;
13114
13115                     default:
13116                       value = (value & ~ howto->dst_mask)
13117                               | (addend & howto->dst_mask);
13118                       bfd_put_32 (input_bfd, value, contents + rel->r_offset);
13119                       break;
13120                     }
13121                 }
13122             }
13123           else
13124             relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
13125         }
13126       else
13127         {
13128           bfd_boolean warned, ignored;
13129
13130           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
13131                                    r_symndx, symtab_hdr, sym_hashes,
13132                                    h, sec, relocation,
13133                                    unresolved_reloc, warned, ignored);
13134
13135           sym_type = h->type;
13136         }
13137
13138       if (sec != NULL && discarded_section (sec))
13139         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
13140                                          rel, 1, relend, howto, 0, contents);
13141
13142       if (bfd_link_relocatable (info))
13143         {
13144           /* This is a relocatable link.  We don't have to change
13145              anything, unless the reloc is against a section symbol,
13146              in which case we have to adjust according to where the
13147              section symbol winds up in the output section.  */
13148           if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
13149             {
13150               if (globals->use_rel)
13151                 arm_add_to_rel (input_bfd, contents + rel->r_offset,
13152                                 howto, (bfd_signed_vma) sec->output_offset);
13153               else
13154                 rel->r_addend += sec->output_offset;
13155             }
13156           continue;
13157         }
13158
13159       if (h != NULL)
13160         name = h->root.root.string;
13161       else
13162         {
13163           name = (bfd_elf_string_from_elf_section
13164                   (input_bfd, symtab_hdr->sh_link, sym->st_name));
13165           if (name == NULL || *name == '\0')
13166             name = bfd_section_name (input_bfd, sec);
13167         }
13168
13169       if (r_symndx != STN_UNDEF
13170           && r_type != R_ARM_NONE
13171           && (h == NULL
13172               || h->root.type == bfd_link_hash_defined
13173               || h->root.type == bfd_link_hash_defweak)
13174           && IS_ARM_TLS_RELOC (r_type) != (sym_type == STT_TLS))
13175         {
13176           _bfd_error_handler
13177             ((sym_type == STT_TLS
13178               /* xgettext:c-format */
13179               ? _("%pB(%pA+%#" PRIx64 "): %s used with TLS symbol %s")
13180               /* xgettext:c-format */
13181               : _("%pB(%pA+%#" PRIx64 "): %s used with non-TLS symbol %s")),
13182              input_bfd,
13183              input_section,
13184              (uint64_t) rel->r_offset,
13185              howto->name,
13186              name);
13187         }
13188
13189       /* We call elf32_arm_final_link_relocate unless we're completely
13190          done, i.e., the relaxation produced the final output we want,
13191          and we won't let anybody mess with it. Also, we have to do
13192          addend adjustments in case of a R_ARM_TLS_GOTDESC relocation
13193          both in relaxed and non-relaxed cases.  */
13194       if ((elf32_arm_tls_transition (info, r_type, h) != (unsigned)r_type)
13195           || (IS_ARM_TLS_GNU_RELOC (r_type)
13196               && !((h ? elf32_arm_hash_entry (h)->tls_type :
13197                     elf32_arm_local_got_tls_type (input_bfd)[r_symndx])
13198                    & GOT_TLS_GDESC)))
13199         {
13200           r = elf32_arm_tls_relax (globals, input_bfd, input_section,
13201                                    contents, rel, h == NULL);
13202           /* This may have been marked unresolved because it came from
13203              a shared library.  But we've just dealt with that.  */
13204           unresolved_reloc = 0;
13205         }
13206       else
13207         r = bfd_reloc_continue;
13208
13209       if (r == bfd_reloc_continue)
13210         {
13211           unsigned char branch_type =
13212             h ? ARM_GET_SYM_BRANCH_TYPE (h->target_internal)
13213               : ARM_GET_SYM_BRANCH_TYPE (sym->st_target_internal);
13214
13215           r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
13216                                              input_section, contents, rel,
13217                                              relocation, info, sec, name,
13218                                              sym_type, branch_type, h,
13219                                              &unresolved_reloc,
13220                                              &error_message);
13221         }
13222
13223       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
13224          because such sections are not SEC_ALLOC and thus ld.so will
13225          not process them.  */
13226       if (unresolved_reloc
13227           && !((input_section->flags & SEC_DEBUGGING) != 0
13228                && h->def_dynamic)
13229           && _bfd_elf_section_offset (output_bfd, info, input_section,
13230                                       rel->r_offset) != (bfd_vma) -1)
13231         {
13232           _bfd_error_handler
13233             /* xgettext:c-format */
13234             (_("%pB(%pA+%#" PRIx64 "): "
13235                "unresolvable %s relocation against symbol `%s'"),
13236              input_bfd,
13237              input_section,
13238              (uint64_t) rel->r_offset,
13239              howto->name,
13240              h->root.root.string);
13241           return FALSE;
13242         }
13243
13244       if (r != bfd_reloc_ok)
13245         {
13246           switch (r)
13247             {
13248             case bfd_reloc_overflow:
13249               /* If the overflowing reloc was to an undefined symbol,
13250                  we have already printed one error message and there
13251                  is no point complaining again.  */
13252               if (!h || h->root.type != bfd_link_hash_undefined)
13253                 (*info->callbacks->reloc_overflow)
13254                   (info, (h ? &h->root : NULL), name, howto->name,
13255                    (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
13256               break;
13257
13258             case bfd_reloc_undefined:
13259               (*info->callbacks->undefined_symbol)
13260                 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
13261               break;
13262
13263             case bfd_reloc_outofrange:
13264               error_message = _("out of range");
13265               goto common_error;
13266
13267             case bfd_reloc_notsupported:
13268               error_message = _("unsupported relocation");
13269               goto common_error;
13270
13271             case bfd_reloc_dangerous:
13272               /* error_message should already be set.  */
13273               goto common_error;
13274
13275             default:
13276               error_message = _("unknown error");
13277               /* Fall through.  */
13278
13279             common_error:
13280               BFD_ASSERT (error_message != NULL);
13281               (*info->callbacks->reloc_dangerous)
13282                 (info, error_message, input_bfd, input_section, rel->r_offset);
13283               break;
13284             }
13285         }
13286     }
13287
13288   return TRUE;
13289 }
13290
13291 /* Add a new unwind edit to the list described by HEAD, TAIL.  If TINDEX is zero,
13292    adds the edit to the start of the list.  (The list must be built in order of
13293    ascending TINDEX: the function's callers are primarily responsible for
13294    maintaining that condition).  */
13295
13296 static void
13297 add_unwind_table_edit (arm_unwind_table_edit **head,
13298                        arm_unwind_table_edit **tail,
13299                        arm_unwind_edit_type type,
13300                        asection *linked_section,
13301                        unsigned int tindex)
13302 {
13303   arm_unwind_table_edit *new_edit = (arm_unwind_table_edit *)
13304       xmalloc (sizeof (arm_unwind_table_edit));
13305
13306   new_edit->type = type;
13307   new_edit->linked_section = linked_section;
13308   new_edit->index = tindex;
13309
13310   if (tindex > 0)
13311     {
13312       new_edit->next = NULL;
13313
13314       if (*tail)
13315         (*tail)->next = new_edit;
13316
13317       (*tail) = new_edit;
13318
13319       if (!*head)
13320         (*head) = new_edit;
13321     }
13322   else
13323     {
13324       new_edit->next = *head;
13325
13326       if (!*tail)
13327         *tail = new_edit;
13328
13329       *head = new_edit;
13330     }
13331 }
13332
13333 static _arm_elf_section_data *get_arm_elf_section_data (asection *);
13334
13335 /* Increase the size of EXIDX_SEC by ADJUST bytes.  ADJUST mau be negative.  */
13336 static void
13337 adjust_exidx_size(asection *exidx_sec, int adjust)
13338 {
13339   asection *out_sec;
13340
13341   if (!exidx_sec->rawsize)
13342     exidx_sec->rawsize = exidx_sec->size;
13343
13344   bfd_set_section_size (exidx_sec->owner, exidx_sec, exidx_sec->size + adjust);
13345   out_sec = exidx_sec->output_section;
13346   /* Adjust size of output section.  */
13347   bfd_set_section_size (out_sec->owner, out_sec, out_sec->size +adjust);
13348 }
13349
13350 /* Insert an EXIDX_CANTUNWIND marker at the end of a section.  */
13351 static void
13352 insert_cantunwind_after(asection *text_sec, asection *exidx_sec)
13353 {
13354   struct _arm_elf_section_data *exidx_arm_data;
13355
13356   exidx_arm_data = get_arm_elf_section_data (exidx_sec);
13357   add_unwind_table_edit (
13358     &exidx_arm_data->u.exidx.unwind_edit_list,
13359     &exidx_arm_data->u.exidx.unwind_edit_tail,
13360     INSERT_EXIDX_CANTUNWIND_AT_END, text_sec, UINT_MAX);
13361
13362   exidx_arm_data->additional_reloc_count++;
13363
13364   adjust_exidx_size(exidx_sec, 8);
13365 }
13366
13367 /* Scan .ARM.exidx tables, and create a list describing edits which should be
13368    made to those tables, such that:
13369
13370      1. Regions without unwind data are marked with EXIDX_CANTUNWIND entries.
13371      2. Duplicate entries are merged together (EXIDX_CANTUNWIND, or unwind
13372         codes which have been inlined into the index).
13373
13374    If MERGE_EXIDX_ENTRIES is false, duplicate entries are not merged.
13375
13376    The edits are applied when the tables are written
13377    (in elf32_arm_write_section).  */
13378
13379 bfd_boolean
13380 elf32_arm_fix_exidx_coverage (asection **text_section_order,
13381                               unsigned int num_text_sections,
13382                               struct bfd_link_info *info,
13383                               bfd_boolean merge_exidx_entries)
13384 {
13385   bfd *inp;
13386   unsigned int last_second_word = 0, i;
13387   asection *last_exidx_sec = NULL;
13388   asection *last_text_sec = NULL;
13389   int last_unwind_type = -1;
13390
13391   /* Walk over all EXIDX sections, and create backlinks from the corrsponding
13392      text sections.  */
13393   for (inp = info->input_bfds; inp != NULL; inp = inp->link.next)
13394     {
13395       asection *sec;
13396
13397       for (sec = inp->sections; sec != NULL; sec = sec->next)
13398         {
13399           struct bfd_elf_section_data *elf_sec = elf_section_data (sec);
13400           Elf_Internal_Shdr *hdr = &elf_sec->this_hdr;
13401
13402           if (!hdr || hdr->sh_type != SHT_ARM_EXIDX)
13403             continue;
13404
13405           if (elf_sec->linked_to)
13406             {
13407               Elf_Internal_Shdr *linked_hdr
13408                 = &elf_section_data (elf_sec->linked_to)->this_hdr;
13409               struct _arm_elf_section_data *linked_sec_arm_data
13410                 = get_arm_elf_section_data (linked_hdr->bfd_section);
13411
13412               if (linked_sec_arm_data == NULL)
13413                 continue;
13414
13415               /* Link this .ARM.exidx section back from the text section it
13416                  describes.  */
13417               linked_sec_arm_data->u.text.arm_exidx_sec = sec;
13418             }
13419         }
13420     }
13421
13422   /* Walk all text sections in order of increasing VMA.  Eilminate duplicate
13423      index table entries (EXIDX_CANTUNWIND and inlined unwind opcodes),
13424      and add EXIDX_CANTUNWIND entries for sections with no unwind table data.  */
13425
13426   for (i = 0; i < num_text_sections; i++)
13427     {
13428       asection *sec = text_section_order[i];
13429       asection *exidx_sec;
13430       struct _arm_elf_section_data *arm_data = get_arm_elf_section_data (sec);
13431       struct _arm_elf_section_data *exidx_arm_data;
13432       bfd_byte *contents = NULL;
13433       int deleted_exidx_bytes = 0;
13434       bfd_vma j;
13435       arm_unwind_table_edit *unwind_edit_head = NULL;
13436       arm_unwind_table_edit *unwind_edit_tail = NULL;
13437       Elf_Internal_Shdr *hdr;
13438       bfd *ibfd;
13439
13440       if (arm_data == NULL)
13441         continue;
13442
13443       exidx_sec = arm_data->u.text.arm_exidx_sec;
13444       if (exidx_sec == NULL)
13445         {
13446           /* Section has no unwind data.  */
13447           if (last_unwind_type == 0 || !last_exidx_sec)
13448             continue;
13449
13450           /* Ignore zero sized sections.  */
13451           if (sec->size == 0)
13452             continue;
13453
13454           insert_cantunwind_after(last_text_sec, last_exidx_sec);
13455           last_unwind_type = 0;
13456           continue;
13457         }
13458
13459       /* Skip /DISCARD/ sections.  */
13460       if (bfd_is_abs_section (exidx_sec->output_section))
13461         continue;
13462
13463       hdr = &elf_section_data (exidx_sec)->this_hdr;
13464       if (hdr->sh_type != SHT_ARM_EXIDX)
13465         continue;
13466
13467       exidx_arm_data = get_arm_elf_section_data (exidx_sec);
13468       if (exidx_arm_data == NULL)
13469         continue;
13470
13471       ibfd = exidx_sec->owner;
13472
13473       if (hdr->contents != NULL)
13474         contents = hdr->contents;
13475       else if (! bfd_malloc_and_get_section (ibfd, exidx_sec, &contents))
13476         /* An error?  */
13477         continue;
13478
13479       if (last_unwind_type > 0)
13480         {
13481           unsigned int first_word = bfd_get_32 (ibfd, contents);
13482           /* Add cantunwind if first unwind item does not match section
13483              start.  */
13484           if (first_word != sec->vma)
13485             {
13486               insert_cantunwind_after (last_text_sec, last_exidx_sec);
13487               last_unwind_type = 0;
13488             }
13489         }
13490
13491       for (j = 0; j < hdr->sh_size; j += 8)
13492         {
13493           unsigned int second_word = bfd_get_32 (ibfd, contents + j + 4);
13494           int unwind_type;
13495           int elide = 0;
13496
13497           /* An EXIDX_CANTUNWIND entry.  */
13498           if (second_word == 1)
13499             {
13500               if (last_unwind_type == 0)
13501                 elide = 1;
13502               unwind_type = 0;
13503             }
13504           /* Inlined unwinding data.  Merge if equal to previous.  */
13505           else if ((second_word & 0x80000000) != 0)
13506             {
13507               if (merge_exidx_entries
13508                    && last_second_word == second_word && last_unwind_type == 1)
13509                 elide = 1;
13510               unwind_type = 1;
13511               last_second_word = second_word;
13512             }
13513           /* Normal table entry.  In theory we could merge these too,
13514              but duplicate entries are likely to be much less common.  */
13515           else
13516             unwind_type = 2;
13517
13518           if (elide && !bfd_link_relocatable (info))
13519             {
13520               add_unwind_table_edit (&unwind_edit_head, &unwind_edit_tail,
13521                                      DELETE_EXIDX_ENTRY, NULL, j / 8);
13522
13523               deleted_exidx_bytes += 8;
13524             }
13525
13526           last_unwind_type = unwind_type;
13527         }
13528
13529       /* Free contents if we allocated it ourselves.  */
13530       if (contents != hdr->contents)
13531         free (contents);
13532
13533       /* Record edits to be applied later (in elf32_arm_write_section).  */
13534       exidx_arm_data->u.exidx.unwind_edit_list = unwind_edit_head;
13535       exidx_arm_data->u.exidx.unwind_edit_tail = unwind_edit_tail;
13536
13537       if (deleted_exidx_bytes > 0)
13538         adjust_exidx_size(exidx_sec, -deleted_exidx_bytes);
13539
13540       last_exidx_sec = exidx_sec;
13541       last_text_sec = sec;
13542     }
13543
13544   /* Add terminating CANTUNWIND entry.  */
13545   if (!bfd_link_relocatable (info) && last_exidx_sec
13546       && last_unwind_type != 0)
13547     insert_cantunwind_after(last_text_sec, last_exidx_sec);
13548
13549   return TRUE;
13550 }
13551
13552 static bfd_boolean
13553 elf32_arm_output_glue_section (struct bfd_link_info *info, bfd *obfd,
13554                                bfd *ibfd, const char *name)
13555 {
13556   asection *sec, *osec;
13557
13558   sec = bfd_get_linker_section (ibfd, name);
13559   if (sec == NULL || (sec->flags & SEC_EXCLUDE) != 0)
13560     return TRUE;
13561
13562   osec = sec->output_section;
13563   if (elf32_arm_write_section (obfd, info, sec, sec->contents))
13564     return TRUE;
13565
13566   if (! bfd_set_section_contents (obfd, osec, sec->contents,
13567                                   sec->output_offset, sec->size))
13568     return FALSE;
13569
13570   return TRUE;
13571 }
13572
13573 static bfd_boolean
13574 elf32_arm_final_link (bfd *abfd, struct bfd_link_info *info)
13575 {
13576   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
13577   asection *sec, *osec;
13578
13579   if (globals == NULL)
13580     return FALSE;
13581
13582   /* Invoke the regular ELF backend linker to do all the work.  */
13583   if (!bfd_elf_final_link (abfd, info))
13584     return FALSE;
13585
13586   /* Process stub sections (eg BE8 encoding, ...).  */
13587   struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
13588   unsigned int i;
13589   for (i=0; i<htab->top_id; i++)
13590     {
13591       sec = htab->stub_group[i].stub_sec;
13592       /* Only process it once, in its link_sec slot.  */
13593       if (sec && i == htab->stub_group[i].link_sec->id)
13594         {
13595           osec = sec->output_section;
13596           elf32_arm_write_section (abfd, info, sec, sec->contents);
13597           if (! bfd_set_section_contents (abfd, osec, sec->contents,
13598                                           sec->output_offset, sec->size))
13599             return FALSE;
13600         }
13601     }
13602
13603   /* Write out any glue sections now that we have created all the
13604      stubs.  */
13605   if (globals->bfd_of_glue_owner != NULL)
13606     {
13607       if (! elf32_arm_output_glue_section (info, abfd,
13608                                            globals->bfd_of_glue_owner,
13609                                            ARM2THUMB_GLUE_SECTION_NAME))
13610         return FALSE;
13611
13612       if (! elf32_arm_output_glue_section (info, abfd,
13613                                            globals->bfd_of_glue_owner,
13614                                            THUMB2ARM_GLUE_SECTION_NAME))
13615         return FALSE;
13616
13617       if (! elf32_arm_output_glue_section (info, abfd,
13618                                            globals->bfd_of_glue_owner,
13619                                            VFP11_ERRATUM_VENEER_SECTION_NAME))
13620         return FALSE;
13621
13622       if (! elf32_arm_output_glue_section (info, abfd,
13623                                            globals->bfd_of_glue_owner,
13624                                            STM32L4XX_ERRATUM_VENEER_SECTION_NAME))
13625         return FALSE;
13626
13627       if (! elf32_arm_output_glue_section (info, abfd,
13628                                            globals->bfd_of_glue_owner,
13629                                            ARM_BX_GLUE_SECTION_NAME))
13630         return FALSE;
13631     }
13632
13633   return TRUE;
13634 }
13635
13636 /* Return a best guess for the machine number based on the attributes.  */
13637
13638 static unsigned int
13639 bfd_arm_get_mach_from_attributes (bfd * abfd)
13640 {
13641   int arch = bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_PROC, Tag_CPU_arch);
13642
13643   switch (arch)
13644     {
13645     case TAG_CPU_ARCH_V4: return bfd_mach_arm_4;
13646     case TAG_CPU_ARCH_V4T: return bfd_mach_arm_4T;
13647     case TAG_CPU_ARCH_V5T: return bfd_mach_arm_5T;
13648
13649     case TAG_CPU_ARCH_V5TE:
13650       {
13651         char * name;
13652
13653         BFD_ASSERT (Tag_CPU_name < NUM_KNOWN_OBJ_ATTRIBUTES);
13654         name = elf_known_obj_attributes (abfd) [OBJ_ATTR_PROC][Tag_CPU_name].s;
13655
13656         if (name)
13657           {
13658             if (strcmp (name, "IWMMXT2") == 0)
13659               return bfd_mach_arm_iWMMXt2;
13660
13661             if (strcmp (name, "IWMMXT") == 0)
13662               return bfd_mach_arm_iWMMXt;
13663
13664             if (strcmp (name, "XSCALE") == 0)
13665               {
13666                 int wmmx;
13667
13668                 BFD_ASSERT (Tag_WMMX_arch < NUM_KNOWN_OBJ_ATTRIBUTES);
13669                 wmmx = elf_known_obj_attributes (abfd) [OBJ_ATTR_PROC][Tag_WMMX_arch].i;
13670                 switch (wmmx)
13671                   {
13672                   case 1: return bfd_mach_arm_iWMMXt;
13673                   case 2: return bfd_mach_arm_iWMMXt2;
13674                   default: return bfd_mach_arm_XScale;
13675                   }
13676               }
13677           }
13678
13679         return bfd_mach_arm_5TE;
13680       }
13681
13682     default:
13683       return bfd_mach_arm_unknown;
13684     }
13685 }
13686
13687 /* Set the right machine number.  */
13688
13689 static bfd_boolean
13690 elf32_arm_object_p (bfd *abfd)
13691 {
13692   unsigned int mach;
13693
13694   mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
13695
13696   if (mach == bfd_mach_arm_unknown)
13697     {
13698       if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
13699         mach = bfd_mach_arm_ep9312;
13700       else
13701         mach = bfd_arm_get_mach_from_attributes (abfd);
13702     }
13703
13704   bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
13705   return TRUE;
13706 }
13707
13708 /* Function to keep ARM specific flags in the ELF header.  */
13709
13710 static bfd_boolean
13711 elf32_arm_set_private_flags (bfd *abfd, flagword flags)
13712 {
13713   if (elf_flags_init (abfd)
13714       && elf_elfheader (abfd)->e_flags != flags)
13715     {
13716       if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
13717         {
13718           if (flags & EF_ARM_INTERWORK)
13719             _bfd_error_handler
13720               (_("warning: not setting interworking flag of %pB since it has already been specified as non-interworking"),
13721                abfd);
13722           else
13723             _bfd_error_handler
13724               (_("warning: clearing the interworking flag of %pB due to outside request"),
13725                abfd);
13726         }
13727     }
13728   else
13729     {
13730       elf_elfheader (abfd)->e_flags = flags;
13731       elf_flags_init (abfd) = TRUE;
13732     }
13733
13734   return TRUE;
13735 }
13736
13737 /* Copy backend specific data from one object module to another.  */
13738
13739 static bfd_boolean
13740 elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
13741 {
13742   flagword in_flags;
13743   flagword out_flags;
13744
13745   if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
13746     return TRUE;
13747
13748   in_flags  = elf_elfheader (ibfd)->e_flags;
13749   out_flags = elf_elfheader (obfd)->e_flags;
13750
13751   if (elf_flags_init (obfd)
13752       && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
13753       && in_flags != out_flags)
13754     {
13755       /* Cannot mix APCS26 and APCS32 code.  */
13756       if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
13757         return FALSE;
13758
13759       /* Cannot mix float APCS and non-float APCS code.  */
13760       if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
13761         return FALSE;
13762
13763       /* If the src and dest have different interworking flags
13764          then turn off the interworking bit.  */
13765       if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
13766         {
13767           if (out_flags & EF_ARM_INTERWORK)
13768             _bfd_error_handler
13769               (_("warning: clearing the interworking flag of %pB because non-interworking code in %pB has been linked with it"),
13770                obfd, ibfd);
13771
13772           in_flags &= ~EF_ARM_INTERWORK;
13773         }
13774
13775       /* Likewise for PIC, though don't warn for this case.  */
13776       if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
13777         in_flags &= ~EF_ARM_PIC;
13778     }
13779
13780   elf_elfheader (obfd)->e_flags = in_flags;
13781   elf_flags_init (obfd) = TRUE;
13782
13783   return _bfd_elf_copy_private_bfd_data (ibfd, obfd);
13784 }
13785
13786 /* Values for Tag_ABI_PCS_R9_use.  */
13787 enum
13788 {
13789   AEABI_R9_V6,
13790   AEABI_R9_SB,
13791   AEABI_R9_TLS,
13792   AEABI_R9_unused
13793 };
13794
13795 /* Values for Tag_ABI_PCS_RW_data.  */
13796 enum
13797 {
13798   AEABI_PCS_RW_data_absolute,
13799   AEABI_PCS_RW_data_PCrel,
13800   AEABI_PCS_RW_data_SBrel,
13801   AEABI_PCS_RW_data_unused
13802 };
13803
13804 /* Values for Tag_ABI_enum_size.  */
13805 enum
13806 {
13807   AEABI_enum_unused,
13808   AEABI_enum_short,
13809   AEABI_enum_wide,
13810   AEABI_enum_forced_wide
13811 };
13812
13813 /* Determine whether an object attribute tag takes an integer, a
13814    string or both.  */
13815
13816 static int
13817 elf32_arm_obj_attrs_arg_type (int tag)
13818 {
13819   if (tag == Tag_compatibility)
13820     return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL;
13821   else if (tag == Tag_nodefaults)
13822     return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_NO_DEFAULT;
13823   else if (tag == Tag_CPU_raw_name || tag == Tag_CPU_name)
13824     return ATTR_TYPE_FLAG_STR_VAL;
13825   else if (tag < 32)
13826     return ATTR_TYPE_FLAG_INT_VAL;
13827   else
13828     return (tag & 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL : ATTR_TYPE_FLAG_INT_VAL;
13829 }
13830
13831 /* The ABI defines that Tag_conformance should be emitted first, and that
13832    Tag_nodefaults should be second (if either is defined).  This sets those
13833    two positions, and bumps up the position of all the remaining tags to
13834    compensate.  */
13835 static int
13836 elf32_arm_obj_attrs_order (int num)
13837 {
13838   if (num == LEAST_KNOWN_OBJ_ATTRIBUTE)
13839     return Tag_conformance;
13840   if (num == LEAST_KNOWN_OBJ_ATTRIBUTE + 1)
13841     return Tag_nodefaults;
13842   if ((num - 2) < Tag_nodefaults)
13843     return num - 2;
13844   if ((num - 1) < Tag_conformance)
13845     return num - 1;
13846   return num;
13847 }
13848
13849 /* Attribute numbers >=64 (mod 128) can be safely ignored.  */
13850 static bfd_boolean
13851 elf32_arm_obj_attrs_handle_unknown (bfd *abfd, int tag)
13852 {
13853   if ((tag & 127) < 64)
13854     {
13855       _bfd_error_handler
13856         (_("%pB: unknown mandatory EABI object attribute %d"),
13857          abfd, tag);
13858       bfd_set_error (bfd_error_bad_value);
13859       return FALSE;
13860     }
13861   else
13862     {
13863       _bfd_error_handler
13864         (_("warning: %pB: unknown EABI object attribute %d"),
13865          abfd, tag);
13866       return TRUE;
13867     }
13868 }
13869
13870 /* Read the architecture from the Tag_also_compatible_with attribute, if any.
13871    Returns -1 if no architecture could be read.  */
13872
13873 static int
13874 get_secondary_compatible_arch (bfd *abfd)
13875 {
13876   obj_attribute *attr =
13877     &elf_known_obj_attributes_proc (abfd)[Tag_also_compatible_with];
13878
13879   /* Note: the tag and its argument below are uleb128 values, though
13880      currently-defined values fit in one byte for each.  */
13881   if (attr->s
13882       && attr->s[0] == Tag_CPU_arch
13883       && (attr->s[1] & 128) != 128
13884       && attr->s[2] == 0)
13885    return attr->s[1];
13886
13887   /* This tag is "safely ignorable", so don't complain if it looks funny.  */
13888   return -1;
13889 }
13890
13891 /* Set, or unset, the architecture of the Tag_also_compatible_with attribute.
13892    The tag is removed if ARCH is -1.  */
13893
13894 static void
13895 set_secondary_compatible_arch (bfd *abfd, int arch)
13896 {
13897   obj_attribute *attr =
13898     &elf_known_obj_attributes_proc (abfd)[Tag_also_compatible_with];
13899
13900   if (arch == -1)
13901     {
13902       attr->s = NULL;
13903       return;
13904     }
13905
13906   /* Note: the tag and its argument below are uleb128 values, though
13907      currently-defined values fit in one byte for each.  */
13908   if (!attr->s)
13909     attr->s = (char *) bfd_alloc (abfd, 3);
13910   attr->s[0] = Tag_CPU_arch;
13911   attr->s[1] = arch;
13912   attr->s[2] = '\0';
13913 }
13914
13915 /* Combine two values for Tag_CPU_arch, taking secondary compatibility tags
13916    into account.  */
13917
13918 static int
13919 tag_cpu_arch_combine (bfd *ibfd, int oldtag, int *secondary_compat_out,
13920                       int newtag, int secondary_compat)
13921 {
13922 #define T(X) TAG_CPU_ARCH_##X
13923   int tagl, tagh, result;
13924   const int v6t2[] =
13925     {
13926       T(V6T2),   /* PRE_V4.  */
13927       T(V6T2),   /* V4.  */
13928       T(V6T2),   /* V4T.  */
13929       T(V6T2),   /* V5T.  */
13930       T(V6T2),   /* V5TE.  */
13931       T(V6T2),   /* V5TEJ.  */
13932       T(V6T2),   /* V6.  */
13933       T(V7),     /* V6KZ.  */
13934       T(V6T2)    /* V6T2.  */
13935     };
13936   const int v6k[] =
13937     {
13938       T(V6K),    /* PRE_V4.  */
13939       T(V6K),    /* V4.  */
13940       T(V6K),    /* V4T.  */
13941       T(V6K),    /* V5T.  */
13942       T(V6K),    /* V5TE.  */
13943       T(V6K),    /* V5TEJ.  */
13944       T(V6K),    /* V6.  */
13945       T(V6KZ),   /* V6KZ.  */
13946       T(V7),     /* V6T2.  */
13947       T(V6K)     /* V6K.  */
13948     };
13949   const int v7[] =
13950     {
13951       T(V7),     /* PRE_V4.  */
13952       T(V7),     /* V4.  */
13953       T(V7),     /* V4T.  */
13954       T(V7),     /* V5T.  */
13955       T(V7),     /* V5TE.  */
13956       T(V7),     /* V5TEJ.  */
13957       T(V7),     /* V6.  */
13958       T(V7),     /* V6KZ.  */
13959       T(V7),     /* V6T2.  */
13960       T(V7),     /* V6K.  */
13961       T(V7)      /* V7.  */
13962     };
13963   const int v6_m[] =
13964     {
13965       -1,        /* PRE_V4.  */
13966       -1,        /* V4.  */
13967       T(V6K),    /* V4T.  */
13968       T(V6K),    /* V5T.  */
13969       T(V6K),    /* V5TE.  */
13970       T(V6K),    /* V5TEJ.  */
13971       T(V6K),    /* V6.  */
13972       T(V6KZ),   /* V6KZ.  */
13973       T(V7),     /* V6T2.  */
13974       T(V6K),    /* V6K.  */
13975       T(V7),     /* V7.  */
13976       T(V6_M)    /* V6_M.  */
13977     };
13978   const int v6s_m[] =
13979     {
13980       -1,        /* PRE_V4.  */
13981       -1,        /* V4.  */
13982       T(V6K),    /* V4T.  */
13983       T(V6K),    /* V5T.  */
13984       T(V6K),    /* V5TE.  */
13985       T(V6K),    /* V5TEJ.  */
13986       T(V6K),    /* V6.  */
13987       T(V6KZ),   /* V6KZ.  */
13988       T(V7),     /* V6T2.  */
13989       T(V6K),    /* V6K.  */
13990       T(V7),     /* V7.  */
13991       T(V6S_M),  /* V6_M.  */
13992       T(V6S_M)   /* V6S_M.  */
13993     };
13994   const int v7e_m[] =
13995     {
13996       -1,        /* PRE_V4.  */
13997       -1,        /* V4.  */
13998       T(V7E_M),  /* V4T.  */
13999       T(V7E_M),  /* V5T.  */
14000       T(V7E_M),  /* V5TE.  */
14001       T(V7E_M),  /* V5TEJ.  */
14002       T(V7E_M),  /* V6.  */
14003       T(V7E_M),  /* V6KZ.  */
14004       T(V7E_M),  /* V6T2.  */
14005       T(V7E_M),  /* V6K.  */
14006       T(V7E_M),  /* V7.  */
14007       T(V7E_M),  /* V6_M.  */
14008       T(V7E_M),  /* V6S_M.  */
14009       T(V7E_M)   /* V7E_M.  */
14010     };
14011   const int v8[] =
14012     {
14013       T(V8),            /* PRE_V4.  */
14014       T(V8),            /* V4.  */
14015       T(V8),            /* V4T.  */
14016       T(V8),            /* V5T.  */
14017       T(V8),            /* V5TE.  */
14018       T(V8),            /* V5TEJ.  */
14019       T(V8),            /* V6.  */
14020       T(V8),            /* V6KZ.  */
14021       T(V8),            /* V6T2.  */
14022       T(V8),            /* V6K.  */
14023       T(V8),            /* V7.  */
14024       T(V8),            /* V6_M.  */
14025       T(V8),            /* V6S_M.  */
14026       T(V8),            /* V7E_M.  */
14027       T(V8)             /* V8.  */
14028     };
14029   const int v8r[] =
14030     {
14031       T(V8R),           /* PRE_V4.  */
14032       T(V8R),           /* V4.  */
14033       T(V8R),           /* V4T.  */
14034       T(V8R),           /* V5T.  */
14035       T(V8R),           /* V5TE.  */
14036       T(V8R),           /* V5TEJ.  */
14037       T(V8R),           /* V6.  */
14038       T(V8R),           /* V6KZ.  */
14039       T(V8R),           /* V6T2.  */
14040       T(V8R),           /* V6K.  */
14041       T(V8R),           /* V7.  */
14042       T(V8R),           /* V6_M.  */
14043       T(V8R),           /* V6S_M.  */
14044       T(V8R),           /* V7E_M.  */
14045       T(V8),            /* V8.  */
14046       T(V8R),           /* V8R.  */
14047     };
14048   const int v8m_baseline[] =
14049     {
14050       -1,               /* PRE_V4.  */
14051       -1,               /* V4.  */
14052       -1,               /* V4T.  */
14053       -1,               /* V5T.  */
14054       -1,               /* V5TE.  */
14055       -1,               /* V5TEJ.  */
14056       -1,               /* V6.  */
14057       -1,               /* V6KZ.  */
14058       -1,               /* V6T2.  */
14059       -1,               /* V6K.  */
14060       -1,               /* V7.  */
14061       T(V8M_BASE),      /* V6_M.  */
14062       T(V8M_BASE),      /* V6S_M.  */
14063       -1,               /* V7E_M.  */
14064       -1,               /* V8.  */
14065       -1,               /* V8R.  */
14066       T(V8M_BASE)       /* V8-M BASELINE.  */
14067     };
14068   const int v8m_mainline[] =
14069     {
14070       -1,               /* PRE_V4.  */
14071       -1,               /* V4.  */
14072       -1,               /* V4T.  */
14073       -1,               /* V5T.  */
14074       -1,               /* V5TE.  */
14075       -1,               /* V5TEJ.  */
14076       -1,               /* V6.  */
14077       -1,               /* V6KZ.  */
14078       -1,               /* V6T2.  */
14079       -1,               /* V6K.  */
14080       T(V8M_MAIN),      /* V7.  */
14081       T(V8M_MAIN),      /* V6_M.  */
14082       T(V8M_MAIN),      /* V6S_M.  */
14083       T(V8M_MAIN),      /* V7E_M.  */
14084       -1,               /* V8.  */
14085       -1,               /* V8R.  */
14086       T(V8M_MAIN),      /* V8-M BASELINE.  */
14087       T(V8M_MAIN)       /* V8-M MAINLINE.  */
14088     };
14089   const int v4t_plus_v6_m[] =
14090     {
14091       -1,               /* PRE_V4.  */
14092       -1,               /* V4.  */
14093       T(V4T),           /* V4T.  */
14094       T(V5T),           /* V5T.  */
14095       T(V5TE),          /* V5TE.  */
14096       T(V5TEJ),         /* V5TEJ.  */
14097       T(V6),            /* V6.  */
14098       T(V6KZ),          /* V6KZ.  */
14099       T(V6T2),          /* V6T2.  */
14100       T(V6K),           /* V6K.  */
14101       T(V7),            /* V7.  */
14102       T(V6_M),          /* V6_M.  */
14103       T(V6S_M),         /* V6S_M.  */
14104       T(V7E_M),         /* V7E_M.  */
14105       T(V8),            /* V8.  */
14106       -1,               /* V8R.  */
14107       T(V8M_BASE),      /* V8-M BASELINE.  */
14108       T(V8M_MAIN),      /* V8-M MAINLINE.  */
14109       T(V4T_PLUS_V6_M)  /* V4T plus V6_M.  */
14110     };
14111   const int *comb[] =
14112     {
14113       v6t2,
14114       v6k,
14115       v7,
14116       v6_m,
14117       v6s_m,
14118       v7e_m,
14119       v8,
14120       v8r,
14121       v8m_baseline,
14122       v8m_mainline,
14123       /* Pseudo-architecture.  */
14124       v4t_plus_v6_m
14125     };
14126
14127   /* Check we've not got a higher architecture than we know about.  */
14128
14129   if (oldtag > MAX_TAG_CPU_ARCH || newtag > MAX_TAG_CPU_ARCH)
14130     {
14131       _bfd_error_handler (_("error: %pB: unknown CPU architecture"), ibfd);
14132       return -1;
14133     }
14134
14135   /* Override old tag if we have a Tag_also_compatible_with on the output.  */
14136
14137   if ((oldtag == T(V6_M) && *secondary_compat_out == T(V4T))
14138       || (oldtag == T(V4T) && *secondary_compat_out == T(V6_M)))
14139     oldtag = T(V4T_PLUS_V6_M);
14140
14141   /* And override the new tag if we have a Tag_also_compatible_with on the
14142      input.  */
14143
14144   if ((newtag == T(V6_M) && secondary_compat == T(V4T))
14145       || (newtag == T(V4T) && secondary_compat == T(V6_M)))
14146     newtag = T(V4T_PLUS_V6_M);
14147
14148   tagl = (oldtag < newtag) ? oldtag : newtag;
14149   result = tagh = (oldtag > newtag) ? oldtag : newtag;
14150
14151   /* Architectures before V6KZ add features monotonically.  */
14152   if (tagh <= TAG_CPU_ARCH_V6KZ)
14153     return result;
14154
14155   result = comb[tagh - T(V6T2)] ? comb[tagh - T(V6T2)][tagl] : -1;
14156
14157   /* Use Tag_CPU_arch == V4T and Tag_also_compatible_with (Tag_CPU_arch V6_M)
14158      as the canonical version.  */
14159   if (result == T(V4T_PLUS_V6_M))
14160     {
14161       result = T(V4T);
14162       *secondary_compat_out = T(V6_M);
14163     }
14164   else
14165     *secondary_compat_out = -1;
14166
14167   if (result == -1)
14168     {
14169       _bfd_error_handler (_("error: %pB: conflicting CPU architectures %d/%d"),
14170                           ibfd, oldtag, newtag);
14171       return -1;
14172     }
14173
14174   return result;
14175 #undef T
14176 }
14177
14178 /* Query attributes object to see if integer divide instructions may be
14179    present in an object.  */
14180 static bfd_boolean
14181 elf32_arm_attributes_accept_div (const obj_attribute *attr)
14182 {
14183   int arch = attr[Tag_CPU_arch].i;
14184   int profile = attr[Tag_CPU_arch_profile].i;
14185
14186   switch (attr[Tag_DIV_use].i)
14187     {
14188     case 0:
14189       /* Integer divide allowed if instruction contained in archetecture.  */
14190       if (arch == TAG_CPU_ARCH_V7 && (profile == 'R' || profile == 'M'))
14191         return TRUE;
14192       else if (arch >= TAG_CPU_ARCH_V7E_M)
14193         return TRUE;
14194       else
14195         return FALSE;
14196
14197     case 1:
14198       /* Integer divide explicitly prohibited.  */
14199       return FALSE;
14200
14201     default:
14202       /* Unrecognised case - treat as allowing divide everywhere.  */
14203     case 2:
14204       /* Integer divide allowed in ARM state.  */
14205       return TRUE;
14206     }
14207 }
14208
14209 /* Query attributes object to see if integer divide instructions are
14210    forbidden to be in the object.  This is not the inverse of
14211    elf32_arm_attributes_accept_div.  */
14212 static bfd_boolean
14213 elf32_arm_attributes_forbid_div (const obj_attribute *attr)
14214 {
14215   return attr[Tag_DIV_use].i == 1;
14216 }
14217
14218 /* Merge EABI object attributes from IBFD into OBFD.  Raise an error if there
14219    are conflicting attributes.  */
14220
14221 static bfd_boolean
14222 elf32_arm_merge_eabi_attributes (bfd *ibfd, struct bfd_link_info *info)
14223 {
14224   bfd *obfd = info->output_bfd;
14225   obj_attribute *in_attr;
14226   obj_attribute *out_attr;
14227   /* Some tags have 0 = don't care, 1 = strong requirement,
14228      2 = weak requirement.  */
14229   static const int order_021[3] = {0, 2, 1};
14230   int i;
14231   bfd_boolean result = TRUE;
14232   const char *sec_name = get_elf_backend_data (ibfd)->obj_attrs_section;
14233
14234   /* Skip the linker stubs file.  This preserves previous behavior
14235      of accepting unknown attributes in the first input file - but
14236      is that a bug?  */
14237   if (ibfd->flags & BFD_LINKER_CREATED)
14238     return TRUE;
14239
14240   /* Skip any input that hasn't attribute section.
14241      This enables to link object files without attribute section with
14242      any others.  */
14243   if (bfd_get_section_by_name (ibfd, sec_name) == NULL)
14244     return TRUE;
14245
14246   if (!elf_known_obj_attributes_proc (obfd)[0].i)
14247     {
14248       /* This is the first object.  Copy the attributes.  */
14249       _bfd_elf_copy_obj_attributes (ibfd, obfd);
14250
14251       out_attr = elf_known_obj_attributes_proc (obfd);
14252
14253       /* Use the Tag_null value to indicate the attributes have been
14254          initialized.  */
14255       out_attr[0].i = 1;
14256
14257       /* We do not output objects with Tag_MPextension_use_legacy - we move
14258          the attribute's value to Tag_MPextension_use.  */
14259       if (out_attr[Tag_MPextension_use_legacy].i != 0)
14260         {
14261           if (out_attr[Tag_MPextension_use].i != 0
14262               && out_attr[Tag_MPextension_use_legacy].i
14263                 != out_attr[Tag_MPextension_use].i)
14264             {
14265               _bfd_error_handler
14266                 (_("Error: %pB has both the current and legacy "
14267                    "Tag_MPextension_use attributes"), ibfd);
14268               result = FALSE;
14269             }
14270
14271           out_attr[Tag_MPextension_use] =
14272             out_attr[Tag_MPextension_use_legacy];
14273           out_attr[Tag_MPextension_use_legacy].type = 0;
14274           out_attr[Tag_MPextension_use_legacy].i = 0;
14275         }
14276
14277       return result;
14278     }
14279
14280   in_attr = elf_known_obj_attributes_proc (ibfd);
14281   out_attr = elf_known_obj_attributes_proc (obfd);
14282   /* This needs to happen before Tag_ABI_FP_number_model is merged.  */
14283   if (in_attr[Tag_ABI_VFP_args].i != out_attr[Tag_ABI_VFP_args].i)
14284     {
14285       /* Ignore mismatches if the object doesn't use floating point or is
14286          floating point ABI independent.  */
14287       if (out_attr[Tag_ABI_FP_number_model].i == AEABI_FP_number_model_none
14288           || (in_attr[Tag_ABI_FP_number_model].i != AEABI_FP_number_model_none
14289               && out_attr[Tag_ABI_VFP_args].i == AEABI_VFP_args_compatible))
14290         out_attr[Tag_ABI_VFP_args].i = in_attr[Tag_ABI_VFP_args].i;
14291       else if (in_attr[Tag_ABI_FP_number_model].i != AEABI_FP_number_model_none
14292                && in_attr[Tag_ABI_VFP_args].i != AEABI_VFP_args_compatible)
14293         {
14294           _bfd_error_handler
14295             (_("error: %pB uses VFP register arguments, %pB does not"),
14296              in_attr[Tag_ABI_VFP_args].i ? ibfd : obfd,
14297              in_attr[Tag_ABI_VFP_args].i ? obfd : ibfd);
14298           result = FALSE;
14299         }
14300     }
14301
14302   for (i = LEAST_KNOWN_OBJ_ATTRIBUTE; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++)
14303     {
14304       /* Merge this attribute with existing attributes.  */
14305       switch (i)
14306         {
14307         case Tag_CPU_raw_name:
14308         case Tag_CPU_name:
14309           /* These are merged after Tag_CPU_arch.  */
14310           break;
14311
14312         case Tag_ABI_optimization_goals:
14313         case Tag_ABI_FP_optimization_goals:
14314           /* Use the first value seen.  */
14315           break;
14316
14317         case Tag_CPU_arch:
14318           {
14319             int secondary_compat = -1, secondary_compat_out = -1;
14320             unsigned int saved_out_attr = out_attr[i].i;
14321             int arch_attr;
14322             static const char *name_table[] =
14323               {
14324                 /* These aren't real CPU names, but we can't guess
14325                    that from the architecture version alone.  */
14326                 "Pre v4",
14327                 "ARM v4",
14328                 "ARM v4T",
14329                 "ARM v5T",
14330                 "ARM v5TE",
14331                 "ARM v5TEJ",
14332                 "ARM v6",
14333                 "ARM v6KZ",
14334                 "ARM v6T2",
14335                 "ARM v6K",
14336                 "ARM v7",
14337                 "ARM v6-M",
14338                 "ARM v6S-M",
14339                 "ARM v8",
14340                 "",
14341                 "ARM v8-M.baseline",
14342                 "ARM v8-M.mainline",
14343             };
14344
14345             /* Merge Tag_CPU_arch and Tag_also_compatible_with.  */
14346             secondary_compat = get_secondary_compatible_arch (ibfd);
14347             secondary_compat_out = get_secondary_compatible_arch (obfd);
14348             arch_attr = tag_cpu_arch_combine (ibfd, out_attr[i].i,
14349                                               &secondary_compat_out,
14350                                               in_attr[i].i,
14351                                               secondary_compat);
14352
14353             /* Return with error if failed to merge.  */
14354             if (arch_attr == -1)
14355               return FALSE;
14356
14357             out_attr[i].i = arch_attr;
14358
14359             set_secondary_compatible_arch (obfd, secondary_compat_out);
14360
14361             /* Merge Tag_CPU_name and Tag_CPU_raw_name.  */
14362             if (out_attr[i].i == saved_out_attr)
14363               ; /* Leave the names alone.  */
14364             else if (out_attr[i].i == in_attr[i].i)
14365               {
14366                 /* The output architecture has been changed to match the
14367                    input architecture.  Use the input names.  */
14368                 out_attr[Tag_CPU_name].s = in_attr[Tag_CPU_name].s
14369                   ? _bfd_elf_attr_strdup (obfd, in_attr[Tag_CPU_name].s)
14370                   : NULL;
14371                 out_attr[Tag_CPU_raw_name].s = in_attr[Tag_CPU_raw_name].s
14372                   ? _bfd_elf_attr_strdup (obfd, in_attr[Tag_CPU_raw_name].s)
14373                   : NULL;
14374               }
14375             else
14376               {
14377                 out_attr[Tag_CPU_name].s = NULL;
14378                 out_attr[Tag_CPU_raw_name].s = NULL;
14379               }
14380
14381             /* If we still don't have a value for Tag_CPU_name,
14382                make one up now.  Tag_CPU_raw_name remains blank.  */
14383             if (out_attr[Tag_CPU_name].s == NULL
14384                 && out_attr[i].i < ARRAY_SIZE (name_table))
14385               out_attr[Tag_CPU_name].s =
14386                 _bfd_elf_attr_strdup (obfd, name_table[out_attr[i].i]);
14387           }
14388           break;
14389
14390         case Tag_ARM_ISA_use:
14391         case Tag_THUMB_ISA_use:
14392         case Tag_WMMX_arch:
14393         case Tag_Advanced_SIMD_arch:
14394           /* ??? Do Advanced_SIMD (NEON) and WMMX conflict?  */
14395         case Tag_ABI_FP_rounding:
14396         case Tag_ABI_FP_exceptions:
14397         case Tag_ABI_FP_user_exceptions:
14398         case Tag_ABI_FP_number_model:
14399         case Tag_FP_HP_extension:
14400         case Tag_CPU_unaligned_access:
14401         case Tag_T2EE_use:
14402         case Tag_MPextension_use:
14403           /* Use the largest value specified.  */
14404           if (in_attr[i].i > out_attr[i].i)
14405             out_attr[i].i = in_attr[i].i;
14406           break;
14407
14408         case Tag_ABI_align_preserved:
14409         case Tag_ABI_PCS_RO_data:
14410           /* Use the smallest value specified.  */
14411           if (in_attr[i].i < out_attr[i].i)
14412             out_attr[i].i = in_attr[i].i;
14413           break;
14414
14415         case Tag_ABI_align_needed:
14416           if ((in_attr[i].i > 0 || out_attr[i].i > 0)
14417               && (in_attr[Tag_ABI_align_preserved].i == 0
14418                   || out_attr[Tag_ABI_align_preserved].i == 0))
14419             {
14420               /* This error message should be enabled once all non-conformant
14421                  binaries in the toolchain have had the attributes set
14422                  properly.
14423               _bfd_error_handler
14424                 (_("error: %pB: 8-byte data alignment conflicts with %pB"),
14425                  obfd, ibfd);
14426               result = FALSE; */
14427             }
14428           /* Fall through.  */
14429         case Tag_ABI_FP_denormal:
14430         case Tag_ABI_PCS_GOT_use:
14431           /* Use the "greatest" from the sequence 0, 2, 1, or the largest
14432              value if greater than 2 (for future-proofing).  */
14433           if ((in_attr[i].i > 2 && in_attr[i].i > out_attr[i].i)
14434               || (in_attr[i].i <= 2 && out_attr[i].i <= 2
14435                   && order_021[in_attr[i].i] > order_021[out_attr[i].i]))
14436             out_attr[i].i = in_attr[i].i;
14437           break;
14438
14439         case Tag_Virtualization_use:
14440           /* The virtualization tag effectively stores two bits of
14441              information: the intended use of TrustZone (in bit 0), and the
14442              intended use of Virtualization (in bit 1).  */
14443           if (out_attr[i].i == 0)
14444             out_attr[i].i = in_attr[i].i;
14445           else if (in_attr[i].i != 0
14446                    && in_attr[i].i != out_attr[i].i)
14447             {
14448               if (in_attr[i].i <= 3 && out_attr[i].i <= 3)
14449                 out_attr[i].i = 3;
14450               else
14451                 {
14452                   _bfd_error_handler
14453                     (_("error: %pB: unable to merge virtualization attributes "
14454                        "with %pB"),
14455                      obfd, ibfd);
14456                   result = FALSE;
14457                 }
14458             }
14459           break;
14460
14461         case Tag_CPU_arch_profile:
14462           if (out_attr[i].i != in_attr[i].i)
14463             {
14464               /* 0 will merge with anything.
14465                  'A' and 'S' merge to 'A'.
14466                  'R' and 'S' merge to 'R'.
14467                  'M' and 'A|R|S' is an error.  */
14468               if (out_attr[i].i == 0
14469                   || (out_attr[i].i == 'S'
14470                       && (in_attr[i].i == 'A' || in_attr[i].i == 'R')))
14471                 out_attr[i].i = in_attr[i].i;
14472               else if (in_attr[i].i == 0
14473                        || (in_attr[i].i == 'S'
14474                            && (out_attr[i].i == 'A' || out_attr[i].i == 'R')))
14475                 ; /* Do nothing.  */
14476               else
14477                 {
14478                   _bfd_error_handler
14479                     (_("error: %pB: conflicting architecture profiles %c/%c"),
14480                      ibfd,
14481                      in_attr[i].i ? in_attr[i].i : '0',
14482                      out_attr[i].i ? out_attr[i].i : '0');
14483                   result = FALSE;
14484                 }
14485             }
14486           break;
14487
14488         case Tag_DSP_extension:
14489           /* No need to change output value if any of:
14490              - pre (<=) ARMv5T input architecture (do not have DSP)
14491              - M input profile not ARMv7E-M and do not have DSP.  */
14492           if (in_attr[Tag_CPU_arch].i <= 3
14493               || (in_attr[Tag_CPU_arch_profile].i == 'M'
14494                   && in_attr[Tag_CPU_arch].i != 13
14495                   && in_attr[i].i == 0))
14496             ; /* Do nothing.  */
14497           /* Output value should be 0 if DSP part of architecture, ie.
14498              - post (>=) ARMv5te architecture output
14499              - A, R or S profile output or ARMv7E-M output architecture.  */
14500           else if (out_attr[Tag_CPU_arch].i >= 4
14501                    && (out_attr[Tag_CPU_arch_profile].i == 'A'
14502                        || out_attr[Tag_CPU_arch_profile].i == 'R'
14503                        || out_attr[Tag_CPU_arch_profile].i == 'S'
14504                        || out_attr[Tag_CPU_arch].i == 13))
14505             out_attr[i].i = 0;
14506           /* Otherwise, DSP instructions are added and not part of output
14507              architecture.  */
14508           else
14509             out_attr[i].i = 1;
14510           break;
14511
14512         case Tag_FP_arch:
14513             {
14514               /* Tag_ABI_HardFP_use is handled along with Tag_FP_arch since
14515                  the meaning of Tag_ABI_HardFP_use depends on Tag_FP_arch
14516                  when it's 0.  It might mean absence of FP hardware if
14517                  Tag_FP_arch is zero.  */
14518
14519 #define VFP_VERSION_COUNT 9
14520               static const struct
14521               {
14522                   int ver;
14523                   int regs;
14524               } vfp_versions[VFP_VERSION_COUNT] =
14525                 {
14526                   {0, 0},
14527                   {1, 16},
14528                   {2, 16},
14529                   {3, 32},
14530                   {3, 16},
14531                   {4, 32},
14532                   {4, 16},
14533                   {8, 32},
14534                   {8, 16}
14535                 };
14536               int ver;
14537               int regs;
14538               int newval;
14539
14540               /* If the output has no requirement about FP hardware,
14541                  follow the requirement of the input.  */
14542               if (out_attr[i].i == 0)
14543                 {
14544                   /* This assert is still reasonable, we shouldn't
14545                      produce the suspicious build attribute
14546                      combination (See below for in_attr).  */
14547                   BFD_ASSERT (out_attr[Tag_ABI_HardFP_use].i == 0);
14548                   out_attr[i].i = in_attr[i].i;
14549                   out_attr[Tag_ABI_HardFP_use].i
14550                     = in_attr[Tag_ABI_HardFP_use].i;
14551                   break;
14552                 }
14553               /* If the input has no requirement about FP hardware, do
14554                  nothing.  */
14555               else if (in_attr[i].i == 0)
14556                 {
14557                   /* We used to assert that Tag_ABI_HardFP_use was
14558                      zero here, but we should never assert when
14559                      consuming an object file that has suspicious
14560                      build attributes.  The single precision variant
14561                      of 'no FP architecture' is still 'no FP
14562                      architecture', so we just ignore the tag in this
14563                      case.  */
14564                   break;
14565                 }
14566
14567               /* Both the input and the output have nonzero Tag_FP_arch.
14568                  So Tag_ABI_HardFP_use is implied by Tag_FP_arch when it's zero.  */
14569
14570               /* If both the input and the output have zero Tag_ABI_HardFP_use,
14571                  do nothing.  */
14572               if (in_attr[Tag_ABI_HardFP_use].i == 0
14573                   && out_attr[Tag_ABI_HardFP_use].i == 0)
14574                 ;
14575               /* If the input and the output have different Tag_ABI_HardFP_use,
14576                  the combination of them is 0 (implied by Tag_FP_arch).  */
14577               else if (in_attr[Tag_ABI_HardFP_use].i
14578                        != out_attr[Tag_ABI_HardFP_use].i)
14579                 out_attr[Tag_ABI_HardFP_use].i = 0;
14580
14581               /* Now we can handle Tag_FP_arch.  */
14582
14583               /* Values of VFP_VERSION_COUNT or more aren't defined, so just
14584                  pick the biggest.  */
14585               if (in_attr[i].i >= VFP_VERSION_COUNT
14586                   && in_attr[i].i > out_attr[i].i)
14587                 {
14588                   out_attr[i] = in_attr[i];
14589                   break;
14590                 }
14591               /* The output uses the superset of input features
14592                  (ISA version) and registers.  */
14593               ver = vfp_versions[in_attr[i].i].ver;
14594               if (ver < vfp_versions[out_attr[i].i].ver)
14595                 ver = vfp_versions[out_attr[i].i].ver;
14596               regs = vfp_versions[in_attr[i].i].regs;
14597               if (regs < vfp_versions[out_attr[i].i].regs)
14598                 regs = vfp_versions[out_attr[i].i].regs;
14599               /* This assumes all possible supersets are also a valid
14600                  options.  */
14601               for (newval = VFP_VERSION_COUNT - 1; newval > 0; newval--)
14602                 {
14603                   if (regs == vfp_versions[newval].regs
14604                       && ver == vfp_versions[newval].ver)
14605                     break;
14606                 }
14607               out_attr[i].i = newval;
14608             }
14609           break;
14610         case Tag_PCS_config:
14611           if (out_attr[i].i == 0)
14612             out_attr[i].i = in_attr[i].i;
14613           else if (in_attr[i].i != 0 && out_attr[i].i != in_attr[i].i)
14614             {
14615               /* It's sometimes ok to mix different configs, so this is only
14616                  a warning.  */
14617               _bfd_error_handler
14618                 (_("warning: %pB: conflicting platform configuration"), ibfd);
14619             }
14620           break;
14621         case Tag_ABI_PCS_R9_use:
14622           if (in_attr[i].i != out_attr[i].i
14623               && out_attr[i].i != AEABI_R9_unused
14624               && in_attr[i].i != AEABI_R9_unused)
14625             {
14626               _bfd_error_handler
14627                 (_("error: %pB: conflicting use of R9"), ibfd);
14628               result = FALSE;
14629             }
14630           if (out_attr[i].i == AEABI_R9_unused)
14631             out_attr[i].i = in_attr[i].i;
14632           break;
14633         case Tag_ABI_PCS_RW_data:
14634           if (in_attr[i].i == AEABI_PCS_RW_data_SBrel
14635               && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_SB
14636               && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_unused)
14637             {
14638               _bfd_error_handler
14639                 (_("error: %pB: SB relative addressing conflicts with use of R9"),
14640                  ibfd);
14641               result = FALSE;
14642             }
14643           /* Use the smallest value specified.  */
14644           if (in_attr[i].i < out_attr[i].i)
14645             out_attr[i].i = in_attr[i].i;
14646           break;
14647         case Tag_ABI_PCS_wchar_t:
14648           if (out_attr[i].i && in_attr[i].i && out_attr[i].i != in_attr[i].i
14649               && !elf_arm_tdata (obfd)->no_wchar_size_warning)
14650             {
14651               _bfd_error_handler
14652                 (_("warning: %pB uses %u-byte wchar_t yet the output is to use %u-byte wchar_t; use of wchar_t values across objects may fail"),
14653                  ibfd, in_attr[i].i, out_attr[i].i);
14654             }
14655           else if (in_attr[i].i && !out_attr[i].i)
14656             out_attr[i].i = in_attr[i].i;
14657           break;
14658         case Tag_ABI_enum_size:
14659           if (in_attr[i].i != AEABI_enum_unused)
14660             {
14661               if (out_attr[i].i == AEABI_enum_unused
14662                   || out_attr[i].i == AEABI_enum_forced_wide)
14663                 {
14664                   /* The existing object is compatible with anything.
14665                      Use whatever requirements the new object has.  */
14666                   out_attr[i].i = in_attr[i].i;
14667                 }
14668               else if (in_attr[i].i != AEABI_enum_forced_wide
14669                        && out_attr[i].i != in_attr[i].i
14670                        && !elf_arm_tdata (obfd)->no_enum_size_warning)
14671                 {
14672                   static const char *aeabi_enum_names[] =
14673                     { "", "variable-size", "32-bit", "" };
14674                   const char *in_name =
14675                     in_attr[i].i < ARRAY_SIZE(aeabi_enum_names)
14676                     ? aeabi_enum_names[in_attr[i].i]
14677                     : "<unknown>";
14678                   const char *out_name =
14679                     out_attr[i].i < ARRAY_SIZE(aeabi_enum_names)
14680                     ? aeabi_enum_names[out_attr[i].i]
14681                     : "<unknown>";
14682                   _bfd_error_handler
14683                     (_("warning: %pB uses %s enums yet the output is to use %s enums; use of enum values across objects may fail"),
14684                      ibfd, in_name, out_name);
14685                 }
14686             }
14687           break;
14688         case Tag_ABI_VFP_args:
14689           /* Aready done.  */
14690           break;
14691         case Tag_ABI_WMMX_args:
14692           if (in_attr[i].i != out_attr[i].i)
14693             {
14694               _bfd_error_handler
14695                 (_("error: %pB uses iWMMXt register arguments, %pB does not"),
14696                  ibfd, obfd);
14697               result = FALSE;
14698             }
14699           break;
14700         case Tag_compatibility:
14701           /* Merged in target-independent code.  */
14702           break;
14703         case Tag_ABI_HardFP_use:
14704           /* This is handled along with Tag_FP_arch.  */
14705           break;
14706         case Tag_ABI_FP_16bit_format:
14707           if (in_attr[i].i != 0 && out_attr[i].i != 0)
14708             {
14709               if (in_attr[i].i != out_attr[i].i)
14710                 {
14711                   _bfd_error_handler
14712                     (_("error: fp16 format mismatch between %pB and %pB"),
14713                      ibfd, obfd);
14714                   result = FALSE;
14715                 }
14716             }
14717           if (in_attr[i].i != 0)
14718             out_attr[i].i = in_attr[i].i;
14719           break;
14720
14721         case Tag_DIV_use:
14722           /* A value of zero on input means that the divide instruction may
14723              be used if available in the base architecture as specified via
14724              Tag_CPU_arch and Tag_CPU_arch_profile.  A value of 1 means that
14725              the user did not want divide instructions.  A value of 2
14726              explicitly means that divide instructions were allowed in ARM
14727              and Thumb state.  */
14728           if (in_attr[i].i == out_attr[i].i)
14729             /* Do nothing.  */ ;
14730           else if (elf32_arm_attributes_forbid_div (in_attr)
14731                    && !elf32_arm_attributes_accept_div (out_attr))
14732             out_attr[i].i = 1;
14733           else if (elf32_arm_attributes_forbid_div (out_attr)
14734                    && elf32_arm_attributes_accept_div (in_attr))
14735             out_attr[i].i = in_attr[i].i;
14736           else if (in_attr[i].i == 2)
14737             out_attr[i].i = in_attr[i].i;
14738           break;
14739
14740         case Tag_MPextension_use_legacy:
14741           /* We don't output objects with Tag_MPextension_use_legacy - we
14742              move the value to Tag_MPextension_use.  */
14743           if (in_attr[i].i != 0 && in_attr[Tag_MPextension_use].i != 0)
14744             {
14745               if (in_attr[Tag_MPextension_use].i != in_attr[i].i)
14746                 {
14747                   _bfd_error_handler
14748                     (_("%pB has both the current and legacy "
14749                        "Tag_MPextension_use attributes"),
14750                      ibfd);
14751                   result = FALSE;
14752                 }
14753             }
14754
14755           if (in_attr[i].i > out_attr[Tag_MPextension_use].i)
14756             out_attr[Tag_MPextension_use] = in_attr[i];
14757
14758           break;
14759
14760         case Tag_nodefaults:
14761           /* This tag is set if it exists, but the value is unused (and is
14762              typically zero).  We don't actually need to do anything here -
14763              the merge happens automatically when the type flags are merged
14764              below.  */
14765           break;
14766         case Tag_also_compatible_with:
14767           /* Already done in Tag_CPU_arch.  */
14768           break;
14769         case Tag_conformance:
14770           /* Keep the attribute if it matches.  Throw it away otherwise.
14771              No attribute means no claim to conform.  */
14772           if (!in_attr[i].s || !out_attr[i].s
14773               || strcmp (in_attr[i].s, out_attr[i].s) != 0)
14774             out_attr[i].s = NULL;
14775           break;
14776
14777         default:
14778           result
14779             = result && _bfd_elf_merge_unknown_attribute_low (ibfd, obfd, i);
14780         }
14781
14782       /* If out_attr was copied from in_attr then it won't have a type yet.  */
14783       if (in_attr[i].type && !out_attr[i].type)
14784         out_attr[i].type = in_attr[i].type;
14785     }
14786
14787   /* Merge Tag_compatibility attributes and any common GNU ones.  */
14788   if (!_bfd_elf_merge_object_attributes (ibfd, info))
14789     return FALSE;
14790
14791   /* Check for any attributes not known on ARM.  */
14792   result &= _bfd_elf_merge_unknown_attribute_list (ibfd, obfd);
14793
14794   return result;
14795 }
14796
14797
14798 /* Return TRUE if the two EABI versions are incompatible.  */
14799
14800 static bfd_boolean
14801 elf32_arm_versions_compatible (unsigned iver, unsigned over)
14802 {
14803   /* v4 and v5 are the same spec before and after it was released,
14804      so allow mixing them.  */
14805   if ((iver == EF_ARM_EABI_VER4 && over == EF_ARM_EABI_VER5)
14806       || (iver == EF_ARM_EABI_VER5 && over == EF_ARM_EABI_VER4))
14807     return TRUE;
14808
14809   return (iver == over);
14810 }
14811
14812 /* Merge backend specific data from an object file to the output
14813    object file when linking.  */
14814
14815 static bfd_boolean
14816 elf32_arm_merge_private_bfd_data (bfd *, struct bfd_link_info *);
14817
14818 /* Display the flags field.  */
14819
14820 static bfd_boolean
14821 elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
14822 {
14823   FILE * file = (FILE *) ptr;
14824   unsigned long flags;
14825
14826   BFD_ASSERT (abfd != NULL && ptr != NULL);
14827
14828   /* Print normal ELF private data.  */
14829   _bfd_elf_print_private_bfd_data (abfd, ptr);
14830
14831   flags = elf_elfheader (abfd)->e_flags;
14832   /* Ignore init flag - it may not be set, despite the flags field
14833      containing valid data.  */
14834
14835   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
14836
14837   switch (EF_ARM_EABI_VERSION (flags))
14838     {
14839     case EF_ARM_EABI_UNKNOWN:
14840       /* The following flag bits are GNU extensions and not part of the
14841          official ARM ELF extended ABI.  Hence they are only decoded if
14842          the EABI version is not set.  */
14843       if (flags & EF_ARM_INTERWORK)
14844         fprintf (file, _(" [interworking enabled]"));
14845
14846       if (flags & EF_ARM_APCS_26)
14847         fprintf (file, " [APCS-26]");
14848       else
14849         fprintf (file, " [APCS-32]");
14850
14851       if (flags & EF_ARM_VFP_FLOAT)
14852         fprintf (file, _(" [VFP float format]"));
14853       else if (flags & EF_ARM_MAVERICK_FLOAT)
14854         fprintf (file, _(" [Maverick float format]"));
14855       else
14856         fprintf (file, _(" [FPA float format]"));
14857
14858       if (flags & EF_ARM_APCS_FLOAT)
14859         fprintf (file, _(" [floats passed in float registers]"));
14860
14861       if (flags & EF_ARM_PIC)
14862         fprintf (file, _(" [position independent]"));
14863
14864       if (flags & EF_ARM_NEW_ABI)
14865         fprintf (file, _(" [new ABI]"));
14866
14867       if (flags & EF_ARM_OLD_ABI)
14868         fprintf (file, _(" [old ABI]"));
14869
14870       if (flags & EF_ARM_SOFT_FLOAT)
14871         fprintf (file, _(" [software FP]"));
14872
14873       flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
14874                  | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
14875                  | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT
14876                  | EF_ARM_MAVERICK_FLOAT);
14877       break;
14878
14879     case EF_ARM_EABI_VER1:
14880       fprintf (file, _(" [Version1 EABI]"));
14881
14882       if (flags & EF_ARM_SYMSARESORTED)
14883         fprintf (file, _(" [sorted symbol table]"));
14884       else
14885         fprintf (file, _(" [unsorted symbol table]"));
14886
14887       flags &= ~ EF_ARM_SYMSARESORTED;
14888       break;
14889
14890     case EF_ARM_EABI_VER2:
14891       fprintf (file, _(" [Version2 EABI]"));
14892
14893       if (flags & EF_ARM_SYMSARESORTED)
14894         fprintf (file, _(" [sorted symbol table]"));
14895       else
14896         fprintf (file, _(" [unsorted symbol table]"));
14897
14898       if (flags & EF_ARM_DYNSYMSUSESEGIDX)
14899         fprintf (file, _(" [dynamic symbols use segment index]"));
14900
14901       if (flags & EF_ARM_MAPSYMSFIRST)
14902         fprintf (file, _(" [mapping symbols precede others]"));
14903
14904       flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
14905                  | EF_ARM_MAPSYMSFIRST);
14906       break;
14907
14908     case EF_ARM_EABI_VER3:
14909       fprintf (file, _(" [Version3 EABI]"));
14910       break;
14911
14912     case EF_ARM_EABI_VER4:
14913       fprintf (file, _(" [Version4 EABI]"));
14914       goto eabi;
14915
14916     case EF_ARM_EABI_VER5:
14917       fprintf (file, _(" [Version5 EABI]"));
14918
14919       if (flags & EF_ARM_ABI_FLOAT_SOFT)
14920         fprintf (file, _(" [soft-float ABI]"));
14921
14922       if (flags & EF_ARM_ABI_FLOAT_HARD)
14923         fprintf (file, _(" [hard-float ABI]"));
14924
14925       flags &= ~(EF_ARM_ABI_FLOAT_SOFT | EF_ARM_ABI_FLOAT_HARD);
14926
14927     eabi:
14928       if (flags & EF_ARM_BE8)
14929         fprintf (file, _(" [BE8]"));
14930
14931       if (flags & EF_ARM_LE8)
14932         fprintf (file, _(" [LE8]"));
14933
14934       flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
14935       break;
14936
14937     default:
14938       fprintf (file, _(" <EABI version unrecognised>"));
14939       break;
14940     }
14941
14942   flags &= ~ EF_ARM_EABIMASK;
14943
14944   if (flags & EF_ARM_RELEXEC)
14945     fprintf (file, _(" [relocatable executable]"));
14946
14947   if (flags & EF_ARM_PIC)
14948     fprintf (file, _(" [position independent]"));
14949
14950   if (elf_elfheader (abfd)->e_ident[EI_OSABI] == ELFOSABI_ARM_FDPIC)
14951     fprintf (file, _(" [FDPIC ABI supplement]"));
14952
14953   flags &= ~ (EF_ARM_RELEXEC | EF_ARM_PIC);
14954
14955   if (flags)
14956     fprintf (file, _("<Unrecognised flag bits set>"));
14957
14958   fputc ('\n', file);
14959
14960   return TRUE;
14961 }
14962
14963 static int
14964 elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
14965 {
14966   switch (ELF_ST_TYPE (elf_sym->st_info))
14967     {
14968     case STT_ARM_TFUNC:
14969       return ELF_ST_TYPE (elf_sym->st_info);
14970
14971     case STT_ARM_16BIT:
14972       /* If the symbol is not an object, return the STT_ARM_16BIT flag.
14973          This allows us to distinguish between data used by Thumb instructions
14974          and non-data (which is probably code) inside Thumb regions of an
14975          executable.  */
14976       if (type != STT_OBJECT && type != STT_TLS)
14977         return ELF_ST_TYPE (elf_sym->st_info);
14978       break;
14979
14980     default:
14981       break;
14982     }
14983
14984   return type;
14985 }
14986
14987 static asection *
14988 elf32_arm_gc_mark_hook (asection *sec,
14989                         struct bfd_link_info *info,
14990                         Elf_Internal_Rela *rel,
14991                         struct elf_link_hash_entry *h,
14992                         Elf_Internal_Sym *sym)
14993 {
14994   if (h != NULL)
14995     switch (ELF32_R_TYPE (rel->r_info))
14996       {
14997       case R_ARM_GNU_VTINHERIT:
14998       case R_ARM_GNU_VTENTRY:
14999         return NULL;
15000       }
15001
15002   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
15003 }
15004
15005 /* Look through the relocs for a section during the first phase.  */
15006
15007 static bfd_boolean
15008 elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
15009                         asection *sec, const Elf_Internal_Rela *relocs)
15010 {
15011   Elf_Internal_Shdr *symtab_hdr;
15012   struct elf_link_hash_entry **sym_hashes;
15013   const Elf_Internal_Rela *rel;
15014   const Elf_Internal_Rela *rel_end;
15015   bfd *dynobj;
15016   asection *sreloc;
15017   struct elf32_arm_link_hash_table *htab;
15018   bfd_boolean call_reloc_p;
15019   bfd_boolean may_become_dynamic_p;
15020   bfd_boolean may_need_local_target_p;
15021   unsigned long nsyms;
15022
15023   if (bfd_link_relocatable (info))
15024     return TRUE;
15025
15026   BFD_ASSERT (is_arm_elf (abfd));
15027
15028   htab = elf32_arm_hash_table (info);
15029   if (htab == NULL)
15030     return FALSE;
15031
15032   sreloc = NULL;
15033
15034   /* Create dynamic sections for relocatable executables so that we can
15035      copy relocations.  */
15036   if (htab->root.is_relocatable_executable
15037       && ! htab->root.dynamic_sections_created)
15038     {
15039       if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
15040         return FALSE;
15041     }
15042
15043   if (htab->root.dynobj == NULL)
15044     htab->root.dynobj = abfd;
15045   if (!create_ifunc_sections (info))
15046     return FALSE;
15047
15048   dynobj = htab->root.dynobj;
15049
15050   symtab_hdr = & elf_symtab_hdr (abfd);
15051   sym_hashes = elf_sym_hashes (abfd);
15052   nsyms = NUM_SHDR_ENTRIES (symtab_hdr);
15053
15054   rel_end = relocs + sec->reloc_count;
15055   for (rel = relocs; rel < rel_end; rel++)
15056     {
15057       Elf_Internal_Sym *isym;
15058       struct elf_link_hash_entry *h;
15059       struct elf32_arm_link_hash_entry *eh;
15060       unsigned int r_symndx;
15061       int r_type;
15062
15063       r_symndx = ELF32_R_SYM (rel->r_info);
15064       r_type = ELF32_R_TYPE (rel->r_info);
15065       r_type = arm_real_reloc_type (htab, r_type);
15066
15067       if (r_symndx >= nsyms
15068           /* PR 9934: It is possible to have relocations that do not
15069              refer to symbols, thus it is also possible to have an
15070              object file containing relocations but no symbol table.  */
15071           && (r_symndx > STN_UNDEF || nsyms > 0))
15072         {
15073           _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd,
15074                               r_symndx);
15075           return FALSE;
15076         }
15077
15078       h = NULL;
15079       isym = NULL;
15080       if (nsyms > 0)
15081         {
15082           if (r_symndx < symtab_hdr->sh_info)
15083             {
15084               /* A local symbol.  */
15085               isym = bfd_sym_from_r_symndx (&htab->sym_cache,
15086                                             abfd, r_symndx);
15087               if (isym == NULL)
15088                 return FALSE;
15089             }
15090           else
15091             {
15092               h = sym_hashes[r_symndx - symtab_hdr->sh_info];
15093               while (h->root.type == bfd_link_hash_indirect
15094                      || h->root.type == bfd_link_hash_warning)
15095                 h = (struct elf_link_hash_entry *) h->root.u.i.link;
15096             }
15097         }
15098
15099       eh = (struct elf32_arm_link_hash_entry *) h;
15100
15101       call_reloc_p = FALSE;
15102       may_become_dynamic_p = FALSE;
15103       may_need_local_target_p = FALSE;
15104
15105       /* Could be done earlier, if h were already available.  */
15106       r_type = elf32_arm_tls_transition (info, r_type, h);
15107       switch (r_type)
15108         {
15109         case R_ARM_GOTOFFFUNCDESC:
15110           {
15111             if (h == NULL)
15112               {
15113                 if (!elf32_arm_allocate_local_sym_info (abfd))
15114                   return FALSE;
15115                 elf32_arm_local_fdpic_cnts(abfd)[r_symndx].gotofffuncdesc_cnt += 1;
15116                 elf32_arm_local_fdpic_cnts(abfd)[r_symndx].funcdesc_offset = -1;
15117               }
15118             else
15119               {
15120                 eh->fdpic_cnts.gotofffuncdesc_cnt++;
15121               }
15122           }
15123           break;
15124
15125         case R_ARM_GOTFUNCDESC:
15126           {
15127             if (h == NULL)
15128               {
15129                 /* Such a relocation is not supposed to be generated
15130                    by gcc on a static function. */
15131                 /* Anyway if needed it could be handled.  */
15132                 abort();
15133               }
15134             else
15135               {
15136                 eh->fdpic_cnts.gotfuncdesc_cnt++;
15137               }
15138           }
15139           break;
15140
15141         case R_ARM_FUNCDESC:
15142           {
15143             if (h == NULL)
15144               {
15145                 if (!elf32_arm_allocate_local_sym_info (abfd))
15146                   return FALSE;
15147                 elf32_arm_local_fdpic_cnts(abfd)[r_symndx].funcdesc_cnt += 1;
15148                 elf32_arm_local_fdpic_cnts(abfd)[r_symndx].funcdesc_offset = -1;
15149               }
15150             else
15151               {
15152                 eh->fdpic_cnts.funcdesc_cnt++;
15153               }
15154           }
15155           break;
15156
15157           case R_ARM_GOT32:
15158           case R_ARM_GOT_PREL:
15159           case R_ARM_TLS_GD32:
15160           case R_ARM_TLS_GD32_FDPIC:
15161           case R_ARM_TLS_IE32:
15162           case R_ARM_TLS_IE32_FDPIC:
15163           case R_ARM_TLS_GOTDESC:
15164           case R_ARM_TLS_DESCSEQ:
15165           case R_ARM_THM_TLS_DESCSEQ:
15166           case R_ARM_TLS_CALL:
15167           case R_ARM_THM_TLS_CALL:
15168             /* This symbol requires a global offset table entry.  */
15169             {
15170               int tls_type, old_tls_type;
15171
15172               switch (r_type)
15173                 {
15174                 case R_ARM_TLS_GD32: tls_type = GOT_TLS_GD; break;
15175                 case R_ARM_TLS_GD32_FDPIC: tls_type = GOT_TLS_GD; break;
15176
15177                 case R_ARM_TLS_IE32: tls_type = GOT_TLS_IE; break;
15178                 case R_ARM_TLS_IE32_FDPIC: tls_type = GOT_TLS_IE; break;
15179
15180                 case R_ARM_TLS_GOTDESC:
15181                 case R_ARM_TLS_CALL: case R_ARM_THM_TLS_CALL:
15182                 case R_ARM_TLS_DESCSEQ: case R_ARM_THM_TLS_DESCSEQ:
15183                   tls_type = GOT_TLS_GDESC; break;
15184
15185                 default: tls_type = GOT_NORMAL; break;
15186                 }
15187
15188               if (!bfd_link_executable (info) && (tls_type & GOT_TLS_IE))
15189                 info->flags |= DF_STATIC_TLS;
15190
15191               if (h != NULL)
15192                 {
15193                   h->got.refcount++;
15194                   old_tls_type = elf32_arm_hash_entry (h)->tls_type;
15195                 }
15196               else
15197                 {
15198                   /* This is a global offset table entry for a local symbol.  */
15199                   if (!elf32_arm_allocate_local_sym_info (abfd))
15200                     return FALSE;
15201                   elf_local_got_refcounts (abfd)[r_symndx] += 1;
15202                   old_tls_type = elf32_arm_local_got_tls_type (abfd) [r_symndx];
15203                 }
15204
15205               /* If a variable is accessed with both tls methods, two
15206                  slots may be created.  */
15207               if (GOT_TLS_GD_ANY_P (old_tls_type)
15208                   && GOT_TLS_GD_ANY_P (tls_type))
15209                 tls_type |= old_tls_type;
15210
15211               /* We will already have issued an error message if there
15212                  is a TLS/non-TLS mismatch, based on the symbol
15213                  type.  So just combine any TLS types needed.  */
15214               if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
15215                   && tls_type != GOT_NORMAL)
15216                 tls_type |= old_tls_type;
15217
15218               /* If the symbol is accessed in both IE and GDESC
15219                  method, we're able to relax. Turn off the GDESC flag,
15220                  without messing up with any other kind of tls types
15221                  that may be involved.  */
15222               if ((tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_GDESC))
15223                 tls_type &= ~GOT_TLS_GDESC;
15224
15225               if (old_tls_type != tls_type)
15226                 {
15227                   if (h != NULL)
15228                     elf32_arm_hash_entry (h)->tls_type = tls_type;
15229                   else
15230                     elf32_arm_local_got_tls_type (abfd) [r_symndx] = tls_type;
15231                 }
15232             }
15233             /* Fall through.  */
15234
15235           case R_ARM_TLS_LDM32:
15236           case R_ARM_TLS_LDM32_FDPIC:
15237             if (r_type == R_ARM_TLS_LDM32 || r_type == R_ARM_TLS_LDM32_FDPIC)
15238                 htab->tls_ldm_got.refcount++;
15239             /* Fall through.  */
15240
15241           case R_ARM_GOTOFF32:
15242           case R_ARM_GOTPC:
15243             if (htab->root.sgot == NULL
15244                 && !create_got_section (htab->root.dynobj, info))
15245               return FALSE;
15246             break;
15247
15248           case R_ARM_PC24:
15249           case R_ARM_PLT32:
15250           case R_ARM_CALL:
15251           case R_ARM_JUMP24:
15252           case R_ARM_PREL31:
15253           case R_ARM_THM_CALL:
15254           case R_ARM_THM_JUMP24:
15255           case R_ARM_THM_JUMP19:
15256             call_reloc_p = TRUE;
15257             may_need_local_target_p = TRUE;
15258             break;
15259
15260           case R_ARM_ABS12:
15261             /* VxWorks uses dynamic R_ARM_ABS12 relocations for
15262                ldr __GOTT_INDEX__ offsets.  */
15263             if (!htab->vxworks_p)
15264               {
15265                 may_need_local_target_p = TRUE;
15266                 break;
15267               }
15268             else goto jump_over;
15269
15270             /* Fall through.  */
15271
15272           case R_ARM_MOVW_ABS_NC:
15273           case R_ARM_MOVT_ABS:
15274           case R_ARM_THM_MOVW_ABS_NC:
15275           case R_ARM_THM_MOVT_ABS:
15276             if (bfd_link_pic (info))
15277               {
15278                 _bfd_error_handler
15279                   (_("%pB: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
15280                    abfd, elf32_arm_howto_table_1[r_type].name,
15281                    (h) ? h->root.root.string : "a local symbol");
15282                 bfd_set_error (bfd_error_bad_value);
15283                 return FALSE;
15284               }
15285
15286             /* Fall through.  */
15287           case R_ARM_ABS32:
15288           case R_ARM_ABS32_NOI:
15289         jump_over:
15290             if (h != NULL && bfd_link_executable (info))
15291               {
15292                 h->pointer_equality_needed = 1;
15293               }
15294             /* Fall through.  */
15295           case R_ARM_REL32:
15296           case R_ARM_REL32_NOI:
15297           case R_ARM_MOVW_PREL_NC:
15298           case R_ARM_MOVT_PREL:
15299           case R_ARM_THM_MOVW_PREL_NC:
15300           case R_ARM_THM_MOVT_PREL:
15301
15302             /* Should the interworking branches be listed here?  */
15303             if ((bfd_link_pic (info) || htab->root.is_relocatable_executable
15304                  || htab->fdpic_p)
15305                 && (sec->flags & SEC_ALLOC) != 0)
15306               {
15307                 if (h == NULL
15308                     && elf32_arm_howto_from_type (r_type)->pc_relative)
15309                   {
15310                     /* In shared libraries and relocatable executables,
15311                        we treat local relative references as calls;
15312                        see the related SYMBOL_CALLS_LOCAL code in
15313                        allocate_dynrelocs.  */
15314                     call_reloc_p = TRUE;
15315                     may_need_local_target_p = TRUE;
15316                   }
15317                 else
15318                   /* We are creating a shared library or relocatable
15319                      executable, and this is a reloc against a global symbol,
15320                      or a non-PC-relative reloc against a local symbol.
15321                      We may need to copy the reloc into the output.  */
15322                   may_become_dynamic_p = TRUE;
15323               }
15324             else
15325               may_need_local_target_p = TRUE;
15326             break;
15327
15328         /* This relocation describes the C++ object vtable hierarchy.
15329            Reconstruct it for later use during GC.  */
15330         case R_ARM_GNU_VTINHERIT:
15331           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
15332             return FALSE;
15333           break;
15334
15335         /* This relocation describes which C++ vtable entries are actually
15336            used.  Record for later use during GC.  */
15337         case R_ARM_GNU_VTENTRY:
15338           BFD_ASSERT (h != NULL);
15339           if (h != NULL
15340               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
15341             return FALSE;
15342           break;
15343         }
15344
15345       if (h != NULL)
15346         {
15347           if (call_reloc_p)
15348             /* We may need a .plt entry if the function this reloc
15349                refers to is in a different object, regardless of the
15350                symbol's type.  We can't tell for sure yet, because
15351                something later might force the symbol local.  */
15352             h->needs_plt = 1;
15353           else if (may_need_local_target_p)
15354             /* If this reloc is in a read-only section, we might
15355                need a copy reloc.  We can't check reliably at this
15356                stage whether the section is read-only, as input
15357                sections have not yet been mapped to output sections.
15358                Tentatively set the flag for now, and correct in
15359                adjust_dynamic_symbol.  */
15360             h->non_got_ref = 1;
15361         }
15362
15363       if (may_need_local_target_p
15364           && (h != NULL || ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC))
15365         {
15366           union gotplt_union *root_plt;
15367           struct arm_plt_info *arm_plt;
15368           struct arm_local_iplt_info *local_iplt;
15369
15370           if (h != NULL)
15371             {
15372               root_plt = &h->plt;
15373               arm_plt = &eh->plt;
15374             }
15375           else
15376             {
15377               local_iplt = elf32_arm_create_local_iplt (abfd, r_symndx);
15378               if (local_iplt == NULL)
15379                 return FALSE;
15380               root_plt = &local_iplt->root;
15381               arm_plt = &local_iplt->arm;
15382             }
15383
15384           /* If the symbol is a function that doesn't bind locally,
15385              this relocation will need a PLT entry.  */
15386           if (root_plt->refcount != -1)
15387             root_plt->refcount += 1;
15388
15389           if (!call_reloc_p)
15390             arm_plt->noncall_refcount++;
15391
15392           /* It's too early to use htab->use_blx here, so we have to
15393              record possible blx references separately from
15394              relocs that definitely need a thumb stub.  */
15395
15396           if (r_type == R_ARM_THM_CALL)
15397             arm_plt->maybe_thumb_refcount += 1;
15398
15399           if (r_type == R_ARM_THM_JUMP24
15400               || r_type == R_ARM_THM_JUMP19)
15401             arm_plt->thumb_refcount += 1;
15402         }
15403
15404       if (may_become_dynamic_p)
15405         {
15406           struct elf_dyn_relocs *p, **head;
15407
15408           /* Create a reloc section in dynobj.  */
15409           if (sreloc == NULL)
15410             {
15411               sreloc = _bfd_elf_make_dynamic_reloc_section
15412                 (sec, dynobj, 2, abfd, ! htab->use_rel);
15413
15414               if (sreloc == NULL)
15415                 return FALSE;
15416
15417               /* BPABI objects never have dynamic relocations mapped.  */
15418               if (htab->symbian_p)
15419                 {
15420                   flagword flags;
15421
15422                   flags = bfd_get_section_flags (dynobj, sreloc);
15423                   flags &= ~(SEC_LOAD | SEC_ALLOC);
15424                   bfd_set_section_flags (dynobj, sreloc, flags);
15425                 }
15426             }
15427
15428           /* If this is a global symbol, count the number of
15429              relocations we need for this symbol.  */
15430           if (h != NULL)
15431             head = &((struct elf32_arm_link_hash_entry *) h)->dyn_relocs;
15432           else
15433             {
15434               head = elf32_arm_get_local_dynreloc_list (abfd, r_symndx, isym);
15435               if (head == NULL)
15436                 return FALSE;
15437             }
15438
15439           p = *head;
15440           if (p == NULL || p->sec != sec)
15441             {
15442               bfd_size_type amt = sizeof *p;
15443
15444               p = (struct elf_dyn_relocs *) bfd_alloc (htab->root.dynobj, amt);
15445               if (p == NULL)
15446                 return FALSE;
15447               p->next = *head;
15448               *head = p;
15449               p->sec = sec;
15450               p->count = 0;
15451               p->pc_count = 0;
15452             }
15453
15454           if (elf32_arm_howto_from_type (r_type)->pc_relative)
15455             p->pc_count += 1;
15456           p->count += 1;
15457           if (h == NULL && htab->fdpic_p && !bfd_link_pic(info)
15458               && r_type != R_ARM_ABS32 && r_type != R_ARM_ABS32_NOI) {
15459             /* Here we only support R_ARM_ABS32 and R_ARM_ABS32_NOI
15460                that will become rofixup.  */
15461             /* This is due to the fact that we suppose all will become rofixup.  */
15462             fprintf(stderr, "FDPIC does not yet support %d relocation to become dynamic for executable\n", r_type);
15463             _bfd_error_handler
15464               (_("FDPIC does not yet support %s relocation"
15465                  " to become dynamic for executable"),
15466                elf32_arm_howto_table_1[r_type].name);
15467             abort();
15468           }
15469         }
15470     }
15471
15472   return TRUE;
15473 }
15474
15475 static void
15476 elf32_arm_update_relocs (asection *o,
15477                          struct bfd_elf_section_reloc_data *reldata)
15478 {
15479   void (*swap_in) (bfd *, const bfd_byte *, Elf_Internal_Rela *);
15480   void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
15481   const struct elf_backend_data *bed;
15482   _arm_elf_section_data *eado;
15483   struct bfd_link_order *p;
15484   bfd_byte *erela_head, *erela;
15485   Elf_Internal_Rela *irela_head, *irela;
15486   Elf_Internal_Shdr *rel_hdr;
15487   bfd *abfd;
15488   unsigned int count;
15489
15490   eado = get_arm_elf_section_data (o);
15491
15492   if (!eado || eado->elf.this_hdr.sh_type != SHT_ARM_EXIDX)
15493     return;
15494
15495   abfd = o->owner;
15496   bed = get_elf_backend_data (abfd);
15497   rel_hdr = reldata->hdr;
15498
15499   if (rel_hdr->sh_entsize == bed->s->sizeof_rel)
15500     {
15501       swap_in = bed->s->swap_reloc_in;
15502       swap_out = bed->s->swap_reloc_out;
15503     }
15504   else if (rel_hdr->sh_entsize == bed->s->sizeof_rela)
15505     {
15506       swap_in = bed->s->swap_reloca_in;
15507       swap_out = bed->s->swap_reloca_out;
15508     }
15509   else
15510     abort ();
15511
15512   erela_head = rel_hdr->contents;
15513   irela_head = (Elf_Internal_Rela *) bfd_zmalloc
15514     ((NUM_SHDR_ENTRIES (rel_hdr) + 1) * sizeof (*irela_head));
15515
15516   erela = erela_head;
15517   irela = irela_head;
15518   count = 0;
15519
15520   for (p = o->map_head.link_order; p; p = p->next)
15521     {
15522       if (p->type == bfd_section_reloc_link_order
15523           || p->type == bfd_symbol_reloc_link_order)
15524         {
15525           (*swap_in) (abfd, erela, irela);
15526           erela += rel_hdr->sh_entsize;
15527           irela++;
15528           count++;
15529         }
15530       else if (p->type == bfd_indirect_link_order)
15531         {
15532           struct bfd_elf_section_reloc_data *input_reldata;
15533           arm_unwind_table_edit *edit_list, *edit_tail;
15534           _arm_elf_section_data *eadi;
15535           bfd_size_type j;
15536           bfd_vma offset;
15537           asection *i;
15538
15539           i = p->u.indirect.section;
15540
15541           eadi = get_arm_elf_section_data (i);
15542           edit_list = eadi->u.exidx.unwind_edit_list;
15543           edit_tail = eadi->u.exidx.unwind_edit_tail;
15544           offset = o->vma + i->output_offset;
15545
15546           if (eadi->elf.rel.hdr &&
15547               eadi->elf.rel.hdr->sh_entsize == rel_hdr->sh_entsize)
15548             input_reldata = &eadi->elf.rel;
15549           else if (eadi->elf.rela.hdr &&
15550                    eadi->elf.rela.hdr->sh_entsize == rel_hdr->sh_entsize)
15551             input_reldata = &eadi->elf.rela;
15552           else
15553             abort ();
15554
15555           if (edit_list)
15556             {
15557               for (j = 0; j < NUM_SHDR_ENTRIES (input_reldata->hdr); j++)
15558                 {
15559                   arm_unwind_table_edit *edit_node, *edit_next;
15560                   bfd_vma bias;
15561                   bfd_vma reloc_index;
15562
15563                   (*swap_in) (abfd, erela, irela);
15564                   reloc_index = (irela->r_offset - offset) / 8;
15565
15566                   bias = 0;
15567                   edit_node = edit_list;
15568                   for (edit_next = edit_list;
15569                        edit_next && edit_next->index <= reloc_index;
15570                        edit_next = edit_node->next)
15571                     {
15572                       bias++;
15573                       edit_node = edit_next;
15574                     }
15575
15576                   if (edit_node->type != DELETE_EXIDX_ENTRY
15577                       || edit_node->index != reloc_index)
15578                     {
15579                       irela->r_offset -= bias * 8;
15580                       irela++;
15581                       count++;
15582                     }
15583
15584                   erela += rel_hdr->sh_entsize;
15585                 }
15586
15587               if (edit_tail->type == INSERT_EXIDX_CANTUNWIND_AT_END)
15588                 {
15589                   /* New relocation entity.  */
15590                   asection *text_sec = edit_tail->linked_section;
15591                   asection *text_out = text_sec->output_section;
15592                   bfd_vma exidx_offset = offset + i->size - 8;
15593
15594                   irela->r_addend = 0;
15595                   irela->r_offset = exidx_offset;
15596                   irela->r_info = ELF32_R_INFO
15597                     (text_out->target_index, R_ARM_PREL31);
15598                   irela++;
15599                   count++;
15600                 }
15601             }
15602           else
15603             {
15604               for (j = 0; j < NUM_SHDR_ENTRIES (input_reldata->hdr); j++)
15605                 {
15606                   (*swap_in) (abfd, erela, irela);
15607                   erela += rel_hdr->sh_entsize;
15608                   irela++;
15609                 }
15610
15611               count += NUM_SHDR_ENTRIES (input_reldata->hdr);
15612             }
15613         }
15614     }
15615
15616   reldata->count = count;
15617   rel_hdr->sh_size = count * rel_hdr->sh_entsize;
15618
15619   erela = erela_head;
15620   irela = irela_head;
15621   while (count > 0)
15622     {
15623       (*swap_out) (abfd, irela, erela);
15624       erela += rel_hdr->sh_entsize;
15625       irela++;
15626       count--;
15627     }
15628
15629   free (irela_head);
15630
15631   /* Hashes are no longer valid.  */
15632   free (reldata->hashes);
15633   reldata->hashes = NULL;
15634 }
15635
15636 /* Unwinding tables are not referenced directly.  This pass marks them as
15637    required if the corresponding code section is marked.  Similarly, ARMv8-M
15638    secure entry functions can only be referenced by SG veneers which are
15639    created after the GC process. They need to be marked in case they reside in
15640    their own section (as would be the case if code was compiled with
15641    -ffunction-sections).  */
15642
15643 static bfd_boolean
15644 elf32_arm_gc_mark_extra_sections (struct bfd_link_info *info,
15645                                   elf_gc_mark_hook_fn gc_mark_hook)
15646 {
15647   bfd *sub;
15648   Elf_Internal_Shdr **elf_shdrp;
15649   asection *cmse_sec;
15650   obj_attribute *out_attr;
15651   Elf_Internal_Shdr *symtab_hdr;
15652   unsigned i, sym_count, ext_start;
15653   const struct elf_backend_data *bed;
15654   struct elf_link_hash_entry **sym_hashes;
15655   struct elf32_arm_link_hash_entry *cmse_hash;
15656   bfd_boolean again, is_v8m, first_bfd_browse = TRUE;
15657
15658   _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
15659
15660   out_attr = elf_known_obj_attributes_proc (info->output_bfd);
15661   is_v8m = out_attr[Tag_CPU_arch].i >= TAG_CPU_ARCH_V8M_BASE
15662            && out_attr[Tag_CPU_arch_profile].i == 'M';
15663
15664   /* Marking EH data may cause additional code sections to be marked,
15665      requiring multiple passes.  */
15666   again = TRUE;
15667   while (again)
15668     {
15669       again = FALSE;
15670       for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
15671         {
15672           asection *o;
15673
15674           if (! is_arm_elf (sub))
15675             continue;
15676
15677           elf_shdrp = elf_elfsections (sub);
15678           for (o = sub->sections; o != NULL; o = o->next)
15679             {
15680               Elf_Internal_Shdr *hdr;
15681
15682               hdr = &elf_section_data (o)->this_hdr;
15683               if (hdr->sh_type == SHT_ARM_EXIDX
15684                   && hdr->sh_link
15685                   && hdr->sh_link < elf_numsections (sub)
15686                   && !o->gc_mark
15687                   && elf_shdrp[hdr->sh_link]->bfd_section->gc_mark)
15688                 {
15689                   again = TRUE;
15690                   if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
15691                     return FALSE;
15692                 }
15693             }
15694
15695           /* Mark section holding ARMv8-M secure entry functions.  We mark all
15696              of them so no need for a second browsing.  */
15697           if (is_v8m && first_bfd_browse)
15698             {
15699               sym_hashes = elf_sym_hashes (sub);
15700               bed = get_elf_backend_data (sub);
15701               symtab_hdr = &elf_tdata (sub)->symtab_hdr;
15702               sym_count = symtab_hdr->sh_size / bed->s->sizeof_sym;
15703               ext_start = symtab_hdr->sh_info;
15704
15705               /* Scan symbols.  */
15706               for (i = ext_start; i < sym_count; i++)
15707                 {
15708                   cmse_hash = elf32_arm_hash_entry (sym_hashes[i - ext_start]);
15709
15710                   /* Assume it is a special symbol.  If not, cmse_scan will
15711                      warn about it and user can do something about it.  */
15712                   if (ARM_GET_SYM_CMSE_SPCL (cmse_hash->root.target_internal))
15713                     {
15714                       cmse_sec = cmse_hash->root.root.u.def.section;
15715                       if (!cmse_sec->gc_mark
15716                           && !_bfd_elf_gc_mark (info, cmse_sec, gc_mark_hook))
15717                         return FALSE;
15718                     }
15719                 }
15720             }
15721         }
15722       first_bfd_browse = FALSE;
15723     }
15724
15725   return TRUE;
15726 }
15727
15728 /* Treat mapping symbols as special target symbols.  */
15729
15730 static bfd_boolean
15731 elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
15732 {
15733   return bfd_is_arm_special_symbol_name (sym->name,
15734                                          BFD_ARM_SPECIAL_SYM_TYPE_ANY);
15735 }
15736
15737 /* This is a copy of elf_find_function() from elf.c except that
15738    ARM mapping symbols are ignored when looking for function names
15739    and STT_ARM_TFUNC is considered to a function type.  */
15740
15741 static bfd_boolean
15742 arm_elf_find_function (bfd *         abfd ATTRIBUTE_UNUSED,
15743                        asymbol **    symbols,
15744                        asection *    section,
15745                        bfd_vma       offset,
15746                        const char ** filename_ptr,
15747                        const char ** functionname_ptr)
15748 {
15749   const char * filename = NULL;
15750   asymbol * func = NULL;
15751   bfd_vma low_func = 0;
15752   asymbol ** p;
15753
15754   for (p = symbols; *p != NULL; p++)
15755     {
15756       elf_symbol_type *q;
15757
15758       q = (elf_symbol_type *) *p;
15759
15760       switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
15761         {
15762         default:
15763           break;
15764         case STT_FILE:
15765           filename = bfd_asymbol_name (&q->symbol);
15766           break;
15767         case STT_FUNC:
15768         case STT_ARM_TFUNC:
15769         case STT_NOTYPE:
15770           /* Skip mapping symbols.  */
15771           if ((q->symbol.flags & BSF_LOCAL)
15772               && bfd_is_arm_special_symbol_name (q->symbol.name,
15773                     BFD_ARM_SPECIAL_SYM_TYPE_ANY))
15774             continue;
15775           /* Fall through.  */
15776           if (bfd_get_section (&q->symbol) == section
15777               && q->symbol.value >= low_func
15778               && q->symbol.value <= offset)
15779             {
15780               func = (asymbol *) q;
15781               low_func = q->symbol.value;
15782             }
15783           break;
15784         }
15785     }
15786
15787   if (func == NULL)
15788     return FALSE;
15789
15790   if (filename_ptr)
15791     *filename_ptr = filename;
15792   if (functionname_ptr)
15793     *functionname_ptr = bfd_asymbol_name (func);
15794
15795   return TRUE;
15796 }
15797
15798
15799 /* Find the nearest line to a particular section and offset, for error
15800    reporting.   This code is a duplicate of the code in elf.c, except
15801    that it uses arm_elf_find_function.  */
15802
15803 static bfd_boolean
15804 elf32_arm_find_nearest_line (bfd *          abfd,
15805                              asymbol **     symbols,
15806                              asection *     section,
15807                              bfd_vma        offset,
15808                              const char **  filename_ptr,
15809                              const char **  functionname_ptr,
15810                              unsigned int * line_ptr,
15811                              unsigned int * discriminator_ptr)
15812 {
15813   bfd_boolean found = FALSE;
15814
15815   if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
15816                                      filename_ptr, functionname_ptr,
15817                                      line_ptr, discriminator_ptr,
15818                                      dwarf_debug_sections, 0,
15819                                      & elf_tdata (abfd)->dwarf2_find_line_info))
15820     {
15821       if (!*functionname_ptr)
15822         arm_elf_find_function (abfd, symbols, section, offset,
15823                                *filename_ptr ? NULL : filename_ptr,
15824                                functionname_ptr);
15825
15826       return TRUE;
15827     }
15828
15829   /* Skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain
15830      uses DWARF1.  */
15831
15832   if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
15833                                              & found, filename_ptr,
15834                                              functionname_ptr, line_ptr,
15835                                              & elf_tdata (abfd)->line_info))
15836     return FALSE;
15837
15838   if (found && (*functionname_ptr || *line_ptr))
15839     return TRUE;
15840
15841   if (symbols == NULL)
15842     return FALSE;
15843
15844   if (! arm_elf_find_function (abfd, symbols, section, offset,
15845                                filename_ptr, functionname_ptr))
15846     return FALSE;
15847
15848   *line_ptr = 0;
15849   return TRUE;
15850 }
15851
15852 static bfd_boolean
15853 elf32_arm_find_inliner_info (bfd *          abfd,
15854                              const char **  filename_ptr,
15855                              const char **  functionname_ptr,
15856                              unsigned int * line_ptr)
15857 {
15858   bfd_boolean found;
15859   found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
15860                                          functionname_ptr, line_ptr,
15861                                          & elf_tdata (abfd)->dwarf2_find_line_info);
15862   return found;
15863 }
15864
15865 /* Find dynamic relocs for H that apply to read-only sections.  */
15866
15867 static asection *
15868 readonly_dynrelocs (struct elf_link_hash_entry *h)
15869 {
15870   struct elf_dyn_relocs *p;
15871
15872   for (p = elf32_arm_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
15873     {
15874       asection *s = p->sec->output_section;
15875
15876       if (s != NULL && (s->flags & SEC_READONLY) != 0)
15877         return p->sec;
15878     }
15879   return NULL;
15880 }
15881
15882 /* Adjust a symbol defined by a dynamic object and referenced by a
15883    regular object.  The current definition is in some section of the
15884    dynamic object, but we're not including those sections.  We have to
15885    change the definition to something the rest of the link can
15886    understand.  */
15887
15888 static bfd_boolean
15889 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
15890                                  struct elf_link_hash_entry * h)
15891 {
15892   bfd * dynobj;
15893   asection *s, *srel;
15894   struct elf32_arm_link_hash_entry * eh;
15895   struct elf32_arm_link_hash_table *globals;
15896
15897   globals = elf32_arm_hash_table (info);
15898   if (globals == NULL)
15899     return FALSE;
15900
15901   dynobj = elf_hash_table (info)->dynobj;
15902
15903   /* Make sure we know what is going on here.  */
15904   BFD_ASSERT (dynobj != NULL
15905               && (h->needs_plt
15906                   || h->type == STT_GNU_IFUNC
15907                   || h->is_weakalias
15908                   || (h->def_dynamic
15909                       && h->ref_regular
15910                       && !h->def_regular)));
15911
15912   eh = (struct elf32_arm_link_hash_entry *) h;
15913
15914   /* If this is a function, put it in the procedure linkage table.  We
15915      will fill in the contents of the procedure linkage table later,
15916      when we know the address of the .got section.  */
15917   if (h->type == STT_FUNC || h->type == STT_GNU_IFUNC || h->needs_plt)
15918     {
15919       /* Calls to STT_GNU_IFUNC symbols always use a PLT, even if the
15920          symbol binds locally.  */
15921       if (h->plt.refcount <= 0
15922           || (h->type != STT_GNU_IFUNC
15923               && (SYMBOL_CALLS_LOCAL (info, h)
15924                   || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
15925                       && h->root.type == bfd_link_hash_undefweak))))
15926         {
15927           /* This case can occur if we saw a PLT32 reloc in an input
15928              file, but the symbol was never referred to by a dynamic
15929              object, or if all references were garbage collected.  In
15930              such a case, we don't actually need to build a procedure
15931              linkage table, and we can just do a PC24 reloc instead.  */
15932           h->plt.offset = (bfd_vma) -1;
15933           eh->plt.thumb_refcount = 0;
15934           eh->plt.maybe_thumb_refcount = 0;
15935           eh->plt.noncall_refcount = 0;
15936           h->needs_plt = 0;
15937         }
15938
15939       return TRUE;
15940     }
15941   else
15942     {
15943       /* It's possible that we incorrectly decided a .plt reloc was
15944          needed for an R_ARM_PC24 or similar reloc to a non-function sym
15945          in check_relocs.  We can't decide accurately between function
15946          and non-function syms in check-relocs; Objects loaded later in
15947          the link may change h->type.  So fix it now.  */
15948       h->plt.offset = (bfd_vma) -1;
15949       eh->plt.thumb_refcount = 0;
15950       eh->plt.maybe_thumb_refcount = 0;
15951       eh->plt.noncall_refcount = 0;
15952     }
15953
15954   /* If this is a weak symbol, and there is a real definition, the
15955      processor independent code will have arranged for us to see the
15956      real definition first, and we can just use the same value.  */
15957   if (h->is_weakalias)
15958     {
15959       struct elf_link_hash_entry *def = weakdef (h);
15960       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
15961       h->root.u.def.section = def->root.u.def.section;
15962       h->root.u.def.value = def->root.u.def.value;
15963       return TRUE;
15964     }
15965
15966   /* If there are no non-GOT references, we do not need a copy
15967      relocation.  */
15968   if (!h->non_got_ref)
15969     return TRUE;
15970
15971   /* This is a reference to a symbol defined by a dynamic object which
15972      is not a function.  */
15973
15974   /* If we are creating a shared library, we must presume that the
15975      only references to the symbol are via the global offset table.
15976      For such cases we need not do anything here; the relocations will
15977      be handled correctly by relocate_section.  Relocatable executables
15978      can reference data in shared objects directly, so we don't need to
15979      do anything here.  */
15980   if (bfd_link_pic (info) || globals->root.is_relocatable_executable)
15981     return TRUE;
15982
15983   /* We must allocate the symbol in our .dynbss section, which will
15984      become part of the .bss section of the executable.  There will be
15985      an entry for this symbol in the .dynsym section.  The dynamic
15986      object will contain position independent code, so all references
15987      from the dynamic object to this symbol will go through the global
15988      offset table.  The dynamic linker will use the .dynsym entry to
15989      determine the address it must put in the global offset table, so
15990      both the dynamic object and the regular object will refer to the
15991      same memory location for the variable.  */
15992   /* If allowed, we must generate a R_ARM_COPY reloc to tell the dynamic
15993      linker to copy the initial value out of the dynamic object and into
15994      the runtime process image.  We need to remember the offset into the
15995      .rel(a).bss section we are going to use.  */
15996   if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
15997     {
15998       s = globals->root.sdynrelro;
15999       srel = globals->root.sreldynrelro;
16000     }
16001   else
16002     {
16003       s = globals->root.sdynbss;
16004       srel = globals->root.srelbss;
16005     }
16006   if (info->nocopyreloc == 0
16007       && (h->root.u.def.section->flags & SEC_ALLOC) != 0
16008       && h->size != 0)
16009     {
16010       elf32_arm_allocate_dynrelocs (info, srel, 1);
16011       h->needs_copy = 1;
16012     }
16013
16014   return _bfd_elf_adjust_dynamic_copy (info, h, s);
16015 }
16016
16017 /* Allocate space in .plt, .got and associated reloc sections for
16018    dynamic relocs.  */
16019
16020 static bfd_boolean
16021 allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
16022 {
16023   struct bfd_link_info *info;
16024   struct elf32_arm_link_hash_table *htab;
16025   struct elf32_arm_link_hash_entry *eh;
16026   struct elf_dyn_relocs *p;
16027
16028   if (h->root.type == bfd_link_hash_indirect)
16029     return TRUE;
16030
16031   eh = (struct elf32_arm_link_hash_entry *) h;
16032
16033   info = (struct bfd_link_info *) inf;
16034   htab = elf32_arm_hash_table (info);
16035   if (htab == NULL)
16036     return FALSE;
16037
16038   if ((htab->root.dynamic_sections_created || h->type == STT_GNU_IFUNC)
16039       && h->plt.refcount > 0)
16040     {
16041       /* Make sure this symbol is output as a dynamic symbol.
16042          Undefined weak syms won't yet be marked as dynamic.  */
16043       if (h->dynindx == -1 && !h->forced_local
16044           && h->root.type == bfd_link_hash_undefweak)
16045         {
16046           if (! bfd_elf_link_record_dynamic_symbol (info, h))
16047             return FALSE;
16048         }
16049
16050       /* If the call in the PLT entry binds locally, the associated
16051          GOT entry should use an R_ARM_IRELATIVE relocation instead of
16052          the usual R_ARM_JUMP_SLOT.  Put it in the .iplt section rather
16053          than the .plt section.  */
16054       if (h->type == STT_GNU_IFUNC && SYMBOL_CALLS_LOCAL (info, h))
16055         {
16056           eh->is_iplt = 1;
16057           if (eh->plt.noncall_refcount == 0
16058               && SYMBOL_REFERENCES_LOCAL (info, h))
16059             /* All non-call references can be resolved directly.
16060                This means that they can (and in some cases, must)
16061                resolve directly to the run-time target, rather than
16062                to the PLT.  That in turns means that any .got entry
16063                would be equal to the .igot.plt entry, so there's
16064                no point having both.  */
16065             h->got.refcount = 0;
16066         }
16067
16068       if (bfd_link_pic (info)
16069           || eh->is_iplt
16070           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
16071         {
16072           elf32_arm_allocate_plt_entry (info, eh->is_iplt, &h->plt, &eh->plt);
16073
16074           /* If this symbol is not defined in a regular file, and we are
16075              not generating a shared library, then set the symbol to this
16076              location in the .plt.  This is required to make function
16077              pointers compare as equal between the normal executable and
16078              the shared library.  */
16079           if (! bfd_link_pic (info)
16080               && !h->def_regular)
16081             {
16082               h->root.u.def.section = htab->root.splt;
16083               h->root.u.def.value = h->plt.offset;
16084
16085               /* Make sure the function is not marked as Thumb, in case
16086                  it is the target of an ABS32 relocation, which will
16087                  point to the PLT entry.  */
16088               ARM_SET_SYM_BRANCH_TYPE (h->target_internal, ST_BRANCH_TO_ARM);
16089             }
16090
16091           /* VxWorks executables have a second set of relocations for
16092              each PLT entry.  They go in a separate relocation section,
16093              which is processed by the kernel loader.  */
16094           if (htab->vxworks_p && !bfd_link_pic (info))
16095             {
16096               /* There is a relocation for the initial PLT entry:
16097                  an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_.  */
16098               if (h->plt.offset == htab->plt_header_size)
16099                 elf32_arm_allocate_dynrelocs (info, htab->srelplt2, 1);
16100
16101               /* There are two extra relocations for each subsequent
16102                  PLT entry: an R_ARM_32 relocation for the GOT entry,
16103                  and an R_ARM_32 relocation for the PLT entry.  */
16104               elf32_arm_allocate_dynrelocs (info, htab->srelplt2, 2);
16105             }
16106         }
16107       else
16108         {
16109           h->plt.offset = (bfd_vma) -1;
16110           h->needs_plt = 0;
16111         }
16112     }
16113   else
16114     {
16115       h->plt.offset = (bfd_vma) -1;
16116       h->needs_plt = 0;
16117     }
16118
16119   eh = (struct elf32_arm_link_hash_entry *) h;
16120   eh->tlsdesc_got = (bfd_vma) -1;
16121
16122   if (h->got.refcount > 0)
16123     {
16124       asection *s;
16125       bfd_boolean dyn;
16126       int tls_type = elf32_arm_hash_entry (h)->tls_type;
16127       int indx;
16128
16129       /* Make sure this symbol is output as a dynamic symbol.
16130          Undefined weak syms won't yet be marked as dynamic.  */
16131       if (htab->root.dynamic_sections_created && h->dynindx == -1 && !h->forced_local
16132           && h->root.type == bfd_link_hash_undefweak)
16133         {
16134           if (! bfd_elf_link_record_dynamic_symbol (info, h))
16135             return FALSE;
16136         }
16137
16138       if (!htab->symbian_p)
16139         {
16140           s = htab->root.sgot;
16141           h->got.offset = s->size;
16142
16143           if (tls_type == GOT_UNKNOWN)
16144             abort ();
16145
16146           if (tls_type == GOT_NORMAL)
16147             /* Non-TLS symbols need one GOT slot.  */
16148             s->size += 4;
16149           else
16150             {
16151               if (tls_type & GOT_TLS_GDESC)
16152                 {
16153                   /* R_ARM_TLS_DESC needs 2 GOT slots.  */
16154                   eh->tlsdesc_got
16155                     = (htab->root.sgotplt->size
16156                        - elf32_arm_compute_jump_table_size (htab));
16157                   htab->root.sgotplt->size += 8;
16158                   h->got.offset = (bfd_vma) -2;
16159                   /* plt.got_offset needs to know there's a TLS_DESC
16160                      reloc in the middle of .got.plt.  */
16161                   htab->num_tls_desc++;
16162                 }
16163
16164               if (tls_type & GOT_TLS_GD)
16165                 {
16166                   /* R_ARM_TLS_GD32 and R_ARM_TLS_GD32_FDPIC need two
16167                      consecutive GOT slots.  If the symbol is both GD
16168                      and GDESC, got.offset may have been
16169                      overwritten.  */
16170                   h->got.offset = s->size;
16171                   s->size += 8;
16172                 }
16173
16174               if (tls_type & GOT_TLS_IE)
16175                 /* R_ARM_TLS_IE32/R_ARM_TLS_IE32_FDPIC need one GOT
16176                    slot.  */
16177                 s->size += 4;
16178             }
16179
16180           dyn = htab->root.dynamic_sections_created;
16181
16182           indx = 0;
16183           if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
16184                                                bfd_link_pic (info),
16185                                                h)
16186               && (!bfd_link_pic (info)
16187                   || !SYMBOL_REFERENCES_LOCAL (info, h)))
16188             indx = h->dynindx;
16189
16190           if (tls_type != GOT_NORMAL
16191               && (bfd_link_pic (info) || indx != 0)
16192               && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
16193                   || h->root.type != bfd_link_hash_undefweak))
16194             {
16195               if (tls_type & GOT_TLS_IE)
16196                 elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16197
16198               if (tls_type & GOT_TLS_GD)
16199                 elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16200
16201               if (tls_type & GOT_TLS_GDESC)
16202                 {
16203                   elf32_arm_allocate_dynrelocs (info, htab->root.srelplt, 1);
16204                   /* GDESC needs a trampoline to jump to.  */
16205                   htab->tls_trampoline = -1;
16206                 }
16207
16208               /* Only GD needs it.  GDESC just emits one relocation per
16209                  2 entries.  */
16210               if ((tls_type & GOT_TLS_GD) && indx != 0)
16211                 elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16212             }
16213           else if (((indx != -1) || htab->fdpic_p)
16214                    && !SYMBOL_REFERENCES_LOCAL (info, h))
16215             {
16216               if (htab->root.dynamic_sections_created)
16217                 /* Reserve room for the GOT entry's R_ARM_GLOB_DAT relocation.  */
16218                 elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16219             }
16220           else if (h->type == STT_GNU_IFUNC
16221                    && eh->plt.noncall_refcount == 0)
16222             /* No non-call references resolve the STT_GNU_IFUNC's PLT entry;
16223                they all resolve dynamically instead.  Reserve room for the
16224                GOT entry's R_ARM_IRELATIVE relocation.  */
16225             elf32_arm_allocate_irelocs (info, htab->root.srelgot, 1);
16226           else if (bfd_link_pic (info)
16227                    && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
16228                        || h->root.type != bfd_link_hash_undefweak))
16229             /* Reserve room for the GOT entry's R_ARM_RELATIVE relocation.  */
16230             elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16231           else if (htab->fdpic_p && tls_type == GOT_NORMAL)
16232             /* Reserve room for rofixup for FDPIC executable.  */
16233             /* TLS relocs do not need space since they are completely
16234                resolved.  */
16235             htab->srofixup->size += 4;
16236         }
16237     }
16238   else
16239     h->got.offset = (bfd_vma) -1;
16240
16241   /* FDPIC support.  */
16242   if (eh->fdpic_cnts.gotofffuncdesc_cnt > 0)
16243     {
16244       /* Symbol musn't be exported.  */
16245       if (h->dynindx != -1)
16246         abort();
16247
16248       /* We only allocate one function descriptor with its associated relocation.  */
16249       if (eh->fdpic_cnts.funcdesc_offset == -1)
16250         {
16251           asection *s = htab->root.sgot;
16252
16253           eh->fdpic_cnts.funcdesc_offset = s->size;
16254           s->size += 8;
16255           /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups.  */
16256           if (bfd_link_pic(info))
16257             elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16258           else
16259             htab->srofixup->size += 8;
16260         }
16261     }
16262
16263   if (eh->fdpic_cnts.gotfuncdesc_cnt > 0)
16264     {
16265       asection *s = htab->root.sgot;
16266
16267       if (htab->root.dynamic_sections_created && h->dynindx == -1
16268           && !h->forced_local)
16269         if (! bfd_elf_link_record_dynamic_symbol (info, h))
16270           return FALSE;
16271
16272       if (h->dynindx == -1)
16273         {
16274           /* We only allocate one function descriptor with its associated relocation. q */
16275           if (eh->fdpic_cnts.funcdesc_offset == -1)
16276             {
16277
16278               eh->fdpic_cnts.funcdesc_offset = s->size;
16279               s->size += 8;
16280               /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups.  */
16281               if (bfd_link_pic(info))
16282                 elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16283               else
16284                 htab->srofixup->size += 8;
16285             }
16286         }
16287
16288       /* Add one entry into the GOT and a R_ARM_FUNCDESC or
16289          R_ARM_RELATIVE/rofixup relocation on it.  */
16290       eh->fdpic_cnts.gotfuncdesc_offset = s->size;
16291       s->size += 4;
16292       if (h->dynindx == -1 && !bfd_link_pic(info))
16293         htab->srofixup->size += 4;
16294       else
16295         elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16296     }
16297
16298   if (eh->fdpic_cnts.funcdesc_cnt > 0)
16299     {
16300       if (htab->root.dynamic_sections_created && h->dynindx == -1
16301           && !h->forced_local)
16302         if (! bfd_elf_link_record_dynamic_symbol (info, h))
16303           return FALSE;
16304
16305       if (h->dynindx == -1)
16306         {
16307           /* We only allocate one function descriptor with its associated relocation.  */
16308           if (eh->fdpic_cnts.funcdesc_offset == -1)
16309             {
16310               asection *s = htab->root.sgot;
16311
16312               eh->fdpic_cnts.funcdesc_offset = s->size;
16313               s->size += 8;
16314               /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups.  */
16315               if (bfd_link_pic(info))
16316                 elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16317               else
16318                 htab->srofixup->size += 8;
16319             }
16320         }
16321       if (h->dynindx == -1 && !bfd_link_pic(info))
16322         {
16323           /* For FDPIC executable we replace R_ARM_RELATIVE with a rofixup.  */
16324           htab->srofixup->size += 4 * eh->fdpic_cnts.funcdesc_cnt;
16325         }
16326       else
16327         {
16328           /* Will need one dynamic reloc per reference. will be either
16329              R_ARM_FUNCDESC or R_ARM_RELATIVE for hidden symbols.  */
16330           elf32_arm_allocate_dynrelocs (info, htab->root.srelgot,
16331                                         eh->fdpic_cnts.funcdesc_cnt);
16332         }
16333     }
16334
16335   /* Allocate stubs for exported Thumb functions on v4t.  */
16336   if (!htab->use_blx && h->dynindx != -1
16337       && h->def_regular
16338       && ARM_GET_SYM_BRANCH_TYPE (h->target_internal) == ST_BRANCH_TO_THUMB
16339       && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
16340     {
16341       struct elf_link_hash_entry * th;
16342       struct bfd_link_hash_entry * bh;
16343       struct elf_link_hash_entry * myh;
16344       char name[1024];
16345       asection *s;
16346       bh = NULL;
16347       /* Create a new symbol to regist the real location of the function.  */
16348       s = h->root.u.def.section;
16349       sprintf (name, "__real_%s", h->root.root.string);
16350       _bfd_generic_link_add_one_symbol (info, s->owner,
16351                                         name, BSF_GLOBAL, s,
16352                                         h->root.u.def.value,
16353                                         NULL, TRUE, FALSE, &bh);
16354
16355       myh = (struct elf_link_hash_entry *) bh;
16356       myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
16357       myh->forced_local = 1;
16358       ARM_SET_SYM_BRANCH_TYPE (myh->target_internal, ST_BRANCH_TO_THUMB);
16359       eh->export_glue = myh;
16360       th = record_arm_to_thumb_glue (info, h);
16361       /* Point the symbol at the stub.  */
16362       h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
16363       ARM_SET_SYM_BRANCH_TYPE (h->target_internal, ST_BRANCH_TO_ARM);
16364       h->root.u.def.section = th->root.u.def.section;
16365       h->root.u.def.value = th->root.u.def.value & ~1;
16366     }
16367
16368   if (eh->dyn_relocs == NULL)
16369     return TRUE;
16370
16371   /* In the shared -Bsymbolic case, discard space allocated for
16372      dynamic pc-relative relocs against symbols which turn out to be
16373      defined in regular objects.  For the normal shared case, discard
16374      space for pc-relative relocs that have become local due to symbol
16375      visibility changes.  */
16376
16377   if (bfd_link_pic (info) || htab->root.is_relocatable_executable || htab->fdpic_p)
16378     {
16379       /* Relocs that use pc_count are PC-relative forms, which will appear
16380          on something like ".long foo - ." or "movw REG, foo - .".  We want
16381          calls to protected symbols to resolve directly to the function
16382          rather than going via the plt.  If people want function pointer
16383          comparisons to work as expected then they should avoid writing
16384          assembly like ".long foo - .".  */
16385       if (SYMBOL_CALLS_LOCAL (info, h))
16386         {
16387           struct elf_dyn_relocs **pp;
16388
16389           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
16390             {
16391               p->count -= p->pc_count;
16392               p->pc_count = 0;
16393               if (p->count == 0)
16394                 *pp = p->next;
16395               else
16396                 pp = &p->next;
16397             }
16398         }
16399
16400       if (htab->vxworks_p)
16401         {
16402           struct elf_dyn_relocs **pp;
16403
16404           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
16405             {
16406               if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
16407                 *pp = p->next;
16408               else
16409                 pp = &p->next;
16410             }
16411         }
16412
16413       /* Also discard relocs on undefined weak syms with non-default
16414          visibility.  */
16415       if (eh->dyn_relocs != NULL
16416           && h->root.type == bfd_link_hash_undefweak)
16417         {
16418           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
16419               || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
16420             eh->dyn_relocs = NULL;
16421
16422           /* Make sure undefined weak symbols are output as a dynamic
16423              symbol in PIEs.  */
16424           else if (htab->root.dynamic_sections_created && h->dynindx == -1
16425                    && !h->forced_local)
16426             {
16427               if (! bfd_elf_link_record_dynamic_symbol (info, h))
16428                 return FALSE;
16429             }
16430         }
16431
16432       else if (htab->root.is_relocatable_executable && h->dynindx == -1
16433                && h->root.type == bfd_link_hash_new)
16434         {
16435           /* Output absolute symbols so that we can create relocations
16436              against them.  For normal symbols we output a relocation
16437              against the section that contains them.  */
16438           if (! bfd_elf_link_record_dynamic_symbol (info, h))
16439             return FALSE;
16440         }
16441
16442     }
16443   else
16444     {
16445       /* For the non-shared case, discard space for relocs against
16446          symbols which turn out to need copy relocs or are not
16447          dynamic.  */
16448
16449       if (!h->non_got_ref
16450           && ((h->def_dynamic
16451                && !h->def_regular)
16452               || (htab->root.dynamic_sections_created
16453                   && (h->root.type == bfd_link_hash_undefweak
16454                       || h->root.type == bfd_link_hash_undefined))))
16455         {
16456           /* Make sure this symbol is output as a dynamic symbol.
16457              Undefined weak syms won't yet be marked as dynamic.  */
16458           if (h->dynindx == -1 && !h->forced_local
16459               && h->root.type == bfd_link_hash_undefweak)
16460             {
16461               if (! bfd_elf_link_record_dynamic_symbol (info, h))
16462                 return FALSE;
16463             }
16464
16465           /* If that succeeded, we know we'll be keeping all the
16466              relocs.  */
16467           if (h->dynindx != -1)
16468             goto keep;
16469         }
16470
16471       eh->dyn_relocs = NULL;
16472
16473     keep: ;
16474     }
16475
16476   /* Finally, allocate space.  */
16477   for (p = eh->dyn_relocs; p != NULL; p = p->next)
16478     {
16479       asection *sreloc = elf_section_data (p->sec)->sreloc;
16480
16481       if (h->type == STT_GNU_IFUNC
16482           && eh->plt.noncall_refcount == 0
16483           && SYMBOL_REFERENCES_LOCAL (info, h))
16484         elf32_arm_allocate_irelocs (info, sreloc, p->count);
16485       else if (h->dynindx != -1 && (!bfd_link_pic(info) || !info->symbolic || !h->def_regular))
16486         elf32_arm_allocate_dynrelocs (info, sreloc, p->count);
16487       else if (htab->fdpic_p && !bfd_link_pic(info))
16488         htab->srofixup->size += 4 * p->count;
16489       else
16490         elf32_arm_allocate_dynrelocs (info, sreloc, p->count);
16491     }
16492
16493   return TRUE;
16494 }
16495
16496 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
16497    read-only sections.  */
16498
16499 static bfd_boolean
16500 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
16501 {
16502   asection *sec;
16503
16504   if (h->root.type == bfd_link_hash_indirect)
16505     return TRUE;
16506
16507   sec = readonly_dynrelocs (h);
16508   if (sec != NULL)
16509     {
16510       struct bfd_link_info *info = (struct bfd_link_info *) info_p;
16511
16512       info->flags |= DF_TEXTREL;
16513       info->callbacks->minfo
16514         (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
16515          sec->owner, h->root.root.string, sec);
16516
16517       /* Not an error, just cut short the traversal.  */
16518       return FALSE;
16519     }
16520
16521   return TRUE;
16522 }
16523
16524 void
16525 bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *info,
16526                                  int byteswap_code)
16527 {
16528   struct elf32_arm_link_hash_table *globals;
16529
16530   globals = elf32_arm_hash_table (info);
16531   if (globals == NULL)
16532     return;
16533
16534   globals->byteswap_code = byteswap_code;
16535 }
16536
16537 /* Set the sizes of the dynamic sections.  */
16538
16539 static bfd_boolean
16540 elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
16541                                  struct bfd_link_info * info)
16542 {
16543   bfd * dynobj;
16544   asection * s;
16545   bfd_boolean plt;
16546   bfd_boolean relocs;
16547   bfd *ibfd;
16548   struct elf32_arm_link_hash_table *htab;
16549
16550   htab = elf32_arm_hash_table (info);
16551   if (htab == NULL)
16552     return FALSE;
16553
16554   dynobj = elf_hash_table (info)->dynobj;
16555   BFD_ASSERT (dynobj != NULL);
16556   check_use_blx (htab);
16557
16558   if (elf_hash_table (info)->dynamic_sections_created)
16559     {
16560       /* Set the contents of the .interp section to the interpreter.  */
16561       if (bfd_link_executable (info) && !info->nointerp)
16562         {
16563           s = bfd_get_linker_section (dynobj, ".interp");
16564           BFD_ASSERT (s != NULL);
16565           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
16566           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
16567         }
16568     }
16569
16570   /* Set up .got offsets for local syms, and space for local dynamic
16571      relocs.  */
16572   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
16573     {
16574       bfd_signed_vma *local_got;
16575       bfd_signed_vma *end_local_got;
16576       struct arm_local_iplt_info **local_iplt_ptr, *local_iplt;
16577       char *local_tls_type;
16578       bfd_vma *local_tlsdesc_gotent;
16579       bfd_size_type locsymcount;
16580       Elf_Internal_Shdr *symtab_hdr;
16581       asection *srel;
16582       bfd_boolean is_vxworks = htab->vxworks_p;
16583       unsigned int symndx;
16584       struct fdpic_local *local_fdpic_cnts;
16585
16586       if (! is_arm_elf (ibfd))
16587         continue;
16588
16589       for (s = ibfd->sections; s != NULL; s = s->next)
16590         {
16591           struct elf_dyn_relocs *p;
16592
16593           for (p = (struct elf_dyn_relocs *)
16594                    elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
16595             {
16596               if (!bfd_is_abs_section (p->sec)
16597                   && bfd_is_abs_section (p->sec->output_section))
16598                 {
16599                   /* Input section has been discarded, either because
16600                      it is a copy of a linkonce section or due to
16601                      linker script /DISCARD/, so we'll be discarding
16602                      the relocs too.  */
16603                 }
16604               else if (is_vxworks
16605                        && strcmp (p->sec->output_section->name,
16606                                   ".tls_vars") == 0)
16607                 {
16608                   /* Relocations in vxworks .tls_vars sections are
16609                      handled specially by the loader.  */
16610                 }
16611               else if (p->count != 0)
16612                 {
16613                   srel = elf_section_data (p->sec)->sreloc;
16614                   if (htab->fdpic_p && !bfd_link_pic(info))
16615                     htab->srofixup->size += 4 * p->count;
16616                   else
16617                     elf32_arm_allocate_dynrelocs (info, srel, p->count);
16618                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
16619                     info->flags |= DF_TEXTREL;
16620                 }
16621             }
16622         }
16623
16624       local_got = elf_local_got_refcounts (ibfd);
16625       if (!local_got)
16626         continue;
16627
16628       symtab_hdr = & elf_symtab_hdr (ibfd);
16629       locsymcount = symtab_hdr->sh_info;
16630       end_local_got = local_got + locsymcount;
16631       local_iplt_ptr = elf32_arm_local_iplt (ibfd);
16632       local_tls_type = elf32_arm_local_got_tls_type (ibfd);
16633       local_tlsdesc_gotent = elf32_arm_local_tlsdesc_gotent (ibfd);
16634       local_fdpic_cnts = elf32_arm_local_fdpic_cnts (ibfd);
16635       symndx = 0;
16636       s = htab->root.sgot;
16637       srel = htab->root.srelgot;
16638       for (; local_got < end_local_got;
16639            ++local_got, ++local_iplt_ptr, ++local_tls_type,
16640            ++local_tlsdesc_gotent, ++symndx, ++local_fdpic_cnts)
16641         {
16642           *local_tlsdesc_gotent = (bfd_vma) -1;
16643           local_iplt = *local_iplt_ptr;
16644
16645           /* FDPIC support.  */
16646           if (local_fdpic_cnts->gotofffuncdesc_cnt > 0)
16647             {
16648               if (local_fdpic_cnts->funcdesc_offset == -1)
16649                 {
16650                   local_fdpic_cnts->funcdesc_offset = s->size;
16651                   s->size += 8;
16652
16653                   /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups.  */
16654                   if (bfd_link_pic(info))
16655                     elf32_arm_allocate_dynrelocs (info, srel, 1);
16656                   else
16657                     htab->srofixup->size += 8;
16658                 }
16659             }
16660
16661           if (local_fdpic_cnts->funcdesc_cnt > 0)
16662             {
16663               if (local_fdpic_cnts->funcdesc_offset == -1)
16664                 {
16665                   local_fdpic_cnts->funcdesc_offset = s->size;
16666                   s->size += 8;
16667
16668                   /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups.  */
16669                   if (bfd_link_pic(info))
16670                     elf32_arm_allocate_dynrelocs (info, srel, 1);
16671                   else
16672                     htab->srofixup->size += 8;
16673                 }
16674
16675               /* We will add n R_ARM_RELATIVE relocations or n rofixups.  */
16676               if (bfd_link_pic(info))
16677                 elf32_arm_allocate_dynrelocs (info, srel, local_fdpic_cnts->funcdesc_cnt);
16678               else
16679                 htab->srofixup->size += 4 * local_fdpic_cnts->funcdesc_cnt;
16680             }
16681
16682           if (local_iplt != NULL)
16683             {
16684               struct elf_dyn_relocs *p;
16685
16686               if (local_iplt->root.refcount > 0)
16687                 {
16688                   elf32_arm_allocate_plt_entry (info, TRUE,
16689                                                 &local_iplt->root,
16690                                                 &local_iplt->arm);
16691                   if (local_iplt->arm.noncall_refcount == 0)
16692                     /* All references to the PLT are calls, so all
16693                        non-call references can resolve directly to the
16694                        run-time target.  This means that the .got entry
16695                        would be the same as the .igot.plt entry, so there's
16696                        no point creating both.  */
16697                     *local_got = 0;
16698                 }
16699               else
16700                 {
16701                   BFD_ASSERT (local_iplt->arm.noncall_refcount == 0);
16702                   local_iplt->root.offset = (bfd_vma) -1;
16703                 }
16704
16705               for (p = local_iplt->dyn_relocs; p != NULL; p = p->next)
16706                 {
16707                   asection *psrel;
16708
16709                   psrel = elf_section_data (p->sec)->sreloc;
16710                   if (local_iplt->arm.noncall_refcount == 0)
16711                     elf32_arm_allocate_irelocs (info, psrel, p->count);
16712                   else
16713                     elf32_arm_allocate_dynrelocs (info, psrel, p->count);
16714                 }
16715             }
16716           if (*local_got > 0)
16717             {
16718               Elf_Internal_Sym *isym;
16719
16720               *local_got = s->size;
16721               if (*local_tls_type & GOT_TLS_GD)
16722                 /* TLS_GD relocs need an 8-byte structure in the GOT.  */
16723                 s->size += 8;
16724               if (*local_tls_type & GOT_TLS_GDESC)
16725                 {
16726                   *local_tlsdesc_gotent = htab->root.sgotplt->size
16727                     - elf32_arm_compute_jump_table_size (htab);
16728                   htab->root.sgotplt->size += 8;
16729                   *local_got = (bfd_vma) -2;
16730                   /* plt.got_offset needs to know there's a TLS_DESC
16731                      reloc in the middle of .got.plt.  */
16732                   htab->num_tls_desc++;
16733                 }
16734               if (*local_tls_type & GOT_TLS_IE)
16735                 s->size += 4;
16736
16737               if (*local_tls_type & GOT_NORMAL)
16738                 {
16739                   /* If the symbol is both GD and GDESC, *local_got
16740                      may have been overwritten.  */
16741                   *local_got = s->size;
16742                   s->size += 4;
16743                 }
16744
16745               isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, symndx);
16746               if (isym == NULL)
16747                 return FALSE;
16748
16749               /* If all references to an STT_GNU_IFUNC PLT are calls,
16750                  then all non-call references, including this GOT entry,
16751                  resolve directly to the run-time target.  */
16752               if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
16753                   && (local_iplt == NULL
16754                       || local_iplt->arm.noncall_refcount == 0))
16755                 elf32_arm_allocate_irelocs (info, srel, 1);
16756               else if (bfd_link_pic (info) || output_bfd->flags & DYNAMIC || htab->fdpic_p)
16757                 {
16758                   if ((bfd_link_pic (info) && !(*local_tls_type & GOT_TLS_GDESC)))
16759                     elf32_arm_allocate_dynrelocs (info, srel, 1);
16760                   else if (htab->fdpic_p && *local_tls_type & GOT_NORMAL)
16761                     htab->srofixup->size += 4;
16762
16763                   if ((bfd_link_pic (info) || htab->fdpic_p)
16764                       && *local_tls_type & GOT_TLS_GDESC)
16765                     {
16766                       elf32_arm_allocate_dynrelocs (info,
16767                                                     htab->root.srelplt, 1);
16768                       htab->tls_trampoline = -1;
16769                     }
16770                 }
16771             }
16772           else
16773             *local_got = (bfd_vma) -1;
16774         }
16775     }
16776
16777   if (htab->tls_ldm_got.refcount > 0)
16778     {
16779       /* Allocate two GOT entries and one dynamic relocation (if necessary)
16780          for R_ARM_TLS_LDM32/R_ARM_TLS_LDM32_FDPIC relocations.  */
16781       htab->tls_ldm_got.offset = htab->root.sgot->size;
16782       htab->root.sgot->size += 8;
16783       if (bfd_link_pic (info))
16784         elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
16785     }
16786   else
16787     htab->tls_ldm_got.offset = -1;
16788
16789   /* At the very end of the .rofixup section is a pointer to the GOT,
16790      reserve space for it. */
16791   if (htab->fdpic_p && htab->srofixup != NULL)
16792     htab->srofixup->size += 4;
16793
16794   /* Allocate global sym .plt and .got entries, and space for global
16795      sym dynamic relocs.  */
16796   elf_link_hash_traverse (& htab->root, allocate_dynrelocs_for_symbol, info);
16797
16798   /* Here we rummage through the found bfds to collect glue information.  */
16799   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
16800     {
16801       if (! is_arm_elf (ibfd))
16802         continue;
16803
16804       /* Initialise mapping tables for code/data.  */
16805       bfd_elf32_arm_init_maps (ibfd);
16806
16807       if (!bfd_elf32_arm_process_before_allocation (ibfd, info)
16808           || !bfd_elf32_arm_vfp11_erratum_scan (ibfd, info)
16809           || !bfd_elf32_arm_stm32l4xx_erratum_scan (ibfd, info))
16810         _bfd_error_handler (_("errors encountered processing file %pB"), ibfd);
16811     }
16812
16813   /* Allocate space for the glue sections now that we've sized them.  */
16814   bfd_elf32_arm_allocate_interworking_sections (info);
16815
16816   /* For every jump slot reserved in the sgotplt, reloc_count is
16817      incremented.  However, when we reserve space for TLS descriptors,
16818      it's not incremented, so in order to compute the space reserved
16819      for them, it suffices to multiply the reloc count by the jump
16820      slot size.  */
16821   if (htab->root.srelplt)
16822     htab->sgotplt_jump_table_size = elf32_arm_compute_jump_table_size(htab);
16823
16824   if (htab->tls_trampoline)
16825     {
16826       if (htab->root.splt->size == 0)
16827         htab->root.splt->size += htab->plt_header_size;
16828
16829       htab->tls_trampoline = htab->root.splt->size;
16830       htab->root.splt->size += htab->plt_entry_size;
16831
16832       /* If we're not using lazy TLS relocations, don't generate the
16833          PLT and GOT entries they require.  */
16834       if (!(info->flags & DF_BIND_NOW))
16835         {
16836           htab->dt_tlsdesc_got = htab->root.sgot->size;
16837           htab->root.sgot->size += 4;
16838
16839           htab->dt_tlsdesc_plt = htab->root.splt->size;
16840           htab->root.splt->size += 4 * ARRAY_SIZE (dl_tlsdesc_lazy_trampoline);
16841         }
16842     }
16843
16844   /* The check_relocs and adjust_dynamic_symbol entry points have
16845      determined the sizes of the various dynamic sections.  Allocate
16846      memory for them.  */
16847   plt = FALSE;
16848   relocs = FALSE;
16849   for (s = dynobj->sections; s != NULL; s = s->next)
16850     {
16851       const char * name;
16852
16853       if ((s->flags & SEC_LINKER_CREATED) == 0)
16854         continue;
16855
16856       /* It's OK to base decisions on the section name, because none
16857          of the dynobj section names depend upon the input files.  */
16858       name = bfd_get_section_name (dynobj, s);
16859
16860       if (s == htab->root.splt)
16861         {
16862           /* Remember whether there is a PLT.  */
16863           plt = s->size != 0;
16864         }
16865       else if (CONST_STRNEQ (name, ".rel"))
16866         {
16867           if (s->size != 0)
16868             {
16869               /* Remember whether there are any reloc sections other
16870                  than .rel(a).plt and .rela.plt.unloaded.  */
16871               if (s != htab->root.srelplt && s != htab->srelplt2)
16872                 relocs = TRUE;
16873
16874               /* We use the reloc_count field as a counter if we need
16875                  to copy relocs into the output file.  */
16876               s->reloc_count = 0;
16877             }
16878         }
16879       else if (s != htab->root.sgot
16880                && s != htab->root.sgotplt
16881                && s != htab->root.iplt
16882                && s != htab->root.igotplt
16883                && s != htab->root.sdynbss
16884                && s != htab->root.sdynrelro
16885                && s != htab->srofixup)
16886         {
16887           /* It's not one of our sections, so don't allocate space.  */
16888           continue;
16889         }
16890
16891       if (s->size == 0)
16892         {
16893           /* If we don't need this section, strip it from the
16894              output file.  This is mostly to handle .rel(a).bss and
16895              .rel(a).plt.  We must create both sections in
16896              create_dynamic_sections, because they must be created
16897              before the linker maps input sections to output
16898              sections.  The linker does that before
16899              adjust_dynamic_symbol is called, and it is that
16900              function which decides whether anything needs to go
16901              into these sections.  */
16902           s->flags |= SEC_EXCLUDE;
16903           continue;
16904         }
16905
16906       if ((s->flags & SEC_HAS_CONTENTS) == 0)
16907         continue;
16908
16909       /* Allocate memory for the section contents.  */
16910       s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
16911       if (s->contents == NULL)
16912         return FALSE;
16913     }
16914
16915   if (elf_hash_table (info)->dynamic_sections_created)
16916     {
16917       /* Add some entries to the .dynamic section.  We fill in the
16918          values later, in elf32_arm_finish_dynamic_sections, but we
16919          must add the entries now so that we get the correct size for
16920          the .dynamic section.  The DT_DEBUG entry is filled in by the
16921          dynamic linker and used by the debugger.  */
16922 #define add_dynamic_entry(TAG, VAL) \
16923   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
16924
16925      if (bfd_link_executable (info))
16926         {
16927           if (!add_dynamic_entry (DT_DEBUG, 0))
16928             return FALSE;
16929         }
16930
16931       if (plt)
16932         {
16933           if (   !add_dynamic_entry (DT_PLTGOT, 0)
16934               || !add_dynamic_entry (DT_PLTRELSZ, 0)
16935               || !add_dynamic_entry (DT_PLTREL,
16936                                      htab->use_rel ? DT_REL : DT_RELA)
16937               || !add_dynamic_entry (DT_JMPREL, 0))
16938             return FALSE;
16939
16940           if (htab->dt_tlsdesc_plt
16941               && (!add_dynamic_entry (DT_TLSDESC_PLT,0)
16942                   || !add_dynamic_entry (DT_TLSDESC_GOT,0)))
16943             return FALSE;
16944         }
16945
16946       if (relocs)
16947         {
16948           if (htab->use_rel)
16949             {
16950               if (!add_dynamic_entry (DT_REL, 0)
16951                   || !add_dynamic_entry (DT_RELSZ, 0)
16952                   || !add_dynamic_entry (DT_RELENT, RELOC_SIZE (htab)))
16953                 return FALSE;
16954             }
16955           else
16956             {
16957               if (!add_dynamic_entry (DT_RELA, 0)
16958                   || !add_dynamic_entry (DT_RELASZ, 0)
16959                   || !add_dynamic_entry (DT_RELAENT, RELOC_SIZE (htab)))
16960                 return FALSE;
16961             }
16962         }
16963
16964       /* If any dynamic relocs apply to a read-only section,
16965          then we need a DT_TEXTREL entry.  */
16966       if ((info->flags & DF_TEXTREL) == 0)
16967         elf_link_hash_traverse (&htab->root, maybe_set_textrel, info);
16968
16969       if ((info->flags & DF_TEXTREL) != 0)
16970         {
16971           if (!add_dynamic_entry (DT_TEXTREL, 0))
16972             return FALSE;
16973         }
16974       if (htab->vxworks_p
16975           && !elf_vxworks_add_dynamic_entries (output_bfd, info))
16976         return FALSE;
16977     }
16978 #undef add_dynamic_entry
16979
16980   return TRUE;
16981 }
16982
16983 /* Size sections even though they're not dynamic.  We use it to setup
16984    _TLS_MODULE_BASE_, if needed.  */
16985
16986 static bfd_boolean
16987 elf32_arm_always_size_sections (bfd *output_bfd,
16988                                 struct bfd_link_info *info)
16989 {
16990   asection *tls_sec;
16991   struct elf32_arm_link_hash_table *htab;
16992
16993   htab = elf32_arm_hash_table (info);
16994
16995   if (bfd_link_relocatable (info))
16996     return TRUE;
16997
16998   tls_sec = elf_hash_table (info)->tls_sec;
16999
17000   if (tls_sec)
17001     {
17002       struct elf_link_hash_entry *tlsbase;
17003
17004       tlsbase = elf_link_hash_lookup
17005         (elf_hash_table (info), "_TLS_MODULE_BASE_", TRUE, TRUE, FALSE);
17006
17007       if (tlsbase)
17008         {
17009           struct bfd_link_hash_entry *bh = NULL;
17010           const struct elf_backend_data *bed
17011             = get_elf_backend_data (output_bfd);
17012
17013           if (!(_bfd_generic_link_add_one_symbol
17014                 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
17015                  tls_sec, 0, NULL, FALSE,
17016                  bed->collect, &bh)))
17017             return FALSE;
17018
17019           tlsbase->type = STT_TLS;
17020           tlsbase = (struct elf_link_hash_entry *)bh;
17021           tlsbase->def_regular = 1;
17022           tlsbase->other = STV_HIDDEN;
17023           (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
17024         }
17025     }
17026
17027   if (htab->fdpic_p && !bfd_link_relocatable (info)
17028       && !bfd_elf_stack_segment_size (output_bfd, info,
17029                                       "__stacksize", DEFAULT_STACK_SIZE))
17030     return FALSE;
17031
17032   return TRUE;
17033 }
17034
17035 /* Finish up dynamic symbol handling.  We set the contents of various
17036    dynamic sections here.  */
17037
17038 static bfd_boolean
17039 elf32_arm_finish_dynamic_symbol (bfd * output_bfd,
17040                                  struct bfd_link_info * info,
17041                                  struct elf_link_hash_entry * h,
17042                                  Elf_Internal_Sym * sym)
17043 {
17044   struct elf32_arm_link_hash_table *htab;
17045   struct elf32_arm_link_hash_entry *eh;
17046
17047   htab = elf32_arm_hash_table (info);
17048   if (htab == NULL)
17049     return FALSE;
17050
17051   eh = (struct elf32_arm_link_hash_entry *) h;
17052
17053   if (h->plt.offset != (bfd_vma) -1)
17054     {
17055       if (!eh->is_iplt)
17056         {
17057           BFD_ASSERT (h->dynindx != -1);
17058           if (! elf32_arm_populate_plt_entry (output_bfd, info, &h->plt, &eh->plt,
17059                                               h->dynindx, 0))
17060             return FALSE;
17061         }
17062
17063       if (!h->def_regular)
17064         {
17065           /* Mark the symbol as undefined, rather than as defined in
17066              the .plt section.  */
17067           sym->st_shndx = SHN_UNDEF;
17068           /* If the symbol is weak we need to clear the value.
17069              Otherwise, the PLT entry would provide a definition for
17070              the symbol even if the symbol wasn't defined anywhere,
17071              and so the symbol would never be NULL.  Leave the value if
17072              there were any relocations where pointer equality matters
17073              (this is a clue for the dynamic linker, to make function
17074              pointer comparisons work between an application and shared
17075              library).  */
17076           if (!h->ref_regular_nonweak || !h->pointer_equality_needed)
17077             sym->st_value = 0;
17078         }
17079       else if (eh->is_iplt && eh->plt.noncall_refcount != 0)
17080         {
17081           /* At least one non-call relocation references this .iplt entry,
17082              so the .iplt entry is the function's canonical address.  */
17083           sym->st_info = ELF_ST_INFO (ELF_ST_BIND (sym->st_info), STT_FUNC);
17084           ARM_SET_SYM_BRANCH_TYPE (sym->st_target_internal, ST_BRANCH_TO_ARM);
17085           sym->st_shndx = (_bfd_elf_section_from_bfd_section
17086                            (output_bfd, htab->root.iplt->output_section));
17087           sym->st_value = (h->plt.offset
17088                            + htab->root.iplt->output_section->vma
17089                            + htab->root.iplt->output_offset);
17090         }
17091     }
17092
17093   if (h->needs_copy)
17094     {
17095       asection * s;
17096       Elf_Internal_Rela rel;
17097
17098       /* This symbol needs a copy reloc.  Set it up.  */
17099       BFD_ASSERT (h->dynindx != -1
17100                   && (h->root.type == bfd_link_hash_defined
17101                       || h->root.type == bfd_link_hash_defweak));
17102
17103       rel.r_addend = 0;
17104       rel.r_offset = (h->root.u.def.value
17105                       + h->root.u.def.section->output_section->vma
17106                       + h->root.u.def.section->output_offset);
17107       rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
17108       if (h->root.u.def.section == htab->root.sdynrelro)
17109         s = htab->root.sreldynrelro;
17110       else
17111         s = htab->root.srelbss;
17112       elf32_arm_add_dynreloc (output_bfd, info, s, &rel);
17113     }
17114
17115   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  On VxWorks,
17116      and for FDPIC, the _GLOBAL_OFFSET_TABLE_ symbol is not absolute:
17117      it is relative to the ".got" section.  */
17118   if (h == htab->root.hdynamic
17119       || (!htab->fdpic_p && !htab->vxworks_p && h == htab->root.hgot))
17120     sym->st_shndx = SHN_ABS;
17121
17122   return TRUE;
17123 }
17124
17125 static void
17126 arm_put_trampoline (struct elf32_arm_link_hash_table *htab, bfd *output_bfd,
17127                     void *contents,
17128                     const unsigned long *template, unsigned count)
17129 {
17130   unsigned ix;
17131
17132   for (ix = 0; ix != count; ix++)
17133     {
17134       unsigned long insn = template[ix];
17135
17136       /* Emit mov pc,rx if bx is not permitted.  */
17137       if (htab->fix_v4bx == 1 && (insn & 0x0ffffff0) == 0x012fff10)
17138         insn = (insn & 0xf000000f) | 0x01a0f000;
17139       put_arm_insn (htab, output_bfd, insn, (char *)contents + ix*4);
17140     }
17141 }
17142
17143 /* Install the special first PLT entry for elf32-arm-nacl.  Unlike
17144    other variants, NaCl needs this entry in a static executable's
17145    .iplt too.  When we're handling that case, GOT_DISPLACEMENT is
17146    zero.  For .iplt really only the last bundle is useful, and .iplt
17147    could have a shorter first entry, with each individual PLT entry's
17148    relative branch calculated differently so it targets the last
17149    bundle instead of the instruction before it (labelled .Lplt_tail
17150    above).  But it's simpler to keep the size and layout of PLT0
17151    consistent with the dynamic case, at the cost of some dead code at
17152    the start of .iplt and the one dead store to the stack at the start
17153    of .Lplt_tail.  */
17154 static void
17155 arm_nacl_put_plt0 (struct elf32_arm_link_hash_table *htab, bfd *output_bfd,
17156                    asection *plt, bfd_vma got_displacement)
17157 {
17158   unsigned int i;
17159
17160   put_arm_insn (htab, output_bfd,
17161                 elf32_arm_nacl_plt0_entry[0]
17162                 | arm_movw_immediate (got_displacement),
17163                 plt->contents + 0);
17164   put_arm_insn (htab, output_bfd,
17165                 elf32_arm_nacl_plt0_entry[1]
17166                 | arm_movt_immediate (got_displacement),
17167                 plt->contents + 4);
17168
17169   for (i = 2; i < ARRAY_SIZE (elf32_arm_nacl_plt0_entry); ++i)
17170     put_arm_insn (htab, output_bfd,
17171                   elf32_arm_nacl_plt0_entry[i],
17172                   plt->contents + (i * 4));
17173 }
17174
17175 /* Finish up the dynamic sections.  */
17176
17177 static bfd_boolean
17178 elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
17179 {
17180   bfd * dynobj;
17181   asection * sgot;
17182   asection * sdyn;
17183   struct elf32_arm_link_hash_table *htab;
17184
17185   htab = elf32_arm_hash_table (info);
17186   if (htab == NULL)
17187     return FALSE;
17188
17189   dynobj = elf_hash_table (info)->dynobj;
17190
17191   sgot = htab->root.sgotplt;
17192   /* A broken linker script might have discarded the dynamic sections.
17193      Catch this here so that we do not seg-fault later on.  */
17194   if (sgot != NULL && bfd_is_abs_section (sgot->output_section))
17195     return FALSE;
17196   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
17197
17198   if (elf_hash_table (info)->dynamic_sections_created)
17199     {
17200       asection *splt;
17201       Elf32_External_Dyn *dyncon, *dynconend;
17202
17203       splt = htab->root.splt;
17204       BFD_ASSERT (splt != NULL && sdyn != NULL);
17205       BFD_ASSERT (htab->symbian_p || sgot != NULL);
17206
17207       dyncon = (Elf32_External_Dyn *) sdyn->contents;
17208       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
17209
17210       for (; dyncon < dynconend; dyncon++)
17211         {
17212           Elf_Internal_Dyn dyn;
17213           const char * name;
17214           asection * s;
17215
17216           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
17217
17218           switch (dyn.d_tag)
17219             {
17220               unsigned int type;
17221
17222             default:
17223               if (htab->vxworks_p
17224                   && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
17225                 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17226               break;
17227
17228             case DT_HASH:
17229               name = ".hash";
17230               goto get_vma_if_bpabi;
17231             case DT_STRTAB:
17232               name = ".dynstr";
17233               goto get_vma_if_bpabi;
17234             case DT_SYMTAB:
17235               name = ".dynsym";
17236               goto get_vma_if_bpabi;
17237             case DT_VERSYM:
17238               name = ".gnu.version";
17239               goto get_vma_if_bpabi;
17240             case DT_VERDEF:
17241               name = ".gnu.version_d";
17242               goto get_vma_if_bpabi;
17243             case DT_VERNEED:
17244               name = ".gnu.version_r";
17245               goto get_vma_if_bpabi;
17246
17247             case DT_PLTGOT:
17248               name = htab->symbian_p ? ".got" : ".got.plt";
17249               goto get_vma;
17250             case DT_JMPREL:
17251               name = RELOC_SECTION (htab, ".plt");
17252             get_vma:
17253               s = bfd_get_linker_section (dynobj, name);
17254               if (s == NULL)
17255                 {
17256                   _bfd_error_handler
17257                     (_("could not find section %s"), name);
17258                   bfd_set_error (bfd_error_invalid_operation);
17259                   return FALSE;
17260                 }
17261               if (!htab->symbian_p)
17262                 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
17263               else
17264                 /* In the BPABI, tags in the PT_DYNAMIC section point
17265                    at the file offset, not the memory address, for the
17266                    convenience of the post linker.  */
17267                 dyn.d_un.d_ptr = s->output_section->filepos + s->output_offset;
17268               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17269               break;
17270
17271             get_vma_if_bpabi:
17272               if (htab->symbian_p)
17273                 goto get_vma;
17274               break;
17275
17276             case DT_PLTRELSZ:
17277               s = htab->root.srelplt;
17278               BFD_ASSERT (s != NULL);
17279               dyn.d_un.d_val = s->size;
17280               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17281               break;
17282
17283             case DT_RELSZ:
17284             case DT_RELASZ:
17285             case DT_REL:
17286             case DT_RELA:
17287               /* In the BPABI, the DT_REL tag must point at the file
17288                  offset, not the VMA, of the first relocation
17289                  section.  So, we use code similar to that in
17290                  elflink.c, but do not check for SHF_ALLOC on the
17291                  relocation section, since relocation sections are
17292                  never allocated under the BPABI.  PLT relocs are also
17293                  included.  */
17294               if (htab->symbian_p)
17295                 {
17296                   unsigned int i;
17297                   type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
17298                           ? SHT_REL : SHT_RELA);
17299                   dyn.d_un.d_val = 0;
17300                   for (i = 1; i < elf_numsections (output_bfd); i++)
17301                     {
17302                       Elf_Internal_Shdr *hdr
17303                         = elf_elfsections (output_bfd)[i];
17304                       if (hdr->sh_type == type)
17305                         {
17306                           if (dyn.d_tag == DT_RELSZ
17307                               || dyn.d_tag == DT_RELASZ)
17308                             dyn.d_un.d_val += hdr->sh_size;
17309                           else if ((ufile_ptr) hdr->sh_offset
17310                                    <= dyn.d_un.d_val - 1)
17311                             dyn.d_un.d_val = hdr->sh_offset;
17312                         }
17313                     }
17314                   bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17315                 }
17316               break;
17317
17318             case DT_TLSDESC_PLT:
17319               s = htab->root.splt;
17320               dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
17321                                 + htab->dt_tlsdesc_plt);
17322               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17323               break;
17324
17325             case DT_TLSDESC_GOT:
17326               s = htab->root.sgot;
17327               dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
17328                                 + htab->dt_tlsdesc_got);
17329               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17330               break;
17331
17332               /* Set the bottom bit of DT_INIT/FINI if the
17333                  corresponding function is Thumb.  */
17334             case DT_INIT:
17335               name = info->init_function;
17336               goto get_sym;
17337             case DT_FINI:
17338               name = info->fini_function;
17339             get_sym:
17340               /* If it wasn't set by elf_bfd_final_link
17341                  then there is nothing to adjust.  */
17342               if (dyn.d_un.d_val != 0)
17343                 {
17344                   struct elf_link_hash_entry * eh;
17345
17346                   eh = elf_link_hash_lookup (elf_hash_table (info), name,
17347                                              FALSE, FALSE, TRUE);
17348                   if (eh != NULL
17349                       && ARM_GET_SYM_BRANCH_TYPE (eh->target_internal)
17350                          == ST_BRANCH_TO_THUMB)
17351                     {
17352                       dyn.d_un.d_val |= 1;
17353                       bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
17354                     }
17355                 }
17356               break;
17357             }
17358         }
17359
17360       /* Fill in the first entry in the procedure linkage table.  */
17361       if (splt->size > 0 && htab->plt_header_size)
17362         {
17363           const bfd_vma *plt0_entry;
17364           bfd_vma got_address, plt_address, got_displacement;
17365
17366           /* Calculate the addresses of the GOT and PLT.  */
17367           got_address = sgot->output_section->vma + sgot->output_offset;
17368           plt_address = splt->output_section->vma + splt->output_offset;
17369
17370           if (htab->vxworks_p)
17371             {
17372               /* The VxWorks GOT is relocated by the dynamic linker.
17373                  Therefore, we must emit relocations rather than simply
17374                  computing the values now.  */
17375               Elf_Internal_Rela rel;
17376
17377               plt0_entry = elf32_arm_vxworks_exec_plt0_entry;
17378               put_arm_insn (htab, output_bfd, plt0_entry[0],
17379                             splt->contents + 0);
17380               put_arm_insn (htab, output_bfd, plt0_entry[1],
17381                             splt->contents + 4);
17382               put_arm_insn (htab, output_bfd, plt0_entry[2],
17383                             splt->contents + 8);
17384               bfd_put_32 (output_bfd, got_address, splt->contents + 12);
17385
17386               /* Generate a relocation for _GLOBAL_OFFSET_TABLE_.  */
17387               rel.r_offset = plt_address + 12;
17388               rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
17389               rel.r_addend = 0;
17390               SWAP_RELOC_OUT (htab) (output_bfd, &rel,
17391                                      htab->srelplt2->contents);
17392             }
17393           else if (htab->nacl_p)
17394             arm_nacl_put_plt0 (htab, output_bfd, splt,
17395                                got_address + 8 - (plt_address + 16));
17396           else if (using_thumb_only (htab))
17397             {
17398               got_displacement = got_address - (plt_address + 12);
17399
17400               plt0_entry = elf32_thumb2_plt0_entry;
17401               put_arm_insn (htab, output_bfd, plt0_entry[0],
17402                             splt->contents + 0);
17403               put_arm_insn (htab, output_bfd, plt0_entry[1],
17404                             splt->contents + 4);
17405               put_arm_insn (htab, output_bfd, plt0_entry[2],
17406                             splt->contents + 8);
17407
17408               bfd_put_32 (output_bfd, got_displacement, splt->contents + 12);
17409             }
17410           else
17411             {
17412               got_displacement = got_address - (plt_address + 16);
17413
17414               plt0_entry = elf32_arm_plt0_entry;
17415               put_arm_insn (htab, output_bfd, plt0_entry[0],
17416                             splt->contents + 0);
17417               put_arm_insn (htab, output_bfd, plt0_entry[1],
17418                             splt->contents + 4);
17419               put_arm_insn (htab, output_bfd, plt0_entry[2],
17420                             splt->contents + 8);
17421               put_arm_insn (htab, output_bfd, plt0_entry[3],
17422                             splt->contents + 12);
17423
17424 #ifdef FOUR_WORD_PLT
17425               /* The displacement value goes in the otherwise-unused
17426                  last word of the second entry.  */
17427               bfd_put_32 (output_bfd, got_displacement, splt->contents + 28);
17428 #else
17429               bfd_put_32 (output_bfd, got_displacement, splt->contents + 16);
17430 #endif
17431             }
17432         }
17433
17434       /* UnixWare sets the entsize of .plt to 4, although that doesn't
17435          really seem like the right value.  */
17436       if (splt->output_section->owner == output_bfd)
17437         elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
17438
17439       if (htab->dt_tlsdesc_plt)
17440         {
17441           bfd_vma got_address
17442             = sgot->output_section->vma + sgot->output_offset;
17443           bfd_vma gotplt_address = (htab->root.sgot->output_section->vma
17444                                     + htab->root.sgot->output_offset);
17445           bfd_vma plt_address
17446             = splt->output_section->vma + splt->output_offset;
17447
17448           arm_put_trampoline (htab, output_bfd,
17449                               splt->contents + htab->dt_tlsdesc_plt,
17450                               dl_tlsdesc_lazy_trampoline, 6);
17451
17452           bfd_put_32 (output_bfd,
17453                       gotplt_address + htab->dt_tlsdesc_got
17454                       - (plt_address + htab->dt_tlsdesc_plt)
17455                       - dl_tlsdesc_lazy_trampoline[6],
17456                       splt->contents + htab->dt_tlsdesc_plt + 24);
17457           bfd_put_32 (output_bfd,
17458                       got_address - (plt_address + htab->dt_tlsdesc_plt)
17459                       - dl_tlsdesc_lazy_trampoline[7],
17460                       splt->contents + htab->dt_tlsdesc_plt + 24 + 4);
17461         }
17462
17463       if (htab->tls_trampoline)
17464         {
17465           arm_put_trampoline (htab, output_bfd,
17466                               splt->contents + htab->tls_trampoline,
17467                               tls_trampoline, 3);
17468 #ifdef FOUR_WORD_PLT
17469           bfd_put_32 (output_bfd, 0x00000000,
17470                       splt->contents + htab->tls_trampoline + 12);
17471 #endif
17472         }
17473
17474       if (htab->vxworks_p
17475           && !bfd_link_pic (info)
17476           && htab->root.splt->size > 0)
17477         {
17478           /* Correct the .rel(a).plt.unloaded relocations.  They will have
17479              incorrect symbol indexes.  */
17480           int num_plts;
17481           unsigned char *p;
17482
17483           num_plts = ((htab->root.splt->size - htab->plt_header_size)
17484                       / htab->plt_entry_size);
17485           p = htab->srelplt2->contents + RELOC_SIZE (htab);
17486
17487           for (; num_plts; num_plts--)
17488             {
17489               Elf_Internal_Rela rel;
17490
17491               SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
17492               rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
17493               SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
17494               p += RELOC_SIZE (htab);
17495
17496               SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
17497               rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
17498               SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
17499               p += RELOC_SIZE (htab);
17500             }
17501         }
17502     }
17503
17504   if (htab->nacl_p && htab->root.iplt != NULL && htab->root.iplt->size > 0)
17505     /* NaCl uses a special first entry in .iplt too.  */
17506     arm_nacl_put_plt0 (htab, output_bfd, htab->root.iplt, 0);
17507
17508   /* Fill in the first three entries in the global offset table.  */
17509   if (sgot)
17510     {
17511       if (sgot->size > 0)
17512         {
17513           if (sdyn == NULL)
17514             bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
17515           else
17516             bfd_put_32 (output_bfd,
17517                         sdyn->output_section->vma + sdyn->output_offset,
17518                         sgot->contents);
17519           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
17520           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
17521         }
17522
17523       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
17524     }
17525
17526   /* At the very end of the .rofixup section is a pointer to the GOT.  */
17527   if (htab->fdpic_p && htab->srofixup != NULL)
17528     {
17529       struct elf_link_hash_entry *hgot = htab->root.hgot;
17530
17531       bfd_vma got_value = hgot->root.u.def.value
17532         + hgot->root.u.def.section->output_section->vma
17533         + hgot->root.u.def.section->output_offset;
17534
17535       arm_elf_add_rofixup(output_bfd, htab->srofixup, got_value);
17536
17537       /* Make sure we allocated and generated the same number of fixups.  */
17538       BFD_ASSERT (htab->srofixup->reloc_count * 4 == htab->srofixup->size);
17539     }
17540
17541   return TRUE;
17542 }
17543
17544 static void
17545 elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
17546 {
17547   Elf_Internal_Ehdr * i_ehdrp;  /* ELF file header, internal form.  */
17548   struct elf32_arm_link_hash_table *globals;
17549   struct elf_segment_map *m;
17550
17551   i_ehdrp = elf_elfheader (abfd);
17552
17553   if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
17554     i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
17555   else
17556     _bfd_elf_post_process_headers (abfd, link_info);
17557   i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
17558
17559   if (link_info)
17560     {
17561       globals = elf32_arm_hash_table (link_info);
17562       if (globals != NULL && globals->byteswap_code)
17563         i_ehdrp->e_flags |= EF_ARM_BE8;
17564
17565       if (globals->fdpic_p)
17566         i_ehdrp->e_ident[EI_OSABI] |= ELFOSABI_ARM_FDPIC;
17567     }
17568
17569   if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_VER5
17570       && ((i_ehdrp->e_type == ET_DYN) || (i_ehdrp->e_type == ET_EXEC)))
17571     {
17572       int abi = bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_PROC, Tag_ABI_VFP_args);
17573       if (abi == AEABI_VFP_args_vfp)
17574         i_ehdrp->e_flags |= EF_ARM_ABI_FLOAT_HARD;
17575       else
17576         i_ehdrp->e_flags |= EF_ARM_ABI_FLOAT_SOFT;
17577     }
17578
17579   /* Scan segment to set p_flags attribute if it contains only sections with
17580      SHF_ARM_PURECODE flag.  */
17581   for (m = elf_seg_map (abfd); m != NULL; m = m->next)
17582     {
17583       unsigned int j;
17584
17585       if (m->count == 0)
17586         continue;
17587       for (j = 0; j < m->count; j++)
17588         {
17589           if (!(elf_section_flags (m->sections[j]) & SHF_ARM_PURECODE))
17590             break;
17591         }
17592       if (j == m->count)
17593         {
17594           m->p_flags = PF_X;
17595           m->p_flags_valid = 1;
17596         }
17597     }
17598 }
17599
17600 static enum elf_reloc_type_class
17601 elf32_arm_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
17602                             const asection *rel_sec ATTRIBUTE_UNUSED,
17603                             const Elf_Internal_Rela *rela)
17604 {
17605   switch ((int) ELF32_R_TYPE (rela->r_info))
17606     {
17607     case R_ARM_RELATIVE:
17608       return reloc_class_relative;
17609     case R_ARM_JUMP_SLOT:
17610       return reloc_class_plt;
17611     case R_ARM_COPY:
17612       return reloc_class_copy;
17613     case R_ARM_IRELATIVE:
17614       return reloc_class_ifunc;
17615     default:
17616       return reloc_class_normal;
17617     }
17618 }
17619
17620 static void
17621 elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
17622 {
17623   bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
17624 }
17625
17626 /* Return TRUE if this is an unwinding table entry.  */
17627
17628 static bfd_boolean
17629 is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
17630 {
17631   return (CONST_STRNEQ (name, ELF_STRING_ARM_unwind)
17632           || CONST_STRNEQ (name, ELF_STRING_ARM_unwind_once));
17633 }
17634
17635
17636 /* Set the type and flags for an ARM section.  We do this by
17637    the section name, which is a hack, but ought to work.  */
17638
17639 static bfd_boolean
17640 elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
17641 {
17642   const char * name;
17643
17644   name = bfd_get_section_name (abfd, sec);
17645
17646   if (is_arm_elf_unwind_section_name (abfd, name))
17647     {
17648       hdr->sh_type = SHT_ARM_EXIDX;
17649       hdr->sh_flags |= SHF_LINK_ORDER;
17650     }
17651
17652   if (sec->flags & SEC_ELF_PURECODE)
17653     hdr->sh_flags |= SHF_ARM_PURECODE;
17654
17655   return TRUE;
17656 }
17657
17658 /* Handle an ARM specific section when reading an object file.  This is
17659    called when bfd_section_from_shdr finds a section with an unknown
17660    type.  */
17661
17662 static bfd_boolean
17663 elf32_arm_section_from_shdr (bfd *abfd,
17664                              Elf_Internal_Shdr * hdr,
17665                              const char *name,
17666                              int shindex)
17667 {
17668   /* There ought to be a place to keep ELF backend specific flags, but
17669      at the moment there isn't one.  We just keep track of the
17670      sections by their name, instead.  Fortunately, the ABI gives
17671      names for all the ARM specific sections, so we will probably get
17672      away with this.  */
17673   switch (hdr->sh_type)
17674     {
17675     case SHT_ARM_EXIDX:
17676     case SHT_ARM_PREEMPTMAP:
17677     case SHT_ARM_ATTRIBUTES:
17678       break;
17679
17680     default:
17681       return FALSE;
17682     }
17683
17684   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
17685     return FALSE;
17686
17687   return TRUE;
17688 }
17689
17690 static _arm_elf_section_data *
17691 get_arm_elf_section_data (asection * sec)
17692 {
17693   if (sec && sec->owner && is_arm_elf (sec->owner))
17694     return elf32_arm_section_data (sec);
17695   else
17696     return NULL;
17697 }
17698
17699 typedef struct
17700 {
17701   void *flaginfo;
17702   struct bfd_link_info *info;
17703   asection *sec;
17704   int sec_shndx;
17705   int (*func) (void *, const char *, Elf_Internal_Sym *,
17706                asection *, struct elf_link_hash_entry *);
17707 } output_arch_syminfo;
17708
17709 enum map_symbol_type
17710 {
17711   ARM_MAP_ARM,
17712   ARM_MAP_THUMB,
17713   ARM_MAP_DATA
17714 };
17715
17716
17717 /* Output a single mapping symbol.  */
17718
17719 static bfd_boolean
17720 elf32_arm_output_map_sym (output_arch_syminfo *osi,
17721                           enum map_symbol_type type,
17722                           bfd_vma offset)
17723 {
17724   static const char *names[3] = {"$a", "$t", "$d"};
17725   Elf_Internal_Sym sym;
17726
17727   sym.st_value = osi->sec->output_section->vma
17728                  + osi->sec->output_offset
17729                  + offset;
17730   sym.st_size = 0;
17731   sym.st_other = 0;
17732   sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
17733   sym.st_shndx = osi->sec_shndx;
17734   sym.st_target_internal = 0;
17735   elf32_arm_section_map_add (osi->sec, names[type][1], offset);
17736   return osi->func (osi->flaginfo, names[type], &sym, osi->sec, NULL) == 1;
17737 }
17738
17739 /* Output mapping symbols for the PLT entry described by ROOT_PLT and ARM_PLT.
17740    IS_IPLT_ENTRY_P says whether the PLT is in .iplt rather than .plt.  */
17741
17742 static bfd_boolean
17743 elf32_arm_output_plt_map_1 (output_arch_syminfo *osi,
17744                             bfd_boolean is_iplt_entry_p,
17745                             union gotplt_union *root_plt,
17746                             struct arm_plt_info *arm_plt)
17747 {
17748   struct elf32_arm_link_hash_table *htab;
17749   bfd_vma addr, plt_header_size;
17750
17751   if (root_plt->offset == (bfd_vma) -1)
17752     return TRUE;
17753
17754   htab = elf32_arm_hash_table (osi->info);
17755   if (htab == NULL)
17756     return FALSE;
17757
17758   if (is_iplt_entry_p)
17759     {
17760       osi->sec = htab->root.iplt;
17761       plt_header_size = 0;
17762     }
17763   else
17764     {
17765       osi->sec = htab->root.splt;
17766       plt_header_size = htab->plt_header_size;
17767     }
17768   osi->sec_shndx = (_bfd_elf_section_from_bfd_section
17769                     (osi->info->output_bfd, osi->sec->output_section));
17770
17771   addr = root_plt->offset & -2;
17772   if (htab->symbian_p)
17773     {
17774       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
17775         return FALSE;
17776       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 4))
17777         return FALSE;
17778     }
17779   else if (htab->vxworks_p)
17780     {
17781       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
17782         return FALSE;
17783       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
17784         return FALSE;
17785       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 12))
17786         return FALSE;
17787       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 20))
17788         return FALSE;
17789     }
17790   else if (htab->nacl_p)
17791     {
17792       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
17793         return FALSE;
17794     }
17795   else if (htab->fdpic_p)
17796     {
17797       enum map_symbol_type type = using_thumb_only(htab)
17798         ? ARM_MAP_THUMB
17799         : ARM_MAP_ARM;
17800
17801       if (elf32_arm_plt_needs_thumb_stub_p (osi->info, arm_plt))
17802         if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr - 4))
17803           return FALSE;
17804       if (!elf32_arm_output_map_sym (osi, type, addr))
17805         return FALSE;
17806       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 16))
17807         return FALSE;
17808       if (htab->plt_entry_size == 4 * ARRAY_SIZE(elf32_arm_fdpic_plt_entry))
17809         if (!elf32_arm_output_map_sym (osi, type, addr + 24))
17810           return FALSE;
17811     }
17812   else if (using_thumb_only (htab))
17813     {
17814       if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr))
17815         return FALSE;
17816     }
17817   else
17818     {
17819       bfd_boolean thumb_stub_p;
17820
17821       thumb_stub_p = elf32_arm_plt_needs_thumb_stub_p (osi->info, arm_plt);
17822       if (thumb_stub_p)
17823         {
17824           if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr - 4))
17825             return FALSE;
17826         }
17827 #ifdef FOUR_WORD_PLT
17828       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
17829         return FALSE;
17830       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 12))
17831         return FALSE;
17832 #else
17833       /* A three-word PLT with no Thumb thunk contains only Arm code,
17834          so only need to output a mapping symbol for the first PLT entry and
17835          entries with thumb thunks.  */
17836       if (thumb_stub_p || addr == plt_header_size)
17837         {
17838           if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
17839             return FALSE;
17840         }
17841 #endif
17842     }
17843
17844   return TRUE;
17845 }
17846
17847 /* Output mapping symbols for PLT entries associated with H.  */
17848
17849 static bfd_boolean
17850 elf32_arm_output_plt_map (struct elf_link_hash_entry *h, void *inf)
17851 {
17852   output_arch_syminfo *osi = (output_arch_syminfo *) inf;
17853   struct elf32_arm_link_hash_entry *eh;
17854
17855   if (h->root.type == bfd_link_hash_indirect)
17856     return TRUE;
17857
17858   if (h->root.type == bfd_link_hash_warning)
17859     /* When warning symbols are created, they **replace** the "real"
17860        entry in the hash table, thus we never get to see the real
17861        symbol in a hash traversal.  So look at it now.  */
17862     h = (struct elf_link_hash_entry *) h->root.u.i.link;
17863
17864   eh = (struct elf32_arm_link_hash_entry *) h;
17865   return elf32_arm_output_plt_map_1 (osi, SYMBOL_CALLS_LOCAL (osi->info, h),
17866                                      &h->plt, &eh->plt);
17867 }
17868
17869 /* Bind a veneered symbol to its veneer identified by its hash entry
17870    STUB_ENTRY.  The veneered location thus loose its symbol.  */
17871
17872 static void
17873 arm_stub_claim_sym (struct elf32_arm_stub_hash_entry *stub_entry)
17874 {
17875   struct elf32_arm_link_hash_entry *hash = stub_entry->h;
17876
17877   BFD_ASSERT (hash);
17878   hash->root.root.u.def.section = stub_entry->stub_sec;
17879   hash->root.root.u.def.value = stub_entry->stub_offset;
17880   hash->root.size = stub_entry->stub_size;
17881 }
17882
17883 /* Output a single local symbol for a generated stub.  */
17884
17885 static bfd_boolean
17886 elf32_arm_output_stub_sym (output_arch_syminfo *osi, const char *name,
17887                            bfd_vma offset, bfd_vma size)
17888 {
17889   Elf_Internal_Sym sym;
17890
17891   sym.st_value = osi->sec->output_section->vma
17892                  + osi->sec->output_offset
17893                  + offset;
17894   sym.st_size = size;
17895   sym.st_other = 0;
17896   sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
17897   sym.st_shndx = osi->sec_shndx;
17898   sym.st_target_internal = 0;
17899   return osi->func (osi->flaginfo, name, &sym, osi->sec, NULL) == 1;
17900 }
17901
17902 static bfd_boolean
17903 arm_map_one_stub (struct bfd_hash_entry * gen_entry,
17904                   void * in_arg)
17905 {
17906   struct elf32_arm_stub_hash_entry *stub_entry;
17907   asection *stub_sec;
17908   bfd_vma addr;
17909   char *stub_name;
17910   output_arch_syminfo *osi;
17911   const insn_sequence *template_sequence;
17912   enum stub_insn_type prev_type;
17913   int size;
17914   int i;
17915   enum map_symbol_type sym_type;
17916
17917   /* Massage our args to the form they really have.  */
17918   stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
17919   osi = (output_arch_syminfo *) in_arg;
17920
17921   stub_sec = stub_entry->stub_sec;
17922
17923   /* Ensure this stub is attached to the current section being
17924      processed.  */
17925   if (stub_sec != osi->sec)
17926     return TRUE;
17927
17928   addr = (bfd_vma) stub_entry->stub_offset;
17929   template_sequence = stub_entry->stub_template;
17930
17931   if (arm_stub_sym_claimed (stub_entry->stub_type))
17932     arm_stub_claim_sym (stub_entry);
17933   else
17934     {
17935       stub_name = stub_entry->output_name;
17936       switch (template_sequence[0].type)
17937         {
17938         case ARM_TYPE:
17939           if (!elf32_arm_output_stub_sym (osi, stub_name, addr,
17940                                           stub_entry->stub_size))
17941             return FALSE;
17942           break;
17943         case THUMB16_TYPE:
17944         case THUMB32_TYPE:
17945           if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1,
17946                                           stub_entry->stub_size))
17947             return FALSE;
17948           break;
17949         default:
17950           BFD_FAIL ();
17951           return 0;
17952         }
17953     }
17954
17955   prev_type = DATA_TYPE;
17956   size = 0;
17957   for (i = 0; i < stub_entry->stub_template_size; i++)
17958     {
17959       switch (template_sequence[i].type)
17960         {
17961         case ARM_TYPE:
17962           sym_type = ARM_MAP_ARM;
17963           break;
17964
17965         case THUMB16_TYPE:
17966         case THUMB32_TYPE:
17967           sym_type = ARM_MAP_THUMB;
17968           break;
17969
17970         case DATA_TYPE:
17971           sym_type = ARM_MAP_DATA;
17972           break;
17973
17974         default:
17975           BFD_FAIL ();
17976           return FALSE;
17977         }
17978
17979       if (template_sequence[i].type != prev_type)
17980         {
17981           prev_type = template_sequence[i].type;
17982           if (!elf32_arm_output_map_sym (osi, sym_type, addr + size))
17983             return FALSE;
17984         }
17985
17986       switch (template_sequence[i].type)
17987         {
17988         case ARM_TYPE:
17989         case THUMB32_TYPE:
17990           size += 4;
17991           break;
17992
17993         case THUMB16_TYPE:
17994           size += 2;
17995           break;
17996
17997         case DATA_TYPE:
17998           size += 4;
17999           break;
18000
18001         default:
18002           BFD_FAIL ();
18003           return FALSE;
18004         }
18005     }
18006
18007   return TRUE;
18008 }
18009
18010 /* Output mapping symbols for linker generated sections,
18011    and for those data-only sections that do not have a
18012    $d.  */
18013
18014 static bfd_boolean
18015 elf32_arm_output_arch_local_syms (bfd *output_bfd,
18016                                   struct bfd_link_info *info,
18017                                   void *flaginfo,
18018                                   int (*func) (void *, const char *,
18019                                                Elf_Internal_Sym *,
18020                                                asection *,
18021                                                struct elf_link_hash_entry *))
18022 {
18023   output_arch_syminfo osi;
18024   struct elf32_arm_link_hash_table *htab;
18025   bfd_vma offset;
18026   bfd_size_type size;
18027   bfd *input_bfd;
18028
18029   htab = elf32_arm_hash_table (info);
18030   if (htab == NULL)
18031     return FALSE;
18032
18033   check_use_blx (htab);
18034
18035   osi.flaginfo = flaginfo;
18036   osi.info = info;
18037   osi.func = func;
18038
18039   /* Add a $d mapping symbol to data-only sections that
18040      don't have any mapping symbol.  This may result in (harmless) redundant
18041      mapping symbols.  */
18042   for (input_bfd = info->input_bfds;
18043        input_bfd != NULL;
18044        input_bfd = input_bfd->link.next)
18045     {
18046       if ((input_bfd->flags & (BFD_LINKER_CREATED | HAS_SYMS)) == HAS_SYMS)
18047         for (osi.sec = input_bfd->sections;
18048              osi.sec != NULL;
18049              osi.sec = osi.sec->next)
18050           {
18051             if (osi.sec->output_section != NULL
18052                 && ((osi.sec->output_section->flags & (SEC_ALLOC | SEC_CODE))
18053                     != 0)
18054                 && (osi.sec->flags & (SEC_HAS_CONTENTS | SEC_LINKER_CREATED))
18055                    == SEC_HAS_CONTENTS
18056                 && get_arm_elf_section_data (osi.sec) != NULL
18057                 && get_arm_elf_section_data (osi.sec)->mapcount == 0
18058                 && osi.sec->size > 0
18059                 && (osi.sec->flags & SEC_EXCLUDE) == 0)
18060               {
18061                 osi.sec_shndx = _bfd_elf_section_from_bfd_section
18062                   (output_bfd, osi.sec->output_section);
18063                 if (osi.sec_shndx != (int)SHN_BAD)
18064                   elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 0);
18065               }
18066           }
18067     }
18068
18069   /* ARM->Thumb glue.  */
18070   if (htab->arm_glue_size > 0)
18071     {
18072       osi.sec = bfd_get_linker_section (htab->bfd_of_glue_owner,
18073                                         ARM2THUMB_GLUE_SECTION_NAME);
18074
18075       osi.sec_shndx = _bfd_elf_section_from_bfd_section
18076           (output_bfd, osi.sec->output_section);
18077       if (bfd_link_pic (info) || htab->root.is_relocatable_executable
18078           || htab->pic_veneer)
18079         size = ARM2THUMB_PIC_GLUE_SIZE;
18080       else if (htab->use_blx)
18081         size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
18082       else
18083         size = ARM2THUMB_STATIC_GLUE_SIZE;
18084
18085       for (offset = 0; offset < htab->arm_glue_size; offset += size)
18086         {
18087           elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset);
18088           elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, offset + size - 4);
18089         }
18090     }
18091
18092   /* Thumb->ARM glue.  */
18093   if (htab->thumb_glue_size > 0)
18094     {
18095       osi.sec = bfd_get_linker_section (htab->bfd_of_glue_owner,
18096                                         THUMB2ARM_GLUE_SECTION_NAME);
18097
18098       osi.sec_shndx = _bfd_elf_section_from_bfd_section
18099           (output_bfd, osi.sec->output_section);
18100       size = THUMB2ARM_GLUE_SIZE;
18101
18102       for (offset = 0; offset < htab->thumb_glue_size; offset += size)
18103         {
18104           elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, offset);
18105           elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset + 4);
18106         }
18107     }
18108
18109   /* ARMv4 BX veneers.  */
18110   if (htab->bx_glue_size > 0)
18111     {
18112       osi.sec = bfd_get_linker_section (htab->bfd_of_glue_owner,
18113                                         ARM_BX_GLUE_SECTION_NAME);
18114
18115       osi.sec_shndx = _bfd_elf_section_from_bfd_section
18116           (output_bfd, osi.sec->output_section);
18117
18118       elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0);
18119     }
18120
18121   /* Long calls stubs.  */
18122   if (htab->stub_bfd && htab->stub_bfd->sections)
18123     {
18124       asection* stub_sec;
18125
18126       for (stub_sec = htab->stub_bfd->sections;
18127            stub_sec != NULL;
18128            stub_sec = stub_sec->next)
18129         {
18130           /* Ignore non-stub sections.  */
18131           if (!strstr (stub_sec->name, STUB_SUFFIX))
18132             continue;
18133
18134           osi.sec = stub_sec;
18135
18136           osi.sec_shndx = _bfd_elf_section_from_bfd_section
18137             (output_bfd, osi.sec->output_section);
18138
18139           bfd_hash_traverse (&htab->stub_hash_table, arm_map_one_stub, &osi);
18140         }
18141     }
18142
18143   /* Finally, output mapping symbols for the PLT.  */
18144   if (htab->root.splt && htab->root.splt->size > 0)
18145     {
18146       osi.sec = htab->root.splt;
18147       osi.sec_shndx = (_bfd_elf_section_from_bfd_section
18148                        (output_bfd, osi.sec->output_section));
18149
18150       /* Output mapping symbols for the plt header.  SymbianOS does not have a
18151          plt header.  */
18152       if (htab->vxworks_p)
18153         {
18154           /* VxWorks shared libraries have no PLT header.  */
18155           if (!bfd_link_pic (info))
18156             {
18157               if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
18158                 return FALSE;
18159               if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 12))
18160                 return FALSE;
18161             }
18162         }
18163       else if (htab->nacl_p)
18164         {
18165           if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
18166             return FALSE;
18167         }
18168       else if (using_thumb_only (htab) && !htab->fdpic_p)
18169         {
18170           if (!elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, 0))
18171             return FALSE;
18172           if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 12))
18173             return FALSE;
18174           if (!elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, 16))
18175             return FALSE;
18176         }
18177       else if (!htab->symbian_p && !htab->fdpic_p)
18178         {
18179           if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
18180             return FALSE;
18181 #ifndef FOUR_WORD_PLT
18182           if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 16))
18183             return FALSE;
18184 #endif
18185         }
18186     }
18187   if (htab->nacl_p && htab->root.iplt && htab->root.iplt->size > 0)
18188     {
18189       /* NaCl uses a special first entry in .iplt too.  */
18190       osi.sec = htab->root.iplt;
18191       osi.sec_shndx = (_bfd_elf_section_from_bfd_section
18192                        (output_bfd, osi.sec->output_section));
18193       if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
18194         return FALSE;
18195     }
18196   if ((htab->root.splt && htab->root.splt->size > 0)
18197       || (htab->root.iplt && htab->root.iplt->size > 0))
18198     {
18199       elf_link_hash_traverse (&htab->root, elf32_arm_output_plt_map, &osi);
18200       for (input_bfd = info->input_bfds;
18201            input_bfd != NULL;
18202            input_bfd = input_bfd->link.next)
18203         {
18204           struct arm_local_iplt_info **local_iplt;
18205           unsigned int i, num_syms;
18206
18207           local_iplt = elf32_arm_local_iplt (input_bfd);
18208           if (local_iplt != NULL)
18209             {
18210               num_syms = elf_symtab_hdr (input_bfd).sh_info;
18211               for (i = 0; i < num_syms; i++)
18212                 if (local_iplt[i] != NULL
18213                     && !elf32_arm_output_plt_map_1 (&osi, TRUE,
18214                                                     &local_iplt[i]->root,
18215                                                     &local_iplt[i]->arm))
18216                   return FALSE;
18217             }
18218         }
18219     }
18220   if (htab->dt_tlsdesc_plt != 0)
18221     {
18222       /* Mapping symbols for the lazy tls trampoline.  */
18223       if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, htab->dt_tlsdesc_plt))
18224         return FALSE;
18225
18226       if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA,
18227                                      htab->dt_tlsdesc_plt + 24))
18228         return FALSE;
18229     }
18230   if (htab->tls_trampoline != 0)
18231     {
18232       /* Mapping symbols for the tls trampoline.  */
18233       if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, htab->tls_trampoline))
18234         return FALSE;
18235 #ifdef FOUR_WORD_PLT
18236       if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA,
18237                                      htab->tls_trampoline + 12))
18238         return FALSE;
18239 #endif
18240     }
18241
18242   return TRUE;
18243 }
18244
18245 /* Filter normal symbols of CMSE entry functions of ABFD to include in
18246    the import library.  All SYMCOUNT symbols of ABFD can be examined
18247    from their pointers in SYMS.  Pointers of symbols to keep should be
18248    stored continuously at the beginning of that array.
18249
18250    Returns the number of symbols to keep.  */
18251
18252 static unsigned int
18253 elf32_arm_filter_cmse_symbols (bfd *abfd ATTRIBUTE_UNUSED,
18254                                struct bfd_link_info *info,
18255                                asymbol **syms, long symcount)
18256 {
18257   size_t maxnamelen;
18258   char *cmse_name;
18259   long src_count, dst_count = 0;
18260   struct elf32_arm_link_hash_table *htab;
18261
18262   htab = elf32_arm_hash_table (info);
18263   if (!htab->stub_bfd || !htab->stub_bfd->sections)
18264     symcount = 0;
18265
18266   maxnamelen = 128;
18267   cmse_name = (char *) bfd_malloc (maxnamelen);
18268   for (src_count = 0; src_count < symcount; src_count++)
18269     {
18270       struct elf32_arm_link_hash_entry *cmse_hash;
18271       asymbol *sym;
18272       flagword flags;
18273       char *name;
18274       size_t namelen;
18275
18276       sym = syms[src_count];
18277       flags = sym->flags;
18278       name = (char *) bfd_asymbol_name (sym);
18279
18280       if ((flags & BSF_FUNCTION) != BSF_FUNCTION)
18281         continue;
18282       if (!(flags & (BSF_GLOBAL | BSF_WEAK)))
18283         continue;
18284
18285       namelen = strlen (name) + sizeof (CMSE_PREFIX) + 1;
18286       if (namelen > maxnamelen)
18287         {
18288           cmse_name = (char *)
18289             bfd_realloc (cmse_name, namelen);
18290           maxnamelen = namelen;
18291         }
18292       snprintf (cmse_name, maxnamelen, "%s%s", CMSE_PREFIX, name);
18293       cmse_hash = (struct elf32_arm_link_hash_entry *)
18294         elf_link_hash_lookup (&(htab)->root, cmse_name, FALSE, FALSE, TRUE);
18295
18296       if (!cmse_hash
18297           || (cmse_hash->root.root.type != bfd_link_hash_defined
18298               && cmse_hash->root.root.type != bfd_link_hash_defweak)
18299           || cmse_hash->root.type != STT_FUNC)
18300         continue;
18301
18302       if (!ARM_GET_SYM_CMSE_SPCL (cmse_hash->root.target_internal))
18303         continue;
18304
18305       syms[dst_count++] = sym;
18306     }
18307   free (cmse_name);
18308
18309   syms[dst_count] = NULL;
18310
18311   return dst_count;
18312 }
18313
18314 /* Filter symbols of ABFD to include in the import library.  All
18315    SYMCOUNT symbols of ABFD can be examined from their pointers in
18316    SYMS.  Pointers of symbols to keep should be stored continuously at
18317    the beginning of that array.
18318
18319    Returns the number of symbols to keep.  */
18320
18321 static unsigned int
18322 elf32_arm_filter_implib_symbols (bfd *abfd ATTRIBUTE_UNUSED,
18323                                  struct bfd_link_info *info,
18324                                  asymbol **syms, long symcount)
18325 {
18326   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
18327
18328   /* Requirement 8 of "ARM v8-M Security Extensions: Requirements on
18329      Development Tools" (ARM-ECM-0359818) mandates Secure Gateway import
18330      library to be a relocatable object file.  */
18331   BFD_ASSERT (!(bfd_get_file_flags (info->out_implib_bfd) & EXEC_P));
18332   if (globals->cmse_implib)
18333     return elf32_arm_filter_cmse_symbols (abfd, info, syms, symcount);
18334   else
18335     return _bfd_elf_filter_global_symbols (abfd, info, syms, symcount);
18336 }
18337
18338 /* Allocate target specific section data.  */
18339
18340 static bfd_boolean
18341 elf32_arm_new_section_hook (bfd *abfd, asection *sec)
18342 {
18343   if (!sec->used_by_bfd)
18344     {
18345       _arm_elf_section_data *sdata;
18346       bfd_size_type amt = sizeof (*sdata);
18347
18348       sdata = (_arm_elf_section_data *) bfd_zalloc (abfd, amt);
18349       if (sdata == NULL)
18350         return FALSE;
18351       sec->used_by_bfd = sdata;
18352     }
18353
18354   return _bfd_elf_new_section_hook (abfd, sec);
18355 }
18356
18357
18358 /* Used to order a list of mapping symbols by address.  */
18359
18360 static int
18361 elf32_arm_compare_mapping (const void * a, const void * b)
18362 {
18363   const elf32_arm_section_map *amap = (const elf32_arm_section_map *) a;
18364   const elf32_arm_section_map *bmap = (const elf32_arm_section_map *) b;
18365
18366   if (amap->vma > bmap->vma)
18367     return 1;
18368   else if (amap->vma < bmap->vma)
18369     return -1;
18370   else if (amap->type > bmap->type)
18371     /* Ensure results do not depend on the host qsort for objects with
18372        multiple mapping symbols at the same address by sorting on type
18373        after vma.  */
18374     return 1;
18375   else if (amap->type < bmap->type)
18376     return -1;
18377   else
18378     return 0;
18379 }
18380
18381 /* Add OFFSET to lower 31 bits of ADDR, leaving other bits unmodified.  */
18382
18383 static unsigned long
18384 offset_prel31 (unsigned long addr, bfd_vma offset)
18385 {
18386   return (addr & ~0x7ffffffful) | ((addr + offset) & 0x7ffffffful);
18387 }
18388
18389 /* Copy an .ARM.exidx table entry, adding OFFSET to (applied) PREL31
18390    relocations.  */
18391
18392 static void
18393 copy_exidx_entry (bfd *output_bfd, bfd_byte *to, bfd_byte *from, bfd_vma offset)
18394 {
18395   unsigned long first_word = bfd_get_32 (output_bfd, from);
18396   unsigned long second_word = bfd_get_32 (output_bfd, from + 4);
18397
18398   /* High bit of first word is supposed to be zero.  */
18399   if ((first_word & 0x80000000ul) == 0)
18400     first_word = offset_prel31 (first_word, offset);
18401
18402   /* If the high bit of the first word is clear, and the bit pattern is not 0x1
18403      (EXIDX_CANTUNWIND), this is an offset to an .ARM.extab entry.  */
18404   if ((second_word != 0x1) && ((second_word & 0x80000000ul) == 0))
18405     second_word = offset_prel31 (second_word, offset);
18406
18407   bfd_put_32 (output_bfd, first_word, to);
18408   bfd_put_32 (output_bfd, second_word, to + 4);
18409 }
18410
18411 /* Data for make_branch_to_a8_stub().  */
18412
18413 struct a8_branch_to_stub_data
18414 {
18415   asection *writing_section;
18416   bfd_byte *contents;
18417 };
18418
18419
18420 /* Helper to insert branches to Cortex-A8 erratum stubs in the right
18421    places for a particular section.  */
18422
18423 static bfd_boolean
18424 make_branch_to_a8_stub (struct bfd_hash_entry *gen_entry,
18425                        void *in_arg)
18426 {
18427   struct elf32_arm_stub_hash_entry *stub_entry;
18428   struct a8_branch_to_stub_data *data;
18429   bfd_byte *contents;
18430   unsigned long branch_insn;
18431   bfd_vma veneered_insn_loc, veneer_entry_loc;
18432   bfd_signed_vma branch_offset;
18433   bfd *abfd;
18434   unsigned int loc;
18435
18436   stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
18437   data = (struct a8_branch_to_stub_data *) in_arg;
18438
18439   if (stub_entry->target_section != data->writing_section
18440       || stub_entry->stub_type < arm_stub_a8_veneer_lwm)
18441     return TRUE;
18442
18443   contents = data->contents;
18444
18445   /* We use target_section as Cortex-A8 erratum workaround stubs are only
18446      generated when both source and target are in the same section.  */
18447   veneered_insn_loc = stub_entry->target_section->output_section->vma
18448                       + stub_entry->target_section->output_offset
18449                       + stub_entry->source_value;
18450
18451   veneer_entry_loc = stub_entry->stub_sec->output_section->vma
18452                      + stub_entry->stub_sec->output_offset
18453                      + stub_entry->stub_offset;
18454
18455   if (stub_entry->stub_type == arm_stub_a8_veneer_blx)
18456     veneered_insn_loc &= ~3u;
18457
18458   branch_offset = veneer_entry_loc - veneered_insn_loc - 4;
18459
18460   abfd = stub_entry->target_section->owner;
18461   loc = stub_entry->source_value;
18462
18463   /* We attempt to avoid this condition by setting stubs_always_after_branch
18464      in elf32_arm_size_stubs if we've enabled the Cortex-A8 erratum workaround.
18465      This check is just to be on the safe side...  */
18466   if ((veneered_insn_loc & ~0xfff) == (veneer_entry_loc & ~0xfff))
18467     {
18468       _bfd_error_handler (_("%pB: error: Cortex-A8 erratum stub is "
18469                             "allocated in unsafe location"), abfd);
18470       return FALSE;
18471     }
18472
18473   switch (stub_entry->stub_type)
18474     {
18475     case arm_stub_a8_veneer_b:
18476     case arm_stub_a8_veneer_b_cond:
18477       branch_insn = 0xf0009000;
18478       goto jump24;
18479
18480     case arm_stub_a8_veneer_blx:
18481       branch_insn = 0xf000e800;
18482       goto jump24;
18483
18484     case arm_stub_a8_veneer_bl:
18485       {
18486         unsigned int i1, j1, i2, j2, s;
18487
18488         branch_insn = 0xf000d000;
18489
18490       jump24:
18491         if (branch_offset < -16777216 || branch_offset > 16777214)
18492           {
18493             /* There's not much we can do apart from complain if this
18494                happens.  */
18495             _bfd_error_handler (_("%pB: error: Cortex-A8 erratum stub out "
18496                                   "of range (input file too large)"), abfd);
18497             return FALSE;
18498           }
18499
18500         /* i1 = not(j1 eor s), so:
18501            not i1 = j1 eor s
18502            j1 = (not i1) eor s.  */
18503
18504         branch_insn |= (branch_offset >> 1) & 0x7ff;
18505         branch_insn |= ((branch_offset >> 12) & 0x3ff) << 16;
18506         i2 = (branch_offset >> 22) & 1;
18507         i1 = (branch_offset >> 23) & 1;
18508         s = (branch_offset >> 24) & 1;
18509         j1 = (!i1) ^ s;
18510         j2 = (!i2) ^ s;
18511         branch_insn |= j2 << 11;
18512         branch_insn |= j1 << 13;
18513         branch_insn |= s << 26;
18514       }
18515       break;
18516
18517     default:
18518       BFD_FAIL ();
18519       return FALSE;
18520     }
18521
18522   bfd_put_16 (abfd, (branch_insn >> 16) & 0xffff, &contents[loc]);
18523   bfd_put_16 (abfd, branch_insn & 0xffff, &contents[loc + 2]);
18524
18525   return TRUE;
18526 }
18527
18528 /* Beginning of stm32l4xx work-around.  */
18529
18530 /* Functions encoding instructions necessary for the emission of the
18531    fix-stm32l4xx-629360.
18532    Encoding is extracted from the
18533    ARM (C) Architecture Reference Manual
18534    ARMv7-A and ARMv7-R edition
18535    ARM DDI 0406C.b (ID072512).  */
18536
18537 static inline bfd_vma
18538 create_instruction_branch_absolute (int branch_offset)
18539 {
18540   /* A8.8.18 B (A8-334)
18541      B target_address (Encoding T4).  */
18542   /* 1111 - 0Sii - iiii - iiii - 10J1 - Jiii - iiii - iiii.  */
18543   /* jump offset is:  S:I1:I2:imm10:imm11:0.  */
18544   /* with : I1 = NOT (J1 EOR S) I2 = NOT (J2 EOR S).  */
18545
18546   int s = ((branch_offset & 0x1000000) >> 24);
18547   int j1 = s ^ !((branch_offset & 0x800000) >> 23);
18548   int j2 = s ^ !((branch_offset & 0x400000) >> 22);
18549
18550   if (branch_offset < -(1 << 24) || branch_offset >= (1 << 24))
18551     BFD_ASSERT (0 && "Error: branch out of range.  Cannot create branch.");
18552
18553   bfd_vma patched_inst = 0xf0009000
18554     | s << 26 /* S.  */
18555     | (((unsigned long) (branch_offset) >> 12) & 0x3ff) << 16 /* imm10.  */
18556     | j1 << 13 /* J1.  */
18557     | j2 << 11 /* J2.  */
18558     | (((unsigned long) (branch_offset) >> 1) & 0x7ff); /* imm11.  */
18559
18560   return patched_inst;
18561 }
18562
18563 static inline bfd_vma
18564 create_instruction_ldmia (int base_reg, int wback, int reg_mask)
18565 {
18566   /* A8.8.57 LDM/LDMIA/LDMFD (A8-396)
18567      LDMIA Rn!, {Ra, Rb, Rc, ...} (Encoding T2).  */
18568   bfd_vma patched_inst = 0xe8900000
18569     | (/*W=*/wback << 21)
18570     | (base_reg << 16)
18571     | (reg_mask & 0x0000ffff);
18572
18573   return patched_inst;
18574 }
18575
18576 static inline bfd_vma
18577 create_instruction_ldmdb (int base_reg, int wback, int reg_mask)
18578 {
18579   /* A8.8.60 LDMDB/LDMEA (A8-402)
18580      LDMDB Rn!, {Ra, Rb, Rc, ...} (Encoding T1).  */
18581   bfd_vma patched_inst = 0xe9100000
18582     | (/*W=*/wback << 21)
18583     | (base_reg << 16)
18584     | (reg_mask & 0x0000ffff);
18585
18586   return patched_inst;
18587 }
18588
18589 static inline bfd_vma
18590 create_instruction_mov (int target_reg, int source_reg)
18591 {
18592   /* A8.8.103 MOV (register) (A8-486)
18593      MOV Rd, Rm (Encoding T1).  */
18594   bfd_vma patched_inst = 0x4600
18595     | (target_reg & 0x7)
18596     | ((target_reg & 0x8) >> 3) << 7
18597     | (source_reg << 3);
18598
18599   return patched_inst;
18600 }
18601
18602 static inline bfd_vma
18603 create_instruction_sub (int target_reg, int source_reg, int value)
18604 {
18605   /* A8.8.221 SUB (immediate) (A8-708)
18606      SUB Rd, Rn, #value (Encoding T3).  */
18607   bfd_vma patched_inst = 0xf1a00000
18608     | (target_reg << 8)
18609     | (source_reg << 16)
18610     | (/*S=*/0 << 20)
18611     | ((value & 0x800) >> 11) << 26
18612     | ((value & 0x700) >>  8) << 12
18613     | (value & 0x0ff);
18614
18615   return patched_inst;
18616 }
18617
18618 static inline bfd_vma
18619 create_instruction_vldmia (int base_reg, int is_dp, int wback, int num_words,
18620                            int first_reg)
18621 {
18622   /* A8.8.332 VLDM (A8-922)
18623      VLMD{MODE} Rn{!}, {list} (Encoding T1 or T2).  */
18624   bfd_vma patched_inst = (is_dp ? 0xec900b00 : 0xec900a00)
18625     | (/*W=*/wback << 21)
18626     | (base_reg << 16)
18627     | (num_words & 0x000000ff)
18628     | (((unsigned)first_reg >> 1) & 0x0000000f) << 12
18629     | (first_reg & 0x00000001) << 22;
18630
18631   return patched_inst;
18632 }
18633
18634 static inline bfd_vma
18635 create_instruction_vldmdb (int base_reg, int is_dp, int num_words,
18636                            int first_reg)
18637 {
18638   /* A8.8.332 VLDM (A8-922)
18639      VLMD{MODE} Rn!, {} (Encoding T1 or T2).  */
18640   bfd_vma patched_inst = (is_dp ? 0xed300b00 : 0xed300a00)
18641     | (base_reg << 16)
18642     | (num_words & 0x000000ff)
18643     | (((unsigned)first_reg >>1 ) & 0x0000000f) << 12
18644     | (first_reg & 0x00000001) << 22;
18645
18646   return patched_inst;
18647 }
18648
18649 static inline bfd_vma
18650 create_instruction_udf_w (int value)
18651 {
18652   /* A8.8.247 UDF (A8-758)
18653      Undefined (Encoding T2).  */
18654   bfd_vma patched_inst = 0xf7f0a000
18655     | (value & 0x00000fff)
18656     | (value & 0x000f0000) << 16;
18657
18658   return patched_inst;
18659 }
18660
18661 static inline bfd_vma
18662 create_instruction_udf (int value)
18663 {
18664   /* A8.8.247 UDF (A8-758)
18665      Undefined (Encoding T1).  */
18666   bfd_vma patched_inst = 0xde00
18667     | (value & 0xff);
18668
18669   return patched_inst;
18670 }
18671
18672 /* Functions writing an instruction in memory, returning the next
18673    memory position to write to.  */
18674
18675 static inline bfd_byte *
18676 push_thumb2_insn32 (struct elf32_arm_link_hash_table * htab,
18677                     bfd * output_bfd, bfd_byte *pt, insn32 insn)
18678 {
18679   put_thumb2_insn (htab, output_bfd, insn, pt);
18680   return pt + 4;
18681 }
18682
18683 static inline bfd_byte *
18684 push_thumb2_insn16 (struct elf32_arm_link_hash_table * htab,
18685                     bfd * output_bfd, bfd_byte *pt, insn32 insn)
18686 {
18687   put_thumb_insn (htab, output_bfd, insn, pt);
18688   return pt + 2;
18689 }
18690
18691 /* Function filling up a region in memory with T1 and T2 UDFs taking
18692    care of alignment.  */
18693
18694 static bfd_byte *
18695 stm32l4xx_fill_stub_udf (struct elf32_arm_link_hash_table * htab,
18696                          bfd *                   output_bfd,
18697                          const bfd_byte * const  base_stub_contents,
18698                          bfd_byte * const        from_stub_contents,
18699                          const bfd_byte * const  end_stub_contents)
18700 {
18701   bfd_byte *current_stub_contents = from_stub_contents;
18702
18703   /* Fill the remaining of the stub with deterministic contents : UDF
18704      instructions.
18705      Check if realignment is needed on modulo 4 frontier using T1, to
18706      further use T2.  */
18707   if ((current_stub_contents < end_stub_contents)
18708       && !((current_stub_contents - base_stub_contents) % 2)
18709       && ((current_stub_contents - base_stub_contents) % 4))
18710     current_stub_contents =
18711       push_thumb2_insn16 (htab, output_bfd, current_stub_contents,
18712                           create_instruction_udf (0));
18713
18714   for (; current_stub_contents < end_stub_contents;)
18715     current_stub_contents =
18716       push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18717                           create_instruction_udf_w (0));
18718
18719   return current_stub_contents;
18720 }
18721
18722 /* Functions writing the stream of instructions equivalent to the
18723    derived sequence for ldmia, ldmdb, vldm respectively.  */
18724
18725 static void
18726 stm32l4xx_create_replacing_stub_ldmia (struct elf32_arm_link_hash_table * htab,
18727                                        bfd * output_bfd,
18728                                        const insn32 initial_insn,
18729                                        const bfd_byte *const initial_insn_addr,
18730                                        bfd_byte *const base_stub_contents)
18731 {
18732   int wback = (initial_insn & 0x00200000) >> 21;
18733   int ri, rn = (initial_insn & 0x000F0000) >> 16;
18734   int insn_all_registers = initial_insn & 0x0000ffff;
18735   int insn_low_registers, insn_high_registers;
18736   int usable_register_mask;
18737   int nb_registers = elf32_arm_popcount (insn_all_registers);
18738   int restore_pc = (insn_all_registers & (1 << 15)) ? 1 : 0;
18739   int restore_rn = (insn_all_registers & (1 << rn)) ? 1 : 0;
18740   bfd_byte *current_stub_contents = base_stub_contents;
18741
18742   BFD_ASSERT (is_thumb2_ldmia (initial_insn));
18743
18744   /* In BFD_ARM_STM32L4XX_FIX_ALL mode we may have to deal with
18745      smaller than 8 registers load sequences that do not cause the
18746      hardware issue.  */
18747   if (nb_registers <= 8)
18748     {
18749       /* UNTOUCHED : LDMIA Rn{!}, {R-all-register-list}.  */
18750       current_stub_contents =
18751         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18752                             initial_insn);
18753
18754       /* B initial_insn_addr+4.  */
18755       if (!restore_pc)
18756         current_stub_contents =
18757           push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18758                               create_instruction_branch_absolute
18759                               (initial_insn_addr - current_stub_contents));
18760
18761       /* Fill the remaining of the stub with deterministic contents.  */
18762       current_stub_contents =
18763         stm32l4xx_fill_stub_udf (htab, output_bfd,
18764                                  base_stub_contents, current_stub_contents,
18765                                  base_stub_contents +
18766                                  STM32L4XX_ERRATUM_LDM_VENEER_SIZE);
18767
18768       return;
18769     }
18770
18771   /* - reg_list[13] == 0.  */
18772   BFD_ASSERT ((insn_all_registers & (1 << 13))==0);
18773
18774   /* - reg_list[14] & reg_list[15] != 1.  */
18775   BFD_ASSERT ((insn_all_registers & 0xC000) != 0xC000);
18776
18777   /* - if (wback==1) reg_list[rn] == 0.  */
18778   BFD_ASSERT (!wback || !restore_rn);
18779
18780   /* - nb_registers > 8.  */
18781   BFD_ASSERT (elf32_arm_popcount (insn_all_registers) > 8);
18782
18783   /* At this point, LDMxx initial insn loads between 9 and 14 registers.  */
18784
18785   /* In the following algorithm, we split this wide LDM using 2 LDM insns:
18786     - One with the 7 lowest registers (register mask 0x007F)
18787       This LDM will finally contain between 2 and 7 registers
18788     - One with the 7 highest registers (register mask 0xDF80)
18789       This ldm will finally contain between 2 and 7 registers.  */
18790   insn_low_registers = insn_all_registers & 0x007F;
18791   insn_high_registers = insn_all_registers & 0xDF80;
18792
18793   /* A spare register may be needed during this veneer to temporarily
18794      handle the base register.  This register will be restored with the
18795      last LDM operation.
18796      The usable register may be any general purpose register (that
18797      excludes PC, SP, LR : register mask is 0x1FFF).  */
18798   usable_register_mask = 0x1FFF;
18799
18800   /* Generate the stub function.  */
18801   if (wback)
18802     {
18803       /* LDMIA Rn!, {R-low-register-list} : (Encoding T2).  */
18804       current_stub_contents =
18805         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18806                             create_instruction_ldmia
18807                             (rn, /*wback=*/1, insn_low_registers));
18808
18809       /* LDMIA Rn!, {R-high-register-list} : (Encoding T2).  */
18810       current_stub_contents =
18811         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18812                             create_instruction_ldmia
18813                             (rn, /*wback=*/1, insn_high_registers));
18814       if (!restore_pc)
18815         {
18816           /* B initial_insn_addr+4.  */
18817           current_stub_contents =
18818             push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18819                                 create_instruction_branch_absolute
18820                                 (initial_insn_addr - current_stub_contents));
18821        }
18822     }
18823   else /* if (!wback).  */
18824     {
18825       ri = rn;
18826
18827       /* If Rn is not part of the high-register-list, move it there.  */
18828       if (!(insn_high_registers & (1 << rn)))
18829         {
18830           /* Choose a Ri in the high-register-list that will be restored.  */
18831           ri = ctz (insn_high_registers & usable_register_mask & ~(1 << rn));
18832
18833           /* MOV Ri, Rn.  */
18834           current_stub_contents =
18835             push_thumb2_insn16 (htab, output_bfd, current_stub_contents,
18836                                 create_instruction_mov (ri, rn));
18837         }
18838
18839       /* LDMIA Ri!, {R-low-register-list} : (Encoding T2).  */
18840       current_stub_contents =
18841         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18842                             create_instruction_ldmia
18843                             (ri, /*wback=*/1, insn_low_registers));
18844
18845       /* LDMIA Ri, {R-high-register-list} : (Encoding T2).  */
18846       current_stub_contents =
18847         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18848                             create_instruction_ldmia
18849                             (ri, /*wback=*/0, insn_high_registers));
18850
18851       if (!restore_pc)
18852         {
18853           /* B initial_insn_addr+4.  */
18854           current_stub_contents =
18855             push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18856                                 create_instruction_branch_absolute
18857                                 (initial_insn_addr - current_stub_contents));
18858         }
18859     }
18860
18861   /* Fill the remaining of the stub with deterministic contents.  */
18862   current_stub_contents =
18863     stm32l4xx_fill_stub_udf (htab, output_bfd,
18864                              base_stub_contents, current_stub_contents,
18865                              base_stub_contents +
18866                              STM32L4XX_ERRATUM_LDM_VENEER_SIZE);
18867 }
18868
18869 static void
18870 stm32l4xx_create_replacing_stub_ldmdb (struct elf32_arm_link_hash_table * htab,
18871                                        bfd * output_bfd,
18872                                        const insn32 initial_insn,
18873                                        const bfd_byte *const initial_insn_addr,
18874                                        bfd_byte *const base_stub_contents)
18875 {
18876   int wback = (initial_insn & 0x00200000) >> 21;
18877   int ri, rn = (initial_insn & 0x000f0000) >> 16;
18878   int insn_all_registers = initial_insn & 0x0000ffff;
18879   int insn_low_registers, insn_high_registers;
18880   int usable_register_mask;
18881   int restore_pc = (insn_all_registers & (1 << 15)) ? 1 : 0;
18882   int restore_rn = (insn_all_registers & (1 << rn)) ? 1 : 0;
18883   int nb_registers = elf32_arm_popcount (insn_all_registers);
18884   bfd_byte *current_stub_contents = base_stub_contents;
18885
18886   BFD_ASSERT (is_thumb2_ldmdb (initial_insn));
18887
18888   /* In BFD_ARM_STM32L4XX_FIX_ALL mode we may have to deal with
18889      smaller than 8 registers load sequences that do not cause the
18890      hardware issue.  */
18891   if (nb_registers <= 8)
18892     {
18893       /* UNTOUCHED : LDMIA Rn{!}, {R-all-register-list}.  */
18894       current_stub_contents =
18895         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18896                             initial_insn);
18897
18898       /* B initial_insn_addr+4.  */
18899       current_stub_contents =
18900         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18901                             create_instruction_branch_absolute
18902                             (initial_insn_addr - current_stub_contents));
18903
18904       /* Fill the remaining of the stub with deterministic contents.  */
18905       current_stub_contents =
18906         stm32l4xx_fill_stub_udf (htab, output_bfd,
18907                                  base_stub_contents, current_stub_contents,
18908                                  base_stub_contents +
18909                                  STM32L4XX_ERRATUM_LDM_VENEER_SIZE);
18910
18911       return;
18912     }
18913
18914   /* - reg_list[13] == 0.  */
18915   BFD_ASSERT ((insn_all_registers & (1 << 13)) == 0);
18916
18917   /* - reg_list[14] & reg_list[15] != 1.  */
18918   BFD_ASSERT ((insn_all_registers & 0xC000) != 0xC000);
18919
18920   /* - if (wback==1) reg_list[rn] == 0.  */
18921   BFD_ASSERT (!wback || !restore_rn);
18922
18923   /* - nb_registers > 8.  */
18924   BFD_ASSERT (elf32_arm_popcount (insn_all_registers) > 8);
18925
18926   /* At this point, LDMxx initial insn loads between 9 and 14 registers.  */
18927
18928   /* In the following algorithm, we split this wide LDM using 2 LDM insn:
18929     - One with the 7 lowest registers (register mask 0x007F)
18930       This LDM will finally contain between 2 and 7 registers
18931     - One with the 7 highest registers (register mask 0xDF80)
18932       This ldm will finally contain between 2 and 7 registers.  */
18933   insn_low_registers = insn_all_registers & 0x007F;
18934   insn_high_registers = insn_all_registers & 0xDF80;
18935
18936   /* A spare register may be needed during this veneer to temporarily
18937      handle the base register.  This register will be restored with
18938      the last LDM operation.
18939      The usable register may be any general purpose register (that excludes
18940      PC, SP, LR : register mask is 0x1FFF).  */
18941   usable_register_mask = 0x1FFF;
18942
18943   /* Generate the stub function.  */
18944   if (!wback && !restore_pc && !restore_rn)
18945     {
18946       /* Choose a Ri in the low-register-list that will be restored.  */
18947       ri = ctz (insn_low_registers & usable_register_mask & ~(1 << rn));
18948
18949       /* MOV Ri, Rn.  */
18950       current_stub_contents =
18951         push_thumb2_insn16 (htab, output_bfd, current_stub_contents,
18952                             create_instruction_mov (ri, rn));
18953
18954       /* LDMDB Ri!, {R-high-register-list}.  */
18955       current_stub_contents =
18956         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18957                             create_instruction_ldmdb
18958                             (ri, /*wback=*/1, insn_high_registers));
18959
18960       /* LDMDB Ri, {R-low-register-list}.  */
18961       current_stub_contents =
18962         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18963                             create_instruction_ldmdb
18964                             (ri, /*wback=*/0, insn_low_registers));
18965
18966       /* B initial_insn_addr+4.  */
18967       current_stub_contents =
18968         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18969                             create_instruction_branch_absolute
18970                             (initial_insn_addr - current_stub_contents));
18971     }
18972   else if (wback && !restore_pc && !restore_rn)
18973     {
18974       /* LDMDB Rn!, {R-high-register-list}.  */
18975       current_stub_contents =
18976         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18977                             create_instruction_ldmdb
18978                             (rn, /*wback=*/1, insn_high_registers));
18979
18980       /* LDMDB Rn!, {R-low-register-list}.  */
18981       current_stub_contents =
18982         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18983                             create_instruction_ldmdb
18984                             (rn, /*wback=*/1, insn_low_registers));
18985
18986       /* B initial_insn_addr+4.  */
18987       current_stub_contents =
18988         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
18989                             create_instruction_branch_absolute
18990                             (initial_insn_addr - current_stub_contents));
18991     }
18992   else if (!wback && restore_pc && !restore_rn)
18993     {
18994       /* Choose a Ri in the high-register-list that will be restored.  */
18995       ri = ctz (insn_high_registers & usable_register_mask & ~(1 << rn));
18996
18997       /* SUB Ri, Rn, #(4*nb_registers).  */
18998       current_stub_contents =
18999         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19000                             create_instruction_sub (ri, rn, (4 * nb_registers)));
19001
19002       /* LDMIA Ri!, {R-low-register-list}.  */
19003       current_stub_contents =
19004         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19005                             create_instruction_ldmia
19006                             (ri, /*wback=*/1, insn_low_registers));
19007
19008       /* LDMIA Ri, {R-high-register-list}.  */
19009       current_stub_contents =
19010         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19011                             create_instruction_ldmia
19012                             (ri, /*wback=*/0, insn_high_registers));
19013     }
19014   else if (wback && restore_pc && !restore_rn)
19015     {
19016       /* Choose a Ri in the high-register-list that will be restored.  */
19017       ri = ctz (insn_high_registers & usable_register_mask & ~(1 << rn));
19018
19019       /* SUB Rn, Rn, #(4*nb_registers)  */
19020       current_stub_contents =
19021         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19022                             create_instruction_sub (rn, rn, (4 * nb_registers)));
19023
19024       /* MOV Ri, Rn.  */
19025       current_stub_contents =
19026         push_thumb2_insn16 (htab, output_bfd, current_stub_contents,
19027                             create_instruction_mov (ri, rn));
19028
19029       /* LDMIA Ri!, {R-low-register-list}.  */
19030       current_stub_contents =
19031         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19032                             create_instruction_ldmia
19033                             (ri, /*wback=*/1, insn_low_registers));
19034
19035       /* LDMIA Ri, {R-high-register-list}.  */
19036       current_stub_contents =
19037         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19038                             create_instruction_ldmia
19039                             (ri, /*wback=*/0, insn_high_registers));
19040     }
19041   else if (!wback && !restore_pc && restore_rn)
19042     {
19043       ri = rn;
19044       if (!(insn_low_registers & (1 << rn)))
19045         {
19046           /* Choose a Ri in the low-register-list that will be restored.  */
19047           ri = ctz (insn_low_registers & usable_register_mask & ~(1 << rn));
19048
19049           /* MOV Ri, Rn.  */
19050           current_stub_contents =
19051             push_thumb2_insn16 (htab, output_bfd, current_stub_contents,
19052                                 create_instruction_mov (ri, rn));
19053         }
19054
19055       /* LDMDB Ri!, {R-high-register-list}.  */
19056       current_stub_contents =
19057         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19058                             create_instruction_ldmdb
19059                             (ri, /*wback=*/1, insn_high_registers));
19060
19061       /* LDMDB Ri, {R-low-register-list}.  */
19062       current_stub_contents =
19063         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19064                             create_instruction_ldmdb
19065                             (ri, /*wback=*/0, insn_low_registers));
19066
19067       /* B initial_insn_addr+4.  */
19068       current_stub_contents =
19069         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19070                             create_instruction_branch_absolute
19071                             (initial_insn_addr - current_stub_contents));
19072     }
19073   else if (!wback && restore_pc && restore_rn)
19074     {
19075       ri = rn;
19076       if (!(insn_high_registers & (1 << rn)))
19077         {
19078           /* Choose a Ri in the high-register-list that will be restored.  */
19079           ri = ctz (insn_high_registers & usable_register_mask & ~(1 << rn));
19080         }
19081
19082       /* SUB Ri, Rn, #(4*nb_registers).  */
19083       current_stub_contents =
19084         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19085                             create_instruction_sub (ri, rn, (4 * nb_registers)));
19086
19087       /* LDMIA Ri!, {R-low-register-list}.  */
19088       current_stub_contents =
19089         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19090                             create_instruction_ldmia
19091                             (ri, /*wback=*/1, insn_low_registers));
19092
19093       /* LDMIA Ri, {R-high-register-list}.  */
19094       current_stub_contents =
19095         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19096                             create_instruction_ldmia
19097                             (ri, /*wback=*/0, insn_high_registers));
19098     }
19099   else if (wback && restore_rn)
19100     {
19101       /* The assembler should not have accepted to encode this.  */
19102       BFD_ASSERT (0 && "Cannot patch an instruction that has an "
19103         "undefined behavior.\n");
19104     }
19105
19106   /* Fill the remaining of the stub with deterministic contents.  */
19107   current_stub_contents =
19108     stm32l4xx_fill_stub_udf (htab, output_bfd,
19109                              base_stub_contents, current_stub_contents,
19110                              base_stub_contents +
19111                              STM32L4XX_ERRATUM_LDM_VENEER_SIZE);
19112
19113 }
19114
19115 static void
19116 stm32l4xx_create_replacing_stub_vldm (struct elf32_arm_link_hash_table * htab,
19117                                       bfd * output_bfd,
19118                                       const insn32 initial_insn,
19119                                       const bfd_byte *const initial_insn_addr,
19120                                       bfd_byte *const base_stub_contents)
19121 {
19122   int num_words = ((unsigned int) initial_insn << 24) >> 24;
19123   bfd_byte *current_stub_contents = base_stub_contents;
19124
19125   BFD_ASSERT (is_thumb2_vldm (initial_insn));
19126
19127   /* In BFD_ARM_STM32L4XX_FIX_ALL mode we may have to deal with
19128      smaller than 8 words load sequences that do not cause the
19129      hardware issue.  */
19130   if (num_words <= 8)
19131     {
19132       /* Untouched instruction.  */
19133       current_stub_contents =
19134         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19135                             initial_insn);
19136
19137       /* B initial_insn_addr+4.  */
19138       current_stub_contents =
19139         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19140                             create_instruction_branch_absolute
19141                             (initial_insn_addr - current_stub_contents));
19142     }
19143   else
19144     {
19145       bfd_boolean is_dp = /* DP encoding.  */
19146         (initial_insn & 0xfe100f00) == 0xec100b00;
19147       bfd_boolean is_ia_nobang = /* (IA without !).  */
19148         (((initial_insn << 7) >> 28) & 0xd) == 0x4;
19149       bfd_boolean is_ia_bang = /* (IA with !) - includes VPOP.  */
19150         (((initial_insn << 7) >> 28) & 0xd) == 0x5;
19151       bfd_boolean is_db_bang = /* (DB with !).  */
19152         (((initial_insn << 7) >> 28) & 0xd) == 0x9;
19153       int base_reg = ((unsigned int) initial_insn << 12) >> 28;
19154       /* d = UInt (Vd:D);.  */
19155       int first_reg = ((((unsigned int) initial_insn << 16) >> 28) << 1)
19156         | (((unsigned int)initial_insn << 9) >> 31);
19157
19158       /* Compute the number of 8-words chunks needed to split.  */
19159       int chunks = (num_words % 8) ? (num_words / 8 + 1) : (num_words / 8);
19160       int chunk;
19161
19162       /* The test coverage has been done assuming the following
19163          hypothesis that exactly one of the previous is_ predicates is
19164          true.  */
19165       BFD_ASSERT (    (is_ia_nobang ^ is_ia_bang ^ is_db_bang)
19166                   && !(is_ia_nobang & is_ia_bang & is_db_bang));
19167
19168       /* We treat the cutting of the words in one pass for all
19169          cases, then we emit the adjustments:
19170
19171          vldm rx, {...}
19172          -> vldm rx!, {8_words_or_less} for each needed 8_word
19173          -> sub rx, rx, #size (list)
19174
19175          vldm rx!, {...}
19176          -> vldm rx!, {8_words_or_less} for each needed 8_word
19177          This also handles vpop instruction (when rx is sp)
19178
19179          vldmd rx!, {...}
19180          -> vldmb rx!, {8_words_or_less} for each needed 8_word.  */
19181       for (chunk = 0; chunk < chunks; ++chunk)
19182         {
19183           bfd_vma new_insn = 0;
19184
19185           if (is_ia_nobang || is_ia_bang)
19186             {
19187               new_insn = create_instruction_vldmia
19188                 (base_reg,
19189                  is_dp,
19190                  /*wback= .  */1,
19191                  chunks - (chunk + 1) ?
19192                  8 : num_words - chunk * 8,
19193                  first_reg + chunk * 8);
19194             }
19195           else if (is_db_bang)
19196             {
19197               new_insn = create_instruction_vldmdb
19198                 (base_reg,
19199                  is_dp,
19200                  chunks - (chunk + 1) ?
19201                  8 : num_words - chunk * 8,
19202                  first_reg + chunk * 8);
19203             }
19204
19205           if (new_insn)
19206             current_stub_contents =
19207               push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19208                                   new_insn);
19209         }
19210
19211       /* Only this case requires the base register compensation
19212          subtract.  */
19213       if (is_ia_nobang)
19214         {
19215           current_stub_contents =
19216             push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19217                                 create_instruction_sub
19218                                 (base_reg, base_reg, 4*num_words));
19219         }
19220
19221       /* B initial_insn_addr+4.  */
19222       current_stub_contents =
19223         push_thumb2_insn32 (htab, output_bfd, current_stub_contents,
19224                             create_instruction_branch_absolute
19225                             (initial_insn_addr - current_stub_contents));
19226     }
19227
19228   /* Fill the remaining of the stub with deterministic contents.  */
19229   current_stub_contents =
19230     stm32l4xx_fill_stub_udf (htab, output_bfd,
19231                              base_stub_contents, current_stub_contents,
19232                              base_stub_contents +
19233                              STM32L4XX_ERRATUM_VLDM_VENEER_SIZE);
19234 }
19235
19236 static void
19237 stm32l4xx_create_replacing_stub (struct elf32_arm_link_hash_table * htab,
19238                                  bfd * output_bfd,
19239                                  const insn32 wrong_insn,
19240                                  const bfd_byte *const wrong_insn_addr,
19241                                  bfd_byte *const stub_contents)
19242 {
19243   if (is_thumb2_ldmia (wrong_insn))
19244     stm32l4xx_create_replacing_stub_ldmia (htab, output_bfd,
19245                                            wrong_insn, wrong_insn_addr,
19246                                            stub_contents);
19247   else if (is_thumb2_ldmdb (wrong_insn))
19248     stm32l4xx_create_replacing_stub_ldmdb (htab, output_bfd,
19249                                            wrong_insn, wrong_insn_addr,
19250                                            stub_contents);
19251   else if (is_thumb2_vldm (wrong_insn))
19252     stm32l4xx_create_replacing_stub_vldm (htab, output_bfd,
19253                                           wrong_insn, wrong_insn_addr,
19254                                           stub_contents);
19255 }
19256
19257 /* End of stm32l4xx work-around.  */
19258
19259
19260 /* Do code byteswapping.  Return FALSE afterwards so that the section is
19261    written out as normal.  */
19262
19263 static bfd_boolean
19264 elf32_arm_write_section (bfd *output_bfd,
19265                          struct bfd_link_info *link_info,
19266                          asection *sec,
19267                          bfd_byte *contents)
19268 {
19269   unsigned int mapcount, errcount;
19270   _arm_elf_section_data *arm_data;
19271   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
19272   elf32_arm_section_map *map;
19273   elf32_vfp11_erratum_list *errnode;
19274   elf32_stm32l4xx_erratum_list *stm32l4xx_errnode;
19275   bfd_vma ptr;
19276   bfd_vma end;
19277   bfd_vma offset = sec->output_section->vma + sec->output_offset;
19278   bfd_byte tmp;
19279   unsigned int i;
19280
19281   if (globals == NULL)
19282     return FALSE;
19283
19284   /* If this section has not been allocated an _arm_elf_section_data
19285      structure then we cannot record anything.  */
19286   arm_data = get_arm_elf_section_data (sec);
19287   if (arm_data == NULL)
19288     return FALSE;
19289
19290   mapcount = arm_data->mapcount;
19291   map = arm_data->map;
19292   errcount = arm_data->erratumcount;
19293
19294   if (errcount != 0)
19295     {
19296       unsigned int endianflip = bfd_big_endian (output_bfd) ? 3 : 0;
19297
19298       for (errnode = arm_data->erratumlist; errnode != 0;
19299            errnode = errnode->next)
19300         {
19301           bfd_vma target = errnode->vma - offset;
19302
19303           switch (errnode->type)
19304             {
19305             case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
19306               {
19307                 bfd_vma branch_to_veneer;
19308                 /* Original condition code of instruction, plus bit mask for
19309                    ARM B instruction.  */
19310                 unsigned int insn = (errnode->u.b.vfp_insn & 0xf0000000)
19311                                   | 0x0a000000;
19312
19313                 /* The instruction is before the label.  */
19314                 target -= 4;
19315
19316                 /* Above offset included in -4 below.  */
19317                 branch_to_veneer = errnode->u.b.veneer->vma
19318                                    - errnode->vma - 4;
19319
19320                 if ((signed) branch_to_veneer < -(1 << 25)
19321                     || (signed) branch_to_veneer >= (1 << 25))
19322                   _bfd_error_handler (_("%pB: error: VFP11 veneer out of "
19323                                         "range"), output_bfd);
19324
19325                 insn |= (branch_to_veneer >> 2) & 0xffffff;
19326                 contents[endianflip ^ target] = insn & 0xff;
19327                 contents[endianflip ^ (target + 1)] = (insn >> 8) & 0xff;
19328                 contents[endianflip ^ (target + 2)] = (insn >> 16) & 0xff;
19329                 contents[endianflip ^ (target + 3)] = (insn >> 24) & 0xff;
19330               }
19331               break;
19332
19333             case VFP11_ERRATUM_ARM_VENEER:
19334               {
19335                 bfd_vma branch_from_veneer;
19336                 unsigned int insn;
19337
19338                 /* Take size of veneer into account.  */
19339                 branch_from_veneer = errnode->u.v.branch->vma
19340                                      - errnode->vma - 12;
19341
19342                 if ((signed) branch_from_veneer < -(1 << 25)
19343                     || (signed) branch_from_veneer >= (1 << 25))
19344                   _bfd_error_handler (_("%pB: error: VFP11 veneer out of "
19345                                         "range"), output_bfd);
19346
19347                 /* Original instruction.  */
19348                 insn = errnode->u.v.branch->u.b.vfp_insn;
19349                 contents[endianflip ^ target] = insn & 0xff;
19350                 contents[endianflip ^ (target + 1)] = (insn >> 8) & 0xff;
19351                 contents[endianflip ^ (target + 2)] = (insn >> 16) & 0xff;
19352                 contents[endianflip ^ (target + 3)] = (insn >> 24) & 0xff;
19353
19354                 /* Branch back to insn after original insn.  */
19355                 insn = 0xea000000 | ((branch_from_veneer >> 2) & 0xffffff);
19356                 contents[endianflip ^ (target + 4)] = insn & 0xff;
19357                 contents[endianflip ^ (target + 5)] = (insn >> 8) & 0xff;
19358                 contents[endianflip ^ (target + 6)] = (insn >> 16) & 0xff;
19359                 contents[endianflip ^ (target + 7)] = (insn >> 24) & 0xff;
19360               }
19361               break;
19362
19363             default:
19364               abort ();
19365             }
19366         }
19367     }
19368
19369   if (arm_data->stm32l4xx_erratumcount != 0)
19370     {
19371       for (stm32l4xx_errnode = arm_data->stm32l4xx_erratumlist;
19372            stm32l4xx_errnode != 0;
19373            stm32l4xx_errnode = stm32l4xx_errnode->next)
19374         {
19375           bfd_vma target = stm32l4xx_errnode->vma - offset;
19376
19377           switch (stm32l4xx_errnode->type)
19378             {
19379             case STM32L4XX_ERRATUM_BRANCH_TO_VENEER:
19380               {
19381                 unsigned int insn;
19382                 bfd_vma branch_to_veneer =
19383                   stm32l4xx_errnode->u.b.veneer->vma - stm32l4xx_errnode->vma;
19384
19385                 if ((signed) branch_to_veneer < -(1 << 24)
19386                     || (signed) branch_to_veneer >= (1 << 24))
19387                   {
19388                     bfd_vma out_of_range =
19389                       ((signed) branch_to_veneer < -(1 << 24)) ?
19390                       - branch_to_veneer - (1 << 24) :
19391                       ((signed) branch_to_veneer >= (1 << 24)) ?
19392                       branch_to_veneer - (1 << 24) : 0;
19393
19394                     _bfd_error_handler
19395                       (_("%pB(%#" PRIx64 "): error: "
19396                          "cannot create STM32L4XX veneer; "
19397                          "jump out of range by %" PRId64 " bytes; "
19398                          "cannot encode branch instruction"),
19399                        output_bfd,
19400                        (uint64_t) (stm32l4xx_errnode->vma - 4),
19401                        (int64_t) out_of_range);
19402                     continue;
19403                   }
19404
19405                 insn = create_instruction_branch_absolute
19406                   (stm32l4xx_errnode->u.b.veneer->vma - stm32l4xx_errnode->vma);
19407
19408                 /* The instruction is before the label.  */
19409                 target -= 4;
19410
19411                 put_thumb2_insn (globals, output_bfd,
19412                                  (bfd_vma) insn, contents + target);
19413               }
19414               break;
19415
19416             case STM32L4XX_ERRATUM_VENEER:
19417               {
19418                 bfd_byte * veneer;
19419                 bfd_byte * veneer_r;
19420                 unsigned int insn;
19421
19422                 veneer = contents + target;
19423                 veneer_r = veneer
19424                   + stm32l4xx_errnode->u.b.veneer->vma
19425                   - stm32l4xx_errnode->vma - 4;
19426
19427                 if ((signed) (veneer_r - veneer -
19428                               STM32L4XX_ERRATUM_VLDM_VENEER_SIZE >
19429                               STM32L4XX_ERRATUM_LDM_VENEER_SIZE ?
19430                               STM32L4XX_ERRATUM_VLDM_VENEER_SIZE :
19431                               STM32L4XX_ERRATUM_LDM_VENEER_SIZE) < -(1 << 24)
19432                     || (signed) (veneer_r - veneer) >= (1 << 24))
19433                   {
19434                     _bfd_error_handler (_("%pB: error: cannot create STM32L4XX "
19435                                           "veneer"), output_bfd);
19436                      continue;
19437                   }
19438
19439                 /* Original instruction.  */
19440                 insn = stm32l4xx_errnode->u.v.branch->u.b.insn;
19441
19442                 stm32l4xx_create_replacing_stub
19443                   (globals, output_bfd, insn, (void*)veneer_r, (void*)veneer);
19444               }
19445               break;
19446
19447             default:
19448               abort ();
19449             }
19450         }
19451     }
19452
19453   if (arm_data->elf.this_hdr.sh_type == SHT_ARM_EXIDX)
19454     {
19455       arm_unwind_table_edit *edit_node
19456         = arm_data->u.exidx.unwind_edit_list;
19457       /* Now, sec->size is the size of the section we will write.  The original
19458          size (before we merged duplicate entries and inserted EXIDX_CANTUNWIND
19459          markers) was sec->rawsize.  (This isn't the case if we perform no
19460          edits, then rawsize will be zero and we should use size).  */
19461       bfd_byte *edited_contents = (bfd_byte *) bfd_malloc (sec->size);
19462       unsigned int input_size = sec->rawsize ? sec->rawsize : sec->size;
19463       unsigned int in_index, out_index;
19464       bfd_vma add_to_offsets = 0;
19465
19466       for (in_index = 0, out_index = 0; in_index * 8 < input_size || edit_node;)
19467         {
19468           if (edit_node)
19469             {
19470               unsigned int edit_index = edit_node->index;
19471
19472               if (in_index < edit_index && in_index * 8 < input_size)
19473                 {
19474                   copy_exidx_entry (output_bfd, edited_contents + out_index * 8,
19475                                     contents + in_index * 8, add_to_offsets);
19476                   out_index++;
19477                   in_index++;
19478                 }
19479               else if (in_index == edit_index
19480                        || (in_index * 8 >= input_size
19481                            && edit_index == UINT_MAX))
19482                 {
19483                   switch (edit_node->type)
19484                     {
19485                     case DELETE_EXIDX_ENTRY:
19486                       in_index++;
19487                       add_to_offsets += 8;
19488                       break;
19489
19490                     case INSERT_EXIDX_CANTUNWIND_AT_END:
19491                       {
19492                         asection *text_sec = edit_node->linked_section;
19493                         bfd_vma text_offset = text_sec->output_section->vma
19494                                               + text_sec->output_offset
19495                                               + text_sec->size;
19496                         bfd_vma exidx_offset = offset + out_index * 8;
19497                         unsigned long prel31_offset;
19498
19499                         /* Note: this is meant to be equivalent to an
19500                            R_ARM_PREL31 relocation.  These synthetic
19501                            EXIDX_CANTUNWIND markers are not relocated by the
19502                            usual BFD method.  */
19503                         prel31_offset = (text_offset - exidx_offset)
19504                                         & 0x7ffffffful;
19505                         if (bfd_link_relocatable (link_info))
19506                           {
19507                             /* Here relocation for new EXIDX_CANTUNWIND is
19508                                created, so there is no need to
19509                                adjust offset by hand.  */
19510                             prel31_offset = text_sec->output_offset
19511                                             + text_sec->size;
19512                           }
19513
19514                         /* First address we can't unwind.  */
19515                         bfd_put_32 (output_bfd, prel31_offset,
19516                                     &edited_contents[out_index * 8]);
19517
19518                         /* Code for EXIDX_CANTUNWIND.  */
19519                         bfd_put_32 (output_bfd, 0x1,
19520                                     &edited_contents[out_index * 8 + 4]);
19521
19522                         out_index++;
19523                         add_to_offsets -= 8;
19524                       }
19525                       break;
19526                     }
19527
19528                   edit_node = edit_node->next;
19529                 }
19530             }
19531           else
19532             {
19533               /* No more edits, copy remaining entries verbatim.  */
19534               copy_exidx_entry (output_bfd, edited_contents + out_index * 8,
19535                                 contents + in_index * 8, add_to_offsets);
19536               out_index++;
19537               in_index++;
19538             }
19539         }
19540
19541       if (!(sec->flags & SEC_EXCLUDE) && !(sec->flags & SEC_NEVER_LOAD))
19542         bfd_set_section_contents (output_bfd, sec->output_section,
19543                                   edited_contents,
19544                                   (file_ptr) sec->output_offset, sec->size);
19545
19546       return TRUE;
19547     }
19548
19549   /* Fix code to point to Cortex-A8 erratum stubs.  */
19550   if (globals->fix_cortex_a8)
19551     {
19552       struct a8_branch_to_stub_data data;
19553
19554       data.writing_section = sec;
19555       data.contents = contents;
19556
19557       bfd_hash_traverse (& globals->stub_hash_table, make_branch_to_a8_stub,
19558                          & data);
19559     }
19560
19561   if (mapcount == 0)
19562     return FALSE;
19563
19564   if (globals->byteswap_code)
19565     {
19566       qsort (map, mapcount, sizeof (* map), elf32_arm_compare_mapping);
19567
19568       ptr = map[0].vma;
19569       for (i = 0; i < mapcount; i++)
19570         {
19571           if (i == mapcount - 1)
19572             end = sec->size;
19573           else
19574             end = map[i + 1].vma;
19575
19576           switch (map[i].type)
19577             {
19578             case 'a':
19579               /* Byte swap code words.  */
19580               while (ptr + 3 < end)
19581                 {
19582                   tmp = contents[ptr];
19583                   contents[ptr] = contents[ptr + 3];
19584                   contents[ptr + 3] = tmp;
19585                   tmp = contents[ptr + 1];
19586                   contents[ptr + 1] = contents[ptr + 2];
19587                   contents[ptr + 2] = tmp;
19588                   ptr += 4;
19589                 }
19590               break;
19591
19592             case 't':
19593               /* Byte swap code halfwords.  */
19594               while (ptr + 1 < end)
19595                 {
19596                   tmp = contents[ptr];
19597                   contents[ptr] = contents[ptr + 1];
19598                   contents[ptr + 1] = tmp;
19599                   ptr += 2;
19600                 }
19601               break;
19602
19603             case 'd':
19604               /* Leave data alone.  */
19605               break;
19606             }
19607           ptr = end;
19608         }
19609     }
19610
19611   free (map);
19612   arm_data->mapcount = -1;
19613   arm_data->mapsize = 0;
19614   arm_data->map = NULL;
19615
19616   return FALSE;
19617 }
19618
19619 /* Mangle thumb function symbols as we read them in.  */
19620
19621 static bfd_boolean
19622 elf32_arm_swap_symbol_in (bfd * abfd,
19623                           const void *psrc,
19624                           const void *pshn,
19625                           Elf_Internal_Sym *dst)
19626 {
19627   Elf_Internal_Shdr *symtab_hdr;
19628   const char *name = NULL;
19629
19630   if (!bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst))
19631     return FALSE;
19632   dst->st_target_internal = 0;
19633
19634   /* New EABI objects mark thumb function symbols by setting the low bit of
19635      the address.  */
19636   if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
19637       || ELF_ST_TYPE (dst->st_info) == STT_GNU_IFUNC)
19638     {
19639       if (dst->st_value & 1)
19640         {
19641           dst->st_value &= ~(bfd_vma) 1;
19642           ARM_SET_SYM_BRANCH_TYPE (dst->st_target_internal,
19643                                    ST_BRANCH_TO_THUMB);
19644         }
19645       else
19646         ARM_SET_SYM_BRANCH_TYPE (dst->st_target_internal, ST_BRANCH_TO_ARM);
19647     }
19648   else if (ELF_ST_TYPE (dst->st_info) == STT_ARM_TFUNC)
19649     {
19650       dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_FUNC);
19651       ARM_SET_SYM_BRANCH_TYPE (dst->st_target_internal, ST_BRANCH_TO_THUMB);
19652     }
19653   else if (ELF_ST_TYPE (dst->st_info) == STT_SECTION)
19654     ARM_SET_SYM_BRANCH_TYPE (dst->st_target_internal, ST_BRANCH_LONG);
19655   else
19656     ARM_SET_SYM_BRANCH_TYPE (dst->st_target_internal, ST_BRANCH_UNKNOWN);
19657
19658   /* Mark CMSE special symbols.  */
19659   symtab_hdr = & elf_symtab_hdr (abfd);
19660   if (symtab_hdr->sh_size)
19661     name = bfd_elf_sym_name (abfd, symtab_hdr, dst, NULL);
19662   if (name && CONST_STRNEQ (name, CMSE_PREFIX))
19663     ARM_SET_SYM_CMSE_SPCL (dst->st_target_internal);
19664
19665   return TRUE;
19666 }
19667
19668
19669 /* Mangle thumb function symbols as we write them out.  */
19670
19671 static void
19672 elf32_arm_swap_symbol_out (bfd *abfd,
19673                            const Elf_Internal_Sym *src,
19674                            void *cdst,
19675                            void *shndx)
19676 {
19677   Elf_Internal_Sym newsym;
19678
19679   /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
19680      of the address set, as per the new EABI.  We do this unconditionally
19681      because objcopy does not set the elf header flags until after
19682      it writes out the symbol table.  */
19683   if (ARM_GET_SYM_BRANCH_TYPE (src->st_target_internal) == ST_BRANCH_TO_THUMB)
19684     {
19685       newsym = *src;
19686       if (ELF_ST_TYPE (src->st_info) != STT_GNU_IFUNC)
19687         newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
19688       if (newsym.st_shndx != SHN_UNDEF)
19689         {
19690           /* Do this only for defined symbols. At link type, the static
19691              linker will simulate the work of dynamic linker of resolving
19692              symbols and will carry over the thumbness of found symbols to
19693              the output symbol table. It's not clear how it happens, but
19694              the thumbness of undefined symbols can well be different at
19695              runtime, and writing '1' for them will be confusing for users
19696              and possibly for dynamic linker itself.
19697           */
19698           newsym.st_value |= 1;
19699         }
19700
19701       src = &newsym;
19702     }
19703   bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
19704 }
19705
19706 /* Add the PT_ARM_EXIDX program header.  */
19707
19708 static bfd_boolean
19709 elf32_arm_modify_segment_map (bfd *abfd,
19710                               struct bfd_link_info *info ATTRIBUTE_UNUSED)
19711 {
19712   struct elf_segment_map *m;
19713   asection *sec;
19714
19715   sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
19716   if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
19717     {
19718       /* If there is already a PT_ARM_EXIDX header, then we do not
19719          want to add another one.  This situation arises when running
19720          "strip"; the input binary already has the header.  */
19721       m = elf_seg_map (abfd);
19722       while (m && m->p_type != PT_ARM_EXIDX)
19723         m = m->next;
19724       if (!m)
19725         {
19726           m = (struct elf_segment_map *)
19727               bfd_zalloc (abfd, sizeof (struct elf_segment_map));
19728           if (m == NULL)
19729             return FALSE;
19730           m->p_type = PT_ARM_EXIDX;
19731           m->count = 1;
19732           m->sections[0] = sec;
19733
19734           m->next = elf_seg_map (abfd);
19735           elf_seg_map (abfd) = m;
19736         }
19737     }
19738
19739   return TRUE;
19740 }
19741
19742 /* We may add a PT_ARM_EXIDX program header.  */
19743
19744 static int
19745 elf32_arm_additional_program_headers (bfd *abfd,
19746                                       struct bfd_link_info *info ATTRIBUTE_UNUSED)
19747 {
19748   asection *sec;
19749
19750   sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
19751   if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
19752     return 1;
19753   else
19754     return 0;
19755 }
19756
19757 /* Hook called by the linker routine which adds symbols from an object
19758    file.  */
19759
19760 static bfd_boolean
19761 elf32_arm_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
19762                            Elf_Internal_Sym *sym, const char **namep,
19763                            flagword *flagsp, asection **secp, bfd_vma *valp)
19764 {
19765   if (elf32_arm_hash_table (info) == NULL)
19766     return FALSE;
19767
19768   if (elf32_arm_hash_table (info)->vxworks_p
19769       && !elf_vxworks_add_symbol_hook (abfd, info, sym, namep,
19770                                        flagsp, secp, valp))
19771     return FALSE;
19772
19773   return TRUE;
19774 }
19775
19776 /* We use this to override swap_symbol_in and swap_symbol_out.  */
19777 const struct elf_size_info elf32_arm_size_info =
19778 {
19779   sizeof (Elf32_External_Ehdr),
19780   sizeof (Elf32_External_Phdr),
19781   sizeof (Elf32_External_Shdr),
19782   sizeof (Elf32_External_Rel),
19783   sizeof (Elf32_External_Rela),
19784   sizeof (Elf32_External_Sym),
19785   sizeof (Elf32_External_Dyn),
19786   sizeof (Elf_External_Note),
19787   4,
19788   1,
19789   32, 2,
19790   ELFCLASS32, EV_CURRENT,
19791   bfd_elf32_write_out_phdrs,
19792   bfd_elf32_write_shdrs_and_ehdr,
19793   bfd_elf32_checksum_contents,
19794   bfd_elf32_write_relocs,
19795   elf32_arm_swap_symbol_in,
19796   elf32_arm_swap_symbol_out,
19797   bfd_elf32_slurp_reloc_table,
19798   bfd_elf32_slurp_symbol_table,
19799   bfd_elf32_swap_dyn_in,
19800   bfd_elf32_swap_dyn_out,
19801   bfd_elf32_swap_reloc_in,
19802   bfd_elf32_swap_reloc_out,
19803   bfd_elf32_swap_reloca_in,
19804   bfd_elf32_swap_reloca_out
19805 };
19806
19807 static bfd_vma
19808 read_code32 (const bfd *abfd, const bfd_byte *addr)
19809 {
19810   /* V7 BE8 code is always little endian.  */
19811   if ((elf_elfheader (abfd)->e_flags & EF_ARM_BE8) != 0)
19812     return bfd_getl32 (addr);
19813
19814   return bfd_get_32 (abfd, addr);
19815 }
19816
19817 static bfd_vma
19818 read_code16 (const bfd *abfd, const bfd_byte *addr)
19819 {
19820   /* V7 BE8 code is always little endian.  */
19821   if ((elf_elfheader (abfd)->e_flags & EF_ARM_BE8) != 0)
19822     return bfd_getl16 (addr);
19823
19824   return bfd_get_16 (abfd, addr);
19825 }
19826
19827 /* Return size of plt0 entry starting at ADDR
19828    or (bfd_vma) -1 if size can not be determined.  */
19829
19830 static bfd_vma
19831 elf32_arm_plt0_size (const bfd *abfd, const bfd_byte *addr)
19832 {
19833   bfd_vma first_word;
19834   bfd_vma plt0_size;
19835
19836   first_word = read_code32 (abfd, addr);
19837
19838   if (first_word == elf32_arm_plt0_entry[0])
19839     plt0_size = 4 * ARRAY_SIZE (elf32_arm_plt0_entry);
19840   else if (first_word == elf32_thumb2_plt0_entry[0])
19841     plt0_size = 4 * ARRAY_SIZE (elf32_thumb2_plt0_entry);
19842   else
19843     /* We don't yet handle this PLT format.  */
19844     return (bfd_vma) -1;
19845
19846   return plt0_size;
19847 }
19848
19849 /* Return size of plt entry starting at offset OFFSET
19850    of plt section located at address START
19851    or (bfd_vma) -1 if size can not be determined.  */
19852
19853 static bfd_vma
19854 elf32_arm_plt_size (const bfd *abfd, const bfd_byte *start, bfd_vma offset)
19855 {
19856   bfd_vma first_insn;
19857   bfd_vma plt_size = 0;
19858   const bfd_byte *addr = start + offset;
19859
19860   /* PLT entry size if fixed on Thumb-only platforms.  */
19861   if (read_code32 (abfd, start) == elf32_thumb2_plt0_entry[0])
19862       return 4 * ARRAY_SIZE (elf32_thumb2_plt_entry);
19863
19864   /* Respect Thumb stub if necessary.  */
19865   if (read_code16 (abfd, addr) == elf32_arm_plt_thumb_stub[0])
19866     {
19867       plt_size += 2 * ARRAY_SIZE(elf32_arm_plt_thumb_stub);
19868     }
19869
19870   /* Strip immediate from first add.  */
19871   first_insn = read_code32 (abfd, addr + plt_size) & 0xffffff00;
19872
19873 #ifdef FOUR_WORD_PLT
19874   if (first_insn == elf32_arm_plt_entry[0])
19875     plt_size += 4 * ARRAY_SIZE (elf32_arm_plt_entry);
19876 #else
19877   if (first_insn == elf32_arm_plt_entry_long[0])
19878     plt_size += 4 * ARRAY_SIZE (elf32_arm_plt_entry_long);
19879   else if (first_insn == elf32_arm_plt_entry_short[0])
19880     plt_size += 4 * ARRAY_SIZE (elf32_arm_plt_entry_short);
19881 #endif
19882   else
19883     /* We don't yet handle this PLT format.  */
19884     return (bfd_vma) -1;
19885
19886   return plt_size;
19887 }
19888
19889 /* Implementation is shamelessly borrowed from _bfd_elf_get_synthetic_symtab.  */
19890
19891 static long
19892 elf32_arm_get_synthetic_symtab (bfd *abfd,
19893                                long symcount ATTRIBUTE_UNUSED,
19894                                asymbol **syms ATTRIBUTE_UNUSED,
19895                                long dynsymcount,
19896                                asymbol **dynsyms,
19897                                asymbol **ret)
19898 {
19899   asection *relplt;
19900   asymbol *s;
19901   arelent *p;
19902   long count, i, n;
19903   size_t size;
19904   Elf_Internal_Shdr *hdr;
19905   char *names;
19906   asection *plt;
19907   bfd_vma offset;
19908   bfd_byte *data;
19909
19910   *ret = NULL;
19911
19912   if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
19913     return 0;
19914
19915   if (dynsymcount <= 0)
19916     return 0;
19917
19918   relplt = bfd_get_section_by_name (abfd, ".rel.plt");
19919   if (relplt == NULL)
19920     return 0;
19921
19922   hdr = &elf_section_data (relplt)->this_hdr;
19923   if (hdr->sh_link != elf_dynsymtab (abfd)
19924       || (hdr->sh_type != SHT_REL && hdr->sh_type != SHT_RELA))
19925     return 0;
19926
19927   plt = bfd_get_section_by_name (abfd, ".plt");
19928   if (plt == NULL)
19929     return 0;
19930
19931   if (!elf32_arm_size_info.slurp_reloc_table (abfd, relplt, dynsyms, TRUE))
19932     return -1;
19933
19934   data = plt->contents;
19935   if (data == NULL)
19936     {
19937       if (!bfd_get_full_section_contents(abfd, (asection *) plt, &data) || data == NULL)
19938         return -1;
19939       bfd_cache_section_contents((asection *) plt, data);
19940     }
19941
19942   count = relplt->size / hdr->sh_entsize;
19943   size = count * sizeof (asymbol);
19944   p = relplt->relocation;
19945   for (i = 0; i < count; i++, p += elf32_arm_size_info.int_rels_per_ext_rel)
19946     {
19947       size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
19948       if (p->addend != 0)
19949         size += sizeof ("+0x") - 1 + 8;
19950     }
19951
19952   s = *ret = (asymbol *) bfd_malloc (size);
19953   if (s == NULL)
19954     return -1;
19955
19956   offset = elf32_arm_plt0_size (abfd, data);
19957   if (offset == (bfd_vma) -1)
19958     return -1;
19959
19960   names = (char *) (s + count);
19961   p = relplt->relocation;
19962   n = 0;
19963   for (i = 0; i < count; i++, p += elf32_arm_size_info.int_rels_per_ext_rel)
19964     {
19965       size_t len;
19966
19967       bfd_vma plt_size = elf32_arm_plt_size (abfd, data, offset);
19968       if (plt_size == (bfd_vma) -1)
19969         break;
19970
19971       *s = **p->sym_ptr_ptr;
19972       /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set.  Since
19973          we are defining a symbol, ensure one of them is set.  */
19974       if ((s->flags & BSF_LOCAL) == 0)
19975         s->flags |= BSF_GLOBAL;
19976       s->flags |= BSF_SYNTHETIC;
19977       s->section = plt;
19978       s->value = offset;
19979       s->name = names;
19980       s->udata.p = NULL;
19981       len = strlen ((*p->sym_ptr_ptr)->name);
19982       memcpy (names, (*p->sym_ptr_ptr)->name, len);
19983       names += len;
19984       if (p->addend != 0)
19985         {
19986           char buf[30], *a;
19987
19988           memcpy (names, "+0x", sizeof ("+0x") - 1);
19989           names += sizeof ("+0x") - 1;
19990           bfd_sprintf_vma (abfd, buf, p->addend);
19991           for (a = buf; *a == '0'; ++a)
19992             ;
19993           len = strlen (a);
19994           memcpy (names, a, len);
19995           names += len;
19996         }
19997       memcpy (names, "@plt", sizeof ("@plt"));
19998       names += sizeof ("@plt");
19999       ++s, ++n;
20000       offset += plt_size;
20001     }
20002
20003   return n;
20004 }
20005
20006 static bfd_boolean
20007 elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr * hdr)
20008 {
20009   if (hdr->sh_flags & SHF_ARM_PURECODE)
20010     *flags |= SEC_ELF_PURECODE;
20011   return TRUE;
20012 }
20013
20014 static flagword
20015 elf32_arm_lookup_section_flags (char *flag_name)
20016 {
20017   if (!strcmp (flag_name, "SHF_ARM_PURECODE"))
20018     return SHF_ARM_PURECODE;
20019
20020   return SEC_NO_FLAGS;
20021 }
20022
20023 static unsigned int
20024 elf32_arm_count_additional_relocs (asection *sec)
20025 {
20026   struct _arm_elf_section_data *arm_data;
20027   arm_data = get_arm_elf_section_data (sec);
20028
20029   return arm_data == NULL ? 0 : arm_data->additional_reloc_count;
20030 }
20031
20032 /* Called to set the sh_flags, sh_link and sh_info fields of OSECTION which
20033    has a type >= SHT_LOOS.  Returns TRUE if these fields were initialised
20034    FALSE otherwise.  ISECTION is the best guess matching section from the
20035    input bfd IBFD, but it might be NULL.  */
20036
20037 static bfd_boolean
20038 elf32_arm_copy_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED,
20039                                        bfd *obfd ATTRIBUTE_UNUSED,
20040                                        const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
20041                                        Elf_Internal_Shdr *osection)
20042 {
20043   switch (osection->sh_type)
20044     {
20045     case SHT_ARM_EXIDX:
20046       {
20047         Elf_Internal_Shdr **oheaders = elf_elfsections (obfd);
20048         Elf_Internal_Shdr **iheaders = elf_elfsections (ibfd);
20049         unsigned i = 0;
20050
20051         osection->sh_flags = SHF_ALLOC | SHF_LINK_ORDER;
20052         osection->sh_info = 0;
20053
20054         /* The sh_link field must be set to the text section associated with
20055            this index section.  Unfortunately the ARM EHABI does not specify
20056            exactly how to determine this association.  Our caller does try
20057            to match up OSECTION with its corresponding input section however
20058            so that is a good first guess.  */
20059         if (isection != NULL
20060             && osection->bfd_section != NULL
20061             && isection->bfd_section != NULL
20062             && isection->bfd_section->output_section != NULL
20063             && isection->bfd_section->output_section == osection->bfd_section
20064             && iheaders != NULL
20065             && isection->sh_link > 0
20066             && isection->sh_link < elf_numsections (ibfd)
20067             && iheaders[isection->sh_link]->bfd_section != NULL
20068             && iheaders[isection->sh_link]->bfd_section->output_section != NULL
20069             )
20070           {
20071             for (i = elf_numsections (obfd); i-- > 0;)
20072               if (oheaders[i]->bfd_section
20073                   == iheaders[isection->sh_link]->bfd_section->output_section)
20074                 break;
20075           }
20076
20077         if (i == 0)
20078           {
20079             /* Failing that we have to find a matching section ourselves.  If
20080                we had the output section name available we could compare that
20081                with input section names.  Unfortunately we don't.  So instead
20082                we use a simple heuristic and look for the nearest executable
20083                section before this one.  */
20084             for (i = elf_numsections (obfd); i-- > 0;)
20085               if (oheaders[i] == osection)
20086                 break;
20087             if (i == 0)
20088               break;
20089
20090             while (i-- > 0)
20091               if (oheaders[i]->sh_type == SHT_PROGBITS
20092                   && (oheaders[i]->sh_flags & (SHF_ALLOC | SHF_EXECINSTR))
20093                   == (SHF_ALLOC | SHF_EXECINSTR))
20094                 break;
20095           }
20096
20097         if (i)
20098           {
20099             osection->sh_link = i;
20100             /* If the text section was part of a group
20101                then the index section should be too.  */
20102             if (oheaders[i]->sh_flags & SHF_GROUP)
20103               osection->sh_flags |= SHF_GROUP;
20104             return TRUE;
20105           }
20106       }
20107       break;
20108
20109     case SHT_ARM_PREEMPTMAP:
20110       osection->sh_flags = SHF_ALLOC;
20111       break;
20112
20113     case SHT_ARM_ATTRIBUTES:
20114     case SHT_ARM_DEBUGOVERLAY:
20115     case SHT_ARM_OVERLAYSECTION:
20116     default:
20117       break;
20118     }
20119
20120   return FALSE;
20121 }
20122
20123 /* Returns TRUE if NAME is an ARM mapping symbol.
20124    Traditionally the symbols $a, $d and $t have been used.
20125    The ARM ELF standard also defines $x (for A64 code).  It also allows a
20126    period initiated suffix to be added to the symbol: "$[adtx]\.[:sym_char]+".
20127    Other tools might also produce $b (Thumb BL), $f, $p, $m and $v, but we do
20128    not support them here.  $t.x indicates the start of ThumbEE instructions.  */
20129
20130 static bfd_boolean
20131 is_arm_mapping_symbol (const char * name)
20132 {
20133   return name != NULL /* Paranoia.  */
20134     && name[0] == '$' /* Note: if objcopy --prefix-symbols has been used then
20135                          the mapping symbols could have acquired a prefix.
20136                          We do not support this here, since such symbols no
20137                          longer conform to the ARM ELF ABI.  */
20138     && (name[1] == 'a' || name[1] == 'd' || name[1] == 't' || name[1] == 'x')
20139     && (name[2] == 0 || name[2] == '.');
20140   /* FIXME: Strictly speaking the symbol is only a valid mapping symbol if
20141      any characters that follow the period are legal characters for the body
20142      of a symbol's name.  For now we just assume that this is the case.  */
20143 }
20144
20145 /* Make sure that mapping symbols in object files are not removed via the
20146    "strip --strip-unneeded" tool.  These symbols are needed in order to
20147    correctly generate interworking veneers, and for byte swapping code
20148    regions.  Once an object file has been linked, it is safe to remove the
20149    symbols as they will no longer be needed.  */
20150
20151 static void
20152 elf32_arm_backend_symbol_processing (bfd *abfd, asymbol *sym)
20153 {
20154   if (((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
20155       && sym->section != bfd_abs_section_ptr
20156       && is_arm_mapping_symbol (sym->name))
20157     sym->flags |= BSF_KEEP;
20158 }
20159
20160 #undef  elf_backend_copy_special_section_fields
20161 #define elf_backend_copy_special_section_fields elf32_arm_copy_special_section_fields
20162
20163 #define ELF_ARCH                        bfd_arch_arm
20164 #define ELF_TARGET_ID                   ARM_ELF_DATA
20165 #define ELF_MACHINE_CODE                EM_ARM
20166 #ifdef __QNXTARGET__
20167 #define ELF_MAXPAGESIZE                 0x1000
20168 #else
20169 #define ELF_MAXPAGESIZE                 0x10000
20170 #endif
20171 #define ELF_MINPAGESIZE                 0x1000
20172 #define ELF_COMMONPAGESIZE              0x1000
20173
20174 #define bfd_elf32_mkobject                      elf32_arm_mkobject
20175
20176 #define bfd_elf32_bfd_copy_private_bfd_data     elf32_arm_copy_private_bfd_data
20177 #define bfd_elf32_bfd_merge_private_bfd_data    elf32_arm_merge_private_bfd_data
20178 #define bfd_elf32_bfd_set_private_flags         elf32_arm_set_private_flags
20179 #define bfd_elf32_bfd_print_private_bfd_data    elf32_arm_print_private_bfd_data
20180 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_link_hash_table_create
20181 #define bfd_elf32_bfd_reloc_type_lookup         elf32_arm_reloc_type_lookup
20182 #define bfd_elf32_bfd_reloc_name_lookup         elf32_arm_reloc_name_lookup
20183 #define bfd_elf32_find_nearest_line             elf32_arm_find_nearest_line
20184 #define bfd_elf32_find_inliner_info             elf32_arm_find_inliner_info
20185 #define bfd_elf32_new_section_hook              elf32_arm_new_section_hook
20186 #define bfd_elf32_bfd_is_target_special_symbol  elf32_arm_is_target_special_symbol
20187 #define bfd_elf32_bfd_final_link                elf32_arm_final_link
20188 #define bfd_elf32_get_synthetic_symtab  elf32_arm_get_synthetic_symtab
20189
20190 #define elf_backend_get_symbol_type             elf32_arm_get_symbol_type
20191 #define elf_backend_gc_mark_hook                elf32_arm_gc_mark_hook
20192 #define elf_backend_gc_mark_extra_sections      elf32_arm_gc_mark_extra_sections
20193 #define elf_backend_check_relocs                elf32_arm_check_relocs
20194 #define elf_backend_update_relocs               elf32_arm_update_relocs
20195 #define elf_backend_relocate_section            elf32_arm_relocate_section
20196 #define elf_backend_write_section               elf32_arm_write_section
20197 #define elf_backend_adjust_dynamic_symbol       elf32_arm_adjust_dynamic_symbol
20198 #define elf_backend_create_dynamic_sections     elf32_arm_create_dynamic_sections
20199 #define elf_backend_finish_dynamic_symbol       elf32_arm_finish_dynamic_symbol
20200 #define elf_backend_finish_dynamic_sections     elf32_arm_finish_dynamic_sections
20201 #define elf_backend_size_dynamic_sections       elf32_arm_size_dynamic_sections
20202 #define elf_backend_always_size_sections        elf32_arm_always_size_sections
20203 #define elf_backend_init_index_section          _bfd_elf_init_2_index_sections
20204 #define elf_backend_post_process_headers        elf32_arm_post_process_headers
20205 #define elf_backend_reloc_type_class            elf32_arm_reloc_type_class
20206 #define elf_backend_object_p                    elf32_arm_object_p
20207 #define elf_backend_fake_sections               elf32_arm_fake_sections
20208 #define elf_backend_section_from_shdr           elf32_arm_section_from_shdr
20209 #define elf_backend_final_write_processing      elf32_arm_final_write_processing
20210 #define elf_backend_copy_indirect_symbol        elf32_arm_copy_indirect_symbol
20211 #define elf_backend_size_info                   elf32_arm_size_info
20212 #define elf_backend_modify_segment_map          elf32_arm_modify_segment_map
20213 #define elf_backend_additional_program_headers  elf32_arm_additional_program_headers
20214 #define elf_backend_output_arch_local_syms      elf32_arm_output_arch_local_syms
20215 #define elf_backend_filter_implib_symbols       elf32_arm_filter_implib_symbols
20216 #define elf_backend_begin_write_processing      elf32_arm_begin_write_processing
20217 #define elf_backend_add_symbol_hook             elf32_arm_add_symbol_hook
20218 #define elf_backend_count_additional_relocs     elf32_arm_count_additional_relocs
20219 #define elf_backend_symbol_processing           elf32_arm_backend_symbol_processing
20220
20221 #define elf_backend_can_refcount       1
20222 #define elf_backend_can_gc_sections    1
20223 #define elf_backend_plt_readonly       1
20224 #define elf_backend_want_got_plt       1
20225 #define elf_backend_want_plt_sym       0
20226 #define elf_backend_want_dynrelro      1
20227 #define elf_backend_may_use_rel_p      1
20228 #define elf_backend_may_use_rela_p     0
20229 #define elf_backend_default_use_rela_p 0
20230 #define elf_backend_dtrel_excludes_plt 1
20231
20232 #define elf_backend_got_header_size     12
20233 #define elf_backend_extern_protected_data 1
20234
20235 #undef  elf_backend_obj_attrs_vendor
20236 #define elf_backend_obj_attrs_vendor            "aeabi"
20237 #undef  elf_backend_obj_attrs_section
20238 #define elf_backend_obj_attrs_section           ".ARM.attributes"
20239 #undef  elf_backend_obj_attrs_arg_type
20240 #define elf_backend_obj_attrs_arg_type          elf32_arm_obj_attrs_arg_type
20241 #undef  elf_backend_obj_attrs_section_type
20242 #define elf_backend_obj_attrs_section_type      SHT_ARM_ATTRIBUTES
20243 #define elf_backend_obj_attrs_order             elf32_arm_obj_attrs_order
20244 #define elf_backend_obj_attrs_handle_unknown    elf32_arm_obj_attrs_handle_unknown
20245
20246 #undef  elf_backend_section_flags
20247 #define elf_backend_section_flags               elf32_arm_section_flags
20248 #undef  elf_backend_lookup_section_flags_hook
20249 #define elf_backend_lookup_section_flags_hook   elf32_arm_lookup_section_flags
20250
20251 #define elf_backend_linux_prpsinfo32_ugid16     TRUE
20252
20253 #include "elf32-target.h"
20254
20255 /* Native Client targets.  */
20256
20257 #undef  TARGET_LITTLE_SYM
20258 #define TARGET_LITTLE_SYM               arm_elf32_nacl_le_vec
20259 #undef  TARGET_LITTLE_NAME
20260 #define TARGET_LITTLE_NAME              "elf32-littlearm-nacl"
20261 #undef  TARGET_BIG_SYM
20262 #define TARGET_BIG_SYM                  arm_elf32_nacl_be_vec
20263 #undef  TARGET_BIG_NAME
20264 #define TARGET_BIG_NAME                 "elf32-bigarm-nacl"
20265
20266 /* Like elf32_arm_link_hash_table_create -- but overrides
20267    appropriately for NaCl.  */
20268
20269 static struct bfd_link_hash_table *
20270 elf32_arm_nacl_link_hash_table_create (bfd *abfd)
20271 {
20272   struct bfd_link_hash_table *ret;
20273
20274   ret = elf32_arm_link_hash_table_create (abfd);
20275   if (ret)
20276     {
20277       struct elf32_arm_link_hash_table *htab
20278         = (struct elf32_arm_link_hash_table *) ret;
20279
20280       htab->nacl_p = 1;
20281
20282       htab->plt_header_size = 4 * ARRAY_SIZE (elf32_arm_nacl_plt0_entry);
20283       htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_nacl_plt_entry);
20284     }
20285   return ret;
20286 }
20287
20288 /* Since NaCl doesn't use the ARM-specific unwind format, we don't
20289    really need to use elf32_arm_modify_segment_map.  But we do it
20290    anyway just to reduce gratuitous differences with the stock ARM backend.  */
20291
20292 static bfd_boolean
20293 elf32_arm_nacl_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
20294 {
20295   return (elf32_arm_modify_segment_map (abfd, info)
20296           && nacl_modify_segment_map (abfd, info));
20297 }
20298
20299 static void
20300 elf32_arm_nacl_final_write_processing (bfd *abfd, bfd_boolean linker)
20301 {
20302   elf32_arm_final_write_processing (abfd, linker);
20303   nacl_final_write_processing (abfd, linker);
20304 }
20305
20306 static bfd_vma
20307 elf32_arm_nacl_plt_sym_val (bfd_vma i, const asection *plt,
20308                             const arelent *rel ATTRIBUTE_UNUSED)
20309 {
20310   return plt->vma
20311     + 4 * (ARRAY_SIZE (elf32_arm_nacl_plt0_entry) +
20312            i * ARRAY_SIZE (elf32_arm_nacl_plt_entry));
20313 }
20314
20315 #undef  elf32_bed
20316 #define elf32_bed                               elf32_arm_nacl_bed
20317 #undef  bfd_elf32_bfd_link_hash_table_create
20318 #define bfd_elf32_bfd_link_hash_table_create    \
20319   elf32_arm_nacl_link_hash_table_create
20320 #undef  elf_backend_plt_alignment
20321 #define elf_backend_plt_alignment               4
20322 #undef  elf_backend_modify_segment_map
20323 #define elf_backend_modify_segment_map          elf32_arm_nacl_modify_segment_map
20324 #undef  elf_backend_modify_program_headers
20325 #define elf_backend_modify_program_headers      nacl_modify_program_headers
20326 #undef  elf_backend_final_write_processing
20327 #define elf_backend_final_write_processing      elf32_arm_nacl_final_write_processing
20328 #undef bfd_elf32_get_synthetic_symtab
20329 #undef  elf_backend_plt_sym_val
20330 #define elf_backend_plt_sym_val                 elf32_arm_nacl_plt_sym_val
20331 #undef  elf_backend_copy_special_section_fields
20332
20333 #undef  ELF_MINPAGESIZE
20334 #undef  ELF_COMMONPAGESIZE
20335
20336
20337 #include "elf32-target.h"
20338
20339 /* Reset to defaults.  */
20340 #undef  elf_backend_plt_alignment
20341 #undef  elf_backend_modify_segment_map
20342 #define elf_backend_modify_segment_map          elf32_arm_modify_segment_map
20343 #undef  elf_backend_modify_program_headers
20344 #undef  elf_backend_final_write_processing
20345 #define elf_backend_final_write_processing      elf32_arm_final_write_processing
20346 #undef  ELF_MINPAGESIZE
20347 #define ELF_MINPAGESIZE                 0x1000
20348 #undef  ELF_COMMONPAGESIZE
20349 #define ELF_COMMONPAGESIZE              0x1000
20350
20351
20352 /* FDPIC Targets.  */
20353
20354 #undef  TARGET_LITTLE_SYM
20355 #define TARGET_LITTLE_SYM               arm_elf32_fdpic_le_vec
20356 #undef  TARGET_LITTLE_NAME
20357 #define TARGET_LITTLE_NAME              "elf32-littlearm-fdpic"
20358 #undef  TARGET_BIG_SYM
20359 #define TARGET_BIG_SYM                  arm_elf32_fdpic_be_vec
20360 #undef  TARGET_BIG_NAME
20361 #define TARGET_BIG_NAME                 "elf32-bigarm-fdpic"
20362 #undef elf_match_priority
20363 #define elf_match_priority              128
20364 #undef ELF_OSABI
20365 #define ELF_OSABI               ELFOSABI_ARM_FDPIC
20366
20367 /* Like elf32_arm_link_hash_table_create -- but overrides
20368    appropriately for FDPIC.  */
20369
20370 static struct bfd_link_hash_table *
20371 elf32_arm_fdpic_link_hash_table_create (bfd *abfd)
20372 {
20373   struct bfd_link_hash_table *ret;
20374
20375   ret = elf32_arm_link_hash_table_create (abfd);
20376   if (ret)
20377     {
20378       struct elf32_arm_link_hash_table *htab = (struct elf32_arm_link_hash_table *) ret;
20379
20380       htab->fdpic_p = 1;
20381     }
20382   return ret;
20383 }
20384
20385 /* We need dynamic symbols for every section, since segments can
20386    relocate independently.  */
20387 static bfd_boolean
20388 elf32_arm_fdpic_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
20389                                     struct bfd_link_info *info
20390                                     ATTRIBUTE_UNUSED,
20391                                     asection *p ATTRIBUTE_UNUSED)
20392 {
20393   switch (elf_section_data (p)->this_hdr.sh_type)
20394     {
20395     case SHT_PROGBITS:
20396     case SHT_NOBITS:
20397       /* If sh_type is yet undecided, assume it could be
20398          SHT_PROGBITS/SHT_NOBITS.  */
20399     case SHT_NULL:
20400       return FALSE;
20401
20402       /* There shouldn't be section relative relocations
20403          against any other section.  */
20404     default:
20405       return TRUE;
20406     }
20407 }
20408
20409 #undef  elf32_bed
20410 #define elf32_bed                               elf32_arm_fdpic_bed
20411
20412 #undef  bfd_elf32_bfd_link_hash_table_create
20413 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_fdpic_link_hash_table_create
20414
20415 #undef elf_backend_omit_section_dynsym
20416 #define elf_backend_omit_section_dynsym         elf32_arm_fdpic_omit_section_dynsym
20417
20418 #include "elf32-target.h"
20419
20420 #undef elf_match_priority
20421 #undef ELF_OSABI
20422 #undef elf_backend_omit_section_dynsym
20423
20424 /* VxWorks Targets.  */
20425
20426 #undef  TARGET_LITTLE_SYM
20427 #define TARGET_LITTLE_SYM               arm_elf32_vxworks_le_vec
20428 #undef  TARGET_LITTLE_NAME
20429 #define TARGET_LITTLE_NAME              "elf32-littlearm-vxworks"
20430 #undef  TARGET_BIG_SYM
20431 #define TARGET_BIG_SYM                  arm_elf32_vxworks_be_vec
20432 #undef  TARGET_BIG_NAME
20433 #define TARGET_BIG_NAME                 "elf32-bigarm-vxworks"
20434
20435 /* Like elf32_arm_link_hash_table_create -- but overrides
20436    appropriately for VxWorks.  */
20437
20438 static struct bfd_link_hash_table *
20439 elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
20440 {
20441   struct bfd_link_hash_table *ret;
20442
20443   ret = elf32_arm_link_hash_table_create (abfd);
20444   if (ret)
20445     {
20446       struct elf32_arm_link_hash_table *htab
20447         = (struct elf32_arm_link_hash_table *) ret;
20448       htab->use_rel = 0;
20449       htab->vxworks_p = 1;
20450     }
20451   return ret;
20452 }
20453
20454 static void
20455 elf32_arm_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
20456 {
20457   elf32_arm_final_write_processing (abfd, linker);
20458   elf_vxworks_final_write_processing (abfd, linker);
20459 }
20460
20461 #undef  elf32_bed
20462 #define elf32_bed elf32_arm_vxworks_bed
20463
20464 #undef  bfd_elf32_bfd_link_hash_table_create
20465 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_vxworks_link_hash_table_create
20466 #undef  elf_backend_final_write_processing
20467 #define elf_backend_final_write_processing      elf32_arm_vxworks_final_write_processing
20468 #undef  elf_backend_emit_relocs
20469 #define elf_backend_emit_relocs                 elf_vxworks_emit_relocs
20470
20471 #undef  elf_backend_may_use_rel_p
20472 #define elf_backend_may_use_rel_p       0
20473 #undef  elf_backend_may_use_rela_p
20474 #define elf_backend_may_use_rela_p      1
20475 #undef  elf_backend_default_use_rela_p
20476 #define elf_backend_default_use_rela_p  1
20477 #undef  elf_backend_want_plt_sym
20478 #define elf_backend_want_plt_sym        1
20479 #undef  ELF_MAXPAGESIZE
20480 #define ELF_MAXPAGESIZE                 0x1000
20481
20482 #include "elf32-target.h"
20483
20484
20485 /* Merge backend specific data from an object file to the output
20486    object file when linking.  */
20487
20488 static bfd_boolean
20489 elf32_arm_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
20490 {
20491   bfd *obfd = info->output_bfd;
20492   flagword out_flags;
20493   flagword in_flags;
20494   bfd_boolean flags_compatible = TRUE;
20495   asection *sec;
20496
20497   /* Check if we have the same endianness.  */
20498   if (! _bfd_generic_verify_endian_match (ibfd, info))
20499     return FALSE;
20500
20501   if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
20502     return TRUE;
20503
20504   if (!elf32_arm_merge_eabi_attributes (ibfd, info))
20505     return FALSE;
20506
20507   /* The input BFD must have had its flags initialised.  */
20508   /* The following seems bogus to me -- The flags are initialized in
20509      the assembler but I don't think an elf_flags_init field is
20510      written into the object.  */
20511   /* BFD_ASSERT (elf_flags_init (ibfd)); */
20512
20513   in_flags  = elf_elfheader (ibfd)->e_flags;
20514   out_flags = elf_elfheader (obfd)->e_flags;
20515
20516   /* In theory there is no reason why we couldn't handle this.  However
20517      in practice it isn't even close to working and there is no real
20518      reason to want it.  */
20519   if (EF_ARM_EABI_VERSION (in_flags) >= EF_ARM_EABI_VER4
20520       && !(ibfd->flags & DYNAMIC)
20521       && (in_flags & EF_ARM_BE8))
20522     {
20523       _bfd_error_handler (_("error: %pB is already in final BE8 format"),
20524                           ibfd);
20525       return FALSE;
20526     }
20527
20528   if (!elf_flags_init (obfd))
20529     {
20530       /* If the input is the default architecture and had the default
20531          flags then do not bother setting the flags for the output
20532          architecture, instead allow future merges to do this.  If no
20533          future merges ever set these flags then they will retain their
20534          uninitialised values, which surprise surprise, correspond
20535          to the default values.  */
20536       if (bfd_get_arch_info (ibfd)->the_default
20537           && elf_elfheader (ibfd)->e_flags == 0)
20538         return TRUE;
20539
20540       elf_flags_init (obfd) = TRUE;
20541       elf_elfheader (obfd)->e_flags = in_flags;
20542
20543       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
20544           && bfd_get_arch_info (obfd)->the_default)
20545         return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
20546
20547       return TRUE;
20548     }
20549
20550   /* Determine what should happen if the input ARM architecture
20551      does not match the output ARM architecture.  */
20552   if (! bfd_arm_merge_machines (ibfd, obfd))
20553     return FALSE;
20554
20555   /* Identical flags must be compatible.  */
20556   if (in_flags == out_flags)
20557     return TRUE;
20558
20559   /* Check to see if the input BFD actually contains any sections.  If
20560      not, its flags may not have been initialised either, but it
20561      cannot actually cause any incompatiblity.  Do not short-circuit
20562      dynamic objects; their section list may be emptied by
20563     elf_link_add_object_symbols.
20564
20565     Also check to see if there are no code sections in the input.
20566     In this case there is no need to check for code specific flags.
20567     XXX - do we need to worry about floating-point format compatability
20568     in data sections ?  */
20569   if (!(ibfd->flags & DYNAMIC))
20570     {
20571       bfd_boolean null_input_bfd = TRUE;
20572       bfd_boolean only_data_sections = TRUE;
20573
20574       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
20575         {
20576           /* Ignore synthetic glue sections.  */
20577           if (strcmp (sec->name, ".glue_7")
20578               && strcmp (sec->name, ".glue_7t"))
20579             {
20580               if ((bfd_get_section_flags (ibfd, sec)
20581                    & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
20582                   == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
20583                 only_data_sections = FALSE;
20584
20585               null_input_bfd = FALSE;
20586               break;
20587             }
20588         }
20589
20590       if (null_input_bfd || only_data_sections)
20591         return TRUE;
20592     }
20593
20594   /* Complain about various flag mismatches.  */
20595   if (!elf32_arm_versions_compatible (EF_ARM_EABI_VERSION (in_flags),
20596                                       EF_ARM_EABI_VERSION (out_flags)))
20597     {
20598       _bfd_error_handler
20599         (_("error: source object %pB has EABI version %d, but target %pB has EABI version %d"),
20600          ibfd, (in_flags & EF_ARM_EABIMASK) >> 24,
20601          obfd, (out_flags & EF_ARM_EABIMASK) >> 24);
20602       return FALSE;
20603     }
20604
20605   /* Not sure what needs to be checked for EABI versions >= 1.  */
20606   /* VxWorks libraries do not use these flags.  */
20607   if (get_elf_backend_data (obfd) != &elf32_arm_vxworks_bed
20608       && get_elf_backend_data (ibfd) != &elf32_arm_vxworks_bed
20609       && EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
20610     {
20611       if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
20612         {
20613           _bfd_error_handler
20614             (_("error: %pB is compiled for APCS-%d, whereas target %pB uses APCS-%d"),
20615              ibfd, in_flags & EF_ARM_APCS_26 ? 26 : 32,
20616              obfd, out_flags & EF_ARM_APCS_26 ? 26 : 32);
20617           flags_compatible = FALSE;
20618         }
20619
20620       if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
20621         {
20622           if (in_flags & EF_ARM_APCS_FLOAT)
20623             _bfd_error_handler
20624               (_("error: %pB passes floats in float registers, whereas %pB passes them in integer registers"),
20625                ibfd, obfd);
20626           else
20627             _bfd_error_handler
20628               (_("error: %pB passes floats in integer registers, whereas %pB passes them in float registers"),
20629                ibfd, obfd);
20630
20631           flags_compatible = FALSE;
20632         }
20633
20634       if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
20635         {
20636           if (in_flags & EF_ARM_VFP_FLOAT)
20637             _bfd_error_handler
20638               (_("error: %pB uses %s instructions, whereas %pB does not"),
20639                ibfd, "VFP", obfd);
20640           else
20641             _bfd_error_handler
20642               (_("error: %pB uses %s instructions, whereas %pB does not"),
20643                ibfd, "FPA", obfd);
20644
20645           flags_compatible = FALSE;
20646         }
20647
20648       if ((in_flags & EF_ARM_MAVERICK_FLOAT) != (out_flags & EF_ARM_MAVERICK_FLOAT))
20649         {
20650           if (in_flags & EF_ARM_MAVERICK_FLOAT)
20651             _bfd_error_handler
20652               (_("error: %pB uses %s instructions, whereas %pB does not"),
20653                ibfd, "Maverick", obfd);
20654           else
20655             _bfd_error_handler
20656               (_("error: %pB does not use %s instructions, whereas %pB does"),
20657                ibfd, "Maverick", obfd);
20658
20659           flags_compatible = FALSE;
20660         }
20661
20662 #ifdef EF_ARM_SOFT_FLOAT
20663       if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
20664         {
20665           /* We can allow interworking between code that is VFP format
20666              layout, and uses either soft float or integer regs for
20667              passing floating point arguments and results.  We already
20668              know that the APCS_FLOAT flags match; similarly for VFP
20669              flags.  */
20670           if ((in_flags & EF_ARM_APCS_FLOAT) != 0
20671               || (in_flags & EF_ARM_VFP_FLOAT) == 0)
20672             {
20673               if (in_flags & EF_ARM_SOFT_FLOAT)
20674                 _bfd_error_handler
20675                   (_("error: %pB uses software FP, whereas %pB uses hardware FP"),
20676                    ibfd, obfd);
20677               else
20678                 _bfd_error_handler
20679                   (_("error: %pB uses hardware FP, whereas %pB uses software FP"),
20680                    ibfd, obfd);
20681
20682               flags_compatible = FALSE;
20683             }
20684         }
20685 #endif
20686
20687       /* Interworking mismatch is only a warning.  */
20688       if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
20689         {
20690           if (in_flags & EF_ARM_INTERWORK)
20691             {
20692               _bfd_error_handler
20693                 (_("warning: %pB supports interworking, whereas %pB does not"),
20694                  ibfd, obfd);
20695             }
20696           else
20697             {
20698               _bfd_error_handler
20699                 (_("warning: %pB does not support interworking, whereas %pB does"),
20700                  ibfd, obfd);
20701             }
20702         }
20703     }
20704
20705   return flags_compatible;
20706 }
20707
20708
20709 /* Symbian OS Targets.  */
20710
20711 #undef  TARGET_LITTLE_SYM
20712 #define TARGET_LITTLE_SYM               arm_elf32_symbian_le_vec
20713 #undef  TARGET_LITTLE_NAME
20714 #define TARGET_LITTLE_NAME              "elf32-littlearm-symbian"
20715 #undef  TARGET_BIG_SYM
20716 #define TARGET_BIG_SYM                  arm_elf32_symbian_be_vec
20717 #undef  TARGET_BIG_NAME
20718 #define TARGET_BIG_NAME                 "elf32-bigarm-symbian"
20719
20720 /* Like elf32_arm_link_hash_table_create -- but overrides
20721    appropriately for Symbian OS.  */
20722
20723 static struct bfd_link_hash_table *
20724 elf32_arm_symbian_link_hash_table_create (bfd *abfd)
20725 {
20726   struct bfd_link_hash_table *ret;
20727
20728   ret = elf32_arm_link_hash_table_create (abfd);
20729   if (ret)
20730     {
20731       struct elf32_arm_link_hash_table *htab
20732         = (struct elf32_arm_link_hash_table *)ret;
20733       /* There is no PLT header for Symbian OS.  */
20734       htab->plt_header_size = 0;
20735       /* The PLT entries are each one instruction and one word.  */
20736       htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry);
20737       htab->symbian_p = 1;
20738       /* Symbian uses armv5t or above, so use_blx is always true.  */
20739       htab->use_blx = 1;
20740       htab->root.is_relocatable_executable = 1;
20741     }
20742   return ret;
20743 }
20744
20745 static const struct bfd_elf_special_section
20746 elf32_arm_symbian_special_sections[] =
20747 {
20748   /* In a BPABI executable, the dynamic linking sections do not go in
20749      the loadable read-only segment.  The post-linker may wish to
20750      refer to these sections, but they are not part of the final
20751      program image.  */
20752   { STRING_COMMA_LEN (".dynamic"),       0, SHT_DYNAMIC,  0 },
20753   { STRING_COMMA_LEN (".dynstr"),        0, SHT_STRTAB,   0 },
20754   { STRING_COMMA_LEN (".dynsym"),        0, SHT_DYNSYM,   0 },
20755   { STRING_COMMA_LEN (".got"),           0, SHT_PROGBITS, 0 },
20756   { STRING_COMMA_LEN (".hash"),          0, SHT_HASH,     0 },
20757   /* These sections do not need to be writable as the SymbianOS
20758      postlinker will arrange things so that no dynamic relocation is
20759      required.  */
20760   { STRING_COMMA_LEN (".init_array"),    0, SHT_INIT_ARRAY,    SHF_ALLOC },
20761   { STRING_COMMA_LEN (".fini_array"),    0, SHT_FINI_ARRAY,    SHF_ALLOC },
20762   { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC },
20763   { NULL,                             0, 0, 0,                 0 }
20764 };
20765
20766 static void
20767 elf32_arm_symbian_begin_write_processing (bfd *abfd,
20768                                           struct bfd_link_info *link_info)
20769 {
20770   /* BPABI objects are never loaded directly by an OS kernel; they are
20771      processed by a postlinker first, into an OS-specific format.  If
20772      the D_PAGED bit is set on the file, BFD will align segments on
20773      page boundaries, so that an OS can directly map the file.  With
20774      BPABI objects, that just results in wasted space.  In addition,
20775      because we clear the D_PAGED bit, map_sections_to_segments will
20776      recognize that the program headers should not be mapped into any
20777      loadable segment.  */
20778   abfd->flags &= ~D_PAGED;
20779   elf32_arm_begin_write_processing (abfd, link_info);
20780 }
20781
20782 static bfd_boolean
20783 elf32_arm_symbian_modify_segment_map (bfd *abfd,
20784                                       struct bfd_link_info *info)
20785 {
20786   struct elf_segment_map *m;
20787   asection *dynsec;
20788
20789   /* BPABI shared libraries and executables should have a PT_DYNAMIC
20790      segment.  However, because the .dynamic section is not marked
20791      with SEC_LOAD, the generic ELF code will not create such a
20792      segment.  */
20793   dynsec = bfd_get_section_by_name (abfd, ".dynamic");
20794   if (dynsec)
20795     {
20796       for (m = elf_seg_map (abfd); m != NULL; m = m->next)
20797         if (m->p_type == PT_DYNAMIC)
20798           break;
20799
20800       if (m == NULL)
20801         {
20802           m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
20803           m->next = elf_seg_map (abfd);
20804           elf_seg_map (abfd) = m;
20805         }
20806     }
20807
20808   /* Also call the generic arm routine.  */
20809   return elf32_arm_modify_segment_map (abfd, info);
20810 }
20811
20812 /* Return address for Ith PLT stub in section PLT, for relocation REL
20813    or (bfd_vma) -1 if it should not be included.  */
20814
20815 static bfd_vma
20816 elf32_arm_symbian_plt_sym_val (bfd_vma i, const asection *plt,
20817                                const arelent *rel ATTRIBUTE_UNUSED)
20818 {
20819   return plt->vma + 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry) * i;
20820 }
20821
20822 #undef  elf32_bed
20823 #define elf32_bed elf32_arm_symbian_bed
20824
20825 /* The dynamic sections are not allocated on SymbianOS; the postlinker
20826    will process them and then discard them.  */
20827 #undef  ELF_DYNAMIC_SEC_FLAGS
20828 #define ELF_DYNAMIC_SEC_FLAGS \
20829   (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
20830
20831 #undef elf_backend_emit_relocs
20832
20833 #undef  bfd_elf32_bfd_link_hash_table_create
20834 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_symbian_link_hash_table_create
20835 #undef  elf_backend_special_sections
20836 #define elf_backend_special_sections            elf32_arm_symbian_special_sections
20837 #undef  elf_backend_begin_write_processing
20838 #define elf_backend_begin_write_processing      elf32_arm_symbian_begin_write_processing
20839 #undef  elf_backend_final_write_processing
20840 #define elf_backend_final_write_processing      elf32_arm_final_write_processing
20841
20842 #undef  elf_backend_modify_segment_map
20843 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
20844
20845 /* There is no .got section for BPABI objects, and hence no header.  */
20846 #undef  elf_backend_got_header_size
20847 #define elf_backend_got_header_size 0
20848
20849 /* Similarly, there is no .got.plt section.  */
20850 #undef  elf_backend_want_got_plt
20851 #define elf_backend_want_got_plt 0
20852
20853 #undef  elf_backend_plt_sym_val
20854 #define elf_backend_plt_sym_val         elf32_arm_symbian_plt_sym_val
20855
20856 #undef  elf_backend_may_use_rel_p
20857 #define elf_backend_may_use_rel_p       1
20858 #undef  elf_backend_may_use_rela_p
20859 #define elf_backend_may_use_rela_p      0
20860 #undef  elf_backend_default_use_rela_p
20861 #define elf_backend_default_use_rela_p  0
20862 #undef  elf_backend_want_plt_sym
20863 #define elf_backend_want_plt_sym        0
20864 #undef  elf_backend_dtrel_excludes_plt
20865 #define elf_backend_dtrel_excludes_plt  0
20866 #undef  ELF_MAXPAGESIZE
20867 #define ELF_MAXPAGESIZE                 0x8000
20868
20869 #include "elf32-target.h"