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