OSDN Git Service

2008-01-11 Tristan Gingold <gingold@adacore.com>
[pf3gnuchains/pf3gnuchains4x.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 (info->relocatable)
3914     return TRUE;
3915
3916   if ((sec->flags & SEC_ALLOC) == 0)
3917     return TRUE;
3918
3919   elf_section_data (sec)->local_dynrel = NULL;
3920
3921   htab = ppc_elf_hash_table (info);
3922   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3923   sym_hashes = elf_sym_hashes (abfd);
3924   local_got_refcounts = elf_local_got_refcounts (abfd);
3925   got2 = bfd_get_section_by_name (abfd, ".got2");
3926
3927   relend = relocs + sec->reloc_count;
3928   for (rel = relocs; rel < relend; rel++)
3929     {
3930       unsigned long r_symndx;
3931       enum elf_ppc_reloc_type r_type;
3932       struct elf_link_hash_entry *h = NULL;
3933
3934       r_symndx = ELF32_R_SYM (rel->r_info);
3935       if (r_symndx >= symtab_hdr->sh_info)
3936         {
3937           struct ppc_elf_dyn_relocs **pp, *p;
3938           struct ppc_elf_link_hash_entry *eh;
3939
3940           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3941           while (h->root.type == bfd_link_hash_indirect
3942                  || h->root.type == bfd_link_hash_warning)
3943             h = (struct elf_link_hash_entry *) h->root.u.i.link;
3944           eh = (struct ppc_elf_link_hash_entry *) h;
3945
3946           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
3947             if (p->sec == sec)
3948               {
3949                 /* Everything must go for SEC.  */
3950                 *pp = p->next;
3951                 break;
3952               }
3953         }
3954
3955       r_type = ELF32_R_TYPE (rel->r_info);
3956       switch (r_type)
3957         {
3958         case R_PPC_GOT_TLSLD16:
3959         case R_PPC_GOT_TLSLD16_LO:
3960         case R_PPC_GOT_TLSLD16_HI:
3961         case R_PPC_GOT_TLSLD16_HA:
3962         case R_PPC_GOT_TLSGD16:
3963         case R_PPC_GOT_TLSGD16_LO:
3964         case R_PPC_GOT_TLSGD16_HI:
3965         case R_PPC_GOT_TLSGD16_HA:
3966         case R_PPC_GOT_TPREL16:
3967         case R_PPC_GOT_TPREL16_LO:
3968         case R_PPC_GOT_TPREL16_HI:
3969         case R_PPC_GOT_TPREL16_HA:
3970         case R_PPC_GOT_DTPREL16:
3971         case R_PPC_GOT_DTPREL16_LO:
3972         case R_PPC_GOT_DTPREL16_HI:
3973         case R_PPC_GOT_DTPREL16_HA:
3974         case R_PPC_GOT16:
3975         case R_PPC_GOT16_LO:
3976         case R_PPC_GOT16_HI:
3977         case R_PPC_GOT16_HA:
3978           if (h != NULL)
3979             {
3980               if (h->got.refcount > 0)
3981                 h->got.refcount--;
3982             }
3983           else if (local_got_refcounts != NULL)
3984             {
3985               if (local_got_refcounts[r_symndx] > 0)
3986                 local_got_refcounts[r_symndx]--;
3987             }
3988           break;
3989
3990         case R_PPC_REL24:
3991         case R_PPC_REL14:
3992         case R_PPC_REL14_BRTAKEN:
3993         case R_PPC_REL14_BRNTAKEN:
3994         case R_PPC_REL32:
3995           if (h == NULL || h == htab->elf.hgot)
3996             break;
3997           /* Fall thru */
3998
3999         case R_PPC_ADDR32:
4000         case R_PPC_ADDR24:
4001         case R_PPC_ADDR16:
4002         case R_PPC_ADDR16_LO:
4003         case R_PPC_ADDR16_HI:
4004         case R_PPC_ADDR16_HA:
4005         case R_PPC_ADDR14:
4006         case R_PPC_ADDR14_BRTAKEN:
4007         case R_PPC_ADDR14_BRNTAKEN:
4008         case R_PPC_UADDR32:
4009         case R_PPC_UADDR16:
4010           if (info->shared)
4011             break;
4012
4013         case R_PPC_PLT32:
4014         case R_PPC_PLTREL24:
4015         case R_PPC_PLTREL32:
4016         case R_PPC_PLT16_LO:
4017         case R_PPC_PLT16_HI:
4018         case R_PPC_PLT16_HA:
4019           if (h != NULL)
4020             {
4021               bfd_vma addend = r_type == R_PPC_PLTREL24 ? rel->r_addend : 0;
4022               struct plt_entry *ent = find_plt_ent (h, got2, addend);
4023               if (ent->plt.refcount > 0)
4024                 ent->plt.refcount -= 1;
4025             }
4026           break;
4027
4028         default:
4029           break;
4030         }
4031     }
4032   return TRUE;
4033 }
4034 \f
4035 /* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
4036
4037 asection *
4038 ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
4039 {
4040   struct ppc_elf_link_hash_table *htab;
4041
4042   htab = ppc_elf_hash_table (info);
4043   if (htab->plt_type == PLT_NEW
4044       && htab->plt != NULL
4045       && htab->plt->output_section != NULL)
4046     {
4047       elf_section_type (htab->plt->output_section) = SHT_PROGBITS;
4048       elf_section_flags (htab->plt->output_section) = SHF_ALLOC + SHF_WRITE;
4049     }
4050
4051   htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4052                                              FALSE, FALSE, TRUE);
4053   return _bfd_elf_tls_setup (obfd, info);
4054 }
4055
4056 /* Run through all the TLS relocs looking for optimization
4057    opportunities.  */
4058
4059 bfd_boolean
4060 ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
4061                       struct bfd_link_info *info)
4062 {
4063   bfd *ibfd;
4064   asection *sec;
4065   struct ppc_elf_link_hash_table *htab;
4066   int pass;
4067
4068   if (info->relocatable || info->shared)
4069     return TRUE;
4070
4071   htab = ppc_elf_hash_table (info);
4072   /* Make two passes through the relocs.  First time check that tls
4073      relocs involved in setting up a tls_get_addr call are indeed
4074      followed by such a call.  If they are not, exclude them from
4075      the optimizations done on the second pass.  */
4076   for (pass = 0; pass < 2; ++pass)
4077     for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4078       {
4079         Elf_Internal_Sym *locsyms = NULL;
4080         Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4081
4082         for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4083           if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
4084             {
4085               Elf_Internal_Rela *relstart, *rel, *relend;
4086
4087               /* Read the relocations.  */
4088               relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
4089                                                     info->keep_memory);
4090               if (relstart == NULL)
4091                 return FALSE;
4092
4093               relend = relstart + sec->reloc_count;
4094               for (rel = relstart; rel < relend; rel++)
4095                 {
4096                   enum elf_ppc_reloc_type r_type;
4097                   unsigned long r_symndx;
4098                   struct elf_link_hash_entry *h = NULL;
4099                   char *tls_mask;
4100                   char tls_set, tls_clear;
4101                   bfd_boolean is_local;
4102                   int expecting_tls_get_addr;
4103                   bfd_signed_vma *got_count;
4104
4105                   r_symndx = ELF32_R_SYM (rel->r_info);
4106                   if (r_symndx >= symtab_hdr->sh_info)
4107                     {
4108                       struct elf_link_hash_entry **sym_hashes;
4109
4110                       sym_hashes = elf_sym_hashes (ibfd);
4111                       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4112                       while (h->root.type == bfd_link_hash_indirect
4113                              || h->root.type == bfd_link_hash_warning)
4114                         h = (struct elf_link_hash_entry *) h->root.u.i.link;
4115                     }
4116
4117                   expecting_tls_get_addr = 0;
4118                   is_local = FALSE;
4119                   if (h == NULL
4120                       || !h->def_dynamic)
4121                     is_local = TRUE;
4122
4123                   r_type = ELF32_R_TYPE (rel->r_info);
4124                   switch (r_type)
4125                     {
4126                     case R_PPC_GOT_TLSLD16:
4127                     case R_PPC_GOT_TLSLD16_LO:
4128                       expecting_tls_get_addr = 1;
4129                       /* Fall thru */
4130
4131                     case R_PPC_GOT_TLSLD16_HI:
4132                     case R_PPC_GOT_TLSLD16_HA:
4133                       /* These relocs should never be against a symbol
4134                          defined in a shared lib.  Leave them alone if
4135                          that turns out to be the case.  */
4136                       if (!is_local)
4137                         continue;
4138
4139                       /* LD -> LE */
4140                       tls_set = 0;
4141                       tls_clear = TLS_LD;
4142                       break;
4143
4144                     case R_PPC_GOT_TLSGD16:
4145                     case R_PPC_GOT_TLSGD16_LO:
4146                       expecting_tls_get_addr = 1;
4147                       /* Fall thru */
4148
4149                     case R_PPC_GOT_TLSGD16_HI:
4150                     case R_PPC_GOT_TLSGD16_HA:
4151                       if (is_local)
4152                         /* GD -> LE */
4153                         tls_set = 0;
4154                       else
4155                         /* GD -> IE */
4156                         tls_set = TLS_TLS | TLS_TPRELGD;
4157                       tls_clear = TLS_GD;
4158                       break;
4159
4160                     case R_PPC_GOT_TPREL16:
4161                     case R_PPC_GOT_TPREL16_LO:
4162                     case R_PPC_GOT_TPREL16_HI:
4163                     case R_PPC_GOT_TPREL16_HA:
4164                       if (is_local)
4165                         {
4166                           /* IE -> LE */
4167                           tls_set = 0;
4168                           tls_clear = TLS_TPREL;
4169                           break;
4170                         }
4171                       else
4172                         continue;
4173
4174                     default:
4175                       continue;
4176                     }
4177
4178                   if (pass == 0)
4179                     {
4180                       if (!expecting_tls_get_addr)
4181                         continue;
4182
4183                       if (rel + 1 < relend)
4184                         {
4185                           enum elf_ppc_reloc_type r_type2;
4186                           unsigned long r_symndx2;
4187                           struct elf_link_hash_entry *h2;
4188
4189                           /* The next instruction should be a call to
4190                              __tls_get_addr.  Peek at the reloc to be sure.  */
4191                           r_type2 = ELF32_R_TYPE (rel[1].r_info);
4192                           r_symndx2 = ELF32_R_SYM (rel[1].r_info);
4193                           if (r_symndx2 >= symtab_hdr->sh_info
4194                               && (r_type2 == R_PPC_REL14
4195                                   || r_type2 == R_PPC_REL14_BRTAKEN
4196                                   || r_type2 == R_PPC_REL14_BRNTAKEN
4197                                   || r_type2 == R_PPC_REL24
4198                                   || r_type2 == R_PPC_PLTREL24))
4199                             {
4200                               struct elf_link_hash_entry **sym_hashes;
4201
4202                               sym_hashes = elf_sym_hashes (ibfd);
4203                               h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
4204                               while (h2->root.type == bfd_link_hash_indirect
4205                                      || h2->root.type == bfd_link_hash_warning)
4206                                 h2 = ((struct elf_link_hash_entry *)
4207                                       h2->root.u.i.link);
4208                               if (h2 == htab->tls_get_addr)
4209                                 continue;
4210                             }
4211                         }
4212
4213                       /* Uh oh, we didn't find the expected call.  We
4214                          could just mark this symbol to exclude it
4215                          from tls optimization but it's safer to skip
4216                          the entire section.  */
4217                       sec->has_tls_reloc = 0;
4218                       break;
4219                     }
4220
4221                   if (h != NULL)
4222                     {
4223                       tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
4224                       got_count = &h->got.refcount;
4225                     }
4226                   else
4227                     {
4228                       Elf_Internal_Sym *sym;
4229                       bfd_signed_vma *lgot_refs;
4230                       char *lgot_masks;
4231
4232                       if (locsyms == NULL)
4233                         {
4234                           locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
4235                           if (locsyms == NULL)
4236                             locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
4237                                                             symtab_hdr->sh_info,
4238                                                             0, NULL, NULL, NULL);
4239                           if (locsyms == NULL)
4240                             {
4241                               if (elf_section_data (sec)->relocs != relstart)
4242                                 free (relstart);
4243                               return FALSE;
4244                             }
4245                         }
4246                       sym = locsyms + r_symndx;
4247                       lgot_refs = elf_local_got_refcounts (ibfd);
4248                       if (lgot_refs == NULL)
4249                         abort ();
4250                       lgot_masks = (char *) (lgot_refs + symtab_hdr->sh_info);
4251                       tls_mask = &lgot_masks[r_symndx];
4252                       got_count = &lgot_refs[r_symndx];
4253                     }
4254
4255                   if (tls_set == 0)
4256                     {
4257                       /* We managed to get rid of a got entry.  */
4258                       if (*got_count > 0)
4259                         *got_count -= 1;
4260                     }
4261
4262                   if (expecting_tls_get_addr)
4263                     {
4264                       struct plt_entry *ent;
4265
4266                       ent = find_plt_ent (htab->tls_get_addr, NULL, 0);
4267                       if (ent != NULL && ent->plt.refcount > 0)
4268                         ent->plt.refcount -= 1;
4269                     }
4270
4271                   *tls_mask |= tls_set;
4272                   *tls_mask &= ~tls_clear;
4273                 }
4274
4275               if (elf_section_data (sec)->relocs != relstart)
4276                 free (relstart);
4277             }
4278
4279         if (locsyms != NULL
4280             && (symtab_hdr->contents != (unsigned char *) locsyms))
4281           {
4282             if (!info->keep_memory)
4283               free (locsyms);
4284             else
4285               symtab_hdr->contents = (unsigned char *) locsyms;
4286           }
4287       }
4288   return TRUE;
4289 }
4290 \f
4291 /* Adjust a symbol defined by a dynamic object and referenced by a
4292    regular object.  The current definition is in some section of the
4293    dynamic object, but we're not including those sections.  We have to
4294    change the definition to something the rest of the link can
4295    understand.  */
4296
4297 static bfd_boolean
4298 ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
4299                                struct elf_link_hash_entry *h)
4300 {
4301   struct ppc_elf_link_hash_table *htab;
4302   asection *s;
4303
4304 #ifdef DEBUG
4305   fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
4306            h->root.root.string);
4307 #endif
4308
4309   /* Make sure we know what is going on here.  */
4310   htab = ppc_elf_hash_table (info);
4311   BFD_ASSERT (htab->elf.dynobj != NULL
4312               && (h->needs_plt
4313                   || h->u.weakdef != NULL
4314                   || (h->def_dynamic
4315                       && h->ref_regular
4316                       && !h->def_regular)));
4317
4318   /* Deal with function syms.  */
4319   if (h->type == STT_FUNC
4320       || h->needs_plt)
4321     {
4322       /* Clear procedure linkage table information for any symbol that
4323          won't need a .plt entry.  */
4324       struct plt_entry *ent;
4325       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
4326         if (ent->plt.refcount > 0)
4327           break;
4328       if (ent == NULL
4329           || SYMBOL_CALLS_LOCAL (info, h)
4330           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4331               && h->root.type == bfd_link_hash_undefweak))
4332         {
4333           /* A PLT entry is not required/allowed when:
4334
4335              1. We are not using ld.so; because then the PLT entry
4336              can't be set up, so we can't use one.  In this case,
4337              ppc_elf_adjust_dynamic_symbol won't even be called.
4338
4339              2. GC has rendered the entry unused.
4340
4341              3. We know for certain that a call to this symbol
4342              will go to this object, or will remain undefined.  */
4343           h->plt.plist = NULL;
4344           h->needs_plt = 0;
4345         }
4346       return TRUE;
4347     }
4348   else
4349     h->plt.plist = NULL;
4350
4351   /* If this is a weak symbol, and there is a real definition, the
4352      processor independent code will have arranged for us to see the
4353      real definition first, and we can just use the same value.  */
4354   if (h->u.weakdef != NULL)
4355     {
4356       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
4357                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
4358       h->root.u.def.section = h->u.weakdef->root.u.def.section;
4359       h->root.u.def.value = h->u.weakdef->root.u.def.value;
4360       if (ELIMINATE_COPY_RELOCS)
4361         h->non_got_ref = h->u.weakdef->non_got_ref;
4362       return TRUE;
4363     }
4364
4365   /* This is a reference to a symbol defined by a dynamic object which
4366      is not a function.  */
4367
4368   /* If we are creating a shared library, we must presume that the
4369      only references to the symbol are via the global offset table.
4370      For such cases we need not do anything here; the relocations will
4371      be handled correctly by relocate_section.  */
4372   if (info->shared)
4373     return TRUE;
4374
4375   /* If there are no references to this symbol that do not use the
4376      GOT, we don't need to generate a copy reloc.  */
4377   if (!h->non_got_ref)
4378     return TRUE;
4379
4380    /* If we didn't find any dynamic relocs in read-only sections, then
4381       we'll be keeping the dynamic relocs and avoiding the copy reloc.
4382       We can't do this if there are any small data relocations.  This
4383       doesn't work on VxWorks, where we can not have dynamic
4384       relocations (other than copy and jump slot relocations) in an
4385       executable.  */
4386   if (ELIMINATE_COPY_RELOCS
4387       && !ppc_elf_hash_entry (h)->has_sda_refs
4388       && !htab->is_vxworks)
4389     {
4390       struct ppc_elf_dyn_relocs *p;
4391       for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
4392         {
4393           s = p->sec->output_section;
4394           if (s != NULL && (s->flags & SEC_READONLY) != 0)
4395             break;
4396         }
4397
4398       if (p == NULL)
4399         {
4400           h->non_got_ref = 0;
4401           return TRUE;
4402         }
4403     }
4404
4405   if (h->size == 0)
4406     {
4407       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
4408                              h->root.root.string);
4409       return TRUE;
4410     }
4411
4412   /* We must allocate the symbol in our .dynbss section, which will
4413      become part of the .bss section of the executable.  There will be
4414      an entry for this symbol in the .dynsym section.  The dynamic
4415      object will contain position independent code, so all references
4416      from the dynamic object to this symbol will go through the global
4417      offset table.  The dynamic linker will use the .dynsym entry to
4418      determine the address it must put in the global offset table, so
4419      both the dynamic object and the regular object will refer to the
4420      same memory location for the variable.
4421
4422      Of course, if the symbol is referenced using SDAREL relocs, we
4423      must instead allocate it in .sbss.  */
4424
4425   if (ppc_elf_hash_entry (h)->has_sda_refs)
4426     s = htab->dynsbss;
4427   else
4428     s = htab->dynbss;
4429   BFD_ASSERT (s != NULL);
4430
4431   /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
4432      copy the initial value out of the dynamic object and into the
4433      runtime process image.  We need to remember the offset into the
4434      .rela.bss section we are going to use.  */
4435   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
4436     {
4437       asection *srel;
4438
4439       if (ppc_elf_hash_entry (h)->has_sda_refs)
4440         srel = htab->relsbss;
4441       else
4442         srel = htab->relbss;
4443       BFD_ASSERT (srel != NULL);
4444       srel->size += sizeof (Elf32_External_Rela);
4445       h->needs_copy = 1;
4446     }
4447
4448   return _bfd_elf_adjust_dynamic_copy (h, s);
4449 }
4450 \f
4451 /* Generate a symbol to mark plt call stubs.  For non-PIC code the sym is
4452    xxxxxxxx.plt_call32.<callee> where xxxxxxxx is a hex number, usually 0,
4453    specifying the addend on the plt relocation.  For -fpic code, the sym
4454    is xxxxxxxx.plt_pic32.<callee>, and for -fPIC
4455    xxxxxxxx.got2.plt_pic32.<callee>.  */
4456
4457 static bfd_boolean
4458 add_stub_sym (struct plt_entry *ent,
4459               struct elf_link_hash_entry *h,
4460               struct bfd_link_info *info)
4461 {
4462   struct elf_link_hash_entry *sh;
4463   size_t len1, len2, len3;
4464   char *name;
4465   const char *stub;
4466   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
4467
4468   if (info->shared || info->pie)
4469     stub = ".plt_pic32.";
4470   else
4471     stub = ".plt_call32.";
4472
4473   len1 = strlen (h->root.root.string);
4474   len2 = strlen (stub);
4475   len3 = 0;
4476   if (ent->sec)
4477     len3 = strlen (ent->sec->name);
4478   name = bfd_malloc (len1 + len2 + len3 + 9);
4479   if (name == NULL)
4480     return FALSE;
4481   sprintf (name, "%08x", (unsigned) ent->addend & 0xffffffff);
4482   if (ent->sec)
4483     memcpy (name + 8, ent->sec->name, len3);
4484   memcpy (name + 8 + len3, stub, len2);
4485   memcpy (name + 8 + len3 + len2, h->root.root.string, len1 + 1);
4486   sh = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
4487   if (sh == NULL)
4488     return FALSE;
4489   if (sh->root.type == bfd_link_hash_new)
4490     {
4491       sh->root.type = bfd_link_hash_defined;
4492       sh->root.u.def.section = htab->glink;
4493       sh->root.u.def.value = ent->glink_offset;
4494       sh->ref_regular = 1;
4495       sh->def_regular = 1;
4496       sh->ref_regular_nonweak = 1;
4497       sh->forced_local = 1;
4498       sh->non_elf = 0;
4499     }
4500   return TRUE;
4501 }
4502
4503 /* Allocate NEED contiguous space in .got, and return the offset.
4504    Handles allocation of the got header when crossing 32k.  */
4505
4506 static bfd_vma
4507 allocate_got (struct ppc_elf_link_hash_table *htab, unsigned int need)
4508 {
4509   bfd_vma where;
4510   unsigned int max_before_header;
4511
4512   if (htab->plt_type == PLT_VXWORKS)
4513     {
4514       where = htab->got->size;
4515       htab->got->size += need;
4516     }
4517   else
4518     {
4519       max_before_header = htab->plt_type == PLT_NEW ? 32768 : 32764;
4520       if (need <= htab->got_gap)
4521         {
4522           where = max_before_header - htab->got_gap;
4523           htab->got_gap -= need;
4524         }
4525       else
4526         {
4527           if (htab->got->size + need > max_before_header
4528               && htab->got->size <= max_before_header)
4529             {
4530               htab->got_gap = max_before_header - htab->got->size;
4531               htab->got->size = max_before_header + htab->got_header_size;
4532             }
4533           where = htab->got->size;
4534           htab->got->size += need;
4535         }
4536     }
4537   return where;
4538 }
4539
4540 /* Allocate space in associated reloc sections for dynamic relocs.  */
4541
4542 static bfd_boolean
4543 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
4544 {
4545   struct bfd_link_info *info = inf;
4546   struct ppc_elf_link_hash_entry *eh;
4547   struct ppc_elf_link_hash_table *htab;
4548   struct ppc_elf_dyn_relocs *p;
4549
4550   if (h->root.type == bfd_link_hash_indirect)
4551     return TRUE;
4552
4553   if (h->root.type == bfd_link_hash_warning)
4554     /* When warning symbols are created, they **replace** the "real"
4555        entry in the hash table, thus we never get to see the real
4556        symbol in a hash traversal.  So look at it now.  */
4557     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4558
4559   htab = ppc_elf_hash_table (info);
4560   if (htab->elf.dynamic_sections_created)
4561     {
4562       struct plt_entry *ent;
4563       bfd_boolean doneone = FALSE;
4564       bfd_vma plt_offset = 0, glink_offset = 0;
4565
4566       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
4567         if (ent->plt.refcount > 0)
4568           {
4569             /* Make sure this symbol is output as a dynamic symbol.  */
4570             if (h->dynindx == -1
4571                 && !h->forced_local)
4572               {
4573                 if (! bfd_elf_link_record_dynamic_symbol (info, h))
4574                   return FALSE;
4575               }
4576
4577             if (info->shared
4578                 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
4579               {
4580                 asection *s = htab->plt;
4581
4582                 if (htab->plt_type == PLT_NEW)
4583                   {
4584                     if (!doneone)
4585                       {
4586                         plt_offset = s->size;
4587                         s->size += 4;
4588                       }
4589                     ent->plt.offset = plt_offset;
4590
4591                     s = htab->glink;
4592                     if (!doneone || info->shared || info->pie)
4593                       {
4594                         glink_offset = s->size;
4595                         s->size += GLINK_ENTRY_SIZE;
4596                       }
4597                     if (!doneone
4598                         && !info->shared
4599                         && !h->def_regular)
4600                       {
4601                         h->root.u.def.section = s;
4602                         h->root.u.def.value = glink_offset;
4603                       }
4604                     ent->glink_offset = glink_offset;
4605
4606                     if (htab->emit_stub_syms
4607                         && !add_stub_sym (ent, h, info))
4608                       return FALSE;
4609                   }
4610                 else
4611                   {
4612                     if (!doneone)
4613                       {
4614                         /* If this is the first .plt entry, make room
4615                            for the special first entry.  */
4616                         if (s->size == 0)
4617                           s->size += htab->plt_initial_entry_size;
4618
4619                         /* The PowerPC PLT is actually composed of two
4620                            parts, the first part is 2 words (for a load
4621                            and a jump), and then there is a remaining
4622                            word available at the end.  */
4623                         plt_offset = (htab->plt_initial_entry_size
4624                                       + (htab->plt_slot_size
4625                                          * ((s->size
4626                                              - htab->plt_initial_entry_size)
4627                                             / htab->plt_entry_size)));
4628
4629                         /* If this symbol is not defined in a regular
4630                            file, and we are not generating a shared
4631                            library, then set the symbol to this location
4632                            in the .plt.  This is required to make
4633                            function pointers compare as equal between
4634                            the normal executable and the shared library.  */
4635                         if (! info->shared
4636                             && !h->def_regular)
4637                           {
4638                             h->root.u.def.section = s;
4639                             h->root.u.def.value = plt_offset;
4640                           }
4641
4642                         /* Make room for this entry.  */
4643                         s->size += htab->plt_entry_size;
4644                         /* After the 8192nd entry, room for two entries
4645                            is allocated.  */
4646                         if (htab->plt_type == PLT_OLD
4647                             && (s->size - htab->plt_initial_entry_size)
4648                                 / htab->plt_entry_size
4649                                > PLT_NUM_SINGLE_ENTRIES)
4650                           s->size += htab->plt_entry_size;
4651                       }
4652                     ent->plt.offset = plt_offset;
4653                   }
4654
4655                 /* We also need to make an entry in the .rela.plt section.  */
4656                 if (!doneone)
4657                   {
4658                     htab->relplt->size += sizeof (Elf32_External_Rela);
4659
4660                     if (htab->plt_type == PLT_VXWORKS)
4661                       {
4662                         /* Allocate space for the unloaded relocations.  */
4663                         if (!info->shared)
4664                           {
4665                             if (ent->plt.offset
4666                                 == (bfd_vma) htab->plt_initial_entry_size)
4667                               {
4668                                 htab->srelplt2->size
4669                                   += sizeof (Elf32_External_Rela)
4670                                       * VXWORKS_PLTRESOLVE_RELOCS;
4671                               }
4672
4673                             htab->srelplt2->size
4674                               += sizeof (Elf32_External_Rela)
4675                                   * VXWORKS_PLT_NON_JMP_SLOT_RELOCS;
4676                           }
4677
4678                         /* Every PLT entry has an associated GOT entry in
4679                            .got.plt.  */
4680                         htab->sgotplt->size += 4;
4681                       }
4682                     doneone = TRUE;
4683                   }
4684               }
4685             else
4686               ent->plt.offset = (bfd_vma) -1;
4687           }
4688         else
4689           ent->plt.offset = (bfd_vma) -1;
4690
4691       if (!doneone)
4692         {
4693           h->plt.plist = NULL;
4694           h->needs_plt = 0;
4695         }
4696     }
4697   else
4698     {
4699       h->plt.plist = NULL;
4700       h->needs_plt = 0;
4701     }
4702
4703   eh = (struct ppc_elf_link_hash_entry *) h;
4704   if (eh->elf.got.refcount > 0)
4705     {
4706       /* Make sure this symbol is output as a dynamic symbol.  */
4707       if (eh->elf.dynindx == -1
4708           && !eh->elf.forced_local)
4709         {
4710           if (!bfd_elf_link_record_dynamic_symbol (info, &eh->elf))
4711             return FALSE;
4712         }
4713
4714       if (eh->tls_mask == (TLS_TLS | TLS_LD)
4715           && !eh->elf.def_dynamic)
4716         {
4717           /* If just an LD reloc, we'll just use htab->tlsld_got.offset.  */
4718           htab->tlsld_got.refcount += 1;
4719           eh->elf.got.offset = (bfd_vma) -1;
4720         }
4721       else
4722         {
4723           bfd_boolean dyn;
4724           unsigned int need = 0;
4725           if ((eh->tls_mask & TLS_TLS) != 0)
4726             {
4727               if ((eh->tls_mask & TLS_LD) != 0)
4728                 need += 8;
4729               if ((eh->tls_mask & TLS_GD) != 0)
4730                 need += 8;
4731               if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
4732                 need += 4;
4733               if ((eh->tls_mask & TLS_DTPREL) != 0)
4734                 need += 4;
4735             }
4736           else
4737             need += 4;
4738           eh->elf.got.offset = allocate_got (htab, need);
4739           dyn = htab->elf.dynamic_sections_created;
4740           if ((info->shared
4741                || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, &eh->elf))
4742               && (ELF_ST_VISIBILITY (eh->elf.other) == STV_DEFAULT
4743                   || eh->elf.root.type != bfd_link_hash_undefweak))
4744             {
4745               /* All the entries we allocated need relocs.
4746                  Except LD only needs one.  */
4747               if ((eh->tls_mask & TLS_LD) != 0)
4748                 need -= 4;
4749               htab->relgot->size += need * (sizeof (Elf32_External_Rela) / 4);
4750             }
4751         }
4752     }
4753   else
4754     eh->elf.got.offset = (bfd_vma) -1;
4755
4756   if (eh->dyn_relocs == NULL)
4757     return TRUE;
4758
4759   /* In the shared -Bsymbolic case, discard space allocated for
4760      dynamic pc-relative relocs against symbols which turn out to be
4761      defined in regular objects.  For the normal shared case, discard
4762      space for relocs that have become local due to symbol visibility
4763      changes.  */
4764
4765   if (info->shared)
4766     {
4767       /* Relocs that use pc_count are those that appear on a call insn,
4768          or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
4769          generated via assembly.  We want calls to protected symbols to
4770          resolve directly to the function rather than going via the plt.
4771          If people want function pointer comparisons to work as expected
4772          then they should avoid writing weird assembly.  */
4773       if (SYMBOL_CALLS_LOCAL (info, h))
4774         {
4775           struct ppc_elf_dyn_relocs **pp;
4776
4777           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
4778             {
4779               p->count -= p->pc_count;
4780               p->pc_count = 0;
4781               if (p->count == 0)
4782                 *pp = p->next;
4783               else
4784                 pp = &p->next;
4785             }
4786         }
4787
4788       /* Also discard relocs on undefined weak syms with non-default
4789          visibility.  */
4790       if (eh->dyn_relocs != NULL
4791           && h->root.type == bfd_link_hash_undefweak)
4792         {
4793           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4794             eh->dyn_relocs = NULL;
4795
4796           /* Make sure undefined weak symbols are output as a dynamic
4797              symbol in PIEs.  */
4798           else if (h->dynindx == -1
4799                    && !h->forced_local)
4800             {
4801               if (! bfd_elf_link_record_dynamic_symbol (info, h))
4802                 return FALSE;
4803             }
4804         }
4805     }
4806   else if (ELIMINATE_COPY_RELOCS)
4807     {
4808       /* For the non-shared case, discard space for relocs against
4809          symbols which turn out to need copy relocs or are not
4810          dynamic.  */
4811
4812       if (!h->non_got_ref
4813           && h->def_dynamic
4814           && !h->def_regular)
4815         {
4816           /* Make sure this symbol is output as a dynamic symbol.
4817              Undefined weak syms won't yet be marked as dynamic.  */
4818           if (h->dynindx == -1
4819               && !h->forced_local)
4820             {
4821               if (! bfd_elf_link_record_dynamic_symbol (info, h))
4822                 return FALSE;
4823             }
4824
4825           /* If that succeeded, we know we'll be keeping all the
4826              relocs.  */
4827           if (h->dynindx != -1)
4828             goto keep;
4829         }
4830
4831       eh->dyn_relocs = NULL;
4832
4833     keep: ;
4834     }
4835
4836   /* Finally, allocate space.  */
4837   for (p = eh->dyn_relocs; p != NULL; p = p->next)
4838     {
4839       asection *sreloc = elf_section_data (p->sec)->sreloc;
4840       sreloc->size += p->count * sizeof (Elf32_External_Rela);
4841     }
4842
4843   return TRUE;
4844 }
4845
4846 /* Find any dynamic relocs that apply to read-only sections.  */
4847
4848 static bfd_boolean
4849 readonly_dynrelocs (struct elf_link_hash_entry *h, void *info)
4850 {
4851   struct ppc_elf_dyn_relocs *p;
4852
4853   if (h->root.type == bfd_link_hash_indirect)
4854     return TRUE;
4855
4856   if (h->root.type == bfd_link_hash_warning)
4857     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4858
4859   for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
4860     {
4861       asection *s = p->sec->output_section;
4862
4863       if (s != NULL
4864           && ((s->flags & (SEC_READONLY | SEC_ALLOC))
4865               == (SEC_READONLY | SEC_ALLOC)))
4866         {
4867           ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
4868
4869           /* Not an error, just cut short the traversal.  */
4870           return FALSE;
4871         }
4872     }
4873   return TRUE;
4874 }
4875
4876 /* Set the sizes of the dynamic sections.  */
4877
4878 static bfd_boolean
4879 ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
4880                                struct bfd_link_info *info)
4881 {
4882   struct ppc_elf_link_hash_table *htab;
4883   asection *s;
4884   bfd_boolean relocs;
4885   bfd *ibfd;
4886
4887 #ifdef DEBUG
4888   fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
4889 #endif
4890
4891   htab = ppc_elf_hash_table (info);
4892   BFD_ASSERT (htab->elf.dynobj != NULL);
4893
4894   if (elf_hash_table (info)->dynamic_sections_created)
4895     {
4896       /* Set the contents of the .interp section to the interpreter.  */
4897       if (info->executable)
4898         {
4899           s = bfd_get_section_by_name (htab->elf.dynobj, ".interp");
4900           BFD_ASSERT (s != NULL);
4901           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4902           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4903         }
4904     }
4905
4906   if (htab->plt_type == PLT_OLD)
4907     htab->got_header_size = 16;
4908   else if (htab->plt_type == PLT_NEW)
4909     htab->got_header_size = 12;
4910
4911   /* Set up .got offsets for local syms, and space for local dynamic
4912      relocs.  */
4913   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4914     {
4915       bfd_signed_vma *local_got;
4916       bfd_signed_vma *end_local_got;
4917       char *lgot_masks;
4918       bfd_size_type locsymcount;
4919       Elf_Internal_Shdr *symtab_hdr;
4920
4921       if (!is_ppc_elf_target (ibfd->xvec))
4922         continue;
4923
4924       for (s = ibfd->sections; s != NULL; s = s->next)
4925         {
4926           struct ppc_elf_dyn_relocs *p;
4927
4928           for (p = ((struct ppc_elf_dyn_relocs *)
4929                     elf_section_data (s)->local_dynrel);
4930                p != NULL;
4931                p = p->next)
4932             {
4933               if (!bfd_is_abs_section (p->sec)
4934                   && bfd_is_abs_section (p->sec->output_section))
4935                 {
4936                   /* Input section has been discarded, either because
4937                      it is a copy of a linkonce section or due to
4938                      linker script /DISCARD/, so we'll be discarding
4939                      the relocs too.  */
4940                 }
4941               else if (p->count != 0)
4942                 {
4943                   elf_section_data (p->sec)->sreloc->size
4944                     += p->count * sizeof (Elf32_External_Rela);
4945                   if ((p->sec->output_section->flags
4946                        & (SEC_READONLY | SEC_ALLOC))
4947                       == (SEC_READONLY | SEC_ALLOC))
4948                     info->flags |= DF_TEXTREL;
4949                 }
4950             }
4951         }
4952
4953       local_got = elf_local_got_refcounts (ibfd);
4954       if (!local_got)
4955         continue;
4956
4957       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4958       locsymcount = symtab_hdr->sh_info;
4959       end_local_got = local_got + locsymcount;
4960       lgot_masks = (char *) end_local_got;
4961       for (; local_got < end_local_got; ++local_got, ++lgot_masks)
4962         if (*local_got > 0)
4963           {
4964             if (*lgot_masks == (TLS_TLS | TLS_LD))
4965               {
4966                 /* If just an LD reloc, we'll just use
4967                    htab->tlsld_got.offset.  */
4968                 htab->tlsld_got.refcount += 1;
4969                 *local_got = (bfd_vma) -1;
4970               }
4971             else
4972               {
4973                 unsigned int need = 0;
4974                 if ((*lgot_masks & TLS_TLS) != 0)
4975                   {
4976                     if ((*lgot_masks & TLS_GD) != 0)
4977                       need += 8;
4978                     if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
4979                       need += 4;
4980                     if ((*lgot_masks & TLS_DTPREL) != 0)
4981                       need += 4;
4982                   }
4983                 else
4984                   need += 4;
4985                 *local_got = allocate_got (htab, need);
4986                 if (info->shared)
4987                   htab->relgot->size += (need
4988                                          * (sizeof (Elf32_External_Rela) / 4));
4989               }
4990           }
4991         else
4992           *local_got = (bfd_vma) -1;
4993     }
4994
4995   /* Allocate space for global sym dynamic relocs.  */
4996   elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
4997
4998   if (htab->tlsld_got.refcount > 0)
4999     {
5000       htab->tlsld_got.offset = allocate_got (htab, 8);
5001       if (info->shared)
5002         htab->relgot->size += sizeof (Elf32_External_Rela);
5003     }
5004   else
5005     htab->tlsld_got.offset = (bfd_vma) -1;
5006
5007   if (htab->got != NULL && htab->plt_type != PLT_VXWORKS)
5008     {
5009       unsigned int g_o_t = 32768;
5010
5011       /* If we haven't allocated the header, do so now.  When we get here,
5012          for old plt/got the got size will be 0 to 32764 (not allocated),
5013          or 32780 to 65536 (header allocated).  For new plt/got, the
5014          corresponding ranges are 0 to 32768 and 32780 to 65536.  */
5015       if (htab->got->size <= 32768)
5016         {
5017           g_o_t = htab->got->size;
5018           if (htab->plt_type == PLT_OLD)
5019             g_o_t += 4;
5020           htab->got->size += htab->got_header_size;
5021         }
5022
5023       htab->elf.hgot->root.u.def.value = g_o_t;
5024     }
5025
5026   if (htab->glink != NULL && htab->glink->size != 0)
5027     {
5028       htab->glink_pltresolve = htab->glink->size;
5029       /* Space for the branch table.  */
5030       htab->glink->size += htab->glink->size / (GLINK_ENTRY_SIZE / 4) - 4;
5031       /* Pad out to align the start of PLTresolve.  */
5032       htab->glink->size += -htab->glink->size & 15;
5033       htab->glink->size += GLINK_PLTRESOLVE;
5034
5035       if (htab->emit_stub_syms)
5036         {
5037           struct elf_link_hash_entry *sh;
5038           sh = elf_link_hash_lookup (&htab->elf, "__glink",
5039                                      TRUE, FALSE, FALSE);
5040           if (sh == NULL)
5041             return FALSE;
5042           if (sh->root.type == bfd_link_hash_new)
5043             {
5044               sh->root.type = bfd_link_hash_defined;
5045               sh->root.u.def.section = htab->glink;
5046               sh->root.u.def.value = htab->glink_pltresolve;
5047               sh->ref_regular = 1;
5048               sh->def_regular = 1;
5049               sh->ref_regular_nonweak = 1;
5050               sh->forced_local = 1;
5051               sh->non_elf = 0;
5052             }
5053           sh = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
5054                                      TRUE, FALSE, FALSE);
5055           if (sh == NULL)
5056             return FALSE;
5057           if (sh->root.type == bfd_link_hash_new)
5058             {
5059               sh->root.type = bfd_link_hash_defined;
5060               sh->root.u.def.section = htab->glink;
5061               sh->root.u.def.value = htab->glink->size - GLINK_PLTRESOLVE;
5062               sh->ref_regular = 1;
5063               sh->def_regular = 1;
5064               sh->ref_regular_nonweak = 1;
5065               sh->forced_local = 1;
5066               sh->non_elf = 0;
5067             }
5068         }
5069     }
5070
5071   /* We've now determined the sizes of the various dynamic sections.
5072      Allocate memory for them.  */
5073   relocs = FALSE;
5074   for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
5075     {
5076       bfd_boolean strip_section = TRUE;
5077
5078       if ((s->flags & SEC_LINKER_CREATED) == 0)
5079         continue;
5080
5081       if (s == htab->plt
5082           || s == htab->glink
5083           || s == htab->got
5084           || s == htab->sgotplt
5085           || s == htab->sbss
5086           || s == htab->dynbss
5087           || s == htab->dynsbss)
5088         {
5089           /* We'd like to strip these sections if they aren't needed, but if
5090              we've exported dynamic symbols from them we must leave them.
5091              It's too late to tell BFD to get rid of the symbols.  */
5092           if ((s == htab->plt || s == htab->got) && htab->elf.hplt != NULL)
5093             strip_section = FALSE;
5094           /* Strip this section if we don't need it; see the
5095              comment below.  */
5096         }
5097       else if (s == htab->sdata[0].section
5098                || s == htab->sdata[1].section)
5099         {
5100           /* Strip these too.  */
5101         }
5102       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
5103         {
5104           if (s->size != 0)
5105             {
5106               /* Remember whether there are any relocation sections.  */
5107               relocs = TRUE;
5108
5109               /* We use the reloc_count field as a counter if we need
5110                  to copy relocs into the output file.  */
5111               s->reloc_count = 0;
5112             }
5113         }
5114       else
5115         {
5116           /* It's not one of our sections, so don't allocate space.  */
5117           continue;
5118         }
5119
5120       if (s->size == 0 && strip_section)
5121         {
5122           /* If we don't need this section, strip it from the
5123              output file.  This is mostly to handle .rela.bss and
5124              .rela.plt.  We must create both sections in
5125              create_dynamic_sections, because they must be created
5126              before the linker maps input sections to output
5127              sections.  The linker does that before
5128              adjust_dynamic_symbol is called, and it is that
5129              function which decides whether anything needs to go
5130              into these sections.  */
5131           s->flags |= SEC_EXCLUDE;
5132           continue;
5133         }
5134
5135       if ((s->flags & SEC_HAS_CONTENTS) == 0)
5136         continue;
5137
5138       /* Allocate memory for the section contents.  */
5139       s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
5140       if (s->contents == NULL)
5141         return FALSE;
5142     }
5143
5144   if (htab->elf.dynamic_sections_created)
5145     {
5146       /* Add some entries to the .dynamic section.  We fill in the
5147          values later, in ppc_elf_finish_dynamic_sections, but we
5148          must add the entries now so that we get the correct size for
5149          the .dynamic section.  The DT_DEBUG entry is filled in by the
5150          dynamic linker and used by the debugger.  */
5151 #define add_dynamic_entry(TAG, VAL) \
5152   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5153
5154       if (info->executable)
5155         {
5156           if (!add_dynamic_entry (DT_DEBUG, 0))
5157             return FALSE;
5158         }
5159
5160       if (htab->plt != NULL && htab->plt->size != 0)
5161         {
5162           if (!add_dynamic_entry (DT_PLTGOT, 0)
5163               || !add_dynamic_entry (DT_PLTRELSZ, 0)
5164               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5165               || !add_dynamic_entry (DT_JMPREL, 0))
5166             return FALSE;
5167         }
5168
5169       if (htab->glink != NULL && htab->glink->size != 0)
5170         {
5171           if (!add_dynamic_entry (DT_PPC_GOT, 0))
5172             return FALSE;
5173         }
5174
5175       if (relocs)
5176         {
5177           if (!add_dynamic_entry (DT_RELA, 0)
5178               || !add_dynamic_entry (DT_RELASZ, 0)
5179               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
5180             return FALSE;
5181         }
5182
5183       /* If any dynamic relocs apply to a read-only section, then we
5184          need a DT_TEXTREL entry.  */
5185       if ((info->flags & DF_TEXTREL) == 0)
5186         elf_link_hash_traverse (elf_hash_table (info), readonly_dynrelocs,
5187                                 info);
5188
5189       if ((info->flags & DF_TEXTREL) != 0)
5190         {
5191           if (!add_dynamic_entry (DT_TEXTREL, 0))
5192             return FALSE;
5193         }
5194       if (htab->is_vxworks
5195           && !elf_vxworks_add_dynamic_entries (output_bfd, info))
5196         return FALSE;
5197    }
5198 #undef add_dynamic_entry
5199
5200   return TRUE;
5201 }
5202 \f
5203 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
5204
5205 static const int shared_stub_entry[] =
5206   {
5207     0x7c0802a6, /* mflr 0 */
5208     0x429f0005, /* bcl 20, 31, .Lxxx */
5209     0x7d6802a6, /* mflr 11 */
5210     0x3d6b0000, /* addis 11, 11, (xxx-.Lxxx)@ha */
5211     0x396b0018, /* addi 11, 11, (xxx-.Lxxx)@l */
5212     0x7c0803a6, /* mtlr 0 */
5213     0x7d6903a6, /* mtctr 11 */
5214     0x4e800420, /* bctr */
5215   };
5216
5217 static const int stub_entry[] =
5218   {
5219     0x3d600000, /* lis 11,xxx@ha */
5220     0x396b0000, /* addi 11,11,xxx@l */
5221     0x7d6903a6, /* mtctr 11 */
5222     0x4e800420, /* bctr */
5223   };
5224
5225 static bfd_boolean
5226 ppc_elf_relax_section (bfd *abfd,
5227                        asection *isec,
5228                        struct bfd_link_info *link_info,
5229                        bfd_boolean *again)
5230 {
5231   struct one_fixup
5232   {
5233     struct one_fixup *next;
5234     asection *tsec;
5235     bfd_vma toff;
5236     bfd_vma trampoff;
5237   };
5238
5239   Elf_Internal_Shdr *symtab_hdr;
5240   bfd_byte *contents = NULL;
5241   Elf_Internal_Sym *isymbuf = NULL;
5242   Elf_Internal_Rela *internal_relocs = NULL;
5243   Elf_Internal_Rela *irel, *irelend;
5244   struct one_fixup *fixups = NULL;
5245   bfd_boolean changed;
5246   struct ppc_elf_link_hash_table *htab;
5247   bfd_size_type trampoff;
5248   asection *got2;
5249
5250   *again = FALSE;
5251
5252   /* Nothing to do if there are no relocations, and no need to do
5253      anything with non-alloc sections.  */
5254   if ((isec->flags & SEC_ALLOC) == 0
5255       || (isec->flags & SEC_RELOC) == 0
5256       || isec->reloc_count == 0)
5257     return TRUE;
5258
5259   trampoff = (isec->size + 3) & (bfd_vma) -4;
5260   /* Space for a branch around any trampolines.  */
5261   trampoff += 4;
5262
5263   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5264
5265   /* Get a copy of the native relocations.  */
5266   internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
5267                                                link_info->keep_memory);
5268   if (internal_relocs == NULL)
5269     goto error_return;
5270
5271   htab = ppc_elf_hash_table (link_info);
5272   got2 = bfd_get_section_by_name (abfd, ".got2");
5273
5274   irelend = internal_relocs + isec->reloc_count;
5275   for (irel = internal_relocs; irel < irelend; irel++)
5276     {
5277       unsigned long r_type = ELF32_R_TYPE (irel->r_info);
5278       bfd_vma symaddr, reladdr, toff, roff;
5279       asection *tsec;
5280       struct one_fixup *f;
5281       size_t insn_offset = 0;
5282       bfd_vma max_branch_offset, val;
5283       bfd_byte *hit_addr;
5284       unsigned long t0;
5285       unsigned char sym_type;
5286
5287       switch (r_type)
5288         {
5289         case R_PPC_REL24:
5290         case R_PPC_LOCAL24PC:
5291         case R_PPC_PLTREL24:
5292           max_branch_offset = 1 << 25;
5293           break;
5294
5295         case R_PPC_REL14:
5296         case R_PPC_REL14_BRTAKEN:
5297         case R_PPC_REL14_BRNTAKEN:
5298           max_branch_offset = 1 << 15;
5299           break;
5300
5301         default:
5302           continue;
5303         }
5304
5305       /* Get the value of the symbol referred to by the reloc.  */
5306       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
5307         {
5308           /* A local symbol.  */
5309           Elf_Internal_Sym *isym;
5310
5311           /* Read this BFD's local symbols.  */
5312           if (isymbuf == NULL)
5313             {
5314               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
5315               if (isymbuf == NULL)
5316                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
5317                                                 symtab_hdr->sh_info, 0,
5318                                                 NULL, NULL, NULL);
5319               if (isymbuf == 0)
5320                 goto error_return;
5321             }
5322           isym = isymbuf + ELF32_R_SYM (irel->r_info);
5323           if (isym->st_shndx == SHN_UNDEF)
5324             continue;   /* We can't do anything with undefined symbols.  */
5325           else if (isym->st_shndx == SHN_ABS)
5326             tsec = bfd_abs_section_ptr;
5327           else if (isym->st_shndx == SHN_COMMON)
5328             tsec = bfd_com_section_ptr;
5329           else
5330             tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
5331
5332           toff = isym->st_value;
5333           sym_type = ELF_ST_TYPE (isym->st_info);
5334         }
5335       else
5336         {
5337           /* Global symbol handling.  */
5338           unsigned long indx;
5339           struct elf_link_hash_entry *h;
5340
5341           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
5342           h = elf_sym_hashes (abfd)[indx];
5343
5344           while (h->root.type == bfd_link_hash_indirect
5345                  || h->root.type == bfd_link_hash_warning)
5346             h = (struct elf_link_hash_entry *) h->root.u.i.link;
5347
5348           tsec = NULL;
5349           toff = 0;
5350           if (r_type == R_PPC_PLTREL24
5351               && htab->plt != NULL)
5352             {
5353               struct plt_entry *ent = find_plt_ent (h, got2, irel->r_addend);
5354
5355               if (ent != NULL)
5356                 {
5357                   if (htab->plt_type == PLT_NEW)
5358                     {
5359                       tsec = htab->glink;
5360                       toff = ent->glink_offset;
5361                     }
5362                   else
5363                     {
5364                       tsec = htab->plt;
5365                       toff = ent->plt.offset;
5366                     }
5367                 }
5368             }
5369           if (tsec != NULL)
5370             ;
5371           else if (h->root.type == bfd_link_hash_defined
5372                    || h->root.type == bfd_link_hash_defweak)
5373             {
5374               tsec = h->root.u.def.section;
5375               toff = h->root.u.def.value;
5376             }
5377           else
5378             continue;
5379
5380           sym_type = h->type;
5381         }
5382
5383       /* If the branch and target are in the same section, you have
5384          no hope of adding stubs.  We'll error out later should the
5385          branch overflow.  */
5386       if (tsec == isec)
5387         continue;
5388
5389       /* There probably isn't any reason to handle symbols in
5390          SEC_MERGE sections;  SEC_MERGE doesn't seem a likely
5391          attribute for a code section, and we are only looking at
5392          branches.  However, implement it correctly here as a
5393          reference for other target relax_section functions.  */
5394       if (0 && tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
5395         {
5396           /* At this stage in linking, no SEC_MERGE symbol has been
5397              adjusted, so all references to such symbols need to be
5398              passed through _bfd_merged_section_offset.  (Later, in
5399              relocate_section, all SEC_MERGE symbols *except* for
5400              section symbols have been adjusted.)
5401
5402              gas may reduce relocations against symbols in SEC_MERGE
5403              sections to a relocation against the section symbol when
5404              the original addend was zero.  When the reloc is against
5405              a section symbol we should include the addend in the
5406              offset passed to _bfd_merged_section_offset, since the
5407              location of interest is the original symbol.  On the
5408              other hand, an access to "sym+addend" where "sym" is not
5409              a section symbol should not include the addend;  Such an
5410              access is presumed to be an offset from "sym";  The
5411              location of interest is just "sym".  */
5412           if (sym_type == STT_SECTION)
5413             toff += irel->r_addend;
5414
5415           toff = _bfd_merged_section_offset (abfd, &tsec,
5416                                              elf_section_data (tsec)->sec_info,
5417                                              toff);
5418
5419           if (sym_type != STT_SECTION)
5420             toff += irel->r_addend;
5421         }
5422       /* PLTREL24 addends are special.  */
5423       else if (r_type != R_PPC_PLTREL24)
5424         toff += irel->r_addend;
5425
5426       /* Attempted -shared link of non-pic code loses.  */
5427       if (tsec->output_section == NULL)
5428         continue;
5429
5430       symaddr = tsec->output_section->vma + tsec->output_offset + toff;
5431
5432       roff = irel->r_offset;
5433       reladdr = isec->output_section->vma + isec->output_offset + roff;
5434
5435       /* If the branch is in range, no need to do anything.  */
5436       if (symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
5437         continue;
5438
5439       /* Look for an existing fixup to this address.  */
5440       for (f = fixups; f ; f = f->next)
5441         if (f->tsec == tsec && f->toff == toff)
5442           break;
5443
5444       if (f == NULL)
5445         {
5446           size_t size;
5447           unsigned long stub_rtype;
5448
5449           val = trampoff - roff;
5450           if (val >= max_branch_offset)
5451             /* Oh dear, we can't reach a trampoline.  Don't try to add
5452                one.  We'll report an error later.  */
5453             continue;
5454
5455           if (link_info->shared)
5456             {
5457               size = 4 * ARRAY_SIZE (shared_stub_entry);
5458               insn_offset = 12;
5459               stub_rtype = R_PPC_RELAX32PC;
5460             }
5461           else
5462             {
5463               size = 4 * ARRAY_SIZE (stub_entry);
5464               insn_offset = 0;
5465               stub_rtype = R_PPC_RELAX32;
5466             }
5467
5468           if (R_PPC_RELAX32_PLT - R_PPC_RELAX32
5469               != R_PPC_RELAX32PC_PLT - R_PPC_RELAX32PC)
5470             abort ();
5471           if (tsec == htab->plt
5472               || tsec == htab->glink)
5473             stub_rtype += R_PPC_RELAX32_PLT - R_PPC_RELAX32;
5474
5475           /* Hijack the old relocation.  Since we need two
5476              relocations for this use a "composite" reloc.  */
5477           irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
5478                                        stub_rtype);
5479           irel->r_offset = trampoff + insn_offset;
5480
5481           /* Record the fixup so we don't do it again this section.  */
5482           f = bfd_malloc (sizeof (*f));
5483           f->next = fixups;
5484           f->tsec = tsec;
5485           f->toff = toff;
5486           f->trampoff = trampoff;
5487           fixups = f;
5488
5489           trampoff += size;
5490         }
5491       else
5492         {
5493           val = f->trampoff - roff;
5494           if (val >= max_branch_offset)
5495             continue;
5496
5497           /* Nop out the reloc, since we're finalizing things here.  */
5498           irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
5499         }
5500
5501       /* Get the section contents.  */
5502       if (contents == NULL)
5503         {
5504           /* Get cached copy if it exists.  */
5505           if (elf_section_data (isec)->this_hdr.contents != NULL)
5506             contents = elf_section_data (isec)->this_hdr.contents;
5507           else
5508             {
5509               /* Go get them off disk.  */
5510               if (!bfd_malloc_and_get_section (abfd, isec, &contents))
5511                 goto error_return;
5512             }
5513         }
5514
5515       /* Fix up the existing branch to hit the trampoline.  */
5516       hit_addr = contents + roff;
5517       switch (r_type)
5518         {
5519         case R_PPC_REL24:
5520         case R_PPC_LOCAL24PC:
5521         case R_PPC_PLTREL24:
5522           t0 = bfd_get_32 (abfd, hit_addr);
5523           t0 &= ~0x3fffffc;
5524           t0 |= val & 0x3fffffc;
5525           bfd_put_32 (abfd, t0, hit_addr);
5526           break;
5527
5528         case R_PPC_REL14:
5529         case R_PPC_REL14_BRTAKEN:
5530         case R_PPC_REL14_BRNTAKEN:
5531           t0 = bfd_get_32 (abfd, hit_addr);
5532           t0 &= ~0xfffc;
5533           t0 |= val & 0xfffc;
5534           bfd_put_32 (abfd, t0, hit_addr);
5535           break;
5536         }
5537     }
5538
5539   /* Write out the trampolines.  */
5540   changed = fixups != NULL;
5541   if (fixups != NULL)
5542     {
5543       const int *stub;
5544       bfd_byte *dest;
5545       bfd_vma val;
5546       int i, size;
5547
5548       do
5549         {
5550           struct one_fixup *f = fixups;
5551           fixups = fixups->next;
5552           free (f);
5553         }
5554       while (fixups);
5555
5556       contents = bfd_realloc (contents, trampoff);
5557       if (contents == NULL)
5558         goto error_return;
5559
5560       isec->size = (isec->size + 3) & (bfd_vma) -4;
5561       /* Branch around the trampolines.  */
5562       val = trampoff - isec->size + 0x48000000;
5563       dest = contents + isec->size;
5564       isec->size = trampoff;
5565       bfd_put_32 (abfd, val, dest);
5566       dest += 4;
5567
5568       if (link_info->shared)
5569         {
5570           stub = shared_stub_entry;
5571           size = ARRAY_SIZE (shared_stub_entry);
5572         }
5573       else
5574         {
5575           stub = stub_entry;
5576           size = ARRAY_SIZE (stub_entry);
5577         }
5578
5579       i = 0;
5580       while (dest < contents + trampoff)
5581         {
5582           bfd_put_32 (abfd, stub[i], dest);
5583           i++;
5584           if (i == size)
5585             i = 0;
5586           dest += 4;
5587         }
5588       BFD_ASSERT (i == 0);
5589     }
5590
5591   if (isymbuf != NULL
5592       && symtab_hdr->contents != (unsigned char *) isymbuf)
5593     {
5594       if (! link_info->keep_memory)
5595         free (isymbuf);
5596       else
5597         {
5598           /* Cache the symbols for elf_link_input_bfd.  */
5599           symtab_hdr->contents = (unsigned char *) isymbuf;
5600         }
5601     }
5602
5603   if (contents != NULL
5604       && elf_section_data (isec)->this_hdr.contents != contents)
5605     {
5606       if (!changed && !link_info->keep_memory)
5607         free (contents);
5608       else
5609         {
5610           /* Cache the section contents for elf_link_input_bfd.  */
5611           elf_section_data (isec)->this_hdr.contents = contents;
5612         }
5613     }
5614
5615   if (elf_section_data (isec)->relocs != internal_relocs)
5616     {
5617       if (!changed)
5618         free (internal_relocs);
5619       else
5620         elf_section_data (isec)->relocs = internal_relocs;
5621     }
5622
5623   *again = changed;
5624   return TRUE;
5625
5626  error_return:
5627   if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
5628     free (isymbuf);
5629   if (contents != NULL
5630       && elf_section_data (isec)->this_hdr.contents != contents)
5631     free (contents);
5632   if (internal_relocs != NULL
5633       && elf_section_data (isec)->relocs != internal_relocs)
5634     free (internal_relocs);
5635   return FALSE;
5636 }
5637 \f
5638 /* What to do when ld finds relocations against symbols defined in
5639    discarded sections.  */
5640
5641 static unsigned int
5642 ppc_elf_action_discarded (asection *sec)
5643 {
5644   if (strcmp (".fixup", sec->name) == 0)
5645     return 0;
5646
5647   if (strcmp (".got2", sec->name) == 0)
5648     return 0;
5649
5650   return _bfd_elf_default_action_discarded (sec);
5651 }
5652 \f
5653 /* Fill in the address for a pointer generated in a linker section.  */
5654
5655 static bfd_vma
5656 elf_finish_pointer_linker_section (bfd *input_bfd,
5657                                    elf_linker_section_t *lsect,
5658                                    struct elf_link_hash_entry *h,
5659                                    bfd_vma relocation,
5660                                    const Elf_Internal_Rela *rel)
5661 {
5662   elf_linker_section_pointers_t *linker_section_ptr;
5663
5664   BFD_ASSERT (lsect != NULL);
5665
5666   if (h != NULL)
5667     {
5668       /* Handle global symbol.  */
5669       struct ppc_elf_link_hash_entry *eh;
5670
5671       eh = (struct ppc_elf_link_hash_entry *) h;
5672       BFD_ASSERT (eh->elf.def_regular);
5673       linker_section_ptr = eh->linker_section_pointer;
5674     }
5675   else
5676     {
5677       /* Handle local symbol.  */
5678       unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
5679
5680       BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
5681       linker_section_ptr = elf_local_ptr_offsets (input_bfd)[r_symndx];
5682     }
5683
5684   linker_section_ptr = elf_find_pointer_linker_section (linker_section_ptr,
5685                                                         rel->r_addend,
5686                                                         lsect);
5687   BFD_ASSERT (linker_section_ptr != NULL);
5688
5689   /* Offset will always be a multiple of four, so use the bottom bit
5690      as a "written" flag.  */
5691   if ((linker_section_ptr->offset & 1) == 0)
5692     {
5693       bfd_put_32 (lsect->section->owner,
5694                   relocation + linker_section_ptr->addend,
5695                   lsect->section->contents + linker_section_ptr->offset);
5696       linker_section_ptr->offset += 1;
5697     }
5698
5699   relocation = (lsect->section->output_offset
5700                 + linker_section_ptr->offset - 1
5701                 - 0x8000);
5702
5703 #ifdef DEBUG
5704   fprintf (stderr,
5705            "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
5706            lsect->name, (long) relocation, (long) relocation);
5707 #endif
5708
5709   /* Subtract out the addend, because it will get added back in by the normal
5710      processing.  */
5711   return relocation - linker_section_ptr->addend;
5712 }
5713
5714 /* The RELOCATE_SECTION function is called by the ELF backend linker
5715    to handle the relocations for a section.
5716
5717    The relocs are always passed as Rela structures; if the section
5718    actually uses Rel structures, the r_addend field will always be
5719    zero.
5720
5721    This function is responsible for adjust the section contents as
5722    necessary, and (if using Rela relocs and generating a
5723    relocatable output file) adjusting the reloc addend as
5724    necessary.
5725
5726    This function does not have to worry about setting the reloc
5727    address or the reloc symbol index.
5728
5729    LOCAL_SYMS is a pointer to the swapped in local symbols.
5730
5731    LOCAL_SECTIONS is an array giving the section in the input file
5732    corresponding to the st_shndx field of each local symbol.
5733
5734    The global hash table entry for the global symbols can be found
5735    via elf_sym_hashes (input_bfd).
5736
5737    When generating relocatable output, this function must handle
5738    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
5739    going to be the section symbol corresponding to the output
5740    section, which means that the addend must be adjusted
5741    accordingly.  */
5742
5743 static bfd_boolean
5744 ppc_elf_relocate_section (bfd *output_bfd,
5745                           struct bfd_link_info *info,
5746                           bfd *input_bfd,
5747                           asection *input_section,
5748                           bfd_byte *contents,
5749                           Elf_Internal_Rela *relocs,
5750                           Elf_Internal_Sym *local_syms,
5751                           asection **local_sections)
5752 {
5753   Elf_Internal_Shdr *symtab_hdr;
5754   struct elf_link_hash_entry **sym_hashes;
5755   struct ppc_elf_link_hash_table *htab;
5756   Elf_Internal_Rela *rel;
5757   Elf_Internal_Rela *relend;
5758   Elf_Internal_Rela outrel;
5759   bfd_byte *loc;
5760   asection *got2, *sreloc = NULL;
5761   bfd_vma *local_got_offsets;
5762   bfd_boolean ret = TRUE;
5763   bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
5764
5765 #ifdef DEBUG
5766   _bfd_error_handler ("ppc_elf_relocate_section called for %B section %A, "
5767                       "%ld relocations%s",
5768                       input_bfd, input_section,
5769                       (long) input_section->reloc_count,
5770                       (info->relocatable) ? " (relocatable)" : "");
5771 #endif
5772
5773   got2 = bfd_get_section_by_name (input_bfd, ".got2");
5774
5775   /* Initialize howto table if not already done.  */
5776   if (!ppc_elf_howto_table[R_PPC_ADDR32])
5777     ppc_elf_howto_init ();
5778
5779   htab = ppc_elf_hash_table (info);
5780   local_got_offsets = elf_local_got_offsets (input_bfd);
5781   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5782   sym_hashes = elf_sym_hashes (input_bfd);
5783   rel = relocs;
5784   relend = relocs + input_section->reloc_count;
5785   for (; rel < relend; rel++)
5786     {
5787       enum elf_ppc_reloc_type r_type;
5788       bfd_vma addend;
5789       bfd_reloc_status_type r;
5790       Elf_Internal_Sym *sym;
5791       asection *sec;
5792       struct elf_link_hash_entry *h;
5793       const char *sym_name;
5794       reloc_howto_type *howto;
5795       unsigned long r_symndx;
5796       bfd_vma relocation;
5797       bfd_vma branch_bit, insn, from;
5798       bfd_boolean unresolved_reloc;
5799       bfd_boolean warned;
5800       unsigned int tls_type, tls_mask, tls_gd;
5801
5802       r_type = ELF32_R_TYPE (rel->r_info);
5803       sym = NULL;
5804       sec = NULL;
5805       h = NULL;
5806       unresolved_reloc = FALSE;
5807       warned = FALSE;
5808       r_symndx = ELF32_R_SYM (rel->r_info);
5809
5810       if (r_symndx < symtab_hdr->sh_info)
5811         {
5812           sym = local_syms + r_symndx;
5813           sec = local_sections[r_symndx];
5814           sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
5815
5816           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
5817         }
5818       else
5819         {
5820           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
5821                                    r_symndx, symtab_hdr, sym_hashes,
5822                                    h, sec, relocation,
5823                                    unresolved_reloc, warned);
5824
5825           sym_name = h->root.root.string;
5826         }
5827
5828       if (sec != NULL && elf_discarded_section (sec))
5829         {
5830           /* For relocs against symbols from removed linkonce sections,
5831              or sections discarded by a linker script, we just want the
5832              section contents zeroed.  Avoid any special processing.  */
5833           howto = NULL;
5834           if (r_type < R_PPC_max)
5835             howto = ppc_elf_howto_table[r_type];
5836           _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
5837           rel->r_info = 0;
5838           rel->r_addend = 0;
5839           continue;
5840         }
5841
5842       if (info->relocatable)
5843         {
5844           if (got2 != NULL
5845               && r_type == R_PPC_PLTREL24
5846               && rel->r_addend >= 32768)
5847             {
5848               /* R_PPC_PLTREL24 is rather special.  If non-zero, the
5849                  addend specifies the GOT pointer offset within .got2.  */
5850               rel->r_addend += got2->output_offset;
5851             }
5852           continue;
5853         }
5854
5855       /* TLS optimizations.  Replace instruction sequences and relocs
5856          based on information we collected in tls_optimize.  We edit
5857          RELOCS so that --emit-relocs will output something sensible
5858          for the final instruction stream.  */
5859       tls_mask = 0;
5860       tls_gd = 0;
5861       if (IS_PPC_TLS_RELOC (r_type))
5862         {
5863           if (h != NULL)
5864             tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
5865           else if (local_got_offsets != NULL)
5866             {
5867               char *lgot_masks;
5868               lgot_masks = (char *) (local_got_offsets + symtab_hdr->sh_info);
5869               tls_mask = lgot_masks[r_symndx];
5870             }
5871         }
5872
5873       /* Ensure reloc mapping code below stays sane.  */
5874       if ((R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TLSGD16 & 3)
5875           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
5876           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
5877           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
5878           || (R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TPREL16 & 3)
5879           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
5880           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
5881           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
5882         abort ();
5883       switch (r_type)
5884         {
5885         default:
5886           break;
5887
5888         case R_PPC_GOT_TPREL16:
5889         case R_PPC_GOT_TPREL16_LO:
5890           if (tls_mask != 0
5891               && (tls_mask & TLS_TPREL) == 0)
5892             {
5893               bfd_vma insn;
5894               insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
5895               insn &= 31 << 21;
5896               insn |= 0x3c020000;       /* addis 0,2,0 */
5897               bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
5898               r_type = R_PPC_TPREL16_HA;
5899               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5900             }
5901           break;
5902
5903         case R_PPC_TLS:
5904           if (tls_mask != 0
5905               && (tls_mask & TLS_TPREL) == 0)
5906             {
5907               bfd_vma insn, rtra;
5908               insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
5909               if ((insn & ((31 << 26) | (31 << 11)))
5910                   == ((31 << 26) | (2 << 11)))
5911                 rtra = insn & ((1 << 26) - (1 << 16));
5912               else if ((insn & ((31 << 26) | (31 << 16)))
5913                        == ((31 << 26) | (2 << 16)))
5914                 rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
5915               else
5916                 abort ();
5917               if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
5918                 /* add -> addi.  */
5919                 insn = 14 << 26;
5920               else if ((insn & (31 << 1)) == 23 << 1
5921                        && ((insn & (31 << 6)) < 14 << 6
5922                            || ((insn & (31 << 6)) >= 16 << 6
5923                                && (insn & (31 << 6)) < 24 << 6)))
5924                 /* load and store indexed -> dform.  */
5925                 insn = (32 | ((insn >> 6) & 31)) << 26;
5926               else if ((insn & (31 << 1)) == 21 << 1
5927                        && (insn & (0x1a << 6)) == 0)
5928                 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
5929                 insn = (((58 | ((insn >> 6) & 4)) << 26)
5930                         | ((insn >> 6) & 1));
5931               else if ((insn & (31 << 1)) == 21 << 1
5932                        && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
5933                 /* lwax -> lwa.  */
5934                 insn = (58 << 26) | 2;
5935               else
5936                 abort ();
5937               insn |= rtra;
5938               bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5939               r_type = R_PPC_TPREL16_LO;
5940               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5941
5942               /* Was PPC_TLS which sits on insn boundary, now
5943                  PPC_TPREL16_LO which is at low-order half-word.  */
5944               rel->r_offset += d_offset;
5945             }
5946           break;
5947
5948         case R_PPC_GOT_TLSGD16_HI:
5949         case R_PPC_GOT_TLSGD16_HA:
5950           tls_gd = TLS_TPRELGD;
5951           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
5952             goto tls_gdld_hi;
5953           break;
5954
5955         case R_PPC_GOT_TLSLD16_HI:
5956         case R_PPC_GOT_TLSLD16_HA:
5957           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
5958             {
5959             tls_gdld_hi:
5960               if ((tls_mask & tls_gd) != 0)
5961                 r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
5962                           + R_PPC_GOT_TPREL16);
5963               else
5964                 {
5965                   bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
5966                   rel->r_offset -= d_offset;
5967                   r_type = R_PPC_NONE;
5968                 }
5969               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5970             }
5971           break;
5972
5973         case R_PPC_GOT_TLSGD16:
5974         case R_PPC_GOT_TLSGD16_LO:
5975           tls_gd = TLS_TPRELGD;
5976           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
5977             goto tls_ldgd_opt;
5978           break;
5979
5980         case R_PPC_GOT_TLSLD16:
5981         case R_PPC_GOT_TLSLD16_LO:
5982           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
5983             {
5984               bfd_vma insn1, insn2;
5985               bfd_vma offset;
5986
5987             tls_ldgd_opt:
5988               offset = rel[1].r_offset;
5989               insn1 = bfd_get_32 (output_bfd,
5990                                   contents + rel->r_offset - d_offset);
5991               if ((tls_mask & tls_gd) != 0)
5992                 {
5993                   /* IE */
5994                   insn1 &= (1 << 26) - 1;
5995                   insn1 |= 32 << 26;    /* lwz */
5996                   insn2 = 0x7c631214;   /* add 3,3,2 */
5997                   rel[1].r_info
5998                     = ELF32_R_INFO (ELF32_R_SYM (rel[1].r_info), R_PPC_NONE);
5999                   rel[1].r_addend = 0;
6000                   r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
6001                             + R_PPC_GOT_TPREL16);
6002                   rel->r_info = ELF32_R_INFO (r_symndx, r_type);
6003                 }
6004               else
6005                 {
6006                   /* LE */
6007                   insn1 = 0x3c620000;   /* addis 3,2,0 */
6008                   insn2 = 0x38630000;   /* addi 3,3,0 */
6009                   if (tls_gd == 0)
6010                     {
6011                       /* Was an LD reloc.  */
6012                       r_symndx = 0;
6013                       rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
6014                     }
6015                   r_type = R_PPC_TPREL16_HA;
6016                   rel->r_info = ELF32_R_INFO (r_symndx, r_type);
6017                   rel[1].r_info = ELF32_R_INFO (r_symndx,
6018                                                 R_PPC_TPREL16_LO);
6019                   rel[1].r_offset += d_offset;
6020                   rel[1].r_addend = rel->r_addend;
6021                 }
6022               bfd_put_32 (output_bfd, insn1,
6023                           contents + rel->r_offset - d_offset);
6024               bfd_put_32 (output_bfd, insn2, contents + offset);
6025               if (tls_gd == 0)
6026                 {
6027                   /* We changed the symbol on an LD reloc.  Start over
6028                      in order to get h, sym, sec etc. right.  */
6029                   rel--;
6030                   continue;
6031                 }
6032             }
6033           break;
6034         }
6035
6036       /* Handle other relocations that tweak non-addend part of insn.  */
6037       branch_bit = 0;
6038       switch (r_type)
6039         {
6040         default:
6041           break;
6042
6043           /* Branch taken prediction relocations.  */
6044         case R_PPC_ADDR14_BRTAKEN:
6045         case R_PPC_REL14_BRTAKEN:
6046           branch_bit = BRANCH_PREDICT_BIT;
6047           /* Fall thru */
6048
6049           /* Branch not taken prediction relocations.  */
6050         case R_PPC_ADDR14_BRNTAKEN:
6051         case R_PPC_REL14_BRNTAKEN:
6052           insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
6053           insn &= ~BRANCH_PREDICT_BIT;
6054           insn |= branch_bit;
6055
6056           from = (rel->r_offset
6057                   + input_section->output_offset
6058                   + input_section->output_section->vma);
6059
6060           /* Invert 'y' bit if not the default.  */
6061           if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
6062             insn ^= BRANCH_PREDICT_BIT;
6063
6064           bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
6065           break;
6066         }
6067
6068       addend = rel->r_addend;
6069       tls_type = 0;
6070       howto = NULL;
6071       if (r_type < R_PPC_max)
6072         howto = ppc_elf_howto_table[r_type];
6073       switch (r_type)
6074         {
6075         default:
6076           (*_bfd_error_handler)
6077             (_("%B: unknown relocation type %d for symbol %s"),
6078              input_bfd, (int) r_type, sym_name);
6079
6080           bfd_set_error (bfd_error_bad_value);
6081           ret = FALSE;
6082           continue;
6083
6084         case R_PPC_NONE:
6085         case R_PPC_TLS:
6086         case R_PPC_EMB_MRKREF:
6087         case R_PPC_GNU_VTINHERIT:
6088         case R_PPC_GNU_VTENTRY:
6089           continue;
6090
6091           /* GOT16 relocations.  Like an ADDR16 using the symbol's
6092              address in the GOT as relocation value instead of the
6093              symbol's value itself.  Also, create a GOT entry for the
6094              symbol and put the symbol value there.  */
6095         case R_PPC_GOT_TLSGD16:
6096         case R_PPC_GOT_TLSGD16_LO:
6097         case R_PPC_GOT_TLSGD16_HI:
6098         case R_PPC_GOT_TLSGD16_HA:
6099           tls_type = TLS_TLS | TLS_GD;
6100           goto dogot;
6101
6102         case R_PPC_GOT_TLSLD16:
6103         case R_PPC_GOT_TLSLD16_LO:
6104         case R_PPC_GOT_TLSLD16_HI:
6105         case R_PPC_GOT_TLSLD16_HA:
6106           tls_type = TLS_TLS | TLS_LD;
6107           goto dogot;
6108
6109         case R_PPC_GOT_TPREL16:
6110         case R_PPC_GOT_TPREL16_LO:
6111         case R_PPC_GOT_TPREL16_HI:
6112         case R_PPC_GOT_TPREL16_HA:
6113           tls_type = TLS_TLS | TLS_TPREL;
6114           goto dogot;
6115
6116         case R_PPC_GOT_DTPREL16:
6117         case R_PPC_GOT_DTPREL16_LO:
6118         case R_PPC_GOT_DTPREL16_HI:
6119         case R_PPC_GOT_DTPREL16_HA:
6120           tls_type = TLS_TLS | TLS_DTPREL;
6121           goto dogot;
6122
6123         case R_PPC_GOT16:
6124         case R_PPC_GOT16_LO:
6125         case R_PPC_GOT16_HI:
6126         case R_PPC_GOT16_HA:
6127         dogot:
6128           {
6129             /* Relocation is to the entry for this symbol in the global
6130                offset table.  */
6131             bfd_vma off;
6132             bfd_vma *offp;
6133             unsigned long indx;
6134
6135             if (htab->got == NULL)
6136               abort ();
6137
6138             indx = 0;
6139             if (tls_type == (TLS_TLS | TLS_LD)
6140                 && (h == NULL
6141                     || !h->def_dynamic))
6142               offp = &htab->tlsld_got.offset;
6143             else if (h != NULL)
6144               {
6145                 bfd_boolean dyn;
6146                 dyn = htab->elf.dynamic_sections_created;
6147                 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
6148                     || (info->shared
6149                         && SYMBOL_REFERENCES_LOCAL (info, h)))
6150                   /* This is actually a static link, or it is a
6151                      -Bsymbolic link and the symbol is defined
6152                      locally, or the symbol was forced to be local
6153                      because of a version file.  */
6154                   ;
6155                 else
6156                   {
6157                     indx = h->dynindx;
6158                     unresolved_reloc = FALSE;
6159                   }
6160                 offp = &h->got.offset;
6161               }
6162             else
6163               {
6164                 if (local_got_offsets == NULL)
6165                   abort ();
6166                 offp = &local_got_offsets[r_symndx];
6167               }
6168
6169             /* The offset must always be a multiple of 4.  We use the
6170                least significant bit to record whether we have already
6171                processed this entry.  */
6172             off = *offp;
6173             if ((off & 1) != 0)
6174               off &= ~1;
6175             else
6176               {
6177                 unsigned int tls_m = (tls_mask
6178                                       & (TLS_LD | TLS_GD | TLS_DTPREL
6179                                          | TLS_TPREL | TLS_TPRELGD));
6180
6181                 if (offp == &htab->tlsld_got.offset)
6182                   tls_m = TLS_LD;
6183                 else if (h == NULL
6184                          || !h->def_dynamic)
6185                   tls_m &= ~TLS_LD;
6186
6187                 /* We might have multiple got entries for this sym.
6188                    Initialize them all.  */
6189                 do
6190                   {
6191                     int tls_ty = 0;
6192
6193                     if ((tls_m & TLS_LD) != 0)
6194                       {
6195                         tls_ty = TLS_TLS | TLS_LD;
6196                         tls_m &= ~TLS_LD;
6197                       }
6198                     else if ((tls_m & TLS_GD) != 0)
6199                       {
6200                         tls_ty = TLS_TLS | TLS_GD;
6201                         tls_m &= ~TLS_GD;
6202                       }
6203                     else if ((tls_m & TLS_DTPREL) != 0)
6204                       {
6205                         tls_ty = TLS_TLS | TLS_DTPREL;
6206                         tls_m &= ~TLS_DTPREL;
6207                       }
6208                     else if ((tls_m & (TLS_TPREL | TLS_TPRELGD)) != 0)
6209                       {
6210                         tls_ty = TLS_TLS | TLS_TPREL;
6211                         tls_m = 0;
6212                       }
6213
6214                     /* Generate relocs for the dynamic linker.  */
6215                     if ((info->shared || indx != 0)
6216                         && (h == NULL
6217                             || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6218                             || h->root.type != bfd_link_hash_undefweak))
6219                       {
6220                         outrel.r_offset = (htab->got->output_section->vma
6221                                            + htab->got->output_offset
6222                                            + off);
6223                         outrel.r_addend = 0;
6224                         if (tls_ty & (TLS_LD | TLS_GD))
6225                           {
6226                             outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
6227                             if (tls_ty == (TLS_TLS | TLS_GD))
6228                               {
6229                                 loc = htab->relgot->contents;
6230                                 loc += (htab->relgot->reloc_count++
6231                                         * sizeof (Elf32_External_Rela));
6232                                 bfd_elf32_swap_reloca_out (output_bfd,
6233                                                            &outrel, loc);
6234                                 outrel.r_offset += 4;
6235                                 outrel.r_info
6236                                   = ELF32_R_INFO (indx, R_PPC_DTPREL32);
6237                               }
6238                           }
6239                         else if (tls_ty == (TLS_TLS | TLS_DTPREL))
6240                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
6241                         else if (tls_ty == (TLS_TLS | TLS_TPREL))
6242                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
6243                         else if (indx == 0)
6244                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_RELATIVE);
6245                         else
6246                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
6247                         if (indx == 0)
6248                           {
6249                             outrel.r_addend += relocation;
6250                             if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
6251                               outrel.r_addend -= htab->elf.tls_sec->vma;
6252                           }
6253                         loc = htab->relgot->contents;
6254                         loc += (htab->relgot->reloc_count++
6255                                 * sizeof (Elf32_External_Rela));
6256                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
6257                       }
6258
6259                     /* Init the .got section contents if we're not
6260                        emitting a reloc.  */
6261                     else
6262                       {
6263                         bfd_vma value = relocation;
6264
6265                         if (tls_ty == (TLS_TLS | TLS_LD))
6266                           value = 1;
6267                         else if (tls_ty != 0)
6268                           {
6269                             value -= htab->elf.tls_sec->vma + DTP_OFFSET;
6270                             if (tls_ty == (TLS_TLS | TLS_TPREL))
6271                               value += DTP_OFFSET - TP_OFFSET;
6272
6273                             if (tls_ty == (TLS_TLS | TLS_GD))
6274                               {
6275                                 bfd_put_32 (output_bfd, value,
6276                                             htab->got->contents + off + 4);
6277                                 value = 1;
6278                               }
6279                           }
6280                         bfd_put_32 (output_bfd, value,
6281                                     htab->got->contents + off);
6282                       }
6283
6284                     off += 4;
6285                     if (tls_ty & (TLS_LD | TLS_GD))
6286                       off += 4;
6287                   }
6288                 while (tls_m != 0);
6289
6290                 off = *offp;
6291                 *offp = off | 1;
6292               }
6293
6294             if (off >= (bfd_vma) -2)
6295               abort ();
6296
6297             if ((tls_type & TLS_TLS) != 0)
6298               {
6299                 if (tls_type != (TLS_TLS | TLS_LD))
6300                   {
6301                     if ((tls_mask & TLS_LD) != 0
6302                         && !(h == NULL
6303                              || !h->def_dynamic))
6304                       off += 8;
6305                     if (tls_type != (TLS_TLS | TLS_GD))
6306                       {
6307                         if ((tls_mask & TLS_GD) != 0)
6308                           off += 8;
6309                         if (tls_type != (TLS_TLS | TLS_DTPREL))
6310                           {
6311                             if ((tls_mask & TLS_DTPREL) != 0)
6312                               off += 4;
6313                           }
6314                       }
6315                   }
6316               }
6317
6318             relocation = htab->got->output_offset + off;
6319             relocation -= htab->elf.hgot->root.u.def.value;
6320
6321             /* Addends on got relocations don't make much sense.
6322                x+off@got is actually x@got+off, and since the got is
6323                generated by a hash table traversal, the value in the
6324                got at entry m+n bears little relation to the entry m.  */
6325             if (addend != 0)
6326               (*_bfd_error_handler)
6327                 (_("%B(%A+0x%lx): non-zero addend on %s reloc against `%s'"),
6328                  input_bfd,
6329                  input_section,
6330                  (long) rel->r_offset,
6331                  howto->name,
6332                  sym_name);
6333           }
6334         break;
6335
6336         /* Relocations that need no special processing.  */
6337         case R_PPC_LOCAL24PC:
6338           /* It makes no sense to point a local relocation
6339              at a symbol not in this object.  */
6340           if (unresolved_reloc)
6341             {
6342               if (! (*info->callbacks->undefined_symbol) (info,
6343                                                           h->root.root.string,
6344                                                           input_bfd,
6345                                                           input_section,
6346                                                           rel->r_offset,
6347                                                           TRUE))
6348                 return FALSE;
6349               continue;
6350             }
6351           break;
6352
6353         case R_PPC_DTPREL16:
6354         case R_PPC_DTPREL16_LO:
6355         case R_PPC_DTPREL16_HI:
6356         case R_PPC_DTPREL16_HA:
6357           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
6358           break;
6359
6360           /* Relocations that may need to be propagated if this is a shared
6361              object.  */
6362         case R_PPC_TPREL16:
6363         case R_PPC_TPREL16_LO:
6364         case R_PPC_TPREL16_HI:
6365         case R_PPC_TPREL16_HA:
6366           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
6367           /* The TPREL16 relocs shouldn't really be used in shared
6368              libs as they will result in DT_TEXTREL being set, but
6369              support them anyway.  */
6370           goto dodyn;
6371
6372         case R_PPC_TPREL32:
6373           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
6374           goto dodyn;
6375
6376         case R_PPC_DTPREL32:
6377           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
6378           goto dodyn;
6379
6380         case R_PPC_DTPMOD32:
6381           relocation = 1;
6382           addend = 0;
6383           goto dodyn;
6384
6385         case R_PPC_REL16:
6386         case R_PPC_REL16_LO:
6387         case R_PPC_REL16_HI:
6388         case R_PPC_REL16_HA:
6389           break;
6390
6391         case R_PPC_REL24:
6392         case R_PPC_REL32:
6393         case R_PPC_REL14:
6394         case R_PPC_REL14_BRTAKEN:
6395         case R_PPC_REL14_BRNTAKEN:
6396           /* If these relocations are not to a named symbol, they can be
6397              handled right here, no need to bother the dynamic linker.  */
6398           if (SYMBOL_REFERENCES_LOCAL (info, h)
6399               || h == htab->elf.hgot)
6400             break;
6401           /* fall through */
6402
6403           /* Relocations that always need to be propagated if this is a shared
6404              object.  */
6405         case R_PPC_ADDR32:
6406         case R_PPC_ADDR24:
6407         case R_PPC_ADDR16:
6408         case R_PPC_ADDR16_LO:
6409         case R_PPC_ADDR16_HI:
6410         case R_PPC_ADDR16_HA:
6411         case R_PPC_ADDR14:
6412         case R_PPC_ADDR14_BRTAKEN:
6413         case R_PPC_ADDR14_BRNTAKEN:
6414         case R_PPC_UADDR32:
6415         case R_PPC_UADDR16:
6416         dodyn:
6417           if ((input_section->flags & SEC_ALLOC) == 0)
6418             break;
6419           /* Fall thru.  */
6420
6421           if ((info->shared
6422                && (h == NULL
6423                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6424                    || h->root.type != bfd_link_hash_undefweak)
6425                && (MUST_BE_DYN_RELOC (r_type)
6426                    || !SYMBOL_CALLS_LOCAL (info, h)))
6427               || (ELIMINATE_COPY_RELOCS
6428                   && !info->shared
6429                   && h != NULL
6430                   && h->dynindx != -1
6431                   && !h->non_got_ref
6432                   && h->def_dynamic
6433                   && !h->def_regular))
6434             {
6435               int skip;
6436
6437 #ifdef DEBUG
6438               fprintf (stderr, "ppc_elf_relocate_section needs to "
6439                        "create relocation for %s\n",
6440                        (h && h->root.root.string
6441                         ? h->root.root.string : "<unknown>"));
6442 #endif
6443
6444               /* When generating a shared object, these relocations
6445                  are copied into the output file to be resolved at run
6446                  time.  */
6447               if (sreloc == NULL)
6448                 {
6449                   const char *name;
6450
6451                   name = (bfd_elf_string_from_elf_section
6452                           (input_bfd,
6453                            elf_elfheader (input_bfd)->e_shstrndx,
6454                            elf_section_data (input_section)->rel_hdr.sh_name));
6455                   if (name == NULL)
6456                     return FALSE;
6457
6458                   BFD_ASSERT (CONST_STRNEQ (name, ".rela")
6459                               && strcmp (bfd_get_section_name (input_bfd,
6460                                                                input_section),
6461                                          name + 5) == 0);
6462
6463                   sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
6464                   BFD_ASSERT (sreloc != NULL);
6465                 }
6466
6467               skip = 0;
6468
6469               outrel.r_offset =
6470                 _bfd_elf_section_offset (output_bfd, info, input_section,
6471                                          rel->r_offset);
6472               if (outrel.r_offset == (bfd_vma) -1
6473                   || outrel.r_offset == (bfd_vma) -2)
6474                 skip = (int) outrel.r_offset;
6475               outrel.r_offset += (input_section->output_section->vma
6476                                   + input_section->output_offset);
6477
6478               if (skip)
6479                 memset (&outrel, 0, sizeof outrel);
6480               else if (!SYMBOL_REFERENCES_LOCAL (info, h))
6481                 {
6482                   unresolved_reloc = FALSE;
6483                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
6484                   outrel.r_addend = rel->r_addend;
6485                 }
6486               else
6487                 {
6488                   outrel.r_addend = relocation + rel->r_addend;
6489
6490                   if (r_type == R_PPC_ADDR32)
6491                     outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
6492                   else
6493                     {
6494                       long indx;
6495
6496                       if (bfd_is_abs_section (sec))
6497                         indx = 0;
6498                       else if (sec == NULL || sec->owner == NULL)
6499                         {
6500                           bfd_set_error (bfd_error_bad_value);
6501                           return FALSE;
6502                         }
6503                       else
6504                         {
6505                           asection *osec;
6506
6507                           /* We are turning this relocation into one
6508                              against a section symbol.  It would be
6509                              proper to subtract the symbol's value,
6510                              osec->vma, from the emitted reloc addend,
6511                              but ld.so expects buggy relocs.  */
6512                           osec = sec->output_section;
6513                           indx = elf_section_data (osec)->dynindx;
6514                           if (indx == 0)
6515                             {
6516                               osec = htab->elf.text_index_section;
6517                               indx = elf_section_data (osec)->dynindx;
6518                             }
6519                           BFD_ASSERT (indx != 0);
6520 #ifdef DEBUG
6521                           if (indx == 0)
6522                             printf ("indx=%ld section=%s flags=%08x name=%s\n",
6523                                     indx, osec->name, osec->flags,
6524                                     h->root.root.string);
6525 #endif
6526                         }
6527
6528                       outrel.r_info = ELF32_R_INFO (indx, r_type);
6529                     }
6530                 }
6531
6532               loc = sreloc->contents;
6533               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
6534               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
6535
6536               if (skip == -1)
6537                 continue;
6538
6539               /* This reloc will be computed at runtime.  We clear the memory
6540                  so that it contains predictable value.  */
6541               if (! skip
6542                   && ((input_section->flags & SEC_ALLOC) != 0
6543                       || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
6544                 {
6545                   relocation = howto->pc_relative ? outrel.r_offset : 0;
6546                   addend = 0;
6547                   break;
6548                 }
6549             }
6550           break;
6551
6552         case R_PPC_RELAX32PC_PLT:
6553         case R_PPC_RELAX32_PLT:
6554           {
6555             struct plt_entry *ent = find_plt_ent (h, got2, addend);
6556
6557             if (htab->plt_type == PLT_NEW)
6558               relocation = (htab->glink->output_section->vma
6559                             + htab->glink->output_offset
6560                             + ent->glink_offset);
6561             else
6562               relocation = (htab->plt->output_section->vma
6563                             + htab->plt->output_offset
6564                             + ent->plt.offset);
6565             addend = 0;
6566           }
6567           if (r_type == R_PPC_RELAX32_PLT)
6568             goto relax32;
6569           /* Fall thru */
6570
6571         case R_PPC_RELAX32PC:
6572           relocation -= (input_section->output_section->vma
6573                          + input_section->output_offset
6574                          + rel->r_offset - 4);
6575           /* Fall thru */
6576
6577         case R_PPC_RELAX32:
6578         relax32:
6579           {
6580             unsigned long t0;
6581             unsigned long t1;
6582
6583             t0 = bfd_get_32 (output_bfd, contents + rel->r_offset);
6584             t1 = bfd_get_32 (output_bfd, contents + rel->r_offset + 4);
6585
6586             /* We're clearing the bits for R_PPC_ADDR16_HA
6587                and R_PPC_ADDR16_LO here.  */
6588             t0 &= ~0xffff;
6589             t1 &= ~0xffff;
6590
6591             /* t0 is HA, t1 is LO */
6592             relocation += addend;
6593             t0 |= ((relocation + 0x8000) >> 16) & 0xffff;
6594             t1 |= relocation & 0xffff;
6595
6596             bfd_put_32 (output_bfd, t0, contents + rel->r_offset);
6597             bfd_put_32 (output_bfd, t1, contents + rel->r_offset + 4);
6598           }
6599           continue;
6600
6601           /* Indirect .sdata relocation.  */
6602         case R_PPC_EMB_SDAI16:
6603           BFD_ASSERT (htab->sdata[0].section != NULL);
6604           relocation
6605             = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[0],
6606                                                  h, relocation, rel);
6607           break;
6608
6609           /* Indirect .sdata2 relocation.  */
6610         case R_PPC_EMB_SDA2I16:
6611           BFD_ASSERT (htab->sdata[1].section != NULL);
6612           relocation
6613             = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[1],
6614                                                  h, relocation, rel);
6615           break;
6616
6617           /* Handle the TOC16 reloc.  We want to use the offset within the .got
6618              section, not the actual VMA.  This is appropriate when generating
6619              an embedded ELF object, for which the .got section acts like the
6620              AIX .toc section.  */
6621         case R_PPC_TOC16:                       /* phony GOT16 relocations */
6622           BFD_ASSERT (sec != NULL);
6623           BFD_ASSERT (bfd_is_und_section (sec)
6624                       || strcmp (bfd_get_section_name (abfd, sec), ".got") == 0
6625                       || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0);
6626
6627             addend -= sec->output_section->vma + sec->output_offset + 0x8000;
6628           break;
6629
6630         case R_PPC_PLTREL24:
6631           /* Relocation is to the entry for this symbol in the
6632              procedure linkage table.  */
6633           {
6634             struct plt_entry *ent = find_plt_ent (h, got2, addend);
6635
6636             addend = 0;
6637             if (ent == NULL
6638                 || htab->plt == NULL)
6639               {
6640                 /* We didn't make a PLT entry for this symbol.  This
6641                    happens when statically linking PIC code, or when
6642                    using -Bsymbolic.  */
6643                 break;
6644               }
6645
6646             unresolved_reloc = FALSE;
6647             if (htab->plt_type == PLT_NEW)
6648               relocation = (htab->glink->output_section->vma
6649                             + htab->glink->output_offset
6650                             + ent->glink_offset);
6651             else
6652               relocation = (htab->plt->output_section->vma
6653                             + htab->plt->output_offset
6654                             + ent->plt.offset);
6655           }
6656           break;
6657
6658           /* Relocate against _SDA_BASE_.  */
6659         case R_PPC_SDAREL16:
6660           {
6661             const char *name;
6662             struct elf_link_hash_entry *sh;
6663
6664             BFD_ASSERT (sec != NULL);
6665             name = bfd_get_section_name (abfd, sec->output_section);
6666             if (! ((CONST_STRNEQ (name, ".sdata")
6667                     && (name[6] == 0 || name[6] == '.'))
6668                    || (CONST_STRNEQ (name, ".sbss")
6669                        && (name[5] == 0 || name[5] == '.'))))
6670               {
6671                 (*_bfd_error_handler)
6672                   (_("%B: the target (%s) of a %s relocation is "
6673                      "in the wrong output section (%s)"),
6674                    input_bfd,
6675                    sym_name,
6676                    howto->name,
6677                    name);
6678               }
6679             sh = htab->sdata[0].sym;
6680             addend -= (sh->root.u.def.value
6681                        + sh->root.u.def.section->output_offset
6682                        + sh->root.u.def.section->output_section->vma);
6683           }
6684           break;
6685
6686           /* Relocate against _SDA2_BASE_.  */
6687         case R_PPC_EMB_SDA2REL:
6688           {
6689             const char *name;
6690             struct elf_link_hash_entry *sh;
6691
6692             BFD_ASSERT (sec != NULL);
6693             name = bfd_get_section_name (abfd, sec->output_section);
6694             if (! (CONST_STRNEQ (name, ".sdata2")
6695                    || CONST_STRNEQ (name, ".sbss2")))
6696               {
6697                 (*_bfd_error_handler)
6698                   (_("%B: the target (%s) of a %s relocation is "
6699                      "in the wrong output section (%s)"),
6700                    input_bfd,
6701                    sym_name,
6702                    howto->name,
6703                    name);
6704
6705                 bfd_set_error (bfd_error_bad_value);
6706                 ret = FALSE;
6707                 continue;
6708               }
6709             sh = htab->sdata[1].sym;
6710             addend -= (sh->root.u.def.value
6711                        + sh->root.u.def.section->output_offset
6712                        + sh->root.u.def.section->output_section->vma);
6713           }
6714           break;
6715
6716           /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0.  */
6717         case R_PPC_EMB_SDA21:
6718         case R_PPC_EMB_RELSDA:
6719           {
6720             const char *name;
6721             int reg;
6722             struct elf_link_hash_entry *sh;
6723
6724             BFD_ASSERT (sec != NULL);
6725             name = bfd_get_section_name (abfd, sec->output_section);
6726             if (((CONST_STRNEQ (name, ".sdata")
6727                   && (name[6] == 0 || name[6] == '.'))
6728                  || (CONST_STRNEQ (name, ".sbss")
6729                      && (name[5] == 0 || name[5] == '.'))))
6730               {
6731                 reg = 13;
6732                 sh = htab->sdata[0].sym;
6733                 addend -= (sh->root.u.def.value
6734                            + sh->root.u.def.section->output_offset
6735                            + sh->root.u.def.section->output_section->vma);
6736               }
6737
6738             else if (CONST_STRNEQ (name, ".sdata2")
6739                      || CONST_STRNEQ (name, ".sbss2"))
6740               {
6741                 reg = 2;
6742                 sh = htab->sdata[1].sym;
6743                 addend -= (sh->root.u.def.value
6744                            + sh->root.u.def.section->output_offset
6745                            + sh->root.u.def.section->output_section->vma);
6746               }
6747
6748             else if (strcmp (name, ".PPC.EMB.sdata0") == 0
6749                      || strcmp (name, ".PPC.EMB.sbss0") == 0)
6750               {
6751                 reg = 0;
6752               }
6753
6754             else
6755               {
6756                 (*_bfd_error_handler)
6757                   (_("%B: the target (%s) of a %s relocation is "
6758                      "in the wrong output section (%s)"),
6759                    input_bfd,
6760                    sym_name,
6761                    howto->name,
6762                    name);
6763
6764                 bfd_set_error (bfd_error_bad_value);
6765                 ret = FALSE;
6766                 continue;
6767               }
6768
6769             if (r_type == R_PPC_EMB_SDA21)
6770               {                 /* fill in register field */
6771                 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
6772                 insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
6773                 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
6774               }
6775           }
6776           break;
6777
6778           /* Relocate against the beginning of the section.  */
6779         case R_PPC_SECTOFF:
6780         case R_PPC_SECTOFF_LO:
6781         case R_PPC_SECTOFF_HI:
6782         case R_PPC_SECTOFF_HA:
6783           BFD_ASSERT (sec != NULL);
6784           addend -= sec->output_section->vma;
6785           break;
6786
6787           /* Negative relocations.  */
6788         case R_PPC_EMB_NADDR32:
6789         case R_PPC_EMB_NADDR16:
6790         case R_PPC_EMB_NADDR16_LO:
6791         case R_PPC_EMB_NADDR16_HI:
6792         case R_PPC_EMB_NADDR16_HA:
6793           addend -= 2 * relocation;
6794           break;
6795
6796         case R_PPC_COPY:
6797         case R_PPC_GLOB_DAT:
6798         case R_PPC_JMP_SLOT:
6799         case R_PPC_RELATIVE:
6800         case R_PPC_PLT32:
6801         case R_PPC_PLTREL32:
6802         case R_PPC_PLT16_LO:
6803         case R_PPC_PLT16_HI:
6804         case R_PPC_PLT16_HA:
6805         case R_PPC_ADDR30:
6806         case R_PPC_EMB_RELSEC16:
6807         case R_PPC_EMB_RELST_LO:
6808         case R_PPC_EMB_RELST_HI:
6809         case R_PPC_EMB_RELST_HA:
6810         case R_PPC_EMB_BIT_FLD:
6811           (*_bfd_error_handler)
6812             (_("%B: relocation %s is not yet supported for symbol %s."),
6813              input_bfd,
6814              howto->name,
6815              sym_name);
6816
6817           bfd_set_error (bfd_error_invalid_operation);
6818           ret = FALSE;
6819           continue;
6820         }
6821
6822       /* Do any further special processing.  */
6823       switch (r_type)
6824         {
6825         default:
6826           break;
6827
6828         case R_PPC_ADDR16_HA:
6829         case R_PPC_REL16_HA:
6830         case R_PPC_SECTOFF_HA:
6831         case R_PPC_TPREL16_HA:
6832         case R_PPC_DTPREL16_HA:
6833         case R_PPC_EMB_NADDR16_HA:
6834         case R_PPC_EMB_RELST_HA:
6835           /* It's just possible that this symbol is a weak symbol
6836              that's not actually defined anywhere.  In that case,
6837              'sec' would be NULL, and we should leave the symbol
6838              alone (it will be set to zero elsewhere in the link).  */
6839           if (sec == NULL)
6840             break;
6841           /* Fall thru */
6842
6843         case R_PPC_PLT16_HA:
6844         case R_PPC_GOT16_HA:
6845         case R_PPC_GOT_TLSGD16_HA:
6846         case R_PPC_GOT_TLSLD16_HA:
6847         case R_PPC_GOT_TPREL16_HA:
6848         case R_PPC_GOT_DTPREL16_HA:
6849           /* Add 0x10000 if sign bit in 0:15 is set.
6850              Bits 0:15 are not used.  */
6851           addend += 0x8000;
6852           break;
6853         }
6854
6855 #ifdef DEBUG
6856       fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
6857                "offset = %ld, addend = %ld\n",
6858                howto->name,
6859                (int) r_type,
6860                sym_name,
6861                r_symndx,
6862                (long) rel->r_offset,
6863                (long) addend);
6864 #endif
6865
6866       if (unresolved_reloc
6867           && !((input_section->flags & SEC_DEBUGGING) != 0
6868                && h->def_dynamic))
6869         {
6870           (*_bfd_error_handler)
6871             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
6872              input_bfd,
6873              input_section,
6874              (long) rel->r_offset,
6875              howto->name,
6876              sym_name);
6877           ret = FALSE;
6878         }
6879
6880       r = _bfd_final_link_relocate (howto,
6881                                     input_bfd,
6882                                     input_section,
6883                                     contents,
6884                                     rel->r_offset,
6885                                     relocation,
6886                                     addend);
6887
6888       if (r != bfd_reloc_ok)
6889         {
6890           if (r == bfd_reloc_overflow)
6891             {
6892               if (warned)
6893                 continue;
6894               if (h != NULL
6895                   && h->root.type == bfd_link_hash_undefweak
6896                   && howto->pc_relative)
6897                 {
6898                   /* Assume this is a call protected by other code that
6899                      detect the symbol is undefined.  If this is the case,
6900                      we can safely ignore the overflow.  If not, the
6901                      program is hosed anyway, and a little warning isn't
6902                      going to help.  */
6903
6904                   continue;
6905                 }
6906
6907               if (! (*info->callbacks->reloc_overflow) (info,
6908                                                         (h ? &h->root : NULL),
6909                                                         sym_name,
6910                                                         howto->name,
6911                                                         rel->r_addend,
6912                                                         input_bfd,
6913                                                         input_section,
6914                                                         rel->r_offset))
6915                 return FALSE;
6916             }
6917           else
6918             {
6919               (*_bfd_error_handler)
6920                 (_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
6921                  input_bfd, input_section,
6922                  (long) rel->r_offset, howto->name, sym_name, (int) r);
6923               ret = FALSE;
6924             }
6925         }
6926     }
6927
6928 #ifdef DEBUG
6929   fprintf (stderr, "\n");
6930 #endif
6931
6932   return ret;
6933 }
6934 \f
6935 #define PPC_LO(v) ((v) & 0xffff)
6936 #define PPC_HI(v) (((v) >> 16) & 0xffff)
6937 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
6938
6939 /* Finish up dynamic symbol handling.  We set the contents of various
6940    dynamic sections here.  */
6941
6942 static bfd_boolean
6943 ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
6944                                struct bfd_link_info *info,
6945                                struct elf_link_hash_entry *h,
6946                                Elf_Internal_Sym *sym)
6947 {
6948   struct ppc_elf_link_hash_table *htab;
6949   struct plt_entry *ent;
6950   bfd_boolean doneone;
6951
6952 #ifdef DEBUG
6953   fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
6954            h->root.root.string);
6955 #endif
6956
6957   htab = ppc_elf_hash_table (info);
6958   BFD_ASSERT (htab->elf.dynobj != NULL);
6959
6960   doneone = FALSE;
6961   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6962     if (ent->plt.offset != (bfd_vma) -1)
6963       {
6964         if (!doneone)
6965           {
6966             Elf_Internal_Rela rela;
6967             bfd_byte *loc;
6968             bfd_vma reloc_index;
6969
6970             if (htab->plt_type == PLT_NEW)
6971               reloc_index = ent->plt.offset / 4;
6972             else
6973               {
6974                 reloc_index = ((ent->plt.offset - htab->plt_initial_entry_size)
6975                                / htab->plt_slot_size);
6976                 if (reloc_index > PLT_NUM_SINGLE_ENTRIES
6977                     && htab->plt_type == PLT_OLD)
6978                   reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
6979               }
6980
6981             /* This symbol has an entry in the procedure linkage table.
6982                Set it up.  */
6983             if (htab->plt_type == PLT_VXWORKS)
6984               {
6985                 bfd_vma got_offset;
6986                 const bfd_vma *plt_entry;
6987                 
6988                 /* The first three entries in .got.plt are reserved.  */
6989                 got_offset = (reloc_index + 3) * 4;
6990
6991                 /* Use the right PLT. */
6992                 plt_entry = info->shared ? ppc_elf_vxworks_pic_plt_entry
6993                             : ppc_elf_vxworks_plt_entry;
6994
6995                 /* Fill in the .plt on VxWorks.  */
6996                 if (info->shared)
6997                   {
6998                     bfd_vma got_offset_hi = (got_offset >> 16)
6999                                             + ((got_offset & 0x8000) >> 15);
7000
7001                     bfd_put_32 (output_bfd,
7002                                 plt_entry[0] | (got_offset_hi & 0xffff),
7003                                 htab->plt->contents + ent->plt.offset + 0);
7004                     bfd_put_32 (output_bfd,
7005                                 plt_entry[1] | (got_offset & 0xffff),
7006                                 htab->plt->contents + ent->plt.offset + 4);
7007                   }
7008                 else
7009                   {
7010                     bfd_vma got_loc
7011                       = (got_offset
7012                          + htab->elf.hgot->root.u.def.value
7013                          + htab->elf.hgot->root.u.def.section->output_offset
7014                          + htab->elf.hgot->root.u.def.section->output_section->vma);
7015                     bfd_vma got_loc_hi = (got_loc >> 16)
7016                                          + ((got_loc & 0x8000) >> 15);
7017
7018                     bfd_put_32 (output_bfd,
7019                                 plt_entry[0] | (got_loc_hi & 0xffff),
7020                                 htab->plt->contents + ent->plt.offset + 0);
7021                     bfd_put_32 (output_bfd,
7022                                 plt_entry[1] | (got_loc & 0xffff),
7023                                 htab->plt->contents + ent->plt.offset + 4);
7024                   }
7025
7026                 bfd_put_32 (output_bfd, plt_entry[2],
7027                             htab->plt->contents + ent->plt.offset + 8);
7028                 bfd_put_32 (output_bfd, plt_entry[3],
7029                             htab->plt->contents + ent->plt.offset + 12);
7030
7031                 /* This instruction is an immediate load.  The value loaded is
7032                    the byte offset of the R_PPC_JMP_SLOT relocation from the
7033                    start of the .rela.plt section.  The value is stored in the
7034                    low-order 16 bits of the load instruction.  */
7035                 /* NOTE: It appears that this is now an index rather than a
7036                    prescaled offset.  */
7037                 bfd_put_32 (output_bfd, 
7038                             plt_entry[4] | reloc_index,
7039                             htab->plt->contents + ent->plt.offset + 16);
7040                 /* This instruction is a PC-relative branch whose target is
7041                    the start of the PLT section.  The address of this branch
7042                    instruction is 20 bytes beyond the start of this PLT entry.
7043                    The address is encoded in bits 6-29, inclusive.  The value
7044                    stored is right-shifted by two bits, permitting a 26-bit
7045                    offset.  */
7046                 bfd_put_32 (output_bfd, 
7047                             (plt_entry[5] 
7048                              | (-(ent->plt.offset + 20) & 0x03fffffc)),
7049                             htab->plt->contents + ent->plt.offset + 20);
7050                 bfd_put_32 (output_bfd, plt_entry[6],
7051                             htab->plt->contents + ent->plt.offset + 24);
7052                 bfd_put_32 (output_bfd, plt_entry[7],
7053                             htab->plt->contents + ent->plt.offset + 28);
7054
7055                 /* Fill in the GOT entry corresponding to this PLT slot with
7056                    the address immediately after the the "bctr" instruction
7057                    in this PLT entry.  */
7058                 bfd_put_32 (output_bfd, (htab->plt->output_section->vma
7059                                          + htab->plt->output_offset
7060                                          + ent->plt.offset + 16),
7061                             htab->sgotplt->contents + got_offset);
7062
7063                 if (!info->shared)
7064                   {
7065                     /* Fill in a couple of entries in .rela.plt.unloaded.  */
7066                     loc = htab->srelplt2->contents
7067                       + ((VXWORKS_PLTRESOLVE_RELOCS + reloc_index
7068                           * VXWORKS_PLT_NON_JMP_SLOT_RELOCS)
7069                          * sizeof (Elf32_External_Rela));
7070
7071                     /* Provide the @ha relocation for the first instruction.  */
7072                     rela.r_offset = (htab->plt->output_section->vma
7073                                      + htab->plt->output_offset
7074                                      + ent->plt.offset + 2);
7075                     rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
7076                                                 R_PPC_ADDR16_HA);
7077                     rela.r_addend = got_offset;
7078                     bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7079                     loc += sizeof (Elf32_External_Rela);
7080
7081                     /* Provide the @l relocation for the second instruction.  */
7082                     rela.r_offset = (htab->plt->output_section->vma
7083                                      + htab->plt->output_offset
7084                                      + ent->plt.offset + 6);
7085                     rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
7086                                                 R_PPC_ADDR16_LO);
7087                     rela.r_addend = got_offset;
7088                     bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7089                     loc += sizeof (Elf32_External_Rela);
7090
7091                     /* Provide a relocation for the GOT entry corresponding to this
7092                        PLT slot.  Point it at the middle of the .plt entry.  */
7093                     rela.r_offset = (htab->sgotplt->output_section->vma
7094                                      + htab->sgotplt->output_offset
7095                                      + got_offset);
7096                     rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
7097                                                 R_PPC_ADDR32);
7098                     rela.r_addend = ent->plt.offset + 16;
7099                     bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7100                   }
7101
7102                 /* VxWorks uses non-standard semantics for R_PPC_JMP_SLOT.
7103                    In particular, the offset for the relocation is not the
7104                    address of the PLT entry for this function, as specified
7105                    by the ABI.  Instead, the offset is set to the address of
7106                    the GOT slot for this function.  See EABI 4.4.4.1.  */
7107                 rela.r_offset = (htab->sgotplt->output_section->vma
7108                                  + htab->sgotplt->output_offset
7109                                  + got_offset);
7110
7111               }
7112             else
7113               {
7114                 rela.r_offset = (htab->plt->output_section->vma
7115                                  + htab->plt->output_offset
7116                                  + ent->plt.offset);
7117                 if (htab->plt_type == PLT_OLD)
7118                   {
7119                     /* We don't need to fill in the .plt.  The ppc dynamic
7120                        linker will fill it in.  */
7121                   }
7122                 else
7123                   {
7124                     bfd_vma val = (htab->glink_pltresolve + ent->plt.offset
7125                                    + htab->glink->output_section->vma
7126                                    + htab->glink->output_offset);
7127                     bfd_put_32 (output_bfd, val,
7128                                 htab->plt->contents + ent->plt.offset);
7129                   }
7130               }
7131
7132             /* Fill in the entry in the .rela.plt section.  */
7133             rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
7134             rela.r_addend = 0;
7135
7136             loc = (htab->relplt->contents
7137                    + reloc_index * sizeof (Elf32_External_Rela));
7138             bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7139
7140             if (!h->def_regular)
7141               {
7142                 /* Mark the symbol as undefined, rather than as defined in
7143                    the .plt section.  Leave the value alone.  */
7144                 sym->st_shndx = SHN_UNDEF;
7145                 /* If the symbol is weak, we do need to clear the value.
7146                    Otherwise, the PLT entry would provide a definition for
7147                    the symbol even if the symbol wasn't defined anywhere,
7148                    and so the symbol would never be NULL.  */
7149                 if (!h->ref_regular_nonweak)
7150                   sym->st_value = 0;
7151               }
7152             doneone = TRUE;
7153           }
7154
7155         if (htab->plt_type == PLT_NEW)
7156           {
7157             bfd_vma plt;
7158             unsigned char *p;
7159
7160             plt = (ent->plt.offset
7161                    + htab->plt->output_section->vma
7162                    + htab->plt->output_offset);
7163             p = (unsigned char *) htab->glink->contents + ent->glink_offset;
7164
7165             if (info->shared || info->pie)
7166               {
7167                 bfd_vma got = 0;
7168
7169                 if (ent->addend >= 32768)
7170                   got = (ent->addend
7171                          + ent->sec->output_section->vma
7172                          + ent->sec->output_offset);
7173                 else if (htab->elf.hgot != NULL)
7174                   got = (htab->elf.hgot->root.u.def.value
7175                          + htab->elf.hgot->root.u.def.section->output_section->vma
7176                          + htab->elf.hgot->root.u.def.section->output_offset);
7177
7178                 plt -= got;
7179
7180                 if (plt + 0x8000 < 0x10000)
7181                   {
7182                     bfd_put_32 (output_bfd, LWZ_11_30 + PPC_LO (plt), p);
7183                     p += 4;
7184                     bfd_put_32 (output_bfd, MTCTR_11, p);
7185                     p += 4;
7186                     bfd_put_32 (output_bfd, BCTR, p);
7187                     p += 4;
7188                     bfd_put_32 (output_bfd, NOP, p);
7189                     p += 4;
7190                   }
7191                 else
7192                   {
7193                     bfd_put_32 (output_bfd, ADDIS_11_30 + PPC_HA (plt), p);
7194                     p += 4;
7195                     bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
7196                     p += 4;
7197                     bfd_put_32 (output_bfd, MTCTR_11, p);
7198                     p += 4;
7199                     bfd_put_32 (output_bfd, BCTR, p);
7200                     p += 4;
7201                   }
7202               }
7203             else
7204               {
7205                 bfd_put_32 (output_bfd, LIS_11 + PPC_HA (plt), p);
7206                 p += 4;
7207                 bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
7208                 p += 4;
7209                 bfd_put_32 (output_bfd, MTCTR_11, p);
7210                 p += 4;
7211                 bfd_put_32 (output_bfd, BCTR, p);
7212                 p += 4;
7213
7214                 /* We only need one non-PIC glink stub.  */
7215                 break;
7216               }
7217           }
7218         else
7219           break;
7220       }
7221
7222   if (h->needs_copy)
7223     {
7224       asection *s;
7225       Elf_Internal_Rela rela;
7226       bfd_byte *loc;
7227
7228       /* This symbols needs a copy reloc.  Set it up.  */
7229
7230 #ifdef DEBUG
7231       fprintf (stderr, ", copy");
7232 #endif
7233
7234       BFD_ASSERT (h->dynindx != -1);
7235
7236       if (ppc_elf_hash_entry (h)->has_sda_refs)
7237         s = htab->relsbss;
7238       else
7239         s = htab->relbss;
7240       BFD_ASSERT (s != NULL);
7241
7242       rela.r_offset = (h->root.u.def.value
7243                        + h->root.u.def.section->output_section->vma
7244                        + h->root.u.def.section->output_offset);
7245       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
7246       rela.r_addend = 0;
7247       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
7248       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7249     }
7250
7251 #ifdef DEBUG
7252   fprintf (stderr, "\n");
7253 #endif
7254
7255   /* Mark some specially defined symbols as absolute.  */
7256   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
7257       || (!htab->is_vxworks
7258           && (h == htab->elf.hgot
7259               || strcmp (h->root.root.string,
7260                          "_PROCEDURE_LINKAGE_TABLE_") == 0)))
7261     sym->st_shndx = SHN_ABS;
7262
7263   return TRUE;
7264 }
7265 \f
7266 static enum elf_reloc_type_class
7267 ppc_elf_reloc_type_class (const Elf_Internal_Rela *rela)
7268 {
7269   switch (ELF32_R_TYPE (rela->r_info))
7270     {
7271     case R_PPC_RELATIVE:
7272       return reloc_class_relative;
7273     case R_PPC_REL24:
7274     case R_PPC_ADDR24:
7275     case R_PPC_JMP_SLOT:
7276       return reloc_class_plt;
7277     case R_PPC_COPY:
7278       return reloc_class_copy;
7279     default:
7280       return reloc_class_normal;
7281     }
7282 }
7283 \f
7284 /* Finish up the dynamic sections.  */
7285
7286 static bfd_boolean
7287 ppc_elf_finish_dynamic_sections (bfd *output_bfd,
7288                                  struct bfd_link_info *info)
7289 {
7290   asection *sdyn;
7291   asection *splt;
7292   struct ppc_elf_link_hash_table *htab;
7293   bfd_vma got;
7294   bfd * dynobj;
7295
7296 #ifdef DEBUG
7297   fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
7298 #endif
7299
7300   htab = ppc_elf_hash_table (info);
7301   dynobj = elf_hash_table (info)->dynobj;
7302   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
7303   if (htab->is_vxworks)
7304     splt = bfd_get_section_by_name (dynobj, ".plt");  
7305   else
7306     splt = NULL;
7307
7308   got = 0;
7309   if (htab->elf.hgot != NULL)
7310     got = (htab->elf.hgot->root.u.def.value
7311            + htab->elf.hgot->root.u.def.section->output_section->vma
7312            + htab->elf.hgot->root.u.def.section->output_offset);
7313
7314   if (htab->elf.dynamic_sections_created)
7315     {
7316       Elf32_External_Dyn *dyncon, *dynconend;
7317
7318       BFD_ASSERT (htab->plt != NULL && sdyn != NULL);
7319
7320       dyncon = (Elf32_External_Dyn *) sdyn->contents;
7321       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
7322       for (; dyncon < dynconend; dyncon++)
7323         {
7324           Elf_Internal_Dyn dyn;
7325           asection *s;
7326
7327           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
7328
7329           switch (dyn.d_tag)
7330             {
7331             case DT_PLTGOT:
7332               if (htab->is_vxworks)
7333                 s = htab->sgotplt;
7334               else
7335                 s = htab->plt;
7336               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
7337               break;
7338
7339             case DT_PLTRELSZ:
7340               dyn.d_un.d_val = htab->relplt->size;
7341               break;
7342
7343             case DT_JMPREL:
7344               s = htab->relplt;
7345               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
7346               break;
7347
7348             case DT_PPC_GOT:
7349               dyn.d_un.d_ptr = got;
7350               break;
7351
7352             case DT_RELASZ:
7353               if (htab->is_vxworks)
7354                 {
7355                   if (htab->relplt)
7356                     dyn.d_un.d_ptr -= htab->relplt->size;
7357                   break;
7358                 }
7359               continue;
7360
7361             default:
7362               if (htab->is_vxworks
7363                   && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
7364                 break;
7365               continue;
7366             }
7367
7368           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7369         }
7370     }
7371
7372   /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can
7373      easily find the address of the _GLOBAL_OFFSET_TABLE_.  */
7374   if (htab->got != NULL)
7375     {
7376       unsigned char *p = htab->got->contents;
7377       bfd_vma val;
7378
7379       p += htab->elf.hgot->root.u.def.value;
7380       if (htab->plt_type == PLT_OLD)
7381         bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, p - 4);
7382
7383       val = 0;
7384       if (sdyn != NULL)
7385         val = sdyn->output_section->vma + sdyn->output_offset;
7386       bfd_put_32 (output_bfd, val, p);
7387
7388       elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 4;
7389     }
7390
7391   /* Fill in the first entry in the VxWorks procedure linkage table.  */
7392   if (splt && splt->size > 0)
7393     {
7394       /* Use the right PLT. */
7395       static const bfd_vma *plt_entry = NULL;
7396       plt_entry = info->shared ? 
7397         ppc_elf_vxworks_pic_plt0_entry : ppc_elf_vxworks_plt0_entry;
7398
7399       if (!info->shared)
7400         {
7401           bfd_vma got_value =
7402             (htab->elf.hgot->root.u.def.section->output_section->vma
7403              + htab->elf.hgot->root.u.def.section->output_offset
7404              + htab->elf.hgot->root.u.def.value);
7405           bfd_vma got_hi = (got_value >> 16) + ((got_value & 0x8000) >> 15);
7406
7407           bfd_put_32 (output_bfd, plt_entry[0] | (got_hi & 0xffff),
7408                       splt->contents +  0);
7409           bfd_put_32 (output_bfd, plt_entry[1] | (got_value & 0xffff),
7410                       splt->contents +  4);
7411         }
7412       else
7413         {
7414           bfd_put_32 (output_bfd, plt_entry[0], splt->contents +  0);
7415           bfd_put_32 (output_bfd, plt_entry[1], splt->contents +  4);
7416         }
7417       bfd_put_32 (output_bfd, plt_entry[2], splt->contents +  8);
7418       bfd_put_32 (output_bfd, plt_entry[3], splt->contents + 12);
7419       bfd_put_32 (output_bfd, plt_entry[4], splt->contents + 16);
7420       bfd_put_32 (output_bfd, plt_entry[5], splt->contents + 20);
7421       bfd_put_32 (output_bfd, plt_entry[6], splt->contents + 24);
7422       bfd_put_32 (output_bfd, plt_entry[7], splt->contents + 28);
7423
7424       if (! info->shared)
7425         {
7426           Elf_Internal_Rela rela;
7427           bfd_byte *loc;
7428
7429           loc = htab->srelplt2->contents;
7430
7431           /* Output the @ha relocation for the first instruction.  */
7432           rela.r_offset = (htab->plt->output_section->vma
7433                            + htab->plt->output_offset
7434                            + 2);
7435           rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
7436           rela.r_addend = 0;
7437           bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7438           loc += sizeof (Elf32_External_Rela);
7439           
7440           /* Output the @l relocation for the second instruction.  */
7441           rela.r_offset = (htab->plt->output_section->vma
7442                            + htab->plt->output_offset
7443                            + 6);
7444           rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
7445           rela.r_addend = 0;
7446           bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7447           loc += sizeof (Elf32_External_Rela);
7448
7449           /* Fix up the remaining relocations.  They may have the wrong
7450              symbol index for _G_O_T_ or _P_L_T_ depending on the order
7451              in which symbols were output.  */
7452           while (loc < htab->srelplt2->contents + htab->srelplt2->size)
7453             {
7454               Elf_Internal_Rela rel;
7455
7456               bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
7457               rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
7458               bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
7459               loc += sizeof (Elf32_External_Rela);
7460
7461               bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
7462               rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
7463               bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
7464               loc += sizeof (Elf32_External_Rela);
7465
7466               bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
7467               rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_PPC_ADDR32);
7468               bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
7469               loc += sizeof (Elf32_External_Rela);
7470             }
7471         }
7472     }
7473
7474   if (htab->glink != NULL && htab->glink->contents != NULL)
7475     {
7476       unsigned char *p;
7477       unsigned char *endp;
7478       bfd_vma res0;
7479       unsigned int i;
7480
7481       /*
7482        * PIC glink code is the following:
7483        *
7484        * # ith PLT code stub.
7485        *   addis 11,30,(plt+(i-1)*4-got)@ha
7486        *   lwz 11,(plt+(i-1)*4-got)@l(11)
7487        *   mtctr 11
7488        *   bctr
7489        *
7490        * # A table of branches, one for each plt entry.
7491        * # The idea is that the plt call stub loads ctr (and r11) with these
7492        * # addresses, so (r11 - res_0) gives the plt index * 4.
7493        * res_0: b PLTresolve
7494        * res_1: b PLTresolve
7495        * .
7496        * # Some number of entries towards the end can be nops
7497        * res_n_m3: nop
7498        * res_n_m2: nop
7499        * res_n_m1:
7500        *
7501        * PLTresolve:
7502        *    addis 11,11,(1f-res_0)@ha
7503        *    mflr 0
7504        *    bcl 20,31,1f
7505        * 1: addi 11,11,(1b-res_0)@l
7506        *    mflr 12
7507        *    mtlr 0
7508        *    sub 11,11,12                # r11 = index * 4
7509        *    addis 12,12,(got+4-1b)@ha
7510        *    lwz 0,(got+4-1b)@l(12)      # got[1] address of dl_runtime_resolve
7511        *    lwz 12,(got+8-1b)@l(12)     # got[2] contains the map address
7512        *    mtctr 0
7513        *    add 0,11,11
7514        *    add 11,0,11                 # r11 = index * 12 = reloc offset.
7515        *    bctr
7516        */
7517       static const unsigned int pic_plt_resolve[] =
7518         {
7519           ADDIS_11_11,
7520           MFLR_0,
7521           BCL_20_31,
7522           ADDI_11_11,
7523           MFLR_12,
7524           MTLR_0,
7525           SUB_11_11_12,
7526           ADDIS_12_12,
7527           LWZ_0_12,
7528           LWZ_12_12,
7529           MTCTR_0,
7530           ADD_0_11_11,
7531           ADD_11_0_11,
7532           BCTR,
7533           NOP,
7534           NOP
7535         };
7536
7537       static const unsigned int plt_resolve[] =
7538         {
7539           LIS_12,
7540           ADDIS_11_11,
7541           LWZ_0_12,
7542           ADDI_11_11,
7543           MTCTR_0,
7544           ADD_0_11_11,
7545           LWZ_12_12,
7546           ADD_11_0_11,
7547           BCTR,
7548           NOP,
7549           NOP,
7550           NOP,
7551           NOP,
7552           NOP,
7553           NOP,
7554           NOP
7555         };
7556
7557       if (ARRAY_SIZE (pic_plt_resolve) != GLINK_PLTRESOLVE / 4)
7558         abort ();
7559       if (ARRAY_SIZE (plt_resolve) != GLINK_PLTRESOLVE / 4)
7560         abort ();
7561
7562       /* Build the branch table, one for each plt entry (less one),
7563          and perhaps some padding.  */
7564       p = htab->glink->contents;
7565       p += htab->glink_pltresolve;
7566       endp = htab->glink->contents;
7567       endp += htab->glink->size - GLINK_PLTRESOLVE;
7568       while (p < endp - 8 * 4)
7569         {
7570           bfd_put_32 (output_bfd, B + endp - p, p);
7571           p += 4;
7572         }
7573       while (p < endp)
7574         {
7575           bfd_put_32 (output_bfd, NOP, p);
7576           p += 4;
7577         }
7578
7579       res0 = (htab->glink_pltresolve
7580               + htab->glink->output_section->vma
7581               + htab->glink->output_offset);
7582
7583       /* Last comes the PLTresolve stub.  */
7584       if (info->shared || info->pie)
7585         {
7586           bfd_vma bcl;
7587
7588           for (i = 0; i < ARRAY_SIZE (pic_plt_resolve); i++)
7589             {
7590               bfd_put_32 (output_bfd, pic_plt_resolve[i], p);
7591               p += 4;
7592             }
7593           p -= 4 * ARRAY_SIZE (pic_plt_resolve);
7594
7595           bcl = (htab->glink->size - GLINK_PLTRESOLVE + 3*4
7596                  + htab->glink->output_section->vma
7597                  + htab->glink->output_offset);
7598
7599           bfd_put_32 (output_bfd,
7600                       ADDIS_11_11 + PPC_HA (bcl - res0), p + 0*4);
7601           bfd_put_32 (output_bfd,
7602                       ADDI_11_11 + PPC_LO (bcl - res0), p + 3*4);
7603           bfd_put_32 (output_bfd,
7604                       ADDIS_12_12 + PPC_HA (got + 4 - bcl), p + 7*4);
7605           if (PPC_HA (got + 4 - bcl) == PPC_HA (got + 8 - bcl))
7606             {
7607               bfd_put_32 (output_bfd,
7608                           LWZ_0_12 + PPC_LO (got + 4 - bcl), p + 8*4);
7609               bfd_put_32 (output_bfd,
7610                           LWZ_12_12 + PPC_LO (got + 8 - bcl), p + 9*4);
7611             }
7612           else
7613             {
7614               bfd_put_32 (output_bfd,
7615                           LWZU_0_12 + PPC_LO (got + 4 - bcl), p + 8*4);
7616               bfd_put_32 (output_bfd,
7617                           LWZ_12_12 + 4, p + 9*4);
7618             }
7619         }
7620       else
7621         {
7622           for (i = 0; i < ARRAY_SIZE (plt_resolve); i++)
7623             {
7624               bfd_put_32 (output_bfd, plt_resolve[i], p);
7625               p += 4;
7626             }
7627           p -= 4 * ARRAY_SIZE (plt_resolve);
7628
7629           bfd_put_32 (output_bfd,
7630                       LIS_12 + PPC_HA (got + 4), p + 0*4);
7631           bfd_put_32 (output_bfd,
7632                       ADDIS_11_11 + PPC_HA (-res0), p + 1*4);
7633           bfd_put_32 (output_bfd,
7634                       ADDI_11_11 + PPC_LO (-res0), p + 3*4);
7635           if (PPC_HA (got + 4) == PPC_HA (got + 8))
7636             {
7637               bfd_put_32 (output_bfd,
7638                           LWZ_0_12 + PPC_LO (got + 4), p + 2*4);
7639               bfd_put_32 (output_bfd,
7640                           LWZ_12_12 + PPC_LO (got + 8), p + 6*4);
7641             }
7642           else
7643             {
7644               bfd_put_32 (output_bfd,
7645                           LWZU_0_12 + PPC_LO (got + 4), p + 2*4);
7646               bfd_put_32 (output_bfd,
7647                           LWZ_12_12 + 4, p + 6*4);
7648             }
7649         }
7650     }
7651
7652   return TRUE;
7653 }
7654 \f
7655 #define TARGET_LITTLE_SYM       bfd_elf32_powerpcle_vec
7656 #define TARGET_LITTLE_NAME      "elf32-powerpcle"
7657 #define TARGET_BIG_SYM          bfd_elf32_powerpc_vec
7658 #define TARGET_BIG_NAME         "elf32-powerpc"
7659 #define ELF_ARCH                bfd_arch_powerpc
7660 #define ELF_MACHINE_CODE        EM_PPC
7661 #ifdef __QNXTARGET__
7662 #define ELF_MAXPAGESIZE         0x1000
7663 #else
7664 #define ELF_MAXPAGESIZE         0x10000
7665 #endif
7666 #define ELF_MINPAGESIZE         0x1000
7667 #define ELF_COMMONPAGESIZE      0x1000
7668 #define elf_info_to_howto       ppc_elf_info_to_howto
7669
7670 #ifdef  EM_CYGNUS_POWERPC
7671 #define ELF_MACHINE_ALT1        EM_CYGNUS_POWERPC
7672 #endif
7673
7674 #ifdef EM_PPC_OLD
7675 #define ELF_MACHINE_ALT2        EM_PPC_OLD
7676 #endif
7677
7678 #define elf_backend_plt_not_loaded      1
7679 #define elf_backend_can_gc_sections     1
7680 #define elf_backend_can_refcount        1
7681 #define elf_backend_rela_normal         1
7682
7683 #define bfd_elf32_mkobject                      ppc_elf_mkobject
7684 #define bfd_elf32_bfd_merge_private_bfd_data    ppc_elf_merge_private_bfd_data
7685 #define bfd_elf32_bfd_relax_section             ppc_elf_relax_section
7686 #define bfd_elf32_bfd_reloc_type_lookup         ppc_elf_reloc_type_lookup
7687 #define bfd_elf32_bfd_reloc_name_lookup ppc_elf_reloc_name_lookup
7688 #define bfd_elf32_bfd_set_private_flags         ppc_elf_set_private_flags
7689 #define bfd_elf32_bfd_link_hash_table_create    ppc_elf_link_hash_table_create
7690
7691 #define elf_backend_object_p                    ppc_elf_object_p
7692 #define elf_backend_gc_mark_hook                ppc_elf_gc_mark_hook
7693 #define elf_backend_gc_sweep_hook               ppc_elf_gc_sweep_hook
7694 #define elf_backend_section_from_shdr           ppc_elf_section_from_shdr
7695 #define elf_backend_relocate_section            ppc_elf_relocate_section
7696 #define elf_backend_create_dynamic_sections     ppc_elf_create_dynamic_sections
7697 #define elf_backend_check_relocs                ppc_elf_check_relocs
7698 #define elf_backend_copy_indirect_symbol        ppc_elf_copy_indirect_symbol
7699 #define elf_backend_adjust_dynamic_symbol       ppc_elf_adjust_dynamic_symbol
7700 #define elf_backend_add_symbol_hook             ppc_elf_add_symbol_hook
7701 #define elf_backend_size_dynamic_sections       ppc_elf_size_dynamic_sections
7702 #define elf_backend_finish_dynamic_symbol       ppc_elf_finish_dynamic_symbol
7703 #define elf_backend_finish_dynamic_sections     ppc_elf_finish_dynamic_sections
7704 #define elf_backend_fake_sections               ppc_elf_fake_sections
7705 #define elf_backend_additional_program_headers  ppc_elf_additional_program_headers
7706 #define elf_backend_grok_prstatus               ppc_elf_grok_prstatus
7707 #define elf_backend_grok_psinfo                 ppc_elf_grok_psinfo
7708 #define elf_backend_write_core_note             ppc_elf_write_core_note
7709 #define elf_backend_reloc_type_class            ppc_elf_reloc_type_class
7710 #define elf_backend_begin_write_processing      ppc_elf_begin_write_processing
7711 #define elf_backend_final_write_processing      ppc_elf_final_write_processing
7712 #define elf_backend_write_section               ppc_elf_write_section
7713 #define elf_backend_get_sec_type_attr           ppc_elf_get_sec_type_attr
7714 #define elf_backend_plt_sym_val                 ppc_elf_plt_sym_val
7715 #define elf_backend_action_discarded            ppc_elf_action_discarded
7716 #define elf_backend_init_index_section          _bfd_elf_init_1_index_section
7717
7718 #include "elf32-target.h"
7719
7720 /* VxWorks Target */
7721
7722 #undef TARGET_LITTLE_SYM
7723 #undef TARGET_LITTLE_NAME
7724
7725 #undef TARGET_BIG_SYM
7726 #define TARGET_BIG_SYM          bfd_elf32_powerpc_vxworks_vec
7727 #undef TARGET_BIG_NAME
7728 #define TARGET_BIG_NAME         "elf32-powerpc-vxworks"
7729
7730 /* VxWorks uses the elf default section flags for .plt.  */
7731 static const struct bfd_elf_special_section *
7732 ppc_elf_vxworks_get_sec_type_attr (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
7733 {
7734   if (sec->name == NULL)
7735     return NULL;
7736
7737   if (strcmp (sec->name, ".plt") == 0)
7738     return _bfd_elf_get_sec_type_attr (abfd, sec);
7739
7740   return ppc_elf_get_sec_type_attr (abfd, sec);
7741 }
7742
7743 /* Like ppc_elf_link_hash_table_create, but overrides
7744    appropriately for VxWorks.  */
7745 static struct bfd_link_hash_table *
7746 ppc_elf_vxworks_link_hash_table_create (bfd *abfd)
7747 {
7748   struct bfd_link_hash_table *ret;
7749
7750   ret = ppc_elf_link_hash_table_create (abfd);
7751   if (ret)
7752     {
7753       struct ppc_elf_link_hash_table *htab
7754         = (struct ppc_elf_link_hash_table *)ret;
7755       htab->is_vxworks = 1;
7756       htab->plt_type = PLT_VXWORKS;
7757       htab->plt_entry_size = VXWORKS_PLT_ENTRY_SIZE;
7758       htab->plt_slot_size = VXWORKS_PLT_ENTRY_SIZE;
7759       htab->plt_initial_entry_size = VXWORKS_PLT_INITIAL_ENTRY_SIZE;
7760     }
7761   return ret;
7762 }
7763
7764 /* Tweak magic VxWorks symbols as they are loaded.  */
7765 static bfd_boolean
7766 ppc_elf_vxworks_add_symbol_hook (bfd *abfd,
7767                                  struct bfd_link_info *info,
7768                                  Elf_Internal_Sym *sym,
7769                                  const char **namep ATTRIBUTE_UNUSED,
7770                                  flagword *flagsp ATTRIBUTE_UNUSED,
7771                                  asection **secp,
7772                                  bfd_vma *valp)
7773 {
7774   if (!elf_vxworks_add_symbol_hook(abfd, info, sym,namep, flagsp, secp,
7775                                    valp))
7776     return FALSE;
7777
7778   return ppc_elf_add_symbol_hook(abfd, info, sym,namep, flagsp, secp, valp);
7779 }
7780
7781 static void
7782 ppc_elf_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
7783 {
7784   ppc_elf_final_write_processing(abfd, linker);
7785   elf_vxworks_final_write_processing(abfd, linker);
7786 }
7787
7788 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
7789    define it.  */
7790 #undef elf_backend_want_plt_sym
7791 #define elf_backend_want_plt_sym                1
7792 #undef elf_backend_want_got_plt
7793 #define elf_backend_want_got_plt                1
7794 #undef elf_backend_got_symbol_offset
7795 #define elf_backend_got_symbol_offset           0
7796 #undef elf_backend_plt_not_loaded
7797 #define elf_backend_plt_not_loaded              0
7798 #undef elf_backend_plt_readonly
7799 #define elf_backend_plt_readonly                1
7800 #undef elf_backend_got_header_size
7801 #define elf_backend_got_header_size             12
7802
7803 #undef bfd_elf32_bfd_link_hash_table_create
7804 #define bfd_elf32_bfd_link_hash_table_create \
7805   ppc_elf_vxworks_link_hash_table_create
7806 #undef elf_backend_add_symbol_hook
7807 #define elf_backend_add_symbol_hook \
7808   ppc_elf_vxworks_add_symbol_hook
7809 #undef elf_backend_link_output_symbol_hook
7810 #define elf_backend_link_output_symbol_hook \
7811   elf_vxworks_link_output_symbol_hook
7812 #undef elf_backend_final_write_processing
7813 #define elf_backend_final_write_processing \
7814   ppc_elf_vxworks_final_write_processing
7815 #undef elf_backend_get_sec_type_attr
7816 #define elf_backend_get_sec_type_attr \
7817   ppc_elf_vxworks_get_sec_type_attr
7818 #undef elf_backend_emit_relocs
7819 #define elf_backend_emit_relocs \
7820   elf_vxworks_emit_relocs
7821
7822 #undef elf32_bed
7823 #define elf32_bed                               ppc_elf_vxworks_bed
7824
7825 #include "elf32-target.h"