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