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