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