ecee78ac067fdf2cf571f1ea7c1f94bc24ae630d
[external/binutils.git] / bfd / elf32-ppc.c
1 /* PowerPC-specific support for 32-bit ELF
2    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3    2004, 2005 Free Software Foundation, Inc.
4    Written by Ian Lance Taylor, Cygnus Support.
5
6    This file is part of BFD, the Binary File Descriptor library.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the
20    Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
21    Boston, MA 02110-1301, USA.  */
22
23 /* This file is based on a preliminary PowerPC ELF ABI.  The
24    information may not match the final PowerPC ELF ABI.  It includes
25    suggestions from the in-progress Embedded PowerPC ABI, and that
26    information may also not match.  */
27
28 #include "bfd.h"
29 #include "sysdep.h"
30 #include "bfdlink.h"
31 #include "libbfd.h"
32 #include "elf-bfd.h"
33 #include "elf/ppc.h"
34 #include "elf32-ppc.h"
35
36 /* RELA relocations are used here.  */
37
38 static bfd_reloc_status_type ppc_elf_addr16_ha_reloc
39   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
40 static bfd_reloc_status_type ppc_elf_unhandled_reloc
41   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42
43 /* Branch prediction bit for branch taken relocs.  */
44 #define BRANCH_PREDICT_BIT 0x200000
45 /* Mask to set RA in memory instructions.  */
46 #define RA_REGISTER_MASK 0x001f0000
47 /* Value to shift register by to insert RA.  */
48 #define RA_REGISTER_SHIFT 16
49
50 /* The name of the dynamic interpreter.  This is put in the .interp
51    section.  */
52 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
53
54 /* The size in bytes of an entry in the procedure linkage table.  */
55 #define PLT_ENTRY_SIZE 12
56 /* The initial size of the plt reserved for the dynamic linker.  */
57 #define PLT_INITIAL_ENTRY_SIZE 72
58 /* The size of the gap between entries in the PLT.  */
59 #define PLT_SLOT_SIZE 8
60 /* The number of single-slot PLT entries (the rest use two slots).  */
61 #define PLT_NUM_SINGLE_ENTRIES 8192
62
63 /* Some nop instructions.  */
64 #define NOP             0x60000000
65 #define CROR_151515     0x4def7b82
66 #define CROR_313131     0x4ffffb82
67
68 /* Offset of tp and dtp pointers from start of TLS block.  */
69 #define TP_OFFSET       0x7000
70 #define DTP_OFFSET      0x8000
71 \f
72 static reloc_howto_type *ppc_elf_howto_table[R_PPC_max];
73
74 static reloc_howto_type ppc_elf_howto_raw[] = {
75   /* This reloc does nothing.  */
76   HOWTO (R_PPC_NONE,            /* type */
77          0,                     /* rightshift */
78          2,                     /* size (0 = byte, 1 = short, 2 = long) */
79          32,                    /* bitsize */
80          FALSE,                 /* pc_relative */
81          0,                     /* bitpos */
82          complain_overflow_bitfield, /* complain_on_overflow */
83          bfd_elf_generic_reloc, /* special_function */
84          "R_PPC_NONE",          /* name */
85          FALSE,                 /* partial_inplace */
86          0,                     /* src_mask */
87          0,                     /* dst_mask */
88          FALSE),                /* pcrel_offset */
89
90   /* A standard 32 bit relocation.  */
91   HOWTO (R_PPC_ADDR32,          /* type */
92          0,                     /* rightshift */
93          2,                     /* size (0 = byte, 1 = short, 2 = long) */
94          32,                    /* bitsize */
95          FALSE,                 /* pc_relative */
96          0,                     /* bitpos */
97          complain_overflow_bitfield, /* complain_on_overflow */
98          bfd_elf_generic_reloc, /* special_function */
99          "R_PPC_ADDR32",        /* name */
100          FALSE,                 /* partial_inplace */
101          0,                     /* src_mask */
102          0xffffffff,            /* dst_mask */
103          FALSE),                /* pcrel_offset */
104
105   /* An absolute 26 bit branch; the lower two bits must be zero.
106      FIXME: we don't check that, we just clear them.  */
107   HOWTO (R_PPC_ADDR24,          /* type */
108          0,                     /* rightshift */
109          2,                     /* size (0 = byte, 1 = short, 2 = long) */
110          26,                    /* bitsize */
111          FALSE,                 /* pc_relative */
112          0,                     /* bitpos */
113          complain_overflow_bitfield, /* complain_on_overflow */
114          bfd_elf_generic_reloc, /* special_function */
115          "R_PPC_ADDR24",        /* name */
116          FALSE,                 /* partial_inplace */
117          0,                     /* src_mask */
118          0x3fffffc,             /* dst_mask */
119          FALSE),                /* pcrel_offset */
120
121   /* A standard 16 bit relocation.  */
122   HOWTO (R_PPC_ADDR16,          /* type */
123          0,                     /* rightshift */
124          1,                     /* size (0 = byte, 1 = short, 2 = long) */
125          16,                    /* bitsize */
126          FALSE,                 /* pc_relative */
127          0,                     /* bitpos */
128          complain_overflow_bitfield, /* complain_on_overflow */
129          bfd_elf_generic_reloc, /* special_function */
130          "R_PPC_ADDR16",        /* name */
131          FALSE,                 /* partial_inplace */
132          0,                     /* src_mask */
133          0xffff,                /* dst_mask */
134          FALSE),                /* pcrel_offset */
135
136   /* A 16 bit relocation without overflow.  */
137   HOWTO (R_PPC_ADDR16_LO,       /* type */
138          0,                     /* rightshift */
139          1,                     /* size (0 = byte, 1 = short, 2 = long) */
140          16,                    /* bitsize */
141          FALSE,                 /* pc_relative */
142          0,                     /* bitpos */
143          complain_overflow_dont,/* complain_on_overflow */
144          bfd_elf_generic_reloc, /* special_function */
145          "R_PPC_ADDR16_LO",     /* name */
146          FALSE,                 /* partial_inplace */
147          0,                     /* src_mask */
148          0xffff,                /* dst_mask */
149          FALSE),                /* pcrel_offset */
150
151   /* The high order 16 bits of an address.  */
152   HOWTO (R_PPC_ADDR16_HI,       /* type */
153          16,                    /* rightshift */
154          1,                     /* size (0 = byte, 1 = short, 2 = long) */
155          16,                    /* bitsize */
156          FALSE,                 /* pc_relative */
157          0,                     /* bitpos */
158          complain_overflow_dont, /* complain_on_overflow */
159          bfd_elf_generic_reloc, /* special_function */
160          "R_PPC_ADDR16_HI",     /* name */
161          FALSE,                 /* partial_inplace */
162          0,                     /* src_mask */
163          0xffff,                /* dst_mask */
164          FALSE),                /* pcrel_offset */
165
166   /* The high order 16 bits of an address, plus 1 if the contents of
167      the low 16 bits, treated as a signed number, is negative.  */
168   HOWTO (R_PPC_ADDR16_HA,       /* type */
169          16,                    /* rightshift */
170          1,                     /* size (0 = byte, 1 = short, 2 = long) */
171          16,                    /* bitsize */
172          FALSE,                 /* pc_relative */
173          0,                     /* bitpos */
174          complain_overflow_dont, /* complain_on_overflow */
175          ppc_elf_addr16_ha_reloc, /* special_function */
176          "R_PPC_ADDR16_HA",     /* name */
177          FALSE,                 /* partial_inplace */
178          0,                     /* src_mask */
179          0xffff,                /* dst_mask */
180          FALSE),                /* pcrel_offset */
181
182   /* An absolute 16 bit branch; the lower two bits must be zero.
183      FIXME: we don't check that, we just clear them.  */
184   HOWTO (R_PPC_ADDR14,          /* type */
185          0,                     /* rightshift */
186          2,                     /* size (0 = byte, 1 = short, 2 = long) */
187          16,                    /* bitsize */
188          FALSE,                 /* pc_relative */
189          0,                     /* bitpos */
190          complain_overflow_bitfield, /* complain_on_overflow */
191          bfd_elf_generic_reloc, /* special_function */
192          "R_PPC_ADDR14",        /* name */
193          FALSE,                 /* partial_inplace */
194          0,                     /* src_mask */
195          0xfffc,                /* dst_mask */
196          FALSE),                /* pcrel_offset */
197
198   /* An absolute 16 bit branch, for which bit 10 should be set to
199      indicate that the branch is expected to be taken.  The lower two
200      bits must be zero.  */
201   HOWTO (R_PPC_ADDR14_BRTAKEN,  /* type */
202          0,                     /* rightshift */
203          2,                     /* size (0 = byte, 1 = short, 2 = long) */
204          16,                    /* bitsize */
205          FALSE,                 /* pc_relative */
206          0,                     /* bitpos */
207          complain_overflow_bitfield, /* complain_on_overflow */
208          bfd_elf_generic_reloc, /* special_function */
209          "R_PPC_ADDR14_BRTAKEN",/* name */
210          FALSE,                 /* partial_inplace */
211          0,                     /* src_mask */
212          0xfffc,                /* dst_mask */
213          FALSE),                /* pcrel_offset */
214
215   /* An absolute 16 bit branch, for which bit 10 should be set to
216      indicate that the branch is not expected to be taken.  The lower
217      two bits must be zero.  */
218   HOWTO (R_PPC_ADDR14_BRNTAKEN, /* type */
219          0,                     /* rightshift */
220          2,                     /* size (0 = byte, 1 = short, 2 = long) */
221          16,                    /* bitsize */
222          FALSE,                 /* pc_relative */
223          0,                     /* bitpos */
224          complain_overflow_bitfield, /* complain_on_overflow */
225          bfd_elf_generic_reloc, /* special_function */
226          "R_PPC_ADDR14_BRNTAKEN",/* name */
227          FALSE,                 /* partial_inplace */
228          0,                     /* src_mask */
229          0xfffc,                /* dst_mask */
230          FALSE),                /* pcrel_offset */
231
232   /* A relative 26 bit branch; the lower two bits must be zero.  */
233   HOWTO (R_PPC_REL24,           /* type */
234          0,                     /* rightshift */
235          2,                     /* size (0 = byte, 1 = short, 2 = long) */
236          26,                    /* bitsize */
237          TRUE,                  /* pc_relative */
238          0,                     /* bitpos */
239          complain_overflow_signed, /* complain_on_overflow */
240          bfd_elf_generic_reloc, /* special_function */
241          "R_PPC_REL24",         /* name */
242          FALSE,                 /* partial_inplace */
243          0,                     /* src_mask */
244          0x3fffffc,             /* dst_mask */
245          TRUE),                 /* pcrel_offset */
246
247   /* A relative 16 bit branch; the lower two bits must be zero.  */
248   HOWTO (R_PPC_REL14,           /* type */
249          0,                     /* rightshift */
250          2,                     /* size (0 = byte, 1 = short, 2 = long) */
251          16,                    /* bitsize */
252          TRUE,                  /* pc_relative */
253          0,                     /* bitpos */
254          complain_overflow_signed, /* complain_on_overflow */
255          bfd_elf_generic_reloc, /* special_function */
256          "R_PPC_REL14",         /* name */
257          FALSE,                 /* partial_inplace */
258          0,                     /* src_mask */
259          0xfffc,                /* dst_mask */
260          TRUE),                 /* pcrel_offset */
261
262   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
263      the branch is expected to be taken.  The lower two bits must be
264      zero.  */
265   HOWTO (R_PPC_REL14_BRTAKEN,   /* type */
266          0,                     /* rightshift */
267          2,                     /* size (0 = byte, 1 = short, 2 = long) */
268          16,                    /* bitsize */
269          TRUE,                  /* pc_relative */
270          0,                     /* bitpos */
271          complain_overflow_signed, /* complain_on_overflow */
272          bfd_elf_generic_reloc, /* special_function */
273          "R_PPC_REL14_BRTAKEN", /* name */
274          FALSE,                 /* partial_inplace */
275          0,                     /* src_mask */
276          0xfffc,                /* dst_mask */
277          TRUE),                 /* pcrel_offset */
278
279   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
280      the branch is not expected to be taken.  The lower two bits must
281      be zero.  */
282   HOWTO (R_PPC_REL14_BRNTAKEN,  /* type */
283          0,                     /* rightshift */
284          2,                     /* size (0 = byte, 1 = short, 2 = long) */
285          16,                    /* bitsize */
286          TRUE,                  /* pc_relative */
287          0,                     /* bitpos */
288          complain_overflow_signed, /* complain_on_overflow */
289          bfd_elf_generic_reloc, /* special_function */
290          "R_PPC_REL14_BRNTAKEN",/* name */
291          FALSE,                 /* partial_inplace */
292          0,                     /* src_mask */
293          0xfffc,                /* dst_mask */
294          TRUE),                 /* pcrel_offset */
295
296   /* Like R_PPC_ADDR16, but referring to the GOT table entry for the
297      symbol.  */
298   HOWTO (R_PPC_GOT16,           /* type */
299          0,                     /* rightshift */
300          1,                     /* size (0 = byte, 1 = short, 2 = long) */
301          16,                    /* bitsize */
302          FALSE,                 /* pc_relative */
303          0,                     /* bitpos */
304          complain_overflow_signed, /* complain_on_overflow */
305          bfd_elf_generic_reloc, /* special_function */
306          "R_PPC_GOT16",         /* name */
307          FALSE,                 /* partial_inplace */
308          0,                     /* src_mask */
309          0xffff,                /* dst_mask */
310          FALSE),                /* pcrel_offset */
311
312   /* Like R_PPC_ADDR16_LO, but referring to the GOT table entry for
313      the symbol.  */
314   HOWTO (R_PPC_GOT16_LO,        /* type */
315          0,                     /* rightshift */
316          1,                     /* size (0 = byte, 1 = short, 2 = long) */
317          16,                    /* bitsize */
318          FALSE,                 /* pc_relative */
319          0,                     /* bitpos */
320          complain_overflow_dont, /* complain_on_overflow */
321          bfd_elf_generic_reloc, /* special_function */
322          "R_PPC_GOT16_LO",      /* name */
323          FALSE,                 /* partial_inplace */
324          0,                     /* src_mask */
325          0xffff,                /* dst_mask */
326          FALSE),                /* pcrel_offset */
327
328   /* Like R_PPC_ADDR16_HI, but referring to the GOT table entry for
329      the symbol.  */
330   HOWTO (R_PPC_GOT16_HI,        /* type */
331          16,                    /* rightshift */
332          1,                     /* size (0 = byte, 1 = short, 2 = long) */
333          16,                    /* bitsize */
334          FALSE,                 /* pc_relative */
335          0,                     /* bitpos */
336          complain_overflow_bitfield, /* complain_on_overflow */
337          bfd_elf_generic_reloc, /* special_function */
338          "R_PPC_GOT16_HI",      /* name */
339          FALSE,                 /* partial_inplace */
340          0,                     /* src_mask */
341          0xffff,                /* dst_mask */
342          FALSE),                 /* pcrel_offset */
343
344   /* Like R_PPC_ADDR16_HA, but referring to the GOT table entry for
345      the symbol.  */
346   HOWTO (R_PPC_GOT16_HA,        /* type */
347          16,                    /* rightshift */
348          1,                     /* size (0 = byte, 1 = short, 2 = long) */
349          16,                    /* bitsize */
350          FALSE,                 /* pc_relative */
351          0,                     /* bitpos */
352          complain_overflow_bitfield, /* complain_on_overflow */
353          ppc_elf_addr16_ha_reloc, /* special_function */
354          "R_PPC_GOT16_HA",      /* name */
355          FALSE,                 /* partial_inplace */
356          0,                     /* src_mask */
357          0xffff,                /* dst_mask */
358          FALSE),                /* pcrel_offset */
359
360   /* Like R_PPC_REL24, but referring to the procedure linkage table
361      entry for the symbol.  */
362   HOWTO (R_PPC_PLTREL24,        /* type */
363          0,                     /* rightshift */
364          2,                     /* size (0 = byte, 1 = short, 2 = long) */
365          26,                    /* bitsize */
366          TRUE,                  /* pc_relative */
367          0,                     /* bitpos */
368          complain_overflow_signed,  /* complain_on_overflow */
369          bfd_elf_generic_reloc, /* special_function */
370          "R_PPC_PLTREL24",      /* name */
371          FALSE,                 /* partial_inplace */
372          0,                     /* src_mask */
373          0x3fffffc,             /* dst_mask */
374          TRUE),                 /* pcrel_offset */
375
376   /* This is used only by the dynamic linker.  The symbol should exist
377      both in the object being run and in some shared library.  The
378      dynamic linker copies the data addressed by the symbol from the
379      shared library into the object, because the object being
380      run has to have the data at some particular address.  */
381   HOWTO (R_PPC_COPY,            /* type */
382          0,                     /* rightshift */
383          2,                     /* size (0 = byte, 1 = short, 2 = long) */
384          32,                    /* bitsize */
385          FALSE,                 /* pc_relative */
386          0,                     /* bitpos */
387          complain_overflow_bitfield, /* complain_on_overflow */
388          bfd_elf_generic_reloc,  /* special_function */
389          "R_PPC_COPY",          /* name */
390          FALSE,                 /* partial_inplace */
391          0,                     /* src_mask */
392          0,                     /* dst_mask */
393          FALSE),                /* pcrel_offset */
394
395   /* Like R_PPC_ADDR32, but used when setting global offset table
396      entries.  */
397   HOWTO (R_PPC_GLOB_DAT,        /* type */
398          0,                     /* rightshift */
399          2,                     /* size (0 = byte, 1 = short, 2 = long) */
400          32,                    /* bitsize */
401          FALSE,                 /* pc_relative */
402          0,                     /* bitpos */
403          complain_overflow_bitfield, /* complain_on_overflow */
404          bfd_elf_generic_reloc,  /* special_function */
405          "R_PPC_GLOB_DAT",      /* name */
406          FALSE,                 /* partial_inplace */
407          0,                     /* src_mask */
408          0xffffffff,            /* dst_mask */
409          FALSE),                /* pcrel_offset */
410
411   /* Marks a procedure linkage table entry for a symbol.  */
412   HOWTO (R_PPC_JMP_SLOT,        /* type */
413          0,                     /* rightshift */
414          2,                     /* size (0 = byte, 1 = short, 2 = long) */
415          32,                    /* bitsize */
416          FALSE,                 /* pc_relative */
417          0,                     /* bitpos */
418          complain_overflow_bitfield, /* complain_on_overflow */
419          bfd_elf_generic_reloc,  /* special_function */
420          "R_PPC_JMP_SLOT",      /* name */
421          FALSE,                 /* partial_inplace */
422          0,                     /* src_mask */
423          0,                     /* dst_mask */
424          FALSE),                /* pcrel_offset */
425
426   /* Used only by the dynamic linker.  When the object is run, this
427      longword is set to the load address of the object, plus the
428      addend.  */
429   HOWTO (R_PPC_RELATIVE,        /* type */
430          0,                     /* rightshift */
431          2,                     /* size (0 = byte, 1 = short, 2 = long) */
432          32,                    /* bitsize */
433          FALSE,                 /* pc_relative */
434          0,                     /* bitpos */
435          complain_overflow_bitfield, /* complain_on_overflow */
436          bfd_elf_generic_reloc,  /* special_function */
437          "R_PPC_RELATIVE",      /* name */
438          FALSE,                 /* partial_inplace */
439          0,                     /* src_mask */
440          0xffffffff,            /* dst_mask */
441          FALSE),                /* pcrel_offset */
442
443   /* Like R_PPC_REL24, but uses the value of the symbol within the
444      object rather than the final value.  Normally used for
445      _GLOBAL_OFFSET_TABLE_.  */
446   HOWTO (R_PPC_LOCAL24PC,       /* type */
447          0,                     /* rightshift */
448          2,                     /* size (0 = byte, 1 = short, 2 = long) */
449          26,                    /* bitsize */
450          TRUE,                  /* pc_relative */
451          0,                     /* bitpos */
452          complain_overflow_signed, /* complain_on_overflow */
453          bfd_elf_generic_reloc, /* special_function */
454          "R_PPC_LOCAL24PC",     /* name */
455          FALSE,                 /* partial_inplace */
456          0,                     /* src_mask */
457          0x3fffffc,             /* dst_mask */
458          TRUE),                 /* pcrel_offset */
459
460   /* Like R_PPC_ADDR32, but may be unaligned.  */
461   HOWTO (R_PPC_UADDR32,         /* type */
462          0,                     /* rightshift */
463          2,                     /* size (0 = byte, 1 = short, 2 = long) */
464          32,                    /* bitsize */
465          FALSE,                 /* pc_relative */
466          0,                     /* bitpos */
467          complain_overflow_bitfield, /* complain_on_overflow */
468          bfd_elf_generic_reloc, /* special_function */
469          "R_PPC_UADDR32",       /* name */
470          FALSE,                 /* partial_inplace */
471          0,                     /* src_mask */
472          0xffffffff,            /* dst_mask */
473          FALSE),                /* pcrel_offset */
474
475   /* Like R_PPC_ADDR16, but may be unaligned.  */
476   HOWTO (R_PPC_UADDR16,         /* type */
477          0,                     /* rightshift */
478          1,                     /* size (0 = byte, 1 = short, 2 = long) */
479          16,                    /* bitsize */
480          FALSE,                 /* pc_relative */
481          0,                     /* bitpos */
482          complain_overflow_bitfield, /* complain_on_overflow */
483          bfd_elf_generic_reloc, /* special_function */
484          "R_PPC_UADDR16",       /* name */
485          FALSE,                 /* partial_inplace */
486          0,                     /* src_mask */
487          0xffff,                /* dst_mask */
488          FALSE),                /* pcrel_offset */
489
490   /* 32-bit PC relative */
491   HOWTO (R_PPC_REL32,           /* type */
492          0,                     /* rightshift */
493          2,                     /* size (0 = byte, 1 = short, 2 = long) */
494          32,                    /* bitsize */
495          TRUE,                  /* pc_relative */
496          0,                     /* bitpos */
497          complain_overflow_bitfield, /* complain_on_overflow */
498          bfd_elf_generic_reloc, /* special_function */
499          "R_PPC_REL32",         /* name */
500          FALSE,                 /* partial_inplace */
501          0,                     /* src_mask */
502          0xffffffff,            /* dst_mask */
503          TRUE),                 /* pcrel_offset */
504
505   /* 32-bit relocation to the symbol's procedure linkage table.
506      FIXME: not supported.  */
507   HOWTO (R_PPC_PLT32,           /* type */
508          0,                     /* rightshift */
509          2,                     /* size (0 = byte, 1 = short, 2 = long) */
510          32,                    /* bitsize */
511          FALSE,                 /* pc_relative */
512          0,                     /* bitpos */
513          complain_overflow_bitfield, /* complain_on_overflow */
514          bfd_elf_generic_reloc, /* special_function */
515          "R_PPC_PLT32",         /* name */
516          FALSE,                 /* partial_inplace */
517          0,                     /* src_mask */
518          0,                     /* dst_mask */
519          FALSE),                /* pcrel_offset */
520
521   /* 32-bit PC relative relocation to the symbol's procedure linkage table.
522      FIXME: not supported.  */
523   HOWTO (R_PPC_PLTREL32,        /* type */
524          0,                     /* rightshift */
525          2,                     /* size (0 = byte, 1 = short, 2 = long) */
526          32,                    /* bitsize */
527          TRUE,                  /* pc_relative */
528          0,                     /* bitpos */
529          complain_overflow_bitfield, /* complain_on_overflow */
530          bfd_elf_generic_reloc, /* special_function */
531          "R_PPC_PLTREL32",      /* name */
532          FALSE,                 /* partial_inplace */
533          0,                     /* src_mask */
534          0,                     /* dst_mask */
535          TRUE),                 /* pcrel_offset */
536
537   /* Like R_PPC_ADDR16_LO, but referring to the PLT table entry for
538      the symbol.  */
539   HOWTO (R_PPC_PLT16_LO,        /* type */
540          0,                     /* rightshift */
541          1,                     /* size (0 = byte, 1 = short, 2 = long) */
542          16,                    /* bitsize */
543          FALSE,                 /* pc_relative */
544          0,                     /* bitpos */
545          complain_overflow_dont, /* complain_on_overflow */
546          bfd_elf_generic_reloc, /* special_function */
547          "R_PPC_PLT16_LO",      /* name */
548          FALSE,                 /* partial_inplace */
549          0,                     /* src_mask */
550          0xffff,                /* dst_mask */
551          FALSE),                /* pcrel_offset */
552
553   /* Like R_PPC_ADDR16_HI, but referring to the PLT table entry for
554      the symbol.  */
555   HOWTO (R_PPC_PLT16_HI,        /* type */
556          16,                    /* rightshift */
557          1,                     /* size (0 = byte, 1 = short, 2 = long) */
558          16,                    /* bitsize */
559          FALSE,                 /* pc_relative */
560          0,                     /* bitpos */
561          complain_overflow_bitfield, /* complain_on_overflow */
562          bfd_elf_generic_reloc, /* special_function */
563          "R_PPC_PLT16_HI",      /* name */
564          FALSE,                 /* partial_inplace */
565          0,                     /* src_mask */
566          0xffff,                /* dst_mask */
567          FALSE),                 /* pcrel_offset */
568
569   /* Like R_PPC_ADDR16_HA, but referring to the PLT table entry for
570      the symbol.  */
571   HOWTO (R_PPC_PLT16_HA,        /* type */
572          16,                    /* rightshift */
573          1,                     /* size (0 = byte, 1 = short, 2 = long) */
574          16,                    /* bitsize */
575          FALSE,                 /* pc_relative */
576          0,                     /* bitpos */
577          complain_overflow_bitfield, /* complain_on_overflow */
578          ppc_elf_addr16_ha_reloc, /* special_function */
579          "R_PPC_PLT16_HA",      /* name */
580          FALSE,                 /* partial_inplace */
581          0,                     /* src_mask */
582          0xffff,                /* dst_mask */
583          FALSE),                /* pcrel_offset */
584
585   /* A sign-extended 16 bit value relative to _SDA_BASE_, for use with
586      small data items.  */
587   HOWTO (R_PPC_SDAREL16,        /* type */
588          0,                     /* rightshift */
589          1,                     /* size (0 = byte, 1 = short, 2 = long) */
590          16,                    /* bitsize */
591          FALSE,                 /* pc_relative */
592          0,                     /* bitpos */
593          complain_overflow_signed, /* complain_on_overflow */
594          bfd_elf_generic_reloc, /* special_function */
595          "R_PPC_SDAREL16",      /* name */
596          FALSE,                 /* partial_inplace */
597          0,                     /* src_mask */
598          0xffff,                /* dst_mask */
599          FALSE),                /* pcrel_offset */
600
601   /* 16-bit section relative relocation.  */
602   HOWTO (R_PPC_SECTOFF,         /* type */
603          0,                     /* rightshift */
604          1,                     /* size (0 = byte, 1 = short, 2 = long) */
605          16,                    /* bitsize */
606          FALSE,                 /* pc_relative */
607          0,                     /* bitpos */
608          complain_overflow_bitfield, /* complain_on_overflow */
609          bfd_elf_generic_reloc, /* special_function */
610          "R_PPC_SECTOFF",       /* name */
611          FALSE,                 /* partial_inplace */
612          0,                     /* src_mask */
613          0xffff,                /* dst_mask */
614          FALSE),                /* pcrel_offset */
615
616   /* 16-bit lower half section relative relocation.  */
617   HOWTO (R_PPC_SECTOFF_LO,        /* type */
618          0,                     /* rightshift */
619          1,                     /* size (0 = byte, 1 = short, 2 = long) */
620          16,                    /* bitsize */
621          FALSE,                 /* pc_relative */
622          0,                     /* bitpos */
623          complain_overflow_dont, /* complain_on_overflow */
624          bfd_elf_generic_reloc, /* special_function */
625          "R_PPC_SECTOFF_LO",    /* name */
626          FALSE,                 /* partial_inplace */
627          0,                     /* src_mask */
628          0xffff,                /* dst_mask */
629          FALSE),                /* pcrel_offset */
630
631   /* 16-bit upper half section relative relocation.  */
632   HOWTO (R_PPC_SECTOFF_HI,      /* type */
633          16,                    /* rightshift */
634          1,                     /* size (0 = byte, 1 = short, 2 = long) */
635          16,                    /* bitsize */
636          FALSE,                 /* pc_relative */
637          0,                     /* bitpos */
638          complain_overflow_bitfield, /* complain_on_overflow */
639          bfd_elf_generic_reloc, /* special_function */
640          "R_PPC_SECTOFF_HI",    /* name */
641          FALSE,                 /* partial_inplace */
642          0,                     /* src_mask */
643          0xffff,                /* dst_mask */
644          FALSE),                 /* pcrel_offset */
645
646   /* 16-bit upper half adjusted section relative relocation.  */
647   HOWTO (R_PPC_SECTOFF_HA,      /* type */
648          16,                    /* rightshift */
649          1,                     /* size (0 = byte, 1 = short, 2 = long) */
650          16,                    /* bitsize */
651          FALSE,                 /* pc_relative */
652          0,                     /* bitpos */
653          complain_overflow_bitfield, /* complain_on_overflow */
654          ppc_elf_addr16_ha_reloc, /* special_function */
655          "R_PPC_SECTOFF_HA",    /* name */
656          FALSE,                 /* partial_inplace */
657          0,                     /* src_mask */
658          0xffff,                /* dst_mask */
659          FALSE),                /* pcrel_offset */
660
661   /* Marker reloc for TLS.  */
662   HOWTO (R_PPC_TLS,
663          0,                     /* rightshift */
664          2,                     /* size (0 = byte, 1 = short, 2 = long) */
665          32,                    /* bitsize */
666          FALSE,                 /* pc_relative */
667          0,                     /* bitpos */
668          complain_overflow_dont, /* complain_on_overflow */
669          bfd_elf_generic_reloc, /* special_function */
670          "R_PPC_TLS",           /* name */
671          FALSE,                 /* partial_inplace */
672          0,                     /* src_mask */
673          0,                     /* dst_mask */
674          FALSE),                /* pcrel_offset */
675
676   /* Computes the load module index of the load module that contains the
677      definition of its TLS sym.  */
678   HOWTO (R_PPC_DTPMOD32,
679          0,                     /* rightshift */
680          2,                     /* size (0 = byte, 1 = short, 2 = long) */
681          32,                    /* bitsize */
682          FALSE,                 /* pc_relative */
683          0,                     /* bitpos */
684          complain_overflow_dont, /* complain_on_overflow */
685          ppc_elf_unhandled_reloc, /* special_function */
686          "R_PPC_DTPMOD32",      /* name */
687          FALSE,                 /* partial_inplace */
688          0,                     /* src_mask */
689          0xffffffff,            /* dst_mask */
690          FALSE),                /* pcrel_offset */
691
692   /* Computes a dtv-relative displacement, the difference between the value
693      of sym+add and the base address of the thread-local storage block that
694      contains the definition of sym, minus 0x8000.  */
695   HOWTO (R_PPC_DTPREL32,
696          0,                     /* rightshift */
697          2,                     /* size (0 = byte, 1 = short, 2 = long) */
698          32,                    /* bitsize */
699          FALSE,                 /* pc_relative */
700          0,                     /* bitpos */
701          complain_overflow_dont, /* complain_on_overflow */
702          ppc_elf_unhandled_reloc, /* special_function */
703          "R_PPC_DTPREL32",      /* name */
704          FALSE,                 /* partial_inplace */
705          0,                     /* src_mask */
706          0xffffffff,            /* dst_mask */
707          FALSE),                /* pcrel_offset */
708
709   /* A 16 bit dtprel reloc.  */
710   HOWTO (R_PPC_DTPREL16,
711          0,                     /* rightshift */
712          1,                     /* size (0 = byte, 1 = short, 2 = long) */
713          16,                    /* bitsize */
714          FALSE,                 /* pc_relative */
715          0,                     /* bitpos */
716          complain_overflow_signed, /* complain_on_overflow */
717          ppc_elf_unhandled_reloc, /* special_function */
718          "R_PPC_DTPREL16",      /* name */
719          FALSE,                 /* partial_inplace */
720          0,                     /* src_mask */
721          0xffff,                /* dst_mask */
722          FALSE),                /* pcrel_offset */
723
724   /* Like DTPREL16, but no overflow.  */
725   HOWTO (R_PPC_DTPREL16_LO,
726          0,                     /* rightshift */
727          1,                     /* size (0 = byte, 1 = short, 2 = long) */
728          16,                    /* bitsize */
729          FALSE,                 /* pc_relative */
730          0,                     /* bitpos */
731          complain_overflow_dont, /* complain_on_overflow */
732          ppc_elf_unhandled_reloc, /* special_function */
733          "R_PPC_DTPREL16_LO",   /* name */
734          FALSE,                 /* partial_inplace */
735          0,                     /* src_mask */
736          0xffff,                /* dst_mask */
737          FALSE),                /* pcrel_offset */
738
739   /* Like DTPREL16_LO, but next higher group of 16 bits.  */
740   HOWTO (R_PPC_DTPREL16_HI,
741          16,                    /* rightshift */
742          1,                     /* size (0 = byte, 1 = short, 2 = long) */
743          16,                    /* bitsize */
744          FALSE,                 /* pc_relative */
745          0,                     /* bitpos */
746          complain_overflow_dont, /* complain_on_overflow */
747          ppc_elf_unhandled_reloc, /* special_function */
748          "R_PPC_DTPREL16_HI",   /* name */
749          FALSE,                 /* partial_inplace */
750          0,                     /* src_mask */
751          0xffff,                /* dst_mask */
752          FALSE),                /* pcrel_offset */
753
754   /* Like DTPREL16_HI, but adjust for low 16 bits.  */
755   HOWTO (R_PPC_DTPREL16_HA,
756          16,                    /* rightshift */
757          1,                     /* size (0 = byte, 1 = short, 2 = long) */
758          16,                    /* bitsize */
759          FALSE,                 /* pc_relative */
760          0,                     /* bitpos */
761          complain_overflow_dont, /* complain_on_overflow */
762          ppc_elf_unhandled_reloc, /* special_function */
763          "R_PPC_DTPREL16_HA",   /* name */
764          FALSE,                 /* partial_inplace */
765          0,                     /* src_mask */
766          0xffff,                /* dst_mask */
767          FALSE),                /* pcrel_offset */
768
769   /* Computes a tp-relative displacement, the difference between the value of
770      sym+add and the value of the thread pointer (r13).  */
771   HOWTO (R_PPC_TPREL32,
772          0,                     /* rightshift */
773          2,                     /* size (0 = byte, 1 = short, 2 = long) */
774          32,                    /* bitsize */
775          FALSE,                 /* pc_relative */
776          0,                     /* bitpos */
777          complain_overflow_dont, /* complain_on_overflow */
778          ppc_elf_unhandled_reloc, /* special_function */
779          "R_PPC_TPREL32",       /* name */
780          FALSE,                 /* partial_inplace */
781          0,                     /* src_mask */
782          0xffffffff,            /* dst_mask */
783          FALSE),                /* pcrel_offset */
784
785   /* A 16 bit tprel reloc.  */
786   HOWTO (R_PPC_TPREL16,
787          0,                     /* rightshift */
788          1,                     /* size (0 = byte, 1 = short, 2 = long) */
789          16,                    /* bitsize */
790          FALSE,                 /* pc_relative */
791          0,                     /* bitpos */
792          complain_overflow_signed, /* complain_on_overflow */
793          ppc_elf_unhandled_reloc, /* special_function */
794          "R_PPC_TPREL16",       /* name */
795          FALSE,                 /* partial_inplace */
796          0,                     /* src_mask */
797          0xffff,                /* dst_mask */
798          FALSE),                /* pcrel_offset */
799
800   /* Like TPREL16, but no overflow.  */
801   HOWTO (R_PPC_TPREL16_LO,
802          0,                     /* rightshift */
803          1,                     /* size (0 = byte, 1 = short, 2 = long) */
804          16,                    /* bitsize */
805          FALSE,                 /* pc_relative */
806          0,                     /* bitpos */
807          complain_overflow_dont, /* complain_on_overflow */
808          ppc_elf_unhandled_reloc, /* special_function */
809          "R_PPC_TPREL16_LO",    /* name */
810          FALSE,                 /* partial_inplace */
811          0,                     /* src_mask */
812          0xffff,                /* dst_mask */
813          FALSE),                /* pcrel_offset */
814
815   /* Like TPREL16_LO, but next higher group of 16 bits.  */
816   HOWTO (R_PPC_TPREL16_HI,
817          16,                    /* rightshift */
818          1,                     /* size (0 = byte, 1 = short, 2 = long) */
819          16,                    /* bitsize */
820          FALSE,                 /* pc_relative */
821          0,                     /* bitpos */
822          complain_overflow_dont, /* complain_on_overflow */
823          ppc_elf_unhandled_reloc, /* special_function */
824          "R_PPC_TPREL16_HI",    /* name */
825          FALSE,                 /* partial_inplace */
826          0,                     /* src_mask */
827          0xffff,                /* dst_mask */
828          FALSE),                /* pcrel_offset */
829
830   /* Like TPREL16_HI, but adjust for low 16 bits.  */
831   HOWTO (R_PPC_TPREL16_HA,
832          16,                    /* rightshift */
833          1,                     /* size (0 = byte, 1 = short, 2 = long) */
834          16,                    /* bitsize */
835          FALSE,                 /* pc_relative */
836          0,                     /* bitpos */
837          complain_overflow_dont, /* complain_on_overflow */
838          ppc_elf_unhandled_reloc, /* special_function */
839          "R_PPC_TPREL16_HA",    /* name */
840          FALSE,                 /* partial_inplace */
841          0,                     /* src_mask */
842          0xffff,                /* dst_mask */
843          FALSE),                /* pcrel_offset */
844
845   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
846      with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
847      to the first entry.  */
848   HOWTO (R_PPC_GOT_TLSGD16,
849          0,                     /* rightshift */
850          1,                     /* size (0 = byte, 1 = short, 2 = long) */
851          16,                    /* bitsize */
852          FALSE,                 /* pc_relative */
853          0,                     /* bitpos */
854          complain_overflow_signed, /* complain_on_overflow */
855          ppc_elf_unhandled_reloc, /* special_function */
856          "R_PPC_GOT_TLSGD16",   /* name */
857          FALSE,                 /* partial_inplace */
858          0,                     /* src_mask */
859          0xffff,                /* dst_mask */
860          FALSE),                /* pcrel_offset */
861
862   /* Like GOT_TLSGD16, but no overflow.  */
863   HOWTO (R_PPC_GOT_TLSGD16_LO,
864          0,                     /* rightshift */
865          1,                     /* size (0 = byte, 1 = short, 2 = long) */
866          16,                    /* bitsize */
867          FALSE,                 /* pc_relative */
868          0,                     /* bitpos */
869          complain_overflow_dont, /* complain_on_overflow */
870          ppc_elf_unhandled_reloc, /* special_function */
871          "R_PPC_GOT_TLSGD16_LO", /* name */
872          FALSE,                 /* partial_inplace */
873          0,                     /* src_mask */
874          0xffff,                /* dst_mask */
875          FALSE),                /* pcrel_offset */
876
877   /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
878   HOWTO (R_PPC_GOT_TLSGD16_HI,
879          16,                    /* rightshift */
880          1,                     /* size (0 = byte, 1 = short, 2 = long) */
881          16,                    /* bitsize */
882          FALSE,                 /* pc_relative */
883          0,                     /* bitpos */
884          complain_overflow_dont, /* complain_on_overflow */
885          ppc_elf_unhandled_reloc, /* special_function */
886          "R_PPC_GOT_TLSGD16_HI", /* name */
887          FALSE,                 /* partial_inplace */
888          0,                     /* src_mask */
889          0xffff,                /* dst_mask */
890          FALSE),                /* pcrel_offset */
891
892   /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
893   HOWTO (R_PPC_GOT_TLSGD16_HA,
894          16,                    /* rightshift */
895          1,                     /* size (0 = byte, 1 = short, 2 = long) */
896          16,                    /* bitsize */
897          FALSE,                 /* pc_relative */
898          0,                     /* bitpos */
899          complain_overflow_dont, /* complain_on_overflow */
900          ppc_elf_unhandled_reloc, /* special_function */
901          "R_PPC_GOT_TLSGD16_HA", /* name */
902          FALSE,                 /* partial_inplace */
903          0,                     /* src_mask */
904          0xffff,                /* dst_mask */
905          FALSE),                /* pcrel_offset */
906
907   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
908      with values (sym+add)@dtpmod and zero, and computes the offset to the
909      first entry.  */
910   HOWTO (R_PPC_GOT_TLSLD16,
911          0,                     /* rightshift */
912          1,                     /* size (0 = byte, 1 = short, 2 = long) */
913          16,                    /* bitsize */
914          FALSE,                 /* pc_relative */
915          0,                     /* bitpos */
916          complain_overflow_signed, /* complain_on_overflow */
917          ppc_elf_unhandled_reloc, /* special_function */
918          "R_PPC_GOT_TLSLD16",   /* name */
919          FALSE,                 /* partial_inplace */
920          0,                     /* src_mask */
921          0xffff,                /* dst_mask */
922          FALSE),                /* pcrel_offset */
923
924   /* Like GOT_TLSLD16, but no overflow.  */
925   HOWTO (R_PPC_GOT_TLSLD16_LO,
926          0,                     /* rightshift */
927          1,                     /* size (0 = byte, 1 = short, 2 = long) */
928          16,                    /* bitsize */
929          FALSE,                 /* pc_relative */
930          0,                     /* bitpos */
931          complain_overflow_dont, /* complain_on_overflow */
932          ppc_elf_unhandled_reloc, /* special_function */
933          "R_PPC_GOT_TLSLD16_LO", /* name */
934          FALSE,                 /* partial_inplace */
935          0,                     /* src_mask */
936          0xffff,                /* dst_mask */
937          FALSE),                /* pcrel_offset */
938
939   /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
940   HOWTO (R_PPC_GOT_TLSLD16_HI,
941          16,                    /* rightshift */
942          1,                     /* size (0 = byte, 1 = short, 2 = long) */
943          16,                    /* bitsize */
944          FALSE,                 /* pc_relative */
945          0,                     /* bitpos */
946          complain_overflow_dont, /* complain_on_overflow */
947          ppc_elf_unhandled_reloc, /* special_function */
948          "R_PPC_GOT_TLSLD16_HI", /* name */
949          FALSE,                 /* partial_inplace */
950          0,                     /* src_mask */
951          0xffff,                /* dst_mask */
952          FALSE),                /* pcrel_offset */
953
954   /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
955   HOWTO (R_PPC_GOT_TLSLD16_HA,
956          16,                    /* rightshift */
957          1,                     /* size (0 = byte, 1 = short, 2 = long) */
958          16,                    /* bitsize */
959          FALSE,                 /* pc_relative */
960          0,                     /* bitpos */
961          complain_overflow_dont, /* complain_on_overflow */
962          ppc_elf_unhandled_reloc, /* special_function */
963          "R_PPC_GOT_TLSLD16_HA", /* name */
964          FALSE,                 /* partial_inplace */
965          0,                     /* src_mask */
966          0xffff,                /* dst_mask */
967          FALSE),                /* pcrel_offset */
968
969   /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
970      the offset to the entry.  */
971   HOWTO (R_PPC_GOT_DTPREL16,
972          0,                     /* rightshift */
973          1,                     /* size (0 = byte, 1 = short, 2 = long) */
974          16,                    /* bitsize */
975          FALSE,                 /* pc_relative */
976          0,                     /* bitpos */
977          complain_overflow_signed, /* complain_on_overflow */
978          ppc_elf_unhandled_reloc, /* special_function */
979          "R_PPC_GOT_DTPREL16",  /* name */
980          FALSE,                 /* partial_inplace */
981          0,                     /* src_mask */
982          0xffff,                /* dst_mask */
983          FALSE),                /* pcrel_offset */
984
985   /* Like GOT_DTPREL16, but no overflow.  */
986   HOWTO (R_PPC_GOT_DTPREL16_LO,
987          0,                     /* rightshift */
988          1,                     /* size (0 = byte, 1 = short, 2 = long) */
989          16,                    /* bitsize */
990          FALSE,                 /* pc_relative */
991          0,                     /* bitpos */
992          complain_overflow_dont, /* complain_on_overflow */
993          ppc_elf_unhandled_reloc, /* special_function */
994          "R_PPC_GOT_DTPREL16_LO", /* name */
995          FALSE,                 /* partial_inplace */
996          0,                     /* src_mask */
997          0xffff,                /* dst_mask */
998          FALSE),                /* pcrel_offset */
999
1000   /* Like GOT_DTPREL16_LO, but next higher group of 16 bits.  */
1001   HOWTO (R_PPC_GOT_DTPREL16_HI,
1002          16,                    /* rightshift */
1003          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1004          16,                    /* bitsize */
1005          FALSE,                 /* pc_relative */
1006          0,                     /* bitpos */
1007          complain_overflow_dont, /* complain_on_overflow */
1008          ppc_elf_unhandled_reloc, /* special_function */
1009          "R_PPC_GOT_DTPREL16_HI", /* name */
1010          FALSE,                 /* partial_inplace */
1011          0,                     /* src_mask */
1012          0xffff,                /* dst_mask */
1013          FALSE),                /* pcrel_offset */
1014
1015   /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
1016   HOWTO (R_PPC_GOT_DTPREL16_HA,
1017          16,                    /* rightshift */
1018          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1019          16,                    /* bitsize */
1020          FALSE,                 /* pc_relative */
1021          0,                     /* bitpos */
1022          complain_overflow_dont, /* complain_on_overflow */
1023          ppc_elf_unhandled_reloc, /* special_function */
1024          "R_PPC_GOT_DTPREL16_HA", /* name */
1025          FALSE,                 /* partial_inplace */
1026          0,                     /* src_mask */
1027          0xffff,                /* dst_mask */
1028          FALSE),                /* pcrel_offset */
1029
1030   /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1031      offset to the entry.  */
1032   HOWTO (R_PPC_GOT_TPREL16,
1033          0,                     /* rightshift */
1034          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1035          16,                    /* bitsize */
1036          FALSE,                 /* pc_relative */
1037          0,                     /* bitpos */
1038          complain_overflow_signed, /* complain_on_overflow */
1039          ppc_elf_unhandled_reloc, /* special_function */
1040          "R_PPC_GOT_TPREL16",   /* name */
1041          FALSE,                 /* partial_inplace */
1042          0,                     /* src_mask */
1043          0xffff,                /* dst_mask */
1044          FALSE),                /* pcrel_offset */
1045
1046   /* Like GOT_TPREL16, but no overflow.  */
1047   HOWTO (R_PPC_GOT_TPREL16_LO,
1048          0,                     /* rightshift */
1049          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1050          16,                    /* bitsize */
1051          FALSE,                 /* pc_relative */
1052          0,                     /* bitpos */
1053          complain_overflow_dont, /* complain_on_overflow */
1054          ppc_elf_unhandled_reloc, /* special_function */
1055          "R_PPC_GOT_TPREL16_LO", /* name */
1056          FALSE,                 /* partial_inplace */
1057          0,                     /* src_mask */
1058          0xffff,                /* dst_mask */
1059          FALSE),                /* pcrel_offset */
1060
1061   /* Like GOT_TPREL16_LO, but next higher group of 16 bits.  */
1062   HOWTO (R_PPC_GOT_TPREL16_HI,
1063          16,                    /* rightshift */
1064          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1065          16,                    /* bitsize */
1066          FALSE,                 /* pc_relative */
1067          0,                     /* bitpos */
1068          complain_overflow_dont, /* complain_on_overflow */
1069          ppc_elf_unhandled_reloc, /* special_function */
1070          "R_PPC_GOT_TPREL16_HI", /* name */
1071          FALSE,                 /* partial_inplace */
1072          0,                     /* src_mask */
1073          0xffff,                /* dst_mask */
1074          FALSE),                /* pcrel_offset */
1075
1076   /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
1077   HOWTO (R_PPC_GOT_TPREL16_HA,
1078          16,                    /* rightshift */
1079          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1080          16,                    /* bitsize */
1081          FALSE,                 /* pc_relative */
1082          0,                     /* bitpos */
1083          complain_overflow_dont, /* complain_on_overflow */
1084          ppc_elf_unhandled_reloc, /* special_function */
1085          "R_PPC_GOT_TPREL16_HA", /* name */
1086          FALSE,                 /* partial_inplace */
1087          0,                     /* src_mask */
1088          0xffff,                /* dst_mask */
1089          FALSE),                /* pcrel_offset */
1090
1091   /* The remaining relocs are from the Embedded ELF ABI, and are not
1092      in the SVR4 ELF ABI.  */
1093
1094   /* 32 bit value resulting from the addend minus the symbol.  */
1095   HOWTO (R_PPC_EMB_NADDR32,     /* type */
1096          0,                     /* rightshift */
1097          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1098          32,                    /* bitsize */
1099          FALSE,                 /* pc_relative */
1100          0,                     /* bitpos */
1101          complain_overflow_bitfield, /* complain_on_overflow */
1102          bfd_elf_generic_reloc, /* special_function */
1103          "R_PPC_EMB_NADDR32",   /* name */
1104          FALSE,                 /* partial_inplace */
1105          0,                     /* src_mask */
1106          0xffffffff,            /* dst_mask */
1107          FALSE),                /* pcrel_offset */
1108
1109   /* 16 bit value resulting from the addend minus the symbol.  */
1110   HOWTO (R_PPC_EMB_NADDR16,     /* type */
1111          0,                     /* rightshift */
1112          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1113          16,                    /* bitsize */
1114          FALSE,                 /* pc_relative */
1115          0,                     /* bitpos */
1116          complain_overflow_bitfield, /* complain_on_overflow */
1117          bfd_elf_generic_reloc, /* special_function */
1118          "R_PPC_EMB_NADDR16",   /* name */
1119          FALSE,                 /* partial_inplace */
1120          0,                     /* src_mask */
1121          0xffff,                /* dst_mask */
1122          FALSE),                /* pcrel_offset */
1123
1124   /* 16 bit value resulting from the addend minus the symbol.  */
1125   HOWTO (R_PPC_EMB_NADDR16_LO,  /* type */
1126          0,                     /* rightshift */
1127          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1128          16,                    /* bitsize */
1129          FALSE,                 /* pc_relative */
1130          0,                     /* bitpos */
1131          complain_overflow_dont,/* complain_on_overflow */
1132          bfd_elf_generic_reloc, /* special_function */
1133          "R_PPC_EMB_ADDR16_LO", /* name */
1134          FALSE,                 /* partial_inplace */
1135          0,                     /* src_mask */
1136          0xffff,                /* dst_mask */
1137          FALSE),                /* pcrel_offset */
1138
1139   /* The high order 16 bits of the addend minus the symbol.  */
1140   HOWTO (R_PPC_EMB_NADDR16_HI,  /* type */
1141          16,                    /* rightshift */
1142          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1143          16,                    /* bitsize */
1144          FALSE,                 /* pc_relative */
1145          0,                     /* bitpos */
1146          complain_overflow_dont, /* complain_on_overflow */
1147          bfd_elf_generic_reloc, /* special_function */
1148          "R_PPC_EMB_NADDR16_HI", /* name */
1149          FALSE,                 /* partial_inplace */
1150          0,                     /* src_mask */
1151          0xffff,                /* dst_mask */
1152          FALSE),                /* pcrel_offset */
1153
1154   /* The high order 16 bits of the result of the addend minus the address,
1155      plus 1 if the contents of the low 16 bits, treated as a signed number,
1156      is negative.  */
1157   HOWTO (R_PPC_EMB_NADDR16_HA,  /* type */
1158          16,                    /* rightshift */
1159          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1160          16,                    /* bitsize */
1161          FALSE,                 /* pc_relative */
1162          0,                     /* bitpos */
1163          complain_overflow_dont, /* complain_on_overflow */
1164          ppc_elf_addr16_ha_reloc, /* special_function */
1165          "R_PPC_EMB_NADDR16_HA", /* name */
1166          FALSE,                 /* partial_inplace */
1167          0,                     /* src_mask */
1168          0xffff,                /* dst_mask */
1169          FALSE),                /* pcrel_offset */
1170
1171   /* 16 bit value resulting from allocating a 4 byte word to hold an
1172      address in the .sdata section, and returning the offset from
1173      _SDA_BASE_ for that relocation.  */
1174   HOWTO (R_PPC_EMB_SDAI16,      /* type */
1175          0,                     /* rightshift */
1176          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1177          16,                    /* bitsize */
1178          FALSE,                 /* pc_relative */
1179          0,                     /* bitpos */
1180          complain_overflow_bitfield, /* complain_on_overflow */
1181          bfd_elf_generic_reloc, /* special_function */
1182          "R_PPC_EMB_SDAI16",    /* name */
1183          FALSE,                 /* partial_inplace */
1184          0,                     /* src_mask */
1185          0xffff,                /* dst_mask */
1186          FALSE),                /* pcrel_offset */
1187
1188   /* 16 bit value resulting from allocating a 4 byte word to hold an
1189      address in the .sdata2 section, and returning the offset from
1190      _SDA2_BASE_ for that relocation.  */
1191   HOWTO (R_PPC_EMB_SDA2I16,     /* type */
1192          0,                     /* rightshift */
1193          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1194          16,                    /* bitsize */
1195          FALSE,                 /* pc_relative */
1196          0,                     /* bitpos */
1197          complain_overflow_bitfield, /* complain_on_overflow */
1198          bfd_elf_generic_reloc, /* special_function */
1199          "R_PPC_EMB_SDA2I16",   /* name */
1200          FALSE,                 /* partial_inplace */
1201          0,                     /* src_mask */
1202          0xffff,                /* dst_mask */
1203          FALSE),                /* pcrel_offset */
1204
1205   /* A sign-extended 16 bit value relative to _SDA2_BASE_, for use with
1206      small data items.   */
1207   HOWTO (R_PPC_EMB_SDA2REL,     /* type */
1208          0,                     /* rightshift */
1209          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1210          16,                    /* bitsize */
1211          FALSE,                 /* pc_relative */
1212          0,                     /* bitpos */
1213          complain_overflow_signed, /* complain_on_overflow */
1214          bfd_elf_generic_reloc, /* special_function */
1215          "R_PPC_EMB_SDA2REL",   /* name */
1216          FALSE,                 /* partial_inplace */
1217          0,                     /* src_mask */
1218          0xffff,                /* dst_mask */
1219          FALSE),                /* pcrel_offset */
1220
1221   /* Relocate against either _SDA_BASE_ or _SDA2_BASE_, filling in the 16 bit
1222      signed offset from the appropriate base, and filling in the register
1223      field with the appropriate register (0, 2, or 13).  */
1224   HOWTO (R_PPC_EMB_SDA21,       /* type */
1225          0,                     /* rightshift */
1226          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1227          16,                    /* bitsize */
1228          FALSE,                 /* pc_relative */
1229          0,                     /* bitpos */
1230          complain_overflow_signed, /* complain_on_overflow */
1231          bfd_elf_generic_reloc, /* special_function */
1232          "R_PPC_EMB_SDA21",     /* name */
1233          FALSE,                 /* partial_inplace */
1234          0,                     /* src_mask */
1235          0xffff,                /* dst_mask */
1236          FALSE),                /* pcrel_offset */
1237
1238   /* Relocation not handled: R_PPC_EMB_MRKREF */
1239   /* Relocation not handled: R_PPC_EMB_RELSEC16 */
1240   /* Relocation not handled: R_PPC_EMB_RELST_LO */
1241   /* Relocation not handled: R_PPC_EMB_RELST_HI */
1242   /* Relocation not handled: R_PPC_EMB_RELST_HA */
1243   /* Relocation not handled: R_PPC_EMB_BIT_FLD */
1244
1245   /* PC relative relocation against either _SDA_BASE_ or _SDA2_BASE_, filling
1246      in the 16 bit signed offset from the appropriate base, and filling in the
1247      register field with the appropriate register (0, 2, or 13).  */
1248   HOWTO (R_PPC_EMB_RELSDA,      /* type */
1249          0,                     /* rightshift */
1250          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1251          16,                    /* bitsize */
1252          TRUE,                  /* pc_relative */
1253          0,                     /* bitpos */
1254          complain_overflow_signed, /* complain_on_overflow */
1255          bfd_elf_generic_reloc, /* special_function */
1256          "R_PPC_EMB_RELSDA",    /* name */
1257          FALSE,                 /* partial_inplace */
1258          0,                     /* src_mask */
1259          0xffff,                /* dst_mask */
1260          FALSE),                /* pcrel_offset */
1261
1262   /* GNU extension to record C++ vtable hierarchy.  */
1263   HOWTO (R_PPC_GNU_VTINHERIT,   /* type */
1264          0,                     /* rightshift */
1265          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1266          0,                     /* bitsize */
1267          FALSE,                 /* pc_relative */
1268          0,                     /* bitpos */
1269          complain_overflow_dont, /* complain_on_overflow */
1270          NULL,                  /* special_function */
1271          "R_PPC_GNU_VTINHERIT", /* name */
1272          FALSE,                 /* partial_inplace */
1273          0,                     /* src_mask */
1274          0,                     /* dst_mask */
1275          FALSE),                /* pcrel_offset */
1276
1277   /* GNU extension to record C++ vtable member usage.  */
1278   HOWTO (R_PPC_GNU_VTENTRY,     /* type */
1279          0,                     /* rightshift */
1280          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1281          0,                     /* bitsize */
1282          FALSE,                 /* pc_relative */
1283          0,                     /* bitpos */
1284          complain_overflow_dont, /* complain_on_overflow */
1285          NULL,                  /* special_function */
1286          "R_PPC_GNU_VTENTRY",   /* name */
1287          FALSE,                 /* partial_inplace */
1288          0,                     /* src_mask */
1289          0,                     /* dst_mask */
1290          FALSE),                /* pcrel_offset */
1291
1292   /* Phony reloc to handle AIX style TOC entries.  */
1293   HOWTO (R_PPC_TOC16,           /* type */
1294          0,                     /* rightshift */
1295          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1296          16,                    /* bitsize */
1297          FALSE,                 /* pc_relative */
1298          0,                     /* bitpos */
1299          complain_overflow_signed, /* complain_on_overflow */
1300          bfd_elf_generic_reloc, /* special_function */
1301          "R_PPC_TOC16",         /* name */
1302          FALSE,                 /* partial_inplace */
1303          0,                     /* src_mask */
1304          0xffff,                /* dst_mask */
1305          FALSE),                /* pcrel_offset */
1306 };
1307 \f
1308 /* Initialize the ppc_elf_howto_table, so that linear accesses can be done.  */
1309
1310 static void
1311 ppc_elf_howto_init (void)
1312 {
1313   unsigned int i, type;
1314
1315   for (i = 0;
1316        i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
1317        i++)
1318     {
1319       type = ppc_elf_howto_raw[i].type;
1320       if (type >= (sizeof (ppc_elf_howto_table)
1321                    / sizeof (ppc_elf_howto_table[0])))
1322         abort ();
1323       ppc_elf_howto_table[type] = &ppc_elf_howto_raw[i];
1324     }
1325 }
1326
1327 static reloc_howto_type *
1328 ppc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1329                            bfd_reloc_code_real_type code)
1330 {
1331   enum elf_ppc_reloc_type r;
1332
1333   /* Initialize howto table if not already done.  */
1334   if (!ppc_elf_howto_table[R_PPC_ADDR32])
1335     ppc_elf_howto_init ();
1336
1337   switch (code)
1338     {
1339     default:
1340       return NULL;
1341
1342     case BFD_RELOC_NONE:                r = R_PPC_NONE;                 break;
1343     case BFD_RELOC_32:                  r = R_PPC_ADDR32;               break;
1344     case BFD_RELOC_PPC_BA26:            r = R_PPC_ADDR24;               break;
1345     case BFD_RELOC_16:                  r = R_PPC_ADDR16;               break;
1346     case BFD_RELOC_LO16:                r = R_PPC_ADDR16_LO;            break;
1347     case BFD_RELOC_HI16:                r = R_PPC_ADDR16_HI;            break;
1348     case BFD_RELOC_HI16_S:              r = R_PPC_ADDR16_HA;            break;
1349     case BFD_RELOC_PPC_BA16:            r = R_PPC_ADDR14;               break;
1350     case BFD_RELOC_PPC_BA16_BRTAKEN:    r = R_PPC_ADDR14_BRTAKEN;       break;
1351     case BFD_RELOC_PPC_BA16_BRNTAKEN:   r = R_PPC_ADDR14_BRNTAKEN;      break;
1352     case BFD_RELOC_PPC_B26:             r = R_PPC_REL24;                break;
1353     case BFD_RELOC_PPC_B16:             r = R_PPC_REL14;                break;
1354     case BFD_RELOC_PPC_B16_BRTAKEN:     r = R_PPC_REL14_BRTAKEN;        break;
1355     case BFD_RELOC_PPC_B16_BRNTAKEN:    r = R_PPC_REL14_BRNTAKEN;       break;
1356     case BFD_RELOC_16_GOTOFF:           r = R_PPC_GOT16;                break;
1357     case BFD_RELOC_LO16_GOTOFF:         r = R_PPC_GOT16_LO;             break;
1358     case BFD_RELOC_HI16_GOTOFF:         r = R_PPC_GOT16_HI;             break;
1359     case BFD_RELOC_HI16_S_GOTOFF:       r = R_PPC_GOT16_HA;             break;
1360     case BFD_RELOC_24_PLT_PCREL:        r = R_PPC_PLTREL24;             break;
1361     case BFD_RELOC_PPC_COPY:            r = R_PPC_COPY;                 break;
1362     case BFD_RELOC_PPC_GLOB_DAT:        r = R_PPC_GLOB_DAT;             break;
1363     case BFD_RELOC_PPC_LOCAL24PC:       r = R_PPC_LOCAL24PC;            break;
1364     case BFD_RELOC_32_PCREL:            r = R_PPC_REL32;                break;
1365     case BFD_RELOC_32_PLTOFF:           r = R_PPC_PLT32;                break;
1366     case BFD_RELOC_32_PLT_PCREL:        r = R_PPC_PLTREL32;             break;
1367     case BFD_RELOC_LO16_PLTOFF:         r = R_PPC_PLT16_LO;             break;
1368     case BFD_RELOC_HI16_PLTOFF:         r = R_PPC_PLT16_HI;             break;
1369     case BFD_RELOC_HI16_S_PLTOFF:       r = R_PPC_PLT16_HA;             break;
1370     case BFD_RELOC_GPREL16:             r = R_PPC_SDAREL16;             break;
1371     case BFD_RELOC_16_BASEREL:          r = R_PPC_SECTOFF;              break;
1372     case BFD_RELOC_LO16_BASEREL:        r = R_PPC_SECTOFF_LO;           break;
1373     case BFD_RELOC_HI16_BASEREL:        r = R_PPC_SECTOFF_HI;           break;
1374     case BFD_RELOC_HI16_S_BASEREL:      r = R_PPC_SECTOFF_HA;           break;
1375     case BFD_RELOC_CTOR:                r = R_PPC_ADDR32;               break;
1376     case BFD_RELOC_PPC_TOC16:           r = R_PPC_TOC16;                break;
1377     case BFD_RELOC_PPC_TLS:             r = R_PPC_TLS;                  break;
1378     case BFD_RELOC_PPC_DTPMOD:          r = R_PPC_DTPMOD32;             break;
1379     case BFD_RELOC_PPC_TPREL16:         r = R_PPC_TPREL16;              break;
1380     case BFD_RELOC_PPC_TPREL16_LO:      r = R_PPC_TPREL16_LO;           break;
1381     case BFD_RELOC_PPC_TPREL16_HI:      r = R_PPC_TPREL16_HI;           break;
1382     case BFD_RELOC_PPC_TPREL16_HA:      r = R_PPC_TPREL16_HA;           break;
1383     case BFD_RELOC_PPC_TPREL:           r = R_PPC_TPREL32;              break;
1384     case BFD_RELOC_PPC_DTPREL16:        r = R_PPC_DTPREL16;             break;
1385     case BFD_RELOC_PPC_DTPREL16_LO:     r = R_PPC_DTPREL16_LO;          break;
1386     case BFD_RELOC_PPC_DTPREL16_HI:     r = R_PPC_DTPREL16_HI;          break;
1387     case BFD_RELOC_PPC_DTPREL16_HA:     r = R_PPC_DTPREL16_HA;          break;
1388     case BFD_RELOC_PPC_DTPREL:          r = R_PPC_DTPREL32;             break;
1389     case BFD_RELOC_PPC_GOT_TLSGD16:     r = R_PPC_GOT_TLSGD16;          break;
1390     case BFD_RELOC_PPC_GOT_TLSGD16_LO:  r = R_PPC_GOT_TLSGD16_LO;       break;
1391     case BFD_RELOC_PPC_GOT_TLSGD16_HI:  r = R_PPC_GOT_TLSGD16_HI;       break;
1392     case BFD_RELOC_PPC_GOT_TLSGD16_HA:  r = R_PPC_GOT_TLSGD16_HA;       break;
1393     case BFD_RELOC_PPC_GOT_TLSLD16:     r = R_PPC_GOT_TLSLD16;          break;
1394     case BFD_RELOC_PPC_GOT_TLSLD16_LO:  r = R_PPC_GOT_TLSLD16_LO;       break;
1395     case BFD_RELOC_PPC_GOT_TLSLD16_HI:  r = R_PPC_GOT_TLSLD16_HI;       break;
1396     case BFD_RELOC_PPC_GOT_TLSLD16_HA:  r = R_PPC_GOT_TLSLD16_HA;       break;
1397     case BFD_RELOC_PPC_GOT_TPREL16:     r = R_PPC_GOT_TPREL16;          break;
1398     case BFD_RELOC_PPC_GOT_TPREL16_LO:  r = R_PPC_GOT_TPREL16_LO;       break;
1399     case BFD_RELOC_PPC_GOT_TPREL16_HI:  r = R_PPC_GOT_TPREL16_HI;       break;
1400     case BFD_RELOC_PPC_GOT_TPREL16_HA:  r = R_PPC_GOT_TPREL16_HA;       break;
1401     case BFD_RELOC_PPC_GOT_DTPREL16:    r = R_PPC_GOT_DTPREL16;         break;
1402     case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC_GOT_DTPREL16_LO;      break;
1403     case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC_GOT_DTPREL16_HI;      break;
1404     case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC_GOT_DTPREL16_HA;      break;
1405     case BFD_RELOC_PPC_EMB_NADDR32:     r = R_PPC_EMB_NADDR32;          break;
1406     case BFD_RELOC_PPC_EMB_NADDR16:     r = R_PPC_EMB_NADDR16;          break;
1407     case BFD_RELOC_PPC_EMB_NADDR16_LO:  r = R_PPC_EMB_NADDR16_LO;       break;
1408     case BFD_RELOC_PPC_EMB_NADDR16_HI:  r = R_PPC_EMB_NADDR16_HI;       break;
1409     case BFD_RELOC_PPC_EMB_NADDR16_HA:  r = R_PPC_EMB_NADDR16_HA;       break;
1410     case BFD_RELOC_PPC_EMB_SDAI16:      r = R_PPC_EMB_SDAI16;           break;
1411     case BFD_RELOC_PPC_EMB_SDA2I16:     r = R_PPC_EMB_SDA2I16;          break;
1412     case BFD_RELOC_PPC_EMB_SDA2REL:     r = R_PPC_EMB_SDA2REL;          break;
1413     case BFD_RELOC_PPC_EMB_SDA21:       r = R_PPC_EMB_SDA21;            break;
1414     case BFD_RELOC_PPC_EMB_MRKREF:      r = R_PPC_EMB_MRKREF;           break;
1415     case BFD_RELOC_PPC_EMB_RELSEC16:    r = R_PPC_EMB_RELSEC16;         break;
1416     case BFD_RELOC_PPC_EMB_RELST_LO:    r = R_PPC_EMB_RELST_LO;         break;
1417     case BFD_RELOC_PPC_EMB_RELST_HI:    r = R_PPC_EMB_RELST_HI;         break;
1418     case BFD_RELOC_PPC_EMB_RELST_HA:    r = R_PPC_EMB_RELST_HA;         break;
1419     case BFD_RELOC_PPC_EMB_BIT_FLD:     r = R_PPC_EMB_BIT_FLD;          break;
1420     case BFD_RELOC_PPC_EMB_RELSDA:      r = R_PPC_EMB_RELSDA;           break;
1421     case BFD_RELOC_VTABLE_INHERIT:      r = R_PPC_GNU_VTINHERIT;        break;
1422     case BFD_RELOC_VTABLE_ENTRY:        r = R_PPC_GNU_VTENTRY;          break;
1423     }
1424
1425   return ppc_elf_howto_table[r];
1426 };
1427
1428 /* Set the howto pointer for a PowerPC ELF reloc.  */
1429
1430 static void
1431 ppc_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
1432                        arelent *cache_ptr,
1433                        Elf_Internal_Rela *dst)
1434 {
1435   /* Initialize howto table if not already done.  */
1436   if (!ppc_elf_howto_table[R_PPC_ADDR32])
1437     ppc_elf_howto_init ();
1438
1439   BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_PPC_max);
1440   cache_ptr->howto = ppc_elf_howto_table[ELF32_R_TYPE (dst->r_info)];
1441 }
1442
1443 /* Handle the R_PPC_ADDR16_HA reloc.  */
1444
1445 static bfd_reloc_status_type
1446 ppc_elf_addr16_ha_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1447                          arelent *reloc_entry,
1448                          asymbol *symbol,
1449                          void *data ATTRIBUTE_UNUSED,
1450                          asection *input_section,
1451                          bfd *output_bfd,
1452                          char **error_message ATTRIBUTE_UNUSED)
1453 {
1454   bfd_vma relocation;
1455
1456   if (output_bfd != NULL)
1457     {
1458       reloc_entry->address += input_section->output_offset;
1459       return bfd_reloc_ok;
1460     }
1461
1462   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1463     return bfd_reloc_outofrange;
1464
1465   if (bfd_is_com_section (symbol->section))
1466     relocation = 0;
1467   else
1468     relocation = symbol->value;
1469
1470   relocation += symbol->section->output_section->vma;
1471   relocation += symbol->section->output_offset;
1472   relocation += reloc_entry->addend;
1473
1474   reloc_entry->addend += (relocation & 0x8000) << 1;
1475
1476   return bfd_reloc_continue;
1477 }
1478
1479 static bfd_reloc_status_type
1480 ppc_elf_unhandled_reloc (bfd *abfd,
1481                          arelent *reloc_entry,
1482                          asymbol *symbol,
1483                          void *data,
1484                          asection *input_section,
1485                          bfd *output_bfd,
1486                          char **error_message)
1487 {
1488   /* If this is a relocatable link (output_bfd test tells us), just
1489      call the generic function.  Any adjustment will be done at final
1490      link time.  */
1491   if (output_bfd != NULL)
1492     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1493                                   input_section, output_bfd, error_message);
1494
1495   if (error_message != NULL)
1496     {
1497       static char buf[60];
1498       sprintf (buf, _("generic linker can't handle %s"),
1499                reloc_entry->howto->name);
1500       *error_message = buf;
1501     }
1502   return bfd_reloc_dangerous;
1503 }
1504 \f
1505 /* Sections created by the linker.  */
1506
1507 typedef struct elf_linker_section
1508 {
1509   /* Pointer to the bfd section.  */
1510   asection *section;
1511   /* Section name.  */
1512   const char *name;
1513   /* Associated bss section name.  */
1514   const char *bss_name;
1515   /* Associated symbol name.  */
1516   const char *sym_name;
1517   /* Value of symbol.  */
1518   bfd_vma sym_val;
1519 } elf_linker_section_t;
1520
1521 /* Linked list of allocated pointer entries.  This hangs off of the
1522    symbol lists, and provides allows us to return different pointers,
1523    based on different addend's.  */
1524
1525 typedef struct elf_linker_section_pointers
1526 {
1527   /* next allocated pointer for this symbol */
1528   struct elf_linker_section_pointers *next;
1529   /* offset of pointer from beginning of section */
1530   bfd_vma offset;
1531   /* addend used */
1532   bfd_vma addend;
1533   /* which linker section this is */
1534   elf_linker_section_t *lsect;
1535 } elf_linker_section_pointers_t;
1536
1537 struct ppc_elf_obj_tdata
1538 {
1539   struct elf_obj_tdata elf;
1540
1541   /* A mapping from local symbols to offsets into the various linker
1542      sections added.  This is index by the symbol index.  */
1543   elf_linker_section_pointers_t **linker_section_pointers;
1544 };
1545
1546 #define ppc_elf_tdata(bfd) \
1547   ((struct ppc_elf_obj_tdata *) (bfd)->tdata.any)
1548
1549 #define elf_local_ptr_offsets(bfd) \
1550   (ppc_elf_tdata (bfd)->linker_section_pointers)
1551
1552 /* Override the generic function because we store some extras.  */
1553
1554 static bfd_boolean
1555 ppc_elf_mkobject (bfd *abfd)
1556 {
1557   bfd_size_type amt = sizeof (struct ppc_elf_obj_tdata);
1558   abfd->tdata.any = bfd_zalloc (abfd, amt);
1559   if (abfd->tdata.any == NULL)
1560     return FALSE;
1561   return TRUE;
1562 }
1563
1564 /* Fix bad default arch selected for a 32 bit input bfd when the
1565    default is 64 bit.  */
1566
1567 static bfd_boolean
1568 ppc_elf_object_p (bfd *abfd)
1569 {
1570   if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 64)
1571     {
1572       Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
1573
1574       if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS32)
1575         {
1576           /* Relies on arch after 64 bit default being 32 bit default.  */
1577           abfd->arch_info = abfd->arch_info->next;
1578           BFD_ASSERT (abfd->arch_info->bits_per_word == 32);
1579         }
1580     }
1581   return TRUE;
1582 }
1583
1584 /* Function to set whether a module needs the -mrelocatable bit set.  */
1585
1586 static bfd_boolean
1587 ppc_elf_set_private_flags (bfd *abfd, flagword flags)
1588 {
1589   BFD_ASSERT (!elf_flags_init (abfd)
1590               || elf_elfheader (abfd)->e_flags == flags);
1591
1592   elf_elfheader (abfd)->e_flags = flags;
1593   elf_flags_init (abfd) = TRUE;
1594   return TRUE;
1595 }
1596
1597 /* Support for core dump NOTE sections.  */
1598
1599 static bfd_boolean
1600 ppc_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1601 {
1602   int offset;
1603   unsigned int size;
1604
1605   switch (note->descsz)
1606     {
1607     default:
1608       return FALSE;
1609
1610     case 268:           /* Linux/PPC.  */
1611       /* pr_cursig */
1612       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1613
1614       /* pr_pid */
1615       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1616
1617       /* pr_reg */
1618       offset = 72;
1619       size = 192;
1620
1621       break;
1622     }
1623
1624   /* Make a ".reg/999" section.  */
1625   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1626                                           size, note->descpos + offset);
1627 }
1628
1629 static bfd_boolean
1630 ppc_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1631 {
1632   switch (note->descsz)
1633     {
1634     default:
1635       return FALSE;
1636
1637     case 128:           /* Linux/PPC elf_prpsinfo.  */
1638       elf_tdata (abfd)->core_program
1639         = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
1640       elf_tdata (abfd)->core_command
1641         = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
1642     }
1643
1644   /* Note that for some reason, a spurious space is tacked
1645      onto the end of the args in some (at least one anyway)
1646      implementations, so strip it off if it exists.  */
1647
1648   {
1649     char *command = elf_tdata (abfd)->core_command;
1650     int n = strlen (command);
1651
1652     if (0 < n && command[n - 1] == ' ')
1653       command[n - 1] = '\0';
1654   }
1655
1656   return TRUE;
1657 }
1658
1659 /* Return address for Ith PLT stub in section PLT, for relocation REL
1660    or (bfd_vma) -1 if it should not be included.  */
1661
1662 static bfd_vma
1663 ppc_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED,
1664                      const asection *plt ATTRIBUTE_UNUSED,
1665                      const arelent *rel)
1666 {
1667   return rel->address;
1668 }
1669
1670 /* Handle a PowerPC specific section when reading an object file.  This
1671    is called when bfd_section_from_shdr finds a section with an unknown
1672    type.  */
1673
1674 static bfd_boolean
1675 ppc_elf_section_from_shdr (bfd *abfd,
1676                            Elf_Internal_Shdr *hdr,
1677                            const char *name,
1678                            int shindex)
1679 {
1680   asection *newsect;
1681   flagword flags;
1682
1683   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
1684     return FALSE;
1685
1686   newsect = hdr->bfd_section;
1687   flags = bfd_get_section_flags (abfd, newsect);
1688   if (hdr->sh_flags & SHF_EXCLUDE)
1689     flags |= SEC_EXCLUDE;
1690
1691   if (hdr->sh_type == SHT_ORDERED)
1692     flags |= SEC_SORT_ENTRIES;
1693
1694   bfd_set_section_flags (abfd, newsect, flags);
1695   return TRUE;
1696 }
1697
1698 /* Set up any other section flags and such that may be necessary.  */
1699
1700 static bfd_boolean
1701 ppc_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
1702                        Elf_Internal_Shdr *shdr,
1703                        asection *asect)
1704 {
1705   if ((asect->flags & SEC_EXCLUDE) != 0)
1706     shdr->sh_flags |= SHF_EXCLUDE;
1707
1708   if ((asect->flags & SEC_SORT_ENTRIES) != 0)
1709     shdr->sh_type = SHT_ORDERED;
1710
1711   return TRUE;
1712 }
1713
1714 /* If we have .sbss2 or .PPC.EMB.sbss0 output sections, we
1715    need to bump up the number of section headers.  */
1716
1717 static int
1718 ppc_elf_additional_program_headers (bfd *abfd)
1719 {
1720   asection *s;
1721   int ret = 0;
1722
1723   s = bfd_get_section_by_name (abfd, ".sbss2");
1724   if (s != NULL && (s->flags & SEC_ALLOC) != 0)
1725     ++ret;
1726
1727   s = bfd_get_section_by_name (abfd, ".PPC.EMB.sbss0");
1728   if (s != NULL && (s->flags & SEC_ALLOC) != 0)
1729     ++ret;
1730
1731   return ret;
1732 }
1733
1734 /* Add extra PPC sections -- Note, for now, make .sbss2 and
1735    .PPC.EMB.sbss0 a normal section, and not a bss section so
1736    that the linker doesn't crater when trying to make more than
1737    2 sections.  */
1738
1739 static struct bfd_elf_special_section const
1740   ppc_special_sections_p[] =
1741 {
1742   { ".plt",              4,  0, SHT_NOBITS,   SHF_ALLOC + SHF_EXECINSTR },
1743   { NULL,                0,  0, 0,            0 }
1744 };
1745
1746 static struct bfd_elf_special_section const
1747   ppc_special_sections_s[] =
1748 {
1749   { ".sdata",            6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
1750   { ".sbss",             5, -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
1751   { ".sdata2",           7, -2, SHT_PROGBITS, SHF_ALLOC },
1752   { ".sbss2",            6, -2, SHT_PROGBITS, SHF_ALLOC },
1753   { NULL,        0, 0, 0,            0 }
1754 };
1755
1756 static struct bfd_elf_special_section const
1757   ppc_special_sections_t[] =
1758 {
1759   { ".tags",             5,  0, SHT_ORDERED,  SHF_ALLOC },
1760   { NULL,        0, 0, 0,            0 }
1761 };
1762
1763 static struct bfd_elf_special_section const
1764   ppc_special_sections_other[]=
1765 {
1766   { ".PPC.EMB.apuinfo", 16,  0, SHT_NOTE,     0 },
1767   { ".PPC.EMB.sdata0",  15,  0, SHT_PROGBITS, SHF_ALLOC },
1768   { ".PPC.EMB.sbss0",   14,  0, SHT_PROGBITS, SHF_ALLOC },
1769   { NULL,        0, 0, 0,            0 }
1770 };
1771
1772 static struct bfd_elf_special_section const *
1773   ppc_elf_special_sections[27]=
1774 {
1775   NULL,                         /* 'a' */
1776   NULL,                         /* 'b' */
1777   NULL,                         /* 'c' */
1778   NULL,                         /* 'd' */
1779   NULL,                         /* 'e' */
1780   NULL,                         /* 'f' */
1781   NULL,                         /* 'g' */
1782   NULL,                         /* 'h' */
1783   NULL,                         /* 'i' */
1784   NULL,                         /* 'j' */
1785   NULL,                         /* 'k' */
1786   NULL,                         /* 'l' */
1787   NULL,                         /* 'm' */
1788   NULL,                         /* 'n' */
1789   NULL,                         /* 'o' */
1790   ppc_special_sections_p,       /* 'p' */
1791   NULL,                         /* 'q' */
1792   NULL,                         /* 'r' */
1793   ppc_special_sections_s,       /* 's' */
1794   ppc_special_sections_t,       /* 's' */
1795   NULL,                         /* 'u' */
1796   NULL,                         /* 'v' */
1797   NULL,                         /* 'w' */
1798   NULL,                         /* 'x' */
1799   NULL,                         /* 'y' */
1800   NULL,                         /* 'z' */
1801   ppc_special_sections_other,   /* other */
1802 };
1803 \f
1804 /* Very simple linked list structure for recording apuinfo values.  */
1805 typedef struct apuinfo_list
1806 {
1807   struct apuinfo_list *next;
1808   unsigned long value;
1809 }
1810 apuinfo_list;
1811
1812 static apuinfo_list *head;
1813
1814
1815 static void
1816 apuinfo_list_init (void)
1817 {
1818   head = NULL;
1819 }
1820
1821 static void
1822 apuinfo_list_add (unsigned long value)
1823 {
1824   apuinfo_list *entry = head;
1825
1826   while (entry != NULL)
1827     {
1828       if (entry->value == value)
1829         return;
1830       entry = entry->next;
1831     }
1832
1833   entry = bfd_malloc (sizeof (* entry));
1834   if (entry == NULL)
1835     return;
1836
1837   entry->value = value;
1838   entry->next  = head;
1839   head = entry;
1840 }
1841
1842 static unsigned
1843 apuinfo_list_length (void)
1844 {
1845   apuinfo_list *entry;
1846   unsigned long count;
1847
1848   for (entry = head, count = 0;
1849        entry;
1850        entry = entry->next)
1851     ++ count;
1852
1853   return count;
1854 }
1855
1856 static inline unsigned long
1857 apuinfo_list_element (unsigned long number)
1858 {
1859   apuinfo_list * entry;
1860
1861   for (entry = head;
1862        entry && number --;
1863        entry = entry->next)
1864     ;
1865
1866   return entry ? entry->value : 0;
1867 }
1868
1869 static void
1870 apuinfo_list_finish (void)
1871 {
1872   apuinfo_list *entry;
1873
1874   for (entry = head; entry;)
1875     {
1876       apuinfo_list *next = entry->next;
1877       free (entry);
1878       entry = next;
1879     }
1880
1881   head = NULL;
1882 }
1883
1884 #define APUINFO_SECTION_NAME    ".PPC.EMB.apuinfo"
1885 #define APUINFO_LABEL           "APUinfo"
1886
1887 /* Scan the input BFDs and create a linked list of
1888    the APUinfo values that will need to be emitted.  */
1889
1890 static void
1891 ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
1892 {
1893   bfd *ibfd;
1894   asection *asec;
1895   char *buffer;
1896   unsigned num_input_sections;
1897   bfd_size_type output_section_size;
1898   unsigned i;
1899   unsigned num_entries;
1900   unsigned long offset;
1901   unsigned long length;
1902   const char *error_message = NULL;
1903
1904   if (link_info == NULL)
1905     return;
1906
1907   /* Scan the input bfds, looking for apuinfo sections.  */
1908   num_input_sections = 0;
1909   output_section_size = 0;
1910
1911   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
1912     {
1913       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
1914       if (asec)
1915         {
1916           ++ num_input_sections;
1917           output_section_size += asec->size;
1918         }
1919     }
1920
1921   /* We need at least one input sections
1922      in order to make merging worthwhile.  */
1923   if (num_input_sections < 1)
1924     return;
1925
1926   /* Just make sure that the output section exists as well.  */
1927   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
1928   if (asec == NULL)
1929     return;
1930
1931   /* Allocate a buffer for the contents of the input sections.  */
1932   buffer = bfd_malloc (output_section_size);
1933   if (buffer == NULL)
1934     return;
1935
1936   offset = 0;
1937   apuinfo_list_init ();
1938
1939   /* Read in the input sections contents.  */
1940   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
1941     {
1942       unsigned long datum;
1943       char *ptr;
1944
1945       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
1946       if (asec == NULL)
1947         continue;
1948
1949       length = asec->size;
1950       if (length < 24)
1951         {
1952           error_message = _("corrupt or empty %s section in %B");
1953           goto fail;
1954         }
1955
1956       if (bfd_seek (ibfd, asec->filepos, SEEK_SET) != 0
1957           || (bfd_bread (buffer + offset, length, ibfd) != length))
1958         {
1959           error_message = _("unable to read in %s section from %B");
1960           goto fail;
1961         }
1962
1963       /* Process the contents of the section.  */
1964       ptr = buffer + offset;
1965       error_message = _("corrupt %s section in %B");
1966
1967       /* Verify the contents of the header.  Note - we have to
1968          extract the values this way in order to allow for a
1969          host whose endian-ness is different from the target.  */
1970       datum = bfd_get_32 (ibfd, ptr);
1971       if (datum != sizeof APUINFO_LABEL)
1972         goto fail;
1973
1974       datum = bfd_get_32 (ibfd, ptr + 8);
1975       if (datum != 0x2)
1976         goto fail;
1977
1978       if (strcmp (ptr + 12, APUINFO_LABEL) != 0)
1979         goto fail;
1980
1981       /* Get the number of bytes used for apuinfo entries.  */
1982       datum = bfd_get_32 (ibfd, ptr + 4);
1983       if (datum + 20 != length)
1984         goto fail;
1985
1986       /* Make sure that we do not run off the end of the section.  */
1987       if (offset + length > output_section_size)
1988         goto fail;
1989
1990       /* Scan the apuinfo section, building a list of apuinfo numbers.  */
1991       for (i = 0; i < datum; i += 4)
1992         apuinfo_list_add (bfd_get_32 (ibfd, ptr + 20 + i));
1993
1994       /* Update the offset.  */
1995       offset += length;
1996     }
1997
1998   error_message = NULL;
1999
2000   /* Compute the size of the output section.  */
2001   num_entries = apuinfo_list_length ();
2002   output_section_size = 20 + num_entries * 4;
2003
2004   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
2005
2006   if (! bfd_set_section_size (abfd, asec, output_section_size))
2007     ibfd = abfd,
2008       error_message = _("warning: unable to set size of %s section in %B");
2009
2010  fail:
2011   free (buffer);
2012
2013   if (error_message)
2014     (*_bfd_error_handler) (error_message, ibfd, APUINFO_SECTION_NAME);
2015 }
2016
2017 /* Prevent the output section from accumulating the input sections'
2018    contents.  We have already stored this in our linked list structure.  */
2019
2020 static bfd_boolean
2021 ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED,
2022                        asection *asec,
2023                        bfd_byte *contents ATTRIBUTE_UNUSED)
2024 {
2025   return (apuinfo_list_length ()
2026           && strcmp (asec->name, APUINFO_SECTION_NAME) == 0);
2027 }
2028
2029 /* Finally we can generate the output section.  */
2030
2031 static void
2032 ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
2033 {
2034   bfd_byte *buffer;
2035   asection *asec;
2036   unsigned i;
2037   unsigned num_entries;
2038   bfd_size_type length;
2039
2040   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
2041   if (asec == NULL)
2042     return;
2043
2044   if (apuinfo_list_length () == 0)
2045     return;
2046
2047   length = asec->size;
2048   if (length < 20)
2049     return;
2050
2051   buffer = bfd_malloc (length);
2052   if (buffer == NULL)
2053     {
2054       (*_bfd_error_handler)
2055         (_("failed to allocate space for new APUinfo section."));
2056       return;
2057     }
2058
2059   /* Create the apuinfo header.  */
2060   num_entries = apuinfo_list_length ();
2061   bfd_put_32 (abfd, sizeof APUINFO_LABEL, buffer);
2062   bfd_put_32 (abfd, num_entries * 4, buffer + 4);
2063   bfd_put_32 (abfd, 0x2, buffer + 8);
2064   strcpy ((char *) buffer + 12, APUINFO_LABEL);
2065
2066   length = 20;
2067   for (i = 0; i < num_entries; i++)
2068     {
2069       bfd_put_32 (abfd, apuinfo_list_element (i), buffer + length);
2070       length += 4;
2071     }
2072
2073   if (length != asec->size)
2074     (*_bfd_error_handler) (_("failed to compute new APUinfo section."));
2075
2076   if (! bfd_set_section_contents (abfd, asec, buffer, (file_ptr) 0, length))
2077     (*_bfd_error_handler) (_("failed to install new APUinfo section."));
2078
2079   free (buffer);
2080
2081   apuinfo_list_finish ();
2082 }
2083 \f
2084 /* The following functions are specific to the ELF linker, while
2085    functions above are used generally.  They appear in this file more
2086    or less in the order in which they are called.  eg.
2087    ppc_elf_check_relocs is called early in the link process,
2088    ppc_elf_finish_dynamic_sections is one of the last functions
2089    called.  */
2090
2091 /* The PPC linker needs to keep track of the number of relocs that it
2092    decides to copy as dynamic relocs in check_relocs for each symbol.
2093    This is so that it can later discard them if they are found to be
2094    unnecessary.  We store the information in a field extending the
2095    regular ELF linker hash table.  */
2096
2097 struct ppc_elf_dyn_relocs
2098 {
2099   struct ppc_elf_dyn_relocs *next;
2100
2101   /* The input section of the reloc.  */
2102   asection *sec;
2103
2104   /* Total number of relocs copied for the input section.  */
2105   bfd_size_type count;
2106
2107   /* Number of pc-relative relocs copied for the input section.  */
2108   bfd_size_type pc_count;
2109 };
2110
2111 /* Of those relocs that might be copied as dynamic relocs, this macro
2112    selects those that must be copied when linking a shared library,
2113    even when the symbol is local.  */
2114
2115 #define MUST_BE_DYN_RELOC(RTYPE)                \
2116   ((RTYPE) != R_PPC_REL24                       \
2117    && (RTYPE) != R_PPC_REL14                    \
2118    && (RTYPE) != R_PPC_REL14_BRTAKEN            \
2119    && (RTYPE) != R_PPC_REL14_BRNTAKEN           \
2120    && (RTYPE) != R_PPC_REL32)
2121
2122 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
2123    copying dynamic variables from a shared lib into an app's dynbss
2124    section, and instead use a dynamic relocation to point into the
2125    shared lib.  */
2126 #define ELIMINATE_COPY_RELOCS 1
2127
2128 /* PPC ELF linker hash entry.  */
2129
2130 struct ppc_elf_link_hash_entry
2131 {
2132   struct elf_link_hash_entry elf;
2133
2134   /* If this symbol is used in the linker created sections, the processor
2135      specific backend uses this field to map the field into the offset
2136      from the beginning of the section.  */
2137   elf_linker_section_pointers_t *linker_section_pointer;
2138
2139   /* Track dynamic relocs copied for this symbol.  */
2140   struct ppc_elf_dyn_relocs *dyn_relocs;
2141
2142   /* Contexts in which symbol is used in the GOT (or TOC).
2143      TLS_GD .. TLS_TLS bits are or'd into the mask as the
2144      corresponding relocs are encountered during check_relocs.
2145      tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
2146      indicate the corresponding GOT entry type is not needed.  */
2147 #define TLS_GD           1      /* GD reloc. */
2148 #define TLS_LD           2      /* LD reloc. */
2149 #define TLS_TPREL        4      /* TPREL reloc, => IE. */
2150 #define TLS_DTPREL       8      /* DTPREL reloc, => LD. */
2151 #define TLS_TLS         16      /* Any TLS reloc.  */
2152 #define TLS_TPRELGD     32      /* TPREL reloc resulting from GD->IE. */
2153   char tls_mask;
2154 };
2155
2156 #define ppc_elf_hash_entry(ent) ((struct ppc_elf_link_hash_entry *) (ent))
2157
2158 /* PPC ELF linker hash table.  */
2159
2160 struct ppc_elf_link_hash_table
2161 {
2162   struct elf_link_hash_table elf;
2163
2164   /* Short-cuts to get to dynamic linker sections.  */
2165   asection *got;
2166   asection *relgot;
2167   asection *plt;
2168   asection *relplt;
2169   asection *dynbss;
2170   asection *relbss;
2171   asection *dynsbss;
2172   asection *relsbss;
2173   elf_linker_section_t sdata[2];
2174   asection *sbss;
2175
2176   /* Shortcut to .__tls_get_addr.  */
2177   struct elf_link_hash_entry *tls_get_addr;
2178
2179   /* TLS local dynamic got entry handling.  */
2180   union {
2181     bfd_signed_vma refcount;
2182     bfd_vma offset;
2183   } tlsld_got;
2184
2185   /* Size of reserved GOT entries.  */
2186   unsigned int got_header_size;
2187   /* Non-zero if allocating the header left a gap.  */
2188   unsigned int got_gap;
2189
2190   /* Small local sym to section mapping cache.  */
2191   struct sym_sec_cache sym_sec;
2192 };
2193
2194 /* Get the PPC ELF linker hash table from a link_info structure.  */
2195
2196 #define ppc_elf_hash_table(p) \
2197   ((struct ppc_elf_link_hash_table *) (p)->hash)
2198
2199 /* Create an entry in a PPC ELF linker hash table.  */
2200
2201 static struct bfd_hash_entry *
2202 ppc_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
2203                            struct bfd_hash_table *table,
2204                            const char *string)
2205 {
2206   /* Allocate the structure if it has not already been allocated by a
2207      subclass.  */
2208   if (entry == NULL)
2209     {
2210       entry = bfd_hash_allocate (table,
2211                                  sizeof (struct ppc_elf_link_hash_entry));
2212       if (entry == NULL)
2213         return entry;
2214     }
2215
2216   /* Call the allocation method of the superclass.  */
2217   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
2218   if (entry != NULL)
2219     {
2220       ppc_elf_hash_entry (entry)->linker_section_pointer = NULL;
2221       ppc_elf_hash_entry (entry)->dyn_relocs = NULL;
2222       ppc_elf_hash_entry (entry)->tls_mask = 0;
2223     }
2224
2225   return entry;
2226 }
2227
2228 /* Create a PPC ELF linker hash table.  */
2229
2230 static struct bfd_link_hash_table *
2231 ppc_elf_link_hash_table_create (bfd *abfd)
2232 {
2233   struct ppc_elf_link_hash_table *ret;
2234
2235   ret = bfd_zmalloc (sizeof (struct ppc_elf_link_hash_table));
2236   if (ret == NULL)
2237     return NULL;
2238
2239   if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd,
2240                                        ppc_elf_link_hash_newfunc))
2241     {
2242       free (ret);
2243       return NULL;
2244     }
2245
2246   ret->sdata[0].name = ".sdata";
2247   ret->sdata[0].sym_name = "_SDA_BASE_";
2248   ret->sdata[0].bss_name = ".sbss";
2249
2250   ret->sdata[1].name = ".sdata2";
2251   ret->sdata[1].sym_name = "_SDA2_BASE_";
2252   ret->sdata[1].bss_name = ".sbss2";
2253
2254   return &ret->elf.root;
2255 }
2256
2257 /* The powerpc .got has a blrl instruction in it.  Mark it executable.  */
2258
2259 static bfd_boolean
2260 ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
2261 {
2262   struct ppc_elf_link_hash_table *htab;
2263   asection *s;
2264   flagword flags;
2265
2266   if (!_bfd_elf_create_got_section (abfd, info))
2267     return FALSE;
2268
2269   htab = ppc_elf_hash_table (info);
2270   htab->got = s = bfd_get_section_by_name (abfd, ".got");
2271   if (s == NULL)
2272     abort ();
2273
2274   flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2275            | SEC_LINKER_CREATED);
2276   if (!bfd_set_section_flags (abfd, s, flags))
2277     return FALSE;
2278
2279   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2280            | SEC_LINKER_CREATED | SEC_READONLY);
2281   htab->relgot = bfd_make_section_with_flags (abfd, ".rela.got", flags);
2282   if (!htab->relgot
2283       || ! bfd_set_section_alignment (abfd, htab->relgot, 2))
2284     return FALSE;
2285
2286   return TRUE;
2287 }
2288
2289 /* We have to create .dynsbss and .rela.sbss here so that they get mapped
2290    to output sections (just like _bfd_elf_create_dynamic_sections has
2291    to create .dynbss and .rela.bss).  */
2292
2293 static bfd_boolean
2294 ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2295 {
2296   struct ppc_elf_link_hash_table *htab;
2297   asection *s;
2298   flagword flags;
2299
2300   htab = ppc_elf_hash_table (info);
2301
2302   if (htab->got == NULL
2303       && !ppc_elf_create_got (abfd, info))
2304     return FALSE;
2305
2306   if (!_bfd_elf_create_dynamic_sections (abfd, info))
2307     return FALSE;
2308
2309   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2310            | SEC_LINKER_CREATED);
2311
2312   htab->dynbss = bfd_get_section_by_name (abfd, ".dynbss");
2313   s = bfd_make_section_with_flags (abfd, ".dynsbss",
2314                                    SEC_ALLOC | SEC_LINKER_CREATED);
2315   htab->dynsbss = s;
2316   if (s == NULL)
2317     return FALSE;
2318
2319   if (! info->shared)
2320     {
2321       htab->relbss = bfd_get_section_by_name (abfd, ".rela.bss");
2322       s = bfd_make_section_with_flags (abfd, ".rela.sbss",
2323                                        flags | SEC_READONLY);
2324       htab->relsbss = s;
2325       if (s == NULL
2326           || ! bfd_set_section_alignment (abfd, s, 2))
2327         return FALSE;
2328     }
2329
2330   htab->relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2331   htab->plt = s = bfd_get_section_by_name (abfd, ".plt");
2332   if (s == NULL)
2333     abort ();
2334
2335   flags = SEC_ALLOC | SEC_CODE | SEC_LINKER_CREATED;
2336   return bfd_set_section_flags (abfd, s, flags);
2337 }
2338
2339 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
2340
2341 static void
2342 ppc_elf_copy_indirect_symbol (const struct elf_backend_data *bed,
2343                               struct elf_link_hash_entry *dir,
2344                               struct elf_link_hash_entry *ind)
2345 {
2346   struct ppc_elf_link_hash_entry *edir, *eind;
2347
2348   edir = (struct ppc_elf_link_hash_entry *) dir;
2349   eind = (struct ppc_elf_link_hash_entry *) ind;
2350
2351   if (eind->dyn_relocs != NULL)
2352     {
2353       if (edir->dyn_relocs != NULL)
2354         {
2355           struct ppc_elf_dyn_relocs **pp;
2356           struct ppc_elf_dyn_relocs *p;
2357
2358           if (ind->root.type == bfd_link_hash_indirect)
2359             abort ();
2360
2361           /* Add reloc counts against the weak sym to the strong sym
2362              list.  Merge any entries against the same section.  */
2363           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
2364             {
2365               struct ppc_elf_dyn_relocs *q;
2366
2367               for (q = edir->dyn_relocs; q != NULL; q = q->next)
2368                 if (q->sec == p->sec)
2369                   {
2370                     q->pc_count += p->pc_count;
2371                     q->count += p->count;
2372                     *pp = p->next;
2373                     break;
2374                   }
2375               if (q == NULL)
2376                 pp = &p->next;
2377             }
2378           *pp = edir->dyn_relocs;
2379         }
2380
2381       edir->dyn_relocs = eind->dyn_relocs;
2382       eind->dyn_relocs = NULL;
2383     }
2384
2385   edir->tls_mask |= eind->tls_mask;
2386
2387   if (ELIMINATE_COPY_RELOCS
2388       && ind->root.type != bfd_link_hash_indirect
2389       && dir->dynamic_adjusted)
2390     {
2391       /* If called to transfer flags for a weakdef during processing
2392          of elf_adjust_dynamic_symbol, don't copy non_got_ref.
2393          We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
2394       dir->ref_dynamic |= ind->ref_dynamic;
2395       dir->ref_regular |= ind->ref_regular;
2396       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
2397       dir->needs_plt |= ind->needs_plt;
2398     }
2399   else
2400     _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
2401 }
2402
2403 /* Return 1 if target is one of ours.  */
2404
2405 static bfd_boolean
2406 is_ppc_elf_target (const struct bfd_target *targ)
2407 {
2408   extern const bfd_target bfd_elf32_powerpc_vec;
2409   extern const bfd_target bfd_elf32_powerpcle_vec;
2410
2411   return targ == &bfd_elf32_powerpc_vec || targ == &bfd_elf32_powerpcle_vec;
2412 }
2413
2414 /* Hook called by the linker routine which adds symbols from an object
2415    file.  We use it to put .comm items in .sbss, and not .bss.  */
2416
2417 static bfd_boolean
2418 ppc_elf_add_symbol_hook (bfd *abfd,
2419                          struct bfd_link_info *info,
2420                          Elf_Internal_Sym *sym,
2421                          const char **namep ATTRIBUTE_UNUSED,
2422                          flagword *flagsp ATTRIBUTE_UNUSED,
2423                          asection **secp,
2424                          bfd_vma *valp)
2425 {
2426   if (sym->st_shndx == SHN_COMMON
2427       && !info->relocatable
2428       && sym->st_size <= elf_gp_size (abfd)
2429       && is_ppc_elf_target (info->hash->creator))
2430     {
2431       /* Common symbols less than or equal to -G nn bytes are automatically
2432          put into .sbss.  */
2433       struct ppc_elf_link_hash_table *htab;
2434
2435       htab = ppc_elf_hash_table (info);
2436       if (htab->sbss == NULL)
2437         {
2438           flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
2439
2440           if (!htab->elf.dynobj)
2441             htab->elf.dynobj = abfd;
2442
2443           htab->sbss = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2444                                                            ".sbss",
2445                                                            flags);
2446           if (htab->sbss == NULL)
2447             return FALSE;
2448         }
2449
2450       *secp = htab->sbss;
2451       *valp = sym->st_size;
2452     }
2453
2454   return TRUE;
2455 }
2456 \f
2457 /* Create a special linker section.  */
2458
2459 static bfd_boolean
2460 ppc_elf_create_linker_section (bfd *abfd,
2461                                struct bfd_link_info *info,
2462                                flagword flags,
2463                                elf_linker_section_t *lsect)
2464 {
2465   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
2466   asection *s;
2467
2468   flags |= (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2469             | SEC_LINKER_CREATED);
2470
2471   /* Record the first bfd that needs the special sections.  */
2472   if (!htab->elf.dynobj)
2473     htab->elf.dynobj = abfd;
2474
2475   s = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2476                                           lsect->name,
2477                                           flags);
2478   if (s == NULL
2479       || !bfd_set_section_alignment (htab->elf.dynobj, s, 2))
2480     return FALSE;
2481   lsect->section = s;
2482
2483   return TRUE;
2484 }
2485
2486 /* Find a linker generated pointer with a given addend and type.  */
2487
2488 static elf_linker_section_pointers_t *
2489 elf_find_pointer_linker_section
2490   (elf_linker_section_pointers_t *linker_pointers,
2491    bfd_vma addend,
2492    elf_linker_section_t *lsect)
2493 {
2494   for ( ; linker_pointers != NULL; linker_pointers = linker_pointers->next)
2495     if (lsect == linker_pointers->lsect && addend == linker_pointers->addend)
2496       return linker_pointers;
2497
2498   return NULL;
2499 }
2500
2501 /* Allocate a pointer to live in a linker created section.  */
2502
2503 static bfd_boolean
2504 elf_create_pointer_linker_section (bfd *abfd,
2505                                    elf_linker_section_t *lsect,
2506                                    struct elf_link_hash_entry *h,
2507                                    const Elf_Internal_Rela *rel)
2508 {
2509   elf_linker_section_pointers_t **ptr_linker_section_ptr = NULL;
2510   elf_linker_section_pointers_t *linker_section_ptr;
2511   unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
2512   bfd_size_type amt;
2513
2514   BFD_ASSERT (lsect != NULL);
2515
2516   /* Is this a global symbol?  */
2517   if (h != NULL)
2518     {
2519       struct ppc_elf_link_hash_entry *eh;
2520
2521       /* Has this symbol already been allocated?  If so, our work is done.  */
2522       eh = (struct ppc_elf_link_hash_entry *) h;
2523       if (elf_find_pointer_linker_section (eh->linker_section_pointer,
2524                                            rel->r_addend,
2525                                            lsect))
2526         return TRUE;
2527
2528       ptr_linker_section_ptr = &eh->linker_section_pointer;
2529     }
2530   else
2531     {
2532       /* Allocation of a pointer to a local symbol.  */
2533       elf_linker_section_pointers_t **ptr = elf_local_ptr_offsets (abfd);
2534
2535       /* Allocate a table to hold the local symbols if first time.  */
2536       if (!ptr)
2537         {
2538           unsigned int num_symbols = elf_tdata (abfd)->symtab_hdr.sh_info;
2539
2540           amt = num_symbols;
2541           amt *= sizeof (elf_linker_section_pointers_t *);
2542           ptr = bfd_zalloc (abfd, amt);
2543
2544           if (!ptr)
2545             return FALSE;
2546
2547           elf_local_ptr_offsets (abfd) = ptr;
2548         }
2549
2550       /* Has this symbol already been allocated?  If so, our work is done.  */
2551       if (elf_find_pointer_linker_section (ptr[r_symndx],
2552                                            rel->r_addend,
2553                                            lsect))
2554         return TRUE;
2555
2556       ptr_linker_section_ptr = &ptr[r_symndx];
2557     }
2558
2559   /* Allocate space for a pointer in the linker section, and allocate
2560      a new pointer record from internal memory.  */
2561   BFD_ASSERT (ptr_linker_section_ptr != NULL);
2562   amt = sizeof (elf_linker_section_pointers_t);
2563   linker_section_ptr = bfd_alloc (abfd, amt);
2564
2565   if (!linker_section_ptr)
2566     return FALSE;
2567
2568   linker_section_ptr->next = *ptr_linker_section_ptr;
2569   linker_section_ptr->addend = rel->r_addend;
2570   linker_section_ptr->lsect = lsect;
2571   *ptr_linker_section_ptr = linker_section_ptr;
2572
2573   linker_section_ptr->offset = lsect->section->size;
2574   lsect->section->size += 4;
2575
2576 #ifdef DEBUG
2577   fprintf (stderr,
2578            "Create pointer in linker section %s, offset = %ld, section size = %ld\n",
2579            lsect->name, (long) linker_section_ptr->offset,
2580            (long) lsect->section->size);
2581 #endif
2582
2583   return TRUE;
2584 }
2585
2586 static bfd_boolean
2587 update_local_sym_info (bfd *abfd,
2588                        Elf_Internal_Shdr *symtab_hdr,
2589                        unsigned long r_symndx,
2590                        int tls_type)
2591 {
2592   bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
2593   char *local_got_tls_masks;
2594
2595   if (local_got_refcounts == NULL)
2596     {
2597       bfd_size_type size = symtab_hdr->sh_info;
2598
2599       size *= sizeof (*local_got_refcounts) + sizeof (*local_got_tls_masks);
2600       local_got_refcounts = bfd_zalloc (abfd, size);
2601       if (local_got_refcounts == NULL)
2602         return FALSE;
2603       elf_local_got_refcounts (abfd) = local_got_refcounts;
2604     }
2605
2606   local_got_refcounts[r_symndx] += 1;
2607   local_got_tls_masks = (char *) (local_got_refcounts + symtab_hdr->sh_info);
2608   local_got_tls_masks[r_symndx] |= tls_type;
2609   return TRUE;
2610 }
2611
2612 static void
2613 bad_shared_reloc (bfd *abfd, enum elf_ppc_reloc_type r_type)
2614 {
2615   (*_bfd_error_handler)
2616     (_("%B: relocation %s cannot be used when making a shared object"),
2617      abfd,
2618      ppc_elf_howto_table[r_type]->name);
2619   bfd_set_error (bfd_error_bad_value);
2620 }
2621
2622 /* Look through the relocs for a section during the first phase, and
2623    allocate space in the global offset table or procedure linkage
2624    table.  */
2625
2626 static bfd_boolean
2627 ppc_elf_check_relocs (bfd *abfd,
2628                       struct bfd_link_info *info,
2629                       asection *sec,
2630                       const Elf_Internal_Rela *relocs)
2631 {
2632   struct ppc_elf_link_hash_table *htab;
2633   Elf_Internal_Shdr *symtab_hdr;
2634   struct elf_link_hash_entry **sym_hashes;
2635   const Elf_Internal_Rela *rel;
2636   const Elf_Internal_Rela *rel_end;
2637   asection *sreloc;
2638
2639   if (info->relocatable)
2640     return TRUE;
2641
2642   /* Don't do anything special with non-loaded, non-alloced sections.
2643      In particular, any relocs in such sections should not affect GOT
2644      and PLT reference counting (ie. we don't allow them to create GOT
2645      or PLT entries), there's no possibility or desire to optimize TLS
2646      relocs, and there's not much point in propagating relocs to shared
2647      libs that the dynamic linker won't relocate.  */
2648   if ((sec->flags & SEC_ALLOC) == 0)
2649     return TRUE;
2650
2651 #ifdef DEBUG
2652   _bfd_error_handler ("ppc_elf_check_relocs called for section %A in %B",
2653                       sec, abfd);
2654 #endif
2655
2656   /* Initialize howto table if not already done.  */
2657   if (!ppc_elf_howto_table[R_PPC_ADDR32])
2658     ppc_elf_howto_init ();
2659
2660   htab = ppc_elf_hash_table (info);
2661   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2662   sym_hashes = elf_sym_hashes (abfd);
2663   sreloc = NULL;
2664
2665   rel_end = relocs + sec->reloc_count;
2666   for (rel = relocs; rel < rel_end; rel++)
2667     {
2668       unsigned long r_symndx;
2669       enum elf_ppc_reloc_type r_type;
2670       struct elf_link_hash_entry *h;
2671       int tls_type = 0;
2672
2673       r_symndx = ELF32_R_SYM (rel->r_info);
2674       if (r_symndx < symtab_hdr->sh_info)
2675         h = NULL;
2676       else
2677         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2678
2679       /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
2680          This shows up in particular in an R_PPC_ADDR32 in the eabi
2681          startup code.  */
2682       if (h != NULL
2683           && htab->got == NULL
2684           && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2685         {
2686           if (htab->elf.dynobj == NULL)
2687             htab->elf.dynobj = abfd;
2688           if (!ppc_elf_create_got (htab->elf.dynobj, info))
2689             return FALSE;
2690           BFD_ASSERT (h == htab->elf.hgot);
2691         }
2692
2693       r_type = ELF32_R_TYPE (rel->r_info);
2694       switch (r_type)
2695         {
2696         case R_PPC_GOT_TLSLD16:
2697         case R_PPC_GOT_TLSLD16_LO:
2698         case R_PPC_GOT_TLSLD16_HI:
2699         case R_PPC_GOT_TLSLD16_HA:
2700           htab->tlsld_got.refcount += 1;
2701           tls_type = TLS_TLS | TLS_LD;
2702           goto dogottls;
2703
2704         case R_PPC_GOT_TLSGD16:
2705         case R_PPC_GOT_TLSGD16_LO:
2706         case R_PPC_GOT_TLSGD16_HI:
2707         case R_PPC_GOT_TLSGD16_HA:
2708           tls_type = TLS_TLS | TLS_GD;
2709           goto dogottls;
2710
2711         case R_PPC_GOT_TPREL16:
2712         case R_PPC_GOT_TPREL16_LO:
2713         case R_PPC_GOT_TPREL16_HI:
2714         case R_PPC_GOT_TPREL16_HA:
2715           if (info->shared)
2716             info->flags |= DF_STATIC_TLS;
2717           tls_type = TLS_TLS | TLS_TPREL;
2718           goto dogottls;
2719
2720         case R_PPC_GOT_DTPREL16:
2721         case R_PPC_GOT_DTPREL16_LO:
2722         case R_PPC_GOT_DTPREL16_HI:
2723         case R_PPC_GOT_DTPREL16_HA:
2724           tls_type = TLS_TLS | TLS_DTPREL;
2725         dogottls:
2726           sec->has_tls_reloc = 1;
2727           /* Fall thru */
2728
2729           /* GOT16 relocations */
2730         case R_PPC_GOT16:
2731         case R_PPC_GOT16_LO:
2732         case R_PPC_GOT16_HI:
2733         case R_PPC_GOT16_HA:
2734           /* This symbol requires a global offset table entry.  */
2735           if (htab->got == NULL)
2736             {
2737               if (htab->elf.dynobj == NULL)
2738                 htab->elf.dynobj = abfd;
2739               if (!ppc_elf_create_got (htab->elf.dynobj, info))
2740                 return FALSE;
2741             }
2742           if (h != NULL)
2743             {
2744               h->got.refcount += 1;
2745               ppc_elf_hash_entry (h)->tls_mask |= tls_type;
2746             }
2747           else
2748             /* This is a global offset table entry for a local symbol.  */
2749             if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, tls_type))
2750               return FALSE;
2751           break;
2752
2753           /* Indirect .sdata relocation.  */
2754         case R_PPC_EMB_SDAI16:
2755           if (info->shared)
2756             {
2757               bad_shared_reloc (abfd, r_type);
2758               return FALSE;
2759             }
2760           if (htab->sdata[0].section == NULL
2761               && !ppc_elf_create_linker_section (abfd, info, 0,
2762                                                  &htab->sdata[0]))
2763             return FALSE;
2764           if (!elf_create_pointer_linker_section (abfd, &htab->sdata[0],
2765                                                   h, rel))
2766             return FALSE;
2767           break;
2768
2769           /* Indirect .sdata2 relocation.  */
2770         case R_PPC_EMB_SDA2I16:
2771           if (info->shared)
2772             {
2773               bad_shared_reloc (abfd, r_type);
2774               return FALSE;
2775             }
2776           if (htab->sdata[1].section == NULL
2777               && !ppc_elf_create_linker_section (abfd, info, SEC_READONLY,
2778                                                  &htab->sdata[1]))
2779             return FALSE;
2780           if (!elf_create_pointer_linker_section (abfd, &htab->sdata[1],
2781                                                   h, rel))
2782             return FALSE;
2783           break;
2784
2785         case R_PPC_SDAREL16:
2786         case R_PPC_EMB_SDA2REL:
2787         case R_PPC_EMB_SDA21:
2788         case R_PPC_EMB_RELSDA:
2789         case R_PPC_EMB_NADDR32:
2790         case R_PPC_EMB_NADDR16:
2791         case R_PPC_EMB_NADDR16_LO:
2792         case R_PPC_EMB_NADDR16_HI:
2793         case R_PPC_EMB_NADDR16_HA:
2794           if (info->shared)
2795             {
2796               bad_shared_reloc (abfd, r_type);
2797               return FALSE;
2798             }
2799           break;
2800
2801         case R_PPC_PLT32:
2802         case R_PPC_PLTREL24:
2803         case R_PPC_PLTREL32:
2804         case R_PPC_PLT16_LO:
2805         case R_PPC_PLT16_HI:
2806         case R_PPC_PLT16_HA:
2807 #ifdef DEBUG
2808           fprintf (stderr, "Reloc requires a PLT entry\n");
2809 #endif
2810           /* This symbol requires a procedure linkage table entry.  We
2811              actually build the entry in finish_dynamic_symbol,
2812              because this might be a case of linking PIC code without
2813              linking in any dynamic objects, in which case we don't
2814              need to generate a procedure linkage table after all.  */
2815
2816           if (h == NULL)
2817             {
2818               /* It does not make sense to have a procedure linkage
2819                  table entry for a local symbol.  */
2820               (*_bfd_error_handler) (_("%B(%A+0x%lx): %s reloc against "
2821                                        "local symbol"),
2822                                      abfd,
2823                                      sec,
2824                                      (long) rel->r_offset,
2825                                      ppc_elf_howto_table[r_type]->name);
2826               bfd_set_error (bfd_error_bad_value);
2827               return FALSE;
2828             }
2829
2830           h->needs_plt = 1;
2831           h->plt.refcount++;
2832           break;
2833
2834           /* The following relocations don't need to propagate the
2835              relocation if linking a shared object since they are
2836              section relative.  */
2837         case R_PPC_SECTOFF:
2838         case R_PPC_SECTOFF_LO:
2839         case R_PPC_SECTOFF_HI:
2840         case R_PPC_SECTOFF_HA:
2841         case R_PPC_DTPREL16:
2842         case R_PPC_DTPREL16_LO:
2843         case R_PPC_DTPREL16_HI:
2844         case R_PPC_DTPREL16_HA:
2845         case R_PPC_TOC16:
2846           break;
2847
2848           /* This are just markers.  */
2849         case R_PPC_TLS:
2850         case R_PPC_EMB_MRKREF:
2851         case R_PPC_NONE:
2852         case R_PPC_max:
2853           break;
2854
2855           /* These should only appear in dynamic objects.  */
2856         case R_PPC_COPY:
2857         case R_PPC_GLOB_DAT:
2858         case R_PPC_JMP_SLOT:
2859         case R_PPC_RELATIVE:
2860           break;
2861
2862           /* These aren't handled yet.  We'll report an error later.  */
2863         case R_PPC_ADDR30:
2864         case R_PPC_EMB_RELSEC16:
2865         case R_PPC_EMB_RELST_LO:
2866         case R_PPC_EMB_RELST_HI:
2867         case R_PPC_EMB_RELST_HA:
2868         case R_PPC_EMB_BIT_FLD:
2869           break;
2870
2871           /* This refers only to functions defined in the shared library.  */
2872         case R_PPC_LOCAL24PC:
2873           break;
2874
2875           /* This relocation describes the C++ object vtable hierarchy.
2876              Reconstruct it for later use during GC.  */
2877         case R_PPC_GNU_VTINHERIT:
2878           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2879             return FALSE;
2880           break;
2881
2882           /* This relocation describes which C++ vtable entries are actually
2883              used.  Record for later use during GC.  */
2884         case R_PPC_GNU_VTENTRY:
2885           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2886             return FALSE;
2887           break;
2888
2889           /* We shouldn't really be seeing these.  */
2890         case R_PPC_TPREL32:
2891           if (info->shared)
2892             info->flags |= DF_STATIC_TLS;
2893           goto dodyn;
2894
2895           /* Nor these.  */
2896         case R_PPC_DTPMOD32:
2897         case R_PPC_DTPREL32:
2898           goto dodyn;
2899
2900         case R_PPC_TPREL16:
2901         case R_PPC_TPREL16_LO:
2902         case R_PPC_TPREL16_HI:
2903         case R_PPC_TPREL16_HA:
2904           if (info->shared)
2905             info->flags |= DF_STATIC_TLS;
2906           goto dodyn;
2907
2908           /* When creating a shared object, we must copy these
2909              relocs into the output file.  We create a reloc
2910              section in dynobj and make room for the reloc.  */
2911         case R_PPC_REL24:
2912         case R_PPC_REL14:
2913         case R_PPC_REL14_BRTAKEN:
2914         case R_PPC_REL14_BRNTAKEN:
2915         case R_PPC_REL32:
2916           if (h == NULL || h == htab->elf.hgot)
2917             break;
2918           /* fall through */
2919
2920         case R_PPC_ADDR32:
2921         case R_PPC_ADDR24:
2922         case R_PPC_ADDR16:
2923         case R_PPC_ADDR16_LO:
2924         case R_PPC_ADDR16_HI:
2925         case R_PPC_ADDR16_HA:
2926         case R_PPC_ADDR14:
2927         case R_PPC_ADDR14_BRTAKEN:
2928         case R_PPC_ADDR14_BRNTAKEN:
2929         case R_PPC_UADDR32:
2930         case R_PPC_UADDR16:
2931           if (h != NULL && !info->shared)
2932             {
2933               /* We may need a plt entry if the symbol turns out to be
2934                  a function defined in a dynamic object.  */
2935               h->plt.refcount++;
2936
2937               /* We may need a copy reloc too.  */
2938               h->non_got_ref = 1;
2939             }
2940
2941         dodyn:
2942           /* If we are creating a shared library, and this is a reloc
2943              against a global symbol, or a non PC relative reloc
2944              against a local symbol, then we need to copy the reloc
2945              into the shared library.  However, if we are linking with
2946              -Bsymbolic, we do not need to copy a reloc against a
2947              global symbol which is defined in an object we are
2948              including in the link (i.e., DEF_REGULAR is set).  At
2949              this point we have not seen all the input files, so it is
2950              possible that DEF_REGULAR is not set now but will be set
2951              later (it is never cleared).  In case of a weak definition,
2952              DEF_REGULAR may be cleared later by a strong definition in
2953              a shared library.  We account for that possibility below by
2954              storing information in the dyn_relocs field of the hash
2955              table entry.  A similar situation occurs when creating
2956              shared libraries and symbol visibility changes render the
2957              symbol local.
2958
2959              If on the other hand, we are creating an executable, we
2960              may need to keep relocations for symbols satisfied by a
2961              dynamic library if we manage to avoid copy relocs for the
2962              symbol.  */
2963           if ((info->shared
2964                && (MUST_BE_DYN_RELOC (r_type)
2965                    || (h != NULL
2966                        && (! info->symbolic
2967                            || h->root.type == bfd_link_hash_defweak
2968                            || !h->def_regular))))
2969               || (ELIMINATE_COPY_RELOCS
2970                   && !info->shared
2971                   && h != NULL
2972                   && (h->root.type == bfd_link_hash_defweak
2973                       || !h->def_regular)))
2974             {
2975               struct ppc_elf_dyn_relocs *p;
2976               struct ppc_elf_dyn_relocs **head;
2977
2978 #ifdef DEBUG
2979               fprintf (stderr,
2980                        "ppc_elf_check_relocs needs to "
2981                        "create relocation for %s\n",
2982                        (h && h->root.root.string
2983                         ? h->root.root.string : "<unknown>"));
2984 #endif
2985               if (sreloc == NULL)
2986                 {
2987                   const char *name;
2988
2989                   name = (bfd_elf_string_from_elf_section
2990                           (abfd,
2991                            elf_elfheader (abfd)->e_shstrndx,
2992                            elf_section_data (sec)->rel_hdr.sh_name));
2993                   if (name == NULL)
2994                     return FALSE;
2995
2996                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
2997                               && strcmp (bfd_get_section_name (abfd, sec),
2998                                          name + 5) == 0);
2999
3000                   if (htab->elf.dynobj == NULL)
3001                     htab->elf.dynobj = abfd;
3002                   sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
3003                   if (sreloc == NULL)
3004                     {
3005                       flagword flags;
3006
3007                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
3008                                | SEC_IN_MEMORY | SEC_LINKER_CREATED
3009                                | SEC_ALLOC | SEC_LOAD);
3010                       sreloc = bfd_make_section_with_flags (htab->elf.dynobj,
3011                                                             name,
3012                                                             flags);
3013                       if (sreloc == NULL
3014                           || ! bfd_set_section_alignment (htab->elf.dynobj,
3015                                                           sreloc, 2))
3016                         return FALSE;
3017                     }
3018                   elf_section_data (sec)->sreloc = sreloc;
3019                 }
3020
3021               /* If this is a global symbol, we count the number of
3022                  relocations we need for this symbol.  */
3023               if (h != NULL)
3024                 {
3025                   head = &ppc_elf_hash_entry (h)->dyn_relocs;
3026                 }
3027               else
3028                 {
3029                   /* Track dynamic relocs needed for local syms too.
3030                      We really need local syms available to do this
3031                      easily.  Oh well.  */
3032
3033                   asection *s;
3034                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
3035                                                  sec, r_symndx);
3036                   if (s == NULL)
3037                     return FALSE;
3038
3039                   head = ((struct ppc_elf_dyn_relocs **)
3040                           &elf_section_data (s)->local_dynrel);
3041                 }
3042
3043               p = *head;
3044               if (p == NULL || p->sec != sec)
3045                 {
3046                   p = bfd_alloc (htab->elf.dynobj, sizeof *p);
3047                   if (p == NULL)
3048                     return FALSE;
3049                   p->next = *head;
3050                   *head = p;
3051                   p->sec = sec;
3052                   p->count = 0;
3053                   p->pc_count = 0;
3054                 }
3055
3056               p->count += 1;
3057               if (!MUST_BE_DYN_RELOC (r_type))
3058                 p->pc_count += 1;
3059             }
3060
3061           break;
3062         }
3063     }
3064
3065   return TRUE;
3066 }
3067 \f
3068 /* Merge backend specific data from an object file to the output
3069    object file when linking.  */
3070
3071 static bfd_boolean
3072 ppc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
3073 {
3074   flagword old_flags;
3075   flagword new_flags;
3076   bfd_boolean error;
3077
3078   if (!is_ppc_elf_target (ibfd->xvec)
3079       || !is_ppc_elf_target (obfd->xvec))
3080     return TRUE;
3081
3082   /* Check if we have the same endianess.  */
3083   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
3084     return FALSE;
3085
3086   new_flags = elf_elfheader (ibfd)->e_flags;
3087   old_flags = elf_elfheader (obfd)->e_flags;
3088   if (!elf_flags_init (obfd))
3089     {
3090       /* First call, no flags set.  */
3091       elf_flags_init (obfd) = TRUE;
3092       elf_elfheader (obfd)->e_flags = new_flags;
3093     }
3094
3095   /* Compatible flags are ok.  */
3096   else if (new_flags == old_flags)
3097     ;
3098
3099   /* Incompatible flags.  */
3100   else
3101     {
3102       /* Warn about -mrelocatable mismatch.  Allow -mrelocatable-lib
3103          to be linked with either.  */
3104       error = FALSE;
3105       if ((new_flags & EF_PPC_RELOCATABLE) != 0
3106           && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
3107         {
3108           error = TRUE;
3109           (*_bfd_error_handler)
3110             (_("%B: compiled with -mrelocatable and linked with "
3111                "modules compiled normally"), ibfd);
3112         }
3113       else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
3114                && (old_flags & EF_PPC_RELOCATABLE) != 0)
3115         {
3116           error = TRUE;
3117           (*_bfd_error_handler)
3118             (_("%B: compiled normally and linked with "
3119                "modules compiled with -mrelocatable"), ibfd);
3120         }
3121
3122       /* The output is -mrelocatable-lib iff both the input files are.  */
3123       if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
3124         elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
3125
3126       /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
3127          but each input file is either -mrelocatable or -mrelocatable-lib.  */
3128       if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
3129           && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
3130           && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
3131         elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
3132
3133       /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
3134          any module uses it.  */
3135       elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
3136
3137       new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
3138       old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
3139
3140       /* Warn about any other mismatches.  */
3141       if (new_flags != old_flags)
3142         {
3143           error = TRUE;
3144           (*_bfd_error_handler)
3145             (_("%B: uses different e_flags (0x%lx) fields "
3146                "than previous modules (0x%lx)"),
3147              ibfd, (long) new_flags, (long) old_flags);
3148         }
3149
3150       if (error)
3151         {
3152           bfd_set_error (bfd_error_bad_value);
3153           return FALSE;
3154         }
3155     }
3156
3157   return TRUE;
3158 }
3159 \f
3160 /* Return the section that should be marked against GC for a given
3161    relocation.  */
3162
3163 static asection *
3164 ppc_elf_gc_mark_hook (asection *sec,
3165                       struct bfd_link_info *info ATTRIBUTE_UNUSED,
3166                       Elf_Internal_Rela *rel,
3167                       struct elf_link_hash_entry *h,
3168                       Elf_Internal_Sym *sym)
3169 {
3170   if (h != NULL)
3171     {
3172       switch (ELF32_R_TYPE (rel->r_info))
3173         {
3174         case R_PPC_GNU_VTINHERIT:
3175         case R_PPC_GNU_VTENTRY:
3176           break;
3177
3178         default:
3179           switch (h->root.type)
3180             {
3181             case bfd_link_hash_defined:
3182             case bfd_link_hash_defweak:
3183               return h->root.u.def.section;
3184
3185             case bfd_link_hash_common:
3186               return h->root.u.c.p->section;
3187
3188             default:
3189               break;
3190             }
3191         }
3192     }
3193   else
3194     return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
3195
3196   return NULL;
3197 }
3198
3199 /* Update the got, plt and dynamic reloc reference counts for the
3200    section being removed.  */
3201
3202 static bfd_boolean
3203 ppc_elf_gc_sweep_hook (bfd *abfd,
3204                        struct bfd_link_info *info,
3205                        asection *sec,
3206                        const Elf_Internal_Rela *relocs)
3207 {
3208   struct ppc_elf_link_hash_table *htab;
3209   Elf_Internal_Shdr *symtab_hdr;
3210   struct elf_link_hash_entry **sym_hashes;
3211   bfd_signed_vma *local_got_refcounts;
3212   const Elf_Internal_Rela *rel, *relend;
3213
3214   if ((sec->flags & SEC_ALLOC) == 0)
3215     return TRUE;
3216
3217   elf_section_data (sec)->local_dynrel = NULL;
3218
3219   htab = ppc_elf_hash_table (info);
3220   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3221   sym_hashes = elf_sym_hashes (abfd);
3222   local_got_refcounts = elf_local_got_refcounts (abfd);
3223
3224   relend = relocs + sec->reloc_count;
3225   for (rel = relocs; rel < relend; rel++)
3226     {
3227       unsigned long r_symndx;
3228       enum elf_ppc_reloc_type r_type;
3229       struct elf_link_hash_entry *h = NULL;
3230
3231       r_symndx = ELF32_R_SYM (rel->r_info);
3232       if (r_symndx >= symtab_hdr->sh_info)
3233         {
3234           struct ppc_elf_dyn_relocs **pp, *p;
3235           struct ppc_elf_link_hash_entry *eh;
3236
3237           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3238           while (h->root.type == bfd_link_hash_indirect
3239                  || h->root.type == bfd_link_hash_warning)
3240             h = (struct elf_link_hash_entry *) h->root.u.i.link;
3241           eh = (struct ppc_elf_link_hash_entry *) h;
3242
3243           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
3244             if (p->sec == sec)
3245               {
3246                 /* Everything must go for SEC.  */
3247                 *pp = p->next;
3248                 break;
3249               }
3250         }
3251
3252       r_type = ELF32_R_TYPE (rel->r_info);
3253       switch (r_type)
3254         {
3255         case R_PPC_GOT_TLSLD16:
3256         case R_PPC_GOT_TLSLD16_LO:
3257         case R_PPC_GOT_TLSLD16_HI:
3258         case R_PPC_GOT_TLSLD16_HA:
3259           htab->tlsld_got.refcount -= 1;
3260           /* Fall thru */
3261
3262         case R_PPC_GOT_TLSGD16:
3263         case R_PPC_GOT_TLSGD16_LO:
3264         case R_PPC_GOT_TLSGD16_HI:
3265         case R_PPC_GOT_TLSGD16_HA:
3266         case R_PPC_GOT_TPREL16:
3267         case R_PPC_GOT_TPREL16_LO:
3268         case R_PPC_GOT_TPREL16_HI:
3269         case R_PPC_GOT_TPREL16_HA:
3270         case R_PPC_GOT_DTPREL16:
3271         case R_PPC_GOT_DTPREL16_LO:
3272         case R_PPC_GOT_DTPREL16_HI:
3273         case R_PPC_GOT_DTPREL16_HA:
3274         case R_PPC_GOT16:
3275         case R_PPC_GOT16_LO:
3276         case R_PPC_GOT16_HI:
3277         case R_PPC_GOT16_HA:
3278           if (h != NULL)
3279             {
3280               if (h->got.refcount > 0)
3281                 h->got.refcount--;
3282             }
3283           else if (local_got_refcounts != NULL)
3284             {
3285               if (local_got_refcounts[r_symndx] > 0)
3286                 local_got_refcounts[r_symndx]--;
3287             }
3288           break;
3289
3290         case R_PPC_REL24:
3291         case R_PPC_REL14:
3292         case R_PPC_REL14_BRTAKEN:
3293         case R_PPC_REL14_BRNTAKEN:
3294         case R_PPC_REL32:
3295           if (h == NULL || h == htab->elf.hgot)
3296             break;
3297           /* Fall thru */
3298
3299         case R_PPC_ADDR32:
3300         case R_PPC_ADDR24:
3301         case R_PPC_ADDR16:
3302         case R_PPC_ADDR16_LO:
3303         case R_PPC_ADDR16_HI:
3304         case R_PPC_ADDR16_HA:
3305         case R_PPC_ADDR14:
3306         case R_PPC_ADDR14_BRTAKEN:
3307         case R_PPC_ADDR14_BRNTAKEN:
3308         case R_PPC_UADDR32:
3309         case R_PPC_UADDR16:
3310         case R_PPC_PLT32:
3311         case R_PPC_PLTREL24:
3312         case R_PPC_PLT16_LO:
3313         case R_PPC_PLT16_HI:
3314         case R_PPC_PLT16_HA:
3315           if (h != NULL)
3316             {
3317               if (h->plt.refcount > 0)
3318                 h->plt.refcount--;
3319             }
3320           break;
3321
3322         default:
3323           break;
3324         }
3325     }
3326   return TRUE;
3327 }
3328 \f
3329 /* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
3330
3331 asection *
3332 ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
3333 {
3334   struct ppc_elf_link_hash_table *htab;
3335
3336   htab = ppc_elf_hash_table (info);
3337   htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
3338                                              FALSE, FALSE, TRUE);
3339
3340   return _bfd_elf_tls_setup (obfd, info);
3341 }
3342
3343 /* Run through all the TLS relocs looking for optimization
3344    opportunities.  */
3345
3346 bfd_boolean
3347 ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
3348                       struct bfd_link_info *info)
3349 {
3350   bfd *ibfd;
3351   asection *sec;
3352   struct ppc_elf_link_hash_table *htab;
3353
3354   if (info->relocatable || info->shared)
3355     return TRUE;
3356
3357   htab = ppc_elf_hash_table (info);
3358   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3359     {
3360       Elf_Internal_Sym *locsyms = NULL;
3361       Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3362
3363       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3364         if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
3365           {
3366             Elf_Internal_Rela *relstart, *rel, *relend;
3367             int expecting_tls_get_addr;
3368
3369             /* Read the relocations.  */
3370             relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
3371                                                   info->keep_memory);
3372             if (relstart == NULL)
3373               return FALSE;
3374
3375             expecting_tls_get_addr = 0;
3376             relend = relstart + sec->reloc_count;
3377             for (rel = relstart; rel < relend; rel++)
3378               {
3379                 enum elf_ppc_reloc_type r_type;
3380                 unsigned long r_symndx;
3381                 struct elf_link_hash_entry *h = NULL;
3382                 char *tls_mask;
3383                 char tls_set, tls_clear;
3384                 bfd_boolean is_local;
3385
3386                 r_symndx = ELF32_R_SYM (rel->r_info);
3387                 if (r_symndx >= symtab_hdr->sh_info)
3388                   {
3389                     struct elf_link_hash_entry **sym_hashes;
3390
3391                     sym_hashes = elf_sym_hashes (ibfd);
3392                     h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3393                     while (h->root.type == bfd_link_hash_indirect
3394                            || h->root.type == bfd_link_hash_warning)
3395                       h = (struct elf_link_hash_entry *) h->root.u.i.link;
3396                   }
3397
3398                 is_local = FALSE;
3399                 if (h == NULL
3400                     || !h->def_dynamic)
3401                   is_local = TRUE;
3402
3403                 r_type = ELF32_R_TYPE (rel->r_info);
3404                 switch (r_type)
3405                   {
3406                   case R_PPC_GOT_TLSLD16:
3407                   case R_PPC_GOT_TLSLD16_LO:
3408                   case R_PPC_GOT_TLSLD16_HI:
3409                   case R_PPC_GOT_TLSLD16_HA:
3410                     /* These relocs should never be against a symbol
3411                        defined in a shared lib.  Leave them alone if
3412                        that turns out to be the case.  */
3413                     expecting_tls_get_addr = 0;
3414                     htab->tlsld_got.refcount -= 1;
3415                     if (!is_local)
3416                       continue;
3417
3418                     /* LD -> LE */
3419                     tls_set = 0;
3420                     tls_clear = TLS_LD;
3421                     expecting_tls_get_addr = 1;
3422                     break;
3423
3424                   case R_PPC_GOT_TLSGD16:
3425                   case R_PPC_GOT_TLSGD16_LO:
3426                   case R_PPC_GOT_TLSGD16_HI:
3427                   case R_PPC_GOT_TLSGD16_HA:
3428                     if (is_local)
3429                       /* GD -> LE */
3430                       tls_set = 0;
3431                     else
3432                       /* GD -> IE */
3433                       tls_set = TLS_TLS | TLS_TPRELGD;
3434                     tls_clear = TLS_GD;
3435                     expecting_tls_get_addr = 1;
3436                     break;
3437
3438                   case R_PPC_GOT_TPREL16:
3439                   case R_PPC_GOT_TPREL16_LO:
3440                   case R_PPC_GOT_TPREL16_HI:
3441                   case R_PPC_GOT_TPREL16_HA:
3442                     expecting_tls_get_addr = 0;
3443                     if (is_local)
3444                       {
3445                         /* IE -> LE */
3446                         tls_set = 0;
3447                         tls_clear = TLS_TPREL;
3448                         break;
3449                       }
3450                     else
3451                       continue;
3452
3453                   case R_PPC_REL14:
3454                   case R_PPC_REL14_BRTAKEN:
3455                   case R_PPC_REL14_BRNTAKEN:
3456                   case R_PPC_REL24:
3457                     if (expecting_tls_get_addr
3458                         && h != NULL
3459                         && h == htab->tls_get_addr)
3460                       {
3461                         if (h->plt.refcount > 0)
3462                           h->plt.refcount -= 1;
3463                       }
3464                     expecting_tls_get_addr = 0;
3465                     continue;
3466
3467                   default:
3468                     expecting_tls_get_addr = 0;
3469                     continue;
3470                   }
3471
3472                 if (h != NULL)
3473                   {
3474                     if (tls_set == 0)
3475                       {
3476                         /* We managed to get rid of a got entry.  */
3477                         if (h->got.refcount > 0)
3478                           h->got.refcount -= 1;
3479                       }
3480                     tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
3481                   }
3482                 else
3483                   {
3484                     Elf_Internal_Sym *sym;
3485                     bfd_signed_vma *lgot_refs;
3486                     char *lgot_masks;
3487
3488                     if (locsyms == NULL)
3489                       {
3490                         locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
3491                         if (locsyms == NULL)
3492                           locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
3493                                                           symtab_hdr->sh_info,
3494                                                           0, NULL, NULL, NULL);
3495                         if (locsyms == NULL)
3496                           {
3497                             if (elf_section_data (sec)->relocs != relstart)
3498                               free (relstart);
3499                             return FALSE;
3500                           }
3501                       }
3502                     sym = locsyms + r_symndx;
3503                     lgot_refs = elf_local_got_refcounts (ibfd);
3504                     if (lgot_refs == NULL)
3505                       abort ();
3506                     if (tls_set == 0)
3507                       {
3508                         /* We managed to get rid of a got entry.  */
3509                         if (lgot_refs[r_symndx] > 0)
3510                           lgot_refs[r_symndx] -= 1;
3511                       }
3512                     lgot_masks = (char *) (lgot_refs + symtab_hdr->sh_info);
3513                     tls_mask = &lgot_masks[r_symndx];
3514                   }
3515
3516                 *tls_mask |= tls_set;
3517                 *tls_mask &= ~tls_clear;
3518               }
3519
3520             if (elf_section_data (sec)->relocs != relstart)
3521               free (relstart);
3522           }
3523
3524       if (locsyms != NULL
3525           && (symtab_hdr->contents != (unsigned char *) locsyms))
3526         {
3527           if (!info->keep_memory)
3528             free (locsyms);
3529           else
3530             symtab_hdr->contents = (unsigned char *) locsyms;
3531         }
3532     }
3533   return TRUE;
3534 }
3535 \f
3536 /* Adjust a symbol defined by a dynamic object and referenced by a
3537    regular object.  The current definition is in some section of the
3538    dynamic object, but we're not including those sections.  We have to
3539    change the definition to something the rest of the link can
3540    understand.  */
3541
3542 static bfd_boolean
3543 ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
3544                                struct elf_link_hash_entry *h)
3545 {
3546   struct ppc_elf_link_hash_table *htab;
3547   asection *s;
3548   unsigned int power_of_two;
3549
3550 #ifdef DEBUG
3551   fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
3552            h->root.root.string);
3553 #endif
3554
3555   /* Make sure we know what is going on here.  */
3556   htab = ppc_elf_hash_table (info);
3557   BFD_ASSERT (htab->elf.dynobj != NULL
3558               && (h->needs_plt
3559                   || h->u.weakdef != NULL
3560                   || (h->def_dynamic
3561                       && h->ref_regular
3562                       && !h->def_regular)));
3563
3564   /* Deal with function syms.  */
3565   if (h->type == STT_FUNC
3566       || h->needs_plt)
3567     {
3568       /* Clear procedure linkage table information for any symbol that
3569          won't need a .plt entry.  */
3570       if (h->plt.refcount <= 0
3571           || SYMBOL_CALLS_LOCAL (info, h)
3572           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3573               && h->root.type == bfd_link_hash_undefweak))
3574         {
3575           /* A PLT entry is not required/allowed when:
3576
3577              1. We are not using ld.so; because then the PLT entry
3578              can't be set up, so we can't use one.  In this case,
3579              ppc_elf_adjust_dynamic_symbol won't even be called.
3580
3581              2. GC has rendered the entry unused.
3582
3583              3. We know for certain that a call to this symbol
3584              will go to this object, or will remain undefined.  */
3585           h->plt.offset = (bfd_vma) -1;
3586           h->needs_plt = 0;
3587         }
3588       return TRUE;
3589     }
3590   else
3591     h->plt.offset = (bfd_vma) -1;
3592
3593   /* If this is a weak symbol, and there is a real definition, the
3594      processor independent code will have arranged for us to see the
3595      real definition first, and we can just use the same value.  */
3596   if (h->u.weakdef != NULL)
3597     {
3598       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
3599                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
3600       h->root.u.def.section = h->u.weakdef->root.u.def.section;
3601       h->root.u.def.value = h->u.weakdef->root.u.def.value;
3602       if (ELIMINATE_COPY_RELOCS)
3603         h->non_got_ref = h->u.weakdef->non_got_ref;
3604       return TRUE;
3605     }
3606
3607   /* This is a reference to a symbol defined by a dynamic object which
3608      is not a function.  */
3609
3610   /* If we are creating a shared library, we must presume that the
3611      only references to the symbol are via the global offset table.
3612      For such cases we need not do anything here; the relocations will
3613      be handled correctly by relocate_section.  */
3614   if (info->shared)
3615     return TRUE;
3616
3617   /* If there are no references to this symbol that do not use the
3618      GOT, we don't need to generate a copy reloc.  */
3619   if (!h->non_got_ref)
3620     return TRUE;
3621
3622   if (ELIMINATE_COPY_RELOCS)
3623     {
3624       struct ppc_elf_dyn_relocs *p;
3625       for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
3626         {
3627           s = p->sec->output_section;
3628           if (s != NULL && (s->flags & SEC_READONLY) != 0)
3629             break;
3630         }
3631
3632       /* If we didn't find any dynamic relocs in read-only sections, then
3633          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
3634       if (p == NULL)
3635         {
3636           h->non_got_ref = 0;
3637           return TRUE;
3638         }
3639     }
3640
3641   /* We must allocate the symbol in our .dynbss section, which will
3642      become part of the .bss section of the executable.  There will be
3643      an entry for this symbol in the .dynsym section.  The dynamic
3644      object will contain position independent code, so all references
3645      from the dynamic object to this symbol will go through the global
3646      offset table.  The dynamic linker will use the .dynsym entry to
3647      determine the address it must put in the global offset table, so
3648      both the dynamic object and the regular object will refer to the
3649      same memory location for the variable.
3650
3651      Of course, if the symbol is sufficiently small, we must instead
3652      allocate it in .sbss.  FIXME: It would be better to do this if and
3653      only if there were actually SDAREL relocs for that symbol.  */
3654
3655   if (h->size <= elf_gp_size (htab->elf.dynobj))
3656     s = htab->dynsbss;
3657   else
3658     s = htab->dynbss;
3659   BFD_ASSERT (s != NULL);
3660
3661   /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
3662      copy the initial value out of the dynamic object and into the
3663      runtime process image.  We need to remember the offset into the
3664      .rela.bss section we are going to use.  */
3665   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
3666     {
3667       asection *srel;
3668
3669       if (h->size <= elf_gp_size (htab->elf.dynobj))
3670         srel = htab->relsbss;
3671       else
3672         srel = htab->relbss;
3673       BFD_ASSERT (srel != NULL);
3674       srel->size += sizeof (Elf32_External_Rela);
3675       h->needs_copy = 1;
3676     }
3677
3678   /* We need to figure out the alignment required for this symbol.  I
3679      have no idea how ELF linkers handle this.  */
3680   power_of_two = bfd_log2 (h->size);
3681   if (power_of_two > 4)
3682     power_of_two = 4;
3683
3684   /* Apply the required alignment.  */
3685   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
3686   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
3687     {
3688       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
3689         return FALSE;
3690     }
3691
3692   /* Define the symbol as being at this point in the section.  */
3693   h->root.u.def.section = s;
3694   h->root.u.def.value = s->size;
3695
3696   /* Increment the section size to make room for the symbol.  */
3697   s->size += h->size;
3698
3699   return TRUE;
3700 }
3701 \f
3702 /* Allocate NEED contiguous space in .got, and return the offset.
3703    Handles allocation of the got header when crossing 32k.  */
3704
3705 static bfd_vma
3706 allocate_got (struct ppc_elf_link_hash_table *htab, unsigned int need)
3707 {
3708   bfd_vma where;
3709   unsigned int max_before_header = 32764;
3710
3711   if (need <= htab->got_gap)
3712     {
3713       where = max_before_header - htab->got_gap;
3714       htab->got_gap -= need;
3715     }
3716   else
3717     {
3718       if (htab->got->size + need > max_before_header
3719           && htab->got->size <= max_before_header)
3720         {
3721           htab->got_gap = max_before_header - htab->got->size;
3722           htab->got->size = max_before_header + htab->got_header_size;
3723         }
3724       where = htab->got->size;
3725       htab->got->size += need;
3726     }
3727   return where;
3728 }
3729
3730 /* Allocate space in associated reloc sections for dynamic relocs.  */
3731
3732 static bfd_boolean
3733 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3734 {
3735   struct bfd_link_info *info = inf;
3736   struct ppc_elf_link_hash_entry *eh;
3737   struct ppc_elf_link_hash_table *htab;
3738   struct ppc_elf_dyn_relocs *p;
3739
3740   if (h->root.type == bfd_link_hash_indirect)
3741     return TRUE;
3742
3743   if (h->root.type == bfd_link_hash_warning)
3744     /* When warning symbols are created, they **replace** the "real"
3745        entry in the hash table, thus we never get to see the real
3746        symbol in a hash traversal.  So look at it now.  */
3747     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3748
3749   htab = ppc_elf_hash_table (info);
3750   if (htab->elf.dynamic_sections_created
3751       && h->plt.refcount > 0)
3752     {
3753       /* Make sure this symbol is output as a dynamic symbol.  */
3754       if (h->dynindx == -1
3755           && !h->forced_local)
3756         {
3757           if (! bfd_elf_link_record_dynamic_symbol (info, h))
3758             return FALSE;
3759         }
3760
3761       if (info->shared
3762           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
3763         {
3764           asection *s = htab->plt;
3765
3766           /* If this is the first .plt entry, make room for the special
3767              first entry.  */
3768           if (s->size == 0)
3769             s->size += PLT_INITIAL_ENTRY_SIZE;
3770
3771           /* The PowerPC PLT is actually composed of two parts, the
3772              first part is 2 words (for a load and a jump), and then
3773              there is a remaining word available at the end.  */
3774           h->plt.offset = (PLT_INITIAL_ENTRY_SIZE
3775                            + (PLT_SLOT_SIZE
3776                               * ((s->size - PLT_INITIAL_ENTRY_SIZE)
3777                                  / PLT_ENTRY_SIZE)));
3778
3779           /* If this symbol is not defined in a regular file, and we
3780              are not generating a shared library, then set the symbol
3781              to this location in the .plt.  This is required to make
3782              function pointers compare as equal between the normal
3783              executable and the shared library.  */
3784           if (! info->shared
3785               && !h->def_regular)
3786             {
3787               h->root.u.def.section = s;
3788               h->root.u.def.value = h->plt.offset;
3789             }
3790
3791           /* Make room for this entry.  After the 8192nd entry, room
3792              for two entries is allocated.  */
3793           s->size += PLT_ENTRY_SIZE;
3794           if ((s->size - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE
3795               > PLT_NUM_SINGLE_ENTRIES)
3796             s->size += PLT_ENTRY_SIZE;
3797
3798           /* We also need to make an entry in the .rela.plt section.  */
3799           htab->relplt->size += sizeof (Elf32_External_Rela);
3800         }
3801       else
3802         {
3803           h->plt.offset = (bfd_vma) -1;
3804           h->needs_plt = 0;
3805         }
3806     }
3807   else
3808     {
3809       h->plt.offset = (bfd_vma) -1;
3810       h->needs_plt = 0;
3811     }
3812
3813   eh = (struct ppc_elf_link_hash_entry *) h;
3814   if (eh->elf.got.refcount > 0)
3815     {
3816       /* Make sure this symbol is output as a dynamic symbol.  */
3817       if (eh->elf.dynindx == -1
3818           && !eh->elf.forced_local)
3819         {
3820           if (!bfd_elf_link_record_dynamic_symbol (info, &eh->elf))
3821             return FALSE;
3822         }
3823
3824       if (eh->tls_mask == (TLS_TLS | TLS_LD)
3825           && !eh->elf.def_dynamic)
3826         /* If just an LD reloc, we'll just use htab->tlsld_got.offset.  */
3827         eh->elf.got.offset = (bfd_vma) -1;
3828       else
3829         {
3830           bfd_boolean dyn;
3831           unsigned int need = 0;
3832           if ((eh->tls_mask & TLS_TLS) != 0)
3833             {
3834               if ((eh->tls_mask & TLS_LD) != 0)
3835                 need += 8;
3836               if ((eh->tls_mask & TLS_GD) != 0)
3837                 need += 8;
3838               if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
3839                 need += 4;
3840               if ((eh->tls_mask & TLS_DTPREL) != 0)
3841                 need += 4;
3842             }
3843           else
3844             need += 4;
3845           eh->elf.got.offset = allocate_got (htab, need);
3846           dyn = htab->elf.dynamic_sections_created;
3847           if ((info->shared
3848                || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, &eh->elf))
3849               && (ELF_ST_VISIBILITY (eh->elf.other) == STV_DEFAULT
3850                   || eh->elf.root.type != bfd_link_hash_undefweak))
3851             {
3852               /* All the entries we allocated need relocs.
3853                  Except LD only needs one.  */
3854               if ((eh->tls_mask & TLS_LD) != 0)
3855                 need -= 4;
3856               htab->relgot->size += need * (sizeof (Elf32_External_Rela) / 4);
3857             }
3858         }
3859     }
3860   else
3861     eh->elf.got.offset = (bfd_vma) -1;
3862
3863   if (eh->dyn_relocs == NULL)
3864     return TRUE;
3865
3866   /* In the shared -Bsymbolic case, discard space allocated for
3867      dynamic pc-relative relocs against symbols which turn out to be
3868      defined in regular objects.  For the normal shared case, discard
3869      space for relocs that have become local due to symbol visibility
3870      changes.  */
3871
3872   if (info->shared)
3873     {
3874       /* Relocs that use pc_count are those that appear on a call insn,
3875          or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
3876          generated via assembly.  We want calls to protected symbols to
3877          resolve directly to the function rather than going via the plt.
3878          If people want function pointer comparisons to work as expected
3879          then they should avoid writing weird assembly.  */
3880       if (SYMBOL_CALLS_LOCAL (info, h))
3881         {
3882           struct ppc_elf_dyn_relocs **pp;
3883
3884           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
3885             {
3886               p->count -= p->pc_count;
3887               p->pc_count = 0;
3888               if (p->count == 0)
3889                 *pp = p->next;
3890               else
3891                 pp = &p->next;
3892             }
3893         }
3894
3895       /* Also discard relocs on undefined weak syms with non-default
3896          visibility.  */
3897       if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3898           && h->root.type == bfd_link_hash_undefweak)
3899         eh->dyn_relocs = NULL;
3900
3901       /* Make sure undefined weak symbols are output as a dynamic symbol
3902          in PIEs.  */
3903       if (info->pie
3904           && eh->dyn_relocs != NULL
3905           && h->dynindx == -1
3906           && h->root.type == bfd_link_hash_undefweak
3907           && !h->forced_local)
3908         {
3909           if (! bfd_elf_link_record_dynamic_symbol (info, h))
3910             return FALSE;
3911         }
3912     }
3913   else if (ELIMINATE_COPY_RELOCS)
3914     {
3915       /* For the non-shared case, discard space for relocs against
3916          symbols which turn out to need copy relocs or are not
3917          dynamic.  */
3918
3919       if (!h->non_got_ref
3920           && h->def_dynamic
3921           && !h->def_regular)
3922         {
3923           /* Make sure this symbol is output as a dynamic symbol.
3924              Undefined weak syms won't yet be marked as dynamic.  */
3925           if (h->dynindx == -1
3926               && !h->forced_local)
3927             {
3928               if (! bfd_elf_link_record_dynamic_symbol (info, h))
3929                 return FALSE;
3930             }
3931
3932           /* If that succeeded, we know we'll be keeping all the
3933              relocs.  */
3934           if (h->dynindx != -1)
3935             goto keep;
3936         }
3937
3938       eh->dyn_relocs = NULL;
3939
3940     keep: ;
3941     }
3942
3943   /* Finally, allocate space.  */
3944   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3945     {
3946       asection *sreloc = elf_section_data (p->sec)->sreloc;
3947       sreloc->size += p->count * sizeof (Elf32_External_Rela);
3948     }
3949
3950   return TRUE;
3951 }
3952
3953 /* Find any dynamic relocs that apply to read-only sections.  */
3954
3955 static bfd_boolean
3956 readonly_dynrelocs (struct elf_link_hash_entry *h, void *info)
3957 {
3958   struct ppc_elf_dyn_relocs *p;
3959
3960   if (h->root.type == bfd_link_hash_indirect)
3961     return TRUE;
3962
3963   if (h->root.type == bfd_link_hash_warning)
3964     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3965
3966   for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
3967     {
3968       asection *s = p->sec->output_section;
3969
3970       if (s != NULL
3971           && ((s->flags & (SEC_READONLY | SEC_ALLOC))
3972               == (SEC_READONLY | SEC_ALLOC)))
3973         {
3974           ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
3975
3976           /* Not an error, just cut short the traversal.  */
3977           return FALSE;
3978         }
3979     }
3980   return TRUE;
3981 }
3982
3983 /* Set the sizes of the dynamic sections.  */
3984
3985 static bfd_boolean
3986 ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3987                                struct bfd_link_info *info)
3988 {
3989   struct ppc_elf_link_hash_table *htab;
3990   asection *s;
3991   bfd_boolean relocs;
3992   bfd *ibfd;
3993
3994 #ifdef DEBUG
3995   fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
3996 #endif
3997
3998   htab = ppc_elf_hash_table (info);
3999   BFD_ASSERT (htab->elf.dynobj != NULL);
4000
4001   if (elf_hash_table (info)->dynamic_sections_created)
4002     {
4003       /* Set the contents of the .interp section to the interpreter.  */
4004       if (info->executable)
4005         {
4006           s = bfd_get_section_by_name (htab->elf.dynobj, ".interp");
4007           BFD_ASSERT (s != NULL);
4008           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4009           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4010         }
4011     }
4012
4013   htab->got_header_size = 16;
4014
4015   /* Set up .got offsets for local syms, and space for local dynamic
4016      relocs.  */
4017   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4018     {
4019       bfd_signed_vma *local_got;
4020       bfd_signed_vma *end_local_got;
4021       char *lgot_masks;
4022       bfd_size_type locsymcount;
4023       Elf_Internal_Shdr *symtab_hdr;
4024
4025       if (!is_ppc_elf_target (ibfd->xvec))
4026         continue;
4027
4028       for (s = ibfd->sections; s != NULL; s = s->next)
4029         {
4030           struct ppc_elf_dyn_relocs *p;
4031
4032           for (p = ((struct ppc_elf_dyn_relocs *)
4033                     elf_section_data (s)->local_dynrel);
4034                p != NULL;
4035                p = p->next)
4036             {
4037               if (!bfd_is_abs_section (p->sec)
4038                   && bfd_is_abs_section (p->sec->output_section))
4039                 {
4040                   /* Input section has been discarded, either because
4041                      it is a copy of a linkonce section or due to
4042                      linker script /DISCARD/, so we'll be discarding
4043                      the relocs too.  */
4044                 }
4045               else if (p->count != 0)
4046                 {
4047                   elf_section_data (p->sec)->sreloc->size
4048                     += p->count * sizeof (Elf32_External_Rela);
4049                   if ((p->sec->output_section->flags
4050                        & (SEC_READONLY | SEC_ALLOC))
4051                       == (SEC_READONLY | SEC_ALLOC))
4052                     info->flags |= DF_TEXTREL;
4053                 }
4054             }
4055         }
4056
4057       local_got = elf_local_got_refcounts (ibfd);
4058       if (!local_got)
4059         continue;
4060
4061       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4062       locsymcount = symtab_hdr->sh_info;
4063       end_local_got = local_got + locsymcount;
4064       lgot_masks = (char *) end_local_got;
4065       for (; local_got < end_local_got; ++local_got, ++lgot_masks)
4066         if (*local_got > 0)
4067           {
4068             if (*lgot_masks == (TLS_TLS | TLS_LD))
4069               {
4070                 /* If just an LD reloc, we'll just use
4071                    htab->tlsld_got.offset.  */
4072                 htab->tlsld_got.refcount += 1;
4073                 *local_got = (bfd_vma) -1;
4074               }
4075             else
4076               {
4077                 unsigned int need = 0;
4078                 if ((*lgot_masks & TLS_TLS) != 0)
4079                   {
4080                     if ((*lgot_masks & TLS_GD) != 0)
4081                       need += 8;
4082                     if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
4083                       need += 4;
4084                     if ((*lgot_masks & TLS_DTPREL) != 0)
4085                       need += 4;
4086                   }
4087                 else
4088                   need += 4;
4089                 *local_got = allocate_got (htab, need);
4090                 if (info->shared)
4091                   htab->relgot->size += (need
4092                                          * (sizeof (Elf32_External_Rela) / 4));
4093               }
4094           }
4095         else
4096           *local_got = (bfd_vma) -1;
4097     }
4098
4099   if (htab->tlsld_got.refcount > 0)
4100     {
4101       htab->tlsld_got.offset = allocate_got (htab, 8);
4102       if (info->shared)
4103         htab->relgot->size += sizeof (Elf32_External_Rela);
4104     }
4105   else
4106     htab->tlsld_got.offset = (bfd_vma) -1;
4107
4108   /* Allocate space for global sym dynamic relocs.  */
4109   elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
4110
4111   if (htab->got != NULL)
4112     {
4113       unsigned int g_o_t = 32768;
4114
4115       /* If we haven't allocated the header, do so now.  */
4116       if (htab->got->size <= 32768)
4117         {
4118           g_o_t = htab->got->size;
4119           htab->got->size += htab->got_header_size;
4120         }
4121       g_o_t += 4;
4122
4123       htab->elf.hgot->root.u.def.value = g_o_t;
4124     }
4125
4126   /* We've now determined the sizes of the various dynamic sections.
4127      Allocate memory for them.  */
4128   relocs = FALSE;
4129   for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
4130     {
4131       if ((s->flags & SEC_LINKER_CREATED) == 0)
4132         continue;
4133
4134       if (s == htab->plt
4135           || s == htab->got
4136           || s == htab->sbss)
4137         {
4138           /* Strip this section if we don't need it; see the
4139              comment below.  */
4140         }
4141       else if (s == htab->sdata[0].section
4142                || s == htab->sdata[1].section)
4143         {
4144           /* Strip these too.  */
4145         }
4146       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
4147         {
4148           if (s->size == 0)
4149             {
4150               /* If we don't need this section, strip it from the
4151                  output file.  This is mostly to handle .rela.bss and
4152                  .rela.plt.  We must create both sections in
4153                  create_dynamic_sections, because they must be created
4154                  before the linker maps input sections to output
4155                  sections.  The linker does that before
4156                  adjust_dynamic_symbol is called, and it is that
4157                  function which decides whether anything needs to go
4158                  into these sections.  */
4159             }
4160           else
4161             {
4162               /* Remember whether there are any relocation sections.  */
4163               relocs = TRUE;
4164
4165               /* We use the reloc_count field as a counter if we need
4166                  to copy relocs into the output file.  */
4167               s->reloc_count = 0;
4168             }
4169         }
4170       else
4171         {
4172           /* It's not one of our sections, so don't allocate space.  */
4173           continue;
4174         }
4175
4176       if (s->size == 0)
4177         {
4178           s->flags |= SEC_EXCLUDE;
4179           continue;
4180         }
4181
4182       if (s == htab->sbss)
4183         continue;
4184
4185       /* Allocate memory for the section contents.  */
4186       s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
4187       if (s->contents == NULL)
4188         return FALSE;
4189     }
4190
4191   if (htab->elf.dynamic_sections_created)
4192     {
4193       /* Add some entries to the .dynamic section.  We fill in the
4194          values later, in ppc_elf_finish_dynamic_sections, but we
4195          must add the entries now so that we get the correct size for
4196          the .dynamic section.  The DT_DEBUG entry is filled in by the
4197          dynamic linker and used by the debugger.  */
4198 #define add_dynamic_entry(TAG, VAL) \
4199   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
4200
4201       if (info->executable)
4202         {
4203           if (!add_dynamic_entry (DT_DEBUG, 0))
4204             return FALSE;
4205         }
4206
4207       if (htab->plt != NULL && htab->plt->size != 0)
4208         {
4209           if (!add_dynamic_entry (DT_PLTGOT, 0)
4210               || !add_dynamic_entry (DT_PLTRELSZ, 0)
4211               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
4212               || !add_dynamic_entry (DT_JMPREL, 0))
4213             return FALSE;
4214         }
4215
4216       if (relocs)
4217         {
4218           if (!add_dynamic_entry (DT_RELA, 0)
4219               || !add_dynamic_entry (DT_RELASZ, 0)
4220               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
4221             return FALSE;
4222         }
4223
4224       /* If any dynamic relocs apply to a read-only section, then we
4225          need a DT_TEXTREL entry.  */
4226       if ((info->flags & DF_TEXTREL) == 0)
4227         elf_link_hash_traverse (elf_hash_table (info), readonly_dynrelocs,
4228                                 info);
4229
4230       if ((info->flags & DF_TEXTREL) != 0)
4231         {
4232           if (!add_dynamic_entry (DT_TEXTREL, 0))
4233             return FALSE;
4234         }
4235     }
4236 #undef add_dynamic_entry
4237
4238   return TRUE;
4239 }
4240 \f
4241 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
4242
4243 static const int shared_stub_entry[] =
4244   {
4245     0x7c0802a6, /* mflr 0 */
4246     0x429f0005, /* bcl 20, 31, .Lxxx */
4247     0x7d6802a6, /* mflr 11 */
4248     0x3d6b0000, /* addis 11, 11, (xxx-.Lxxx)@ha */
4249     0x396b0018, /* addi 11, 11, (xxx-.Lxxx)@l */
4250     0x7c0803a6, /* mtlr 0 */
4251     0x7d6903a6, /* mtctr 11 */
4252     0x4e800420, /* bctr */
4253   };
4254
4255 static const int stub_entry[] =
4256   {
4257     0x3d600000, /* lis 11,xxx@ha */
4258     0x396b0000, /* addi 11,11,xxx@l */
4259     0x7d6903a6, /* mtctr 11 */
4260     0x4e800420, /* bctr */
4261   };
4262
4263 static bfd_boolean
4264 ppc_elf_relax_section (bfd *abfd,
4265                        asection *isec,
4266                        struct bfd_link_info *link_info,
4267                        bfd_boolean *again)
4268 {
4269   struct one_fixup
4270   {
4271     struct one_fixup *next;
4272     asection *tsec;
4273     bfd_vma toff;
4274     bfd_vma trampoff;
4275   };
4276
4277   Elf_Internal_Shdr *symtab_hdr;
4278   bfd_byte *contents = NULL;
4279   Elf_Internal_Sym *isymbuf = NULL;
4280   Elf_Internal_Rela *internal_relocs = NULL;
4281   Elf_Internal_Rela *irel, *irelend;
4282   struct one_fixup *fixups = NULL;
4283   bfd_boolean changed;
4284   struct ppc_elf_link_hash_table *ppc_info;
4285   bfd_size_type trampoff;
4286
4287   *again = FALSE;
4288
4289   /* Nothing to do if there are no relocations, and no need to do
4290      anything with non-alloc sections.  */
4291   if ((isec->flags & SEC_ALLOC) == 0
4292       || (isec->flags & SEC_RELOC) == 0
4293       || isec->reloc_count == 0)
4294     return TRUE;
4295
4296   trampoff = (isec->size + 3) & (bfd_vma) -4;
4297   /* Space for a branch around any trampolines.  */
4298   trampoff += 4;
4299
4300   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4301
4302   /* Get a copy of the native relocations.  */
4303   internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
4304                                                link_info->keep_memory);
4305   if (internal_relocs == NULL)
4306     goto error_return;
4307
4308   ppc_info = ppc_elf_hash_table (link_info);
4309   irelend = internal_relocs + isec->reloc_count;
4310
4311   for (irel = internal_relocs; irel < irelend; irel++)
4312     {
4313       unsigned long r_type = ELF32_R_TYPE (irel->r_info);
4314       bfd_vma symaddr, reladdr, toff, roff;
4315       asection *tsec;
4316       struct one_fixup *f;
4317       size_t insn_offset = 0;
4318       bfd_vma max_branch_offset, val;
4319       bfd_byte *hit_addr;
4320       unsigned long t0;
4321       unsigned char sym_type;
4322
4323       switch (r_type)
4324         {
4325         case R_PPC_REL24:
4326         case R_PPC_LOCAL24PC:
4327         case R_PPC_PLTREL24:
4328           max_branch_offset = 1 << 25;
4329           break;
4330
4331         case R_PPC_REL14:
4332         case R_PPC_REL14_BRTAKEN:
4333         case R_PPC_REL14_BRNTAKEN:
4334           max_branch_offset = 1 << 15;
4335           break;
4336
4337         default:
4338           continue;
4339         }
4340
4341       /* Get the value of the symbol referred to by the reloc.  */
4342       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
4343         {
4344           /* A local symbol.  */
4345           Elf_Internal_Sym *isym;
4346
4347           /* Read this BFD's local symbols.  */
4348           if (isymbuf == NULL)
4349             {
4350               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
4351               if (isymbuf == NULL)
4352                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
4353                                                 symtab_hdr->sh_info, 0,
4354                                                 NULL, NULL, NULL);
4355               if (isymbuf == 0)
4356                 goto error_return;
4357             }
4358           isym = isymbuf + ELF32_R_SYM (irel->r_info);
4359           if (isym->st_shndx == SHN_UNDEF)
4360             continue;   /* We can't do anything with undefined symbols.  */
4361           else if (isym->st_shndx == SHN_ABS)
4362             tsec = bfd_abs_section_ptr;
4363           else if (isym->st_shndx == SHN_COMMON)
4364             tsec = bfd_com_section_ptr;
4365           else
4366             tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
4367
4368           toff = isym->st_value;
4369           sym_type = ELF_ST_TYPE (isym->st_info);
4370         }
4371       else
4372         {
4373           /* Global symbol handling.  */
4374           unsigned long indx;
4375           struct elf_link_hash_entry *h;
4376
4377           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
4378           h = elf_sym_hashes (abfd)[indx];
4379
4380           while (h->root.type == bfd_link_hash_indirect
4381                  || h->root.type == bfd_link_hash_warning)
4382             h = (struct elf_link_hash_entry *) h->root.u.i.link;
4383
4384           if (r_type == R_PPC_PLTREL24
4385               && ppc_info->plt != NULL
4386               && h->plt.offset != (bfd_vma) -1)
4387             {
4388               tsec = ppc_info->plt;
4389               toff = h->plt.offset;
4390             }
4391           else if (h->root.type == bfd_link_hash_defined
4392                    || h->root.type == bfd_link_hash_defweak)
4393             {
4394               tsec = h->root.u.def.section;
4395               toff = h->root.u.def.value;
4396             }
4397           else
4398             continue;
4399
4400           sym_type = h->type;
4401         }
4402
4403       /* If the branch and target are in the same section, you have
4404          no hope of adding stubs.  We'll error out later should the
4405          branch overflow.  */
4406       if (tsec == isec)
4407         continue;
4408
4409       /* There probably isn't any reason to handle symbols in
4410          SEC_MERGE sections;  SEC_MERGE doesn't seem a likely
4411          attribute for a code section, and we are only looking at
4412          branches.  However, implement it correctly here as a
4413          reference for other target relax_section functions.  */
4414       if (0 && tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
4415         {
4416           /* At this stage in linking, no SEC_MERGE symbol has been
4417              adjusted, so all references to such symbols need to be
4418              passed through _bfd_merged_section_offset.  (Later, in
4419              relocate_section, all SEC_MERGE symbols *except* for
4420              section symbols have been adjusted.)
4421
4422              gas may reduce relocations against symbols in SEC_MERGE
4423              sections to a relocation against the section symbol when
4424              the original addend was zero.  When the reloc is against
4425              a section symbol we should include the addend in the
4426              offset passed to _bfd_merged_section_offset, since the
4427              location of interest is the original symbol.  On the
4428              other hand, an access to "sym+addend" where "sym" is not
4429              a section symbol should not include the addend;  Such an
4430              access is presumed to be an offset from "sym";  The
4431              location of interest is just "sym".  */
4432           if (sym_type == STT_SECTION)
4433             toff += irel->r_addend;
4434
4435           toff = _bfd_merged_section_offset (abfd, &tsec,
4436                                              elf_section_data (tsec)->sec_info,
4437                                              toff);
4438
4439           if (sym_type != STT_SECTION)
4440             toff += irel->r_addend;
4441         }
4442       else
4443         toff += irel->r_addend;
4444
4445       symaddr = tsec->output_section->vma + tsec->output_offset + toff;
4446
4447       roff = irel->r_offset;
4448       reladdr = isec->output_section->vma + isec->output_offset + roff;
4449
4450       /* If the branch is in range, no need to do anything.  */
4451       if (symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
4452         continue;
4453
4454       /* Look for an existing fixup to this address.  */
4455       for (f = fixups; f ; f = f->next)
4456         if (f->tsec == tsec && f->toff == toff)
4457           break;
4458
4459       if (f == NULL)
4460         {
4461           size_t size;
4462           unsigned long stub_rtype;
4463
4464           val = trampoff - roff;
4465           if (val >= max_branch_offset)
4466             /* Oh dear, we can't reach a trampoline.  Don't try to add
4467                one.  We'll report an error later.  */
4468             continue;
4469
4470           if (link_info->shared)
4471             {
4472               size = 4 * ARRAY_SIZE (shared_stub_entry);
4473               insn_offset = 12;
4474               stub_rtype = R_PPC_RELAX32PC;
4475             }
4476           else
4477             {
4478               size = 4 * ARRAY_SIZE (stub_entry);
4479               insn_offset = 0;
4480               stub_rtype = R_PPC_RELAX32;
4481             }
4482
4483           if (R_PPC_RELAX32_PLT - R_PPC_RELAX32
4484               != R_PPC_RELAX32PC_PLT - R_PPC_RELAX32PC)
4485             abort ();
4486           if (tsec == ppc_info->plt)
4487             stub_rtype += R_PPC_RELAX32_PLT - R_PPC_RELAX32;
4488
4489           /* Hijack the old relocation.  Since we need two
4490              relocations for this use a "composite" reloc.  */
4491           irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
4492                                        stub_rtype);
4493           irel->r_offset = trampoff + insn_offset;
4494
4495           /* Record the fixup so we don't do it again this section.  */
4496           f = bfd_malloc (sizeof (*f));
4497           f->next = fixups;
4498           f->tsec = tsec;
4499           f->toff = toff;
4500           f->trampoff = trampoff;
4501           fixups = f;
4502
4503           trampoff += size;
4504         }
4505       else
4506         {
4507           val = f->trampoff - roff;
4508           if (val >= max_branch_offset)
4509             continue;
4510
4511           /* Nop out the reloc, since we're finalizing things here.  */
4512           irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
4513         }
4514
4515       /* Get the section contents.  */
4516       if (contents == NULL)
4517         {
4518           /* Get cached copy if it exists.  */
4519           if (elf_section_data (isec)->this_hdr.contents != NULL)
4520             contents = elf_section_data (isec)->this_hdr.contents;
4521           else
4522             {
4523               /* Go get them off disk.  */
4524               if (!bfd_malloc_and_get_section (abfd, isec, &contents))
4525                 goto error_return;
4526             }
4527         }
4528
4529       /* Fix up the existing branch to hit the trampoline.  */
4530       hit_addr = contents + roff;
4531       switch (r_type)
4532         {
4533         case R_PPC_REL24:
4534         case R_PPC_LOCAL24PC:
4535         case R_PPC_PLTREL24:
4536           t0 = bfd_get_32 (abfd, hit_addr);
4537           t0 &= ~0x3fffffc;
4538           t0 |= val & 0x3fffffc;
4539           bfd_put_32 (abfd, t0, hit_addr);
4540           break;
4541
4542         case R_PPC_REL14:
4543         case R_PPC_REL14_BRTAKEN:
4544         case R_PPC_REL14_BRNTAKEN:
4545           t0 = bfd_get_32 (abfd, hit_addr);
4546           t0 &= ~0xfffc;
4547           t0 |= val & 0xfffc;
4548           bfd_put_32 (abfd, t0, hit_addr);
4549           break;
4550         }
4551     }
4552
4553   /* Write out the trampolines.  */
4554   changed = fixups != NULL;
4555   if (fixups != NULL)
4556     {
4557       const int *stub;
4558       bfd_byte *dest;
4559       bfd_vma val;
4560       int i, size;
4561
4562       do
4563         {
4564           struct one_fixup *f = fixups;
4565           fixups = fixups->next;
4566           free (f);
4567         }
4568       while (fixups);
4569
4570       contents = bfd_realloc (contents, trampoff);
4571       if (contents == NULL)
4572         goto error_return;
4573
4574       isec->size = (isec->size + 3) & (bfd_vma) -4;
4575       /* Branch around the trampolines.  */
4576       val = trampoff - isec->size + 0x48000000;
4577       dest = contents + isec->size;
4578       isec->size = trampoff;
4579       bfd_put_32 (abfd, val, dest);
4580       dest += 4;
4581
4582       if (link_info->shared)
4583         {
4584           stub = shared_stub_entry;
4585           size = ARRAY_SIZE (shared_stub_entry);
4586         }
4587       else
4588         {
4589           stub = stub_entry;
4590           size = ARRAY_SIZE (stub_entry);
4591         }
4592
4593       i = 0;
4594       while (dest < contents + trampoff)
4595         {
4596           bfd_put_32 (abfd, stub[i], dest);
4597           i++;
4598           if (i == size)
4599             i = 0;
4600           dest += 4;
4601         }
4602       BFD_ASSERT (i == 0);
4603     }
4604
4605   if (isymbuf != NULL
4606       && symtab_hdr->contents != (unsigned char *) isymbuf)
4607     {
4608       if (! link_info->keep_memory)
4609         free (isymbuf);
4610       else
4611         {
4612           /* Cache the symbols for elf_link_input_bfd.  */
4613           symtab_hdr->contents = (unsigned char *) isymbuf;
4614         }
4615     }
4616
4617   if (contents != NULL
4618       && elf_section_data (isec)->this_hdr.contents != contents)
4619     {
4620       if (!changed && !link_info->keep_memory)
4621         free (contents);
4622       else
4623         {
4624           /* Cache the section contents for elf_link_input_bfd.  */
4625           elf_section_data (isec)->this_hdr.contents = contents;
4626         }
4627     }
4628
4629   if (elf_section_data (isec)->relocs != internal_relocs)
4630     {
4631       if (!changed)
4632         free (internal_relocs);
4633       else
4634         elf_section_data (isec)->relocs = internal_relocs;
4635     }
4636
4637   *again = changed;
4638   return TRUE;
4639
4640  error_return:
4641   if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
4642     free (isymbuf);
4643   if (contents != NULL
4644       && elf_section_data (isec)->this_hdr.contents != contents)
4645     free (contents);
4646   if (internal_relocs != NULL
4647       && elf_section_data (isec)->relocs != internal_relocs)
4648     free (internal_relocs);
4649   return FALSE;
4650 }
4651 \f
4652 /* Set _SDA_BASE_, _SDA2_BASE, and sbss start and end syms.  They are
4653    set here rather than via PROVIDE in the default linker script,
4654    because using PROVIDE inside an output section statement results in
4655    unnecessary output sections.  Using PROVIDE outside an output section
4656    statement runs the risk of section alignment affecting where the
4657    section starts.  */
4658
4659 bfd_boolean
4660 ppc_elf_set_sdata_syms (bfd *obfd, struct bfd_link_info *info)
4661 {
4662   struct ppc_elf_link_hash_table *htab;
4663   unsigned i;
4664   asection *s;
4665   bfd_vma val;
4666
4667   htab = ppc_elf_hash_table (info);
4668
4669   for (i = 0; i < 2; i++)
4670     {
4671       elf_linker_section_t *lsect = &htab->sdata[i];
4672
4673       s = lsect->section;
4674       if (s != NULL)
4675         s = s->output_section;
4676       if (s == NULL)
4677         s = bfd_get_section_by_name (obfd, lsect->name);
4678       if (s == NULL)
4679         s = bfd_get_section_by_name (obfd, lsect->bss_name);
4680
4681       val = 0;
4682       if (s != NULL)
4683         val = s->vma + 32768;
4684       lsect->sym_val = val;
4685
4686       _bfd_elf_provide_symbol (info, lsect->sym_name, val);
4687     }
4688
4689   s = bfd_get_section_by_name (obfd, ".sbss");
4690   val = 0;
4691   if (s != NULL)
4692     val = s->vma;
4693   _bfd_elf_provide_symbol (info, "__sbss_start", val);
4694   _bfd_elf_provide_symbol (info, "___sbss_start", val);
4695   if (s != NULL)
4696     val += s->size;
4697   _bfd_elf_provide_symbol (info, "__sbss_end", val);
4698   _bfd_elf_provide_symbol (info, "___sbss_end", val);
4699   return TRUE;
4700 }
4701 \f
4702 /* Fill in the address for a pointer generated in a linker section.  */
4703
4704 static bfd_vma
4705 elf_finish_pointer_linker_section (bfd *input_bfd,
4706                                    elf_linker_section_t *lsect,
4707                                    struct elf_link_hash_entry *h,
4708                                    bfd_vma relocation,
4709                                    const Elf_Internal_Rela *rel)
4710 {
4711   elf_linker_section_pointers_t *linker_section_ptr;
4712
4713   BFD_ASSERT (lsect != NULL);
4714
4715   if (h != NULL)
4716     {
4717       /* Handle global symbol.  */
4718       struct ppc_elf_link_hash_entry *eh;
4719
4720       eh = (struct ppc_elf_link_hash_entry *) h;
4721       BFD_ASSERT (eh->elf.def_regular);
4722       linker_section_ptr = eh->linker_section_pointer;
4723     }
4724   else
4725     {
4726       /* Handle local symbol.  */
4727       unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
4728
4729       BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
4730       linker_section_ptr = elf_local_ptr_offsets (input_bfd)[r_symndx];
4731     }
4732
4733   linker_section_ptr = elf_find_pointer_linker_section (linker_section_ptr,
4734                                                         rel->r_addend,
4735                                                         lsect);
4736   BFD_ASSERT (linker_section_ptr != NULL);
4737
4738   /* Offset will always be a multiple of four, so use the bottom bit
4739      as a "written" flag.  */
4740   if ((linker_section_ptr->offset & 1) == 0)
4741     {
4742       bfd_put_32 (lsect->section->owner,
4743                   relocation + linker_section_ptr->addend,
4744                   lsect->section->contents + linker_section_ptr->offset);
4745       linker_section_ptr->offset += 1;
4746     }
4747
4748   relocation = (lsect->section->output_offset
4749                 + linker_section_ptr->offset - 1
4750                 - 0x8000);
4751
4752 #ifdef DEBUG
4753   fprintf (stderr,
4754            "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
4755            lsect->name, (long) relocation, (long) relocation);
4756 #endif
4757
4758   /* Subtract out the addend, because it will get added back in by the normal
4759      processing.  */
4760   return relocation - linker_section_ptr->addend;
4761 }
4762
4763 /* The RELOCATE_SECTION function is called by the ELF backend linker
4764    to handle the relocations for a section.
4765
4766    The relocs are always passed as Rela structures; if the section
4767    actually uses Rel structures, the r_addend field will always be
4768    zero.
4769
4770    This function is responsible for adjust the section contents as
4771    necessary, and (if using Rela relocs and generating a
4772    relocatable output file) adjusting the reloc addend as
4773    necessary.
4774
4775    This function does not have to worry about setting the reloc
4776    address or the reloc symbol index.
4777
4778    LOCAL_SYMS is a pointer to the swapped in local symbols.
4779
4780    LOCAL_SECTIONS is an array giving the section in the input file
4781    corresponding to the st_shndx field of each local symbol.
4782
4783    The global hash table entry for the global symbols can be found
4784    via elf_sym_hashes (input_bfd).
4785
4786    When generating relocatable output, this function must handle
4787    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
4788    going to be the section symbol corresponding to the output
4789    section, which means that the addend must be adjusted
4790    accordingly.  */
4791
4792 static bfd_boolean
4793 ppc_elf_relocate_section (bfd *output_bfd,
4794                           struct bfd_link_info *info,
4795                           bfd *input_bfd,
4796                           asection *input_section,
4797                           bfd_byte *contents,
4798                           Elf_Internal_Rela *relocs,
4799                           Elf_Internal_Sym *local_syms,
4800                           asection **local_sections)
4801 {
4802   Elf_Internal_Shdr *symtab_hdr;
4803   struct elf_link_hash_entry **sym_hashes;
4804   struct ppc_elf_link_hash_table *htab;
4805   Elf_Internal_Rela *rel;
4806   Elf_Internal_Rela *relend;
4807   Elf_Internal_Rela outrel;
4808   bfd_byte *loc;
4809   asection *sreloc = NULL;
4810   bfd_vma *local_got_offsets;
4811   bfd_boolean ret = TRUE;
4812
4813 #ifdef DEBUG
4814   _bfd_error_handler ("ppc_elf_relocate_section called for %B section %A, "
4815                       "%ld relocations%s",
4816                       input_bfd, input_section,
4817                       (long) input_section->reloc_count,
4818                       (info->relocatable) ? " (relocatable)" : "");
4819 #endif
4820
4821   if (info->relocatable)
4822     return TRUE;
4823
4824   /* Initialize howto table if not already done.  */
4825   if (!ppc_elf_howto_table[R_PPC_ADDR32])
4826     ppc_elf_howto_init ();
4827
4828   htab = ppc_elf_hash_table (info);
4829   local_got_offsets = elf_local_got_offsets (input_bfd);
4830   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4831   sym_hashes = elf_sym_hashes (input_bfd);
4832   rel = relocs;
4833   relend = relocs + input_section->reloc_count;
4834   for (; rel < relend; rel++)
4835     {
4836       enum elf_ppc_reloc_type r_type;
4837       bfd_vma addend;
4838       bfd_reloc_status_type r;
4839       Elf_Internal_Sym *sym;
4840       asection *sec;
4841       struct elf_link_hash_entry *h;
4842       const char *sym_name;
4843       reloc_howto_type *howto;
4844       unsigned long r_symndx;
4845       bfd_vma relocation;
4846       bfd_vma branch_bit, insn, from;
4847       bfd_boolean unresolved_reloc;
4848       bfd_boolean warned;
4849       unsigned int tls_type, tls_mask, tls_gd;
4850
4851       r_type = ELF32_R_TYPE (rel->r_info);
4852       sym = NULL;
4853       sec = NULL;
4854       h = NULL;
4855       unresolved_reloc = FALSE;
4856       warned = FALSE;
4857       r_symndx = ELF32_R_SYM (rel->r_info);
4858
4859       if (r_symndx < symtab_hdr->sh_info)
4860         {
4861           sym = local_syms + r_symndx;
4862           sec = local_sections[r_symndx];
4863           sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
4864
4865           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4866         }
4867       else
4868         {
4869           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4870                                    r_symndx, symtab_hdr, sym_hashes,
4871                                    h, sec, relocation,
4872                                    unresolved_reloc, warned);
4873
4874           sym_name = h->root.root.string;
4875         }
4876
4877       /* TLS optimizations.  Replace instruction sequences and relocs
4878          based on information we collected in tls_optimize.  We edit
4879          RELOCS so that --emit-relocs will output something sensible
4880          for the final instruction stream.  */
4881       tls_mask = 0;
4882       tls_gd = 0;
4883       if (IS_PPC_TLS_RELOC (r_type))
4884         {
4885           if (h != NULL)
4886             tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
4887           else if (local_got_offsets != NULL)
4888             {
4889               char *lgot_masks;
4890               lgot_masks = (char *) (local_got_offsets + symtab_hdr->sh_info);
4891               tls_mask = lgot_masks[r_symndx];
4892             }
4893         }
4894
4895       /* Ensure reloc mapping code below stays sane.  */
4896       if ((R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TLSGD16 & 3)
4897           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
4898           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
4899           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
4900           || (R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TPREL16 & 3)
4901           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
4902           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
4903           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
4904         abort ();
4905       switch (r_type)
4906         {
4907         default:
4908           break;
4909
4910         case R_PPC_GOT_TPREL16:
4911         case R_PPC_GOT_TPREL16_LO:
4912           if (tls_mask != 0
4913               && (tls_mask & TLS_TPREL) == 0)
4914             {
4915               bfd_vma insn;
4916               insn = bfd_get_32 (output_bfd, contents + rel->r_offset - 2);
4917               insn &= 31 << 21;
4918               insn |= 0x3c020000;       /* addis 0,2,0 */
4919               bfd_put_32 (output_bfd, insn, contents + rel->r_offset - 2);
4920               r_type = R_PPC_TPREL16_HA;
4921               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4922             }
4923           break;
4924
4925         case R_PPC_TLS:
4926           if (tls_mask != 0
4927               && (tls_mask & TLS_TPREL) == 0)
4928             {
4929               bfd_vma insn, rtra;
4930               insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
4931               if ((insn & ((31 << 26) | (31 << 11)))
4932                   == ((31 << 26) | (2 << 11)))
4933                 rtra = insn & ((1 << 26) - (1 << 16));
4934               else if ((insn & ((31 << 26) | (31 << 16)))
4935                        == ((31 << 26) | (2 << 16)))
4936                 rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
4937               else
4938                 abort ();
4939               if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
4940                 /* add -> addi.  */
4941                 insn = 14 << 26;
4942               else if ((insn & (31 << 1)) == 23 << 1
4943                        && ((insn & (31 << 6)) < 14 << 6
4944                            || ((insn & (31 << 6)) >= 16 << 6
4945                                && (insn & (31 << 6)) < 24 << 6)))
4946                 /* load and store indexed -> dform.  */
4947                 insn = (32 | ((insn >> 6) & 31)) << 26;
4948               else if ((insn & (31 << 1)) == 21 << 1
4949                        && (insn & (0x1a << 6)) == 0)
4950                 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
4951                 insn = (((58 | ((insn >> 6) & 4)) << 26)
4952                         | ((insn >> 6) & 1));
4953               else if ((insn & (31 << 1)) == 21 << 1
4954                        && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
4955                 /* lwax -> lwa.  */
4956                 insn = (58 << 26) | 2;
4957               else
4958                 abort ();
4959               insn |= rtra;
4960               bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
4961               r_type = R_PPC_TPREL16_LO;
4962               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4963               /* Was PPC_TLS which sits on insn boundary, now
4964                  PPC_TPREL16_LO which is at insn+2.  */
4965               rel->r_offset += 2;
4966             }
4967           break;
4968
4969         case R_PPC_GOT_TLSGD16_HI:
4970         case R_PPC_GOT_TLSGD16_HA:
4971           tls_gd = TLS_TPRELGD;
4972           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
4973             goto tls_gdld_hi;
4974           break;
4975
4976         case R_PPC_GOT_TLSLD16_HI:
4977         case R_PPC_GOT_TLSLD16_HA:
4978           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
4979             {
4980             tls_gdld_hi:
4981               if ((tls_mask & tls_gd) != 0)
4982                 r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
4983                           + R_PPC_GOT_TPREL16);
4984               else
4985                 {
4986                   bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
4987                   rel->r_offset -= 2;
4988                   r_type = R_PPC_NONE;
4989                 }
4990               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4991             }
4992           break;
4993
4994         case R_PPC_GOT_TLSGD16:
4995         case R_PPC_GOT_TLSGD16_LO:
4996           tls_gd = TLS_TPRELGD;
4997           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
4998             goto tls_get_addr_check;
4999           break;
5000
5001         case R_PPC_GOT_TLSLD16:
5002         case R_PPC_GOT_TLSLD16_LO:
5003           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
5004             {
5005             tls_get_addr_check:
5006               if (rel + 1 < relend)
5007                 {
5008                   enum elf_ppc_reloc_type r_type2;
5009                   unsigned long r_symndx2;
5010                   struct elf_link_hash_entry *h2;
5011                   bfd_vma insn1, insn2;
5012                   bfd_vma offset;
5013
5014                   /* The next instruction should be a call to
5015                      __tls_get_addr.  Peek at the reloc to be sure.  */
5016                   r_type2 = ELF32_R_TYPE (rel[1].r_info);
5017                   r_symndx2 = ELF32_R_SYM (rel[1].r_info);
5018                   if (r_symndx2 < symtab_hdr->sh_info
5019                       || (r_type2 != R_PPC_REL14
5020                           && r_type2 != R_PPC_REL14_BRTAKEN
5021                           && r_type2 != R_PPC_REL14_BRNTAKEN
5022                           && r_type2 != R_PPC_REL24
5023                           && r_type2 != R_PPC_PLTREL24))
5024                     break;
5025
5026                   h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
5027                   while (h2->root.type == bfd_link_hash_indirect
5028                          || h2->root.type == bfd_link_hash_warning)
5029                     h2 = (struct elf_link_hash_entry *) h2->root.u.i.link;
5030                   if (h2 == NULL || h2 != htab->tls_get_addr)
5031                     break;
5032
5033                   /* OK, it checks out.  Replace the call.  */
5034                   offset = rel[1].r_offset;
5035                   insn1 = bfd_get_32 (output_bfd,
5036                                       contents + rel->r_offset - 2);
5037                   if ((tls_mask & tls_gd) != 0)
5038                     {
5039                       /* IE */
5040                       insn1 &= (1 << 26) - 1;
5041                       insn1 |= 32 << 26;        /* lwz */
5042                       insn2 = 0x7c631214;       /* add 3,3,2 */
5043                       rel[1].r_info = ELF32_R_INFO (r_symndx2, R_PPC_NONE);
5044                       r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
5045                                 + R_PPC_GOT_TPREL16);
5046                       rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5047                     }
5048                   else
5049                     {
5050                       /* LE */
5051                       insn1 = 0x3c620000;       /* addis 3,2,0 */
5052                       insn2 = 0x38630000;       /* addi 3,3,0 */
5053                       if (tls_gd == 0)
5054                         {
5055                           /* Was an LD reloc.  */
5056                           r_symndx = 0;
5057                           rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
5058                           rel[1].r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
5059                         }
5060                       r_type = R_PPC_TPREL16_HA;
5061                       rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5062                       rel[1].r_info = ELF32_R_INFO (r_symndx,
5063                                                     R_PPC_TPREL16_LO);
5064                       rel[1].r_offset += 2;
5065                     }
5066                   bfd_put_32 (output_bfd, insn1, contents + rel->r_offset - 2);
5067                   bfd_put_32 (output_bfd, insn2, contents + offset);
5068                   if (tls_gd == 0)
5069                     {
5070                       /* We changed the symbol on an LD reloc.  Start over
5071                          in order to get h, sym, sec etc. right.  */
5072                       rel--;
5073                       continue;
5074                     }
5075                 }
5076             }
5077           break;
5078         }
5079
5080       /* Handle other relocations that tweak non-addend part of insn.  */
5081       branch_bit = 0;
5082       switch (r_type)
5083         {
5084         default:
5085           break;
5086
5087           /* Branch taken prediction relocations.  */
5088         case R_PPC_ADDR14_BRTAKEN:
5089         case R_PPC_REL14_BRTAKEN:
5090           branch_bit = BRANCH_PREDICT_BIT;
5091           /* Fall thru */
5092
5093           /* Branch not taken prediction relocations.  */
5094         case R_PPC_ADDR14_BRNTAKEN:
5095         case R_PPC_REL14_BRNTAKEN:
5096           insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
5097           insn &= ~BRANCH_PREDICT_BIT;
5098           insn |= branch_bit;
5099
5100           from = (rel->r_offset
5101                   + input_section->output_offset
5102                   + input_section->output_section->vma);
5103
5104           /* Invert 'y' bit if not the default.  */
5105           if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
5106             insn ^= BRANCH_PREDICT_BIT;
5107
5108           bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5109           break;
5110         }
5111
5112       addend = rel->r_addend;
5113       tls_type = 0;
5114       howto = NULL;
5115       if (r_type < R_PPC_max)
5116         howto = ppc_elf_howto_table[r_type];
5117       switch (r_type)
5118         {
5119         default:
5120           (*_bfd_error_handler)
5121             (_("%B: unknown relocation type %d for symbol %s"),
5122              input_bfd, (int) r_type, sym_name);
5123
5124           bfd_set_error (bfd_error_bad_value);
5125           ret = FALSE;
5126           continue;
5127
5128         case R_PPC_NONE:
5129         case R_PPC_TLS:
5130         case R_PPC_EMB_MRKREF:
5131         case R_PPC_GNU_VTINHERIT:
5132         case R_PPC_GNU_VTENTRY:
5133           continue;
5134
5135           /* GOT16 relocations.  Like an ADDR16 using the symbol's
5136              address in the GOT as relocation value instead of the
5137              symbol's value itself.  Also, create a GOT entry for the
5138              symbol and put the symbol value there.  */
5139         case R_PPC_GOT_TLSGD16:
5140         case R_PPC_GOT_TLSGD16_LO:
5141         case R_PPC_GOT_TLSGD16_HI:
5142         case R_PPC_GOT_TLSGD16_HA:
5143           tls_type = TLS_TLS | TLS_GD;
5144           goto dogot;
5145
5146         case R_PPC_GOT_TLSLD16:
5147         case R_PPC_GOT_TLSLD16_LO:
5148         case R_PPC_GOT_TLSLD16_HI:
5149         case R_PPC_GOT_TLSLD16_HA:
5150           tls_type = TLS_TLS | TLS_LD;
5151           goto dogot;
5152
5153         case R_PPC_GOT_TPREL16:
5154         case R_PPC_GOT_TPREL16_LO:
5155         case R_PPC_GOT_TPREL16_HI:
5156         case R_PPC_GOT_TPREL16_HA:
5157           tls_type = TLS_TLS | TLS_TPREL;
5158           goto dogot;
5159
5160         case R_PPC_GOT_DTPREL16:
5161         case R_PPC_GOT_DTPREL16_LO:
5162         case R_PPC_GOT_DTPREL16_HI:
5163         case R_PPC_GOT_DTPREL16_HA:
5164           tls_type = TLS_TLS | TLS_DTPREL;
5165           goto dogot;
5166
5167         case R_PPC_GOT16:
5168         case R_PPC_GOT16_LO:
5169         case R_PPC_GOT16_HI:
5170         case R_PPC_GOT16_HA:
5171         dogot:
5172           {
5173             /* Relocation is to the entry for this symbol in the global
5174                offset table.  */
5175             bfd_vma off;
5176             bfd_vma *offp;
5177             unsigned long indx;
5178
5179             if (htab->got == NULL)
5180               abort ();
5181
5182             indx = 0;
5183             if (tls_type == (TLS_TLS | TLS_LD)
5184                 && (h == NULL
5185                     || !h->def_dynamic))
5186               offp = &htab->tlsld_got.offset;
5187             else if (h != NULL)
5188               {
5189                 bfd_boolean dyn;
5190                 dyn = htab->elf.dynamic_sections_created;
5191                 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
5192                     || (info->shared
5193                         && SYMBOL_REFERENCES_LOCAL (info, h)))
5194                   /* This is actually a static link, or it is a
5195                      -Bsymbolic link and the symbol is defined
5196                      locally, or the symbol was forced to be local
5197                      because of a version file.  */
5198                   ;
5199                 else
5200                   {
5201                     indx = h->dynindx;
5202                     unresolved_reloc = FALSE;
5203                   }
5204                 offp = &h->got.offset;
5205               }
5206             else
5207               {
5208                 if (local_got_offsets == NULL)
5209                   abort ();
5210                 offp = &local_got_offsets[r_symndx];
5211               }
5212
5213             /* The offset must always be a multiple of 4.  We use the
5214                least significant bit to record whether we have already
5215                processed this entry.  */
5216             off = *offp;
5217             if ((off & 1) != 0)
5218               off &= ~1;
5219             else
5220               {
5221                 unsigned int tls_m = (tls_mask
5222                                       & (TLS_LD | TLS_GD | TLS_DTPREL
5223                                          | TLS_TPREL | TLS_TPRELGD));
5224
5225                 if (offp == &htab->tlsld_got.offset)
5226                   tls_m = TLS_LD;
5227                 else if (h == NULL
5228                          || !h->def_dynamic)
5229                   tls_m &= ~TLS_LD;
5230
5231                 /* We might have multiple got entries for this sym.
5232                    Initialize them all.  */
5233                 do
5234                   {
5235                     int tls_ty = 0;
5236
5237                     if ((tls_m & TLS_LD) != 0)
5238                       {
5239                         tls_ty = TLS_TLS | TLS_LD;
5240                         tls_m &= ~TLS_LD;
5241                       }
5242                     else if ((tls_m & TLS_GD) != 0)
5243                       {
5244                         tls_ty = TLS_TLS | TLS_GD;
5245                         tls_m &= ~TLS_GD;
5246                       }
5247                     else if ((tls_m & TLS_DTPREL) != 0)
5248                       {
5249                         tls_ty = TLS_TLS | TLS_DTPREL;
5250                         tls_m &= ~TLS_DTPREL;
5251                       }
5252                     else if ((tls_m & (TLS_TPREL | TLS_TPRELGD)) != 0)
5253                       {
5254                         tls_ty = TLS_TLS | TLS_TPREL;
5255                         tls_m = 0;
5256                       }
5257
5258                     /* Generate relocs for the dynamic linker.  */
5259                     if ((info->shared || indx != 0)
5260                         && (h == NULL
5261                             || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5262                             || h->root.type != bfd_link_hash_undefweak))
5263                       {
5264                         outrel.r_offset = (htab->got->output_section->vma
5265                                            + htab->got->output_offset
5266                                            + off);
5267                         outrel.r_addend = 0;
5268                         if (tls_ty & (TLS_LD | TLS_GD))
5269                           {
5270                             outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
5271                             if (tls_ty == (TLS_TLS | TLS_GD))
5272                               {
5273                                 loc = htab->relgot->contents;
5274                                 loc += (htab->relgot->reloc_count++
5275                                         * sizeof (Elf32_External_Rela));
5276                                 bfd_elf32_swap_reloca_out (output_bfd,
5277                                                            &outrel, loc);
5278                                 outrel.r_offset += 4;
5279                                 outrel.r_info
5280                                   = ELF32_R_INFO (indx, R_PPC_DTPREL32);
5281                               }
5282                           }
5283                         else if (tls_ty == (TLS_TLS | TLS_DTPREL))
5284                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
5285                         else if (tls_ty == (TLS_TLS | TLS_TPREL))
5286                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
5287                         else if (indx == 0)
5288                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_RELATIVE);
5289                         else
5290                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
5291                         if (indx == 0)
5292                           {
5293                             outrel.r_addend += relocation;
5294                             if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
5295                               outrel.r_addend -= htab->elf.tls_sec->vma;
5296                           }
5297                         loc = htab->relgot->contents;
5298                         loc += (htab->relgot->reloc_count++
5299                                 * sizeof (Elf32_External_Rela));
5300                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5301                       }
5302
5303                     /* Init the .got section contents if we're not
5304                        emitting a reloc.  */
5305                     else
5306                       {
5307                         bfd_vma value = relocation;
5308
5309                         if (tls_ty == (TLS_TLS | TLS_LD))
5310                           value = 1;
5311                         else if (tls_ty != 0)
5312                           {
5313                             value -= htab->elf.tls_sec->vma + DTP_OFFSET;
5314                             if (tls_ty == (TLS_TLS | TLS_TPREL))
5315                               value += DTP_OFFSET - TP_OFFSET;
5316
5317                             if (tls_ty == (TLS_TLS | TLS_GD))
5318                               {
5319                                 bfd_put_32 (output_bfd, value,
5320                                             htab->got->contents + off + 4);
5321                                 value = 1;
5322                               }
5323                           }
5324                         bfd_put_32 (output_bfd, value,
5325                                     htab->got->contents + off);
5326                       }
5327
5328                     off += 4;
5329                     if (tls_ty & (TLS_LD | TLS_GD))
5330                       off += 4;
5331                   }
5332                 while (tls_m != 0);
5333
5334                 off = *offp;
5335                 *offp = off | 1;
5336               }
5337
5338             if (off >= (bfd_vma) -2)
5339               abort ();
5340
5341             if ((tls_type & TLS_TLS) != 0)
5342               {
5343                 if (tls_type != (TLS_TLS | TLS_LD))
5344                   {
5345                     if ((tls_mask & TLS_LD) != 0
5346                         && !(h == NULL
5347                              || !h->def_dynamic))
5348                       off += 8;
5349                     if (tls_type != (TLS_TLS | TLS_GD))
5350                       {
5351                         if ((tls_mask & TLS_GD) != 0)
5352                           off += 8;
5353                         if (tls_type != (TLS_TLS | TLS_DTPREL))
5354                           {
5355                             if ((tls_mask & TLS_DTPREL) != 0)
5356                               off += 4;
5357                           }
5358                       }
5359                   }
5360               }
5361
5362             relocation = htab->got->output_offset + off;
5363             relocation -= htab->elf.hgot->root.u.def.value;
5364
5365             /* Addends on got relocations don't make much sense.
5366                x+off@got is actually x@got+off, and since the got is
5367                generated by a hash table traversal, the value in the
5368                got at entry m+n bears little relation to the entry m.  */
5369             if (addend != 0)
5370               (*_bfd_error_handler)
5371                 (_("%B(%A+0x%lx): non-zero addend on %s reloc against `%s'"),
5372                  input_bfd,
5373                  input_section,
5374                  (long) rel->r_offset,
5375                  howto->name,
5376                  sym_name);
5377           }
5378         break;
5379
5380         /* Relocations that need no special processing.  */
5381         case R_PPC_LOCAL24PC:
5382           /* It makes no sense to point a local relocation
5383              at a symbol not in this object.  */
5384           if (unresolved_reloc)
5385             {
5386               if (! (*info->callbacks->undefined_symbol) (info,
5387                                                           h->root.root.string,
5388                                                           input_bfd,
5389                                                           input_section,
5390                                                           rel->r_offset,
5391                                                           TRUE))
5392                 return FALSE;
5393               continue;
5394             }
5395           break;
5396
5397         case R_PPC_DTPREL16:
5398         case R_PPC_DTPREL16_LO:
5399         case R_PPC_DTPREL16_HI:
5400         case R_PPC_DTPREL16_HA:
5401           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
5402           break;
5403
5404           /* Relocations that may need to be propagated if this is a shared
5405              object.  */
5406         case R_PPC_TPREL16:
5407         case R_PPC_TPREL16_LO:
5408         case R_PPC_TPREL16_HI:
5409         case R_PPC_TPREL16_HA:
5410           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
5411           /* The TPREL16 relocs shouldn't really be used in shared
5412              libs as they will result in DT_TEXTREL being set, but
5413              support them anyway.  */
5414           goto dodyn;
5415
5416         case R_PPC_TPREL32:
5417           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
5418           goto dodyn;
5419
5420         case R_PPC_DTPREL32:
5421           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
5422           goto dodyn;
5423
5424         case R_PPC_DTPMOD32:
5425           relocation = 1;
5426           addend = 0;
5427           goto dodyn;
5428
5429         case R_PPC_REL24:
5430         case R_PPC_REL32:
5431         case R_PPC_REL14:
5432         case R_PPC_REL14_BRTAKEN:
5433         case R_PPC_REL14_BRNTAKEN:
5434           /* If these relocations are not to a named symbol, they can be
5435              handled right here, no need to bother the dynamic linker.  */
5436           if (SYMBOL_REFERENCES_LOCAL (info, h)
5437               || h == htab->elf.hgot)
5438             break;
5439           /* fall through */
5440
5441           /* Relocations that always need to be propagated if this is a shared
5442              object.  */
5443         case R_PPC_ADDR32:
5444         case R_PPC_ADDR24:
5445         case R_PPC_ADDR16:
5446         case R_PPC_ADDR16_LO:
5447         case R_PPC_ADDR16_HI:
5448         case R_PPC_ADDR16_HA:
5449         case R_PPC_ADDR14:
5450         case R_PPC_ADDR14_BRTAKEN:
5451         case R_PPC_ADDR14_BRNTAKEN:
5452         case R_PPC_UADDR32:
5453         case R_PPC_UADDR16:
5454           /* r_symndx will be zero only for relocs against symbols
5455              from removed linkonce sections, or sections discarded by
5456              a linker script.  */
5457         dodyn:
5458           if (r_symndx == 0)
5459             break;
5460           /* Fall thru.  */
5461
5462           if ((input_section->flags & SEC_ALLOC) == 0)
5463             break;
5464           /* Fall thru.  */
5465
5466           if ((info->shared
5467                && (h == NULL
5468                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5469                    || h->root.type != bfd_link_hash_undefweak)
5470                && (MUST_BE_DYN_RELOC (r_type)
5471                    || !SYMBOL_CALLS_LOCAL (info, h)))
5472               || (ELIMINATE_COPY_RELOCS
5473                   && !info->shared
5474                   && h != NULL
5475                   && h->dynindx != -1
5476                   && !h->non_got_ref
5477                   && h->def_dynamic
5478                   && !h->def_regular))
5479             {
5480               int skip;
5481
5482 #ifdef DEBUG
5483               fprintf (stderr, "ppc_elf_relocate_section needs to "
5484                        "create relocation for %s\n",
5485                        (h && h->root.root.string
5486                         ? h->root.root.string : "<unknown>"));
5487 #endif
5488
5489               /* When generating a shared object, these relocations
5490                  are copied into the output file to be resolved at run
5491                  time.  */
5492               if (sreloc == NULL)
5493                 {
5494                   const char *name;
5495
5496                   name = (bfd_elf_string_from_elf_section
5497                           (input_bfd,
5498                            elf_elfheader (input_bfd)->e_shstrndx,
5499                            elf_section_data (input_section)->rel_hdr.sh_name));
5500                   if (name == NULL)
5501                     return FALSE;
5502
5503                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
5504                               && strcmp (bfd_get_section_name (input_bfd,
5505                                                                input_section),
5506                                          name + 5) == 0);
5507
5508                   sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
5509                   BFD_ASSERT (sreloc != NULL);
5510                 }
5511
5512               skip = 0;
5513
5514               outrel.r_offset =
5515                 _bfd_elf_section_offset (output_bfd, info, input_section,
5516                                          rel->r_offset);
5517               if (outrel.r_offset == (bfd_vma) -1
5518                   || outrel.r_offset == (bfd_vma) -2)
5519                 skip = (int) outrel.r_offset;
5520               outrel.r_offset += (input_section->output_section->vma
5521                                   + input_section->output_offset);
5522
5523               if (skip)
5524                 memset (&outrel, 0, sizeof outrel);
5525               else if (!SYMBOL_REFERENCES_LOCAL (info, h))
5526                 {
5527                   unresolved_reloc = FALSE;
5528                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
5529                   outrel.r_addend = rel->r_addend;
5530                 }
5531               else
5532                 {
5533                   outrel.r_addend = relocation + rel->r_addend;
5534
5535                   if (r_type == R_PPC_ADDR32)
5536                     outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
5537                   else
5538                     {
5539                       long indx;
5540
5541                       if (bfd_is_abs_section (sec))
5542                         indx = 0;
5543                       else if (sec == NULL || sec->owner == NULL)
5544                         {
5545                           bfd_set_error (bfd_error_bad_value);
5546                           return FALSE;
5547                         }
5548                       else
5549                         {
5550                           asection *osec;
5551
5552                           /* We are turning this relocation into one
5553                              against a section symbol.  It would be
5554                              proper to subtract the symbol's value,
5555                              osec->vma, from the emitted reloc addend,
5556                              but ld.so expects buggy relocs.  */
5557                           osec = sec->output_section;
5558                           indx = elf_section_data (osec)->dynindx;
5559                           BFD_ASSERT (indx > 0);
5560 #ifdef DEBUG
5561                           if (indx <= 0)
5562                             printf ("indx=%d section=%s flags=%08x name=%s\n",
5563                                     indx, osec->name, osec->flags,
5564                                     h->root.root.string);
5565 #endif
5566                         }
5567
5568                       outrel.r_info = ELF32_R_INFO (indx, r_type);
5569                     }
5570                 }
5571
5572               loc = sreloc->contents;
5573               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
5574               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5575
5576               if (skip == -1)
5577                 continue;
5578
5579               /* This reloc will be computed at runtime.  We clear the memory
5580                  so that it contains predictable value.  */
5581               if (! skip
5582                   && ((input_section->flags & SEC_ALLOC) != 0
5583                       || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
5584                 {
5585                   relocation = howto->pc_relative ? outrel.r_offset : 0;
5586                   addend = 0;
5587                   break;
5588                 }
5589             }
5590           break;
5591
5592         case R_PPC_RELAX32PC_PLT:
5593         case R_PPC_RELAX32_PLT:
5594           BFD_ASSERT (h != NULL
5595                       && h->plt.offset != (bfd_vma) -1
5596                       && htab->plt != NULL);
5597
5598           relocation = (htab->plt->output_section->vma
5599                         + htab->plt->output_offset
5600                         + h->plt.offset);
5601           if (r_type == R_PPC_RELAX32_PLT)
5602             goto relax32;
5603           /* Fall thru */
5604
5605         case R_PPC_RELAX32PC:
5606           relocation -= (input_section->output_section->vma
5607                          + input_section->output_offset
5608                          + rel->r_offset - 4);
5609           /* Fall thru */
5610
5611         case R_PPC_RELAX32:
5612         relax32:
5613           {
5614             unsigned long t0;
5615             unsigned long t1;
5616
5617             t0 = bfd_get_32 (output_bfd, contents + rel->r_offset);
5618             t1 = bfd_get_32 (output_bfd, contents + rel->r_offset + 4);
5619
5620             /* We're clearing the bits for R_PPC_ADDR16_HA
5621                and R_PPC_ADDR16_LO here.  */
5622             t0 &= ~0xffff;
5623             t1 &= ~0xffff;
5624
5625             /* t0 is HA, t1 is LO */
5626             relocation += addend;
5627             t0 |= ((relocation + 0x8000) >> 16) & 0xffff;
5628             t1 |= relocation & 0xffff;
5629
5630             bfd_put_32 (output_bfd, t0, contents + rel->r_offset);
5631             bfd_put_32 (output_bfd, t1, contents + rel->r_offset + 4);
5632           }
5633           continue;
5634
5635           /* Indirect .sdata relocation.  */
5636         case R_PPC_EMB_SDAI16:
5637           BFD_ASSERT (htab->sdata[0].section != NULL);
5638           relocation
5639             = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[0],
5640                                                  h, relocation, rel);
5641           break;
5642
5643           /* Indirect .sdata2 relocation.  */
5644         case R_PPC_EMB_SDA2I16:
5645           BFD_ASSERT (htab->sdata[1].section != NULL);
5646           relocation
5647             = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[1],
5648                                                  h, relocation, rel);
5649           break;
5650
5651           /* Handle the TOC16 reloc.  We want to use the offset within the .got
5652              section, not the actual VMA.  This is appropriate when generating
5653              an embedded ELF object, for which the .got section acts like the
5654              AIX .toc section.  */
5655         case R_PPC_TOC16:                       /* phony GOT16 relocations */
5656           BFD_ASSERT (sec != NULL);
5657           BFD_ASSERT (bfd_is_und_section (sec)
5658                       || strcmp (bfd_get_section_name (abfd, sec), ".got") == 0
5659                       || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0);
5660
5661             addend -= sec->output_section->vma + sec->output_offset + 0x8000;
5662           break;
5663
5664         case R_PPC_PLTREL24:
5665           /* Relocation is to the entry for this symbol in the
5666              procedure linkage table.  */
5667           BFD_ASSERT (h != NULL);
5668
5669           if (h->plt.offset == (bfd_vma) -1
5670               || htab->plt == NULL)
5671             {
5672               /* We didn't make a PLT entry for this symbol.  This
5673                  happens when statically linking PIC code, or when
5674                  using -Bsymbolic.  */
5675               break;
5676             }
5677
5678           unresolved_reloc = FALSE;
5679           relocation = (htab->plt->output_section->vma
5680                         + htab->plt->output_offset
5681                         + h->plt.offset);
5682           break;
5683
5684           /* Relocate against _SDA_BASE_.  */
5685         case R_PPC_SDAREL16:
5686           {
5687             const char *name;
5688
5689             BFD_ASSERT (sec != NULL);
5690             name = bfd_get_section_name (abfd, sec->output_section);
5691             if (! ((strncmp (name, ".sdata", 6) == 0
5692                     && (name[6] == 0 || name[6] == '.'))
5693                    || (strncmp (name, ".sbss", 5) == 0
5694                        && (name[5] == 0 || name[5] == '.'))))
5695               {
5696                 (*_bfd_error_handler)
5697                   (_("%B: the target (%s) of a %s relocation is "
5698                      "in the wrong output section (%s)"),
5699                    input_bfd,
5700                    sym_name,
5701                    howto->name,
5702                    name);
5703               }
5704             addend -= htab->sdata[0].sym_val;
5705           }
5706           break;
5707
5708           /* Relocate against _SDA2_BASE_.  */
5709         case R_PPC_EMB_SDA2REL:
5710           {
5711             const char *name;
5712
5713             BFD_ASSERT (sec != NULL);
5714             name = bfd_get_section_name (abfd, sec->output_section);
5715             if (! (strncmp (name, ".sdata2", 7) == 0
5716                    || strncmp (name, ".sbss2", 6) == 0))
5717               {
5718                 (*_bfd_error_handler)
5719                   (_("%B: the target (%s) of a %s relocation is "
5720                      "in the wrong output section (%s)"),
5721                    input_bfd,
5722                    sym_name,
5723                    howto->name,
5724                    name);
5725
5726                 bfd_set_error (bfd_error_bad_value);
5727                 ret = FALSE;
5728                 continue;
5729               }
5730             addend -= htab->sdata[1].sym_val;
5731           }
5732           break;
5733
5734           /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0.  */
5735         case R_PPC_EMB_SDA21:
5736         case R_PPC_EMB_RELSDA:
5737           {
5738             const char *name;
5739             int reg;
5740
5741             BFD_ASSERT (sec != NULL);
5742             name = bfd_get_section_name (abfd, sec->output_section);
5743             if (((strncmp (name, ".sdata", 6) == 0
5744                   && (name[6] == 0 || name[6] == '.'))
5745                  || (strncmp (name, ".sbss", 5) == 0
5746                      && (name[5] == 0 || name[5] == '.'))))
5747               {
5748                 reg = 13;
5749                 addend -= htab->sdata[0].sym_val;
5750               }
5751
5752             else if (strncmp (name, ".sdata2", 7) == 0
5753                      || strncmp (name, ".sbss2", 6) == 0)
5754               {
5755                 reg = 2;
5756                 addend -= htab->sdata[1].sym_val;
5757               }
5758
5759             else if (strcmp (name, ".PPC.EMB.sdata0") == 0
5760                      || strcmp (name, ".PPC.EMB.sbss0") == 0)
5761               {
5762                 reg = 0;
5763               }
5764
5765             else
5766               {
5767                 (*_bfd_error_handler)
5768                   (_("%B: the target (%s) of a %s relocation is "
5769                      "in the wrong output section (%s)"),
5770                    input_bfd,
5771                    sym_name,
5772                    howto->name,
5773                    name);
5774
5775                 bfd_set_error (bfd_error_bad_value);
5776                 ret = FALSE;
5777                 continue;
5778               }
5779
5780             if (r_type == R_PPC_EMB_SDA21)
5781               {                 /* fill in register field */
5782                 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
5783                 insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
5784                 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5785               }
5786           }
5787           break;
5788
5789           /* Relocate against the beginning of the section.  */
5790         case R_PPC_SECTOFF:
5791         case R_PPC_SECTOFF_LO:
5792         case R_PPC_SECTOFF_HI:
5793         case R_PPC_SECTOFF_HA:
5794           BFD_ASSERT (sec != NULL);
5795           addend -= sec->output_section->vma;
5796           break;
5797
5798           /* Negative relocations.  */
5799         case R_PPC_EMB_NADDR32:
5800         case R_PPC_EMB_NADDR16:
5801         case R_PPC_EMB_NADDR16_LO:
5802         case R_PPC_EMB_NADDR16_HI:
5803         case R_PPC_EMB_NADDR16_HA:
5804           addend -= 2 * relocation;
5805           break;
5806
5807         case R_PPC_COPY:
5808         case R_PPC_GLOB_DAT:
5809         case R_PPC_JMP_SLOT:
5810         case R_PPC_RELATIVE:
5811         case R_PPC_PLT32:
5812         case R_PPC_PLTREL32:
5813         case R_PPC_PLT16_LO:
5814         case R_PPC_PLT16_HI:
5815         case R_PPC_PLT16_HA:
5816         case R_PPC_ADDR30:
5817         case R_PPC_EMB_RELSEC16:
5818         case R_PPC_EMB_RELST_LO:
5819         case R_PPC_EMB_RELST_HI:
5820         case R_PPC_EMB_RELST_HA:
5821         case R_PPC_EMB_BIT_FLD:
5822           (*_bfd_error_handler)
5823             (_("%B: relocation %s is not yet supported for symbol %s."),
5824              input_bfd,
5825              howto->name,
5826              sym_name);
5827
5828           bfd_set_error (bfd_error_invalid_operation);
5829           ret = FALSE;
5830           continue;
5831         }
5832
5833       /* Do any further special processing.  */
5834       switch (r_type)
5835         {
5836         default:
5837           break;
5838
5839         case R_PPC_ADDR16_HA:
5840         case R_PPC_GOT16_HA:
5841         case R_PPC_PLT16_HA:
5842         case R_PPC_SECTOFF_HA:
5843         case R_PPC_TPREL16_HA:
5844         case R_PPC_DTPREL16_HA:
5845         case R_PPC_GOT_TLSGD16_HA:
5846         case R_PPC_GOT_TLSLD16_HA:
5847         case R_PPC_GOT_TPREL16_HA:
5848         case R_PPC_GOT_DTPREL16_HA:
5849         case R_PPC_EMB_NADDR16_HA:
5850         case R_PPC_EMB_RELST_HA:
5851           /* It's just possible that this symbol is a weak symbol
5852              that's not actually defined anywhere.  In that case,
5853              'sec' would be NULL, and we should leave the symbol
5854              alone (it will be set to zero elsewhere in the link).  */
5855           if (sec != NULL)
5856             /* Add 0x10000 if sign bit in 0:15 is set.
5857                Bits 0:15 are not used.  */
5858             addend += 0x8000;
5859           break;
5860         }
5861
5862 #ifdef DEBUG
5863       fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
5864                "offset = %ld, addend = %ld\n",
5865                howto->name,
5866                (int) r_type,
5867                sym_name,
5868                r_symndx,
5869                (long) rel->r_offset,
5870                (long) addend);
5871 #endif
5872
5873       if (unresolved_reloc
5874           && !((input_section->flags & SEC_DEBUGGING) != 0
5875                && h->def_dynamic))
5876         {
5877           (*_bfd_error_handler)
5878             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5879              input_bfd,
5880              input_section,
5881              (long) rel->r_offset,
5882              howto->name,
5883              sym_name);
5884           ret = FALSE;
5885         }
5886
5887       r = _bfd_final_link_relocate (howto,
5888                                     input_bfd,
5889                                     input_section,
5890                                     contents,
5891                                     rel->r_offset,
5892                                     relocation,
5893                                     addend);
5894
5895       if (r != bfd_reloc_ok)
5896         {
5897           if (r == bfd_reloc_overflow)
5898             {
5899               if (warned)
5900                 continue;
5901               if (h != NULL
5902                   && h->root.type == bfd_link_hash_undefweak
5903                   && howto->pc_relative)
5904                 {
5905                   /* Assume this is a call protected by other code that
5906                      detect the symbol is undefined.  If this is the case,
5907                      we can safely ignore the overflow.  If not, the
5908                      program is hosed anyway, and a little warning isn't
5909                      going to help.  */
5910
5911                   continue;
5912                 }
5913
5914               if (! (*info->callbacks->reloc_overflow) (info,
5915                                                         (h ? &h->root : NULL),
5916                                                         sym_name,
5917                                                         howto->name,
5918                                                         rel->r_addend,
5919                                                         input_bfd,
5920                                                         input_section,
5921                                                         rel->r_offset))
5922                 return FALSE;
5923             }
5924           else
5925             {
5926               (*_bfd_error_handler)
5927                 (_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
5928                  input_bfd, input_section,
5929                  (long) rel->r_offset, howto->name, sym_name, (int) r);
5930               ret = FALSE;
5931             }
5932         }
5933     }
5934
5935 #ifdef DEBUG
5936   fprintf (stderr, "\n");
5937 #endif
5938
5939   return ret;
5940 }
5941 \f
5942 /* Finish up dynamic symbol handling.  We set the contents of various
5943    dynamic sections here.  */
5944
5945 static bfd_boolean
5946 ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
5947                                struct bfd_link_info *info,
5948                                struct elf_link_hash_entry *h,
5949                                Elf_Internal_Sym *sym)
5950 {
5951   struct ppc_elf_link_hash_table *htab;
5952
5953 #ifdef DEBUG
5954   fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
5955            h->root.root.string);
5956 #endif
5957
5958   htab = ppc_elf_hash_table (info);
5959   BFD_ASSERT (htab->elf.dynobj != NULL);
5960
5961   if (h->plt.offset != (bfd_vma) -1)
5962     {
5963       Elf_Internal_Rela rela;
5964       bfd_byte *loc;
5965       bfd_vma reloc_index;
5966
5967 #ifdef DEBUG
5968       fprintf (stderr, ", plt_offset = %d", h->plt.offset);
5969 #endif
5970
5971       /* This symbol has an entry in the procedure linkage table.  Set
5972          it up.  */
5973
5974       BFD_ASSERT (h->dynindx != -1);
5975       BFD_ASSERT (htab->plt != NULL && htab->relplt != NULL);
5976
5977       /* We don't need to fill in the .plt.  The ppc dynamic linker
5978          will fill it in.  */
5979
5980       /* Fill in the entry in the .rela.plt section.  */
5981       rela.r_offset = (htab->plt->output_section->vma
5982                        + htab->plt->output_offset
5983                        + h->plt.offset);
5984       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
5985       rela.r_addend = 0;
5986
5987       reloc_index = (h->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_SLOT_SIZE;
5988       if (reloc_index > PLT_NUM_SINGLE_ENTRIES)
5989         reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
5990       loc = (htab->relplt->contents
5991              + reloc_index * sizeof (Elf32_External_Rela));
5992       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5993
5994       if (!h->def_regular)
5995         {
5996           /* Mark the symbol as undefined, rather than as defined in
5997              the .plt section.  Leave the value alone.  */
5998           sym->st_shndx = SHN_UNDEF;
5999           /* If the symbol is weak, we do need to clear the value.
6000              Otherwise, the PLT entry would provide a definition for
6001              the symbol even if the symbol wasn't defined anywhere,
6002              and so the symbol would never be NULL.  */
6003           if (!h->ref_regular_nonweak)
6004             sym->st_value = 0;
6005         }
6006     }
6007
6008   if (h->needs_copy)
6009     {
6010       asection *s;
6011       Elf_Internal_Rela rela;
6012       bfd_byte *loc;
6013
6014       /* This symbols needs a copy reloc.  Set it up.  */
6015
6016 #ifdef DEBUG
6017       fprintf (stderr, ", copy");
6018 #endif
6019
6020       BFD_ASSERT (h->dynindx != -1);
6021
6022       if (h->size <= elf_gp_size (htab->elf.dynobj))
6023         s = htab->relsbss;
6024       else
6025         s = htab->relbss;
6026       BFD_ASSERT (s != NULL);
6027
6028       rela.r_offset = (h->root.u.def.value
6029                        + h->root.u.def.section->output_section->vma
6030                        + h->root.u.def.section->output_offset);
6031       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
6032       rela.r_addend = 0;
6033       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
6034       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
6035     }
6036
6037 #ifdef DEBUG
6038   fprintf (stderr, "\n");
6039 #endif
6040
6041   /* Mark some specially defined symbols as absolute.  */
6042   if (h == htab->elf.hgot
6043       || strcmp (h->root.root.string, "_DYNAMIC") == 0
6044       || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
6045     sym->st_shndx = SHN_ABS;
6046
6047   return TRUE;
6048 }
6049 \f
6050 static enum elf_reloc_type_class
6051 ppc_elf_reloc_type_class (const Elf_Internal_Rela *rela)
6052 {
6053   switch (ELF32_R_TYPE (rela->r_info))
6054     {
6055     case R_PPC_RELATIVE:
6056       return reloc_class_relative;
6057     case R_PPC_REL24:
6058     case R_PPC_ADDR24:
6059     case R_PPC_JMP_SLOT:
6060       return reloc_class_plt;
6061     case R_PPC_COPY:
6062       return reloc_class_copy;
6063     default:
6064       return reloc_class_normal;
6065     }
6066 }
6067 \f
6068 /* Finish up the dynamic sections.  */
6069
6070 static bfd_boolean
6071 ppc_elf_finish_dynamic_sections (bfd *output_bfd,
6072                                  struct bfd_link_info *info)
6073 {
6074   asection *sdyn;
6075   struct ppc_elf_link_hash_table *htab;
6076
6077 #ifdef DEBUG
6078   fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
6079 #endif
6080
6081   htab = ppc_elf_hash_table (info);
6082   sdyn = bfd_get_section_by_name (htab->elf.dynobj, ".dynamic");
6083
6084   if (htab->elf.dynamic_sections_created)
6085     {
6086       Elf32_External_Dyn *dyncon, *dynconend;
6087
6088       BFD_ASSERT (htab->plt != NULL && sdyn != NULL);
6089
6090       dyncon = (Elf32_External_Dyn *) sdyn->contents;
6091       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
6092       for (; dyncon < dynconend; dyncon++)
6093         {
6094           Elf_Internal_Dyn dyn;
6095           asection *s;
6096
6097           bfd_elf32_swap_dyn_in (htab->elf.dynobj, dyncon, &dyn);
6098
6099           switch (dyn.d_tag)
6100             {
6101             case DT_PLTGOT:
6102               s = htab->plt;
6103               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
6104               break;
6105
6106             case DT_PLTRELSZ:
6107               dyn.d_un.d_val = htab->relplt->size;
6108               break;
6109
6110             case DT_JMPREL:
6111               s = htab->relplt;
6112               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
6113               break;
6114
6115             default:
6116               continue;
6117             }
6118
6119           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6120         }
6121     }
6122
6123   /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can
6124      easily find the address of the _GLOBAL_OFFSET_TABLE_.  */
6125   if (htab->got != NULL)
6126     {
6127       unsigned char *p = htab->got->contents;
6128       bfd_vma val;
6129
6130       p += elf_hash_table (info)->hgot->root.u.def.value;
6131       bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, p - 4);
6132
6133       val = 0;
6134       if (sdyn != NULL)
6135         val = sdyn->output_section->vma + sdyn->output_offset;
6136       bfd_put_32 (output_bfd, val, p);
6137
6138       elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 4;
6139     }
6140
6141   return TRUE;
6142 }
6143 \f
6144 #define TARGET_LITTLE_SYM       bfd_elf32_powerpcle_vec
6145 #define TARGET_LITTLE_NAME      "elf32-powerpcle"
6146 #define TARGET_BIG_SYM          bfd_elf32_powerpc_vec
6147 #define TARGET_BIG_NAME         "elf32-powerpc"
6148 #define ELF_ARCH                bfd_arch_powerpc
6149 #define ELF_MACHINE_CODE        EM_PPC
6150 #ifdef __QNXTARGET__
6151 #define ELF_MAXPAGESIZE         0x1000
6152 #else
6153 #define ELF_MAXPAGESIZE         0x10000
6154 #endif
6155 #define ELF_MINPAGESIZE         0x1000
6156 #define elf_info_to_howto       ppc_elf_info_to_howto
6157
6158 #ifdef  EM_CYGNUS_POWERPC
6159 #define ELF_MACHINE_ALT1        EM_CYGNUS_POWERPC
6160 #endif
6161
6162 #ifdef EM_PPC_OLD
6163 #define ELF_MACHINE_ALT2        EM_PPC_OLD
6164 #endif
6165
6166 #define elf_backend_plt_not_loaded      1
6167 #define elf_backend_can_gc_sections     1
6168 #define elf_backend_can_refcount        1
6169 #define elf_backend_rela_normal         1
6170
6171 #define bfd_elf32_mkobject                      ppc_elf_mkobject
6172 #define bfd_elf32_bfd_merge_private_bfd_data    ppc_elf_merge_private_bfd_data
6173 #define bfd_elf32_bfd_relax_section             ppc_elf_relax_section
6174 #define bfd_elf32_bfd_reloc_type_lookup         ppc_elf_reloc_type_lookup
6175 #define bfd_elf32_bfd_set_private_flags         ppc_elf_set_private_flags
6176 #define bfd_elf32_bfd_link_hash_table_create    ppc_elf_link_hash_table_create
6177
6178 #define elf_backend_object_p                    ppc_elf_object_p
6179 #define elf_backend_gc_mark_hook                ppc_elf_gc_mark_hook
6180 #define elf_backend_gc_sweep_hook               ppc_elf_gc_sweep_hook
6181 #define elf_backend_section_from_shdr           ppc_elf_section_from_shdr
6182 #define elf_backend_relocate_section            ppc_elf_relocate_section
6183 #define elf_backend_create_dynamic_sections     ppc_elf_create_dynamic_sections
6184 #define elf_backend_check_relocs                ppc_elf_check_relocs
6185 #define elf_backend_copy_indirect_symbol        ppc_elf_copy_indirect_symbol
6186 #define elf_backend_adjust_dynamic_symbol       ppc_elf_adjust_dynamic_symbol
6187 #define elf_backend_add_symbol_hook             ppc_elf_add_symbol_hook
6188 #define elf_backend_size_dynamic_sections       ppc_elf_size_dynamic_sections
6189 #define elf_backend_finish_dynamic_symbol       ppc_elf_finish_dynamic_symbol
6190 #define elf_backend_finish_dynamic_sections     ppc_elf_finish_dynamic_sections
6191 #define elf_backend_fake_sections               ppc_elf_fake_sections
6192 #define elf_backend_additional_program_headers  ppc_elf_additional_program_headers
6193 #define elf_backend_grok_prstatus               ppc_elf_grok_prstatus
6194 #define elf_backend_grok_psinfo                 ppc_elf_grok_psinfo
6195 #define elf_backend_reloc_type_class            ppc_elf_reloc_type_class
6196 #define elf_backend_begin_write_processing      ppc_elf_begin_write_processing
6197 #define elf_backend_final_write_processing      ppc_elf_final_write_processing
6198 #define elf_backend_write_section               ppc_elf_write_section
6199 #define elf_backend_special_sections            ppc_elf_special_sections
6200 #define elf_backend_plt_sym_val                 ppc_elf_plt_sym_val
6201
6202 #include "elf32-target.h"