OSDN Git Service

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