* elf64-ppc.c (struct ppc_dyn_relocs): New.
[external/binutils.git] / bfd / elf64-ppc.c
1 /* PowerPC64-specific support for 64-bit ELF.
2    Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
3    Written by Linus Nordberg, Swox AB <info@swox.com>,
4    based on elf32-ppc.c by Ian Lance Taylor.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
22 /* This file is based on the 64-bit PowerPC ELF ABI.  It is also based
23    on the file elf32-ppc.c.  */
24
25 #include "bfd.h"
26 #include "sysdep.h"
27 #include "bfdlink.h"
28 #include "libbfd.h"
29 #include "elf-bfd.h"
30 #include "elf/ppc.h"
31
32 #define USE_RELA                /* we want RELA relocations, not REL.  */
33
34
35 static void ppc_howto_init
36   PARAMS ((void));
37 static reloc_howto_type *ppc64_elf_reloc_type_lookup
38   PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
39 static void ppc64_elf_info_to_howto
40   PARAMS ((bfd *abfd, arelent *cache_ptr, Elf64_Internal_Rela *dst));
41 static bfd_reloc_status_type ppc64_elf_addr16_ha_reloc
42   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
43 static boolean ppc64_elf_set_private_flags
44   PARAMS ((bfd *, flagword));
45 static boolean ppc64_elf_copy_private_bfd_data
46   PARAMS ((bfd *, bfd *));
47 static boolean ppc64_elf_merge_private_bfd_data
48   PARAMS ((bfd *, bfd *));
49 static boolean ppc64_elf_section_from_shdr
50   PARAMS ((bfd *, Elf64_Internal_Shdr *, char *));
51 static struct bfd_hash_entry *link_hash_newfunc
52   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
53 static struct bfd_link_hash_table *ppc64_elf_link_hash_table_create
54   PARAMS ((bfd *));
55 static boolean create_got_section
56   PARAMS ((bfd *, struct bfd_link_info *));
57 static boolean ppc64_elf_create_dynamic_sections
58   PARAMS ((bfd *, struct bfd_link_info *));
59 static void ppc64_elf_copy_indirect_symbol
60   PARAMS ((struct elf_link_hash_entry *, struct elf_link_hash_entry *));
61 static boolean ppc64_elf_check_relocs
62   PARAMS ((bfd *, struct bfd_link_info *, asection *,
63            const Elf_Internal_Rela *));
64 static asection * ppc64_elf_gc_mark_hook
65   PARAMS ((bfd *abfd, struct bfd_link_info *info, Elf_Internal_Rela *rel,
66            struct elf_link_hash_entry *h, Elf_Internal_Sym *sym));
67 static boolean ppc64_elf_gc_sweep_hook
68   PARAMS ((bfd *abfd, struct bfd_link_info *info, asection *sec,
69            const Elf_Internal_Rela *relocs));
70 static boolean ppc64_elf_adjust_dynamic_symbol
71   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
72 static boolean allocate_dynrelocs
73   PARAMS ((struct elf_link_hash_entry *, PTR));
74 static boolean readonly_dynrelocs
75   PARAMS ((struct elf_link_hash_entry *, PTR));
76 static enum elf_reloc_type_class ppc64_elf_reloc_type_class
77   PARAMS ((const Elf_Internal_Rela *));
78 static boolean ppc64_elf_size_dynamic_sections
79   PARAMS ((bfd *, struct bfd_link_info *));
80 static boolean ppc64_elf_final_link
81   PARAMS ((bfd *, struct bfd_link_info *));
82 static boolean ppc64_elf_fake_sections
83   PARAMS ((bfd *, Elf64_Internal_Shdr *, asection *));
84 static boolean ppc64_elf_relocate_section
85   PARAMS ((bfd *, struct bfd_link_info *info, bfd *, asection *, bfd_byte *,
86            Elf_Internal_Rela *relocs, Elf_Internal_Sym *local_syms,
87            asection **));
88 static boolean ppc64_elf_finish_dynamic_symbol
89   PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
90            Elf_Internal_Sym *));
91 static boolean ppc64_elf_finish_dynamic_sections
92   PARAMS ((bfd *, struct bfd_link_info *));
93
94
95 /* Branch prediction bit for branch taken relocs.  */
96 #define BRANCH_PREDICT_BIT 0x200000
97
98 /* Mask to set RA in memory instructions.  */
99 #define RA_REGISTER_MASK 0x001f0000
100
101 /* Value to shift register by to insert RA.  */
102 #define RA_REGISTER_SHIFT 16
103
104 /* The name of the dynamic interpreter.  This is put in the .interp
105    section.  */
106 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
107
108 /* The size in bytes of an entry in the procedure linkage table.  */
109 #define PLT_ENTRY_SIZE 24
110
111 /* The initial size of the plt reserved for the dynamic linker.  */
112 #define PLT_INITIAL_ENTRY_SIZE 96
113
114 /* TOC base pointers offset from start of TOC.  */
115 #define TOC_BASE_OFF (0x8000)
116
117 /* Global linkage stub.  The first instruction has its offset patched.  */
118 /* FIXME: Need traceback table?  */
119 static const unsigned int ppc64_elf_glink_code[] = {
120   0xe9820000,                   /* ld    %r12,0(%r2) */
121   0xf8410028,                   /* std   %r2,40(%r1) */
122   0xe80c0000,                   /* ld    %r0,0(%r12) */
123   0xe84c0008,                   /* ld    %r2,8(%r12) */
124   0x7c0903a6,                   /* mtctr %r0         */
125   0x4e800420                    /* bctr              */
126 };
127
128 #define PPC64_ELF_GLINK_SIZE \
129   ((sizeof ppc64_elf_glink_code / sizeof ppc64_elf_glink_code[0]) * 4)
130 \f
131 /* Relocation HOWTO's.  */
132 static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC_max];
133
134 static reloc_howto_type ppc64_elf_howto_raw[] = {
135   /* This reloc does nothing.  */
136   HOWTO (R_PPC64_NONE,          /* type */
137          0,                     /* rightshift */
138          2,                     /* size (0 = byte, 1 = short, 2 = long) */
139          32,                    /* bitsize */
140          false,                 /* pc_relative */
141          0,                     /* bitpos */
142          complain_overflow_bitfield, /* complain_on_overflow */
143          bfd_elf_generic_reloc, /* special_function */
144          "R_PPC64_NONE",        /* name */
145          false,                 /* partial_inplace */
146          0,                     /* src_mask */
147          0,                     /* dst_mask */
148          false),                /* pcrel_offset */
149
150   /* A standard 32 bit relocation.  */
151   HOWTO (R_PPC64_ADDR32,        /* type */
152          0,                     /* rightshift */
153          2,                     /* size (0 = byte, 1 = short, 2 = long) */
154          32,                    /* bitsize */
155          false,                 /* pc_relative */
156          0,                     /* bitpos */
157          complain_overflow_bitfield, /* complain_on_overflow */
158          bfd_elf_generic_reloc, /* special_function */
159          "R_PPC64_ADDR32",      /* name */
160          false,                 /* partial_inplace */
161          0,                     /* src_mask */
162          0xffffffff,            /* dst_mask */
163          false),                /* pcrel_offset */
164
165   /* An absolute 26 bit branch; the lower two bits must be zero.
166      FIXME: we don't check that, we just clear them.  */
167   HOWTO (R_PPC64_ADDR24,        /* type */
168          0,                     /* rightshift */
169          2,                     /* size (0 = byte, 1 = short, 2 = long) */
170          26,                    /* bitsize */
171          false,                 /* pc_relative */
172          0,                     /* bitpos */
173          complain_overflow_bitfield, /* complain_on_overflow */
174          bfd_elf_generic_reloc, /* special_function */
175          "R_PPC64_ADDR24",      /* name */
176          false,                 /* partial_inplace */
177          0,                     /* src_mask */
178          0x3fffffc,             /* dst_mask */
179          false),                /* pcrel_offset */
180
181   /* A standard 16 bit relocation.  */
182   HOWTO (R_PPC64_ADDR16,        /* type */
183          0,                     /* rightshift */
184          1,                     /* size (0 = byte, 1 = short, 2 = long) */
185          16,                    /* bitsize */
186          false,                 /* pc_relative */
187          0,                     /* bitpos */
188          complain_overflow_bitfield, /* complain_on_overflow */
189          bfd_elf_generic_reloc, /* special_function */
190          "R_PPC64_ADDR16",      /* name */
191          false,                 /* partial_inplace */
192          0,                     /* src_mask */
193          0xffff,                /* dst_mask */
194          false),                /* pcrel_offset */
195
196   /* A 16 bit relocation without overflow.  */
197   HOWTO (R_PPC64_ADDR16_LO,     /* type */
198          0,                     /* rightshift */
199          1,                     /* size (0 = byte, 1 = short, 2 = long) */
200          16,                    /* bitsize */
201          false,                 /* pc_relative */
202          0,                     /* bitpos */
203          complain_overflow_dont,/* complain_on_overflow */
204          bfd_elf_generic_reloc, /* special_function */
205          "R_PPC64_ADDR16_LO",   /* name */
206          false,                 /* partial_inplace */
207          0,                     /* src_mask */
208          0xffff,                /* dst_mask */
209          false),                /* pcrel_offset */
210
211   /* Bits 16-31 of an address.  */
212   HOWTO (R_PPC64_ADDR16_HI,     /* type */
213          16,                    /* rightshift */
214          1,                     /* size (0 = byte, 1 = short, 2 = long) */
215          16,                    /* bitsize */
216          false,                 /* pc_relative */
217          0,                     /* bitpos */
218          complain_overflow_dont, /* complain_on_overflow */
219          bfd_elf_generic_reloc, /* special_function */
220          "R_PPC64_ADDR16_HI",   /* name */
221          false,                 /* partial_inplace */
222          0,                     /* src_mask */
223          0xffff,                /* dst_mask */
224          false),                /* pcrel_offset */
225
226   /* Bits 16-31 of an address, plus 1 if the contents of the low 16
227      bits, treated as a signed number, is negative.  */
228   HOWTO (R_PPC64_ADDR16_HA,     /* type */
229          16,                    /* rightshift */
230          1,                     /* size (0 = byte, 1 = short, 2 = long) */
231          16,                    /* bitsize */
232          false,                 /* pc_relative */
233          0,                     /* bitpos */
234          complain_overflow_dont, /* complain_on_overflow */
235          ppc64_elf_addr16_ha_reloc, /* special_function */
236          "R_PPC64_ADDR16_HA",   /* name */
237          false,                 /* partial_inplace */
238          0,                     /* src_mask */
239          0xffff,                /* dst_mask */
240          false),                /* pcrel_offset */
241
242   /* An absolute 16 bit branch; the lower two bits must be zero.
243      FIXME: we don't check that, we just clear them.  */
244   HOWTO (R_PPC64_ADDR14,        /* type */
245          0,                     /* rightshift */
246          2,                     /* size (0 = byte, 1 = short, 2 = long) */
247          16,                    /* bitsize */
248          false,                 /* pc_relative */
249          0,                     /* bitpos */
250          complain_overflow_bitfield, /* complain_on_overflow */
251          bfd_elf_generic_reloc, /* special_function */
252          "R_PPC64_ADDR14",      /* name */
253          false,                 /* partial_inplace */
254          0,                     /* src_mask */
255          0xfffc,                /* dst_mask */
256          false),                /* pcrel_offset */
257
258   /* An absolute 16 bit branch, for which bit 10 should be set to
259      indicate that the branch is expected to be taken.  The lower two
260      bits must be zero.  */
261   HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
262          0,                     /* rightshift */
263          2,                     /* size (0 = byte, 1 = short, 2 = long) */
264          16,                    /* bitsize */
265          false,                 /* pc_relative */
266          0,                     /* bitpos */
267          complain_overflow_bitfield, /* complain_on_overflow */
268          bfd_elf_generic_reloc, /* special_function */
269          "R_PPC64_ADDR14_BRTAKEN",/* name */
270          false,                 /* partial_inplace */
271          0,                     /* src_mask */
272          0xfffc,                /* dst_mask */
273          false),                /* pcrel_offset */
274
275   /* An absolute 16 bit branch, for which bit 10 should be set to
276      indicate that the branch is not expected to be taken.  The lower
277      two bits must be zero.  */
278   HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
279          0,                     /* rightshift */
280          2,                     /* size (0 = byte, 1 = short, 2 = long) */
281          16,                    /* bitsize */
282          false,                 /* pc_relative */
283          0,                     /* bitpos */
284          complain_overflow_bitfield, /* complain_on_overflow */
285          bfd_elf_generic_reloc, /* special_function */
286          "R_PPC64_ADDR14_BRNTAKEN",/* name */
287          false,                 /* partial_inplace */
288          0,                     /* src_mask */
289          0xfffc,                /* dst_mask */
290          false),                /* pcrel_offset */
291
292   /* A relative 26 bit branch; the lower two bits must be zero.  */
293   HOWTO (R_PPC64_REL24,         /* type */
294          0,                     /* rightshift */
295          2,                     /* size (0 = byte, 1 = short, 2 = long) */
296          26,                    /* bitsize */
297          true,                  /* pc_relative */
298          0,                     /* bitpos */
299          complain_overflow_signed, /* complain_on_overflow */
300          bfd_elf_generic_reloc, /* special_function */
301          "R_PPC64_REL24",       /* name */
302          false,                 /* partial_inplace */
303          0,                     /* src_mask */
304          0x3fffffc,             /* dst_mask */
305          true),                 /* pcrel_offset */
306
307   /* A relative 16 bit branch; the lower two bits must be zero.  */
308   HOWTO (R_PPC64_REL14,         /* type */
309          0,                     /* rightshift */
310          2,                     /* size (0 = byte, 1 = short, 2 = long) */
311          16,                    /* bitsize */
312          true,                  /* pc_relative */
313          0,                     /* bitpos */
314          complain_overflow_signed, /* complain_on_overflow */
315          bfd_elf_generic_reloc, /* special_function */
316          "R_PPC64_REL14",       /* name */
317          false,                 /* partial_inplace */
318          0,                     /* src_mask */
319          0xfffc,                /* dst_mask */
320          true),                 /* pcrel_offset */
321
322   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
323      the branch is expected to be taken.  The lower two bits must be
324      zero.  */
325   HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
326          0,                     /* rightshift */
327          2,                     /* size (0 = byte, 1 = short, 2 = long) */
328          16,                    /* bitsize */
329          true,                  /* pc_relative */
330          0,                     /* bitpos */
331          complain_overflow_signed, /* complain_on_overflow */
332          bfd_elf_generic_reloc, /* special_function */
333          "R_PPC64_REL14_BRTAKEN", /* name */
334          false,                 /* partial_inplace */
335          0,                     /* src_mask */
336          0xfffc,                /* dst_mask */
337          true),                 /* pcrel_offset */
338
339   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
340      the branch is not expected to be taken.  The lower two bits must
341      be zero.  */
342   HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
343          0,                     /* rightshift */
344          2,                     /* size (0 = byte, 1 = short, 2 = long) */
345          16,                    /* bitsize */
346          true,                  /* pc_relative */
347          0,                     /* bitpos */
348          complain_overflow_signed, /* complain_on_overflow */
349          bfd_elf_generic_reloc, /* special_function */
350          "R_PPC64_REL14_BRNTAKEN",/* name */
351          false,                 /* partial_inplace */
352          0,                     /* src_mask */
353          0xfffc,                /* dst_mask */
354          true),                 /* pcrel_offset */
355
356   /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
357      symbol.  */
358   HOWTO (R_PPC64_GOT16,         /* type */
359          0,                     /* rightshift */
360          1,                     /* size (0 = byte, 1 = short, 2 = long) */
361          16,                    /* bitsize */
362          false,                 /* pc_relative */
363          0,                     /* bitpos */
364          complain_overflow_signed, /* complain_on_overflow */
365          bfd_elf_generic_reloc, /* special_function */
366          "R_PPC64_GOT16",       /* name */
367          false,                 /* partial_inplace */
368          0,                     /* src_mask */
369          0xffff,                /* dst_mask */
370          false),                /* pcrel_offset */
371
372   /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
373      the symbol.  */
374   HOWTO (R_PPC64_GOT16_LO,      /* type */
375          0,                     /* rightshift */
376          1,                     /* size (0 = byte, 1 = short, 2 = long) */
377          16,                    /* bitsize */
378          false,                 /* pc_relative */
379          0,                     /* bitpos */
380          complain_overflow_dont, /* complain_on_overflow */
381          bfd_elf_generic_reloc, /* special_function */
382          "R_PPC64_GOT16_LO",    /* name */
383          false,                 /* partial_inplace */
384          0,                     /* src_mask */
385          0xffff,                /* dst_mask */
386          false),                /* pcrel_offset */
387
388   /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
389      the symbol.  */
390   HOWTO (R_PPC64_GOT16_HI,      /* type */
391          16,                    /* rightshift */
392          1,                     /* size (0 = byte, 1 = short, 2 = long) */
393          16,                    /* bitsize */
394          false,                 /* pc_relative */
395          0,                     /* bitpos */
396          complain_overflow_dont,/* complain_on_overflow */
397          bfd_elf_generic_reloc, /* special_function */
398          "R_PPC64_GOT16_HI",    /* name */
399          false,                 /* partial_inplace */
400          0,                     /* src_mask */
401          0xffff,                /* dst_mask */
402          false),                /* pcrel_offset */
403
404   /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
405      the symbol.  */
406   HOWTO (R_PPC64_GOT16_HA,      /* type */
407          16,                    /* rightshift */
408          1,                     /* size (0 = byte, 1 = short, 2 = long) */
409          16,                    /* bitsize */
410          false,                 /* pc_relative */
411          0,                     /* bitpos */
412          complain_overflow_dont,/* complain_on_overflow */
413          ppc64_elf_addr16_ha_reloc, /* special_function */
414          "R_PPC64_GOT16_HA",    /* name */
415          false,                 /* partial_inplace */
416          0,                     /* src_mask */
417          0xffff,                /* dst_mask */
418          false),                /* pcrel_offset */
419
420   /* This is used only by the dynamic linker.  The symbol should exist
421      both in the object being run and in some shared library.  The
422      dynamic linker copies the data addressed by the symbol from the
423      shared library into the object, because the object being
424      run has to have the data at some particular address.  */
425   HOWTO (R_PPC64_COPY,          /* type */
426          0,                     /* rightshift */
427          2,                     /* size (0 = byte, 1 = short, 2 = long) */
428          32,                    /* bitsize */
429          false,                 /* pc_relative */
430          0,                     /* bitpos */
431          complain_overflow_bitfield, /* complain_on_overflow */
432          bfd_elf_generic_reloc,  /* special_function */
433          "R_PPC64_COPY",        /* name */
434          false,                 /* partial_inplace */
435          0,                     /* src_mask */
436          0,                     /* dst_mask */
437          false),                /* pcrel_offset */
438
439   /* Like R_PPC64_ADDR64, but used when setting global offset table
440      entries.  */
441   HOWTO (R_PPC64_GLOB_DAT,      /* type */
442          0,                     /* rightshift */
443          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
444          64,                    /* bitsize */
445          false,                 /* pc_relative */
446          0,                     /* bitpos */
447          complain_overflow_dont, /* complain_on_overflow */
448          bfd_elf_generic_reloc,  /* special_function */
449          "R_PPC64_GLOB_DAT",    /* name */
450          false,                 /* partial_inplace */
451          0,                     /* src_mask */
452          0xffffffffffffffff,    /* dst_mask */
453          false),                /* pcrel_offset */
454
455   /* Created by the link editor.  Marks a procedure linkage table
456      entry for a symbol.  */
457   HOWTO (R_PPC64_JMP_SLOT,      /* type */
458          0,                     /* rightshift */
459          0,                     /* size (0 = byte, 1 = short, 2 = long) */
460          0,                     /* bitsize */
461          false,                 /* pc_relative */
462          0,                     /* bitpos */
463          complain_overflow_dont, /* complain_on_overflow */
464          bfd_elf_generic_reloc, /* special_function */
465          "R_PPC64_JMP_SLOT",    /* name */
466          false,                 /* partial_inplace */
467          0,                     /* src_mask */
468          0,                     /* dst_mask */
469          false),                /* pcrel_offset */
470
471   /* Used only by the dynamic linker.  When the object is run, this
472      doubleword64 is set to the load address of the object, plus the
473      addend.  */
474   HOWTO (R_PPC64_RELATIVE,      /* type */
475          0,                     /* rightshift */
476          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
477          64,                    /* bitsize */
478          false,                 /* pc_relative */
479          0,                     /* bitpos */
480          complain_overflow_dont, /* complain_on_overflow */
481          bfd_elf_generic_reloc, /* special_function */
482          "R_PPC64_RELATIVE",    /* name */
483          false,                 /* partial_inplace */
484          0,                     /* src_mask */
485          0xffffffffffffffff,    /* dst_mask */
486          false),                /* pcrel_offset */
487
488   /* Like R_PPC64_ADDR32, but may be unaligned.  */
489   HOWTO (R_PPC64_UADDR32,       /* type */
490          0,                     /* rightshift */
491          2,                     /* size (0 = byte, 1 = short, 2 = long) */
492          32,                    /* bitsize */
493          false,                 /* pc_relative */
494          0,                     /* bitpos */
495          complain_overflow_bitfield, /* complain_on_overflow */
496          bfd_elf_generic_reloc, /* special_function */
497          "R_PPC64_UADDR32",     /* name */
498          false,                 /* partial_inplace */
499          0,                     /* src_mask */
500          0xffffffff,            /* dst_mask */
501          false),                /* pcrel_offset */
502
503   /* Like R_PPC64_ADDR16, but may be unaligned.  */
504   HOWTO (R_PPC64_UADDR16,       /* type */
505          0,                     /* rightshift */
506          1,                     /* size (0 = byte, 1 = short, 2 = long) */
507          16,                    /* bitsize */
508          false,                 /* pc_relative */
509          0,                     /* bitpos */
510          complain_overflow_bitfield, /* complain_on_overflow */
511          bfd_elf_generic_reloc, /* special_function */
512          "R_PPC64_UADDR16",     /* name */
513          false,                 /* partial_inplace */
514          0,                     /* src_mask */
515          0xffff,                /* dst_mask */
516          false),                /* pcrel_offset */
517
518   /* 32-bit PC relative.  */
519   HOWTO (R_PPC64_REL32,         /* type */
520          0,                     /* rightshift */
521          2,                     /* size (0 = byte, 1 = short, 2 = long) */
522          32,                    /* bitsize */
523          true,                  /* pc_relative */
524          0,                     /* bitpos */
525          /* FIXME: Verify.  Was complain_overflow_bitfield. */
526          complain_overflow_signed, /* complain_on_overflow */
527          bfd_elf_generic_reloc, /* special_function */
528          "R_PPC64_REL32",       /* name */
529          false,                 /* partial_inplace */
530          0,                     /* src_mask */
531          0xffffffff,            /* dst_mask */
532          true),                 /* pcrel_offset */
533
534   /* 32-bit relocation to the symbol's procedure linkage table.
535      FIXME: R_PPC64_PLT32 not supported.  */
536   HOWTO (R_PPC64_PLT32,         /* type */
537          0,                     /* rightshift */
538          2,                     /* size (0 = byte, 1 = short, 2 = long) */
539          32,                    /* bitsize */
540          false,                 /* pc_relative */
541          0,                     /* bitpos */
542          complain_overflow_bitfield, /* complain_on_overflow */
543          bfd_elf_generic_reloc, /* special_function */
544          "R_PPC64_PLT32",       /* name */
545          false,                 /* partial_inplace */
546          0,                     /* src_mask */
547          0,                     /* dst_mask */
548          false),                /* pcrel_offset */
549
550   /* 32-bit PC relative relocation to the symbol's procedure linkage table.
551      FIXME: R_PPC64_PLTREL32 not supported.  */
552   HOWTO (R_PPC64_PLTREL32,      /* type */
553          0,                     /* rightshift */
554          2,                     /* size (0 = byte, 1 = short, 2 = long) */
555          32,                    /* bitsize */
556          true,                  /* pc_relative */
557          0,                     /* bitpos */
558          complain_overflow_signed, /* complain_on_overflow */
559          bfd_elf_generic_reloc, /* special_function */
560          "R_PPC64_PLTREL32",    /* name */
561          false,                 /* partial_inplace */
562          0,                     /* src_mask */
563          0,                     /* dst_mask */
564          true),                 /* pcrel_offset */
565
566   /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
567      the symbol.  */
568   HOWTO (R_PPC64_PLT16_LO,      /* type */
569          0,                     /* rightshift */
570          1,                     /* size (0 = byte, 1 = short, 2 = long) */
571          16,                    /* bitsize */
572          false,                 /* pc_relative */
573          0,                     /* bitpos */
574          complain_overflow_dont, /* complain_on_overflow */
575          bfd_elf_generic_reloc, /* special_function */
576          "R_PPC64_PLT16_LO",    /* name */
577          false,                 /* partial_inplace */
578          0,                     /* src_mask */
579          0xffff,                /* dst_mask */
580          false),                /* pcrel_offset */
581
582   /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
583      the symbol.  */
584   HOWTO (R_PPC64_PLT16_HI,      /* type */
585          16,                    /* rightshift */
586          1,                     /* size (0 = byte, 1 = short, 2 = long) */
587          16,                    /* bitsize */
588          false,                 /* pc_relative */
589          0,                     /* bitpos */
590          complain_overflow_dont, /* complain_on_overflow */
591          bfd_elf_generic_reloc, /* special_function */
592          "R_PPC64_PLT16_HI",    /* name */
593          false,                 /* partial_inplace */
594          0,                     /* src_mask */
595          0xffff,                /* dst_mask */
596          false),                /* pcrel_offset */
597
598   /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
599      the symbol.  */
600   HOWTO (R_PPC64_PLT16_HA,      /* type */
601          16,                    /* rightshift */
602          1,                     /* size (0 = byte, 1 = short, 2 = long) */
603          16,                    /* bitsize */
604          false,                 /* pc_relative */
605          0,                     /* bitpos */
606          complain_overflow_dont, /* complain_on_overflow */
607          ppc64_elf_addr16_ha_reloc, /* special_function */
608          "R_PPC64_PLT16_HA",    /* name */
609          false,                 /* partial_inplace */
610          0,                     /* src_mask */
611          0xffff,                /* dst_mask */
612          false),                /* pcrel_offset */
613
614   /* 32-bit section relative relocation.  */
615   /* FIXME: Verify R_PPC64_SECTOFF.  Seems strange with size=2 and
616      dst_mask=0.  */
617   HOWTO (R_PPC64_SECTOFF,       /* type */
618          0,                     /* rightshift */
619          2,                     /* size (0 = byte, 1 = short, 2 = long) */
620          32,                    /* bitsize */
621          true,                  /* pc_relative */
622          0,                     /* bitpos */
623          complain_overflow_bitfield, /* complain_on_overflow */
624          bfd_elf_generic_reloc, /* special_function */
625          "R_PPC64_SECTOFF",     /* name */
626          false,                 /* partial_inplace */
627          0,                     /* src_mask */
628          0,                     /* dst_mask */
629          true),                 /* pcrel_offset */
630
631   /* 16-bit lower half section relative relocation.  */
632   HOWTO (R_PPC64_SECTOFF_LO,    /* type */
633          0,                     /* rightshift */
634          1,                     /* size (0 = byte, 1 = short, 2 = long) */
635          16,                    /* bitsize */
636          false,                 /* pc_relative */
637          0,                     /* bitpos */
638          complain_overflow_dont, /* complain_on_overflow */
639          bfd_elf_generic_reloc, /* special_function */
640          "R_PPC64_SECTOFF_LO",  /* name */
641          false,                 /* partial_inplace */
642          0,                     /* src_mask */
643          0xffff,                /* dst_mask */
644          false),                /* pcrel_offset */
645
646   /* 16-bit upper half section relative relocation.  */
647   HOWTO (R_PPC64_SECTOFF_HI,    /* type */
648          16,                    /* rightshift */
649          1,                     /* size (0 = byte, 1 = short, 2 = long) */
650          16,                    /* bitsize */
651          false,                 /* pc_relative */
652          0,                     /* bitpos */
653          complain_overflow_dont, /* complain_on_overflow */
654          bfd_elf_generic_reloc, /* special_function */
655          "R_PPC64_SECTOFF_HI",  /* name */
656          false,                 /* partial_inplace */
657          0,                     /* src_mask */
658          0xffff,                /* dst_mask */
659          false),                /* pcrel_offset */
660
661   /* 16-bit upper half adjusted section relative relocation.  */
662   HOWTO (R_PPC64_SECTOFF_HA,    /* type */
663          16,                    /* rightshift */
664          1,                     /* size (0 = byte, 1 = short, 2 = long) */
665          16,                    /* bitsize */
666          false,                 /* pc_relative */
667          0,                     /* bitpos */
668          complain_overflow_dont, /* complain_on_overflow */
669          ppc64_elf_addr16_ha_reloc, /* special_function */
670          "R_PPC64_SECTOFF_HA",  /* name */
671          false,                 /* partial_inplace */
672          0,                     /* src_mask */
673          0xffff,                /* dst_mask */
674          false),                /* pcrel_offset */
675
676   /* Like R_PPC64_REL24 without touching the two least significant
677      bits.  */
678   /* FIXME: Verify R_PPC64_ADDR30.  */
679   HOWTO (R_PPC64_ADDR30,        /* type */
680          2,                     /* rightshift */
681          2,                     /* size (0 = byte, 1 = short, 2 = long) */
682          30,                    /* bitsize */
683          true,                  /* pc_relative */
684          0,                     /* bitpos */
685          complain_overflow_dont, /* complain_on_overflow */
686          bfd_elf_generic_reloc, /* special_function */
687          "R_PPC64_ADDR30",      /* name */
688          false,                 /* partial_inplace */
689          0,                     /* src_mask */
690          0xfffffffc,            /* dst_mask */
691          true),                 /* pcrel_offset */
692
693   /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI.  */
694
695   /* A standard 64-bit relocation.  */
696   HOWTO (R_PPC64_ADDR64,        /* type */
697          0,                     /* rightshift */
698          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
699          64,                    /* bitsize */
700          false,                 /* pc_relative */
701          0,                     /* bitpos */
702          complain_overflow_dont, /* complain_on_overflow */
703          bfd_elf_generic_reloc, /* special_function */
704          "R_PPC64_ADDR64",      /* name */
705          false,                 /* partial_inplace */
706          0,                     /* src_mask */
707          0xffffffffffffffff,    /* dst_mask */
708          false),                /* pcrel_offset */
709
710   /* The bits 32-47 of an address.  */
711   HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
712          32,                    /* rightshift */
713          1,                     /* size (0 = byte, 1 = short, 2 = long) */
714          16,                    /* bitsize */
715          false,                 /* pc_relative */
716          0,                     /* bitpos */
717          complain_overflow_dont, /* complain_on_overflow */
718          bfd_elf_generic_reloc, /* special_function */
719          "R_PPC64_ADDR16_HIGHER", /* name */
720          false,                 /* partial_inplace */
721          0,                     /* src_mask */
722          0xffff,                /* dst_mask */
723          false),                /* pcrel_offset */
724
725   /* The bits 32-47 of an address, plus 1 if the contents of the low
726      16 bits, treated as a signed number, is negative.  */
727   HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
728          32,                    /* rightshift */
729          1,                     /* size (0 = byte, 1 = short, 2 = long) */
730          16,                    /* bitsize */
731          false,                 /* pc_relative */
732          0,                     /* bitpos */
733          complain_overflow_dont, /* complain_on_overflow */
734          ppc64_elf_addr16_ha_reloc, /* special_function */
735          "R_PPC64_ADDR16_HIGHERA", /* name */
736          false,                 /* partial_inplace */
737          0,                     /* src_mask */
738          0xffff,                /* dst_mask */
739          false),                /* pcrel_offset */
740
741   /* The bits 48-63 of an address.  */
742   HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
743          48,                    /* rightshift */
744          1,                     /* size (0 = byte, 1 = short, 2 = long) */
745          16,                    /* bitsize */
746          false,                 /* pc_relative */
747          0,                     /* bitpos */
748          complain_overflow_dont, /* complain_on_overflow */
749          bfd_elf_generic_reloc, /* special_function */
750          "R_PPC64_ADDR16_HIGHEST", /* name */
751          false,                 /* partial_inplace */
752          0,                     /* src_mask */
753          0xffff,                /* dst_mask */
754          false),                /* pcrel_offset */
755
756   /* The bits 48-63 of an address, plus 1 if the contents of the low
757      16 bits, treated as a signed number, is negative.  */
758   HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
759          48,                    /* rightshift */
760          1,                     /* size (0 = byte, 1 = short, 2 = long) */
761          16,                    /* bitsize */
762          false,                 /* pc_relative */
763          0,                     /* bitpos */
764          complain_overflow_dont, /* complain_on_overflow */
765          ppc64_elf_addr16_ha_reloc, /* special_function */
766          "R_PPC64_ADDR16_HIGHESTA", /* name */
767          false,                 /* partial_inplace */
768          0,                     /* src_mask */
769          0xffff,                /* dst_mask */
770          false),                /* pcrel_offset */
771
772   /* Like ADDR64, but may be unaligned.  */
773   HOWTO (R_PPC64_UADDR64,       /* type */
774          0,                     /* rightshift */
775          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
776          64,                    /* bitsize */
777          false,                 /* pc_relative */
778          0,                     /* bitpos */
779          complain_overflow_dont, /* complain_on_overflow */
780          bfd_elf_generic_reloc, /* special_function */
781          "R_PPC64_UADDR64",     /* name */
782          false,                 /* partial_inplace */
783          0,                     /* src_mask */
784          0xffffffffffffffff,    /* dst_mask */
785          false),                /* pcrel_offset */
786
787   /* 64-bit relative relocation.  */
788   HOWTO (R_PPC64_REL64,         /* type */
789          0,                     /* rightshift */
790          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
791          64,                    /* bitsize */
792          true,                  /* pc_relative */
793          0,                     /* bitpos */
794          complain_overflow_dont, /* complain_on_overflow */
795          bfd_elf_generic_reloc, /* special_function */
796          "R_PPC64_REL64",       /* name */
797          false,                 /* partial_inplace */
798          0,                     /* src_mask */
799          0xffffffffffffffff,    /* dst_mask */
800          true),                 /* pcrel_offset */
801
802   /* 64-bit relocation to the symbol's procedure linkage table. */
803   /* FIXME: R_PPC64_PLT64 not supported.  */
804   HOWTO (R_PPC64_PLT64,         /* type */
805          0,                     /* rightshift */
806          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
807          64,                    /* bitsize */
808          false,                 /* pc_relative */
809          0,                     /* bitpos */
810          complain_overflow_dont, /* complain_on_overflow */
811          bfd_elf_generic_reloc, /* special_function */
812          "R_PPC64_PLT64",       /* name */
813          false,                 /* partial_inplace */
814          0,                     /* src_mask */
815          0,                     /* dst_mask */
816          false),                /* pcrel_offset */
817
818   /* 64-bit PC relative relocation to the symbol's procedure linkage
819      table.  */
820   /* FIXME: R_PPC64_PLTREL64 not supported.  */
821   HOWTO (R_PPC64_PLTREL64,      /* type */
822          0,                     /* rightshift */
823          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
824          64,                    /* bitsize */
825          true,                  /* pc_relative */
826          0,                     /* bitpos */
827          complain_overflow_dont, /* complain_on_overflow */
828          bfd_elf_generic_reloc, /* special_function */
829          "R_PPC64_PLTREL64",    /* name */
830          false,                 /* partial_inplace */
831          0,                     /* src_mask */
832          0,                     /* dst_mask */
833          true),                 /* pcrel_offset */
834
835   /* 16 bit TOC-relative relocation.  */
836
837   /* R_PPC64_TOC16        47       half16*      S + A - .TOC.  */
838   HOWTO (R_PPC64_TOC16,         /* type */
839          0,                     /* rightshift */
840          1,                     /* size (0 = byte, 1 = short, 2 = long) */
841          16,                    /* bitsize */
842          false,                 /* pc_relative */
843          0,                     /* bitpos */
844          complain_overflow_signed, /* complain_on_overflow */
845          bfd_elf_generic_reloc, /* special_function */
846          "R_PPC64_TOC16",       /* name */
847          false,                 /* partial_inplace */
848          0,                     /* src_mask */
849          0xffff,                /* dst_mask */
850          false),                /* pcrel_offset */
851
852   /* 16 bit TOC-relative relocation without overflow.  */
853
854   /* R_PPC64_TOC16_LO     48       half16        #lo (S + A - .TOC.)  */
855   HOWTO (R_PPC64_TOC16_LO,      /* type */
856          0,                     /* rightshift */
857          1,                     /* size (0 = byte, 1 = short, 2 = long) */
858          16,                    /* bitsize */
859          false,                 /* pc_relative */
860          0,                     /* bitpos */
861          complain_overflow_dont, /* complain_on_overflow */
862          bfd_elf_generic_reloc, /* special_function */
863          "R_PPC64_TOC16_LO",    /* name */
864          false,                 /* partial_inplace */
865          0,                     /* src_mask */
866          0xffff,                /* dst_mask */
867          false),                /* pcrel_offset */
868
869   /* 16 bit TOC-relative relocation, high 16 bits.  */
870
871   /* R_PPC64_TOC16_HI     49       half16        #hi (S + A - .TOC.)  */
872   HOWTO (R_PPC64_TOC16_HI,      /* type */
873          16,                    /* rightshift */
874          1,                     /* size (0 = byte, 1 = short, 2 = long) */
875          16,                    /* bitsize */
876          false,                 /* pc_relative */
877          0,                     /* bitpos */
878          complain_overflow_dont, /* complain_on_overflow */
879          bfd_elf_generic_reloc, /* special_function */
880          "R_PPC64_TOC16_HI",    /* name */
881          false,                 /* partial_inplace */
882          0,                     /* src_mask */
883          0xffff,                /* dst_mask */
884          false),                /* pcrel_offset */
885
886   /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
887      contents of the low 16 bits, treated as a signed number, is
888      negative.  */
889
890   /* R_PPC64_TOC16_HA     50       half16        #ha (S + A - .TOC.)  */
891   HOWTO (R_PPC64_TOC16_HA,      /* type */
892          16,                    /* rightshift */
893          1,                     /* size (0 = byte, 1 = short, 2 = long) */
894          16,                    /* bitsize */
895          false,                 /* pc_relative */
896          0,                     /* bitpos */
897          complain_overflow_dont, /* complain_on_overflow */
898          ppc64_elf_addr16_ha_reloc, /* special_function */
899          "R_PPC64_TOC16_HA",    /* name */
900          false,                 /* partial_inplace */
901          0,                     /* src_mask */
902          0xffff,                /* dst_mask */
903          false),                /* pcrel_offset */
904
905   /* 64-bit relocation; insert value of TOC base (.TOC.).  */
906
907   /* R_PPC64_TOC                  51       doubleword64  .TOC.  */
908   HOWTO (R_PPC64_TOC,           /* type */
909          0,                     /* rightshift */
910          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
911          64,                    /* bitsize */
912          false,                 /* pc_relative */
913          0,                     /* bitpos */
914          complain_overflow_bitfield, /* complain_on_overflow */
915          bfd_elf_generic_reloc, /* special_function */
916          "R_PPC64_TOC",         /* name */
917          false,                 /* partial_inplace */
918          0,                     /* src_mask */
919          0xffffffffffffffff,    /* dst_mask */
920          false),                /* pcrel_offset */
921
922   /* Like R_PPC64_GOT16, but also informs the link editor that the
923      value to relocate may (!) refer to a PLT entry which the link
924      editor (a) may replace with the symbol value.  If the link editor
925      is unable to fully resolve the symbol, it may (b) create a PLT
926      entry and store the address to the new PLT entry in the GOT.
927      This permits lazy resolution of function symbols at run time.
928      The link editor may also skip all of this and just (c) emit a
929      R_PPC64_GLOB_DAT to tie the symbol to the GOT entry.  */
930   /* FIXME: R_PPC64_PLTGOT16 not implemented.  */
931     HOWTO (R_PPC64_PLTGOT16,    /* type */
932          0,                     /* rightshift */
933          1,                     /* size (0 = byte, 1 = short, 2 = long) */
934          16,                    /* bitsize */
935          false,                 /* pc_relative */
936          0,                     /* bitpos */
937          complain_overflow_signed, /* complain_on_overflow */
938          bfd_elf_generic_reloc, /* special_function */
939          "R_PPC64_PLTGOT16",    /* name */
940          false,                 /* partial_inplace */
941          0,                     /* src_mask */
942          0xffff,                /* dst_mask */
943          false),                /* pcrel_offset */
944
945   /* Like R_PPC64_PLTGOT16, but without overflow.  */
946   /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
947   HOWTO (R_PPC64_PLTGOT16_LO,   /* type */
948          0,                     /* rightshift */
949          1,                     /* size (0 = byte, 1 = short, 2 = long) */
950          16,                    /* bitsize */
951          false,                 /* pc_relative */
952          0,                     /* bitpos */
953          complain_overflow_dont, /* complain_on_overflow */
954          bfd_elf_generic_reloc, /* special_function */
955          "R_PPC64_PLTGOT16_LO", /* name */
956          false,                 /* partial_inplace */
957          0,                     /* src_mask */
958          0xffff,                /* dst_mask */
959          false),                /* pcrel_offset */
960
961   /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address.  */
962   /* FIXME: R_PPC64_PLTGOT16_HI not implemented.  */
963   HOWTO (R_PPC64_PLTGOT16_HI,   /* type */
964          16,                    /* rightshift */
965          1,                     /* size (0 = byte, 1 = short, 2 = long) */
966          16,                    /* bitsize */
967          false,                 /* pc_relative */
968          0,                     /* bitpos */
969          complain_overflow_dont, /* complain_on_overflow */
970          bfd_elf_generic_reloc, /* special_function */
971          "R_PPC64_PLTGOT16_HI", /* name */
972          false,                 /* partial_inplace */
973          0,                     /* src_mask */
974          0xffff,                /* dst_mask */
975          false),                /* pcrel_offset */
976
977   /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
978      1 if the contents of the low 16 bits, treated as a signed number,
979      is negative.  */
980   /* FIXME: R_PPC64_PLTGOT16_HA not implemented.  */
981   HOWTO (R_PPC64_PLTGOT16_HA,   /* type */
982          16,                    /* rightshift */
983          1,                     /* size (0 = byte, 1 = short, 2 = long) */
984          16,                    /* bitsize */
985          false,                 /* pc_relative */
986          0,                     /* bitpos */
987          complain_overflow_dont,/* complain_on_overflow */
988          ppc64_elf_addr16_ha_reloc, /* special_function */
989          "R_PPC64_PLTGOT16_HA", /* name */
990          false,                 /* partial_inplace */
991          0,                     /* src_mask */
992          0xffff,                /* dst_mask */
993          false),                /* pcrel_offset */
994
995   /* Like R_PPC64_ADDR16, but for instructions with a DS field.  */
996   HOWTO (R_PPC64_ADDR16_DS,     /* type */
997          0,                     /* rightshift */
998          1,                     /* size (0 = byte, 1 = short, 2 = long) */
999          16,                    /* bitsize */
1000          false,                 /* pc_relative */
1001          0,                     /* bitpos */
1002          complain_overflow_bitfield, /* complain_on_overflow */
1003          bfd_elf_generic_reloc, /* special_function */
1004          "R_PPC64_ADDR16_DS",   /* name */
1005          false,                 /* partial_inplace */
1006          0,                     /* src_mask */
1007          0xfffc,                /* dst_mask */
1008          false),                /* pcrel_offset */
1009
1010   /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field.  */
1011   HOWTO (R_PPC64_ADDR16_LO_DS,  /* type */
1012          0,                     /* rightshift */
1013          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1014          16,                    /* bitsize */
1015          false,                 /* pc_relative */
1016          0,                     /* bitpos */
1017          complain_overflow_dont,/* complain_on_overflow */
1018          bfd_elf_generic_reloc, /* special_function */
1019          "R_PPC64_ADDR16_LO_DS",/* name */
1020          false,                 /* partial_inplace */
1021          0,                     /* src_mask */
1022          0xfffc,                /* dst_mask */
1023          false),                /* pcrel_offset */
1024
1025   /* Like R_PPC64_GOT16, but for instructions with a DS field.  */
1026   HOWTO (R_PPC64_GOT16_DS,      /* type */
1027          0,                     /* rightshift */
1028          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1029          16,                    /* bitsize */
1030          false,                 /* pc_relative */
1031          0,                     /* bitpos */
1032          complain_overflow_signed, /* complain_on_overflow */
1033          bfd_elf_generic_reloc, /* special_function */
1034          "R_PPC64_GOT16_DS",    /* name */
1035          false,                 /* partial_inplace */
1036          0,                     /* src_mask */
1037          0xfffc,                /* dst_mask */
1038          false),                /* pcrel_offset */
1039
1040   /* Like R_PPC64_GOT16_LO, but for instructions with a DS field.  */
1041   HOWTO (R_PPC64_GOT16_LO_DS,   /* type */
1042          0,                     /* rightshift */
1043          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1044          16,                    /* bitsize */
1045          false,                 /* pc_relative */
1046          0,                     /* bitpos */
1047          complain_overflow_dont, /* complain_on_overflow */
1048          bfd_elf_generic_reloc, /* special_function */
1049          "R_PPC64_GOT16_LO_DS", /* name */
1050          false,                 /* partial_inplace */
1051          0,                     /* src_mask */
1052          0xfffc,                /* dst_mask */
1053          false),                /* pcrel_offset */
1054
1055   /* Like R_PPC64_PLT16_LO, but for instructions with a DS field.  */
1056   HOWTO (R_PPC64_PLT16_LO_DS,   /* type */
1057          0,                     /* rightshift */
1058          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1059          16,                    /* bitsize */
1060          false,                 /* pc_relative */
1061          0,                     /* bitpos */
1062          complain_overflow_dont, /* complain_on_overflow */
1063          bfd_elf_generic_reloc, /* special_function */
1064          "R_PPC64_PLT16_LO_DS", /* name */
1065          false,                 /* partial_inplace */
1066          0,                     /* src_mask */
1067          0xfffc,                /* dst_mask */
1068          false),                /* pcrel_offset */
1069
1070   /* Like R_PPC64_SECTOFF, but for instructions with a DS field.  */
1071   /* FIXME: Verify R_PPC64_SECTOFF.  Seems strange with size=2 and
1072      dst_mask=0.  */
1073   HOWTO (R_PPC64_SECTOFF_DS,    /* type */
1074          0,                     /* rightshift */
1075          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1076          32,                    /* bitsize */
1077          true,                  /* pc_relative */
1078          0,                     /* bitpos */
1079          complain_overflow_bitfield, /* complain_on_overflow */
1080          bfd_elf_generic_reloc, /* special_function */
1081          "R_PPC64_SECTOFF_DS",  /* name */
1082          false,                 /* partial_inplace */
1083          0,                     /* src_mask */
1084          0,                     /* dst_mask */
1085          true),                 /* pcrel_offset */
1086
1087   /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field.  */
1088   HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1089          0,                     /* rightshift */
1090          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1091          16,                    /* bitsize */
1092          false,                 /* pc_relative */
1093          0,                     /* bitpos */
1094          complain_overflow_dont, /* complain_on_overflow */
1095          bfd_elf_generic_reloc, /* special_function */
1096          "R_PPC64_SECTOFF_LO_DS",/* name */
1097          false,                 /* partial_inplace */
1098          0,                     /* src_mask */
1099          0xfffc,                /* dst_mask */
1100          false),                /* pcrel_offset */
1101
1102   /* Like R_PPC64_TOC16, but for instructions with a DS field.  */
1103   HOWTO (R_PPC64_TOC16_DS,      /* type */
1104          0,                     /* rightshift */
1105          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1106          16,                    /* bitsize */
1107          false,                 /* pc_relative */
1108          0,                     /* bitpos */
1109          complain_overflow_signed, /* complain_on_overflow */
1110          bfd_elf_generic_reloc, /* special_function */
1111          "R_PPC64_TOC16_DS",    /* name */
1112          false,                 /* partial_inplace */
1113          0,                     /* src_mask */
1114          0xfffc,                /* dst_mask */
1115          false),                /* pcrel_offset */
1116
1117   /* Like R_PPC64_TOC16_LO, but for instructions with a DS field.  */
1118   HOWTO (R_PPC64_TOC16_LO_DS,   /* type */
1119          0,                     /* rightshift */
1120          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1121          16,                    /* bitsize */
1122          false,                 /* pc_relative */
1123          0,                     /* bitpos */
1124          complain_overflow_dont, /* complain_on_overflow */
1125          bfd_elf_generic_reloc, /* special_function */
1126          "R_PPC64_TOC16_LO_DS", /* name */
1127          false,                 /* partial_inplace */
1128          0,                     /* src_mask */
1129          0xfffc,                /* dst_mask */
1130          false),                /* pcrel_offset */
1131
1132   /* Like R_PPC64_PLTGOT16, but for instructions with a DS field.  */
1133   /* FIXME: R_PPC64_PLTGOT16_DS not implemented.  */
1134     HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1135          0,                     /* rightshift */
1136          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1137          16,                    /* bitsize */
1138          false,                 /* pc_relative */
1139          0,                     /* bitpos */
1140          complain_overflow_signed, /* complain_on_overflow */
1141          bfd_elf_generic_reloc, /* special_function */
1142          "R_PPC64_PLTGOT16_DS", /* name */
1143          false,                 /* partial_inplace */
1144          0,                     /* src_mask */
1145          0xfffc,                /* dst_mask */
1146          false),                /* pcrel_offset */
1147
1148   /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field.  */
1149   /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1150   HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1151          0,                     /* rightshift */
1152          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1153          16,                    /* bitsize */
1154          false,                 /* pc_relative */
1155          0,                     /* bitpos */
1156          complain_overflow_dont, /* complain_on_overflow */
1157          bfd_elf_generic_reloc, /* special_function */
1158          "R_PPC64_PLTGOT16_LO_DS",/* name */
1159          false,                 /* partial_inplace */
1160          0,                     /* src_mask */
1161          0xfffc,                /* dst_mask */
1162          false),                /* pcrel_offset */
1163
1164   /* GNU extension to record C++ vtable hierarchy.  */
1165   HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
1166          0,                     /* rightshift */
1167          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1168          0,                     /* bitsize */
1169          false,                 /* pc_relative */
1170          0,                     /* bitpos */
1171          complain_overflow_dont, /* complain_on_overflow */
1172          NULL,                  /* special_function */
1173          "R_PPC64_GNU_VTINHERIT", /* name */
1174          false,                 /* partial_inplace */
1175          0,                     /* src_mask */
1176          0,                     /* dst_mask */
1177          false),                /* pcrel_offset */
1178
1179   /* GNU extension to record C++ vtable member usage.  */
1180   HOWTO (R_PPC64_GNU_VTENTRY,   /* type */
1181          0,                     /* rightshift */
1182          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1183          0,                     /* bitsize */
1184          false,                 /* pc_relative */
1185          0,                     /* bitpos */
1186          complain_overflow_dont, /* complain_on_overflow */
1187          NULL,                  /* special_function */
1188          "R_PPC64_GNU_VTENTRY", /* name */
1189          false,                 /* partial_inplace */
1190          0,                     /* src_mask */
1191          0,                     /* dst_mask */
1192          false),                /* pcrel_offset */
1193 };
1194
1195 \f
1196 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
1197    be done.  */
1198
1199 static void
1200 ppc_howto_init ()
1201 {
1202   unsigned int i, type;
1203
1204   for (i = 0;
1205        i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
1206        i++)
1207     {
1208       type = ppc64_elf_howto_raw[i].type;
1209       BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
1210                           / sizeof (ppc64_elf_howto_table[0])));
1211       ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
1212     }
1213 }
1214
1215 static reloc_howto_type *
1216 ppc64_elf_reloc_type_lookup (abfd, code)
1217      bfd *abfd ATTRIBUTE_UNUSED;
1218      bfd_reloc_code_real_type code;
1219 {
1220   enum elf_ppc_reloc_type ppc_reloc = R_PPC_NONE;
1221
1222   if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1223     /* Initialize howto table if needed.  */
1224     ppc_howto_init ();
1225
1226   switch ((int) code)
1227     {
1228     default:
1229       return (reloc_howto_type *) NULL;
1230
1231     case BFD_RELOC_NONE:                 ppc_reloc = R_PPC64_NONE;
1232       break;
1233     case BFD_RELOC_32:                   ppc_reloc = R_PPC64_ADDR32;
1234       break;
1235     case BFD_RELOC_PPC_BA26:             ppc_reloc = R_PPC64_ADDR24;
1236       break;
1237     case BFD_RELOC_16:                   ppc_reloc = R_PPC64_ADDR16;
1238       break;
1239     case BFD_RELOC_LO16:                 ppc_reloc = R_PPC64_ADDR16_LO;
1240       break;
1241     case BFD_RELOC_HI16:                 ppc_reloc = R_PPC64_ADDR16_HI;
1242       break;
1243     case BFD_RELOC_HI16_S:               ppc_reloc = R_PPC64_ADDR16_HA;
1244       break;
1245     case BFD_RELOC_PPC_BA16:             ppc_reloc = R_PPC64_ADDR14;
1246       break;
1247     case BFD_RELOC_PPC_BA16_BRTAKEN:     ppc_reloc = R_PPC64_ADDR14_BRTAKEN;
1248       break;
1249     case BFD_RELOC_PPC_BA16_BRNTAKEN:    ppc_reloc = R_PPC64_ADDR14_BRNTAKEN;
1250       break;
1251     case BFD_RELOC_PPC_B26:              ppc_reloc = R_PPC64_REL24;
1252       break;
1253     case BFD_RELOC_PPC_B16:              ppc_reloc = R_PPC64_REL14;
1254       break;
1255     case BFD_RELOC_PPC_B16_BRTAKEN:      ppc_reloc = R_PPC64_REL14_BRTAKEN;
1256       break;
1257     case BFD_RELOC_PPC_B16_BRNTAKEN:     ppc_reloc = R_PPC64_REL14_BRNTAKEN;
1258       break;
1259     case BFD_RELOC_16_GOTOFF:            ppc_reloc = R_PPC64_GOT16;
1260       break;
1261     case BFD_RELOC_LO16_GOTOFF:          ppc_reloc = R_PPC64_GOT16_LO;
1262       break;
1263     case BFD_RELOC_HI16_GOTOFF:          ppc_reloc = R_PPC64_GOT16_HI;
1264       break;
1265     case BFD_RELOC_HI16_S_GOTOFF:        ppc_reloc = R_PPC64_GOT16_HA;
1266       break;
1267     case BFD_RELOC_PPC_COPY:             ppc_reloc = R_PPC64_COPY;
1268       break;
1269     case BFD_RELOC_PPC_GLOB_DAT:         ppc_reloc = R_PPC64_GLOB_DAT;
1270       break;
1271     case BFD_RELOC_32_PCREL:             ppc_reloc = R_PPC64_REL32;
1272       break;
1273     case BFD_RELOC_32_PLTOFF:            ppc_reloc = R_PPC64_PLT32;
1274       break;
1275     case BFD_RELOC_32_PLT_PCREL:         ppc_reloc = R_PPC64_PLTREL32;
1276       break;
1277     case BFD_RELOC_LO16_PLTOFF:          ppc_reloc = R_PPC64_PLT16_LO;
1278       break;
1279     case BFD_RELOC_HI16_PLTOFF:          ppc_reloc = R_PPC64_PLT16_HI;
1280       break;
1281     case BFD_RELOC_HI16_S_PLTOFF:        ppc_reloc = R_PPC64_PLT16_HA;
1282       break;
1283     case BFD_RELOC_32_BASEREL:           ppc_reloc = R_PPC64_SECTOFF;
1284       break;
1285     case BFD_RELOC_LO16_BASEREL:         ppc_reloc = R_PPC64_SECTOFF_LO;
1286       break;
1287     case BFD_RELOC_HI16_BASEREL:         ppc_reloc = R_PPC64_SECTOFF_HI;
1288       break;
1289     case BFD_RELOC_HI16_S_BASEREL:       ppc_reloc = R_PPC64_SECTOFF_HA;
1290       break;
1291       /* FIXME: Is CTOR 32 or 64 bits?  Fix md_apply_fix3 in
1292          gas/config/tc-ppc.c too.  */
1293     case BFD_RELOC_CTOR:                 ppc_reloc = R_PPC64_ADDR32;
1294       break;
1295     case BFD_RELOC_64:                   ppc_reloc = R_PPC64_ADDR64;
1296       break;
1297     case BFD_RELOC_PPC64_HIGHER:         ppc_reloc = R_PPC64_ADDR16_HIGHER;
1298       break;
1299     case BFD_RELOC_PPC64_HIGHER_S:       ppc_reloc = R_PPC64_ADDR16_HIGHERA;
1300       break;
1301     case BFD_RELOC_PPC64_HIGHEST:        ppc_reloc = R_PPC64_ADDR16_HIGHEST;
1302       break;
1303     case BFD_RELOC_PPC64_HIGHEST_S:      ppc_reloc = R_PPC64_ADDR16_HIGHESTA;
1304       break;
1305     case BFD_RELOC_64_PCREL:             ppc_reloc = R_PPC64_REL64;
1306       break;
1307     case BFD_RELOC_64_PLTOFF:            ppc_reloc = R_PPC64_PLT64;
1308       break;
1309     case BFD_RELOC_64_PLT_PCREL:         ppc_reloc = R_PPC64_PLTREL64;
1310       break;
1311     case BFD_RELOC_PPC_TOC16:            ppc_reloc = R_PPC64_TOC16;
1312       break;
1313     case BFD_RELOC_PPC64_TOC16_LO:       ppc_reloc = R_PPC64_TOC16_LO;
1314       break;
1315     case BFD_RELOC_PPC64_TOC16_HI:       ppc_reloc = R_PPC64_TOC16_HI;
1316       break;
1317     case BFD_RELOC_PPC64_TOC16_HA:       ppc_reloc = R_PPC64_TOC16_HA;
1318       break;
1319     case BFD_RELOC_PPC64_TOC:            ppc_reloc = R_PPC64_TOC;
1320       break;
1321     case BFD_RELOC_PPC64_PLTGOT16:       ppc_reloc = R_PPC64_PLTGOT16;
1322       break;
1323     case BFD_RELOC_PPC64_PLTGOT16_LO:    ppc_reloc = R_PPC64_PLTGOT16_LO;
1324       break;
1325     case BFD_RELOC_PPC64_PLTGOT16_HI:    ppc_reloc = R_PPC64_PLTGOT16_HI;
1326       break;
1327     case BFD_RELOC_PPC64_PLTGOT16_HA:    ppc_reloc = R_PPC64_PLTGOT16_HA;
1328       break;
1329     case BFD_RELOC_PPC64_ADDR16_DS:      ppc_reloc = R_PPC64_ADDR16_DS;
1330       break;
1331     case BFD_RELOC_PPC64_ADDR16_LO_DS:   ppc_reloc = R_PPC64_ADDR16_LO_DS;
1332       break;
1333     case BFD_RELOC_PPC64_GOT16_DS:       ppc_reloc = R_PPC64_GOT16_DS;
1334       break;
1335     case BFD_RELOC_PPC64_GOT16_LO_DS:    ppc_reloc = R_PPC64_GOT16_LO_DS;
1336       break;
1337     case BFD_RELOC_PPC64_PLT16_LO_DS:    ppc_reloc = R_PPC64_PLT16_LO_DS;
1338       break;
1339     case BFD_RELOC_PPC64_SECTOFF_DS:     ppc_reloc = R_PPC64_SECTOFF_DS;
1340       break;
1341     case BFD_RELOC_PPC64_SECTOFF_LO_DS:  ppc_reloc = R_PPC64_SECTOFF_LO_DS;
1342       break;
1343     case BFD_RELOC_PPC64_TOC16_DS:       ppc_reloc = R_PPC64_TOC16_DS;
1344       break;
1345     case BFD_RELOC_PPC64_TOC16_LO_DS:    ppc_reloc = R_PPC64_TOC16_LO_DS;
1346       break;
1347     case BFD_RELOC_PPC64_PLTGOT16_DS:    ppc_reloc = R_PPC64_PLTGOT16_DS;
1348       break;
1349     case BFD_RELOC_PPC64_PLTGOT16_LO_DS: ppc_reloc = R_PPC64_PLTGOT16_LO_DS;
1350       break;
1351     case BFD_RELOC_VTABLE_INHERIT:       ppc_reloc = R_PPC64_GNU_VTINHERIT;
1352       break;
1353     case BFD_RELOC_VTABLE_ENTRY:         ppc_reloc = R_PPC64_GNU_VTENTRY;
1354       break;
1355     }
1356
1357   return ppc64_elf_howto_table[(int) ppc_reloc];
1358 };
1359
1360 /* Set the howto pointer for a PowerPC ELF reloc.  */
1361
1362 static void
1363 ppc64_elf_info_to_howto (abfd, cache_ptr, dst)
1364      bfd *abfd ATTRIBUTE_UNUSED;
1365      arelent *cache_ptr;
1366      Elf64_Internal_Rela *dst;
1367 {
1368   unsigned int type;
1369
1370   if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1371     /* Initialize howto table if needed.  */
1372     ppc_howto_init ();
1373
1374   type = ELF64_R_TYPE (dst->r_info);
1375   BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
1376                       / sizeof (ppc64_elf_howto_table[0])));
1377   cache_ptr->howto = ppc64_elf_howto_table[type];
1378 }
1379
1380 /* Handle the R_PPC_ADDR16_HA and similar relocs.  */
1381
1382 static bfd_reloc_status_type
1383 ppc64_elf_addr16_ha_reloc (abfd, reloc_entry, symbol, data, input_section,
1384                            output_bfd, error_message)
1385      bfd *abfd ATTRIBUTE_UNUSED;
1386      arelent *reloc_entry;
1387      asymbol *symbol;
1388      PTR data ATTRIBUTE_UNUSED;
1389      asection *input_section;
1390      bfd *output_bfd;
1391      char **error_message ATTRIBUTE_UNUSED;
1392 {
1393   bfd_vma relocation;
1394
1395   if (output_bfd != NULL)
1396     {
1397       reloc_entry->address += input_section->output_offset;
1398       return bfd_reloc_ok;
1399     }
1400
1401   if (reloc_entry->address > input_section->_cooked_size)
1402     return bfd_reloc_outofrange;
1403
1404   if (bfd_is_com_section (symbol->section))
1405     relocation = 0;
1406   else
1407     relocation = symbol->value;
1408
1409   relocation += symbol->section->output_section->vma;
1410   relocation += symbol->section->output_offset;
1411   relocation += reloc_entry->addend;
1412
1413   reloc_entry->addend += (relocation & 0x8000) << 1;
1414
1415   return bfd_reloc_continue;
1416 }
1417
1418 /* Function to set whether a module needs the -mrelocatable bit set.  */
1419
1420 static boolean
1421 ppc64_elf_set_private_flags (abfd, flags)
1422      bfd *abfd;
1423      flagword flags;
1424 {
1425   BFD_ASSERT (!elf_flags_init (abfd)
1426               || elf_elfheader (abfd)->e_flags == flags);
1427
1428   elf_elfheader (abfd)->e_flags = flags;
1429   elf_flags_init (abfd) = true;
1430   return true;
1431 }
1432
1433 /* Copy backend specific data from one object module to another.  */
1434 static boolean
1435 ppc64_elf_copy_private_bfd_data (ibfd, obfd)
1436      bfd *ibfd;
1437      bfd *obfd;
1438 {
1439   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1440       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1441     return true;
1442
1443   BFD_ASSERT (!elf_flags_init (obfd)
1444               || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags);
1445
1446   elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1447   elf_flags_init (obfd) = true;
1448   return true;
1449 }
1450
1451 /* Merge backend specific data from an object file to the output
1452    object file when linking.  */
1453 static boolean
1454 ppc64_elf_merge_private_bfd_data (ibfd, obfd)
1455      bfd *ibfd;
1456      bfd *obfd;
1457 {
1458   flagword old_flags;
1459   flagword new_flags;
1460   boolean error;
1461
1462   /* Check if we have the same endianess.  */
1463   if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1464       && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
1465     {
1466       const char *msg;
1467
1468       if (bfd_big_endian (ibfd))
1469         msg = _("%s: compiled for a big endian system and target is little endian");
1470       else
1471         msg = _("%s: compiled for a little endian system and target is big endian");
1472
1473       (*_bfd_error_handler) (msg, bfd_archive_filename (ibfd));
1474
1475       bfd_set_error (bfd_error_wrong_format);
1476       return false;
1477     }
1478
1479   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1480       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1481     return true;
1482
1483   new_flags = elf_elfheader (ibfd)->e_flags;
1484   old_flags = elf_elfheader (obfd)->e_flags;
1485   if (!elf_flags_init (obfd))
1486     {
1487       /* First call, no flags set.  */
1488       elf_flags_init (obfd) = true;
1489       elf_elfheader (obfd)->e_flags = new_flags;
1490     }
1491
1492   else if (new_flags == old_flags)
1493     /* Compatible flags are ok.  */
1494     ;
1495
1496   else
1497     {
1498       /* Incompatible flags.  Warn about -mrelocatable mismatch.
1499          Allow -mrelocatable-lib to be linked with either.  */
1500       error = false;
1501       if ((new_flags & EF_PPC_RELOCATABLE) != 0
1502           && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
1503         {
1504           error = true;
1505           (*_bfd_error_handler)
1506             (_("%s: compiled with -mrelocatable and linked with modules compiled normally"),
1507              bfd_archive_filename (ibfd));
1508         }
1509       else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
1510                && (old_flags & EF_PPC_RELOCATABLE) != 0)
1511         {
1512           error = true;
1513           (*_bfd_error_handler)
1514             (_("%s: compiled normally and linked with modules compiled with -mrelocatable"),
1515              bfd_archive_filename (ibfd));
1516         }
1517
1518       /* The output is -mrelocatable-lib iff both the input files are.  */
1519       if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
1520         elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
1521
1522       /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
1523          but each input file is either -mrelocatable or -mrelocatable-lib.  */
1524       if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
1525           && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
1526           && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
1527         elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
1528
1529       /* Do not warn about eabi vs. V.4 mismatch, just or in the bit
1530          if any module uses it.  */
1531       elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
1532
1533       new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
1534       old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
1535
1536       /* Warn about any other mismatches.  */
1537       if (new_flags != old_flags)
1538         {
1539           error = true;
1540           (*_bfd_error_handler)
1541             (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
1542              bfd_archive_filename (ibfd), (long) new_flags, (long) old_flags);
1543         }
1544
1545       if (error)
1546         {
1547           bfd_set_error (bfd_error_bad_value);
1548           return false;
1549         }
1550     }
1551
1552   return true;
1553 }
1554
1555 /* Handle a PowerPC specific section when reading an object file.  This
1556    is called when elfcode.h finds a section with an unknown type.  */
1557
1558 static boolean
1559 ppc64_elf_section_from_shdr (abfd, hdr, name)
1560      bfd *abfd;
1561      Elf64_Internal_Shdr *hdr;
1562      char *name;
1563 {
1564   asection *newsect;
1565   flagword flags;
1566
1567   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
1568     return false;
1569
1570   newsect = hdr->bfd_section;
1571   flags = bfd_get_section_flags (abfd, newsect);
1572   if (hdr->sh_flags & SHF_EXCLUDE)
1573     flags |= SEC_EXCLUDE;
1574
1575   if (hdr->sh_type == SHT_ORDERED)
1576     flags |= SEC_SORT_ENTRIES;
1577
1578   bfd_set_section_flags (abfd, newsect, flags);
1579   return true;
1580 }
1581 \f
1582 /* The following functions are specific to the ELF linker, while
1583    functions above are used generally.  Those named ppc64_elf_* are
1584    called by the main ELF linker code.  They appear in this file more
1585    or less in the order in which they are called.  eg.
1586    ppc64_elf_check_relocs is called early in the link process,
1587    ppc64_elf_finish_dynamic_sections is one of the last functions
1588    called.  */
1589
1590 /* The linker needs to keep track of the number of relocs that it
1591    decides to copy as dynamic relocs in check_relocs for each symbol.
1592    This is so that it can later discard them if they are found to be
1593    unnecessary.  We store the information in a field extending the
1594    regular ELF linker hash table.  */
1595
1596 struct ppc_dyn_relocs
1597 {
1598   struct ppc_dyn_relocs *next;
1599
1600   /* The input section of the reloc.  */
1601   asection *sec;
1602
1603   /* Total number of relocs copied for the input section.  */
1604   bfd_size_type count;
1605
1606   /* Number of pc-relative relocs copied for the input section.  */
1607   bfd_size_type pc_count;
1608 };
1609
1610 /* Of those relocs that might be copied as dynamic relocs, this macro
1611    selects between relative and absolute types.  */
1612
1613 #define IS_ABSOLUTE_RELOC(RTYPE)                \
1614   ((RTYPE) != R_PPC64_REL14                     \
1615    && (RTYPE) != R_PPC64_REL14_BRNTAKEN         \
1616    && (RTYPE) != R_PPC64_REL14_BRTAKEN          \
1617    && (RTYPE) != R_PPC64_REL24                  \
1618    && (RTYPE) != R_PPC64_REL32                  \
1619    && (RTYPE) != R_PPC64_REL64)
1620
1621 /* ppc64 ELF linker hash entry.  */
1622
1623 struct ppc_link_hash_entry
1624 {
1625   struct elf_link_hash_entry elf;
1626
1627   /* Track dynamic relocs copied for this symbol.  */
1628   struct ppc_dyn_relocs *dyn_relocs;
1629 };
1630
1631 /* ppc64 ELF linker hash table.  */
1632
1633 struct ppc_link_hash_table
1634 {
1635   struct elf_link_hash_table elf;
1636
1637   /* Short-cuts to get to dynamic linker sections.  */
1638   asection *sgot;
1639   asection *srelgot;
1640   asection *splt;
1641   asection *srelplt;
1642   asection *sdynbss;
1643   asection *srelbss;
1644   asection *sglink;
1645 };
1646
1647 /* Get the ppc64 ELF linker hash table from a link_info structure.  */
1648
1649 #define ppc_hash_table(p) \
1650   ((struct ppc_link_hash_table *) ((p)->hash))
1651
1652 /* Create an entry in a ppc64 ELF linker hash table.  */
1653
1654 static struct bfd_hash_entry *
1655 link_hash_newfunc (entry, table, string)
1656      struct bfd_hash_entry *entry;
1657      struct bfd_hash_table *table;
1658      const char *string;
1659 {
1660   /* Allocate the structure if it has not already been allocated by a
1661      subclass.  */
1662   if (entry == NULL)
1663     {
1664       entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
1665       if (entry == NULL)
1666         return entry;
1667     }
1668
1669   /* Call the allocation method of the superclass.  */
1670   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
1671   if (entry != NULL)
1672     {
1673       struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
1674
1675       eh->dyn_relocs = NULL;
1676     }
1677
1678   return entry;
1679 }
1680
1681 /* Create a ppc64 ELF linker hash table.  */
1682
1683 static struct bfd_link_hash_table *
1684 ppc64_elf_link_hash_table_create (abfd)
1685      bfd *abfd;
1686 {
1687   struct ppc_link_hash_table *htab;
1688   bfd_size_type amt = sizeof (struct ppc_link_hash_table);
1689
1690   htab = (struct ppc_link_hash_table *) bfd_alloc (abfd, amt);
1691   if (htab == NULL)
1692     return NULL;
1693
1694   if (! _bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc))
1695     {
1696       bfd_release (abfd, htab);
1697       return NULL;
1698     }
1699
1700   htab->sgot = NULL;
1701   htab->srelgot = NULL;
1702   htab->splt = NULL;
1703   htab->srelplt = NULL;
1704   htab->sdynbss = NULL;
1705   htab->srelbss = NULL;
1706   htab->sglink = NULL;
1707
1708   return &htab->elf.root;
1709 }
1710
1711 /* Create .got and .rela.got sections in DYNOBJ, and set up
1712    shortcuts to them in our hash table.  */
1713
1714 static boolean
1715 create_got_section (dynobj, info)
1716      bfd *dynobj;
1717      struct bfd_link_info *info;
1718 {
1719   struct ppc_link_hash_table *htab;
1720
1721   if (! _bfd_elf_create_got_section (dynobj, info))
1722     return false;
1723
1724   htab = ppc_hash_table (info);
1725   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
1726   if (!htab->sgot)
1727     abort ();
1728
1729   htab->srelgot = bfd_make_section (dynobj, ".rela.got");
1730   if (!htab->srelgot
1731       || ! bfd_set_section_flags (dynobj, htab->srelgot,
1732                                   (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1733                                    | SEC_IN_MEMORY | SEC_LINKER_CREATED
1734                                    | SEC_READONLY))
1735       || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3))
1736     return false;
1737   return true;
1738 }
1739
1740 /* Create the .glink section as well as the ordinary dynamic
1741    sections.  */
1742
1743 static boolean
1744 ppc64_elf_create_dynamic_sections (dynobj, info)
1745      bfd *dynobj;
1746      struct bfd_link_info *info;
1747 {
1748   struct ppc_link_hash_table *htab;
1749   flagword flags;
1750
1751   htab = ppc_hash_table (info);
1752   if (!htab->sgot && !create_got_section (dynobj, info))
1753     return false;
1754
1755   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1756     return false;
1757
1758   htab->splt = bfd_get_section_by_name (dynobj, ".plt");
1759   htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
1760   htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
1761   if (!info->shared)
1762     htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
1763
1764   if (!htab->splt || !htab->srelplt || !htab->sdynbss
1765       || (!info->shared && !htab->srelbss))
1766     abort ();
1767
1768   /* Our .plt just contains pointers, no code.  */
1769   flags = bfd_get_section_flags (dynobj, htab->splt);
1770   flags &= ~SEC_CODE;
1771   if (! bfd_set_section_flags (dynobj, htab->splt, flags))
1772     return false;
1773
1774   /* Create .glink for global linkage functions.  */
1775   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1776            | SEC_LINKER_CREATED);
1777   htab->sglink = bfd_make_section (dynobj, ".glink");
1778   if (htab->sglink == NULL
1779       || ! bfd_set_section_flags (dynobj, htab->sglink, flags)
1780       || ! bfd_set_section_alignment (dynobj, htab->sglink, 3))
1781     return false;
1782
1783   return true;
1784 }
1785
1786 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
1787
1788 static void
1789 ppc64_elf_copy_indirect_symbol (dir, ind)
1790      struct elf_link_hash_entry *dir, *ind;
1791 {
1792   struct ppc_link_hash_entry *edir, *eind;
1793
1794   edir = (struct ppc_link_hash_entry *) dir;
1795   eind = (struct ppc_link_hash_entry *) ind;
1796
1797   if (edir->dyn_relocs == NULL)
1798     {
1799       edir->dyn_relocs = eind->dyn_relocs;
1800       eind->dyn_relocs = NULL;
1801     }
1802   else if (eind->dyn_relocs != NULL)
1803     abort ();
1804
1805   _bfd_elf_link_hash_copy_indirect (dir, ind);
1806 }
1807
1808 /* Look through the relocs for a section during the first phase, and
1809    calculate needed space in the global offset table, procedure
1810    linkage table, and dynamic reloc sections.  */ 
1811
1812 static boolean
1813 ppc64_elf_check_relocs (abfd, info, sec, relocs)
1814      bfd *abfd;
1815      struct bfd_link_info *info;
1816      asection *sec;
1817      const Elf_Internal_Rela *relocs;
1818 {
1819   struct ppc_link_hash_table *htab;
1820   Elf_Internal_Shdr *symtab_hdr;
1821   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
1822   const Elf_Internal_Rela *rel;
1823   const Elf_Internal_Rela *rel_end;
1824   asection *sreloc;
1825
1826   if (info->relocateable)
1827     return true;
1828
1829   htab = ppc_hash_table (info);
1830   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1831
1832   sym_hashes = elf_sym_hashes (abfd);
1833   sym_hashes_end = (sym_hashes
1834                     + symtab_hdr->sh_size / sizeof (Elf64_External_Sym));
1835   if (!elf_bad_symtab (abfd))
1836     sym_hashes_end -= symtab_hdr->sh_info;
1837
1838   sreloc = NULL;
1839
1840   rel_end = relocs + sec->reloc_count;
1841   for (rel = relocs; rel < rel_end; rel++)
1842     {
1843       unsigned long r_symndx;
1844       struct elf_link_hash_entry *h;
1845
1846       r_symndx = ELF64_R_SYM (rel->r_info);
1847       if (r_symndx < symtab_hdr->sh_info)
1848         h = NULL;
1849       else
1850         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1851
1852       switch (ELF64_R_TYPE (rel->r_info))
1853         {
1854           /* GOT16 relocations */
1855         case R_PPC64_GOT16:
1856         case R_PPC64_GOT16_DS:
1857         case R_PPC64_GOT16_HA:
1858         case R_PPC64_GOT16_HI:
1859         case R_PPC64_GOT16_LO:
1860         case R_PPC64_GOT16_LO_DS:
1861
1862           /* This symbol requires a global offset table entry.  */
1863           if (htab->sgot == NULL)
1864             {
1865               if (htab->elf.dynobj == NULL)
1866                 htab->elf.dynobj = abfd;
1867               if (!create_got_section (htab->elf.dynobj, info))
1868                 return false;
1869             }
1870
1871           if (h != NULL)
1872             {
1873               h->got.refcount += 1;
1874             }
1875           else
1876             {
1877               bfd_signed_vma *local_got_refcounts;
1878
1879               /* This is a global offset table entry for a local symbol.  */
1880               local_got_refcounts = elf_local_got_refcounts (abfd);
1881               if (local_got_refcounts == NULL)
1882                 {
1883                   bfd_size_type size;
1884
1885                   size = symtab_hdr->sh_info;
1886                   size *= sizeof (bfd_signed_vma);
1887                   local_got_refcounts = ((bfd_signed_vma *)
1888                                          bfd_zalloc (abfd, size));
1889                   if (local_got_refcounts == NULL)
1890                     return false;
1891                   elf_local_got_refcounts (abfd) = local_got_refcounts;
1892                 }
1893               local_got_refcounts[r_symndx] += 1;
1894             }
1895           break;
1896
1897         case R_PPC64_PLT16_HA:
1898         case R_PPC64_PLT16_HI:
1899         case R_PPC64_PLT16_LO:
1900         case R_PPC64_PLT32:
1901         case R_PPC64_PLT64:
1902           /* This symbol requires a procedure linkage table entry.  We
1903              actually build the entry in adjust_dynamic_symbol,
1904              because this might be a case of linking PIC code without
1905              linking in any dynamic objects, in which case we don't
1906              need to generate a procedure linkage table after all.  */
1907           if (h == NULL)
1908             {
1909               /* It does not make sense to have a procedure linkage
1910                  table entry for a local symbol.  */
1911               bfd_set_error (bfd_error_bad_value);
1912               return false;
1913             }
1914
1915           h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
1916           h->plt.refcount += 1;
1917           break;
1918
1919           /* The following relocations don't need to propagate the
1920              relocation if linking a shared object since they are
1921              section relative.  */
1922         case R_PPC64_SECTOFF:
1923         case R_PPC64_SECTOFF_LO:
1924         case R_PPC64_SECTOFF_HI:
1925         case R_PPC64_SECTOFF_HA:
1926         case R_PPC64_SECTOFF_DS:
1927         case R_PPC64_SECTOFF_LO_DS:
1928         case R_PPC64_TOC16:
1929         case R_PPC64_TOC16_LO:
1930         case R_PPC64_TOC16_HI:
1931         case R_PPC64_TOC16_HA:
1932         case R_PPC64_TOC16_DS:
1933         case R_PPC64_TOC16_LO_DS:
1934           break;
1935
1936           /* This relocation describes the C++ object vtable hierarchy.
1937              Reconstruct it for later use during GC.  */
1938         case R_PPC64_GNU_VTINHERIT:
1939           if (!_bfd_elf64_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1940             return false;
1941           break;
1942
1943           /* This relocation describes which C++ vtable entries are actually
1944              used.  Record for later use during GC.  */
1945         case R_PPC64_GNU_VTENTRY:
1946           if (!_bfd_elf64_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1947             return false;
1948           break;
1949
1950         case R_PPC64_REL64:
1951         case R_PPC64_REL32:
1952         case R_PPC64_REL24:
1953         case R_PPC64_REL14:
1954         case R_PPC64_REL14_BRTAKEN:
1955         case R_PPC64_REL14_BRNTAKEN:
1956         case R_PPC64_ADDR14:
1957         case R_PPC64_ADDR14_BRNTAKEN:
1958         case R_PPC64_ADDR14_BRTAKEN:
1959         case R_PPC64_ADDR16:
1960         case R_PPC64_ADDR16_DS:
1961         case R_PPC64_ADDR16_HA:
1962         case R_PPC64_ADDR16_HI:
1963         case R_PPC64_ADDR16_HIGHER:
1964         case R_PPC64_ADDR16_HIGHERA:
1965         case R_PPC64_ADDR16_HIGHEST:
1966         case R_PPC64_ADDR16_HIGHESTA:
1967         case R_PPC64_ADDR16_LO:
1968         case R_PPC64_ADDR16_LO_DS:
1969         case R_PPC64_ADDR24:
1970         case R_PPC64_ADDR30:
1971         case R_PPC64_ADDR32:
1972         case R_PPC64_ADDR64:
1973         case R_PPC64_UADDR16:
1974         case R_PPC64_UADDR32:
1975         case R_PPC64_UADDR64:
1976         case R_PPC64_TOC:
1977           /* If we are creating a shared library, and this is a reloc
1978              against a global symbol, or a non PC relative reloc
1979              against a local symbol, then we need to copy the reloc
1980              into the shared library.  However, if we are linking with
1981              -Bsymbolic, we do not need to copy a reloc against a
1982              global symbol which is defined in an object we are
1983              including in the link (i.e., DEF_REGULAR is set).  At
1984              this point we have not seen all the input files, so it is
1985              possible that DEF_REGULAR is not set now but will be set
1986              later (it is never cleared).  In case of a weak definition,
1987              DEF_REGULAR may be cleared later by a strong definition in
1988              a shared library.  We account for that possibility below by
1989              storing information in the relocs_copied field of the hash
1990              table entry.  A similar situation occurs when creating
1991              shared libraries and symbol visibility changes render the
1992              symbol local.
1993
1994              If on the other hand, we are creating an executable, we
1995              may need to keep relocations for symbols satisfied by a
1996              dynamic library if we manage to avoid copy relocs for the
1997              symbol.  */
1998           if ((info->shared
1999                && (sec->flags & SEC_ALLOC) != 0
2000                && (IS_ABSOLUTE_RELOC (ELF64_R_TYPE (rel->r_info))
2001                    || (h != NULL
2002                        && (! info->symbolic
2003                            || h->root.type == bfd_link_hash_defweak
2004                            || (h->elf_link_hash_flags
2005                                & ELF_LINK_HASH_DEF_REGULAR) == 0))))
2006               || (!info->shared
2007                   && (sec->flags & SEC_ALLOC) != 0
2008                   && h != NULL
2009                   && (h->root.type == bfd_link_hash_defweak
2010                       || (h->elf_link_hash_flags
2011                           & ELF_LINK_HASH_DEF_REGULAR) == 0)))
2012             {
2013               /* We must copy these reloc types into the output file.
2014                  Create a reloc section in dynobj and make room for
2015                  this reloc.  */
2016               if (sreloc == NULL)
2017                 {
2018                   const char *name;
2019                   bfd *dynobj;
2020
2021                   name = (bfd_elf_string_from_elf_section
2022                           (abfd,
2023                            elf_elfheader (abfd)->e_shstrndx,
2024                            elf_section_data (sec)->rel_hdr.sh_name));
2025                   if (name == NULL)
2026                     return false;
2027
2028                   if (strncmp (name, ".rela", 5) != 0
2029                       || strcmp (bfd_get_section_name (abfd, sec),
2030                                  name + 5) != 0)
2031                     {
2032                       (*_bfd_error_handler)
2033                         (_("%s: bad relocation section name `%s\'"),
2034                          bfd_archive_filename (abfd), name);
2035                     }
2036
2037                   if (htab->elf.dynobj == NULL)
2038                     htab->elf.dynobj = abfd;
2039
2040                   dynobj = htab->elf.dynobj;
2041                   sreloc = bfd_get_section_by_name (dynobj, name);
2042                   if (sreloc == NULL)
2043                     {
2044                       flagword flags;
2045
2046                       sreloc = bfd_make_section (dynobj, name);
2047                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
2048                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2049                       if ((sec->flags & SEC_ALLOC) != 0)
2050                         flags |= SEC_ALLOC | SEC_LOAD;
2051                       if (sreloc == NULL
2052                           || ! bfd_set_section_flags (dynobj, sreloc, flags)
2053                           || ! bfd_set_section_alignment (dynobj, sreloc, 3))
2054                         return false;
2055                     }
2056                   elf_section_data (sec)->sreloc = sreloc;
2057                 }
2058
2059               /* If this is a global symbol, we count the number of
2060                  relocations we need for this symbol.  */
2061               if (h != NULL)
2062                 {
2063                   struct ppc_link_hash_entry *eh;
2064                   struct ppc_dyn_relocs *p;
2065
2066                   eh = (struct ppc_link_hash_entry *) h;
2067                   p = eh->dyn_relocs;
2068
2069                   if (p == NULL || p->sec != sec)
2070                     {
2071                       p = ((struct ppc_dyn_relocs *)
2072                            bfd_alloc (htab->elf.dynobj,
2073                                       (bfd_size_type) sizeof *p));
2074                       if (p == NULL)
2075                         return false;
2076                       p->next = eh->dyn_relocs;
2077                       eh->dyn_relocs = p;
2078                       p->sec = sec;
2079                       p->count = 0;
2080                       p->pc_count = 0;
2081                     }
2082
2083                   p->count += 1;
2084                   if (!IS_ABSOLUTE_RELOC (ELF64_R_TYPE (rel->r_info)))
2085                     p->pc_count += 1;
2086                 }
2087               else
2088                 {
2089                   /* Track dynamic relocs needed for local syms too.  */
2090                   elf_section_data (sec)->local_dynrel += 1;
2091                 }
2092             }
2093           break;
2094
2095         default:
2096         }
2097     }
2098
2099   return true;
2100 }
2101
2102 /* Return the section that should be marked against GC for a given
2103    relocation.  */
2104
2105 static asection *
2106 ppc64_elf_gc_mark_hook (abfd, info, rel, h, sym)
2107      bfd *abfd;
2108      struct bfd_link_info *info ATTRIBUTE_UNUSED;
2109      Elf_Internal_Rela *rel;
2110      struct elf_link_hash_entry *h;
2111      Elf_Internal_Sym *sym;
2112 {
2113   if (h != NULL)
2114     {
2115       switch (ELF64_R_TYPE (rel->r_info))
2116         {
2117         case R_PPC64_GNU_VTINHERIT:
2118         case R_PPC64_GNU_VTENTRY:
2119           break;
2120
2121         default:
2122           switch (h->root.type)
2123             {
2124             case bfd_link_hash_defined:
2125             case bfd_link_hash_defweak:
2126               return h->root.u.def.section;
2127
2128             case bfd_link_hash_common:
2129               return h->root.u.c.p->section;
2130
2131             default:
2132               break;
2133             }
2134         }
2135     }
2136   else
2137     {
2138       if (! (elf_bad_symtab (abfd)
2139              && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
2140           && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
2141                 && sym->st_shndx != SHN_COMMON))
2142         {
2143           return bfd_section_from_elf_index (abfd, sym->st_shndx);
2144         }
2145     }
2146
2147   return NULL;
2148 }
2149
2150 /* Update the .got, .plt. and dynamic reloc reference counts for the
2151    section being removed.  */
2152
2153 static boolean
2154 ppc64_elf_gc_sweep_hook (abfd, info, sec, relocs)
2155      bfd *abfd;
2156      struct bfd_link_info *info ATTRIBUTE_UNUSED;
2157      asection *sec;
2158      const Elf_Internal_Rela *relocs;
2159 {
2160   Elf_Internal_Shdr *symtab_hdr;
2161   struct elf_link_hash_entry **sym_hashes;
2162   bfd_signed_vma *local_got_refcounts;
2163   const Elf_Internal_Rela *rel, *relend;
2164   unsigned long r_symndx;
2165   struct elf_link_hash_entry *h;
2166
2167   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2168   sym_hashes = elf_sym_hashes (abfd);
2169   local_got_refcounts = elf_local_got_refcounts (abfd);
2170
2171   relend = relocs + sec->reloc_count;
2172   for (rel = relocs; rel < relend; rel++)
2173     switch (ELF64_R_TYPE (rel->r_info))
2174       {
2175       case R_PPC64_GOT16:
2176       case R_PPC64_GOT16_DS:
2177       case R_PPC64_GOT16_HA:
2178       case R_PPC64_GOT16_HI:
2179       case R_PPC64_GOT16_LO:
2180       case R_PPC64_GOT16_LO_DS:
2181         r_symndx = ELF64_R_SYM (rel->r_info);
2182         if (r_symndx >= symtab_hdr->sh_info)
2183           {
2184             h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2185             if (h->got.refcount > 0)
2186               h->got.refcount--;
2187           }
2188         else
2189           {
2190             if (local_got_refcounts[r_symndx] > 0)
2191               local_got_refcounts[r_symndx]--;
2192           }
2193         break;
2194
2195       case R_PPC64_PLT16_HA:
2196       case R_PPC64_PLT16_HI:
2197       case R_PPC64_PLT16_LO:
2198       case R_PPC64_PLT32:
2199       case R_PPC64_PLT64:
2200         r_symndx = ELF64_R_SYM (rel->r_info);
2201         if (r_symndx >= symtab_hdr->sh_info)
2202           {
2203             h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2204             if (h->plt.refcount > 0)
2205               h->plt.refcount--;
2206           }
2207         break;
2208
2209       case R_PPC64_REL14:
2210       case R_PPC64_REL14_BRNTAKEN:
2211       case R_PPC64_REL14_BRTAKEN:
2212       case R_PPC64_REL24:
2213       case R_PPC64_REL32:
2214       case R_PPC64_REL64:
2215         r_symndx = ELF64_R_SYM (rel->r_info);
2216         if (r_symndx >= symtab_hdr->sh_info)
2217           {
2218             struct ppc_link_hash_entry *eh;
2219             struct ppc_dyn_relocs **pp;
2220             struct ppc_dyn_relocs *p;
2221
2222             h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2223             eh = (struct ppc_link_hash_entry *) h;
2224
2225             for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2226               if (p->sec == sec)
2227                 {
2228                   p->pc_count -= 1;
2229                   p->count -= 1;
2230                   if (p->count == 0)
2231                     *pp = p->next;
2232                   break;
2233                 }
2234           }
2235         break;
2236
2237       case R_PPC64_ADDR14:
2238       case R_PPC64_ADDR14_BRNTAKEN:
2239       case R_PPC64_ADDR14_BRTAKEN:
2240       case R_PPC64_ADDR16:
2241       case R_PPC64_ADDR16_DS:
2242       case R_PPC64_ADDR16_HA:
2243       case R_PPC64_ADDR16_HI:
2244       case R_PPC64_ADDR16_HIGHER:
2245       case R_PPC64_ADDR16_HIGHERA:
2246       case R_PPC64_ADDR16_HIGHEST:
2247       case R_PPC64_ADDR16_HIGHESTA:
2248       case R_PPC64_ADDR16_LO:
2249       case R_PPC64_ADDR16_LO_DS:
2250       case R_PPC64_ADDR24:
2251       case R_PPC64_ADDR30:
2252       case R_PPC64_ADDR32:
2253       case R_PPC64_ADDR64:
2254       case R_PPC64_UADDR16:
2255       case R_PPC64_UADDR32:
2256       case R_PPC64_UADDR64:
2257       case R_PPC64_TOC:
2258         r_symndx = ELF64_R_SYM (rel->r_info);
2259         if (r_symndx >= symtab_hdr->sh_info)
2260           {
2261             struct ppc_link_hash_entry *eh;
2262             struct ppc_dyn_relocs **pp;
2263             struct ppc_dyn_relocs *p;
2264
2265             h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2266             eh = (struct ppc_link_hash_entry *) h;
2267
2268             for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2269               if (p->sec == sec)
2270                 {
2271                   p->count -= 1;
2272                   if (p->count == 0)
2273                     *pp = p->next;
2274                   break;
2275                 }
2276           }
2277         break;
2278
2279       default:
2280         break;
2281       }
2282
2283   return true;
2284 }
2285
2286 /* Adjust a symbol defined by a dynamic object and referenced by a
2287    regular object.  The current definition is in some section of the
2288    dynamic object, but we're not including those sections.  We have to
2289    change the definition to something the rest of the link can
2290    understand.  */
2291
2292 static boolean
2293 ppc64_elf_adjust_dynamic_symbol (info, h)
2294      struct bfd_link_info *info;
2295      struct elf_link_hash_entry *h;
2296 {
2297   struct ppc_link_hash_table *htab;
2298   struct ppc_link_hash_entry * eh;
2299   struct ppc_dyn_relocs *p;
2300   asection *s;
2301   unsigned int power_of_two;
2302
2303   htab = ppc_hash_table (info);
2304
2305   /* If this is a function, put it in the procedure linkage table.  We
2306      will fill in the contents of the procedure linkage table later.  */
2307   if (h->type == STT_FUNC
2308       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
2309     {
2310       struct elf_link_hash_entry *fdh;
2311
2312       /* If it's a function entry point, the name starts with a dot
2313          unless someone has written some poor assembly code.  The ABI
2314          for .plt calls requires that there be a function descriptor
2315          sym which has the name of the function minus the dot.  */
2316
2317       if (h->plt.refcount <= 0
2318           || h->root.root.string[0] != '.'
2319           || h->root.root.string[1] == '\0'
2320           || (! info->shared
2321               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
2322               && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0))
2323         {
2324           /* This case can occur if we saw a PLT reloc in an input
2325              file, but the symbol was never referred to by a dynamic
2326              object, or if all references were garbage collected.  In
2327              such a case, we don't actually need to build a procedure
2328              linkage table entry.  */
2329           h->plt.offset = (bfd_vma) -1;
2330           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2331           return true;
2332         }
2333
2334       /* Find the corresponding function descriptor symbol.  Create it
2335          as undefined if necessary.  ppc_elf64_finish_dynamic_symbol
2336          will look it up again and create a JMP_SLOT reloc for it.  */
2337
2338       fdh = elf_link_hash_lookup (elf_hash_table (info),
2339                                   h->root.root.string + 1,
2340                                   false, false, false);
2341
2342       if (fdh == NULL)
2343         {
2344           asymbol *newsym;
2345
2346           /* Create it as undefined.  */
2347           newsym = bfd_make_empty_symbol (htab->elf.dynobj);
2348           newsym->name = h->root.root.string + 1;
2349           newsym->section = bfd_und_section_ptr;
2350           newsym->value = 0;
2351           newsym->flags = BSF_DYNAMIC | BSF_OBJECT;
2352
2353           if ( !(_bfd_generic_link_add_one_symbol
2354                  (info, htab->elf.dynobj, newsym->name, newsym->flags,
2355                   newsym->section, newsym->value, NULL, false, false,
2356                   (struct bfd_link_hash_entry **) &fdh)))
2357             {
2358               return false;
2359             }
2360         }
2361       return true;
2362     }
2363
2364   /* If this is a weak symbol, and there is a real definition, the
2365      processor independent code will have arranged for us to see the
2366      real definition first, and we can just use the same value.  */
2367   if (h->weakdef != NULL)
2368     {
2369       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
2370                   || h->weakdef->root.type == bfd_link_hash_defweak);
2371       h->root.u.def.section = h->weakdef->root.u.def.section;
2372       h->root.u.def.value = h->weakdef->root.u.def.value;
2373     }
2374
2375   /* This is a reference to a symbol defined by a dynamic object which
2376      is not a function.  */
2377
2378   /* If we are creating a shared library, we must presume that the
2379      only references to the symbol are via the global offset table.
2380      For such cases we need not do anything here; the relocations will
2381      be handled correctly by relocate_section.  */
2382   if (info->shared)
2383     return true;
2384
2385   /* If there are no references to this symbol that do not use the
2386      GOT, we don't need to generate a copy reloc.  */
2387   if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
2388     return true;
2389
2390   eh = (struct ppc_link_hash_entry *) h;
2391   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2392     {
2393       s = p->sec->output_section;
2394       if (s != NULL && (s->flags & SEC_READONLY) != 0)
2395         break;
2396     }
2397
2398   /* If we didn't find any dynamic relocs in read-only sections, then
2399      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */ 
2400   if (p == NULL)
2401     {
2402       h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
2403       return true;
2404     }
2405
2406   /* We must allocate the symbol in our .dynbss section, which will
2407      become part of the .bss section of the executable.  There will be
2408      an entry for this symbol in the .dynsym section.  The dynamic
2409      object will contain position independent code, so all references
2410      from the dynamic object to this symbol will go through the global
2411      offset table.  The dynamic linker will use the .dynsym entry to
2412      determine the address it must put in the global offset table, so
2413      both the dynamic object and the regular object will refer to the
2414      same memory location for the variable.  */
2415
2416   /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
2417      copy the initial value out of the dynamic object and into the
2418      runtime process image.  We need to remember the offset into the
2419      .rela.bss section we are going to use.  */
2420   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
2421     {
2422       htab->srelbss->_raw_size += sizeof (Elf64_External_Rela);
2423       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
2424     }
2425
2426   /* We need to figure out the alignment required for this symbol.  I
2427      have no idea how ELF linkers handle this.  */
2428   power_of_two = bfd_log2 (h->size);
2429   if (power_of_two > 4)
2430     power_of_two = 4;
2431
2432   /* Apply the required alignment.  */
2433   s = htab->sdynbss;
2434   s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two));
2435   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
2436     {
2437       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
2438         return false;
2439     }
2440
2441   /* Define the symbol as being at this point in the section.  */
2442   h->root.u.def.section = s;
2443   h->root.u.def.value = s->_raw_size;
2444
2445   /* Increment the section size to make room for the symbol.  */
2446   s->_raw_size += h->size;
2447
2448   return true;
2449 }
2450
2451 /* This is the condition under which ppc64_elf_finish_dynamic_symbol
2452    will be called from elflink.h.  If elflink.h doesn't call our
2453    finish_dynamic_symbol routine, we'll need to do something about
2454    initializing any .plt and .got entries in ppc64_elf_relocate_section.  */
2455 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
2456   ((DYN)                                                                \
2457    && ((INFO)->shared                                                   \
2458        || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)      \
2459    && ((H)->dynindx != -1                                               \
2460        || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
2461
2462 /* Allocate space in .plt, .got and associated reloc sections for
2463    dynamic relocs.  */
2464
2465 static boolean
2466 allocate_dynrelocs (h, inf)
2467      struct elf_link_hash_entry *h;
2468      PTR inf;
2469 {
2470   struct bfd_link_info *info;
2471   struct ppc_link_hash_table *htab;
2472   asection *s;
2473   struct ppc_link_hash_entry *eh;
2474   struct ppc_dyn_relocs *p;
2475
2476   if (h->root.type == bfd_link_hash_indirect
2477       || h->root.type == bfd_link_hash_warning)
2478     return true;
2479
2480   info = (struct bfd_link_info *) inf;
2481   htab = ppc_hash_table (info);
2482
2483   if (htab->elf.dynamic_sections_created
2484       && h->plt.refcount > 0)
2485     {
2486       /* Make sure this symbol is output as a dynamic symbol.
2487          Undefined weak syms won't yet be marked as dynamic.  */
2488       if (h->dynindx == -1
2489           && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
2490         {
2491           if (! bfd_elf64_link_record_dynamic_symbol (info, h))
2492             return false;
2493         }
2494
2495       BFD_ASSERT (h->root.root.string[0] == '.'
2496                   && h->root.root.string[1] != '\0');
2497
2498       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
2499         {
2500           /* Make sure the corresponding function descriptor symbol is
2501              dynamic too.  */
2502
2503           if (h->dynindx != -1)
2504             {
2505               struct elf_link_hash_entry *fdh;
2506
2507               fdh = elf_link_hash_lookup (elf_hash_table (info),
2508                                           h->root.root.string + 1,
2509                                           false, false, false);
2510
2511               if (fdh == NULL)
2512                 abort ();
2513
2514               if (fdh->dynindx == -1
2515                   && (fdh->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
2516                 {
2517                   if (! bfd_elf64_link_record_dynamic_symbol (info, fdh))
2518                     return false;
2519                 }
2520             }
2521
2522           /* If this is the first .plt entry, make room for the special
2523              first entry.  */
2524           s = htab->splt;
2525           if (s->_raw_size == 0)
2526             s->_raw_size += PLT_INITIAL_ENTRY_SIZE;
2527
2528           h->plt.offset = s->_raw_size;
2529
2530           /* Make room for this entry.  */
2531           s->_raw_size += PLT_ENTRY_SIZE;
2532
2533           /* Point the function at the linkage stub.  This works because
2534              the only references to the function code sym are calls.
2535              Function pointer comparisons use the function descriptor.  */
2536           s = htab->sglink;
2537           h->root.type = bfd_link_hash_defined;
2538           h->root.u.def.section = s;
2539           h->root.u.def.value = s->_raw_size;
2540           h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2541
2542           /* Make room for global linkage code in .glink.  */
2543           s->_raw_size += PPC64_ELF_GLINK_SIZE;
2544
2545           /* We also need to make an entry in the .rela.plt section.  */
2546           s = htab->srelplt;
2547           s->_raw_size += sizeof (Elf64_External_Rela);
2548         }
2549       else
2550         {
2551           h->plt.offset = (bfd_vma) -1;
2552           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2553         }
2554     }
2555   else
2556     {
2557       h->plt.offset = (bfd_vma) -1;
2558       h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2559     }
2560
2561   if (h->got.refcount > 0)
2562     {
2563       boolean dyn;
2564
2565       /* Make sure this symbol is output as a dynamic symbol.
2566          Undefined weak syms won't yet be marked as dynamic.  */
2567       if (h->dynindx == -1
2568           && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
2569         {
2570           if (! bfd_elf64_link_record_dynamic_symbol (info, h))
2571             return false;
2572         }
2573
2574       s = htab->sgot;
2575       h->got.offset = s->_raw_size;
2576       s->_raw_size += 8;
2577       dyn = htab->elf.dynamic_sections_created;
2578       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
2579         htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
2580     }
2581   else
2582     h->got.offset = (bfd_vma) -1;
2583
2584   eh = (struct ppc_link_hash_entry *) h;
2585   if (eh->dyn_relocs == NULL)
2586     return true;
2587
2588   /* In the shared -Bsymbolic case, discard space allocated for
2589      dynamic pc-relative relocs against symbols which turn out to be
2590      defined in regular objects.  For the normal shared case, discard
2591      space for relocs that have become local due to symbol visibility
2592      changes.  */
2593
2594   if (info->shared)
2595     {
2596       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
2597           && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
2598               || info->symbolic))
2599         {
2600           struct ppc_dyn_relocs **pp;
2601
2602           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2603             {
2604               p->count -= p->pc_count;
2605               p->pc_count = 0;
2606               if (p->count == 0)
2607                 *pp = p->next;
2608               else
2609                 pp = &p->next;
2610             }
2611         }
2612     }
2613   else
2614     {
2615       /* For the non-shared case, discard space for relocs against
2616          symbols which turn out to need copy relocs or are not
2617          dynamic.  */
2618
2619       if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
2620           && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2621                && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2622               || (htab->elf.dynamic_sections_created
2623                   && (h->root.type == bfd_link_hash_undefweak
2624                       || h->root.type == bfd_link_hash_undefined))))
2625         {
2626           /* Make sure this symbol is output as a dynamic symbol.
2627              Undefined weak syms won't yet be marked as dynamic.  */
2628           if (h->dynindx == -1
2629               && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
2630             {
2631               if (! bfd_elf32_link_record_dynamic_symbol (info, h))
2632                 return false;
2633             }
2634
2635           /* If that succeeded, we know we'll be keeping all the
2636              relocs.  */
2637           if (h->dynindx != -1)
2638             goto keep;
2639         }
2640
2641       eh->dyn_relocs = NULL;
2642
2643     keep:
2644     }
2645
2646   /* Finally, allocate space.  */
2647   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2648     {
2649       asection *sreloc = elf_section_data (p->sec)->sreloc;
2650       sreloc->_raw_size += p->count * sizeof (Elf64_External_Rela);
2651     }
2652
2653   return true;
2654 }
2655
2656 /* Find any dynamic relocs that apply to read-only sections.  */
2657
2658 static boolean
2659 readonly_dynrelocs (h, inf)
2660      struct elf_link_hash_entry *h;
2661      PTR inf;
2662 {
2663   struct ppc_link_hash_entry *eh;
2664   struct ppc_dyn_relocs *p;
2665
2666   eh = (struct ppc_link_hash_entry *) h;
2667   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2668     {
2669       asection *s = p->sec->output_section;
2670
2671       if (s != NULL && (s->flags & SEC_READONLY) != 0)
2672         {
2673           struct bfd_link_info *info = (struct bfd_link_info *) inf;
2674
2675           info->flags |= DF_TEXTREL;
2676
2677           /* Not an error, just cut short the traversal.  */
2678           return false;
2679         }
2680     }
2681   return true;
2682 }
2683
2684 /* Set the sizes of the dynamic sections.  */
2685
2686 static boolean
2687 ppc64_elf_size_dynamic_sections (output_bfd, info)
2688      bfd *output_bfd ATTRIBUTE_UNUSED;
2689      struct bfd_link_info *info;
2690 {
2691   struct ppc_link_hash_table *htab;
2692   bfd *dynobj;
2693   asection *s;
2694   boolean relocs;
2695   bfd *ibfd;
2696
2697   htab = ppc_hash_table (info);
2698   dynobj = htab->elf.dynobj;
2699   if (dynobj == NULL)
2700     abort ();
2701
2702   if (htab->elf.dynamic_sections_created)
2703     {
2704       /* Set the contents of the .interp section to the interpreter.  */
2705       if (! info->shared)
2706         {
2707           s = bfd_get_section_by_name (dynobj, ".interp");
2708           if (s == NULL)
2709             abort ();
2710           s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
2711           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2712         }
2713     }
2714
2715   /* Set up .got offsets for local syms, and space for local dynamic
2716      relocs.  */
2717   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2718     {
2719       bfd_signed_vma *local_got;
2720       bfd_signed_vma *end_local_got;
2721       bfd_size_type locsymcount;
2722       Elf_Internal_Shdr *symtab_hdr;
2723       asection *srel;
2724
2725       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2726         continue;
2727
2728       for (s = ibfd->sections; s != NULL; s = s->next)
2729         {
2730           bfd_size_type count = elf_section_data (s)->local_dynrel;
2731
2732           if (count != 0)
2733             {
2734               srel = elf_section_data (s)->sreloc;
2735               srel->_raw_size += count * sizeof (Elf64_External_Rela);
2736             }
2737         }
2738
2739       local_got = elf_local_got_refcounts (ibfd);
2740       if (!local_got)
2741         continue;
2742
2743       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2744       locsymcount = symtab_hdr->sh_info;
2745       end_local_got = local_got + locsymcount;
2746       s = htab->sgot;
2747       srel = htab->srelgot;
2748       for (; local_got < end_local_got; ++local_got)
2749         {
2750           if (*local_got > 0)
2751             {
2752               *local_got = s->_raw_size;
2753               s->_raw_size += 8;
2754               if (info->shared)
2755                 srel->_raw_size += sizeof (Elf64_External_Rela);
2756             }
2757           else
2758             *local_got = (bfd_vma) -1;
2759         }
2760     }
2761
2762   /* Allocate global sym .plt and .got entries, and space for global
2763      sym dynamic relocs.  */
2764   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
2765
2766   /* We now have determined the sizes of the various dynamic sections.
2767      Allocate memory for them.  */
2768   relocs = false;
2769   for (s = dynobj->sections; s != NULL; s = s->next)
2770     {
2771       if ((s->flags & SEC_LINKER_CREATED) == 0)
2772         continue;
2773
2774       if (s == htab->splt
2775           || s == htab->sgot
2776           || s == htab->sglink)
2777         {
2778           /* Strip this section if we don't need it; see the
2779              comment below.  */
2780         }
2781       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
2782         {
2783           if (s->_raw_size == 0)
2784             {
2785               /* If we don't need this section, strip it from the
2786                  output file.  This is mostly to handle .rela.bss and
2787                  .rela.plt.  We must create both sections in
2788                  create_dynamic_sections, because they must be created
2789                  before the linker maps input sections to output
2790                  sections.  The linker does that before
2791                  adjust_dynamic_symbol is called, and it is that
2792                  function which decides whether anything needs to go
2793                  into these sections.  */
2794             }
2795           else
2796             {
2797               if (s != htab->srelplt)
2798                 relocs = true;
2799
2800               /* We use the reloc_count field as a counter if we need
2801                  to copy relocs into the output file.  */
2802               s->reloc_count = 0;
2803             }
2804         }
2805       else
2806         {
2807           /* It's not one of our sections, so don't allocate space.  */
2808           continue;
2809         }
2810
2811       if (s->_raw_size == 0)
2812         {
2813           _bfd_strip_section_from_output (info, s);
2814           continue;
2815         }
2816
2817       /* Allocate memory for the section contents.  We use bfd_zalloc
2818          here in case unused entries are not reclaimed before the
2819          section's contents are written out.  This should not happen,
2820          but this way if it does, we get a R_PPC64_NONE reloc instead
2821          of garbage.  */
2822       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
2823       if (s->contents == NULL)
2824         return false;
2825     }
2826
2827   if (elf_hash_table (info)->dynamic_sections_created)
2828     {
2829       /* Add some entries to the .dynamic section.  We fill in the
2830          values later, in ppc64_elf_finish_dynamic_sections, but we
2831          must add the entries now so that we get the correct size for
2832          the .dynamic section.  The DT_DEBUG entry is filled in by the
2833          dynamic linker and used by the debugger.  */
2834 #define add_dynamic_entry(TAG, VAL) \
2835   bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
2836
2837       if (!info->shared)
2838         {
2839           if (!add_dynamic_entry (DT_DEBUG, 0))
2840             return false;
2841         }
2842
2843       if (htab->splt->_raw_size != 0)
2844         {
2845           if (!add_dynamic_entry (DT_PLTGOT, 0)
2846               || !add_dynamic_entry (DT_PLTRELSZ, 0)
2847               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2848               || !add_dynamic_entry (DT_JMPREL, 0))
2849             return false;
2850         }
2851
2852       if (relocs)
2853         {
2854           if (!add_dynamic_entry (DT_RELA, 0)
2855               || !add_dynamic_entry (DT_RELASZ, 0)
2856               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
2857             return false;
2858
2859           /* If any dynamic relocs apply to a read-only section,
2860              then we need a DT_TEXTREL entry.  */
2861           elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, (PTR) info);
2862
2863           if ((info->flags & DF_TEXTREL) != 0)
2864             {
2865               if (!add_dynamic_entry (DT_TEXTREL, 0))
2866                 return false;
2867             }
2868         }
2869     }
2870 #undef add_dynamic_entry
2871
2872   return true;
2873 }
2874
2875 /* Called after we have seen all the input files/sections, but before
2876    final symbol resolution and section placement has been determined.
2877
2878    We use this hook to provide a value for TOCstart, which we store in
2879    the output bfd elf_gp, then we call the generic ELF final link
2880    routine.  */
2881
2882 static boolean
2883 ppc64_elf_final_link (abfd, info)
2884      bfd *abfd;
2885      struct bfd_link_info *info;
2886 {
2887   if (! info->relocateable)
2888     {
2889       asection *s;
2890       bfd_vma TOCstart;
2891
2892       /* The TOC consists of sections .got, .toc, .tocbss, .plt in this
2893          order.  The TOC starts where the first of these sections starts.  */
2894       s = bfd_get_section_by_name (abfd, ".got");
2895       if (s == NULL)
2896         s = bfd_get_section_by_name (abfd, ".toc");
2897       if (s == NULL)
2898         s = bfd_get_section_by_name (abfd, ".tocbss");
2899       if (s == NULL)
2900         s = bfd_get_section_by_name (abfd, ".plt");
2901       if (s == NULL)
2902         {
2903           /* This may happen for
2904              o  references to TOC base (SYM@toc / TOC[tc0]) without a
2905              .toc directive
2906              o  bad linker script
2907              o --gc-sections and empty TOC sections
2908
2909              FIXME: Warn user?  */
2910
2911           /* Look for a likely section.  We probably won't even be
2912              using TOCstart.  */
2913           for (s = abfd->sections; s != NULL; s = s->next)
2914             if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY))
2915                 == (SEC_ALLOC | SEC_SMALL_DATA))
2916               break;
2917           if (s == NULL)
2918             for (s = abfd->sections; s != NULL; s = s->next)
2919               if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA))
2920                   == (SEC_ALLOC | SEC_SMALL_DATA))
2921                 break;
2922           if (s == NULL)
2923             for (s = abfd->sections; s != NULL; s = s->next)
2924               if ((s->flags & (SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC)
2925                 break;
2926           if (s == NULL)
2927             for (s = abfd->sections; s != NULL; s = s->next)
2928               if ((s->flags & SEC_ALLOC) == SEC_ALLOC)
2929                 break;
2930         }
2931
2932       TOCstart = 0;
2933       if (s != NULL)
2934         TOCstart = s->output_section->vma + s->output_offset;
2935
2936       elf_gp (abfd) = TOCstart;
2937     }
2938
2939   /* Invoke the regular ELF backend linker to do all the work.  */
2940   return bfd_elf64_bfd_final_link (abfd, info);
2941 }
2942
2943 /* Set up any other section flags and such that may be necessary.  */
2944
2945 static boolean
2946 ppc64_elf_fake_sections (abfd, shdr, asect)
2947      bfd *abfd ATTRIBUTE_UNUSED;
2948      Elf64_Internal_Shdr *shdr;
2949      asection *asect;
2950 {
2951   if ((asect->flags & SEC_EXCLUDE) != 0)
2952     shdr->sh_flags |= SHF_EXCLUDE;
2953
2954   if ((asect->flags & SEC_SORT_ENTRIES) != 0)
2955     shdr->sh_type = SHT_ORDERED;
2956
2957   return true;
2958 }
2959
2960 /* The RELOCATE_SECTION function is called by the ELF backend linker
2961    to handle the relocations for a section.
2962
2963    The relocs are always passed as Rela structures; if the section
2964    actually uses Rel structures, the r_addend field will always be
2965    zero.
2966
2967    This function is responsible for adjust the section contents as
2968    necessary, and (if using Rela relocs and generating a
2969    relocateable output file) adjusting the reloc addend as
2970    necessary.
2971
2972    This function does not have to worry about setting the reloc
2973    address or the reloc symbol index.
2974
2975    LOCAL_SYMS is a pointer to the swapped in local symbols.
2976
2977    LOCAL_SECTIONS is an array giving the section in the input file
2978    corresponding to the st_shndx field of each local symbol.
2979
2980    The global hash table entry for the global symbols can be found
2981    via elf_sym_hashes (input_bfd).
2982
2983    When generating relocateable output, this function must handle
2984    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
2985    going to be the section symbol corresponding to the output
2986    section, which means that the addend must be adjusted
2987    accordingly.  */
2988
2989 static boolean
2990 ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
2991                             contents, relocs, local_syms, local_sections)
2992      bfd *output_bfd;
2993      struct bfd_link_info *info;
2994      bfd *input_bfd;
2995      asection *input_section;
2996      bfd_byte *contents;
2997      Elf_Internal_Rela *relocs;
2998      Elf_Internal_Sym *local_syms;
2999      asection **local_sections;
3000 {
3001   struct ppc_link_hash_table *htab;
3002   Elf_Internal_Shdr *symtab_hdr;
3003   struct elf_link_hash_entry **sym_hashes;
3004   Elf_Internal_Rela *rel;
3005   Elf_Internal_Rela *relend;
3006   bfd_vma *local_got_offsets;
3007   bfd_vma TOCstart;
3008   boolean ret = true;
3009
3010   /* Initialize howto table if needed.  */
3011   if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
3012     ppc_howto_init ();
3013
3014   htab = ppc_hash_table (info);
3015   local_got_offsets = elf_local_got_offsets (input_bfd);
3016   TOCstart = elf_gp (output_bfd);
3017   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3018   sym_hashes = elf_sym_hashes (input_bfd);
3019
3020   rel = relocs;
3021   relend = relocs + input_section->reloc_count;
3022   for (; rel < relend; rel++)
3023     {
3024       enum elf_ppc_reloc_type r_type;
3025       bfd_vma offset;
3026       bfd_vma addend;
3027       bfd_reloc_status_type r;
3028       Elf_Internal_Sym *sym;
3029       asection *sec;
3030       struct elf_link_hash_entry *h;
3031       const char *sym_name;
3032       unsigned long r_symndx;
3033       bfd_vma relocation;
3034       boolean unresolved_reloc;
3035       long insn;
3036
3037       r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info);
3038       r_symndx = ELF64_R_SYM (rel->r_info);
3039
3040       if (info->relocateable)
3041         {
3042           /* This is a relocatable link.  We don't have to change
3043              anything, unless the reloc is against a section symbol,
3044              in which case we have to adjust according to where the
3045              section symbol winds up in the output section.  */
3046           if (r_symndx < symtab_hdr->sh_info)
3047             {
3048               sym = local_syms + r_symndx;
3049               if ((unsigned) ELF_ST_TYPE (sym->st_info) == STT_SECTION)
3050                 {
3051                   sec = local_sections[r_symndx];
3052                   rel->r_addend += sec->output_offset + sym->st_value;
3053                 }
3054             }
3055           continue;
3056         }
3057
3058       /* This is a final link.  */
3059
3060       offset = rel->r_offset;
3061       addend = rel->r_addend;
3062       r = bfd_reloc_other;
3063       sym = (Elf_Internal_Sym *) 0;
3064       sec = (asection *) 0;
3065       h = (struct elf_link_hash_entry *) 0;
3066       sym_name = (const char *) 0;
3067       unresolved_reloc = false;
3068
3069       if (r_type == R_PPC64_TOC)
3070         {
3071           /* Relocation value is TOC base.  Symbol is ignored.  */
3072           relocation = TOCstart + TOC_BASE_OFF;
3073         }
3074       else if (r_symndx < symtab_hdr->sh_info)
3075         {
3076           /* It's a local symbol.  */
3077           sym = local_syms + r_symndx;
3078           sec = local_sections[r_symndx];
3079           sym_name = "<local symbol>";
3080
3081           relocation = (sec->output_section->vma
3082                         + sec->output_offset
3083                         + sym->st_value);
3084         }
3085       else
3086         {
3087           /* It's a global symbol.  */
3088           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3089           while (h->root.type == bfd_link_hash_indirect
3090                  || h->root.type == bfd_link_hash_warning)
3091             h = (struct elf_link_hash_entry *) h->root.u.i.link;
3092           sym_name = h->root.root.string;
3093           relocation = 0;
3094           if (h->root.type == bfd_link_hash_defined
3095               || h->root.type == bfd_link_hash_defweak)
3096             {
3097               sec = h->root.u.def.section;
3098               if (sec->output_section == NULL)
3099                 /* Set a flag that will be cleared later if we find a
3100                    relocation value for this symbol.  output_section
3101                    is typically NULL for symbols satisfied by a shared
3102                    library.  */
3103                 unresolved_reloc = true;
3104               else
3105                 relocation = (h->root.u.def.value
3106                               + sec->output_section->vma
3107                               + sec->output_offset);
3108             }
3109           else if (h->root.type == bfd_link_hash_undefweak)
3110             ;
3111           else if (info->shared
3112                    && (!info->symbolic || info->allow_shlib_undefined)
3113                    && !info->no_undefined
3114                    && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
3115             ;
3116           else
3117             {
3118               if (! ((*info->callbacks->undefined_symbol)
3119                      (info, h->root.root.string, input_bfd, input_section,
3120                       offset, (!info->shared
3121                                || info->no_undefined
3122                                || ELF_ST_VISIBILITY (h->other)))))
3123                 return false;
3124               relocation = 0;
3125             }
3126         }
3127
3128       /* First handle relocations that tweak non-addend part of insn.  */
3129       switch (r_type)
3130         {
3131         default:
3132           break;
3133
3134           /* Branch taken prediction relocations.  */
3135         case R_PPC64_ADDR14_BRTAKEN:
3136         case R_PPC64_REL14_BRTAKEN:
3137           insn = bfd_get_32 (output_bfd, contents + offset);
3138           if ((relocation - offset) & 0x8000)
3139             insn &= ~BRANCH_PREDICT_BIT;
3140           else
3141             insn |= BRANCH_PREDICT_BIT;
3142           bfd_put_32 (output_bfd, (bfd_vma) insn, contents + offset);
3143           break;
3144
3145           /* Branch not taken predicition relocations.  */
3146         case R_PPC64_ADDR14_BRNTAKEN:
3147         case R_PPC64_REL14_BRNTAKEN:
3148           insn = bfd_get_32 (output_bfd, contents + offset);
3149           if ((relocation - offset) & 0x8000)
3150             insn |= BRANCH_PREDICT_BIT;
3151           else
3152             insn &= ~BRANCH_PREDICT_BIT;
3153           bfd_put_32 (output_bfd, (bfd_vma) insn, contents + offset);
3154           break;
3155
3156         case R_PPC64_REL24:
3157         case R_PPC64_ADDR24:
3158           /* An ADDR24 or REL24 branching to a linkage function may be
3159              followed by a nop that we have to replace with a ld in
3160              order to restore the TOC base pointer.  Only calls to
3161              shared objects need to alter the TOC base.  These are
3162              recognized by their need for a PLT entry.  */
3163           if (h != NULL
3164               && (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0
3165               /* Make sure that there really is an instruction after
3166                  the branch that we can decode.  */
3167               && offset + 8 <= input_section->_cooked_size)
3168             {
3169               bfd_byte *pnext;
3170
3171               pnext = contents + offset + 4;
3172               insn = bfd_get_32 (input_bfd, pnext);
3173
3174               if (insn == 0x60000000     /* nop (ori  r0,r0,0) */
3175                   || insn == 0x4def7b82  /* cror 15,15,15 */
3176                   || insn == 0x4ffffb82) /* cror 31,31,31 */
3177                 {
3178                   bfd_put_32 (input_bfd,
3179                               (bfd_vma) 0xe8410028, /* ld r2,40(r1) */
3180                               pnext);
3181                 }
3182             }
3183           break;
3184         }
3185
3186       /* Set `addend'.  */
3187       switch (r_type)
3188         {
3189         default:
3190           (*_bfd_error_handler)
3191             (_("%s: unknown relocation type %d for symbol %s"),
3192              bfd_archive_filename (input_bfd), (int) r_type, sym_name);
3193
3194           bfd_set_error (bfd_error_bad_value);
3195           ret = false;
3196           continue;
3197
3198         case R_PPC64_NONE:
3199         case R_PPC_GNU_VTINHERIT:
3200         case R_PPC_GNU_VTENTRY:
3201           continue;
3202
3203           /* GOT16 relocations.  Like an ADDR16 using the symbol's
3204              address in the GOT as relocation value instead of the
3205              symbols value itself.  Also, create a GOT entry for the
3206              symbol and put the symbol value there.  */
3207         case R_PPC64_GOT16:
3208         case R_PPC64_GOT16_LO:
3209         case R_PPC64_GOT16_HI:
3210         case R_PPC64_GOT16_HA:
3211         case R_PPC64_GOT16_DS:
3212         case R_PPC64_GOT16_LO_DS:
3213           {
3214             /* Relocation is to the entry for this symbol in the global
3215                offset table.  */
3216             bfd_vma off;
3217
3218             if (htab->sgot == NULL)
3219               abort ();
3220
3221             if (h != NULL)
3222               {
3223                 boolean dyn;
3224
3225                 off = h->got.offset;
3226                 dyn = htab->elf.dynamic_sections_created;
3227                 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
3228                     || (info->shared
3229                         && (info->symbolic
3230                             || h->dynindx == -1
3231                             || (h->elf_link_hash_flags
3232                                 & ELF_LINK_FORCED_LOCAL))
3233                         && (h->elf_link_hash_flags
3234                             & ELF_LINK_HASH_DEF_REGULAR)))
3235                   {
3236                     /* This is actually a static link, or it is a
3237                        -Bsymbolic link and the symbol is defined
3238                        locally, or the symbol was forced to be local
3239                        because of a version file.  We must initialize
3240                        this entry in the global offset table.  Since the
3241                        offset must always be a multiple of 8, we use the
3242                        least significant bit to record whether we have
3243                        initialized it already.
3244
3245                        When doing a dynamic link, we create a .rel.got
3246                        relocation entry to initialize the value.  This
3247                        is done in the finish_dynamic_symbol routine.  */
3248                     if ((off & 1) != 0)
3249                       off &= ~1;
3250                     else
3251                       {
3252                         bfd_put_64 (output_bfd, relocation,
3253                                     htab->sgot->contents + off);
3254                         h->got.offset |= 1;
3255                       }
3256                   }
3257                 else
3258                   unresolved_reloc = false;
3259               }
3260             else
3261               {
3262                 if (local_got_offsets == NULL)
3263                   abort ();
3264
3265                 off = local_got_offsets[r_symndx];
3266
3267                 /* The offset must always be a multiple of 8.  We use
3268                    the least significant bit to record whether we have
3269                    already processed this entry.  */
3270                 if ((off & 1) != 0)
3271                   off &= ~1;
3272                 else
3273                   {
3274                     bfd_put_64 (output_bfd, relocation,
3275                                 htab->sgot->contents + off);
3276
3277                     if (info->shared)
3278                       {
3279                         Elf_Internal_Rela outrel;
3280                         Elf64_External_Rela *loc;
3281
3282                         /* We need to generate a R_PPC64_RELATIVE reloc
3283                            for the dynamic linker.  */
3284                         outrel.r_offset = (htab->sgot->output_section->vma
3285                                            + htab->sgot->output_offset
3286                                            + off);
3287                         outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
3288                         outrel.r_addend = relocation;
3289                         loc = (Elf64_External_Rela *) htab->srelgot->contents;
3290                         loc += htab->srelgot->reloc_count++;
3291                         bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3292                       }
3293
3294                     local_got_offsets[r_symndx] |= 1;
3295                   }
3296               }
3297
3298             if (off >= (bfd_vma) -2)
3299               abort ();
3300
3301             relocation = htab->sgot->output_offset + off;
3302
3303             /* TOC base (r2) is TOC start plus 0x8000.  */
3304             addend -= TOC_BASE_OFF;
3305           }
3306           break;
3307
3308         case R_PPC64_PLT16_HA:
3309         case R_PPC64_PLT16_HI:
3310         case R_PPC64_PLT16_LO:
3311         case R_PPC64_PLT32:
3312         case R_PPC64_PLT64:
3313           /* Relocation is to the entry for this symbol in the
3314              procedure linkage table.  */
3315
3316           /* Resolve a PLT reloc against a local symbol directly,
3317              without using the procedure linkage table.  */
3318           if (h == NULL)
3319             break;
3320
3321           if (h->plt.offset == (bfd_vma) -1
3322               || htab->splt == NULL)
3323             {
3324               /* We didn't make a PLT entry for this symbol.  This
3325                  happens when statically linking PIC code, or when
3326                  using -Bsymbolic.  */
3327               break;
3328             }
3329
3330           relocation = (htab->splt->output_section->vma
3331                         + htab->splt->output_offset
3332                         + h->plt.offset);
3333           unresolved_reloc = false;
3334           break;
3335
3336           /* TOC16 relocs.  We want the offset relative to the TOC base,
3337              which is the address of the start of the TOC plus 0x8000.
3338              The TOC consists of sections .got, .toc, .tocbss, and .plt,
3339              in this order.  */
3340
3341         case R_PPC64_TOC16:
3342         case R_PPC64_TOC16_LO:
3343         case R_PPC64_TOC16_HI:
3344         case R_PPC64_TOC16_DS:
3345         case R_PPC64_TOC16_LO_DS:
3346         case R_PPC64_TOC16_HA:
3347           /* Only .got, .toc and *UND* symbols are allowed.  */
3348           BFD_ASSERT (sec != (asection *) 0
3349                       && (bfd_is_und_section (sec)
3350                           || strcmp (bfd_get_section_name (abfd, sec),
3351                                      ".toc") == 0
3352                           || strcmp (bfd_get_section_name (abfd, sec),
3353                                      ".got") == 0));
3354
3355           addend -= TOCstart + TOC_BASE_OFF;
3356           break;
3357
3358           /* Relocate against the beginning of the section.  */
3359         case R_PPC64_SECTOFF:
3360         case R_PPC64_SECTOFF_LO:
3361         case R_PPC64_SECTOFF_HI:
3362         case R_PPC64_SECTOFF_DS:
3363         case R_PPC64_SECTOFF_LO_DS:
3364         case R_PPC64_SECTOFF_HA:
3365           if (sec != (asection *) 0)
3366             addend -= sec->output_section->vma;
3367           break;
3368
3369           /* Relocations that may need to be propagated if this is a
3370              dynamic object.  */
3371         case R_PPC64_REL14:
3372         case R_PPC64_REL14_BRNTAKEN:
3373         case R_PPC64_REL14_BRTAKEN:
3374         case R_PPC64_REL24:
3375         case R_PPC64_REL32:
3376         case R_PPC64_REL64:
3377         case R_PPC64_ADDR14:
3378         case R_PPC64_ADDR14_BRNTAKEN:
3379         case R_PPC64_ADDR14_BRTAKEN:
3380         case R_PPC64_ADDR16:
3381         case R_PPC64_ADDR16_DS:
3382         case R_PPC64_ADDR16_HA:
3383         case R_PPC64_ADDR16_HI:
3384         case R_PPC64_ADDR16_HIGHER:
3385         case R_PPC64_ADDR16_HIGHERA:
3386         case R_PPC64_ADDR16_HIGHEST:
3387         case R_PPC64_ADDR16_HIGHESTA:
3388         case R_PPC64_ADDR16_LO:
3389         case R_PPC64_ADDR16_LO_DS:
3390         case R_PPC64_ADDR24:
3391         case R_PPC64_ADDR30:
3392         case R_PPC64_ADDR32:
3393         case R_PPC64_ADDR64:
3394         case R_PPC64_UADDR16:
3395         case R_PPC64_UADDR32:
3396         case R_PPC64_UADDR64:
3397         case R_PPC64_TOC:
3398           if ((info->shared
3399                && (input_section->flags & SEC_ALLOC) != 0
3400                && (IS_ABSOLUTE_RELOC (r_type)
3401                    || (h != NULL
3402                        && h->dynindx != -1
3403                        && (! info->symbolic
3404                            || (h->elf_link_hash_flags
3405                                & ELF_LINK_HASH_DEF_REGULAR) == 0))))
3406               || (!info->shared
3407                   && (input_section->flags & SEC_ALLOC) != 0
3408                   && h != NULL
3409                   && h->dynindx != -1
3410                   && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
3411                   && (((h->elf_link_hash_flags
3412                         & ELF_LINK_HASH_DEF_DYNAMIC) != 0
3413                        && (h->elf_link_hash_flags
3414                            & ELF_LINK_HASH_DEF_REGULAR) == 0)
3415                       || h->root.type == bfd_link_hash_undefweak
3416                       || h->root.type == bfd_link_hash_undefined)))
3417             {
3418               Elf_Internal_Rela outrel;
3419               boolean skip, relocate;
3420               asection *sreloc;
3421               Elf64_External_Rela *loc;
3422
3423               /* When generating a dynamic object, these relocations
3424                  are copied into the output file to be resolved at run
3425                  time.  */
3426
3427               skip = false;
3428
3429               if (elf_section_data (input_section)->stab_info == NULL)
3430                 outrel.r_offset = offset;
3431               else
3432                 {
3433                   bfd_vma off;
3434
3435                   off = (_bfd_stab_section_offset
3436                          (output_bfd, htab->elf.stab_info, input_section,
3437                           &elf_section_data (input_section)->stab_info,
3438                           offset));
3439                   if (off == (bfd_vma) -1)
3440                     skip = true;
3441                   outrel.r_offset = off;
3442                 }
3443
3444               outrel.r_offset += (input_section->output_section->vma
3445                                   + input_section->output_offset);
3446               outrel.r_addend = addend;
3447
3448               if (skip)
3449                 {
3450                   relocate = false;
3451                   memset (&outrel, 0, sizeof outrel);
3452                 }
3453               else if (h != NULL
3454                        && h->dynindx != -1
3455                        && (!IS_ABSOLUTE_RELOC (r_type)
3456                            || !info->shared
3457                            || !info->symbolic
3458                            || (h->elf_link_hash_flags
3459                                & ELF_LINK_HASH_DEF_REGULAR) == 0))
3460                 {
3461                   relocate = false;
3462                   outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
3463                 }
3464               else
3465                 {
3466                   /* This symbol is local, or marked to become local.  */
3467                   outrel.r_addend += relocation;
3468                   relocate = true;
3469                   if (r_type == R_PPC64_ADDR64)
3470                     {
3471                       outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
3472                     }
3473                   else
3474                     {
3475                       long indx = 0;
3476
3477                       if (r_type == R_PPC64_TOC || bfd_is_abs_section (sec))
3478                         ;
3479                       else if (sec == NULL || sec->owner == NULL)
3480                         {
3481                           bfd_set_error (bfd_error_bad_value);
3482                           return false;
3483                         }
3484                       else
3485                         {
3486                           asection *osec;
3487
3488                           osec = sec->output_section;
3489                           indx = elf_section_data (osec)->dynindx;
3490
3491                           /* We are turning this relocation into one
3492                              against a section symbol, so subtract out
3493                              the output section's address but not the
3494                              offset of the input section in the output
3495                              section.  */
3496                           outrel.r_addend -= osec->vma;
3497                         }
3498
3499                       outrel.r_info = ELF64_R_INFO (indx, r_type);
3500                     }
3501                 }
3502
3503               sreloc = elf_section_data (input_section)->sreloc;
3504               if (sreloc == NULL)
3505                 abort ();
3506
3507               loc = (Elf64_External_Rela *) sreloc->contents;
3508               loc += sreloc->reloc_count++;
3509               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3510
3511               /* If this reloc is against an external symbol, it will
3512                  be computed at runtime, so there's no need to do
3513                  anything now.  */
3514               if (! relocate)
3515                 continue;
3516             }
3517           break;
3518
3519         case R_PPC64_COPY:
3520         case R_PPC64_GLOB_DAT:
3521         case R_PPC64_JMP_SLOT:
3522         case R_PPC64_RELATIVE:
3523           /* We shouldn't ever see these dynamic relocs in relocatable
3524              files.  */
3525           /* Fall thru */
3526
3527         case R_PPC64_PLTGOT16:
3528         case R_PPC64_PLTGOT16_DS:
3529         case R_PPC64_PLTGOT16_HA:
3530         case R_PPC64_PLTGOT16_HI:
3531         case R_PPC64_PLTGOT16_LO:
3532         case R_PPC64_PLTGOT16_LO_DS:
3533         case R_PPC64_PLTREL32:
3534         case R_PPC64_PLTREL64:
3535           /* These ones haven't been implemented yet.  */
3536
3537           (*_bfd_error_handler)
3538             (_("%s: Relocation %s is not supported for symbol %s."),
3539              bfd_archive_filename (input_bfd),
3540              ppc64_elf_howto_table[(int) r_type]->name, sym_name);
3541
3542           bfd_set_error (bfd_error_invalid_operation);
3543           ret = false;
3544           continue;
3545         }
3546
3547       /* Do any further special processing.  */
3548       switch (r_type)
3549         {
3550         default:
3551           break;
3552
3553         case R_PPC64_ADDR16_HA:
3554         case R_PPC64_ADDR16_HIGHERA:
3555         case R_PPC64_ADDR16_HIGHESTA:
3556         case R_PPC64_PLT16_HA:
3557         case R_PPC64_TOC16_HA:
3558         case R_PPC64_SECTOFF_HA:
3559           /* It's just possible that this symbol is a weak symbol
3560              that's not actually defined anywhere. In that case,
3561              'sec' would be NULL, and we should leave the symbol
3562              alone (it will be set to zero elsewhere in the link).  */
3563           if (sec != NULL)
3564             /* Add 0x10000 if sign bit in 0:15 is set.  */
3565             addend += ((relocation + addend) & 0x8000) << 1;
3566           break;
3567
3568         case R_PPC64_ADDR16_DS:
3569         case R_PPC64_ADDR16_LO_DS:
3570         case R_PPC64_GOT16_DS:
3571         case R_PPC64_GOT16_LO_DS:
3572         case R_PPC64_PLT16_LO_DS:
3573         case R_PPC64_SECTOFF_DS:
3574         case R_PPC64_SECTOFF_LO_DS:
3575         case R_PPC64_TOC16_DS:
3576         case R_PPC64_TOC16_LO_DS:
3577         case R_PPC64_PLTGOT16_DS:
3578         case R_PPC64_PLTGOT16_LO_DS:
3579           if (((relocation + addend) & 3) != 0)
3580             {
3581               (*_bfd_error_handler)
3582                 (_("%s: error: relocation %s not a multiple of 4"),
3583                  bfd_archive_filename (input_bfd),
3584                  ppc64_elf_howto_table[(int) r_type]->name);
3585               bfd_set_error (bfd_error_bad_value);
3586               ret = false;
3587               continue;
3588             }
3589           break;
3590         }
3591
3592       /* FIXME: Why do we allow debugging sections to escape this error?
3593          More importantly, why do we not emit dynamic relocs above in
3594          debugging sections (which are ! SEC_ALLOC)?  If we had
3595          emitted the dynamic reloc, we could remove the fudge here.  */
3596       if (unresolved_reloc
3597           && !(info->shared
3598                && (input_section->flags & SEC_DEBUGGING) != 0
3599                && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
3600         (*_bfd_error_handler)
3601           (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
3602            bfd_archive_filename (input_bfd),
3603            bfd_get_section_name (input_bfd, input_section),
3604            (long) rel->r_offset,
3605            h->root.root.string);
3606
3607       r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
3608                                     input_bfd,
3609                                     input_section,
3610                                     contents,
3611                                     offset,
3612                                     relocation,
3613                                     addend);
3614
3615       if (r == bfd_reloc_ok)
3616         ;
3617       else if (r == bfd_reloc_overflow)
3618         {
3619           const char *name;
3620
3621           if (h != NULL)
3622             {
3623               if (h->root.type == bfd_link_hash_undefweak
3624                   && ppc64_elf_howto_table[(int) r_type]->pc_relative)
3625                 {
3626                   /* Assume this is a call protected by other code that
3627                      detects the symbol is undefined.  If this is the case,
3628                      we can safely ignore the overflow.  If not, the
3629                      program is hosed anyway, and a little warning isn't
3630                      going to help.  */
3631
3632                   continue;
3633                 }
3634
3635               name = h->root.root.string;
3636             }
3637           else
3638             {
3639               name = bfd_elf_string_from_elf_section (input_bfd,
3640                                                       symtab_hdr->sh_link,
3641                                                       sym->st_name);
3642               if (name == NULL)
3643                 continue;
3644               if (*name == '\0')
3645                 name = bfd_section_name (input_bfd, sec);
3646             }
3647
3648           if (! ((*info->callbacks->reloc_overflow)
3649                  (info, name, ppc64_elf_howto_table[(int) r_type]->name,
3650                   (bfd_vma) 0, input_bfd, input_section, offset)))
3651             return false;
3652         }
3653       else
3654         ret = false;
3655     }
3656
3657   return ret;
3658 }
3659
3660 /* Finish up dynamic symbol handling.  We set the contents of various
3661    dynamic sections here.  */
3662
3663 static boolean
3664 ppc64_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
3665      bfd *output_bfd;
3666      struct bfd_link_info *info;
3667      struct elf_link_hash_entry *h;
3668      Elf_Internal_Sym *sym;
3669 {
3670   struct ppc_link_hash_table *htab;
3671   bfd *dynobj;
3672
3673   htab = ppc_hash_table (info);
3674   dynobj = htab->elf.dynobj;
3675
3676   if (h->plt.offset != (bfd_vma) -1)
3677     {
3678       struct elf_link_hash_entry *funcdesc_h;
3679       Elf_Internal_Rela rela;
3680       Elf64_External_Rela *loc;
3681
3682       /* This symbol has an entry in the procedure linkage table.  Set
3683          it up.  */
3684
3685       if (h->dynindx == -1
3686           || htab->splt == NULL
3687           || htab->srelplt == NULL
3688           || htab->sglink == NULL
3689           || h->root.root.string[0] != '.'
3690           || h->root.root.string[1] == '\0')
3691         abort ();
3692
3693       /* Find its corresponding function descriptor.
3694          ppc64_elf_adjust_dynamic_symbol has already set it up for us.  */ 
3695
3696       funcdesc_h = elf_link_hash_lookup (elf_hash_table (info),
3697                                          h->root.root.string + 1,
3698                                          false, false, false);
3699
3700       if (funcdesc_h == NULL || funcdesc_h->dynindx == -1)
3701         abort ();
3702
3703       /* Create a JMP_SLOT reloc to inform the dynamic linker to
3704          fill in the PLT entry.  */
3705
3706       rela.r_offset = (htab->splt->output_section->vma
3707                        + htab->splt->output_offset
3708                        + h->plt.offset);
3709       rela.r_info = ELF64_R_INFO (funcdesc_h->dynindx, R_PPC64_JMP_SLOT);
3710       rela.r_addend = 0;
3711
3712       loc = (Elf64_External_Rela *) htab->srelplt->contents;
3713       loc += (h->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE;
3714       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3715
3716       /* We need to create a linkage function. */
3717       if (h->root.u.def.section == htab->sglink)
3718         {
3719           bfd_byte *p;
3720           bfd_vma pltoff;
3721           const unsigned int *stub;
3722
3723           /* Where to write it.  */
3724           p = h->root.u.def.section->contents + h->root.u.def.value;
3725
3726           /* The function descriptor is in the PLT.  */
3727           pltoff = htab->splt->output_section->vma
3728             + htab->splt->output_section->output_offset
3729             + h->plt.offset
3730             - elf_gp (output_bfd) - TOC_BASE_OFF;
3731
3732           if (pltoff + 0x8000 > 0xffff)
3733             {
3734               (*_bfd_error_handler)
3735                 (_("linkage table overflow against `%s'"),
3736                  h->root.root.string);
3737             }
3738
3739           /* Write it out.  */
3740           stub = ppc64_elf_glink_code;
3741           bfd_put_32 (output_bfd, *stub | (pltoff & 0xfffc), p);
3742           while (p += 4, ++stub < (ppc64_elf_glink_code
3743                                    + (sizeof (ppc64_elf_glink_code)
3744                                       / sizeof (*ppc64_elf_glink_code))));
3745             {
3746               bfd_put_32 (output_bfd, (bfd_vma) *stub, p);
3747             }
3748         }
3749       else
3750         abort ();
3751     }
3752
3753   if (h->got.offset != (bfd_vma) -1)
3754     {
3755       Elf_Internal_Rela rela;
3756       Elf64_External_Rela *loc;
3757
3758       /* This symbol has an entry in the global offset table.  Set it
3759          up.  */
3760
3761       if (htab->sgot == NULL || htab->srelgot == NULL)
3762         abort ();
3763
3764       rela.r_offset = (htab->sgot->output_section->vma
3765                        + htab->sgot->output_offset
3766                        + (h->got.offset &~ (bfd_vma) 1));
3767
3768       /* If this is a static link, or it is a -Bsymbolic link and the
3769          symbol is defined locally or was forced to be local because
3770          of a version file, we just want to emit a RELATIVE reloc.
3771          The entry in the global offset table will already have been
3772          initialized in the relocate_section function.  */
3773       if (info->shared
3774           && (info->symbolic
3775               || h->dynindx == -1
3776               || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
3777           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
3778         {
3779           BFD_ASSERT((h->got.offset & 1) != 0);
3780           rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
3781           rela.r_addend = (h->root.u.def.value
3782                            + h->root.u.def.section->output_section->vma
3783                            + h->root.u.def.section->output_offset);
3784         }
3785       else
3786         {
3787           BFD_ASSERT ((h->got.offset & 1) == 0);
3788           bfd_put_64 (output_bfd, (bfd_vma) 0,
3789                       htab->sgot->contents + h->got.offset);
3790           rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_GLOB_DAT);
3791           rela.r_addend = 0;
3792         }
3793
3794       loc = (Elf64_External_Rela *) htab->srelgot->contents;
3795       loc += htab->srelgot->reloc_count++;
3796       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3797     }
3798
3799   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
3800     {
3801       Elf_Internal_Rela rela;
3802       Elf64_External_Rela *loc;
3803
3804       /* This symbol needs a copy reloc.  Set it up.  */
3805
3806       if (h->dynindx == -1
3807           || (h->root.type != bfd_link_hash_defined
3808               && h->root.type != bfd_link_hash_defweak)
3809           || htab->srelbss == NULL)
3810         abort ();
3811
3812       rela.r_offset = (h->root.u.def.value
3813                        + h->root.u.def.section->output_section->vma
3814                        + h->root.u.def.section->output_offset);
3815       rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
3816       rela.r_addend = 0;
3817       loc = (Elf64_External_Rela *) htab->srelbss->contents;
3818       loc += htab->srelbss->reloc_count++;
3819       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3820     }
3821
3822   /* Mark some specially defined symbols as absolute.  */
3823   if (strcmp (h->root.root.string, "_DYNAMIC") == 0)
3824     sym->st_shndx = SHN_ABS;
3825
3826   return true;
3827 }
3828
3829 /* Used to decide how to sort relocs in an optimal manner for the
3830    dynamic linker, before writing them out.  */
3831
3832 static enum elf_reloc_type_class
3833 ppc64_elf_reloc_type_class (rela)
3834      const Elf_Internal_Rela *rela;
3835 {
3836   switch ((int) ELF64_R_TYPE (rela->r_info))
3837     {
3838     case R_PPC64_RELATIVE:
3839       return reloc_class_relative;
3840     case R_PPC64_JMP_SLOT:
3841       return reloc_class_plt;
3842     case R_PPC64_COPY:
3843       return reloc_class_copy;
3844     default:
3845       return reloc_class_normal;
3846     }
3847 }
3848
3849 /* Finish up the dynamic sections.  */
3850
3851 static boolean
3852 ppc64_elf_finish_dynamic_sections (output_bfd, info)
3853      bfd *output_bfd;
3854      struct bfd_link_info *info;
3855 {
3856   struct ppc_link_hash_table *htab;
3857   bfd *dynobj;
3858   asection *sdyn;
3859
3860   htab = ppc_hash_table (info);
3861   dynobj = htab->elf.dynobj;
3862   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3863
3864   if (htab->elf.dynamic_sections_created)
3865     {
3866       Elf64_External_Dyn *dyncon, *dynconend;
3867
3868       if (sdyn == NULL || htab->sgot == NULL)
3869         abort ();
3870
3871       dyncon = (Elf64_External_Dyn *) sdyn->contents;
3872       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
3873       for (; dyncon < dynconend; dyncon++)
3874         {
3875           Elf_Internal_Dyn dyn;
3876
3877           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3878
3879           switch (dyn.d_tag)
3880             {
3881             default:
3882               continue;
3883
3884             case DT_PLTGOT:
3885               dyn.d_un.d_ptr = htab->splt->output_section->vma;
3886               break;
3887
3888             case DT_JMPREL:
3889               dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
3890               break;
3891
3892             case DT_PLTRELSZ:
3893               if (htab->srelplt->output_section->_cooked_size != 0)
3894                 dyn.d_un.d_val = htab->srelplt->output_section->_cooked_size;
3895               else
3896                 dyn.d_un.d_val = htab->srelplt->output_section->_raw_size;
3897               break;
3898             }
3899
3900           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3901         }
3902     }
3903
3904   return true;
3905 }
3906
3907 #define TARGET_LITTLE_SYM       bfd_elf64_powerpcle_vec
3908 #define TARGET_LITTLE_NAME      "elf64-powerpcle"
3909 #define TARGET_BIG_SYM          bfd_elf64_powerpc_vec
3910 #define TARGET_BIG_NAME         "elf64-powerpc"
3911 #define ELF_ARCH                bfd_arch_powerpc
3912 #define ELF_MACHINE_CODE        EM_PPC64
3913 #define ELF_MAXPAGESIZE         0x10000
3914 #define elf_info_to_howto       ppc64_elf_info_to_howto
3915
3916 #ifdef  EM_CYGNUS_POWERPC
3917 #define ELF_MACHINE_ALT1        EM_CYGNUS_POWERPC
3918 #endif
3919
3920 #ifdef EM_PPC_OLD
3921 #define ELF_MACHINE_ALT2        EM_PPC_OLD
3922 #endif
3923
3924 #define elf_backend_want_got_sym 0
3925 #define elf_backend_want_plt_sym 0
3926 #define elf_backend_plt_alignment 3
3927 #define elf_backend_plt_not_loaded 1
3928 #define elf_backend_got_symbol_offset 0
3929 #define elf_backend_got_header_size 0
3930 #define elf_backend_can_gc_sections 1
3931 #define elf_backend_can_refcount 1
3932
3933 #define elf_backend_plt_header_size PLT_INITIAL_ENTRY_SIZE
3934
3935 #define bfd_elf64_bfd_reloc_type_lookup       ppc64_elf_reloc_type_lookup
3936 #define bfd_elf64_bfd_set_private_flags       ppc64_elf_set_private_flags
3937 #define bfd_elf64_bfd_copy_private_bfd_data   ppc64_elf_copy_private_bfd_data
3938 #define bfd_elf64_bfd_merge_private_bfd_data  ppc64_elf_merge_private_bfd_data
3939 #define bfd_elf64_bfd_link_hash_table_create  ppc64_elf_link_hash_table_create
3940 #define bfd_elf64_bfd_final_link              ppc64_elf_final_link
3941
3942 #define elf_backend_section_from_shdr         ppc64_elf_section_from_shdr
3943 #define elf_backend_create_dynamic_sections   ppc64_elf_create_dynamic_sections
3944 #define elf_backend_copy_indirect_symbol      ppc64_elf_copy_indirect_symbol
3945 #define elf_backend_check_relocs              ppc64_elf_check_relocs
3946 #define elf_backend_gc_mark_hook              ppc64_elf_gc_mark_hook
3947 #define elf_backend_gc_sweep_hook             ppc64_elf_gc_sweep_hook
3948 #define elf_backend_adjust_dynamic_symbol     ppc64_elf_adjust_dynamic_symbol
3949 #define elf_backend_size_dynamic_sections     ppc64_elf_size_dynamic_sections
3950 #define elf_backend_fake_sections             ppc64_elf_fake_sections
3951 #define elf_backend_relocate_section          ppc64_elf_relocate_section
3952 #define elf_backend_finish_dynamic_symbol     ppc64_elf_finish_dynamic_symbol
3953 #define elf_backend_reloc_type_class          ppc64_elf_reloc_type_class
3954 #define elf_backend_finish_dynamic_sections   ppc64_elf_finish_dynamic_sections
3955
3956 #include "elf64-target.h"