* elf64-ppc.c (is_ppc64_target): New function, extracted from..
[external/binutils.git] / bfd / elf64-ppc.c
1 /* PowerPC64-specific support for 64-bit ELF.
2    Copyright 1999, 2000, 2001, 2002, 2003, 2004
3    Free Software Foundation, Inc.
4    Written by Linus Nordberg, Swox AB <info@swox.com>,
5    based on elf32-ppc.c by Ian Lance Taylor.
6    Largely rewritten by Alan Modra <amodra@bigpond.net.au>
7
8    This file is part of BFD, the Binary File Descriptor library.
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License along
21    with this program; if not, write to the Free Software Foundation, Inc.,
22    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
23
24 /* The 64-bit PowerPC ELF ABI may be found at
25    http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
26    http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html  */
27
28 #include "bfd.h"
29 #include "sysdep.h"
30 #include "bfdlink.h"
31 #include "libbfd.h"
32 #include "elf-bfd.h"
33 #include "elf/ppc64.h"
34 #include "elf64-ppc.h"
35
36 static bfd_reloc_status_type ppc64_elf_ha_reloc
37   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
38 static bfd_reloc_status_type ppc64_elf_branch_reloc
39   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
40 static bfd_reloc_status_type ppc64_elf_brtaken_reloc
41   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42 static bfd_reloc_status_type ppc64_elf_sectoff_reloc
43   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
44 static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
45   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
46 static bfd_reloc_status_type ppc64_elf_toc_reloc
47   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
48 static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
49   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
50 static bfd_reloc_status_type ppc64_elf_toc64_reloc
51   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
52 static bfd_reloc_status_type ppc64_elf_unhandled_reloc
53   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
54 static bfd_vma opd_entry_value
55   (asection *, bfd_vma, asection **, bfd_vma *);
56
57 #define TARGET_LITTLE_SYM       bfd_elf64_powerpcle_vec
58 #define TARGET_LITTLE_NAME      "elf64-powerpcle"
59 #define TARGET_BIG_SYM          bfd_elf64_powerpc_vec
60 #define TARGET_BIG_NAME         "elf64-powerpc"
61 #define ELF_ARCH                bfd_arch_powerpc
62 #define ELF_MACHINE_CODE        EM_PPC64
63 #define ELF_MAXPAGESIZE         0x10000
64 #define elf_info_to_howto       ppc64_elf_info_to_howto
65
66 #define elf_backend_want_got_sym 0
67 #define elf_backend_want_plt_sym 0
68 #define elf_backend_plt_alignment 3
69 #define elf_backend_plt_not_loaded 1
70 #define elf_backend_got_symbol_offset 0
71 #define elf_backend_got_header_size 8
72 #define elf_backend_can_gc_sections 1
73 #define elf_backend_can_refcount 1
74 #define elf_backend_rela_normal 1
75
76 #define bfd_elf64_mkobject                    ppc64_elf_mkobject
77 #define bfd_elf64_bfd_reloc_type_lookup       ppc64_elf_reloc_type_lookup
78 #define bfd_elf64_bfd_merge_private_bfd_data  ppc64_elf_merge_private_bfd_data
79 #define bfd_elf64_new_section_hook            ppc64_elf_new_section_hook
80 #define bfd_elf64_bfd_link_hash_table_create  ppc64_elf_link_hash_table_create
81 #define bfd_elf64_bfd_link_hash_table_free    ppc64_elf_link_hash_table_free
82 #define bfd_elf64_get_synthetic_symtab        ppc64_elf_get_synthetic_symtab
83
84 #define elf_backend_object_p                  ppc64_elf_object_p
85 #define elf_backend_grok_prstatus             ppc64_elf_grok_prstatus
86 #define elf_backend_grok_psinfo               ppc64_elf_grok_psinfo
87 #define elf_backend_create_dynamic_sections   ppc64_elf_create_dynamic_sections
88 #define elf_backend_copy_indirect_symbol      ppc64_elf_copy_indirect_symbol
89 #define elf_backend_add_symbol_hook           ppc64_elf_add_symbol_hook
90 #define elf_backend_check_directives          ppc64_elf_check_directives
91 #define elf_backend_archive_symbol_lookup     ppc64_elf_archive_symbol_lookup
92 #define elf_backend_check_relocs              ppc64_elf_check_relocs
93 #define elf_backend_gc_mark_hook              ppc64_elf_gc_mark_hook
94 #define elf_backend_gc_sweep_hook             ppc64_elf_gc_sweep_hook
95 #define elf_backend_adjust_dynamic_symbol     ppc64_elf_adjust_dynamic_symbol
96 #define elf_backend_hide_symbol               ppc64_elf_hide_symbol
97 #define elf_backend_always_size_sections      ppc64_elf_func_desc_adjust
98 #define elf_backend_size_dynamic_sections     ppc64_elf_size_dynamic_sections
99 #define elf_backend_relocate_section          ppc64_elf_relocate_section
100 #define elf_backend_finish_dynamic_symbol     ppc64_elf_finish_dynamic_symbol
101 #define elf_backend_reloc_type_class          ppc64_elf_reloc_type_class
102 #define elf_backend_finish_dynamic_sections   ppc64_elf_finish_dynamic_sections
103 #define elf_backend_link_output_symbol_hook   ppc64_elf_output_symbol_hook
104 #define elf_backend_special_sections          ppc64_elf_special_sections
105
106 /* The name of the dynamic interpreter.  This is put in the .interp
107    section.  */
108 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
109
110 /* The size in bytes of an entry in the procedure linkage table.  */
111 #define PLT_ENTRY_SIZE 24
112
113 /* The initial size of the plt reserved for the dynamic linker.  */
114 #define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
115
116 /* TOC base pointers offset from start of TOC.  */
117 #define TOC_BASE_OFF    0x8000
118
119 /* Offset of tp and dtp pointers from start of TLS block.  */
120 #define TP_OFFSET       0x7000
121 #define DTP_OFFSET      0x8000
122
123 /* .plt call stub instructions.  The normal stub is like this, but
124    sometimes the .plt entry crosses a 64k boundary and we need to
125    insert an addis to adjust r12.  */
126 #define PLT_CALL_STUB_SIZE (7*4)
127 #define ADDIS_R12_R2    0x3d820000      /* addis %r12,%r2,xxx@ha     */
128 #define STD_R2_40R1     0xf8410028      /* std   %r2,40(%r1)         */
129 #define LD_R11_0R12     0xe96c0000      /* ld    %r11,xxx+0@l(%r12)  */
130 #define LD_R2_0R12      0xe84c0000      /* ld    %r2,xxx+8@l(%r12)   */
131 #define MTCTR_R11       0x7d6903a6      /* mtctr %r11                */
132                                         /* ld    %r11,xxx+16@l(%r12) */
133 #define BCTR            0x4e800420      /* bctr                      */
134
135
136 #define ADDIS_R2_R2     0x3c420000      /* addis %r2,%r2,off@ha  */
137 #define ADDI_R2_R2      0x38420000      /* addi  %r2,%r2,off@l   */
138
139 #define LD_R2_40R1      0xe8410028      /* ld    %r2,40(%r1)     */
140
141 /* glink call stub instructions.  We enter with the index in R0, and the
142    address of glink entry in CTR.  From that, we can calculate PLT0.  */
143 #define GLINK_CALL_STUB_SIZE (16*4)
144 #define MFCTR_R12       0x7d8902a6      /* mfctr  %r12                  */
145 #define SLDI_R11_R0_3   0x780b1f24      /* sldi   %r11,%r0,3            */
146 #define ADDIC_R2_R0_32K 0x34408000      /* addic. %r2,%r0,-32768        */
147 #define SUB_R12_R12_R11 0x7d8b6050      /* sub    %r12,%r12,%r11        */
148 #define SRADI_R2_R2_63  0x7c42fe76      /* sradi  %r2,%r2,63            */
149 #define SLDI_R11_R0_2   0x780b1764      /* sldi   %r11,%r0,2            */
150 #define AND_R2_R2_R11   0x7c425838      /* and    %r2,%r2,%r11          */
151                                         /* sub    %r12,%r12,%r11        */
152 #define ADD_R12_R12_R2  0x7d8c1214      /* add    %r12,%r12,%r2         */
153 #define ADDIS_R12_R12   0x3d8c0000      /* addis  %r12,%r12,xxx@ha      */
154                                         /* ld     %r11,xxx@l(%r12)      */
155 #define ADDI_R12_R12    0x398c0000      /* addi   %r12,%r12,xxx@l       */
156                                         /* ld     %r2,8(%r12)           */
157                                         /* mtctr  %r11                  */
158                                         /* ld     %r11,16(%r12)         */
159                                         /* bctr                         */
160
161 /* Pad with this.  */
162 #define NOP             0x60000000
163
164 /* Some other nops.  */
165 #define CROR_151515     0x4def7b82
166 #define CROR_313131     0x4ffffb82
167
168 /* .glink entries for the first 32k functions are two instructions.  */
169 #define LI_R0_0         0x38000000      /* li    %r0,0          */
170 #define B_DOT           0x48000000      /* b     .              */
171
172 /* After that, we need two instructions to load the index, followed by
173    a branch.  */
174 #define LIS_R0_0        0x3c000000      /* lis   %r0,0          */
175 #define ORI_R0_R0_0     0x60000000      /* ori   %r0,%r0,0      */
176
177 /* Instructions used by the save and restore reg functions.  */
178 #define STD_R0_0R1      0xf8010000      /* std   %r0,0(%r1)     */
179 #define STD_R0_0R12     0xf80c0000      /* std   %r0,0(%r12)    */
180 #define LD_R0_0R1       0xe8010000      /* ld    %r0,0(%r1)     */
181 #define LD_R0_0R12      0xe80c0000      /* ld    %r0,0(%r12)    */
182 #define STFD_FR0_0R1    0xd8010000      /* stfd  %fr0,0(%r1)    */
183 #define LFD_FR0_0R1     0xc8010000      /* lfd   %fr0,0(%r1)    */
184 #define LI_R12_0        0x39800000      /* li    %r12,0         */
185 #define STVX_VR0_R12_R0 0x7c0c01ce      /* stvx  %v0,%r12,%r0   */
186 #define LVX_VR0_R12_R0  0x7c0c00ce      /* lvx   %v0,%r12,%r0   */
187 #define MTLR_R0         0x7c0803a6      /* mtlr  %r0            */
188 #define BLR             0x4e800020      /* blr                  */
189
190 /* Since .opd is an array of descriptors and each entry will end up
191    with identical R_PPC64_RELATIVE relocs, there is really no need to
192    propagate .opd relocs;  The dynamic linker should be taught to
193    relocate .opd without reloc entries.  */
194 #ifndef NO_OPD_RELOCS
195 #define NO_OPD_RELOCS 0
196 #endif
197 \f
198 #define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
199
200 /* Relocation HOWTO's.  */
201 static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
202
203 static reloc_howto_type ppc64_elf_howto_raw[] = {
204   /* This reloc does nothing.  */
205   HOWTO (R_PPC64_NONE,          /* type */
206          0,                     /* rightshift */
207          2,                     /* size (0 = byte, 1 = short, 2 = long) */
208          32,                    /* bitsize */
209          FALSE,                 /* pc_relative */
210          0,                     /* bitpos */
211          complain_overflow_dont, /* complain_on_overflow */
212          bfd_elf_generic_reloc, /* special_function */
213          "R_PPC64_NONE",        /* name */
214          FALSE,                 /* partial_inplace */
215          0,                     /* src_mask */
216          0,                     /* dst_mask */
217          FALSE),                /* pcrel_offset */
218
219   /* A standard 32 bit relocation.  */
220   HOWTO (R_PPC64_ADDR32,        /* type */
221          0,                     /* rightshift */
222          2,                     /* size (0 = byte, 1 = short, 2 = long) */
223          32,                    /* bitsize */
224          FALSE,                 /* pc_relative */
225          0,                     /* bitpos */
226          complain_overflow_bitfield, /* complain_on_overflow */
227          bfd_elf_generic_reloc, /* special_function */
228          "R_PPC64_ADDR32",      /* name */
229          FALSE,                 /* partial_inplace */
230          0,                     /* src_mask */
231          0xffffffff,            /* dst_mask */
232          FALSE),                /* pcrel_offset */
233
234   /* An absolute 26 bit branch; the lower two bits must be zero.
235      FIXME: we don't check that, we just clear them.  */
236   HOWTO (R_PPC64_ADDR24,        /* type */
237          0,                     /* rightshift */
238          2,                     /* size (0 = byte, 1 = short, 2 = long) */
239          26,                    /* bitsize */
240          FALSE,                 /* pc_relative */
241          0,                     /* bitpos */
242          complain_overflow_bitfield, /* complain_on_overflow */
243          bfd_elf_generic_reloc, /* special_function */
244          "R_PPC64_ADDR24",      /* name */
245          FALSE,                 /* partial_inplace */
246          0,                     /* src_mask */
247          0x03fffffc,            /* dst_mask */
248          FALSE),                /* pcrel_offset */
249
250   /* A standard 16 bit relocation.  */
251   HOWTO (R_PPC64_ADDR16,        /* type */
252          0,                     /* rightshift */
253          1,                     /* size (0 = byte, 1 = short, 2 = long) */
254          16,                    /* bitsize */
255          FALSE,                 /* pc_relative */
256          0,                     /* bitpos */
257          complain_overflow_bitfield, /* complain_on_overflow */
258          bfd_elf_generic_reloc, /* special_function */
259          "R_PPC64_ADDR16",      /* name */
260          FALSE,                 /* partial_inplace */
261          0,                     /* src_mask */
262          0xffff,                /* dst_mask */
263          FALSE),                /* pcrel_offset */
264
265   /* A 16 bit relocation without overflow.  */
266   HOWTO (R_PPC64_ADDR16_LO,     /* type */
267          0,                     /* rightshift */
268          1,                     /* size (0 = byte, 1 = short, 2 = long) */
269          16,                    /* bitsize */
270          FALSE,                 /* pc_relative */
271          0,                     /* bitpos */
272          complain_overflow_dont,/* complain_on_overflow */
273          bfd_elf_generic_reloc, /* special_function */
274          "R_PPC64_ADDR16_LO",   /* name */
275          FALSE,                 /* partial_inplace */
276          0,                     /* src_mask */
277          0xffff,                /* dst_mask */
278          FALSE),                /* pcrel_offset */
279
280   /* Bits 16-31 of an address.  */
281   HOWTO (R_PPC64_ADDR16_HI,     /* type */
282          16,                    /* rightshift */
283          1,                     /* size (0 = byte, 1 = short, 2 = long) */
284          16,                    /* bitsize */
285          FALSE,                 /* pc_relative */
286          0,                     /* bitpos */
287          complain_overflow_dont, /* complain_on_overflow */
288          bfd_elf_generic_reloc, /* special_function */
289          "R_PPC64_ADDR16_HI",   /* name */
290          FALSE,                 /* partial_inplace */
291          0,                     /* src_mask */
292          0xffff,                /* dst_mask */
293          FALSE),                /* pcrel_offset */
294
295   /* Bits 16-31 of an address, plus 1 if the contents of the low 16
296      bits, treated as a signed number, is negative.  */
297   HOWTO (R_PPC64_ADDR16_HA,     /* type */
298          16,                    /* rightshift */
299          1,                     /* size (0 = byte, 1 = short, 2 = long) */
300          16,                    /* bitsize */
301          FALSE,                 /* pc_relative */
302          0,                     /* bitpos */
303          complain_overflow_dont, /* complain_on_overflow */
304          ppc64_elf_ha_reloc,    /* special_function */
305          "R_PPC64_ADDR16_HA",   /* name */
306          FALSE,                 /* partial_inplace */
307          0,                     /* src_mask */
308          0xffff,                /* dst_mask */
309          FALSE),                /* pcrel_offset */
310
311   /* An absolute 16 bit branch; the lower two bits must be zero.
312      FIXME: we don't check that, we just clear them.  */
313   HOWTO (R_PPC64_ADDR14,        /* type */
314          0,                     /* rightshift */
315          2,                     /* size (0 = byte, 1 = short, 2 = long) */
316          16,                    /* bitsize */
317          FALSE,                 /* pc_relative */
318          0,                     /* bitpos */
319          complain_overflow_bitfield, /* complain_on_overflow */
320          ppc64_elf_branch_reloc, /* special_function */
321          "R_PPC64_ADDR14",      /* name */
322          FALSE,                 /* partial_inplace */
323          0,                     /* src_mask */
324          0x0000fffc,            /* dst_mask */
325          FALSE),                /* pcrel_offset */
326
327   /* An absolute 16 bit branch, for which bit 10 should be set to
328      indicate that the branch is expected to be taken.  The lower two
329      bits must be zero.  */
330   HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
331          0,                     /* rightshift */
332          2,                     /* size (0 = byte, 1 = short, 2 = long) */
333          16,                    /* bitsize */
334          FALSE,                 /* pc_relative */
335          0,                     /* bitpos */
336          complain_overflow_bitfield, /* complain_on_overflow */
337          ppc64_elf_brtaken_reloc, /* special_function */
338          "R_PPC64_ADDR14_BRTAKEN",/* name */
339          FALSE,                 /* partial_inplace */
340          0,                     /* src_mask */
341          0x0000fffc,            /* dst_mask */
342          FALSE),                /* pcrel_offset */
343
344   /* An absolute 16 bit branch, for which bit 10 should be set to
345      indicate that the branch is not expected to be taken.  The lower
346      two bits must be zero.  */
347   HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
348          0,                     /* rightshift */
349          2,                     /* size (0 = byte, 1 = short, 2 = long) */
350          16,                    /* bitsize */
351          FALSE,                 /* pc_relative */
352          0,                     /* bitpos */
353          complain_overflow_bitfield, /* complain_on_overflow */
354          ppc64_elf_brtaken_reloc, /* special_function */
355          "R_PPC64_ADDR14_BRNTAKEN",/* name */
356          FALSE,                 /* partial_inplace */
357          0,                     /* src_mask */
358          0x0000fffc,            /* dst_mask */
359          FALSE),                /* pcrel_offset */
360
361   /* A relative 26 bit branch; the lower two bits must be zero.  */
362   HOWTO (R_PPC64_REL24,         /* type */
363          0,                     /* rightshift */
364          2,                     /* size (0 = byte, 1 = short, 2 = long) */
365          26,                    /* bitsize */
366          TRUE,                  /* pc_relative */
367          0,                     /* bitpos */
368          complain_overflow_signed, /* complain_on_overflow */
369          ppc64_elf_branch_reloc, /* special_function */
370          "R_PPC64_REL24",       /* name */
371          FALSE,                 /* partial_inplace */
372          0,                     /* src_mask */
373          0x03fffffc,            /* dst_mask */
374          TRUE),                 /* pcrel_offset */
375
376   /* A relative 16 bit branch; the lower two bits must be zero.  */
377   HOWTO (R_PPC64_REL14,         /* type */
378          0,                     /* rightshift */
379          2,                     /* size (0 = byte, 1 = short, 2 = long) */
380          16,                    /* bitsize */
381          TRUE,                  /* pc_relative */
382          0,                     /* bitpos */
383          complain_overflow_signed, /* complain_on_overflow */
384          ppc64_elf_branch_reloc, /* special_function */
385          "R_PPC64_REL14",       /* name */
386          FALSE,                 /* partial_inplace */
387          0,                     /* src_mask */
388          0x0000fffc,            /* dst_mask */
389          TRUE),                 /* pcrel_offset */
390
391   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
392      the branch is expected to be taken.  The lower two bits must be
393      zero.  */
394   HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
395          0,                     /* rightshift */
396          2,                     /* size (0 = byte, 1 = short, 2 = long) */
397          16,                    /* bitsize */
398          TRUE,                  /* pc_relative */
399          0,                     /* bitpos */
400          complain_overflow_signed, /* complain_on_overflow */
401          ppc64_elf_brtaken_reloc, /* special_function */
402          "R_PPC64_REL14_BRTAKEN", /* name */
403          FALSE,                 /* partial_inplace */
404          0,                     /* src_mask */
405          0x0000fffc,            /* dst_mask */
406          TRUE),                 /* pcrel_offset */
407
408   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
409      the branch is not expected to be taken.  The lower two bits must
410      be zero.  */
411   HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
412          0,                     /* rightshift */
413          2,                     /* size (0 = byte, 1 = short, 2 = long) */
414          16,                    /* bitsize */
415          TRUE,                  /* pc_relative */
416          0,                     /* bitpos */
417          complain_overflow_signed, /* complain_on_overflow */
418          ppc64_elf_brtaken_reloc, /* special_function */
419          "R_PPC64_REL14_BRNTAKEN",/* name */
420          FALSE,                 /* partial_inplace */
421          0,                     /* src_mask */
422          0x0000fffc,            /* dst_mask */
423          TRUE),                 /* pcrel_offset */
424
425   /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
426      symbol.  */
427   HOWTO (R_PPC64_GOT16,         /* type */
428          0,                     /* rightshift */
429          1,                     /* size (0 = byte, 1 = short, 2 = long) */
430          16,                    /* bitsize */
431          FALSE,                 /* pc_relative */
432          0,                     /* bitpos */
433          complain_overflow_signed, /* complain_on_overflow */
434          ppc64_elf_unhandled_reloc, /* special_function */
435          "R_PPC64_GOT16",       /* name */
436          FALSE,                 /* partial_inplace */
437          0,                     /* src_mask */
438          0xffff,                /* dst_mask */
439          FALSE),                /* pcrel_offset */
440
441   /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
442      the symbol.  */
443   HOWTO (R_PPC64_GOT16_LO,      /* type */
444          0,                     /* rightshift */
445          1,                     /* size (0 = byte, 1 = short, 2 = long) */
446          16,                    /* bitsize */
447          FALSE,                 /* pc_relative */
448          0,                     /* bitpos */
449          complain_overflow_dont, /* complain_on_overflow */
450          ppc64_elf_unhandled_reloc, /* special_function */
451          "R_PPC64_GOT16_LO",    /* name */
452          FALSE,                 /* partial_inplace */
453          0,                     /* src_mask */
454          0xffff,                /* dst_mask */
455          FALSE),                /* pcrel_offset */
456
457   /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
458      the symbol.  */
459   HOWTO (R_PPC64_GOT16_HI,      /* type */
460          16,                    /* rightshift */
461          1,                     /* size (0 = byte, 1 = short, 2 = long) */
462          16,                    /* bitsize */
463          FALSE,                 /* pc_relative */
464          0,                     /* bitpos */
465          complain_overflow_dont,/* complain_on_overflow */
466          ppc64_elf_unhandled_reloc, /* special_function */
467          "R_PPC64_GOT16_HI",    /* name */
468          FALSE,                 /* partial_inplace */
469          0,                     /* src_mask */
470          0xffff,                /* dst_mask */
471          FALSE),                /* pcrel_offset */
472
473   /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
474      the symbol.  */
475   HOWTO (R_PPC64_GOT16_HA,      /* type */
476          16,                    /* rightshift */
477          1,                     /* size (0 = byte, 1 = short, 2 = long) */
478          16,                    /* bitsize */
479          FALSE,                 /* pc_relative */
480          0,                     /* bitpos */
481          complain_overflow_dont,/* complain_on_overflow */
482          ppc64_elf_unhandled_reloc, /* special_function */
483          "R_PPC64_GOT16_HA",    /* name */
484          FALSE,                 /* partial_inplace */
485          0,                     /* src_mask */
486          0xffff,                /* dst_mask */
487          FALSE),                /* pcrel_offset */
488
489   /* This is used only by the dynamic linker.  The symbol should exist
490      both in the object being run and in some shared library.  The
491      dynamic linker copies the data addressed by the symbol from the
492      shared library into the object, because the object being
493      run has to have the data at some particular address.  */
494   HOWTO (R_PPC64_COPY,          /* type */
495          0,                     /* rightshift */
496          0,                     /* this one is variable size */
497          0,                     /* bitsize */
498          FALSE,                 /* pc_relative */
499          0,                     /* bitpos */
500          complain_overflow_dont, /* complain_on_overflow */
501          ppc64_elf_unhandled_reloc, /* special_function */
502          "R_PPC64_COPY",        /* name */
503          FALSE,                 /* partial_inplace */
504          0,                     /* src_mask */
505          0,                     /* dst_mask */
506          FALSE),                /* pcrel_offset */
507
508   /* Like R_PPC64_ADDR64, but used when setting global offset table
509      entries.  */
510   HOWTO (R_PPC64_GLOB_DAT,      /* type */
511          0,                     /* rightshift */
512          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
513          64,                    /* bitsize */
514          FALSE,                 /* pc_relative */
515          0,                     /* bitpos */
516          complain_overflow_dont, /* complain_on_overflow */
517          ppc64_elf_unhandled_reloc,  /* special_function */
518          "R_PPC64_GLOB_DAT",    /* name */
519          FALSE,                 /* partial_inplace */
520          0,                     /* src_mask */
521          ONES (64),             /* dst_mask */
522          FALSE),                /* pcrel_offset */
523
524   /* Created by the link editor.  Marks a procedure linkage table
525      entry for a symbol.  */
526   HOWTO (R_PPC64_JMP_SLOT,      /* type */
527          0,                     /* rightshift */
528          0,                     /* size (0 = byte, 1 = short, 2 = long) */
529          0,                     /* bitsize */
530          FALSE,                 /* pc_relative */
531          0,                     /* bitpos */
532          complain_overflow_dont, /* complain_on_overflow */
533          ppc64_elf_unhandled_reloc, /* special_function */
534          "R_PPC64_JMP_SLOT",    /* name */
535          FALSE,                 /* partial_inplace */
536          0,                     /* src_mask */
537          0,                     /* dst_mask */
538          FALSE),                /* pcrel_offset */
539
540   /* Used only by the dynamic linker.  When the object is run, this
541      doubleword64 is set to the load address of the object, plus the
542      addend.  */
543   HOWTO (R_PPC64_RELATIVE,      /* type */
544          0,                     /* rightshift */
545          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
546          64,                    /* bitsize */
547          FALSE,                 /* pc_relative */
548          0,                     /* bitpos */
549          complain_overflow_dont, /* complain_on_overflow */
550          bfd_elf_generic_reloc, /* special_function */
551          "R_PPC64_RELATIVE",    /* name */
552          FALSE,                 /* partial_inplace */
553          0,                     /* src_mask */
554          ONES (64),             /* dst_mask */
555          FALSE),                /* pcrel_offset */
556
557   /* Like R_PPC64_ADDR32, but may be unaligned.  */
558   HOWTO (R_PPC64_UADDR32,       /* type */
559          0,                     /* rightshift */
560          2,                     /* size (0 = byte, 1 = short, 2 = long) */
561          32,                    /* bitsize */
562          FALSE,                 /* pc_relative */
563          0,                     /* bitpos */
564          complain_overflow_bitfield, /* complain_on_overflow */
565          bfd_elf_generic_reloc, /* special_function */
566          "R_PPC64_UADDR32",     /* name */
567          FALSE,                 /* partial_inplace */
568          0,                     /* src_mask */
569          0xffffffff,            /* dst_mask */
570          FALSE),                /* pcrel_offset */
571
572   /* Like R_PPC64_ADDR16, but may be unaligned.  */
573   HOWTO (R_PPC64_UADDR16,       /* type */
574          0,                     /* rightshift */
575          1,                     /* size (0 = byte, 1 = short, 2 = long) */
576          16,                    /* bitsize */
577          FALSE,                 /* pc_relative */
578          0,                     /* bitpos */
579          complain_overflow_bitfield, /* complain_on_overflow */
580          bfd_elf_generic_reloc, /* special_function */
581          "R_PPC64_UADDR16",     /* name */
582          FALSE,                 /* partial_inplace */
583          0,                     /* src_mask */
584          0xffff,                /* dst_mask */
585          FALSE),                /* pcrel_offset */
586
587   /* 32-bit PC relative.  */
588   HOWTO (R_PPC64_REL32,         /* type */
589          0,                     /* rightshift */
590          2,                     /* size (0 = byte, 1 = short, 2 = long) */
591          32,                    /* bitsize */
592          TRUE,                  /* pc_relative */
593          0,                     /* bitpos */
594          /* FIXME: Verify.  Was complain_overflow_bitfield.  */
595          complain_overflow_signed, /* complain_on_overflow */
596          bfd_elf_generic_reloc, /* special_function */
597          "R_PPC64_REL32",       /* name */
598          FALSE,                 /* partial_inplace */
599          0,                     /* src_mask */
600          0xffffffff,            /* dst_mask */
601          TRUE),                 /* pcrel_offset */
602
603   /* 32-bit relocation to the symbol's procedure linkage table.  */
604   HOWTO (R_PPC64_PLT32,         /* type */
605          0,                     /* rightshift */
606          2,                     /* size (0 = byte, 1 = short, 2 = long) */
607          32,                    /* bitsize */
608          FALSE,                 /* pc_relative */
609          0,                     /* bitpos */
610          complain_overflow_bitfield, /* complain_on_overflow */
611          ppc64_elf_unhandled_reloc, /* special_function */
612          "R_PPC64_PLT32",       /* name */
613          FALSE,                 /* partial_inplace */
614          0,                     /* src_mask */
615          0xffffffff,            /* dst_mask */
616          FALSE),                /* pcrel_offset */
617
618   /* 32-bit PC relative relocation to the symbol's procedure linkage table.
619      FIXME: R_PPC64_PLTREL32 not supported.  */
620   HOWTO (R_PPC64_PLTREL32,      /* type */
621          0,                     /* rightshift */
622          2,                     /* size (0 = byte, 1 = short, 2 = long) */
623          32,                    /* bitsize */
624          TRUE,                  /* pc_relative */
625          0,                     /* bitpos */
626          complain_overflow_signed, /* complain_on_overflow */
627          bfd_elf_generic_reloc, /* special_function */
628          "R_PPC64_PLTREL32",    /* name */
629          FALSE,                 /* partial_inplace */
630          0,                     /* src_mask */
631          0xffffffff,            /* dst_mask */
632          TRUE),                 /* pcrel_offset */
633
634   /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
635      the symbol.  */
636   HOWTO (R_PPC64_PLT16_LO,      /* type */
637          0,                     /* rightshift */
638          1,                     /* size (0 = byte, 1 = short, 2 = long) */
639          16,                    /* bitsize */
640          FALSE,                 /* pc_relative */
641          0,                     /* bitpos */
642          complain_overflow_dont, /* complain_on_overflow */
643          ppc64_elf_unhandled_reloc, /* special_function */
644          "R_PPC64_PLT16_LO",    /* name */
645          FALSE,                 /* partial_inplace */
646          0,                     /* src_mask */
647          0xffff,                /* dst_mask */
648          FALSE),                /* pcrel_offset */
649
650   /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
651      the symbol.  */
652   HOWTO (R_PPC64_PLT16_HI,      /* type */
653          16,                    /* rightshift */
654          1,                     /* size (0 = byte, 1 = short, 2 = long) */
655          16,                    /* bitsize */
656          FALSE,                 /* pc_relative */
657          0,                     /* bitpos */
658          complain_overflow_dont, /* complain_on_overflow */
659          ppc64_elf_unhandled_reloc, /* special_function */
660          "R_PPC64_PLT16_HI",    /* name */
661          FALSE,                 /* partial_inplace */
662          0,                     /* src_mask */
663          0xffff,                /* dst_mask */
664          FALSE),                /* pcrel_offset */
665
666   /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
667      the symbol.  */
668   HOWTO (R_PPC64_PLT16_HA,      /* type */
669          16,                    /* rightshift */
670          1,                     /* size (0 = byte, 1 = short, 2 = long) */
671          16,                    /* bitsize */
672          FALSE,                 /* pc_relative */
673          0,                     /* bitpos */
674          complain_overflow_dont, /* complain_on_overflow */
675          ppc64_elf_unhandled_reloc, /* special_function */
676          "R_PPC64_PLT16_HA",    /* name */
677          FALSE,                 /* partial_inplace */
678          0,                     /* src_mask */
679          0xffff,                /* dst_mask */
680          FALSE),                /* pcrel_offset */
681
682   /* 16-bit section relative relocation.  */
683   HOWTO (R_PPC64_SECTOFF,       /* type */
684          0,                     /* rightshift */
685          1,                     /* size (0 = byte, 1 = short, 2 = long) */
686          16,                    /* bitsize */
687          FALSE,                 /* pc_relative */
688          0,                     /* bitpos */
689          complain_overflow_bitfield, /* complain_on_overflow */
690          ppc64_elf_sectoff_reloc, /* special_function */
691          "R_PPC64_SECTOFF",     /* name */
692          FALSE,                 /* partial_inplace */
693          0,                     /* src_mask */
694          0xffff,                /* dst_mask */
695          FALSE),                /* pcrel_offset */
696
697   /* Like R_PPC64_SECTOFF, but no overflow warning.  */
698   HOWTO (R_PPC64_SECTOFF_LO,    /* type */
699          0,                     /* rightshift */
700          1,                     /* size (0 = byte, 1 = short, 2 = long) */
701          16,                    /* bitsize */
702          FALSE,                 /* pc_relative */
703          0,                     /* bitpos */
704          complain_overflow_dont, /* complain_on_overflow */
705          ppc64_elf_sectoff_reloc, /* special_function */
706          "R_PPC64_SECTOFF_LO",  /* name */
707          FALSE,                 /* partial_inplace */
708          0,                     /* src_mask */
709          0xffff,                /* dst_mask */
710          FALSE),                /* pcrel_offset */
711
712   /* 16-bit upper half section relative relocation.  */
713   HOWTO (R_PPC64_SECTOFF_HI,    /* type */
714          16,                    /* rightshift */
715          1,                     /* size (0 = byte, 1 = short, 2 = long) */
716          16,                    /* bitsize */
717          FALSE,                 /* pc_relative */
718          0,                     /* bitpos */
719          complain_overflow_dont, /* complain_on_overflow */
720          ppc64_elf_sectoff_reloc, /* special_function */
721          "R_PPC64_SECTOFF_HI",  /* name */
722          FALSE,                 /* partial_inplace */
723          0,                     /* src_mask */
724          0xffff,                /* dst_mask */
725          FALSE),                /* pcrel_offset */
726
727   /* 16-bit upper half adjusted section relative relocation.  */
728   HOWTO (R_PPC64_SECTOFF_HA,    /* type */
729          16,                    /* rightshift */
730          1,                     /* size (0 = byte, 1 = short, 2 = long) */
731          16,                    /* bitsize */
732          FALSE,                 /* pc_relative */
733          0,                     /* bitpos */
734          complain_overflow_dont, /* complain_on_overflow */
735          ppc64_elf_sectoff_ha_reloc, /* special_function */
736          "R_PPC64_SECTOFF_HA",  /* name */
737          FALSE,                 /* partial_inplace */
738          0,                     /* src_mask */
739          0xffff,                /* dst_mask */
740          FALSE),                /* pcrel_offset */
741
742   /* Like R_PPC64_REL24 without touching the two least significant bits.  */
743   HOWTO (R_PPC64_REL30,         /* type */
744          2,                     /* rightshift */
745          2,                     /* size (0 = byte, 1 = short, 2 = long) */
746          30,                    /* bitsize */
747          TRUE,                  /* pc_relative */
748          0,                     /* bitpos */
749          complain_overflow_dont, /* complain_on_overflow */
750          bfd_elf_generic_reloc, /* special_function */
751          "R_PPC64_REL30",       /* name */
752          FALSE,                 /* partial_inplace */
753          0,                     /* src_mask */
754          0xfffffffc,            /* dst_mask */
755          TRUE),                 /* pcrel_offset */
756
757   /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI.  */
758
759   /* A standard 64-bit relocation.  */
760   HOWTO (R_PPC64_ADDR64,        /* type */
761          0,                     /* rightshift */
762          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
763          64,                    /* bitsize */
764          FALSE,                 /* pc_relative */
765          0,                     /* bitpos */
766          complain_overflow_dont, /* complain_on_overflow */
767          bfd_elf_generic_reloc, /* special_function */
768          "R_PPC64_ADDR64",      /* name */
769          FALSE,                 /* partial_inplace */
770          0,                     /* src_mask */
771          ONES (64),             /* dst_mask */
772          FALSE),                /* pcrel_offset */
773
774   /* The bits 32-47 of an address.  */
775   HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
776          32,                    /* rightshift */
777          1,                     /* size (0 = byte, 1 = short, 2 = long) */
778          16,                    /* bitsize */
779          FALSE,                 /* pc_relative */
780          0,                     /* bitpos */
781          complain_overflow_dont, /* complain_on_overflow */
782          bfd_elf_generic_reloc, /* special_function */
783          "R_PPC64_ADDR16_HIGHER", /* name */
784          FALSE,                 /* partial_inplace */
785          0,                     /* src_mask */
786          0xffff,                /* dst_mask */
787          FALSE),                /* pcrel_offset */
788
789   /* The bits 32-47 of an address, plus 1 if the contents of the low
790      16 bits, treated as a signed number, is negative.  */
791   HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
792          32,                    /* rightshift */
793          1,                     /* size (0 = byte, 1 = short, 2 = long) */
794          16,                    /* bitsize */
795          FALSE,                 /* pc_relative */
796          0,                     /* bitpos */
797          complain_overflow_dont, /* complain_on_overflow */
798          ppc64_elf_ha_reloc,    /* special_function */
799          "R_PPC64_ADDR16_HIGHERA", /* name */
800          FALSE,                 /* partial_inplace */
801          0,                     /* src_mask */
802          0xffff,                /* dst_mask */
803          FALSE),                /* pcrel_offset */
804
805   /* The bits 48-63 of an address.  */
806   HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
807          48,                    /* rightshift */
808          1,                     /* size (0 = byte, 1 = short, 2 = long) */
809          16,                    /* bitsize */
810          FALSE,                 /* pc_relative */
811          0,                     /* bitpos */
812          complain_overflow_dont, /* complain_on_overflow */
813          bfd_elf_generic_reloc, /* special_function */
814          "R_PPC64_ADDR16_HIGHEST", /* name */
815          FALSE,                 /* partial_inplace */
816          0,                     /* src_mask */
817          0xffff,                /* dst_mask */
818          FALSE),                /* pcrel_offset */
819
820   /* The bits 48-63 of an address, plus 1 if the contents of the low
821      16 bits, treated as a signed number, is negative.  */
822   HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
823          48,                    /* rightshift */
824          1,                     /* size (0 = byte, 1 = short, 2 = long) */
825          16,                    /* bitsize */
826          FALSE,                 /* pc_relative */
827          0,                     /* bitpos */
828          complain_overflow_dont, /* complain_on_overflow */
829          ppc64_elf_ha_reloc,    /* special_function */
830          "R_PPC64_ADDR16_HIGHESTA", /* name */
831          FALSE,                 /* partial_inplace */
832          0,                     /* src_mask */
833          0xffff,                /* dst_mask */
834          FALSE),                /* pcrel_offset */
835
836   /* Like ADDR64, but may be unaligned.  */
837   HOWTO (R_PPC64_UADDR64,       /* type */
838          0,                     /* rightshift */
839          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
840          64,                    /* bitsize */
841          FALSE,                 /* pc_relative */
842          0,                     /* bitpos */
843          complain_overflow_dont, /* complain_on_overflow */
844          bfd_elf_generic_reloc, /* special_function */
845          "R_PPC64_UADDR64",     /* name */
846          FALSE,                 /* partial_inplace */
847          0,                     /* src_mask */
848          ONES (64),             /* dst_mask */
849          FALSE),                /* pcrel_offset */
850
851   /* 64-bit relative relocation.  */
852   HOWTO (R_PPC64_REL64,         /* type */
853          0,                     /* rightshift */
854          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
855          64,                    /* bitsize */
856          TRUE,                  /* pc_relative */
857          0,                     /* bitpos */
858          complain_overflow_dont, /* complain_on_overflow */
859          bfd_elf_generic_reloc, /* special_function */
860          "R_PPC64_REL64",       /* name */
861          FALSE,                 /* partial_inplace */
862          0,                     /* src_mask */
863          ONES (64),             /* dst_mask */
864          TRUE),                 /* pcrel_offset */
865
866   /* 64-bit relocation to the symbol's procedure linkage table.  */
867   HOWTO (R_PPC64_PLT64,         /* type */
868          0,                     /* rightshift */
869          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
870          64,                    /* bitsize */
871          FALSE,                 /* pc_relative */
872          0,                     /* bitpos */
873          complain_overflow_dont, /* complain_on_overflow */
874          ppc64_elf_unhandled_reloc, /* special_function */
875          "R_PPC64_PLT64",       /* name */
876          FALSE,                 /* partial_inplace */
877          0,                     /* src_mask */
878          ONES (64),             /* dst_mask */
879          FALSE),                /* pcrel_offset */
880
881   /* 64-bit PC relative relocation to the symbol's procedure linkage
882      table.  */
883   /* FIXME: R_PPC64_PLTREL64 not supported.  */
884   HOWTO (R_PPC64_PLTREL64,      /* type */
885          0,                     /* rightshift */
886          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
887          64,                    /* bitsize */
888          TRUE,                  /* pc_relative */
889          0,                     /* bitpos */
890          complain_overflow_dont, /* complain_on_overflow */
891          ppc64_elf_unhandled_reloc, /* special_function */
892          "R_PPC64_PLTREL64",    /* name */
893          FALSE,                 /* partial_inplace */
894          0,                     /* src_mask */
895          ONES (64),             /* dst_mask */
896          TRUE),                 /* pcrel_offset */
897
898   /* 16 bit TOC-relative relocation.  */
899
900   /* R_PPC64_TOC16        47       half16*      S + A - .TOC.  */
901   HOWTO (R_PPC64_TOC16,         /* type */
902          0,                     /* rightshift */
903          1,                     /* size (0 = byte, 1 = short, 2 = long) */
904          16,                    /* bitsize */
905          FALSE,                 /* pc_relative */
906          0,                     /* bitpos */
907          complain_overflow_signed, /* complain_on_overflow */
908          ppc64_elf_toc_reloc,   /* special_function */
909          "R_PPC64_TOC16",       /* name */
910          FALSE,                 /* partial_inplace */
911          0,                     /* src_mask */
912          0xffff,                /* dst_mask */
913          FALSE),                /* pcrel_offset */
914
915   /* 16 bit TOC-relative relocation without overflow.  */
916
917   /* R_PPC64_TOC16_LO     48       half16        #lo (S + A - .TOC.)  */
918   HOWTO (R_PPC64_TOC16_LO,      /* type */
919          0,                     /* rightshift */
920          1,                     /* size (0 = byte, 1 = short, 2 = long) */
921          16,                    /* bitsize */
922          FALSE,                 /* pc_relative */
923          0,                     /* bitpos */
924          complain_overflow_dont, /* complain_on_overflow */
925          ppc64_elf_toc_reloc,   /* special_function */
926          "R_PPC64_TOC16_LO",    /* name */
927          FALSE,                 /* partial_inplace */
928          0,                     /* src_mask */
929          0xffff,                /* dst_mask */
930          FALSE),                /* pcrel_offset */
931
932   /* 16 bit TOC-relative relocation, high 16 bits.  */
933
934   /* R_PPC64_TOC16_HI     49       half16        #hi (S + A - .TOC.)  */
935   HOWTO (R_PPC64_TOC16_HI,      /* type */
936          16,                    /* rightshift */
937          1,                     /* size (0 = byte, 1 = short, 2 = long) */
938          16,                    /* bitsize */
939          FALSE,                 /* pc_relative */
940          0,                     /* bitpos */
941          complain_overflow_dont, /* complain_on_overflow */
942          ppc64_elf_toc_reloc,   /* special_function */
943          "R_PPC64_TOC16_HI",    /* name */
944          FALSE,                 /* partial_inplace */
945          0,                     /* src_mask */
946          0xffff,                /* dst_mask */
947          FALSE),                /* pcrel_offset */
948
949   /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
950      contents of the low 16 bits, treated as a signed number, is
951      negative.  */
952
953   /* R_PPC64_TOC16_HA     50       half16        #ha (S + A - .TOC.)  */
954   HOWTO (R_PPC64_TOC16_HA,      /* type */
955          16,                    /* rightshift */
956          1,                     /* size (0 = byte, 1 = short, 2 = long) */
957          16,                    /* bitsize */
958          FALSE,                 /* pc_relative */
959          0,                     /* bitpos */
960          complain_overflow_dont, /* complain_on_overflow */
961          ppc64_elf_toc_ha_reloc, /* special_function */
962          "R_PPC64_TOC16_HA",    /* name */
963          FALSE,                 /* partial_inplace */
964          0,                     /* src_mask */
965          0xffff,                /* dst_mask */
966          FALSE),                /* pcrel_offset */
967
968   /* 64-bit relocation; insert value of TOC base (.TOC.).  */
969
970   /* R_PPC64_TOC                  51       doubleword64  .TOC.  */
971   HOWTO (R_PPC64_TOC,           /* type */
972          0,                     /* rightshift */
973          4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
974          64,                    /* bitsize */
975          FALSE,                 /* pc_relative */
976          0,                     /* bitpos */
977          complain_overflow_bitfield, /* complain_on_overflow */
978          ppc64_elf_toc64_reloc, /* special_function */
979          "R_PPC64_TOC",         /* name */
980          FALSE,                 /* partial_inplace */
981          0,                     /* src_mask */
982          ONES (64),             /* dst_mask */
983          FALSE),                /* pcrel_offset */
984
985   /* Like R_PPC64_GOT16, but also informs the link editor that the
986      value to relocate may (!) refer to a PLT entry which the link
987      editor (a) may replace with the symbol value.  If the link editor
988      is unable to fully resolve the symbol, it may (b) create a PLT
989      entry and store the address to the new PLT entry in the GOT.
990      This permits lazy resolution of function symbols at run time.
991      The link editor may also skip all of this and just (c) emit a
992      R_PPC64_GLOB_DAT to tie the symbol to the GOT entry.  */
993   /* FIXME: R_PPC64_PLTGOT16 not implemented.  */
994     HOWTO (R_PPC64_PLTGOT16,    /* type */
995          0,                     /* rightshift */
996          1,                     /* size (0 = byte, 1 = short, 2 = long) */
997          16,                    /* bitsize */
998          FALSE,                 /* pc_relative */
999          0,                     /* bitpos */
1000          complain_overflow_signed, /* complain_on_overflow */
1001          ppc64_elf_unhandled_reloc, /* special_function */
1002          "R_PPC64_PLTGOT16",    /* name */
1003          FALSE,                 /* partial_inplace */
1004          0,                     /* src_mask */
1005          0xffff,                /* dst_mask */
1006          FALSE),                /* pcrel_offset */
1007
1008   /* Like R_PPC64_PLTGOT16, but without overflow.  */
1009   /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1010   HOWTO (R_PPC64_PLTGOT16_LO,   /* type */
1011          0,                     /* rightshift */
1012          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1013          16,                    /* bitsize */
1014          FALSE,                 /* pc_relative */
1015          0,                     /* bitpos */
1016          complain_overflow_dont, /* complain_on_overflow */
1017          ppc64_elf_unhandled_reloc, /* special_function */
1018          "R_PPC64_PLTGOT16_LO", /* name */
1019          FALSE,                 /* partial_inplace */
1020          0,                     /* src_mask */
1021          0xffff,                /* dst_mask */
1022          FALSE),                /* pcrel_offset */
1023
1024   /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address.  */
1025   /* FIXME: R_PPC64_PLTGOT16_HI not implemented.  */
1026   HOWTO (R_PPC64_PLTGOT16_HI,   /* type */
1027          16,                    /* rightshift */
1028          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1029          16,                    /* bitsize */
1030          FALSE,                 /* pc_relative */
1031          0,                     /* bitpos */
1032          complain_overflow_dont, /* complain_on_overflow */
1033          ppc64_elf_unhandled_reloc, /* special_function */
1034          "R_PPC64_PLTGOT16_HI", /* name */
1035          FALSE,                 /* partial_inplace */
1036          0,                     /* src_mask */
1037          0xffff,                /* dst_mask */
1038          FALSE),                /* pcrel_offset */
1039
1040   /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1041      1 if the contents of the low 16 bits, treated as a signed number,
1042      is negative.  */
1043   /* FIXME: R_PPC64_PLTGOT16_HA not implemented.  */
1044   HOWTO (R_PPC64_PLTGOT16_HA,   /* type */
1045          16,                    /* rightshift */
1046          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1047          16,                    /* bitsize */
1048          FALSE,                 /* pc_relative */
1049          0,                     /* bitpos */
1050          complain_overflow_dont,/* complain_on_overflow */
1051          ppc64_elf_unhandled_reloc, /* special_function */
1052          "R_PPC64_PLTGOT16_HA", /* name */
1053          FALSE,                 /* partial_inplace */
1054          0,                     /* src_mask */
1055          0xffff,                /* dst_mask */
1056          FALSE),                /* pcrel_offset */
1057
1058   /* Like R_PPC64_ADDR16, but for instructions with a DS field.  */
1059   HOWTO (R_PPC64_ADDR16_DS,     /* type */
1060          0,                     /* rightshift */
1061          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1062          16,                    /* bitsize */
1063          FALSE,                 /* pc_relative */
1064          0,                     /* bitpos */
1065          complain_overflow_bitfield, /* complain_on_overflow */
1066          bfd_elf_generic_reloc, /* special_function */
1067          "R_PPC64_ADDR16_DS",   /* name */
1068          FALSE,                 /* partial_inplace */
1069          0,                     /* src_mask */
1070          0xfffc,                /* dst_mask */
1071          FALSE),                /* pcrel_offset */
1072
1073   /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field.  */
1074   HOWTO (R_PPC64_ADDR16_LO_DS,  /* type */
1075          0,                     /* rightshift */
1076          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1077          16,                    /* bitsize */
1078          FALSE,                 /* pc_relative */
1079          0,                     /* bitpos */
1080          complain_overflow_dont,/* complain_on_overflow */
1081          bfd_elf_generic_reloc, /* special_function */
1082          "R_PPC64_ADDR16_LO_DS",/* name */
1083          FALSE,                 /* partial_inplace */
1084          0,                     /* src_mask */
1085          0xfffc,                /* dst_mask */
1086          FALSE),                /* pcrel_offset */
1087
1088   /* Like R_PPC64_GOT16, but for instructions with a DS field.  */
1089   HOWTO (R_PPC64_GOT16_DS,      /* type */
1090          0,                     /* rightshift */
1091          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1092          16,                    /* bitsize */
1093          FALSE,                 /* pc_relative */
1094          0,                     /* bitpos */
1095          complain_overflow_signed, /* complain_on_overflow */
1096          ppc64_elf_unhandled_reloc, /* special_function */
1097          "R_PPC64_GOT16_DS",    /* name */
1098          FALSE,                 /* partial_inplace */
1099          0,                     /* src_mask */
1100          0xfffc,                /* dst_mask */
1101          FALSE),                /* pcrel_offset */
1102
1103   /* Like R_PPC64_GOT16_LO, but for instructions with a DS field.  */
1104   HOWTO (R_PPC64_GOT16_LO_DS,   /* type */
1105          0,                     /* rightshift */
1106          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1107          16,                    /* bitsize */
1108          FALSE,                 /* pc_relative */
1109          0,                     /* bitpos */
1110          complain_overflow_dont, /* complain_on_overflow */
1111          ppc64_elf_unhandled_reloc, /* special_function */
1112          "R_PPC64_GOT16_LO_DS", /* name */
1113          FALSE,                 /* partial_inplace */
1114          0,                     /* src_mask */
1115          0xfffc,                /* dst_mask */
1116          FALSE),                /* pcrel_offset */
1117
1118   /* Like R_PPC64_PLT16_LO, but for instructions with a DS field.  */
1119   HOWTO (R_PPC64_PLT16_LO_DS,   /* type */
1120          0,                     /* rightshift */
1121          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1122          16,                    /* bitsize */
1123          FALSE,                 /* pc_relative */
1124          0,                     /* bitpos */
1125          complain_overflow_dont, /* complain_on_overflow */
1126          ppc64_elf_unhandled_reloc, /* special_function */
1127          "R_PPC64_PLT16_LO_DS", /* name */
1128          FALSE,                 /* partial_inplace */
1129          0,                     /* src_mask */
1130          0xfffc,                /* dst_mask */
1131          FALSE),                /* pcrel_offset */
1132
1133   /* Like R_PPC64_SECTOFF, but for instructions with a DS field.  */
1134   HOWTO (R_PPC64_SECTOFF_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_bitfield, /* complain_on_overflow */
1141          ppc64_elf_sectoff_reloc, /* special_function */
1142          "R_PPC64_SECTOFF_DS",  /* name */
1143          FALSE,                 /* partial_inplace */
1144          0,                     /* src_mask */
1145          0xfffc,                /* dst_mask */
1146          FALSE),                /* pcrel_offset */
1147
1148   /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field.  */
1149   HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1150          0,                     /* rightshift */
1151          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1152          16,                    /* bitsize */
1153          FALSE,                 /* pc_relative */
1154          0,                     /* bitpos */
1155          complain_overflow_dont, /* complain_on_overflow */
1156          ppc64_elf_sectoff_reloc, /* special_function */
1157          "R_PPC64_SECTOFF_LO_DS",/* name */
1158          FALSE,                 /* partial_inplace */
1159          0,                     /* src_mask */
1160          0xfffc,                /* dst_mask */
1161          FALSE),                /* pcrel_offset */
1162
1163   /* Like R_PPC64_TOC16, but for instructions with a DS field.  */
1164   HOWTO (R_PPC64_TOC16_DS,      /* type */
1165          0,                     /* rightshift */
1166          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1167          16,                    /* bitsize */
1168          FALSE,                 /* pc_relative */
1169          0,                     /* bitpos */
1170          complain_overflow_signed, /* complain_on_overflow */
1171          ppc64_elf_toc_reloc,   /* special_function */
1172          "R_PPC64_TOC16_DS",    /* name */
1173          FALSE,                 /* partial_inplace */
1174          0,                     /* src_mask */
1175          0xfffc,                /* dst_mask */
1176          FALSE),                /* pcrel_offset */
1177
1178   /* Like R_PPC64_TOC16_LO, but for instructions with a DS field.  */
1179   HOWTO (R_PPC64_TOC16_LO_DS,   /* type */
1180          0,                     /* rightshift */
1181          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1182          16,                    /* bitsize */
1183          FALSE,                 /* pc_relative */
1184          0,                     /* bitpos */
1185          complain_overflow_dont, /* complain_on_overflow */
1186          ppc64_elf_toc_reloc,   /* special_function */
1187          "R_PPC64_TOC16_LO_DS", /* name */
1188          FALSE,                 /* partial_inplace */
1189          0,                     /* src_mask */
1190          0xfffc,                /* dst_mask */
1191          FALSE),                /* pcrel_offset */
1192
1193   /* Like R_PPC64_PLTGOT16, but for instructions with a DS field.  */
1194   /* FIXME: R_PPC64_PLTGOT16_DS not implemented.  */
1195     HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1196          0,                     /* rightshift */
1197          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1198          16,                    /* bitsize */
1199          FALSE,                 /* pc_relative */
1200          0,                     /* bitpos */
1201          complain_overflow_signed, /* complain_on_overflow */
1202          ppc64_elf_unhandled_reloc, /* special_function */
1203          "R_PPC64_PLTGOT16_DS", /* name */
1204          FALSE,                 /* partial_inplace */
1205          0,                     /* src_mask */
1206          0xfffc,                /* dst_mask */
1207          FALSE),                /* pcrel_offset */
1208
1209   /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field.  */
1210   /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1211   HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1212          0,                     /* rightshift */
1213          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1214          16,                    /* bitsize */
1215          FALSE,                 /* pc_relative */
1216          0,                     /* bitpos */
1217          complain_overflow_dont, /* complain_on_overflow */
1218          ppc64_elf_unhandled_reloc, /* special_function */
1219          "R_PPC64_PLTGOT16_LO_DS",/* name */
1220          FALSE,                 /* partial_inplace */
1221          0,                     /* src_mask */
1222          0xfffc,                /* dst_mask */
1223          FALSE),                /* pcrel_offset */
1224
1225   /* Marker reloc for TLS.  */
1226   HOWTO (R_PPC64_TLS,
1227          0,                     /* rightshift */
1228          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1229          32,                    /* bitsize */
1230          FALSE,                 /* pc_relative */
1231          0,                     /* bitpos */
1232          complain_overflow_dont, /* complain_on_overflow */
1233          bfd_elf_generic_reloc, /* special_function */
1234          "R_PPC64_TLS",         /* name */
1235          FALSE,                 /* partial_inplace */
1236          0,                     /* src_mask */
1237          0,                     /* dst_mask */
1238          FALSE),                /* pcrel_offset */
1239
1240   /* Computes the load module index of the load module that contains the
1241      definition of its TLS sym.  */
1242   HOWTO (R_PPC64_DTPMOD64,
1243          0,                     /* rightshift */
1244          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1245          64,                    /* bitsize */
1246          FALSE,                 /* pc_relative */
1247          0,                     /* bitpos */
1248          complain_overflow_dont, /* complain_on_overflow */
1249          ppc64_elf_unhandled_reloc, /* special_function */
1250          "R_PPC64_DTPMOD64",    /* name */
1251          FALSE,                 /* partial_inplace */
1252          0,                     /* src_mask */
1253          ONES (64),             /* dst_mask */
1254          FALSE),                /* pcrel_offset */
1255
1256   /* Computes a dtv-relative displacement, the difference between the value
1257      of sym+add and the base address of the thread-local storage block that
1258      contains the definition of sym, minus 0x8000.  */
1259   HOWTO (R_PPC64_DTPREL64,
1260          0,                     /* rightshift */
1261          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1262          64,                    /* bitsize */
1263          FALSE,                 /* pc_relative */
1264          0,                     /* bitpos */
1265          complain_overflow_dont, /* complain_on_overflow */
1266          ppc64_elf_unhandled_reloc, /* special_function */
1267          "R_PPC64_DTPREL64",    /* name */
1268          FALSE,                 /* partial_inplace */
1269          0,                     /* src_mask */
1270          ONES (64),             /* dst_mask */
1271          FALSE),                /* pcrel_offset */
1272
1273   /* A 16 bit dtprel reloc.  */
1274   HOWTO (R_PPC64_DTPREL16,
1275          0,                     /* rightshift */
1276          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1277          16,                    /* bitsize */
1278          FALSE,                 /* pc_relative */
1279          0,                     /* bitpos */
1280          complain_overflow_signed, /* complain_on_overflow */
1281          ppc64_elf_unhandled_reloc, /* special_function */
1282          "R_PPC64_DTPREL16",    /* name */
1283          FALSE,                 /* partial_inplace */
1284          0,                     /* src_mask */
1285          0xffff,                /* dst_mask */
1286          FALSE),                /* pcrel_offset */
1287
1288   /* Like DTPREL16, but no overflow.  */
1289   HOWTO (R_PPC64_DTPREL16_LO,
1290          0,                     /* rightshift */
1291          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1292          16,                    /* bitsize */
1293          FALSE,                 /* pc_relative */
1294          0,                     /* bitpos */
1295          complain_overflow_dont, /* complain_on_overflow */
1296          ppc64_elf_unhandled_reloc, /* special_function */
1297          "R_PPC64_DTPREL16_LO", /* name */
1298          FALSE,                 /* partial_inplace */
1299          0,                     /* src_mask */
1300          0xffff,                /* dst_mask */
1301          FALSE),                /* pcrel_offset */
1302
1303   /* Like DTPREL16_LO, but next higher group of 16 bits.  */
1304   HOWTO (R_PPC64_DTPREL16_HI,
1305          16,                    /* rightshift */
1306          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1307          16,                    /* bitsize */
1308          FALSE,                 /* pc_relative */
1309          0,                     /* bitpos */
1310          complain_overflow_dont, /* complain_on_overflow */
1311          ppc64_elf_unhandled_reloc, /* special_function */
1312          "R_PPC64_DTPREL16_HI", /* name */
1313          FALSE,                 /* partial_inplace */
1314          0,                     /* src_mask */
1315          0xffff,                /* dst_mask */
1316          FALSE),                /* pcrel_offset */
1317
1318   /* Like DTPREL16_HI, but adjust for low 16 bits.  */
1319   HOWTO (R_PPC64_DTPREL16_HA,
1320          16,                    /* rightshift */
1321          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1322          16,                    /* bitsize */
1323          FALSE,                 /* pc_relative */
1324          0,                     /* bitpos */
1325          complain_overflow_dont, /* complain_on_overflow */
1326          ppc64_elf_unhandled_reloc, /* special_function */
1327          "R_PPC64_DTPREL16_HA", /* name */
1328          FALSE,                 /* partial_inplace */
1329          0,                     /* src_mask */
1330          0xffff,                /* dst_mask */
1331          FALSE),                /* pcrel_offset */
1332
1333   /* Like DTPREL16_HI, but next higher group of 16 bits.  */
1334   HOWTO (R_PPC64_DTPREL16_HIGHER,
1335          32,                    /* rightshift */
1336          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1337          16,                    /* bitsize */
1338          FALSE,                 /* pc_relative */
1339          0,                     /* bitpos */
1340          complain_overflow_dont, /* complain_on_overflow */
1341          ppc64_elf_unhandled_reloc, /* special_function */
1342          "R_PPC64_DTPREL16_HIGHER", /* name */
1343          FALSE,                 /* partial_inplace */
1344          0,                     /* src_mask */
1345          0xffff,                /* dst_mask */
1346          FALSE),                /* pcrel_offset */
1347
1348   /* Like DTPREL16_HIGHER, but adjust for low 16 bits.  */
1349   HOWTO (R_PPC64_DTPREL16_HIGHERA,
1350          32,                    /* rightshift */
1351          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1352          16,                    /* bitsize */
1353          FALSE,                 /* pc_relative */
1354          0,                     /* bitpos */
1355          complain_overflow_dont, /* complain_on_overflow */
1356          ppc64_elf_unhandled_reloc, /* special_function */
1357          "R_PPC64_DTPREL16_HIGHERA", /* name */
1358          FALSE,                 /* partial_inplace */
1359          0,                     /* src_mask */
1360          0xffff,                /* dst_mask */
1361          FALSE),                /* pcrel_offset */
1362
1363   /* Like DTPREL16_HIGHER, but next higher group of 16 bits.  */
1364   HOWTO (R_PPC64_DTPREL16_HIGHEST,
1365          48,                    /* rightshift */
1366          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1367          16,                    /* bitsize */
1368          FALSE,                 /* pc_relative */
1369          0,                     /* bitpos */
1370          complain_overflow_dont, /* complain_on_overflow */
1371          ppc64_elf_unhandled_reloc, /* special_function */
1372          "R_PPC64_DTPREL16_HIGHEST", /* name */
1373          FALSE,                 /* partial_inplace */
1374          0,                     /* src_mask */
1375          0xffff,                /* dst_mask */
1376          FALSE),                /* pcrel_offset */
1377
1378   /* Like DTPREL16_HIGHEST, but adjust for low 16 bits.  */
1379   HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1380          48,                    /* rightshift */
1381          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1382          16,                    /* bitsize */
1383          FALSE,                 /* pc_relative */
1384          0,                     /* bitpos */
1385          complain_overflow_dont, /* complain_on_overflow */
1386          ppc64_elf_unhandled_reloc, /* special_function */
1387          "R_PPC64_DTPREL16_HIGHESTA", /* name */
1388          FALSE,                 /* partial_inplace */
1389          0,                     /* src_mask */
1390          0xffff,                /* dst_mask */
1391          FALSE),                /* pcrel_offset */
1392
1393   /* Like DTPREL16, but for insns with a DS field.  */
1394   HOWTO (R_PPC64_DTPREL16_DS,
1395          0,                     /* rightshift */
1396          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1397          16,                    /* bitsize */
1398          FALSE,                 /* pc_relative */
1399          0,                     /* bitpos */
1400          complain_overflow_signed, /* complain_on_overflow */
1401          ppc64_elf_unhandled_reloc, /* special_function */
1402          "R_PPC64_DTPREL16_DS", /* name */
1403          FALSE,                 /* partial_inplace */
1404          0,                     /* src_mask */
1405          0xfffc,                /* dst_mask */
1406          FALSE),                /* pcrel_offset */
1407
1408   /* Like DTPREL16_DS, but no overflow.  */
1409   HOWTO (R_PPC64_DTPREL16_LO_DS,
1410          0,                     /* rightshift */
1411          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1412          16,                    /* bitsize */
1413          FALSE,                 /* pc_relative */
1414          0,                     /* bitpos */
1415          complain_overflow_dont, /* complain_on_overflow */
1416          ppc64_elf_unhandled_reloc, /* special_function */
1417          "R_PPC64_DTPREL16_LO_DS", /* name */
1418          FALSE,                 /* partial_inplace */
1419          0,                     /* src_mask */
1420          0xfffc,                /* dst_mask */
1421          FALSE),                /* pcrel_offset */
1422
1423   /* Computes a tp-relative displacement, the difference between the value of
1424      sym+add and the value of the thread pointer (r13).  */
1425   HOWTO (R_PPC64_TPREL64,
1426          0,                     /* rightshift */
1427          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1428          64,                    /* bitsize */
1429          FALSE,                 /* pc_relative */
1430          0,                     /* bitpos */
1431          complain_overflow_dont, /* complain_on_overflow */
1432          ppc64_elf_unhandled_reloc, /* special_function */
1433          "R_PPC64_TPREL64",     /* name */
1434          FALSE,                 /* partial_inplace */
1435          0,                     /* src_mask */
1436          ONES (64),             /* dst_mask */
1437          FALSE),                /* pcrel_offset */
1438
1439   /* A 16 bit tprel reloc.  */
1440   HOWTO (R_PPC64_TPREL16,
1441          0,                     /* rightshift */
1442          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1443          16,                    /* bitsize */
1444          FALSE,                 /* pc_relative */
1445          0,                     /* bitpos */
1446          complain_overflow_signed, /* complain_on_overflow */
1447          ppc64_elf_unhandled_reloc, /* special_function */
1448          "R_PPC64_TPREL16",     /* name */
1449          FALSE,                 /* partial_inplace */
1450          0,                     /* src_mask */
1451          0xffff,                /* dst_mask */
1452          FALSE),                /* pcrel_offset */
1453
1454   /* Like TPREL16, but no overflow.  */
1455   HOWTO (R_PPC64_TPREL16_LO,
1456          0,                     /* rightshift */
1457          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1458          16,                    /* bitsize */
1459          FALSE,                 /* pc_relative */
1460          0,                     /* bitpos */
1461          complain_overflow_dont, /* complain_on_overflow */
1462          ppc64_elf_unhandled_reloc, /* special_function */
1463          "R_PPC64_TPREL16_LO",  /* name */
1464          FALSE,                 /* partial_inplace */
1465          0,                     /* src_mask */
1466          0xffff,                /* dst_mask */
1467          FALSE),                /* pcrel_offset */
1468
1469   /* Like TPREL16_LO, but next higher group of 16 bits.  */
1470   HOWTO (R_PPC64_TPREL16_HI,
1471          16,                    /* rightshift */
1472          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1473          16,                    /* bitsize */
1474          FALSE,                 /* pc_relative */
1475          0,                     /* bitpos */
1476          complain_overflow_dont, /* complain_on_overflow */
1477          ppc64_elf_unhandled_reloc, /* special_function */
1478          "R_PPC64_TPREL16_HI",  /* name */
1479          FALSE,                 /* partial_inplace */
1480          0,                     /* src_mask */
1481          0xffff,                /* dst_mask */
1482          FALSE),                /* pcrel_offset */
1483
1484   /* Like TPREL16_HI, but adjust for low 16 bits.  */
1485   HOWTO (R_PPC64_TPREL16_HA,
1486          16,                    /* rightshift */
1487          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1488          16,                    /* bitsize */
1489          FALSE,                 /* pc_relative */
1490          0,                     /* bitpos */
1491          complain_overflow_dont, /* complain_on_overflow */
1492          ppc64_elf_unhandled_reloc, /* special_function */
1493          "R_PPC64_TPREL16_HA",  /* name */
1494          FALSE,                 /* partial_inplace */
1495          0,                     /* src_mask */
1496          0xffff,                /* dst_mask */
1497          FALSE),                /* pcrel_offset */
1498
1499   /* Like TPREL16_HI, but next higher group of 16 bits.  */
1500   HOWTO (R_PPC64_TPREL16_HIGHER,
1501          32,                    /* rightshift */
1502          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1503          16,                    /* bitsize */
1504          FALSE,                 /* pc_relative */
1505          0,                     /* bitpos */
1506          complain_overflow_dont, /* complain_on_overflow */
1507          ppc64_elf_unhandled_reloc, /* special_function */
1508          "R_PPC64_TPREL16_HIGHER",      /* name */
1509          FALSE,                 /* partial_inplace */
1510          0,                     /* src_mask */
1511          0xffff,                /* dst_mask */
1512          FALSE),                /* pcrel_offset */
1513
1514   /* Like TPREL16_HIGHER, but adjust for low 16 bits.  */
1515   HOWTO (R_PPC64_TPREL16_HIGHERA,
1516          32,                    /* rightshift */
1517          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1518          16,                    /* bitsize */
1519          FALSE,                 /* pc_relative */
1520          0,                     /* bitpos */
1521          complain_overflow_dont, /* complain_on_overflow */
1522          ppc64_elf_unhandled_reloc, /* special_function */
1523          "R_PPC64_TPREL16_HIGHERA", /* name */
1524          FALSE,                 /* partial_inplace */
1525          0,                     /* src_mask */
1526          0xffff,                /* dst_mask */
1527          FALSE),                /* pcrel_offset */
1528
1529   /* Like TPREL16_HIGHER, but next higher group of 16 bits.  */
1530   HOWTO (R_PPC64_TPREL16_HIGHEST,
1531          48,                    /* rightshift */
1532          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1533          16,                    /* bitsize */
1534          FALSE,                 /* pc_relative */
1535          0,                     /* bitpos */
1536          complain_overflow_dont, /* complain_on_overflow */
1537          ppc64_elf_unhandled_reloc, /* special_function */
1538          "R_PPC64_TPREL16_HIGHEST", /* name */
1539          FALSE,                 /* partial_inplace */
1540          0,                     /* src_mask */
1541          0xffff,                /* dst_mask */
1542          FALSE),                /* pcrel_offset */
1543
1544   /* Like TPREL16_HIGHEST, but adjust for low 16 bits.  */
1545   HOWTO (R_PPC64_TPREL16_HIGHESTA,
1546          48,                    /* rightshift */
1547          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1548          16,                    /* bitsize */
1549          FALSE,                 /* pc_relative */
1550          0,                     /* bitpos */
1551          complain_overflow_dont, /* complain_on_overflow */
1552          ppc64_elf_unhandled_reloc, /* special_function */
1553          "R_PPC64_TPREL16_HIGHESTA", /* name */
1554          FALSE,                 /* partial_inplace */
1555          0,                     /* src_mask */
1556          0xffff,                /* dst_mask */
1557          FALSE),                /* pcrel_offset */
1558
1559   /* Like TPREL16, but for insns with a DS field.  */
1560   HOWTO (R_PPC64_TPREL16_DS,
1561          0,                     /* rightshift */
1562          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1563          16,                    /* bitsize */
1564          FALSE,                 /* pc_relative */
1565          0,                     /* bitpos */
1566          complain_overflow_signed, /* complain_on_overflow */
1567          ppc64_elf_unhandled_reloc, /* special_function */
1568          "R_PPC64_TPREL16_DS",  /* name */
1569          FALSE,                 /* partial_inplace */
1570          0,                     /* src_mask */
1571          0xfffc,                /* dst_mask */
1572          FALSE),                /* pcrel_offset */
1573
1574   /* Like TPREL16_DS, but no overflow.  */
1575   HOWTO (R_PPC64_TPREL16_LO_DS,
1576          0,                     /* rightshift */
1577          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1578          16,                    /* bitsize */
1579          FALSE,                 /* pc_relative */
1580          0,                     /* bitpos */
1581          complain_overflow_dont, /* complain_on_overflow */
1582          ppc64_elf_unhandled_reloc, /* special_function */
1583          "R_PPC64_TPREL16_LO_DS", /* name */
1584          FALSE,                 /* partial_inplace */
1585          0,                     /* src_mask */
1586          0xfffc,                /* dst_mask */
1587          FALSE),                /* pcrel_offset */
1588
1589   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1590      with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1591      to the first entry relative to the TOC base (r2).  */
1592   HOWTO (R_PPC64_GOT_TLSGD16,
1593          0,                     /* rightshift */
1594          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1595          16,                    /* bitsize */
1596          FALSE,                 /* pc_relative */
1597          0,                     /* bitpos */
1598          complain_overflow_signed, /* complain_on_overflow */
1599          ppc64_elf_unhandled_reloc, /* special_function */
1600          "R_PPC64_GOT_TLSGD16", /* name */
1601          FALSE,                 /* partial_inplace */
1602          0,                     /* src_mask */
1603          0xffff,                /* dst_mask */
1604          FALSE),                /* pcrel_offset */
1605
1606   /* Like GOT_TLSGD16, but no overflow.  */
1607   HOWTO (R_PPC64_GOT_TLSGD16_LO,
1608          0,                     /* rightshift */
1609          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1610          16,                    /* bitsize */
1611          FALSE,                 /* pc_relative */
1612          0,                     /* bitpos */
1613          complain_overflow_dont, /* complain_on_overflow */
1614          ppc64_elf_unhandled_reloc, /* special_function */
1615          "R_PPC64_GOT_TLSGD16_LO", /* name */
1616          FALSE,                 /* partial_inplace */
1617          0,                     /* src_mask */
1618          0xffff,                /* dst_mask */
1619          FALSE),                /* pcrel_offset */
1620
1621   /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
1622   HOWTO (R_PPC64_GOT_TLSGD16_HI,
1623          16,                    /* rightshift */
1624          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1625          16,                    /* bitsize */
1626          FALSE,                 /* pc_relative */
1627          0,                     /* bitpos */
1628          complain_overflow_dont, /* complain_on_overflow */
1629          ppc64_elf_unhandled_reloc, /* special_function */
1630          "R_PPC64_GOT_TLSGD16_HI", /* name */
1631          FALSE,                 /* partial_inplace */
1632          0,                     /* src_mask */
1633          0xffff,                /* dst_mask */
1634          FALSE),                /* pcrel_offset */
1635
1636   /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
1637   HOWTO (R_PPC64_GOT_TLSGD16_HA,
1638          16,                    /* rightshift */
1639          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1640          16,                    /* bitsize */
1641          FALSE,                 /* pc_relative */
1642          0,                     /* bitpos */
1643          complain_overflow_dont, /* complain_on_overflow */
1644          ppc64_elf_unhandled_reloc, /* special_function */
1645          "R_PPC64_GOT_TLSGD16_HA", /* name */
1646          FALSE,                 /* partial_inplace */
1647          0,                     /* src_mask */
1648          0xffff,                /* dst_mask */
1649          FALSE),                /* pcrel_offset */
1650
1651   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1652      with values (sym+add)@dtpmod and zero, and computes the offset to the
1653      first entry relative to the TOC base (r2).  */
1654   HOWTO (R_PPC64_GOT_TLSLD16,
1655          0,                     /* rightshift */
1656          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1657          16,                    /* bitsize */
1658          FALSE,                 /* pc_relative */
1659          0,                     /* bitpos */
1660          complain_overflow_signed, /* complain_on_overflow */
1661          ppc64_elf_unhandled_reloc, /* special_function */
1662          "R_PPC64_GOT_TLSLD16", /* name */
1663          FALSE,                 /* partial_inplace */
1664          0,                     /* src_mask */
1665          0xffff,                /* dst_mask */
1666          FALSE),                /* pcrel_offset */
1667
1668   /* Like GOT_TLSLD16, but no overflow.  */
1669   HOWTO (R_PPC64_GOT_TLSLD16_LO,
1670          0,                     /* rightshift */
1671          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1672          16,                    /* bitsize */
1673          FALSE,                 /* pc_relative */
1674          0,                     /* bitpos */
1675          complain_overflow_dont, /* complain_on_overflow */
1676          ppc64_elf_unhandled_reloc, /* special_function */
1677          "R_PPC64_GOT_TLSLD16_LO", /* name */
1678          FALSE,                 /* partial_inplace */
1679          0,                     /* src_mask */
1680          0xffff,                /* dst_mask */
1681          FALSE),                /* pcrel_offset */
1682
1683   /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
1684   HOWTO (R_PPC64_GOT_TLSLD16_HI,
1685          16,                    /* rightshift */
1686          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1687          16,                    /* bitsize */
1688          FALSE,                 /* pc_relative */
1689          0,                     /* bitpos */
1690          complain_overflow_dont, /* complain_on_overflow */
1691          ppc64_elf_unhandled_reloc, /* special_function */
1692          "R_PPC64_GOT_TLSLD16_HI", /* name */
1693          FALSE,                 /* partial_inplace */
1694          0,                     /* src_mask */
1695          0xffff,                /* dst_mask */
1696          FALSE),                /* pcrel_offset */
1697
1698   /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
1699   HOWTO (R_PPC64_GOT_TLSLD16_HA,
1700          16,                    /* rightshift */
1701          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1702          16,                    /* bitsize */
1703          FALSE,                 /* pc_relative */
1704          0,                     /* bitpos */
1705          complain_overflow_dont, /* complain_on_overflow */
1706          ppc64_elf_unhandled_reloc, /* special_function */
1707          "R_PPC64_GOT_TLSLD16_HA", /* name */
1708          FALSE,                 /* partial_inplace */
1709          0,                     /* src_mask */
1710          0xffff,                /* dst_mask */
1711          FALSE),                /* pcrel_offset */
1712
1713   /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1714      the offset to the entry relative to the TOC base (r2).  */
1715   HOWTO (R_PPC64_GOT_DTPREL16_DS,
1716          0,                     /* rightshift */
1717          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1718          16,                    /* bitsize */
1719          FALSE,                 /* pc_relative */
1720          0,                     /* bitpos */
1721          complain_overflow_signed, /* complain_on_overflow */
1722          ppc64_elf_unhandled_reloc, /* special_function */
1723          "R_PPC64_GOT_DTPREL16_DS", /* name */
1724          FALSE,                 /* partial_inplace */
1725          0,                     /* src_mask */
1726          0xfffc,                /* dst_mask */
1727          FALSE),                /* pcrel_offset */
1728
1729   /* Like GOT_DTPREL16_DS, but no overflow.  */
1730   HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1731          0,                     /* rightshift */
1732          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1733          16,                    /* bitsize */
1734          FALSE,                 /* pc_relative */
1735          0,                     /* bitpos */
1736          complain_overflow_dont, /* complain_on_overflow */
1737          ppc64_elf_unhandled_reloc, /* special_function */
1738          "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1739          FALSE,                 /* partial_inplace */
1740          0,                     /* src_mask */
1741          0xfffc,                /* dst_mask */
1742          FALSE),                /* pcrel_offset */
1743
1744   /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits.  */
1745   HOWTO (R_PPC64_GOT_DTPREL16_HI,
1746          16,                    /* rightshift */
1747          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1748          16,                    /* bitsize */
1749          FALSE,                 /* pc_relative */
1750          0,                     /* bitpos */
1751          complain_overflow_dont, /* complain_on_overflow */
1752          ppc64_elf_unhandled_reloc, /* special_function */
1753          "R_PPC64_GOT_DTPREL16_HI", /* name */
1754          FALSE,                 /* partial_inplace */
1755          0,                     /* src_mask */
1756          0xffff,                /* dst_mask */
1757          FALSE),                /* pcrel_offset */
1758
1759   /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
1760   HOWTO (R_PPC64_GOT_DTPREL16_HA,
1761          16,                    /* rightshift */
1762          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1763          16,                    /* bitsize */
1764          FALSE,                 /* pc_relative */
1765          0,                     /* bitpos */
1766          complain_overflow_dont, /* complain_on_overflow */
1767          ppc64_elf_unhandled_reloc, /* special_function */
1768          "R_PPC64_GOT_DTPREL16_HA", /* name */
1769          FALSE,                 /* partial_inplace */
1770          0,                     /* src_mask */
1771          0xffff,                /* dst_mask */
1772          FALSE),                /* pcrel_offset */
1773
1774   /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1775      offset to the entry relative to the TOC base (r2).  */
1776   HOWTO (R_PPC64_GOT_TPREL16_DS,
1777          0,                     /* rightshift */
1778          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1779          16,                    /* bitsize */
1780          FALSE,                 /* pc_relative */
1781          0,                     /* bitpos */
1782          complain_overflow_signed, /* complain_on_overflow */
1783          ppc64_elf_unhandled_reloc, /* special_function */
1784          "R_PPC64_GOT_TPREL16_DS", /* name */
1785          FALSE,                 /* partial_inplace */
1786          0,                     /* src_mask */
1787          0xfffc,                /* dst_mask */
1788          FALSE),                /* pcrel_offset */
1789
1790   /* Like GOT_TPREL16_DS, but no overflow.  */
1791   HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1792          0,                     /* rightshift */
1793          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1794          16,                    /* bitsize */
1795          FALSE,                 /* pc_relative */
1796          0,                     /* bitpos */
1797          complain_overflow_dont, /* complain_on_overflow */
1798          ppc64_elf_unhandled_reloc, /* special_function */
1799          "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1800          FALSE,                 /* partial_inplace */
1801          0,                     /* src_mask */
1802          0xfffc,                /* dst_mask */
1803          FALSE),                /* pcrel_offset */
1804
1805   /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits.  */
1806   HOWTO (R_PPC64_GOT_TPREL16_HI,
1807          16,                    /* rightshift */
1808          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1809          16,                    /* bitsize */
1810          FALSE,                 /* pc_relative */
1811          0,                     /* bitpos */
1812          complain_overflow_dont, /* complain_on_overflow */
1813          ppc64_elf_unhandled_reloc, /* special_function */
1814          "R_PPC64_GOT_TPREL16_HI", /* name */
1815          FALSE,                 /* partial_inplace */
1816          0,                     /* src_mask */
1817          0xffff,                /* dst_mask */
1818          FALSE),                /* pcrel_offset */
1819
1820   /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
1821   HOWTO (R_PPC64_GOT_TPREL16_HA,
1822          16,                    /* rightshift */
1823          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1824          16,                    /* bitsize */
1825          FALSE,                 /* pc_relative */
1826          0,                     /* bitpos */
1827          complain_overflow_dont, /* complain_on_overflow */
1828          ppc64_elf_unhandled_reloc, /* special_function */
1829          "R_PPC64_GOT_TPREL16_HA", /* name */
1830          FALSE,                 /* partial_inplace */
1831          0,                     /* src_mask */
1832          0xffff,                /* dst_mask */
1833          FALSE),                /* pcrel_offset */
1834
1835   /* GNU extension to record C++ vtable hierarchy.  */
1836   HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
1837          0,                     /* rightshift */
1838          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1839          0,                     /* bitsize */
1840          FALSE,                 /* pc_relative */
1841          0,                     /* bitpos */
1842          complain_overflow_dont, /* complain_on_overflow */
1843          NULL,                  /* special_function */
1844          "R_PPC64_GNU_VTINHERIT", /* name */
1845          FALSE,                 /* partial_inplace */
1846          0,                     /* src_mask */
1847          0,                     /* dst_mask */
1848          FALSE),                /* pcrel_offset */
1849
1850   /* GNU extension to record C++ vtable member usage.  */
1851   HOWTO (R_PPC64_GNU_VTENTRY,   /* type */
1852          0,                     /* rightshift */
1853          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1854          0,                     /* bitsize */
1855          FALSE,                 /* pc_relative */
1856          0,                     /* bitpos */
1857          complain_overflow_dont, /* complain_on_overflow */
1858          NULL,                  /* special_function */
1859          "R_PPC64_GNU_VTENTRY", /* name */
1860          FALSE,                 /* partial_inplace */
1861          0,                     /* src_mask */
1862          0,                     /* dst_mask */
1863          FALSE),                /* pcrel_offset */
1864 };
1865
1866 \f
1867 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
1868    be done.  */
1869
1870 static void
1871 ppc_howto_init (void)
1872 {
1873   unsigned int i, type;
1874
1875   for (i = 0;
1876        i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
1877        i++)
1878     {
1879       type = ppc64_elf_howto_raw[i].type;
1880       BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
1881                           / sizeof (ppc64_elf_howto_table[0])));
1882       ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
1883     }
1884 }
1885
1886 static reloc_howto_type *
1887 ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1888                              bfd_reloc_code_real_type code)
1889 {
1890   enum elf_ppc64_reloc_type r = R_PPC64_NONE;
1891
1892   if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1893     /* Initialize howto table if needed.  */
1894     ppc_howto_init ();
1895
1896   switch (code)
1897     {
1898     default:
1899       return NULL;
1900
1901     case BFD_RELOC_NONE:                        r = R_PPC64_NONE;
1902       break;
1903     case BFD_RELOC_32:                          r = R_PPC64_ADDR32;
1904       break;
1905     case BFD_RELOC_PPC_BA26:                    r = R_PPC64_ADDR24;
1906       break;
1907     case BFD_RELOC_16:                          r = R_PPC64_ADDR16;
1908       break;
1909     case BFD_RELOC_LO16:                        r = R_PPC64_ADDR16_LO;
1910       break;
1911     case BFD_RELOC_HI16:                        r = R_PPC64_ADDR16_HI;
1912       break;
1913     case BFD_RELOC_HI16_S:                      r = R_PPC64_ADDR16_HA;
1914       break;
1915     case BFD_RELOC_PPC_BA16:                    r = R_PPC64_ADDR14;
1916       break;
1917     case BFD_RELOC_PPC_BA16_BRTAKEN:            r = R_PPC64_ADDR14_BRTAKEN;
1918       break;
1919     case BFD_RELOC_PPC_BA16_BRNTAKEN:           r = R_PPC64_ADDR14_BRNTAKEN;
1920       break;
1921     case BFD_RELOC_PPC_B26:                     r = R_PPC64_REL24;
1922       break;
1923     case BFD_RELOC_PPC_B16:                     r = R_PPC64_REL14;
1924       break;
1925     case BFD_RELOC_PPC_B16_BRTAKEN:             r = R_PPC64_REL14_BRTAKEN;
1926       break;
1927     case BFD_RELOC_PPC_B16_BRNTAKEN:            r = R_PPC64_REL14_BRNTAKEN;
1928       break;
1929     case BFD_RELOC_16_GOTOFF:                   r = R_PPC64_GOT16;
1930       break;
1931     case BFD_RELOC_LO16_GOTOFF:                 r = R_PPC64_GOT16_LO;
1932       break;
1933     case BFD_RELOC_HI16_GOTOFF:                 r = R_PPC64_GOT16_HI;
1934       break;
1935     case BFD_RELOC_HI16_S_GOTOFF:               r = R_PPC64_GOT16_HA;
1936       break;
1937     case BFD_RELOC_PPC_COPY:                    r = R_PPC64_COPY;
1938       break;
1939     case BFD_RELOC_PPC_GLOB_DAT:                r = R_PPC64_GLOB_DAT;
1940       break;
1941     case BFD_RELOC_32_PCREL:                    r = R_PPC64_REL32;
1942       break;
1943     case BFD_RELOC_32_PLTOFF:                   r = R_PPC64_PLT32;
1944       break;
1945     case BFD_RELOC_32_PLT_PCREL:                r = R_PPC64_PLTREL32;
1946       break;
1947     case BFD_RELOC_LO16_PLTOFF:                 r = R_PPC64_PLT16_LO;
1948       break;
1949     case BFD_RELOC_HI16_PLTOFF:                 r = R_PPC64_PLT16_HI;
1950       break;
1951     case BFD_RELOC_HI16_S_PLTOFF:               r = R_PPC64_PLT16_HA;
1952       break;
1953     case BFD_RELOC_16_BASEREL:                  r = R_PPC64_SECTOFF;
1954       break;
1955     case BFD_RELOC_LO16_BASEREL:                r = R_PPC64_SECTOFF_LO;
1956       break;
1957     case BFD_RELOC_HI16_BASEREL:                r = R_PPC64_SECTOFF_HI;
1958       break;
1959     case BFD_RELOC_HI16_S_BASEREL:              r = R_PPC64_SECTOFF_HA;
1960       break;
1961     case BFD_RELOC_CTOR:                        r = R_PPC64_ADDR64;
1962       break;
1963     case BFD_RELOC_64:                          r = R_PPC64_ADDR64;
1964       break;
1965     case BFD_RELOC_PPC64_HIGHER:                r = R_PPC64_ADDR16_HIGHER;
1966       break;
1967     case BFD_RELOC_PPC64_HIGHER_S:              r = R_PPC64_ADDR16_HIGHERA;
1968       break;
1969     case BFD_RELOC_PPC64_HIGHEST:               r = R_PPC64_ADDR16_HIGHEST;
1970       break;
1971     case BFD_RELOC_PPC64_HIGHEST_S:             r = R_PPC64_ADDR16_HIGHESTA;
1972       break;
1973     case BFD_RELOC_64_PCREL:                    r = R_PPC64_REL64;
1974       break;
1975     case BFD_RELOC_64_PLTOFF:                   r = R_PPC64_PLT64;
1976       break;
1977     case BFD_RELOC_64_PLT_PCREL:                r = R_PPC64_PLTREL64;
1978       break;
1979     case BFD_RELOC_PPC_TOC16:                   r = R_PPC64_TOC16;
1980       break;
1981     case BFD_RELOC_PPC64_TOC16_LO:              r = R_PPC64_TOC16_LO;
1982       break;
1983     case BFD_RELOC_PPC64_TOC16_HI:              r = R_PPC64_TOC16_HI;
1984       break;
1985     case BFD_RELOC_PPC64_TOC16_HA:              r = R_PPC64_TOC16_HA;
1986       break;
1987     case BFD_RELOC_PPC64_TOC:                   r = R_PPC64_TOC;
1988       break;
1989     case BFD_RELOC_PPC64_PLTGOT16:              r = R_PPC64_PLTGOT16;
1990       break;
1991     case BFD_RELOC_PPC64_PLTGOT16_LO:           r = R_PPC64_PLTGOT16_LO;
1992       break;
1993     case BFD_RELOC_PPC64_PLTGOT16_HI:           r = R_PPC64_PLTGOT16_HI;
1994       break;
1995     case BFD_RELOC_PPC64_PLTGOT16_HA:           r = R_PPC64_PLTGOT16_HA;
1996       break;
1997     case BFD_RELOC_PPC64_ADDR16_DS:             r = R_PPC64_ADDR16_DS;
1998       break;
1999     case BFD_RELOC_PPC64_ADDR16_LO_DS:          r = R_PPC64_ADDR16_LO_DS;
2000       break;
2001     case BFD_RELOC_PPC64_GOT16_DS:              r = R_PPC64_GOT16_DS;
2002       break;
2003     case BFD_RELOC_PPC64_GOT16_LO_DS:           r = R_PPC64_GOT16_LO_DS;
2004       break;
2005     case BFD_RELOC_PPC64_PLT16_LO_DS:           r = R_PPC64_PLT16_LO_DS;
2006       break;
2007     case BFD_RELOC_PPC64_SECTOFF_DS:            r = R_PPC64_SECTOFF_DS;
2008       break;
2009     case BFD_RELOC_PPC64_SECTOFF_LO_DS:         r = R_PPC64_SECTOFF_LO_DS;
2010       break;
2011     case BFD_RELOC_PPC64_TOC16_DS:              r = R_PPC64_TOC16_DS;
2012       break;
2013     case BFD_RELOC_PPC64_TOC16_LO_DS:           r = R_PPC64_TOC16_LO_DS;
2014       break;
2015     case BFD_RELOC_PPC64_PLTGOT16_DS:           r = R_PPC64_PLTGOT16_DS;
2016       break;
2017     case BFD_RELOC_PPC64_PLTGOT16_LO_DS:        r = R_PPC64_PLTGOT16_LO_DS;
2018       break;
2019     case BFD_RELOC_PPC_TLS:                     r = R_PPC64_TLS;
2020       break;
2021     case BFD_RELOC_PPC_DTPMOD:                  r = R_PPC64_DTPMOD64;
2022       break;
2023     case BFD_RELOC_PPC_TPREL16:                 r = R_PPC64_TPREL16;
2024       break;
2025     case BFD_RELOC_PPC_TPREL16_LO:              r = R_PPC64_TPREL16_LO;
2026       break;
2027     case BFD_RELOC_PPC_TPREL16_HI:              r = R_PPC64_TPREL16_HI;
2028       break;
2029     case BFD_RELOC_PPC_TPREL16_HA:              r = R_PPC64_TPREL16_HA;
2030       break;
2031     case BFD_RELOC_PPC_TPREL:                   r = R_PPC64_TPREL64;
2032       break;
2033     case BFD_RELOC_PPC_DTPREL16:                r = R_PPC64_DTPREL16;
2034       break;
2035     case BFD_RELOC_PPC_DTPREL16_LO:             r = R_PPC64_DTPREL16_LO;
2036       break;
2037     case BFD_RELOC_PPC_DTPREL16_HI:             r = R_PPC64_DTPREL16_HI;
2038       break;
2039     case BFD_RELOC_PPC_DTPREL16_HA:             r = R_PPC64_DTPREL16_HA;
2040       break;
2041     case BFD_RELOC_PPC_DTPREL:                  r = R_PPC64_DTPREL64;
2042       break;
2043     case BFD_RELOC_PPC_GOT_TLSGD16:             r = R_PPC64_GOT_TLSGD16;
2044       break;
2045     case BFD_RELOC_PPC_GOT_TLSGD16_LO:          r = R_PPC64_GOT_TLSGD16_LO;
2046       break;
2047     case BFD_RELOC_PPC_GOT_TLSGD16_HI:          r = R_PPC64_GOT_TLSGD16_HI;
2048       break;
2049     case BFD_RELOC_PPC_GOT_TLSGD16_HA:          r = R_PPC64_GOT_TLSGD16_HA;
2050       break;
2051     case BFD_RELOC_PPC_GOT_TLSLD16:             r = R_PPC64_GOT_TLSLD16;
2052       break;
2053     case BFD_RELOC_PPC_GOT_TLSLD16_LO:          r = R_PPC64_GOT_TLSLD16_LO;
2054       break;
2055     case BFD_RELOC_PPC_GOT_TLSLD16_HI:          r = R_PPC64_GOT_TLSLD16_HI;
2056       break;
2057     case BFD_RELOC_PPC_GOT_TLSLD16_HA:          r = R_PPC64_GOT_TLSLD16_HA;
2058       break;
2059     case BFD_RELOC_PPC_GOT_TPREL16:             r = R_PPC64_GOT_TPREL16_DS;
2060       break;
2061     case BFD_RELOC_PPC_GOT_TPREL16_LO:          r = R_PPC64_GOT_TPREL16_LO_DS;
2062       break;
2063     case BFD_RELOC_PPC_GOT_TPREL16_HI:          r = R_PPC64_GOT_TPREL16_HI;
2064       break;
2065     case BFD_RELOC_PPC_GOT_TPREL16_HA:          r = R_PPC64_GOT_TPREL16_HA;
2066       break;
2067     case BFD_RELOC_PPC_GOT_DTPREL16:            r = R_PPC64_GOT_DTPREL16_DS;
2068       break;
2069     case BFD_RELOC_PPC_GOT_DTPREL16_LO:         r = R_PPC64_GOT_DTPREL16_LO_DS;
2070       break;
2071     case BFD_RELOC_PPC_GOT_DTPREL16_HI:         r = R_PPC64_GOT_DTPREL16_HI;
2072       break;
2073     case BFD_RELOC_PPC_GOT_DTPREL16_HA:         r = R_PPC64_GOT_DTPREL16_HA;
2074       break;
2075     case BFD_RELOC_PPC64_TPREL16_DS:            r = R_PPC64_TPREL16_DS;
2076       break;
2077     case BFD_RELOC_PPC64_TPREL16_LO_DS:         r = R_PPC64_TPREL16_LO_DS;
2078       break;
2079     case BFD_RELOC_PPC64_TPREL16_HIGHER:        r = R_PPC64_TPREL16_HIGHER;
2080       break;
2081     case BFD_RELOC_PPC64_TPREL16_HIGHERA:       r = R_PPC64_TPREL16_HIGHERA;
2082       break;
2083     case BFD_RELOC_PPC64_TPREL16_HIGHEST:       r = R_PPC64_TPREL16_HIGHEST;
2084       break;
2085     case BFD_RELOC_PPC64_TPREL16_HIGHESTA:      r = R_PPC64_TPREL16_HIGHESTA;
2086       break;
2087     case BFD_RELOC_PPC64_DTPREL16_DS:           r = R_PPC64_DTPREL16_DS;
2088       break;
2089     case BFD_RELOC_PPC64_DTPREL16_LO_DS:        r = R_PPC64_DTPREL16_LO_DS;
2090       break;
2091     case BFD_RELOC_PPC64_DTPREL16_HIGHER:       r = R_PPC64_DTPREL16_HIGHER;
2092       break;
2093     case BFD_RELOC_PPC64_DTPREL16_HIGHERA:      r = R_PPC64_DTPREL16_HIGHERA;
2094       break;
2095     case BFD_RELOC_PPC64_DTPREL16_HIGHEST:      r = R_PPC64_DTPREL16_HIGHEST;
2096       break;
2097     case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:     r = R_PPC64_DTPREL16_HIGHESTA;
2098       break;
2099     case BFD_RELOC_VTABLE_INHERIT:              r = R_PPC64_GNU_VTINHERIT;
2100       break;
2101     case BFD_RELOC_VTABLE_ENTRY:                r = R_PPC64_GNU_VTENTRY;
2102       break;
2103     }
2104
2105   return ppc64_elf_howto_table[r];
2106 };
2107
2108 /* Set the howto pointer for a PowerPC ELF reloc.  */
2109
2110 static void
2111 ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2112                          Elf_Internal_Rela *dst)
2113 {
2114   unsigned int type;
2115
2116   /* Initialize howto table if needed.  */
2117   if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2118     ppc_howto_init ();
2119
2120   type = ELF64_R_TYPE (dst->r_info);
2121   BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
2122                       / sizeof (ppc64_elf_howto_table[0])));
2123   cache_ptr->howto = ppc64_elf_howto_table[type];
2124 }
2125
2126 /* Handle the R_PPC64_ADDR16_HA and similar relocs.  */
2127
2128 static bfd_reloc_status_type
2129 ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2130                     void *data, asection *input_section,
2131                     bfd *output_bfd, char **error_message)
2132 {
2133   /* If this is a relocatable link (output_bfd test tells us), just
2134      call the generic function.  Any adjustment will be done at final
2135      link time.  */
2136   if (output_bfd != NULL)
2137     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2138                                   input_section, output_bfd, error_message);
2139
2140   /* Adjust the addend for sign extension of the low 16 bits.
2141      We won't actually be using the low 16 bits, so trashing them
2142      doesn't matter.  */
2143   reloc_entry->addend += 0x8000;
2144   return bfd_reloc_continue;
2145 }
2146
2147 static bfd_reloc_status_type
2148 ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2149                         void *data, asection *input_section,
2150                         bfd *output_bfd, char **error_message)
2151 {
2152   if (output_bfd != NULL)
2153     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2154                                   input_section, output_bfd, error_message);
2155
2156   if (strcmp (symbol->section->name, ".opd") == 0
2157       && (symbol->section->owner->flags & DYNAMIC) == 0)
2158     {
2159       bfd_vma dest = opd_entry_value (symbol->section,
2160                                       symbol->value + reloc_entry->addend,
2161                                       NULL, NULL);
2162       if (dest != (bfd_vma) -1)
2163         reloc_entry->addend = dest - (symbol->value
2164                                       + symbol->section->output_section->vma
2165                                       + symbol->section->output_offset);
2166     }
2167   return bfd_reloc_continue;
2168 }
2169
2170 static bfd_reloc_status_type
2171 ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2172                          void *data, asection *input_section,
2173                          bfd *output_bfd, char **error_message)
2174 {
2175   long insn;
2176   enum elf_ppc64_reloc_type r_type;
2177   bfd_size_type octets;
2178   /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
2179   bfd_boolean is_power4 = FALSE;
2180
2181   /* If this is a relocatable link (output_bfd test tells us), just
2182      call the generic function.  Any adjustment will be done at final
2183      link time.  */
2184   if (output_bfd != NULL)
2185     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2186                                   input_section, output_bfd, error_message);
2187
2188   octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2189   insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2190   insn &= ~(0x01 << 21);
2191   r_type = reloc_entry->howto->type;
2192   if (r_type == R_PPC64_ADDR14_BRTAKEN
2193       || r_type == R_PPC64_REL14_BRTAKEN)
2194     insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
2195
2196   if (is_power4)
2197     {
2198       /* Set 'a' bit.  This is 0b00010 in BO field for branch
2199          on CR(BI) insns (BO == 001at or 011at), and 0b01000
2200          for branch on CTR insns (BO == 1a00t or 1a01t).  */
2201       if ((insn & (0x14 << 21)) == (0x04 << 21))
2202         insn |= 0x02 << 21;
2203       else if ((insn & (0x14 << 21)) == (0x10 << 21))
2204         insn |= 0x08 << 21;
2205       else
2206         goto out;
2207     }
2208   else
2209     {
2210       bfd_vma target = 0;
2211       bfd_vma from;
2212
2213       if (!bfd_is_com_section (symbol->section))
2214         target = symbol->value;
2215       target += symbol->section->output_section->vma;
2216       target += symbol->section->output_offset;
2217       target += reloc_entry->addend;
2218
2219       from = (reloc_entry->address
2220               + input_section->output_offset
2221               + input_section->output_section->vma);
2222
2223       /* Invert 'y' bit if not the default.  */
2224       if ((bfd_signed_vma) (target - from) < 0)
2225         insn ^= 0x01 << 21;
2226     }
2227   bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2228  out:
2229   return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2230                                  input_section, output_bfd, error_message);
2231 }
2232
2233 static bfd_reloc_status_type
2234 ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2235                          void *data, asection *input_section,
2236                          bfd *output_bfd, char **error_message)
2237 {
2238   /* If this is a relocatable link (output_bfd test tells us), just
2239      call the generic function.  Any adjustment will be done at final
2240      link time.  */
2241   if (output_bfd != NULL)
2242     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2243                                   input_section, output_bfd, error_message);
2244
2245   /* Subtract the symbol section base address.  */
2246   reloc_entry->addend -= symbol->section->output_section->vma;
2247   return bfd_reloc_continue;
2248 }
2249
2250 static bfd_reloc_status_type
2251 ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2252                             void *data, asection *input_section,
2253                             bfd *output_bfd, char **error_message)
2254 {
2255   /* If this is a relocatable link (output_bfd test tells us), just
2256      call the generic function.  Any adjustment will be done at final
2257      link time.  */
2258   if (output_bfd != NULL)
2259     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2260                                   input_section, output_bfd, error_message);
2261
2262   /* Subtract the symbol section base address.  */
2263   reloc_entry->addend -= symbol->section->output_section->vma;
2264
2265   /* Adjust the addend for sign extension of the low 16 bits.  */
2266   reloc_entry->addend += 0x8000;
2267   return bfd_reloc_continue;
2268 }
2269
2270 static bfd_reloc_status_type
2271 ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2272                      void *data, asection *input_section,
2273                      bfd *output_bfd, char **error_message)
2274 {
2275   bfd_vma TOCstart;
2276
2277   /* If this is a relocatable link (output_bfd test tells us), just
2278      call the generic function.  Any adjustment will be done at final
2279      link time.  */
2280   if (output_bfd != NULL)
2281     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2282                                   input_section, output_bfd, error_message);
2283
2284   TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2285   if (TOCstart == 0)
2286     TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2287
2288   /* Subtract the TOC base address.  */
2289   reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2290   return bfd_reloc_continue;
2291 }
2292
2293 static bfd_reloc_status_type
2294 ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2295                         void *data, asection *input_section,
2296                         bfd *output_bfd, char **error_message)
2297 {
2298   bfd_vma TOCstart;
2299
2300   /* If this is a relocatable link (output_bfd test tells us), just
2301      call the generic function.  Any adjustment will be done at final
2302      link time.  */
2303   if (output_bfd != NULL)
2304     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2305                                   input_section, output_bfd, error_message);
2306
2307   TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2308   if (TOCstart == 0)
2309     TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2310
2311   /* Subtract the TOC base address.  */
2312   reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2313
2314   /* Adjust the addend for sign extension of the low 16 bits.  */
2315   reloc_entry->addend += 0x8000;
2316   return bfd_reloc_continue;
2317 }
2318
2319 static bfd_reloc_status_type
2320 ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2321                        void *data, asection *input_section,
2322                        bfd *output_bfd, char **error_message)
2323 {
2324   bfd_vma TOCstart;
2325   bfd_size_type octets;
2326
2327   /* If this is a relocatable link (output_bfd test tells us), just
2328      call the generic function.  Any adjustment will be done at final
2329      link time.  */
2330   if (output_bfd != NULL)
2331     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2332                                   input_section, output_bfd, error_message);
2333
2334   TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2335   if (TOCstart == 0)
2336     TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2337
2338   octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2339   bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2340   return bfd_reloc_ok;
2341 }
2342
2343 static bfd_reloc_status_type
2344 ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2345                            void *data, asection *input_section,
2346                            bfd *output_bfd, char **error_message)
2347 {
2348   /* If this is a relocatable link (output_bfd test tells us), just
2349      call the generic function.  Any adjustment will be done at final
2350      link time.  */
2351   if (output_bfd != NULL)
2352     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2353                                   input_section, output_bfd, error_message);
2354
2355   if (error_message != NULL)
2356     {
2357       static char buf[60];
2358       sprintf (buf, "generic linker can't handle %s",
2359                reloc_entry->howto->name);
2360       *error_message = buf;
2361     }
2362   return bfd_reloc_dangerous;
2363 }
2364
2365 struct ppc64_elf_obj_tdata
2366 {
2367   struct elf_obj_tdata elf;
2368
2369   /* Shortcuts to dynamic linker sections.  */
2370   asection *got;
2371   asection *relgot;
2372
2373   /* Used during garbage collection.  We attach global symbols defined
2374      on removed .opd entries to this section so that the sym is removed.  */
2375   asection *deleted_section;
2376
2377   /* TLS local dynamic got entry handling.  Suppose for multiple GOT
2378      sections means we potentially need one of these for each input bfd.  */
2379   union {
2380     bfd_signed_vma refcount;
2381     bfd_vma offset;
2382   } tlsld_got;
2383 };
2384
2385 #define ppc64_elf_tdata(bfd) \
2386   ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2387
2388 #define ppc64_tlsld_got(bfd) \
2389   (&ppc64_elf_tdata (bfd)->tlsld_got)
2390
2391 /* Override the generic function because we store some extras.  */
2392
2393 static bfd_boolean
2394 ppc64_elf_mkobject (bfd *abfd)
2395 {
2396   bfd_size_type amt = sizeof (struct ppc64_elf_obj_tdata);
2397   abfd->tdata.any = bfd_zalloc (abfd, amt);
2398   if (abfd->tdata.any == NULL)
2399     return FALSE;
2400   return TRUE;
2401 }
2402
2403 static bfd_boolean
2404 is_ppc64_target (const struct bfd_target *targ)
2405 {
2406   extern const bfd_target bfd_elf64_powerpc_vec;
2407   extern const bfd_target bfd_elf64_powerpcle_vec;
2408
2409   return targ == &bfd_elf64_powerpc_vec || targ == &bfd_elf64_powerpcle_vec;
2410 }
2411
2412 /* Fix bad default arch selected for a 64 bit input bfd when the
2413    default is 32 bit.  */
2414
2415 static bfd_boolean
2416 ppc64_elf_object_p (bfd *abfd)
2417 {
2418   if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2419     {
2420       Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2421
2422       if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2423         {
2424           /* Relies on arch after 32 bit default being 64 bit default.  */
2425           abfd->arch_info = abfd->arch_info->next;
2426           BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2427         }
2428     }
2429   return TRUE;
2430 }
2431
2432 /* Support for core dump NOTE sections.  */
2433
2434 static bfd_boolean
2435 ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2436 {
2437   size_t offset, size;
2438
2439   if (note->descsz != 504)
2440     return FALSE;
2441
2442   /* pr_cursig */
2443   elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2444
2445   /* pr_pid */
2446   elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32);
2447
2448   /* pr_reg */
2449   offset = 112;
2450   size = 384;
2451
2452   /* Make a ".reg/999" section.  */
2453   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2454                                           size, note->descpos + offset);
2455 }
2456
2457 static bfd_boolean
2458 ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2459 {
2460   if (note->descsz != 136)
2461     return FALSE;
2462
2463   elf_tdata (abfd)->core_program
2464     = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2465   elf_tdata (abfd)->core_command
2466     = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2467
2468   return TRUE;
2469 }
2470
2471 /* Merge backend specific data from an object file to the output
2472    object file when linking.  */
2473
2474 static bfd_boolean
2475 ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2476 {
2477   /* Check if we have the same endianess.  */
2478   if (ibfd->xvec->byteorder != obfd->xvec->byteorder
2479       && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
2480       && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2481     {
2482       const char *msg;
2483
2484       if (bfd_big_endian (ibfd))
2485         msg = _("%B: compiled for a big endian system "
2486                 "and target is little endian");
2487       else
2488         msg = _("%B: compiled for a little endian system "
2489                 "and target is big endian");
2490
2491       (*_bfd_error_handler) (msg, ibfd);
2492
2493       bfd_set_error (bfd_error_wrong_format);
2494       return FALSE;
2495     }
2496
2497   return TRUE;
2498 }
2499
2500 /* Add extra PPC sections.  */
2501
2502 static struct bfd_elf_special_section const ppc64_elf_special_sections[]=
2503 {
2504   { ".sdata",   6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2505   { ".sbss",    5, -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2506   { ".plt",     4,  0, SHT_NOBITS,   0 },
2507   { ".toc",     4,  0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2508   { ".toc1",    5,  0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2509   { ".tocbss",  7,  0, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2510   { NULL,       0,  0, 0,            0 }
2511 };
2512
2513 struct _ppc64_elf_section_data
2514 {
2515   struct bfd_elf_section_data elf;
2516
2517   /* An array with one entry for each opd function descriptor.  */
2518   union
2519   {
2520     /* Points to the function code section for local opd entries.  */
2521     asection **func_sec;
2522     /* After editing .opd, adjust references to opd local syms.  */
2523     long *adjust;
2524   } opd;
2525
2526   /* An array for toc sections, indexed by offset/8.
2527      Specifies the relocation symbol index used at a given toc offset.  */
2528   unsigned *t_symndx;
2529 };
2530
2531 #define ppc64_elf_section_data(sec) \
2532   ((struct _ppc64_elf_section_data *) elf_section_data (sec))
2533
2534 static bfd_boolean
2535 ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
2536 {
2537   struct _ppc64_elf_section_data *sdata;
2538   bfd_size_type amt = sizeof (*sdata);
2539
2540   sdata = bfd_zalloc (abfd, amt);
2541   if (sdata == NULL)
2542     return FALSE;
2543   sec->used_by_bfd = sdata;
2544
2545   return _bfd_elf_new_section_hook (abfd, sec);
2546 }
2547
2548 static void *
2549 get_opd_info (asection * sec)
2550 {
2551   if (sec != NULL
2552       && ppc64_elf_section_data (sec) != NULL
2553       && ppc64_elf_section_data (sec)->opd.adjust != NULL)
2554     return ppc64_elf_section_data (sec)->opd.adjust;
2555   return NULL;
2556 }
2557 \f
2558 /* Parameters for the qsort hook.  */
2559 static asection *synthetic_opd;
2560 static bfd_boolean synthetic_relocatable;
2561
2562 /* qsort comparison function for ppc64_elf_get_synthetic_symtab.  */
2563
2564 static int
2565 compare_symbols (const void *ap, const void *bp)
2566 {
2567   const asymbol *a = * (const asymbol **) ap;
2568   const asymbol *b = * (const asymbol **) bp;
2569
2570   /* Section symbols first.  */
2571   if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
2572     return -1;
2573   if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
2574     return 1;
2575
2576   /* then .opd symbols.  */
2577   if (a->section == synthetic_opd && b->section != synthetic_opd)
2578     return -1;
2579   if (a->section != synthetic_opd && b->section == synthetic_opd)
2580     return 1;
2581
2582   /* then other code symbols.  */
2583   if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2584       == (SEC_CODE | SEC_ALLOC)
2585       && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2586          != (SEC_CODE | SEC_ALLOC))
2587     return -1;
2588
2589   if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2590       != (SEC_CODE | SEC_ALLOC)
2591       && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2592          == (SEC_CODE | SEC_ALLOC))
2593     return 1;
2594
2595   if (synthetic_relocatable)
2596     {
2597       if (a->section->id < b->section->id)
2598         return -1;
2599
2600       if (a->section->id > b->section->id)
2601         return 1;
2602     }
2603
2604   if (a->value + a->section->vma < b->value + b->section->vma)
2605     return -1;
2606
2607   if (a->value + a->section->vma > b->value + b->section->vma)
2608     return 1;
2609
2610   return 0;
2611 }
2612
2613 /* Search SYMS for a symbol of the given VALUE.  */
2614
2615 static asymbol *
2616 sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
2617 {
2618   long mid;
2619
2620   if (id == -1)
2621     {
2622       while (lo < hi)
2623         {
2624           mid = (lo + hi) >> 1;
2625           if (syms[mid]->value + syms[mid]->section->vma < value)
2626             lo = mid + 1;
2627           else if (syms[mid]->value + syms[mid]->section->vma > value)
2628             hi = mid;
2629           else
2630             return syms[mid];
2631         }
2632     }
2633   else
2634     {
2635       while (lo < hi)
2636         {
2637           mid = (lo + hi) >> 1;
2638           if (syms[mid]->section->id < id)
2639             lo = mid + 1;
2640           else if (syms[mid]->section->id > id)
2641             hi = mid;
2642           else if (syms[mid]->value < value)
2643             lo = mid + 1;
2644           else if (syms[mid]->value > value)
2645             hi = mid;
2646           else
2647             return syms[mid];
2648         }
2649     }
2650   return NULL;
2651 }
2652
2653 /* Create synthetic symbols, effectively restoring "dot-symbol" function
2654    entry syms.  */
2655
2656 static long
2657 ppc64_elf_get_synthetic_symtab (bfd *abfd,
2658                                 long static_count, asymbol **static_syms,
2659                                 long dyn_count, asymbol **dyn_syms,
2660                                 asymbol **ret)
2661 {
2662   asymbol *s;
2663   long i;
2664   long count;
2665   char *names;
2666   long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
2667   asection *opd;
2668   bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2669   asymbol **syms;
2670
2671   *ret = NULL;
2672
2673   opd = bfd_get_section_by_name (abfd, ".opd");
2674   if (opd == NULL)
2675     return 0;
2676
2677   symcount = static_count;
2678   if (!relocatable)
2679     symcount += dyn_count;
2680   if (symcount == 0)
2681     return 0;
2682
2683   syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
2684   if (syms == NULL)
2685     return 0;
2686
2687   if (!relocatable && static_count != 0 && dyn_count != 0)
2688     {
2689       /* Use both symbol tables.  */
2690       memcpy (syms, static_syms, static_count * sizeof (*syms));
2691       memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
2692     }
2693   else if (!relocatable && static_count == 0)
2694     memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
2695   else
2696     memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
2697
2698   synthetic_opd = opd;
2699   synthetic_relocatable = relocatable;
2700   qsort (syms, symcount, sizeof (*syms), compare_symbols);
2701
2702   if (!relocatable && symcount > 1)
2703     {
2704       long j;
2705       /* Trim duplicate syms, since we may have merged the normal and
2706          dynamic symbols.  Actually, we only care about syms that have
2707          different values, so trim any with the same value.  */ 
2708       for (i = 1, j = 1; i < symcount; ++i)
2709         if (syms[i - 1]->value + syms[i - 1]->section->vma
2710             != syms[i]->value + syms[i]->section->vma)
2711           syms[j++] = syms[i];
2712       symcount = j;
2713     }
2714
2715   i = 0;
2716   if (syms[i]->section == opd)
2717     ++i;
2718   codesecsym = i;
2719
2720   for (; i < symcount; ++i)
2721     if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2722          != (SEC_CODE | SEC_ALLOC))
2723         || (syms[i]->flags & BSF_SECTION_SYM) == 0)
2724       break;
2725   codesecsymend = i;
2726
2727   for (; i < symcount; ++i)
2728     if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
2729       break;
2730   secsymend = i;
2731
2732   for (; i < symcount; ++i)
2733     if (syms[i]->section != opd)
2734       break;
2735   opdsymend = i;
2736
2737   for (; i < symcount; ++i)
2738     if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2739         != (SEC_CODE | SEC_ALLOC))
2740       break;
2741   symcount = i;
2742
2743   count = 0;
2744   if (opdsymend == secsymend)
2745     goto done;
2746
2747   if (relocatable)
2748     {
2749       bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2750       arelent *r;
2751       size_t size;
2752       long relcount;
2753
2754       slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
2755       relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
2756
2757       if (! relcount
2758           || ! (*slurp_relocs) (abfd, opd, static_syms, FALSE))
2759         goto done;
2760
2761       size = 0;
2762       for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
2763         {
2764           asymbol *sym;
2765
2766           while (r < opd->relocation + relcount
2767                  && r->address < syms[i]->value + opd->vma)
2768             ++r;
2769
2770           if (r == opd->relocation + relcount)
2771             break;
2772
2773           if (r->address != syms[i]->value + opd->vma)
2774             continue;
2775
2776           if (r->howto->type != R_PPC64_ADDR64)
2777             continue;
2778
2779           sym = *r->sym_ptr_ptr;
2780           if (!sym_exists_at (syms, opdsymend, symcount,
2781                               sym->section->id, sym->value + r->addend))
2782             {
2783               ++count;
2784               size += sizeof (asymbol);
2785               size += strlen (syms[i]->name) + 2;
2786             }
2787         }
2788
2789       s = *ret = bfd_malloc (size);
2790       if (s == NULL)
2791         {
2792           count = 0;
2793           goto done;
2794         }
2795
2796       names = (char *) (s + count);
2797
2798       for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
2799         {
2800           asymbol *sym;
2801
2802           while (r < opd->relocation + relcount
2803                  && r->address < syms[i]->value + opd->vma)
2804             ++r;
2805
2806           if (r == opd->relocation + relcount)
2807             break;
2808
2809           if (r->address != syms[i]->value + opd->vma)
2810             continue;
2811
2812           if (r->howto->type != R_PPC64_ADDR64)
2813             continue;
2814
2815           sym = *r->sym_ptr_ptr;
2816           if (!sym_exists_at (syms, opdsymend, symcount,
2817                               sym->section->id, sym->value + r->addend))
2818             {
2819               size_t len;
2820
2821               *s = *syms[i];
2822               s->section = sym->section;
2823               s->value = sym->value + r->addend;
2824               s->name = names;
2825               *names++ = '.';
2826               len = strlen (syms[i]->name);
2827               memcpy (names, syms[i]->name, len + 1);
2828               names += len + 1;
2829               s++;
2830             }
2831         }
2832     }
2833   else
2834     {
2835       bfd_byte *contents;
2836       size_t size;
2837
2838       if (!bfd_malloc_and_get_section (abfd, opd, &contents))
2839         {
2840           if (contents)
2841             {
2842             free_contents_and_exit:
2843               free (contents);
2844             }
2845           goto done;
2846         }
2847
2848       size = 0;
2849       for (i = secsymend; i < opdsymend; ++i)
2850         {
2851           bfd_vma ent;
2852
2853           ent = bfd_get_64 (abfd, contents + syms[i]->value);
2854           if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2855             {
2856               ++count;
2857               size += sizeof (asymbol);
2858               size += strlen (syms[i]->name) + 2;
2859             }
2860         }
2861
2862       s = *ret = bfd_malloc (size);
2863       if (s == NULL)
2864         {
2865           count = 0;
2866           goto free_contents_and_exit;
2867         }
2868
2869       names = (char *) (s + count);
2870
2871       for (i = secsymend; i < opdsymend; ++i)
2872         {
2873           bfd_vma ent;
2874
2875           ent = bfd_get_64 (abfd, contents + syms[i]->value);
2876           if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2877             {
2878               long lo, hi;
2879               size_t len;
2880               asection *sec = abfd->sections;
2881
2882               *s = *syms[i];
2883               lo = codesecsym;
2884               hi = codesecsymend;
2885               while (lo < hi)
2886                 {
2887                   long mid = (lo + hi) >> 1;
2888                   if (syms[mid]->section->vma < ent)
2889                     lo = mid + 1;
2890                   else if (syms[mid]->section->vma > ent)
2891                     hi = mid;
2892                   else
2893                     {
2894                       sec = syms[mid]->section;
2895                       break;
2896                     }
2897                 }
2898
2899               if (lo >= hi && lo > codesecsym)
2900                 sec = syms[lo - 1]->section;
2901
2902               for (; sec != NULL; sec = sec->next)
2903                 {
2904                   if (sec->vma > ent)
2905                     break;
2906                   if ((sec->flags & SEC_ALLOC) == 0
2907                       || (sec->flags & SEC_LOAD) == 0)
2908                     break;
2909                   if ((sec->flags & SEC_CODE) != 0)
2910                     s->section = sec;
2911                 }
2912               s->value = ent - s->section->vma;
2913               s->name = names;
2914               *names++ = '.';
2915               len = strlen (syms[i]->name);
2916               memcpy (names, syms[i]->name, len + 1);
2917               names += len + 1;
2918               s++;
2919             }
2920         }
2921       free (contents);
2922     }
2923
2924  done:
2925   free (syms);
2926   return count;
2927 }
2928 \f
2929 /* The following functions are specific to the ELF linker, while
2930    functions above are used generally.  Those named ppc64_elf_* are
2931    called by the main ELF linker code.  They appear in this file more
2932    or less in the order in which they are called.  eg.
2933    ppc64_elf_check_relocs is called early in the link process,
2934    ppc64_elf_finish_dynamic_sections is one of the last functions
2935    called.
2936
2937    PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
2938    functions have both a function code symbol and a function descriptor
2939    symbol.  A call to foo in a relocatable object file looks like:
2940
2941    .            .text
2942    .    x:
2943    .            bl      .foo
2944    .            nop
2945
2946    The function definition in another object file might be:
2947
2948    .            .section .opd
2949    .    foo:    .quad   .foo
2950    .            .quad   .TOC.@tocbase
2951    .            .quad   0
2952    .
2953    .            .text
2954    .    .foo:   blr
2955
2956    When the linker resolves the call during a static link, the branch
2957    unsurprisingly just goes to .foo and the .opd information is unused.
2958    If the function definition is in a shared library, things are a little
2959    different:  The call goes via a plt call stub, the opd information gets
2960    copied to the plt, and the linker patches the nop.
2961
2962    .    x:
2963    .            bl      .foo_stub
2964    .            ld      2,40(1)
2965    .
2966    .
2967    .    .foo_stub:
2968    .            addis   12,2,Lfoo@toc@ha        # in practice, the call stub
2969    .            addi    12,12,Lfoo@toc@l        # is slightly optimized, but
2970    .            std     2,40(1)                 # this is the general idea
2971    .            ld      11,0(12)
2972    .            ld      2,8(12)
2973    .            mtctr   11
2974    .            ld      11,16(12)
2975    .            bctr
2976    .
2977    .            .section .plt
2978    .    Lfoo:   reloc (R_PPC64_JMP_SLOT, foo)
2979
2980    The "reloc ()" notation is supposed to indicate that the linker emits
2981    an R_PPC64_JMP_SLOT reloc against foo.  The dynamic linker does the opd
2982    copying.
2983
2984    What are the difficulties here?  Well, firstly, the relocations
2985    examined by the linker in check_relocs are against the function code
2986    sym .foo, while the dynamic relocation in the plt is emitted against
2987    the function descriptor symbol, foo.  Somewhere along the line, we need
2988    to carefully copy dynamic link information from one symbol to the other.
2989    Secondly, the generic part of the elf linker will make .foo a dynamic
2990    symbol as is normal for most other backends.  We need foo dynamic
2991    instead, at least for an application final link.  However, when
2992    creating a shared library containing foo, we need to have both symbols
2993    dynamic so that references to .foo are satisfied during the early
2994    stages of linking.  Otherwise the linker might decide to pull in a
2995    definition from some other object, eg. a static library.
2996
2997    Update: As of August 2004, we support a new convention.  Function
2998    calls may use the function descriptor symbol, ie. "bl foo".  This
2999    behaves exactly as "bl .foo".  */
3000
3001 /* The linker needs to keep track of the number of relocs that it
3002    decides to copy as dynamic relocs in check_relocs for each symbol.
3003    This is so that it can later discard them if they are found to be
3004    unnecessary.  We store the information in a field extending the
3005    regular ELF linker hash table.  */
3006
3007 struct ppc_dyn_relocs
3008 {
3009   struct ppc_dyn_relocs *next;
3010
3011   /* The input section of the reloc.  */
3012   asection *sec;
3013
3014   /* Total number of relocs copied for the input section.  */
3015   bfd_size_type count;
3016
3017   /* Number of pc-relative relocs copied for the input section.  */
3018   bfd_size_type pc_count;
3019 };
3020
3021 /* Track GOT entries needed for a given symbol.  We might need more
3022    than one got entry per symbol.  */
3023 struct got_entry
3024 {
3025   struct got_entry *next;
3026
3027   /* The symbol addend that we'll be placing in the GOT.  */
3028   bfd_vma addend;
3029
3030   /* Unlike other ELF targets, we use separate GOT entries for the same
3031      symbol referenced from different input files.  This is to support
3032      automatic multiple TOC/GOT sections, where the TOC base can vary
3033      from one input file to another.
3034
3035      Point to the BFD owning this GOT entry.  */
3036   bfd *owner;
3037
3038   /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
3039      TLS_TPREL or TLS_DTPREL for tls entries.  */
3040   char tls_type;
3041
3042   /* Reference count until size_dynamic_sections, GOT offset thereafter.  */
3043   union
3044     {
3045       bfd_signed_vma refcount;
3046       bfd_vma offset;
3047     } got;
3048 };
3049
3050 /* The same for PLT.  */
3051 struct plt_entry
3052 {
3053   struct plt_entry *next;
3054
3055   bfd_vma addend;
3056
3057   union
3058     {
3059       bfd_signed_vma refcount;
3060       bfd_vma offset;
3061     } plt;
3062 };
3063
3064 /* Of those relocs that might be copied as dynamic relocs, this macro
3065    selects those that must be copied when linking a shared library,
3066    even when the symbol is local.  */
3067
3068 #define MUST_BE_DYN_RELOC(RTYPE)                \
3069   ((RTYPE) != R_PPC64_REL32                     \
3070    && (RTYPE) != R_PPC64_REL64                  \
3071    && (RTYPE) != R_PPC64_REL30)
3072
3073 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3074    copying dynamic variables from a shared lib into an app's dynbss
3075    section, and instead use a dynamic relocation to point into the
3076    shared lib.  With code that gcc generates, it's vital that this be
3077    enabled;  In the PowerPC64 ABI, the address of a function is actually
3078    the address of a function descriptor, which resides in the .opd
3079    section.  gcc uses the descriptor directly rather than going via the
3080    GOT as some other ABI's do, which means that initialized function
3081    pointers must reference the descriptor.  Thus, a function pointer
3082    initialized to the address of a function in a shared library will
3083    either require a copy reloc, or a dynamic reloc.  Using a copy reloc
3084    redefines the function descriptor symbol to point to the copy.  This
3085    presents a problem as a plt entry for that function is also
3086    initialized from the function descriptor symbol and the copy reloc
3087    may not be initialized first.  */
3088 #define ELIMINATE_COPY_RELOCS 1
3089
3090 /* Section name for stubs is the associated section name plus this
3091    string.  */
3092 #define STUB_SUFFIX ".stub"
3093
3094 /* Linker stubs.
3095    ppc_stub_long_branch:
3096    Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3097    destination, but a 24 bit branch in a stub section will reach.
3098    .    b       dest
3099
3100    ppc_stub_plt_branch:
3101    Similar to the above, but a 24 bit branch in the stub section won't
3102    reach its destination.
3103    .    addis   %r12,%r2,xxx@toc@ha
3104    .    ld      %r11,xxx@toc@l(%r12)
3105    .    mtctr   %r11
3106    .    bctr
3107
3108    ppc_stub_plt_call:
3109    Used to call a function in a shared library.  If it so happens that
3110    the plt entry referenced crosses a 64k boundary, then an extra
3111    "addis %r12,%r12,1" will be inserted before the load at xxx+8 or
3112    xxx+16 as appropriate.
3113    .    addis   %r12,%r2,xxx@toc@ha
3114    .    std     %r2,40(%r1)
3115    .    ld      %r11,xxx+0@toc@l(%r12)
3116    .    ld      %r2,xxx+8@toc@l(%r12)
3117    .    mtctr   %r11
3118    .    ld      %r11,xxx+16@toc@l(%r12)
3119    .    bctr
3120
3121    ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3122    code to adjust the value and save r2 to support multiple toc sections.
3123    A ppc_stub_long_branch with an r2 offset looks like:
3124    .    std     %r2,40(%r1)
3125    .    addis   %r2,%r2,off@ha
3126    .    addi    %r2,%r2,off@l
3127    .    b       dest
3128
3129    A ppc_stub_plt_branch with an r2 offset looks like:
3130    .    std     %r2,40(%r1)
3131    .    addis   %r12,%r2,xxx@toc@ha
3132    .    ld      %r11,xxx@toc@l(%r12)
3133    .    addis   %r2,%r2,off@ha
3134    .    addi    %r2,%r2,off@l
3135    .    mtctr   %r11
3136    .    bctr
3137 */
3138
3139 enum ppc_stub_type {
3140   ppc_stub_none,
3141   ppc_stub_long_branch,
3142   ppc_stub_long_branch_r2off,
3143   ppc_stub_plt_branch,
3144   ppc_stub_plt_branch_r2off,
3145   ppc_stub_plt_call
3146 };
3147
3148 struct ppc_stub_hash_entry {
3149
3150   /* Base hash table entry structure.  */
3151   struct bfd_hash_entry root;
3152
3153   enum ppc_stub_type stub_type;
3154
3155   /* The stub section.  */
3156   asection *stub_sec;
3157
3158   /* Offset within stub_sec of the beginning of this stub.  */
3159   bfd_vma stub_offset;
3160
3161   /* Given the symbol's value and its section we can determine its final
3162      value when building the stubs (so the stub knows where to jump.  */
3163   bfd_vma target_value;
3164   asection *target_section;
3165
3166   /* The symbol table entry, if any, that this was derived from.  */
3167   struct ppc_link_hash_entry *h;
3168
3169   /* And the reloc addend that this was derived from.  */
3170   bfd_vma addend;
3171
3172   /* Where this stub is being called from, or, in the case of combined
3173      stub sections, the first input section in the group.  */
3174   asection *id_sec;
3175 };
3176
3177 struct ppc_branch_hash_entry {
3178
3179   /* Base hash table entry structure.  */
3180   struct bfd_hash_entry root;
3181
3182   /* Offset within .branch_lt.  */
3183   unsigned int offset;
3184
3185   /* Generation marker.  */
3186   unsigned int iter;
3187 };
3188
3189 struct ppc_link_hash_entry
3190 {
3191   struct elf_link_hash_entry elf;
3192
3193   /* A pointer to the most recently used stub hash entry against this
3194      symbol.  */
3195   struct ppc_stub_hash_entry *stub_cache;
3196
3197   /* Track dynamic relocs copied for this symbol.  */
3198   struct ppc_dyn_relocs *dyn_relocs;
3199
3200   /* Link between function code and descriptor symbols.  */
3201   struct ppc_link_hash_entry *oh;
3202
3203   /* Flag function code and descriptor symbols.  */
3204   unsigned int is_func:1;
3205   unsigned int is_func_descriptor:1;
3206
3207   /* Whether global opd sym has been adjusted or not.
3208      After ppc64_elf_edit_opd has run, this flag should be set for all
3209      globals defined in any opd section.  */
3210   unsigned int adjust_done:1;
3211
3212   /* Set if we twiddled this symbol to weak at some stage.  */
3213   unsigned int was_undefined:1;
3214
3215   /* Contexts in which symbol is used in the GOT (or TOC).
3216      TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3217      corresponding relocs are encountered during check_relocs.
3218      tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3219      indicate the corresponding GOT entry type is not needed.
3220      tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3221      a TPREL one.  We use a separate flag rather than setting TPREL
3222      just for convenience in distinguishing the two cases.  */
3223 #define TLS_GD           1      /* GD reloc. */
3224 #define TLS_LD           2      /* LD reloc. */
3225 #define TLS_TPREL        4      /* TPREL reloc, => IE. */
3226 #define TLS_DTPREL       8      /* DTPREL reloc, => LD. */
3227 #define TLS_TLS         16      /* Any TLS reloc.  */
3228 #define TLS_EXPLICIT    32      /* Marks TOC section TLS relocs. */
3229 #define TLS_TPRELGD     64      /* TPREL reloc resulting from GD->IE. */
3230   char tls_mask;
3231 };
3232
3233 /* ppc64 ELF linker hash table.  */
3234
3235 struct ppc_link_hash_table
3236 {
3237   struct elf_link_hash_table elf;
3238
3239   /* The stub hash table.  */
3240   struct bfd_hash_table stub_hash_table;
3241
3242   /* Another hash table for plt_branch stubs.  */
3243   struct bfd_hash_table branch_hash_table;
3244
3245   /* Linker stub bfd.  */
3246   bfd *stub_bfd;
3247
3248   /* Linker call-backs.  */
3249   asection * (*add_stub_section) (const char *, asection *);
3250   void (*layout_sections_again) (void);
3251
3252   /* Array to keep track of which stub sections have been created, and
3253      information on stub grouping.  */
3254   struct map_stub {
3255     /* This is the section to which stubs in the group will be attached.  */
3256     asection *link_sec;
3257     /* The stub section.  */
3258     asection *stub_sec;
3259     /* Along with elf_gp, specifies the TOC pointer used in this group.  */
3260     bfd_vma toc_off;
3261   } *stub_group;
3262
3263   /* Temp used when calculating TOC pointers.  */
3264   bfd_vma toc_curr;
3265
3266   /* Highest input section id.  */
3267   int top_id;
3268
3269   /* Highest output section index.  */
3270   int top_index;
3271
3272   /* List of input sections for each output section.  */
3273   asection **input_list;
3274
3275   /* Short-cuts to get to dynamic linker sections.  */
3276   asection *got;
3277   asection *plt;
3278   asection *relplt;
3279   asection *dynbss;
3280   asection *relbss;
3281   asection *glink;
3282   asection *sfpr;
3283   asection *brlt;
3284   asection *relbrlt;
3285
3286   /* Shortcut to .__tls_get_addr and __tls_get_addr.  */
3287   struct ppc_link_hash_entry *tls_get_addr;
3288   struct ppc_link_hash_entry *tls_get_addr_fd;
3289
3290   /* Statistics.  */
3291   unsigned long stub_count[ppc_stub_plt_call];
3292
3293   /* Set if we should emit symbols for stubs.  */
3294   unsigned int emit_stub_syms:1;
3295
3296   /* Set on error.  */
3297   unsigned int stub_error:1;
3298
3299   /* Flag set when small branches are detected.  Used to
3300      select suitable defaults for the stub group size.  */
3301   unsigned int has_14bit_branch:1;
3302
3303   /* Temp used by ppc64_elf_check_directives.  */
3304   unsigned int twiddled_syms:1;
3305
3306   /* Incremented every time we size stubs.  */
3307   unsigned int stub_iteration;
3308
3309   /* Small local sym to section mapping cache.  */
3310   struct sym_sec_cache sym_sec;
3311 };
3312
3313 /* Get the ppc64 ELF linker hash table from a link_info structure.  */
3314
3315 #define ppc_hash_table(p) \
3316   ((struct ppc_link_hash_table *) ((p)->hash))
3317
3318 #define ppc_stub_hash_lookup(table, string, create, copy) \
3319   ((struct ppc_stub_hash_entry *) \
3320    bfd_hash_lookup ((table), (string), (create), (copy)))
3321
3322 #define ppc_branch_hash_lookup(table, string, create, copy) \
3323   ((struct ppc_branch_hash_entry *) \
3324    bfd_hash_lookup ((table), (string), (create), (copy)))
3325
3326 /* Create an entry in the stub hash table.  */
3327
3328 static struct bfd_hash_entry *
3329 stub_hash_newfunc (struct bfd_hash_entry *entry,
3330                    struct bfd_hash_table *table,
3331                    const char *string)
3332 {
3333   /* Allocate the structure if it has not already been allocated by a
3334      subclass.  */
3335   if (entry == NULL)
3336     {
3337       entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3338       if (entry == NULL)
3339         return entry;
3340     }
3341
3342   /* Call the allocation method of the superclass.  */
3343   entry = bfd_hash_newfunc (entry, table, string);
3344   if (entry != NULL)
3345     {
3346       struct ppc_stub_hash_entry *eh;
3347
3348       /* Initialize the local fields.  */
3349       eh = (struct ppc_stub_hash_entry *) entry;
3350       eh->stub_type = ppc_stub_none;
3351       eh->stub_sec = NULL;
3352       eh->stub_offset = 0;
3353       eh->target_value = 0;
3354       eh->target_section = NULL;
3355       eh->h = NULL;
3356       eh->id_sec = NULL;
3357     }
3358
3359   return entry;
3360 }
3361
3362 /* Create an entry in the branch hash table.  */
3363
3364 static struct bfd_hash_entry *
3365 branch_hash_newfunc (struct bfd_hash_entry *entry,
3366                      struct bfd_hash_table *table,
3367                      const char *string)
3368 {
3369   /* Allocate the structure if it has not already been allocated by a
3370      subclass.  */
3371   if (entry == NULL)
3372     {
3373       entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3374       if (entry == NULL)
3375         return entry;
3376     }
3377
3378   /* Call the allocation method of the superclass.  */
3379   entry = bfd_hash_newfunc (entry, table, string);
3380   if (entry != NULL)
3381     {
3382       struct ppc_branch_hash_entry *eh;
3383
3384       /* Initialize the local fields.  */
3385       eh = (struct ppc_branch_hash_entry *) entry;
3386       eh->offset = 0;
3387       eh->iter = 0;
3388     }
3389
3390   return entry;
3391 }
3392
3393 /* Create an entry in a ppc64 ELF linker hash table.  */
3394
3395 static struct bfd_hash_entry *
3396 link_hash_newfunc (struct bfd_hash_entry *entry,
3397                    struct bfd_hash_table *table,
3398                    const char *string)
3399 {
3400   /* Allocate the structure if it has not already been allocated by a
3401      subclass.  */
3402   if (entry == NULL)
3403     {
3404       entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3405       if (entry == NULL)
3406         return entry;
3407     }
3408
3409   /* Call the allocation method of the superclass.  */
3410   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3411   if (entry != NULL)
3412     {
3413       struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3414
3415       eh->stub_cache = NULL;
3416       eh->dyn_relocs = NULL;
3417       eh->oh = NULL;
3418       eh->is_func = 0;
3419       eh->is_func_descriptor = 0;
3420       eh->adjust_done = 0;
3421       eh->was_undefined = 0;
3422       eh->tls_mask = 0;
3423     }
3424
3425   return entry;
3426 }
3427
3428 /* Create a ppc64 ELF linker hash table.  */
3429
3430 static struct bfd_link_hash_table *
3431 ppc64_elf_link_hash_table_create (bfd *abfd)
3432 {
3433   struct ppc_link_hash_table *htab;
3434   bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3435
3436   htab = bfd_zmalloc (amt);
3437   if (htab == NULL)
3438     return NULL;
3439
3440   if (! _bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc))
3441     {
3442       free (htab);
3443       return NULL;
3444     }
3445
3446   /* Init the stub hash table too.  */
3447   if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc))
3448     return NULL;
3449
3450   /* And the branch hash table.  */
3451   if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc))
3452     return NULL;
3453
3454   /* Initializing two fields of the union is just cosmetic.  We really
3455      only care about glist, but when compiled on a 32-bit host the
3456      bfd_vma fields are larger.  Setting the bfd_vma to zero makes
3457      debugger inspection of these fields look nicer.  */
3458   htab->elf.init_refcount.refcount = 0;
3459   htab->elf.init_refcount.glist = NULL;
3460   htab->elf.init_offset.offset = 0;
3461   htab->elf.init_offset.glist = NULL;
3462
3463   return &htab->elf.root;
3464 }
3465
3466 /* Free the derived linker hash table.  */
3467
3468 static void
3469 ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
3470 {
3471   struct ppc_link_hash_table *ret = (struct ppc_link_hash_table *) hash;
3472
3473   bfd_hash_table_free (&ret->stub_hash_table);
3474   bfd_hash_table_free (&ret->branch_hash_table);
3475   _bfd_generic_link_hash_table_free (hash);
3476 }
3477
3478 /* Satisfy the ELF linker by filling in some fields in our fake bfd.  */
3479
3480 void
3481 ppc64_elf_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
3482 {
3483   struct ppc_link_hash_table *htab;
3484
3485   elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS64;
3486
3487 /* Always hook our dynamic sections into the first bfd, which is the
3488    linker created stub bfd.  This ensures that the GOT header is at
3489    the start of the output TOC section.  */
3490   htab = ppc_hash_table (info);
3491   htab->stub_bfd = abfd;
3492   htab->elf.dynobj = abfd;
3493 }
3494
3495 /* Build a name for an entry in the stub hash table.  */
3496
3497 static char *
3498 ppc_stub_name (const asection *input_section,
3499                const asection *sym_sec,
3500                const struct ppc_link_hash_entry *h,
3501                const Elf_Internal_Rela *rel)
3502 {
3503   char *stub_name;
3504   bfd_size_type len;
3505
3506   /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3507      offsets from a sym as a branch target?  In fact, we could
3508      probably assume the addend is always zero.  */
3509   BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3510
3511   if (h)
3512     {
3513       len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3514       stub_name = bfd_malloc (len);
3515       if (stub_name != NULL)
3516         {
3517           sprintf (stub_name, "%08x.%s+%x",
3518                    input_section->id & 0xffffffff,
3519                    h->elf.root.root.string,
3520                    (int) rel->r_addend & 0xffffffff);
3521         }
3522     }
3523   else
3524     {
3525       len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
3526       stub_name = bfd_malloc (len);
3527       if (stub_name != NULL)
3528         {
3529           sprintf (stub_name, "%08x.%x:%x+%x",
3530                    input_section->id & 0xffffffff,
3531                    sym_sec->id & 0xffffffff,
3532                    (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3533                    (int) rel->r_addend & 0xffffffff);
3534         }
3535     }
3536   return stub_name;
3537 }
3538
3539 /* Look up an entry in the stub hash.  Stub entries are cached because
3540    creating the stub name takes a bit of time.  */
3541
3542 static struct ppc_stub_hash_entry *
3543 ppc_get_stub_entry (const asection *input_section,
3544                     const asection *sym_sec,
3545                     struct ppc_link_hash_entry *h,
3546                     const Elf_Internal_Rela *rel,
3547                     struct ppc_link_hash_table *htab)
3548 {
3549   struct ppc_stub_hash_entry *stub_entry;
3550   const asection *id_sec;
3551
3552   /* If this input section is part of a group of sections sharing one
3553      stub section, then use the id of the first section in the group.
3554      Stub names need to include a section id, as there may well be
3555      more than one stub used to reach say, printf, and we need to
3556      distinguish between them.  */
3557   id_sec = htab->stub_group[input_section->id].link_sec;
3558
3559   if (h != NULL && h->stub_cache != NULL
3560       && h->stub_cache->h == h
3561       && h->stub_cache->id_sec == id_sec)
3562     {
3563       stub_entry = h->stub_cache;
3564     }
3565   else
3566     {
3567       char *stub_name;
3568
3569       stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
3570       if (stub_name == NULL)
3571         return NULL;
3572
3573       stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
3574                                          stub_name, FALSE, FALSE);
3575       if (h != NULL)
3576         h->stub_cache = stub_entry;
3577
3578       free (stub_name);
3579     }
3580
3581   return stub_entry;
3582 }
3583
3584 /* Add a new stub entry to the stub hash.  Not all fields of the new
3585    stub entry are initialised.  */
3586
3587 static struct ppc_stub_hash_entry *
3588 ppc_add_stub (const char *stub_name,
3589               asection *section,
3590               struct ppc_link_hash_table *htab)
3591 {
3592   asection *link_sec;
3593   asection *stub_sec;
3594   struct ppc_stub_hash_entry *stub_entry;
3595
3596   link_sec = htab->stub_group[section->id].link_sec;
3597   stub_sec = htab->stub_group[section->id].stub_sec;
3598   if (stub_sec == NULL)
3599     {
3600       stub_sec = htab->stub_group[link_sec->id].stub_sec;
3601       if (stub_sec == NULL)
3602         {
3603           size_t namelen;
3604           bfd_size_type len;
3605           char *s_name;
3606
3607           namelen = strlen (link_sec->name);
3608           len = namelen + sizeof (STUB_SUFFIX);
3609           s_name = bfd_alloc (htab->stub_bfd, len);
3610           if (s_name == NULL)
3611             return NULL;
3612
3613           memcpy (s_name, link_sec->name, namelen);
3614           memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3615           stub_sec = (*htab->add_stub_section) (s_name, link_sec);
3616           if (stub_sec == NULL)
3617             return NULL;
3618           htab->stub_group[link_sec->id].stub_sec = stub_sec;
3619         }
3620       htab->stub_group[section->id].stub_sec = stub_sec;
3621     }
3622
3623   /* Enter this entry into the linker stub hash table.  */
3624   stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
3625                                      TRUE, FALSE);
3626   if (stub_entry == NULL)
3627     {
3628       (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
3629                              section->owner, stub_name);
3630       return NULL;
3631     }
3632
3633   stub_entry->stub_sec = stub_sec;
3634   stub_entry->stub_offset = 0;
3635   stub_entry->id_sec = link_sec;
3636   return stub_entry;
3637 }
3638
3639 /* Create sections for linker generated code.  */
3640
3641 static bfd_boolean
3642 create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
3643 {
3644   struct ppc_link_hash_table *htab;
3645   flagword flags;
3646
3647   htab = ppc_hash_table (info);
3648
3649   /* Create .sfpr for code to save and restore fp regs.  */
3650   flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3651            | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3652   htab->sfpr = bfd_make_section_anyway (dynobj, ".sfpr");
3653   if (htab->sfpr == NULL
3654       || ! bfd_set_section_flags (dynobj, htab->sfpr, flags)
3655       || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
3656     return FALSE;
3657
3658   /* Create .glink for lazy dynamic linking support.  */
3659   htab->glink = bfd_make_section_anyway (dynobj, ".glink");
3660   if (htab->glink == NULL
3661       || ! bfd_set_section_flags (dynobj, htab->glink, flags)
3662       || ! bfd_set_section_alignment (dynobj, htab->glink, 2))
3663     return FALSE;
3664
3665   /* Create .branch_lt for plt_branch stubs.  */
3666   flags = (SEC_ALLOC | SEC_LOAD
3667            | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3668   htab->brlt = bfd_make_section_anyway (dynobj, ".branch_lt");
3669   if (htab->brlt == NULL
3670       || ! bfd_set_section_flags (dynobj, htab->brlt, flags)
3671       || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
3672     return FALSE;
3673
3674   if (info->shared)
3675     {
3676       flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3677                | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3678       htab->relbrlt = bfd_make_section_anyway (dynobj, ".rela.branch_lt");
3679       if (!htab->relbrlt
3680           || ! bfd_set_section_flags (dynobj, htab->relbrlt, flags)
3681           || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
3682         return FALSE;
3683     }
3684   return TRUE;
3685 }
3686
3687 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3688    not already done.  */
3689
3690 static bfd_boolean
3691 create_got_section (bfd *abfd, struct bfd_link_info *info)
3692 {
3693   asection *got, *relgot;
3694   flagword flags;
3695   struct ppc_link_hash_table *htab = ppc_hash_table (info);
3696
3697   if (!htab->got)
3698     {
3699       if (! _bfd_elf_create_got_section (htab->elf.dynobj, info))
3700         return FALSE;
3701
3702       htab->got = bfd_get_section_by_name (htab->elf.dynobj, ".got");
3703       if (!htab->got)
3704         abort ();
3705     }
3706
3707   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3708            | SEC_LINKER_CREATED);
3709
3710   got = bfd_make_section (abfd, ".got");
3711   if (!got
3712       || !bfd_set_section_flags (abfd, got, flags)
3713       || !bfd_set_section_alignment (abfd, got, 3))
3714     return FALSE;
3715
3716   relgot = bfd_make_section (abfd, ".rela.got");
3717   if (!relgot
3718       || ! bfd_set_section_flags (abfd, relgot, flags | SEC_READONLY)
3719       || ! bfd_set_section_alignment (abfd, relgot, 3))
3720     return FALSE;
3721
3722   ppc64_elf_tdata (abfd)->got = got;
3723   ppc64_elf_tdata (abfd)->relgot = relgot;
3724   return TRUE;
3725 }
3726
3727 /* Create the dynamic sections, and set up shortcuts.  */
3728
3729 static bfd_boolean
3730 ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
3731 {
3732   struct ppc_link_hash_table *htab;
3733
3734   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
3735     return FALSE;
3736
3737   htab = ppc_hash_table (info);
3738   if (!htab->got)
3739     htab->got = bfd_get_section_by_name (dynobj, ".got");
3740   htab->plt = bfd_get_section_by_name (dynobj, ".plt");
3741   htab->relplt = bfd_get_section_by_name (dynobj, ".rela.plt");
3742   htab->dynbss = bfd_get_section_by_name (dynobj, ".dynbss");
3743   if (!info->shared)
3744     htab->relbss = bfd_get_section_by_name (dynobj, ".rela.bss");
3745
3746   if (!htab->got || !htab->plt || !htab->relplt || !htab->dynbss
3747       || (!info->shared && !htab->relbss))
3748     abort ();
3749
3750   return TRUE;
3751 }
3752
3753 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
3754
3755 static void
3756 ppc64_elf_copy_indirect_symbol
3757   (const struct elf_backend_data *bed ATTRIBUTE_UNUSED,
3758    struct elf_link_hash_entry *dir,
3759    struct elf_link_hash_entry *ind)
3760 {
3761   struct ppc_link_hash_entry *edir, *eind;
3762   flagword mask;
3763
3764   edir = (struct ppc_link_hash_entry *) dir;
3765   eind = (struct ppc_link_hash_entry *) ind;
3766
3767   /* Copy over any dynamic relocs we may have on the indirect sym.  */
3768   if (eind->dyn_relocs != NULL)
3769     {
3770       if (edir->dyn_relocs != NULL)
3771         {
3772           struct ppc_dyn_relocs **pp;
3773           struct ppc_dyn_relocs *p;
3774
3775           if (eind->elf.root.type == bfd_link_hash_indirect)
3776             abort ();
3777
3778           /* Add reloc counts against the weak sym to the strong sym
3779              list.  Merge any entries against the same section.  */
3780           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3781             {
3782               struct ppc_dyn_relocs *q;
3783
3784               for (q = edir->dyn_relocs; q != NULL; q = q->next)
3785                 if (q->sec == p->sec)
3786                   {
3787                     q->pc_count += p->pc_count;
3788                     q->count += p->count;
3789                     *pp = p->next;
3790                     break;
3791                   }
3792               if (q == NULL)
3793                 pp = &p->next;
3794             }
3795           *pp = edir->dyn_relocs;
3796         }
3797
3798       edir->dyn_relocs = eind->dyn_relocs;
3799       eind->dyn_relocs = NULL;
3800     }
3801
3802   edir->is_func |= eind->is_func;
3803   edir->is_func_descriptor |= eind->is_func_descriptor;
3804   edir->tls_mask |= eind->tls_mask;
3805
3806   mask = (ELF_LINK_HASH_REF_DYNAMIC | ELF_LINK_HASH_REF_REGULAR
3807           | ELF_LINK_HASH_REF_REGULAR_NONWEAK | ELF_LINK_NON_GOT_REF
3808           | ELF_LINK_HASH_NEEDS_PLT);
3809   /* If called to transfer flags for a weakdef during processing
3810      of elf_adjust_dynamic_symbol, don't copy ELF_LINK_NON_GOT_REF.
3811      We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
3812   if (ELIMINATE_COPY_RELOCS
3813       && eind->elf.root.type != bfd_link_hash_indirect
3814       && (edir->elf.elf_link_hash_flags & ELF_LINK_HASH_DYNAMIC_ADJUSTED) != 0)
3815     mask &= ~ELF_LINK_NON_GOT_REF;
3816
3817   edir->elf.elf_link_hash_flags |= eind->elf.elf_link_hash_flags & mask;
3818
3819   /* If we were called to copy over info for a weak sym, that's all.  */
3820   if (eind->elf.root.type != bfd_link_hash_indirect)
3821     return;
3822
3823   /* Copy over got entries that we may have already seen to the
3824      symbol which just became indirect.  */
3825   if (eind->elf.got.glist != NULL)
3826     {
3827       if (edir->elf.got.glist != NULL)
3828         {
3829           struct got_entry **entp;
3830           struct got_entry *ent;
3831
3832           for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
3833             {
3834               struct got_entry *dent;
3835
3836               for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
3837                 if (dent->addend == ent->addend
3838                     && dent->owner == ent->owner
3839                     && dent->tls_type == ent->tls_type)
3840                   {
3841                     dent->got.refcount += ent->got.refcount;
3842                     *entp = ent->next;
3843                     break;
3844                   }
3845               if (dent == NULL)
3846                 entp = &ent->next;
3847             }
3848           *entp = edir->elf.got.glist;
3849         }
3850
3851       edir->elf.got.glist = eind->elf.got.glist;
3852       eind->elf.got.glist = NULL;
3853     }
3854
3855   /* And plt entries.  */
3856   if (eind->elf.plt.plist != NULL)
3857     {
3858       if (edir->elf.plt.plist != NULL)
3859         {
3860           struct plt_entry **entp;
3861           struct plt_entry *ent;
3862
3863           for (entp = &eind->elf.plt.plist; (ent = *entp) != NULL; )
3864             {
3865               struct plt_entry *dent;
3866
3867               for (dent = edir->elf.plt.plist; dent != NULL; dent = dent->next)
3868                 if (dent->addend == ent->addend)
3869                   {
3870                     dent->plt.refcount += ent->plt.refcount;
3871                     *entp = ent->next;
3872                     break;
3873                   }
3874               if (dent == NULL)
3875                 entp = &ent->next;
3876             }
3877           *entp = edir->elf.plt.plist;
3878         }
3879
3880       edir->elf.plt.plist = eind->elf.plt.plist;
3881       eind->elf.plt.plist = NULL;
3882     }
3883
3884   if (edir->elf.dynindx == -1)
3885     {
3886       edir->elf.dynindx = eind->elf.dynindx;
3887       edir->elf.dynstr_index = eind->elf.dynstr_index;
3888       eind->elf.dynindx = -1;
3889       eind->elf.dynstr_index = 0;
3890     }
3891   else
3892     BFD_ASSERT (eind->elf.dynindx == -1);
3893 }
3894
3895 /* Find the function descriptor hash entry from the given function code
3896    hash entry FH.  Link the entries via their OH fields.  */
3897
3898 static struct ppc_link_hash_entry *
3899 get_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
3900 {
3901   struct ppc_link_hash_entry *fdh = fh->oh;
3902
3903   if (fdh == NULL)
3904     {
3905       const char *fd_name = fh->elf.root.root.string + 1;
3906
3907       fdh = (struct ppc_link_hash_entry *)
3908         elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
3909       if (fdh != NULL)
3910         {
3911           fdh->is_func_descriptor = 1;
3912           fdh->oh = fh;
3913           fh->is_func = 1;
3914           fh->oh = fdh;
3915         }
3916     }
3917
3918   return fdh;
3919 }
3920
3921 /* Hacks to support old ABI code.
3922    When making function calls, old ABI code references function entry
3923    points (dot symbols), while new ABI code references the function
3924    descriptor symbol.  We need to make any combination of reference and
3925    definition work together, without breaking archive linking.
3926
3927    For a defined function "foo" and an undefined call to "bar":
3928    An old object defines "foo" and ".foo", references ".bar" (possibly
3929    "bar" too).
3930    A new object defines "foo" and references "bar".
3931
3932    A new object thus has no problem with its undefined symbols being
3933    satisfied by definitions in an old object.  On the other hand, the
3934    old object won't have ".bar" satisfied by a new object.  */
3935
3936 /* Fix function descriptor symbols defined in .opd sections to be
3937    function type.  */
3938
3939 static bfd_boolean
3940 ppc64_elf_add_symbol_hook (bfd *ibfd ATTRIBUTE_UNUSED,
3941                            struct bfd_link_info *info ATTRIBUTE_UNUSED,
3942                            Elf_Internal_Sym *isym,
3943                            const char **name ATTRIBUTE_UNUSED,
3944                            flagword *flags ATTRIBUTE_UNUSED,
3945                            asection **sec,
3946                            bfd_vma *value ATTRIBUTE_UNUSED)
3947 {
3948   if (*sec != NULL
3949       && strcmp (bfd_get_section_name (ibfd, *sec), ".opd") == 0)
3950     isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
3951   return TRUE;
3952 }
3953
3954 /* This function makes an old ABI object reference to ".bar" cause the
3955    inclusion of a new ABI object archive that defines "bar".  */
3956
3957 static struct elf_link_hash_entry *
3958 ppc64_elf_archive_symbol_lookup (bfd *abfd,
3959                                  struct bfd_link_info *info,
3960                                  const char *name)
3961 {
3962   struct elf_link_hash_entry *h;
3963   char *dot_name;
3964   size_t len;
3965
3966   h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
3967   if (h != NULL)
3968     return h;
3969
3970   if (name[0] == '.')
3971     return h;
3972
3973   len = strlen (name);
3974   dot_name = bfd_alloc (abfd, len + 2);
3975   if (dot_name == NULL)
3976     return (struct elf_link_hash_entry *) 0 - 1;
3977   dot_name[0] = '.';
3978   memcpy (dot_name + 1, name, len + 1);
3979   h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
3980   bfd_release (abfd, dot_name);
3981   return h;
3982 }
3983
3984 /* This function satisfies all old ABI object references to ".bar" if a
3985    new ABI object defines "bar".  Well, at least, undefined dot symbols
3986    are made weak.  This stops later archive searches from including an
3987    object if we already have a function descriptor definition.  It also
3988    prevents the linker complaining about undefined symbols.
3989    We also check and correct mismatched symbol visibility here.  The
3990    most restrictive visibility of the function descriptor and the
3991    function entry symbol is used.  */
3992
3993 static bfd_boolean
3994 add_symbol_adjust (struct elf_link_hash_entry *h, void *inf)
3995 {
3996   struct bfd_link_info *info;
3997   struct ppc_link_hash_table *htab;
3998   struct ppc_link_hash_entry *eh;
3999   struct ppc_link_hash_entry *fdh;
4000
4001   if (h->root.type == bfd_link_hash_indirect)
4002     return TRUE;
4003
4004   if (h->root.type == bfd_link_hash_warning)
4005     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4006
4007   if (h->root.root.string[0] != '.')
4008     return TRUE;
4009
4010   info = inf;
4011   htab = ppc_hash_table (info);
4012   eh = (struct ppc_link_hash_entry *) h;
4013   fdh = get_fdh (eh, htab);
4014   if (fdh != NULL)
4015     {
4016       unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4017       unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4018       if (entry_vis < descr_vis)
4019         fdh->elf.other += entry_vis - descr_vis;
4020       else if (entry_vis > descr_vis)
4021         eh->elf.other += descr_vis - entry_vis;
4022
4023       if (eh->elf.root.type == bfd_link_hash_undefined)
4024         {
4025           eh->elf.root.type = bfd_link_hash_undefweak;
4026           eh->was_undefined = 1;
4027           htab->twiddled_syms = 1;
4028         }
4029     }
4030
4031   return TRUE;
4032 }
4033
4034 static bfd_boolean
4035 ppc64_elf_check_directives (bfd *abfd ATTRIBUTE_UNUSED,
4036                             struct bfd_link_info *info)
4037 {
4038   struct ppc_link_hash_table *htab;
4039
4040   htab = ppc_hash_table (info);
4041   if (!is_ppc64_target (htab->elf.root.creator))
4042     return TRUE;
4043
4044   elf_link_hash_traverse (&htab->elf, add_symbol_adjust, info);
4045
4046   /* We need to fix the undefs list for any syms we have twiddled to
4047      undef_weak.  */
4048   if (htab->twiddled_syms)
4049     {
4050       struct bfd_link_hash_entry **pun;
4051
4052       pun = &htab->elf.root.undefs;
4053       while (*pun != NULL)
4054         {
4055           struct bfd_link_hash_entry *h = *pun;
4056
4057           if (h->type != bfd_link_hash_undefined
4058               && h->type != bfd_link_hash_common)
4059             {
4060               *pun = h->und_next;
4061               h->und_next = NULL;
4062               if (h == htab->elf.root.undefs_tail)
4063                 {
4064                   if (pun == &htab->elf.root.undefs)
4065                     htab->elf.root.undefs_tail = NULL;
4066                   else
4067                     /* pun points at an und_next field.  Go back to
4068                        the start of the link_hash_entry.  */
4069                     htab->elf.root.undefs_tail = (struct bfd_link_hash_entry *)
4070                       ((char *) pun - ((char *) &h->und_next - (char *) h));
4071                   break;
4072                 }
4073             }
4074           else
4075             pun = &h->und_next;
4076         }
4077
4078       htab->twiddled_syms = 0;
4079     }
4080   return TRUE;
4081 }
4082
4083 static bfd_boolean
4084 update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4085                        unsigned long r_symndx, bfd_vma r_addend, int tls_type)
4086 {
4087   struct got_entry **local_got_ents = elf_local_got_ents (abfd);
4088   char *local_got_tls_masks;
4089
4090   if (local_got_ents == NULL)
4091     {
4092       bfd_size_type size = symtab_hdr->sh_info;
4093
4094       size *= sizeof (*local_got_ents) + sizeof (*local_got_tls_masks);
4095       local_got_ents = bfd_zalloc (abfd, size);
4096       if (local_got_ents == NULL)
4097         return FALSE;
4098       elf_local_got_ents (abfd) = local_got_ents;
4099     }
4100
4101   if ((tls_type & TLS_EXPLICIT) == 0)
4102     {
4103       struct got_entry *ent;
4104
4105       for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
4106         if (ent->addend == r_addend
4107             && ent->owner == abfd
4108             && ent->tls_type == tls_type)
4109           break;
4110       if (ent == NULL)
4111         {
4112           bfd_size_type amt = sizeof (*ent);
4113           ent = bfd_alloc (abfd, amt);
4114           if (ent == NULL)
4115             return FALSE;
4116           ent->next = local_got_ents[r_symndx];
4117           ent->addend = r_addend;
4118           ent->owner = abfd;
4119           ent->tls_type = tls_type;
4120           ent->got.refcount = 0;
4121           local_got_ents[r_symndx] = ent;
4122         }
4123       ent->got.refcount += 1;
4124     }
4125
4126   local_got_tls_masks = (char *) (local_got_ents + symtab_hdr->sh_info);
4127   local_got_tls_masks[r_symndx] |= tls_type;
4128   return TRUE;
4129 }
4130
4131 static bfd_boolean
4132 update_plt_info (bfd *abfd, struct ppc_link_hash_entry *eh, bfd_vma addend)
4133 {
4134   struct plt_entry *ent;
4135
4136   for (ent = eh->elf.plt.plist; ent != NULL; ent = ent->next)
4137     if (ent->addend == addend)
4138       break;
4139   if (ent == NULL)
4140     {
4141       bfd_size_type amt = sizeof (*ent);
4142       ent = bfd_alloc (abfd, amt);
4143       if (ent == NULL)
4144         return FALSE;
4145       ent->next = eh->elf.plt.plist;
4146       ent->addend = addend;
4147       ent->plt.refcount = 0;
4148       eh->elf.plt.plist = ent;
4149     }
4150   ent->plt.refcount += 1;
4151   eh->elf.elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
4152   eh->is_func = 1;
4153   return TRUE;
4154 }
4155
4156 /* Look through the relocs for a section during the first phase, and
4157    calculate needed space in the global offset table, procedure
4158    linkage table, and dynamic reloc sections.  */
4159
4160 static bfd_boolean
4161 ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4162                         asection *sec, const Elf_Internal_Rela *relocs)
4163 {
4164   struct ppc_link_hash_table *htab;
4165   Elf_Internal_Shdr *symtab_hdr;
4166   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4167   const Elf_Internal_Rela *rel;
4168   const Elf_Internal_Rela *rel_end;
4169   asection *sreloc;
4170   asection **opd_sym_map;
4171
4172   if (info->relocatable)
4173     return TRUE;
4174
4175   /* Don't do anything special with non-loaded, non-alloced sections.
4176      In particular, any relocs in such sections should not affect GOT
4177      and PLT reference counting (ie. we don't allow them to create GOT
4178      or PLT entries), there's no possibility or desire to optimize TLS
4179      relocs, and there's not much point in propagating relocs to shared
4180      libs that the dynamic linker won't relocate.  */
4181   if ((sec->flags & SEC_ALLOC) == 0)
4182     return TRUE;
4183
4184   htab = ppc_hash_table (info);
4185   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4186
4187   sym_hashes = elf_sym_hashes (abfd);
4188   sym_hashes_end = (sym_hashes
4189                     + symtab_hdr->sh_size / sizeof (Elf64_External_Sym)
4190                     - symtab_hdr->sh_info);
4191
4192   sreloc = NULL;
4193   opd_sym_map = NULL;
4194   if (strcmp (bfd_get_section_name (abfd, sec), ".opd") == 0)
4195     {
4196       /* Garbage collection needs some extra help with .opd sections.
4197          We don't want to necessarily keep everything referenced by
4198          relocs in .opd, as that would keep all functions.  Instead,
4199          if we reference an .opd symbol (a function descriptor), we
4200          want to keep the function code symbol's section.  This is
4201          easy for global symbols, but for local syms we need to keep
4202          information about the associated function section.  Later, if
4203          edit_opd deletes entries, we'll use this array to adjust
4204          local syms in .opd.  */
4205       union opd_info {
4206         asection *func_section;
4207         long entry_adjust;
4208       };
4209       bfd_size_type amt;
4210
4211       amt = sec->size * sizeof (union opd_info) / 8;
4212       opd_sym_map = bfd_zalloc (abfd, amt);
4213       if (opd_sym_map == NULL)
4214         return FALSE;
4215       ppc64_elf_section_data (sec)->opd.func_sec = opd_sym_map;
4216     }
4217
4218   if (htab->sfpr == NULL
4219       && !create_linkage_sections (htab->elf.dynobj, info))
4220     return FALSE;
4221
4222   rel_end = relocs + sec->reloc_count;
4223   for (rel = relocs; rel < rel_end; rel++)
4224     {
4225       unsigned long r_symndx;
4226       struct elf_link_hash_entry *h;
4227       enum elf_ppc64_reloc_type r_type;
4228       int tls_type = 0;
4229
4230       r_symndx = ELF64_R_SYM (rel->r_info);
4231       if (r_symndx < symtab_hdr->sh_info)
4232         h = NULL;
4233       else
4234         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4235
4236       r_type = ELF64_R_TYPE (rel->r_info);
4237       switch (r_type)
4238         {
4239         case R_PPC64_GOT_TLSLD16:
4240         case R_PPC64_GOT_TLSLD16_LO:
4241         case R_PPC64_GOT_TLSLD16_HI:
4242         case R_PPC64_GOT_TLSLD16_HA:
4243           ppc64_tlsld_got (abfd)->refcount += 1;
4244           tls_type = TLS_TLS | TLS_LD;
4245           goto dogottls;
4246
4247         case R_PPC64_GOT_TLSGD16:
4248         case R_PPC64_GOT_TLSGD16_LO:
4249         case R_PPC64_GOT_TLSGD16_HI:
4250         case R_PPC64_GOT_TLSGD16_HA:
4251           tls_type = TLS_TLS | TLS_GD;
4252           goto dogottls;
4253
4254         case R_PPC64_GOT_TPREL16_DS:
4255         case R_PPC64_GOT_TPREL16_LO_DS:
4256         case R_PPC64_GOT_TPREL16_HI:
4257         case R_PPC64_GOT_TPREL16_HA:
4258           if (info->shared)
4259             info->flags |= DF_STATIC_TLS;
4260           tls_type = TLS_TLS | TLS_TPREL;
4261           goto dogottls;
4262
4263         case R_PPC64_GOT_DTPREL16_DS:
4264         case R_PPC64_GOT_DTPREL16_LO_DS:
4265         case R_PPC64_GOT_DTPREL16_HI:
4266         case R_PPC64_GOT_DTPREL16_HA:
4267           tls_type = TLS_TLS | TLS_DTPREL;
4268         dogottls:
4269           sec->has_tls_reloc = 1;
4270           /* Fall thru */
4271
4272         case R_PPC64_GOT16:
4273         case R_PPC64_GOT16_DS:
4274         case R_PPC64_GOT16_HA:
4275         case R_PPC64_GOT16_HI:
4276         case R_PPC64_GOT16_LO:
4277         case R_PPC64_GOT16_LO_DS:
4278           /* This symbol requires a global offset table entry.  */
4279           sec->has_gp_reloc = 1;
4280           if (ppc64_elf_tdata (abfd)->got == NULL
4281               && !create_got_section (abfd, info))
4282             return FALSE;
4283
4284           if (h != NULL)
4285             {
4286               struct ppc_link_hash_entry *eh;
4287               struct got_entry *ent;
4288
4289               eh = (struct ppc_link_hash_entry *) h;
4290               for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
4291                 if (ent->addend == rel->r_addend
4292                     && ent->owner == abfd
4293                     && ent->tls_type == tls_type)
4294                   break;
4295               if (ent == NULL)
4296                 {
4297                   bfd_size_type amt = sizeof (*ent);
4298                   ent = bfd_alloc (abfd, amt);
4299                   if (ent == NULL)
4300                     return FALSE;
4301                   ent->next = eh->elf.got.glist;
4302                   ent->addend = rel->r_addend;
4303                   ent->owner = abfd;
4304                   ent->tls_type = tls_type;
4305                   ent->got.refcount = 0;
4306                   eh->elf.got.glist = ent;
4307                 }
4308               ent->got.refcount += 1;
4309               eh->tls_mask |= tls_type;
4310             }
4311           else
4312             /* This is a global offset table entry for a local symbol.  */
4313             if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
4314                                         rel->r_addend, tls_type))
4315               return FALSE;
4316           break;
4317
4318         case R_PPC64_PLT16_HA:
4319         case R_PPC64_PLT16_HI:
4320         case R_PPC64_PLT16_LO:
4321         case R_PPC64_PLT32:
4322         case R_PPC64_PLT64:
4323           /* This symbol requires a procedure linkage table entry.  We
4324              actually build the entry in adjust_dynamic_symbol,
4325              because this might be a case of linking PIC code without
4326              linking in any dynamic objects, in which case we don't
4327              need to generate a procedure linkage table after all.  */
4328           if (h == NULL)
4329             {
4330               /* It does not make sense to have a procedure linkage
4331                  table entry for a local symbol.  */
4332               bfd_set_error (bfd_error_bad_value);
4333               return FALSE;
4334             }
4335           else
4336             if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
4337                                   rel->r_addend))
4338               return FALSE;
4339           break;
4340
4341           /* The following relocations don't need to propagate the
4342              relocation if linking a shared object since they are
4343              section relative.  */
4344         case R_PPC64_SECTOFF:
4345         case R_PPC64_SECTOFF_LO:
4346         case R_PPC64_SECTOFF_HI:
4347         case R_PPC64_SECTOFF_HA:
4348         case R_PPC64_SECTOFF_DS:
4349         case R_PPC64_SECTOFF_LO_DS:
4350         case R_PPC64_DTPREL16:
4351         case R_PPC64_DTPREL16_LO:
4352         case R_PPC64_DTPREL16_HI:
4353         case R_PPC64_DTPREL16_HA:
4354         case R_PPC64_DTPREL16_DS:
4355         case R_PPC64_DTPREL16_LO_DS:
4356         case R_PPC64_DTPREL16_HIGHER:
4357         case R_PPC64_DTPREL16_HIGHERA:
4358         case R_PPC64_DTPREL16_HIGHEST:
4359         case R_PPC64_DTPREL16_HIGHESTA:
4360           break;
4361
4362           /* Nor do these.  */
4363         case R_PPC64_TOC16:
4364         case R_PPC64_TOC16_LO:
4365         case R_PPC64_TOC16_HI:
4366         case R_PPC64_TOC16_HA:
4367         case R_PPC64_TOC16_DS:
4368         case R_PPC64_TOC16_LO_DS:
4369           sec->has_gp_reloc = 1;
4370           break;
4371
4372           /* This relocation describes the C++ object vtable hierarchy.
4373              Reconstruct it for later use during GC.  */
4374         case R_PPC64_GNU_VTINHERIT:
4375           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4376             return FALSE;
4377           break;
4378
4379           /* This relocation describes which C++ vtable entries are actually
4380              used.  Record for later use during GC.  */
4381         case R_PPC64_GNU_VTENTRY:
4382           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4383             return FALSE;
4384           break;
4385
4386         case R_PPC64_REL14:
4387         case R_PPC64_REL14_BRTAKEN:
4388         case R_PPC64_REL14_BRNTAKEN:
4389           htab->has_14bit_branch = 1;
4390           /* Fall through.  */
4391
4392         case R_PPC64_REL24:
4393           if (h != NULL)
4394             {
4395               /* We may need a .plt entry if the function this reloc
4396                  refers to is in a shared lib.  */
4397               if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
4398                                     rel->r_addend))
4399                 return FALSE;
4400               if (h == &htab->tls_get_addr->elf
4401                   || h == &htab->tls_get_addr_fd->elf)
4402                 sec->has_tls_reloc = 1;
4403               else if (htab->tls_get_addr == NULL
4404                        && !strncmp (h->root.root.string, ".__tls_get_addr", 15)
4405                        && (h->root.root.string[15] == 0
4406                            || h->root.root.string[15] == '@'))
4407                 {
4408                   htab->tls_get_addr = (struct ppc_link_hash_entry *) h;
4409                   sec->has_tls_reloc = 1;
4410                 }
4411               else if (htab->tls_get_addr_fd == NULL
4412                        && !strncmp (h->root.root.string, "__tls_get_addr", 14)
4413                        && (h->root.root.string[14] == 0
4414                            || h->root.root.string[14] == '@'))
4415                 {
4416                   htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) h;
4417                   sec->has_tls_reloc = 1;
4418                 }
4419             }
4420           break;
4421
4422         case R_PPC64_TPREL64:
4423           tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
4424           if (info->shared)
4425             info->flags |= DF_STATIC_TLS;
4426           goto dotlstoc;
4427
4428         case R_PPC64_DTPMOD64:
4429           if (rel + 1 < rel_end
4430               && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
4431               && rel[1].r_offset == rel->r_offset + 8)
4432             tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
4433           else
4434             tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
4435           goto dotlstoc;
4436
4437         case R_PPC64_DTPREL64:
4438           tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
4439           if (rel != relocs
4440               && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
4441               && rel[-1].r_offset == rel->r_offset - 8)
4442             /* This is the second reloc of a dtpmod, dtprel pair.
4443                Don't mark with TLS_DTPREL.  */
4444             goto dodyn;
4445
4446         dotlstoc:
4447           sec->has_tls_reloc = 1;
4448           if (h != NULL)
4449             {
4450               struct ppc_link_hash_entry *eh;
4451               eh = (struct ppc_link_hash_entry *) h;
4452               eh->tls_mask |= tls_type;
4453             }
4454           else
4455             if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
4456                                         rel->r_addend, tls_type))
4457               return FALSE;
4458
4459           if (ppc64_elf_section_data (sec)->t_symndx == NULL)
4460             {
4461               /* One extra to simplify get_tls_mask.  */
4462               bfd_size_type amt = sec->size * sizeof (unsigned) / 8 + 1;
4463               ppc64_elf_section_data (sec)->t_symndx = bfd_zalloc (abfd, amt);
4464               if (ppc64_elf_section_data (sec)->t_symndx == NULL)
4465                 return FALSE;
4466             }
4467           BFD_ASSERT (rel->r_offset % 8 == 0);
4468           ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8] = r_symndx;
4469
4470           /* Mark the second slot of a GD or LD entry.
4471              -1 to indicate GD and -2 to indicate LD.  */
4472           if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
4473             ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8 + 1] = -1;
4474           else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
4475             ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8 + 1] = -2;
4476           goto dodyn;
4477
4478         case R_PPC64_TPREL16:
4479         case R_PPC64_TPREL16_LO:
4480         case R_PPC64_TPREL16_HI:
4481         case R_PPC64_TPREL16_HA:
4482         case R_PPC64_TPREL16_DS:
4483         case R_PPC64_TPREL16_LO_DS:
4484         case R_PPC64_TPREL16_HIGHER:
4485         case R_PPC64_TPREL16_HIGHERA:
4486         case R_PPC64_TPREL16_HIGHEST:
4487         case R_PPC64_TPREL16_HIGHESTA:
4488           if (info->shared)
4489             {
4490               info->flags |= DF_STATIC_TLS;
4491               goto dodyn;
4492             }
4493           break;
4494
4495         case R_PPC64_ADDR64:
4496           if (opd_sym_map != NULL
4497               && rel + 1 < rel_end
4498               && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
4499             {
4500               if (h != NULL)
4501                 {
4502                   if (h->root.root.string[0] == '.'
4503                       && h->root.root.string[1] != 0
4504                       && get_fdh ((struct ppc_link_hash_entry *) h, htab))
4505                     ;
4506                   else
4507                     ((struct ppc_link_hash_entry *) h)->is_func = 1;
4508                 }
4509               else
4510                 {
4511                   asection *s;
4512
4513                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, sec,
4514                                                  r_symndx);
4515                   if (s == NULL)
4516                     return FALSE;
4517                   else if (s != sec)
4518                     opd_sym_map[rel->r_offset / 8] = s;
4519                 }
4520             }
4521           /* Fall through.  */
4522
4523         case R_PPC64_REL30:
4524         case R_PPC64_REL32:
4525         case R_PPC64_REL64:
4526         case R_PPC64_ADDR14:
4527         case R_PPC64_ADDR14_BRNTAKEN:
4528         case R_PPC64_ADDR14_BRTAKEN:
4529         case R_PPC64_ADDR16:
4530         case R_PPC64_ADDR16_DS:
4531         case R_PPC64_ADDR16_HA:
4532         case R_PPC64_ADDR16_HI:
4533         case R_PPC64_ADDR16_HIGHER:
4534         case R_PPC64_ADDR16_HIGHERA:
4535         case R_PPC64_ADDR16_HIGHEST:
4536         case R_PPC64_ADDR16_HIGHESTA:
4537         case R_PPC64_ADDR16_LO:
4538         case R_PPC64_ADDR16_LO_DS:
4539         case R_PPC64_ADDR24:
4540         case R_PPC64_ADDR32:
4541         case R_PPC64_UADDR16:
4542         case R_PPC64_UADDR32:
4543         case R_PPC64_UADDR64:
4544         case R_PPC64_TOC:
4545           if (h != NULL && !info->shared)
4546             /* We may need a copy reloc.  */
4547             h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
4548
4549           /* Don't propagate .opd relocs.  */
4550           if (NO_OPD_RELOCS && opd_sym_map != NULL)
4551             break;
4552
4553           /* If we are creating a shared library, and this is a reloc
4554              against a global symbol, or a non PC relative reloc
4555              against a local symbol, then we need to copy the reloc
4556              into the shared library.  However, if we are linking with
4557              -Bsymbolic, we do not need to copy a reloc against a
4558              global symbol which is defined in an object we are
4559              including in the link (i.e., DEF_REGULAR is set).  At
4560              this point we have not seen all the input files, so it is
4561              possible that DEF_REGULAR is not set now but will be set
4562              later (it is never cleared).  In case of a weak definition,
4563              DEF_REGULAR may be cleared later by a strong definition in
4564              a shared library.  We account for that possibility below by
4565              storing information in the dyn_relocs field of the hash
4566              table entry.  A similar situation occurs when creating
4567              shared libraries and symbol visibility changes render the
4568              symbol local.
4569
4570              If on the other hand, we are creating an executable, we
4571              may need to keep relocations for symbols satisfied by a
4572              dynamic library if we manage to avoid copy relocs for the
4573              symbol.  */
4574         dodyn:
4575           if ((info->shared
4576                && (MUST_BE_DYN_RELOC (r_type)
4577                    || (h != NULL
4578                        && (! info->symbolic
4579                            || h->root.type == bfd_link_hash_defweak
4580                            || (h->elf_link_hash_flags
4581                                & ELF_LINK_HASH_DEF_REGULAR) == 0))))
4582               || (ELIMINATE_COPY_RELOCS
4583                   && !info->shared
4584                   && h != NULL
4585                   && (h->root.type == bfd_link_hash_defweak
4586                       || (h->elf_link_hash_flags
4587                           & ELF_LINK_HASH_DEF_REGULAR) == 0)))
4588             {
4589               struct ppc_dyn_relocs *p;
4590               struct ppc_dyn_relocs **head;
4591
4592               /* We must copy these reloc types into the output file.
4593                  Create a reloc section in dynobj and make room for
4594                  this reloc.  */
4595               if (sreloc == NULL)
4596                 {
4597                   const char *name;
4598                   bfd *dynobj;
4599
4600                   name = (bfd_elf_string_from_elf_section
4601                           (abfd,
4602                            elf_elfheader (abfd)->e_shstrndx,
4603                            elf_section_data (sec)->rel_hdr.sh_name));
4604                   if (name == NULL)
4605                     return FALSE;
4606
4607                   if (strncmp (name, ".rela", 5) != 0
4608                       || strcmp (bfd_get_section_name (abfd, sec),
4609                                  name + 5) != 0)
4610                     {
4611                       (*_bfd_error_handler)
4612                         (_("%B: bad relocation section name `%s\'"),
4613                          abfd, name);
4614                       bfd_set_error (bfd_error_bad_value);
4615                     }
4616
4617                   dynobj = htab->elf.dynobj;
4618                   sreloc = bfd_get_section_by_name (dynobj, name);
4619                   if (sreloc == NULL)
4620                     {
4621                       flagword flags;
4622
4623                       sreloc = bfd_make_section (dynobj, name);
4624                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
4625                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4626                       if ((sec->flags & SEC_ALLOC) != 0)
4627                         flags |= SEC_ALLOC | SEC_LOAD;
4628                       if (sreloc == NULL
4629                           || ! bfd_set_section_flags (dynobj, sreloc, flags)
4630                           || ! bfd_set_section_alignment (dynobj, sreloc, 3))
4631                         return FALSE;
4632                     }
4633                   elf_section_data (sec)->sreloc = sreloc;
4634                 }
4635
4636               /* If this is a global symbol, we count the number of
4637                  relocations we need for this symbol.  */
4638               if (h != NULL)
4639                 {
4640                   head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
4641                 }
4642               else
4643                 {
4644                   /* Track dynamic relocs needed for local syms too.
4645                      We really need local syms available to do this
4646                      easily.  Oh well.  */
4647
4648                   asection *s;
4649                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
4650                                                  sec, r_symndx);
4651                   if (s == NULL)
4652                     return FALSE;
4653
4654                   head = ((struct ppc_dyn_relocs **)
4655                           &elf_section_data (s)->local_dynrel);
4656                 }
4657
4658               p = *head;
4659               if (p == NULL || p->sec != sec)
4660                 {
4661                   p = bfd_alloc (htab->elf.dynobj, sizeof *p);
4662                   if (p == NULL)
4663                     return FALSE;
4664                   p->next = *head;
4665                   *head = p;
4666                   p->sec = sec;
4667                   p->count = 0;
4668                   p->pc_count = 0;
4669                 }
4670
4671               p->count += 1;
4672               if (!MUST_BE_DYN_RELOC (r_type))
4673                 p->pc_count += 1;
4674             }
4675           break;
4676
4677         default:
4678           break;
4679         }
4680     }
4681
4682   return TRUE;
4683 }
4684
4685 /* OFFSET in OPD_SEC specifies a function descriptor.  Return the address
4686    of the code entry point, and its section.  */
4687
4688 static bfd_vma
4689 opd_entry_value (asection *opd_sec,
4690                  bfd_vma offset,
4691                  asection **code_sec,
4692                  bfd_vma *code_off)
4693 {
4694   bfd *opd_bfd = opd_sec->owner;
4695   Elf_Internal_Rela *lo, *hi, *look;
4696
4697   /* Go find the opd reloc at the sym address.  */
4698   lo = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
4699   BFD_ASSERT (lo != NULL);
4700   hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
4701
4702   while (lo < hi)
4703     {
4704       look = lo + (hi - lo) / 2;
4705       if (look->r_offset < offset)
4706         lo = look + 1;
4707       else if (look->r_offset > offset)
4708         hi = look;
4709       else
4710         {
4711           Elf_Internal_Shdr *symtab_hdr = &elf_tdata (opd_bfd)->symtab_hdr;
4712           if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
4713               && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
4714             {
4715               unsigned long symndx = ELF64_R_SYM (look->r_info);
4716               bfd_vma val;
4717               asection *sec;
4718
4719               if (symndx < symtab_hdr->sh_info)
4720                 {
4721                   Elf_Internal_Sym *sym;
4722
4723                   sym = (Elf_Internal_Sym *) symtab_hdr->contents;
4724                   if (sym == NULL)
4725                     {
4726                       sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
4727                                                   symtab_hdr->sh_info,
4728                                                   0, NULL, NULL, NULL);
4729                       if (sym == NULL)
4730                         return (bfd_vma) -1;
4731                       symtab_hdr->contents = (bfd_byte *) sym;
4732                     }
4733
4734                   sym += symndx;
4735                   val = sym->st_value;
4736                   sec = NULL;
4737                   if ((sym->st_shndx != SHN_UNDEF
4738                        && sym->st_shndx < SHN_LORESERVE)
4739                       || sym->st_shndx > SHN_HIRESERVE)
4740                     sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
4741                   BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
4742                 }
4743               else
4744                 {
4745                   struct elf_link_hash_entry **sym_hashes;
4746                   struct elf_link_hash_entry *rh;
4747
4748                   sym_hashes = elf_sym_hashes (opd_bfd);
4749                   rh = sym_hashes[symndx - symtab_hdr->sh_info];
4750                   while (rh->root.type == bfd_link_hash_indirect
4751                          || rh->root.type == bfd_link_hash_warning)
4752                     rh = ((struct elf_link_hash_entry *) rh->root.u.i.link);
4753                   BFD_ASSERT (rh->root.type == bfd_link_hash_defined
4754                               || rh->root.type == bfd_link_hash_defweak);
4755                   val = rh->root.u.def.value;
4756                   sec = rh->root.u.def.section;
4757                 }
4758               val += look->r_addend;
4759               if (code_off != NULL)
4760                 *code_off = val;
4761               if (code_sec != NULL)
4762                 *code_sec = sec;
4763               if (sec != NULL && sec->output_section != NULL)
4764                 val += sec->output_section->vma + sec->output_offset;
4765               return val;
4766             }
4767           break;
4768         }
4769     }
4770   return (bfd_vma) -1;
4771 }
4772
4773 /* Return the section that should be marked against GC for a given
4774    relocation.  */
4775
4776 static asection *
4777 ppc64_elf_gc_mark_hook (asection *sec,
4778                         struct bfd_link_info *info,
4779                         Elf_Internal_Rela *rel,
4780                         struct elf_link_hash_entry *h,
4781                         Elf_Internal_Sym *sym)
4782 {
4783   asection *rsec;
4784
4785   /* First mark all our entry sym sections.  */
4786   if (info->gc_sym_list != NULL)
4787     {
4788       struct ppc_link_hash_table *htab = ppc_hash_table (info);
4789       struct bfd_sym_chain *sym = info->gc_sym_list;
4790
4791       info->gc_sym_list = NULL;
4792       do
4793         {
4794           struct ppc_link_hash_entry *eh;
4795
4796           eh = (struct ppc_link_hash_entry *)
4797             elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, FALSE);
4798           if (eh == NULL)
4799             continue;
4800           if (eh->elf.root.type != bfd_link_hash_defined
4801               && eh->elf.root.type != bfd_link_hash_defweak)
4802             continue;
4803
4804           if (eh->is_func_descriptor)
4805             rsec = eh->oh->elf.root.u.def.section;
4806           else if (get_opd_info (eh->elf.root.u.def.section) != NULL
4807                    && opd_entry_value (eh->elf.root.u.def.section,
4808                                        eh->elf.root.u.def.value,
4809                                        &rsec, NULL) != (bfd_vma) -1)
4810             ;
4811           else
4812             continue;
4813
4814           if (!rsec->gc_mark)
4815             _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4816
4817           rsec = eh->elf.root.u.def.section;
4818           if (!rsec->gc_mark)
4819             _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4820
4821           sym = sym->next;
4822         }
4823       while (sym != NULL);
4824     }
4825
4826   /* Syms return NULL if we're marking .opd, so we avoid marking all
4827      function sections, as all functions are referenced in .opd.  */
4828   rsec = NULL;
4829   if (get_opd_info (sec) != NULL)
4830     return rsec;
4831
4832   if (h != NULL)
4833     {
4834       enum elf_ppc64_reloc_type r_type;
4835       struct ppc_link_hash_entry *eh;
4836
4837       r_type = ELF64_R_TYPE (rel->r_info);
4838       switch (r_type)
4839         {
4840         case R_PPC64_GNU_VTINHERIT:
4841         case R_PPC64_GNU_VTENTRY:
4842           break;
4843
4844         default:
4845           switch (h->root.type)
4846             {
4847             case bfd_link_hash_defined:
4848             case bfd_link_hash_defweak:
4849               eh = (struct ppc_link_hash_entry *) h;
4850               if (eh->oh != NULL && eh->oh->is_func_descriptor)
4851                 eh = eh->oh;
4852
4853               /* Function descriptor syms cause the associated
4854                  function code sym section to be marked.  */
4855               if (eh->is_func_descriptor)
4856                 {
4857                   /* They also mark their opd section.  */
4858                   if (!eh->elf.root.u.def.section->gc_mark)
4859                     _bfd_elf_gc_mark (info, eh->elf.root.u.def.section,
4860                                       ppc64_elf_gc_mark_hook);
4861
4862                   rsec = eh->oh->elf.root.u.def.section;
4863                 }
4864               else if (get_opd_info (eh->elf.root.u.def.section) != NULL
4865                        && opd_entry_value (eh->elf.root.u.def.section,
4866                                            eh->elf.root.u.def.value,
4867                                            &rsec, NULL) != (bfd_vma) -1)
4868                 {
4869                   if (!eh->elf.root.u.def.section->gc_mark)
4870                     _bfd_elf_gc_mark (info, eh->elf.root.u.def.section,
4871                                       ppc64_elf_gc_mark_hook);
4872                 }
4873               else
4874                 rsec = h->root.u.def.section;
4875               break;
4876
4877             case bfd_link_hash_common:
4878               rsec = h->root.u.c.p->section;
4879               break;
4880
4881             default:
4882               break;
4883             }
4884         }
4885     }
4886   else
4887     {
4888       asection **opd_sym_section;
4889
4890       rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
4891       opd_sym_section = get_opd_info (rsec);
4892       if (opd_sym_section != NULL)
4893         {
4894           if (!rsec->gc_mark)
4895             _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4896
4897           rsec = opd_sym_section[sym->st_value / 8];
4898         }
4899     }
4900
4901   return rsec;
4902 }
4903
4904 /* Update the .got, .plt. and dynamic reloc reference counts for the
4905    section being removed.  */
4906
4907 static bfd_boolean
4908 ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
4909                          asection *sec, const Elf_Internal_Rela *relocs)
4910 {
4911   struct ppc_link_hash_table *htab;
4912   Elf_Internal_Shdr *symtab_hdr;
4913   struct elf_link_hash_entry **sym_hashes;
4914   struct got_entry **local_got_ents;
4915   const Elf_Internal_Rela *rel, *relend;
4916
4917   if ((sec->flags & SEC_ALLOC) == 0)
4918     return TRUE;
4919
4920   elf_section_data (sec)->local_dynrel = NULL;
4921
4922   htab = ppc_hash_table (info);
4923   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4924   sym_hashes = elf_sym_hashes (abfd);
4925   local_got_ents = elf_local_got_ents (abfd);
4926
4927   relend = relocs + sec->reloc_count;
4928   for (rel = relocs; rel < relend; rel++)
4929     {
4930       unsigned long r_symndx;
4931       enum elf_ppc64_reloc_type r_type;
4932       struct elf_link_hash_entry *h = NULL;
4933       char tls_type = 0;
4934
4935       r_symndx = ELF64_R_SYM (rel->r_info);
4936       r_type = ELF64_R_TYPE (rel->r_info);
4937       if (r_symndx >= symtab_hdr->sh_info)
4938         {
4939           struct ppc_link_hash_entry *eh;
4940           struct ppc_dyn_relocs **pp;
4941           struct ppc_dyn_relocs *p;
4942
4943           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4944           eh = (struct ppc_link_hash_entry *) h;
4945
4946           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
4947             if (p->sec == sec)
4948               {
4949                 /* Everything must go for SEC.  */
4950                 *pp = p->next;
4951                 break;
4952               }
4953         }
4954
4955       switch (r_type)
4956         {
4957         case R_PPC64_GOT_TLSLD16:
4958         case R_PPC64_GOT_TLSLD16_LO:
4959         case R_PPC64_GOT_TLSLD16_HI:
4960         case R_PPC64_GOT_TLSLD16_HA:
4961           ppc64_tlsld_got (abfd)->refcount -= 1;
4962           tls_type = TLS_TLS | TLS_LD;
4963           goto dogot;
4964
4965         case R_PPC64_GOT_TLSGD16:
4966         case R_PPC64_GOT_TLSGD16_LO:
4967         case R_PPC64_GOT_TLSGD16_HI:
4968         case R_PPC64_GOT_TLSGD16_HA:
4969           tls_type = TLS_TLS | TLS_GD;
4970           goto dogot;
4971
4972         case R_PPC64_GOT_TPREL16_DS:
4973         case R_PPC64_GOT_TPREL16_LO_DS:
4974         case R_PPC64_GOT_TPREL16_HI:
4975         case R_PPC64_GOT_TPREL16_HA:
4976           tls_type = TLS_TLS | TLS_TPREL;
4977           goto dogot;
4978
4979         case R_PPC64_GOT_DTPREL16_DS:
4980         case R_PPC64_GOT_DTPREL16_LO_DS:
4981         case R_PPC64_GOT_DTPREL16_HI:
4982         case R_PPC64_GOT_DTPREL16_HA:
4983           tls_type = TLS_TLS | TLS_DTPREL;
4984           goto dogot;
4985
4986         case R_PPC64_GOT16:
4987         case R_PPC64_GOT16_DS:
4988         case R_PPC64_GOT16_HA:
4989         case R_PPC64_GOT16_HI:
4990         case R_PPC64_GOT16_LO:
4991         case R_PPC64_GOT16_LO_DS:
4992         dogot:
4993           {
4994             struct got_entry *ent;
4995
4996             if (h != NULL)
4997               ent = h->got.glist;
4998             else
4999               ent = local_got_ents[r_symndx];
5000
5001             for (; ent != NULL; ent = ent->next)
5002               if (ent->addend == rel->r_addend
5003                   && ent->owner == abfd
5004                   && ent->tls_type == tls_type)
5005                 break;
5006             if (ent == NULL)
5007               abort ();
5008             if (ent->got.refcount > 0)
5009               ent->got.refcount -= 1;
5010           }
5011           break;
5012
5013         case R_PPC64_PLT16_HA:
5014         case R_PPC64_PLT16_HI:
5015         case R_PPC64_PLT16_LO:
5016         case R_PPC64_PLT32:
5017         case R_PPC64_PLT64:
5018         case R_PPC64_REL14:
5019         case R_PPC64_REL14_BRNTAKEN:
5020         case R_PPC64_REL14_BRTAKEN:
5021         case R_PPC64_REL24:
5022           if (h != NULL)
5023             {
5024               struct plt_entry *ent;
5025
5026               for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5027                 if (ent->addend == rel->r_addend)
5028                   break;
5029               if (ent == NULL)
5030                 abort ();
5031               if (ent->plt.refcount > 0)
5032                 ent->plt.refcount -= 1;
5033             }
5034           break;
5035
5036         default:
5037           break;
5038         }
5039     }
5040   return TRUE;
5041 }
5042
5043 /* The maximum size of .sfpr.  */
5044 #define SFPR_MAX (218*4)
5045
5046 struct sfpr_def_parms
5047 {
5048   const char name[12];
5049   unsigned char lo, hi;
5050   bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
5051   bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
5052 };
5053
5054 /* Auto-generate _save*, _rest* functions in .sfpr.  */
5055
5056 static unsigned int
5057 sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
5058 {
5059   struct ppc_link_hash_table *htab = ppc_hash_table (info);
5060   unsigned int i;
5061   size_t len = strlen (parm->name);
5062   bfd_boolean writing = FALSE;
5063   char sym[16];
5064
5065   memcpy (sym, parm->name, len);
5066   sym[len + 2] = 0;
5067
5068   for (i = parm->lo; i <= parm->hi; i++)
5069     {
5070       struct elf_link_hash_entry *h;
5071
5072       sym[len + 0] = i / 10 + '0';
5073       sym[len + 1] = i % 10 + '0';
5074       h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
5075       if (h != NULL
5076           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
5077         {
5078           h->root.type = bfd_link_hash_defined;
5079           h->root.u.def.section = htab->sfpr;
5080           h->root.u.def.value = htab->sfpr->size;
5081           h->type = STT_FUNC;
5082           h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
5083           _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
5084           writing = TRUE;
5085           if (htab->sfpr->contents == NULL)
5086             {
5087               htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
5088               if (htab->sfpr->contents == NULL)
5089                 return FALSE;
5090             }
5091         }
5092       if (writing)
5093         {
5094           bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
5095           if (i != parm->hi)
5096             p = (*parm->write_ent) (htab->elf.dynobj, p, i);
5097           else
5098             p = (*parm->write_tail) (htab->elf.dynobj, p, i);
5099           htab->sfpr->size = p - htab->sfpr->contents;
5100         }
5101     }
5102
5103   return TRUE;
5104 }
5105
5106 static bfd_byte *
5107 savegpr0 (bfd *abfd, bfd_byte *p, int r)
5108 {
5109   bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5110   return p + 4;
5111 }
5112
5113 static bfd_byte *
5114 savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
5115 {
5116   p = savegpr0 (abfd, p, r);
5117   bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
5118   p = p + 4;
5119   bfd_put_32 (abfd, BLR, p);
5120   return p + 4;
5121 }
5122
5123 static bfd_byte *
5124 restgpr0 (bfd *abfd, bfd_byte *p, int r)
5125 {
5126   bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5127   return p + 4;
5128 }
5129
5130 static bfd_byte *
5131 restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
5132 {
5133   bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
5134   p = p + 4;
5135   p = restgpr0 (abfd, p, r);
5136   bfd_put_32 (abfd, MTLR_R0, p);
5137   p = p + 4;
5138   if (r == 29)
5139     {
5140       p = restgpr0 (abfd, p, 30);
5141       p = restgpr0 (abfd, p, 31);
5142     }
5143   bfd_put_32 (abfd, BLR, p);
5144   return p + 4;
5145 }
5146
5147 static bfd_byte *
5148 savegpr1 (bfd *abfd, bfd_byte *p, int r)
5149 {
5150   bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5151   return p + 4;
5152 }
5153
5154 static bfd_byte *
5155 savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
5156 {
5157   p = savegpr1 (abfd, p, r);
5158   bfd_put_32 (abfd, BLR, p);
5159   return p + 4;
5160 }
5161
5162 static bfd_byte *
5163 restgpr1 (bfd *abfd, bfd_byte *p, int r)
5164 {
5165   bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5166   return p + 4;
5167 }
5168
5169 static bfd_byte *
5170 restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
5171 {
5172   p = restgpr1 (abfd, p, r);
5173   bfd_put_32 (abfd, BLR, p);
5174   return p + 4;
5175 }
5176
5177 static bfd_byte *
5178 savefpr (bfd *abfd, bfd_byte *p, int r)
5179 {
5180   bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5181   return p + 4;
5182 }
5183
5184 static bfd_byte *
5185 savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
5186 {
5187   p = savefpr (abfd, p, r);
5188   bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
5189   p = p + 4;
5190   bfd_put_32 (abfd, BLR, p);
5191   return p + 4;
5192 }
5193
5194 static bfd_byte *
5195 restfpr (bfd *abfd, bfd_byte *p, int r)
5196 {
5197   bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5198   return p + 4;
5199 }
5200
5201 static bfd_byte *
5202 restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
5203 {
5204   bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
5205   p = p + 4;
5206   p = restfpr (abfd, p, r);
5207   bfd_put_32 (abfd, MTLR_R0, p);
5208   p = p + 4;
5209   if (r == 29)
5210     {
5211       p = restfpr (abfd, p, 30);
5212       p = restfpr (abfd, p, 31);
5213     }
5214   bfd_put_32 (abfd, BLR, p);
5215   return p + 4;
5216 }
5217
5218 static bfd_byte *
5219 savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
5220 {
5221   p = savefpr (abfd, p, r);
5222   bfd_put_32 (abfd, BLR, p);
5223   return p + 4;
5224 }
5225
5226 static bfd_byte *
5227 restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
5228 {
5229   p = restfpr (abfd, p, r);
5230   bfd_put_32 (abfd, BLR, p);
5231   return p + 4;
5232 }
5233
5234 static bfd_byte *
5235 savevr (bfd *abfd, bfd_byte *p, int r)
5236 {
5237   bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
5238   p = p + 4;
5239   bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
5240   return p + 4;
5241 }
5242
5243 static bfd_byte *
5244 savevr_tail (bfd *abfd, bfd_byte *p, int r)
5245 {
5246   p = savevr (abfd, p, r);
5247   bfd_put_32 (abfd, BLR, p);
5248   return p + 4;
5249 }
5250
5251 static bfd_byte *
5252 restvr (bfd *abfd, bfd_byte *p, int r)
5253 {
5254   bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
5255   p = p + 4;
5256   bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
5257   return p + 4;
5258 }
5259
5260 static bfd_byte *
5261 restvr_tail (bfd *abfd, bfd_byte *p, int r)
5262 {
5263   p = restvr (abfd, p, r);
5264   bfd_put_32 (abfd, BLR, p);
5265   return p + 4;
5266 }
5267
5268 /* Called via elf_link_hash_traverse to transfer dynamic linking
5269    information on function code symbol entries to their corresponding
5270    function descriptor symbol entries.  */
5271
5272 static bfd_boolean
5273 func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5274 {
5275   struct bfd_link_info *info;
5276   struct ppc_link_hash_table *htab;
5277   struct plt_entry *ent;
5278   struct ppc_link_hash_entry *fh;
5279   struct ppc_link_hash_entry *fdh;
5280   bfd_boolean force_local;
5281
5282   fh = (struct ppc_link_hash_entry *) h;
5283   if (fh->elf.root.type == bfd_link_hash_indirect)
5284     return TRUE;
5285
5286   if (fh->elf.root.type == bfd_link_hash_warning)
5287     fh = (struct ppc_link_hash_entry *) fh->elf.root.u.i.link;
5288
5289   info = inf;
5290   htab = ppc_hash_table (info);
5291
5292   /* Resolve undefined references to dot-symbols as the value
5293      in the function descriptor, if we have one in a regular object.
5294      This is to satisfy cases like ".quad .foo".  Calls to functions
5295      in dynamic objects are handled elsewhere.  */
5296   if (fh->elf.root.type == bfd_link_hash_undefweak
5297       && fh->was_undefined
5298       && (fh->oh->elf.root.type == bfd_link_hash_defined
5299           || fh->oh->elf.root.type == bfd_link_hash_defweak)
5300       && get_opd_info (fh->oh->elf.root.u.def.section) != NULL
5301       && opd_entry_value (fh->oh->elf.root.u.def.section,
5302                           fh->oh->elf.root.u.def.value,
5303                           &fh->elf.root.u.def.section,
5304                           &fh->elf.root.u.def.value) != (bfd_vma) -1)
5305     {
5306       fh->elf.root.type = fh->oh->elf.root.type;
5307       fh->elf.elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
5308     }
5309
5310   /* If this is a function code symbol, transfer dynamic linking
5311      information to the function descriptor symbol.  */
5312   if (!fh->is_func)
5313     return TRUE;
5314
5315   for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
5316     if (ent->plt.refcount > 0)
5317       break;
5318   if (ent == NULL
5319       || fh->elf.root.root.string[0] != '.'
5320       || fh->elf.root.root.string[1] == '\0')
5321     return TRUE;
5322
5323   /* Find the corresponding function descriptor symbol.  Create it
5324      as undefined if necessary.  */
5325
5326   fdh = get_fdh (fh, htab);
5327   if (fdh != NULL)
5328     while (fdh->elf.root.type == bfd_link_hash_indirect
5329            || fdh->elf.root.type == bfd_link_hash_warning)
5330       fdh = (struct ppc_link_hash_entry *) fdh->elf.root.u.i.link;
5331
5332   if (fdh == NULL
5333       && info->shared
5334       && (fh->elf.root.type == bfd_link_hash_undefined
5335           || fh->elf.root.type == bfd_link_hash_undefweak))
5336     {
5337       bfd *abfd;
5338       asymbol *newsym;
5339       struct bfd_link_hash_entry *bh;
5340
5341       abfd = fh->elf.root.u.undef.abfd;
5342       newsym = bfd_make_empty_symbol (abfd);
5343       newsym->name = fh->elf.root.root.string + 1;
5344       newsym->section = bfd_und_section_ptr;
5345       newsym->value = 0;
5346       newsym->flags = BSF_OBJECT;
5347       if (fh->elf.root.type == bfd_link_hash_undefweak)
5348         newsym->flags |= BSF_WEAK;
5349
5350       bh = &fdh->elf.root;
5351       if ( !(_bfd_generic_link_add_one_symbol
5352              (info, abfd, newsym->name, newsym->flags,
5353               newsym->section, newsym->value, NULL, FALSE, FALSE, &bh)))
5354         {
5355           return FALSE;
5356         }
5357       fdh = (struct ppc_link_hash_entry *) bh;
5358       fdh->elf.elf_link_hash_flags &= ~ELF_LINK_NON_ELF;
5359       fdh->elf.size = 24;
5360       fdh->elf.type = STT_OBJECT;
5361     }
5362
5363   if (fdh != NULL
5364       && (fdh->elf.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0
5365       && (info->shared
5366           || (fdh->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
5367           || (fdh->elf.elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
5368           || (fdh->elf.root.type == bfd_link_hash_undefweak
5369               && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
5370     {
5371       if (fdh->elf.dynindx == -1)
5372         if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
5373           return FALSE;
5374       fdh->elf.elf_link_hash_flags
5375         |= (fh->elf.elf_link_hash_flags & (ELF_LINK_HASH_REF_REGULAR
5376                                       | ELF_LINK_HASH_REF_DYNAMIC
5377                                       | ELF_LINK_HASH_REF_REGULAR_NONWEAK
5378                                       | ELF_LINK_NON_GOT_REF));
5379       if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
5380         {
5381           struct plt_entry **ep = &fdh->elf.plt.plist;
5382           while (*ep != NULL)
5383             ep = &(*ep)->next;
5384           *ep = fh->elf.plt.plist;
5385           fh->elf.plt.plist = NULL;
5386           fdh->elf.elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
5387         }
5388       fdh->is_func_descriptor = 1;
5389       fdh->oh = fh;
5390       fh->oh = fdh;
5391     }
5392
5393   /* Now that the info is on the function descriptor, clear the
5394      function code sym info.  Any function code syms for which we
5395      don't have a definition in a regular file, we force local.
5396      This prevents a shared library from exporting syms that have
5397      been imported from another library.  Function code syms that
5398      are really in the library we must leave global to prevent the
5399      linker dragging in a definition from a static library.  */
5400   force_local
5401     = (info->shared
5402        && ((fh->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
5403            || fdh == NULL
5404            || (fdh->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
5405            || (fdh->elf.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0));
5406   _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
5407
5408   return TRUE;
5409 }
5410
5411 /* Called near the start of bfd_elf_size_dynamic_sections.  We use
5412    this hook to a) provide some gcc support functions, and b) transfer
5413    dynamic linking information gathered so far on function code symbol
5414    entries, to their corresponding function descriptor symbol entries.  */
5415
5416 static bfd_boolean
5417 ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
5418                             struct bfd_link_info *info)
5419 {
5420   struct ppc_link_hash_table *htab;
5421   unsigned int i;
5422   const struct sfpr_def_parms funcs[] =
5423     {
5424       { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
5425       { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
5426       { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
5427       { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
5428       { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
5429       { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
5430       { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
5431       { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
5432       { "._savef", 14, 31, savefpr, savefpr1_tail },
5433       { "._restf", 14, 31, restfpr, restfpr1_tail },
5434       { "_savevr_", 20, 31, savevr, savevr_tail },
5435       { "_restvr_", 20, 31, restvr, restvr_tail }
5436     };
5437
5438   htab = ppc_hash_table (info);
5439   if (htab->sfpr == NULL)
5440     /* We don't have any relocs.  */
5441     return TRUE;
5442
5443   /* Provide any missing _save* and _rest* functions.  */
5444   htab->sfpr->size = 0;
5445   for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
5446     if (!sfpr_define (info, &funcs[i]))
5447       return FALSE;
5448
5449   elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
5450
5451   if (htab->sfpr->size == 0)
5452     _bfd_strip_section_from_output (info, htab->sfpr);
5453
5454   return TRUE;
5455 }
5456
5457 /* Adjust a symbol defined by a dynamic object and referenced by a
5458    regular object.  The current definition is in some section of the
5459    dynamic object, but we're not including those sections.  We have to
5460    change the definition to something the rest of the link can
5461    understand.  */
5462
5463 static bfd_boolean
5464 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
5465                                  struct elf_link_hash_entry *h)
5466 {
5467   struct ppc_link_hash_table *htab;
5468   asection *s;
5469   unsigned int power_of_two;
5470
5471   htab = ppc_hash_table (info);
5472
5473   /* Deal with function syms.  */
5474   if (h->type == STT_FUNC
5475       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
5476     {
5477       /* Clear procedure linkage table information for any symbol that
5478          won't need a .plt entry.  */
5479       struct plt_entry *ent;
5480       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5481         if (ent->plt.refcount > 0)
5482           break;
5483       if (ent == NULL
5484           || SYMBOL_CALLS_LOCAL (info, h)
5485           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5486               && h->root.type == bfd_link_hash_undefweak))
5487         {
5488           h->plt.plist = NULL;
5489           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
5490         }
5491     }
5492   else
5493     h->plt.plist = NULL;
5494
5495   /* If this is a weak symbol, and there is a real definition, the
5496      processor independent code will have arranged for us to see the
5497      real definition first, and we can just use the same value.  */
5498   if (h->weakdef != NULL)
5499     {
5500       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
5501                   || h->weakdef->root.type == bfd_link_hash_defweak);
5502       h->root.u.def.section = h->weakdef->root.u.def.section;
5503       h->root.u.def.value = h->weakdef->root.u.def.value;
5504       if (ELIMINATE_COPY_RELOCS)
5505         h->elf_link_hash_flags
5506           = ((h->elf_link_hash_flags & ~ELF_LINK_NON_GOT_REF)
5507              | (h->weakdef->elf_link_hash_flags & ELF_LINK_NON_GOT_REF));
5508       return TRUE;
5509     }
5510
5511   /* If we are creating a shared library, we must presume that the
5512      only references to the symbol are via the global offset table.
5513      For such cases we need not do anything here; the relocations will
5514      be handled correctly by relocate_section.  */
5515   if (info->shared)
5516     return TRUE;
5517
5518   /* If there are no references to this symbol that do not use the
5519      GOT, we don't need to generate a copy reloc.  */
5520   if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
5521     return TRUE;
5522
5523   if (ELIMINATE_COPY_RELOCS)
5524     {
5525       struct ppc_link_hash_entry * eh;
5526       struct ppc_dyn_relocs *p;
5527
5528       eh = (struct ppc_link_hash_entry *) h;
5529       for (p = eh->dyn_relocs; p != NULL; p = p->next)
5530         {
5531           s = p->sec->output_section;
5532           if (s != NULL && (s->flags & SEC_READONLY) != 0)
5533             break;
5534         }
5535
5536       /* If we didn't find any dynamic relocs in read-only sections, then
5537          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
5538       if (p == NULL)
5539         {
5540           h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
5541           return TRUE;
5542         }
5543     }
5544
5545   if (h->plt.plist != NULL)
5546     {
5547       /* We should never get here, but unfortunately there are versions
5548          of gcc out there that improperly (for this ABI) put initialized
5549          function pointers, vtable refs and suchlike in read-only
5550          sections.  Allow them to proceed, but warn that this might
5551          break at runtime.  */
5552       (*_bfd_error_handler)
5553         (_("copy reloc against `%s' requires lazy plt linking; "
5554            "avoid setting LD_BIND_NOW=1 or upgrade gcc"),
5555          h->root.root.string);
5556     }
5557
5558   /* This is a reference to a symbol defined by a dynamic object which
5559      is not a function.  */
5560
5561   /* We must allocate the symbol in our .dynbss section, which will
5562      become part of the .bss section of the executable.  There will be
5563      an entry for this symbol in the .dynsym section.  The dynamic
5564      object will contain position independent code, so all references
5565      from the dynamic object to this symbol will go through the global
5566      offset table.  The dynamic linker will use the .dynsym entry to
5567      determine the address it must put in the global offset table, so
5568      both the dynamic object and the regular object will refer to the
5569      same memory location for the variable.  */
5570
5571   /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
5572      to copy the initial value out of the dynamic object and into the
5573      runtime process image.  We need to remember the offset into the
5574      .rela.bss section we are going to use.  */
5575   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5576     {
5577       htab->relbss->size += sizeof (Elf64_External_Rela);
5578       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
5579     }
5580
5581   /* We need to figure out the alignment required for this symbol.  I
5582      have no idea how ELF linkers handle this.  */
5583   power_of_two = bfd_log2 (h->size);
5584   if (power_of_two > 4)
5585     power_of_two = 4;
5586
5587   /* Apply the required alignment.  */
5588   s = htab->dynbss;
5589   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
5590   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
5591     {
5592       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
5593         return FALSE;
5594     }
5595
5596   /* Define the symbol as being at this point in the section.  */
5597   h->root.u.def.section = s;
5598   h->root.u.def.value = s->size;
5599
5600   /* Increment the section size to make room for the symbol.  */
5601   s->size += h->size;
5602
5603   return TRUE;
5604 }
5605
5606 /* If given a function descriptor symbol, hide both the function code
5607    sym and the descriptor.  */
5608 static void
5609 ppc64_elf_hide_symbol (struct bfd_link_info *info,
5610                        struct elf_link_hash_entry *h,
5611                        bfd_boolean force_local)
5612 {
5613   struct ppc_link_hash_entry *eh;
5614   _bfd_elf_link_hash_hide_symbol (info, h, force_local);
5615
5616   eh = (struct ppc_link_hash_entry *) h;
5617   if (eh->is_func_descriptor)
5618     {
5619       struct ppc_link_hash_entry *fh = eh->oh;
5620
5621       if (fh == NULL)
5622         {
5623           const char *p, *q;
5624           struct ppc_link_hash_table *htab;
5625           char save;
5626
5627           /* We aren't supposed to use alloca in BFD because on
5628              systems which do not have alloca the version in libiberty
5629              calls xmalloc, which might cause the program to crash
5630              when it runs out of memory.  This function doesn't have a
5631              return status, so there's no way to gracefully return an
5632              error.  So cheat.  We know that string[-1] can be safely
5633              accessed;  It's either a string in an ELF string table,
5634              or allocated in an objalloc structure.  */
5635
5636           p = eh->elf.root.root.string - 1;
5637           save = *p;
5638           *(char *) p = '.';
5639           htab = ppc_hash_table (info);
5640           fh = (struct ppc_link_hash_entry *)
5641             elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
5642           *(char *) p = save;
5643
5644           /* Unfortunately, if it so happens that the string we were
5645              looking for was allocated immediately before this string,
5646              then we overwrote the string terminator.  That's the only
5647              reason the lookup should fail.  */
5648           if (fh == NULL)
5649             {
5650               q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
5651               while (q >= eh->elf.root.root.string && *q == *p)
5652                 --q, --p;
5653               if (q < eh->elf.root.root.string && *p == '.')
5654                 fh = (struct ppc_link_hash_entry *)
5655                   elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
5656             }
5657           if (fh != NULL)
5658             {
5659               eh->oh = fh;
5660               fh->oh = eh;
5661             }
5662         }
5663       if (fh != NULL)
5664         _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
5665     }
5666 }
5667
5668 static bfd_boolean
5669 get_sym_h (struct elf_link_hash_entry **hp,
5670            Elf_Internal_Sym **symp,
5671            asection **symsecp,
5672            char **tls_maskp,
5673            Elf_Internal_Sym **locsymsp,
5674            unsigned long r_symndx,
5675            bfd *ibfd)
5676 {
5677   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5678
5679   if (r_symndx >= symtab_hdr->sh_info)
5680     {
5681       struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
5682       struct elf_link_hash_entry *h;
5683
5684       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5685       while (h->root.type == bfd_link_hash_indirect
5686              || h->root.type == bfd_link_hash_warning)
5687         h = (struct elf_link_hash_entry *) h->root.u.i.link;
5688
5689       if (hp != NULL)
5690         *hp = h;
5691
5692       if (symp != NULL)
5693         *symp = NULL;
5694
5695       if (symsecp != NULL)
5696         {
5697           asection *symsec = NULL;
5698           if (h->root.type == bfd_link_hash_defined
5699               || h->root.type == bfd_link_hash_defweak)
5700             symsec = h->root.u.def.section;
5701           *symsecp = symsec;
5702         }
5703
5704       if (tls_maskp != NULL)
5705         {
5706           struct ppc_link_hash_entry *eh;
5707
5708           eh = (struct ppc_link_hash_entry *) h;
5709           *tls_maskp = &eh->tls_mask;
5710         }
5711     }
5712   else
5713     {
5714       Elf_Internal_Sym *sym;
5715       Elf_Internal_Sym *locsyms = *locsymsp;
5716
5717       if (locsyms == NULL)
5718         {
5719           locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
5720           if (locsyms == NULL)
5721             locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
5722                                             symtab_hdr->sh_info,
5723                                             0, NULL, NULL, NULL);
5724           if (locsyms == NULL)
5725             return FALSE;
5726           *locsymsp = locsyms;
5727         }
5728       sym = locsyms + r_symndx;
5729
5730       if (hp != NULL)
5731         *hp = NULL;
5732
5733       if (symp != NULL)
5734         *symp = sym;
5735
5736       if (symsecp != NULL)
5737         {
5738           asection *symsec = NULL;
5739           if ((sym->st_shndx != SHN_UNDEF
5740                && sym->st_shndx < SHN_LORESERVE)
5741               || sym->st_shndx > SHN_HIRESERVE)
5742             symsec = bfd_section_from_elf_index (ibfd, sym->st_shndx);
5743           *symsecp = symsec;
5744         }
5745
5746       if (tls_maskp != NULL)
5747         {
5748           struct got_entry **lgot_ents;
5749           char *tls_mask;
5750
5751           tls_mask = NULL;
5752           lgot_ents = elf_local_got_ents (ibfd);
5753           if (lgot_ents != NULL)
5754             {
5755               char *lgot_masks = (char *) (lgot_ents + symtab_hdr->sh_info);
5756               tls_mask = &lgot_masks[r_symndx];
5757             }
5758           *tls_maskp = tls_mask;
5759         }
5760     }
5761   return TRUE;
5762 }
5763
5764 /* Returns TLS_MASKP for the given REL symbol.  Function return is 0 on
5765    error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
5766    type suitable for optimization, and 1 otherwise.  */
5767
5768 static int
5769 get_tls_mask (char **tls_maskp, unsigned long *toc_symndx,
5770               Elf_Internal_Sym **locsymsp,
5771               const Elf_Internal_Rela *rel, bfd *ibfd)
5772 {
5773   unsigned long r_symndx;
5774   int next_r;
5775   struct elf_link_hash_entry *h;
5776   Elf_Internal_Sym *sym;
5777   asection *sec;
5778   bfd_vma off;
5779
5780   r_symndx = ELF64_R_SYM (rel->r_info);
5781   if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
5782     return 0;
5783
5784   if ((*tls_maskp != NULL && **tls_maskp != 0)
5785       || sec == NULL
5786       || ppc64_elf_section_data (sec)->t_symndx == NULL)
5787     return 1;
5788
5789   /* Look inside a TOC section too.  */
5790   if (h != NULL)
5791     {
5792       BFD_ASSERT (h->root.type == bfd_link_hash_defined);
5793       off = h->root.u.def.value;
5794     }
5795   else
5796     off = sym->st_value;
5797   off += rel->r_addend;
5798   BFD_ASSERT (off % 8 == 0);
5799   r_symndx = ppc64_elf_section_data (sec)->t_symndx[off / 8];
5800   next_r = ppc64_elf_section_data (sec)->t_symndx[off / 8 + 1];
5801   if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
5802     return 0;
5803   if (toc_symndx != NULL)
5804     *toc_symndx = r_symndx;
5805   if ((h == NULL
5806        || ((h->root.type == bfd_link_hash_defined
5807             || h->root.type == bfd_link_hash_defweak)
5808            && !(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC)))
5809       && (next_r == -1 || next_r == -2))
5810     return 1 - next_r;
5811   return 1;
5812 }
5813
5814 /* Adjust all global syms defined in opd sections.  In gcc generated
5815    code for the old ABI, these will already have been done.  */
5816
5817 static bfd_boolean
5818 adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
5819 {
5820   struct ppc_link_hash_entry *eh;
5821   asection *sym_sec;
5822   long *opd_adjust;
5823
5824   if (h->root.type == bfd_link_hash_indirect)
5825     return TRUE;
5826
5827   if (h->root.type == bfd_link_hash_warning)
5828     h = (struct elf_link_hash_entry *) h->root.u.i.link;
5829
5830   if (h->root.type != bfd_link_hash_defined
5831       && h->root.type != bfd_link_hash_defweak)
5832     return TRUE;
5833
5834   eh = (struct ppc_link_hash_entry *) h;
5835   if (eh->adjust_done)
5836     return TRUE;
5837
5838   sym_sec = eh->elf.root.u.def.section;
5839   opd_adjust = get_opd_info (sym_sec);
5840   if (opd_adjust != NULL)
5841     {
5842       long adjust = opd_adjust[eh->elf.root.u.def.value / 8];
5843       if (adjust == -1)
5844         {
5845           /* This entry has been deleted.  */
5846           asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
5847           if (dsec == NULL)
5848             {
5849               for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
5850                 if (elf_discarded_section (dsec))
5851                   {
5852                     ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
5853                     break;
5854                   }
5855             }
5856           eh->elf.root.u.def.value = 0;
5857           eh->elf.root.u.def.section = dsec;
5858         }
5859       else
5860         eh->elf.root.u.def.value += adjust;
5861       eh->adjust_done = 1;
5862     }
5863   return TRUE;
5864 }
5865
5866 /* Remove unused Official Procedure Descriptor entries.  Currently we
5867    only remove those associated with functions in discarded link-once
5868    sections, or weakly defined functions that have been overridden.  It
5869    would be possible to remove many more entries for statically linked
5870    applications.  */
5871
5872 bfd_boolean
5873 ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info,
5874                     bfd_boolean non_overlapping)
5875 {
5876   bfd *ibfd;
5877   bfd_boolean some_edited = FALSE;
5878   asection *need_pad = NULL;
5879
5880   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
5881     {
5882       asection *sec;
5883       Elf_Internal_Rela *relstart, *rel, *relend;
5884       Elf_Internal_Shdr *symtab_hdr;
5885       Elf_Internal_Sym *local_syms;
5886       struct elf_link_hash_entry **sym_hashes;
5887       bfd_vma offset;
5888       bfd_size_type amt;
5889       long *opd_adjust;
5890       bfd_boolean need_edit, add_aux_fields;
5891       bfd_size_type cnt_16b = 0;
5892
5893       sec = bfd_get_section_by_name (ibfd, ".opd");
5894       if (sec == NULL)
5895         continue;
5896
5897       amt = sec->size * sizeof (long) / 8;
5898       opd_adjust = get_opd_info (sec);
5899       if (opd_adjust == NULL)
5900         {
5901           /* Must be a ld -r link.  ie. check_relocs hasn't been
5902              called.  */
5903           opd_adjust = bfd_zalloc (obfd, amt);
5904           ppc64_elf_section_data (sec)->opd.adjust = opd_adjust;
5905         }
5906       memset (opd_adjust, 0, amt);
5907
5908       if (sec->output_section == bfd_abs_section_ptr)
5909         continue;
5910
5911       /* Look through the section relocs.  */
5912       if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
5913         continue;
5914
5915       local_syms = NULL;
5916       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5917       sym_hashes = elf_sym_hashes (ibfd);
5918
5919       /* Read the relocations.  */
5920       relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
5921                                             info->keep_memory);
5922       if (relstart == NULL)
5923         return FALSE;
5924
5925       /* First run through the relocs to check they are sane, and to
5926          determine whether we need to edit this opd section.  */
5927       need_edit = FALSE;
5928       need_pad = sec;
5929       offset = 0;
5930       relend = relstart + sec->reloc_count;
5931       for (rel = relstart; rel < relend; )
5932         {
5933           enum elf_ppc64_reloc_type r_type;
5934           unsigned long r_symndx;
5935           asection *sym_sec;
5936           struct elf_link_hash_entry *h;
5937           Elf_Internal_Sym *sym;
5938
5939           /* .opd contains a regular array of 16 or 24 byte entries.  We're
5940              only interested in the reloc pointing to a function entry
5941              point.  */
5942           if (rel->r_offset != offset
5943               || rel + 1 >= relend
5944               || (rel + 1)->r_offset != offset + 8)
5945             {
5946               /* If someone messes with .opd alignment then after a
5947                  "ld -r" we might have padding in the middle of .opd.
5948                  Also, there's nothing to prevent someone putting
5949                  something silly in .opd with the assembler.  No .opd
5950                  optimization for them!  */
5951             broken_opd:
5952               (*_bfd_error_handler)
5953                 (_("%B: .opd is not a regular array of opd entries"), ibfd);
5954               need_edit = FALSE;
5955               break;
5956             }
5957
5958           if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
5959               || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
5960             {
5961               (*_bfd_error_handler)
5962                 (_("%B: unexpected reloc type %u in .opd section"),
5963                  ibfd, r_type);
5964               need_edit = FALSE;
5965               break;
5966             }
5967
5968           r_symndx = ELF64_R_SYM (rel->r_info);
5969           if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
5970                           r_symndx, ibfd))
5971             goto error_ret;
5972
5973           if (sym_sec == NULL || sym_sec->owner == NULL)
5974             {
5975               const char *sym_name;
5976               if (h != NULL)
5977                 sym_name = h->root.root.string;
5978               else
5979                 sym_name = bfd_elf_local_sym_name (ibfd, sym);
5980
5981               (*_bfd_error_handler)
5982                 (_("%B: undefined sym `%s' in .opd section"),
5983                  ibfd, sym_name);
5984               need_edit = FALSE;
5985               break;
5986             }
5987
5988           /* opd entries are always for functions defined in the
5989              current input bfd.  If the symbol isn't defined in the
5990              input bfd, then we won't be using the function in this
5991              bfd;  It must be defined in a linkonce section in another
5992              bfd, or is weak.  It's also possible that we are
5993              discarding the function due to a linker script /DISCARD/,
5994              which we test for via the output_section.  */
5995           if (sym_sec->owner != ibfd
5996               || sym_sec->output_section == bfd_abs_section_ptr)
5997             need_edit = TRUE;
5998
5999           rel += 2;
6000           if (rel == relend
6001               || (rel + 1 == relend && rel->r_offset == offset + 16))
6002             {
6003               if (sec->size == offset + 24)
6004                 {
6005                   need_pad = NULL;
6006                   break;
6007                 }
6008               if (rel == relend && sec->size == offset + 16)
6009                 {
6010                   cnt_16b++;
6011                   break;
6012                 }
6013               goto broken_opd;
6014             }
6015
6016           if (rel->r_offset == offset + 24)
6017             offset += 24;
6018           else if (rel->r_offset != offset + 16)
6019             goto broken_opd;
6020           else if (rel + 1 < relend
6021                    && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
6022                    && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
6023             {
6024               offset += 16;
6025               cnt_16b++;
6026             }
6027           else if (rel + 2 < relend
6028                    && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
6029                    && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
6030             {
6031               offset += 24;
6032               rel += 1;
6033             }
6034           else
6035             goto broken_opd;
6036         }
6037
6038       add_aux_fields = non_overlapping && cnt_16b > 0;
6039
6040       if (need_edit || add_aux_fields)
6041         {
6042           Elf_Internal_Rela *write_rel;
6043           bfd_byte *rptr, *wptr;
6044           bfd_byte *new_contents = NULL;
6045           bfd_boolean skip;
6046           long opd_ent_size;
6047
6048           /* This seems a waste of time as input .opd sections are all
6049              zeros as generated by gcc, but I suppose there's no reason
6050              this will always be so.  We might start putting something in
6051              the third word of .opd entries.  */
6052           if ((sec->flags & SEC_IN_MEMORY) == 0)
6053             {
6054               bfd_byte *loc;
6055               if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6056                 {
6057                   if (loc != NULL)
6058                     free (loc);
6059                 error_ret:
6060                   if (local_syms != NULL
6061                       && symtab_hdr->contents != (unsigned char *) local_syms)
6062                     free (local_syms);
6063                   if (elf_section_data (sec)->relocs != relstart)
6064                     free (relstart);
6065                   return FALSE;
6066                 }
6067               sec->contents = loc;
6068               sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
6069             }
6070
6071           elf_section_data (sec)->relocs = relstart;
6072
6073           wptr = sec->contents;
6074           rptr = sec->contents;
6075           new_contents = sec->contents;
6076
6077           if (add_aux_fields)
6078             {
6079               new_contents = bfd_malloc (sec->size + cnt_16b * 8);
6080               if (new_contents == NULL)
6081                 return FALSE;
6082               need_pad = FALSE;
6083               wptr = new_contents;
6084             }
6085
6086           write_rel = relstart;
6087           skip = FALSE;
6088           offset = 0;
6089           opd_ent_size = 0;
6090           for (rel = relstart; rel < relend; rel++)
6091             {
6092               unsigned long r_symndx;
6093               asection *sym_sec;
6094               struct elf_link_hash_entry *h;
6095               Elf_Internal_Sym *sym;
6096
6097               r_symndx = ELF64_R_SYM (rel->r_info);
6098               if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
6099                               r_symndx, ibfd))
6100                 goto error_ret;
6101
6102               if (rel->r_offset == offset)
6103                 {
6104                   struct ppc_link_hash_entry *fdh = NULL;
6105
6106                   /* See if the .opd entry is full 24 byte or
6107                      16 byte (with fd_aux entry overlapped with next
6108                      fd_func).  */
6109                   opd_ent_size = 24;
6110                   if ((rel + 2 == relend && sec->size == offset + 16)
6111                       || (rel + 3 < relend
6112                           && rel[2].r_offset == offset + 16
6113                           && rel[3].r_offset == offset + 24
6114                           && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
6115                           && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
6116                     opd_ent_size = 16;
6117
6118                   if (h != NULL
6119                       && h->root.root.string[0] == '.')
6120                     fdh = get_fdh ((struct ppc_link_hash_entry *) h,
6121                                    ppc_hash_table (info));
6122
6123                   skip = (sym_sec->owner != ibfd
6124                           || sym_sec->output_section == bfd_abs_section_ptr);
6125                   if (skip)
6126                     {
6127                       if (fdh != NULL && sym_sec->owner == ibfd)
6128                         {
6129                           /* Arrange for the function descriptor sym
6130                              to be dropped.  */
6131                           fdh->elf.root.u.def.value = 0;
6132                           fdh->elf.root.u.def.section = sym_sec;
6133                         }
6134                       opd_adjust[rel->r_offset / 8] = -1;
6135                     }
6136                   else
6137                     {
6138                       /* We'll be keeping this opd entry.  */
6139
6140                       if (fdh != NULL)
6141                         {
6142                           /* Redefine the function descriptor symbol to
6143                              this location in the opd section.  It is
6144                              necessary to update the value here rather
6145                              than using an array of adjustments as we do
6146                              for local symbols, because various places
6147                              in the generic ELF code use the value
6148                              stored in u.def.value.  */
6149                           fdh->elf.root.u.def.value = wptr - new_contents;
6150                           fdh->adjust_done = 1;
6151                         }
6152
6153                       /* Local syms are a bit tricky.  We could
6154                          tweak them as they can be cached, but
6155                          we'd need to look through the local syms
6156                          for the function descriptor sym which we
6157                          don't have at the moment.  So keep an
6158                          array of adjustments.  */
6159                       opd_adjust[rel->r_offset / 8]
6160                         = (wptr - new_contents) - (rptr - sec->contents);
6161
6162                       if (wptr != rptr)
6163                         memcpy (wptr, rptr, opd_ent_size);
6164                       wptr += opd_ent_size;
6165                       if (add_aux_fields && opd_ent_size == 16)
6166                         {
6167                           memset (wptr, '\0', 8);
6168                           wptr += 8;
6169                         }
6170                     }
6171                   rptr += opd_ent_size;
6172                   offset += opd_ent_size;
6173                 }
6174
6175               if (skip)
6176                 {
6177                   BFD_ASSERT (MUST_BE_DYN_RELOC (ELF64_R_TYPE (rel->r_info)));
6178                   if (info->shared)
6179                     {
6180                       /* We won't be needing dynamic relocs here.  */
6181                       struct ppc_dyn_relocs **pp;
6182                       struct ppc_dyn_relocs *p;
6183
6184                       if (h != NULL)
6185                         pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
6186                       else if (sym_sec != NULL)
6187                         pp = ((struct ppc_dyn_relocs **)
6188                               &elf_section_data (sym_sec)->local_dynrel);
6189                       else
6190                         pp = ((struct ppc_dyn_relocs **)
6191                               &elf_section_data (sec)->local_dynrel);
6192                       while ((p = *pp) != NULL)
6193                         {
6194                           if (p->sec == sec)
6195                             {
6196                               p->count -= 1;
6197                               if (p->count == 0)
6198                                 *pp = p->next;
6199                               break;
6200                             }
6201                           pp = &p->next;
6202                         }
6203                     }
6204                 }
6205               else
6206                 {
6207                   /* We need to adjust any reloc offsets to point to the
6208                      new opd entries.  While we're at it, we may as well
6209                      remove redundant relocs.  */
6210                   rel->r_offset += opd_adjust[(offset - opd_ent_size) / 8];
6211                   if (write_rel != rel)
6212                     memcpy (write_rel, rel, sizeof (*rel));
6213                   ++write_rel;
6214                 }
6215             }
6216
6217           sec->size = wptr - new_contents;
6218           sec->reloc_count = write_rel - relstart;
6219           if (add_aux_fields)
6220             {
6221               free (sec->contents);
6222               sec->contents = new_contents;
6223             }
6224
6225           /* Fudge the size too, as this is used later in
6226              elf_bfd_final_link if we are emitting relocs.  */
6227           elf_section_data (sec)->rel_hdr.sh_size
6228             = sec->reloc_count * elf_section_data (sec)->rel_hdr.sh_entsize;
6229           BFD_ASSERT (elf_section_data (sec)->rel_hdr2 == NULL);
6230           some_edited = TRUE;
6231         }
6232       else if (elf_section_data (sec)->relocs != relstart)
6233         free (relstart);
6234
6235       if (local_syms != NULL
6236           && symtab_hdr->contents != (unsigned char *) local_syms)
6237         {
6238           if (!info->keep_memory)
6239             free (local_syms);
6240           else
6241             symtab_hdr->contents = (unsigned char *) local_syms;
6242         }
6243     }
6244
6245   if (some_edited)
6246     elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
6247
6248   /* If we are doing a final link and the last .opd entry is just 16 byte
6249      long, add a 8 byte padding after it.  */
6250   if (need_pad != NULL && !info->relocatable)
6251     {
6252       bfd_byte *p;
6253
6254       if ((need_pad->flags & SEC_IN_MEMORY) == 0)
6255         {
6256           BFD_ASSERT (need_pad->size > 0);
6257
6258           p = bfd_malloc (need_pad->size + 8);
6259           if (p == NULL)
6260             return FALSE;
6261
6262           if (! bfd_get_section_contents (need_pad->owner, need_pad,
6263                                           p, 0, need_pad->size))
6264             return FALSE;
6265
6266           need_pad->contents = p;
6267           need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
6268         }
6269       else
6270         {
6271           p = bfd_realloc (need_pad->contents, need_pad->size + 8);
6272           if (p == NULL)
6273             return FALSE;
6274
6275           need_pad->contents = p;
6276         }
6277
6278       memset (need_pad->contents + need_pad->size, 0, 8);
6279       need_pad->size += 8;
6280     }
6281
6282   return TRUE;
6283 }
6284
6285 /* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
6286
6287 asection *
6288 ppc64_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
6289 {
6290   struct ppc_link_hash_table *htab;
6291
6292   htab = ppc_hash_table (info);
6293   if (htab->tls_get_addr != NULL)
6294     {
6295       struct ppc_link_hash_entry *h = htab->tls_get_addr;
6296
6297       while (h->elf.root.type == bfd_link_hash_indirect
6298              || h->elf.root.type == bfd_link_hash_warning)
6299         h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
6300
6301       htab->tls_get_addr = h;
6302
6303       if (htab->tls_get_addr_fd == NULL
6304           && h->oh != NULL
6305           && h->oh->is_func_descriptor)
6306         htab->tls_get_addr_fd = h->oh;
6307     }
6308
6309   if (htab->tls_get_addr_fd != NULL)
6310     {
6311       struct ppc_link_hash_entry *h = htab->tls_get_addr_fd;
6312
6313       while (h->elf.root.type == bfd_link_hash_indirect
6314              || h->elf.root.type == bfd_link_hash_warning)
6315         h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
6316
6317       htab->tls_get_addr_fd = h;
6318     }
6319
6320   return _bfd_elf_tls_setup (obfd, info);
6321 }
6322
6323 /* Run through all the TLS relocs looking for optimization
6324    opportunities.  The linker has been hacked (see ppc64elf.em) to do
6325    a preliminary section layout so that we know the TLS segment
6326    offsets.  We can't optimize earlier because some optimizations need
6327    to know the tp offset, and we need to optimize before allocating
6328    dynamic relocations.  */
6329
6330 bfd_boolean
6331 ppc64_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
6332 {
6333   bfd *ibfd;
6334   asection *sec;
6335   struct ppc_link_hash_table *htab;
6336
6337   if (info->relocatable || info->shared)
6338     return TRUE;
6339
6340   htab = ppc_hash_table (info);
6341   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6342     {
6343       Elf_Internal_Sym *locsyms = NULL;
6344
6345       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
6346         if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
6347           {
6348             Elf_Internal_Rela *relstart, *rel, *relend;
6349             int expecting_tls_get_addr;
6350
6351             /* Read the relocations.  */
6352             relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
6353                                                   info->keep_memory);
6354             if (relstart == NULL)
6355               return FALSE;
6356
6357             expecting_tls_get_addr = 0;
6358             relend = relstart + sec->reloc_count;
6359             for (rel = relstart; rel < relend; rel++)
6360               {
6361                 enum elf_ppc64_reloc_type r_type;
6362                 unsigned long r_symndx;
6363                 struct elf_link_hash_entry *h;
6364                 Elf_Internal_Sym *sym;
6365                 asection *sym_sec;
6366                 char *tls_mask;
6367                 char tls_set, tls_clear, tls_type = 0;
6368                 bfd_vma value;
6369                 bfd_boolean ok_tprel, is_local;
6370
6371                 r_symndx = ELF64_R_SYM (rel->r_info);
6372                 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
6373                                 r_symndx, ibfd))
6374                   {
6375                   err_free_rel:
6376                     if (elf_section_data (sec)->relocs != relstart)
6377                       free (relstart);
6378                     if (locsyms != NULL
6379                         && (elf_tdata (ibfd)->symtab_hdr.contents
6380                             != (unsigned char *) locsyms))
6381                       free (locsyms);
6382                     return FALSE;
6383                   }
6384
6385                 if (h != NULL)
6386                   {
6387                     if (h->root.type != bfd_link_hash_defined
6388                         && h->root.type != bfd_link_hash_defweak)
6389                       continue;
6390                     value = h->root.u.def.value;
6391                   }
6392                 else
6393                   /* Symbols referenced by TLS relocs must be of type
6394                      STT_TLS.  So no need for .opd local sym adjust.  */
6395                   value = sym->st_value;
6396
6397                 ok_tprel = FALSE;
6398                 is_local = FALSE;
6399                 if (h == NULL
6400                     || !(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC))
6401                   {
6402                     is_local = TRUE;
6403                     value += sym_sec->output_offset;
6404                     value += sym_sec->output_section->vma;
6405                     value -= htab->elf.tls_sec->vma;
6406                     ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
6407                                 < (bfd_vma) 1 << 32);
6408                   }
6409
6410                 r_type = ELF64_R_TYPE (rel->r_info);
6411                 switch (r_type)
6412                   {
6413                   case R_PPC64_GOT_TLSLD16:
6414                   case R_PPC64_GOT_TLSLD16_LO:
6415                   case R_PPC64_GOT_TLSLD16_HI:
6416                   case R_PPC64_GOT_TLSLD16_HA:
6417                     /* These relocs should never be against a symbol
6418                        defined in a shared lib.  Leave them alone if
6419                        that turns out to be the case.  */
6420                     ppc64_tlsld_got (ibfd)->refcount -= 1;
6421                     if (!is_local)
6422                       continue;
6423
6424                     /* LD -> LE */
6425                     tls_set = 0;
6426                     tls_clear = TLS_LD;
6427                     tls_type = TLS_TLS | TLS_LD;
6428                     expecting_tls_get_addr = 1;
6429                     break;
6430
6431                   case R_PPC64_GOT_TLSGD16:
6432                   case R_PPC64_GOT_TLSGD16_LO:
6433                   case R_PPC64_GOT_TLSGD16_HI:
6434                   case R_PPC64_GOT_TLSGD16_HA:
6435                     if (ok_tprel)
6436                       /* GD -> LE */
6437                       tls_set = 0;
6438                     else
6439                       /* GD -> IE */
6440                       tls_set = TLS_TLS | TLS_TPRELGD;
6441                     tls_clear = TLS_GD;
6442                     tls_type = TLS_TLS | TLS_GD;
6443                     expecting_tls_get_addr = 1;
6444                     break;
6445
6446                   case R_PPC64_GOT_TPREL16_DS:
6447                   case R_PPC64_GOT_TPREL16_LO_DS:
6448                   case R_PPC64_GOT_TPREL16_HI:
6449                   case R_PPC64_GOT_TPREL16_HA:
6450                     expecting_tls_get_addr = 0;
6451                     if (ok_tprel)
6452                       {
6453                         /* IE -> LE */
6454                         tls_set = 0;
6455                         tls_clear = TLS_TPREL;
6456                         tls_type = TLS_TLS | TLS_TPREL;
6457                         break;
6458                       }
6459                     else
6460                       continue;
6461
6462                   case R_PPC64_REL14:
6463                   case R_PPC64_REL14_BRTAKEN:
6464                   case R_PPC64_REL14_BRNTAKEN:
6465                   case R_PPC64_REL24:
6466                     if (h != NULL
6467                         && (h == &htab->tls_get_addr->elf
6468                             || h == &htab->tls_get_addr_fd->elf))
6469                       {
6470                         if (!expecting_tls_get_addr
6471                             && rel != relstart
6472                             && ((ELF64_R_TYPE (rel[-1].r_info)
6473                                  == R_PPC64_TOC16)
6474                                 || (ELF64_R_TYPE (rel[-1].r_info)
6475                                     == R_PPC64_TOC16_LO)))
6476                           {
6477                             /* Check for toc tls entries.  */
6478                             char *toc_tls;
6479                             int retval;
6480
6481                             retval = get_tls_mask (&toc_tls, NULL, &locsyms,
6482                                                    rel - 1, ibfd);
6483                             if (retval == 0)
6484                               goto err_free_rel;
6485                             if (toc_tls != NULL)
6486                               expecting_tls_get_addr = retval > 1;
6487                           }
6488
6489                         if (expecting_tls_get_addr)
6490                           {
6491                             struct plt_entry *ent;
6492                             for (ent = h->plt.plist; ent; ent = ent->next)
6493                               if (ent->addend == 0)
6494                                 {
6495                                   if (ent->plt.refcount > 0)
6496                                     ent->plt.refcount -= 1;
6497                                   break;
6498                                 }
6499                           }
6500                       }
6501                     expecting_tls_get_addr = 0;
6502                     continue;
6503
6504                   case R_PPC64_TPREL64:
6505                     expecting_tls_get_addr = 0;
6506                     if (ok_tprel)
6507                       {
6508                         /* IE -> LE */
6509                         tls_set = TLS_EXPLICIT;
6510                         tls_clear = TLS_TPREL;
6511                         break;
6512                       }
6513                     else
6514                       continue;
6515
6516                   case R_PPC64_DTPMOD64:
6517                     expecting_tls_get_addr = 0;
6518                     if (rel + 1 < relend
6519                         && (rel[1].r_info
6520                             == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
6521                         && rel[1].r_offset == rel->r_offset + 8)
6522                       {
6523                         if (ok_tprel)
6524                           /* GD -> LE */
6525                           tls_set = TLS_EXPLICIT | TLS_GD;
6526                         else
6527                           /* GD -> IE */
6528                           tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
6529                         tls_clear = TLS_GD;
6530                       }
6531                     else
6532                       {
6533                         if (!is_local)
6534                           continue;
6535
6536                         /* LD -> LE */
6537                         tls_set = TLS_EXPLICIT;
6538                         tls_clear = TLS_LD;
6539                       }
6540                     break;
6541
6542                   default:
6543                     expecting_tls_get_addr = 0;
6544                     continue;
6545                   }
6546
6547                 if ((tls_set & TLS_EXPLICIT) == 0)
6548                   {
6549                     struct got_entry *ent;
6550
6551                     /* Adjust got entry for this reloc.  */
6552                     if (h != NULL)
6553                       ent = h->got.glist;
6554                     else
6555                       ent = elf_local_got_ents (ibfd)[r_symndx];
6556
6557                     for (; ent != NULL; ent = ent->next)
6558                       if (ent->addend == rel->r_addend
6559                           && ent->owner == ibfd
6560                           && ent->tls_type == tls_type)
6561                         break;
6562                     if (ent == NULL)
6563                       abort ();
6564
6565                     if (tls_set == 0)
6566                       {
6567                         /* We managed to get rid of a got entry.  */
6568                         if (ent->got.refcount > 0)
6569                           ent->got.refcount -= 1;
6570                       }
6571                   }
6572                 else if (h != NULL)
6573                   {
6574                     struct ppc_link_hash_entry * eh;
6575                     struct ppc_dyn_relocs **pp;
6576                     struct ppc_dyn_relocs *p;
6577
6578                     /* Adjust dynamic relocs.  */
6579                     eh = (struct ppc_link_hash_entry *) h;
6580                     for (pp = &eh->dyn_relocs;
6581                          (p = *pp) != NULL;
6582                          pp = &p->next)
6583                       if (p->sec == sec)
6584                         {
6585                           /* If we got rid of a DTPMOD/DTPREL reloc
6586                              pair then we'll lose one or two dyn
6587                              relocs.  */
6588                           if (tls_set == (TLS_EXPLICIT | TLS_GD))
6589                             p->count -= 1;
6590                           p->count -= 1;
6591                           if (p->count == 0)
6592                             *pp = p->next;
6593                           break;
6594                         }
6595                   }
6596
6597                 *tls_mask |= tls_set;
6598                 *tls_mask &= ~tls_clear;
6599               }
6600
6601             if (elf_section_data (sec)->relocs != relstart)
6602               free (relstart);
6603           }
6604
6605       if (locsyms != NULL
6606           && (elf_tdata (ibfd)->symtab_hdr.contents
6607               != (unsigned char *) locsyms))
6608         {
6609           if (!info->keep_memory)
6610             free (locsyms);
6611           else
6612             elf_tdata (ibfd)->symtab_hdr.contents = (unsigned char *) locsyms;
6613         }
6614     }
6615   return TRUE;
6616 }
6617
6618 /* Allocate space in .plt, .got and associated reloc sections for
6619    dynamic relocs.  */
6620
6621 static bfd_boolean
6622 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
6623 {
6624   struct bfd_link_info *info;
6625   struct ppc_link_hash_table *htab;
6626   asection *s;
6627   struct ppc_link_hash_entry *eh;
6628   struct ppc_dyn_relocs *p;
6629   struct got_entry *gent;
6630
6631   if (h->root.type == bfd_link_hash_indirect)
6632     return TRUE;
6633
6634   if (h->root.type == bfd_link_hash_warning)
6635     h = (struct elf_link_hash_entry *) h->root.u.i.link;
6636
6637   info = (struct bfd_link_info *) inf;
6638   htab = ppc_hash_table (info);
6639
6640   if (htab->elf.dynamic_sections_created
6641       && h->dynindx != -1
6642       && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
6643     {
6644       struct plt_entry *pent;
6645       bfd_boolean doneone = FALSE;
6646       for (pent = h->plt.plist; pent != NULL; pent = pent->next)
6647         if (pent->plt.refcount > 0)
6648           {
6649             /* If this is the first .plt entry, make room for the special
6650                first entry.  */
6651             s = htab->plt;
6652             if (s->size == 0)
6653               s->size += PLT_INITIAL_ENTRY_SIZE;
6654
6655             pent->plt.offset = s->size;
6656
6657             /* Make room for this entry.  */
6658             s->size += PLT_ENTRY_SIZE;
6659
6660             /* Make room for the .glink code.  */
6661             s = htab->glink;
6662             if (s->size == 0)
6663               s->size += GLINK_CALL_STUB_SIZE;
6664             /* We need bigger stubs past index 32767.  */
6665             if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
6666               s->size += 4;
6667             s->size += 2*4;
6668
6669             /* We also need to make an entry in the .rela.plt section.  */
6670             s = htab->relplt;
6671             s->size += sizeof (Elf64_External_Rela);
6672             doneone = TRUE;
6673           }
6674         else
6675           pent->plt.offset = (bfd_vma) -1;
6676       if (!doneone)
6677         {
6678           h->plt.plist = NULL;
6679           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
6680         }
6681     }
6682   else
6683     {
6684       h->plt.plist = NULL;
6685       h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
6686     }
6687
6688   eh = (struct ppc_link_hash_entry *) h;
6689   /* Run through the TLS GD got entries first if we're changing them
6690      to TPREL.  */
6691   if ((eh->tls_mask & TLS_TPRELGD) != 0)
6692     for (gent = h->got.glist; gent != NULL; gent = gent->next)
6693       if (gent->got.refcount > 0
6694           && (gent->tls_type & TLS_GD) != 0)
6695         {
6696           /* This was a GD entry that has been converted to TPREL.  If
6697              there happens to be a TPREL entry we can use that one.  */
6698           struct got_entry *ent;
6699           for (ent = h->got.glist; ent != NULL; ent = ent->next)
6700             if (ent->got.refcount > 0
6701                 && (ent->tls_type & TLS_TPREL) != 0
6702                 && ent->addend == gent->addend
6703                 && ent->owner == gent->owner)
6704               {
6705                 gent->got.refcount = 0;
6706                 break;
6707               }
6708
6709           /* If not, then we'll be using our own TPREL entry.  */
6710           if (gent->got.refcount != 0)
6711             gent->tls_type = TLS_TLS | TLS_TPREL;
6712         }
6713
6714   for (gent = h->got.glist; gent != NULL; gent = gent->next)
6715     if (gent->got.refcount > 0)
6716       {
6717         bfd_boolean dyn;
6718
6719         /* Make sure this symbol is output as a dynamic symbol.
6720            Undefined weak syms won't yet be marked as dynamic,
6721            nor will all TLS symbols.  */
6722         if (h->dynindx == -1
6723             && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
6724           {
6725             if (! bfd_elf_link_record_dynamic_symbol (info, h))
6726               return FALSE;
6727           }
6728
6729         if ((gent->tls_type & TLS_LD) != 0
6730             && !(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC))
6731           {
6732             gent->got.offset = ppc64_tlsld_got (gent->owner)->offset;
6733             continue;
6734           }
6735
6736         s = ppc64_elf_tdata (gent->owner)->got;
6737         gent->got.offset = s->size;
6738         s->size
6739           += (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)) ? 16 : 8;
6740         dyn = htab->elf.dynamic_sections_created;
6741         if ((info->shared
6742              || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
6743             && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6744                 || h->root.type != bfd_link_hash_undefweak))
6745           ppc64_elf_tdata (gent->owner)->relgot->size
6746             += (gent->tls_type & eh->tls_mask & TLS_GD
6747                 ? 2 * sizeof (Elf64_External_Rela)
6748                 : sizeof (Elf64_External_Rela));
6749       }
6750     else
6751       gent->got.offset = (bfd_vma) -1;
6752
6753   if (eh->dyn_relocs == NULL)
6754     return TRUE;
6755
6756   /* In the shared -Bsymbolic case, discard space allocated for
6757      dynamic pc-relative relocs against symbols which turn out to be
6758      defined in regular objects.  For the normal shared case, discard
6759      space for relocs that have become local due to symbol visibility
6760      changes.  */
6761
6762   if (info->shared)
6763     {
6764       /* Relocs that use pc_count are those that appear on a call insn,
6765          or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
6766          generated via assembly.  We want calls to protected symbols to
6767          resolve directly to the function rather than going via the plt.
6768          If people want function pointer comparisons to work as expected
6769          then they should avoid writing weird assembly.  */
6770       if (SYMBOL_CALLS_LOCAL (info, h))
6771         {
6772           struct ppc_dyn_relocs **pp;
6773
6774           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
6775             {
6776               p->count -= p->pc_count;
6777               p->pc_count = 0;
6778               if (p->count == 0)
6779                 *pp = p->next;
6780               else
6781                 pp = &p->next;
6782             }
6783         }
6784
6785       /* Also discard relocs on undefined weak syms with non-default
6786          visibility.  */
6787       if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6788           && h->root.type == bfd_link_hash_undefweak)
6789         eh->dyn_relocs = NULL;
6790     }
6791   else if (ELIMINATE_COPY_RELOCS)
6792     {
6793       /* For the non-shared case, discard space for relocs against
6794          symbols which turn out to need copy relocs or are not
6795          dynamic.  */
6796
6797       if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
6798           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
6799           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
6800         {
6801           /* Make sure this symbol is output as a dynamic symbol.
6802              Undefined weak syms won't yet be marked as dynamic.  */
6803           if (h->dynindx == -1
6804               && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
6805             {
6806               if (! bfd_elf_link_record_dynamic_symbol (info, h))
6807                 return FALSE;
6808             }
6809
6810           /* If that succeeded, we know we'll be keeping all the
6811              relocs.  */
6812           if (h->dynindx != -1)
6813             goto keep;
6814         }
6815
6816       eh->dyn_relocs = NULL;
6817
6818     keep: ;
6819     }
6820
6821   /* Finally, allocate space.  */
6822   for (p = eh->dyn_relocs; p != NULL; p = p->next)
6823     {
6824       asection *sreloc = elf_section_data (p->sec)->sreloc;
6825       sreloc->size += p->count * sizeof (Elf64_External_Rela);
6826     }
6827
6828   return TRUE;
6829 }
6830
6831 /* Find any dynamic relocs that apply to read-only sections.  */
6832
6833 static bfd_boolean
6834 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
6835 {
6836   struct ppc_link_hash_entry *eh;
6837   struct ppc_dyn_relocs *p;
6838
6839   if (h->root.type == bfd_link_hash_warning)
6840     h = (struct elf_link_hash_entry *) h->root.u.i.link;
6841
6842   eh = (struct ppc_link_hash_entry *) h;
6843   for (p = eh->dyn_relocs; p != NULL; p = p->next)
6844     {
6845       asection *s = p->sec->output_section;
6846
6847       if (s != NULL && (s->flags & SEC_READONLY) != 0)
6848         {
6849           struct bfd_link_info *info = inf;
6850
6851           info->flags |= DF_TEXTREL;
6852
6853           /* Not an error, just cut short the traversal.  */
6854           return FALSE;
6855         }
6856     }
6857   return TRUE;
6858 }
6859
6860 /* Set the sizes of the dynamic sections.  */
6861
6862 static bfd_boolean
6863 ppc64_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
6864                                  struct bfd_link_info *info)
6865 {
6866   struct ppc_link_hash_table *htab;
6867   bfd *dynobj;
6868   asection *s;
6869   bfd_boolean relocs;
6870   bfd *ibfd;
6871
6872   htab = ppc_hash_table (info);
6873   dynobj = htab->elf.dynobj;
6874   if (dynobj == NULL)
6875     abort ();
6876
6877   if (htab->elf.dynamic_sections_created)
6878     {
6879       /* Set the contents of the .interp section to the interpreter.  */
6880       if (info->executable)
6881         {
6882           s = bfd_get_section_by_name (dynobj, ".interp");
6883           if (s == NULL)
6884             abort ();
6885           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
6886           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
6887         }
6888     }
6889
6890   /* Set up .got offsets for local syms, and space for local dynamic
6891      relocs.  */
6892   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6893     {
6894       struct got_entry **lgot_ents;
6895       struct got_entry **end_lgot_ents;
6896       char *lgot_masks;
6897       bfd_size_type locsymcount;
6898       Elf_Internal_Shdr *symtab_hdr;
6899       asection *srel;
6900
6901       if (!is_ppc64_target (ibfd->xvec))
6902         continue;
6903
6904       if (ppc64_tlsld_got (ibfd)->refcount > 0)
6905         {
6906           s = ppc64_elf_tdata (ibfd)->got;
6907           ppc64_tlsld_got (ibfd)->offset = s->size;
6908           s->size += 16;
6909           if (info->shared)
6910             {
6911               srel = ppc64_elf_tdata (ibfd)->relgot;
6912               srel->size += sizeof (Elf64_External_Rela);
6913             }
6914         }
6915       else
6916         ppc64_tlsld_got (ibfd)->offset = (bfd_vma) -1;
6917
6918       for (s = ibfd->sections; s != NULL; s = s->next)
6919         {
6920           struct ppc_dyn_relocs *p;
6921
6922           for (p = *((struct ppc_dyn_relocs **)
6923                      &elf_section_data (s)->local_dynrel);
6924                p != NULL;
6925                p = p->next)
6926             {
6927               if (!bfd_is_abs_section (p->sec)
6928                   && bfd_is_abs_section (p->sec->output_section))
6929                 {
6930                   /* Input section has been discarded, either because
6931                      it is a copy of a linkonce section or due to
6932                      linker script /DISCARD/, so we'll be discarding
6933                      the relocs too.  */
6934                 }
6935               else if (p->count != 0)
6936                 {
6937                   srel = elf_section_data (p->sec)->sreloc;
6938                   srel->size += p->count * sizeof (Elf64_External_Rela);
6939                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
6940                     info->flags |= DF_TEXTREL;
6941                 }
6942             }
6943         }
6944
6945       lgot_ents = elf_local_got_ents (ibfd);
6946       if (!lgot_ents)
6947         continue;
6948
6949       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
6950       locsymcount = symtab_hdr->sh_info;
6951       end_lgot_ents = lgot_ents + locsymcount;
6952       lgot_masks = (char *) end_lgot_ents;
6953       s = ppc64_elf_tdata (ibfd)->got;
6954       srel = ppc64_elf_tdata (ibfd)->relgot;
6955       for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
6956         {
6957           struct got_entry *ent;
6958
6959           for (ent = *lgot_ents; ent != NULL; ent = ent->next)
6960             if (ent->got.refcount > 0)
6961               {
6962                 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
6963                   {
6964                     if (ppc64_tlsld_got (ibfd)->offset == (bfd_vma) -1)
6965                       {
6966                         ppc64_tlsld_got (ibfd)->offset = s->size;
6967                         s->size += 16;
6968                         if (info->shared)
6969                           srel->size += sizeof (Elf64_External_Rela);
6970                       }
6971                     ent->got.offset = ppc64_tlsld_got (ibfd)->offset;
6972                   }
6973                 else
6974                   {
6975                     ent->got.offset = s->size;
6976                     if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
6977                       {
6978                         s->size += 16;
6979                         if (info->shared)
6980                           srel->size += 2 * sizeof (Elf64_External_Rela);
6981                       }
6982                     else
6983                       {
6984                         s->size += 8;
6985                         if (info->shared)
6986                           srel->size += sizeof (Elf64_External_Rela);
6987                       }
6988                   }
6989               }
6990             else
6991               ent->got.offset = (bfd_vma) -1;
6992         }
6993     }
6994
6995   /* Allocate global sym .plt and .got entries, and space for global
6996      sym dynamic relocs.  */
6997   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
6998
6999   /* We now have determined the sizes of the various dynamic sections.
7000      Allocate memory for them.  */
7001   relocs = FALSE;
7002   for (s = dynobj->sections; s != NULL; s = s->next)
7003     {
7004       if ((s->flags & SEC_LINKER_CREATED) == 0)
7005         continue;
7006
7007       if (s == htab->brlt || s == htab->relbrlt)
7008         /* These haven't been allocated yet;  don't strip.  */
7009         continue;
7010       else if (s == htab->got
7011                || s == htab->plt
7012                || s == htab->glink)
7013         {
7014           /* Strip this section if we don't need it; see the
7015              comment below.  */
7016         }
7017       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
7018         {
7019           if (s->size == 0)
7020             {
7021               /* If we don't need this section, strip it from the
7022                  output file.  This is mostly to handle .rela.bss and
7023                  .rela.plt.  We must create both sections in
7024                  create_dynamic_sections, because they must be created
7025                  before the linker maps input sections to output
7026                  sections.  The linker does that before
7027                  adjust_dynamic_symbol is called, and it is that
7028                  function which decides whether anything needs to go
7029                  into these sections.  */
7030             }
7031           else
7032             {
7033               if (s != htab->relplt)
7034                 relocs = TRUE;
7035
7036               /* We use the reloc_count field as a counter if we need
7037                  to copy relocs into the output file.  */
7038               s->reloc_count = 0;
7039             }
7040         }
7041       else
7042         {
7043           /* It's not one of our sections, so don't allocate space.  */
7044           continue;
7045         }
7046
7047       if (s->size == 0)
7048         {
7049           _bfd_strip_section_from_output (info, s);
7050           continue;
7051         }
7052
7053       /* .plt is in the bss section.  We don't initialise it.  */
7054       if (s == htab->plt)
7055         continue;
7056
7057       /* Allocate memory for the section contents.  We use bfd_zalloc
7058          here in case unused entries are not reclaimed before the
7059          section's contents are written out.  This should not happen,
7060          but this way if it does we get a R_PPC64_NONE reloc in .rela
7061          sections instead of garbage.
7062          We also rely on the section contents being zero when writing
7063          the GOT.  */
7064       s->contents = bfd_zalloc (dynobj, s->size);
7065       if (s->contents == NULL)
7066         return FALSE;
7067     }
7068
7069   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7070     {
7071       if (!is_ppc64_target (ibfd->xvec))
7072         continue;
7073
7074       s = ppc64_elf_tdata (ibfd)->got;
7075       if (s != NULL && s != htab->got)
7076         {
7077           if (s->size == 0)
7078             _bfd_strip_section_from_output (info, s);
7079           else
7080             {
7081               s->contents = bfd_zalloc (ibfd, s->size);
7082               if (s->contents == NULL)
7083                 return FALSE;
7084             }
7085         }
7086       s = ppc64_elf_tdata (ibfd)->relgot;
7087       if (s != NULL)
7088         {
7089           if (s->size == 0)
7090             _bfd_strip_section_from_output (info, s);
7091           else
7092             {
7093               s->contents = bfd_zalloc (ibfd, s->size);
7094               if (s->contents == NULL)
7095                 return FALSE;
7096               relocs = TRUE;
7097               s->reloc_count = 0;
7098             }
7099         }
7100     }
7101
7102   if (htab->elf.dynamic_sections_created)
7103     {
7104       /* Add some entries to the .dynamic section.  We fill in the
7105          values later, in ppc64_elf_finish_dynamic_sections, but we
7106          must add the entries now so that we get the correct size for
7107          the .dynamic section.  The DT_DEBUG entry is filled in by the
7108          dynamic linker and used by the debugger.  */
7109 #define add_dynamic_entry(TAG, VAL) \
7110   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
7111
7112       if (info->executable)
7113         {
7114           if (!add_dynamic_entry (DT_DEBUG, 0))
7115             return FALSE;
7116         }
7117
7118       if (htab->plt != NULL && htab->plt->size != 0)
7119         {
7120           if (!add_dynamic_entry (DT_PLTGOT, 0)
7121               || !add_dynamic_entry (DT_PLTRELSZ, 0)
7122               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
7123               || !add_dynamic_entry (DT_JMPREL, 0)
7124               || !add_dynamic_entry (DT_PPC64_GLINK, 0))
7125             return FALSE;
7126         }
7127
7128       if (NO_OPD_RELOCS)
7129         {
7130           if (!add_dynamic_entry (DT_PPC64_OPD, 0)
7131               || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
7132             return FALSE;
7133         }
7134
7135       if (relocs)
7136         {
7137           if (!add_dynamic_entry (DT_RELA, 0)
7138               || !add_dynamic_entry (DT_RELASZ, 0)
7139               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
7140             return FALSE;
7141
7142           /* If any dynamic relocs apply to a read-only section,
7143              then we need a DT_TEXTREL entry.  */
7144           if ((info->flags & DF_TEXTREL) == 0)
7145             elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
7146
7147           if ((info->flags & DF_TEXTREL) != 0)
7148             {
7149               if (!add_dynamic_entry (DT_TEXTREL, 0))
7150                 return FALSE;
7151             }
7152         }
7153     }
7154 #undef add_dynamic_entry
7155
7156   return TRUE;
7157 }
7158
7159 /* Determine the type of stub needed, if any, for a call.  */
7160
7161 static inline enum ppc_stub_type
7162 ppc_type_of_stub (asection *input_sec,
7163                   const Elf_Internal_Rela *rel,
7164                   struct ppc_link_hash_entry **hash,
7165                   bfd_vma destination)
7166 {
7167   struct ppc_link_hash_entry *h = *hash;
7168   bfd_vma location;
7169   bfd_vma branch_offset;
7170   bfd_vma max_branch_offset;
7171   enum elf_ppc64_reloc_type r_type;
7172
7173   if (h != NULL)
7174     {
7175       if (h->oh != NULL
7176           && h->oh->is_func_descriptor)
7177         h = h->oh;
7178
7179       if (h->elf.dynindx != -1)
7180         {
7181           struct plt_entry *ent;
7182
7183           for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
7184             if (ent->addend == rel->r_addend
7185                 && ent->plt.offset != (bfd_vma) -1)
7186               {
7187                 *hash = h;
7188                 return ppc_stub_plt_call;
7189               }
7190         }
7191
7192       if (!(h->elf.root.type == bfd_link_hash_defined
7193             || h->elf.root.type == bfd_link_hash_defweak)
7194           || h->elf.root.u.def.section->output_section == NULL)
7195         return ppc_stub_none;
7196     }
7197
7198   /* Determine where the call point is.  */
7199   location = (input_sec->output_offset
7200               + input_sec->output_section->vma
7201               + rel->r_offset);
7202
7203   branch_offset = destination - location;
7204   r_type = ELF64_R_TYPE (rel->r_info);
7205
7206   /* Determine if a long branch stub is needed.  */
7207   max_branch_offset = 1 << 25;
7208   if (r_type != R_PPC64_REL24)
7209     max_branch_offset = 1 << 15;
7210
7211   if (branch_offset + max_branch_offset >= 2 * max_branch_offset)
7212     /* We need a stub.  Figure out whether a long_branch or plt_branch
7213        is needed later.  */
7214     return ppc_stub_long_branch;
7215
7216   return ppc_stub_none;
7217 }
7218
7219 /* Build a .plt call stub.  */
7220
7221 static inline bfd_byte *
7222 build_plt_stub (bfd *obfd, bfd_byte *p, int offset)
7223 {
7224 #define PPC_LO(v) ((v) & 0xffff)
7225 #define PPC_HI(v) (((v) >> 16) & 0xffff)
7226 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
7227
7228   bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
7229   bfd_put_32 (obfd, STD_R2_40R1, p),                    p += 4;
7230   bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p),  p += 4;
7231   if (PPC_HA (offset + 8) != PPC_HA (offset))
7232     bfd_put_32 (obfd, ADDIS_R12_R12 | 1, p),            p += 4;
7233   offset += 8;
7234   bfd_put_32 (obfd, LD_R2_0R12 | PPC_LO (offset), p),   p += 4;
7235   if (PPC_HA (offset + 8) != PPC_HA (offset))
7236     bfd_put_32 (obfd, ADDIS_R12_R12 | 1, p),            p += 4;
7237   offset += 8;
7238   bfd_put_32 (obfd, MTCTR_R11, p),                      p += 4;
7239   bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p),  p += 4;
7240   bfd_put_32 (obfd, BCTR, p),                           p += 4;
7241   return p;
7242 }
7243
7244 static bfd_boolean
7245 ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
7246 {
7247   struct ppc_stub_hash_entry *stub_entry;
7248   struct ppc_branch_hash_entry *br_entry;
7249   struct bfd_link_info *info;
7250   struct ppc_link_hash_table *htab;
7251   bfd_byte *loc;
7252   bfd_byte *p;
7253   unsigned int indx;
7254   struct plt_entry *ent;
7255   bfd_vma off;
7256   int size;
7257
7258   /* Massage our args to the form they really have.  */
7259   stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
7260   info = in_arg;
7261
7262   htab = ppc_hash_table (info);
7263
7264   /* Make a note of the offset within the stubs for this entry.  */
7265   stub_entry->stub_offset = stub_entry->stub_sec->size;
7266   loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
7267
7268   htab->stub_count[stub_entry->stub_type - 1] += 1;
7269   switch (stub_entry->stub_type)
7270     {
7271     case ppc_stub_long_branch:
7272     case ppc_stub_long_branch_r2off:
7273       /* Branches are relative.  This is where we are going to.  */
7274       off = (stub_entry->target_value
7275              + stub_entry->target_section->output_offset
7276              + stub_entry->target_section->output_section->vma);
7277
7278       /* And this is where we are coming from.  */
7279       off -= (stub_entry->stub_offset
7280               + stub_entry->stub_sec->output_offset
7281               + stub_entry->stub_sec->output_section->vma);
7282
7283       if (stub_entry->stub_type != ppc_stub_long_branch_r2off)
7284         size = 4;
7285       else
7286         {
7287           bfd_vma r2off;
7288
7289           r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
7290                    - htab->stub_group[stub_entry->id_sec->id].toc_off);
7291           bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
7292           loc += 4;
7293           bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
7294           loc += 4;
7295           bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
7296           loc += 4;
7297           off -= 12;
7298           size = 16;
7299         }
7300       bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
7301
7302       BFD_ASSERT (off + (1 << 25) < (bfd_vma) (1 << 26));
7303       break;
7304
7305     case ppc_stub_plt_branch:
7306     case ppc_stub_plt_branch_r2off:
7307       br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
7308                                          stub_entry->root.string + 9,
7309                                          FALSE, FALSE);
7310       if (br_entry == NULL)
7311         {
7312           (*_bfd_error_handler) (_("can't find branch stub `%s'"),
7313                                  stub_entry->root.string + 9);
7314           htab->stub_error = TRUE;
7315           return FALSE;
7316         }
7317
7318       off = (stub_entry->target_value
7319              + stub_entry->target_section->output_offset
7320              + stub_entry->target_section->output_section->vma);
7321
7322       bfd_put_64 (htab->brlt->owner, off,
7323                   htab->brlt->contents + br_entry->offset);
7324
7325       if (info->shared)
7326         {
7327           /* Create a reloc for the branch lookup table entry.  */
7328           Elf_Internal_Rela rela;
7329           bfd_byte *rl;
7330
7331           rela.r_offset = (br_entry->offset
7332                            + htab->brlt->output_offset
7333                            + htab->brlt->output_section->vma);
7334           rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
7335           rela.r_addend = off;
7336
7337           rl = htab->relbrlt->contents;
7338           rl += htab->relbrlt->reloc_count++ * sizeof (Elf64_External_Rela);
7339           bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
7340         }
7341
7342       off = (br_entry->offset
7343              + htab->brlt->output_offset
7344              + htab->brlt->output_section->vma
7345              - elf_gp (htab->brlt->output_section->owner)
7346              - htab->stub_group[stub_entry->id_sec->id].toc_off);
7347
7348       if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
7349         {
7350           (*_bfd_error_handler)
7351             (_("linkage table error against `%s'"),
7352              stub_entry->root.string);
7353           bfd_set_error (bfd_error_bad_value);
7354           htab->stub_error = TRUE;
7355           return FALSE;
7356         }
7357
7358       indx = off;
7359       if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
7360         {
7361           bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (indx), loc);
7362           loc += 4;
7363           bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (indx), loc);
7364           size = 16;
7365         }
7366       else
7367         {
7368           bfd_vma r2off;
7369
7370           r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
7371                    - htab->stub_group[stub_entry->id_sec->id].toc_off);
7372           bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
7373           loc += 4;
7374           bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (indx), loc);
7375           loc += 4;
7376           bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (indx), loc);
7377           loc += 4;
7378           bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
7379           loc += 4;
7380           bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
7381           size = 28;
7382         }
7383       loc += 4;
7384       bfd_put_32 (htab->stub_bfd, MTCTR_R11, loc);
7385       loc += 4;
7386       bfd_put_32 (htab->stub_bfd, BCTR, loc);
7387       break;
7388
7389     case ppc_stub_plt_call:
7390       /* Do the best we can for shared libraries built without
7391          exporting ".foo" for each "foo".  This can happen when symbol
7392          versioning scripts strip all bar a subset of symbols.  */
7393       if (stub_entry->h->oh != NULL
7394           && stub_entry->h->oh->elf.root.type != bfd_link_hash_defined
7395           && stub_entry->h->oh->elf.root.type != bfd_link_hash_defweak)
7396         {
7397           /* Point the symbol at the stub.  There may be multiple stubs,
7398              we don't really care;  The main thing is to make this sym
7399              defined somewhere.  Maybe defining the symbol in the stub
7400              section is a silly idea.  If we didn't do this, htab->top_id
7401              could disappear.  */
7402           stub_entry->h->oh->elf.root.type = bfd_link_hash_defined;
7403           stub_entry->h->oh->elf.root.u.def.section = stub_entry->stub_sec;
7404           stub_entry->h->oh->elf.root.u.def.value = stub_entry->stub_offset;
7405         }
7406
7407       /* Now build the stub.  */
7408       off = (bfd_vma) -1;
7409       for (ent = stub_entry->h->elf.plt.plist; ent != NULL; ent = ent->next)
7410         if (ent->addend == stub_entry->addend)
7411           {
7412             off = ent->plt.offset;
7413             break;
7414           }
7415       if (off >= (bfd_vma) -2)
7416         abort ();
7417
7418       off &= ~ (bfd_vma) 1;
7419       off += (htab->plt->output_offset
7420               + htab->plt->output_section->vma
7421               - elf_gp (htab->plt->output_section->owner)
7422               - htab->stub_group[stub_entry->id_sec->id].toc_off);
7423
7424       if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
7425         {
7426           (*_bfd_error_handler)
7427             (_("linkage table error against `%s'"),
7428              stub_entry->h->elf.root.root.string);
7429           bfd_set_error (bfd_error_bad_value);
7430           htab->stub_error = TRUE;
7431           return FALSE;
7432         }
7433
7434       p = build_plt_stub (htab->stub_bfd, loc, off);
7435       size = p - loc;
7436       break;
7437
7438     default:
7439       BFD_FAIL ();
7440       return FALSE;
7441     }
7442
7443   stub_entry->stub_sec->size += size;
7444
7445   if (htab->emit_stub_syms
7446       && !(stub_entry->stub_type == ppc_stub_plt_call
7447            && stub_entry->h->oh != NULL
7448            && stub_entry->h->oh->elf.root.type == bfd_link_hash_defined
7449            && stub_entry->h->oh->elf.root.u.def.section == stub_entry->stub_sec
7450            && stub_entry->h->oh->elf.root.u.def.value == stub_entry->stub_offset))
7451     {
7452       struct elf_link_hash_entry *h;
7453       h = elf_link_hash_lookup (&htab->elf, stub_entry->root.string,
7454                                 TRUE, FALSE, FALSE);
7455       if (h == NULL)
7456         return FALSE;
7457       if (h->root.type == bfd_link_hash_new)
7458         {
7459           h->root.type = bfd_link_hash_defined;
7460           h->root.u.def.section = stub_entry->stub_sec;
7461           h->root.u.def.value = stub_entry->stub_offset;
7462           h->elf_link_hash_flags = (ELF_LINK_HASH_REF_REGULAR
7463                                     | ELF_LINK_HASH_DEF_REGULAR
7464                                     | ELF_LINK_HASH_REF_REGULAR_NONWEAK
7465                                     | ELF_LINK_FORCED_LOCAL);
7466         }
7467     }
7468
7469   return TRUE;
7470 }
7471
7472 /* As above, but don't actually build the stub.  Just bump offset so
7473    we know stub section sizes, and select plt_branch stubs where
7474    long_branch stubs won't do.  */
7475
7476 static bfd_boolean
7477 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
7478 {
7479   struct ppc_stub_hash_entry *stub_entry;
7480   struct bfd_link_info *info;
7481   struct ppc_link_hash_table *htab;
7482   bfd_vma off;
7483   int size;
7484
7485   /* Massage our args to the form they really have.  */
7486   stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
7487   info = in_arg;
7488
7489   htab = ppc_hash_table (info);
7490
7491   if (stub_entry->stub_type == ppc_stub_plt_call)
7492     {
7493       struct plt_entry *ent;
7494       off = (bfd_vma) -1;
7495       for (ent = stub_entry->h->elf.plt.plist; ent != NULL; ent = ent->next)
7496         if (ent->addend == stub_entry->addend)
7497           {
7498             off = ent->plt.offset & ~(bfd_vma) 1;
7499             break;
7500           }
7501       if (off >= (bfd_vma) -2)
7502         abort ();
7503       off += (htab->plt->output_offset
7504               + htab->plt->output_section->vma
7505               - elf_gp (htab->plt->output_section->owner)
7506               - htab->stub_group[stub_entry->id_sec->id].toc_off);
7507
7508       size = PLT_CALL_STUB_SIZE;
7509       if (PPC_HA (off + 16) != PPC_HA (off))
7510         size += 4;
7511     }
7512   else
7513     {
7514       /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
7515          variants.  */
7516       off = (stub_entry->target_value
7517              + stub_entry->target_section->output_offset
7518              + stub_entry->target_section->output_section->vma);
7519       off -= (stub_entry->stub_sec->size
7520               + stub_entry->stub_sec->output_offset
7521               + stub_entry->stub_sec->output_section->vma);
7522
7523       /* Reset the stub type from the plt variant in case we now
7524          can reach with a shorter stub.  */
7525       if (stub_entry->stub_type >= ppc_stub_plt_branch)
7526         stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
7527
7528       size = 4;
7529       if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
7530         {
7531           off -= 12;
7532           size = 16;
7533         }
7534
7535       /* If the branch offset if too big, use a ppc_stub_plt_branch.  */
7536       if (off + (1 << 25) >= (bfd_vma) (1 << 26))
7537         {
7538           struct ppc_branch_hash_entry *br_entry;
7539
7540           br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
7541                                              stub_entry->root.string + 9,
7542                                              TRUE, FALSE);
7543           if (br_entry == NULL)
7544             {
7545               (*_bfd_error_handler) (_("can't build branch stub `%s'"),
7546                                      stub_entry->root.string + 9);
7547               htab->stub_error = TRUE;
7548               return FALSE;
7549             }
7550
7551           if (br_entry->iter != htab->stub_iteration)
7552             {
7553               br_entry->iter = htab->stub_iteration;
7554               br_entry->offset = htab->brlt->size;
7555               htab->brlt->size += 8;
7556
7557               if (info->shared)
7558                 htab->relbrlt->size += sizeof (Elf64_External_Rela);
7559             }
7560
7561           stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
7562           size = 16;
7563           if (stub_entry->stub_type != ppc_stub_plt_branch)
7564             size = 28;
7565         }
7566     }
7567
7568   stub_entry->stub_sec->size += size;
7569   return TRUE;
7570 }
7571
7572 /* Set up various things so that we can make a list of input sections
7573    for each output section included in the link.  Returns -1 on error,
7574    0 when no stubs will be needed, and 1 on success.  */
7575
7576 int
7577 ppc64_elf_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
7578 {
7579   bfd *input_bfd;
7580   int top_id, top_index, id;
7581   asection *section;
7582   asection **input_list;
7583   bfd_size_type amt;
7584   struct ppc_link_hash_table *htab = ppc_hash_table (info);
7585
7586   if (htab->brlt == NULL)
7587     return 0;
7588
7589   /* Find the top input section id.  */
7590   for (input_bfd = info->input_bfds, top_id = 3;
7591        input_bfd != NULL;
7592        input_bfd = input_bfd->link_next)
7593     {
7594       for (section = input_bfd->sections;
7595            section != NULL;
7596            section = section->next)
7597         {
7598           if (top_id < section->id)
7599             top_id = section->id;
7600         }
7601     }
7602
7603   htab->top_id = top_id;
7604   amt = sizeof (struct map_stub) * (top_id + 1);
7605   htab->stub_group = bfd_zmalloc (amt);
7606   if (htab->stub_group == NULL)
7607     return -1;
7608
7609   /* Set toc_off for com, und, abs and ind sections.  */
7610   for (id = 0; id < 3; id++)
7611     htab->stub_group[id].toc_off = TOC_BASE_OFF;
7612
7613   elf_gp (output_bfd) = htab->toc_curr = ppc64_elf_toc (output_bfd);
7614
7615   /* We can't use output_bfd->section_count here to find the top output
7616      section index as some sections may have been removed, and
7617      _bfd_strip_section_from_output doesn't renumber the indices.  */
7618   for (section = output_bfd->sections, top_index = 0;
7619        section != NULL;
7620        section = section->next)
7621     {
7622       if (top_index < section->index)
7623         top_index = section->index;
7624     }
7625
7626   htab->top_index = top_index;
7627   amt = sizeof (asection *) * (top_index + 1);
7628   input_list = bfd_zmalloc (amt);
7629   htab->input_list = input_list;
7630   if (input_list == NULL)
7631     return -1;
7632
7633   return 1;
7634 }
7635
7636 /* The linker repeatedly calls this function for each TOC input section
7637    and linker generated GOT section.  Group input bfds such that the toc
7638    within a group is less than 64k in size.  Will break with cute linker
7639    scripts that play games with dot in the output toc section.  */
7640
7641 void
7642 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
7643 {
7644   struct ppc_link_hash_table *htab = ppc_hash_table (info);
7645   bfd_vma addr = isec->output_offset + isec->output_section->vma;
7646   bfd_vma off = addr - htab->toc_curr;
7647
7648   if (off + isec->size > 0x10000)
7649     htab->toc_curr = addr;
7650
7651   elf_gp (isec->owner) = (htab->toc_curr
7652                           - elf_gp (isec->output_section->owner)
7653                           + TOC_BASE_OFF);
7654 }
7655
7656 /* Called after the last call to the above function.  */
7657
7658 void
7659 ppc64_elf_reinit_toc (bfd *output_bfd ATTRIBUTE_UNUSED,
7660                       struct bfd_link_info *info)
7661 {
7662   struct ppc_link_hash_table *htab = ppc_hash_table (info);
7663
7664   /* toc_curr tracks the TOC offset used for code sections below in
7665      ppc64_elf_next_input_section.  Start off at 0x8000.  */
7666   htab->toc_curr = TOC_BASE_OFF;
7667 }
7668
7669 /* No toc references were found in ISEC.  If the code in ISEC makes no
7670    calls, then there's no need to use toc adjusting stubs when branching
7671    into ISEC.  Actually, indirect calls from ISEC are OK as they will
7672    load r2.  */
7673
7674 static int
7675 toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
7676 {
7677   bfd_byte *contents;
7678   bfd_size_type i;
7679   int ret;
7680   int branch_ok;
7681
7682   /* We know none of our code bearing sections will need toc stubs.  */
7683   if ((isec->flags & SEC_LINKER_CREATED) != 0)
7684     return 0;
7685
7686   if (isec->size == 0)
7687     return 0;
7688
7689   /* Hack for linux kernel.  .fixup contains branches, but only back to
7690      the function that hit an exception.  */
7691   branch_ok = strcmp (isec->name, ".fixup") == 0;
7692
7693   contents = elf_section_data (isec)->this_hdr.contents;
7694   if (contents == NULL)
7695     {
7696       if (!bfd_malloc_and_get_section (isec->owner, isec, &contents))
7697         {
7698           if (contents != NULL)
7699             free (contents);
7700           return -1;
7701         }
7702       if (info->keep_memory)
7703         elf_section_data (isec)->this_hdr.contents = contents;
7704     }
7705
7706   /* Code scan, because we don't necessarily have relocs on calls to
7707      static functions.  */
7708   ret = 0;
7709   for (i = 0; i < isec->size; i += 4)
7710     {
7711       unsigned long insn = bfd_get_32 (isec->owner, contents + i);
7712       /* Is this a branch?  */
7713       if ((insn & (0x3f << 26)) == (18 << 26)
7714           /* If branch and link, it's a function call.  */
7715           && ((insn & 1) != 0
7716               /* Sibling calls use a plain branch.  I don't know a way
7717                  of deciding whether a branch is really a sibling call.  */
7718               || !branch_ok))
7719         {
7720           ret = 1;
7721           break;
7722         }
7723     }
7724
7725   if (elf_section_data (isec)->this_hdr.contents != contents)
7726     free (contents);
7727   return ret;
7728 }
7729
7730 /* The linker repeatedly calls this function for each input section,
7731    in the order that input sections are linked into output sections.
7732    Build lists of input sections to determine groupings between which
7733    we may insert linker stubs.  */
7734
7735 bfd_boolean
7736 ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
7737 {
7738   struct ppc_link_hash_table *htab = ppc_hash_table (info);
7739   int ret;
7740
7741   if ((isec->output_section->flags & SEC_CODE) != 0
7742       && isec->output_section->index <= htab->top_index)
7743     {
7744       asection **list = htab->input_list + isec->output_section->index;
7745       /* Steal the link_sec pointer for our list.  */
7746 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
7747       /* This happens to make the list in reverse order,
7748          which is what we want.  */
7749       PREV_SEC (isec) = *list;
7750       *list = isec;
7751     }
7752
7753   /* If a code section has a function that uses the TOC then we need
7754      to use the right TOC (obviously).  Also, make sure that .opd gets
7755      the correct TOC value for R_PPC64_TOC relocs that don't have or
7756      can't find their function symbol (shouldn't ever happen now).  */
7757   if (isec->has_gp_reloc || (isec->flags & SEC_CODE) == 0)
7758     {
7759       if (elf_gp (isec->owner) != 0)
7760         htab->toc_curr = elf_gp (isec->owner);
7761     }
7762   else if ((ret = toc_adjusting_stub_needed (info, isec)) < 0)
7763     return FALSE;
7764   else
7765     isec->has_gp_reloc = ret;
7766
7767   /* Functions that don't use the TOC can belong in any TOC group.
7768      Use the last TOC base.  This happens to make _init and _fini
7769      pasting work.  */
7770   htab->stub_group[isec->id].toc_off = htab->toc_curr;
7771   return TRUE;
7772 }
7773
7774 /* See whether we can group stub sections together.  Grouping stub
7775    sections may result in fewer stubs.  More importantly, we need to
7776    put all .init* and .fini* stubs at the beginning of the .init or
7777    .fini output sections respectively, because glibc splits the
7778    _init and _fini functions into multiple parts.  Putting a stub in
7779    the middle of a function is not a good idea.  */
7780
7781 static void
7782 group_sections (struct ppc_link_hash_table *htab,
7783                 bfd_size_type stub_group_size,
7784                 bfd_boolean stubs_always_before_branch)
7785 {
7786   asection **list = htab->input_list + htab->top_index;
7787   do
7788     {
7789       asection *tail = *list;
7790       while (tail != NULL)
7791         {
7792           asection *curr;
7793           asection *prev;
7794           bfd_size_type total;
7795           bfd_boolean big_sec;
7796           bfd_vma curr_toc;
7797
7798           curr = tail;
7799           total = tail->size;
7800           big_sec = total >= stub_group_size;
7801           curr_toc = htab->stub_group[tail->id].toc_off;
7802
7803           while ((prev = PREV_SEC (curr)) != NULL
7804                  && ((total += curr->output_offset - prev->output_offset)
7805                      < stub_group_size)
7806                  && htab->stub_group[prev->id].toc_off == curr_toc)
7807             curr = prev;
7808
7809           /* OK, the size from the start of CURR to the end is less
7810              than stub_group_size and thus can be handled by one stub
7811              section.  (or the tail section is itself larger than
7812              stub_group_size, in which case we may be toast.)  We
7813              should really be keeping track of the total size of stubs
7814              added here, as stubs contribute to the final output
7815              section size.  That's a little tricky, and this way will
7816              only break if stubs added make the total size more than
7817              2^25, ie. for the default stub_group_size, if stubs total
7818              more than 2097152 bytes, or nearly 75000 plt call stubs.  */
7819           do
7820             {
7821               prev = PREV_SEC (tail);
7822               /* Set up this stub group.  */
7823               htab->stub_group[tail->id].link_sec = curr;
7824             }
7825           while (tail != curr && (tail = prev) != NULL);
7826
7827           /* But wait, there's more!  Input sections up to stub_group_size
7828              bytes before the stub section can be handled by it too.
7829              Don't do this if we have a really large section after the
7830              stubs, as adding more stubs increases the chance that
7831              branches may not reach into the stub section.  */
7832           if (!stubs_always_before_branch && !big_sec)
7833             {
7834               total = 0;
7835               while (prev != NULL
7836                      && ((total += tail->output_offset - prev->output_offset)
7837                          < stub_group_size)
7838                      && htab->stub_group[prev->id].toc_off == curr_toc)
7839                 {
7840                   tail = prev;
7841                   prev = PREV_SEC (tail);
7842                   htab->stub_group[tail->id].link_sec = curr;
7843                 }
7844             }
7845           tail = prev;
7846         }
7847     }
7848   while (list-- != htab->input_list);
7849   free (htab->input_list);
7850 #undef PREV_SEC
7851 }
7852
7853 /* Determine and set the size of the stub section for a final link.
7854
7855    The basic idea here is to examine all the relocations looking for
7856    PC-relative calls to a target that is unreachable with a "bl"
7857    instruction.  */
7858
7859 bfd_boolean
7860 ppc64_elf_size_stubs (bfd *output_bfd,
7861                       struct bfd_link_info *info,
7862                       bfd_signed_vma group_size,
7863                       asection *(*add_stub_section) (const char *, asection *),
7864                       void (*layout_sections_again) (void))
7865 {
7866   bfd_size_type stub_group_size;
7867   bfd_boolean stubs_always_before_branch;
7868   struct ppc_link_hash_table *htab = ppc_hash_table (info);
7869
7870   /* Stash our params away.  */
7871   htab->add_stub_section = add_stub_section;
7872   htab->layout_sections_again = layout_sections_again;
7873   stubs_always_before_branch = group_size < 0;
7874   if (group_size < 0)
7875     stub_group_size = -group_size;
7876   else
7877     stub_group_size = group_size;
7878   if (stub_group_size == 1)
7879     {
7880       /* Default values.  */
7881       if (stubs_always_before_branch)
7882         {
7883           stub_group_size = 0x1e00000;
7884           if (htab->has_14bit_branch)
7885             stub_group_size = 0x7800;
7886         }
7887       else
7888         {
7889           stub_group_size = 0x1c00000;
7890           if (htab->has_14bit_branch)
7891             stub_group_size = 0x7000;
7892         }
7893     }
7894
7895   group_sections (htab, stub_group_size, stubs_always_before_branch);
7896
7897   while (1)
7898     {
7899       bfd *input_bfd;
7900       unsigned int bfd_indx;
7901       asection *stub_sec;
7902       bfd_boolean stub_changed;
7903
7904       htab->stub_iteration += 1;
7905       stub_changed = FALSE;
7906
7907       for (input_bfd = info->input_bfds, bfd_indx = 0;
7908            input_bfd != NULL;
7909            input_bfd = input_bfd->link_next, bfd_indx++)
7910         {
7911           Elf_Internal_Shdr *symtab_hdr;
7912           asection *section;
7913           Elf_Internal_Sym *local_syms = NULL;
7914
7915           /* We'll need the symbol table in a second.  */
7916           symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
7917           if (symtab_hdr->sh_info == 0)
7918             continue;
7919
7920           /* Walk over each section attached to the input bfd.  */
7921           for (section = input_bfd->sections;
7922                section != NULL;
7923                section = section->next)
7924             {
7925               Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
7926
7927               /* If there aren't any relocs, then there's nothing more
7928                  to do.  */
7929               if ((section->flags & SEC_RELOC) == 0
7930                   || section->reloc_count == 0)
7931                 continue;
7932
7933               /* If this section is a link-once section that will be
7934                  discarded, then don't create any stubs.  */
7935               if (section->output_section == NULL
7936                   || section->output_section->owner != output_bfd)
7937                 continue;
7938
7939               /* Get the relocs.  */
7940               internal_relocs
7941                 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
7942                                              info->keep_memory);
7943               if (internal_relocs == NULL)
7944                 goto error_ret_free_local;
7945
7946               /* Now examine each relocation.  */
7947               irela = internal_relocs;
7948               irelaend = irela + section->reloc_count;
7949               for (; irela < irelaend; irela++)
7950                 {
7951                   enum elf_ppc64_reloc_type r_type;
7952                   unsigned int r_indx;
7953                   enum ppc_stub_type stub_type;
7954                   struct ppc_stub_hash_entry *stub_entry;
7955                   asection *sym_sec, *code_sec;
7956                   bfd_vma sym_value;
7957                   bfd_vma destination;
7958                   bfd_boolean ok_dest;
7959                   struct ppc_link_hash_entry *hash;
7960                   struct ppc_link_hash_entry *fdh;
7961                   struct elf_link_hash_entry *h;
7962                   Elf_Internal_Sym *sym;
7963                   char *stub_name;
7964                   const asection *id_sec;
7965                   long *opd_adjust;
7966
7967                   r_type = ELF64_R_TYPE (irela->r_info);
7968                   r_indx = ELF64_R_SYM (irela->r_info);
7969
7970                   if (r_type >= R_PPC64_max)
7971                     {
7972                       bfd_set_error (bfd_error_bad_value);
7973                       goto error_ret_free_internal;
7974                     }
7975
7976                   /* Only look for stubs on branch instructions.  */
7977                   if (r_type != R_PPC64_REL24
7978                       && r_type != R_PPC64_REL14
7979                       && r_type != R_PPC64_REL14_BRTAKEN
7980                       && r_type != R_PPC64_REL14_BRNTAKEN)
7981                     continue;
7982
7983                   /* Now determine the call target, its name, value,
7984                      section.  */
7985                   if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7986                                   r_indx, input_bfd))
7987                     goto error_ret_free_internal;
7988                   hash = (struct ppc_link_hash_entry *) h;
7989
7990                   ok_dest = FALSE;
7991                   fdh = NULL;
7992                   if (hash == NULL)
7993                     {
7994                       sym_value = sym->st_value;
7995                       ok_dest = TRUE;
7996                     }
7997                   else
7998                     {
7999                       sym_value = 0;
8000                       /* Recognise an old ABI func code entry sym, and
8001                          use the func descriptor sym instead.  */
8002                       if (hash->elf.root.type == bfd_link_hash_undefweak
8003                           && hash->elf.root.root.string[0] == '.'
8004                           && (fdh = get_fdh (hash, htab)) != NULL)
8005                         {
8006                           if (fdh->elf.root.type == bfd_link_hash_defined
8007                               || fdh->elf.root.type == bfd_link_hash_defweak)
8008                             {
8009                               sym_sec = fdh->elf.root.u.def.section;
8010                               sym_value = fdh->elf.root.u.def.value;
8011                               if (sym_sec->output_section != NULL)
8012                                 ok_dest = TRUE;
8013                             }
8014                           else
8015                             fdh = NULL;
8016                         }
8017                       else if (hash->elf.root.type == bfd_link_hash_defined
8018                                || hash->elf.root.type == bfd_link_hash_defweak)
8019                         {
8020                           sym_value = hash->elf.root.u.def.value;
8021                           if (sym_sec->output_section != NULL)
8022                             ok_dest = TRUE;
8023                         }
8024                       else if (hash->elf.root.type == bfd_link_hash_undefweak)
8025                         ;
8026                       else if (hash->elf.root.type == bfd_link_hash_undefined)
8027                         ;
8028                       else
8029                         {
8030                           bfd_set_error (bfd_error_bad_value);
8031                           goto error_ret_free_internal;
8032                         }
8033                     }
8034
8035                   destination = 0;
8036                   if (ok_dest)
8037                     {
8038                       sym_value += irela->r_addend;
8039                       destination = (sym_value
8040                                      + sym_sec->output_offset
8041                                      + sym_sec->output_section->vma);
8042                     }
8043
8044                   code_sec = sym_sec;
8045                   opd_adjust = get_opd_info (sym_sec);
8046                   if (opd_adjust != NULL)
8047                     {
8048                       bfd_vma dest;
8049
8050                       if (hash == NULL)
8051                         {
8052                           long adjust = opd_adjust[sym_value / 8];
8053                           if (adjust == -1)
8054                             continue;
8055                           sym_value += adjust;
8056                         }
8057                       dest = opd_entry_value (sym_sec, sym_value,
8058                                               &code_sec, &sym_value);
8059                       if (dest != (bfd_vma) -1)
8060                         {
8061                           destination = dest;
8062                           if (fdh != NULL)
8063                             {
8064                               /* Fixup old ABI sym to point at code
8065                                  entry.  */
8066                               hash->elf.root.type = bfd_link_hash_defweak;
8067                               hash->elf.root.u.def.section = code_sec;
8068                               hash->elf.root.u.def.value = sym_value;
8069                             }
8070                         }
8071                     }
8072
8073                   /* Determine what (if any) linker stub is needed.  */
8074                   stub_type = ppc_type_of_stub (section, irela, &hash,
8075                                                 destination);
8076
8077                   if (stub_type != ppc_stub_plt_call)
8078                     {
8079                       /* Check whether we need a TOC adjusting stub.
8080                          Since the linker pastes together pieces from
8081                          different object files when creating the
8082                          _init and _fini functions, it may be that a
8083                          call to what looks like a local sym is in
8084                          fact a call needing a TOC adjustment.  */
8085                       if (code_sec != NULL
8086                           && code_sec->output_section != NULL
8087                           && (htab->stub_group[code_sec->id].toc_off
8088                               != htab->stub_group[section->id].toc_off)
8089                           && code_sec->has_gp_reloc
8090                           && section->has_gp_reloc)
8091                         stub_type = ppc_stub_long_branch_r2off;
8092                     }
8093
8094                   if (stub_type == ppc_stub_none)
8095                     continue;
8096
8097                   /* __tls_get_addr calls might be eliminated.  */
8098                   if (stub_type != ppc_stub_plt_call
8099                       && hash != NULL
8100                       && (hash == htab->tls_get_addr
8101                           || hash == htab->tls_get_addr_fd)
8102                       && section->has_tls_reloc
8103                       && irela != internal_relocs)
8104                     {
8105                       /* Get tls info.  */
8106                       char *tls_mask;
8107
8108                       if (!get_tls_mask (&tls_mask, NULL, &local_syms,
8109                                          irela - 1, input_bfd))
8110                         goto error_ret_free_internal;
8111                       if (*tls_mask != 0)
8112                         continue;
8113                     }
8114
8115                   /* Support for grouping stub sections.  */
8116                   id_sec = htab->stub_group[section->id].link_sec;
8117
8118                   /* Get the name of this stub.  */
8119                   stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
8120                   if (!stub_name)
8121                     goto error_ret_free_internal;
8122
8123                   stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
8124                                                      stub_name, FALSE, FALSE);
8125                   if (stub_entry != NULL)
8126                     {
8127                       /* The proper stub has already been created.  */
8128                       free (stub_name);
8129                       continue;
8130                     }
8131
8132                   stub_entry = ppc_add_stub (stub_name, section, htab);
8133                   if (stub_entry == NULL)
8134                     {
8135                       free (stub_name);
8136                     error_ret_free_internal:
8137                       if (elf_section_data (section)->relocs == NULL)
8138                         free (internal_relocs);
8139                     error_ret_free_local:
8140                       if (local_syms != NULL
8141                           && (symtab_hdr->contents
8142                               != (unsigned char *) local_syms))
8143                         free (local_syms);
8144                       return FALSE;
8145                     }
8146
8147                   stub_entry->stub_type = stub_type;
8148                   stub_entry->target_value = sym_value;
8149                   stub_entry->target_section = code_sec;
8150                   stub_entry->h = hash;
8151                   stub_entry->addend = irela->r_addend;
8152                   stub_changed = TRUE;
8153                 }
8154
8155               /* We're done with the internal relocs, free them.  */
8156               if (elf_section_data (section)->relocs != internal_relocs)
8157                 free (internal_relocs);
8158             }
8159
8160           if (local_syms != NULL
8161               && symtab_hdr->contents != (unsigned char *) local_syms)
8162             {
8163               if (!info->keep_memory)
8164                 free (local_syms);
8165               else
8166                 symtab_hdr->contents = (unsigned char *) local_syms;
8167             }
8168         }
8169
8170       if (!stub_changed)
8171         break;
8172
8173       /* OK, we've added some stubs.  Find out the new size of the
8174          stub sections.  */
8175       for (stub_sec = htab->stub_bfd->sections;
8176            stub_sec != NULL;
8177            stub_sec = stub_sec->next)
8178         if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
8179           stub_sec->size = 0;
8180
8181       htab->brlt->size = 0;
8182       if (info->shared)
8183         htab->relbrlt->size = 0;
8184
8185       bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
8186
8187       /* Ask the linker to do its stuff.  */
8188       (*htab->layout_sections_again) ();
8189     }
8190
8191   /* It would be nice to strip .branch_lt from the output if the
8192      section is empty, but it's too late.  If we strip sections here,
8193      the dynamic symbol table is corrupted since the section symbol
8194      for the stripped section isn't written.  */
8195
8196   return TRUE;
8197 }
8198
8199 /* Called after we have determined section placement.  If sections
8200    move, we'll be called again.  Provide a value for TOCstart.  */
8201
8202 bfd_vma
8203 ppc64_elf_toc (bfd *obfd)
8204 {
8205   asection *s;
8206   bfd_vma TOCstart;
8207
8208   /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
8209      order.  The TOC starts where the first of these sections starts.  */
8210   s = bfd_get_section_by_name (obfd, ".got");
8211   if (s == NULL)
8212     s = bfd_get_section_by_name (obfd, ".toc");
8213   if (s == NULL)
8214     s = bfd_get_section_by_name (obfd, ".tocbss");
8215   if (s == NULL)
8216     s = bfd_get_section_by_name (obfd, ".plt");
8217   if (s == NULL)
8218     {
8219       /* This may happen for
8220          o  references to TOC base (SYM@toc / TOC[tc0]) without a
8221          .toc directive
8222          o  bad linker script
8223          o --gc-sections and empty TOC sections
8224
8225          FIXME: Warn user?  */
8226
8227       /* Look for a likely section.  We probably won't even be
8228          using TOCstart.  */
8229       for (s = obfd->sections; s != NULL; s = s->next)
8230         if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY))
8231             == (SEC_ALLOC | SEC_SMALL_DATA))
8232           break;
8233       if (s == NULL)
8234         for (s = obfd->sections; s != NULL; s = s->next)
8235           if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA))
8236               == (SEC_ALLOC | SEC_SMALL_DATA))
8237             break;
8238       if (s == NULL)
8239         for (s = obfd->sections; s != NULL; s = s->next)
8240           if ((s->flags & (SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC)
8241             break;
8242       if (s == NULL)
8243         for (s = obfd->sections; s != NULL; s = s->next)
8244           if ((s->flags & SEC_ALLOC) == SEC_ALLOC)
8245             break;
8246     }
8247
8248   TOCstart = 0;
8249   if (s != NULL)
8250     TOCstart = s->output_section->vma + s->output_offset;
8251
8252   return TOCstart;
8253 }
8254
8255 /* Build all the stubs associated with the current output file.
8256    The stubs are kept in a hash table attached to the main linker
8257    hash table.  This function is called via gldelf64ppc_finish.  */
8258
8259 bfd_boolean
8260 ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
8261                        struct bfd_link_info *info,
8262                        char **stats)
8263 {
8264   struct ppc_link_hash_table *htab = ppc_hash_table (info);
8265   asection *stub_sec;
8266   bfd_byte *p;
8267   int stub_sec_count = 0;
8268
8269   htab->emit_stub_syms = emit_stub_syms;
8270
8271   /* Allocate memory to hold the linker stubs.  */
8272   for (stub_sec = htab->stub_bfd->sections;
8273        stub_sec != NULL;
8274        stub_sec = stub_sec->next)
8275     if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
8276         && stub_sec->size != 0)
8277       {
8278         stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
8279         if (stub_sec->contents == NULL)
8280           return FALSE;
8281         /* We want to check that built size is the same as calculated
8282            size.  rawsize is a convenient location to use.  */
8283         stub_sec->rawsize = stub_sec->size;
8284         stub_sec->size = 0;
8285       }
8286
8287   if (htab->plt != NULL)
8288     {
8289       unsigned int indx;
8290       bfd_vma plt0;
8291
8292       /* Build the .glink plt call stub.  */
8293       plt0 = (htab->plt->output_section->vma
8294               + htab->plt->output_offset
8295               - (htab->glink->output_section->vma
8296                  + htab->glink->output_offset
8297                  + GLINK_CALL_STUB_SIZE));
8298       if (plt0 + 0x80008000 > 0xffffffff)
8299         {
8300           (*_bfd_error_handler) (_(".glink and .plt too far apart"));
8301           bfd_set_error (bfd_error_bad_value);
8302           return FALSE;
8303         }
8304
8305       if (htab->emit_stub_syms)
8306         {
8307           struct elf_link_hash_entry *h;
8308           h = elf_link_hash_lookup (&htab->elf, "__glink", TRUE, FALSE, FALSE);
8309           if (h == NULL)
8310             return FALSE;
8311           if (h->root.type == bfd_link_hash_new)
8312             {
8313               h->root.type = bfd_link_hash_defined;
8314               h->root.u.def.section = htab->glink;
8315               h->root.u.def.value = 0;
8316               h->elf_link_hash_flags = (ELF_LINK_HASH_REF_REGULAR
8317                                         | ELF_LINK_HASH_DEF_REGULAR
8318                                         | ELF_LINK_HASH_REF_REGULAR_NONWEAK
8319                                         | ELF_LINK_FORCED_LOCAL);
8320             }
8321         }
8322       p = htab->glink->contents;
8323       bfd_put_32 (htab->glink->owner, MFCTR_R12, p);
8324       p += 4;
8325       bfd_put_32 (htab->glink->owner, SLDI_R11_R0_3, p);
8326       p += 4;
8327       bfd_put_32 (htab->glink->owner, ADDIC_R2_R0_32K, p);
8328       p += 4;
8329       bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
8330       p += 4;
8331       bfd_put_32 (htab->glink->owner, SRADI_R2_R2_63, p);
8332       p += 4;
8333       bfd_put_32 (htab->glink->owner, SLDI_R11_R0_2, p);
8334       p += 4;
8335       bfd_put_32 (htab->glink->owner, AND_R2_R2_R11, p);
8336       p += 4;
8337       bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
8338       p += 4;
8339       bfd_put_32 (htab->glink->owner, ADD_R12_R12_R2, p);
8340       p += 4;
8341       bfd_put_32 (htab->glink->owner, ADDIS_R12_R12 | PPC_HA (plt0), p);
8342       p += 4;
8343       bfd_put_32 (htab->glink->owner, LD_R11_0R12 | PPC_LO (plt0), p);
8344       p += 4;
8345       bfd_put_32 (htab->glink->owner, ADDI_R12_R12 | PPC_LO (plt0), p);
8346       p += 4;
8347       bfd_put_32 (htab->glink->owner, LD_R2_0R12 | 8, p);
8348       p += 4;
8349       bfd_put_32 (htab->glink->owner, MTCTR_R11, p);
8350       p += 4;
8351       bfd_put_32 (htab->glink->owner, LD_R11_0R12 | 16, p);
8352       p += 4;
8353       bfd_put_32 (htab->glink->owner, BCTR, p);
8354       p += 4;
8355
8356       /* Build the .glink lazy link call stubs.  */
8357       indx = 0;
8358       while (p < htab->glink->contents + htab->glink->size)
8359         {
8360           if (indx < 0x8000)
8361             {
8362               bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
8363               p += 4;
8364             }
8365           else
8366             {
8367               bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
8368               p += 4;
8369               bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
8370               p += 4;
8371             }
8372           bfd_put_32 (htab->glink->owner,
8373                       B_DOT | ((htab->glink->contents - p) & 0x3fffffc), p);
8374           indx++;
8375           p += 4;
8376         }
8377       htab->glink->rawsize = p - htab->glink->contents;
8378     }
8379
8380   if (htab->brlt->size != 0)
8381     {
8382       htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
8383                                          htab->brlt->size);
8384       if (htab->brlt->contents == NULL)
8385         return FALSE;
8386     }
8387   if (info->shared && htab->relbrlt->size != 0)
8388     {
8389       htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
8390                                             htab->relbrlt->size);
8391       if (htab->relbrlt->contents == NULL)
8392         return FALSE;
8393     }
8394
8395   /* Build the stubs as directed by the stub hash table.  */
8396   bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
8397
8398   for (stub_sec = htab->stub_bfd->sections;
8399        stub_sec != NULL;
8400        stub_sec = stub_sec->next)
8401     if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
8402       {
8403         stub_sec_count += 1;
8404         if (stub_sec->rawsize != stub_sec->size)
8405           break;
8406       }
8407
8408   if (stub_sec != NULL
8409       || htab->glink->rawsize != htab->glink->size)
8410     {
8411       htab->stub_error = TRUE;
8412       (*_bfd_error_handler) (_("stubs don't match calculated size"));
8413     }
8414
8415   if (htab->stub_error)
8416     return FALSE;
8417
8418   if (stats != NULL)
8419     {
8420       *stats = bfd_malloc (500);
8421       if (*stats == NULL)
8422         return FALSE;
8423
8424       sprintf (*stats, _("linker stubs in %u groups\n"
8425                          "  branch       %lu\n"
8426                          "  toc adjust   %lu\n"
8427                          "  long branch  %lu\n"
8428                          "  long toc adj %lu\n"
8429                          "  plt call     %lu"),
8430                stub_sec_count,
8431                htab->stub_count[ppc_stub_long_branch - 1],
8432                htab->stub_count[ppc_stub_long_branch_r2off - 1],
8433                htab->stub_count[ppc_stub_plt_branch - 1],
8434                htab->stub_count[ppc_stub_plt_branch_r2off - 1],
8435                htab->stub_count[ppc_stub_plt_call - 1]);
8436     }
8437   return TRUE;
8438 }
8439
8440 /* This function undoes the changes made by add_symbol_adjust.  */
8441
8442 static bfd_boolean
8443 undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
8444 {
8445   struct ppc_link_hash_entry *eh;
8446
8447   if (h->root.type == bfd_link_hash_indirect)
8448     return TRUE;
8449
8450   if (h->root.type == bfd_link_hash_warning)
8451     h = (struct elf_link_hash_entry *) h->root.u.i.link;
8452
8453   eh = (struct ppc_link_hash_entry *) h;
8454   if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
8455     return TRUE;
8456
8457   eh->elf.root.type = bfd_link_hash_undefined;
8458   return TRUE;
8459 }
8460
8461 void
8462 ppc64_elf_restore_symbols (struct bfd_link_info *info)
8463 {
8464   struct ppc_link_hash_table *htab = ppc_hash_table (info);
8465   elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
8466 }
8467
8468 /* The RELOCATE_SECTION function is called by the ELF backend linker
8469    to handle the relocations for a section.
8470
8471    The relocs are always passed as Rela structures; if the section
8472    actually uses Rel structures, the r_addend field will always be
8473    zero.
8474
8475    This function is responsible for adjust the section contents as
8476    necessary, and (if using Rela relocs and generating a
8477    relocatable output file) adjusting the reloc addend as
8478    necessary.
8479
8480    This function does not have to worry about setting the reloc
8481    address or the reloc symbol index.
8482
8483    LOCAL_SYMS is a pointer to the swapped in local symbols.
8484
8485    LOCAL_SECTIONS is an array giving the section in the input file
8486    corresponding to the st_shndx field of each local symbol.
8487
8488    The global hash table entry for the global symbols can be found
8489    via elf_sym_hashes (input_bfd).
8490
8491    When generating relocatable output, this function must handle
8492    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
8493    going to be the section symbol corresponding to the output
8494    section, which means that the addend must be adjusted
8495    accordingly.  */
8496
8497 static bfd_boolean
8498 ppc64_elf_relocate_section (bfd *output_bfd,
8499                             struct bfd_link_info *info,
8500                             bfd *input_bfd,
8501                             asection *input_section,
8502                             bfd_byte *contents,
8503                             Elf_Internal_Rela *relocs,
8504                             Elf_Internal_Sym *local_syms,
8505                             asection **local_sections)
8506 {
8507   struct ppc_link_hash_table *htab;
8508   Elf_Internal_Shdr *symtab_hdr;
8509   struct elf_link_hash_entry **sym_hashes;
8510   Elf_Internal_Rela *rel;
8511   Elf_Internal_Rela *relend;
8512   Elf_Internal_Rela outrel;
8513   bfd_byte *loc;
8514   struct got_entry **local_got_ents;
8515   bfd_vma TOCstart;
8516   bfd_boolean ret = TRUE;
8517   bfd_boolean is_opd;
8518   /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
8519   bfd_boolean is_power4 = FALSE;
8520
8521   if (info->relocatable)
8522     return TRUE;
8523
8524   /* Initialize howto table if needed.  */
8525   if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
8526     ppc_howto_init ();
8527
8528   htab = ppc_hash_table (info);
8529   local_got_ents = elf_local_got_ents (input_bfd);
8530   TOCstart = elf_gp (output_bfd);
8531   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
8532   sym_hashes = elf_sym_hashes (input_bfd);
8533   is_opd = ppc64_elf_section_data (input_section)->opd.adjust != NULL;
8534
8535   rel = relocs;
8536   relend = relocs + input_section->reloc_count;
8537   for (; rel < relend; rel++)
8538     {
8539       enum elf_ppc64_reloc_type r_type;
8540       bfd_vma addend;
8541       bfd_reloc_status_type r;
8542       Elf_Internal_Sym *sym;
8543       asection *sec;
8544       struct elf_link_hash_entry *h_elf;
8545       struct ppc_link_hash_entry *h;
8546       struct ppc_link_hash_entry *fdh;
8547       const char *sym_name;
8548       unsigned long r_symndx, toc_symndx;
8549       char tls_mask, tls_gd, tls_type;
8550       char sym_type;
8551       bfd_vma relocation;
8552       bfd_boolean unresolved_reloc;
8553       bfd_boolean warned;
8554       unsigned long insn, mask;
8555       struct ppc_stub_hash_entry *stub_entry;
8556       bfd_vma max_br_offset;
8557       bfd_vma from;
8558
8559       r_type = ELF64_R_TYPE (rel->r_info);
8560       r_symndx = ELF64_R_SYM (rel->r_info);
8561
8562       /* For old style R_PPC64_TOC relocs with a zero symbol, use the
8563          symbol of the previous ADDR64 reloc.  The symbol gives us the
8564          proper TOC base to use.  */
8565       if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
8566           && rel != relocs
8567           && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
8568           && is_opd)
8569         r_symndx = ELF64_R_SYM (rel[-1].r_info);
8570
8571       sym = NULL;
8572       sec = NULL;
8573       h_elf = NULL;
8574       sym_name = NULL;
8575       unresolved_reloc = FALSE;
8576       warned = FALSE;
8577
8578       if (r_symndx < symtab_hdr->sh_info)
8579         {
8580           /* It's a local symbol.  */
8581           long *opd_adjust;
8582
8583           sym = local_syms + r_symndx;
8584           sec = local_sections[r_symndx];
8585           sym_name = bfd_elf_local_sym_name (input_bfd, sym);
8586           sym_type = ELF64_ST_TYPE (sym->st_info);
8587           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
8588           opd_adjust = get_opd_info (sec);
8589           if (opd_adjust != NULL)
8590             {
8591               long adjust = opd_adjust[(sym->st_value + rel->r_addend) / 8];
8592               if (adjust == -1)
8593                 relocation = 0;
8594               else
8595                 relocation += adjust;
8596             }
8597         }
8598       else
8599         {
8600           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
8601                                    r_symndx, symtab_hdr, sym_hashes,
8602                                    h_elf, sec, relocation,
8603                                    unresolved_reloc, warned);
8604           sym_name = h_elf->root.root.string;
8605           sym_type = h_elf->type;
8606         }
8607       h = (struct ppc_link_hash_entry *) h_elf;
8608
8609       /* TLS optimizations.  Replace instruction sequences and relocs
8610          based on information we collected in tls_optimize.  We edit
8611          RELOCS so that --emit-relocs will output something sensible
8612          for the final instruction stream.  */
8613       tls_mask = 0;
8614       tls_gd = 0;
8615       toc_symndx = 0;
8616       if (IS_PPC64_TLS_RELOC (r_type))
8617         {
8618           if (h != NULL)
8619             tls_mask = h->tls_mask;
8620           else if (local_got_ents != NULL)
8621             {
8622               char *lgot_masks;
8623               lgot_masks = (char *) (local_got_ents + symtab_hdr->sh_info);
8624               tls_mask = lgot_masks[r_symndx];
8625             }
8626           if (tls_mask == 0 && r_type == R_PPC64_TLS)
8627             {
8628               /* Check for toc tls entries.  */
8629               char *toc_tls;
8630
8631               if (!get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
8632                                  rel, input_bfd))
8633                 return FALSE;
8634
8635               if (toc_tls)
8636                 tls_mask = *toc_tls;
8637             }
8638         }
8639
8640       /* Check that tls relocs are used with tls syms, and non-tls
8641          relocs are used with non-tls syms.  */
8642       if (r_symndx != 0
8643           && r_type != R_PPC64_NONE
8644           && (h == NULL
8645               || h->elf.root.type == bfd_link_hash_defined
8646               || h->elf.root.type == bfd_link_hash_defweak)
8647           && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
8648         {
8649           if (r_type == R_PPC64_TLS && tls_mask != 0)
8650             /* R_PPC64_TLS is OK against a symbol in the TOC.  */
8651             ;
8652           else
8653             (*_bfd_error_handler)
8654               (sym_type == STT_TLS
8655                ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
8656                : _("%B(%A+0x%lx): %s used with non-TLS symbol %s"),
8657                input_bfd,
8658                input_section,
8659                (long) rel->r_offset,
8660                ppc64_elf_howto_table[r_type]->name,
8661                sym_name);
8662         }
8663
8664       /* Ensure reloc mapping code below stays sane.  */
8665       if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
8666           || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
8667           || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TLSGD16 & 3)
8668           || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
8669           || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
8670           || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
8671           || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TPREL16_DS & 3)
8672           || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
8673           || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
8674           || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
8675         abort ();
8676
8677       switch (r_type)
8678         {
8679         default:
8680           break;
8681
8682         case R_PPC64_TOC16:
8683         case R_PPC64_TOC16_LO:
8684         case R_PPC64_TOC16_DS:
8685         case R_PPC64_TOC16_LO_DS:
8686           {
8687             /* Check for toc tls entries.  */
8688             char *toc_tls;
8689             int retval;
8690
8691             retval = get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
8692                                    rel, input_bfd);
8693             if (retval == 0)
8694               return FALSE;
8695
8696             if (toc_tls)
8697               {
8698                 tls_mask = *toc_tls;
8699                 if (r_type == R_PPC64_TOC16_DS
8700                     || r_type == R_PPC64_TOC16_LO_DS)
8701                   {
8702                     if (tls_mask != 0
8703                         && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
8704                       goto toctprel;
8705                   }
8706                 else
8707                   {
8708                     /* If we found a GD reloc pair, then we might be
8709                        doing a GD->IE transition.  */
8710                     if (retval == 2)
8711                       {
8712                         tls_gd = TLS_TPRELGD;
8713                         if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
8714                           goto tls_get_addr_check;
8715                       }
8716                     else if (retval == 3)
8717                       {
8718                         if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
8719                           goto tls_get_addr_check;
8720                       }
8721                   }
8722               }
8723           }
8724           break;
8725
8726         case R_PPC64_GOT_TPREL16_DS:
8727         case R_PPC64_GOT_TPREL16_LO_DS:
8728           if (tls_mask != 0
8729               && (tls_mask & TLS_TPREL) == 0)
8730             {
8731             toctprel:
8732               insn = bfd_get_32 (output_bfd, contents + rel->r_offset - 2);
8733               insn &= 31 << 21;
8734               insn |= 0x3c0d0000;       /* addis 0,13,0 */
8735               bfd_put_32 (output_bfd, insn, contents + rel->r_offset - 2);
8736               r_type = R_PPC64_TPREL16_HA;
8737               if (toc_symndx != 0)
8738                 {
8739                   rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
8740                   /* We changed the symbol.  Start over in order to
8741                      get h, sym, sec etc. right.  */
8742                   rel--;
8743                   continue;
8744                 }
8745               else
8746                 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8747             }
8748           break;
8749
8750         case R_PPC64_TLS:
8751           if (tls_mask != 0
8752               && (tls_mask & TLS_TPREL) == 0)
8753             {
8754               bfd_vma rtra;
8755               insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
8756               if ((insn & ((0x3f << 26) | (31 << 11)))
8757                   == ((31 << 26) | (13 << 11)))
8758                 rtra = insn & ((1 << 26) - (1 << 16));
8759               else if ((insn & ((0x3f << 26) | (31 << 16)))
8760                        == ((31 << 26) | (13 << 16)))
8761                 rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
8762               else
8763                 abort ();
8764               if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
8765                 /* add -> addi.  */
8766                 insn = 14 << 26;
8767               else if ((insn & (31 << 1)) == 23 << 1
8768                        && ((insn & (31 << 6)) < 14 << 6
8769                            || ((insn & (31 << 6)) >= 16 << 6
8770                                && (insn & (31 << 6)) < 24 << 6)))
8771                 /* load and store indexed -> dform.  */
8772                 insn = (32 | ((insn >> 6) & 31)) << 26;
8773               else if ((insn & (31 << 1)) == 21 << 1
8774                        && (insn & (0x1a << 6)) == 0)
8775                 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
8776                 insn = (((58 | ((insn >> 6) & 4)) << 26)
8777                         | ((insn >> 6) & 1));
8778               else if ((insn & (31 << 1)) == 21 << 1
8779                        && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
8780                 /* lwax -> lwa.  */
8781                 insn = (58 << 26) | 2;
8782               else
8783                 abort ();
8784               insn |= rtra;
8785               bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
8786               /* Was PPC64_TLS which sits on insn boundary, now
8787                  PPC64_TPREL16_LO which is at insn+2.  */
8788               rel->r_offset += 2;
8789               r_type = R_PPC64_TPREL16_LO;
8790               if (toc_symndx != 0)
8791                 {
8792                   rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
8793                   /* We changed the symbol.  Start over in order to
8794                      get h, sym, sec etc. right.  */
8795                   rel--;
8796                   continue;
8797                 }
8798               else
8799                 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8800             }
8801           break;
8802
8803         case R_PPC64_GOT_TLSGD16_HI:
8804         case R_PPC64_GOT_TLSGD16_HA:
8805           tls_gd = TLS_TPRELGD;
8806           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
8807             goto tls_gdld_hi;
8808           break;
8809
8810         case R_PPC64_GOT_TLSLD16_HI:
8811         case R_PPC64_GOT_TLSLD16_HA:
8812           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
8813             {
8814             tls_gdld_hi:
8815               if ((tls_mask & tls_gd) != 0)
8816                 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
8817                           + R_PPC64_GOT_TPREL16_DS);
8818               else
8819                 {
8820                   bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
8821                   rel->r_offset -= 2;
8822                   r_type = R_PPC64_NONE;
8823                 }
8824               rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8825             }
8826           break;
8827
8828         case R_PPC64_GOT_TLSGD16:
8829         case R_PPC64_GOT_TLSGD16_LO:
8830           tls_gd = TLS_TPRELGD;
8831           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
8832             goto tls_get_addr_check;
8833           break;
8834
8835         case R_PPC64_GOT_TLSLD16:
8836         case R_PPC64_GOT_TLSLD16_LO:
8837           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
8838             {
8839             tls_get_addr_check:
8840               if (rel + 1 < relend)
8841                 {
8842                   enum elf_ppc64_reloc_type r_type2;
8843                   unsigned long r_symndx2;
8844                   struct elf_link_hash_entry *h2;
8845                   bfd_vma insn1, insn2, insn3;
8846                   bfd_vma offset;
8847
8848                   /* The next instruction should be a call to
8849                      __tls_get_addr.  Peek at the reloc to be sure.  */
8850                   r_type2 = ELF64_R_TYPE (rel[1].r_info);
8851                   r_symndx2 = ELF64_R_SYM (rel[1].r_info);
8852                   if (r_symndx2 < symtab_hdr->sh_info
8853                       || (r_type2 != R_PPC64_REL14
8854                           && r_type2 != R_PPC64_REL14_BRTAKEN
8855                           && r_type2 != R_PPC64_REL14_BRNTAKEN
8856                           && r_type2 != R_PPC64_REL24))
8857                     break;
8858
8859                   h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
8860                   while (h2->root.type == bfd_link_hash_indirect
8861                          || h2->root.type == bfd_link_hash_warning)
8862                     h2 = (struct elf_link_hash_entry *) h2->root.u.i.link;
8863                   if (h2 == NULL || (h2 != &htab->tls_get_addr->elf
8864                                      && h2 != &htab->tls_get_addr_fd->elf))
8865                     break;
8866
8867                   /* OK, it checks out.  Replace the call.  */
8868                   offset = rel[1].r_offset;
8869                   insn1 = bfd_get_32 (output_bfd,
8870                                       contents + rel->r_offset - 2);
8871                   insn3 = bfd_get_32 (output_bfd,
8872                                       contents + offset + 4);
8873                   if ((tls_mask & tls_gd) != 0)
8874                     {
8875                       /* IE */
8876                       insn1 &= (1 << 26) - (1 << 2);
8877                       insn1 |= 58 << 26;        /* ld */
8878                       insn2 = 0x7c636a14;       /* add 3,3,13 */
8879                       rel[1].r_info = ELF64_R_INFO (r_symndx2, R_PPC64_NONE);
8880                       if ((tls_mask & TLS_EXPLICIT) == 0)
8881                         r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
8882                                   + R_PPC64_GOT_TPREL16_DS);
8883                       else
8884                         r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
8885                       rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8886                     }
8887                   else
8888                     {
8889                       /* LE */
8890                       insn1 = 0x3c6d0000;       /* addis 3,13,0 */
8891                       insn2 = 0x38630000;       /* addi 3,3,0 */
8892                       if (tls_gd == 0)
8893                         {
8894                           /* Was an LD reloc.  */
8895                           r_symndx = 0;
8896                           rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
8897                           rel[1].r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
8898                         }
8899                       else if (toc_symndx != 0)
8900                         r_symndx = toc_symndx;
8901                       r_type = R_PPC64_TPREL16_HA;
8902                       rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8903                       rel[1].r_info = ELF64_R_INFO (r_symndx,
8904                                                     R_PPC64_TPREL16_LO);
8905                       rel[1].r_offset += 2;
8906                     }
8907                   if (insn3 == NOP
8908                       || insn3 == CROR_151515 || insn3 == CROR_313131)
8909                     {
8910                       insn3 = insn2;
8911                       insn2 = NOP;
8912                       rel[1].r_offset += 4;
8913                     }
8914                   bfd_put_32 (output_bfd, insn1, contents + rel->r_offset - 2);
8915                   bfd_put_32 (output_bfd, insn2, contents + offset);
8916                   bfd_put_32 (output_bfd, insn3, contents + offset + 4);
8917                   if (tls_gd == 0 || toc_symndx != 0)
8918                     {
8919                       /* We changed the symbol.  Start over in order
8920                          to get h, sym, sec etc. right.  */
8921                       rel--;
8922                       continue;
8923                     }
8924                 }
8925             }
8926           break;
8927
8928         case R_PPC64_DTPMOD64:
8929           if (rel + 1 < relend
8930               && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
8931               && rel[1].r_offset == rel->r_offset + 8)
8932             {
8933               if ((tls_mask & TLS_GD) == 0)
8934                 {
8935                   rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
8936                   if ((tls_mask & TLS_TPRELGD) != 0)
8937                     r_type = R_PPC64_TPREL64;
8938                   else
8939                     {
8940                       bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
8941                       r_type = R_PPC64_NONE;
8942                     }
8943                   rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8944                 }
8945             }
8946           else
8947             {
8948               if ((tls_mask & TLS_LD) == 0)
8949                 {
8950                   bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
8951                   r_type = R_PPC64_NONE;
8952                   rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8953                 }
8954             }
8955           break;
8956
8957         case R_PPC64_TPREL64:
8958           if ((tls_mask & TLS_TPREL) == 0)
8959             {
8960               r_type = R_PPC64_NONE;
8961               rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8962             }
8963           break;
8964         }
8965
8966       /* Handle other relocations that tweak non-addend part of insn.  */
8967       insn = 0;
8968       max_br_offset = 1 << 25;
8969       addend = rel->r_addend;
8970       switch (r_type)
8971         {
8972         default:
8973           break;
8974
8975           /* Branch taken prediction relocations.  */
8976         case R_PPC64_ADDR14_BRTAKEN:
8977         case R_PPC64_REL14_BRTAKEN:
8978           insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
8979           /* Fall thru.  */
8980
8981           /* Branch not taken prediction relocations.  */
8982         case R_PPC64_ADDR14_BRNTAKEN:
8983         case R_PPC64_REL14_BRNTAKEN:
8984           insn |= bfd_get_32 (output_bfd,
8985                               contents + rel->r_offset) & ~(0x01 << 21);
8986           /* Fall thru.  */
8987
8988         case R_PPC64_REL14:
8989           max_br_offset = 1 << 15;
8990           /* Fall thru.  */
8991
8992         case R_PPC64_REL24:
8993           /* Calls to functions with a different TOC, such as calls to
8994              shared objects, need to alter the TOC pointer.  This is
8995              done using a linkage stub.  A REL24 branching to these
8996              linkage stubs needs to be followed by a nop, as the nop
8997              will be replaced with an instruction to restore the TOC
8998              base pointer.  */
8999           stub_entry = NULL;
9000           fdh = h;
9001           if (((h != NULL
9002                 && (((fdh = h->oh) != NULL
9003                      && fdh->elf.plt.plist != NULL)
9004                     || (fdh = h)->elf.plt.plist != NULL))
9005                || (sec != NULL
9006                    && sec->output_section != NULL
9007                    && sec->id <= htab->top_id
9008                    && (htab->stub_group[sec->id].toc_off
9009                        != htab->stub_group[input_section->id].toc_off)))
9010               && (stub_entry = ppc_get_stub_entry (input_section, sec, fdh,
9011                                                    rel, htab)) != NULL
9012               && (stub_entry->stub_type == ppc_stub_plt_call
9013                   || stub_entry->stub_type == ppc_stub_plt_branch_r2off
9014                   || stub_entry->stub_type == ppc_stub_long_branch_r2off))
9015             {
9016               bfd_boolean can_plt_call = FALSE;
9017
9018               if (rel->r_offset + 8 <= input_section->size)
9019                 {
9020                   unsigned long nop;
9021                   nop = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
9022                   if (nop == NOP
9023                       || nop == CROR_151515 || nop == CROR_313131)
9024                     {
9025                       bfd_put_32 (input_bfd, LD_R2_40R1,
9026                                   contents + rel->r_offset + 4);
9027                       can_plt_call = TRUE;
9028                     }
9029                 }
9030
9031               if (!can_plt_call)
9032                 {
9033                   if (stub_entry->stub_type == ppc_stub_plt_call)
9034                     {
9035                       /* If this is a plain branch rather than a branch
9036                          and link, don't require a nop.  */
9037                       unsigned long br;
9038                       br = bfd_get_32 (input_bfd, contents + rel->r_offset);
9039                       if ((br & 1) == 0)
9040                         can_plt_call = TRUE;
9041                     }
9042                   else if (h != NULL
9043                            && strcmp (h->elf.root.root.string,
9044                                       ".__libc_start_main") == 0)
9045                     {
9046                       /* Allow crt1 branch to go via a toc adjusting stub.  */
9047                       can_plt_call = TRUE;
9048                     }
9049                   else
9050                     {
9051                       if (strcmp (input_section->output_section->name,
9052                                   ".init") == 0
9053                           || strcmp (input_section->output_section->name,
9054                                      ".fini") == 0)
9055                         (*_bfd_error_handler)
9056                           (_("%B(%A+0x%lx): automatic multiple TOCs "
9057                              "not supported using your crt files; "
9058                              "recompile with -mminimal-toc or upgrade gcc"),
9059                            input_bfd,
9060                            input_section,
9061                            (long) rel->r_offset);
9062                       else
9063                         (*_bfd_error_handler)
9064                           (_("%B(%A+0x%lx): sibling call optimization to `%s' "
9065                              "does not allow automatic multiple TOCs; "
9066                              "recompile with -mminimal-toc or "
9067                              "-fno-optimize-sibling-calls, "
9068                              "or make `%s' extern"),
9069                            input_bfd,
9070                            input_section,
9071                            (long) rel->r_offset,
9072                            sym_name,
9073                            sym_name);
9074                       bfd_set_error (bfd_error_bad_value);
9075                       ret = FALSE;
9076                     }
9077                 }
9078
9079               if (can_plt_call
9080                   && stub_entry->stub_type == ppc_stub_plt_call)
9081                 unresolved_reloc = FALSE;
9082             }
9083
9084           if (stub_entry == NULL
9085               && get_opd_info (sec) != NULL)
9086             {
9087               /* The branch destination is the value of the opd entry. */
9088               bfd_vma off = (relocation - sec->output_section->vma
9089                              - sec->output_offset + rel->r_addend);
9090               bfd_vma dest = opd_entry_value (sec, off, NULL, NULL);
9091               if (dest != (bfd_vma) -1)
9092                 {
9093                   relocation = dest;
9094                   addend = 0;
9095                 }
9096             }
9097
9098           /* If the branch is out of reach we ought to have a long
9099              branch stub.  */
9100           from = (rel->r_offset
9101                   + input_section->output_offset
9102                   + input_section->output_section->vma);
9103
9104           if (stub_entry == NULL
9105               && (relocation + rel->r_addend - from + max_br_offset
9106                   >= 2 * max_br_offset)
9107               && r_type != R_PPC64_ADDR14_BRTAKEN
9108               && r_type != R_PPC64_ADDR14_BRNTAKEN)
9109             stub_entry = ppc_get_stub_entry (input_section, sec, h, rel,
9110                                              htab);
9111
9112           if (stub_entry != NULL)
9113             {
9114               /* Munge up the value and addend so that we call the stub
9115                  rather than the procedure directly.  */
9116               relocation = (stub_entry->stub_offset
9117                             + stub_entry->stub_sec->output_offset
9118                             + stub_entry->stub_sec->output_section->vma);
9119               addend = 0;
9120             }
9121
9122           if (insn != 0)
9123             {
9124               if (is_power4)
9125                 {
9126                   /* Set 'a' bit.  This is 0b00010 in BO field for branch
9127                      on CR(BI) insns (BO == 001at or 011at), and 0b01000
9128                      for branch on CTR insns (BO == 1a00t or 1a01t).  */
9129                   if ((insn & (0x14 << 21)) == (0x04 << 21))
9130                     insn |= 0x02 << 21;
9131                   else if ((insn & (0x14 << 21)) == (0x10 << 21))
9132                     insn |= 0x08 << 21;
9133                   else
9134                     break;
9135                 }
9136               else
9137                 {
9138                   /* Invert 'y' bit if not the default.  */
9139                   if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
9140                     insn ^= 0x01 << 21;
9141                 }
9142
9143               bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
9144             }
9145
9146           /* NOP out calls to undefined weak functions.
9147              We can thus call a weak function without first
9148              checking whether the function is defined.  */
9149           else if (h != NULL
9150                    && h->elf.root.type == bfd_link_hash_undefweak
9151                    && r_type == R_PPC64_REL24
9152                    && relocation == 0
9153                    && rel->r_addend == 0)
9154             {
9155               bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
9156               continue;
9157             }
9158           break;
9159         }
9160
9161       /* Set `addend'.  */
9162       tls_type = 0;
9163       switch (r_type)
9164         {
9165         default:
9166           (*_bfd_error_handler)
9167             (_("%B: unknown relocation type %d for symbol %s"),
9168              input_bfd, (int) r_type, sym_name);
9169
9170           bfd_set_error (bfd_error_bad_value);
9171           ret = FALSE;
9172           continue;
9173
9174         case R_PPC64_NONE:
9175         case R_PPC64_TLS:
9176         case R_PPC64_GNU_VTINHERIT:
9177         case R_PPC64_GNU_VTENTRY:
9178           continue;
9179
9180           /* GOT16 relocations.  Like an ADDR16 using the symbol's
9181              address in the GOT as relocation value instead of the
9182              symbol's value itself.  Also, create a GOT entry for the
9183              symbol and put the symbol value there.  */
9184         case R_PPC64_GOT_TLSGD16:
9185         case R_PPC64_GOT_TLSGD16_LO:
9186         case R_PPC64_GOT_TLSGD16_HI:
9187         case R_PPC64_GOT_TLSGD16_HA:
9188           tls_type = TLS_TLS | TLS_GD;
9189           goto dogot;
9190
9191         case R_PPC64_GOT_TLSLD16:
9192         case R_PPC64_GOT_TLSLD16_LO:
9193         case R_PPC64_GOT_TLSLD16_HI:
9194         case R_PPC64_GOT_TLSLD16_HA:
9195           tls_type = TLS_TLS | TLS_LD;
9196           goto dogot;
9197
9198         case R_PPC64_GOT_TPREL16_DS:
9199         case R_PPC64_GOT_TPREL16_LO_DS:
9200         case R_PPC64_GOT_TPREL16_HI:
9201         case R_PPC64_GOT_TPREL16_HA:
9202           tls_type = TLS_TLS | TLS_TPREL;
9203           goto dogot;
9204
9205         case R_PPC64_GOT_DTPREL16_DS:
9206         case R_PPC64_GOT_DTPREL16_LO_DS:
9207         case R_PPC64_GOT_DTPREL16_HI:
9208         case R_PPC64_GOT_DTPREL16_HA:
9209           tls_type = TLS_TLS | TLS_DTPREL;
9210           goto dogot;
9211
9212         case R_PPC64_GOT16:
9213         case R_PPC64_GOT16_LO:
9214         case R_PPC64_GOT16_HI:
9215         case R_PPC64_GOT16_HA:
9216         case R_PPC64_GOT16_DS:
9217         case R_PPC64_GOT16_LO_DS:
9218         dogot:
9219           {
9220             /* Relocation is to the entry for this symbol in the global
9221                offset table.  */
9222             asection *got;
9223             bfd_vma *offp;
9224             bfd_vma off;
9225             unsigned long indx = 0;
9226
9227             if (tls_type == (TLS_TLS | TLS_LD)
9228                 && (h == NULL
9229                     || (h->elf.elf_link_hash_flags
9230                         & ELF_LINK_HASH_DEF_DYNAMIC) == 0))
9231               offp = &ppc64_tlsld_got (input_bfd)->offset;
9232             else
9233               {
9234                 struct got_entry *ent;
9235
9236                 if (h != NULL)
9237                   {
9238                     bfd_boolean dyn = htab->elf.dynamic_sections_created;
9239                     if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
9240                                                           &h->elf)
9241                         || (info->shared
9242                             && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
9243                       /* This is actually a static link, or it is a
9244                          -Bsymbolic link and the symbol is defined
9245                          locally, or the symbol was forced to be local
9246                          because of a version file.  */
9247                       ;
9248                     else
9249                       {
9250                         indx = h->elf.dynindx;
9251                         unresolved_reloc = FALSE;
9252                       }
9253                     ent = h->elf.got.glist;
9254                   }
9255                 else
9256                   {
9257                     if (local_got_ents == NULL)
9258                       abort ();
9259                     ent = local_got_ents[r_symndx];
9260                   }
9261
9262                 for (; ent != NULL; ent = ent->next)
9263                   if (ent->addend == rel->r_addend
9264                       && ent->owner == input_bfd
9265                       && ent->tls_type == tls_type)
9266                     break;
9267                 if (ent == NULL)
9268                   abort ();
9269                 offp = &ent->got.offset;
9270               }
9271
9272             got = ppc64_elf_tdata (input_bfd)->got;
9273             if (got == NULL)
9274               abort ();
9275
9276             /* The offset must always be a multiple of 8.  We use the
9277                least significant bit to record whether we have already
9278                processed this entry.  */
9279             off = *offp;
9280             if ((off & 1) != 0)
9281               off &= ~1;
9282             else
9283               {
9284                 /* Generate relocs for the dynamic linker, except in
9285                    the case of TLSLD where we'll use one entry per
9286                    module.  */
9287                 asection *relgot = ppc64_elf_tdata (input_bfd)->relgot;
9288
9289                 *offp = off | 1;
9290                 if ((info->shared || indx != 0)
9291                     && (h == NULL
9292                         || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
9293                         || h->elf.root.type != bfd_link_hash_undefweak))
9294                   {
9295                     outrel.r_offset = (got->output_section->vma
9296                                        + got->output_offset
9297                                        + off);
9298                     outrel.r_addend = rel->r_addend;
9299                     if (tls_type & (TLS_LD | TLS_GD))
9300                       {
9301                         outrel.r_addend = 0;
9302                         outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
9303                         if (tls_type == (TLS_TLS | TLS_GD))
9304                           {
9305                             loc = relgot->contents;
9306                             loc += (relgot->reloc_count++
9307                                     * sizeof (Elf64_External_Rela));
9308                             bfd_elf64_swap_reloca_out (output_bfd,
9309                                                        &outrel, loc);
9310                             outrel.r_offset += 8;
9311                             outrel.r_addend = rel->r_addend;
9312                             outrel.r_info
9313                               = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
9314                           }
9315                       }
9316                     else if (tls_type == (TLS_TLS | TLS_DTPREL))
9317                       outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
9318                     else if (tls_type == (TLS_TLS | TLS_TPREL))
9319                       outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
9320                     else if (indx == 0)
9321                       {
9322                         outrel.r_info = ELF64_R_INFO (indx, R_PPC64_RELATIVE);
9323
9324                         /* Write the .got section contents for the sake
9325                            of prelink.  */
9326                         loc = got->contents + off;
9327                         bfd_put_64 (output_bfd, outrel.r_addend + relocation,
9328                                     loc);
9329                       }
9330                     else
9331                       outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
9332
9333                     if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
9334                       {
9335                         outrel.r_addend += relocation;
9336                         if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
9337                           outrel.r_addend -= htab->elf.tls_sec->vma;
9338                       }
9339                     loc = relgot->contents;
9340                     loc += (relgot->reloc_count++
9341                             * sizeof (Elf64_External_Rela));
9342                     bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
9343                   }
9344
9345                 /* Init the .got section contents here if we're not
9346                    emitting a reloc.  */
9347                 else
9348                   {
9349                     relocation += rel->r_addend;
9350                     if (tls_type == (TLS_TLS | TLS_LD))
9351                       relocation = 1;
9352                     else if (tls_type != 0)
9353                       {
9354                         relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
9355                         if (tls_type == (TLS_TLS | TLS_TPREL))
9356                           relocation += DTP_OFFSET - TP_OFFSET;
9357
9358                         if (tls_type == (TLS_TLS | TLS_GD))
9359                           {
9360                             bfd_put_64 (output_bfd, relocation,
9361                                         got->contents + off + 8);
9362                             relocation = 1;
9363                           }
9364                       }
9365
9366                     bfd_put_64 (output_bfd, relocation,
9367                                 got->contents + off);
9368                   }
9369               }
9370
9371             if (off >= (bfd_vma) -2)
9372               abort ();
9373
9374             relocation = got->output_offset + off;
9375
9376             /* TOC base (r2) is TOC start plus 0x8000.  */
9377             addend = -TOC_BASE_OFF;
9378           }
9379           break;
9380
9381         case R_PPC64_PLT16_HA:
9382         case R_PPC64_PLT16_HI:
9383         case R_PPC64_PLT16_LO:
9384         case R_PPC64_PLT32:
9385         case R_PPC64_PLT64:
9386           /* Relocation is to the entry for this symbol in the
9387              procedure linkage table.  */
9388
9389           /* Resolve a PLT reloc against a local symbol directly,
9390              without using the procedure linkage table.  */
9391           if (h == NULL)
9392             break;
9393
9394           /* It's possible that we didn't make a PLT entry for this
9395              symbol.  This happens when statically linking PIC code,
9396              or when using -Bsymbolic.  Go find a match if there is a
9397              PLT entry.  */
9398           if (htab->plt != NULL)
9399             {
9400               struct plt_entry *ent;
9401               for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
9402                 if (ent->addend == rel->r_addend
9403                     && ent->plt.offset != (bfd_vma) -1)
9404                   {
9405                     relocation = (htab->plt->output_section->vma
9406                                   + htab->plt->output_offset
9407                                   + ent->plt.offset);
9408                     unresolved_reloc = FALSE;
9409                   }
9410             }
9411           break;
9412
9413         case R_PPC64_TOC:
9414           /* Relocation value is TOC base.  */
9415           relocation = TOCstart;
9416           if (r_symndx == 0)
9417             relocation += htab->stub_group[input_section->id].toc_off;
9418           else if (unresolved_reloc)
9419             ;
9420           else if (sec != NULL && sec->id <= htab->top_id)
9421             relocation += htab->stub_group[sec->id].toc_off;
9422           else
9423             unresolved_reloc = TRUE;
9424           goto dodyn2;
9425
9426           /* TOC16 relocs.  We want the offset relative to the TOC base,
9427              which is the address of the start of the TOC plus 0x8000.
9428              The TOC consists of sections .got, .toc, .tocbss, and .plt,
9429              in this order.  */
9430         case R_PPC64_TOC16:
9431         case R_PPC64_TOC16_LO:
9432         case R_PPC64_TOC16_HI:
9433         case R_PPC64_TOC16_DS:
9434         case R_PPC64_TOC16_LO_DS:
9435         case R_PPC64_TOC16_HA:
9436           addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
9437           break;
9438
9439           /* Relocate against the beginning of the section.  */
9440         case R_PPC64_SECTOFF:
9441         case R_PPC64_SECTOFF_LO:
9442         case R_PPC64_SECTOFF_HI:
9443         case R_PPC64_SECTOFF_DS:
9444         case R_PPC64_SECTOFF_LO_DS:
9445         case R_PPC64_SECTOFF_HA:
9446           if (sec != NULL)
9447             addend -= sec->output_section->vma;
9448           break;
9449
9450         case R_PPC64_REL14:
9451         case R_PPC64_REL14_BRNTAKEN:
9452         case R_PPC64_REL14_BRTAKEN:
9453         case R_PPC64_REL24:
9454           break;
9455
9456         case R_PPC64_TPREL16:
9457         case R_PPC64_TPREL16_LO:
9458         case R_PPC64_TPREL16_HI:
9459         case R_PPC64_TPREL16_HA:
9460         case R_PPC64_TPREL16_DS:
9461         case R_PPC64_TPREL16_LO_DS:
9462         case R_PPC64_TPREL16_HIGHER:
9463         case R_PPC64_TPREL16_HIGHERA:
9464         case R_PPC64_TPREL16_HIGHEST:
9465         case R_PPC64_TPREL16_HIGHESTA:
9466           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
9467           if (info->shared)
9468             /* The TPREL16 relocs shouldn't really be used in shared
9469                libs as they will result in DT_TEXTREL being set, but
9470                support them anyway.  */
9471             goto dodyn;
9472           break;
9473
9474         case R_PPC64_DTPREL16:
9475         case R_PPC64_DTPREL16_LO:
9476         case R_PPC64_DTPREL16_HI:
9477         case R_PPC64_DTPREL16_HA:
9478         case R_PPC64_DTPREL16_DS:
9479         case R_PPC64_DTPREL16_LO_DS:
9480         case R_PPC64_DTPREL16_HIGHER:
9481         case R_PPC64_DTPREL16_HIGHERA:
9482         case R_PPC64_DTPREL16_HIGHEST:
9483         case R_PPC64_DTPREL16_HIGHESTA:
9484           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
9485           break;
9486
9487         case R_PPC64_DTPMOD64:
9488           relocation = 1;
9489           addend = 0;
9490           goto dodyn;
9491
9492         case R_PPC64_TPREL64:
9493           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
9494           goto dodyn;
9495
9496         case R_PPC64_DTPREL64:
9497           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
9498           /* Fall thru */
9499
9500           /* Relocations that may need to be propagated if this is a
9501              dynamic object.  */
9502         case R_PPC64_REL30:
9503         case R_PPC64_REL32:
9504         case R_PPC64_REL64:
9505         case R_PPC64_ADDR14:
9506         case R_PPC64_ADDR14_BRNTAKEN:
9507         case R_PPC64_ADDR14_BRTAKEN:
9508         case R_PPC64_ADDR16:
9509         case R_PPC64_ADDR16_DS:
9510         case R_PPC64_ADDR16_HA:
9511         case R_PPC64_ADDR16_HI:
9512         case R_PPC64_ADDR16_HIGHER:
9513         case R_PPC64_ADDR16_HIGHERA:
9514         case R_PPC64_ADDR16_HIGHEST:
9515         case R_PPC64_ADDR16_HIGHESTA:
9516         case R_PPC64_ADDR16_LO:
9517         case R_PPC64_ADDR16_LO_DS:
9518         case R_PPC64_ADDR24:
9519         case R_PPC64_ADDR32:
9520         case R_PPC64_ADDR64:
9521         case R_PPC64_UADDR16:
9522         case R_PPC64_UADDR32:
9523         case R_PPC64_UADDR64:
9524           /* r_symndx will be zero only for relocs against symbols
9525              from removed linkonce sections, or sections discarded by
9526              a linker script.  */
9527         dodyn:
9528           if (r_symndx == 0)
9529             break;
9530           /* Fall thru.  */
9531
9532         dodyn2:
9533           if ((input_section->flags & SEC_ALLOC) == 0)
9534             break;
9535
9536           if (NO_OPD_RELOCS && is_opd)
9537             break;
9538
9539           if ((info->shared
9540                && (h == NULL
9541                    || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
9542                    || h->elf.root.type != bfd_link_hash_undefweak)
9543                && (MUST_BE_DYN_RELOC (r_type)
9544                    || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
9545               || (ELIMINATE_COPY_RELOCS
9546                   && !info->shared
9547                   && h != NULL
9548                   && h->elf.dynindx != -1
9549                   && !(h->elf.elf_link_hash_flags & ELF_LINK_NON_GOT_REF)
9550                   && (h->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC)
9551                   && !(h->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
9552             {
9553               Elf_Internal_Rela outrel;
9554               bfd_boolean skip, relocate;
9555               asection *sreloc;
9556               bfd_byte *loc;
9557               bfd_vma out_off;
9558
9559               /* When generating a dynamic object, these relocations
9560                  are copied into the output file to be resolved at run
9561                  time.  */
9562
9563               skip = FALSE;
9564               relocate = FALSE;
9565
9566               out_off = _bfd_elf_section_offset (output_bfd, info,
9567                                                  input_section, rel->r_offset);
9568               if (out_off == (bfd_vma) -1)
9569                 skip = TRUE;
9570               else if (out_off == (bfd_vma) -2)
9571                 skip = TRUE, relocate = TRUE;
9572               out_off += (input_section->output_section->vma
9573                           + input_section->output_offset);
9574               outrel.r_offset = out_off;
9575               outrel.r_addend = rel->r_addend;
9576
9577               /* Optimize unaligned reloc use.  */
9578               if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
9579                   || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
9580                 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
9581               else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
9582                        || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
9583                 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
9584               else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
9585                        || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
9586                 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
9587
9588               if (skip)
9589                 memset (&outrel, 0, sizeof outrel);
9590               else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
9591                        && !is_opd
9592                        && r_type != R_PPC64_TOC)
9593                 outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
9594               else
9595                 {
9596                   /* This symbol is local, or marked to become local,
9597                      or this is an opd section reloc which must point
9598                      at a local function.  */
9599                   outrel.r_addend += relocation;
9600                   if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
9601                     {
9602                       if (is_opd && h != NULL)
9603                         {
9604                           /* Lie about opd entries.  This case occurs
9605                              when building shared libraries and we
9606                              reference a function in another shared
9607                              lib.  The same thing happens for a weak
9608                              definition in an application that's
9609                              overridden by a strong definition in a
9610                              shared lib.  (I believe this is a generic
9611                              bug in binutils handling of weak syms.)
9612                              In these cases we won't use the opd
9613                              entry in this lib.  */
9614                           unresolved_reloc = FALSE;
9615                         }
9616                       outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
9617
9618                       /* We need to relocate .opd contents for ld.so.
9619                          Prelink also wants simple and consistent rules
9620                          for relocs.  This make all RELATIVE relocs have
9621                          *r_offset equal to r_addend.  */
9622                       relocate = TRUE;
9623                     }
9624                   else
9625                     {
9626                       long indx = 0;
9627
9628                       if (bfd_is_abs_section (sec))
9629                         ;
9630                       else if (sec == NULL || sec->owner == NULL)
9631                         {
9632                           bfd_set_error (bfd_error_bad_value);
9633                           return FALSE;
9634                         }
9635                       else
9636                         {
9637                           asection *osec;
9638
9639                           osec = sec->output_section;
9640                           indx = elf_section_data (osec)->dynindx;
9641
9642                           /* We are turning this relocation into one
9643                              against a section symbol, so subtract out
9644                              the output section's address but not the
9645                              offset of the input section in the output
9646                              section.  */
9647                           outrel.r_addend -= osec->vma;
9648                         }
9649
9650                       outrel.r_info = ELF64_R_INFO (indx, r_type);
9651                     }
9652                 }
9653
9654               sreloc = elf_section_data (input_section)->sreloc;
9655               if (sreloc == NULL)
9656                 abort ();
9657
9658               loc = sreloc->contents;
9659               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
9660               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
9661
9662               /* If this reloc is against an external symbol, it will
9663                  be computed at runtime, so there's no need to do
9664                  anything now.  However, for the sake of prelink ensure
9665                  that the section contents are a known value.  */
9666               if (! relocate)
9667                 {
9668                   unresolved_reloc = FALSE;
9669                   /* The value chosen here is quite arbitrary as ld.so
9670                      ignores section contents except for the special
9671                      case of .opd where the contents might be accessed
9672                      before relocation.  Choose zero, as that won't
9673                      cause reloc overflow.  */
9674                   relocation = 0;
9675                   addend = 0;
9676                   /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
9677                      to improve backward compatibility with older
9678                      versions of ld.  */
9679                   if (r_type == R_PPC64_ADDR64)
9680                     addend = outrel.r_addend;
9681                   /* Adjust pc_relative relocs to have zero in *r_offset.  */
9682                   else if (ppc64_elf_howto_table[r_type]->pc_relative)
9683                     addend = (input_section->output_section->vma
9684                               + input_section->output_offset
9685                               + rel->r_offset);
9686                 }
9687             }
9688           break;
9689
9690         case R_PPC64_COPY:
9691         case R_PPC64_GLOB_DAT:
9692         case R_PPC64_JMP_SLOT:
9693         case R_PPC64_RELATIVE:
9694           /* We shouldn't ever see these dynamic relocs in relocatable
9695              files.  */
9696           /* Fall through.  */
9697
9698         case R_PPC64_PLTGOT16:
9699         case R_PPC64_PLTGOT16_DS:
9700         case R_PPC64_PLTGOT16_HA:
9701         case R_PPC64_PLTGOT16_HI:
9702         case R_PPC64_PLTGOT16_LO:
9703         case R_PPC64_PLTGOT16_LO_DS:
9704         case R_PPC64_PLTREL32:
9705         case R_PPC64_PLTREL64:
9706           /* These ones haven't been implemented yet.  */
9707
9708           (*_bfd_error_handler)
9709             (_("%B: relocation %s is not supported for symbol %s."),
9710              input_bfd,
9711              ppc64_elf_howto_table[r_type]->name, sym_name);
9712
9713           bfd_set_error (bfd_error_invalid_operation);
9714           ret = FALSE;
9715           continue;
9716         }
9717
9718       /* Do any further special processing.  */
9719       switch (r_type)
9720         {
9721         default:
9722           break;
9723
9724         case R_PPC64_ADDR16_HA:
9725         case R_PPC64_ADDR16_HIGHERA:
9726         case R_PPC64_ADDR16_HIGHESTA:
9727         case R_PPC64_GOT16_HA:
9728         case R_PPC64_PLTGOT16_HA:
9729         case R_PPC64_PLT16_HA:
9730         case R_PPC64_TOC16_HA:
9731         case R_PPC64_SECTOFF_HA:
9732         case R_PPC64_TPREL16_HA:
9733         case R_PPC64_DTPREL16_HA:
9734         case R_PPC64_GOT_TLSGD16_HA:
9735         case R_PPC64_GOT_TLSLD16_HA:
9736         case R_PPC64_GOT_TPREL16_HA:
9737         case R_PPC64_GOT_DTPREL16_HA:
9738         case R_PPC64_TPREL16_HIGHER:
9739         case R_PPC64_TPREL16_HIGHERA:
9740         case R_PPC64_TPREL16_HIGHEST:
9741         case R_PPC64_TPREL16_HIGHESTA:
9742         case R_PPC64_DTPREL16_HIGHER:
9743         case R_PPC64_DTPREL16_HIGHERA:
9744         case R_PPC64_DTPREL16_HIGHEST:
9745         case R_PPC64_DTPREL16_HIGHESTA:
9746           /* It's just possible that this symbol is a weak symbol
9747              that's not actually defined anywhere. In that case,
9748              'sec' would be NULL, and we should leave the symbol
9749              alone (it will be set to zero elsewhere in the link).  */
9750           if (sec != NULL)
9751             /* Add 0x10000 if sign bit in 0:15 is set.
9752                Bits 0:15 are not used.  */
9753             addend += 0x8000;
9754           break;
9755
9756         case R_PPC64_ADDR16_DS:
9757         case R_PPC64_ADDR16_LO_DS:
9758         case R_PPC64_GOT16_DS:
9759         case R_PPC64_GOT16_LO_DS:
9760         case R_PPC64_PLT16_LO_DS:
9761         case R_PPC64_SECTOFF_DS:
9762         case R_PPC64_SECTOFF_LO_DS:
9763         case R_PPC64_TOC16_DS:
9764         case R_PPC64_TOC16_LO_DS:
9765         case R_PPC64_PLTGOT16_DS:
9766         case R_PPC64_PLTGOT16_LO_DS:
9767         case R_PPC64_GOT_TPREL16_DS:
9768         case R_PPC64_GOT_TPREL16_LO_DS:
9769         case R_PPC64_GOT_DTPREL16_DS:
9770         case R_PPC64_GOT_DTPREL16_LO_DS:
9771         case R_PPC64_TPREL16_DS:
9772         case R_PPC64_TPREL16_LO_DS:
9773         case R_PPC64_DTPREL16_DS:
9774         case R_PPC64_DTPREL16_LO_DS:
9775           insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
9776           mask = 3;
9777           /* If this reloc is against an lq insn, then the value must be
9778              a multiple of 16.  This is somewhat of a hack, but the
9779              "correct" way to do this by defining _DQ forms of all the
9780              _DS relocs bloats all reloc switches in this file.  It
9781              doesn't seem to make much sense to use any of these relocs
9782              in data, so testing the insn should be safe.  */
9783           if ((insn & (0x3f << 26)) == (56u << 26))
9784             mask = 15;
9785           if (((relocation + addend) & mask) != 0)
9786             {
9787               (*_bfd_error_handler)
9788                 (_("%B: error: relocation %s not a multiple of %d"),
9789                  input_bfd,
9790                  ppc64_elf_howto_table[r_type]->name,
9791                  mask + 1);
9792               bfd_set_error (bfd_error_bad_value);
9793               ret = FALSE;
9794               continue;
9795             }
9796           break;
9797         }
9798
9799       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
9800          because such sections are not SEC_ALLOC and thus ld.so will
9801          not process them.  */
9802       if (unresolved_reloc
9803           && !((input_section->flags & SEC_DEBUGGING) != 0
9804                && (h->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC)))
9805         {
9806           (*_bfd_error_handler)
9807             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
9808              input_bfd,
9809              input_section,
9810              (long) rel->r_offset,
9811              ppc64_elf_howto_table[(int) r_type]->name,
9812              h->elf.root.root.string);
9813           ret = FALSE;
9814         }
9815
9816       r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
9817                                     input_bfd,
9818                                     input_section,
9819                                     contents,
9820                                     rel->r_offset,
9821                                     relocation,
9822                                     addend);
9823
9824       if (r != bfd_reloc_ok)
9825         {
9826           if (sym_name == NULL)
9827             sym_name = "(null)";
9828           if (r == bfd_reloc_overflow)
9829             {
9830               if (warned)
9831                 continue;
9832               if (h != NULL
9833                   && h->elf.root.type == bfd_link_hash_undefweak
9834                   && ppc64_elf_howto_table[r_type]->pc_relative)
9835                 {
9836                   /* Assume this is a call protected by other code that
9837                      detects the symbol is undefined.  If this is the case,
9838                      we can safely ignore the overflow.  If not, the
9839                      program is hosed anyway, and a little warning isn't
9840                      going to help.  */
9841
9842                   continue;
9843                 }
9844
9845               if (!((*info->callbacks->reloc_overflow)
9846                     (info, sym_name, ppc64_elf_howto_table[r_type]->name,
9847                      rel->r_addend, input_bfd, input_section, rel->r_offset)))
9848                 return FALSE;
9849             }
9850           else
9851             {
9852               (*_bfd_error_handler)
9853                 (_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
9854                  input_bfd,
9855                  input_section,
9856                  (long) rel->r_offset,
9857                  ppc64_elf_howto_table[r_type]->name,
9858                  sym_name,
9859                  (int) r);
9860               ret = FALSE;
9861             }
9862         }
9863     }
9864
9865   return ret;
9866 }
9867
9868 /* Adjust the value of any local symbols in opd sections.  */
9869
9870 static bfd_boolean
9871 ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
9872                               const char *name ATTRIBUTE_UNUSED,
9873                               Elf_Internal_Sym *elfsym,
9874                               asection *input_sec,
9875                               struct elf_link_hash_entry *h)
9876 {
9877   long *opd_adjust, adjust;
9878   bfd_vma value;
9879
9880   if (h != NULL)
9881     return TRUE;
9882
9883   opd_adjust = get_opd_info (input_sec);
9884   if (opd_adjust == NULL)
9885     return TRUE;
9886
9887   value = elfsym->st_value - input_sec->output_offset;
9888   if (!info->relocatable)
9889     value -= input_sec->output_section->vma;
9890
9891   adjust = opd_adjust[value / 8];
9892   if (adjust == -1)
9893     elfsym->st_value = 0;
9894   else
9895     elfsym->st_value += adjust;
9896   return TRUE;
9897 }
9898
9899 /* Finish up dynamic symbol handling.  We set the contents of various
9900    dynamic sections here.  */
9901
9902 static bfd_boolean
9903 ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
9904                                  struct bfd_link_info *info,
9905                                  struct elf_link_hash_entry *h,
9906                                  Elf_Internal_Sym *sym)
9907 {
9908   struct ppc_link_hash_table *htab;
9909   bfd *dynobj;
9910   struct plt_entry *ent;
9911   Elf_Internal_Rela rela;
9912   bfd_byte *loc;
9913
9914   htab = ppc_hash_table (info);
9915   dynobj = htab->elf.dynobj;
9916
9917   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
9918     if (ent->plt.offset != (bfd_vma) -1)
9919       {
9920         /* This symbol has an entry in the procedure linkage
9921            table.  Set it up.  */
9922
9923         if (htab->plt == NULL
9924             || htab->relplt == NULL
9925             || htab->glink == NULL)
9926           abort ();
9927
9928         /* Create a JMP_SLOT reloc to inform the dynamic linker to
9929            fill in the PLT entry.  */
9930         rela.r_offset = (htab->plt->output_section->vma
9931                          + htab->plt->output_offset
9932                          + ent->plt.offset);
9933         rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
9934         rela.r_addend = ent->addend;
9935
9936         loc = htab->relplt->contents;
9937         loc += ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE
9938                 * sizeof (Elf64_External_Rela));
9939         bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
9940       }
9941
9942   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
9943     {
9944       Elf_Internal_Rela rela;
9945       bfd_byte *loc;
9946
9947       /* This symbol needs a copy reloc.  Set it up.  */
9948
9949       if (h->dynindx == -1
9950           || (h->root.type != bfd_link_hash_defined
9951               && h->root.type != bfd_link_hash_defweak)
9952           || htab->relbss == NULL)
9953         abort ();
9954
9955       rela.r_offset = (h->root.u.def.value
9956                        + h->root.u.def.section->output_section->vma
9957                        + h->root.u.def.section->output_offset);
9958       rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
9959       rela.r_addend = 0;
9960       loc = htab->relbss->contents;
9961       loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
9962       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
9963     }
9964
9965   /* Mark some specially defined symbols as absolute.  */
9966   if (strcmp (h->root.root.string, "_DYNAMIC") == 0)
9967     sym->st_shndx = SHN_ABS;
9968
9969   return TRUE;
9970 }
9971
9972 /* Used to decide how to sort relocs in an optimal manner for the
9973    dynamic linker, before writing them out.  */
9974
9975 static enum elf_reloc_type_class
9976 ppc64_elf_reloc_type_class (const Elf_Internal_Rela *rela)
9977 {
9978   enum elf_ppc64_reloc_type r_type;
9979
9980   r_type = ELF64_R_TYPE (rela->r_info);
9981   switch (r_type)
9982     {
9983     case R_PPC64_RELATIVE:
9984       return reloc_class_relative;
9985     case R_PPC64_JMP_SLOT:
9986       return reloc_class_plt;
9987     case R_PPC64_COPY:
9988       return reloc_class_copy;
9989     default:
9990       return reloc_class_normal;
9991     }
9992 }
9993
9994 /* Finish up the dynamic sections.  */
9995
9996 static bfd_boolean
9997 ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
9998                                    struct bfd_link_info *info)
9999 {
10000   struct ppc_link_hash_table *htab;
10001   bfd *dynobj;
10002   asection *sdyn;
10003
10004   htab = ppc_hash_table (info);
10005   dynobj = htab->elf.dynobj;
10006   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
10007
10008   if (htab->elf.dynamic_sections_created)
10009     {
10010       Elf64_External_Dyn *dyncon, *dynconend;
10011
10012       if (sdyn == NULL || htab->got == NULL)
10013         abort ();
10014
10015       dyncon = (Elf64_External_Dyn *) sdyn->contents;
10016       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
10017       for (; dyncon < dynconend; dyncon++)
10018         {
10019           Elf_Internal_Dyn dyn;
10020           asection *s;
10021
10022           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
10023
10024           switch (dyn.d_tag)
10025             {
10026             default:
10027               continue;
10028
10029             case DT_PPC64_GLINK:
10030               s = htab->glink;
10031               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
10032               /* We stupidly defined DT_PPC64_GLINK to be the start
10033                  of glink rather than the first entry point, which is
10034                  what ld.so needs, and now have a bigger stub to
10035                  support automatic multiple TOCs.  */
10036               dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 32;
10037               break;
10038
10039             case DT_PPC64_OPD:
10040               s = bfd_get_section_by_name (output_bfd, ".opd");
10041               if (s == NULL)
10042                 continue;
10043               dyn.d_un.d_ptr = s->vma;
10044               break;
10045
10046             case DT_PPC64_OPDSZ:
10047               s = bfd_get_section_by_name (output_bfd, ".opd");
10048               if (s == NULL)
10049                 continue;
10050               dyn.d_un.d_val = s->size;
10051               break;
10052
10053             case DT_PLTGOT:
10054               s = htab->plt;
10055               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
10056               break;
10057
10058             case DT_JMPREL:
10059               s = htab->relplt;
10060               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
10061               break;
10062
10063             case DT_PLTRELSZ:
10064               dyn.d_un.d_val = htab->relplt->size;
10065               break;
10066
10067             case DT_RELASZ:
10068               /* Don't count procedure linkage table relocs in the
10069                  overall reloc count.  */
10070               s = htab->relplt;
10071               if (s == NULL)
10072                 continue;
10073               dyn.d_un.d_val -= s->size;
10074               break;
10075
10076             case DT_RELA:
10077               /* We may not be using the standard ELF linker script.
10078                  If .rela.plt is the first .rela section, we adjust
10079                  DT_RELA to not include it.  */
10080               s = htab->relplt;
10081               if (s == NULL)
10082                 continue;
10083               if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
10084                 continue;
10085               dyn.d_un.d_ptr += s->size;
10086               break;
10087             }
10088
10089           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
10090         }
10091     }
10092
10093   if (htab->got != NULL && htab->got->size != 0)
10094     {
10095       /* Fill in the first entry in the global offset table.
10096          We use it to hold the link-time TOCbase.  */
10097       bfd_put_64 (output_bfd,
10098                   elf_gp (output_bfd) + TOC_BASE_OFF,
10099                   htab->got->contents);
10100
10101       /* Set .got entry size.  */
10102       elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 8;
10103     }
10104
10105   if (htab->plt != NULL && htab->plt->size != 0)
10106     {
10107       /* Set .plt entry size.  */
10108       elf_section_data (htab->plt->output_section)->this_hdr.sh_entsize
10109         = PLT_ENTRY_SIZE;
10110     }
10111
10112   /* We need to handle writing out multiple GOT sections ourselves,
10113      since we didn't add them to DYNOBJ.  We know dynobj is the first
10114      bfd.  */
10115   while ((dynobj = dynobj->link_next) != NULL)
10116     {
10117       asection *s;
10118
10119       if (!is_ppc64_target (dynobj->xvec))
10120         continue;
10121
10122       s = ppc64_elf_tdata (dynobj)->got;
10123       if (s != NULL
10124           && s->size != 0
10125           && s->output_section != bfd_abs_section_ptr
10126           && !bfd_set_section_contents (output_bfd, s->output_section,
10127                                         s->contents, s->output_offset,
10128                                         s->size))
10129         return FALSE;
10130       s = ppc64_elf_tdata (dynobj)->relgot;
10131       if (s != NULL
10132           && s->size != 0
10133           && s->output_section != bfd_abs_section_ptr
10134           && !bfd_set_section_contents (output_bfd, s->output_section,
10135                                         s->contents, s->output_offset,
10136                                         s->size))
10137         return FALSE;
10138     }
10139
10140   return TRUE;
10141 }
10142
10143 #include "elf64-target.h"