Error for mismatched powerpc ABI tags
[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 bfd_boolean
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   bfd_boolean ret = TRUE;
4723
4724   in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
4725   out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
4726
4727   in_attr = &in_attrs[Tag_GNU_Power_ABI_FP];
4728   out_attr = &out_attrs[Tag_GNU_Power_ABI_FP];
4729
4730   if (in_attr->i != out_attr->i)
4731     {
4732       int in_fp = in_attr->i & 3;
4733       int out_fp = out_attr->i & 3;
4734       static bfd *last_fp, *last_ld;
4735
4736       if (in_fp == 0)
4737         ;
4738       else if (out_fp == 0)
4739         {
4740           out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
4741           out_attr->i ^= in_fp;
4742           last_fp = ibfd;
4743         }
4744       else if (out_fp != 2 && in_fp == 2)
4745         {
4746           _bfd_error_handler
4747             /* xgettext:c-format */
4748             (_("%pB uses hard float, %pB uses soft float"),
4749              last_fp, ibfd);
4750           ret = FALSE;
4751         }
4752       else if (out_fp == 2 && in_fp != 2)
4753         {
4754           _bfd_error_handler
4755             /* xgettext:c-format */
4756             (_("%pB uses hard float, %pB uses soft float"),
4757              ibfd, last_fp);
4758           ret = FALSE;
4759         }
4760       else if (out_fp == 1 && in_fp == 3)
4761         {
4762           _bfd_error_handler
4763             /* xgettext:c-format */
4764             (_("%pB uses double-precision hard float, "
4765                "%pB uses single-precision hard float"), last_fp, ibfd);
4766           ret = FALSE;
4767         }
4768       else if (out_fp == 3 && in_fp == 1)
4769         {
4770           _bfd_error_handler
4771             /* xgettext:c-format */
4772             (_("%pB uses double-precision hard float, "
4773                "%pB uses single-precision hard float"), ibfd, last_fp);
4774           ret = FALSE;
4775         }
4776
4777       in_fp = in_attr->i & 0xc;
4778       out_fp = out_attr->i & 0xc;
4779       if (in_fp == 0)
4780         ;
4781       else if (out_fp == 0)
4782         {
4783           out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
4784           out_attr->i ^= in_fp;
4785           last_ld = ibfd;
4786         }
4787       else if (out_fp != 2 * 4 && in_fp == 2 * 4)
4788         {
4789           _bfd_error_handler
4790             /* xgettext:c-format */
4791             (_("%pB uses 64-bit long double, "
4792                "%pB uses 128-bit long double"), ibfd, last_ld);
4793           ret = FALSE;
4794         }
4795       else if (in_fp != 2 * 4 && out_fp == 2 * 4)
4796         {
4797           _bfd_error_handler
4798             /* xgettext:c-format */
4799             (_("%pB uses 64-bit long double, "
4800                "%pB uses 128-bit long double"), last_ld, ibfd);
4801           ret = FALSE;
4802         }
4803       else if (out_fp == 1 * 4 && in_fp == 3 * 4)
4804         {
4805           _bfd_error_handler
4806             /* xgettext:c-format */
4807             (_("%pB uses IBM long double, "
4808                "%pB uses IEEE long double"), last_ld, ibfd);
4809           ret = FALSE;
4810         }
4811       else if (out_fp == 3 * 4 && in_fp == 1 * 4)
4812         {
4813           _bfd_error_handler
4814             /* xgettext:c-format */
4815             (_("%pB uses IBM long double, "
4816                "%pB uses IEEE long double"), ibfd, last_ld);
4817           ret = FALSE;
4818         }
4819     }
4820
4821   if (!ret)
4822     {
4823       out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
4824       bfd_set_error (bfd_error_bad_value);
4825     }
4826   return ret;
4827 }
4828
4829 /* Merge object attributes from IBFD into OBFD.  Warn if
4830    there are conflicting attributes.  */
4831 static bfd_boolean
4832 ppc_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
4833 {
4834   bfd *obfd;
4835   obj_attribute *in_attr, *in_attrs;
4836   obj_attribute *out_attr, *out_attrs;
4837   bfd_boolean ret;
4838
4839   if (!_bfd_elf_ppc_merge_fp_attributes (ibfd, info))
4840     return FALSE;
4841
4842   obfd = info->output_bfd;
4843   in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
4844   out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
4845
4846   /* Check for conflicting Tag_GNU_Power_ABI_Vector attributes and
4847      merge non-conflicting ones.  */
4848   in_attr = &in_attrs[Tag_GNU_Power_ABI_Vector];
4849   out_attr = &out_attrs[Tag_GNU_Power_ABI_Vector];
4850   ret = TRUE;
4851   if (in_attr->i != out_attr->i)
4852     {
4853       int in_vec = in_attr->i & 3;
4854       int out_vec = out_attr->i & 3;
4855       static bfd *last_vec;
4856
4857       if (in_vec == 0)
4858         ;
4859       else if (out_vec == 0)
4860         {
4861           out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
4862           out_attr->i = in_vec;
4863           last_vec = ibfd;
4864         }
4865       /* For now, allow generic to transition to AltiVec or SPE
4866          without a warning.  If GCC marked files with their stack
4867          alignment and used don't-care markings for files which are
4868          not affected by the vector ABI, we could warn about this
4869          case too.  */
4870       else if (in_vec == 1)
4871         ;
4872       else if (out_vec == 1)
4873         {
4874           out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
4875           out_attr->i = in_vec;
4876           last_vec = ibfd;
4877         }
4878       else if (out_vec < in_vec)
4879         {
4880           _bfd_error_handler
4881             /* xgettext:c-format */
4882             (_("%pB uses AltiVec vector ABI, %pB uses SPE vector ABI"),
4883              last_vec, ibfd);
4884           out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
4885           ret = FALSE;
4886         }
4887       else if (out_vec > in_vec)
4888         {
4889           _bfd_error_handler
4890             /* xgettext:c-format */
4891             (_("%pB uses AltiVec vector ABI, %pB uses SPE vector ABI"),
4892              ibfd, last_vec);
4893           out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
4894           ret = FALSE;
4895         }
4896     }
4897
4898   /* Check for conflicting Tag_GNU_Power_ABI_Struct_Return attributes
4899      and merge non-conflicting ones.  */
4900   in_attr = &in_attrs[Tag_GNU_Power_ABI_Struct_Return];
4901   out_attr = &out_attrs[Tag_GNU_Power_ABI_Struct_Return];
4902   if (in_attr->i != out_attr->i)
4903     {
4904       int in_struct = in_attr->i & 3;
4905       int out_struct = out_attr->i & 3;
4906       static bfd *last_struct;
4907
4908       if (in_struct == 0 || in_struct == 3)
4909        ;
4910       else if (out_struct == 0)
4911         {
4912           out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
4913           out_attr->i = in_struct;
4914           last_struct = ibfd;
4915         }
4916       else if (out_struct < in_struct)
4917         {
4918           _bfd_error_handler
4919             /* xgettext:c-format */
4920             (_("%pB uses r3/r4 for small structure returns, "
4921                "%pB uses memory"), last_struct, ibfd);
4922           out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
4923           ret = FALSE;
4924         }
4925       else if (out_struct > in_struct)
4926         {
4927           _bfd_error_handler
4928             /* xgettext:c-format */
4929             (_("%pB uses r3/r4 for small structure returns, "
4930                "%pB uses memory"), ibfd, last_struct);
4931           out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
4932           ret = FALSE;
4933         }
4934     }
4935   if (!ret)
4936     {
4937       bfd_set_error (bfd_error_bad_value);
4938       return FALSE;
4939     }
4940
4941   /* Merge Tag_compatibility attributes and any common GNU ones.  */
4942   return _bfd_elf_merge_object_attributes (ibfd, info);
4943 }
4944
4945 /* Merge backend specific data from an object file to the output
4946    object file when linking.  */
4947
4948 static bfd_boolean
4949 ppc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
4950 {
4951   bfd *obfd = info->output_bfd;
4952   flagword old_flags;
4953   flagword new_flags;
4954   bfd_boolean error;
4955
4956   if (!is_ppc_elf (ibfd) || !is_ppc_elf (obfd))
4957     return TRUE;
4958
4959   /* Check if we have the same endianness.  */
4960   if (! _bfd_generic_verify_endian_match (ibfd, info))
4961     return FALSE;
4962
4963   if (!ppc_elf_merge_obj_attributes (ibfd, info))
4964     return FALSE;
4965
4966   new_flags = elf_elfheader (ibfd)->e_flags;
4967   old_flags = elf_elfheader (obfd)->e_flags;
4968   if (!elf_flags_init (obfd))
4969     {
4970       /* First call, no flags set.  */
4971       elf_flags_init (obfd) = TRUE;
4972       elf_elfheader (obfd)->e_flags = new_flags;
4973     }
4974
4975   /* Compatible flags are ok.  */
4976   else if (new_flags == old_flags)
4977     ;
4978
4979   /* Incompatible flags.  */
4980   else
4981     {
4982       /* Warn about -mrelocatable mismatch.  Allow -mrelocatable-lib
4983          to be linked with either.  */
4984       error = FALSE;
4985       if ((new_flags & EF_PPC_RELOCATABLE) != 0
4986           && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
4987         {
4988           error = TRUE;
4989           _bfd_error_handler
4990             (_("%pB: compiled with -mrelocatable and linked with "
4991                "modules compiled normally"), ibfd);
4992         }
4993       else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
4994                && (old_flags & EF_PPC_RELOCATABLE) != 0)
4995         {
4996           error = TRUE;
4997           _bfd_error_handler
4998             (_("%pB: compiled normally and linked with "
4999                "modules compiled with -mrelocatable"), ibfd);
5000         }
5001
5002       /* The output is -mrelocatable-lib iff both the input files are.  */
5003       if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
5004         elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
5005
5006       /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
5007          but each input file is either -mrelocatable or -mrelocatable-lib.  */
5008       if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
5009           && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
5010           && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
5011         elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
5012
5013       /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
5014          any module uses it.  */
5015       elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
5016
5017       new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
5018       old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
5019
5020       /* Warn about any other mismatches.  */
5021       if (new_flags != old_flags)
5022         {
5023           error = TRUE;
5024           _bfd_error_handler
5025             /* xgettext:c-format */
5026             (_("%pB: uses different e_flags (%#x) fields "
5027                "than previous modules (%#x)"),
5028              ibfd, new_flags, old_flags);
5029         }
5030
5031       if (error)
5032         {
5033           bfd_set_error (bfd_error_bad_value);
5034           return FALSE;
5035         }
5036     }
5037
5038   return TRUE;
5039 }
5040
5041 static void
5042 ppc_elf_vle_split16 (bfd *input_bfd,
5043                      asection *input_section,
5044                      unsigned long offset,
5045                      bfd_byte *loc,
5046                      bfd_vma value,
5047                      split16_format_type split16_format,
5048                      bfd_boolean fixup)
5049 {
5050   unsigned int insn, opcode, top5;
5051
5052   insn = bfd_get_32 (input_bfd, loc);
5053   opcode = insn & 0xfc00f800;
5054   if (opcode == E_OR2I_INSN
5055       || opcode == E_AND2I_DOT_INSN
5056       || opcode == E_OR2IS_INSN
5057       || opcode == E_LIS_INSN
5058       || opcode == E_AND2IS_DOT_INSN)
5059     {
5060       if (split16_format != split16a_type)
5061         {
5062           if (fixup)
5063             split16_format = split16a_type;
5064           else
5065             _bfd_error_handler
5066               /* xgettext:c-format */
5067               (_("%pB(%pA+0x%lx): expected 16A style relocation on 0x%08x insn"),
5068                input_bfd, input_section, offset, opcode);
5069         }
5070     }
5071   else if (opcode == E_ADD2I_DOT_INSN
5072            || opcode == E_ADD2IS_INSN
5073            || opcode == E_CMP16I_INSN
5074            || opcode == E_MULL2I_INSN
5075            || opcode == E_CMPL16I_INSN
5076            || opcode == E_CMPH16I_INSN
5077            || opcode == E_CMPHL16I_INSN)
5078     {
5079       if (split16_format != split16d_type)
5080         {
5081           if (fixup)
5082             split16_format = split16d_type;
5083           else
5084             _bfd_error_handler
5085               /* xgettext:c-format */
5086               (_("%pB(%pA+0x%lx): expected 16D style relocation on 0x%08x insn"),
5087                input_bfd, input_section, offset, opcode);
5088         }
5089     }
5090   top5 = value & 0xf800;
5091   top5 = top5 << (split16_format == split16a_type ? 5 : 10);
5092   insn &= (split16_format == split16a_type ? ~0x1f07ff : ~0x3e007ff);
5093   insn |= top5;
5094   insn |= value & 0x7ff;
5095   bfd_put_32 (input_bfd, insn, loc);
5096 }
5097
5098 static void
5099 ppc_elf_vle_split20 (bfd *output_bfd, bfd_byte *loc, bfd_vma value)
5100 {
5101   unsigned int insn;
5102
5103   insn = bfd_get_32 (output_bfd, loc);
5104   /* We have an li20 field, bits 17..20, 11..15, 21..31.  */
5105   /* Top 4 bits of value to 17..20.  */
5106   insn |= (value & 0xf0000) >> 5;
5107   /* Next 5 bits of the value to 11..15.  */
5108   insn |= (value & 0xf800) << 5;
5109   /* And the final 11 bits of the value to bits 21 to 31.  */
5110   insn |= value & 0x7ff;
5111   bfd_put_32 (output_bfd, insn, loc);
5112 }
5113
5114 \f
5115 /* Choose which PLT scheme to use, and set .plt flags appropriately.
5116    Returns -1 on error, 0 for old PLT, 1 for new PLT.  */
5117 int
5118 ppc_elf_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED,
5119                            struct bfd_link_info *info)
5120 {
5121   struct ppc_elf_link_hash_table *htab;
5122   flagword flags;
5123
5124   htab = ppc_elf_hash_table (info);
5125
5126   if (htab->plt_type == PLT_UNSET)
5127     {
5128       struct elf_link_hash_entry *h;
5129
5130       if (htab->params->plt_style == PLT_OLD)
5131         htab->plt_type = PLT_OLD;
5132       else if (bfd_link_pic (info)
5133                && htab->elf.dynamic_sections_created
5134                && (h = elf_link_hash_lookup (&htab->elf, "_mcount",
5135                                              FALSE, FALSE, TRUE)) != NULL
5136                && (h->type == STT_FUNC
5137                    || h->needs_plt)
5138                && h->ref_regular
5139                && !(SYMBOL_CALLS_LOCAL (info, h)
5140                     || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)))
5141         {
5142           /* Profiling of shared libs (and pies) is not supported with
5143              secure plt, because ppc32 does profiling before a
5144              function prologue and a secure plt pic call stubs needs
5145              r30 to be set up.  */
5146           htab->plt_type = PLT_OLD;
5147         }
5148       else
5149         {
5150           bfd *ibfd;
5151           enum ppc_elf_plt_type plt_type = htab->params->plt_style;
5152
5153           /* Look through the reloc flags left by ppc_elf_check_relocs.
5154              Use the old style bss plt if a file makes plt calls
5155              without using the new relocs, and if ld isn't given
5156              --secure-plt and we never see REL16 relocs.  */
5157           if (plt_type == PLT_UNSET)
5158             plt_type = PLT_OLD;
5159           for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
5160             if (is_ppc_elf (ibfd))
5161               {
5162                 if (ppc_elf_tdata (ibfd)->has_rel16)
5163                   plt_type = PLT_NEW;
5164                 else if (ppc_elf_tdata (ibfd)->makes_plt_call)
5165                   {
5166                     plt_type = PLT_OLD;
5167                     htab->old_bfd = ibfd;
5168                     break;
5169                   }
5170               }
5171           htab->plt_type = plt_type;
5172         }
5173     }
5174   if (htab->plt_type == PLT_OLD && htab->params->plt_style == PLT_NEW)
5175     {
5176       if (htab->old_bfd != NULL)
5177         _bfd_error_handler (_("bss-plt forced due to %pB"), htab->old_bfd);
5178       else
5179         _bfd_error_handler (_("bss-plt forced by profiling"));
5180     }
5181
5182   BFD_ASSERT (htab->plt_type != PLT_VXWORKS);
5183
5184   if (htab->plt_type == PLT_NEW)
5185     {
5186       flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
5187                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
5188
5189       /* The new PLT is a loaded section.  */
5190       if (htab->elf.splt != NULL
5191           && !bfd_set_section_flags (htab->elf.dynobj, htab->elf.splt, flags))
5192         return -1;
5193
5194       /* The new GOT is not executable.  */
5195       if (htab->elf.sgot != NULL
5196           && !bfd_set_section_flags (htab->elf.dynobj, htab->elf.sgot, flags))
5197         return -1;
5198     }
5199   else
5200     {
5201       /* Stop an unused .glink section from affecting .text alignment.  */
5202       if (htab->glink != NULL
5203           && !bfd_set_section_alignment (htab->elf.dynobj, htab->glink, 0))
5204         return -1;
5205     }
5206   return htab->plt_type == PLT_NEW;
5207 }
5208 \f
5209 /* Return the section that should be marked against GC for a given
5210    relocation.  */
5211
5212 static asection *
5213 ppc_elf_gc_mark_hook (asection *sec,
5214                       struct bfd_link_info *info,
5215                       Elf_Internal_Rela *rel,
5216                       struct elf_link_hash_entry *h,
5217                       Elf_Internal_Sym *sym)
5218 {
5219   if (h != NULL)
5220     switch (ELF32_R_TYPE (rel->r_info))
5221       {
5222       case R_PPC_GNU_VTINHERIT:
5223       case R_PPC_GNU_VTENTRY:
5224         return NULL;
5225       }
5226
5227   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5228 }
5229
5230 static bfd_boolean
5231 get_sym_h (struct elf_link_hash_entry **hp,
5232            Elf_Internal_Sym **symp,
5233            asection **symsecp,
5234            unsigned char **tls_maskp,
5235            Elf_Internal_Sym **locsymsp,
5236            unsigned long r_symndx,
5237            bfd *ibfd)
5238 {
5239   Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
5240
5241   if (r_symndx >= symtab_hdr->sh_info)
5242     {
5243       struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
5244       struct elf_link_hash_entry *h;
5245
5246       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5247       while (h->root.type == bfd_link_hash_indirect
5248              || h->root.type == bfd_link_hash_warning)
5249         h = (struct elf_link_hash_entry *) h->root.u.i.link;
5250
5251       if (hp != NULL)
5252         *hp = h;
5253
5254       if (symp != NULL)
5255         *symp = NULL;
5256
5257       if (symsecp != NULL)
5258         {
5259           asection *symsec = NULL;
5260           if (h->root.type == bfd_link_hash_defined
5261               || h->root.type == bfd_link_hash_defweak)
5262             symsec = h->root.u.def.section;
5263           *symsecp = symsec;
5264         }
5265
5266       if (tls_maskp != NULL)
5267         *tls_maskp = &ppc_elf_hash_entry (h)->tls_mask;
5268     }
5269   else
5270     {
5271       Elf_Internal_Sym *sym;
5272       Elf_Internal_Sym *locsyms = *locsymsp;
5273
5274       if (locsyms == NULL)
5275         {
5276           locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
5277           if (locsyms == NULL)
5278             locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
5279                                             symtab_hdr->sh_info,
5280                                             0, NULL, NULL, NULL);
5281           if (locsyms == NULL)
5282             return FALSE;
5283           *locsymsp = locsyms;
5284         }
5285       sym = locsyms + r_symndx;
5286
5287       if (hp != NULL)
5288         *hp = NULL;
5289
5290       if (symp != NULL)
5291         *symp = sym;
5292
5293       if (symsecp != NULL)
5294         *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
5295
5296       if (tls_maskp != NULL)
5297         {
5298           bfd_signed_vma *local_got;
5299           unsigned char *tls_mask;
5300
5301           tls_mask = NULL;
5302           local_got = elf_local_got_refcounts (ibfd);
5303           if (local_got != NULL)
5304             {
5305               struct plt_entry **local_plt = (struct plt_entry **)
5306                 (local_got + symtab_hdr->sh_info);
5307               unsigned char *lgot_masks = (unsigned char *)
5308                 (local_plt + symtab_hdr->sh_info);
5309               tls_mask = &lgot_masks[r_symndx];
5310             }
5311           *tls_maskp = tls_mask;
5312         }
5313     }
5314   return TRUE;
5315 }
5316 \f
5317 /* Analyze inline PLT call relocations to see whether calls to locally
5318    defined functions can be converted to direct calls.  */
5319
5320 bfd_boolean
5321 ppc_elf_inline_plt (struct bfd_link_info *info)
5322 {
5323   struct ppc_elf_link_hash_table *htab;
5324   bfd *ibfd;
5325   asection *sec;
5326   bfd_vma low_vma, high_vma, limit;
5327
5328   htab = ppc_elf_hash_table (info);
5329   if (htab == NULL)
5330     return FALSE;
5331
5332   /* A bl insn can reach -0x2000000 to 0x1fffffc.  The limit is
5333      reduced somewhat to cater for possible stubs that might be added
5334      between the call and its destination.  */
5335   limit = 0x1e00000;
5336   low_vma = -1;
5337   high_vma = 0;
5338   for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
5339     if ((sec->flags & (SEC_ALLOC | SEC_CODE)) == (SEC_ALLOC | SEC_CODE))
5340       {
5341         if (low_vma > sec->vma)
5342           low_vma = sec->vma;
5343         if (high_vma < sec->vma + sec->size)
5344           high_vma = sec->vma + sec->size;
5345       }
5346
5347   /* If a "bl" can reach anywhere in local code sections, then we can
5348      convert all inline PLT sequences to direct calls when the symbol
5349      is local.  */
5350   if (high_vma - low_vma < limit)
5351     {
5352       htab->can_convert_all_inline_plt = 1;
5353       return TRUE;
5354     }
5355
5356   /* Otherwise, go looking through relocs for cases where a direct
5357      call won't reach.  Mark the symbol on any such reloc to disable
5358      the optimization and keep the PLT entry as it seems likely that
5359      this will be better than creating trampolines.  Note that this
5360      will disable the optimization for all inline PLT calls to a
5361      particular symbol, not just those that won't reach.  The
5362      difficulty in doing a more precise optimization is that the
5363      linker needs to make a decision depending on whether a
5364      particular R_PPC_PLTCALL insn can be turned into a direct
5365      call, for each of the R_PPC_PLTSEQ and R_PPC_PLT16* insns in
5366      the sequence, and there is nothing that ties those relocs
5367      together except their symbol.  */
5368
5369   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
5370     {
5371       Elf_Internal_Shdr *symtab_hdr;
5372       Elf_Internal_Sym *local_syms;
5373
5374       if (!is_ppc_elf (ibfd))
5375         continue;
5376
5377       local_syms = NULL;
5378       symtab_hdr = &elf_symtab_hdr (ibfd);
5379
5380       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
5381         if (sec->has_pltcall
5382             && !bfd_is_abs_section (sec->output_section))
5383           {
5384             Elf_Internal_Rela *relstart, *rel, *relend;
5385
5386             /* Read the relocations.  */
5387             relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
5388                                                   info->keep_memory);
5389             if (relstart == NULL)
5390               return FALSE;
5391
5392             relend = relstart + sec->reloc_count;
5393             for (rel = relstart; rel < relend; )
5394               {
5395                 enum elf_ppc_reloc_type r_type;
5396                 unsigned long r_symndx;
5397                 asection *sym_sec;
5398                 struct elf_link_hash_entry *h;
5399                 Elf_Internal_Sym *sym;
5400                 unsigned char *tls_maskp;
5401
5402                 r_type = ELF32_R_TYPE (rel->r_info);
5403                 if (r_type != R_PPC_PLTCALL)
5404                   continue;
5405
5406                 r_symndx = ELF32_R_SYM (rel->r_info);
5407                 if (!get_sym_h (&h, &sym, &sym_sec, &tls_maskp, &local_syms,
5408                                 r_symndx, ibfd))
5409                   {
5410                     if (elf_section_data (sec)->relocs != relstart)
5411                       free (relstart);
5412                     if (local_syms != NULL
5413                         && symtab_hdr->contents != (unsigned char *) local_syms)
5414                       free (local_syms);
5415                     return FALSE;
5416                   }
5417
5418                 if (sym_sec != NULL && sym_sec->output_section != NULL)
5419                   {
5420                     bfd_vma from, to;
5421                     if (h != NULL)
5422                       to = h->root.u.def.value;
5423                     else
5424                       to = sym->st_value;
5425                     to += (rel->r_addend
5426                            + sym_sec->output_offset
5427                            + sym_sec->output_section->vma);
5428                     from = (rel->r_offset
5429                             + sec->output_offset
5430                             + sec->output_section->vma);
5431                     if (to - from + limit < 2 * limit)
5432                       *tls_maskp &= ~PLT_KEEP;
5433                   }
5434               }
5435             if (elf_section_data (sec)->relocs != relstart)
5436               free (relstart);
5437           }
5438
5439       if (local_syms != NULL
5440           && symtab_hdr->contents != (unsigned char *) local_syms)
5441         {
5442           if (!info->keep_memory)
5443             free (local_syms);
5444           else
5445             symtab_hdr->contents = (unsigned char *) local_syms;
5446         }
5447     }
5448
5449   return TRUE;
5450 }
5451
5452 /* Set plt output section type, htab->tls_get_addr, and call the
5453    generic ELF tls_setup function.  */
5454
5455 asection *
5456 ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
5457 {
5458   struct ppc_elf_link_hash_table *htab;
5459
5460   htab = ppc_elf_hash_table (info);
5461   htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5462                                              FALSE, FALSE, TRUE);
5463   if (htab->plt_type != PLT_NEW)
5464     htab->params->no_tls_get_addr_opt = TRUE;
5465
5466   if (!htab->params->no_tls_get_addr_opt)
5467     {
5468       struct elf_link_hash_entry *opt, *tga;
5469       opt = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
5470                                   FALSE, FALSE, TRUE);
5471       if (opt != NULL
5472           && (opt->root.type == bfd_link_hash_defined
5473               || opt->root.type == bfd_link_hash_defweak))
5474         {
5475           /* If glibc supports an optimized __tls_get_addr call stub,
5476              signalled by the presence of __tls_get_addr_opt, and we'll
5477              be calling __tls_get_addr via a plt call stub, then
5478              make __tls_get_addr point to __tls_get_addr_opt.  */
5479           tga = htab->tls_get_addr;
5480           if (htab->elf.dynamic_sections_created
5481               && tga != NULL
5482               && (tga->type == STT_FUNC
5483                   || tga->needs_plt)
5484               && !(SYMBOL_CALLS_LOCAL (info, tga)
5485                    || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga)))
5486             {
5487               struct plt_entry *ent;
5488               for (ent = tga->plt.plist; ent != NULL; ent = ent->next)
5489                 if (ent->plt.refcount > 0)
5490                   break;
5491               if (ent != NULL)
5492                 {
5493                   tga->root.type = bfd_link_hash_indirect;
5494                   tga->root.u.i.link = &opt->root;
5495                   ppc_elf_copy_indirect_symbol (info, opt, tga);
5496                   opt->mark = 1;
5497                   if (opt->dynindx != -1)
5498                     {
5499                       /* Use __tls_get_addr_opt in dynamic relocations.  */
5500                       opt->dynindx = -1;
5501                       _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
5502                                               opt->dynstr_index);
5503                       if (!bfd_elf_link_record_dynamic_symbol (info, opt))
5504                         return FALSE;
5505                     }
5506                   htab->tls_get_addr = opt;
5507                 }
5508             }
5509         }
5510       else
5511         htab->params->no_tls_get_addr_opt = TRUE;
5512     }
5513   if (htab->plt_type == PLT_NEW
5514       && htab->elf.splt != NULL
5515       && htab->elf.splt->output_section != NULL)
5516     {
5517       elf_section_type (htab->elf.splt->output_section) = SHT_PROGBITS;
5518       elf_section_flags (htab->elf.splt->output_section) = SHF_ALLOC + SHF_WRITE;
5519     }
5520
5521   return _bfd_elf_tls_setup (obfd, info);
5522 }
5523
5524 /* Return TRUE iff REL is a branch reloc with a global symbol matching
5525    HASH.  */
5526
5527 static bfd_boolean
5528 branch_reloc_hash_match (const bfd *ibfd,
5529                          const Elf_Internal_Rela *rel,
5530                          const struct elf_link_hash_entry *hash)
5531 {
5532   Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
5533   enum elf_ppc_reloc_type r_type = ELF32_R_TYPE (rel->r_info);
5534   unsigned int r_symndx = ELF32_R_SYM (rel->r_info);
5535
5536   if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
5537     {
5538       struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
5539       struct elf_link_hash_entry *h;
5540
5541       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5542       while (h->root.type == bfd_link_hash_indirect
5543              || h->root.type == bfd_link_hash_warning)
5544         h = (struct elf_link_hash_entry *) h->root.u.i.link;
5545       if (h == hash)
5546         return TRUE;
5547     }
5548   return FALSE;
5549 }
5550
5551 /* Run through all the TLS relocs looking for optimization
5552    opportunities.  */
5553
5554 bfd_boolean
5555 ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
5556                       struct bfd_link_info *info)
5557 {
5558   bfd *ibfd;
5559   asection *sec;
5560   struct ppc_elf_link_hash_table *htab;
5561   int pass;
5562
5563   if (!bfd_link_executable (info))
5564     return TRUE;
5565
5566   htab = ppc_elf_hash_table (info);
5567   if (htab == NULL)
5568     return FALSE;
5569
5570   /* Make two passes through the relocs.  First time check that tls
5571      relocs involved in setting up a tls_get_addr call are indeed
5572      followed by such a call.  If they are not, don't do any tls
5573      optimization.  On the second pass twiddle tls_mask flags to
5574      notify relocate_section that optimization can be done, and
5575      adjust got and plt refcounts.  */
5576   for (pass = 0; pass < 2; ++pass)
5577     for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
5578       {
5579         Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
5580         asection *got2 = bfd_get_section_by_name (ibfd, ".got2");
5581
5582         for (sec = ibfd->sections; sec != NULL; sec = sec->next)
5583           if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
5584             {
5585               Elf_Internal_Rela *relstart, *rel, *relend;
5586               int expecting_tls_get_addr = 0;
5587
5588               /* Read the relocations.  */
5589               relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
5590                                                     info->keep_memory);
5591               if (relstart == NULL)
5592                 return FALSE;
5593
5594               relend = relstart + sec->reloc_count;
5595               for (rel = relstart; rel < relend; rel++)
5596                 {
5597                   enum elf_ppc_reloc_type r_type;
5598                   unsigned long r_symndx;
5599                   struct elf_link_hash_entry *h = NULL;
5600                   unsigned char *tls_mask;
5601                   unsigned char tls_set, tls_clear;
5602                   bfd_boolean is_local;
5603                   bfd_signed_vma *got_count;
5604
5605                   r_symndx = ELF32_R_SYM (rel->r_info);
5606                   if (r_symndx >= symtab_hdr->sh_info)
5607                     {
5608                       struct elf_link_hash_entry **sym_hashes;
5609
5610                       sym_hashes = elf_sym_hashes (ibfd);
5611                       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5612                       while (h->root.type == bfd_link_hash_indirect
5613                              || h->root.type == bfd_link_hash_warning)
5614                         h = (struct elf_link_hash_entry *) h->root.u.i.link;
5615                     }
5616
5617                   is_local = FALSE;
5618                   if (h == NULL
5619                       || !h->def_dynamic)
5620                     is_local = TRUE;
5621
5622                   r_type = ELF32_R_TYPE (rel->r_info);
5623                   /* If this section has old-style __tls_get_addr calls
5624                      without marker relocs, then check that each
5625                      __tls_get_addr call reloc is preceded by a reloc
5626                      that conceivably belongs to the __tls_get_addr arg
5627                      setup insn.  If we don't find matching arg setup
5628                      relocs, don't do any tls optimization.  */
5629                   if (pass == 0
5630                       && sec->has_tls_get_addr_call
5631                       && h != NULL
5632                       && h == htab->tls_get_addr
5633                       && !expecting_tls_get_addr
5634                       && is_branch_reloc (r_type))
5635                     {
5636                       info->callbacks->minfo ("%H __tls_get_addr lost arg, "
5637                                               "TLS optimization disabled\n",
5638                                               ibfd, sec, rel->r_offset);
5639                       if (elf_section_data (sec)->relocs != relstart)
5640                         free (relstart);
5641                       return TRUE;
5642                     }
5643
5644                   expecting_tls_get_addr = 0;
5645                   switch (r_type)
5646                     {
5647                     case R_PPC_GOT_TLSLD16:
5648                     case R_PPC_GOT_TLSLD16_LO:
5649                       expecting_tls_get_addr = 1;
5650                       /* Fall through.  */
5651
5652                     case R_PPC_GOT_TLSLD16_HI:
5653                     case R_PPC_GOT_TLSLD16_HA:
5654                       /* These relocs should never be against a symbol
5655                          defined in a shared lib.  Leave them alone if
5656                          that turns out to be the case.  */
5657                       if (!is_local)
5658                         continue;
5659
5660                       /* LD -> LE */
5661                       tls_set = 0;
5662                       tls_clear = TLS_LD;
5663                       break;
5664
5665                     case R_PPC_GOT_TLSGD16:
5666                     case R_PPC_GOT_TLSGD16_LO:
5667                       expecting_tls_get_addr = 1;
5668                       /* Fall through.  */
5669
5670                     case R_PPC_GOT_TLSGD16_HI:
5671                     case R_PPC_GOT_TLSGD16_HA:
5672                       if (is_local)
5673                         /* GD -> LE */
5674                         tls_set = 0;
5675                       else
5676                         /* GD -> IE */
5677                         tls_set = TLS_TLS | TLS_TPRELGD;
5678                       tls_clear = TLS_GD;
5679                       break;
5680
5681                     case R_PPC_GOT_TPREL16:
5682                     case R_PPC_GOT_TPREL16_LO:
5683                     case R_PPC_GOT_TPREL16_HI:
5684                     case R_PPC_GOT_TPREL16_HA:
5685                       if (is_local)
5686                         {
5687                           /* IE -> LE */
5688                           tls_set = 0;
5689                           tls_clear = TLS_TPREL;
5690                           break;
5691                         }
5692                       else
5693                         continue;
5694
5695                     case R_PPC_TLSGD:
5696                     case R_PPC_TLSLD:
5697                       if (rel + 1 < relend
5698                           && is_plt_seq_reloc (ELF32_R_TYPE (rel[1].r_info)))
5699                         {
5700                           if (pass != 0
5701                               && ELF32_R_TYPE (rel[1].r_info) != R_PPC_PLTSEQ)
5702                             {
5703                               r_type = ELF32_R_TYPE (rel[1].r_info);
5704                               r_symndx = ELF32_R_SYM (rel[1].r_info);
5705                               if (r_symndx >= symtab_hdr->sh_info)
5706                                 {
5707                                   struct elf_link_hash_entry **sym_hashes;
5708
5709                                   sym_hashes = elf_sym_hashes (ibfd);
5710                                   h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5711                                   while (h->root.type == bfd_link_hash_indirect
5712                                          || h->root.type == bfd_link_hash_warning)
5713                                     h = (struct elf_link_hash_entry *) h->root.u.i.link;
5714                                   if (h != NULL)
5715                                     {
5716                                       struct plt_entry *ent = NULL;
5717                                       bfd_vma addend = 0;
5718
5719                                       if (bfd_link_pic (info))
5720                                         addend = rel->r_addend;
5721                                       ent = find_plt_ent (&h->plt.plist,
5722                                                           got2, addend);
5723                                       if (ent != NULL
5724                                           && ent->plt.refcount > 0)
5725                                         ent->plt.refcount -= 1;
5726                                     }
5727                                 }
5728                             }
5729                           continue;
5730                         }
5731                       expecting_tls_get_addr = 2;
5732                       tls_set = 0;
5733                       tls_clear = 0;
5734                       break;
5735
5736                     default:
5737                       continue;
5738                     }
5739
5740                   if (pass == 0)
5741                     {
5742                       if (!expecting_tls_get_addr
5743                           || !sec->has_tls_get_addr_call)
5744                         continue;
5745
5746                       if (rel + 1 < relend
5747                           && branch_reloc_hash_match (ibfd, rel + 1,
5748                                                       htab->tls_get_addr))
5749                         continue;
5750
5751                       /* Uh oh, we didn't find the expected call.  We
5752                          could just mark this symbol to exclude it
5753                          from tls optimization but it's safer to skip
5754                          the entire optimization.  */
5755                       info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
5756                                                 "TLS optimization disabled\n"),
5757                                               ibfd, sec, rel->r_offset);
5758                       if (elf_section_data (sec)->relocs != relstart)
5759                         free (relstart);
5760                       return TRUE;
5761                     }
5762
5763                   if (h != NULL)
5764                     {
5765                       tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
5766                       got_count = &h->got.refcount;
5767                     }
5768                   else
5769                     {
5770                       bfd_signed_vma *lgot_refs;
5771                       struct plt_entry **local_plt;
5772                       unsigned char *lgot_masks;
5773
5774                       lgot_refs = elf_local_got_refcounts (ibfd);
5775                       if (lgot_refs == NULL)
5776                         abort ();
5777                       local_plt = (struct plt_entry **)
5778                         (lgot_refs + symtab_hdr->sh_info);
5779                       lgot_masks = (unsigned char *)
5780                         (local_plt + symtab_hdr->sh_info);
5781                       tls_mask = &lgot_masks[r_symndx];
5782                       got_count = &lgot_refs[r_symndx];
5783                     }
5784
5785                   /* If we don't have old-style __tls_get_addr calls
5786                      without TLSGD/TLSLD marker relocs, and we haven't
5787                      found a new-style __tls_get_addr call with a
5788                      marker for this symbol, then we either have a
5789                      broken object file or an -mlongcall style
5790                      indirect call to __tls_get_addr without a marker.
5791                      Disable optimization in this case.  */
5792                   if ((tls_clear & (TLS_GD | TLS_LD)) != 0
5793                       && !sec->has_tls_get_addr_call
5794                       && ((*tls_mask & (TLS_TLS | TLS_MARK))
5795                           != (TLS_TLS | TLS_MARK)))
5796                     continue;
5797
5798                   if (expecting_tls_get_addr)
5799                     {
5800                       struct plt_entry *ent;
5801                       bfd_vma addend = 0;
5802
5803                       if (bfd_link_pic (info)
5804                           && (ELF32_R_TYPE (rel[1].r_info) == R_PPC_PLTREL24
5805                               || ELF32_R_TYPE (rel[1].r_info) == R_PPC_PLTCALL))
5806                         addend = rel[1].r_addend;
5807                       ent = find_plt_ent (&htab->tls_get_addr->plt.plist,
5808                                           got2, addend);
5809                       if (ent != NULL && ent->plt.refcount > 0)
5810                         ent->plt.refcount -= 1;
5811
5812                       if (expecting_tls_get_addr == 2)
5813                         continue;
5814                     }
5815
5816                   if (tls_set == 0)
5817                     {
5818                       /* We managed to get rid of a got entry.  */
5819                       if (*got_count > 0)
5820                         *got_count -= 1;
5821                     }
5822
5823                   *tls_mask |= tls_set;
5824                   *tls_mask &= ~tls_clear;
5825                 }
5826
5827               if (elf_section_data (sec)->relocs != relstart)
5828                 free (relstart);
5829             }
5830       }
5831   htab->do_tls_opt = 1;
5832   return TRUE;
5833 }
5834 \f
5835 /* Find dynamic relocs for H that apply to read-only sections.  */
5836
5837 static asection *
5838 readonly_dynrelocs (struct elf_link_hash_entry *h)
5839 {
5840   struct elf_dyn_relocs *p;
5841
5842   for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
5843     {
5844       asection *s = p->sec->output_section;
5845
5846       if (s != NULL && (s->flags & SEC_READONLY) != 0)
5847         return p->sec;
5848     }
5849   return NULL;
5850 }
5851
5852 /* Return true if we have dynamic relocs against H or any of its weak
5853    aliases, that apply to read-only sections.  Cannot be used after
5854    size_dynamic_sections.  */
5855
5856 static bfd_boolean
5857 alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
5858 {
5859   struct ppc_elf_link_hash_entry *eh = ppc_elf_hash_entry (h);
5860   do
5861     {
5862       if (readonly_dynrelocs (&eh->elf))
5863         return TRUE;
5864       eh = ppc_elf_hash_entry (eh->elf.u.alias);
5865     } while (eh != NULL && &eh->elf != h);
5866
5867   return FALSE;
5868 }
5869
5870 /* Return whether H has pc-relative dynamic relocs.  */
5871
5872 static bfd_boolean
5873 pc_dynrelocs (struct elf_link_hash_entry *h)
5874 {
5875   struct elf_dyn_relocs *p;
5876
5877   for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
5878     if (p->pc_count != 0)
5879       return TRUE;
5880   return FALSE;
5881 }
5882
5883 /* Adjust a symbol defined by a dynamic object and referenced by a
5884    regular object.  The current definition is in some section of the
5885    dynamic object, but we're not including those sections.  We have to
5886    change the definition to something the rest of the link can
5887    understand.  */
5888
5889 static bfd_boolean
5890 ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
5891                                struct elf_link_hash_entry *h)
5892 {
5893   struct ppc_elf_link_hash_table *htab;
5894   asection *s;
5895
5896 #ifdef DEBUG
5897   fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
5898            h->root.root.string);
5899 #endif
5900
5901   /* Make sure we know what is going on here.  */
5902   htab = ppc_elf_hash_table (info);
5903   BFD_ASSERT (htab->elf.dynobj != NULL
5904               && (h->needs_plt
5905                   || h->type == STT_GNU_IFUNC
5906                   || h->is_weakalias
5907                   || (h->def_dynamic
5908                       && h->ref_regular
5909                       && !h->def_regular)));
5910
5911   /* Deal with function syms.  */
5912   if (h->type == STT_FUNC
5913       || h->type == STT_GNU_IFUNC
5914       || h->needs_plt)
5915     {
5916       bfd_boolean local = (SYMBOL_CALLS_LOCAL (info, h)
5917                            || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
5918       /* Discard dyn_relocs when non-pic if we've decided that a
5919          function symbol is local.  */
5920       if (!bfd_link_pic (info) && local)
5921         ppc_elf_hash_entry (h)->dyn_relocs = NULL;
5922
5923       /* Clear procedure linkage table information for any symbol that
5924          won't need a .plt entry.  */
5925       struct plt_entry *ent;
5926       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5927         if (ent->plt.refcount > 0)
5928           break;
5929       if (ent == NULL
5930           || (h->type != STT_GNU_IFUNC
5931               && local
5932               && (htab->can_convert_all_inline_plt
5933                   || (ppc_elf_hash_entry (h)->tls_mask
5934                       & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)))
5935         {
5936           /* A PLT entry is not required/allowed when:
5937
5938              1. We are not using ld.so; because then the PLT entry
5939              can't be set up, so we can't use one.  In this case,
5940              ppc_elf_adjust_dynamic_symbol won't even be called.
5941
5942              2. GC has rendered the entry unused.
5943
5944              3. We know for certain that a call to this symbol
5945              will go to this object, or will remain undefined.  */
5946           h->plt.plist = NULL;
5947           h->needs_plt = 0;
5948           h->pointer_equality_needed = 0;
5949         }
5950       else
5951         {
5952           /* Taking a function's address in a read/write section
5953              doesn't require us to define the function symbol in the
5954              executable on a plt call stub.  A dynamic reloc can
5955              be used instead, giving better runtime performance.
5956              (Calls via that function pointer don't need to bounce
5957              through the plt call stub.)  Similarly, use a dynamic
5958              reloc for a weak reference when possible, allowing the
5959              resolution of the symbol to be set at load time rather
5960              than link time.  */
5961           if ((h->pointer_equality_needed
5962                || (h->non_got_ref
5963                    && !h->ref_regular_nonweak
5964                    && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)))
5965               && !htab->is_vxworks
5966               && !ppc_elf_hash_entry (h)->has_sda_refs
5967               && !readonly_dynrelocs (h))
5968             {
5969               h->pointer_equality_needed = 0;
5970               /* If we haven't seen a branch reloc and the symbol
5971                  isn't an ifunc then we don't need a plt entry.  */
5972               if (!h->needs_plt && h->type != STT_GNU_IFUNC)
5973                 h->plt.plist = NULL;
5974             }
5975           else if (!bfd_link_pic (info))
5976             /* We are going to be defining the function symbol on the
5977                plt stub, so no dyn_relocs needed when non-pic.  */
5978             ppc_elf_hash_entry (h)->dyn_relocs = NULL;
5979         }
5980       h->protected_def = 0;
5981       /* Function symbols can't have copy relocs.  */
5982       return TRUE;
5983     }
5984   else
5985     h->plt.plist = NULL;
5986
5987   /* If this is a weak symbol, and there is a real definition, the
5988      processor independent code will have arranged for us to see the
5989      real definition first, and we can just use the same value.  */
5990   if (h->is_weakalias)
5991     {
5992       struct elf_link_hash_entry *def = weakdef (h);
5993       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
5994       h->root.u.def.section = def->root.u.def.section;
5995       h->root.u.def.value = def->root.u.def.value;
5996       if (def->root.u.def.section == htab->elf.sdynbss
5997           || def->root.u.def.section == htab->elf.sdynrelro
5998           || def->root.u.def.section == htab->dynsbss)
5999         ppc_elf_hash_entry (h)->dyn_relocs = NULL;
6000       return TRUE;
6001     }
6002
6003   /* This is a reference to a symbol defined by a dynamic object which
6004      is not a function.  */
6005
6006   /* If we are creating a shared library, we must presume that the
6007      only references to the symbol are via the global offset table.
6008      For such cases we need not do anything here; the relocations will
6009      be handled correctly by relocate_section.  */
6010   if (bfd_link_pic (info))
6011     {
6012       h->protected_def = 0;
6013       return TRUE;
6014     }
6015
6016   /* If there are no references to this symbol that do not use the
6017      GOT, we don't need to generate a copy reloc.  */
6018   if (!h->non_got_ref)
6019     {
6020       h->protected_def = 0;
6021       return TRUE;
6022     }
6023
6024   /* Protected variables do not work with .dynbss.  The copy in
6025      .dynbss won't be used by the shared library with the protected
6026      definition for the variable.  Editing to PIC, or text relocations
6027      are preferable to an incorrect program.  */
6028   if (h->protected_def)
6029     {
6030       if (ELIMINATE_COPY_RELOCS
6031           && ppc_elf_hash_entry (h)->has_addr16_ha
6032           && ppc_elf_hash_entry (h)->has_addr16_lo
6033           && htab->params->pic_fixup == 0
6034           && info->disable_target_specific_optimizations <= 1)
6035         htab->params->pic_fixup = 1;
6036       return TRUE;
6037     }
6038
6039   /* If -z nocopyreloc was given, we won't generate them either.  */
6040   if (info->nocopyreloc)
6041     return TRUE;
6042
6043    /* If we don't find any dynamic relocs in read-only sections, then
6044       we'll be keeping the dynamic relocs and avoiding the copy reloc.
6045       We can't do this if there are any small data relocations.  This
6046       doesn't work on VxWorks, where we can not have dynamic
6047       relocations (other than copy and jump slot relocations) in an
6048       executable.  */
6049   if (ELIMINATE_COPY_RELOCS
6050       && !ppc_elf_hash_entry (h)->has_sda_refs
6051       && !htab->is_vxworks
6052       && !h->def_regular
6053       && !alias_readonly_dynrelocs (h))
6054     return TRUE;
6055
6056   /* We must allocate the symbol in our .dynbss section, which will
6057      become part of the .bss section of the executable.  There will be
6058      an entry for this symbol in the .dynsym section.  The dynamic
6059      object will contain position independent code, so all references
6060      from the dynamic object to this symbol will go through the global
6061      offset table.  The dynamic linker will use the .dynsym entry to
6062      determine the address it must put in the global offset table, so
6063      both the dynamic object and the regular object will refer to the
6064      same memory location for the variable.
6065
6066      Of course, if the symbol is referenced using SDAREL relocs, we
6067      must instead allocate it in .sbss.  */
6068   if (ppc_elf_hash_entry (h)->has_sda_refs)
6069     s = htab->dynsbss;
6070   else if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
6071     s = htab->elf.sdynrelro;
6072   else
6073     s = htab->elf.sdynbss;
6074   BFD_ASSERT (s != NULL);
6075
6076   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
6077     {
6078       asection *srel;
6079
6080       /* We must generate a R_PPC_COPY reloc to tell the dynamic
6081          linker to copy the initial value out of the dynamic object
6082          and into the runtime process image.  */
6083       if (ppc_elf_hash_entry (h)->has_sda_refs)
6084         srel = htab->relsbss;
6085       else if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
6086         srel = htab->elf.sreldynrelro;
6087       else
6088         srel = htab->elf.srelbss;
6089       BFD_ASSERT (srel != NULL);
6090       srel->size += sizeof (Elf32_External_Rela);
6091       h->needs_copy = 1;
6092     }
6093
6094   /* We no longer want dyn_relocs.  */
6095   ppc_elf_hash_entry (h)->dyn_relocs = NULL;
6096   return _bfd_elf_adjust_dynamic_copy (info, h, s);
6097 }
6098 \f
6099 /* Generate a symbol to mark plt call stubs.  For non-PIC code the sym is
6100    xxxxxxxx.plt_call32.<callee> where xxxxxxxx is a hex number, usually 0,
6101    specifying the addend on the plt relocation.  For -fpic code, the sym
6102    is xxxxxxxx.plt_pic32.<callee>, and for -fPIC
6103    xxxxxxxx.got2.plt_pic32.<callee>.  */
6104
6105 static bfd_boolean
6106 add_stub_sym (struct plt_entry *ent,
6107               struct elf_link_hash_entry *h,
6108               struct bfd_link_info *info)
6109 {
6110   struct elf_link_hash_entry *sh;
6111   size_t len1, len2, len3;
6112   char *name;
6113   const char *stub;
6114   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
6115
6116   if (bfd_link_pic (info))
6117     stub = ".plt_pic32.";
6118   else
6119     stub = ".plt_call32.";
6120
6121   len1 = strlen (h->root.root.string);
6122   len2 = strlen (stub);
6123   len3 = 0;
6124   if (ent->sec)
6125     len3 = strlen (ent->sec->name);
6126   name = bfd_malloc (len1 + len2 + len3 + 9);
6127   if (name == NULL)
6128     return FALSE;
6129   sprintf (name, "%08x", (unsigned) ent->addend & 0xffffffff);
6130   if (ent->sec)
6131     memcpy (name + 8, ent->sec->name, len3);
6132   memcpy (name + 8 + len3, stub, len2);
6133   memcpy (name + 8 + len3 + len2, h->root.root.string, len1 + 1);
6134   sh = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
6135   if (sh == NULL)
6136     return FALSE;
6137   if (sh->root.type == bfd_link_hash_new)
6138     {
6139       sh->root.type = bfd_link_hash_defined;
6140       sh->root.u.def.section = htab->glink;
6141       sh->root.u.def.value = ent->glink_offset;
6142       sh->ref_regular = 1;
6143       sh->def_regular = 1;
6144       sh->ref_regular_nonweak = 1;
6145       sh->forced_local = 1;
6146       sh->non_elf = 0;
6147       sh->root.linker_def = 1;
6148     }
6149   return TRUE;
6150 }
6151
6152 /* Allocate NEED contiguous space in .got, and return the offset.
6153    Handles allocation of the got header when crossing 32k.  */
6154
6155 static bfd_vma
6156 allocate_got (struct ppc_elf_link_hash_table *htab, unsigned int need)
6157 {
6158   bfd_vma where;
6159   unsigned int max_before_header;
6160
6161   if (htab->plt_type == PLT_VXWORKS)
6162     {
6163       where = htab->elf.sgot->size;
6164       htab->elf.sgot->size += need;
6165     }
6166   else
6167     {
6168       max_before_header = htab->plt_type == PLT_NEW ? 32768 : 32764;
6169       if (need <= htab->got_gap)
6170         {
6171           where = max_before_header - htab->got_gap;
6172           htab->got_gap -= need;
6173         }
6174       else
6175         {
6176           if (htab->elf.sgot->size + need > max_before_header
6177               && htab->elf.sgot->size <= max_before_header)
6178             {
6179               htab->got_gap = max_before_header - htab->elf.sgot->size;
6180               htab->elf.sgot->size = max_before_header + htab->got_header_size;
6181             }
6182           where = htab->elf.sgot->size;
6183           htab->elf.sgot->size += need;
6184         }
6185     }
6186   return where;
6187 }
6188
6189 /* Calculate size of GOT entries for symbol given its TLS_MASK.
6190    TLS_LD is excluded because those go in a special GOT slot.  */
6191
6192 static inline unsigned int
6193 got_entries_needed (int tls_mask)
6194 {
6195   unsigned int need;
6196   if ((tls_mask & TLS_TLS) == 0)
6197     need = 4;
6198   else
6199     {
6200       need = 0;
6201       if ((tls_mask & TLS_GD) != 0)
6202         need += 8;
6203       if ((tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
6204         need += 4;
6205       if ((tls_mask & TLS_DTPREL) != 0)
6206         need += 4;
6207     }
6208   return need;
6209 }
6210
6211 /* Calculate size of relocs needed for symbol given its TLS_MASK and
6212    NEEDed GOT entries.  KNOWN says a TPREL offset can be calculated at
6213    link time.  */
6214
6215 static inline unsigned int
6216 got_relocs_needed (int tls_mask, unsigned int need, bfd_boolean known)
6217 {
6218   /* All the entries we allocated need relocs.
6219      Except IE in executable with a local symbol.  We could also omit
6220      the DTPREL reloc on the second word of a GD entry under the same
6221      condition as that for IE, but ld.so needs to differentiate
6222      LD and GD entries.  */
6223   if (known && (tls_mask & TLS_TLS) != 0
6224       && (tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
6225     need -= 4;
6226   return need * sizeof (Elf32_External_Rela) / 4;
6227 }
6228
6229 /* If H is undefined, make it dynamic if that makes sense.  */
6230
6231 static bfd_boolean
6232 ensure_undef_dynamic (struct bfd_link_info *info,
6233                       struct elf_link_hash_entry *h)
6234 {
6235   struct elf_link_hash_table *htab = elf_hash_table (info);
6236
6237   if (htab->dynamic_sections_created
6238       && ((info->dynamic_undefined_weak != 0
6239            && h->root.type == bfd_link_hash_undefweak)
6240           || h->root.type == bfd_link_hash_undefined)
6241       && h->dynindx == -1
6242       && !h->forced_local
6243       && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
6244     return bfd_elf_link_record_dynamic_symbol (info, h);
6245   return TRUE;
6246 }
6247
6248 /* Allocate space in associated reloc sections for dynamic relocs.  */
6249
6250 static bfd_boolean
6251 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
6252 {
6253   struct bfd_link_info *info = inf;
6254   struct ppc_elf_link_hash_entry *eh;
6255   struct ppc_elf_link_hash_table *htab;
6256   struct elf_dyn_relocs *p;
6257   bfd_boolean dyn;
6258
6259   if (h->root.type == bfd_link_hash_indirect)
6260     return TRUE;
6261
6262   htab = ppc_elf_hash_table (info);
6263   eh = (struct ppc_elf_link_hash_entry *) h;
6264   if (eh->elf.got.refcount > 0
6265       || (ELIMINATE_COPY_RELOCS
6266           && !eh->elf.def_regular
6267           && eh->elf.protected_def
6268           && eh->has_addr16_ha
6269           && eh->has_addr16_lo
6270           && htab->params->pic_fixup > 0))
6271     {
6272       unsigned int need;
6273
6274       /* Make sure this symbol is output as a dynamic symbol.  */
6275       if (!ensure_undef_dynamic (info, &eh->elf))
6276         return FALSE;
6277
6278       need = 0;
6279       if ((eh->tls_mask & (TLS_TLS | TLS_LD)) == (TLS_TLS | TLS_LD))
6280         {
6281           if (!eh->elf.def_dynamic)
6282             /* We'll just use htab->tlsld_got.offset.  This should
6283                always be the case.  It's a little odd if we have
6284                a local dynamic reloc against a non-local symbol.  */
6285             htab->tlsld_got.refcount += 1;
6286           else
6287             need += 8;
6288         }
6289       need += got_entries_needed (eh->tls_mask);
6290       if (need == 0)
6291         eh->elf.got.offset = (bfd_vma) -1;
6292       else
6293         {
6294           eh->elf.got.offset = allocate_got (htab, need);
6295           if ((bfd_link_pic (info)
6296                || (htab->elf.dynamic_sections_created
6297                    && eh->elf.dynindx != -1
6298                    && !SYMBOL_REFERENCES_LOCAL (info, &eh->elf)))
6299               && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &eh->elf))
6300             {
6301               asection *rsec;
6302               bfd_boolean tprel_known = (bfd_link_executable (info)
6303                                          && SYMBOL_REFERENCES_LOCAL (info,
6304                                                                      &eh->elf));
6305
6306               need = got_relocs_needed (eh->tls_mask, need, tprel_known);
6307               if ((eh->tls_mask & (TLS_TLS | TLS_LD)) == (TLS_TLS | TLS_LD)
6308                   && eh->elf.def_dynamic)
6309                 need -= sizeof (Elf32_External_Rela);
6310               rsec = htab->elf.srelgot;
6311               if (eh->elf.type == STT_GNU_IFUNC)
6312                 rsec = htab->elf.irelplt;
6313               rsec->size += need;
6314             }
6315         }
6316     }
6317   else
6318     eh->elf.got.offset = (bfd_vma) -1;
6319
6320   /* If no dynamic sections we can't have dynamic relocs, except for
6321      IFUNCs which are handled even in static executables.  */
6322   if (!htab->elf.dynamic_sections_created
6323       && h->type != STT_GNU_IFUNC)
6324     eh->dyn_relocs = NULL;
6325
6326   /* Discard relocs on undefined symbols that must be local.  */
6327   else if (h->root.type == bfd_link_hash_undefined
6328            && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
6329     eh->dyn_relocs = NULL;
6330
6331   /* Also discard relocs on undefined weak syms with non-default
6332      visibility, or when dynamic_undefined_weak says so.  */
6333   else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
6334     eh->dyn_relocs = NULL;
6335
6336   if (eh->dyn_relocs == NULL)
6337     ;
6338
6339   /* In the shared -Bsymbolic case, discard space allocated for
6340      dynamic pc-relative relocs against symbols which turn out to be
6341      defined in regular objects.  For the normal shared case, discard
6342      space for relocs that have become local due to symbol visibility
6343      changes.  */
6344   else if (bfd_link_pic (info))
6345     {
6346       /* Relocs that use pc_count are those that appear on a call insn,
6347          or certain REL relocs (see must_be_dyn_reloc) that can be
6348          generated via assembly.  We want calls to protected symbols to
6349          resolve directly to the function rather than going via the plt.
6350          If people want function pointer comparisons to work as expected
6351          then they should avoid writing weird assembly.  */
6352       if (SYMBOL_CALLS_LOCAL (info, h))
6353         {
6354           struct elf_dyn_relocs **pp;
6355
6356           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
6357             {
6358               p->count -= p->pc_count;
6359               p->pc_count = 0;
6360               if (p->count == 0)
6361                 *pp = p->next;
6362               else
6363                 pp = &p->next;
6364             }
6365         }
6366
6367       if (htab->is_vxworks)
6368         {
6369           struct elf_dyn_relocs **pp;
6370
6371           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
6372             {
6373               if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
6374                 *pp = p->next;
6375               else
6376                 pp = &p->next;
6377             }
6378         }
6379
6380       if (eh->dyn_relocs != NULL)
6381         {
6382           /* Make sure this symbol is output as a dynamic symbol.  */
6383           if (!ensure_undef_dynamic (info, h))
6384             return FALSE;
6385         }
6386     }
6387   else if (ELIMINATE_COPY_RELOCS)
6388     {
6389       /* For the non-pic case, discard space for relocs against
6390          symbols which turn out to need copy relocs or are not
6391          dynamic.  */
6392       if (h->dynamic_adjusted
6393           && !h->def_regular
6394           && !ELF_COMMON_DEF_P (h)
6395           && !(h->protected_def
6396                && eh->has_addr16_ha
6397                && eh->has_addr16_lo
6398                && htab->params->pic_fixup > 0))
6399         {
6400           /* Make sure this symbol is output as a dynamic symbol.  */
6401           if (!ensure_undef_dynamic (info, h))
6402             return FALSE;
6403
6404           if (h->dynindx == -1)
6405             eh->dyn_relocs = NULL;
6406         }
6407       else
6408         eh->dyn_relocs = NULL;
6409     }
6410
6411   /* Allocate space.  */
6412   for (p = eh->dyn_relocs; p != NULL; p = p->next)
6413     {
6414       asection *sreloc = elf_section_data (p->sec)->sreloc;
6415       if (eh->elf.type == STT_GNU_IFUNC)
6416         sreloc = htab->elf.irelplt;
6417       sreloc->size += p->count * sizeof (Elf32_External_Rela);
6418     }
6419
6420   /* Handle PLT relocs.  Done last, after dynindx has settled.
6421      We might need a PLT entry when the symbol
6422      a) is dynamic, or
6423      b) is an ifunc, or
6424      c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
6425      d) has plt16 relocs and we are linking statically.  */
6426   dyn = htab->elf.dynamic_sections_created && h->dynindx != -1;
6427   if (dyn
6428       || h->type == STT_GNU_IFUNC
6429       || (h->needs_plt && h->dynamic_adjusted)
6430       || (h->needs_plt
6431           && h->def_regular
6432           && !htab->elf.dynamic_sections_created
6433           && !htab->can_convert_all_inline_plt
6434           && (ppc_elf_hash_entry (h)->tls_mask
6435               & (TLS_TLS | PLT_KEEP)) == PLT_KEEP))
6436     {
6437       struct plt_entry *ent;
6438       bfd_boolean doneone = FALSE;
6439       bfd_vma plt_offset = 0, glink_offset = (bfd_vma) -1;
6440
6441       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6442         if (ent->plt.refcount > 0)
6443           {
6444             asection *s = htab->elf.splt;
6445
6446             if (!dyn)
6447               {
6448                 if (h->type == STT_GNU_IFUNC)
6449                   s = htab->elf.iplt;
6450                 else
6451                   s = htab->pltlocal;
6452               }
6453
6454             if (htab->plt_type == PLT_NEW || !dyn)
6455               {
6456                 if (!doneone)
6457                   {
6458                     plt_offset = s->size;
6459                     s->size += 4;
6460                   }
6461                 ent->plt.offset = plt_offset;
6462
6463                 if (s == htab->pltlocal)
6464                   ent->glink_offset = glink_offset;
6465                 else
6466                   {
6467                     s = htab->glink;
6468                     if (!doneone || bfd_link_pic (info))
6469                       {
6470                         glink_offset = s->size;
6471                         s->size += GLINK_ENTRY_SIZE (htab, h);
6472                       }
6473                     if (!doneone
6474                         && !bfd_link_pic (info)
6475                         && h->def_dynamic
6476                         && !h->def_regular)
6477                       {
6478                         h->root.u.def.section = s;
6479                         h->root.u.def.value = glink_offset;
6480                       }
6481                     ent->glink_offset = glink_offset;
6482
6483                     if (htab->params->emit_stub_syms
6484                         && !add_stub_sym (ent, h, info))
6485                       return FALSE;
6486                   }
6487               }
6488             else
6489               {
6490                 if (!doneone)
6491                   {
6492                     /* If this is the first .plt entry, make room
6493                        for the special first entry.  */
6494                     if (s->size == 0)
6495                       s->size += htab->plt_initial_entry_size;
6496
6497                     /* The PowerPC PLT is actually composed of two
6498                        parts, the first part is 2 words (for a load
6499                        and a jump), and then there is a remaining
6500                        word available at the end.  */
6501                     plt_offset = (htab->plt_initial_entry_size
6502                                   + (htab->plt_slot_size
6503                                      * ((s->size
6504                                          - htab->plt_initial_entry_size)
6505                                         / htab->plt_entry_size)));
6506
6507                     /* If this symbol is not defined in a regular
6508                        file, and we are not generating a shared
6509                        library, then set the symbol to this location
6510                        in the .plt.  This is to avoid text
6511                        relocations, and is required to make
6512                        function pointers compare as equal between
6513                        the normal executable and the shared library.  */
6514                     if (! bfd_link_pic (info)
6515                         && h->def_dynamic
6516                         && !h->def_regular)
6517                       {
6518                         h->root.u.def.section = s;
6519                         h->root.u.def.value = plt_offset;
6520                       }
6521
6522                     /* Make room for this entry.  */
6523                     s->size += htab->plt_entry_size;
6524                     /* After the 8192nd entry, room for two entries
6525                        is allocated.  */
6526                     if (htab->plt_type == PLT_OLD
6527                         && (s->size - htab->plt_initial_entry_size)
6528                         / htab->plt_entry_size
6529                         > PLT_NUM_SINGLE_ENTRIES)
6530                       s->size += htab->plt_entry_size;
6531                   }
6532                 ent->plt.offset = plt_offset;
6533               }
6534
6535             /* We also need to make an entry in the .rela.plt section.  */
6536             if (!doneone)
6537               {
6538                 if (!dyn)
6539                   {
6540                     if (h->type == STT_GNU_IFUNC)
6541                       {
6542                         s = htab->elf.irelplt;
6543                         s->size += sizeof (Elf32_External_Rela);
6544                       }
6545                     else if (bfd_link_pic (info))
6546                       {
6547                         s = htab->relpltlocal;
6548                         s->size += sizeof (Elf32_External_Rela);
6549                       }
6550                   }
6551                 else
6552                   {
6553                     htab->elf.srelplt->size += sizeof (Elf32_External_Rela);
6554
6555                     if (htab->plt_type == PLT_VXWORKS)
6556                       {
6557                         /* Allocate space for the unloaded relocations.  */
6558                         if (!bfd_link_pic (info)
6559                             && htab->elf.dynamic_sections_created)
6560                           {
6561                             if (ent->plt.offset
6562                                 == (bfd_vma) htab->plt_initial_entry_size)
6563                               {
6564                                 htab->srelplt2->size
6565                                   += (sizeof (Elf32_External_Rela)
6566                                       * VXWORKS_PLTRESOLVE_RELOCS);
6567                               }
6568
6569                             htab->srelplt2->size
6570                               += (sizeof (Elf32_External_Rela)
6571                                   * VXWORKS_PLT_NON_JMP_SLOT_RELOCS);
6572                           }
6573
6574                         /* Every PLT entry has an associated GOT entry in
6575                            .got.plt.  */
6576                         htab->elf.sgotplt->size += 4;
6577                       }
6578                   }
6579                 doneone = TRUE;
6580               }
6581           }
6582         else
6583           ent->plt.offset = (bfd_vma) -1;
6584
6585       if (!doneone)
6586         {
6587           h->plt.plist = NULL;
6588           h->needs_plt = 0;
6589         }
6590     }
6591   else
6592     {
6593       h->plt.plist = NULL;
6594       h->needs_plt = 0;
6595     }
6596
6597   return TRUE;
6598 }
6599
6600 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
6601    read-only sections.  */
6602
6603 static bfd_boolean
6604 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
6605 {
6606   asection *sec;
6607
6608   if (h->root.type == bfd_link_hash_indirect)
6609     return TRUE;
6610
6611   sec = readonly_dynrelocs (h);
6612   if (sec != NULL)
6613     {
6614       struct bfd_link_info *info = (struct bfd_link_info *) info_p;
6615
6616       info->flags |= DF_TEXTREL;
6617       info->callbacks->minfo
6618         (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
6619          sec->owner, h->root.root.string, sec);
6620
6621       /* Not an error, just cut short the traversal.  */
6622       return FALSE;
6623     }
6624   return TRUE;
6625 }
6626
6627 static const unsigned char glink_eh_frame_cie[] =
6628 {
6629   0, 0, 0, 16,                          /* length.  */
6630   0, 0, 0, 0,                           /* id.  */
6631   1,                                    /* CIE version.  */
6632   'z', 'R', 0,                          /* Augmentation string.  */
6633   4,                                    /* Code alignment.  */
6634   0x7c,                                 /* Data alignment.  */
6635   65,                                   /* RA reg.  */
6636   1,                                    /* Augmentation size.  */
6637   DW_EH_PE_pcrel | DW_EH_PE_sdata4,     /* FDE encoding.  */
6638   DW_CFA_def_cfa, 1, 0                  /* def_cfa: r1 offset 0.  */
6639 };
6640
6641 /* Set the sizes of the dynamic sections.  */
6642
6643 static bfd_boolean
6644 ppc_elf_size_dynamic_sections (bfd *output_bfd,
6645                                struct bfd_link_info *info)
6646 {
6647   struct ppc_elf_link_hash_table *htab;
6648   asection *s;
6649   bfd_boolean relocs;
6650   bfd *ibfd;
6651
6652 #ifdef DEBUG
6653   fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
6654 #endif
6655
6656   htab = ppc_elf_hash_table (info);
6657   BFD_ASSERT (htab->elf.dynobj != NULL);
6658
6659   if (elf_hash_table (info)->dynamic_sections_created)
6660     {
6661       /* Set the contents of the .interp section to the interpreter.  */
6662       if (bfd_link_executable (info) && !info->nointerp)
6663         {
6664           s = bfd_get_linker_section (htab->elf.dynobj, ".interp");
6665           BFD_ASSERT (s != NULL);
6666           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
6667           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
6668         }
6669     }
6670
6671   if (htab->plt_type == PLT_OLD)
6672     htab->got_header_size = 16;
6673   else if (htab->plt_type == PLT_NEW)
6674     htab->got_header_size = 12;
6675
6676   /* Set up .got offsets for local syms, and space for local dynamic
6677      relocs.  */
6678   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
6679     {
6680       bfd_signed_vma *local_got;
6681       bfd_signed_vma *end_local_got;
6682       struct plt_entry **local_plt;
6683       struct plt_entry **end_local_plt;
6684       char *lgot_masks;
6685       bfd_size_type locsymcount;
6686       Elf_Internal_Shdr *symtab_hdr;
6687
6688       if (!is_ppc_elf (ibfd))
6689         continue;
6690
6691       for (s = ibfd->sections; s != NULL; s = s->next)
6692         {
6693           struct ppc_dyn_relocs *p;
6694
6695           for (p = ((struct ppc_dyn_relocs *)
6696                     elf_section_data (s)->local_dynrel);
6697                p != NULL;
6698                p = p->next)
6699             {
6700               if (!bfd_is_abs_section (p->sec)
6701                   && bfd_is_abs_section (p->sec->output_section))
6702                 {
6703                   /* Input section has been discarded, either because
6704                      it is a copy of a linkonce section or due to
6705                      linker script /DISCARD/, so we'll be discarding
6706                      the relocs too.  */
6707                 }
6708               else if (htab->is_vxworks
6709                        && strcmp (p->sec->output_section->name,
6710                                   ".tls_vars") == 0)
6711                 {
6712                   /* Relocations in vxworks .tls_vars sections are
6713                      handled specially by the loader.  */
6714                 }
6715               else if (p->count != 0)
6716                 {
6717                   asection *sreloc = elf_section_data (p->sec)->sreloc;
6718                   if (p->ifunc)
6719                     sreloc = htab->elf.irelplt;
6720                   sreloc->size += p->count * sizeof (Elf32_External_Rela);
6721                   if ((p->sec->output_section->flags
6722                        & (SEC_READONLY | SEC_ALLOC))
6723                       == (SEC_READONLY | SEC_ALLOC))
6724                     {
6725                       info->flags |= DF_TEXTREL;
6726                       info->callbacks->minfo (_("%pB: dynamic relocation in read-only section `%pA'\n"),
6727                                               p->sec->owner, p->sec);
6728                     }
6729                 }
6730             }
6731         }
6732
6733       local_got = elf_local_got_refcounts (ibfd);
6734       if (!local_got)
6735         continue;
6736
6737       symtab_hdr = &elf_symtab_hdr (ibfd);
6738       locsymcount = symtab_hdr->sh_info;
6739       end_local_got = local_got + locsymcount;
6740       local_plt = (struct plt_entry **) end_local_got;
6741       end_local_plt = local_plt + locsymcount;
6742       lgot_masks = (char *) end_local_plt;
6743
6744       for (; local_got < end_local_got; ++local_got, ++lgot_masks)
6745         if (*local_got > 0)
6746           {
6747             unsigned int need;
6748             if ((*lgot_masks & (TLS_TLS | TLS_LD)) == (TLS_TLS | TLS_LD))
6749               htab->tlsld_got.refcount += 1;
6750             need = got_entries_needed (*lgot_masks);
6751             if (need == 0)
6752               *local_got = (bfd_vma) -1;
6753             else
6754               {
6755                 *local_got = allocate_got (htab, need);
6756                 if (bfd_link_pic (info))
6757                   {
6758                     asection *srel;
6759                     bfd_boolean tprel_known = bfd_link_executable (info);
6760
6761                     need = got_relocs_needed (*lgot_masks, need, tprel_known);
6762                     srel = htab->elf.srelgot;
6763                     if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
6764                       srel = htab->elf.irelplt;
6765                     srel->size += need;
6766                   }
6767               }
6768           }
6769         else
6770           *local_got = (bfd_vma) -1;
6771
6772       if (htab->is_vxworks)
6773         continue;
6774
6775       /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt.  */
6776       lgot_masks = (char *) end_local_plt;
6777       for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks)
6778         {
6779           struct plt_entry *ent;
6780           bfd_boolean doneone = FALSE;
6781           bfd_vma plt_offset = 0, glink_offset = (bfd_vma) -1;
6782
6783           for (ent = *local_plt; ent != NULL; ent = ent->next)
6784             if (ent->plt.refcount > 0)
6785               {
6786                 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
6787                   s = htab->elf.iplt;
6788                 else if (htab->can_convert_all_inline_plt
6789                          || (*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)
6790                   {
6791                     ent->plt.offset = (bfd_vma) -1;
6792                     continue;
6793                   }
6794                 else
6795                   s = htab->pltlocal;
6796
6797                 if (!doneone)
6798                   {
6799                     plt_offset = s->size;
6800                     s->size += 4;
6801                   }
6802                 ent->plt.offset = plt_offset;
6803
6804                 if (s != htab->pltlocal && (!doneone || bfd_link_pic (info)))
6805                   {
6806                     s = htab->glink;
6807                     glink_offset = s->size;
6808                     s->size += GLINK_ENTRY_SIZE (htab, NULL);
6809                   }
6810                 ent->glink_offset = glink_offset;
6811
6812                 if (!doneone)
6813                   {
6814                     if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
6815                       {
6816                         s = htab->elf.irelplt;
6817                         s->size += sizeof (Elf32_External_Rela);
6818                       }
6819                     else if (bfd_link_pic (info))
6820                       {
6821                         s = htab->relpltlocal;
6822                         s->size += sizeof (Elf32_External_Rela);
6823                       }
6824                     doneone = TRUE;
6825                   }
6826               }
6827             else
6828               ent->plt.offset = (bfd_vma) -1;
6829         }
6830     }
6831
6832   /* Allocate space for global sym dynamic relocs.  */
6833   elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
6834
6835   if (htab->tlsld_got.refcount > 0)
6836     {
6837       htab->tlsld_got.offset = allocate_got (htab, 8);
6838       if (bfd_link_pic (info))
6839         htab->elf.srelgot->size += sizeof (Elf32_External_Rela);
6840     }
6841   else
6842     htab->tlsld_got.offset = (bfd_vma) -1;
6843
6844   if (htab->elf.sgot != NULL && htab->plt_type != PLT_VXWORKS)
6845     {
6846       unsigned int g_o_t = 32768;
6847
6848       /* If we haven't allocated the header, do so now.  When we get here,
6849          for old plt/got the got size will be 0 to 32764 (not allocated),
6850          or 32780 to 65536 (header allocated).  For new plt/got, the
6851          corresponding ranges are 0 to 32768 and 32780 to 65536.  */
6852       if (htab->elf.sgot->size <= 32768)
6853         {
6854           g_o_t = htab->elf.sgot->size;
6855           if (htab->plt_type == PLT_OLD)
6856             g_o_t += 4;
6857           htab->elf.sgot->size += htab->got_header_size;
6858         }
6859
6860       htab->elf.hgot->root.u.def.value = g_o_t;
6861     }
6862   if (bfd_link_pic (info))
6863     {
6864       struct elf_link_hash_entry *sda = htab->sdata[0].sym;
6865
6866       sda->root.u.def.section = htab->elf.hgot->root.u.def.section;
6867       sda->root.u.def.value = htab->elf.hgot->root.u.def.value;
6868     }
6869   if (info->emitrelocations)
6870     {
6871       struct elf_link_hash_entry *sda = htab->sdata[0].sym;
6872
6873       if (sda != NULL && sda->ref_regular)
6874         sda->root.u.def.section->flags |= SEC_KEEP;
6875       sda = htab->sdata[1].sym;
6876       if (sda != NULL && sda->ref_regular)
6877         sda->root.u.def.section->flags |= SEC_KEEP;
6878     }
6879
6880   if (htab->glink != NULL
6881       && htab->glink->size != 0
6882       && htab->elf.dynamic_sections_created)
6883     {
6884       htab->glink_pltresolve = htab->glink->size;
6885       /* Space for the branch table.  */
6886       htab->glink->size
6887         += htab->elf.srelplt->size / (sizeof (Elf32_External_Rela) / 4) - 4;
6888       /* Pad out to align the start of PLTresolve.  */
6889       htab->glink->size += -htab->glink->size & (htab->params->ppc476_workaround
6890                                                  ? 63 : 15);
6891       htab->glink->size += GLINK_PLTRESOLVE;
6892
6893       if (htab->params->emit_stub_syms)
6894         {
6895           struct elf_link_hash_entry *sh;
6896           sh = elf_link_hash_lookup (&htab->elf, "__glink",
6897                                      TRUE, FALSE, FALSE);
6898           if (sh == NULL)
6899             return FALSE;
6900           if (sh->root.type == bfd_link_hash_new)
6901             {
6902               sh->root.type = bfd_link_hash_defined;
6903               sh->root.u.def.section = htab->glink;
6904               sh->root.u.def.value = htab->glink_pltresolve;
6905               sh->ref_regular = 1;
6906               sh->def_regular = 1;
6907               sh->ref_regular_nonweak = 1;
6908               sh->forced_local = 1;
6909               sh->non_elf = 0;
6910               sh->root.linker_def = 1;
6911             }
6912           sh = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
6913                                      TRUE, FALSE, FALSE);
6914           if (sh == NULL)
6915             return FALSE;
6916           if (sh->root.type == bfd_link_hash_new)
6917             {
6918               sh->root.type = bfd_link_hash_defined;
6919               sh->root.u.def.section = htab->glink;
6920               sh->root.u.def.value = htab->glink->size - GLINK_PLTRESOLVE;
6921               sh->ref_regular = 1;
6922               sh->def_regular = 1;
6923               sh->ref_regular_nonweak = 1;
6924               sh->forced_local = 1;
6925               sh->non_elf = 0;
6926               sh->root.linker_def = 1;
6927             }
6928         }
6929     }
6930
6931   if (htab->glink != NULL
6932       && htab->glink->size != 0
6933       && htab->glink_eh_frame != NULL
6934       && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
6935       && _bfd_elf_eh_frame_present (info))
6936     {
6937       s = htab->glink_eh_frame;
6938       s->size = sizeof (glink_eh_frame_cie) + 20;
6939       if (bfd_link_pic (info))
6940         {
6941           s->size += 4;
6942           if (htab->glink->size - GLINK_PLTRESOLVE + 8 >= 256)
6943             s->size += 4;
6944         }
6945     }
6946
6947   /* We've now determined the sizes of the various dynamic sections.
6948      Allocate memory for them.  */
6949   relocs = FALSE;
6950   for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
6951     {
6952       bfd_boolean strip_section = TRUE;
6953
6954       if ((s->flags & SEC_LINKER_CREATED) == 0)
6955         continue;
6956
6957       if (s == htab->elf.splt
6958           || s == htab->elf.sgot)
6959         {
6960           /* We'd like to strip these sections if they aren't needed, but if
6961              we've exported dynamic symbols from them we must leave them.
6962              It's too late to tell BFD to get rid of the symbols.  */
6963           if (htab->elf.hplt != NULL)
6964             strip_section = FALSE;
6965           /* Strip this section if we don't need it; see the
6966              comment below.  */
6967         }
6968       else if (s == htab->elf.iplt
6969                || s == htab->pltlocal
6970                || s == htab->glink
6971                || s == htab->glink_eh_frame
6972                || s == htab->elf.sgotplt
6973                || s == htab->sbss
6974                || s == htab->elf.sdynbss
6975                || s == htab->elf.sdynrelro
6976                || s == htab->dynsbss)
6977         {
6978           /* Strip these too.  */
6979         }
6980       else if (s == htab->sdata[0].section
6981                || s == htab->sdata[1].section)
6982         {
6983           strip_section = (s->flags & SEC_KEEP) == 0;
6984         }
6985       else if (CONST_STRNEQ (bfd_get_section_name (htab->elf.dynobj, s),
6986                              ".rela"))
6987         {
6988           if (s->size != 0)
6989             {
6990               /* Remember whether there are any relocation sections.  */
6991               relocs = TRUE;
6992
6993               /* We use the reloc_count field as a counter if we need
6994                  to copy relocs into the output file.  */
6995               s->reloc_count = 0;
6996             }
6997         }
6998       else
6999         {
7000           /* It's not one of our sections, so don't allocate space.  */
7001           continue;
7002         }
7003
7004       if (s->size == 0 && strip_section)
7005         {
7006           /* If we don't need this section, strip it from the
7007              output file.  This is mostly to handle .rela.bss and
7008              .rela.plt.  We must create both sections in
7009              create_dynamic_sections, because they must be created
7010              before the linker maps input sections to output
7011              sections.  The linker does that before
7012              adjust_dynamic_symbol is called, and it is that
7013              function which decides whether anything needs to go
7014              into these sections.  */
7015           s->flags |= SEC_EXCLUDE;
7016           continue;
7017         }
7018
7019       if ((s->flags & SEC_HAS_CONTENTS) == 0)
7020         continue;
7021
7022       /* Allocate memory for the section contents.  */
7023       s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
7024       if (s->contents == NULL)
7025         return FALSE;
7026     }
7027
7028   if (htab->elf.dynamic_sections_created)
7029     {
7030       /* Add some entries to the .dynamic section.  We fill in the
7031          values later, in ppc_elf_finish_dynamic_sections, but we
7032          must add the entries now so that we get the correct size for
7033          the .dynamic section.  The DT_DEBUG entry is filled in by the
7034          dynamic linker and used by the debugger.  */
7035 #define add_dynamic_entry(TAG, VAL) \
7036   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
7037
7038       if (bfd_link_executable (info))
7039         {
7040           if (!add_dynamic_entry (DT_DEBUG, 0))
7041             return FALSE;
7042         }
7043
7044       if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
7045         {
7046           if (!add_dynamic_entry (DT_PLTGOT, 0)
7047               || !add_dynamic_entry (DT_PLTRELSZ, 0)
7048               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
7049               || !add_dynamic_entry (DT_JMPREL, 0))
7050             return FALSE;
7051         }
7052
7053       if (htab->plt_type == PLT_NEW
7054           && htab->glink != NULL
7055           && htab->glink->size != 0)
7056         {
7057           if (!add_dynamic_entry (DT_PPC_GOT, 0))
7058             return FALSE;
7059           if (!htab->params->no_tls_get_addr_opt
7060               && htab->tls_get_addr != NULL
7061               && htab->tls_get_addr->plt.plist != NULL
7062               && !add_dynamic_entry (DT_PPC_OPT, PPC_OPT_TLS))
7063             return FALSE;
7064         }
7065
7066       if (relocs)
7067         {
7068           if (!add_dynamic_entry (DT_RELA, 0)
7069               || !add_dynamic_entry (DT_RELASZ, 0)
7070               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
7071             return FALSE;
7072         }
7073
7074       /* If any dynamic relocs apply to a read-only section, then we
7075          need a DT_TEXTREL entry.  */
7076       if ((info->flags & DF_TEXTREL) == 0)
7077         elf_link_hash_traverse (elf_hash_table (info), maybe_set_textrel,
7078                                 info);
7079
7080       if ((info->flags & DF_TEXTREL) != 0)
7081         {
7082           if (!add_dynamic_entry (DT_TEXTREL, 0))
7083             return FALSE;
7084         }
7085       if (htab->is_vxworks
7086           && !elf_vxworks_add_dynamic_entries (output_bfd, info))
7087         return FALSE;
7088    }
7089 #undef add_dynamic_entry
7090
7091   if (htab->glink_eh_frame != NULL
7092       && htab->glink_eh_frame->contents != NULL)
7093     {
7094       unsigned char *p = htab->glink_eh_frame->contents;
7095       bfd_vma val;
7096
7097       memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
7098       /* CIE length (rewrite in case little-endian).  */
7099       bfd_put_32 (htab->elf.dynobj, sizeof (glink_eh_frame_cie) - 4, p);
7100       p += sizeof (glink_eh_frame_cie);
7101       /* FDE length.  */
7102       val = htab->glink_eh_frame->size - 4 - sizeof (glink_eh_frame_cie);
7103       bfd_put_32 (htab->elf.dynobj, val, p);
7104       p += 4;
7105       /* CIE pointer.  */
7106       val = p - htab->glink_eh_frame->contents;
7107       bfd_put_32 (htab->elf.dynobj, val, p);
7108       p += 4;
7109       /* Offset to .glink.  Set later.  */
7110       p += 4;
7111       /* .glink size.  */
7112       bfd_put_32 (htab->elf.dynobj, htab->glink->size, p);
7113       p += 4;
7114       /* Augmentation.  */
7115       p += 1;
7116
7117       if (bfd_link_pic (info)
7118           && htab->elf.dynamic_sections_created)
7119         {
7120           bfd_vma adv = (htab->glink->size - GLINK_PLTRESOLVE + 8) >> 2;
7121           if (adv < 64)
7122             *p++ = DW_CFA_advance_loc + adv;
7123           else if (adv < 256)
7124             {
7125               *p++ = DW_CFA_advance_loc1;
7126               *p++ = adv;
7127             }
7128           else if (adv < 65536)
7129             {
7130               *p++ = DW_CFA_advance_loc2;
7131               bfd_put_16 (htab->elf.dynobj, adv, p);
7132               p += 2;
7133             }
7134           else
7135             {
7136               *p++ = DW_CFA_advance_loc4;
7137               bfd_put_32 (htab->elf.dynobj, adv, p);
7138               p += 4;
7139             }
7140           *p++ = DW_CFA_register;
7141           *p++ = 65;
7142           p++;
7143           *p++ = DW_CFA_advance_loc + 4;
7144           *p++ = DW_CFA_restore_extended;
7145           *p++ = 65;
7146         }
7147       BFD_ASSERT ((bfd_vma) ((p + 3 - htab->glink_eh_frame->contents) & -4)
7148                   == htab->glink_eh_frame->size);
7149     }
7150
7151   return TRUE;
7152 }
7153
7154 /* Arrange to have _SDA_BASE_ or _SDA2_BASE_ stripped from the output
7155    if it looks like nothing is using them.  */
7156
7157 static void
7158 maybe_strip_sdasym (bfd *output_bfd, elf_linker_section_t *lsect)
7159 {
7160   struct elf_link_hash_entry *sda = lsect->sym;
7161
7162   if (sda != NULL && !sda->ref_regular && sda->dynindx == -1)
7163     {
7164       asection *s;
7165
7166       s = bfd_get_section_by_name (output_bfd, lsect->name);
7167       if (s == NULL || bfd_section_removed_from_list (output_bfd, s))
7168         {
7169           s = bfd_get_section_by_name (output_bfd, lsect->bss_name);
7170           if (s == NULL || bfd_section_removed_from_list (output_bfd, s))
7171             {
7172               sda->def_regular = 0;
7173               /* This is somewhat magic.  See elf_link_output_extsym.  */
7174               sda->ref_dynamic = 1;
7175               sda->forced_local = 0;
7176             }
7177         }
7178     }
7179 }
7180
7181 void
7182 ppc_elf_maybe_strip_sdata_syms (struct bfd_link_info *info)
7183 {
7184   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
7185
7186   if (htab != NULL)
7187     {
7188       maybe_strip_sdasym (info->output_bfd, &htab->sdata[0]);
7189       maybe_strip_sdasym (info->output_bfd, &htab->sdata[1]);
7190     }
7191 }
7192
7193
7194 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
7195
7196 static bfd_boolean
7197 ppc_elf_hash_symbol (struct elf_link_hash_entry *h)
7198 {
7199   if (h->plt.plist != NULL
7200       && !h->def_regular
7201       && (!h->pointer_equality_needed
7202           || !h->ref_regular_nonweak))
7203     return FALSE;
7204
7205   return _bfd_elf_hash_symbol (h);
7206 }
7207 \f
7208 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
7209
7210 /* Relaxation trampolines.  r12 is available for clobbering (r11, is
7211    used for some functions that are allowed to break the ABI).  */
7212 static const int shared_stub_entry[] =
7213   {
7214     0x7c0802a6, /* mflr 0 */
7215     0x429f0005, /* bcl 20, 31, .Lxxx */
7216     0x7d8802a6, /* mflr 12 */
7217     0x3d8c0000, /* addis 12, 12, (xxx-.Lxxx)@ha */
7218     0x398c0000, /* addi 12, 12, (xxx-.Lxxx)@l */
7219     0x7c0803a6, /* mtlr 0 */
7220     0x7d8903a6, /* mtctr 12 */
7221     0x4e800420, /* bctr */
7222   };
7223
7224 static const int stub_entry[] =
7225   {
7226     0x3d800000, /* lis 12,xxx@ha */
7227     0x398c0000, /* addi 12,12,xxx@l */
7228     0x7d8903a6, /* mtctr 12 */
7229     0x4e800420, /* bctr */
7230   };
7231
7232 struct ppc_elf_relax_info
7233 {
7234   unsigned int workaround_size;
7235   unsigned int picfixup_size;
7236 };
7237
7238 /* This function implements long branch trampolines, and the ppc476
7239    icache bug workaround.  Any section needing trampolines or patch
7240    space for the workaround has its size extended so that we can
7241    add trampolines at the end of the section.  */
7242
7243 static bfd_boolean
7244 ppc_elf_relax_section (bfd *abfd,
7245                        asection *isec,
7246                        struct bfd_link_info *link_info,
7247                        bfd_boolean *again)
7248 {
7249   struct one_branch_fixup
7250   {
7251     struct one_branch_fixup *next;
7252     asection *tsec;
7253     /* Final link, can use the symbol offset.  For a
7254        relocatable link we use the symbol's index.  */
7255     bfd_vma toff;
7256     bfd_vma trampoff;
7257   };
7258
7259   Elf_Internal_Shdr *symtab_hdr;
7260   bfd_byte *contents = NULL;
7261   Elf_Internal_Sym *isymbuf = NULL;
7262   Elf_Internal_Rela *internal_relocs = NULL;
7263   Elf_Internal_Rela *irel, *irelend = NULL;
7264   struct one_branch_fixup *branch_fixups = NULL;
7265   struct ppc_elf_relax_info *relax_info = NULL;
7266   unsigned changes = 0;
7267   bfd_boolean workaround_change;
7268   struct ppc_elf_link_hash_table *htab;
7269   bfd_size_type trampbase, trampoff, newsize, picfixup_size;
7270   asection *got2;
7271   bfd_boolean maybe_pasted;
7272
7273   *again = FALSE;
7274
7275   /* No need to do anything with non-alloc or non-code sections.  */
7276   if ((isec->flags & SEC_ALLOC) == 0
7277       || (isec->flags & SEC_CODE) == 0
7278       || (isec->flags & SEC_LINKER_CREATED) != 0
7279       || isec->size < 4)
7280     return TRUE;
7281
7282   /* We cannot represent the required PIC relocs in the output, so don't
7283      do anything.  The linker doesn't support mixing -shared and -r
7284      anyway.  */
7285   if (bfd_link_relocatable (link_info) && bfd_link_pic (link_info))
7286     return TRUE;
7287
7288   htab = ppc_elf_hash_table (link_info);
7289   if (htab == NULL)
7290     return TRUE;
7291
7292   isec->size = (isec->size + 3) & -4;
7293   if (isec->rawsize == 0)
7294     isec->rawsize = isec->size;
7295   trampbase = isec->size;
7296
7297   BFD_ASSERT (isec->sec_info_type == SEC_INFO_TYPE_NONE
7298               || isec->sec_info_type == SEC_INFO_TYPE_TARGET);
7299   isec->sec_info_type = SEC_INFO_TYPE_TARGET;
7300
7301   if (htab->params->ppc476_workaround
7302       || htab->params->pic_fixup > 0)
7303     {
7304       if (elf_section_data (isec)->sec_info == NULL)
7305         {
7306           elf_section_data (isec)->sec_info
7307             = bfd_zalloc (abfd, sizeof (struct ppc_elf_relax_info));
7308           if (elf_section_data (isec)->sec_info == NULL)
7309             return FALSE;
7310         }
7311       relax_info = elf_section_data (isec)->sec_info;
7312       trampbase -= relax_info->workaround_size;
7313     }
7314
7315   maybe_pasted = (strcmp (isec->output_section->name, ".init") == 0
7316                   || strcmp (isec->output_section->name, ".fini") == 0);
7317   /* Space for a branch around any trampolines.  */
7318   trampoff = trampbase;
7319   if (maybe_pasted && trampbase == isec->rawsize)
7320     trampoff += 4;
7321
7322   symtab_hdr = &elf_symtab_hdr (abfd);
7323   picfixup_size = 0;
7324   if (htab->params->branch_trampolines
7325       || htab->params->pic_fixup > 0)
7326     {
7327       /* Get a copy of the native relocations.  */
7328       if (isec->reloc_count != 0)
7329         {
7330           internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
7331                                                        link_info->keep_memory);
7332           if (internal_relocs == NULL)
7333             goto error_return;
7334         }
7335
7336       got2 = bfd_get_section_by_name (abfd, ".got2");
7337
7338       irelend = internal_relocs + isec->reloc_count;
7339       for (irel = internal_relocs; irel < irelend; irel++)
7340         {
7341           unsigned long r_type = ELF32_R_TYPE (irel->r_info);
7342           bfd_vma toff, roff;
7343           asection *tsec;
7344           struct one_branch_fixup *f;
7345           size_t insn_offset = 0;
7346           bfd_vma max_branch_offset = 0, val;
7347           bfd_byte *hit_addr;
7348           unsigned long t0;
7349           struct elf_link_hash_entry *h;
7350           Elf_Internal_Sym *isym;
7351           struct plt_entry **plist;
7352           unsigned char sym_type;
7353
7354           switch (r_type)
7355             {
7356             case R_PPC_REL24:
7357             case R_PPC_LOCAL24PC:
7358             case R_PPC_PLTREL24:
7359             case R_PPC_PLTCALL:
7360               max_branch_offset = 1 << 25;
7361               break;
7362
7363             case R_PPC_REL14:
7364             case R_PPC_REL14_BRTAKEN:
7365             case R_PPC_REL14_BRNTAKEN:
7366               max_branch_offset = 1 << 15;
7367               break;
7368
7369             case R_PPC_ADDR16_HA:
7370               if (htab->params->pic_fixup > 0)
7371                 break;
7372               continue;
7373
7374             default:
7375               continue;
7376             }
7377
7378           /* Get the value of the symbol referred to by the reloc.  */
7379           if (!get_sym_h (&h, &isym, &tsec, NULL, &isymbuf,
7380                           ELF32_R_SYM (irel->r_info), abfd))
7381             goto error_return;
7382
7383           if (isym != NULL)
7384             {
7385               if (tsec != NULL)
7386                 ;
7387               else if (isym->st_shndx == SHN_UNDEF)
7388                 tsec = bfd_und_section_ptr;
7389               else if (isym->st_shndx == SHN_ABS)
7390                 tsec = bfd_abs_section_ptr;
7391               else if (isym->st_shndx == SHN_COMMON)
7392                 tsec = bfd_com_section_ptr;
7393
7394               toff = isym->st_value;
7395               sym_type = ELF_ST_TYPE (isym->st_info);
7396             }
7397           else
7398             {
7399               if (tsec != NULL)
7400                 toff = h->root.u.def.value;
7401               else if (h->root.type == bfd_link_hash_undefined
7402                        || h->root.type == bfd_link_hash_undefweak)
7403                 {
7404                   unsigned long indx;
7405
7406                   indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
7407                   tsec = bfd_und_section_ptr;
7408                   toff = bfd_link_relocatable (link_info) ? indx : 0;
7409                 }
7410               else
7411                 continue;
7412
7413               /* If this branch is to __tls_get_addr then we may later
7414                  optimise away the call.  We won't be needing a long-
7415                  branch stub in that case.  */
7416               if (bfd_link_executable (link_info)
7417                   && h == htab->tls_get_addr
7418                   && irel != internal_relocs)
7419                 {
7420                   unsigned long t_symndx = ELF32_R_SYM (irel[-1].r_info);
7421                   unsigned long t_rtype = ELF32_R_TYPE (irel[-1].r_info);
7422                   unsigned int tls_mask = 0;
7423
7424                   /* The previous reloc should be one of R_PPC_TLSGD or
7425                      R_PPC_TLSLD, or for older object files, a reloc
7426                      on the __tls_get_addr arg setup insn.  Get tls
7427                      mask bits from the symbol on that reloc.  */
7428                   if (t_symndx < symtab_hdr->sh_info)
7429                     {
7430                       bfd_vma *local_got_offsets = elf_local_got_offsets (abfd);
7431
7432                       if (local_got_offsets != NULL)
7433                         {
7434                           struct plt_entry **local_plt = (struct plt_entry **)
7435                             (local_got_offsets + symtab_hdr->sh_info);
7436                           char *lgot_masks = (char *)
7437                             (local_plt + symtab_hdr->sh_info);
7438                           tls_mask = lgot_masks[t_symndx];
7439                         }
7440                     }
7441                   else
7442                     {
7443                       struct elf_link_hash_entry *th
7444                         = elf_sym_hashes (abfd)[t_symndx - symtab_hdr->sh_info];
7445
7446                       while (th->root.type == bfd_link_hash_indirect
7447                              || th->root.type == bfd_link_hash_warning)
7448                         th = (struct elf_link_hash_entry *) th->root.u.i.link;
7449
7450                       tls_mask
7451                         = ((struct ppc_elf_link_hash_entry *) th)->tls_mask;
7452                     }
7453
7454                   /* The mask bits tell us if the call will be
7455                      optimised away.  */
7456                   if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
7457                       && (t_rtype == R_PPC_TLSGD
7458                           || t_rtype == R_PPC_GOT_TLSGD16
7459                           || t_rtype == R_PPC_GOT_TLSGD16_LO))
7460                     continue;
7461                   if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
7462                       && (t_rtype == R_PPC_TLSLD
7463                           || t_rtype == R_PPC_GOT_TLSLD16
7464                           || t_rtype == R_PPC_GOT_TLSLD16_LO))
7465                     continue;
7466                 }
7467
7468               sym_type = h->type;
7469             }
7470
7471           if (r_type == R_PPC_ADDR16_HA)
7472             {
7473               if (h != NULL
7474                   && !h->def_regular
7475                   && h->protected_def
7476                   && ppc_elf_hash_entry (h)->has_addr16_ha
7477                   && ppc_elf_hash_entry (h)->has_addr16_lo)
7478                 picfixup_size += 12;
7479               continue;
7480             }
7481
7482           /* The condition here under which we call find_plt_ent must
7483              match that in relocate_section.  If we call find_plt_ent here
7484              but not in relocate_section, or vice versa, then the branch
7485              destination used here may be incorrect.  */
7486           plist = NULL;
7487           if (h != NULL)
7488             {
7489               /* We know is_branch_reloc (r_type) is true.  */
7490               if (h->type == STT_GNU_IFUNC
7491                   || r_type == R_PPC_PLTREL24)
7492                 plist = &h->plt.plist;
7493             }
7494           else if (sym_type == STT_GNU_IFUNC
7495                    && elf_local_got_offsets (abfd) != NULL)
7496             {
7497               bfd_vma *local_got_offsets = elf_local_got_offsets (abfd);
7498               struct plt_entry **local_plt = (struct plt_entry **)
7499                 (local_got_offsets + symtab_hdr->sh_info);
7500               plist = local_plt + ELF32_R_SYM (irel->r_info);
7501             }
7502           if (plist != NULL)
7503             {
7504               bfd_vma addend = 0;
7505               struct plt_entry *ent;
7506
7507               if (r_type == R_PPC_PLTREL24 && bfd_link_pic (link_info))
7508                 addend = irel->r_addend;
7509               ent = find_plt_ent (plist, got2, addend);
7510               if (ent != NULL)
7511                 {
7512                   if (htab->plt_type == PLT_NEW
7513                       || h == NULL
7514                       || !htab->elf.dynamic_sections_created
7515                       || h->dynindx == -1)
7516                     {
7517                       tsec = htab->glink;
7518                       toff = ent->glink_offset;
7519                     }
7520                   else
7521                     {
7522                       tsec = htab->elf.splt;
7523                       toff = ent->plt.offset;
7524                     }
7525                 }
7526             }
7527
7528           /* If the branch and target are in the same section, you have
7529              no hope of adding stubs.  We'll error out later should the
7530              branch overflow.  */
7531           if (tsec == isec)
7532             continue;
7533
7534           /* There probably isn't any reason to handle symbols in
7535              SEC_MERGE sections;  SEC_MERGE doesn't seem a likely
7536              attribute for a code section, and we are only looking at
7537              branches.  However, implement it correctly here as a
7538              reference for other target relax_section functions.  */
7539           if (0 && tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
7540             {
7541               /* At this stage in linking, no SEC_MERGE symbol has been
7542                  adjusted, so all references to such symbols need to be
7543                  passed through _bfd_merged_section_offset.  (Later, in
7544                  relocate_section, all SEC_MERGE symbols *except* for
7545                  section symbols have been adjusted.)
7546
7547                  gas may reduce relocations against symbols in SEC_MERGE
7548                  sections to a relocation against the section symbol when
7549                  the original addend was zero.  When the reloc is against
7550                  a section symbol we should include the addend in the
7551                  offset passed to _bfd_merged_section_offset, since the
7552                  location of interest is the original symbol.  On the
7553                  other hand, an access to "sym+addend" where "sym" is not
7554                  a section symbol should not include the addend;  Such an
7555                  access is presumed to be an offset from "sym";  The
7556                  location of interest is just "sym".  */
7557               if (sym_type == STT_SECTION)
7558                 toff += irel->r_addend;
7559
7560               toff
7561                 = _bfd_merged_section_offset (abfd, &tsec,
7562                                               elf_section_data (tsec)->sec_info,
7563                                               toff);
7564
7565               if (sym_type != STT_SECTION)
7566                 toff += irel->r_addend;
7567             }
7568           /* PLTREL24 addends are special.  */
7569           else if (r_type != R_PPC_PLTREL24)
7570             toff += irel->r_addend;
7571
7572           /* Attempted -shared link of non-pic code loses.  */
7573           if ((!bfd_link_relocatable (link_info)
7574                && tsec == bfd_und_section_ptr)
7575               || tsec->output_section == NULL
7576               || (tsec->owner != NULL
7577                   && (tsec->owner->flags & BFD_PLUGIN) != 0))
7578             continue;
7579
7580           roff = irel->r_offset;
7581
7582           /* If the branch is in range, no need to do anything.  */
7583           if (tsec != bfd_und_section_ptr
7584               && (!bfd_link_relocatable (link_info)
7585                   /* A relocatable link may have sections moved during
7586                      final link, so do not presume they remain in range.  */
7587                   || tsec->output_section == isec->output_section))
7588             {
7589               bfd_vma symaddr, reladdr;
7590
7591               symaddr = tsec->output_section->vma + tsec->output_offset + toff;
7592               reladdr = isec->output_section->vma + isec->output_offset + roff;
7593               if (symaddr - reladdr + max_branch_offset
7594                   < 2 * max_branch_offset)
7595                 continue;
7596             }
7597
7598           /* Look for an existing fixup to this address.  */
7599           for (f = branch_fixups; f ; f = f->next)
7600             if (f->tsec == tsec && f->toff == toff)
7601               break;
7602
7603           if (f == NULL)
7604             {
7605               size_t size;
7606               unsigned long stub_rtype;
7607
7608               val = trampoff - roff;
7609               if (val >= max_branch_offset)
7610                 /* Oh dear, we can't reach a trampoline.  Don't try to add
7611                    one.  We'll report an error later.  */
7612                 continue;
7613
7614               if (bfd_link_pic (link_info))
7615                 {
7616                   size = 4 * ARRAY_SIZE (shared_stub_entry);
7617                   insn_offset = 12;
7618                 }
7619               else
7620                 {
7621                   size = 4 * ARRAY_SIZE (stub_entry);
7622                   insn_offset = 0;
7623                 }
7624               stub_rtype = R_PPC_RELAX;
7625               if (tsec == htab->elf.splt
7626                   || tsec == htab->glink)
7627                 {
7628                   stub_rtype = R_PPC_RELAX_PLT;
7629                   if (r_type == R_PPC_PLTREL24)
7630                     stub_rtype = R_PPC_RELAX_PLTREL24;
7631                 }
7632
7633               /* Hijack the old relocation.  Since we need two
7634                  relocations for this use a "composite" reloc.  */
7635               irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
7636                                            stub_rtype);
7637               irel->r_offset = trampoff + insn_offset;
7638               if (r_type == R_PPC_PLTREL24
7639                   && stub_rtype != R_PPC_RELAX_PLTREL24)
7640                 irel->r_addend = 0;
7641
7642               /* Record the fixup so we don't do it again this section.  */
7643               f = bfd_malloc (sizeof (*f));
7644               f->next = branch_fixups;
7645               f->tsec = tsec;
7646               f->toff = toff;
7647               f->trampoff = trampoff;
7648               branch_fixups = f;
7649
7650               trampoff += size;
7651               changes++;
7652             }
7653           else
7654             {
7655               val = f->trampoff - roff;
7656               if (val >= max_branch_offset)
7657                 continue;
7658
7659               /* Nop out the reloc, since we're finalizing things here.  */
7660               irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
7661             }
7662
7663           /* Get the section contents.  */
7664           if (contents == NULL)
7665             {
7666               /* Get cached copy if it exists.  */
7667               if (elf_section_data (isec)->this_hdr.contents != NULL)
7668                 contents = elf_section_data (isec)->this_hdr.contents;
7669               /* Go get them off disk.  */
7670               else if (!bfd_malloc_and_get_section (abfd, isec, &contents))
7671                 goto error_return;
7672             }
7673
7674           /* Fix up the existing branch to hit the trampoline.  */
7675           hit_addr = contents + roff;
7676           switch (r_type)
7677             {
7678             case R_PPC_REL24:
7679             case R_PPC_LOCAL24PC:
7680             case R_PPC_PLTREL24:
7681               t0 = bfd_get_32 (abfd, hit_addr);
7682               t0 &= ~0x3fffffc;
7683               t0 |= val & 0x3fffffc;
7684               bfd_put_32 (abfd, t0, hit_addr);
7685               break;
7686
7687             case R_PPC_REL14:
7688             case R_PPC_REL14_BRTAKEN:
7689             case R_PPC_REL14_BRNTAKEN:
7690               t0 = bfd_get_32 (abfd, hit_addr);
7691               t0 &= ~0xfffc;
7692               t0 |= val & 0xfffc;
7693               bfd_put_32 (abfd, t0, hit_addr);
7694               break;
7695             }
7696         }
7697
7698       while (branch_fixups != NULL)
7699         {
7700           struct one_branch_fixup *f = branch_fixups;
7701           branch_fixups = branch_fixups->next;
7702           free (f);
7703         }
7704     }
7705
7706   workaround_change = FALSE;
7707   newsize = trampoff;
7708   if (htab->params->ppc476_workaround
7709       && (!bfd_link_relocatable (link_info)
7710           || isec->output_section->alignment_power >= htab->params->pagesize_p2))
7711     {
7712       bfd_vma addr, end_addr;
7713       unsigned int crossings;
7714       bfd_vma pagesize = (bfd_vma) 1 << htab->params->pagesize_p2;
7715
7716       addr = isec->output_section->vma + isec->output_offset;
7717       end_addr = addr + trampoff;
7718       addr &= -pagesize;
7719       crossings = ((end_addr & -pagesize) - addr) >> htab->params->pagesize_p2;
7720       if (crossings != 0)
7721         {
7722           /* Keep space aligned, to ensure the patch code itself does
7723              not cross a page.  Don't decrease size calculated on a
7724              previous pass as otherwise we might never settle on a layout.  */
7725           newsize = 15 - ((end_addr - 1) & 15);
7726           newsize += crossings * 16;
7727           if (relax_info->workaround_size < newsize)
7728             {
7729               relax_info->workaround_size = newsize;
7730               workaround_change = TRUE;
7731             }
7732           /* Ensure relocate_section is called.  */
7733           isec->flags |= SEC_RELOC;
7734         }
7735       newsize = trampoff + relax_info->workaround_size;
7736     }
7737
7738   if (htab->params->pic_fixup > 0)
7739     {
7740       picfixup_size -= relax_info->picfixup_size;
7741       if (picfixup_size != 0)
7742         relax_info->picfixup_size += picfixup_size;
7743       newsize += relax_info->picfixup_size;
7744     }
7745
7746   if (changes != 0 || picfixup_size != 0 || workaround_change)
7747     isec->size = newsize;
7748
7749   if (isymbuf != NULL
7750       && symtab_hdr->contents != (unsigned char *) isymbuf)
7751     {
7752       if (! link_info->keep_memory)
7753         free (isymbuf);
7754       else
7755         {
7756           /* Cache the symbols for elf_link_input_bfd.  */
7757           symtab_hdr->contents = (unsigned char *) isymbuf;
7758         }
7759     }
7760
7761   if (contents != NULL
7762       && elf_section_data (isec)->this_hdr.contents != contents)
7763     {
7764       if (!changes && !link_info->keep_memory)
7765         free (contents);
7766       else
7767         {
7768           /* Cache the section contents for elf_link_input_bfd.  */
7769           elf_section_data (isec)->this_hdr.contents = contents;
7770         }
7771     }
7772
7773   changes += picfixup_size;
7774   if (changes != 0)
7775     {
7776       /* Append sufficient NOP relocs so we can write out relocation
7777          information for the trampolines.  */
7778       Elf_Internal_Shdr *rel_hdr;
7779       Elf_Internal_Rela *new_relocs = bfd_malloc ((changes + isec->reloc_count)
7780                                                   * sizeof (*new_relocs));
7781       unsigned ix;
7782
7783       if (!new_relocs)
7784         goto error_return;
7785       memcpy (new_relocs, internal_relocs,
7786               isec->reloc_count * sizeof (*new_relocs));
7787       for (ix = changes; ix--;)
7788         {
7789           irel = new_relocs + ix + isec->reloc_count;
7790
7791           irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
7792         }
7793       if (internal_relocs != elf_section_data (isec)->relocs)
7794         free (internal_relocs);
7795       elf_section_data (isec)->relocs = new_relocs;
7796       isec->reloc_count += changes;
7797       rel_hdr = _bfd_elf_single_rel_hdr (isec);
7798       rel_hdr->sh_size += changes * rel_hdr->sh_entsize;
7799     }
7800   else if (internal_relocs != NULL
7801            && elf_section_data (isec)->relocs != internal_relocs)
7802     free (internal_relocs);
7803
7804   *again = changes != 0 || workaround_change;
7805   return TRUE;
7806
7807  error_return:
7808   while (branch_fixups != NULL)
7809     {
7810       struct one_branch_fixup *f = branch_fixups;
7811       branch_fixups = branch_fixups->next;
7812       free (f);
7813     }
7814   if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
7815     free (isymbuf);
7816   if (contents != NULL
7817       && elf_section_data (isec)->this_hdr.contents != contents)
7818     free (contents);
7819   if (internal_relocs != NULL
7820       && elf_section_data (isec)->relocs != internal_relocs)
7821     free (internal_relocs);
7822   return FALSE;
7823 }
7824 \f
7825 /* What to do when ld finds relocations against symbols defined in
7826    discarded sections.  */
7827
7828 static unsigned int
7829 ppc_elf_action_discarded (asection *sec)
7830 {
7831   if (strcmp (".fixup", sec->name) == 0)
7832     return 0;
7833
7834   if (strcmp (".got2", sec->name) == 0)
7835     return 0;
7836
7837   return _bfd_elf_default_action_discarded (sec);
7838 }
7839 \f
7840 /* Fill in the address for a pointer generated in a linker section.  */
7841
7842 static bfd_vma
7843 elf_finish_pointer_linker_section (bfd *input_bfd,
7844                                    elf_linker_section_t *lsect,
7845                                    struct elf_link_hash_entry *h,
7846                                    bfd_vma relocation,
7847                                    const Elf_Internal_Rela *rel)
7848 {
7849   elf_linker_section_pointers_t *linker_section_ptr;
7850
7851   BFD_ASSERT (lsect != NULL);
7852
7853   if (h != NULL)
7854     {
7855       /* Handle global symbol.  */
7856       struct ppc_elf_link_hash_entry *eh;
7857
7858       eh = (struct ppc_elf_link_hash_entry *) h;
7859       BFD_ASSERT (eh->elf.def_regular);
7860       linker_section_ptr = eh->linker_section_pointer;
7861     }
7862   else
7863     {
7864       /* Handle local symbol.  */
7865       unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
7866
7867       BFD_ASSERT (is_ppc_elf (input_bfd));
7868       BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
7869       linker_section_ptr = elf_local_ptr_offsets (input_bfd)[r_symndx];
7870     }
7871
7872   linker_section_ptr = elf_find_pointer_linker_section (linker_section_ptr,
7873                                                         rel->r_addend,
7874                                                         lsect);
7875   BFD_ASSERT (linker_section_ptr != NULL);
7876
7877   /* Offset will always be a multiple of four, so use the bottom bit
7878      as a "written" flag.  */
7879   if ((linker_section_ptr->offset & 1) == 0)
7880     {
7881       bfd_put_32 (lsect->section->owner,
7882                   relocation + linker_section_ptr->addend,
7883                   lsect->section->contents + linker_section_ptr->offset);
7884       linker_section_ptr->offset += 1;
7885     }
7886
7887   relocation = (lsect->section->output_section->vma
7888                 + lsect->section->output_offset
7889                 + linker_section_ptr->offset - 1
7890                 - SYM_VAL (lsect->sym));
7891
7892 #ifdef DEBUG
7893   fprintf (stderr,
7894            "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
7895            lsect->name, (long) relocation, (long) relocation);
7896 #endif
7897
7898   return relocation;
7899 }
7900
7901 #define PPC_LO(v) ((v) & 0xffff)
7902 #define PPC_HI(v) (((v) >> 16) & 0xffff)
7903 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
7904
7905 static void
7906 write_glink_stub (struct elf_link_hash_entry *h, struct plt_entry *ent,
7907                   asection *plt_sec, unsigned char *p,
7908                   struct bfd_link_info *info)
7909 {
7910   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
7911   bfd *output_bfd = info->output_bfd;
7912   bfd_vma plt;
7913   unsigned char *end = p + GLINK_ENTRY_SIZE (htab, h);
7914
7915   if (h != NULL
7916       && h == htab->tls_get_addr
7917       && !htab->params->no_tls_get_addr_opt)
7918     {
7919       bfd_put_32 (output_bfd, LWZ_11_3, p);
7920       p += 4;
7921       bfd_put_32 (output_bfd, LWZ_12_3 + 4, p);
7922       p += 4;
7923       bfd_put_32 (output_bfd, MR_0_3, p);
7924       p += 4;
7925       bfd_put_32 (output_bfd, CMPWI_11_0, p);
7926       p += 4;
7927       bfd_put_32 (output_bfd, ADD_3_12_2, p);
7928       p += 4;
7929       bfd_put_32 (output_bfd, BEQLR, p);
7930       p += 4;
7931       bfd_put_32 (output_bfd, MR_3_0, p);
7932       p += 4;
7933       bfd_put_32 (output_bfd, NOP, p);
7934       p += 4;
7935     }
7936
7937   plt = ((ent->plt.offset & ~1)
7938          + plt_sec->output_section->vma
7939          + plt_sec->output_offset);
7940
7941   if (bfd_link_pic (info))
7942     {
7943       bfd_vma got = 0;
7944
7945       if (ent->addend >= 32768)
7946         got = (ent->addend
7947                + ent->sec->output_section->vma
7948                + ent->sec->output_offset);
7949       else if (htab->elf.hgot != NULL)
7950         got = SYM_VAL (htab->elf.hgot);
7951
7952       plt -= got;
7953
7954       if (plt + 0x8000 < 0x10000)
7955         bfd_put_32 (output_bfd, LWZ_11_30 + PPC_LO (plt), p);
7956       else
7957         {
7958           bfd_put_32 (output_bfd, ADDIS_11_30 + PPC_HA (plt), p);
7959           p += 4;
7960           bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
7961         }
7962     }
7963   else
7964     {
7965       bfd_put_32 (output_bfd, LIS_11 + PPC_HA (plt), p);
7966       p += 4;
7967       bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
7968     }
7969   p += 4;
7970   bfd_put_32 (output_bfd, MTCTR_11, p);
7971   p += 4;
7972   bfd_put_32 (output_bfd, BCTR, p);
7973   p += 4;
7974   while (p < end)
7975     {
7976       bfd_put_32 (output_bfd, htab->params->ppc476_workaround ? BA : NOP, p);
7977       p += 4;
7978     }
7979 }
7980
7981 /* Return true if symbol is defined statically.  */
7982
7983 static bfd_boolean
7984 is_static_defined (struct elf_link_hash_entry *h)
7985 {
7986   return ((h->root.type == bfd_link_hash_defined
7987            || h->root.type == bfd_link_hash_defweak)
7988           && h->root.u.def.section != NULL
7989           && h->root.u.def.section->output_section != NULL);
7990 }
7991
7992 /* If INSN is an opcode that may be used with an @tls operand, return
7993    the transformed insn for TLS optimisation, otherwise return 0.  If
7994    REG is non-zero only match an insn with RB or RA equal to REG.  */
7995
7996 unsigned int
7997 _bfd_elf_ppc_at_tls_transform (unsigned int insn, unsigned int reg)
7998 {
7999   unsigned int rtra;
8000
8001   if ((insn & (0x3f << 26)) != 31 << 26)
8002     return 0;
8003
8004   if (reg == 0 || ((insn >> 11) & 0x1f) == reg)
8005     rtra = insn & ((1 << 26) - (1 << 16));
8006   else if (((insn >> 16) & 0x1f) == reg)
8007     rtra = (insn & (0x1f << 21)) | ((insn & (0x1f << 11)) << 5);
8008   else
8009     return 0;
8010
8011   if ((insn & (0x3ff << 1)) == 266 << 1)
8012     /* add -> addi.  */
8013     insn = 14 << 26;
8014   else if ((insn & (0x1f << 1)) == 23 << 1
8015            && ((insn & (0x1f << 6)) < 14 << 6
8016                || ((insn & (0x1f << 6)) >= 16 << 6
8017                    && (insn & (0x1f << 6)) < 24 << 6)))
8018     /* load and store indexed -> dform.  */
8019     insn = (32 | ((insn >> 6) & 0x1f)) << 26;
8020   else if ((insn & (((0x1a << 5) | 0x1f) << 1)) == 21 << 1)
8021     /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
8022     insn = ((58 | ((insn >> 6) & 4)) << 26) | ((insn >> 6) & 1);
8023   else if ((insn & (((0x1f << 5) | 0x1f) << 1)) == 341 << 1)
8024     /* lwax -> lwa.  */
8025     insn = (58 << 26) | 2;
8026   else
8027     return 0;
8028   insn |= rtra;
8029   return insn;
8030 }
8031
8032 /* If INSN is an opcode that may be used with an @tprel operand, return
8033    the transformed insn for an undefined weak symbol, ie. with the
8034    thread pointer REG operand removed.  Otherwise return 0.  */
8035
8036 unsigned int
8037 _bfd_elf_ppc_at_tprel_transform (unsigned int insn, unsigned int reg)
8038 {
8039   if ((insn & (0x1f << 16)) == reg << 16
8040       && ((insn & (0x3f << 26)) == 14u << 26 /* addi */
8041           || (insn & (0x3f << 26)) == 15u << 26 /* addis */
8042           || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8043           || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8044           || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8045           || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8046           || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8047           || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8048           || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8049           || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8050           || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8051           || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8052           || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8053           || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8054           || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8055           || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
8056               && (insn & 3) != 1)
8057           || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
8058               && ((insn & 3) == 0 || (insn & 3) == 3))))
8059     {
8060       insn &= ~(0x1f << 16);
8061     }
8062   else if ((insn & (0x1f << 21)) == reg << 21
8063            && ((insn & (0x3e << 26)) == 24u << 26 /* ori, oris */
8064                || (insn & (0x3e << 26)) == 26u << 26 /* xori,xoris */
8065                || (insn & (0x3e << 26)) == 28u << 26 /* andi,andis */))
8066     {
8067       insn &= ~(0x1f << 21);
8068       insn |= (insn & (0x1f << 16)) << 5;
8069       if ((insn & (0x3e << 26)) == 26 << 26 /* xori,xoris */)
8070         insn -= 2 >> 26;  /* convert to ori,oris */
8071     }
8072   else
8073     insn = 0;
8074   return insn;
8075 }
8076
8077 static bfd_boolean
8078 is_insn_ds_form (unsigned int insn)
8079 {
8080   return ((insn & (0x3f << 26)) == 58u << 26 /* ld,ldu,lwa */
8081           || (insn & (0x3f << 26)) == 62u << 26 /* std,stdu,stq */
8082           || (insn & (0x3f << 26)) == 57u << 26 /* lfdp */
8083           || (insn & (0x3f << 26)) == 61u << 26 /* stfdp */);
8084 }
8085
8086 static bfd_boolean
8087 is_insn_dq_form (unsigned int insn)
8088 {
8089   return ((insn & (0x3f << 26)) == 56u << 26 /* lq */
8090           || ((insn & (0x3f << 26)) == (61u << 26) /* lxv, stxv */
8091               && (insn & 3) == 1));
8092 }
8093
8094 /* The RELOCATE_SECTION function is called by the ELF backend linker
8095    to handle the relocations for a section.
8096
8097    The relocs are always passed as Rela structures; if the section
8098    actually uses Rel structures, the r_addend field will always be
8099    zero.
8100
8101    This function is responsible for adjust the section contents as
8102    necessary, and (if using Rela relocs and generating a
8103    relocatable output file) adjusting the reloc addend as
8104    necessary.
8105
8106    This function does not have to worry about setting the reloc
8107    address or the reloc symbol index.
8108
8109    LOCAL_SYMS is a pointer to the swapped in local symbols.
8110
8111    LOCAL_SECTIONS is an array giving the section in the input file
8112    corresponding to the st_shndx field of each local symbol.
8113
8114    The global hash table entry for the global symbols can be found
8115    via elf_sym_hashes (input_bfd).
8116
8117    When generating relocatable output, this function must handle
8118    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
8119    going to be the section symbol corresponding to the output
8120    section, which means that the addend must be adjusted
8121    accordingly.  */
8122
8123 static bfd_boolean
8124 ppc_elf_relocate_section (bfd *output_bfd,
8125                           struct bfd_link_info *info,
8126                           bfd *input_bfd,
8127                           asection *input_section,
8128                           bfd_byte *contents,
8129                           Elf_Internal_Rela *relocs,
8130                           Elf_Internal_Sym *local_syms,
8131                           asection **local_sections)
8132 {
8133   Elf_Internal_Shdr *symtab_hdr;
8134   struct elf_link_hash_entry **sym_hashes;
8135   struct ppc_elf_link_hash_table *htab;
8136   Elf_Internal_Rela *rel;
8137   Elf_Internal_Rela *wrel;
8138   Elf_Internal_Rela *relend;
8139   Elf_Internal_Rela outrel;
8140   asection *got2;
8141   bfd_vma *local_got_offsets;
8142   bfd_boolean ret = TRUE;
8143   bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
8144   bfd_boolean is_vxworks_tls;
8145   unsigned int picfixup_size = 0;
8146   struct ppc_elf_relax_info *relax_info = NULL;
8147
8148 #ifdef DEBUG
8149   _bfd_error_handler ("ppc_elf_relocate_section called for %pB section %pA, "
8150                       "%ld relocations%s",
8151                       input_bfd, input_section,
8152                       (long) input_section->reloc_count,
8153                       (bfd_link_relocatable (info)) ? " (relocatable)" : "");
8154 #endif
8155
8156   got2 = bfd_get_section_by_name (input_bfd, ".got2");
8157
8158   /* Initialize howto table if not already done.  */
8159   if (!ppc_elf_howto_table[R_PPC_ADDR32])
8160     ppc_elf_howto_init ();
8161
8162   htab = ppc_elf_hash_table (info);
8163   local_got_offsets = elf_local_got_offsets (input_bfd);
8164   symtab_hdr = &elf_symtab_hdr (input_bfd);
8165   sym_hashes = elf_sym_hashes (input_bfd);
8166   /* We have to handle relocations in vxworks .tls_vars sections
8167      specially, because the dynamic loader is 'weird'.  */
8168   is_vxworks_tls = (htab->is_vxworks && bfd_link_pic (info)
8169                     && !strcmp (input_section->output_section->name,
8170                                 ".tls_vars"));
8171   if (input_section->sec_info_type == SEC_INFO_TYPE_TARGET)
8172     relax_info = elf_section_data (input_section)->sec_info;
8173   rel = wrel = relocs;
8174   relend = relocs + input_section->reloc_count;
8175   for (; rel < relend; wrel++, rel++)
8176     {
8177       enum elf_ppc_reloc_type r_type;
8178       bfd_vma addend;
8179       bfd_reloc_status_type r;
8180       Elf_Internal_Sym *sym;
8181       asection *sec;
8182       struct elf_link_hash_entry *h;
8183       const char *sym_name;
8184       reloc_howto_type *howto;
8185       unsigned long r_symndx;
8186       bfd_vma relocation;
8187       bfd_vma branch_bit, from;
8188       bfd_boolean unresolved_reloc, save_unresolved_reloc;
8189       bfd_boolean warned;
8190       unsigned int tls_type, tls_mask, tls_gd;
8191       struct plt_entry **ifunc, **plt_list;
8192       struct reloc_howto_struct alt_howto;
8193
8194     again:
8195       r_type = ELF32_R_TYPE (rel->r_info);
8196       sym = NULL;
8197       sec = NULL;
8198       h = NULL;
8199       unresolved_reloc = FALSE;
8200       warned = FALSE;
8201       r_symndx = ELF32_R_SYM (rel->r_info);
8202
8203       if (r_symndx < symtab_hdr->sh_info)
8204         {
8205           sym = local_syms + r_symndx;
8206           sec = local_sections[r_symndx];
8207           sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
8208
8209           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
8210         }
8211       else
8212         {
8213           bfd_boolean ignored;
8214
8215           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
8216                                    r_symndx, symtab_hdr, sym_hashes,
8217                                    h, sec, relocation,
8218                                    unresolved_reloc, warned, ignored);
8219
8220           sym_name = h->root.root.string;
8221         }
8222
8223       if (sec != NULL && discarded_section (sec))
8224         {
8225           /* For relocs against symbols from removed linkonce sections,
8226              or sections discarded by a linker script, we just want the
8227              section contents zeroed.  Avoid any special processing.  */
8228           howto = NULL;
8229           if (r_type < R_PPC_max)
8230             howto = ppc_elf_howto_table[r_type];
8231
8232           _bfd_clear_contents (howto, input_bfd, input_section,
8233                                contents + rel->r_offset);
8234           wrel->r_offset = rel->r_offset;
8235           wrel->r_info = 0;
8236           wrel->r_addend = 0;
8237
8238           /* For ld -r, remove relocations in debug sections against
8239              symbols defined in discarded sections.  Not done for
8240              non-debug to preserve relocs in .eh_frame which the
8241              eh_frame editing code expects to be present.  */
8242           if (bfd_link_relocatable (info)
8243               && (input_section->flags & SEC_DEBUGGING))
8244             wrel--;
8245
8246           continue;
8247         }
8248
8249       if (bfd_link_relocatable (info))
8250         {
8251           if (got2 != NULL
8252               && r_type == R_PPC_PLTREL24
8253               && rel->r_addend != 0)
8254             {
8255               /* R_PPC_PLTREL24 is rather special.  If non-zero, the
8256                  addend specifies the GOT pointer offset within .got2.  */
8257               rel->r_addend += got2->output_offset;
8258             }
8259           if (r_type != R_PPC_RELAX_PLT
8260               && r_type != R_PPC_RELAX_PLTREL24
8261               && r_type != R_PPC_RELAX)
8262             goto copy_reloc;
8263         }
8264
8265       /* TLS optimizations.  Replace instruction sequences and relocs
8266          based on information we collected in tls_optimize.  We edit
8267          RELOCS so that --emit-relocs will output something sensible
8268          for the final instruction stream.  */
8269       tls_mask = 0;
8270       tls_gd = 0;
8271       if (h != NULL)
8272         tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
8273       else if (local_got_offsets != NULL)
8274         {
8275           struct plt_entry **local_plt;
8276           char *lgot_masks;
8277           local_plt
8278             = (struct plt_entry **) (local_got_offsets + symtab_hdr->sh_info);
8279           lgot_masks = (char *) (local_plt + symtab_hdr->sh_info);
8280           tls_mask = lgot_masks[r_symndx];
8281         }
8282
8283       /* Ensure reloc mapping code below stays sane.  */
8284       if ((R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TLSGD16 & 3)
8285           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
8286           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
8287           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
8288           || (R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TPREL16 & 3)
8289           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
8290           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
8291           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
8292         abort ();
8293       switch (r_type)
8294         {
8295         default:
8296           break;
8297
8298         case R_PPC_GOT_TPREL16:
8299         case R_PPC_GOT_TPREL16_LO:
8300           if ((tls_mask & TLS_TLS) != 0
8301               && (tls_mask & TLS_TPREL) == 0)
8302             {
8303               bfd_vma insn;
8304
8305               insn = bfd_get_32 (input_bfd,
8306                                  contents + rel->r_offset - d_offset);
8307               insn &= 31 << 21;
8308               insn |= 0x3c020000;       /* addis 0,2,0 */
8309               bfd_put_32 (input_bfd, insn,
8310                           contents + rel->r_offset - d_offset);
8311               r_type = R_PPC_TPREL16_HA;
8312               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
8313             }
8314           break;
8315
8316         case R_PPC_TLS:
8317           if ((tls_mask & TLS_TLS) != 0
8318               && (tls_mask & TLS_TPREL) == 0)
8319             {
8320               bfd_vma insn;
8321
8322               insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
8323               insn = _bfd_elf_ppc_at_tls_transform (insn, 2);
8324               if (insn == 0)
8325                 abort ();
8326               bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
8327               r_type = R_PPC_TPREL16_LO;
8328               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
8329
8330               /* Was PPC_TLS which sits on insn boundary, now
8331                  PPC_TPREL16_LO which is at low-order half-word.  */
8332               rel->r_offset += d_offset;
8333             }
8334           break;
8335
8336         case R_PPC_GOT_TLSGD16_HI:
8337         case R_PPC_GOT_TLSGD16_HA:
8338           tls_gd = TLS_TPRELGD;
8339           if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
8340             goto tls_gdld_hi;
8341           break;
8342
8343         case R_PPC_GOT_TLSLD16_HI:
8344         case R_PPC_GOT_TLSLD16_HA:
8345           if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
8346             {
8347             tls_gdld_hi:
8348               if ((tls_mask & tls_gd) != 0)
8349                 r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
8350                           + R_PPC_GOT_TPREL16);
8351               else
8352                 {
8353                   rel->r_offset -= d_offset;
8354                   bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
8355                   r_type = R_PPC_NONE;
8356                 }
8357               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
8358             }
8359           break;
8360
8361         case R_PPC_GOT_TLSGD16:
8362         case R_PPC_GOT_TLSGD16_LO:
8363           tls_gd = TLS_TPRELGD;
8364           if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
8365             goto tls_ldgd_opt;
8366           break;
8367
8368         case R_PPC_GOT_TLSLD16:
8369         case R_PPC_GOT_TLSLD16_LO:
8370           if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
8371             {
8372               unsigned int insn1, insn2;
8373               bfd_vma offset;
8374
8375             tls_ldgd_opt:
8376               offset = (bfd_vma) -1;
8377               /* If not using the newer R_PPC_TLSGD/LD to mark
8378                  __tls_get_addr calls, we must trust that the call
8379                  stays with its arg setup insns, ie. that the next
8380                  reloc is the __tls_get_addr call associated with
8381                  the current reloc.  Edit both insns.  */
8382               if (input_section->has_tls_get_addr_call
8383                   && rel + 1 < relend
8384                   && branch_reloc_hash_match (input_bfd, rel + 1,
8385                                               htab->tls_get_addr))
8386                 offset = rel[1].r_offset;
8387               /* We read the low GOT_TLS insn because we need to keep
8388                  the destination reg.  It may be something other than
8389                  the usual r3, and moved to r3 before the call by
8390                  intervening code.  */
8391               insn1 = bfd_get_32 (input_bfd,
8392                                   contents + rel->r_offset - d_offset);
8393               if ((tls_mask & tls_gd) != 0)
8394                 {
8395                   /* IE */
8396                   insn1 &= (0x1f << 21) | (0x1f << 16);
8397                   insn1 |= 32 << 26;    /* lwz */
8398                   if (offset != (bfd_vma) -1)
8399                     {
8400                       rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
8401                       insn2 = 0x7c631214;       /* add 3,3,2 */
8402                       bfd_put_32 (input_bfd, insn2, contents + offset);
8403                     }
8404                   r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
8405                             + R_PPC_GOT_TPREL16);
8406                   rel->r_info = ELF32_R_INFO (r_symndx, r_type);
8407                 }
8408               else
8409                 {
8410                   /* LE */
8411                   insn1 &= 0x1f << 21;
8412                   insn1 |= 0x3c020000;  /* addis r,2,0 */
8413                   if (tls_gd == 0)
8414                     {
8415                       /* Was an LD reloc.  */
8416                       for (r_symndx = 0;
8417                            r_symndx < symtab_hdr->sh_info;
8418                            r_symndx++)
8419                         if (local_sections[r_symndx] == sec)
8420                           break;
8421                       if (r_symndx >= symtab_hdr->sh_info)
8422                         r_symndx = STN_UNDEF;
8423                       rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
8424                       if (r_symndx != STN_UNDEF)
8425                         rel->r_addend -= (local_syms[r_symndx].st_value
8426                                           + sec->output_offset
8427                                           + sec->output_section->vma);
8428                     }
8429                   r_type = R_PPC_TPREL16_HA;
8430                   rel->r_info = ELF32_R_INFO (r_symndx, r_type);
8431                   if (offset != (bfd_vma) -1)
8432                     {
8433                       rel[1].r_info = ELF32_R_INFO (r_symndx, R_PPC_TPREL16_LO);
8434                       rel[1].r_offset = offset + d_offset;
8435                       rel[1].r_addend = rel->r_addend;
8436                       insn2 = 0x38630000;       /* addi 3,3,0 */
8437                       bfd_put_32 (input_bfd, insn2, contents + offset);
8438                     }
8439                 }
8440               bfd_put_32 (input_bfd, insn1,
8441                           contents + rel->r_offset - d_offset);
8442               if (tls_gd == 0)
8443                 {
8444                   /* We changed the symbol on an LD reloc.  Start over
8445                      in order to get h, sym, sec etc. right.  */
8446                   goto again;
8447                 }
8448             }
8449           break;
8450
8451         case R_PPC_TLSGD:
8452           if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
8453               && rel + 1 < relend)
8454             {
8455               unsigned int insn2;
8456               bfd_vma offset = rel->r_offset;
8457
8458               if (is_plt_seq_reloc (ELF32_R_TYPE (rel[1].r_info)))
8459                 {
8460                   bfd_put_32 (input_bfd, NOP, contents + offset);
8461                   rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
8462                   break;
8463                 }
8464
8465               if ((tls_mask & TLS_TPRELGD) != 0)
8466                 {
8467                   /* IE */
8468                   r_type = R_PPC_NONE;
8469                   insn2 = 0x7c631214;   /* add 3,3,2 */
8470                 }
8471               else
8472                 {
8473                   /* LE */
8474                   r_type = R_PPC_TPREL16_LO;
8475                   rel->r_offset += d_offset;
8476                   insn2 = 0x38630000;   /* addi 3,3,0 */
8477                 }
8478               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
8479               bfd_put_32 (input_bfd, insn2, contents + offset);
8480               /* Zap the reloc on the _tls_get_addr call too.  */
8481               BFD_ASSERT (offset == rel[1].r_offset);
8482               rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
8483             }
8484           break;
8485
8486         case R_PPC_TLSLD:
8487           if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
8488               && rel + 1 < relend)
8489             {
8490               unsigned int insn2;
8491
8492               if (is_plt_seq_reloc (ELF32_R_TYPE (rel[1].r_info)))
8493                 {
8494                   bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
8495                   rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
8496                   break;
8497                 }
8498
8499               for (r_symndx = 0;
8500                    r_symndx < symtab_hdr->sh_info;
8501                    r_symndx++)
8502                 if (local_sections[r_symndx] == sec)
8503                   break;
8504               if (r_symndx >= symtab_hdr->sh_info)
8505                 r_symndx = STN_UNDEF;
8506               rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
8507               if (r_symndx != STN_UNDEF)
8508                 rel->r_addend -= (local_syms[r_symndx].st_value
8509                                   + sec->output_offset
8510                                   + sec->output_section->vma);
8511
8512               rel->r_info = ELF32_R_INFO (r_symndx, R_PPC_TPREL16_LO);
8513               rel->r_offset += d_offset;
8514               insn2 = 0x38630000;       /* addi 3,3,0 */
8515               bfd_put_32 (input_bfd, insn2,
8516                           contents + rel->r_offset - d_offset);
8517               /* Zap the reloc on the _tls_get_addr call too.  */
8518               BFD_ASSERT (rel->r_offset - d_offset == rel[1].r_offset);
8519               rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
8520               goto again;
8521             }
8522           break;
8523         }
8524
8525       /* Handle other relocations that tweak non-addend part of insn.  */
8526       branch_bit = 0;
8527       switch (r_type)
8528         {
8529         default:
8530           break;
8531
8532           /* Branch taken prediction relocations.  */
8533         case R_PPC_ADDR14_BRTAKEN:
8534         case R_PPC_REL14_BRTAKEN:
8535           branch_bit = BRANCH_PREDICT_BIT;
8536           /* Fall through.  */
8537
8538           /* Branch not taken prediction relocations.  */
8539         case R_PPC_ADDR14_BRNTAKEN:
8540         case R_PPC_REL14_BRNTAKEN:
8541           {
8542             unsigned int insn;
8543
8544             insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
8545             insn &= ~BRANCH_PREDICT_BIT;
8546             insn |= branch_bit;
8547
8548             from = (rel->r_offset
8549                     + input_section->output_offset
8550                     + input_section->output_section->vma);
8551
8552             /* Invert 'y' bit if not the default.  */
8553             if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
8554               insn ^= BRANCH_PREDICT_BIT;
8555
8556             bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
8557           }
8558           break;
8559
8560         case R_PPC_PLT16_HA:
8561           {
8562             unsigned int insn;
8563
8564             insn = bfd_get_32 (input_bfd,
8565                                contents + rel->r_offset - d_offset);
8566             if ((insn & (0x3f << 26)) == 15u << 26
8567                 && (insn & (0x1f << 16)) != 0)
8568               {
8569                 if (!bfd_link_pic (info))
8570                   {
8571                     /* Convert addis to lis.  */
8572                     insn &= ~(0x1f << 16);
8573                     bfd_put_32 (input_bfd, insn,
8574                                 contents + rel->r_offset - d_offset);
8575                   }
8576               }
8577             else if (bfd_link_pic (info))
8578               info->callbacks->einfo
8579                 (_("%P: %H: error: %s with unexpected instruction %x\n"),
8580                  input_bfd, input_section, rel->r_offset,
8581                  "R_PPC_PLT16_HA", insn);
8582           }
8583           break;
8584         }
8585
8586       if (ELIMINATE_COPY_RELOCS
8587           && h != NULL
8588           && !h->def_regular
8589           && h->protected_def
8590           && ppc_elf_hash_entry (h)->has_addr16_ha
8591           && ppc_elf_hash_entry (h)->has_addr16_lo
8592           && htab->params->pic_fixup > 0)
8593         {
8594           /* Convert lis;addi or lis;load/store accessing a protected
8595              variable defined in a shared library to PIC.  */
8596           unsigned int insn;
8597
8598           if (r_type == R_PPC_ADDR16_HA)
8599             {
8600               insn = bfd_get_32 (input_bfd,
8601                                  contents + rel->r_offset - d_offset);
8602               if ((insn & (0x3f << 26)) == (15u << 26)
8603                   && (insn & (0x1f << 16)) == 0 /* lis */)
8604                 {
8605                   bfd_byte *p;
8606                   bfd_vma off;
8607                   bfd_vma got_addr;
8608
8609                   p = (contents + input_section->size
8610                        - relax_info->workaround_size
8611                        - relax_info->picfixup_size
8612                        + picfixup_size);
8613                   off = (p - contents) - (rel->r_offset - d_offset);
8614                   if (off > 0x1fffffc || (off & 3) != 0)
8615                     info->callbacks->einfo
8616                       (_("%H: fixup branch overflow\n"),
8617                        input_bfd, input_section, rel->r_offset);
8618
8619                   bfd_put_32 (input_bfd, B | off,
8620                               contents + rel->r_offset - d_offset);
8621                   got_addr = (htab->elf.sgot->output_section->vma
8622                               + htab->elf.sgot->output_offset
8623                               + (h->got.offset & ~1));
8624                   wrel->r_offset = (p - contents) + d_offset;
8625                   wrel->r_info = ELF32_R_INFO (0, R_PPC_ADDR16_HA);
8626                   wrel->r_addend = got_addr;
8627                   insn &= ~0xffff;
8628                   insn |= ((unsigned int) (got_addr + 0x8000) >> 16) & 0xffff;
8629                   bfd_put_32 (input_bfd, insn, p);
8630
8631                   /* Convert lis to lwz, loading address from GOT.  */
8632                   insn &= ~0xffff;
8633                   insn ^= (32u ^ 15u) << 26;
8634                   insn |= (insn & (0x1f << 21)) >> 5;
8635                   insn |= got_addr & 0xffff;
8636                   bfd_put_32 (input_bfd, insn, p + 4);
8637
8638                   bfd_put_32 (input_bfd, B | ((-4 - off) & 0x3ffffff), p + 8);
8639                   picfixup_size += 12;
8640
8641                   /* Use one of the spare relocs, so --emit-relocs
8642                      output is reasonable.  */
8643                   memmove (rel + 1, rel, (relend - rel - 1) * sizeof (*rel));
8644                   wrel++, rel++;
8645                   rel->r_offset = wrel[-1].r_offset + 4;
8646                   rel->r_info = ELF32_R_INFO (0, R_PPC_ADDR16_LO);
8647                   rel->r_addend = wrel[-1].r_addend;
8648
8649                   /* Continue on as if we had a got reloc, to output
8650                      dynamic reloc.  */
8651                   r_type = R_PPC_GOT16_LO;
8652                 }
8653               else
8654                 _bfd_error_handler
8655                   /* xgettext:c-format */
8656                   (_("%pB(%pA+%#" PRIx64 "): error: "
8657                      "%s with unexpected instruction %#x"),
8658                    input_bfd, input_section, (uint64_t) rel->r_offset,
8659                    "R_PPC_ADDR16_HA", insn);
8660             }
8661           else if (r_type == R_PPC_ADDR16_LO)
8662             {
8663               insn = bfd_get_32 (input_bfd,
8664                                  contents + rel->r_offset - d_offset);
8665               if ((insn & (0x3f << 26)) == 14u << 26    /* addi */
8666                   || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8667                   || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8668                   || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8669                   || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8670                   || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8671                   || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8672                   || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8673                   || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8674                   || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8675                   || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8676                   || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8677                   || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8678                   || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8679                   || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
8680                       && (insn & 3) != 1)
8681                   || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
8682                       && ((insn & 3) == 0 || (insn & 3) == 3)))
8683                 {
8684                   /* Arrange to apply the reloc addend, if any.  */
8685                   relocation = 0;
8686                   unresolved_reloc = FALSE;
8687                   rel->r_info = ELF32_R_INFO (0, r_type);
8688                 }
8689               else
8690                 _bfd_error_handler
8691                   /* xgettext:c-format */
8692                   (_("%pB(%pA+%#" PRIx64 "): error: "
8693                      "%s with unexpected instruction %#x"),
8694                    input_bfd, input_section, (uint64_t) rel->r_offset,
8695                    "R_PPC_ADDR16_LO", insn);
8696             }
8697         }
8698
8699       ifunc = NULL;
8700       if (!htab->is_vxworks)
8701         {
8702           struct plt_entry *ent;
8703
8704           if (h != NULL)
8705             {
8706               if (h->type == STT_GNU_IFUNC)
8707                 ifunc = &h->plt.plist;
8708             }
8709           else if (local_got_offsets != NULL
8710                    && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8711             {
8712               struct plt_entry **local_plt;
8713
8714               local_plt = (struct plt_entry **) (local_got_offsets
8715                                                  + symtab_hdr->sh_info);
8716               ifunc = local_plt + r_symndx;
8717             }
8718
8719           ent = NULL;
8720           if (ifunc != NULL
8721               && (!bfd_link_pic (info)
8722                   || is_branch_reloc (r_type)
8723                   || r_type == R_PPC_PLT16_LO
8724                   || r_type == R_PPC_PLT16_HI
8725                   || r_type == R_PPC_PLT16_HA))
8726             {
8727               addend = 0;
8728               if (bfd_link_pic (info)
8729                   && (r_type == R_PPC_PLTREL24
8730                       || r_type == R_PPC_PLT16_LO
8731                       || r_type == R_PPC_PLT16_HI
8732                       || r_type == R_PPC_PLT16_HA))
8733                 addend = rel->r_addend;
8734               ent = find_plt_ent (ifunc, got2, addend);
8735             }
8736           if (ent != NULL)
8737             {
8738               if (bfd_link_pic (info)
8739                   && ent->sec != got2
8740                   && htab->plt_type != PLT_NEW
8741                   && (!htab->elf.dynamic_sections_created
8742                       || h == NULL
8743                       || h->dynindx == -1))
8744                 {
8745                   /* Uh oh, we are going to create a pic glink stub
8746                      for an ifunc (here for h == NULL and later in
8747                      finish_dynamic_symbol for h != NULL), and
8748                      apparently are using code compiled with
8749                      -mbss-plt.  The difficulty is that -mbss-plt code
8750                      gives no indication via a magic PLTREL24 addend
8751                      whether r30 is equal to _GLOBAL_OFFSET_TABLE_ or
8752                      is pointing into a .got2 section (and how far
8753                      into .got2).  */
8754                     info->callbacks->einfo
8755                       /* xgettext:c-format */
8756                       (_("%X%H: unsupported bss-plt -fPIC ifunc %s\n"),
8757                        input_bfd, input_section, rel->r_offset, sym_name);
8758                 }
8759
8760               unresolved_reloc = FALSE;
8761               if (htab->plt_type == PLT_NEW
8762                   || !htab->elf.dynamic_sections_created
8763                   || h == NULL
8764                   || h->dynindx == -1)
8765                 relocation = (htab->glink->output_section->vma
8766                               + htab->glink->output_offset
8767                               + (ent->glink_offset & ~1));
8768               else
8769                 relocation = (htab->elf.splt->output_section->vma
8770                               + htab->elf.splt->output_offset
8771                               + ent->plt.offset);
8772             }
8773         }
8774
8775       addend = rel->r_addend;
8776       save_unresolved_reloc = unresolved_reloc;
8777       howto = NULL;
8778       if (r_type < R_PPC_max)
8779         howto = ppc_elf_howto_table[r_type];
8780
8781       switch (r_type)
8782         {
8783         default:
8784           break;
8785
8786         case R_PPC_TPREL16_HA:
8787           if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
8788             {
8789               bfd_byte *p = contents + (rel->r_offset & ~3);
8790               unsigned int insn = bfd_get_32 (input_bfd, p);
8791               if ((insn & ((0x3f << 26) | 0x1f << 16))
8792                   != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */)
8793                 /* xgettext:c-format */
8794                 info->callbacks->minfo
8795                   (_("%H: warning: %s unexpected insn %#x.\n"),
8796                    input_bfd, input_section, rel->r_offset, howto->name, insn);
8797               else
8798                 bfd_put_32 (input_bfd, NOP, p);
8799             }
8800           break;
8801
8802         case R_PPC_TPREL16_LO:
8803           if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
8804             {
8805               bfd_byte *p = contents + (rel->r_offset & ~3);
8806               unsigned int insn = bfd_get_32 (input_bfd, p);
8807               insn &= ~(0x1f << 16);
8808               insn |= 2 << 16;
8809               bfd_put_32 (input_bfd, insn, p);
8810             }
8811           break;
8812         }
8813
8814       tls_type = 0;
8815       switch (r_type)
8816         {
8817         default:
8818           /* xgettext:c-format */
8819           _bfd_error_handler (_("%pB: %s unsupported"),
8820                               input_bfd, howto->name);
8821
8822           bfd_set_error (bfd_error_bad_value);
8823           ret = FALSE;
8824           goto copy_reloc;
8825
8826         case R_PPC_NONE:
8827         case R_PPC_TLS:
8828         case R_PPC_TLSGD:
8829         case R_PPC_TLSLD:
8830         case R_PPC_EMB_MRKREF:
8831         case R_PPC_GNU_VTINHERIT:
8832         case R_PPC_GNU_VTENTRY:
8833           goto copy_reloc;
8834
8835           /* GOT16 relocations.  Like an ADDR16 using the symbol's
8836              address in the GOT as relocation value instead of the
8837              symbol's value itself.  Also, create a GOT entry for the
8838              symbol and put the symbol value there.  */
8839         case R_PPC_GOT_TLSGD16:
8840         case R_PPC_GOT_TLSGD16_LO:
8841         case R_PPC_GOT_TLSGD16_HI:
8842         case R_PPC_GOT_TLSGD16_HA:
8843           tls_type = TLS_TLS | TLS_GD;
8844           goto dogot;
8845
8846         case R_PPC_GOT_TLSLD16:
8847         case R_PPC_GOT_TLSLD16_LO:
8848         case R_PPC_GOT_TLSLD16_HI:
8849         case R_PPC_GOT_TLSLD16_HA:
8850           tls_type = TLS_TLS | TLS_LD;
8851           goto dogot;
8852
8853         case R_PPC_GOT_TPREL16:
8854         case R_PPC_GOT_TPREL16_LO:
8855         case R_PPC_GOT_TPREL16_HI:
8856         case R_PPC_GOT_TPREL16_HA:
8857           tls_type = TLS_TLS | TLS_TPREL;
8858           goto dogot;
8859
8860         case R_PPC_GOT_DTPREL16:
8861         case R_PPC_GOT_DTPREL16_LO:
8862         case R_PPC_GOT_DTPREL16_HI:
8863         case R_PPC_GOT_DTPREL16_HA:
8864           tls_type = TLS_TLS | TLS_DTPREL;
8865           goto dogot;
8866
8867         case R_PPC_GOT16:
8868         case R_PPC_GOT16_LO:
8869         case R_PPC_GOT16_HI:
8870         case R_PPC_GOT16_HA:
8871           tls_mask = 0;
8872         dogot:
8873           {
8874             /* Relocation is to the entry for this symbol in the global
8875                offset table.  */
8876             bfd_vma off;
8877             bfd_vma *offp;
8878             unsigned long indx;
8879
8880             if (htab->elf.sgot == NULL)
8881               abort ();
8882
8883             indx = 0;
8884             if (tls_type == (TLS_TLS | TLS_LD)
8885                 && (h == NULL
8886                     || !h->def_dynamic))
8887               offp = &htab->tlsld_got.offset;
8888             else if (h != NULL)
8889               {
8890                 if (!htab->elf.dynamic_sections_created
8891                     || h->dynindx == -1
8892                     || SYMBOL_REFERENCES_LOCAL (info, h)
8893                     || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
8894                   /* This is actually a static link, or it is a
8895                      -Bsymbolic link and the symbol is defined
8896                      locally, or the symbol was forced to be local
8897                      because of a version file.  */
8898                   ;
8899                 else
8900                   {
8901                     indx = h->dynindx;
8902                     unresolved_reloc = FALSE;
8903                   }
8904                 offp = &h->got.offset;
8905               }
8906             else
8907               {
8908                 if (local_got_offsets == NULL)
8909                   abort ();
8910                 offp = &local_got_offsets[r_symndx];
8911               }
8912
8913             /* The offset must always be a multiple of 4.  We use the
8914                least significant bit to record whether we have already
8915                processed this entry.  */
8916             off = *offp;
8917             if ((off & 1) != 0)
8918               off &= ~1;
8919             else
8920               {
8921                 unsigned int tls_m = ((tls_mask & TLS_TLS) != 0
8922                                       ? tls_mask & (TLS_LD | TLS_GD | TLS_DTPREL
8923                                                     | TLS_TPREL | TLS_TPRELGD)
8924                                       : 0);
8925
8926                 if (offp == &htab->tlsld_got.offset)
8927                   tls_m = TLS_LD;
8928                 else if (h == NULL
8929                          || !h->def_dynamic)
8930                   tls_m &= ~TLS_LD;
8931
8932                 /* We might have multiple got entries for this sym.
8933                    Initialize them all.  */
8934                 do
8935                   {
8936                     int tls_ty = 0;
8937
8938                     if ((tls_m & TLS_LD) != 0)
8939                       {
8940                         tls_ty = TLS_TLS | TLS_LD;
8941                         tls_m &= ~TLS_LD;
8942                       }
8943                     else if ((tls_m & TLS_GD) != 0)
8944                       {
8945                         tls_ty = TLS_TLS | TLS_GD;
8946                         tls_m &= ~TLS_GD;
8947                       }
8948                     else if ((tls_m & TLS_DTPREL) != 0)
8949                       {
8950                         tls_ty = TLS_TLS | TLS_DTPREL;
8951                         tls_m &= ~TLS_DTPREL;
8952                       }
8953                     else if ((tls_m & (TLS_TPREL | TLS_TPRELGD)) != 0)
8954                       {
8955                         tls_ty = TLS_TLS | TLS_TPREL;
8956                         tls_m = 0;
8957                       }
8958
8959                     /* Generate relocs for the dynamic linker.  */
8960                     if (indx != 0
8961                         || (bfd_link_pic (info)
8962                             && (h == NULL
8963                                 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)
8964                                 || offp == &htab->tlsld_got.offset)
8965                             && !(tls_ty == (TLS_TLS | TLS_TPREL)
8966                                  && bfd_link_executable (info)
8967                                  && SYMBOL_REFERENCES_LOCAL (info, h))))
8968                       {
8969                         asection *rsec = htab->elf.srelgot;
8970                         bfd_byte * loc;
8971
8972                         if (ifunc != NULL)
8973                           {
8974                             rsec = htab->elf.irelplt;
8975                             if (indx == 0)
8976                               htab->local_ifunc_resolver = 1;
8977                             else if (is_static_defined (h))
8978                               htab->maybe_local_ifunc_resolver = 1;
8979                           }
8980                         outrel.r_offset = (htab->elf.sgot->output_section->vma
8981                                            + htab->elf.sgot->output_offset
8982                                            + off);
8983                         outrel.r_addend = 0;
8984                         if (tls_ty & (TLS_LD | TLS_GD))
8985                           {
8986                             outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
8987                             if (tls_ty == (TLS_TLS | TLS_GD))
8988                               {
8989                                 loc = rsec->contents;
8990                                 loc += (rsec->reloc_count++
8991                                         * sizeof (Elf32_External_Rela));
8992                                 bfd_elf32_swap_reloca_out (output_bfd,
8993                                                            &outrel, loc);
8994                                 outrel.r_offset += 4;
8995                                 outrel.r_info
8996                                   = ELF32_R_INFO (indx, R_PPC_DTPREL32);
8997                               }
8998                           }
8999                         else if (tls_ty == (TLS_TLS | TLS_DTPREL))
9000                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
9001                         else if (tls_ty == (TLS_TLS | TLS_TPREL))
9002                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
9003                         else if (indx != 0)
9004                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
9005                         else if (ifunc != NULL)
9006                           outrel.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
9007                         else
9008                           outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
9009                         if (indx == 0 && tls_ty != (TLS_TLS | TLS_LD))
9010                           {
9011                             outrel.r_addend += relocation;
9012                             if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
9013                               {
9014                                 if (htab->elf.tls_sec == NULL)
9015                                   outrel.r_addend = 0;
9016                                 else
9017                                   outrel.r_addend -= htab->elf.tls_sec->vma;
9018                               }
9019                           }
9020                         loc = rsec->contents;
9021                         loc += (rsec->reloc_count++
9022                                 * sizeof (Elf32_External_Rela));
9023                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
9024                       }
9025
9026                     /* Init the .got section contents if we're not
9027                        emitting a reloc.  */
9028                     else
9029                       {
9030                         bfd_vma value = relocation;
9031
9032                         if (tls_ty != 0)
9033                           {
9034                             if (htab->elf.tls_sec == NULL)
9035                               value = 0;
9036                             else
9037                               {
9038                                 if (tls_ty & TLS_LD)
9039                                   value = 0;
9040                                 else
9041                                   value -= htab->elf.tls_sec->vma + DTP_OFFSET;
9042                                 if (tls_ty & TLS_TPREL)
9043                                   value += DTP_OFFSET - TP_OFFSET;
9044                               }
9045
9046                             if (tls_ty & (TLS_LD | TLS_GD))
9047                               {
9048                                 bfd_put_32 (input_bfd, value,
9049                                             htab->elf.sgot->contents + off + 4);
9050                                 value = 1;
9051                               }
9052                           }
9053                         bfd_put_32 (input_bfd, value,
9054                                     htab->elf.sgot->contents + off);
9055                       }
9056
9057                     off += 4;
9058                     if (tls_ty & (TLS_LD | TLS_GD))
9059                       off += 4;
9060                   }
9061                 while (tls_m != 0);
9062
9063                 off = *offp;
9064                 *offp = off | 1;
9065               }
9066
9067             if (off >= (bfd_vma) -2)
9068               abort ();
9069
9070             if ((tls_type & TLS_TLS) != 0)
9071               {
9072                 if (tls_type != (TLS_TLS | TLS_LD))
9073                   {
9074                     if ((tls_mask & TLS_LD) != 0
9075                         && !(h == NULL
9076                              || !h->def_dynamic))
9077                       off += 8;
9078                     if (tls_type != (TLS_TLS | TLS_GD))
9079                       {
9080                         if ((tls_mask & TLS_GD) != 0)
9081                           off += 8;
9082                         if (tls_type != (TLS_TLS | TLS_DTPREL))
9083                           {
9084                             if ((tls_mask & TLS_DTPREL) != 0)
9085                               off += 4;
9086                           }
9087                       }
9088                   }
9089               }
9090
9091             /* If here for a picfixup, we're done.  */
9092             if (r_type != ELF32_R_TYPE (rel->r_info))
9093               goto copy_reloc;
9094
9095             relocation = (htab->elf.sgot->output_section->vma
9096                           + htab->elf.sgot->output_offset
9097                           + off
9098                           - SYM_VAL (htab->elf.hgot));
9099
9100             /* Addends on got relocations don't make much sense.
9101                x+off@got is actually x@got+off, and since the got is
9102                generated by a hash table traversal, the value in the
9103                got at entry m+n bears little relation to the entry m.  */
9104             if (addend != 0)
9105               info->callbacks->einfo
9106                 /* xgettext:c-format */
9107                 (_("%H: non-zero addend on %s reloc against `%s'\n"),
9108                  input_bfd, input_section, rel->r_offset,
9109                  howto->name,
9110                  sym_name);
9111           }
9112           break;
9113
9114           /* Relocations that need no special processing.  */
9115         case R_PPC_LOCAL24PC:
9116           /* It makes no sense to point a local relocation
9117              at a symbol not in this object.  */
9118           if (unresolved_reloc)
9119             {
9120               (*info->callbacks->undefined_symbol) (info,
9121                                                     h->root.root.string,
9122                                                     input_bfd,
9123                                                     input_section,
9124                                                     rel->r_offset,
9125                                                     TRUE);
9126               goto copy_reloc;
9127             }
9128           if (h != NULL && h->type == STT_GNU_IFUNC && bfd_link_pic (info))
9129             {
9130               /* @local on an ifunc does not really make sense since
9131                  the ifunc resolver can take you anywhere.  More
9132                  seriously, calls to ifuncs must go through a plt call
9133                  stub, and for pic the plt call stubs uses r30 to
9134                  access the PLT.  The problem is that a call that is
9135                  local won't have the +32k reloc addend trick marking
9136                  -fPIC code, so the linker won't know whether r30 is
9137                  _GLOBAL_OFFSET_TABLE_ or pointing into a .got2 section.  */
9138               /* xgettext:c-format */
9139               info->callbacks->einfo (_("%X%H: @local call to ifunc %s\n"),
9140                                       input_bfd, input_section, rel->r_offset,
9141                                       h->root.root.string);
9142             }
9143           break;
9144
9145         case R_PPC_DTPREL16:
9146         case R_PPC_DTPREL16_LO:
9147         case R_PPC_DTPREL16_HI:
9148         case R_PPC_DTPREL16_HA:
9149           if (htab->elf.tls_sec != NULL)
9150             addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
9151           break;
9152
9153           /* Relocations that may need to be propagated if this is a shared
9154              object.  */
9155         case R_PPC_TPREL16:
9156         case R_PPC_TPREL16_LO:
9157         case R_PPC_TPREL16_HI:
9158         case R_PPC_TPREL16_HA:
9159           if (h != NULL
9160               && h->root.type == bfd_link_hash_undefweak
9161               && h->dynindx == -1)
9162             {
9163               /* Make this relocation against an undefined weak symbol
9164                  resolve to zero.  This is really just a tweak, since
9165                  code using weak externs ought to check that they are
9166                  defined before using them.  */
9167               bfd_byte *p = contents + rel->r_offset - d_offset;
9168               unsigned int insn = bfd_get_32 (input_bfd, p);
9169               insn = _bfd_elf_ppc_at_tprel_transform (insn, 2);
9170               if (insn != 0)
9171                 bfd_put_32 (input_bfd, insn, p);
9172               break;
9173             }
9174           if (htab->elf.tls_sec != NULL)
9175             addend -= htab->elf.tls_sec->vma + TP_OFFSET;
9176           /* The TPREL16 relocs shouldn't really be used in shared
9177              libs or with non-local symbols as that will result in
9178              DT_TEXTREL being set, but support them anyway.  */
9179           goto dodyn;
9180
9181         case R_PPC_TPREL32:
9182           if (htab->elf.tls_sec != NULL)
9183             addend -= htab->elf.tls_sec->vma + TP_OFFSET;
9184           goto dodyn;
9185
9186         case R_PPC_DTPREL32:
9187           if (htab->elf.tls_sec != NULL)
9188             addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
9189           goto dodyn;
9190
9191         case R_PPC_DTPMOD32:
9192           relocation = 1;
9193           addend = 0;
9194           goto dodyn;
9195
9196         case R_PPC_REL16:
9197         case R_PPC_REL16_LO:
9198         case R_PPC_REL16_HI:
9199         case R_PPC_REL16_HA:
9200         case R_PPC_REL16DX_HA:
9201           break;
9202
9203         case R_PPC_REL32:
9204           if (h == NULL || h == htab->elf.hgot)
9205             break;
9206           /* fall through */
9207
9208         case R_PPC_ADDR32:
9209         case R_PPC_ADDR16:
9210         case R_PPC_ADDR16_LO:
9211         case R_PPC_ADDR16_HI:
9212         case R_PPC_ADDR16_HA:
9213         case R_PPC_UADDR32:
9214         case R_PPC_UADDR16:
9215           goto dodyn;
9216
9217         case R_PPC_VLE_REL8:
9218         case R_PPC_VLE_REL15:
9219         case R_PPC_VLE_REL24:
9220         case R_PPC_REL24:
9221         case R_PPC_REL14:
9222         case R_PPC_REL14_BRTAKEN:
9223         case R_PPC_REL14_BRNTAKEN:
9224           /* If these relocations are not to a named symbol, they can be
9225              handled right here, no need to bother the dynamic linker.  */
9226           if (SYMBOL_CALLS_LOCAL (info, h)
9227               || h == htab->elf.hgot)
9228             break;
9229           /* fall through */
9230
9231         case R_PPC_ADDR24:
9232         case R_PPC_ADDR14:
9233         case R_PPC_ADDR14_BRTAKEN:
9234         case R_PPC_ADDR14_BRNTAKEN:
9235           if (h != NULL && !bfd_link_pic (info))
9236             break;
9237           /* fall through */
9238
9239         dodyn:
9240           if ((input_section->flags & SEC_ALLOC) == 0
9241               || is_vxworks_tls)
9242             break;
9243
9244           if (bfd_link_pic (info)
9245               ? ((h == NULL
9246                   || ppc_elf_hash_entry (h)->dyn_relocs != NULL)
9247                  && ((h != NULL && pc_dynrelocs (h))
9248                      || must_be_dyn_reloc (info, r_type)))
9249               : (h != NULL
9250                  && ppc_elf_hash_entry (h)->dyn_relocs != NULL))
9251             {
9252               int skip;
9253               bfd_byte *loc;
9254               asection *sreloc;
9255               long indx = 0;
9256
9257 #ifdef DEBUG
9258               fprintf (stderr, "ppc_elf_relocate_section needs to "
9259                        "create relocation for %s\n",
9260                        (h && h->root.root.string
9261                         ? h->root.root.string : "<unknown>"));
9262 #endif
9263
9264               /* When generating a shared object, these relocations
9265                  are copied into the output file to be resolved at run
9266                  time.  */
9267               skip = 0;
9268               outrel.r_offset = _bfd_elf_section_offset (output_bfd, info,
9269                                                          input_section,
9270                                                          rel->r_offset);
9271               if (outrel.r_offset == (bfd_vma) -1
9272                   || outrel.r_offset == (bfd_vma) -2)
9273                 skip = (int) outrel.r_offset;
9274               outrel.r_offset += (input_section->output_section->vma
9275                                   + input_section->output_offset);
9276
9277               if (skip)
9278                 memset (&outrel, 0, sizeof outrel);
9279               else if (!SYMBOL_REFERENCES_LOCAL (info, h))
9280                 {
9281                   indx = h->dynindx;
9282                   BFD_ASSERT (indx != -1);
9283                   unresolved_reloc = FALSE;
9284                   outrel.r_info = ELF32_R_INFO (indx, r_type);
9285                   outrel.r_addend = rel->r_addend;
9286                 }
9287               else
9288                 {
9289                   outrel.r_addend = relocation + rel->r_addend;
9290
9291                   if (r_type != R_PPC_ADDR32)
9292                     {
9293                       if (ifunc != NULL)
9294                         {
9295                           /* If we get here when building a static
9296                              executable, then the libc startup function
9297                              responsible for applying indirect function
9298                              relocations is going to complain about
9299                              the reloc type.
9300                              If we get here when building a dynamic
9301                              executable, it will be because we have
9302                              a text relocation.  The dynamic loader
9303                              will set the text segment writable and
9304                              non-executable to apply text relocations.
9305                              So we'll segfault when trying to run the
9306                              indirection function to resolve the reloc.  */
9307                           info->callbacks->einfo
9308                             /* xgettext:c-format */
9309                             (_("%H: relocation %s for indirect "
9310                                "function %s unsupported\n"),
9311                              input_bfd, input_section, rel->r_offset,
9312                              howto->name,
9313                              sym_name);
9314                           ret = FALSE;
9315                         }
9316                       else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
9317                         ;
9318                       else if (sec == NULL || sec->owner == NULL)
9319                         {
9320                           bfd_set_error (bfd_error_bad_value);
9321                           ret = FALSE;
9322                         }
9323                       else
9324                         {
9325                           asection *osec;
9326
9327                           /* We are turning this relocation into one
9328                              against a section symbol.  It would be
9329                              proper to subtract the symbol's value,
9330                              osec->vma, from the emitted reloc addend,
9331                              but ld.so expects buggy relocs.
9332                              FIXME: Why not always use a zero index?  */
9333                           osec = sec->output_section;
9334                           indx = elf_section_data (osec)->dynindx;
9335                           if (indx == 0)
9336                             {
9337                               osec = htab->elf.text_index_section;
9338                               indx = elf_section_data (osec)->dynindx;
9339                             }
9340                           BFD_ASSERT (indx != 0);
9341 #ifdef DEBUG
9342                           if (indx == 0)
9343                             printf ("indx=%ld section=%s flags=%08x name=%s\n",
9344                                     indx, osec->name, osec->flags,
9345                                     h->root.root.string);
9346 #endif
9347                         }
9348
9349                       outrel.r_info = ELF32_R_INFO (indx, r_type);
9350                     }
9351                   else if (ifunc != NULL)
9352                     outrel.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
9353                   else
9354                     outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
9355                 }
9356
9357               sreloc = elf_section_data (input_section)->sreloc;
9358               if (ifunc)
9359                 {
9360                   sreloc = htab->elf.irelplt;
9361                   if (indx == 0)
9362                     htab->local_ifunc_resolver = 1;
9363                   else if (is_static_defined (h))
9364                     htab->maybe_local_ifunc_resolver = 1;
9365                 }
9366               if (sreloc == NULL)
9367                 return FALSE;
9368
9369               loc = sreloc->contents;
9370               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
9371               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
9372
9373               if (skip == -1)
9374                 goto copy_reloc;
9375
9376               /* This reloc will be computed at runtime.  Clear the memory
9377                  so that it contains a predictable value for prelink.  */
9378               if (!skip)
9379                 {
9380                   relocation = howto->pc_relative ? outrel.r_offset : 0;
9381                   addend = 0;
9382                   break;
9383                 }
9384             }
9385           break;
9386
9387         case R_PPC_RELAX_PLT:
9388         case R_PPC_RELAX_PLTREL24:
9389           if (h != NULL)
9390             {
9391               struct plt_entry *ent;
9392               bfd_vma got2_addend = 0;
9393
9394               if (r_type == R_PPC_RELAX_PLTREL24)
9395                 {
9396                   if (bfd_link_pic (info))
9397                     got2_addend = addend;
9398                   addend = 0;
9399                 }
9400               ent = find_plt_ent (&h->plt.plist, got2, got2_addend);
9401               if (htab->plt_type == PLT_NEW)
9402                 relocation = (htab->glink->output_section->vma
9403                               + htab->glink->output_offset
9404                               + ent->glink_offset);
9405               else
9406                 relocation = (htab->elf.splt->output_section->vma
9407                               + htab->elf.splt->output_offset
9408                               + ent->plt.offset);
9409             }
9410           /* Fall through.  */
9411
9412         case R_PPC_RELAX:
9413           {
9414             const int *stub;
9415             size_t size;
9416             size_t insn_offset = rel->r_offset;
9417             unsigned int insn;
9418
9419             if (bfd_link_pic (info))
9420               {
9421                 relocation -= (input_section->output_section->vma
9422                                + input_section->output_offset
9423                                + rel->r_offset - 4);
9424                 stub = shared_stub_entry;
9425                 bfd_put_32 (input_bfd, stub[0], contents + insn_offset - 12);
9426                 bfd_put_32 (input_bfd, stub[1], contents + insn_offset - 8);
9427                 bfd_put_32 (input_bfd, stub[2], contents + insn_offset - 4);
9428                 stub += 3;
9429                 size = ARRAY_SIZE (shared_stub_entry) - 3;
9430               }
9431             else
9432               {
9433                 stub = stub_entry;
9434                 size = ARRAY_SIZE (stub_entry);
9435               }
9436
9437             relocation += addend;
9438             if (bfd_link_relocatable (info))
9439               relocation = 0;
9440
9441             /* First insn is HA, second is LO.  */
9442             insn = *stub++;
9443             insn |= ((relocation + 0x8000) >> 16) & 0xffff;
9444             bfd_put_32 (input_bfd, insn, contents + insn_offset);
9445             insn_offset += 4;
9446
9447             insn = *stub++;
9448             insn |= relocation & 0xffff;
9449             bfd_put_32 (input_bfd, insn, contents + insn_offset);
9450             insn_offset += 4;
9451             size -= 2;
9452
9453             while (size != 0)
9454               {
9455                 insn = *stub++;
9456                 --size;
9457                 bfd_put_32 (input_bfd, insn, contents + insn_offset);
9458                 insn_offset += 4;
9459               }
9460
9461             /* Rewrite the reloc and convert one of the trailing nop
9462                relocs to describe this relocation.  */
9463             BFD_ASSERT (ELF32_R_TYPE (relend[-1].r_info) == R_PPC_NONE);
9464             /* The relocs are at the bottom 2 bytes */
9465             wrel->r_offset = rel->r_offset + d_offset;
9466             wrel->r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_HA);
9467             wrel->r_addend = rel->r_addend;
9468             memmove (wrel + 1, wrel, (relend - wrel - 1) * sizeof (*wrel));
9469             wrel++, rel++;
9470             wrel->r_offset += 4;
9471             wrel->r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_LO);
9472           }
9473           continue;
9474
9475           /* Indirect .sdata relocation.  */
9476         case R_PPC_EMB_SDAI16:
9477           BFD_ASSERT (htab->sdata[0].section != NULL);
9478           if (!is_static_defined (htab->sdata[0].sym))
9479             {
9480               unresolved_reloc = TRUE;
9481               break;
9482             }
9483           relocation
9484             = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[0],
9485                                                  h, relocation, rel);
9486           addend = 0;
9487           break;
9488
9489           /* Indirect .sdata2 relocation.  */
9490         case R_PPC_EMB_SDA2I16:
9491           BFD_ASSERT (htab->sdata[1].section != NULL);
9492           if (!is_static_defined (htab->sdata[1].sym))
9493             {
9494               unresolved_reloc = TRUE;
9495               break;
9496             }
9497           relocation
9498             = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[1],
9499                                                  h, relocation, rel);
9500           addend = 0;
9501           break;
9502
9503           /* Handle the TOC16 reloc.  We want to use the offset within the .got
9504              section, not the actual VMA.  This is appropriate when generating
9505              an embedded ELF object, for which the .got section acts like the
9506              AIX .toc section.  */
9507         case R_PPC_TOC16:                       /* phony GOT16 relocations */
9508           if (sec == NULL || sec->output_section == NULL)
9509             {
9510               unresolved_reloc = TRUE;
9511               break;
9512             }
9513           BFD_ASSERT (strcmp (bfd_get_section_name (sec->owner, sec),
9514                               ".got") == 0
9515                       || strcmp (bfd_get_section_name (sec->owner, sec),
9516                                  ".cgot") == 0);
9517
9518           addend -= sec->output_section->vma + sec->output_offset + 0x8000;
9519           break;
9520
9521         case R_PPC_PLTREL24:
9522           if (h != NULL && ifunc == NULL)
9523             {
9524               struct plt_entry *ent;
9525
9526               ent = find_plt_ent (&h->plt.plist, got2,
9527                                   bfd_link_pic (info) ? addend : 0);
9528               if (ent == NULL
9529                   || htab->elf.splt == NULL)
9530                 {
9531                   /* We didn't make a PLT entry for this symbol.  This
9532                      happens when statically linking PIC code, or when
9533                      using -Bsymbolic.  */
9534                 }
9535               else
9536                 {
9537                   /* Relocation is to the entry for this symbol in the
9538                      procedure linkage table.  */
9539                   unresolved_reloc = FALSE;
9540                   if (htab->plt_type == PLT_NEW)
9541                     relocation = (htab->glink->output_section->vma
9542                                   + htab->glink->output_offset
9543                                   + ent->glink_offset);
9544                   else
9545                     relocation = (htab->elf.splt->output_section->vma
9546                                   + htab->elf.splt->output_offset
9547                                   + ent->plt.offset);
9548                 }
9549             }
9550
9551           /* R_PPC_PLTREL24 is rather special.  If non-zero, the
9552              addend specifies the GOT pointer offset within .got2.
9553              Don't apply it to the relocation field.  */
9554           addend = 0;
9555           break;
9556
9557         case R_PPC_PLTSEQ:
9558         case R_PPC_PLTCALL:
9559         case R_PPC_PLT16_LO:
9560         case R_PPC_PLT16_HI:
9561         case R_PPC_PLT16_HA:
9562           plt_list = NULL;
9563           if (h != NULL)
9564             plt_list = &h->plt.plist;
9565           else if (ifunc != NULL)
9566             plt_list = ifunc;
9567           else if (local_got_offsets != NULL)
9568             {
9569               struct plt_entry **local_plt;
9570               local_plt = (struct plt_entry **) (local_got_offsets
9571                                                  + symtab_hdr->sh_info);
9572               plt_list = local_plt + r_symndx;
9573             }
9574           unresolved_reloc = TRUE;
9575           if (plt_list != NULL)
9576             {
9577               struct plt_entry *ent;
9578
9579               ent = find_plt_ent (plt_list, got2,
9580                                   bfd_link_pic (info) ? addend : 0);
9581               if (ent != NULL && ent->plt.offset != (bfd_vma) -1)
9582                 {
9583                   asection *plt;
9584
9585                   unresolved_reloc = FALSE;
9586                   plt = htab->elf.splt;
9587                   if (!htab->elf.dynamic_sections_created
9588                       || h == NULL
9589                       || h->dynindx == -1)
9590                     {
9591                       if (ifunc != NULL)
9592                         plt = htab->elf.iplt;
9593                       else
9594                         plt = htab->pltlocal;
9595                     }
9596                   relocation = (plt->output_section->vma
9597                                 + plt->output_offset
9598                                 + ent->plt.offset);
9599                   if (bfd_link_pic (info))
9600                     {
9601                       bfd_vma got = 0;
9602
9603                       if (ent->addend >= 32768)
9604                         got = (ent->addend
9605                                + ent->sec->output_section->vma
9606                                + ent->sec->output_offset);
9607                       else
9608                         got = SYM_VAL (htab->elf.hgot);
9609                       relocation -= got;
9610                     }
9611                 }
9612             }
9613           addend = 0;
9614           break;
9615
9616           /* Relocate against _SDA_BASE_.  */
9617         case R_PPC_SDAREL16:
9618           {
9619             const char *name;
9620             struct elf_link_hash_entry *sda = htab->sdata[0].sym;
9621
9622             if (sec == NULL
9623                 || sec->output_section == NULL
9624                 || !is_static_defined (sda))
9625               {
9626                 unresolved_reloc = TRUE;
9627                 break;
9628               }
9629             addend -= SYM_VAL (sda);
9630
9631             name = bfd_get_section_name (output_bfd, sec->output_section);
9632             if (!(strcmp (name, ".sdata") == 0
9633                   || strcmp (name, ".sbss") == 0))
9634               {
9635                 _bfd_error_handler
9636                   /* xgettext:c-format */
9637                   (_("%pB: the target (%s) of a %s relocation is "
9638                      "in the wrong output section (%s)"),
9639                    input_bfd,
9640                    sym_name,
9641                    howto->name,
9642                    name);
9643               }
9644           }
9645           break;
9646
9647           /* Relocate against _SDA2_BASE_.  */
9648         case R_PPC_EMB_SDA2REL:
9649           {
9650             const char *name;
9651             struct elf_link_hash_entry *sda = htab->sdata[1].sym;
9652
9653             if (sec == NULL
9654                 || sec->output_section == NULL
9655                 || !is_static_defined (sda))
9656               {
9657                 unresolved_reloc = TRUE;
9658                 break;
9659               }
9660             addend -= SYM_VAL (sda);
9661
9662             name = bfd_get_section_name (output_bfd, sec->output_section);
9663             if (!(strcmp (name, ".sdata2") == 0
9664                   || strcmp (name, ".sbss2") == 0))
9665               {
9666                 _bfd_error_handler
9667                   /* xgettext:c-format */
9668                   (_("%pB: the target (%s) of a %s relocation is "
9669                      "in the wrong output section (%s)"),
9670                    input_bfd,
9671                    sym_name,
9672                    howto->name,
9673                    name);
9674               }
9675           }
9676           break;
9677
9678         case R_PPC_VLE_LO16A:
9679           relocation = relocation + addend;
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_LO16D:
9686           relocation = relocation + addend;
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         case R_PPC_VLE_HI16A:
9693           relocation = (relocation + addend) >> 16;
9694           ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9695                                contents + rel->r_offset, relocation,
9696                                split16a_type, htab->params->vle_reloc_fixup);
9697           goto copy_reloc;
9698
9699         case R_PPC_VLE_HI16D:
9700           relocation = (relocation + addend) >> 16;
9701           ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9702                                contents + rel->r_offset, relocation,
9703                                split16d_type, htab->params->vle_reloc_fixup);
9704           goto copy_reloc;
9705
9706         case R_PPC_VLE_HA16A:
9707           relocation = (relocation + addend + 0x8000) >> 16;
9708           ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9709                                contents + rel->r_offset, relocation,
9710                                split16a_type, htab->params->vle_reloc_fixup);
9711           goto copy_reloc;
9712
9713         case R_PPC_VLE_HA16D:
9714           relocation = (relocation + addend + 0x8000) >> 16;
9715           ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9716                                contents + rel->r_offset, relocation,
9717                                split16d_type, htab->params->vle_reloc_fixup);
9718           goto copy_reloc;
9719
9720           /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0.  */
9721         case R_PPC_EMB_SDA21:
9722         case R_PPC_VLE_SDA21:
9723         case R_PPC_EMB_RELSDA:
9724         case R_PPC_VLE_SDA21_LO:
9725           {
9726             const char *name;
9727             int reg;
9728             unsigned int insn;
9729             struct elf_link_hash_entry *sda = NULL;
9730
9731             if (sec == NULL || sec->output_section == NULL)
9732               {
9733                 unresolved_reloc = TRUE;
9734                 break;
9735               }
9736
9737             name = bfd_get_section_name (output_bfd, sec->output_section);
9738             if (strcmp (name, ".sdata") == 0
9739                 || strcmp (name, ".sbss") == 0)
9740               {
9741                 reg = 13;
9742                 sda = htab->sdata[0].sym;
9743               }
9744             else if (strcmp (name, ".sdata2") == 0
9745                      || strcmp (name, ".sbss2") == 0)
9746               {
9747                 reg = 2;
9748                 sda = htab->sdata[1].sym;
9749               }
9750             else if (strcmp (name, ".PPC.EMB.sdata0") == 0
9751                      || strcmp (name, ".PPC.EMB.sbss0") == 0)
9752               {
9753                 reg = 0;
9754               }
9755             else
9756               {
9757                 _bfd_error_handler
9758                   /* xgettext:c-format */
9759                   (_("%pB: the target (%s) of a %s relocation is "
9760                      "in the wrong output section (%s)"),
9761                    input_bfd,
9762                    sym_name,
9763                    howto->name,
9764                    name);
9765
9766                 bfd_set_error (bfd_error_bad_value);
9767                 ret = FALSE;
9768                 goto copy_reloc;
9769               }
9770
9771             if (sda != NULL)
9772               {
9773                 if (!is_static_defined (sda))
9774                   {
9775                     unresolved_reloc = TRUE;
9776                     break;
9777                   }
9778                 addend -= SYM_VAL (sda);
9779               }
9780
9781             insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
9782             if (reg == 0
9783                 && (r_type == R_PPC_VLE_SDA21
9784                     || r_type == R_PPC_VLE_SDA21_LO))
9785               {
9786                 relocation = relocation + addend;
9787                 addend = 0;
9788
9789                 /* Force e_li insn, keeping RT from original insn.  */
9790                 insn &= 0x1f << 21;
9791                 insn |= 28u << 26;
9792
9793                 /* We have an li20 field, bits 17..20, 11..15, 21..31.  */
9794                 /* Top 4 bits of value to 17..20.  */
9795                 insn |= (relocation & 0xf0000) >> 5;
9796                 /* Next 5 bits of the value to 11..15.  */
9797                 insn |= (relocation & 0xf800) << 5;
9798                 /* And the final 11 bits of the value to bits 21 to 31.  */
9799                 insn |= relocation & 0x7ff;
9800
9801                 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
9802
9803                 if (r_type == R_PPC_VLE_SDA21
9804                     && ((relocation + 0x80000) & 0xffffffff) > 0x100000)
9805                   goto overflow;
9806                 goto copy_reloc;
9807               }
9808             else if (r_type == R_PPC_EMB_SDA21
9809                      || r_type == R_PPC_VLE_SDA21
9810                      || r_type == R_PPC_VLE_SDA21_LO)
9811               {
9812                 /* Fill in register field.  */
9813                 insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
9814               }
9815             bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
9816           }
9817           break;
9818
9819         case R_PPC_VLE_SDAREL_LO16A:
9820         case R_PPC_VLE_SDAREL_LO16D:
9821         case R_PPC_VLE_SDAREL_HI16A:
9822         case R_PPC_VLE_SDAREL_HI16D:
9823         case R_PPC_VLE_SDAREL_HA16A:
9824         case R_PPC_VLE_SDAREL_HA16D:
9825           {
9826             bfd_vma value;
9827             const char *name;
9828             struct elf_link_hash_entry *sda = NULL;
9829
9830             if (sec == NULL || sec->output_section == NULL)
9831               {
9832                 unresolved_reloc = TRUE;
9833                 break;
9834               }
9835
9836             name = bfd_get_section_name (output_bfd, sec->output_section);
9837             if (strcmp (name, ".sdata") == 0
9838                 || strcmp (name, ".sbss") == 0)
9839               sda = htab->sdata[0].sym;
9840             else if (strcmp (name, ".sdata2") == 0
9841                      || strcmp (name, ".sbss2") == 0)
9842               sda = htab->sdata[1].sym;
9843             else
9844               {
9845                 _bfd_error_handler
9846                   /* xgettext:c-format */
9847                   (_("%pB: the target (%s) of a %s relocation is "
9848                      "in the wrong output section (%s)"),
9849                    input_bfd,
9850                    sym_name,
9851                    howto->name,
9852                    name);
9853
9854                 bfd_set_error (bfd_error_bad_value);
9855                 ret = FALSE;
9856                 goto copy_reloc;
9857               }
9858
9859             if (sda == NULL || !is_static_defined (sda))
9860               {
9861                 unresolved_reloc = TRUE;
9862                 break;
9863               }
9864             value = relocation + addend - SYM_VAL (sda);
9865
9866             if (r_type == R_PPC_VLE_SDAREL_LO16A)
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             else if (r_type == R_PPC_VLE_SDAREL_LO16D)
9872               ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9873                                    contents + rel->r_offset, value,
9874                                    split16d_type,
9875                                    htab->params->vle_reloc_fixup);
9876             else if (r_type == R_PPC_VLE_SDAREL_HI16A)
9877               {
9878                 value = value >> 16;
9879                 ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9880                                      contents + rel->r_offset, value,
9881                                      split16a_type,
9882                                      htab->params->vle_reloc_fixup);
9883               }
9884             else if (r_type == R_PPC_VLE_SDAREL_HI16D)
9885               {
9886                 value = value >> 16;
9887                 ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9888                                      contents + rel->r_offset, value,
9889                                      split16d_type,
9890                                      htab->params->vle_reloc_fixup);
9891               }
9892             else if (r_type == R_PPC_VLE_SDAREL_HA16A)
9893               {
9894                 value = (value + 0x8000) >> 16;
9895                 ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9896                                      contents + rel->r_offset, value,
9897                                      split16a_type,
9898                                      htab->params->vle_reloc_fixup);
9899               }
9900             else if (r_type == R_PPC_VLE_SDAREL_HA16D)
9901               {
9902                 value = (value + 0x8000) >> 16;
9903                 ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9904                                      contents + rel->r_offset, value,
9905                                      split16d_type,
9906                                      htab->params->vle_reloc_fixup);
9907               }
9908           }
9909           goto copy_reloc;
9910
9911         case R_PPC_VLE_ADDR20:
9912           ppc_elf_vle_split20 (output_bfd, contents + rel->r_offset, relocation);
9913           continue;
9914
9915           /* Relocate against the beginning of the section.  */
9916         case R_PPC_SECTOFF:
9917         case R_PPC_SECTOFF_LO:
9918         case R_PPC_SECTOFF_HI:
9919         case R_PPC_SECTOFF_HA:
9920           if (sec == NULL || sec->output_section == NULL)
9921             {
9922               unresolved_reloc = TRUE;
9923               break;
9924             }
9925           addend -= sec->output_section->vma;
9926           break;
9927
9928           /* Negative relocations.  */
9929         case R_PPC_EMB_NADDR32:
9930         case R_PPC_EMB_NADDR16:
9931         case R_PPC_EMB_NADDR16_LO:
9932         case R_PPC_EMB_NADDR16_HI:
9933         case R_PPC_EMB_NADDR16_HA:
9934           addend -= 2 * relocation;
9935           break;
9936
9937         case R_PPC_COPY:
9938         case R_PPC_GLOB_DAT:
9939         case R_PPC_JMP_SLOT:
9940         case R_PPC_RELATIVE:
9941         case R_PPC_IRELATIVE:
9942         case R_PPC_PLT32:
9943         case R_PPC_PLTREL32:
9944         case R_PPC_ADDR30:
9945         case R_PPC_EMB_RELSEC16:
9946         case R_PPC_EMB_RELST_LO:
9947         case R_PPC_EMB_RELST_HI:
9948         case R_PPC_EMB_RELST_HA:
9949         case R_PPC_EMB_BIT_FLD:
9950           /* xgettext:c-format */
9951           _bfd_error_handler (_("%pB: %s unsupported"),
9952                               input_bfd, howto->name);
9953
9954           bfd_set_error (bfd_error_invalid_operation);
9955           ret = FALSE;
9956           goto copy_reloc;
9957         }
9958
9959       switch (r_type)
9960         {
9961         default:
9962           break;
9963
9964         case R_PPC_PLTCALL:
9965           if (unresolved_reloc)
9966             {
9967               bfd_byte *p = contents + rel->r_offset;
9968               unsigned int insn = bfd_get_32 (input_bfd, p);
9969               insn &= 1;
9970               bfd_put_32 (input_bfd, B | insn, p);
9971               unresolved_reloc = save_unresolved_reloc;
9972               r_type = R_PPC_REL24;
9973               howto = ppc_elf_howto_table[r_type];
9974             }
9975           else if (htab->plt_type != PLT_NEW)
9976             info->callbacks->einfo
9977               (_("%P: %H: %s relocation unsupported for bss-plt\n"),
9978                input_bfd, input_section, rel->r_offset,
9979                howto->name);
9980           break;
9981
9982         case R_PPC_PLTSEQ:
9983         case R_PPC_PLT16_HA:
9984         case R_PPC_PLT16_LO:
9985           if (unresolved_reloc)
9986             {
9987               bfd_byte *p = contents + (rel->r_offset & ~3);
9988               bfd_put_32 (input_bfd, NOP, p);
9989               unresolved_reloc = FALSE;
9990               r_type = R_PPC_NONE;
9991               howto = ppc_elf_howto_table[r_type];
9992             }
9993           else if (htab->plt_type != PLT_NEW)
9994             info->callbacks->einfo
9995               (_("%P: %H: %s relocation unsupported for bss-plt\n"),
9996                input_bfd, input_section, rel->r_offset,
9997                howto->name);
9998           break;
9999         }
10000
10001       /* Do any further special processing.  */
10002       switch (r_type)
10003         {
10004         default:
10005           break;
10006
10007         case R_PPC_ADDR16_HA:
10008         case R_PPC_REL16_HA:
10009         case R_PPC_REL16DX_HA:
10010         case R_PPC_SECTOFF_HA:
10011         case R_PPC_TPREL16_HA:
10012         case R_PPC_DTPREL16_HA:
10013         case R_PPC_EMB_NADDR16_HA:
10014         case R_PPC_EMB_RELST_HA:
10015           /* It's just possible that this symbol is a weak symbol
10016              that's not actually defined anywhere.  In that case,
10017              'sec' would be NULL, and we should leave the symbol
10018              alone (it will be set to zero elsewhere in the link).  */
10019           if (sec == NULL)
10020             break;
10021           /* Fall through.  */
10022
10023         case R_PPC_PLT16_HA:
10024         case R_PPC_GOT16_HA:
10025         case R_PPC_GOT_TLSGD16_HA:
10026         case R_PPC_GOT_TLSLD16_HA:
10027         case R_PPC_GOT_TPREL16_HA:
10028         case R_PPC_GOT_DTPREL16_HA:
10029           /* Add 0x10000 if sign bit in 0:15 is set.
10030              Bits 0:15 are not used.  */
10031           addend += 0x8000;
10032           break;
10033
10034         case R_PPC_ADDR16:
10035         case R_PPC_ADDR16_LO:
10036         case R_PPC_GOT16:
10037         case R_PPC_GOT16_LO:
10038         case R_PPC_SDAREL16:
10039         case R_PPC_SECTOFF:
10040         case R_PPC_SECTOFF_LO:
10041         case R_PPC_DTPREL16:
10042         case R_PPC_DTPREL16_LO:
10043         case R_PPC_TPREL16:
10044         case R_PPC_TPREL16_LO:
10045         case R_PPC_GOT_TLSGD16:
10046         case R_PPC_GOT_TLSGD16_LO:
10047         case R_PPC_GOT_TLSLD16:
10048         case R_PPC_GOT_TLSLD16_LO:
10049         case R_PPC_GOT_DTPREL16:
10050         case R_PPC_GOT_DTPREL16_LO:
10051         case R_PPC_GOT_TPREL16:
10052         case R_PPC_GOT_TPREL16_LO:
10053           {
10054             /* The 32-bit ABI lacks proper relocations to deal with
10055                certain 64-bit instructions.  Prevent damage to bits
10056                that make up part of the insn opcode.  */
10057             unsigned int insn, mask, lobit;
10058
10059             insn = bfd_get_32 (input_bfd,
10060                                contents + rel->r_offset - d_offset);
10061             mask = 0;
10062             if (is_insn_ds_form (insn))
10063               mask = 3;
10064             else if (is_insn_dq_form (insn))
10065               mask = 15;
10066             else
10067               break;
10068             relocation += addend;
10069             addend = insn & mask;
10070             lobit = mask & relocation;
10071             if (lobit != 0)
10072               {
10073                 relocation ^= lobit;
10074                 info->callbacks->einfo
10075                   /* xgettext:c-format */
10076                   (_("%H: error: %s against `%s' not a multiple of %u\n"),
10077                    input_bfd, input_section, rel->r_offset,
10078                    howto->name, sym_name, mask + 1);
10079                 bfd_set_error (bfd_error_bad_value);
10080                 ret = FALSE;
10081               }
10082           }
10083           break;
10084         }
10085
10086 #ifdef DEBUG
10087       fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
10088                "offset = %ld, addend = %ld\n",
10089                howto->name,
10090                (int) r_type,
10091                sym_name,
10092                r_symndx,
10093                (long) rel->r_offset,
10094                (long) addend);
10095 #endif
10096
10097       if (unresolved_reloc
10098           && !((input_section->flags & SEC_DEBUGGING) != 0
10099                && h->def_dynamic)
10100           && _bfd_elf_section_offset (output_bfd, info, input_section,
10101                                       rel->r_offset) != (bfd_vma) -1)
10102         {
10103           info->callbacks->einfo
10104             /* xgettext:c-format */
10105             (_("%H: unresolvable %s relocation against symbol `%s'\n"),
10106              input_bfd, input_section, rel->r_offset,
10107              howto->name,
10108              sym_name);
10109           ret = FALSE;
10110         }
10111
10112       /* 16-bit fields in insns mostly have signed values, but a
10113          few insns have 16-bit unsigned values.  Really, we should
10114          have different reloc types.  */
10115       if (howto->complain_on_overflow != complain_overflow_dont
10116           && howto->dst_mask == 0xffff
10117           && (input_section->flags & SEC_CODE) != 0)
10118         {
10119           enum complain_overflow complain = complain_overflow_signed;
10120
10121           if ((elf_section_flags (input_section) & SHF_PPC_VLE) == 0)
10122             {
10123               unsigned int insn;
10124
10125               insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
10126               if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
10127                 complain = complain_overflow_bitfield;
10128               else if ((insn & (0x3f << 26)) == 28u << 26 /* andi */
10129                        || (insn & (0x3f << 26)) == 24u << 26 /* ori */
10130                        || (insn & (0x3f << 26)) == 26u << 26 /* xori */)
10131                 complain = complain_overflow_unsigned;
10132             }
10133           if (howto->complain_on_overflow != complain)
10134             {
10135               alt_howto = *howto;
10136               alt_howto.complain_on_overflow = complain;
10137               howto = &alt_howto;
10138             }
10139         }
10140
10141       if (r_type == R_PPC_REL16DX_HA)
10142         {
10143           /* Split field reloc isn't handled by _bfd_final_link_relocate.  */
10144           if (rel->r_offset + 4 > input_section->size)
10145             r = bfd_reloc_outofrange;
10146           else
10147             {
10148               unsigned int insn;
10149
10150               relocation += addend;
10151               relocation -= (rel->r_offset
10152                              + input_section->output_offset
10153                              + input_section->output_section->vma);
10154               relocation >>= 16;
10155               insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
10156               insn &= ~0x1fffc1;
10157               insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
10158               bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
10159               r = bfd_reloc_ok;
10160             }
10161         }
10162       else
10163         r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
10164                                       rel->r_offset, relocation, addend);
10165
10166       if (r != bfd_reloc_ok)
10167         {
10168           if (r == bfd_reloc_overflow)
10169             {
10170             overflow:
10171               /* On code like "if (foo) foo();" don't report overflow
10172                  on a branch to zero when foo is undefined.  */
10173               if (!warned
10174                   && !(h != NULL
10175                        && (h->root.type == bfd_link_hash_undefweak
10176                            || h->root.type == bfd_link_hash_undefined)
10177                        && is_branch_reloc (r_type)))
10178                 info->callbacks->reloc_overflow
10179                   (info, (h ? &h->root : NULL), sym_name, howto->name,
10180                    rel->r_addend, input_bfd, input_section, rel->r_offset);
10181             }
10182           else
10183             {
10184               info->callbacks->einfo
10185                 /* xgettext:c-format */
10186                 (_("%H: %s reloc against `%s': error %d\n"),
10187                  input_bfd, input_section, rel->r_offset,
10188                  howto->name, sym_name, (int) r);
10189               ret = FALSE;
10190             }
10191         }
10192     copy_reloc:
10193       if (wrel != rel)
10194         *wrel = *rel;
10195     }
10196
10197   if (wrel != rel)
10198     {
10199       Elf_Internal_Shdr *rel_hdr;
10200       size_t deleted = rel - wrel;
10201
10202       rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
10203       rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
10204       if (rel_hdr->sh_size == 0)
10205         {
10206           /* It is too late to remove an empty reloc section.  Leave
10207              one NONE reloc.
10208              ??? What is wrong with an empty section???  */
10209           rel_hdr->sh_size = rel_hdr->sh_entsize;
10210           deleted -= 1;
10211           wrel++;
10212         }
10213       relend = wrel;
10214       rel_hdr = _bfd_elf_single_rel_hdr (input_section);
10215       rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
10216       input_section->reloc_count -= deleted;
10217     }
10218
10219 #ifdef DEBUG
10220   fprintf (stderr, "\n");
10221 #endif
10222
10223   if (input_section->sec_info_type == SEC_INFO_TYPE_TARGET
10224       && input_section->size != input_section->rawsize
10225       && (strcmp (input_section->output_section->name, ".init") == 0
10226           || strcmp (input_section->output_section->name, ".fini") == 0))
10227     {
10228       /* Branch around the trampolines.  */
10229       unsigned int insn = B + input_section->size - input_section->rawsize;
10230       bfd_put_32 (input_bfd, insn, contents + input_section->rawsize);
10231     }
10232
10233   if (htab->params->ppc476_workaround
10234       && input_section->sec_info_type == SEC_INFO_TYPE_TARGET
10235       && (!bfd_link_relocatable (info)
10236           || (input_section->output_section->alignment_power
10237               >= htab->params->pagesize_p2)))
10238     {
10239       bfd_vma start_addr, end_addr, addr;
10240       bfd_vma pagesize = (bfd_vma) 1 << htab->params->pagesize_p2;
10241
10242       if (relax_info->workaround_size != 0)
10243         {
10244           bfd_byte *p;
10245           unsigned int n;
10246           bfd_byte fill[4];
10247
10248           bfd_put_32 (input_bfd, BA, fill);
10249           p = contents + input_section->size - relax_info->workaround_size;
10250           n = relax_info->workaround_size >> 2;
10251           while (n--)
10252             {
10253               memcpy (p, fill, 4);
10254               p += 4;
10255             }
10256         }
10257
10258       /* The idea is: Replace the last instruction on a page with a
10259          branch to a patch area.  Put the insn there followed by a
10260          branch back to the next page.  Complicated a little by
10261          needing to handle moved conditional branches, and by not
10262          wanting to touch data-in-text.  */
10263
10264       start_addr = (input_section->output_section->vma
10265                     + input_section->output_offset);
10266       end_addr = (start_addr + input_section->size
10267                   - relax_info->workaround_size);
10268       for (addr = ((start_addr & -pagesize) + pagesize - 4);
10269            addr < end_addr;
10270            addr += pagesize)
10271         {
10272           bfd_vma offset = addr - start_addr;
10273           Elf_Internal_Rela *lo, *hi;
10274           bfd_boolean is_data;
10275           bfd_vma patch_off, patch_addr;
10276           unsigned int insn;
10277
10278           /* Do we have a data reloc at this offset?  If so, leave
10279              the word alone.  */
10280           is_data = FALSE;
10281           lo = relocs;
10282           hi = relend;
10283           rel = NULL;
10284           while (lo < hi)
10285             {
10286               rel = lo + (hi - lo) / 2;
10287               if (rel->r_offset < offset)
10288                 lo = rel + 1;
10289               else if (rel->r_offset > offset + 3)
10290                 hi = rel;
10291               else
10292                 {
10293                   switch (ELF32_R_TYPE (rel->r_info))
10294                     {
10295                     case R_PPC_ADDR32:
10296                     case R_PPC_UADDR32:
10297                     case R_PPC_REL32:
10298                     case R_PPC_ADDR30:
10299                       is_data = TRUE;
10300                       break;
10301                     default:
10302                       break;
10303                     }
10304                   break;
10305                 }
10306             }
10307           if (is_data)
10308             continue;
10309
10310           /* Some instructions can be left alone too.  Unconditional
10311              branches, except for bcctr with BO=0x14 (bctr, bctrl),
10312              avoid the icache failure.
10313
10314              The problem occurs due to prefetch across a page boundary
10315              where stale instructions can be fetched from the next
10316              page, and the mechanism for flushing these bad
10317              instructions fails under certain circumstances.  The
10318              unconditional branches:
10319              1) Branch: b, bl, ba, bla,
10320              2) Branch Conditional: bc, bca, bcl, bcla,
10321              3) Branch Conditional to Link Register: bclr, bclrl,
10322              where (2) and (3) have BO=0x14 making them unconditional,
10323              prevent the bad prefetch because the prefetch itself is
10324              affected by these instructions.  This happens even if the
10325              instruction is not executed.
10326
10327              A bctr example:
10328              .
10329              .  lis 9,new_page@ha
10330              .  addi 9,9,new_page@l
10331              .  mtctr 9
10332              .  bctr
10333              .  nop
10334              .  nop
10335              . new_page:
10336              .
10337              The bctr is not predicted taken due to ctr not being
10338              ready, so prefetch continues on past the bctr into the
10339              new page which might have stale instructions.  If they
10340              fail to be flushed, then they will be executed after the
10341              bctr executes.  Either of the following modifications
10342              prevent the bad prefetch from happening in the first
10343              place:
10344              .
10345              .  lis 9,new_page@ha        lis 9,new_page@ha
10346              .  addi 9,9,new_page@l      addi 9,9,new_page@l
10347              .  mtctr 9                  mtctr 9
10348              .  bctr                     bctr
10349              .  nop                      b somewhere_else
10350              .  b somewhere_else         nop
10351              . new_page:                new_page:
10352              .  */
10353           insn = bfd_get_32 (input_bfd, contents + offset);
10354           if ((insn & (0x3f << 26)) == (18u << 26)          /* b,bl,ba,bla */
10355               || ((insn & (0x3f << 26)) == (16u << 26)      /* bc,bcl,bca,bcla*/
10356                   && (insn & (0x14 << 21)) == (0x14 << 21)) /*   with BO=0x14 */
10357               || ((insn & (0x3f << 26)) == (19u << 26)
10358                   && (insn & (0x3ff << 1)) == (16u << 1)    /* bclr,bclrl */
10359                   && (insn & (0x14 << 21)) == (0x14 << 21)))/*   with BO=0x14 */
10360             continue;
10361
10362           patch_addr = (start_addr + input_section->size
10363                         - relax_info->workaround_size);
10364           patch_addr = (patch_addr + 15) & -16;
10365           patch_off = patch_addr - start_addr;
10366           bfd_put_32 (input_bfd, B + patch_off - offset, contents + offset);
10367
10368           if (rel != NULL
10369               && rel->r_offset >= offset
10370               && rel->r_offset < offset + 4)
10371             {
10372               asection *sreloc;
10373
10374               /* If the insn we are patching had a reloc, adjust the
10375                  reloc r_offset so that the reloc applies to the moved
10376                  location.  This matters for -r and --emit-relocs.  */
10377               if (rel + 1 != relend)
10378                 {
10379                   Elf_Internal_Rela tmp = *rel;
10380
10381                   /* Keep the relocs sorted by r_offset.  */
10382                   memmove (rel, rel + 1, (relend - (rel + 1)) * sizeof (*rel));
10383                   relend[-1] = tmp;
10384                 }
10385               relend[-1].r_offset += patch_off - offset;
10386
10387               /* Adjust REL16 addends too.  */
10388               switch (ELF32_R_TYPE (relend[-1].r_info))
10389                 {
10390                 case R_PPC_REL16:
10391                 case R_PPC_REL16_LO:
10392                 case R_PPC_REL16_HI:
10393                 case R_PPC_REL16_HA:
10394                   relend[-1].r_addend += patch_off - offset;
10395                   break;
10396                 default:
10397                   break;
10398                 }
10399
10400               /* If we are building a PIE or shared library with
10401                  non-PIC objects, perhaps we had a dynamic reloc too?
10402                  If so, the dynamic reloc must move with the insn.  */
10403               sreloc = elf_section_data (input_section)->sreloc;
10404               if (sreloc != NULL)
10405                 {
10406                   Elf32_External_Rela *slo, *shi, *srelend;
10407                   bfd_vma soffset;
10408
10409                   slo = (Elf32_External_Rela *) sreloc->contents;
10410                   shi = srelend = slo + sreloc->reloc_count;
10411                   soffset = (offset + input_section->output_section->vma
10412                              + input_section->output_offset);
10413                   while (slo < shi)
10414                     {
10415                       Elf32_External_Rela *srel = slo + (shi - slo) / 2;
10416                       bfd_elf32_swap_reloca_in (output_bfd, (bfd_byte *) srel,
10417                                                 &outrel);
10418                       if (outrel.r_offset < soffset)
10419                         slo = srel + 1;
10420                       else if (outrel.r_offset > soffset + 3)
10421                         shi = srel;
10422                       else
10423                         {
10424                           if (srel + 1 != srelend)
10425                             {
10426                               memmove (srel, srel + 1,
10427                                        (srelend - (srel + 1)) * sizeof (*srel));
10428                               srel = srelend - 1;
10429                             }
10430                           outrel.r_offset += patch_off - offset;
10431                           bfd_elf32_swap_reloca_out (output_bfd, &outrel,
10432                                                      (bfd_byte *) srel);
10433                           break;
10434                         }
10435                     }
10436                 }
10437             }
10438           else
10439             rel = NULL;
10440
10441           if ((insn & (0x3f << 26)) == (16u << 26) /* bc */
10442               && (insn & 2) == 0 /* relative */)
10443             {
10444               bfd_vma delta = ((insn & 0xfffc) ^ 0x8000) - 0x8000;
10445
10446               delta += offset - patch_off;
10447               if (bfd_link_relocatable (info) && rel != NULL)
10448                 delta = 0;
10449               if (!bfd_link_relocatable (info) && rel != NULL)
10450                 {
10451                   enum elf_ppc_reloc_type r_type;
10452
10453                   r_type = ELF32_R_TYPE (relend[-1].r_info);
10454                   if (r_type == R_PPC_REL14_BRTAKEN)
10455                     insn |= BRANCH_PREDICT_BIT;
10456                   else if (r_type == R_PPC_REL14_BRNTAKEN)
10457                     insn &= ~BRANCH_PREDICT_BIT;
10458                   else
10459                     BFD_ASSERT (r_type == R_PPC_REL14);
10460
10461                   if ((r_type == R_PPC_REL14_BRTAKEN
10462                        || r_type == R_PPC_REL14_BRNTAKEN)
10463                       && delta + 0x8000 < 0x10000
10464                       && (bfd_signed_vma) delta < 0)
10465                     insn ^= BRANCH_PREDICT_BIT;
10466                 }
10467               if (delta + 0x8000 < 0x10000)
10468                 {
10469                   bfd_put_32 (input_bfd,
10470                               (insn & ~0xfffc) | (delta & 0xfffc),
10471                               contents + patch_off);
10472                   patch_off += 4;
10473                   bfd_put_32 (input_bfd,
10474                               B | ((offset + 4 - patch_off) & 0x3fffffc),
10475                               contents + patch_off);
10476                   patch_off += 4;
10477                 }
10478               else
10479                 {
10480                   if (rel != NULL)
10481                     {
10482                       unsigned int r_sym = ELF32_R_SYM (relend[-1].r_info);
10483
10484                       relend[-1].r_offset += 8;
10485                       relend[-1].r_info = ELF32_R_INFO (r_sym, R_PPC_REL24);
10486                     }
10487                   bfd_put_32 (input_bfd,
10488                               (insn & ~0xfffc) | 8,
10489                               contents + patch_off);
10490                   patch_off += 4;
10491                   bfd_put_32 (input_bfd,
10492                               B | ((offset + 4 - patch_off) & 0x3fffffc),
10493                               contents + patch_off);
10494                   patch_off += 4;
10495                   bfd_put_32 (input_bfd,
10496                               B | ((delta - 8) & 0x3fffffc),
10497                               contents + patch_off);
10498                   patch_off += 4;
10499                 }
10500             }
10501           else
10502             {
10503               bfd_put_32 (input_bfd, insn, contents + patch_off);
10504               patch_off += 4;
10505               bfd_put_32 (input_bfd,
10506                           B | ((offset + 4 - patch_off) & 0x3fffffc),
10507                           contents + patch_off);
10508               patch_off += 4;
10509             }
10510           BFD_ASSERT (patch_off <= input_section->size);
10511           relax_info->workaround_size = input_section->size - patch_off;
10512         }
10513     }
10514
10515   return ret;
10516 }
10517 \f
10518 /* Write out the PLT relocs and entries for H.  */
10519
10520 static bfd_boolean
10521 write_global_sym_plt (struct elf_link_hash_entry *h, void *inf)
10522 {
10523   struct bfd_link_info *info = (struct bfd_link_info *) inf;
10524   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
10525   struct plt_entry *ent;
10526   bfd_boolean doneone;
10527
10528   doneone = FALSE;
10529   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
10530     if (ent->plt.offset != (bfd_vma) -1)
10531       {
10532         if (!doneone)
10533           {
10534             Elf_Internal_Rela rela;
10535             bfd_byte *loc;
10536             bfd_vma reloc_index;
10537             asection *plt = htab->elf.splt;
10538             asection *relplt = htab->elf.srelplt;
10539
10540             if (htab->plt_type == PLT_NEW
10541                 || !htab->elf.dynamic_sections_created
10542                 || h->dynindx == -1)
10543               reloc_index = ent->plt.offset / 4;
10544             else
10545               {
10546                 reloc_index = ((ent->plt.offset - htab->plt_initial_entry_size)
10547                                / htab->plt_slot_size);
10548                 if (reloc_index > PLT_NUM_SINGLE_ENTRIES
10549                     && htab->plt_type == PLT_OLD)
10550                   reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
10551               }
10552
10553             /* This symbol has an entry in the procedure linkage table.
10554                Set it up.  */
10555             if (htab->plt_type == PLT_VXWORKS
10556                 && htab->elf.dynamic_sections_created
10557                 && h->dynindx != -1)
10558               {
10559                 bfd_vma got_offset;
10560                 const bfd_vma *plt_entry;
10561
10562                 /* The first three entries in .got.plt are reserved.  */
10563                 got_offset = (reloc_index + 3) * 4;
10564
10565                 /* Use the right PLT. */
10566                 plt_entry = bfd_link_pic (info) ? ppc_elf_vxworks_pic_plt_entry
10567                             : ppc_elf_vxworks_plt_entry;
10568
10569                 /* Fill in the .plt on VxWorks.  */
10570                 if (bfd_link_pic (info))
10571                   {
10572                     bfd_put_32 (info->output_bfd,
10573                                 plt_entry[0] | PPC_HA (got_offset),
10574                                 plt->contents + ent->plt.offset + 0);
10575                     bfd_put_32 (info->output_bfd,
10576                                 plt_entry[1] | PPC_LO (got_offset),
10577                                 plt->contents + ent->plt.offset + 4);
10578                   }
10579                 else
10580                   {
10581                     bfd_vma got_loc = got_offset + SYM_VAL (htab->elf.hgot);
10582
10583                     bfd_put_32 (info->output_bfd,
10584                                 plt_entry[0] | PPC_HA (got_loc),
10585                                 plt->contents + ent->plt.offset + 0);
10586                     bfd_put_32 (info->output_bfd,
10587                                 plt_entry[1] | PPC_LO (got_loc),
10588                                 plt->contents + ent->plt.offset + 4);
10589                   }
10590
10591                 bfd_put_32 (info->output_bfd, plt_entry[2],
10592                             plt->contents + ent->plt.offset + 8);
10593                 bfd_put_32 (info->output_bfd, plt_entry[3],
10594                             plt->contents + ent->plt.offset + 12);
10595
10596                 /* This instruction is an immediate load.  The value loaded is
10597                    the byte offset of the R_PPC_JMP_SLOT relocation from the
10598                    start of the .rela.plt section.  The value is stored in the
10599                    low-order 16 bits of the load instruction.  */
10600                 /* NOTE: It appears that this is now an index rather than a
10601                    prescaled offset.  */
10602                 bfd_put_32 (info->output_bfd,
10603                             plt_entry[4] | reloc_index,
10604                             plt->contents + ent->plt.offset + 16);
10605                 /* This instruction is a PC-relative branch whose target is
10606                    the start of the PLT section.  The address of this branch
10607                    instruction is 20 bytes beyond the start of this PLT entry.
10608                    The address is encoded in bits 6-29, inclusive.  The value
10609                    stored is right-shifted by two bits, permitting a 26-bit
10610                    offset.  */
10611                 bfd_put_32 (info->output_bfd,
10612                             (plt_entry[5]
10613                              | (-(ent->plt.offset + 20) & 0x03fffffc)),
10614                             plt->contents + ent->plt.offset + 20);
10615                 bfd_put_32 (info->output_bfd, plt_entry[6],
10616                             plt->contents + ent->plt.offset + 24);
10617                 bfd_put_32 (info->output_bfd, plt_entry[7],
10618                             plt->contents + ent->plt.offset + 28);
10619
10620                 /* Fill in the GOT entry corresponding to this PLT slot with
10621                    the address immediately after the "bctr" instruction
10622                    in this PLT entry.  */
10623                 bfd_put_32 (info->output_bfd, (plt->output_section->vma
10624                                                + plt->output_offset
10625                                                + ent->plt.offset + 16),
10626                             htab->elf.sgotplt->contents + got_offset);
10627
10628                 if (!bfd_link_pic (info))
10629                   {
10630                     /* Fill in a couple of entries in .rela.plt.unloaded.  */
10631                     loc = htab->srelplt2->contents
10632                       + ((VXWORKS_PLTRESOLVE_RELOCS + reloc_index
10633                           * VXWORKS_PLT_NON_JMP_SLOT_RELOCS)
10634                          * sizeof (Elf32_External_Rela));
10635
10636                     /* Provide the @ha relocation for the first instruction.  */
10637                     rela.r_offset = (plt->output_section->vma
10638                                      + plt->output_offset
10639                                      + ent->plt.offset + 2);
10640                     rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
10641                                                 R_PPC_ADDR16_HA);
10642                     rela.r_addend = got_offset;
10643                     bfd_elf32_swap_reloca_out (info->output_bfd, &rela, loc);
10644                     loc += sizeof (Elf32_External_Rela);
10645
10646                     /* Provide the @l relocation for the second instruction.  */
10647                     rela.r_offset = (plt->output_section->vma
10648                                      + plt->output_offset
10649                                      + ent->plt.offset + 6);
10650                     rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
10651                                                 R_PPC_ADDR16_LO);
10652                     rela.r_addend = got_offset;
10653                     bfd_elf32_swap_reloca_out (info->output_bfd, &rela, loc);
10654                     loc += sizeof (Elf32_External_Rela);
10655
10656                     /* Provide a relocation for the GOT entry corresponding to this
10657                        PLT slot.  Point it at the middle of the .plt entry.  */
10658                     rela.r_offset = (htab->elf.sgotplt->output_section->vma
10659                                      + htab->elf.sgotplt->output_offset
10660                                      + got_offset);
10661                     rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
10662                                                 R_PPC_ADDR32);
10663                     rela.r_addend = ent->plt.offset + 16;
10664                     bfd_elf32_swap_reloca_out (info->output_bfd, &rela, loc);
10665                   }
10666
10667                 /* VxWorks uses non-standard semantics for R_PPC_JMP_SLOT.
10668                    In particular, the offset for the relocation is not the
10669                    address of the PLT entry for this function, as specified
10670                    by the ABI.  Instead, the offset is set to the address of
10671                    the GOT slot for this function.  See EABI 4.4.4.1.  */
10672                 rela.r_offset = (htab->elf.sgotplt->output_section->vma
10673                                  + htab->elf.sgotplt->output_offset
10674                                  + got_offset);
10675                 rela.r_addend = 0;
10676               }
10677             else
10678               {
10679                 rela.r_addend = 0;
10680                 if (!htab->elf.dynamic_sections_created
10681                     || h->dynindx == -1)
10682                   {
10683                     if (h->type == STT_GNU_IFUNC)
10684                       {
10685                         plt = htab->elf.iplt;
10686                         relplt = htab->elf.irelplt;
10687                       }
10688                     else
10689                       {
10690                         plt = htab->pltlocal;
10691                         relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL;
10692                       }
10693                     if (h->def_regular
10694                         && (h->root.type == bfd_link_hash_defined
10695                             || h->root.type == bfd_link_hash_defweak))
10696                       rela.r_addend = SYM_VAL (h);
10697                   }
10698
10699                 if (relplt == NULL)
10700                   {
10701                     loc = plt->contents + ent->plt.offset;
10702                     bfd_put_32 (info->output_bfd, rela.r_addend, loc);
10703                   }
10704                 else
10705                   {
10706                     rela.r_offset = (plt->output_section->vma
10707                                      + plt->output_offset
10708                                      + ent->plt.offset);
10709
10710                     if (htab->plt_type == PLT_OLD
10711                         || !htab->elf.dynamic_sections_created
10712                         || h->dynindx == -1)
10713                       {
10714                         /* We don't need to fill in the .plt.  The ppc dynamic
10715                            linker will fill it in.  */
10716                       }
10717                     else
10718                       {
10719                         bfd_vma val = (htab->glink_pltresolve + ent->plt.offset
10720                                        + htab->glink->output_section->vma
10721                                        + htab->glink->output_offset);
10722                         bfd_put_32 (info->output_bfd, val,
10723                                     plt->contents + ent->plt.offset);
10724                       }
10725                   }
10726               }
10727
10728             if (relplt != NULL)
10729               {
10730                 /* Fill in the entry in the .rela.plt section.  */
10731                 if (!htab->elf.dynamic_sections_created
10732                     || h->dynindx == -1)
10733                   {
10734                     if (h->type == STT_GNU_IFUNC)
10735                       rela.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
10736                     else
10737                       rela.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
10738                     loc = relplt->contents + (relplt->reloc_count++
10739                                               * sizeof (Elf32_External_Rela));
10740                     htab->local_ifunc_resolver = 1;
10741                   }
10742                 else
10743                   {
10744                     rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
10745                     loc = relplt->contents + (reloc_index
10746                                               * sizeof (Elf32_External_Rela));
10747                     if (h->type == STT_GNU_IFUNC && is_static_defined (h))
10748                       htab->maybe_local_ifunc_resolver = 1;
10749                   }
10750                 bfd_elf32_swap_reloca_out (info->output_bfd, &rela, loc);
10751               }
10752             doneone = TRUE;
10753           }
10754
10755         if (htab->plt_type == PLT_NEW
10756             || !htab->elf.dynamic_sections_created
10757             || h->dynindx == -1)
10758           {
10759             unsigned char *p;
10760             asection *plt = htab->elf.splt;
10761
10762             if (!htab->elf.dynamic_sections_created
10763                 || h->dynindx == -1)
10764               {
10765                 if (h->type == STT_GNU_IFUNC)
10766                   plt = htab->elf.iplt;
10767                 else
10768                   break;
10769               }
10770
10771             p = (unsigned char *) htab->glink->contents + ent->glink_offset;
10772             write_glink_stub (h, ent, plt, p, info);
10773
10774             if (!bfd_link_pic (info))
10775               /* We only need one non-PIC glink stub.  */
10776               break;
10777           }
10778         else
10779           break;
10780       }
10781   return TRUE;
10782 }
10783
10784 /* Finish up PLT handling.  */
10785
10786 bfd_boolean
10787 ppc_finish_symbols (struct bfd_link_info *info)
10788 {
10789   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
10790   bfd *ibfd;
10791
10792   if (!htab)
10793     return TRUE;
10794
10795   elf_link_hash_traverse (&htab->elf, write_global_sym_plt, info);
10796
10797   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10798     {
10799       bfd_vma *local_got, *end_local_got;
10800       struct plt_entry **local_plt, **lplt, **end_local_plt;
10801       Elf_Internal_Shdr *symtab_hdr;
10802       bfd_size_type locsymcount;
10803       Elf_Internal_Sym *local_syms = NULL;
10804       struct plt_entry *ent;
10805
10806       if (!is_ppc_elf (ibfd))
10807         continue;
10808
10809       local_got = elf_local_got_offsets (ibfd);
10810       if (!local_got)
10811         continue;
10812
10813       symtab_hdr = &elf_symtab_hdr (ibfd);
10814       locsymcount = symtab_hdr->sh_info;
10815       end_local_got = local_got + locsymcount;
10816       local_plt = (struct plt_entry **) end_local_got;
10817       end_local_plt = local_plt + locsymcount;
10818       for (lplt = local_plt; lplt < end_local_plt; ++lplt)
10819         for (ent = *lplt; ent != NULL; ent = ent->next)
10820           {
10821             if (ent->plt.offset != (bfd_vma) -1)
10822               {
10823                 Elf_Internal_Sym *sym;
10824                 asection *sym_sec;
10825                 asection *plt, *relplt;
10826                 bfd_byte *loc;
10827                 bfd_vma val;
10828                 Elf_Internal_Rela rela;
10829
10830                 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
10831                                 lplt - local_plt, ibfd))
10832                   {
10833                     if (local_syms != NULL
10834                         && symtab_hdr->contents != (unsigned char *) local_syms)
10835                       free (local_syms);
10836                     return FALSE;
10837                   }
10838
10839                 val = sym->st_value;
10840                 if (sym_sec != NULL && sym_sec->output_section != NULL)
10841                   val += sym_sec->output_offset + sym_sec->output_section->vma;
10842
10843                 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
10844                   {
10845                     htab->local_ifunc_resolver = 1;
10846                     plt = htab->elf.iplt;
10847                     relplt = htab->elf.irelplt;
10848                     rela.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
10849                   }
10850                 else
10851                   {
10852                     plt = htab->pltlocal;
10853                     if (bfd_link_pic (info))
10854                       {
10855                         relplt = htab->relpltlocal;
10856                         rela.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
10857                       }
10858                     else
10859                       {
10860                         loc = plt->contents + ent->plt.offset;
10861                         bfd_put_32 (info->output_bfd, val, loc);
10862                         continue;
10863                       }
10864                   }
10865
10866                 rela.r_offset = (ent->plt.offset
10867                                  + plt->output_offset
10868                                  + plt->output_section->vma);
10869                 rela.r_addend = val;
10870                 loc = relplt->contents + (relplt->reloc_count++
10871                                           * sizeof (Elf32_External_Rela));
10872                 bfd_elf32_swap_reloca_out (info->output_bfd, &rela, loc);
10873               }
10874             if ((ent->glink_offset & 1) == 0)
10875               {
10876                 unsigned char *p = ((unsigned char *) htab->glink->contents
10877                                     + ent->glink_offset);
10878
10879                 write_glink_stub (NULL, ent, htab->elf.iplt, p, info);
10880                 ent->glink_offset |= 1;
10881               }
10882           }
10883
10884       if (local_syms != NULL
10885           && symtab_hdr->contents != (unsigned char *) local_syms)
10886         {
10887           if (!info->keep_memory)
10888             free (local_syms);
10889           else
10890             symtab_hdr->contents = (unsigned char *) local_syms;
10891         }
10892     }
10893   return TRUE;
10894 }
10895
10896 /* Finish up dynamic symbol handling.  We set the contents of various
10897    dynamic sections here.  */
10898
10899 static bfd_boolean
10900 ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
10901                                struct bfd_link_info *info,
10902                                struct elf_link_hash_entry *h,
10903                                Elf_Internal_Sym *sym)
10904 {
10905   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
10906   struct plt_entry *ent;
10907
10908 #ifdef DEBUG
10909   fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
10910            h->root.root.string);
10911 #endif
10912
10913   if (!h->def_regular
10914       || (h->type == STT_GNU_IFUNC && !bfd_link_pic (info)))
10915     for (ent = h->plt.plist; ent != NULL; ent = ent->next)
10916       if (ent->plt.offset != (bfd_vma) -1)
10917         {
10918           if (!h->def_regular)
10919             {
10920               /* Mark the symbol as undefined, rather than as
10921                  defined in the .plt section.  Leave the value if
10922                  there were any relocations where pointer equality
10923                  matters (this is a clue for the dynamic linker, to
10924                  make function pointer comparisons work between an
10925                  application and shared library), otherwise set it
10926                  to zero.  */
10927               sym->st_shndx = SHN_UNDEF;
10928               if (!h->pointer_equality_needed)
10929                 sym->st_value = 0;
10930               else if (!h->ref_regular_nonweak)
10931                 {
10932                   /* This breaks function pointer comparisons, but
10933                      that is better than breaking tests for a NULL
10934                      function pointer.  */
10935                   sym->st_value = 0;
10936                 }
10937             }
10938           else
10939             {
10940               /* Set the value of ifunc symbols in a non-pie
10941                  executable to the glink entry.  This is to avoid
10942                  text relocations.  We can't do this for ifunc in
10943                  allocate_dynrelocs, as we do for normal dynamic
10944                  function symbols with plt entries, because we need
10945                  to keep the original value around for the ifunc
10946                  relocation.  */
10947               sym->st_shndx
10948                 = (_bfd_elf_section_from_bfd_section
10949                    (info->output_bfd, htab->glink->output_section));
10950               sym->st_value = (ent->glink_offset
10951                                + htab->glink->output_offset
10952                                + htab->glink->output_section->vma);
10953             }
10954           break;
10955         }
10956
10957   if (h->needs_copy)
10958     {
10959       asection *s;
10960       Elf_Internal_Rela rela;
10961       bfd_byte *loc;
10962
10963       /* This symbols needs a copy reloc.  Set it up.  */
10964
10965 #ifdef DEBUG
10966       fprintf (stderr, ", copy");
10967 #endif
10968
10969       BFD_ASSERT (h->dynindx != -1);
10970
10971       if (ppc_elf_hash_entry (h)->has_sda_refs)
10972         s = htab->relsbss;
10973       else if (h->root.u.def.section == htab->elf.sdynrelro)
10974         s = htab->elf.sreldynrelro;
10975       else
10976         s = htab->elf.srelbss;
10977       BFD_ASSERT (s != NULL);
10978
10979       rela.r_offset = SYM_VAL (h);
10980       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
10981       rela.r_addend = 0;
10982       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
10983       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
10984     }
10985
10986 #ifdef DEBUG
10987   fprintf (stderr, "\n");
10988 #endif
10989
10990   return TRUE;
10991 }
10992 \f
10993 static enum elf_reloc_type_class
10994 ppc_elf_reloc_type_class (const struct bfd_link_info *info,
10995                           const asection *rel_sec,
10996                           const Elf_Internal_Rela *rela)
10997 {
10998   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
10999
11000   if (rel_sec == htab->elf.irelplt)
11001     return reloc_class_ifunc;
11002
11003   switch (ELF32_R_TYPE (rela->r_info))
11004     {
11005     case R_PPC_RELATIVE:
11006       return reloc_class_relative;
11007     case R_PPC_JMP_SLOT:
11008       return reloc_class_plt;
11009     case R_PPC_COPY:
11010       return reloc_class_copy;
11011     default:
11012       return reloc_class_normal;
11013     }
11014 }
11015 \f
11016 /* Finish up the dynamic sections.  */
11017
11018 static bfd_boolean
11019 ppc_elf_finish_dynamic_sections (bfd *output_bfd,
11020                                  struct bfd_link_info *info)
11021 {
11022   asection *sdyn;
11023   struct ppc_elf_link_hash_table *htab;
11024   bfd_vma got;
11025   bfd *dynobj;
11026   bfd_boolean ret = TRUE;
11027
11028 #ifdef DEBUG
11029   fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
11030 #endif
11031
11032   htab = ppc_elf_hash_table (info);
11033   dynobj = htab->elf.dynobj;
11034   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
11035
11036   got = 0;
11037   if (htab->elf.hgot != NULL)
11038     got = SYM_VAL (htab->elf.hgot);
11039
11040   if (htab->elf.dynamic_sections_created)
11041     {
11042       Elf32_External_Dyn *dyncon, *dynconend;
11043
11044       BFD_ASSERT (htab->elf.splt != NULL && sdyn != NULL);
11045
11046       dyncon = (Elf32_External_Dyn *) sdyn->contents;
11047       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
11048       for (; dyncon < dynconend; dyncon++)
11049         {
11050           Elf_Internal_Dyn dyn;
11051           asection *s;
11052
11053           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
11054
11055           switch (dyn.d_tag)
11056             {
11057             case DT_PLTGOT:
11058               if (htab->is_vxworks)
11059                 s = htab->elf.sgotplt;
11060               else
11061                 s = htab->elf.splt;
11062               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11063               break;
11064
11065             case DT_PLTRELSZ:
11066               dyn.d_un.d_val = htab->elf.srelplt->size;
11067               break;
11068
11069             case DT_JMPREL:
11070               s = htab->elf.srelplt;
11071               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11072               break;
11073
11074             case DT_PPC_GOT:
11075               dyn.d_un.d_ptr = got;
11076               break;
11077
11078             case DT_TEXTREL:
11079               if (htab->local_ifunc_resolver)
11080                 info->callbacks->einfo
11081                   (_("%X%P: text relocations and GNU indirect "
11082                      "functions will result in a segfault at runtime\n"));
11083               else if (htab->maybe_local_ifunc_resolver)
11084                 info->callbacks->einfo
11085                   (_("%P: warning: text relocations and GNU indirect "
11086                      "functions may result in a segfault at runtime\n"));
11087               continue;
11088
11089             default:
11090               if (htab->is_vxworks
11091                   && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
11092                 break;
11093               continue;
11094             }
11095
11096           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
11097         }
11098     }
11099
11100   if (htab->elf.sgot != NULL
11101       && htab->elf.sgot->output_section != bfd_abs_section_ptr)
11102     {
11103       if (htab->elf.hgot->root.u.def.section == htab->elf.sgot
11104           || htab->elf.hgot->root.u.def.section == htab->elf.sgotplt)
11105         {
11106           unsigned char *p = htab->elf.hgot->root.u.def.section->contents;
11107
11108           p += htab->elf.hgot->root.u.def.value;
11109           if (htab->plt_type == PLT_OLD)
11110             {
11111               /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4
11112                  so that a function can easily find the address of
11113                  _GLOBAL_OFFSET_TABLE_.  */
11114               BFD_ASSERT (htab->elf.hgot->root.u.def.value - 4
11115                           < htab->elf.hgot->root.u.def.section->size);
11116               bfd_put_32 (output_bfd, 0x4e800021, p - 4);
11117             }
11118
11119           if (sdyn != NULL)
11120             {
11121               bfd_vma val = sdyn->output_section->vma + sdyn->output_offset;
11122               BFD_ASSERT (htab->elf.hgot->root.u.def.value
11123                           < htab->elf.hgot->root.u.def.section->size);
11124               bfd_put_32 (output_bfd, val, p);
11125             }
11126         }
11127       else
11128         {
11129           /* xgettext:c-format */
11130           _bfd_error_handler (_("%s not defined in linker created %pA"),
11131                               htab->elf.hgot->root.root.string,
11132                               (htab->elf.sgotplt != NULL
11133                                ? htab->elf.sgotplt : htab->elf.sgot));
11134           bfd_set_error (bfd_error_bad_value);
11135           ret = FALSE;
11136         }
11137
11138       elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4;
11139     }
11140
11141   /* Fill in the first entry in the VxWorks procedure linkage table.  */
11142   if (htab->is_vxworks
11143       && htab->elf.splt != NULL
11144       && htab->elf.splt->size != 0
11145       && htab->elf.splt->output_section != bfd_abs_section_ptr)
11146     {
11147       asection *splt = htab->elf.splt;
11148       /* Use the right PLT. */
11149       const bfd_vma *plt_entry = (bfd_link_pic (info)
11150                                   ? ppc_elf_vxworks_pic_plt0_entry
11151                                   : ppc_elf_vxworks_plt0_entry);
11152
11153       if (!bfd_link_pic (info))
11154         {
11155           bfd_vma got_value = SYM_VAL (htab->elf.hgot);
11156
11157           bfd_put_32 (output_bfd, plt_entry[0] | PPC_HA (got_value),
11158                       splt->contents +  0);
11159           bfd_put_32 (output_bfd, plt_entry[1] | PPC_LO (got_value),
11160                       splt->contents +  4);
11161         }
11162       else
11163         {
11164           bfd_put_32 (output_bfd, plt_entry[0], splt->contents +  0);
11165           bfd_put_32 (output_bfd, plt_entry[1], splt->contents +  4);
11166         }
11167       bfd_put_32 (output_bfd, plt_entry[2], splt->contents +  8);
11168       bfd_put_32 (output_bfd, plt_entry[3], splt->contents + 12);
11169       bfd_put_32 (output_bfd, plt_entry[4], splt->contents + 16);
11170       bfd_put_32 (output_bfd, plt_entry[5], splt->contents + 20);
11171       bfd_put_32 (output_bfd, plt_entry[6], splt->contents + 24);
11172       bfd_put_32 (output_bfd, plt_entry[7], splt->contents + 28);
11173
11174       if (! bfd_link_pic (info))
11175         {
11176           Elf_Internal_Rela rela;
11177           bfd_byte *loc;
11178
11179           loc = htab->srelplt2->contents;
11180
11181           /* Output the @ha relocation for the first instruction.  */
11182           rela.r_offset = (htab->elf.splt->output_section->vma
11183                            + htab->elf.splt->output_offset
11184                            + 2);
11185           rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
11186           rela.r_addend = 0;
11187           bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11188           loc += sizeof (Elf32_External_Rela);
11189
11190           /* Output the @l relocation for the second instruction.  */
11191           rela.r_offset = (htab->elf.splt->output_section->vma
11192                            + htab->elf.splt->output_offset
11193                            + 6);
11194           rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
11195           rela.r_addend = 0;
11196           bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11197           loc += sizeof (Elf32_External_Rela);
11198
11199           /* Fix up the remaining relocations.  They may have the wrong
11200              symbol index for _G_O_T_ or _P_L_T_ depending on the order
11201              in which symbols were output.  */
11202           while (loc < htab->srelplt2->contents + htab->srelplt2->size)
11203             {
11204               Elf_Internal_Rela rel;
11205
11206               bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
11207               rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
11208               bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
11209               loc += sizeof (Elf32_External_Rela);
11210
11211               bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
11212               rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
11213               bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
11214               loc += sizeof (Elf32_External_Rela);
11215
11216               bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
11217               rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_PPC_ADDR32);
11218               bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
11219               loc += sizeof (Elf32_External_Rela);
11220             }
11221         }
11222     }
11223
11224   if (htab->glink != NULL
11225       && htab->glink->contents != NULL
11226       && htab->elf.dynamic_sections_created)
11227     {
11228       unsigned char *p;
11229       unsigned char *endp;
11230       bfd_vma res0;
11231
11232       /*
11233        * PIC glink code is the following:
11234        *
11235        * # ith PLT code stub.
11236        *   addis 11,30,(plt+(i-1)*4-got)@ha
11237        *   lwz 11,(plt+(i-1)*4-got)@l(11)
11238        *   mtctr 11
11239        *   bctr
11240        *
11241        * # A table of branches, one for each plt entry.
11242        * # The idea is that the plt call stub loads ctr and r11 with these
11243        * # addresses, so (r11 - res_0) gives the plt index * 4.
11244        * res_0: b PLTresolve
11245        * res_1: b PLTresolve
11246        * .
11247        * # Some number of entries towards the end can be nops
11248        * res_n_m3: nop
11249        * res_n_m2: nop
11250        * res_n_m1:
11251        *
11252        * PLTresolve:
11253        *    addis 11,11,(1f-res_0)@ha
11254        *    mflr 0
11255        *    bcl 20,31,1f
11256        * 1: addi 11,11,(1b-res_0)@l
11257        *    mflr 12
11258        *    mtlr 0
11259        *    sub 11,11,12                # r11 = index * 4
11260        *    addis 12,12,(got+4-1b)@ha
11261        *    lwz 0,(got+4-1b)@l(12)      # got[1] address of dl_runtime_resolve
11262        *    lwz 12,(got+8-1b)@l(12)     # got[2] contains the map address
11263        *    mtctr 0
11264        *    add 0,11,11
11265        *    add 11,0,11                 # r11 = index * 12 = reloc offset.
11266        *    bctr
11267        *
11268        * Non-PIC glink code is a little simpler.
11269        *
11270        * # ith PLT code stub.
11271        *   lis 11,(plt+(i-1)*4)@ha
11272        *   lwz 11,(plt+(i-1)*4)@l(11)
11273        *   mtctr 11
11274        *   bctr
11275        *
11276        * The branch table is the same, then comes
11277        *
11278        * PLTresolve:
11279        *    lis 12,(got+4)@ha
11280        *    addis 11,11,(-res_0)@ha
11281        *    lwz 0,(got+4)@l(12)         # got[1] address of dl_runtime_resolve
11282        *    addi 11,11,(-res_0)@l       # r11 = index * 4
11283        *    mtctr 0
11284        *    add 0,11,11
11285        *    lwz 12,(got+8)@l(12)        # got[2] contains the map address
11286        *    add 11,0,11                 # r11 = index * 12 = reloc offset.
11287        *    bctr
11288        */
11289
11290       /* Build the branch table, one for each plt entry (less one),
11291          and perhaps some padding.  */
11292       p = htab->glink->contents;
11293       p += htab->glink_pltresolve;
11294       endp = htab->glink->contents;
11295       endp += htab->glink->size - GLINK_PLTRESOLVE;
11296       while (p < endp - (htab->params->ppc476_workaround ? 0 : 8 * 4))
11297         {
11298           bfd_put_32 (output_bfd, B + endp - p, p);
11299           p += 4;
11300         }
11301       while (p < endp)
11302         {
11303           bfd_put_32 (output_bfd, NOP, p);
11304           p += 4;
11305         }
11306
11307       res0 = (htab->glink_pltresolve
11308               + htab->glink->output_section->vma
11309               + htab->glink->output_offset);
11310
11311       if (htab->params->ppc476_workaround)
11312         {
11313           /* Ensure that a call stub at the end of a page doesn't
11314              result in prefetch over the end of the page into the
11315              glink branch table.  */
11316           bfd_vma pagesize = (bfd_vma) 1 << htab->params->pagesize_p2;
11317           bfd_vma page_addr;
11318           bfd_vma glink_start = (htab->glink->output_section->vma
11319                                  + htab->glink->output_offset);
11320
11321           for (page_addr = res0 & -pagesize;
11322                page_addr > glink_start;
11323                page_addr -= pagesize)
11324             {
11325               /* We have a plt call stub that may need fixing.  */
11326               bfd_byte *loc;
11327               unsigned int insn;
11328
11329               loc = htab->glink->contents + page_addr - 4 - glink_start;
11330               insn = bfd_get_32 (output_bfd, loc);
11331               if (insn == BCTR)
11332                 {
11333                   /* By alignment, we know that there must be at least
11334                      one other call stub before this one.  */
11335                   insn = bfd_get_32 (output_bfd, loc - 16);
11336                   if (insn == BCTR)
11337                     bfd_put_32 (output_bfd, B | (-16 & 0x3fffffc), loc);
11338                   else
11339                     bfd_put_32 (output_bfd, B | (-20 & 0x3fffffc), loc);
11340                 }
11341             }
11342         }
11343
11344       /* Last comes the PLTresolve stub.  */
11345       endp = p + GLINK_PLTRESOLVE;
11346       if (bfd_link_pic (info))
11347         {
11348           bfd_vma bcl;
11349
11350           bcl = (htab->glink->size - GLINK_PLTRESOLVE + 3*4
11351                  + htab->glink->output_section->vma
11352                  + htab->glink->output_offset);
11353
11354           bfd_put_32 (output_bfd, ADDIS_11_11 + PPC_HA (bcl - res0), p);
11355           p += 4;
11356           bfd_put_32 (output_bfd, MFLR_0, p);
11357           p += 4;
11358           bfd_put_32 (output_bfd, BCL_20_31, p);
11359           p += 4;
11360           bfd_put_32 (output_bfd, ADDI_11_11 + PPC_LO (bcl - res0), p);
11361           p += 4;
11362           bfd_put_32 (output_bfd, MFLR_12, p);
11363           p += 4;
11364           bfd_put_32 (output_bfd, MTLR_0, p);
11365           p += 4;
11366           bfd_put_32 (output_bfd, SUB_11_11_12, p);
11367           p += 4;
11368           bfd_put_32 (output_bfd, ADDIS_12_12 + PPC_HA (got + 4 - bcl), p);
11369           p += 4;
11370           if (PPC_HA (got + 4 - bcl) == PPC_HA (got + 8 - bcl))
11371             {
11372               bfd_put_32 (output_bfd, LWZ_0_12 + PPC_LO (got + 4 - bcl), p);
11373               p += 4;
11374               bfd_put_32 (output_bfd, LWZ_12_12 + PPC_LO (got + 8 - bcl), p);
11375               p += 4;
11376             }
11377           else
11378             {
11379               bfd_put_32 (output_bfd, LWZU_0_12 + PPC_LO (got + 4 - bcl), p);
11380               p += 4;
11381               bfd_put_32 (output_bfd, LWZ_12_12 + 4, p);
11382               p += 4;
11383             }
11384           bfd_put_32 (output_bfd, MTCTR_0, p);
11385           p += 4;
11386           bfd_put_32 (output_bfd, ADD_0_11_11, p);
11387         }
11388       else
11389         {
11390           bfd_put_32 (output_bfd, LIS_12 + PPC_HA (got + 4), p);
11391           p += 4;
11392           bfd_put_32 (output_bfd, ADDIS_11_11 + PPC_HA (-res0), p);
11393           p += 4;
11394           if (PPC_HA (got + 4) == PPC_HA (got + 8))
11395             bfd_put_32 (output_bfd, LWZ_0_12 + PPC_LO (got + 4), p);
11396           else
11397             bfd_put_32 (output_bfd, LWZU_0_12 + PPC_LO (got + 4), p);
11398           p += 4;
11399           bfd_put_32 (output_bfd, ADDI_11_11 + PPC_LO (-res0), p);
11400           p += 4;
11401           bfd_put_32 (output_bfd, MTCTR_0, p);
11402           p += 4;
11403           bfd_put_32 (output_bfd, ADD_0_11_11, p);
11404           p += 4;
11405           if (PPC_HA (got + 4) == PPC_HA (got + 8))
11406             bfd_put_32 (output_bfd, LWZ_12_12 + PPC_LO (got + 8), p);
11407           else
11408             bfd_put_32 (output_bfd, LWZ_12_12 + 4, p);
11409         }
11410       p += 4;
11411       bfd_put_32 (output_bfd, ADD_11_0_11, p);
11412       p += 4;
11413       bfd_put_32 (output_bfd, BCTR, p);
11414       p += 4;
11415       while (p < endp)
11416         {
11417           bfd_put_32 (output_bfd,
11418                       htab->params->ppc476_workaround ? BA : NOP, p);
11419           p += 4;
11420         }
11421       BFD_ASSERT (p == endp);
11422     }
11423
11424   if (htab->glink_eh_frame != NULL
11425       && htab->glink_eh_frame->contents != NULL)
11426     {
11427       unsigned char *p = htab->glink_eh_frame->contents;
11428       bfd_vma val;
11429
11430       p += sizeof (glink_eh_frame_cie);
11431       /* FDE length.  */
11432       p += 4;
11433       /* CIE pointer.  */
11434       p += 4;
11435       /* Offset to .glink.  */
11436       val = (htab->glink->output_section->vma
11437              + htab->glink->output_offset);
11438       val -= (htab->glink_eh_frame->output_section->vma
11439               + htab->glink_eh_frame->output_offset);
11440       val -= p - htab->glink_eh_frame->contents;
11441       bfd_put_32 (htab->elf.dynobj, val, p);
11442
11443       if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
11444           && !_bfd_elf_write_section_eh_frame (output_bfd, info,
11445                                                htab->glink_eh_frame,
11446                                                htab->glink_eh_frame->contents))
11447         return FALSE;
11448     }
11449
11450   return ret;
11451 }
11452 \f
11453 #define TARGET_LITTLE_SYM       powerpc_elf32_le_vec
11454 #define TARGET_LITTLE_NAME      "elf32-powerpcle"
11455 #define TARGET_BIG_SYM          powerpc_elf32_vec
11456 #define TARGET_BIG_NAME         "elf32-powerpc"
11457 #define ELF_ARCH                bfd_arch_powerpc
11458 #define ELF_TARGET_ID           PPC32_ELF_DATA
11459 #define ELF_MACHINE_CODE        EM_PPC
11460 #define ELF_MAXPAGESIZE         0x10000
11461 #define ELF_COMMONPAGESIZE      0x1000
11462 #define ELF_RELROPAGESIZE       ELF_MAXPAGESIZE
11463 #define elf_info_to_howto       ppc_elf_info_to_howto
11464
11465 #ifdef  EM_CYGNUS_POWERPC
11466 #define ELF_MACHINE_ALT1        EM_CYGNUS_POWERPC
11467 #endif
11468
11469 #ifdef EM_PPC_OLD
11470 #define ELF_MACHINE_ALT2        EM_PPC_OLD
11471 #endif
11472
11473 #define elf_backend_plt_not_loaded      1
11474 #define elf_backend_want_dynrelro       1
11475 #define elf_backend_can_gc_sections     1
11476 #define elf_backend_can_refcount        1
11477 #define elf_backend_rela_normal         1
11478 #define elf_backend_caches_rawsize      1
11479
11480 #define bfd_elf32_mkobject                      ppc_elf_mkobject
11481 #define bfd_elf32_bfd_merge_private_bfd_data    ppc_elf_merge_private_bfd_data
11482 #define bfd_elf32_bfd_relax_section             ppc_elf_relax_section
11483 #define bfd_elf32_bfd_reloc_type_lookup         ppc_elf_reloc_type_lookup
11484 #define bfd_elf32_bfd_reloc_name_lookup         ppc_elf_reloc_name_lookup
11485 #define bfd_elf32_bfd_set_private_flags         ppc_elf_set_private_flags
11486 #define bfd_elf32_bfd_link_hash_table_create    ppc_elf_link_hash_table_create
11487 #define bfd_elf32_get_synthetic_symtab          ppc_elf_get_synthetic_symtab
11488
11489 #define elf_backend_object_p                    ppc_elf_object_p
11490 #define elf_backend_gc_mark_hook                ppc_elf_gc_mark_hook
11491 #define elf_backend_section_from_shdr           ppc_elf_section_from_shdr
11492 #define elf_backend_relocate_section            ppc_elf_relocate_section
11493 #define elf_backend_create_dynamic_sections     ppc_elf_create_dynamic_sections
11494 #define elf_backend_check_relocs                ppc_elf_check_relocs
11495 #define elf_backend_relocs_compatible           _bfd_elf_relocs_compatible
11496 #define elf_backend_copy_indirect_symbol        ppc_elf_copy_indirect_symbol
11497 #define elf_backend_adjust_dynamic_symbol       ppc_elf_adjust_dynamic_symbol
11498 #define elf_backend_add_symbol_hook             ppc_elf_add_symbol_hook
11499 #define elf_backend_size_dynamic_sections       ppc_elf_size_dynamic_sections
11500 #define elf_backend_hash_symbol                 ppc_elf_hash_symbol
11501 #define elf_backend_finish_dynamic_symbol       ppc_elf_finish_dynamic_symbol
11502 #define elf_backend_finish_dynamic_sections     ppc_elf_finish_dynamic_sections
11503 #define elf_backend_fake_sections               ppc_elf_fake_sections
11504 #define elf_backend_additional_program_headers  ppc_elf_additional_program_headers
11505 #define elf_backend_modify_segment_map          ppc_elf_modify_segment_map
11506 #define elf_backend_grok_prstatus               ppc_elf_grok_prstatus
11507 #define elf_backend_grok_psinfo                 ppc_elf_grok_psinfo
11508 #define elf_backend_write_core_note             ppc_elf_write_core_note
11509 #define elf_backend_reloc_type_class            ppc_elf_reloc_type_class
11510 #define elf_backend_begin_write_processing      ppc_elf_begin_write_processing
11511 #define elf_backend_final_write_processing      ppc_elf_final_write_processing
11512 #define elf_backend_write_section               ppc_elf_write_section
11513 #define elf_backend_get_sec_type_attr           ppc_elf_get_sec_type_attr
11514 #define elf_backend_plt_sym_val                 ppc_elf_plt_sym_val
11515 #define elf_backend_action_discarded            ppc_elf_action_discarded
11516 #define elf_backend_init_index_section          _bfd_elf_init_1_index_section
11517 #define elf_backend_lookup_section_flags_hook   ppc_elf_lookup_section_flags
11518
11519 #include "elf32-target.h"
11520
11521 /* FreeBSD Target */
11522
11523 #undef  TARGET_LITTLE_SYM
11524 #undef  TARGET_LITTLE_NAME
11525
11526 #undef  TARGET_BIG_SYM
11527 #define TARGET_BIG_SYM  powerpc_elf32_fbsd_vec
11528 #undef  TARGET_BIG_NAME
11529 #define TARGET_BIG_NAME "elf32-powerpc-freebsd"
11530
11531 #undef  ELF_OSABI
11532 #define ELF_OSABI       ELFOSABI_FREEBSD
11533
11534 #undef  elf32_bed
11535 #define elf32_bed       elf32_powerpc_fbsd_bed
11536
11537 #include "elf32-target.h"
11538
11539 /* VxWorks Target */
11540
11541 #undef TARGET_LITTLE_SYM
11542 #undef TARGET_LITTLE_NAME
11543
11544 #undef TARGET_BIG_SYM
11545 #define TARGET_BIG_SYM          powerpc_elf32_vxworks_vec
11546 #undef TARGET_BIG_NAME
11547 #define TARGET_BIG_NAME         "elf32-powerpc-vxworks"
11548
11549 #undef  ELF_OSABI
11550
11551 /* VxWorks uses the elf default section flags for .plt.  */
11552 static const struct bfd_elf_special_section *
11553 ppc_elf_vxworks_get_sec_type_attr (bfd *abfd, asection *sec)
11554 {
11555   if (sec->name == NULL)
11556     return NULL;
11557
11558   if (strcmp (sec->name, ".plt") == 0)
11559     return _bfd_elf_get_sec_type_attr (abfd, sec);
11560
11561   return ppc_elf_get_sec_type_attr (abfd, sec);
11562 }
11563
11564 /* Like ppc_elf_link_hash_table_create, but overrides
11565    appropriately for VxWorks.  */
11566 static struct bfd_link_hash_table *
11567 ppc_elf_vxworks_link_hash_table_create (bfd *abfd)
11568 {
11569   struct bfd_link_hash_table *ret;
11570
11571   ret = ppc_elf_link_hash_table_create (abfd);
11572   if (ret)
11573     {
11574       struct ppc_elf_link_hash_table *htab
11575         = (struct ppc_elf_link_hash_table *)ret;
11576       htab->is_vxworks = 1;
11577       htab->plt_type = PLT_VXWORKS;
11578       htab->plt_entry_size = VXWORKS_PLT_ENTRY_SIZE;
11579       htab->plt_slot_size = VXWORKS_PLT_ENTRY_SIZE;
11580       htab->plt_initial_entry_size = VXWORKS_PLT_INITIAL_ENTRY_SIZE;
11581     }
11582   return ret;
11583 }
11584
11585 /* Tweak magic VxWorks symbols as they are loaded.  */
11586 static bfd_boolean
11587 ppc_elf_vxworks_add_symbol_hook (bfd *abfd,
11588                                  struct bfd_link_info *info,
11589                                  Elf_Internal_Sym *sym,
11590                                  const char **namep,
11591                                  flagword *flagsp,
11592                                  asection **secp,
11593                                  bfd_vma *valp)
11594 {
11595   if (!elf_vxworks_add_symbol_hook (abfd, info, sym, namep, flagsp, secp,
11596                                     valp))
11597     return FALSE;
11598
11599   return ppc_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp);
11600 }
11601
11602 static void
11603 ppc_elf_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
11604 {
11605   ppc_elf_final_write_processing (abfd, linker);
11606   elf_vxworks_final_write_processing (abfd, linker);
11607 }
11608
11609 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
11610    define it.  */
11611 #undef elf_backend_want_plt_sym
11612 #define elf_backend_want_plt_sym                1
11613 #undef elf_backend_want_got_plt
11614 #define elf_backend_want_got_plt                1
11615 #undef elf_backend_got_symbol_offset
11616 #define elf_backend_got_symbol_offset           0
11617 #undef elf_backend_plt_not_loaded
11618 #define elf_backend_plt_not_loaded              0
11619 #undef elf_backend_plt_readonly
11620 #define elf_backend_plt_readonly                1
11621 #undef elf_backend_got_header_size
11622 #define elf_backend_got_header_size             12
11623 #undef elf_backend_dtrel_excludes_plt
11624 #define elf_backend_dtrel_excludes_plt          1
11625
11626 #undef bfd_elf32_get_synthetic_symtab
11627
11628 #undef bfd_elf32_bfd_link_hash_table_create
11629 #define bfd_elf32_bfd_link_hash_table_create \
11630   ppc_elf_vxworks_link_hash_table_create
11631 #undef elf_backend_add_symbol_hook
11632 #define elf_backend_add_symbol_hook \
11633   ppc_elf_vxworks_add_symbol_hook
11634 #undef elf_backend_link_output_symbol_hook
11635 #define elf_backend_link_output_symbol_hook \
11636   elf_vxworks_link_output_symbol_hook
11637 #undef elf_backend_final_write_processing
11638 #define elf_backend_final_write_processing \
11639   ppc_elf_vxworks_final_write_processing
11640 #undef elf_backend_get_sec_type_attr
11641 #define elf_backend_get_sec_type_attr \
11642   ppc_elf_vxworks_get_sec_type_attr
11643 #undef elf_backend_emit_relocs
11644 #define elf_backend_emit_relocs \
11645   elf_vxworks_emit_relocs
11646
11647 #undef elf32_bed
11648 #define elf32_bed                               ppc_elf_vxworks_bed
11649 #undef elf_backend_post_process_headers
11650
11651 #include "elf32-target.h"