* elf64-ppc.c (ppc64_elf_branch_reloc): Check .opd is in a regular
[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 /* Fix bad default arch selected for a 64 bit input bfd when the
2404    default is 32 bit.  */
2405
2406 static bfd_boolean
2407 ppc64_elf_object_p (bfd *abfd)
2408 {
2409   if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2410     {
2411       Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2412
2413       if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2414         {
2415           /* Relies on arch after 32 bit default being 64 bit default.  */
2416           abfd->arch_info = abfd->arch_info->next;
2417           BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2418         }
2419     }
2420   return TRUE;
2421 }
2422
2423 /* Support for core dump NOTE sections.  */
2424
2425 static bfd_boolean
2426 ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2427 {
2428   size_t offset, size;
2429
2430   if (note->descsz != 504)
2431     return FALSE;
2432
2433   /* pr_cursig */
2434   elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2435
2436   /* pr_pid */
2437   elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32);
2438
2439   /* pr_reg */
2440   offset = 112;
2441   size = 384;
2442
2443   /* Make a ".reg/999" section.  */
2444   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2445                                           size, note->descpos + offset);
2446 }
2447
2448 static bfd_boolean
2449 ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2450 {
2451   if (note->descsz != 136)
2452     return FALSE;
2453
2454   elf_tdata (abfd)->core_program
2455     = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2456   elf_tdata (abfd)->core_command
2457     = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2458
2459   return TRUE;
2460 }
2461
2462 /* Merge backend specific data from an object file to the output
2463    object file when linking.  */
2464
2465 static bfd_boolean
2466 ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2467 {
2468   /* Check if we have the same endianess.  */
2469   if (ibfd->xvec->byteorder != obfd->xvec->byteorder
2470       && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
2471       && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2472     {
2473       const char *msg;
2474
2475       if (bfd_big_endian (ibfd))
2476         msg = _("%B: compiled for a big endian system "
2477                 "and target is little endian");
2478       else
2479         msg = _("%B: compiled for a little endian system "
2480                 "and target is big endian");
2481
2482       (*_bfd_error_handler) (msg, ibfd);
2483
2484       bfd_set_error (bfd_error_wrong_format);
2485       return FALSE;
2486     }
2487
2488   return TRUE;
2489 }
2490
2491 /* Add extra PPC sections.  */
2492
2493 static struct bfd_elf_special_section const ppc64_elf_special_sections[]=
2494 {
2495   { ".sdata",   6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2496   { ".sbss",    5, -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2497   { ".plt",     4,  0, SHT_NOBITS,   0 },
2498   { ".toc",     4,  0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2499   { ".toc1",    5,  0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2500   { ".tocbss",  7,  0, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2501   { NULL,       0,  0, 0,            0 }
2502 };
2503
2504 struct _ppc64_elf_section_data
2505 {
2506   struct bfd_elf_section_data elf;
2507
2508   /* An array with one entry for each opd function descriptor.  */
2509   union
2510   {
2511     /* Points to the function code section for local opd entries.  */
2512     asection **func_sec;
2513     /* After editing .opd, adjust references to opd local syms.  */
2514     long *adjust;
2515   } opd;
2516
2517   /* An array for toc sections, indexed by offset/8.
2518      Specifies the relocation symbol index used at a given toc offset.  */
2519   unsigned *t_symndx;
2520 };
2521
2522 #define ppc64_elf_section_data(sec) \
2523   ((struct _ppc64_elf_section_data *) elf_section_data (sec))
2524
2525 static bfd_boolean
2526 ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
2527 {
2528   struct _ppc64_elf_section_data *sdata;
2529   bfd_size_type amt = sizeof (*sdata);
2530
2531   sdata = bfd_zalloc (abfd, amt);
2532   if (sdata == NULL)
2533     return FALSE;
2534   sec->used_by_bfd = sdata;
2535
2536   return _bfd_elf_new_section_hook (abfd, sec);
2537 }
2538
2539 static void *
2540 get_opd_info (asection * sec)
2541 {
2542   if (sec != NULL
2543       && ppc64_elf_section_data (sec) != NULL
2544       && ppc64_elf_section_data (sec)->opd.adjust != NULL)
2545     return ppc64_elf_section_data (sec)->opd.adjust;
2546   return NULL;
2547 }
2548 \f
2549 /* Parameters for the qsort hook.  */
2550 static asection *synthetic_opd;
2551 static bfd_boolean synthetic_relocatable;
2552
2553 /* qsort comparison function for ppc64_elf_get_synthetic_symtab.  */
2554
2555 static int
2556 compare_symbols (const void *ap, const void *bp)
2557 {
2558   const asymbol *a = * (const asymbol **) ap;
2559   const asymbol *b = * (const asymbol **) bp;
2560
2561   /* Section symbols first.  */
2562   if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
2563     return -1;
2564   if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
2565     return 1;
2566
2567   /* then .opd symbols.  */
2568   if (a->section == synthetic_opd && b->section != synthetic_opd)
2569     return -1;
2570   if (a->section != synthetic_opd && b->section == synthetic_opd)
2571     return 1;
2572
2573   /* then other code symbols.  */
2574   if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2575       == (SEC_CODE | SEC_ALLOC)
2576       && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2577          != (SEC_CODE | SEC_ALLOC))
2578     return -1;
2579
2580   if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2581       != (SEC_CODE | SEC_ALLOC)
2582       && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2583          == (SEC_CODE | SEC_ALLOC))
2584     return 1;
2585
2586   if (synthetic_relocatable)
2587     {
2588       if (a->section->id < b->section->id)
2589         return -1;
2590
2591       if (a->section->id > b->section->id)
2592         return 1;
2593     }
2594
2595   if (a->value + a->section->vma < b->value + b->section->vma)
2596     return -1;
2597
2598   if (a->value + a->section->vma > b->value + b->section->vma)
2599     return 1;
2600
2601   return 0;
2602 }
2603
2604 /* Search SYMS for a symbol of the given VALUE.  */
2605
2606 static asymbol *
2607 sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
2608 {
2609   long mid;
2610
2611   if (id == -1)
2612     {
2613       while (lo < hi)
2614         {
2615           mid = (lo + hi) >> 1;
2616           if (syms[mid]->value + syms[mid]->section->vma < value)
2617             lo = mid + 1;
2618           else if (syms[mid]->value + syms[mid]->section->vma > value)
2619             hi = mid;
2620           else
2621             return syms[mid];
2622         }
2623     }
2624   else
2625     {
2626       while (lo < hi)
2627         {
2628           mid = (lo + hi) >> 1;
2629           if (syms[mid]->section->id < id)
2630             lo = mid + 1;
2631           else if (syms[mid]->section->id > id)
2632             hi = mid;
2633           else if (syms[mid]->value < value)
2634             lo = mid + 1;
2635           else if (syms[mid]->value > value)
2636             hi = mid;
2637           else
2638             return syms[mid];
2639         }
2640     }
2641   return NULL;
2642 }
2643
2644 /* Create synthetic symbols, effectively restoring "dot-symbol" function
2645    entry syms.  */
2646
2647 static long
2648 ppc64_elf_get_synthetic_symtab (bfd *abfd, asymbol **relsyms, asymbol **ret)
2649 {
2650   asymbol *s;
2651   long i;
2652   long count;
2653   char *names;
2654   asymbol **syms = NULL;
2655   long symcount = 0, codesecsym, codesecsymend, secsymend, opdsymend;
2656   asection *opd;
2657   bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2658
2659   *ret = NULL;
2660
2661   opd = bfd_get_section_by_name (abfd, ".opd");
2662   if (opd == NULL)
2663     return 0;
2664
2665   if ((bfd_get_file_flags (abfd) & HAS_SYMS))
2666     {
2667       long storage;
2668       storage = bfd_get_symtab_upper_bound (abfd);
2669       if (storage < 0)
2670         return 0;
2671
2672       if (storage)
2673         {
2674           syms = bfd_malloc (storage);
2675           if (syms == NULL)
2676             return 0;
2677         }
2678
2679       symcount = bfd_canonicalize_symtab (abfd, syms);
2680       if (symcount < 0)
2681         {
2682           free (syms);
2683           return 0;
2684         }
2685
2686       if (symcount == 0)
2687         {
2688           free (syms);
2689           syms = NULL;
2690         }
2691     }
2692
2693   if (symcount == 0)
2694     {
2695       long storage;
2696
2697       storage = bfd_get_dynamic_symtab_upper_bound (abfd);
2698       if (storage < 0)
2699         return 0;
2700
2701       if (storage)
2702         {
2703           syms = bfd_malloc (storage);
2704           if (syms == NULL)
2705             return 0;
2706         }
2707
2708       symcount = bfd_canonicalize_dynamic_symtab (abfd, syms);
2709       if (symcount < 0)
2710         {
2711           free (syms);
2712           return 0;
2713         }
2714     }
2715
2716   synthetic_opd = opd;
2717   synthetic_relocatable = relocatable;
2718   qsort (syms, symcount, sizeof (asymbol *), compare_symbols);
2719
2720   i = 0;
2721   if (syms[i]->section == opd)
2722     ++i;
2723   codesecsym = i;
2724
2725   for (; i < symcount; ++i)
2726     if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2727          != (SEC_CODE | SEC_ALLOC))
2728         || (syms[i]->flags & BSF_SECTION_SYM) == 0)
2729       break;
2730   codesecsymend = i;
2731
2732   for (; i < symcount; ++i)
2733     if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
2734       break;
2735   secsymend = i;
2736
2737   for (; i < symcount; ++i)
2738     if (syms[i]->section != opd)
2739       break;
2740   opdsymend = i;
2741
2742   for (; i < symcount; ++i)
2743     if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2744         != (SEC_CODE | SEC_ALLOC))
2745       break;
2746   symcount = i;
2747
2748   if (opdsymend == secsymend)
2749     {
2750       free (syms);
2751       return 0;
2752     }
2753
2754   count = 0;
2755   if (relocatable)
2756     {
2757       bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2758       arelent *r;
2759       size_t size;
2760       long relcount;
2761       asection *relopd;
2762
2763       slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
2764       relopd = opd;
2765       relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
2766
2767       if (! relcount
2768           || ! (*slurp_relocs) (abfd, relopd, relsyms, FALSE))
2769         {
2770           free (syms);
2771           return 0;
2772         }
2773
2774       size = 0;
2775       for (i = secsymend, r = relopd->relocation; i < opdsymend; ++i)
2776         {
2777           asymbol *sym;
2778
2779           while (r < relopd->relocation + relcount
2780                  && r->address < syms[i]->value + opd->vma)
2781             ++r;
2782
2783           if (r == relopd->relocation + relcount)
2784             break;
2785
2786           if (r->address != syms[i]->value + opd->vma)
2787             continue;
2788
2789           if (r->howto->type != R_PPC64_ADDR64)
2790             continue;
2791
2792           sym = *r->sym_ptr_ptr;
2793           if (!sym_exists_at (syms, opdsymend, symcount,
2794                               sym->section->id, sym->value + r->addend))
2795             {
2796               ++count;
2797               size += sizeof (asymbol);
2798               size += strlen (syms[i]->name) + 2;
2799             }
2800         }
2801
2802       s = *ret = bfd_malloc (size);
2803       if (s == NULL)
2804         {
2805           free (syms);
2806           return 0;
2807         }
2808
2809       names = (char *) (s + count);
2810
2811       for (i = secsymend, r = relopd->relocation; i < opdsymend; ++i)
2812         {
2813           asymbol *sym;
2814
2815           while (r < relopd->relocation + relcount
2816                  && r->address < syms[i]->value + opd->vma)
2817             ++r;
2818
2819           if (r == relopd->relocation + relcount)
2820             break;
2821
2822           if (r->address != syms[i]->value + opd->vma)
2823             continue;
2824
2825           if (r->howto->type != R_PPC64_ADDR64)
2826             continue;
2827
2828           sym = *r->sym_ptr_ptr;
2829           if (!sym_exists_at (syms, opdsymend, symcount,
2830                               sym->section->id, sym->value + r->addend))
2831             {
2832               size_t len;
2833
2834               *s = *syms[i];
2835               s->section = sym->section;
2836               s->value = sym->value + r->addend;
2837               s->name = names;
2838               *names++ = '.';
2839               len = strlen (syms[i]->name);
2840               memcpy (names, syms[i]->name, len + 1);
2841               names += len + 1;
2842               s++;
2843             }
2844         }
2845     }
2846   else
2847     {
2848       bfd_byte *contents;
2849       size_t size;
2850
2851       if (!bfd_malloc_and_get_section (abfd, opd, &contents))
2852         {
2853           if (contents)
2854             free (contents);
2855           free (syms);
2856           return 0;
2857         }
2858
2859       size = 0;
2860       for (i = secsymend; i < opdsymend; ++i)
2861         {
2862           bfd_vma ent;
2863
2864           ent = bfd_get_64 (abfd, contents + syms[i]->value);
2865           if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2866             {
2867               ++count;
2868               size += sizeof (asymbol);
2869               size += strlen (syms[i]->name) + 2;
2870             }
2871         }
2872
2873       s = *ret = bfd_malloc (size);
2874       if (s == NULL)
2875         {
2876           free (contents);
2877           free (syms);
2878           return 0;
2879         }
2880
2881       names = (char *) (s + count);
2882
2883       for (i = secsymend; i < opdsymend; ++i)
2884         {
2885           bfd_vma ent;
2886
2887           ent = bfd_get_64 (abfd, contents + syms[i]->value);
2888           if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2889             {
2890               long lo, hi, mid;
2891               size_t len;
2892               asection *sec;
2893
2894               *s = *syms[i];
2895               lo = codesecsym;
2896               hi = codesecsymend;
2897               while (lo < hi)
2898                 {
2899                   mid = (lo + hi) >> 1;
2900                   if (syms[mid]->section->vma < ent)
2901                     lo = mid + 1;
2902                   else if (syms[mid]->section->vma > ent)
2903                     hi = mid;
2904                   else
2905                     break;
2906                 }
2907
2908               if (lo < hi)
2909                 sec = syms[mid]->section;
2910               else if (lo > codesecsym)
2911                 sec = syms[lo - 1]->section;
2912               else
2913                 sec = abfd->sections;
2914
2915               for (; sec != NULL; sec = sec->next)
2916                 {
2917                   if (sec->vma > ent)
2918                     break;
2919                   if ((sec->flags & SEC_ALLOC) == 0
2920                       || (sec->flags & SEC_LOAD) == 0)
2921                     break;
2922                   if ((sec->flags & SEC_CODE) != 0)
2923                     s->section = sec;
2924                 }
2925               s->value = ent - s->section->vma;
2926               s->name = names;
2927               *names++ = '.';
2928               len = strlen (syms[i]->name);
2929               memcpy (names, syms[i]->name, len + 1);
2930               names += len + 1;
2931               s++;
2932             }
2933         }
2934       free (contents);
2935     }
2936
2937   free (syms);
2938   return count;
2939 }
2940 \f
2941 /* The following functions are specific to the ELF linker, while
2942    functions above are used generally.  Those named ppc64_elf_* are
2943    called by the main ELF linker code.  They appear in this file more
2944    or less in the order in which they are called.  eg.
2945    ppc64_elf_check_relocs is called early in the link process,
2946    ppc64_elf_finish_dynamic_sections is one of the last functions
2947    called.
2948
2949    PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
2950    functions have both a function code symbol and a function descriptor
2951    symbol.  A call to foo in a relocatable object file looks like:
2952
2953    .            .text
2954    .    x:
2955    .            bl      .foo
2956    .            nop
2957
2958    The function definition in another object file might be:
2959
2960    .            .section .opd
2961    .    foo:    .quad   .foo
2962    .            .quad   .TOC.@tocbase
2963    .            .quad   0
2964    .
2965    .            .text
2966    .    .foo:   blr
2967
2968    When the linker resolves the call during a static link, the branch
2969    unsurprisingly just goes to .foo and the .opd information is unused.
2970    If the function definition is in a shared library, things are a little
2971    different:  The call goes via a plt call stub, the opd information gets
2972    copied to the plt, and the linker patches the nop.
2973
2974    .    x:
2975    .            bl      .foo_stub
2976    .            ld      2,40(1)
2977    .
2978    .
2979    .    .foo_stub:
2980    .            addis   12,2,Lfoo@toc@ha        # in practice, the call stub
2981    .            addi    12,12,Lfoo@toc@l        # is slightly optimized, but
2982    .            std     2,40(1)                 # this is the general idea
2983    .            ld      11,0(12)
2984    .            ld      2,8(12)
2985    .            mtctr   11
2986    .            ld      11,16(12)
2987    .            bctr
2988    .
2989    .            .section .plt
2990    .    Lfoo:   reloc (R_PPC64_JMP_SLOT, foo)
2991
2992    The "reloc ()" notation is supposed to indicate that the linker emits
2993    an R_PPC64_JMP_SLOT reloc against foo.  The dynamic linker does the opd
2994    copying.
2995
2996    What are the difficulties here?  Well, firstly, the relocations
2997    examined by the linker in check_relocs are against the function code
2998    sym .foo, while the dynamic relocation in the plt is emitted against
2999    the function descriptor symbol, foo.  Somewhere along the line, we need
3000    to carefully copy dynamic link information from one symbol to the other.
3001    Secondly, the generic part of the elf linker will make .foo a dynamic
3002    symbol as is normal for most other backends.  We need foo dynamic
3003    instead, at least for an application final link.  However, when
3004    creating a shared library containing foo, we need to have both symbols
3005    dynamic so that references to .foo are satisfied during the early
3006    stages of linking.  Otherwise the linker might decide to pull in a
3007    definition from some other object, eg. a static library.
3008
3009    Update: As of August 2004, we support a new convention.  Function
3010    calls may use the function descriptor symbol, ie. "bl foo".  This
3011    behaves exactly as "bl .foo".  */
3012
3013 /* The linker needs to keep track of the number of relocs that it
3014    decides to copy as dynamic relocs in check_relocs for each symbol.
3015    This is so that it can later discard them if they are found to be
3016    unnecessary.  We store the information in a field extending the
3017    regular ELF linker hash table.  */
3018
3019 struct ppc_dyn_relocs
3020 {
3021   struct ppc_dyn_relocs *next;
3022
3023   /* The input section of the reloc.  */
3024   asection *sec;
3025
3026   /* Total number of relocs copied for the input section.  */
3027   bfd_size_type count;
3028
3029   /* Number of pc-relative relocs copied for the input section.  */
3030   bfd_size_type pc_count;
3031 };
3032
3033 /* Track GOT entries needed for a given symbol.  We might need more
3034    than one got entry per symbol.  */
3035 struct got_entry
3036 {
3037   struct got_entry *next;
3038
3039   /* The symbol addend that we'll be placing in the GOT.  */
3040   bfd_vma addend;
3041
3042   /* Unlike other ELF targets, we use separate GOT entries for the same
3043      symbol referenced from different input files.  This is to support
3044      automatic multiple TOC/GOT sections, where the TOC base can vary
3045      from one input file to another.
3046
3047      Point to the BFD owning this GOT entry.  */
3048   bfd *owner;
3049
3050   /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
3051      TLS_TPREL or TLS_DTPREL for tls entries.  */
3052   char tls_type;
3053
3054   /* Reference count until size_dynamic_sections, GOT offset thereafter.  */
3055   union
3056     {
3057       bfd_signed_vma refcount;
3058       bfd_vma offset;
3059     } got;
3060 };
3061
3062 /* The same for PLT.  */
3063 struct plt_entry
3064 {
3065   struct plt_entry *next;
3066
3067   bfd_vma addend;
3068
3069   union
3070     {
3071       bfd_signed_vma refcount;
3072       bfd_vma offset;
3073     } plt;
3074 };
3075
3076 /* Of those relocs that might be copied as dynamic relocs, this macro
3077    selects those that must be copied when linking a shared library,
3078    even when the symbol is local.  */
3079
3080 #define MUST_BE_DYN_RELOC(RTYPE)                \
3081   ((RTYPE) != R_PPC64_REL32                     \
3082    && (RTYPE) != R_PPC64_REL64                  \
3083    && (RTYPE) != R_PPC64_REL30)
3084
3085 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3086    copying dynamic variables from a shared lib into an app's dynbss
3087    section, and instead use a dynamic relocation to point into the
3088    shared lib.  With code that gcc generates, it's vital that this be
3089    enabled;  In the PowerPC64 ABI, the address of a function is actually
3090    the address of a function descriptor, which resides in the .opd
3091    section.  gcc uses the descriptor directly rather than going via the
3092    GOT as some other ABI's do, which means that initialized function
3093    pointers must reference the descriptor.  Thus, a function pointer
3094    initialized to the address of a function in a shared library will
3095    either require a copy reloc, or a dynamic reloc.  Using a copy reloc
3096    redefines the function descriptor symbol to point to the copy.  This
3097    presents a problem as a plt entry for that function is also
3098    initialized from the function descriptor symbol and the copy reloc
3099    may not be initialized first.  */
3100 #define ELIMINATE_COPY_RELOCS 1
3101
3102 /* Section name for stubs is the associated section name plus this
3103    string.  */
3104 #define STUB_SUFFIX ".stub"
3105
3106 /* Linker stubs.
3107    ppc_stub_long_branch:
3108    Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3109    destination, but a 24 bit branch in a stub section will reach.
3110    .    b       dest
3111
3112    ppc_stub_plt_branch:
3113    Similar to the above, but a 24 bit branch in the stub section won't
3114    reach its destination.
3115    .    addis   %r12,%r2,xxx@toc@ha
3116    .    ld      %r11,xxx@toc@l(%r12)
3117    .    mtctr   %r11
3118    .    bctr
3119
3120    ppc_stub_plt_call:
3121    Used to call a function in a shared library.  If it so happens that
3122    the plt entry referenced crosses a 64k boundary, then an extra
3123    "addis %r12,%r12,1" will be inserted before the load at xxx+8 or
3124    xxx+16 as appropriate.
3125    .    addis   %r12,%r2,xxx@toc@ha
3126    .    std     %r2,40(%r1)
3127    .    ld      %r11,xxx+0@toc@l(%r12)
3128    .    ld      %r2,xxx+8@toc@l(%r12)
3129    .    mtctr   %r11
3130    .    ld      %r11,xxx+16@toc@l(%r12)
3131    .    bctr
3132
3133    ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3134    code to adjust the value and save r2 to support multiple toc sections.
3135    A ppc_stub_long_branch with an r2 offset looks like:
3136    .    std     %r2,40(%r1)
3137    .    addis   %r2,%r2,off@ha
3138    .    addi    %r2,%r2,off@l
3139    .    b       dest
3140
3141    A ppc_stub_plt_branch with an r2 offset looks like:
3142    .    std     %r2,40(%r1)
3143    .    addis   %r12,%r2,xxx@toc@ha
3144    .    ld      %r11,xxx@toc@l(%r12)
3145    .    addis   %r2,%r2,off@ha
3146    .    addi    %r2,%r2,off@l
3147    .    mtctr   %r11
3148    .    bctr
3149 */
3150
3151 enum ppc_stub_type {
3152   ppc_stub_none,
3153   ppc_stub_long_branch,
3154   ppc_stub_long_branch_r2off,
3155   ppc_stub_plt_branch,
3156   ppc_stub_plt_branch_r2off,
3157   ppc_stub_plt_call
3158 };
3159
3160 struct ppc_stub_hash_entry {
3161
3162   /* Base hash table entry structure.  */
3163   struct bfd_hash_entry root;
3164
3165   enum ppc_stub_type stub_type;
3166
3167   /* The stub section.  */
3168   asection *stub_sec;
3169
3170   /* Offset within stub_sec of the beginning of this stub.  */
3171   bfd_vma stub_offset;
3172
3173   /* Given the symbol's value and its section we can determine its final
3174      value when building the stubs (so the stub knows where to jump.  */
3175   bfd_vma target_value;
3176   asection *target_section;
3177
3178   /* The symbol table entry, if any, that this was derived from.  */
3179   struct ppc_link_hash_entry *h;
3180
3181   /* And the reloc addend that this was derived from.  */
3182   bfd_vma addend;
3183
3184   /* Where this stub is being called from, or, in the case of combined
3185      stub sections, the first input section in the group.  */
3186   asection *id_sec;
3187 };
3188
3189 struct ppc_branch_hash_entry {
3190
3191   /* Base hash table entry structure.  */
3192   struct bfd_hash_entry root;
3193
3194   /* Offset within .branch_lt.  */
3195   unsigned int offset;
3196
3197   /* Generation marker.  */
3198   unsigned int iter;
3199 };
3200
3201 struct ppc_link_hash_entry
3202 {
3203   struct elf_link_hash_entry elf;
3204
3205   /* A pointer to the most recently used stub hash entry against this
3206      symbol.  */
3207   struct ppc_stub_hash_entry *stub_cache;
3208
3209   /* Track dynamic relocs copied for this symbol.  */
3210   struct ppc_dyn_relocs *dyn_relocs;
3211
3212   /* Link between function code and descriptor symbols.  */
3213   struct ppc_link_hash_entry *oh;
3214
3215   /* Flag function code and descriptor symbols.  */
3216   unsigned int is_func:1;
3217   unsigned int is_func_descriptor:1;
3218
3219   /* Whether global opd sym has been adjusted or not.
3220      After ppc64_elf_edit_opd has run, this flag should be set for all
3221      globals defined in any opd section.  */
3222   unsigned int adjust_done:1;
3223
3224   /* Set if we twiddled this symbol to weak at some stage.  */
3225   unsigned int was_undefined:1;
3226
3227   /* Contexts in which symbol is used in the GOT (or TOC).
3228      TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3229      corresponding relocs are encountered during check_relocs.
3230      tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3231      indicate the corresponding GOT entry type is not needed.
3232      tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3233      a TPREL one.  We use a separate flag rather than setting TPREL
3234      just for convenience in distinguishing the two cases.  */
3235 #define TLS_GD           1      /* GD reloc. */
3236 #define TLS_LD           2      /* LD reloc. */
3237 #define TLS_TPREL        4      /* TPREL reloc, => IE. */
3238 #define TLS_DTPREL       8      /* DTPREL reloc, => LD. */
3239 #define TLS_TLS         16      /* Any TLS reloc.  */
3240 #define TLS_EXPLICIT    32      /* Marks TOC section TLS relocs. */
3241 #define TLS_TPRELGD     64      /* TPREL reloc resulting from GD->IE. */
3242   char tls_mask;
3243 };
3244
3245 /* ppc64 ELF linker hash table.  */
3246
3247 struct ppc_link_hash_table
3248 {
3249   struct elf_link_hash_table elf;
3250
3251   /* The stub hash table.  */
3252   struct bfd_hash_table stub_hash_table;
3253
3254   /* Another hash table for plt_branch stubs.  */
3255   struct bfd_hash_table branch_hash_table;
3256
3257   /* Linker stub bfd.  */
3258   bfd *stub_bfd;
3259
3260   /* Linker call-backs.  */
3261   asection * (*add_stub_section) (const char *, asection *);
3262   void (*layout_sections_again) (void);
3263
3264   /* Array to keep track of which stub sections have been created, and
3265      information on stub grouping.  */
3266   struct map_stub {
3267     /* This is the section to which stubs in the group will be attached.  */
3268     asection *link_sec;
3269     /* The stub section.  */
3270     asection *stub_sec;
3271     /* Along with elf_gp, specifies the TOC pointer used in this group.  */
3272     bfd_vma toc_off;
3273   } *stub_group;
3274
3275   /* Temp used when calculating TOC pointers.  */
3276   bfd_vma toc_curr;
3277
3278   /* Highest input section id.  */
3279   int top_id;
3280
3281   /* Highest output section index.  */
3282   int top_index;
3283
3284   /* List of input sections for each output section.  */
3285   asection **input_list;
3286
3287   /* Short-cuts to get to dynamic linker sections.  */
3288   asection *got;
3289   asection *plt;
3290   asection *relplt;
3291   asection *dynbss;
3292   asection *relbss;
3293   asection *glink;
3294   asection *sfpr;
3295   asection *brlt;
3296   asection *relbrlt;
3297
3298   /* Shortcut to .__tls_get_addr and __tls_get_addr.  */
3299   struct ppc_link_hash_entry *tls_get_addr;
3300   struct ppc_link_hash_entry *tls_get_addr_fd;
3301
3302   /* Statistics.  */
3303   unsigned long stub_count[ppc_stub_plt_call];
3304
3305   /* Set if we should emit symbols for stubs.  */
3306   unsigned int emit_stub_syms:1;
3307
3308   /* Set on error.  */
3309   unsigned int stub_error:1;
3310
3311   /* Flag set when small branches are detected.  Used to
3312      select suitable defaults for the stub group size.  */
3313   unsigned int has_14bit_branch:1;
3314
3315   /* Temp used by ppc64_elf_check_directives.  */
3316   unsigned int twiddled_syms:1;
3317
3318   /* Incremented every time we size stubs.  */
3319   unsigned int stub_iteration;
3320
3321   /* Small local sym to section mapping cache.  */
3322   struct sym_sec_cache sym_sec;
3323 };
3324
3325 /* Get the ppc64 ELF linker hash table from a link_info structure.  */
3326
3327 #define ppc_hash_table(p) \
3328   ((struct ppc_link_hash_table *) ((p)->hash))
3329
3330 #define ppc_stub_hash_lookup(table, string, create, copy) \
3331   ((struct ppc_stub_hash_entry *) \
3332    bfd_hash_lookup ((table), (string), (create), (copy)))
3333
3334 #define ppc_branch_hash_lookup(table, string, create, copy) \
3335   ((struct ppc_branch_hash_entry *) \
3336    bfd_hash_lookup ((table), (string), (create), (copy)))
3337
3338 /* Create an entry in the stub hash table.  */
3339
3340 static struct bfd_hash_entry *
3341 stub_hash_newfunc (struct bfd_hash_entry *entry,
3342                    struct bfd_hash_table *table,
3343                    const char *string)
3344 {
3345   /* Allocate the structure if it has not already been allocated by a
3346      subclass.  */
3347   if (entry == NULL)
3348     {
3349       entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3350       if (entry == NULL)
3351         return entry;
3352     }
3353
3354   /* Call the allocation method of the superclass.  */
3355   entry = bfd_hash_newfunc (entry, table, string);
3356   if (entry != NULL)
3357     {
3358       struct ppc_stub_hash_entry *eh;
3359
3360       /* Initialize the local fields.  */
3361       eh = (struct ppc_stub_hash_entry *) entry;
3362       eh->stub_type = ppc_stub_none;
3363       eh->stub_sec = NULL;
3364       eh->stub_offset = 0;
3365       eh->target_value = 0;
3366       eh->target_section = NULL;
3367       eh->h = NULL;
3368       eh->id_sec = NULL;
3369     }
3370
3371   return entry;
3372 }
3373
3374 /* Create an entry in the branch hash table.  */
3375
3376 static struct bfd_hash_entry *
3377 branch_hash_newfunc (struct bfd_hash_entry *entry,
3378                      struct bfd_hash_table *table,
3379                      const char *string)
3380 {
3381   /* Allocate the structure if it has not already been allocated by a
3382      subclass.  */
3383   if (entry == NULL)
3384     {
3385       entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3386       if (entry == NULL)
3387         return entry;
3388     }
3389
3390   /* Call the allocation method of the superclass.  */
3391   entry = bfd_hash_newfunc (entry, table, string);
3392   if (entry != NULL)
3393     {
3394       struct ppc_branch_hash_entry *eh;
3395
3396       /* Initialize the local fields.  */
3397       eh = (struct ppc_branch_hash_entry *) entry;
3398       eh->offset = 0;
3399       eh->iter = 0;
3400     }
3401
3402   return entry;
3403 }
3404
3405 /* Create an entry in a ppc64 ELF linker hash table.  */
3406
3407 static struct bfd_hash_entry *
3408 link_hash_newfunc (struct bfd_hash_entry *entry,
3409                    struct bfd_hash_table *table,
3410                    const char *string)
3411 {
3412   /* Allocate the structure if it has not already been allocated by a
3413      subclass.  */
3414   if (entry == NULL)
3415     {
3416       entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3417       if (entry == NULL)
3418         return entry;
3419     }
3420
3421   /* Call the allocation method of the superclass.  */
3422   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3423   if (entry != NULL)
3424     {
3425       struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3426
3427       eh->stub_cache = NULL;
3428       eh->dyn_relocs = NULL;
3429       eh->oh = NULL;
3430       eh->is_func = 0;
3431       eh->is_func_descriptor = 0;
3432       eh->adjust_done = 0;
3433       eh->was_undefined = 0;
3434       eh->tls_mask = 0;
3435     }
3436
3437   return entry;
3438 }
3439
3440 /* Create a ppc64 ELF linker hash table.  */
3441
3442 static struct bfd_link_hash_table *
3443 ppc64_elf_link_hash_table_create (bfd *abfd)
3444 {
3445   struct ppc_link_hash_table *htab;
3446   bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3447
3448   htab = bfd_zmalloc (amt);
3449   if (htab == NULL)
3450     return NULL;
3451
3452   if (! _bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc))
3453     {
3454       free (htab);
3455       return NULL;
3456     }
3457
3458   /* Init the stub hash table too.  */
3459   if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc))
3460     return NULL;
3461
3462   /* And the branch hash table.  */
3463   if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc))
3464     return NULL;
3465
3466   /* Initializing two fields of the union is just cosmetic.  We really
3467      only care about glist, but when compiled on a 32-bit host the
3468      bfd_vma fields are larger.  Setting the bfd_vma to zero makes
3469      debugger inspection of these fields look nicer.  */
3470   htab->elf.init_refcount.refcount = 0;
3471   htab->elf.init_refcount.glist = NULL;
3472   htab->elf.init_offset.offset = 0;
3473   htab->elf.init_offset.glist = NULL;
3474
3475   return &htab->elf.root;
3476 }
3477
3478 /* Free the derived linker hash table.  */
3479
3480 static void
3481 ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
3482 {
3483   struct ppc_link_hash_table *ret = (struct ppc_link_hash_table *) hash;
3484
3485   bfd_hash_table_free (&ret->stub_hash_table);
3486   bfd_hash_table_free (&ret->branch_hash_table);
3487   _bfd_generic_link_hash_table_free (hash);
3488 }
3489
3490 /* Satisfy the ELF linker by filling in some fields in our fake bfd.  */
3491
3492 void
3493 ppc64_elf_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
3494 {
3495   struct ppc_link_hash_table *htab;
3496
3497   elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS64;
3498
3499 /* Always hook our dynamic sections into the first bfd, which is the
3500    linker created stub bfd.  This ensures that the GOT header is at
3501    the start of the output TOC section.  */
3502   htab = ppc_hash_table (info);
3503   htab->stub_bfd = abfd;
3504   htab->elf.dynobj = abfd;
3505 }
3506
3507 /* Build a name for an entry in the stub hash table.  */
3508
3509 static char *
3510 ppc_stub_name (const asection *input_section,
3511                const asection *sym_sec,
3512                const struct ppc_link_hash_entry *h,
3513                const Elf_Internal_Rela *rel)
3514 {
3515   char *stub_name;
3516   bfd_size_type len;
3517
3518   /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3519      offsets from a sym as a branch target?  In fact, we could
3520      probably assume the addend is always zero.  */
3521   BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3522
3523   if (h)
3524     {
3525       len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3526       stub_name = bfd_malloc (len);
3527       if (stub_name != NULL)
3528         {
3529           sprintf (stub_name, "%08x.%s+%x",
3530                    input_section->id & 0xffffffff,
3531                    h->elf.root.root.string,
3532                    (int) rel->r_addend & 0xffffffff);
3533         }
3534     }
3535   else
3536     {
3537       len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
3538       stub_name = bfd_malloc (len);
3539       if (stub_name != NULL)
3540         {
3541           sprintf (stub_name, "%08x.%x:%x+%x",
3542                    input_section->id & 0xffffffff,
3543                    sym_sec->id & 0xffffffff,
3544                    (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3545                    (int) rel->r_addend & 0xffffffff);
3546         }
3547     }
3548   return stub_name;
3549 }
3550
3551 /* Look up an entry in the stub hash.  Stub entries are cached because
3552    creating the stub name takes a bit of time.  */
3553
3554 static struct ppc_stub_hash_entry *
3555 ppc_get_stub_entry (const asection *input_section,
3556                     const asection *sym_sec,
3557                     struct ppc_link_hash_entry *h,
3558                     const Elf_Internal_Rela *rel,
3559                     struct ppc_link_hash_table *htab)
3560 {
3561   struct ppc_stub_hash_entry *stub_entry;
3562   const asection *id_sec;
3563
3564   /* If this input section is part of a group of sections sharing one
3565      stub section, then use the id of the first section in the group.
3566      Stub names need to include a section id, as there may well be
3567      more than one stub used to reach say, printf, and we need to
3568      distinguish between them.  */
3569   id_sec = htab->stub_group[input_section->id].link_sec;
3570
3571   if (h != NULL && h->stub_cache != NULL
3572       && h->stub_cache->h == h
3573       && h->stub_cache->id_sec == id_sec)
3574     {
3575       stub_entry = h->stub_cache;
3576     }
3577   else
3578     {
3579       char *stub_name;
3580
3581       stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
3582       if (stub_name == NULL)
3583         return NULL;
3584
3585       stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
3586                                          stub_name, FALSE, FALSE);
3587       if (h != NULL)
3588         h->stub_cache = stub_entry;
3589
3590       free (stub_name);
3591     }
3592
3593   return stub_entry;
3594 }
3595
3596 /* Add a new stub entry to the stub hash.  Not all fields of the new
3597    stub entry are initialised.  */
3598
3599 static struct ppc_stub_hash_entry *
3600 ppc_add_stub (const char *stub_name,
3601               asection *section,
3602               struct ppc_link_hash_table *htab)
3603 {
3604   asection *link_sec;
3605   asection *stub_sec;
3606   struct ppc_stub_hash_entry *stub_entry;
3607
3608   link_sec = htab->stub_group[section->id].link_sec;
3609   stub_sec = htab->stub_group[section->id].stub_sec;
3610   if (stub_sec == NULL)
3611     {
3612       stub_sec = htab->stub_group[link_sec->id].stub_sec;
3613       if (stub_sec == NULL)
3614         {
3615           size_t namelen;
3616           bfd_size_type len;
3617           char *s_name;
3618
3619           namelen = strlen (link_sec->name);
3620           len = namelen + sizeof (STUB_SUFFIX);
3621           s_name = bfd_alloc (htab->stub_bfd, len);
3622           if (s_name == NULL)
3623             return NULL;
3624
3625           memcpy (s_name, link_sec->name, namelen);
3626           memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3627           stub_sec = (*htab->add_stub_section) (s_name, link_sec);
3628           if (stub_sec == NULL)
3629             return NULL;
3630           htab->stub_group[link_sec->id].stub_sec = stub_sec;
3631         }
3632       htab->stub_group[section->id].stub_sec = stub_sec;
3633     }
3634
3635   /* Enter this entry into the linker stub hash table.  */
3636   stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
3637                                      TRUE, FALSE);
3638   if (stub_entry == NULL)
3639     {
3640       (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
3641                              section->owner, stub_name);
3642       return NULL;
3643     }
3644
3645   stub_entry->stub_sec = stub_sec;
3646   stub_entry->stub_offset = 0;
3647   stub_entry->id_sec = link_sec;
3648   return stub_entry;
3649 }
3650
3651 /* Create sections for linker generated code.  */
3652
3653 static bfd_boolean
3654 create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
3655 {
3656   struct ppc_link_hash_table *htab;
3657   flagword flags;
3658
3659   htab = ppc_hash_table (info);
3660
3661   /* Create .sfpr for code to save and restore fp regs.  */
3662   flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3663            | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3664   htab->sfpr = bfd_make_section_anyway (dynobj, ".sfpr");
3665   if (htab->sfpr == NULL
3666       || ! bfd_set_section_flags (dynobj, htab->sfpr, flags)
3667       || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
3668     return FALSE;
3669
3670   /* Create .glink for lazy dynamic linking support.  */
3671   htab->glink = bfd_make_section_anyway (dynobj, ".glink");
3672   if (htab->glink == NULL
3673       || ! bfd_set_section_flags (dynobj, htab->glink, flags)
3674       || ! bfd_set_section_alignment (dynobj, htab->glink, 2))
3675     return FALSE;
3676
3677   /* Create .branch_lt for plt_branch stubs.  */
3678   flags = (SEC_ALLOC | SEC_LOAD
3679            | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3680   htab->brlt = bfd_make_section_anyway (dynobj, ".branch_lt");
3681   if (htab->brlt == NULL
3682       || ! bfd_set_section_flags (dynobj, htab->brlt, flags)
3683       || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
3684     return FALSE;
3685
3686   if (info->shared)
3687     {
3688       flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3689                | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3690       htab->relbrlt = bfd_make_section_anyway (dynobj, ".rela.branch_lt");
3691       if (!htab->relbrlt
3692           || ! bfd_set_section_flags (dynobj, htab->relbrlt, flags)
3693           || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
3694         return FALSE;
3695     }
3696   return TRUE;
3697 }
3698
3699 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3700    not already done.  */
3701
3702 static bfd_boolean
3703 create_got_section (bfd *abfd, struct bfd_link_info *info)
3704 {
3705   asection *got, *relgot;
3706   flagword flags;
3707   struct ppc_link_hash_table *htab = ppc_hash_table (info);
3708
3709   if (!htab->got)
3710     {
3711       if (! _bfd_elf_create_got_section (htab->elf.dynobj, info))
3712         return FALSE;
3713
3714       htab->got = bfd_get_section_by_name (htab->elf.dynobj, ".got");
3715       if (!htab->got)
3716         abort ();
3717     }
3718
3719   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3720            | SEC_LINKER_CREATED);
3721
3722   got = bfd_make_section (abfd, ".got");
3723   if (!got
3724       || !bfd_set_section_flags (abfd, got, flags)
3725       || !bfd_set_section_alignment (abfd, got, 3))
3726     return FALSE;
3727
3728   relgot = bfd_make_section (abfd, ".rela.got");
3729   if (!relgot
3730       || ! bfd_set_section_flags (abfd, relgot, flags | SEC_READONLY)
3731       || ! bfd_set_section_alignment (abfd, relgot, 3))
3732     return FALSE;
3733
3734   ppc64_elf_tdata (abfd)->got = got;
3735   ppc64_elf_tdata (abfd)->relgot = relgot;
3736   return TRUE;
3737 }
3738
3739 /* Create the dynamic sections, and set up shortcuts.  */
3740
3741 static bfd_boolean
3742 ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
3743 {
3744   struct ppc_link_hash_table *htab;
3745
3746   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
3747     return FALSE;
3748
3749   htab = ppc_hash_table (info);
3750   if (!htab->got)
3751     htab->got = bfd_get_section_by_name (dynobj, ".got");
3752   htab->plt = bfd_get_section_by_name (dynobj, ".plt");
3753   htab->relplt = bfd_get_section_by_name (dynobj, ".rela.plt");
3754   htab->dynbss = bfd_get_section_by_name (dynobj, ".dynbss");
3755   if (!info->shared)
3756     htab->relbss = bfd_get_section_by_name (dynobj, ".rela.bss");
3757
3758   if (!htab->got || !htab->plt || !htab->relplt || !htab->dynbss
3759       || (!info->shared && !htab->relbss))
3760     abort ();
3761
3762   return TRUE;
3763 }
3764
3765 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
3766
3767 static void
3768 ppc64_elf_copy_indirect_symbol
3769   (const struct elf_backend_data *bed ATTRIBUTE_UNUSED,
3770    struct elf_link_hash_entry *dir,
3771    struct elf_link_hash_entry *ind)
3772 {
3773   struct ppc_link_hash_entry *edir, *eind;
3774   flagword mask;
3775
3776   edir = (struct ppc_link_hash_entry *) dir;
3777   eind = (struct ppc_link_hash_entry *) ind;
3778
3779   /* Copy over any dynamic relocs we may have on the indirect sym.  */
3780   if (eind->dyn_relocs != NULL)
3781     {
3782       if (edir->dyn_relocs != NULL)
3783         {
3784           struct ppc_dyn_relocs **pp;
3785           struct ppc_dyn_relocs *p;
3786
3787           if (eind->elf.root.type == bfd_link_hash_indirect)
3788             abort ();
3789
3790           /* Add reloc counts against the weak sym to the strong sym
3791              list.  Merge any entries against the same section.  */
3792           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3793             {
3794               struct ppc_dyn_relocs *q;
3795
3796               for (q = edir->dyn_relocs; q != NULL; q = q->next)
3797                 if (q->sec == p->sec)
3798                   {
3799                     q->pc_count += p->pc_count;
3800                     q->count += p->count;
3801                     *pp = p->next;
3802                     break;
3803                   }
3804               if (q == NULL)
3805                 pp = &p->next;
3806             }
3807           *pp = edir->dyn_relocs;
3808         }
3809
3810       edir->dyn_relocs = eind->dyn_relocs;
3811       eind->dyn_relocs = NULL;
3812     }
3813
3814   edir->is_func |= eind->is_func;
3815   edir->is_func_descriptor |= eind->is_func_descriptor;
3816   edir->tls_mask |= eind->tls_mask;
3817
3818   mask = (ELF_LINK_HASH_REF_DYNAMIC | ELF_LINK_HASH_REF_REGULAR
3819           | ELF_LINK_HASH_REF_REGULAR_NONWEAK | ELF_LINK_NON_GOT_REF
3820           | ELF_LINK_HASH_NEEDS_PLT);
3821   /* If called to transfer flags for a weakdef during processing
3822      of elf_adjust_dynamic_symbol, don't copy ELF_LINK_NON_GOT_REF.
3823      We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
3824   if (ELIMINATE_COPY_RELOCS
3825       && eind->elf.root.type != bfd_link_hash_indirect
3826       && (edir->elf.elf_link_hash_flags & ELF_LINK_HASH_DYNAMIC_ADJUSTED) != 0)
3827     mask &= ~ELF_LINK_NON_GOT_REF;
3828
3829   edir->elf.elf_link_hash_flags |= eind->elf.elf_link_hash_flags & mask;
3830
3831   /* If we were called to copy over info for a weak sym, that's all.  */
3832   if (eind->elf.root.type != bfd_link_hash_indirect)
3833     return;
3834
3835   /* Copy over got entries that we may have already seen to the
3836      symbol which just became indirect.  */
3837   if (eind->elf.got.glist != NULL)
3838     {
3839       if (edir->elf.got.glist != NULL)
3840         {
3841           struct got_entry **entp;
3842           struct got_entry *ent;
3843
3844           for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
3845             {
3846               struct got_entry *dent;
3847
3848               for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
3849                 if (dent->addend == ent->addend
3850                     && dent->owner == ent->owner
3851                     && dent->tls_type == ent->tls_type)
3852                   {
3853                     dent->got.refcount += ent->got.refcount;
3854                     *entp = ent->next;
3855                     break;
3856                   }
3857               if (dent == NULL)
3858                 entp = &ent->next;
3859             }
3860           *entp = edir->elf.got.glist;
3861         }
3862
3863       edir->elf.got.glist = eind->elf.got.glist;
3864       eind->elf.got.glist = NULL;
3865     }
3866
3867   /* And plt entries.  */
3868   if (eind->elf.plt.plist != NULL)
3869     {
3870       if (edir->elf.plt.plist != NULL)
3871         {
3872           struct plt_entry **entp;
3873           struct plt_entry *ent;
3874
3875           for (entp = &eind->elf.plt.plist; (ent = *entp) != NULL; )
3876             {
3877               struct plt_entry *dent;
3878
3879               for (dent = edir->elf.plt.plist; dent != NULL; dent = dent->next)
3880                 if (dent->addend == ent->addend)
3881                   {
3882                     dent->plt.refcount += ent->plt.refcount;
3883                     *entp = ent->next;
3884                     break;
3885                   }
3886               if (dent == NULL)
3887                 entp = &ent->next;
3888             }
3889           *entp = edir->elf.plt.plist;
3890         }
3891
3892       edir->elf.plt.plist = eind->elf.plt.plist;
3893       eind->elf.plt.plist = NULL;
3894     }
3895
3896   if (edir->elf.dynindx == -1)
3897     {
3898       edir->elf.dynindx = eind->elf.dynindx;
3899       edir->elf.dynstr_index = eind->elf.dynstr_index;
3900       eind->elf.dynindx = -1;
3901       eind->elf.dynstr_index = 0;
3902     }
3903   else
3904     BFD_ASSERT (eind->elf.dynindx == -1);
3905 }
3906
3907 /* Find the function descriptor hash entry from the given function code
3908    hash entry FH.  Link the entries via their OH fields.  */
3909
3910 static struct ppc_link_hash_entry *
3911 get_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
3912 {
3913   struct ppc_link_hash_entry *fdh = fh->oh;
3914
3915   if (fdh == NULL)
3916     {
3917       const char *fd_name = fh->elf.root.root.string + 1;
3918
3919       fdh = (struct ppc_link_hash_entry *)
3920         elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
3921       if (fdh != NULL)
3922         {
3923           fdh->is_func_descriptor = 1;
3924           fdh->oh = fh;
3925           fh->is_func = 1;
3926           fh->oh = fdh;
3927         }
3928     }
3929
3930   return fdh;
3931 }
3932
3933 /* Hacks to support old ABI code.
3934    When making function calls, old ABI code references function entry
3935    points (dot symbols), while new ABI code references the function
3936    descriptor symbol.  We need to make any combination of reference and
3937    definition work together, without breaking archive linking.
3938
3939    For a defined function "foo" and an undefined call to "bar":
3940    An old object defines "foo" and ".foo", references ".bar" (possibly
3941    "bar" too).
3942    A new object defines "foo" and references "bar".
3943
3944    A new object thus has no problem with its undefined symbols being
3945    satisfied by definitions in an old object.  On the other hand, the
3946    old object won't have ".bar" satisfied by a new object.  */
3947
3948 /* Fix function descriptor symbols defined in .opd sections to be
3949    function type.  */
3950
3951 static bfd_boolean
3952 ppc64_elf_add_symbol_hook (bfd *ibfd ATTRIBUTE_UNUSED,
3953                            struct bfd_link_info *info ATTRIBUTE_UNUSED,
3954                            Elf_Internal_Sym *isym,
3955                            const char **name ATTRIBUTE_UNUSED,
3956                            flagword *flags ATTRIBUTE_UNUSED,
3957                            asection **sec,
3958                            bfd_vma *value ATTRIBUTE_UNUSED)
3959 {
3960   if (*sec != NULL
3961       && strcmp (bfd_get_section_name (ibfd, *sec), ".opd") == 0)
3962     isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
3963   return TRUE;
3964 }
3965
3966 /* This function makes an old ABI object reference to ".bar" cause the
3967    inclusion of a new ABI object archive that defines "bar".  */
3968
3969 static struct elf_link_hash_entry *
3970 ppc64_elf_archive_symbol_lookup (bfd *abfd,
3971                                  struct bfd_link_info *info,
3972                                  const char *name)
3973 {
3974   struct elf_link_hash_entry *h;
3975   char *dot_name;
3976   size_t len;
3977
3978   h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
3979   if (h != NULL)
3980     return h;
3981
3982   if (name[0] == '.')
3983     return h;
3984
3985   len = strlen (name);
3986   dot_name = bfd_alloc (abfd, len + 2);
3987   if (dot_name == NULL)
3988     return (struct elf_link_hash_entry *) 0 - 1;
3989   dot_name[0] = '.';
3990   memcpy (dot_name + 1, name, len + 1);
3991   h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
3992   bfd_release (abfd, dot_name);
3993   return h;
3994 }
3995
3996 /* This function satisfies all old ABI object references to ".bar" if a
3997    new ABI object defines "bar".  Well, at least, undefined dot symbols
3998    are made weak.  This stops later archive searches from including an
3999    object if we already have a function descriptor definition.  It also
4000    prevents the linker complaining about undefined symbols.
4001    We also check and correct mismatched symbol visibility here.  The
4002    most restrictive visibility of the function descriptor and the
4003    function entry symbol is used.  */
4004
4005 static bfd_boolean
4006 add_symbol_adjust (struct elf_link_hash_entry *h, void *inf)
4007 {
4008   struct bfd_link_info *info;
4009   struct ppc_link_hash_table *htab;
4010   struct ppc_link_hash_entry *eh;
4011   struct ppc_link_hash_entry *fdh;
4012
4013   if (h->root.type == bfd_link_hash_indirect)
4014     return TRUE;
4015
4016   if (h->root.type == bfd_link_hash_warning)
4017     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4018
4019   if (h->root.root.string[0] != '.')
4020     return TRUE;
4021
4022   info = inf;
4023   htab = ppc_hash_table (info);
4024   eh = (struct ppc_link_hash_entry *) h;
4025   fdh = get_fdh (eh, htab);
4026   if (fdh != NULL)
4027     {
4028       unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4029       unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4030       if (entry_vis < descr_vis)
4031         fdh->elf.other += entry_vis - descr_vis;
4032       else if (entry_vis > descr_vis)
4033         eh->elf.other += descr_vis - entry_vis;
4034
4035       if (eh->elf.root.type == bfd_link_hash_undefined)
4036         {
4037           eh->elf.root.type = bfd_link_hash_undefweak;
4038           eh->was_undefined = 1;
4039           htab->twiddled_syms = 1;
4040         }
4041     }
4042
4043   return TRUE;
4044 }
4045
4046 static bfd_boolean
4047 ppc64_elf_check_directives (bfd *abfd ATTRIBUTE_UNUSED,
4048                             struct bfd_link_info *info)
4049 {
4050   struct ppc_link_hash_table *htab;
4051   extern const bfd_target bfd_elf64_powerpc_vec;
4052   extern const bfd_target bfd_elf64_powerpcle_vec;
4053
4054   htab = ppc_hash_table (info);
4055   if (htab->elf.root.creator != &bfd_elf64_powerpc_vec
4056       && htab->elf.root.creator != &bfd_elf64_powerpcle_vec)
4057     return TRUE;
4058
4059   elf_link_hash_traverse (&htab->elf, add_symbol_adjust, info);
4060
4061   /* We need to fix the undefs list for any syms we have twiddled to
4062      undef_weak.  */
4063   if (htab->twiddled_syms)
4064     {
4065       struct bfd_link_hash_entry **pun;
4066
4067       pun = &htab->elf.root.undefs;
4068       while (*pun != NULL)
4069         {
4070           struct bfd_link_hash_entry *h = *pun;
4071
4072           if (h->type != bfd_link_hash_undefined
4073               && h->type != bfd_link_hash_common)
4074             {
4075               *pun = h->und_next;
4076               h->und_next = NULL;
4077               if (h == htab->elf.root.undefs_tail)
4078                 {
4079                   if (pun == &htab->elf.root.undefs)
4080                     htab->elf.root.undefs_tail = NULL;
4081                   else
4082                     /* pun points at an und_next field.  Go back to
4083                        the start of the link_hash_entry.  */
4084                     htab->elf.root.undefs_tail = (struct bfd_link_hash_entry *)
4085                       ((char *) pun - ((char *) &h->und_next - (char *) h));
4086                   break;
4087                 }
4088             }
4089           else
4090             pun = &h->und_next;
4091         }
4092
4093       htab->twiddled_syms = 0;
4094     }
4095   return TRUE;
4096 }
4097
4098 static bfd_boolean
4099 update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4100                        unsigned long r_symndx, bfd_vma r_addend, int tls_type)
4101 {
4102   struct got_entry **local_got_ents = elf_local_got_ents (abfd);
4103   char *local_got_tls_masks;
4104
4105   if (local_got_ents == NULL)
4106     {
4107       bfd_size_type size = symtab_hdr->sh_info;
4108
4109       size *= sizeof (*local_got_ents) + sizeof (*local_got_tls_masks);
4110       local_got_ents = bfd_zalloc (abfd, size);
4111       if (local_got_ents == NULL)
4112         return FALSE;
4113       elf_local_got_ents (abfd) = local_got_ents;
4114     }
4115
4116   if ((tls_type & TLS_EXPLICIT) == 0)
4117     {
4118       struct got_entry *ent;
4119
4120       for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
4121         if (ent->addend == r_addend
4122             && ent->owner == abfd
4123             && ent->tls_type == tls_type)
4124           break;
4125       if (ent == NULL)
4126         {
4127           bfd_size_type amt = sizeof (*ent);
4128           ent = bfd_alloc (abfd, amt);
4129           if (ent == NULL)
4130             return FALSE;
4131           ent->next = local_got_ents[r_symndx];
4132           ent->addend = r_addend;
4133           ent->owner = abfd;
4134           ent->tls_type = tls_type;
4135           ent->got.refcount = 0;
4136           local_got_ents[r_symndx] = ent;
4137         }
4138       ent->got.refcount += 1;
4139     }
4140
4141   local_got_tls_masks = (char *) (local_got_ents + symtab_hdr->sh_info);
4142   local_got_tls_masks[r_symndx] |= tls_type;
4143   return TRUE;
4144 }
4145
4146 static bfd_boolean
4147 update_plt_info (bfd *abfd, struct ppc_link_hash_entry *eh, bfd_vma addend)
4148 {
4149   struct plt_entry *ent;
4150
4151   for (ent = eh->elf.plt.plist; ent != NULL; ent = ent->next)
4152     if (ent->addend == addend)
4153       break;
4154   if (ent == NULL)
4155     {
4156       bfd_size_type amt = sizeof (*ent);
4157       ent = bfd_alloc (abfd, amt);
4158       if (ent == NULL)
4159         return FALSE;
4160       ent->next = eh->elf.plt.plist;
4161       ent->addend = addend;
4162       ent->plt.refcount = 0;
4163       eh->elf.plt.plist = ent;
4164     }
4165   ent->plt.refcount += 1;
4166   eh->elf.elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
4167   eh->is_func = 1;
4168   return TRUE;
4169 }
4170
4171 /* Look through the relocs for a section during the first phase, and
4172    calculate needed space in the global offset table, procedure
4173    linkage table, and dynamic reloc sections.  */
4174
4175 static bfd_boolean
4176 ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4177                         asection *sec, const Elf_Internal_Rela *relocs)
4178 {
4179   struct ppc_link_hash_table *htab;
4180   Elf_Internal_Shdr *symtab_hdr;
4181   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4182   const Elf_Internal_Rela *rel;
4183   const Elf_Internal_Rela *rel_end;
4184   asection *sreloc;
4185   asection **opd_sym_map;
4186
4187   if (info->relocatable)
4188     return TRUE;
4189
4190   /* Don't do anything special with non-loaded, non-alloced sections.
4191      In particular, any relocs in such sections should not affect GOT
4192      and PLT reference counting (ie. we don't allow them to create GOT
4193      or PLT entries), there's no possibility or desire to optimize TLS
4194      relocs, and there's not much point in propagating relocs to shared
4195      libs that the dynamic linker won't relocate.  */
4196   if ((sec->flags & SEC_ALLOC) == 0)
4197     return TRUE;
4198
4199   htab = ppc_hash_table (info);
4200   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4201
4202   sym_hashes = elf_sym_hashes (abfd);
4203   sym_hashes_end = (sym_hashes
4204                     + symtab_hdr->sh_size / sizeof (Elf64_External_Sym)
4205                     - symtab_hdr->sh_info);
4206
4207   sreloc = NULL;
4208   opd_sym_map = NULL;
4209   if (strcmp (bfd_get_section_name (abfd, sec), ".opd") == 0)
4210     {
4211       /* Garbage collection needs some extra help with .opd sections.
4212          We don't want to necessarily keep everything referenced by
4213          relocs in .opd, as that would keep all functions.  Instead,
4214          if we reference an .opd symbol (a function descriptor), we
4215          want to keep the function code symbol's section.  This is
4216          easy for global symbols, but for local syms we need to keep
4217          information about the associated function section.  Later, if
4218          edit_opd deletes entries, we'll use this array to adjust
4219          local syms in .opd.  */
4220       union opd_info {
4221         asection *func_section;
4222         long entry_adjust;
4223       };
4224       bfd_size_type amt;
4225
4226       amt = sec->size * sizeof (union opd_info) / 8;
4227       opd_sym_map = bfd_zalloc (abfd, amt);
4228       if (opd_sym_map == NULL)
4229         return FALSE;
4230       ppc64_elf_section_data (sec)->opd.func_sec = opd_sym_map;
4231     }
4232
4233   if (htab->sfpr == NULL
4234       && !create_linkage_sections (htab->elf.dynobj, info))
4235     return FALSE;
4236
4237   rel_end = relocs + sec->reloc_count;
4238   for (rel = relocs; rel < rel_end; rel++)
4239     {
4240       unsigned long r_symndx;
4241       struct elf_link_hash_entry *h;
4242       enum elf_ppc64_reloc_type r_type;
4243       int tls_type = 0;
4244
4245       r_symndx = ELF64_R_SYM (rel->r_info);
4246       if (r_symndx < symtab_hdr->sh_info)
4247         h = NULL;
4248       else
4249         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4250
4251       r_type = ELF64_R_TYPE (rel->r_info);
4252       switch (r_type)
4253         {
4254         case R_PPC64_GOT_TLSLD16:
4255         case R_PPC64_GOT_TLSLD16_LO:
4256         case R_PPC64_GOT_TLSLD16_HI:
4257         case R_PPC64_GOT_TLSLD16_HA:
4258           ppc64_tlsld_got (abfd)->refcount += 1;
4259           tls_type = TLS_TLS | TLS_LD;
4260           goto dogottls;
4261
4262         case R_PPC64_GOT_TLSGD16:
4263         case R_PPC64_GOT_TLSGD16_LO:
4264         case R_PPC64_GOT_TLSGD16_HI:
4265         case R_PPC64_GOT_TLSGD16_HA:
4266           tls_type = TLS_TLS | TLS_GD;
4267           goto dogottls;
4268
4269         case R_PPC64_GOT_TPREL16_DS:
4270         case R_PPC64_GOT_TPREL16_LO_DS:
4271         case R_PPC64_GOT_TPREL16_HI:
4272         case R_PPC64_GOT_TPREL16_HA:
4273           if (info->shared)
4274             info->flags |= DF_STATIC_TLS;
4275           tls_type = TLS_TLS | TLS_TPREL;
4276           goto dogottls;
4277
4278         case R_PPC64_GOT_DTPREL16_DS:
4279         case R_PPC64_GOT_DTPREL16_LO_DS:
4280         case R_PPC64_GOT_DTPREL16_HI:
4281         case R_PPC64_GOT_DTPREL16_HA:
4282           tls_type = TLS_TLS | TLS_DTPREL;
4283         dogottls:
4284           sec->has_tls_reloc = 1;
4285           /* Fall thru */
4286
4287         case R_PPC64_GOT16:
4288         case R_PPC64_GOT16_DS:
4289         case R_PPC64_GOT16_HA:
4290         case R_PPC64_GOT16_HI:
4291         case R_PPC64_GOT16_LO:
4292         case R_PPC64_GOT16_LO_DS:
4293           /* This symbol requires a global offset table entry.  */
4294           sec->has_gp_reloc = 1;
4295           if (ppc64_elf_tdata (abfd)->got == NULL
4296               && !create_got_section (abfd, info))
4297             return FALSE;
4298
4299           if (h != NULL)
4300             {
4301               struct ppc_link_hash_entry *eh;
4302               struct got_entry *ent;
4303
4304               eh = (struct ppc_link_hash_entry *) h;
4305               for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
4306                 if (ent->addend == rel->r_addend
4307                     && ent->owner == abfd
4308                     && ent->tls_type == tls_type)
4309                   break;
4310               if (ent == NULL)
4311                 {
4312                   bfd_size_type amt = sizeof (*ent);
4313                   ent = bfd_alloc (abfd, amt);
4314                   if (ent == NULL)
4315                     return FALSE;
4316                   ent->next = eh->elf.got.glist;
4317                   ent->addend = rel->r_addend;
4318                   ent->owner = abfd;
4319                   ent->tls_type = tls_type;
4320                   ent->got.refcount = 0;
4321                   eh->elf.got.glist = ent;
4322                 }
4323               ent->got.refcount += 1;
4324               eh->tls_mask |= tls_type;
4325             }
4326           else
4327             /* This is a global offset table entry for a local symbol.  */
4328             if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
4329                                         rel->r_addend, tls_type))
4330               return FALSE;
4331           break;
4332
4333         case R_PPC64_PLT16_HA:
4334         case R_PPC64_PLT16_HI:
4335         case R_PPC64_PLT16_LO:
4336         case R_PPC64_PLT32:
4337         case R_PPC64_PLT64:
4338           /* This symbol requires a procedure linkage table entry.  We
4339              actually build the entry in adjust_dynamic_symbol,
4340              because this might be a case of linking PIC code without
4341              linking in any dynamic objects, in which case we don't
4342              need to generate a procedure linkage table after all.  */
4343           if (h == NULL)
4344             {
4345               /* It does not make sense to have a procedure linkage
4346                  table entry for a local symbol.  */
4347               bfd_set_error (bfd_error_bad_value);
4348               return FALSE;
4349             }
4350           else
4351             if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
4352                                   rel->r_addend))
4353               return FALSE;
4354           break;
4355
4356           /* The following relocations don't need to propagate the
4357              relocation if linking a shared object since they are
4358              section relative.  */
4359         case R_PPC64_SECTOFF:
4360         case R_PPC64_SECTOFF_LO:
4361         case R_PPC64_SECTOFF_HI:
4362         case R_PPC64_SECTOFF_HA:
4363         case R_PPC64_SECTOFF_DS:
4364         case R_PPC64_SECTOFF_LO_DS:
4365         case R_PPC64_DTPREL16:
4366         case R_PPC64_DTPREL16_LO:
4367         case R_PPC64_DTPREL16_HI:
4368         case R_PPC64_DTPREL16_HA:
4369         case R_PPC64_DTPREL16_DS:
4370         case R_PPC64_DTPREL16_LO_DS:
4371         case R_PPC64_DTPREL16_HIGHER:
4372         case R_PPC64_DTPREL16_HIGHERA:
4373         case R_PPC64_DTPREL16_HIGHEST:
4374         case R_PPC64_DTPREL16_HIGHESTA:
4375           break;
4376
4377           /* Nor do these.  */
4378         case R_PPC64_TOC16:
4379         case R_PPC64_TOC16_LO:
4380         case R_PPC64_TOC16_HI:
4381         case R_PPC64_TOC16_HA:
4382         case R_PPC64_TOC16_DS:
4383         case R_PPC64_TOC16_LO_DS:
4384           sec->has_gp_reloc = 1;
4385           break;
4386
4387           /* This relocation describes the C++ object vtable hierarchy.
4388              Reconstruct it for later use during GC.  */
4389         case R_PPC64_GNU_VTINHERIT:
4390           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4391             return FALSE;
4392           break;
4393
4394           /* This relocation describes which C++ vtable entries are actually
4395              used.  Record for later use during GC.  */
4396         case R_PPC64_GNU_VTENTRY:
4397           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4398             return FALSE;
4399           break;
4400
4401         case R_PPC64_REL14:
4402         case R_PPC64_REL14_BRTAKEN:
4403         case R_PPC64_REL14_BRNTAKEN:
4404           htab->has_14bit_branch = 1;
4405           /* Fall through.  */
4406
4407         case R_PPC64_REL24:
4408           if (h != NULL)
4409             {
4410               /* We may need a .plt entry if the function this reloc
4411                  refers to is in a shared lib.  */
4412               if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
4413                                     rel->r_addend))
4414                 return FALSE;
4415               if (h == &htab->tls_get_addr->elf
4416                   || h == &htab->tls_get_addr_fd->elf)
4417                 sec->has_tls_reloc = 1;
4418               else if (htab->tls_get_addr == NULL
4419                        && !strncmp (h->root.root.string, ".__tls_get_addr", 15)
4420                        && (h->root.root.string[15] == 0
4421                            || h->root.root.string[15] == '@'))
4422                 {
4423                   htab->tls_get_addr = (struct ppc_link_hash_entry *) h;
4424                   sec->has_tls_reloc = 1;
4425                 }
4426               else if (htab->tls_get_addr_fd == NULL
4427                        && !strncmp (h->root.root.string, "__tls_get_addr", 14)
4428                        && (h->root.root.string[14] == 0
4429                            || h->root.root.string[14] == '@'))
4430                 {
4431                   htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) h;
4432                   sec->has_tls_reloc = 1;
4433                 }
4434             }
4435           break;
4436
4437         case R_PPC64_TPREL64:
4438           tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
4439           if (info->shared)
4440             info->flags |= DF_STATIC_TLS;
4441           goto dotlstoc;
4442
4443         case R_PPC64_DTPMOD64:
4444           if (rel + 1 < rel_end
4445               && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
4446               && rel[1].r_offset == rel->r_offset + 8)
4447             tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
4448           else
4449             tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
4450           goto dotlstoc;
4451
4452         case R_PPC64_DTPREL64:
4453           tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
4454           if (rel != relocs
4455               && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
4456               && rel[-1].r_offset == rel->r_offset - 8)
4457             /* This is the second reloc of a dtpmod, dtprel pair.
4458                Don't mark with TLS_DTPREL.  */
4459             goto dodyn;
4460
4461         dotlstoc:
4462           sec->has_tls_reloc = 1;
4463           if (h != NULL)
4464             {
4465               struct ppc_link_hash_entry *eh;
4466               eh = (struct ppc_link_hash_entry *) h;
4467               eh->tls_mask |= tls_type;
4468             }
4469           else
4470             if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
4471                                         rel->r_addend, tls_type))
4472               return FALSE;
4473
4474           if (ppc64_elf_section_data (sec)->t_symndx == NULL)
4475             {
4476               /* One extra to simplify get_tls_mask.  */
4477               bfd_size_type amt = sec->size * sizeof (unsigned) / 8 + 1;
4478               ppc64_elf_section_data (sec)->t_symndx = bfd_zalloc (abfd, amt);
4479               if (ppc64_elf_section_data (sec)->t_symndx == NULL)
4480                 return FALSE;
4481             }
4482           BFD_ASSERT (rel->r_offset % 8 == 0);
4483           ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8] = r_symndx;
4484
4485           /* Mark the second slot of a GD or LD entry.
4486              -1 to indicate GD and -2 to indicate LD.  */
4487           if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
4488             ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8 + 1] = -1;
4489           else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
4490             ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8 + 1] = -2;
4491           goto dodyn;
4492
4493         case R_PPC64_TPREL16:
4494         case R_PPC64_TPREL16_LO:
4495         case R_PPC64_TPREL16_HI:
4496         case R_PPC64_TPREL16_HA:
4497         case R_PPC64_TPREL16_DS:
4498         case R_PPC64_TPREL16_LO_DS:
4499         case R_PPC64_TPREL16_HIGHER:
4500         case R_PPC64_TPREL16_HIGHERA:
4501         case R_PPC64_TPREL16_HIGHEST:
4502         case R_PPC64_TPREL16_HIGHESTA:
4503           if (info->shared)
4504             {
4505               info->flags |= DF_STATIC_TLS;
4506               goto dodyn;
4507             }
4508           break;
4509
4510         case R_PPC64_ADDR64:
4511           if (opd_sym_map != NULL
4512               && rel + 1 < rel_end
4513               && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
4514             {
4515               if (h != NULL)
4516                 {
4517                   if (h->root.root.string[0] == '.'
4518                       && h->root.root.string[1] != 0
4519                       && get_fdh ((struct ppc_link_hash_entry *) h, htab))
4520                     ;
4521                   else
4522                     ((struct ppc_link_hash_entry *) h)->is_func = 1;
4523                 }
4524               else
4525                 {
4526                   asection *s;
4527
4528                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, sec,
4529                                                  r_symndx);
4530                   if (s == NULL)
4531                     return FALSE;
4532                   else if (s != sec)
4533                     opd_sym_map[rel->r_offset / 8] = s;
4534                 }
4535             }
4536           /* Fall through.  */
4537
4538         case R_PPC64_REL30:
4539         case R_PPC64_REL32:
4540         case R_PPC64_REL64:
4541         case R_PPC64_ADDR14:
4542         case R_PPC64_ADDR14_BRNTAKEN:
4543         case R_PPC64_ADDR14_BRTAKEN:
4544         case R_PPC64_ADDR16:
4545         case R_PPC64_ADDR16_DS:
4546         case R_PPC64_ADDR16_HA:
4547         case R_PPC64_ADDR16_HI:
4548         case R_PPC64_ADDR16_HIGHER:
4549         case R_PPC64_ADDR16_HIGHERA:
4550         case R_PPC64_ADDR16_HIGHEST:
4551         case R_PPC64_ADDR16_HIGHESTA:
4552         case R_PPC64_ADDR16_LO:
4553         case R_PPC64_ADDR16_LO_DS:
4554         case R_PPC64_ADDR24:
4555         case R_PPC64_ADDR32:
4556         case R_PPC64_UADDR16:
4557         case R_PPC64_UADDR32:
4558         case R_PPC64_UADDR64:
4559         case R_PPC64_TOC:
4560           if (h != NULL && !info->shared)
4561             /* We may need a copy reloc.  */
4562             h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
4563
4564           /* Don't propagate .opd relocs.  */
4565           if (NO_OPD_RELOCS && opd_sym_map != NULL)
4566             break;
4567
4568           /* If we are creating a shared library, and this is a reloc
4569              against a global symbol, or a non PC relative reloc
4570              against a local symbol, then we need to copy the reloc
4571              into the shared library.  However, if we are linking with
4572              -Bsymbolic, we do not need to copy a reloc against a
4573              global symbol which is defined in an object we are
4574              including in the link (i.e., DEF_REGULAR is set).  At
4575              this point we have not seen all the input files, so it is
4576              possible that DEF_REGULAR is not set now but will be set
4577              later (it is never cleared).  In case of a weak definition,
4578              DEF_REGULAR may be cleared later by a strong definition in
4579              a shared library.  We account for that possibility below by
4580              storing information in the dyn_relocs field of the hash
4581              table entry.  A similar situation occurs when creating
4582              shared libraries and symbol visibility changes render the
4583              symbol local.
4584
4585              If on the other hand, we are creating an executable, we
4586              may need to keep relocations for symbols satisfied by a
4587              dynamic library if we manage to avoid copy relocs for the
4588              symbol.  */
4589         dodyn:
4590           if ((info->shared
4591                && (MUST_BE_DYN_RELOC (r_type)
4592                    || (h != NULL
4593                        && (! info->symbolic
4594                            || h->root.type == bfd_link_hash_defweak
4595                            || (h->elf_link_hash_flags
4596                                & ELF_LINK_HASH_DEF_REGULAR) == 0))))
4597               || (ELIMINATE_COPY_RELOCS
4598                   && !info->shared
4599                   && h != NULL
4600                   && (h->root.type == bfd_link_hash_defweak
4601                       || (h->elf_link_hash_flags
4602                           & ELF_LINK_HASH_DEF_REGULAR) == 0)))
4603             {
4604               struct ppc_dyn_relocs *p;
4605               struct ppc_dyn_relocs **head;
4606
4607               /* We must copy these reloc types into the output file.
4608                  Create a reloc section in dynobj and make room for
4609                  this reloc.  */
4610               if (sreloc == NULL)
4611                 {
4612                   const char *name;
4613                   bfd *dynobj;
4614
4615                   name = (bfd_elf_string_from_elf_section
4616                           (abfd,
4617                            elf_elfheader (abfd)->e_shstrndx,
4618                            elf_section_data (sec)->rel_hdr.sh_name));
4619                   if (name == NULL)
4620                     return FALSE;
4621
4622                   if (strncmp (name, ".rela", 5) != 0
4623                       || strcmp (bfd_get_section_name (abfd, sec),
4624                                  name + 5) != 0)
4625                     {
4626                       (*_bfd_error_handler)
4627                         (_("%B: bad relocation section name `%s\'"),
4628                          abfd, name);
4629                       bfd_set_error (bfd_error_bad_value);
4630                     }
4631
4632                   dynobj = htab->elf.dynobj;
4633                   sreloc = bfd_get_section_by_name (dynobj, name);
4634                   if (sreloc == NULL)
4635                     {
4636                       flagword flags;
4637
4638                       sreloc = bfd_make_section (dynobj, name);
4639                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
4640                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4641                       if ((sec->flags & SEC_ALLOC) != 0)
4642                         flags |= SEC_ALLOC | SEC_LOAD;
4643                       if (sreloc == NULL
4644                           || ! bfd_set_section_flags (dynobj, sreloc, flags)
4645                           || ! bfd_set_section_alignment (dynobj, sreloc, 3))
4646                         return FALSE;
4647                     }
4648                   elf_section_data (sec)->sreloc = sreloc;
4649                 }
4650
4651               /* If this is a global symbol, we count the number of
4652                  relocations we need for this symbol.  */
4653               if (h != NULL)
4654                 {
4655                   head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
4656                 }
4657               else
4658                 {
4659                   /* Track dynamic relocs needed for local syms too.
4660                      We really need local syms available to do this
4661                      easily.  Oh well.  */
4662
4663                   asection *s;
4664                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
4665                                                  sec, r_symndx);
4666                   if (s == NULL)
4667                     return FALSE;
4668
4669                   head = ((struct ppc_dyn_relocs **)
4670                           &elf_section_data (s)->local_dynrel);
4671                 }
4672
4673               p = *head;
4674               if (p == NULL || p->sec != sec)
4675                 {
4676                   p = bfd_alloc (htab->elf.dynobj, sizeof *p);
4677                   if (p == NULL)
4678                     return FALSE;
4679                   p->next = *head;
4680                   *head = p;
4681                   p->sec = sec;
4682                   p->count = 0;
4683                   p->pc_count = 0;
4684                 }
4685
4686               p->count += 1;
4687               if (!MUST_BE_DYN_RELOC (r_type))
4688                 p->pc_count += 1;
4689             }
4690           break;
4691
4692         default:
4693           break;
4694         }
4695     }
4696
4697   return TRUE;
4698 }
4699
4700 /* OFFSET in OPD_SEC specifies a function descriptor.  Return the address
4701    of the code entry point, and its section.  */
4702
4703 static bfd_vma
4704 opd_entry_value (asection *opd_sec,
4705                  bfd_vma offset,
4706                  asection **code_sec,
4707                  bfd_vma *code_off)
4708 {
4709   bfd *opd_bfd = opd_sec->owner;
4710   Elf_Internal_Rela *lo, *hi, *look;
4711
4712   /* Go find the opd reloc at the sym address.  */
4713   lo = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
4714   BFD_ASSERT (lo != NULL);
4715   hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
4716
4717   while (lo < hi)
4718     {
4719       look = lo + (hi - lo) / 2;
4720       if (look->r_offset < offset)
4721         lo = look + 1;
4722       else if (look->r_offset > offset)
4723         hi = look;
4724       else
4725         {
4726           Elf_Internal_Shdr *symtab_hdr = &elf_tdata (opd_bfd)->symtab_hdr;
4727           if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
4728               && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
4729             {
4730               unsigned long symndx = ELF64_R_SYM (look->r_info);
4731               bfd_vma val;
4732               asection *sec;
4733
4734               if (symndx < symtab_hdr->sh_info)
4735                 {
4736                   Elf_Internal_Sym *sym;
4737
4738                   sym = (Elf_Internal_Sym *) symtab_hdr->contents;
4739                   if (sym == NULL)
4740                     {
4741                       sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
4742                                                   symtab_hdr->sh_info,
4743                                                   0, NULL, NULL, NULL);
4744                       if (sym == NULL)
4745                         return (bfd_vma) -1;
4746                       symtab_hdr->contents = (bfd_byte *) sym;
4747                     }
4748
4749                   sym += symndx;
4750                   val = sym->st_value;
4751                   sec = NULL;
4752                   if ((sym->st_shndx != SHN_UNDEF
4753                        && sym->st_shndx < SHN_LORESERVE)
4754                       || sym->st_shndx > SHN_HIRESERVE)
4755                     sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
4756                   BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
4757                 }
4758               else
4759                 {
4760                   struct elf_link_hash_entry **sym_hashes;
4761                   struct elf_link_hash_entry *rh;
4762
4763                   sym_hashes = elf_sym_hashes (opd_bfd);
4764                   rh = sym_hashes[symndx - symtab_hdr->sh_info];
4765                   while (rh->root.type == bfd_link_hash_indirect
4766                          || rh->root.type == bfd_link_hash_warning)
4767                     rh = ((struct elf_link_hash_entry *) rh->root.u.i.link);
4768                   BFD_ASSERT (rh->root.type == bfd_link_hash_defined
4769                               || rh->root.type == bfd_link_hash_defweak);
4770                   val = rh->root.u.def.value;
4771                   sec = rh->root.u.def.section;
4772                 }
4773               val += look->r_addend;
4774               if (code_off != NULL)
4775                 *code_off = val;
4776               if (code_sec != NULL)
4777                 *code_sec = sec;
4778               if (sec != NULL && sec->output_section != NULL)
4779                 val += sec->output_section->vma + sec->output_offset;
4780               return val;
4781             }
4782           break;
4783         }
4784     }
4785   return (bfd_vma) -1;
4786 }
4787
4788 /* Return the section that should be marked against GC for a given
4789    relocation.  */
4790
4791 static asection *
4792 ppc64_elf_gc_mark_hook (asection *sec,
4793                         struct bfd_link_info *info,
4794                         Elf_Internal_Rela *rel,
4795                         struct elf_link_hash_entry *h,
4796                         Elf_Internal_Sym *sym)
4797 {
4798   asection *rsec;
4799
4800   /* First mark all our entry sym sections.  */
4801   if (info->gc_sym_list != NULL)
4802     {
4803       struct ppc_link_hash_table *htab = ppc_hash_table (info);
4804       struct bfd_sym_chain *sym = info->gc_sym_list;
4805
4806       info->gc_sym_list = NULL;
4807       do
4808         {
4809           struct ppc_link_hash_entry *eh;
4810
4811           eh = (struct ppc_link_hash_entry *)
4812             elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, FALSE);
4813           if (eh == NULL)
4814             continue;
4815           if (eh->elf.root.type != bfd_link_hash_defined
4816               && eh->elf.root.type != bfd_link_hash_defweak)
4817             continue;
4818
4819           if (eh->is_func_descriptor)
4820             rsec = eh->oh->elf.root.u.def.section;
4821           else if (get_opd_info (eh->elf.root.u.def.section) != NULL
4822                    && opd_entry_value (eh->elf.root.u.def.section,
4823                                        eh->elf.root.u.def.value,
4824                                        &rsec, NULL) != (bfd_vma) -1)
4825             ;
4826           else
4827             continue;
4828
4829           if (!rsec->gc_mark)
4830             _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4831
4832           rsec = eh->elf.root.u.def.section;
4833           if (!rsec->gc_mark)
4834             _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4835
4836           sym = sym->next;
4837         }
4838       while (sym != NULL);
4839     }
4840
4841   /* Syms return NULL if we're marking .opd, so we avoid marking all
4842      function sections, as all functions are referenced in .opd.  */
4843   rsec = NULL;
4844   if (get_opd_info (sec) != NULL)
4845     return rsec;
4846
4847   if (h != NULL)
4848     {
4849       enum elf_ppc64_reloc_type r_type;
4850       struct ppc_link_hash_entry *eh;
4851
4852       r_type = ELF64_R_TYPE (rel->r_info);
4853       switch (r_type)
4854         {
4855         case R_PPC64_GNU_VTINHERIT:
4856         case R_PPC64_GNU_VTENTRY:
4857           break;
4858
4859         default:
4860           switch (h->root.type)
4861             {
4862             case bfd_link_hash_defined:
4863             case bfd_link_hash_defweak:
4864               eh = (struct ppc_link_hash_entry *) h;
4865               if (eh->oh != NULL && eh->oh->is_func_descriptor)
4866                 eh = eh->oh;
4867
4868               /* Function descriptor syms cause the associated
4869                  function code sym section to be marked.  */
4870               if (eh->is_func_descriptor)
4871                 {
4872                   /* They also mark their opd section.  */
4873                   if (!eh->elf.root.u.def.section->gc_mark)
4874                     _bfd_elf_gc_mark (info, eh->elf.root.u.def.section,
4875                                       ppc64_elf_gc_mark_hook);
4876
4877                   rsec = eh->oh->elf.root.u.def.section;
4878                 }
4879               else if (get_opd_info (eh->elf.root.u.def.section) != NULL
4880                        && opd_entry_value (eh->elf.root.u.def.section,
4881                                            eh->elf.root.u.def.value,
4882                                            &rsec, NULL) != (bfd_vma) -1)
4883                 {
4884                   if (!eh->elf.root.u.def.section->gc_mark)
4885                     _bfd_elf_gc_mark (info, eh->elf.root.u.def.section,
4886                                       ppc64_elf_gc_mark_hook);
4887                 }
4888               else
4889                 rsec = h->root.u.def.section;
4890               break;
4891
4892             case bfd_link_hash_common:
4893               rsec = h->root.u.c.p->section;
4894               break;
4895
4896             default:
4897               break;
4898             }
4899         }
4900     }
4901   else
4902     {
4903       asection **opd_sym_section;
4904
4905       rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
4906       opd_sym_section = get_opd_info (rsec);
4907       if (opd_sym_section != NULL)
4908         {
4909           if (!rsec->gc_mark)
4910             _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4911
4912           rsec = opd_sym_section[sym->st_value / 8];
4913         }
4914     }
4915
4916   return rsec;
4917 }
4918
4919 /* Update the .got, .plt. and dynamic reloc reference counts for the
4920    section being removed.  */
4921
4922 static bfd_boolean
4923 ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
4924                          asection *sec, const Elf_Internal_Rela *relocs)
4925 {
4926   struct ppc_link_hash_table *htab;
4927   Elf_Internal_Shdr *symtab_hdr;
4928   struct elf_link_hash_entry **sym_hashes;
4929   struct got_entry **local_got_ents;
4930   const Elf_Internal_Rela *rel, *relend;
4931
4932   if ((sec->flags & SEC_ALLOC) == 0)
4933     return TRUE;
4934
4935   elf_section_data (sec)->local_dynrel = NULL;
4936
4937   htab = ppc_hash_table (info);
4938   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4939   sym_hashes = elf_sym_hashes (abfd);
4940   local_got_ents = elf_local_got_ents (abfd);
4941
4942   relend = relocs + sec->reloc_count;
4943   for (rel = relocs; rel < relend; rel++)
4944     {
4945       unsigned long r_symndx;
4946       enum elf_ppc64_reloc_type r_type;
4947       struct elf_link_hash_entry *h = NULL;
4948       char tls_type = 0;
4949
4950       r_symndx = ELF64_R_SYM (rel->r_info);
4951       r_type = ELF64_R_TYPE (rel->r_info);
4952       if (r_symndx >= symtab_hdr->sh_info)
4953         {
4954           struct ppc_link_hash_entry *eh;
4955           struct ppc_dyn_relocs **pp;
4956           struct ppc_dyn_relocs *p;
4957
4958           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4959           eh = (struct ppc_link_hash_entry *) h;
4960
4961           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
4962             if (p->sec == sec)
4963               {
4964                 /* Everything must go for SEC.  */
4965                 *pp = p->next;
4966                 break;
4967               }
4968         }
4969
4970       switch (r_type)
4971         {
4972         case R_PPC64_GOT_TLSLD16:
4973         case R_PPC64_GOT_TLSLD16_LO:
4974         case R_PPC64_GOT_TLSLD16_HI:
4975         case R_PPC64_GOT_TLSLD16_HA:
4976           ppc64_tlsld_got (abfd)->refcount -= 1;
4977           tls_type = TLS_TLS | TLS_LD;
4978           goto dogot;
4979
4980         case R_PPC64_GOT_TLSGD16:
4981         case R_PPC64_GOT_TLSGD16_LO:
4982         case R_PPC64_GOT_TLSGD16_HI:
4983         case R_PPC64_GOT_TLSGD16_HA:
4984           tls_type = TLS_TLS | TLS_GD;
4985           goto dogot;
4986
4987         case R_PPC64_GOT_TPREL16_DS:
4988         case R_PPC64_GOT_TPREL16_LO_DS:
4989         case R_PPC64_GOT_TPREL16_HI:
4990         case R_PPC64_GOT_TPREL16_HA:
4991           tls_type = TLS_TLS | TLS_TPREL;
4992           goto dogot;
4993
4994         case R_PPC64_GOT_DTPREL16_DS:
4995         case R_PPC64_GOT_DTPREL16_LO_DS:
4996         case R_PPC64_GOT_DTPREL16_HI:
4997         case R_PPC64_GOT_DTPREL16_HA:
4998           tls_type = TLS_TLS | TLS_DTPREL;
4999           goto dogot;
5000
5001         case R_PPC64_GOT16:
5002         case R_PPC64_GOT16_DS:
5003         case R_PPC64_GOT16_HA:
5004         case R_PPC64_GOT16_HI:
5005         case R_PPC64_GOT16_LO:
5006         case R_PPC64_GOT16_LO_DS:
5007         dogot:
5008           {
5009             struct got_entry *ent;
5010
5011             if (h != NULL)
5012               ent = h->got.glist;
5013             else
5014               ent = local_got_ents[r_symndx];
5015
5016             for (; ent != NULL; ent = ent->next)
5017               if (ent->addend == rel->r_addend
5018                   && ent->owner == abfd
5019                   && ent->tls_type == tls_type)
5020                 break;
5021             if (ent == NULL)
5022               abort ();
5023             if (ent->got.refcount > 0)
5024               ent->got.refcount -= 1;
5025           }
5026           break;
5027
5028         case R_PPC64_PLT16_HA:
5029         case R_PPC64_PLT16_HI:
5030         case R_PPC64_PLT16_LO:
5031         case R_PPC64_PLT32:
5032         case R_PPC64_PLT64:
5033         case R_PPC64_REL14:
5034         case R_PPC64_REL14_BRNTAKEN:
5035         case R_PPC64_REL14_BRTAKEN:
5036         case R_PPC64_REL24:
5037           if (h != NULL)
5038             {
5039               struct plt_entry *ent;
5040
5041               for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5042                 if (ent->addend == rel->r_addend)
5043                   break;
5044               if (ent == NULL)
5045                 abort ();
5046               if (ent->plt.refcount > 0)
5047                 ent->plt.refcount -= 1;
5048             }
5049           break;
5050
5051         default:
5052           break;
5053         }
5054     }
5055   return TRUE;
5056 }
5057
5058 /* The maximum size of .sfpr.  */
5059 #define SFPR_MAX (218*4)
5060
5061 struct sfpr_def_parms
5062 {
5063   const char name[12];
5064   unsigned char lo, hi;
5065   bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
5066   bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
5067 };
5068
5069 /* Auto-generate _save*, _rest* functions in .sfpr.  */
5070
5071 static unsigned int
5072 sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
5073 {
5074   struct ppc_link_hash_table *htab = ppc_hash_table (info);
5075   unsigned int i;
5076   size_t len = strlen (parm->name);
5077   bfd_boolean writing = FALSE;
5078   char sym[16];
5079
5080   memcpy (sym, parm->name, len);
5081   sym[len + 2] = 0;
5082
5083   for (i = parm->lo; i <= parm->hi; i++)
5084     {
5085       struct elf_link_hash_entry *h;
5086
5087       sym[len + 0] = i / 10 + '0';
5088       sym[len + 1] = i % 10 + '0';
5089       h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
5090       if (h != NULL
5091           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
5092         {
5093           h->root.type = bfd_link_hash_defined;
5094           h->root.u.def.section = htab->sfpr;
5095           h->root.u.def.value = htab->sfpr->size;
5096           h->type = STT_FUNC;
5097           h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
5098           _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
5099           writing = TRUE;
5100           if (htab->sfpr->contents == NULL)
5101             {
5102               htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
5103               if (htab->sfpr->contents == NULL)
5104                 return FALSE;
5105             }
5106         }
5107       if (writing)
5108         {
5109           bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
5110           if (i != parm->hi)
5111             p = (*parm->write_ent) (htab->elf.dynobj, p, i);
5112           else
5113             p = (*parm->write_tail) (htab->elf.dynobj, p, i);
5114           htab->sfpr->size = p - htab->sfpr->contents;
5115         }
5116     }
5117
5118   return TRUE;
5119 }
5120
5121 static bfd_byte *
5122 savegpr0 (bfd *abfd, bfd_byte *p, int r)
5123 {
5124   bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5125   return p + 4;
5126 }
5127
5128 static bfd_byte *
5129 savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
5130 {
5131   p = savegpr0 (abfd, p, r);
5132   bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
5133   p = p + 4;
5134   bfd_put_32 (abfd, BLR, p);
5135   return p + 4;
5136 }
5137
5138 static bfd_byte *
5139 restgpr0 (bfd *abfd, bfd_byte *p, int r)
5140 {
5141   bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5142   return p + 4;
5143 }
5144
5145 static bfd_byte *
5146 restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
5147 {
5148   bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
5149   p = p + 4;
5150   p = restgpr0 (abfd, p, r);
5151   bfd_put_32 (abfd, MTLR_R0, p);
5152   p = p + 4;
5153   if (r == 29)
5154     {
5155       p = restgpr0 (abfd, p, 30);
5156       p = restgpr0 (abfd, p, 31);
5157     }
5158   bfd_put_32 (abfd, BLR, p);
5159   return p + 4;
5160 }
5161
5162 static bfd_byte *
5163 savegpr1 (bfd *abfd, bfd_byte *p, int r)
5164 {
5165   bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5166   return p + 4;
5167 }
5168
5169 static bfd_byte *
5170 savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
5171 {
5172   p = savegpr1 (abfd, p, r);
5173   bfd_put_32 (abfd, BLR, p);
5174   return p + 4;
5175 }
5176
5177 static bfd_byte *
5178 restgpr1 (bfd *abfd, bfd_byte *p, int r)
5179 {
5180   bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5181   return p + 4;
5182 }
5183
5184 static bfd_byte *
5185 restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
5186 {
5187   p = restgpr1 (abfd, p, r);
5188   bfd_put_32 (abfd, BLR, p);
5189   return p + 4;
5190 }
5191
5192 static bfd_byte *
5193 savefpr (bfd *abfd, bfd_byte *p, int r)
5194 {
5195   bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5196   return p + 4;
5197 }
5198
5199 static bfd_byte *
5200 savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
5201 {
5202   p = savefpr (abfd, p, r);
5203   bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
5204   p = p + 4;
5205   bfd_put_32 (abfd, BLR, p);
5206   return p + 4;
5207 }
5208
5209 static bfd_byte *
5210 restfpr (bfd *abfd, bfd_byte *p, int r)
5211 {
5212   bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5213   return p + 4;
5214 }
5215
5216 static bfd_byte *
5217 restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
5218 {
5219   bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
5220   p = p + 4;
5221   p = restfpr (abfd, p, r);
5222   bfd_put_32 (abfd, MTLR_R0, p);
5223   p = p + 4;
5224   if (r == 29)
5225     {
5226       p = restfpr (abfd, p, 30);
5227       p = restfpr (abfd, p, 31);
5228     }
5229   bfd_put_32 (abfd, BLR, p);
5230   return p + 4;
5231 }
5232
5233 static bfd_byte *
5234 savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
5235 {
5236   p = savefpr (abfd, p, r);
5237   bfd_put_32 (abfd, BLR, p);
5238   return p + 4;
5239 }
5240
5241 static bfd_byte *
5242 restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
5243 {
5244   p = restfpr (abfd, p, r);
5245   bfd_put_32 (abfd, BLR, p);
5246   return p + 4;
5247 }
5248
5249 static bfd_byte *
5250 savevr (bfd *abfd, bfd_byte *p, int r)
5251 {
5252   bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
5253   p = p + 4;
5254   bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
5255   return p + 4;
5256 }
5257
5258 static bfd_byte *
5259 savevr_tail (bfd *abfd, bfd_byte *p, int r)
5260 {
5261   p = savevr (abfd, p, r);
5262   bfd_put_32 (abfd, BLR, p);
5263   return p + 4;
5264 }
5265
5266 static bfd_byte *
5267 restvr (bfd *abfd, bfd_byte *p, int r)
5268 {
5269   bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
5270   p = p + 4;
5271   bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
5272   return p + 4;
5273 }
5274
5275 static bfd_byte *
5276 restvr_tail (bfd *abfd, bfd_byte *p, int r)
5277 {
5278   p = restvr (abfd, p, r);
5279   bfd_put_32 (abfd, BLR, p);
5280   return p + 4;
5281 }
5282
5283 /* Called via elf_link_hash_traverse to transfer dynamic linking
5284    information on function code symbol entries to their corresponding
5285    function descriptor symbol entries.  */
5286
5287 static bfd_boolean
5288 func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5289 {
5290   struct bfd_link_info *info;
5291   struct ppc_link_hash_table *htab;
5292   struct plt_entry *ent;
5293   struct ppc_link_hash_entry *fh;
5294   struct ppc_link_hash_entry *fdh;
5295   bfd_boolean force_local;
5296
5297   fh = (struct ppc_link_hash_entry *) h;
5298   if (fh->elf.root.type == bfd_link_hash_indirect)
5299     return TRUE;
5300
5301   if (fh->elf.root.type == bfd_link_hash_warning)
5302     fh = (struct ppc_link_hash_entry *) fh->elf.root.u.i.link;
5303
5304   info = inf;
5305   htab = ppc_hash_table (info);
5306
5307   /* Resolve undefined references to dot-symbols as the value
5308      in the function descriptor, if we have one in a regular object.
5309      This is to satisfy cases like ".quad .foo".  Calls to functions
5310      in dynamic objects are handled elsewhere.  */
5311   if (fh->elf.root.type == bfd_link_hash_undefweak
5312       && fh->was_undefined
5313       && (fh->oh->elf.root.type == bfd_link_hash_defined
5314           || fh->oh->elf.root.type == bfd_link_hash_defweak)
5315       && get_opd_info (fh->oh->elf.root.u.def.section) != NULL
5316       && opd_entry_value (fh->oh->elf.root.u.def.section,
5317                           fh->oh->elf.root.u.def.value,
5318                           &fh->elf.root.u.def.section,
5319                           &fh->elf.root.u.def.value) != (bfd_vma) -1)
5320     {
5321       fh->elf.root.type = fh->oh->elf.root.type;
5322       fh->elf.elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
5323     }
5324
5325   /* If this is a function code symbol, transfer dynamic linking
5326      information to the function descriptor symbol.  */
5327   if (!fh->is_func)
5328     return TRUE;
5329
5330   for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
5331     if (ent->plt.refcount > 0)
5332       break;
5333   if (ent == NULL
5334       || fh->elf.root.root.string[0] != '.'
5335       || fh->elf.root.root.string[1] == '\0')
5336     return TRUE;
5337
5338   /* Find the corresponding function descriptor symbol.  Create it
5339      as undefined if necessary.  */
5340
5341   fdh = get_fdh (fh, htab);
5342   if (fdh != NULL)
5343     while (fdh->elf.root.type == bfd_link_hash_indirect
5344            || fdh->elf.root.type == bfd_link_hash_warning)
5345       fdh = (struct ppc_link_hash_entry *) fdh->elf.root.u.i.link;
5346
5347   if (fdh == NULL
5348       && info->shared
5349       && (fh->elf.root.type == bfd_link_hash_undefined
5350           || fh->elf.root.type == bfd_link_hash_undefweak))
5351     {
5352       bfd *abfd;
5353       asymbol *newsym;
5354       struct bfd_link_hash_entry *bh;
5355
5356       abfd = fh->elf.root.u.undef.abfd;
5357       newsym = bfd_make_empty_symbol (abfd);
5358       newsym->name = fh->elf.root.root.string + 1;
5359       newsym->section = bfd_und_section_ptr;
5360       newsym->value = 0;
5361       newsym->flags = BSF_OBJECT;
5362       if (fh->elf.root.type == bfd_link_hash_undefweak)
5363         newsym->flags |= BSF_WEAK;
5364
5365       bh = &fdh->elf.root;
5366       if ( !(_bfd_generic_link_add_one_symbol
5367              (info, abfd, newsym->name, newsym->flags,
5368               newsym->section, newsym->value, NULL, FALSE, FALSE, &bh)))
5369         {
5370           return FALSE;
5371         }
5372       fdh = (struct ppc_link_hash_entry *) bh;
5373       fdh->elf.elf_link_hash_flags &= ~ELF_LINK_NON_ELF;
5374       fdh->elf.size = 24;
5375       fdh->elf.type = STT_OBJECT;
5376     }
5377
5378   if (fdh != NULL
5379       && (fdh->elf.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0
5380       && (info->shared
5381           || (fdh->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
5382           || (fdh->elf.elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
5383           || (fdh->elf.root.type == bfd_link_hash_undefweak
5384               && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
5385     {
5386       if (fdh->elf.dynindx == -1)
5387         if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
5388           return FALSE;
5389       fdh->elf.elf_link_hash_flags
5390         |= (fh->elf.elf_link_hash_flags & (ELF_LINK_HASH_REF_REGULAR
5391                                       | ELF_LINK_HASH_REF_DYNAMIC
5392                                       | ELF_LINK_HASH_REF_REGULAR_NONWEAK
5393                                       | ELF_LINK_NON_GOT_REF));
5394       if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
5395         {
5396           struct plt_entry **ep = &fdh->elf.plt.plist;
5397           while (*ep != NULL)
5398             ep = &(*ep)->next;
5399           *ep = fh->elf.plt.plist;
5400           fh->elf.plt.plist = NULL;
5401           fdh->elf.elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
5402         }
5403       fdh->is_func_descriptor = 1;
5404       fdh->oh = fh;
5405       fh->oh = fdh;
5406     }
5407
5408   /* Now that the info is on the function descriptor, clear the
5409      function code sym info.  Any function code syms for which we
5410      don't have a definition in a regular file, we force local.
5411      This prevents a shared library from exporting syms that have
5412      been imported from another library.  Function code syms that
5413      are really in the library we must leave global to prevent the
5414      linker dragging in a definition from a static library.  */
5415   force_local
5416     = (info->shared
5417        && ((fh->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
5418            || fdh == NULL
5419            || (fdh->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
5420            || (fdh->elf.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0));
5421   _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
5422
5423   return TRUE;
5424 }
5425
5426 /* Called near the start of bfd_elf_size_dynamic_sections.  We use
5427    this hook to a) provide some gcc support functions, and b) transfer
5428    dynamic linking information gathered so far on function code symbol
5429    entries, to their corresponding function descriptor symbol entries.  */
5430
5431 static bfd_boolean
5432 ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
5433                             struct bfd_link_info *info)
5434 {
5435   struct ppc_link_hash_table *htab;
5436   unsigned int i;
5437   const struct sfpr_def_parms funcs[] =
5438     {
5439       { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
5440       { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
5441       { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
5442       { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
5443       { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
5444       { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
5445       { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
5446       { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
5447       { "._savef", 14, 31, savefpr, savefpr1_tail },
5448       { "._restf", 14, 31, restfpr, restfpr1_tail },
5449       { "_savevr_", 20, 31, savevr, savevr_tail },
5450       { "_restvr_", 20, 31, restvr, restvr_tail }
5451     };
5452
5453   htab = ppc_hash_table (info);
5454   if (htab->sfpr == NULL)
5455     /* We don't have any relocs.  */
5456     return TRUE;
5457
5458   /* Provide any missing _save* and _rest* functions.  */
5459   htab->sfpr->size = 0;
5460   for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
5461     if (!sfpr_define (info, &funcs[i]))
5462       return FALSE;
5463
5464   elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
5465
5466   if (htab->sfpr->size == 0)
5467     _bfd_strip_section_from_output (info, htab->sfpr);
5468
5469   return TRUE;
5470 }
5471
5472 /* Adjust a symbol defined by a dynamic object and referenced by a
5473    regular object.  The current definition is in some section of the
5474    dynamic object, but we're not including those sections.  We have to
5475    change the definition to something the rest of the link can
5476    understand.  */
5477
5478 static bfd_boolean
5479 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
5480                                  struct elf_link_hash_entry *h)
5481 {
5482   struct ppc_link_hash_table *htab;
5483   asection *s;
5484   unsigned int power_of_two;
5485
5486   htab = ppc_hash_table (info);
5487
5488   /* Deal with function syms.  */
5489   if (h->type == STT_FUNC
5490       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
5491     {
5492       /* Clear procedure linkage table information for any symbol that
5493          won't need a .plt entry.  */
5494       struct plt_entry *ent;
5495       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5496         if (ent->plt.refcount > 0)
5497           break;
5498       if (ent == NULL
5499           || SYMBOL_CALLS_LOCAL (info, h)
5500           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5501               && h->root.type == bfd_link_hash_undefweak))
5502         {
5503           h->plt.plist = NULL;
5504           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
5505         }
5506     }
5507   else
5508     h->plt.plist = NULL;
5509
5510   /* If this is a weak symbol, and there is a real definition, the
5511      processor independent code will have arranged for us to see the
5512      real definition first, and we can just use the same value.  */
5513   if (h->weakdef != NULL)
5514     {
5515       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
5516                   || h->weakdef->root.type == bfd_link_hash_defweak);
5517       h->root.u.def.section = h->weakdef->root.u.def.section;
5518       h->root.u.def.value = h->weakdef->root.u.def.value;
5519       if (ELIMINATE_COPY_RELOCS)
5520         h->elf_link_hash_flags
5521           = ((h->elf_link_hash_flags & ~ELF_LINK_NON_GOT_REF)
5522              | (h->weakdef->elf_link_hash_flags & ELF_LINK_NON_GOT_REF));
5523       return TRUE;
5524     }
5525
5526   /* If we are creating a shared library, we must presume that the
5527      only references to the symbol are via the global offset table.
5528      For such cases we need not do anything here; the relocations will
5529      be handled correctly by relocate_section.  */
5530   if (info->shared)
5531     return TRUE;
5532
5533   /* If there are no references to this symbol that do not use the
5534      GOT, we don't need to generate a copy reloc.  */
5535   if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
5536     return TRUE;
5537
5538   if (ELIMINATE_COPY_RELOCS)
5539     {
5540       struct ppc_link_hash_entry * eh;
5541       struct ppc_dyn_relocs *p;
5542
5543       eh = (struct ppc_link_hash_entry *) h;
5544       for (p = eh->dyn_relocs; p != NULL; p = p->next)
5545         {
5546           s = p->sec->output_section;
5547           if (s != NULL && (s->flags & SEC_READONLY) != 0)
5548             break;
5549         }
5550
5551       /* If we didn't find any dynamic relocs in read-only sections, then
5552          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
5553       if (p == NULL)
5554         {
5555           h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
5556           return TRUE;
5557         }
5558     }
5559
5560   if (h->plt.plist != NULL)
5561     {
5562       /* We should never get here, but unfortunately there are versions
5563          of gcc out there that improperly (for this ABI) put initialized
5564          function pointers, vtable refs and suchlike in read-only
5565          sections.  Allow them to proceed, but warn that this might
5566          break at runtime.  */
5567       (*_bfd_error_handler)
5568         (_("copy reloc against `%s' requires lazy plt linking; "
5569            "avoid setting LD_BIND_NOW=1 or upgrade gcc"),
5570          h->root.root.string);
5571     }
5572
5573   /* This is a reference to a symbol defined by a dynamic object which
5574      is not a function.  */
5575
5576   /* We must allocate the symbol in our .dynbss section, which will
5577      become part of the .bss section of the executable.  There will be
5578      an entry for this symbol in the .dynsym section.  The dynamic
5579      object will contain position independent code, so all references
5580      from the dynamic object to this symbol will go through the global
5581      offset table.  The dynamic linker will use the .dynsym entry to
5582      determine the address it must put in the global offset table, so
5583      both the dynamic object and the regular object will refer to the
5584      same memory location for the variable.  */
5585
5586   /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
5587      to copy the initial value out of the dynamic object and into the
5588      runtime process image.  We need to remember the offset into the
5589      .rela.bss section we are going to use.  */
5590   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5591     {
5592       htab->relbss->size += sizeof (Elf64_External_Rela);
5593       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
5594     }
5595
5596   /* We need to figure out the alignment required for this symbol.  I
5597      have no idea how ELF linkers handle this.  */
5598   power_of_two = bfd_log2 (h->size);
5599   if (power_of_two > 4)
5600     power_of_two = 4;
5601
5602   /* Apply the required alignment.  */
5603   s = htab->dynbss;
5604   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
5605   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
5606     {
5607       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
5608         return FALSE;
5609     }
5610
5611   /* Define the symbol as being at this point in the section.  */
5612   h->root.u.def.section = s;
5613   h->root.u.def.value = s->size;
5614
5615   /* Increment the section size to make room for the symbol.  */
5616   s->size += h->size;
5617
5618   return TRUE;
5619 }
5620
5621 /* If given a function descriptor symbol, hide both the function code
5622    sym and the descriptor.  */
5623 static void
5624 ppc64_elf_hide_symbol (struct bfd_link_info *info,
5625                        struct elf_link_hash_entry *h,
5626                        bfd_boolean force_local)
5627 {
5628   struct ppc_link_hash_entry *eh;
5629   _bfd_elf_link_hash_hide_symbol (info, h, force_local);
5630
5631   eh = (struct ppc_link_hash_entry *) h;
5632   if (eh->is_func_descriptor)
5633     {
5634       struct ppc_link_hash_entry *fh = eh->oh;
5635
5636       if (fh == NULL)
5637         {
5638           const char *p, *q;
5639           struct ppc_link_hash_table *htab;
5640           char save;
5641
5642           /* We aren't supposed to use alloca in BFD because on
5643              systems which do not have alloca the version in libiberty
5644              calls xmalloc, which might cause the program to crash
5645              when it runs out of memory.  This function doesn't have a
5646              return status, so there's no way to gracefully return an
5647              error.  So cheat.  We know that string[-1] can be safely
5648              accessed;  It's either a string in an ELF string table,
5649              or allocated in an objalloc structure.  */
5650
5651           p = eh->elf.root.root.string - 1;
5652           save = *p;
5653           *(char *) p = '.';
5654           htab = ppc_hash_table (info);
5655           fh = (struct ppc_link_hash_entry *)
5656             elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
5657           *(char *) p = save;
5658
5659           /* Unfortunately, if it so happens that the string we were
5660              looking for was allocated immediately before this string,
5661              then we overwrote the string terminator.  That's the only
5662              reason the lookup should fail.  */
5663           if (fh == NULL)
5664             {
5665               q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
5666               while (q >= eh->elf.root.root.string && *q == *p)
5667                 --q, --p;
5668               if (q < eh->elf.root.root.string && *p == '.')
5669                 fh = (struct ppc_link_hash_entry *)
5670                   elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
5671             }
5672           if (fh != NULL)
5673             {
5674               eh->oh = fh;
5675               fh->oh = eh;
5676             }
5677         }
5678       if (fh != NULL)
5679         _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
5680     }
5681 }
5682
5683 static bfd_boolean
5684 get_sym_h (struct elf_link_hash_entry **hp,
5685            Elf_Internal_Sym **symp,
5686            asection **symsecp,
5687            char **tls_maskp,
5688            Elf_Internal_Sym **locsymsp,
5689            unsigned long r_symndx,
5690            bfd *ibfd)
5691 {
5692   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5693
5694   if (r_symndx >= symtab_hdr->sh_info)
5695     {
5696       struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
5697       struct elf_link_hash_entry *h;
5698
5699       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5700       while (h->root.type == bfd_link_hash_indirect
5701              || h->root.type == bfd_link_hash_warning)
5702         h = (struct elf_link_hash_entry *) h->root.u.i.link;
5703
5704       if (hp != NULL)
5705         *hp = h;
5706
5707       if (symp != NULL)
5708         *symp = NULL;
5709
5710       if (symsecp != NULL)
5711         {
5712           asection *symsec = NULL;
5713           if (h->root.type == bfd_link_hash_defined
5714               || h->root.type == bfd_link_hash_defweak)
5715             symsec = h->root.u.def.section;
5716           *symsecp = symsec;
5717         }
5718
5719       if (tls_maskp != NULL)
5720         {
5721           struct ppc_link_hash_entry *eh;
5722
5723           eh = (struct ppc_link_hash_entry *) h;
5724           *tls_maskp = &eh->tls_mask;
5725         }
5726     }
5727   else
5728     {
5729       Elf_Internal_Sym *sym;
5730       Elf_Internal_Sym *locsyms = *locsymsp;
5731
5732       if (locsyms == NULL)
5733         {
5734           locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
5735           if (locsyms == NULL)
5736             locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
5737                                             symtab_hdr->sh_info,
5738                                             0, NULL, NULL, NULL);
5739           if (locsyms == NULL)
5740             return FALSE;
5741           *locsymsp = locsyms;
5742         }
5743       sym = locsyms + r_symndx;
5744
5745       if (hp != NULL)
5746         *hp = NULL;
5747
5748       if (symp != NULL)
5749         *symp = sym;
5750
5751       if (symsecp != NULL)
5752         {
5753           asection *symsec = NULL;
5754           if ((sym->st_shndx != SHN_UNDEF
5755                && sym->st_shndx < SHN_LORESERVE)
5756               || sym->st_shndx > SHN_HIRESERVE)
5757             symsec = bfd_section_from_elf_index (ibfd, sym->st_shndx);
5758           *symsecp = symsec;
5759         }
5760
5761       if (tls_maskp != NULL)
5762         {
5763           struct got_entry **lgot_ents;
5764           char *tls_mask;
5765
5766           tls_mask = NULL;
5767           lgot_ents = elf_local_got_ents (ibfd);
5768           if (lgot_ents != NULL)
5769             {
5770               char *lgot_masks = (char *) (lgot_ents + symtab_hdr->sh_info);
5771               tls_mask = &lgot_masks[r_symndx];
5772             }
5773           *tls_maskp = tls_mask;
5774         }
5775     }
5776   return TRUE;
5777 }
5778
5779 /* Returns TLS_MASKP for the given REL symbol.  Function return is 0 on
5780    error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
5781    type suitable for optimization, and 1 otherwise.  */
5782
5783 static int
5784 get_tls_mask (char **tls_maskp, unsigned long *toc_symndx,
5785               Elf_Internal_Sym **locsymsp,
5786               const Elf_Internal_Rela *rel, bfd *ibfd)
5787 {
5788   unsigned long r_symndx;
5789   int next_r;
5790   struct elf_link_hash_entry *h;
5791   Elf_Internal_Sym *sym;
5792   asection *sec;
5793   bfd_vma off;
5794
5795   r_symndx = ELF64_R_SYM (rel->r_info);
5796   if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
5797     return 0;
5798
5799   if ((*tls_maskp != NULL && **tls_maskp != 0)
5800       || sec == NULL
5801       || ppc64_elf_section_data (sec)->t_symndx == NULL)
5802     return 1;
5803
5804   /* Look inside a TOC section too.  */
5805   if (h != NULL)
5806     {
5807       BFD_ASSERT (h->root.type == bfd_link_hash_defined);
5808       off = h->root.u.def.value;
5809     }
5810   else
5811     off = sym->st_value;
5812   off += rel->r_addend;
5813   BFD_ASSERT (off % 8 == 0);
5814   r_symndx = ppc64_elf_section_data (sec)->t_symndx[off / 8];
5815   next_r = ppc64_elf_section_data (sec)->t_symndx[off / 8 + 1];
5816   if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
5817     return 0;
5818   if (toc_symndx != NULL)
5819     *toc_symndx = r_symndx;
5820   if ((h == NULL
5821        || ((h->root.type == bfd_link_hash_defined
5822             || h->root.type == bfd_link_hash_defweak)
5823            && !(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC)))
5824       && (next_r == -1 || next_r == -2))
5825     return 1 - next_r;
5826   return 1;
5827 }
5828
5829 /* Adjust all global syms defined in opd sections.  In gcc generated
5830    code for the old ABI, these will already have been done.  */
5831
5832 static bfd_boolean
5833 adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
5834 {
5835   struct ppc_link_hash_entry *eh;
5836   asection *sym_sec;
5837   long *opd_adjust;
5838
5839   if (h->root.type == bfd_link_hash_indirect)
5840     return TRUE;
5841
5842   if (h->root.type == bfd_link_hash_warning)
5843     h = (struct elf_link_hash_entry *) h->root.u.i.link;
5844
5845   if (h->root.type != bfd_link_hash_defined
5846       && h->root.type != bfd_link_hash_defweak)
5847     return TRUE;
5848
5849   eh = (struct ppc_link_hash_entry *) h;
5850   if (eh->adjust_done)
5851     return TRUE;
5852
5853   sym_sec = eh->elf.root.u.def.section;
5854   opd_adjust = get_opd_info (sym_sec);
5855   if (opd_adjust != NULL)
5856     {
5857       long adjust = opd_adjust[eh->elf.root.u.def.value / 8];
5858       if (adjust == -1)
5859         {
5860           /* This entry has been deleted.  */
5861           asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
5862           if (dsec == NULL)
5863             {
5864               for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
5865                 if (elf_discarded_section (dsec))
5866                   {
5867                     ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
5868                     break;
5869                   }
5870             }
5871           eh->elf.root.u.def.value = 0;
5872           eh->elf.root.u.def.section = dsec;
5873         }
5874       else
5875         eh->elf.root.u.def.value += adjust;
5876       eh->adjust_done = 1;
5877     }
5878   return TRUE;
5879 }
5880
5881 /* Remove unused Official Procedure Descriptor entries.  Currently we
5882    only remove those associated with functions in discarded link-once
5883    sections, or weakly defined functions that have been overridden.  It
5884    would be possible to remove many more entries for statically linked
5885    applications.  */
5886
5887 bfd_boolean
5888 ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info,
5889                     bfd_boolean non_overlapping)
5890 {
5891   bfd *ibfd;
5892   bfd_boolean some_edited = FALSE;
5893   asection *need_pad = NULL;
5894
5895   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
5896     {
5897       asection *sec;
5898       Elf_Internal_Rela *relstart, *rel, *relend;
5899       Elf_Internal_Shdr *symtab_hdr;
5900       Elf_Internal_Sym *local_syms;
5901       struct elf_link_hash_entry **sym_hashes;
5902       bfd_vma offset;
5903       bfd_size_type amt;
5904       long *opd_adjust;
5905       bfd_boolean need_edit, add_aux_fields;
5906       bfd_size_type cnt_16b = 0;
5907
5908       sec = bfd_get_section_by_name (ibfd, ".opd");
5909       if (sec == NULL)
5910         continue;
5911
5912       amt = sec->size * sizeof (long) / 8;
5913       opd_adjust = get_opd_info (sec);
5914       if (opd_adjust == NULL)
5915         {
5916           /* Must be a ld -r link.  ie. check_relocs hasn't been
5917              called.  */
5918           opd_adjust = bfd_zalloc (obfd, amt);
5919           ppc64_elf_section_data (sec)->opd.adjust = opd_adjust;
5920         }
5921       memset (opd_adjust, 0, amt);
5922
5923       if (sec->output_section == bfd_abs_section_ptr)
5924         continue;
5925
5926       /* Look through the section relocs.  */
5927       if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
5928         continue;
5929
5930       local_syms = NULL;
5931       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5932       sym_hashes = elf_sym_hashes (ibfd);
5933
5934       /* Read the relocations.  */
5935       relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
5936                                             info->keep_memory);
5937       if (relstart == NULL)
5938         return FALSE;
5939
5940       /* First run through the relocs to check they are sane, and to
5941          determine whether we need to edit this opd section.  */
5942       need_edit = FALSE;
5943       need_pad = sec;
5944       offset = 0;
5945       relend = relstart + sec->reloc_count;
5946       for (rel = relstart; rel < relend; )
5947         {
5948           enum elf_ppc64_reloc_type r_type;
5949           unsigned long r_symndx;
5950           asection *sym_sec;
5951           struct elf_link_hash_entry *h;
5952           Elf_Internal_Sym *sym;
5953
5954           /* .opd contains a regular array of 16 or 24 byte entries.  We're
5955              only interested in the reloc pointing to a function entry
5956              point.  */
5957           if (rel->r_offset != offset
5958               || rel + 1 >= relend
5959               || (rel + 1)->r_offset != offset + 8)
5960             {
5961               /* If someone messes with .opd alignment then after a
5962                  "ld -r" we might have padding in the middle of .opd.
5963                  Also, there's nothing to prevent someone putting
5964                  something silly in .opd with the assembler.  No .opd
5965                  optimization for them!  */
5966             broken_opd:
5967               (*_bfd_error_handler)
5968                 (_("%B: .opd is not a regular array of opd entries"), ibfd);
5969               need_edit = FALSE;
5970               break;
5971             }
5972
5973           if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
5974               || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
5975             {
5976               (*_bfd_error_handler)
5977                 (_("%B: unexpected reloc type %u in .opd section"),
5978                  ibfd, r_type);
5979               need_edit = FALSE;
5980               break;
5981             }
5982
5983           r_symndx = ELF64_R_SYM (rel->r_info);
5984           if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
5985                           r_symndx, ibfd))
5986             goto error_ret;
5987
5988           if (sym_sec == NULL || sym_sec->owner == NULL)
5989             {
5990               const char *sym_name;
5991               if (h != NULL)
5992                 sym_name = h->root.root.string;
5993               else
5994                 sym_name = bfd_elf_local_sym_name (ibfd, sym);
5995
5996               (*_bfd_error_handler)
5997                 (_("%B: undefined sym `%s' in .opd section"),
5998                  ibfd, sym_name);
5999               need_edit = FALSE;
6000               break;
6001             }
6002
6003           /* opd entries are always for functions defined in the
6004              current input bfd.  If the symbol isn't defined in the
6005              input bfd, then we won't be using the function in this
6006              bfd;  It must be defined in a linkonce section in another
6007              bfd, or is weak.  It's also possible that we are
6008              discarding the function due to a linker script /DISCARD/,
6009              which we test for via the output_section.  */
6010           if (sym_sec->owner != ibfd
6011               || sym_sec->output_section == bfd_abs_section_ptr)
6012             need_edit = TRUE;
6013
6014           rel += 2;
6015           if (rel == relend
6016               || (rel + 1 == relend && rel->r_offset == offset + 16))
6017             {
6018               if (sec->size == offset + 24)
6019                 {
6020                   need_pad = NULL;
6021                   break;
6022                 }
6023               if (rel == relend && sec->size == offset + 16)
6024                 {
6025                   cnt_16b++;
6026                   break;
6027                 }
6028               goto broken_opd;
6029             }
6030
6031           if (rel->r_offset == offset + 24)
6032             offset += 24;
6033           else if (rel->r_offset != offset + 16)
6034             goto broken_opd;
6035           else if (rel + 1 < relend
6036                    && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
6037                    && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
6038             {
6039               offset += 16;
6040               cnt_16b++;
6041             }
6042           else if (rel + 2 < relend
6043                    && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
6044                    && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
6045             {
6046               offset += 24;
6047               rel += 1;
6048             }
6049           else
6050             goto broken_opd;
6051         }
6052
6053       add_aux_fields = non_overlapping && cnt_16b > 0;
6054
6055       if (need_edit || add_aux_fields)
6056         {
6057           Elf_Internal_Rela *write_rel;
6058           bfd_byte *rptr, *wptr;
6059           bfd_byte *new_contents = NULL;
6060           bfd_boolean skip;
6061           long opd_ent_size;
6062
6063           /* This seems a waste of time as input .opd sections are all
6064              zeros as generated by gcc, but I suppose there's no reason
6065              this will always be so.  We might start putting something in
6066              the third word of .opd entries.  */
6067           if ((sec->flags & SEC_IN_MEMORY) == 0)
6068             {
6069               bfd_byte *loc;
6070               if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6071                 {
6072                   if (loc != NULL)
6073                     free (loc);
6074                 error_ret:
6075                   if (local_syms != NULL
6076                       && symtab_hdr->contents != (unsigned char *) local_syms)
6077                     free (local_syms);
6078                   if (elf_section_data (sec)->relocs != relstart)
6079                     free (relstart);
6080                   return FALSE;
6081                 }
6082               sec->contents = loc;
6083               sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
6084             }
6085
6086           elf_section_data (sec)->relocs = relstart;
6087
6088           wptr = sec->contents;
6089           rptr = sec->contents;
6090           new_contents = sec->contents;
6091
6092           if (add_aux_fields)
6093             {
6094               new_contents = bfd_malloc (sec->size + cnt_16b * 8);
6095               if (new_contents == NULL)
6096                 return FALSE;
6097               need_pad = FALSE;
6098               wptr = new_contents;
6099             }
6100
6101           write_rel = relstart;
6102           skip = FALSE;
6103           offset = 0;
6104           opd_ent_size = 0;
6105           for (rel = relstart; rel < relend; rel++)
6106             {
6107               unsigned long r_symndx;
6108               asection *sym_sec;
6109               struct elf_link_hash_entry *h;
6110               Elf_Internal_Sym *sym;
6111
6112               r_symndx = ELF64_R_SYM (rel->r_info);
6113               if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
6114                               r_symndx, ibfd))
6115                 goto error_ret;
6116
6117               if (rel->r_offset == offset)
6118                 {
6119                   struct ppc_link_hash_entry *fdh = NULL;
6120
6121                   /* See if the .opd entry is full 24 byte or
6122                      16 byte (with fd_aux entry overlapped with next
6123                      fd_func).  */
6124                   opd_ent_size = 24;
6125                   if ((rel + 2 == relend && sec->size == offset + 16)
6126                       || (rel + 3 < relend
6127                           && rel[2].r_offset == offset + 16
6128                           && rel[3].r_offset == offset + 24
6129                           && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
6130                           && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
6131                     opd_ent_size = 16;
6132
6133                   if (h != NULL
6134                       && h->root.root.string[0] == '.')
6135                     fdh = get_fdh ((struct ppc_link_hash_entry *) h,
6136                                    ppc_hash_table (info));
6137
6138                   skip = (sym_sec->owner != ibfd
6139                           || sym_sec->output_section == bfd_abs_section_ptr);
6140                   if (skip)
6141                     {
6142                       if (fdh != NULL && sym_sec->owner == ibfd)
6143                         {
6144                           /* Arrange for the function descriptor sym
6145                              to be dropped.  */
6146                           fdh->elf.root.u.def.value = 0;
6147                           fdh->elf.root.u.def.section = sym_sec;
6148                         }
6149                       opd_adjust[rel->r_offset / 8] = -1;
6150                     }
6151                   else
6152                     {
6153                       /* We'll be keeping this opd entry.  */
6154
6155                       if (fdh != NULL)
6156                         {
6157                           /* Redefine the function descriptor symbol to
6158                              this location in the opd section.  It is
6159                              necessary to update the value here rather
6160                              than using an array of adjustments as we do
6161                              for local symbols, because various places
6162                              in the generic ELF code use the value
6163                              stored in u.def.value.  */
6164                           fdh->elf.root.u.def.value = wptr - new_contents;
6165                           fdh->adjust_done = 1;
6166                         }
6167
6168                       /* Local syms are a bit tricky.  We could
6169                          tweak them as they can be cached, but
6170                          we'd need to look through the local syms
6171                          for the function descriptor sym which we
6172                          don't have at the moment.  So keep an
6173                          array of adjustments.  */
6174                       opd_adjust[rel->r_offset / 8]
6175                         = (wptr - new_contents) - (rptr - sec->contents);
6176
6177                       if (wptr != rptr)
6178                         memcpy (wptr, rptr, opd_ent_size);
6179                       wptr += opd_ent_size;
6180                       if (add_aux_fields && opd_ent_size == 16)
6181                         {
6182                           memset (wptr, '\0', 8);
6183                           wptr += 8;
6184                         }
6185                     }
6186                   rptr += opd_ent_size;
6187                   offset += opd_ent_size;
6188                 }
6189
6190               if (skip)
6191                 {
6192                   BFD_ASSERT (MUST_BE_DYN_RELOC (ELF64_R_TYPE (rel->r_info)));
6193                   if (info->shared)
6194                     {
6195                       /* We won't be needing dynamic relocs here.  */
6196                       struct ppc_dyn_relocs **pp;
6197                       struct ppc_dyn_relocs *p;
6198
6199                       if (h != NULL)
6200                         pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
6201                       else if (sym_sec != NULL)
6202                         pp = ((struct ppc_dyn_relocs **)
6203                               &elf_section_data (sym_sec)->local_dynrel);
6204                       else
6205                         pp = ((struct ppc_dyn_relocs **)
6206                               &elf_section_data (sec)->local_dynrel);
6207                       while ((p = *pp) != NULL)
6208                         {
6209                           if (p->sec == sec)
6210                             {
6211                               p->count -= 1;
6212                               if (p->count == 0)
6213                                 *pp = p->next;
6214                               break;
6215                             }
6216                           pp = &p->next;
6217                         }
6218                     }
6219                 }
6220               else
6221                 {
6222                   /* We need to adjust any reloc offsets to point to the
6223                      new opd entries.  While we're at it, we may as well
6224                      remove redundant relocs.  */
6225                   rel->r_offset += opd_adjust[(offset - opd_ent_size) / 8];
6226                   if (write_rel != rel)
6227                     memcpy (write_rel, rel, sizeof (*rel));
6228                   ++write_rel;
6229                 }
6230             }
6231
6232           sec->size = wptr - new_contents;
6233           sec->reloc_count = write_rel - relstart;
6234           if (add_aux_fields)
6235             {
6236               free (sec->contents);
6237               sec->contents = new_contents;
6238             }
6239
6240           /* Fudge the size too, as this is used later in
6241              elf_bfd_final_link if we are emitting relocs.  */
6242           elf_section_data (sec)->rel_hdr.sh_size
6243             = sec->reloc_count * elf_section_data (sec)->rel_hdr.sh_entsize;
6244           BFD_ASSERT (elf_section_data (sec)->rel_hdr2 == NULL);
6245           some_edited = TRUE;
6246         }
6247       else if (elf_section_data (sec)->relocs != relstart)
6248         free (relstart);
6249
6250       if (local_syms != NULL
6251           && symtab_hdr->contents != (unsigned char *) local_syms)
6252         {
6253           if (!info->keep_memory)
6254             free (local_syms);
6255           else
6256             symtab_hdr->contents = (unsigned char *) local_syms;
6257         }
6258     }
6259
6260   if (some_edited)
6261     elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
6262
6263   /* If we are doing a final link and the last .opd entry is just 16 byte
6264      long, add a 8 byte padding after it.  */
6265   if (need_pad != NULL && !info->relocatable)
6266     {
6267       bfd_byte *p;
6268
6269       if ((need_pad->flags & SEC_IN_MEMORY) == 0)
6270         {
6271           BFD_ASSERT (need_pad->size > 0);
6272
6273           p = bfd_malloc (need_pad->size + 8);
6274           if (p == NULL)
6275             return FALSE;
6276
6277           if (! bfd_get_section_contents (need_pad->owner, need_pad,
6278                                           p, 0, need_pad->size))
6279             return FALSE;
6280
6281           need_pad->contents = p;
6282           need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
6283         }
6284       else
6285         {
6286           p = bfd_realloc (need_pad->contents, need_pad->size + 8);
6287           if (p == NULL)
6288             return FALSE;
6289
6290           need_pad->contents = p;
6291         }
6292
6293       memset (need_pad->contents + need_pad->size, 0, 8);
6294       need_pad->size += 8;
6295     }
6296
6297   return TRUE;
6298 }
6299
6300 /* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
6301
6302 asection *
6303 ppc64_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
6304 {
6305   struct ppc_link_hash_table *htab;
6306
6307   htab = ppc_hash_table (info);
6308   if (htab->tls_get_addr != NULL)
6309     {
6310       struct ppc_link_hash_entry *h = htab->tls_get_addr;
6311
6312       while (h->elf.root.type == bfd_link_hash_indirect
6313              || h->elf.root.type == bfd_link_hash_warning)
6314         h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
6315
6316       htab->tls_get_addr = h;
6317
6318       if (htab->tls_get_addr_fd == NULL
6319           && h->oh != NULL
6320           && h->oh->is_func_descriptor)
6321         htab->tls_get_addr_fd = h->oh;
6322     }
6323
6324   if (htab->tls_get_addr_fd != NULL)
6325     {
6326       struct ppc_link_hash_entry *h = htab->tls_get_addr_fd;
6327
6328       while (h->elf.root.type == bfd_link_hash_indirect
6329              || h->elf.root.type == bfd_link_hash_warning)
6330         h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
6331
6332       htab->tls_get_addr_fd = h;
6333     }
6334
6335   return _bfd_elf_tls_setup (obfd, info);
6336 }
6337
6338 /* Run through all the TLS relocs looking for optimization
6339    opportunities.  The linker has been hacked (see ppc64elf.em) to do
6340    a preliminary section layout so that we know the TLS segment
6341    offsets.  We can't optimize earlier because some optimizations need
6342    to know the tp offset, and we need to optimize before allocating
6343    dynamic relocations.  */
6344
6345 bfd_boolean
6346 ppc64_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
6347 {
6348   bfd *ibfd;
6349   asection *sec;
6350   struct ppc_link_hash_table *htab;
6351
6352   if (info->relocatable || info->shared)
6353     return TRUE;
6354
6355   htab = ppc_hash_table (info);
6356   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6357     {
6358       Elf_Internal_Sym *locsyms = NULL;
6359
6360       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
6361         if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
6362           {
6363             Elf_Internal_Rela *relstart, *rel, *relend;
6364             int expecting_tls_get_addr;
6365
6366             /* Read the relocations.  */
6367             relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
6368                                                   info->keep_memory);
6369             if (relstart == NULL)
6370               return FALSE;
6371
6372             expecting_tls_get_addr = 0;
6373             relend = relstart + sec->reloc_count;
6374             for (rel = relstart; rel < relend; rel++)
6375               {
6376                 enum elf_ppc64_reloc_type r_type;
6377                 unsigned long r_symndx;
6378                 struct elf_link_hash_entry *h;
6379                 Elf_Internal_Sym *sym;
6380                 asection *sym_sec;
6381                 char *tls_mask;
6382                 char tls_set, tls_clear, tls_type = 0;
6383                 bfd_vma value;
6384                 bfd_boolean ok_tprel, is_local;
6385
6386                 r_symndx = ELF64_R_SYM (rel->r_info);
6387                 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
6388                                 r_symndx, ibfd))
6389                   {
6390                   err_free_rel:
6391                     if (elf_section_data (sec)->relocs != relstart)
6392                       free (relstart);
6393                     if (locsyms != NULL
6394                         && (elf_tdata (ibfd)->symtab_hdr.contents
6395                             != (unsigned char *) locsyms))
6396                       free (locsyms);
6397                     return FALSE;
6398                   }
6399
6400                 if (h != NULL)
6401                   {
6402                     if (h->root.type != bfd_link_hash_defined
6403                         && h->root.type != bfd_link_hash_defweak)
6404                       continue;
6405                     value = h->root.u.def.value;
6406                   }
6407                 else
6408                   /* Symbols referenced by TLS relocs must be of type
6409                      STT_TLS.  So no need for .opd local sym adjust.  */
6410                   value = sym->st_value;
6411
6412                 ok_tprel = FALSE;
6413                 is_local = FALSE;
6414                 if (h == NULL
6415                     || !(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC))
6416                   {
6417                     is_local = TRUE;
6418                     value += sym_sec->output_offset;
6419                     value += sym_sec->output_section->vma;
6420                     value -= htab->elf.tls_sec->vma;
6421                     ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
6422                                 < (bfd_vma) 1 << 32);
6423                   }
6424
6425                 r_type = ELF64_R_TYPE (rel->r_info);
6426                 switch (r_type)
6427                   {
6428                   case R_PPC64_GOT_TLSLD16:
6429                   case R_PPC64_GOT_TLSLD16_LO:
6430                   case R_PPC64_GOT_TLSLD16_HI:
6431                   case R_PPC64_GOT_TLSLD16_HA:
6432                     /* These relocs should never be against a symbol
6433                        defined in a shared lib.  Leave them alone if
6434                        that turns out to be the case.  */
6435                     ppc64_tlsld_got (ibfd)->refcount -= 1;
6436                     if (!is_local)
6437                       continue;
6438
6439                     /* LD -> LE */
6440                     tls_set = 0;
6441                     tls_clear = TLS_LD;
6442                     tls_type = TLS_TLS | TLS_LD;
6443                     expecting_tls_get_addr = 1;
6444                     break;
6445
6446                   case R_PPC64_GOT_TLSGD16:
6447                   case R_PPC64_GOT_TLSGD16_LO:
6448                   case R_PPC64_GOT_TLSGD16_HI:
6449                   case R_PPC64_GOT_TLSGD16_HA:
6450                     if (ok_tprel)
6451                       /* GD -> LE */
6452                       tls_set = 0;
6453                     else
6454                       /* GD -> IE */
6455                       tls_set = TLS_TLS | TLS_TPRELGD;
6456                     tls_clear = TLS_GD;
6457                     tls_type = TLS_TLS | TLS_GD;
6458                     expecting_tls_get_addr = 1;
6459                     break;
6460
6461                   case R_PPC64_GOT_TPREL16_DS:
6462                   case R_PPC64_GOT_TPREL16_LO_DS:
6463                   case R_PPC64_GOT_TPREL16_HI:
6464                   case R_PPC64_GOT_TPREL16_HA:
6465                     expecting_tls_get_addr = 0;
6466                     if (ok_tprel)
6467                       {
6468                         /* IE -> LE */
6469                         tls_set = 0;
6470                         tls_clear = TLS_TPREL;
6471                         tls_type = TLS_TLS | TLS_TPREL;
6472                         break;
6473                       }
6474                     else
6475                       continue;
6476
6477                   case R_PPC64_REL14:
6478                   case R_PPC64_REL14_BRTAKEN:
6479                   case R_PPC64_REL14_BRNTAKEN:
6480                   case R_PPC64_REL24:
6481                     if (h != NULL
6482                         && (h == &htab->tls_get_addr->elf
6483                             || h == &htab->tls_get_addr_fd->elf))
6484                       {
6485                         if (!expecting_tls_get_addr
6486                             && rel != relstart
6487                             && ((ELF64_R_TYPE (rel[-1].r_info)
6488                                  == R_PPC64_TOC16)
6489                                 || (ELF64_R_TYPE (rel[-1].r_info)
6490                                     == R_PPC64_TOC16_LO)))
6491                           {
6492                             /* Check for toc tls entries.  */
6493                             char *toc_tls;
6494                             int retval;
6495
6496                             retval = get_tls_mask (&toc_tls, NULL, &locsyms,
6497                                                    rel - 1, ibfd);
6498                             if (retval == 0)
6499                               goto err_free_rel;
6500                             if (toc_tls != NULL)
6501                               expecting_tls_get_addr = retval > 1;
6502                           }
6503
6504                         if (expecting_tls_get_addr)
6505                           {
6506                             struct plt_entry *ent;
6507                             for (ent = h->plt.plist; ent; ent = ent->next)
6508                               if (ent->addend == 0)
6509                                 {
6510                                   if (ent->plt.refcount > 0)
6511                                     ent->plt.refcount -= 1;
6512                                   break;
6513                                 }
6514                           }
6515                       }
6516                     expecting_tls_get_addr = 0;
6517                     continue;
6518
6519                   case R_PPC64_TPREL64:
6520                     expecting_tls_get_addr = 0;
6521                     if (ok_tprel)
6522                       {
6523                         /* IE -> LE */
6524                         tls_set = TLS_EXPLICIT;
6525                         tls_clear = TLS_TPREL;
6526                         break;
6527                       }
6528                     else
6529                       continue;
6530
6531                   case R_PPC64_DTPMOD64:
6532                     expecting_tls_get_addr = 0;
6533                     if (rel + 1 < relend
6534                         && (rel[1].r_info
6535                             == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
6536                         && rel[1].r_offset == rel->r_offset + 8)
6537                       {
6538                         if (ok_tprel)
6539                           /* GD -> LE */
6540                           tls_set = TLS_EXPLICIT | TLS_GD;
6541                         else
6542                           /* GD -> IE */
6543                           tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
6544                         tls_clear = TLS_GD;
6545                       }
6546                     else
6547                       {
6548                         if (!is_local)
6549                           continue;
6550
6551                         /* LD -> LE */
6552                         tls_set = TLS_EXPLICIT;
6553                         tls_clear = TLS_LD;
6554                       }
6555                     break;
6556
6557                   default:
6558                     expecting_tls_get_addr = 0;
6559                     continue;
6560                   }
6561
6562                 if ((tls_set & TLS_EXPLICIT) == 0)
6563                   {
6564                     struct got_entry *ent;
6565
6566                     /* Adjust got entry for this reloc.  */
6567                     if (h != NULL)
6568                       ent = h->got.glist;
6569                     else
6570                       ent = elf_local_got_ents (ibfd)[r_symndx];
6571
6572                     for (; ent != NULL; ent = ent->next)
6573                       if (ent->addend == rel->r_addend
6574                           && ent->owner == ibfd
6575                           && ent->tls_type == tls_type)
6576                         break;
6577                     if (ent == NULL)
6578                       abort ();
6579
6580                     if (tls_set == 0)
6581                       {
6582                         /* We managed to get rid of a got entry.  */
6583                         if (ent->got.refcount > 0)
6584                           ent->got.refcount -= 1;
6585                       }
6586                   }
6587                 else if (h != NULL)
6588                   {
6589                     struct ppc_link_hash_entry * eh;
6590                     struct ppc_dyn_relocs **pp;
6591                     struct ppc_dyn_relocs *p;
6592
6593                     /* Adjust dynamic relocs.  */
6594                     eh = (struct ppc_link_hash_entry *) h;
6595                     for (pp = &eh->dyn_relocs;
6596                          (p = *pp) != NULL;
6597                          pp = &p->next)
6598                       if (p->sec == sec)
6599                         {
6600                           /* If we got rid of a DTPMOD/DTPREL reloc
6601                              pair then we'll lose one or two dyn
6602                              relocs.  */
6603                           if (tls_set == (TLS_EXPLICIT | TLS_GD))
6604                             p->count -= 1;
6605                           p->count -= 1;
6606                           if (p->count == 0)
6607                             *pp = p->next;
6608                           break;
6609                         }
6610                   }
6611
6612                 *tls_mask |= tls_set;
6613                 *tls_mask &= ~tls_clear;
6614               }
6615
6616             if (elf_section_data (sec)->relocs != relstart)
6617               free (relstart);
6618           }
6619
6620       if (locsyms != NULL
6621           && (elf_tdata (ibfd)->symtab_hdr.contents
6622               != (unsigned char *) locsyms))
6623         {
6624           if (!info->keep_memory)
6625             free (locsyms);
6626           else
6627             elf_tdata (ibfd)->symtab_hdr.contents = (unsigned char *) locsyms;
6628         }
6629     }
6630   return TRUE;
6631 }
6632
6633 /* Allocate space in .plt, .got and associated reloc sections for
6634    dynamic relocs.  */
6635
6636 static bfd_boolean
6637 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
6638 {
6639   struct bfd_link_info *info;
6640   struct ppc_link_hash_table *htab;
6641   asection *s;
6642   struct ppc_link_hash_entry *eh;
6643   struct ppc_dyn_relocs *p;
6644   struct got_entry *gent;
6645
6646   if (h->root.type == bfd_link_hash_indirect)
6647     return TRUE;
6648
6649   if (h->root.type == bfd_link_hash_warning)
6650     h = (struct elf_link_hash_entry *) h->root.u.i.link;
6651
6652   info = (struct bfd_link_info *) inf;
6653   htab = ppc_hash_table (info);
6654
6655   if (htab->elf.dynamic_sections_created
6656       && h->dynindx != -1
6657       && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
6658     {
6659       struct plt_entry *pent;
6660       bfd_boolean doneone = FALSE;
6661       for (pent = h->plt.plist; pent != NULL; pent = pent->next)
6662         if (pent->plt.refcount > 0)
6663           {
6664             /* If this is the first .plt entry, make room for the special
6665                first entry.  */
6666             s = htab->plt;
6667             if (s->size == 0)
6668               s->size += PLT_INITIAL_ENTRY_SIZE;
6669
6670             pent->plt.offset = s->size;
6671
6672             /* Make room for this entry.  */
6673             s->size += PLT_ENTRY_SIZE;
6674
6675             /* Make room for the .glink code.  */
6676             s = htab->glink;
6677             if (s->size == 0)
6678               s->size += GLINK_CALL_STUB_SIZE;
6679             /* We need bigger stubs past index 32767.  */
6680             if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
6681               s->size += 4;
6682             s->size += 2*4;
6683
6684             /* We also need to make an entry in the .rela.plt section.  */
6685             s = htab->relplt;
6686             s->size += sizeof (Elf64_External_Rela);
6687             doneone = TRUE;
6688           }
6689         else
6690           pent->plt.offset = (bfd_vma) -1;
6691       if (!doneone)
6692         {
6693           h->plt.plist = NULL;
6694           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
6695         }
6696     }
6697   else
6698     {
6699       h->plt.plist = NULL;
6700       h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
6701     }
6702
6703   eh = (struct ppc_link_hash_entry *) h;
6704   /* Run through the TLS GD got entries first if we're changing them
6705      to TPREL.  */
6706   if ((eh->tls_mask & TLS_TPRELGD) != 0)
6707     for (gent = h->got.glist; gent != NULL; gent = gent->next)
6708       if (gent->got.refcount > 0
6709           && (gent->tls_type & TLS_GD) != 0)
6710         {
6711           /* This was a GD entry that has been converted to TPREL.  If
6712              there happens to be a TPREL entry we can use that one.  */
6713           struct got_entry *ent;
6714           for (ent = h->got.glist; ent != NULL; ent = ent->next)
6715             if (ent->got.refcount > 0
6716                 && (ent->tls_type & TLS_TPREL) != 0
6717                 && ent->addend == gent->addend
6718                 && ent->owner == gent->owner)
6719               {
6720                 gent->got.refcount = 0;
6721                 break;
6722               }
6723
6724           /* If not, then we'll be using our own TPREL entry.  */
6725           if (gent->got.refcount != 0)
6726             gent->tls_type = TLS_TLS | TLS_TPREL;
6727         }
6728
6729   for (gent = h->got.glist; gent != NULL; gent = gent->next)
6730     if (gent->got.refcount > 0)
6731       {
6732         bfd_boolean dyn;
6733
6734         /* Make sure this symbol is output as a dynamic symbol.
6735            Undefined weak syms won't yet be marked as dynamic,
6736            nor will all TLS symbols.  */
6737         if (h->dynindx == -1
6738             && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
6739           {
6740             if (! bfd_elf_link_record_dynamic_symbol (info, h))
6741               return FALSE;
6742           }
6743
6744         if ((gent->tls_type & TLS_LD) != 0
6745             && !(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC))
6746           {
6747             gent->got.offset = ppc64_tlsld_got (gent->owner)->offset;
6748             continue;
6749           }
6750
6751         s = ppc64_elf_tdata (gent->owner)->got;
6752         gent->got.offset = s->size;
6753         s->size
6754           += (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)) ? 16 : 8;
6755         dyn = htab->elf.dynamic_sections_created;
6756         if ((info->shared
6757              || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
6758             && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6759                 || h->root.type != bfd_link_hash_undefweak))
6760           ppc64_elf_tdata (gent->owner)->relgot->size
6761             += (gent->tls_type & eh->tls_mask & TLS_GD
6762                 ? 2 * sizeof (Elf64_External_Rela)
6763                 : sizeof (Elf64_External_Rela));
6764       }
6765     else
6766       gent->got.offset = (bfd_vma) -1;
6767
6768   if (eh->dyn_relocs == NULL)
6769     return TRUE;
6770
6771   /* In the shared -Bsymbolic case, discard space allocated for
6772      dynamic pc-relative relocs against symbols which turn out to be
6773      defined in regular objects.  For the normal shared case, discard
6774      space for relocs that have become local due to symbol visibility
6775      changes.  */
6776
6777   if (info->shared)
6778     {
6779       /* Relocs that use pc_count are those that appear on a call insn,
6780          or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
6781          generated via assembly.  We want calls to protected symbols to
6782          resolve directly to the function rather than going via the plt.
6783          If people want function pointer comparisons to work as expected
6784          then they should avoid writing weird assembly.  */
6785       if (SYMBOL_CALLS_LOCAL (info, h))
6786         {
6787           struct ppc_dyn_relocs **pp;
6788
6789           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
6790             {
6791               p->count -= p->pc_count;
6792               p->pc_count = 0;
6793               if (p->count == 0)
6794                 *pp = p->next;
6795               else
6796                 pp = &p->next;
6797             }
6798         }
6799
6800       /* Also discard relocs on undefined weak syms with non-default
6801          visibility.  */
6802       if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6803           && h->root.type == bfd_link_hash_undefweak)
6804         eh->dyn_relocs = NULL;
6805     }
6806   else if (ELIMINATE_COPY_RELOCS)
6807     {
6808       /* For the non-shared case, discard space for relocs against
6809          symbols which turn out to need copy relocs or are not
6810          dynamic.  */
6811
6812       if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
6813           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
6814           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
6815         {
6816           /* Make sure this symbol is output as a dynamic symbol.
6817              Undefined weak syms won't yet be marked as dynamic.  */
6818           if (h->dynindx == -1
6819               && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
6820             {
6821               if (! bfd_elf_link_record_dynamic_symbol (info, h))
6822                 return FALSE;
6823             }
6824
6825           /* If that succeeded, we know we'll be keeping all the
6826              relocs.  */
6827           if (h->dynindx != -1)
6828             goto keep;
6829         }
6830
6831       eh->dyn_relocs = NULL;
6832
6833     keep: ;
6834     }
6835
6836   /* Finally, allocate space.  */
6837   for (p = eh->dyn_relocs; p != NULL; p = p->next)
6838     {
6839       asection *sreloc = elf_section_data (p->sec)->sreloc;
6840       sreloc->size += p->count * sizeof (Elf64_External_Rela);
6841     }
6842
6843   return TRUE;
6844 }
6845
6846 /* Find any dynamic relocs that apply to read-only sections.  */
6847
6848 static bfd_boolean
6849 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
6850 {
6851   struct ppc_link_hash_entry *eh;
6852   struct ppc_dyn_relocs *p;
6853
6854   if (h->root.type == bfd_link_hash_warning)
6855     h = (struct elf_link_hash_entry *) h->root.u.i.link;
6856
6857   eh = (struct ppc_link_hash_entry *) h;
6858   for (p = eh->dyn_relocs; p != NULL; p = p->next)
6859     {
6860       asection *s = p->sec->output_section;
6861
6862       if (s != NULL && (s->flags & SEC_READONLY) != 0)
6863         {
6864           struct bfd_link_info *info = inf;
6865
6866           info->flags |= DF_TEXTREL;
6867
6868           /* Not an error, just cut short the traversal.  */
6869           return FALSE;
6870         }
6871     }
6872   return TRUE;
6873 }
6874
6875 /* Set the sizes of the dynamic sections.  */
6876
6877 static bfd_boolean
6878 ppc64_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
6879                                  struct bfd_link_info *info)
6880 {
6881   struct ppc_link_hash_table *htab;
6882   bfd *dynobj;
6883   asection *s;
6884   bfd_boolean relocs;
6885   bfd *ibfd;
6886
6887   htab = ppc_hash_table (info);
6888   dynobj = htab->elf.dynobj;
6889   if (dynobj == NULL)
6890     abort ();
6891
6892   if (htab->elf.dynamic_sections_created)
6893     {
6894       /* Set the contents of the .interp section to the interpreter.  */
6895       if (info->executable)
6896         {
6897           s = bfd_get_section_by_name (dynobj, ".interp");
6898           if (s == NULL)
6899             abort ();
6900           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
6901           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
6902         }
6903     }
6904
6905   /* Set up .got offsets for local syms, and space for local dynamic
6906      relocs.  */
6907   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6908     {
6909       struct got_entry **lgot_ents;
6910       struct got_entry **end_lgot_ents;
6911       char *lgot_masks;
6912       bfd_size_type locsymcount;
6913       Elf_Internal_Shdr *symtab_hdr;
6914       asection *srel;
6915
6916       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
6917         continue;
6918
6919       if (ppc64_tlsld_got (ibfd)->refcount > 0)
6920         {
6921           s = ppc64_elf_tdata (ibfd)->got;
6922           ppc64_tlsld_got (ibfd)->offset = s->size;
6923           s->size += 16;
6924           if (info->shared)
6925             {
6926               srel = ppc64_elf_tdata (ibfd)->relgot;
6927               srel->size += sizeof (Elf64_External_Rela);
6928             }
6929         }
6930       else
6931         ppc64_tlsld_got (ibfd)->offset = (bfd_vma) -1;
6932
6933       for (s = ibfd->sections; s != NULL; s = s->next)
6934         {
6935           struct ppc_dyn_relocs *p;
6936
6937           for (p = *((struct ppc_dyn_relocs **)
6938                      &elf_section_data (s)->local_dynrel);
6939                p != NULL;
6940                p = p->next)
6941             {
6942               if (!bfd_is_abs_section (p->sec)
6943                   && bfd_is_abs_section (p->sec->output_section))
6944                 {
6945                   /* Input section has been discarded, either because
6946                      it is a copy of a linkonce section or due to
6947                      linker script /DISCARD/, so we'll be discarding
6948                      the relocs too.  */
6949                 }
6950               else if (p->count != 0)
6951                 {
6952                   srel = elf_section_data (p->sec)->sreloc;
6953                   srel->size += p->count * sizeof (Elf64_External_Rela);
6954                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
6955                     info->flags |= DF_TEXTREL;
6956                 }
6957             }
6958         }
6959
6960       lgot_ents = elf_local_got_ents (ibfd);
6961       if (!lgot_ents)
6962         continue;
6963
6964       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
6965       locsymcount = symtab_hdr->sh_info;
6966       end_lgot_ents = lgot_ents + locsymcount;
6967       lgot_masks = (char *) end_lgot_ents;
6968       s = ppc64_elf_tdata (ibfd)->got;
6969       srel = ppc64_elf_tdata (ibfd)->relgot;
6970       for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
6971         {
6972           struct got_entry *ent;
6973
6974           for (ent = *lgot_ents; ent != NULL; ent = ent->next)
6975             if (ent->got.refcount > 0)
6976               {
6977                 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
6978                   {
6979                     if (ppc64_tlsld_got (ibfd)->offset == (bfd_vma) -1)
6980                       {
6981                         ppc64_tlsld_got (ibfd)->offset = s->size;
6982                         s->size += 16;
6983                         if (info->shared)
6984                           srel->size += sizeof (Elf64_External_Rela);
6985                       }
6986                     ent->got.offset = ppc64_tlsld_got (ibfd)->offset;
6987                   }
6988                 else
6989                   {
6990                     ent->got.offset = s->size;
6991                     if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
6992                       {
6993                         s->size += 16;
6994                         if (info->shared)
6995                           srel->size += 2 * sizeof (Elf64_External_Rela);
6996                       }
6997                     else
6998                       {
6999                         s->size += 8;
7000                         if (info->shared)
7001                           srel->size += sizeof (Elf64_External_Rela);
7002                       }
7003                   }
7004               }
7005             else
7006               ent->got.offset = (bfd_vma) -1;
7007         }
7008     }
7009
7010   /* Allocate global sym .plt and .got entries, and space for global
7011      sym dynamic relocs.  */
7012   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
7013
7014   /* We now have determined the sizes of the various dynamic sections.
7015      Allocate memory for them.  */
7016   relocs = FALSE;
7017   for (s = dynobj->sections; s != NULL; s = s->next)
7018     {
7019       if ((s->flags & SEC_LINKER_CREATED) == 0)
7020         continue;
7021
7022       if (s == htab->brlt || s == htab->relbrlt)
7023         /* These haven't been allocated yet;  don't strip.  */
7024         continue;
7025       else if (s == htab->got
7026                || s == htab->plt
7027                || s == htab->glink)
7028         {
7029           /* Strip this section if we don't need it; see the
7030              comment below.  */
7031         }
7032       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
7033         {
7034           if (s->size == 0)
7035             {
7036               /* If we don't need this section, strip it from the
7037                  output file.  This is mostly to handle .rela.bss and
7038                  .rela.plt.  We must create both sections in
7039                  create_dynamic_sections, because they must be created
7040                  before the linker maps input sections to output
7041                  sections.  The linker does that before
7042                  adjust_dynamic_symbol is called, and it is that
7043                  function which decides whether anything needs to go
7044                  into these sections.  */
7045             }
7046           else
7047             {
7048               if (s != htab->relplt)
7049                 relocs = TRUE;
7050
7051               /* We use the reloc_count field as a counter if we need
7052                  to copy relocs into the output file.  */
7053               s->reloc_count = 0;
7054             }
7055         }
7056       else
7057         {
7058           /* It's not one of our sections, so don't allocate space.  */
7059           continue;
7060         }
7061
7062       if (s->size == 0)
7063         {
7064           _bfd_strip_section_from_output (info, s);
7065           continue;
7066         }
7067
7068       /* .plt is in the bss section.  We don't initialise it.  */
7069       if (s == htab->plt)
7070         continue;
7071
7072       /* Allocate memory for the section contents.  We use bfd_zalloc
7073          here in case unused entries are not reclaimed before the
7074          section's contents are written out.  This should not happen,
7075          but this way if it does we get a R_PPC64_NONE reloc in .rela
7076          sections instead of garbage.
7077          We also rely on the section contents being zero when writing
7078          the GOT.  */
7079       s->contents = bfd_zalloc (dynobj, s->size);
7080       if (s->contents == NULL)
7081         return FALSE;
7082     }
7083
7084   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7085     {
7086       s = ppc64_elf_tdata (ibfd)->got;
7087       if (s != NULL && s != htab->got)
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             }
7097         }
7098       s = ppc64_elf_tdata (ibfd)->relgot;
7099       if (s != NULL)
7100         {
7101           if (s->size == 0)
7102             _bfd_strip_section_from_output (info, s);
7103           else
7104             {
7105               s->contents = bfd_zalloc (ibfd, s->size);
7106               if (s->contents == NULL)
7107                 return FALSE;
7108               relocs = TRUE;
7109               s->reloc_count = 0;
7110             }
7111         }
7112     }
7113
7114   if (htab->elf.dynamic_sections_created)
7115     {
7116       /* Add some entries to the .dynamic section.  We fill in the
7117          values later, in ppc64_elf_finish_dynamic_sections, but we
7118          must add the entries now so that we get the correct size for
7119          the .dynamic section.  The DT_DEBUG entry is filled in by the
7120          dynamic linker and used by the debugger.  */
7121 #define add_dynamic_entry(TAG, VAL) \
7122   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
7123
7124       if (info->executable)
7125         {
7126           if (!add_dynamic_entry (DT_DEBUG, 0))
7127             return FALSE;
7128         }
7129
7130       if (htab->plt != NULL && htab->plt->size != 0)
7131         {
7132           if (!add_dynamic_entry (DT_PLTGOT, 0)
7133               || !add_dynamic_entry (DT_PLTRELSZ, 0)
7134               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
7135               || !add_dynamic_entry (DT_JMPREL, 0)
7136               || !add_dynamic_entry (DT_PPC64_GLINK, 0))
7137             return FALSE;
7138         }
7139
7140       if (NO_OPD_RELOCS)
7141         {
7142           if (!add_dynamic_entry (DT_PPC64_OPD, 0)
7143               || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
7144             return FALSE;
7145         }
7146
7147       if (relocs)
7148         {
7149           if (!add_dynamic_entry (DT_RELA, 0)
7150               || !add_dynamic_entry (DT_RELASZ, 0)
7151               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
7152             return FALSE;
7153
7154           /* If any dynamic relocs apply to a read-only section,
7155              then we need a DT_TEXTREL entry.  */
7156           if ((info->flags & DF_TEXTREL) == 0)
7157             elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
7158
7159           if ((info->flags & DF_TEXTREL) != 0)
7160             {
7161               if (!add_dynamic_entry (DT_TEXTREL, 0))
7162                 return FALSE;
7163             }
7164         }
7165     }
7166 #undef add_dynamic_entry
7167
7168   return TRUE;
7169 }
7170
7171 /* Determine the type of stub needed, if any, for a call.  */
7172
7173 static inline enum ppc_stub_type
7174 ppc_type_of_stub (asection *input_sec,
7175                   const Elf_Internal_Rela *rel,
7176                   struct ppc_link_hash_entry **hash,
7177                   bfd_vma destination)
7178 {
7179   struct ppc_link_hash_entry *h = *hash;
7180   bfd_vma location;
7181   bfd_vma branch_offset;
7182   bfd_vma max_branch_offset;
7183   enum elf_ppc64_reloc_type r_type;
7184
7185   if (h != NULL)
7186     {
7187       if (h->oh != NULL
7188           && h->oh->is_func_descriptor)
7189         h = h->oh;
7190
7191       if (h->elf.dynindx != -1)
7192         {
7193           struct plt_entry *ent;
7194
7195           for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
7196             if (ent->addend == rel->r_addend
7197                 && ent->plt.offset != (bfd_vma) -1)
7198               {
7199                 *hash = h;
7200                 return ppc_stub_plt_call;
7201               }
7202         }
7203
7204       if (!(h->elf.root.type == bfd_link_hash_defined
7205             || h->elf.root.type == bfd_link_hash_defweak)
7206           || h->elf.root.u.def.section->output_section == NULL)
7207         return ppc_stub_none;
7208     }
7209
7210   /* Determine where the call point is.  */
7211   location = (input_sec->output_offset
7212               + input_sec->output_section->vma
7213               + rel->r_offset);
7214
7215   branch_offset = destination - location;
7216   r_type = ELF64_R_TYPE (rel->r_info);
7217
7218   /* Determine if a long branch stub is needed.  */
7219   max_branch_offset = 1 << 25;
7220   if (r_type != R_PPC64_REL24)
7221     max_branch_offset = 1 << 15;
7222
7223   if (branch_offset + max_branch_offset >= 2 * max_branch_offset)
7224     /* We need a stub.  Figure out whether a long_branch or plt_branch
7225        is needed later.  */
7226     return ppc_stub_long_branch;
7227
7228   return ppc_stub_none;
7229 }
7230
7231 /* Build a .plt call stub.  */
7232
7233 static inline bfd_byte *
7234 build_plt_stub (bfd *obfd, bfd_byte *p, int offset)
7235 {
7236 #define PPC_LO(v) ((v) & 0xffff)
7237 #define PPC_HI(v) (((v) >> 16) & 0xffff)
7238 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
7239
7240   bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
7241   bfd_put_32 (obfd, STD_R2_40R1, p),                    p += 4;
7242   bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p),  p += 4;
7243   if (PPC_HA (offset + 8) != PPC_HA (offset))
7244     bfd_put_32 (obfd, ADDIS_R12_R12 | 1, p),            p += 4;
7245   offset += 8;
7246   bfd_put_32 (obfd, LD_R2_0R12 | PPC_LO (offset), p),   p += 4;
7247   if (PPC_HA (offset + 8) != PPC_HA (offset))
7248     bfd_put_32 (obfd, ADDIS_R12_R12 | 1, p),            p += 4;
7249   offset += 8;
7250   bfd_put_32 (obfd, MTCTR_R11, p),                      p += 4;
7251   bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p),  p += 4;
7252   bfd_put_32 (obfd, BCTR, p),                           p += 4;
7253   return p;
7254 }
7255
7256 static bfd_boolean
7257 ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
7258 {
7259   struct ppc_stub_hash_entry *stub_entry;
7260   struct ppc_branch_hash_entry *br_entry;
7261   struct bfd_link_info *info;
7262   struct ppc_link_hash_table *htab;
7263   bfd_byte *loc;
7264   bfd_byte *p;
7265   unsigned int indx;
7266   struct plt_entry *ent;
7267   bfd_vma off;
7268   int size;
7269
7270   /* Massage our args to the form they really have.  */
7271   stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
7272   info = in_arg;
7273
7274   htab = ppc_hash_table (info);
7275
7276   /* Make a note of the offset within the stubs for this entry.  */
7277   stub_entry->stub_offset = stub_entry->stub_sec->size;
7278   loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
7279
7280   htab->stub_count[stub_entry->stub_type - 1] += 1;
7281   switch (stub_entry->stub_type)
7282     {
7283     case ppc_stub_long_branch:
7284     case ppc_stub_long_branch_r2off:
7285       /* Branches are relative.  This is where we are going to.  */
7286       off = (stub_entry->target_value
7287              + stub_entry->target_section->output_offset
7288              + stub_entry->target_section->output_section->vma);
7289
7290       /* And this is where we are coming from.  */
7291       off -= (stub_entry->stub_offset
7292               + stub_entry->stub_sec->output_offset
7293               + stub_entry->stub_sec->output_section->vma);
7294
7295       if (stub_entry->stub_type != ppc_stub_long_branch_r2off)
7296         size = 4;
7297       else
7298         {
7299           bfd_vma r2off;
7300
7301           r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
7302                    - htab->stub_group[stub_entry->id_sec->id].toc_off);
7303           bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
7304           loc += 4;
7305           bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
7306           loc += 4;
7307           bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
7308           loc += 4;
7309           off -= 12;
7310           size = 16;
7311         }
7312       bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
7313
7314       BFD_ASSERT (off + (1 << 25) < (bfd_vma) (1 << 26));
7315       break;
7316
7317     case ppc_stub_plt_branch:
7318     case ppc_stub_plt_branch_r2off:
7319       br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
7320                                          stub_entry->root.string + 9,
7321                                          FALSE, FALSE);
7322       if (br_entry == NULL)
7323         {
7324           (*_bfd_error_handler) (_("can't find branch stub `%s'"),
7325                                  stub_entry->root.string + 9);
7326           htab->stub_error = TRUE;
7327           return FALSE;
7328         }
7329
7330       off = (stub_entry->target_value
7331              + stub_entry->target_section->output_offset
7332              + stub_entry->target_section->output_section->vma);
7333
7334       bfd_put_64 (htab->brlt->owner, off,
7335                   htab->brlt->contents + br_entry->offset);
7336
7337       if (info->shared)
7338         {
7339           /* Create a reloc for the branch lookup table entry.  */
7340           Elf_Internal_Rela rela;
7341           bfd_byte *rl;
7342
7343           rela.r_offset = (br_entry->offset
7344                            + htab->brlt->output_offset
7345                            + htab->brlt->output_section->vma);
7346           rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
7347           rela.r_addend = off;
7348
7349           rl = htab->relbrlt->contents;
7350           rl += htab->relbrlt->reloc_count++ * sizeof (Elf64_External_Rela);
7351           bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
7352         }
7353
7354       off = (br_entry->offset
7355              + htab->brlt->output_offset
7356              + htab->brlt->output_section->vma
7357              - elf_gp (htab->brlt->output_section->owner)
7358              - htab->stub_group[stub_entry->id_sec->id].toc_off);
7359
7360       if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
7361         {
7362           (*_bfd_error_handler)
7363             (_("linkage table error against `%s'"),
7364              stub_entry->root.string);
7365           bfd_set_error (bfd_error_bad_value);
7366           htab->stub_error = TRUE;
7367           return FALSE;
7368         }
7369
7370       indx = off;
7371       if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
7372         {
7373           bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (indx), loc);
7374           loc += 4;
7375           bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (indx), loc);
7376           size = 16;
7377         }
7378       else
7379         {
7380           bfd_vma r2off;
7381
7382           r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
7383                    - htab->stub_group[stub_entry->id_sec->id].toc_off);
7384           bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
7385           loc += 4;
7386           bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (indx), loc);
7387           loc += 4;
7388           bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (indx), loc);
7389           loc += 4;
7390           bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
7391           loc += 4;
7392           bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
7393           size = 28;
7394         }
7395       loc += 4;
7396       bfd_put_32 (htab->stub_bfd, MTCTR_R11, loc);
7397       loc += 4;
7398       bfd_put_32 (htab->stub_bfd, BCTR, loc);
7399       break;
7400
7401     case ppc_stub_plt_call:
7402       /* Do the best we can for shared libraries built without
7403          exporting ".foo" for each "foo".  This can happen when symbol
7404          versioning scripts strip all bar a subset of symbols.  */
7405       if (stub_entry->h->oh != NULL
7406           && stub_entry->h->oh->elf.root.type != bfd_link_hash_defined
7407           && stub_entry->h->oh->elf.root.type != bfd_link_hash_defweak)
7408         {
7409           /* Point the symbol at the stub.  There may be multiple stubs,
7410              we don't really care;  The main thing is to make this sym
7411              defined somewhere.  Maybe defining the symbol in the stub
7412              section is a silly idea.  If we didn't do this, htab->top_id
7413              could disappear.  */
7414           stub_entry->h->oh->elf.root.type = bfd_link_hash_defined;
7415           stub_entry->h->oh->elf.root.u.def.section = stub_entry->stub_sec;
7416           stub_entry->h->oh->elf.root.u.def.value = stub_entry->stub_offset;
7417         }
7418
7419       /* Now build the stub.  */
7420       off = (bfd_vma) -1;
7421       for (ent = stub_entry->h->elf.plt.plist; ent != NULL; ent = ent->next)
7422         if (ent->addend == stub_entry->addend)
7423           {
7424             off = ent->plt.offset;
7425             break;
7426           }
7427       if (off >= (bfd_vma) -2)
7428         abort ();
7429
7430       off &= ~ (bfd_vma) 1;
7431       off += (htab->plt->output_offset
7432               + htab->plt->output_section->vma
7433               - elf_gp (htab->plt->output_section->owner)
7434               - htab->stub_group[stub_entry->id_sec->id].toc_off);
7435
7436       if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
7437         {
7438           (*_bfd_error_handler)
7439             (_("linkage table error against `%s'"),
7440              stub_entry->h->elf.root.root.string);
7441           bfd_set_error (bfd_error_bad_value);
7442           htab->stub_error = TRUE;
7443           return FALSE;
7444         }
7445
7446       p = build_plt_stub (htab->stub_bfd, loc, off);
7447       size = p - loc;
7448       break;
7449
7450     default:
7451       BFD_FAIL ();
7452       return FALSE;
7453     }
7454
7455   stub_entry->stub_sec->size += size;
7456
7457   if (htab->emit_stub_syms
7458       && !(stub_entry->stub_type == ppc_stub_plt_call
7459            && stub_entry->h->oh != NULL
7460            && stub_entry->h->oh->elf.root.type == bfd_link_hash_defined
7461            && stub_entry->h->oh->elf.root.u.def.section == stub_entry->stub_sec
7462            && stub_entry->h->oh->elf.root.u.def.value == stub_entry->stub_offset))
7463     {
7464       struct elf_link_hash_entry *h;
7465       h = elf_link_hash_lookup (&htab->elf, stub_entry->root.string,
7466                                 TRUE, FALSE, FALSE);
7467       if (h == NULL)
7468         return FALSE;
7469       if (h->root.type == bfd_link_hash_new)
7470         {
7471           h->root.type = bfd_link_hash_defined;
7472           h->root.u.def.section = stub_entry->stub_sec;
7473           h->root.u.def.value = stub_entry->stub_offset;
7474           h->elf_link_hash_flags = (ELF_LINK_HASH_REF_REGULAR
7475                                     | ELF_LINK_HASH_DEF_REGULAR
7476                                     | ELF_LINK_HASH_REF_REGULAR_NONWEAK
7477                                     | ELF_LINK_FORCED_LOCAL);
7478         }
7479     }
7480
7481   return TRUE;
7482 }
7483
7484 /* As above, but don't actually build the stub.  Just bump offset so
7485    we know stub section sizes, and select plt_branch stubs where
7486    long_branch stubs won't do.  */
7487
7488 static bfd_boolean
7489 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
7490 {
7491   struct ppc_stub_hash_entry *stub_entry;
7492   struct bfd_link_info *info;
7493   struct ppc_link_hash_table *htab;
7494   bfd_vma off;
7495   int size;
7496
7497   /* Massage our args to the form they really have.  */
7498   stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
7499   info = in_arg;
7500
7501   htab = ppc_hash_table (info);
7502
7503   if (stub_entry->stub_type == ppc_stub_plt_call)
7504     {
7505       struct plt_entry *ent;
7506       off = (bfd_vma) -1;
7507       for (ent = stub_entry->h->elf.plt.plist; ent != NULL; ent = ent->next)
7508         if (ent->addend == stub_entry->addend)
7509           {
7510             off = ent->plt.offset & ~(bfd_vma) 1;
7511             break;
7512           }
7513       if (off >= (bfd_vma) -2)
7514         abort ();
7515       off += (htab->plt->output_offset
7516               + htab->plt->output_section->vma
7517               - elf_gp (htab->plt->output_section->owner)
7518               - htab->stub_group[stub_entry->id_sec->id].toc_off);
7519
7520       size = PLT_CALL_STUB_SIZE;
7521       if (PPC_HA (off + 16) != PPC_HA (off))
7522         size += 4;
7523     }
7524   else
7525     {
7526       /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
7527          variants.  */
7528       off = (stub_entry->target_value
7529              + stub_entry->target_section->output_offset
7530              + stub_entry->target_section->output_section->vma);
7531       off -= (stub_entry->stub_sec->size
7532               + stub_entry->stub_sec->output_offset
7533               + stub_entry->stub_sec->output_section->vma);
7534
7535       /* Reset the stub type from the plt variant in case we now
7536          can reach with a shorter stub.  */
7537       if (stub_entry->stub_type >= ppc_stub_plt_branch)
7538         stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
7539
7540       size = 4;
7541       if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
7542         {
7543           off -= 12;
7544           size = 16;
7545         }
7546
7547       /* If the branch offset if too big, use a ppc_stub_plt_branch.  */
7548       if (off + (1 << 25) >= (bfd_vma) (1 << 26))
7549         {
7550           struct ppc_branch_hash_entry *br_entry;
7551
7552           br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
7553                                              stub_entry->root.string + 9,
7554                                              TRUE, FALSE);
7555           if (br_entry == NULL)
7556             {
7557               (*_bfd_error_handler) (_("can't build branch stub `%s'"),
7558                                      stub_entry->root.string + 9);
7559               htab->stub_error = TRUE;
7560               return FALSE;
7561             }
7562
7563           if (br_entry->iter != htab->stub_iteration)
7564             {
7565               br_entry->iter = htab->stub_iteration;
7566               br_entry->offset = htab->brlt->size;
7567               htab->brlt->size += 8;
7568
7569               if (info->shared)
7570                 htab->relbrlt->size += sizeof (Elf64_External_Rela);
7571             }
7572
7573           stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
7574           size = 16;
7575           if (stub_entry->stub_type != ppc_stub_plt_branch)
7576             size = 28;
7577         }
7578     }
7579
7580   stub_entry->stub_sec->size += size;
7581   return TRUE;
7582 }
7583
7584 /* Set up various things so that we can make a list of input sections
7585    for each output section included in the link.  Returns -1 on error,
7586    0 when no stubs will be needed, and 1 on success.  */
7587
7588 int
7589 ppc64_elf_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
7590 {
7591   bfd *input_bfd;
7592   int top_id, top_index, id;
7593   asection *section;
7594   asection **input_list;
7595   bfd_size_type amt;
7596   struct ppc_link_hash_table *htab = ppc_hash_table (info);
7597
7598   if (htab->brlt == NULL)
7599     return 0;
7600
7601   /* Find the top input section id.  */
7602   for (input_bfd = info->input_bfds, top_id = 3;
7603        input_bfd != NULL;
7604        input_bfd = input_bfd->link_next)
7605     {
7606       for (section = input_bfd->sections;
7607            section != NULL;
7608            section = section->next)
7609         {
7610           if (top_id < section->id)
7611             top_id = section->id;
7612         }
7613     }
7614
7615   htab->top_id = top_id;
7616   amt = sizeof (struct map_stub) * (top_id + 1);
7617   htab->stub_group = bfd_zmalloc (amt);
7618   if (htab->stub_group == NULL)
7619     return -1;
7620
7621   /* Set toc_off for com, und, abs and ind sections.  */
7622   for (id = 0; id < 3; id++)
7623     htab->stub_group[id].toc_off = TOC_BASE_OFF;
7624
7625   elf_gp (output_bfd) = htab->toc_curr = ppc64_elf_toc (output_bfd);
7626
7627   /* We can't use output_bfd->section_count here to find the top output
7628      section index as some sections may have been removed, and
7629      _bfd_strip_section_from_output doesn't renumber the indices.  */
7630   for (section = output_bfd->sections, top_index = 0;
7631        section != NULL;
7632        section = section->next)
7633     {
7634       if (top_index < section->index)
7635         top_index = section->index;
7636     }
7637
7638   htab->top_index = top_index;
7639   amt = sizeof (asection *) * (top_index + 1);
7640   input_list = bfd_zmalloc (amt);
7641   htab->input_list = input_list;
7642   if (input_list == NULL)
7643     return -1;
7644
7645   return 1;
7646 }
7647
7648 /* The linker repeatedly calls this function for each TOC input section
7649    and linker generated GOT section.  Group input bfds such that the toc
7650    within a group is less than 64k in size.  Will break with cute linker
7651    scripts that play games with dot in the output toc section.  */
7652
7653 void
7654 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
7655 {
7656   struct ppc_link_hash_table *htab = ppc_hash_table (info);
7657   bfd_vma addr = isec->output_offset + isec->output_section->vma;
7658   bfd_vma off = addr - htab->toc_curr;
7659
7660   if (off + isec->size > 0x10000)
7661     htab->toc_curr = addr;
7662
7663   elf_gp (isec->owner) = (htab->toc_curr
7664                           - elf_gp (isec->output_section->owner)
7665                           + TOC_BASE_OFF);
7666 }
7667
7668 /* Called after the last call to the above function.  */
7669
7670 void
7671 ppc64_elf_reinit_toc (bfd *output_bfd ATTRIBUTE_UNUSED,
7672                       struct bfd_link_info *info)
7673 {
7674   struct ppc_link_hash_table *htab = ppc_hash_table (info);
7675
7676   /* toc_curr tracks the TOC offset used for code sections below in
7677      ppc64_elf_next_input_section.  Start off at 0x8000.  */
7678   htab->toc_curr = TOC_BASE_OFF;
7679 }
7680
7681 /* No toc references were found in ISEC.  If the code in ISEC makes no
7682    calls, then there's no need to use toc adjusting stubs when branching
7683    into ISEC.  Actually, indirect calls from ISEC are OK as they will
7684    load r2.  */
7685
7686 static int
7687 toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
7688 {
7689   bfd_byte *contents;
7690   bfd_size_type i;
7691   int ret;
7692   int branch_ok;
7693
7694   /* We know none of our code bearing sections will need toc stubs.  */
7695   if ((isec->flags & SEC_LINKER_CREATED) != 0)
7696     return 0;
7697
7698   if (isec->size == 0)
7699     return 0;
7700
7701   /* Hack for linux kernel.  .fixup contains branches, but only back to
7702      the function that hit an exception.  */
7703   branch_ok = strcmp (isec->name, ".fixup") == 0;
7704
7705   contents = elf_section_data (isec)->this_hdr.contents;
7706   if (contents == NULL)
7707     {
7708       if (!bfd_malloc_and_get_section (isec->owner, isec, &contents))
7709         {
7710           if (contents != NULL)
7711             free (contents);
7712           return -1;
7713         }
7714       if (info->keep_memory)
7715         elf_section_data (isec)->this_hdr.contents = contents;
7716     }
7717
7718   /* Code scan, because we don't necessarily have relocs on calls to
7719      static functions.  */
7720   ret = 0;
7721   for (i = 0; i < isec->size; i += 4)
7722     {
7723       unsigned long insn = bfd_get_32 (isec->owner, contents + i);
7724       /* Is this a branch?  */
7725       if ((insn & (0x3f << 26)) == (18 << 26)
7726           /* If branch and link, it's a function call.  */
7727           && ((insn & 1) != 0
7728               /* Sibling calls use a plain branch.  I don't know a way
7729                  of deciding whether a branch is really a sibling call.  */
7730               || !branch_ok))
7731         {
7732           ret = 1;
7733           break;
7734         }
7735     }
7736
7737   if (elf_section_data (isec)->this_hdr.contents != contents)
7738     free (contents);
7739   return ret;
7740 }
7741
7742 /* The linker repeatedly calls this function for each input section,
7743    in the order that input sections are linked into output sections.
7744    Build lists of input sections to determine groupings between which
7745    we may insert linker stubs.  */
7746
7747 bfd_boolean
7748 ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
7749 {
7750   struct ppc_link_hash_table *htab = ppc_hash_table (info);
7751   int ret;
7752
7753   if ((isec->output_section->flags & SEC_CODE) != 0
7754       && isec->output_section->index <= htab->top_index)
7755     {
7756       asection **list = htab->input_list + isec->output_section->index;
7757       /* Steal the link_sec pointer for our list.  */
7758 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
7759       /* This happens to make the list in reverse order,
7760          which is what we want.  */
7761       PREV_SEC (isec) = *list;
7762       *list = isec;
7763     }
7764
7765   /* If a code section has a function that uses the TOC then we need
7766      to use the right TOC (obviously).  Also, make sure that .opd gets
7767      the correct TOC value for R_PPC64_TOC relocs that don't have or
7768      can't find their function symbol (shouldn't ever happen now).  */
7769   if (isec->has_gp_reloc || (isec->flags & SEC_CODE) == 0)
7770     {
7771       if (elf_gp (isec->owner) != 0)
7772         htab->toc_curr = elf_gp (isec->owner);
7773     }
7774   else if ((ret = toc_adjusting_stub_needed (info, isec)) < 0)
7775     return FALSE;
7776   else
7777     isec->has_gp_reloc = ret;
7778
7779   /* Functions that don't use the TOC can belong in any TOC group.
7780      Use the last TOC base.  This happens to make _init and _fini
7781      pasting work.  */
7782   htab->stub_group[isec->id].toc_off = htab->toc_curr;
7783   return TRUE;
7784 }
7785
7786 /* See whether we can group stub sections together.  Grouping stub
7787    sections may result in fewer stubs.  More importantly, we need to
7788    put all .init* and .fini* stubs at the beginning of the .init or
7789    .fini output sections respectively, because glibc splits the
7790    _init and _fini functions into multiple parts.  Putting a stub in
7791    the middle of a function is not a good idea.  */
7792
7793 static void
7794 group_sections (struct ppc_link_hash_table *htab,
7795                 bfd_size_type stub_group_size,
7796                 bfd_boolean stubs_always_before_branch)
7797 {
7798   asection **list = htab->input_list + htab->top_index;
7799   do
7800     {
7801       asection *tail = *list;
7802       while (tail != NULL)
7803         {
7804           asection *curr;
7805           asection *prev;
7806           bfd_size_type total;
7807           bfd_boolean big_sec;
7808           bfd_vma curr_toc;
7809
7810           curr = tail;
7811           total = tail->size;
7812           big_sec = total >= stub_group_size;
7813           curr_toc = htab->stub_group[tail->id].toc_off;
7814
7815           while ((prev = PREV_SEC (curr)) != NULL
7816                  && ((total += curr->output_offset - prev->output_offset)
7817                      < stub_group_size)
7818                  && htab->stub_group[prev->id].toc_off == curr_toc)
7819             curr = prev;
7820
7821           /* OK, the size from the start of CURR to the end is less
7822              than stub_group_size and thus can be handled by one stub
7823              section.  (or the tail section is itself larger than
7824              stub_group_size, in which case we may be toast.)  We
7825              should really be keeping track of the total size of stubs
7826              added here, as stubs contribute to the final output
7827              section size.  That's a little tricky, and this way will
7828              only break if stubs added make the total size more than
7829              2^25, ie. for the default stub_group_size, if stubs total
7830              more than 2097152 bytes, or nearly 75000 plt call stubs.  */
7831           do
7832             {
7833               prev = PREV_SEC (tail);
7834               /* Set up this stub group.  */
7835               htab->stub_group[tail->id].link_sec = curr;
7836             }
7837           while (tail != curr && (tail = prev) != NULL);
7838
7839           /* But wait, there's more!  Input sections up to stub_group_size
7840              bytes before the stub section can be handled by it too.
7841              Don't do this if we have a really large section after the
7842              stubs, as adding more stubs increases the chance that
7843              branches may not reach into the stub section.  */
7844           if (!stubs_always_before_branch && !big_sec)
7845             {
7846               total = 0;
7847               while (prev != NULL
7848                      && ((total += tail->output_offset - prev->output_offset)
7849                          < stub_group_size)
7850                      && htab->stub_group[prev->id].toc_off == curr_toc)
7851                 {
7852                   tail = prev;
7853                   prev = PREV_SEC (tail);
7854                   htab->stub_group[tail->id].link_sec = curr;
7855                 }
7856             }
7857           tail = prev;
7858         }
7859     }
7860   while (list-- != htab->input_list);
7861   free (htab->input_list);
7862 #undef PREV_SEC
7863 }
7864
7865 /* Determine and set the size of the stub section for a final link.
7866
7867    The basic idea here is to examine all the relocations looking for
7868    PC-relative calls to a target that is unreachable with a "bl"
7869    instruction.  */
7870
7871 bfd_boolean
7872 ppc64_elf_size_stubs (bfd *output_bfd,
7873                       struct bfd_link_info *info,
7874                       bfd_signed_vma group_size,
7875                       asection *(*add_stub_section) (const char *, asection *),
7876                       void (*layout_sections_again) (void))
7877 {
7878   bfd_size_type stub_group_size;
7879   bfd_boolean stubs_always_before_branch;
7880   struct ppc_link_hash_table *htab = ppc_hash_table (info);
7881
7882   /* Stash our params away.  */
7883   htab->add_stub_section = add_stub_section;
7884   htab->layout_sections_again = layout_sections_again;
7885   stubs_always_before_branch = group_size < 0;
7886   if (group_size < 0)
7887     stub_group_size = -group_size;
7888   else
7889     stub_group_size = group_size;
7890   if (stub_group_size == 1)
7891     {
7892       /* Default values.  */
7893       if (stubs_always_before_branch)
7894         {
7895           stub_group_size = 0x1e00000;
7896           if (htab->has_14bit_branch)
7897             stub_group_size = 0x7800;
7898         }
7899       else
7900         {
7901           stub_group_size = 0x1c00000;
7902           if (htab->has_14bit_branch)
7903             stub_group_size = 0x7000;
7904         }
7905     }
7906
7907   group_sections (htab, stub_group_size, stubs_always_before_branch);
7908
7909   while (1)
7910     {
7911       bfd *input_bfd;
7912       unsigned int bfd_indx;
7913       asection *stub_sec;
7914       bfd_boolean stub_changed;
7915
7916       htab->stub_iteration += 1;
7917       stub_changed = FALSE;
7918
7919       for (input_bfd = info->input_bfds, bfd_indx = 0;
7920            input_bfd != NULL;
7921            input_bfd = input_bfd->link_next, bfd_indx++)
7922         {
7923           Elf_Internal_Shdr *symtab_hdr;
7924           asection *section;
7925           Elf_Internal_Sym *local_syms = NULL;
7926
7927           /* We'll need the symbol table in a second.  */
7928           symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
7929           if (symtab_hdr->sh_info == 0)
7930             continue;
7931
7932           /* Walk over each section attached to the input bfd.  */
7933           for (section = input_bfd->sections;
7934                section != NULL;
7935                section = section->next)
7936             {
7937               Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
7938
7939               /* If there aren't any relocs, then there's nothing more
7940                  to do.  */
7941               if ((section->flags & SEC_RELOC) == 0
7942                   || section->reloc_count == 0)
7943                 continue;
7944
7945               /* If this section is a link-once section that will be
7946                  discarded, then don't create any stubs.  */
7947               if (section->output_section == NULL
7948                   || section->output_section->owner != output_bfd)
7949                 continue;
7950
7951               /* Get the relocs.  */
7952               internal_relocs
7953                 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
7954                                              info->keep_memory);
7955               if (internal_relocs == NULL)
7956                 goto error_ret_free_local;
7957
7958               /* Now examine each relocation.  */
7959               irela = internal_relocs;
7960               irelaend = irela + section->reloc_count;
7961               for (; irela < irelaend; irela++)
7962                 {
7963                   enum elf_ppc64_reloc_type r_type;
7964                   unsigned int r_indx;
7965                   enum ppc_stub_type stub_type;
7966                   struct ppc_stub_hash_entry *stub_entry;
7967                   asection *sym_sec, *code_sec;
7968                   bfd_vma sym_value;
7969                   bfd_vma destination;
7970                   bfd_boolean ok_dest;
7971                   struct ppc_link_hash_entry *hash;
7972                   struct ppc_link_hash_entry *fdh;
7973                   struct elf_link_hash_entry *h;
7974                   Elf_Internal_Sym *sym;
7975                   char *stub_name;
7976                   const asection *id_sec;
7977                   long *opd_adjust;
7978
7979                   r_type = ELF64_R_TYPE (irela->r_info);
7980                   r_indx = ELF64_R_SYM (irela->r_info);
7981
7982                   if (r_type >= R_PPC64_max)
7983                     {
7984                       bfd_set_error (bfd_error_bad_value);
7985                       goto error_ret_free_internal;
7986                     }
7987
7988                   /* Only look for stubs on branch instructions.  */
7989                   if (r_type != R_PPC64_REL24
7990                       && r_type != R_PPC64_REL14
7991                       && r_type != R_PPC64_REL14_BRTAKEN
7992                       && r_type != R_PPC64_REL14_BRNTAKEN)
7993                     continue;
7994
7995                   /* Now determine the call target, its name, value,
7996                      section.  */
7997                   if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7998                                   r_indx, input_bfd))
7999                     goto error_ret_free_internal;
8000                   hash = (struct ppc_link_hash_entry *) h;
8001
8002                   ok_dest = FALSE;
8003                   fdh = NULL;
8004                   if (hash == NULL)
8005                     {
8006                       sym_value = sym->st_value;
8007                       ok_dest = TRUE;
8008                     }
8009                   else
8010                     {
8011                       sym_value = 0;
8012                       /* Recognise an old ABI func code entry sym, and
8013                          use the func descriptor sym instead.  */
8014                       if (hash->elf.root.type == bfd_link_hash_undefweak
8015                           && hash->elf.root.root.string[0] == '.'
8016                           && (fdh = get_fdh (hash, htab)) != NULL)
8017                         {
8018                           if (fdh->elf.root.type == bfd_link_hash_defined
8019                               || fdh->elf.root.type == bfd_link_hash_defweak)
8020                             {
8021                               sym_sec = fdh->elf.root.u.def.section;
8022                               sym_value = fdh->elf.root.u.def.value;
8023                               if (sym_sec->output_section != NULL)
8024                                 ok_dest = TRUE;
8025                             }
8026                           else
8027                             fdh = NULL;
8028                         }
8029                       else if (hash->elf.root.type == bfd_link_hash_defined
8030                                || hash->elf.root.type == bfd_link_hash_defweak)
8031                         {
8032                           sym_value = hash->elf.root.u.def.value;
8033                           if (sym_sec->output_section != NULL)
8034                             ok_dest = TRUE;
8035                         }
8036                       else if (hash->elf.root.type == bfd_link_hash_undefweak)
8037                         ;
8038                       else if (hash->elf.root.type == bfd_link_hash_undefined)
8039                         ;
8040                       else
8041                         {
8042                           bfd_set_error (bfd_error_bad_value);
8043                           goto error_ret_free_internal;
8044                         }
8045                     }
8046
8047                   destination = 0;
8048                   if (ok_dest)
8049                     {
8050                       sym_value += irela->r_addend;
8051                       destination = (sym_value
8052                                      + sym_sec->output_offset
8053                                      + sym_sec->output_section->vma);
8054                     }
8055
8056                   code_sec = sym_sec;
8057                   opd_adjust = get_opd_info (sym_sec);
8058                   if (opd_adjust != NULL)
8059                     {
8060                       bfd_vma dest;
8061
8062                       if (hash == NULL)
8063                         {
8064                           long adjust = opd_adjust[sym_value / 8];
8065                           if (adjust == -1)
8066                             continue;
8067                           sym_value += adjust;
8068                         }
8069                       dest = opd_entry_value (sym_sec, sym_value,
8070                                               &code_sec, &sym_value);
8071                       if (dest != (bfd_vma) -1)
8072                         {
8073                           destination = dest;
8074                           if (fdh != NULL)
8075                             {
8076                               /* Fixup old ABI sym to point at code
8077                                  entry.  */
8078                               hash->elf.root.type = bfd_link_hash_defweak;
8079                               hash->elf.root.u.def.section = code_sec;
8080                               hash->elf.root.u.def.value = sym_value;
8081                             }
8082                         }
8083                     }
8084
8085                   /* Determine what (if any) linker stub is needed.  */
8086                   stub_type = ppc_type_of_stub (section, irela, &hash,
8087                                                 destination);
8088
8089                   if (stub_type != ppc_stub_plt_call)
8090                     {
8091                       /* Check whether we need a TOC adjusting stub.
8092                          Since the linker pastes together pieces from
8093                          different object files when creating the
8094                          _init and _fini functions, it may be that a
8095                          call to what looks like a local sym is in
8096                          fact a call needing a TOC adjustment.  */
8097                       if (code_sec != NULL
8098                           && code_sec->output_section != NULL
8099                           && (htab->stub_group[code_sec->id].toc_off
8100                               != htab->stub_group[section->id].toc_off)
8101                           && code_sec->has_gp_reloc
8102                           && section->has_gp_reloc)
8103                         stub_type = ppc_stub_long_branch_r2off;
8104                     }
8105
8106                   if (stub_type == ppc_stub_none)
8107                     continue;
8108
8109                   /* __tls_get_addr calls might be eliminated.  */
8110                   if (stub_type != ppc_stub_plt_call
8111                       && hash != NULL
8112                       && (hash == htab->tls_get_addr
8113                           || hash == htab->tls_get_addr_fd)
8114                       && section->has_tls_reloc
8115                       && irela != internal_relocs)
8116                     {
8117                       /* Get tls info.  */
8118                       char *tls_mask;
8119
8120                       if (!get_tls_mask (&tls_mask, NULL, &local_syms,
8121                                          irela - 1, input_bfd))
8122                         goto error_ret_free_internal;
8123                       if (*tls_mask != 0)
8124                         continue;
8125                     }
8126
8127                   /* Support for grouping stub sections.  */
8128                   id_sec = htab->stub_group[section->id].link_sec;
8129
8130                   /* Get the name of this stub.  */
8131                   stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
8132                   if (!stub_name)
8133                     goto error_ret_free_internal;
8134
8135                   stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
8136                                                      stub_name, FALSE, FALSE);
8137                   if (stub_entry != NULL)
8138                     {
8139                       /* The proper stub has already been created.  */
8140                       free (stub_name);
8141                       continue;
8142                     }
8143
8144                   stub_entry = ppc_add_stub (stub_name, section, htab);
8145                   if (stub_entry == NULL)
8146                     {
8147                       free (stub_name);
8148                     error_ret_free_internal:
8149                       if (elf_section_data (section)->relocs == NULL)
8150                         free (internal_relocs);
8151                     error_ret_free_local:
8152                       if (local_syms != NULL
8153                           && (symtab_hdr->contents
8154                               != (unsigned char *) local_syms))
8155                         free (local_syms);
8156                       return FALSE;
8157                     }
8158
8159                   stub_entry->stub_type = stub_type;
8160                   stub_entry->target_value = sym_value;
8161                   stub_entry->target_section = code_sec;
8162                   stub_entry->h = hash;
8163                   stub_entry->addend = irela->r_addend;
8164                   stub_changed = TRUE;
8165                 }
8166
8167               /* We're done with the internal relocs, free them.  */
8168               if (elf_section_data (section)->relocs != internal_relocs)
8169                 free (internal_relocs);
8170             }
8171
8172           if (local_syms != NULL
8173               && symtab_hdr->contents != (unsigned char *) local_syms)
8174             {
8175               if (!info->keep_memory)
8176                 free (local_syms);
8177               else
8178                 symtab_hdr->contents = (unsigned char *) local_syms;
8179             }
8180         }
8181
8182       if (!stub_changed)
8183         break;
8184
8185       /* OK, we've added some stubs.  Find out the new size of the
8186          stub sections.  */
8187       for (stub_sec = htab->stub_bfd->sections;
8188            stub_sec != NULL;
8189            stub_sec = stub_sec->next)
8190         if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
8191           stub_sec->size = 0;
8192
8193       htab->brlt->size = 0;
8194       if (info->shared)
8195         htab->relbrlt->size = 0;
8196
8197       bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
8198
8199       /* Ask the linker to do its stuff.  */
8200       (*htab->layout_sections_again) ();
8201     }
8202
8203   /* It would be nice to strip .branch_lt from the output if the
8204      section is empty, but it's too late.  If we strip sections here,
8205      the dynamic symbol table is corrupted since the section symbol
8206      for the stripped section isn't written.  */
8207
8208   return TRUE;
8209 }
8210
8211 /* Called after we have determined section placement.  If sections
8212    move, we'll be called again.  Provide a value for TOCstart.  */
8213
8214 bfd_vma
8215 ppc64_elf_toc (bfd *obfd)
8216 {
8217   asection *s;
8218   bfd_vma TOCstart;
8219
8220   /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
8221      order.  The TOC starts where the first of these sections starts.  */
8222   s = bfd_get_section_by_name (obfd, ".got");
8223   if (s == NULL)
8224     s = bfd_get_section_by_name (obfd, ".toc");
8225   if (s == NULL)
8226     s = bfd_get_section_by_name (obfd, ".tocbss");
8227   if (s == NULL)
8228     s = bfd_get_section_by_name (obfd, ".plt");
8229   if (s == NULL)
8230     {
8231       /* This may happen for
8232          o  references to TOC base (SYM@toc / TOC[tc0]) without a
8233          .toc directive
8234          o  bad linker script
8235          o --gc-sections and empty TOC sections
8236
8237          FIXME: Warn user?  */
8238
8239       /* Look for a likely section.  We probably won't even be
8240          using TOCstart.  */
8241       for (s = obfd->sections; s != NULL; s = s->next)
8242         if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY))
8243             == (SEC_ALLOC | SEC_SMALL_DATA))
8244           break;
8245       if (s == NULL)
8246         for (s = obfd->sections; s != NULL; s = s->next)
8247           if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA))
8248               == (SEC_ALLOC | SEC_SMALL_DATA))
8249             break;
8250       if (s == NULL)
8251         for (s = obfd->sections; s != NULL; s = s->next)
8252           if ((s->flags & (SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC)
8253             break;
8254       if (s == NULL)
8255         for (s = obfd->sections; s != NULL; s = s->next)
8256           if ((s->flags & SEC_ALLOC) == SEC_ALLOC)
8257             break;
8258     }
8259
8260   TOCstart = 0;
8261   if (s != NULL)
8262     TOCstart = s->output_section->vma + s->output_offset;
8263
8264   return TOCstart;
8265 }
8266
8267 /* Build all the stubs associated with the current output file.
8268    The stubs are kept in a hash table attached to the main linker
8269    hash table.  This function is called via gldelf64ppc_finish.  */
8270
8271 bfd_boolean
8272 ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
8273                        struct bfd_link_info *info,
8274                        char **stats)
8275 {
8276   struct ppc_link_hash_table *htab = ppc_hash_table (info);
8277   asection *stub_sec;
8278   bfd_byte *p;
8279   int stub_sec_count = 0;
8280
8281   htab->emit_stub_syms = emit_stub_syms;
8282
8283   /* Allocate memory to hold the linker stubs.  */
8284   for (stub_sec = htab->stub_bfd->sections;
8285        stub_sec != NULL;
8286        stub_sec = stub_sec->next)
8287     if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
8288         && stub_sec->size != 0)
8289       {
8290         stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
8291         if (stub_sec->contents == NULL)
8292           return FALSE;
8293         /* We want to check that built size is the same as calculated
8294            size.  rawsize is a convenient location to use.  */
8295         stub_sec->rawsize = stub_sec->size;
8296         stub_sec->size = 0;
8297       }
8298
8299   if (htab->plt != NULL)
8300     {
8301       unsigned int indx;
8302       bfd_vma plt0;
8303
8304       /* Build the .glink plt call stub.  */
8305       plt0 = (htab->plt->output_section->vma
8306               + htab->plt->output_offset
8307               - (htab->glink->output_section->vma
8308                  + htab->glink->output_offset
8309                  + GLINK_CALL_STUB_SIZE));
8310       if (plt0 + 0x80008000 > 0xffffffff)
8311         {
8312           (*_bfd_error_handler) (_(".glink and .plt too far apart"));
8313           bfd_set_error (bfd_error_bad_value);
8314           return FALSE;
8315         }
8316
8317       if (htab->emit_stub_syms)
8318         {
8319           struct elf_link_hash_entry *h;
8320           h = elf_link_hash_lookup (&htab->elf, "__glink", TRUE, FALSE, FALSE);
8321           if (h == NULL)
8322             return FALSE;
8323           if (h->root.type == bfd_link_hash_new)
8324             {
8325               h->root.type = bfd_link_hash_defined;
8326               h->root.u.def.section = htab->glink;
8327               h->root.u.def.value = 0;
8328               h->elf_link_hash_flags = (ELF_LINK_HASH_REF_REGULAR
8329                                         | ELF_LINK_HASH_DEF_REGULAR
8330                                         | ELF_LINK_HASH_REF_REGULAR_NONWEAK
8331                                         | ELF_LINK_FORCED_LOCAL);
8332             }
8333         }
8334       p = htab->glink->contents;
8335       bfd_put_32 (htab->glink->owner, MFCTR_R12, p);
8336       p += 4;
8337       bfd_put_32 (htab->glink->owner, SLDI_R11_R0_3, p);
8338       p += 4;
8339       bfd_put_32 (htab->glink->owner, ADDIC_R2_R0_32K, p);
8340       p += 4;
8341       bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
8342       p += 4;
8343       bfd_put_32 (htab->glink->owner, SRADI_R2_R2_63, p);
8344       p += 4;
8345       bfd_put_32 (htab->glink->owner, SLDI_R11_R0_2, p);
8346       p += 4;
8347       bfd_put_32 (htab->glink->owner, AND_R2_R2_R11, p);
8348       p += 4;
8349       bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
8350       p += 4;
8351       bfd_put_32 (htab->glink->owner, ADD_R12_R12_R2, p);
8352       p += 4;
8353       bfd_put_32 (htab->glink->owner, ADDIS_R12_R12 | PPC_HA (plt0), p);
8354       p += 4;
8355       bfd_put_32 (htab->glink->owner, LD_R11_0R12 | PPC_LO (plt0), p);
8356       p += 4;
8357       bfd_put_32 (htab->glink->owner, ADDI_R12_R12 | PPC_LO (plt0), p);
8358       p += 4;
8359       bfd_put_32 (htab->glink->owner, LD_R2_0R12 | 8, p);
8360       p += 4;
8361       bfd_put_32 (htab->glink->owner, MTCTR_R11, p);
8362       p += 4;
8363       bfd_put_32 (htab->glink->owner, LD_R11_0R12 | 16, p);
8364       p += 4;
8365       bfd_put_32 (htab->glink->owner, BCTR, p);
8366       p += 4;
8367
8368       /* Build the .glink lazy link call stubs.  */
8369       indx = 0;
8370       while (p < htab->glink->contents + htab->glink->size)
8371         {
8372           if (indx < 0x8000)
8373             {
8374               bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
8375               p += 4;
8376             }
8377           else
8378             {
8379               bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
8380               p += 4;
8381               bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
8382               p += 4;
8383             }
8384           bfd_put_32 (htab->glink->owner,
8385                       B_DOT | ((htab->glink->contents - p) & 0x3fffffc), p);
8386           indx++;
8387           p += 4;
8388         }
8389       htab->glink->rawsize = p - htab->glink->contents;
8390     }
8391
8392   if (htab->brlt->size != 0)
8393     {
8394       htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
8395                                          htab->brlt->size);
8396       if (htab->brlt->contents == NULL)
8397         return FALSE;
8398     }
8399   if (info->shared && htab->relbrlt->size != 0)
8400     {
8401       htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
8402                                             htab->relbrlt->size);
8403       if (htab->relbrlt->contents == NULL)
8404         return FALSE;
8405     }
8406
8407   /* Build the stubs as directed by the stub hash table.  */
8408   bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
8409
8410   for (stub_sec = htab->stub_bfd->sections;
8411        stub_sec != NULL;
8412        stub_sec = stub_sec->next)
8413     if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
8414       {
8415         stub_sec_count += 1;
8416         if (stub_sec->rawsize != stub_sec->size)
8417           break;
8418       }
8419
8420   if (stub_sec != NULL
8421       || htab->glink->rawsize != htab->glink->size)
8422     {
8423       htab->stub_error = TRUE;
8424       (*_bfd_error_handler) (_("stubs don't match calculated size"));
8425     }
8426
8427   if (htab->stub_error)
8428     return FALSE;
8429
8430   if (stats != NULL)
8431     {
8432       *stats = bfd_malloc (500);
8433       if (*stats == NULL)
8434         return FALSE;
8435
8436       sprintf (*stats, _("linker stubs in %u groups\n"
8437                          "  branch       %lu\n"
8438                          "  toc adjust   %lu\n"
8439                          "  long branch  %lu\n"
8440                          "  long toc adj %lu\n"
8441                          "  plt call     %lu"),
8442                stub_sec_count,
8443                htab->stub_count[ppc_stub_long_branch - 1],
8444                htab->stub_count[ppc_stub_long_branch_r2off - 1],
8445                htab->stub_count[ppc_stub_plt_branch - 1],
8446                htab->stub_count[ppc_stub_plt_branch_r2off - 1],
8447                htab->stub_count[ppc_stub_plt_call - 1]);
8448     }
8449   return TRUE;
8450 }
8451
8452 /* This function undoes the changes made by add_symbol_adjust.  */
8453
8454 static bfd_boolean
8455 undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
8456 {
8457   struct ppc_link_hash_entry *eh;
8458
8459   if (h->root.type == bfd_link_hash_indirect)
8460     return TRUE;
8461
8462   if (h->root.type == bfd_link_hash_warning)
8463     h = (struct elf_link_hash_entry *) h->root.u.i.link;
8464
8465   eh = (struct ppc_link_hash_entry *) h;
8466   if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
8467     return TRUE;
8468
8469   eh->elf.root.type = bfd_link_hash_undefined;
8470   return TRUE;
8471 }
8472
8473 void
8474 ppc64_elf_restore_symbols (struct bfd_link_info *info)
8475 {
8476   struct ppc_link_hash_table *htab = ppc_hash_table (info);
8477   elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
8478 }
8479
8480 /* The RELOCATE_SECTION function is called by the ELF backend linker
8481    to handle the relocations for a section.
8482
8483    The relocs are always passed as Rela structures; if the section
8484    actually uses Rel structures, the r_addend field will always be
8485    zero.
8486
8487    This function is responsible for adjust the section contents as
8488    necessary, and (if using Rela relocs and generating a
8489    relocatable output file) adjusting the reloc addend as
8490    necessary.
8491
8492    This function does not have to worry about setting the reloc
8493    address or the reloc symbol index.
8494
8495    LOCAL_SYMS is a pointer to the swapped in local symbols.
8496
8497    LOCAL_SECTIONS is an array giving the section in the input file
8498    corresponding to the st_shndx field of each local symbol.
8499
8500    The global hash table entry for the global symbols can be found
8501    via elf_sym_hashes (input_bfd).
8502
8503    When generating relocatable output, this function must handle
8504    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
8505    going to be the section symbol corresponding to the output
8506    section, which means that the addend must be adjusted
8507    accordingly.  */
8508
8509 static bfd_boolean
8510 ppc64_elf_relocate_section (bfd *output_bfd,
8511                             struct bfd_link_info *info,
8512                             bfd *input_bfd,
8513                             asection *input_section,
8514                             bfd_byte *contents,
8515                             Elf_Internal_Rela *relocs,
8516                             Elf_Internal_Sym *local_syms,
8517                             asection **local_sections)
8518 {
8519   struct ppc_link_hash_table *htab;
8520   Elf_Internal_Shdr *symtab_hdr;
8521   struct elf_link_hash_entry **sym_hashes;
8522   Elf_Internal_Rela *rel;
8523   Elf_Internal_Rela *relend;
8524   Elf_Internal_Rela outrel;
8525   bfd_byte *loc;
8526   struct got_entry **local_got_ents;
8527   bfd_vma TOCstart;
8528   bfd_boolean ret = TRUE;
8529   bfd_boolean is_opd;
8530   /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
8531   bfd_boolean is_power4 = FALSE;
8532
8533   if (info->relocatable)
8534     return TRUE;
8535
8536   /* Initialize howto table if needed.  */
8537   if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
8538     ppc_howto_init ();
8539
8540   htab = ppc_hash_table (info);
8541   local_got_ents = elf_local_got_ents (input_bfd);
8542   TOCstart = elf_gp (output_bfd);
8543   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
8544   sym_hashes = elf_sym_hashes (input_bfd);
8545   is_opd = ppc64_elf_section_data (input_section)->opd.adjust != NULL;
8546
8547   rel = relocs;
8548   relend = relocs + input_section->reloc_count;
8549   for (; rel < relend; rel++)
8550     {
8551       enum elf_ppc64_reloc_type r_type;
8552       bfd_vma addend;
8553       bfd_reloc_status_type r;
8554       Elf_Internal_Sym *sym;
8555       asection *sec;
8556       struct elf_link_hash_entry *h_elf;
8557       struct ppc_link_hash_entry *h;
8558       struct ppc_link_hash_entry *fdh;
8559       const char *sym_name;
8560       unsigned long r_symndx, toc_symndx;
8561       char tls_mask, tls_gd, tls_type;
8562       char sym_type;
8563       bfd_vma relocation;
8564       bfd_boolean unresolved_reloc;
8565       bfd_boolean warned;
8566       unsigned long insn, mask;
8567       struct ppc_stub_hash_entry *stub_entry;
8568       bfd_vma max_br_offset;
8569       bfd_vma from;
8570
8571       r_type = ELF64_R_TYPE (rel->r_info);
8572       r_symndx = ELF64_R_SYM (rel->r_info);
8573
8574       /* For old style R_PPC64_TOC relocs with a zero symbol, use the
8575          symbol of the previous ADDR64 reloc.  The symbol gives us the
8576          proper TOC base to use.  */
8577       if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
8578           && rel != relocs
8579           && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
8580           && is_opd)
8581         r_symndx = ELF64_R_SYM (rel[-1].r_info);
8582
8583       sym = NULL;
8584       sec = NULL;
8585       h_elf = NULL;
8586       sym_name = NULL;
8587       unresolved_reloc = FALSE;
8588       warned = FALSE;
8589
8590       if (r_symndx < symtab_hdr->sh_info)
8591         {
8592           /* It's a local symbol.  */
8593           long *opd_adjust;
8594
8595           sym = local_syms + r_symndx;
8596           sec = local_sections[r_symndx];
8597           sym_name = bfd_elf_local_sym_name (input_bfd, sym);
8598           sym_type = ELF64_ST_TYPE (sym->st_info);
8599           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
8600           opd_adjust = get_opd_info (sec);
8601           if (opd_adjust != NULL)
8602             {
8603               long adjust = opd_adjust[(sym->st_value + rel->r_addend) / 8];
8604               if (adjust == -1)
8605                 relocation = 0;
8606               else
8607                 relocation += adjust;
8608             }
8609         }
8610       else
8611         {
8612           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
8613                                    r_symndx, symtab_hdr, sym_hashes,
8614                                    h_elf, sec, relocation,
8615                                    unresolved_reloc, warned);
8616           sym_name = h_elf->root.root.string;
8617           sym_type = h_elf->type;
8618         }
8619       h = (struct ppc_link_hash_entry *) h_elf;
8620
8621       /* TLS optimizations.  Replace instruction sequences and relocs
8622          based on information we collected in tls_optimize.  We edit
8623          RELOCS so that --emit-relocs will output something sensible
8624          for the final instruction stream.  */
8625       tls_mask = 0;
8626       tls_gd = 0;
8627       toc_symndx = 0;
8628       if (IS_PPC64_TLS_RELOC (r_type))
8629         {
8630           if (h != NULL)
8631             tls_mask = h->tls_mask;
8632           else if (local_got_ents != NULL)
8633             {
8634               char *lgot_masks;
8635               lgot_masks = (char *) (local_got_ents + symtab_hdr->sh_info);
8636               tls_mask = lgot_masks[r_symndx];
8637             }
8638           if (tls_mask == 0 && r_type == R_PPC64_TLS)
8639             {
8640               /* Check for toc tls entries.  */
8641               char *toc_tls;
8642
8643               if (!get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
8644                                  rel, input_bfd))
8645                 return FALSE;
8646
8647               if (toc_tls)
8648                 tls_mask = *toc_tls;
8649             }
8650         }
8651
8652       /* Check that tls relocs are used with tls syms, and non-tls
8653          relocs are used with non-tls syms.  */
8654       if (r_symndx != 0
8655           && r_type != R_PPC64_NONE
8656           && (h == NULL
8657               || h->elf.root.type == bfd_link_hash_defined
8658               || h->elf.root.type == bfd_link_hash_defweak)
8659           && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
8660         {
8661           if (r_type == R_PPC64_TLS && tls_mask != 0)
8662             /* R_PPC64_TLS is OK against a symbol in the TOC.  */
8663             ;
8664           else
8665             (*_bfd_error_handler)
8666               (sym_type == STT_TLS
8667                ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
8668                : _("%B(%A+0x%lx): %s used with non-TLS symbol %s"),
8669                input_bfd,
8670                input_section,
8671                (long) rel->r_offset,
8672                ppc64_elf_howto_table[r_type]->name,
8673                sym_name);
8674         }
8675
8676       /* Ensure reloc mapping code below stays sane.  */
8677       if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
8678           || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
8679           || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TLSGD16 & 3)
8680           || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
8681           || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
8682           || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
8683           || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TPREL16_DS & 3)
8684           || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
8685           || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
8686           || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
8687         abort ();
8688
8689       switch (r_type)
8690         {
8691         default:
8692           break;
8693
8694         case R_PPC64_TOC16:
8695         case R_PPC64_TOC16_LO:
8696         case R_PPC64_TOC16_DS:
8697         case R_PPC64_TOC16_LO_DS:
8698           {
8699             /* Check for toc tls entries.  */
8700             char *toc_tls;
8701             int retval;
8702
8703             retval = get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
8704                                    rel, input_bfd);
8705             if (retval == 0)
8706               return FALSE;
8707
8708             if (toc_tls)
8709               {
8710                 tls_mask = *toc_tls;
8711                 if (r_type == R_PPC64_TOC16_DS
8712                     || r_type == R_PPC64_TOC16_LO_DS)
8713                   {
8714                     if (tls_mask != 0
8715                         && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
8716                       goto toctprel;
8717                   }
8718                 else
8719                   {
8720                     /* If we found a GD reloc pair, then we might be
8721                        doing a GD->IE transition.  */
8722                     if (retval == 2)
8723                       {
8724                         tls_gd = TLS_TPRELGD;
8725                         if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
8726                           goto tls_get_addr_check;
8727                       }
8728                     else if (retval == 3)
8729                       {
8730                         if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
8731                           goto tls_get_addr_check;
8732                       }
8733                   }
8734               }
8735           }
8736           break;
8737
8738         case R_PPC64_GOT_TPREL16_DS:
8739         case R_PPC64_GOT_TPREL16_LO_DS:
8740           if (tls_mask != 0
8741               && (tls_mask & TLS_TPREL) == 0)
8742             {
8743             toctprel:
8744               insn = bfd_get_32 (output_bfd, contents + rel->r_offset - 2);
8745               insn &= 31 << 21;
8746               insn |= 0x3c0d0000;       /* addis 0,13,0 */
8747               bfd_put_32 (output_bfd, insn, contents + rel->r_offset - 2);
8748               r_type = R_PPC64_TPREL16_HA;
8749               if (toc_symndx != 0)
8750                 {
8751                   rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
8752                   /* We changed the symbol.  Start over in order to
8753                      get h, sym, sec etc. right.  */
8754                   rel--;
8755                   continue;
8756                 }
8757               else
8758                 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8759             }
8760           break;
8761
8762         case R_PPC64_TLS:
8763           if (tls_mask != 0
8764               && (tls_mask & TLS_TPREL) == 0)
8765             {
8766               bfd_vma rtra;
8767               insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
8768               if ((insn & ((0x3f << 26) | (31 << 11)))
8769                   == ((31 << 26) | (13 << 11)))
8770                 rtra = insn & ((1 << 26) - (1 << 16));
8771               else if ((insn & ((0x3f << 26) | (31 << 16)))
8772                        == ((31 << 26) | (13 << 16)))
8773                 rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
8774               else
8775                 abort ();
8776               if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
8777                 /* add -> addi.  */
8778                 insn = 14 << 26;
8779               else if ((insn & (31 << 1)) == 23 << 1
8780                        && ((insn & (31 << 6)) < 14 << 6
8781                            || ((insn & (31 << 6)) >= 16 << 6
8782                                && (insn & (31 << 6)) < 24 << 6)))
8783                 /* load and store indexed -> dform.  */
8784                 insn = (32 | ((insn >> 6) & 31)) << 26;
8785               else if ((insn & (31 << 1)) == 21 << 1
8786                        && (insn & (0x1a << 6)) == 0)
8787                 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
8788                 insn = (((58 | ((insn >> 6) & 4)) << 26)
8789                         | ((insn >> 6) & 1));
8790               else if ((insn & (31 << 1)) == 21 << 1
8791                        && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
8792                 /* lwax -> lwa.  */
8793                 insn = (58 << 26) | 2;
8794               else
8795                 abort ();
8796               insn |= rtra;
8797               bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
8798               /* Was PPC64_TLS which sits on insn boundary, now
8799                  PPC64_TPREL16_LO which is at insn+2.  */
8800               rel->r_offset += 2;
8801               r_type = R_PPC64_TPREL16_LO;
8802               if (toc_symndx != 0)
8803                 {
8804                   rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
8805                   /* We changed the symbol.  Start over in order to
8806                      get h, sym, sec etc. right.  */
8807                   rel--;
8808                   continue;
8809                 }
8810               else
8811                 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8812             }
8813           break;
8814
8815         case R_PPC64_GOT_TLSGD16_HI:
8816         case R_PPC64_GOT_TLSGD16_HA:
8817           tls_gd = TLS_TPRELGD;
8818           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
8819             goto tls_gdld_hi;
8820           break;
8821
8822         case R_PPC64_GOT_TLSLD16_HI:
8823         case R_PPC64_GOT_TLSLD16_HA:
8824           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
8825             {
8826             tls_gdld_hi:
8827               if ((tls_mask & tls_gd) != 0)
8828                 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
8829                           + R_PPC64_GOT_TPREL16_DS);
8830               else
8831                 {
8832                   bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
8833                   rel->r_offset -= 2;
8834                   r_type = R_PPC64_NONE;
8835                 }
8836               rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8837             }
8838           break;
8839
8840         case R_PPC64_GOT_TLSGD16:
8841         case R_PPC64_GOT_TLSGD16_LO:
8842           tls_gd = TLS_TPRELGD;
8843           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
8844             goto tls_get_addr_check;
8845           break;
8846
8847         case R_PPC64_GOT_TLSLD16:
8848         case R_PPC64_GOT_TLSLD16_LO:
8849           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
8850             {
8851             tls_get_addr_check:
8852               if (rel + 1 < relend)
8853                 {
8854                   enum elf_ppc64_reloc_type r_type2;
8855                   unsigned long r_symndx2;
8856                   struct elf_link_hash_entry *h2;
8857                   bfd_vma insn1, insn2, insn3;
8858                   bfd_vma offset;
8859
8860                   /* The next instruction should be a call to
8861                      __tls_get_addr.  Peek at the reloc to be sure.  */
8862                   r_type2 = ELF64_R_TYPE (rel[1].r_info);
8863                   r_symndx2 = ELF64_R_SYM (rel[1].r_info);
8864                   if (r_symndx2 < symtab_hdr->sh_info
8865                       || (r_type2 != R_PPC64_REL14
8866                           && r_type2 != R_PPC64_REL14_BRTAKEN
8867                           && r_type2 != R_PPC64_REL14_BRNTAKEN
8868                           && r_type2 != R_PPC64_REL24))
8869                     break;
8870
8871                   h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
8872                   while (h2->root.type == bfd_link_hash_indirect
8873                          || h2->root.type == bfd_link_hash_warning)
8874                     h2 = (struct elf_link_hash_entry *) h2->root.u.i.link;
8875                   if (h2 == NULL || (h2 != &htab->tls_get_addr->elf
8876                                      && h2 != &htab->tls_get_addr_fd->elf))
8877                     break;
8878
8879                   /* OK, it checks out.  Replace the call.  */
8880                   offset = rel[1].r_offset;
8881                   insn1 = bfd_get_32 (output_bfd,
8882                                       contents + rel->r_offset - 2);
8883                   insn3 = bfd_get_32 (output_bfd,
8884                                       contents + offset + 4);
8885                   if ((tls_mask & tls_gd) != 0)
8886                     {
8887                       /* IE */
8888                       insn1 &= (1 << 26) - (1 << 2);
8889                       insn1 |= 58 << 26;        /* ld */
8890                       insn2 = 0x7c636a14;       /* add 3,3,13 */
8891                       rel[1].r_info = ELF64_R_INFO (r_symndx2, R_PPC64_NONE);
8892                       if ((tls_mask & TLS_EXPLICIT) == 0)
8893                         r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
8894                                   + R_PPC64_GOT_TPREL16_DS);
8895                       else
8896                         r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
8897                       rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8898                     }
8899                   else
8900                     {
8901                       /* LE */
8902                       insn1 = 0x3c6d0000;       /* addis 3,13,0 */
8903                       insn2 = 0x38630000;       /* addi 3,3,0 */
8904                       if (tls_gd == 0)
8905                         {
8906                           /* Was an LD reloc.  */
8907                           r_symndx = 0;
8908                           rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
8909                           rel[1].r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
8910                         }
8911                       else if (toc_symndx != 0)
8912                         r_symndx = toc_symndx;
8913                       r_type = R_PPC64_TPREL16_HA;
8914                       rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8915                       rel[1].r_info = ELF64_R_INFO (r_symndx,
8916                                                     R_PPC64_TPREL16_LO);
8917                       rel[1].r_offset += 2;
8918                     }
8919                   if (insn3 == NOP
8920                       || insn3 == CROR_151515 || insn3 == CROR_313131)
8921                     {
8922                       insn3 = insn2;
8923                       insn2 = NOP;
8924                       rel[1].r_offset += 4;
8925                     }
8926                   bfd_put_32 (output_bfd, insn1, contents + rel->r_offset - 2);
8927                   bfd_put_32 (output_bfd, insn2, contents + offset);
8928                   bfd_put_32 (output_bfd, insn3, contents + offset + 4);
8929                   if (tls_gd == 0 || toc_symndx != 0)
8930                     {
8931                       /* We changed the symbol.  Start over in order
8932                          to get h, sym, sec etc. right.  */
8933                       rel--;
8934                       continue;
8935                     }
8936                 }
8937             }
8938           break;
8939
8940         case R_PPC64_DTPMOD64:
8941           if (rel + 1 < relend
8942               && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
8943               && rel[1].r_offset == rel->r_offset + 8)
8944             {
8945               if ((tls_mask & TLS_GD) == 0)
8946                 {
8947                   rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
8948                   if ((tls_mask & TLS_TPRELGD) != 0)
8949                     r_type = R_PPC64_TPREL64;
8950                   else
8951                     {
8952                       bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
8953                       r_type = R_PPC64_NONE;
8954                     }
8955                   rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8956                 }
8957             }
8958           else
8959             {
8960               if ((tls_mask & TLS_LD) == 0)
8961                 {
8962                   bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
8963                   r_type = R_PPC64_NONE;
8964                   rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8965                 }
8966             }
8967           break;
8968
8969         case R_PPC64_TPREL64:
8970           if ((tls_mask & TLS_TPREL) == 0)
8971             {
8972               r_type = R_PPC64_NONE;
8973               rel->r_info = ELF64_R_INFO (r_symndx, r_type);
8974             }
8975           break;
8976         }
8977
8978       /* Handle other relocations that tweak non-addend part of insn.  */
8979       insn = 0;
8980       max_br_offset = 1 << 25;
8981       addend = rel->r_addend;
8982       switch (r_type)
8983         {
8984         default:
8985           break;
8986
8987           /* Branch taken prediction relocations.  */
8988         case R_PPC64_ADDR14_BRTAKEN:
8989         case R_PPC64_REL14_BRTAKEN:
8990           insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
8991           /* Fall thru.  */
8992
8993           /* Branch not taken prediction relocations.  */
8994         case R_PPC64_ADDR14_BRNTAKEN:
8995         case R_PPC64_REL14_BRNTAKEN:
8996           insn |= bfd_get_32 (output_bfd,
8997                               contents + rel->r_offset) & ~(0x01 << 21);
8998           /* Fall thru.  */
8999
9000         case R_PPC64_REL14:
9001           max_br_offset = 1 << 15;
9002           /* Fall thru.  */
9003
9004         case R_PPC64_REL24:
9005           /* Calls to functions with a different TOC, such as calls to
9006              shared objects, need to alter the TOC pointer.  This is
9007              done using a linkage stub.  A REL24 branching to these
9008              linkage stubs needs to be followed by a nop, as the nop
9009              will be replaced with an instruction to restore the TOC
9010              base pointer.  */
9011           stub_entry = NULL;
9012           fdh = h;
9013           if (((h != NULL
9014                 && (((fdh = h->oh) != NULL
9015                      && fdh->elf.plt.plist != NULL)
9016                     || (fdh = h)->elf.plt.plist != NULL))
9017                || (sec != NULL
9018                    && sec->output_section != NULL
9019                    && sec->id <= htab->top_id
9020                    && (htab->stub_group[sec->id].toc_off
9021                        != htab->stub_group[input_section->id].toc_off)))
9022               && (stub_entry = ppc_get_stub_entry (input_section, sec, fdh,
9023                                                    rel, htab)) != NULL
9024               && (stub_entry->stub_type == ppc_stub_plt_call
9025                   || stub_entry->stub_type == ppc_stub_plt_branch_r2off
9026                   || stub_entry->stub_type == ppc_stub_long_branch_r2off))
9027             {
9028               bfd_boolean can_plt_call = FALSE;
9029
9030               if (rel->r_offset + 8 <= input_section->size)
9031                 {
9032                   unsigned long nop;
9033                   nop = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
9034                   if (nop == NOP
9035                       || nop == CROR_151515 || nop == CROR_313131)
9036                     {
9037                       bfd_put_32 (input_bfd, LD_R2_40R1,
9038                                   contents + rel->r_offset + 4);
9039                       can_plt_call = TRUE;
9040                     }
9041                 }
9042
9043               if (!can_plt_call)
9044                 {
9045                   if (stub_entry->stub_type == ppc_stub_plt_call)
9046                     {
9047                       /* If this is a plain branch rather than a branch
9048                          and link, don't require a nop.  */
9049                       unsigned long br;
9050                       br = bfd_get_32 (input_bfd, contents + rel->r_offset);
9051                       if ((br & 1) == 0)
9052                         can_plt_call = TRUE;
9053                     }
9054                   else if (h != NULL
9055                            && strcmp (h->elf.root.root.string,
9056                                       ".__libc_start_main") == 0)
9057                     {
9058                       /* Allow crt1 branch to go via a toc adjusting stub.  */
9059                       can_plt_call = TRUE;
9060                     }
9061                   else
9062                     {
9063                       if (strcmp (input_section->output_section->name,
9064                                   ".init") == 0
9065                           || strcmp (input_section->output_section->name,
9066                                      ".fini") == 0)
9067                         (*_bfd_error_handler)
9068                           (_("%B(%A+0x%lx): automatic multiple TOCs "
9069                              "not supported using your crt files; "
9070                              "recompile with -mminimal-toc or upgrade gcc"),
9071                            input_bfd,
9072                            input_section,
9073                            (long) rel->r_offset);
9074                       else
9075                         (*_bfd_error_handler)
9076                           (_("%B(%A+0x%lx): sibling call optimization to `%s' "
9077                              "does not allow automatic multiple TOCs; "
9078                              "recompile with -mminimal-toc or "
9079                              "-fno-optimize-sibling-calls, "
9080                              "or make `%s' extern"),
9081                            input_bfd,
9082                            input_section,
9083                            (long) rel->r_offset,
9084                            sym_name,
9085                            sym_name);
9086                       bfd_set_error (bfd_error_bad_value);
9087                       ret = FALSE;
9088                     }
9089                 }
9090
9091               if (can_plt_call
9092                   && stub_entry->stub_type == ppc_stub_plt_call)
9093                 unresolved_reloc = FALSE;
9094             }
9095
9096           if (stub_entry == NULL
9097               && get_opd_info (sec) != NULL)
9098             {
9099               /* The branch destination is the value of the opd entry. */
9100               bfd_vma off = (relocation - sec->output_section->vma
9101                              - sec->output_offset + rel->r_addend);
9102               bfd_vma dest = opd_entry_value (sec, off, NULL, NULL);
9103               if (dest != (bfd_vma) -1)
9104                 {
9105                   relocation = dest;
9106                   addend = 0;
9107                 }
9108             }
9109
9110           /* If the branch is out of reach we ought to have a long
9111              branch stub.  */
9112           from = (rel->r_offset
9113                   + input_section->output_offset
9114                   + input_section->output_section->vma);
9115
9116           if (stub_entry == NULL
9117               && (relocation + rel->r_addend - from + max_br_offset
9118                   >= 2 * max_br_offset)
9119               && r_type != R_PPC64_ADDR14_BRTAKEN
9120               && r_type != R_PPC64_ADDR14_BRNTAKEN)
9121             stub_entry = ppc_get_stub_entry (input_section, sec, h, rel,
9122                                              htab);
9123
9124           if (stub_entry != NULL)
9125             {
9126               /* Munge up the value and addend so that we call the stub
9127                  rather than the procedure directly.  */
9128               relocation = (stub_entry->stub_offset
9129                             + stub_entry->stub_sec->output_offset
9130                             + stub_entry->stub_sec->output_section->vma);
9131               addend = 0;
9132             }
9133
9134           if (insn != 0)
9135             {
9136               if (is_power4)
9137                 {
9138                   /* Set 'a' bit.  This is 0b00010 in BO field for branch
9139                      on CR(BI) insns (BO == 001at or 011at), and 0b01000
9140                      for branch on CTR insns (BO == 1a00t or 1a01t).  */
9141                   if ((insn & (0x14 << 21)) == (0x04 << 21))
9142                     insn |= 0x02 << 21;
9143                   else if ((insn & (0x14 << 21)) == (0x10 << 21))
9144                     insn |= 0x08 << 21;
9145                   else
9146                     break;
9147                 }
9148               else
9149                 {
9150                   /* Invert 'y' bit if not the default.  */
9151                   if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
9152                     insn ^= 0x01 << 21;
9153                 }
9154
9155               bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
9156             }
9157
9158           /* NOP out calls to undefined weak functions.
9159              We can thus call a weak function without first
9160              checking whether the function is defined.  */
9161           else if (h != NULL
9162                    && h->elf.root.type == bfd_link_hash_undefweak
9163                    && r_type == R_PPC64_REL24
9164                    && relocation == 0
9165                    && rel->r_addend == 0)
9166             {
9167               bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
9168               continue;
9169             }
9170           break;
9171         }
9172
9173       /* Set `addend'.  */
9174       tls_type = 0;
9175       switch (r_type)
9176         {
9177         default:
9178           (*_bfd_error_handler)
9179             (_("%B: unknown relocation type %d for symbol %s"),
9180              input_bfd, (int) r_type, sym_name);
9181
9182           bfd_set_error (bfd_error_bad_value);
9183           ret = FALSE;
9184           continue;
9185
9186         case R_PPC64_NONE:
9187         case R_PPC64_TLS:
9188         case R_PPC64_GNU_VTINHERIT:
9189         case R_PPC64_GNU_VTENTRY:
9190           continue;
9191
9192           /* GOT16 relocations.  Like an ADDR16 using the symbol's
9193              address in the GOT as relocation value instead of the
9194              symbol's value itself.  Also, create a GOT entry for the
9195              symbol and put the symbol value there.  */
9196         case R_PPC64_GOT_TLSGD16:
9197         case R_PPC64_GOT_TLSGD16_LO:
9198         case R_PPC64_GOT_TLSGD16_HI:
9199         case R_PPC64_GOT_TLSGD16_HA:
9200           tls_type = TLS_TLS | TLS_GD;
9201           goto dogot;
9202
9203         case R_PPC64_GOT_TLSLD16:
9204         case R_PPC64_GOT_TLSLD16_LO:
9205         case R_PPC64_GOT_TLSLD16_HI:
9206         case R_PPC64_GOT_TLSLD16_HA:
9207           tls_type = TLS_TLS | TLS_LD;
9208           goto dogot;
9209
9210         case R_PPC64_GOT_TPREL16_DS:
9211         case R_PPC64_GOT_TPREL16_LO_DS:
9212         case R_PPC64_GOT_TPREL16_HI:
9213         case R_PPC64_GOT_TPREL16_HA:
9214           tls_type = TLS_TLS | TLS_TPREL;
9215           goto dogot;
9216
9217         case R_PPC64_GOT_DTPREL16_DS:
9218         case R_PPC64_GOT_DTPREL16_LO_DS:
9219         case R_PPC64_GOT_DTPREL16_HI:
9220         case R_PPC64_GOT_DTPREL16_HA:
9221           tls_type = TLS_TLS | TLS_DTPREL;
9222           goto dogot;
9223
9224         case R_PPC64_GOT16:
9225         case R_PPC64_GOT16_LO:
9226         case R_PPC64_GOT16_HI:
9227         case R_PPC64_GOT16_HA:
9228         case R_PPC64_GOT16_DS:
9229         case R_PPC64_GOT16_LO_DS:
9230         dogot:
9231           {
9232             /* Relocation is to the entry for this symbol in the global
9233                offset table.  */
9234             asection *got;
9235             bfd_vma *offp;
9236             bfd_vma off;
9237             unsigned long indx = 0;
9238
9239             if (tls_type == (TLS_TLS | TLS_LD)
9240                 && (h == NULL
9241                     || (h->elf.elf_link_hash_flags
9242                         & ELF_LINK_HASH_DEF_DYNAMIC) == 0))
9243               offp = &ppc64_tlsld_got (input_bfd)->offset;
9244             else
9245               {
9246                 struct got_entry *ent;
9247
9248                 if (h != NULL)
9249                   {
9250                     bfd_boolean dyn = htab->elf.dynamic_sections_created;
9251                     if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
9252                                                           &h->elf)
9253                         || (info->shared
9254                             && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
9255                       /* This is actually a static link, or it is a
9256                          -Bsymbolic link and the symbol is defined
9257                          locally, or the symbol was forced to be local
9258                          because of a version file.  */
9259                       ;
9260                     else
9261                       {
9262                         indx = h->elf.dynindx;
9263                         unresolved_reloc = FALSE;
9264                       }
9265                     ent = h->elf.got.glist;
9266                   }
9267                 else
9268                   {
9269                     if (local_got_ents == NULL)
9270                       abort ();
9271                     ent = local_got_ents[r_symndx];
9272                   }
9273
9274                 for (; ent != NULL; ent = ent->next)
9275                   if (ent->addend == rel->r_addend
9276                       && ent->owner == input_bfd
9277                       && ent->tls_type == tls_type)
9278                     break;
9279                 if (ent == NULL)
9280                   abort ();
9281                 offp = &ent->got.offset;
9282               }
9283
9284             got = ppc64_elf_tdata (input_bfd)->got;
9285             if (got == NULL)
9286               abort ();
9287
9288             /* The offset must always be a multiple of 8.  We use the
9289                least significant bit to record whether we have already
9290                processed this entry.  */
9291             off = *offp;
9292             if ((off & 1) != 0)
9293               off &= ~1;
9294             else
9295               {
9296                 /* Generate relocs for the dynamic linker, except in
9297                    the case of TLSLD where we'll use one entry per
9298                    module.  */
9299                 asection *relgot = ppc64_elf_tdata (input_bfd)->relgot;
9300
9301                 *offp = off | 1;
9302                 if ((info->shared || indx != 0)
9303                     && (h == NULL
9304                         || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
9305                         || h->elf.root.type != bfd_link_hash_undefweak))
9306                   {
9307                     outrel.r_offset = (got->output_section->vma
9308                                        + got->output_offset
9309                                        + off);
9310                     outrel.r_addend = rel->r_addend;
9311                     if (tls_type & (TLS_LD | TLS_GD))
9312                       {
9313                         outrel.r_addend = 0;
9314                         outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
9315                         if (tls_type == (TLS_TLS | TLS_GD))
9316                           {
9317                             loc = relgot->contents;
9318                             loc += (relgot->reloc_count++
9319                                     * sizeof (Elf64_External_Rela));
9320                             bfd_elf64_swap_reloca_out (output_bfd,
9321                                                        &outrel, loc);
9322                             outrel.r_offset += 8;
9323                             outrel.r_addend = rel->r_addend;
9324                             outrel.r_info
9325                               = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
9326                           }
9327                       }
9328                     else if (tls_type == (TLS_TLS | TLS_DTPREL))
9329                       outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
9330                     else if (tls_type == (TLS_TLS | TLS_TPREL))
9331                       outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
9332                     else if (indx == 0)
9333                       {
9334                         outrel.r_info = ELF64_R_INFO (indx, R_PPC64_RELATIVE);
9335
9336                         /* Write the .got section contents for the sake
9337                            of prelink.  */
9338                         loc = got->contents + off;
9339                         bfd_put_64 (output_bfd, outrel.r_addend + relocation,
9340                                     loc);
9341                       }
9342                     else
9343                       outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
9344
9345                     if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
9346                       {
9347                         outrel.r_addend += relocation;
9348                         if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
9349                           outrel.r_addend -= htab->elf.tls_sec->vma;
9350                       }
9351                     loc = relgot->contents;
9352                     loc += (relgot->reloc_count++
9353                             * sizeof (Elf64_External_Rela));
9354                     bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
9355                   }
9356
9357                 /* Init the .got section contents here if we're not
9358                    emitting a reloc.  */
9359                 else
9360                   {
9361                     relocation += rel->r_addend;
9362                     if (tls_type == (TLS_TLS | TLS_LD))
9363                       relocation = 1;
9364                     else if (tls_type != 0)
9365                       {
9366                         relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
9367                         if (tls_type == (TLS_TLS | TLS_TPREL))
9368                           relocation += DTP_OFFSET - TP_OFFSET;
9369
9370                         if (tls_type == (TLS_TLS | TLS_GD))
9371                           {
9372                             bfd_put_64 (output_bfd, relocation,
9373                                         got->contents + off + 8);
9374                             relocation = 1;
9375                           }
9376                       }
9377
9378                     bfd_put_64 (output_bfd, relocation,
9379                                 got->contents + off);
9380                   }
9381               }
9382
9383             if (off >= (bfd_vma) -2)
9384               abort ();
9385
9386             relocation = got->output_offset + off;
9387
9388             /* TOC base (r2) is TOC start plus 0x8000.  */
9389             addend = -TOC_BASE_OFF;
9390           }
9391           break;
9392
9393         case R_PPC64_PLT16_HA:
9394         case R_PPC64_PLT16_HI:
9395         case R_PPC64_PLT16_LO:
9396         case R_PPC64_PLT32:
9397         case R_PPC64_PLT64:
9398           /* Relocation is to the entry for this symbol in the
9399              procedure linkage table.  */
9400
9401           /* Resolve a PLT reloc against a local symbol directly,
9402              without using the procedure linkage table.  */
9403           if (h == NULL)
9404             break;
9405
9406           /* It's possible that we didn't make a PLT entry for this
9407              symbol.  This happens when statically linking PIC code,
9408              or when using -Bsymbolic.  Go find a match if there is a
9409              PLT entry.  */
9410           if (htab->plt != NULL)
9411             {
9412               struct plt_entry *ent;
9413               for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
9414                 if (ent->addend == rel->r_addend
9415                     && ent->plt.offset != (bfd_vma) -1)
9416                   {
9417                     relocation = (htab->plt->output_section->vma
9418                                   + htab->plt->output_offset
9419                                   + ent->plt.offset);
9420                     unresolved_reloc = FALSE;
9421                   }
9422             }
9423           break;
9424
9425         case R_PPC64_TOC:
9426           /* Relocation value is TOC base.  */
9427           relocation = TOCstart;
9428           if (r_symndx == 0)
9429             relocation += htab->stub_group[input_section->id].toc_off;
9430           else if (unresolved_reloc)
9431             ;
9432           else if (sec != NULL && sec->id <= htab->top_id)
9433             relocation += htab->stub_group[sec->id].toc_off;
9434           else
9435             unresolved_reloc = TRUE;
9436           goto dodyn2;
9437
9438           /* TOC16 relocs.  We want the offset relative to the TOC base,
9439              which is the address of the start of the TOC plus 0x8000.
9440              The TOC consists of sections .got, .toc, .tocbss, and .plt,
9441              in this order.  */
9442         case R_PPC64_TOC16:
9443         case R_PPC64_TOC16_LO:
9444         case R_PPC64_TOC16_HI:
9445         case R_PPC64_TOC16_DS:
9446         case R_PPC64_TOC16_LO_DS:
9447         case R_PPC64_TOC16_HA:
9448           addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
9449           break;
9450
9451           /* Relocate against the beginning of the section.  */
9452         case R_PPC64_SECTOFF:
9453         case R_PPC64_SECTOFF_LO:
9454         case R_PPC64_SECTOFF_HI:
9455         case R_PPC64_SECTOFF_DS:
9456         case R_PPC64_SECTOFF_LO_DS:
9457         case R_PPC64_SECTOFF_HA:
9458           if (sec != NULL)
9459             addend -= sec->output_section->vma;
9460           break;
9461
9462         case R_PPC64_REL14:
9463         case R_PPC64_REL14_BRNTAKEN:
9464         case R_PPC64_REL14_BRTAKEN:
9465         case R_PPC64_REL24:
9466           break;
9467
9468         case R_PPC64_TPREL16:
9469         case R_PPC64_TPREL16_LO:
9470         case R_PPC64_TPREL16_HI:
9471         case R_PPC64_TPREL16_HA:
9472         case R_PPC64_TPREL16_DS:
9473         case R_PPC64_TPREL16_LO_DS:
9474         case R_PPC64_TPREL16_HIGHER:
9475         case R_PPC64_TPREL16_HIGHERA:
9476         case R_PPC64_TPREL16_HIGHEST:
9477         case R_PPC64_TPREL16_HIGHESTA:
9478           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
9479           if (info->shared)
9480             /* The TPREL16 relocs shouldn't really be used in shared
9481                libs as they will result in DT_TEXTREL being set, but
9482                support them anyway.  */
9483             goto dodyn;
9484           break;
9485
9486         case R_PPC64_DTPREL16:
9487         case R_PPC64_DTPREL16_LO:
9488         case R_PPC64_DTPREL16_HI:
9489         case R_PPC64_DTPREL16_HA:
9490         case R_PPC64_DTPREL16_DS:
9491         case R_PPC64_DTPREL16_LO_DS:
9492         case R_PPC64_DTPREL16_HIGHER:
9493         case R_PPC64_DTPREL16_HIGHERA:
9494         case R_PPC64_DTPREL16_HIGHEST:
9495         case R_PPC64_DTPREL16_HIGHESTA:
9496           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
9497           break;
9498
9499         case R_PPC64_DTPMOD64:
9500           relocation = 1;
9501           addend = 0;
9502           goto dodyn;
9503
9504         case R_PPC64_TPREL64:
9505           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
9506           goto dodyn;
9507
9508         case R_PPC64_DTPREL64:
9509           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
9510           /* Fall thru */
9511
9512           /* Relocations that may need to be propagated if this is a
9513              dynamic object.  */
9514         case R_PPC64_REL30:
9515         case R_PPC64_REL32:
9516         case R_PPC64_REL64:
9517         case R_PPC64_ADDR14:
9518         case R_PPC64_ADDR14_BRNTAKEN:
9519         case R_PPC64_ADDR14_BRTAKEN:
9520         case R_PPC64_ADDR16:
9521         case R_PPC64_ADDR16_DS:
9522         case R_PPC64_ADDR16_HA:
9523         case R_PPC64_ADDR16_HI:
9524         case R_PPC64_ADDR16_HIGHER:
9525         case R_PPC64_ADDR16_HIGHERA:
9526         case R_PPC64_ADDR16_HIGHEST:
9527         case R_PPC64_ADDR16_HIGHESTA:
9528         case R_PPC64_ADDR16_LO:
9529         case R_PPC64_ADDR16_LO_DS:
9530         case R_PPC64_ADDR24:
9531         case R_PPC64_ADDR32:
9532         case R_PPC64_ADDR64:
9533         case R_PPC64_UADDR16:
9534         case R_PPC64_UADDR32:
9535         case R_PPC64_UADDR64:
9536           /* r_symndx will be zero only for relocs against symbols
9537              from removed linkonce sections, or sections discarded by
9538              a linker script.  */
9539         dodyn:
9540           if (r_symndx == 0)
9541             break;
9542           /* Fall thru.  */
9543
9544         dodyn2:
9545           if ((input_section->flags & SEC_ALLOC) == 0)
9546             break;
9547
9548           if (NO_OPD_RELOCS && is_opd)
9549             break;
9550
9551           if ((info->shared
9552                && (h == NULL
9553                    || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
9554                    || h->elf.root.type != bfd_link_hash_undefweak)
9555                && (MUST_BE_DYN_RELOC (r_type)
9556                    || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
9557               || (ELIMINATE_COPY_RELOCS
9558                   && !info->shared
9559                   && h != NULL
9560                   && h->elf.dynindx != -1
9561                   && !(h->elf.elf_link_hash_flags & ELF_LINK_NON_GOT_REF)
9562                   && (h->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC)
9563                   && !(h->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
9564             {
9565               Elf_Internal_Rela outrel;
9566               bfd_boolean skip, relocate;
9567               asection *sreloc;
9568               bfd_byte *loc;
9569               bfd_vma out_off;
9570
9571               /* When generating a dynamic object, these relocations
9572                  are copied into the output file to be resolved at run
9573                  time.  */
9574
9575               skip = FALSE;
9576               relocate = FALSE;
9577
9578               out_off = _bfd_elf_section_offset (output_bfd, info,
9579                                                  input_section, rel->r_offset);
9580               if (out_off == (bfd_vma) -1)
9581                 skip = TRUE;
9582               else if (out_off == (bfd_vma) -2)
9583                 skip = TRUE, relocate = TRUE;
9584               out_off += (input_section->output_section->vma
9585                           + input_section->output_offset);
9586               outrel.r_offset = out_off;
9587               outrel.r_addend = rel->r_addend;
9588
9589               /* Optimize unaligned reloc use.  */
9590               if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
9591                   || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
9592                 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
9593               else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
9594                        || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
9595                 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
9596               else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
9597                        || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
9598                 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
9599
9600               if (skip)
9601                 memset (&outrel, 0, sizeof outrel);
9602               else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
9603                        && !is_opd
9604                        && r_type != R_PPC64_TOC)
9605                 outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
9606               else
9607                 {
9608                   /* This symbol is local, or marked to become local,
9609                      or this is an opd section reloc which must point
9610                      at a local function.  */
9611                   outrel.r_addend += relocation;
9612                   if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
9613                     {
9614                       if (is_opd && h != NULL)
9615                         {
9616                           /* Lie about opd entries.  This case occurs
9617                              when building shared libraries and we
9618                              reference a function in another shared
9619                              lib.  The same thing happens for a weak
9620                              definition in an application that's
9621                              overridden by a strong definition in a
9622                              shared lib.  (I believe this is a generic
9623                              bug in binutils handling of weak syms.)
9624                              In these cases we won't use the opd
9625                              entry in this lib.  */
9626                           unresolved_reloc = FALSE;
9627                         }
9628                       outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
9629
9630                       /* We need to relocate .opd contents for ld.so.
9631                          Prelink also wants simple and consistent rules
9632                          for relocs.  This make all RELATIVE relocs have
9633                          *r_offset equal to r_addend.  */
9634                       relocate = TRUE;
9635                     }
9636                   else
9637                     {
9638                       long indx = 0;
9639
9640                       if (bfd_is_abs_section (sec))
9641                         ;
9642                       else if (sec == NULL || sec->owner == NULL)
9643                         {
9644                           bfd_set_error (bfd_error_bad_value);
9645                           return FALSE;
9646                         }
9647                       else
9648                         {
9649                           asection *osec;
9650
9651                           osec = sec->output_section;
9652                           indx = elf_section_data (osec)->dynindx;
9653
9654                           /* We are turning this relocation into one
9655                              against a section symbol, so subtract out
9656                              the output section's address but not the
9657                              offset of the input section in the output
9658                              section.  */
9659                           outrel.r_addend -= osec->vma;
9660                         }
9661
9662                       outrel.r_info = ELF64_R_INFO (indx, r_type);
9663                     }
9664                 }
9665
9666               sreloc = elf_section_data (input_section)->sreloc;
9667               if (sreloc == NULL)
9668                 abort ();
9669
9670               loc = sreloc->contents;
9671               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
9672               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
9673
9674               /* If this reloc is against an external symbol, it will
9675                  be computed at runtime, so there's no need to do
9676                  anything now.  However, for the sake of prelink ensure
9677                  that the section contents are a known value.  */
9678               if (! relocate)
9679                 {
9680                   unresolved_reloc = FALSE;
9681                   /* The value chosen here is quite arbitrary as ld.so
9682                      ignores section contents except for the special
9683                      case of .opd where the contents might be accessed
9684                      before relocation.  Choose zero, as that won't
9685                      cause reloc overflow.  */
9686                   relocation = 0;
9687                   addend = 0;
9688                   /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
9689                      to improve backward compatibility with older
9690                      versions of ld.  */
9691                   if (r_type == R_PPC64_ADDR64)
9692                     addend = outrel.r_addend;
9693                   /* Adjust pc_relative relocs to have zero in *r_offset.  */
9694                   else if (ppc64_elf_howto_table[r_type]->pc_relative)
9695                     addend = (input_section->output_section->vma
9696                               + input_section->output_offset
9697                               + rel->r_offset);
9698                 }
9699             }
9700           break;
9701
9702         case R_PPC64_COPY:
9703         case R_PPC64_GLOB_DAT:
9704         case R_PPC64_JMP_SLOT:
9705         case R_PPC64_RELATIVE:
9706           /* We shouldn't ever see these dynamic relocs in relocatable
9707              files.  */
9708           /* Fall through.  */
9709
9710         case R_PPC64_PLTGOT16:
9711         case R_PPC64_PLTGOT16_DS:
9712         case R_PPC64_PLTGOT16_HA:
9713         case R_PPC64_PLTGOT16_HI:
9714         case R_PPC64_PLTGOT16_LO:
9715         case R_PPC64_PLTGOT16_LO_DS:
9716         case R_PPC64_PLTREL32:
9717         case R_PPC64_PLTREL64:
9718           /* These ones haven't been implemented yet.  */
9719
9720           (*_bfd_error_handler)
9721             (_("%B: relocation %s is not supported for symbol %s."),
9722              input_bfd,
9723              ppc64_elf_howto_table[r_type]->name, sym_name);
9724
9725           bfd_set_error (bfd_error_invalid_operation);
9726           ret = FALSE;
9727           continue;
9728         }
9729
9730       /* Do any further special processing.  */
9731       switch (r_type)
9732         {
9733         default:
9734           break;
9735
9736         case R_PPC64_ADDR16_HA:
9737         case R_PPC64_ADDR16_HIGHERA:
9738         case R_PPC64_ADDR16_HIGHESTA:
9739         case R_PPC64_GOT16_HA:
9740         case R_PPC64_PLTGOT16_HA:
9741         case R_PPC64_PLT16_HA:
9742         case R_PPC64_TOC16_HA:
9743         case R_PPC64_SECTOFF_HA:
9744         case R_PPC64_TPREL16_HA:
9745         case R_PPC64_DTPREL16_HA:
9746         case R_PPC64_GOT_TLSGD16_HA:
9747         case R_PPC64_GOT_TLSLD16_HA:
9748         case R_PPC64_GOT_TPREL16_HA:
9749         case R_PPC64_GOT_DTPREL16_HA:
9750         case R_PPC64_TPREL16_HIGHER:
9751         case R_PPC64_TPREL16_HIGHERA:
9752         case R_PPC64_TPREL16_HIGHEST:
9753         case R_PPC64_TPREL16_HIGHESTA:
9754         case R_PPC64_DTPREL16_HIGHER:
9755         case R_PPC64_DTPREL16_HIGHERA:
9756         case R_PPC64_DTPREL16_HIGHEST:
9757         case R_PPC64_DTPREL16_HIGHESTA:
9758           /* It's just possible that this symbol is a weak symbol
9759              that's not actually defined anywhere. In that case,
9760              'sec' would be NULL, and we should leave the symbol
9761              alone (it will be set to zero elsewhere in the link).  */
9762           if (sec != NULL)
9763             /* Add 0x10000 if sign bit in 0:15 is set.
9764                Bits 0:15 are not used.  */
9765             addend += 0x8000;
9766           break;
9767
9768         case R_PPC64_ADDR16_DS:
9769         case R_PPC64_ADDR16_LO_DS:
9770         case R_PPC64_GOT16_DS:
9771         case R_PPC64_GOT16_LO_DS:
9772         case R_PPC64_PLT16_LO_DS:
9773         case R_PPC64_SECTOFF_DS:
9774         case R_PPC64_SECTOFF_LO_DS:
9775         case R_PPC64_TOC16_DS:
9776         case R_PPC64_TOC16_LO_DS:
9777         case R_PPC64_PLTGOT16_DS:
9778         case R_PPC64_PLTGOT16_LO_DS:
9779         case R_PPC64_GOT_TPREL16_DS:
9780         case R_PPC64_GOT_TPREL16_LO_DS:
9781         case R_PPC64_GOT_DTPREL16_DS:
9782         case R_PPC64_GOT_DTPREL16_LO_DS:
9783         case R_PPC64_TPREL16_DS:
9784         case R_PPC64_TPREL16_LO_DS:
9785         case R_PPC64_DTPREL16_DS:
9786         case R_PPC64_DTPREL16_LO_DS:
9787           insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
9788           mask = 3;
9789           /* If this reloc is against an lq insn, then the value must be
9790              a multiple of 16.  This is somewhat of a hack, but the
9791              "correct" way to do this by defining _DQ forms of all the
9792              _DS relocs bloats all reloc switches in this file.  It
9793              doesn't seem to make much sense to use any of these relocs
9794              in data, so testing the insn should be safe.  */
9795           if ((insn & (0x3f << 26)) == (56u << 26))
9796             mask = 15;
9797           if (((relocation + addend) & mask) != 0)
9798             {
9799               (*_bfd_error_handler)
9800                 (_("%B: error: relocation %s not a multiple of %d"),
9801                  input_bfd,
9802                  ppc64_elf_howto_table[r_type]->name,
9803                  mask + 1);
9804               bfd_set_error (bfd_error_bad_value);
9805               ret = FALSE;
9806               continue;
9807             }
9808           break;
9809         }
9810
9811       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
9812          because such sections are not SEC_ALLOC and thus ld.so will
9813          not process them.  */
9814       if (unresolved_reloc
9815           && !((input_section->flags & SEC_DEBUGGING) != 0
9816                && (h->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC)))
9817         {
9818           (*_bfd_error_handler)
9819             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
9820              input_bfd,
9821              input_section,
9822              (long) rel->r_offset,
9823              ppc64_elf_howto_table[(int) r_type]->name,
9824              h->elf.root.root.string);
9825           ret = FALSE;
9826         }
9827
9828       r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
9829                                     input_bfd,
9830                                     input_section,
9831                                     contents,
9832                                     rel->r_offset,
9833                                     relocation,
9834                                     addend);
9835
9836       if (r != bfd_reloc_ok)
9837         {
9838           if (sym_name == NULL)
9839             sym_name = "(null)";
9840           if (r == bfd_reloc_overflow)
9841             {
9842               if (warned)
9843                 continue;
9844               if (h != NULL
9845                   && h->elf.root.type == bfd_link_hash_undefweak
9846                   && ppc64_elf_howto_table[r_type]->pc_relative)
9847                 {
9848                   /* Assume this is a call protected by other code that
9849                      detects the symbol is undefined.  If this is the case,
9850                      we can safely ignore the overflow.  If not, the
9851                      program is hosed anyway, and a little warning isn't
9852                      going to help.  */
9853
9854                   continue;
9855                 }
9856
9857               if (!((*info->callbacks->reloc_overflow)
9858                     (info, sym_name, ppc64_elf_howto_table[r_type]->name,
9859                      rel->r_addend, input_bfd, input_section, rel->r_offset)))
9860                 return FALSE;
9861             }
9862           else
9863             {
9864               (*_bfd_error_handler)
9865                 (_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
9866                  input_bfd,
9867                  input_section,
9868                  (long) rel->r_offset,
9869                  ppc64_elf_howto_table[r_type]->name,
9870                  sym_name,
9871                  (int) r);
9872               ret = FALSE;
9873             }
9874         }
9875     }
9876
9877   return ret;
9878 }
9879
9880 /* Adjust the value of any local symbols in opd sections.  */
9881
9882 static bfd_boolean
9883 ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
9884                               const char *name ATTRIBUTE_UNUSED,
9885                               Elf_Internal_Sym *elfsym,
9886                               asection *input_sec,
9887                               struct elf_link_hash_entry *h)
9888 {
9889   long *opd_adjust, adjust;
9890   bfd_vma value;
9891
9892   if (h != NULL)
9893     return TRUE;
9894
9895   opd_adjust = get_opd_info (input_sec);
9896   if (opd_adjust == NULL)
9897     return TRUE;
9898
9899   value = elfsym->st_value - input_sec->output_offset;
9900   if (!info->relocatable)
9901     value -= input_sec->output_section->vma;
9902
9903   adjust = opd_adjust[value / 8];
9904   if (adjust == -1)
9905     elfsym->st_value = 0;
9906   else
9907     elfsym->st_value += adjust;
9908   return TRUE;
9909 }
9910
9911 /* Finish up dynamic symbol handling.  We set the contents of various
9912    dynamic sections here.  */
9913
9914 static bfd_boolean
9915 ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
9916                                  struct bfd_link_info *info,
9917                                  struct elf_link_hash_entry *h,
9918                                  Elf_Internal_Sym *sym)
9919 {
9920   struct ppc_link_hash_table *htab;
9921   bfd *dynobj;
9922   struct plt_entry *ent;
9923   Elf_Internal_Rela rela;
9924   bfd_byte *loc;
9925
9926   htab = ppc_hash_table (info);
9927   dynobj = htab->elf.dynobj;
9928
9929   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
9930     if (ent->plt.offset != (bfd_vma) -1)
9931       {
9932         /* This symbol has an entry in the procedure linkage
9933            table.  Set it up.  */
9934
9935         if (htab->plt == NULL
9936             || htab->relplt == NULL
9937             || htab->glink == NULL)
9938           abort ();
9939
9940         /* Create a JMP_SLOT reloc to inform the dynamic linker to
9941            fill in the PLT entry.  */
9942         rela.r_offset = (htab->plt->output_section->vma
9943                          + htab->plt->output_offset
9944                          + ent->plt.offset);
9945         rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
9946         rela.r_addend = ent->addend;
9947
9948         loc = htab->relplt->contents;
9949         loc += ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE
9950                 * sizeof (Elf64_External_Rela));
9951         bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
9952       }
9953
9954   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
9955     {
9956       Elf_Internal_Rela rela;
9957       bfd_byte *loc;
9958
9959       /* This symbol needs a copy reloc.  Set it up.  */
9960
9961       if (h->dynindx == -1
9962           || (h->root.type != bfd_link_hash_defined
9963               && h->root.type != bfd_link_hash_defweak)
9964           || htab->relbss == NULL)
9965         abort ();
9966
9967       rela.r_offset = (h->root.u.def.value
9968                        + h->root.u.def.section->output_section->vma
9969                        + h->root.u.def.section->output_offset);
9970       rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
9971       rela.r_addend = 0;
9972       loc = htab->relbss->contents;
9973       loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
9974       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
9975     }
9976
9977   /* Mark some specially defined symbols as absolute.  */
9978   if (strcmp (h->root.root.string, "_DYNAMIC") == 0)
9979     sym->st_shndx = SHN_ABS;
9980
9981   return TRUE;
9982 }
9983
9984 /* Used to decide how to sort relocs in an optimal manner for the
9985    dynamic linker, before writing them out.  */
9986
9987 static enum elf_reloc_type_class
9988 ppc64_elf_reloc_type_class (const Elf_Internal_Rela *rela)
9989 {
9990   enum elf_ppc64_reloc_type r_type;
9991
9992   r_type = ELF64_R_TYPE (rela->r_info);
9993   switch (r_type)
9994     {
9995     case R_PPC64_RELATIVE:
9996       return reloc_class_relative;
9997     case R_PPC64_JMP_SLOT:
9998       return reloc_class_plt;
9999     case R_PPC64_COPY:
10000       return reloc_class_copy;
10001     default:
10002       return reloc_class_normal;
10003     }
10004 }
10005
10006 /* Finish up the dynamic sections.  */
10007
10008 static bfd_boolean
10009 ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
10010                                    struct bfd_link_info *info)
10011 {
10012   struct ppc_link_hash_table *htab;
10013   bfd *dynobj;
10014   asection *sdyn;
10015
10016   htab = ppc_hash_table (info);
10017   dynobj = htab->elf.dynobj;
10018   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
10019
10020   if (htab->elf.dynamic_sections_created)
10021     {
10022       Elf64_External_Dyn *dyncon, *dynconend;
10023
10024       if (sdyn == NULL || htab->got == NULL)
10025         abort ();
10026
10027       dyncon = (Elf64_External_Dyn *) sdyn->contents;
10028       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
10029       for (; dyncon < dynconend; dyncon++)
10030         {
10031           Elf_Internal_Dyn dyn;
10032           asection *s;
10033
10034           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
10035
10036           switch (dyn.d_tag)
10037             {
10038             default:
10039               continue;
10040
10041             case DT_PPC64_GLINK:
10042               s = htab->glink;
10043               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
10044               /* We stupidly defined DT_PPC64_GLINK to be the start
10045                  of glink rather than the first entry point, which is
10046                  what ld.so needs, and now have a bigger stub to
10047                  support automatic multiple TOCs.  */
10048               dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 32;
10049               break;
10050
10051             case DT_PPC64_OPD:
10052               s = bfd_get_section_by_name (output_bfd, ".opd");
10053               if (s == NULL)
10054                 continue;
10055               dyn.d_un.d_ptr = s->vma;
10056               break;
10057
10058             case DT_PPC64_OPDSZ:
10059               s = bfd_get_section_by_name (output_bfd, ".opd");
10060               if (s == NULL)
10061                 continue;
10062               dyn.d_un.d_val = s->size;
10063               break;
10064
10065             case DT_PLTGOT:
10066               s = htab->plt;
10067               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
10068               break;
10069
10070             case DT_JMPREL:
10071               s = htab->relplt;
10072               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
10073               break;
10074
10075             case DT_PLTRELSZ:
10076               dyn.d_un.d_val = htab->relplt->size;
10077               break;
10078
10079             case DT_RELASZ:
10080               /* Don't count procedure linkage table relocs in the
10081                  overall reloc count.  */
10082               s = htab->relplt;
10083               if (s == NULL)
10084                 continue;
10085               dyn.d_un.d_val -= s->size;
10086               break;
10087
10088             case DT_RELA:
10089               /* We may not be using the standard ELF linker script.
10090                  If .rela.plt is the first .rela section, we adjust
10091                  DT_RELA to not include it.  */
10092               s = htab->relplt;
10093               if (s == NULL)
10094                 continue;
10095               if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
10096                 continue;
10097               dyn.d_un.d_ptr += s->size;
10098               break;
10099             }
10100
10101           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
10102         }
10103     }
10104
10105   if (htab->got != NULL && htab->got->size != 0)
10106     {
10107       /* Fill in the first entry in the global offset table.
10108          We use it to hold the link-time TOCbase.  */
10109       bfd_put_64 (output_bfd,
10110                   elf_gp (output_bfd) + TOC_BASE_OFF,
10111                   htab->got->contents);
10112
10113       /* Set .got entry size.  */
10114       elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 8;
10115     }
10116
10117   if (htab->plt != NULL && htab->plt->size != 0)
10118     {
10119       /* Set .plt entry size.  */
10120       elf_section_data (htab->plt->output_section)->this_hdr.sh_entsize
10121         = PLT_ENTRY_SIZE;
10122     }
10123
10124   /* We need to handle writing out multiple GOT sections ourselves,
10125      since we didn't add them to DYNOBJ.  */
10126   while ((dynobj = dynobj->link_next) != NULL)
10127     {
10128       asection *s;
10129       s = ppc64_elf_tdata (dynobj)->got;
10130       if (s != NULL
10131           && s->size != 0
10132           && s->output_section != bfd_abs_section_ptr
10133           && !bfd_set_section_contents (output_bfd, s->output_section,
10134                                         s->contents, s->output_offset,
10135                                         s->size))
10136         return FALSE;
10137       s = ppc64_elf_tdata (dynobj)->relgot;
10138       if (s != NULL
10139           && s->size != 0
10140           && s->output_section != bfd_abs_section_ptr
10141           && !bfd_set_section_contents (output_bfd, s->output_section,
10142                                         s->contents, s->output_offset,
10143                                         s->size))
10144         return FALSE;
10145     }
10146
10147   return TRUE;
10148 }
10149
10150 #include "elf64-target.h"