daily update
[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., 59 Temple Place - Suite 330,
21    Boston, MA 02111-1307, 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 ppc_elf_special_sections[]=
1740 {
1741   { ".tags",             5,  0, SHT_ORDERED,  SHF_ALLOC },
1742   { ".sdata",            6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
1743   { ".sbss",             5, -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
1744   { ".sdata2",           7, -2, SHT_PROGBITS, SHF_ALLOC },
1745   { ".sbss2",            6, -2, SHT_PROGBITS, SHF_ALLOC },
1746   { ".PPC.EMB.apuinfo", 16,  0, SHT_NOTE,     0 },
1747   { ".PPC.EMB.sdata0",  15,  0, SHT_PROGBITS, SHF_ALLOC },
1748   { ".PPC.EMB.sbss0",   14,  0, SHT_PROGBITS, SHF_ALLOC },
1749   { ".plt",              4,  0, SHT_NOBITS,   SHF_ALLOC + SHF_EXECINSTR },
1750   { NULL,                0,  0, 0,            0 }
1751 };
1752 \f
1753 /* Very simple linked list structure for recording apuinfo values.  */
1754 typedef struct apuinfo_list
1755 {
1756   struct apuinfo_list *next;
1757   unsigned long value;
1758 }
1759 apuinfo_list;
1760
1761 static apuinfo_list *head;
1762
1763
1764 static void
1765 apuinfo_list_init (void)
1766 {
1767   head = NULL;
1768 }
1769
1770 static void
1771 apuinfo_list_add (unsigned long value)
1772 {
1773   apuinfo_list *entry = head;
1774
1775   while (entry != NULL)
1776     {
1777       if (entry->value == value)
1778         return;
1779       entry = entry->next;
1780     }
1781
1782   entry = bfd_malloc (sizeof (* entry));
1783   if (entry == NULL)
1784     return;
1785
1786   entry->value = value;
1787   entry->next  = head;
1788   head = entry;
1789 }
1790
1791 static unsigned
1792 apuinfo_list_length (void)
1793 {
1794   apuinfo_list *entry;
1795   unsigned long count;
1796
1797   for (entry = head, count = 0;
1798        entry;
1799        entry = entry->next)
1800     ++ count;
1801
1802   return count;
1803 }
1804
1805 static inline unsigned long
1806 apuinfo_list_element (unsigned long number)
1807 {
1808   apuinfo_list * entry;
1809
1810   for (entry = head;
1811        entry && number --;
1812        entry = entry->next)
1813     ;
1814
1815   return entry ? entry->value : 0;
1816 }
1817
1818 static void
1819 apuinfo_list_finish (void)
1820 {
1821   apuinfo_list *entry;
1822
1823   for (entry = head; entry;)
1824     {
1825       apuinfo_list *next = entry->next;
1826       free (entry);
1827       entry = next;
1828     }
1829
1830   head = NULL;
1831 }
1832
1833 #define APUINFO_SECTION_NAME    ".PPC.EMB.apuinfo"
1834 #define APUINFO_LABEL           "APUinfo"
1835
1836 /* Scan the input BFDs and create a linked list of
1837    the APUinfo values that will need to be emitted.  */
1838
1839 static void
1840 ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
1841 {
1842   bfd *ibfd;
1843   asection *asec;
1844   char *buffer;
1845   unsigned num_input_sections;
1846   bfd_size_type output_section_size;
1847   unsigned i;
1848   unsigned num_entries;
1849   unsigned long offset;
1850   unsigned long length;
1851   const char *error_message = NULL;
1852
1853   if (link_info == NULL)
1854     return;
1855
1856   /* Scan the input bfds, looking for apuinfo sections.  */
1857   num_input_sections = 0;
1858   output_section_size = 0;
1859
1860   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
1861     {
1862       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
1863       if (asec)
1864         {
1865           ++ num_input_sections;
1866           output_section_size += asec->size;
1867         }
1868     }
1869
1870   /* We need at least one input sections
1871      in order to make merging worthwhile.  */
1872   if (num_input_sections < 1)
1873     return;
1874
1875   /* Just make sure that the output section exists as well.  */
1876   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
1877   if (asec == NULL)
1878     return;
1879
1880   /* Allocate a buffer for the contents of the input sections.  */
1881   buffer = bfd_malloc (output_section_size);
1882   if (buffer == NULL)
1883     return;
1884
1885   offset = 0;
1886   apuinfo_list_init ();
1887
1888   /* Read in the input sections contents.  */
1889   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
1890     {
1891       unsigned long datum;
1892       char *ptr;
1893
1894       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
1895       if (asec == NULL)
1896         continue;
1897
1898       length = asec->size;
1899       if (length < 24)
1900         {
1901           error_message = _("corrupt or empty %s section in %B");
1902           goto fail;
1903         }
1904
1905       if (bfd_seek (ibfd, asec->filepos, SEEK_SET) != 0
1906           || (bfd_bread (buffer + offset, length, ibfd) != length))
1907         {
1908           error_message = _("unable to read in %s section from %B");
1909           goto fail;
1910         }
1911
1912       /* Process the contents of the section.  */
1913       ptr = buffer + offset;
1914       error_message = _("corrupt %s section in %B");
1915
1916       /* Verify the contents of the header.  Note - we have to
1917          extract the values this way in order to allow for a
1918          host whose endian-ness is different from the target.  */
1919       datum = bfd_get_32 (ibfd, ptr);
1920       if (datum != sizeof APUINFO_LABEL)
1921         goto fail;
1922
1923       datum = bfd_get_32 (ibfd, ptr + 8);
1924       if (datum != 0x2)
1925         goto fail;
1926
1927       if (strcmp (ptr + 12, APUINFO_LABEL) != 0)
1928         goto fail;
1929
1930       /* Get the number of bytes used for apuinfo entries.  */
1931       datum = bfd_get_32 (ibfd, ptr + 4);
1932       if (datum + 20 != length)
1933         goto fail;
1934
1935       /* Make sure that we do not run off the end of the section.  */
1936       if (offset + length > output_section_size)
1937         goto fail;
1938
1939       /* Scan the apuinfo section, building a list of apuinfo numbers.  */
1940       for (i = 0; i < datum; i += 4)
1941         apuinfo_list_add (bfd_get_32 (ibfd, ptr + 20 + i));
1942
1943       /* Update the offset.  */
1944       offset += length;
1945     }
1946
1947   error_message = NULL;
1948
1949   /* Compute the size of the output section.  */
1950   num_entries = apuinfo_list_length ();
1951   output_section_size = 20 + num_entries * 4;
1952
1953   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
1954
1955   if (! bfd_set_section_size (abfd, asec, output_section_size))
1956     ibfd = abfd,
1957       error_message = _("warning: unable to set size of %s section in %B");
1958
1959  fail:
1960   free (buffer);
1961
1962   if (error_message)
1963     (*_bfd_error_handler) (error_message, ibfd, APUINFO_SECTION_NAME);
1964 }
1965
1966 /* Prevent the output section from accumulating the input sections'
1967    contents.  We have already stored this in our linked list structure.  */
1968
1969 static bfd_boolean
1970 ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED,
1971                        asection *asec,
1972                        bfd_byte *contents ATTRIBUTE_UNUSED)
1973 {
1974   return (apuinfo_list_length ()
1975           && strcmp (asec->name, APUINFO_SECTION_NAME) == 0);
1976 }
1977
1978 /* Finally we can generate the output section.  */
1979
1980 static void
1981 ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
1982 {
1983   bfd_byte *buffer;
1984   asection *asec;
1985   unsigned i;
1986   unsigned num_entries;
1987   bfd_size_type length;
1988
1989   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
1990   if (asec == NULL)
1991     return;
1992
1993   if (apuinfo_list_length () == 0)
1994     return;
1995
1996   length = asec->size;
1997   if (length < 20)
1998     return;
1999
2000   buffer = bfd_malloc (length);
2001   if (buffer == NULL)
2002     {
2003       (*_bfd_error_handler)
2004         (_("failed to allocate space for new APUinfo section."));
2005       return;
2006     }
2007
2008   /* Create the apuinfo header.  */
2009   num_entries = apuinfo_list_length ();
2010   bfd_put_32 (abfd, sizeof APUINFO_LABEL, buffer);
2011   bfd_put_32 (abfd, num_entries * 4, buffer + 4);
2012   bfd_put_32 (abfd, 0x2, buffer + 8);
2013   strcpy ((char *) buffer + 12, APUINFO_LABEL);
2014
2015   length = 20;
2016   for (i = 0; i < num_entries; i++)
2017     {
2018       bfd_put_32 (abfd, apuinfo_list_element (i), buffer + length);
2019       length += 4;
2020     }
2021
2022   if (length != asec->size)
2023     (*_bfd_error_handler) (_("failed to compute new APUinfo section."));
2024
2025   if (! bfd_set_section_contents (abfd, asec, buffer, (file_ptr) 0, length))
2026     (*_bfd_error_handler) (_("failed to install new APUinfo section."));
2027
2028   free (buffer);
2029
2030   apuinfo_list_finish ();
2031 }
2032 \f
2033 /* The following functions are specific to the ELF linker, while
2034    functions above are used generally.  They appear in this file more
2035    or less in the order in which they are called.  eg.
2036    ppc_elf_check_relocs is called early in the link process,
2037    ppc_elf_finish_dynamic_sections is one of the last functions
2038    called.  */
2039
2040 /* The PPC linker needs to keep track of the number of relocs that it
2041    decides to copy as dynamic relocs in check_relocs for each symbol.
2042    This is so that it can later discard them if they are found to be
2043    unnecessary.  We store the information in a field extending the
2044    regular ELF linker hash table.  */
2045
2046 struct ppc_elf_dyn_relocs
2047 {
2048   struct ppc_elf_dyn_relocs *next;
2049
2050   /* The input section of the reloc.  */
2051   asection *sec;
2052
2053   /* Total number of relocs copied for the input section.  */
2054   bfd_size_type count;
2055
2056   /* Number of pc-relative relocs copied for the input section.  */
2057   bfd_size_type pc_count;
2058 };
2059
2060 /* Of those relocs that might be copied as dynamic relocs, this macro
2061    selects those that must be copied when linking a shared library,
2062    even when the symbol is local.  */
2063
2064 #define MUST_BE_DYN_RELOC(RTYPE)                \
2065   ((RTYPE) != R_PPC_REL24                       \
2066    && (RTYPE) != R_PPC_REL14                    \
2067    && (RTYPE) != R_PPC_REL14_BRTAKEN            \
2068    && (RTYPE) != R_PPC_REL14_BRNTAKEN           \
2069    && (RTYPE) != R_PPC_REL32)
2070
2071 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
2072    copying dynamic variables from a shared lib into an app's dynbss
2073    section, and instead use a dynamic relocation to point into the
2074    shared lib.  */
2075 #define ELIMINATE_COPY_RELOCS 1
2076
2077 /* PPC ELF linker hash entry.  */
2078
2079 struct ppc_elf_link_hash_entry
2080 {
2081   struct elf_link_hash_entry elf;
2082
2083   /* If this symbol is used in the linker created sections, the processor
2084      specific backend uses this field to map the field into the offset
2085      from the beginning of the section.  */
2086   elf_linker_section_pointers_t *linker_section_pointer;
2087
2088   /* Track dynamic relocs copied for this symbol.  */
2089   struct ppc_elf_dyn_relocs *dyn_relocs;
2090
2091   /* Contexts in which symbol is used in the GOT (or TOC).
2092      TLS_GD .. TLS_TLS bits are or'd into the mask as the
2093      corresponding relocs are encountered during check_relocs.
2094      tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
2095      indicate the corresponding GOT entry type is not needed.  */
2096 #define TLS_GD           1      /* GD reloc. */
2097 #define TLS_LD           2      /* LD reloc. */
2098 #define TLS_TPREL        4      /* TPREL reloc, => IE. */
2099 #define TLS_DTPREL       8      /* DTPREL reloc, => LD. */
2100 #define TLS_TLS         16      /* Any TLS reloc.  */
2101 #define TLS_TPRELGD     32      /* TPREL reloc resulting from GD->IE. */
2102   char tls_mask;
2103 };
2104
2105 #define ppc_elf_hash_entry(ent) ((struct ppc_elf_link_hash_entry *) (ent))
2106
2107 /* PPC ELF linker hash table.  */
2108
2109 struct ppc_elf_link_hash_table
2110 {
2111   struct elf_link_hash_table elf;
2112
2113   /* Short-cuts to get to dynamic linker sections.  */
2114   asection *got;
2115   asection *relgot;
2116   asection *plt;
2117   asection *relplt;
2118   asection *dynbss;
2119   asection *relbss;
2120   asection *dynsbss;
2121   asection *relsbss;
2122   elf_linker_section_t sdata[2];
2123   asection *sbss;
2124
2125   /* Shortcut to .__tls_get_addr.  */
2126   struct elf_link_hash_entry *tls_get_addr;
2127
2128   /* TLS local dynamic got entry handling.  */
2129   union {
2130     bfd_signed_vma refcount;
2131     bfd_vma offset;
2132   } tlsld_got;
2133
2134   /* Small local sym to section mapping cache.  */
2135   struct sym_sec_cache sym_sec;
2136 };
2137
2138 /* Get the PPC ELF linker hash table from a link_info structure.  */
2139
2140 #define ppc_elf_hash_table(p) \
2141   ((struct ppc_elf_link_hash_table *) (p)->hash)
2142
2143 /* Create an entry in a PPC ELF linker hash table.  */
2144
2145 static struct bfd_hash_entry *
2146 ppc_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
2147                            struct bfd_hash_table *table,
2148                            const char *string)
2149 {
2150   /* Allocate the structure if it has not already been allocated by a
2151      subclass.  */
2152   if (entry == NULL)
2153     {
2154       entry = bfd_hash_allocate (table,
2155                                  sizeof (struct ppc_elf_link_hash_entry));
2156       if (entry == NULL)
2157         return entry;
2158     }
2159
2160   /* Call the allocation method of the superclass.  */
2161   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
2162   if (entry != NULL)
2163     {
2164       ppc_elf_hash_entry (entry)->linker_section_pointer = NULL;
2165       ppc_elf_hash_entry (entry)->dyn_relocs = NULL;
2166       ppc_elf_hash_entry (entry)->tls_mask = 0;
2167     }
2168
2169   return entry;
2170 }
2171
2172 /* Create a PPC ELF linker hash table.  */
2173
2174 static struct bfd_link_hash_table *
2175 ppc_elf_link_hash_table_create (bfd *abfd)
2176 {
2177   struct ppc_elf_link_hash_table *ret;
2178
2179   ret = bfd_zmalloc (sizeof (struct ppc_elf_link_hash_table));
2180   if (ret == NULL)
2181     return NULL;
2182
2183   if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd,
2184                                        ppc_elf_link_hash_newfunc))
2185     {
2186       free (ret);
2187       return NULL;
2188     }
2189
2190   ret->sdata[0].name = ".sdata";
2191   ret->sdata[0].sym_name = "_SDA_BASE_";
2192   ret->sdata[0].bss_name = ".sbss";
2193
2194   ret->sdata[1].name = ".sdata2";
2195   ret->sdata[1].sym_name = "_SDA2_BASE_";
2196   ret->sdata[1].bss_name = ".sbss2";
2197
2198   return &ret->elf.root;
2199 }
2200
2201 /* The powerpc .got has a blrl instruction in it.  Mark it executable.  */
2202
2203 static bfd_boolean
2204 ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
2205 {
2206   struct ppc_elf_link_hash_table *htab;
2207   asection *s;
2208   flagword flags;
2209
2210   if (!_bfd_elf_create_got_section (abfd, info))
2211     return FALSE;
2212
2213   htab = ppc_elf_hash_table (info);
2214   htab->got = s = bfd_get_section_by_name (abfd, ".got");
2215   if (s == NULL)
2216     abort ();
2217
2218   flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2219            | SEC_LINKER_CREATED);
2220   if (!bfd_set_section_flags (abfd, s, flags))
2221     return FALSE;
2222
2223   htab->relgot = bfd_make_section (abfd, ".rela.got");
2224   if (!htab->relgot
2225       || ! bfd_set_section_flags (abfd, htab->relgot,
2226                                   (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
2227                                    | SEC_IN_MEMORY | SEC_LINKER_CREATED
2228                                    | SEC_READONLY))
2229       || ! bfd_set_section_alignment (abfd, htab->relgot, 2))
2230     return FALSE;
2231
2232   return TRUE;
2233 }
2234
2235 /* We have to create .dynsbss and .rela.sbss here so that they get mapped
2236    to output sections (just like _bfd_elf_create_dynamic_sections has
2237    to create .dynbss and .rela.bss).  */
2238
2239 static bfd_boolean
2240 ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2241 {
2242   struct ppc_elf_link_hash_table *htab;
2243   asection *s;
2244   flagword flags;
2245
2246   htab = ppc_elf_hash_table (info);
2247
2248   if (htab->got == NULL
2249       && !ppc_elf_create_got (abfd, info))
2250     return FALSE;
2251
2252   if (!_bfd_elf_create_dynamic_sections (abfd, info))
2253     return FALSE;
2254
2255   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2256            | SEC_LINKER_CREATED);
2257
2258   htab->dynbss = bfd_get_section_by_name (abfd, ".dynbss");
2259   htab->dynsbss = s = bfd_make_section (abfd, ".dynsbss");
2260   if (s == NULL
2261       || ! bfd_set_section_flags (abfd, s, SEC_ALLOC | SEC_LINKER_CREATED))
2262     return FALSE;
2263
2264   if (! info->shared)
2265     {
2266       htab->relbss = bfd_get_section_by_name (abfd, ".rela.bss");
2267       htab->relsbss = s = bfd_make_section (abfd, ".rela.sbss");
2268       if (s == NULL
2269           || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2270           || ! bfd_set_section_alignment (abfd, s, 2))
2271         return FALSE;
2272     }
2273
2274   htab->relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2275   htab->plt = s = bfd_get_section_by_name (abfd, ".plt");
2276   if (s == NULL)
2277     abort ();
2278
2279   flags = SEC_ALLOC | SEC_CODE | SEC_IN_MEMORY | SEC_LINKER_CREATED;
2280   return bfd_set_section_flags (abfd, s, flags);
2281 }
2282
2283 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
2284
2285 static void
2286 ppc_elf_copy_indirect_symbol (const struct elf_backend_data *bed,
2287                               struct elf_link_hash_entry *dir,
2288                               struct elf_link_hash_entry *ind)
2289 {
2290   struct ppc_elf_link_hash_entry *edir, *eind;
2291
2292   edir = (struct ppc_elf_link_hash_entry *) dir;
2293   eind = (struct ppc_elf_link_hash_entry *) ind;
2294
2295   if (eind->dyn_relocs != NULL)
2296     {
2297       if (edir->dyn_relocs != NULL)
2298         {
2299           struct ppc_elf_dyn_relocs **pp;
2300           struct ppc_elf_dyn_relocs *p;
2301
2302           if (ind->root.type == bfd_link_hash_indirect)
2303             abort ();
2304
2305           /* Add reloc counts against the weak sym to the strong sym
2306              list.  Merge any entries against the same section.  */
2307           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
2308             {
2309               struct ppc_elf_dyn_relocs *q;
2310
2311               for (q = edir->dyn_relocs; q != NULL; q = q->next)
2312                 if (q->sec == p->sec)
2313                   {
2314                     q->pc_count += p->pc_count;
2315                     q->count += p->count;
2316                     *pp = p->next;
2317                     break;
2318                   }
2319               if (q == NULL)
2320                 pp = &p->next;
2321             }
2322           *pp = edir->dyn_relocs;
2323         }
2324
2325       edir->dyn_relocs = eind->dyn_relocs;
2326       eind->dyn_relocs = NULL;
2327     }
2328
2329   edir->tls_mask |= eind->tls_mask;
2330
2331   if (ELIMINATE_COPY_RELOCS
2332       && ind->root.type != bfd_link_hash_indirect
2333       && dir->dynamic_adjusted)
2334     {
2335       /* If called to transfer flags for a weakdef during processing
2336          of elf_adjust_dynamic_symbol, don't copy non_got_ref.
2337          We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
2338       dir->ref_dynamic |= ind->ref_dynamic;
2339       dir->ref_regular |= ind->ref_regular;
2340       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
2341       dir->needs_plt |= ind->needs_plt;
2342     }
2343   else
2344     _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
2345 }
2346
2347 /* Return 1 if target is one of ours.  */
2348
2349 static bfd_boolean
2350 is_ppc_elf_target (const struct bfd_target *targ)
2351 {
2352   extern const bfd_target bfd_elf32_powerpc_vec;
2353   extern const bfd_target bfd_elf32_powerpcle_vec;
2354
2355   return targ == &bfd_elf32_powerpc_vec || targ == &bfd_elf32_powerpcle_vec;
2356 }
2357
2358 /* Hook called by the linker routine which adds symbols from an object
2359    file.  We use it to put .comm items in .sbss, and not .bss.  */
2360
2361 static bfd_boolean
2362 ppc_elf_add_symbol_hook (bfd *abfd,
2363                          struct bfd_link_info *info,
2364                          Elf_Internal_Sym *sym,
2365                          const char **namep ATTRIBUTE_UNUSED,
2366                          flagword *flagsp ATTRIBUTE_UNUSED,
2367                          asection **secp,
2368                          bfd_vma *valp)
2369 {
2370   if (sym->st_shndx == SHN_COMMON
2371       && !info->relocatable
2372       && sym->st_size <= elf_gp_size (abfd)
2373       && is_ppc_elf_target (info->hash->creator))
2374     {
2375       /* Common symbols less than or equal to -G nn bytes are automatically
2376          put into .sbss.  */
2377       struct ppc_elf_link_hash_table *htab;
2378
2379       htab = ppc_elf_hash_table (info);
2380       if (htab->sbss == NULL)
2381         {
2382           flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
2383
2384           if (!htab->elf.dynobj)
2385             htab->elf.dynobj = abfd;
2386
2387           htab->sbss = bfd_make_section_anyway (htab->elf.dynobj, ".sbss");
2388           if (htab->sbss == NULL
2389               || ! bfd_set_section_flags (htab->elf.dynobj, htab->sbss, flags))
2390             return FALSE;
2391         }
2392
2393       *secp = htab->sbss;
2394       *valp = sym->st_size;
2395     }
2396
2397   return TRUE;
2398 }
2399 \f
2400 /* Create a special linker section.  */
2401
2402 static bfd_boolean
2403 ppc_elf_create_linker_section (bfd *abfd,
2404                                struct bfd_link_info *info,
2405                                flagword flags,
2406                                elf_linker_section_t *lsect)
2407 {
2408   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
2409   asection *s;
2410
2411   flags |= (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2412             | SEC_LINKER_CREATED);
2413
2414   /* Record the first bfd that needs the special sections.  */
2415   if (!htab->elf.dynobj)
2416     htab->elf.dynobj = abfd;
2417
2418   s = bfd_make_section_anyway (htab->elf.dynobj, lsect->name);
2419   if (s == NULL
2420       || !bfd_set_section_flags (htab->elf.dynobj, s, flags)
2421       || !bfd_set_section_alignment (htab->elf.dynobj, s, 2))
2422     return FALSE;
2423   lsect->section = s;
2424
2425   return TRUE;
2426 }
2427
2428 /* Find a linker generated pointer with a given addend and type.  */
2429
2430 static elf_linker_section_pointers_t *
2431 elf_find_pointer_linker_section
2432   (elf_linker_section_pointers_t *linker_pointers,
2433    bfd_vma addend,
2434    elf_linker_section_t *lsect)
2435 {
2436   for ( ; linker_pointers != NULL; linker_pointers = linker_pointers->next)
2437     if (lsect == linker_pointers->lsect && addend == linker_pointers->addend)
2438       return linker_pointers;
2439
2440   return NULL;
2441 }
2442
2443 /* Allocate a pointer to live in a linker created section.  */
2444
2445 static bfd_boolean
2446 elf_create_pointer_linker_section (bfd *abfd,
2447                                    elf_linker_section_t *lsect,
2448                                    struct elf_link_hash_entry *h,
2449                                    const Elf_Internal_Rela *rel)
2450 {
2451   elf_linker_section_pointers_t **ptr_linker_section_ptr = NULL;
2452   elf_linker_section_pointers_t *linker_section_ptr;
2453   unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
2454   bfd_size_type amt;
2455
2456   BFD_ASSERT (lsect != NULL);
2457
2458   /* Is this a global symbol?  */
2459   if (h != NULL)
2460     {
2461       struct ppc_elf_link_hash_entry *eh;
2462
2463       /* Has this symbol already been allocated?  If so, our work is done.  */
2464       eh = (struct ppc_elf_link_hash_entry *) h;
2465       if (elf_find_pointer_linker_section (eh->linker_section_pointer,
2466                                            rel->r_addend,
2467                                            lsect))
2468         return TRUE;
2469
2470       ptr_linker_section_ptr = &eh->linker_section_pointer;
2471     }
2472   else
2473     {
2474       /* Allocation of a pointer to a local symbol.  */
2475       elf_linker_section_pointers_t **ptr = elf_local_ptr_offsets (abfd);
2476
2477       /* Allocate a table to hold the local symbols if first time.  */
2478       if (!ptr)
2479         {
2480           unsigned int num_symbols = elf_tdata (abfd)->symtab_hdr.sh_info;
2481
2482           amt = num_symbols;
2483           amt *= sizeof (elf_linker_section_pointers_t *);
2484           ptr = bfd_zalloc (abfd, amt);
2485
2486           if (!ptr)
2487             return FALSE;
2488
2489           elf_local_ptr_offsets (abfd) = ptr;
2490         }
2491
2492       /* Has this symbol already been allocated?  If so, our work is done.  */
2493       if (elf_find_pointer_linker_section (ptr[r_symndx],
2494                                            rel->r_addend,
2495                                            lsect))
2496         return TRUE;
2497
2498       ptr_linker_section_ptr = &ptr[r_symndx];
2499     }
2500
2501   /* Allocate space for a pointer in the linker section, and allocate
2502      a new pointer record from internal memory.  */
2503   BFD_ASSERT (ptr_linker_section_ptr != NULL);
2504   amt = sizeof (elf_linker_section_pointers_t);
2505   linker_section_ptr = bfd_alloc (abfd, amt);
2506
2507   if (!linker_section_ptr)
2508     return FALSE;
2509
2510   linker_section_ptr->next = *ptr_linker_section_ptr;
2511   linker_section_ptr->addend = rel->r_addend;
2512   linker_section_ptr->lsect = lsect;
2513   *ptr_linker_section_ptr = linker_section_ptr;
2514
2515   linker_section_ptr->offset = lsect->section->size;
2516   lsect->section->size += 4;
2517
2518 #ifdef DEBUG
2519   fprintf (stderr,
2520            "Create pointer in linker section %s, offset = %ld, section size = %ld\n",
2521            lsect->name, (long) linker_section_ptr->offset,
2522            (long) lsect->section->size);
2523 #endif
2524
2525   return TRUE;
2526 }
2527
2528 static bfd_boolean
2529 update_local_sym_info (bfd *abfd,
2530                        Elf_Internal_Shdr *symtab_hdr,
2531                        unsigned long r_symndx,
2532                        int tls_type)
2533 {
2534   bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
2535   char *local_got_tls_masks;
2536
2537   if (local_got_refcounts == NULL)
2538     {
2539       bfd_size_type size = symtab_hdr->sh_info;
2540
2541       size *= sizeof (*local_got_refcounts) + sizeof (*local_got_tls_masks);
2542       local_got_refcounts = bfd_zalloc (abfd, size);
2543       if (local_got_refcounts == NULL)
2544         return FALSE;
2545       elf_local_got_refcounts (abfd) = local_got_refcounts;
2546     }
2547
2548   local_got_refcounts[r_symndx] += 1;
2549   local_got_tls_masks = (char *) (local_got_refcounts + symtab_hdr->sh_info);
2550   local_got_tls_masks[r_symndx] |= tls_type;
2551   return TRUE;
2552 }
2553
2554 static void
2555 bad_shared_reloc (bfd *abfd, enum elf_ppc_reloc_type r_type)
2556 {
2557   (*_bfd_error_handler)
2558     (_("%B: relocation %s cannot be used when making a shared object"),
2559      abfd,
2560      ppc_elf_howto_table[r_type]->name);
2561   bfd_set_error (bfd_error_bad_value);
2562 }
2563
2564 /* Look through the relocs for a section during the first phase, and
2565    allocate space in the global offset table or procedure linkage
2566    table.  */
2567
2568 static bfd_boolean
2569 ppc_elf_check_relocs (bfd *abfd,
2570                       struct bfd_link_info *info,
2571                       asection *sec,
2572                       const Elf_Internal_Rela *relocs)
2573 {
2574   struct ppc_elf_link_hash_table *htab;
2575   Elf_Internal_Shdr *symtab_hdr;
2576   struct elf_link_hash_entry **sym_hashes;
2577   const Elf_Internal_Rela *rel;
2578   const Elf_Internal_Rela *rel_end;
2579   asection *sreloc;
2580
2581   if (info->relocatable)
2582     return TRUE;
2583
2584 #ifdef DEBUG
2585   _bfd_error_handler ("ppc_elf_check_relocs called for section %A in %B",
2586                       sec, abfd);
2587 #endif
2588
2589   /* Initialize howto table if not already done.  */
2590   if (!ppc_elf_howto_table[R_PPC_ADDR32])
2591     ppc_elf_howto_init ();
2592
2593   htab = ppc_elf_hash_table (info);
2594   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2595   sym_hashes = elf_sym_hashes (abfd);
2596   sreloc = NULL;
2597
2598   rel_end = relocs + sec->reloc_count;
2599   for (rel = relocs; rel < rel_end; rel++)
2600     {
2601       unsigned long r_symndx;
2602       enum elf_ppc_reloc_type r_type;
2603       struct elf_link_hash_entry *h;
2604       int tls_type = 0;
2605
2606       r_symndx = ELF32_R_SYM (rel->r_info);
2607       if (r_symndx < symtab_hdr->sh_info)
2608         h = NULL;
2609       else
2610         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2611
2612       /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
2613          This shows up in particular in an R_PPC_ADDR32 in the eabi
2614          startup code.  */
2615       if (h && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2616         {
2617           if (htab->got == NULL)
2618             {
2619               if (htab->elf.dynobj == NULL)
2620                 htab->elf.dynobj = abfd;
2621               if (!ppc_elf_create_got (htab->elf.dynobj, info))
2622                 return FALSE;
2623             }
2624         }
2625
2626       r_type = ELF32_R_TYPE (rel->r_info);
2627       switch (r_type)
2628         {
2629         case R_PPC_GOT_TLSLD16:
2630         case R_PPC_GOT_TLSLD16_LO:
2631         case R_PPC_GOT_TLSLD16_HI:
2632         case R_PPC_GOT_TLSLD16_HA:
2633           htab->tlsld_got.refcount += 1;
2634           tls_type = TLS_TLS | TLS_LD;
2635           goto dogottls;
2636
2637         case R_PPC_GOT_TLSGD16:
2638         case R_PPC_GOT_TLSGD16_LO:
2639         case R_PPC_GOT_TLSGD16_HI:
2640         case R_PPC_GOT_TLSGD16_HA:
2641           tls_type = TLS_TLS | TLS_GD;
2642           goto dogottls;
2643
2644         case R_PPC_GOT_TPREL16:
2645         case R_PPC_GOT_TPREL16_LO:
2646         case R_PPC_GOT_TPREL16_HI:
2647         case R_PPC_GOT_TPREL16_HA:
2648           if (info->shared)
2649             info->flags |= DF_STATIC_TLS;
2650           tls_type = TLS_TLS | TLS_TPREL;
2651           goto dogottls;
2652
2653         case R_PPC_GOT_DTPREL16:
2654         case R_PPC_GOT_DTPREL16_LO:
2655         case R_PPC_GOT_DTPREL16_HI:
2656         case R_PPC_GOT_DTPREL16_HA:
2657           tls_type = TLS_TLS | TLS_DTPREL;
2658         dogottls:
2659           sec->has_tls_reloc = 1;
2660           /* Fall thru */
2661
2662           /* GOT16 relocations */
2663         case R_PPC_GOT16:
2664         case R_PPC_GOT16_LO:
2665         case R_PPC_GOT16_HI:
2666         case R_PPC_GOT16_HA:
2667           /* This symbol requires a global offset table entry.  */
2668           if (htab->got == NULL)
2669             {
2670               if (htab->elf.dynobj == NULL)
2671                 htab->elf.dynobj = abfd;
2672               if (!ppc_elf_create_got (htab->elf.dynobj, info))
2673                 return FALSE;
2674             }
2675           if (h != NULL)
2676             {
2677               h->got.refcount += 1;
2678               ppc_elf_hash_entry (h)->tls_mask |= tls_type;
2679             }
2680           else
2681             /* This is a global offset table entry for a local symbol.  */
2682             if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, tls_type))
2683               return FALSE;
2684           break;
2685
2686           /* Indirect .sdata relocation.  */
2687         case R_PPC_EMB_SDAI16:
2688           if (info->shared)
2689             {
2690               bad_shared_reloc (abfd, r_type);
2691               return FALSE;
2692             }
2693           if (htab->sdata[0].section == NULL
2694               && !ppc_elf_create_linker_section (abfd, info, 0,
2695                                                  &htab->sdata[0]))
2696             return FALSE;
2697           if (!elf_create_pointer_linker_section (abfd, &htab->sdata[0],
2698                                                   h, rel))
2699             return FALSE;
2700           break;
2701
2702           /* Indirect .sdata2 relocation.  */
2703         case R_PPC_EMB_SDA2I16:
2704           if (info->shared)
2705             {
2706               bad_shared_reloc (abfd, r_type);
2707               return FALSE;
2708             }
2709           if (htab->sdata[1].section == NULL
2710               && !ppc_elf_create_linker_section (abfd, info, SEC_READONLY,
2711                                                  &htab->sdata[1]))
2712             return FALSE;
2713           if (!elf_create_pointer_linker_section (abfd, &htab->sdata[1],
2714                                                   h, rel))
2715             return FALSE;
2716           break;
2717
2718         case R_PPC_SDAREL16:
2719         case R_PPC_EMB_SDA2REL:
2720         case R_PPC_EMB_SDA21:
2721         case R_PPC_EMB_RELSDA:
2722         case R_PPC_EMB_NADDR32:
2723         case R_PPC_EMB_NADDR16:
2724         case R_PPC_EMB_NADDR16_LO:
2725         case R_PPC_EMB_NADDR16_HI:
2726         case R_PPC_EMB_NADDR16_HA:
2727           if (info->shared)
2728             {
2729               bad_shared_reloc (abfd, r_type);
2730               return FALSE;
2731             }
2732           break;
2733
2734         case R_PPC_PLT32:
2735         case R_PPC_PLTREL24:
2736         case R_PPC_PLTREL32:
2737         case R_PPC_PLT16_LO:
2738         case R_PPC_PLT16_HI:
2739         case R_PPC_PLT16_HA:
2740 #ifdef DEBUG
2741           fprintf (stderr, "Reloc requires a PLT entry\n");
2742 #endif
2743           /* This symbol requires a procedure linkage table entry.  We
2744              actually build the entry in finish_dynamic_symbol,
2745              because this might be a case of linking PIC code without
2746              linking in any dynamic objects, in which case we don't
2747              need to generate a procedure linkage table after all.  */
2748
2749           if (h == NULL)
2750             {
2751               /* It does not make sense to have a procedure linkage
2752                  table entry for a local symbol.  */
2753               (*_bfd_error_handler) (_("%B(%A+0x%lx): %s reloc against "
2754                                        "local symbol"),
2755                                      abfd,
2756                                      sec,
2757                                      (long) rel->r_offset,
2758                                      ppc_elf_howto_table[r_type]->name);
2759               bfd_set_error (bfd_error_bad_value);
2760               return FALSE;
2761             }
2762
2763           h->needs_plt = 1;
2764           h->plt.refcount++;
2765           break;
2766
2767           /* The following relocations don't need to propagate the
2768              relocation if linking a shared object since they are
2769              section relative.  */
2770         case R_PPC_SECTOFF:
2771         case R_PPC_SECTOFF_LO:
2772         case R_PPC_SECTOFF_HI:
2773         case R_PPC_SECTOFF_HA:
2774         case R_PPC_DTPREL16:
2775         case R_PPC_DTPREL16_LO:
2776         case R_PPC_DTPREL16_HI:
2777         case R_PPC_DTPREL16_HA:
2778         case R_PPC_TOC16:
2779           break;
2780
2781           /* This are just markers.  */
2782         case R_PPC_TLS:
2783         case R_PPC_EMB_MRKREF:
2784         case R_PPC_NONE:
2785         case R_PPC_max:
2786           break;
2787
2788           /* These should only appear in dynamic objects.  */
2789         case R_PPC_COPY:
2790         case R_PPC_GLOB_DAT:
2791         case R_PPC_JMP_SLOT:
2792         case R_PPC_RELATIVE:
2793           break;
2794
2795           /* These aren't handled yet.  We'll report an error later.  */
2796         case R_PPC_ADDR30:
2797         case R_PPC_EMB_RELSEC16:
2798         case R_PPC_EMB_RELST_LO:
2799         case R_PPC_EMB_RELST_HI:
2800         case R_PPC_EMB_RELST_HA:
2801         case R_PPC_EMB_BIT_FLD:
2802           break;
2803
2804           /* This refers only to functions defined in the shared library.  */
2805         case R_PPC_LOCAL24PC:
2806           break;
2807
2808           /* This relocation describes the C++ object vtable hierarchy.
2809              Reconstruct it for later use during GC.  */
2810         case R_PPC_GNU_VTINHERIT:
2811           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2812             return FALSE;
2813           break;
2814
2815           /* This relocation describes which C++ vtable entries are actually
2816              used.  Record for later use during GC.  */
2817         case R_PPC_GNU_VTENTRY:
2818           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2819             return FALSE;
2820           break;
2821
2822           /* We shouldn't really be seeing these.  */
2823         case R_PPC_TPREL32:
2824           if (info->shared)
2825             info->flags |= DF_STATIC_TLS;
2826           goto dodyn;
2827
2828           /* Nor these.  */
2829         case R_PPC_DTPMOD32:
2830         case R_PPC_DTPREL32:
2831           goto dodyn;
2832
2833         case R_PPC_TPREL16:
2834         case R_PPC_TPREL16_LO:
2835         case R_PPC_TPREL16_HI:
2836         case R_PPC_TPREL16_HA:
2837           if (info->shared)
2838             info->flags |= DF_STATIC_TLS;
2839           goto dodyn;
2840
2841           /* When creating a shared object, we must copy these
2842              relocs into the output file.  We create a reloc
2843              section in dynobj and make room for the reloc.  */
2844         case R_PPC_REL24:
2845         case R_PPC_REL14:
2846         case R_PPC_REL14_BRTAKEN:
2847         case R_PPC_REL14_BRNTAKEN:
2848         case R_PPC_REL32:
2849           if (h == NULL
2850               || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2851             break;
2852           /* fall through */
2853
2854         case R_PPC_ADDR32:
2855         case R_PPC_ADDR24:
2856         case R_PPC_ADDR16:
2857         case R_PPC_ADDR16_LO:
2858         case R_PPC_ADDR16_HI:
2859         case R_PPC_ADDR16_HA:
2860         case R_PPC_ADDR14:
2861         case R_PPC_ADDR14_BRTAKEN:
2862         case R_PPC_ADDR14_BRNTAKEN:
2863         case R_PPC_UADDR32:
2864         case R_PPC_UADDR16:
2865           if (h != NULL && !info->shared)
2866             {
2867               /* We may need a plt entry if the symbol turns out to be
2868                  a function defined in a dynamic object.  */
2869               h->plt.refcount++;
2870
2871               /* We may need a copy reloc too.  */
2872               h->non_got_ref = 1;
2873             }
2874
2875         dodyn:
2876           /* If we are creating a shared library, and this is a reloc
2877              against a global symbol, or a non PC relative reloc
2878              against a local symbol, then we need to copy the reloc
2879              into the shared library.  However, if we are linking with
2880              -Bsymbolic, we do not need to copy a reloc against a
2881              global symbol which is defined in an object we are
2882              including in the link (i.e., DEF_REGULAR is set).  At
2883              this point we have not seen all the input files, so it is
2884              possible that DEF_REGULAR is not set now but will be set
2885              later (it is never cleared).  In case of a weak definition,
2886              DEF_REGULAR may be cleared later by a strong definition in
2887              a shared library.  We account for that possibility below by
2888              storing information in the dyn_relocs field of the hash
2889              table entry.  A similar situation occurs when creating
2890              shared libraries and symbol visibility changes render the
2891              symbol local.
2892
2893              If on the other hand, we are creating an executable, we
2894              may need to keep relocations for symbols satisfied by a
2895              dynamic library if we manage to avoid copy relocs for the
2896              symbol.  */
2897           if ((info->shared
2898                && (MUST_BE_DYN_RELOC (r_type)
2899                    || (h != NULL
2900                        && (! info->symbolic
2901                            || h->root.type == bfd_link_hash_defweak
2902                            || !h->def_regular))))
2903               || (ELIMINATE_COPY_RELOCS
2904                   && !info->shared
2905                   && (sec->flags & SEC_ALLOC) != 0
2906                   && h != NULL
2907                   && (h->root.type == bfd_link_hash_defweak
2908                       || !h->def_regular)))
2909             {
2910               struct ppc_elf_dyn_relocs *p;
2911               struct ppc_elf_dyn_relocs **head;
2912
2913 #ifdef DEBUG
2914               fprintf (stderr,
2915                        "ppc_elf_check_relocs needs to "
2916                        "create relocation for %s\n",
2917                        (h && h->root.root.string
2918                         ? h->root.root.string : "<unknown>"));
2919 #endif
2920               if (sreloc == NULL)
2921                 {
2922                   const char *name;
2923
2924                   name = (bfd_elf_string_from_elf_section
2925                           (abfd,
2926                            elf_elfheader (abfd)->e_shstrndx,
2927                            elf_section_data (sec)->rel_hdr.sh_name));
2928                   if (name == NULL)
2929                     return FALSE;
2930
2931                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
2932                               && strcmp (bfd_get_section_name (abfd, sec),
2933                                          name + 5) == 0);
2934
2935                   if (htab->elf.dynobj == NULL)
2936                     htab->elf.dynobj = abfd;
2937                   sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
2938                   if (sreloc == NULL)
2939                     {
2940                       flagword flags;
2941
2942                       sreloc = bfd_make_section (htab->elf.dynobj, name);
2943                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
2944                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2945                       if ((sec->flags & SEC_ALLOC) != 0)
2946                         flags |= SEC_ALLOC | SEC_LOAD;
2947                       if (sreloc == NULL
2948                           || ! bfd_set_section_flags (htab->elf.dynobj,
2949                                                       sreloc, flags)
2950                           || ! bfd_set_section_alignment (htab->elf.dynobj,
2951                                                           sreloc, 2))
2952                         return FALSE;
2953                     }
2954                   elf_section_data (sec)->sreloc = sreloc;
2955                 }
2956
2957               /* If this is a global symbol, we count the number of
2958                  relocations we need for this symbol.  */
2959               if (h != NULL)
2960                 {
2961                   head = &ppc_elf_hash_entry (h)->dyn_relocs;
2962                 }
2963               else
2964                 {
2965                   /* Track dynamic relocs needed for local syms too.
2966                      We really need local syms available to do this
2967                      easily.  Oh well.  */
2968
2969                   asection *s;
2970                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
2971                                                  sec, r_symndx);
2972                   if (s == NULL)
2973                     return FALSE;
2974
2975                   head = ((struct ppc_elf_dyn_relocs **)
2976                           &elf_section_data (s)->local_dynrel);
2977                 }
2978
2979               p = *head;
2980               if (p == NULL || p->sec != sec)
2981                 {
2982                   p = bfd_alloc (htab->elf.dynobj, sizeof *p);
2983                   if (p == NULL)
2984                     return FALSE;
2985                   p->next = *head;
2986                   *head = p;
2987                   p->sec = sec;
2988                   p->count = 0;
2989                   p->pc_count = 0;
2990                 }
2991
2992               p->count += 1;
2993               if (!MUST_BE_DYN_RELOC (r_type))
2994                 p->pc_count += 1;
2995             }
2996
2997           break;
2998         }
2999     }
3000
3001   return TRUE;
3002 }
3003 \f
3004 /* Merge backend specific data from an object file to the output
3005    object file when linking.  */
3006
3007 static bfd_boolean
3008 ppc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
3009 {
3010   flagword old_flags;
3011   flagword new_flags;
3012   bfd_boolean error;
3013
3014   if (!is_ppc_elf_target (ibfd->xvec)
3015       || !is_ppc_elf_target (obfd->xvec))
3016     return TRUE;
3017
3018   /* Check if we have the same endianess.  */
3019   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
3020     return FALSE;
3021
3022   new_flags = elf_elfheader (ibfd)->e_flags;
3023   old_flags = elf_elfheader (obfd)->e_flags;
3024   if (!elf_flags_init (obfd))
3025     {
3026       /* First call, no flags set.  */
3027       elf_flags_init (obfd) = TRUE;
3028       elf_elfheader (obfd)->e_flags = new_flags;
3029     }
3030
3031   /* Compatible flags are ok.  */
3032   else if (new_flags == old_flags)
3033     ;
3034
3035   /* Incompatible flags.  */
3036   else
3037     {
3038       /* Warn about -mrelocatable mismatch.  Allow -mrelocatable-lib
3039          to be linked with either.  */
3040       error = FALSE;
3041       if ((new_flags & EF_PPC_RELOCATABLE) != 0
3042           && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
3043         {
3044           error = TRUE;
3045           (*_bfd_error_handler)
3046             (_("%B: compiled with -mrelocatable and linked with "
3047                "modules compiled normally"), ibfd);
3048         }
3049       else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
3050                && (old_flags & EF_PPC_RELOCATABLE) != 0)
3051         {
3052           error = TRUE;
3053           (*_bfd_error_handler)
3054             (_("%B: compiled normally and linked with "
3055                "modules compiled with -mrelocatable"), ibfd);
3056         }
3057
3058       /* The output is -mrelocatable-lib iff both the input files are.  */
3059       if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
3060         elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
3061
3062       /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
3063          but each input file is either -mrelocatable or -mrelocatable-lib.  */
3064       if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
3065           && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
3066           && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
3067         elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
3068
3069       /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
3070          any module uses it.  */
3071       elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
3072
3073       new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
3074       old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
3075
3076       /* Warn about any other mismatches.  */
3077       if (new_flags != old_flags)
3078         {
3079           error = TRUE;
3080           (*_bfd_error_handler)
3081             (_("%B: uses different e_flags (0x%lx) fields "
3082                "than previous modules (0x%lx)"),
3083              ibfd, (long) new_flags, (long) old_flags);
3084         }
3085
3086       if (error)
3087         {
3088           bfd_set_error (bfd_error_bad_value);
3089           return FALSE;
3090         }
3091     }
3092
3093   return TRUE;
3094 }
3095 \f
3096 /* Return the section that should be marked against GC for a given
3097    relocation.  */
3098
3099 static asection *
3100 ppc_elf_gc_mark_hook (asection *sec,
3101                       struct bfd_link_info *info ATTRIBUTE_UNUSED,
3102                       Elf_Internal_Rela *rel,
3103                       struct elf_link_hash_entry *h,
3104                       Elf_Internal_Sym *sym)
3105 {
3106   if (h != NULL)
3107     {
3108       switch (ELF32_R_TYPE (rel->r_info))
3109         {
3110         case R_PPC_GNU_VTINHERIT:
3111         case R_PPC_GNU_VTENTRY:
3112           break;
3113
3114         default:
3115           switch (h->root.type)
3116             {
3117             case bfd_link_hash_defined:
3118             case bfd_link_hash_defweak:
3119               return h->root.u.def.section;
3120
3121             case bfd_link_hash_common:
3122               return h->root.u.c.p->section;
3123
3124             default:
3125               break;
3126             }
3127         }
3128     }
3129   else
3130     return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
3131
3132   return NULL;
3133 }
3134
3135 /* Update the got, plt and dynamic reloc reference counts for the
3136    section being removed.  */
3137
3138 static bfd_boolean
3139 ppc_elf_gc_sweep_hook (bfd *abfd,
3140                        struct bfd_link_info *info,
3141                        asection *sec,
3142                        const Elf_Internal_Rela *relocs)
3143 {
3144   struct ppc_elf_link_hash_table *htab;
3145   Elf_Internal_Shdr *symtab_hdr;
3146   struct elf_link_hash_entry **sym_hashes;
3147   bfd_signed_vma *local_got_refcounts;
3148   const Elf_Internal_Rela *rel, *relend;
3149
3150   elf_section_data (sec)->local_dynrel = NULL;
3151
3152   htab = ppc_elf_hash_table (info);
3153   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3154   sym_hashes = elf_sym_hashes (abfd);
3155   local_got_refcounts = elf_local_got_refcounts (abfd);
3156
3157   relend = relocs + sec->reloc_count;
3158   for (rel = relocs; rel < relend; rel++)
3159     {
3160       unsigned long r_symndx;
3161       enum elf_ppc_reloc_type r_type;
3162       struct elf_link_hash_entry *h = NULL;
3163
3164       r_symndx = ELF32_R_SYM (rel->r_info);
3165       if (r_symndx >= symtab_hdr->sh_info)
3166         {
3167           struct ppc_elf_dyn_relocs **pp, *p;
3168           struct ppc_elf_link_hash_entry *eh;
3169
3170           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3171           while (h->root.type == bfd_link_hash_indirect
3172                  || h->root.type == bfd_link_hash_warning)
3173             h = (struct elf_link_hash_entry *) h->root.u.i.link;
3174           eh = (struct ppc_elf_link_hash_entry *) h;
3175
3176           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
3177             if (p->sec == sec)
3178               {
3179                 /* Everything must go for SEC.  */
3180                 *pp = p->next;
3181                 break;
3182               }
3183         }
3184
3185       r_type = ELF32_R_TYPE (rel->r_info);
3186       switch (r_type)
3187         {
3188         case R_PPC_GOT_TLSLD16:
3189         case R_PPC_GOT_TLSLD16_LO:
3190         case R_PPC_GOT_TLSLD16_HI:
3191         case R_PPC_GOT_TLSLD16_HA:
3192           htab->tlsld_got.refcount -= 1;
3193           /* Fall thru */
3194
3195         case R_PPC_GOT_TLSGD16:
3196         case R_PPC_GOT_TLSGD16_LO:
3197         case R_PPC_GOT_TLSGD16_HI:
3198         case R_PPC_GOT_TLSGD16_HA:
3199         case R_PPC_GOT_TPREL16:
3200         case R_PPC_GOT_TPREL16_LO:
3201         case R_PPC_GOT_TPREL16_HI:
3202         case R_PPC_GOT_TPREL16_HA:
3203         case R_PPC_GOT_DTPREL16:
3204         case R_PPC_GOT_DTPREL16_LO:
3205         case R_PPC_GOT_DTPREL16_HI:
3206         case R_PPC_GOT_DTPREL16_HA:
3207         case R_PPC_GOT16:
3208         case R_PPC_GOT16_LO:
3209         case R_PPC_GOT16_HI:
3210         case R_PPC_GOT16_HA:
3211           if (h != NULL)
3212             {
3213               if (h->got.refcount > 0)
3214                 h->got.refcount--;
3215             }
3216           else if (local_got_refcounts != NULL)
3217             {
3218               if (local_got_refcounts[r_symndx] > 0)
3219                 local_got_refcounts[r_symndx]--;
3220             }
3221           break;
3222
3223         case R_PPC_REL24:
3224         case R_PPC_REL14:
3225         case R_PPC_REL14_BRTAKEN:
3226         case R_PPC_REL14_BRNTAKEN:
3227         case R_PPC_REL32:
3228           if (h == NULL
3229               || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3230             break;
3231           /* Fall thru */
3232
3233         case R_PPC_ADDR32:
3234         case R_PPC_ADDR24:
3235         case R_PPC_ADDR16:
3236         case R_PPC_ADDR16_LO:
3237         case R_PPC_ADDR16_HI:
3238         case R_PPC_ADDR16_HA:
3239         case R_PPC_ADDR14:
3240         case R_PPC_ADDR14_BRTAKEN:
3241         case R_PPC_ADDR14_BRNTAKEN:
3242         case R_PPC_UADDR32:
3243         case R_PPC_UADDR16:
3244         case R_PPC_PLT32:
3245         case R_PPC_PLTREL24:
3246         case R_PPC_PLT16_LO:
3247         case R_PPC_PLT16_HI:
3248         case R_PPC_PLT16_HA:
3249           if (h != NULL)
3250             {
3251               if (h->plt.refcount > 0)
3252                 h->plt.refcount--;
3253             }
3254           break;
3255
3256         default:
3257           break;
3258         }
3259     }
3260   return TRUE;
3261 }
3262 \f
3263 /* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
3264
3265 asection *
3266 ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
3267 {
3268   struct ppc_elf_link_hash_table *htab;
3269
3270   htab = ppc_elf_hash_table (info);
3271   htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
3272                                              FALSE, FALSE, TRUE);
3273
3274   return _bfd_elf_tls_setup (obfd, info);
3275 }
3276
3277 /* Run through all the TLS relocs looking for optimization
3278    opportunities.  */
3279
3280 bfd_boolean
3281 ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
3282                       struct bfd_link_info *info)
3283 {
3284   bfd *ibfd;
3285   asection *sec;
3286   struct ppc_elf_link_hash_table *htab;
3287
3288   if (info->relocatable || info->shared)
3289     return TRUE;
3290
3291   htab = ppc_elf_hash_table (info);
3292   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3293     {
3294       Elf_Internal_Sym *locsyms = NULL;
3295       Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3296
3297       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3298         if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
3299           {
3300             Elf_Internal_Rela *relstart, *rel, *relend;
3301             int expecting_tls_get_addr;
3302
3303             /* Read the relocations.  */
3304             relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
3305                                                   info->keep_memory);
3306             if (relstart == NULL)
3307               return FALSE;
3308
3309             expecting_tls_get_addr = 0;
3310             relend = relstart + sec->reloc_count;
3311             for (rel = relstart; rel < relend; rel++)
3312               {
3313                 enum elf_ppc_reloc_type r_type;
3314                 unsigned long r_symndx;
3315                 struct elf_link_hash_entry *h = NULL;
3316                 char *tls_mask;
3317                 char tls_set, tls_clear;
3318                 bfd_boolean is_local;
3319
3320                 r_symndx = ELF32_R_SYM (rel->r_info);
3321                 if (r_symndx >= symtab_hdr->sh_info)
3322                   {
3323                     struct elf_link_hash_entry **sym_hashes;
3324
3325                     sym_hashes = elf_sym_hashes (ibfd);
3326                     h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3327                     while (h->root.type == bfd_link_hash_indirect
3328                            || h->root.type == bfd_link_hash_warning)
3329                       h = (struct elf_link_hash_entry *) h->root.u.i.link;
3330                   }
3331
3332                 is_local = FALSE;
3333                 if (h == NULL
3334                     || !h->def_dynamic)
3335                   is_local = TRUE;
3336
3337                 r_type = ELF32_R_TYPE (rel->r_info);
3338                 switch (r_type)
3339                   {
3340                   case R_PPC_GOT_TLSLD16:
3341                   case R_PPC_GOT_TLSLD16_LO:
3342                   case R_PPC_GOT_TLSLD16_HI:
3343                   case R_PPC_GOT_TLSLD16_HA:
3344                     /* These relocs should never be against a symbol
3345                        defined in a shared lib.  Leave them alone if
3346                        that turns out to be the case.  */
3347                     expecting_tls_get_addr = 0;
3348                     htab->tlsld_got.refcount -= 1;
3349                     if (!is_local)
3350                       continue;
3351
3352                     /* LD -> LE */
3353                     tls_set = 0;
3354                     tls_clear = TLS_LD;
3355                     expecting_tls_get_addr = 1;
3356                     break;
3357
3358                   case R_PPC_GOT_TLSGD16:
3359                   case R_PPC_GOT_TLSGD16_LO:
3360                   case R_PPC_GOT_TLSGD16_HI:
3361                   case R_PPC_GOT_TLSGD16_HA:
3362                     if (is_local)
3363                       /* GD -> LE */
3364                       tls_set = 0;
3365                     else
3366                       /* GD -> IE */
3367                       tls_set = TLS_TLS | TLS_TPRELGD;
3368                     tls_clear = TLS_GD;
3369                     expecting_tls_get_addr = 1;
3370                     break;
3371
3372                   case R_PPC_GOT_TPREL16:
3373                   case R_PPC_GOT_TPREL16_LO:
3374                   case R_PPC_GOT_TPREL16_HI:
3375                   case R_PPC_GOT_TPREL16_HA:
3376                     expecting_tls_get_addr = 0;
3377                     if (is_local)
3378                       {
3379                         /* IE -> LE */
3380                         tls_set = 0;
3381                         tls_clear = TLS_TPREL;
3382                         break;
3383                       }
3384                     else
3385                       continue;
3386
3387                   case R_PPC_REL14:
3388                   case R_PPC_REL14_BRTAKEN:
3389                   case R_PPC_REL14_BRNTAKEN:
3390                   case R_PPC_REL24:
3391                     if (expecting_tls_get_addr
3392                         && h != NULL
3393                         && h == htab->tls_get_addr)
3394                       {
3395                         if (h->plt.refcount > 0)
3396                           h->plt.refcount -= 1;
3397                       }
3398                     expecting_tls_get_addr = 0;
3399                     continue;
3400
3401                   default:
3402                     expecting_tls_get_addr = 0;
3403                     continue;
3404                   }
3405
3406                 if (h != NULL)
3407                   {
3408                     if (tls_set == 0)
3409                       {
3410                         /* We managed to get rid of a got entry.  */
3411                         if (h->got.refcount > 0)
3412                           h->got.refcount -= 1;
3413                       }
3414                     tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
3415                   }
3416                 else
3417                   {
3418                     Elf_Internal_Sym *sym;
3419                     bfd_signed_vma *lgot_refs;
3420                     char *lgot_masks;
3421
3422                     if (locsyms == NULL)
3423                       {
3424                         locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
3425                         if (locsyms == NULL)
3426                           locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
3427                                                           symtab_hdr->sh_info,
3428                                                           0, NULL, NULL, NULL);
3429                         if (locsyms == NULL)
3430                           {
3431                             if (elf_section_data (sec)->relocs != relstart)
3432                               free (relstart);
3433                             return FALSE;
3434                           }
3435                       }
3436                     sym = locsyms + r_symndx;
3437                     lgot_refs = elf_local_got_refcounts (ibfd);
3438                     if (lgot_refs == NULL)
3439                       abort ();
3440                     if (tls_set == 0)
3441                       {
3442                         /* We managed to get rid of a got entry.  */
3443                         if (lgot_refs[r_symndx] > 0)
3444                           lgot_refs[r_symndx] -= 1;
3445                       }
3446                     lgot_masks = (char *) (lgot_refs + symtab_hdr->sh_info);
3447                     tls_mask = &lgot_masks[r_symndx];
3448                   }
3449
3450                 *tls_mask |= tls_set;
3451                 *tls_mask &= ~tls_clear;
3452               }
3453
3454             if (elf_section_data (sec)->relocs != relstart)
3455               free (relstart);
3456           }
3457
3458       if (locsyms != NULL
3459           && (symtab_hdr->contents != (unsigned char *) locsyms))
3460         {
3461           if (!info->keep_memory)
3462             free (locsyms);
3463           else
3464             symtab_hdr->contents = (unsigned char *) locsyms;
3465         }
3466     }
3467   return TRUE;
3468 }
3469 \f
3470 /* Adjust a symbol defined by a dynamic object and referenced by a
3471    regular object.  The current definition is in some section of the
3472    dynamic object, but we're not including those sections.  We have to
3473    change the definition to something the rest of the link can
3474    understand.  */
3475
3476 static bfd_boolean
3477 ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
3478                                struct elf_link_hash_entry *h)
3479 {
3480   struct ppc_elf_link_hash_table *htab;
3481   asection *s;
3482   unsigned int power_of_two;
3483
3484 #ifdef DEBUG
3485   fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
3486            h->root.root.string);
3487 #endif
3488
3489   /* Make sure we know what is going on here.  */
3490   htab = ppc_elf_hash_table (info);
3491   BFD_ASSERT (htab->elf.dynobj != NULL
3492               && (h->needs_plt
3493                   || h->u.weakdef != NULL
3494                   || (h->def_dynamic
3495                       && h->ref_regular
3496                       && !h->def_regular)));
3497
3498   /* Deal with function syms.  */
3499   if (h->type == STT_FUNC
3500       || h->needs_plt)
3501     {
3502       /* Clear procedure linkage table information for any symbol that
3503          won't need a .plt entry.  */
3504       if (h->plt.refcount <= 0
3505           || SYMBOL_CALLS_LOCAL (info, h)
3506           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3507               && h->root.type == bfd_link_hash_undefweak))
3508         {
3509           /* A PLT entry is not required/allowed when:
3510
3511              1. We are not using ld.so; because then the PLT entry
3512              can't be set up, so we can't use one.  In this case,
3513              ppc_elf_adjust_dynamic_symbol won't even be called.
3514
3515              2. GC has rendered the entry unused.
3516
3517              3. We know for certain that a call to this symbol
3518              will go to this object, or will remain undefined.  */
3519           h->plt.offset = (bfd_vma) -1;
3520           h->needs_plt = 0;
3521         }
3522       return TRUE;
3523     }
3524   else
3525     h->plt.offset = (bfd_vma) -1;
3526
3527   /* If this is a weak symbol, and there is a real definition, the
3528      processor independent code will have arranged for us to see the
3529      real definition first, and we can just use the same value.  */
3530   if (h->u.weakdef != NULL)
3531     {
3532       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
3533                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
3534       h->root.u.def.section = h->u.weakdef->root.u.def.section;
3535       h->root.u.def.value = h->u.weakdef->root.u.def.value;
3536       if (ELIMINATE_COPY_RELOCS)
3537         h->non_got_ref = h->u.weakdef->non_got_ref;
3538       return TRUE;
3539     }
3540
3541   /* This is a reference to a symbol defined by a dynamic object which
3542      is not a function.  */
3543
3544   /* If we are creating a shared library, we must presume that the
3545      only references to the symbol are via the global offset table.
3546      For such cases we need not do anything here; the relocations will
3547      be handled correctly by relocate_section.  */
3548   if (info->shared)
3549     return TRUE;
3550
3551   /* If there are no references to this symbol that do not use the
3552      GOT, we don't need to generate a copy reloc.  */
3553   if (!h->non_got_ref)
3554     return TRUE;
3555
3556   if (ELIMINATE_COPY_RELOCS)
3557     {
3558       struct ppc_elf_dyn_relocs *p;
3559       for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
3560         {
3561           s = p->sec->output_section;
3562           if (s != NULL && (s->flags & SEC_READONLY) != 0)
3563             break;
3564         }
3565
3566       /* If we didn't find any dynamic relocs in read-only sections, then
3567          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
3568       if (p == NULL)
3569         {
3570           h->non_got_ref = 0;
3571           return TRUE;
3572         }
3573     }
3574
3575   /* We must allocate the symbol in our .dynbss section, which will
3576      become part of the .bss section of the executable.  There will be
3577      an entry for this symbol in the .dynsym section.  The dynamic
3578      object will contain position independent code, so all references
3579      from the dynamic object to this symbol will go through the global
3580      offset table.  The dynamic linker will use the .dynsym entry to
3581      determine the address it must put in the global offset table, so
3582      both the dynamic object and the regular object will refer to the
3583      same memory location for the variable.
3584
3585      Of course, if the symbol is sufficiently small, we must instead
3586      allocate it in .sbss.  FIXME: It would be better to do this if and
3587      only if there were actually SDAREL relocs for that symbol.  */
3588
3589   if (h->size <= elf_gp_size (htab->elf.dynobj))
3590     s = htab->dynsbss;
3591   else
3592     s = htab->dynbss;
3593   BFD_ASSERT (s != NULL);
3594
3595   /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
3596      copy the initial value out of the dynamic object and into the
3597      runtime process image.  We need to remember the offset into the
3598      .rela.bss section we are going to use.  */
3599   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
3600     {
3601       asection *srel;
3602
3603       if (h->size <= elf_gp_size (htab->elf.dynobj))
3604         srel = htab->relsbss;
3605       else
3606         srel = htab->relbss;
3607       BFD_ASSERT (srel != NULL);
3608       srel->size += sizeof (Elf32_External_Rela);
3609       h->needs_copy = 1;
3610     }
3611
3612   /* We need to figure out the alignment required for this symbol.  I
3613      have no idea how ELF linkers handle this.  */
3614   power_of_two = bfd_log2 (h->size);
3615   if (power_of_two > 4)
3616     power_of_two = 4;
3617
3618   /* Apply the required alignment.  */
3619   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
3620   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
3621     {
3622       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
3623         return FALSE;
3624     }
3625
3626   /* Define the symbol as being at this point in the section.  */
3627   h->root.u.def.section = s;
3628   h->root.u.def.value = s->size;
3629
3630   /* Increment the section size to make room for the symbol.  */
3631   s->size += h->size;
3632
3633   return TRUE;
3634 }
3635 \f
3636 /* Allocate space in associated reloc sections for dynamic relocs.  */
3637
3638 static bfd_boolean
3639 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3640 {
3641   struct bfd_link_info *info = inf;
3642   struct ppc_elf_link_hash_entry *eh;
3643   struct ppc_elf_link_hash_table *htab;
3644   struct ppc_elf_dyn_relocs *p;
3645
3646   if (h->root.type == bfd_link_hash_indirect)
3647     return TRUE;
3648
3649   if (h->root.type == bfd_link_hash_warning)
3650     /* When warning symbols are created, they **replace** the "real"
3651        entry in the hash table, thus we never get to see the real
3652        symbol in a hash traversal.  So look at it now.  */
3653     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3654
3655   htab = ppc_elf_hash_table (info);
3656   if (htab->elf.dynamic_sections_created
3657       && h->plt.refcount > 0)
3658     {
3659       /* Make sure this symbol is output as a dynamic symbol.  */
3660       if (h->dynindx == -1
3661           && !h->forced_local)
3662         {
3663           if (! bfd_elf_link_record_dynamic_symbol (info, h))
3664             return FALSE;
3665         }
3666
3667       if (info->shared
3668           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
3669         {
3670           asection *s = htab->plt;
3671
3672           /* If this is the first .plt entry, make room for the special
3673              first entry.  */
3674           if (s->size == 0)
3675             s->size += PLT_INITIAL_ENTRY_SIZE;
3676
3677           /* The PowerPC PLT is actually composed of two parts, the
3678              first part is 2 words (for a load and a jump), and then
3679              there is a remaining word available at the end.  */
3680           h->plt.offset = (PLT_INITIAL_ENTRY_SIZE
3681                            + (PLT_SLOT_SIZE
3682                               * ((s->size - PLT_INITIAL_ENTRY_SIZE)
3683                                  / PLT_ENTRY_SIZE)));
3684
3685           /* If this symbol is not defined in a regular file, and we
3686              are not generating a shared library, then set the symbol
3687              to this location in the .plt.  This is required to make
3688              function pointers compare as equal between the normal
3689              executable and the shared library.  */
3690           if (! info->shared
3691               && !h->def_regular)
3692             {
3693               h->root.u.def.section = s;
3694               h->root.u.def.value = h->plt.offset;
3695             }
3696
3697           /* Make room for this entry.  After the 8192nd entry, room
3698              for two entries is allocated.  */
3699           s->size += PLT_ENTRY_SIZE;
3700           if ((s->size - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE
3701               > PLT_NUM_SINGLE_ENTRIES)
3702             s->size += PLT_ENTRY_SIZE;
3703
3704           /* We also need to make an entry in the .rela.plt section.  */
3705           htab->relplt->size += sizeof (Elf32_External_Rela);
3706         }
3707       else
3708         {
3709           h->plt.offset = (bfd_vma) -1;
3710           h->needs_plt = 0;
3711         }
3712     }
3713   else
3714     {
3715       h->plt.offset = (bfd_vma) -1;
3716       h->needs_plt = 0;
3717     }
3718
3719   eh = (struct ppc_elf_link_hash_entry *) h;
3720   if (eh->elf.got.refcount > 0)
3721     {
3722       /* Make sure this symbol is output as a dynamic symbol.  */
3723       if (eh->elf.dynindx == -1
3724           && !eh->elf.forced_local)
3725         {
3726           if (!bfd_elf_link_record_dynamic_symbol (info, &eh->elf))
3727             return FALSE;
3728         }
3729
3730       if (eh->tls_mask == (TLS_TLS | TLS_LD)
3731           && !eh->elf.def_dynamic)
3732         /* If just an LD reloc, we'll just use htab->tlsld_got.offset.  */
3733         eh->elf.got.offset = (bfd_vma) -1;
3734       else
3735         {
3736           bfd_boolean dyn;
3737           eh->elf.got.offset = htab->got->size;
3738           if ((eh->tls_mask & TLS_TLS) != 0)
3739             {
3740               if ((eh->tls_mask & TLS_LD) != 0)
3741                 htab->got->size += 8;
3742               if ((eh->tls_mask & TLS_GD) != 0)
3743                 htab->got->size += 8;
3744               if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
3745                 htab->got->size += 4;
3746               if ((eh->tls_mask & TLS_DTPREL) != 0)
3747                 htab->got->size += 4;
3748             }
3749           else
3750             htab->got->size += 4;
3751           dyn = htab->elf.dynamic_sections_created;
3752           if ((info->shared
3753                || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, &eh->elf))
3754               && (ELF_ST_VISIBILITY (eh->elf.other) == STV_DEFAULT
3755                   || eh->elf.root.type != bfd_link_hash_undefweak))
3756             {
3757               /* All the entries we allocated need relocs.  */
3758               htab->relgot->size
3759                 += ((htab->got->size - eh->elf.got.offset) / 4
3760                     * sizeof (Elf32_External_Rela));
3761               /* Except LD only needs one.  */
3762               if ((eh->tls_mask & TLS_LD) != 0)
3763                 htab->relgot->size -= sizeof (Elf32_External_Rela);
3764             }
3765         }
3766     }
3767   else
3768     eh->elf.got.offset = (bfd_vma) -1;
3769
3770   if (eh->dyn_relocs == NULL)
3771     return TRUE;
3772
3773   /* In the shared -Bsymbolic case, discard space allocated for
3774      dynamic pc-relative relocs against symbols which turn out to be
3775      defined in regular objects.  For the normal shared case, discard
3776      space for relocs that have become local due to symbol visibility
3777      changes.  */
3778
3779   if (info->shared)
3780     {
3781       /* Relocs that use pc_count are those that appear on a call insn,
3782          or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
3783          generated via assembly.  We want calls to protected symbols to
3784          resolve directly to the function rather than going via the plt.
3785          If people want function pointer comparisons to work as expected
3786          then they should avoid writing weird assembly.  */
3787       if (SYMBOL_CALLS_LOCAL (info, h))
3788         {
3789           struct ppc_elf_dyn_relocs **pp;
3790
3791           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
3792             {
3793               p->count -= p->pc_count;
3794               p->pc_count = 0;
3795               if (p->count == 0)
3796                 *pp = p->next;
3797               else
3798                 pp = &p->next;
3799             }
3800         }
3801
3802       /* Also discard relocs on undefined weak syms with non-default
3803          visibility.  */
3804       if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3805           && h->root.type == bfd_link_hash_undefweak)
3806         eh->dyn_relocs = NULL;
3807
3808       /* Make sure undefined weak symbols are output as a dynamic symbol
3809          in PIEs.  */
3810       if (info->pie
3811           && eh->dyn_relocs != NULL
3812           && h->dynindx == -1
3813           && h->root.type == bfd_link_hash_undefweak
3814           && !h->forced_local)
3815         {
3816           if (! bfd_elf_link_record_dynamic_symbol (info, h))
3817             return FALSE;
3818         }
3819     }
3820   else if (ELIMINATE_COPY_RELOCS)
3821     {
3822       /* For the non-shared case, discard space for relocs against
3823          symbols which turn out to need copy relocs or are not
3824          dynamic.  */
3825
3826       if (!h->non_got_ref
3827           && h->def_dynamic
3828           && !h->def_regular)
3829         {
3830           /* Make sure this symbol is output as a dynamic symbol.
3831              Undefined weak syms won't yet be marked as dynamic.  */
3832           if (h->dynindx == -1
3833               && !h->forced_local)
3834             {
3835               if (! bfd_elf_link_record_dynamic_symbol (info, h))
3836                 return FALSE;
3837             }
3838
3839           /* If that succeeded, we know we'll be keeping all the
3840              relocs.  */
3841           if (h->dynindx != -1)
3842             goto keep;
3843         }
3844
3845       eh->dyn_relocs = NULL;
3846
3847     keep: ;
3848     }
3849
3850   /* Finally, allocate space.  */
3851   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3852     {
3853       asection *sreloc = elf_section_data (p->sec)->sreloc;
3854       sreloc->size += p->count * sizeof (Elf32_External_Rela);
3855     }
3856
3857   return TRUE;
3858 }
3859
3860 /* Find any dynamic relocs that apply to read-only sections.  */
3861
3862 static bfd_boolean
3863 readonly_dynrelocs (struct elf_link_hash_entry *h, void *info)
3864 {
3865   struct ppc_elf_dyn_relocs *p;
3866
3867   if (h->root.type == bfd_link_hash_indirect)
3868     return TRUE;
3869
3870   if (h->root.type == bfd_link_hash_warning)
3871     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3872
3873   for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
3874     {
3875       asection *s = p->sec->output_section;
3876
3877       if (s != NULL
3878           && ((s->flags & (SEC_READONLY | SEC_ALLOC))
3879               == (SEC_READONLY | SEC_ALLOC)))
3880         {
3881           ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
3882
3883           /* Not an error, just cut short the traversal.  */
3884           return FALSE;
3885         }
3886     }
3887   return TRUE;
3888 }
3889
3890 /* Set the sizes of the dynamic sections.  */
3891
3892 static bfd_boolean
3893 ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3894                                struct bfd_link_info *info)
3895 {
3896   struct ppc_elf_link_hash_table *htab;
3897   asection *s;
3898   bfd_boolean relocs;
3899   bfd *ibfd;
3900
3901 #ifdef DEBUG
3902   fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
3903 #endif
3904
3905   htab = ppc_elf_hash_table (info);
3906   BFD_ASSERT (htab->elf.dynobj != NULL);
3907
3908   if (elf_hash_table (info)->dynamic_sections_created)
3909     {
3910       /* Set the contents of the .interp section to the interpreter.  */
3911       if (info->executable)
3912         {
3913           s = bfd_get_section_by_name (htab->elf.dynobj, ".interp");
3914           BFD_ASSERT (s != NULL);
3915           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3916           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3917         }
3918     }
3919
3920   if (htab->tlsld_got.refcount > 0)
3921     {
3922       htab->tlsld_got.offset = htab->got->size;
3923       htab->got->size += 8;
3924       if (info->shared)
3925         htab->relgot->size += sizeof (Elf32_External_Rela);
3926     }
3927   else
3928     htab->tlsld_got.offset = (bfd_vma) -1;
3929
3930   /* Set up .got offsets for local syms, and space for local dynamic
3931      relocs.  */
3932   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3933     {
3934       bfd_signed_vma *local_got;
3935       bfd_signed_vma *end_local_got;
3936       char *lgot_masks;
3937       bfd_size_type locsymcount;
3938       Elf_Internal_Shdr *symtab_hdr;
3939       asection *srel;
3940
3941       if (!is_ppc_elf_target (ibfd->xvec))
3942         continue;
3943
3944       for (s = ibfd->sections; s != NULL; s = s->next)
3945         {
3946           struct ppc_elf_dyn_relocs *p;
3947
3948           for (p = ((struct ppc_elf_dyn_relocs *)
3949                     elf_section_data (s)->local_dynrel);
3950                p != NULL;
3951                p = p->next)
3952             {
3953               if (!bfd_is_abs_section (p->sec)
3954                   && bfd_is_abs_section (p->sec->output_section))
3955                 {
3956                   /* Input section has been discarded, either because
3957                      it is a copy of a linkonce section or due to
3958                      linker script /DISCARD/, so we'll be discarding
3959                      the relocs too.  */
3960                 }
3961               else if (p->count != 0)
3962                 {
3963                   elf_section_data (p->sec)->sreloc->size
3964                     += p->count * sizeof (Elf32_External_Rela);
3965                   if ((p->sec->output_section->flags
3966                        & (SEC_READONLY | SEC_ALLOC))
3967                       == (SEC_READONLY | SEC_ALLOC))
3968                     info->flags |= DF_TEXTREL;
3969                 }
3970             }
3971         }
3972
3973       local_got = elf_local_got_refcounts (ibfd);
3974       if (!local_got)
3975         continue;
3976
3977       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3978       locsymcount = symtab_hdr->sh_info;
3979       end_local_got = local_got + locsymcount;
3980       lgot_masks = (char *) end_local_got;
3981       s = htab->got;
3982       srel = htab->relgot;
3983       for (; local_got < end_local_got; ++local_got, ++lgot_masks)
3984         if (*local_got > 0)
3985           {
3986             if (*lgot_masks == (TLS_TLS | TLS_LD))
3987               {
3988                 /* If just an LD reloc, we'll just use
3989                    htab->tlsld_got.offset.  */
3990                 if (htab->tlsld_got.offset == (bfd_vma) -1)
3991                   {
3992                     htab->tlsld_got.offset = s->size;
3993                     s->size += 8;
3994                     if (info->shared)
3995                       srel->size += sizeof (Elf32_External_Rela);
3996                   }
3997                 *local_got = (bfd_vma) -1;
3998               }
3999             else
4000               {
4001                 *local_got = s->size;
4002                 if ((*lgot_masks & TLS_TLS) != 0)
4003                   {
4004                     if ((*lgot_masks & TLS_GD) != 0)
4005                       s->size += 8;
4006                     if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
4007                       s->size += 4;
4008                     if ((*lgot_masks & TLS_DTPREL) != 0)
4009                       s->size += 4;
4010                   }
4011                 else
4012                   s->size += 4;
4013                 if (info->shared)
4014                   srel->size += ((s->size - *local_got) / 4
4015                                  * sizeof (Elf32_External_Rela));
4016               }
4017           }
4018         else
4019           *local_got = (bfd_vma) -1;
4020     }
4021
4022   /* Allocate space for global sym dynamic relocs.  */
4023   elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
4024
4025   /* We've now determined the sizes of the various dynamic sections.
4026      Allocate memory for them.  */
4027   relocs = FALSE;
4028   for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
4029     {
4030       if ((s->flags & SEC_LINKER_CREATED) == 0)
4031         continue;
4032
4033       if (s == htab->plt
4034           || s == htab->got
4035           || s == htab->sbss)
4036         {
4037           /* Strip this section if we don't need it; see the
4038              comment below.  */
4039         }
4040       else if (s == htab->sdata[0].section
4041                || s == htab->sdata[1].section)
4042         {
4043           /* Strip these too.  */
4044         }
4045       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
4046         {
4047           if (s->size == 0)
4048             {
4049               /* If we don't need this section, strip it from the
4050                  output file.  This is mostly to handle .rela.bss and
4051                  .rela.plt.  We must create both sections in
4052                  create_dynamic_sections, because they must be created
4053                  before the linker maps input sections to output
4054                  sections.  The linker does that before
4055                  adjust_dynamic_symbol is called, and it is that
4056                  function which decides whether anything needs to go
4057                  into these sections.  */
4058             }
4059           else
4060             {
4061               /* Remember whether there are any relocation sections.  */
4062               relocs = TRUE;
4063
4064               /* We use the reloc_count field as a counter if we need
4065                  to copy relocs into the output file.  */
4066               s->reloc_count = 0;
4067             }
4068         }
4069       else
4070         {
4071           /* It's not one of our sections, so don't allocate space.  */
4072           continue;
4073         }
4074
4075       if (s->size == 0)
4076         {
4077           _bfd_strip_section_from_output (info, s);
4078           continue;
4079         }
4080
4081       if (s == htab->sbss)
4082         continue;
4083
4084       /* Allocate memory for the section contents.  */
4085       s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
4086       if (s->contents == NULL)
4087         return FALSE;
4088     }
4089
4090   if (htab->elf.dynamic_sections_created)
4091     {
4092       /* Add some entries to the .dynamic section.  We fill in the
4093          values later, in ppc_elf_finish_dynamic_sections, but we
4094          must add the entries now so that we get the correct size for
4095          the .dynamic section.  The DT_DEBUG entry is filled in by the
4096          dynamic linker and used by the debugger.  */
4097 #define add_dynamic_entry(TAG, VAL) \
4098   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
4099
4100       if (info->executable)
4101         {
4102           if (!add_dynamic_entry (DT_DEBUG, 0))
4103             return FALSE;
4104         }
4105
4106       if (htab->plt != NULL && htab->plt->size != 0)
4107         {
4108           if (!add_dynamic_entry (DT_PLTGOT, 0)
4109               || !add_dynamic_entry (DT_PLTRELSZ, 0)
4110               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
4111               || !add_dynamic_entry (DT_JMPREL, 0))
4112             return FALSE;
4113         }
4114
4115       if (relocs)
4116         {
4117           if (!add_dynamic_entry (DT_RELA, 0)
4118               || !add_dynamic_entry (DT_RELASZ, 0)
4119               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
4120             return FALSE;
4121         }
4122
4123       /* If any dynamic relocs apply to a read-only section, then we
4124          need a DT_TEXTREL entry.  */
4125       if ((info->flags & DF_TEXTREL) == 0)
4126         elf_link_hash_traverse (elf_hash_table (info), readonly_dynrelocs,
4127                                 info);
4128
4129       if ((info->flags & DF_TEXTREL) != 0)
4130         {
4131           if (!add_dynamic_entry (DT_TEXTREL, 0))
4132             return FALSE;
4133         }
4134     }
4135 #undef add_dynamic_entry
4136
4137   return TRUE;
4138 }
4139 \f
4140 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
4141
4142 static const int shared_stub_entry[] =
4143   {
4144     0x7c0802a6, /* mflr 0 */
4145     0x429f0005, /* bcl 20, 31, .Lxxx */
4146     0x7d6802a6, /* mflr 11 */
4147     0x3d6b0000, /* addis 11, 11, (xxx-.Lxxx)@ha */
4148     0x396b0018, /* addi 11, 11, (xxx-.Lxxx)@l */
4149     0x7c0803a6, /* mtlr 0 */
4150     0x7d6903a6, /* mtctr 11 */
4151     0x4e800420, /* bctr */
4152   };
4153
4154 static const int stub_entry[] =
4155   {
4156     0x3d600000, /* lis 11,xxx@ha */
4157     0x396b0000, /* addi 11,11,xxx@l */
4158     0x7d6903a6, /* mtctr 11 */
4159     0x4e800420, /* bctr */
4160   };
4161
4162 static bfd_boolean
4163 ppc_elf_relax_section (bfd *abfd,
4164                        asection *isec,
4165                        struct bfd_link_info *link_info,
4166                        bfd_boolean *again)
4167 {
4168   struct one_fixup
4169   {
4170     struct one_fixup *next;
4171     asection *tsec;
4172     bfd_vma toff;
4173     bfd_vma trampoff;
4174   };
4175
4176   Elf_Internal_Shdr *symtab_hdr;
4177   bfd_byte *contents = NULL;
4178   Elf_Internal_Sym *isymbuf = NULL;
4179   Elf_Internal_Rela *internal_relocs = NULL;
4180   Elf_Internal_Rela *irel, *irelend;
4181   struct one_fixup *fixups = NULL;
4182   bfd_boolean changed;
4183   struct ppc_elf_link_hash_table *ppc_info;
4184   bfd_size_type trampoff;
4185
4186   *again = FALSE;
4187
4188   /* Nothing to do if there are no relocations.  */
4189   if ((isec->flags & SEC_RELOC) == 0 || isec->reloc_count == 0)
4190     return TRUE;
4191
4192   trampoff = (isec->size + 3) & (bfd_vma) -4;
4193   /* Space for a branch around any trampolines.  */
4194   trampoff += 4;
4195
4196   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4197
4198   /* Get a copy of the native relocations.  */
4199   internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
4200                                                link_info->keep_memory);
4201   if (internal_relocs == NULL)
4202     goto error_return;
4203
4204   ppc_info = ppc_elf_hash_table (link_info);
4205   irelend = internal_relocs + isec->reloc_count;
4206
4207   for (irel = internal_relocs; irel < irelend; irel++)
4208     {
4209       unsigned long r_type = ELF32_R_TYPE (irel->r_info);
4210       bfd_vma symaddr, reladdr, toff, roff;
4211       asection *tsec;
4212       struct one_fixup *f;
4213       size_t insn_offset = 0;
4214       bfd_vma max_branch_offset, val;
4215       bfd_byte *hit_addr;
4216       unsigned long t0;
4217       unsigned char sym_type;
4218
4219       switch (r_type)
4220         {
4221         case R_PPC_REL24:
4222         case R_PPC_LOCAL24PC:
4223         case R_PPC_PLTREL24:
4224           max_branch_offset = 1 << 25;
4225           break;
4226
4227         case R_PPC_REL14:
4228         case R_PPC_REL14_BRTAKEN:
4229         case R_PPC_REL14_BRNTAKEN:
4230           max_branch_offset = 1 << 15;
4231           break;
4232
4233         default:
4234           continue;
4235         }
4236
4237       /* Get the value of the symbol referred to by the reloc.  */
4238       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
4239         {
4240           /* A local symbol.  */
4241           Elf_Internal_Sym *isym;
4242
4243           /* Read this BFD's local symbols.  */
4244           if (isymbuf == NULL)
4245             {
4246               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
4247               if (isymbuf == NULL)
4248                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
4249                                                 symtab_hdr->sh_info, 0,
4250                                                 NULL, NULL, NULL);
4251               if (isymbuf == 0)
4252                 goto error_return;
4253             }
4254           isym = isymbuf + ELF32_R_SYM (irel->r_info);
4255           if (isym->st_shndx == SHN_UNDEF)
4256             continue;   /* We can't do anything with undefined symbols.  */
4257           else if (isym->st_shndx == SHN_ABS)
4258             tsec = bfd_abs_section_ptr;
4259           else if (isym->st_shndx == SHN_COMMON)
4260             tsec = bfd_com_section_ptr;
4261           else
4262             tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
4263
4264           toff = isym->st_value;
4265           sym_type = ELF_ST_TYPE (isym->st_info);
4266         }
4267       else
4268         {
4269           /* Global symbol handling.  */
4270           unsigned long indx;
4271           struct elf_link_hash_entry *h;
4272
4273           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
4274           h = elf_sym_hashes (abfd)[indx];
4275
4276           while (h->root.type == bfd_link_hash_indirect
4277                  || h->root.type == bfd_link_hash_warning)
4278             h = (struct elf_link_hash_entry *) h->root.u.i.link;
4279
4280           if (r_type == R_PPC_PLTREL24
4281               && ppc_info->plt != NULL
4282               && h->plt.offset != (bfd_vma) -1)
4283             {
4284               tsec = ppc_info->plt;
4285               toff = h->plt.offset;
4286             }
4287           else if (h->root.type == bfd_link_hash_defined
4288                    || h->root.type == bfd_link_hash_defweak)
4289             {
4290               tsec = h->root.u.def.section;
4291               toff = h->root.u.def.value;
4292             }
4293           else
4294             continue;
4295
4296           sym_type = h->type;
4297         }
4298
4299       /* If the branch and target are in the same section, you have
4300          no hope of adding stubs.  We'll error out later should the
4301          branch overflow.  */
4302       if (tsec == isec)
4303         continue;
4304
4305       /* There probably isn't any reason to handle symbols in
4306          SEC_MERGE sections;  SEC_MERGE doesn't seem a likely
4307          attribute for a code section, and we are only looking at
4308          branches.  However, implement it correctly here as a
4309          reference for other target relax_section functions.  */
4310       if (0 && tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
4311         {
4312           /* At this stage in linking, no SEC_MERGE symbol has been
4313              adjusted, so all references to such symbols need to be
4314              passed through _bfd_merged_section_offset.  (Later, in
4315              relocate_section, all SEC_MERGE symbols *except* for
4316              section symbols have been adjusted.)
4317
4318              gas may reduce relocations against symbols in SEC_MERGE
4319              sections to a relocation against the section symbol when
4320              the original addend was zero.  When the reloc is against
4321              a section symbol we should include the addend in the
4322              offset passed to _bfd_merged_section_offset, since the
4323              location of interest is the original symbol.  On the
4324              other hand, an access to "sym+addend" where "sym" is not
4325              a section symbol should not include the addend;  Such an
4326              access is presumed to be an offset from "sym";  The
4327              location of interest is just "sym".  */
4328           if (sym_type == STT_SECTION)
4329             toff += irel->r_addend;
4330
4331           toff = _bfd_merged_section_offset (abfd, &tsec,
4332                                              elf_section_data (tsec)->sec_info,
4333                                              toff);
4334
4335           if (sym_type != STT_SECTION)
4336             toff += irel->r_addend;
4337         }
4338       else
4339         toff += irel->r_addend;
4340
4341       symaddr = tsec->output_section->vma + tsec->output_offset + toff;
4342
4343       roff = irel->r_offset;
4344       reladdr = isec->output_section->vma + isec->output_offset + roff;
4345
4346       /* If the branch is in range, no need to do anything.  */
4347       if (symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
4348         continue;
4349
4350       /* Look for an existing fixup to this address.  */
4351       for (f = fixups; f ; f = f->next)
4352         if (f->tsec == tsec && f->toff == toff)
4353           break;
4354
4355       if (f == NULL)
4356         {
4357           size_t size;
4358           unsigned long stub_rtype;
4359
4360           val = trampoff - roff;
4361           if (val >= max_branch_offset)
4362             /* Oh dear, we can't reach a trampoline.  Don't try to add
4363                one.  We'll report an error later.  */
4364             continue;
4365
4366           if (link_info->shared)
4367             {
4368               size = 4 * ARRAY_SIZE (shared_stub_entry);
4369               insn_offset = 12;
4370               stub_rtype = R_PPC_RELAX32PC;
4371             }
4372           else
4373             {
4374               size = 4 * ARRAY_SIZE (stub_entry);
4375               insn_offset = 0;
4376               stub_rtype = R_PPC_RELAX32;
4377             }
4378
4379           if (R_PPC_RELAX32_PLT - R_PPC_RELAX32
4380               != R_PPC_RELAX32PC_PLT - R_PPC_RELAX32PC)
4381             abort ();
4382           if (tsec == ppc_info->plt)
4383             stub_rtype += R_PPC_RELAX32_PLT - R_PPC_RELAX32;
4384
4385           /* Hijack the old relocation.  Since we need two
4386              relocations for this use a "composite" reloc.  */
4387           irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
4388                                        stub_rtype);
4389           irel->r_offset = trampoff + insn_offset;
4390
4391           /* Record the fixup so we don't do it again this section.  */
4392           f = bfd_malloc (sizeof (*f));
4393           f->next = fixups;
4394           f->tsec = tsec;
4395           f->toff = toff;
4396           f->trampoff = trampoff;
4397           fixups = f;
4398
4399           trampoff += size;
4400         }
4401       else
4402         {
4403           val = f->trampoff - roff;
4404           if (val >= max_branch_offset)
4405             continue;
4406
4407           /* Nop out the reloc, since we're finalizing things here.  */
4408           irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
4409         }
4410
4411       /* Get the section contents.  */
4412       if (contents == NULL)
4413         {
4414           /* Get cached copy if it exists.  */
4415           if (elf_section_data (isec)->this_hdr.contents != NULL)
4416             contents = elf_section_data (isec)->this_hdr.contents;
4417           else
4418             {
4419               /* Go get them off disk.  */
4420               if (!bfd_malloc_and_get_section (abfd, isec, &contents))
4421                 goto error_return;
4422             }
4423         }
4424
4425       /* Fix up the existing branch to hit the trampoline.  */
4426       hit_addr = contents + roff;
4427       switch (r_type)
4428         {
4429         case R_PPC_REL24:
4430         case R_PPC_LOCAL24PC:
4431         case R_PPC_PLTREL24:
4432           t0 = bfd_get_32 (abfd, hit_addr);
4433           t0 &= ~0x3fffffc;
4434           t0 |= val & 0x3fffffc;
4435           bfd_put_32 (abfd, t0, hit_addr);
4436           break;
4437
4438         case R_PPC_REL14:
4439         case R_PPC_REL14_BRTAKEN:
4440         case R_PPC_REL14_BRNTAKEN:
4441           t0 = bfd_get_32 (abfd, hit_addr);
4442           t0 &= ~0xfffc;
4443           t0 |= val & 0xfffc;
4444           bfd_put_32 (abfd, t0, hit_addr);
4445           break;
4446         }
4447     }
4448
4449   /* Write out the trampolines.  */
4450   changed = fixups != NULL;
4451   if (fixups != NULL)
4452     {
4453       const int *stub;
4454       bfd_byte *dest;
4455       bfd_vma val;
4456       int i, size;
4457
4458       do
4459         {
4460           struct one_fixup *f = fixups;
4461           fixups = fixups->next;
4462           free (f);
4463         }
4464       while (fixups);
4465
4466       contents = bfd_realloc (contents, trampoff);
4467       if (contents == NULL)
4468         goto error_return;
4469
4470       isec->size = (isec->size + 3) & (bfd_vma) -4;
4471       /* Branch around the trampolines.  */
4472       val = trampoff - isec->size + 0x48000000;
4473       dest = contents + isec->size;
4474       isec->size = trampoff;
4475       bfd_put_32 (abfd, val, dest);
4476       dest += 4;
4477
4478       if (link_info->shared)
4479         {
4480           stub = shared_stub_entry;
4481           size = ARRAY_SIZE (shared_stub_entry);
4482         }
4483       else
4484         {
4485           stub = stub_entry;
4486           size = ARRAY_SIZE (stub_entry);
4487         }
4488
4489       i = 0;
4490       while (dest < contents + trampoff)
4491         {
4492           bfd_put_32 (abfd, stub[i], dest);
4493           i++;
4494           if (i == size)
4495             i = 0;
4496           dest += 4;
4497         }
4498       BFD_ASSERT (i == 0);
4499     }
4500
4501   if (isymbuf != NULL
4502       && symtab_hdr->contents != (unsigned char *) isymbuf)
4503     {
4504       if (! link_info->keep_memory)
4505         free (isymbuf);
4506       else
4507         {
4508           /* Cache the symbols for elf_link_input_bfd.  */
4509           symtab_hdr->contents = (unsigned char *) isymbuf;
4510         }
4511     }
4512
4513   if (contents != NULL
4514       && elf_section_data (isec)->this_hdr.contents != contents)
4515     {
4516       if (!changed && !link_info->keep_memory)
4517         free (contents);
4518       else
4519         {
4520           /* Cache the section contents for elf_link_input_bfd.  */
4521           elf_section_data (isec)->this_hdr.contents = contents;
4522         }
4523     }
4524
4525   if (elf_section_data (isec)->relocs != internal_relocs)
4526     {
4527       if (!changed)
4528         free (internal_relocs);
4529       else
4530         elf_section_data (isec)->relocs = internal_relocs;
4531     }
4532
4533   *again = changed;
4534   return TRUE;
4535
4536  error_return:
4537   if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
4538     free (isymbuf);
4539   if (contents != NULL
4540       && elf_section_data (isec)->this_hdr.contents != contents)
4541     free (contents);
4542   if (internal_relocs != NULL
4543       && elf_section_data (isec)->relocs != internal_relocs)
4544     free (internal_relocs);
4545   return FALSE;
4546 }
4547 \f
4548 /* Set _SDA_BASE_, _SDA2_BASE, and sbss start and end syms.  They are
4549    set here rather than via PROVIDE in the default linker script,
4550    because using PROVIDE inside an output section statement results in
4551    unnecessary output sections.  Using PROVIDE outside an output section
4552    statement runs the risk of section alignment affecting where the
4553    section starts.  */
4554
4555 bfd_boolean
4556 ppc_elf_set_sdata_syms (bfd *obfd, struct bfd_link_info *info)
4557 {
4558   struct ppc_elf_link_hash_table *htab;
4559   unsigned i;
4560   asection *s;
4561   bfd_vma val;
4562
4563   htab = ppc_elf_hash_table (info);
4564
4565   for (i = 0; i < 2; i++)
4566     {
4567       elf_linker_section_t *lsect = &htab->sdata[i];
4568
4569       s = lsect->section;
4570       if (s != NULL)
4571         s = s->output_section;
4572       if (s == NULL)
4573         s = bfd_get_section_by_name (obfd, lsect->name);
4574       if (s == NULL)
4575         s = bfd_get_section_by_name (obfd, lsect->bss_name);
4576
4577       val = 0;
4578       if (s != NULL)
4579         val = s->vma + 32768;
4580       lsect->sym_val = val;
4581
4582       _bfd_elf_provide_symbol (info, lsect->sym_name, val);
4583     }
4584
4585   s = bfd_get_section_by_name (obfd, ".sbss");
4586   val = 0;
4587   if (s != NULL)
4588     val = s->vma;
4589   _bfd_elf_provide_symbol (info, "__sbss_start", val);
4590   _bfd_elf_provide_symbol (info, "___sbss_start", val);
4591   if (s != NULL)
4592     val += s->size;
4593   _bfd_elf_provide_symbol (info, "__sbss_end", val);
4594   _bfd_elf_provide_symbol (info, "___sbss_end", val);
4595   return TRUE;
4596 }
4597 \f
4598 /* Fill in the address for a pointer generated in a linker section.  */
4599
4600 static bfd_vma
4601 elf_finish_pointer_linker_section (bfd *input_bfd,
4602                                    elf_linker_section_t *lsect,
4603                                    struct elf_link_hash_entry *h,
4604                                    bfd_vma relocation,
4605                                    const Elf_Internal_Rela *rel)
4606 {
4607   elf_linker_section_pointers_t *linker_section_ptr;
4608
4609   BFD_ASSERT (lsect != NULL);
4610
4611   if (h != NULL)
4612     {
4613       /* Handle global symbol.  */
4614       struct ppc_elf_link_hash_entry *eh;
4615
4616       eh = (struct ppc_elf_link_hash_entry *) h;
4617       BFD_ASSERT (eh->elf.def_regular);
4618       linker_section_ptr = eh->linker_section_pointer;
4619     }
4620   else
4621     {
4622       /* Handle local symbol.  */
4623       unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
4624
4625       BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
4626       linker_section_ptr = elf_local_ptr_offsets (input_bfd)[r_symndx];
4627     }
4628
4629   linker_section_ptr = elf_find_pointer_linker_section (linker_section_ptr,
4630                                                         rel->r_addend,
4631                                                         lsect);
4632   BFD_ASSERT (linker_section_ptr != NULL);
4633
4634   /* Offset will always be a multiple of four, so use the bottom bit
4635      as a "written" flag.  */
4636   if ((linker_section_ptr->offset & 1) == 0)
4637     {
4638       bfd_put_32 (lsect->section->owner,
4639                   relocation + linker_section_ptr->addend,
4640                   lsect->section->contents + linker_section_ptr->offset);
4641       linker_section_ptr->offset += 1;
4642     }
4643
4644   relocation = (lsect->section->output_offset
4645                 + linker_section_ptr->offset - 1
4646                 - 0x8000);
4647
4648 #ifdef DEBUG
4649   fprintf (stderr,
4650            "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
4651            lsect->name, (long) relocation, (long) relocation);
4652 #endif
4653
4654   /* Subtract out the addend, because it will get added back in by the normal
4655      processing.  */
4656   return relocation - linker_section_ptr->addend;
4657 }
4658
4659 /* The RELOCATE_SECTION function is called by the ELF backend linker
4660    to handle the relocations for a section.
4661
4662    The relocs are always passed as Rela structures; if the section
4663    actually uses Rel structures, the r_addend field will always be
4664    zero.
4665
4666    This function is responsible for adjust the section contents as
4667    necessary, and (if using Rela relocs and generating a
4668    relocatable output file) adjusting the reloc addend as
4669    necessary.
4670
4671    This function does not have to worry about setting the reloc
4672    address or the reloc symbol index.
4673
4674    LOCAL_SYMS is a pointer to the swapped in local symbols.
4675
4676    LOCAL_SECTIONS is an array giving the section in the input file
4677    corresponding to the st_shndx field of each local symbol.
4678
4679    The global hash table entry for the global symbols can be found
4680    via elf_sym_hashes (input_bfd).
4681
4682    When generating relocatable output, this function must handle
4683    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
4684    going to be the section symbol corresponding to the output
4685    section, which means that the addend must be adjusted
4686    accordingly.  */
4687
4688 static bfd_boolean
4689 ppc_elf_relocate_section (bfd *output_bfd,
4690                           struct bfd_link_info *info,
4691                           bfd *input_bfd,
4692                           asection *input_section,
4693                           bfd_byte *contents,
4694                           Elf_Internal_Rela *relocs,
4695                           Elf_Internal_Sym *local_syms,
4696                           asection **local_sections)
4697 {
4698   Elf_Internal_Shdr *symtab_hdr;
4699   struct elf_link_hash_entry **sym_hashes;
4700   struct ppc_elf_link_hash_table *htab;
4701   Elf_Internal_Rela *rel;
4702   Elf_Internal_Rela *relend;
4703   Elf_Internal_Rela outrel;
4704   bfd_byte *loc;
4705   asection *sreloc = NULL;
4706   bfd_vma *local_got_offsets;
4707   bfd_boolean ret = TRUE;
4708
4709 #ifdef DEBUG
4710   _bfd_error_handler ("ppc_elf_relocate_section called for %B section %A, "
4711                       "%ld relocations%s",
4712                       input_bfd, input_section,
4713                       (long) input_section->reloc_count,
4714                       (info->relocatable) ? " (relocatable)" : "");
4715 #endif
4716
4717   if (info->relocatable)
4718     return TRUE;
4719
4720   /* Initialize howto table if not already done.  */
4721   if (!ppc_elf_howto_table[R_PPC_ADDR32])
4722     ppc_elf_howto_init ();
4723
4724   htab = ppc_elf_hash_table (info);
4725   local_got_offsets = elf_local_got_offsets (input_bfd);
4726   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4727   sym_hashes = elf_sym_hashes (input_bfd);
4728   rel = relocs;
4729   relend = relocs + input_section->reloc_count;
4730   for (; rel < relend; rel++)
4731     {
4732       enum elf_ppc_reloc_type r_type;
4733       bfd_vma addend;
4734       bfd_reloc_status_type r;
4735       Elf_Internal_Sym *sym;
4736       asection *sec;
4737       struct elf_link_hash_entry *h;
4738       const char *sym_name;
4739       reloc_howto_type *howto;
4740       unsigned long r_symndx;
4741       bfd_vma relocation;
4742       bfd_vma branch_bit, insn, from;
4743       bfd_boolean unresolved_reloc;
4744       bfd_boolean warned;
4745       unsigned int tls_type, tls_mask, tls_gd;
4746
4747       r_type = ELF32_R_TYPE (rel->r_info);
4748       sym = NULL;
4749       sec = NULL;
4750       h = NULL;
4751       unresolved_reloc = FALSE;
4752       warned = FALSE;
4753       r_symndx = ELF32_R_SYM (rel->r_info);
4754
4755       if (r_symndx < symtab_hdr->sh_info)
4756         {
4757           sym = local_syms + r_symndx;
4758           sec = local_sections[r_symndx];
4759           sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym);
4760
4761           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4762         }
4763       else
4764         {
4765           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4766                                    r_symndx, symtab_hdr, sym_hashes,
4767                                    h, sec, relocation,
4768                                    unresolved_reloc, warned);
4769
4770           sym_name = h->root.root.string;
4771         }
4772
4773       /* TLS optimizations.  Replace instruction sequences and relocs
4774          based on information we collected in tls_optimize.  We edit
4775          RELOCS so that --emit-relocs will output something sensible
4776          for the final instruction stream.  */
4777       tls_mask = 0;
4778       tls_gd = 0;
4779       if (IS_PPC_TLS_RELOC (r_type))
4780         {
4781           if (h != NULL)
4782             tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
4783           else if (local_got_offsets != NULL)
4784             {
4785               char *lgot_masks;
4786               lgot_masks = (char *) (local_got_offsets + symtab_hdr->sh_info);
4787               tls_mask = lgot_masks[r_symndx];
4788             }
4789         }
4790
4791       /* Ensure reloc mapping code below stays sane.  */
4792       if ((R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TLSGD16 & 3)
4793           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
4794           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
4795           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
4796           || (R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TPREL16 & 3)
4797           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
4798           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
4799           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
4800         abort ();
4801       switch (r_type)
4802         {
4803         default:
4804           break;
4805
4806         case R_PPC_GOT_TPREL16:
4807         case R_PPC_GOT_TPREL16_LO:
4808           if (tls_mask != 0
4809               && (tls_mask & TLS_TPREL) == 0)
4810             {
4811               bfd_vma insn;
4812               insn = bfd_get_32 (output_bfd, contents + rel->r_offset - 2);
4813               insn &= 31 << 21;
4814               insn |= 0x3c020000;       /* addis 0,2,0 */
4815               bfd_put_32 (output_bfd, insn, contents + rel->r_offset - 2);
4816               r_type = R_PPC_TPREL16_HA;
4817               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4818             }
4819           break;
4820
4821         case R_PPC_TLS:
4822           if (tls_mask != 0
4823               && (tls_mask & TLS_TPREL) == 0)
4824             {
4825               bfd_vma insn, rtra;
4826               insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
4827               if ((insn & ((31 << 26) | (31 << 11)))
4828                   == ((31 << 26) | (2 << 11)))
4829                 rtra = insn & ((1 << 26) - (1 << 16));
4830               else if ((insn & ((31 << 26) | (31 << 16)))
4831                        == ((31 << 26) | (2 << 16)))
4832                 rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
4833               else
4834                 abort ();
4835               if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
4836                 /* add -> addi.  */
4837                 insn = 14 << 26;
4838               else if ((insn & (31 << 1)) == 23 << 1
4839                        && ((insn & (31 << 6)) < 14 << 6
4840                            || ((insn & (31 << 6)) >= 16 << 6
4841                                && (insn & (31 << 6)) < 24 << 6)))
4842                 /* load and store indexed -> dform.  */
4843                 insn = (32 | ((insn >> 6) & 31)) << 26;
4844               else if ((insn & (31 << 1)) == 21 << 1
4845                        && (insn & (0x1a << 6)) == 0)
4846                 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
4847                 insn = (((58 | ((insn >> 6) & 4)) << 26)
4848                         | ((insn >> 6) & 1));
4849               else if ((insn & (31 << 1)) == 21 << 1
4850                        && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
4851                 /* lwax -> lwa.  */
4852                 insn = (58 << 26) | 2;
4853               else
4854                 abort ();
4855               insn |= rtra;
4856               bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
4857               r_type = R_PPC_TPREL16_LO;
4858               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4859               /* Was PPC_TLS which sits on insn boundary, now
4860                  PPC_TPREL16_LO which is at insn+2.  */
4861               rel->r_offset += 2;
4862             }
4863           break;
4864
4865         case R_PPC_GOT_TLSGD16_HI:
4866         case R_PPC_GOT_TLSGD16_HA:
4867           tls_gd = TLS_TPRELGD;
4868           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
4869             goto tls_gdld_hi;
4870           break;
4871
4872         case R_PPC_GOT_TLSLD16_HI:
4873         case R_PPC_GOT_TLSLD16_HA:
4874           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
4875             {
4876             tls_gdld_hi:
4877               if ((tls_mask & tls_gd) != 0)
4878                 r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
4879                           + R_PPC_GOT_TPREL16);
4880               else
4881                 {
4882                   bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
4883                   rel->r_offset -= 2;
4884                   r_type = R_PPC_NONE;
4885                 }
4886               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4887             }
4888           break;
4889
4890         case R_PPC_GOT_TLSGD16:
4891         case R_PPC_GOT_TLSGD16_LO:
4892           tls_gd = TLS_TPRELGD;
4893           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
4894             goto tls_get_addr_check;
4895           break;
4896
4897         case R_PPC_GOT_TLSLD16:
4898         case R_PPC_GOT_TLSLD16_LO:
4899           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
4900             {
4901             tls_get_addr_check:
4902               if (rel + 1 < relend)
4903                 {
4904                   enum elf_ppc_reloc_type r_type2;
4905                   unsigned long r_symndx2;
4906                   struct elf_link_hash_entry *h2;
4907                   bfd_vma insn1, insn2;
4908                   bfd_vma offset;
4909
4910                   /* The next instruction should be a call to
4911                      __tls_get_addr.  Peek at the reloc to be sure.  */
4912                   r_type2 = ELF32_R_TYPE (rel[1].r_info);
4913                   r_symndx2 = ELF32_R_SYM (rel[1].r_info);
4914                   if (r_symndx2 < symtab_hdr->sh_info
4915                       || (r_type2 != R_PPC_REL14
4916                           && r_type2 != R_PPC_REL14_BRTAKEN
4917                           && r_type2 != R_PPC_REL14_BRNTAKEN
4918                           && r_type2 != R_PPC_REL24
4919                           && r_type2 != R_PPC_PLTREL24))
4920                     break;
4921
4922                   h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
4923                   while (h2->root.type == bfd_link_hash_indirect
4924                          || h2->root.type == bfd_link_hash_warning)
4925                     h2 = (struct elf_link_hash_entry *) h2->root.u.i.link;
4926                   if (h2 == NULL || h2 != htab->tls_get_addr)
4927                     break;
4928
4929                   /* OK, it checks out.  Replace the call.  */
4930                   offset = rel[1].r_offset;
4931                   insn1 = bfd_get_32 (output_bfd,
4932                                       contents + rel->r_offset - 2);
4933                   if ((tls_mask & tls_gd) != 0)
4934                     {
4935                       /* IE */
4936                       insn1 &= (1 << 26) - 1;
4937                       insn1 |= 32 << 26;        /* lwz */
4938                       insn2 = 0x7c631214;       /* add 3,3,2 */
4939                       rel[1].r_info = ELF32_R_INFO (r_symndx2, R_PPC_NONE);
4940                       r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
4941                                 + R_PPC_GOT_TPREL16);
4942                       rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4943                     }
4944                   else
4945                     {
4946                       /* LE */
4947                       insn1 = 0x3c620000;       /* addis 3,2,0 */
4948                       insn2 = 0x38630000;       /* addi 3,3,0 */
4949                       if (tls_gd == 0)
4950                         {
4951                           /* Was an LD reloc.  */
4952                           r_symndx = 0;
4953                           rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
4954                           rel[1].r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
4955                         }
4956                       r_type = R_PPC_TPREL16_HA;
4957                       rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4958                       rel[1].r_info = ELF32_R_INFO (r_symndx,
4959                                                     R_PPC_TPREL16_LO);
4960                       rel[1].r_offset += 2;
4961                     }
4962                   bfd_put_32 (output_bfd, insn1, contents + rel->r_offset - 2);
4963                   bfd_put_32 (output_bfd, insn2, contents + offset);
4964                   if (tls_gd == 0)
4965                     {
4966                       /* We changed the symbol on an LD reloc.  Start over
4967                          in order to get h, sym, sec etc. right.  */
4968                       rel--;
4969                       continue;
4970                     }
4971                 }
4972             }
4973           break;
4974         }
4975
4976       /* Handle other relocations that tweak non-addend part of insn.  */
4977       branch_bit = 0;
4978       switch (r_type)
4979         {
4980         default:
4981           break;
4982
4983           /* Branch taken prediction relocations.  */
4984         case R_PPC_ADDR14_BRTAKEN:
4985         case R_PPC_REL14_BRTAKEN:
4986           branch_bit = BRANCH_PREDICT_BIT;
4987           /* Fall thru */
4988
4989           /* Branch not taken prediction relocations.  */
4990         case R_PPC_ADDR14_BRNTAKEN:
4991         case R_PPC_REL14_BRNTAKEN:
4992           insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
4993           insn &= ~BRANCH_PREDICT_BIT;
4994           insn |= branch_bit;
4995
4996           from = (rel->r_offset
4997                   + input_section->output_offset
4998                   + input_section->output_section->vma);
4999
5000           /* Invert 'y' bit if not the default.  */
5001           if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
5002             insn ^= BRANCH_PREDICT_BIT;
5003
5004           bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5005           break;
5006         }
5007
5008       addend = rel->r_addend;
5009       tls_type = 0;
5010       howto = NULL;
5011       if (r_type < R_PPC_max)
5012         howto = ppc_elf_howto_table[r_type];
5013       switch (r_type)
5014         {
5015         default:
5016           (*_bfd_error_handler)
5017             (_("%B: unknown relocation type %d for symbol %s"),
5018              input_bfd, (int) r_type, sym_name);
5019
5020           bfd_set_error (bfd_error_bad_value);
5021           ret = FALSE;
5022           continue;
5023
5024         case R_PPC_NONE:
5025         case R_PPC_TLS:
5026         case R_PPC_EMB_MRKREF:
5027         case R_PPC_GNU_VTINHERIT:
5028         case R_PPC_GNU_VTENTRY:
5029           continue;
5030
5031           /* GOT16 relocations.  Like an ADDR16 using the symbol's
5032              address in the GOT as relocation value instead of the
5033              symbol's value itself.  Also, create a GOT entry for the
5034              symbol and put the symbol value there.  */
5035         case R_PPC_GOT_TLSGD16:
5036         case R_PPC_GOT_TLSGD16_LO:
5037         case R_PPC_GOT_TLSGD16_HI:
5038         case R_PPC_GOT_TLSGD16_HA:
5039           tls_type = TLS_TLS | TLS_GD;
5040           goto dogot;
5041
5042         case R_PPC_GOT_TLSLD16:
5043         case R_PPC_GOT_TLSLD16_LO:
5044         case R_PPC_GOT_TLSLD16_HI:
5045         case R_PPC_GOT_TLSLD16_HA:
5046           tls_type = TLS_TLS | TLS_LD;
5047           goto dogot;
5048
5049         case R_PPC_GOT_TPREL16:
5050         case R_PPC_GOT_TPREL16_LO:
5051         case R_PPC_GOT_TPREL16_HI:
5052         case R_PPC_GOT_TPREL16_HA:
5053           tls_type = TLS_TLS | TLS_TPREL;
5054           goto dogot;
5055
5056         case R_PPC_GOT_DTPREL16:
5057         case R_PPC_GOT_DTPREL16_LO:
5058         case R_PPC_GOT_DTPREL16_HI:
5059         case R_PPC_GOT_DTPREL16_HA:
5060           tls_type = TLS_TLS | TLS_DTPREL;
5061           goto dogot;
5062
5063         case R_PPC_GOT16:
5064         case R_PPC_GOT16_LO:
5065         case R_PPC_GOT16_HI:
5066         case R_PPC_GOT16_HA:
5067         dogot:
5068           {
5069             /* Relocation is to the entry for this symbol in the global
5070                offset table.  */
5071             bfd_vma off;
5072             bfd_vma *offp;
5073             unsigned long indx;
5074
5075             if (htab->got == NULL)
5076               abort ();
5077
5078             indx = 0;
5079             if (tls_type == (TLS_TLS | TLS_LD)
5080                 && (h == NULL
5081                     || !h->def_dynamic))
5082               offp = &htab->tlsld_got.offset;
5083             else if (h != NULL)
5084               {
5085                 bfd_boolean dyn;
5086                 dyn = htab->elf.dynamic_sections_created;
5087                 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
5088                     || (info->shared
5089                         && SYMBOL_REFERENCES_LOCAL (info, h)))
5090                   /* This is actually a static link, or it is a
5091                      -Bsymbolic link and the symbol is defined
5092                      locally, or the symbol was forced to be local
5093                      because of a version file.  */
5094                   ;
5095                 else
5096                   {
5097                     indx = h->dynindx;
5098                     unresolved_reloc = FALSE;
5099                   }
5100                 offp = &h->got.offset;
5101               }
5102             else
5103               {
5104                 if (local_got_offsets == NULL)
5105                   abort ();
5106                 offp = &local_got_offsets[r_symndx];
5107               }
5108
5109             /* The offset must always be a multiple of 4.  We use the
5110                least significant bit to record whether we have already
5111                processed this entry.  */
5112             off = *offp;
5113             if ((off & 1) != 0)
5114               off &= ~1;
5115             else
5116               {
5117                 unsigned int tls_m = (tls_mask
5118                                       & (TLS_LD | TLS_GD | TLS_DTPREL
5119                                          | TLS_TPREL | TLS_TPRELGD));
5120
5121                 if (offp == &htab->tlsld_got.offset)
5122                   tls_m = TLS_LD;
5123                 else if (h == NULL
5124                          || !h->def_dynamic)
5125                   tls_m &= ~TLS_LD;
5126
5127                 /* We might have multiple got entries for this sym.
5128                    Initialize them all.  */
5129                 do
5130                   {
5131                     int tls_ty = 0;
5132
5133                     if ((tls_m & TLS_LD) != 0)
5134                       {
5135                         tls_ty = TLS_TLS | TLS_LD;
5136                         tls_m &= ~TLS_LD;
5137                       }
5138                     else if ((tls_m & TLS_GD) != 0)
5139                       {
5140                         tls_ty = TLS_TLS | TLS_GD;
5141                         tls_m &= ~TLS_GD;
5142                       }
5143                     else if ((tls_m & TLS_DTPREL) != 0)
5144                       {
5145                         tls_ty = TLS_TLS | TLS_DTPREL;
5146                         tls_m &= ~TLS_DTPREL;
5147                       }
5148                     else if ((tls_m & (TLS_TPREL | TLS_TPRELGD)) != 0)
5149                       {
5150                         tls_ty = TLS_TLS | TLS_TPREL;
5151                         tls_m = 0;
5152                       }
5153
5154                     /* Generate relocs for the dynamic linker.  */
5155                     if ((info->shared || indx != 0)
5156                         && (h == NULL
5157                             || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5158                             || h->root.type != bfd_link_hash_undefweak))
5159                       {
5160                         outrel.r_offset = (htab->got->output_section->vma
5161                                            + htab->got->output_offset
5162                                            + off);
5163                         outrel.r_addend = 0;
5164                         if (tls_ty & (TLS_LD | TLS_GD))
5165                           {
5166                             outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
5167                             if (tls_ty == (TLS_TLS | TLS_GD))
5168                               {
5169                                 loc = htab->relgot->contents;
5170                                 loc += (htab->relgot->reloc_count++
5171                                         * sizeof (Elf32_External_Rela));
5172                                 bfd_elf32_swap_reloca_out (output_bfd,
5173                                                            &outrel, loc);
5174                                 outrel.r_offset += 4;
5175                                 outrel.r_info
5176                                   = ELF32_R_INFO (indx, R_PPC_DTPREL32);
5177                               }
5178                           }
5179                         else if (tls_ty == (TLS_TLS | TLS_DTPREL))
5180                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
5181                         else if (tls_ty == (TLS_TLS | TLS_TPREL))
5182                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
5183                         else if (indx == 0)
5184                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_RELATIVE);
5185                         else
5186                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
5187                         if (indx == 0)
5188                           {
5189                             outrel.r_addend += relocation;
5190                             if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
5191                               outrel.r_addend -= htab->elf.tls_sec->vma;
5192                           }
5193                         loc = htab->relgot->contents;
5194                         loc += (htab->relgot->reloc_count++
5195                                 * sizeof (Elf32_External_Rela));
5196                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5197                       }
5198
5199                     /* Init the .got section contents if we're not
5200                        emitting a reloc.  */
5201                     else
5202                       {
5203                         bfd_vma value = relocation;
5204
5205                         if (tls_ty == (TLS_TLS | TLS_LD))
5206                           value = 1;
5207                         else if (tls_ty != 0)
5208                           {
5209                             value -= htab->elf.tls_sec->vma + DTP_OFFSET;
5210                             if (tls_ty == (TLS_TLS | TLS_TPREL))
5211                               value += DTP_OFFSET - TP_OFFSET;
5212
5213                             if (tls_ty == (TLS_TLS | TLS_GD))
5214                               {
5215                                 bfd_put_32 (output_bfd, value,
5216                                             htab->got->contents + off + 4);
5217                                 value = 1;
5218                               }
5219                           }
5220                         bfd_put_32 (output_bfd, value,
5221                                     htab->got->contents + off);
5222                       }
5223
5224                     off += 4;
5225                     if (tls_ty & (TLS_LD | TLS_GD))
5226                       off += 4;
5227                   }
5228                 while (tls_m != 0);
5229
5230                 off = *offp;
5231                 *offp = off | 1;
5232               }
5233
5234             if (off >= (bfd_vma) -2)
5235               abort ();
5236
5237             if ((tls_type & TLS_TLS) != 0)
5238               {
5239                 if (tls_type != (TLS_TLS | TLS_LD))
5240                   {
5241                     if ((tls_mask & TLS_LD) != 0
5242                         && !(h == NULL
5243                              || !h->def_dynamic))
5244                       off += 8;
5245                     if (tls_type != (TLS_TLS | TLS_GD))
5246                       {
5247                         if ((tls_mask & TLS_GD) != 0)
5248                           off += 8;
5249                         if (tls_type != (TLS_TLS | TLS_DTPREL))
5250                           {
5251                             if ((tls_mask & TLS_DTPREL) != 0)
5252                               off += 4;
5253                           }
5254                       }
5255                   }
5256               }
5257
5258             relocation = htab->got->output_offset + off - 4;
5259
5260             /* Addends on got relocations don't make much sense.
5261                x+off@got is actually x@got+off, and since the got is
5262                generated by a hash table traversal, the value in the
5263                got at entry m+n bears little relation to the entry m.  */
5264             if (addend != 0)
5265               (*_bfd_error_handler)
5266                 (_("%B(%A+0x%lx): non-zero addend on %s reloc against `%s'"),
5267                  input_bfd,
5268                  input_section,
5269                  (long) rel->r_offset,
5270                  howto->name,
5271                  sym_name);
5272           }
5273         break;
5274
5275         /* Relocations that need no special processing.  */
5276         case R_PPC_LOCAL24PC:
5277           /* It makes no sense to point a local relocation
5278              at a symbol not in this object.  */
5279           if (unresolved_reloc)
5280             {
5281               if (! (*info->callbacks->undefined_symbol) (info,
5282                                                           h->root.root.string,
5283                                                           input_bfd,
5284                                                           input_section,
5285                                                           rel->r_offset,
5286                                                           TRUE))
5287                 return FALSE;
5288               continue;
5289             }
5290           break;
5291
5292         case R_PPC_DTPREL16:
5293         case R_PPC_DTPREL16_LO:
5294         case R_PPC_DTPREL16_HI:
5295         case R_PPC_DTPREL16_HA:
5296           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
5297           break;
5298
5299           /* Relocations that may need to be propagated if this is a shared
5300              object.  */
5301         case R_PPC_TPREL16:
5302         case R_PPC_TPREL16_LO:
5303         case R_PPC_TPREL16_HI:
5304         case R_PPC_TPREL16_HA:
5305           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
5306           /* The TPREL16 relocs shouldn't really be used in shared
5307              libs as they will result in DT_TEXTREL being set, but
5308              support them anyway.  */
5309           goto dodyn;
5310
5311         case R_PPC_TPREL32:
5312           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
5313           goto dodyn;
5314
5315         case R_PPC_DTPREL32:
5316           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
5317           goto dodyn;
5318
5319         case R_PPC_DTPMOD32:
5320           relocation = 1;
5321           addend = 0;
5322           goto dodyn;
5323
5324         case R_PPC_REL24:
5325         case R_PPC_REL32:
5326         case R_PPC_REL14:
5327         case R_PPC_REL14_BRTAKEN:
5328         case R_PPC_REL14_BRNTAKEN:
5329           /* If these relocations are not to a named symbol, they can be
5330              handled right here, no need to bother the dynamic linker.  */
5331           if (SYMBOL_REFERENCES_LOCAL (info, h)
5332               || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
5333             break;
5334           /* fall through */
5335
5336           /* Relocations that always need to be propagated if this is a shared
5337              object.  */
5338         case R_PPC_ADDR32:
5339         case R_PPC_ADDR24:
5340         case R_PPC_ADDR16:
5341         case R_PPC_ADDR16_LO:
5342         case R_PPC_ADDR16_HI:
5343         case R_PPC_ADDR16_HA:
5344         case R_PPC_ADDR14:
5345         case R_PPC_ADDR14_BRTAKEN:
5346         case R_PPC_ADDR14_BRNTAKEN:
5347         case R_PPC_UADDR32:
5348         case R_PPC_UADDR16:
5349           /* r_symndx will be zero only for relocs against symbols
5350              from removed linkonce sections, or sections discarded by
5351              a linker script.  */
5352         dodyn:
5353           if (r_symndx == 0)
5354             break;
5355           /* Fall thru.  */
5356
5357           if ((info->shared
5358                && (h == NULL
5359                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5360                    || h->root.type != bfd_link_hash_undefweak)
5361                && (MUST_BE_DYN_RELOC (r_type)
5362                    || !SYMBOL_CALLS_LOCAL (info, h)))
5363               || (ELIMINATE_COPY_RELOCS
5364                   && !info->shared
5365                   && (input_section->flags & SEC_ALLOC) != 0
5366                   && h != NULL
5367                   && h->dynindx != -1
5368                   && !h->non_got_ref
5369                   && h->def_dynamic
5370                   && !h->def_regular))
5371             {
5372               int skip;
5373
5374 #ifdef DEBUG
5375               fprintf (stderr, "ppc_elf_relocate_section needs to "
5376                        "create relocation for %s\n",
5377                        (h && h->root.root.string
5378                         ? h->root.root.string : "<unknown>"));
5379 #endif
5380
5381               /* When generating a shared object, these relocations
5382                  are copied into the output file to be resolved at run
5383                  time.  */
5384               if (sreloc == NULL)
5385                 {
5386                   const char *name;
5387
5388                   name = (bfd_elf_string_from_elf_section
5389                           (input_bfd,
5390                            elf_elfheader (input_bfd)->e_shstrndx,
5391                            elf_section_data (input_section)->rel_hdr.sh_name));
5392                   if (name == NULL)
5393                     return FALSE;
5394
5395                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
5396                               && strcmp (bfd_get_section_name (input_bfd,
5397                                                                input_section),
5398                                          name + 5) == 0);
5399
5400                   sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
5401                   BFD_ASSERT (sreloc != NULL);
5402                 }
5403
5404               skip = 0;
5405
5406               outrel.r_offset =
5407                 _bfd_elf_section_offset (output_bfd, info, input_section,
5408                                          rel->r_offset);
5409               if (outrel.r_offset == (bfd_vma) -1
5410                   || outrel.r_offset == (bfd_vma) -2)
5411                 skip = (int) outrel.r_offset;
5412               outrel.r_offset += (input_section->output_section->vma
5413                                   + input_section->output_offset);
5414
5415               if (skip)
5416                 memset (&outrel, 0, sizeof outrel);
5417               else if (!SYMBOL_REFERENCES_LOCAL (info, h))
5418                 {
5419                   unresolved_reloc = FALSE;
5420                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
5421                   outrel.r_addend = rel->r_addend;
5422                 }
5423               else
5424                 {
5425                   outrel.r_addend = relocation + rel->r_addend;
5426
5427                   if (r_type == R_PPC_ADDR32)
5428                     outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
5429                   else
5430                     {
5431                       long indx;
5432
5433                       if (bfd_is_abs_section (sec))
5434                         indx = 0;
5435                       else if (sec == NULL || sec->owner == NULL)
5436                         {
5437                           bfd_set_error (bfd_error_bad_value);
5438                           return FALSE;
5439                         }
5440                       else
5441                         {
5442                           asection *osec;
5443
5444                           /* We are turning this relocation into one
5445                              against a section symbol.  It would be
5446                              proper to subtract the symbol's value,
5447                              osec->vma, from the emitted reloc addend,
5448                              but ld.so expects buggy relocs.  */
5449                           osec = sec->output_section;
5450                           indx = elf_section_data (osec)->dynindx;
5451                           BFD_ASSERT (indx > 0);
5452 #ifdef DEBUG
5453                           if (indx <= 0)
5454                             printf ("indx=%d section=%s flags=%08x name=%s\n",
5455                                     indx, osec->name, osec->flags,
5456                                     h->root.root.string);
5457 #endif
5458                         }
5459
5460                       outrel.r_info = ELF32_R_INFO (indx, r_type);
5461                     }
5462                 }
5463
5464               loc = sreloc->contents;
5465               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
5466               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5467
5468               if (skip == -1)
5469                 continue;
5470
5471               /* This reloc will be computed at runtime.  We clear the memory
5472                  so that it contains predictable value.  */
5473               if (! skip
5474                   && ((input_section->flags & SEC_ALLOC) != 0
5475                       || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
5476                 {
5477                   relocation = howto->pc_relative ? outrel.r_offset : 0;
5478                   addend = 0;
5479                   break;
5480                 }
5481             }
5482           break;
5483
5484         case R_PPC_RELAX32PC_PLT:
5485         case R_PPC_RELAX32_PLT:
5486           BFD_ASSERT (h != NULL
5487                       && h->plt.offset != (bfd_vma) -1
5488                       && htab->plt != NULL);
5489
5490           relocation = (htab->plt->output_section->vma
5491                         + htab->plt->output_offset
5492                         + h->plt.offset);
5493           if (r_type == R_PPC_RELAX32_PLT)
5494             goto relax32;
5495           /* Fall thru */
5496
5497         case R_PPC_RELAX32PC:
5498           relocation -= (input_section->output_section->vma
5499                          + input_section->output_offset
5500                          + rel->r_offset - 4);
5501           /* Fall thru */
5502
5503         case R_PPC_RELAX32:
5504         relax32:
5505           {
5506             unsigned long t0;
5507             unsigned long t1;
5508
5509             t0 = bfd_get_32 (output_bfd, contents + rel->r_offset);
5510             t1 = bfd_get_32 (output_bfd, contents + rel->r_offset + 4);
5511
5512             /* We're clearing the bits for R_PPC_ADDR16_HA
5513                and R_PPC_ADDR16_LO here.  */
5514             t0 &= ~0xffff;
5515             t1 &= ~0xffff;
5516
5517             /* t0 is HA, t1 is LO */
5518             relocation += addend;
5519             t0 |= ((relocation + 0x8000) >> 16) & 0xffff;
5520             t1 |= relocation & 0xffff;
5521
5522             bfd_put_32 (output_bfd, t0, contents + rel->r_offset);
5523             bfd_put_32 (output_bfd, t1, contents + rel->r_offset + 4);
5524           }
5525           continue;
5526
5527           /* Indirect .sdata relocation.  */
5528         case R_PPC_EMB_SDAI16:
5529           BFD_ASSERT (htab->sdata[0].section != NULL);
5530           relocation
5531             = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[0],
5532                                                  h, relocation, rel);
5533           break;
5534
5535           /* Indirect .sdata2 relocation.  */
5536         case R_PPC_EMB_SDA2I16:
5537           BFD_ASSERT (htab->sdata[1].section != NULL);
5538           relocation
5539             = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[1],
5540                                                  h, relocation, rel);
5541           break;
5542
5543           /* Handle the TOC16 reloc.  We want to use the offset within the .got
5544              section, not the actual VMA.  This is appropriate when generating
5545              an embedded ELF object, for which the .got section acts like the
5546              AIX .toc section.  */
5547         case R_PPC_TOC16:                       /* phony GOT16 relocations */
5548           BFD_ASSERT (sec != NULL);
5549           BFD_ASSERT (bfd_is_und_section (sec)
5550                       || strcmp (bfd_get_section_name (abfd, sec), ".got") == 0
5551                       || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0);
5552
5553             addend -= sec->output_section->vma + sec->output_offset + 0x8000;
5554           break;
5555
5556         case R_PPC_PLTREL24:
5557           /* Relocation is to the entry for this symbol in the
5558              procedure linkage table.  */
5559           BFD_ASSERT (h != NULL);
5560
5561           if (h->plt.offset == (bfd_vma) -1
5562               || htab->plt == NULL)
5563             {
5564               /* We didn't make a PLT entry for this symbol.  This
5565                  happens when statically linking PIC code, or when
5566                  using -Bsymbolic.  */
5567               break;
5568             }
5569
5570           unresolved_reloc = FALSE;
5571           relocation = (htab->plt->output_section->vma
5572                         + htab->plt->output_offset
5573                         + h->plt.offset);
5574           break;
5575
5576           /* Relocate against _SDA_BASE_.  */
5577         case R_PPC_SDAREL16:
5578           {
5579             const char *name;
5580
5581             BFD_ASSERT (sec != NULL);
5582             name = bfd_get_section_name (abfd, sec->output_section);
5583             if (! ((strncmp (name, ".sdata", 6) == 0
5584                     && (name[6] == 0 || name[6] == '.'))
5585                    || (strncmp (name, ".sbss", 5) == 0
5586                        && (name[5] == 0 || name[5] == '.'))))
5587               {
5588                 (*_bfd_error_handler)
5589                   (_("%B: the target (%s) of a %s relocation is "
5590                      "in the wrong output section (%s)"),
5591                    input_bfd,
5592                    sym_name,
5593                    howto->name,
5594                    name);
5595               }
5596             addend -= htab->sdata[0].sym_val;
5597           }
5598           break;
5599
5600           /* Relocate against _SDA2_BASE_.  */
5601         case R_PPC_EMB_SDA2REL:
5602           {
5603             const char *name;
5604
5605             BFD_ASSERT (sec != NULL);
5606             name = bfd_get_section_name (abfd, sec->output_section);
5607             if (! (strncmp (name, ".sdata2", 7) == 0
5608                    || strncmp (name, ".sbss2", 6) == 0))
5609               {
5610                 (*_bfd_error_handler)
5611                   (_("%B: the target (%s) of a %s relocation is "
5612                      "in the wrong output section (%s)"),
5613                    input_bfd,
5614                    sym_name,
5615                    howto->name,
5616                    name);
5617
5618                 bfd_set_error (bfd_error_bad_value);
5619                 ret = FALSE;
5620                 continue;
5621               }
5622             addend -= htab->sdata[1].sym_val;
5623           }
5624           break;
5625
5626           /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0.  */
5627         case R_PPC_EMB_SDA21:
5628         case R_PPC_EMB_RELSDA:
5629           {
5630             const char *name;
5631             int reg;
5632
5633             BFD_ASSERT (sec != NULL);
5634             name = bfd_get_section_name (abfd, sec->output_section);
5635             if (((strncmp (name, ".sdata", 6) == 0
5636                   && (name[6] == 0 || name[6] == '.'))
5637                  || (strncmp (name, ".sbss", 5) == 0
5638                      && (name[5] == 0 || name[5] == '.'))))
5639               {
5640                 reg = 13;
5641                 addend -= htab->sdata[0].sym_val;
5642               }
5643
5644             else if (strncmp (name, ".sdata2", 7) == 0
5645                      || strncmp (name, ".sbss2", 6) == 0)
5646               {
5647                 reg = 2;
5648                 addend -= htab->sdata[1].sym_val;
5649               }
5650
5651             else if (strcmp (name, ".PPC.EMB.sdata0") == 0
5652                      || strcmp (name, ".PPC.EMB.sbss0") == 0)
5653               {
5654                 reg = 0;
5655               }
5656
5657             else
5658               {
5659                 (*_bfd_error_handler)
5660                   (_("%B: the target (%s) of a %s relocation is "
5661                      "in the wrong output section (%s)"),
5662                    input_bfd,
5663                    sym_name,
5664                    howto->name,
5665                    name);
5666
5667                 bfd_set_error (bfd_error_bad_value);
5668                 ret = FALSE;
5669                 continue;
5670               }
5671
5672             if (r_type == R_PPC_EMB_SDA21)
5673               {                 /* fill in register field */
5674                 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
5675                 insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
5676                 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5677               }
5678           }
5679           break;
5680
5681           /* Relocate against the beginning of the section.  */
5682         case R_PPC_SECTOFF:
5683         case R_PPC_SECTOFF_LO:
5684         case R_PPC_SECTOFF_HI:
5685         case R_PPC_SECTOFF_HA:
5686           BFD_ASSERT (sec != NULL);
5687           addend -= sec->output_section->vma;
5688           break;
5689
5690           /* Negative relocations.  */
5691         case R_PPC_EMB_NADDR32:
5692         case R_PPC_EMB_NADDR16:
5693         case R_PPC_EMB_NADDR16_LO:
5694         case R_PPC_EMB_NADDR16_HI:
5695         case R_PPC_EMB_NADDR16_HA:
5696           addend -= 2 * relocation;
5697           break;
5698
5699         case R_PPC_COPY:
5700         case R_PPC_GLOB_DAT:
5701         case R_PPC_JMP_SLOT:
5702         case R_PPC_RELATIVE:
5703         case R_PPC_PLT32:
5704         case R_PPC_PLTREL32:
5705         case R_PPC_PLT16_LO:
5706         case R_PPC_PLT16_HI:
5707         case R_PPC_PLT16_HA:
5708         case R_PPC_ADDR30:
5709         case R_PPC_EMB_RELSEC16:
5710         case R_PPC_EMB_RELST_LO:
5711         case R_PPC_EMB_RELST_HI:
5712         case R_PPC_EMB_RELST_HA:
5713         case R_PPC_EMB_BIT_FLD:
5714           (*_bfd_error_handler)
5715             (_("%B: relocation %s is not yet supported for symbol %s."),
5716              input_bfd,
5717              howto->name,
5718              sym_name);
5719
5720           bfd_set_error (bfd_error_invalid_operation);
5721           ret = FALSE;
5722           continue;
5723         }
5724
5725       /* Do any further special processing.  */
5726       switch (r_type)
5727         {
5728         default:
5729           break;
5730
5731         case R_PPC_ADDR16_HA:
5732         case R_PPC_GOT16_HA:
5733         case R_PPC_PLT16_HA:
5734         case R_PPC_SECTOFF_HA:
5735         case R_PPC_TPREL16_HA:
5736         case R_PPC_DTPREL16_HA:
5737         case R_PPC_GOT_TLSGD16_HA:
5738         case R_PPC_GOT_TLSLD16_HA:
5739         case R_PPC_GOT_TPREL16_HA:
5740         case R_PPC_GOT_DTPREL16_HA:
5741         case R_PPC_EMB_NADDR16_HA:
5742         case R_PPC_EMB_RELST_HA:
5743           /* It's just possible that this symbol is a weak symbol
5744              that's not actually defined anywhere.  In that case,
5745              'sec' would be NULL, and we should leave the symbol
5746              alone (it will be set to zero elsewhere in the link).  */
5747           if (sec != NULL)
5748             /* Add 0x10000 if sign bit in 0:15 is set.
5749                Bits 0:15 are not used.  */
5750             addend += 0x8000;
5751           break;
5752         }
5753
5754 #ifdef DEBUG
5755       fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
5756                "offset = %ld, addend = %ld\n",
5757                howto->name,
5758                (int) r_type,
5759                sym_name,
5760                r_symndx,
5761                (long) rel->r_offset,
5762                (long) addend);
5763 #endif
5764
5765       if (unresolved_reloc
5766           && !((input_section->flags & SEC_DEBUGGING) != 0
5767                && h->def_dynamic))
5768         {
5769           (*_bfd_error_handler)
5770             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5771              input_bfd,
5772              input_section,
5773              (long) rel->r_offset,
5774              howto->name,
5775              sym_name);
5776           ret = FALSE;
5777         }
5778
5779       r = _bfd_final_link_relocate (howto,
5780                                     input_bfd,
5781                                     input_section,
5782                                     contents,
5783                                     rel->r_offset,
5784                                     relocation,
5785                                     addend);
5786
5787       if (r != bfd_reloc_ok)
5788         {
5789           if (sym_name == NULL)
5790             sym_name = "(null)";
5791           if (r == bfd_reloc_overflow)
5792             {
5793               if (warned)
5794                 continue;
5795               if (h != NULL
5796                   && h->root.type == bfd_link_hash_undefweak
5797                   && howto->pc_relative)
5798                 {
5799                   /* Assume this is a call protected by other code that
5800                      detect the symbol is undefined.  If this is the case,
5801                      we can safely ignore the overflow.  If not, the
5802                      program is hosed anyway, and a little warning isn't
5803                      going to help.  */
5804
5805                   continue;
5806                 }
5807
5808               if (! (*info->callbacks->reloc_overflow) (info,
5809                                                         (h ? &h->root : NULL),
5810                                                         sym_name,
5811                                                         howto->name,
5812                                                         rel->r_addend,
5813                                                         input_bfd,
5814                                                         input_section,
5815                                                         rel->r_offset))
5816                 return FALSE;
5817             }
5818           else
5819             {
5820               (*_bfd_error_handler)
5821                 (_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
5822                  input_bfd, input_section,
5823                  (long) rel->r_offset, howto->name, sym_name, (int) r);
5824               ret = FALSE;
5825             }
5826         }
5827     }
5828
5829 #ifdef DEBUG
5830   fprintf (stderr, "\n");
5831 #endif
5832
5833   return ret;
5834 }
5835 \f
5836 /* Finish up dynamic symbol handling.  We set the contents of various
5837    dynamic sections here.  */
5838
5839 static bfd_boolean
5840 ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
5841                                struct bfd_link_info *info,
5842                                struct elf_link_hash_entry *h,
5843                                Elf_Internal_Sym *sym)
5844 {
5845   struct ppc_elf_link_hash_table *htab;
5846
5847 #ifdef DEBUG
5848   fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
5849            h->root.root.string);
5850 #endif
5851
5852   htab = ppc_elf_hash_table (info);
5853   BFD_ASSERT (htab->elf.dynobj != NULL);
5854
5855   if (h->plt.offset != (bfd_vma) -1)
5856     {
5857       Elf_Internal_Rela rela;
5858       bfd_byte *loc;
5859       bfd_vma reloc_index;
5860
5861 #ifdef DEBUG
5862       fprintf (stderr, ", plt_offset = %d", h->plt.offset);
5863 #endif
5864
5865       /* This symbol has an entry in the procedure linkage table.  Set
5866          it up.  */
5867
5868       BFD_ASSERT (h->dynindx != -1);
5869       BFD_ASSERT (htab->plt != NULL && htab->relplt != NULL);
5870
5871       /* We don't need to fill in the .plt.  The ppc dynamic linker
5872          will fill it in.  */
5873
5874       /* Fill in the entry in the .rela.plt section.  */
5875       rela.r_offset = (htab->plt->output_section->vma
5876                        + htab->plt->output_offset
5877                        + h->plt.offset);
5878       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
5879       rela.r_addend = 0;
5880
5881       reloc_index = (h->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_SLOT_SIZE;
5882       if (reloc_index > PLT_NUM_SINGLE_ENTRIES)
5883         reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
5884       loc = (htab->relplt->contents
5885              + reloc_index * sizeof (Elf32_External_Rela));
5886       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5887
5888       if (!h->def_regular)
5889         {
5890           /* Mark the symbol as undefined, rather than as defined in
5891              the .plt section.  Leave the value alone.  */
5892           sym->st_shndx = SHN_UNDEF;
5893           /* If the symbol is weak, we do need to clear the value.
5894              Otherwise, the PLT entry would provide a definition for
5895              the symbol even if the symbol wasn't defined anywhere,
5896              and so the symbol would never be NULL.  */
5897           if (!h->ref_regular_nonweak)
5898             sym->st_value = 0;
5899         }
5900     }
5901
5902   if (h->needs_copy)
5903     {
5904       asection *s;
5905       Elf_Internal_Rela rela;
5906       bfd_byte *loc;
5907
5908       /* This symbols needs a copy reloc.  Set it up.  */
5909
5910 #ifdef DEBUG
5911       fprintf (stderr, ", copy");
5912 #endif
5913
5914       BFD_ASSERT (h->dynindx != -1);
5915
5916       if (h->size <= elf_gp_size (htab->elf.dynobj))
5917         s = htab->relsbss;
5918       else
5919         s = htab->relbss;
5920       BFD_ASSERT (s != NULL);
5921
5922       rela.r_offset = (h->root.u.def.value
5923                        + h->root.u.def.section->output_section->vma
5924                        + h->root.u.def.section->output_offset);
5925       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
5926       rela.r_addend = 0;
5927       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
5928       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5929     }
5930
5931 #ifdef DEBUG
5932   fprintf (stderr, "\n");
5933 #endif
5934
5935   /* Mark some specially defined symbols as absolute.  */
5936   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
5937       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
5938       || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
5939     sym->st_shndx = SHN_ABS;
5940
5941   return TRUE;
5942 }
5943 \f
5944 static enum elf_reloc_type_class
5945 ppc_elf_reloc_type_class (const Elf_Internal_Rela *rela)
5946 {
5947   switch (ELF32_R_TYPE (rela->r_info))
5948     {
5949     case R_PPC_RELATIVE:
5950       return reloc_class_relative;
5951     case R_PPC_REL24:
5952     case R_PPC_ADDR24:
5953     case R_PPC_JMP_SLOT:
5954       return reloc_class_plt;
5955     case R_PPC_COPY:
5956       return reloc_class_copy;
5957     default:
5958       return reloc_class_normal;
5959     }
5960 }
5961 \f
5962 /* Finish up the dynamic sections.  */
5963
5964 static bfd_boolean
5965 ppc_elf_finish_dynamic_sections (bfd *output_bfd,
5966                                  struct bfd_link_info *info)
5967 {
5968   asection *sdyn;
5969   struct ppc_elf_link_hash_table *htab;
5970
5971 #ifdef DEBUG
5972   fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
5973 #endif
5974
5975   htab = ppc_elf_hash_table (info);
5976   sdyn = bfd_get_section_by_name (htab->elf.dynobj, ".dynamic");
5977
5978   if (htab->elf.dynamic_sections_created)
5979     {
5980       Elf32_External_Dyn *dyncon, *dynconend;
5981
5982       BFD_ASSERT (htab->plt != NULL && sdyn != NULL);
5983
5984       dyncon = (Elf32_External_Dyn *) sdyn->contents;
5985       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5986       for (; dyncon < dynconend; dyncon++)
5987         {
5988           Elf_Internal_Dyn dyn;
5989           asection *s;
5990
5991           bfd_elf32_swap_dyn_in (htab->elf.dynobj, dyncon, &dyn);
5992
5993           switch (dyn.d_tag)
5994             {
5995             case DT_PLTGOT:
5996               s = htab->plt;
5997               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5998               break;
5999
6000             case DT_PLTRELSZ:
6001               dyn.d_un.d_val = htab->relplt->size;
6002               break;
6003
6004             case DT_JMPREL:
6005               s = htab->relplt;
6006               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
6007               break;
6008
6009             default:
6010               continue;
6011             }
6012
6013           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6014         }
6015     }
6016
6017   /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can
6018      easily find the address of the _GLOBAL_OFFSET_TABLE_.  */
6019   if (htab->got)
6020     {
6021       unsigned char *contents = htab->got->contents;
6022       bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, contents);
6023
6024       if (sdyn == NULL)
6025         bfd_put_32 (output_bfd, 0, contents + 4);
6026       else
6027         bfd_put_32 (output_bfd,
6028                     sdyn->output_section->vma + sdyn->output_offset,
6029                     contents + 4);
6030
6031       elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 4;
6032     }
6033
6034   return TRUE;
6035 }
6036 \f
6037 #define TARGET_LITTLE_SYM       bfd_elf32_powerpcle_vec
6038 #define TARGET_LITTLE_NAME      "elf32-powerpcle"
6039 #define TARGET_BIG_SYM          bfd_elf32_powerpc_vec
6040 #define TARGET_BIG_NAME         "elf32-powerpc"
6041 #define ELF_ARCH                bfd_arch_powerpc
6042 #define ELF_MACHINE_CODE        EM_PPC
6043 #ifdef __QNXTARGET__
6044 #define ELF_MAXPAGESIZE         0x1000
6045 #else
6046 #define ELF_MAXPAGESIZE         0x10000
6047 #endif
6048 #define ELF_MINPAGESIZE         0x1000
6049 #define elf_info_to_howto       ppc_elf_info_to_howto
6050
6051 #ifdef  EM_CYGNUS_POWERPC
6052 #define ELF_MACHINE_ALT1        EM_CYGNUS_POWERPC
6053 #endif
6054
6055 #ifdef EM_PPC_OLD
6056 #define ELF_MACHINE_ALT2        EM_PPC_OLD
6057 #endif
6058
6059 #define elf_backend_plt_not_loaded      1
6060 #define elf_backend_got_symbol_offset   4
6061 #define elf_backend_can_gc_sections     1
6062 #define elf_backend_can_refcount        1
6063 #define elf_backend_got_header_size     12
6064 #define elf_backend_rela_normal         1
6065
6066 #define bfd_elf32_mkobject                      ppc_elf_mkobject
6067 #define bfd_elf32_bfd_merge_private_bfd_data    ppc_elf_merge_private_bfd_data
6068 #define bfd_elf32_bfd_relax_section             ppc_elf_relax_section
6069 #define bfd_elf32_bfd_reloc_type_lookup         ppc_elf_reloc_type_lookup
6070 #define bfd_elf32_bfd_set_private_flags         ppc_elf_set_private_flags
6071 #define bfd_elf32_bfd_link_hash_table_create    ppc_elf_link_hash_table_create
6072
6073 #define elf_backend_object_p                    ppc_elf_object_p
6074 #define elf_backend_gc_mark_hook                ppc_elf_gc_mark_hook
6075 #define elf_backend_gc_sweep_hook               ppc_elf_gc_sweep_hook
6076 #define elf_backend_section_from_shdr           ppc_elf_section_from_shdr
6077 #define elf_backend_relocate_section            ppc_elf_relocate_section
6078 #define elf_backend_create_dynamic_sections     ppc_elf_create_dynamic_sections
6079 #define elf_backend_check_relocs                ppc_elf_check_relocs
6080 #define elf_backend_copy_indirect_symbol        ppc_elf_copy_indirect_symbol
6081 #define elf_backend_adjust_dynamic_symbol       ppc_elf_adjust_dynamic_symbol
6082 #define elf_backend_add_symbol_hook             ppc_elf_add_symbol_hook
6083 #define elf_backend_size_dynamic_sections       ppc_elf_size_dynamic_sections
6084 #define elf_backend_finish_dynamic_symbol       ppc_elf_finish_dynamic_symbol
6085 #define elf_backend_finish_dynamic_sections     ppc_elf_finish_dynamic_sections
6086 #define elf_backend_fake_sections               ppc_elf_fake_sections
6087 #define elf_backend_additional_program_headers  ppc_elf_additional_program_headers
6088 #define elf_backend_grok_prstatus               ppc_elf_grok_prstatus
6089 #define elf_backend_grok_psinfo                 ppc_elf_grok_psinfo
6090 #define elf_backend_reloc_type_class            ppc_elf_reloc_type_class
6091 #define elf_backend_begin_write_processing      ppc_elf_begin_write_processing
6092 #define elf_backend_final_write_processing      ppc_elf_final_write_processing
6093 #define elf_backend_write_section               ppc_elf_write_section
6094 #define elf_backend_special_sections            ppc_elf_special_sections
6095 #define elf_backend_plt_sym_val                 ppc_elf_plt_sym_val
6096
6097 #include "elf32-target.h"