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