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