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