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