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