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