2005-08-15 Paul Brook <paul@codesourcery.com>
[external/binutils.git] / bfd / elf32-arm.c
1 /* 32-bit ELF support for ARM
2    Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
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 "elf/arm.h"
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26
27 #ifndef NUM_ELEM
28 #define NUM_ELEM(a)  (sizeof (a) / (sizeof (a)[0]))
29 #endif
30
31 #define elf_info_to_howto               0
32 #define elf_info_to_howto_rel           elf32_arm_info_to_howto
33
34 #define ARM_ELF_ABI_VERSION             0
35 #define ARM_ELF_OS_ABI_VERSION          ELFOSABI_ARM
36
37 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
38    R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
39    in that slot.  */
40
41 static reloc_howto_type elf32_arm_howto_table_1[] =
42 {
43   /* No relocation */
44   HOWTO (R_ARM_NONE,            /* type */
45          0,                     /* rightshift */
46          0,                     /* size (0 = byte, 1 = short, 2 = long) */
47          0,                     /* bitsize */
48          FALSE,                 /* pc_relative */
49          0,                     /* bitpos */
50          complain_overflow_dont,/* complain_on_overflow */
51          bfd_elf_generic_reloc, /* special_function */
52          "R_ARM_NONE",          /* name */
53          FALSE,                 /* partial_inplace */
54          0,                     /* src_mask */
55          0,                     /* dst_mask */
56          FALSE),                /* pcrel_offset */
57
58   HOWTO (R_ARM_PC24,            /* type */
59          2,                     /* rightshift */
60          2,                     /* size (0 = byte, 1 = short, 2 = long) */
61          24,                    /* bitsize */
62          TRUE,                  /* pc_relative */
63          0,                     /* bitpos */
64          complain_overflow_signed,/* complain_on_overflow */
65          bfd_elf_generic_reloc, /* special_function */
66          "R_ARM_PC24",          /* name */
67          FALSE,                 /* partial_inplace */
68          0x00ffffff,            /* src_mask */
69          0x00ffffff,            /* dst_mask */
70          TRUE),                 /* pcrel_offset */
71
72   /* 32 bit absolute */
73   HOWTO (R_ARM_ABS32,           /* type */
74          0,                     /* rightshift */
75          2,                     /* size (0 = byte, 1 = short, 2 = long) */
76          32,                    /* bitsize */
77          FALSE,                 /* pc_relative */
78          0,                     /* bitpos */
79          complain_overflow_bitfield,/* complain_on_overflow */
80          bfd_elf_generic_reloc, /* special_function */
81          "R_ARM_ABS32",         /* name */
82          FALSE,                 /* partial_inplace */
83          0xffffffff,            /* src_mask */
84          0xffffffff,            /* dst_mask */
85          FALSE),                /* pcrel_offset */
86
87   /* standard 32bit pc-relative reloc */
88   HOWTO (R_ARM_REL32,           /* type */
89          0,                     /* rightshift */
90          2,                     /* size (0 = byte, 1 = short, 2 = long) */
91          32,                    /* bitsize */
92          TRUE,                  /* pc_relative */
93          0,                     /* bitpos */
94          complain_overflow_bitfield,/* complain_on_overflow */
95          bfd_elf_generic_reloc, /* special_function */
96          "R_ARM_REL32",         /* name */
97          FALSE,                 /* partial_inplace */
98          0xffffffff,            /* src_mask */
99          0xffffffff,            /* dst_mask */
100          TRUE),                 /* pcrel_offset */
101
102   /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
103   HOWTO (R_ARM_PC13,            /* type */
104          0,                     /* rightshift */
105          0,                     /* size (0 = byte, 1 = short, 2 = long) */
106          8,                     /* bitsize */
107          FALSE,                 /* pc_relative */
108          0,                     /* bitpos */
109          complain_overflow_bitfield,/* complain_on_overflow */
110          bfd_elf_generic_reloc, /* special_function */
111          "R_ARM_PC13",          /* name */
112          FALSE,                 /* partial_inplace */
113          0x000000ff,            /* src_mask */
114          0x000000ff,            /* dst_mask */
115          FALSE),                /* pcrel_offset */
116
117    /* 16 bit absolute */
118   HOWTO (R_ARM_ABS16,           /* type */
119          0,                     /* rightshift */
120          1,                     /* size (0 = byte, 1 = short, 2 = long) */
121          16,                    /* bitsize */
122          FALSE,                 /* pc_relative */
123          0,                     /* bitpos */
124          complain_overflow_bitfield,/* complain_on_overflow */
125          bfd_elf_generic_reloc, /* special_function */
126          "R_ARM_ABS16",         /* name */
127          FALSE,                 /* partial_inplace */
128          0x0000ffff,            /* src_mask */
129          0x0000ffff,            /* dst_mask */
130          FALSE),                /* pcrel_offset */
131
132   /* 12 bit absolute */
133   HOWTO (R_ARM_ABS12,           /* type */
134          0,                     /* rightshift */
135          2,                     /* size (0 = byte, 1 = short, 2 = long) */
136          12,                    /* bitsize */
137          FALSE,                 /* pc_relative */
138          0,                     /* bitpos */
139          complain_overflow_bitfield,/* complain_on_overflow */
140          bfd_elf_generic_reloc, /* special_function */
141          "R_ARM_ABS12",         /* name */
142          FALSE,                 /* partial_inplace */
143          0x000008ff,            /* src_mask */
144          0x000008ff,            /* dst_mask */
145          FALSE),                /* pcrel_offset */
146
147   HOWTO (R_ARM_THM_ABS5,        /* type */
148          6,                     /* rightshift */
149          1,                     /* size (0 = byte, 1 = short, 2 = long) */
150          5,                     /* bitsize */
151          FALSE,                 /* pc_relative */
152          0,                     /* bitpos */
153          complain_overflow_bitfield,/* complain_on_overflow */
154          bfd_elf_generic_reloc, /* special_function */
155          "R_ARM_THM_ABS5",      /* name */
156          FALSE,                 /* partial_inplace */
157          0x000007e0,            /* src_mask */
158          0x000007e0,            /* dst_mask */
159          FALSE),                /* pcrel_offset */
160
161   /* 8 bit absolute */
162   HOWTO (R_ARM_ABS8,            /* type */
163          0,                     /* rightshift */
164          0,                     /* size (0 = byte, 1 = short, 2 = long) */
165          8,                     /* bitsize */
166          FALSE,                 /* pc_relative */
167          0,                     /* bitpos */
168          complain_overflow_bitfield,/* complain_on_overflow */
169          bfd_elf_generic_reloc, /* special_function */
170          "R_ARM_ABS8",          /* name */
171          FALSE,                 /* partial_inplace */
172          0x000000ff,            /* src_mask */
173          0x000000ff,            /* dst_mask */
174          FALSE),                /* pcrel_offset */
175
176   HOWTO (R_ARM_SBREL32,         /* type */
177          0,                     /* rightshift */
178          2,                     /* size (0 = byte, 1 = short, 2 = long) */
179          32,                    /* bitsize */
180          FALSE,                 /* pc_relative */
181          0,                     /* bitpos */
182          complain_overflow_dont,/* complain_on_overflow */
183          bfd_elf_generic_reloc, /* special_function */
184          "R_ARM_SBREL32",       /* name */
185          FALSE,                 /* partial_inplace */
186          0xffffffff,            /* src_mask */
187          0xffffffff,            /* dst_mask */
188          FALSE),                /* pcrel_offset */
189
190   /* FIXME: Has two more bits of offset in Thumb32.  */
191   HOWTO (R_ARM_THM_CALL,        /* type */
192          1,                     /* rightshift */
193          2,                     /* size (0 = byte, 1 = short, 2 = long) */
194          23,                    /* bitsize */
195          TRUE,                  /* pc_relative */
196          0,                     /* bitpos */
197          complain_overflow_signed,/* complain_on_overflow */
198          bfd_elf_generic_reloc, /* special_function */
199          "R_ARM_THM_CALL",      /* name */
200          FALSE,                 /* partial_inplace */
201          0x07ff07ff,            /* src_mask */
202          0x07ff07ff,            /* dst_mask */
203          TRUE),                 /* pcrel_offset */
204
205   HOWTO (R_ARM_THM_PC8,         /* type */
206          1,                     /* rightshift */
207          1,                     /* size (0 = byte, 1 = short, 2 = long) */
208          8,                     /* bitsize */
209          TRUE,                  /* pc_relative */
210          0,                     /* bitpos */
211          complain_overflow_signed,/* complain_on_overflow */
212          bfd_elf_generic_reloc, /* special_function */
213          "R_ARM_THM_PC8",       /* name */
214          FALSE,                 /* partial_inplace */
215          0x000000ff,            /* src_mask */
216          0x000000ff,            /* dst_mask */
217          TRUE),                 /* pcrel_offset */
218
219   HOWTO (R_ARM_BREL_ADJ,        /* type */
220          1,                     /* rightshift */
221          1,                     /* size (0 = byte, 1 = short, 2 = long) */
222          32,                    /* bitsize */
223          FALSE,                 /* pc_relative */
224          0,                     /* bitpos */
225          complain_overflow_signed,/* complain_on_overflow */
226          bfd_elf_generic_reloc, /* special_function */
227          "R_ARM_BREL_ADJ",      /* name */
228          FALSE,                 /* partial_inplace */
229          0xffffffff,            /* src_mask */
230          0xffffffff,            /* dst_mask */
231          FALSE),                /* pcrel_offset */
232
233   HOWTO (R_ARM_SWI24,           /* type */
234          0,                     /* rightshift */
235          0,                     /* size (0 = byte, 1 = short, 2 = long) */
236          0,                     /* bitsize */
237          FALSE,                 /* pc_relative */
238          0,                     /* bitpos */
239          complain_overflow_signed,/* complain_on_overflow */
240          bfd_elf_generic_reloc, /* special_function */
241          "R_ARM_SWI24",         /* name */
242          FALSE,                 /* partial_inplace */
243          0x00000000,            /* src_mask */
244          0x00000000,            /* dst_mask */
245          FALSE),                /* pcrel_offset */
246
247   HOWTO (R_ARM_THM_SWI8,        /* type */
248          0,                     /* rightshift */
249          0,                     /* size (0 = byte, 1 = short, 2 = long) */
250          0,                     /* bitsize */
251          FALSE,                 /* pc_relative */
252          0,                     /* bitpos */
253          complain_overflow_signed,/* complain_on_overflow */
254          bfd_elf_generic_reloc, /* special_function */
255          "R_ARM_SWI8",          /* name */
256          FALSE,                 /* partial_inplace */
257          0x00000000,            /* src_mask */
258          0x00000000,            /* dst_mask */
259          FALSE),                /* pcrel_offset */
260
261   /* BLX instruction for the ARM.  */
262   HOWTO (R_ARM_XPC25,           /* type */
263          2,                     /* rightshift */
264          2,                     /* size (0 = byte, 1 = short, 2 = long) */
265          25,                    /* bitsize */
266          TRUE,                  /* pc_relative */
267          0,                     /* bitpos */
268          complain_overflow_signed,/* complain_on_overflow */
269          bfd_elf_generic_reloc, /* special_function */
270          "R_ARM_XPC25",         /* name */
271          FALSE,                 /* partial_inplace */
272          0x00ffffff,            /* src_mask */
273          0x00ffffff,            /* dst_mask */
274          TRUE),                 /* pcrel_offset */
275
276   /* BLX instruction for the Thumb.  */
277   HOWTO (R_ARM_THM_XPC22,       /* type */
278          2,                     /* rightshift */
279          2,                     /* size (0 = byte, 1 = short, 2 = long) */
280          22,                    /* bitsize */
281          TRUE,                  /* pc_relative */
282          0,                     /* bitpos */
283          complain_overflow_signed,/* complain_on_overflow */
284          bfd_elf_generic_reloc, /* special_function */
285          "R_ARM_THM_XPC22",     /* name */
286          FALSE,                 /* partial_inplace */
287          0x07ff07ff,            /* src_mask */
288          0x07ff07ff,            /* dst_mask */
289          TRUE),                 /* pcrel_offset */
290
291   /* Dynamic TLS relocations.  */
292
293   HOWTO (R_ARM_TLS_DTPMOD32,    /* type */
294          0,                     /* rightshift */
295          2,                     /* size (0 = byte, 1 = short, 2 = long) */
296          32,                    /* bitsize */
297          FALSE,                 /* pc_relative */
298          0,                     /* bitpos */
299          complain_overflow_bitfield,/* complain_on_overflow */
300          bfd_elf_generic_reloc, /* special_function */
301          "R_ARM_TLS_DTPMOD32",  /* name */
302          TRUE,                  /* partial_inplace */
303          0xffffffff,            /* src_mask */
304          0xffffffff,            /* dst_mask */
305          FALSE),                /* pcrel_offset */
306
307   HOWTO (R_ARM_TLS_DTPOFF32,    /* type */
308          0,                     /* rightshift */
309          2,                     /* size (0 = byte, 1 = short, 2 = long) */
310          32,                    /* bitsize */
311          FALSE,                 /* pc_relative */
312          0,                     /* bitpos */
313          complain_overflow_bitfield,/* complain_on_overflow */
314          bfd_elf_generic_reloc, /* special_function */
315          "R_ARM_TLS_DTPOFF32",  /* name */
316          TRUE,                  /* partial_inplace */
317          0xffffffff,            /* src_mask */
318          0xffffffff,            /* dst_mask */
319          FALSE),                /* pcrel_offset */
320
321   HOWTO (R_ARM_TLS_TPOFF32,     /* type */
322          0,                     /* rightshift */
323          2,                     /* size (0 = byte, 1 = short, 2 = long) */
324          32,                    /* bitsize */
325          FALSE,                 /* pc_relative */
326          0,                     /* bitpos */
327          complain_overflow_bitfield,/* complain_on_overflow */
328          bfd_elf_generic_reloc, /* special_function */
329          "R_ARM_TLS_TPOFF32",   /* name */
330          TRUE,                  /* partial_inplace */
331          0xffffffff,            /* src_mask */
332          0xffffffff,            /* dst_mask */
333          FALSE),                /* pcrel_offset */
334
335   /* Relocs used in ARM Linux */
336
337   HOWTO (R_ARM_COPY,            /* type */
338          0,                     /* rightshift */
339          2,                     /* size (0 = byte, 1 = short, 2 = long) */
340          32,                    /* bitsize */
341          FALSE,                 /* pc_relative */
342          0,                     /* bitpos */
343          complain_overflow_bitfield,/* complain_on_overflow */
344          bfd_elf_generic_reloc, /* special_function */
345          "R_ARM_COPY",          /* name */
346          TRUE,                  /* partial_inplace */
347          0xffffffff,            /* src_mask */
348          0xffffffff,            /* dst_mask */
349          FALSE),                /* pcrel_offset */
350
351   HOWTO (R_ARM_GLOB_DAT,        /* type */
352          0,                     /* rightshift */
353          2,                     /* size (0 = byte, 1 = short, 2 = long) */
354          32,                    /* bitsize */
355          FALSE,                 /* pc_relative */
356          0,                     /* bitpos */
357          complain_overflow_bitfield,/* complain_on_overflow */
358          bfd_elf_generic_reloc, /* special_function */
359          "R_ARM_GLOB_DAT",      /* name */
360          TRUE,                  /* partial_inplace */
361          0xffffffff,            /* src_mask */
362          0xffffffff,            /* dst_mask */
363          FALSE),                /* pcrel_offset */
364
365   HOWTO (R_ARM_JUMP_SLOT,       /* type */
366          0,                     /* rightshift */
367          2,                     /* size (0 = byte, 1 = short, 2 = long) */
368          32,                    /* bitsize */
369          FALSE,                 /* pc_relative */
370          0,                     /* bitpos */
371          complain_overflow_bitfield,/* complain_on_overflow */
372          bfd_elf_generic_reloc, /* special_function */
373          "R_ARM_JUMP_SLOT",     /* name */
374          TRUE,                  /* partial_inplace */
375          0xffffffff,            /* src_mask */
376          0xffffffff,            /* dst_mask */
377          FALSE),                /* pcrel_offset */
378
379   HOWTO (R_ARM_RELATIVE,        /* type */
380          0,                     /* rightshift */
381          2,                     /* size (0 = byte, 1 = short, 2 = long) */
382          32,                    /* bitsize */
383          FALSE,                 /* pc_relative */
384          0,                     /* bitpos */
385          complain_overflow_bitfield,/* complain_on_overflow */
386          bfd_elf_generic_reloc, /* special_function */
387          "R_ARM_RELATIVE",      /* name */
388          TRUE,                  /* partial_inplace */
389          0xffffffff,            /* src_mask */
390          0xffffffff,            /* dst_mask */
391          FALSE),                /* pcrel_offset */
392
393   HOWTO (R_ARM_GOTOFF32,        /* type */
394          0,                     /* rightshift */
395          2,                     /* size (0 = byte, 1 = short, 2 = long) */
396          32,                    /* bitsize */
397          FALSE,                 /* pc_relative */
398          0,                     /* bitpos */
399          complain_overflow_bitfield,/* complain_on_overflow */
400          bfd_elf_generic_reloc, /* special_function */
401          "R_ARM_GOTOFF32",      /* name */
402          TRUE,                  /* partial_inplace */
403          0xffffffff,            /* src_mask */
404          0xffffffff,            /* dst_mask */
405          FALSE),                /* pcrel_offset */
406
407   HOWTO (R_ARM_GOTPC,           /* type */
408          0,                     /* rightshift */
409          2,                     /* size (0 = byte, 1 = short, 2 = long) */
410          32,                    /* bitsize */
411          TRUE,                  /* pc_relative */
412          0,                     /* bitpos */
413          complain_overflow_bitfield,/* complain_on_overflow */
414          bfd_elf_generic_reloc, /* special_function */
415          "R_ARM_GOTPC",         /* name */
416          TRUE,                  /* partial_inplace */
417          0xffffffff,            /* src_mask */
418          0xffffffff,            /* dst_mask */
419          TRUE),                 /* pcrel_offset */
420
421   HOWTO (R_ARM_GOT32,           /* type */
422          0,                     /* rightshift */
423          2,                     /* size (0 = byte, 1 = short, 2 = long) */
424          32,                    /* bitsize */
425          FALSE,                 /* pc_relative */
426          0,                     /* bitpos */
427          complain_overflow_bitfield,/* complain_on_overflow */
428          bfd_elf_generic_reloc, /* special_function */
429          "R_ARM_GOT32",         /* name */
430          TRUE,                  /* partial_inplace */
431          0xffffffff,            /* src_mask */
432          0xffffffff,            /* dst_mask */
433          FALSE),                /* pcrel_offset */
434
435   HOWTO (R_ARM_PLT32,           /* type */
436          2,                     /* rightshift */
437          2,                     /* size (0 = byte, 1 = short, 2 = long) */
438          24,                    /* bitsize */
439          TRUE,                  /* pc_relative */
440          0,                     /* bitpos */
441          complain_overflow_bitfield,/* complain_on_overflow */
442          bfd_elf_generic_reloc, /* special_function */
443          "R_ARM_PLT32",         /* name */
444          FALSE,                 /* partial_inplace */
445          0x00ffffff,            /* src_mask */
446          0x00ffffff,            /* dst_mask */
447          TRUE),                 /* pcrel_offset */
448
449   HOWTO (R_ARM_CALL,            /* type */
450          2,                     /* rightshift */
451          2,                     /* size (0 = byte, 1 = short, 2 = long) */
452          24,                    /* bitsize */
453          TRUE,                  /* pc_relative */
454          0,                     /* bitpos */
455          complain_overflow_signed,/* complain_on_overflow */
456          bfd_elf_generic_reloc, /* special_function */
457          "R_ARM_CALL",          /* name */
458          FALSE,                 /* partial_inplace */
459          0x00ffffff,            /* src_mask */
460          0x00ffffff,            /* dst_mask */
461          TRUE),                 /* pcrel_offset */
462
463   HOWTO (R_ARM_JUMP24,          /* type */
464          2,                     /* rightshift */
465          2,                     /* size (0 = byte, 1 = short, 2 = long) */
466          24,                    /* bitsize */
467          TRUE,                  /* pc_relative */
468          0,                     /* bitpos */
469          complain_overflow_signed,/* complain_on_overflow */
470          bfd_elf_generic_reloc, /* special_function */
471          "R_ARM_JUMP24",        /* name */
472          FALSE,                 /* partial_inplace */
473          0x00ffffff,            /* src_mask */
474          0x00ffffff,            /* dst_mask */
475          TRUE),                 /* pcrel_offset */
476
477   HOWTO (R_ARM_THM_JUMP24,      /* type */
478          1,                     /* rightshift */
479          2,                     /* size (0 = byte, 1 = short, 2 = long) */
480          24,                    /* bitsize */
481          TRUE,                  /* pc_relative */
482          0,                     /* bitpos */
483          complain_overflow_signed,/* complain_on_overflow */
484          bfd_elf_generic_reloc, /* special_function */
485          "R_ARM_THM_JUMP24",    /* name */
486          FALSE,                 /* partial_inplace */
487          0x07ff2fff,            /* src_mask */
488          0x07ff2fff,            /* dst_mask */
489          TRUE),                 /* pcrel_offset */
490
491   HOWTO (R_ARM_BASE_ABS,        /* type */
492          0,                     /* rightshift */
493          2,                     /* size (0 = byte, 1 = short, 2 = long) */
494          32,                    /* bitsize */
495          FALSE,                 /* pc_relative */
496          0,                     /* bitpos */
497          complain_overflow_dont,/* complain_on_overflow */
498          bfd_elf_generic_reloc, /* special_function */
499          "R_ARM_BASE_ABS",      /* name */
500          FALSE,                 /* partial_inplace */
501          0xffffffff,            /* src_mask */
502          0xffffffff,            /* dst_mask */
503          FALSE),                /* pcrel_offset */
504
505   HOWTO (R_ARM_ALU_PCREL7_0,    /* type */
506          0,                     /* rightshift */
507          2,                     /* size (0 = byte, 1 = short, 2 = long) */
508          12,                    /* bitsize */
509          TRUE,                  /* pc_relative */
510          0,                     /* bitpos */
511          complain_overflow_dont,/* complain_on_overflow */
512          bfd_elf_generic_reloc, /* special_function */
513          "R_ARM_ALU_PCREL_7_0", /* name */
514          FALSE,                 /* partial_inplace */
515          0x00000fff,            /* src_mask */
516          0x00000fff,            /* dst_mask */
517          TRUE),                 /* pcrel_offset */
518
519   HOWTO (R_ARM_ALU_PCREL15_8,   /* type */
520          0,                     /* rightshift */
521          2,                     /* size (0 = byte, 1 = short, 2 = long) */
522          12,                    /* bitsize */
523          TRUE,                  /* pc_relative */
524          8,                     /* bitpos */
525          complain_overflow_dont,/* complain_on_overflow */
526          bfd_elf_generic_reloc, /* special_function */
527          "R_ARM_ALU_PCREL_15_8",/* name */
528          FALSE,                 /* partial_inplace */
529          0x00000fff,            /* src_mask */
530          0x00000fff,            /* dst_mask */
531          TRUE),                 /* pcrel_offset */
532
533   HOWTO (R_ARM_ALU_PCREL23_15,  /* type */
534          0,                     /* rightshift */
535          2,                     /* size (0 = byte, 1 = short, 2 = long) */
536          12,                    /* bitsize */
537          TRUE,                  /* pc_relative */
538          16,                    /* bitpos */
539          complain_overflow_dont,/* complain_on_overflow */
540          bfd_elf_generic_reloc, /* special_function */
541          "R_ARM_ALU_PCREL_23_15",/* name */
542          FALSE,                 /* partial_inplace */
543          0x00000fff,            /* src_mask */
544          0x00000fff,            /* dst_mask */
545          TRUE),                 /* pcrel_offset */
546
547   HOWTO (R_ARM_LDR_SBREL_11_0,  /* type */
548          0,                     /* rightshift */
549          2,                     /* size (0 = byte, 1 = short, 2 = long) */
550          12,                    /* bitsize */
551          FALSE,                 /* pc_relative */
552          0,                     /* bitpos */
553          complain_overflow_dont,/* complain_on_overflow */
554          bfd_elf_generic_reloc, /* special_function */
555          "R_ARM_LDR_SBREL_11_0",/* name */
556          FALSE,                 /* partial_inplace */
557          0x00000fff,            /* src_mask */
558          0x00000fff,            /* dst_mask */
559          FALSE),                /* pcrel_offset */
560
561   HOWTO (R_ARM_ALU_SBREL_19_12, /* type */
562          0,                     /* rightshift */
563          2,                     /* size (0 = byte, 1 = short, 2 = long) */
564          8,                     /* bitsize */
565          FALSE,                 /* pc_relative */
566          12,                    /* bitpos */
567          complain_overflow_dont,/* complain_on_overflow */
568          bfd_elf_generic_reloc, /* special_function */
569          "R_ARM_ALU_SBREL_19_12",/* name */
570          FALSE,                 /* partial_inplace */
571          0x000ff000,            /* src_mask */
572          0x000ff000,            /* dst_mask */
573          FALSE),                /* pcrel_offset */
574
575   HOWTO (R_ARM_ALU_SBREL_27_20, /* type */
576          0,                     /* rightshift */
577          2,                     /* size (0 = byte, 1 = short, 2 = long) */
578          8,                     /* bitsize */
579          FALSE,                 /* pc_relative */
580          20,                    /* bitpos */
581          complain_overflow_dont,/* complain_on_overflow */
582          bfd_elf_generic_reloc, /* special_function */
583          "R_ARM_ALU_SBREL_27_20",/* name */
584          FALSE,                 /* partial_inplace */
585          0x0ff00000,            /* src_mask */
586          0x0ff00000,            /* dst_mask */
587          FALSE),                /* pcrel_offset */
588
589   HOWTO (R_ARM_TARGET1,         /* type */
590          0,                     /* rightshift */
591          2,                     /* size (0 = byte, 1 = short, 2 = long) */
592          32,                    /* bitsize */
593          FALSE,                 /* pc_relative */
594          0,                     /* bitpos */
595          complain_overflow_dont,/* complain_on_overflow */
596          bfd_elf_generic_reloc, /* special_function */
597          "R_ARM_TARGET1",       /* name */
598          FALSE,                 /* partial_inplace */
599          0xffffffff,            /* src_mask */
600          0xffffffff,            /* dst_mask */
601          FALSE),                /* pcrel_offset */
602
603   HOWTO (R_ARM_ROSEGREL32,      /* type */
604          0,                     /* rightshift */
605          2,                     /* size (0 = byte, 1 = short, 2 = long) */
606          32,                    /* bitsize */
607          FALSE,                 /* pc_relative */
608          0,                     /* bitpos */
609          complain_overflow_dont,/* complain_on_overflow */
610          bfd_elf_generic_reloc, /* special_function */
611          "R_ARM_ROSEGREL32",    /* name */
612          FALSE,                 /* partial_inplace */
613          0xffffffff,            /* src_mask */
614          0xffffffff,            /* dst_mask */
615          FALSE),                /* pcrel_offset */
616
617   HOWTO (R_ARM_V4BX,            /* type */
618          0,                     /* rightshift */
619          2,                     /* size (0 = byte, 1 = short, 2 = long) */
620          32,                    /* bitsize */
621          FALSE,                 /* pc_relative */
622          0,                     /* bitpos */
623          complain_overflow_dont,/* complain_on_overflow */
624          bfd_elf_generic_reloc, /* special_function */
625          "R_ARM_V4BX",          /* name */
626          FALSE,                 /* partial_inplace */
627          0xffffffff,            /* src_mask */
628          0xffffffff,            /* dst_mask */
629          FALSE),                /* pcrel_offset */
630
631   HOWTO (R_ARM_TARGET2,         /* type */
632          0,                     /* rightshift */
633          2,                     /* size (0 = byte, 1 = short, 2 = long) */
634          32,                    /* bitsize */
635          FALSE,                 /* pc_relative */
636          0,                     /* bitpos */
637          complain_overflow_signed,/* complain_on_overflow */
638          bfd_elf_generic_reloc, /* special_function */
639          "R_ARM_TARGET2",       /* name */
640          FALSE,                 /* partial_inplace */
641          0xffffffff,            /* src_mask */
642          0xffffffff,            /* dst_mask */
643          TRUE),                 /* pcrel_offset */
644
645   HOWTO (R_ARM_PREL31,          /* type */
646          0,                     /* rightshift */
647          2,                     /* size (0 = byte, 1 = short, 2 = long) */
648          31,                    /* bitsize */
649          TRUE,                  /* pc_relative */
650          0,                     /* bitpos */
651          complain_overflow_signed,/* complain_on_overflow */
652          bfd_elf_generic_reloc, /* special_function */
653          "R_ARM_PREL31",        /* name */
654          FALSE,                 /* partial_inplace */
655          0x7fffffff,            /* src_mask */
656          0x7fffffff,            /* dst_mask */
657          TRUE),                 /* pcrel_offset */
658
659   HOWTO (R_ARM_MOVW_ABS_NC,     /* type */
660          0,                     /* rightshift */
661          2,                     /* size (0 = byte, 1 = short, 2 = long) */
662          16,                    /* bitsize */
663          FALSE,                 /* pc_relative */
664          0,                     /* bitpos */
665          complain_overflow_dont,/* complain_on_overflow */
666          bfd_elf_generic_reloc, /* special_function */
667          "R_ARM_MOVW_ABS_NC",   /* name */
668          FALSE,                 /* partial_inplace */
669          0x0000ffff,            /* src_mask */
670          0x0000ffff,            /* dst_mask */
671          FALSE),                /* pcrel_offset */
672
673   HOWTO (R_ARM_MOVT_ABS,        /* type */
674          0,                     /* rightshift */
675          2,                     /* size (0 = byte, 1 = short, 2 = long) */
676          16,                    /* bitsize */
677          FALSE,                 /* pc_relative */
678          0,                     /* bitpos */
679          complain_overflow_bitfield,/* complain_on_overflow */
680          bfd_elf_generic_reloc, /* special_function */
681          "R_ARM_MOVT_ABS",      /* name */
682          FALSE,                 /* partial_inplace */
683          0x0000ffff,            /* src_mask */
684          0x0000ffff,            /* dst_mask */
685          FALSE),                /* pcrel_offset */
686
687   HOWTO (R_ARM_MOVW_PREL_NC,    /* type */
688          0,                     /* rightshift */
689          2,                     /* size (0 = byte, 1 = short, 2 = long) */
690          16,                    /* bitsize */
691          TRUE,                  /* pc_relative */
692          0,                     /* bitpos */
693          complain_overflow_dont,/* complain_on_overflow */
694          bfd_elf_generic_reloc, /* special_function */
695          "R_ARM_MOVW_PREL_NC",  /* name */
696          FALSE,                 /* partial_inplace */
697          0x0000ffff,            /* src_mask */
698          0x0000ffff,            /* dst_mask */
699          TRUE),                 /* pcrel_offset */
700
701   HOWTO (R_ARM_MOVT_PREL,       /* type */
702          0,                     /* rightshift */
703          2,                     /* size (0 = byte, 1 = short, 2 = long) */
704          16,                    /* bitsize */
705          TRUE,                  /* pc_relative */
706          0,                     /* bitpos */
707          complain_overflow_bitfield,/* complain_on_overflow */
708          bfd_elf_generic_reloc, /* special_function */
709          "R_ARM_MOVT_PREL",     /* name */
710          FALSE,                 /* partial_inplace */
711          0x0000ffff,            /* src_mask */
712          0x0000ffff,            /* dst_mask */
713          TRUE),                 /* pcrel_offset */
714
715   HOWTO (R_ARM_THM_MOVW_ABS_NC, /* type */
716          0,                     /* rightshift */
717          2,                     /* size (0 = byte, 1 = short, 2 = long) */
718          16,                    /* bitsize */
719          FALSE,                 /* pc_relative */
720          0,                     /* bitpos */
721          complain_overflow_dont,/* complain_on_overflow */
722          bfd_elf_generic_reloc, /* special_function */
723          "R_ARM_THM_MOVW_ABS_NC",/* name */
724          FALSE,                 /* partial_inplace */
725          0x040f70ff,            /* src_mask */
726          0x040f70ff,            /* dst_mask */
727          FALSE),                /* pcrel_offset */
728
729   HOWTO (R_ARM_THM_MOVT_ABS,    /* type */
730          0,                     /* rightshift */
731          2,                     /* size (0 = byte, 1 = short, 2 = long) */
732          16,                    /* bitsize */
733          FALSE,                 /* pc_relative */
734          0,                     /* bitpos */
735          complain_overflow_bitfield,/* complain_on_overflow */
736          bfd_elf_generic_reloc, /* special_function */
737          "R_ARM_THM_MOVT_ABS",  /* name */
738          FALSE,                 /* partial_inplace */
739          0x040f70ff,            /* src_mask */
740          0x040f70ff,            /* dst_mask */
741          FALSE),                /* pcrel_offset */
742
743   HOWTO (R_ARM_THM_MOVW_PREL_NC,/* type */
744          0,                     /* rightshift */
745          2,                     /* size (0 = byte, 1 = short, 2 = long) */
746          16,                    /* bitsize */
747          TRUE,                  /* pc_relative */
748          0,                     /* bitpos */
749          complain_overflow_dont,/* complain_on_overflow */
750          bfd_elf_generic_reloc, /* special_function */
751          "R_ARM_THM_MOVW_PREL_NC",/* name */
752          FALSE,                 /* partial_inplace */
753          0x040f70ff,            /* src_mask */
754          0x040f70ff,            /* dst_mask */
755          TRUE),                 /* pcrel_offset */
756
757   HOWTO (R_ARM_THM_MOVT_PREL,   /* type */
758          0,                     /* rightshift */
759          2,                     /* size (0 = byte, 1 = short, 2 = long) */
760          16,                    /* bitsize */
761          TRUE,                  /* pc_relative */
762          0,                     /* bitpos */
763          complain_overflow_bitfield,/* complain_on_overflow */
764          bfd_elf_generic_reloc, /* special_function */
765          "R_ARM_THM_MOVT_PREL", /* name */
766          FALSE,                 /* partial_inplace */
767          0x040f70ff,            /* src_mask */
768          0x040f70ff,            /* dst_mask */
769          TRUE),                 /* pcrel_offset */
770
771   HOWTO (R_ARM_THM_JUMP19,      /* type */
772          1,                     /* rightshift */
773          2,                     /* size (0 = byte, 1 = short, 2 = long) */
774          19,                    /* bitsize */
775          TRUE,                  /* pc_relative */
776          0,                     /* bitpos */
777          complain_overflow_signed,/* complain_on_overflow */
778          bfd_elf_generic_reloc, /* special_function */
779          "R_ARM_THM_JUMP19",    /* name */
780          FALSE,                 /* partial_inplace */
781          0x043f2fff,            /* src_mask */
782          0x043f2fff,            /* dst_mask */
783          TRUE),                 /* pcrel_offset */
784
785   HOWTO (R_ARM_THM_JUMP6,       /* type */
786          1,                     /* rightshift */
787          1,                     /* size (0 = byte, 1 = short, 2 = long) */
788          6,                     /* bitsize */
789          TRUE,                  /* pc_relative */
790          0,                     /* bitpos */
791          complain_overflow_unsigned,/* complain_on_overflow */
792          bfd_elf_generic_reloc, /* special_function */
793          "R_ARM_THM_JUMP6",     /* name */
794          FALSE,                 /* partial_inplace */
795          0x02f8,                /* src_mask */
796          0x02f8,                /* dst_mask */
797          TRUE),                 /* pcrel_offset */
798
799   /* These are declared as 13-bit signed relocations because we can
800      address -4095 .. 4095(base) by altering ADDW to SUBW or vice
801      versa.  */
802   HOWTO (R_ARM_THM_ALU_PREL_11_0,/* type */
803          0,                     /* rightshift */
804          2,                     /* size (0 = byte, 1 = short, 2 = long) */
805          13,                    /* bitsize */
806          TRUE,                  /* pc_relative */
807          0,                     /* bitpos */
808          complain_overflow_signed,/* complain_on_overflow */
809          bfd_elf_generic_reloc, /* special_function */
810          "R_ARM_THM_ALU_PREL_11_0",/* name */
811          FALSE,                 /* partial_inplace */
812          0x040070ff,            /* src_mask */
813          0x040070ff,            /* dst_mask */
814          TRUE),                 /* pcrel_offset */
815
816   HOWTO (R_ARM_THM_PC12,        /* type */
817          0,                     /* rightshift */
818          2,                     /* size (0 = byte, 1 = short, 2 = long) */
819          13,                    /* bitsize */
820          TRUE,                  /* pc_relative */
821          0,                     /* bitpos */
822          complain_overflow_signed,/* complain_on_overflow */
823          bfd_elf_generic_reloc, /* special_function */
824          "R_ARM_THM_PC12",      /* name */
825          FALSE,                 /* partial_inplace */
826          0x040070ff,            /* src_mask */
827          0x040070ff,            /* dst_mask */
828          TRUE),                 /* pcrel_offset */
829
830   HOWTO (R_ARM_ABS32_NOI,       /* type */
831          0,                     /* rightshift */
832          2,                     /* size (0 = byte, 1 = short, 2 = long) */
833          32,                    /* bitsize */
834          FALSE,                 /* pc_relative */
835          0,                     /* bitpos */
836          complain_overflow_dont,/* complain_on_overflow */
837          bfd_elf_generic_reloc, /* special_function */
838          "R_ARM_ABS32_NOI",     /* name */
839          FALSE,                 /* partial_inplace */
840          0xffffffff,            /* src_mask */
841          0xffffffff,            /* dst_mask */
842          FALSE),                /* pcrel_offset */
843
844   HOWTO (R_ARM_REL32_NOI,       /* type */
845          0,                     /* rightshift */
846          2,                     /* size (0 = byte, 1 = short, 2 = long) */
847          32,                    /* bitsize */
848          TRUE,                  /* pc_relative */
849          0,                     /* bitpos */
850          complain_overflow_dont,/* complain_on_overflow */
851          bfd_elf_generic_reloc, /* special_function */
852          "R_ARM_REL32_NOI",     /* name */
853          FALSE,                 /* partial_inplace */
854          0xffffffff,            /* src_mask */
855          0xffffffff,            /* dst_mask */
856          FALSE),                /* pcrel_offset */
857 };
858
859 /* Relocations 57 .. 83 are the "group relocations" which we do not
860    support.  */
861
862 static reloc_howto_type elf32_arm_howto_table_2[] =
863 {
864   HOWTO (R_ARM_MOVW_BREL_NC,    /* type */
865          0,                     /* rightshift */
866          2,                     /* size (0 = byte, 1 = short, 2 = long) */
867          16,                    /* bitsize */
868          FALSE,                 /* pc_relative */
869          0,                     /* bitpos */
870          complain_overflow_dont,/* complain_on_overflow */
871          bfd_elf_generic_reloc, /* special_function */
872          "R_ARM_MOVW_BREL_NC",  /* name */
873          FALSE,                 /* partial_inplace */
874          0x0000ffff,            /* src_mask */
875          0x0000ffff,            /* dst_mask */
876          FALSE),                /* pcrel_offset */
877
878   HOWTO (R_ARM_MOVT_BREL,       /* type */
879          0,                     /* rightshift */
880          2,                     /* size (0 = byte, 1 = short, 2 = long) */
881          16,                    /* bitsize */
882          FALSE,                 /* pc_relative */
883          0,                     /* bitpos */
884          complain_overflow_bitfield,/* complain_on_overflow */
885          bfd_elf_generic_reloc, /* special_function */
886          "R_ARM_MOVT_BREL",     /* name */
887          FALSE,                 /* partial_inplace */
888          0x0000ffff,            /* src_mask */
889          0x0000ffff,            /* dst_mask */
890          FALSE),                /* pcrel_offset */
891
892   HOWTO (R_ARM_MOVW_BREL,       /* type */
893          0,                     /* rightshift */
894          2,                     /* size (0 = byte, 1 = short, 2 = long) */
895          16,                    /* bitsize */
896          FALSE,                 /* pc_relative */
897          0,                     /* bitpos */
898          complain_overflow_dont,/* complain_on_overflow */
899          bfd_elf_generic_reloc, /* special_function */
900          "R_ARM_MOVW_BREL",     /* name */
901          FALSE,                 /* partial_inplace */
902          0x0000ffff,            /* src_mask */
903          0x0000ffff,            /* dst_mask */
904          FALSE),                /* pcrel_offset */
905
906   HOWTO (R_ARM_THM_MOVW_BREL_NC,/* type */
907          0,                     /* rightshift */
908          2,                     /* size (0 = byte, 1 = short, 2 = long) */
909          16,                    /* bitsize */
910          FALSE,                 /* pc_relative */
911          0,                     /* bitpos */
912          complain_overflow_dont,/* complain_on_overflow */
913          bfd_elf_generic_reloc, /* special_function */
914          "R_ARM_THM_MOVW_BREL_NC",/* name */
915          FALSE,                 /* partial_inplace */
916          0x040f70ff,            /* src_mask */
917          0x040f70ff,            /* dst_mask */
918          FALSE),                /* pcrel_offset */
919
920   HOWTO (R_ARM_THM_MOVT_BREL,   /* type */
921          0,                     /* rightshift */
922          2,                     /* size (0 = byte, 1 = short, 2 = long) */
923          16,                    /* bitsize */
924          FALSE,                 /* pc_relative */
925          0,                     /* bitpos */
926          complain_overflow_bitfield,/* complain_on_overflow */
927          bfd_elf_generic_reloc, /* special_function */
928          "R_ARM_THM_MOVT_BREL", /* name */
929          FALSE,                 /* partial_inplace */
930          0x040f70ff,            /* src_mask */
931          0x040f70ff,            /* dst_mask */
932          FALSE),                /* pcrel_offset */
933
934   HOWTO (R_ARM_THM_MOVW_BREL,   /* type */
935          0,                     /* rightshift */
936          2,                     /* size (0 = byte, 1 = short, 2 = long) */
937          16,                    /* bitsize */
938          FALSE,                 /* pc_relative */
939          0,                     /* bitpos */
940          complain_overflow_dont,/* complain_on_overflow */
941          bfd_elf_generic_reloc, /* special_function */
942          "R_ARM_THM_MOVW_BREL", /* name */
943          FALSE,                 /* partial_inplace */
944          0x040f70ff,            /* src_mask */
945          0x040f70ff,            /* dst_mask */
946          FALSE),                /* pcrel_offset */
947
948   EMPTY_HOWTO (90),   /* unallocated */
949   EMPTY_HOWTO (91),
950   EMPTY_HOWTO (92),
951   EMPTY_HOWTO (93),
952
953   HOWTO (R_ARM_PLT32_ABS,       /* type */
954          0,                     /* rightshift */
955          2,                     /* size (0 = byte, 1 = short, 2 = long) */
956          32,                    /* bitsize */
957          FALSE,                 /* pc_relative */
958          0,                     /* bitpos */
959          complain_overflow_dont,/* complain_on_overflow */
960          bfd_elf_generic_reloc, /* special_function */
961          "R_ARM_PLT32_ABS",     /* name */
962          FALSE,                 /* partial_inplace */
963          0xffffffff,            /* src_mask */
964          0xffffffff,            /* dst_mask */
965          FALSE),                /* pcrel_offset */
966
967   HOWTO (R_ARM_GOT_ABS,         /* type */
968          0,                     /* rightshift */
969          2,                     /* size (0 = byte, 1 = short, 2 = long) */
970          32,                    /* bitsize */
971          FALSE,                 /* pc_relative */
972          0,                     /* bitpos */
973          complain_overflow_dont,/* complain_on_overflow */
974          bfd_elf_generic_reloc, /* special_function */
975          "R_ARM_GOT_ABS",       /* name */
976          FALSE,                 /* partial_inplace */
977          0xffffffff,            /* src_mask */
978          0xffffffff,            /* dst_mask */
979          FALSE),                        /* pcrel_offset */
980
981   HOWTO (R_ARM_GOT_PREL,        /* type */
982          0,                     /* rightshift */
983          2,                     /* size (0 = byte, 1 = short, 2 = long) */
984          32,                    /* bitsize */
985          TRUE,                  /* pc_relative */
986          0,                     /* bitpos */
987          complain_overflow_dont,        /* complain_on_overflow */
988          bfd_elf_generic_reloc, /* special_function */
989          "R_ARM_GOT_PREL",      /* name */
990          FALSE,                 /* partial_inplace */
991          0xffffffff,            /* src_mask */
992          0xffffffff,            /* dst_mask */
993          TRUE),                 /* pcrel_offset */
994
995   HOWTO (R_ARM_GOT_BREL12,      /* type */
996          0,                     /* rightshift */
997          2,                     /* size (0 = byte, 1 = short, 2 = long) */
998          12,                    /* bitsize */
999          FALSE,                 /* pc_relative */
1000          0,                     /* bitpos */
1001          complain_overflow_bitfield,/* complain_on_overflow */
1002          bfd_elf_generic_reloc, /* special_function */
1003          "R_ARM_GOT_BREL12",    /* name */
1004          FALSE,                 /* partial_inplace */
1005          0x00000fff,            /* src_mask */
1006          0x00000fff,            /* dst_mask */
1007          FALSE),                /* pcrel_offset */
1008
1009   HOWTO (R_ARM_GOTOFF12,        /* type */
1010          0,                     /* rightshift */
1011          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1012          12,                    /* bitsize */
1013          FALSE,                 /* pc_relative */
1014          0,                     /* bitpos */
1015          complain_overflow_bitfield,/* complain_on_overflow */
1016          bfd_elf_generic_reloc, /* special_function */
1017          "R_ARM_GOTOFF12",      /* name */
1018          FALSE,                 /* partial_inplace */
1019          0x00000fff,            /* src_mask */
1020          0x00000fff,            /* dst_mask */
1021          FALSE),                /* pcrel_offset */
1022
1023   EMPTY_HOWTO (R_ARM_GOTRELAX),  /* reserved for future GOT-load optimizations */
1024
1025   /* GNU extension to record C++ vtable member usage */
1026   HOWTO (R_ARM_GNU_VTENTRY,     /* type */
1027          0,                     /* rightshift */
1028          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1029          0,                     /* bitsize */
1030          FALSE,                 /* pc_relative */
1031          0,                     /* bitpos */
1032          complain_overflow_dont, /* complain_on_overflow */
1033          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
1034          "R_ARM_GNU_VTENTRY",   /* name */
1035          FALSE,                 /* partial_inplace */
1036          0,                     /* src_mask */
1037          0,                     /* dst_mask */
1038          FALSE),                /* pcrel_offset */
1039
1040   /* GNU extension to record C++ vtable hierarchy */
1041   HOWTO (R_ARM_GNU_VTINHERIT, /* type */
1042          0,                     /* rightshift */
1043          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1044          0,                     /* bitsize */
1045          FALSE,                 /* pc_relative */
1046          0,                     /* bitpos */
1047          complain_overflow_dont, /* complain_on_overflow */
1048          NULL,                  /* special_function */
1049          "R_ARM_GNU_VTINHERIT", /* name */
1050          FALSE,                 /* partial_inplace */
1051          0,                     /* src_mask */
1052          0,                     /* dst_mask */
1053          FALSE),                /* pcrel_offset */
1054
1055   HOWTO (R_ARM_THM_JUMP11,      /* type */
1056          1,                     /* rightshift */
1057          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1058          11,                    /* bitsize */
1059          TRUE,                  /* pc_relative */
1060          0,                     /* bitpos */
1061          complain_overflow_signed,      /* complain_on_overflow */
1062          bfd_elf_generic_reloc, /* special_function */
1063          "R_ARM_THM_JUMP11",    /* name */
1064          FALSE,                 /* partial_inplace */
1065          0x000007ff,            /* src_mask */
1066          0x000007ff,            /* dst_mask */
1067          TRUE),                 /* pcrel_offset */
1068
1069   HOWTO (R_ARM_THM_JUMP8,       /* type */
1070          1,                     /* rightshift */
1071          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1072          8,                     /* bitsize */
1073          TRUE,                  /* pc_relative */
1074          0,                     /* bitpos */
1075          complain_overflow_signed,      /* complain_on_overflow */
1076          bfd_elf_generic_reloc, /* special_function */
1077          "R_ARM_THM_JUMP8",     /* name */
1078          FALSE,                 /* partial_inplace */
1079          0x000000ff,            /* src_mask */
1080          0x000000ff,            /* dst_mask */
1081          TRUE),                 /* pcrel_offset */
1082
1083   /* TLS relocations */
1084   HOWTO (R_ARM_TLS_GD32,        /* type */
1085          0,                     /* rightshift */
1086          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1087          32,                    /* bitsize */
1088          FALSE,                 /* pc_relative */
1089          0,                     /* bitpos */
1090          complain_overflow_bitfield,/* complain_on_overflow */
1091          NULL,                  /* special_function */
1092          "R_ARM_TLS_GD32",      /* name */
1093          TRUE,                  /* partial_inplace */
1094          0xffffffff,            /* src_mask */
1095          0xffffffff,            /* dst_mask */
1096          FALSE),                /* pcrel_offset */
1097
1098   HOWTO (R_ARM_TLS_LDM32,       /* type */
1099          0,                     /* rightshift */
1100          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1101          32,                    /* bitsize */
1102          FALSE,                 /* pc_relative */
1103          0,                     /* bitpos */
1104          complain_overflow_bitfield,/* complain_on_overflow */
1105          bfd_elf_generic_reloc, /* special_function */
1106          "R_ARM_TLS_LDM32",     /* name */
1107          TRUE,                  /* partial_inplace */
1108          0xffffffff,            /* src_mask */
1109          0xffffffff,            /* dst_mask */
1110          FALSE),                /* pcrel_offset */
1111
1112   HOWTO (R_ARM_TLS_LDO32,       /* type */
1113          0,                     /* rightshift */
1114          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1115          32,                    /* bitsize */
1116          FALSE,                 /* pc_relative */
1117          0,                     /* bitpos */
1118          complain_overflow_bitfield,/* complain_on_overflow */
1119          bfd_elf_generic_reloc, /* special_function */
1120          "R_ARM_TLS_LDO32",     /* name */
1121          TRUE,                  /* partial_inplace */
1122          0xffffffff,            /* src_mask */
1123          0xffffffff,            /* dst_mask */
1124          FALSE),                /* pcrel_offset */
1125
1126   HOWTO (R_ARM_TLS_IE32,        /* type */
1127          0,                     /* rightshift */
1128          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1129          32,                    /* bitsize */
1130          FALSE,                  /* pc_relative */
1131          0,                     /* bitpos */
1132          complain_overflow_bitfield,/* complain_on_overflow */
1133          NULL,                  /* special_function */
1134          "R_ARM_TLS_IE32",      /* name */
1135          TRUE,                  /* partial_inplace */
1136          0xffffffff,            /* src_mask */
1137          0xffffffff,            /* dst_mask */
1138          FALSE),                /* pcrel_offset */
1139
1140   HOWTO (R_ARM_TLS_LE32,        /* type */
1141          0,                     /* rightshift */
1142          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1143          32,                    /* bitsize */
1144          FALSE,                 /* pc_relative */
1145          0,                     /* bitpos */
1146          complain_overflow_bitfield,/* complain_on_overflow */
1147          bfd_elf_generic_reloc, /* special_function */
1148          "R_ARM_TLS_LE32",      /* name */
1149          TRUE,                  /* partial_inplace */
1150          0xffffffff,            /* src_mask */
1151          0xffffffff,            /* dst_mask */
1152          FALSE),                /* pcrel_offset */
1153
1154   HOWTO (R_ARM_TLS_LDO12,       /* type */
1155          0,                     /* rightshift */
1156          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1157          12,                    /* bitsize */
1158          FALSE,                 /* pc_relative */
1159          0,                     /* bitpos */
1160          complain_overflow_bitfield,/* complain_on_overflow */
1161          bfd_elf_generic_reloc, /* special_function */
1162          "R_ARM_TLS_LDO12",     /* name */
1163          FALSE,                 /* partial_inplace */
1164          0x00000fff,            /* src_mask */
1165          0x00000fff,            /* dst_mask */
1166          FALSE),                /* pcrel_offset */
1167
1168   HOWTO (R_ARM_TLS_LE12,        /* type */
1169          0,                     /* rightshift */
1170          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1171          12,                    /* bitsize */
1172          FALSE,                 /* pc_relative */
1173          0,                     /* bitpos */
1174          complain_overflow_bitfield,/* complain_on_overflow */
1175          bfd_elf_generic_reloc, /* special_function */
1176          "R_ARM_TLS_LE12",      /* name */
1177          FALSE,                 /* partial_inplace */
1178          0x00000fff,            /* src_mask */
1179          0x00000fff,            /* dst_mask */
1180          FALSE),                /* pcrel_offset */
1181
1182   HOWTO (R_ARM_TLS_IE12GP,      /* type */
1183          0,                     /* rightshift */
1184          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1185          12,                    /* bitsize */
1186          FALSE,                 /* pc_relative */
1187          0,                     /* bitpos */
1188          complain_overflow_bitfield,/* complain_on_overflow */
1189          bfd_elf_generic_reloc, /* special_function */
1190          "R_ARM_TLS_IE12GP",    /* name */
1191          FALSE,                 /* partial_inplace */
1192          0x00000fff,            /* src_mask */
1193          0x00000fff,            /* dst_mask */
1194          FALSE),                /* pcrel_offset */
1195 };
1196
1197 /* 112-127 private relocations
1198    128 R_ARM_ME_TOO, obsolete
1199    129-255 unallocated in AAELF.
1200
1201    249-255 extended, currently unused, relocations:  */
1202
1203 static reloc_howto_type elf32_arm_howto_table_3[4] =
1204 {
1205   HOWTO (R_ARM_RREL32,          /* type */
1206          0,                     /* rightshift */
1207          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1208          0,                     /* bitsize */
1209          FALSE,                 /* pc_relative */
1210          0,                     /* bitpos */
1211          complain_overflow_dont,/* complain_on_overflow */
1212          bfd_elf_generic_reloc, /* special_function */
1213          "R_ARM_RREL32",        /* name */
1214          FALSE,                 /* partial_inplace */
1215          0,                     /* src_mask */
1216          0,                     /* dst_mask */
1217          FALSE),                /* pcrel_offset */
1218
1219   HOWTO (R_ARM_RABS32,          /* type */
1220          0,                     /* rightshift */
1221          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1222          0,                     /* bitsize */
1223          FALSE,                 /* pc_relative */
1224          0,                     /* bitpos */
1225          complain_overflow_dont,/* complain_on_overflow */
1226          bfd_elf_generic_reloc, /* special_function */
1227          "R_ARM_RABS32",        /* name */
1228          FALSE,                 /* partial_inplace */
1229          0,                     /* src_mask */
1230          0,                     /* dst_mask */
1231          FALSE),                /* pcrel_offset */
1232
1233   HOWTO (R_ARM_RPC24,           /* type */
1234          0,                     /* rightshift */
1235          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1236          0,                     /* bitsize */
1237          FALSE,                 /* pc_relative */
1238          0,                     /* bitpos */
1239          complain_overflow_dont,/* complain_on_overflow */
1240          bfd_elf_generic_reloc, /* special_function */
1241          "R_ARM_RPC24",         /* name */
1242          FALSE,                 /* partial_inplace */
1243          0,                     /* src_mask */
1244          0,                     /* dst_mask */
1245          FALSE),                /* pcrel_offset */
1246
1247   HOWTO (R_ARM_RBASE,           /* type */
1248          0,                     /* rightshift */
1249          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1250          0,                     /* bitsize */
1251          FALSE,                 /* pc_relative */
1252          0,                     /* bitpos */
1253          complain_overflow_dont,/* complain_on_overflow */
1254          bfd_elf_generic_reloc, /* special_function */
1255          "R_ARM_RBASE",         /* name */
1256          FALSE,                 /* partial_inplace */
1257          0,                     /* src_mask */
1258          0,                     /* dst_mask */
1259          FALSE)                 /* pcrel_offset */
1260 };
1261
1262 static reloc_howto_type *
1263 elf32_arm_howto_from_type (unsigned int r_type)
1264 {
1265   if (r_type < NUM_ELEM (elf32_arm_howto_table_1))
1266     return &elf32_arm_howto_table_1[r_type];
1267
1268   if (r_type >= R_ARM_MOVW_BREL_NC
1269       && r_type < R_ARM_MOVW_BREL_NC + NUM_ELEM (elf32_arm_howto_table_2))
1270     return &elf32_arm_howto_table_2[r_type - R_ARM_MOVW_BREL_NC];
1271
1272   if (r_type >= R_ARM_RREL32
1273       && r_type < R_ARM_RREL32 + NUM_ELEM (elf32_arm_howto_table_2))
1274     return &elf32_arm_howto_table_3[r_type - R_ARM_RREL32];
1275
1276   return NULL;
1277 }
1278
1279 static void
1280 elf32_arm_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED, arelent * bfd_reloc,
1281                          Elf_Internal_Rela * elf_reloc)
1282 {
1283   unsigned int r_type;
1284
1285   r_type = ELF32_R_TYPE (elf_reloc->r_info);
1286   bfd_reloc->howto = elf32_arm_howto_from_type (r_type);
1287 }
1288
1289 struct elf32_arm_reloc_map
1290   {
1291     bfd_reloc_code_real_type  bfd_reloc_val;
1292     unsigned char             elf_reloc_val;
1293   };
1294
1295 /* All entries in this list must also be present in elf32_arm_howto_table.  */
1296 static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
1297   {
1298     {BFD_RELOC_NONE,                 R_ARM_NONE},
1299     {BFD_RELOC_ARM_PCREL_BRANCH,     R_ARM_PC24},
1300     {BFD_RELOC_ARM_PCREL_BLX,        R_ARM_XPC25},
1301     {BFD_RELOC_THUMB_PCREL_BLX,      R_ARM_THM_XPC22},
1302     {BFD_RELOC_32,                   R_ARM_ABS32},
1303     {BFD_RELOC_32_PCREL,             R_ARM_REL32},
1304     {BFD_RELOC_8,                    R_ARM_ABS8},
1305     {BFD_RELOC_16,                   R_ARM_ABS16},
1306     {BFD_RELOC_ARM_OFFSET_IMM,       R_ARM_ABS12},
1307     {BFD_RELOC_ARM_THUMB_OFFSET,     R_ARM_THM_ABS5},
1308     {BFD_RELOC_THUMB_PCREL_BRANCH25, R_ARM_THM_JUMP24},
1309     {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_CALL},
1310     {BFD_RELOC_THUMB_PCREL_BRANCH12, R_ARM_THM_JUMP11},
1311     {BFD_RELOC_THUMB_PCREL_BRANCH20, R_ARM_THM_JUMP19},
1312     {BFD_RELOC_THUMB_PCREL_BRANCH9,  R_ARM_THM_JUMP8},
1313     {BFD_RELOC_THUMB_PCREL_BRANCH7,  R_ARM_THM_JUMP6},
1314     {BFD_RELOC_ARM_GLOB_DAT,         R_ARM_GLOB_DAT},
1315     {BFD_RELOC_ARM_JUMP_SLOT,        R_ARM_JUMP_SLOT},
1316     {BFD_RELOC_ARM_RELATIVE,         R_ARM_RELATIVE},
1317     {BFD_RELOC_ARM_GOTOFF,           R_ARM_GOTOFF32},
1318     {BFD_RELOC_ARM_GOTPC,            R_ARM_GOTPC},
1319     {BFD_RELOC_ARM_GOT32,            R_ARM_GOT32},
1320     {BFD_RELOC_ARM_PLT32,            R_ARM_PLT32},
1321     {BFD_RELOC_ARM_TARGET1,          R_ARM_TARGET1},
1322     {BFD_RELOC_ARM_ROSEGREL32,       R_ARM_ROSEGREL32},
1323     {BFD_RELOC_ARM_SBREL32,          R_ARM_SBREL32},
1324     {BFD_RELOC_ARM_PREL31,           R_ARM_PREL31},
1325     {BFD_RELOC_ARM_TARGET2,          R_ARM_TARGET2},
1326     {BFD_RELOC_ARM_PLT32,            R_ARM_PLT32},
1327     {BFD_RELOC_ARM_TLS_GD32,         R_ARM_TLS_GD32},
1328     {BFD_RELOC_ARM_TLS_LDO32,        R_ARM_TLS_LDO32},
1329     {BFD_RELOC_ARM_TLS_LDM32,        R_ARM_TLS_LDM32},
1330     {BFD_RELOC_ARM_TLS_DTPMOD32,     R_ARM_TLS_DTPMOD32},
1331     {BFD_RELOC_ARM_TLS_DTPOFF32,     R_ARM_TLS_DTPOFF32},
1332     {BFD_RELOC_ARM_TLS_TPOFF32,      R_ARM_TLS_TPOFF32},
1333     {BFD_RELOC_ARM_TLS_IE32,         R_ARM_TLS_IE32},
1334     {BFD_RELOC_ARM_TLS_LE32,         R_ARM_TLS_LE32},
1335     {BFD_RELOC_VTABLE_INHERIT,       R_ARM_GNU_VTINHERIT},
1336     {BFD_RELOC_VTABLE_ENTRY,         R_ARM_GNU_VTENTRY},
1337   };
1338
1339 static reloc_howto_type *
1340 elf32_arm_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1341                              bfd_reloc_code_real_type code)
1342 {
1343   unsigned int i;
1344   for (i = 0; i < NUM_ELEM (elf32_arm_reloc_map); i ++)
1345     if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
1346       return elf32_arm_howto_from_type (elf32_arm_reloc_map[i].elf_reloc_val);
1347
1348   return NULL;
1349 }
1350
1351 /* Support for core dump NOTE sections */
1352 static bfd_boolean
1353 elf32_arm_nabi_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1354 {
1355   int offset;
1356   size_t size;
1357
1358   switch (note->descsz)
1359     {
1360       default:
1361         return FALSE;
1362
1363       case 148:         /* Linux/ARM 32-bit*/
1364         /* pr_cursig */
1365         elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1366
1367         /* pr_pid */
1368         elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1369
1370         /* pr_reg */
1371         offset = 72;
1372         size = 72;
1373
1374         break;
1375     }
1376
1377   /* Make a ".reg/999" section.  */
1378   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1379                                           size, note->descpos + offset);
1380 }
1381
1382 static bfd_boolean
1383 elf32_arm_nabi_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1384 {
1385   switch (note->descsz)
1386     {
1387       default:
1388         return FALSE;
1389
1390       case 124:         /* Linux/ARM elf_prpsinfo */
1391         elf_tdata (abfd)->core_program
1392          = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1393         elf_tdata (abfd)->core_command
1394          = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1395     }
1396
1397   /* Note that for some reason, a spurious space is tacked
1398      onto the end of the args in some (at least one anyway)
1399      implementations, so strip it off if it exists.  */
1400
1401   {
1402     char *command = elf_tdata (abfd)->core_command;
1403     int n = strlen (command);
1404
1405     if (0 < n && command[n - 1] == ' ')
1406       command[n - 1] = '\0';
1407   }
1408
1409   return TRUE;
1410 }
1411
1412 #define TARGET_LITTLE_SYM               bfd_elf32_littlearm_vec
1413 #define TARGET_LITTLE_NAME              "elf32-littlearm"
1414 #define TARGET_BIG_SYM                  bfd_elf32_bigarm_vec
1415 #define TARGET_BIG_NAME                 "elf32-bigarm"
1416
1417 #define elf_backend_grok_prstatus       elf32_arm_nabi_grok_prstatus
1418 #define elf_backend_grok_psinfo         elf32_arm_nabi_grok_psinfo
1419
1420 typedef unsigned long int insn32;
1421 typedef unsigned short int insn16;
1422
1423 /* In lieu of proper flags, assume all EABIv4 objects are interworkable.  */
1424 #define INTERWORK_FLAG(abfd)  \
1425   (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) == EF_ARM_EABI_VER4 \
1426   || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK))
1427
1428 /* The linker script knows the section names for placement.
1429    The entry_names are used to do simple name mangling on the stubs.
1430    Given a function name, and its type, the stub can be found. The
1431    name can be changed. The only requirement is the %s be present.  */
1432 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
1433 #define THUMB2ARM_GLUE_ENTRY_NAME   "__%s_from_thumb"
1434
1435 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
1436 #define ARM2THUMB_GLUE_ENTRY_NAME   "__%s_from_arm"
1437
1438 /* The name of the dynamic interpreter.  This is put in the .interp
1439    section.  */
1440 #define ELF_DYNAMIC_INTERPRETER     "/usr/lib/ld.so.1"
1441
1442 #ifdef FOUR_WORD_PLT
1443
1444 /* The first entry in a procedure linkage table looks like
1445    this.  It is set up so that any shared library function that is
1446    called before the relocation has been set up calls the dynamic
1447    linker first.  */
1448 static const bfd_vma elf32_arm_plt0_entry [] =
1449   {
1450     0xe52de004,         /* str   lr, [sp, #-4]! */
1451     0xe59fe010,         /* ldr   lr, [pc, #16]  */
1452     0xe08fe00e,         /* add   lr, pc, lr     */
1453     0xe5bef008,         /* ldr   pc, [lr, #8]!  */
1454   };
1455
1456 /* Subsequent entries in a procedure linkage table look like
1457    this.  */
1458 static const bfd_vma elf32_arm_plt_entry [] =
1459   {
1460     0xe28fc600,         /* add   ip, pc, #NN    */
1461     0xe28cca00,         /* add   ip, ip, #NN    */
1462     0xe5bcf000,         /* ldr   pc, [ip, #NN]! */
1463     0x00000000,         /* unused               */
1464   };
1465
1466 #else
1467
1468 /* The first entry in a procedure linkage table looks like
1469    this.  It is set up so that any shared library function that is
1470    called before the relocation has been set up calls the dynamic
1471    linker first.  */
1472 static const bfd_vma elf32_arm_plt0_entry [] =
1473   {
1474     0xe52de004,         /* str   lr, [sp, #-4]! */
1475     0xe59fe004,         /* ldr   lr, [pc, #4]   */
1476     0xe08fe00e,         /* add   lr, pc, lr     */
1477     0xe5bef008,         /* ldr   pc, [lr, #8]!  */
1478     0x00000000,         /* &GOT[0] - .          */
1479   };
1480
1481 /* Subsequent entries in a procedure linkage table look like
1482    this.  */
1483 static const bfd_vma elf32_arm_plt_entry [] =
1484   {
1485     0xe28fc600,         /* add   ip, pc, #0xNN00000 */
1486     0xe28cca00,         /* add   ip, ip, #0xNN000   */
1487     0xe5bcf000,         /* ldr   pc, [ip, #0xNNN]!  */
1488   };
1489
1490 #endif
1491
1492 /* An initial stub used if the PLT entry is referenced from Thumb code.  */
1493 #define PLT_THUMB_STUB_SIZE 4
1494 static const bfd_vma elf32_arm_plt_thumb_stub [] =
1495   {
1496     0x4778,             /* bx pc */
1497     0x46c0              /* nop   */
1498   };
1499
1500 /* The entries in a PLT when using a DLL-based target with multiple
1501    address spaces.  */
1502 static const bfd_vma elf32_arm_symbian_plt_entry [] = 
1503   {
1504     0xe51ff004,         /* ldr   pc, [pc, #-4] */
1505     0x00000000,         /* dcd   R_ARM_GLOB_DAT(X) */
1506   };
1507
1508 /* Used to build a map of a section.  This is required for mixed-endian
1509    code/data.  */
1510
1511 typedef struct elf32_elf_section_map
1512 {
1513   bfd_vma vma;
1514   char type;
1515 }
1516 elf32_arm_section_map;
1517
1518 typedef struct _arm_elf_section_data
1519 {
1520   struct bfd_elf_section_data elf;
1521   unsigned int mapcount;
1522   elf32_arm_section_map *map;
1523 }
1524 _arm_elf_section_data;
1525
1526 #define elf32_arm_section_data(sec) \
1527   ((_arm_elf_section_data *) elf_section_data (sec))
1528
1529 /* The size of the thread control block.  */
1530 #define TCB_SIZE        8
1531
1532 struct elf32_arm_obj_tdata
1533 {
1534   struct elf_obj_tdata root;
1535
1536   /* tls_type for each local got entry.  */
1537   char *local_got_tls_type;
1538 };
1539
1540 #define elf32_arm_tdata(abfd) \
1541   ((struct elf32_arm_obj_tdata *) (abfd)->tdata.any)
1542
1543 #define elf32_arm_local_got_tls_type(abfd) \
1544   (elf32_arm_tdata (abfd)->local_got_tls_type)
1545
1546 static bfd_boolean
1547 elf32_arm_mkobject (bfd *abfd)
1548 {
1549   bfd_size_type amt = sizeof (struct elf32_arm_obj_tdata);
1550   abfd->tdata.any = bfd_zalloc (abfd, amt);
1551   if (abfd->tdata.any == NULL)
1552     return FALSE;
1553   return TRUE;
1554 }
1555
1556 /* The ARM linker needs to keep track of the number of relocs that it
1557    decides to copy in check_relocs for each symbol.  This is so that
1558    it can discard PC relative relocs if it doesn't need them when
1559    linking with -Bsymbolic.  We store the information in a field
1560    extending the regular ELF linker hash table.  */
1561
1562 /* This structure keeps track of the number of relocs we have copied
1563    for a given symbol.  */
1564 struct elf32_arm_relocs_copied
1565   {
1566     /* Next section.  */
1567     struct elf32_arm_relocs_copied * next;
1568     /* A section in dynobj.  */
1569     asection * section;
1570     /* Number of relocs copied in this section.  */
1571     bfd_size_type count;
1572     /* Number of PC-relative relocs copied in this section.  */
1573     bfd_size_type pc_count;
1574   };
1575
1576 #define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
1577
1578 /* Arm ELF linker hash entry.  */
1579 struct elf32_arm_link_hash_entry
1580   {
1581     struct elf_link_hash_entry root;
1582
1583     /* Number of PC relative relocs copied for this symbol.  */
1584     struct elf32_arm_relocs_copied * relocs_copied;
1585
1586     /* We reference count Thumb references to a PLT entry separately,
1587        so that we can emit the Thumb trampoline only if needed.  */
1588     bfd_signed_vma plt_thumb_refcount;
1589
1590     /* Since PLT entries have variable size if the Thumb prologue is
1591        used, we need to record the index into .got.plt instead of
1592        recomputing it from the PLT offset.  */
1593     bfd_signed_vma plt_got_offset;
1594
1595 #define GOT_UNKNOWN     0
1596 #define GOT_NORMAL      1
1597 #define GOT_TLS_GD      2
1598 #define GOT_TLS_IE      4
1599     unsigned char tls_type;
1600   };
1601
1602 /* Traverse an arm ELF linker hash table.  */
1603 #define elf32_arm_link_hash_traverse(table, func, info)                 \
1604   (elf_link_hash_traverse                                               \
1605    (&(table)->root,                                                     \
1606     (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func),    \
1607     (info)))
1608
1609 /* Get the ARM elf linker hash table from a link_info structure.  */
1610 #define elf32_arm_hash_table(info) \
1611   ((struct elf32_arm_link_hash_table *) ((info)->hash))
1612
1613 /* ARM ELF linker hash table.  */
1614 struct elf32_arm_link_hash_table
1615   {
1616     /* The main hash table.  */
1617     struct elf_link_hash_table root;
1618
1619     /* The size in bytes of the section containing the Thumb-to-ARM glue.  */
1620     bfd_size_type thumb_glue_size;
1621
1622     /* The size in bytes of the section containing the ARM-to-Thumb glue.  */
1623     bfd_size_type arm_glue_size;
1624
1625     /* An arbitrary input BFD chosen to hold the glue sections.  */
1626     bfd * bfd_of_glue_owner;
1627
1628     /* Nonzero to output a BE8 image.  */
1629     int byteswap_code;
1630
1631     /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
1632        Nonzero if R_ARM_TARGET1 means R_ARM_ABS32.  */
1633     int target1_is_rel;
1634
1635     /* The relocation to use for R_ARM_TARGET2 relocations.  */
1636     int target2_reloc;
1637
1638     /* Nonzero to fix BX instructions for ARMv4 targets.  */
1639     int fix_v4bx;
1640
1641     /* Nonzero if the ARM/Thumb BLX instructions are available for use.  */
1642     int use_blx;
1643
1644     /* The number of bytes in the initial entry in the PLT.  */
1645     bfd_size_type plt_header_size;
1646
1647     /* The number of bytes in the subsequent PLT etries.  */
1648     bfd_size_type plt_entry_size;
1649
1650     /* True if the target system is Symbian OS.  */
1651     int symbian_p;
1652
1653     /* True if the target uses REL relocations.  */
1654     int use_rel;
1655
1656     /* Short-cuts to get to dynamic linker sections.  */
1657     asection *sgot;
1658     asection *sgotplt;
1659     asection *srelgot;
1660     asection *splt;
1661     asection *srelplt;
1662     asection *sdynbss;
1663     asection *srelbss;
1664
1665     /* Data for R_ARM_TLS_LDM32 relocations.  */
1666     union {
1667       bfd_signed_vma refcount;
1668       bfd_vma offset;
1669     } tls_ldm_got;
1670     
1671     /* Small local sym to section mapping cache.  */
1672     struct sym_sec_cache sym_sec;
1673
1674     /* For convenience in allocate_dynrelocs.  */
1675     bfd * obfd;
1676   };
1677
1678 /* Create an entry in an ARM ELF linker hash table.  */
1679
1680 static struct bfd_hash_entry *
1681 elf32_arm_link_hash_newfunc (struct bfd_hash_entry * entry,
1682                              struct bfd_hash_table * table,
1683                              const char * string)
1684 {
1685   struct elf32_arm_link_hash_entry * ret =
1686     (struct elf32_arm_link_hash_entry *) entry;
1687
1688   /* Allocate the structure if it has not already been allocated by a
1689      subclass.  */
1690   if (ret == (struct elf32_arm_link_hash_entry *) NULL)
1691     ret = bfd_hash_allocate (table, sizeof (struct elf32_arm_link_hash_entry));
1692   if (ret == NULL)
1693     return (struct bfd_hash_entry *) ret;
1694
1695   /* Call the allocation method of the superclass.  */
1696   ret = ((struct elf32_arm_link_hash_entry *)
1697          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1698                                      table, string));
1699   if (ret != NULL)
1700     {
1701       ret->relocs_copied = NULL;
1702       ret->tls_type = GOT_UNKNOWN;
1703       ret->plt_thumb_refcount = 0;
1704       ret->plt_got_offset = -1;
1705     }
1706
1707   return (struct bfd_hash_entry *) ret;
1708 }
1709
1710 /* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up
1711    shortcuts to them in our hash table.  */
1712
1713 static bfd_boolean
1714 create_got_section (bfd *dynobj, struct bfd_link_info *info)
1715 {
1716   struct elf32_arm_link_hash_table *htab;
1717
1718   htab = elf32_arm_hash_table (info);
1719   /* BPABI objects never have a GOT, or associated sections.  */
1720   if (htab->symbian_p)
1721     return TRUE;
1722
1723   if (! _bfd_elf_create_got_section (dynobj, info))
1724     return FALSE;
1725
1726   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
1727   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
1728   if (!htab->sgot || !htab->sgotplt)
1729     abort ();
1730
1731   htab->srelgot = bfd_make_section_with_flags (dynobj, ".rel.got",
1732                                                (SEC_ALLOC | SEC_LOAD
1733                                                 | SEC_HAS_CONTENTS
1734                                                 | SEC_IN_MEMORY
1735                                                 | SEC_LINKER_CREATED
1736                                                 | SEC_READONLY));
1737   if (htab->srelgot == NULL
1738       || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
1739     return FALSE;
1740   return TRUE;
1741 }
1742
1743 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
1744    .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
1745    hash table.  */
1746
1747 static bfd_boolean
1748 elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1749 {
1750   struct elf32_arm_link_hash_table *htab;
1751
1752   htab = elf32_arm_hash_table (info);
1753   if (!htab->sgot && !create_got_section (dynobj, info))
1754     return FALSE;
1755
1756   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1757     return FALSE;
1758
1759   htab->splt = bfd_get_section_by_name (dynobj, ".plt");
1760   htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt");
1761   htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
1762   if (!info->shared)
1763     htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss");
1764
1765   if (!htab->splt 
1766       || !htab->srelplt
1767       || !htab->sdynbss
1768       || (!info->shared && !htab->srelbss))
1769     abort ();
1770
1771   return TRUE;
1772 }
1773
1774 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
1775
1776 static void
1777 elf32_arm_copy_indirect_symbol (const struct elf_backend_data *bed,
1778                                 struct elf_link_hash_entry *dir,
1779                                 struct elf_link_hash_entry *ind)
1780 {
1781   struct elf32_arm_link_hash_entry *edir, *eind;
1782
1783   edir = (struct elf32_arm_link_hash_entry *) dir;
1784   eind = (struct elf32_arm_link_hash_entry *) ind;
1785
1786   if (eind->relocs_copied != NULL)
1787     {
1788       if (edir->relocs_copied != NULL)
1789         {
1790           struct elf32_arm_relocs_copied **pp;
1791           struct elf32_arm_relocs_copied *p;
1792
1793           if (ind->root.type == bfd_link_hash_indirect)
1794             abort ();
1795
1796           /* Add reloc counts against the weak sym to the strong sym
1797              list.  Merge any entries against the same section.  */
1798           for (pp = &eind->relocs_copied; (p = *pp) != NULL; )
1799             {
1800               struct elf32_arm_relocs_copied *q;
1801
1802               for (q = edir->relocs_copied; q != NULL; q = q->next)
1803                 if (q->section == p->section)
1804                   {
1805                     q->pc_count += p->pc_count;
1806                     q->count += p->count;
1807                     *pp = p->next;
1808                     break;
1809                   }
1810               if (q == NULL)
1811                 pp = &p->next;
1812             }
1813           *pp = edir->relocs_copied;
1814         }
1815
1816       edir->relocs_copied = eind->relocs_copied;
1817       eind->relocs_copied = NULL;
1818     }
1819
1820   /* If the direct symbol already has an associated PLT entry, the
1821      indirect symbol should not.  If it doesn't, swap refcount information
1822      from the indirect symbol.  */
1823   if (edir->plt_thumb_refcount == 0)
1824     {
1825       edir->plt_thumb_refcount = eind->plt_thumb_refcount;
1826       eind->plt_thumb_refcount = 0;
1827     }
1828   else
1829     BFD_ASSERT (eind->plt_thumb_refcount == 0);
1830
1831   if (ind->root.type == bfd_link_hash_indirect
1832       && dir->got.refcount <= 0)
1833     {
1834       edir->tls_type = eind->tls_type;
1835       eind->tls_type = GOT_UNKNOWN;
1836     }
1837
1838   _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
1839 }
1840
1841 /* Create an ARM elf linker hash table.  */
1842
1843 static struct bfd_link_hash_table *
1844 elf32_arm_link_hash_table_create (bfd *abfd)
1845 {
1846   struct elf32_arm_link_hash_table *ret;
1847   bfd_size_type amt = sizeof (struct elf32_arm_link_hash_table);
1848
1849   ret = bfd_malloc (amt);
1850   if (ret == NULL)
1851     return NULL;
1852
1853   if (!_bfd_elf_link_hash_table_init (& ret->root, abfd,
1854                                       elf32_arm_link_hash_newfunc))
1855     {
1856       free (ret);
1857       return NULL;
1858     }
1859
1860   ret->sgot = NULL;
1861   ret->sgotplt = NULL;
1862   ret->srelgot = NULL;
1863   ret->splt = NULL;
1864   ret->srelplt = NULL;
1865   ret->sdynbss = NULL;
1866   ret->srelbss = NULL;
1867   ret->thumb_glue_size = 0;
1868   ret->arm_glue_size = 0;
1869   ret->bfd_of_glue_owner = NULL;
1870   ret->byteswap_code = 0;
1871   ret->target1_is_rel = 0;
1872   ret->target2_reloc = R_ARM_NONE;
1873 #ifdef FOUR_WORD_PLT
1874   ret->plt_header_size = 16;
1875   ret->plt_entry_size = 16;
1876 #else
1877   ret->plt_header_size = 20;
1878   ret->plt_entry_size = 12;
1879 #endif
1880   ret->fix_v4bx = 0;
1881   ret->use_blx = 0;
1882   ret->symbian_p = 0;
1883   ret->use_rel = 1;
1884   ret->sym_sec.abfd = NULL;
1885   ret->obfd = abfd;
1886   ret->tls_ldm_got.refcount = 0;
1887
1888   return &ret->root.root;
1889 }
1890
1891 /* Locate the Thumb encoded calling stub for NAME.  */
1892
1893 static struct elf_link_hash_entry *
1894 find_thumb_glue (struct bfd_link_info *link_info,
1895                  const char *name,
1896                  bfd *input_bfd)
1897 {
1898   char *tmp_name;
1899   struct elf_link_hash_entry *hash;
1900   struct elf32_arm_link_hash_table *hash_table;
1901
1902   /* We need a pointer to the armelf specific hash table.  */
1903   hash_table = elf32_arm_hash_table (link_info);
1904
1905   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
1906                          + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
1907
1908   BFD_ASSERT (tmp_name);
1909
1910   sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
1911
1912   hash = elf_link_hash_lookup
1913     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
1914
1915   if (hash == NULL)
1916     /* xgettext:c-format */
1917     (*_bfd_error_handler) (_("%B: unable to find THUMB glue '%s' for `%s'"),
1918                            input_bfd, tmp_name, name);
1919
1920   free (tmp_name);
1921
1922   return hash;
1923 }
1924
1925 /* Locate the ARM encoded calling stub for NAME.  */
1926
1927 static struct elf_link_hash_entry *
1928 find_arm_glue (struct bfd_link_info *link_info,
1929                const char *name,
1930                bfd *input_bfd)
1931 {
1932   char *tmp_name;
1933   struct elf_link_hash_entry *myh;
1934   struct elf32_arm_link_hash_table *hash_table;
1935
1936   /* We need a pointer to the elfarm specific hash table.  */
1937   hash_table = elf32_arm_hash_table (link_info);
1938
1939   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
1940                          + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
1941
1942   BFD_ASSERT (tmp_name);
1943
1944   sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
1945
1946   myh = elf_link_hash_lookup
1947     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
1948
1949   if (myh == NULL)
1950     /* xgettext:c-format */
1951     (*_bfd_error_handler) (_("%B: unable to find ARM glue '%s' for `%s'"),
1952                            input_bfd, tmp_name, name);
1953
1954   free (tmp_name);
1955
1956   return myh;
1957 }
1958
1959 /* ARM->Thumb glue (static images):
1960
1961    .arm
1962    __func_from_arm:
1963    ldr r12, __func_addr
1964    bx  r12
1965    __func_addr:
1966    .word func    @ behave as if you saw a ARM_32 reloc.  
1967
1968    (relocatable images)
1969    .arm
1970    __func_from_arm:
1971    ldr r12, __func_offset
1972    add r12, r12, pc
1973    bx  r12
1974    __func_offset:
1975    .word func - .
1976    */
1977
1978 #define ARM2THUMB_STATIC_GLUE_SIZE 12
1979 static const insn32 a2t1_ldr_insn = 0xe59fc000;
1980 static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
1981 static const insn32 a2t3_func_addr_insn = 0x00000001;
1982
1983 #define ARM2THUMB_PIC_GLUE_SIZE 16
1984 static const insn32 a2t1p_ldr_insn = 0xe59fc004;
1985 static const insn32 a2t2p_add_pc_insn = 0xe08cc00f;
1986 static const insn32 a2t3p_bx_r12_insn = 0xe12fff1c;
1987
1988 /* Thumb->ARM:                          Thumb->(non-interworking aware) ARM
1989
1990    .thumb                               .thumb
1991    .align 2                             .align 2
1992    __func_from_thumb:              __func_from_thumb:
1993    bx pc                                push {r6, lr}
1994    nop                                  ldr  r6, __func_addr
1995    .arm                                         mov  lr, pc
1996    __func_change_to_arm:                        bx   r6
1997    b func                       .arm
1998    __func_back_to_thumb:
1999    ldmia r13! {r6, lr}
2000    bx    lr
2001    __func_addr:
2002    .word        func  */
2003
2004 #define THUMB2ARM_GLUE_SIZE 8
2005 static const insn16 t2a1_bx_pc_insn = 0x4778;
2006 static const insn16 t2a2_noop_insn = 0x46c0;
2007 static const insn32 t2a3_b_insn = 0xea000000;
2008
2009 #ifndef ELFARM_NABI_C_INCLUDED
2010 bfd_boolean
2011 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
2012 {
2013   asection * s;
2014   bfd_byte * foo;
2015   struct elf32_arm_link_hash_table * globals;
2016
2017   globals = elf32_arm_hash_table (info);
2018
2019   BFD_ASSERT (globals != NULL);
2020
2021   if (globals->arm_glue_size != 0)
2022     {
2023       BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2024
2025       s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2026                                    ARM2THUMB_GLUE_SECTION_NAME);
2027
2028       BFD_ASSERT (s != NULL);
2029
2030       foo = bfd_alloc (globals->bfd_of_glue_owner, globals->arm_glue_size);
2031
2032       s->size = globals->arm_glue_size;
2033       s->contents = foo;
2034     }
2035
2036   if (globals->thumb_glue_size != 0)
2037     {
2038       BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2039
2040       s = bfd_get_section_by_name
2041         (globals->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
2042
2043       BFD_ASSERT (s != NULL);
2044
2045       foo = bfd_alloc (globals->bfd_of_glue_owner, globals->thumb_glue_size);
2046
2047       s->size = globals->thumb_glue_size;
2048       s->contents = foo;
2049     }
2050
2051   return TRUE;
2052 }
2053
2054 static void
2055 record_arm_to_thumb_glue (struct bfd_link_info * link_info,
2056                           struct elf_link_hash_entry * h)
2057 {
2058   const char * name = h->root.root.string;
2059   asection * s;
2060   char * tmp_name;
2061   struct elf_link_hash_entry * myh;
2062   struct bfd_link_hash_entry * bh;
2063   struct elf32_arm_link_hash_table * globals;
2064   bfd_vma val;
2065
2066   globals = elf32_arm_hash_table (link_info);
2067
2068   BFD_ASSERT (globals != NULL);
2069   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2070
2071   s = bfd_get_section_by_name
2072     (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
2073
2074   BFD_ASSERT (s != NULL);
2075
2076   tmp_name = bfd_malloc ((bfd_size_type) strlen (name) + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
2077
2078   BFD_ASSERT (tmp_name);
2079
2080   sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
2081
2082   myh = elf_link_hash_lookup
2083     (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
2084
2085   if (myh != NULL)
2086     {
2087       /* We've already seen this guy.  */
2088       free (tmp_name);
2089       return;
2090     }
2091
2092   /* The only trick here is using hash_table->arm_glue_size as the value.
2093      Even though the section isn't allocated yet, this is where we will be
2094      putting it.  */
2095   bh = NULL;
2096   val = globals->arm_glue_size + 1;
2097   _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
2098                                     tmp_name, BSF_GLOBAL, s, val,
2099                                     NULL, TRUE, FALSE, &bh);
2100
2101   myh = (struct elf_link_hash_entry *) bh;
2102   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
2103   myh->forced_local = 1;
2104
2105   free (tmp_name);
2106
2107   if ((link_info->shared || globals->root.is_relocatable_executable))
2108     globals->arm_glue_size += ARM2THUMB_PIC_GLUE_SIZE;
2109   else
2110     globals->arm_glue_size += ARM2THUMB_STATIC_GLUE_SIZE;
2111
2112   return;
2113 }
2114
2115 static void
2116 record_thumb_to_arm_glue (struct bfd_link_info *link_info,
2117                           struct elf_link_hash_entry *h)
2118 {
2119   const char *name = h->root.root.string;
2120   asection *s;
2121   char *tmp_name;
2122   struct elf_link_hash_entry *myh;
2123   struct bfd_link_hash_entry *bh;
2124   struct elf32_arm_link_hash_table *hash_table;
2125   bfd_vma val;
2126
2127   hash_table = elf32_arm_hash_table (link_info);
2128
2129   BFD_ASSERT (hash_table != NULL);
2130   BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
2131
2132   s = bfd_get_section_by_name
2133     (hash_table->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
2134
2135   BFD_ASSERT (s != NULL);
2136
2137   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2138                          + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
2139
2140   BFD_ASSERT (tmp_name);
2141
2142   sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
2143
2144   myh = elf_link_hash_lookup
2145     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
2146
2147   if (myh != NULL)
2148     {
2149       /* We've already seen this guy.  */
2150       free (tmp_name);
2151       return;
2152     }
2153
2154   bh = NULL;
2155   val = hash_table->thumb_glue_size + 1;
2156   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
2157                                     tmp_name, BSF_GLOBAL, s, val,
2158                                     NULL, TRUE, FALSE, &bh);
2159
2160   /* If we mark it 'Thumb', the disassembler will do a better job.  */
2161   myh = (struct elf_link_hash_entry *) bh;
2162   myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
2163   myh->forced_local = 1;
2164
2165   free (tmp_name);
2166
2167 #define CHANGE_TO_ARM "__%s_change_to_arm"
2168 #define BACK_FROM_ARM "__%s_back_from_arm"
2169
2170   /* Allocate another symbol to mark where we switch to Arm mode.  */
2171   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
2172                          + strlen (CHANGE_TO_ARM) + 1);
2173
2174   BFD_ASSERT (tmp_name);
2175
2176   sprintf (tmp_name, CHANGE_TO_ARM, name);
2177
2178   bh = NULL;
2179   val = hash_table->thumb_glue_size + 4,
2180   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
2181                                     tmp_name, BSF_LOCAL, s, val,
2182                                     NULL, TRUE, FALSE, &bh);
2183
2184   free (tmp_name);
2185
2186   hash_table->thumb_glue_size += THUMB2ARM_GLUE_SIZE;
2187
2188   return;
2189 }
2190
2191 /* Add the glue sections to ABFD.  This function is called from the
2192    linker scripts in ld/emultempl/{armelf}.em.  */
2193
2194 bfd_boolean
2195 bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
2196                                         struct bfd_link_info *info)
2197 {
2198   flagword flags;
2199   asection *sec;
2200
2201   /* If we are only performing a partial
2202      link do not bother adding the glue.  */
2203   if (info->relocatable)
2204     return TRUE;
2205
2206   sec = bfd_get_section_by_name (abfd, ARM2THUMB_GLUE_SECTION_NAME);
2207
2208   if (sec == NULL)
2209     {
2210       /* Note: we do not include the flag SEC_LINKER_CREATED, as this
2211          will prevent elf_link_input_bfd() from processing the contents
2212          of this section.  */
2213       flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY;
2214
2215       sec = bfd_make_section_with_flags (abfd,
2216                                          ARM2THUMB_GLUE_SECTION_NAME,
2217                                          flags);
2218
2219       if (sec == NULL
2220           || !bfd_set_section_alignment (abfd, sec, 2))
2221         return FALSE;
2222
2223       /* Set the gc mark to prevent the section from being removed by garbage
2224          collection, despite the fact that no relocs refer to this section.  */
2225       sec->gc_mark = 1;
2226     }
2227
2228   sec = bfd_get_section_by_name (abfd, THUMB2ARM_GLUE_SECTION_NAME);
2229
2230   if (sec == NULL)
2231     {
2232       flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2233         | SEC_CODE | SEC_READONLY;
2234
2235       sec = bfd_make_section_with_flags (abfd,
2236                                          THUMB2ARM_GLUE_SECTION_NAME,
2237                                          flags);
2238
2239       if (sec == NULL
2240           || !bfd_set_section_alignment (abfd, sec, 2))
2241         return FALSE;
2242
2243       sec->gc_mark = 1;
2244     }
2245
2246   return TRUE;
2247 }
2248
2249 /* Select a BFD to be used to hold the sections used by the glue code.
2250    This function is called from the linker scripts in ld/emultempl/
2251    {armelf/pe}.em  */
2252
2253 bfd_boolean
2254 bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
2255 {
2256   struct elf32_arm_link_hash_table *globals;
2257
2258   /* If we are only performing a partial link
2259      do not bother getting a bfd to hold the glue.  */
2260   if (info->relocatable)
2261     return TRUE;
2262
2263   /* Make sure we don't attach the glue sections to a dynamic object.  */
2264   BFD_ASSERT (!(abfd->flags & DYNAMIC));
2265
2266   globals = elf32_arm_hash_table (info);
2267
2268   BFD_ASSERT (globals != NULL);
2269
2270   if (globals->bfd_of_glue_owner != NULL)
2271     return TRUE;
2272
2273   /* Save the bfd for later use.  */
2274   globals->bfd_of_glue_owner = abfd;
2275
2276   return TRUE;
2277 }
2278
2279 bfd_boolean
2280 bfd_elf32_arm_process_before_allocation (bfd *abfd,
2281                                          struct bfd_link_info *link_info,
2282                                          int byteswap_code)
2283 {
2284   Elf_Internal_Shdr *symtab_hdr;
2285   Elf_Internal_Rela *internal_relocs = NULL;
2286   Elf_Internal_Rela *irel, *irelend;
2287   bfd_byte *contents = NULL;
2288
2289   asection *sec;
2290   struct elf32_arm_link_hash_table *globals;
2291
2292   /* If we are only performing a partial link do not bother
2293      to construct any glue.  */
2294   if (link_info->relocatable)
2295     return TRUE;
2296
2297   /* Here we have a bfd that is to be included on the link.  We have a hook
2298      to do reloc rummaging, before section sizes are nailed down.  */
2299   globals = elf32_arm_hash_table (link_info);
2300
2301   BFD_ASSERT (globals != NULL);
2302   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2303
2304   if (byteswap_code && !bfd_big_endian (abfd))
2305     {
2306       _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
2307                           abfd);
2308       return FALSE;
2309     }
2310   globals->byteswap_code = byteswap_code;
2311
2312   /* Rummage around all the relocs and map the glue vectors.  */
2313   sec = abfd->sections;
2314
2315   if (sec == NULL)
2316     return TRUE;
2317
2318   for (; sec != NULL; sec = sec->next)
2319     {
2320       if (sec->reloc_count == 0)
2321         continue;
2322
2323       symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2324
2325       /* Load the relocs.  */
2326       internal_relocs
2327         = _bfd_elf_link_read_relocs (abfd, sec, (void *) NULL,
2328                                      (Elf_Internal_Rela *) NULL, FALSE);
2329
2330       if (internal_relocs == NULL)
2331         goto error_return;
2332
2333       irelend = internal_relocs + sec->reloc_count;
2334       for (irel = internal_relocs; irel < irelend; irel++)
2335         {
2336           long r_type;
2337           unsigned long r_index;
2338
2339           struct elf_link_hash_entry *h;
2340
2341           r_type = ELF32_R_TYPE (irel->r_info);
2342           r_index = ELF32_R_SYM (irel->r_info);
2343
2344           /* These are the only relocation types we care about.  */
2345           if (   r_type != R_ARM_PC24
2346               && r_type != R_ARM_PLT32
2347               && r_type != R_ARM_CALL
2348               && r_type != R_ARM_JUMP24
2349               && r_type != R_ARM_THM_CALL)
2350             continue;
2351
2352           /* Get the section contents if we haven't done so already.  */
2353           if (contents == NULL)
2354             {
2355               /* Get cached copy if it exists.  */
2356               if (elf_section_data (sec)->this_hdr.contents != NULL)
2357                 contents = elf_section_data (sec)->this_hdr.contents;
2358               else
2359                 {
2360                   /* Go get them off disk.  */
2361                   if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2362                     goto error_return;
2363                 }
2364             }
2365
2366           /* If the relocation is not against a symbol it cannot concern us.  */
2367           h = NULL;
2368
2369           /* We don't care about local symbols.  */
2370           if (r_index < symtab_hdr->sh_info)
2371             continue;
2372
2373           /* This is an external symbol.  */
2374           r_index -= symtab_hdr->sh_info;
2375           h = (struct elf_link_hash_entry *)
2376             elf_sym_hashes (abfd)[r_index];
2377
2378           /* If the relocation is against a static symbol it must be within
2379              the current section and so cannot be a cross ARM/Thumb relocation.  */
2380           if (h == NULL)
2381             continue;
2382
2383           /* If the call will go through a PLT entry then we do not need
2384              glue.  */
2385           if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1)
2386             continue;
2387
2388           switch (r_type)
2389             {
2390             case R_ARM_PC24:
2391             case R_ARM_PLT32:
2392             case R_ARM_CALL:
2393             case R_ARM_JUMP24:
2394               /* This one is a call from arm code.  We need to look up
2395                  the target of the call.  If it is a thumb target, we
2396                  insert glue.  */
2397               if (ELF_ST_TYPE(h->type) == STT_ARM_TFUNC)
2398                 record_arm_to_thumb_glue (link_info, h);
2399               break;
2400
2401             case R_ARM_THM_CALL:
2402               /* This one is a call from thumb code.  We look
2403                  up the target of the call.  If it is not a thumb
2404                  target, we insert glue.  */
2405               if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC)
2406                 record_thumb_to_arm_glue (link_info, h);
2407               break;
2408
2409             default:
2410               abort ();
2411             }
2412         }
2413
2414       if (contents != NULL
2415           && elf_section_data (sec)->this_hdr.contents != contents)
2416         free (contents);
2417       contents = NULL;
2418
2419       if (internal_relocs != NULL
2420           && elf_section_data (sec)->relocs != internal_relocs)
2421         free (internal_relocs);
2422       internal_relocs = NULL;
2423     }
2424
2425   return TRUE;
2426
2427 error_return:
2428   if (contents != NULL
2429       && elf_section_data (sec)->this_hdr.contents != contents)
2430     free (contents);
2431   if (internal_relocs != NULL
2432       && elf_section_data (sec)->relocs != internal_relocs)
2433     free (internal_relocs);
2434
2435   return FALSE;
2436 }
2437 #endif
2438
2439
2440 /* Set target relocation values needed during linking.  */
2441
2442 void
2443 bfd_elf32_arm_set_target_relocs (struct bfd_link_info *link_info,
2444                                  int target1_is_rel,
2445                                  char * target2_type,
2446                                  int fix_v4bx,
2447                                  int use_blx)
2448 {
2449   struct elf32_arm_link_hash_table *globals;
2450
2451   globals = elf32_arm_hash_table (link_info);
2452
2453   globals->target1_is_rel = target1_is_rel;
2454   if (strcmp (target2_type, "rel") == 0)
2455     globals->target2_reloc = R_ARM_REL32;
2456   else if (strcmp (target2_type, "abs") == 0)
2457     globals->target2_reloc = R_ARM_ABS32;
2458   else if (strcmp (target2_type, "got-rel") == 0)
2459     globals->target2_reloc = R_ARM_GOT_PREL;
2460   else
2461     {
2462       _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
2463                           target2_type);
2464     }
2465   globals->fix_v4bx = fix_v4bx;
2466   globals->use_blx |= use_blx;
2467 }
2468
2469 /* The thumb form of a long branch is a bit finicky, because the offset
2470    encoding is split over two fields, each in it's own instruction. They
2471    can occur in any order. So given a thumb form of long branch, and an
2472    offset, insert the offset into the thumb branch and return finished
2473    instruction.
2474
2475    It takes two thumb instructions to encode the target address. Each has
2476    11 bits to invest. The upper 11 bits are stored in one (identified by
2477    H-0.. see below), the lower 11 bits are stored in the other (identified
2478    by H-1).
2479
2480    Combine together and shifted left by 1 (it's a half word address) and
2481    there you have it.
2482
2483    Op: 1111 = F,
2484    H-0, upper address-0 = 000
2485    Op: 1111 = F,
2486    H-1, lower address-0 = 800
2487
2488    They can be ordered either way, but the arm tools I've seen always put
2489    the lower one first. It probably doesn't matter. krk@cygnus.com
2490
2491    XXX:  Actually the order does matter.  The second instruction (H-1)
2492    moves the computed address into the PC, so it must be the second one
2493    in the sequence.  The problem, however is that whilst little endian code
2494    stores the instructions in HI then LOW order, big endian code does the
2495    reverse.  nickc@cygnus.com.  */
2496
2497 #define LOW_HI_ORDER      0xF800F000
2498 #define HI_LOW_ORDER      0xF000F800
2499
2500 static insn32
2501 insert_thumb_branch (insn32 br_insn, int rel_off)
2502 {
2503   unsigned int low_bits;
2504   unsigned int high_bits;
2505
2506   BFD_ASSERT ((rel_off & 1) != 1);
2507
2508   rel_off >>= 1;                                /* Half word aligned address.  */
2509   low_bits = rel_off & 0x000007FF;              /* The bottom 11 bits.  */
2510   high_bits = (rel_off >> 11) & 0x000007FF;     /* The top 11 bits.  */
2511
2512   if ((br_insn & LOW_HI_ORDER) == LOW_HI_ORDER)
2513     br_insn = LOW_HI_ORDER | (low_bits << 16) | high_bits;
2514   else if ((br_insn & HI_LOW_ORDER) == HI_LOW_ORDER)
2515     br_insn = HI_LOW_ORDER | (high_bits << 16) | low_bits;
2516   else
2517     /* FIXME: abort is probably not the right call. krk@cygnus.com  */
2518     abort ();   /* Error - not a valid branch instruction form.  */
2519
2520   return br_insn;
2521 }
2522
2523 /* Thumb code calling an ARM function.  */
2524
2525 static int
2526 elf32_thumb_to_arm_stub (struct bfd_link_info * info,
2527                          const char *           name,
2528                          bfd *                  input_bfd,
2529                          bfd *                  output_bfd,
2530                          asection *             input_section,
2531                          bfd_byte *             hit_data,
2532                          asection *             sym_sec,
2533                          bfd_vma                offset,
2534                          bfd_signed_vma         addend,
2535                          bfd_vma                val)
2536 {
2537   asection * s = 0;
2538   bfd_vma my_offset;
2539   unsigned long int tmp;
2540   long int ret_offset;
2541   struct elf_link_hash_entry * myh;
2542   struct elf32_arm_link_hash_table * globals;
2543
2544   myh = find_thumb_glue (info, name, input_bfd);
2545   if (myh == NULL)
2546     return FALSE;
2547
2548   globals = elf32_arm_hash_table (info);
2549
2550   BFD_ASSERT (globals != NULL);
2551   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2552
2553   my_offset = myh->root.u.def.value;
2554
2555   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2556                                THUMB2ARM_GLUE_SECTION_NAME);
2557
2558   BFD_ASSERT (s != NULL);
2559   BFD_ASSERT (s->contents != NULL);
2560   BFD_ASSERT (s->output_section != NULL);
2561
2562   if ((my_offset & 0x01) == 0x01)
2563     {
2564       if (sym_sec != NULL
2565           && sym_sec->owner != NULL
2566           && !INTERWORK_FLAG (sym_sec->owner))
2567         {
2568           (*_bfd_error_handler)
2569             (_("%B(%s): warning: interworking not enabled.\n"
2570                "  first occurrence: %B: thumb call to arm"),
2571              sym_sec->owner, input_bfd, name);
2572
2573           return FALSE;
2574         }
2575
2576       --my_offset;
2577       myh->root.u.def.value = my_offset;
2578
2579       bfd_put_16 (output_bfd, (bfd_vma) t2a1_bx_pc_insn,
2580                   s->contents + my_offset);
2581
2582       bfd_put_16 (output_bfd, (bfd_vma) t2a2_noop_insn,
2583                   s->contents + my_offset + 2);
2584
2585       ret_offset =
2586         /* Address of destination of the stub.  */
2587         ((bfd_signed_vma) val)
2588         - ((bfd_signed_vma)
2589            /* Offset from the start of the current section
2590               to the start of the stubs.  */
2591            (s->output_offset
2592             /* Offset of the start of this stub from the start of the stubs.  */
2593             + my_offset
2594             /* Address of the start of the current section.  */
2595             + s->output_section->vma)
2596            /* The branch instruction is 4 bytes into the stub.  */
2597            + 4
2598            /* ARM branches work from the pc of the instruction + 8.  */
2599            + 8);
2600
2601       bfd_put_32 (output_bfd,
2602                   (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
2603                   s->contents + my_offset + 4);
2604     }
2605
2606   BFD_ASSERT (my_offset <= globals->thumb_glue_size);
2607
2608   /* Now go back and fix up the original BL insn to point to here.  */
2609   ret_offset =
2610     /* Address of where the stub is located.  */
2611     (s->output_section->vma + s->output_offset + my_offset)
2612      /* Address of where the BL is located.  */
2613     - (input_section->output_section->vma + input_section->output_offset
2614        + offset)
2615     /* Addend in the relocation.  */
2616     - addend
2617     /* Biassing for PC-relative addressing.  */
2618     - 8;
2619
2620   tmp = bfd_get_32 (input_bfd, hit_data
2621                     - input_section->vma);
2622
2623   bfd_put_32 (output_bfd,
2624               (bfd_vma) insert_thumb_branch (tmp, ret_offset),
2625               hit_data - input_section->vma);
2626
2627   return TRUE;
2628 }
2629
2630 /* Arm code calling a Thumb function.  */
2631
2632 static int
2633 elf32_arm_to_thumb_stub (struct bfd_link_info * info,
2634                          const char *           name,
2635                          bfd *                  input_bfd,
2636                          bfd *                  output_bfd,
2637                          asection *             input_section,
2638                          bfd_byte *             hit_data,
2639                          asection *             sym_sec,
2640                          bfd_vma                offset,
2641                          bfd_signed_vma         addend,
2642                          bfd_vma                val)
2643 {
2644   unsigned long int tmp;
2645   bfd_vma my_offset;
2646   asection * s;
2647   long int ret_offset;
2648   struct elf_link_hash_entry * myh;
2649   struct elf32_arm_link_hash_table * globals;
2650
2651   myh = find_arm_glue (info, name, input_bfd);
2652   if (myh == NULL)
2653     return FALSE;
2654
2655   globals = elf32_arm_hash_table (info);
2656
2657   BFD_ASSERT (globals != NULL);
2658   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
2659
2660   my_offset = myh->root.u.def.value;
2661   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
2662                                ARM2THUMB_GLUE_SECTION_NAME);
2663   BFD_ASSERT (s != NULL);
2664   BFD_ASSERT (s->contents != NULL);
2665   BFD_ASSERT (s->output_section != NULL);
2666
2667   if ((my_offset & 0x01) == 0x01)
2668     {
2669       if (sym_sec != NULL
2670           && sym_sec->owner != NULL
2671           && !INTERWORK_FLAG (sym_sec->owner))
2672         {
2673           (*_bfd_error_handler)
2674             (_("%B(%s): warning: interworking not enabled.\n"
2675                "  first occurrence: %B: arm call to thumb"),
2676              sym_sec->owner, input_bfd, name);
2677         }
2678
2679       --my_offset;
2680       myh->root.u.def.value = my_offset;
2681
2682       if ((info->shared || globals->root.is_relocatable_executable))
2683         {
2684           /* For relocatable objects we can't use absolute addresses,
2685              so construct the address from a relative offset.  */
2686           /* TODO: If the offset is small it's probably worth
2687              constructing the address with adds.  */
2688           bfd_put_32 (output_bfd, (bfd_vma) a2t1p_ldr_insn,
2689                       s->contents + my_offset);
2690           bfd_put_32 (output_bfd, (bfd_vma) a2t2p_add_pc_insn,
2691                       s->contents + my_offset + 4);
2692           bfd_put_32 (output_bfd, (bfd_vma) a2t3p_bx_r12_insn,
2693                       s->contents + my_offset + 8);
2694           /* Adjust the offset by 4 for the position of the add,
2695              and 8 for the pipeline offset.  */
2696           ret_offset = (val - (s->output_offset
2697                                + s->output_section->vma
2698                                + my_offset + 12))
2699                        | 1;
2700           bfd_put_32 (output_bfd, ret_offset,
2701                       s->contents + my_offset + 12);
2702         }
2703       else
2704         {
2705           bfd_put_32 (output_bfd, (bfd_vma) a2t1_ldr_insn,
2706                       s->contents + my_offset);
2707
2708           bfd_put_32 (output_bfd, (bfd_vma) a2t2_bx_r12_insn,
2709                       s->contents + my_offset + 4);
2710
2711           /* It's a thumb address.  Add the low order bit.  */
2712           bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
2713                       s->contents + my_offset + 8);
2714         }
2715     }
2716
2717   BFD_ASSERT (my_offset <= globals->arm_glue_size);
2718
2719   tmp = bfd_get_32 (input_bfd, hit_data);
2720   tmp = tmp & 0xFF000000;
2721
2722   /* Somehow these are both 4 too far, so subtract 8.  */
2723   ret_offset = (s->output_offset
2724                 + my_offset
2725                 + s->output_section->vma
2726                 - (input_section->output_offset
2727                    + input_section->output_section->vma
2728                    + offset + addend)
2729                 - 8);
2730
2731   tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
2732
2733   bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
2734
2735   return TRUE;
2736 }
2737
2738 /* Some relocations map to different relocations depending on the
2739    target.  Return the real relocation.  */
2740 static int
2741 arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
2742                      int r_type)
2743 {
2744   switch (r_type)
2745     {
2746     case R_ARM_TARGET1:
2747       if (globals->target1_is_rel)
2748         return R_ARM_REL32;
2749       else
2750         return R_ARM_ABS32;
2751
2752     case R_ARM_TARGET2:
2753       return globals->target2_reloc;
2754
2755     default:
2756       return r_type;
2757     }
2758 }
2759
2760 /* Return the base VMA address which should be subtracted from real addresses
2761    when resolving @dtpoff relocation.
2762    This is PT_TLS segment p_vaddr.  */
2763
2764 static bfd_vma
2765 dtpoff_base (struct bfd_link_info *info)
2766 {
2767   /* If tls_sec is NULL, we should have signalled an error already.  */
2768   if (elf_hash_table (info)->tls_sec == NULL)
2769     return 0;
2770   return elf_hash_table (info)->tls_sec->vma;
2771 }
2772
2773 /* Return the relocation value for @tpoff relocation
2774    if STT_TLS virtual address is ADDRESS.  */
2775
2776 static bfd_vma
2777 tpoff (struct bfd_link_info *info, bfd_vma address)
2778 {
2779   struct elf_link_hash_table *htab = elf_hash_table (info);
2780   bfd_vma base;
2781
2782   /* If tls_sec is NULL, we should have signalled an error already.  */
2783   if (htab->tls_sec == NULL)
2784     return 0;
2785   base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
2786   return address - htab->tls_sec->vma + base;
2787 }
2788
2789 /* Perform a relocation as part of a final link.  */
2790
2791 static bfd_reloc_status_type
2792 elf32_arm_final_link_relocate (reloc_howto_type *           howto,
2793                                bfd *                        input_bfd,
2794                                bfd *                        output_bfd,
2795                                asection *                   input_section,
2796                                bfd_byte *                   contents,
2797                                Elf_Internal_Rela *          rel,
2798                                bfd_vma                      value,
2799                                struct bfd_link_info *       info,
2800                                asection *                   sym_sec,
2801                                const char *                 sym_name,
2802                                int                          sym_flags,
2803                                struct elf_link_hash_entry * h,
2804                                bfd_boolean *                unresolved_reloc_p)
2805 {
2806   unsigned long                 r_type = howto->type;
2807   unsigned long                 r_symndx;
2808   bfd_byte *                    hit_data = contents + rel->r_offset;
2809   bfd *                         dynobj = NULL;
2810   Elf_Internal_Shdr *           symtab_hdr;
2811   struct elf_link_hash_entry ** sym_hashes;
2812   bfd_vma *                     local_got_offsets;
2813   asection *                    sgot = NULL;
2814   asection *                    splt = NULL;
2815   asection *                    sreloc = NULL;
2816   bfd_vma                       addend;
2817   bfd_signed_vma                signed_addend;
2818   struct elf32_arm_link_hash_table * globals;
2819
2820   globals = elf32_arm_hash_table (info);
2821
2822   /* Some relocation type map to different relocations depending on the
2823      target.  We pick the right one here.  */
2824   r_type = arm_real_reloc_type (globals, r_type);
2825   if (r_type != howto->type)
2826     howto = elf32_arm_howto_from_type (r_type);
2827
2828   /* If the start address has been set, then set the EF_ARM_HASENTRY
2829      flag.  Setting this more than once is redundant, but the cost is
2830      not too high, and it keeps the code simple.
2831
2832      The test is done  here, rather than somewhere else, because the
2833      start address is only set just before the final link commences.
2834
2835      Note - if the user deliberately sets a start address of 0, the
2836      flag will not be set.  */
2837   if (bfd_get_start_address (output_bfd) != 0)
2838     elf_elfheader (output_bfd)->e_flags |= EF_ARM_HASENTRY;
2839
2840   dynobj = elf_hash_table (info)->dynobj;
2841   if (dynobj)
2842     {
2843       sgot = bfd_get_section_by_name (dynobj, ".got");
2844       splt = bfd_get_section_by_name (dynobj, ".plt");
2845     }
2846   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
2847   sym_hashes = elf_sym_hashes (input_bfd);
2848   local_got_offsets = elf_local_got_offsets (input_bfd);
2849   r_symndx = ELF32_R_SYM (rel->r_info);
2850
2851   if (globals->use_rel)
2852     {
2853       addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
2854
2855       if (addend & ((howto->src_mask + 1) >> 1))
2856         {
2857           signed_addend = -1;
2858           signed_addend &= ~ howto->src_mask;
2859           signed_addend |= addend;
2860         }
2861       else
2862         signed_addend = addend;
2863     }
2864   else
2865     addend = signed_addend = rel->r_addend;
2866
2867   switch (r_type)
2868     {
2869     case R_ARM_NONE:
2870       /* We don't need to find a value for this symbol.  It's just a
2871          marker.  */
2872       *unresolved_reloc_p = FALSE;
2873       return bfd_reloc_ok;
2874
2875     case R_ARM_PC24:
2876     case R_ARM_ABS32:
2877     case R_ARM_REL32:
2878     case R_ARM_CALL:
2879     case R_ARM_JUMP24:
2880     case R_ARM_XPC25:
2881     case R_ARM_PREL31:
2882     case R_ARM_PLT32:
2883       /* r_symndx will be zero only for relocs against symbols
2884          from removed linkonce sections, or sections discarded by
2885          a linker script.  */
2886       if (r_symndx == 0)
2887         return bfd_reloc_ok;
2888
2889       /* Handle relocations which should use the PLT entry.  ABS32/REL32
2890          will use the symbol's value, which may point to a PLT entry, but we
2891          don't need to handle that here.  If we created a PLT entry, all
2892          branches in this object should go to it.  */
2893       if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32)
2894           && h != NULL
2895           && splt != NULL
2896           && h->plt.offset != (bfd_vma) -1)
2897         {
2898           /* If we've created a .plt section, and assigned a PLT entry to
2899              this function, it should not be known to bind locally.  If
2900              it were, we would have cleared the PLT entry.  */
2901           BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
2902
2903           value = (splt->output_section->vma
2904                    + splt->output_offset
2905                    + h->plt.offset);
2906           *unresolved_reloc_p = FALSE;
2907           return _bfd_final_link_relocate (howto, input_bfd, input_section,
2908                                            contents, rel->r_offset, value,
2909                                            (bfd_vma) 0);
2910         }
2911
2912       /* When generating a shared object or relocatable executable, these
2913          relocations are copied into the output file to be resolved at
2914          run time.  */
2915       if ((info->shared || globals->root.is_relocatable_executable)
2916           && (input_section->flags & SEC_ALLOC)
2917           && (r_type != R_ARM_REL32
2918               || !SYMBOL_CALLS_LOCAL (info, h))
2919           && (h == NULL
2920               || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2921               || h->root.type != bfd_link_hash_undefweak)
2922           && r_type != R_ARM_PC24
2923           && r_type != R_ARM_CALL
2924           && r_type != R_ARM_JUMP24
2925           && r_type != R_ARM_PREL31
2926           && r_type != R_ARM_PLT32)
2927         {
2928           Elf_Internal_Rela outrel;
2929           bfd_byte *loc;
2930           bfd_boolean skip, relocate;
2931
2932           *unresolved_reloc_p = FALSE;
2933
2934           if (sreloc == NULL)
2935             {
2936               const char * name;
2937
2938               name = (bfd_elf_string_from_elf_section
2939                       (input_bfd,
2940                        elf_elfheader (input_bfd)->e_shstrndx,
2941                        elf_section_data (input_section)->rel_hdr.sh_name));
2942               if (name == NULL)
2943                 return bfd_reloc_notsupported;
2944
2945               BFD_ASSERT (strncmp (name, ".rel", 4) == 0
2946                           && strcmp (bfd_get_section_name (input_bfd,
2947                                                            input_section),
2948                                      name + 4) == 0);
2949
2950               sreloc = bfd_get_section_by_name (dynobj, name);
2951               BFD_ASSERT (sreloc != NULL);
2952             }
2953
2954           skip = FALSE;
2955           relocate = FALSE;
2956
2957           outrel.r_offset =
2958             _bfd_elf_section_offset (output_bfd, info, input_section,
2959                                      rel->r_offset);
2960           if (outrel.r_offset == (bfd_vma) -1)
2961             skip = TRUE;
2962           else if (outrel.r_offset == (bfd_vma) -2)
2963             skip = TRUE, relocate = TRUE;
2964           outrel.r_offset += (input_section->output_section->vma
2965                               + input_section->output_offset);
2966
2967           if (skip)
2968             memset (&outrel, 0, sizeof outrel);
2969           else if (h != NULL
2970                    && h->dynindx != -1
2971                    && (!info->shared
2972                        || !info->symbolic
2973                        || !h->def_regular))
2974             outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2975           else
2976             {
2977               int symbol;
2978
2979               /* This symbol is local, or marked to become local.  */
2980               relocate = TRUE;
2981               if (sym_flags == STT_ARM_TFUNC)
2982                 value |= 1;
2983               if (globals->symbian_p)
2984                 {
2985                   /* On Symbian OS, the data segment and text segement
2986                      can be relocated independently.  Therefore, we
2987                      must indicate the segment to which this
2988                      relocation is relative.  The BPABI allows us to
2989                      use any symbol in the right segment; we just use
2990                      the section symbol as it is convenient.  (We
2991                      cannot use the symbol given by "h" directly as it
2992                      will not appear in the dynamic symbol table.)  */
2993                   if (sym_sec)
2994                     symbol = elf_section_data (sym_sec->output_section)->dynindx;
2995                   else
2996                     symbol = elf_section_data (input_section->output_section)->dynindx;
2997                   BFD_ASSERT (symbol != 0);
2998                 }
2999               else
3000                 /* On SVR4-ish systems, the dynamic loader cannot
3001                    relocate the text and data segments independently,
3002                    so the symbol does not matter.  */
3003                 symbol = 0;
3004               outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
3005             }
3006
3007           loc = sreloc->contents;
3008           loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
3009           bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3010
3011           /* If this reloc is against an external symbol, we do not want to
3012              fiddle with the addend.  Otherwise, we need to include the symbol
3013              value so that it becomes an addend for the dynamic reloc.  */
3014           if (! relocate)
3015             return bfd_reloc_ok;
3016
3017           return _bfd_final_link_relocate (howto, input_bfd, input_section,
3018                                            contents, rel->r_offset, value,
3019                                            (bfd_vma) 0);
3020         }
3021       else switch (r_type)
3022         {
3023         case R_ARM_XPC25:         /* Arm BLX instruction.  */
3024         case R_ARM_CALL:
3025         case R_ARM_JUMP24:
3026         case R_ARM_PC24:          /* Arm B/BL instruction */
3027         case R_ARM_PLT32:
3028           if (r_type == R_ARM_XPC25)
3029             {
3030               /* Check for Arm calling Arm function.  */
3031               /* FIXME: Should we translate the instruction into a BL
3032                  instruction instead ?  */
3033               if (sym_flags != STT_ARM_TFUNC)
3034                 (*_bfd_error_handler)
3035                   (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
3036                    input_bfd,
3037                    h ? h->root.root.string : "(local)");
3038             }
3039           else
3040             {
3041               /* Check for Arm calling Thumb function.  */
3042               if (sym_flags == STT_ARM_TFUNC)
3043                 {
3044                   elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
3045                                            output_bfd, input_section,
3046                                            hit_data, sym_sec, rel->r_offset,
3047                                            signed_addend, value);
3048                   return bfd_reloc_ok;
3049                 }
3050             }
3051
3052           /* The ARM ELF ABI says that this reloc is computed as: S - P + A
3053              where:
3054               S is the address of the symbol in the relocation.
3055               P is address of the instruction being relocated.
3056               A is the addend (extracted from the instruction) in bytes.
3057
3058              S is held in 'value'.
3059              P is the base address of the section containing the
3060                instruction plus the offset of the reloc into that
3061                section, ie:
3062                  (input_section->output_section->vma +
3063                   input_section->output_offset +
3064                   rel->r_offset).
3065              A is the addend, converted into bytes, ie:
3066                  (signed_addend * 4)
3067
3068              Note: None of these operations have knowledge of the pipeline
3069              size of the processor, thus it is up to the assembler to
3070              encode this information into the addend.  */
3071           value -= (input_section->output_section->vma
3072                     + input_section->output_offset);
3073           value -= rel->r_offset;
3074           if (globals->use_rel)
3075             value += (signed_addend << howto->size);
3076           else
3077             /* RELA addends do not have to be adjusted by howto->size.  */
3078             value += signed_addend;
3079
3080           signed_addend = value;
3081           signed_addend >>= howto->rightshift;
3082
3083           /* It is not an error for an undefined weak reference to be
3084              out of range.  Any program that branches to such a symbol
3085              is going to crash anyway, so there is no point worrying
3086              about getting the destination exactly right.  */
3087           if (! h || h->root.type != bfd_link_hash_undefweak)
3088             {
3089               /* Perform a signed range check.  */
3090               if (   signed_addend >   ((bfd_signed_vma)  (howto->dst_mask >> 1))
3091                   || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
3092                 return bfd_reloc_overflow;
3093             }
3094
3095           /* If necessary set the H bit in the BLX instruction.  */
3096           if (r_type == R_ARM_XPC25 && ((value & 2) == 2))
3097             value = (signed_addend & howto->dst_mask)
3098               | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask))
3099               | (1 << 24);
3100           else
3101             value = (signed_addend & howto->dst_mask)
3102               | (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
3103           break;
3104
3105         case R_ARM_ABS32:
3106           value += addend;
3107           if (sym_flags == STT_ARM_TFUNC)
3108             value |= 1;
3109           break;
3110
3111         case R_ARM_REL32:
3112           value -= (input_section->output_section->vma
3113                     + input_section->output_offset + rel->r_offset);
3114           value += addend;
3115           break;
3116
3117         case R_ARM_PREL31:
3118           value -= (input_section->output_section->vma
3119                     + input_section->output_offset + rel->r_offset);
3120           value += signed_addend;
3121           if (! h || h->root.type != bfd_link_hash_undefweak)
3122             {
3123               /* Check for overflow */
3124               if ((value ^ (value >> 1)) & (1 << 30))
3125                 return bfd_reloc_overflow;
3126             }
3127           value &= 0x7fffffff;
3128           value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
3129           if (sym_flags == STT_ARM_TFUNC)
3130             value |= 1;
3131           break;
3132         }
3133
3134       bfd_put_32 (input_bfd, value, hit_data);
3135       return bfd_reloc_ok;
3136
3137     case R_ARM_ABS8:
3138       value += addend;
3139       if ((long) value > 0x7f || (long) value < -0x80)
3140         return bfd_reloc_overflow;
3141
3142       bfd_put_8 (input_bfd, value, hit_data);
3143       return bfd_reloc_ok;
3144
3145     case R_ARM_ABS16:
3146       value += addend;
3147
3148       if ((long) value > 0x7fff || (long) value < -0x8000)
3149         return bfd_reloc_overflow;
3150
3151       bfd_put_16 (input_bfd, value, hit_data);
3152       return bfd_reloc_ok;
3153
3154     case R_ARM_ABS12:
3155       /* Support ldr and str instruction for the arm */
3156       /* Also thumb b (unconditional branch).  ??? Really?  */
3157       value += addend;
3158
3159       if ((long) value > 0x7ff || (long) value < -0x800)
3160         return bfd_reloc_overflow;
3161
3162       value |= (bfd_get_32 (input_bfd, hit_data) & 0xfffff000);
3163       bfd_put_32 (input_bfd, value, hit_data);
3164       return bfd_reloc_ok;
3165
3166     case R_ARM_THM_ABS5:
3167       /* Support ldr and str instructions for the thumb.  */
3168       if (globals->use_rel)
3169         {
3170           /* Need to refetch addend.  */
3171           addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
3172           /* ??? Need to determine shift amount from operand size.  */
3173           addend >>= howto->rightshift;
3174         }
3175       value += addend;
3176
3177       /* ??? Isn't value unsigned?  */
3178       if ((long) value > 0x1f || (long) value < -0x10)
3179         return bfd_reloc_overflow;
3180
3181       /* ??? Value needs to be properly shifted into place first.  */
3182       value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
3183       bfd_put_16 (input_bfd, value, hit_data);
3184       return bfd_reloc_ok;
3185
3186     case R_ARM_THM_XPC22:
3187     case R_ARM_THM_CALL:
3188       /* Thumb BL (branch long instruction).  */
3189       {
3190         bfd_vma relocation;
3191         bfd_boolean overflow = FALSE;
3192         bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
3193         bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
3194         bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
3195         bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3196         bfd_vma check;
3197         bfd_signed_vma signed_check;
3198         bfd_boolean thumb_plt_call = FALSE;
3199
3200         /* Need to refetch the addend and squish the two 11 bit pieces
3201            together.  */
3202         if (globals->use_rel)
3203           {
3204             bfd_vma upper = upper_insn & 0x7ff;
3205             bfd_vma lower = lower_insn & 0x7ff;
3206             upper = (upper ^ 0x400) - 0x400; /* Sign extend.  */
3207             addend = (upper << 12) | (lower << 1);
3208             signed_addend = addend;
3209           }
3210
3211         if (r_type == R_ARM_THM_XPC22)
3212           {
3213             /* Check for Thumb to Thumb call.  */
3214             /* FIXME: Should we translate the instruction into a BL
3215                instruction instead ?  */
3216             if (sym_flags == STT_ARM_TFUNC)
3217               (*_bfd_error_handler)
3218                 (_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
3219                  input_bfd,
3220                  h ? h->root.root.string : "(local)");
3221           }
3222         else
3223           {
3224             /* If it is not a call to Thumb, assume call to Arm.
3225                If it is a call relative to a section name, then it is not a
3226                function call at all, but rather a long jump.  Calls through
3227                the PLT do not require stubs.  */
3228             if (sym_flags != STT_ARM_TFUNC && sym_flags != STT_SECTION
3229                 && (h == NULL || splt == NULL
3230                     || h->plt.offset == (bfd_vma) -1))
3231               {
3232                 if (elf32_thumb_to_arm_stub
3233                     (info, sym_name, input_bfd, output_bfd, input_section,
3234                      hit_data, sym_sec, rel->r_offset, signed_addend, value))
3235                   return bfd_reloc_ok;
3236                 else
3237                   return bfd_reloc_dangerous;
3238               }
3239           }
3240
3241         /* Handle calls via the PLT.  */
3242         if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
3243           {
3244             value = (splt->output_section->vma
3245                      + splt->output_offset
3246                      + h->plt.offset);
3247             if (globals->use_blx)
3248               {
3249                 /* If the Thumb BLX instruction is available, convert the
3250                    BL to a BLX instruction to call the ARM-mode PLT entry.  */
3251                 if ((lower_insn & (0x3 << 11)) == 0x3 << 11)
3252                   {
3253                     lower_insn = (lower_insn & ~(0x3 << 11)) | 0x1 << 11;
3254                     thumb_plt_call = TRUE;
3255                   }
3256               }
3257             else
3258               /* Target the Thumb stub before the ARM PLT entry.  */
3259               value -= PLT_THUMB_STUB_SIZE;
3260             *unresolved_reloc_p = FALSE;
3261           }
3262
3263         relocation = value + signed_addend;
3264
3265         relocation -= (input_section->output_section->vma
3266                        + input_section->output_offset
3267                        + rel->r_offset);
3268
3269         check = relocation >> howto->rightshift;
3270
3271         /* If this is a signed value, the rightshift just dropped
3272            leading 1 bits (assuming twos complement).  */
3273         if ((bfd_signed_vma) relocation >= 0)
3274           signed_check = check;
3275         else
3276           signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
3277
3278         /* Assumes two's complement.  */
3279         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3280           overflow = TRUE;
3281
3282         if ((r_type == R_ARM_THM_XPC22
3283              && ((lower_insn & 0x1800) == 0x0800))
3284             || thumb_plt_call)
3285           /* For a BLX instruction, make sure that the relocation is rounded up
3286              to a word boundary.  This follows the semantics of the instruction
3287              which specifies that bit 1 of the target address will come from bit
3288              1 of the base address.  */
3289           relocation = (relocation + 2) & ~ 3;
3290
3291         /* Put RELOCATION back into the insn.  */
3292         upper_insn = (upper_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 12) & 0x7ff);
3293         lower_insn = (lower_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 1) & 0x7ff);
3294
3295         /* Put the relocated value back in the object file:  */
3296         bfd_put_16 (input_bfd, upper_insn, hit_data);
3297         bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
3298
3299         return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
3300       }
3301       break;
3302
3303     case R_ARM_THM_JUMP24:
3304       /* Thumb32 unconditional branch instruction.  */
3305       {
3306         bfd_vma relocation;
3307         bfd_boolean overflow = FALSE;
3308         bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
3309         bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
3310         bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
3311         bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3312         bfd_vma check;
3313         bfd_signed_vma signed_check;
3314
3315         /* Need to refetch the addend, reconstruct the top three bits, and glue the
3316            two pieces together.  */
3317         if (globals->use_rel)
3318           {
3319             bfd_vma S  = (upper_insn & 0x0400) >> 10;
3320             bfd_vma hi = (upper_insn & 0x03ff);
3321             bfd_vma I1 = (lower_insn & 0x2000) >> 13;
3322             bfd_vma I2 = (lower_insn & 0x0800) >> 11;
3323             bfd_vma lo = (lower_insn & 0x07ff);
3324
3325             I1 = !(I1 ^ S);
3326             I2 = !(I2 ^ S);
3327             S  = !S;
3328
3329             signed_addend = (S << 24) | (I1 << 23) | (I2 << 22) | (hi << 12) | (lo << 1);
3330             signed_addend -= (1 << 24); /* Sign extend.  */
3331           }
3332
3333         /* ??? Should handle interworking?  GCC might someday try to
3334            use this for tail calls.  */
3335
3336         relocation = value + signed_addend;
3337         relocation -= (input_section->output_section->vma
3338                        + input_section->output_offset
3339                        + rel->r_offset);
3340
3341         check = relocation >> howto->rightshift;
3342
3343         /* If this is a signed value, the rightshift just dropped
3344            leading 1 bits (assuming twos complement).  */
3345         if ((bfd_signed_vma) relocation >= 0)
3346           signed_check = check;
3347         else
3348           signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
3349
3350         /* Assumes two's complement.  */
3351         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3352           overflow = TRUE;
3353
3354         /* Put RELOCATION back into the insn.  */
3355         {
3356           bfd_vma S  = (relocation & 0x01000000) >> 24;
3357           bfd_vma I1 = (relocation & 0x00800000) >> 23;
3358           bfd_vma I2 = (relocation & 0x00400000) >> 22;
3359           bfd_vma hi = (relocation & 0x003ff000) >> 12;
3360           bfd_vma lo = (relocation & 0x00000ffe) >>  1;
3361
3362           I1 = !(I1 ^ S);
3363           I2 = !(I2 ^ S);
3364
3365           upper_insn = (upper_insn & (bfd_vma) 0xf800) | (S << 10) | hi;
3366           lower_insn = (lower_insn & (bfd_vma) 0xd000) | (I1 << 13) | (I2 << 11) | lo;
3367         }
3368
3369         /* Put the relocated value back in the object file:  */
3370         bfd_put_16 (input_bfd, upper_insn, hit_data);
3371         bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
3372
3373         return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
3374       }
3375
3376     case R_ARM_THM_JUMP19:
3377       /* Thumb32 conditional branch instruction.  */
3378       {
3379         bfd_vma relocation;
3380         bfd_boolean overflow = FALSE;
3381         bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
3382         bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
3383         bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
3384         bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3385         bfd_vma check;
3386         bfd_signed_vma signed_check;
3387
3388         /* Need to refetch the addend, reconstruct the top three bits,
3389            and squish the two 11 bit pieces together.  */
3390         if (globals->use_rel)
3391           {
3392             bfd_vma S     = (upper_insn & 0x0400) >> 10;
3393             bfd_vma upper = (upper_insn & 0x001f);
3394             bfd_vma J1    = (lower_insn & 0x2000) >> 13;
3395             bfd_vma J2    = (lower_insn & 0x0800) >> 11;
3396             bfd_vma lower = (lower_insn & 0x07ff);
3397
3398             upper |= J2 << 6;
3399             upper |= J1 << 7;
3400             upper |= ~S << 8;
3401             upper -= 0x0100; /* Sign extend.  */
3402
3403             addend = (upper << 12) | (lower << 1);
3404             signed_addend = addend;
3405           }
3406
3407         /* ??? Should handle interworking?  GCC might someday try to
3408            use this for tail calls.  */
3409
3410         relocation = value + signed_addend;
3411         relocation -= (input_section->output_section->vma
3412                        + input_section->output_offset
3413                        + rel->r_offset);
3414
3415         check = relocation >> howto->rightshift;
3416
3417         /* If this is a signed value, the rightshift just dropped
3418            leading 1 bits (assuming twos complement).  */
3419         if ((bfd_signed_vma) relocation >= 0)
3420           signed_check = check;
3421         else
3422           signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
3423
3424         /* Assumes two's complement.  */
3425         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3426           overflow = TRUE;
3427
3428         /* Put RELOCATION back into the insn.  */
3429         {
3430           bfd_vma S  = (relocation & 0x00100000) >> 20;
3431           bfd_vma J2 = (relocation & 0x00080000) >> 19;
3432           bfd_vma J1 = (relocation & 0x00040000) >> 18;
3433           bfd_vma hi = (relocation & 0x0003f000) >> 12;
3434           bfd_vma lo = (relocation & 0x00000ffe) >>  1;
3435
3436           upper_insn = (upper_insn & 0xfb30) | (S << 10) | hi;
3437           lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
3438         }
3439
3440         /* Put the relocated value back in the object file:  */
3441         bfd_put_16 (input_bfd, upper_insn, hit_data);
3442         bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
3443
3444         return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
3445       }
3446
3447     case R_ARM_THM_JUMP11:
3448     case R_ARM_THM_JUMP8:
3449     case R_ARM_THM_JUMP6:
3450       /* Thumb B (branch) instruction).  */
3451       {
3452         bfd_signed_vma relocation;
3453         bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
3454         bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
3455         bfd_signed_vma signed_check;
3456
3457         /* CZB cannot jump backward.  */
3458         if (r_type == R_ARM_THM_JUMP6)
3459           reloc_signed_min = 0;
3460
3461         if (globals->use_rel)
3462           {
3463             /* Need to refetch addend.  */
3464             addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
3465             if (addend & ((howto->src_mask + 1) >> 1))
3466               {
3467                 signed_addend = -1;
3468                 signed_addend &= ~ howto->src_mask;
3469                 signed_addend |= addend;
3470               }
3471             else
3472               signed_addend = addend;
3473             /* The value in the insn has been right shifted.  We need to
3474                undo this, so that we can perform the address calculation
3475                in terms of bytes.  */
3476             signed_addend <<= howto->rightshift;
3477           }
3478         relocation = value + signed_addend;
3479
3480         relocation -= (input_section->output_section->vma
3481                        + input_section->output_offset
3482                        + rel->r_offset);
3483
3484         relocation >>= howto->rightshift;
3485         signed_check = relocation;
3486
3487         if (r_type == R_ARM_THM_JUMP6)
3488           relocation = ((relocation & 0x0020) << 4) | ((relocation & 0x001f) << 3);
3489         else
3490           relocation &= howto->dst_mask;
3491         relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
3492
3493         bfd_put_16 (input_bfd, relocation, hit_data);
3494
3495         /* Assumes two's complement.  */
3496         if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
3497           return bfd_reloc_overflow;
3498
3499         return bfd_reloc_ok;
3500       }
3501
3502     case R_ARM_ALU_PCREL7_0:
3503     case R_ARM_ALU_PCREL15_8:
3504     case R_ARM_ALU_PCREL23_15:
3505       {
3506         bfd_vma insn;
3507         bfd_vma relocation;
3508
3509         insn = bfd_get_32 (input_bfd, hit_data);
3510         if (globals->use_rel)
3511           {
3512             /* Extract the addend.  */
3513             addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
3514             signed_addend = addend;
3515           }
3516         relocation = value + signed_addend;
3517
3518         relocation -= (input_section->output_section->vma
3519                        + input_section->output_offset
3520                        + rel->r_offset);
3521         insn = (insn & ~0xfff)
3522                | ((howto->bitpos << 7) & 0xf00)
3523                | ((relocation >> howto->bitpos) & 0xff);
3524         bfd_put_32 (input_bfd, value, hit_data);
3525       }
3526       return bfd_reloc_ok;
3527
3528     case R_ARM_GNU_VTINHERIT:
3529     case R_ARM_GNU_VTENTRY:
3530       return bfd_reloc_ok;
3531
3532     case R_ARM_GOTOFF32:
3533       /* Relocation is relative to the start of the
3534          global offset table.  */
3535
3536       BFD_ASSERT (sgot != NULL);
3537       if (sgot == NULL)
3538         return bfd_reloc_notsupported;
3539
3540       /* If we are addressing a Thumb function, we need to adjust the
3541          address by one, so that attempts to call the function pointer will
3542          correctly interpret it as Thumb code.  */
3543       if (sym_flags == STT_ARM_TFUNC)
3544         value += 1;
3545
3546       /* Note that sgot->output_offset is not involved in this
3547          calculation.  We always want the start of .got.  If we
3548          define _GLOBAL_OFFSET_TABLE in a different way, as is
3549          permitted by the ABI, we might have to change this
3550          calculation.  */
3551       value -= sgot->output_section->vma;
3552       return _bfd_final_link_relocate (howto, input_bfd, input_section,
3553                                        contents, rel->r_offset, value,
3554                                        (bfd_vma) 0);
3555
3556     case R_ARM_GOTPC:
3557       /* Use global offset table as symbol value.  */
3558       BFD_ASSERT (sgot != NULL);
3559
3560       if (sgot == NULL)
3561         return bfd_reloc_notsupported;
3562
3563       *unresolved_reloc_p = FALSE;
3564       value = sgot->output_section->vma;
3565       return _bfd_final_link_relocate (howto, input_bfd, input_section,
3566                                        contents, rel->r_offset, value,
3567                                        (bfd_vma) 0);
3568
3569     case R_ARM_GOT32:
3570     case R_ARM_GOT_PREL:
3571       /* Relocation is to the entry for this symbol in the
3572          global offset table.  */
3573       if (sgot == NULL)
3574         return bfd_reloc_notsupported;
3575
3576       if (h != NULL)
3577         {
3578           bfd_vma off;
3579           bfd_boolean dyn;
3580
3581           off = h->got.offset;
3582           BFD_ASSERT (off != (bfd_vma) -1);
3583           dyn = globals->root.dynamic_sections_created;
3584
3585           if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3586               || (info->shared
3587                   && SYMBOL_REFERENCES_LOCAL (info, h))
3588               || (ELF_ST_VISIBILITY (h->other)
3589                   && h->root.type == bfd_link_hash_undefweak))
3590             {
3591               /* This is actually a static link, or it is a -Bsymbolic link
3592                  and the symbol is defined locally.  We must initialize this
3593                  entry in the global offset table.  Since the offset must
3594                  always be a multiple of 4, we use the least significant bit
3595                  to record whether we have initialized it already.
3596
3597                  When doing a dynamic link, we create a .rel.got relocation
3598                  entry to initialize the value.  This is done in the
3599                  finish_dynamic_symbol routine.  */
3600               if ((off & 1) != 0)
3601                 off &= ~1;
3602               else
3603                 {
3604                   /* If we are addressing a Thumb function, we need to
3605                      adjust the address by one, so that attempts to
3606                      call the function pointer will correctly
3607                      interpret it as Thumb code.  */
3608                   if (sym_flags == STT_ARM_TFUNC)
3609                     value |= 1;
3610
3611                   bfd_put_32 (output_bfd, value, sgot->contents + off);
3612                   h->got.offset |= 1;
3613                 }
3614             }
3615           else
3616             *unresolved_reloc_p = FALSE;
3617
3618           value = sgot->output_offset + off;
3619         }
3620       else
3621         {
3622           bfd_vma off;
3623
3624           BFD_ASSERT (local_got_offsets != NULL &&
3625                       local_got_offsets[r_symndx] != (bfd_vma) -1);
3626
3627           off = local_got_offsets[r_symndx];
3628
3629           /* The offset must always be a multiple of 4.  We use the
3630              least significant bit to record whether we have already
3631              generated the necessary reloc.  */
3632           if ((off & 1) != 0)
3633             off &= ~1;
3634           else
3635             {
3636               /* If we are addressing a Thumb function, we need to
3637                  adjust the address by one, so that attempts to
3638                  call the function pointer will correctly
3639                  interpret it as Thumb code.  */
3640               if (sym_flags == STT_ARM_TFUNC)
3641                 value |= 1;
3642
3643               bfd_put_32 (output_bfd, value, sgot->contents + off);
3644
3645               if (info->shared)
3646                 {
3647                   asection * srelgot;
3648                   Elf_Internal_Rela outrel;
3649                   bfd_byte *loc;
3650
3651                   srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
3652                   BFD_ASSERT (srelgot != NULL);
3653
3654                   outrel.r_offset = (sgot->output_section->vma
3655                                      + sgot->output_offset
3656                                      + off);
3657                   outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
3658                   loc = srelgot->contents;
3659                   loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
3660                   bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3661                 }
3662
3663               local_got_offsets[r_symndx] |= 1;
3664             }
3665
3666           value = sgot->output_offset + off;
3667         }
3668       if (r_type != R_ARM_GOT32)
3669         value += sgot->output_section->vma;
3670
3671       return _bfd_final_link_relocate (howto, input_bfd, input_section,
3672                                        contents, rel->r_offset, value,
3673                                        (bfd_vma) 0);
3674
3675     case R_ARM_TLS_LDO32:
3676       value = value - dtpoff_base (info);
3677
3678       return _bfd_final_link_relocate (howto, input_bfd, input_section,
3679                                        contents, rel->r_offset, value, (bfd_vma) 0);
3680
3681     case R_ARM_TLS_LDM32:
3682       {
3683         bfd_vma off;
3684
3685         if (globals->sgot == NULL)
3686           abort ();
3687
3688         off = globals->tls_ldm_got.offset;
3689
3690         if ((off & 1) != 0)
3691           off &= ~1;
3692         else
3693           {
3694             /* If we don't know the module number, create a relocation
3695                for it.  */
3696             if (info->shared)
3697               {
3698                 Elf_Internal_Rela outrel;
3699                 bfd_byte *loc;
3700
3701                 if (globals->srelgot == NULL)
3702                   abort ();
3703
3704                 outrel.r_offset = (globals->sgot->output_section->vma
3705                                    + globals->sgot->output_offset + off);
3706                 outrel.r_info = ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32);
3707
3708                 bfd_put_32 (output_bfd, 0, globals->sgot->contents + off);
3709
3710                 loc = globals->srelgot->contents;
3711                 loc += globals->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
3712                 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3713               }
3714             else
3715               bfd_put_32 (output_bfd, 1, globals->sgot->contents + off);
3716
3717             globals->tls_ldm_got.offset |= 1;
3718           }
3719
3720         value = globals->sgot->output_section->vma + globals->sgot->output_offset + off 
3721           - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
3722
3723         return _bfd_final_link_relocate (howto, input_bfd, input_section,
3724                                          contents, rel->r_offset, value,
3725                                          (bfd_vma) 0);
3726       }
3727
3728     case R_ARM_TLS_GD32:
3729     case R_ARM_TLS_IE32:
3730       {
3731         bfd_vma off;
3732         int indx;
3733         char tls_type;
3734
3735         if (globals->sgot == NULL)
3736           abort ();
3737
3738         indx = 0;
3739         if (h != NULL)
3740           {
3741             bfd_boolean dyn;
3742             dyn = globals->root.dynamic_sections_created;
3743             if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3744                 && (!info->shared
3745                     || !SYMBOL_REFERENCES_LOCAL (info, h)))
3746               {
3747                 *unresolved_reloc_p = FALSE;
3748                 indx = h->dynindx;
3749               }
3750             off = h->got.offset;
3751             tls_type = ((struct elf32_arm_link_hash_entry *) h)->tls_type;
3752           }
3753         else
3754           {
3755             if (local_got_offsets == NULL)
3756               abort ();
3757             off = local_got_offsets[r_symndx];
3758             tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
3759           }
3760
3761         if (tls_type == GOT_UNKNOWN)
3762           abort ();
3763
3764         if ((off & 1) != 0)
3765           off &= ~1;
3766         else
3767           {
3768             bfd_boolean need_relocs = FALSE;
3769             Elf_Internal_Rela outrel;
3770             bfd_byte *loc = NULL;
3771             int cur_off = off;
3772
3773             /* The GOT entries have not been initialized yet.  Do it
3774                now, and emit any relocations.  If both an IE GOT and a
3775                GD GOT are necessary, we emit the GD first.  */
3776
3777             if ((info->shared || indx != 0)
3778                 && (h == NULL
3779                     || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3780                     || h->root.type != bfd_link_hash_undefweak))
3781               {
3782                 need_relocs = TRUE;
3783                 if (globals->srelgot == NULL)
3784                   abort ();
3785                 loc = globals->srelgot->contents;
3786                 loc += globals->srelgot->reloc_count * sizeof (Elf32_External_Rel);
3787               }
3788
3789             if (tls_type & GOT_TLS_GD)
3790               {
3791                 if (need_relocs)
3792                   {
3793                     outrel.r_offset = (globals->sgot->output_section->vma
3794                                        + globals->sgot->output_offset + cur_off);
3795                     outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DTPMOD32);
3796                     bfd_put_32 (output_bfd, 0, globals->sgot->contents + cur_off);
3797
3798                     bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3799                     globals->srelgot->reloc_count++;
3800                     loc += sizeof (Elf32_External_Rel);
3801
3802                     if (indx == 0)
3803                       bfd_put_32 (output_bfd, value - dtpoff_base (info),
3804                                   globals->sgot->contents + cur_off + 4);
3805                     else
3806                       {
3807                         bfd_put_32 (output_bfd, 0,
3808                                     globals->sgot->contents + cur_off + 4);
3809
3810                         outrel.r_info = ELF32_R_INFO (indx,
3811                                                       R_ARM_TLS_DTPOFF32);
3812                         outrel.r_offset += 4;
3813                         bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3814                         globals->srelgot->reloc_count++;
3815                         loc += sizeof (Elf32_External_Rel);
3816                       }
3817                   }
3818                 else
3819                   {
3820                     /* If we are not emitting relocations for a
3821                        general dynamic reference, then we must be in a
3822                        static link or an executable link with the
3823                        symbol binding locally.  Mark it as belonging
3824                        to module 1, the executable.  */
3825                     bfd_put_32 (output_bfd, 1,
3826                                 globals->sgot->contents + cur_off);
3827                     bfd_put_32 (output_bfd, value - dtpoff_base (info),
3828                                 globals->sgot->contents + cur_off + 4);
3829                   }
3830
3831                 cur_off += 8;
3832               }
3833
3834             if (tls_type & GOT_TLS_IE)
3835               {
3836                 if (need_relocs)
3837                   {
3838                     outrel.r_offset = (globals->sgot->output_section->vma
3839                                        + globals->sgot->output_offset
3840                                        + cur_off);
3841                     outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_TPOFF32);
3842
3843                     if (indx == 0)
3844                       bfd_put_32 (output_bfd, value - dtpoff_base (info),
3845                                   globals->sgot->contents + cur_off);
3846                     else
3847                       bfd_put_32 (output_bfd, 0,
3848                                   globals->sgot->contents + cur_off);
3849
3850                     bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3851                     globals->srelgot->reloc_count++;
3852                     loc += sizeof (Elf32_External_Rel);
3853                   }
3854                 else
3855                   bfd_put_32 (output_bfd, tpoff (info, value),
3856                               globals->sgot->contents + cur_off);
3857                 cur_off += 4;
3858               }
3859
3860             if (h != NULL)
3861               h->got.offset |= 1;
3862             else
3863               local_got_offsets[r_symndx] |= 1;
3864           }
3865
3866         if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32)
3867           off += 8;
3868         value = globals->sgot->output_section->vma + globals->sgot->output_offset + off 
3869           - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
3870
3871         return _bfd_final_link_relocate (howto, input_bfd, input_section,
3872                                          contents, rel->r_offset, value,
3873                                          (bfd_vma) 0);
3874       }
3875
3876     case R_ARM_TLS_LE32:
3877       if (info->shared)
3878         {
3879           (*_bfd_error_handler)
3880             (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
3881              input_bfd, input_section,
3882              (long) rel->r_offset, howto->name);
3883           return FALSE;   
3884         }
3885       else
3886         value = tpoff (info, value);
3887       
3888       return _bfd_final_link_relocate (howto, input_bfd, input_section,
3889                                        contents, rel->r_offset, value, (bfd_vma) 0);
3890
3891     case R_ARM_V4BX:
3892       if (globals->fix_v4bx)
3893         {
3894           bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
3895
3896           /* Ensure that we have a BX instruction.  */
3897           BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
3898
3899           /* Preserve Rm (lowest four bits) and the condition code
3900              (highest four bits). Other bits encode MOV PC,Rm.  */
3901           insn = (insn & 0xf000000f) | 0x01a0f000;
3902
3903           bfd_put_32 (input_bfd, insn, hit_data);
3904         }
3905       return bfd_reloc_ok;
3906
3907     default:
3908       return bfd_reloc_notsupported;
3909     }
3910 }
3911
3912 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS.  */
3913 static void
3914 arm_add_to_rel (bfd *              abfd,
3915                 bfd_byte *         address,
3916                 reloc_howto_type * howto,
3917                 bfd_signed_vma     increment)
3918 {
3919   bfd_signed_vma addend;
3920
3921   if (howto->type == R_ARM_THM_CALL)
3922     {
3923       int upper_insn, lower_insn;
3924       int upper, lower;
3925
3926       upper_insn = bfd_get_16 (abfd, address);
3927       lower_insn = bfd_get_16 (abfd, address + 2);
3928       upper = upper_insn & 0x7ff;
3929       lower = lower_insn & 0x7ff;
3930
3931       addend = (upper << 12) | (lower << 1);
3932       addend += increment;
3933       addend >>= 1;
3934
3935       upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
3936       lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
3937
3938       bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
3939       bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
3940     }
3941   else
3942     {
3943       bfd_vma        contents;
3944
3945       contents = bfd_get_32 (abfd, address);
3946
3947       /* Get the (signed) value from the instruction.  */
3948       addend = contents & howto->src_mask;
3949       if (addend & ((howto->src_mask + 1) >> 1))
3950         {
3951           bfd_signed_vma mask;
3952
3953           mask = -1;
3954           mask &= ~ howto->src_mask;
3955           addend |= mask;
3956         }
3957
3958       /* Add in the increment, (which is a byte value).  */
3959       switch (howto->type)
3960         {
3961         default:
3962           addend += increment;
3963           break;
3964
3965         case R_ARM_PC24:
3966         case R_ARM_PLT32:
3967         case R_ARM_CALL:
3968         case R_ARM_JUMP24:
3969           addend <<= howto->size;
3970           addend += increment;
3971
3972           /* Should we check for overflow here ?  */
3973
3974           /* Drop any undesired bits.  */
3975           addend >>= howto->rightshift;
3976           break;
3977         }
3978
3979       contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
3980
3981       bfd_put_32 (abfd, contents, address);
3982     }
3983 }
3984
3985 #define IS_ARM_TLS_RELOC(R_TYPE)        \
3986   ((R_TYPE) == R_ARM_TLS_GD32           \
3987    || (R_TYPE) == R_ARM_TLS_LDO32       \
3988    || (R_TYPE) == R_ARM_TLS_LDM32       \
3989    || (R_TYPE) == R_ARM_TLS_DTPOFF32    \
3990    || (R_TYPE) == R_ARM_TLS_DTPMOD32    \
3991    || (R_TYPE) == R_ARM_TLS_TPOFF32     \
3992    || (R_TYPE) == R_ARM_TLS_LE32        \
3993    || (R_TYPE) == R_ARM_TLS_IE32)
3994
3995 /* Relocate an ARM ELF section.  */
3996 static bfd_boolean
3997 elf32_arm_relocate_section (bfd *                  output_bfd,
3998                             struct bfd_link_info * info,
3999                             bfd *                  input_bfd,
4000                             asection *             input_section,
4001                             bfd_byte *             contents,
4002                             Elf_Internal_Rela *    relocs,
4003                             Elf_Internal_Sym *     local_syms,
4004                             asection **            local_sections)
4005 {
4006   Elf_Internal_Shdr *symtab_hdr;
4007   struct elf_link_hash_entry **sym_hashes;
4008   Elf_Internal_Rela *rel;
4009   Elf_Internal_Rela *relend;
4010   const char *name;
4011   struct elf32_arm_link_hash_table * globals;
4012
4013   globals = elf32_arm_hash_table (info);
4014   if (info->relocatable && !globals->use_rel)
4015     return TRUE;
4016
4017   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
4018   sym_hashes = elf_sym_hashes (input_bfd);
4019
4020   rel = relocs;
4021   relend = relocs + input_section->reloc_count;
4022   for (; rel < relend; rel++)
4023     {
4024       int                          r_type;
4025       reloc_howto_type *           howto;
4026       unsigned long                r_symndx;
4027       Elf_Internal_Sym *           sym;
4028       asection *                   sec;
4029       struct elf_link_hash_entry * h;
4030       bfd_vma                      relocation;
4031       bfd_reloc_status_type        r;
4032       arelent                      bfd_reloc;
4033       char                         sym_type;
4034       bfd_boolean                  unresolved_reloc = FALSE;
4035
4036       r_symndx = ELF32_R_SYM (rel->r_info);
4037       r_type   = ELF32_R_TYPE (rel->r_info);
4038       r_type   = arm_real_reloc_type (globals, r_type);
4039
4040       if (   r_type == R_ARM_GNU_VTENTRY
4041           || r_type == R_ARM_GNU_VTINHERIT)
4042         continue;
4043
4044       bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
4045       howto = bfd_reloc.howto;
4046
4047       if (info->relocatable && globals->use_rel)
4048         {
4049           /* This is a relocatable link.  We don't have to change
4050              anything, unless the reloc is against a section symbol,
4051              in which case we have to adjust according to where the
4052              section symbol winds up in the output section.  */
4053           if (r_symndx < symtab_hdr->sh_info)
4054             {
4055               sym = local_syms + r_symndx;
4056               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4057                 {
4058                   sec = local_sections[r_symndx];
4059                   arm_add_to_rel (input_bfd, contents + rel->r_offset,
4060                                   howto,
4061                                   (bfd_signed_vma) (sec->output_offset
4062                                                     + sym->st_value));
4063                 }
4064             }
4065
4066           continue;
4067         }
4068
4069       /* This is a final link.  */
4070       h = NULL;
4071       sym = NULL;
4072       sec = NULL;
4073
4074       if (r_symndx < symtab_hdr->sh_info)
4075         {
4076           sym = local_syms + r_symndx;
4077           sym_type = ELF32_ST_TYPE (sym->st_info);
4078           sec = local_sections[r_symndx];
4079           if (globals->use_rel)
4080             {
4081               relocation = (sec->output_section->vma
4082                             + sec->output_offset
4083                             + sym->st_value);
4084               if ((sec->flags & SEC_MERGE)
4085                        && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4086                 {
4087                   asection *msec;
4088                   bfd_vma addend, value;
4089
4090                   if (howto->rightshift)
4091                     {
4092                       (*_bfd_error_handler)
4093                         (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
4094                          input_bfd, input_section,
4095                          (long) rel->r_offset, howto->name);
4096                       return FALSE;
4097                     }
4098
4099                   value = bfd_get_32 (input_bfd, contents + rel->r_offset);
4100
4101                   /* Get the (signed) value from the instruction.  */
4102                   addend = value & howto->src_mask;
4103                   if (addend & ((howto->src_mask + 1) >> 1))
4104                     {
4105                       bfd_signed_vma mask;
4106
4107                       mask = -1;
4108                       mask &= ~ howto->src_mask;
4109                       addend |= mask;
4110                     }
4111                   msec = sec;
4112                   addend =
4113                     _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
4114                     - relocation;
4115                   addend += msec->output_section->vma + msec->output_offset;
4116                   value = (value & ~ howto->dst_mask) | (addend & howto->dst_mask);
4117                   bfd_put_32 (input_bfd, value, contents + rel->r_offset);
4118                 }
4119             }
4120           else
4121             relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4122         }
4123       else
4124         {
4125           bfd_boolean warned;
4126
4127           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4128                                    r_symndx, symtab_hdr, sym_hashes,
4129                                    h, sec, relocation,
4130                                    unresolved_reloc, warned);
4131
4132           sym_type = h->type;
4133         }
4134
4135       if (h != NULL)
4136         name = h->root.root.string;
4137       else
4138         {
4139           name = (bfd_elf_string_from_elf_section
4140                   (input_bfd, symtab_hdr->sh_link, sym->st_name));
4141           if (name == NULL || *name == '\0')
4142             name = bfd_section_name (input_bfd, sec);
4143         }
4144
4145       if (r_symndx != 0
4146           && r_type != R_ARM_NONE
4147           && (h == NULL
4148               || h->root.type == bfd_link_hash_defined
4149               || h->root.type == bfd_link_hash_defweak)
4150           && IS_ARM_TLS_RELOC (r_type) != (sym_type == STT_TLS))
4151         {
4152           (*_bfd_error_handler)
4153             ((sym_type == STT_TLS
4154               ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
4155               : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
4156              input_bfd,
4157              input_section,
4158              (long) rel->r_offset,
4159              howto->name,
4160              name);
4161         }
4162
4163       r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
4164                                          input_section, contents, rel,
4165                                          relocation, info, sec, name,
4166                                          (h ? ELF_ST_TYPE (h->type) :
4167                                           ELF_ST_TYPE (sym->st_info)), h,
4168                                          &unresolved_reloc);
4169
4170       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4171          because such sections are not SEC_ALLOC and thus ld.so will
4172          not process them.  */
4173       if (unresolved_reloc
4174           && !((input_section->flags & SEC_DEBUGGING) != 0
4175                && h->def_dynamic))
4176         {
4177           (*_bfd_error_handler)
4178             (_("%B(%A+0x%lx): warning: unresolvable relocation %d against symbol `%s'"),
4179              input_bfd, input_section, (long) rel->r_offset,
4180              r_type, h->root.root.string);
4181           return FALSE;
4182         }
4183
4184       if (r != bfd_reloc_ok)
4185         {
4186           const char * msg = (const char *) 0;
4187
4188           switch (r)
4189             {
4190             case bfd_reloc_overflow:
4191               /* If the overflowing reloc was to an undefined symbol,
4192                  we have already printed one error message and there
4193                  is no point complaining again.  */
4194               if ((! h ||
4195                    h->root.type != bfd_link_hash_undefined)
4196                   && (!((*info->callbacks->reloc_overflow)
4197                         (info, (h ? &h->root : NULL), name, howto->name,
4198                          (bfd_vma) 0, input_bfd, input_section,
4199                          rel->r_offset))))
4200                   return FALSE;
4201               break;
4202
4203             case bfd_reloc_undefined:
4204               if (!((*info->callbacks->undefined_symbol)
4205                     (info, name, input_bfd, input_section,
4206                      rel->r_offset, TRUE)))
4207                 return FALSE;
4208               break;
4209
4210             case bfd_reloc_outofrange:
4211               msg = _("internal error: out of range error");
4212               goto common_error;
4213
4214             case bfd_reloc_notsupported:
4215               msg = _("internal error: unsupported relocation error");
4216               goto common_error;
4217
4218             case bfd_reloc_dangerous:
4219               msg = _("internal error: dangerous error");
4220               goto common_error;
4221
4222             default:
4223               msg = _("internal error: unknown error");
4224               /* fall through */
4225
4226             common_error:
4227               if (!((*info->callbacks->warning)
4228                     (info, msg, name, input_bfd, input_section,
4229                      rel->r_offset)))
4230                 return FALSE;
4231               break;
4232             }
4233         }
4234     }
4235
4236   return TRUE;
4237 }
4238
4239 /* Set the right machine number.  */
4240
4241 static bfd_boolean
4242 elf32_arm_object_p (bfd *abfd)
4243 {
4244   unsigned int mach;
4245
4246   mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
4247
4248   if (mach != bfd_mach_arm_unknown)
4249     bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
4250
4251   else if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
4252     bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
4253
4254   else
4255     bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
4256
4257   return TRUE;
4258 }
4259
4260 /* Function to keep ARM specific flags in the ELF header.  */
4261
4262 static bfd_boolean
4263 elf32_arm_set_private_flags (bfd *abfd, flagword flags)
4264 {
4265   if (elf_flags_init (abfd)
4266       && elf_elfheader (abfd)->e_flags != flags)
4267     {
4268       if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
4269         {
4270           if (flags & EF_ARM_INTERWORK)
4271             (*_bfd_error_handler)
4272               (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
4273                abfd);
4274           else
4275             _bfd_error_handler
4276               (_("Warning: Clearing the interworking flag of %B due to outside request"),
4277                abfd);
4278         }
4279     }
4280   else
4281     {
4282       elf_elfheader (abfd)->e_flags = flags;
4283       elf_flags_init (abfd) = TRUE;
4284     }
4285
4286   return TRUE;
4287 }
4288
4289 /* Copy backend specific data from one object module to another.  */
4290
4291 static bfd_boolean
4292 elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
4293 {
4294   flagword in_flags;
4295   flagword out_flags;
4296
4297   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4298       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4299     return TRUE;
4300
4301   in_flags  = elf_elfheader (ibfd)->e_flags;
4302   out_flags = elf_elfheader (obfd)->e_flags;
4303
4304   if (elf_flags_init (obfd)
4305       && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
4306       && in_flags != out_flags)
4307     {
4308       /* Cannot mix APCS26 and APCS32 code.  */
4309       if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
4310         return FALSE;
4311
4312       /* Cannot mix float APCS and non-float APCS code.  */
4313       if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
4314         return FALSE;
4315
4316       /* If the src and dest have different interworking flags
4317          then turn off the interworking bit.  */
4318       if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
4319         {
4320           if (out_flags & EF_ARM_INTERWORK)
4321             _bfd_error_handler
4322               (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
4323                obfd, ibfd);
4324
4325           in_flags &= ~EF_ARM_INTERWORK;
4326         }
4327
4328       /* Likewise for PIC, though don't warn for this case.  */
4329       if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
4330         in_flags &= ~EF_ARM_PIC;
4331     }
4332
4333   elf_elfheader (obfd)->e_flags = in_flags;
4334   elf_flags_init (obfd) = TRUE;
4335
4336   /* Also copy the EI_OSABI field.  */
4337   elf_elfheader (obfd)->e_ident[EI_OSABI] =
4338     elf_elfheader (ibfd)->e_ident[EI_OSABI];
4339
4340   return TRUE;
4341 }
4342
4343 /* Merge backend specific data from an object file to the output
4344    object file when linking.  */
4345
4346 static bfd_boolean
4347 elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
4348 {
4349   flagword out_flags;
4350   flagword in_flags;
4351   bfd_boolean flags_compatible = TRUE;
4352   asection *sec;
4353
4354   /* Check if we have the same endianess.  */
4355   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
4356     return FALSE;
4357
4358   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4359       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4360     return TRUE;
4361
4362   /* The input BFD must have had its flags initialised.  */
4363   /* The following seems bogus to me -- The flags are initialized in
4364      the assembler but I don't think an elf_flags_init field is
4365      written into the object.  */
4366   /* BFD_ASSERT (elf_flags_init (ibfd)); */
4367
4368   in_flags  = elf_elfheader (ibfd)->e_flags;
4369   out_flags = elf_elfheader (obfd)->e_flags;
4370
4371   if (!elf_flags_init (obfd))
4372     {
4373       /* If the input is the default architecture and had the default
4374          flags then do not bother setting the flags for the output
4375          architecture, instead allow future merges to do this.  If no
4376          future merges ever set these flags then they will retain their
4377          uninitialised values, which surprise surprise, correspond
4378          to the default values.  */
4379       if (bfd_get_arch_info (ibfd)->the_default
4380           && elf_elfheader (ibfd)->e_flags == 0)
4381         return TRUE;
4382
4383       elf_flags_init (obfd) = TRUE;
4384       elf_elfheader (obfd)->e_flags = in_flags;
4385
4386       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
4387           && bfd_get_arch_info (obfd)->the_default)
4388         return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
4389
4390       return TRUE;
4391     }
4392
4393   /* Determine what should happen if the input ARM architecture
4394      does not match the output ARM architecture.  */
4395   if (! bfd_arm_merge_machines (ibfd, obfd))
4396     return FALSE;
4397
4398   /* Identical flags must be compatible.  */
4399   if (in_flags == out_flags)
4400     return TRUE;
4401
4402   /* Check to see if the input BFD actually contains any sections.  If
4403      not, its flags may not have been initialised either, but it
4404      cannot actually cause any incompatiblity.  Do not short-circuit
4405      dynamic objects; their section list may be emptied by
4406     elf_link_add_object_symbols.
4407
4408     Also check to see if there are no code sections in the input.
4409     In this case there is no need to check for code specific flags.
4410     XXX - do we need to worry about floating-point format compatability
4411     in data sections ?  */
4412   if (!(ibfd->flags & DYNAMIC))
4413     {
4414       bfd_boolean null_input_bfd = TRUE;
4415       bfd_boolean only_data_sections = TRUE;
4416
4417       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4418         {
4419           /* Ignore synthetic glue sections.  */
4420           if (strcmp (sec->name, ".glue_7")
4421               && strcmp (sec->name, ".glue_7t"))
4422             {
4423               if ((bfd_get_section_flags (ibfd, sec)
4424                    & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
4425                   == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
4426                 only_data_sections = FALSE;
4427
4428               null_input_bfd = FALSE;
4429               break;
4430             }
4431         }
4432
4433       if (null_input_bfd || only_data_sections)
4434         return TRUE;
4435     }
4436
4437   /* Complain about various flag mismatches.  */
4438   if (EF_ARM_EABI_VERSION (in_flags) != EF_ARM_EABI_VERSION (out_flags))
4439     {
4440       _bfd_error_handler
4441         (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
4442          ibfd, obfd,
4443          (in_flags & EF_ARM_EABIMASK) >> 24,
4444          (out_flags & EF_ARM_EABIMASK) >> 24);
4445       return FALSE;
4446     }
4447
4448   /* Not sure what needs to be checked for EABI versions >= 1.  */
4449   if (EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
4450     {
4451       if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
4452         {
4453           _bfd_error_handler
4454             (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
4455              ibfd, obfd,
4456              in_flags & EF_ARM_APCS_26 ? 26 : 32,
4457              out_flags & EF_ARM_APCS_26 ? 26 : 32);
4458           flags_compatible = FALSE;
4459         }
4460
4461       if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
4462         {
4463           if (in_flags & EF_ARM_APCS_FLOAT)
4464             _bfd_error_handler
4465               (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"),
4466                ibfd, obfd);
4467           else
4468             _bfd_error_handler
4469               (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"),
4470                ibfd, obfd);
4471
4472           flags_compatible = FALSE;
4473         }
4474
4475       if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
4476         {
4477           if (in_flags & EF_ARM_VFP_FLOAT)
4478             _bfd_error_handler
4479               (_("ERROR: %B uses VFP instructions, whereas %B does not"),
4480                ibfd, obfd);
4481           else
4482             _bfd_error_handler
4483               (_("ERROR: %B uses FPA instructions, whereas %B does not"),
4484                ibfd, obfd);
4485
4486           flags_compatible = FALSE;
4487         }
4488
4489       if ((in_flags & EF_ARM_MAVERICK_FLOAT) != (out_flags & EF_ARM_MAVERICK_FLOAT))
4490         {
4491           if (in_flags & EF_ARM_MAVERICK_FLOAT)
4492             _bfd_error_handler
4493               (_("ERROR: %B uses Maverick instructions, whereas %B does not"),
4494                ibfd, obfd);
4495           else
4496             _bfd_error_handler
4497               (_("ERROR: %B does not use Maverick instructions, whereas %B does"),
4498                ibfd, obfd);
4499
4500           flags_compatible = FALSE;
4501         }
4502
4503 #ifdef EF_ARM_SOFT_FLOAT
4504       if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
4505         {
4506           /* We can allow interworking between code that is VFP format
4507              layout, and uses either soft float or integer regs for
4508              passing floating point arguments and results.  We already
4509              know that the APCS_FLOAT flags match; similarly for VFP
4510              flags.  */
4511           if ((in_flags & EF_ARM_APCS_FLOAT) != 0
4512               || (in_flags & EF_ARM_VFP_FLOAT) == 0)
4513             {
4514               if (in_flags & EF_ARM_SOFT_FLOAT)
4515                 _bfd_error_handler
4516                   (_("ERROR: %B uses software FP, whereas %B uses hardware FP"),
4517                    ibfd, obfd);
4518               else
4519                 _bfd_error_handler
4520                   (_("ERROR: %B uses hardware FP, whereas %B uses software FP"),
4521                    ibfd, obfd);
4522
4523               flags_compatible = FALSE;
4524             }
4525         }
4526 #endif
4527
4528       /* Interworking mismatch is only a warning.  */
4529       if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
4530         {
4531           if (in_flags & EF_ARM_INTERWORK)
4532             {
4533               _bfd_error_handler
4534                 (_("Warning: %B supports interworking, whereas %B does not"),
4535                  ibfd, obfd);
4536             }
4537           else
4538             {
4539               _bfd_error_handler
4540                 (_("Warning: %B does not support interworking, whereas %B does"),
4541                  ibfd, obfd);
4542             }
4543         }
4544     }
4545
4546   return flags_compatible;
4547 }
4548
4549 /* Display the flags field.  */
4550
4551 static bfd_boolean
4552 elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
4553 {
4554   FILE * file = (FILE *) ptr;
4555   unsigned long flags;
4556
4557   BFD_ASSERT (abfd != NULL && ptr != NULL);
4558
4559   /* Print normal ELF private data.  */
4560   _bfd_elf_print_private_bfd_data (abfd, ptr);
4561
4562   flags = elf_elfheader (abfd)->e_flags;
4563   /* Ignore init flag - it may not be set, despite the flags field
4564      containing valid data.  */
4565
4566   /* xgettext:c-format */
4567   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
4568
4569   switch (EF_ARM_EABI_VERSION (flags))
4570     {
4571     case EF_ARM_EABI_UNKNOWN:
4572       /* The following flag bits are GNU extensions and not part of the
4573          official ARM ELF extended ABI.  Hence they are only decoded if
4574          the EABI version is not set.  */
4575       if (flags & EF_ARM_INTERWORK)
4576         fprintf (file, _(" [interworking enabled]"));
4577
4578       if (flags & EF_ARM_APCS_26)
4579         fprintf (file, " [APCS-26]");
4580       else
4581         fprintf (file, " [APCS-32]");
4582
4583       if (flags & EF_ARM_VFP_FLOAT)
4584         fprintf (file, _(" [VFP float format]"));
4585       else if (flags & EF_ARM_MAVERICK_FLOAT)
4586         fprintf (file, _(" [Maverick float format]"));
4587       else
4588         fprintf (file, _(" [FPA float format]"));
4589
4590       if (flags & EF_ARM_APCS_FLOAT)
4591         fprintf (file, _(" [floats passed in float registers]"));
4592
4593       if (flags & EF_ARM_PIC)
4594         fprintf (file, _(" [position independent]"));
4595
4596       if (flags & EF_ARM_NEW_ABI)
4597         fprintf (file, _(" [new ABI]"));
4598
4599       if (flags & EF_ARM_OLD_ABI)
4600         fprintf (file, _(" [old ABI]"));
4601
4602       if (flags & EF_ARM_SOFT_FLOAT)
4603         fprintf (file, _(" [software FP]"));
4604
4605       flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
4606                  | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
4607                  | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT
4608                  | EF_ARM_MAVERICK_FLOAT);
4609       break;
4610
4611     case EF_ARM_EABI_VER1:
4612       fprintf (file, _(" [Version1 EABI]"));
4613
4614       if (flags & EF_ARM_SYMSARESORTED)
4615         fprintf (file, _(" [sorted symbol table]"));
4616       else
4617         fprintf (file, _(" [unsorted symbol table]"));
4618
4619       flags &= ~ EF_ARM_SYMSARESORTED;
4620       break;
4621
4622     case EF_ARM_EABI_VER2:
4623       fprintf (file, _(" [Version2 EABI]"));
4624
4625       if (flags & EF_ARM_SYMSARESORTED)
4626         fprintf (file, _(" [sorted symbol table]"));
4627       else
4628         fprintf (file, _(" [unsorted symbol table]"));
4629
4630       if (flags & EF_ARM_DYNSYMSUSESEGIDX)
4631         fprintf (file, _(" [dynamic symbols use segment index]"));
4632
4633       if (flags & EF_ARM_MAPSYMSFIRST)
4634         fprintf (file, _(" [mapping symbols precede others]"));
4635
4636       flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
4637                  | EF_ARM_MAPSYMSFIRST);
4638       break;
4639
4640     case EF_ARM_EABI_VER3:
4641       fprintf (file, _(" [Version3 EABI]"));
4642       break;
4643
4644     case EF_ARM_EABI_VER4:
4645       fprintf (file, _(" [Version4 EABI]"));
4646
4647       if (flags & EF_ARM_BE8)
4648         fprintf (file, _(" [BE8]"));
4649
4650       if (flags & EF_ARM_LE8)
4651         fprintf (file, _(" [LE8]"));
4652
4653       flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
4654       break;
4655
4656     default:
4657       fprintf (file, _(" <EABI version unrecognised>"));
4658       break;
4659     }
4660
4661   flags &= ~ EF_ARM_EABIMASK;
4662
4663   if (flags & EF_ARM_RELEXEC)
4664     fprintf (file, _(" [relocatable executable]"));
4665
4666   if (flags & EF_ARM_HASENTRY)
4667     fprintf (file, _(" [has entry point]"));
4668
4669   flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
4670
4671   if (flags)
4672     fprintf (file, _("<Unrecognised flag bits set>"));
4673
4674   fputc ('\n', file);
4675
4676   return TRUE;
4677 }
4678
4679 static int
4680 elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
4681 {
4682   switch (ELF_ST_TYPE (elf_sym->st_info))
4683     {
4684     case STT_ARM_TFUNC:
4685       return ELF_ST_TYPE (elf_sym->st_info);
4686
4687     case STT_ARM_16BIT:
4688       /* If the symbol is not an object, return the STT_ARM_16BIT flag.
4689          This allows us to distinguish between data used by Thumb instructions
4690          and non-data (which is probably code) inside Thumb regions of an
4691          executable.  */
4692       if (type != STT_OBJECT)
4693         return ELF_ST_TYPE (elf_sym->st_info);
4694       break;
4695
4696     default:
4697       break;
4698     }
4699
4700   return type;
4701 }
4702
4703 static asection *
4704 elf32_arm_gc_mark_hook (asection *                   sec,
4705                         struct bfd_link_info *       info ATTRIBUTE_UNUSED,
4706                         Elf_Internal_Rela *          rel,
4707                         struct elf_link_hash_entry * h,
4708                         Elf_Internal_Sym *           sym)
4709 {
4710   if (h != NULL)
4711     {
4712       switch (ELF32_R_TYPE (rel->r_info))
4713       {
4714       case R_ARM_GNU_VTINHERIT:
4715       case R_ARM_GNU_VTENTRY:
4716         break;
4717
4718       default:
4719         switch (h->root.type)
4720           {
4721           case bfd_link_hash_defined:
4722           case bfd_link_hash_defweak:
4723             return h->root.u.def.section;
4724
4725           case bfd_link_hash_common:
4726             return h->root.u.c.p->section;
4727
4728           default:
4729             break;
4730           }
4731        }
4732      }
4733    else
4734      return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
4735
4736   return NULL;
4737 }
4738
4739 /* Update the got entry reference counts for the section being removed.  */
4740
4741 static bfd_boolean
4742 elf32_arm_gc_sweep_hook (bfd *                     abfd,
4743                          struct bfd_link_info *    info,
4744                          asection *                sec,
4745                          const Elf_Internal_Rela * relocs)
4746 {
4747   Elf_Internal_Shdr *symtab_hdr;
4748   struct elf_link_hash_entry **sym_hashes;
4749   bfd_signed_vma *local_got_refcounts;
4750   const Elf_Internal_Rela *rel, *relend;
4751   struct elf32_arm_link_hash_table * globals;
4752
4753   globals = elf32_arm_hash_table (info);
4754
4755   elf_section_data (sec)->local_dynrel = NULL;
4756
4757   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4758   sym_hashes = elf_sym_hashes (abfd);
4759   local_got_refcounts = elf_local_got_refcounts (abfd);
4760
4761   relend = relocs + sec->reloc_count;
4762   for (rel = relocs; rel < relend; rel++)
4763     {
4764       unsigned long r_symndx;
4765       struct elf_link_hash_entry *h = NULL;
4766       int r_type;
4767
4768       r_symndx = ELF32_R_SYM (rel->r_info);
4769       if (r_symndx >= symtab_hdr->sh_info)
4770         {
4771           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4772           while (h->root.type == bfd_link_hash_indirect
4773                  || h->root.type == bfd_link_hash_warning)
4774             h = (struct elf_link_hash_entry *) h->root.u.i.link;
4775         }
4776
4777       r_type = ELF32_R_TYPE (rel->r_info);
4778       r_type = arm_real_reloc_type (globals, r_type);
4779       switch (r_type)
4780         {
4781         case R_ARM_GOT32:
4782         case R_ARM_GOT_PREL:
4783         case R_ARM_TLS_GD32:
4784         case R_ARM_TLS_IE32:
4785           if (h != NULL)
4786             {
4787               if (h->got.refcount > 0)
4788                 h->got.refcount -= 1;
4789             }
4790           else if (local_got_refcounts != NULL)
4791             {
4792               if (local_got_refcounts[r_symndx] > 0)
4793                 local_got_refcounts[r_symndx] -= 1;
4794             }
4795           break;
4796
4797         case R_ARM_TLS_LDM32:
4798           elf32_arm_hash_table (info)->tls_ldm_got.refcount -= 1;
4799           break;
4800
4801         case R_ARM_ABS32:
4802         case R_ARM_REL32:
4803         case R_ARM_PC24:
4804         case R_ARM_PLT32:
4805         case R_ARM_CALL:
4806         case R_ARM_JUMP24:
4807         case R_ARM_PREL31:
4808         case R_ARM_THM_CALL:
4809           /* Should the interworking branches be here also?  */
4810
4811           if (h != NULL)
4812             {
4813               struct elf32_arm_link_hash_entry *eh;
4814               struct elf32_arm_relocs_copied **pp;
4815               struct elf32_arm_relocs_copied *p;
4816
4817               eh = (struct elf32_arm_link_hash_entry *) h;
4818
4819               if (h->plt.refcount > 0)
4820                 {
4821                   h->plt.refcount -= 1;
4822                   if (ELF32_R_TYPE (rel->r_info) == R_ARM_THM_CALL)
4823                     eh->plt_thumb_refcount--;
4824                 }
4825
4826               if (r_type == R_ARM_ABS32
4827                   || r_type == R_ARM_REL32)
4828                 {
4829                   for (pp = &eh->relocs_copied; (p = *pp) != NULL;
4830                        pp = &p->next)
4831                   if (p->section == sec)
4832                     {
4833                       p->count -= 1;
4834                       if (ELF32_R_TYPE (rel->r_info) == R_ARM_REL32)
4835                         p->pc_count -= 1;
4836                       if (p->count == 0)
4837                         *pp = p->next;
4838                       break;
4839                     }
4840                 }
4841             }
4842           break;
4843
4844         default:
4845           break;
4846         }
4847     }
4848
4849   return TRUE;
4850 }
4851
4852 /* Look through the relocs for a section during the first phase.  */
4853
4854 static bfd_boolean
4855 elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
4856                         asection *sec, const Elf_Internal_Rela *relocs)
4857 {
4858   Elf_Internal_Shdr *symtab_hdr;
4859   struct elf_link_hash_entry **sym_hashes;
4860   struct elf_link_hash_entry **sym_hashes_end;
4861   const Elf_Internal_Rela *rel;
4862   const Elf_Internal_Rela *rel_end;
4863   bfd *dynobj;
4864   asection *sreloc;
4865   bfd_vma *local_got_offsets;
4866   struct elf32_arm_link_hash_table *htab;
4867
4868   if (info->relocatable)
4869     return TRUE;
4870
4871   htab = elf32_arm_hash_table (info);
4872   sreloc = NULL;
4873
4874   /* Create dynamic sections for relocatable executables so that we can
4875      copy relocations.  */
4876   if (htab->root.is_relocatable_executable
4877       && ! htab->root.dynamic_sections_created)
4878     {
4879       if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
4880         return FALSE;
4881     }
4882
4883   dynobj = elf_hash_table (info)->dynobj;
4884   local_got_offsets = elf_local_got_offsets (abfd);
4885
4886   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4887   sym_hashes = elf_sym_hashes (abfd);
4888   sym_hashes_end = sym_hashes
4889     + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
4890
4891   if (!elf_bad_symtab (abfd))
4892     sym_hashes_end -= symtab_hdr->sh_info;
4893
4894   rel_end = relocs + sec->reloc_count;
4895   for (rel = relocs; rel < rel_end; rel++)
4896     {
4897       struct elf_link_hash_entry *h;
4898       struct elf32_arm_link_hash_entry *eh;
4899       unsigned long r_symndx;
4900       int r_type;
4901
4902       r_symndx = ELF32_R_SYM (rel->r_info);
4903       r_type = ELF32_R_TYPE (rel->r_info);
4904       r_type = arm_real_reloc_type (htab, r_type);
4905
4906       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
4907         {
4908           (*_bfd_error_handler) (_("%B: bad symbol index: %d"), abfd,
4909                                  r_symndx);
4910           return FALSE;
4911         }
4912
4913       if (r_symndx < symtab_hdr->sh_info)
4914         h = NULL;
4915       else
4916         {
4917           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4918           while (h->root.type == bfd_link_hash_indirect
4919                  || h->root.type == bfd_link_hash_warning)
4920             h = (struct elf_link_hash_entry *) h->root.u.i.link;
4921         }
4922
4923       eh = (struct elf32_arm_link_hash_entry *) h;
4924
4925       switch (r_type)
4926         {
4927           case R_ARM_GOT32:
4928           case R_ARM_GOT_PREL:
4929           case R_ARM_TLS_GD32:
4930           case R_ARM_TLS_IE32:
4931             /* This symbol requires a global offset table entry.  */
4932             {
4933               int tls_type, old_tls_type;
4934
4935               switch (r_type)
4936                 {
4937                 case R_ARM_TLS_GD32: tls_type = GOT_TLS_GD; break;
4938                 case R_ARM_TLS_IE32: tls_type = GOT_TLS_IE; break;
4939                 default: tls_type = GOT_NORMAL; break;
4940                 }
4941
4942               if (h != NULL)
4943                 {
4944                   h->got.refcount++;
4945                   old_tls_type = elf32_arm_hash_entry (h)->tls_type;
4946                 }
4947               else
4948                 {
4949                   bfd_signed_vma *local_got_refcounts;
4950
4951                   /* This is a global offset table entry for a local symbol.  */
4952                   local_got_refcounts = elf_local_got_refcounts (abfd);
4953                   if (local_got_refcounts == NULL)
4954                     {
4955                       bfd_size_type size;
4956                       
4957                       size = symtab_hdr->sh_info;
4958                       size *= (sizeof (bfd_signed_vma) + sizeof(char));
4959                       local_got_refcounts = bfd_zalloc (abfd, size);
4960                       if (local_got_refcounts == NULL)
4961                         return FALSE;
4962                       elf_local_got_refcounts (abfd) = local_got_refcounts;
4963                       elf32_arm_local_got_tls_type (abfd)
4964                         = (char *) (local_got_refcounts + symtab_hdr->sh_info);
4965                     }
4966                   local_got_refcounts[r_symndx] += 1;
4967                   old_tls_type = elf32_arm_local_got_tls_type (abfd) [r_symndx];
4968                 }
4969
4970               /* We will already have issued an error message if there is a
4971                  TLS / non-TLS mismatch, based on the symbol type.  We don't
4972                  support any linker relaxations.  So just combine any TLS
4973                  types needed.  */
4974               if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
4975                   && tls_type != GOT_NORMAL)
4976                 tls_type |= old_tls_type;
4977
4978               if (old_tls_type != tls_type)
4979                 {
4980                   if (h != NULL)
4981                     elf32_arm_hash_entry (h)->tls_type = tls_type;
4982                   else
4983                     elf32_arm_local_got_tls_type (abfd) [r_symndx] = tls_type;
4984                 }
4985             }
4986             /* Fall through */
4987
4988           case R_ARM_TLS_LDM32:
4989             if (r_type == R_ARM_TLS_LDM32)
4990                 htab->tls_ldm_got.refcount++;
4991             /* Fall through */
4992
4993           case R_ARM_GOTOFF32:
4994           case R_ARM_GOTPC:
4995             if (htab->sgot == NULL)
4996               {
4997                 if (htab->root.dynobj == NULL)
4998                   htab->root.dynobj = abfd;
4999                 if (!create_got_section (htab->root.dynobj, info))
5000                   return FALSE;
5001               }
5002             break;
5003
5004           case R_ARM_ABS32:
5005           case R_ARM_REL32:
5006           case R_ARM_PC24:
5007           case R_ARM_PLT32:
5008           case R_ARM_CALL:
5009           case R_ARM_JUMP24:
5010           case R_ARM_PREL31:
5011           case R_ARM_THM_CALL:
5012             /* Should the interworking branches be listed here?  */
5013             if (h != NULL)
5014               {
5015                 /* If this reloc is in a read-only section, we might
5016                    need a copy reloc.  We can't check reliably at this
5017                    stage whether the section is read-only, as input
5018                    sections have not yet been mapped to output sections.
5019                    Tentatively set the flag for now, and correct in
5020                    adjust_dynamic_symbol.  */
5021                 if (!info->shared)
5022                   h->non_got_ref = 1;
5023
5024                 /* We may need a .plt entry if the function this reloc
5025                    refers to is in a different object.  We can't tell for
5026                    sure yet, because something later might force the
5027                    symbol local.  */
5028                 if (r_type == R_ARM_PC24
5029                     || r_type == R_ARM_CALL
5030                     || r_type == R_ARM_JUMP24
5031                     || r_type == R_ARM_PREL31
5032                     || r_type == R_ARM_PLT32
5033                     || r_type == R_ARM_THM_CALL)
5034                   h->needs_plt = 1;
5035
5036                 /* If we create a PLT entry, this relocation will reference
5037                    it, even if it's an ABS32 relocation.  */
5038                 h->plt.refcount += 1;
5039
5040                 if (r_type == R_ARM_THM_CALL)
5041                   eh->plt_thumb_refcount += 1;
5042               }
5043
5044             /* If we are creating a shared library or relocatable executable,
5045                and this is a reloc against a global symbol, or a non PC
5046                relative reloc against a local symbol, then we need to copy
5047                the reloc into the shared library.  However, if we are linking
5048                with -Bsymbolic, we do not need to copy a reloc against a
5049                global symbol which is defined in an object we are
5050                including in the link (i.e., DEF_REGULAR is set).  At
5051                this point we have not seen all the input files, so it is
5052                possible that DEF_REGULAR is not set now but will be set
5053                later (it is never cleared).  We account for that
5054                possibility below by storing information in the
5055                relocs_copied field of the hash table entry.  */
5056             if ((info->shared || htab->root.is_relocatable_executable)
5057                 && (sec->flags & SEC_ALLOC) != 0
5058                 && (r_type == R_ARM_ABS32
5059                     || (h != NULL && ! h->needs_plt
5060                         && (! info->symbolic || ! h->def_regular))))
5061               {
5062                 struct elf32_arm_relocs_copied *p, **head;
5063
5064                 /* When creating a shared object, we must copy these
5065                    reloc types into the output file.  We create a reloc
5066                    section in dynobj and make room for this reloc.  */
5067                 if (sreloc == NULL)
5068                   {
5069                     const char * name;
5070
5071                     name = (bfd_elf_string_from_elf_section
5072                             (abfd,
5073                              elf_elfheader (abfd)->e_shstrndx,
5074                              elf_section_data (sec)->rel_hdr.sh_name));
5075                     if (name == NULL)
5076                       return FALSE;
5077
5078                     BFD_ASSERT (strncmp (name, ".rel", 4) == 0
5079                                 && strcmp (bfd_get_section_name (abfd, sec),
5080                                            name + 4) == 0);
5081
5082                     sreloc = bfd_get_section_by_name (dynobj, name);
5083                     if (sreloc == NULL)
5084                       {
5085                         flagword flags;
5086
5087                         flags = (SEC_HAS_CONTENTS | SEC_READONLY
5088                                  | SEC_IN_MEMORY | SEC_LINKER_CREATED);
5089                         if ((sec->flags & SEC_ALLOC) != 0
5090                             /* BPABI objects never have dynamic
5091                                relocations mapped.  */
5092                             && !htab->symbian_p)
5093                           flags |= SEC_ALLOC | SEC_LOAD;
5094                         sreloc = bfd_make_section_with_flags (dynobj,
5095                                                               name,
5096                                                               flags);
5097                         if (sreloc == NULL
5098                             || ! bfd_set_section_alignment (dynobj, sreloc, 2))
5099                           return FALSE;
5100                       }
5101
5102                     elf_section_data (sec)->sreloc = sreloc;
5103                   }
5104
5105                 /* If this is a global symbol, we count the number of
5106                    relocations we need for this symbol.  */
5107                 if (h != NULL)
5108                   {
5109                     head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied;
5110                   }
5111                 else
5112                   {
5113                     /* Track dynamic relocs needed for local syms too.
5114                        We really need local syms available to do this
5115                        easily.  Oh well.  */
5116
5117                     asection *s;
5118                     s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
5119                                                    sec, r_symndx);
5120                     if (s == NULL)
5121                       return FALSE;
5122
5123                     head = ((struct elf32_arm_relocs_copied **)
5124                             &elf_section_data (s)->local_dynrel);
5125                   }
5126
5127                 p = *head;
5128                 if (p == NULL || p->section != sec)
5129                   {
5130                     bfd_size_type amt = sizeof *p;
5131
5132                     p = bfd_alloc (htab->root.dynobj, amt);
5133                     if (p == NULL)
5134                       return FALSE;
5135                     p->next = *head;
5136                     *head = p;
5137                     p->section = sec;
5138                     p->count = 0;
5139                     p->pc_count = 0;
5140                   }
5141
5142                 if (r_type == R_ARM_REL32)
5143                   p->pc_count += 1;
5144                 p->count += 1;
5145               }
5146             break;
5147
5148         /* This relocation describes the C++ object vtable hierarchy.
5149            Reconstruct it for later use during GC.  */
5150         case R_ARM_GNU_VTINHERIT:
5151           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5152             return FALSE;
5153           break;
5154
5155         /* This relocation describes which C++ vtable entries are actually
5156            used.  Record for later use during GC.  */
5157         case R_ARM_GNU_VTENTRY:
5158           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
5159             return FALSE;
5160           break;
5161         }
5162     }
5163
5164   return TRUE;
5165 }
5166
5167 /* Treat mapping symbols as special target symbols.  */
5168
5169 static bfd_boolean
5170 elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
5171 {
5172   return bfd_is_arm_mapping_symbol_name (sym->name);
5173 }
5174
5175 /* This is a copy of elf_find_function() from elf.c except that
5176    ARM mapping symbols are ignored when looking for function names
5177    and STT_ARM_TFUNC is considered to a function type.  */
5178
5179 static bfd_boolean
5180 arm_elf_find_function (bfd *         abfd ATTRIBUTE_UNUSED,
5181                        asection *    section,
5182                        asymbol **    symbols,
5183                        bfd_vma       offset,
5184                        const char ** filename_ptr,
5185                        const char ** functionname_ptr)
5186 {
5187   const char * filename = NULL;
5188   asymbol * func = NULL;
5189   bfd_vma low_func = 0;
5190   asymbol ** p;
5191
5192   for (p = symbols; *p != NULL; p++)
5193     {
5194       elf_symbol_type *q;
5195
5196       q = (elf_symbol_type *) *p;
5197
5198       switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
5199         {
5200         default:
5201           break;
5202         case STT_FILE:
5203           filename = bfd_asymbol_name (&q->symbol);
5204           break;
5205         case STT_FUNC:
5206         case STT_ARM_TFUNC:
5207         case STT_NOTYPE:
5208           /* Skip $a and $t symbols.  */
5209           if ((q->symbol.flags & BSF_LOCAL)
5210               && bfd_is_arm_mapping_symbol_name (q->symbol.name))
5211             continue;
5212           /* Fall through.  */
5213           if (bfd_get_section (&q->symbol) == section
5214               && q->symbol.value >= low_func
5215               && q->symbol.value <= offset)
5216             {
5217               func = (asymbol *) q;
5218               low_func = q->symbol.value;
5219             }
5220           break;
5221         }
5222     }
5223
5224   if (func == NULL)
5225     return FALSE;
5226
5227   if (filename_ptr)
5228     *filename_ptr = filename;
5229   if (functionname_ptr)
5230     *functionname_ptr = bfd_asymbol_name (func);
5231
5232   return TRUE;
5233 }  
5234
5235
5236 /* Find the nearest line to a particular section and offset, for error
5237    reporting.   This code is a duplicate of the code in elf.c, except
5238    that it uses arm_elf_find_function.  */
5239
5240 static bfd_boolean
5241 elf32_arm_find_nearest_line (bfd *          abfd,
5242                              asection *     section,
5243                              asymbol **     symbols,
5244                              bfd_vma        offset,
5245                              const char **  filename_ptr,
5246                              const char **  functionname_ptr,
5247                              unsigned int * line_ptr)
5248 {
5249   bfd_boolean found = FALSE;
5250
5251   /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it.  */
5252
5253   if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
5254                                      filename_ptr, functionname_ptr,
5255                                      line_ptr, 0,
5256                                      & elf_tdata (abfd)->dwarf2_find_line_info))
5257     {
5258       if (!*functionname_ptr)
5259         arm_elf_find_function (abfd, section, symbols, offset,
5260                                *filename_ptr ? NULL : filename_ptr,
5261                                functionname_ptr);
5262
5263       return TRUE;
5264     }
5265
5266   if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
5267                                              & found, filename_ptr,
5268                                              functionname_ptr, line_ptr,
5269                                              & elf_tdata (abfd)->line_info))
5270     return FALSE;
5271
5272   if (found && (*functionname_ptr || *line_ptr))
5273     return TRUE;
5274
5275   if (symbols == NULL)
5276     return FALSE;
5277
5278   if (! arm_elf_find_function (abfd, section, symbols, offset,
5279                                filename_ptr, functionname_ptr))
5280     return FALSE;
5281
5282   *line_ptr = 0;
5283   return TRUE;
5284 }
5285
5286 static bfd_boolean
5287 elf32_arm_find_inliner_info (bfd *          abfd,
5288                              const char **  filename_ptr,
5289                              const char **  functionname_ptr,
5290                              unsigned int * line_ptr)
5291 {
5292   bfd_boolean found;
5293   found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
5294                                          functionname_ptr, line_ptr,
5295                                          & elf_tdata (abfd)->dwarf2_find_line_info);
5296   return found;
5297 }
5298
5299 /* Adjust a symbol defined by a dynamic object and referenced by a
5300    regular object.  The current definition is in some section of the
5301    dynamic object, but we're not including those sections.  We have to
5302    change the definition to something the rest of the link can
5303    understand.  */
5304
5305 static bfd_boolean
5306 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
5307                                  struct elf_link_hash_entry * h)
5308 {
5309   bfd * dynobj;
5310   asection * s;
5311   unsigned int power_of_two;
5312   struct elf32_arm_link_hash_entry * eh;
5313   struct elf32_arm_link_hash_table *globals;
5314
5315   globals = elf32_arm_hash_table (info);
5316   dynobj = elf_hash_table (info)->dynobj;
5317
5318   /* Make sure we know what is going on here.  */
5319   BFD_ASSERT (dynobj != NULL
5320               && (h->needs_plt
5321                   || h->u.weakdef != NULL
5322                   || (h->def_dynamic
5323                       && h->ref_regular
5324                       && !h->def_regular)));
5325
5326   eh = (struct elf32_arm_link_hash_entry *) h;
5327
5328   /* If this is a function, put it in the procedure linkage table.  We
5329      will fill in the contents of the procedure linkage table later,
5330      when we know the address of the .got section.  */
5331   if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC
5332       || h->needs_plt)
5333     {
5334       if (h->plt.refcount <= 0
5335           || SYMBOL_CALLS_LOCAL (info, h)
5336           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5337               && h->root.type == bfd_link_hash_undefweak))
5338         {
5339           /* This case can occur if we saw a PLT32 reloc in an input
5340              file, but the symbol was never referred to by a dynamic
5341              object, or if all references were garbage collected.  In
5342              such a case, we don't actually need to build a procedure
5343              linkage table, and we can just do a PC24 reloc instead.  */
5344           h->plt.offset = (bfd_vma) -1;
5345           eh->plt_thumb_refcount = 0;
5346           h->needs_plt = 0;
5347         }
5348
5349       return TRUE;
5350     }
5351   else
5352     {
5353       /* It's possible that we incorrectly decided a .plt reloc was
5354          needed for an R_ARM_PC24 or similar reloc to a non-function sym
5355          in check_relocs.  We can't decide accurately between function
5356          and non-function syms in check-relocs; Objects loaded later in
5357          the link may change h->type.  So fix it now.  */
5358       h->plt.offset = (bfd_vma) -1;
5359       eh->plt_thumb_refcount = 0;
5360     }
5361
5362   /* If this is a weak symbol, and there is a real definition, the
5363      processor independent code will have arranged for us to see the
5364      real definition first, and we can just use the same value.  */
5365   if (h->u.weakdef != NULL)
5366     {
5367       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5368                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
5369       h->root.u.def.section = h->u.weakdef->root.u.def.section;
5370       h->root.u.def.value = h->u.weakdef->root.u.def.value;
5371       return TRUE;
5372     }
5373
5374   /* If there are no non-GOT references, we do not need a copy
5375      relocation.  */
5376   if (!h->non_got_ref)
5377     return TRUE;
5378
5379   /* This is a reference to a symbol defined by a dynamic object which
5380      is not a function.  */
5381
5382   /* If we are creating a shared library, we must presume that the
5383      only references to the symbol are via the global offset table.
5384      For such cases we need not do anything here; the relocations will
5385      be handled correctly by relocate_section.  Relocatable executables
5386      can reference data in shared objects directly, so we don't need to
5387      do anything here.  */
5388   if (info->shared || globals->root.is_relocatable_executable)
5389     return TRUE;
5390
5391   /* We must allocate the symbol in our .dynbss section, which will
5392      become part of the .bss section of the executable.  There will be
5393      an entry for this symbol in the .dynsym section.  The dynamic
5394      object will contain position independent code, so all references
5395      from the dynamic object to this symbol will go through the global
5396      offset table.  The dynamic linker will use the .dynsym entry to
5397      determine the address it must put in the global offset table, so
5398      both the dynamic object and the regular object will refer to the
5399      same memory location for the variable.  */
5400   s = bfd_get_section_by_name (dynobj, ".dynbss");
5401   BFD_ASSERT (s != NULL);
5402
5403   /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
5404      copy the initial value out of the dynamic object and into the
5405      runtime process image.  We need to remember the offset into the
5406      .rel.bss section we are going to use.  */
5407   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5408     {
5409       asection *srel;
5410
5411       srel = bfd_get_section_by_name (dynobj, ".rel.bss");
5412       BFD_ASSERT (srel != NULL);
5413       srel->size += sizeof (Elf32_External_Rel);
5414       h->needs_copy = 1;
5415     }
5416
5417   /* We need to figure out the alignment required for this symbol.  I
5418      have no idea how ELF linkers handle this.  */
5419   power_of_two = bfd_log2 (h->size);
5420   if (power_of_two > 3)
5421     power_of_two = 3;
5422
5423   /* Apply the required alignment.  */
5424   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
5425   if (power_of_two > bfd_get_section_alignment (dynobj, s))
5426     {
5427       if (! bfd_set_section_alignment (dynobj, s, power_of_two))
5428         return FALSE;
5429     }
5430
5431   /* Define the symbol as being at this point in the section.  */
5432   h->root.u.def.section = s;
5433   h->root.u.def.value = s->size;
5434
5435   /* Increment the section size to make room for the symbol.  */
5436   s->size += h->size;
5437
5438   return TRUE;
5439 }
5440
5441 /* Allocate space in .plt, .got and associated reloc sections for
5442    dynamic relocs.  */
5443
5444 static bfd_boolean
5445 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
5446 {
5447   struct bfd_link_info *info;
5448   struct elf32_arm_link_hash_table *htab;
5449   struct elf32_arm_link_hash_entry *eh;
5450   struct elf32_arm_relocs_copied *p;
5451
5452   eh = (struct elf32_arm_link_hash_entry *) h;
5453
5454   if (h->root.type == bfd_link_hash_indirect)
5455     return TRUE;
5456
5457   if (h->root.type == bfd_link_hash_warning)
5458     /* When warning symbols are created, they **replace** the "real"
5459        entry in the hash table, thus we never get to see the real
5460        symbol in a hash traversal.  So look at it now.  */
5461     h = (struct elf_link_hash_entry *) h->root.u.i.link;
5462
5463   info = (struct bfd_link_info *) inf;
5464   htab = elf32_arm_hash_table (info);
5465
5466   if (htab->root.dynamic_sections_created
5467       && h->plt.refcount > 0)
5468     {
5469       /* Make sure this symbol is output as a dynamic symbol.
5470          Undefined weak syms won't yet be marked as dynamic.  */
5471       if (h->dynindx == -1
5472           && !h->forced_local)
5473         {
5474           if (! bfd_elf_link_record_dynamic_symbol (info, h))
5475             return FALSE;
5476         }
5477
5478       if (info->shared
5479           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
5480         {
5481           asection *s = htab->splt;
5482
5483           /* If this is the first .plt entry, make room for the special
5484              first entry.  */
5485           if (s->size == 0)
5486             s->size += htab->plt_header_size;
5487
5488           h->plt.offset = s->size;
5489
5490           /* If we will insert a Thumb trampoline before this PLT, leave room
5491              for it.  */
5492           if (!htab->use_blx && eh->plt_thumb_refcount > 0)
5493             {
5494               h->plt.offset += PLT_THUMB_STUB_SIZE;
5495               s->size += PLT_THUMB_STUB_SIZE;
5496             }
5497
5498           /* If this symbol is not defined in a regular file, and we are
5499              not generating a shared library, then set the symbol to this
5500              location in the .plt.  This is required to make function
5501              pointers compare as equal between the normal executable and
5502              the shared library.  */
5503           if (! info->shared
5504               && !h->def_regular)
5505             {
5506               h->root.u.def.section = s;
5507               h->root.u.def.value = h->plt.offset;
5508
5509               /* Make sure the function is not marked as Thumb, in case
5510                  it is the target of an ABS32 relocation, which will
5511                  point to the PLT entry.  */
5512               if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
5513                 h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
5514             }
5515
5516           /* Make room for this entry.  */
5517           s->size += htab->plt_entry_size;
5518
5519           if (!htab->symbian_p)
5520             {
5521               /* We also need to make an entry in the .got.plt section, which
5522                  will be placed in the .got section by the linker script.  */
5523               eh->plt_got_offset = htab->sgotplt->size;
5524               htab->sgotplt->size += 4;
5525             }
5526
5527           /* We also need to make an entry in the .rel.plt section.  */
5528           htab->srelplt->size += sizeof (Elf32_External_Rel);
5529         }
5530       else
5531         {
5532           h->plt.offset = (bfd_vma) -1;
5533           h->needs_plt = 0;
5534         }
5535     }
5536   else
5537     {
5538       h->plt.offset = (bfd_vma) -1;
5539       h->needs_plt = 0;
5540     }
5541
5542   if (h->got.refcount > 0)
5543     {
5544       asection *s;
5545       bfd_boolean dyn;
5546       int tls_type = elf32_arm_hash_entry (h)->tls_type;
5547       int indx;
5548
5549       /* Make sure this symbol is output as a dynamic symbol.
5550          Undefined weak syms won't yet be marked as dynamic.  */
5551       if (h->dynindx == -1
5552           && !h->forced_local)
5553         {
5554           if (! bfd_elf_link_record_dynamic_symbol (info, h))
5555             return FALSE;
5556         }
5557
5558       if (!htab->symbian_p)
5559         {
5560           s = htab->sgot;
5561           h->got.offset = s->size;
5562
5563           if (tls_type == GOT_UNKNOWN)
5564             abort ();
5565
5566           if (tls_type == GOT_NORMAL)
5567             /* Non-TLS symbols need one GOT slot.  */
5568             s->size += 4;
5569           else
5570             {
5571               if (tls_type & GOT_TLS_GD)
5572                 /* R_ARM_TLS_GD32 needs 2 consecutive GOT slots.  */
5573                 s->size += 8;
5574               if (tls_type & GOT_TLS_IE)
5575                 /* R_ARM_TLS_IE32 needs one GOT slot.  */
5576                 s->size += 4;
5577             }
5578
5579           dyn = htab->root.dynamic_sections_created;
5580
5581           indx = 0;
5582           if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
5583               && (!info->shared
5584                   || !SYMBOL_REFERENCES_LOCAL (info, h)))
5585             indx = h->dynindx;
5586
5587           if (tls_type != GOT_NORMAL
5588               && (info->shared || indx != 0)
5589               && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5590                   || h->root.type != bfd_link_hash_undefweak))
5591             {
5592               if (tls_type & GOT_TLS_IE)
5593                 htab->srelgot->size += sizeof (Elf32_External_Rel);
5594
5595               if (tls_type & GOT_TLS_GD)
5596                 htab->srelgot->size += sizeof (Elf32_External_Rel);
5597
5598               if ((tls_type & GOT_TLS_GD) && indx != 0)
5599                 htab->srelgot->size += sizeof (Elf32_External_Rel);
5600             }
5601           else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5602                     || h->root.type != bfd_link_hash_undefweak)
5603                    && (info->shared
5604                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
5605             htab->srelgot->size += sizeof (Elf32_External_Rel);
5606         }
5607     }
5608   else
5609     h->got.offset = (bfd_vma) -1;
5610
5611   if (eh->relocs_copied == NULL)
5612     return TRUE;
5613
5614   /* In the shared -Bsymbolic case, discard space allocated for
5615      dynamic pc-relative relocs against symbols which turn out to be
5616      defined in regular objects.  For the normal shared case, discard
5617      space for pc-relative relocs that have become local due to symbol
5618      visibility changes.  */
5619
5620   if (info->shared || htab->root.is_relocatable_executable)
5621     {
5622       /* The only reloc that uses pc_count is R_ARM_REL32, which will
5623          appear on something like ".long foo - .".  We want calls to
5624          protected symbols to resolve directly to the function rather
5625          than going via the plt.  If people want function pointer
5626          comparisons to work as expected then they should avoid
5627          writing assembly like ".long foo - .".  */
5628       if (SYMBOL_CALLS_LOCAL (info, h))
5629         {
5630           struct elf32_arm_relocs_copied **pp;
5631
5632           for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
5633             {
5634               p->count -= p->pc_count;
5635               p->pc_count = 0;
5636               if (p->count == 0)
5637                 *pp = p->next;
5638               else
5639                 pp = &p->next;
5640             }
5641         }
5642
5643       /* Also discard relocs on undefined weak syms with non-default
5644          visibility.  */
5645       if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5646           && h->root.type == bfd_link_hash_undefweak)
5647         eh->relocs_copied = NULL;
5648       else if (htab->root.is_relocatable_executable && h->dynindx == -1
5649                && h->root.type == bfd_link_hash_new)
5650         {
5651           /* Output absolute symbols so that we can create relocations
5652              against them.  For normal symbols we output a relocation
5653              against the section that contains them.  */
5654           if (! bfd_elf_link_record_dynamic_symbol (info, h))
5655             return FALSE;
5656         }
5657
5658     }
5659   else
5660     {
5661       /* For the non-shared case, discard space for relocs against
5662          symbols which turn out to need copy relocs or are not
5663          dynamic.  */
5664
5665       if (!h->non_got_ref
5666           && ((h->def_dynamic
5667                && !h->def_regular)
5668               || (htab->root.dynamic_sections_created
5669                   && (h->root.type == bfd_link_hash_undefweak
5670                       || h->root.type == bfd_link_hash_undefined))))
5671         {
5672           /* Make sure this symbol is output as a dynamic symbol.
5673              Undefined weak syms won't yet be marked as dynamic.  */
5674           if (h->dynindx == -1
5675               && !h->forced_local)
5676             {
5677               if (! bfd_elf_link_record_dynamic_symbol (info, h))
5678                 return FALSE;
5679             }
5680
5681           /* If that succeeded, we know we'll be keeping all the
5682              relocs.  */
5683           if (h->dynindx != -1)
5684             goto keep;
5685         }
5686
5687       eh->relocs_copied = NULL;
5688
5689     keep: ;
5690     }
5691
5692   /* Finally, allocate space.  */
5693   for (p = eh->relocs_copied; p != NULL; p = p->next)
5694     {
5695       asection *sreloc = elf_section_data (p->section)->sreloc;
5696       sreloc->size += p->count * sizeof (Elf32_External_Rel);
5697     }
5698
5699   return TRUE;
5700 }
5701
5702 /* Find any dynamic relocs that apply to read-only sections.  */
5703
5704 static bfd_boolean
5705 elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
5706 {
5707   struct elf32_arm_link_hash_entry *eh;
5708   struct elf32_arm_relocs_copied *p;
5709
5710   if (h->root.type == bfd_link_hash_warning)
5711     h = (struct elf_link_hash_entry *) h->root.u.i.link;
5712
5713   eh = (struct elf32_arm_link_hash_entry *) h;
5714   for (p = eh->relocs_copied; p != NULL; p = p->next)
5715     {
5716       asection *s = p->section;
5717
5718       if (s != NULL && (s->flags & SEC_READONLY) != 0)
5719         {
5720           struct bfd_link_info *info = (struct bfd_link_info *) inf;
5721
5722           info->flags |= DF_TEXTREL;
5723
5724           /* Not an error, just cut short the traversal.  */
5725           return FALSE;
5726         }
5727     }
5728   return TRUE;
5729 }
5730
5731 /* Set the sizes of the dynamic sections.  */
5732
5733 static bfd_boolean
5734 elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
5735                                  struct bfd_link_info * info)
5736 {
5737   bfd * dynobj;
5738   asection * s;
5739   bfd_boolean plt;
5740   bfd_boolean relocs;
5741   bfd *ibfd;
5742   struct elf32_arm_link_hash_table *htab;
5743
5744   htab = elf32_arm_hash_table (info);
5745   dynobj = elf_hash_table (info)->dynobj;
5746   BFD_ASSERT (dynobj != NULL);
5747
5748   if (elf_hash_table (info)->dynamic_sections_created)
5749     {
5750       /* Set the contents of the .interp section to the interpreter.  */
5751       if (info->executable)
5752         {
5753           s = bfd_get_section_by_name (dynobj, ".interp");
5754           BFD_ASSERT (s != NULL);
5755           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5756           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5757         }
5758     }
5759
5760   /* Set up .got offsets for local syms, and space for local dynamic
5761      relocs.  */
5762   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
5763     {
5764       bfd_signed_vma *local_got;
5765       bfd_signed_vma *end_local_got;
5766       char *local_tls_type;
5767       bfd_size_type locsymcount;
5768       Elf_Internal_Shdr *symtab_hdr;
5769       asection *srel;
5770
5771       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
5772         continue;
5773
5774       for (s = ibfd->sections; s != NULL; s = s->next)
5775         {
5776           struct elf32_arm_relocs_copied *p;
5777
5778           for (p = *((struct elf32_arm_relocs_copied **)
5779                      &elf_section_data (s)->local_dynrel);
5780                p != NULL;
5781                p = p->next)
5782             {
5783               if (!bfd_is_abs_section (p->section)
5784                   && bfd_is_abs_section (p->section->output_section))
5785                 {
5786                   /* Input section has been discarded, either because
5787                      it is a copy of a linkonce section or due to
5788                      linker script /DISCARD/, so we'll be discarding
5789                      the relocs too.  */
5790                 }
5791               else if (p->count != 0)
5792                 {
5793                   srel = elf_section_data (p->section)->sreloc;
5794                   srel->size += p->count * sizeof (Elf32_External_Rel);
5795                   if ((p->section->output_section->flags & SEC_READONLY) != 0)
5796                     info->flags |= DF_TEXTREL;
5797                 }
5798             }
5799         }
5800
5801       local_got = elf_local_got_refcounts (ibfd);
5802       if (!local_got)
5803         continue;
5804
5805       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5806       locsymcount = symtab_hdr->sh_info;
5807       end_local_got = local_got + locsymcount;
5808       local_tls_type = elf32_arm_local_got_tls_type (ibfd);
5809       s = htab->sgot;
5810       srel = htab->srelgot;
5811       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
5812         {
5813           if (*local_got > 0)
5814             {
5815               *local_got = s->size;
5816               if (*local_tls_type & GOT_TLS_GD)
5817                 /* TLS_GD relocs need an 8-byte structure in the GOT.  */
5818                 s->size += 8;
5819               if (*local_tls_type & GOT_TLS_IE)
5820                 s->size += 4;
5821               if (*local_tls_type == GOT_NORMAL)
5822                 s->size += 4;
5823
5824               if (info->shared || *local_tls_type == GOT_TLS_GD)
5825                 srel->size += sizeof (Elf32_External_Rel);
5826             }
5827           else
5828             *local_got = (bfd_vma) -1;
5829         }
5830     }
5831
5832   if (htab->tls_ldm_got.refcount > 0)
5833     {
5834       /* Allocate two GOT entries and one dynamic relocation (if necessary)
5835          for R_ARM_TLS_LDM32 relocations.  */
5836       htab->tls_ldm_got.offset = htab->sgot->size;
5837       htab->sgot->size += 8;
5838       if (info->shared)
5839         htab->srelgot->size += sizeof (Elf32_External_Rel);
5840     }
5841   else
5842     htab->tls_ldm_got.offset = -1;
5843
5844   /* Allocate global sym .plt and .got entries, and space for global
5845      sym dynamic relocs.  */
5846   elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
5847
5848   /* The check_relocs and adjust_dynamic_symbol entry points have
5849      determined the sizes of the various dynamic sections.  Allocate
5850      memory for them.  */
5851   plt = FALSE;
5852   relocs = FALSE;
5853   for (s = dynobj->sections; s != NULL; s = s->next)
5854     {
5855       const char * name;
5856
5857       if ((s->flags & SEC_LINKER_CREATED) == 0)
5858         continue;
5859
5860       /* It's OK to base decisions on the section name, because none
5861          of the dynobj section names depend upon the input files.  */
5862       name = bfd_get_section_name (dynobj, s);
5863
5864       if (strcmp (name, ".plt") == 0)
5865         {
5866           /* Remember whether there is a PLT.  */
5867           plt = s->size != 0;
5868         }
5869       else if (strncmp (name, ".rel", 4) == 0)
5870         {
5871           if (s->size != 0)
5872             {
5873               /* Remember whether there are any reloc sections other
5874                  than .rel.plt.  */
5875               if (strcmp (name, ".rel.plt") != 0)
5876                 relocs = TRUE;
5877
5878               /* We use the reloc_count field as a counter if we need
5879                  to copy relocs into the output file.  */
5880               s->reloc_count = 0;
5881             }
5882         }
5883       else if (strncmp (name, ".got", 4) != 0
5884                && strcmp (name, ".dynbss") != 0)
5885         {
5886           /* It's not one of our sections, so don't allocate space.  */
5887           continue;
5888         }
5889
5890       if (s->size == 0)
5891         {
5892           /* If we don't need this section, strip it from the
5893              output file.  This is mostly to handle .rel.bss and
5894              .rel.plt.  We must create both sections in
5895              create_dynamic_sections, because they must be created
5896              before the linker maps input sections to output
5897              sections.  The linker does that before
5898              adjust_dynamic_symbol is called, and it is that
5899              function which decides whether anything needs to go
5900              into these sections.  */
5901           s->flags |= SEC_EXCLUDE;
5902           continue;
5903         }
5904
5905       if ((s->flags & SEC_HAS_CONTENTS) == 0)
5906         continue;
5907
5908       /* Allocate memory for the section contents.  */
5909       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
5910       if (s->contents == NULL)
5911         return FALSE;
5912     }
5913
5914   if (elf_hash_table (info)->dynamic_sections_created)
5915     {
5916       /* Add some entries to the .dynamic section.  We fill in the
5917          values later, in elf32_arm_finish_dynamic_sections, but we
5918          must add the entries now so that we get the correct size for
5919          the .dynamic section.  The DT_DEBUG entry is filled in by the
5920          dynamic linker and used by the debugger.  */
5921 #define add_dynamic_entry(TAG, VAL) \
5922   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5923
5924      if (info->executable)
5925         {
5926           if (!add_dynamic_entry (DT_DEBUG, 0))
5927             return FALSE;
5928         }
5929
5930       if (plt)
5931         {
5932           if (   !add_dynamic_entry (DT_PLTGOT, 0)
5933               || !add_dynamic_entry (DT_PLTRELSZ, 0)
5934               || !add_dynamic_entry (DT_PLTREL, DT_REL)
5935               || !add_dynamic_entry (DT_JMPREL, 0))
5936             return FALSE;
5937         }
5938
5939       if (relocs)
5940         {
5941           if (   !add_dynamic_entry (DT_REL, 0)
5942               || !add_dynamic_entry (DT_RELSZ, 0)
5943               || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
5944             return FALSE;
5945         }
5946
5947       /* If any dynamic relocs apply to a read-only section,
5948          then we need a DT_TEXTREL entry.  */
5949       if ((info->flags & DF_TEXTREL) == 0)
5950         elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs,
5951                                 (PTR) info);
5952
5953       if ((info->flags & DF_TEXTREL) != 0)
5954         {
5955           if (!add_dynamic_entry (DT_TEXTREL, 0))
5956             return FALSE;
5957         }
5958     }
5959 #undef add_dynamic_entry
5960
5961   return TRUE;
5962 }
5963
5964 /* Finish up dynamic symbol handling.  We set the contents of various
5965    dynamic sections here.  */
5966
5967 static bfd_boolean
5968 elf32_arm_finish_dynamic_symbol (bfd * output_bfd, struct bfd_link_info * info,
5969                                  struct elf_link_hash_entry * h, Elf_Internal_Sym * sym)
5970 {
5971   bfd * dynobj;
5972   struct elf32_arm_link_hash_table *htab;
5973   struct elf32_arm_link_hash_entry *eh;
5974
5975   dynobj = elf_hash_table (info)->dynobj;
5976   htab = elf32_arm_hash_table (info);
5977   eh = (struct elf32_arm_link_hash_entry *) h;
5978
5979   if (h->plt.offset != (bfd_vma) -1)
5980     {
5981       asection * splt;
5982       asection * srel;
5983       bfd_byte *loc;
5984       bfd_vma plt_index;
5985       Elf_Internal_Rela rel;
5986
5987       /* This symbol has an entry in the procedure linkage table.  Set
5988          it up.  */
5989
5990       BFD_ASSERT (h->dynindx != -1);
5991
5992       splt = bfd_get_section_by_name (dynobj, ".plt");
5993       srel = bfd_get_section_by_name (dynobj, ".rel.plt");
5994       BFD_ASSERT (splt != NULL && srel != NULL);
5995
5996       /* Fill in the entry in the procedure linkage table.  */
5997       if (htab->symbian_p)
5998         {
5999           unsigned i;
6000           for (i = 0; i < htab->plt_entry_size / 4; ++i)
6001             bfd_put_32 (output_bfd, 
6002                         elf32_arm_symbian_plt_entry[i],
6003                         splt->contents + h->plt.offset + 4 * i);
6004           
6005           /* Fill in the entry in the .rel.plt section.  */
6006           rel.r_offset = (splt->output_section->vma
6007                           + splt->output_offset
6008                           + h->plt.offset + 4 * (i - 1));
6009           rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
6010
6011           /* Get the index in the procedure linkage table which
6012              corresponds to this symbol.  This is the index of this symbol
6013              in all the symbols for which we are making plt entries.  The
6014              first entry in the procedure linkage table is reserved.  */
6015           plt_index = ((h->plt.offset - htab->plt_header_size) 
6016                        / htab->plt_entry_size);
6017         }
6018       else
6019         {
6020           bfd_vma got_offset;
6021           bfd_vma got_displacement;
6022           asection * sgot;
6023           
6024           sgot = bfd_get_section_by_name (dynobj, ".got.plt");
6025           BFD_ASSERT (sgot != NULL);
6026
6027           /* Get the offset into the .got.plt table of the entry that
6028              corresponds to this function.  */
6029           got_offset = eh->plt_got_offset;
6030
6031           /* Get the index in the procedure linkage table which
6032              corresponds to this symbol.  This is the index of this symbol
6033              in all the symbols for which we are making plt entries.  The
6034              first three entries in .got.plt are reserved; after that
6035              symbols appear in the same order as in .plt.  */
6036           plt_index = (got_offset - 12) / 4;
6037
6038           /* Calculate the displacement between the PLT slot and the
6039              entry in the GOT.  The eight-byte offset accounts for the
6040              value produced by adding to pc in the first instruction
6041              of the PLT stub.  */
6042           got_displacement = (sgot->output_section->vma
6043                               + sgot->output_offset
6044                               + got_offset
6045                               - splt->output_section->vma
6046                               - splt->output_offset
6047                               - h->plt.offset
6048                               - 8);
6049
6050           BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
6051
6052           if (!htab->use_blx && eh->plt_thumb_refcount > 0)
6053             {
6054               bfd_put_16 (output_bfd, elf32_arm_plt_thumb_stub[0],
6055                           splt->contents + h->plt.offset - 4);
6056               bfd_put_16 (output_bfd, elf32_arm_plt_thumb_stub[1],
6057                           splt->contents + h->plt.offset - 2);
6058             }
6059
6060           bfd_put_32 (output_bfd, elf32_arm_plt_entry[0] | ((got_displacement & 0x0ff00000) >> 20),
6061                       splt->contents + h->plt.offset + 0);
6062           bfd_put_32 (output_bfd, elf32_arm_plt_entry[1] | ((got_displacement & 0x000ff000) >> 12),
6063                       splt->contents + h->plt.offset + 4);
6064           bfd_put_32 (output_bfd, elf32_arm_plt_entry[2] | (got_displacement & 0x00000fff),
6065                       splt->contents + h->plt.offset + 8);
6066 #ifdef FOUR_WORD_PLT
6067           bfd_put_32 (output_bfd, elf32_arm_plt_entry[3],
6068                       splt->contents + h->plt.offset + 12);
6069 #endif
6070
6071           /* Fill in the entry in the global offset table.  */
6072           bfd_put_32 (output_bfd,
6073                       (splt->output_section->vma
6074                        + splt->output_offset),
6075                       sgot->contents + got_offset);
6076           
6077           /* Fill in the entry in the .rel.plt section.  */
6078           rel.r_offset = (sgot->output_section->vma
6079                           + sgot->output_offset
6080                           + got_offset);
6081           rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_JUMP_SLOT);
6082         }
6083
6084       loc = srel->contents + plt_index * sizeof (Elf32_External_Rel);
6085       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
6086
6087       if (!h->def_regular)
6088         {
6089           /* Mark the symbol as undefined, rather than as defined in
6090              the .plt section.  Leave the value alone.  */
6091           sym->st_shndx = SHN_UNDEF;
6092           /* If the symbol is weak, we do need to clear the value.
6093              Otherwise, the PLT entry would provide a definition for
6094              the symbol even if the symbol wasn't defined anywhere,
6095              and so the symbol would never be NULL.  */
6096           if (!h->ref_regular_nonweak)
6097             sym->st_value = 0;
6098         }
6099     }
6100
6101   if (h->got.offset != (bfd_vma) -1
6102       && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
6103       && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
6104     {
6105       asection * sgot;
6106       asection * srel;
6107       Elf_Internal_Rela rel;
6108       bfd_byte *loc;
6109
6110       /* This symbol has an entry in the global offset table.  Set it
6111          up.  */
6112       sgot = bfd_get_section_by_name (dynobj, ".got");
6113       srel = bfd_get_section_by_name (dynobj, ".rel.got");
6114       BFD_ASSERT (sgot != NULL && srel != NULL);
6115
6116       rel.r_offset = (sgot->output_section->vma
6117                       + sgot->output_offset
6118                       + (h->got.offset &~ (bfd_vma) 1));
6119
6120       /* If this is a static link, or it is a -Bsymbolic link and the
6121          symbol is defined locally or was forced to be local because
6122          of a version file, we just want to emit a RELATIVE reloc.
6123          The entry in the global offset table will already have been
6124          initialized in the relocate_section function.  */
6125       if (info->shared
6126           && SYMBOL_REFERENCES_LOCAL (info, h))
6127         {
6128           BFD_ASSERT((h->got.offset & 1) != 0);
6129           rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
6130         }
6131       else
6132         {
6133           BFD_ASSERT((h->got.offset & 1) == 0);
6134           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
6135           rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
6136         }
6137
6138       loc = srel->contents + srel->reloc_count++ * sizeof (Elf32_External_Rel);
6139       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
6140     }
6141
6142   if (h->needs_copy)
6143     {
6144       asection * s;
6145       Elf_Internal_Rela rel;
6146       bfd_byte *loc;
6147
6148       /* This symbol needs a copy reloc.  Set it up.  */
6149       BFD_ASSERT (h->dynindx != -1
6150                   && (h->root.type == bfd_link_hash_defined
6151                       || h->root.type == bfd_link_hash_defweak));
6152
6153       s = bfd_get_section_by_name (h->root.u.def.section->owner,
6154                                    ".rel.bss");
6155       BFD_ASSERT (s != NULL);
6156
6157       rel.r_offset = (h->root.u.def.value
6158                       + h->root.u.def.section->output_section->vma
6159                       + h->root.u.def.section->output_offset);
6160       rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
6161       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rel);
6162       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
6163     }
6164
6165   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
6166   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
6167       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
6168     sym->st_shndx = SHN_ABS;
6169
6170   return TRUE;
6171 }
6172
6173 /* Finish up the dynamic sections.  */
6174
6175 static bfd_boolean
6176 elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
6177 {
6178   bfd * dynobj;
6179   asection * sgot;
6180   asection * sdyn;
6181
6182   dynobj = elf_hash_table (info)->dynobj;
6183
6184   sgot = bfd_get_section_by_name (dynobj, ".got.plt");
6185   BFD_ASSERT (elf32_arm_hash_table (info)->symbian_p || sgot != NULL);
6186   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
6187
6188   if (elf_hash_table (info)->dynamic_sections_created)
6189     {
6190       asection *splt;
6191       Elf32_External_Dyn *dyncon, *dynconend;
6192       struct elf32_arm_link_hash_table *htab;
6193
6194       htab = elf32_arm_hash_table (info);
6195       splt = bfd_get_section_by_name (dynobj, ".plt");
6196       BFD_ASSERT (splt != NULL && sdyn != NULL);
6197
6198       dyncon = (Elf32_External_Dyn *) sdyn->contents;
6199       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
6200
6201       for (; dyncon < dynconend; dyncon++)
6202         {
6203           Elf_Internal_Dyn dyn;
6204           const char * name;
6205           asection * s;
6206
6207           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
6208
6209           switch (dyn.d_tag)
6210             {
6211               unsigned int type;
6212
6213             default:
6214               break;
6215
6216             case DT_HASH:
6217               name = ".hash";
6218               goto get_vma_if_bpabi;
6219             case DT_STRTAB:
6220               name = ".dynstr";
6221               goto get_vma_if_bpabi;
6222             case DT_SYMTAB:
6223               name = ".dynsym";
6224               goto get_vma_if_bpabi;
6225             case DT_VERSYM:
6226               name = ".gnu.version";
6227               goto get_vma_if_bpabi;
6228             case DT_VERDEF:
6229               name = ".gnu.version_d";
6230               goto get_vma_if_bpabi;
6231             case DT_VERNEED:
6232               name = ".gnu.version_r";
6233               goto get_vma_if_bpabi;
6234
6235             case DT_PLTGOT:
6236               name = ".got";
6237               goto get_vma;
6238             case DT_JMPREL:
6239               name = ".rel.plt";
6240             get_vma:
6241               s = bfd_get_section_by_name (output_bfd, name);
6242               BFD_ASSERT (s != NULL);
6243               if (!htab->symbian_p)
6244                 dyn.d_un.d_ptr = s->vma;
6245               else
6246                 /* In the BPABI, tags in the PT_DYNAMIC section point
6247                    at the file offset, not the memory address, for the
6248                    convenience of the post linker.  */
6249                 dyn.d_un.d_ptr = s->filepos;
6250               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6251               break;
6252
6253             get_vma_if_bpabi:
6254               if (htab->symbian_p)
6255                 goto get_vma;
6256               break;
6257
6258             case DT_PLTRELSZ:
6259               s = bfd_get_section_by_name (output_bfd, ".rel.plt");
6260               BFD_ASSERT (s != NULL);
6261               dyn.d_un.d_val = s->size;
6262               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6263               break;
6264               
6265             case DT_RELSZ:
6266               if (!htab->symbian_p)
6267                 {
6268                   /* My reading of the SVR4 ABI indicates that the
6269                      procedure linkage table relocs (DT_JMPREL) should be
6270                      included in the overall relocs (DT_REL).  This is
6271                      what Solaris does.  However, UnixWare can not handle
6272                      that case.  Therefore, we override the DT_RELSZ entry
6273                      here to make it not include the JMPREL relocs.  Since
6274                      the linker script arranges for .rel.plt to follow all
6275                      other relocation sections, we don't have to worry
6276                      about changing the DT_REL entry.  */
6277                   s = bfd_get_section_by_name (output_bfd, ".rel.plt");
6278                   if (s != NULL)
6279                     dyn.d_un.d_val -= s->size;
6280                   bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6281                   break;
6282                 }
6283               /* Fall through */
6284
6285             case DT_REL:
6286             case DT_RELA:
6287             case DT_RELASZ:
6288               /* In the BPABI, the DT_REL tag must point at the file
6289                  offset, not the VMA, of the first relocation
6290                  section.  So, we use code similar to that in
6291                  elflink.c, but do not check for SHF_ALLOC on the
6292                  relcoation section, since relocations sections are
6293                  never allocated under the BPABI.  The comments above
6294                  about Unixware notwithstanding, we include all of the
6295                  relocations here.  */
6296               if (htab->symbian_p)
6297                 {
6298                   unsigned int i;
6299                   type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
6300                           ? SHT_REL : SHT_RELA);
6301                   dyn.d_un.d_val = 0;
6302                   for (i = 1; i < elf_numsections (output_bfd); i++)
6303                     {
6304                       Elf_Internal_Shdr *hdr 
6305                         = elf_elfsections (output_bfd)[i];
6306                       if (hdr->sh_type == type)
6307                         {
6308                           if (dyn.d_tag == DT_RELSZ 
6309                               || dyn.d_tag == DT_RELASZ)
6310                             dyn.d_un.d_val += hdr->sh_size;
6311                           else if ((ufile_ptr) hdr->sh_offset
6312                                    <= dyn.d_un.d_val - 1)
6313                             dyn.d_un.d_val = hdr->sh_offset;
6314                         }
6315                     }
6316                   bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6317                 }
6318               break;
6319
6320               /* Set the bottom bit of DT_INIT/FINI if the
6321                  corresponding function is Thumb.  */
6322             case DT_INIT:
6323               name = info->init_function;
6324               goto get_sym;
6325             case DT_FINI:
6326               name = info->fini_function;
6327             get_sym:
6328               /* If it wasn't set by elf_bfd_final_link
6329                  then there is nothing to adjust.  */
6330               if (dyn.d_un.d_val != 0)
6331                 {
6332                   struct elf_link_hash_entry * eh;
6333
6334                   eh = elf_link_hash_lookup (elf_hash_table (info), name,
6335                                              FALSE, FALSE, TRUE);
6336                   if (eh != (struct elf_link_hash_entry *) NULL
6337                       && ELF_ST_TYPE (eh->type) == STT_ARM_TFUNC)
6338                     {
6339                       dyn.d_un.d_val |= 1;
6340                       bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6341                     }
6342                 }
6343               break;
6344             }
6345         }
6346
6347       /* Fill in the first entry in the procedure linkage table.  */
6348       if (splt->size > 0 && elf32_arm_hash_table (info)->plt_header_size)
6349         {
6350           bfd_vma got_displacement;
6351
6352           /* Calculate the displacement between the PLT slot and &GOT[0].  */
6353           got_displacement = (sgot->output_section->vma
6354                               + sgot->output_offset
6355                               - splt->output_section->vma
6356                               - splt->output_offset
6357                               - 16);
6358
6359           bfd_put_32 (output_bfd, elf32_arm_plt0_entry[0], splt->contents +  0);
6360           bfd_put_32 (output_bfd, elf32_arm_plt0_entry[1], splt->contents +  4);
6361           bfd_put_32 (output_bfd, elf32_arm_plt0_entry[2], splt->contents +  8);
6362           bfd_put_32 (output_bfd, elf32_arm_plt0_entry[3], splt->contents + 12);
6363 #ifdef FOUR_WORD_PLT
6364           /* The displacement value goes in the otherwise-unused last word of
6365              the second entry.  */
6366           bfd_put_32 (output_bfd, got_displacement,        splt->contents + 28);
6367 #else
6368           bfd_put_32 (output_bfd, got_displacement,        splt->contents + 16);
6369 #endif
6370         }
6371
6372       /* UnixWare sets the entsize of .plt to 4, although that doesn't
6373          really seem like the right value.  */
6374       elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
6375     }
6376
6377   /* Fill in the first three entries in the global offset table.  */
6378   if (sgot)
6379     {
6380       if (sgot->size > 0)
6381         {
6382           if (sdyn == NULL)
6383             bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
6384           else
6385             bfd_put_32 (output_bfd,
6386                         sdyn->output_section->vma + sdyn->output_offset,
6387                         sgot->contents);
6388           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
6389           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
6390         }
6391
6392       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
6393     }
6394
6395   return TRUE;
6396 }
6397
6398 static void
6399 elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
6400 {
6401   Elf_Internal_Ehdr * i_ehdrp;  /* ELF file header, internal form.  */
6402   struct elf32_arm_link_hash_table *globals;
6403
6404   i_ehdrp = elf_elfheader (abfd);
6405
6406   if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
6407     i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
6408   else
6409     i_ehdrp->e_ident[EI_OSABI] = 0;
6410   i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
6411
6412   if (link_info)
6413     {
6414       globals = elf32_arm_hash_table (link_info);
6415       if (globals->byteswap_code)
6416         i_ehdrp->e_flags |= EF_ARM_BE8;
6417     }
6418 }
6419
6420 static enum elf_reloc_type_class
6421 elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
6422 {
6423   switch ((int) ELF32_R_TYPE (rela->r_info))
6424     {
6425     case R_ARM_RELATIVE:
6426       return reloc_class_relative;
6427     case R_ARM_JUMP_SLOT:
6428       return reloc_class_plt;
6429     case R_ARM_COPY:
6430       return reloc_class_copy;
6431     default:
6432       return reloc_class_normal;
6433     }
6434 }
6435
6436 /* Set the right machine number for an Arm ELF file.  */
6437
6438 static bfd_boolean
6439 elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
6440 {
6441   if (hdr->sh_type == SHT_NOTE)
6442     *flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_CONTENTS;
6443
6444   return TRUE;
6445 }
6446
6447 static void
6448 elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
6449 {
6450   bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
6451 }
6452
6453 /* Return TRUE if this is an unwinding table entry.  */
6454
6455 static bfd_boolean
6456 is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
6457 {
6458   size_t len1, len2;
6459
6460   len1 = sizeof (ELF_STRING_ARM_unwind) - 1;
6461   len2 = sizeof (ELF_STRING_ARM_unwind_once) - 1;
6462   return (strncmp (name, ELF_STRING_ARM_unwind, len1) == 0
6463           || strncmp (name, ELF_STRING_ARM_unwind_once, len2) == 0);
6464 }
6465
6466
6467 /* Set the type and flags for an ARM section.  We do this by
6468    the section name, which is a hack, but ought to work.  */
6469
6470 static bfd_boolean
6471 elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
6472 {
6473   const char * name;
6474
6475   name = bfd_get_section_name (abfd, sec);
6476
6477   if (is_arm_elf_unwind_section_name (abfd, name))
6478     {
6479       hdr->sh_type = SHT_ARM_EXIDX;
6480       hdr->sh_flags |= SHF_LINK_ORDER;
6481     }
6482   return TRUE;
6483 }
6484
6485 /* Handle an ARM specific section when reading an object file.  This is
6486    called when bfd_section_from_shdr finds a section with an unknown
6487    type.  */
6488
6489 static bfd_boolean
6490 elf32_arm_section_from_shdr (bfd *abfd,
6491                              Elf_Internal_Shdr * hdr,
6492                              const char *name,
6493                              int shindex)
6494 {
6495   /* There ought to be a place to keep ELF backend specific flags, but
6496      at the moment there isn't one.  We just keep track of the
6497      sections by their name, instead.  Fortunately, the ABI gives
6498      names for all the ARM specific sections, so we will probably get
6499      away with this.  */
6500   switch (hdr->sh_type)
6501     {
6502     case SHT_ARM_EXIDX:
6503       break;
6504
6505     default:
6506       return FALSE;
6507     }
6508
6509   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
6510     return FALSE;
6511
6512   return TRUE;
6513 }
6514
6515 /* A structure used to record a list of sections, independently
6516    of the next and prev fields in the asection structure.  */
6517 typedef struct section_list
6518 {
6519   asection * sec;
6520   struct section_list * next;
6521   struct section_list * prev;
6522 }
6523 section_list;
6524
6525 /* Unfortunately we need to keep a list of sections for which
6526    an _arm_elf_section_data structure has been allocated.  This
6527    is because it is possible for functions like elf32_arm_write_section
6528    to be called on a section which has had an elf_data_structure
6529    allocated for it (and so the used_by_bfd field is valid) but
6530    for which the ARM extended version of this structure - the
6531    _arm_elf_section_data structure - has not been allocated.  */
6532 static section_list * sections_with_arm_elf_section_data = NULL;
6533
6534 static void
6535 record_section_with_arm_elf_section_data (asection * sec)
6536 {
6537   struct section_list * entry;
6538
6539   entry = bfd_malloc (sizeof (* entry));
6540   if (entry == NULL)
6541     return;
6542   entry->sec = sec;
6543   entry->next = sections_with_arm_elf_section_data;
6544   entry->prev = NULL;
6545   if (entry->next != NULL)
6546     entry->next->prev = entry;
6547   sections_with_arm_elf_section_data = entry;
6548 }
6549
6550 static _arm_elf_section_data *
6551 get_arm_elf_section_data (asection * sec)
6552 {
6553   struct section_list * entry;
6554
6555   for (entry = sections_with_arm_elf_section_data; entry; entry = entry->next)
6556     if (entry->sec == sec)
6557       return elf32_arm_section_data (sec);
6558   return NULL;
6559 }
6560
6561 static void
6562 unrecord_section_with_arm_elf_section_data (asection * sec)
6563 {
6564   struct section_list * entry;
6565
6566   for (entry = sections_with_arm_elf_section_data; entry; entry = entry->next)
6567     if (entry->sec == sec)
6568       {
6569         if (entry->prev != NULL)
6570           entry->prev->next = entry->next;
6571         if (entry->next != NULL)
6572           entry->next->prev = entry->prev;
6573         if (entry == sections_with_arm_elf_section_data)
6574           sections_with_arm_elf_section_data = entry->next;
6575         free (entry);
6576         break;
6577       }
6578 }
6579
6580 /* Called for each symbol.  Builds a section map based on mapping symbols.
6581    Does not alter any of the symbols.  */
6582
6583 static bfd_boolean
6584 elf32_arm_output_symbol_hook (struct bfd_link_info *info,
6585                               const char *name,
6586                               Elf_Internal_Sym *elfsym,
6587                               asection *input_sec,
6588                               struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
6589 {
6590   int mapcount;
6591   elf32_arm_section_map *map;
6592   elf32_arm_section_map *newmap;
6593   _arm_elf_section_data *arm_data;
6594   struct elf32_arm_link_hash_table *globals;
6595
6596   /* Only do this on final link.  */
6597   if (info->relocatable)
6598     return TRUE;
6599
6600   /* Only build a map if we need to byteswap code.  */
6601   globals = elf32_arm_hash_table (info);
6602   if (!globals->byteswap_code)
6603     return TRUE;
6604
6605   /* We only want mapping symbols.  */
6606   if (! bfd_is_arm_mapping_symbol_name (name))
6607     return TRUE;
6608
6609   /* If this section has not been allocated an _arm_elf_section_data
6610      structure then we cannot record anything.  */
6611   arm_data = get_arm_elf_section_data (input_sec);
6612   if (arm_data == NULL)
6613     return TRUE;
6614
6615   mapcount = arm_data->mapcount + 1;
6616   map = arm_data->map;
6617   /* TODO: This may be inefficient, but we probably don't usually have many
6618      mapping symbols per section.  */
6619   newmap = bfd_realloc (map, mapcount * sizeof (* map));
6620   if (newmap != NULL)
6621     {
6622       arm_data->map = newmap;
6623       arm_data->mapcount = mapcount;
6624
6625       map[mapcount - 1].vma = elfsym->st_value;
6626       map[mapcount - 1].type = name[1];
6627     }
6628
6629   return TRUE;
6630 }
6631
6632 /* Allocate target specific section data.  */
6633
6634 static bfd_boolean
6635 elf32_arm_new_section_hook (bfd *abfd, asection *sec)
6636 {
6637   _arm_elf_section_data *sdata;
6638   bfd_size_type amt = sizeof (*sdata);
6639
6640   sdata = bfd_zalloc (abfd, amt);
6641   if (sdata == NULL)
6642     return FALSE;
6643   sec->used_by_bfd = sdata;
6644
6645   record_section_with_arm_elf_section_data (sec);
6646
6647   return _bfd_elf_new_section_hook (abfd, sec);
6648 }
6649
6650
6651 /* Used to order a list of mapping symbols by address.  */
6652
6653 static int
6654 elf32_arm_compare_mapping (const void * a, const void * b)
6655 {
6656   return ((const elf32_arm_section_map *) a)->vma
6657          > ((const elf32_arm_section_map *) b)->vma;
6658 }
6659
6660
6661 /* Do code byteswapping.  Return FALSE afterwards so that the section is
6662    written out as normal.  */
6663
6664 static bfd_boolean
6665 elf32_arm_write_section (bfd *output_bfd ATTRIBUTE_UNUSED, asection *sec,
6666                          bfd_byte *contents)
6667 {
6668   int mapcount;
6669   _arm_elf_section_data *arm_data;
6670   elf32_arm_section_map *map;
6671   bfd_vma ptr;
6672   bfd_vma end;
6673   bfd_vma offset;
6674   bfd_byte tmp;
6675   int i;
6676
6677   /* If this section has not been allocated an _arm_elf_section_data
6678      structure then we cannot record anything.  */
6679   arm_data = get_arm_elf_section_data (sec);
6680   if (arm_data == NULL)
6681     return FALSE;
6682
6683   mapcount = arm_data->mapcount;
6684   map = arm_data->map;
6685
6686   if (mapcount == 0)
6687     return FALSE;
6688
6689   qsort (map, mapcount, sizeof (* map), elf32_arm_compare_mapping);
6690
6691   offset = sec->output_section->vma + sec->output_offset;
6692   ptr = map[0].vma - offset;
6693   for (i = 0; i < mapcount; i++)
6694     {
6695       if (i == mapcount - 1)
6696         end = sec->size;
6697       else
6698         end = map[i + 1].vma - offset;
6699
6700       switch (map[i].type)
6701         {
6702         case 'a':
6703           /* Byte swap code words.  */
6704           while (ptr + 3 < end)
6705             {
6706               tmp = contents[ptr];
6707               contents[ptr] = contents[ptr + 3];
6708               contents[ptr + 3] = tmp;
6709               tmp = contents[ptr + 1];
6710               contents[ptr + 1] = contents[ptr + 2];
6711               contents[ptr + 2] = tmp;
6712               ptr += 4;
6713             }
6714           break;
6715
6716         case 't':
6717           /* Byte swap code halfwords.  */
6718           while (ptr + 1 < end)
6719             {
6720               tmp = contents[ptr];
6721               contents[ptr] = contents[ptr + 1];
6722               contents[ptr + 1] = tmp;
6723               ptr += 2;
6724             }
6725           break;
6726
6727         case 'd':
6728           /* Leave data alone.  */
6729           break;
6730         }
6731       ptr = end;
6732     }
6733
6734   free (map);
6735   arm_data->mapcount = 0;
6736   arm_data->map = NULL;
6737   unrecord_section_with_arm_elf_section_data (sec);
6738
6739   return FALSE;
6740 }
6741
6742 static void
6743 unrecord_section_via_map_over_sections (bfd * abfd ATTRIBUTE_UNUSED,
6744                                         asection * sec,
6745                                         void * ignore ATTRIBUTE_UNUSED)
6746 {
6747   unrecord_section_with_arm_elf_section_data (sec);
6748 }
6749
6750 static bfd_boolean
6751 elf32_arm_close_and_cleanup (bfd * abfd)
6752 {
6753   bfd_map_over_sections (abfd, unrecord_section_via_map_over_sections, NULL);
6754
6755   return _bfd_elf_close_and_cleanup (abfd);
6756 }
6757
6758 /* Display STT_ARM_TFUNC symbols as functions.  */
6759
6760 static void
6761 elf32_arm_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
6762                              asymbol *asym)
6763 {
6764   elf_symbol_type *elfsym = (elf_symbol_type *) asym;
6765
6766   if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_ARM_TFUNC)
6767     elfsym->symbol.flags |= BSF_FUNCTION;
6768 }
6769
6770
6771 /* Mangle thumb function symbols as we read them in.  */
6772
6773 static void
6774 elf32_arm_swap_symbol_in (bfd * abfd,
6775                           const void *psrc,
6776                           const void *pshn,
6777                           Elf_Internal_Sym *dst)
6778 {
6779   bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst);
6780
6781   /* New EABI objects mark thumb function symbols by setting the low bit of
6782      the address.  Turn these into STT_ARM_TFUNC.  */
6783   if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
6784       && (dst->st_value & 1))
6785     {
6786       dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC);
6787       dst->st_value &= ~(bfd_vma) 1;
6788     }
6789 }
6790
6791
6792 /* Mangle thumb function symbols as we write them out.  */
6793
6794 static void
6795 elf32_arm_swap_symbol_out (bfd *abfd,
6796                            const Elf_Internal_Sym *src,
6797                            void *cdst,
6798                            void *shndx)
6799 {
6800   Elf_Internal_Sym newsym;
6801
6802   /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
6803      of the address set, as per the new EABI.  We do this unconditionally
6804      because objcopy does not set the elf header flags until after
6805      it writes out the symbol table.  */
6806   if (ELF_ST_TYPE (src->st_info) == STT_ARM_TFUNC)
6807     {
6808       newsym = *src;
6809       newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
6810       newsym.st_value |= 1;
6811       
6812       src = &newsym;
6813     }
6814   bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
6815 }
6816
6817 /* Add the PT_ARM_EXIDX program header.  */
6818
6819 static bfd_boolean
6820 elf32_arm_modify_segment_map (bfd *abfd, 
6821                               struct bfd_link_info *info ATTRIBUTE_UNUSED)
6822 {
6823   struct elf_segment_map *m;
6824   asection *sec;
6825
6826   sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
6827   if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
6828     {
6829       /* If there is already a PT_ARM_EXIDX header, then we do not
6830          want to add another one.  This situation arises when running
6831          "strip"; the input binary already has the header.  */
6832       m = elf_tdata (abfd)->segment_map;
6833       while (m && m->p_type != PT_ARM_EXIDX)
6834         m = m->next;
6835       if (!m)
6836         {
6837           m = bfd_zalloc (abfd, sizeof (struct elf_segment_map));
6838           if (m == NULL)
6839             return FALSE;
6840           m->p_type = PT_ARM_EXIDX;
6841           m->count = 1;
6842           m->sections[0] = sec;
6843
6844           m->next = elf_tdata (abfd)->segment_map;
6845           elf_tdata (abfd)->segment_map = m;
6846         }
6847     }
6848
6849   return TRUE;
6850 }
6851
6852 /* We may add a PT_ARM_EXIDX program header.  */
6853
6854 static int
6855 elf32_arm_additional_program_headers (bfd *abfd)
6856 {
6857   asection *sec;
6858
6859   sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
6860   if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
6861     return 1;
6862   else
6863     return 0;
6864 }
6865
6866 /* We use this to override swap_symbol_in and swap_symbol_out.  */
6867 const struct elf_size_info elf32_arm_size_info = {
6868   sizeof (Elf32_External_Ehdr),
6869   sizeof (Elf32_External_Phdr),
6870   sizeof (Elf32_External_Shdr),
6871   sizeof (Elf32_External_Rel),
6872   sizeof (Elf32_External_Rela),
6873   sizeof (Elf32_External_Sym),
6874   sizeof (Elf32_External_Dyn),
6875   sizeof (Elf_External_Note),
6876   4,
6877   1,
6878   32, 2,
6879   ELFCLASS32, EV_CURRENT,
6880   bfd_elf32_write_out_phdrs,
6881   bfd_elf32_write_shdrs_and_ehdr,
6882   bfd_elf32_write_relocs,
6883   elf32_arm_swap_symbol_in,
6884   elf32_arm_swap_symbol_out,
6885   bfd_elf32_slurp_reloc_table,
6886   bfd_elf32_slurp_symbol_table,
6887   bfd_elf32_swap_dyn_in,
6888   bfd_elf32_swap_dyn_out,
6889   bfd_elf32_swap_reloc_in,
6890   bfd_elf32_swap_reloc_out,
6891   bfd_elf32_swap_reloca_in,
6892   bfd_elf32_swap_reloca_out
6893 };
6894
6895 #define ELF_ARCH                        bfd_arch_arm
6896 #define ELF_MACHINE_CODE                EM_ARM
6897 #ifdef __QNXTARGET__
6898 #define ELF_MAXPAGESIZE                 0x1000
6899 #else
6900 #define ELF_MAXPAGESIZE                 0x8000
6901 #endif
6902 #define ELF_MINPAGESIZE                 0x1000
6903
6904 #define bfd_elf32_mkobject                      elf32_arm_mkobject
6905
6906 #define bfd_elf32_bfd_copy_private_bfd_data     elf32_arm_copy_private_bfd_data
6907 #define bfd_elf32_bfd_merge_private_bfd_data    elf32_arm_merge_private_bfd_data
6908 #define bfd_elf32_bfd_set_private_flags         elf32_arm_set_private_flags
6909 #define bfd_elf32_bfd_print_private_bfd_data    elf32_arm_print_private_bfd_data
6910 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_link_hash_table_create
6911 #define bfd_elf32_bfd_reloc_type_lookup         elf32_arm_reloc_type_lookup
6912 #define bfd_elf32_find_nearest_line             elf32_arm_find_nearest_line
6913 #define bfd_elf32_find_inliner_info             elf32_arm_find_inliner_info
6914 #define bfd_elf32_new_section_hook              elf32_arm_new_section_hook
6915 #define bfd_elf32_bfd_is_target_special_symbol  elf32_arm_is_target_special_symbol
6916 #define bfd_elf32_close_and_cleanup             elf32_arm_close_and_cleanup
6917
6918 #define elf_backend_get_symbol_type             elf32_arm_get_symbol_type
6919 #define elf_backend_gc_mark_hook                elf32_arm_gc_mark_hook
6920 #define elf_backend_gc_sweep_hook               elf32_arm_gc_sweep_hook
6921 #define elf_backend_check_relocs                elf32_arm_check_relocs
6922 #define elf_backend_relocate_section            elf32_arm_relocate_section
6923 #define elf_backend_write_section               elf32_arm_write_section
6924 #define elf_backend_adjust_dynamic_symbol       elf32_arm_adjust_dynamic_symbol
6925 #define elf_backend_create_dynamic_sections     elf32_arm_create_dynamic_sections
6926 #define elf_backend_finish_dynamic_symbol       elf32_arm_finish_dynamic_symbol
6927 #define elf_backend_finish_dynamic_sections     elf32_arm_finish_dynamic_sections
6928 #define elf_backend_link_output_symbol_hook     elf32_arm_output_symbol_hook
6929 #define elf_backend_size_dynamic_sections       elf32_arm_size_dynamic_sections
6930 #define elf_backend_post_process_headers        elf32_arm_post_process_headers
6931 #define elf_backend_reloc_type_class            elf32_arm_reloc_type_class
6932 #define elf_backend_object_p                    elf32_arm_object_p
6933 #define elf_backend_section_flags               elf32_arm_section_flags
6934 #define elf_backend_fake_sections               elf32_arm_fake_sections
6935 #define elf_backend_section_from_shdr           elf32_arm_section_from_shdr
6936 #define elf_backend_final_write_processing      elf32_arm_final_write_processing
6937 #define elf_backend_copy_indirect_symbol        elf32_arm_copy_indirect_symbol
6938 #define elf_backend_symbol_processing           elf32_arm_symbol_processing
6939 #define elf_backend_size_info                   elf32_arm_size_info
6940 #define elf_backend_modify_segment_map          elf32_arm_modify_segment_map
6941 #define elf_backend_additional_program_headers \
6942   elf32_arm_additional_program_headers
6943
6944 #define elf_backend_can_refcount    1
6945 #define elf_backend_can_gc_sections 1
6946 #define elf_backend_plt_readonly    1
6947 #define elf_backend_want_got_plt    1
6948 #define elf_backend_want_plt_sym    0
6949 #define elf_backend_may_use_rel_p   1
6950 #define elf_backend_may_use_rela_p  0
6951 #define elf_backend_default_use_rela_p 0
6952 #define elf_backend_rela_normal     0
6953
6954 #define elf_backend_got_header_size     12
6955
6956 #include "elf32-target.h"
6957
6958 /* VxWorks Targets */
6959
6960 #undef TARGET_LITTLE_SYM
6961 #define TARGET_LITTLE_SYM               bfd_elf32_littlearm_vxworks_vec
6962 #undef TARGET_LITTLE_NAME
6963 #define TARGET_LITTLE_NAME              "elf32-littlearm-vxworks"
6964 #undef TARGET_BIG_SYM
6965 #define TARGET_BIG_SYM                  bfd_elf32_bigarm_vxworks_vec
6966 #undef TARGET_BIG_NAME
6967 #define TARGET_BIG_NAME                 "elf32-bigarm-vxworks"
6968
6969 /* Like elf32_arm_link_hash_table_create -- but overrides
6970    appropriately for VxWorks.  */
6971 static struct bfd_link_hash_table *
6972 elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
6973 {
6974   struct bfd_link_hash_table *ret;
6975
6976   ret = elf32_arm_link_hash_table_create (abfd);
6977   if (ret)
6978     {
6979       struct elf32_arm_link_hash_table *htab
6980         = (struct elf32_arm_link_hash_table *)ret;
6981       htab->use_rel = 0;
6982     }
6983   return ret;
6984 }     
6985
6986 #undef elf32_bed
6987 #define elf32_bed elf32_arm_vxworks_bed
6988
6989 #undef bfd_elf32_bfd_link_hash_table_create
6990 #define bfd_elf32_bfd_link_hash_table_create \
6991   elf32_arm_vxworks_link_hash_table_create
6992
6993 #undef elf_backend_may_use_rel_p
6994 #define elf_backend_may_use_rel_p   0
6995 #undef elf_backend_may_use_rela_p
6996 #define elf_backend_may_use_rela_p  1
6997 #undef elf_backend_default_use_rela_p
6998 #define elf_backend_default_use_rela_p 1
6999 #undef elf_backend_rela_normal
7000 #define elf_backend_rela_normal     1
7001
7002 #include "elf32-target.h"
7003
7004
7005 /* Symbian OS Targets */
7006
7007 #undef TARGET_LITTLE_SYM
7008 #define TARGET_LITTLE_SYM               bfd_elf32_littlearm_symbian_vec
7009 #undef TARGET_LITTLE_NAME
7010 #define TARGET_LITTLE_NAME              "elf32-littlearm-symbian"
7011 #undef TARGET_BIG_SYM
7012 #define TARGET_BIG_SYM                  bfd_elf32_bigarm_symbian_vec
7013 #undef TARGET_BIG_NAME
7014 #define TARGET_BIG_NAME                 "elf32-bigarm-symbian"
7015
7016 /* Like elf32_arm_link_hash_table_create -- but overrides
7017    appropriately for Symbian OS.  */
7018 static struct bfd_link_hash_table *
7019 elf32_arm_symbian_link_hash_table_create (bfd *abfd)
7020 {
7021   struct bfd_link_hash_table *ret;
7022
7023   ret = elf32_arm_link_hash_table_create (abfd);
7024   if (ret)
7025     {
7026       struct elf32_arm_link_hash_table *htab
7027         = (struct elf32_arm_link_hash_table *)ret;
7028       /* There is no PLT header for Symbian OS.  */
7029       htab->plt_header_size = 0;
7030       /* The PLT entries are each three instructions.  */
7031       htab->plt_entry_size = 4 * NUM_ELEM (elf32_arm_symbian_plt_entry);
7032       htab->symbian_p = 1;
7033       /* Symbian uses armv5t or above, so use_blx is always true.  */
7034       htab->use_blx = 1;
7035       htab->root.is_relocatable_executable = 1;
7036     }
7037   return ret;
7038 }     
7039
7040 static const struct bfd_elf_special_section
7041 elf32_arm_symbian_special_sections[] =
7042 {
7043   /* In a BPABI executable, the dynamic linking sections do not go in
7044      the loadable read-only segment.  The post-linker may wish to
7045      refer to these sections, but they are not part of the final
7046      program image.  */
7047   { ".dynamic",        8,  0, SHT_DYNAMIC,  0 },
7048   { ".dynstr",         7,  0, SHT_STRTAB,   0 },
7049   { ".dynsym",         7,  0, SHT_DYNSYM,   0 },
7050   { ".got",            4,  0, SHT_PROGBITS, 0 },
7051   { ".hash",           5,  0, SHT_HASH,     0 },
7052   /* These sections do not need to be writable as the SymbianOS
7053      postlinker will arrange things so that no dynamic relocation is
7054      required.  */
7055   { ".init_array",    11,  0, SHT_INIT_ARRAY, SHF_ALLOC },
7056   { ".fini_array",    11,  0, SHT_FINI_ARRAY, SHF_ALLOC },
7057   { ".preinit_array", 14,  0, SHT_PREINIT_ARRAY, SHF_ALLOC },
7058   { NULL,              0,  0, 0,            0 }
7059 };
7060
7061 static void
7062 elf32_arm_symbian_begin_write_processing (bfd *abfd, 
7063                                           struct bfd_link_info *link_info
7064                                             ATTRIBUTE_UNUSED)
7065 {
7066   /* BPABI objects are never loaded directly by an OS kernel; they are
7067      processed by a postlinker first, into an OS-specific format.  If
7068      the D_PAGED bit is set on the file, BFD will align segments on
7069      page boundaries, so that an OS can directly map the file.  With
7070      BPABI objects, that just results in wasted space.  In addition,
7071      because we clear the D_PAGED bit, map_sections_to_segments will
7072      recognize that the program headers should not be mapped into any
7073      loadable segment.  */
7074   abfd->flags &= ~D_PAGED;
7075 }
7076
7077 static bfd_boolean
7078 elf32_arm_symbian_modify_segment_map (bfd *abfd, 
7079                                       struct bfd_link_info *info)
7080 {
7081   struct elf_segment_map *m;
7082   asection *dynsec;
7083
7084   /* BPABI shared libraries and executables should have a PT_DYNAMIC
7085      segment.  However, because the .dynamic section is not marked
7086      with SEC_LOAD, the generic ELF code will not create such a
7087      segment.  */
7088   dynsec = bfd_get_section_by_name (abfd, ".dynamic");
7089   if (dynsec)
7090     {
7091       m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
7092       m->next = elf_tdata (abfd)->segment_map;
7093       elf_tdata (abfd)->segment_map = m;
7094     }
7095
7096   /* Also call the generic arm routine.  */
7097   return elf32_arm_modify_segment_map (abfd, info);
7098 }
7099
7100 #undef elf32_bed
7101 #define elf32_bed elf32_arm_symbian_bed
7102
7103 /* The dynamic sections are not allocated on SymbianOS; the postlinker
7104    will process them and then discard them.  */
7105 #undef ELF_DYNAMIC_SEC_FLAGS
7106 #define ELF_DYNAMIC_SEC_FLAGS \
7107   (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
7108
7109 #undef bfd_elf32_bfd_link_hash_table_create
7110 #define bfd_elf32_bfd_link_hash_table_create \
7111   elf32_arm_symbian_link_hash_table_create
7112
7113 #undef elf_backend_special_sections
7114 #define elf_backend_special_sections elf32_arm_symbian_special_sections
7115
7116 #undef elf_backend_begin_write_processing
7117 #define elf_backend_begin_write_processing \
7118     elf32_arm_symbian_begin_write_processing
7119
7120 #undef elf_backend_modify_segment_map
7121 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
7122
7123 /* There is no .got section for BPABI objects, and hence no header.  */
7124 #undef elf_backend_got_header_size
7125 #define elf_backend_got_header_size 0
7126
7127 /* Similarly, there is no .got.plt section.  */
7128 #undef elf_backend_want_got_plt
7129 #define elf_backend_want_got_plt 0
7130
7131 #undef elf_backend_may_use_rel_p
7132 #define elf_backend_may_use_rel_p   1
7133 #undef elf_backend_may_use_rela_p
7134 #define elf_backend_may_use_rela_p  0
7135 #undef elf_backend_default_use_rela_p
7136 #define elf_backend_default_use_rela_p 0
7137 #undef elf_backend_rela_normal
7138 #define elf_backend_rela_normal     0
7139
7140 #include "elf32-target.h"