17978a0bef74447ae301c1f0380cd1ce3dc28572
[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, 2006, 2007 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 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the
20    Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
21    Boston, MA 02110-1301, USA.  */
22
23
24 /* This file is based on a preliminary PowerPC ELF ABI.  The
25    information may not match the final PowerPC ELF ABI.  It includes
26    suggestions from the in-progress Embedded PowerPC ABI, and that
27    information may also not match.  */
28
29 #include "sysdep.h"
30 #include <stdarg.h>
31 #include "bfd.h"
32 #include "bfdlink.h"
33 #include "libbfd.h"
34 #include "elf-bfd.h"
35 #include "elf/ppc.h"
36 #include "elf32-ppc.h"
37 #include "elf-vxworks.h"
38
39 /* RELA relocations are used here.  */
40
41 static bfd_reloc_status_type ppc_elf_addr16_ha_reloc
42   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
43 static bfd_reloc_status_type ppc_elf_unhandled_reloc
44   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
45
46 /* Branch prediction bit for branch taken relocs.  */
47 #define BRANCH_PREDICT_BIT 0x200000
48 /* Mask to set RA in memory instructions.  */
49 #define RA_REGISTER_MASK 0x001f0000
50 /* Value to shift register by to insert RA.  */
51 #define RA_REGISTER_SHIFT 16
52
53 /* The name of the dynamic interpreter.  This is put in the .interp
54    section.  */
55 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
56
57 /* For old-style PLT.  */
58 /* The number of single-slot PLT entries (the rest use two slots).  */
59 #define PLT_NUM_SINGLE_ENTRIES 8192
60
61 /* For new-style .glink and .plt.  */
62 #define GLINK_PLTRESOLVE 16*4
63 #define GLINK_ENTRY_SIZE 4*4
64
65 /* VxWorks uses its own plt layout, filled in by the static linker.  */
66
67 /* The standard VxWorks PLT entry.  */
68 #define VXWORKS_PLT_ENTRY_SIZE 32
69 static const bfd_vma ppc_elf_vxworks_plt_entry
70     [VXWORKS_PLT_ENTRY_SIZE / 4] =
71   {
72     0x3d800000, /* lis     r12,0                 */
73     0x818c0000, /* lwz     r12,0(r12)            */
74     0x7d8903a6, /* mtctr   r12                   */
75     0x4e800420, /* bctr                          */
76     0x39600000, /* li      r11,0                 */
77     0x48000000, /* b       14 <.PLT0resolve+0x4> */
78     0x60000000, /* nop                           */
79     0x60000000, /* nop                           */
80   };
81 static const bfd_vma ppc_elf_vxworks_pic_plt_entry
82     [VXWORKS_PLT_ENTRY_SIZE / 4] =
83   {
84     0x3d9e0000, /* addis r12,r30,0 */
85     0x818c0000, /* lwz   r12,0(r12) */
86     0x7d8903a6, /* mtctr r12 */
87     0x4e800420, /* bctr */
88     0x39600000, /* li    r11,0 */
89     0x48000000, /* b     14 <.PLT0resolve+0x4> 14: R_PPC_REL24 .PLTresolve */
90     0x60000000, /* nop */
91     0x60000000, /* nop */
92   };
93
94 /* The initial VxWorks PLT entry.  */
95 #define VXWORKS_PLT_INITIAL_ENTRY_SIZE 32
96 static const bfd_vma ppc_elf_vxworks_plt0_entry
97     [VXWORKS_PLT_INITIAL_ENTRY_SIZE / 4] =
98   {
99     0x3d800000, /* lis     r12,0        */
100     0x398c0000, /* addi    r12,r12,0    */
101     0x800c0008, /* lwz     r0,8(r12)    */
102     0x7c0903a6, /* mtctr   r0           */
103     0x818c0004, /* lwz     r12,4(r12)   */
104     0x4e800420, /* bctr                 */
105     0x60000000, /* nop                  */
106     0x60000000, /* nop                  */
107   };
108 static const bfd_vma ppc_elf_vxworks_pic_plt0_entry
109     [VXWORKS_PLT_INITIAL_ENTRY_SIZE / 4] =
110   {
111     0x819e0008, /* lwz   r12,8(r30) */
112     0x7d8903a6, /* mtctr r12        */
113     0x819e0004, /* lwz   r12,4(r30) */
114     0x4e800420, /* bctr             */
115     0x60000000, /* nop              */
116     0x60000000, /* nop              */
117     0x60000000, /* nop              */
118     0x60000000, /* nop              */
119   };
120
121 /* For executables, we have some additional relocations in
122    .rela.plt.unloaded, for the kernel loader.  */
123
124 /* The number of non-JMP_SLOT relocations per PLT0 slot. */
125 #define VXWORKS_PLT_NON_JMP_SLOT_RELOCS 3
126 /* The number of relocations in the PLTResolve slot. */
127 #define VXWORKS_PLTRESOLVE_RELOCS 2
128 /* The number of relocations in the PLTResolve slot when when creating
129    a shared library. */
130 #define VXWORKS_PLTRESOLVE_RELOCS_SHLIB 0
131
132 /* Some instructions.  */
133 #define ADDIS_11_11     0x3d6b0000
134 #define ADDIS_11_30     0x3d7e0000
135 #define ADDIS_12_12     0x3d8c0000
136 #define ADDI_11_11      0x396b0000
137 #define ADD_0_11_11     0x7c0b5a14
138 #define ADD_11_0_11     0x7d605a14
139 #define B               0x48000000
140 #define BCL_20_31       0x429f0005
141 #define BCTR            0x4e800420
142 #define LIS_11          0x3d600000
143 #define LIS_12          0x3d800000
144 #define LWZU_0_12       0x840c0000
145 #define LWZ_0_12        0x800c0000
146 #define LWZ_11_11       0x816b0000
147 #define LWZ_11_30       0x817e0000
148 #define LWZ_12_12       0x818c0000
149 #define MFLR_0          0x7c0802a6
150 #define MFLR_12         0x7d8802a6
151 #define MTCTR_0         0x7c0903a6
152 #define MTCTR_11        0x7d6903a6
153 #define MTLR_0          0x7c0803a6
154 #define NOP             0x60000000
155 #define SUB_11_11_12    0x7d6c5850
156
157 /* Offset of tp and dtp pointers from start of TLS block.  */
158 #define TP_OFFSET       0x7000
159 #define DTP_OFFSET      0x8000
160 \f
161 static reloc_howto_type *ppc_elf_howto_table[R_PPC_max];
162
163 static reloc_howto_type ppc_elf_howto_raw[] = {
164   /* This reloc does nothing.  */
165   HOWTO (R_PPC_NONE,            /* type */
166          0,                     /* rightshift */
167          2,                     /* size (0 = byte, 1 = short, 2 = long) */
168          32,                    /* bitsize */
169          FALSE,                 /* pc_relative */
170          0,                     /* bitpos */
171          complain_overflow_bitfield, /* complain_on_overflow */
172          bfd_elf_generic_reloc, /* special_function */
173          "R_PPC_NONE",          /* name */
174          FALSE,                 /* partial_inplace */
175          0,                     /* src_mask */
176          0,                     /* dst_mask */
177          FALSE),                /* pcrel_offset */
178
179   /* A standard 32 bit relocation.  */
180   HOWTO (R_PPC_ADDR32,          /* type */
181          0,                     /* rightshift */
182          2,                     /* size (0 = byte, 1 = short, 2 = long) */
183          32,                    /* bitsize */
184          FALSE,                 /* pc_relative */
185          0,                     /* bitpos */
186          complain_overflow_bitfield, /* complain_on_overflow */
187          bfd_elf_generic_reloc, /* special_function */
188          "R_PPC_ADDR32",        /* name */
189          FALSE,                 /* partial_inplace */
190          0,                     /* src_mask */
191          0xffffffff,            /* dst_mask */
192          FALSE),                /* pcrel_offset */
193
194   /* An absolute 26 bit branch; the lower two bits must be zero.
195      FIXME: we don't check that, we just clear them.  */
196   HOWTO (R_PPC_ADDR24,          /* type */
197          0,                     /* rightshift */
198          2,                     /* size (0 = byte, 1 = short, 2 = long) */
199          26,                    /* bitsize */
200          FALSE,                 /* pc_relative */
201          0,                     /* bitpos */
202          complain_overflow_bitfield, /* complain_on_overflow */
203          bfd_elf_generic_reloc, /* special_function */
204          "R_PPC_ADDR24",        /* name */
205          FALSE,                 /* partial_inplace */
206          0,                     /* src_mask */
207          0x3fffffc,             /* dst_mask */
208          FALSE),                /* pcrel_offset */
209
210   /* A standard 16 bit relocation.  */
211   HOWTO (R_PPC_ADDR16,          /* type */
212          0,                     /* rightshift */
213          1,                     /* size (0 = byte, 1 = short, 2 = long) */
214          16,                    /* bitsize */
215          FALSE,                 /* pc_relative */
216          0,                     /* bitpos */
217          complain_overflow_bitfield, /* complain_on_overflow */
218          bfd_elf_generic_reloc, /* special_function */
219          "R_PPC_ADDR16",        /* name */
220          FALSE,                 /* partial_inplace */
221          0,                     /* src_mask */
222          0xffff,                /* dst_mask */
223          FALSE),                /* pcrel_offset */
224
225   /* A 16 bit relocation without overflow.  */
226   HOWTO (R_PPC_ADDR16_LO,       /* type */
227          0,                     /* rightshift */
228          1,                     /* size (0 = byte, 1 = short, 2 = long) */
229          16,                    /* bitsize */
230          FALSE,                 /* pc_relative */
231          0,                     /* bitpos */
232          complain_overflow_dont,/* complain_on_overflow */
233          bfd_elf_generic_reloc, /* special_function */
234          "R_PPC_ADDR16_LO",     /* name */
235          FALSE,                 /* partial_inplace */
236          0,                     /* src_mask */
237          0xffff,                /* dst_mask */
238          FALSE),                /* pcrel_offset */
239
240   /* The high order 16 bits of an address.  */
241   HOWTO (R_PPC_ADDR16_HI,       /* type */
242          16,                    /* rightshift */
243          1,                     /* size (0 = byte, 1 = short, 2 = long) */
244          16,                    /* bitsize */
245          FALSE,                 /* pc_relative */
246          0,                     /* bitpos */
247          complain_overflow_dont, /* complain_on_overflow */
248          bfd_elf_generic_reloc, /* special_function */
249          "R_PPC_ADDR16_HI",     /* name */
250          FALSE,                 /* partial_inplace */
251          0,                     /* src_mask */
252          0xffff,                /* dst_mask */
253          FALSE),                /* pcrel_offset */
254
255   /* The high order 16 bits of an address, plus 1 if the contents of
256      the low 16 bits, treated as a signed number, is negative.  */
257   HOWTO (R_PPC_ADDR16_HA,       /* type */
258          16,                    /* rightshift */
259          1,                     /* size (0 = byte, 1 = short, 2 = long) */
260          16,                    /* bitsize */
261          FALSE,                 /* pc_relative */
262          0,                     /* bitpos */
263          complain_overflow_dont, /* complain_on_overflow */
264          ppc_elf_addr16_ha_reloc, /* special_function */
265          "R_PPC_ADDR16_HA",     /* name */
266          FALSE,                 /* partial_inplace */
267          0,                     /* src_mask */
268          0xffff,                /* dst_mask */
269          FALSE),                /* pcrel_offset */
270
271   /* An absolute 16 bit branch; the lower two bits must be zero.
272      FIXME: we don't check that, we just clear them.  */
273   HOWTO (R_PPC_ADDR14,          /* type */
274          0,                     /* rightshift */
275          2,                     /* size (0 = byte, 1 = short, 2 = long) */
276          16,                    /* bitsize */
277          FALSE,                 /* pc_relative */
278          0,                     /* bitpos */
279          complain_overflow_bitfield, /* complain_on_overflow */
280          bfd_elf_generic_reloc, /* special_function */
281          "R_PPC_ADDR14",        /* name */
282          FALSE,                 /* partial_inplace */
283          0,                     /* src_mask */
284          0xfffc,                /* dst_mask */
285          FALSE),                /* pcrel_offset */
286
287   /* An absolute 16 bit branch, for which bit 10 should be set to
288      indicate that the branch is expected to be taken.  The lower two
289      bits must be zero.  */
290   HOWTO (R_PPC_ADDR14_BRTAKEN,  /* type */
291          0,                     /* rightshift */
292          2,                     /* size (0 = byte, 1 = short, 2 = long) */
293          16,                    /* bitsize */
294          FALSE,                 /* pc_relative */
295          0,                     /* bitpos */
296          complain_overflow_bitfield, /* complain_on_overflow */
297          bfd_elf_generic_reloc, /* special_function */
298          "R_PPC_ADDR14_BRTAKEN",/* name */
299          FALSE,                 /* partial_inplace */
300          0,                     /* src_mask */
301          0xfffc,                /* dst_mask */
302          FALSE),                /* pcrel_offset */
303
304   /* An absolute 16 bit branch, for which bit 10 should be set to
305      indicate that the branch is not expected to be taken.  The lower
306      two bits must be zero.  */
307   HOWTO (R_PPC_ADDR14_BRNTAKEN, /* type */
308          0,                     /* rightshift */
309          2,                     /* size (0 = byte, 1 = short, 2 = long) */
310          16,                    /* bitsize */
311          FALSE,                 /* pc_relative */
312          0,                     /* bitpos */
313          complain_overflow_bitfield, /* complain_on_overflow */
314          bfd_elf_generic_reloc, /* special_function */
315          "R_PPC_ADDR14_BRNTAKEN",/* name */
316          FALSE,                 /* partial_inplace */
317          0,                     /* src_mask */
318          0xfffc,                /* dst_mask */
319          FALSE),                /* pcrel_offset */
320
321   /* A relative 26 bit branch; the lower two bits must be zero.  */
322   HOWTO (R_PPC_REL24,           /* type */
323          0,                     /* rightshift */
324          2,                     /* size (0 = byte, 1 = short, 2 = long) */
325          26,                    /* bitsize */
326          TRUE,                  /* pc_relative */
327          0,                     /* bitpos */
328          complain_overflow_signed, /* complain_on_overflow */
329          bfd_elf_generic_reloc, /* special_function */
330          "R_PPC_REL24",         /* name */
331          FALSE,                 /* partial_inplace */
332          0,                     /* src_mask */
333          0x3fffffc,             /* dst_mask */
334          TRUE),                 /* pcrel_offset */
335
336   /* A relative 16 bit branch; the lower two bits must be zero.  */
337   HOWTO (R_PPC_REL14,           /* type */
338          0,                     /* rightshift */
339          2,                     /* size (0 = byte, 1 = short, 2 = long) */
340          16,                    /* bitsize */
341          TRUE,                  /* pc_relative */
342          0,                     /* bitpos */
343          complain_overflow_signed, /* complain_on_overflow */
344          bfd_elf_generic_reloc, /* special_function */
345          "R_PPC_REL14",         /* name */
346          FALSE,                 /* partial_inplace */
347          0,                     /* src_mask */
348          0xfffc,                /* dst_mask */
349          TRUE),                 /* pcrel_offset */
350
351   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
352      the branch is expected to be taken.  The lower two bits must be
353      zero.  */
354   HOWTO (R_PPC_REL14_BRTAKEN,   /* type */
355          0,                     /* rightshift */
356          2,                     /* size (0 = byte, 1 = short, 2 = long) */
357          16,                    /* bitsize */
358          TRUE,                  /* pc_relative */
359          0,                     /* bitpos */
360          complain_overflow_signed, /* complain_on_overflow */
361          bfd_elf_generic_reloc, /* special_function */
362          "R_PPC_REL14_BRTAKEN", /* name */
363          FALSE,                 /* partial_inplace */
364          0,                     /* src_mask */
365          0xfffc,                /* dst_mask */
366          TRUE),                 /* pcrel_offset */
367
368   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
369      the branch is not expected to be taken.  The lower two bits must
370      be zero.  */
371   HOWTO (R_PPC_REL14_BRNTAKEN,  /* type */
372          0,                     /* rightshift */
373          2,                     /* size (0 = byte, 1 = short, 2 = long) */
374          16,                    /* bitsize */
375          TRUE,                  /* pc_relative */
376          0,                     /* bitpos */
377          complain_overflow_signed, /* complain_on_overflow */
378          bfd_elf_generic_reloc, /* special_function */
379          "R_PPC_REL14_BRNTAKEN",/* name */
380          FALSE,                 /* partial_inplace */
381          0,                     /* src_mask */
382          0xfffc,                /* dst_mask */
383          TRUE),                 /* pcrel_offset */
384
385   /* Like R_PPC_ADDR16, but referring to the GOT table entry for the
386      symbol.  */
387   HOWTO (R_PPC_GOT16,           /* type */
388          0,                     /* rightshift */
389          1,                     /* size (0 = byte, 1 = short, 2 = long) */
390          16,                    /* bitsize */
391          FALSE,                 /* pc_relative */
392          0,                     /* bitpos */
393          complain_overflow_signed, /* complain_on_overflow */
394          bfd_elf_generic_reloc, /* special_function */
395          "R_PPC_GOT16",         /* name */
396          FALSE,                 /* partial_inplace */
397          0,                     /* src_mask */
398          0xffff,                /* dst_mask */
399          FALSE),                /* pcrel_offset */
400
401   /* Like R_PPC_ADDR16_LO, but referring to the GOT table entry for
402      the symbol.  */
403   HOWTO (R_PPC_GOT16_LO,        /* type */
404          0,                     /* rightshift */
405          1,                     /* size (0 = byte, 1 = short, 2 = long) */
406          16,                    /* bitsize */
407          FALSE,                 /* pc_relative */
408          0,                     /* bitpos */
409          complain_overflow_dont, /* complain_on_overflow */
410          bfd_elf_generic_reloc, /* special_function */
411          "R_PPC_GOT16_LO",      /* name */
412          FALSE,                 /* partial_inplace */
413          0,                     /* src_mask */
414          0xffff,                /* dst_mask */
415          FALSE),                /* pcrel_offset */
416
417   /* Like R_PPC_ADDR16_HI, but referring to the GOT table entry for
418      the symbol.  */
419   HOWTO (R_PPC_GOT16_HI,        /* type */
420          16,                    /* rightshift */
421          1,                     /* size (0 = byte, 1 = short, 2 = long) */
422          16,                    /* bitsize */
423          FALSE,                 /* pc_relative */
424          0,                     /* bitpos */
425          complain_overflow_bitfield, /* complain_on_overflow */
426          bfd_elf_generic_reloc, /* special_function */
427          "R_PPC_GOT16_HI",      /* name */
428          FALSE,                 /* partial_inplace */
429          0,                     /* src_mask */
430          0xffff,                /* dst_mask */
431          FALSE),                 /* pcrel_offset */
432
433   /* Like R_PPC_ADDR16_HA, but referring to the GOT table entry for
434      the symbol.  */
435   HOWTO (R_PPC_GOT16_HA,        /* type */
436          16,                    /* rightshift */
437          1,                     /* size (0 = byte, 1 = short, 2 = long) */
438          16,                    /* bitsize */
439          FALSE,                 /* pc_relative */
440          0,                     /* bitpos */
441          complain_overflow_bitfield, /* complain_on_overflow */
442          ppc_elf_addr16_ha_reloc, /* special_function */
443          "R_PPC_GOT16_HA",      /* name */
444          FALSE,                 /* partial_inplace */
445          0,                     /* src_mask */
446          0xffff,                /* dst_mask */
447          FALSE),                /* pcrel_offset */
448
449   /* Like R_PPC_REL24, but referring to the procedure linkage table
450      entry for the symbol.  */
451   HOWTO (R_PPC_PLTREL24,        /* type */
452          0,                     /* rightshift */
453          2,                     /* size (0 = byte, 1 = short, 2 = long) */
454          26,                    /* bitsize */
455          TRUE,                  /* pc_relative */
456          0,                     /* bitpos */
457          complain_overflow_signed,  /* complain_on_overflow */
458          bfd_elf_generic_reloc, /* special_function */
459          "R_PPC_PLTREL24",      /* name */
460          FALSE,                 /* partial_inplace */
461          0,                     /* src_mask */
462          0x3fffffc,             /* dst_mask */
463          TRUE),                 /* pcrel_offset */
464
465   /* This is used only by the dynamic linker.  The symbol should exist
466      both in the object being run and in some shared library.  The
467      dynamic linker copies the data addressed by the symbol from the
468      shared library into the object, because the object being
469      run has to have the data at some particular address.  */
470   HOWTO (R_PPC_COPY,            /* type */
471          0,                     /* rightshift */
472          2,                     /* size (0 = byte, 1 = short, 2 = long) */
473          32,                    /* bitsize */
474          FALSE,                 /* pc_relative */
475          0,                     /* bitpos */
476          complain_overflow_bitfield, /* complain_on_overflow */
477          bfd_elf_generic_reloc,  /* special_function */
478          "R_PPC_COPY",          /* name */
479          FALSE,                 /* partial_inplace */
480          0,                     /* src_mask */
481          0,                     /* dst_mask */
482          FALSE),                /* pcrel_offset */
483
484   /* Like R_PPC_ADDR32, but used when setting global offset table
485      entries.  */
486   HOWTO (R_PPC_GLOB_DAT,        /* type */
487          0,                     /* rightshift */
488          2,                     /* size (0 = byte, 1 = short, 2 = long) */
489          32,                    /* bitsize */
490          FALSE,                 /* pc_relative */
491          0,                     /* bitpos */
492          complain_overflow_bitfield, /* complain_on_overflow */
493          bfd_elf_generic_reloc,  /* special_function */
494          "R_PPC_GLOB_DAT",      /* name */
495          FALSE,                 /* partial_inplace */
496          0,                     /* src_mask */
497          0xffffffff,            /* dst_mask */
498          FALSE),                /* pcrel_offset */
499
500   /* Marks a procedure linkage table entry for a symbol.  */
501   HOWTO (R_PPC_JMP_SLOT,        /* type */
502          0,                     /* rightshift */
503          2,                     /* size (0 = byte, 1 = short, 2 = long) */
504          32,                    /* bitsize */
505          FALSE,                 /* pc_relative */
506          0,                     /* bitpos */
507          complain_overflow_bitfield, /* complain_on_overflow */
508          bfd_elf_generic_reloc,  /* special_function */
509          "R_PPC_JMP_SLOT",      /* name */
510          FALSE,                 /* partial_inplace */
511          0,                     /* src_mask */
512          0,                     /* dst_mask */
513          FALSE),                /* pcrel_offset */
514
515   /* Used only by the dynamic linker.  When the object is run, this
516      longword is set to the load address of the object, plus the
517      addend.  */
518   HOWTO (R_PPC_RELATIVE,        /* type */
519          0,                     /* rightshift */
520          2,                     /* size (0 = byte, 1 = short, 2 = long) */
521          32,                    /* bitsize */
522          FALSE,                 /* pc_relative */
523          0,                     /* bitpos */
524          complain_overflow_bitfield, /* complain_on_overflow */
525          bfd_elf_generic_reloc,  /* special_function */
526          "R_PPC_RELATIVE",      /* name */
527          FALSE,                 /* partial_inplace */
528          0,                     /* src_mask */
529          0xffffffff,            /* dst_mask */
530          FALSE),                /* pcrel_offset */
531
532   /* Like R_PPC_REL24, but uses the value of the symbol within the
533      object rather than the final value.  Normally used for
534      _GLOBAL_OFFSET_TABLE_.  */
535   HOWTO (R_PPC_LOCAL24PC,       /* type */
536          0,                     /* rightshift */
537          2,                     /* size (0 = byte, 1 = short, 2 = long) */
538          26,                    /* bitsize */
539          TRUE,                  /* pc_relative */
540          0,                     /* bitpos */
541          complain_overflow_signed, /* complain_on_overflow */
542          bfd_elf_generic_reloc, /* special_function */
543          "R_PPC_LOCAL24PC",     /* name */
544          FALSE,                 /* partial_inplace */
545          0,                     /* src_mask */
546          0x3fffffc,             /* dst_mask */
547          TRUE),                 /* pcrel_offset */
548
549   /* Like R_PPC_ADDR32, but may be unaligned.  */
550   HOWTO (R_PPC_UADDR32,         /* type */
551          0,                     /* rightshift */
552          2,                     /* size (0 = byte, 1 = short, 2 = long) */
553          32,                    /* bitsize */
554          FALSE,                 /* pc_relative */
555          0,                     /* bitpos */
556          complain_overflow_bitfield, /* complain_on_overflow */
557          bfd_elf_generic_reloc, /* special_function */
558          "R_PPC_UADDR32",       /* name */
559          FALSE,                 /* partial_inplace */
560          0,                     /* src_mask */
561          0xffffffff,            /* dst_mask */
562          FALSE),                /* pcrel_offset */
563
564   /* Like R_PPC_ADDR16, but may be unaligned.  */
565   HOWTO (R_PPC_UADDR16,         /* type */
566          0,                     /* rightshift */
567          1,                     /* size (0 = byte, 1 = short, 2 = long) */
568          16,                    /* bitsize */
569          FALSE,                 /* pc_relative */
570          0,                     /* bitpos */
571          complain_overflow_bitfield, /* complain_on_overflow */
572          bfd_elf_generic_reloc, /* special_function */
573          "R_PPC_UADDR16",       /* name */
574          FALSE,                 /* partial_inplace */
575          0,                     /* src_mask */
576          0xffff,                /* dst_mask */
577          FALSE),                /* pcrel_offset */
578
579   /* 32-bit PC relative */
580   HOWTO (R_PPC_REL32,           /* type */
581          0,                     /* rightshift */
582          2,                     /* size (0 = byte, 1 = short, 2 = long) */
583          32,                    /* bitsize */
584          TRUE,                  /* pc_relative */
585          0,                     /* bitpos */
586          complain_overflow_bitfield, /* complain_on_overflow */
587          bfd_elf_generic_reloc, /* special_function */
588          "R_PPC_REL32",         /* name */
589          FALSE,                 /* partial_inplace */
590          0,                     /* src_mask */
591          0xffffffff,            /* dst_mask */
592          TRUE),                 /* pcrel_offset */
593
594   /* 32-bit relocation to the symbol's procedure linkage table.
595      FIXME: not supported.  */
596   HOWTO (R_PPC_PLT32,           /* type */
597          0,                     /* rightshift */
598          2,                     /* size (0 = byte, 1 = short, 2 = long) */
599          32,                    /* bitsize */
600          FALSE,                 /* pc_relative */
601          0,                     /* bitpos */
602          complain_overflow_bitfield, /* complain_on_overflow */
603          bfd_elf_generic_reloc, /* special_function */
604          "R_PPC_PLT32",         /* name */
605          FALSE,                 /* partial_inplace */
606          0,                     /* src_mask */
607          0,                     /* dst_mask */
608          FALSE),                /* pcrel_offset */
609
610   /* 32-bit PC relative relocation to the symbol's procedure linkage table.
611      FIXME: not supported.  */
612   HOWTO (R_PPC_PLTREL32,        /* type */
613          0,                     /* rightshift */
614          2,                     /* size (0 = byte, 1 = short, 2 = long) */
615          32,                    /* bitsize */
616          TRUE,                  /* pc_relative */
617          0,                     /* bitpos */
618          complain_overflow_bitfield, /* complain_on_overflow */
619          bfd_elf_generic_reloc, /* special_function */
620          "R_PPC_PLTREL32",      /* name */
621          FALSE,                 /* partial_inplace */
622          0,                     /* src_mask */
623          0,                     /* dst_mask */
624          TRUE),                 /* pcrel_offset */
625
626   /* Like R_PPC_ADDR16_LO, but referring to the PLT table entry for
627      the symbol.  */
628   HOWTO (R_PPC_PLT16_LO,        /* type */
629          0,                     /* rightshift */
630          1,                     /* size (0 = byte, 1 = short, 2 = long) */
631          16,                    /* bitsize */
632          FALSE,                 /* pc_relative */
633          0,                     /* bitpos */
634          complain_overflow_dont, /* complain_on_overflow */
635          bfd_elf_generic_reloc, /* special_function */
636          "R_PPC_PLT16_LO",      /* name */
637          FALSE,                 /* partial_inplace */
638          0,                     /* src_mask */
639          0xffff,                /* dst_mask */
640          FALSE),                /* pcrel_offset */
641
642   /* Like R_PPC_ADDR16_HI, but referring to the PLT table entry for
643      the symbol.  */
644   HOWTO (R_PPC_PLT16_HI,        /* type */
645          16,                    /* rightshift */
646          1,                     /* size (0 = byte, 1 = short, 2 = long) */
647          16,                    /* bitsize */
648          FALSE,                 /* pc_relative */
649          0,                     /* bitpos */
650          complain_overflow_bitfield, /* complain_on_overflow */
651          bfd_elf_generic_reloc, /* special_function */
652          "R_PPC_PLT16_HI",      /* name */
653          FALSE,                 /* partial_inplace */
654          0,                     /* src_mask */
655          0xffff,                /* dst_mask */
656          FALSE),                 /* pcrel_offset */
657
658   /* Like R_PPC_ADDR16_HA, but referring to the PLT table entry for
659      the symbol.  */
660   HOWTO (R_PPC_PLT16_HA,        /* type */
661          16,                    /* rightshift */
662          1,                     /* size (0 = byte, 1 = short, 2 = long) */
663          16,                    /* bitsize */
664          FALSE,                 /* pc_relative */
665          0,                     /* bitpos */
666          complain_overflow_bitfield, /* complain_on_overflow */
667          ppc_elf_addr16_ha_reloc, /* special_function */
668          "R_PPC_PLT16_HA",      /* name */
669          FALSE,                 /* partial_inplace */
670          0,                     /* src_mask */
671          0xffff,                /* dst_mask */
672          FALSE),                /* pcrel_offset */
673
674   /* A sign-extended 16 bit value relative to _SDA_BASE_, for use with
675      small data items.  */
676   HOWTO (R_PPC_SDAREL16,        /* type */
677          0,                     /* rightshift */
678          1,                     /* size (0 = byte, 1 = short, 2 = long) */
679          16,                    /* bitsize */
680          FALSE,                 /* pc_relative */
681          0,                     /* bitpos */
682          complain_overflow_signed, /* complain_on_overflow */
683          bfd_elf_generic_reloc, /* special_function */
684          "R_PPC_SDAREL16",      /* name */
685          FALSE,                 /* partial_inplace */
686          0,                     /* src_mask */
687          0xffff,                /* dst_mask */
688          FALSE),                /* pcrel_offset */
689
690   /* 16-bit section relative relocation.  */
691   HOWTO (R_PPC_SECTOFF,         /* type */
692          0,                     /* rightshift */
693          1,                     /* size (0 = byte, 1 = short, 2 = long) */
694          16,                    /* bitsize */
695          FALSE,                 /* pc_relative */
696          0,                     /* bitpos */
697          complain_overflow_bitfield, /* complain_on_overflow */
698          bfd_elf_generic_reloc, /* special_function */
699          "R_PPC_SECTOFF",       /* name */
700          FALSE,                 /* partial_inplace */
701          0,                     /* src_mask */
702          0xffff,                /* dst_mask */
703          FALSE),                /* pcrel_offset */
704
705   /* 16-bit lower half section relative relocation.  */
706   HOWTO (R_PPC_SECTOFF_LO,        /* type */
707          0,                     /* rightshift */
708          1,                     /* size (0 = byte, 1 = short, 2 = long) */
709          16,                    /* bitsize */
710          FALSE,                 /* pc_relative */
711          0,                     /* bitpos */
712          complain_overflow_dont, /* complain_on_overflow */
713          bfd_elf_generic_reloc, /* special_function */
714          "R_PPC_SECTOFF_LO",    /* name */
715          FALSE,                 /* partial_inplace */
716          0,                     /* src_mask */
717          0xffff,                /* dst_mask */
718          FALSE),                /* pcrel_offset */
719
720   /* 16-bit upper half section relative relocation.  */
721   HOWTO (R_PPC_SECTOFF_HI,      /* type */
722          16,                    /* rightshift */
723          1,                     /* size (0 = byte, 1 = short, 2 = long) */
724          16,                    /* bitsize */
725          FALSE,                 /* pc_relative */
726          0,                     /* bitpos */
727          complain_overflow_bitfield, /* complain_on_overflow */
728          bfd_elf_generic_reloc, /* special_function */
729          "R_PPC_SECTOFF_HI",    /* name */
730          FALSE,                 /* partial_inplace */
731          0,                     /* src_mask */
732          0xffff,                /* dst_mask */
733          FALSE),                 /* pcrel_offset */
734
735   /* 16-bit upper half adjusted section relative relocation.  */
736   HOWTO (R_PPC_SECTOFF_HA,      /* type */
737          16,                    /* rightshift */
738          1,                     /* size (0 = byte, 1 = short, 2 = long) */
739          16,                    /* bitsize */
740          FALSE,                 /* pc_relative */
741          0,                     /* bitpos */
742          complain_overflow_bitfield, /* complain_on_overflow */
743          ppc_elf_addr16_ha_reloc, /* special_function */
744          "R_PPC_SECTOFF_HA",    /* name */
745          FALSE,                 /* partial_inplace */
746          0,                     /* src_mask */
747          0xffff,                /* dst_mask */
748          FALSE),                /* pcrel_offset */
749
750   /* Marker reloc for TLS.  */
751   HOWTO (R_PPC_TLS,
752          0,                     /* rightshift */
753          2,                     /* size (0 = byte, 1 = short, 2 = long) */
754          32,                    /* bitsize */
755          FALSE,                 /* pc_relative */
756          0,                     /* bitpos */
757          complain_overflow_dont, /* complain_on_overflow */
758          bfd_elf_generic_reloc, /* special_function */
759          "R_PPC_TLS",           /* name */
760          FALSE,                 /* partial_inplace */
761          0,                     /* src_mask */
762          0,                     /* dst_mask */
763          FALSE),                /* pcrel_offset */
764
765   /* Computes the load module index of the load module that contains the
766      definition of its TLS sym.  */
767   HOWTO (R_PPC_DTPMOD32,
768          0,                     /* rightshift */
769          2,                     /* size (0 = byte, 1 = short, 2 = long) */
770          32,                    /* bitsize */
771          FALSE,                 /* pc_relative */
772          0,                     /* bitpos */
773          complain_overflow_dont, /* complain_on_overflow */
774          ppc_elf_unhandled_reloc, /* special_function */
775          "R_PPC_DTPMOD32",      /* name */
776          FALSE,                 /* partial_inplace */
777          0,                     /* src_mask */
778          0xffffffff,            /* dst_mask */
779          FALSE),                /* pcrel_offset */
780
781   /* Computes a dtv-relative displacement, the difference between the value
782      of sym+add and the base address of the thread-local storage block that
783      contains the definition of sym, minus 0x8000.  */
784   HOWTO (R_PPC_DTPREL32,
785          0,                     /* rightshift */
786          2,                     /* size (0 = byte, 1 = short, 2 = long) */
787          32,                    /* bitsize */
788          FALSE,                 /* pc_relative */
789          0,                     /* bitpos */
790          complain_overflow_dont, /* complain_on_overflow */
791          ppc_elf_unhandled_reloc, /* special_function */
792          "R_PPC_DTPREL32",      /* name */
793          FALSE,                 /* partial_inplace */
794          0,                     /* src_mask */
795          0xffffffff,            /* dst_mask */
796          FALSE),                /* pcrel_offset */
797
798   /* A 16 bit dtprel reloc.  */
799   HOWTO (R_PPC_DTPREL16,
800          0,                     /* rightshift */
801          1,                     /* size (0 = byte, 1 = short, 2 = long) */
802          16,                    /* bitsize */
803          FALSE,                 /* pc_relative */
804          0,                     /* bitpos */
805          complain_overflow_signed, /* complain_on_overflow */
806          ppc_elf_unhandled_reloc, /* special_function */
807          "R_PPC_DTPREL16",      /* name */
808          FALSE,                 /* partial_inplace */
809          0,                     /* src_mask */
810          0xffff,                /* dst_mask */
811          FALSE),                /* pcrel_offset */
812
813   /* Like DTPREL16, but no overflow.  */
814   HOWTO (R_PPC_DTPREL16_LO,
815          0,                     /* rightshift */
816          1,                     /* size (0 = byte, 1 = short, 2 = long) */
817          16,                    /* bitsize */
818          FALSE,                 /* pc_relative */
819          0,                     /* bitpos */
820          complain_overflow_dont, /* complain_on_overflow */
821          ppc_elf_unhandled_reloc, /* special_function */
822          "R_PPC_DTPREL16_LO",   /* name */
823          FALSE,                 /* partial_inplace */
824          0,                     /* src_mask */
825          0xffff,                /* dst_mask */
826          FALSE),                /* pcrel_offset */
827
828   /* Like DTPREL16_LO, but next higher group of 16 bits.  */
829   HOWTO (R_PPC_DTPREL16_HI,
830          16,                    /* rightshift */
831          1,                     /* size (0 = byte, 1 = short, 2 = long) */
832          16,                    /* bitsize */
833          FALSE,                 /* pc_relative */
834          0,                     /* bitpos */
835          complain_overflow_dont, /* complain_on_overflow */
836          ppc_elf_unhandled_reloc, /* special_function */
837          "R_PPC_DTPREL16_HI",   /* name */
838          FALSE,                 /* partial_inplace */
839          0,                     /* src_mask */
840          0xffff,                /* dst_mask */
841          FALSE),                /* pcrel_offset */
842
843   /* Like DTPREL16_HI, but adjust for low 16 bits.  */
844   HOWTO (R_PPC_DTPREL16_HA,
845          16,                    /* rightshift */
846          1,                     /* size (0 = byte, 1 = short, 2 = long) */
847          16,                    /* bitsize */
848          FALSE,                 /* pc_relative */
849          0,                     /* bitpos */
850          complain_overflow_dont, /* complain_on_overflow */
851          ppc_elf_unhandled_reloc, /* special_function */
852          "R_PPC_DTPREL16_HA",   /* name */
853          FALSE,                 /* partial_inplace */
854          0,                     /* src_mask */
855          0xffff,                /* dst_mask */
856          FALSE),                /* pcrel_offset */
857
858   /* Computes a tp-relative displacement, the difference between the value of
859      sym+add and the value of the thread pointer (r13).  */
860   HOWTO (R_PPC_TPREL32,
861          0,                     /* rightshift */
862          2,                     /* size (0 = byte, 1 = short, 2 = long) */
863          32,                    /* bitsize */
864          FALSE,                 /* pc_relative */
865          0,                     /* bitpos */
866          complain_overflow_dont, /* complain_on_overflow */
867          ppc_elf_unhandled_reloc, /* special_function */
868          "R_PPC_TPREL32",       /* name */
869          FALSE,                 /* partial_inplace */
870          0,                     /* src_mask */
871          0xffffffff,            /* dst_mask */
872          FALSE),                /* pcrel_offset */
873
874   /* A 16 bit tprel reloc.  */
875   HOWTO (R_PPC_TPREL16,
876          0,                     /* rightshift */
877          1,                     /* size (0 = byte, 1 = short, 2 = long) */
878          16,                    /* bitsize */
879          FALSE,                 /* pc_relative */
880          0,                     /* bitpos */
881          complain_overflow_signed, /* complain_on_overflow */
882          ppc_elf_unhandled_reloc, /* special_function */
883          "R_PPC_TPREL16",       /* name */
884          FALSE,                 /* partial_inplace */
885          0,                     /* src_mask */
886          0xffff,                /* dst_mask */
887          FALSE),                /* pcrel_offset */
888
889   /* Like TPREL16, but no overflow.  */
890   HOWTO (R_PPC_TPREL16_LO,
891          0,                     /* rightshift */
892          1,                     /* size (0 = byte, 1 = short, 2 = long) */
893          16,                    /* bitsize */
894          FALSE,                 /* pc_relative */
895          0,                     /* bitpos */
896          complain_overflow_dont, /* complain_on_overflow */
897          ppc_elf_unhandled_reloc, /* special_function */
898          "R_PPC_TPREL16_LO",    /* name */
899          FALSE,                 /* partial_inplace */
900          0,                     /* src_mask */
901          0xffff,                /* dst_mask */
902          FALSE),                /* pcrel_offset */
903
904   /* Like TPREL16_LO, but next higher group of 16 bits.  */
905   HOWTO (R_PPC_TPREL16_HI,
906          16,                    /* rightshift */
907          1,                     /* size (0 = byte, 1 = short, 2 = long) */
908          16,                    /* bitsize */
909          FALSE,                 /* pc_relative */
910          0,                     /* bitpos */
911          complain_overflow_dont, /* complain_on_overflow */
912          ppc_elf_unhandled_reloc, /* special_function */
913          "R_PPC_TPREL16_HI",    /* name */
914          FALSE,                 /* partial_inplace */
915          0,                     /* src_mask */
916          0xffff,                /* dst_mask */
917          FALSE),                /* pcrel_offset */
918
919   /* Like TPREL16_HI, but adjust for low 16 bits.  */
920   HOWTO (R_PPC_TPREL16_HA,
921          16,                    /* rightshift */
922          1,                     /* size (0 = byte, 1 = short, 2 = long) */
923          16,                    /* bitsize */
924          FALSE,                 /* pc_relative */
925          0,                     /* bitpos */
926          complain_overflow_dont, /* complain_on_overflow */
927          ppc_elf_unhandled_reloc, /* special_function */
928          "R_PPC_TPREL16_HA",    /* name */
929          FALSE,                 /* partial_inplace */
930          0,                     /* src_mask */
931          0xffff,                /* dst_mask */
932          FALSE),                /* pcrel_offset */
933
934   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
935      with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
936      to the first entry.  */
937   HOWTO (R_PPC_GOT_TLSGD16,
938          0,                     /* rightshift */
939          1,                     /* size (0 = byte, 1 = short, 2 = long) */
940          16,                    /* bitsize */
941          FALSE,                 /* pc_relative */
942          0,                     /* bitpos */
943          complain_overflow_signed, /* complain_on_overflow */
944          ppc_elf_unhandled_reloc, /* special_function */
945          "R_PPC_GOT_TLSGD16",   /* name */
946          FALSE,                 /* partial_inplace */
947          0,                     /* src_mask */
948          0xffff,                /* dst_mask */
949          FALSE),                /* pcrel_offset */
950
951   /* Like GOT_TLSGD16, but no overflow.  */
952   HOWTO (R_PPC_GOT_TLSGD16_LO,
953          0,                     /* rightshift */
954          1,                     /* size (0 = byte, 1 = short, 2 = long) */
955          16,                    /* bitsize */
956          FALSE,                 /* pc_relative */
957          0,                     /* bitpos */
958          complain_overflow_dont, /* complain_on_overflow */
959          ppc_elf_unhandled_reloc, /* special_function */
960          "R_PPC_GOT_TLSGD16_LO", /* name */
961          FALSE,                 /* partial_inplace */
962          0,                     /* src_mask */
963          0xffff,                /* dst_mask */
964          FALSE),                /* pcrel_offset */
965
966   /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
967   HOWTO (R_PPC_GOT_TLSGD16_HI,
968          16,                    /* rightshift */
969          1,                     /* size (0 = byte, 1 = short, 2 = long) */
970          16,                    /* bitsize */
971          FALSE,                 /* pc_relative */
972          0,                     /* bitpos */
973          complain_overflow_dont, /* complain_on_overflow */
974          ppc_elf_unhandled_reloc, /* special_function */
975          "R_PPC_GOT_TLSGD16_HI", /* name */
976          FALSE,                 /* partial_inplace */
977          0,                     /* src_mask */
978          0xffff,                /* dst_mask */
979          FALSE),                /* pcrel_offset */
980
981   /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
982   HOWTO (R_PPC_GOT_TLSGD16_HA,
983          16,                    /* rightshift */
984          1,                     /* size (0 = byte, 1 = short, 2 = long) */
985          16,                    /* bitsize */
986          FALSE,                 /* pc_relative */
987          0,                     /* bitpos */
988          complain_overflow_dont, /* complain_on_overflow */
989          ppc_elf_unhandled_reloc, /* special_function */
990          "R_PPC_GOT_TLSGD16_HA", /* name */
991          FALSE,                 /* partial_inplace */
992          0,                     /* src_mask */
993          0xffff,                /* dst_mask */
994          FALSE),                /* pcrel_offset */
995
996   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
997      with values (sym+add)@dtpmod and zero, and computes the offset to the
998      first entry.  */
999   HOWTO (R_PPC_GOT_TLSLD16,
1000          0,                     /* rightshift */
1001          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1002          16,                    /* bitsize */
1003          FALSE,                 /* pc_relative */
1004          0,                     /* bitpos */
1005          complain_overflow_signed, /* complain_on_overflow */
1006          ppc_elf_unhandled_reloc, /* special_function */
1007          "R_PPC_GOT_TLSLD16",   /* name */
1008          FALSE,                 /* partial_inplace */
1009          0,                     /* src_mask */
1010          0xffff,                /* dst_mask */
1011          FALSE),                /* pcrel_offset */
1012
1013   /* Like GOT_TLSLD16, but no overflow.  */
1014   HOWTO (R_PPC_GOT_TLSLD16_LO,
1015          0,                     /* rightshift */
1016          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1017          16,                    /* bitsize */
1018          FALSE,                 /* pc_relative */
1019          0,                     /* bitpos */
1020          complain_overflow_dont, /* complain_on_overflow */
1021          ppc_elf_unhandled_reloc, /* special_function */
1022          "R_PPC_GOT_TLSLD16_LO", /* name */
1023          FALSE,                 /* partial_inplace */
1024          0,                     /* src_mask */
1025          0xffff,                /* dst_mask */
1026          FALSE),                /* pcrel_offset */
1027
1028   /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
1029   HOWTO (R_PPC_GOT_TLSLD16_HI,
1030          16,                    /* rightshift */
1031          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1032          16,                    /* bitsize */
1033          FALSE,                 /* pc_relative */
1034          0,                     /* bitpos */
1035          complain_overflow_dont, /* complain_on_overflow */
1036          ppc_elf_unhandled_reloc, /* special_function */
1037          "R_PPC_GOT_TLSLD16_HI", /* name */
1038          FALSE,                 /* partial_inplace */
1039          0,                     /* src_mask */
1040          0xffff,                /* dst_mask */
1041          FALSE),                /* pcrel_offset */
1042
1043   /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
1044   HOWTO (R_PPC_GOT_TLSLD16_HA,
1045          16,                    /* rightshift */
1046          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1047          16,                    /* bitsize */
1048          FALSE,                 /* pc_relative */
1049          0,                     /* bitpos */
1050          complain_overflow_dont, /* complain_on_overflow */
1051          ppc_elf_unhandled_reloc, /* special_function */
1052          "R_PPC_GOT_TLSLD16_HA", /* name */
1053          FALSE,                 /* partial_inplace */
1054          0,                     /* src_mask */
1055          0xffff,                /* dst_mask */
1056          FALSE),                /* pcrel_offset */
1057
1058   /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1059      the offset to the entry.  */
1060   HOWTO (R_PPC_GOT_DTPREL16,
1061          0,                     /* rightshift */
1062          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1063          16,                    /* bitsize */
1064          FALSE,                 /* pc_relative */
1065          0,                     /* bitpos */
1066          complain_overflow_signed, /* complain_on_overflow */
1067          ppc_elf_unhandled_reloc, /* special_function */
1068          "R_PPC_GOT_DTPREL16",  /* name */
1069          FALSE,                 /* partial_inplace */
1070          0,                     /* src_mask */
1071          0xffff,                /* dst_mask */
1072          FALSE),                /* pcrel_offset */
1073
1074   /* Like GOT_DTPREL16, but no overflow.  */
1075   HOWTO (R_PPC_GOT_DTPREL16_LO,
1076          0,                     /* rightshift */
1077          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1078          16,                    /* bitsize */
1079          FALSE,                 /* pc_relative */
1080          0,                     /* bitpos */
1081          complain_overflow_dont, /* complain_on_overflow */
1082          ppc_elf_unhandled_reloc, /* special_function */
1083          "R_PPC_GOT_DTPREL16_LO", /* name */
1084          FALSE,                 /* partial_inplace */
1085          0,                     /* src_mask */
1086          0xffff,                /* dst_mask */
1087          FALSE),                /* pcrel_offset */
1088
1089   /* Like GOT_DTPREL16_LO, but next higher group of 16 bits.  */
1090   HOWTO (R_PPC_GOT_DTPREL16_HI,
1091          16,                    /* rightshift */
1092          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1093          16,                    /* bitsize */
1094          FALSE,                 /* pc_relative */
1095          0,                     /* bitpos */
1096          complain_overflow_dont, /* complain_on_overflow */
1097          ppc_elf_unhandled_reloc, /* special_function */
1098          "R_PPC_GOT_DTPREL16_HI", /* name */
1099          FALSE,                 /* partial_inplace */
1100          0,                     /* src_mask */
1101          0xffff,                /* dst_mask */
1102          FALSE),                /* pcrel_offset */
1103
1104   /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
1105   HOWTO (R_PPC_GOT_DTPREL16_HA,
1106          16,                    /* rightshift */
1107          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1108          16,                    /* bitsize */
1109          FALSE,                 /* pc_relative */
1110          0,                     /* bitpos */
1111          complain_overflow_dont, /* complain_on_overflow */
1112          ppc_elf_unhandled_reloc, /* special_function */
1113          "R_PPC_GOT_DTPREL16_HA", /* name */
1114          FALSE,                 /* partial_inplace */
1115          0,                     /* src_mask */
1116          0xffff,                /* dst_mask */
1117          FALSE),                /* pcrel_offset */
1118
1119   /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1120      offset to the entry.  */
1121   HOWTO (R_PPC_GOT_TPREL16,
1122          0,                     /* rightshift */
1123          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1124          16,                    /* bitsize */
1125          FALSE,                 /* pc_relative */
1126          0,                     /* bitpos */
1127          complain_overflow_signed, /* complain_on_overflow */
1128          ppc_elf_unhandled_reloc, /* special_function */
1129          "R_PPC_GOT_TPREL16",   /* name */
1130          FALSE,                 /* partial_inplace */
1131          0,                     /* src_mask */
1132          0xffff,                /* dst_mask */
1133          FALSE),                /* pcrel_offset */
1134
1135   /* Like GOT_TPREL16, but no overflow.  */
1136   HOWTO (R_PPC_GOT_TPREL16_LO,
1137          0,                     /* rightshift */
1138          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1139          16,                    /* bitsize */
1140          FALSE,                 /* pc_relative */
1141          0,                     /* bitpos */
1142          complain_overflow_dont, /* complain_on_overflow */
1143          ppc_elf_unhandled_reloc, /* special_function */
1144          "R_PPC_GOT_TPREL16_LO", /* name */
1145          FALSE,                 /* partial_inplace */
1146          0,                     /* src_mask */
1147          0xffff,                /* dst_mask */
1148          FALSE),                /* pcrel_offset */
1149
1150   /* Like GOT_TPREL16_LO, but next higher group of 16 bits.  */
1151   HOWTO (R_PPC_GOT_TPREL16_HI,
1152          16,                    /* rightshift */
1153          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1154          16,                    /* bitsize */
1155          FALSE,                 /* pc_relative */
1156          0,                     /* bitpos */
1157          complain_overflow_dont, /* complain_on_overflow */
1158          ppc_elf_unhandled_reloc, /* special_function */
1159          "R_PPC_GOT_TPREL16_HI", /* name */
1160          FALSE,                 /* partial_inplace */
1161          0,                     /* src_mask */
1162          0xffff,                /* dst_mask */
1163          FALSE),                /* pcrel_offset */
1164
1165   /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
1166   HOWTO (R_PPC_GOT_TPREL16_HA,
1167          16,                    /* rightshift */
1168          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1169          16,                    /* bitsize */
1170          FALSE,                 /* pc_relative */
1171          0,                     /* bitpos */
1172          complain_overflow_dont, /* complain_on_overflow */
1173          ppc_elf_unhandled_reloc, /* special_function */
1174          "R_PPC_GOT_TPREL16_HA", /* name */
1175          FALSE,                 /* partial_inplace */
1176          0,                     /* src_mask */
1177          0xffff,                /* dst_mask */
1178          FALSE),                /* pcrel_offset */
1179
1180   /* The remaining relocs are from the Embedded ELF ABI, and are not
1181      in the SVR4 ELF ABI.  */
1182
1183   /* 32 bit value resulting from the addend minus the symbol.  */
1184   HOWTO (R_PPC_EMB_NADDR32,     /* type */
1185          0,                     /* rightshift */
1186          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1187          32,                    /* bitsize */
1188          FALSE,                 /* pc_relative */
1189          0,                     /* bitpos */
1190          complain_overflow_bitfield, /* complain_on_overflow */
1191          bfd_elf_generic_reloc, /* special_function */
1192          "R_PPC_EMB_NADDR32",   /* name */
1193          FALSE,                 /* partial_inplace */
1194          0,                     /* src_mask */
1195          0xffffffff,            /* dst_mask */
1196          FALSE),                /* pcrel_offset */
1197
1198   /* 16 bit value resulting from the addend minus the symbol.  */
1199   HOWTO (R_PPC_EMB_NADDR16,     /* type */
1200          0,                     /* rightshift */
1201          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1202          16,                    /* bitsize */
1203          FALSE,                 /* pc_relative */
1204          0,                     /* bitpos */
1205          complain_overflow_bitfield, /* complain_on_overflow */
1206          bfd_elf_generic_reloc, /* special_function */
1207          "R_PPC_EMB_NADDR16",   /* name */
1208          FALSE,                 /* partial_inplace */
1209          0,                     /* src_mask */
1210          0xffff,                /* dst_mask */
1211          FALSE),                /* pcrel_offset */
1212
1213   /* 16 bit value resulting from the addend minus the symbol.  */
1214   HOWTO (R_PPC_EMB_NADDR16_LO,  /* type */
1215          0,                     /* rightshift */
1216          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1217          16,                    /* bitsize */
1218          FALSE,                 /* pc_relative */
1219          0,                     /* bitpos */
1220          complain_overflow_dont,/* complain_on_overflow */
1221          bfd_elf_generic_reloc, /* special_function */
1222          "R_PPC_EMB_ADDR16_LO", /* name */
1223          FALSE,                 /* partial_inplace */
1224          0,                     /* src_mask */
1225          0xffff,                /* dst_mask */
1226          FALSE),                /* pcrel_offset */
1227
1228   /* The high order 16 bits of the addend minus the symbol.  */
1229   HOWTO (R_PPC_EMB_NADDR16_HI,  /* type */
1230          16,                    /* rightshift */
1231          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1232          16,                    /* bitsize */
1233          FALSE,                 /* pc_relative */
1234          0,                     /* bitpos */
1235          complain_overflow_dont, /* complain_on_overflow */
1236          bfd_elf_generic_reloc, /* special_function */
1237          "R_PPC_EMB_NADDR16_HI", /* name */
1238          FALSE,                 /* partial_inplace */
1239          0,                     /* src_mask */
1240          0xffff,                /* dst_mask */
1241          FALSE),                /* pcrel_offset */
1242
1243   /* The high order 16 bits of the result of the addend minus the address,
1244      plus 1 if the contents of the low 16 bits, treated as a signed number,
1245      is negative.  */
1246   HOWTO (R_PPC_EMB_NADDR16_HA,  /* type */
1247          16,                    /* rightshift */
1248          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1249          16,                    /* bitsize */
1250          FALSE,                 /* pc_relative */
1251          0,                     /* bitpos */
1252          complain_overflow_dont, /* complain_on_overflow */
1253          ppc_elf_addr16_ha_reloc, /* special_function */
1254          "R_PPC_EMB_NADDR16_HA", /* name */
1255          FALSE,                 /* partial_inplace */
1256          0,                     /* src_mask */
1257          0xffff,                /* dst_mask */
1258          FALSE),                /* pcrel_offset */
1259
1260   /* 16 bit value resulting from allocating a 4 byte word to hold an
1261      address in the .sdata section, and returning the offset from
1262      _SDA_BASE_ for that relocation.  */
1263   HOWTO (R_PPC_EMB_SDAI16,      /* type */
1264          0,                     /* rightshift */
1265          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1266          16,                    /* bitsize */
1267          FALSE,                 /* pc_relative */
1268          0,                     /* bitpos */
1269          complain_overflow_bitfield, /* complain_on_overflow */
1270          bfd_elf_generic_reloc, /* special_function */
1271          "R_PPC_EMB_SDAI16",    /* name */
1272          FALSE,                 /* partial_inplace */
1273          0,                     /* src_mask */
1274          0xffff,                /* dst_mask */
1275          FALSE),                /* pcrel_offset */
1276
1277   /* 16 bit value resulting from allocating a 4 byte word to hold an
1278      address in the .sdata2 section, and returning the offset from
1279      _SDA2_BASE_ for that relocation.  */
1280   HOWTO (R_PPC_EMB_SDA2I16,     /* type */
1281          0,                     /* rightshift */
1282          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1283          16,                    /* bitsize */
1284          FALSE,                 /* pc_relative */
1285          0,                     /* bitpos */
1286          complain_overflow_bitfield, /* complain_on_overflow */
1287          bfd_elf_generic_reloc, /* special_function */
1288          "R_PPC_EMB_SDA2I16",   /* name */
1289          FALSE,                 /* partial_inplace */
1290          0,                     /* src_mask */
1291          0xffff,                /* dst_mask */
1292          FALSE),                /* pcrel_offset */
1293
1294   /* A sign-extended 16 bit value relative to _SDA2_BASE_, for use with
1295      small data items.   */
1296   HOWTO (R_PPC_EMB_SDA2REL,     /* type */
1297          0,                     /* rightshift */
1298          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1299          16,                    /* bitsize */
1300          FALSE,                 /* pc_relative */
1301          0,                     /* bitpos */
1302          complain_overflow_signed, /* complain_on_overflow */
1303          bfd_elf_generic_reloc, /* special_function */
1304          "R_PPC_EMB_SDA2REL",   /* name */
1305          FALSE,                 /* partial_inplace */
1306          0,                     /* src_mask */
1307          0xffff,                /* dst_mask */
1308          FALSE),                /* pcrel_offset */
1309
1310   /* Relocate against either _SDA_BASE_ or _SDA2_BASE_, filling in the 16 bit
1311      signed offset from the appropriate base, and filling in the register
1312      field with the appropriate register (0, 2, or 13).  */
1313   HOWTO (R_PPC_EMB_SDA21,       /* type */
1314          0,                     /* rightshift */
1315          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1316          16,                    /* bitsize */
1317          FALSE,                 /* pc_relative */
1318          0,                     /* bitpos */
1319          complain_overflow_signed, /* complain_on_overflow */
1320          bfd_elf_generic_reloc, /* special_function */
1321          "R_PPC_EMB_SDA21",     /* name */
1322          FALSE,                 /* partial_inplace */
1323          0,                     /* src_mask */
1324          0xffff,                /* dst_mask */
1325          FALSE),                /* pcrel_offset */
1326
1327   /* Relocation not handled: R_PPC_EMB_MRKREF */
1328   /* Relocation not handled: R_PPC_EMB_RELSEC16 */
1329   /* Relocation not handled: R_PPC_EMB_RELST_LO */
1330   /* Relocation not handled: R_PPC_EMB_RELST_HI */
1331   /* Relocation not handled: R_PPC_EMB_RELST_HA */
1332   /* Relocation not handled: R_PPC_EMB_BIT_FLD */
1333
1334   /* PC relative relocation against either _SDA_BASE_ or _SDA2_BASE_, filling
1335      in the 16 bit signed offset from the appropriate base, and filling in the
1336      register field with the appropriate register (0, 2, or 13).  */
1337   HOWTO (R_PPC_EMB_RELSDA,      /* type */
1338          0,                     /* rightshift */
1339          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1340          16,                    /* bitsize */
1341          TRUE,                  /* pc_relative */
1342          0,                     /* bitpos */
1343          complain_overflow_signed, /* complain_on_overflow */
1344          bfd_elf_generic_reloc, /* special_function */
1345          "R_PPC_EMB_RELSDA",    /* name */
1346          FALSE,                 /* partial_inplace */
1347          0,                     /* src_mask */
1348          0xffff,                /* dst_mask */
1349          FALSE),                /* pcrel_offset */
1350
1351   /* A 16 bit relative relocation.  */
1352   HOWTO (R_PPC_REL16,           /* type */
1353          0,                     /* rightshift */
1354          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1355          16,                    /* bitsize */
1356          TRUE,                  /* pc_relative */
1357          0,                     /* bitpos */
1358          complain_overflow_bitfield, /* complain_on_overflow */
1359          bfd_elf_generic_reloc, /* special_function */
1360          "R_PPC_REL16",         /* name */
1361          FALSE,                 /* partial_inplace */
1362          0,                     /* src_mask */
1363          0xffff,                /* dst_mask */
1364          TRUE),                 /* pcrel_offset */
1365
1366   /* A 16 bit relative relocation without overflow.  */
1367   HOWTO (R_PPC_REL16_LO,        /* type */
1368          0,                     /* rightshift */
1369          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1370          16,                    /* bitsize */
1371          TRUE,                  /* pc_relative */
1372          0,                     /* bitpos */
1373          complain_overflow_dont,/* complain_on_overflow */
1374          bfd_elf_generic_reloc, /* special_function */
1375          "R_PPC_REL16_LO",      /* name */
1376          FALSE,                 /* partial_inplace */
1377          0,                     /* src_mask */
1378          0xffff,                /* dst_mask */
1379          TRUE),                 /* pcrel_offset */
1380
1381   /* The high order 16 bits of a relative address.  */
1382   HOWTO (R_PPC_REL16_HI,        /* type */
1383          16,                    /* rightshift */
1384          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1385          16,                    /* bitsize */
1386          TRUE,                  /* pc_relative */
1387          0,                     /* bitpos */
1388          complain_overflow_dont, /* complain_on_overflow */
1389          bfd_elf_generic_reloc, /* special_function */
1390          "R_PPC_REL16_HI",      /* name */
1391          FALSE,                 /* partial_inplace */
1392          0,                     /* src_mask */
1393          0xffff,                /* dst_mask */
1394          TRUE),                 /* pcrel_offset */
1395
1396   /* The high order 16 bits of a relative address, plus 1 if the contents of
1397      the low 16 bits, treated as a signed number, is negative.  */
1398   HOWTO (R_PPC_REL16_HA,        /* type */
1399          16,                    /* rightshift */
1400          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1401          16,                    /* bitsize */
1402          TRUE,                  /* pc_relative */
1403          0,                     /* bitpos */
1404          complain_overflow_dont, /* complain_on_overflow */
1405          ppc_elf_addr16_ha_reloc, /* special_function */
1406          "R_PPC_REL16_HA",      /* name */
1407          FALSE,                 /* partial_inplace */
1408          0,                     /* src_mask */
1409          0xffff,                /* dst_mask */
1410          TRUE),                 /* pcrel_offset */
1411
1412   /* GNU extension to record C++ vtable hierarchy.  */
1413   HOWTO (R_PPC_GNU_VTINHERIT,   /* type */
1414          0,                     /* rightshift */
1415          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1416          0,                     /* bitsize */
1417          FALSE,                 /* pc_relative */
1418          0,                     /* bitpos */
1419          complain_overflow_dont, /* complain_on_overflow */
1420          NULL,                  /* special_function */
1421          "R_PPC_GNU_VTINHERIT", /* name */
1422          FALSE,                 /* partial_inplace */
1423          0,                     /* src_mask */
1424          0,                     /* dst_mask */
1425          FALSE),                /* pcrel_offset */
1426
1427   /* GNU extension to record C++ vtable member usage.  */
1428   HOWTO (R_PPC_GNU_VTENTRY,     /* type */
1429          0,                     /* rightshift */
1430          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1431          0,                     /* bitsize */
1432          FALSE,                 /* pc_relative */
1433          0,                     /* bitpos */
1434          complain_overflow_dont, /* complain_on_overflow */
1435          NULL,                  /* special_function */
1436          "R_PPC_GNU_VTENTRY",   /* name */
1437          FALSE,                 /* partial_inplace */
1438          0,                     /* src_mask */
1439          0,                     /* dst_mask */
1440          FALSE),                /* pcrel_offset */
1441
1442   /* Phony reloc to handle AIX style TOC entries.  */
1443   HOWTO (R_PPC_TOC16,           /* type */
1444          0,                     /* rightshift */
1445          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1446          16,                    /* bitsize */
1447          FALSE,                 /* pc_relative */
1448          0,                     /* bitpos */
1449          complain_overflow_signed, /* complain_on_overflow */
1450          bfd_elf_generic_reloc, /* special_function */
1451          "R_PPC_TOC16",         /* name */
1452          FALSE,                 /* partial_inplace */
1453          0,                     /* src_mask */
1454          0xffff,                /* dst_mask */
1455          FALSE),                /* pcrel_offset */
1456 };
1457 \f
1458 /* Initialize the ppc_elf_howto_table, so that linear accesses can be done.  */
1459
1460 static void
1461 ppc_elf_howto_init (void)
1462 {
1463   unsigned int i, type;
1464
1465   for (i = 0;
1466        i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
1467        i++)
1468     {
1469       type = ppc_elf_howto_raw[i].type;
1470       if (type >= (sizeof (ppc_elf_howto_table)
1471                    / sizeof (ppc_elf_howto_table[0])))
1472         abort ();
1473       ppc_elf_howto_table[type] = &ppc_elf_howto_raw[i];
1474     }
1475 }
1476
1477 static reloc_howto_type *
1478 ppc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1479                            bfd_reloc_code_real_type code)
1480 {
1481   enum elf_ppc_reloc_type r;
1482
1483   /* Initialize howto table if not already done.  */
1484   if (!ppc_elf_howto_table[R_PPC_ADDR32])
1485     ppc_elf_howto_init ();
1486
1487   switch (code)
1488     {
1489     default:
1490       return NULL;
1491
1492     case BFD_RELOC_NONE:                r = R_PPC_NONE;                 break;
1493     case BFD_RELOC_32:                  r = R_PPC_ADDR32;               break;
1494     case BFD_RELOC_PPC_BA26:            r = R_PPC_ADDR24;               break;
1495     case BFD_RELOC_16:                  r = R_PPC_ADDR16;               break;
1496     case BFD_RELOC_LO16:                r = R_PPC_ADDR16_LO;            break;
1497     case BFD_RELOC_HI16:                r = R_PPC_ADDR16_HI;            break;
1498     case BFD_RELOC_HI16_S:              r = R_PPC_ADDR16_HA;            break;
1499     case BFD_RELOC_PPC_BA16:            r = R_PPC_ADDR14;               break;
1500     case BFD_RELOC_PPC_BA16_BRTAKEN:    r = R_PPC_ADDR14_BRTAKEN;       break;
1501     case BFD_RELOC_PPC_BA16_BRNTAKEN:   r = R_PPC_ADDR14_BRNTAKEN;      break;
1502     case BFD_RELOC_PPC_B26:             r = R_PPC_REL24;                break;
1503     case BFD_RELOC_PPC_B16:             r = R_PPC_REL14;                break;
1504     case BFD_RELOC_PPC_B16_BRTAKEN:     r = R_PPC_REL14_BRTAKEN;        break;
1505     case BFD_RELOC_PPC_B16_BRNTAKEN:    r = R_PPC_REL14_BRNTAKEN;       break;
1506     case BFD_RELOC_16_GOTOFF:           r = R_PPC_GOT16;                break;
1507     case BFD_RELOC_LO16_GOTOFF:         r = R_PPC_GOT16_LO;             break;
1508     case BFD_RELOC_HI16_GOTOFF:         r = R_PPC_GOT16_HI;             break;
1509     case BFD_RELOC_HI16_S_GOTOFF:       r = R_PPC_GOT16_HA;             break;
1510     case BFD_RELOC_24_PLT_PCREL:        r = R_PPC_PLTREL24;             break;
1511     case BFD_RELOC_PPC_COPY:            r = R_PPC_COPY;                 break;
1512     case BFD_RELOC_PPC_GLOB_DAT:        r = R_PPC_GLOB_DAT;             break;
1513     case BFD_RELOC_PPC_LOCAL24PC:       r = R_PPC_LOCAL24PC;            break;
1514     case BFD_RELOC_32_PCREL:            r = R_PPC_REL32;                break;
1515     case BFD_RELOC_32_PLTOFF:           r = R_PPC_PLT32;                break;
1516     case BFD_RELOC_32_PLT_PCREL:        r = R_PPC_PLTREL32;             break;
1517     case BFD_RELOC_LO16_PLTOFF:         r = R_PPC_PLT16_LO;             break;
1518     case BFD_RELOC_HI16_PLTOFF:         r = R_PPC_PLT16_HI;             break;
1519     case BFD_RELOC_HI16_S_PLTOFF:       r = R_PPC_PLT16_HA;             break;
1520     case BFD_RELOC_GPREL16:             r = R_PPC_SDAREL16;             break;
1521     case BFD_RELOC_16_BASEREL:          r = R_PPC_SECTOFF;              break;
1522     case BFD_RELOC_LO16_BASEREL:        r = R_PPC_SECTOFF_LO;           break;
1523     case BFD_RELOC_HI16_BASEREL:        r = R_PPC_SECTOFF_HI;           break;
1524     case BFD_RELOC_HI16_S_BASEREL:      r = R_PPC_SECTOFF_HA;           break;
1525     case BFD_RELOC_CTOR:                r = R_PPC_ADDR32;               break;
1526     case BFD_RELOC_PPC_TOC16:           r = R_PPC_TOC16;                break;
1527     case BFD_RELOC_PPC_TLS:             r = R_PPC_TLS;                  break;
1528     case BFD_RELOC_PPC_DTPMOD:          r = R_PPC_DTPMOD32;             break;
1529     case BFD_RELOC_PPC_TPREL16:         r = R_PPC_TPREL16;              break;
1530     case BFD_RELOC_PPC_TPREL16_LO:      r = R_PPC_TPREL16_LO;           break;
1531     case BFD_RELOC_PPC_TPREL16_HI:      r = R_PPC_TPREL16_HI;           break;
1532     case BFD_RELOC_PPC_TPREL16_HA:      r = R_PPC_TPREL16_HA;           break;
1533     case BFD_RELOC_PPC_TPREL:           r = R_PPC_TPREL32;              break;
1534     case BFD_RELOC_PPC_DTPREL16:        r = R_PPC_DTPREL16;             break;
1535     case BFD_RELOC_PPC_DTPREL16_LO:     r = R_PPC_DTPREL16_LO;          break;
1536     case BFD_RELOC_PPC_DTPREL16_HI:     r = R_PPC_DTPREL16_HI;          break;
1537     case BFD_RELOC_PPC_DTPREL16_HA:     r = R_PPC_DTPREL16_HA;          break;
1538     case BFD_RELOC_PPC_DTPREL:          r = R_PPC_DTPREL32;             break;
1539     case BFD_RELOC_PPC_GOT_TLSGD16:     r = R_PPC_GOT_TLSGD16;          break;
1540     case BFD_RELOC_PPC_GOT_TLSGD16_LO:  r = R_PPC_GOT_TLSGD16_LO;       break;
1541     case BFD_RELOC_PPC_GOT_TLSGD16_HI:  r = R_PPC_GOT_TLSGD16_HI;       break;
1542     case BFD_RELOC_PPC_GOT_TLSGD16_HA:  r = R_PPC_GOT_TLSGD16_HA;       break;
1543     case BFD_RELOC_PPC_GOT_TLSLD16:     r = R_PPC_GOT_TLSLD16;          break;
1544     case BFD_RELOC_PPC_GOT_TLSLD16_LO:  r = R_PPC_GOT_TLSLD16_LO;       break;
1545     case BFD_RELOC_PPC_GOT_TLSLD16_HI:  r = R_PPC_GOT_TLSLD16_HI;       break;
1546     case BFD_RELOC_PPC_GOT_TLSLD16_HA:  r = R_PPC_GOT_TLSLD16_HA;       break;
1547     case BFD_RELOC_PPC_GOT_TPREL16:     r = R_PPC_GOT_TPREL16;          break;
1548     case BFD_RELOC_PPC_GOT_TPREL16_LO:  r = R_PPC_GOT_TPREL16_LO;       break;
1549     case BFD_RELOC_PPC_GOT_TPREL16_HI:  r = R_PPC_GOT_TPREL16_HI;       break;
1550     case BFD_RELOC_PPC_GOT_TPREL16_HA:  r = R_PPC_GOT_TPREL16_HA;       break;
1551     case BFD_RELOC_PPC_GOT_DTPREL16:    r = R_PPC_GOT_DTPREL16;         break;
1552     case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC_GOT_DTPREL16_LO;      break;
1553     case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC_GOT_DTPREL16_HI;      break;
1554     case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC_GOT_DTPREL16_HA;      break;
1555     case BFD_RELOC_PPC_EMB_NADDR32:     r = R_PPC_EMB_NADDR32;          break;
1556     case BFD_RELOC_PPC_EMB_NADDR16:     r = R_PPC_EMB_NADDR16;          break;
1557     case BFD_RELOC_PPC_EMB_NADDR16_LO:  r = R_PPC_EMB_NADDR16_LO;       break;
1558     case BFD_RELOC_PPC_EMB_NADDR16_HI:  r = R_PPC_EMB_NADDR16_HI;       break;
1559     case BFD_RELOC_PPC_EMB_NADDR16_HA:  r = R_PPC_EMB_NADDR16_HA;       break;
1560     case BFD_RELOC_PPC_EMB_SDAI16:      r = R_PPC_EMB_SDAI16;           break;
1561     case BFD_RELOC_PPC_EMB_SDA2I16:     r = R_PPC_EMB_SDA2I16;          break;
1562     case BFD_RELOC_PPC_EMB_SDA2REL:     r = R_PPC_EMB_SDA2REL;          break;
1563     case BFD_RELOC_PPC_EMB_SDA21:       r = R_PPC_EMB_SDA21;            break;
1564     case BFD_RELOC_PPC_EMB_MRKREF:      r = R_PPC_EMB_MRKREF;           break;
1565     case BFD_RELOC_PPC_EMB_RELSEC16:    r = R_PPC_EMB_RELSEC16;         break;
1566     case BFD_RELOC_PPC_EMB_RELST_LO:    r = R_PPC_EMB_RELST_LO;         break;
1567     case BFD_RELOC_PPC_EMB_RELST_HI:    r = R_PPC_EMB_RELST_HI;         break;
1568     case BFD_RELOC_PPC_EMB_RELST_HA:    r = R_PPC_EMB_RELST_HA;         break;
1569     case BFD_RELOC_PPC_EMB_BIT_FLD:     r = R_PPC_EMB_BIT_FLD;          break;
1570     case BFD_RELOC_PPC_EMB_RELSDA:      r = R_PPC_EMB_RELSDA;           break;
1571     case BFD_RELOC_16_PCREL:            r = R_PPC_REL16;                break;
1572     case BFD_RELOC_LO16_PCREL:          r = R_PPC_REL16_LO;             break;
1573     case BFD_RELOC_HI16_PCREL:          r = R_PPC_REL16_HI;             break;
1574     case BFD_RELOC_HI16_S_PCREL:        r = R_PPC_REL16_HA;             break;
1575     case BFD_RELOC_VTABLE_INHERIT:      r = R_PPC_GNU_VTINHERIT;        break;
1576     case BFD_RELOC_VTABLE_ENTRY:        r = R_PPC_GNU_VTENTRY;          break;
1577     }
1578
1579   return ppc_elf_howto_table[r];
1580 };
1581
1582 static reloc_howto_type *
1583 ppc_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1584                            const char *r_name)
1585 {
1586   unsigned int i;
1587
1588   for (i = 0;
1589        i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
1590        i++)
1591     if (ppc_elf_howto_raw[i].name != NULL
1592         && strcasecmp (ppc_elf_howto_raw[i].name, r_name) == 0)
1593       return &ppc_elf_howto_raw[i];
1594
1595   return NULL;
1596 }
1597
1598 /* Set the howto pointer for a PowerPC ELF reloc.  */
1599
1600 static void
1601 ppc_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
1602                        arelent *cache_ptr,
1603                        Elf_Internal_Rela *dst)
1604 {
1605   /* Initialize howto table if not already done.  */
1606   if (!ppc_elf_howto_table[R_PPC_ADDR32])
1607     ppc_elf_howto_init ();
1608
1609   BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_PPC_max);
1610   cache_ptr->howto = ppc_elf_howto_table[ELF32_R_TYPE (dst->r_info)];
1611
1612   /* Just because the above assert didn't trigger doesn't mean that
1613      ELF32_R_TYPE (dst->r_info) is necessarily a valid relocation.  */
1614   if (!cache_ptr->howto)
1615     {
1616       (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
1617                              abfd, ELF32_R_TYPE (dst->r_info));
1618       bfd_set_error (bfd_error_bad_value);
1619
1620       cache_ptr->howto = ppc_elf_howto_table[R_PPC_NONE];
1621     }
1622 }
1623
1624 /* Handle the R_PPC_ADDR16_HA and R_PPC_REL16_HA relocs.  */
1625
1626 static bfd_reloc_status_type
1627 ppc_elf_addr16_ha_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1628                          arelent *reloc_entry,
1629                          asymbol *symbol,
1630                          void *data ATTRIBUTE_UNUSED,
1631                          asection *input_section,
1632                          bfd *output_bfd,
1633                          char **error_message ATTRIBUTE_UNUSED)
1634 {
1635   bfd_vma relocation;
1636
1637   if (output_bfd != NULL)
1638     {
1639       reloc_entry->address += input_section->output_offset;
1640       return bfd_reloc_ok;
1641     }
1642
1643   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1644     return bfd_reloc_outofrange;
1645
1646   if (bfd_is_com_section (symbol->section))
1647     relocation = 0;
1648   else
1649     relocation = symbol->value;
1650
1651   relocation += symbol->section->output_section->vma;
1652   relocation += symbol->section->output_offset;
1653   relocation += reloc_entry->addend;
1654   if (reloc_entry->howto->pc_relative)
1655     relocation -= reloc_entry->address;
1656
1657   reloc_entry->addend += (relocation & 0x8000) << 1;
1658
1659   return bfd_reloc_continue;
1660 }
1661
1662 static bfd_reloc_status_type
1663 ppc_elf_unhandled_reloc (bfd *abfd,
1664                          arelent *reloc_entry,
1665                          asymbol *symbol,
1666                          void *data,
1667                          asection *input_section,
1668                          bfd *output_bfd,
1669                          char **error_message)
1670 {
1671   /* If this is a relocatable link (output_bfd test tells us), just
1672      call the generic function.  Any adjustment will be done at final
1673      link time.  */
1674   if (output_bfd != NULL)
1675     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1676                                   input_section, output_bfd, error_message);
1677
1678   if (error_message != NULL)
1679     {
1680       static char buf[60];
1681       sprintf (buf, _("generic linker can't handle %s"),
1682                reloc_entry->howto->name);
1683       *error_message = buf;
1684     }
1685   return bfd_reloc_dangerous;
1686 }
1687 \f
1688 /* Sections created by the linker.  */
1689
1690 typedef struct elf_linker_section
1691 {
1692   /* Pointer to the bfd section.  */
1693   asection *section;
1694   /* Section name.  */
1695   const char *name;
1696   /* Associated bss section name.  */
1697   const char *bss_name;
1698   /* Associated symbol name.  */
1699   const char *sym_name;
1700   /* Associated symbol.  */
1701   struct elf_link_hash_entry *sym;
1702 } elf_linker_section_t;
1703
1704 /* Linked list of allocated pointer entries.  This hangs off of the
1705    symbol lists, and provides allows us to return different pointers,
1706    based on different addend's.  */
1707
1708 typedef struct elf_linker_section_pointers
1709 {
1710   /* next allocated pointer for this symbol */
1711   struct elf_linker_section_pointers *next;
1712   /* offset of pointer from beginning of section */
1713   bfd_vma offset;
1714   /* addend used */
1715   bfd_vma addend;
1716   /* which linker section this is */
1717   elf_linker_section_t *lsect;
1718 } elf_linker_section_pointers_t;
1719
1720 struct ppc_elf_obj_tdata
1721 {
1722   struct elf_obj_tdata elf;
1723
1724   /* A mapping from local symbols to offsets into the various linker
1725      sections added.  This is index by the symbol index.  */
1726   elf_linker_section_pointers_t **linker_section_pointers;
1727
1728   /* Flags used to auto-detect plt type.  */
1729   unsigned int makes_plt_call : 1;
1730   unsigned int has_rel16 : 1;
1731 };
1732
1733 #define ppc_elf_tdata(bfd) \
1734   ((struct ppc_elf_obj_tdata *) (bfd)->tdata.any)
1735
1736 #define elf_local_ptr_offsets(bfd) \
1737   (ppc_elf_tdata (bfd)->linker_section_pointers)
1738
1739 /* Override the generic function because we store some extras.  */
1740
1741 static bfd_boolean
1742 ppc_elf_mkobject (bfd *abfd)
1743 {
1744   if (abfd->tdata.any == NULL)
1745     {
1746       bfd_size_type amt = sizeof (struct ppc_elf_obj_tdata);
1747       abfd->tdata.any = bfd_zalloc (abfd, amt);
1748       if (abfd->tdata.any == NULL)
1749         return FALSE;
1750     }
1751   return bfd_elf_mkobject (abfd);
1752 }
1753
1754 /* Fix bad default arch selected for a 32 bit input bfd when the
1755    default is 64 bit.  */
1756
1757 static bfd_boolean
1758 ppc_elf_object_p (bfd *abfd)
1759 {
1760   if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 64)
1761     {
1762       Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
1763
1764       if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS32)
1765         {
1766           /* Relies on arch after 64 bit default being 32 bit default.  */
1767           abfd->arch_info = abfd->arch_info->next;
1768           BFD_ASSERT (abfd->arch_info->bits_per_word == 32);
1769         }
1770     }
1771   return TRUE;
1772 }
1773
1774 /* Function to set whether a module needs the -mrelocatable bit set.  */
1775
1776 static bfd_boolean
1777 ppc_elf_set_private_flags (bfd *abfd, flagword flags)
1778 {
1779   BFD_ASSERT (!elf_flags_init (abfd)
1780               || elf_elfheader (abfd)->e_flags == flags);
1781
1782   elf_elfheader (abfd)->e_flags = flags;
1783   elf_flags_init (abfd) = TRUE;
1784   return TRUE;
1785 }
1786
1787 /* Support for core dump NOTE sections.  */
1788
1789 static bfd_boolean
1790 ppc_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1791 {
1792   int offset;
1793   unsigned int size;
1794
1795   switch (note->descsz)
1796     {
1797     default:
1798       return FALSE;
1799
1800     case 268:           /* Linux/PPC.  */
1801       /* pr_cursig */
1802       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1803
1804       /* pr_pid */
1805       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1806
1807       /* pr_reg */
1808       offset = 72;
1809       size = 192;
1810
1811       break;
1812     }
1813
1814   /* Make a ".reg/999" section.  */
1815   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1816                                           size, note->descpos + offset);
1817 }
1818
1819 static bfd_boolean
1820 ppc_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1821 {
1822   switch (note->descsz)
1823     {
1824     default:
1825       return FALSE;
1826
1827     case 128:           /* Linux/PPC elf_prpsinfo.  */
1828       elf_tdata (abfd)->core_program
1829         = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
1830       elf_tdata (abfd)->core_command
1831         = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
1832     }
1833
1834   /* Note that for some reason, a spurious space is tacked
1835      onto the end of the args in some (at least one anyway)
1836      implementations, so strip it off if it exists.  */
1837
1838   {
1839     char *command = elf_tdata (abfd)->core_command;
1840     int n = strlen (command);
1841
1842     if (0 < n && command[n - 1] == ' ')
1843       command[n - 1] = '\0';
1844   }
1845
1846   return TRUE;
1847 }
1848
1849 static char *
1850 ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
1851 {
1852   switch (note_type)
1853     {
1854     default:
1855       return NULL;
1856
1857     case NT_PRPSINFO:
1858       {
1859         char data[128];
1860         va_list ap;
1861
1862         va_start (ap, note_type);
1863         memset (data, 0, 32);
1864         strncpy (data + 32, va_arg (ap, const char *), 16);
1865         strncpy (data + 48, va_arg (ap, const char *), 80);
1866         va_end (ap);
1867         return elfcore_write_note (abfd, buf, bufsiz,
1868                                    "CORE", note_type, data, sizeof (data));
1869       }
1870
1871     case NT_PRSTATUS:
1872       {
1873         char data[268];
1874         va_list ap;
1875         long pid;
1876         int cursig;
1877         const void *greg;
1878
1879         va_start (ap, note_type);
1880         memset (data, 0, 72);
1881         pid = va_arg (ap, long);
1882         bfd_put_32 (abfd, pid, data + 24);
1883         cursig = va_arg (ap, int);
1884         bfd_put_16 (abfd, cursig, data + 12);
1885         greg = va_arg (ap, const void *);
1886         memcpy (data + 72, greg, 192);
1887         memset (data + 264, 0, 4);
1888         va_end (ap);
1889         return elfcore_write_note (abfd, buf, bufsiz,
1890                                    "CORE", note_type, data, sizeof (data));
1891       }
1892     }
1893 }
1894
1895 /* Return address for Ith PLT stub in section PLT, for relocation REL
1896    or (bfd_vma) -1 if it should not be included.  */
1897
1898 static bfd_vma
1899 ppc_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED,
1900                      const asection *plt ATTRIBUTE_UNUSED,
1901                      const arelent *rel)
1902 {
1903   return rel->address;
1904 }
1905
1906 /* Handle a PowerPC specific section when reading an object file.  This
1907    is called when bfd_section_from_shdr finds a section with an unknown
1908    type.  */
1909
1910 static bfd_boolean
1911 ppc_elf_section_from_shdr (bfd *abfd,
1912                            Elf_Internal_Shdr *hdr,
1913                            const char *name,
1914                            int shindex)
1915 {
1916   asection *newsect;
1917   flagword flags;
1918
1919   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
1920     return FALSE;
1921
1922   newsect = hdr->bfd_section;
1923   flags = bfd_get_section_flags (abfd, newsect);
1924   if (hdr->sh_flags & SHF_EXCLUDE)
1925     flags |= SEC_EXCLUDE;
1926
1927   if (hdr->sh_type == SHT_ORDERED)
1928     flags |= SEC_SORT_ENTRIES;
1929
1930   bfd_set_section_flags (abfd, newsect, flags);
1931   return TRUE;
1932 }
1933
1934 /* Set up any other section flags and such that may be necessary.  */
1935
1936 static bfd_boolean
1937 ppc_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
1938                        Elf_Internal_Shdr *shdr,
1939                        asection *asect)
1940 {
1941   if ((asect->flags & (SEC_GROUP | SEC_EXCLUDE)) == SEC_EXCLUDE)
1942     shdr->sh_flags |= SHF_EXCLUDE;
1943
1944   if ((asect->flags & SEC_SORT_ENTRIES) != 0)
1945     shdr->sh_type = SHT_ORDERED;
1946
1947   return TRUE;
1948 }
1949
1950 /* If we have .sbss2 or .PPC.EMB.sbss0 output sections, we
1951    need to bump up the number of section headers.  */
1952
1953 static int
1954 ppc_elf_additional_program_headers (bfd *abfd,
1955                                     struct bfd_link_info *info ATTRIBUTE_UNUSED)
1956 {
1957   asection *s;
1958   int ret = 0;
1959
1960   s = bfd_get_section_by_name (abfd, ".sbss2");
1961   if (s != NULL && (s->flags & SEC_ALLOC) != 0)
1962     ++ret;
1963
1964   s = bfd_get_section_by_name (abfd, ".PPC.EMB.sbss0");
1965   if (s != NULL && (s->flags & SEC_ALLOC) != 0)
1966     ++ret;
1967
1968   return ret;
1969 }
1970
1971 /* Add extra PPC sections -- Note, for now, make .sbss2 and
1972    .PPC.EMB.sbss0 a normal section, and not a bss section so
1973    that the linker doesn't crater when trying to make more than
1974    2 sections.  */
1975
1976 static const struct bfd_elf_special_section ppc_elf_special_sections[] =
1977 {
1978   { STRING_COMMA_LEN (".plt"),             0, SHT_NOBITS,   SHF_ALLOC + SHF_EXECINSTR },
1979   { STRING_COMMA_LEN (".sbss"),           -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
1980   { STRING_COMMA_LEN (".sbss2"),          -2, SHT_PROGBITS, SHF_ALLOC },
1981   { STRING_COMMA_LEN (".sdata"),          -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
1982   { STRING_COMMA_LEN (".sdata2"),         -2, SHT_PROGBITS, SHF_ALLOC },
1983   { STRING_COMMA_LEN (".tags"),            0, SHT_ORDERED,  SHF_ALLOC },
1984   { STRING_COMMA_LEN (".PPC.EMB.apuinfo"), 0, SHT_NOTE,     0 },
1985   { STRING_COMMA_LEN (".PPC.EMB.sbss0"),   0, SHT_PROGBITS, SHF_ALLOC },
1986   { STRING_COMMA_LEN (".PPC.EMB.sdata0"),  0, SHT_PROGBITS, SHF_ALLOC },
1987   { NULL,                              0,  0, 0,            0 }
1988 };
1989
1990 /* This is what we want for new plt/got.  */
1991 static struct bfd_elf_special_section ppc_alt_plt =
1992   { STRING_COMMA_LEN (".plt"),             0, SHT_PROGBITS, SHF_ALLOC };
1993
1994 static const struct bfd_elf_special_section *
1995 ppc_elf_get_sec_type_attr (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1996 {
1997   const struct bfd_elf_special_section *ssect;
1998
1999   /* See if this is one of the special sections.  */
2000   if (sec->name == NULL)
2001     return NULL;
2002
2003   ssect = _bfd_elf_get_special_section (sec->name, ppc_elf_special_sections,
2004                                         sec->use_rela_p);
2005   if (ssect != NULL)
2006     {
2007       if (ssect == ppc_elf_special_sections && (sec->flags & SEC_LOAD) != 0)
2008         ssect = &ppc_alt_plt;
2009       return ssect;
2010     }
2011
2012   return _bfd_elf_get_sec_type_attr (abfd, sec);
2013 }
2014 \f
2015 /* Very simple linked list structure for recording apuinfo values.  */
2016 typedef struct apuinfo_list
2017 {
2018   struct apuinfo_list *next;
2019   unsigned long value;
2020 }
2021 apuinfo_list;
2022
2023 static apuinfo_list *head;
2024
2025
2026 static void
2027 apuinfo_list_init (void)
2028 {
2029   head = NULL;
2030 }
2031
2032 static void
2033 apuinfo_list_add (unsigned long value)
2034 {
2035   apuinfo_list *entry = head;
2036
2037   while (entry != NULL)
2038     {
2039       if (entry->value == value)
2040         return;
2041       entry = entry->next;
2042     }
2043
2044   entry = bfd_malloc (sizeof (* entry));
2045   if (entry == NULL)
2046     return;
2047
2048   entry->value = value;
2049   entry->next  = head;
2050   head = entry;
2051 }
2052
2053 static unsigned
2054 apuinfo_list_length (void)
2055 {
2056   apuinfo_list *entry;
2057   unsigned long count;
2058
2059   for (entry = head, count = 0;
2060        entry;
2061        entry = entry->next)
2062     ++ count;
2063
2064   return count;
2065 }
2066
2067 static inline unsigned long
2068 apuinfo_list_element (unsigned long number)
2069 {
2070   apuinfo_list * entry;
2071
2072   for (entry = head;
2073        entry && number --;
2074        entry = entry->next)
2075     ;
2076
2077   return entry ? entry->value : 0;
2078 }
2079
2080 static void
2081 apuinfo_list_finish (void)
2082 {
2083   apuinfo_list *entry;
2084
2085   for (entry = head; entry;)
2086     {
2087       apuinfo_list *next = entry->next;
2088       free (entry);
2089       entry = next;
2090     }
2091
2092   head = NULL;
2093 }
2094
2095 #define APUINFO_SECTION_NAME    ".PPC.EMB.apuinfo"
2096 #define APUINFO_LABEL           "APUinfo"
2097
2098 /* Scan the input BFDs and create a linked list of
2099    the APUinfo values that will need to be emitted.  */
2100
2101 static void
2102 ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
2103 {
2104   bfd *ibfd;
2105   asection *asec;
2106   char *buffer;
2107   unsigned num_input_sections;
2108   bfd_size_type output_section_size;
2109   unsigned i;
2110   unsigned num_entries;
2111   unsigned long offset;
2112   unsigned long length;
2113   const char *error_message = NULL;
2114
2115   if (link_info == NULL)
2116     return;
2117
2118   /* Scan the input bfds, looking for apuinfo sections.  */
2119   num_input_sections = 0;
2120   output_section_size = 0;
2121
2122   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
2123     {
2124       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
2125       if (asec)
2126         {
2127           ++ num_input_sections;
2128           output_section_size += asec->size;
2129         }
2130     }
2131
2132   /* We need at least one input sections
2133      in order to make merging worthwhile.  */
2134   if (num_input_sections < 1)
2135     return;
2136
2137   /* Just make sure that the output section exists as well.  */
2138   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
2139   if (asec == NULL)
2140     return;
2141
2142   /* Allocate a buffer for the contents of the input sections.  */
2143   buffer = bfd_malloc (output_section_size);
2144   if (buffer == NULL)
2145     return;
2146
2147   offset = 0;
2148   apuinfo_list_init ();
2149
2150   /* Read in the input sections contents.  */
2151   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
2152     {
2153       unsigned long datum;
2154       char *ptr;
2155
2156       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
2157       if (asec == NULL)
2158         continue;
2159
2160       length = asec->size;
2161       if (length < 24)
2162         {
2163           error_message = _("corrupt or empty %s section in %B");
2164           goto fail;
2165         }
2166
2167       if (bfd_seek (ibfd, asec->filepos, SEEK_SET) != 0
2168           || (bfd_bread (buffer + offset, length, ibfd) != length))
2169         {
2170           error_message = _("unable to read in %s section from %B");
2171           goto fail;
2172         }
2173
2174       /* Process the contents of the section.  */
2175       ptr = buffer + offset;
2176       error_message = _("corrupt %s section in %B");
2177
2178       /* Verify the contents of the header.  Note - we have to
2179          extract the values this way in order to allow for a
2180          host whose endian-ness is different from the target.  */
2181       datum = bfd_get_32 (ibfd, ptr);
2182       if (datum != sizeof APUINFO_LABEL)
2183         goto fail;
2184
2185       datum = bfd_get_32 (ibfd, ptr + 8);
2186       if (datum != 0x2)
2187         goto fail;
2188
2189       if (strcmp (ptr + 12, APUINFO_LABEL) != 0)
2190         goto fail;
2191
2192       /* Get the number of bytes used for apuinfo entries.  */
2193       datum = bfd_get_32 (ibfd, ptr + 4);
2194       if (datum + 20 != length)
2195         goto fail;
2196
2197       /* Make sure that we do not run off the end of the section.  */
2198       if (offset + length > output_section_size)
2199         goto fail;
2200
2201       /* Scan the apuinfo section, building a list of apuinfo numbers.  */
2202       for (i = 0; i < datum; i += 4)
2203         apuinfo_list_add (bfd_get_32 (ibfd, ptr + 20 + i));
2204
2205       /* Update the offset.  */
2206       offset += length;
2207     }
2208
2209   error_message = NULL;
2210
2211   /* Compute the size of the output section.  */
2212   num_entries = apuinfo_list_length ();
2213   output_section_size = 20 + num_entries * 4;
2214
2215   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
2216
2217   if (! bfd_set_section_size (abfd, asec, output_section_size))
2218     ibfd = abfd,
2219       error_message = _("warning: unable to set size of %s section in %B");
2220
2221  fail:
2222   free (buffer);
2223
2224   if (error_message)
2225     (*_bfd_error_handler) (error_message, ibfd, APUINFO_SECTION_NAME);
2226 }
2227
2228 /* Prevent the output section from accumulating the input sections'
2229    contents.  We have already stored this in our linked list structure.  */
2230
2231 static bfd_boolean
2232 ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED,
2233                        struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
2234                        asection *asec,
2235                        bfd_byte *contents ATTRIBUTE_UNUSED)
2236 {
2237   return (apuinfo_list_length ()
2238           && strcmp (asec->name, APUINFO_SECTION_NAME) == 0);
2239 }
2240
2241 /* Finally we can generate the output section.  */
2242
2243 static void
2244 ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
2245 {
2246   bfd_byte *buffer;
2247   asection *asec;
2248   unsigned i;
2249   unsigned num_entries;
2250   bfd_size_type length;
2251
2252   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
2253   if (asec == NULL)
2254     return;
2255
2256   if (apuinfo_list_length () == 0)
2257     return;
2258
2259   length = asec->size;
2260   if (length < 20)
2261     return;
2262
2263   buffer = bfd_malloc (length);
2264   if (buffer == NULL)
2265     {
2266       (*_bfd_error_handler)
2267         (_("failed to allocate space for new APUinfo section."));
2268       return;
2269     }
2270
2271   /* Create the apuinfo header.  */
2272   num_entries = apuinfo_list_length ();
2273   bfd_put_32 (abfd, sizeof APUINFO_LABEL, buffer);
2274   bfd_put_32 (abfd, num_entries * 4, buffer + 4);
2275   bfd_put_32 (abfd, 0x2, buffer + 8);
2276   strcpy ((char *) buffer + 12, APUINFO_LABEL);
2277
2278   length = 20;
2279   for (i = 0; i < num_entries; i++)
2280     {
2281       bfd_put_32 (abfd, apuinfo_list_element (i), buffer + length);
2282       length += 4;
2283     }
2284
2285   if (length != asec->size)
2286     (*_bfd_error_handler) (_("failed to compute new APUinfo section."));
2287
2288   if (! bfd_set_section_contents (abfd, asec, buffer, (file_ptr) 0, length))
2289     (*_bfd_error_handler) (_("failed to install new APUinfo section."));
2290
2291   free (buffer);
2292
2293   apuinfo_list_finish ();
2294 }
2295 \f
2296 /* The following functions are specific to the ELF linker, while
2297    functions above are used generally.  They appear in this file more
2298    or less in the order in which they are called.  eg.
2299    ppc_elf_check_relocs is called early in the link process,
2300    ppc_elf_finish_dynamic_sections is one of the last functions
2301    called.  */
2302
2303 /* The PPC linker needs to keep track of the number of relocs that it
2304    decides to copy as dynamic relocs in check_relocs for each symbol.
2305    This is so that it can later discard them if they are found to be
2306    unnecessary.  We store the information in a field extending the
2307    regular ELF linker hash table.  */
2308
2309 struct ppc_elf_dyn_relocs
2310 {
2311   struct ppc_elf_dyn_relocs *next;
2312
2313   /* The input section of the reloc.  */
2314   asection *sec;
2315
2316   /* Total number of relocs copied for the input section.  */
2317   bfd_size_type count;
2318
2319   /* Number of pc-relative relocs copied for the input section.  */
2320   bfd_size_type pc_count;
2321 };
2322
2323 /* Track PLT entries needed for a given symbol.  We might need more
2324    than one glink entry per symbol.  */
2325 struct plt_entry
2326 {
2327   struct plt_entry *next;
2328
2329   /* -fPIC uses multiple GOT sections, one per file, called ".got2".
2330      This field stores the offset into .got2 used to initialise the
2331      GOT pointer reg.  It will always be at least 32768 (and for
2332      current gcc this is the only offset used).  */
2333   bfd_vma addend;
2334
2335   /* The .got2 section.  */
2336   asection *sec;
2337
2338   /* PLT refcount or offset.  */
2339   union
2340     {
2341       bfd_signed_vma refcount;
2342       bfd_vma offset;
2343     } plt;
2344
2345   /* .glink stub offset.  */
2346   bfd_vma glink_offset;
2347 };
2348
2349 /* Of those relocs that might be copied as dynamic relocs, this macro
2350    selects those that must be copied when linking a shared library,
2351    even when the symbol is local.  */
2352
2353 #define MUST_BE_DYN_RELOC(RTYPE)                \
2354   ((RTYPE) != R_PPC_REL24                       \
2355    && (RTYPE) != R_PPC_REL14                    \
2356    && (RTYPE) != R_PPC_REL14_BRTAKEN            \
2357    && (RTYPE) != R_PPC_REL14_BRNTAKEN           \
2358    && (RTYPE) != R_PPC_REL32)
2359
2360 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
2361    copying dynamic variables from a shared lib into an app's dynbss
2362    section, and instead use a dynamic relocation to point into the
2363    shared lib.  */
2364 #define ELIMINATE_COPY_RELOCS 1
2365
2366 /* PPC ELF linker hash entry.  */
2367
2368 struct ppc_elf_link_hash_entry
2369 {
2370   struct elf_link_hash_entry elf;
2371
2372   /* If this symbol is used in the linker created sections, the processor
2373      specific backend uses this field to map the field into the offset
2374      from the beginning of the section.  */
2375   elf_linker_section_pointers_t *linker_section_pointer;
2376
2377   /* Track dynamic relocs copied for this symbol.  */
2378   struct ppc_elf_dyn_relocs *dyn_relocs;
2379
2380   /* Contexts in which symbol is used in the GOT (or TOC).
2381      TLS_GD .. TLS_TLS bits are or'd into the mask as the
2382      corresponding relocs are encountered during check_relocs.
2383      tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
2384      indicate the corresponding GOT entry type is not needed.  */
2385 #define TLS_GD           1      /* GD reloc. */
2386 #define TLS_LD           2      /* LD reloc. */
2387 #define TLS_TPREL        4      /* TPREL reloc, => IE. */
2388 #define TLS_DTPREL       8      /* DTPREL reloc, => LD. */
2389 #define TLS_TLS         16      /* Any TLS reloc.  */
2390 #define TLS_TPRELGD     32      /* TPREL reloc resulting from GD->IE. */
2391   char tls_mask;
2392
2393   /* Nonzero if we have seen a small data relocation referring to this
2394      symbol.  */
2395   unsigned char has_sda_refs;
2396 };
2397
2398 #define ppc_elf_hash_entry(ent) ((struct ppc_elf_link_hash_entry *) (ent))
2399
2400 /* PPC ELF linker hash table.  */
2401
2402 struct ppc_elf_link_hash_table
2403 {
2404   struct elf_link_hash_table elf;
2405
2406   /* Short-cuts to get to dynamic linker sections.  */
2407   asection *got;
2408   asection *relgot;
2409   asection *glink;
2410   asection *plt;
2411   asection *relplt;
2412   asection *dynbss;
2413   asection *relbss;
2414   asection *dynsbss;
2415   asection *relsbss;
2416   elf_linker_section_t sdata[2];
2417   asection *sbss;
2418
2419   /* The (unloaded but important) .rela.plt.unloaded on VxWorks.  */
2420   asection *srelplt2;
2421
2422   /* The .got.plt section (VxWorks only)*/
2423   asection *sgotplt;
2424
2425   /* Shortcut to .__tls_get_addr.  */
2426   struct elf_link_hash_entry *tls_get_addr;
2427
2428   /* The bfd that forced an old-style PLT.  */
2429   bfd *old_bfd;
2430  
2431   /* TLS local dynamic got entry handling.  */
2432   union {
2433     bfd_signed_vma refcount;
2434     bfd_vma offset;
2435   } tlsld_got;
2436
2437   /* Offset of PltResolve function in glink.  */
2438   bfd_vma glink_pltresolve;
2439
2440   /* Size of reserved GOT entries.  */
2441   unsigned int got_header_size;
2442   /* Non-zero if allocating the header left a gap.  */
2443   unsigned int got_gap;
2444
2445   /* The type of PLT we have chosen to use.  */
2446   enum ppc_elf_plt_type plt_type;
2447
2448   /* Set if we should emit symbols for stubs.  */
2449   unsigned int emit_stub_syms:1;
2450
2451   /* True if the target system is VxWorks.  */
2452   unsigned int is_vxworks:1;
2453
2454   /* The size of PLT entries.  */
2455   int plt_entry_size;
2456   /* The distance between adjacent PLT slots.  */
2457   int plt_slot_size;
2458   /* The size of the first PLT entry.  */
2459   int plt_initial_entry_size;
2460
2461   /* Small local sym to section mapping cache.  */
2462   struct sym_sec_cache sym_sec;
2463 };
2464
2465 /* Get the PPC ELF linker hash table from a link_info structure.  */
2466
2467 #define ppc_elf_hash_table(p) \
2468   ((struct ppc_elf_link_hash_table *) (p)->hash)
2469
2470 /* Create an entry in a PPC ELF linker hash table.  */
2471
2472 static struct bfd_hash_entry *
2473 ppc_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
2474                            struct bfd_hash_table *table,
2475                            const char *string)
2476 {
2477   /* Allocate the structure if it has not already been allocated by a
2478      subclass.  */
2479   if (entry == NULL)
2480     {
2481       entry = bfd_hash_allocate (table,
2482                                  sizeof (struct ppc_elf_link_hash_entry));
2483       if (entry == NULL)
2484         return entry;
2485     }
2486
2487   /* Call the allocation method of the superclass.  */
2488   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
2489   if (entry != NULL)
2490     {
2491       ppc_elf_hash_entry (entry)->linker_section_pointer = NULL;
2492       ppc_elf_hash_entry (entry)->dyn_relocs = NULL;
2493       ppc_elf_hash_entry (entry)->tls_mask = 0;
2494     }
2495
2496   return entry;
2497 }
2498
2499 /* Create a PPC ELF linker hash table.  */
2500
2501 static struct bfd_link_hash_table *
2502 ppc_elf_link_hash_table_create (bfd *abfd)
2503 {
2504   struct ppc_elf_link_hash_table *ret;
2505
2506   ret = bfd_zmalloc (sizeof (struct ppc_elf_link_hash_table));
2507   if (ret == NULL)
2508     return NULL;
2509
2510   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
2511                                       ppc_elf_link_hash_newfunc,
2512                                       sizeof (struct ppc_elf_link_hash_entry)))
2513     {
2514       free (ret);
2515       return NULL;
2516     }
2517
2518   ret->elf.init_plt_refcount.refcount = 0;
2519   ret->elf.init_plt_refcount.glist = NULL;
2520   ret->elf.init_plt_offset.offset = 0;
2521   ret->elf.init_plt_offset.glist = NULL;
2522
2523   ret->sdata[0].name = ".sdata";
2524   ret->sdata[0].sym_name = "_SDA_BASE_";
2525   ret->sdata[0].bss_name = ".sbss";
2526
2527   ret->sdata[1].name = ".sdata2";
2528   ret->sdata[1].sym_name = "_SDA2_BASE_";
2529   ret->sdata[1].bss_name = ".sbss2";
2530
2531   ret->plt_entry_size = 12;
2532   ret->plt_slot_size = 8;
2533   ret->plt_initial_entry_size = 72;
2534
2535   return &ret->elf.root;
2536 }
2537
2538 /* Create .got and the related sections.  */
2539
2540 static bfd_boolean
2541 ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
2542 {
2543   struct ppc_elf_link_hash_table *htab;
2544   asection *s;
2545   flagword flags;
2546
2547   if (!_bfd_elf_create_got_section (abfd, info))
2548     return FALSE;
2549
2550   htab = ppc_elf_hash_table (info);
2551   htab->got = s = bfd_get_section_by_name (abfd, ".got");
2552   if (s == NULL)
2553     abort ();
2554
2555   if (htab->is_vxworks)
2556     {
2557       htab->sgotplt = bfd_get_section_by_name (abfd, ".got.plt");
2558       if (!htab->sgotplt)
2559         abort ();
2560     }
2561   else
2562     {
2563       /* The powerpc .got has a blrl instruction in it.  Mark it
2564          executable.  */
2565       flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS
2566                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2567       if (!bfd_set_section_flags (abfd, s, flags))
2568         return FALSE;
2569     }
2570
2571   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2572            | SEC_LINKER_CREATED | SEC_READONLY);
2573   htab->relgot = bfd_make_section_with_flags (abfd, ".rela.got", flags);
2574   if (!htab->relgot
2575       || ! bfd_set_section_alignment (abfd, htab->relgot, 2))
2576     return FALSE;
2577
2578   return TRUE;
2579 }
2580
2581 /* We have to create .dynsbss and .rela.sbss here so that they get mapped
2582    to output sections (just like _bfd_elf_create_dynamic_sections has
2583    to create .dynbss and .rela.bss).  */
2584
2585 static bfd_boolean
2586 ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2587 {
2588   struct ppc_elf_link_hash_table *htab;
2589   asection *s;
2590   flagword flags;
2591
2592   htab = ppc_elf_hash_table (info);
2593
2594   if (htab->got == NULL
2595       && !ppc_elf_create_got (abfd, info))
2596     return FALSE;
2597
2598   if (!_bfd_elf_create_dynamic_sections (abfd, info))
2599     return FALSE;
2600
2601   flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
2602            | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2603
2604   s = bfd_make_section_anyway_with_flags (abfd, ".glink", flags | SEC_CODE);
2605   htab->glink = s;
2606   if (s == NULL
2607       || !bfd_set_section_alignment (abfd, s, 4))
2608     return FALSE;
2609
2610   htab->dynbss = bfd_get_section_by_name (abfd, ".dynbss");
2611   s = bfd_make_section_with_flags (abfd, ".dynsbss",
2612                                    SEC_ALLOC | SEC_LINKER_CREATED);
2613   htab->dynsbss = s;
2614   if (s == NULL)
2615     return FALSE;
2616
2617   if (! info->shared)
2618     {
2619       htab->relbss = bfd_get_section_by_name (abfd, ".rela.bss");
2620       s = bfd_make_section_with_flags (abfd, ".rela.sbss", flags);
2621       htab->relsbss = s;
2622       if (s == NULL
2623           || ! bfd_set_section_alignment (abfd, s, 2))
2624         return FALSE;
2625     }
2626
2627   if (htab->is_vxworks
2628       && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
2629     return FALSE;
2630
2631   htab->relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2632   htab->plt = s = bfd_get_section_by_name (abfd, ".plt");
2633   if (s == NULL)
2634     abort ();
2635
2636   flags = SEC_ALLOC | SEC_CODE | SEC_LINKER_CREATED;
2637   if (htab->plt_type == PLT_VXWORKS)
2638     /* The VxWorks PLT is a loaded section with contents.  */
2639     flags |= SEC_HAS_CONTENTS | SEC_LOAD | SEC_READONLY;
2640   return bfd_set_section_flags (abfd, s, flags);
2641 }
2642
2643 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
2644
2645 static void
2646 ppc_elf_copy_indirect_symbol (struct bfd_link_info *info,
2647                               struct elf_link_hash_entry *dir,
2648                               struct elf_link_hash_entry *ind)
2649 {
2650   struct ppc_elf_link_hash_entry *edir, *eind;
2651
2652   edir = (struct ppc_elf_link_hash_entry *) dir;
2653   eind = (struct ppc_elf_link_hash_entry *) ind;
2654
2655   if (eind->dyn_relocs != NULL)
2656     {
2657       if (edir->dyn_relocs != NULL)
2658         {
2659           struct ppc_elf_dyn_relocs **pp;
2660           struct ppc_elf_dyn_relocs *p;
2661
2662           /* Add reloc counts against the indirect sym to the direct sym
2663              list.  Merge any entries against the same section.  */
2664           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
2665             {
2666               struct ppc_elf_dyn_relocs *q;
2667
2668               for (q = edir->dyn_relocs; q != NULL; q = q->next)
2669                 if (q->sec == p->sec)
2670                   {
2671                     q->pc_count += p->pc_count;
2672                     q->count += p->count;
2673                     *pp = p->next;
2674                     break;
2675                   }
2676               if (q == NULL)
2677                 pp = &p->next;
2678             }
2679           *pp = edir->dyn_relocs;
2680         }
2681
2682       edir->dyn_relocs = eind->dyn_relocs;
2683       eind->dyn_relocs = NULL;
2684     }
2685
2686   edir->tls_mask |= eind->tls_mask;
2687   edir->has_sda_refs |= eind->has_sda_refs;
2688
2689   /* If called to transfer flags for a weakdef during processing
2690      of elf_adjust_dynamic_symbol, don't copy non_got_ref.
2691      We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
2692   if (!(ELIMINATE_COPY_RELOCS
2693         && eind->elf.root.type != bfd_link_hash_indirect
2694         && edir->elf.dynamic_adjusted))
2695     edir->elf.non_got_ref |= eind->elf.non_got_ref;
2696
2697   edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
2698   edir->elf.ref_regular |= eind->elf.ref_regular;
2699   edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
2700   edir->elf.needs_plt |= eind->elf.needs_plt;
2701
2702   /* If we were called to copy over info for a weak sym, that's all.  */
2703   if (eind->elf.root.type != bfd_link_hash_indirect)
2704     return;
2705
2706   /* Copy over the GOT refcount entries that we may have already seen to
2707      the symbol which just became indirect.  */
2708   edir->elf.got.refcount += eind->elf.got.refcount;
2709   eind->elf.got.refcount = 0;
2710
2711   /* And plt entries.  */
2712   if (eind->elf.plt.plist != NULL)
2713     {
2714       if (edir->elf.plt.plist != NULL)
2715         {
2716           struct plt_entry **entp;
2717           struct plt_entry *ent;
2718
2719           for (entp = &eind->elf.plt.plist; (ent = *entp) != NULL; )
2720             {
2721               struct plt_entry *dent;
2722
2723               for (dent = edir->elf.plt.plist; dent != NULL; dent = dent->next)
2724                 if (dent->sec == ent->sec && dent->addend == ent->addend)
2725                   {
2726                     dent->plt.refcount += ent->plt.refcount;
2727                     *entp = ent->next;
2728                     break;
2729                   }
2730               if (dent == NULL)
2731                 entp = &ent->next;
2732             }
2733           *entp = edir->elf.plt.plist;
2734         }
2735
2736       edir->elf.plt.plist = eind->elf.plt.plist;
2737       eind->elf.plt.plist = NULL;
2738     }
2739
2740   if (eind->elf.dynindx != -1)
2741     {
2742       if (edir->elf.dynindx != -1)
2743         _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2744                                 edir->elf.dynstr_index);
2745       edir->elf.dynindx = eind->elf.dynindx;
2746       edir->elf.dynstr_index = eind->elf.dynstr_index;
2747       eind->elf.dynindx = -1;
2748       eind->elf.dynstr_index = 0;
2749     }
2750 }
2751
2752 /* Return 1 if target is one of ours.  */
2753
2754 static bfd_boolean
2755 is_ppc_elf_target (const struct bfd_target *targ)
2756 {
2757   extern const bfd_target bfd_elf32_powerpc_vec;
2758   extern const bfd_target bfd_elf32_powerpc_vxworks_vec;
2759   extern const bfd_target bfd_elf32_powerpcle_vec;
2760
2761   return (targ == &bfd_elf32_powerpc_vec
2762           || targ == &bfd_elf32_powerpc_vxworks_vec
2763           || targ == &bfd_elf32_powerpcle_vec);
2764 }
2765
2766 /* Hook called by the linker routine which adds symbols from an object
2767    file.  We use it to put .comm items in .sbss, and not .bss.  */
2768
2769 static bfd_boolean
2770 ppc_elf_add_symbol_hook (bfd *abfd,
2771                          struct bfd_link_info *info,
2772                          Elf_Internal_Sym *sym,
2773                          const char **namep ATTRIBUTE_UNUSED,
2774                          flagword *flagsp ATTRIBUTE_UNUSED,
2775                          asection **secp,
2776                          bfd_vma *valp)
2777 {
2778   if (sym->st_shndx == SHN_COMMON
2779       && !info->relocatable
2780       && sym->st_size <= elf_gp_size (abfd)
2781       && is_ppc_elf_target (info->hash->creator))
2782     {
2783       /* Common symbols less than or equal to -G nn bytes are automatically
2784          put into .sbss.  */
2785       struct ppc_elf_link_hash_table *htab;
2786
2787       htab = ppc_elf_hash_table (info);
2788       if (htab->sbss == NULL)
2789         {
2790           flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
2791
2792           if (!htab->elf.dynobj)
2793             htab->elf.dynobj = abfd;
2794
2795           htab->sbss = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2796                                                            ".sbss",
2797                                                            flags);
2798           if (htab->sbss == NULL)
2799             return FALSE;
2800         }
2801
2802       *secp = htab->sbss;
2803       *valp = sym->st_size;
2804     }
2805
2806   return TRUE;
2807 }
2808 \f
2809 static bfd_boolean
2810 create_sdata_sym (struct ppc_elf_link_hash_table *htab,
2811                   elf_linker_section_t *lsect)
2812 {
2813   lsect->sym = elf_link_hash_lookup (&htab->elf, lsect->sym_name,
2814                                      TRUE, FALSE, TRUE);
2815   if (lsect->sym == NULL)
2816     return FALSE;
2817   if (lsect->sym->root.type == bfd_link_hash_new)
2818     lsect->sym->non_elf = 0;
2819   lsect->sym->ref_regular = 1;
2820   return TRUE;
2821 }
2822
2823 /* Create a special linker section.  */
2824
2825 static bfd_boolean
2826 ppc_elf_create_linker_section (bfd *abfd,
2827                                struct bfd_link_info *info,
2828                                flagword flags,
2829                                elf_linker_section_t *lsect)
2830 {
2831   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
2832   asection *s;
2833
2834   flags |= (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2835             | SEC_LINKER_CREATED);
2836
2837   /* Record the first bfd that needs the special sections.  */
2838   if (!htab->elf.dynobj)
2839     htab->elf.dynobj = abfd;
2840
2841   s = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2842                                           lsect->name,
2843                                           flags);
2844   if (s == NULL
2845       || !bfd_set_section_alignment (htab->elf.dynobj, s, 2))
2846     return FALSE;
2847   lsect->section = s;
2848
2849   return create_sdata_sym (htab, lsect);
2850 }
2851
2852 /* Find a linker generated pointer with a given addend and type.  */
2853
2854 static elf_linker_section_pointers_t *
2855 elf_find_pointer_linker_section
2856   (elf_linker_section_pointers_t *linker_pointers,
2857    bfd_vma addend,
2858    elf_linker_section_t *lsect)
2859 {
2860   for ( ; linker_pointers != NULL; linker_pointers = linker_pointers->next)
2861     if (lsect == linker_pointers->lsect && addend == linker_pointers->addend)
2862       return linker_pointers;
2863
2864   return NULL;
2865 }
2866
2867 /* Allocate a pointer to live in a linker created section.  */
2868
2869 static bfd_boolean
2870 elf_create_pointer_linker_section (bfd *abfd,
2871                                    elf_linker_section_t *lsect,
2872                                    struct elf_link_hash_entry *h,
2873                                    const Elf_Internal_Rela *rel)
2874 {
2875   elf_linker_section_pointers_t **ptr_linker_section_ptr = NULL;
2876   elf_linker_section_pointers_t *linker_section_ptr;
2877   unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
2878   bfd_size_type amt;
2879
2880   BFD_ASSERT (lsect != NULL);
2881
2882   /* Is this a global symbol?  */
2883   if (h != NULL)
2884     {
2885       struct ppc_elf_link_hash_entry *eh;
2886
2887       /* Has this symbol already been allocated?  If so, our work is done.  */
2888       eh = (struct ppc_elf_link_hash_entry *) h;
2889       if (elf_find_pointer_linker_section (eh->linker_section_pointer,
2890                                            rel->r_addend,
2891                                            lsect))
2892         return TRUE;
2893
2894       ptr_linker_section_ptr = &eh->linker_section_pointer;
2895     }
2896   else
2897     {
2898       /* Allocation of a pointer to a local symbol.  */
2899       elf_linker_section_pointers_t **ptr = elf_local_ptr_offsets (abfd);
2900
2901       /* Allocate a table to hold the local symbols if first time.  */
2902       if (!ptr)
2903         {
2904           unsigned int num_symbols = elf_tdata (abfd)->symtab_hdr.sh_info;
2905
2906           amt = num_symbols;
2907           amt *= sizeof (elf_linker_section_pointers_t *);
2908           ptr = bfd_zalloc (abfd, amt);
2909
2910           if (!ptr)
2911             return FALSE;
2912
2913           elf_local_ptr_offsets (abfd) = ptr;
2914         }
2915
2916       /* Has this symbol already been allocated?  If so, our work is done.  */
2917       if (elf_find_pointer_linker_section (ptr[r_symndx],
2918                                            rel->r_addend,
2919                                            lsect))
2920         return TRUE;
2921
2922       ptr_linker_section_ptr = &ptr[r_symndx];
2923     }
2924
2925   /* Allocate space for a pointer in the linker section, and allocate
2926      a new pointer record from internal memory.  */
2927   BFD_ASSERT (ptr_linker_section_ptr != NULL);
2928   amt = sizeof (elf_linker_section_pointers_t);
2929   linker_section_ptr = bfd_alloc (abfd, amt);
2930
2931   if (!linker_section_ptr)
2932     return FALSE;
2933
2934   linker_section_ptr->next = *ptr_linker_section_ptr;
2935   linker_section_ptr->addend = rel->r_addend;
2936   linker_section_ptr->lsect = lsect;
2937   *ptr_linker_section_ptr = linker_section_ptr;
2938
2939   linker_section_ptr->offset = lsect->section->size;
2940   lsect->section->size += 4;
2941
2942 #ifdef DEBUG
2943   fprintf (stderr,
2944            "Create pointer in linker section %s, offset = %ld, section size = %ld\n",
2945            lsect->name, (long) linker_section_ptr->offset,
2946            (long) lsect->section->size);
2947 #endif
2948
2949   return TRUE;
2950 }
2951
2952 static bfd_boolean
2953 update_local_sym_info (bfd *abfd,
2954                        Elf_Internal_Shdr *symtab_hdr,
2955                        unsigned long r_symndx,
2956                        int tls_type)
2957 {
2958   bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
2959   char *local_got_tls_masks;
2960
2961   if (local_got_refcounts == NULL)
2962     {
2963       bfd_size_type size = symtab_hdr->sh_info;
2964
2965       size *= sizeof (*local_got_refcounts) + sizeof (*local_got_tls_masks);
2966       local_got_refcounts = bfd_zalloc (abfd, size);
2967       if (local_got_refcounts == NULL)
2968         return FALSE;
2969       elf_local_got_refcounts (abfd) = local_got_refcounts;
2970     }
2971
2972   local_got_refcounts[r_symndx] += 1;
2973   local_got_tls_masks = (char *) (local_got_refcounts + symtab_hdr->sh_info);
2974   local_got_tls_masks[r_symndx] |= tls_type;
2975   return TRUE;
2976 }
2977
2978 static bfd_boolean
2979 update_plt_info (bfd *abfd, struct elf_link_hash_entry *h,
2980                  asection *sec, bfd_vma addend)
2981 {
2982   struct plt_entry *ent;
2983
2984   if (addend < 32768)
2985     sec = NULL;
2986   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
2987     if (ent->sec == sec && ent->addend == addend)
2988       break;
2989   if (ent == NULL)
2990     {
2991       bfd_size_type amt = sizeof (*ent);
2992       ent = bfd_alloc (abfd, amt);
2993       if (ent == NULL)
2994         return FALSE;
2995       ent->next = h->plt.plist;
2996       ent->sec = sec;
2997       ent->addend = addend;
2998       ent->plt.refcount = 0;
2999       h->plt.plist = ent;
3000     }
3001   ent->plt.refcount += 1;
3002   return TRUE;
3003 }
3004
3005 static struct plt_entry *
3006 find_plt_ent (struct elf_link_hash_entry *h, asection *sec, bfd_vma addend)
3007 {
3008   struct plt_entry *ent;
3009
3010   if (addend < 32768)
3011     sec = NULL;
3012   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
3013     if (ent->sec == sec && ent->addend == addend)
3014       break;
3015   return ent;
3016 }
3017
3018 static void
3019 bad_shared_reloc (bfd *abfd, enum elf_ppc_reloc_type r_type)
3020 {
3021   (*_bfd_error_handler)
3022     (_("%B: relocation %s cannot be used when making a shared object"),
3023      abfd,
3024      ppc_elf_howto_table[r_type]->name);
3025   bfd_set_error (bfd_error_bad_value);
3026 }
3027
3028 /* Look through the relocs for a section during the first phase, and
3029    allocate space in the global offset table or procedure linkage
3030    table.  */
3031
3032 static bfd_boolean
3033 ppc_elf_check_relocs (bfd *abfd,
3034                       struct bfd_link_info *info,
3035                       asection *sec,
3036                       const Elf_Internal_Rela *relocs)
3037 {
3038   struct ppc_elf_link_hash_table *htab;
3039   Elf_Internal_Shdr *symtab_hdr;
3040   struct elf_link_hash_entry **sym_hashes;
3041   const Elf_Internal_Rela *rel;
3042   const Elf_Internal_Rela *rel_end;
3043   asection *got2, *sreloc;
3044
3045   if (info->relocatable)
3046     return TRUE;
3047
3048   /* Don't do anything special with non-loaded, non-alloced sections.
3049      In particular, any relocs in such sections should not affect GOT
3050      and PLT reference counting (ie. we don't allow them to create GOT
3051      or PLT entries), there's no possibility or desire to optimize TLS
3052      relocs, and there's not much point in propagating relocs to shared
3053      libs that the dynamic linker won't relocate.  */
3054   if ((sec->flags & SEC_ALLOC) == 0)
3055     return TRUE;
3056
3057 #ifdef DEBUG
3058   _bfd_error_handler ("ppc_elf_check_relocs called for section %A in %B",
3059                       sec, abfd);
3060 #endif
3061
3062   /* Initialize howto table if not already done.  */
3063   if (!ppc_elf_howto_table[R_PPC_ADDR32])
3064     ppc_elf_howto_init ();
3065
3066   htab = ppc_elf_hash_table (info);
3067   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3068   sym_hashes = elf_sym_hashes (abfd);
3069   got2 = bfd_get_section_by_name (abfd, ".got2");
3070   sreloc = NULL;
3071
3072   rel_end = relocs + sec->reloc_count;
3073   for (rel = relocs; rel < rel_end; rel++)
3074     {
3075       unsigned long r_symndx;
3076       enum elf_ppc_reloc_type r_type;
3077       struct elf_link_hash_entry *h;
3078       int tls_type = 0;
3079
3080       r_symndx = ELF32_R_SYM (rel->r_info);
3081       if (r_symndx < symtab_hdr->sh_info)
3082         h = NULL;
3083       else
3084         {
3085           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3086           while (h->root.type == bfd_link_hash_indirect
3087                  || h->root.type == bfd_link_hash_warning)
3088             h = (struct elf_link_hash_entry *) h->root.u.i.link;
3089         }
3090
3091       /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
3092          This shows up in particular in an R_PPC_ADDR32 in the eabi
3093          startup code.  */
3094       if (h != NULL
3095           && htab->got == NULL
3096           && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3097         {
3098           if (htab->elf.dynobj == NULL)
3099             htab->elf.dynobj = abfd;
3100           if (!ppc_elf_create_got (htab->elf.dynobj, info))
3101             return FALSE;
3102           BFD_ASSERT (h == htab->elf.hgot);
3103         }
3104
3105       r_type = ELF32_R_TYPE (rel->r_info);
3106       switch (r_type)
3107         {
3108         case R_PPC_GOT_TLSLD16:
3109         case R_PPC_GOT_TLSLD16_LO:
3110         case R_PPC_GOT_TLSLD16_HI:
3111         case R_PPC_GOT_TLSLD16_HA:
3112           tls_type = TLS_TLS | TLS_LD;
3113           goto dogottls;
3114
3115         case R_PPC_GOT_TLSGD16:
3116         case R_PPC_GOT_TLSGD16_LO:
3117         case R_PPC_GOT_TLSGD16_HI:
3118         case R_PPC_GOT_TLSGD16_HA:
3119           tls_type = TLS_TLS | TLS_GD;
3120           goto dogottls;
3121
3122         case R_PPC_GOT_TPREL16:
3123         case R_PPC_GOT_TPREL16_LO:
3124         case R_PPC_GOT_TPREL16_HI:
3125         case R_PPC_GOT_TPREL16_HA:
3126           if (info->shared)
3127             info->flags |= DF_STATIC_TLS;
3128           tls_type = TLS_TLS | TLS_TPREL;
3129           goto dogottls;
3130
3131         case R_PPC_GOT_DTPREL16:
3132         case R_PPC_GOT_DTPREL16_LO:
3133         case R_PPC_GOT_DTPREL16_HI:
3134         case R_PPC_GOT_DTPREL16_HA:
3135           tls_type = TLS_TLS | TLS_DTPREL;
3136         dogottls:
3137           sec->has_tls_reloc = 1;
3138           /* Fall thru */
3139
3140           /* GOT16 relocations */
3141         case R_PPC_GOT16:
3142         case R_PPC_GOT16_LO:
3143         case R_PPC_GOT16_HI:
3144         case R_PPC_GOT16_HA:
3145           /* This symbol requires a global offset table entry.  */
3146           if (htab->got == NULL)
3147             {
3148               if (htab->elf.dynobj == NULL)
3149                 htab->elf.dynobj = abfd;
3150               if (!ppc_elf_create_got (htab->elf.dynobj, info))
3151                 return FALSE;
3152             }
3153           if (h != NULL)
3154             {
3155               h->got.refcount += 1;
3156               ppc_elf_hash_entry (h)->tls_mask |= tls_type;
3157             }
3158           else
3159             /* This is a global offset table entry for a local symbol.  */
3160             if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, tls_type))
3161               return FALSE;
3162           break;
3163
3164           /* Indirect .sdata relocation.  */
3165         case R_PPC_EMB_SDAI16:
3166           if (info->shared)
3167             {
3168               bad_shared_reloc (abfd, r_type);
3169               return FALSE;
3170             }
3171           if (htab->sdata[0].section == NULL
3172               && !ppc_elf_create_linker_section (abfd, info, 0,
3173                                                  &htab->sdata[0]))
3174             return FALSE;
3175           if (!elf_create_pointer_linker_section (abfd, &htab->sdata[0],
3176                                                   h, rel))
3177             return FALSE;
3178           if (h != NULL)
3179             {
3180               ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3181               h->non_got_ref = TRUE;
3182             }
3183           break;
3184
3185           /* Indirect .sdata2 relocation.  */
3186         case R_PPC_EMB_SDA2I16:
3187           if (info->shared)
3188             {
3189               bad_shared_reloc (abfd, r_type);
3190               return FALSE;
3191             }
3192           if (htab->sdata[1].section == NULL
3193               && !ppc_elf_create_linker_section (abfd, info, SEC_READONLY,
3194                                                  &htab->sdata[1]))
3195             return FALSE;
3196           if (!elf_create_pointer_linker_section (abfd, &htab->sdata[1],
3197                                                   h, rel))
3198             return FALSE;
3199           if (h != NULL)
3200             {
3201               ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3202               h->non_got_ref = TRUE;
3203             }
3204           break;
3205
3206         case R_PPC_SDAREL16:
3207           if (info->shared)
3208             {
3209               bad_shared_reloc (abfd, r_type);
3210               return FALSE;
3211             }
3212           if (htab->sdata[0].sym == NULL
3213               && !create_sdata_sym (htab, &htab->sdata[0]))
3214             return FALSE;
3215           if (h != NULL)
3216             {
3217               ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3218               h->non_got_ref = TRUE;
3219             }
3220           break;
3221
3222         case R_PPC_EMB_SDA2REL:
3223           if (info->shared)
3224             {
3225               bad_shared_reloc (abfd, r_type);
3226               return FALSE;
3227             }
3228           if (htab->sdata[1].sym == NULL
3229               && !create_sdata_sym (htab, &htab->sdata[1]))
3230             return FALSE;
3231           if (h != NULL)
3232             {
3233               ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3234               h->non_got_ref = TRUE;
3235             }
3236           break;
3237
3238         case R_PPC_EMB_SDA21:
3239         case R_PPC_EMB_RELSDA:
3240           if (info->shared)
3241             {
3242               bad_shared_reloc (abfd, r_type);
3243               return FALSE;
3244             }
3245           if (htab->sdata[0].sym == NULL
3246               && !create_sdata_sym (htab, &htab->sdata[0]))
3247             return FALSE;
3248           if (htab->sdata[1].sym == NULL
3249               && !create_sdata_sym (htab, &htab->sdata[1]))
3250             return FALSE;
3251           if (h != NULL)
3252             {
3253               ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3254               h->non_got_ref = TRUE;
3255             }
3256           break;
3257
3258         case R_PPC_EMB_NADDR32:
3259         case R_PPC_EMB_NADDR16:
3260         case R_PPC_EMB_NADDR16_LO:
3261         case R_PPC_EMB_NADDR16_HI:
3262         case R_PPC_EMB_NADDR16_HA:
3263           if (info->shared)
3264             {
3265               bad_shared_reloc (abfd, r_type);
3266               return FALSE;
3267             }
3268           if (h != NULL)
3269             h->non_got_ref = TRUE;
3270           break;
3271
3272         case R_PPC_PLT32:
3273         case R_PPC_PLTREL24:
3274         case R_PPC_PLTREL32:
3275         case R_PPC_PLT16_LO:
3276         case R_PPC_PLT16_HI:
3277         case R_PPC_PLT16_HA:
3278 #ifdef DEBUG
3279           fprintf (stderr, "Reloc requires a PLT entry\n");
3280 #endif
3281           /* This symbol requires a procedure linkage table entry.  We
3282              actually build the entry in finish_dynamic_symbol,
3283              because this might be a case of linking PIC code without
3284              linking in any dynamic objects, in which case we don't
3285              need to generate a procedure linkage table after all.  */
3286
3287           if (h == NULL)
3288             {
3289               /* It does not make sense to have a procedure linkage
3290                  table entry for a local symbol.  */
3291               (*_bfd_error_handler) (_("%B(%A+0x%lx): %s reloc against "
3292                                        "local symbol"),
3293                                      abfd,
3294                                      sec,
3295                                      (long) rel->r_offset,
3296                                      ppc_elf_howto_table[r_type]->name);
3297               bfd_set_error (bfd_error_bad_value);
3298               return FALSE;
3299             }
3300           else
3301             {
3302               bfd_vma addend = 0;
3303
3304               if (r_type == R_PPC_PLTREL24)
3305                 {
3306                   ppc_elf_tdata (abfd)->makes_plt_call = 1;
3307                   addend = rel->r_addend;
3308                 }
3309               h->needs_plt = 1;
3310               if (!update_plt_info (abfd, h, got2, addend))
3311                 return FALSE;
3312             }
3313           break;
3314
3315           /* The following relocations don't need to propagate the
3316              relocation if linking a shared object since they are
3317              section relative.  */
3318         case R_PPC_SECTOFF:
3319         case R_PPC_SECTOFF_LO:
3320         case R_PPC_SECTOFF_HI:
3321         case R_PPC_SECTOFF_HA:
3322         case R_PPC_DTPREL16:
3323         case R_PPC_DTPREL16_LO:
3324         case R_PPC_DTPREL16_HI:
3325         case R_PPC_DTPREL16_HA:
3326         case R_PPC_TOC16:
3327           break;
3328
3329         case R_PPC_REL16:
3330         case R_PPC_REL16_LO:
3331         case R_PPC_REL16_HI:
3332         case R_PPC_REL16_HA:
3333           ppc_elf_tdata (abfd)->has_rel16 = 1;
3334           break;
3335
3336           /* These are just markers.  */
3337         case R_PPC_TLS:
3338         case R_PPC_EMB_MRKREF:
3339         case R_PPC_NONE:
3340         case R_PPC_max:
3341           break;
3342
3343           /* These should only appear in dynamic objects.  */
3344         case R_PPC_COPY:
3345         case R_PPC_GLOB_DAT:
3346         case R_PPC_JMP_SLOT:
3347         case R_PPC_RELATIVE:
3348           break;
3349
3350           /* These aren't handled yet.  We'll report an error later.  */
3351         case R_PPC_ADDR30:
3352         case R_PPC_EMB_RELSEC16:
3353         case R_PPC_EMB_RELST_LO:
3354         case R_PPC_EMB_RELST_HI:
3355         case R_PPC_EMB_RELST_HA:
3356         case R_PPC_EMB_BIT_FLD:
3357           break;
3358
3359           /* This refers only to functions defined in the shared library.  */
3360         case R_PPC_LOCAL24PC:
3361           if (h && h == htab->elf.hgot && htab->plt_type == PLT_UNSET)
3362             {
3363               htab->plt_type = PLT_OLD;
3364               htab->old_bfd = abfd;
3365             }
3366           break;
3367
3368           /* This relocation describes the C++ object vtable hierarchy.
3369              Reconstruct it for later use during GC.  */
3370         case R_PPC_GNU_VTINHERIT:
3371           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3372             return FALSE;
3373           break;
3374
3375           /* This relocation describes which C++ vtable entries are actually
3376              used.  Record for later use during GC.  */
3377         case R_PPC_GNU_VTENTRY:
3378           BFD_ASSERT (h != NULL);
3379           if (h != NULL
3380               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3381             return FALSE;
3382           break;
3383
3384           /* We shouldn't really be seeing these.  */
3385         case R_PPC_TPREL32:
3386           if (info->shared)
3387             info->flags |= DF_STATIC_TLS;
3388           goto dodyn;
3389
3390           /* Nor these.  */
3391         case R_PPC_DTPMOD32:
3392         case R_PPC_DTPREL32:
3393           goto dodyn;
3394
3395         case R_PPC_TPREL16:
3396         case R_PPC_TPREL16_LO:
3397         case R_PPC_TPREL16_HI:
3398         case R_PPC_TPREL16_HA:
3399           if (info->shared)
3400             info->flags |= DF_STATIC_TLS;
3401           goto dodyn;
3402
3403         case R_PPC_REL32:
3404           if (h == NULL
3405               && got2 != NULL
3406               && (sec->flags & SEC_CODE) != 0
3407               && (info->shared || info->pie)
3408               && htab->plt_type == PLT_UNSET)
3409             {
3410               /* Old -fPIC gcc code has .long LCTOC1-LCFx just before
3411                  the start of a function, which assembles to a REL32
3412                  reference to .got2.  If we detect one of these, then
3413                  force the old PLT layout because the linker cannot
3414                  reliably deduce the GOT pointer value needed for
3415                  PLT call stubs.  */
3416               asection *s;
3417
3418               s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, sec,
3419                                              r_symndx);
3420               if (s == got2)
3421                 {
3422                   htab->plt_type = PLT_OLD;
3423                   htab->old_bfd = abfd;
3424                 }
3425             }
3426           if (h == NULL || h == htab->elf.hgot)
3427             break;
3428           goto dodyn1;
3429
3430         case R_PPC_REL24:
3431         case R_PPC_REL14:
3432         case R_PPC_REL14_BRTAKEN:
3433         case R_PPC_REL14_BRNTAKEN:
3434           if (h == NULL)
3435             break;
3436           if (h == htab->elf.hgot)
3437             {
3438               if (htab->plt_type == PLT_UNSET)
3439                 {
3440                   htab->plt_type = PLT_OLD;
3441                   htab->old_bfd = abfd;
3442                 }
3443               break;
3444             }
3445           /* fall through */
3446
3447         case R_PPC_ADDR32:
3448         case R_PPC_ADDR24:
3449         case R_PPC_ADDR16:
3450         case R_PPC_ADDR16_LO:
3451         case R_PPC_ADDR16_HI:
3452         case R_PPC_ADDR16_HA:
3453         case R_PPC_ADDR14:
3454         case R_PPC_ADDR14_BRTAKEN:
3455         case R_PPC_ADDR14_BRNTAKEN:
3456         case R_PPC_UADDR32:
3457         case R_PPC_UADDR16:
3458         dodyn1:
3459           if (h != NULL && !info->shared)
3460             {
3461               /* We may need a plt entry if the symbol turns out to be
3462                  a function defined in a dynamic object.  */
3463               if (!update_plt_info (abfd, h, NULL, 0))
3464                 return FALSE;
3465
3466               /* We may need a copy reloc too.  */
3467               h->non_got_ref = 1;
3468             }
3469
3470         dodyn:
3471           /* If we are creating a shared library, and this is a reloc
3472              against a global symbol, or a non PC relative reloc
3473              against a local symbol, then we need to copy the reloc
3474              into the shared library.  However, if we are linking with
3475              -Bsymbolic, we do not need to copy a reloc against a
3476              global symbol which is defined in an object we are
3477              including in the link (i.e., DEF_REGULAR is set).  At
3478              this point we have not seen all the input files, so it is
3479              possible that DEF_REGULAR is not set now but will be set
3480              later (it is never cleared).  In case of a weak definition,
3481              DEF_REGULAR may be cleared later by a strong definition in
3482              a shared library.  We account for that possibility below by
3483              storing information in the dyn_relocs field of the hash
3484              table entry.  A similar situation occurs when creating
3485              shared libraries and symbol visibility changes render the
3486              symbol local.
3487
3488              If on the other hand, we are creating an executable, we
3489              may need to keep relocations for symbols satisfied by a
3490              dynamic library if we manage to avoid copy relocs for the
3491              symbol.  */
3492           if ((info->shared
3493                && (MUST_BE_DYN_RELOC (r_type)
3494                    || (h != NULL
3495                        && (! info->symbolic
3496                            || h->root.type == bfd_link_hash_defweak
3497                            || !h->def_regular))))
3498               || (ELIMINATE_COPY_RELOCS
3499                   && !info->shared
3500                   && h != NULL
3501                   && (h->root.type == bfd_link_hash_defweak
3502                       || !h->def_regular)))
3503             {
3504               struct ppc_elf_dyn_relocs *p;
3505               struct ppc_elf_dyn_relocs **head;
3506
3507 #ifdef DEBUG
3508               fprintf (stderr,
3509                        "ppc_elf_check_relocs needs to "
3510                        "create relocation for %s\n",
3511                        (h && h->root.root.string
3512                         ? h->root.root.string : "<unknown>"));
3513 #endif
3514               if (sreloc == NULL)
3515                 {
3516                   const char *name;
3517
3518                   name = (bfd_elf_string_from_elf_section
3519                           (abfd,
3520                            elf_elfheader (abfd)->e_shstrndx,
3521                            elf_section_data (sec)->rel_hdr.sh_name));
3522                   if (name == NULL)
3523                     return FALSE;
3524
3525                   BFD_ASSERT (CONST_STRNEQ (name, ".rela")
3526                               && strcmp (bfd_get_section_name (abfd, sec),
3527                                          name + 5) == 0);
3528
3529                   if (htab->elf.dynobj == NULL)
3530                     htab->elf.dynobj = abfd;
3531                   sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
3532                   if (sreloc == NULL)
3533                     {
3534                       flagword flags;
3535
3536                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
3537                                | SEC_IN_MEMORY | SEC_LINKER_CREATED
3538                                | SEC_ALLOC | SEC_LOAD);
3539                       sreloc = bfd_make_section_with_flags (htab->elf.dynobj,
3540                                                             name,
3541                                                             flags);
3542                       if (sreloc == NULL
3543                           || ! bfd_set_section_alignment (htab->elf.dynobj,
3544                                                           sreloc, 2))
3545                         return FALSE;
3546                     }
3547                   elf_section_data (sec)->sreloc = sreloc;
3548                 }
3549
3550               /* If this is a global symbol, we count the number of
3551                  relocations we need for this symbol.  */
3552               if (h != NULL)
3553                 {
3554                   head = &ppc_elf_hash_entry (h)->dyn_relocs;
3555                 }
3556               else
3557                 {
3558                   /* Track dynamic relocs needed for local syms too.
3559                      We really need local syms available to do this
3560                      easily.  Oh well.  */
3561
3562                   asection *s;
3563                   void *vpp;
3564
3565                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
3566                                                  sec, r_symndx);
3567                   if (s == NULL)
3568                     return FALSE;
3569
3570                   vpp = &elf_section_data (s)->local_dynrel;
3571                   head = (struct ppc_elf_dyn_relocs **) vpp;
3572                 }
3573
3574               p = *head;
3575               if (p == NULL || p->sec != sec)
3576                 {
3577                   p = bfd_alloc (htab->elf.dynobj, sizeof *p);
3578                   if (p == NULL)
3579                     return FALSE;
3580                   p->next = *head;
3581                   *head = p;
3582                   p->sec = sec;
3583                   p->count = 0;
3584                   p->pc_count = 0;
3585                 }
3586
3587               p->count += 1;
3588               if (!MUST_BE_DYN_RELOC (r_type))
3589                 p->pc_count += 1;
3590             }
3591
3592           break;
3593         }
3594     }
3595
3596   return TRUE;
3597 }
3598 \f
3599
3600 /* Merge object attributes from IBFD into OBFD.  Raise an error if
3601    there are conflicting attributes.  */
3602 static bfd_boolean
3603 ppc_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
3604 {
3605   obj_attribute *in_attr, *in_attrs;
3606   obj_attribute *out_attr, *out_attrs;
3607
3608   if (!elf_known_obj_attributes_proc (obfd)[0].i)
3609     {
3610       /* This is the first object.  Copy the attributes.  */
3611       _bfd_elf_copy_obj_attributes (ibfd, obfd);
3612
3613       /* Use the Tag_null value to indicate the attributes have been
3614          initialized.  */
3615       elf_known_obj_attributes_proc (obfd)[0].i = 1;
3616
3617       return TRUE;
3618     }
3619
3620   in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
3621   out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
3622
3623   /* Check for conflicting Tag_GNU_Power_ABI_FP attributes and merge
3624      non-conflicting ones.  */
3625   in_attr = &in_attrs[Tag_GNU_Power_ABI_FP];
3626   out_attr = &out_attrs[Tag_GNU_Power_ABI_FP];
3627   if (in_attr->i != out_attr->i)
3628     {
3629       out_attr->type = 1;
3630       if (out_attr->i == 0)
3631         out_attr->i = in_attr->i;
3632       else if (in_attr->i == 0)
3633         ;
3634       else if (out_attr->i == 1 && in_attr->i == 2)
3635         _bfd_error_handler
3636           (_("Warning: %B uses hard float, %B uses soft float"), obfd, ibfd);
3637       else if (out_attr->i == 2 && in_attr->i == 1)
3638         _bfd_error_handler
3639           (_("Warning: %B uses hard float, %B uses soft float"), ibfd, obfd);
3640       else if (in_attr->i > 2)
3641         _bfd_error_handler
3642           (_("Warning: %B uses unknown floating point ABI %d"), ibfd,
3643            in_attr->i);
3644       else
3645         _bfd_error_handler
3646           (_("Warning: %B uses unknown floating point ABI %d"), obfd,
3647            out_attr->i);
3648     }
3649
3650   /* Check for conflicting Tag_GNU_Power_ABI_Vector attributes and
3651      merge non-conflicting ones.  */
3652   in_attr = &in_attrs[Tag_GNU_Power_ABI_Vector];
3653   out_attr = &out_attrs[Tag_GNU_Power_ABI_Vector];
3654   if (in_attr->i != out_attr->i)
3655     {
3656       const char *in_abi = NULL, *out_abi = NULL;
3657
3658       switch (in_attr->i)
3659         {
3660         case 1: in_abi = "generic"; break;
3661         case 2: in_abi = "AltiVec"; break;
3662         case 3: in_abi = "SPE"; break;
3663         }
3664
3665       switch (out_attr->i)
3666         {
3667         case 1: out_abi = "generic"; break;
3668         case 2: out_abi = "AltiVec"; break;
3669         case 3: out_abi = "SPE"; break;
3670         }
3671
3672       out_attr->type = 1;
3673       if (out_attr->i == 0)
3674         out_attr->i = in_attr->i;
3675       else if (in_attr->i == 0)
3676         ;
3677       /* For now, allow generic to transition to AltiVec or SPE
3678          without a warning.  If GCC marked files with their stack
3679          alignment and used don't-care markings for files which are
3680          not affected by the vector ABI, we could warn about this
3681          case too.  */
3682       else if (out_attr->i == 1)
3683         out_attr->i = in_attr->i;
3684       else if (in_attr->i == 1)
3685         ;
3686       else if (in_abi == NULL)
3687         _bfd_error_handler
3688           (_("Warning: %B uses unknown vector ABI %d"), ibfd,
3689            in_attr->i);
3690       else if (out_abi == NULL)
3691         _bfd_error_handler
3692           (_("Warning: %B uses unknown vector ABI %d"), obfd,
3693            in_attr->i);
3694       else
3695         _bfd_error_handler
3696           (_("Warning: %B uses vector ABI \"%s\", %B uses \"%s\""),
3697            ibfd, obfd, in_abi, out_abi);
3698     }
3699
3700   /* Merge Tag_compatibility attributes and any common GNU ones.  */
3701   _bfd_elf_merge_object_attributes (ibfd, obfd);
3702
3703   return TRUE;
3704 }
3705
3706 /* Merge backend specific data from an object file to the output
3707    object file when linking.  */
3708
3709 static bfd_boolean
3710 ppc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
3711 {
3712   flagword old_flags;
3713   flagword new_flags;
3714   bfd_boolean error;
3715
3716   if (!is_ppc_elf_target (ibfd->xvec)
3717       || !is_ppc_elf_target (obfd->xvec))
3718     return TRUE;
3719
3720   /* Check if we have the same endianess.  */
3721   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
3722     return FALSE;
3723
3724   if (!ppc_elf_merge_obj_attributes (ibfd, obfd))
3725     return FALSE;
3726
3727   new_flags = elf_elfheader (ibfd)->e_flags;
3728   old_flags = elf_elfheader (obfd)->e_flags;
3729   if (!elf_flags_init (obfd))
3730     {
3731       /* First call, no flags set.  */
3732       elf_flags_init (obfd) = TRUE;
3733       elf_elfheader (obfd)->e_flags = new_flags;
3734     }
3735
3736   /* Compatible flags are ok.  */
3737   else if (new_flags == old_flags)
3738     ;
3739
3740   /* Incompatible flags.  */
3741   else
3742     {
3743       /* Warn about -mrelocatable mismatch.  Allow -mrelocatable-lib
3744          to be linked with either.  */
3745       error = FALSE;
3746       if ((new_flags & EF_PPC_RELOCATABLE) != 0
3747           && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
3748         {
3749           error = TRUE;
3750           (*_bfd_error_handler)
3751             (_("%B: compiled with -mrelocatable and linked with "
3752                "modules compiled normally"), ibfd);
3753         }
3754       else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
3755                && (old_flags & EF_PPC_RELOCATABLE) != 0)
3756         {
3757           error = TRUE;
3758           (*_bfd_error_handler)
3759             (_("%B: compiled normally and linked with "
3760                "modules compiled with -mrelocatable"), ibfd);
3761         }
3762
3763       /* The output is -mrelocatable-lib iff both the input files are.  */
3764       if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
3765         elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
3766
3767       /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
3768          but each input file is either -mrelocatable or -mrelocatable-lib.  */
3769       if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
3770           && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
3771           && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
3772         elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
3773
3774       /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
3775          any module uses it.  */
3776       elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
3777
3778       new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
3779       old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
3780
3781       /* Warn about any other mismatches.  */
3782       if (new_flags != old_flags)
3783         {
3784           error = TRUE;
3785           (*_bfd_error_handler)
3786             (_("%B: uses different e_flags (0x%lx) fields "
3787                "than previous modules (0x%lx)"),
3788              ibfd, (long) new_flags, (long) old_flags);
3789         }
3790
3791       if (error)
3792         {
3793           bfd_set_error (bfd_error_bad_value);
3794           return FALSE;
3795         }
3796     }
3797
3798   return TRUE;
3799 }
3800 \f
3801 /* Choose which PLT scheme to use, and set .plt flags appropriately.
3802    Returns -1 on error, 0 for old PLT, 1 for new PLT.  */
3803 int
3804 ppc_elf_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED,
3805                            struct bfd_link_info *info,
3806                            enum ppc_elf_plt_type plt_style,
3807                            int emit_stub_syms)
3808 {
3809   struct ppc_elf_link_hash_table *htab;
3810   flagword flags;
3811
3812   htab = ppc_elf_hash_table (info);
3813
3814   if (htab->plt_type == PLT_UNSET)
3815     {
3816       if (plt_style == PLT_OLD)
3817         htab->plt_type = PLT_OLD;
3818       else
3819         {
3820           bfd *ibfd;
3821           enum ppc_elf_plt_type plt_type = plt_style;
3822
3823           /* Look through the reloc flags left by ppc_elf_check_relocs.
3824              Use the old style bss plt if a file makes plt calls
3825              without using the new relocs, and if ld isn't given
3826              --secure-plt and we never see REL16 relocs.  */
3827           if (plt_type == PLT_UNSET)
3828             plt_type = PLT_OLD;
3829           for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
3830             if (is_ppc_elf_target (ibfd->xvec))
3831               {
3832                 if (ppc_elf_tdata (ibfd)->has_rel16)
3833                   plt_type = PLT_NEW;
3834                 else if (ppc_elf_tdata (ibfd)->makes_plt_call)
3835                   {
3836                     plt_type = PLT_OLD;
3837                     htab->old_bfd = ibfd;
3838                     break;
3839                   }
3840               }
3841           htab->plt_type = plt_type;
3842         }
3843     }
3844   if (htab->plt_type == PLT_OLD && plt_style == PLT_NEW)
3845     info->callbacks->info (_("Using bss-plt due to %B"), htab->old_bfd);
3846
3847   htab->emit_stub_syms = emit_stub_syms;
3848
3849   BFD_ASSERT (htab->plt_type != PLT_VXWORKS);
3850
3851   if (htab->plt_type == PLT_NEW)
3852     {
3853       flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
3854                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3855
3856       /* The new PLT is a loaded section.  */
3857       if (htab->plt != NULL
3858           && !bfd_set_section_flags (htab->elf.dynobj, htab->plt, flags))
3859         return -1;
3860
3861       /* The new GOT is not executable.  */
3862       if (htab->got != NULL
3863           && !bfd_set_section_flags (htab->elf.dynobj, htab->got, flags))
3864         return -1;
3865     }
3866   else
3867     {
3868       /* Stop an unused .glink section from affecting .text alignment.  */
3869       if (htab->glink != NULL
3870           && !bfd_set_section_alignment (htab->elf.dynobj, htab->glink, 0))
3871         return -1;
3872     }
3873   return htab->plt_type == PLT_NEW;
3874 }
3875 \f
3876 /* Return the section that should be marked against GC for a given
3877    relocation.  */
3878
3879 static asection *
3880 ppc_elf_gc_mark_hook (asection *sec,
3881                       struct bfd_link_info *info,
3882                       Elf_Internal_Rela *rel,
3883                       struct elf_link_hash_entry *h,
3884                       Elf_Internal_Sym *sym)
3885 {
3886   if (h != NULL)
3887     switch (ELF32_R_TYPE (rel->r_info))
3888       {
3889       case R_PPC_GNU_VTINHERIT:
3890       case R_PPC_GNU_VTENTRY:
3891         return NULL;
3892       }
3893
3894   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
3895 }
3896
3897 /* Update the got, plt and dynamic reloc reference counts for the
3898    section being removed.  */
3899
3900 static bfd_boolean
3901 ppc_elf_gc_sweep_hook (bfd *abfd,
3902                        struct bfd_link_info *info,
3903                        asection *sec,
3904                        const Elf_Internal_Rela *relocs)
3905 {
3906   struct ppc_elf_link_hash_table *htab;
3907   Elf_Internal_Shdr *symtab_hdr;
3908   struct elf_link_hash_entry **sym_hashes;
3909   bfd_signed_vma *local_got_refcounts;
3910   const Elf_Internal_Rela *rel, *relend;
3911   asection *got2;
3912
3913   if ((sec->flags & SEC_ALLOC) == 0)
3914     return TRUE;
3915
3916   elf_section_data (sec)->local_dynrel = NULL;
3917
3918   htab = ppc_elf_hash_table (info);
3919   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3920   sym_hashes = elf_sym_hashes (abfd);
3921   local_got_refcounts = elf_local_got_refcounts (abfd);
3922   got2 = bfd_get_section_by_name (abfd, ".got2");
3923
3924   relend = relocs + sec->reloc_count;
3925   for (rel = relocs; rel < relend; rel++)
3926     {
3927       unsigned long r_symndx;
3928       enum elf_ppc_reloc_type r_type;
3929       struct elf_link_hash_entry *h = NULL;
3930
3931       r_symndx = ELF32_R_SYM (rel->r_info);
3932       if (r_symndx >= symtab_hdr->sh_info)
3933         {
3934           struct ppc_elf_dyn_relocs **pp, *p;
3935           struct ppc_elf_link_hash_entry *eh;
3936
3937           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3938           while (h->root.type == bfd_link_hash_indirect
3939                  || h->root.type == bfd_link_hash_warning)
3940             h = (struct elf_link_hash_entry *) h->root.u.i.link;
3941           eh = (struct ppc_elf_link_hash_entry *) h;
3942
3943           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
3944             if (p->sec == sec)
3945               {
3946                 /* Everything must go for SEC.  */
3947                 *pp = p->next;
3948                 break;
3949               }
3950         }
3951
3952       r_type = ELF32_R_TYPE (rel->r_info);
3953       switch (r_type)
3954         {
3955         case R_PPC_GOT_TLSLD16:
3956         case R_PPC_GOT_TLSLD16_LO:
3957         case R_PPC_GOT_TLSLD16_HI:
3958         case R_PPC_GOT_TLSLD16_HA:
3959         case R_PPC_GOT_TLSGD16:
3960         case R_PPC_GOT_TLSGD16_LO:
3961         case R_PPC_GOT_TLSGD16_HI:
3962         case R_PPC_GOT_TLSGD16_HA:
3963         case R_PPC_GOT_TPREL16:
3964         case R_PPC_GOT_TPREL16_LO:
3965         case R_PPC_GOT_TPREL16_HI:
3966         case R_PPC_GOT_TPREL16_HA:
3967         case R_PPC_GOT_DTPREL16:
3968         case R_PPC_GOT_DTPREL16_LO:
3969         case R_PPC_GOT_DTPREL16_HI:
3970         case R_PPC_GOT_DTPREL16_HA:
3971         case R_PPC_GOT16:
3972         case R_PPC_GOT16_LO:
3973         case R_PPC_GOT16_HI:
3974         case R_PPC_GOT16_HA:
3975           if (h != NULL)
3976             {
3977               if (h->got.refcount > 0)
3978                 h->got.refcount--;
3979             }
3980           else if (local_got_refcounts != NULL)
3981             {
3982               if (local_got_refcounts[r_symndx] > 0)
3983                 local_got_refcounts[r_symndx]--;
3984             }
3985           break;
3986
3987         case R_PPC_REL24:
3988         case R_PPC_REL14:
3989         case R_PPC_REL14_BRTAKEN:
3990         case R_PPC_REL14_BRNTAKEN:
3991         case R_PPC_REL32:
3992           if (h == NULL || h == htab->elf.hgot)
3993             break;
3994           /* Fall thru */
3995
3996         case R_PPC_ADDR32:
3997         case R_PPC_ADDR24:
3998         case R_PPC_ADDR16:
3999         case R_PPC_ADDR16_LO:
4000         case R_PPC_ADDR16_HI:
4001         case R_PPC_ADDR16_HA:
4002         case R_PPC_ADDR14:
4003         case R_PPC_ADDR14_BRTAKEN:
4004         case R_PPC_ADDR14_BRNTAKEN:
4005         case R_PPC_UADDR32:
4006         case R_PPC_UADDR16:
4007           if (info->shared)
4008             break;
4009
4010         case R_PPC_PLT32:
4011         case R_PPC_PLTREL24:
4012         case R_PPC_PLTREL32:
4013         case R_PPC_PLT16_LO:
4014         case R_PPC_PLT16_HI:
4015         case R_PPC_PLT16_HA:
4016           if (h != NULL)
4017             {
4018               bfd_vma addend = r_type == R_PPC_PLTREL24 ? rel->r_addend : 0;
4019               struct plt_entry *ent = find_plt_ent (h, got2, addend);
4020               if (ent->plt.refcount > 0)
4021                 ent->plt.refcount -= 1;
4022             }
4023           break;
4024
4025         default:
4026           break;
4027         }
4028     }
4029   return TRUE;
4030 }
4031 \f
4032 /* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
4033
4034 asection *
4035 ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
4036 {
4037   struct ppc_elf_link_hash_table *htab;
4038
4039   htab = ppc_elf_hash_table (info);
4040   if (htab->plt_type == PLT_NEW
4041       && htab->plt != NULL
4042       && htab->plt->output_section != NULL)
4043     {
4044       elf_section_type (htab->plt->output_section) = SHT_PROGBITS;
4045       elf_section_flags (htab->plt->output_section) = SHF_ALLOC + SHF_WRITE;
4046     }
4047
4048   htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4049                                              FALSE, FALSE, TRUE);
4050   return _bfd_elf_tls_setup (obfd, info);
4051 }
4052
4053 /* Run through all the TLS relocs looking for optimization
4054    opportunities.  */
4055
4056 bfd_boolean
4057 ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
4058                       struct bfd_link_info *info)
4059 {
4060   bfd *ibfd;
4061   asection *sec;
4062   struct ppc_elf_link_hash_table *htab;
4063   int pass;
4064
4065   if (info->relocatable || info->shared)
4066     return TRUE;
4067
4068   htab = ppc_elf_hash_table (info);
4069   /* Make two passes through the relocs.  First time check that tls
4070      relocs involved in setting up a tls_get_addr call are indeed
4071      followed by such a call.  If they are not, exclude them from
4072      the optimizations done on the second pass.  */
4073   for (pass = 0; pass < 2; ++pass)
4074     for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4075       {
4076         Elf_Internal_Sym *locsyms = NULL;
4077         Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4078
4079         for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4080           if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
4081             {
4082               Elf_Internal_Rela *relstart, *rel, *relend;
4083
4084               /* Read the relocations.  */
4085               relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
4086                                                     info->keep_memory);
4087               if (relstart == NULL)
4088                 return FALSE;
4089
4090               relend = relstart + sec->reloc_count;
4091               for (rel = relstart; rel < relend; rel++)
4092                 {
4093                   enum elf_ppc_reloc_type r_type;
4094                   unsigned long r_symndx;
4095                   struct elf_link_hash_entry *h = NULL;
4096                   char *tls_mask;
4097                   char tls_set, tls_clear;
4098                   bfd_boolean is_local;
4099                   int expecting_tls_get_addr;
4100                   bfd_signed_vma *got_count;
4101
4102                   r_symndx = ELF32_R_SYM (rel->r_info);
4103                   if (r_symndx >= symtab_hdr->sh_info)
4104                     {
4105                       struct elf_link_hash_entry **sym_hashes;
4106
4107                       sym_hashes = elf_sym_hashes (ibfd);
4108                       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4109                       while (h->root.type == bfd_link_hash_indirect
4110                              || h->root.type == bfd_link_hash_warning)
4111                         h = (struct elf_link_hash_entry *) h->root.u.i.link;
4112                     }
4113
4114                   expecting_tls_get_addr = 0;
4115                   is_local = FALSE;
4116                   if (h == NULL
4117                       || !h->def_dynamic)
4118                     is_local = TRUE;
4119
4120                   r_type = ELF32_R_TYPE (rel->r_info);
4121                   switch (r_type)
4122                     {
4123                     case R_PPC_GOT_TLSLD16:
4124                     case R_PPC_GOT_TLSLD16_LO:
4125                       expecting_tls_get_addr = 1;
4126                       /* Fall thru */
4127
4128                     case R_PPC_GOT_TLSLD16_HI:
4129                     case R_PPC_GOT_TLSLD16_HA:
4130                       /* These relocs should never be against a symbol
4131                          defined in a shared lib.  Leave them alone if
4132                          that turns out to be the case.  */
4133                       if (!is_local)
4134                         continue;
4135
4136                       /* LD -> LE */
4137                       tls_set = 0;
4138                       tls_clear = TLS_LD;
4139                       break;
4140
4141                     case R_PPC_GOT_TLSGD16:
4142                     case R_PPC_GOT_TLSGD16_LO:
4143                       expecting_tls_get_addr = 1;
4144                       /* Fall thru */
4145
4146                     case R_PPC_GOT_TLSGD16_HI:
4147                     case R_PPC_GOT_TLSGD16_HA:
4148                       if (is_local)
4149                         /* GD -> LE */
4150                         tls_set = 0;
4151                       else
4152                         /* GD -> IE */
4153                         tls_set = TLS_TLS | TLS_TPRELGD;
4154                       tls_clear = TLS_GD;
4155                       break;
4156
4157                     case R_PPC_GOT_TPREL16:
4158                     case R_PPC_GOT_TPREL16_LO:
4159                     case R_PPC_GOT_TPREL16_HI:
4160                     case R_PPC_GOT_TPREL16_HA:
4161                       if (is_local)
4162                         {
4163                           /* IE -> LE */
4164                           tls_set = 0;
4165                           tls_clear = TLS_TPREL;
4166                           break;
4167                         }
4168                       else
4169                         continue;
4170
4171                     default:
4172                       continue;
4173                     }
4174
4175                   if (pass == 0)
4176                     {
4177                       if (!expecting_tls_get_addr)
4178                         continue;
4179
4180                       if (rel + 1 < relend)
4181                         {
4182                           enum elf_ppc_reloc_type r_type2;
4183                           unsigned long r_symndx2;
4184                           struct elf_link_hash_entry *h2;
4185
4186                           /* The next instruction should be a call to
4187                              __tls_get_addr.  Peek at the reloc to be sure.  */
4188                           r_type2 = ELF32_R_TYPE (rel[1].r_info);
4189                           r_symndx2 = ELF32_R_SYM (rel[1].r_info);
4190                           if (r_symndx2 >= symtab_hdr->sh_info
4191                               && (r_type2 == R_PPC_REL14
4192                                   || r_type2 == R_PPC_REL14_BRTAKEN
4193                                   || r_type2 == R_PPC_REL14_BRNTAKEN
4194                                   || r_type2 == R_PPC_REL24
4195                                   || r_type2 == R_PPC_PLTREL24))
4196                             {
4197                               struct elf_link_hash_entry **sym_hashes;
4198
4199                               sym_hashes = elf_sym_hashes (ibfd);
4200                               h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
4201                               while (h2->root.type == bfd_link_hash_indirect
4202                                      || h2->root.type == bfd_link_hash_warning)
4203                                 h2 = ((struct elf_link_hash_entry *)
4204                                       h2->root.u.i.link);
4205                               if (h2 == htab->tls_get_addr)
4206                                 continue;
4207                             }
4208                         }
4209
4210                       /* Uh oh, we didn't find the expected call.  We
4211                          could just mark this symbol to exclude it
4212                          from tls optimization but it's safer to skip
4213                          the entire section.  */
4214                       sec->has_tls_reloc = 0;
4215                       break;
4216                     }
4217
4218                   if (h != NULL)
4219                     {
4220                       tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
4221                       got_count = &h->got.refcount;
4222                     }
4223                   else
4224                     {
4225                       Elf_Internal_Sym *sym;
4226                       bfd_signed_vma *lgot_refs;
4227                       char *lgot_masks;
4228
4229                       if (locsyms == NULL)
4230                         {
4231                           locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
4232                           if (locsyms == NULL)
4233                             locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
4234                                                             symtab_hdr->sh_info,
4235                                                             0, NULL, NULL, NULL);
4236                           if (locsyms == NULL)
4237                             {
4238                               if (elf_section_data (sec)->relocs != relstart)
4239                                 free (relstart);
4240                               return FALSE;
4241                             }
4242                         }
4243                       sym = locsyms + r_symndx;
4244                       lgot_refs = elf_local_got_refcounts (ibfd);
4245                       if (lgot_refs == NULL)
4246                         abort ();
4247                       lgot_masks = (char *) (lgot_refs + symtab_hdr->sh_info);
4248                       tls_mask = &lgot_masks[r_symndx];
4249                       got_count = &lgot_refs[r_symndx];
4250                     }
4251
4252                   if (tls_set == 0)
4253                     {
4254                       /* We managed to get rid of a got entry.  */
4255                       if (*got_count > 0)
4256                         *got_count -= 1;
4257                     }
4258
4259                   if (expecting_tls_get_addr)
4260                     {
4261                       struct plt_entry *ent;
4262
4263                       ent = find_plt_ent (htab->tls_get_addr, NULL, 0);
4264                       if (ent != NULL && ent->plt.refcount > 0)
4265                         ent->plt.refcount -= 1;
4266                     }
4267
4268                   *tls_mask |= tls_set;
4269                   *tls_mask &= ~tls_clear;
4270                 }
4271
4272               if (elf_section_data (sec)->relocs != relstart)
4273                 free (relstart);
4274             }
4275
4276         if (locsyms != NULL
4277             && (symtab_hdr->contents != (unsigned char *) locsyms))
4278           {
4279             if (!info->keep_memory)
4280               free (locsyms);
4281             else
4282               symtab_hdr->contents = (unsigned char *) locsyms;
4283           }
4284       }
4285   return TRUE;
4286 }
4287 \f
4288 /* Adjust a symbol defined by a dynamic object and referenced by a
4289    regular object.  The current definition is in some section of the
4290    dynamic object, but we're not including those sections.  We have to
4291    change the definition to something the rest of the link can
4292    understand.  */
4293
4294 static bfd_boolean
4295 ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
4296                                struct elf_link_hash_entry *h)
4297 {
4298   struct ppc_elf_link_hash_table *htab;
4299   asection *s;
4300
4301 #ifdef DEBUG
4302   fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
4303            h->root.root.string);
4304 #endif
4305
4306   /* Make sure we know what is going on here.  */
4307   htab = ppc_elf_hash_table (info);
4308   BFD_ASSERT (htab->elf.dynobj != NULL
4309               && (h->needs_plt
4310                   || h->u.weakdef != NULL
4311                   || (h->def_dynamic
4312                       && h->ref_regular
4313                       && !h->def_regular)));
4314
4315   /* Deal with function syms.  */
4316   if (h->type == STT_FUNC
4317       || h->needs_plt)
4318     {
4319       /* Clear procedure linkage table information for any symbol that
4320          won't need a .plt entry.  */
4321       struct plt_entry *ent;
4322       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
4323         if (ent->plt.refcount > 0)
4324           break;
4325       if (ent == NULL
4326           || SYMBOL_CALLS_LOCAL (info, h)
4327           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4328               && h->root.type == bfd_link_hash_undefweak))
4329         {
4330           /* A PLT entry is not required/allowed when:
4331
4332              1. We are not using ld.so; because then the PLT entry
4333              can't be set up, so we can't use one.  In this case,
4334              ppc_elf_adjust_dynamic_symbol won't even be called.
4335
4336              2. GC has rendered the entry unused.
4337
4338              3. We know for certain that a call to this symbol
4339              will go to this object, or will remain undefined.  */
4340           h->plt.plist = NULL;
4341           h->needs_plt = 0;
4342         }
4343       return TRUE;
4344     }
4345   else
4346     h->plt.plist = NULL;
4347
4348   /* If this is a weak symbol, and there is a real definition, the
4349      processor independent code will have arranged for us to see the
4350      real definition first, and we can just use the same value.  */
4351   if (h->u.weakdef != NULL)
4352     {
4353       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
4354                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
4355       h->root.u.def.section = h->u.weakdef->root.u.def.section;
4356       h->root.u.def.value = h->u.weakdef->root.u.def.value;
4357       if (ELIMINATE_COPY_RELOCS)
4358         h->non_got_ref = h->u.weakdef->non_got_ref;
4359       return TRUE;
4360     }
4361
4362   /* This is a reference to a symbol defined by a dynamic object which
4363      is not a function.  */
4364
4365   /* If we are creating a shared library, we must presume that the
4366      only references to the symbol are via the global offset table.
4367      For such cases we need not do anything here; the relocations will
4368      be handled correctly by relocate_section.  */
4369   if (info->shared)
4370     return TRUE;
4371
4372   /* If there are no references to this symbol that do not use the
4373      GOT, we don't need to generate a copy reloc.  */
4374   if (!h->non_got_ref)
4375     return TRUE;
4376
4377    /* If we didn't find any dynamic relocs in read-only sections, then
4378       we'll be keeping the dynamic relocs and avoiding the copy reloc.
4379       We can't do this if there are any small data relocations.  This
4380       doesn't work on VxWorks, where we can not have dynamic
4381       relocations (other than copy and jump slot relocations) in an
4382       executable.  */
4383   if (ELIMINATE_COPY_RELOCS
4384       && !ppc_elf_hash_entry (h)->has_sda_refs
4385       && !htab->is_vxworks)
4386     {
4387       struct ppc_elf_dyn_relocs *p;
4388       for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
4389         {
4390           s = p->sec->output_section;
4391           if (s != NULL && (s->flags & SEC_READONLY) != 0)
4392             break;
4393         }
4394
4395       if (p == NULL)
4396         {
4397           h->non_got_ref = 0;
4398           return TRUE;
4399         }
4400     }
4401
4402   if (h->size == 0)
4403     {
4404       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
4405                              h->root.root.string);
4406       return TRUE;
4407     }
4408
4409   /* We must allocate the symbol in our .dynbss section, which will
4410      become part of the .bss section of the executable.  There will be
4411      an entry for this symbol in the .dynsym section.  The dynamic
4412      object will contain position independent code, so all references
4413      from the dynamic object to this symbol will go through the global
4414      offset table.  The dynamic linker will use the .dynsym entry to
4415      determine the address it must put in the global offset table, so
4416      both the dynamic object and the regular object will refer to the
4417      same memory location for the variable.
4418
4419      Of course, if the symbol is referenced using SDAREL relocs, we
4420      must instead allocate it in .sbss.  */
4421
4422   if (ppc_elf_hash_entry (h)->has_sda_refs)
4423     s = htab->dynsbss;
4424   else
4425     s = htab->dynbss;
4426   BFD_ASSERT (s != NULL);
4427
4428   /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
4429      copy the initial value out of the dynamic object and into the
4430      runtime process image.  We need to remember the offset into the
4431      .rela.bss section we are going to use.  */
4432   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
4433     {
4434       asection *srel;
4435
4436       if (ppc_elf_hash_entry (h)->has_sda_refs)
4437         srel = htab->relsbss;
4438       else
4439         srel = htab->relbss;
4440       BFD_ASSERT (srel != NULL);
4441       srel->size += sizeof (Elf32_External_Rela);
4442       h->needs_copy = 1;
4443     }
4444
4445   return _bfd_elf_adjust_dynamic_copy (h, s);
4446 }
4447 \f
4448 /* Generate a symbol to mark plt call stubs.  For non-PIC code the sym is
4449    xxxxxxxx.plt_call32.<callee> where xxxxxxxx is a hex number, usually 0,
4450    specifying the addend on the plt relocation.  For -fpic code, the sym
4451    is xxxxxxxx.plt_pic32.<callee>, and for -fPIC
4452    xxxxxxxx.got2.plt_pic32.<callee>.  */
4453
4454 static bfd_boolean
4455 add_stub_sym (struct plt_entry *ent,
4456               struct elf_link_hash_entry *h,
4457               struct bfd_link_info *info)
4458 {
4459   struct elf_link_hash_entry *sh;
4460   size_t len1, len2, len3;
4461   char *name;
4462   const char *stub;
4463   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
4464
4465   if (info->shared || info->pie)
4466     stub = ".plt_pic32.";
4467   else
4468     stub = ".plt_call32.";
4469
4470   len1 = strlen (h->root.root.string);
4471   len2 = strlen (stub);
4472   len3 = 0;
4473   if (ent->sec)
4474     len3 = strlen (ent->sec->name);
4475   name = bfd_malloc (len1 + len2 + len3 + 9);
4476   if (name == NULL)
4477     return FALSE;
4478   sprintf (name, "%08x", (unsigned) ent->addend & 0xffffffff);
4479   if (ent->sec)
4480     memcpy (name + 8, ent->sec->name, len3);
4481   memcpy (name + 8 + len3, stub, len2);
4482   memcpy (name + 8 + len3 + len2, h->root.root.string, len1 + 1);
4483   sh = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
4484   if (sh == NULL)
4485     return FALSE;
4486   if (sh->root.type == bfd_link_hash_new)
4487     {
4488       sh->root.type = bfd_link_hash_defined;
4489       sh->root.u.def.section = htab->glink;
4490       sh->root.u.def.value = ent->glink_offset;
4491       sh->ref_regular = 1;
4492       sh->def_regular = 1;
4493       sh->ref_regular_nonweak = 1;
4494       sh->forced_local = 1;
4495       sh->non_elf = 0;
4496     }
4497   return TRUE;
4498 }
4499
4500 /* Allocate NEED contiguous space in .got, and return the offset.
4501    Handles allocation of the got header when crossing 32k.  */
4502
4503 static bfd_vma
4504 allocate_got (struct ppc_elf_link_hash_table *htab, unsigned int need)
4505 {
4506   bfd_vma where;
4507   unsigned int max_before_header;
4508
4509   if (htab->plt_type == PLT_VXWORKS)
4510     {
4511       where = htab->got->size;
4512       htab->got->size += need;
4513     }
4514   else
4515     {
4516       max_before_header = htab->plt_type == PLT_NEW ? 32768 : 32764;
4517       if (need <= htab->got_gap)
4518         {
4519           where = max_before_header - htab->got_gap;
4520           htab->got_gap -= need;
4521         }
4522       else
4523         {
4524           if (htab->got->size + need > max_before_header
4525               && htab->got->size <= max_before_header)
4526             {
4527               htab->got_gap = max_before_header - htab->got->size;
4528               htab->got->size = max_before_header + htab->got_header_size;
4529             }
4530           where = htab->got->size;
4531           htab->got->size += need;
4532         }
4533     }
4534   return where;
4535 }
4536
4537 /* Allocate space in associated reloc sections for dynamic relocs.  */
4538
4539 static bfd_boolean
4540 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
4541 {
4542   struct bfd_link_info *info = inf;
4543   struct ppc_elf_link_hash_entry *eh;
4544   struct ppc_elf_link_hash_table *htab;
4545   struct ppc_elf_dyn_relocs *p;
4546
4547   if (h->root.type == bfd_link_hash_indirect)
4548     return TRUE;
4549
4550   if (h->root.type == bfd_link_hash_warning)
4551     /* When warning symbols are created, they **replace** the "real"
4552        entry in the hash table, thus we never get to see the real
4553        symbol in a hash traversal.  So look at it now.  */
4554     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4555
4556   htab = ppc_elf_hash_table (info);
4557   if (htab->elf.dynamic_sections_created)
4558     {
4559       struct plt_entry *ent;
4560       bfd_boolean doneone = FALSE;
4561       bfd_vma plt_offset = 0, glink_offset = 0;
4562
4563       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
4564         if (ent->plt.refcount > 0)
4565           {
4566             /* Make sure this symbol is output as a dynamic symbol.  */
4567             if (h->dynindx == -1
4568                 && !h->forced_local)
4569               {
4570                 if (! bfd_elf_link_record_dynamic_symbol (info, h))
4571                   return FALSE;
4572               }
4573
4574             if (info->shared
4575                 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
4576               {
4577                 asection *s = htab->plt;
4578
4579                 if (htab->plt_type == PLT_NEW)
4580                   {
4581                     if (!doneone)
4582                       {
4583                         plt_offset = s->size;
4584                         s->size += 4;
4585                       }
4586                     ent->plt.offset = plt_offset;
4587
4588                     s = htab->glink;
4589                     if (!doneone || info->shared || info->pie)
4590                       {
4591                         glink_offset = s->size;
4592                         s->size += GLINK_ENTRY_SIZE;
4593                       }
4594                     if (!doneone
4595                         && !info->shared
4596                         && !h->def_regular)
4597                       {
4598                         h->root.u.def.section = s;
4599                         h->root.u.def.value = glink_offset;
4600                       }
4601                     ent->glink_offset = glink_offset;
4602
4603                     if (htab->emit_stub_syms
4604                         && !add_stub_sym (ent, h, info))
4605                       return FALSE;
4606                   }
4607                 else
4608                   {
4609                     if (!doneone)
4610                       {
4611                         /* If this is the first .plt entry, make room
4612                            for the special first entry.  */
4613                         if (s->size == 0)
4614                           s->size += htab->plt_initial_entry_size;
4615
4616                         /* The PowerPC PLT is actually composed of two
4617                            parts, the first part is 2 words (for a load
4618                            and a jump), and then there is a remaining
4619                            word available at the end.  */
4620                         plt_offset = (htab->plt_initial_entry_size
4621                                       + (htab->plt_slot_size
4622                                          * ((s->size
4623                                              - htab->plt_initial_entry_size)
4624                                             / htab->plt_entry_size)));
4625
4626                         /* If this symbol is not defined in a regular
4627                            file, and we are not generating a shared
4628                            library, then set the symbol to this location
4629                            in the .plt.  This is required to make
4630                            function pointers compare as equal between
4631                            the normal executable and the shared library.  */
4632                         if (! info->shared
4633                             && !h->def_regular)
4634                           {
4635                             h->root.u.def.section = s;
4636                             h->root.u.def.value = plt_offset;
4637                           }
4638
4639                         /* Make room for this entry.  */
4640                         s->size += htab->plt_entry_size;
4641                         /* After the 8192nd entry, room for two entries
4642                            is allocated.  */
4643                         if (htab->plt_type == PLT_OLD
4644                             && (s->size - htab->plt_initial_entry_size)
4645                                 / htab->plt_entry_size
4646                                > PLT_NUM_SINGLE_ENTRIES)
4647                           s->size += htab->plt_entry_size;
4648                       }
4649                     ent->plt.offset = plt_offset;
4650                   }
4651
4652                 /* We also need to make an entry in the .rela.plt section.  */
4653                 if (!doneone)
4654                   {
4655                     htab->relplt->size += sizeof (Elf32_External_Rela);
4656
4657                     if (htab->plt_type == PLT_VXWORKS)
4658                       {
4659                         /* Allocate space for the unloaded relocations.  */
4660                         if (!info->shared)
4661                           {
4662                             if (ent->plt.offset
4663                                 == (bfd_vma) htab->plt_initial_entry_size)
4664                               {
4665                                 htab->srelplt2->size
4666                                   += sizeof (Elf32_External_Rela)
4667                                       * VXWORKS_PLTRESOLVE_RELOCS;
4668                               }
4669
4670                             htab->srelplt2->size
4671                               += sizeof (Elf32_External_Rela)
4672                                   * VXWORKS_PLT_NON_JMP_SLOT_RELOCS;
4673                           }
4674
4675                         /* Every PLT entry has an associated GOT entry in
4676                            .got.plt.  */
4677                         htab->sgotplt->size += 4;
4678                       }
4679                     doneone = TRUE;
4680                   }
4681               }
4682             else
4683               ent->plt.offset = (bfd_vma) -1;
4684           }
4685         else
4686           ent->plt.offset = (bfd_vma) -1;
4687
4688       if (!doneone)
4689         {
4690           h->plt.plist = NULL;
4691           h->needs_plt = 0;
4692         }
4693     }
4694   else
4695     {
4696       h->plt.plist = NULL;
4697       h->needs_plt = 0;
4698     }
4699
4700   eh = (struct ppc_elf_link_hash_entry *) h;
4701   if (eh->elf.got.refcount > 0)
4702     {
4703       /* Make sure this symbol is output as a dynamic symbol.  */
4704       if (eh->elf.dynindx == -1
4705           && !eh->elf.forced_local)
4706         {
4707           if (!bfd_elf_link_record_dynamic_symbol (info, &eh->elf))
4708             return FALSE;
4709         }
4710
4711       if (eh->tls_mask == (TLS_TLS | TLS_LD)
4712           && !eh->elf.def_dynamic)
4713         {
4714           /* If just an LD reloc, we'll just use htab->tlsld_got.offset.  */
4715           htab->tlsld_got.refcount += 1;
4716           eh->elf.got.offset = (bfd_vma) -1;
4717         }
4718       else
4719         {
4720           bfd_boolean dyn;
4721           unsigned int need = 0;
4722           if ((eh->tls_mask & TLS_TLS) != 0)
4723             {
4724               if ((eh->tls_mask & TLS_LD) != 0)
4725                 need += 8;
4726               if ((eh->tls_mask & TLS_GD) != 0)
4727                 need += 8;
4728               if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
4729                 need += 4;
4730               if ((eh->tls_mask & TLS_DTPREL) != 0)
4731                 need += 4;
4732             }
4733           else
4734             need += 4;
4735           eh->elf.got.offset = allocate_got (htab, need);
4736           dyn = htab->elf.dynamic_sections_created;
4737           if ((info->shared
4738                || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, &eh->elf))
4739               && (ELF_ST_VISIBILITY (eh->elf.other) == STV_DEFAULT
4740                   || eh->elf.root.type != bfd_link_hash_undefweak))
4741             {
4742               /* All the entries we allocated need relocs.
4743                  Except LD only needs one.  */
4744               if ((eh->tls_mask & TLS_LD) != 0)
4745                 need -= 4;
4746               htab->relgot->size += need * (sizeof (Elf32_External_Rela) / 4);
4747             }
4748         }
4749     }
4750   else
4751     eh->elf.got.offset = (bfd_vma) -1;
4752
4753   if (eh->dyn_relocs == NULL)
4754     return TRUE;
4755
4756   /* In the shared -Bsymbolic case, discard space allocated for
4757      dynamic pc-relative relocs against symbols which turn out to be
4758      defined in regular objects.  For the normal shared case, discard
4759      space for relocs that have become local due to symbol visibility
4760      changes.  */
4761
4762   if (info->shared)
4763     {
4764       /* Relocs that use pc_count are those that appear on a call insn,
4765          or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
4766          generated via assembly.  We want calls to protected symbols to
4767          resolve directly to the function rather than going via the plt.
4768          If people want function pointer comparisons to work as expected
4769          then they should avoid writing weird assembly.  */
4770       if (SYMBOL_CALLS_LOCAL (info, h))
4771         {
4772           struct ppc_elf_dyn_relocs **pp;
4773
4774           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
4775             {
4776               p->count -= p->pc_count;
4777               p->pc_count = 0;
4778               if (p->count == 0)
4779                 *pp = p->next;
4780               else
4781                 pp = &p->next;
4782             }
4783         }
4784
4785       /* Also discard relocs on undefined weak syms with non-default
4786          visibility.  */
4787       if (eh->dyn_relocs != NULL
4788           && h->root.type == bfd_link_hash_undefweak)
4789         {
4790           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4791             eh->dyn_relocs = NULL;
4792
4793           /* Make sure undefined weak symbols are output as a dynamic
4794              symbol in PIEs.  */
4795           else if (h->dynindx == -1
4796                    && !h->forced_local)
4797             {
4798               if (! bfd_elf_link_record_dynamic_symbol (info, h))
4799                 return FALSE;
4800             }
4801         }
4802     }
4803   else if (ELIMINATE_COPY_RELOCS)
4804     {
4805       /* For the non-shared case, discard space for relocs against
4806          symbols which turn out to need copy relocs or are not
4807          dynamic.  */
4808
4809       if (!h->non_got_ref
4810           && h->def_dynamic
4811           && !h->def_regular)
4812         {
4813           /* Make sure this symbol is output as a dynamic symbol.
4814              Undefined weak syms won't yet be marked as dynamic.  */
4815           if (h->dynindx == -1
4816               && !h->forced_local)
4817             {
4818               if (! bfd_elf_link_record_dynamic_symbol (info, h))
4819                 return FALSE;
4820             }
4821
4822           /* If that succeeded, we know we'll be keeping all the
4823              relocs.  */
4824           if (h->dynindx != -1)
4825             goto keep;
4826         }
4827
4828       eh->dyn_relocs = NULL;
4829
4830     keep: ;
4831     }
4832
4833   /* Finally, allocate space.  */
4834   for (p = eh->dyn_relocs; p != NULL; p = p->next)
4835     {
4836       asection *sreloc = elf_section_data (p->sec)->sreloc;
4837       sreloc->size += p->count * sizeof (Elf32_External_Rela);
4838     }
4839
4840   return TRUE;
4841 }
4842
4843 /* Find any dynamic relocs that apply to read-only sections.  */
4844
4845 static bfd_boolean
4846 readonly_dynrelocs (struct elf_link_hash_entry *h, void *info)
4847 {
4848   struct ppc_elf_dyn_relocs *p;
4849
4850   if (h->root.type == bfd_link_hash_indirect)
4851     return TRUE;
4852
4853   if (h->root.type == bfd_link_hash_warning)
4854     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4855
4856   for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
4857     {
4858       asection *s = p->sec->output_section;
4859
4860       if (s != NULL
4861           && ((s->flags & (SEC_READONLY | SEC_ALLOC))
4862               == (SEC_READONLY | SEC_ALLOC)))
4863         {
4864           ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
4865
4866           /* Not an error, just cut short the traversal.  */
4867           return FALSE;
4868         }
4869     }
4870   return TRUE;
4871 }
4872
4873 /* Set the sizes of the dynamic sections.  */
4874
4875 static bfd_boolean
4876 ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
4877                                struct bfd_link_info *info)
4878 {
4879   struct ppc_elf_link_hash_table *htab;
4880   asection *s;
4881   bfd_boolean relocs;
4882   bfd *ibfd;
4883
4884 #ifdef DEBUG
4885   fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
4886 #endif
4887
4888   htab = ppc_elf_hash_table (info);
4889   BFD_ASSERT (htab->elf.dynobj != NULL);
4890
4891   if (elf_hash_table (info)->dynamic_sections_created)
4892     {
4893       /* Set the contents of the .interp section to the interpreter.  */
4894       if (info->executable)
4895         {
4896           s = bfd_get_section_by_name (htab->elf.dynobj, ".interp");
4897           BFD_ASSERT (s != NULL);
4898           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4899           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4900         }
4901     }
4902
4903   if (htab->plt_type == PLT_OLD)
4904     htab->got_header_size = 16;
4905   else if (htab->plt_type == PLT_NEW)
4906     htab->got_header_size = 12;
4907
4908   /* Set up .got offsets for local syms, and space for local dynamic
4909      relocs.  */
4910   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4911     {
4912       bfd_signed_vma *local_got;
4913       bfd_signed_vma *end_local_got;
4914       char *lgot_masks;
4915       bfd_size_type locsymcount;
4916       Elf_Internal_Shdr *symtab_hdr;
4917
4918       if (!is_ppc_elf_target (ibfd->xvec))
4919         continue;
4920
4921       for (s = ibfd->sections; s != NULL; s = s->next)
4922         {
4923           struct ppc_elf_dyn_relocs *p;
4924
4925           for (p = ((struct ppc_elf_dyn_relocs *)
4926                     elf_section_data (s)->local_dynrel);
4927                p != NULL;
4928                p = p->next)
4929             {
4930               if (!bfd_is_abs_section (p->sec)
4931                   && bfd_is_abs_section (p->sec->output_section))
4932                 {
4933                   /* Input section has been discarded, either because
4934                      it is a copy of a linkonce section or due to
4935                      linker script /DISCARD/, so we'll be discarding
4936                      the relocs too.  */
4937                 }
4938               else if (p->count != 0)
4939                 {
4940                   elf_section_data (p->sec)->sreloc->size
4941                     += p->count * sizeof (Elf32_External_Rela);
4942                   if ((p->sec->output_section->flags
4943                        & (SEC_READONLY | SEC_ALLOC))
4944                       == (SEC_READONLY | SEC_ALLOC))
4945                     info->flags |= DF_TEXTREL;
4946                 }
4947             }
4948         }
4949
4950       local_got = elf_local_got_refcounts (ibfd);
4951       if (!local_got)
4952         continue;
4953
4954       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4955       locsymcount = symtab_hdr->sh_info;
4956       end_local_got = local_got + locsymcount;
4957       lgot_masks = (char *) end_local_got;
4958       for (; local_got < end_local_got; ++local_got, ++lgot_masks)
4959         if (*local_got > 0)
4960           {
4961             if (*lgot_masks == (TLS_TLS | TLS_LD))
4962               {
4963                 /* If just an LD reloc, we'll just use
4964                    htab->tlsld_got.offset.  */
4965                 htab->tlsld_got.refcount += 1;
4966                 *local_got = (bfd_vma) -1;
4967               }
4968             else
4969               {
4970                 unsigned int need = 0;
4971                 if ((*lgot_masks & TLS_TLS) != 0)
4972                   {
4973                     if ((*lgot_masks & TLS_GD) != 0)
4974                       need += 8;
4975                     if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
4976                       need += 4;
4977                     if ((*lgot_masks & TLS_DTPREL) != 0)
4978                       need += 4;
4979                   }
4980                 else
4981                   need += 4;
4982                 *local_got = allocate_got (htab, need);
4983                 if (info->shared)
4984                   htab->relgot->size += (need
4985                                          * (sizeof (Elf32_External_Rela) / 4));
4986               }
4987           }
4988         else
4989           *local_got = (bfd_vma) -1;
4990     }
4991
4992   /* Allocate space for global sym dynamic relocs.  */
4993   elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
4994
4995   if (htab->tlsld_got.refcount > 0)
4996     {
4997       htab->tlsld_got.offset = allocate_got (htab, 8);
4998       if (info->shared)
4999         htab->relgot->size += sizeof (Elf32_External_Rela);
5000     }
5001   else
5002     htab->tlsld_got.offset = (bfd_vma) -1;
5003
5004   if (htab->got != NULL && htab->plt_type != PLT_VXWORKS)
5005     {
5006       unsigned int g_o_t = 32768;
5007
5008       /* If we haven't allocated the header, do so now.  When we get here,
5009          for old plt/got the got size will be 0 to 32764 (not allocated),
5010          or 32780 to 65536 (header allocated).  For new plt/got, the
5011          corresponding ranges are 0 to 32768 and 32780 to 65536.  */
5012       if (htab->got->size <= 32768)
5013         {
5014           g_o_t = htab->got->size;
5015           if (htab->plt_type == PLT_OLD)
5016             g_o_t += 4;
5017           htab->got->size += htab->got_header_size;
5018         }
5019
5020       htab->elf.hgot->root.u.def.value = g_o_t;
5021     }
5022
5023   if (htab->glink != NULL && htab->glink->size != 0)
5024     {
5025       htab->glink_pltresolve = htab->glink->size;
5026       /* Space for the branch table.  */
5027       htab->glink->size += htab->glink->size / (GLINK_ENTRY_SIZE / 4) - 4;
5028       /* Pad out to align the start of PLTresolve.  */
5029       htab->glink->size += -htab->glink->size & 15;
5030       htab->glink->size += GLINK_PLTRESOLVE;
5031
5032       if (htab->emit_stub_syms)
5033         {
5034           struct elf_link_hash_entry *sh;
5035           sh = elf_link_hash_lookup (&htab->elf, "__glink",
5036                                      TRUE, FALSE, FALSE);
5037           if (sh == NULL)
5038             return FALSE;
5039           if (sh->root.type == bfd_link_hash_new)
5040             {
5041               sh->root.type = bfd_link_hash_defined;
5042               sh->root.u.def.section = htab->glink;
5043               sh->root.u.def.value = htab->glink_pltresolve;
5044               sh->ref_regular = 1;
5045               sh->def_regular = 1;
5046               sh->ref_regular_nonweak = 1;
5047               sh->forced_local = 1;
5048               sh->non_elf = 0;
5049             }
5050           sh = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
5051                                      TRUE, FALSE, FALSE);
5052           if (sh == NULL)
5053             return FALSE;
5054           if (sh->root.type == bfd_link_hash_new)
5055             {
5056               sh->root.type = bfd_link_hash_defined;
5057               sh->root.u.def.section = htab->glink;
5058               sh->root.u.def.value = htab->glink->size - GLINK_PLTRESOLVE;
5059               sh->ref_regular = 1;
5060               sh->def_regular = 1;
5061               sh->ref_regular_nonweak = 1;
5062               sh->forced_local = 1;
5063               sh->non_elf = 0;
5064             }
5065         }
5066     }
5067
5068   /* We've now determined the sizes of the various dynamic sections.
5069      Allocate memory for them.  */
5070   relocs = FALSE;
5071   for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
5072     {
5073       bfd_boolean strip_section = TRUE;
5074
5075       if ((s->flags & SEC_LINKER_CREATED) == 0)
5076         continue;
5077
5078       if (s == htab->plt
5079           || s == htab->glink
5080           || s == htab->got
5081           || s == htab->sgotplt
5082           || s == htab->sbss
5083           || s == htab->dynbss
5084           || s == htab->dynsbss)
5085         {
5086           /* We'd like to strip these sections if they aren't needed, but if
5087              we've exported dynamic symbols from them we must leave them.
5088              It's too late to tell BFD to get rid of the symbols.  */
5089           if ((s == htab->plt || s == htab->got) && htab->elf.hplt != NULL)
5090             strip_section = FALSE;
5091           /* Strip this section if we don't need it; see the
5092              comment below.  */
5093         }
5094       else if (s == htab->sdata[0].section
5095                || s == htab->sdata[1].section)
5096         {
5097           /* Strip these too.  */
5098         }
5099       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
5100         {
5101           if (s->size != 0)
5102             {
5103               /* Remember whether there are any relocation sections.  */
5104               relocs = TRUE;
5105
5106               /* We use the reloc_count field as a counter if we need
5107                  to copy relocs into the output file.  */
5108               s->reloc_count = 0;
5109             }
5110         }
5111       else
5112         {
5113           /* It's not one of our sections, so don't allocate space.  */
5114           continue;
5115         }
5116
5117       if (s->size == 0 && strip_section)
5118         {
5119           /* If we don't need this section, strip it from the
5120              output file.  This is mostly to handle .rela.bss and
5121              .rela.plt.  We must create both sections in
5122              create_dynamic_sections, because they must be created
5123              before the linker maps input sections to output
5124              sections.  The linker does that before
5125              adjust_dynamic_symbol is called, and it is that
5126              function which decides whether anything needs to go
5127              into these sections.  */
5128           s->flags |= SEC_EXCLUDE;
5129           continue;
5130         }
5131
5132       if ((s->flags & SEC_HAS_CONTENTS) == 0)
5133         continue;
5134
5135       /* Allocate memory for the section contents.  */
5136       s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
5137       if (s->contents == NULL)
5138         return FALSE;
5139     }
5140
5141   if (htab->elf.dynamic_sections_created)
5142     {
5143       /* Add some entries to the .dynamic section.  We fill in the
5144          values later, in ppc_elf_finish_dynamic_sections, but we
5145          must add the entries now so that we get the correct size for
5146          the .dynamic section.  The DT_DEBUG entry is filled in by the
5147          dynamic linker and used by the debugger.  */
5148 #define add_dynamic_entry(TAG, VAL) \
5149   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5150
5151       if (info->executable)
5152         {
5153           if (!add_dynamic_entry (DT_DEBUG, 0))
5154             return FALSE;
5155         }
5156
5157       if (htab->plt != NULL && htab->plt->size != 0)
5158         {
5159           if (!add_dynamic_entry (DT_PLTGOT, 0)
5160               || !add_dynamic_entry (DT_PLTRELSZ, 0)
5161               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5162               || !add_dynamic_entry (DT_JMPREL, 0))
5163             return FALSE;
5164         }
5165
5166       if (htab->glink != NULL && htab->glink->size != 0)
5167         {
5168           if (!add_dynamic_entry (DT_PPC_GOT, 0))
5169             return FALSE;
5170         }
5171
5172       if (relocs)
5173         {
5174           if (!add_dynamic_entry (DT_RELA, 0)
5175               || !add_dynamic_entry (DT_RELASZ, 0)
5176               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
5177             return FALSE;
5178         }
5179
5180       /* If any dynamic relocs apply to a read-only section, then we
5181          need a DT_TEXTREL entry.  */
5182       if ((info->flags & DF_TEXTREL) == 0)
5183         elf_link_hash_traverse (elf_hash_table (info), readonly_dynrelocs,
5184                                 info);
5185
5186       if ((info->flags & DF_TEXTREL) != 0)
5187         {
5188           if (!add_dynamic_entry (DT_TEXTREL, 0))
5189             return FALSE;
5190         }
5191     }
5192 #undef add_dynamic_entry
5193
5194   return TRUE;
5195 }
5196 \f
5197 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
5198
5199 static const int shared_stub_entry[] =
5200   {
5201     0x7c0802a6, /* mflr 0 */
5202     0x429f0005, /* bcl 20, 31, .Lxxx */
5203     0x7d6802a6, /* mflr 11 */
5204     0x3d6b0000, /* addis 11, 11, (xxx-.Lxxx)@ha */
5205     0x396b0018, /* addi 11, 11, (xxx-.Lxxx)@l */
5206     0x7c0803a6, /* mtlr 0 */
5207     0x7d6903a6, /* mtctr 11 */
5208     0x4e800420, /* bctr */
5209   };
5210
5211 static const int stub_entry[] =
5212   {
5213     0x3d600000, /* lis 11,xxx@ha */
5214     0x396b0000, /* addi 11,11,xxx@l */
5215     0x7d6903a6, /* mtctr 11 */
5216     0x4e800420, /* bctr */
5217   };
5218
5219 static bfd_boolean
5220 ppc_elf_relax_section (bfd *abfd,
5221                        asection *isec,
5222                        struct bfd_link_info *link_info,
5223                        bfd_boolean *again)
5224 {
5225   struct one_fixup
5226   {
5227     struct one_fixup *next;
5228     asection *tsec;
5229     bfd_vma toff;
5230     bfd_vma trampoff;
5231   };
5232
5233   Elf_Internal_Shdr *symtab_hdr;
5234   bfd_byte *contents = NULL;
5235   Elf_Internal_Sym *isymbuf = NULL;
5236   Elf_Internal_Rela *internal_relocs = NULL;
5237   Elf_Internal_Rela *irel, *irelend;
5238   struct one_fixup *fixups = NULL;
5239   bfd_boolean changed;
5240   struct ppc_elf_link_hash_table *htab;
5241   bfd_size_type trampoff;
5242   asection *got2;
5243
5244   *again = FALSE;
5245
5246   /* Nothing to do if there are no relocations, and no need to do
5247      anything with non-alloc sections.  */
5248   if ((isec->flags & SEC_ALLOC) == 0
5249       || (isec->flags & SEC_RELOC) == 0
5250       || isec->reloc_count == 0)
5251     return TRUE;
5252
5253   trampoff = (isec->size + 3) & (bfd_vma) -4;
5254   /* Space for a branch around any trampolines.  */
5255   trampoff += 4;
5256
5257   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5258
5259   /* Get a copy of the native relocations.  */
5260   internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
5261                                                link_info->keep_memory);
5262   if (internal_relocs == NULL)
5263     goto error_return;
5264
5265   htab = ppc_elf_hash_table (link_info);
5266   got2 = bfd_get_section_by_name (abfd, ".got2");
5267
5268   irelend = internal_relocs + isec->reloc_count;
5269   for (irel = internal_relocs; irel < irelend; irel++)
5270     {
5271       unsigned long r_type = ELF32_R_TYPE (irel->r_info);
5272       bfd_vma symaddr, reladdr, toff, roff;
5273       asection *tsec;
5274       struct one_fixup *f;
5275       size_t insn_offset = 0;
5276       bfd_vma max_branch_offset, val;
5277       bfd_byte *hit_addr;
5278       unsigned long t0;
5279       unsigned char sym_type;
5280
5281       switch (r_type)
5282         {
5283         case R_PPC_REL24:
5284         case R_PPC_LOCAL24PC:
5285         case R_PPC_PLTREL24:
5286           max_branch_offset = 1 << 25;
5287           break;
5288
5289         case R_PPC_REL14:
5290         case R_PPC_REL14_BRTAKEN:
5291         case R_PPC_REL14_BRNTAKEN:
5292           max_branch_offset = 1 << 15;
5293           break;
5294
5295         default:
5296           continue;
5297         }
5298
5299       /* Get the value of the symbol referred to by the reloc.  */
5300       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
5301         {
5302           /* A local symbol.  */
5303           Elf_Internal_Sym *isym;
5304
5305           /* Read this BFD's local symbols.  */
5306           if (isymbuf == NULL)
5307             {
5308               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
5309               if (isymbuf == NULL)
5310                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
5311                                                 symtab_hdr->sh_info, 0,
5312                                                 NULL, NULL, NULL);
5313               if (isymbuf == 0)
5314                 goto error_return;
5315             }
5316           isym = isymbuf + ELF32_R_SYM (irel->r_info);
5317           if (isym->st_shndx == SHN_UNDEF)
5318             continue;   /* We can't do anything with undefined symbols.  */
5319           else if (isym->st_shndx == SHN_ABS)
5320             tsec = bfd_abs_section_ptr;
5321           else if (isym->st_shndx == SHN_COMMON)
5322             tsec = bfd_com_section_ptr;
5323           else
5324             tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
5325
5326           toff = isym->st_value;
5327           sym_type = ELF_ST_TYPE (isym->st_info);
5328         }
5329       else
5330         {
5331           /* Global symbol handling.  */
5332           unsigned long indx;
5333           struct elf_link_hash_entry *h;
5334
5335           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
5336           h = elf_sym_hashes (abfd)[indx];
5337
5338           while (h->root.type == bfd_link_hash_indirect
5339                  || h->root.type == bfd_link_hash_warning)
5340             h = (struct elf_link_hash_entry *) h->root.u.i.link;
5341
5342           tsec = NULL;
5343           toff = 0;
5344           if (r_type == R_PPC_PLTREL24
5345               && htab->plt != NULL)
5346             {
5347               struct plt_entry *ent = find_plt_ent (h, got2, irel->r_addend);
5348
5349               if (ent != NULL)
5350                 {
5351                   if (htab->plt_type == PLT_NEW)
5352                     {
5353                       tsec = htab->glink;
5354                       toff = ent->glink_offset;
5355                     }
5356                   else
5357                     {
5358                       tsec = htab->plt;
5359                       toff = ent->plt.offset;
5360                     }
5361                 }
5362             }
5363           if (tsec != NULL)
5364             ;
5365           else if (h->root.type == bfd_link_hash_defined
5366                    || h->root.type == bfd_link_hash_defweak)
5367             {
5368               tsec = h->root.u.def.section;
5369               toff = h->root.u.def.value;
5370             }
5371           else
5372             continue;
5373
5374           sym_type = h->type;
5375         }
5376
5377       /* If the branch and target are in the same section, you have
5378          no hope of adding stubs.  We'll error out later should the
5379          branch overflow.  */
5380       if (tsec == isec)
5381         continue;
5382
5383       /* There probably isn't any reason to handle symbols in
5384          SEC_MERGE sections;  SEC_MERGE doesn't seem a likely
5385          attribute for a code section, and we are only looking at
5386          branches.  However, implement it correctly here as a
5387          reference for other target relax_section functions.  */
5388       if (0 && tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
5389         {
5390           /* At this stage in linking, no SEC_MERGE symbol has been
5391              adjusted, so all references to such symbols need to be
5392              passed through _bfd_merged_section_offset.  (Later, in
5393              relocate_section, all SEC_MERGE symbols *except* for
5394              section symbols have been adjusted.)
5395
5396              gas may reduce relocations against symbols in SEC_MERGE
5397              sections to a relocation against the section symbol when
5398              the original addend was zero.  When the reloc is against
5399              a section symbol we should include the addend in the
5400              offset passed to _bfd_merged_section_offset, since the
5401              location of interest is the original symbol.  On the
5402              other hand, an access to "sym+addend" where "sym" is not
5403              a section symbol should not include the addend;  Such an
5404              access is presumed to be an offset from "sym";  The
5405              location of interest is just "sym".  */
5406           if (sym_type == STT_SECTION)
5407             toff += irel->r_addend;
5408
5409           toff = _bfd_merged_section_offset (abfd, &tsec,
5410                                              elf_section_data (tsec)->sec_info,
5411                                              toff);
5412
5413           if (sym_type != STT_SECTION)
5414             toff += irel->r_addend;
5415         }
5416       /* PLTREL24 addends are special.  */
5417       else if (r_type != R_PPC_PLTREL24)
5418         toff += irel->r_addend;
5419
5420       /* Attempted -shared link of non-pic code loses.  */
5421       if (tsec->output_section == NULL)
5422         continue;
5423
5424       symaddr = tsec->output_section->vma + tsec->output_offset + toff;
5425
5426       roff = irel->r_offset;
5427       reladdr = isec->output_section->vma + isec->output_offset + roff;
5428
5429       /* If the branch is in range, no need to do anything.  */
5430       if (symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
5431         continue;
5432
5433       /* Look for an existing fixup to this address.  */
5434       for (f = fixups; f ; f = f->next)
5435         if (f->tsec == tsec && f->toff == toff)
5436           break;
5437
5438       if (f == NULL)
5439         {
5440           size_t size;
5441           unsigned long stub_rtype;
5442
5443           val = trampoff - roff;
5444           if (val >= max_branch_offset)
5445             /* Oh dear, we can't reach a trampoline.  Don't try to add
5446                one.  We'll report an error later.  */
5447             continue;
5448
5449           if (link_info->shared)
5450             {
5451               size = 4 * ARRAY_SIZE (shared_stub_entry);
5452               insn_offset = 12;
5453               stub_rtype = R_PPC_RELAX32PC;
5454             }
5455           else
5456             {
5457               size = 4 * ARRAY_SIZE (stub_entry);
5458               insn_offset = 0;
5459               stub_rtype = R_PPC_RELAX32;
5460             }
5461
5462           if (R_PPC_RELAX32_PLT - R_PPC_RELAX32
5463               != R_PPC_RELAX32PC_PLT - R_PPC_RELAX32PC)
5464             abort ();
5465           if (tsec == htab->plt
5466               || tsec == htab->glink)
5467             stub_rtype += R_PPC_RELAX32_PLT - R_PPC_RELAX32;
5468
5469           /* Hijack the old relocation.  Since we need two
5470              relocations for this use a "composite" reloc.  */
5471           irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
5472                                        stub_rtype);
5473           irel->r_offset = trampoff + insn_offset;
5474
5475           /* Record the fixup so we don't do it again this section.  */
5476           f = bfd_malloc (sizeof (*f));
5477           f->next = fixups;
5478           f->tsec = tsec;
5479           f->toff = toff;
5480           f->trampoff = trampoff;
5481           fixups = f;
5482
5483           trampoff += size;
5484         }
5485       else
5486         {
5487           val = f->trampoff - roff;
5488           if (val >= max_branch_offset)
5489             continue;
5490
5491           /* Nop out the reloc, since we're finalizing things here.  */
5492           irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
5493         }
5494
5495       /* Get the section contents.  */
5496       if (contents == NULL)
5497         {
5498           /* Get cached copy if it exists.  */
5499           if (elf_section_data (isec)->this_hdr.contents != NULL)
5500             contents = elf_section_data (isec)->this_hdr.contents;
5501           else
5502             {
5503               /* Go get them off disk.  */
5504               if (!bfd_malloc_and_get_section (abfd, isec, &contents))
5505                 goto error_return;
5506             }
5507         }
5508
5509       /* Fix up the existing branch to hit the trampoline.  */
5510       hit_addr = contents + roff;
5511       switch (r_type)
5512         {
5513         case R_PPC_REL24:
5514         case R_PPC_LOCAL24PC:
5515         case R_PPC_PLTREL24:
5516           t0 = bfd_get_32 (abfd, hit_addr);
5517           t0 &= ~0x3fffffc;
5518           t0 |= val & 0x3fffffc;
5519           bfd_put_32 (abfd, t0, hit_addr);
5520           break;
5521
5522         case R_PPC_REL14:
5523         case R_PPC_REL14_BRTAKEN:
5524         case R_PPC_REL14_BRNTAKEN:
5525           t0 = bfd_get_32 (abfd, hit_addr);
5526           t0 &= ~0xfffc;
5527           t0 |= val & 0xfffc;
5528           bfd_put_32 (abfd, t0, hit_addr);
5529           break;
5530         }
5531     }
5532
5533   /* Write out the trampolines.  */
5534   changed = fixups != NULL;
5535   if (fixups != NULL)
5536     {
5537       const int *stub;
5538       bfd_byte *dest;
5539       bfd_vma val;
5540       int i, size;
5541
5542       do
5543         {
5544           struct one_fixup *f = fixups;
5545           fixups = fixups->next;
5546           free (f);
5547         }
5548       while (fixups);
5549
5550       contents = bfd_realloc (contents, trampoff);
5551       if (contents == NULL)
5552         goto error_return;
5553
5554       isec->size = (isec->size + 3) & (bfd_vma) -4;
5555       /* Branch around the trampolines.  */
5556       val = trampoff - isec->size + 0x48000000;
5557       dest = contents + isec->size;
5558       isec->size = trampoff;
5559       bfd_put_32 (abfd, val, dest);
5560       dest += 4;
5561
5562       if (link_info->shared)
5563         {
5564           stub = shared_stub_entry;
5565           size = ARRAY_SIZE (shared_stub_entry);
5566         }
5567       else
5568         {
5569           stub = stub_entry;
5570           size = ARRAY_SIZE (stub_entry);
5571         }
5572
5573       i = 0;
5574       while (dest < contents + trampoff)
5575         {
5576           bfd_put_32 (abfd, stub[i], dest);
5577           i++;
5578           if (i == size)
5579             i = 0;
5580           dest += 4;
5581         }
5582       BFD_ASSERT (i == 0);
5583     }
5584
5585   if (isymbuf != NULL
5586       && symtab_hdr->contents != (unsigned char *) isymbuf)
5587     {
5588       if (! link_info->keep_memory)
5589         free (isymbuf);
5590       else
5591         {
5592           /* Cache the symbols for elf_link_input_bfd.  */
5593           symtab_hdr->contents = (unsigned char *) isymbuf;
5594         }
5595     }
5596
5597   if (contents != NULL
5598       && elf_section_data (isec)->this_hdr.contents != contents)
5599     {
5600       if (!changed && !link_info->keep_memory)
5601         free (contents);
5602       else
5603         {
5604           /* Cache the section contents for elf_link_input_bfd.  */
5605           elf_section_data (isec)->this_hdr.contents = contents;
5606         }
5607     }
5608
5609   if (elf_section_data (isec)->relocs != internal_relocs)
5610     {
5611       if (!changed)
5612         free (internal_relocs);
5613       else
5614         elf_section_data (isec)->relocs = internal_relocs;
5615     }
5616
5617   *again = changed;
5618   return TRUE;
5619
5620  error_return:
5621   if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
5622     free (isymbuf);
5623   if (contents != NULL
5624       && elf_section_data (isec)->this_hdr.contents != contents)
5625     free (contents);
5626   if (internal_relocs != NULL
5627       && elf_section_data (isec)->relocs != internal_relocs)
5628     free (internal_relocs);
5629   return FALSE;
5630 }
5631 \f
5632 /* What to do when ld finds relocations against symbols defined in
5633    discarded sections.  */
5634
5635 static unsigned int
5636 ppc_elf_action_discarded (asection *sec)
5637 {
5638   if (strcmp (".fixup", sec->name) == 0)
5639     return 0;
5640
5641   if (strcmp (".got2", sec->name) == 0)
5642     return 0;
5643
5644   return _bfd_elf_default_action_discarded (sec);
5645 }
5646 \f
5647 /* Fill in the address for a pointer generated in a linker section.  */
5648
5649 static bfd_vma
5650 elf_finish_pointer_linker_section (bfd *input_bfd,
5651                                    elf_linker_section_t *lsect,
5652                                    struct elf_link_hash_entry *h,
5653                                    bfd_vma relocation,
5654                                    const Elf_Internal_Rela *rel)
5655 {
5656   elf_linker_section_pointers_t *linker_section_ptr;
5657
5658   BFD_ASSERT (lsect != NULL);
5659
5660   if (h != NULL)
5661     {
5662       /* Handle global symbol.  */
5663       struct ppc_elf_link_hash_entry *eh;
5664
5665       eh = (struct ppc_elf_link_hash_entry *) h;
5666       BFD_ASSERT (eh->elf.def_regular);
5667       linker_section_ptr = eh->linker_section_pointer;
5668     }
5669   else
5670     {
5671       /* Handle local symbol.  */
5672       unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
5673
5674       BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
5675       linker_section_ptr = elf_local_ptr_offsets (input_bfd)[r_symndx];
5676     }
5677
5678   linker_section_ptr = elf_find_pointer_linker_section (linker_section_ptr,
5679                                                         rel->r_addend,
5680                                                         lsect);
5681   BFD_ASSERT (linker_section_ptr != NULL);
5682
5683   /* Offset will always be a multiple of four, so use the bottom bit
5684      as a "written" flag.  */
5685   if ((linker_section_ptr->offset & 1) == 0)
5686     {
5687       bfd_put_32 (lsect->section->owner,
5688                   relocation + linker_section_ptr->addend,
5689                   lsect->section->contents + linker_section_ptr->offset);
5690       linker_section_ptr->offset += 1;
5691     }
5692
5693   relocation = (lsect->section->output_offset
5694                 + linker_section_ptr->offset - 1
5695                 - 0x8000);
5696
5697 #ifdef DEBUG
5698   fprintf (stderr,
5699            "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
5700            lsect->name, (long) relocation, (long) relocation);
5701 #endif
5702
5703   /* Subtract out the addend, because it will get added back in by the normal
5704      processing.  */
5705   return relocation - linker_section_ptr->addend;
5706 }
5707
5708 /* The RELOCATE_SECTION function is called by the ELF backend linker
5709    to handle the relocations for a section.
5710
5711    The relocs are always passed as Rela structures; if the section
5712    actually uses Rel structures, the r_addend field will always be
5713    zero.
5714
5715    This function is responsible for adjust the section contents as
5716    necessary, and (if using Rela relocs and generating a
5717    relocatable output file) adjusting the reloc addend as
5718    necessary.
5719
5720    This function does not have to worry about setting the reloc
5721    address or the reloc symbol index.
5722
5723    LOCAL_SYMS is a pointer to the swapped in local symbols.
5724
5725    LOCAL_SECTIONS is an array giving the section in the input file
5726    corresponding to the st_shndx field of each local symbol.
5727
5728    The global hash table entry for the global symbols can be found
5729    via elf_sym_hashes (input_bfd).
5730
5731    When generating relocatable output, this function must handle
5732    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
5733    going to be the section symbol corresponding to the output
5734    section, which means that the addend must be adjusted
5735    accordingly.  */
5736
5737 static bfd_boolean
5738 ppc_elf_relocate_section (bfd *output_bfd,
5739                           struct bfd_link_info *info,
5740                           bfd *input_bfd,
5741                           asection *input_section,
5742                           bfd_byte *contents,
5743                           Elf_Internal_Rela *relocs,
5744                           Elf_Internal_Sym *local_syms,
5745                           asection **local_sections)
5746 {
5747   Elf_Internal_Shdr *symtab_hdr;
5748   struct elf_link_hash_entry **sym_hashes;
5749   struct ppc_elf_link_hash_table *htab;
5750   Elf_Internal_Rela *rel;
5751   Elf_Internal_Rela *relend;
5752   Elf_Internal_Rela outrel;
5753   bfd_byte *loc;
5754   asection *got2, *sreloc = NULL;
5755   bfd_vma *local_got_offsets;
5756   bfd_boolean ret = TRUE;
5757   bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
5758
5759 #ifdef DEBUG
5760   _bfd_error_handler ("ppc_elf_relocate_section called for %B section %A, "
5761                       "%ld relocations%s",
5762                       input_bfd, input_section,
5763                       (long) input_section->reloc_count,
5764                       (info->relocatable) ? " (relocatable)" : "");
5765 #endif
5766
5767   got2 = bfd_get_section_by_name (input_bfd, ".got2");
5768
5769   /* Initialize howto table if not already done.  */
5770   if (!ppc_elf_howto_table[R_PPC_ADDR32])
5771     ppc_elf_howto_init ();
5772
5773   htab = ppc_elf_hash_table (info);
5774   local_got_offsets = elf_local_got_offsets (input_bfd);
5775   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5776   sym_hashes = elf_sym_hashes (input_bfd);
5777   rel = relocs;
5778   relend = relocs + input_section->reloc_count;
5779   for (; rel < relend; rel++)
5780     {
5781       enum elf_ppc_reloc_type r_type;
5782       bfd_vma addend;
5783       bfd_reloc_status_type r;
5784       Elf_Internal_Sym *sym;
5785       asection *sec;
5786       struct elf_link_hash_entry *h;
5787       const char *sym_name;
5788       reloc_howto_type *howto;
5789       unsigned long r_symndx;
5790       bfd_vma relocation;
5791       bfd_vma branch_bit, insn, from;
5792       bfd_boolean unresolved_reloc;
5793       bfd_boolean warned;
5794       unsigned int tls_type, tls_mask, tls_gd;
5795
5796       r_type = ELF32_R_TYPE (rel->r_info);
5797       sym = NULL;
5798       sec = NULL;
5799       h = NULL;
5800       unresolved_reloc = FALSE;
5801       warned = FALSE;
5802       r_symndx = ELF32_R_SYM (rel->r_info);
5803
5804       if (r_symndx < symtab_hdr->sh_info)
5805         {
5806           sym = local_syms + r_symndx;
5807           sec = local_sections[r_symndx];
5808           sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
5809
5810           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
5811         }
5812       else
5813         {
5814           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
5815                                    r_symndx, symtab_hdr, sym_hashes,
5816                                    h, sec, relocation,
5817                                    unresolved_reloc, warned);
5818
5819           sym_name = h->root.root.string;
5820         }
5821
5822       if (sec != NULL && elf_discarded_section (sec))
5823         {
5824           /* For relocs against symbols from removed linkonce sections,
5825              or sections discarded by a linker script, we just want the
5826              section contents zeroed.  Avoid any special processing.  */
5827           howto = NULL;
5828           if (r_type < R_PPC_max)
5829             howto = ppc_elf_howto_table[r_type];
5830           _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
5831           rel->r_info = 0;
5832           rel->r_addend = 0;
5833           continue;
5834         }
5835
5836       if (info->relocatable)
5837         {
5838           if (got2 != NULL
5839               && r_type == R_PPC_PLTREL24
5840               && rel->r_addend >= 32768)
5841             {
5842               /* R_PPC_PLTREL24 is rather special.  If non-zero, the
5843                  addend specifies the GOT pointer offset within .got2.  */
5844               rel->r_addend += got2->output_offset;
5845             }
5846           continue;
5847         }
5848
5849       /* TLS optimizations.  Replace instruction sequences and relocs
5850          based on information we collected in tls_optimize.  We edit
5851          RELOCS so that --emit-relocs will output something sensible
5852          for the final instruction stream.  */
5853       tls_mask = 0;
5854       tls_gd = 0;
5855       if (IS_PPC_TLS_RELOC (r_type))
5856         {
5857           if (h != NULL)
5858             tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
5859           else if (local_got_offsets != NULL)
5860             {
5861               char *lgot_masks;
5862               lgot_masks = (char *) (local_got_offsets + symtab_hdr->sh_info);
5863               tls_mask = lgot_masks[r_symndx];
5864             }
5865         }
5866
5867       /* Ensure reloc mapping code below stays sane.  */
5868       if ((R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TLSGD16 & 3)
5869           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
5870           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
5871           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
5872           || (R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TPREL16 & 3)
5873           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
5874           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
5875           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
5876         abort ();
5877       switch (r_type)
5878         {
5879         default:
5880           break;
5881
5882         case R_PPC_GOT_TPREL16:
5883         case R_PPC_GOT_TPREL16_LO:
5884           if (tls_mask != 0
5885               && (tls_mask & TLS_TPREL) == 0)
5886             {
5887               bfd_vma insn;
5888               insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
5889               insn &= 31 << 21;
5890               insn |= 0x3c020000;       /* addis 0,2,0 */
5891               bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
5892               r_type = R_PPC_TPREL16_HA;
5893               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5894             }
5895           break;
5896
5897         case R_PPC_TLS:
5898           if (tls_mask != 0
5899               && (tls_mask & TLS_TPREL) == 0)
5900             {
5901               bfd_vma insn, rtra;
5902               insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
5903               if ((insn & ((31 << 26) | (31 << 11)))
5904                   == ((31 << 26) | (2 << 11)))
5905                 rtra = insn & ((1 << 26) - (1 << 16));
5906               else if ((insn & ((31 << 26) | (31 << 16)))
5907                        == ((31 << 26) | (2 << 16)))
5908                 rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
5909               else
5910                 abort ();
5911               if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
5912                 /* add -> addi.  */
5913                 insn = 14 << 26;
5914               else if ((insn & (31 << 1)) == 23 << 1
5915                        && ((insn & (31 << 6)) < 14 << 6
5916                            || ((insn & (31 << 6)) >= 16 << 6
5917                                && (insn & (31 << 6)) < 24 << 6)))
5918                 /* load and store indexed -> dform.  */
5919                 insn = (32 | ((insn >> 6) & 31)) << 26;
5920               else if ((insn & (31 << 1)) == 21 << 1
5921                        && (insn & (0x1a << 6)) == 0)
5922                 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
5923                 insn = (((58 | ((insn >> 6) & 4)) << 26)
5924                         | ((insn >> 6) & 1));
5925               else if ((insn & (31 << 1)) == 21 << 1
5926                        && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
5927                 /* lwax -> lwa.  */
5928                 insn = (58 << 26) | 2;
5929               else
5930                 abort ();
5931               insn |= rtra;
5932               bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5933               r_type = R_PPC_TPREL16_LO;
5934               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5935
5936               /* Was PPC_TLS which sits on insn boundary, now
5937                  PPC_TPREL16_LO which is at low-order half-word.  */
5938               rel->r_offset += d_offset;
5939             }
5940           break;
5941
5942         case R_PPC_GOT_TLSGD16_HI:
5943         case R_PPC_GOT_TLSGD16_HA:
5944           tls_gd = TLS_TPRELGD;
5945           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
5946             goto tls_gdld_hi;
5947           break;
5948
5949         case R_PPC_GOT_TLSLD16_HI:
5950         case R_PPC_GOT_TLSLD16_HA:
5951           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
5952             {
5953             tls_gdld_hi:
5954               if ((tls_mask & tls_gd) != 0)
5955                 r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
5956                           + R_PPC_GOT_TPREL16);
5957               else
5958                 {
5959                   bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
5960                   rel->r_offset -= d_offset;
5961                   r_type = R_PPC_NONE;
5962                 }
5963               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5964             }
5965           break;
5966
5967         case R_PPC_GOT_TLSGD16:
5968         case R_PPC_GOT_TLSGD16_LO:
5969           tls_gd = TLS_TPRELGD;
5970           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
5971             goto tls_ldgd_opt;
5972           break;
5973
5974         case R_PPC_GOT_TLSLD16:
5975         case R_PPC_GOT_TLSLD16_LO:
5976           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
5977             {
5978               bfd_vma insn1, insn2;
5979               bfd_vma offset;
5980
5981             tls_ldgd_opt:
5982               offset = rel[1].r_offset;
5983               insn1 = bfd_get_32 (output_bfd,
5984                                   contents + rel->r_offset - d_offset);
5985               if ((tls_mask & tls_gd) != 0)
5986                 {
5987                   /* IE */
5988                   insn1 &= (1 << 26) - 1;
5989                   insn1 |= 32 << 26;    /* lwz */
5990                   insn2 = 0x7c631214;   /* add 3,3,2 */
5991                   rel[1].r_info
5992                     = ELF32_R_INFO (ELF32_R_SYM (rel[1].r_info), R_PPC_NONE);
5993                   rel[1].r_addend = 0;
5994                   r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
5995                             + R_PPC_GOT_TPREL16);
5996                   rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5997                 }
5998               else
5999                 {
6000                   /* LE */
6001                   insn1 = 0x3c620000;   /* addis 3,2,0 */
6002                   insn2 = 0x38630000;   /* addi 3,3,0 */
6003                   if (tls_gd == 0)
6004                     {
6005                       /* Was an LD reloc.  */
6006                       r_symndx = 0;
6007                       rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
6008                     }
6009                   r_type = R_PPC_TPREL16_HA;
6010                   rel->r_info = ELF32_R_INFO (r_symndx, r_type);
6011                   rel[1].r_info = ELF32_R_INFO (r_symndx,
6012                                                 R_PPC_TPREL16_LO);
6013                   rel[1].r_offset += d_offset;
6014                   rel[1].r_addend = rel->r_addend;
6015                 }
6016               bfd_put_32 (output_bfd, insn1,
6017                           contents + rel->r_offset - d_offset);
6018               bfd_put_32 (output_bfd, insn2, contents + offset);
6019               if (tls_gd == 0)
6020                 {
6021                   /* We changed the symbol on an LD reloc.  Start over
6022                      in order to get h, sym, sec etc. right.  */
6023                   rel--;
6024                   continue;
6025                 }
6026             }
6027           break;
6028         }
6029
6030       /* Handle other relocations that tweak non-addend part of insn.  */
6031       branch_bit = 0;
6032       switch (r_type)
6033         {
6034         default:
6035           break;
6036
6037           /* Branch taken prediction relocations.  */
6038         case R_PPC_ADDR14_BRTAKEN:
6039         case R_PPC_REL14_BRTAKEN:
6040           branch_bit = BRANCH_PREDICT_BIT;
6041           /* Fall thru */
6042
6043           /* Branch not taken prediction relocations.  */
6044         case R_PPC_ADDR14_BRNTAKEN:
6045         case R_PPC_REL14_BRNTAKEN:
6046           insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
6047           insn &= ~BRANCH_PREDICT_BIT;
6048           insn |= branch_bit;
6049
6050           from = (rel->r_offset
6051                   + input_section->output_offset
6052                   + input_section->output_section->vma);
6053
6054           /* Invert 'y' bit if not the default.  */
6055           if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
6056             insn ^= BRANCH_PREDICT_BIT;
6057
6058           bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
6059           break;
6060         }
6061
6062       addend = rel->r_addend;
6063       tls_type = 0;
6064       howto = NULL;
6065       if (r_type < R_PPC_max)
6066         howto = ppc_elf_howto_table[r_type];
6067       switch (r_type)
6068         {
6069         default:
6070           (*_bfd_error_handler)
6071             (_("%B: unknown relocation type %d for symbol %s"),
6072              input_bfd, (int) r_type, sym_name);
6073
6074           bfd_set_error (bfd_error_bad_value);
6075           ret = FALSE;
6076           continue;
6077
6078         case R_PPC_NONE:
6079         case R_PPC_TLS:
6080         case R_PPC_EMB_MRKREF:
6081         case R_PPC_GNU_VTINHERIT:
6082         case R_PPC_GNU_VTENTRY:
6083           continue;
6084
6085           /* GOT16 relocations.  Like an ADDR16 using the symbol's
6086              address in the GOT as relocation value instead of the
6087              symbol's value itself.  Also, create a GOT entry for the
6088              symbol and put the symbol value there.  */
6089         case R_PPC_GOT_TLSGD16:
6090         case R_PPC_GOT_TLSGD16_LO:
6091         case R_PPC_GOT_TLSGD16_HI:
6092         case R_PPC_GOT_TLSGD16_HA:
6093           tls_type = TLS_TLS | TLS_GD;
6094           goto dogot;
6095
6096         case R_PPC_GOT_TLSLD16:
6097         case R_PPC_GOT_TLSLD16_LO:
6098         case R_PPC_GOT_TLSLD16_HI:
6099         case R_PPC_GOT_TLSLD16_HA:
6100           tls_type = TLS_TLS | TLS_LD;
6101           goto dogot;
6102
6103         case R_PPC_GOT_TPREL16:
6104         case R_PPC_GOT_TPREL16_LO:
6105         case R_PPC_GOT_TPREL16_HI:
6106         case R_PPC_GOT_TPREL16_HA:
6107           tls_type = TLS_TLS | TLS_TPREL;
6108           goto dogot;
6109
6110         case R_PPC_GOT_DTPREL16:
6111         case R_PPC_GOT_DTPREL16_LO:
6112         case R_PPC_GOT_DTPREL16_HI:
6113         case R_PPC_GOT_DTPREL16_HA:
6114           tls_type = TLS_TLS | TLS_DTPREL;
6115           goto dogot;
6116
6117         case R_PPC_GOT16:
6118         case R_PPC_GOT16_LO:
6119         case R_PPC_GOT16_HI:
6120         case R_PPC_GOT16_HA:
6121         dogot:
6122           {
6123             /* Relocation is to the entry for this symbol in the global
6124                offset table.  */
6125             bfd_vma off;
6126             bfd_vma *offp;
6127             unsigned long indx;
6128
6129             if (htab->got == NULL)
6130               abort ();
6131
6132             indx = 0;
6133             if (tls_type == (TLS_TLS | TLS_LD)
6134                 && (h == NULL
6135                     || !h->def_dynamic))
6136               offp = &htab->tlsld_got.offset;
6137             else if (h != NULL)
6138               {
6139                 bfd_boolean dyn;
6140                 dyn = htab->elf.dynamic_sections_created;
6141                 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
6142                     || (info->shared
6143                         && SYMBOL_REFERENCES_LOCAL (info, h)))
6144                   /* This is actually a static link, or it is a
6145                      -Bsymbolic link and the symbol is defined
6146                      locally, or the symbol was forced to be local
6147                      because of a version file.  */
6148                   ;
6149                 else
6150                   {
6151                     indx = h->dynindx;
6152                     unresolved_reloc = FALSE;
6153                   }
6154                 offp = &h->got.offset;
6155               }
6156             else
6157               {
6158                 if (local_got_offsets == NULL)
6159                   abort ();
6160                 offp = &local_got_offsets[r_symndx];
6161               }
6162
6163             /* The offset must always be a multiple of 4.  We use the
6164                least significant bit to record whether we have already
6165                processed this entry.  */
6166             off = *offp;
6167             if ((off & 1) != 0)
6168               off &= ~1;
6169             else
6170               {
6171                 unsigned int tls_m = (tls_mask
6172                                       & (TLS_LD | TLS_GD | TLS_DTPREL
6173                                          | TLS_TPREL | TLS_TPRELGD));
6174
6175                 if (offp == &htab->tlsld_got.offset)
6176                   tls_m = TLS_LD;
6177                 else if (h == NULL
6178                          || !h->def_dynamic)
6179                   tls_m &= ~TLS_LD;
6180
6181                 /* We might have multiple got entries for this sym.
6182                    Initialize them all.  */
6183                 do
6184                   {
6185                     int tls_ty = 0;
6186
6187                     if ((tls_m & TLS_LD) != 0)
6188                       {
6189                         tls_ty = TLS_TLS | TLS_LD;
6190                         tls_m &= ~TLS_LD;
6191                       }
6192                     else if ((tls_m & TLS_GD) != 0)
6193                       {
6194                         tls_ty = TLS_TLS | TLS_GD;
6195                         tls_m &= ~TLS_GD;
6196                       }
6197                     else if ((tls_m & TLS_DTPREL) != 0)
6198                       {
6199                         tls_ty = TLS_TLS | TLS_DTPREL;
6200                         tls_m &= ~TLS_DTPREL;
6201                       }
6202                     else if ((tls_m & (TLS_TPREL | TLS_TPRELGD)) != 0)
6203                       {
6204                         tls_ty = TLS_TLS | TLS_TPREL;
6205                         tls_m = 0;
6206                       }
6207
6208                     /* Generate relocs for the dynamic linker.  */
6209                     if ((info->shared || indx != 0)
6210                         && (h == NULL
6211                             || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6212                             || h->root.type != bfd_link_hash_undefweak))
6213                       {
6214                         outrel.r_offset = (htab->got->output_section->vma
6215                                            + htab->got->output_offset
6216                                            + off);
6217                         outrel.r_addend = 0;
6218                         if (tls_ty & (TLS_LD | TLS_GD))
6219                           {
6220                             outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
6221                             if (tls_ty == (TLS_TLS | TLS_GD))
6222                               {
6223                                 loc = htab->relgot->contents;
6224                                 loc += (htab->relgot->reloc_count++
6225                                         * sizeof (Elf32_External_Rela));
6226                                 bfd_elf32_swap_reloca_out (output_bfd,
6227                                                            &outrel, loc);
6228                                 outrel.r_offset += 4;
6229                                 outrel.r_info
6230                                   = ELF32_R_INFO (indx, R_PPC_DTPREL32);
6231                               }
6232                           }
6233                         else if (tls_ty == (TLS_TLS | TLS_DTPREL))
6234                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
6235                         else if (tls_ty == (TLS_TLS | TLS_TPREL))
6236                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
6237                         else if (indx == 0)
6238                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_RELATIVE);
6239                         else
6240                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
6241                         if (indx == 0)
6242                           {
6243                             outrel.r_addend += relocation;
6244                             if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
6245                               outrel.r_addend -= htab->elf.tls_sec->vma;
6246                           }
6247                         loc = htab->relgot->contents;
6248                         loc += (htab->relgot->reloc_count++
6249                                 * sizeof (Elf32_External_Rela));
6250                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
6251                       }
6252
6253                     /* Init the .got section contents if we're not
6254                        emitting a reloc.  */
6255                     else
6256                       {
6257                         bfd_vma value = relocation;
6258
6259                         if (tls_ty == (TLS_TLS | TLS_LD))
6260                           value = 1;
6261                         else if (tls_ty != 0)
6262                           {
6263                             value -= htab->elf.tls_sec->vma + DTP_OFFSET;
6264                             if (tls_ty == (TLS_TLS | TLS_TPREL))
6265                               value += DTP_OFFSET - TP_OFFSET;
6266
6267                             if (tls_ty == (TLS_TLS | TLS_GD))
6268                               {
6269                                 bfd_put_32 (output_bfd, value,
6270                                             htab->got->contents + off + 4);
6271                                 value = 1;
6272                               }
6273                           }
6274                         bfd_put_32 (output_bfd, value,
6275                                     htab->got->contents + off);
6276                       }
6277
6278                     off += 4;
6279                     if (tls_ty & (TLS_LD | TLS_GD))
6280                       off += 4;
6281                   }
6282                 while (tls_m != 0);
6283
6284                 off = *offp;
6285                 *offp = off | 1;
6286               }
6287
6288             if (off >= (bfd_vma) -2)
6289               abort ();
6290
6291             if ((tls_type & TLS_TLS) != 0)
6292               {
6293                 if (tls_type != (TLS_TLS | TLS_LD))
6294                   {
6295                     if ((tls_mask & TLS_LD) != 0
6296                         && !(h == NULL
6297                              || !h->def_dynamic))
6298                       off += 8;
6299                     if (tls_type != (TLS_TLS | TLS_GD))
6300                       {
6301                         if ((tls_mask & TLS_GD) != 0)
6302                           off += 8;
6303                         if (tls_type != (TLS_TLS | TLS_DTPREL))
6304                           {
6305                             if ((tls_mask & TLS_DTPREL) != 0)
6306                               off += 4;
6307                           }
6308                       }
6309                   }
6310               }
6311
6312             relocation = htab->got->output_offset + off;
6313             relocation -= htab->elf.hgot->root.u.def.value;
6314
6315             /* Addends on got relocations don't make much sense.
6316                x+off@got is actually x@got+off, and since the got is
6317                generated by a hash table traversal, the value in the
6318                got at entry m+n bears little relation to the entry m.  */
6319             if (addend != 0)
6320               (*_bfd_error_handler)
6321                 (_("%B(%A+0x%lx): non-zero addend on %s reloc against `%s'"),
6322                  input_bfd,
6323                  input_section,
6324                  (long) rel->r_offset,
6325                  howto->name,
6326                  sym_name);
6327           }
6328         break;
6329
6330         /* Relocations that need no special processing.  */
6331         case R_PPC_LOCAL24PC:
6332           /* It makes no sense to point a local relocation
6333              at a symbol not in this object.  */
6334           if (unresolved_reloc)
6335             {
6336               if (! (*info->callbacks->undefined_symbol) (info,
6337                                                           h->root.root.string,
6338                                                           input_bfd,
6339                                                           input_section,
6340                                                           rel->r_offset,
6341                                                           TRUE))
6342                 return FALSE;
6343               continue;
6344             }
6345           break;
6346
6347         case R_PPC_DTPREL16:
6348         case R_PPC_DTPREL16_LO:
6349         case R_PPC_DTPREL16_HI:
6350         case R_PPC_DTPREL16_HA:
6351           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
6352           break;
6353
6354           /* Relocations that may need to be propagated if this is a shared
6355              object.  */
6356         case R_PPC_TPREL16:
6357         case R_PPC_TPREL16_LO:
6358         case R_PPC_TPREL16_HI:
6359         case R_PPC_TPREL16_HA:
6360           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
6361           /* The TPREL16 relocs shouldn't really be used in shared
6362              libs as they will result in DT_TEXTREL being set, but
6363              support them anyway.  */
6364           goto dodyn;
6365
6366         case R_PPC_TPREL32:
6367           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
6368           goto dodyn;
6369
6370         case R_PPC_DTPREL32:
6371           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
6372           goto dodyn;
6373
6374         case R_PPC_DTPMOD32:
6375           relocation = 1;
6376           addend = 0;
6377           goto dodyn;
6378
6379         case R_PPC_REL16:
6380         case R_PPC_REL16_LO:
6381         case R_PPC_REL16_HI:
6382         case R_PPC_REL16_HA:
6383           break;
6384
6385         case R_PPC_REL24:
6386         case R_PPC_REL32:
6387         case R_PPC_REL14:
6388         case R_PPC_REL14_BRTAKEN:
6389         case R_PPC_REL14_BRNTAKEN:
6390           /* If these relocations are not to a named symbol, they can be
6391              handled right here, no need to bother the dynamic linker.  */
6392           if (SYMBOL_REFERENCES_LOCAL (info, h)
6393               || h == htab->elf.hgot)
6394             break;
6395           /* fall through */
6396
6397           /* Relocations that always need to be propagated if this is a shared
6398              object.  */
6399         case R_PPC_ADDR32:
6400         case R_PPC_ADDR24:
6401         case R_PPC_ADDR16:
6402         case R_PPC_ADDR16_LO:
6403         case R_PPC_ADDR16_HI:
6404         case R_PPC_ADDR16_HA:
6405         case R_PPC_ADDR14:
6406         case R_PPC_ADDR14_BRTAKEN:
6407         case R_PPC_ADDR14_BRNTAKEN:
6408         case R_PPC_UADDR32:
6409         case R_PPC_UADDR16:
6410         dodyn:
6411           if ((input_section->flags & SEC_ALLOC) == 0)
6412             break;
6413           /* Fall thru.  */
6414
6415           if ((info->shared
6416                && (h == NULL
6417                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6418                    || h->root.type != bfd_link_hash_undefweak)
6419                && (MUST_BE_DYN_RELOC (r_type)
6420                    || !SYMBOL_CALLS_LOCAL (info, h)))
6421               || (ELIMINATE_COPY_RELOCS
6422                   && !info->shared
6423                   && h != NULL
6424                   && h->dynindx != -1
6425                   && !h->non_got_ref
6426                   && h->def_dynamic
6427                   && !h->def_regular))
6428             {
6429               int skip;
6430
6431 #ifdef DEBUG
6432               fprintf (stderr, "ppc_elf_relocate_section needs to "
6433                        "create relocation for %s\n",
6434                        (h && h->root.root.string
6435                         ? h->root.root.string : "<unknown>"));
6436 #endif
6437
6438               /* When generating a shared object, these relocations
6439                  are copied into the output file to be resolved at run
6440                  time.  */
6441               if (sreloc == NULL)
6442                 {
6443                   const char *name;
6444
6445                   name = (bfd_elf_string_from_elf_section
6446                           (input_bfd,
6447                            elf_elfheader (input_bfd)->e_shstrndx,
6448                            elf_section_data (input_section)->rel_hdr.sh_name));
6449                   if (name == NULL)
6450                     return FALSE;
6451
6452                   BFD_ASSERT (CONST_STRNEQ (name, ".rela")
6453                               && strcmp (bfd_get_section_name (input_bfd,
6454                                                                input_section),
6455                                          name + 5) == 0);
6456
6457                   sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
6458                   BFD_ASSERT (sreloc != NULL);
6459                 }
6460
6461               skip = 0;
6462
6463               outrel.r_offset =
6464                 _bfd_elf_section_offset (output_bfd, info, input_section,
6465                                          rel->r_offset);
6466               if (outrel.r_offset == (bfd_vma) -1
6467                   || outrel.r_offset == (bfd_vma) -2)
6468                 skip = (int) outrel.r_offset;
6469               outrel.r_offset += (input_section->output_section->vma
6470                                   + input_section->output_offset);
6471
6472               if (skip)
6473                 memset (&outrel, 0, sizeof outrel);
6474               else if (!SYMBOL_REFERENCES_LOCAL (info, h))
6475                 {
6476                   unresolved_reloc = FALSE;
6477                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
6478                   outrel.r_addend = rel->r_addend;
6479                 }
6480               else
6481                 {
6482                   outrel.r_addend = relocation + rel->r_addend;
6483
6484                   if (r_type == R_PPC_ADDR32)
6485                     outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
6486                   else
6487                     {
6488                       long indx;
6489
6490                       if (bfd_is_abs_section (sec))
6491                         indx = 0;
6492                       else if (sec == NULL || sec->owner == NULL)
6493                         {
6494                           bfd_set_error (bfd_error_bad_value);
6495                           return FALSE;
6496                         }
6497                       else
6498                         {
6499                           asection *osec;
6500
6501                           /* We are turning this relocation into one
6502                              against a section symbol.  It would be
6503                              proper to subtract the symbol's value,
6504                              osec->vma, from the emitted reloc addend,
6505                              but ld.so expects buggy relocs.  */
6506                           osec = sec->output_section;
6507                           indx = elf_section_data (osec)->dynindx;
6508                           if (indx == 0)
6509                             {
6510                               osec = htab->elf.text_index_section;
6511                               indx = elf_section_data (osec)->dynindx;
6512                             }
6513                           BFD_ASSERT (indx != 0);
6514 #ifdef DEBUG
6515                           if (indx == 0)
6516                             printf ("indx=%ld section=%s flags=%08x name=%s\n",
6517                                     indx, osec->name, osec->flags,
6518                                     h->root.root.string);
6519 #endif
6520                         }
6521
6522                       outrel.r_info = ELF32_R_INFO (indx, r_type);
6523                     }
6524                 }
6525
6526               loc = sreloc->contents;
6527               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
6528               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
6529
6530               if (skip == -1)
6531                 continue;
6532
6533               /* This reloc will be computed at runtime.  We clear the memory
6534                  so that it contains predictable value.  */
6535               if (! skip
6536                   && ((input_section->flags & SEC_ALLOC) != 0
6537                       || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
6538                 {
6539                   relocation = howto->pc_relative ? outrel.r_offset : 0;
6540                   addend = 0;
6541                   break;
6542                 }
6543             }
6544           break;
6545
6546         case R_PPC_RELAX32PC_PLT:
6547         case R_PPC_RELAX32_PLT:
6548           {
6549             struct plt_entry *ent = find_plt_ent (h, got2, addend);
6550
6551             if (htab->plt_type == PLT_NEW)
6552               relocation = (htab->glink->output_section->vma
6553                             + htab->glink->output_offset
6554                             + ent->glink_offset);
6555             else
6556               relocation = (htab->plt->output_section->vma
6557                             + htab->plt->output_offset
6558                             + ent->plt.offset);
6559             addend = 0;
6560           }
6561           if (r_type == R_PPC_RELAX32_PLT)
6562             goto relax32;
6563           /* Fall thru */
6564
6565         case R_PPC_RELAX32PC:
6566           relocation -= (input_section->output_section->vma
6567                          + input_section->output_offset
6568                          + rel->r_offset - 4);
6569           /* Fall thru */
6570
6571         case R_PPC_RELAX32:
6572         relax32:
6573           {
6574             unsigned long t0;
6575             unsigned long t1;
6576
6577             t0 = bfd_get_32 (output_bfd, contents + rel->r_offset);
6578             t1 = bfd_get_32 (output_bfd, contents + rel->r_offset + 4);
6579
6580             /* We're clearing the bits for R_PPC_ADDR16_HA
6581                and R_PPC_ADDR16_LO here.  */
6582             t0 &= ~0xffff;
6583             t1 &= ~0xffff;
6584
6585             /* t0 is HA, t1 is LO */
6586             relocation += addend;
6587             t0 |= ((relocation + 0x8000) >> 16) & 0xffff;
6588             t1 |= relocation & 0xffff;
6589
6590             bfd_put_32 (output_bfd, t0, contents + rel->r_offset);
6591             bfd_put_32 (output_bfd, t1, contents + rel->r_offset + 4);
6592           }
6593           continue;
6594
6595           /* Indirect .sdata relocation.  */
6596         case R_PPC_EMB_SDAI16:
6597           BFD_ASSERT (htab->sdata[0].section != NULL);
6598           relocation
6599             = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[0],
6600                                                  h, relocation, rel);
6601           break;
6602
6603           /* Indirect .sdata2 relocation.  */
6604         case R_PPC_EMB_SDA2I16:
6605           BFD_ASSERT (htab->sdata[1].section != NULL);
6606           relocation
6607             = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[1],
6608                                                  h, relocation, rel);
6609           break;
6610
6611           /* Handle the TOC16 reloc.  We want to use the offset within the .got
6612              section, not the actual VMA.  This is appropriate when generating
6613              an embedded ELF object, for which the .got section acts like the
6614              AIX .toc section.  */
6615         case R_PPC_TOC16:                       /* phony GOT16 relocations */
6616           BFD_ASSERT (sec != NULL);
6617           BFD_ASSERT (bfd_is_und_section (sec)
6618                       || strcmp (bfd_get_section_name (abfd, sec), ".got") == 0
6619                       || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0);
6620
6621             addend -= sec->output_section->vma + sec->output_offset + 0x8000;
6622           break;
6623
6624         case R_PPC_PLTREL24:
6625           /* Relocation is to the entry for this symbol in the
6626              procedure linkage table.  */
6627           {
6628             struct plt_entry *ent = find_plt_ent (h, got2, addend);
6629
6630             addend = 0;
6631             if (ent == NULL
6632                 || htab->plt == NULL)
6633               {
6634                 /* We didn't make a PLT entry for this symbol.  This
6635                    happens when statically linking PIC code, or when
6636                    using -Bsymbolic.  */
6637                 break;
6638               }
6639
6640             unresolved_reloc = FALSE;
6641             if (htab->plt_type == PLT_NEW)
6642               relocation = (htab->glink->output_section->vma
6643                             + htab->glink->output_offset
6644                             + ent->glink_offset);
6645             else
6646               relocation = (htab->plt->output_section->vma
6647                             + htab->plt->output_offset
6648                             + ent->plt.offset);
6649           }
6650           break;
6651
6652           /* Relocate against _SDA_BASE_.  */
6653         case R_PPC_SDAREL16:
6654           {
6655             const char *name;
6656             struct elf_link_hash_entry *sh;
6657
6658             BFD_ASSERT (sec != NULL);
6659             name = bfd_get_section_name (abfd, sec->output_section);
6660             if (! ((CONST_STRNEQ (name, ".sdata")
6661                     && (name[6] == 0 || name[6] == '.'))
6662                    || (CONST_STRNEQ (name, ".sbss")
6663                        && (name[5] == 0 || name[5] == '.'))))
6664               {
6665                 (*_bfd_error_handler)
6666                   (_("%B: the target (%s) of a %s relocation is "
6667                      "in the wrong output section (%s)"),
6668                    input_bfd,
6669                    sym_name,
6670                    howto->name,
6671                    name);
6672               }
6673             sh = htab->sdata[0].sym;
6674             addend -= (sh->root.u.def.value
6675                        + sh->root.u.def.section->output_offset
6676                        + sh->root.u.def.section->output_section->vma);
6677           }
6678           break;
6679
6680           /* Relocate against _SDA2_BASE_.  */
6681         case R_PPC_EMB_SDA2REL:
6682           {
6683             const char *name;
6684             struct elf_link_hash_entry *sh;
6685
6686             BFD_ASSERT (sec != NULL);
6687             name = bfd_get_section_name (abfd, sec->output_section);
6688             if (! (CONST_STRNEQ (name, ".sdata2")
6689                    || CONST_STRNEQ (name, ".sbss2")))
6690               {
6691                 (*_bfd_error_handler)
6692                   (_("%B: the target (%s) of a %s relocation is "
6693                      "in the wrong output section (%s)"),
6694                    input_bfd,
6695                    sym_name,
6696                    howto->name,
6697                    name);
6698
6699                 bfd_set_error (bfd_error_bad_value);
6700                 ret = FALSE;
6701                 continue;
6702               }
6703             sh = htab->sdata[1].sym;
6704             addend -= (sh->root.u.def.value
6705                        + sh->root.u.def.section->output_offset
6706                        + sh->root.u.def.section->output_section->vma);
6707           }
6708           break;
6709
6710           /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0.  */
6711         case R_PPC_EMB_SDA21:
6712         case R_PPC_EMB_RELSDA:
6713           {
6714             const char *name;
6715             int reg;
6716             struct elf_link_hash_entry *sh;
6717
6718             BFD_ASSERT (sec != NULL);
6719             name = bfd_get_section_name (abfd, sec->output_section);
6720             if (((CONST_STRNEQ (name, ".sdata")
6721                   && (name[6] == 0 || name[6] == '.'))
6722                  || (CONST_STRNEQ (name, ".sbss")
6723                      && (name[5] == 0 || name[5] == '.'))))
6724               {
6725                 reg = 13;
6726                 sh = htab->sdata[0].sym;
6727                 addend -= (sh->root.u.def.value
6728                            + sh->root.u.def.section->output_offset
6729                            + sh->root.u.def.section->output_section->vma);
6730               }
6731
6732             else if (CONST_STRNEQ (name, ".sdata2")
6733                      || CONST_STRNEQ (name, ".sbss2"))
6734               {
6735                 reg = 2;
6736                 sh = htab->sdata[1].sym;
6737                 addend -= (sh->root.u.def.value
6738                            + sh->root.u.def.section->output_offset
6739                            + sh->root.u.def.section->output_section->vma);
6740               }
6741
6742             else if (strcmp (name, ".PPC.EMB.sdata0") == 0
6743                      || strcmp (name, ".PPC.EMB.sbss0") == 0)
6744               {
6745                 reg = 0;
6746               }
6747
6748             else
6749               {
6750                 (*_bfd_error_handler)
6751                   (_("%B: the target (%s) of a %s relocation is "
6752                      "in the wrong output section (%s)"),
6753                    input_bfd,
6754                    sym_name,
6755                    howto->name,
6756                    name);
6757
6758                 bfd_set_error (bfd_error_bad_value);
6759                 ret = FALSE;
6760                 continue;
6761               }
6762
6763             if (r_type == R_PPC_EMB_SDA21)
6764               {                 /* fill in register field */
6765                 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
6766                 insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
6767                 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
6768               }
6769           }
6770           break;
6771
6772           /* Relocate against the beginning of the section.  */
6773         case R_PPC_SECTOFF:
6774         case R_PPC_SECTOFF_LO:
6775         case R_PPC_SECTOFF_HI:
6776         case R_PPC_SECTOFF_HA:
6777           BFD_ASSERT (sec != NULL);
6778           addend -= sec->output_section->vma;
6779           break;
6780
6781           /* Negative relocations.  */
6782         case R_PPC_EMB_NADDR32:
6783         case R_PPC_EMB_NADDR16:
6784         case R_PPC_EMB_NADDR16_LO:
6785         case R_PPC_EMB_NADDR16_HI:
6786         case R_PPC_EMB_NADDR16_HA:
6787           addend -= 2 * relocation;
6788           break;
6789
6790         case R_PPC_COPY:
6791         case R_PPC_GLOB_DAT:
6792         case R_PPC_JMP_SLOT:
6793         case R_PPC_RELATIVE:
6794         case R_PPC_PLT32:
6795         case R_PPC_PLTREL32:
6796         case R_PPC_PLT16_LO:
6797         case R_PPC_PLT16_HI:
6798         case R_PPC_PLT16_HA:
6799         case R_PPC_ADDR30:
6800         case R_PPC_EMB_RELSEC16:
6801         case R_PPC_EMB_RELST_LO:
6802         case R_PPC_EMB_RELST_HI:
6803         case R_PPC_EMB_RELST_HA:
6804         case R_PPC_EMB_BIT_FLD:
6805           (*_bfd_error_handler)
6806             (_("%B: relocation %s is not yet supported for symbol %s."),
6807              input_bfd,
6808              howto->name,
6809              sym_name);
6810
6811           bfd_set_error (bfd_error_invalid_operation);
6812           ret = FALSE;
6813           continue;
6814         }
6815
6816       /* Do any further special processing.  */
6817       switch (r_type)
6818         {
6819         default:
6820           break;
6821
6822         case R_PPC_ADDR16_HA:
6823         case R_PPC_REL16_HA:
6824         case R_PPC_SECTOFF_HA:
6825         case R_PPC_TPREL16_HA:
6826         case R_PPC_DTPREL16_HA:
6827         case R_PPC_EMB_NADDR16_HA:
6828         case R_PPC_EMB_RELST_HA:
6829           /* It's just possible that this symbol is a weak symbol
6830              that's not actually defined anywhere.  In that case,
6831              'sec' would be NULL, and we should leave the symbol
6832              alone (it will be set to zero elsewhere in the link).  */
6833           if (sec == NULL)
6834             break;
6835           /* Fall thru */
6836
6837         case R_PPC_PLT16_HA:
6838         case R_PPC_GOT16_HA:
6839         case R_PPC_GOT_TLSGD16_HA:
6840         case R_PPC_GOT_TLSLD16_HA:
6841         case R_PPC_GOT_TPREL16_HA:
6842         case R_PPC_GOT_DTPREL16_HA:
6843           /* Add 0x10000 if sign bit in 0:15 is set.
6844              Bits 0:15 are not used.  */
6845           addend += 0x8000;
6846           break;
6847         }
6848
6849 #ifdef DEBUG
6850       fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
6851                "offset = %ld, addend = %ld\n",
6852                howto->name,
6853                (int) r_type,
6854                sym_name,
6855                r_symndx,
6856                (long) rel->r_offset,
6857                (long) addend);
6858 #endif
6859
6860       if (unresolved_reloc
6861           && !((input_section->flags & SEC_DEBUGGING) != 0
6862                && h->def_dynamic))
6863         {
6864           (*_bfd_error_handler)
6865             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
6866              input_bfd,
6867              input_section,
6868              (long) rel->r_offset,
6869              howto->name,
6870              sym_name);
6871           ret = FALSE;
6872         }
6873
6874       r = _bfd_final_link_relocate (howto,
6875                                     input_bfd,
6876                                     input_section,
6877                                     contents,
6878                                     rel->r_offset,
6879                                     relocation,
6880                                     addend);
6881
6882       if (r != bfd_reloc_ok)
6883         {
6884           if (r == bfd_reloc_overflow)
6885             {
6886               if (warned)
6887                 continue;
6888               if (h != NULL
6889                   && h->root.type == bfd_link_hash_undefweak
6890                   && howto->pc_relative)
6891                 {
6892                   /* Assume this is a call protected by other code that
6893                      detect the symbol is undefined.  If this is the case,
6894                      we can safely ignore the overflow.  If not, the
6895                      program is hosed anyway, and a little warning isn't
6896                      going to help.  */
6897
6898                   continue;
6899                 }
6900
6901               if (! (*info->callbacks->reloc_overflow) (info,
6902                                                         (h ? &h->root : NULL),
6903                                                         sym_name,
6904                                                         howto->name,
6905                                                         rel->r_addend,
6906                                                         input_bfd,
6907                                                         input_section,
6908                                                         rel->r_offset))
6909                 return FALSE;
6910             }
6911           else
6912             {
6913               (*_bfd_error_handler)
6914                 (_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
6915                  input_bfd, input_section,
6916                  (long) rel->r_offset, howto->name, sym_name, (int) r);
6917               ret = FALSE;
6918             }
6919         }
6920     }
6921
6922 #ifdef DEBUG
6923   fprintf (stderr, "\n");
6924 #endif
6925
6926   return ret;
6927 }
6928 \f
6929 #define PPC_LO(v) ((v) & 0xffff)
6930 #define PPC_HI(v) (((v) >> 16) & 0xffff)
6931 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
6932
6933 /* Finish up dynamic symbol handling.  We set the contents of various
6934    dynamic sections here.  */
6935
6936 static bfd_boolean
6937 ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
6938                                struct bfd_link_info *info,
6939                                struct elf_link_hash_entry *h,
6940                                Elf_Internal_Sym *sym)
6941 {
6942   struct ppc_elf_link_hash_table *htab;
6943   struct plt_entry *ent;
6944   bfd_boolean doneone;
6945
6946 #ifdef DEBUG
6947   fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
6948            h->root.root.string);
6949 #endif
6950
6951   htab = ppc_elf_hash_table (info);
6952   BFD_ASSERT (htab->elf.dynobj != NULL);
6953
6954   doneone = FALSE;
6955   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6956     if (ent->plt.offset != (bfd_vma) -1)
6957       {
6958         if (!doneone)
6959           {
6960             Elf_Internal_Rela rela;
6961             bfd_byte *loc;
6962             bfd_vma reloc_index;
6963
6964             if (htab->plt_type == PLT_NEW)
6965               reloc_index = ent->plt.offset / 4;
6966             else
6967               {
6968                 reloc_index = ((ent->plt.offset - htab->plt_initial_entry_size)
6969                                / htab->plt_slot_size);
6970                 if (reloc_index > PLT_NUM_SINGLE_ENTRIES
6971                     && htab->plt_type == PLT_OLD)
6972                   reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
6973               }
6974
6975             /* This symbol has an entry in the procedure linkage table.
6976                Set it up.  */
6977             if (htab->plt_type == PLT_VXWORKS)
6978               {
6979                 bfd_vma got_offset;
6980                 const bfd_vma *plt_entry;
6981                 
6982                 /* The first three entries in .got.plt are reserved.  */
6983                 got_offset = (reloc_index + 3) * 4;
6984
6985                 /* Use the right PLT. */
6986                 plt_entry = info->shared ? ppc_elf_vxworks_pic_plt_entry
6987                             : ppc_elf_vxworks_plt_entry;
6988
6989                 /* Fill in the .plt on VxWorks.  */
6990                 if (info->shared)
6991                   {
6992                     bfd_vma got_offset_hi = (got_offset >> 16)
6993                                             + ((got_offset & 0x8000) >> 15);
6994
6995                     bfd_put_32 (output_bfd,
6996                                 plt_entry[0] | (got_offset_hi & 0xffff),
6997                                 htab->plt->contents + ent->plt.offset + 0);
6998                     bfd_put_32 (output_bfd,
6999                                 plt_entry[1] | (got_offset & 0xffff),
7000                                 htab->plt->contents + ent->plt.offset + 4);
7001                   }
7002                 else
7003                   {
7004                     bfd_vma got_loc
7005                       = (got_offset
7006                          + htab->elf.hgot->root.u.def.value
7007                          + htab->elf.hgot->root.u.def.section->output_offset
7008                          + htab->elf.hgot->root.u.def.section->output_section->vma);
7009                     bfd_vma got_loc_hi = (got_loc >> 16)
7010                                          + ((got_loc & 0x8000) >> 15);
7011
7012                     bfd_put_32 (output_bfd,
7013                                 plt_entry[0] | (got_loc_hi & 0xffff),
7014                                 htab->plt->contents + ent->plt.offset + 0);
7015                     bfd_put_32 (output_bfd,
7016                                 plt_entry[1] | (got_loc & 0xffff),
7017                                 htab->plt->contents + ent->plt.offset + 4);
7018                   }
7019
7020                 bfd_put_32 (output_bfd, plt_entry[2],
7021                             htab->plt->contents + ent->plt.offset + 8);
7022                 bfd_put_32 (output_bfd, plt_entry[3],
7023                             htab->plt->contents + ent->plt.offset + 12);
7024
7025                 /* This instruction is an immediate load.  The value loaded is
7026                    the byte offset of the R_PPC_JMP_SLOT relocation from the
7027                    start of the .rela.plt section.  The value is stored in the
7028                    low-order 16 bits of the load instruction.  */
7029                 /* NOTE: It appears that this is now an index rather than a
7030                    prescaled offset.  */
7031                 bfd_put_32 (output_bfd, 
7032                             plt_entry[4] | reloc_index,
7033                             htab->plt->contents + ent->plt.offset + 16);
7034                 /* This instruction is a PC-relative branch whose target is
7035                    the start of the PLT section.  The address of this branch
7036                    instruction is 20 bytes beyond the start of this PLT entry.
7037                    The address is encoded in bits 6-29, inclusive.  The value
7038                    stored is right-shifted by two bits, permitting a 26-bit
7039                    offset.  */
7040                 bfd_put_32 (output_bfd, 
7041                             (plt_entry[5] 
7042                              | (-(ent->plt.offset + 20) & 0x03fffffc)),
7043                             htab->plt->contents + ent->plt.offset + 20);
7044                 bfd_put_32 (output_bfd, plt_entry[6],
7045                             htab->plt->contents + ent->plt.offset + 24);
7046                 bfd_put_32 (output_bfd, plt_entry[7],
7047                             htab->plt->contents + ent->plt.offset + 28);
7048
7049                 /* Fill in the GOT entry corresponding to this PLT slot with
7050                    the address immediately after the the "bctr" instruction
7051                    in this PLT entry.  */
7052                 bfd_put_32 (output_bfd, (htab->plt->output_section->vma
7053                                          + htab->plt->output_offset
7054                                          + ent->plt.offset + 16),
7055                             htab->sgotplt->contents + got_offset);
7056
7057                 if (!info->shared)
7058                   {
7059                     /* Fill in a couple of entries in .rela.plt.unloaded.  */
7060                     loc = htab->srelplt2->contents
7061                       + ((VXWORKS_PLTRESOLVE_RELOCS + reloc_index
7062                           * VXWORKS_PLT_NON_JMP_SLOT_RELOCS)
7063                          * sizeof (Elf32_External_Rela));
7064
7065                     /* Provide the @ha relocation for the first instruction.  */
7066                     rela.r_offset = (htab->plt->output_section->vma
7067                                      + htab->plt->output_offset
7068                                      + ent->plt.offset + 2);
7069                     rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
7070                                                 R_PPC_ADDR16_HA);
7071                     rela.r_addend = got_offset;
7072                     bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7073                     loc += sizeof (Elf32_External_Rela);
7074
7075                     /* Provide the @l relocation for the second instruction.  */
7076                     rela.r_offset = (htab->plt->output_section->vma
7077                                      + htab->plt->output_offset
7078                                      + ent->plt.offset + 6);
7079                     rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
7080                                                 R_PPC_ADDR16_LO);
7081                     rela.r_addend = got_offset;
7082                     bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7083                     loc += sizeof (Elf32_External_Rela);
7084
7085                     /* Provide a relocation for the GOT entry corresponding to this
7086                        PLT slot.  Point it at the middle of the .plt entry.  */
7087                     rela.r_offset = (htab->sgotplt->output_section->vma
7088                                      + htab->sgotplt->output_offset
7089                                      + got_offset);
7090                     rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
7091                                                 R_PPC_ADDR32);
7092                     rela.r_addend = ent->plt.offset + 16;
7093                     bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7094                   }
7095
7096                 /* VxWorks uses non-standard semantics for R_PPC_JMP_SLOT.
7097                    In particular, the offset for the relocation is not the
7098                    address of the PLT entry for this function, as specified
7099                    by the ABI.  Instead, the offset is set to the address of
7100                    the GOT slot for this function.  See EABI 4.4.4.1.  */
7101                 rela.r_offset = (htab->sgotplt->output_section->vma
7102                                  + htab->sgotplt->output_offset
7103                                  + got_offset);
7104
7105               }
7106             else
7107               {
7108                 rela.r_offset = (htab->plt->output_section->vma
7109                                  + htab->plt->output_offset
7110                                  + ent->plt.offset);
7111                 if (htab->plt_type == PLT_OLD)
7112                   {
7113                     /* We don't need to fill in the .plt.  The ppc dynamic
7114                        linker will fill it in.  */
7115                   }
7116                 else
7117                   {
7118                     bfd_vma val = (htab->glink_pltresolve + ent->plt.offset
7119                                    + htab->glink->output_section->vma
7120                                    + htab->glink->output_offset);
7121                     bfd_put_32 (output_bfd, val,
7122                                 htab->plt->contents + ent->plt.offset);
7123                   }
7124               }
7125
7126             /* Fill in the entry in the .rela.plt section.  */
7127             rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
7128             rela.r_addend = 0;
7129
7130             loc = (htab->relplt->contents
7131                    + reloc_index * sizeof (Elf32_External_Rela));
7132             bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7133
7134             if (!h->def_regular)
7135               {
7136                 /* Mark the symbol as undefined, rather than as defined in
7137                    the .plt section.  Leave the value alone.  */
7138                 sym->st_shndx = SHN_UNDEF;
7139                 /* If the symbol is weak, we do need to clear the value.
7140                    Otherwise, the PLT entry would provide a definition for
7141                    the symbol even if the symbol wasn't defined anywhere,
7142                    and so the symbol would never be NULL.  */
7143                 if (!h->ref_regular_nonweak)
7144                   sym->st_value = 0;
7145               }
7146             doneone = TRUE;
7147           }
7148
7149         if (htab->plt_type == PLT_NEW)
7150           {
7151             bfd_vma plt;
7152             unsigned char *p;
7153
7154             plt = (ent->plt.offset
7155                    + htab->plt->output_section->vma
7156                    + htab->plt->output_offset);
7157             p = (unsigned char *) htab->glink->contents + ent->glink_offset;
7158
7159             if (info->shared || info->pie)
7160               {
7161                 bfd_vma got = 0;
7162
7163                 if (ent->addend >= 32768)
7164                   got = (ent->addend
7165                          + ent->sec->output_section->vma
7166                          + ent->sec->output_offset);
7167                 else if (htab->elf.hgot != NULL)
7168                   got = (htab->elf.hgot->root.u.def.value
7169                          + htab->elf.hgot->root.u.def.section->output_section->vma
7170                          + htab->elf.hgot->root.u.def.section->output_offset);
7171
7172                 plt -= got;
7173
7174                 if (plt + 0x8000 < 0x10000)
7175                   {
7176                     bfd_put_32 (output_bfd, LWZ_11_30 + PPC_LO (plt), p);
7177                     p += 4;
7178                     bfd_put_32 (output_bfd, MTCTR_11, p);
7179                     p += 4;
7180                     bfd_put_32 (output_bfd, BCTR, p);
7181                     p += 4;
7182                     bfd_put_32 (output_bfd, NOP, p);
7183                     p += 4;
7184                   }
7185                 else
7186                   {
7187                     bfd_put_32 (output_bfd, ADDIS_11_30 + PPC_HA (plt), p);
7188                     p += 4;
7189                     bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
7190                     p += 4;
7191                     bfd_put_32 (output_bfd, MTCTR_11, p);
7192                     p += 4;
7193                     bfd_put_32 (output_bfd, BCTR, p);
7194                     p += 4;
7195                   }
7196               }
7197             else
7198               {
7199                 bfd_put_32 (output_bfd, LIS_11 + PPC_HA (plt), p);
7200                 p += 4;
7201                 bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
7202                 p += 4;
7203                 bfd_put_32 (output_bfd, MTCTR_11, p);
7204                 p += 4;
7205                 bfd_put_32 (output_bfd, BCTR, p);
7206                 p += 4;
7207
7208                 /* We only need one non-PIC glink stub.  */
7209                 break;
7210               }
7211           }
7212         else
7213           break;
7214       }
7215
7216   if (h->needs_copy)
7217     {
7218       asection *s;
7219       Elf_Internal_Rela rela;
7220       bfd_byte *loc;
7221
7222       /* This symbols needs a copy reloc.  Set it up.  */
7223
7224 #ifdef DEBUG
7225       fprintf (stderr, ", copy");
7226 #endif
7227
7228       BFD_ASSERT (h->dynindx != -1);
7229
7230       if (ppc_elf_hash_entry (h)->has_sda_refs)
7231         s = htab->relsbss;
7232       else
7233         s = htab->relbss;
7234       BFD_ASSERT (s != NULL);
7235
7236       rela.r_offset = (h->root.u.def.value
7237                        + h->root.u.def.section->output_section->vma
7238                        + h->root.u.def.section->output_offset);
7239       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
7240       rela.r_addend = 0;
7241       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
7242       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7243     }
7244
7245 #ifdef DEBUG
7246   fprintf (stderr, "\n");
7247 #endif
7248
7249   /* Mark some specially defined symbols as absolute.  */
7250   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
7251       || (!htab->is_vxworks
7252           && (h == htab->elf.hgot
7253               || strcmp (h->root.root.string,
7254                          "_PROCEDURE_LINKAGE_TABLE_") == 0)))
7255     sym->st_shndx = SHN_ABS;
7256
7257   return TRUE;
7258 }
7259 \f
7260 static enum elf_reloc_type_class
7261 ppc_elf_reloc_type_class (const Elf_Internal_Rela *rela)
7262 {
7263   switch (ELF32_R_TYPE (rela->r_info))
7264     {
7265     case R_PPC_RELATIVE:
7266       return reloc_class_relative;
7267     case R_PPC_REL24:
7268     case R_PPC_ADDR24:
7269     case R_PPC_JMP_SLOT:
7270       return reloc_class_plt;
7271     case R_PPC_COPY:
7272       return reloc_class_copy;
7273     default:
7274       return reloc_class_normal;
7275     }
7276 }
7277 \f
7278 /* Finish up the dynamic sections.  */
7279
7280 static bfd_boolean
7281 ppc_elf_finish_dynamic_sections (bfd *output_bfd,
7282                                  struct bfd_link_info *info)
7283 {
7284   asection *sdyn;
7285   asection *splt;
7286   struct ppc_elf_link_hash_table *htab;
7287   bfd_vma got;
7288   bfd * dynobj;
7289
7290 #ifdef DEBUG
7291   fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
7292 #endif
7293
7294   htab = ppc_elf_hash_table (info);
7295   dynobj = elf_hash_table (info)->dynobj;
7296   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
7297   if (htab->is_vxworks)
7298     splt = bfd_get_section_by_name (dynobj, ".plt");  
7299   else
7300     splt = NULL;
7301
7302   got = 0;
7303   if (htab->elf.hgot != NULL)
7304     got = (htab->elf.hgot->root.u.def.value
7305            + htab->elf.hgot->root.u.def.section->output_section->vma
7306            + htab->elf.hgot->root.u.def.section->output_offset);
7307
7308   if (htab->elf.dynamic_sections_created)
7309     {
7310       Elf32_External_Dyn *dyncon, *dynconend;
7311
7312       BFD_ASSERT (htab->plt != NULL && sdyn != NULL);
7313
7314       dyncon = (Elf32_External_Dyn *) sdyn->contents;
7315       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
7316       for (; dyncon < dynconend; dyncon++)
7317         {
7318           Elf_Internal_Dyn dyn;
7319           asection *s;
7320
7321           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
7322
7323           switch (dyn.d_tag)
7324             {
7325             case DT_PLTGOT:
7326               if (htab->is_vxworks)
7327                 s = htab->sgotplt;
7328               else
7329                 s = htab->plt;
7330               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
7331               break;
7332
7333             case DT_PLTRELSZ:
7334               dyn.d_un.d_val = htab->relplt->size;
7335               break;
7336
7337             case DT_JMPREL:
7338               s = htab->relplt;
7339               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
7340               break;
7341
7342             case DT_PPC_GOT:
7343               dyn.d_un.d_ptr = got;
7344               break;
7345
7346             case DT_RELASZ:
7347               if (htab->is_vxworks)
7348                 {
7349                   if (htab->relplt)
7350                     dyn.d_un.d_ptr -= htab->relplt->size;
7351                   break;
7352                 }
7353               continue;
7354
7355             default:
7356               continue;
7357             }
7358
7359           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7360         }
7361     }
7362
7363   /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can
7364      easily find the address of the _GLOBAL_OFFSET_TABLE_.  */
7365   if (htab->got != NULL)
7366     {
7367       unsigned char *p = htab->got->contents;
7368       bfd_vma val;
7369
7370       p += htab->elf.hgot->root.u.def.value;
7371       if (htab->plt_type == PLT_OLD)
7372         bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, p - 4);
7373
7374       val = 0;
7375       if (sdyn != NULL)
7376         val = sdyn->output_section->vma + sdyn->output_offset;
7377       bfd_put_32 (output_bfd, val, p);
7378
7379       elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 4;
7380     }
7381
7382   /* Fill in the first entry in the VxWorks procedure linkage table.  */
7383   if (splt && splt->size > 0)
7384     {
7385       /* Use the right PLT. */
7386       static const bfd_vma *plt_entry = NULL;
7387       plt_entry = info->shared ? 
7388         ppc_elf_vxworks_pic_plt0_entry : ppc_elf_vxworks_plt0_entry;
7389
7390       if (!info->shared)
7391         {
7392           bfd_vma got_value =
7393             (htab->elf.hgot->root.u.def.section->output_section->vma
7394              + htab->elf.hgot->root.u.def.section->output_offset
7395              + htab->elf.hgot->root.u.def.value);
7396           bfd_vma got_hi = (got_value >> 16) + ((got_value & 0x8000) >> 15);
7397
7398           bfd_put_32 (output_bfd, plt_entry[0] | (got_hi & 0xffff),
7399                       splt->contents +  0);
7400           bfd_put_32 (output_bfd, plt_entry[1] | (got_value & 0xffff),
7401                       splt->contents +  4);
7402         }
7403       else
7404         {
7405           bfd_put_32 (output_bfd, plt_entry[0], splt->contents +  0);
7406           bfd_put_32 (output_bfd, plt_entry[1], splt->contents +  4);
7407         }
7408       bfd_put_32 (output_bfd, plt_entry[2], splt->contents +  8);
7409       bfd_put_32 (output_bfd, plt_entry[3], splt->contents + 12);
7410       bfd_put_32 (output_bfd, plt_entry[4], splt->contents + 16);
7411       bfd_put_32 (output_bfd, plt_entry[5], splt->contents + 20);
7412       bfd_put_32 (output_bfd, plt_entry[6], splt->contents + 24);
7413       bfd_put_32 (output_bfd, plt_entry[7], splt->contents + 28);
7414
7415       if (! info->shared)
7416         {
7417           Elf_Internal_Rela rela;
7418           bfd_byte *loc;
7419
7420           loc = htab->srelplt2->contents;
7421
7422           /* Output the @ha relocation for the first instruction.  */
7423           rela.r_offset = (htab->plt->output_section->vma
7424                            + htab->plt->output_offset
7425                            + 2);
7426           rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
7427           rela.r_addend = 0;
7428           bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7429           loc += sizeof (Elf32_External_Rela);
7430           
7431           /* Output the @l relocation for the second instruction.  */
7432           rela.r_offset = (htab->plt->output_section->vma
7433                            + htab->plt->output_offset
7434                            + 6);
7435           rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
7436           rela.r_addend = 0;
7437           bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7438           loc += sizeof (Elf32_External_Rela);
7439
7440           /* Fix up the remaining relocations.  They may have the wrong
7441              symbol index for _G_O_T_ or _P_L_T_ depending on the order
7442              in which symbols were output.  */
7443           while (loc < htab->srelplt2->contents + htab->srelplt2->size)
7444             {
7445               Elf_Internal_Rela rel;
7446
7447               bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
7448               rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
7449               bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
7450               loc += sizeof (Elf32_External_Rela);
7451
7452               bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
7453               rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
7454               bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
7455               loc += sizeof (Elf32_External_Rela);
7456
7457               bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
7458               rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_PPC_ADDR32);
7459               bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
7460               loc += sizeof (Elf32_External_Rela);
7461             }
7462         }
7463     }
7464
7465   if (htab->glink != NULL && htab->glink->contents != NULL)
7466     {
7467       unsigned char *p;
7468       unsigned char *endp;
7469       bfd_vma res0;
7470       unsigned int i;
7471
7472       /*
7473        * PIC glink code is the following:
7474        *
7475        * # ith PLT code stub.
7476        *   addis 11,30,(plt+(i-1)*4-got)@ha
7477        *   lwz 11,(plt+(i-1)*4-got)@l(11)
7478        *   mtctr 11
7479        *   bctr
7480        *
7481        * # A table of branches, one for each plt entry.
7482        * # The idea is that the plt call stub loads ctr (and r11) with these
7483        * # addresses, so (r11 - res_0) gives the plt index * 4.
7484        * res_0: b PLTresolve
7485        * res_1: b PLTresolve
7486        * .
7487        * # Some number of entries towards the end can be nops
7488        * res_n_m3: nop
7489        * res_n_m2: nop
7490        * res_n_m1:
7491        *
7492        * PLTresolve:
7493        *    addis 11,11,(1f-res_0)@ha
7494        *    mflr 0
7495        *    bcl 20,31,1f
7496        * 1: addi 11,11,(1b-res_0)@l
7497        *    mflr 12
7498        *    mtlr 0
7499        *    sub 11,11,12                # r11 = index * 4
7500        *    addis 12,12,(got+4-1b)@ha
7501        *    lwz 0,(got+4-1b)@l(12)      # got[1] address of dl_runtime_resolve
7502        *    lwz 12,(got+8-1b)@l(12)     # got[2] contains the map address
7503        *    mtctr 0
7504        *    add 0,11,11
7505        *    add 11,0,11                 # r11 = index * 12 = reloc offset.
7506        *    bctr
7507        */
7508       static const unsigned int pic_plt_resolve[] =
7509         {
7510           ADDIS_11_11,
7511           MFLR_0,
7512           BCL_20_31,
7513           ADDI_11_11,
7514           MFLR_12,
7515           MTLR_0,
7516           SUB_11_11_12,
7517           ADDIS_12_12,
7518           LWZ_0_12,
7519           LWZ_12_12,
7520           MTCTR_0,
7521           ADD_0_11_11,
7522           ADD_11_0_11,
7523           BCTR,
7524           NOP,
7525           NOP
7526         };
7527
7528       static const unsigned int plt_resolve[] =
7529         {
7530           LIS_12,
7531           ADDIS_11_11,
7532           LWZ_0_12,
7533           ADDI_11_11,
7534           MTCTR_0,
7535           ADD_0_11_11,
7536           LWZ_12_12,
7537           ADD_11_0_11,
7538           BCTR,
7539           NOP,
7540           NOP,
7541           NOP,
7542           NOP,
7543           NOP,
7544           NOP,
7545           NOP
7546         };
7547
7548       if (ARRAY_SIZE (pic_plt_resolve) != GLINK_PLTRESOLVE / 4)
7549         abort ();
7550       if (ARRAY_SIZE (plt_resolve) != GLINK_PLTRESOLVE / 4)
7551         abort ();
7552
7553       /* Build the branch table, one for each plt entry (less one),
7554          and perhaps some padding.  */
7555       p = htab->glink->contents;
7556       p += htab->glink_pltresolve;
7557       endp = htab->glink->contents;
7558       endp += htab->glink->size - GLINK_PLTRESOLVE;
7559       while (p < endp - 8 * 4)
7560         {
7561           bfd_put_32 (output_bfd, B + endp - p, p);
7562           p += 4;
7563         }
7564       while (p < endp)
7565         {
7566           bfd_put_32 (output_bfd, NOP, p);
7567           p += 4;
7568         }
7569
7570       res0 = (htab->glink_pltresolve
7571               + htab->glink->output_section->vma
7572               + htab->glink->output_offset);
7573
7574       /* Last comes the PLTresolve stub.  */
7575       if (info->shared || info->pie)
7576         {
7577           bfd_vma bcl;
7578
7579           for (i = 0; i < ARRAY_SIZE (pic_plt_resolve); i++)
7580             {
7581               bfd_put_32 (output_bfd, pic_plt_resolve[i], p);
7582               p += 4;
7583             }
7584           p -= 4 * ARRAY_SIZE (pic_plt_resolve);
7585
7586           bcl = (htab->glink->size - GLINK_PLTRESOLVE + 3*4
7587                  + htab->glink->output_section->vma
7588                  + htab->glink->output_offset);
7589
7590           bfd_put_32 (output_bfd,
7591                       ADDIS_11_11 + PPC_HA (bcl - res0), p + 0*4);
7592           bfd_put_32 (output_bfd,
7593                       ADDI_11_11 + PPC_LO (bcl - res0), p + 3*4);
7594           bfd_put_32 (output_bfd,
7595                       ADDIS_12_12 + PPC_HA (got + 4 - bcl), p + 7*4);
7596           if (PPC_HA (got + 4 - bcl) == PPC_HA (got + 8 - bcl))
7597             {
7598               bfd_put_32 (output_bfd,
7599                           LWZ_0_12 + PPC_LO (got + 4 - bcl), p + 8*4);
7600               bfd_put_32 (output_bfd,
7601                           LWZ_12_12 + PPC_LO (got + 8 - bcl), p + 9*4);
7602             }
7603           else
7604             {
7605               bfd_put_32 (output_bfd,
7606                           LWZU_0_12 + PPC_LO (got + 4 - bcl), p + 8*4);
7607               bfd_put_32 (output_bfd,
7608                           LWZ_12_12 + 4, p + 9*4);
7609             }
7610         }
7611       else
7612         {
7613           for (i = 0; i < ARRAY_SIZE (plt_resolve); i++)
7614             {
7615               bfd_put_32 (output_bfd, plt_resolve[i], p);
7616               p += 4;
7617             }
7618           p -= 4 * ARRAY_SIZE (plt_resolve);
7619
7620           bfd_put_32 (output_bfd,
7621                       LIS_12 + PPC_HA (got + 4), p + 0*4);
7622           bfd_put_32 (output_bfd,
7623                       ADDIS_11_11 + PPC_HA (-res0), p + 1*4);
7624           bfd_put_32 (output_bfd,
7625                       ADDI_11_11 + PPC_LO (-res0), p + 3*4);
7626           if (PPC_HA (got + 4) == PPC_HA (got + 8))
7627             {
7628               bfd_put_32 (output_bfd,
7629                           LWZ_0_12 + PPC_LO (got + 4), p + 2*4);
7630               bfd_put_32 (output_bfd,
7631                           LWZ_12_12 + PPC_LO (got + 8), p + 6*4);
7632             }
7633           else
7634             {
7635               bfd_put_32 (output_bfd,
7636                           LWZU_0_12 + PPC_LO (got + 4), p + 2*4);
7637               bfd_put_32 (output_bfd,
7638                           LWZ_12_12 + 4, p + 6*4);
7639             }
7640         }
7641     }
7642
7643   return TRUE;
7644 }
7645 \f
7646 #define TARGET_LITTLE_SYM       bfd_elf32_powerpcle_vec
7647 #define TARGET_LITTLE_NAME      "elf32-powerpcle"
7648 #define TARGET_BIG_SYM          bfd_elf32_powerpc_vec
7649 #define TARGET_BIG_NAME         "elf32-powerpc"
7650 #define ELF_ARCH                bfd_arch_powerpc
7651 #define ELF_MACHINE_CODE        EM_PPC
7652 #ifdef __QNXTARGET__
7653 #define ELF_MAXPAGESIZE         0x1000
7654 #else
7655 #define ELF_MAXPAGESIZE         0x10000
7656 #endif
7657 #define ELF_MINPAGESIZE         0x1000
7658 #define ELF_COMMONPAGESIZE      0x1000
7659 #define elf_info_to_howto       ppc_elf_info_to_howto
7660
7661 #ifdef  EM_CYGNUS_POWERPC
7662 #define ELF_MACHINE_ALT1        EM_CYGNUS_POWERPC
7663 #endif
7664
7665 #ifdef EM_PPC_OLD
7666 #define ELF_MACHINE_ALT2        EM_PPC_OLD
7667 #endif
7668
7669 #define elf_backend_plt_not_loaded      1
7670 #define elf_backend_can_gc_sections     1
7671 #define elf_backend_can_refcount        1
7672 #define elf_backend_rela_normal         1
7673
7674 #define bfd_elf32_mkobject                      ppc_elf_mkobject
7675 #define bfd_elf32_bfd_merge_private_bfd_data    ppc_elf_merge_private_bfd_data
7676 #define bfd_elf32_bfd_relax_section             ppc_elf_relax_section
7677 #define bfd_elf32_bfd_reloc_type_lookup         ppc_elf_reloc_type_lookup
7678 #define bfd_elf32_bfd_reloc_name_lookup ppc_elf_reloc_name_lookup
7679 #define bfd_elf32_bfd_set_private_flags         ppc_elf_set_private_flags
7680 #define bfd_elf32_bfd_link_hash_table_create    ppc_elf_link_hash_table_create
7681
7682 #define elf_backend_object_p                    ppc_elf_object_p
7683 #define elf_backend_gc_mark_hook                ppc_elf_gc_mark_hook
7684 #define elf_backend_gc_sweep_hook               ppc_elf_gc_sweep_hook
7685 #define elf_backend_section_from_shdr           ppc_elf_section_from_shdr
7686 #define elf_backend_relocate_section            ppc_elf_relocate_section
7687 #define elf_backend_create_dynamic_sections     ppc_elf_create_dynamic_sections
7688 #define elf_backend_check_relocs                ppc_elf_check_relocs
7689 #define elf_backend_copy_indirect_symbol        ppc_elf_copy_indirect_symbol
7690 #define elf_backend_adjust_dynamic_symbol       ppc_elf_adjust_dynamic_symbol
7691 #define elf_backend_add_symbol_hook             ppc_elf_add_symbol_hook
7692 #define elf_backend_size_dynamic_sections       ppc_elf_size_dynamic_sections
7693 #define elf_backend_finish_dynamic_symbol       ppc_elf_finish_dynamic_symbol
7694 #define elf_backend_finish_dynamic_sections     ppc_elf_finish_dynamic_sections
7695 #define elf_backend_fake_sections               ppc_elf_fake_sections
7696 #define elf_backend_additional_program_headers  ppc_elf_additional_program_headers
7697 #define elf_backend_grok_prstatus               ppc_elf_grok_prstatus
7698 #define elf_backend_grok_psinfo                 ppc_elf_grok_psinfo
7699 #define elf_backend_write_core_note             ppc_elf_write_core_note
7700 #define elf_backend_reloc_type_class            ppc_elf_reloc_type_class
7701 #define elf_backend_begin_write_processing      ppc_elf_begin_write_processing
7702 #define elf_backend_final_write_processing      ppc_elf_final_write_processing
7703 #define elf_backend_write_section               ppc_elf_write_section
7704 #define elf_backend_get_sec_type_attr           ppc_elf_get_sec_type_attr
7705 #define elf_backend_plt_sym_val                 ppc_elf_plt_sym_val
7706 #define elf_backend_action_discarded            ppc_elf_action_discarded
7707 #define elf_backend_init_index_section          _bfd_elf_init_1_index_section
7708
7709 #include "elf32-target.h"
7710
7711 /* VxWorks Target */
7712
7713 #undef TARGET_LITTLE_SYM
7714 #undef TARGET_LITTLE_NAME
7715
7716 #undef TARGET_BIG_SYM
7717 #define TARGET_BIG_SYM          bfd_elf32_powerpc_vxworks_vec
7718 #undef TARGET_BIG_NAME
7719 #define TARGET_BIG_NAME         "elf32-powerpc-vxworks"
7720
7721 /* VxWorks uses the elf default section flags for .plt.  */
7722 static const struct bfd_elf_special_section *
7723 ppc_elf_vxworks_get_sec_type_attr (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
7724 {
7725   if (sec->name == NULL)
7726     return NULL;
7727
7728   if (strcmp (sec->name, ".plt") == 0)
7729     return _bfd_elf_get_sec_type_attr (abfd, sec);
7730
7731   return ppc_elf_get_sec_type_attr (abfd, sec);
7732 }
7733
7734 /* Like ppc_elf_link_hash_table_create, but overrides
7735    appropriately for VxWorks.  */
7736 static struct bfd_link_hash_table *
7737 ppc_elf_vxworks_link_hash_table_create (bfd *abfd)
7738 {
7739   struct bfd_link_hash_table *ret;
7740
7741   ret = ppc_elf_link_hash_table_create (abfd);
7742   if (ret)
7743     {
7744       struct ppc_elf_link_hash_table *htab
7745         = (struct ppc_elf_link_hash_table *)ret;
7746       htab->is_vxworks = 1;
7747       htab->plt_type = PLT_VXWORKS;
7748       htab->plt_entry_size = VXWORKS_PLT_ENTRY_SIZE;
7749       htab->plt_slot_size = VXWORKS_PLT_ENTRY_SIZE;
7750       htab->plt_initial_entry_size = VXWORKS_PLT_INITIAL_ENTRY_SIZE;
7751     }
7752   return ret;
7753 }
7754
7755 /* Tweak magic VxWorks symbols as they are loaded.  */
7756 static bfd_boolean
7757 ppc_elf_vxworks_add_symbol_hook (bfd *abfd,
7758                                  struct bfd_link_info *info,
7759                                  Elf_Internal_Sym *sym,
7760                                  const char **namep ATTRIBUTE_UNUSED,
7761                                  flagword *flagsp ATTRIBUTE_UNUSED,
7762                                  asection **secp,
7763                                  bfd_vma *valp)
7764 {
7765   if (!elf_vxworks_add_symbol_hook(abfd, info, sym,namep, flagsp, secp,
7766                                    valp))
7767     return FALSE;
7768
7769   return ppc_elf_add_symbol_hook(abfd, info, sym,namep, flagsp, secp, valp);
7770 }
7771
7772 static void
7773 ppc_elf_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
7774 {
7775   ppc_elf_final_write_processing(abfd, linker);
7776   elf_vxworks_final_write_processing(abfd, linker);
7777 }
7778
7779 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
7780    define it.  */
7781 #undef elf_backend_want_plt_sym
7782 #define elf_backend_want_plt_sym                1
7783 #undef elf_backend_want_got_plt
7784 #define elf_backend_want_got_plt                1
7785 #undef elf_backend_got_symbol_offset
7786 #define elf_backend_got_symbol_offset           0
7787 #undef elf_backend_plt_not_loaded
7788 #define elf_backend_plt_not_loaded              0
7789 #undef elf_backend_plt_readonly
7790 #define elf_backend_plt_readonly                1
7791 #undef elf_backend_got_header_size
7792 #define elf_backend_got_header_size             12
7793
7794 #undef bfd_elf32_bfd_link_hash_table_create
7795 #define bfd_elf32_bfd_link_hash_table_create \
7796   ppc_elf_vxworks_link_hash_table_create
7797 #undef elf_backend_add_symbol_hook
7798 #define elf_backend_add_symbol_hook \
7799   ppc_elf_vxworks_add_symbol_hook
7800 #undef elf_backend_link_output_symbol_hook
7801 #define elf_backend_link_output_symbol_hook \
7802   elf_vxworks_link_output_symbol_hook
7803 #undef elf_backend_final_write_processing
7804 #define elf_backend_final_write_processing \
7805   ppc_elf_vxworks_final_write_processing
7806 #undef elf_backend_get_sec_type_attr
7807 #define elf_backend_get_sec_type_attr \
7808   ppc_elf_vxworks_get_sec_type_attr
7809 #undef elf_backend_emit_relocs
7810 #define elf_backend_emit_relocs \
7811   elf_vxworks_emit_relocs
7812
7813 #undef elf32_bed
7814 #define elf32_bed                               ppc_elf_vxworks_bed
7815
7816 #include "elf32-target.h"