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