]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf64-ppc.c
For PPC64/ELFv1: Introduce mst_data_gnu_ifunc
[thirdparty/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
219d1afa 2 Copyright (C) 1999-2018 Free Software Foundation, Inc.
5bd4f169
AM
3 Written by Linus Nordberg, Swox AB <info@swox.com>,
4 based on elf32-ppc.c by Ian Lance Taylor.
32ca9640 5 Largely rewritten by Alan Modra.
5bd4f169 6
ae9a127f 7 This file is part of BFD, the Binary File Descriptor library.
5bd4f169 8
ae9a127f
NC
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
cd123cb7 11 the Free Software Foundation; either version 3 of the License, or
ae9a127f 12 (at your option) any later version.
5bd4f169 13
ae9a127f
NC
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
5bd4f169 18
4ce794b7
AM
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
3e110533 21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
5bd4f169 22
cd123cb7 23
4ce794b7
AM
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 */
5bd4f169 27
3db64b00 28#include "sysdep.h"
183e98be 29#include <stdarg.h>
5bd4f169 30#include "bfd.h"
5bd4f169
AM
31#include "bfdlink.h"
32#include "libbfd.h"
33#include "elf-bfd.h"
04c9666a 34#include "elf/ppc64.h"
5d1634d7 35#include "elf64-ppc.h"
58d180e8 36#include "dwarf2.h"
5bd4f169 37
805fc799 38static bfd_reloc_status_type ppc64_elf_ha_reloc
4ce794b7 39 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016
AM
40static bfd_reloc_status_type ppc64_elf_branch_reloc
41 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 42static bfd_reloc_status_type ppc64_elf_brtaken_reloc
4ce794b7 43 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 44static bfd_reloc_status_type ppc64_elf_sectoff_reloc
4ce794b7 45 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 46static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
4ce794b7 47 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 48static bfd_reloc_status_type ppc64_elf_toc_reloc
4ce794b7 49 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 50static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
4ce794b7 51 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 52static bfd_reloc_status_type ppc64_elf_toc64_reloc
4ce794b7 53 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 54static bfd_reloc_status_type ppc64_elf_unhandled_reloc
4ce794b7 55 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016 56static bfd_vma opd_entry_value
aef36ac1 57 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean);
5bd4f169 58
6d00b590 59#define TARGET_LITTLE_SYM powerpc_elf64_le_vec
ad8e1ba5 60#define TARGET_LITTLE_NAME "elf64-powerpcle"
6d00b590 61#define TARGET_BIG_SYM powerpc_elf64_vec
ad8e1ba5
AM
62#define TARGET_BIG_NAME "elf64-powerpc"
63#define ELF_ARCH bfd_arch_powerpc
ae95ffa6 64#define ELF_TARGET_ID PPC64_ELF_DATA
ad8e1ba5
AM
65#define ELF_MACHINE_CODE EM_PPC64
66#define ELF_MAXPAGESIZE 0x10000
702d1671
AM
67#define ELF_COMMONPAGESIZE 0x1000
68#define ELF_RELROPAGESIZE ELF_MAXPAGESIZE
ad8e1ba5
AM
69#define elf_info_to_howto ppc64_elf_info_to_howto
70
71#define elf_backend_want_got_sym 0
72#define elf_backend_want_plt_sym 0
73#define elf_backend_plt_alignment 3
74#define elf_backend_plt_not_loaded 1
ad8e1ba5 75#define elf_backend_got_header_size 8
5474d94f 76#define elf_backend_want_dynrelro 1
ad8e1ba5
AM
77#define elf_backend_can_gc_sections 1
78#define elf_backend_can_refcount 1
79#define elf_backend_rela_normal 1
64f52338 80#define elf_backend_dtrel_excludes_plt 1
6bfdb61b 81#define elf_backend_default_execstack 0
ad8e1ba5 82
e717da7e 83#define bfd_elf64_mkobject ppc64_elf_mkobject
ad8e1ba5 84#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
aa374f67 85#define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
ee67d69a
AM
86#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
87#define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
ad8e1ba5
AM
88#define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
89#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
90e3cdf2 90#define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
aa374f67 91#define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
8c5b4e52 92#define bfd_elf64_bfd_gc_sections ppc64_elf_gc_sections
ad8e1ba5
AM
93
94#define elf_backend_object_p ppc64_elf_object_p
d37c89e5
AM
95#define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
96#define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
183e98be 97#define elf_backend_write_core_note ppc64_elf_write_core_note
9d19e4fd 98#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
ad8e1ba5 99#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
555cd476 100#define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
f6c7c3e8 101#define elf_backend_check_directives ppc64_elf_before_check_relocs
e5034e59 102#define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
8387904d 103#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
ad8e1ba5 104#define elf_backend_check_relocs ppc64_elf_check_relocs
c0e331c7 105#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
74f0fb50 106#define elf_backend_gc_keep ppc64_elf_gc_keep
64d03ab5 107#define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
ad8e1ba5 108#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
ad8e1ba5
AM
109#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
110#define elf_backend_hide_symbol ppc64_elf_hide_symbol
9f296da3 111#define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
ad8e1ba5
AM
112#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
113#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
a345bc8d 114#define elf_backend_hash_symbol ppc64_elf_hash_symbol
74541ad4 115#define elf_backend_init_index_section _bfd_elf_init_2_index_sections
60124e18 116#define elf_backend_action_discarded ppc64_elf_action_discarded
ad8e1ba5
AM
117#define elf_backend_relocate_section ppc64_elf_relocate_section
118#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
119#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
120#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
754021d0 121#define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
29ef7005 122#define elf_backend_special_sections ppc64_elf_special_sections
6911b7dc 123#define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
8c5b4e52 124#define elf_backend_merge_symbol ppc64_elf_merge_symbol
bce964aa 125#define elf_backend_get_reloc_section bfd_get_section_by_name
ad8e1ba5 126
5bd4f169
AM
127/* The name of the dynamic interpreter. This is put in the .interp
128 section. */
129#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
130
131/* The size in bytes of an entry in the procedure linkage table. */
b9e5796b 132#define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
2d7ad24e 133#define LOCAL_PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 16 : 8)
5bd4f169
AM
134
135/* The initial size of the plt reserved for the dynamic linker. */
b9e5796b 136#define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
5bd4f169 137
a078d95a
AM
138/* Offsets to some stack save slots. */
139#define STK_LR 16
140#define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
eb8d7fda 141/* This one is dodgy. ELFv2 does not have a linker word, so use the
a078d95a
AM
142 CR save slot. Used only by optimised __tls_get_addr call stub,
143 relying on __tls_get_addr_opt not saving CR.. */
144#define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
145
5bd4f169 146/* TOC base pointers offset from start of TOC. */
411e1bfb 147#define TOC_BASE_OFF 0x8000
a27e685f
AM
148/* TOC base alignment. */
149#define TOC_BASE_ALIGN 256
411e1bfb
AM
150
151/* Offset of tp and dtp pointers from start of TLS block. */
152#define TP_OFFSET 0x7000
153#define DTP_OFFSET 0x8000
5bd4f169 154
ad8e1ba5
AM
155/* .plt call stub instructions. The normal stub is like this, but
156 sometimes the .plt entry crosses a 64k boundary and we need to
71a39c98 157 insert an addi to adjust r11. */
a078d95a 158#define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
71a39c98
AM
159#define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
160#define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
161#define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
162#define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
163#define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
5d1634d7
AM
164#define BCTR 0x4e800420 /* bctr */
165
07d6d2b8
AM
166#define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
167#define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
168#define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
169
170#define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
171#define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
172#define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
173#define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
174#define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
175#define BNECTR 0x4ca20420 /* bnectr+ */
176#define BNECTR_P4 0x4ce20420 /* bnectr+ */
794e51c0 177
71a39c98 178#define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
ac2df442 179#define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
07d6d2b8 180#define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
ac2df442 181
07d6d2b8
AM
182#define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
183#define LD_R2_0R12 0xe84c0000 /* ld %r2,0(%r12) */
184#define ADD_R2_R2_R12 0x7c426214 /* add %r2,%r2,%r12 */
ad8e1ba5 185
07d6d2b8 186#define LIS_R2 0x3c400000 /* lis %r2,xxx@ha */
006589cf
AM
187#define ADDIS_R2_R12 0x3c4c0000 /* addis %r2,%r12,xxx@ha */
188#define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
a345bc8d 189#define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
07d6d2b8 190#define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
a345bc8d 191
9e390558
AM
192/* __glink_PLTresolve stub instructions. We enter with the index in R0. */
193#define GLINK_PLTRESOLVE_SIZE(htab) \
407aa07c 194 (8u + (htab->opd_abi ? 11 * 4 : 14 * 4))
ee4bf8d2
AM
195 /* 0: */
196 /* .quad plt0-1f */
197 /* __glink: */
198#define MFLR_R12 0x7d8802a6 /* mflr %12 */
199#define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
200 /* 1: */
201#define MFLR_R11 0x7d6802a6 /* mflr %11 */
71a39c98 202 /* ld %2,(0b-1b)(%11) */
ee4bf8d2 203#define MTLR_R12 0x7d8803a6 /* mtlr %12 */
71a39c98
AM
204#define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
205 /* ld %12,0(%11) */
206 /* ld %2,8(%11) */
207 /* mtctr %12 */
208 /* ld %11,16(%11) */
ee4bf8d2 209 /* bctr */
b9e5796b
AM
210#define MFLR_R0 0x7c0802a6 /* mflr %r0 */
211#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
212#define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
213#define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
214#define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
5d1634d7
AM
215
216/* Pad with this. */
217#define NOP 0x60000000
218
721956f4
AM
219/* Some other nops. */
220#define CROR_151515 0x4def7b82
221#define CROR_313131 0x4ffffb82
222
cedb70c5 223/* .glink entries for the first 32k functions are two instructions. */
5d1634d7
AM
224#define LI_R0_0 0x38000000 /* li %r0,0 */
225#define B_DOT 0x48000000 /* b . */
226
227/* After that, we need two instructions to load the index, followed by
228 a branch. */
229#define LIS_R0_0 0x3c000000 /* lis %r0,0 */
10ed1bba 230#define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
41bd81ab 231
deb0e272
AM
232/* Instructions used by the save and restore reg functions. */
233#define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
234#define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
235#define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
236#define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
82bd7b59
AM
237#define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
238#define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
deb0e272
AM
239#define LI_R12_0 0x39800000 /* li %r12,0 */
240#define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
241#define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
242#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
82bd7b59
AM
243#define BLR 0x4e800020 /* blr */
244
41bd81ab
AM
245/* Since .opd is an array of descriptors and each entry will end up
246 with identical R_PPC64_RELATIVE relocs, there is really no need to
247 propagate .opd relocs; The dynamic linker should be taught to
1e2f5b6e 248 relocate .opd without reloc entries. */
41bd81ab
AM
249#ifndef NO_OPD_RELOCS
250#define NO_OPD_RELOCS 0
251#endif
810d4e75 252
a4b6fadd
AM
253#ifndef ARRAY_SIZE
254#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
255#endif
256
810d4e75
AM
257static inline int
258abiversion (bfd *abfd)
259{
260 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
261}
262
263static inline void
264set_abiversion (bfd *abfd, int ver)
265{
266 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
267 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
268}
5bd4f169 269\f
f5e87a1d 270#define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
b34976b6 271
5bd4f169 272/* Relocation HOWTO's. */
04c9666a 273static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
5bd4f169 274
f3185997
NC
275static reloc_howto_type ppc64_elf_howto_raw[] =
276{
5bd4f169
AM
277 /* This reloc does nothing. */
278 HOWTO (R_PPC64_NONE, /* type */
279 0, /* rightshift */
6346d5ca
AM
280 3, /* size (0 = byte, 1 = short, 2 = long) */
281 0, /* bitsize */
b34976b6 282 FALSE, /* pc_relative */
5bd4f169 283 0, /* bitpos */
f5e87a1d 284 complain_overflow_dont, /* complain_on_overflow */
5bd4f169
AM
285 bfd_elf_generic_reloc, /* special_function */
286 "R_PPC64_NONE", /* name */
b34976b6 287 FALSE, /* partial_inplace */
d006db6c 288 0, /* src_mask */
5bd4f169 289 0, /* dst_mask */
b34976b6 290 FALSE), /* pcrel_offset */
5bd4f169
AM
291
292 /* A standard 32 bit relocation. */
293 HOWTO (R_PPC64_ADDR32, /* type */
294 0, /* rightshift */
295 2, /* size (0 = byte, 1 = short, 2 = long) */
296 32, /* bitsize */
b34976b6 297 FALSE, /* pc_relative */
5bd4f169
AM
298 0, /* bitpos */
299 complain_overflow_bitfield, /* complain_on_overflow */
300 bfd_elf_generic_reloc, /* special_function */
301 "R_PPC64_ADDR32", /* name */
b34976b6 302 FALSE, /* partial_inplace */
5bd4f169
AM
303 0, /* src_mask */
304 0xffffffff, /* dst_mask */
b34976b6 305 FALSE), /* pcrel_offset */
5bd4f169
AM
306
307 /* An absolute 26 bit branch; the lower two bits must be zero.
308 FIXME: we don't check that, we just clear them. */
309 HOWTO (R_PPC64_ADDR24, /* type */
310 0, /* rightshift */
311 2, /* size (0 = byte, 1 = short, 2 = long) */
312 26, /* bitsize */
b34976b6 313 FALSE, /* pc_relative */
5bd4f169
AM
314 0, /* bitpos */
315 complain_overflow_bitfield, /* complain_on_overflow */
316 bfd_elf_generic_reloc, /* special_function */
317 "R_PPC64_ADDR24", /* name */
b34976b6 318 FALSE, /* partial_inplace */
d006db6c 319 0, /* src_mask */
f5e87a1d 320 0x03fffffc, /* dst_mask */
b34976b6 321 FALSE), /* pcrel_offset */
5bd4f169
AM
322
323 /* A standard 16 bit relocation. */
324 HOWTO (R_PPC64_ADDR16, /* type */
325 0, /* rightshift */
326 1, /* size (0 = byte, 1 = short, 2 = long) */
327 16, /* bitsize */
b34976b6 328 FALSE, /* pc_relative */
5bd4f169
AM
329 0, /* bitpos */
330 complain_overflow_bitfield, /* complain_on_overflow */
331 bfd_elf_generic_reloc, /* special_function */
332 "R_PPC64_ADDR16", /* name */
b34976b6 333 FALSE, /* partial_inplace */
5bd4f169
AM
334 0, /* src_mask */
335 0xffff, /* dst_mask */
b34976b6 336 FALSE), /* pcrel_offset */
5bd4f169
AM
337
338 /* A 16 bit relocation without overflow. */
339 HOWTO (R_PPC64_ADDR16_LO, /* type */
340 0, /* rightshift */
341 1, /* size (0 = byte, 1 = short, 2 = long) */
342 16, /* bitsize */
b34976b6 343 FALSE, /* pc_relative */
5bd4f169
AM
344 0, /* bitpos */
345 complain_overflow_dont,/* complain_on_overflow */
346 bfd_elf_generic_reloc, /* special_function */
347 "R_PPC64_ADDR16_LO", /* name */
b34976b6 348 FALSE, /* partial_inplace */
5bd4f169
AM
349 0, /* src_mask */
350 0xffff, /* dst_mask */
b34976b6 351 FALSE), /* pcrel_offset */
5bd4f169
AM
352
353 /* Bits 16-31 of an address. */
354 HOWTO (R_PPC64_ADDR16_HI, /* type */
355 16, /* rightshift */
356 1, /* size (0 = byte, 1 = short, 2 = long) */
357 16, /* bitsize */
b34976b6 358 FALSE, /* pc_relative */
5bd4f169 359 0, /* bitpos */
f9c6b907 360 complain_overflow_signed, /* complain_on_overflow */
5bd4f169
AM
361 bfd_elf_generic_reloc, /* special_function */
362 "R_PPC64_ADDR16_HI", /* name */
b34976b6 363 FALSE, /* partial_inplace */
5bd4f169
AM
364 0, /* src_mask */
365 0xffff, /* dst_mask */
b34976b6 366 FALSE), /* pcrel_offset */
5bd4f169
AM
367
368 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
369 bits, treated as a signed number, is negative. */
370 HOWTO (R_PPC64_ADDR16_HA, /* type */
371 16, /* rightshift */
372 1, /* size (0 = byte, 1 = short, 2 = long) */
373 16, /* bitsize */
b34976b6 374 FALSE, /* pc_relative */
5bd4f169 375 0, /* bitpos */
f9c6b907 376 complain_overflow_signed, /* complain_on_overflow */
805fc799 377 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 378 "R_PPC64_ADDR16_HA", /* name */
b34976b6 379 FALSE, /* partial_inplace */
5bd4f169
AM
380 0, /* src_mask */
381 0xffff, /* dst_mask */
b34976b6 382 FALSE), /* pcrel_offset */
5bd4f169
AM
383
384 /* An absolute 16 bit branch; the lower two bits must be zero.
385 FIXME: we don't check that, we just clear them. */
386 HOWTO (R_PPC64_ADDR14, /* type */
387 0, /* rightshift */
388 2, /* size (0 = byte, 1 = short, 2 = long) */
389 16, /* bitsize */
b34976b6 390 FALSE, /* pc_relative */
5bd4f169 391 0, /* bitpos */
b80eed39 392 complain_overflow_signed, /* complain_on_overflow */
2441e016 393 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 394 "R_PPC64_ADDR14", /* name */
b34976b6 395 FALSE, /* partial_inplace */
d006db6c 396 0, /* src_mask */
f5e87a1d 397 0x0000fffc, /* dst_mask */
b34976b6 398 FALSE), /* pcrel_offset */
5bd4f169
AM
399
400 /* An absolute 16 bit branch, for which bit 10 should be set to
401 indicate that the branch is expected to be taken. The lower two
402 bits must be zero. */
403 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
404 0, /* rightshift */
405 2, /* size (0 = byte, 1 = short, 2 = long) */
406 16, /* bitsize */
b34976b6 407 FALSE, /* pc_relative */
5bd4f169 408 0, /* bitpos */
b80eed39 409 complain_overflow_signed, /* complain_on_overflow */
805fc799 410 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 411 "R_PPC64_ADDR14_BRTAKEN",/* name */
b34976b6 412 FALSE, /* partial_inplace */
d006db6c 413 0, /* src_mask */
f5e87a1d 414 0x0000fffc, /* dst_mask */
b34976b6 415 FALSE), /* pcrel_offset */
5bd4f169
AM
416
417 /* An absolute 16 bit branch, for which bit 10 should be set to
418 indicate that the branch is not expected to be taken. The lower
419 two bits must be zero. */
420 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
421 0, /* rightshift */
422 2, /* size (0 = byte, 1 = short, 2 = long) */
423 16, /* bitsize */
b34976b6 424 FALSE, /* pc_relative */
5bd4f169 425 0, /* bitpos */
b80eed39 426 complain_overflow_signed, /* complain_on_overflow */
805fc799 427 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 428 "R_PPC64_ADDR14_BRNTAKEN",/* name */
b34976b6 429 FALSE, /* partial_inplace */
d006db6c 430 0, /* src_mask */
f5e87a1d 431 0x0000fffc, /* dst_mask */
b34976b6 432 FALSE), /* pcrel_offset */
5bd4f169
AM
433
434 /* A relative 26 bit branch; the lower two bits must be zero. */
435 HOWTO (R_PPC64_REL24, /* type */
436 0, /* rightshift */
437 2, /* size (0 = byte, 1 = short, 2 = long) */
438 26, /* bitsize */
b34976b6 439 TRUE, /* pc_relative */
5bd4f169
AM
440 0, /* bitpos */
441 complain_overflow_signed, /* complain_on_overflow */
2441e016 442 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 443 "R_PPC64_REL24", /* name */
b34976b6 444 FALSE, /* partial_inplace */
d006db6c 445 0, /* src_mask */
f5e87a1d 446 0x03fffffc, /* dst_mask */
b34976b6 447 TRUE), /* pcrel_offset */
5bd4f169
AM
448
449 /* A relative 16 bit branch; the lower two bits must be zero. */
450 HOWTO (R_PPC64_REL14, /* type */
451 0, /* rightshift */
452 2, /* size (0 = byte, 1 = short, 2 = long) */
453 16, /* bitsize */
b34976b6 454 TRUE, /* pc_relative */
5bd4f169
AM
455 0, /* bitpos */
456 complain_overflow_signed, /* complain_on_overflow */
2441e016 457 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 458 "R_PPC64_REL14", /* name */
b34976b6 459 FALSE, /* partial_inplace */
d006db6c 460 0, /* src_mask */
f5e87a1d 461 0x0000fffc, /* dst_mask */
b34976b6 462 TRUE), /* pcrel_offset */
5bd4f169
AM
463
464 /* A relative 16 bit branch. Bit 10 should be set to indicate that
465 the branch is expected to be taken. The lower two bits must be
466 zero. */
467 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
468 0, /* rightshift */
469 2, /* size (0 = byte, 1 = short, 2 = long) */
470 16, /* bitsize */
b34976b6 471 TRUE, /* pc_relative */
5bd4f169
AM
472 0, /* bitpos */
473 complain_overflow_signed, /* complain_on_overflow */
805fc799 474 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 475 "R_PPC64_REL14_BRTAKEN", /* name */
b34976b6 476 FALSE, /* partial_inplace */
d006db6c 477 0, /* src_mask */
f5e87a1d 478 0x0000fffc, /* dst_mask */
b34976b6 479 TRUE), /* pcrel_offset */
5bd4f169
AM
480
481 /* A relative 16 bit branch. Bit 10 should be set to indicate that
482 the branch is not expected to be taken. The lower two bits must
483 be zero. */
484 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
485 0, /* rightshift */
486 2, /* size (0 = byte, 1 = short, 2 = long) */
487 16, /* bitsize */
b34976b6 488 TRUE, /* pc_relative */
5bd4f169
AM
489 0, /* bitpos */
490 complain_overflow_signed, /* complain_on_overflow */
805fc799 491 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 492 "R_PPC64_REL14_BRNTAKEN",/* name */
b34976b6 493 FALSE, /* partial_inplace */
d006db6c 494 0, /* src_mask */
f5e87a1d 495 0x0000fffc, /* dst_mask */
b34976b6 496 TRUE), /* pcrel_offset */
5bd4f169
AM
497
498 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
499 symbol. */
500 HOWTO (R_PPC64_GOT16, /* type */
501 0, /* rightshift */
502 1, /* size (0 = byte, 1 = short, 2 = long) */
503 16, /* bitsize */
b34976b6 504 FALSE, /* pc_relative */
5bd4f169
AM
505 0, /* bitpos */
506 complain_overflow_signed, /* complain_on_overflow */
805fc799 507 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 508 "R_PPC64_GOT16", /* name */
b34976b6 509 FALSE, /* partial_inplace */
5bd4f169
AM
510 0, /* src_mask */
511 0xffff, /* dst_mask */
b34976b6 512 FALSE), /* pcrel_offset */
5bd4f169
AM
513
514 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
515 the symbol. */
516 HOWTO (R_PPC64_GOT16_LO, /* type */
517 0, /* rightshift */
518 1, /* size (0 = byte, 1 = short, 2 = long) */
519 16, /* bitsize */
b34976b6 520 FALSE, /* pc_relative */
5bd4f169
AM
521 0, /* bitpos */
522 complain_overflow_dont, /* complain_on_overflow */
805fc799 523 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 524 "R_PPC64_GOT16_LO", /* name */
b34976b6 525 FALSE, /* partial_inplace */
5bd4f169
AM
526 0, /* src_mask */
527 0xffff, /* dst_mask */
b34976b6 528 FALSE), /* pcrel_offset */
5bd4f169
AM
529
530 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
531 the symbol. */
532 HOWTO (R_PPC64_GOT16_HI, /* type */
533 16, /* rightshift */
534 1, /* size (0 = byte, 1 = short, 2 = long) */
535 16, /* bitsize */
b34976b6 536 FALSE, /* pc_relative */
5bd4f169 537 0, /* bitpos */
f9c6b907 538 complain_overflow_signed,/* complain_on_overflow */
805fc799 539 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 540 "R_PPC64_GOT16_HI", /* name */
b34976b6 541 FALSE, /* partial_inplace */
5bd4f169
AM
542 0, /* src_mask */
543 0xffff, /* dst_mask */
b34976b6 544 FALSE), /* pcrel_offset */
5bd4f169
AM
545
546 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
547 the symbol. */
548 HOWTO (R_PPC64_GOT16_HA, /* type */
549 16, /* rightshift */
550 1, /* size (0 = byte, 1 = short, 2 = long) */
551 16, /* bitsize */
b34976b6 552 FALSE, /* pc_relative */
5bd4f169 553 0, /* bitpos */
f9c6b907 554 complain_overflow_signed,/* complain_on_overflow */
805fc799 555 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 556 "R_PPC64_GOT16_HA", /* name */
b34976b6 557 FALSE, /* partial_inplace */
5bd4f169
AM
558 0, /* src_mask */
559 0xffff, /* dst_mask */
b34976b6 560 FALSE), /* pcrel_offset */
5bd4f169
AM
561
562 /* This is used only by the dynamic linker. The symbol should exist
563 both in the object being run and in some shared library. The
564 dynamic linker copies the data addressed by the symbol from the
565 shared library into the object, because the object being
566 run has to have the data at some particular address. */
567 HOWTO (R_PPC64_COPY, /* type */
568 0, /* rightshift */
f5e87a1d
AM
569 0, /* this one is variable size */
570 0, /* bitsize */
b34976b6 571 FALSE, /* pc_relative */
5bd4f169 572 0, /* bitpos */
f5e87a1d
AM
573 complain_overflow_dont, /* complain_on_overflow */
574 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 575 "R_PPC64_COPY", /* name */
b34976b6 576 FALSE, /* partial_inplace */
5bd4f169
AM
577 0, /* src_mask */
578 0, /* dst_mask */
b34976b6 579 FALSE), /* pcrel_offset */
5bd4f169
AM
580
581 /* Like R_PPC64_ADDR64, but used when setting global offset table
582 entries. */
583 HOWTO (R_PPC64_GLOB_DAT, /* type */
584 0, /* rightshift */
585 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
586 64, /* bitsize */
b34976b6 587 FALSE, /* pc_relative */
5bd4f169
AM
588 0, /* bitpos */
589 complain_overflow_dont, /* complain_on_overflow */
805fc799 590 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 591 "R_PPC64_GLOB_DAT", /* name */
b34976b6 592 FALSE, /* partial_inplace */
5bd4f169 593 0, /* src_mask */
f5e87a1d 594 ONES (64), /* dst_mask */
b34976b6 595 FALSE), /* pcrel_offset */
5bd4f169
AM
596
597 /* Created by the link editor. Marks a procedure linkage table
598 entry for a symbol. */
599 HOWTO (R_PPC64_JMP_SLOT, /* type */
600 0, /* rightshift */
601 0, /* size (0 = byte, 1 = short, 2 = long) */
602 0, /* bitsize */
b34976b6 603 FALSE, /* pc_relative */
5bd4f169
AM
604 0, /* bitpos */
605 complain_overflow_dont, /* complain_on_overflow */
805fc799 606 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 607 "R_PPC64_JMP_SLOT", /* name */
b34976b6 608 FALSE, /* partial_inplace */
5bd4f169
AM
609 0, /* src_mask */
610 0, /* dst_mask */
b34976b6 611 FALSE), /* pcrel_offset */
5bd4f169
AM
612
613 /* Used only by the dynamic linker. When the object is run, this
614 doubleword64 is set to the load address of the object, plus the
615 addend. */
616 HOWTO (R_PPC64_RELATIVE, /* type */
617 0, /* rightshift */
618 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
619 64, /* bitsize */
b34976b6 620 FALSE, /* pc_relative */
5bd4f169
AM
621 0, /* bitpos */
622 complain_overflow_dont, /* complain_on_overflow */
623 bfd_elf_generic_reloc, /* special_function */
624 "R_PPC64_RELATIVE", /* name */
b34976b6 625 FALSE, /* partial_inplace */
5bd4f169 626 0, /* src_mask */
f5e87a1d 627 ONES (64), /* dst_mask */
b34976b6 628 FALSE), /* pcrel_offset */
5bd4f169
AM
629
630 /* Like R_PPC64_ADDR32, but may be unaligned. */
631 HOWTO (R_PPC64_UADDR32, /* type */
632 0, /* rightshift */
633 2, /* size (0 = byte, 1 = short, 2 = long) */
634 32, /* bitsize */
b34976b6 635 FALSE, /* pc_relative */
5bd4f169
AM
636 0, /* bitpos */
637 complain_overflow_bitfield, /* complain_on_overflow */
638 bfd_elf_generic_reloc, /* special_function */
639 "R_PPC64_UADDR32", /* name */
b34976b6 640 FALSE, /* partial_inplace */
5bd4f169
AM
641 0, /* src_mask */
642 0xffffffff, /* dst_mask */
b34976b6 643 FALSE), /* pcrel_offset */
5bd4f169
AM
644
645 /* Like R_PPC64_ADDR16, but may be unaligned. */
646 HOWTO (R_PPC64_UADDR16, /* type */
647 0, /* rightshift */
648 1, /* size (0 = byte, 1 = short, 2 = long) */
649 16, /* bitsize */
b34976b6 650 FALSE, /* pc_relative */
5bd4f169
AM
651 0, /* bitpos */
652 complain_overflow_bitfield, /* complain_on_overflow */
653 bfd_elf_generic_reloc, /* special_function */
654 "R_PPC64_UADDR16", /* name */
b34976b6 655 FALSE, /* partial_inplace */
5bd4f169
AM
656 0, /* src_mask */
657 0xffff, /* dst_mask */
b34976b6 658 FALSE), /* pcrel_offset */
5bd4f169
AM
659
660 /* 32-bit PC relative. */
661 HOWTO (R_PPC64_REL32, /* type */
662 0, /* rightshift */
663 2, /* size (0 = byte, 1 = short, 2 = long) */
664 32, /* bitsize */
b34976b6 665 TRUE, /* pc_relative */
5bd4f169 666 0, /* bitpos */
5bd4f169
AM
667 complain_overflow_signed, /* complain_on_overflow */
668 bfd_elf_generic_reloc, /* special_function */
669 "R_PPC64_REL32", /* name */
b34976b6 670 FALSE, /* partial_inplace */
5bd4f169
AM
671 0, /* src_mask */
672 0xffffffff, /* dst_mask */
b34976b6 673 TRUE), /* pcrel_offset */
5bd4f169 674
10ed1bba 675 /* 32-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
676 HOWTO (R_PPC64_PLT32, /* type */
677 0, /* rightshift */
678 2, /* size (0 = byte, 1 = short, 2 = long) */
679 32, /* bitsize */
b34976b6 680 FALSE, /* pc_relative */
5bd4f169
AM
681 0, /* bitpos */
682 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 683 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 684 "R_PPC64_PLT32", /* name */
b34976b6 685 FALSE, /* partial_inplace */
5bd4f169 686 0, /* src_mask */
f5e87a1d 687 0xffffffff, /* dst_mask */
b34976b6 688 FALSE), /* pcrel_offset */
5bd4f169
AM
689
690 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
691 FIXME: R_PPC64_PLTREL32 not supported. */
692 HOWTO (R_PPC64_PLTREL32, /* type */
693 0, /* rightshift */
694 2, /* size (0 = byte, 1 = short, 2 = long) */
695 32, /* bitsize */
b34976b6 696 TRUE, /* pc_relative */
5bd4f169
AM
697 0, /* bitpos */
698 complain_overflow_signed, /* complain_on_overflow */
3ce51288 699 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 700 "R_PPC64_PLTREL32", /* name */
b34976b6 701 FALSE, /* partial_inplace */
5bd4f169 702 0, /* src_mask */
f5e87a1d 703 0xffffffff, /* dst_mask */
b34976b6 704 TRUE), /* pcrel_offset */
5bd4f169
AM
705
706 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
707 the symbol. */
708 HOWTO (R_PPC64_PLT16_LO, /* type */
709 0, /* rightshift */
710 1, /* size (0 = byte, 1 = short, 2 = long) */
711 16, /* bitsize */
b34976b6 712 FALSE, /* pc_relative */
5bd4f169
AM
713 0, /* bitpos */
714 complain_overflow_dont, /* complain_on_overflow */
805fc799 715 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 716 "R_PPC64_PLT16_LO", /* name */
b34976b6 717 FALSE, /* partial_inplace */
5bd4f169
AM
718 0, /* src_mask */
719 0xffff, /* dst_mask */
b34976b6 720 FALSE), /* pcrel_offset */
5bd4f169
AM
721
722 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
723 the symbol. */
724 HOWTO (R_PPC64_PLT16_HI, /* type */
725 16, /* rightshift */
726 1, /* size (0 = byte, 1 = short, 2 = long) */
727 16, /* bitsize */
b34976b6 728 FALSE, /* pc_relative */
5bd4f169 729 0, /* bitpos */
f9c6b907 730 complain_overflow_signed, /* complain_on_overflow */
805fc799 731 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 732 "R_PPC64_PLT16_HI", /* name */
b34976b6 733 FALSE, /* partial_inplace */
5bd4f169
AM
734 0, /* src_mask */
735 0xffff, /* dst_mask */
b34976b6 736 FALSE), /* pcrel_offset */
5bd4f169
AM
737
738 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
739 the symbol. */
740 HOWTO (R_PPC64_PLT16_HA, /* type */
741 16, /* rightshift */
742 1, /* size (0 = byte, 1 = short, 2 = long) */
743 16, /* bitsize */
b34976b6 744 FALSE, /* pc_relative */
5bd4f169 745 0, /* bitpos */
f9c6b907 746 complain_overflow_signed, /* complain_on_overflow */
805fc799 747 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 748 "R_PPC64_PLT16_HA", /* name */
b34976b6 749 FALSE, /* partial_inplace */
5bd4f169
AM
750 0, /* src_mask */
751 0xffff, /* dst_mask */
b34976b6 752 FALSE), /* pcrel_offset */
5bd4f169 753
c061c2d8 754 /* 16-bit section relative relocation. */
5bd4f169
AM
755 HOWTO (R_PPC64_SECTOFF, /* type */
756 0, /* rightshift */
c061c2d8
AM
757 1, /* size (0 = byte, 1 = short, 2 = long) */
758 16, /* bitsize */
b34976b6 759 FALSE, /* pc_relative */
5bd4f169 760 0, /* bitpos */
b80eed39 761 complain_overflow_signed, /* complain_on_overflow */
805fc799 762 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 763 "R_PPC64_SECTOFF", /* name */
b34976b6 764 FALSE, /* partial_inplace */
5bd4f169 765 0, /* src_mask */
c061c2d8 766 0xffff, /* dst_mask */
b34976b6 767 FALSE), /* pcrel_offset */
5bd4f169 768
c061c2d8 769 /* Like R_PPC64_SECTOFF, but no overflow warning. */
5bd4f169
AM
770 HOWTO (R_PPC64_SECTOFF_LO, /* type */
771 0, /* rightshift */
772 1, /* size (0 = byte, 1 = short, 2 = long) */
773 16, /* bitsize */
b34976b6 774 FALSE, /* pc_relative */
5bd4f169
AM
775 0, /* bitpos */
776 complain_overflow_dont, /* complain_on_overflow */
805fc799 777 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 778 "R_PPC64_SECTOFF_LO", /* name */
b34976b6 779 FALSE, /* partial_inplace */
5bd4f169
AM
780 0, /* src_mask */
781 0xffff, /* dst_mask */
b34976b6 782 FALSE), /* pcrel_offset */
5bd4f169
AM
783
784 /* 16-bit upper half section relative relocation. */
785 HOWTO (R_PPC64_SECTOFF_HI, /* type */
786 16, /* rightshift */
787 1, /* size (0 = byte, 1 = short, 2 = long) */
788 16, /* bitsize */
b34976b6 789 FALSE, /* pc_relative */
5bd4f169 790 0, /* bitpos */
f9c6b907 791 complain_overflow_signed, /* complain_on_overflow */
805fc799 792 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 793 "R_PPC64_SECTOFF_HI", /* name */
b34976b6 794 FALSE, /* partial_inplace */
5bd4f169
AM
795 0, /* src_mask */
796 0xffff, /* dst_mask */
b34976b6 797 FALSE), /* pcrel_offset */
5bd4f169
AM
798
799 /* 16-bit upper half adjusted section relative relocation. */
800 HOWTO (R_PPC64_SECTOFF_HA, /* type */
801 16, /* rightshift */
802 1, /* size (0 = byte, 1 = short, 2 = long) */
803 16, /* bitsize */
b34976b6 804 FALSE, /* pc_relative */
5bd4f169 805 0, /* bitpos */
f9c6b907 806 complain_overflow_signed, /* complain_on_overflow */
805fc799 807 ppc64_elf_sectoff_ha_reloc, /* special_function */
5bd4f169 808 "R_PPC64_SECTOFF_HA", /* name */
b34976b6 809 FALSE, /* partial_inplace */
5bd4f169
AM
810 0, /* src_mask */
811 0xffff, /* dst_mask */
b34976b6 812 FALSE), /* pcrel_offset */
5bd4f169 813
04c9666a
AM
814 /* Like R_PPC64_REL24 without touching the two least significant bits. */
815 HOWTO (R_PPC64_REL30, /* type */
5bd4f169
AM
816 2, /* rightshift */
817 2, /* size (0 = byte, 1 = short, 2 = long) */
818 30, /* bitsize */
b34976b6 819 TRUE, /* pc_relative */
5bd4f169
AM
820 0, /* bitpos */
821 complain_overflow_dont, /* complain_on_overflow */
822 bfd_elf_generic_reloc, /* special_function */
04c9666a 823 "R_PPC64_REL30", /* name */
b34976b6 824 FALSE, /* partial_inplace */
d006db6c 825 0, /* src_mask */
5bd4f169 826 0xfffffffc, /* dst_mask */
b34976b6 827 TRUE), /* pcrel_offset */
5bd4f169
AM
828
829 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
830
831 /* A standard 64-bit relocation. */
832 HOWTO (R_PPC64_ADDR64, /* type */
833 0, /* rightshift */
834 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
835 64, /* bitsize */
b34976b6 836 FALSE, /* pc_relative */
5bd4f169
AM
837 0, /* bitpos */
838 complain_overflow_dont, /* complain_on_overflow */
839 bfd_elf_generic_reloc, /* special_function */
840 "R_PPC64_ADDR64", /* name */
b34976b6 841 FALSE, /* partial_inplace */
5bd4f169 842 0, /* src_mask */
f5e87a1d 843 ONES (64), /* dst_mask */
b34976b6 844 FALSE), /* pcrel_offset */
5bd4f169
AM
845
846 /* The bits 32-47 of an address. */
847 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
848 32, /* rightshift */
849 1, /* size (0 = byte, 1 = short, 2 = long) */
850 16, /* bitsize */
b34976b6 851 FALSE, /* pc_relative */
5bd4f169
AM
852 0, /* bitpos */
853 complain_overflow_dont, /* complain_on_overflow */
854 bfd_elf_generic_reloc, /* special_function */
855 "R_PPC64_ADDR16_HIGHER", /* name */
b34976b6 856 FALSE, /* partial_inplace */
5bd4f169
AM
857 0, /* src_mask */
858 0xffff, /* dst_mask */
b34976b6 859 FALSE), /* pcrel_offset */
5bd4f169
AM
860
861 /* The bits 32-47 of an address, plus 1 if the contents of the low
862 16 bits, treated as a signed number, is negative. */
863 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
864 32, /* rightshift */
865 1, /* size (0 = byte, 1 = short, 2 = long) */
866 16, /* bitsize */
b34976b6 867 FALSE, /* pc_relative */
5bd4f169
AM
868 0, /* bitpos */
869 complain_overflow_dont, /* complain_on_overflow */
805fc799 870 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 871 "R_PPC64_ADDR16_HIGHERA", /* name */
b34976b6 872 FALSE, /* partial_inplace */
5bd4f169
AM
873 0, /* src_mask */
874 0xffff, /* dst_mask */
b34976b6 875 FALSE), /* pcrel_offset */
5bd4f169
AM
876
877 /* The bits 48-63 of an address. */
878 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
879 48, /* rightshift */
880 1, /* size (0 = byte, 1 = short, 2 = long) */
881 16, /* bitsize */
b34976b6 882 FALSE, /* pc_relative */
5bd4f169
AM
883 0, /* bitpos */
884 complain_overflow_dont, /* complain_on_overflow */
885 bfd_elf_generic_reloc, /* special_function */
886 "R_PPC64_ADDR16_HIGHEST", /* name */
b34976b6 887 FALSE, /* partial_inplace */
5bd4f169
AM
888 0, /* src_mask */
889 0xffff, /* dst_mask */
b34976b6 890 FALSE), /* pcrel_offset */
5bd4f169
AM
891
892 /* The bits 48-63 of an address, plus 1 if the contents of the low
893 16 bits, treated as a signed number, is negative. */
894 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
895 48, /* rightshift */
896 1, /* size (0 = byte, 1 = short, 2 = long) */
897 16, /* bitsize */
b34976b6 898 FALSE, /* pc_relative */
5bd4f169
AM
899 0, /* bitpos */
900 complain_overflow_dont, /* complain_on_overflow */
805fc799 901 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 902 "R_PPC64_ADDR16_HIGHESTA", /* name */
b34976b6 903 FALSE, /* partial_inplace */
5bd4f169
AM
904 0, /* src_mask */
905 0xffff, /* dst_mask */
b34976b6 906 FALSE), /* pcrel_offset */
5bd4f169
AM
907
908 /* Like ADDR64, but may be unaligned. */
909 HOWTO (R_PPC64_UADDR64, /* type */
910 0, /* rightshift */
911 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
912 64, /* bitsize */
b34976b6 913 FALSE, /* pc_relative */
5bd4f169
AM
914 0, /* bitpos */
915 complain_overflow_dont, /* complain_on_overflow */
916 bfd_elf_generic_reloc, /* special_function */
917 "R_PPC64_UADDR64", /* name */
b34976b6 918 FALSE, /* partial_inplace */
5bd4f169 919 0, /* src_mask */
f5e87a1d 920 ONES (64), /* dst_mask */
b34976b6 921 FALSE), /* pcrel_offset */
5bd4f169
AM
922
923 /* 64-bit relative relocation. */
924 HOWTO (R_PPC64_REL64, /* type */
925 0, /* rightshift */
926 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
927 64, /* bitsize */
b34976b6 928 TRUE, /* pc_relative */
5bd4f169
AM
929 0, /* bitpos */
930 complain_overflow_dont, /* complain_on_overflow */
931 bfd_elf_generic_reloc, /* special_function */
932 "R_PPC64_REL64", /* name */
b34976b6 933 FALSE, /* partial_inplace */
5bd4f169 934 0, /* src_mask */
f5e87a1d 935 ONES (64), /* dst_mask */
b34976b6 936 TRUE), /* pcrel_offset */
5bd4f169 937
cedb70c5 938 /* 64-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
939 HOWTO (R_PPC64_PLT64, /* type */
940 0, /* rightshift */
941 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
942 64, /* bitsize */
b34976b6 943 FALSE, /* pc_relative */
5bd4f169
AM
944 0, /* bitpos */
945 complain_overflow_dont, /* complain_on_overflow */
805fc799 946 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 947 "R_PPC64_PLT64", /* name */
b34976b6 948 FALSE, /* partial_inplace */
5bd4f169 949 0, /* src_mask */
f5e87a1d 950 ONES (64), /* dst_mask */
b34976b6 951 FALSE), /* pcrel_offset */
5bd4f169
AM
952
953 /* 64-bit PC relative relocation to the symbol's procedure linkage
954 table. */
955 /* FIXME: R_PPC64_PLTREL64 not supported. */
956 HOWTO (R_PPC64_PLTREL64, /* type */
957 0, /* rightshift */
958 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
959 64, /* bitsize */
b34976b6 960 TRUE, /* pc_relative */
5bd4f169
AM
961 0, /* bitpos */
962 complain_overflow_dont, /* complain_on_overflow */
805fc799 963 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 964 "R_PPC64_PLTREL64", /* name */
b34976b6 965 FALSE, /* partial_inplace */
5bd4f169 966 0, /* src_mask */
f5e87a1d 967 ONES (64), /* dst_mask */
b34976b6 968 TRUE), /* pcrel_offset */
5bd4f169
AM
969
970 /* 16 bit TOC-relative relocation. */
971
972 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
973 HOWTO (R_PPC64_TOC16, /* type */
974 0, /* rightshift */
975 1, /* size (0 = byte, 1 = short, 2 = long) */
976 16, /* bitsize */
b34976b6 977 FALSE, /* pc_relative */
5bd4f169
AM
978 0, /* bitpos */
979 complain_overflow_signed, /* complain_on_overflow */
805fc799 980 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 981 "R_PPC64_TOC16", /* name */
b34976b6 982 FALSE, /* partial_inplace */
5bd4f169
AM
983 0, /* src_mask */
984 0xffff, /* dst_mask */
b34976b6 985 FALSE), /* pcrel_offset */
5bd4f169
AM
986
987 /* 16 bit TOC-relative relocation without overflow. */
988
989 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
990 HOWTO (R_PPC64_TOC16_LO, /* type */
991 0, /* rightshift */
992 1, /* size (0 = byte, 1 = short, 2 = long) */
993 16, /* bitsize */
b34976b6 994 FALSE, /* pc_relative */
5bd4f169
AM
995 0, /* bitpos */
996 complain_overflow_dont, /* complain_on_overflow */
805fc799 997 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 998 "R_PPC64_TOC16_LO", /* name */
b34976b6 999 FALSE, /* partial_inplace */
5bd4f169
AM
1000 0, /* src_mask */
1001 0xffff, /* dst_mask */
b34976b6 1002 FALSE), /* pcrel_offset */
5bd4f169
AM
1003
1004 /* 16 bit TOC-relative relocation, high 16 bits. */
1005
1006 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
1007 HOWTO (R_PPC64_TOC16_HI, /* type */
1008 16, /* rightshift */
1009 1, /* size (0 = byte, 1 = short, 2 = long) */
1010 16, /* bitsize */
b34976b6 1011 FALSE, /* pc_relative */
5bd4f169 1012 0, /* bitpos */
f9c6b907 1013 complain_overflow_signed, /* complain_on_overflow */
805fc799 1014 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 1015 "R_PPC64_TOC16_HI", /* name */
b34976b6 1016 FALSE, /* partial_inplace */
5bd4f169
AM
1017 0, /* src_mask */
1018 0xffff, /* dst_mask */
b34976b6 1019 FALSE), /* pcrel_offset */
5bd4f169
AM
1020
1021 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
1022 contents of the low 16 bits, treated as a signed number, is
1023 negative. */
1024
1025 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
1026 HOWTO (R_PPC64_TOC16_HA, /* type */
1027 16, /* rightshift */
1028 1, /* size (0 = byte, 1 = short, 2 = long) */
1029 16, /* bitsize */
b34976b6 1030 FALSE, /* pc_relative */
5bd4f169 1031 0, /* bitpos */
f9c6b907 1032 complain_overflow_signed, /* complain_on_overflow */
805fc799 1033 ppc64_elf_toc_ha_reloc, /* special_function */
5bd4f169 1034 "R_PPC64_TOC16_HA", /* name */
b34976b6 1035 FALSE, /* partial_inplace */
5bd4f169
AM
1036 0, /* src_mask */
1037 0xffff, /* dst_mask */
b34976b6 1038 FALSE), /* pcrel_offset */
5bd4f169
AM
1039
1040 /* 64-bit relocation; insert value of TOC base (.TOC.). */
1041
1042 /* R_PPC64_TOC 51 doubleword64 .TOC. */
1043 HOWTO (R_PPC64_TOC, /* type */
1044 0, /* rightshift */
1045 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1046 64, /* bitsize */
b34976b6 1047 FALSE, /* pc_relative */
5bd4f169 1048 0, /* bitpos */
b80eed39 1049 complain_overflow_dont, /* complain_on_overflow */
805fc799 1050 ppc64_elf_toc64_reloc, /* special_function */
5bd4f169 1051 "R_PPC64_TOC", /* name */
b34976b6 1052 FALSE, /* partial_inplace */
5bd4f169 1053 0, /* src_mask */
f5e87a1d 1054 ONES (64), /* dst_mask */
b34976b6 1055 FALSE), /* pcrel_offset */
5bd4f169
AM
1056
1057 /* Like R_PPC64_GOT16, but also informs the link editor that the
1058 value to relocate may (!) refer to a PLT entry which the link
1059 editor (a) may replace with the symbol value. If the link editor
1060 is unable to fully resolve the symbol, it may (b) create a PLT
1061 entry and store the address to the new PLT entry in the GOT.
1062 This permits lazy resolution of function symbols at run time.
1063 The link editor may also skip all of this and just (c) emit a
1064 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
1065 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
1066 HOWTO (R_PPC64_PLTGOT16, /* type */
1067 0, /* rightshift */
1068 1, /* size (0 = byte, 1 = short, 2 = long) */
1069 16, /* bitsize */
b34976b6 1070 FALSE, /* pc_relative */
5bd4f169
AM
1071 0, /* bitpos */
1072 complain_overflow_signed, /* complain_on_overflow */
805fc799 1073 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb
AM
1074 "R_PPC64_PLTGOT16", /* name */
1075 FALSE, /* partial_inplace */
1076 0, /* src_mask */
1077 0xffff, /* dst_mask */
1078 FALSE), /* pcrel_offset */
1079
1080 /* Like R_PPC64_PLTGOT16, but without overflow. */
1081 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1082 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1083 0, /* rightshift */
1084 1, /* size (0 = byte, 1 = short, 2 = long) */
1085 16, /* bitsize */
1086 FALSE, /* pc_relative */
1087 0, /* bitpos */
1088 complain_overflow_dont, /* complain_on_overflow */
1089 ppc64_elf_unhandled_reloc, /* special_function */
1090 "R_PPC64_PLTGOT16_LO", /* name */
1091 FALSE, /* partial_inplace */
1092 0, /* src_mask */
1093 0xffff, /* dst_mask */
1094 FALSE), /* pcrel_offset */
1095
1096 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1097 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1098 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1099 16, /* rightshift */
1100 1, /* size (0 = byte, 1 = short, 2 = long) */
1101 16, /* bitsize */
1102 FALSE, /* pc_relative */
1103 0, /* bitpos */
f9c6b907 1104 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1105 ppc64_elf_unhandled_reloc, /* special_function */
1106 "R_PPC64_PLTGOT16_HI", /* name */
1107 FALSE, /* partial_inplace */
1108 0, /* src_mask */
1109 0xffff, /* dst_mask */
1110 FALSE), /* pcrel_offset */
1111
1112 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1113 1 if the contents of the low 16 bits, treated as a signed number,
1114 is negative. */
1115 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1116 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1117 16, /* rightshift */
1118 1, /* size (0 = byte, 1 = short, 2 = long) */
1119 16, /* bitsize */
1120 FALSE, /* pc_relative */
1121 0, /* bitpos */
f9c6b907 1122 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1123 ppc64_elf_unhandled_reloc, /* special_function */
1124 "R_PPC64_PLTGOT16_HA", /* name */
1125 FALSE, /* partial_inplace */
1126 0, /* src_mask */
1127 0xffff, /* dst_mask */
1128 FALSE), /* pcrel_offset */
1129
1130 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1131 HOWTO (R_PPC64_ADDR16_DS, /* type */
1132 0, /* rightshift */
1133 1, /* size (0 = byte, 1 = short, 2 = long) */
1134 16, /* bitsize */
1135 FALSE, /* pc_relative */
1136 0, /* bitpos */
b80eed39 1137 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1138 bfd_elf_generic_reloc, /* special_function */
1139 "R_PPC64_ADDR16_DS", /* name */
1140 FALSE, /* partial_inplace */
1141 0, /* src_mask */
1142 0xfffc, /* dst_mask */
1143 FALSE), /* pcrel_offset */
1144
1145 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1146 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1147 0, /* rightshift */
1148 1, /* size (0 = byte, 1 = short, 2 = long) */
1149 16, /* bitsize */
1150 FALSE, /* pc_relative */
1151 0, /* bitpos */
1152 complain_overflow_dont,/* complain_on_overflow */
1153 bfd_elf_generic_reloc, /* special_function */
1154 "R_PPC64_ADDR16_LO_DS",/* name */
1155 FALSE, /* partial_inplace */
1156 0, /* src_mask */
1157 0xfffc, /* dst_mask */
1158 FALSE), /* pcrel_offset */
1159
1160 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1161 HOWTO (R_PPC64_GOT16_DS, /* type */
1162 0, /* rightshift */
1163 1, /* size (0 = byte, 1 = short, 2 = long) */
1164 16, /* bitsize */
1165 FALSE, /* pc_relative */
1166 0, /* bitpos */
1167 complain_overflow_signed, /* complain_on_overflow */
1168 ppc64_elf_unhandled_reloc, /* special_function */
1169 "R_PPC64_GOT16_DS", /* name */
1170 FALSE, /* partial_inplace */
1171 0, /* src_mask */
1172 0xfffc, /* dst_mask */
1173 FALSE), /* pcrel_offset */
1174
1175 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1176 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1177 0, /* rightshift */
1178 1, /* size (0 = byte, 1 = short, 2 = long) */
1179 16, /* bitsize */
1180 FALSE, /* pc_relative */
1181 0, /* bitpos */
1182 complain_overflow_dont, /* complain_on_overflow */
1183 ppc64_elf_unhandled_reloc, /* special_function */
1184 "R_PPC64_GOT16_LO_DS", /* name */
1185 FALSE, /* partial_inplace */
1186 0, /* src_mask */
1187 0xfffc, /* dst_mask */
1188 FALSE), /* pcrel_offset */
1189
1190 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1191 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1192 0, /* rightshift */
1193 1, /* size (0 = byte, 1 = short, 2 = long) */
1194 16, /* bitsize */
1195 FALSE, /* pc_relative */
1196 0, /* bitpos */
1197 complain_overflow_dont, /* complain_on_overflow */
1198 ppc64_elf_unhandled_reloc, /* special_function */
1199 "R_PPC64_PLT16_LO_DS", /* name */
1200 FALSE, /* partial_inplace */
1201 0, /* src_mask */
1202 0xfffc, /* dst_mask */
1203 FALSE), /* pcrel_offset */
1204
1205 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1206 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1207 0, /* rightshift */
1208 1, /* size (0 = byte, 1 = short, 2 = long) */
1209 16, /* bitsize */
1210 FALSE, /* pc_relative */
1211 0, /* bitpos */
b80eed39 1212 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1213 ppc64_elf_sectoff_reloc, /* special_function */
1214 "R_PPC64_SECTOFF_DS", /* name */
1215 FALSE, /* partial_inplace */
1216 0, /* src_mask */
1217 0xfffc, /* dst_mask */
1218 FALSE), /* pcrel_offset */
1219
1220 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1221 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1222 0, /* rightshift */
1223 1, /* size (0 = byte, 1 = short, 2 = long) */
1224 16, /* bitsize */
1225 FALSE, /* pc_relative */
1226 0, /* bitpos */
1227 complain_overflow_dont, /* complain_on_overflow */
1228 ppc64_elf_sectoff_reloc, /* special_function */
1229 "R_PPC64_SECTOFF_LO_DS",/* name */
1230 FALSE, /* partial_inplace */
1231 0, /* src_mask */
1232 0xfffc, /* dst_mask */
1233 FALSE), /* pcrel_offset */
1234
1235 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1236 HOWTO (R_PPC64_TOC16_DS, /* type */
1237 0, /* rightshift */
1238 1, /* size (0 = byte, 1 = short, 2 = long) */
1239 16, /* bitsize */
1240 FALSE, /* pc_relative */
1241 0, /* bitpos */
1242 complain_overflow_signed, /* complain_on_overflow */
1243 ppc64_elf_toc_reloc, /* special_function */
1244 "R_PPC64_TOC16_DS", /* name */
1245 FALSE, /* partial_inplace */
1246 0, /* src_mask */
1247 0xfffc, /* dst_mask */
1248 FALSE), /* pcrel_offset */
1249
1250 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1251 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1252 0, /* rightshift */
1253 1, /* size (0 = byte, 1 = short, 2 = long) */
1254 16, /* bitsize */
1255 FALSE, /* pc_relative */
1256 0, /* bitpos */
1257 complain_overflow_dont, /* complain_on_overflow */
1258 ppc64_elf_toc_reloc, /* special_function */
1259 "R_PPC64_TOC16_LO_DS", /* name */
1260 FALSE, /* partial_inplace */
1261 0, /* src_mask */
1262 0xfffc, /* dst_mask */
1263 FALSE), /* pcrel_offset */
1264
1265 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1266 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
6bfdb61b 1267 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
411e1bfb
AM
1268 0, /* rightshift */
1269 1, /* size (0 = byte, 1 = short, 2 = long) */
1270 16, /* bitsize */
1271 FALSE, /* pc_relative */
1272 0, /* bitpos */
1273 complain_overflow_signed, /* complain_on_overflow */
1274 ppc64_elf_unhandled_reloc, /* special_function */
1275 "R_PPC64_PLTGOT16_DS", /* name */
1276 FALSE, /* partial_inplace */
1277 0, /* src_mask */
1278 0xfffc, /* dst_mask */
1279 FALSE), /* pcrel_offset */
1280
1281 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1282 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1283 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1284 0, /* rightshift */
1285 1, /* size (0 = byte, 1 = short, 2 = long) */
1286 16, /* bitsize */
1287 FALSE, /* pc_relative */
1288 0, /* bitpos */
1289 complain_overflow_dont, /* complain_on_overflow */
1290 ppc64_elf_unhandled_reloc, /* special_function */
1291 "R_PPC64_PLTGOT16_LO_DS",/* name */
1292 FALSE, /* partial_inplace */
1293 0, /* src_mask */
1294 0xfffc, /* dst_mask */
1295 FALSE), /* pcrel_offset */
1296
727fc41e 1297 /* Marker relocs for TLS. */
411e1bfb
AM
1298 HOWTO (R_PPC64_TLS,
1299 0, /* rightshift */
1300 2, /* size (0 = byte, 1 = short, 2 = long) */
1301 32, /* bitsize */
1302 FALSE, /* pc_relative */
1303 0, /* bitpos */
1304 complain_overflow_dont, /* complain_on_overflow */
1305 bfd_elf_generic_reloc, /* special_function */
1306 "R_PPC64_TLS", /* name */
1307 FALSE, /* partial_inplace */
1308 0, /* src_mask */
1309 0, /* dst_mask */
1310 FALSE), /* pcrel_offset */
1311
727fc41e
AM
1312 HOWTO (R_PPC64_TLSGD,
1313 0, /* rightshift */
1314 2, /* size (0 = byte, 1 = short, 2 = long) */
1315 32, /* bitsize */
1316 FALSE, /* pc_relative */
1317 0, /* bitpos */
1318 complain_overflow_dont, /* complain_on_overflow */
1319 bfd_elf_generic_reloc, /* special_function */
1320 "R_PPC64_TLSGD", /* name */
1321 FALSE, /* partial_inplace */
1322 0, /* src_mask */
1323 0, /* dst_mask */
1324 FALSE), /* pcrel_offset */
1325
1326 HOWTO (R_PPC64_TLSLD,
1327 0, /* rightshift */
1328 2, /* size (0 = byte, 1 = short, 2 = long) */
1329 32, /* bitsize */
1330 FALSE, /* pc_relative */
1331 0, /* bitpos */
1332 complain_overflow_dont, /* complain_on_overflow */
1333 bfd_elf_generic_reloc, /* special_function */
1334 "R_PPC64_TLSLD", /* name */
1335 FALSE, /* partial_inplace */
1336 0, /* src_mask */
1337 0, /* dst_mask */
1338 FALSE), /* pcrel_offset */
1339
23cedd1d
AM
1340 /* Marker reloc for optimizing r2 save in prologue rather than on
1341 each plt call stub. */
3b421ab3
AM
1342 HOWTO (R_PPC64_TOCSAVE,
1343 0, /* rightshift */
1344 2, /* size (0 = byte, 1 = short, 2 = long) */
1345 32, /* bitsize */
1346 FALSE, /* pc_relative */
1347 0, /* bitpos */
1348 complain_overflow_dont, /* complain_on_overflow */
1349 bfd_elf_generic_reloc, /* special_function */
1350 "R_PPC64_TOCSAVE", /* name */
1351 FALSE, /* partial_inplace */
1352 0, /* src_mask */
1353 0, /* dst_mask */
1354 FALSE), /* pcrel_offset */
1355
23cedd1d
AM
1356 /* Marker relocs on inline plt call instructions. */
1357 HOWTO (R_PPC64_PLTSEQ,
1358 0, /* rightshift */
1359 2, /* size (0 = byte, 1 = short, 2 = long) */
1360 32, /* bitsize */
1361 FALSE, /* pc_relative */
1362 0, /* bitpos */
1363 complain_overflow_dont, /* complain_on_overflow */
1364 bfd_elf_generic_reloc, /* special_function */
1365 "R_PPC64_PLTSEQ", /* name */
1366 FALSE, /* partial_inplace */
1367 0, /* src_mask */
1368 0, /* dst_mask */
1369 FALSE), /* pcrel_offset */
1370
1371 HOWTO (R_PPC64_PLTCALL,
1372 0, /* rightshift */
1373 2, /* size (0 = byte, 1 = short, 2 = long) */
1374 32, /* bitsize */
1375 FALSE, /* pc_relative */
1376 0, /* bitpos */
1377 complain_overflow_dont, /* complain_on_overflow */
1378 bfd_elf_generic_reloc, /* special_function */
1379 "R_PPC64_PLTCALL", /* name */
1380 FALSE, /* partial_inplace */
1381 0, /* src_mask */
1382 0, /* dst_mask */
1383 FALSE), /* pcrel_offset */
1384
411e1bfb
AM
1385 /* Computes the load module index of the load module that contains the
1386 definition of its TLS sym. */
1387 HOWTO (R_PPC64_DTPMOD64,
1388 0, /* rightshift */
1389 4, /* size (0 = byte, 1 = short, 2 = long) */
1390 64, /* bitsize */
1391 FALSE, /* pc_relative */
1392 0, /* bitpos */
1393 complain_overflow_dont, /* complain_on_overflow */
1394 ppc64_elf_unhandled_reloc, /* special_function */
1395 "R_PPC64_DTPMOD64", /* name */
1396 FALSE, /* partial_inplace */
1397 0, /* src_mask */
1398 ONES (64), /* dst_mask */
1399 FALSE), /* pcrel_offset */
1400
1401 /* Computes a dtv-relative displacement, the difference between the value
1402 of sym+add and the base address of the thread-local storage block that
1403 contains the definition of sym, minus 0x8000. */
1404 HOWTO (R_PPC64_DTPREL64,
1405 0, /* rightshift */
1406 4, /* size (0 = byte, 1 = short, 2 = long) */
1407 64, /* bitsize */
1408 FALSE, /* pc_relative */
1409 0, /* bitpos */
1410 complain_overflow_dont, /* complain_on_overflow */
1411 ppc64_elf_unhandled_reloc, /* special_function */
1412 "R_PPC64_DTPREL64", /* name */
1413 FALSE, /* partial_inplace */
1414 0, /* src_mask */
1415 ONES (64), /* dst_mask */
1416 FALSE), /* pcrel_offset */
1417
1418 /* A 16 bit dtprel reloc. */
1419 HOWTO (R_PPC64_DTPREL16,
1420 0, /* rightshift */
1421 1, /* size (0 = byte, 1 = short, 2 = long) */
1422 16, /* bitsize */
1423 FALSE, /* pc_relative */
1424 0, /* bitpos */
1425 complain_overflow_signed, /* complain_on_overflow */
1426 ppc64_elf_unhandled_reloc, /* special_function */
1427 "R_PPC64_DTPREL16", /* name */
1428 FALSE, /* partial_inplace */
1429 0, /* src_mask */
1430 0xffff, /* dst_mask */
1431 FALSE), /* pcrel_offset */
1432
1433 /* Like DTPREL16, but no overflow. */
1434 HOWTO (R_PPC64_DTPREL16_LO,
1435 0, /* rightshift */
1436 1, /* size (0 = byte, 1 = short, 2 = long) */
1437 16, /* bitsize */
1438 FALSE, /* pc_relative */
1439 0, /* bitpos */
1440 complain_overflow_dont, /* complain_on_overflow */
1441 ppc64_elf_unhandled_reloc, /* special_function */
1442 "R_PPC64_DTPREL16_LO", /* name */
1443 FALSE, /* partial_inplace */
1444 0, /* src_mask */
1445 0xffff, /* dst_mask */
1446 FALSE), /* pcrel_offset */
1447
1448 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1449 HOWTO (R_PPC64_DTPREL16_HI,
1450 16, /* rightshift */
1451 1, /* size (0 = byte, 1 = short, 2 = long) */
1452 16, /* bitsize */
1453 FALSE, /* pc_relative */
1454 0, /* bitpos */
f9c6b907 1455 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1456 ppc64_elf_unhandled_reloc, /* special_function */
1457 "R_PPC64_DTPREL16_HI", /* name */
1458 FALSE, /* partial_inplace */
1459 0, /* src_mask */
1460 0xffff, /* dst_mask */
1461 FALSE), /* pcrel_offset */
1462
1463 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1464 HOWTO (R_PPC64_DTPREL16_HA,
1465 16, /* rightshift */
1466 1, /* size (0 = byte, 1 = short, 2 = long) */
1467 16, /* bitsize */
1468 FALSE, /* pc_relative */
1469 0, /* bitpos */
f9c6b907 1470 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1471 ppc64_elf_unhandled_reloc, /* special_function */
1472 "R_PPC64_DTPREL16_HA", /* name */
1473 FALSE, /* partial_inplace */
1474 0, /* src_mask */
1475 0xffff, /* dst_mask */
1476 FALSE), /* pcrel_offset */
1477
1478 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1479 HOWTO (R_PPC64_DTPREL16_HIGHER,
1480 32, /* rightshift */
1481 1, /* size (0 = byte, 1 = short, 2 = long) */
1482 16, /* bitsize */
1483 FALSE, /* pc_relative */
1484 0, /* bitpos */
1485 complain_overflow_dont, /* complain_on_overflow */
1486 ppc64_elf_unhandled_reloc, /* special_function */
1487 "R_PPC64_DTPREL16_HIGHER", /* name */
1488 FALSE, /* partial_inplace */
1489 0, /* src_mask */
1490 0xffff, /* dst_mask */
1491 FALSE), /* pcrel_offset */
1492
1493 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1494 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1495 32, /* rightshift */
1496 1, /* size (0 = byte, 1 = short, 2 = long) */
1497 16, /* bitsize */
1498 FALSE, /* pc_relative */
1499 0, /* bitpos */
1500 complain_overflow_dont, /* complain_on_overflow */
1501 ppc64_elf_unhandled_reloc, /* special_function */
1502 "R_PPC64_DTPREL16_HIGHERA", /* name */
1503 FALSE, /* partial_inplace */
1504 0, /* src_mask */
1505 0xffff, /* dst_mask */
1506 FALSE), /* pcrel_offset */
1507
1508 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1509 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1510 48, /* rightshift */
1511 1, /* size (0 = byte, 1 = short, 2 = long) */
1512 16, /* bitsize */
1513 FALSE, /* pc_relative */
1514 0, /* bitpos */
1515 complain_overflow_dont, /* complain_on_overflow */
1516 ppc64_elf_unhandled_reloc, /* special_function */
1517 "R_PPC64_DTPREL16_HIGHEST", /* name */
1518 FALSE, /* partial_inplace */
1519 0, /* src_mask */
1520 0xffff, /* dst_mask */
1521 FALSE), /* pcrel_offset */
1522
1523 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1524 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1525 48, /* rightshift */
1526 1, /* size (0 = byte, 1 = short, 2 = long) */
1527 16, /* bitsize */
1528 FALSE, /* pc_relative */
1529 0, /* bitpos */
1530 complain_overflow_dont, /* complain_on_overflow */
1531 ppc64_elf_unhandled_reloc, /* special_function */
1532 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1533 FALSE, /* partial_inplace */
1534 0, /* src_mask */
1535 0xffff, /* dst_mask */
1536 FALSE), /* pcrel_offset */
1537
1538 /* Like DTPREL16, but for insns with a DS field. */
1539 HOWTO (R_PPC64_DTPREL16_DS,
1540 0, /* rightshift */
1541 1, /* size (0 = byte, 1 = short, 2 = long) */
1542 16, /* bitsize */
1543 FALSE, /* pc_relative */
1544 0, /* bitpos */
1545 complain_overflow_signed, /* complain_on_overflow */
1546 ppc64_elf_unhandled_reloc, /* special_function */
1547 "R_PPC64_DTPREL16_DS", /* name */
1548 FALSE, /* partial_inplace */
1549 0, /* src_mask */
1550 0xfffc, /* dst_mask */
1551 FALSE), /* pcrel_offset */
1552
1553 /* Like DTPREL16_DS, but no overflow. */
1554 HOWTO (R_PPC64_DTPREL16_LO_DS,
1555 0, /* rightshift */
1556 1, /* size (0 = byte, 1 = short, 2 = long) */
1557 16, /* bitsize */
1558 FALSE, /* pc_relative */
1559 0, /* bitpos */
1560 complain_overflow_dont, /* complain_on_overflow */
1561 ppc64_elf_unhandled_reloc, /* special_function */
1562 "R_PPC64_DTPREL16_LO_DS", /* name */
1563 FALSE, /* partial_inplace */
1564 0, /* src_mask */
1565 0xfffc, /* dst_mask */
1566 FALSE), /* pcrel_offset */
1567
1568 /* Computes a tp-relative displacement, the difference between the value of
1569 sym+add and the value of the thread pointer (r13). */
1570 HOWTO (R_PPC64_TPREL64,
1571 0, /* rightshift */
1572 4, /* size (0 = byte, 1 = short, 2 = long) */
1573 64, /* bitsize */
1574 FALSE, /* pc_relative */
1575 0, /* bitpos */
1576 complain_overflow_dont, /* complain_on_overflow */
1577 ppc64_elf_unhandled_reloc, /* special_function */
1578 "R_PPC64_TPREL64", /* name */
1579 FALSE, /* partial_inplace */
1580 0, /* src_mask */
1581 ONES (64), /* dst_mask */
1582 FALSE), /* pcrel_offset */
1583
1584 /* A 16 bit tprel reloc. */
1585 HOWTO (R_PPC64_TPREL16,
1586 0, /* rightshift */
1587 1, /* size (0 = byte, 1 = short, 2 = long) */
1588 16, /* bitsize */
1589 FALSE, /* pc_relative */
1590 0, /* bitpos */
1591 complain_overflow_signed, /* complain_on_overflow */
1592 ppc64_elf_unhandled_reloc, /* special_function */
1593 "R_PPC64_TPREL16", /* name */
1594 FALSE, /* partial_inplace */
1595 0, /* src_mask */
1596 0xffff, /* dst_mask */
1597 FALSE), /* pcrel_offset */
1598
1599 /* Like TPREL16, but no overflow. */
1600 HOWTO (R_PPC64_TPREL16_LO,
1601 0, /* rightshift */
1602 1, /* size (0 = byte, 1 = short, 2 = long) */
1603 16, /* bitsize */
1604 FALSE, /* pc_relative */
1605 0, /* bitpos */
1606 complain_overflow_dont, /* complain_on_overflow */
1607 ppc64_elf_unhandled_reloc, /* special_function */
1608 "R_PPC64_TPREL16_LO", /* name */
1609 FALSE, /* partial_inplace */
1610 0, /* src_mask */
1611 0xffff, /* dst_mask */
1612 FALSE), /* pcrel_offset */
1613
1614 /* Like TPREL16_LO, but next higher group of 16 bits. */
1615 HOWTO (R_PPC64_TPREL16_HI,
1616 16, /* rightshift */
1617 1, /* size (0 = byte, 1 = short, 2 = long) */
1618 16, /* bitsize */
1619 FALSE, /* pc_relative */
1620 0, /* bitpos */
f9c6b907 1621 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1622 ppc64_elf_unhandled_reloc, /* special_function */
1623 "R_PPC64_TPREL16_HI", /* name */
1624 FALSE, /* partial_inplace */
1625 0, /* src_mask */
1626 0xffff, /* dst_mask */
1627 FALSE), /* pcrel_offset */
1628
1629 /* Like TPREL16_HI, but adjust for low 16 bits. */
1630 HOWTO (R_PPC64_TPREL16_HA,
1631 16, /* rightshift */
1632 1, /* size (0 = byte, 1 = short, 2 = long) */
1633 16, /* bitsize */
1634 FALSE, /* pc_relative */
1635 0, /* bitpos */
f9c6b907 1636 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1637 ppc64_elf_unhandled_reloc, /* special_function */
1638 "R_PPC64_TPREL16_HA", /* name */
1639 FALSE, /* partial_inplace */
1640 0, /* src_mask */
1641 0xffff, /* dst_mask */
1642 FALSE), /* pcrel_offset */
1643
1644 /* Like TPREL16_HI, but next higher group of 16 bits. */
1645 HOWTO (R_PPC64_TPREL16_HIGHER,
1646 32, /* rightshift */
1647 1, /* size (0 = byte, 1 = short, 2 = long) */
1648 16, /* bitsize */
1649 FALSE, /* pc_relative */
1650 0, /* bitpos */
1651 complain_overflow_dont, /* complain_on_overflow */
1652 ppc64_elf_unhandled_reloc, /* special_function */
1653 "R_PPC64_TPREL16_HIGHER", /* name */
1654 FALSE, /* partial_inplace */
1655 0, /* src_mask */
1656 0xffff, /* dst_mask */
1657 FALSE), /* pcrel_offset */
1658
1659 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1660 HOWTO (R_PPC64_TPREL16_HIGHERA,
1661 32, /* rightshift */
1662 1, /* size (0 = byte, 1 = short, 2 = long) */
1663 16, /* bitsize */
1664 FALSE, /* pc_relative */
1665 0, /* bitpos */
1666 complain_overflow_dont, /* complain_on_overflow */
1667 ppc64_elf_unhandled_reloc, /* special_function */
1668 "R_PPC64_TPREL16_HIGHERA", /* name */
1669 FALSE, /* partial_inplace */
1670 0, /* src_mask */
1671 0xffff, /* dst_mask */
1672 FALSE), /* pcrel_offset */
1673
1674 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1675 HOWTO (R_PPC64_TPREL16_HIGHEST,
1676 48, /* rightshift */
1677 1, /* size (0 = byte, 1 = short, 2 = long) */
1678 16, /* bitsize */
1679 FALSE, /* pc_relative */
1680 0, /* bitpos */
1681 complain_overflow_dont, /* complain_on_overflow */
1682 ppc64_elf_unhandled_reloc, /* special_function */
1683 "R_PPC64_TPREL16_HIGHEST", /* name */
1684 FALSE, /* partial_inplace */
1685 0, /* src_mask */
1686 0xffff, /* dst_mask */
1687 FALSE), /* pcrel_offset */
1688
1689 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1690 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1691 48, /* rightshift */
1692 1, /* size (0 = byte, 1 = short, 2 = long) */
1693 16, /* bitsize */
1694 FALSE, /* pc_relative */
1695 0, /* bitpos */
1696 complain_overflow_dont, /* complain_on_overflow */
1697 ppc64_elf_unhandled_reloc, /* special_function */
1698 "R_PPC64_TPREL16_HIGHESTA", /* name */
1699 FALSE, /* partial_inplace */
1700 0, /* src_mask */
1701 0xffff, /* dst_mask */
1702 FALSE), /* pcrel_offset */
1703
1704 /* Like TPREL16, but for insns with a DS field. */
1705 HOWTO (R_PPC64_TPREL16_DS,
1706 0, /* rightshift */
1707 1, /* size (0 = byte, 1 = short, 2 = long) */
1708 16, /* bitsize */
1709 FALSE, /* pc_relative */
1710 0, /* bitpos */
1711 complain_overflow_signed, /* complain_on_overflow */
1712 ppc64_elf_unhandled_reloc, /* special_function */
1713 "R_PPC64_TPREL16_DS", /* name */
1714 FALSE, /* partial_inplace */
1715 0, /* src_mask */
1716 0xfffc, /* dst_mask */
1717 FALSE), /* pcrel_offset */
1718
1719 /* Like TPREL16_DS, but no overflow. */
1720 HOWTO (R_PPC64_TPREL16_LO_DS,
1721 0, /* rightshift */
1722 1, /* size (0 = byte, 1 = short, 2 = long) */
1723 16, /* bitsize */
1724 FALSE, /* pc_relative */
1725 0, /* bitpos */
1726 complain_overflow_dont, /* complain_on_overflow */
1727 ppc64_elf_unhandled_reloc, /* special_function */
1728 "R_PPC64_TPREL16_LO_DS", /* name */
1729 FALSE, /* partial_inplace */
1730 0, /* src_mask */
1731 0xfffc, /* dst_mask */
1732 FALSE), /* pcrel_offset */
1733
1734 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1735 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1736 to the first entry relative to the TOC base (r2). */
1737 HOWTO (R_PPC64_GOT_TLSGD16,
1738 0, /* rightshift */
1739 1, /* size (0 = byte, 1 = short, 2 = long) */
1740 16, /* bitsize */
1741 FALSE, /* pc_relative */
1742 0, /* bitpos */
1743 complain_overflow_signed, /* complain_on_overflow */
1744 ppc64_elf_unhandled_reloc, /* special_function */
1745 "R_PPC64_GOT_TLSGD16", /* name */
b34976b6 1746 FALSE, /* partial_inplace */
5bd4f169
AM
1747 0, /* src_mask */
1748 0xffff, /* dst_mask */
b34976b6 1749 FALSE), /* pcrel_offset */
5bd4f169 1750
411e1bfb
AM
1751 /* Like GOT_TLSGD16, but no overflow. */
1752 HOWTO (R_PPC64_GOT_TLSGD16_LO,
5bd4f169
AM
1753 0, /* rightshift */
1754 1, /* size (0 = byte, 1 = short, 2 = long) */
1755 16, /* bitsize */
b34976b6 1756 FALSE, /* pc_relative */
5bd4f169
AM
1757 0, /* bitpos */
1758 complain_overflow_dont, /* complain_on_overflow */
805fc799 1759 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1760 "R_PPC64_GOT_TLSGD16_LO", /* name */
b34976b6 1761 FALSE, /* partial_inplace */
5bd4f169
AM
1762 0, /* src_mask */
1763 0xffff, /* dst_mask */
b34976b6 1764 FALSE), /* pcrel_offset */
5bd4f169 1765
411e1bfb
AM
1766 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1767 HOWTO (R_PPC64_GOT_TLSGD16_HI,
5bd4f169
AM
1768 16, /* rightshift */
1769 1, /* size (0 = byte, 1 = short, 2 = long) */
1770 16, /* bitsize */
b34976b6 1771 FALSE, /* pc_relative */
5bd4f169 1772 0, /* bitpos */
f9c6b907 1773 complain_overflow_signed, /* complain_on_overflow */
805fc799 1774 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1775 "R_PPC64_GOT_TLSGD16_HI", /* name */
b34976b6 1776 FALSE, /* partial_inplace */
5bd4f169
AM
1777 0, /* src_mask */
1778 0xffff, /* dst_mask */
b34976b6 1779 FALSE), /* pcrel_offset */
5bd4f169 1780
411e1bfb
AM
1781 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1782 HOWTO (R_PPC64_GOT_TLSGD16_HA,
5bd4f169
AM
1783 16, /* rightshift */
1784 1, /* size (0 = byte, 1 = short, 2 = long) */
1785 16, /* bitsize */
b34976b6 1786 FALSE, /* pc_relative */
5bd4f169 1787 0, /* bitpos */
f9c6b907 1788 complain_overflow_signed, /* complain_on_overflow */
805fc799 1789 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1790 "R_PPC64_GOT_TLSGD16_HA", /* name */
b34976b6 1791 FALSE, /* partial_inplace */
5bd4f169
AM
1792 0, /* src_mask */
1793 0xffff, /* dst_mask */
b34976b6 1794 FALSE), /* pcrel_offset */
5bd4f169 1795
411e1bfb
AM
1796 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1797 with values (sym+add)@dtpmod and zero, and computes the offset to the
1798 first entry relative to the TOC base (r2). */
1799 HOWTO (R_PPC64_GOT_TLSLD16,
5bd4f169
AM
1800 0, /* rightshift */
1801 1, /* size (0 = byte, 1 = short, 2 = long) */
1802 16, /* bitsize */
b34976b6 1803 FALSE, /* pc_relative */
5bd4f169 1804 0, /* bitpos */
411e1bfb
AM
1805 complain_overflow_signed, /* complain_on_overflow */
1806 ppc64_elf_unhandled_reloc, /* special_function */
1807 "R_PPC64_GOT_TLSLD16", /* name */
b34976b6 1808 FALSE, /* partial_inplace */
d006db6c 1809 0, /* src_mask */
411e1bfb 1810 0xffff, /* dst_mask */
b34976b6 1811 FALSE), /* pcrel_offset */
5bd4f169 1812
411e1bfb
AM
1813 /* Like GOT_TLSLD16, but no overflow. */
1814 HOWTO (R_PPC64_GOT_TLSLD16_LO,
5bd4f169
AM
1815 0, /* rightshift */
1816 1, /* size (0 = byte, 1 = short, 2 = long) */
1817 16, /* bitsize */
b34976b6 1818 FALSE, /* pc_relative */
5bd4f169 1819 0, /* bitpos */
411e1bfb
AM
1820 complain_overflow_dont, /* complain_on_overflow */
1821 ppc64_elf_unhandled_reloc, /* special_function */
1822 "R_PPC64_GOT_TLSLD16_LO", /* name */
b34976b6 1823 FALSE, /* partial_inplace */
d006db6c 1824 0, /* src_mask */
411e1bfb 1825 0xffff, /* dst_mask */
b34976b6 1826 FALSE), /* pcrel_offset */
5bd4f169 1827
411e1bfb
AM
1828 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1829 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1830 16, /* rightshift */
5bd4f169
AM
1831 1, /* size (0 = byte, 1 = short, 2 = long) */
1832 16, /* bitsize */
b34976b6 1833 FALSE, /* pc_relative */
5bd4f169 1834 0, /* bitpos */
f9c6b907 1835 complain_overflow_signed, /* complain_on_overflow */
805fc799 1836 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1837 "R_PPC64_GOT_TLSLD16_HI", /* name */
b34976b6 1838 FALSE, /* partial_inplace */
d006db6c 1839 0, /* src_mask */
411e1bfb 1840 0xffff, /* dst_mask */
b34976b6 1841 FALSE), /* pcrel_offset */
5bd4f169 1842
411e1bfb
AM
1843 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1844 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1845 16, /* rightshift */
5bd4f169
AM
1846 1, /* size (0 = byte, 1 = short, 2 = long) */
1847 16, /* bitsize */
b34976b6 1848 FALSE, /* pc_relative */
5bd4f169 1849 0, /* bitpos */
f9c6b907 1850 complain_overflow_signed, /* complain_on_overflow */
805fc799 1851 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1852 "R_PPC64_GOT_TLSLD16_HA", /* name */
b34976b6 1853 FALSE, /* partial_inplace */
d006db6c 1854 0, /* src_mask */
411e1bfb 1855 0xffff, /* dst_mask */
b34976b6 1856 FALSE), /* pcrel_offset */
5bd4f169 1857
411e1bfb
AM
1858 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1859 the offset to the entry relative to the TOC base (r2). */
1860 HOWTO (R_PPC64_GOT_DTPREL16_DS,
5bd4f169
AM
1861 0, /* rightshift */
1862 1, /* size (0 = byte, 1 = short, 2 = long) */
1863 16, /* bitsize */
b34976b6 1864 FALSE, /* pc_relative */
5bd4f169 1865 0, /* bitpos */
411e1bfb 1866 complain_overflow_signed, /* complain_on_overflow */
805fc799 1867 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1868 "R_PPC64_GOT_DTPREL16_DS", /* name */
b34976b6 1869 FALSE, /* partial_inplace */
d006db6c 1870 0, /* src_mask */
5bd4f169 1871 0xfffc, /* dst_mask */
b34976b6 1872 FALSE), /* pcrel_offset */
5bd4f169 1873
411e1bfb
AM
1874 /* Like GOT_DTPREL16_DS, but no overflow. */
1875 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
5bd4f169 1876 0, /* rightshift */
c061c2d8
AM
1877 1, /* size (0 = byte, 1 = short, 2 = long) */
1878 16, /* bitsize */
b34976b6 1879 FALSE, /* pc_relative */
5bd4f169 1880 0, /* bitpos */
411e1bfb
AM
1881 complain_overflow_dont, /* complain_on_overflow */
1882 ppc64_elf_unhandled_reloc, /* special_function */
1883 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
b34976b6 1884 FALSE, /* partial_inplace */
d006db6c 1885 0, /* src_mask */
c061c2d8 1886 0xfffc, /* dst_mask */
b34976b6 1887 FALSE), /* pcrel_offset */
5bd4f169 1888
411e1bfb
AM
1889 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1890 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1891 16, /* rightshift */
5bd4f169
AM
1892 1, /* size (0 = byte, 1 = short, 2 = long) */
1893 16, /* bitsize */
b34976b6 1894 FALSE, /* pc_relative */
5bd4f169 1895 0, /* bitpos */
f9c6b907 1896 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1897 ppc64_elf_unhandled_reloc, /* special_function */
1898 "R_PPC64_GOT_DTPREL16_HI", /* name */
b34976b6 1899 FALSE, /* partial_inplace */
d006db6c 1900 0, /* src_mask */
411e1bfb 1901 0xffff, /* dst_mask */
b34976b6 1902 FALSE), /* pcrel_offset */
5bd4f169 1903
411e1bfb
AM
1904 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1905 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1906 16, /* rightshift */
1907 1, /* size (0 = byte, 1 = short, 2 = long) */
1908 16, /* bitsize */
1909 FALSE, /* pc_relative */
1910 0, /* bitpos */
f9c6b907 1911 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1912 ppc64_elf_unhandled_reloc, /* special_function */
1913 "R_PPC64_GOT_DTPREL16_HA", /* name */
1914 FALSE, /* partial_inplace */
1915 0, /* src_mask */
1916 0xffff, /* dst_mask */
1917 FALSE), /* pcrel_offset */
1918
1919 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1920 offset to the entry relative to the TOC base (r2). */
1921 HOWTO (R_PPC64_GOT_TPREL16_DS,
5bd4f169
AM
1922 0, /* rightshift */
1923 1, /* size (0 = byte, 1 = short, 2 = long) */
1924 16, /* bitsize */
b34976b6 1925 FALSE, /* pc_relative */
5bd4f169
AM
1926 0, /* bitpos */
1927 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1928 ppc64_elf_unhandled_reloc, /* special_function */
1929 "R_PPC64_GOT_TPREL16_DS", /* name */
b34976b6 1930 FALSE, /* partial_inplace */
d006db6c 1931 0, /* src_mask */
ad8e1ba5 1932 0xfffc, /* dst_mask */
b34976b6 1933 FALSE), /* pcrel_offset */
5bd4f169 1934
411e1bfb
AM
1935 /* Like GOT_TPREL16_DS, but no overflow. */
1936 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
5bd4f169
AM
1937 0, /* rightshift */
1938 1, /* size (0 = byte, 1 = short, 2 = long) */
1939 16, /* bitsize */
b34976b6 1940 FALSE, /* pc_relative */
5bd4f169
AM
1941 0, /* bitpos */
1942 complain_overflow_dont, /* complain_on_overflow */
411e1bfb
AM
1943 ppc64_elf_unhandled_reloc, /* special_function */
1944 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
b34976b6 1945 FALSE, /* partial_inplace */
d006db6c 1946 0, /* src_mask */
ad8e1ba5 1947 0xfffc, /* dst_mask */
b34976b6 1948 FALSE), /* pcrel_offset */
5bd4f169 1949
411e1bfb
AM
1950 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1951 HOWTO (R_PPC64_GOT_TPREL16_HI,
1952 16, /* rightshift */
5bd4f169
AM
1953 1, /* size (0 = byte, 1 = short, 2 = long) */
1954 16, /* bitsize */
b34976b6 1955 FALSE, /* pc_relative */
5bd4f169 1956 0, /* bitpos */
f9c6b907 1957 complain_overflow_signed, /* complain_on_overflow */
805fc799 1958 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1959 "R_PPC64_GOT_TPREL16_HI", /* name */
b34976b6 1960 FALSE, /* partial_inplace */
d006db6c 1961 0, /* src_mask */
411e1bfb 1962 0xffff, /* dst_mask */
b34976b6 1963 FALSE), /* pcrel_offset */
5bd4f169 1964
411e1bfb
AM
1965 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1966 HOWTO (R_PPC64_GOT_TPREL16_HA,
1967 16, /* rightshift */
5bd4f169
AM
1968 1, /* size (0 = byte, 1 = short, 2 = long) */
1969 16, /* bitsize */
b34976b6 1970 FALSE, /* pc_relative */
5bd4f169 1971 0, /* bitpos */
f9c6b907 1972 complain_overflow_signed, /* complain_on_overflow */
805fc799 1973 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1974 "R_PPC64_GOT_TPREL16_HA", /* name */
b34976b6 1975 FALSE, /* partial_inplace */
d006db6c 1976 0, /* src_mask */
411e1bfb 1977 0xffff, /* dst_mask */
b34976b6 1978 FALSE), /* pcrel_offset */
5bd4f169 1979
25f23106
AM
1980 HOWTO (R_PPC64_JMP_IREL, /* type */
1981 0, /* rightshift */
1982 0, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1983 0, /* bitsize */
1984 FALSE, /* pc_relative */
1985 0, /* bitpos */
1986 complain_overflow_dont, /* complain_on_overflow */
1987 ppc64_elf_unhandled_reloc, /* special_function */
1988 "R_PPC64_JMP_IREL", /* name */
1989 FALSE, /* partial_inplace */
1990 0, /* src_mask */
1991 0, /* dst_mask */
1992 FALSE), /* pcrel_offset */
1993
e054468f
AM
1994 HOWTO (R_PPC64_IRELATIVE, /* type */
1995 0, /* rightshift */
1996 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1997 64, /* bitsize */
1998 FALSE, /* pc_relative */
1999 0, /* bitpos */
2000 complain_overflow_dont, /* complain_on_overflow */
2001 bfd_elf_generic_reloc, /* special_function */
2002 "R_PPC64_IRELATIVE", /* name */
2003 FALSE, /* partial_inplace */
2004 0, /* src_mask */
2005 ONES (64), /* dst_mask */
2006 FALSE), /* pcrel_offset */
2007
25f23106
AM
2008 /* A 16 bit relative relocation. */
2009 HOWTO (R_PPC64_REL16, /* type */
2010 0, /* rightshift */
2011 1, /* size (0 = byte, 1 = short, 2 = long) */
2012 16, /* bitsize */
2013 TRUE, /* pc_relative */
2014 0, /* bitpos */
b80eed39 2015 complain_overflow_signed, /* complain_on_overflow */
25f23106
AM
2016 bfd_elf_generic_reloc, /* special_function */
2017 "R_PPC64_REL16", /* name */
2018 FALSE, /* partial_inplace */
2019 0, /* src_mask */
2020 0xffff, /* dst_mask */
2021 TRUE), /* pcrel_offset */
2022
2023 /* A 16 bit relative relocation without overflow. */
2024 HOWTO (R_PPC64_REL16_LO, /* type */
2025 0, /* rightshift */
2026 1, /* size (0 = byte, 1 = short, 2 = long) */
2027 16, /* bitsize */
2028 TRUE, /* pc_relative */
2029 0, /* bitpos */
2030 complain_overflow_dont,/* complain_on_overflow */
2031 bfd_elf_generic_reloc, /* special_function */
2032 "R_PPC64_REL16_LO", /* name */
2033 FALSE, /* partial_inplace */
2034 0, /* src_mask */
2035 0xffff, /* dst_mask */
2036 TRUE), /* pcrel_offset */
2037
2038 /* The high order 16 bits of a relative address. */
2039 HOWTO (R_PPC64_REL16_HI, /* type */
2040 16, /* rightshift */
2041 1, /* size (0 = byte, 1 = short, 2 = long) */
2042 16, /* bitsize */
2043 TRUE, /* pc_relative */
2044 0, /* bitpos */
f9c6b907 2045 complain_overflow_signed, /* complain_on_overflow */
25f23106
AM
2046 bfd_elf_generic_reloc, /* special_function */
2047 "R_PPC64_REL16_HI", /* name */
2048 FALSE, /* partial_inplace */
2049 0, /* src_mask */
2050 0xffff, /* dst_mask */
2051 TRUE), /* pcrel_offset */
2052
2053 /* The high order 16 bits of a relative address, plus 1 if the contents of
2054 the low 16 bits, treated as a signed number, is negative. */
2055 HOWTO (R_PPC64_REL16_HA, /* type */
2056 16, /* rightshift */
2057 1, /* size (0 = byte, 1 = short, 2 = long) */
2058 16, /* bitsize */
2059 TRUE, /* pc_relative */
2060 0, /* bitpos */
f9c6b907 2061 complain_overflow_signed, /* complain_on_overflow */
25f23106
AM
2062 ppc64_elf_ha_reloc, /* special_function */
2063 "R_PPC64_REL16_HA", /* name */
2064 FALSE, /* partial_inplace */
2065 0, /* src_mask */
2066 0xffff, /* dst_mask */
2067 TRUE), /* pcrel_offset */
2068
a680de9a
PB
2069 /* Like R_PPC64_REL16_HA but for split field in addpcis. */
2070 HOWTO (R_PPC64_REL16DX_HA, /* type */
2071 16, /* rightshift */
2072 2, /* size (0 = byte, 1 = short, 2 = long) */
2073 16, /* bitsize */
2074 TRUE, /* pc_relative */
2075 0, /* bitpos */
2076 complain_overflow_signed, /* complain_on_overflow */
2077 ppc64_elf_ha_reloc, /* special_function */
2078 "R_PPC64_REL16DX_HA", /* name */
2079 FALSE, /* partial_inplace */
2080 0, /* src_mask */
2081 0x1fffc1, /* dst_mask */
2082 TRUE), /* pcrel_offset */
2083
7ba71655
AM
2084 /* A split-field reloc for addpcis, non-relative (gas internal use only). */
2085 HOWTO (R_PPC64_16DX_HA, /* type */
2086 16, /* rightshift */
2087 2, /* size (0 = byte, 1 = short, 2 = long) */
2088 16, /* bitsize */
2089 FALSE, /* pc_relative */
2090 0, /* bitpos */
2091 complain_overflow_signed, /* complain_on_overflow */
2092 ppc64_elf_ha_reloc, /* special_function */
2093 "R_PPC64_16DX_HA", /* name */
2094 FALSE, /* partial_inplace */
2095 0, /* src_mask */
2096 0x1fffc1, /* dst_mask */
2097 FALSE), /* pcrel_offset */
2098
f9c6b907
AM
2099 /* Like R_PPC64_ADDR16_HI, but no overflow. */
2100 HOWTO (R_PPC64_ADDR16_HIGH, /* type */
2101 16, /* rightshift */
2102 1, /* size (0 = byte, 1 = short, 2 = long) */
2103 16, /* bitsize */
2104 FALSE, /* pc_relative */
2105 0, /* bitpos */
2106 complain_overflow_dont, /* complain_on_overflow */
2107 bfd_elf_generic_reloc, /* special_function */
2108 "R_PPC64_ADDR16_HIGH", /* name */
2109 FALSE, /* partial_inplace */
2110 0, /* src_mask */
2111 0xffff, /* dst_mask */
2112 FALSE), /* pcrel_offset */
2113
2114 /* Like R_PPC64_ADDR16_HA, but no overflow. */
2115 HOWTO (R_PPC64_ADDR16_HIGHA, /* type */
2116 16, /* rightshift */
2117 1, /* size (0 = byte, 1 = short, 2 = long) */
2118 16, /* bitsize */
2119 FALSE, /* pc_relative */
2120 0, /* bitpos */
2121 complain_overflow_dont, /* complain_on_overflow */
2122 ppc64_elf_ha_reloc, /* special_function */
2123 "R_PPC64_ADDR16_HIGHA", /* name */
2124 FALSE, /* partial_inplace */
2125 0, /* src_mask */
2126 0xffff, /* dst_mask */
2127 FALSE), /* pcrel_offset */
2128
2129 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
2130 HOWTO (R_PPC64_DTPREL16_HIGH,
2131 16, /* rightshift */
2132 1, /* size (0 = byte, 1 = short, 2 = long) */
2133 16, /* bitsize */
2134 FALSE, /* pc_relative */
2135 0, /* bitpos */
2136 complain_overflow_dont, /* complain_on_overflow */
2137 ppc64_elf_unhandled_reloc, /* special_function */
2138 "R_PPC64_DTPREL16_HIGH", /* name */
2139 FALSE, /* partial_inplace */
2140 0, /* src_mask */
2141 0xffff, /* dst_mask */
2142 FALSE), /* pcrel_offset */
2143
2144 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
2145 HOWTO (R_PPC64_DTPREL16_HIGHA,
2146 16, /* rightshift */
2147 1, /* size (0 = byte, 1 = short, 2 = long) */
2148 16, /* bitsize */
2149 FALSE, /* pc_relative */
2150 0, /* bitpos */
2151 complain_overflow_dont, /* complain_on_overflow */
2152 ppc64_elf_unhandled_reloc, /* special_function */
2153 "R_PPC64_DTPREL16_HIGHA", /* name */
2154 FALSE, /* partial_inplace */
2155 0, /* src_mask */
2156 0xffff, /* dst_mask */
2157 FALSE), /* pcrel_offset */
2158
2159 /* Like R_PPC64_TPREL16_HI, but no overflow. */
2160 HOWTO (R_PPC64_TPREL16_HIGH,
2161 16, /* rightshift */
2162 1, /* size (0 = byte, 1 = short, 2 = long) */
2163 16, /* bitsize */
2164 FALSE, /* pc_relative */
2165 0, /* bitpos */
2166 complain_overflow_dont, /* complain_on_overflow */
2167 ppc64_elf_unhandled_reloc, /* special_function */
2168 "R_PPC64_TPREL16_HIGH", /* name */
2169 FALSE, /* partial_inplace */
2170 0, /* src_mask */
2171 0xffff, /* dst_mask */
2172 FALSE), /* pcrel_offset */
2173
2174 /* Like R_PPC64_TPREL16_HA, but no overflow. */
2175 HOWTO (R_PPC64_TPREL16_HIGHA,
2176 16, /* rightshift */
2177 1, /* size (0 = byte, 1 = short, 2 = long) */
2178 16, /* bitsize */
2179 FALSE, /* pc_relative */
2180 0, /* bitpos */
2181 complain_overflow_dont, /* complain_on_overflow */
2182 ppc64_elf_unhandled_reloc, /* special_function */
2183 "R_PPC64_TPREL16_HIGHA", /* name */
2184 FALSE, /* partial_inplace */
2185 0, /* src_mask */
2186 0xffff, /* dst_mask */
2187 FALSE), /* pcrel_offset */
2188
006589cf
AM
2189 /* Marker reloc on ELFv2 large-model function entry. */
2190 HOWTO (R_PPC64_ENTRY,
2191 0, /* rightshift */
2192 2, /* size (0 = byte, 1 = short, 2 = long) */
2193 32, /* bitsize */
2194 FALSE, /* pc_relative */
2195 0, /* bitpos */
2196 complain_overflow_dont, /* complain_on_overflow */
2197 bfd_elf_generic_reloc, /* special_function */
2198 "R_PPC64_ENTRY", /* name */
2199 FALSE, /* partial_inplace */
2200 0, /* src_mask */
2201 0, /* dst_mask */
2202 FALSE), /* pcrel_offset */
2203
45965137
AM
2204 /* Like ADDR64, but use local entry point of function. */
2205 HOWTO (R_PPC64_ADDR64_LOCAL, /* type */
2206 0, /* rightshift */
2207 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
2208 64, /* bitsize */
2209 FALSE, /* pc_relative */
2210 0, /* bitpos */
2211 complain_overflow_dont, /* complain_on_overflow */
2212 bfd_elf_generic_reloc, /* special_function */
2213 "R_PPC64_ADDR64_LOCAL", /* name */
2214 FALSE, /* partial_inplace */
2215 0, /* src_mask */
2216 ONES (64), /* dst_mask */
2217 FALSE), /* pcrel_offset */
2218
5bd4f169
AM
2219 /* GNU extension to record C++ vtable hierarchy. */
2220 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
2221 0, /* rightshift */
2222 0, /* size (0 = byte, 1 = short, 2 = long) */
2223 0, /* bitsize */
b34976b6 2224 FALSE, /* pc_relative */
5bd4f169
AM
2225 0, /* bitpos */
2226 complain_overflow_dont, /* complain_on_overflow */
2227 NULL, /* special_function */
2228 "R_PPC64_GNU_VTINHERIT", /* name */
b34976b6 2229 FALSE, /* partial_inplace */
5bd4f169
AM
2230 0, /* src_mask */
2231 0, /* dst_mask */
b34976b6 2232 FALSE), /* pcrel_offset */
5bd4f169
AM
2233
2234 /* GNU extension to record C++ vtable member usage. */
2235 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
2236 0, /* rightshift */
2237 0, /* size (0 = byte, 1 = short, 2 = long) */
2238 0, /* bitsize */
b34976b6 2239 FALSE, /* pc_relative */
5bd4f169
AM
2240 0, /* bitpos */
2241 complain_overflow_dont, /* complain_on_overflow */
2242 NULL, /* special_function */
2243 "R_PPC64_GNU_VTENTRY", /* name */
b34976b6 2244 FALSE, /* partial_inplace */
5bd4f169
AM
2245 0, /* src_mask */
2246 0, /* dst_mask */
b34976b6 2247 FALSE), /* pcrel_offset */
5bd4f169
AM
2248};
2249
2250\f
2251/* Initialize the ppc64_elf_howto_table, so that linear accesses can
2252 be done. */
2253
2254static void
4ce794b7 2255ppc_howto_init (void)
5bd4f169
AM
2256{
2257 unsigned int i, type;
2258
a4b6fadd 2259 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
5bd4f169
AM
2260 {
2261 type = ppc64_elf_howto_raw[i].type;
a4b6fadd 2262 BFD_ASSERT (type < ARRAY_SIZE (ppc64_elf_howto_table));
5bd4f169
AM
2263 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2264 }
2265}
2266
2267static reloc_howto_type *
f3185997 2268ppc64_elf_reloc_type_lookup (bfd *abfd,
4ce794b7 2269 bfd_reloc_code_real_type code)
5bd4f169 2270{
411e1bfb 2271 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
5bd4f169
AM
2272
2273 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2274 /* Initialize howto table if needed. */
2275 ppc_howto_init ();
2276
4ce794b7 2277 switch (code)
5bd4f169
AM
2278 {
2279 default:
f3185997 2280 /* xgettext:c-format */
e8f5af78 2281 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, (int) code);
f3185997 2282 bfd_set_error (bfd_error_bad_value);
4ce794b7 2283 return NULL;
5bd4f169 2284
411e1bfb
AM
2285 case BFD_RELOC_NONE: r = R_PPC64_NONE;
2286 break;
2287 case BFD_RELOC_32: r = R_PPC64_ADDR32;
2288 break;
2289 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
2290 break;
2291 case BFD_RELOC_16: r = R_PPC64_ADDR16;
2292 break;
2293 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
2294 break;
2295 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
2296 break;
f9c6b907
AM
2297 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
2298 break;
411e1bfb 2299 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
5bd4f169 2300 break;
f9c6b907
AM
2301 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
2302 break;
411e1bfb 2303 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
5bd4f169 2304 break;
411e1bfb 2305 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
5bd4f169 2306 break;
411e1bfb 2307 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
5bd4f169 2308 break;
411e1bfb 2309 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
5bd4f169 2310 break;
411e1bfb 2311 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
5bd4f169 2312 break;
411e1bfb 2313 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
5bd4f169 2314 break;
411e1bfb 2315 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
5bd4f169 2316 break;
411e1bfb 2317 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
5bd4f169 2318 break;
411e1bfb 2319 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
5bd4f169 2320 break;
411e1bfb 2321 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
5bd4f169 2322 break;
411e1bfb 2323 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
5bd4f169 2324 break;
411e1bfb 2325 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
5bd4f169 2326 break;
411e1bfb 2327 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
5bd4f169 2328 break;
411e1bfb 2329 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
5bd4f169 2330 break;
411e1bfb 2331 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
5bd4f169 2332 break;
411e1bfb 2333 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
5bd4f169 2334 break;
411e1bfb 2335 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
5bd4f169 2336 break;
411e1bfb 2337 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
5bd4f169 2338 break;
411e1bfb 2339 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
5bd4f169 2340 break;
411e1bfb 2341 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
5bd4f169 2342 break;
411e1bfb 2343 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
5bd4f169 2344 break;
411e1bfb 2345 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
5bd4f169 2346 break;
411e1bfb 2347 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
5bd4f169 2348 break;
411e1bfb 2349 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
5bd4f169 2350 break;
411e1bfb 2351 case BFD_RELOC_64: r = R_PPC64_ADDR64;
5bd4f169 2352 break;
411e1bfb 2353 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
5bd4f169 2354 break;
411e1bfb 2355 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
5bd4f169 2356 break;
411e1bfb 2357 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
5bd4f169 2358 break;
411e1bfb 2359 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
5bd4f169 2360 break;
411e1bfb 2361 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
5bd4f169 2362 break;
411e1bfb 2363 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
5bd4f169 2364 break;
411e1bfb 2365 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
5bd4f169 2366 break;
411e1bfb 2367 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
5bd4f169 2368 break;
411e1bfb 2369 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
5bd4f169 2370 break;
411e1bfb 2371 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
5bd4f169 2372 break;
411e1bfb 2373 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
5bd4f169 2374 break;
411e1bfb 2375 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
5bd4f169 2376 break;
411e1bfb 2377 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
5bd4f169 2378 break;
411e1bfb 2379 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
5bd4f169 2380 break;
411e1bfb 2381 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
5bd4f169 2382 break;
411e1bfb 2383 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
5bd4f169 2384 break;
411e1bfb 2385 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
5bd4f169 2386 break;
411e1bfb 2387 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
5bd4f169 2388 break;
411e1bfb 2389 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
5bd4f169 2390 break;
411e1bfb 2391 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
5bd4f169 2392 break;
411e1bfb 2393 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
5bd4f169 2394 break;
411e1bfb 2395 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
5bd4f169 2396 break;
411e1bfb 2397 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
5bd4f169 2398 break;
411e1bfb 2399 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
5bd4f169 2400 break;
411e1bfb 2401 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
5bd4f169 2402 break;
411e1bfb 2403 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
5bd4f169 2404 break;
411e1bfb 2405 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
5bd4f169 2406 break;
411e1bfb 2407 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
5bd4f169 2408 break;
727fc41e
AM
2409 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
2410 break;
2411 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
2412 break;
411e1bfb 2413 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
5bd4f169 2414 break;
411e1bfb 2415 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
5bd4f169 2416 break;
411e1bfb 2417 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
5bd4f169 2418 break;
411e1bfb 2419 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
5bd4f169 2420 break;
f9c6b907
AM
2421 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
2422 break;
411e1bfb 2423 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
5bd4f169 2424 break;
f9c6b907
AM
2425 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
2426 break;
411e1bfb 2427 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
5bd4f169 2428 break;
411e1bfb
AM
2429 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2430 break;
2431 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2432 break;
2433 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2434 break;
f9c6b907
AM
2435 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
2436 break;
411e1bfb
AM
2437 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2438 break;
f9c6b907
AM
2439 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
2440 break;
411e1bfb
AM
2441 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2442 break;
2443 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2444 break;
2445 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2446 break;
2447 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2448 break;
2449 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2450 break;
2451 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2452 break;
2453 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2454 break;
2455 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2456 break;
2457 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2458 break;
2459 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2460 break;
2461 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2462 break;
2463 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2464 break;
2465 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2466 break;
2467 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2468 break;
2469 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2470 break;
2471 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2472 break;
2473 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2474 break;
2475 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2476 break;
2477 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2478 break;
2479 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2480 break;
2481 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2482 break;
2483 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2484 break;
2485 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2486 break;
2487 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2488 break;
2489 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2490 break;
2491 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2492 break;
2493 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2494 break;
2495 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2496 break;
2497 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2498 break;
25f23106
AM
2499 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
2500 break;
2501 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
2502 break;
2503 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
2504 break;
2505 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
2506 break;
7ba71655
AM
2507 case BFD_RELOC_PPC_16DX_HA: r = R_PPC64_16DX_HA;
2508 break;
a680de9a
PB
2509 case BFD_RELOC_PPC_REL16DX_HA: r = R_PPC64_REL16DX_HA;
2510 break;
006589cf
AM
2511 case BFD_RELOC_PPC64_ENTRY: r = R_PPC64_ENTRY;
2512 break;
45965137
AM
2513 case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL;
2514 break;
411e1bfb
AM
2515 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2516 break;
2517 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
5bd4f169
AM
2518 break;
2519 }
2520
4ce794b7 2521 return ppc64_elf_howto_table[r];
5bd4f169
AM
2522};
2523
157090f7
AM
2524static reloc_howto_type *
2525ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2526 const char *r_name)
2527{
2528 unsigned int i;
2529
a4b6fadd 2530 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
157090f7
AM
2531 if (ppc64_elf_howto_raw[i].name != NULL
2532 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2533 return &ppc64_elf_howto_raw[i];
2534
f3185997 2535
157090f7
AM
2536 return NULL;
2537}
2538
5bd4f169
AM
2539/* Set the howto pointer for a PowerPC ELF reloc. */
2540
f3185997 2541static bfd_boolean
4aef7643 2542ppc64_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
4ce794b7 2543 Elf_Internal_Rela *dst)
5bd4f169 2544{
65f38f15
AM
2545 unsigned int type;
2546
ef60b7ff 2547 /* Initialize howto table if needed. */
5bd4f169 2548 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
2549 ppc_howto_init ();
2550
65f38f15 2551 type = ELF64_R_TYPE (dst->r_info);
a4b6fadd 2552 if (type >= ARRAY_SIZE (ppc64_elf_howto_table))
d0fb9a8d 2553 {
695344c0 2554 /* xgettext:c-format */
0aa13fee 2555 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
cf97bcb0 2556 abfd, type);
f3185997
NC
2557 bfd_set_error (bfd_error_bad_value);
2558 return FALSE;
d0fb9a8d 2559 }
65f38f15 2560 cache_ptr->howto = ppc64_elf_howto_table[type];
f3185997
NC
2561 if (cache_ptr->howto == NULL || cache_ptr->howto->name == NULL)
2562 {
2563 /* xgettext:c-format */
2564 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
2565 abfd, type);
2566 bfd_set_error (bfd_error_bad_value);
2567 return FALSE;
2568 }
2569
2570 return TRUE;
5bd4f169
AM
2571}
2572
04c9666a 2573/* Handle the R_PPC64_ADDR16_HA and similar relocs. */
5bd4f169
AM
2574
2575static bfd_reloc_status_type
4ce794b7
AM
2576ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2577 void *data, asection *input_section,
2578 bfd *output_bfd, char **error_message)
5bd4f169 2579{
a680de9a
PB
2580 enum elf_ppc64_reloc_type r_type;
2581 long insn;
2582 bfd_size_type octets;
3de43e7b 2583 bfd_vma value;
a680de9a 2584
805fc799
AM
2585 /* If this is a relocatable link (output_bfd test tells us), just
2586 call the generic function. Any adjustment will be done at final
2587 link time. */
2588 if (output_bfd != NULL)
cedb70c5 2589 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2590 input_section, output_bfd, error_message);
2591
2592 /* Adjust the addend for sign extension of the low 16 bits.
2593 We won't actually be using the low 16 bits, so trashing them
2594 doesn't matter. */
2595 reloc_entry->addend += 0x8000;
a680de9a
PB
2596 r_type = reloc_entry->howto->type;
2597 if (r_type != R_PPC64_REL16DX_HA)
2598 return bfd_reloc_continue;
2599
2600 value = 0;
2601 if (!bfd_is_com_section (symbol->section))
2602 value = symbol->value;
2603 value += (reloc_entry->addend
2604 + symbol->section->output_offset
2605 + symbol->section->output_section->vma);
2606 value -= (reloc_entry->address
2607 + input_section->output_offset
2608 + input_section->output_section->vma);
3de43e7b 2609 value = (bfd_signed_vma) value >> 16;
a680de9a
PB
2610
2611 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2612 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2613 insn &= ~0x1fffc1;
3de43e7b 2614 insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
a680de9a 2615 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
3de43e7b 2616 if (value + 0x8000 > 0xffff)
a680de9a
PB
2617 return bfd_reloc_overflow;
2618 return bfd_reloc_ok;
805fc799 2619}
5bd4f169 2620
2441e016
AM
2621static bfd_reloc_status_type
2622ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2623 void *data, asection *input_section,
2624 bfd *output_bfd, char **error_message)
2625{
2626 if (output_bfd != NULL)
2627 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2628 input_section, output_bfd, error_message);
2629
699733f6
AM
2630 if (strcmp (symbol->section->name, ".opd") == 0
2631 && (symbol->section->owner->flags & DYNAMIC) == 0)
2441e016
AM
2632 {
2633 bfd_vma dest = opd_entry_value (symbol->section,
2634 symbol->value + reloc_entry->addend,
aef36ac1 2635 NULL, NULL, FALSE);
2441e016
AM
2636 if (dest != (bfd_vma) -1)
2637 reloc_entry->addend = dest - (symbol->value
2638 + symbol->section->output_section->vma
2639 + symbol->section->output_offset);
2640 }
810d4e75
AM
2641 else
2642 {
2643 elf_symbol_type *elfsym = (elf_symbol_type *) symbol;
2644
2645 if (symbol->section->owner != abfd
9f284bf9 2646 && symbol->section->owner != NULL
810d4e75
AM
2647 && abiversion (symbol->section->owner) >= 2)
2648 {
2649 unsigned int i;
2650
2651 for (i = 0; i < symbol->section->owner->symcount; ++i)
2652 {
2653 asymbol *symdef = symbol->section->owner->outsymbols[i];
2654
2655 if (strcmp (symdef->name, symbol->name) == 0)
2656 {
2657 elfsym = (elf_symbol_type *) symdef;
2658 break;
2659 }
2660 }
2661 }
2662 reloc_entry->addend
2663 += PPC64_LOCAL_ENTRY_OFFSET (elfsym->internal_elf_sym.st_other);
2664 }
2441e016
AM
2665 return bfd_reloc_continue;
2666}
2667
805fc799 2668static bfd_reloc_status_type
4ce794b7
AM
2669ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2670 void *data, asection *input_section,
2671 bfd *output_bfd, char **error_message)
805fc799
AM
2672{
2673 long insn;
04c9666a 2674 enum elf_ppc64_reloc_type r_type;
805fc799 2675 bfd_size_type octets;
794e51c0
AM
2676 /* Assume 'at' branch hints. */
2677 bfd_boolean is_isa_v2 = TRUE;
805fc799
AM
2678
2679 /* If this is a relocatable link (output_bfd test tells us), just
2680 call the generic function. Any adjustment will be done at final
2681 link time. */
5bd4f169 2682 if (output_bfd != NULL)
cedb70c5 2683 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2684 input_section, output_bfd, error_message);
2685
2686 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2687 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2688 insn &= ~(0x01 << 21);
4ce794b7 2689 r_type = reloc_entry->howto->type;
805fc799
AM
2690 if (r_type == R_PPC64_ADDR14_BRTAKEN
2691 || r_type == R_PPC64_REL14_BRTAKEN)
cedb70c5 2692 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
805fc799 2693
794e51c0 2694 if (is_isa_v2)
5bd4f169 2695 {
805fc799
AM
2696 /* Set 'a' bit. This is 0b00010 in BO field for branch
2697 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2698 for branch on CTR insns (BO == 1a00t or 1a01t). */
2699 if ((insn & (0x14 << 21)) == (0x04 << 21))
2700 insn |= 0x02 << 21;
2701 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2702 insn |= 0x08 << 21;
2703 else
2441e016 2704 goto out;
5bd4f169 2705 }
805fc799
AM
2706 else
2707 {
2708 bfd_vma target = 0;
2709 bfd_vma from;
5bd4f169 2710
805fc799
AM
2711 if (!bfd_is_com_section (symbol->section))
2712 target = symbol->value;
2713 target += symbol->section->output_section->vma;
2714 target += symbol->section->output_offset;
2715 target += reloc_entry->addend;
5bd4f169 2716
805fc799
AM
2717 from = (reloc_entry->address
2718 + input_section->output_offset
2719 + input_section->output_section->vma);
5bd4f169 2720
805fc799
AM
2721 /* Invert 'y' bit if not the default. */
2722 if ((bfd_signed_vma) (target - from) < 0)
2723 insn ^= 0x01 << 21;
2724 }
4ce794b7 2725 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2441e016
AM
2726 out:
2727 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2728 input_section, output_bfd, error_message);
805fc799 2729}
5bd4f169 2730
805fc799 2731static bfd_reloc_status_type
4ce794b7
AM
2732ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2733 void *data, asection *input_section,
2734 bfd *output_bfd, char **error_message)
805fc799
AM
2735{
2736 /* If this is a relocatable link (output_bfd test tells us), just
2737 call the generic function. Any adjustment will be done at final
2738 link time. */
2739 if (output_bfd != NULL)
cedb70c5 2740 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799 2741 input_section, output_bfd, error_message);
5bd4f169 2742
805fc799
AM
2743 /* Subtract the symbol section base address. */
2744 reloc_entry->addend -= symbol->section->output_section->vma;
5bd4f169
AM
2745 return bfd_reloc_continue;
2746}
2747
805fc799 2748static bfd_reloc_status_type
4ce794b7
AM
2749ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2750 void *data, asection *input_section,
2751 bfd *output_bfd, char **error_message)
805fc799
AM
2752{
2753 /* If this is a relocatable link (output_bfd test tells us), just
2754 call the generic function. Any adjustment will be done at final
2755 link time. */
2756 if (output_bfd != NULL)
cedb70c5 2757 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2758 input_section, output_bfd, error_message);
2759
2760 /* Subtract the symbol section base address. */
2761 reloc_entry->addend -= symbol->section->output_section->vma;
2762
2763 /* Adjust the addend for sign extension of the low 16 bits. */
2764 reloc_entry->addend += 0x8000;
2765 return bfd_reloc_continue;
2766}
2767
2768static bfd_reloc_status_type
4ce794b7
AM
2769ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2770 void *data, asection *input_section,
2771 bfd *output_bfd, char **error_message)
805fc799
AM
2772{
2773 bfd_vma TOCstart;
2774
2775 /* If this is a relocatable link (output_bfd test tells us), just
2776 call the generic function. Any adjustment will be done at final
2777 link time. */
2778 if (output_bfd != NULL)
cedb70c5 2779 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2780 input_section, output_bfd, error_message);
2781
2782 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2783 if (TOCstart == 0)
1c865ab2 2784 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
2785
2786 /* Subtract the TOC base address. */
2787 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2788 return bfd_reloc_continue;
2789}
2790
2791static bfd_reloc_status_type
4ce794b7
AM
2792ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2793 void *data, asection *input_section,
2794 bfd *output_bfd, char **error_message)
805fc799
AM
2795{
2796 bfd_vma TOCstart;
2797
2798 /* If this is a relocatable link (output_bfd test tells us), just
2799 call the generic function. Any adjustment will be done at final
2800 link time. */
2801 if (output_bfd != NULL)
cedb70c5 2802 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2803 input_section, output_bfd, error_message);
2804
2805 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2806 if (TOCstart == 0)
1c865ab2 2807 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
2808
2809 /* Subtract the TOC base address. */
2810 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2811
2812 /* Adjust the addend for sign extension of the low 16 bits. */
2813 reloc_entry->addend += 0x8000;
2814 return bfd_reloc_continue;
2815}
2816
2817static bfd_reloc_status_type
4ce794b7
AM
2818ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2819 void *data, asection *input_section,
2820 bfd *output_bfd, char **error_message)
805fc799
AM
2821{
2822 bfd_vma TOCstart;
2823 bfd_size_type octets;
2824
2825 /* If this is a relocatable link (output_bfd test tells us), just
2826 call the generic function. Any adjustment will be done at final
2827 link time. */
2828 if (output_bfd != NULL)
cedb70c5 2829 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2830 input_section, output_bfd, error_message);
2831
2832 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2833 if (TOCstart == 0)
1c865ab2 2834 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
2835
2836 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2837 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2838 return bfd_reloc_ok;
2839}
2840
2841static bfd_reloc_status_type
4ce794b7
AM
2842ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2843 void *data, asection *input_section,
2844 bfd *output_bfd, char **error_message)
805fc799
AM
2845{
2846 /* If this is a relocatable link (output_bfd test tells us), just
2847 call the generic function. Any adjustment will be done at final
2848 link time. */
2849 if (output_bfd != NULL)
cedb70c5 2850 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2851 input_section, output_bfd, error_message);
2852
2853 if (error_message != NULL)
2854 {
2855 static char buf[60];
2856 sprintf (buf, "generic linker can't handle %s",
2857 reloc_entry->howto->name);
2858 *error_message = buf;
2859 }
2860 return bfd_reloc_dangerous;
2861}
2862
927be08e
AM
2863/* Track GOT entries needed for a given symbol. We might need more
2864 than one got entry per symbol. */
2865struct got_entry
2866{
2867 struct got_entry *next;
2868
2869 /* The symbol addend that we'll be placing in the GOT. */
2870 bfd_vma addend;
2871
2872 /* Unlike other ELF targets, we use separate GOT entries for the same
2873 symbol referenced from different input files. This is to support
2874 automatic multiple TOC/GOT sections, where the TOC base can vary
2875 from one input file to another. After partitioning into TOC groups
2876 we merge entries within the group.
2877
2878 Point to the BFD owning this GOT entry. */
2879 bfd *owner;
2880
2881 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2882 TLS_TPREL or TLS_DTPREL for tls entries. */
f961d9dd 2883 unsigned char tls_type;
927be08e
AM
2884
2885 /* Non-zero if got.ent points to real entry. */
f961d9dd 2886 unsigned char is_indirect;
927be08e
AM
2887
2888 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2889 union
2890 {
2891 bfd_signed_vma refcount;
2892 bfd_vma offset;
2893 struct got_entry *ent;
2894 } got;
2895};
2896
2897/* The same for PLT. */
2898struct plt_entry
2899{
2900 struct plt_entry *next;
2901
2902 bfd_vma addend;
2903
2904 union
2905 {
2906 bfd_signed_vma refcount;
2907 bfd_vma offset;
2908 } plt;
2909};
2910
e717da7e
AM
2911struct ppc64_elf_obj_tdata
2912{
2913 struct elf_obj_tdata elf;
2914
2915 /* Shortcuts to dynamic linker sections. */
2916 asection *got;
2917 asection *relgot;
2918
b3fac117
AM
2919 /* Used during garbage collection. We attach global symbols defined
2920 on removed .opd entries to this section so that the sym is removed. */
2921 asection *deleted_section;
81688140 2922
927be08e 2923 /* TLS local dynamic got entry handling. Support for multiple GOT
e717da7e 2924 sections means we potentially need one of these for each input bfd. */
927be08e 2925 struct got_entry tlsld_got;
8860955f 2926
729eabd5
AM
2927 union {
2928 /* A copy of relocs before they are modified for --emit-relocs. */
2929 Elf_Internal_Rela *relocs;
2930
2931 /* Section contents. */
2932 bfd_byte *contents;
2933 } opd;
d77c8a4b
AM
2934
2935 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2936 the reloc to be in the range -32768 to 32767. */
98528052
AM
2937 unsigned int has_small_toc_reloc : 1;
2938
560c8763
AM
2939 /* Set if toc/got ha relocs detected not using r2, or lo reloc
2940 instruction not one we handle. */
2941 unsigned int unexpected_toc_insn : 1;
e717da7e
AM
2942};
2943
2944#define ppc64_elf_tdata(bfd) \
2945 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2946
2947#define ppc64_tlsld_got(bfd) \
2948 (&ppc64_elf_tdata (bfd)->tlsld_got)
2949
0c8d6e5c
AM
2950#define is_ppc64_elf(bfd) \
2951 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
4dfe6ac6 2952 && elf_object_id (bfd) == PPC64_ELF_DATA)
0c8d6e5c 2953
e717da7e
AM
2954/* Override the generic function because we store some extras. */
2955
2956static bfd_boolean
2957ppc64_elf_mkobject (bfd *abfd)
2958{
0ffa91dd 2959 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
4dfe6ac6 2960 PPC64_ELF_DATA);
e717da7e
AM
2961}
2962
feee612b 2963/* Fix bad default arch selected for a 64 bit input bfd when the
14b57c7c 2964 default is 32 bit. Also select arch based on apuinfo. */
feee612b 2965
b34976b6 2966static bfd_boolean
4ce794b7 2967ppc64_elf_object_p (bfd *abfd)
feee612b 2968{
14b57c7c
AM
2969 if (!abfd->arch_info->the_default)
2970 return TRUE;
2971
2972 if (abfd->arch_info->bits_per_word == 32)
feee612b
AM
2973 {
2974 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2975
2976 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2977 {
2978 /* Relies on arch after 32 bit default being 64 bit default. */
2979 abfd->arch_info = abfd->arch_info->next;
2980 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2981 }
2982 }
14b57c7c 2983 return _bfd_elf_ppc_set_arch (abfd);
feee612b
AM
2984}
2985
d37c89e5
AM
2986/* Support for core dump NOTE sections. */
2987
2988static bfd_boolean
2989ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2990{
eea6121a 2991 size_t offset, size;
d37c89e5
AM
2992
2993 if (note->descsz != 504)
2994 return FALSE;
2995
2996 /* pr_cursig */
228e534f 2997 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
d37c89e5
AM
2998
2999 /* pr_pid */
228e534f 3000 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
d37c89e5
AM
3001
3002 /* pr_reg */
3003 offset = 112;
eea6121a 3004 size = 384;
d37c89e5
AM
3005
3006 /* Make a ".reg/999" section. */
3007 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 3008 size, note->descpos + offset);
d37c89e5
AM
3009}
3010
3011static bfd_boolean
3012ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3013{
3014 if (note->descsz != 136)
3015 return FALSE;
3016
228e534f 3017 elf_tdata (abfd)->core->pid
bc989cdc 3018 = bfd_get_32 (abfd, note->descdata + 24);
228e534f 3019 elf_tdata (abfd)->core->program
d37c89e5 3020 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
228e534f 3021 elf_tdata (abfd)->core->command
d37c89e5
AM
3022 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
3023
3024 return TRUE;
3025}
3026
183e98be
AM
3027static char *
3028ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
3029 ...)
3030{
3031 switch (note_type)
3032 {
3033 default:
3034 return NULL;
3035
3036 case NT_PRPSINFO:
3037 {
3038 char data[136];
3039 va_list ap;
3040
3041 va_start (ap, note_type);
75cd47ed 3042 memset (data, 0, sizeof (data));
183e98be
AM
3043 strncpy (data + 40, va_arg (ap, const char *), 16);
3044 strncpy (data + 56, va_arg (ap, const char *), 80);
3045 va_end (ap);
3046 return elfcore_write_note (abfd, buf, bufsiz,
3047 "CORE", note_type, data, sizeof (data));
3048 }
3049
3050 case NT_PRSTATUS:
3051 {
3052 char data[504];
3053 va_list ap;
3054 long pid;
3055 int cursig;
3056 const void *greg;
3057
3058 va_start (ap, note_type);
3059 memset (data, 0, 112);
3060 pid = va_arg (ap, long);
3061 bfd_put_32 (abfd, pid, data + 32);
3062 cursig = va_arg (ap, int);
3063 bfd_put_16 (abfd, cursig, data + 12);
3064 greg = va_arg (ap, const void *);
3065 memcpy (data + 112, greg, 384);
3066 memset (data + 496, 0, 8);
3067 va_end (ap);
3068 return elfcore_write_note (abfd, buf, bufsiz,
3069 "CORE", note_type, data, sizeof (data));
3070 }
3071 }
3072}
3073
5d35169e
AM
3074/* Add extra PPC sections. */
3075
b35d266b 3076static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
7f4d3958 3077{
07d6d2b8
AM
3078 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
3079 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 3080 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
3081 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3082 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 3083 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8 3084 { NULL, 0, 0, 0, 0 }
5d35169e
AM
3085};
3086
7c8fe5c4
AM
3087enum _ppc64_sec_type {
3088 sec_normal = 0,
3089 sec_opd = 1,
3090 sec_toc = 2
3091};
3092
f0abc2a1
AM
3093struct _ppc64_elf_section_data
3094{
3095 struct bfd_elf_section_data elf;
411e1bfb 3096
f0abc2a1
AM
3097 union
3098 {
51aecdc5
AM
3099 /* An array with one entry for each opd function descriptor,
3100 and some spares since opd entries may be either 16 or 24 bytes. */
3101#define OPD_NDX(OFF) ((OFF) >> 4)
74f0fb50
AM
3102 struct _opd_sec_data
3103 {
3104 /* Points to the function code section for local opd entries. */
3105 asection **func_sec;
3106
3107 /* After editing .opd, adjust references to opd local syms. */
3108 long *adjust;
3109 } opd;
7c8fe5c4 3110
3a71aa26
AM
3111 /* An array for toc sections, indexed by offset/8. */
3112 struct _toc_sec_data
3113 {
3114 /* Specifies the relocation symbol index used at a given toc offset. */
3115 unsigned *symndx;
3116
3117 /* And the relocation addend. */
3118 bfd_vma *add;
3119 } toc;
7c8fe5c4
AM
3120 } u;
3121
3122 enum _ppc64_sec_type sec_type:2;
411e1bfb 3123
7c8fe5c4
AM
3124 /* Flag set when small branches are detected. Used to
3125 select suitable defaults for the stub group size. */
3126 unsigned int has_14bit_branch:1;
3e04d765
AM
3127
3128 /* Flag set when PLTCALL relocs are detected. */
3129 unsigned int has_pltcall:1;
f0abc2a1
AM
3130};
3131
3132#define ppc64_elf_section_data(sec) \
411e1bfb 3133 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
f0abc2a1
AM
3134
3135static bfd_boolean
4ce794b7 3136ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1 3137{
f592407e
AM
3138 if (!sec->used_by_bfd)
3139 {
3140 struct _ppc64_elf_section_data *sdata;
3141 bfd_size_type amt = sizeof (*sdata);
f0abc2a1 3142
f592407e
AM
3143 sdata = bfd_zalloc (abfd, amt);
3144 if (sdata == NULL)
3145 return FALSE;
3146 sec->used_by_bfd = sdata;
3147 }
f0abc2a1
AM
3148
3149 return _bfd_elf_new_section_hook (abfd, sec);
3150}
4025353c 3151
74f0fb50 3152static struct _opd_sec_data *
4025353c
AM
3153get_opd_info (asection * sec)
3154{
3155 if (sec != NULL
3156 && ppc64_elf_section_data (sec) != NULL
7c8fe5c4 3157 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
74f0fb50 3158 return &ppc64_elf_section_data (sec)->u.opd;
4025353c
AM
3159 return NULL;
3160}
90e3cdf2
JJ
3161\f
3162/* Parameters for the qsort hook. */
90e3cdf2 3163static bfd_boolean synthetic_relocatable;
cd285db5 3164static asection *synthetic_opd;
90e3cdf2 3165
699733f6 3166/* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
90e3cdf2
JJ
3167
3168static int
3169compare_symbols (const void *ap, const void *bp)
3170{
3171 const asymbol *a = * (const asymbol **) ap;
3172 const asymbol *b = * (const asymbol **) bp;
3173
699733f6
AM
3174 /* Section symbols first. */
3175 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
90e3cdf2 3176 return -1;
699733f6 3177 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
90e3cdf2
JJ
3178 return 1;
3179
699733f6 3180 /* then .opd symbols. */
cd285db5
AM
3181 if (synthetic_opd != NULL)
3182 {
3183 if (strcmp (a->section->name, ".opd") == 0
3184 && strcmp (b->section->name, ".opd") != 0)
3185 return -1;
3186 if (strcmp (a->section->name, ".opd") != 0
3187 && strcmp (b->section->name, ".opd") == 0)
3188 return 1;
3189 }
90e3cdf2 3190
699733f6 3191 /* then other code symbols. */
90e3cdf2
JJ
3192 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3193 == (SEC_CODE | SEC_ALLOC)
3194 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3195 != (SEC_CODE | SEC_ALLOC))
3196 return -1;
3197
3198 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3199 != (SEC_CODE | SEC_ALLOC)
3200 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3201 == (SEC_CODE | SEC_ALLOC))
3202 return 1;
3203
3204 if (synthetic_relocatable)
3205 {
3206 if (a->section->id < b->section->id)
3207 return -1;
3208
3209 if (a->section->id > b->section->id)
3210 return 1;
3211 }
3212
3213 if (a->value + a->section->vma < b->value + b->section->vma)
3214 return -1;
3215
3216 if (a->value + a->section->vma > b->value + b->section->vma)
3217 return 1;
3218
4d35a0aa
AM
3219 /* For syms with the same value, prefer strong dynamic global function
3220 syms over other syms. */
3221 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
3222 return -1;
3223
3224 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
3225 return 1;
3226
3227 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
3228 return -1;
3229
3230 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
3231 return 1;
3232
3233 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
3234 return -1;
3235
3236 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
3237 return 1;
3238
3239 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
3240 return -1;
3241
3242 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
3243 return 1;
3244
aaed6f5b 3245 return a > b;
90e3cdf2
JJ
3246}
3247
699733f6 3248/* Search SYMS for a symbol of the given VALUE. */
90e3cdf2 3249
699733f6 3250static asymbol *
7292b3ac 3251sym_exists_at (asymbol **syms, long lo, long hi, unsigned int id, bfd_vma value)
90e3cdf2 3252{
699733f6 3253 long mid;
90e3cdf2 3254
7292b3ac 3255 if (id == (unsigned) -1)
699733f6
AM
3256 {
3257 while (lo < hi)
3258 {
3259 mid = (lo + hi) >> 1;
3260 if (syms[mid]->value + syms[mid]->section->vma < value)
3261 lo = mid + 1;
3262 else if (syms[mid]->value + syms[mid]->section->vma > value)
3263 hi = mid;
3264 else
3265 return syms[mid];
3266 }
3267 }
3268 else
3269 {
3270 while (lo < hi)
3271 {
3272 mid = (lo + hi) >> 1;
3273 if (syms[mid]->section->id < id)
3274 lo = mid + 1;
3275 else if (syms[mid]->section->id > id)
3276 hi = mid;
3277 else if (syms[mid]->value < value)
3278 lo = mid + 1;
3279 else if (syms[mid]->value > value)
3280 hi = mid;
3281 else
3282 return syms[mid];
3283 }
3284 }
3285 return NULL;
90e3cdf2
JJ
3286}
3287
468392fb
AM
3288static bfd_boolean
3289section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
3290{
3291 bfd_vma vma = *(bfd_vma *) ptr;
3292 return ((section->flags & SEC_ALLOC) != 0
3293 && section->vma <= vma
3294 && vma < section->vma + section->size);
3295}
3296
699733f6 3297/* Create synthetic symbols, effectively restoring "dot-symbol" function
c4b0b099
AM
3298 entry syms. Also generate @plt symbols for the glink branch table.
3299 Returns count of synthetic symbols in RET or -1 on error. */
90e3cdf2
JJ
3300
3301static long
a7535cf3
AM
3302ppc64_elf_get_synthetic_symtab (bfd *abfd,
3303 long static_count, asymbol **static_syms,
3304 long dyn_count, asymbol **dyn_syms,
c9727e01 3305 asymbol **ret)
90e3cdf2
JJ
3306{
3307 asymbol *s;
0ccf57bd 3308 size_t i, j, count;
90e3cdf2 3309 char *names;
0ccf57bd 3310 size_t symcount, codesecsym, codesecsymend, secsymend, opdsymend;
ee67d69a 3311 asection *opd = NULL;
90e3cdf2 3312 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
a7535cf3 3313 asymbol **syms;
ee67d69a 3314 int abi = abiversion (abfd);
90e3cdf2
JJ
3315
3316 *ret = NULL;
3317
ee67d69a
AM
3318 if (abi < 2)
3319 {
3320 opd = bfd_get_section_by_name (abfd, ".opd");
3321 if (opd == NULL && abi == 1)
3322 return 0;
3323 }
90e3cdf2 3324
a5259595
AM
3325 syms = NULL;
3326 codesecsym = 0;
3327 codesecsymend = 0;
3328 secsymend = 0;
3329 opdsymend = 0;
3330 symcount = 0;
3331 if (opd != NULL)
c9727e01 3332 {
a5259595
AM
3333 symcount = static_count;
3334 if (!relocatable)
3335 symcount += dyn_count;
3336 if (symcount == 0)
3337 return 0;
c9727e01 3338
a5259595
AM
3339 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3340 if (syms == NULL)
3341 return -1;
90e3cdf2 3342
a5259595
AM
3343 if (!relocatable && static_count != 0 && dyn_count != 0)
3344 {
3345 /* Use both symbol tables. */
3346 memcpy (syms, static_syms, static_count * sizeof (*syms));
3347 memcpy (syms + static_count, dyn_syms,
3348 (dyn_count + 1) * sizeof (*syms));
3349 }
3350 else if (!relocatable && static_count == 0)
3351 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3352 else
3353 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
90e3cdf2 3354
0ccf57bd
AM
3355 /* Trim uninteresting symbols. Interesting symbols are section,
3356 function, and notype symbols. */
3357 for (i = 0, j = 0; i < symcount; ++i)
3358 if ((syms[i]->flags & (BSF_FILE | BSF_OBJECT | BSF_THREAD_LOCAL
3359 | BSF_RELC | BSF_SRELC)) == 0)
3360 syms[j++] = syms[i];
3361 symcount = j;
3362
a5259595
AM
3363 synthetic_relocatable = relocatable;
3364 synthetic_opd = opd;
3365 qsort (syms, symcount, sizeof (*syms), compare_symbols);
90e3cdf2 3366
a5259595
AM
3367 if (!relocatable && symcount > 1)
3368 {
a5259595
AM
3369 /* Trim duplicate syms, since we may have merged the normal and
3370 dynamic symbols. Actually, we only care about syms that have
3371 different values, so trim any with the same value. */
3372 for (i = 1, j = 1; i < symcount; ++i)
3373 if (syms[i - 1]->value + syms[i - 1]->section->vma
3374 != syms[i]->value + syms[i]->section->vma)
3375 syms[j++] = syms[i];
3376 symcount = j;
3377 }
699733f6 3378
a5259595
AM
3379 i = 0;
3380 /* Note that here and in compare_symbols we can't compare opd and
3381 sym->section directly. With separate debug info files, the
3382 symbols will be extracted from the debug file while abfd passed
3383 to this function is the real binary. */
0ccf57bd 3384 if (strcmp (syms[i]->section->name, ".opd") == 0)
a5259595
AM
3385 ++i;
3386 codesecsym = i;
3387
3388 for (; i < symcount; ++i)
3389 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC
3390 | SEC_THREAD_LOCAL))
3391 != (SEC_CODE | SEC_ALLOC))
3392 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3393 break;
3394 codesecsymend = i;
3395
3396 for (; i < symcount; ++i)
3397 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3398 break;
3399 secsymend = i;
3400
3401 for (; i < symcount; ++i)
3402 if (strcmp (syms[i]->section->name, ".opd") != 0)
3403 break;
3404 opdsymend = i;
3405
3406 for (; i < symcount; ++i)
3407 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3408 != (SEC_CODE | SEC_ALLOC))
3409 break;
3410 symcount = i;
3411 }
c9727e01 3412 count = 0;
90e3cdf2 3413
699733f6 3414 if (relocatable)
90e3cdf2 3415 {
699733f6
AM
3416 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3417 arelent *r;
3418 size_t size;
0ccf57bd 3419 size_t relcount;
90e3cdf2 3420
468392fb
AM
3421 if (opdsymend == secsymend)
3422 goto done;
3423
699733f6 3424 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
90e3cdf2 3425 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
7356fed5 3426 if (relcount == 0)
c9727e01 3427 goto done;
90e3cdf2 3428
7356fed5
AM
3429 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3430 {
3431 count = -1;
3432 goto done;
3433 }
3434
699733f6 3435 size = 0;
595da8c5 3436 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
699733f6
AM
3437 {
3438 asymbol *sym;
90e3cdf2 3439
595da8c5 3440 while (r < opd->relocation + relcount
699733f6
AM
3441 && r->address < syms[i]->value + opd->vma)
3442 ++r;
90e3cdf2 3443
595da8c5 3444 if (r == opd->relocation + relcount)
699733f6 3445 break;
90e3cdf2 3446
699733f6
AM
3447 if (r->address != syms[i]->value + opd->vma)
3448 continue;
90e3cdf2 3449
699733f6
AM
3450 if (r->howto->type != R_PPC64_ADDR64)
3451 continue;
90e3cdf2 3452
699733f6
AM
3453 sym = *r->sym_ptr_ptr;
3454 if (!sym_exists_at (syms, opdsymend, symcount,
3455 sym->section->id, sym->value + r->addend))
3456 {
3457 ++count;
3458 size += sizeof (asymbol);
3459 size += strlen (syms[i]->name) + 2;
3460 }
3461 }
90e3cdf2 3462
c4b0b099
AM
3463 if (size == 0)
3464 goto done;
699733f6
AM
3465 s = *ret = bfd_malloc (size);
3466 if (s == NULL)
3467 {
7356fed5 3468 count = -1;
c9727e01 3469 goto done;
699733f6 3470 }
90e3cdf2 3471
699733f6 3472 names = (char *) (s + count);
90e3cdf2 3473
595da8c5 3474 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
90e3cdf2 3475 {
699733f6 3476 asymbol *sym;
90e3cdf2 3477
595da8c5 3478 while (r < opd->relocation + relcount
699733f6
AM
3479 && r->address < syms[i]->value + opd->vma)
3480 ++r;
90e3cdf2 3481
595da8c5 3482 if (r == opd->relocation + relcount)
699733f6
AM
3483 break;
3484
3485 if (r->address != syms[i]->value + opd->vma)
3486 continue;
3487
3488 if (r->howto->type != R_PPC64_ADDR64)
3489 continue;
90e3cdf2 3490
699733f6
AM
3491 sym = *r->sym_ptr_ptr;
3492 if (!sym_exists_at (syms, opdsymend, symcount,
3493 sym->section->id, sym->value + r->addend))
3494 {
3495 size_t len;
3496
3497 *s = *syms[i];
6ba2a415 3498 s->flags |= BSF_SYNTHETIC;
699733f6
AM
3499 s->section = sym->section;
3500 s->value = sym->value + r->addend;
3501 s->name = names;
3502 *names++ = '.';
3503 len = strlen (syms[i]->name);
3504 memcpy (names, syms[i]->name, len + 1);
3505 names += len + 1;
6f610d07
UW
3506 /* Have udata.p point back to the original symbol this
3507 synthetic symbol was derived from. */
3508 s->udata.p = syms[i];
699733f6
AM
3509 s++;
3510 }
3511 }
3512 }
3513 else
90e3cdf2 3514 {
468392fb 3515 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
ee67d69a 3516 bfd_byte *contents = NULL;
699733f6 3517 size_t size;
0ccf57bd 3518 size_t plt_count = 0;
468392fb
AM
3519 bfd_vma glink_vma = 0, resolv_vma = 0;
3520 asection *dynamic, *glink = NULL, *relplt = NULL;
3521 arelent *p;
90e3cdf2 3522
ee67d69a 3523 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
699733f6 3524 {
c4b0b099
AM
3525 free_contents_and_exit_err:
3526 count = -1;
ee67d69a 3527 free_contents_and_exit:
699733f6 3528 if (contents)
ee67d69a 3529 free (contents);
c9727e01 3530 goto done;
699733f6 3531 }
90e3cdf2 3532
699733f6
AM
3533 size = 0;
3534 for (i = secsymend; i < opdsymend; ++i)
3535 {
3536 bfd_vma ent;
90e3cdf2 3537
5ef11c02
AM
3538 /* Ignore bogus symbols. */
3539 if (syms[i]->value > opd->size - 8)
3540 continue;
3541
699733f6
AM
3542 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3543 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3544 {
3545 ++count;
3546 size += sizeof (asymbol);
3547 size += strlen (syms[i]->name) + 2;
3548 }
3549 }
90e3cdf2 3550
468392fb 3551 /* Get start of .glink stubs from DT_PPC64_GLINK. */
066ee829
AM
3552 if (dyn_count != 0
3553 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
468392fb
AM
3554 {
3555 bfd_byte *dynbuf, *extdyn, *extdynend;
3556 size_t extdynsize;
3557 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3558
3559 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
c4b0b099 3560 goto free_contents_and_exit_err;
468392fb
AM
3561
3562 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3563 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3564
3565 extdyn = dynbuf;
3566 extdynend = extdyn + dynamic->size;
3567 for (; extdyn < extdynend; extdyn += extdynsize)
3568 {
3569 Elf_Internal_Dyn dyn;
3570 (*swap_dyn_in) (abfd, extdyn, &dyn);
3571
3572 if (dyn.d_tag == DT_NULL)
3573 break;
3574
3575 if (dyn.d_tag == DT_PPC64_GLINK)
3576 {
9e390558
AM
3577 /* The first glink stub starts at DT_PPC64_GLINK plus 32.
3578 See comment in ppc64_elf_finish_dynamic_sections. */
3579 glink_vma = dyn.d_un.d_val + 8 * 4;
468392fb
AM
3580 /* The .glink section usually does not survive the final
3581 link; search for the section (usually .text) where the
3582 glink stubs now reside. */
3583 glink = bfd_sections_find_if (abfd, section_covers_vma,
3584 &glink_vma);
3585 break;
3586 }
3587 }
3588
3589 free (dynbuf);
3590 }
3591
3592 if (glink != NULL)
3593 {
3594 /* Determine __glink trampoline by reading the relative branch
3595 from the first glink stub. */
3596 bfd_byte buf[4];
b9e5796b
AM
3597 unsigned int off = 0;
3598
3599 while (bfd_get_section_contents (abfd, glink, buf,
3600 glink_vma + off - glink->vma, 4))
468392fb
AM
3601 {
3602 unsigned int insn = bfd_get_32 (abfd, buf);
3603 insn ^= B_DOT;
3604 if ((insn & ~0x3fffffc) == 0)
b9e5796b
AM
3605 {
3606 resolv_vma = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
3607 break;
3608 }
3609 off += 4;
3610 if (off > 4)
3611 break;
468392fb
AM
3612 }
3613
3614 if (resolv_vma)
3615 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
468392fb 3616
066ee829
AM
3617 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3618 if (relplt != NULL)
3619 {
3620 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3621 if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
c4b0b099 3622 goto free_contents_and_exit_err;
68ffbac6 3623
066ee829
AM
3624 plt_count = relplt->size / sizeof (Elf64_External_Rela);
3625 size += plt_count * sizeof (asymbol);
468392fb 3626
066ee829
AM
3627 p = relplt->relocation;
3628 for (i = 0; i < plt_count; i++, p++)
e054468f
AM
3629 {
3630 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3631 if (p->addend != 0)
3632 size += sizeof ("+0x") - 1 + 16;
3633 }
066ee829 3634 }
468392fb
AM
3635 }
3636
c4b0b099
AM
3637 if (size == 0)
3638 goto free_contents_and_exit;
699733f6
AM
3639 s = *ret = bfd_malloc (size);
3640 if (s == NULL)
c4b0b099 3641 goto free_contents_and_exit_err;
90e3cdf2 3642
468392fb 3643 names = (char *) (s + count + plt_count + (resolv_vma != 0));
90e3cdf2 3644
699733f6 3645 for (i = secsymend; i < opdsymend; ++i)
90e3cdf2 3646 {
699733f6 3647 bfd_vma ent;
90e3cdf2 3648
5ef11c02
AM
3649 if (syms[i]->value > opd->size - 8)
3650 continue;
3651
699733f6
AM
3652 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3653 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
90e3cdf2 3654 {
0ccf57bd 3655 size_t lo, hi;
699733f6 3656 size_t len;
c9727e01 3657 asection *sec = abfd->sections;
90e3cdf2 3658
699733f6
AM
3659 *s = *syms[i];
3660 lo = codesecsym;
3661 hi = codesecsymend;
3662 while (lo < hi)
3663 {
0ccf57bd 3664 size_t mid = (lo + hi) >> 1;
699733f6
AM
3665 if (syms[mid]->section->vma < ent)
3666 lo = mid + 1;
3667 else if (syms[mid]->section->vma > ent)
3668 hi = mid;
3669 else
c9727e01
AM
3670 {
3671 sec = syms[mid]->section;
3672 break;
3673 }
699733f6
AM
3674 }
3675
c9727e01 3676 if (lo >= hi && lo > codesecsym)
699733f6 3677 sec = syms[lo - 1]->section;
699733f6
AM
3678
3679 for (; sec != NULL; sec = sec->next)
3680 {
3681 if (sec->vma > ent)
3682 break;
63524580
JK
3683 /* SEC_LOAD may not be set if SEC is from a separate debug
3684 info file. */
3685 if ((sec->flags & SEC_ALLOC) == 0)
699733f6
AM
3686 break;
3687 if ((sec->flags & SEC_CODE) != 0)
3688 s->section = sec;
3689 }
6ba2a415 3690 s->flags |= BSF_SYNTHETIC;
699733f6
AM
3691 s->value = ent - s->section->vma;
3692 s->name = names;
3693 *names++ = '.';
3694 len = strlen (syms[i]->name);
3695 memcpy (names, syms[i]->name, len + 1);
3696 names += len + 1;
6f610d07
UW
3697 /* Have udata.p point back to the original symbol this
3698 synthetic symbol was derived from. */
3699 s->udata.p = syms[i];
699733f6 3700 s++;
90e3cdf2 3701 }
90e3cdf2 3702 }
699733f6 3703 free (contents);
468392fb
AM
3704
3705 if (glink != NULL && relplt != NULL)
3706 {
3707 if (resolv_vma)
3708 {
3709 /* Add a symbol for the main glink trampoline. */
86a4952b 3710 memset (s, 0, sizeof *s);
468392fb 3711 s->the_bfd = abfd;
6ba2a415 3712 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
468392fb
AM
3713 s->section = glink;
3714 s->value = resolv_vma - glink->vma;
3715 s->name = names;
3716 memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3717 names += sizeof ("__glink_PLTresolve");
3718 s++;
3719 count++;
3720 }
3721
3722 /* FIXME: It would be very much nicer to put sym@plt on the
3723 stub rather than on the glink branch table entry. The
3724 objdump disassembler would then use a sensible symbol
3725 name on plt calls. The difficulty in doing so is
3726 a) finding the stubs, and,
3727 b) matching stubs against plt entries, and,
3728 c) there can be multiple stubs for a given plt entry.
3729
3730 Solving (a) could be done by code scanning, but older
3731 ppc64 binaries used different stubs to current code.
3732 (b) is the tricky one since you need to known the toc
3733 pointer for at least one function that uses a pic stub to
3734 be able to calculate the plt address referenced.
3735 (c) means gdb would need to set multiple breakpoints (or
3736 find the glink branch itself) when setting breakpoints
3737 for pending shared library loads. */
3738 p = relplt->relocation;
3739 for (i = 0; i < plt_count; i++, p++)
3740 {
3741 size_t len;
3742
3743 *s = **p->sym_ptr_ptr;
3744 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
3745 we are defining a symbol, ensure one of them is set. */
3746 if ((s->flags & BSF_LOCAL) == 0)
3747 s->flags |= BSF_GLOBAL;
6ba2a415 3748 s->flags |= BSF_SYNTHETIC;
468392fb
AM
3749 s->section = glink;
3750 s->value = glink_vma - glink->vma;
3751 s->name = names;
3752 s->udata.p = NULL;
3753 len = strlen ((*p->sym_ptr_ptr)->name);
3754 memcpy (names, (*p->sym_ptr_ptr)->name, len);
3755 names += len;
e054468f
AM
3756 if (p->addend != 0)
3757 {
3758 memcpy (names, "+0x", sizeof ("+0x") - 1);
3759 names += sizeof ("+0x") - 1;
3760 bfd_sprintf_vma (abfd, names, p->addend);
3761 names += strlen (names);
3762 }
468392fb
AM
3763 memcpy (names, "@plt", sizeof ("@plt"));
3764 names += sizeof ("@plt");
3765 s++;
b9e5796b
AM
3766 if (abi < 2)
3767 {
3768 glink_vma += 8;
3769 if (i >= 0x8000)
3770 glink_vma += 4;
3771 }
3772 else
468392fb
AM
3773 glink_vma += 4;
3774 }
3775 count += plt_count;
3776 }
90e3cdf2
JJ
3777 }
3778
c9727e01 3779 done:
a7535cf3 3780 free (syms);
90e3cdf2
JJ
3781 return count;
3782}
5bd4f169 3783\f
65f38f15
AM
3784/* The following functions are specific to the ELF linker, while
3785 functions above are used generally. Those named ppc64_elf_* are
3786 called by the main ELF linker code. They appear in this file more
3787 or less in the order in which they are called. eg.
3788 ppc64_elf_check_relocs is called early in the link process,
3789 ppc64_elf_finish_dynamic_sections is one of the last functions
e86ce104
AM
3790 called.
3791
3792 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3793 functions have both a function code symbol and a function descriptor
3794 symbol. A call to foo in a relocatable object file looks like:
3795
3796 . .text
3797 . x:
3798 . bl .foo
3799 . nop
3800
3801 The function definition in another object file might be:
3802
3803 . .section .opd
3804 . foo: .quad .foo
3805 . .quad .TOC.@tocbase
3806 . .quad 0
3807 .
3808 . .text
3809 . .foo: blr
3810
3811 When the linker resolves the call during a static link, the branch
3812 unsurprisingly just goes to .foo and the .opd information is unused.
3813 If the function definition is in a shared library, things are a little
3814 different: The call goes via a plt call stub, the opd information gets
3815 copied to the plt, and the linker patches the nop.
3816
3817 . x:
3818 . bl .foo_stub
3819 . ld 2,40(1)
3820 .
3821 .
3822 . .foo_stub:
71a39c98
AM
3823 . std 2,40(1) # in practice, the call stub
3824 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
3825 . addi 11,11,Lfoo@toc@l # this is the general idea
3826 . ld 12,0(11)
3827 . ld 2,8(11)
3828 . mtctr 12
3829 . ld 11,16(11)
e86ce104
AM
3830 . bctr
3831 .
3832 . .section .plt
3833 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
3834
3835 The "reloc ()" notation is supposed to indicate that the linker emits
3836 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
3837 copying.
3838
3839 What are the difficulties here? Well, firstly, the relocations
3840 examined by the linker in check_relocs are against the function code
3841 sym .foo, while the dynamic relocation in the plt is emitted against
3842 the function descriptor symbol, foo. Somewhere along the line, we need
3843 to carefully copy dynamic link information from one symbol to the other.
3844 Secondly, the generic part of the elf linker will make .foo a dynamic
3845 symbol as is normal for most other backends. We need foo dynamic
3846 instead, at least for an application final link. However, when
3847 creating a shared library containing foo, we need to have both symbols
3848 dynamic so that references to .foo are satisfied during the early
3849 stages of linking. Otherwise the linker might decide to pull in a
8387904d
AM
3850 definition from some other object, eg. a static library.
3851
3852 Update: As of August 2004, we support a new convention. Function
3853 calls may use the function descriptor symbol, ie. "bl foo". This
3854 behaves exactly as "bl .foo". */
65f38f15 3855
7c8bbca5
AM
3856/* Of those relocs that might be copied as dynamic relocs, this
3857 function selects those that must be copied when linking a shared
3858 library or PIE, even when the symbol is local. */
65f38f15 3859
1d483afe
AM
3860static int
3861must_be_dyn_reloc (struct bfd_link_info *info,
3862 enum elf_ppc64_reloc_type r_type)
3863{
3864 switch (r_type)
3865 {
3866 default:
7c8bbca5
AM
3867 /* Only relative relocs can be resolved when the object load
3868 address isn't fixed. DTPREL64 is excluded because the
3869 dynamic linker needs to differentiate global dynamic from
3870 local dynamic __tls_index pairs when PPC64_OPT_TLS is set. */
1d483afe
AM
3871 return 1;
3872
3873 case R_PPC64_REL32:
3874 case R_PPC64_REL64:
3875 case R_PPC64_REL30:
3876 return 0;
3877
3878 case R_PPC64_TPREL16:
3879 case R_PPC64_TPREL16_LO:
3880 case R_PPC64_TPREL16_HI:
3881 case R_PPC64_TPREL16_HA:
3882 case R_PPC64_TPREL16_DS:
3883 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
3884 case R_PPC64_TPREL16_HIGH:
3885 case R_PPC64_TPREL16_HIGHA:
1d483afe
AM
3886 case R_PPC64_TPREL16_HIGHER:
3887 case R_PPC64_TPREL16_HIGHERA:
3888 case R_PPC64_TPREL16_HIGHEST:
3889 case R_PPC64_TPREL16_HIGHESTA:
3890 case R_PPC64_TPREL64:
7c8bbca5
AM
3891 /* These relocations are relative but in a shared library the
3892 linker doesn't know the thread pointer base. */
3893 return bfd_link_dll (info);
1d483afe
AM
3894 }
3895}
65f38f15 3896
f4656909
AM
3897/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3898 copying dynamic variables from a shared lib into an app's dynbss
3899 section, and instead use a dynamic relocation to point into the
5d35169e
AM
3900 shared lib. With code that gcc generates, it's vital that this be
3901 enabled; In the PowerPC64 ABI, the address of a function is actually
3902 the address of a function descriptor, which resides in the .opd
3903 section. gcc uses the descriptor directly rather than going via the
3904 GOT as some other ABI's do, which means that initialized function
3905 pointers must reference the descriptor. Thus, a function pointer
3906 initialized to the address of a function in a shared library will
3907 either require a copy reloc, or a dynamic reloc. Using a copy reloc
4cc11e76 3908 redefines the function descriptor symbol to point to the copy. This
5d35169e
AM
3909 presents a problem as a plt entry for that function is also
3910 initialized from the function descriptor symbol and the copy reloc
3911 may not be initialized first. */
a23b6845 3912#define ELIMINATE_COPY_RELOCS 1
f4656909 3913
721956f4 3914/* Section name for stubs is the associated section name plus this
29942be8
NC
3915 string. */
3916#define STUB_SUFFIX ".stub"
721956f4
AM
3917
3918/* Linker stubs.
3919 ppc_stub_long_branch:
3920 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3921 destination, but a 24 bit branch in a stub section will reach.
3922 . b dest
3923
3924 ppc_stub_plt_branch:
3925 Similar to the above, but a 24 bit branch in the stub section won't
3926 reach its destination.
71a39c98
AM
3927 . addis %r11,%r2,xxx@toc@ha
3928 . ld %r12,xxx@toc@l(%r11)
3929 . mtctr %r12
721956f4
AM
3930 . bctr
3931
3932 ppc_stub_plt_call:
2c66dc6c
AM
3933 Used to call a function in a shared library. If it so happens that
3934 the plt entry referenced crosses a 64k boundary, then an extra
71a39c98 3935 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
721956f4 3936 . std %r2,40(%r1)
71a39c98
AM
3937 . addis %r11,%r2,xxx@toc@ha
3938 . ld %r12,xxx+0@toc@l(%r11)
3939 . mtctr %r12
3940 . ld %r2,xxx+8@toc@l(%r11)
3941 . ld %r11,xxx+16@toc@l(%r11)
721956f4 3942 . bctr
ad8e1ba5
AM
3943
3944 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3945 code to adjust the value and save r2 to support multiple toc sections.
3946 A ppc_stub_long_branch with an r2 offset looks like:
3947 . std %r2,40(%r1)
3948 . addis %r2,%r2,off@ha
3949 . addi %r2,%r2,off@l
3950 . b dest
3951
3952 A ppc_stub_plt_branch with an r2 offset looks like:
3953 . std %r2,40(%r1)
71a39c98
AM
3954 . addis %r11,%r2,xxx@toc@ha
3955 . ld %r12,xxx@toc@l(%r11)
ad8e1ba5
AM
3956 . addis %r2,%r2,off@ha
3957 . addi %r2,%r2,off@l
71a39c98 3958 . mtctr %r12
ad8e1ba5 3959 . bctr
ac2df442
AM
3960
3961 In cases where the "addis" instruction would add zero, the "addis" is
3962 omitted and following instructions modified slightly in some cases.
721956f4
AM
3963*/
3964
3965enum ppc_stub_type {
3966 ppc_stub_none,
3967 ppc_stub_long_branch,
ad8e1ba5 3968 ppc_stub_long_branch_r2off,
721956f4 3969 ppc_stub_plt_branch,
ad8e1ba5 3970 ppc_stub_plt_branch_r2off,
794e51c0 3971 ppc_stub_plt_call,
7341d5e2 3972 ppc_stub_plt_call_r2save,
a4b6fadd
AM
3973 ppc_stub_global_entry,
3974 ppc_stub_save_res
721956f4
AM
3975};
3976
6f20ed8a
AM
3977/* Information on stub grouping. */
3978struct map_stub
3979{
3980 /* The stub section. */
3981 asection *stub_sec;
3982 /* This is the section to which stubs in the group will be attached. */
3983 asection *link_sec;
a4b6fadd
AM
3984 /* Next group. */
3985 struct map_stub *next;
3986 /* Whether to emit a copy of register save/restore functions in this
3987 group. */
3988 int needs_save_res;
d4aaa2a0
AM
3989 /* The offset of the __tls_get_addr_opt plt stub bctrl in this group,
3990 or -1u if no such stub with bctrl exists. */
3991 unsigned int tls_get_addr_opt_bctrl;
6f20ed8a
AM
3992};
3993
721956f4
AM
3994struct ppc_stub_hash_entry {
3995
3996 /* Base hash table entry structure. */
3997 struct bfd_hash_entry root;
3998
ad8e1ba5
AM
3999 enum ppc_stub_type stub_type;
4000
6f20ed8a
AM
4001 /* Group information. */
4002 struct map_stub *group;
721956f4
AM
4003
4004 /* Offset within stub_sec of the beginning of this stub. */
4005 bfd_vma stub_offset;
4006
4007 /* Given the symbol's value and its section we can determine its final
4008 value when building the stubs (so the stub knows where to jump. */
4009 bfd_vma target_value;
4010 asection *target_section;
4011
721956f4
AM
4012 /* The symbol table entry, if any, that this was derived from. */
4013 struct ppc_link_hash_entry *h;
e054468f 4014 struct plt_entry *plt_ent;
721956f4 4015
2d7ad24e
AM
4016 /* Symbol type. */
4017 unsigned char symtype;
4018
6911b7dc
AM
4019 /* Symbol st_other. */
4020 unsigned char other;
721956f4
AM
4021};
4022
4023struct ppc_branch_hash_entry {
4024
4025 /* Base hash table entry structure. */
4026 struct bfd_hash_entry root;
4027
c456f082 4028 /* Offset within branch lookup table. */
721956f4
AM
4029 unsigned int offset;
4030
4031 /* Generation marker. */
4032 unsigned int iter;
4033};
65f38f15 4034
19e08130
AM
4035/* Used to track dynamic relocations for local symbols. */
4036struct ppc_dyn_relocs
4037{
4038 struct ppc_dyn_relocs *next;
4039
4040 /* The input section of the reloc. */
4041 asection *sec;
4042
4043 /* Total number of relocs copied for the input section. */
4044 unsigned int count : 31;
4045
4046 /* Whether this entry is for STT_GNU_IFUNC symbols. */
4047 unsigned int ifunc : 1;
4048};
4049
65f38f15
AM
4050struct ppc_link_hash_entry
4051{
4052 struct elf_link_hash_entry elf;
4053
b3fac117
AM
4054 union {
4055 /* A pointer to the most recently used stub hash entry against this
4056 symbol. */
4057 struct ppc_stub_hash_entry *stub_cache;
4058
4059 /* A pointer to the next symbol starting with a '.' */
4060 struct ppc_link_hash_entry *next_dot_sym;
4061 } u;
721956f4 4062
65f38f15 4063 /* Track dynamic relocs copied for this symbol. */
6061a67d 4064 struct elf_dyn_relocs *dyn_relocs;
e86ce104 4065
721956f4 4066 /* Link between function code and descriptor symbols. */
34814b9f 4067 struct ppc_link_hash_entry *oh;
721956f4 4068
e86ce104
AM
4069 /* Flag function code and descriptor symbols. */
4070 unsigned int is_func:1;
4071 unsigned int is_func_descriptor:1;
908b32fc 4072 unsigned int fake:1;
411e1bfb 4073
c5614fa4
AM
4074 /* Whether global opd/toc sym has been adjusted or not.
4075 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
4076 should be set for all globals defined in any opd/toc section. */
754021d0
AM
4077 unsigned int adjust_done:1;
4078
a4b6fadd
AM
4079 /* Set if this is an out-of-line register save/restore function,
4080 with non-standard calling convention. */
4081 unsigned int save_res:1;
4082
8b5f1ed8
AM
4083 /* Set if a duplicate symbol with non-zero localentry is detected,
4084 even when the duplicate symbol does not provide a definition. */
4085 unsigned int non_zero_localentry:1;
4086
411e1bfb 4087 /* Contexts in which symbol is used in the GOT (or TOC).
37da22e5
AM
4088 Bits are or'd into the mask as the corresponding relocs are
4089 encountered during check_relocs, with TLS_TLS being set when any
4090 of the other TLS bits are set. tls_optimize clears bits when
4091 optimizing to indicate the corresponding GOT entry type is not
4092 needed. If set, TLS_TLS is never cleared. tls_optimize may also
4093 set TLS_TPRELGD when a GD reloc turns into a TPREL one. We use a
4094 separate flag rather than setting TPREL just for convenience in
4095 distinguishing the two cases.
4096 These flags are also kept for local symbols. */
4097#define TLS_TLS 1 /* Any TLS reloc. */
4098#define TLS_GD 2 /* GD reloc. */
4099#define TLS_LD 4 /* LD reloc. */
4100#define TLS_TPREL 8 /* TPREL reloc, => IE. */
4101#define TLS_DTPREL 16 /* DTPREL reloc, => LD. */
4102#define TLS_MARK 32 /* __tls_get_addr call marked. */
e7b938ca 4103#define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
37da22e5 4104#define TLS_EXPLICIT 128 /* Marks TOC section TLS relocs. */
f961d9dd 4105 unsigned char tls_mask;
37da22e5
AM
4106
4107 /* The above field is also used to mark function symbols. In which
4108 case TLS_TLS will be 0. */
4109#define PLT_IFUNC 2 /* STT_GNU_IFUNC. */
2d7ad24e 4110#define PLT_KEEP 4 /* inline plt call requires plt entry. */
37da22e5 4111#define NON_GOT 256 /* local symbol plt, not stored. */
65f38f15
AM
4112};
4113
4114/* ppc64 ELF linker hash table. */
4115
4116struct ppc_link_hash_table
4117{
4118 struct elf_link_hash_table elf;
4119
721956f4
AM
4120 /* The stub hash table. */
4121 struct bfd_hash_table stub_hash_table;
4122
4123 /* Another hash table for plt_branch stubs. */
4124 struct bfd_hash_table branch_hash_table;
4125
3b421ab3
AM
4126 /* Hash table for function prologue tocsave. */
4127 htab_t tocsave_htab;
4128
e7d1c40c
AM
4129 /* Various options and other info passed from the linker. */
4130 struct ppc64_elf_params *params;
721956f4 4131
6f20ed8a
AM
4132 /* The size of sec_info below. */
4133 unsigned int sec_info_arr_size;
4134
4135 /* Per-section array of extra section info. Done this way rather
4136 than as part of ppc64_elf_section_data so we have the info for
4137 non-ppc64 sections. */
4138 struct
4139 {
4140 /* Along with elf_gp, specifies the TOC pointer used by this section. */
ad8e1ba5 4141 bfd_vma toc_off;
6f20ed8a
AM
4142
4143 union
4144 {
4145 /* The section group that this section belongs to. */
4146 struct map_stub *group;
4147 /* A temp section list pointer. */
4148 asection *list;
4149 } u;
4150 } *sec_info;
721956f4 4151
a4b6fadd
AM
4152 /* Linked list of groups. */
4153 struct map_stub *group;
4154
ad8e1ba5
AM
4155 /* Temp used when calculating TOC pointers. */
4156 bfd_vma toc_curr;
bf102f86
AM
4157 bfd *toc_bfd;
4158 asection *toc_first_sec;
ad8e1ba5 4159
b3fac117
AM
4160 /* Used when adding symbols. */
4161 struct ppc_link_hash_entry *dot_syms;
4162
33e44f2e 4163 /* Shortcuts to get to dynamic linker sections. */
4ce794b7 4164 asection *glink;
9e390558 4165 asection *global_entry;
82bd7b59 4166 asection *sfpr;
2d7ad24e
AM
4167 asection *pltlocal;
4168 asection *relpltlocal;
4ce794b7
AM
4169 asection *brlt;
4170 asection *relbrlt;
58d180e8 4171 asection *glink_eh_frame;
ec338859 4172
8387904d
AM
4173 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
4174 struct ppc_link_hash_entry *tls_get_addr;
4175 struct ppc_link_hash_entry *tls_get_addr_fd;
411e1bfb 4176
927be08e
AM
4177 /* The size of reliplt used by got entry relocs. */
4178 bfd_size_type got_reli_size;
4179
9b5ecbd0 4180 /* Statistics. */
7341d5e2 4181 unsigned long stub_count[ppc_stub_global_entry];
9b5ecbd0 4182
ee75fd95
AM
4183 /* Number of stubs against global syms. */
4184 unsigned long stub_globals;
4185
ee67d69a
AM
4186 /* Set if we're linking code with function descriptors. */
4187 unsigned int opd_abi:1;
4188
4c52953f 4189 /* Support for multiple toc sections. */
33c0ec9d 4190 unsigned int do_multi_toc:1;
4c52953f 4191 unsigned int multi_toc_needed:1;
927be08e 4192 unsigned int second_toc_pass:1;
67f0cbdb 4193 unsigned int do_toc_opt:1;
4c52953f 4194
9a23f96e
AM
4195 /* Set if tls optimization is enabled. */
4196 unsigned int do_tls_opt:1;
4197
3e04d765
AM
4198 /* Set if inline plt calls should be converted to direct calls. */
4199 unsigned int can_convert_all_inline_plt:1;
4200
5d1634d7 4201 /* Set on error. */
99877b66 4202 unsigned int stub_error:1;
721956f4 4203
8c5b4e52
AM
4204 /* Whether func_desc_adjust needs to be run over symbols. */
4205 unsigned int need_func_desc_adj:1;
721956f4 4206
82e66161
AM
4207 /* Whether there exist local gnu indirect function resolvers,
4208 referenced by dynamic relocations. */
4209 unsigned int local_ifunc_resolver:1;
4210 unsigned int maybe_local_ifunc_resolver:1;
4211
f378ab09
AM
4212 /* Whether plt calls for ELFv2 localentry:0 funcs have been optimized. */
4213 unsigned int has_plt_localentry0:1;
4214
721956f4
AM
4215 /* Incremented every time we size stubs. */
4216 unsigned int stub_iteration;
5d1634d7 4217
87d72d41
AM
4218 /* Small local sym cache. */
4219 struct sym_cache sym_cache;
65f38f15
AM
4220};
4221
4c52953f
AM
4222/* Rename some of the generic section flags to better document how they
4223 are used here. */
b0dddeec
AM
4224
4225/* Nonzero if this section has TLS related relocations. */
4226#define has_tls_reloc sec_flg0
4227
23cedd1d 4228/* Nonzero if this section has an old-style call to __tls_get_addr. */
b0dddeec
AM
4229#define has_tls_get_addr_call sec_flg1
4230
4231/* Nonzero if this section has any toc or got relocs. */
4232#define has_toc_reloc sec_flg2
4233
4234/* Nonzero if this section has a call to another section that uses
4235 the toc or got. */
d77c8a4b 4236#define makes_toc_func_call sec_flg3
b0dddeec
AM
4237
4238/* Recursion protection when determining above flag. */
d77c8a4b 4239#define call_check_in_progress sec_flg4
70cc837d 4240#define call_check_done sec_flg5
4c52953f 4241
65f38f15
AM
4242/* Get the ppc64 ELF linker hash table from a link_info structure. */
4243
4244#define ppc_hash_table(p) \
4dfe6ac6
NC
4245 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
4246 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
65f38f15 4247
721956f4
AM
4248#define ppc_stub_hash_lookup(table, string, create, copy) \
4249 ((struct ppc_stub_hash_entry *) \
4250 bfd_hash_lookup ((table), (string), (create), (copy)))
4251
4252#define ppc_branch_hash_lookup(table, string, create, copy) \
4253 ((struct ppc_branch_hash_entry *) \
4254 bfd_hash_lookup ((table), (string), (create), (copy)))
4255
4256/* Create an entry in the stub hash table. */
4257
4258static struct bfd_hash_entry *
4ce794b7
AM
4259stub_hash_newfunc (struct bfd_hash_entry *entry,
4260 struct bfd_hash_table *table,
4261 const char *string)
721956f4
AM
4262{
4263 /* Allocate the structure if it has not already been allocated by a
4264 subclass. */
4265 if (entry == NULL)
4266 {
4267 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
4268 if (entry == NULL)
4269 return entry;
4270 }
4271
4272 /* Call the allocation method of the superclass. */
4273 entry = bfd_hash_newfunc (entry, table, string);
4274 if (entry != NULL)
4275 {
4276 struct ppc_stub_hash_entry *eh;
4277
4278 /* Initialize the local fields. */
4279 eh = (struct ppc_stub_hash_entry *) entry;
ad8e1ba5 4280 eh->stub_type = ppc_stub_none;
6f20ed8a 4281 eh->group = NULL;
721956f4
AM
4282 eh->stub_offset = 0;
4283 eh->target_value = 0;
4284 eh->target_section = NULL;
721956f4 4285 eh->h = NULL;
6911b7dc 4286 eh->plt_ent = NULL;
6911b7dc 4287 eh->other = 0;
721956f4
AM
4288 }
4289
4290 return entry;
4291}
4292
4293/* Create an entry in the branch hash table. */
4294
4295static struct bfd_hash_entry *
4ce794b7
AM
4296branch_hash_newfunc (struct bfd_hash_entry *entry,
4297 struct bfd_hash_table *table,
4298 const char *string)
721956f4
AM
4299{
4300 /* Allocate the structure if it has not already been allocated by a
4301 subclass. */
4302 if (entry == NULL)
4303 {
4304 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
4305 if (entry == NULL)
4306 return entry;
4307 }
4308
4309 /* Call the allocation method of the superclass. */
4310 entry = bfd_hash_newfunc (entry, table, string);
4311 if (entry != NULL)
4312 {
4313 struct ppc_branch_hash_entry *eh;
4314
4315 /* Initialize the local fields. */
4316 eh = (struct ppc_branch_hash_entry *) entry;
4317 eh->offset = 0;
4318 eh->iter = 0;
4319 }
4320
4321 return entry;
4322}
4323
65f38f15
AM
4324/* Create an entry in a ppc64 ELF linker hash table. */
4325
4326static struct bfd_hash_entry *
4ce794b7
AM
4327link_hash_newfunc (struct bfd_hash_entry *entry,
4328 struct bfd_hash_table *table,
4329 const char *string)
65f38f15
AM
4330{
4331 /* Allocate the structure if it has not already been allocated by a
4332 subclass. */
4333 if (entry == NULL)
4334 {
4335 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
4336 if (entry == NULL)
4337 return entry;
4338 }
4339
4340 /* Call the allocation method of the superclass. */
4341 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
4342 if (entry != NULL)
4343 {
4344 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
4345
b3fac117 4346 memset (&eh->u.stub_cache, 0,
908b32fc 4347 (sizeof (struct ppc_link_hash_entry)
b3fac117
AM
4348 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
4349
4350 /* When making function calls, old ABI code references function entry
4351 points (dot symbols), while new ABI code references the function
4352 descriptor symbol. We need to make any combination of reference and
4353 definition work together, without breaking archive linking.
4354
4355 For a defined function "foo" and an undefined call to "bar":
4356 An old object defines "foo" and ".foo", references ".bar" (possibly
4357 "bar" too).
4358 A new object defines "foo" and references "bar".
4359
4360 A new object thus has no problem with its undefined symbols being
4361 satisfied by definitions in an old object. On the other hand, the
4362 old object won't have ".bar" satisfied by a new object.
4363
4364 Keep a list of newly added dot-symbols. */
4365
4366 if (string[0] == '.')
4367 {
4368 struct ppc_link_hash_table *htab;
4369
4370 htab = (struct ppc_link_hash_table *) table;
4371 eh->u.next_dot_sym = htab->dot_syms;
4372 htab->dot_syms = eh;
4373 }
65f38f15
AM
4374 }
4375
4376 return entry;
4377}
4378
3b421ab3
AM
4379struct tocsave_entry {
4380 asection *sec;
4381 bfd_vma offset;
4382};
4383
4384static hashval_t
4385tocsave_htab_hash (const void *p)
4386{
4387 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4aef7643 4388 return ((bfd_vma) (intptr_t) e->sec ^ e->offset) >> 3;
3b421ab3
AM
4389}
4390
4391static int
4392tocsave_htab_eq (const void *p1, const void *p2)
4393{
4394 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
4395 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
4396 return e1->sec == e2->sec && e1->offset == e2->offset;
4397}
4398
68faa637
AM
4399/* Destroy a ppc64 ELF linker hash table. */
4400
4401static void
d495ab0d 4402ppc64_elf_link_hash_table_free (bfd *obfd)
68faa637 4403{
d495ab0d 4404 struct ppc_link_hash_table *htab;
68faa637 4405
d495ab0d 4406 htab = (struct ppc_link_hash_table *) obfd->link.hash;
68faa637
AM
4407 if (htab->tocsave_htab)
4408 htab_delete (htab->tocsave_htab);
d495ab0d
AM
4409 bfd_hash_table_free (&htab->branch_hash_table);
4410 bfd_hash_table_free (&htab->stub_hash_table);
4411 _bfd_elf_link_hash_table_free (obfd);
68faa637
AM
4412}
4413
65f38f15
AM
4414/* Create a ppc64 ELF linker hash table. */
4415
4416static struct bfd_link_hash_table *
4ce794b7 4417ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
4418{
4419 struct ppc_link_hash_table *htab;
4420 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
4421
4ce794b7 4422 htab = bfd_zmalloc (amt);
65f38f15
AM
4423 if (htab == NULL)
4424 return NULL;
4425
66eb6687 4426 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4dfe6ac6
NC
4427 sizeof (struct ppc_link_hash_entry),
4428 PPC64_ELF_DATA))
65f38f15 4429 {
e2d34d7d 4430 free (htab);
65f38f15
AM
4431 return NULL;
4432 }
4433
721956f4 4434 /* Init the stub hash table too. */
66eb6687
AM
4435 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4436 sizeof (struct ppc_stub_hash_entry)))
2915c55b 4437 {
d495ab0d 4438 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
4439 return NULL;
4440 }
721956f4
AM
4441
4442 /* And the branch hash table. */
66eb6687
AM
4443 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4444 sizeof (struct ppc_branch_hash_entry)))
2915c55b
JK
4445 {
4446 bfd_hash_table_free (&htab->stub_hash_table);
d495ab0d 4447 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
4448 return NULL;
4449 }
721956f4 4450
3b421ab3
AM
4451 htab->tocsave_htab = htab_try_create (1024,
4452 tocsave_htab_hash,
4453 tocsave_htab_eq,
4454 NULL);
4455 if (htab->tocsave_htab == NULL)
2915c55b 4456 {
d495ab0d 4457 ppc64_elf_link_hash_table_free (abfd);
2915c55b
JK
4458 return NULL;
4459 }
d495ab0d 4460 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
3b421ab3 4461
3254fd24
AM
4462 /* Initializing two fields of the union is just cosmetic. We really
4463 only care about glist, but when compiled on a 32-bit host the
4464 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4465 debugger inspection of these fields look nicer. */
a6aa5195
AM
4466 htab->elf.init_got_refcount.refcount = 0;
4467 htab->elf.init_got_refcount.glist = NULL;
4468 htab->elf.init_plt_refcount.refcount = 0;
4469 htab->elf.init_plt_refcount.glist = NULL;
4470 htab->elf.init_got_offset.offset = 0;
4471 htab->elf.init_got_offset.glist = NULL;
4472 htab->elf.init_plt_offset.offset = 0;
4473 htab->elf.init_plt_offset.glist = NULL;
3254fd24 4474
65f38f15
AM
4475 return &htab->elf.root;
4476}
4477
bfeb4a28
AM
4478/* Create sections for linker generated code. */
4479
4480static bfd_boolean
4481create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4482{
4483 struct ppc_link_hash_table *htab;
4484 flagword flags;
4485
4486 htab = ppc_hash_table (info);
4487
bfeb4a28
AM
4488 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4489 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
b32547cd
AM
4490 if (htab->params->save_restore_funcs)
4491 {
4492 /* Create .sfpr for code to save and restore fp regs. */
4493 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4494 flags);
4495 if (htab->sfpr == NULL
4496 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4497 return FALSE;
4498 }
4499
4500 if (bfd_link_relocatable (info))
4501 return TRUE;
bfeb4a28
AM
4502
4503 /* Create .glink for lazy dynamic linking support. */
4504 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4505 flags);
4506 if (htab->glink == NULL
4507 || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4508 return FALSE;
4509
9e390558
AM
4510 /* The part of .glink used by global entry stubs, separate so that
4511 it can be aligned appropriately without affecting htab->glink. */
4512 htab->global_entry = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4513 flags);
4514 if (htab->global_entry == NULL
4515 || ! bfd_set_section_alignment (dynobj, htab->global_entry, 2))
4516 return FALSE;
4517
bfeb4a28
AM
4518 if (!info->no_ld_generated_unwind_info)
4519 {
4520 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4521 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4522 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4523 ".eh_frame",
4524 flags);
4525 if (htab->glink_eh_frame == NULL
4526 || !bfd_set_section_alignment (dynobj, htab->glink_eh_frame, 2))
4527 return FALSE;
4528 }
4529
4530 flags = SEC_ALLOC | SEC_LINKER_CREATED;
33e44f2e
AM
4531 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4532 if (htab->elf.iplt == NULL
4533 || ! bfd_set_section_alignment (dynobj, htab->elf.iplt, 3))
bfeb4a28
AM
4534 return FALSE;
4535
4536 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4537 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
33e44f2e
AM
4538 htab->elf.irelplt
4539 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
4540 if (htab->elf.irelplt == NULL
4541 || ! bfd_set_section_alignment (dynobj, htab->elf.irelplt, 3))
bfeb4a28
AM
4542 return FALSE;
4543
4544 /* Create branch lookup table for plt_branch stubs. */
4545 flags = (SEC_ALLOC | SEC_LOAD
4546 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4547 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4548 flags);
4549 if (htab->brlt == NULL
4550 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4551 return FALSE;
4552
2d7ad24e
AM
4553 /* Local plt entries, put in .branch_lt but a separate section for
4554 convenience. */
4555 htab->pltlocal = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4556 flags);
4557 if (htab->pltlocal == NULL
4558 || ! bfd_set_section_alignment (dynobj, htab->pltlocal, 3))
4559 return FALSE;
4560
0e1862bb 4561 if (!bfd_link_pic (info))
bfeb4a28
AM
4562 return TRUE;
4563
4564 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4565 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2d7ad24e
AM
4566 htab->relbrlt
4567 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
bfeb4a28
AM
4568 if (htab->relbrlt == NULL
4569 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4570 return FALSE;
4571
2d7ad24e
AM
4572 htab->relpltlocal
4573 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
4574 if (htab->relpltlocal == NULL
4575 || ! bfd_set_section_alignment (dynobj, htab->relpltlocal, 3))
4576 return FALSE;
4577
bfeb4a28
AM
4578 return TRUE;
4579}
4580
e717da7e
AM
4581/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4582
bfeb4a28 4583bfd_boolean
e7d1c40c
AM
4584ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
4585 struct ppc64_elf_params *params)
e717da7e
AM
4586{
4587 struct ppc_link_hash_table *htab;
4588
e7d1c40c 4589 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
e717da7e
AM
4590
4591/* Always hook our dynamic sections into the first bfd, which is the
4592 linker created stub bfd. This ensures that the GOT header is at
4593 the start of the output TOC section. */
4594 htab = ppc_hash_table (info);
e7d1c40c
AM
4595 htab->elf.dynobj = params->stub_bfd;
4596 htab->params = params;
bfeb4a28 4597
bfeb4a28 4598 return create_linkage_sections (htab->elf.dynobj, info);
e717da7e
AM
4599}
4600
721956f4
AM
4601/* Build a name for an entry in the stub hash table. */
4602
4603static char *
4ce794b7
AM
4604ppc_stub_name (const asection *input_section,
4605 const asection *sym_sec,
4606 const struct ppc_link_hash_entry *h,
4607 const Elf_Internal_Rela *rel)
721956f4
AM
4608{
4609 char *stub_name;
bcaa2f82 4610 ssize_t len;
721956f4
AM
4611
4612 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4613 offsets from a sym as a branch target? In fact, we could
4614 probably assume the addend is always zero. */
4615 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4616
4617 if (h)
4618 {
4619 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4620 stub_name = bfd_malloc (len);
46de2a7c
AM
4621 if (stub_name == NULL)
4622 return stub_name;
4623
bcaa2f82
AM
4624 len = sprintf (stub_name, "%08x.%s+%x",
4625 input_section->id & 0xffffffff,
4626 h->elf.root.root.string,
4627 (int) rel->r_addend & 0xffffffff);
721956f4
AM
4628 }
4629 else
4630 {
ad8e1ba5 4631 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4 4632 stub_name = bfd_malloc (len);
46de2a7c
AM
4633 if (stub_name == NULL)
4634 return stub_name;
4635
bcaa2f82
AM
4636 len = sprintf (stub_name, "%08x.%x:%x+%x",
4637 input_section->id & 0xffffffff,
4638 sym_sec->id & 0xffffffff,
4639 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4640 (int) rel->r_addend & 0xffffffff);
721956f4 4641 }
bcaa2f82 4642 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
ee75fd95 4643 stub_name[len - 2] = 0;
721956f4
AM
4644 return stub_name;
4645}
4646
4647/* Look up an entry in the stub hash. Stub entries are cached because
4648 creating the stub name takes a bit of time. */
4649
4650static struct ppc_stub_hash_entry *
4ce794b7
AM
4651ppc_get_stub_entry (const asection *input_section,
4652 const asection *sym_sec,
039b3fef 4653 struct ppc_link_hash_entry *h,
4ce794b7
AM
4654 const Elf_Internal_Rela *rel,
4655 struct ppc_link_hash_table *htab)
721956f4
AM
4656{
4657 struct ppc_stub_hash_entry *stub_entry;
6f20ed8a 4658 struct map_stub *group;
721956f4
AM
4659
4660 /* If this input section is part of a group of sections sharing one
4661 stub section, then use the id of the first section in the group.
4662 Stub names need to include a section id, as there may well be
4663 more than one stub used to reach say, printf, and we need to
4664 distinguish between them. */
6f20ed8a 4665 group = htab->sec_info[input_section->id].u.group;
89d77b8a
AM
4666 if (group == NULL)
4667 return NULL;
721956f4 4668
b3fac117
AM
4669 if (h != NULL && h->u.stub_cache != NULL
4670 && h->u.stub_cache->h == h
6f20ed8a 4671 && h->u.stub_cache->group == group)
721956f4 4672 {
b3fac117 4673 stub_entry = h->u.stub_cache;
721956f4
AM
4674 }
4675 else
4676 {
4677 char *stub_name;
4678
6f20ed8a 4679 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
721956f4
AM
4680 if (stub_name == NULL)
4681 return NULL;
4682
4683 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 4684 stub_name, FALSE, FALSE);
721956f4 4685 if (h != NULL)
b3fac117 4686 h->u.stub_cache = stub_entry;
721956f4
AM
4687
4688 free (stub_name);
4689 }
4690
4691 return stub_entry;
4692}
4693
4694/* Add a new stub entry to the stub hash. Not all fields of the new
4695 stub entry are initialised. */
4696
4697static struct ppc_stub_hash_entry *
4ce794b7
AM
4698ppc_add_stub (const char *stub_name,
4699 asection *section,
25f53a85 4700 struct bfd_link_info *info)
721956f4 4701{
25f53a85 4702 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 4703 struct map_stub *group;
721956f4
AM
4704 asection *link_sec;
4705 asection *stub_sec;
4706 struct ppc_stub_hash_entry *stub_entry;
4707
6f20ed8a
AM
4708 group = htab->sec_info[section->id].u.group;
4709 link_sec = group->link_sec;
4710 stub_sec = group->stub_sec;
721956f4
AM
4711 if (stub_sec == NULL)
4712 {
6f20ed8a
AM
4713 size_t namelen;
4714 bfd_size_type len;
4715 char *s_name;
721956f4 4716
6f20ed8a
AM
4717 namelen = strlen (link_sec->name);
4718 len = namelen + sizeof (STUB_SUFFIX);
4719 s_name = bfd_alloc (htab->params->stub_bfd, len);
4720 if (s_name == NULL)
4721 return NULL;
721956f4 4722
6f20ed8a
AM
4723 memcpy (s_name, link_sec->name, namelen);
4724 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4725 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
4726 if (stub_sec == NULL)
4727 return NULL;
4728 group->stub_sec = stub_sec;
721956f4
AM
4729 }
4730
4731 /* Enter this entry into the linker stub hash table. */
4732 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
b34976b6 4733 TRUE, FALSE);
721956f4
AM
4734 if (stub_entry == NULL)
4735 {
695344c0 4736 /* xgettext:c-format */
cf97bcb0
AM
4737 _bfd_error_handler (_("%pB: cannot create stub entry %s"),
4738 section->owner, stub_name);
721956f4
AM
4739 return NULL;
4740 }
4741
6f20ed8a 4742 stub_entry->group = group;
721956f4 4743 stub_entry->stub_offset = 0;
721956f4
AM
4744 return stub_entry;
4745}
4746
e717da7e
AM
4747/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4748 not already done. */
65f38f15 4749
b34976b6 4750static bfd_boolean
e717da7e 4751create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 4752{
e717da7e
AM
4753 asection *got, *relgot;
4754 flagword flags;
4755 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 4756
0c8d6e5c 4757 if (!is_ppc64_elf (abfd))
0ffa91dd 4758 return FALSE;
4dfe6ac6
NC
4759 if (htab == NULL)
4760 return FALSE;
0ffa91dd 4761
33e44f2e
AM
4762 if (!htab->elf.sgot
4763 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
4764 return FALSE;
e717da7e
AM
4765
4766 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4767 | SEC_LINKER_CREATED);
4768
c456f082 4769 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
e717da7e 4770 if (!got
e717da7e
AM
4771 || !bfd_set_section_alignment (abfd, got, 3))
4772 return FALSE;
65f38f15 4773
c456f082
AM
4774 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4775 flags | SEC_READONLY);
e717da7e 4776 if (!relgot
e717da7e 4777 || ! bfd_set_section_alignment (abfd, relgot, 3))
b34976b6 4778 return FALSE;
e717da7e
AM
4779
4780 ppc64_elf_tdata (abfd)->got = got;
4781 ppc64_elf_tdata (abfd)->relgot = relgot;
b34976b6 4782 return TRUE;
65f38f15 4783}
5bd4f169 4784
b31867b6
AM
4785/* Follow indirect and warning symbol links. */
4786
4787static inline struct bfd_link_hash_entry *
4788follow_link (struct bfd_link_hash_entry *h)
4789{
4790 while (h->type == bfd_link_hash_indirect
4791 || h->type == bfd_link_hash_warning)
4792 h = h->u.i.link;
4793 return h;
4794}
4795
4796static inline struct elf_link_hash_entry *
4797elf_follow_link (struct elf_link_hash_entry *h)
4798{
4799 return (struct elf_link_hash_entry *) follow_link (&h->root);
4800}
4801
4802static inline struct ppc_link_hash_entry *
4803ppc_follow_link (struct ppc_link_hash_entry *h)
4804{
4805 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4806}
4807
40d16e0b
AM
4808/* Merge PLT info on FROM with that on TO. */
4809
4810static void
4811move_plt_plist (struct ppc_link_hash_entry *from,
4812 struct ppc_link_hash_entry *to)
4813{
4814 if (from->elf.plt.plist != NULL)
4815 {
4816 if (to->elf.plt.plist != NULL)
4817 {
4818 struct plt_entry **entp;
4819 struct plt_entry *ent;
4820
4821 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4822 {
4823 struct plt_entry *dent;
4824
4825 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4826 if (dent->addend == ent->addend)
4827 {
4828 dent->plt.refcount += ent->plt.refcount;
4829 *entp = ent->next;
4830 break;
4831 }
4832 if (dent == NULL)
4833 entp = &ent->next;
4834 }
4835 *entp = to->elf.plt.plist;
4836 }
4837
4838 to->elf.plt.plist = from->elf.plt.plist;
4839 from->elf.plt.plist = NULL;
4840 }
4841}
4842
65f38f15
AM
4843/* Copy the extra info we tack onto an elf_link_hash_entry. */
4844
4845static void
fcfa13d2
AM
4846ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4847 struct elf_link_hash_entry *dir,
4848 struct elf_link_hash_entry *ind)
65f38f15
AM
4849{
4850 struct ppc_link_hash_entry *edir, *eind;
4851
4852 edir = (struct ppc_link_hash_entry *) dir;
4853 eind = (struct ppc_link_hash_entry *) ind;
4854
c79d6685
AM
4855 edir->is_func |= eind->is_func;
4856 edir->is_func_descriptor |= eind->is_func_descriptor;
4857 edir->tls_mask |= eind->tls_mask;
4858 if (eind->oh != NULL)
4859 edir->oh = ppc_follow_link (eind->oh);
4860
474436e6 4861 if (edir->elf.versioned != versioned_hidden)
e81830c5
AM
4862 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4863 edir->elf.ref_regular |= eind->elf.ref_regular;
4864 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4a7e5234 4865 edir->elf.non_got_ref |= eind->elf.non_got_ref;
e81830c5
AM
4866 edir->elf.needs_plt |= eind->elf.needs_plt;
4867 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
c79d6685 4868
d311bc8b
AM
4869 /* If we were called to copy over info for a weak sym, don't copy
4870 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
4871 in order to simplify readonly_dynrelocs and save a field in the
4872 symbol hash entry, but that means dyn_relocs can't be used in any
4873 tests about a specific symbol, or affect other symbol flags which
ab2477e1 4874 are then tested. */
d311bc8b 4875 if (eind->elf.root.type != bfd_link_hash_indirect)
ab2477e1 4876 return;
d311bc8b 4877
411e1bfb 4878 /* Copy over any dynamic relocs we may have on the indirect sym. */
bbd7ec4a 4879 if (eind->dyn_relocs != NULL)
65f38f15 4880 {
bbd7ec4a
AM
4881 if (edir->dyn_relocs != NULL)
4882 {
6061a67d
AM
4883 struct elf_dyn_relocs **pp;
4884 struct elf_dyn_relocs *p;
bbd7ec4a 4885
fcfa13d2 4886 /* Add reloc counts against the indirect sym to the direct sym
bbd7ec4a
AM
4887 list. Merge any entries against the same section. */
4888 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4889 {
6061a67d 4890 struct elf_dyn_relocs *q;
bbd7ec4a
AM
4891
4892 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4893 if (q->sec == p->sec)
4894 {
4895 q->pc_count += p->pc_count;
4896 q->count += p->count;
4897 *pp = p->next;
4898 break;
4899 }
4900 if (q == NULL)
4901 pp = &p->next;
4902 }
4903 *pp = edir->dyn_relocs;
4904 }
4905
65f38f15
AM
4906 edir->dyn_relocs = eind->dyn_relocs;
4907 eind->dyn_relocs = NULL;
4908 }
65f38f15 4909
81848ca0
AM
4910 /* Copy over got entries that we may have already seen to the
4911 symbol which just became indirect. */
411e1bfb
AM
4912 if (eind->elf.got.glist != NULL)
4913 {
4914 if (edir->elf.got.glist != NULL)
4915 {
4916 struct got_entry **entp;
4917 struct got_entry *ent;
4918
4919 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4920 {
4921 struct got_entry *dent;
4922
4923 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4924 if (dent->addend == ent->addend
e717da7e 4925 && dent->owner == ent->owner
411e1bfb
AM
4926 && dent->tls_type == ent->tls_type)
4927 {
4928 dent->got.refcount += ent->got.refcount;
4929 *entp = ent->next;
4930 break;
4931 }
4932 if (dent == NULL)
4933 entp = &ent->next;
4934 }
4935 *entp = edir->elf.got.glist;
4936 }
4937
4938 edir->elf.got.glist = eind->elf.got.glist;
4939 eind->elf.got.glist = NULL;
4940 }
4941
4942 /* And plt entries. */
40d16e0b 4943 move_plt_plist (eind, edir);
411e1bfb 4944
fcfa13d2 4945 if (eind->elf.dynindx != -1)
411e1bfb 4946 {
fcfa13d2
AM
4947 if (edir->elf.dynindx != -1)
4948 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4949 edir->elf.dynstr_index);
411e1bfb
AM
4950 edir->elf.dynindx = eind->elf.dynindx;
4951 edir->elf.dynstr_index = eind->elf.dynstr_index;
4952 eind->elf.dynindx = -1;
4953 eind->elf.dynstr_index = 0;
4954 }
411e1bfb
AM
4955}
4956
8387904d
AM
4957/* Find the function descriptor hash entry from the given function code
4958 hash entry FH. Link the entries via their OH fields. */
4959
4960static struct ppc_link_hash_entry *
b31867b6 4961lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
8387904d
AM
4962{
4963 struct ppc_link_hash_entry *fdh = fh->oh;
4964
4965 if (fdh == NULL)
4966 {
4967 const char *fd_name = fh->elf.root.root.string + 1;
4968
4969 fdh = (struct ppc_link_hash_entry *)
4970 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
b31867b6
AM
4971 if (fdh == NULL)
4972 return fdh;
4973
4974 fdh->is_func_descriptor = 1;
4975 fdh->oh = fh;
4976 fh->is_func = 1;
4977 fh->oh = fdh;
8387904d
AM
4978 }
4979
8c5b4e52
AM
4980 fdh = ppc_follow_link (fdh);
4981 fdh->is_func_descriptor = 1;
4982 fdh->oh = fh;
4983 return fdh;
8387904d
AM
4984}
4985
8c5b4e52 4986/* Make a fake function descriptor sym for the undefined code sym FH. */
bb700d78
AM
4987
4988static struct ppc_link_hash_entry *
4989make_fdh (struct bfd_link_info *info,
908b32fc 4990 struct ppc_link_hash_entry *fh)
bb700d78 4991{
8c5b4e52
AM
4992 bfd *abfd = fh->elf.root.u.undef.abfd;
4993 struct bfd_link_hash_entry *bh = NULL;
bb700d78 4994 struct ppc_link_hash_entry *fdh;
8c5b4e52
AM
4995 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
4996 ? BSF_WEAK
4997 : BSF_GLOBAL);
4998
4999 if (!_bfd_generic_link_add_one_symbol (info, abfd,
5000 fh->elf.root.root.string + 1,
5001 flags, bfd_und_section_ptr, 0,
5002 NULL, FALSE, FALSE, &bh))
bb700d78
AM
5003 return NULL;
5004
5005 fdh = (struct ppc_link_hash_entry *) bh;
5006 fdh->elf.non_elf = 0;
908b32fc
AM
5007 fdh->fake = 1;
5008 fdh->is_func_descriptor = 1;
5009 fdh->oh = fh;
5010 fh->is_func = 1;
5011 fh->oh = fdh;
bb700d78
AM
5012 return fdh;
5013}
5014
8387904d
AM
5015/* Fix function descriptor symbols defined in .opd sections to be
5016 function type. */
555cd476
AM
5017
5018static bfd_boolean
c16153ae 5019ppc64_elf_add_symbol_hook (bfd *ibfd,
e054468f 5020 struct bfd_link_info *info,
555cd476 5021 Elf_Internal_Sym *isym,
6911b7dc 5022 const char **name,
555cd476
AM
5023 flagword *flags ATTRIBUTE_UNUSED,
5024 asection **sec,
b53dfeb2 5025 bfd_vma *value)
555cd476 5026{
a43942db 5027 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
f1885d1e
AM
5028 && (ibfd->flags & DYNAMIC) == 0
5029 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
a43942db 5030 elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc;
f64b2e8d 5031
b53dfeb2 5032 if (*sec != NULL
f1885d1e 5033 && strcmp ((*sec)->name, ".opd") == 0)
b53dfeb2
AM
5034 {
5035 asection *code_sec;
5036
5037 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
5038 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
5039 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
5040
5041 /* If the symbol is a function defined in .opd, and the function
5042 code is in a discarded group, let it appear to be undefined. */
0e1862bb 5043 if (!bfd_link_relocatable (info)
b53dfeb2
AM
5044 && (*sec)->reloc_count != 0
5045 && opd_entry_value (*sec, *value, &code_sec, NULL,
5046 FALSE) != (bfd_vma) -1
5047 && discarded_section (code_sec))
5048 {
5049 *sec = bfd_und_section_ptr;
5050 isym->st_shndx = SHN_UNDEF;
5051 }
5052 }
dbd1e97e
AM
5053 else if (*sec != NULL
5054 && strcmp ((*sec)->name, ".toc") == 0
5055 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
5056 {
5057 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5058 if (htab != NULL)
5059 htab->params->object_in_toc = 1;
5060 }
433817dd 5061
6911b7dc
AM
5062 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
5063 {
5064 if (abiversion (ibfd) == 0)
5065 set_abiversion (ibfd, 2);
5066 else if (abiversion (ibfd) == 1)
5067 {
cf97bcb0
AM
5068 _bfd_error_handler (_("symbol '%s' has invalid st_other"
5069 " for ABI version 1"), *name);
6911b7dc
AM
5070 bfd_set_error (bfd_error_bad_value);
5071 return FALSE;
5072 }
5073 }
5074
555cd476
AM
5075 return TRUE;
5076}
5077
6911b7dc
AM
5078/* Merge non-visibility st_other attributes: local entry point. */
5079
5080static void
5081ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
5082 const Elf_Internal_Sym *isym,
5083 bfd_boolean definition,
5084 bfd_boolean dynamic)
5085{
f378ab09 5086 if (definition && (!dynamic || !h->def_regular))
6911b7dc
AM
5087 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
5088 | ELF_ST_VISIBILITY (h->other));
5089}
5090
8c5b4e52
AM
5091/* Hook called on merging a symbol. We use this to clear "fake" since
5092 we now have a real symbol. */
5093
5094static bfd_boolean
5095ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
8b5f1ed8 5096 const Elf_Internal_Sym *isym,
8c5b4e52
AM
5097 asection **psec ATTRIBUTE_UNUSED,
5098 bfd_boolean newdef ATTRIBUTE_UNUSED,
5099 bfd_boolean olddef ATTRIBUTE_UNUSED,
5100 bfd *oldbfd ATTRIBUTE_UNUSED,
5101 const asection *oldsec ATTRIBUTE_UNUSED)
5102{
5103 ((struct ppc_link_hash_entry *) h)->fake = 0;
8b5f1ed8
AM
5104 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
5105 ((struct ppc_link_hash_entry *) h)->non_zero_localentry = 1;
8c5b4e52
AM
5106 return TRUE;
5107}
5108
8387904d 5109/* This function makes an old ABI object reference to ".bar" cause the
908b32fc
AM
5110 inclusion of a new ABI object archive that defines "bar".
5111 NAME is a symbol defined in an archive. Return a symbol in the hash
5112 table that might be satisfied by the archive symbols. */
8387904d
AM
5113
5114static struct elf_link_hash_entry *
5115ppc64_elf_archive_symbol_lookup (bfd *abfd,
5116 struct bfd_link_info *info,
5117 const char *name)
5118{
5119 struct elf_link_hash_entry *h;
5120 char *dot_name;
5121 size_t len;
5122
5123 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
908b32fc
AM
5124 if (h != NULL
5125 /* Don't return this sym if it is a fake function descriptor
5126 created by add_symbol_adjust. */
8c5b4e52 5127 && !((struct ppc_link_hash_entry *) h)->fake)
8387904d
AM
5128 return h;
5129
5130 if (name[0] == '.')
5131 return h;
5132
5133 len = strlen (name);
5134 dot_name = bfd_alloc (abfd, len + 2);
5135 if (dot_name == NULL)
e99955cd 5136 return (struct elf_link_hash_entry *) -1;
8387904d
AM
5137 dot_name[0] = '.';
5138 memcpy (dot_name + 1, name, len + 1);
5139 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
5140 bfd_release (abfd, dot_name);
5141 return h;
5142}
5143
5144/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
5145 new ABI object defines "bar". Well, at least, undefined dot symbols
5146 are made weak. This stops later archive searches from including an
5147 object if we already have a function descriptor definition. It also
35b0ce59
AM
5148 prevents the linker complaining about undefined symbols.
5149 We also check and correct mismatched symbol visibility here. The
5150 most restrictive visibility of the function descriptor and the
5151 function entry symbol is used. */
8387904d
AM
5152
5153static bfd_boolean
b3fac117 5154add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
8387904d 5155{
8387904d
AM
5156 struct ppc_link_hash_table *htab;
5157 struct ppc_link_hash_entry *fdh;
5158
b3fac117
AM
5159 if (eh->elf.root.type == bfd_link_hash_warning)
5160 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
8387904d 5161
8400d40d
AM
5162 if (eh->elf.root.type == bfd_link_hash_indirect)
5163 return TRUE;
5164
b3fac117
AM
5165 if (eh->elf.root.root.string[0] != '.')
5166 abort ();
8387904d 5167
b3fac117 5168 htab = ppc_hash_table (info);
4dfe6ac6
NC
5169 if (htab == NULL)
5170 return FALSE;
5171
b31867b6 5172 fdh = lookup_fdh (eh, htab);
8c5b4e52
AM
5173 if (fdh == NULL
5174 && !bfd_link_relocatable (info)
5175 && (eh->elf.root.type == bfd_link_hash_undefined
5176 || eh->elf.root.type == bfd_link_hash_undefweak)
5177 && eh->elf.ref_regular)
5178 {
5179 /* Make an undefined function descriptor sym, in order to
5180 pull in an --as-needed shared lib. Archives are handled
5181 elsewhere. */
5182 fdh = make_fdh (info, eh);
5183 if (fdh == NULL)
5184 return FALSE;
bb700d78 5185 }
8c5b4e52
AM
5186
5187 if (fdh != NULL)
8387904d 5188 {
35b0ce59
AM
5189 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
5190 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
8c5b4e52
AM
5191
5192 /* Make both descriptor and entry symbol have the most
5193 constraining visibility of either symbol. */
35b0ce59
AM
5194 if (entry_vis < descr_vis)
5195 fdh->elf.other += entry_vis - descr_vis;
5196 else if (entry_vis > descr_vis)
5197 eh->elf.other += descr_vis - entry_vis;
5198
8c5b4e52
AM
5199 /* Propagate reference flags from entry symbol to function
5200 descriptor symbol. */
bc4e12de 5201 fdh->elf.root.non_ir_ref_regular |= eh->elf.root.non_ir_ref_regular;
4070765b 5202 fdh->elf.root.non_ir_ref_dynamic |= eh->elf.root.non_ir_ref_dynamic;
8c5b4e52
AM
5203 fdh->elf.ref_regular |= eh->elf.ref_regular;
5204 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
5205
5206 if (!fdh->elf.forced_local
5207 && fdh->elf.dynindx == -1
5208 && fdh->elf.versioned != versioned_hidden
5209 && (bfd_link_dll (info)
5210 || fdh->elf.def_dynamic
5211 || fdh->elf.ref_dynamic)
5212 && (eh->elf.ref_regular
5213 || eh->elf.def_regular))
5214 {
5215 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
5216 return FALSE;
35b0ce59 5217 }
8387904d 5218 }
99877b66 5219
8387904d
AM
5220 return TRUE;
5221}
5222
f6c7c3e8
AM
5223/* Set up opd section info and abiversion for IBFD, and process list
5224 of dot-symbols we made in link_hash_newfunc. */
b3fac117 5225
8387904d 5226static bfd_boolean
f6c7c3e8 5227ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
8387904d 5228{
99877b66 5229 struct ppc_link_hash_table *htab;
b3fac117 5230 struct ppc_link_hash_entry **p, *eh;
459609d6 5231 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
433817dd 5232
459609d6 5233 if (opd != NULL && opd->size != 0)
b3fac117 5234 {
b9399fcf
AM
5235 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
5236 ppc64_elf_section_data (opd)->sec_type = sec_opd;
5237
459609d6
AM
5238 if (abiversion (ibfd) == 0)
5239 set_abiversion (ibfd, 1);
8a2058b5 5240 else if (abiversion (ibfd) >= 2)
f6c7c3e8 5241 {
695344c0 5242 /* xgettext:c-format */
cf97bcb0
AM
5243 _bfd_error_handler (_("%pB .opd not allowed in ABI version %d"),
5244 ibfd, abiversion (ibfd));
459609d6
AM
5245 bfd_set_error (bfd_error_bad_value);
5246 return FALSE;
f6c7c3e8 5247 }
b9399fcf 5248 }
f6c7c3e8 5249
b9399fcf
AM
5250 if (is_ppc64_elf (info->output_bfd))
5251 {
5252 /* For input files without an explicit abiversion in e_flags
5253 we should have flagged any with symbol st_other bits set
5254 as ELFv1 and above flagged those with .opd as ELFv2.
5255 Set the output abiversion if not yet set, and for any input
5256 still ambiguous, take its abiversion from the output.
5257 Differences in ABI are reported later. */
5258 if (abiversion (info->output_bfd) == 0)
5259 set_abiversion (info->output_bfd, abiversion (ibfd));
5260 else if (abiversion (ibfd) == 0)
5261 set_abiversion (ibfd, abiversion (info->output_bfd));
b3fac117
AM
5262 }
5263
459609d6
AM
5264 htab = ppc_hash_table (info);
5265 if (htab == NULL)
b9399fcf 5266 return TRUE;
459609d6 5267
b9399fcf
AM
5268 if (opd != NULL && opd->size != 0
5269 && (ibfd->flags & DYNAMIC) == 0
5270 && (opd->flags & SEC_RELOC) != 0
5271 && opd->reloc_count != 0
5272 && !bfd_is_abs_section (opd->output_section)
5273 && info->gc_sections)
5274 {
5275 /* Garbage collection needs some extra help with .opd sections.
5276 We don't want to necessarily keep everything referenced by
5277 relocs in .opd, as that would keep all functions. Instead,
5278 if we reference an .opd symbol (a function descriptor), we
5279 want to keep the function code symbol's section. This is
5280 easy for global symbols, but for local syms we need to keep
5281 information about the associated function section. */
5282 bfd_size_type amt;
5283 asection **opd_sym_map;
5284 Elf_Internal_Shdr *symtab_hdr;
5285 Elf_Internal_Rela *relocs, *rel_end, *rel;
5286
5287 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
5288 opd_sym_map = bfd_zalloc (ibfd, amt);
5289 if (opd_sym_map == NULL)
5290 return FALSE;
5291 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
5292 relocs = _bfd_elf_link_read_relocs (ibfd, opd, NULL, NULL,
5293 info->keep_memory);
5294 if (relocs == NULL)
5295 return FALSE;
5296 symtab_hdr = &elf_symtab_hdr (ibfd);
5297 rel_end = relocs + opd->reloc_count - 1;
5298 for (rel = relocs; rel < rel_end; rel++)
5299 {
5300 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
5301 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
5302
5303 if (r_type == R_PPC64_ADDR64
5304 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC
5305 && r_symndx < symtab_hdr->sh_info)
5306 {
5307 Elf_Internal_Sym *isym;
5308 asection *s;
5309
5310 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, r_symndx);
5311 if (isym == NULL)
5312 {
5313 if (elf_section_data (opd)->relocs != relocs)
5314 free (relocs);
5315 return FALSE;
5316 }
5317
5318 s = bfd_section_from_elf_index (ibfd, isym->st_shndx);
5319 if (s != NULL && s != opd)
5320 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
5321 }
5322 }
5323 if (elf_section_data (opd)->relocs != relocs)
5324 free (relocs);
5325 }
459609d6
AM
5326
5327 p = &htab->dot_syms;
5328 while ((eh = *p) != NULL)
5329 {
5330 *p = NULL;
5331 if (&eh->elf == htab->elf.hgot)
5332 ;
5333 else if (htab->elf.hgot == NULL
5334 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
5335 htab->elf.hgot = &eh->elf;
8c5b4e52
AM
5336 else if (abiversion (ibfd) <= 1)
5337 {
5338 htab->need_func_desc_adj = 1;
5339 if (!add_symbol_adjust (eh, info))
5340 return FALSE;
5341 }
459609d6
AM
5342 p = &eh->u.next_dot_sym;
5343 }
b3fac117 5344 return TRUE;
8387904d
AM
5345}
5346
97fed1c9
JJ
5347/* Undo hash table changes when an --as-needed input file is determined
5348 not to be needed. */
5349
5350static bfd_boolean
e5034e59
AM
5351ppc64_elf_notice_as_needed (bfd *ibfd,
5352 struct bfd_link_info *info,
5353 enum notice_asneeded_action act)
97fed1c9 5354{
e5034e59
AM
5355 if (act == notice_not_needed)
5356 {
5357 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6 5358
e5034e59
AM
5359 if (htab == NULL)
5360 return FALSE;
4dfe6ac6 5361
e5034e59
AM
5362 htab->dot_syms = NULL;
5363 }
5364 return _bfd_elf_notice_as_needed (ibfd, info, act);
97fed1c9
JJ
5365}
5366
aa374f67
AM
5367/* If --just-symbols against a final linked binary, then assume we need
5368 toc adjusting stubs when calling functions defined there. */
5369
5370static void
5371ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
5372{
5373 if ((sec->flags & SEC_CODE) != 0
5374 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
5375 && is_ppc64_elf (sec->owner))
5376 {
2c3f079f
AM
5377 if (abiversion (sec->owner) >= 2
5378 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
aa374f67
AM
5379 sec->has_toc_reloc = 1;
5380 }
5381 _bfd_elf_link_just_syms (sec, info);
5382}
5383
e054468f 5384static struct plt_entry **
4ce794b7
AM
5385update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
5386 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
5387{
5388 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e054468f 5389 struct plt_entry **local_plt;
f961d9dd 5390 unsigned char *local_got_tls_masks;
411e1bfb
AM
5391
5392 if (local_got_ents == NULL)
5393 {
5394 bfd_size_type size = symtab_hdr->sh_info;
5395
e054468f
AM
5396 size *= (sizeof (*local_got_ents)
5397 + sizeof (*local_plt)
5398 + sizeof (*local_got_tls_masks));
4ce794b7 5399 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb 5400 if (local_got_ents == NULL)
e054468f 5401 return NULL;
411e1bfb
AM
5402 elf_local_got_ents (abfd) = local_got_ents;
5403 }
5404
37da22e5 5405 if ((tls_type & (NON_GOT | TLS_EXPLICIT)) == 0)
411e1bfb
AM
5406 {
5407 struct got_entry *ent;
5408
5409 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
5410 if (ent->addend == r_addend
5411 && ent->owner == abfd
5412 && ent->tls_type == tls_type)
411e1bfb
AM
5413 break;
5414 if (ent == NULL)
5415 {
5416 bfd_size_type amt = sizeof (*ent);
4ce794b7 5417 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
5418 if (ent == NULL)
5419 return FALSE;
5420 ent->next = local_got_ents[r_symndx];
5421 ent->addend = r_addend;
e717da7e 5422 ent->owner = abfd;
411e1bfb 5423 ent->tls_type = tls_type;
927be08e 5424 ent->is_indirect = FALSE;
411e1bfb
AM
5425 ent->got.refcount = 0;
5426 local_got_ents[r_symndx] = ent;
5427 }
5428 ent->got.refcount += 1;
5429 }
5430
e054468f 5431 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
f961d9dd 5432 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
37da22e5 5433 local_got_tls_masks[r_symndx] |= tls_type & 0xff;
e054468f
AM
5434
5435 return local_plt + r_symndx;
65f38f15
AM
5436}
5437
411e1bfb 5438static bfd_boolean
e054468f 5439update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
1e2f5b6e 5440{
411e1bfb 5441 struct plt_entry *ent;
1e2f5b6e 5442
e054468f 5443 for (ent = *plist; ent != NULL; ent = ent->next)
411e1bfb
AM
5444 if (ent->addend == addend)
5445 break;
5446 if (ent == NULL)
1e2f5b6e 5447 {
411e1bfb 5448 bfd_size_type amt = sizeof (*ent);
4ce794b7 5449 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
5450 if (ent == NULL)
5451 return FALSE;
e054468f 5452 ent->next = *plist;
411e1bfb
AM
5453 ent->addend = addend;
5454 ent->plt.refcount = 0;
e054468f 5455 *plist = ent;
1e2f5b6e 5456 }
411e1bfb 5457 ent->plt.refcount += 1;
b34976b6 5458 return TRUE;
1e2f5b6e
AM
5459}
5460
e054468f
AM
5461static bfd_boolean
5462is_branch_reloc (enum elf_ppc64_reloc_type r_type)
5463{
5464 return (r_type == R_PPC64_REL24
5465 || r_type == R_PPC64_REL14
5466 || r_type == R_PPC64_REL14_BRTAKEN
5467 || r_type == R_PPC64_REL14_BRNTAKEN
5468 || r_type == R_PPC64_ADDR24
5469 || r_type == R_PPC64_ADDR14
5470 || r_type == R_PPC64_ADDR14_BRTAKEN
23cedd1d
AM
5471 || r_type == R_PPC64_ADDR14_BRNTAKEN
5472 || r_type == R_PPC64_PLTCALL);
5473}
5474
5475/* Relocs on inline plt call sequence insns prior to the call. */
5476
5477static bfd_boolean
5478is_plt_seq_reloc (enum elf_ppc64_reloc_type r_type)
5479{
5480 return (r_type == R_PPC64_PLT16_HA
5481 || r_type == R_PPC64_PLT16_HI
5482 || r_type == R_PPC64_PLT16_LO
5483 || r_type == R_PPC64_PLT16_LO_DS
5484 || r_type == R_PPC64_PLTSEQ);
e054468f
AM
5485}
5486
5bd4f169 5487/* Look through the relocs for a section during the first phase, and
65f38f15 5488 calculate needed space in the global offset table, procedure
5d1634d7 5489 linkage table, and dynamic reloc sections. */
5bd4f169 5490
b34976b6 5491static bfd_boolean
4ce794b7
AM
5492ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
5493 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 5494{
65f38f15 5495 struct ppc_link_hash_table *htab;
5bd4f169 5496 Elf_Internal_Shdr *symtab_hdr;
c7e2358a 5497 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
5498 const Elf_Internal_Rela *rel;
5499 const Elf_Internal_Rela *rel_end;
5bd4f169 5500 asection *sreloc;
3a71aa26 5501 struct elf_link_hash_entry *tga, *dottga;
b9399fcf 5502 bfd_boolean is_opd;
5bd4f169 5503
0e1862bb 5504 if (bfd_link_relocatable (info))
b34976b6 5505 return TRUE;
5bd4f169 5506
680a3378
AM
5507 /* Don't do anything special with non-loaded, non-alloced sections.
5508 In particular, any relocs in such sections should not affect GOT
5509 and PLT reference counting (ie. we don't allow them to create GOT
5510 or PLT entries), there's no possibility or desire to optimize TLS
5511 relocs, and there's not much point in propagating relocs to shared
5512 libs that the dynamic linker won't relocate. */
5513 if ((sec->flags & SEC_ALLOC) == 0)
5514 return TRUE;
5515
0c8d6e5c 5516 BFD_ASSERT (is_ppc64_elf (abfd));
0ffa91dd 5517
65f38f15 5518 htab = ppc_hash_table (info);
4dfe6ac6
NC
5519 if (htab == NULL)
5520 return FALSE;
5521
3a71aa26
AM
5522 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5523 FALSE, FALSE, TRUE);
5524 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
5525 FALSE, FALSE, TRUE);
0ffa91dd 5526 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 5527 sym_hashes = elf_sym_hashes (abfd);
5bd4f169 5528 sreloc = NULL;
b9399fcf 5529 is_opd = ppc64_elf_section_data (sec)->sec_type == sec_opd;
5bd4f169
AM
5530 rel_end = relocs + sec->reloc_count;
5531 for (rel = relocs; rel < rel_end; rel++)
5532 {
5533 unsigned long r_symndx;
5534 struct elf_link_hash_entry *h;
04c9666a 5535 enum elf_ppc64_reloc_type r_type;
727fc41e 5536 int tls_type;
7c8fe5c4 5537 struct _ppc64_elf_section_data *ppc64_sec;
cbf95972 5538 struct plt_entry **ifunc, **plt_list;
5bd4f169
AM
5539
5540 r_symndx = ELF64_R_SYM (rel->r_info);
5541 if (r_symndx < symtab_hdr->sh_info)
5542 h = NULL;
5543 else
973a3492
L
5544 {
5545 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 5546 h = elf_follow_link (h);
1c865ab2
AM
5547
5548 if (h == htab->elf.hgot)
5549 sec->has_toc_reloc = 1;
973a3492 5550 }
5bd4f169 5551
727fc41e 5552 tls_type = 0;
e054468f 5553 ifunc = NULL;
25f23106
AM
5554 if (h != NULL)
5555 {
5556 if (h->type == STT_GNU_IFUNC)
5557 {
5558 h->needs_plt = 1;
5559 ifunc = &h->plt.plist;
5560 }
5561 }
5562 else
5563 {
5564 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5565 abfd, r_symndx);
5566 if (isym == NULL)
5567 return FALSE;
5568
5569 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5570 {
5571 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
37da22e5
AM
5572 rel->r_addend,
5573 NON_GOT | PLT_IFUNC);
25f23106
AM
5574 if (ifunc == NULL)
5575 return FALSE;
5576 }
5577 }
727fc41e 5578
cbf95972 5579 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 5580 switch (r_type)
5bd4f169 5581 {
727fc41e
AM
5582 case R_PPC64_TLSGD:
5583 case R_PPC64_TLSLD:
5584 /* These special tls relocs tie a call to __tls_get_addr with
5585 its parameter symbol. */
37da22e5
AM
5586 if (h != NULL)
5587 ((struct ppc_link_hash_entry *) h)->tls_mask |= TLS_TLS | TLS_MARK;
5588 else
5589 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5590 rel->r_addend,
5591 NON_GOT | TLS_TLS | TLS_MARK))
5592 return FALSE;
5593 sec->has_tls_reloc = 1;
727fc41e
AM
5594 break;
5595
411e1bfb
AM
5596 case R_PPC64_GOT_TLSLD16:
5597 case R_PPC64_GOT_TLSLD16_LO:
5598 case R_PPC64_GOT_TLSLD16_HI:
5599 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 5600 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
5601 goto dogottls;
5602
5603 case R_PPC64_GOT_TLSGD16:
5604 case R_PPC64_GOT_TLSGD16_LO:
5605 case R_PPC64_GOT_TLSGD16_HI:
5606 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 5607 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
5608 goto dogottls;
5609
5610 case R_PPC64_GOT_TPREL16_DS:
5611 case R_PPC64_GOT_TPREL16_LO_DS:
5612 case R_PPC64_GOT_TPREL16_HI:
5613 case R_PPC64_GOT_TPREL16_HA:
7c8bbca5 5614 if (bfd_link_dll (info))
411e1bfb
AM
5615 info->flags |= DF_STATIC_TLS;
5616 tls_type = TLS_TLS | TLS_TPREL;
5617 goto dogottls;
5618
5619 case R_PPC64_GOT_DTPREL16_DS:
5620 case R_PPC64_GOT_DTPREL16_LO_DS:
5621 case R_PPC64_GOT_DTPREL16_HI:
5622 case R_PPC64_GOT_DTPREL16_HA:
5623 tls_type = TLS_TLS | TLS_DTPREL;
5624 dogottls:
5625 sec->has_tls_reloc = 1;
1a0670f3 5626 /* Fall through */
411e1bfb 5627
5bd4f169 5628 case R_PPC64_GOT16:
5bd4f169 5629 case R_PPC64_GOT16_DS:
65f38f15
AM
5630 case R_PPC64_GOT16_HA:
5631 case R_PPC64_GOT16_HI:
5632 case R_PPC64_GOT16_LO:
5bd4f169 5633 case R_PPC64_GOT16_LO_DS:
65f38f15 5634 /* This symbol requires a global offset table entry. */
4c52953f 5635 sec->has_toc_reloc = 1;
33c0ec9d
AM
5636 if (r_type == R_PPC64_GOT_TLSLD16
5637 || r_type == R_PPC64_GOT_TLSGD16
5638 || r_type == R_PPC64_GOT_TPREL16_DS
5639 || r_type == R_PPC64_GOT_DTPREL16_DS
5640 || r_type == R_PPC64_GOT16
5641 || r_type == R_PPC64_GOT16_DS)
5642 {
5643 htab->do_multi_toc = 1;
d77c8a4b 5644 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
33c0ec9d
AM
5645 }
5646
e717da7e
AM
5647 if (ppc64_elf_tdata (abfd)->got == NULL
5648 && !create_got_section (abfd, info))
b34976b6 5649 return FALSE;
5bd4f169
AM
5650
5651 if (h != NULL)
5652 {
411e1bfb
AM
5653 struct ppc_link_hash_entry *eh;
5654 struct got_entry *ent;
65f38f15 5655
411e1bfb
AM
5656 eh = (struct ppc_link_hash_entry *) h;
5657 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5658 if (ent->addend == rel->r_addend
e717da7e 5659 && ent->owner == abfd
411e1bfb
AM
5660 && ent->tls_type == tls_type)
5661 break;
5662 if (ent == NULL)
5bd4f169 5663 {
411e1bfb 5664 bfd_size_type amt = sizeof (*ent);
4ce794b7 5665 ent = bfd_alloc (abfd, amt);
411e1bfb 5666 if (ent == NULL)
b34976b6 5667 return FALSE;
411e1bfb
AM
5668 ent->next = eh->elf.got.glist;
5669 ent->addend = rel->r_addend;
e717da7e 5670 ent->owner = abfd;
411e1bfb 5671 ent->tls_type = tls_type;
927be08e 5672 ent->is_indirect = FALSE;
411e1bfb
AM
5673 ent->got.refcount = 0;
5674 eh->elf.got.glist = ent;
5bd4f169 5675 }
411e1bfb 5676 ent->got.refcount += 1;
e7b938ca 5677 eh->tls_mask |= tls_type;
5bd4f169 5678 }
411e1bfb
AM
5679 else
5680 /* This is a global offset table entry for a local symbol. */
5681 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5682 rel->r_addend, tls_type))
5683 return FALSE;
a345bc8d
AM
5684
5685 /* We may also need a plt entry if the symbol turns out to be
5686 an ifunc. */
0e1862bb 5687 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1)
a345bc8d
AM
5688 {
5689 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5690 return FALSE;
5691 }
5bd4f169
AM
5692 break;
5693
5bd4f169 5694 case R_PPC64_PLT16_HA:
65f38f15
AM
5695 case R_PPC64_PLT16_HI:
5696 case R_PPC64_PLT16_LO:
08be3224 5697 case R_PPC64_PLT16_LO_DS:
65f38f15
AM
5698 case R_PPC64_PLT32:
5699 case R_PPC64_PLT64:
cbf95972
AM
5700 /* This symbol requires a procedure linkage table entry. */
5701 plt_list = ifunc;
5702 if (h != NULL)
e054468f 5703 {
e054468f
AM
5704 h->needs_plt = 1;
5705 if (h->root.root.string[0] == '.'
5706 && h->root.root.string[1] != '\0')
5707 ((struct ppc_link_hash_entry *) h)->is_func = 1;
2d7ad24e 5708 ((struct ppc_link_hash_entry *) h)->tls_mask |= PLT_KEEP;
cbf95972
AM
5709 plt_list = &h->plt.plist;
5710 }
5711 if (plt_list == NULL)
2d7ad24e
AM
5712 plt_list = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5713 rel->r_addend,
5714 NON_GOT | PLT_KEEP);
cbf95972
AM
5715 if (!update_plt_info (abfd, plt_list, rel->r_addend))
5716 return FALSE;
5bd4f169
AM
5717 break;
5718
5719 /* The following relocations don't need to propagate the
5720 relocation if linking a shared object since they are
5721 section relative. */
5722 case R_PPC64_SECTOFF:
5723 case R_PPC64_SECTOFF_LO:
5724 case R_PPC64_SECTOFF_HI:
5725 case R_PPC64_SECTOFF_HA:
5726 case R_PPC64_SECTOFF_DS:
5727 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
5728 case R_PPC64_DTPREL16:
5729 case R_PPC64_DTPREL16_LO:
5730 case R_PPC64_DTPREL16_HI:
5731 case R_PPC64_DTPREL16_HA:
5732 case R_PPC64_DTPREL16_DS:
5733 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
5734 case R_PPC64_DTPREL16_HIGH:
5735 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
5736 case R_PPC64_DTPREL16_HIGHER:
5737 case R_PPC64_DTPREL16_HIGHERA:
5738 case R_PPC64_DTPREL16_HIGHEST:
5739 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
5740 break;
5741
ad8e1ba5 5742 /* Nor do these. */
25f23106
AM
5743 case R_PPC64_REL16:
5744 case R_PPC64_REL16_LO:
5745 case R_PPC64_REL16_HI:
5746 case R_PPC64_REL16_HA:
a680de9a 5747 case R_PPC64_REL16DX_HA:
25f23106
AM
5748 break;
5749
45965137
AM
5750 /* Not supported as a dynamic relocation. */
5751 case R_PPC64_ADDR64_LOCAL:
0e1862bb 5752 if (bfd_link_pic (info))
45965137
AM
5753 {
5754 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5755 ppc_howto_init ();
695344c0 5756 /* xgettext:c-format */
174d0a74 5757 info->callbacks->einfo (_("%H: %s reloc unsupported "
cf97bcb0 5758 "in shared libraries and PIEs\n"),
45965137
AM
5759 abfd, sec, rel->r_offset,
5760 ppc64_elf_howto_table[r_type]->name);
5761 bfd_set_error (bfd_error_bad_value);
5762 return FALSE;
5763 }
5764 break;
5765
ad8e1ba5 5766 case R_PPC64_TOC16:
33c0ec9d
AM
5767 case R_PPC64_TOC16_DS:
5768 htab->do_multi_toc = 1;
d77c8a4b 5769 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
1a0670f3 5770 /* Fall through. */
ad8e1ba5
AM
5771 case R_PPC64_TOC16_LO:
5772 case R_PPC64_TOC16_HI:
5773 case R_PPC64_TOC16_HA:
ad8e1ba5 5774 case R_PPC64_TOC16_LO_DS:
4c52953f 5775 sec->has_toc_reloc = 1;
ad8e1ba5
AM
5776 break;
5777
006589cf
AM
5778 /* Marker reloc. */
5779 case R_PPC64_ENTRY:
5780 break;
5781
5bd4f169
AM
5782 /* This relocation describes the C++ object vtable hierarchy.
5783 Reconstruct it for later use during GC. */
5784 case R_PPC64_GNU_VTINHERIT:
c152c796 5785 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 5786 return FALSE;
5bd4f169
AM
5787 break;
5788
5789 /* This relocation describes which C++ vtable entries are actually
5790 used. Record for later use during GC. */
5791 case R_PPC64_GNU_VTENTRY:
d17e0c6e
JB
5792 BFD_ASSERT (h != NULL);
5793 if (h != NULL
5794 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 5795 return FALSE;
5bd4f169
AM
5796 break;
5797
721956f4
AM
5798 case R_PPC64_REL14:
5799 case R_PPC64_REL14_BRTAKEN:
5800 case R_PPC64_REL14_BRNTAKEN:
220c76dd
AM
5801 {
5802 asection *dest = NULL;
5803
5804 /* Heuristic: If jumping outside our section, chances are
5805 we are going to need a stub. */
5806 if (h != NULL)
5807 {
5808 /* If the sym is weak it may be overridden later, so
5809 don't assume we know where a weak sym lives. */
5810 if (h->root.type == bfd_link_hash_defined)
5811 dest = h->root.u.def.section;
5812 }
5813 else
87d72d41
AM
5814 {
5815 Elf_Internal_Sym *isym;
5816
5817 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5818 abfd, r_symndx);
5819 if (isym == NULL)
5820 return FALSE;
5821
5822 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5823 }
5824
220c76dd 5825 if (dest != sec)
7c8fe5c4 5826 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
220c76dd 5827 }
3e04d765
AM
5828 goto rel24;
5829
5830 case R_PPC64_PLTCALL:
5831 ppc64_elf_section_data (sec)->has_pltcall = 1;
721956f4
AM
5832 /* Fall through. */
5833
5d1634d7 5834 case R_PPC64_REL24:
3e04d765 5835 rel24:
cbf95972
AM
5836 plt_list = ifunc;
5837 if (h != NULL)
5d1634d7 5838 {
e054468f
AM
5839 h->needs_plt = 1;
5840 if (h->root.root.string[0] == '.'
5841 && h->root.root.string[1] != '\0')
5842 ((struct ppc_link_hash_entry *) h)->is_func = 1;
cbf95972 5843
3a71aa26 5844 if (h == tga || h == dottga)
cbf95972
AM
5845 {
5846 sec->has_tls_reloc = 1;
5847 if (rel != relocs
5848 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5849 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5850 /* We have a new-style __tls_get_addr call with
5851 a marker reloc. */
5852 ;
5853 else
5854 /* Mark this section as having an old-style call. */
5855 sec->has_tls_get_addr_call = 1;
5856 }
5857 plt_list = &h->plt.plist;
411e1bfb 5858 }
cbf95972
AM
5859
5860 /* We may need a .plt entry if the function this reloc
5861 refers to is in a shared lib. */
5862 if (plt_list
5863 && !update_plt_info (abfd, plt_list, rel->r_addend))
5864 return FALSE;
411e1bfb
AM
5865 break;
5866
cbf95972
AM
5867 case R_PPC64_ADDR14:
5868 case R_PPC64_ADDR14_BRNTAKEN:
5869 case R_PPC64_ADDR14_BRTAKEN:
5870 case R_PPC64_ADDR24:
5871 goto dodyn;
5872
411e1bfb
AM
5873 case R_PPC64_TPREL64:
5874 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
7c8bbca5 5875 if (bfd_link_dll (info))
411e1bfb
AM
5876 info->flags |= DF_STATIC_TLS;
5877 goto dotlstoc;
5878
5879 case R_PPC64_DTPMOD64:
5880 if (rel + 1 < rel_end
5881 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5882 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 5883 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 5884 else
951fd09b 5885 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
5886 goto dotlstoc;
5887
5888 case R_PPC64_DTPREL64:
5889 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5890 if (rel != relocs
5891 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5892 && rel[-1].r_offset == rel->r_offset - 8)
5893 /* This is the second reloc of a dtpmod, dtprel pair.
5894 Don't mark with TLS_DTPREL. */
5895 goto dodyn;
5896
5897 dotlstoc:
5898 sec->has_tls_reloc = 1;
5899 if (h != NULL)
5900 {
5901 struct ppc_link_hash_entry *eh;
5902 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 5903 eh->tls_mask |= tls_type;
411e1bfb
AM
5904 }
5905 else
5906 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5907 rel->r_addend, tls_type))
5908 return FALSE;
5909
7c8fe5c4
AM
5910 ppc64_sec = ppc64_elf_section_data (sec);
5911 if (ppc64_sec->sec_type != sec_toc)
411e1bfb 5912 {
3a71aa26
AM
5913 bfd_size_type amt;
5914
e7b938ca 5915 /* One extra to simplify get_tls_mask. */
3a71aa26
AM
5916 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5917 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5918 if (ppc64_sec->u.toc.symndx == NULL)
5919 return FALSE;
5920 amt = sec->size * sizeof (bfd_vma) / 8;
5921 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5922 if (ppc64_sec->u.toc.add == NULL)
411e1bfb 5923 return FALSE;
7c8fe5c4
AM
5924 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5925 ppc64_sec->sec_type = sec_toc;
411e1bfb
AM
5926 }
5927 BFD_ASSERT (rel->r_offset % 8 == 0);
3a71aa26
AM
5928 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5929 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
951fd09b
AM
5930
5931 /* Mark the second slot of a GD or LD entry.
5932 -1 to indicate GD and -2 to indicate LD. */
5933 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
3a71aa26 5934 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
951fd09b 5935 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
3a71aa26 5936 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
5937 goto dodyn;
5938
5939 case R_PPC64_TPREL16:
5940 case R_PPC64_TPREL16_LO:
5941 case R_PPC64_TPREL16_HI:
5942 case R_PPC64_TPREL16_HA:
5943 case R_PPC64_TPREL16_DS:
5944 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
5945 case R_PPC64_TPREL16_HIGH:
5946 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
5947 case R_PPC64_TPREL16_HIGHER:
5948 case R_PPC64_TPREL16_HIGHERA:
5949 case R_PPC64_TPREL16_HIGHEST:
5950 case R_PPC64_TPREL16_HIGHESTA:
7c8bbca5
AM
5951 if (bfd_link_dll (info))
5952 info->flags |= DF_STATIC_TLS;
5953 goto dodyn;
5d1634d7 5954
e86ce104 5955 case R_PPC64_ADDR64:
b9399fcf 5956 if (is_opd
1e2f5b6e 5957 && rel + 1 < rel_end
4ce794b7 5958 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
1e2f5b6e 5959 {
8387904d 5960 if (h != NULL)
8c5b4e52 5961 ((struct ppc_link_hash_entry *) h)->is_func = 1;
1e2f5b6e 5962 }
e86ce104
AM
5963 /* Fall through. */
5964
65f38f15
AM
5965 case R_PPC64_ADDR16:
5966 case R_PPC64_ADDR16_DS:
5967 case R_PPC64_ADDR16_HA:
5968 case R_PPC64_ADDR16_HI:
f9c6b907
AM
5969 case R_PPC64_ADDR16_HIGH:
5970 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
5971 case R_PPC64_ADDR16_HIGHER:
5972 case R_PPC64_ADDR16_HIGHERA:
5973 case R_PPC64_ADDR16_HIGHEST:
5974 case R_PPC64_ADDR16_HIGHESTA:
5975 case R_PPC64_ADDR16_LO:
5976 case R_PPC64_ADDR16_LO_DS:
0e1862bb 5977 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
a345bc8d
AM
5978 && rel->r_addend == 0)
5979 {
5980 /* We may need a .plt entry if this reloc refers to a
5981 function in a shared lib. */
5982 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5983 return FALSE;
5984 h->pointer_equality_needed = 1;
5985 }
5986 /* Fall through. */
5987
5988 case R_PPC64_REL30:
5989 case R_PPC64_REL32:
5990 case R_PPC64_REL64:
65f38f15 5991 case R_PPC64_ADDR32:
65f38f15
AM
5992 case R_PPC64_UADDR16:
5993 case R_PPC64_UADDR32:
5994 case R_PPC64_UADDR64:
5bd4f169 5995 case R_PPC64_TOC:
0e1862bb 5996 if (h != NULL && !bfd_link_pic (info))
81848ca0 5997 /* We may need a copy reloc. */
f5385ebf 5998 h->non_got_ref = 1;
81848ca0 5999
41bd81ab 6000 /* Don't propagate .opd relocs. */
b9399fcf 6001 if (NO_OPD_RELOCS && is_opd)
e86ce104 6002 break;
e86ce104 6003
65f38f15
AM
6004 /* If we are creating a shared library, and this is a reloc
6005 against a global symbol, or a non PC relative reloc
6006 against a local symbol, then we need to copy the reloc
6007 into the shared library. However, if we are linking with
6008 -Bsymbolic, we do not need to copy a reloc against a
6009 global symbol which is defined in an object we are
6010 including in the link (i.e., DEF_REGULAR is set). At
6011 this point we have not seen all the input files, so it is
6012 possible that DEF_REGULAR is not set now but will be set
6013 later (it is never cleared). In case of a weak definition,
6014 DEF_REGULAR may be cleared later by a strong definition in
6015 a shared library. We account for that possibility below by
f4656909 6016 storing information in the dyn_relocs field of the hash
65f38f15
AM
6017 table entry. A similar situation occurs when creating
6018 shared libraries and symbol visibility changes render the
6019 symbol local.
6020
6021 If on the other hand, we are creating an executable, we
6022 may need to keep relocations for symbols satisfied by a
6023 dynamic library if we manage to avoid copy relocs for the
6024 symbol. */
411e1bfb 6025 dodyn:
0e1862bb 6026 if ((bfd_link_pic (info)
1d483afe 6027 && (must_be_dyn_reloc (info, r_type)
65f38f15 6028 || (h != NULL
198f1157 6029 && (!SYMBOLIC_BIND (info, h)
65f38f15 6030 || h->root.type == bfd_link_hash_defweak
f5385ebf 6031 || !h->def_regular))))
f4656909 6032 || (ELIMINATE_COPY_RELOCS
0e1862bb 6033 && !bfd_link_pic (info)
65f38f15
AM
6034 && h != NULL
6035 && (h->root.type == bfd_link_hash_defweak
25f23106 6036 || !h->def_regular))
0e1862bb 6037 || (!bfd_link_pic (info)
25f23106 6038 && ifunc != NULL))
5bd4f169 6039 {
65f38f15
AM
6040 /* We must copy these reloc types into the output file.
6041 Create a reloc section in dynobj and make room for
6042 this reloc. */
5bd4f169
AM
6043 if (sreloc == NULL)
6044 {
83bac4b0
NC
6045 sreloc = _bfd_elf_make_dynamic_reloc_section
6046 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
65f38f15 6047
5bd4f169 6048 if (sreloc == NULL)
83bac4b0 6049 return FALSE;
5bd4f169
AM
6050 }
6051
65f38f15
AM
6052 /* If this is a global symbol, we count the number of
6053 relocations we need for this symbol. */
6054 if (h != NULL)
6055 {
19e08130
AM
6056 struct elf_dyn_relocs *p;
6057 struct elf_dyn_relocs **head;
6058
ec338859 6059 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
19e08130
AM
6060 p = *head;
6061 if (p == NULL || p->sec != sec)
6062 {
6063 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
6064 if (p == NULL)
6065 return FALSE;
6066 p->next = *head;
6067 *head = p;
6068 p->sec = sec;
6069 p->count = 0;
6070 p->pc_count = 0;
6071 }
6072 p->count += 1;
6073 if (!must_be_dyn_reloc (info, r_type))
6074 p->pc_count += 1;
65f38f15
AM
6075 }
6076 else
6077 {
ec338859
AM
6078 /* Track dynamic relocs needed for local syms too.
6079 We really need local syms available to do this
6080 easily. Oh well. */
19e08130
AM
6081 struct ppc_dyn_relocs *p;
6082 struct ppc_dyn_relocs **head;
6083 bfd_boolean is_ifunc;
ec338859 6084 asection *s;
6edfbbad 6085 void *vpp;
87d72d41 6086 Elf_Internal_Sym *isym;
6edfbbad 6087
87d72d41
AM
6088 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
6089 abfd, r_symndx);
6090 if (isym == NULL)
b34976b6 6091 return FALSE;
ec338859 6092
87d72d41
AM
6093 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
6094 if (s == NULL)
6095 s = sec;
6096
6edfbbad 6097 vpp = &elf_section_data (s)->local_dynrel;
19e08130
AM
6098 head = (struct ppc_dyn_relocs **) vpp;
6099 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
6100 p = *head;
6101 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
6102 p = p->next;
6103 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
6104 {
6105 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
6106 if (p == NULL)
6107 return FALSE;
6108 p->next = *head;
6109 *head = p;
6110 p->sec = sec;
6111 p->ifunc = is_ifunc;
6112 p->count = 0;
6113 }
6114 p->count += 1;
ec338859 6115 }
65f38f15 6116 }
5bd4f169 6117 break;
65f38f15
AM
6118
6119 default:
96e0dda4 6120 break;
5bd4f169
AM
6121 }
6122 }
6123
b34976b6 6124 return TRUE;
5bd4f169
AM
6125}
6126
ee67d69a
AM
6127/* Merge backend specific data from an object file to the output
6128 object file when linking. */
6129
6130static bfd_boolean
50e03d47 6131ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
ee67d69a 6132{
50e03d47 6133 bfd *obfd = info->output_bfd;
ee67d69a
AM
6134 unsigned long iflags, oflags;
6135
6136 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
6137 return TRUE;
6138
6139 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
6140 return TRUE;
6141
50e03d47 6142 if (!_bfd_generic_verify_endian_match (ibfd, info))
ee67d69a
AM
6143 return FALSE;
6144
6145 iflags = elf_elfheader (ibfd)->e_flags;
6146 oflags = elf_elfheader (obfd)->e_flags;
6147
f6c7c3e8 6148 if (iflags & ~EF_PPC64_ABI)
ee67d69a 6149 {
4eca0228 6150 _bfd_error_handler
695344c0 6151 /* xgettext:c-format */
871b3ab2 6152 (_("%pB uses unknown e_flags 0x%lx"), ibfd, iflags);
ee67d69a
AM
6153 bfd_set_error (bfd_error_bad_value);
6154 return FALSE;
6155 }
f6c7c3e8 6156 else if (iflags != oflags && iflags != 0)
ee67d69a 6157 {
4eca0228 6158 _bfd_error_handler
695344c0 6159 /* xgettext:c-format */
871b3ab2 6160 (_("%pB: ABI version %ld is not compatible with ABI version %ld output"),
ee67d69a
AM
6161 ibfd, iflags, oflags);
6162 bfd_set_error (bfd_error_bad_value);
6163 return FALSE;
6164 }
6165
50e03d47 6166 _bfd_elf_ppc_merge_fp_attributes (ibfd, info);
005d79fd 6167
ee67d69a 6168 /* Merge Tag_compatibility attributes and any common GNU ones. */
50e03d47 6169 _bfd_elf_merge_object_attributes (ibfd, info);
ee67d69a
AM
6170
6171 return TRUE;
6172}
6173
6174static bfd_boolean
6175ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
6176{
6177 /* Print normal ELF private data. */
6178 _bfd_elf_print_private_bfd_data (abfd, ptr);
6179
6180 if (elf_elfheader (abfd)->e_flags != 0)
6181 {
6182 FILE *file = ptr;
6183
ee67d69a
AM
6184 fprintf (file, _("private flags = 0x%lx:"),
6185 elf_elfheader (abfd)->e_flags);
6186
6187 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
6188 fprintf (file, _(" [abiv%ld]"),
6189 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
6190 fputc ('\n', file);
6191 }
6192
6193 return TRUE;
6194}
6195
8387904d 6196/* OFFSET in OPD_SEC specifies a function descriptor. Return the address
b53dfeb2
AM
6197 of the code entry point, and its section, which must be in the same
6198 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
8387904d
AM
6199
6200static bfd_vma
6201opd_entry_value (asection *opd_sec,
6202 bfd_vma offset,
6203 asection **code_sec,
aef36ac1
AM
6204 bfd_vma *code_off,
6205 bfd_boolean in_code_sec)
8387904d
AM
6206{
6207 bfd *opd_bfd = opd_sec->owner;
8860955f 6208 Elf_Internal_Rela *relocs;
8387904d 6209 Elf_Internal_Rela *lo, *hi, *look;
645ea6a9 6210 bfd_vma val;
8387904d 6211
9f296da3
AM
6212 /* No relocs implies we are linking a --just-symbols object, or looking
6213 at a final linked executable with addr2line or somesuch. */
4b85d634
AM
6214 if (opd_sec->reloc_count == 0)
6215 {
729eabd5 6216 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
3b36f7e6 6217
729eabd5
AM
6218 if (contents == NULL)
6219 {
6220 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
6221 return (bfd_vma) -1;
6222 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
6223 }
ee1e4ede 6224
dbb3fbbb 6225 /* PR 17512: file: 64b9dfbb. */
451dfd38 6226 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
dbb3fbbb
NC
6227 return (bfd_vma) -1;
6228
729eabd5 6229 val = bfd_get_64 (opd_bfd, contents + offset);
aef36ac1
AM
6230 if (code_sec != NULL)
6231 {
6232 asection *sec, *likely = NULL;
ee1e4ede 6233
aef36ac1 6234 if (in_code_sec)
4b85d634 6235 {
aef36ac1
AM
6236 sec = *code_sec;
6237 if (sec->vma <= val
6238 && val < sec->vma + sec->size)
6239 likely = sec;
6240 else
6241 val = -1;
6242 }
6243 else
6244 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
6245 if (sec->vma <= val
6246 && (sec->flags & SEC_LOAD) != 0
6247 && (sec->flags & SEC_ALLOC) != 0)
6248 likely = sec;
6249 if (likely != NULL)
6250 {
6251 *code_sec = likely;
6252 if (code_off != NULL)
6253 *code_off = val - likely->vma;
4b85d634
AM
6254 }
6255 }
aef36ac1 6256 return val;
4b85d634
AM
6257 }
6258
0c8d6e5c 6259 BFD_ASSERT (is_ppc64_elf (opd_bfd));
0ffa91dd 6260
729eabd5 6261 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
8860955f
AM
6262 if (relocs == NULL)
6263 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
877a8638
NC
6264 /* PR 17512: file: df8e1fd6. */
6265 if (relocs == NULL)
6266 return (bfd_vma) -1;
645ea6a9 6267
8387904d 6268 /* Go find the opd reloc at the sym address. */
8860955f 6269 lo = relocs;
8387904d 6270 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
645ea6a9 6271 val = (bfd_vma) -1;
8387904d
AM
6272 while (lo < hi)
6273 {
6274 look = lo + (hi - lo) / 2;
6275 if (look->r_offset < offset)
6276 lo = look + 1;
6277 else if (look->r_offset > offset)
6278 hi = look;
6279 else
6280 {
0ffa91dd
NC
6281 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
6282
8387904d
AM
6283 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
6284 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
6285 {
6286 unsigned long symndx = ELF64_R_SYM (look->r_info);
b53dfeb2 6287 asection *sec = NULL;
8387904d 6288
b53dfeb2
AM
6289 if (symndx >= symtab_hdr->sh_info
6290 && elf_sym_hashes (opd_bfd) != NULL)
8387904d
AM
6291 {
6292 struct elf_link_hash_entry **sym_hashes;
6293 struct elf_link_hash_entry *rh;
6294
6295 sym_hashes = elf_sym_hashes (opd_bfd);
6296 rh = sym_hashes[symndx - symtab_hdr->sh_info];
128205bb
AM
6297 if (rh != NULL)
6298 {
6299 rh = elf_follow_link (rh);
bb854a36
AM
6300 if (rh->root.type != bfd_link_hash_defined
6301 && rh->root.type != bfd_link_hash_defweak)
6302 break;
6303 if (rh->root.u.def.section->owner == opd_bfd)
b53dfeb2 6304 {
bb854a36
AM
6305 val = rh->root.u.def.value;
6306 sec = rh->root.u.def.section;
b53dfeb2
AM
6307 }
6308 }
6309 }
6310
6311 if (sec == NULL)
6312 {
6313 Elf_Internal_Sym *sym;
6314
6315 if (symndx < symtab_hdr->sh_info)
6316 {
6317 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
6318 if (sym == NULL)
6319 {
6320 size_t symcnt = symtab_hdr->sh_info;
6321 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6322 symcnt, 0,
6323 NULL, NULL, NULL);
6324 if (sym == NULL)
6325 break;
6326 symtab_hdr->contents = (bfd_byte *) sym;
6327 }
6328 sym += symndx;
128205bb
AM
6329 }
6330 else
6331 {
b53dfeb2
AM
6332 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6333 1, symndx,
6334 NULL, NULL, NULL);
128205bb
AM
6335 if (sym == NULL)
6336 break;
128205bb 6337 }
b53dfeb2
AM
6338 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
6339 if (sec == NULL)
6340 break;
6341 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
6342 val = sym->st_value;
8387904d 6343 }
b53dfeb2 6344
8387904d
AM
6345 val += look->r_addend;
6346 if (code_off != NULL)
6347 *code_off = val;
6348 if (code_sec != NULL)
aef36ac1
AM
6349 {
6350 if (in_code_sec && *code_sec != sec)
6351 return -1;
6352 else
6353 *code_sec = sec;
6354 }
b53dfeb2 6355 if (sec->output_section != NULL)
8387904d 6356 val += sec->output_section->vma + sec->output_offset;
8387904d
AM
6357 }
6358 break;
6359 }
6360 }
645ea6a9 6361
645ea6a9 6362 return val;
8387904d
AM
6363}
6364
aef36ac1
AM
6365/* If the ELF symbol SYM might be a function in SEC, return the
6366 function size and set *CODE_OFF to the function's entry point,
6367 otherwise return zero. */
9f296da3 6368
aef36ac1
AM
6369static bfd_size_type
6370ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
6371 bfd_vma *code_off)
9f296da3 6372{
aef36ac1
AM
6373 bfd_size_type size;
6374
6375 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
6376 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
6377 return 0;
6378
6379 size = 0;
6380 if (!(sym->flags & BSF_SYNTHETIC))
6381 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
6382
6383 if (strcmp (sym->section->name, ".opd") == 0)
9f296da3 6384 {
b07bca4e
AM
6385 struct _opd_sec_data *opd = get_opd_info (sym->section);
6386 bfd_vma symval = sym->value;
6387
6388 if (opd != NULL
6389 && opd->adjust != NULL
6390 && elf_section_data (sym->section)->relocs != NULL)
6391 {
6392 /* opd_entry_value will use cached relocs that have been
6393 adjusted, but with raw symbols. That means both local
6394 and global symbols need adjusting. */
6395 long adjust = opd->adjust[OPD_NDX (symval)];
6396 if (adjust == -1)
6397 return 0;
6398 symval += adjust;
6399 }
6400
6401 if (opd_entry_value (sym->section, symval,
aef36ac1
AM
6402 &sec, code_off, TRUE) == (bfd_vma) -1)
6403 return 0;
6404 /* An old ABI binary with dot-syms has a size of 24 on the .opd
6405 symbol. This size has nothing to do with the code size of the
6406 function, which is what we're supposed to return, but the
6407 code size isn't available without looking up the dot-sym.
6408 However, doing that would be a waste of time particularly
6409 since elf_find_function will look at the dot-sym anyway.
6410 Now, elf_find_function will keep the largest size of any
6411 function sym found at the code address of interest, so return
6412 1 here to avoid it incorrectly caching a larger function size
6413 for a small function. This does mean we return the wrong
6414 size for a new-ABI function of size 24, but all that does is
6415 disable caching for such functions. */
6416 if (size == 24)
6417 size = 1;
9f296da3 6418 }
aef36ac1
AM
6419 else
6420 {
6421 if (sym->section != sec)
6422 return 0;
6423 *code_off = sym->value;
6424 }
6425 if (size == 0)
6426 size = 1;
6427 return size;
9f296da3
AM
6428}
6429
f378ab09
AM
6430/* Return true if symbol is a strong function defined in an ELFv2
6431 object with st_other localentry bits of zero, ie. its local entry
6432 point coincides with its global entry point. */
6433
6434static bfd_boolean
6435is_elfv2_localentry0 (struct elf_link_hash_entry *h)
6436{
6437 return (h != NULL
6438 && h->type == STT_FUNC
6439 && h->root.type == bfd_link_hash_defined
6440 && (STO_PPC64_LOCAL_MASK & h->other) == 0
8b5f1ed8 6441 && !((struct ppc_link_hash_entry *) h)->non_zero_localentry
f378ab09
AM
6442 && is_ppc64_elf (h->root.u.def.section->owner)
6443 && abiversion (h->root.u.def.section->owner) >= 2);
6444}
6445
854b41e7
AM
6446/* Return true if symbol is defined in a regular object file. */
6447
6448static bfd_boolean
6449is_static_defined (struct elf_link_hash_entry *h)
6450{
6451 return ((h->root.type == bfd_link_hash_defined
6452 || h->root.type == bfd_link_hash_defweak)
6453 && h->root.u.def.section != NULL
6454 && h->root.u.def.section->output_section != NULL);
6455}
6456
b31867b6
AM
6457/* If FDH is a function descriptor symbol, return the associated code
6458 entry symbol if it is defined. Return NULL otherwise. */
6459
6460static struct ppc_link_hash_entry *
6461defined_code_entry (struct ppc_link_hash_entry *fdh)
6462{
6463 if (fdh->is_func_descriptor)
6464 {
6465 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
6466 if (fh->elf.root.type == bfd_link_hash_defined
6467 || fh->elf.root.type == bfd_link_hash_defweak)
6468 return fh;
6469 }
6470 return NULL;
6471}
6472
6473/* If FH is a function code entry symbol, return the associated
6474 function descriptor symbol if it is defined. Return NULL otherwise. */
6475
6476static struct ppc_link_hash_entry *
6477defined_func_desc (struct ppc_link_hash_entry *fh)
6478{
6479 if (fh->oh != NULL
6480 && fh->oh->is_func_descriptor)
6481 {
6482 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
6483 if (fdh->elf.root.type == bfd_link_hash_defined
6484 || fdh->elf.root.type == bfd_link_hash_defweak)
6485 return fdh;
6486 }
6487 return NULL;
6488}
6489
8c5b4e52
AM
6490static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
6491
6492/* Garbage collect sections, after first dealing with dot-symbols. */
6493
6494static bfd_boolean
6495ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
6496{
6497 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6498
6499 if (htab != NULL && htab->need_func_desc_adj)
6500 {
6501 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6502 htab->need_func_desc_adj = 0;
6503 }
6504 return bfd_elf_gc_sections (abfd, info);
6505}
6506
74f0fb50
AM
6507/* Mark all our entry sym sections, both opd and code section. */
6508
6509static void
6510ppc64_elf_gc_keep (struct bfd_link_info *info)
6511{
6512 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6513 struct bfd_sym_chain *sym;
6514
4dfe6ac6
NC
6515 if (htab == NULL)
6516 return;
6517
74f0fb50
AM
6518 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
6519 {
b31867b6 6520 struct ppc_link_hash_entry *eh, *fh;
74f0fb50
AM
6521 asection *sec;
6522
6523 eh = (struct ppc_link_hash_entry *)
b31867b6 6524 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
74f0fb50
AM
6525 if (eh == NULL)
6526 continue;
6527 if (eh->elf.root.type != bfd_link_hash_defined
6528 && eh->elf.root.type != bfd_link_hash_defweak)
6529 continue;
6530
b31867b6
AM
6531 fh = defined_code_entry (eh);
6532 if (fh != NULL)
74f0fb50 6533 {
b31867b6 6534 sec = fh->elf.root.u.def.section;
74f0fb50
AM
6535 sec->flags |= SEC_KEEP;
6536 }
6537 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6538 && opd_entry_value (eh->elf.root.u.def.section,
6539 eh->elf.root.u.def.value,
aef36ac1 6540 &sec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50
AM
6541 sec->flags |= SEC_KEEP;
6542
6543 sec = eh->elf.root.u.def.section;
6544 sec->flags |= SEC_KEEP;
6545 }
6546}
6547
64d03ab5
AM
6548/* Mark sections containing dynamically referenced symbols. When
6549 building shared libraries, we must assume that any visible symbol is
6550 referenced. */
6551
6552static bfd_boolean
6553ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
6554{
6555 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6556 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
b31867b6 6557 struct ppc_link_hash_entry *fdh;
b407645f 6558 struct bfd_elf_dynamic_list *d = info->dynamic_list;
64d03ab5 6559
64d03ab5 6560 /* Dynamic linking info is on the func descriptor sym. */
b31867b6
AM
6561 fdh = defined_func_desc (eh);
6562 if (fdh != NULL)
6563 eh = fdh;
64d03ab5
AM
6564
6565 if ((eh->elf.root.type == bfd_link_hash_defined
6566 || eh->elf.root.type == bfd_link_hash_defweak)
87e79a65 6567 && ((eh->elf.ref_dynamic && !eh->elf.forced_local)
1c9177d9 6568 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
64d03ab5 6569 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
4c58e0d8 6570 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
0e1862bb 6571 && (!bfd_link_executable (info)
e278ae05 6572 || info->gc_keep_exported
b407645f
AM
6573 || info->export_dynamic
6574 || (eh->elf.dynamic
6575 && d != NULL
6576 && (*d->match) (&d->head, NULL, eh->elf.root.root.string)))
e278ae05 6577 && (eh->elf.versioned >= versioned
4c58e0d8
AM
6578 || !bfd_hide_sym_by_version (info->version_info,
6579 eh->elf.root.root.string)))))
64d03ab5
AM
6580 {
6581 asection *code_sec;
b31867b6 6582 struct ppc_link_hash_entry *fh;
64d03ab5
AM
6583
6584 eh->elf.root.u.def.section->flags |= SEC_KEEP;
6585
6586 /* Function descriptor syms cause the associated
6587 function code sym section to be marked. */
b31867b6
AM
6588 fh = defined_code_entry (eh);
6589 if (fh != NULL)
6590 {
6591 code_sec = fh->elf.root.u.def.section;
6592 code_sec->flags |= SEC_KEEP;
6593 }
64d03ab5
AM
6594 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6595 && opd_entry_value (eh->elf.root.u.def.section,
6596 eh->elf.root.u.def.value,
aef36ac1 6597 &code_sec, NULL, FALSE) != (bfd_vma) -1)
64d03ab5
AM
6598 code_sec->flags |= SEC_KEEP;
6599 }
6600
6601 return TRUE;
6602}
6603
5bd4f169
AM
6604/* Return the section that should be marked against GC for a given
6605 relocation. */
6606
6607static asection *
4ce794b7 6608ppc64_elf_gc_mark_hook (asection *sec,
fb34365b 6609 struct bfd_link_info *info,
4ce794b7
AM
6610 Elf_Internal_Rela *rel,
6611 struct elf_link_hash_entry *h,
6612 Elf_Internal_Sym *sym)
5bd4f169 6613{
ccfa59ea
AM
6614 asection *rsec;
6615
ccfa59ea
AM
6616 /* Syms return NULL if we're marking .opd, so we avoid marking all
6617 function sections, as all functions are referenced in .opd. */
6618 rsec = NULL;
6619 if (get_opd_info (sec) != NULL)
6620 return rsec;
1e2f5b6e 6621
5bd4f169
AM
6622 if (h != NULL)
6623 {
04c9666a 6624 enum elf_ppc64_reloc_type r_type;
b31867b6 6625 struct ppc_link_hash_entry *eh, *fh, *fdh;
a33d1f77 6626
4ce794b7 6627 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 6628 switch (r_type)
5bd4f169
AM
6629 {
6630 case R_PPC64_GNU_VTINHERIT:
6631 case R_PPC64_GNU_VTENTRY:
6632 break;
6633
6634 default:
6635 switch (h->root.type)
6636 {
6637 case bfd_link_hash_defined:
6638 case bfd_link_hash_defweak:
ccfa59ea 6639 eh = (struct ppc_link_hash_entry *) h;
b31867b6
AM
6640 fdh = defined_func_desc (eh);
6641 if (fdh != NULL)
8c5b4e52
AM
6642 {
6643 /* -mcall-aixdesc code references the dot-symbol on
6644 a call reloc. Mark the function descriptor too
6645 against garbage collection. */
6646 fdh->elf.mark = 1;
60d67dc8
AM
6647 if (fdh->elf.is_weakalias)
6648 weakdef (&fdh->elf)->mark = 1;
8c5b4e52
AM
6649 eh = fdh;
6650 }
1e2f5b6e
AM
6651
6652 /* Function descriptor syms cause the associated
6653 function code sym section to be marked. */
b31867b6
AM
6654 fh = defined_code_entry (eh);
6655 if (fh != NULL)
ccfa59ea
AM
6656 {
6657 /* They also mark their opd section. */
74f0fb50 6658 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 6659
b31867b6 6660 rsec = fh->elf.root.u.def.section;
ccfa59ea 6661 }
8387904d
AM
6662 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6663 && opd_entry_value (eh->elf.root.u.def.section,
6664 eh->elf.root.u.def.value,
aef36ac1 6665 &rsec, NULL, FALSE) != (bfd_vma) -1)
74f0fb50 6666 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 6667 else
1e2f5b6e
AM
6668 rsec = h->root.u.def.section;
6669 break;
5bd4f169
AM
6670
6671 case bfd_link_hash_common:
1e2f5b6e
AM
6672 rsec = h->root.u.c.p->section;
6673 break;
5bd4f169
AM
6674
6675 default:
fb34365b 6676 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5bd4f169
AM
6677 }
6678 }
6679 }
6680 else
6681 {
74f0fb50 6682 struct _opd_sec_data *opd;
1e2f5b6e
AM
6683
6684 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
74f0fb50
AM
6685 opd = get_opd_info (rsec);
6686 if (opd != NULL && opd->func_sec != NULL)
ccfa59ea 6687 {
74f0fb50 6688 rsec->gc_mark = 1;
ccfa59ea 6689
51aecdc5 6690 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
ccfa59ea 6691 }
5bd4f169
AM
6692 }
6693
1e2f5b6e 6694 return rsec;
5bd4f169
AM
6695}
6696
deb0e272
AM
6697/* The maximum size of .sfpr. */
6698#define SFPR_MAX (218*4)
6699
6700struct sfpr_def_parms
6701{
699733f6
AM
6702 const char name[12];
6703 unsigned char lo, hi;
deb0e272
AM
6704 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6705 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6706};
6707
a4b6fadd
AM
6708/* Auto-generate _save*, _rest* functions in .sfpr.
6709 If STUB_SEC is non-null, define alias symbols in STUB_SEC
6710 instead. */
deb0e272 6711
4dfe6ac6 6712static bfd_boolean
a4b6fadd
AM
6713sfpr_define (struct bfd_link_info *info,
6714 const struct sfpr_def_parms *parm,
6715 asection *stub_sec)
deb0e272
AM
6716{
6717 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6718 unsigned int i;
6719 size_t len = strlen (parm->name);
6720 bfd_boolean writing = FALSE;
699733f6 6721 char sym[16];
deb0e272 6722
4dfe6ac6
NC
6723 if (htab == NULL)
6724 return FALSE;
6725
deb0e272
AM
6726 memcpy (sym, parm->name, len);
6727 sym[len + 2] = 0;
6728
6729 for (i = parm->lo; i <= parm->hi; i++)
6730 {
a4b6fadd 6731 struct ppc_link_hash_entry *h;
deb0e272
AM
6732
6733 sym[len + 0] = i / 10 + '0';
6734 sym[len + 1] = i % 10 + '0';
a4b6fadd 6735 h = (struct ppc_link_hash_entry *)
b32547cd 6736 elf_link_hash_lookup (&htab->elf, sym, writing, TRUE, TRUE);
a4b6fadd 6737 if (stub_sec != NULL)
deb0e272 6738 {
a4b6fadd
AM
6739 if (h != NULL
6740 && h->elf.root.type == bfd_link_hash_defined
6741 && h->elf.root.u.def.section == htab->sfpr)
6742 {
6743 struct elf_link_hash_entry *s;
6744 char buf[32];
6745 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
6746 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
6747 if (s == NULL)
6748 return FALSE;
6749 if (s->root.type == bfd_link_hash_new
6750 || (s->root.type = bfd_link_hash_defined
6751 && s->root.u.def.section == stub_sec))
6752 {
6753 s->root.type = bfd_link_hash_defined;
6754 s->root.u.def.section = stub_sec;
7dda8d3c 6755 s->root.u.def.value = (stub_sec->size - htab->sfpr->size
a4b6fadd
AM
6756 + h->elf.root.u.def.value);
6757 s->ref_regular = 1;
6758 s->def_regular = 1;
6759 s->ref_regular_nonweak = 1;
6760 s->forced_local = 1;
6761 s->non_elf = 0;
6762 s->root.linker_def = 1;
6763 }
6764 }
6765 continue;
6766 }
6767 if (h != NULL)
6768 {
6769 h->save_res = 1;
6770 if (!h->elf.def_regular)
deb0e272 6771 {
a4b6fadd
AM
6772 h->elf.root.type = bfd_link_hash_defined;
6773 h->elf.root.u.def.section = htab->sfpr;
6774 h->elf.root.u.def.value = htab->sfpr->size;
6775 h->elf.type = STT_FUNC;
6776 h->elf.def_regular = 1;
b32547cd 6777 h->elf.non_elf = 0;
a4b6fadd
AM
6778 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
6779 writing = TRUE;
deb0e272 6780 if (htab->sfpr->contents == NULL)
a4b6fadd
AM
6781 {
6782 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6783 if (htab->sfpr->contents == NULL)
6784 return FALSE;
6785 }
deb0e272
AM
6786 }
6787 }
6788 if (writing)
6789 {
6790 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6791 if (i != parm->hi)
6792 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6793 else
6794 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6795 htab->sfpr->size = p - htab->sfpr->contents;
6796 }
6797 }
6798
6799 return TRUE;
6800}
6801
6802static bfd_byte *
6803savegpr0 (bfd *abfd, bfd_byte *p, int r)
6804{
6805 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6806 return p + 4;
6807}
6808
6809static bfd_byte *
6810savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6811{
6812 p = savegpr0 (abfd, p, r);
a078d95a 6813 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
6814 p = p + 4;
6815 bfd_put_32 (abfd, BLR, p);
6816 return p + 4;
6817}
6818
6819static bfd_byte *
6820restgpr0 (bfd *abfd, bfd_byte *p, int r)
6821{
6822 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6823 return p + 4;
6824}
6825
6826static bfd_byte *
6827restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6828{
a078d95a 6829 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
6830 p = p + 4;
6831 p = restgpr0 (abfd, p, r);
6832 bfd_put_32 (abfd, MTLR_R0, p);
6833 p = p + 4;
6834 if (r == 29)
6835 {
6836 p = restgpr0 (abfd, p, 30);
6837 p = restgpr0 (abfd, p, 31);
6838 }
6839 bfd_put_32 (abfd, BLR, p);
6840 return p + 4;
6841}
6842
6843static bfd_byte *
6844savegpr1 (bfd *abfd, bfd_byte *p, int r)
6845{
6846 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6847 return p + 4;
6848}
6849
6850static bfd_byte *
6851savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6852{
6853 p = savegpr1 (abfd, p, r);
6854 bfd_put_32 (abfd, BLR, p);
6855 return p + 4;
6856}
6857
6858static bfd_byte *
6859restgpr1 (bfd *abfd, bfd_byte *p, int r)
6860{
6861 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6862 return p + 4;
6863}
6864
6865static bfd_byte *
6866restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6867{
6868 p = restgpr1 (abfd, p, r);
6869 bfd_put_32 (abfd, BLR, p);
6870 return p + 4;
6871}
6872
6873static bfd_byte *
6874savefpr (bfd *abfd, bfd_byte *p, int r)
6875{
6876 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6877 return p + 4;
6878}
6879
6880static bfd_byte *
6881savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6882{
6883 p = savefpr (abfd, p, r);
a078d95a 6884 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
6885 p = p + 4;
6886 bfd_put_32 (abfd, BLR, p);
6887 return p + 4;
6888}
6889
6890static bfd_byte *
6891restfpr (bfd *abfd, bfd_byte *p, int r)
6892{
6893 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6894 return p + 4;
6895}
6896
6897static bfd_byte *
6898restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6899{
a078d95a 6900 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
6901 p = p + 4;
6902 p = restfpr (abfd, p, r);
6903 bfd_put_32 (abfd, MTLR_R0, p);
6904 p = p + 4;
6905 if (r == 29)
6906 {
6907 p = restfpr (abfd, p, 30);
6908 p = restfpr (abfd, p, 31);
6909 }
6910 bfd_put_32 (abfd, BLR, p);
6911 return p + 4;
6912}
6913
6914static bfd_byte *
6915savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6916{
6917 p = savefpr (abfd, p, r);
6918 bfd_put_32 (abfd, BLR, p);
6919 return p + 4;
6920}
6921
6922static bfd_byte *
6923restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6924{
6925 p = restfpr (abfd, p, r);
6926 bfd_put_32 (abfd, BLR, p);
6927 return p + 4;
6928}
6929
6930static bfd_byte *
6931savevr (bfd *abfd, bfd_byte *p, int r)
6932{
6933 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6934 p = p + 4;
6935 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6936 return p + 4;
6937}
6938
6939static bfd_byte *
6940savevr_tail (bfd *abfd, bfd_byte *p, int r)
6941{
6942 p = savevr (abfd, p, r);
6943 bfd_put_32 (abfd, BLR, p);
6944 return p + 4;
6945}
6946
6947static bfd_byte *
6948restvr (bfd *abfd, bfd_byte *p, int r)
6949{
6950 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6951 p = p + 4;
6952 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6953 return p + 4;
6954}
6955
6956static bfd_byte *
6957restvr_tail (bfd *abfd, bfd_byte *p, int r)
6958{
6959 p = restvr (abfd, p, r);
6960 bfd_put_32 (abfd, BLR, p);
6961 return p + 4;
6962}
6963
e86ce104
AM
6964/* Called via elf_link_hash_traverse to transfer dynamic linking
6965 information on function code symbol entries to their corresponding
6966 function descriptor symbol entries. */
deb0e272 6967
b34976b6 6968static bfd_boolean
4ce794b7 6969func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 6970{
e86ce104 6971 struct bfd_link_info *info;
65f38f15 6972 struct ppc_link_hash_table *htab;
50bc7936
AM
6973 struct ppc_link_hash_entry *fh;
6974 struct ppc_link_hash_entry *fdh;
6975 bfd_boolean force_local;
5bd4f169 6976
50bc7936
AM
6977 fh = (struct ppc_link_hash_entry *) h;
6978 if (fh->elf.root.type == bfd_link_hash_indirect)
b34976b6 6979 return TRUE;
e86ce104 6980
8c5b4e52
AM
6981 if (!fh->is_func)
6982 return TRUE;
6983
6984 if (fh->elf.root.root.string[0] != '.'
6985 || fh->elf.root.root.string[1] == '\0')
6986 return TRUE;
6987
4ce794b7 6988 info = inf;
65f38f15 6989 htab = ppc_hash_table (info);
4dfe6ac6
NC
6990 if (htab == NULL)
6991 return FALSE;
5bd4f169 6992
8c5b4e52
AM
6993 /* Find the corresponding function descriptor symbol. */
6994 fdh = lookup_fdh (fh, htab);
6995
c09bdfe5
AM
6996 /* Resolve undefined references to dot-symbols as the value
6997 in the function descriptor, if we have one in a regular object.
6998 This is to satisfy cases like ".quad .foo". Calls to functions
6999 in dynamic objects are handled elsewhere. */
8c5b4e52
AM
7000 if ((fh->elf.root.type == bfd_link_hash_undefined
7001 || fh->elf.root.type == bfd_link_hash_undefweak)
7002 && (fdh->elf.root.type == bfd_link_hash_defined
7003 || fdh->elf.root.type == bfd_link_hash_defweak)
b31867b6
AM
7004 && get_opd_info (fdh->elf.root.u.def.section) != NULL
7005 && opd_entry_value (fdh->elf.root.u.def.section,
7006 fdh->elf.root.u.def.value,
c09bdfe5 7007 &fh->elf.root.u.def.section,
aef36ac1 7008 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
c09bdfe5 7009 {
b31867b6 7010 fh->elf.root.type = fdh->elf.root.type;
f5385ebf 7011 fh->elf.forced_local = 1;
b31867b6
AM
7012 fh->elf.def_regular = fdh->elf.def_regular;
7013 fh->elf.def_dynamic = fdh->elf.def_dynamic;
c09bdfe5
AM
7014 }
7015
8c5b4e52
AM
7016 if (!fh->elf.dynamic)
7017 {
7018 struct plt_entry *ent;
5bd4f169 7019
8c5b4e52
AM
7020 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
7021 if (ent->plt.refcount > 0)
7022 break;
7023 if (ent == NULL)
7024 return TRUE;
7025 }
5bd4f169 7026
8c5b4e52 7027 /* Create a descriptor as undefined if necessary. */
50bc7936 7028 if (fdh == NULL
0e1862bb 7029 && !bfd_link_executable (info)
50bc7936
AM
7030 && (fh->elf.root.type == bfd_link_hash_undefined
7031 || fh->elf.root.type == bfd_link_hash_undefweak))
7032 {
908b32fc 7033 fdh = make_fdh (info, fh);
bb700d78
AM
7034 if (fdh == NULL)
7035 return FALSE;
50bc7936 7036 }
648cca2c 7037
8c5b4e52 7038 /* We can't support overriding of symbols on a fake descriptor. */
908b32fc
AM
7039 if (fdh != NULL
7040 && fdh->fake
8c5b4e52
AM
7041 && (fh->elf.root.type == bfd_link_hash_defined
7042 || fh->elf.root.type == bfd_link_hash_defweak))
7043 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
908b32fc 7044
8c5b4e52
AM
7045 /* Transfer dynamic linking information to the function descriptor. */
7046 if (fdh != NULL)
7047 {
f5385ebf
AM
7048 fdh->elf.ref_regular |= fh->elf.ref_regular;
7049 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
7050 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
7051 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
8c5b4e52
AM
7052 fdh->elf.dynamic |= fh->elf.dynamic;
7053 fdh->elf.needs_plt |= (fh->elf.needs_plt
7054 || fh->elf.type == STT_FUNC
7055 || fh->elf.type == STT_GNU_IFUNC);
7056 move_plt_plist (fh, fdh);
7057
7058 if (!fdh->elf.forced_local
7059 && fh->elf.dynindx != -1)
7060 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
7061 return FALSE;
e86ce104
AM
7062 }
7063
50bc7936
AM
7064 /* Now that the info is on the function descriptor, clear the
7065 function code sym info. Any function code syms for which we
7066 don't have a definition in a regular file, we force local.
7067 This prevents a shared library from exporting syms that have
7068 been imported from another library. Function code syms that
7069 are really in the library we must leave global to prevent the
7070 linker dragging in a definition from a static library. */
93f3fa99
AM
7071 force_local = (!fh->elf.def_regular
7072 || fdh == NULL
7073 || !fdh->elf.def_regular
7074 || fdh->elf.forced_local);
50bc7936
AM
7075 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7076
b34976b6 7077 return TRUE;
e86ce104 7078}
40b8271b 7079
a4b6fadd
AM
7080static const struct sfpr_def_parms save_res_funcs[] =
7081 {
7082 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
7083 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
7084 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
7085 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
7086 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
7087 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
7088 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
7089 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
7090 { "._savef", 14, 31, savefpr, savefpr1_tail },
7091 { "._restf", 14, 31, restfpr, restfpr1_tail },
7092 { "_savevr_", 20, 31, savevr, savevr_tail },
7093 { "_restvr_", 20, 31, restvr, restvr_tail }
7094 };
7095
e86ce104 7096/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
7097 this hook to a) provide some gcc support functions, and b) transfer
7098 dynamic linking information gathered so far on function code symbol
7099 entries, to their corresponding function descriptor symbol entries. */
deb0e272 7100
b34976b6 7101static bfd_boolean
4ce794b7
AM
7102ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
7103 struct bfd_link_info *info)
e86ce104
AM
7104{
7105 struct ppc_link_hash_table *htab;
7106
7107 htab = ppc_hash_table (info);
4dfe6ac6
NC
7108 if (htab == NULL)
7109 return FALSE;
7110
b32547cd
AM
7111 /* Provide any missing _save* and _rest* functions. */
7112 if (htab->sfpr != NULL)
7113 {
7114 unsigned int i;
7115
7116 htab->sfpr->size = 0;
7117 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
7118 if (!sfpr_define (info, &save_res_funcs[i], NULL))
7119 return FALSE;
7120 if (htab->sfpr->size == 0)
7121 htab->sfpr->flags |= SEC_EXCLUDE;
7122 }
7123
7124 if (bfd_link_relocatable (info))
7125 return TRUE;
7126
7127 if (htab->elf.hgot != NULL)
dba6fa9b
AM
7128 {
7129 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
7130 /* Make .TOC. defined so as to prevent it being made dynamic.
7131 The wrong value here is fixed later in ppc64_elf_set_toc. */
43417696
AM
7132 if (!htab->elf.hgot->def_regular
7133 || htab->elf.hgot->root.type != bfd_link_hash_defined)
7134 {
7135 htab->elf.hgot->root.type = bfd_link_hash_defined;
7136 htab->elf.hgot->root.u.def.value = 0;
7137 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
7138 htab->elf.hgot->def_regular = 1;
7139 htab->elf.hgot->root.linker_def = 1;
7140 }
dba6fa9b 7141 htab->elf.hgot->type = STT_OBJECT;
dba6fa9b
AM
7142 htab->elf.hgot->other = ((htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1))
7143 | STV_HIDDEN);
7144 }
c66bb0ee 7145
8c5b4e52
AM
7146 if (htab->need_func_desc_adj)
7147 {
7148 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
7149 htab->need_func_desc_adj = 0;
7150 }
805fc799 7151
b34976b6 7152 return TRUE;
e86ce104
AM
7153}
7154
98bbb1b8 7155/* Find dynamic relocs for H that apply to read-only sections. */
a345bc8d 7156
98bbb1b8 7157static asection *
a345bc8d
AM
7158readonly_dynrelocs (struct elf_link_hash_entry *h)
7159{
7160 struct ppc_link_hash_entry *eh;
7161 struct elf_dyn_relocs *p;
7162
7163 eh = (struct ppc_link_hash_entry *) h;
7164 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7165 {
7166 asection *s = p->sec->output_section;
7167
7168 if (s != NULL && (s->flags & SEC_READONLY) != 0)
98bbb1b8 7169 return p->sec;
a345bc8d 7170 }
98bbb1b8 7171 return NULL;
a345bc8d
AM
7172}
7173
d311bc8b 7174/* Return true if we have dynamic relocs against H or any of its weak
ab2477e1
AM
7175 aliases, that apply to read-only sections. Cannot be used after
7176 size_dynamic_sections. */
d311bc8b
AM
7177
7178static bfd_boolean
7179alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
7180{
7181 struct ppc_link_hash_entry *eh;
7182
7183 eh = (struct ppc_link_hash_entry *) h;
7184 do
7185 {
7186 if (readonly_dynrelocs (&eh->elf))
7187 return TRUE;
ab2477e1 7188 eh = (struct ppc_link_hash_entry *) eh->elf.u.alias;
d311bc8b
AM
7189 } while (eh != NULL && &eh->elf != h);
7190
7191 return FALSE;
7192}
8a2058b5 7193
8a9e8e72
AM
7194/* Return whether EH has pc-relative dynamic relocs. */
7195
7196static bfd_boolean
7197pc_dynrelocs (struct ppc_link_hash_entry *eh)
7198{
7199 struct elf_dyn_relocs *p;
7200
7201 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7202 if (p->pc_count != 0)
7203 return TRUE;
7204 return FALSE;
7205}
7206
8a2058b5
AM
7207/* Return true if a global entry stub will be created for H. Valid
7208 for ELFv2 before plt entries have been allocated. */
7209
7210static bfd_boolean
7211global_entry_stub (struct elf_link_hash_entry *h)
7212{
7213 struct plt_entry *pent;
7214
7215 if (!h->pointer_equality_needed
7216 || h->def_regular)
7217 return FALSE;
7218
7219 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
7220 if (pent->plt.refcount > 0
7221 && pent->addend == 0)
7222 return TRUE;
7223
7224 return FALSE;
7225}
7226
e86ce104
AM
7227/* Adjust a symbol defined by a dynamic object and referenced by a
7228 regular object. The current definition is in some section of the
7229 dynamic object, but we're not including those sections. We have to
7230 change the definition to something the rest of the link can
7231 understand. */
7232
b34976b6 7233static bfd_boolean
4ce794b7
AM
7234ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
7235 struct elf_link_hash_entry *h)
e86ce104
AM
7236{
7237 struct ppc_link_hash_table *htab;
5474d94f 7238 asection *s, *srel;
e86ce104
AM
7239
7240 htab = ppc_hash_table (info);
4dfe6ac6
NC
7241 if (htab == NULL)
7242 return FALSE;
e86ce104
AM
7243
7244 /* Deal with function syms. */
7245 if (h->type == STT_FUNC
e054468f 7246 || h->type == STT_GNU_IFUNC
f5385ebf 7247 || h->needs_plt)
e86ce104 7248 {
529fe20e
AM
7249 bfd_boolean local = (((struct ppc_link_hash_entry *) h)->save_res
7250 || SYMBOL_CALLS_LOCAL (info, h)
7251 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
7252 /* Discard dyn_relocs when non-pic if we've decided that a
7253 function symbol is local and not an ifunc. We keep dynamic
7254 relocs for ifuncs when local rather than always emitting a
7255 plt call stub for them and defining the symbol on the call
7256 stub. We can't do that for ELFv1 anyway (a function symbol
7257 is defined on a descriptor, not code) and it can be faster at
7258 run-time due to not needing to bounce through a stub. The
7259 dyn_relocs for ifuncs will be applied even in a static
7260 executable. */
7261 if (!bfd_link_pic (info)
7262 && h->type != STT_GNU_IFUNC
7263 && local)
7264 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
7265
e86ce104
AM
7266 /* Clear procedure linkage table information for any symbol that
7267 won't need a .plt entry. */
411e1bfb
AM
7268 struct plt_entry *ent;
7269 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
7270 if (ent->plt.refcount > 0)
7271 break;
8387904d 7272 if (ent == NULL
2d7ad24e
AM
7273 || (h->type != STT_GNU_IFUNC
7274 && local
3e04d765
AM
7275 && (htab->can_convert_all_inline_plt
7276 || (((struct ppc_link_hash_entry *) h)->tls_mask
7277 & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)))
40b8271b 7278 {
411e1bfb 7279 h->plt.plist = NULL;
f5385ebf 7280 h->needs_plt = 0;
d1eca1e4 7281 h->pointer_equality_needed = 0;
40b8271b 7282 }
8a2058b5 7283 else if (abiversion (info->output_bfd) >= 2)
a345bc8d 7284 {
d1eca1e4
AM
7285 /* Taking a function's address in a read/write section
7286 doesn't require us to define the function symbol in the
7287 executable on a global entry stub. A dynamic reloc can
8a2058b5
AM
7288 be used instead. The reason we prefer a few more dynamic
7289 relocs is that calling via a global entry stub costs a
7290 few more instructions, and pointer_equality_needed causes
7291 extra work in ld.so when resolving these symbols. */
529fe20e 7292 if (global_entry_stub (h))
d1eca1e4 7293 {
ab2477e1 7294 if (!readonly_dynrelocs (h))
529fe20e
AM
7295 {
7296 h->pointer_equality_needed = 0;
7297 /* If we haven't seen a branch reloc then we don't need
7298 a plt entry. */
7299 if (!h->needs_plt)
7300 h->plt.plist = NULL;
7301 }
7302 else if (!bfd_link_pic (info))
7303 /* We are going to be defining the function symbol on the
7304 plt stub, so no dyn_relocs needed when non-pic. */
7305 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
d1eca1e4
AM
7306 }
7307
3988aed5
AM
7308 /* ELFv2 function symbols can't have copy relocs. */
7309 return TRUE;
7310 }
7311 else if (!h->needs_plt
ab2477e1 7312 && !readonly_dynrelocs (h))
3988aed5
AM
7313 {
7314 /* If we haven't seen a branch reloc then we don't need a
7315 plt entry. */
7316 h->plt.plist = NULL;
7317 h->pointer_equality_needed = 0;
a345bc8d
AM
7318 return TRUE;
7319 }
5bd4f169 7320 }
bbd7ec4a 7321 else
411e1bfb 7322 h->plt.plist = NULL;
5bd4f169
AM
7323
7324 /* If this is a weak symbol, and there is a real definition, the
7325 processor independent code will have arranged for us to see the
7326 real definition first, and we can just use the same value. */
60d67dc8 7327 if (h->is_weakalias)
5bd4f169 7328 {
60d67dc8
AM
7329 struct elf_link_hash_entry *def = weakdef (h);
7330 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
7331 h->root.u.def.section = def->root.u.def.section;
7332 h->root.u.def.value = def->root.u.def.value;
4a7e5234
AM
7333 if (def->root.u.def.section == htab->elf.sdynbss
7334 || def->root.u.def.section == htab->elf.sdynrelro)
7335 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
b34976b6 7336 return TRUE;
5bd4f169
AM
7337 }
7338
5bd4f169
AM
7339 /* If we are creating a shared library, we must presume that the
7340 only references to the symbol are via the global offset table.
7341 For such cases we need not do anything here; the relocations will
7342 be handled correctly by relocate_section. */
0e1862bb 7343 if (bfd_link_pic (info))
b34976b6 7344 return TRUE;
5bd4f169 7345
65f38f15
AM
7346 /* If there are no references to this symbol that do not use the
7347 GOT, we don't need to generate a copy reloc. */
f5385ebf 7348 if (!h->non_got_ref)
b34976b6 7349 return TRUE;
65f38f15 7350
b186458a 7351 /* Don't generate a copy reloc for symbols defined in the executable. */
d93d1c80 7352 if (!h->def_dynamic || !h->ref_regular || h->def_regular
b186458a 7353
d93d1c80
AM
7354 /* If -z nocopyreloc was given, don't generate them either. */
7355 || info->nocopyreloc
a127494f 7356
dce2246a 7357 /* If we don't find any dynamic relocs in read-only sections, then
d93d1c80 7358 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
d311bc8b 7359 || (ELIMINATE_COPY_RELOCS && !alias_readonly_dynrelocs (h))
65f38f15 7360
d93d1c80
AM
7361 /* Protected variables do not work with .dynbss. The copy in
7362 .dynbss won't be used by the shared library with the protected
7363 definition for the variable. Text relocations are preferable
7364 to an incorrect program. */
7365 || h->protected_def)
529fe20e 7366 return TRUE;
a127494f 7367
5d35169e 7368 if (h->plt.plist != NULL)
97b639ba
AM
7369 {
7370 /* We should never get here, but unfortunately there are versions
7371 of gcc out there that improperly (for this ABI) put initialized
7372 function pointers, vtable refs and suchlike in read-only
7373 sections. Allow them to proceed, but warn that this might
7374 break at runtime. */
25f53a85 7375 info->callbacks->einfo
c1c8c1ef 7376 (_("%P: copy reloc against `%pT' requires lazy plt linking; "
25f53a85 7377 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
97b639ba
AM
7378 h->root.root.string);
7379 }
5d35169e
AM
7380
7381 /* This is a reference to a symbol defined by a dynamic object which
7382 is not a function. */
7383
5bd4f169
AM
7384 /* We must allocate the symbol in our .dynbss section, which will
7385 become part of the .bss section of the executable. There will be
7386 an entry for this symbol in the .dynsym section. The dynamic
7387 object will contain position independent code, so all references
7388 from the dynamic object to this symbol will go through the global
7389 offset table. The dynamic linker will use the .dynsym entry to
7390 determine the address it must put in the global offset table, so
7391 both the dynamic object and the regular object will refer to the
7392 same memory location for the variable. */
5474d94f
AM
7393 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
7394 {
7395 s = htab->elf.sdynrelro;
7396 srel = htab->elf.sreldynrelro;
7397 }
7398 else
7399 {
7400 s = htab->elf.sdynbss;
7401 srel = htab->elf.srelbss;
7402 }
1d7e9d18 7403 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
5bd4f169 7404 {
4a7e5234
AM
7405 /* We must generate a R_PPC64_COPY reloc to tell the dynamic
7406 linker to copy the initial value out of the dynamic object
7407 and into the runtime process image. */
5474d94f 7408 srel->size += sizeof (Elf64_External_Rela);
f5385ebf 7409 h->needs_copy = 1;
5bd4f169
AM
7410 }
7411
529fe20e
AM
7412 /* We no longer want dyn_relocs. */
7413 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
6cabe1ea 7414 return _bfd_elf_adjust_dynamic_copy (info, h, s);
5bd4f169
AM
7415}
7416
e86ce104
AM
7417/* If given a function descriptor symbol, hide both the function code
7418 sym and the descriptor. */
7419static void
4ce794b7
AM
7420ppc64_elf_hide_symbol (struct bfd_link_info *info,
7421 struct elf_link_hash_entry *h,
7422 bfd_boolean force_local)
e86ce104 7423{
34814b9f 7424 struct ppc_link_hash_entry *eh;
e86ce104
AM
7425 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
7426
34814b9f
AM
7427 eh = (struct ppc_link_hash_entry *) h;
7428 if (eh->is_func_descriptor)
e86ce104 7429 {
34814b9f 7430 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 7431
721956f4 7432 if (fh == NULL)
d1329ca3
AM
7433 {
7434 const char *p, *q;
b8ac2841 7435 struct elf_link_hash_table *htab = elf_hash_table (info);
d1329ca3
AM
7436 char save;
7437
7438 /* We aren't supposed to use alloca in BFD because on
7439 systems which do not have alloca the version in libiberty
7440 calls xmalloc, which might cause the program to crash
7441 when it runs out of memory. This function doesn't have a
7442 return status, so there's no way to gracefully return an
7443 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
7444 accessed; It's either a string in an ELF string table,
7445 or allocated in an objalloc structure. */
d1329ca3 7446
34814b9f 7447 p = eh->elf.root.root.string - 1;
d1329ca3
AM
7448 save = *p;
7449 *(char *) p = '.';
34814b9f 7450 fh = (struct ppc_link_hash_entry *)
b8ac2841 7451 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
d1329ca3
AM
7452 *(char *) p = save;
7453
7454 /* Unfortunately, if it so happens that the string we were
7455 looking for was allocated immediately before this string,
7456 then we overwrote the string terminator. That's the only
7457 reason the lookup should fail. */
7458 if (fh == NULL)
7459 {
34814b9f
AM
7460 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
7461 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 7462 --q, --p;
34814b9f
AM
7463 if (q < eh->elf.root.root.string && *p == '.')
7464 fh = (struct ppc_link_hash_entry *)
b8ac2841 7465 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
d1329ca3
AM
7466 }
7467 if (fh != NULL)
7468 {
34814b9f
AM
7469 eh->oh = fh;
7470 fh->oh = eh;
d1329ca3
AM
7471 }
7472 }
e86ce104 7473 if (fh != NULL)
34814b9f 7474 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
7475 }
7476}
7477
411e1bfb 7478static bfd_boolean
8843416a
AM
7479get_sym_h (struct elf_link_hash_entry **hp,
7480 Elf_Internal_Sym **symp,
7481 asection **symsecp,
f961d9dd 7482 unsigned char **tls_maskp,
8843416a
AM
7483 Elf_Internal_Sym **locsymsp,
7484 unsigned long r_symndx,
7485 bfd *ibfd)
411e1bfb 7486{
0ffa91dd 7487 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
411e1bfb
AM
7488
7489 if (r_symndx >= symtab_hdr->sh_info)
7490 {
7491 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7492 struct elf_link_hash_entry *h;
7493
7494 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 7495 h = elf_follow_link (h);
411e1bfb
AM
7496
7497 if (hp != NULL)
7498 *hp = h;
7499
7500 if (symp != NULL)
7501 *symp = NULL;
7502
7503 if (symsecp != NULL)
7504 {
7505 asection *symsec = NULL;
7506 if (h->root.type == bfd_link_hash_defined
7507 || h->root.type == bfd_link_hash_defweak)
7508 symsec = h->root.u.def.section;
7509 *symsecp = symsec;
7510 }
7511
e7b938ca 7512 if (tls_maskp != NULL)
411e1bfb
AM
7513 {
7514 struct ppc_link_hash_entry *eh;
7515
7516 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 7517 *tls_maskp = &eh->tls_mask;
411e1bfb
AM
7518 }
7519 }
7520 else
7521 {
7522 Elf_Internal_Sym *sym;
7523 Elf_Internal_Sym *locsyms = *locsymsp;
7524
7525 if (locsyms == NULL)
7526 {
7527 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
7528 if (locsyms == NULL)
7529 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
7530 symtab_hdr->sh_info,
7531 0, NULL, NULL, NULL);
7532 if (locsyms == NULL)
7533 return FALSE;
7534 *locsymsp = locsyms;
7535 }
7536 sym = locsyms + r_symndx;
7537
7538 if (hp != NULL)
7539 *hp = NULL;
7540
7541 if (symp != NULL)
7542 *symp = sym;
7543
7544 if (symsecp != NULL)
cb33740c 7545 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
411e1bfb 7546
e7b938ca 7547 if (tls_maskp != NULL)
411e1bfb
AM
7548 {
7549 struct got_entry **lgot_ents;
f961d9dd 7550 unsigned char *tls_mask;
411e1bfb 7551
e7b938ca 7552 tls_mask = NULL;
411e1bfb
AM
7553 lgot_ents = elf_local_got_ents (ibfd);
7554 if (lgot_ents != NULL)
7555 {
e054468f
AM
7556 struct plt_entry **local_plt = (struct plt_entry **)
7557 (lgot_ents + symtab_hdr->sh_info);
f961d9dd 7558 unsigned char *lgot_masks = (unsigned char *)
e054468f 7559 (local_plt + symtab_hdr->sh_info);
e7b938ca 7560 tls_mask = &lgot_masks[r_symndx];
411e1bfb 7561 }
e7b938ca 7562 *tls_maskp = tls_mask;
411e1bfb
AM
7563 }
7564 }
7565 return TRUE;
7566}
7567
e7b938ca 7568/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 7569 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 7570 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
7571
7572static int
f961d9dd 7573get_tls_mask (unsigned char **tls_maskp,
3a71aa26
AM
7574 unsigned long *toc_symndx,
7575 bfd_vma *toc_addend,
0d4792f7 7576 Elf_Internal_Sym **locsymsp,
3a71aa26
AM
7577 const Elf_Internal_Rela *rel,
7578 bfd *ibfd)
411e1bfb
AM
7579{
7580 unsigned long r_symndx;
0d4792f7 7581 int next_r;
411e1bfb
AM
7582 struct elf_link_hash_entry *h;
7583 Elf_Internal_Sym *sym;
7584 asection *sec;
7585 bfd_vma off;
7586
7587 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 7588 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 7589 return 0;
411e1bfb 7590
37da22e5
AM
7591 if ((*tls_maskp != NULL
7592 && (**tls_maskp & TLS_TLS) != 0
7593 && **tls_maskp != (TLS_TLS | TLS_MARK))
411e1bfb 7594 || sec == NULL
6bee8834 7595 || ppc64_elf_section_data (sec) == NULL
7c8fe5c4 7596 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
951fd09b 7597 return 1;
411e1bfb
AM
7598
7599 /* Look inside a TOC section too. */
7600 if (h != NULL)
7601 {
7602 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7603 off = h->root.u.def.value;
7604 }
7605 else
7606 off = sym->st_value;
7607 off += rel->r_addend;
7608 BFD_ASSERT (off % 8 == 0);
3a71aa26
AM
7609 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7610 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
0d4792f7
AM
7611 if (toc_symndx != NULL)
7612 *toc_symndx = r_symndx;
3a71aa26
AM
7613 if (toc_addend != NULL)
7614 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7615 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7616 return 0;
854b41e7 7617 if ((h == NULL || is_static_defined (h))
0d4792f7
AM
7618 && (next_r == -1 || next_r == -2))
7619 return 1 - next_r;
951fd09b 7620 return 1;
411e1bfb
AM
7621}
7622
3b421ab3
AM
7623/* Find (or create) an entry in the tocsave hash table. */
7624
7625static struct tocsave_entry *
7626tocsave_find (struct ppc_link_hash_table *htab,
7627 enum insert_option insert,
7628 Elf_Internal_Sym **local_syms,
7629 const Elf_Internal_Rela *irela,
7630 bfd *ibfd)
7631{
7632 unsigned long r_indx;
7633 struct elf_link_hash_entry *h;
7634 Elf_Internal_Sym *sym;
7635 struct tocsave_entry ent, *p;
7636 hashval_t hash;
7637 struct tocsave_entry **slot;
7638
7639 r_indx = ELF64_R_SYM (irela->r_info);
7640 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7641 return NULL;
7642 if (ent.sec == NULL || ent.sec->output_section == NULL)
7643 {
4eca0228 7644 _bfd_error_handler
871b3ab2 7645 (_("%pB: undefined symbol on R_PPC64_TOCSAVE relocation"), ibfd);
3b421ab3
AM
7646 return NULL;
7647 }
7648
7649 if (h != NULL)
7650 ent.offset = h->root.u.def.value;
7651 else
7652 ent.offset = sym->st_value;
7653 ent.offset += irela->r_addend;
7654
7655 hash = tocsave_htab_hash (&ent);
7656 slot = ((struct tocsave_entry **)
7657 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7658 if (slot == NULL)
7659 return NULL;
7660
7661 if (*slot == NULL)
7662 {
7663 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7664 if (p == NULL)
7665 return NULL;
7666 *p = ent;
7667 *slot = p;
7668 }
7669 return *slot;
7670}
7671
754021d0 7672/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 7673 code for the old ABI, these will already have been done. */
754021d0
AM
7674
7675static bfd_boolean
7676adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7677{
7678 struct ppc_link_hash_entry *eh;
7679 asection *sym_sec;
74f0fb50 7680 struct _opd_sec_data *opd;
754021d0
AM
7681
7682 if (h->root.type == bfd_link_hash_indirect)
7683 return TRUE;
7684
754021d0
AM
7685 if (h->root.type != bfd_link_hash_defined
7686 && h->root.type != bfd_link_hash_defweak)
7687 return TRUE;
7688
7689 eh = (struct ppc_link_hash_entry *) h;
7690 if (eh->adjust_done)
7691 return TRUE;
7692
7693 sym_sec = eh->elf.root.u.def.section;
74f0fb50
AM
7694 opd = get_opd_info (sym_sec);
7695 if (opd != NULL && opd->adjust != NULL)
754021d0 7696 {
51aecdc5 7697 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
4025353c
AM
7698 if (adjust == -1)
7699 {
7700 /* This entry has been deleted. */
b3fac117 7701 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
81688140
AM
7702 if (dsec == NULL)
7703 {
7704 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
dbaa2011 7705 if (discarded_section (dsec))
81688140 7706 {
b3fac117 7707 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
81688140
AM
7708 break;
7709 }
7710 }
4025353c 7711 eh->elf.root.u.def.value = 0;
81688140 7712 eh->elf.root.u.def.section = dsec;
4025353c
AM
7713 }
7714 else
7715 eh->elf.root.u.def.value += adjust;
754021d0
AM
7716 eh->adjust_done = 1;
7717 }
7718 return TRUE;
7719}
7720
8c1d1bb8 7721/* Handles decrementing dynamic reloc counts for the reloc specified by
19e08130 7722 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
8c1d1bb8
AM
7723 have already been determined. */
7724
7725static bfd_boolean
7726dec_dynrel_count (bfd_vma r_info,
7727 asection *sec,
7728 struct bfd_link_info *info,
7729 Elf_Internal_Sym **local_syms,
7730 struct elf_link_hash_entry *h,
19e08130 7731 Elf_Internal_Sym *sym)
8c1d1bb8
AM
7732{
7733 enum elf_ppc64_reloc_type r_type;
19e08130 7734 asection *sym_sec = NULL;
8c1d1bb8
AM
7735
7736 /* Can this reloc be dynamic? This switch, and later tests here
7737 should be kept in sync with the code in check_relocs. */
7738 r_type = ELF64_R_TYPE (r_info);
7739 switch (r_type)
7740 {
7741 default:
7742 return TRUE;
7743
7744 case R_PPC64_TPREL16:
7745 case R_PPC64_TPREL16_LO:
7746 case R_PPC64_TPREL16_HI:
7747 case R_PPC64_TPREL16_HA:
7748 case R_PPC64_TPREL16_DS:
7749 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
7750 case R_PPC64_TPREL16_HIGH:
7751 case R_PPC64_TPREL16_HIGHA:
8c1d1bb8
AM
7752 case R_PPC64_TPREL16_HIGHER:
7753 case R_PPC64_TPREL16_HIGHERA:
7754 case R_PPC64_TPREL16_HIGHEST:
7755 case R_PPC64_TPREL16_HIGHESTA:
8c1d1bb8
AM
7756 case R_PPC64_TPREL64:
7757 case R_PPC64_DTPMOD64:
7758 case R_PPC64_DTPREL64:
7759 case R_PPC64_ADDR64:
7760 case R_PPC64_REL30:
7761 case R_PPC64_REL32:
7762 case R_PPC64_REL64:
7763 case R_PPC64_ADDR14:
7764 case R_PPC64_ADDR14_BRNTAKEN:
7765 case R_PPC64_ADDR14_BRTAKEN:
7766 case R_PPC64_ADDR16:
7767 case R_PPC64_ADDR16_DS:
7768 case R_PPC64_ADDR16_HA:
7769 case R_PPC64_ADDR16_HI:
f9c6b907
AM
7770 case R_PPC64_ADDR16_HIGH:
7771 case R_PPC64_ADDR16_HIGHA:
8c1d1bb8
AM
7772 case R_PPC64_ADDR16_HIGHER:
7773 case R_PPC64_ADDR16_HIGHERA:
7774 case R_PPC64_ADDR16_HIGHEST:
7775 case R_PPC64_ADDR16_HIGHESTA:
7776 case R_PPC64_ADDR16_LO:
7777 case R_PPC64_ADDR16_LO_DS:
7778 case R_PPC64_ADDR24:
7779 case R_PPC64_ADDR32:
7780 case R_PPC64_UADDR16:
7781 case R_PPC64_UADDR32:
7782 case R_PPC64_UADDR64:
7783 case R_PPC64_TOC:
7784 break;
7785 }
7786
7787 if (local_syms != NULL)
7788 {
7789 unsigned long r_symndx;
8c1d1bb8
AM
7790 bfd *ibfd = sec->owner;
7791
7792 r_symndx = ELF64_R_SYM (r_info);
7793 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7794 return FALSE;
7795 }
7796
0e1862bb 7797 if ((bfd_link_pic (info)
1d483afe 7798 && (must_be_dyn_reloc (info, r_type)
8c1d1bb8 7799 || (h != NULL
198f1157 7800 && (!SYMBOLIC_BIND (info, h)
8c1d1bb8
AM
7801 || h->root.type == bfd_link_hash_defweak
7802 || !h->def_regular))))
7803 || (ELIMINATE_COPY_RELOCS
0e1862bb 7804 && !bfd_link_pic (info)
8c1d1bb8
AM
7805 && h != NULL
7806 && (h->root.type == bfd_link_hash_defweak
7807 || !h->def_regular)))
7808 ;
7809 else
7810 return TRUE;
7811
7812 if (h != NULL)
6edfbbad 7813 {
19e08130
AM
7814 struct elf_dyn_relocs *p;
7815 struct elf_dyn_relocs **pp;
7816 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
7817
7818 /* elf_gc_sweep may have already removed all dyn relocs associated
7819 with local syms for a given section. Also, symbol flags are
7820 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7821 report a dynreloc miscount. */
7822 if (*pp == NULL && info->gc_sections)
7823 return TRUE;
7824
7825 while ((p = *pp) != NULL)
60124e18 7826 {
19e08130
AM
7827 if (p->sec == sec)
7828 {
7829 if (!must_be_dyn_reloc (info, r_type))
7830 p->pc_count -= 1;
7831 p->count -= 1;
7832 if (p->count == 0)
7833 *pp = p->next;
7834 return TRUE;
7835 }
7836 pp = &p->next;
60124e18 7837 }
6edfbbad 7838 }
19e08130
AM
7839 else
7840 {
7841 struct ppc_dyn_relocs *p;
7842 struct ppc_dyn_relocs **pp;
7843 void *vpp;
7844 bfd_boolean is_ifunc;
8c1d1bb8 7845
19e08130
AM
7846 if (local_syms == NULL)
7847 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7848 if (sym_sec == NULL)
7849 sym_sec = sec;
c57da1a7 7850
19e08130
AM
7851 vpp = &elf_section_data (sym_sec)->local_dynrel;
7852 pp = (struct ppc_dyn_relocs **) vpp;
7853
7854 if (*pp == NULL && info->gc_sections)
7855 return TRUE;
7856
7857 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7858 while ((p = *pp) != NULL)
8c1d1bb8 7859 {
19e08130
AM
7860 if (p->sec == sec && p->ifunc == is_ifunc)
7861 {
7862 p->count -= 1;
7863 if (p->count == 0)
7864 *pp = p->next;
7865 return TRUE;
7866 }
7867 pp = &p->next;
8c1d1bb8 7868 }
8c1d1bb8
AM
7869 }
7870
695344c0 7871 /* xgettext:c-format */
cf97bcb0
AM
7872 _bfd_error_handler (_("dynreloc miscount for %pB, section %pA"),
7873 sec->owner, sec);
8c1d1bb8
AM
7874 bfd_set_error (bfd_error_bad_value);
7875 return FALSE;
7876}
7877
754021d0
AM
7878/* Remove unused Official Procedure Descriptor entries. Currently we
7879 only remove those associated with functions in discarded link-once
7880 sections, or weakly defined functions that have been overridden. It
7881 would be possible to remove many more entries for statically linked
7882 applications. */
7883
b34976b6 7884bfd_boolean
e7d1c40c 7885ppc64_elf_edit_opd (struct bfd_link_info *info)
1e2f5b6e
AM
7886{
7887 bfd *ibfd;
754021d0 7888 bfd_boolean some_edited = FALSE;
3f764659 7889 asection *need_pad = NULL;
e7d1c40c
AM
7890 struct ppc_link_hash_table *htab;
7891
7892 htab = ppc_hash_table (info);
7893 if (htab == NULL)
7894 return FALSE;
1e2f5b6e 7895
c72f2fb2 7896 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1e2f5b6e
AM
7897 {
7898 asection *sec;
7899 Elf_Internal_Rela *relstart, *rel, *relend;
7900 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 7901 Elf_Internal_Sym *local_syms;
74f0fb50 7902 struct _opd_sec_data *opd;
51aecdc5 7903 bfd_boolean need_edit, add_aux_fields, broken;
3f764659 7904 bfd_size_type cnt_16b = 0;
1e2f5b6e 7905
854b41e7
AM
7906 if (!is_ppc64_elf (ibfd))
7907 continue;
7908
1e2f5b6e 7909 sec = bfd_get_section_by_name (ibfd, ".opd");
46de2a7c 7910 if (sec == NULL || sec->size == 0)
1e2f5b6e
AM
7911 continue;
7912
dbaa2011 7913 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4b85d634
AM
7914 continue;
7915
1e2f5b6e
AM
7916 if (sec->output_section == bfd_abs_section_ptr)
7917 continue;
7918
7919 /* Look through the section relocs. */
7920 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7921 continue;
7922
6cdc0ccc 7923 local_syms = NULL;
0ffa91dd 7924 symtab_hdr = &elf_symtab_hdr (ibfd);
1e2f5b6e
AM
7925
7926 /* Read the relocations. */
4ce794b7 7927 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 7928 info->keep_memory);
1e2f5b6e 7929 if (relstart == NULL)
b34976b6 7930 return FALSE;
1e2f5b6e
AM
7931
7932 /* First run through the relocs to check they are sane, and to
7933 determine whether we need to edit this opd section. */
b34976b6 7934 need_edit = FALSE;
51aecdc5 7935 broken = FALSE;
3f764659 7936 need_pad = sec;
1e2f5b6e 7937 relend = relstart + sec->reloc_count;
50bc7936 7938 for (rel = relstart; rel < relend; )
1e2f5b6e 7939 {
04c9666a 7940 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
7941 unsigned long r_symndx;
7942 asection *sym_sec;
7943 struct elf_link_hash_entry *h;
7944 Elf_Internal_Sym *sym;
51aecdc5 7945 bfd_vma offset;
1e2f5b6e 7946
51aecdc5 7947 /* .opd contains an array of 16 or 24 byte entries. We're
1e2f5b6e
AM
7948 only interested in the reloc pointing to a function entry
7949 point. */
51aecdc5
AM
7950 offset = rel->r_offset;
7951 if (rel + 1 == relend
7952 || rel[1].r_offset != offset + 8)
1e2f5b6e
AM
7953 {
7954 /* If someone messes with .opd alignment then after a
7955 "ld -r" we might have padding in the middle of .opd.
7956 Also, there's nothing to prevent someone putting
7957 something silly in .opd with the assembler. No .opd
b34976b6 7958 optimization for them! */
3f764659 7959 broken_opd:
4eca0228 7960 _bfd_error_handler
871b3ab2 7961 (_("%pB: .opd is not a regular array of opd entries"), ibfd);
51aecdc5 7962 broken = TRUE;
1e2f5b6e
AM
7963 break;
7964 }
7965
50bc7936
AM
7966 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7967 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7968 {
4eca0228 7969 _bfd_error_handler
695344c0 7970 /* xgettext:c-format */
871b3ab2 7971 (_("%pB: unexpected reloc type %u in .opd section"),
d003868e 7972 ibfd, r_type);
51aecdc5 7973 broken = TRUE;
50bc7936
AM
7974 break;
7975 }
7976
1e2f5b6e 7977 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
7978 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7979 r_symndx, ibfd))
50bc7936 7980 goto error_ret;
1e2f5b6e
AM
7981
7982 if (sym_sec == NULL || sym_sec->owner == NULL)
7983 {
411e1bfb
AM
7984 const char *sym_name;
7985 if (h != NULL)
7986 sym_name = h->root.root.string;
7987 else
26c61ae5
L
7988 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7989 sym_sec);
411e1bfb 7990
4eca0228 7991 _bfd_error_handler
695344c0 7992 /* xgettext:c-format */
871b3ab2 7993 (_("%pB: undefined sym `%s' in .opd section"),
d003868e 7994 ibfd, sym_name);
51aecdc5 7995 broken = TRUE;
1e2f5b6e
AM
7996 break;
7997 }
7998
51020317
AM
7999 /* opd entries are always for functions defined in the
8000 current input bfd. If the symbol isn't defined in the
8001 input bfd, then we won't be using the function in this
8002 bfd; It must be defined in a linkonce section in another
8003 bfd, or is weak. It's also possible that we are
8004 discarding the function due to a linker script /DISCARD/,
8005 which we test for via the output_section. */
8006 if (sym_sec->owner != ibfd
8007 || sym_sec->output_section == bfd_abs_section_ptr)
b34976b6 8008 need_edit = TRUE;
1e2f5b6e 8009
50bc7936 8010 rel += 2;
51aecdc5
AM
8011 if (rel + 1 == relend
8012 || (rel + 2 < relend
8013 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
8014 ++rel;
8015
8016 if (rel == relend)
3f764659
JJ
8017 {
8018 if (sec->size == offset + 24)
8019 {
8020 need_pad = NULL;
8021 break;
8022 }
51aecdc5 8023 if (sec->size == offset + 16)
3f764659
JJ
8024 {
8025 cnt_16b++;
8026 break;
8027 }
8028 goto broken_opd;
8029 }
3f764659
JJ
8030 else if (rel + 1 < relend
8031 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
8032 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
8033 {
51aecdc5
AM
8034 if (rel[0].r_offset == offset + 16)
8035 cnt_16b++;
8036 else if (rel[0].r_offset != offset + 24)
8037 goto broken_opd;
3f764659
JJ
8038 }
8039 else
8040 goto broken_opd;
1e2f5b6e
AM
8041 }
8042
e7d1c40c 8043 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
3f764659 8044
51aecdc5 8045 if (!broken && (need_edit || add_aux_fields))
1e2f5b6e
AM
8046 {
8047 Elf_Internal_Rela *write_rel;
d4730f92 8048 Elf_Internal_Shdr *rel_hdr;
1e2f5b6e 8049 bfd_byte *rptr, *wptr;
983bddc8 8050 bfd_byte *new_contents;
74f0fb50
AM
8051 bfd_size_type amt;
8052
983bddc8 8053 new_contents = NULL;
51aecdc5 8054 amt = OPD_NDX (sec->size) * sizeof (long);
74f0fb50 8055 opd = &ppc64_elf_section_data (sec)->u.opd;
33c0ec9d 8056 opd->adjust = bfd_zalloc (sec->owner, amt);
74f0fb50
AM
8057 if (opd->adjust == NULL)
8058 return FALSE;
1e2f5b6e
AM
8059
8060 /* This seems a waste of time as input .opd sections are all
8061 zeros as generated by gcc, but I suppose there's no reason
8062 this will always be so. We might start putting something in
8063 the third word of .opd entries. */
8064 if ((sec->flags & SEC_IN_MEMORY) == 0)
8065 {
eea6121a
AM
8066 bfd_byte *loc;
8067 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 8068 {
eea6121a
AM
8069 if (loc != NULL)
8070 free (loc);
50bc7936 8071 error_ret:
6cdc0ccc
AM
8072 if (local_syms != NULL
8073 && symtab_hdr->contents != (unsigned char *) local_syms)
8074 free (local_syms);
6cdc0ccc
AM
8075 if (elf_section_data (sec)->relocs != relstart)
8076 free (relstart);
b34976b6 8077 return FALSE;
6cdc0ccc 8078 }
1e2f5b6e
AM
8079 sec->contents = loc;
8080 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
8081 }
8082
8083 elf_section_data (sec)->relocs = relstart;
8084
3f764659 8085 new_contents = sec->contents;
3f764659
JJ
8086 if (add_aux_fields)
8087 {
8088 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
8089 if (new_contents == NULL)
8090 return FALSE;
51aecdc5 8091 need_pad = NULL;
3f764659 8092 }
b4f4e59f
AM
8093 wptr = new_contents;
8094 rptr = sec->contents;
1e2f5b6e 8095 write_rel = relstart;
51aecdc5 8096 for (rel = relstart; rel < relend; )
1e2f5b6e 8097 {
50bc7936
AM
8098 unsigned long r_symndx;
8099 asection *sym_sec;
8100 struct elf_link_hash_entry *h;
51aecdc5 8101 struct ppc_link_hash_entry *fdh = NULL;
50bc7936 8102 Elf_Internal_Sym *sym;
51aecdc5
AM
8103 long opd_ent_size;
8104 Elf_Internal_Rela *next_rel;
8105 bfd_boolean skip;
50bc7936
AM
8106
8107 r_symndx = ELF64_R_SYM (rel->r_info);
8108 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 8109 r_symndx, ibfd))
50bc7936
AM
8110 goto error_ret;
8111
51aecdc5
AM
8112 next_rel = rel + 2;
8113 if (next_rel + 1 == relend
8114 || (next_rel + 2 < relend
8115 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
8116 ++next_rel;
8117
8118 /* See if the .opd entry is full 24 byte or
8119 16 byte (with fd_aux entry overlapped with next
8120 fd_func). */
8121 opd_ent_size = 24;
8122 if (next_rel == relend)
1e2f5b6e 8123 {
51aecdc5 8124 if (sec->size == rel->r_offset + 16)
3f764659 8125 opd_ent_size = 16;
51aecdc5
AM
8126 }
8127 else if (next_rel->r_offset == rel->r_offset + 16)
8128 opd_ent_size = 16;
3f764659 8129
51aecdc5
AM
8130 if (h != NULL
8131 && h->root.root.string[0] == '.')
8132 {
8c5b4e52
AM
8133 fdh = ((struct ppc_link_hash_entry *) h)->oh;
8134 if (fdh != NULL)
8135 {
8136 fdh = ppc_follow_link (fdh);
8137 if (fdh->elf.root.type != bfd_link_hash_defined
8138 && fdh->elf.root.type != bfd_link_hash_defweak)
8139 fdh = NULL;
8140 }
51aecdc5 8141 }
1e2f5b6e 8142
51aecdc5
AM
8143 skip = (sym_sec->owner != ibfd
8144 || sym_sec->output_section == bfd_abs_section_ptr);
8145 if (skip)
8146 {
8147 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7 8148 {
51aecdc5
AM
8149 /* Arrange for the function descriptor sym
8150 to be dropped. */
8151 fdh->elf.root.u.def.value = 0;
8152 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 8153 }
51aecdc5 8154 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
1e2f5b6e 8155
0e1862bb 8156 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
51aecdc5
AM
8157 rel = next_rel;
8158 else
8159 while (1)
8160 {
8161 if (!dec_dynrel_count (rel->r_info, sec, info,
8162 NULL, h, sym))
8163 goto error_ret;
754021d0 8164
51aecdc5
AM
8165 if (++rel == next_rel)
8166 break;
1e2f5b6e 8167
51aecdc5
AM
8168 r_symndx = ELF64_R_SYM (rel->r_info);
8169 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8170 r_symndx, ibfd))
8171 goto error_ret;
8172 }
50bc7936
AM
8173 }
8174 else
1e2f5b6e 8175 {
51aecdc5
AM
8176 /* We'll be keeping this opd entry. */
8177 long adjust;
8178
8179 if (fdh != NULL)
8180 {
8181 /* Redefine the function descriptor symbol to
8182 this location in the opd section. It is
8183 necessary to update the value here rather
8184 than using an array of adjustments as we do
8185 for local symbols, because various places
8186 in the generic ELF code use the value
8187 stored in u.def.value. */
8188 fdh->elf.root.u.def.value = wptr - new_contents;
8189 fdh->adjust_done = 1;
8190 }
8191
8192 /* Local syms are a bit tricky. We could
8193 tweak them as they can be cached, but
8194 we'd need to look through the local syms
8195 for the function descriptor sym which we
8196 don't have at the moment. So keep an
8197 array of adjustments. */
8198 adjust = (wptr - new_contents) - (rptr - sec->contents);
8199 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
8200
8201 if (wptr != rptr)
8202 memcpy (wptr, rptr, opd_ent_size);
8203 wptr += opd_ent_size;
8204 if (add_aux_fields && opd_ent_size == 16)
8205 {
8206 memset (wptr, '\0', 8);
8207 wptr += 8;
8208 }
8209
50bc7936 8210 /* We need to adjust any reloc offsets to point to the
51aecdc5
AM
8211 new opd entries. */
8212 for ( ; rel != next_rel; ++rel)
8213 {
8214 rel->r_offset += adjust;
8215 if (write_rel != rel)
8216 memcpy (write_rel, rel, sizeof (*rel));
8217 ++write_rel;
8218 }
1e2f5b6e 8219 }
51aecdc5
AM
8220
8221 rptr += opd_ent_size;
1e2f5b6e
AM
8222 }
8223
3f764659 8224 sec->size = wptr - new_contents;
1e2f5b6e 8225 sec->reloc_count = write_rel - relstart;
3f764659
JJ
8226 if (add_aux_fields)
8227 {
8228 free (sec->contents);
8229 sec->contents = new_contents;
8230 }
8231
05bf9422 8232 /* Fudge the header size too, as this is used later in
cdcf6e38 8233 elf_bfd_final_link if we are emitting relocs. */
d4730f92
BS
8234 rel_hdr = _bfd_elf_single_rel_hdr (sec);
8235 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
754021d0 8236 some_edited = TRUE;
1e2f5b6e 8237 }
6cdc0ccc 8238 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 8239 free (relstart);
6cdc0ccc 8240
411e1bfb
AM
8241 if (local_syms != NULL
8242 && symtab_hdr->contents != (unsigned char *) local_syms)
8243 {
8244 if (!info->keep_memory)
8245 free (local_syms);
8246 else
8247 symtab_hdr->contents = (unsigned char *) local_syms;
8248 }
8249 }
8250
754021d0
AM
8251 if (some_edited)
8252 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
8253
3f764659
JJ
8254 /* If we are doing a final link and the last .opd entry is just 16 byte
8255 long, add a 8 byte padding after it. */
0e1862bb 8256 if (need_pad != NULL && !bfd_link_relocatable (info))
3f764659
JJ
8257 {
8258 bfd_byte *p;
8259
8260 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
8261 {
8262 BFD_ASSERT (need_pad->size > 0);
8263
8264 p = bfd_malloc (need_pad->size + 8);
8265 if (p == NULL)
8266 return FALSE;
699733f6 8267
3f764659
JJ
8268 if (! bfd_get_section_contents (need_pad->owner, need_pad,
8269 p, 0, need_pad->size))
8270 return FALSE;
8271
8272 need_pad->contents = p;
8273 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
8274 }
8275 else
8276 {
8277 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
8278 if (p == NULL)
8279 return FALSE;
8280
8281 need_pad->contents = p;
8282 }
8283
8284 memset (need_pad->contents + need_pad->size, 0, 8);
8285 need_pad->size += 8;
8286 }
8287
411e1bfb
AM
8288 return TRUE;
8289}
8290
3e04d765
AM
8291/* Analyze inline PLT call relocations to see whether calls to locally
8292 defined functions can be converted to direct calls. */
8293
8294bfd_boolean
8295ppc64_elf_inline_plt (struct bfd_link_info *info)
8296{
8297 struct ppc_link_hash_table *htab;
8298 bfd *ibfd;
8299 asection *sec;
8300 bfd_vma low_vma, high_vma, limit;
8301
8302 htab = ppc_hash_table (info);
8303 if (htab == NULL)
8304 return FALSE;
8305
8306 /* A bl insn can reach -0x2000000 to 0x1fffffc. The limit is
8307 reduced somewhat to cater for possible stubs that might be added
8308 between the call and its destination. */
8309 if (htab->params->group_size < 0)
8310 {
8311 limit = -htab->params->group_size;
8312 if (limit == 1)
8313 limit = 0x1e00000;
8314 }
8315 else
8316 {
8317 limit = htab->params->group_size;
8318 if (limit == 1)
8319 limit = 0x1c00000;
8320 }
8321
8322 low_vma = -1;
8323 high_vma = 0;
8324 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
8325 if ((sec->flags & (SEC_ALLOC | SEC_CODE)) == (SEC_ALLOC | SEC_CODE))
8326 {
8327 if (low_vma > sec->vma)
8328 low_vma = sec->vma;
8329 if (high_vma < sec->vma + sec->size)
8330 high_vma = sec->vma + sec->size;
8331 }
8332
8333 /* If a "bl" can reach anywhere in local code sections, then we can
8334 convert all inline PLT sequences to direct calls when the symbol
8335 is local. */
8336 if (high_vma - low_vma < limit)
8337 {
8338 htab->can_convert_all_inline_plt = 1;
8339 return TRUE;
8340 }
8341
8342 /* Otherwise, go looking through relocs for cases where a direct
8343 call won't reach. Mark the symbol on any such reloc to disable
8344 the optimization and keep the PLT entry as it seems likely that
8345 this will be better than creating trampolines. Note that this
8346 will disable the optimization for all inline PLT calls to a
8347 particular symbol, not just those that won't reach. The
8348 difficulty in doing a more precise optimization is that the
8349 linker needs to make a decision depending on whether a
8350 particular R_PPC64_PLTCALL insn can be turned into a direct
8351 call, for each of the R_PPC64_PLTSEQ and R_PPC64_PLT16* insns in
8352 the sequence, and there is nothing that ties those relocs
8353 together except their symbol. */
8354
8355 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8356 {
8357 Elf_Internal_Shdr *symtab_hdr;
8358 Elf_Internal_Sym *local_syms;
8359
8360 if (!is_ppc64_elf (ibfd))
8361 continue;
8362
8363 local_syms = NULL;
8364 symtab_hdr = &elf_symtab_hdr (ibfd);
8365
8366 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8367 if (ppc64_elf_section_data (sec)->has_pltcall
8368 && !bfd_is_abs_section (sec->output_section))
8369 {
8370 Elf_Internal_Rela *relstart, *rel, *relend;
8371
8372 /* Read the relocations. */
8373 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8374 info->keep_memory);
8375 if (relstart == NULL)
8376 return FALSE;
8377
8378 relend = relstart + sec->reloc_count;
8379 for (rel = relstart; rel < relend; )
8380 {
8381 enum elf_ppc64_reloc_type r_type;
8382 unsigned long r_symndx;
8383 asection *sym_sec;
8384 struct elf_link_hash_entry *h;
8385 Elf_Internal_Sym *sym;
8386 unsigned char *tls_maskp;
8387
8388 r_type = ELF64_R_TYPE (rel->r_info);
8389 if (r_type != R_PPC64_PLTCALL)
8390 continue;
8391
8392 r_symndx = ELF64_R_SYM (rel->r_info);
8393 if (!get_sym_h (&h, &sym, &sym_sec, &tls_maskp, &local_syms,
8394 r_symndx, ibfd))
8395 {
8396 if (elf_section_data (sec)->relocs != relstart)
8397 free (relstart);
8398 if (local_syms != NULL
8399 && symtab_hdr->contents != (unsigned char *) local_syms)
8400 free (local_syms);
8401 return FALSE;
8402 }
8403
8404 if (sym_sec != NULL && sym_sec->output_section != NULL)
8405 {
8406 bfd_vma from, to;
8407 if (h != NULL)
8408 to = h->root.u.def.value;
8409 else
8410 to = sym->st_value;
8411 to += (rel->r_addend
8412 + sym_sec->output_offset
8413 + sym_sec->output_section->vma);
8414 from = (rel->r_offset
8415 + sec->output_offset
8416 + sec->output_section->vma);
8417 if (to - from + limit < 2 * limit)
8418 *tls_maskp &= ~PLT_KEEP;
8419 }
8420 }
8421 if (elf_section_data (sec)->relocs != relstart)
8422 free (relstart);
8423 }
8424
8425 if (local_syms != NULL
8426 && symtab_hdr->contents != (unsigned char *) local_syms)
8427 {
8428 if (!info->keep_memory)
8429 free (local_syms);
8430 else
8431 symtab_hdr->contents = (unsigned char *) local_syms;
8432 }
8433 }
8434
8435 return TRUE;
8436}
8437
e1918d23 8438/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
411e1bfb 8439
e1918d23 8440asection *
e7d1c40c 8441ppc64_elf_tls_setup (struct bfd_link_info *info)
411e1bfb 8442{
411e1bfb
AM
8443 struct ppc_link_hash_table *htab;
8444
411e1bfb 8445 htab = ppc_hash_table (info);
4dfe6ac6
NC
8446 if (htab == NULL)
8447 return NULL;
8448
ee67d69a
AM
8449 if (abiversion (info->output_bfd) == 1)
8450 htab->opd_abi = 1;
8451
e7d1c40c 8452 if (htab->params->no_multi_toc)
33c0ec9d
AM
8453 htab->do_multi_toc = 0;
8454 else if (!htab->do_multi_toc)
e7d1c40c 8455 htab->params->no_multi_toc = 1;
33c0ec9d 8456
8b5f1ed8
AM
8457 /* Default to --no-plt-localentry, as this option can cause problems
8458 with symbol interposition. For example, glibc libpthread.so and
8459 libc.so duplicate many pthread symbols, with a fallback
8460 implementation in libc.so. In some cases the fallback does more
8461 work than the pthread implementation. __pthread_condattr_destroy
8462 is one such symbol: the libpthread.so implementation is
8463 localentry:0 while the libc.so implementation is localentry:8.
8464 An app that "cleverly" uses dlopen to only load necessary
8465 libraries at runtime may omit loading libpthread.so when not
8466 running multi-threaded, which then results in the libc.so
8467 fallback symbols being used and ld.so complaining. Now there
8468 are workarounds in ld (see non_zero_localentry) to detect the
8469 pthread situation, but that may not be the only case where
8470 --plt-localentry can cause trouble. */
f378ab09 8471 if (htab->params->plt_localentry0 < 0)
8b5f1ed8 8472 htab->params->plt_localentry0 = 0;
d44c746a
AM
8473 if (htab->params->plt_localentry0
8474 && elf_link_hash_lookup (&htab->elf, "GLIBC_2.26",
8475 FALSE, FALSE, FALSE) == NULL)
cf97bcb0
AM
8476 _bfd_error_handler
8477 (_("warning: --plt-localentry is especially dangerous without "
8478 "ld.so support to detect ABI violations"));
f378ab09 8479
3a71aa26
AM
8480 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
8481 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
8482 FALSE, FALSE, TRUE));
a7f2871e
AM
8483 /* Move dynamic linking info to the function descriptor sym. */
8484 if (htab->tls_get_addr != NULL)
8485 func_desc_adjust (&htab->tls_get_addr->elf, info);
3a71aa26
AM
8486 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
8487 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
8488 FALSE, FALSE, TRUE));
7c9cf415 8489 if (htab->params->tls_get_addr_opt)
a7f2871e
AM
8490 {
8491 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
8492
8493 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
8494 FALSE, FALSE, TRUE);
8495 if (opt != NULL)
8496 func_desc_adjust (opt, info);
8497 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
8498 FALSE, FALSE, TRUE);
8499 if (opt_fd != NULL
8500 && (opt_fd->root.type == bfd_link_hash_defined
8501 || opt_fd->root.type == bfd_link_hash_defweak))
8502 {
8503 /* If glibc supports an optimized __tls_get_addr call stub,
8504 signalled by the presence of __tls_get_addr_opt, and we'll
8505 be calling __tls_get_addr via a plt call stub, then
8506 make __tls_get_addr point to __tls_get_addr_opt. */
8507 tga_fd = &htab->tls_get_addr_fd->elf;
8508 if (htab->elf.dynamic_sections_created
8509 && tga_fd != NULL
8510 && (tga_fd->type == STT_FUNC
8511 || tga_fd->needs_plt)
8512 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
21d68fcd 8513 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd)))
a7f2871e
AM
8514 {
8515 struct plt_entry *ent;
8516
8517 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
8518 if (ent->plt.refcount > 0)
8519 break;
8520 if (ent != NULL)
8521 {
8522 tga_fd->root.type = bfd_link_hash_indirect;
8523 tga_fd->root.u.i.link = &opt_fd->root;
8524 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
b531344c 8525 opt_fd->mark = 1;
a7f2871e
AM
8526 if (opt_fd->dynindx != -1)
8527 {
8528 /* Use __tls_get_addr_opt in dynamic relocations. */
8529 opt_fd->dynindx = -1;
8530 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
8531 opt_fd->dynstr_index);
8532 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
854b41e7 8533 return NULL;
a7f2871e
AM
8534 }
8535 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
8536 tga = &htab->tls_get_addr->elf;
8537 if (opt != NULL && tga != NULL)
8538 {
8539 tga->root.type = bfd_link_hash_indirect;
8540 tga->root.u.i.link = &opt->root;
8541 ppc64_elf_copy_indirect_symbol (info, opt, tga);
b531344c 8542 opt->mark = 1;
a7f2871e
AM
8543 _bfd_elf_link_hash_hide_symbol (info, opt,
8544 tga->forced_local);
8545 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
8546 }
8547 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
8548 htab->tls_get_addr_fd->is_func_descriptor = 1;
8549 if (htab->tls_get_addr != NULL)
8550 {
8551 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
8552 htab->tls_get_addr->is_func = 1;
8553 }
8554 }
8555 }
8556 }
7c9cf415
AM
8557 else if (htab->params->tls_get_addr_opt < 0)
8558 htab->params->tls_get_addr_opt = 0;
a7f2871e 8559 }
33c0ec9d 8560 return _bfd_elf_tls_setup (info->output_bfd, info);
3a71aa26 8561}
8387904d 8562
3a71aa26
AM
8563/* Return TRUE iff REL is a branch reloc with a global symbol matching
8564 HASH1 or HASH2. */
8387904d 8565
3a71aa26
AM
8566static bfd_boolean
8567branch_reloc_hash_match (const bfd *ibfd,
8568 const Elf_Internal_Rela *rel,
8569 const struct ppc_link_hash_entry *hash1,
8570 const struct ppc_link_hash_entry *hash2)
8571{
8572 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
8573 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
8574 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
8575
e054468f 8576 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8387904d 8577 {
3a71aa26
AM
8578 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
8579 struct elf_link_hash_entry *h;
8387904d 8580
3a71aa26 8581 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 8582 h = elf_follow_link (h);
3a71aa26
AM
8583 if (h == &hash1->elf || h == &hash2->elf)
8584 return TRUE;
a48ebf4d 8585 }
3a71aa26 8586 return FALSE;
951fd09b 8587}
411e1bfb 8588
951fd09b
AM
8589/* Run through all the TLS relocs looking for optimization
8590 opportunities. The linker has been hacked (see ppc64elf.em) to do
8591 a preliminary section layout so that we know the TLS segment
8592 offsets. We can't optimize earlier because some optimizations need
8593 to know the tp offset, and we need to optimize before allocating
8594 dynamic relocations. */
8595
8596bfd_boolean
33c0ec9d 8597ppc64_elf_tls_optimize (struct bfd_link_info *info)
951fd09b
AM
8598{
8599 bfd *ibfd;
8600 asection *sec;
8601 struct ppc_link_hash_table *htab;
663a1470 8602 unsigned char *toc_ref;
102890f0 8603 int pass;
951fd09b 8604
3cbc1e5e 8605 if (!bfd_link_executable (info))
411e1bfb
AM
8606 return TRUE;
8607
951fd09b 8608 htab = ppc_hash_table (info);
4dfe6ac6
NC
8609 if (htab == NULL)
8610 return FALSE;
8611
663a1470
AM
8612 /* Make two passes over the relocs. On the first pass, mark toc
8613 entries involved with tls relocs, and check that tls relocs
8614 involved in setting up a tls_get_addr call are indeed followed by
8615 such a call. If they are not, we can't do any tls optimization.
8616 On the second pass twiddle tls_mask flags to notify
8617 relocate_section that optimization can be done, and adjust got
8618 and plt refcounts. */
8619 toc_ref = NULL;
8620 for (pass = 0; pass < 2; ++pass)
c72f2fb2 8621 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
663a1470
AM
8622 {
8623 Elf_Internal_Sym *locsyms = NULL;
8624 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
8625
102890f0
AM
8626 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8627 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
8628 {
8629 Elf_Internal_Rela *relstart, *rel, *relend;
663a1470 8630 bfd_boolean found_tls_get_addr_arg = 0;
411e1bfb 8631
102890f0
AM
8632 /* Read the relocations. */
8633 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8634 info->keep_memory);
8635 if (relstart == NULL)
2915c55b
JK
8636 {
8637 free (toc_ref);
8638 return FALSE;
8639 }
411e1bfb 8640
102890f0
AM
8641 relend = relstart + sec->reloc_count;
8642 for (rel = relstart; rel < relend; rel++)
8643 {
8644 enum elf_ppc64_reloc_type r_type;
8645 unsigned long r_symndx;
8646 struct elf_link_hash_entry *h;
8647 Elf_Internal_Sym *sym;
8648 asection *sym_sec;
f961d9dd
AM
8649 unsigned char *tls_mask;
8650 unsigned char tls_set, tls_clear, tls_type = 0;
102890f0
AM
8651 bfd_vma value;
8652 bfd_boolean ok_tprel, is_local;
8653 long toc_ref_index = 0;
8654 int expecting_tls_get_addr = 0;
663a1470 8655 bfd_boolean ret = FALSE;
411e1bfb 8656
102890f0
AM
8657 r_symndx = ELF64_R_SYM (rel->r_info);
8658 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
8659 r_symndx, ibfd))
8660 {
8661 err_free_rel:
8662 if (elf_section_data (sec)->relocs != relstart)
8663 free (relstart);
8664 if (toc_ref != NULL)
8665 free (toc_ref);
8666 if (locsyms != NULL
0ffa91dd 8667 && (elf_symtab_hdr (ibfd).contents
102890f0
AM
8668 != (unsigned char *) locsyms))
8669 free (locsyms);
663a1470 8670 return ret;
102890f0 8671 }
411e1bfb 8672
102890f0
AM
8673 if (h != NULL)
8674 {
766bc656
AM
8675 if (h->root.type == bfd_link_hash_defined
8676 || h->root.type == bfd_link_hash_defweak)
8677 value = h->root.u.def.value;
8678 else if (h->root.type == bfd_link_hash_undefweak)
8679 value = 0;
8680 else
663a1470
AM
8681 {
8682 found_tls_get_addr_arg = 0;
8683 continue;
8684 }
102890f0
AM
8685 }
8686 else
8687 /* Symbols referenced by TLS relocs must be of type
8688 STT_TLS. So no need for .opd local sym adjust. */
8689 value = sym->st_value;
8690
8691 ok_tprel = FALSE;
8692 is_local = FALSE;
8693 if (h == NULL
8694 || !h->def_dynamic)
8695 {
8696 is_local = TRUE;
766bc656
AM
8697 if (h != NULL
8698 && h->root.type == bfd_link_hash_undefweak)
8699 ok_tprel = TRUE;
c27b8c2a
AM
8700 else if (sym_sec != NULL
8701 && sym_sec->output_section != NULL)
766bc656
AM
8702 {
8703 value += sym_sec->output_offset;
8704 value += sym_sec->output_section->vma;
8705 value -= htab->elf.tls_sec->vma;
8706 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
8707 < (bfd_vma) 1 << 32);
8708 }
102890f0 8709 }
951fd09b 8710
102890f0 8711 r_type = ELF64_R_TYPE (rel->r_info);
663a1470
AM
8712 /* If this section has old-style __tls_get_addr calls
8713 without marker relocs, then check that each
8714 __tls_get_addr call reloc is preceded by a reloc
8715 that conceivably belongs to the __tls_get_addr arg
8716 setup insn. If we don't find matching arg setup
8717 relocs, don't do any tls optimization. */
8718 if (pass == 0
8719 && sec->has_tls_get_addr_call
8720 && h != NULL
8721 && (h == &htab->tls_get_addr->elf
8722 || h == &htab->tls_get_addr_fd->elf)
8723 && !found_tls_get_addr_arg
8724 && is_branch_reloc (r_type))
8725 {
25f53a85 8726 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
663a1470
AM
8727 "TLS optimization disabled\n"),
8728 ibfd, sec, rel->r_offset);
8729 ret = TRUE;
8730 goto err_free_rel;
8731 }
8732
8733 found_tls_get_addr_arg = 0;
102890f0
AM
8734 switch (r_type)
8735 {
8736 case R_PPC64_GOT_TLSLD16:
8737 case R_PPC64_GOT_TLSLD16_LO:
8738 expecting_tls_get_addr = 1;
663a1470 8739 found_tls_get_addr_arg = 1;
1a0670f3 8740 /* Fall through. */
102890f0
AM
8741
8742 case R_PPC64_GOT_TLSLD16_HI:
8743 case R_PPC64_GOT_TLSLD16_HA:
8744 /* These relocs should never be against a symbol
8745 defined in a shared lib. Leave them alone if
8746 that turns out to be the case. */
8747 if (!is_local)
8748 continue;
411e1bfb 8749
102890f0 8750 /* LD -> LE */
411e1bfb 8751 tls_set = 0;
102890f0
AM
8752 tls_clear = TLS_LD;
8753 tls_type = TLS_TLS | TLS_LD;
8754 break;
411e1bfb 8755
102890f0
AM
8756 case R_PPC64_GOT_TLSGD16:
8757 case R_PPC64_GOT_TLSGD16_LO:
8758 expecting_tls_get_addr = 1;
663a1470 8759 found_tls_get_addr_arg = 1;
1a0670f3 8760 /* Fall through. */
102890f0
AM
8761
8762 case R_PPC64_GOT_TLSGD16_HI:
8763 case R_PPC64_GOT_TLSGD16_HA:
8764 if (ok_tprel)
8765 /* GD -> LE */
411e1bfb 8766 tls_set = 0;
102890f0
AM
8767 else
8768 /* GD -> IE */
8769 tls_set = TLS_TLS | TLS_TPRELGD;
8770 tls_clear = TLS_GD;
8771 tls_type = TLS_TLS | TLS_GD;
8772 break;
8773
8774 case R_PPC64_GOT_TPREL16_DS:
8775 case R_PPC64_GOT_TPREL16_LO_DS:
8776 case R_PPC64_GOT_TPREL16_HI:
8777 case R_PPC64_GOT_TPREL16_HA:
8778 if (ok_tprel)
8779 {
8780 /* IE -> LE */
8781 tls_set = 0;
8782 tls_clear = TLS_TPREL;
8783 tls_type = TLS_TLS | TLS_TPREL;
8784 break;
8785 }
411e1bfb
AM
8786 continue;
8787
727fc41e
AM
8788 case R_PPC64_TLSGD:
8789 case R_PPC64_TLSLD:
23cedd1d
AM
8790 if (rel + 1 < relend
8791 && is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
8792 {
8793 if (pass != 0
8794 && ELF64_R_TYPE (rel[1].r_info) != R_PPC64_PLTSEQ)
8795 {
8796 r_symndx = ELF64_R_SYM (rel[1].r_info);
8797 if (!get_sym_h (&h, NULL, NULL, NULL, &locsyms,
8798 r_symndx, ibfd))
8799 goto err_free_rel;
8800 if (h != NULL)
8801 {
8802 struct plt_entry *ent = NULL;
8803
8804 for (ent = h->plt.plist;
8805 ent != NULL;
8806 ent = ent->next)
8807 if (ent->addend == rel[1].r_addend)
8808 break;
8809
8810 if (ent != NULL
8811 && ent->plt.refcount > 0)
8812 ent->plt.refcount -= 1;
8813 }
8814 }
8815 continue;
8816 }
663a1470 8817 found_tls_get_addr_arg = 1;
1a0670f3 8818 /* Fall through. */
663a1470
AM
8819
8820 case R_PPC64_TLS:
8821 case R_PPC64_TOC16:
8822 case R_PPC64_TOC16_LO:
102890f0
AM
8823 if (sym_sec == NULL || sym_sec != toc)
8824 continue;
8825
8826 /* Mark this toc entry as referenced by a TLS
8827 code sequence. We can do that now in the
8828 case of R_PPC64_TLS, and after checking for
8829 tls_get_addr for the TOC16 relocs. */
8830 if (toc_ref == NULL)
663a1470
AM
8831 toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
8832 if (toc_ref == NULL)
8833 goto err_free_rel;
8834
102890f0
AM
8835 if (h != NULL)
8836 value = h->root.u.def.value;
8837 else
8838 value = sym->st_value;
8839 value += rel->r_addend;
73242275
AM
8840 if (value % 8 != 0)
8841 continue;
8842 BFD_ASSERT (value < toc->size
8843 && toc->output_offset % 8 == 0);
663a1470 8844 toc_ref_index = (value + toc->output_offset) / 8;
727fc41e
AM
8845 if (r_type == R_PPC64_TLS
8846 || r_type == R_PPC64_TLSGD
8847 || r_type == R_PPC64_TLSLD)
102890f0
AM
8848 {
8849 toc_ref[toc_ref_index] = 1;
8850 continue;
8851 }
8852
8853 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8854 continue;
8855
8856 tls_set = 0;
8857 tls_clear = 0;
8858 expecting_tls_get_addr = 2;
8859 break;
8860
8861 case R_PPC64_TPREL64:
8862 if (pass == 0
8863 || sec != toc
8864 || toc_ref == NULL
663a1470 8865 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8866 continue;
8867 if (ok_tprel)
8868 {
8869 /* IE -> LE */
8870 tls_set = TLS_EXPLICIT;
8871 tls_clear = TLS_TPREL;
8872 break;
8873 }
8874 continue;
8875
8876 case R_PPC64_DTPMOD64:
8877 if (pass == 0
8878 || sec != toc
8879 || toc_ref == NULL
663a1470 8880 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8881 continue;
8882 if (rel + 1 < relend
8883 && (rel[1].r_info
8884 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8885 && rel[1].r_offset == rel->r_offset + 8)
8886 {
8887 if (ok_tprel)
8888 /* GD -> LE */
8889 tls_set = TLS_EXPLICIT | TLS_GD;
8890 else
8891 /* GD -> IE */
8892 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
8893 tls_clear = TLS_GD;
8894 }
8895 else
8896 {
8897 if (!is_local)
8898 continue;
8899
8900 /* LD -> LE */
8901 tls_set = TLS_EXPLICIT;
8902 tls_clear = TLS_LD;
8903 }
8904 break;
8905
8906 default:
8907 continue;
8908 }
8909
8910 if (pass == 0)
8911 {
727fc41e
AM
8912 if (!expecting_tls_get_addr
8913 || !sec->has_tls_get_addr_call)
102890f0
AM
8914 continue;
8915
3a71aa26
AM
8916 if (rel + 1 < relend
8917 && branch_reloc_hash_match (ibfd, rel + 1,
8918 htab->tls_get_addr,
8919 htab->tls_get_addr_fd))
102890f0 8920 {
3a71aa26 8921 if (expecting_tls_get_addr == 2)
102890f0 8922 {
3a71aa26 8923 /* Check for toc tls entries. */
f961d9dd 8924 unsigned char *toc_tls;
3a71aa26
AM
8925 int retval;
8926
8927 retval = get_tls_mask (&toc_tls, NULL, NULL,
8928 &locsyms,
8929 rel, ibfd);
8930 if (retval == 0)
8931 goto err_free_rel;
663a1470
AM
8932 if (toc_tls != NULL)
8933 {
37da22e5
AM
8934 if ((*toc_tls & TLS_TLS) != 0
8935 && ((*toc_tls & (TLS_GD | TLS_LD)) != 0))
663a1470
AM
8936 found_tls_get_addr_arg = 1;
8937 if (retval > 1)
8938 toc_ref[toc_ref_index] = 1;
8939 }
102890f0 8940 }
3a71aa26 8941 continue;
102890f0
AM
8942 }
8943
102890f0
AM
8944 /* Uh oh, we didn't find the expected call. We
8945 could just mark this symbol to exclude it
8946 from tls optimization but it's safer to skip
663a1470 8947 the entire optimization. */
695344c0 8948 /* xgettext:c-format */
25f53a85 8949 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
663a1470
AM
8950 "TLS optimization disabled\n"),
8951 ibfd, sec, rel->r_offset);
8952 ret = TRUE;
8953 goto err_free_rel;
102890f0
AM
8954 }
8955
37da22e5
AM
8956 /* If we don't have old-style __tls_get_addr calls
8957 without TLSGD/TLSLD marker relocs, and we haven't
8958 found a new-style __tls_get_addr call with a
8959 marker for this symbol, then we either have a
8960 broken object file or an -mlongcall style
8961 indirect call to __tls_get_addr without a marker.
8962 Disable optimization in this case. */
8963 if ((tls_clear & (TLS_GD | TLS_LD)) != 0
8964 && (tls_set & TLS_EXPLICIT) == 0
8965 && !sec->has_tls_get_addr_call
8966 && ((*tls_mask & (TLS_TLS | TLS_MARK))
8967 != (TLS_TLS | TLS_MARK)))
8968 continue;
8969
23cedd1d 8970 if (expecting_tls_get_addr)
102890f0 8971 {
23cedd1d
AM
8972 struct plt_entry *ent = NULL;
8973
8974 if (htab->tls_get_addr != NULL)
8975 for (ent = htab->tls_get_addr->elf.plt.plist;
8976 ent != NULL;
8977 ent = ent->next)
8978 if (ent->addend == 0)
102890f0 8979 break;
411e1bfb 8980
23cedd1d
AM
8981 if (ent == NULL && htab->tls_get_addr_fd != NULL)
8982 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8983 ent != NULL;
8984 ent = ent->next)
8985 if (ent->addend == 0)
102890f0 8986 break;
23cedd1d
AM
8987
8988 if (ent != NULL
8989 && ent->plt.refcount > 0)
8990 ent->plt.refcount -= 1;
102890f0 8991 }
411e1bfb 8992
102890f0 8993 if (tls_clear == 0)
30038c59
AM
8994 continue;
8995
102890f0
AM
8996 if ((tls_set & TLS_EXPLICIT) == 0)
8997 {
8998 struct got_entry *ent;
411e1bfb 8999
102890f0
AM
9000 /* Adjust got entry for this reloc. */
9001 if (h != NULL)
9002 ent = h->got.glist;
9003 else
9004 ent = elf_local_got_ents (ibfd)[r_symndx];
411e1bfb 9005
102890f0
AM
9006 for (; ent != NULL; ent = ent->next)
9007 if (ent->addend == rel->r_addend
9008 && ent->owner == ibfd
9009 && ent->tls_type == tls_type)
9010 break;
9011 if (ent == NULL)
9012 abort ();
411e1bfb 9013
102890f0
AM
9014 if (tls_set == 0)
9015 {
9016 /* We managed to get rid of a got entry. */
9017 if (ent->got.refcount > 0)
9018 ent->got.refcount -= 1;
9019 }
9020 }
9021 else
9022 {
9023 /* If we got rid of a DTPMOD/DTPREL reloc pair then
9024 we'll lose one or two dyn relocs. */
9025 if (!dec_dynrel_count (rel->r_info, sec, info,
19e08130 9026 NULL, h, sym))
102890f0 9027 return FALSE;
411e1bfb 9028
102890f0
AM
9029 if (tls_set == (TLS_EXPLICIT | TLS_GD))
9030 {
9031 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
19e08130 9032 NULL, h, sym))
102890f0
AM
9033 return FALSE;
9034 }
9035 }
411e1bfb 9036
102890f0
AM
9037 *tls_mask |= tls_set;
9038 *tls_mask &= ~tls_clear;
9039 }
8c1d1bb8 9040
102890f0
AM
9041 if (elf_section_data (sec)->relocs != relstart)
9042 free (relstart);
9043 }
411e1bfb 9044
663a1470
AM
9045 if (locsyms != NULL
9046 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
9047 {
9048 if (!info->keep_memory)
9049 free (locsyms);
9050 else
9051 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
9052 }
9053 }
411e1bfb 9054
663a1470
AM
9055 if (toc_ref != NULL)
9056 free (toc_ref);
9a23f96e 9057 htab->do_tls_opt = 1;
b34976b6 9058 return TRUE;
1e2f5b6e 9059}
b34976b6 9060
c5614fa4
AM
9061/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
9062 the values of any global symbols in a toc section that has been
9063 edited. Globals in toc sections should be a rarity, so this function
9064 sets a flag if any are found in toc sections other than the one just
de194d85 9065 edited, so that further hash table traversals can be avoided. */
c5614fa4
AM
9066
9067struct adjust_toc_info
9068{
9069 asection *toc;
9070 unsigned long *skip;
9071 bfd_boolean global_toc_syms;
9072};
9073
ba761f19
AM
9074enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
9075
c5614fa4
AM
9076static bfd_boolean
9077adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
9078{
9079 struct ppc_link_hash_entry *eh;
9080 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
854b41e7 9081 unsigned long i;
c5614fa4 9082
c5614fa4
AM
9083 if (h->root.type != bfd_link_hash_defined
9084 && h->root.type != bfd_link_hash_defweak)
9085 return TRUE;
9086
9087 eh = (struct ppc_link_hash_entry *) h;
9088 if (eh->adjust_done)
9089 return TRUE;
9090
9091 if (eh->elf.root.u.def.section == toc_inf->toc)
9092 {
854b41e7
AM
9093 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
9094 i = toc_inf->toc->rawsize >> 3;
c5614fa4 9095 else
854b41e7
AM
9096 i = eh->elf.root.u.def.value >> 3;
9097
ba761f19 9098 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
c5614fa4 9099 {
4eca0228 9100 _bfd_error_handler
854b41e7
AM
9101 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
9102 do
9103 ++i;
ba761f19 9104 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
854b41e7 9105 eh->elf.root.u.def.value = (bfd_vma) i << 3;
c5614fa4 9106 }
854b41e7
AM
9107
9108 eh->elf.root.u.def.value -= toc_inf->skip[i];
c5614fa4
AM
9109 eh->adjust_done = 1;
9110 }
9111 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
9112 toc_inf->global_toc_syms = TRUE;
9113
9114 return TRUE;
9115}
9116
39eeab25
AM
9117/* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
9118 on a _LO variety toc/got reloc. */
560c8763
AM
9119
9120static bfd_boolean
39eeab25 9121ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type)
560c8763 9122{
39eeab25
AM
9123 return ((insn & (0x3f << 26)) == 12u << 26 /* addic */
9124 || (insn & (0x3f << 26)) == 14u << 26 /* addi */
560c8763
AM
9125 || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
9126 || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
9127 || (insn & (0x3f << 26)) == 36u << 26 /* stw */
9128 || (insn & (0x3f << 26)) == 38u << 26 /* stb */
9129 || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
9130 || (insn & (0x3f << 26)) == 42u << 26 /* lha */
9131 || (insn & (0x3f << 26)) == 44u << 26 /* sth */
9132 || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
9133 || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
9134 || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
9135 || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
9136 || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
9137 || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
39eeab25
AM
9138 || (insn & (0x3f << 26)) == 56u << 26 /* lq,lfq */
9139 || ((insn & (0x3f << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
9140 /* Exclude lfqu by testing reloc. If relocs are ever
9141 defined for the reduced D field in psq_lu then those
9142 will need testing too. */
9143 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
9144 || ((insn & (0x3f << 26)) == 58u << 26 /* ld,lwa */
9145 && (insn & 1) == 0)
9146 || (insn & (0x3f << 26)) == 60u << 26 /* stfq */
9147 || ((insn & (0x3f << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
9148 /* Exclude stfqu. psq_stu as above for psq_lu. */
9149 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
9150 || ((insn & (0x3f << 26)) == 62u << 26 /* std,stq */
9151 && (insn & 1) == 0));
560c8763
AM
9152}
9153
c5614fa4
AM
9154/* Examine all relocs referencing .toc sections in order to remove
9155 unused .toc entries. */
9156
9157bfd_boolean
33c0ec9d 9158ppc64_elf_edit_toc (struct bfd_link_info *info)
c5614fa4
AM
9159{
9160 bfd *ibfd;
9161 struct adjust_toc_info toc_inf;
67f0cbdb 9162 struct ppc_link_hash_table *htab = ppc_hash_table (info);
c5614fa4 9163
67f0cbdb 9164 htab->do_toc_opt = 1;
c5614fa4 9165 toc_inf.global_toc_syms = TRUE;
c72f2fb2 9166 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
c5614fa4
AM
9167 {
9168 asection *toc, *sec;
9169 Elf_Internal_Shdr *symtab_hdr;
9170 Elf_Internal_Sym *local_syms;
425b145b 9171 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
c5614fa4
AM
9172 unsigned long *skip, *drop;
9173 unsigned char *used;
9174 unsigned char *keep, last, some_unused;
9175
854b41e7
AM
9176 if (!is_ppc64_elf (ibfd))
9177 continue;
9178
c5614fa4
AM
9179 toc = bfd_get_section_by_name (ibfd, ".toc");
9180 if (toc == NULL
92b7a70f 9181 || toc->size == 0
dbaa2011
AM
9182 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
9183 || discarded_section (toc))
c5614fa4
AM
9184 continue;
9185
425b145b 9186 toc_relocs = NULL;
c5614fa4 9187 local_syms = NULL;
0ffa91dd 9188 symtab_hdr = &elf_symtab_hdr (ibfd);
c5614fa4
AM
9189
9190 /* Look at sections dropped from the final link. */
9191 skip = NULL;
9192 relstart = NULL;
9193 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9194 {
9195 if (sec->reloc_count == 0
dbaa2011 9196 || !discarded_section (sec)
c5614fa4
AM
9197 || get_opd_info (sec)
9198 || (sec->flags & SEC_ALLOC) == 0
9199 || (sec->flags & SEC_DEBUGGING) != 0)
9200 continue;
9201
9202 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
9203 if (relstart == NULL)
9204 goto error_ret;
9205
9206 /* Run through the relocs to see which toc entries might be
9207 unused. */
9208 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9209 {
9210 enum elf_ppc64_reloc_type r_type;
9211 unsigned long r_symndx;
9212 asection *sym_sec;
9213 struct elf_link_hash_entry *h;
9214 Elf_Internal_Sym *sym;
9215 bfd_vma val;
9216
9217 r_type = ELF64_R_TYPE (rel->r_info);
9218 switch (r_type)
9219 {
9220 default:
9221 continue;
9222
9223 case R_PPC64_TOC16:
9224 case R_PPC64_TOC16_LO:
9225 case R_PPC64_TOC16_HI:
9226 case R_PPC64_TOC16_HA:
9227 case R_PPC64_TOC16_DS:
9228 case R_PPC64_TOC16_LO_DS:
9229 break;
9230 }
9231
9232 r_symndx = ELF64_R_SYM (rel->r_info);
9233 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9234 r_symndx, ibfd))
9235 goto error_ret;
9236
9237 if (sym_sec != toc)
9238 continue;
9239
9240 if (h != NULL)
9241 val = h->root.u.def.value;
9242 else
9243 val = sym->st_value;
9244 val += rel->r_addend;
9245
9246 if (val >= toc->size)
9247 continue;
9248
9249 /* Anything in the toc ought to be aligned to 8 bytes.
9250 If not, don't mark as unused. */
9251 if (val & 7)
9252 continue;
9253
9254 if (skip == NULL)
9255 {
854b41e7 9256 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
c5614fa4
AM
9257 if (skip == NULL)
9258 goto error_ret;
9259 }
9260
ba761f19 9261 skip[val >> 3] = ref_from_discarded;
c5614fa4
AM
9262 }
9263
9264 if (elf_section_data (sec)->relocs != relstart)
9265 free (relstart);
9266 }
9267
ba761f19
AM
9268 /* For largetoc loads of address constants, we can convert
9269 . addis rx,2,addr@got@ha
9270 . ld ry,addr@got@l(rx)
9271 to
9272 . addis rx,2,addr@toc@ha
9273 . addi ry,rx,addr@toc@l
9274 when addr is within 2G of the toc pointer. This then means
9275 that the word storing "addr" in the toc is no longer needed. */
68ffbac6 9276
ba761f19
AM
9277 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
9278 && toc->output_section->rawsize < (bfd_vma) 1 << 31
9279 && toc->reloc_count != 0)
9280 {
9281 /* Read toc relocs. */
425b145b
AM
9282 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9283 info->keep_memory);
9284 if (toc_relocs == NULL)
ba761f19
AM
9285 goto error_ret;
9286
425b145b 9287 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9288 {
9289 enum elf_ppc64_reloc_type r_type;
9290 unsigned long r_symndx;
9291 asection *sym_sec;
9292 struct elf_link_hash_entry *h;
9293 Elf_Internal_Sym *sym;
9294 bfd_vma val, addr;
9295
9296 r_type = ELF64_R_TYPE (rel->r_info);
9297 if (r_type != R_PPC64_ADDR64)
9298 continue;
9299
9300 r_symndx = ELF64_R_SYM (rel->r_info);
9301 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9302 r_symndx, ibfd))
9303 goto error_ret;
9304
425b145b 9305 if (sym_sec == NULL
c27b8c2a 9306 || sym_sec->output_section == NULL
dbaa2011 9307 || discarded_section (sym_sec))
425b145b
AM
9308 continue;
9309
afe397ea 9310 if (!SYMBOL_REFERENCES_LOCAL (info, h))
ba761f19
AM
9311 continue;
9312
9313 if (h != NULL)
bddc25c9
AM
9314 {
9315 if (h->type == STT_GNU_IFUNC)
9316 continue;
9317 val = h->root.u.def.value;
9318 }
ba761f19 9319 else
bddc25c9
AM
9320 {
9321 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
9322 continue;
9323 val = sym->st_value;
9324 }
ba761f19
AM
9325 val += rel->r_addend;
9326 val += sym_sec->output_section->vma + sym_sec->output_offset;
9327
9328 /* We don't yet know the exact toc pointer value, but we
9329 know it will be somewhere in the toc section. Don't
9330 optimize if the difference from any possible toc
9331 pointer is outside [ff..f80008000, 7fff7fff]. */
9332 addr = toc->output_section->vma + TOC_BASE_OFF;
9333 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9334 continue;
9335
9336 addr = toc->output_section->vma + toc->output_section->rawsize;
9337 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9338 continue;
9339
9340 if (skip == NULL)
9341 {
9342 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
9343 if (skip == NULL)
9344 goto error_ret;
9345 }
9346
9347 skip[rel->r_offset >> 3]
425b145b 9348 |= can_optimize | ((rel - toc_relocs) << 2);
ba761f19 9349 }
ba761f19
AM
9350 }
9351
c5614fa4
AM
9352 if (skip == NULL)
9353 continue;
9354
9355 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
9356 if (used == NULL)
9357 {
9358 error_ret:
9359 if (local_syms != NULL
9360 && symtab_hdr->contents != (unsigned char *) local_syms)
9361 free (local_syms);
9362 if (sec != NULL
9363 && relstart != NULL
9364 && elf_section_data (sec)->relocs != relstart)
9365 free (relstart);
425b145b
AM
9366 if (toc_relocs != NULL
9367 && elf_section_data (toc)->relocs != toc_relocs)
9368 free (toc_relocs);
c5614fa4
AM
9369 if (skip != NULL)
9370 free (skip);
9371 return FALSE;
9372 }
9373
30038c59
AM
9374 /* Now check all kept sections that might reference the toc.
9375 Check the toc itself last. */
9376 for (sec = (ibfd->sections == toc && toc->next ? toc->next
9377 : ibfd->sections);
c5614fa4 9378 sec != NULL;
c5614fa4 9379 sec = (sec == toc ? NULL
c5614fa4 9380 : sec->next == NULL ? toc
30038c59 9381 : sec->next == toc && toc->next ? toc->next
c5614fa4
AM
9382 : sec->next))
9383 {
9384 int repeat;
9385
9386 if (sec->reloc_count == 0
dbaa2011 9387 || discarded_section (sec)
c5614fa4
AM
9388 || get_opd_info (sec)
9389 || (sec->flags & SEC_ALLOC) == 0
9390 || (sec->flags & SEC_DEBUGGING) != 0)
9391 continue;
9392
854b41e7
AM
9393 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9394 info->keep_memory);
c5614fa4 9395 if (relstart == NULL)
2915c55b
JK
9396 {
9397 free (used);
9398 goto error_ret;
9399 }
c5614fa4
AM
9400
9401 /* Mark toc entries referenced as used. */
c5614fa4 9402 do
d4f1ee75
AM
9403 {
9404 repeat = 0;
9405 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9406 {
9407 enum elf_ppc64_reloc_type r_type;
9408 unsigned long r_symndx;
9409 asection *sym_sec;
9410 struct elf_link_hash_entry *h;
9411 Elf_Internal_Sym *sym;
9412 bfd_vma val;
9413 enum {no_check, check_lo, check_ha} insn_check;
98528052 9414
d4f1ee75
AM
9415 r_type = ELF64_R_TYPE (rel->r_info);
9416 switch (r_type)
9417 {
9418 default:
9419 insn_check = no_check;
9420 break;
98528052 9421
d4f1ee75
AM
9422 case R_PPC64_GOT_TLSLD16_HA:
9423 case R_PPC64_GOT_TLSGD16_HA:
9424 case R_PPC64_GOT_TPREL16_HA:
9425 case R_PPC64_GOT_DTPREL16_HA:
9426 case R_PPC64_GOT16_HA:
9427 case R_PPC64_TOC16_HA:
9428 insn_check = check_ha;
9429 break;
98528052 9430
d4f1ee75
AM
9431 case R_PPC64_GOT_TLSLD16_LO:
9432 case R_PPC64_GOT_TLSGD16_LO:
9433 case R_PPC64_GOT_TPREL16_LO_DS:
9434 case R_PPC64_GOT_DTPREL16_LO_DS:
9435 case R_PPC64_GOT16_LO:
9436 case R_PPC64_GOT16_LO_DS:
9437 case R_PPC64_TOC16_LO:
9438 case R_PPC64_TOC16_LO_DS:
9439 insn_check = check_lo;
9440 break;
9441 }
560c8763 9442
d4f1ee75
AM
9443 if (insn_check != no_check)
9444 {
9445 bfd_vma off = rel->r_offset & ~3;
9446 unsigned char buf[4];
9447 unsigned int insn;
c5614fa4 9448
d4f1ee75
AM
9449 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9450 {
9451 free (used);
9452 goto error_ret;
9453 }
9454 insn = bfd_get_32 (ibfd, buf);
9455 if (insn_check == check_lo
39eeab25 9456 ? !ok_lo_toc_insn (insn, r_type)
d4f1ee75
AM
9457 : ((insn & ((0x3f << 26) | 0x1f << 16))
9458 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9459 {
9460 char str[12];
9461
9462 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9463 sprintf (str, "%#08x", insn);
9464 info->callbacks->einfo
695344c0 9465 /* xgettext:c-format */
174d0a74 9466 (_("%H: toc optimization is not supported for"
cf97bcb0 9467 " %s instruction\n"),
d4f1ee75
AM
9468 ibfd, sec, rel->r_offset & ~3, str);
9469 }
9470 }
c5614fa4 9471
d4f1ee75
AM
9472 switch (r_type)
9473 {
9474 case R_PPC64_TOC16:
9475 case R_PPC64_TOC16_LO:
9476 case R_PPC64_TOC16_HI:
9477 case R_PPC64_TOC16_HA:
9478 case R_PPC64_TOC16_DS:
9479 case R_PPC64_TOC16_LO_DS:
9480 /* In case we're taking addresses of toc entries. */
9481 case R_PPC64_ADDR64:
9482 break;
c5614fa4 9483
d4f1ee75
AM
9484 default:
9485 continue;
9486 }
c5614fa4 9487
d4f1ee75
AM
9488 r_symndx = ELF64_R_SYM (rel->r_info);
9489 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9490 r_symndx, ibfd))
9491 {
9492 free (used);
9493 goto error_ret;
9494 }
c5614fa4 9495
d4f1ee75
AM
9496 if (sym_sec != toc)
9497 continue;
c5614fa4 9498
d4f1ee75
AM
9499 if (h != NULL)
9500 val = h->root.u.def.value;
9501 else
9502 val = sym->st_value;
9503 val += rel->r_addend;
ba761f19 9504
d4f1ee75
AM
9505 if (val >= toc->size)
9506 continue;
ba761f19 9507
d4f1ee75
AM
9508 if ((skip[val >> 3] & can_optimize) != 0)
9509 {
9510 bfd_vma off;
9511 unsigned char opc;
9512
9513 switch (r_type)
9514 {
9515 case R_PPC64_TOC16_HA:
ba761f19 9516 break;
ba761f19 9517
d4f1ee75
AM
9518 case R_PPC64_TOC16_LO_DS:
9519 off = rel->r_offset;
9520 off += (bfd_big_endian (ibfd) ? -2 : 3);
9521 if (!bfd_get_section_contents (ibfd, sec, &opc,
9522 off, 1))
9523 {
9524 free (used);
9525 goto error_ret;
9526 }
9527 if ((opc & (0x3f << 2)) == (58u << 2))
9528 break;
1a0670f3 9529 /* Fall through. */
ba761f19 9530
d4f1ee75
AM
9531 default:
9532 /* Wrong sort of reloc, or not a ld. We may
9533 as well clear ref_from_discarded too. */
9534 skip[val >> 3] = 0;
9535 }
9536 }
9537
9538 if (sec != toc)
9539 used[val >> 3] = 1;
9540 /* For the toc section, we only mark as used if this
9541 entry itself isn't unused. */
9542 else if ((used[rel->r_offset >> 3]
9543 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
9544 && !used[val >> 3])
9545 {
9546 /* Do all the relocs again, to catch reference
9547 chains. */
9548 repeat = 1;
9549 used[val >> 3] = 1;
9550 }
9551 }
9552 }
c5614fa4 9553 while (repeat);
854b41e7
AM
9554
9555 if (elf_section_data (sec)->relocs != relstart)
9556 free (relstart);
c5614fa4
AM
9557 }
9558
9559 /* Merge the used and skip arrays. Assume that TOC
9560 doublewords not appearing as either used or unused belong
de194d85 9561 to an entry more than one doubleword in size. */
c5614fa4
AM
9562 for (drop = skip, keep = used, last = 0, some_unused = 0;
9563 drop < skip + (toc->size + 7) / 8;
9564 ++drop, ++keep)
9565 {
9566 if (*keep)
9567 {
ba761f19
AM
9568 *drop &= ~ref_from_discarded;
9569 if ((*drop & can_optimize) != 0)
9570 some_unused = 1;
c5614fa4
AM
9571 last = 0;
9572 }
b140b010 9573 else if ((*drop & ref_from_discarded) != 0)
c5614fa4
AM
9574 {
9575 some_unused = 1;
ba761f19 9576 last = ref_from_discarded;
c5614fa4
AM
9577 }
9578 else
9579 *drop = last;
9580 }
9581
9582 free (used);
9583
9584 if (some_unused)
9585 {
9586 bfd_byte *contents, *src;
9587 unsigned long off;
d62b3684 9588 Elf_Internal_Sym *sym;
ba761f19 9589 bfd_boolean local_toc_syms = FALSE;
c5614fa4
AM
9590
9591 /* Shuffle the toc contents, and at the same time convert the
9592 skip array from booleans into offsets. */
9593 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
9594 goto error_ret;
9595
9596 elf_section_data (toc)->this_hdr.contents = contents;
9597
9598 for (src = contents, off = 0, drop = skip;
9599 src < contents + toc->size;
9600 src += 8, ++drop)
9601 {
ba761f19
AM
9602 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9603 off += 8;
c5614fa4
AM
9604 else if (off != 0)
9605 {
9606 *drop = off;
9607 memcpy (src - off, src, 8);
9608 }
9609 }
854b41e7 9610 *drop = off;
c5614fa4
AM
9611 toc->rawsize = toc->size;
9612 toc->size = src - contents - off;
9613
ba761f19
AM
9614 /* Adjust addends for relocs against the toc section sym,
9615 and optimize any accesses we can. */
c5614fa4
AM
9616 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9617 {
9618 if (sec->reloc_count == 0
dbaa2011 9619 || discarded_section (sec))
c5614fa4
AM
9620 continue;
9621
9622 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
854b41e7 9623 info->keep_memory);
c5614fa4
AM
9624 if (relstart == NULL)
9625 goto error_ret;
9626
9627 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9628 {
9629 enum elf_ppc64_reloc_type r_type;
9630 unsigned long r_symndx;
9631 asection *sym_sec;
9632 struct elf_link_hash_entry *h;
854b41e7 9633 bfd_vma val;
c5614fa4
AM
9634
9635 r_type = ELF64_R_TYPE (rel->r_info);
9636 switch (r_type)
9637 {
9638 default:
9639 continue;
9640
9641 case R_PPC64_TOC16:
9642 case R_PPC64_TOC16_LO:
9643 case R_PPC64_TOC16_HI:
9644 case R_PPC64_TOC16_HA:
9645 case R_PPC64_TOC16_DS:
9646 case R_PPC64_TOC16_LO_DS:
9647 case R_PPC64_ADDR64:
9648 break;
9649 }
9650
9651 r_symndx = ELF64_R_SYM (rel->r_info);
9652 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9653 r_symndx, ibfd))
9654 goto error_ret;
9655
ba761f19 9656 if (sym_sec != toc)
c5614fa4
AM
9657 continue;
9658
ba761f19
AM
9659 if (h != NULL)
9660 val = h->root.u.def.value;
9661 else
9662 {
9663 val = sym->st_value;
9664 if (val != 0)
9665 local_toc_syms = TRUE;
9666 }
9667
9668 val += rel->r_addend;
854b41e7
AM
9669
9670 if (val > toc->rawsize)
9671 val = toc->rawsize;
ba761f19
AM
9672 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9673 continue;
9674 else if ((skip[val >> 3] & can_optimize) != 0)
9675 {
9676 Elf_Internal_Rela *tocrel
425b145b 9677 = toc_relocs + (skip[val >> 3] >> 2);
ba761f19
AM
9678 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9679
9680 switch (r_type)
9681 {
9682 case R_PPC64_TOC16_HA:
9683 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9684 break;
9685
9686 case R_PPC64_TOC16_LO_DS:
9687 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9688 break;
9689
9690 default:
28942f62
AM
9691 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9692 ppc_howto_init ();
b140b010 9693 info->callbacks->einfo
695344c0 9694 /* xgettext:c-format */
174d0a74 9695 (_("%H: %s references "
b140b010
AM
9696 "optimized away TOC entry\n"),
9697 ibfd, sec, rel->r_offset,
9698 ppc64_elf_howto_table[r_type]->name);
9699 bfd_set_error (bfd_error_bad_value);
9700 goto error_ret;
ba761f19
AM
9701 }
9702 rel->r_addend = tocrel->r_addend;
9703 elf_section_data (sec)->relocs = relstart;
9704 continue;
9705 }
9706
9707 if (h != NULL || sym->st_value != 0)
9708 continue;
854b41e7
AM
9709
9710 rel->r_addend -= skip[val >> 3];
9711 elf_section_data (sec)->relocs = relstart;
c5614fa4 9712 }
854b41e7
AM
9713
9714 if (elf_section_data (sec)->relocs != relstart)
9715 free (relstart);
c5614fa4
AM
9716 }
9717
9718 /* We shouldn't have local or global symbols defined in the TOC,
9719 but handle them anyway. */
df22d223
AM
9720 if (local_syms != NULL)
9721 for (sym = local_syms;
9722 sym < local_syms + symtab_hdr->sh_info;
9723 ++sym)
9724 if (sym->st_value != 0
9725 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9726 {
9727 unsigned long i;
854b41e7 9728
df22d223
AM
9729 if (sym->st_value > toc->rawsize)
9730 i = toc->rawsize >> 3;
9731 else
9732 i = sym->st_value >> 3;
854b41e7 9733
df22d223
AM
9734 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9735 {
9736 if (local_toc_syms)
4eca0228 9737 _bfd_error_handler
df22d223
AM
9738 (_("%s defined on removed toc entry"),
9739 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9740 do
9741 ++i;
9742 while ((skip[i] & (ref_from_discarded | can_optimize)));
9743 sym->st_value = (bfd_vma) i << 3;
9744 }
d62b3684 9745
df22d223
AM
9746 sym->st_value -= skip[i];
9747 symtab_hdr->contents = (unsigned char *) local_syms;
9748 }
c5614fa4 9749
854b41e7 9750 /* Adjust any global syms defined in this toc input section. */
c5614fa4
AM
9751 if (toc_inf.global_toc_syms)
9752 {
9753 toc_inf.toc = toc;
9754 toc_inf.skip = skip;
9755 toc_inf.global_toc_syms = FALSE;
9756 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9757 &toc_inf);
9758 }
854b41e7
AM
9759
9760 if (toc->reloc_count != 0)
9761 {
d4730f92 9762 Elf_Internal_Shdr *rel_hdr;
854b41e7
AM
9763 Elf_Internal_Rela *wrel;
9764 bfd_size_type sz;
9765
854b41e7 9766 /* Remove unused toc relocs, and adjust those we keep. */
28be611c
AM
9767 if (toc_relocs == NULL)
9768 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9769 info->keep_memory);
9770 if (toc_relocs == NULL)
9771 goto error_ret;
9772
425b145b
AM
9773 wrel = toc_relocs;
9774 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9775 if ((skip[rel->r_offset >> 3]
9776 & (ref_from_discarded | can_optimize)) == 0)
854b41e7
AM
9777 {
9778 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9779 wrel->r_info = rel->r_info;
9780 wrel->r_addend = rel->r_addend;
9781 ++wrel;
9782 }
9783 else if (!dec_dynrel_count (rel->r_info, toc, info,
9784 &local_syms, NULL, NULL))
9785 goto error_ret;
9786
425b145b
AM
9787 elf_section_data (toc)->relocs = toc_relocs;
9788 toc->reloc_count = wrel - toc_relocs;
d4730f92
BS
9789 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9790 sz = rel_hdr->sh_entsize;
9791 rel_hdr->sh_size = toc->reloc_count * sz;
854b41e7 9792 }
c5614fa4 9793 }
28be611c
AM
9794 else if (toc_relocs != NULL
9795 && elf_section_data (toc)->relocs != toc_relocs)
425b145b 9796 free (toc_relocs);
c5614fa4
AM
9797
9798 if (local_syms != NULL
9799 && symtab_hdr->contents != (unsigned char *) local_syms)
9800 {
9801 if (!info->keep_memory)
9802 free (local_syms);
9803 else
9804 symtab_hdr->contents = (unsigned char *) local_syms;
9805 }
9806 free (skip);
9807 }
9808
9809 return TRUE;
9810}
9811
1bbe0902
AM
9812/* Return true iff input section I references the TOC using
9813 instructions limited to +/-32k offsets. */
9814
9815bfd_boolean
9816ppc64_elf_has_small_toc_reloc (asection *i)
9817{
9818 return (is_ppc64_elf (i->owner)
9819 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9820}
9821
927be08e
AM
9822/* Allocate space for one GOT entry. */
9823
9824static void
9825allocate_got (struct elf_link_hash_entry *h,
9826 struct bfd_link_info *info,
9827 struct got_entry *gent)
9828{
9829 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
9830 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9831 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9832 ? 16 : 8);
9833 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9834 ? 2 : 1) * sizeof (Elf64_External_Rela);
9835 asection *got = ppc64_elf_tdata (gent->owner)->got;
9836
9837 gent->got.offset = got->size;
9838 got->size += entsize;
9839
19e08130 9840 if (h->type == STT_GNU_IFUNC)
927be08e 9841 {
33e44f2e 9842 htab->elf.irelplt->size += rentsize;
19e08130 9843 htab->got_reli_size += rentsize;
927be08e 9844 }
f15d0b54
AM
9845 else if (((bfd_link_pic (info)
9846 && !((gent->tls_type & TLS_TPREL) != 0
9847 && bfd_link_executable (info)
9848 && SYMBOL_REFERENCES_LOCAL (info, h)))
f0158f44
AM
9849 || (htab->elf.dynamic_sections_created
9850 && h->dynindx != -1
9851 && !SYMBOL_REFERENCES_LOCAL (info, h)))
21d68fcd 9852 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
927be08e 9853 {
19e08130 9854 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
927be08e 9855 relgot->size += rentsize;
927be08e
AM
9856 }
9857}
9858
7865406b
AM
9859/* This function merges got entries in the same toc group. */
9860
9861static void
9862merge_got_entries (struct got_entry **pent)
9863{
9864 struct got_entry *ent, *ent2;
9865
9866 for (ent = *pent; ent != NULL; ent = ent->next)
9867 if (!ent->is_indirect)
9868 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9869 if (!ent2->is_indirect
9870 && ent2->addend == ent->addend
9871 && ent2->tls_type == ent->tls_type
9872 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9873 {
9874 ent2->is_indirect = TRUE;
9875 ent2->got.ent = ent;
9876 }
9877}
9878
46434633 9879/* If H is undefined, make it dynamic if that makes sense. */
f0158f44
AM
9880
9881static bfd_boolean
46434633
AM
9882ensure_undef_dynamic (struct bfd_link_info *info,
9883 struct elf_link_hash_entry *h)
f0158f44
AM
9884{
9885 struct elf_link_hash_table *htab = elf_hash_table (info);
9886
9887 if (htab->dynamic_sections_created
46434633
AM
9888 && ((info->dynamic_undefined_weak != 0
9889 && h->root.type == bfd_link_hash_undefweak)
9890 || h->root.type == bfd_link_hash_undefined)
f0158f44
AM
9891 && h->dynindx == -1
9892 && !h->forced_local
9893 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9894 return bfd_elf_link_record_dynamic_symbol (info, h);
9895 return TRUE;
9896}
9897
65f38f15
AM
9898/* Allocate space in .plt, .got and associated reloc sections for
9899 dynamic relocs. */
5bd4f169 9900
b34976b6 9901static bfd_boolean
4ce794b7 9902allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 9903{
65f38f15
AM
9904 struct bfd_link_info *info;
9905 struct ppc_link_hash_table *htab;
5bd4f169 9906 asection *s;
65f38f15 9907 struct ppc_link_hash_entry *eh;
0b8bcf0d 9908 struct got_entry **pgent, *gent;
5bd4f169 9909
e92d460e 9910 if (h->root.type == bfd_link_hash_indirect)
b34976b6 9911 return TRUE;
5bd4f169 9912
65f38f15
AM
9913 info = (struct bfd_link_info *) inf;
9914 htab = ppc_hash_table (info);
4dfe6ac6
NC
9915 if (htab == NULL)
9916 return FALSE;
5bd4f169 9917
951fd09b
AM
9918 eh = (struct ppc_link_hash_entry *) h;
9919 /* Run through the TLS GD got entries first if we're changing them
9920 to TPREL. */
37da22e5 9921 if ((eh->tls_mask & (TLS_TLS | TLS_TPRELGD)) == (TLS_TLS | TLS_TPRELGD))
951fd09b
AM
9922 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9923 if (gent->got.refcount > 0
9924 && (gent->tls_type & TLS_GD) != 0)
9925 {
9926 /* This was a GD entry that has been converted to TPREL. If
9927 there happens to be a TPREL entry we can use that one. */
9928 struct got_entry *ent;
9929 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9930 if (ent->got.refcount > 0
9931 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
9932 && ent->addend == gent->addend
9933 && ent->owner == gent->owner)
951fd09b
AM
9934 {
9935 gent->got.refcount = 0;
9936 break;
9937 }
9938
9939 /* If not, then we'll be using our own TPREL entry. */
9940 if (gent->got.refcount != 0)
9941 gent->tls_type = TLS_TLS | TLS_TPREL;
9942 }
9943
7865406b
AM
9944 /* Remove any list entry that won't generate a word in the GOT before
9945 we call merge_got_entries. Otherwise we risk merging to empty
9946 entries. */
0b8bcf0d
AM
9947 pgent = &h->got.glist;
9948 while ((gent = *pgent) != NULL)
411e1bfb 9949 if (gent->got.refcount > 0)
7865406b
AM
9950 {
9951 if ((gent->tls_type & TLS_LD) != 0
9952 && !h->def_dynamic)
9953 {
9954 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9955 *pgent = gent->next;
9956 }
9957 else
9958 pgent = &gent->next;
9959 }
9960 else
9961 *pgent = gent->next;
9962
9963 if (!htab->do_multi_toc)
9964 merge_got_entries (&h->got.glist);
9965
9966 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9967 if (!gent->is_indirect)
411e1bfb 9968 {
46434633
AM
9969 /* Make sure this symbol is output as a dynamic symbol. */
9970 if (!ensure_undef_dynamic (info, h))
f0158f44 9971 return FALSE;
65f38f15 9972
0c8d6e5c 9973 if (!is_ppc64_elf (gent->owner))
927be08e 9974 abort ();
0ffa91dd 9975
927be08e 9976 allocate_got (h, info, gent);
411e1bfb 9977 }
65f38f15 9978
954b63d4
AM
9979 /* If no dynamic sections we can't have dynamic relocs, except for
9980 IFUNCs which are handled even in static executables. */
8a2058b5
AM
9981 if (!htab->elf.dynamic_sections_created
9982 && h->type != STT_GNU_IFUNC)
9983 eh->dyn_relocs = NULL;
9984
529fe20e
AM
9985 /* Discard relocs on undefined symbols that must be local. */
9986 else if (h->root.type == bfd_link_hash_undefined
9987 && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9988 eh->dyn_relocs = NULL;
9989
954b63d4
AM
9990 /* Also discard relocs on undefined weak syms with non-default
9991 visibility, or when dynamic_undefined_weak says so. */
21d68fcd 9992 else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
954b63d4
AM
9993 eh->dyn_relocs = NULL;
9994
8a2058b5 9995 if (eh->dyn_relocs != NULL)
65f38f15 9996 {
8a2058b5
AM
9997 struct elf_dyn_relocs *p, **pp;
9998
57e7d118
AM
9999 /* In the shared -Bsymbolic case, discard space allocated for
10000 dynamic pc-relative relocs against symbols which turn out to
10001 be defined in regular objects. For the normal shared case,
10002 discard space for relocs that have become local due to symbol
10003 visibility changes. */
10004
10005 if (bfd_link_pic (info))
65f38f15 10006 {
57e7d118
AM
10007 /* Relocs that use pc_count are those that appear on a call
10008 insn, or certain REL relocs (see must_be_dyn_reloc) that
10009 can be generated via assembly. We want calls to
10010 protected symbols to resolve directly to the function
10011 rather than going via the plt. If people want function
10012 pointer comparisons to work as expected then they should
10013 avoid writing weird assembly. */
10014 if (SYMBOL_CALLS_LOCAL (info, h))
10015 {
57e7d118
AM
10016 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
10017 {
10018 p->count -= p->pc_count;
10019 p->pc_count = 0;
10020 if (p->count == 0)
10021 *pp = p->next;
10022 else
10023 pp = &p->next;
10024 }
10025 }
65f38f15 10026
954b63d4 10027 if (eh->dyn_relocs != NULL)
5bd4f169 10028 {
46434633
AM
10029 /* Make sure this symbol is output as a dynamic symbol. */
10030 if (!ensure_undef_dynamic (info, h))
f0158f44 10031 return FALSE;
5bd4f169 10032 }
65f38f15 10033 }
529fe20e 10034 else if (ELIMINATE_COPY_RELOCS && h->type != STT_GNU_IFUNC)
57e7d118 10035 {
8a2058b5 10036 /* For the non-pic case, discard space for relocs against
57e7d118
AM
10037 symbols which turn out to need copy relocs or are not
10038 dynamic. */
529fe20e
AM
10039 if (h->dynamic_adjusted
10040 && !h->def_regular
10041 && !ELF_COMMON_DEF_P (h))
f0158f44 10042 {
46434633
AM
10043 /* Make sure this symbol is output as a dynamic symbol. */
10044 if (!ensure_undef_dynamic (info, h))
f0158f44 10045 return FALSE;
dfbb6ac9 10046
f0158f44
AM
10047 if (h->dynindx == -1)
10048 eh->dyn_relocs = NULL;
10049 }
10050 else
8a2058b5 10051 eh->dyn_relocs = NULL;
57e7d118
AM
10052 }
10053
10054 /* Finally, allocate space. */
10055 for (p = eh->dyn_relocs; p != NULL; p = p->next)
10056 {
10057 asection *sreloc = elf_section_data (p->sec)->sreloc;
10058 if (eh->elf.type == STT_GNU_IFUNC)
10059 sreloc = htab->elf.irelplt;
10060 sreloc->size += p->count * sizeof (Elf64_External_Rela);
dfbb6ac9 10061 }
65f38f15 10062 }
57e7d118 10063
2d7ad24e
AM
10064 /* We might need a PLT entry when the symbol
10065 a) is dynamic, or
10066 b) is an ifunc, or
10067 c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
10068 d) has plt16 relocs and we are linking statically. */
10069 if ((htab->elf.dynamic_sections_created && h->dynindx != -1)
10070 || h->type == STT_GNU_IFUNC
10071 || (h->needs_plt && h->dynamic_adjusted)
10072 || (h->needs_plt
10073 && h->def_regular
10074 && !htab->elf.dynamic_sections_created
3e04d765 10075 && !htab->can_convert_all_inline_plt
2d7ad24e
AM
10076 && (((struct ppc_link_hash_entry *) h)->tls_mask
10077 & (TLS_TLS | PLT_KEEP)) == PLT_KEEP))
65f38f15 10078 {
57e7d118
AM
10079 struct plt_entry *pent;
10080 bfd_boolean doneone = FALSE;
10081 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
10082 if (pent->plt.refcount > 0)
10083 {
10084 if (!htab->elf.dynamic_sections_created
10085 || h->dynindx == -1)
10086 {
2d7ad24e
AM
10087 if (h->type == STT_GNU_IFUNC)
10088 {
10089 s = htab->elf.iplt;
10090 pent->plt.offset = s->size;
10091 s->size += PLT_ENTRY_SIZE (htab);
10092 s = htab->elf.irelplt;
10093 }
10094 else
10095 {
10096 s = htab->pltlocal;
10097 pent->plt.offset = s->size;
10098 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
10099 s = bfd_link_pic (info) ? htab->relpltlocal : NULL;
10100 }
57e7d118
AM
10101 }
10102 else
10103 {
10104 /* If this is the first .plt entry, make room for the special
10105 first entry. */
10106 s = htab->elf.splt;
10107 if (s->size == 0)
10108 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
65f38f15 10109
57e7d118 10110 pent->plt.offset = s->size;
65f38f15 10111
57e7d118
AM
10112 /* Make room for this entry. */
10113 s->size += PLT_ENTRY_SIZE (htab);
65f38f15 10114
57e7d118
AM
10115 /* Make room for the .glink code. */
10116 s = htab->glink;
10117 if (s->size == 0)
9e390558 10118 s->size += GLINK_PLTRESOLVE_SIZE (htab);
57e7d118
AM
10119 if (htab->opd_abi)
10120 {
10121 /* We need bigger stubs past index 32767. */
9e390558 10122 if (s->size >= GLINK_PLTRESOLVE_SIZE (htab) + 32768*2*4)
57e7d118
AM
10123 s->size += 4;
10124 s->size += 2*4;
10125 }
10126 else
10127 s->size += 4;
65f38f15 10128
57e7d118
AM
10129 /* We also need to make an entry in the .rela.plt section. */
10130 s = htab->elf.srelplt;
10131 }
2d7ad24e
AM
10132 if (s != NULL)
10133 s->size += sizeof (Elf64_External_Rela);
57e7d118
AM
10134 doneone = TRUE;
10135 }
10136 else
10137 pent->plt.offset = (bfd_vma) -1;
10138 if (!doneone)
10139 {
10140 h->plt.plist = NULL;
10141 h->needs_plt = 0;
10142 }
65f38f15 10143 }
57e7d118 10144 else
65f38f15 10145 {
57e7d118
AM
10146 h->plt.plist = NULL;
10147 h->needs_plt = 0;
65f38f15
AM
10148 }
10149
b34976b6 10150 return TRUE;
65f38f15
AM
10151}
10152
9e390558
AM
10153#define PPC_LO(v) ((v) & 0xffff)
10154#define PPC_HI(v) (((v) >> 16) & 0xffff)
10155#define PPC_HA(v) PPC_HI ((v) + 0x8000)
10156
a345bc8d
AM
10157/* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
10158 to set up space for global entry stubs. These are put in glink,
10159 after the branch table. */
65f38f15 10160
b34976b6 10161static bfd_boolean
a345bc8d 10162size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
65f38f15 10163{
a345bc8d
AM
10164 struct bfd_link_info *info;
10165 struct ppc_link_hash_table *htab;
10166 struct plt_entry *pent;
9e390558 10167 asection *s, *plt;
65f38f15 10168
a345bc8d
AM
10169 if (h->root.type == bfd_link_hash_indirect)
10170 return TRUE;
65f38f15 10171
a345bc8d
AM
10172 if (!h->pointer_equality_needed)
10173 return TRUE;
65f38f15 10174
a345bc8d
AM
10175 if (h->def_regular)
10176 return TRUE;
65f38f15 10177
a345bc8d
AM
10178 info = inf;
10179 htab = ppc_hash_table (info);
10180 if (htab == NULL)
10181 return FALSE;
10182
9e390558
AM
10183 s = htab->global_entry;
10184 plt = htab->elf.splt;
a345bc8d
AM
10185 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
10186 if (pent->plt.offset != (bfd_vma) -1
10187 && pent->addend == 0)
10188 {
afe397ea
AM
10189 /* For ELFv2, if this symbol is not defined in a regular file
10190 and we are not generating a shared library or pie, then we
10191 need to define the symbol in the executable on a call stub.
10192 This is to avoid text relocations. */
9e390558
AM
10193 bfd_vma off, stub_align, stub_off, stub_size;
10194 unsigned int align_power;
10195
10196 stub_size = 16;
10197 stub_off = s->size;
10198 if (htab->params->plt_stub_align >= 0)
10199 align_power = htab->params->plt_stub_align;
10200 else
10201 align_power = -htab->params->plt_stub_align;
10202 /* Setting section alignment is delayed until we know it is
10203 non-empty. Otherwise the .text output section will be
10204 aligned at least to plt_stub_align even when no global
10205 entry stubs are needed. */
10206 if (s->alignment_power < align_power)
10207 s->alignment_power = align_power;
10208 stub_align = (bfd_vma) 1 << align_power;
10209 if (htab->params->plt_stub_align >= 0
10210 || ((((stub_off + stub_size - 1) & -stub_align)
10211 - (stub_off & -stub_align))
10212 > ((stub_size - 1) & -stub_align)))
10213 stub_off = (stub_off + stub_align - 1) & -stub_align;
10214 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
10215 off -= stub_off + s->output_offset + s->output_section->vma;
10216 /* Note that for --plt-stub-align negative we have a possible
10217 dependency between stub offset and size. Break that
10218 dependency by assuming the max stub size when calculating
10219 the stub offset. */
10220 if (PPC_HA (off) == 0)
10221 stub_size -= 4;
8a2058b5 10222 h->root.type = bfd_link_hash_defined;
afe397ea 10223 h->root.u.def.section = s;
9e390558
AM
10224 h->root.u.def.value = stub_off;
10225 s->size = stub_off + stub_size;
a345bc8d
AM
10226 break;
10227 }
10228 return TRUE;
10229}
10230
10231/* Set DF_TEXTREL if we find any dynamic relocs that apply to
10232 read-only sections. */
10233
10234static bfd_boolean
98bbb1b8 10235maybe_set_textrel (struct elf_link_hash_entry *h, void *inf)
a345bc8d 10236{
98bbb1b8
AM
10237 asection *sec;
10238
a345bc8d
AM
10239 if (h->root.type == bfd_link_hash_indirect)
10240 return TRUE;
10241
98bbb1b8
AM
10242 sec = readonly_dynrelocs (h);
10243 if (sec != NULL)
a345bc8d 10244 {
98bbb1b8
AM
10245 struct bfd_link_info *info = (struct bfd_link_info *) inf;
10246
10247 info->flags |= DF_TEXTREL;
10248 info->callbacks->minfo
c1c8c1ef 10249 (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
63c1f59d 10250 sec->owner, h->root.root.string, sec);
a345bc8d
AM
10251
10252 /* Not an error, just cut short the traversal. */
10253 return FALSE;
65f38f15 10254 }
b34976b6 10255 return TRUE;
65f38f15
AM
10256}
10257
10258/* Set the sizes of the dynamic sections. */
10259
b34976b6 10260static bfd_boolean
ee67d69a 10261ppc64_elf_size_dynamic_sections (bfd *output_bfd,
4ce794b7 10262 struct bfd_link_info *info)
65f38f15
AM
10263{
10264 struct ppc_link_hash_table *htab;
10265 bfd *dynobj;
10266 asection *s;
b34976b6 10267 bfd_boolean relocs;
65f38f15 10268 bfd *ibfd;
7865406b 10269 struct got_entry *first_tlsld;
65f38f15
AM
10270
10271 htab = ppc_hash_table (info);
4dfe6ac6
NC
10272 if (htab == NULL)
10273 return FALSE;
10274
65f38f15
AM
10275 dynobj = htab->elf.dynobj;
10276 if (dynobj == NULL)
10277 abort ();
10278
10279 if (htab->elf.dynamic_sections_created)
10280 {
10281 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 10282 if (bfd_link_executable (info) && !info->nointerp)
65f38f15 10283 {
3d4d4302 10284 s = bfd_get_linker_section (dynobj, ".interp");
65f38f15
AM
10285 if (s == NULL)
10286 abort ();
eea6121a 10287 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
10288 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
10289 }
10290 }
10291
10292 /* Set up .got offsets for local syms, and space for local dynamic
10293 relocs. */
c72f2fb2 10294 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
65f38f15 10295 {
411e1bfb
AM
10296 struct got_entry **lgot_ents;
10297 struct got_entry **end_lgot_ents;
e054468f
AM
10298 struct plt_entry **local_plt;
10299 struct plt_entry **end_local_plt;
f961d9dd 10300 unsigned char *lgot_masks;
65f38f15
AM
10301 bfd_size_type locsymcount;
10302 Elf_Internal_Shdr *symtab_hdr;
65f38f15 10303
0c8d6e5c 10304 if (!is_ppc64_elf (ibfd))
65f38f15
AM
10305 continue;
10306
10307 for (s = ibfd->sections; s != NULL; s = s->next)
10308 {
19e08130 10309 struct ppc_dyn_relocs *p;
65f38f15 10310
6edfbbad 10311 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
65f38f15 10312 {
ec338859
AM
10313 if (!bfd_is_abs_section (p->sec)
10314 && bfd_is_abs_section (p->sec->output_section))
10315 {
10316 /* Input section has been discarded, either because
10317 it is a copy of a linkonce section or due to
10318 linker script /DISCARD/, so we'll be discarding
10319 the relocs too. */
10320 }
248866a8 10321 else if (p->count != 0)
ec338859 10322 {
19e08130
AM
10323 asection *srel = elf_section_data (p->sec)->sreloc;
10324 if (p->ifunc)
33e44f2e 10325 srel = htab->elf.irelplt;
eea6121a 10326 srel->size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
10327 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
10328 info->flags |= DF_TEXTREL;
ec338859 10329 }
65f38f15
AM
10330 }
10331 }
10332
411e1bfb
AM
10333 lgot_ents = elf_local_got_ents (ibfd);
10334 if (!lgot_ents)
65f38f15
AM
10335 continue;
10336
0ffa91dd 10337 symtab_hdr = &elf_symtab_hdr (ibfd);
65f38f15 10338 locsymcount = symtab_hdr->sh_info;
411e1bfb 10339 end_lgot_ents = lgot_ents + locsymcount;
e054468f
AM
10340 local_plt = (struct plt_entry **) end_lgot_ents;
10341 end_local_plt = local_plt + locsymcount;
f961d9dd 10342 lgot_masks = (unsigned char *) end_local_plt;
e717da7e 10343 s = ppc64_elf_tdata (ibfd)->got;
e7b938ca 10344 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
65f38f15 10345 {
0b8bcf0d 10346 struct got_entry **pent, *ent;
411e1bfb 10347
0b8bcf0d
AM
10348 pent = lgot_ents;
10349 while ((ent = *pent) != NULL)
411e1bfb
AM
10350 if (ent->got.refcount > 0)
10351 {
e7b938ca 10352 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 10353 {
927be08e 10354 ppc64_tlsld_got (ibfd)->got.refcount += 1;
0b8bcf0d 10355 *pent = ent->next;
411e1bfb
AM
10356 }
10357 else
10358 {
19e08130
AM
10359 unsigned int ent_size = 8;
10360 unsigned int rel_size = sizeof (Elf64_External_Rela);
10361
eea6121a 10362 ent->got.offset = s->size;
e7b938ca 10363 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
927be08e 10364 {
19e08130
AM
10365 ent_size *= 2;
10366 rel_size *= 2;
10367 }
10368 s->size += ent_size;
37da22e5 10369 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 10370 {
33e44f2e 10371 htab->elf.irelplt->size += rel_size;
19e08130
AM
10372 htab->got_reli_size += rel_size;
10373 }
f15d0b54
AM
10374 else if (bfd_link_pic (info)
10375 && !((ent->tls_type & TLS_TPREL) != 0
10376 && bfd_link_executable (info)))
19e08130
AM
10377 {
10378 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10379 srel->size += rel_size;
927be08e 10380 }
0b8bcf0d 10381 pent = &ent->next;
411e1bfb
AM
10382 }
10383 }
10384 else
0b8bcf0d 10385 *pent = ent->next;
65f38f15 10386 }
e054468f 10387
2d7ad24e
AM
10388 /* Allocate space for plt calls to local syms. */
10389 lgot_masks = (unsigned char *) end_local_plt;
10390 for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks)
e054468f
AM
10391 {
10392 struct plt_entry *ent;
10393
10394 for (ent = *local_plt; ent != NULL; ent = ent->next)
10395 if (ent->plt.refcount > 0)
10396 {
2d7ad24e
AM
10397 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
10398 {
10399 s = htab->elf.iplt;
10400 ent->plt.offset = s->size;
10401 s->size += PLT_ENTRY_SIZE (htab);
10402 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
10403 }
3e04d765
AM
10404 else if (htab->can_convert_all_inline_plt
10405 || (*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)
2d7ad24e
AM
10406 ent->plt.offset = (bfd_vma) -1;
10407 else
10408 {
10409 s = htab->pltlocal;
10410 ent->plt.offset = s->size;
10411 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
10412 if (bfd_link_pic (info))
10413 htab->relpltlocal->size += sizeof (Elf64_External_Rela);
10414 }
e054468f
AM
10415 }
10416 else
10417 ent->plt.offset = (bfd_vma) -1;
10418 }
65f38f15
AM
10419 }
10420
10421 /* Allocate global sym .plt and .got entries, and space for global
10422 sym dynamic relocs. */
4ce794b7 10423 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
a345bc8d 10424
0e1862bb 10425 if (!htab->opd_abi && !bfd_link_pic (info))
a345bc8d 10426 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
65f38f15 10427
7865406b 10428 first_tlsld = NULL;
c72f2fb2 10429 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
102890f0 10430 {
7865406b
AM
10431 struct got_entry *ent;
10432
0c8d6e5c 10433 if (!is_ppc64_elf (ibfd))
102890f0
AM
10434 continue;
10435
7865406b
AM
10436 ent = ppc64_tlsld_got (ibfd);
10437 if (ent->got.refcount > 0)
102890f0 10438 {
7865406b 10439 if (!htab->do_multi_toc && first_tlsld != NULL)
102890f0 10440 {
7865406b
AM
10441 ent->is_indirect = TRUE;
10442 ent->got.ent = first_tlsld;
10443 }
10444 else
10445 {
10446 if (first_tlsld == NULL)
10447 first_tlsld = ent;
10448 s = ppc64_elf_tdata (ibfd)->got;
10449 ent->got.offset = s->size;
10450 ent->owner = ibfd;
10451 s->size += 16;
0e1862bb 10452 if (bfd_link_pic (info))
7865406b
AM
10453 {
10454 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10455 srel->size += sizeof (Elf64_External_Rela);
10456 }
102890f0
AM
10457 }
10458 }
10459 else
7865406b 10460 ent->got.offset = (bfd_vma) -1;
102890f0
AM
10461 }
10462
65f38f15
AM
10463 /* We now have determined the sizes of the various dynamic sections.
10464 Allocate memory for them. */
b34976b6 10465 relocs = FALSE;
65f38f15
AM
10466 for (s = dynobj->sections; s != NULL; s = s->next)
10467 {
10468 if ((s->flags & SEC_LINKER_CREATED) == 0)
10469 continue;
10470
4ce794b7 10471 if (s == htab->brlt || s == htab->relbrlt)
721956f4
AM
10472 /* These haven't been allocated yet; don't strip. */
10473 continue;
33e44f2e
AM
10474 else if (s == htab->elf.sgot
10475 || s == htab->elf.splt
10476 || s == htab->elf.iplt
2d7ad24e 10477 || s == htab->pltlocal
c456f082 10478 || s == htab->glink
9e390558 10479 || s == htab->global_entry
5474d94f
AM
10480 || s == htab->elf.sdynbss
10481 || s == htab->elf.sdynrelro)
65f38f15
AM
10482 {
10483 /* Strip this section if we don't need it; see the
10484 comment below. */
5bd4f169 10485 }
58d180e8
AM
10486 else if (s == htab->glink_eh_frame)
10487 {
10488 if (!bfd_is_abs_section (s->output_section))
10489 /* Not sized yet. */
10490 continue;
10491 }
70cc837d 10492 else if (CONST_STRNEQ (s->name, ".rela"))
5bd4f169 10493 {
c456f082 10494 if (s->size != 0)
5bd4f169 10495 {
33e44f2e 10496 if (s != htab->elf.srelplt)
b34976b6 10497 relocs = TRUE;
5bd4f169
AM
10498
10499 /* We use the reloc_count field as a counter if we need
10500 to copy relocs into the output file. */
10501 s->reloc_count = 0;
10502 }
10503 }
65f38f15 10504 else
5bd4f169
AM
10505 {
10506 /* It's not one of our sections, so don't allocate space. */
10507 continue;
10508 }
10509
eea6121a 10510 if (s->size == 0)
5bd4f169 10511 {
c456f082
AM
10512 /* If we don't need this section, strip it from the
10513 output file. This is mostly to handle .rela.bss and
10514 .rela.plt. We must create both sections in
10515 create_dynamic_sections, because they must be created
10516 before the linker maps input sections to output
10517 sections. The linker does that before
10518 adjust_dynamic_symbol is called, and it is that
10519 function which decides whether anything needs to go
10520 into these sections. */
8423293d 10521 s->flags |= SEC_EXCLUDE;
5bd4f169
AM
10522 continue;
10523 }
10524
06bcf541
AM
10525 if (bfd_is_abs_section (s->output_section))
10526 _bfd_error_handler (_("warning: discarding dynamic section %s"),
10527 s->name);
10528
c456f082 10529 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5f333394
AM
10530 continue;
10531
65f38f15
AM
10532 /* Allocate memory for the section contents. We use bfd_zalloc
10533 here in case unused entries are not reclaimed before the
10534 section's contents are written out. This should not happen,
411e1bfb
AM
10535 but this way if it does we get a R_PPC64_NONE reloc in .rela
10536 sections instead of garbage.
10537 We also rely on the section contents being zero when writing
5474d94f 10538 the GOT and .dynrelro. */
eea6121a 10539 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 10540 if (s->contents == NULL)
b34976b6 10541 return FALSE;
5bd4f169
AM
10542 }
10543
c72f2fb2 10544 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
e717da7e 10545 {
0c8d6e5c 10546 if (!is_ppc64_elf (ibfd))
7b53ace3
AM
10547 continue;
10548
e717da7e 10549 s = ppc64_elf_tdata (ibfd)->got;
33e44f2e 10550 if (s != NULL && s != htab->elf.sgot)
e717da7e 10551 {
eea6121a 10552 if (s->size == 0)
8423293d 10553 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10554 else
10555 {
eea6121a 10556 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10557 if (s->contents == NULL)
10558 return FALSE;
10559 }
10560 }
10561 s = ppc64_elf_tdata (ibfd)->relgot;
10562 if (s != NULL)
10563 {
eea6121a 10564 if (s->size == 0)
8423293d 10565 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10566 else
10567 {
eea6121a 10568 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
10569 if (s->contents == NULL)
10570 return FALSE;
10571 relocs = TRUE;
10572 s->reloc_count = 0;
10573 }
10574 }
10575 }
10576
e86ce104 10577 if (htab->elf.dynamic_sections_created)
5bd4f169 10578 {
e8910a83
AM
10579 bfd_boolean tls_opt;
10580
5bd4f169
AM
10581 /* Add some entries to the .dynamic section. We fill in the
10582 values later, in ppc64_elf_finish_dynamic_sections, but we
10583 must add the entries now so that we get the correct size for
10584 the .dynamic section. The DT_DEBUG entry is filled in by the
10585 dynamic linker and used by the debugger. */
dc810e39 10586#define add_dynamic_entry(TAG, VAL) \
5a580b3a 10587 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 10588
0e1862bb 10589 if (bfd_link_executable (info))
5bd4f169 10590 {
dc810e39 10591 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 10592 return FALSE;
5bd4f169
AM
10593 }
10594
33e44f2e 10595 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
5bd4f169 10596 {
dc810e39
AM
10597 if (!add_dynamic_entry (DT_PLTGOT, 0)
10598 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10599 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
10600 || !add_dynamic_entry (DT_JMPREL, 0)
10601 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
b34976b6 10602 return FALSE;
5bd4f169
AM
10603 }
10604
ee67d69a 10605 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
19397422
AM
10606 {
10607 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10608 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
b34976b6 10609 return FALSE;
19397422
AM
10610 }
10611
7c9cf415 10612 tls_opt = (htab->params->tls_get_addr_opt
e8910a83
AM
10613 && htab->tls_get_addr_fd != NULL
10614 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
10615 if (tls_opt || !htab->opd_abi)
10616 {
10617 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10618 return FALSE;
10619 }
a7f2871e 10620
5bd4f169
AM
10621 if (relocs)
10622 {
dc810e39
AM
10623 if (!add_dynamic_entry (DT_RELA, 0)
10624 || !add_dynamic_entry (DT_RELASZ, 0)
10625 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
b34976b6 10626 return FALSE;
5bd4f169 10627
65f38f15
AM
10628 /* If any dynamic relocs apply to a read-only section,
10629 then we need a DT_TEXTREL entry. */
248866a8 10630 if ((info->flags & DF_TEXTREL) == 0)
a345bc8d 10631 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
5bd4f169 10632
65f38f15 10633 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 10634 {
65f38f15 10635 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 10636 return FALSE;
5bd4f169 10637 }
5bd4f169 10638 }
5bd4f169 10639 }
65f38f15 10640#undef add_dynamic_entry
5bd4f169 10641
b34976b6 10642 return TRUE;
5bd4f169
AM
10643}
10644
a345bc8d
AM
10645/* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10646
10647static bfd_boolean
10648ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10649{
10650 if (h->plt.plist != NULL
10651 && !h->def_regular
10652 && !h->pointer_equality_needed)
10653 return FALSE;
10654
10655 return _bfd_elf_hash_symbol (h);
10656}
10657
721956f4 10658/* Determine the type of stub needed, if any, for a call. */
5bd4f169 10659
4ce794b7
AM
10660static inline enum ppc_stub_type
10661ppc_type_of_stub (asection *input_sec,
10662 const Elf_Internal_Rela *rel,
10663 struct ppc_link_hash_entry **hash,
e054468f 10664 struct plt_entry **plt_ent,
6911b7dc
AM
10665 bfd_vma destination,
10666 unsigned long local_off)
5bd4f169 10667{
721956f4
AM
10668 struct ppc_link_hash_entry *h = *hash;
10669 bfd_vma location;
10670 bfd_vma branch_offset;
10671 bfd_vma max_branch_offset;
4ce794b7 10672 enum elf_ppc64_reloc_type r_type;
5bd4f169 10673
721956f4
AM
10674 if (h != NULL)
10675 {
e054468f 10676 struct plt_entry *ent;
7fe2b9a6 10677 struct ppc_link_hash_entry *fdh = h;
b31867b6
AM
10678 if (h->oh != NULL
10679 && h->oh->is_func_descriptor)
7b8f6675
AM
10680 {
10681 fdh = ppc_follow_link (h->oh);
10682 *hash = fdh;
10683 }
8387904d 10684
e054468f
AM
10685 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10686 if (ent->addend == rel->r_addend
10687 && ent->plt.offset != (bfd_vma) -1)
10688 {
e054468f
AM
10689 *plt_ent = ent;
10690 return ppc_stub_plt_call;
10691 }
5bd4f169 10692
7fe2b9a6
AM
10693 /* Here, we know we don't have a plt entry. If we don't have a
10694 either a defined function descriptor or a defined entry symbol
10695 in a regular object file, then it is pointless trying to make
10696 any other type of stub. */
854b41e7
AM
10697 if (!is_static_defined (&fdh->elf)
10698 && !is_static_defined (&h->elf))
721956f4 10699 return ppc_stub_none;
5d1634d7 10700 }
e054468f
AM
10701 else if (elf_local_got_ents (input_sec->owner) != NULL)
10702 {
10703 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10704 struct plt_entry **local_plt = (struct plt_entry **)
10705 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10706 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10707
10708 if (local_plt[r_symndx] != NULL)
10709 {
10710 struct plt_entry *ent;
10711
10712 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10713 if (ent->addend == rel->r_addend
10714 && ent->plt.offset != (bfd_vma) -1)
10715 {
10716 *plt_ent = ent;
10717 return ppc_stub_plt_call;
10718 }
10719 }
10720 }
5d1634d7 10721
721956f4
AM
10722 /* Determine where the call point is. */
10723 location = (input_sec->output_offset
10724 + input_sec->output_section->vma
10725 + rel->r_offset);
5d1634d7 10726
721956f4
AM
10727 branch_offset = destination - location;
10728 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 10729
721956f4
AM
10730 /* Determine if a long branch stub is needed. */
10731 max_branch_offset = 1 << 25;
23cedd1d
AM
10732 if (r_type == R_PPC64_REL14
10733 || r_type == R_PPC64_REL14_BRTAKEN
10734 || r_type == R_PPC64_REL14_BRNTAKEN)
721956f4 10735 max_branch_offset = 1 << 15;
5d1634d7 10736
6911b7dc 10737 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
721956f4
AM
10738 /* We need a stub. Figure out whether a long_branch or plt_branch
10739 is needed later. */
10740 return ppc_stub_long_branch;
5d1634d7 10741
721956f4 10742 return ppc_stub_none;
5d1634d7
AM
10743}
10744
794e51c0
AM
10745/* With power7 weakly ordered memory model, it is possible for ld.so
10746 to update a plt entry in one thread and have another thread see a
10747 stale zero toc entry. To avoid this we need some sort of acquire
10748 barrier in the call stub. One solution is to make the load of the
10749 toc word seem to appear to depend on the load of the function entry
10750 word. Another solution is to test for r2 being zero, and branch to
10751 the appropriate glink entry if so.
10752
10753 . fake dep barrier compare
71a39c98
AM
10754 . ld 12,xxx(2) ld 12,xxx(2)
10755 . mtctr 12 mtctr 12
10756 . xor 11,12,12 ld 2,xxx+8(2)
794e51c0
AM
10757 . add 2,2,11 cmpldi 2,0
10758 . ld 2,xxx+8(2) bnectr+
10759 . bctr b <glink_entry>
10760
10761 The solution involving the compare turns out to be faster, so
10762 that's what we use unless the branch won't reach. */
10763
10764#define ALWAYS_USE_FAKE_DEP 0
10765#define ALWAYS_EMIT_R2SAVE 0
5d1634d7 10766
794e51c0
AM
10767static inline unsigned int
10768plt_stub_size (struct ppc_link_hash_table *htab,
10769 struct ppc_stub_hash_entry *stub_entry,
10770 bfd_vma off)
10771{
b9e5796b
AM
10772 unsigned size = 12;
10773
10774 if (ALWAYS_EMIT_R2SAVE
10775 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10776 size += 4;
10777 if (PPC_HA (off) != 0)
794e51c0 10778 size += 4;
b9e5796b
AM
10779 if (htab->opd_abi)
10780 {
10781 size += 4;
e7d1c40c 10782 if (htab->params->plt_static_chain)
b9e5796b 10783 size += 4;
bd4d2eaa
AM
10784 if (htab->params->plt_thread_safe
10785 && htab->elf.dynamic_sections_created
10786 && stub_entry->h != NULL
10787 && stub_entry->h->elf.dynindx != -1)
b9e5796b 10788 size += 8;
e7d1c40c 10789 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
b9e5796b
AM
10790 size += 4;
10791 }
794e51c0
AM
10792 if (stub_entry->h != NULL
10793 && (stub_entry->h == htab->tls_get_addr_fd
10794 || stub_entry->h == htab->tls_get_addr)
7c9cf415 10795 && htab->params->tls_get_addr_opt)
f378ab09
AM
10796 {
10797 size += 7 * 4;
10798 if (ALWAYS_EMIT_R2SAVE
10799 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
407aa07c 10800 size += 6 * 4;
f378ab09 10801 }
794e51c0
AM
10802 return size;
10803}
10804
2420fff6
AM
10805/* Depending on the sign of plt_stub_align:
10806 If positive, return the padding to align to a 2**plt_stub_align
10807 boundary.
10808 If negative, if this stub would cross fewer 2**plt_stub_align
10809 boundaries if we align, then return the padding needed to do so. */
10810
794e51c0
AM
10811static inline unsigned int
10812plt_stub_pad (struct ppc_link_hash_table *htab,
10813 struct ppc_stub_hash_entry *stub_entry,
10814 bfd_vma plt_off)
10815{
2420fff6 10816 int stub_align;
794e51c0 10817 unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
6f20ed8a 10818 bfd_vma stub_off = stub_entry->group->stub_sec->size;
794e51c0 10819
2420fff6
AM
10820 if (htab->params->plt_stub_align >= 0)
10821 {
10822 stub_align = 1 << htab->params->plt_stub_align;
10823 if ((stub_off & (stub_align - 1)) != 0)
10824 return stub_align - (stub_off & (stub_align - 1));
10825 return 0;
10826 }
10827
10828 stub_align = 1 << -htab->params->plt_stub_align;
794e51c0 10829 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
e05fa0ba 10830 > ((stub_size - 1) & -stub_align))
794e51c0
AM
10831 return stub_align - (stub_off & (stub_align - 1));
10832 return 0;
10833}
10834
10835/* Build a .plt call stub. */
10836
10837static inline bfd_byte *
10838build_plt_stub (struct ppc_link_hash_table *htab,
10839 struct ppc_stub_hash_entry *stub_entry,
10840 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10841{
e7d1c40c 10842 bfd *obfd = htab->params->stub_bfd;
b9e5796b 10843 bfd_boolean plt_load_toc = htab->opd_abi;
e7d1c40c 10844 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
bd4d2eaa
AM
10845 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10846 && htab->elf.dynamic_sections_created
10847 && stub_entry->h != NULL
10848 && stub_entry->h->elf.dynindx != -1);
794e51c0
AM
10849 bfd_boolean use_fake_dep = plt_thread_safe;
10850 bfd_vma cmp_branch_off = 0;
10851
10852 if (!ALWAYS_USE_FAKE_DEP
b9e5796b 10853 && plt_load_toc
794e51c0 10854 && plt_thread_safe
bd4d2eaa
AM
10855 && !((stub_entry->h == htab->tls_get_addr_fd
10856 || stub_entry->h == htab->tls_get_addr)
7c9cf415 10857 && htab->params->tls_get_addr_opt))
794e51c0
AM
10858 {
10859 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
b9e5796b
AM
10860 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10861 / PLT_ENTRY_SIZE (htab));
9e390558 10862 bfd_vma glinkoff = GLINK_PLTRESOLVE_SIZE (htab) + pltindex * 8;
794e51c0
AM
10863 bfd_vma to, from;
10864
68d62958
AM
10865 if (pltindex > 32768)
10866 glinkoff += (pltindex - 32768) * 4;
794e51c0
AM
10867 to = (glinkoff
10868 + htab->glink->output_offset
10869 + htab->glink->output_section->vma);
6f20ed8a 10870 from = (p - stub_entry->group->stub_sec->contents
794e51c0
AM
10871 + 4 * (ALWAYS_EMIT_R2SAVE
10872 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10873 + 4 * (PPC_HA (offset) != 0)
10874 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10875 != PPC_HA (offset))
10876 + 4 * (plt_static_chain != 0)
10877 + 20
6f20ed8a
AM
10878 + stub_entry->group->stub_sec->output_offset
10879 + stub_entry->group->stub_sec->output_section->vma);
794e51c0
AM
10880 cmp_branch_off = to - from;
10881 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10882 }
10883
ac2df442
AM
10884 if (PPC_HA (offset) != 0)
10885 {
176a0d42
AM
10886 if (r != NULL)
10887 {
794e51c0
AM
10888 if (ALWAYS_EMIT_R2SAVE
10889 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10890 r[0].r_offset += 4;
176a0d42 10891 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
3b421ab3 10892 r[1].r_offset = r[0].r_offset + 4;
176a0d42
AM
10893 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10894 r[1].r_addend = r[0].r_addend;
b9e5796b 10895 if (plt_load_toc)
176a0d42 10896 {
b9e5796b 10897 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10898 {
b9e5796b
AM
10899 r[2].r_offset = r[1].r_offset + 4;
10900 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10901 r[2].r_addend = r[0].r_addend;
10902 }
10903 else
10904 {
10905 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10906 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10907 r[2].r_addend = r[0].r_addend + 8;
10908 if (plt_static_chain)
10909 {
10910 r[3].r_offset = r[2].r_offset + 4;
10911 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10912 r[3].r_addend = r[0].r_addend + 16;
10913 }
c7131b65 10914 }
176a0d42
AM
10915 }
10916 }
794e51c0
AM
10917 if (ALWAYS_EMIT_R2SAVE
10918 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10919 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
397998fc
AM
10920 if (plt_load_toc)
10921 {
10922 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10923 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10924 }
10925 else
10926 {
10927 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10928 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10929 }
b9e5796b
AM
10930 if (plt_load_toc
10931 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442 10932 {
71a39c98 10933 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
ac2df442
AM
10934 offset = 0;
10935 }
71a39c98 10936 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10937 if (plt_load_toc)
794e51c0 10938 {
b9e5796b
AM
10939 if (use_fake_dep)
10940 {
10941 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10942 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10943 }
10944 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10945 if (plt_static_chain)
10946 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
794e51c0 10947 }
ac2df442
AM
10948 }
10949 else
10950 {
176a0d42
AM
10951 if (r != NULL)
10952 {
794e51c0
AM
10953 if (ALWAYS_EMIT_R2SAVE
10954 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10955 r[0].r_offset += 4;
176a0d42 10956 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
b9e5796b 10957 if (plt_load_toc)
176a0d42 10958 {
b9e5796b 10959 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 10960 {
b9e5796b
AM
10961 r[1].r_offset = r[0].r_offset + 4;
10962 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10963 r[1].r_addend = r[0].r_addend;
10964 }
10965 else
10966 {
10967 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10968 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10969 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10970 if (plt_static_chain)
10971 {
10972 r[2].r_offset = r[1].r_offset + 4;
10973 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10974 r[2].r_addend = r[0].r_addend + 8;
10975 }
c7131b65 10976 }
176a0d42
AM
10977 }
10978 }
794e51c0
AM
10979 if (ALWAYS_EMIT_R2SAVE
10980 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
a078d95a 10981 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
71a39c98 10982 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
b9e5796b
AM
10983 if (plt_load_toc
10984 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442
AM
10985 {
10986 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10987 offset = 0;
10988 }
71a39c98 10989 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 10990 if (plt_load_toc)
794e51c0 10991 {
b9e5796b
AM
10992 if (use_fake_dep)
10993 {
10994 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10995 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10996 }
10997 if (plt_static_chain)
10998 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10999 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
794e51c0 11000 }
ac2df442 11001 }
b9e5796b 11002 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
794e51c0
AM
11003 {
11004 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
11005 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
22aa0c7e 11006 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
794e51c0
AM
11007 }
11008 else
407aa07c 11009 bfd_put_32 (obfd, BCTR, p), p += 4;
5d1634d7
AM
11010 return p;
11011}
11012
a7f2871e
AM
11013/* Build a special .plt call stub for __tls_get_addr. */
11014
11015#define LD_R11_0R3 0xe9630000
11016#define LD_R12_0R3 0xe9830000
11017#define MR_R0_R3 0x7c601b78
11018#define CMPDI_R11_0 0x2c2b0000
11019#define ADD_R3_R12_R13 0x7c6c6a14
11020#define BEQLR 0x4d820020
11021#define MR_R3_R0 0x7c030378
a7f2871e
AM
11022#define STD_R11_0R1 0xf9610000
11023#define BCTRL 0x4e800421
11024#define LD_R11_0R1 0xe9610000
a7f2871e
AM
11025#define MTLR_R11 0x7d6803a6
11026
11027static inline bfd_byte *
794e51c0
AM
11028build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
11029 struct ppc_stub_hash_entry *stub_entry,
11030 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
a7f2871e 11031{
e7d1c40c 11032 bfd *obfd = htab->params->stub_bfd;
794e51c0 11033
a7f2871e
AM
11034 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
11035 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
11036 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
11037 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
11038 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
11039 bfd_put_32 (obfd, BEQLR, p), p += 4;
11040 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
f378ab09
AM
11041 if (r != NULL)
11042 r[0].r_offset += 7 * 4;
11043 if (!ALWAYS_EMIT_R2SAVE
11044 && stub_entry->stub_type != ppc_stub_plt_call_r2save)
11045 return build_plt_stub (htab, stub_entry, p, offset, r);
11046
a7f2871e 11047 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
a078d95a 11048 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
a7f2871e
AM
11049
11050 if (r != NULL)
f378ab09 11051 r[0].r_offset += 2 * 4;
794e51c0 11052 p = build_plt_stub (htab, stub_entry, p, offset, r);
407aa07c 11053 bfd_put_32 (obfd, BCTRL, p - 4);
a7f2871e 11054
a078d95a 11055 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
bd4d2eaa 11056 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
a7f2871e
AM
11057 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
11058 bfd_put_32 (obfd, BLR, p), p += 4;
11059
11060 return p;
11061}
11062
176a0d42
AM
11063static Elf_Internal_Rela *
11064get_relocs (asection *sec, int count)
11065{
11066 Elf_Internal_Rela *relocs;
11067 struct bfd_elf_section_data *elfsec_data;
11068
11069 elfsec_data = elf_section_data (sec);
11070 relocs = elfsec_data->relocs;
11071 if (relocs == NULL)
11072 {
11073 bfd_size_type relsize;
11074 relsize = sec->reloc_count * sizeof (*relocs);
11075 relocs = bfd_alloc (sec->owner, relsize);
11076 if (relocs == NULL)
11077 return NULL;
11078 elfsec_data->relocs = relocs;
d4730f92
BS
11079 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
11080 sizeof (Elf_Internal_Shdr));
11081 if (elfsec_data->rela.hdr == NULL)
11082 return NULL;
11083 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
11084 * sizeof (Elf64_External_Rela));
11085 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
176a0d42
AM
11086 sec->reloc_count = 0;
11087 }
11088 relocs += sec->reloc_count;
11089 sec->reloc_count += count;
11090 return relocs;
11091}
11092
aa374f67 11093static bfd_vma
25f53a85 11094get_r2off (struct bfd_link_info *info,
aa374f67
AM
11095 struct ppc_stub_hash_entry *stub_entry)
11096{
25f53a85 11097 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 11098 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
aa374f67
AM
11099
11100 if (r2off == 0)
11101 {
11102 /* Support linking -R objects. Get the toc pointer from the
11103 opd entry. */
11104 char buf[8];
b9e5796b
AM
11105 if (!htab->opd_abi)
11106 return r2off;
aa374f67
AM
11107 asection *opd = stub_entry->h->elf.root.u.def.section;
11108 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
11109
11110 if (strcmp (opd->name, ".opd") != 0
11111 || opd->reloc_count != 0)
11112 {
c1c8c1ef 11113 info->callbacks->einfo (_("%P: cannot find opd entry toc for `%pT'\n"),
25f53a85 11114 stub_entry->h->elf.root.root.string);
aa374f67 11115 bfd_set_error (bfd_error_bad_value);
a7c49797 11116 return (bfd_vma) -1;
aa374f67
AM
11117 }
11118 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
a7c49797 11119 return (bfd_vma) -1;
aa374f67 11120 r2off = bfd_get_64 (opd->owner, buf);
25f53a85 11121 r2off -= elf_gp (info->output_bfd);
aa374f67 11122 }
6f20ed8a 11123 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
aa374f67
AM
11124 return r2off;
11125}
11126
b34976b6 11127static bfd_boolean
4ce794b7 11128ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 11129{
721956f4
AM
11130 struct ppc_stub_hash_entry *stub_entry;
11131 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
11132 struct bfd_link_info *info;
11133 struct ppc_link_hash_table *htab;
721956f4
AM
11134 bfd_byte *loc;
11135 bfd_byte *p;
ee75fd95 11136 bfd_vma dest, off;
176a0d42 11137 Elf_Internal_Rela *r;
e054468f 11138 asection *plt;
5d1634d7 11139
721956f4
AM
11140 /* Massage our args to the form they really have. */
11141 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 11142 info = in_arg;
5d1634d7 11143
5d1634d7 11144 htab = ppc_hash_table (info);
4dfe6ac6
NC
11145 if (htab == NULL)
11146 return FALSE;
5d1634d7 11147
721956f4 11148 /* Make a note of the offset within the stubs for this entry. */
6f20ed8a
AM
11149 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11150 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
721956f4 11151
4ce794b7 11152 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 11153 switch (stub_entry->stub_type)
5d1634d7 11154 {
721956f4 11155 case ppc_stub_long_branch:
ad8e1ba5 11156 case ppc_stub_long_branch_r2off:
721956f4 11157 /* Branches are relative. This is where we are going to. */
6911b7dc
AM
11158 dest = (stub_entry->target_value
11159 + stub_entry->target_section->output_offset
11160 + stub_entry->target_section->output_section->vma);
11161 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
11162 off = dest;
5d1634d7 11163
721956f4
AM
11164 /* And this is where we are coming from. */
11165 off -= (stub_entry->stub_offset
6f20ed8a
AM
11166 + stub_entry->group->stub_sec->output_offset
11167 + stub_entry->group->stub_sec->output_section->vma);
e86ce104 11168
9e390558 11169 p = loc;
ac2df442 11170 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
ad8e1ba5 11171 {
25f53a85 11172 bfd_vma r2off = get_r2off (info, stub_entry);
ad8e1ba5 11173
a7c49797 11174 if (r2off == (bfd_vma) -1)
aa374f67
AM
11175 {
11176 htab->stub_error = TRUE;
11177 return FALSE;
11178 }
9e390558
AM
11179 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11180 p += 4;
ac2df442
AM
11181 if (PPC_HA (r2off) != 0)
11182 {
e7d1c40c 11183 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11184 ADDIS_R2_R2 | PPC_HA (r2off), p);
11185 p += 4;
a7c49797
AM
11186 }
11187 if (PPC_LO (r2off) != 0)
11188 {
11189 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11190 ADDI_R2_R2 | PPC_LO (r2off), p);
11191 p += 4;
ac2df442 11192 }
9e390558 11193 off -= p - loc;
ad8e1ba5 11194 }
9e390558
AM
11195 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), p);
11196 p += 4;
ad8e1ba5 11197
5c3dead3
AM
11198 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11199 {
cf97bcb0
AM
11200 _bfd_error_handler
11201 (_("long branch stub `%s' offset overflow"),
bc30df16 11202 stub_entry->root.string);
5c3dead3
AM
11203 htab->stub_error = TRUE;
11204 return FALSE;
11205 }
ee75fd95
AM
11206
11207 if (info->emitrelocations)
11208 {
6f20ed8a 11209 r = get_relocs (stub_entry->group->stub_sec, 1);
176a0d42
AM
11210 if (r == NULL)
11211 return FALSE;
9e390558 11212 r->r_offset = p - 4 - stub_entry->group->stub_sec->contents;
ee75fd95
AM
11213 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
11214 r->r_addend = dest;
11215 if (stub_entry->h != NULL)
11216 {
11217 struct elf_link_hash_entry **hashes;
11218 unsigned long symndx;
11219 struct ppc_link_hash_entry *h;
11220
e7d1c40c 11221 hashes = elf_sym_hashes (htab->params->stub_bfd);
ee75fd95
AM
11222 if (hashes == NULL)
11223 {
11224 bfd_size_type hsize;
11225
11226 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
e7d1c40c 11227 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
ee75fd95
AM
11228 if (hashes == NULL)
11229 return FALSE;
e7d1c40c 11230 elf_sym_hashes (htab->params->stub_bfd) = hashes;
ee75fd95
AM
11231 htab->stub_globals = 1;
11232 }
11233 symndx = htab->stub_globals++;
11234 h = stub_entry->h;
11235 hashes[symndx] = &h->elf;
11236 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
11237 if (h->oh != NULL && h->oh->is_func)
b31867b6 11238 h = ppc_follow_link (h->oh);
ee75fd95
AM
11239 if (h->elf.root.u.def.section != stub_entry->target_section)
11240 /* H is an opd symbol. The addend must be zero. */
11241 r->r_addend = 0;
11242 else
11243 {
11244 off = (h->elf.root.u.def.value
11245 + h->elf.root.u.def.section->output_offset
11246 + h->elf.root.u.def.section->output_section->vma);
11247 r->r_addend -= off;
11248 }
11249 }
11250 }
721956f4 11251 break;
e86ce104 11252
721956f4 11253 case ppc_stub_plt_branch:
ad8e1ba5 11254 case ppc_stub_plt_branch_r2off:
721956f4
AM
11255 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11256 stub_entry->root.string + 9,
b34976b6 11257 FALSE, FALSE);
721956f4
AM
11258 if (br_entry == NULL)
11259 {
cf97bcb0
AM
11260 _bfd_error_handler (_("can't find branch stub `%s'"),
11261 stub_entry->root.string);
b34976b6
AM
11262 htab->stub_error = TRUE;
11263 return FALSE;
721956f4
AM
11264 }
11265
176a0d42
AM
11266 dest = (stub_entry->target_value
11267 + stub_entry->target_section->output_offset
11268 + stub_entry->target_section->output_section->vma);
6911b7dc
AM
11269 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11270 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
721956f4 11271
176a0d42 11272 bfd_put_64 (htab->brlt->owner, dest,
4ce794b7 11273 htab->brlt->contents + br_entry->offset);
721956f4 11274
f94498ff 11275 if (br_entry->iter == htab->stub_iteration)
721956f4 11276 {
f94498ff 11277 br_entry->iter = 0;
84f5d08e 11278
f94498ff 11279 if (htab->relbrlt != NULL)
84f5d08e 11280 {
f94498ff
AM
11281 /* Create a reloc for the branch lookup table entry. */
11282 Elf_Internal_Rela rela;
11283 bfd_byte *rl;
11284
11285 rela.r_offset = (br_entry->offset
11286 + htab->brlt->output_offset
11287 + htab->brlt->output_section->vma);
11288 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
176a0d42 11289 rela.r_addend = dest;
f94498ff
AM
11290
11291 rl = htab->relbrlt->contents;
11292 rl += (htab->relbrlt->reloc_count++
11293 * sizeof (Elf64_External_Rela));
11294 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
11295 }
11296 else if (info->emitrelocations)
11297 {
176a0d42
AM
11298 r = get_relocs (htab->brlt, 1);
11299 if (r == NULL)
11300 return FALSE;
11301 /* brlt, being SEC_LINKER_CREATED does not go through the
11302 normal reloc processing. Symbols and offsets are not
11303 translated from input file to output file form, so
11304 set up the offset per the output file. */
f94498ff
AM
11305 r->r_offset = (br_entry->offset
11306 + htab->brlt->output_offset
11307 + htab->brlt->output_section->vma);
11308 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
176a0d42 11309 r->r_addend = dest;
84f5d08e 11310 }
84f5d08e 11311 }
721956f4 11312
176a0d42
AM
11313 dest = (br_entry->offset
11314 + htab->brlt->output_offset
11315 + htab->brlt->output_section->vma);
11316
11317 off = (dest
06bcf541 11318 - elf_gp (info->output_bfd)
6f20ed8a 11319 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
721956f4 11320
ad8e1ba5 11321 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7 11322 {
25f53a85 11323 info->callbacks->einfo
c1c8c1ef 11324 (_("%P: linkage table error against `%pT'\n"),
721956f4 11325 stub_entry->root.string);
5d1634d7 11326 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11327 htab->stub_error = TRUE;
11328 return FALSE;
5d1634d7 11329 }
41bd81ab 11330
176a0d42
AM
11331 if (info->emitrelocations)
11332 {
6f20ed8a 11333 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
176a0d42
AM
11334 if (r == NULL)
11335 return FALSE;
6f20ed8a 11336 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11337 if (bfd_big_endian (info->output_bfd))
11338 r[0].r_offset += 2;
00f412ee 11339 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
176a0d42
AM
11340 r[0].r_offset += 4;
11341 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
11342 r[0].r_addend = dest;
11343 if (PPC_HA (off) != 0)
11344 {
11345 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11346 r[1].r_offset = r[0].r_offset + 4;
11347 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11348 r[1].r_addend = r[0].r_addend;
11349 }
11350 }
11351
9e390558 11352 p = loc;
00f412ee 11353 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ad8e1ba5 11354 {
176a0d42 11355 if (PPC_HA (off) != 0)
ac2df442 11356 {
e7d1c40c 11357 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11358 ADDIS_R12_R2 | PPC_HA (off), p);
11359 p += 4;
e7d1c40c 11360 bfd_put_32 (htab->params->stub_bfd,
9e390558 11361 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11362 }
11363 else
9e390558
AM
11364 bfd_put_32 (htab->params->stub_bfd,
11365 LD_R12_0R2 | PPC_LO (off), p);
ad8e1ba5
AM
11366 }
11367 else
11368 {
25f53a85 11369 bfd_vma r2off = get_r2off (info, stub_entry);
aa374f67 11370
a7c49797 11371 if (r2off == (bfd_vma) -1)
aa374f67
AM
11372 {
11373 htab->stub_error = TRUE;
11374 return FALSE;
11375 }
ad8e1ba5 11376
9e390558
AM
11377 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11378 p += 4;
176a0d42 11379 if (PPC_HA (off) != 0)
ac2df442 11380 {
e7d1c40c 11381 bfd_put_32 (htab->params->stub_bfd,
9e390558
AM
11382 ADDIS_R12_R2 | PPC_HA (off), p);
11383 p += 4;
e7d1c40c 11384 bfd_put_32 (htab->params->stub_bfd,
9e390558 11385 LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11386 }
11387 else
9e390558 11388 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), p);
ac2df442
AM
11389
11390 if (PPC_HA (r2off) != 0)
11391 {
9e390558 11392 p += 4;
e7d1c40c 11393 bfd_put_32 (htab->params->stub_bfd,
9e390558 11394 ADDIS_R2_R2 | PPC_HA (r2off), p);
00f412ee
AM
11395 }
11396 if (PPC_LO (r2off) != 0)
11397 {
9e390558 11398 p += 4;
e7d1c40c 11399 bfd_put_32 (htab->params->stub_bfd,
9e390558 11400 ADDI_R2_R2 | PPC_LO (r2off), p);
ac2df442 11401 }
ad8e1ba5 11402 }
9e390558
AM
11403 p += 4;
11404 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11405 p += 4;
407aa07c
AM
11406 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11407 p += 4;
721956f4 11408 break;
5d1634d7 11409
721956f4 11410 case ppc_stub_plt_call:
794e51c0 11411 case ppc_stub_plt_call_r2save:
e054468f 11412 if (stub_entry->h != NULL
b31867b6
AM
11413 && stub_entry->h->is_func_descriptor
11414 && stub_entry->h->oh != NULL)
c862ae31 11415 {
b31867b6
AM
11416 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11417
11418 /* If the old-ABI "dot-symbol" is undefined make it weak so
6f20ed8a 11419 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
8c5b4e52
AM
11420 if (fh->elf.root.type == bfd_link_hash_undefined
11421 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11422 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
b31867b6 11423 fh->elf.root.type = bfd_link_hash_undefweak;
c862ae31
AM
11424 }
11425
721956f4 11426 /* Now build the stub. */
e054468f 11427 dest = stub_entry->plt_ent->plt.offset & ~1;
176a0d42 11428 if (dest >= (bfd_vma) -2)
721956f4
AM
11429 abort ();
11430
33e44f2e 11431 plt = htab->elf.splt;
25f23106
AM
11432 if (!htab->elf.dynamic_sections_created
11433 || stub_entry->h == NULL
11434 || stub_entry->h->elf.dynindx == -1)
2d7ad24e
AM
11435 {
11436 if (stub_entry->symtype == STT_GNU_IFUNC)
11437 plt = htab->elf.iplt;
11438 else
11439 plt = htab->pltlocal;
11440 }
e054468f
AM
11441
11442 dest += plt->output_offset + plt->output_section->vma;
11443
176a0d42 11444 off = (dest
06bcf541 11445 - elf_gp (info->output_bfd)
6f20ed8a 11446 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
721956f4 11447
ad8e1ba5 11448 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4 11449 {
25f53a85 11450 info->callbacks->einfo
695344c0 11451 /* xgettext:c-format */
c1c8c1ef 11452 (_("%P: linkage table error against `%pT'\n"),
e054468f
AM
11453 stub_entry->h != NULL
11454 ? stub_entry->h->elf.root.root.string
11455 : "<local sym>");
721956f4 11456 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
11457 htab->stub_error = TRUE;
11458 return FALSE;
721956f4
AM
11459 }
11460
e7d1c40c 11461 if (htab->params->plt_stub_align != 0)
794e51c0
AM
11462 {
11463 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11464
6f20ed8a
AM
11465 stub_entry->group->stub_sec->size += pad;
11466 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
794e51c0
AM
11467 loc += pad;
11468 }
11469
176a0d42
AM
11470 r = NULL;
11471 if (info->emitrelocations)
11472 {
6f20ed8a 11473 r = get_relocs (stub_entry->group->stub_sec,
3ba720c7
AM
11474 ((PPC_HA (off) != 0)
11475 + (htab->opd_abi
e7d1c40c 11476 ? 2 + (htab->params->plt_static_chain
3ba720c7
AM
11477 && PPC_HA (off + 16) == PPC_HA (off))
11478 : 1)));
176a0d42
AM
11479 if (r == NULL)
11480 return FALSE;
6f20ed8a 11481 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11482 if (bfd_big_endian (info->output_bfd))
11483 r[0].r_offset += 2;
176a0d42
AM
11484 r[0].r_addend = dest;
11485 }
a7f2871e
AM
11486 if (stub_entry->h != NULL
11487 && (stub_entry->h == htab->tls_get_addr_fd
11488 || stub_entry->h == htab->tls_get_addr)
7c9cf415 11489 && htab->params->tls_get_addr_opt)
794e51c0 11490 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
a7f2871e 11491 else
794e51c0 11492 p = build_plt_stub (htab, stub_entry, loc, off, r);
721956f4
AM
11493 break;
11494
a4b6fadd
AM
11495 case ppc_stub_save_res:
11496 return TRUE;
11497
721956f4
AM
11498 default:
11499 BFD_FAIL ();
b34976b6 11500 return FALSE;
721956f4
AM
11501 }
11502
9e390558 11503 stub_entry->group->stub_sec->size += p - loc;
97b639ba 11504
e7d1c40c 11505 if (htab->params->emit_stub_syms)
97b639ba
AM
11506 {
11507 struct elf_link_hash_entry *h;
ee75fd95
AM
11508 size_t len1, len2;
11509 char *name;
11510 const char *const stub_str[] = { "long_branch",
11511 "long_branch_r2off",
11512 "plt_branch",
11513 "plt_branch_r2off",
794e51c0 11514 "plt_call",
ee75fd95
AM
11515 "plt_call" };
11516
11517 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11518 len2 = strlen (stub_entry->root.string);
11519 name = bfd_malloc (len1 + len2 + 2);
11520 if (name == NULL)
11521 return FALSE;
11522 memcpy (name, stub_entry->root.string, 9);
11523 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11524 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11525 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
11526 if (h == NULL)
11527 return FALSE;
11528 if (h->root.type == bfd_link_hash_new)
11529 {
11530 h->root.type = bfd_link_hash_defined;
6f20ed8a 11531 h->root.u.def.section = stub_entry->group->stub_sec;
97b639ba 11532 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
11533 h->ref_regular = 1;
11534 h->def_regular = 1;
11535 h->ref_regular_nonweak = 1;
11536 h->forced_local = 1;
11537 h->non_elf = 0;
2ec55de3 11538 h->root.linker_def = 1;
97b639ba
AM
11539 }
11540 }
11541
b34976b6 11542 return TRUE;
721956f4
AM
11543}
11544
11545/* As above, but don't actually build the stub. Just bump offset so
11546 we know stub section sizes, and select plt_branch stubs where
11547 long_branch stubs won't do. */
11548
b34976b6 11549static bfd_boolean
4ce794b7 11550ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
11551{
11552 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 11553 struct bfd_link_info *info;
721956f4
AM
11554 struct ppc_link_hash_table *htab;
11555 bfd_vma off;
11556 int size;
11557
11558 /* Massage our args to the form they really have. */
11559 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
11560 info = in_arg;
11561
11562 htab = ppc_hash_table (info);
4dfe6ac6
NC
11563 if (htab == NULL)
11564 return FALSE;
721956f4 11565
a4b6fadd
AM
11566 if (stub_entry->h != NULL
11567 && stub_entry->h->save_res
11568 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11569 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11570 {
11571 /* Don't make stubs to out-of-line register save/restore
11572 functions. Instead, emit copies of the functions. */
11573 stub_entry->group->needs_save_res = 1;
11574 stub_entry->stub_type = ppc_stub_save_res;
11575 return TRUE;
11576 }
11577
794e51c0
AM
11578 if (stub_entry->stub_type == ppc_stub_plt_call
11579 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
721956f4 11580 {
e054468f
AM
11581 asection *plt;
11582 off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
58ac9f71 11583 if (off >= (bfd_vma) -2)
411e1bfb 11584 abort ();
33e44f2e 11585 plt = htab->elf.splt;
25f23106
AM
11586 if (!htab->elf.dynamic_sections_created
11587 || stub_entry->h == NULL
11588 || stub_entry->h->elf.dynindx == -1)
2d7ad24e
AM
11589 {
11590 if (stub_entry->symtype == STT_GNU_IFUNC)
11591 plt = htab->elf.iplt;
11592 else
11593 plt = htab->pltlocal;
11594 }
e054468f
AM
11595 off += (plt->output_offset
11596 + plt->output_section->vma
06bcf541 11597 - elf_gp (info->output_bfd)
6f20ed8a 11598 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
721956f4 11599
794e51c0 11600 size = plt_stub_size (htab, stub_entry, off);
d4aaa2a0
AM
11601 if (stub_entry->h != NULL
11602 && (stub_entry->h == htab->tls_get_addr_fd
11603 || stub_entry->h == htab->tls_get_addr)
11604 && htab->params->tls_get_addr_opt
11605 && (ALWAYS_EMIT_R2SAVE
11606 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
11607 stub_entry->group->tls_get_addr_opt_bctrl
11608 = stub_entry->group->stub_sec->size + size - 5 * 4;
11609
e7d1c40c 11610 if (htab->params->plt_stub_align)
794e51c0 11611 size += plt_stub_pad (htab, stub_entry, off);
176a0d42
AM
11612 if (info->emitrelocations)
11613 {
6f20ed8a 11614 stub_entry->group->stub_sec->reloc_count
b9e5796b
AM
11615 += ((PPC_HA (off) != 0)
11616 + (htab->opd_abi
e7d1c40c 11617 ? 2 + (htab->params->plt_static_chain
b9e5796b
AM
11618 && PPC_HA (off + 16) == PPC_HA (off))
11619 : 1));
6f20ed8a 11620 stub_entry->group->stub_sec->flags |= SEC_RELOC;
176a0d42 11621 }
721956f4
AM
11622 }
11623 else
11624 {
ad8e1ba5
AM
11625 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
11626 variants. */
ac2df442 11627 bfd_vma r2off = 0;
6911b7dc 11628 bfd_vma local_off = 0;
ac2df442 11629
721956f4
AM
11630 off = (stub_entry->target_value
11631 + stub_entry->target_section->output_offset
11632 + stub_entry->target_section->output_section->vma);
6f20ed8a
AM
11633 off -= (stub_entry->group->stub_sec->size
11634 + stub_entry->group->stub_sec->output_offset
11635 + stub_entry->group->stub_sec->output_section->vma);
721956f4 11636
ad8e1ba5
AM
11637 /* Reset the stub type from the plt variant in case we now
11638 can reach with a shorter stub. */
11639 if (stub_entry->stub_type >= ppc_stub_plt_branch)
11640 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11641
11642 size = 4;
11643 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11644 {
25f53a85 11645 r2off = get_r2off (info, stub_entry);
a7c49797 11646 if (r2off == (bfd_vma) -1)
aa374f67
AM
11647 {
11648 htab->stub_error = TRUE;
11649 return FALSE;
11650 }
a7c49797 11651 size = 8;
ac2df442 11652 if (PPC_HA (r2off) != 0)
a7c49797
AM
11653 size += 4;
11654 if (PPC_LO (r2off) != 0)
11655 size += 4;
ac2df442 11656 off -= size - 4;
ad8e1ba5
AM
11657 }
11658
6911b7dc
AM
11659 local_off = PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
11660
6a3858a6 11661 /* If the branch offset is too big, use a ppc_stub_plt_branch.
b9e5796b
AM
11662 Do the same for -R objects without function descriptors. */
11663 if (off + (1 << 25) >= (bfd_vma) (1 << 26) - local_off
11664 || (stub_entry->stub_type == ppc_stub_long_branch_r2off
a7c49797
AM
11665 && r2off == 0
11666 && htab->sec_info[stub_entry->target_section->id].toc_off == 0))
721956f4
AM
11667 {
11668 struct ppc_branch_hash_entry *br_entry;
11669
11670 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11671 stub_entry->root.string + 9,
b34976b6 11672 TRUE, FALSE);
721956f4
AM
11673 if (br_entry == NULL)
11674 {
cf97bcb0
AM
11675 _bfd_error_handler (_("can't build branch stub `%s'"),
11676 stub_entry->root.string);
b34976b6
AM
11677 htab->stub_error = TRUE;
11678 return FALSE;
721956f4
AM
11679 }
11680
11681 if (br_entry->iter != htab->stub_iteration)
11682 {
11683 br_entry->iter = htab->stub_iteration;
eea6121a
AM
11684 br_entry->offset = htab->brlt->size;
11685 htab->brlt->size += 8;
63bc6f6c 11686
ee75fd95 11687 if (htab->relbrlt != NULL)
eea6121a 11688 htab->relbrlt->size += sizeof (Elf64_External_Rela);
84f5d08e
AM
11689 else if (info->emitrelocations)
11690 {
11691 htab->brlt->reloc_count += 1;
11692 htab->brlt->flags |= SEC_RELOC;
11693 }
721956f4 11694 }
ad8e1ba5
AM
11695
11696 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
ac2df442
AM
11697 off = (br_entry->offset
11698 + htab->brlt->output_offset
11699 + htab->brlt->output_section->vma
06bcf541 11700 - elf_gp (info->output_bfd)
6f20ed8a 11701 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
ac2df442 11702
176a0d42
AM
11703 if (info->emitrelocations)
11704 {
6f20ed8a
AM
11705 stub_entry->group->stub_sec->reloc_count
11706 += 1 + (PPC_HA (off) != 0);
11707 stub_entry->group->stub_sec->flags |= SEC_RELOC;
176a0d42
AM
11708 }
11709
00f412ee 11710 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
ac2df442
AM
11711 {
11712 size = 12;
176a0d42 11713 if (PPC_HA (off) != 0)
ac2df442
AM
11714 size = 16;
11715 }
11716 else
11717 {
00f412ee 11718 size = 16;
176a0d42 11719 if (PPC_HA (off) != 0)
ac2df442
AM
11720 size += 4;
11721
11722 if (PPC_HA (r2off) != 0)
11723 size += 4;
00f412ee
AM
11724 if (PPC_LO (r2off) != 0)
11725 size += 4;
ac2df442 11726 }
721956f4 11727 }
84f5d08e
AM
11728 else if (info->emitrelocations)
11729 {
6f20ed8a
AM
11730 stub_entry->group->stub_sec->reloc_count += 1;
11731 stub_entry->group->stub_sec->flags |= SEC_RELOC;
84f5d08e 11732 }
721956f4
AM
11733 }
11734
6f20ed8a 11735 stub_entry->group->stub_sec->size += size;
b34976b6 11736 return TRUE;
721956f4
AM
11737}
11738
11739/* Set up various things so that we can make a list of input sections
11740 for each output section included in the link. Returns -1 on error,
cedb70c5 11741 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
11742
11743int
e7d1c40c 11744ppc64_elf_setup_section_lists (struct bfd_link_info *info)
721956f4 11745{
6f20ed8a 11746 unsigned int id;
721956f4
AM
11747 bfd_size_type amt;
11748 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11749
4dfe6ac6
NC
11750 if (htab == NULL)
11751 return -1;
4c52953f 11752
6f20ed8a
AM
11753 htab->sec_info_arr_size = bfd_get_next_section_id ();
11754 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
11755 htab->sec_info = bfd_zmalloc (amt);
11756 if (htab->sec_info == NULL)
721956f4
AM
11757 return -1;
11758
3d6f9012
AM
11759 /* Set toc_off for com, und, abs and ind sections. */
11760 for (id = 0; id < 3; id++)
6f20ed8a 11761 htab->sec_info[id].toc_off = TOC_BASE_OFF;
734b6cf9 11762
721956f4
AM
11763 return 1;
11764}
11765
927be08e
AM
11766/* Set up for first pass at multitoc partitioning. */
11767
11768void
11769ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11770{
11771 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11772
1c865ab2 11773 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
927be08e
AM
11774 htab->toc_bfd = NULL;
11775 htab->toc_first_sec = NULL;
11776}
11777
e717da7e
AM
11778/* The linker repeatedly calls this function for each TOC input section
11779 and linker generated GOT section. Group input bfds such that the toc
927be08e 11780 within a group is less than 64k in size. */
ad8e1ba5 11781
927be08e 11782bfd_boolean
4ce794b7 11783ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
11784{
11785 struct ppc_link_hash_table *htab = ppc_hash_table (info);
d77c8a4b 11786 bfd_vma addr, off, limit;
ad8e1ba5 11787
4dfe6ac6
NC
11788 if (htab == NULL)
11789 return FALSE;
11790
927be08e 11791 if (!htab->second_toc_pass)
4c52953f 11792 {
927be08e 11793 /* Keep track of the first .toc or .got section for this input bfd. */
a4fd3de5
AM
11794 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
11795
11796 if (new_bfd)
bf102f86
AM
11797 {
11798 htab->toc_bfd = isec->owner;
11799 htab->toc_first_sec = isec;
11800 }
927be08e 11801
bf102f86
AM
11802 addr = isec->output_offset + isec->output_section->vma;
11803 off = addr - htab->toc_curr;
d77c8a4b
AM
11804 limit = 0x80008000;
11805 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
11806 limit = 0x10000;
11807 if (off + isec->size > limit)
bf102f86
AM
11808 {
11809 addr = (htab->toc_first_sec->output_offset
11810 + htab->toc_first_sec->output_section->vma);
11811 htab->toc_curr = addr;
a27e685f 11812 htab->toc_curr &= -TOC_BASE_ALIGN;
bf102f86 11813 }
99877b66 11814
927be08e
AM
11815 /* toc_curr is the base address of this toc group. Set elf_gp
11816 for the input section to be the offset relative to the
11817 output toc base plus 0x8000. Making the input elf_gp an
11818 offset allows us to move the toc as a whole without
11819 recalculating input elf_gp. */
06bcf541 11820 off = htab->toc_curr - elf_gp (info->output_bfd);
927be08e
AM
11821 off += TOC_BASE_OFF;
11822
11823 /* Die if someone uses a linker script that doesn't keep input
11824 file .toc and .got together. */
a4fd3de5
AM
11825 if (new_bfd
11826 && elf_gp (isec->owner) != 0
927be08e
AM
11827 && elf_gp (isec->owner) != off)
11828 return FALSE;
11829
11830 elf_gp (isec->owner) = off;
11831 return TRUE;
4c52953f 11832 }
927be08e
AM
11833
11834 /* During the second pass toc_first_sec points to the start of
11835 a toc group, and toc_curr is used to track the old elf_gp.
11836 We use toc_bfd to ensure we only look at each bfd once. */
11837 if (htab->toc_bfd == isec->owner)
11838 return TRUE;
11839 htab->toc_bfd = isec->owner;
11840
11841 if (htab->toc_first_sec == NULL
11842 || htab->toc_curr != elf_gp (isec->owner))
11843 {
11844 htab->toc_curr = elf_gp (isec->owner);
11845 htab->toc_first_sec = isec;
11846 }
11847 addr = (htab->toc_first_sec->output_offset
11848 + htab->toc_first_sec->output_section->vma);
06bcf541 11849 off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF;
927be08e
AM
11850 elf_gp (isec->owner) = off;
11851
11852 return TRUE;
ad8e1ba5
AM
11853}
11854
927be08e
AM
11855/* Called via elf_link_hash_traverse to merge GOT entries for global
11856 symbol H. */
11857
11858static bfd_boolean
11859merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
11860{
11861 if (h->root.type == bfd_link_hash_indirect)
11862 return TRUE;
11863
927be08e
AM
11864 merge_got_entries (&h->got.glist);
11865
11866 return TRUE;
11867}
11868
11869/* Called via elf_link_hash_traverse to allocate GOT entries for global
11870 symbol H. */
11871
11872static bfd_boolean
11873reallocate_got (struct elf_link_hash_entry *h, void *inf)
11874{
11875 struct got_entry *gent;
11876
11877 if (h->root.type == bfd_link_hash_indirect)
11878 return TRUE;
11879
927be08e
AM
11880 for (gent = h->got.glist; gent != NULL; gent = gent->next)
11881 if (!gent->is_indirect)
11882 allocate_got (h, (struct bfd_link_info *) inf, gent);
11883 return TRUE;
11884}
11885
11886/* Called on the first multitoc pass after the last call to
11887 ppc64_elf_next_toc_section. This function removes duplicate GOT
11888 entries. */
11889
11890bfd_boolean
11891ppc64_elf_layout_multitoc (struct bfd_link_info *info)
ad8e1ba5
AM
11892{
11893 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e
AM
11894 struct bfd *ibfd, *ibfd2;
11895 bfd_boolean done_something;
11896
11897 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
ad8e1ba5 11898
7865406b
AM
11899 if (!htab->do_multi_toc)
11900 return FALSE;
11901
d0fae19d 11902 /* Merge global sym got entries within a toc group. */
927be08e
AM
11903 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
11904
11905 /* And tlsld_got. */
c72f2fb2 11906 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
11907 {
11908 struct got_entry *ent, *ent2;
11909
11910 if (!is_ppc64_elf (ibfd))
11911 continue;
11912
11913 ent = ppc64_tlsld_got (ibfd);
11914 if (!ent->is_indirect
11915 && ent->got.offset != (bfd_vma) -1)
11916 {
c72f2fb2 11917 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
927be08e
AM
11918 {
11919 if (!is_ppc64_elf (ibfd2))
11920 continue;
11921
11922 ent2 = ppc64_tlsld_got (ibfd2);
11923 if (!ent2->is_indirect
11924 && ent2->got.offset != (bfd_vma) -1
11925 && elf_gp (ibfd2) == elf_gp (ibfd))
11926 {
11927 ent2->is_indirect = TRUE;
11928 ent2->got.ent = ent;
11929 }
11930 }
11931 }
11932 }
11933
11934 /* Zap sizes of got sections. */
33e44f2e
AM
11935 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
11936 htab->elf.irelplt->size -= htab->got_reli_size;
927be08e
AM
11937 htab->got_reli_size = 0;
11938
c72f2fb2 11939 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
11940 {
11941 asection *got, *relgot;
11942
11943 if (!is_ppc64_elf (ibfd))
11944 continue;
11945
11946 got = ppc64_elf_tdata (ibfd)->got;
11947 if (got != NULL)
11948 {
11949 got->rawsize = got->size;
11950 got->size = 0;
11951 relgot = ppc64_elf_tdata (ibfd)->relgot;
11952 relgot->rawsize = relgot->size;
11953 relgot->size = 0;
11954 }
11955 }
11956
11957 /* Now reallocate the got, local syms first. We don't need to
11958 allocate section contents again since we never increase size. */
c72f2fb2 11959 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
11960 {
11961 struct got_entry **lgot_ents;
11962 struct got_entry **end_lgot_ents;
11963 struct plt_entry **local_plt;
11964 struct plt_entry **end_local_plt;
f961d9dd 11965 unsigned char *lgot_masks;
927be08e
AM
11966 bfd_size_type locsymcount;
11967 Elf_Internal_Shdr *symtab_hdr;
19e08130 11968 asection *s;
927be08e
AM
11969
11970 if (!is_ppc64_elf (ibfd))
11971 continue;
11972
11973 lgot_ents = elf_local_got_ents (ibfd);
11974 if (!lgot_ents)
11975 continue;
11976
11977 symtab_hdr = &elf_symtab_hdr (ibfd);
11978 locsymcount = symtab_hdr->sh_info;
11979 end_lgot_ents = lgot_ents + locsymcount;
11980 local_plt = (struct plt_entry **) end_lgot_ents;
11981 end_local_plt = local_plt + locsymcount;
f961d9dd 11982 lgot_masks = (unsigned char *) end_local_plt;
927be08e 11983 s = ppc64_elf_tdata (ibfd)->got;
927be08e
AM
11984 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
11985 {
11986 struct got_entry *ent;
11987
11988 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
d0fae19d 11989 {
19e08130
AM
11990 unsigned int ent_size = 8;
11991 unsigned int rel_size = sizeof (Elf64_External_Rela);
11992
d0fae19d
AM
11993 ent->got.offset = s->size;
11994 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
d0fae19d 11995 {
19e08130
AM
11996 ent_size *= 2;
11997 rel_size *= 2;
11998 }
11999 s->size += ent_size;
37da22e5 12000 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 12001 {
33e44f2e 12002 htab->elf.irelplt->size += rel_size;
19e08130
AM
12003 htab->got_reli_size += rel_size;
12004 }
6a3858a6
AM
12005 else if (bfd_link_pic (info)
12006 && !((ent->tls_type & TLS_TPREL) != 0
12007 && bfd_link_executable (info)))
19e08130
AM
12008 {
12009 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12010 srel->size += rel_size;
d0fae19d
AM
12011 }
12012 }
927be08e
AM
12013 }
12014 }
12015
12016 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
12017
c72f2fb2 12018 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12019 {
12020 struct got_entry *ent;
12021
12022 if (!is_ppc64_elf (ibfd))
12023 continue;
12024
12025 ent = ppc64_tlsld_got (ibfd);
12026 if (!ent->is_indirect
12027 && ent->got.offset != (bfd_vma) -1)
12028 {
12029 asection *s = ppc64_elf_tdata (ibfd)->got;
12030 ent->got.offset = s->size;
12031 s->size += 16;
0e1862bb 12032 if (bfd_link_pic (info))
927be08e
AM
12033 {
12034 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12035 srel->size += sizeof (Elf64_External_Rela);
12036 }
12037 }
12038 }
12039
33e44f2e 12040 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
927be08e 12041 if (!done_something)
c72f2fb2 12042 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12043 {
12044 asection *got;
12045
12046 if (!is_ppc64_elf (ibfd))
12047 continue;
12048
12049 got = ppc64_elf_tdata (ibfd)->got;
12050 if (got != NULL)
12051 {
12052 done_something = got->rawsize != got->size;
12053 if (done_something)
12054 break;
12055 }
12056 }
12057
12058 if (done_something)
e7d1c40c 12059 (*htab->params->layout_sections_again) ();
927be08e
AM
12060
12061 /* Set up for second pass over toc sections to recalculate elf_gp
12062 on input sections. */
12063 htab->toc_bfd = NULL;
12064 htab->toc_first_sec = NULL;
12065 htab->second_toc_pass = TRUE;
12066 return done_something;
12067}
12068
12069/* Called after second pass of multitoc partitioning. */
12070
12071void
12072ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
12073{
12074 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12075
12076 /* After the second pass, toc_curr tracks the TOC offset used
12077 for code sections below in ppc64_elf_next_input_section. */
3d6f9012 12078 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
12079}
12080
9b5ecbd0
AM
12081/* No toc references were found in ISEC. If the code in ISEC makes no
12082 calls, then there's no need to use toc adjusting stubs when branching
12083 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
12084 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
12085 needed, and 2 if a cyclical call-graph was found but no other reason
12086 for a stub was detected. If called from the top level, a return of
12087 2 means the same as a return of 0. */
9b5ecbd0
AM
12088
12089static int
4ce794b7 12090toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 12091{
9b5ecbd0 12092 int ret;
70cc837d
AM
12093
12094 /* Mark this section as checked. */
12095 isec->call_check_done = 1;
9b5ecbd0 12096
772119ce
AM
12097 /* We know none of our code bearing sections will need toc stubs. */
12098 if ((isec->flags & SEC_LINKER_CREATED) != 0)
12099 return 0;
12100
eea6121a 12101 if (isec->size == 0)
082c50f8
AM
12102 return 0;
12103
4c52953f
AM
12104 if (isec->output_section == NULL)
12105 return 0;
12106
4c52953f 12107 ret = 0;
70cc837d 12108 if (isec->reloc_count != 0)
9b5ecbd0 12109 {
70cc837d
AM
12110 Elf_Internal_Rela *relstart, *rel;
12111 Elf_Internal_Sym *local_syms;
12112 struct ppc_link_hash_table *htab;
2917689a 12113
70cc837d
AM
12114 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
12115 info->keep_memory);
12116 if (relstart == NULL)
12117 return -1;
90aecf7a 12118
70cc837d
AM
12119 /* Look for branches to outside of this section. */
12120 local_syms = NULL;
12121 htab = ppc_hash_table (info);
12122 if (htab == NULL)
12123 return -1;
4c52953f 12124
70cc837d 12125 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
4c52953f 12126 {
70cc837d
AM
12127 enum elf_ppc64_reloc_type r_type;
12128 unsigned long r_symndx;
12129 struct elf_link_hash_entry *h;
12130 struct ppc_link_hash_entry *eh;
12131 Elf_Internal_Sym *sym;
12132 asection *sym_sec;
12133 struct _opd_sec_data *opd;
12134 bfd_vma sym_value;
12135 bfd_vma dest;
12136
12137 r_type = ELF64_R_TYPE (rel->r_info);
12138 if (r_type != R_PPC64_REL24
12139 && r_type != R_PPC64_REL14
12140 && r_type != R_PPC64_REL14_BRTAKEN
23cedd1d
AM
12141 && r_type != R_PPC64_REL14_BRNTAKEN
12142 && r_type != R_PPC64_PLTCALL)
70cc837d 12143 continue;
4c52953f 12144
70cc837d
AM
12145 r_symndx = ELF64_R_SYM (rel->r_info);
12146 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
12147 isec->owner))
4c52953f 12148 {
70cc837d
AM
12149 ret = -1;
12150 break;
12151 }
4c52953f 12152
70cc837d
AM
12153 /* Calls to dynamic lib functions go through a plt call stub
12154 that uses r2. */
12155 eh = (struct ppc_link_hash_entry *) h;
12156 if (eh != NULL
12157 && (eh->elf.plt.plist != NULL
12158 || (eh->oh != NULL
12159 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
12160 {
12161 ret = 1;
12162 break;
4c52953f
AM
12163 }
12164
70cc837d
AM
12165 if (sym_sec == NULL)
12166 /* Ignore other undefined symbols. */
4c52953f 12167 continue;
4c52953f 12168
70cc837d
AM
12169 /* Assume branches to other sections not included in the
12170 link need stubs too, to cover -R and absolute syms. */
12171 if (sym_sec->output_section == NULL)
12172 {
12173 ret = 1;
12174 break;
12175 }
4c52953f 12176
70cc837d
AM
12177 if (h == NULL)
12178 sym_value = sym->st_value;
12179 else
12180 {
12181 if (h->root.type != bfd_link_hash_defined
12182 && h->root.type != bfd_link_hash_defweak)
12183 abort ();
12184 sym_value = h->root.u.def.value;
12185 }
12186 sym_value += rel->r_addend;
4c52953f 12187
70cc837d
AM
12188 /* If this branch reloc uses an opd sym, find the code section. */
12189 opd = get_opd_info (sym_sec);
12190 if (opd != NULL)
12191 {
12192 if (h == NULL && opd->adjust != NULL)
12193 {
12194 long adjust;
4c52953f 12195
92a9c616 12196 adjust = opd->adjust[OPD_NDX (sym_value)];
70cc837d
AM
12197 if (adjust == -1)
12198 /* Assume deleted functions won't ever be called. */
12199 continue;
12200 sym_value += adjust;
12201 }
4c52953f 12202
aef36ac1
AM
12203 dest = opd_entry_value (sym_sec, sym_value,
12204 &sym_sec, NULL, FALSE);
70cc837d
AM
12205 if (dest == (bfd_vma) -1)
12206 continue;
12207 }
12208 else
12209 dest = (sym_value
12210 + sym_sec->output_offset
12211 + sym_sec->output_section->vma);
4c52953f 12212
70cc837d
AM
12213 /* Ignore branch to self. */
12214 if (sym_sec == isec)
12215 continue;
4c52953f 12216
70cc837d
AM
12217 /* If the called function uses the toc, we need a stub. */
12218 if (sym_sec->has_toc_reloc
12219 || sym_sec->makes_toc_func_call)
4c52953f 12220 {
70cc837d 12221 ret = 1;
4c52953f
AM
12222 break;
12223 }
70cc837d
AM
12224
12225 /* Assume any branch that needs a long branch stub might in fact
12226 need a plt_branch stub. A plt_branch stub uses r2. */
12227 else if (dest - (isec->output_offset
12228 + isec->output_section->vma
6911b7dc
AM
12229 + rel->r_offset) + (1 << 25)
12230 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
12231 ? h->other
12232 : sym->st_other))
4c52953f 12233 {
70cc837d
AM
12234 ret = 1;
12235 break;
12236 }
12237
12238 /* If calling back to a section in the process of being
12239 tested, we can't say for sure that no toc adjusting stubs
12240 are needed, so don't return zero. */
12241 else if (sym_sec->call_check_in_progress)
12242 ret = 2;
12243
12244 /* Branches to another section that itself doesn't have any TOC
12245 references are OK. Recursively call ourselves to check. */
12246 else if (!sym_sec->call_check_done)
12247 {
12248 int recur;
12249
12250 /* Mark current section as indeterminate, so that other
12251 sections that call back to current won't be marked as
12252 known. */
12253 isec->call_check_in_progress = 1;
12254 recur = toc_adjusting_stub_needed (info, sym_sec);
12255 isec->call_check_in_progress = 0;
12256
4c52953f
AM
12257 if (recur != 0)
12258 {
70cc837d
AM
12259 ret = recur;
12260 if (recur != 2)
12261 break;
4c52953f
AM
12262 }
12263 }
4c52953f 12264 }
70cc837d
AM
12265
12266 if (local_syms != NULL
12267 && (elf_symtab_hdr (isec->owner).contents
12268 != (unsigned char *) local_syms))
12269 free (local_syms);
12270 if (elf_section_data (isec)->relocs != relstart)
12271 free (relstart);
9b5ecbd0
AM
12272 }
12273
70cc837d
AM
12274 if ((ret & 1) == 0
12275 && isec->map_head.s != NULL
12276 && (strcmp (isec->output_section->name, ".init") == 0
12277 || strcmp (isec->output_section->name, ".fini") == 0))
12278 {
12279 if (isec->map_head.s->has_toc_reloc
12280 || isec->map_head.s->makes_toc_func_call)
12281 ret = 1;
12282 else if (!isec->map_head.s->call_check_done)
12283 {
12284 int recur;
12285 isec->call_check_in_progress = 1;
12286 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
12287 isec->call_check_in_progress = 0;
12288 if (recur != 0)
12289 ret = recur;
12290 }
12291 }
12292
12293 if (ret == 1)
12294 isec->makes_toc_func_call = 1;
4c52953f 12295
9b5ecbd0
AM
12296 return ret;
12297}
12298
721956f4
AM
12299/* The linker repeatedly calls this function for each input section,
12300 in the order that input sections are linked into output sections.
12301 Build lists of input sections to determine groupings between which
12302 we may insert linker stubs. */
12303
9b5ecbd0 12304bfd_boolean
4ce794b7 12305ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
12306{
12307 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12308
4dfe6ac6
NC
12309 if (htab == NULL)
12310 return FALSE;
12311
734b6cf9 12312 if ((isec->output_section->flags & SEC_CODE) != 0
6f20ed8a 12313 && isec->output_section->id < htab->sec_info_arr_size)
721956f4 12314 {
3d6f9012
AM
12315 /* This happens to make the list in reverse order,
12316 which is what we want. */
6f20ed8a
AM
12317 htab->sec_info[isec->id].u.list
12318 = htab->sec_info[isec->output_section->id].u.list;
12319 htab->sec_info[isec->output_section->id].u.list = isec;
721956f4 12320 }
ad8e1ba5 12321
4c52953f 12322 if (htab->multi_toc_needed)
9b5ecbd0 12323 {
8b974ba3
AM
12324 /* Analyse sections that aren't already flagged as needing a
12325 valid toc pointer. Exclude .fixup for the linux kernel.
12326 .fixup contains branches, but only back to the function that
12327 hit an exception. */
12328 if (!(isec->has_toc_reloc
12329 || (isec->flags & SEC_CODE) == 0
12330 || strcmp (isec->name, ".fixup") == 0
12331 || isec->call_check_done))
12332 {
12333 if (toc_adjusting_stub_needed (info, isec) < 0)
6683a28d 12334 return FALSE;
8b974ba3
AM
12335 }
12336 /* Make all sections use the TOC assigned for this object file.
12337 This will be wrong for pasted sections; We fix that in
12338 check_pasted_section(). */
12339 if (elf_gp (isec->owner) != 0)
12340 htab->toc_curr = elf_gp (isec->owner);
12341 }
12342
6f20ed8a 12343 htab->sec_info[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 12344 return TRUE;
721956f4
AM
12345}
12346
70cc837d
AM
12347/* Check that all .init and .fini sections use the same toc, if they
12348 have toc relocs. */
12349
12350static bfd_boolean
12351check_pasted_section (struct bfd_link_info *info, const char *name)
12352{
12353 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12354
12355 if (o != NULL)
12356 {
12357 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12358 bfd_vma toc_off = 0;
12359 asection *i;
12360
12361 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12362 if (i->has_toc_reloc)
12363 {
12364 if (toc_off == 0)
6f20ed8a
AM
12365 toc_off = htab->sec_info[i->id].toc_off;
12366 else if (toc_off != htab->sec_info[i->id].toc_off)
70cc837d
AM
12367 return FALSE;
12368 }
6683a28d
AM
12369
12370 if (toc_off == 0)
12371 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12372 if (i->makes_toc_func_call)
12373 {
6f20ed8a 12374 toc_off = htab->sec_info[i->id].toc_off;
6683a28d
AM
12375 break;
12376 }
12377
70cc837d
AM
12378 /* Make sure the whole pasted function uses the same toc offset. */
12379 if (toc_off != 0)
12380 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
6f20ed8a 12381 htab->sec_info[i->id].toc_off = toc_off;
70cc837d
AM
12382 }
12383 return TRUE;
12384}
12385
12386bfd_boolean
12387ppc64_elf_check_init_fini (struct bfd_link_info *info)
12388{
12389 return (check_pasted_section (info, ".init")
12390 & check_pasted_section (info, ".fini"));
12391}
12392
721956f4
AM
12393/* See whether we can group stub sections together. Grouping stub
12394 sections may result in fewer stubs. More importantly, we need to
12395 put all .init* and .fini* stubs at the beginning of the .init or
12396 .fini output sections respectively, because glibc splits the
12397 _init and _fini functions into multiple parts. Putting a stub in
12398 the middle of a function is not a good idea. */
12399
6f20ed8a
AM
12400static bfd_boolean
12401group_sections (struct bfd_link_info *info,
4ce794b7
AM
12402 bfd_size_type stub_group_size,
12403 bfd_boolean stubs_always_before_branch)
721956f4 12404{
6f20ed8a
AM
12405 struct ppc_link_hash_table *htab;
12406 asection *osec;
7c8fe5c4
AM
12407 bfd_boolean suppress_size_errors;
12408
6f20ed8a
AM
12409 htab = ppc_hash_table (info);
12410 if (htab == NULL)
12411 return FALSE;
12412
7c8fe5c4 12413 suppress_size_errors = FALSE;
7c8fe5c4
AM
12414 if (stub_group_size == 1)
12415 {
12416 /* Default values. */
12417 if (stubs_always_before_branch)
09f92717 12418 stub_group_size = 0x1e00000;
7c8fe5c4 12419 else
09f92717 12420 stub_group_size = 0x1c00000;
7c8fe5c4
AM
12421 suppress_size_errors = TRUE;
12422 }
12423
6f20ed8a 12424 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
721956f4 12425 {
6f20ed8a
AM
12426 asection *tail;
12427
12428 if (osec->id >= htab->sec_info_arr_size)
12429 continue;
12430
12431 tail = htab->sec_info[osec->id].u.list;
734b6cf9 12432 while (tail != NULL)
721956f4 12433 {
734b6cf9
AM
12434 asection *curr;
12435 asection *prev;
12436 bfd_size_type total;
12437 bfd_boolean big_sec;
12438 bfd_vma curr_toc;
6f20ed8a 12439 struct map_stub *group;
09f92717 12440 bfd_size_type group_size;
734b6cf9
AM
12441
12442 curr = tail;
eea6121a 12443 total = tail->size;
09f92717
AM
12444 group_size = (ppc64_elf_section_data (tail) != NULL
12445 && ppc64_elf_section_data (tail)->has_14bit_branch
12446 ? stub_group_size >> 10 : stub_group_size);
12447
12448 big_sec = total > group_size;
7c8fe5c4 12449 if (big_sec && !suppress_size_errors)
695344c0 12450 /* xgettext:c-format */
871b3ab2 12451 _bfd_error_handler (_("%pB section %pA exceeds stub group size"),
4eca0228 12452 tail->owner, tail);
6f20ed8a 12453 curr_toc = htab->sec_info[tail->id].toc_off;
734b6cf9 12454
6f20ed8a 12455 while ((prev = htab->sec_info[curr->id].u.list) != NULL
734b6cf9 12456 && ((total += curr->output_offset - prev->output_offset)
6bee8834
AM
12457 < (ppc64_elf_section_data (prev) != NULL
12458 && ppc64_elf_section_data (prev)->has_14bit_branch
09f92717 12459 ? (group_size = stub_group_size >> 10) : group_size))
6f20ed8a 12460 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12461 curr = prev;
12462
12463 /* OK, the size from the start of CURR to the end is less
09f92717 12464 than group_size and thus can be handled by one stub
734b6cf9 12465 section. (or the tail section is itself larger than
09f92717
AM
12466 group_size, in which case we may be toast.) We should
12467 really be keeping track of the total size of stubs added
12468 here, as stubs contribute to the final output section
12469 size. That's a little tricky, and this way will only
12470 break if stubs added make the total size more than 2^25,
12471 ie. for the default stub_group_size, if stubs total more
12472 than 2097152 bytes, or nearly 75000 plt call stubs. */
6f20ed8a
AM
12473 group = bfd_alloc (curr->owner, sizeof (*group));
12474 if (group == NULL)
12475 return FALSE;
12476 group->link_sec = curr;
12477 group->stub_sec = NULL;
a4b6fadd 12478 group->needs_save_res = 0;
d4aaa2a0 12479 group->tls_get_addr_opt_bctrl = -1u;
a4b6fadd
AM
12480 group->next = htab->group;
12481 htab->group = group;
734b6cf9 12482 do
721956f4 12483 {
6f20ed8a 12484 prev = htab->sec_info[tail->id].u.list;
734b6cf9 12485 /* Set up this stub group. */
6f20ed8a 12486 htab->sec_info[tail->id].u.group = group;
721956f4 12487 }
734b6cf9
AM
12488 while (tail != curr && (tail = prev) != NULL);
12489
09f92717 12490 /* But wait, there's more! Input sections up to group_size
734b6cf9
AM
12491 bytes before the stub section can be handled by it too.
12492 Don't do this if we have a really large section after the
12493 stubs, as adding more stubs increases the chance that
12494 branches may not reach into the stub section. */
12495 if (!stubs_always_before_branch && !big_sec)
12496 {
12497 total = 0;
12498 while (prev != NULL
12499 && ((total += tail->output_offset - prev->output_offset)
6bee8834
AM
12500 < (ppc64_elf_section_data (prev) != NULL
12501 && ppc64_elf_section_data (prev)->has_14bit_branch
09f92717 12502 ? (group_size = stub_group_size >> 10) : group_size))
6f20ed8a 12503 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
12504 {
12505 tail = prev;
6f20ed8a
AM
12506 prev = htab->sec_info[tail->id].u.list;
12507 htab->sec_info[tail->id].u.group = group;
734b6cf9
AM
12508 }
12509 }
12510 tail = prev;
721956f4
AM
12511 }
12512 }
6f20ed8a 12513 return TRUE;
721956f4
AM
12514}
12515
58d180e8
AM
12516static const unsigned char glink_eh_frame_cie[] =
12517{
12518 0, 0, 0, 16, /* length. */
12519 0, 0, 0, 0, /* id. */
12520 1, /* CIE version. */
12521 'z', 'R', 0, /* Augmentation string. */
12522 4, /* Code alignment. */
12523 0x78, /* Data alignment. */
12524 65, /* RA reg. */
12525 1, /* Augmentation size. */
12526 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
2e0ce1c8 12527 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
58d180e8
AM
12528};
12529
d4aaa2a0
AM
12530static size_t
12531stub_eh_frame_size (struct map_stub *group, size_t align)
12532{
12533 size_t this_size = 17;
12534 if (group->tls_get_addr_opt_bctrl != -1u)
12535 {
12536 unsigned int to_bctrl = group->tls_get_addr_opt_bctrl / 4;
12537 if (to_bctrl < 64)
12538 this_size += 1;
12539 else if (to_bctrl < 256)
12540 this_size += 2;
12541 else if (to_bctrl < 65536)
12542 this_size += 3;
12543 else
12544 this_size += 5;
12545 this_size += 6;
12546 }
12547 this_size = (this_size + align - 1) & -align;
12548 return this_size;
12549}
12550
d969d15f
AM
12551/* Stripping output sections is normally done before dynamic section
12552 symbols have been allocated. This function is called later, and
12553 handles cases like htab->brlt which is mapped to its own output
12554 section. */
12555
12556static void
12557maybe_strip_output (struct bfd_link_info *info, asection *isec)
12558{
12559 if (isec->size == 0
12560 && isec->output_section->size == 0
53d8967a 12561 && !(isec->output_section->flags & SEC_KEEP)
d969d15f
AM
12562 && !bfd_section_removed_from_list (info->output_bfd,
12563 isec->output_section)
12564 && elf_section_data (isec->output_section)->dynindx == 0)
12565 {
12566 isec->output_section->flags |= SEC_EXCLUDE;
12567 bfd_section_list_remove (info->output_bfd, isec->output_section);
12568 info->output_bfd->section_count--;
12569 }
12570}
12571
721956f4
AM
12572/* Determine and set the size of the stub section for a final link.
12573
12574 The basic idea here is to examine all the relocations looking for
12575 PC-relative calls to a target that is unreachable with a "bl"
12576 instruction. */
12577
b34976b6 12578bfd_boolean
e7d1c40c 12579ppc64_elf_size_stubs (struct bfd_link_info *info)
721956f4
AM
12580{
12581 bfd_size_type stub_group_size;
b34976b6 12582 bfd_boolean stubs_always_before_branch;
721956f4
AM
12583 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12584
4dfe6ac6
NC
12585 if (htab == NULL)
12586 return FALSE;
12587
0e1862bb 12588 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
e7d1c40c 12589 htab->params->plt_thread_safe = 1;
b9e5796b 12590 if (!htab->opd_abi)
e7d1c40c
AM
12591 htab->params->plt_thread_safe = 0;
12592 else if (htab->params->plt_thread_safe == -1)
794e51c0 12593 {
e2458743 12594 static const char *const thread_starter[] =
794e51c0
AM
12595 {
12596 "pthread_create",
12597 /* libstdc++ */
12598 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
12599 /* librt */
12600 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
12601 "mq_notify", "create_timer",
12602 /* libanl */
12603 "getaddrinfo_a",
12604 /* libgomp */
2300b5a1 12605 "GOMP_parallel",
794e51c0 12606 "GOMP_parallel_start",
2300b5a1 12607 "GOMP_parallel_loop_static",
794e51c0 12608 "GOMP_parallel_loop_static_start",
2300b5a1 12609 "GOMP_parallel_loop_dynamic",
794e51c0 12610 "GOMP_parallel_loop_dynamic_start",
2300b5a1 12611 "GOMP_parallel_loop_guided",
794e51c0 12612 "GOMP_parallel_loop_guided_start",
2300b5a1 12613 "GOMP_parallel_loop_runtime",
794e51c0 12614 "GOMP_parallel_loop_runtime_start",
2300b5a1 12615 "GOMP_parallel_sections",
68ffbac6 12616 "GOMP_parallel_sections_start",
f9dffbf0
AM
12617 /* libgo */
12618 "__go_go",
794e51c0
AM
12619 };
12620 unsigned i;
12621
a4b6fadd 12622 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
794e51c0
AM
12623 {
12624 struct elf_link_hash_entry *h;
12625 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
12626 FALSE, FALSE, TRUE);
e7d1c40c
AM
12627 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
12628 if (htab->params->plt_thread_safe)
794e51c0
AM
12629 break;
12630 }
12631 }
e7d1c40c
AM
12632 stubs_always_before_branch = htab->params->group_size < 0;
12633 if (htab->params->group_size < 0)
12634 stub_group_size = -htab->params->group_size;
721956f4 12635 else
e7d1c40c 12636 stub_group_size = htab->params->group_size;
721956f4 12637
6f20ed8a
AM
12638 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
12639 return FALSE;
721956f4 12640
c9301e31
AM
12641#define STUB_SHRINK_ITER 20
12642 /* Loop until no stubs added. After iteration 20 of this loop we may
12643 exit on a stub section shrinking. This is to break out of a
12644 pathological case where adding stubs on one iteration decreases
12645 section gaps (perhaps due to alignment), which then requires
12646 fewer or smaller stubs on the next iteration. */
12647
721956f4
AM
12648 while (1)
12649 {
12650 bfd *input_bfd;
12651 unsigned int bfd_indx;
a4b6fadd 12652 struct map_stub *group;
721956f4
AM
12653
12654 htab->stub_iteration += 1;
721956f4
AM
12655
12656 for (input_bfd = info->input_bfds, bfd_indx = 0;
12657 input_bfd != NULL;
c72f2fb2 12658 input_bfd = input_bfd->link.next, bfd_indx++)
721956f4
AM
12659 {
12660 Elf_Internal_Shdr *symtab_hdr;
12661 asection *section;
6cdc0ccc 12662 Elf_Internal_Sym *local_syms = NULL;
721956f4 12663
0c8d6e5c 12664 if (!is_ppc64_elf (input_bfd))
67f93c31
AM
12665 continue;
12666
721956f4 12667 /* We'll need the symbol table in a second. */
0ffa91dd 12668 symtab_hdr = &elf_symtab_hdr (input_bfd);
721956f4
AM
12669 if (symtab_hdr->sh_info == 0)
12670 continue;
12671
721956f4
AM
12672 /* Walk over each section attached to the input bfd. */
12673 for (section = input_bfd->sections;
12674 section != NULL;
12675 section = section->next)
12676 {
721956f4 12677 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
12678
12679 /* If there aren't any relocs, then there's nothing more
12680 to do. */
12681 if ((section->flags & SEC_RELOC) == 0
12c0f757
AM
12682 || (section->flags & SEC_ALLOC) == 0
12683 || (section->flags & SEC_LOAD) == 0
12684 || (section->flags & SEC_CODE) == 0
721956f4
AM
12685 || section->reloc_count == 0)
12686 continue;
12687
12688 /* If this section is a link-once section that will be
12689 discarded, then don't create any stubs. */
12690 if (section->output_section == NULL
927be08e 12691 || section->output_section->owner != info->output_bfd)
721956f4
AM
12692 continue;
12693
1e2f5b6e
AM
12694 /* Get the relocs. */
12695 internal_relocs
4ce794b7 12696 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 12697 info->keep_memory);
721956f4 12698 if (internal_relocs == NULL)
1e2f5b6e 12699 goto error_ret_free_local;
721956f4
AM
12700
12701 /* Now examine each relocation. */
12702 irela = internal_relocs;
12703 irelaend = irela + section->reloc_count;
12704 for (; irela < irelaend; irela++)
12705 {
4ce794b7
AM
12706 enum elf_ppc64_reloc_type r_type;
12707 unsigned int r_indx;
721956f4
AM
12708 enum ppc_stub_type stub_type;
12709 struct ppc_stub_hash_entry *stub_entry;
8387904d 12710 asection *sym_sec, *code_sec;
e054468f 12711 bfd_vma sym_value, code_value;
721956f4 12712 bfd_vma destination;
6911b7dc 12713 unsigned long local_off;
8843416a 12714 bfd_boolean ok_dest;
721956f4 12715 struct ppc_link_hash_entry *hash;
8387904d 12716 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
12717 struct elf_link_hash_entry *h;
12718 Elf_Internal_Sym *sym;
721956f4
AM
12719 char *stub_name;
12720 const asection *id_sec;
74f0fb50 12721 struct _opd_sec_data *opd;
e054468f 12722 struct plt_entry *plt_ent;
721956f4
AM
12723
12724 r_type = ELF64_R_TYPE (irela->r_info);
12725 r_indx = ELF64_R_SYM (irela->r_info);
12726
4ce794b7 12727 if (r_type >= R_PPC64_max)
721956f4
AM
12728 {
12729 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 12730 goto error_ret_free_internal;
721956f4
AM
12731 }
12732
12733 /* Only look for stubs on branch instructions. */
4ce794b7
AM
12734 if (r_type != R_PPC64_REL24
12735 && r_type != R_PPC64_REL14
12736 && r_type != R_PPC64_REL14_BRTAKEN
12737 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
12738 continue;
12739
12740 /* Now determine the call target, its name, value,
12741 section. */
411e1bfb
AM
12742 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12743 r_indx, input_bfd))
12744 goto error_ret_free_internal;
12745 hash = (struct ppc_link_hash_entry *) h;
12746
8843416a 12747 ok_dest = FALSE;
8387904d 12748 fdh = NULL;
7fe2b9a6 12749 sym_value = 0;
411e1bfb 12750 if (hash == NULL)
721956f4 12751 {
411e1bfb 12752 sym_value = sym->st_value;
c27b8c2a
AM
12753 if (sym_sec != NULL
12754 && sym_sec->output_section != NULL)
12755 ok_dest = TRUE;
721956f4 12756 }
7fe2b9a6
AM
12757 else if (hash->elf.root.type == bfd_link_hash_defined
12758 || hash->elf.root.type == bfd_link_hash_defweak)
12759 {
12760 sym_value = hash->elf.root.u.def.value;
12761 if (sym_sec->output_section != NULL)
12762 ok_dest = TRUE;
12763 }
12764 else if (hash->elf.root.type == bfd_link_hash_undefweak
12765 || hash->elf.root.type == bfd_link_hash_undefined)
721956f4 12766 {
99877b66 12767 /* Recognise an old ABI func code entry sym, and
7fe2b9a6
AM
12768 use the func descriptor sym instead if it is
12769 defined. */
ceb1f1ef 12770 if (hash->elf.root.root.string[0] == '.'
8c5b4e52 12771 && hash->oh != NULL)
8387904d 12772 {
8c5b4e52 12773 fdh = ppc_follow_link (hash->oh);
8387904d
AM
12774 if (fdh->elf.root.type == bfd_link_hash_defined
12775 || fdh->elf.root.type == bfd_link_hash_defweak)
12776 {
12777 sym_sec = fdh->elf.root.u.def.section;
12778 sym_value = fdh->elf.root.u.def.value;
12779 if (sym_sec->output_section != NULL)
12780 ok_dest = TRUE;
12781 }
99877b66
AM
12782 else
12783 fdh = NULL;
8387904d 12784 }
7fe2b9a6
AM
12785 }
12786 else
12787 {
12788 bfd_set_error (bfd_error_bad_value);
12789 goto error_ret_free_internal;
721956f4
AM
12790 }
12791
8843416a 12792 destination = 0;
6911b7dc 12793 local_off = 0;
8843416a
AM
12794 if (ok_dest)
12795 {
12796 sym_value += irela->r_addend;
12797 destination = (sym_value
12798 + sym_sec->output_offset
12799 + sym_sec->output_section->vma);
6911b7dc
AM
12800 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12801 ? hash->elf.other
12802 : sym->st_other);
8843416a
AM
12803 }
12804
8387904d 12805 code_sec = sym_sec;
e054468f 12806 code_value = sym_value;
74f0fb50
AM
12807 opd = get_opd_info (sym_sec);
12808 if (opd != NULL)
8387904d
AM
12809 {
12810 bfd_vma dest;
12811
74f0fb50 12812 if (hash == NULL && opd->adjust != NULL)
8387904d 12813 {
51aecdc5 12814 long adjust = opd->adjust[OPD_NDX (sym_value)];
8387904d
AM
12815 if (adjust == -1)
12816 continue;
e054468f 12817 code_value += adjust;
8387904d
AM
12818 sym_value += adjust;
12819 }
12820 dest = opd_entry_value (sym_sec, sym_value,
aef36ac1 12821 &code_sec, &code_value, FALSE);
8387904d
AM
12822 if (dest != (bfd_vma) -1)
12823 {
12824 destination = dest;
12825 if (fdh != NULL)
12826 {
12827 /* Fixup old ABI sym to point at code
12828 entry. */
99877b66 12829 hash->elf.root.type = bfd_link_hash_defweak;
8387904d 12830 hash->elf.root.u.def.section = code_sec;
e054468f 12831 hash->elf.root.u.def.value = code_value;
8387904d
AM
12832 }
12833 }
12834 }
12835
721956f4 12836 /* Determine what (if any) linker stub is needed. */
e054468f 12837 plt_ent = NULL;
721956f4 12838 stub_type = ppc_type_of_stub (section, irela, &hash,
6911b7dc
AM
12839 &plt_ent, destination,
12840 local_off);
ad8e1ba5
AM
12841
12842 if (stub_type != ppc_stub_plt_call)
12843 {
12844 /* Check whether we need a TOC adjusting stub.
12845 Since the linker pastes together pieces from
12846 different object files when creating the
12847 _init and _fini functions, it may be that a
12848 call to what looks like a local sym is in
12849 fact a call needing a TOC adjustment. */
8387904d
AM
12850 if (code_sec != NULL
12851 && code_sec->output_section != NULL
6f20ed8a
AM
12852 && (htab->sec_info[code_sec->id].toc_off
12853 != htab->sec_info[section->id].toc_off)
4c52953f
AM
12854 && (code_sec->has_toc_reloc
12855 || code_sec->makes_toc_func_call))
ad8e1ba5
AM
12856 stub_type = ppc_stub_long_branch_r2off;
12857 }
12858
721956f4
AM
12859 if (stub_type == ppc_stub_none)
12860 continue;
12861
411e1bfb
AM
12862 /* __tls_get_addr calls might be eliminated. */
12863 if (stub_type != ppc_stub_plt_call
12864 && hash != NULL
8387904d
AM
12865 && (hash == htab->tls_get_addr
12866 || hash == htab->tls_get_addr_fd)
411e1bfb
AM
12867 && section->has_tls_reloc
12868 && irela != internal_relocs)
12869 {
12870 /* Get tls info. */
f961d9dd 12871 unsigned char *tls_mask;
411e1bfb 12872
3a71aa26 12873 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
411e1bfb
AM
12874 irela - 1, input_bfd))
12875 goto error_ret_free_internal;
37da22e5 12876 if ((*tls_mask & TLS_TLS) != 0)
411e1bfb
AM
12877 continue;
12878 }
12879
f378ab09 12880 if (stub_type == ppc_stub_plt_call)
794e51c0 12881 {
6e1816be
AM
12882 if (!htab->opd_abi
12883 && htab->params->plt_localentry0 != 0
12884 && is_elfv2_localentry0 (&hash->elf))
12885 htab->has_plt_localentry0 = 1;
12886 else if (irela + 1 < irelaend
12887 && irela[1].r_offset == irela->r_offset + 4
12888 && (ELF64_R_TYPE (irela[1].r_info)
12889 == R_PPC64_TOCSAVE))
f378ab09
AM
12890 {
12891 if (!tocsave_find (htab, INSERT,
12892 &local_syms, irela + 1, input_bfd))
12893 goto error_ret_free_internal;
12894 }
f378ab09
AM
12895 else
12896 stub_type = ppc_stub_plt_call_r2save;
794e51c0 12897 }
3b421ab3 12898
721956f4 12899 /* Support for grouping stub sections. */
6f20ed8a 12900 id_sec = htab->sec_info[section->id].u.group->link_sec;
721956f4
AM
12901
12902 /* Get the name of this stub. */
12903 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
12904 if (!stub_name)
12905 goto error_ret_free_internal;
12906
12907 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 12908 stub_name, FALSE, FALSE);
721956f4
AM
12909 if (stub_entry != NULL)
12910 {
12911 /* The proper stub has already been created. */
12912 free (stub_name);
794e51c0
AM
12913 if (stub_type == ppc_stub_plt_call_r2save)
12914 stub_entry->stub_type = stub_type;
721956f4
AM
12915 continue;
12916 }
12917
25f53a85 12918 stub_entry = ppc_add_stub (stub_name, section, info);
721956f4
AM
12919 if (stub_entry == NULL)
12920 {
12921 free (stub_name);
6cdc0ccc
AM
12922 error_ret_free_internal:
12923 if (elf_section_data (section)->relocs == NULL)
12924 free (internal_relocs);
12925 error_ret_free_local:
12926 if (local_syms != NULL
12927 && (symtab_hdr->contents
12928 != (unsigned char *) local_syms))
12929 free (local_syms);
b34976b6 12930 return FALSE;
721956f4
AM
12931 }
12932
ad8e1ba5 12933 stub_entry->stub_type = stub_type;
794e51c0
AM
12934 if (stub_type != ppc_stub_plt_call
12935 && stub_type != ppc_stub_plt_call_r2save)
e054468f
AM
12936 {
12937 stub_entry->target_value = code_value;
12938 stub_entry->target_section = code_sec;
12939 }
12940 else
12941 {
12942 stub_entry->target_value = sym_value;
12943 stub_entry->target_section = sym_sec;
12944 }
721956f4 12945 stub_entry->h = hash;
e054468f 12946 stub_entry->plt_ent = plt_ent;
2d7ad24e
AM
12947 stub_entry->symtype
12948 = hash ? hash->elf.type : ELF_ST_TYPE (sym->st_info);
6911b7dc 12949 stub_entry->other = hash ? hash->elf.other : sym->st_other;
ee75fd95
AM
12950
12951 if (stub_entry->h != NULL)
12952 htab->stub_globals += 1;
721956f4
AM
12953 }
12954
12955 /* We're done with the internal relocs, free them. */
6cdc0ccc 12956 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 12957 free (internal_relocs);
721956f4 12958 }
6cdc0ccc
AM
12959
12960 if (local_syms != NULL
12961 && symtab_hdr->contents != (unsigned char *) local_syms)
12962 {
12963 if (!info->keep_memory)
12964 free (local_syms);
12965 else
12966 symtab_hdr->contents = (unsigned char *) local_syms;
12967 }
721956f4
AM
12968 }
12969
5c3dead3 12970 /* We may have added some stubs. Find out the new size of the
721956f4 12971 stub sections. */
d4aaa2a0
AM
12972 for (group = htab->group; group != NULL; group = group->next)
12973 if (group->stub_sec != NULL)
ee75fd95 12974 {
d4aaa2a0
AM
12975 asection *stub_sec = group->stub_sec;
12976
ea3d7d1c
AM
12977 if (htab->stub_iteration <= STUB_SHRINK_ITER
12978 || stub_sec->rawsize < stub_sec->size)
12979 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
12980 stub_sec->rawsize = stub_sec->size;
ee75fd95
AM
12981 stub_sec->size = 0;
12982 stub_sec->reloc_count = 0;
84f5d08e 12983 stub_sec->flags &= ~SEC_RELOC;
ee75fd95 12984 }
eea6121a 12985
ba21f564
AM
12986 if (htab->stub_iteration <= STUB_SHRINK_ITER
12987 || htab->brlt->rawsize < htab->brlt->size)
12988 htab->brlt->rawsize = htab->brlt->size;
eea6121a 12989 htab->brlt->size = 0;
84f5d08e
AM
12990 htab->brlt->reloc_count = 0;
12991 htab->brlt->flags &= ~SEC_RELOC;
ee75fd95 12992 if (htab->relbrlt != NULL)
eea6121a 12993 htab->relbrlt->size = 0;
721956f4 12994
63bc6f6c 12995 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4 12996
a4b6fadd
AM
12997 for (group = htab->group; group != NULL; group = group->next)
12998 if (group->needs_save_res)
12999 group->stub_sec->size += htab->sfpr->size;
13000
176a0d42
AM
13001 if (info->emitrelocations
13002 && htab->glink != NULL && htab->glink->size != 0)
13003 {
13004 htab->glink->reloc_count = 1;
13005 htab->glink->flags |= SEC_RELOC;
13006 }
13007
58d180e8
AM
13008 if (htab->glink_eh_frame != NULL
13009 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
2d0d44d5 13010 && htab->glink_eh_frame->output_section->size > 8)
58d180e8 13011 {
2e0ce1c8 13012 size_t size = 0, align = 4;
58d180e8 13013
d4aaa2a0
AM
13014 for (group = htab->group; group != NULL; group = group->next)
13015 if (group->stub_sec != NULL)
13016 size += stub_eh_frame_size (group, align);
58d180e8 13017 if (htab->glink != NULL && htab->glink->size != 0)
2e0ce1c8 13018 size += (24 + align - 1) & -align;
58d180e8 13019 if (size != 0)
2e0ce1c8
AM
13020 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
13021 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
13022 size = (size + align - 1) & -align;
58d180e8
AM
13023 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
13024 htab->glink_eh_frame->size = size;
13025 }
13026
e7d1c40c 13027 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
13028 for (group = htab->group; group != NULL; group = group->next)
13029 if (group->stub_sec != NULL)
691d2e9a
AM
13030 {
13031 int align = abs (htab->params->plt_stub_align);
13032 group->stub_sec->size
13033 = (group->stub_sec->size + (1 << align) - 1) & -(1 << align);
13034 }
d4aaa2a0
AM
13035
13036 for (group = htab->group; group != NULL; group = group->next)
13037 if (group->stub_sec != NULL
13038 && group->stub_sec->rawsize != group->stub_sec->size
c9301e31 13039 && (htab->stub_iteration <= STUB_SHRINK_ITER
d4aaa2a0 13040 || group->stub_sec->rawsize < group->stub_sec->size))
5c3dead3
AM
13041 break;
13042
d4aaa2a0 13043 if (group == NULL
ba21f564
AM
13044 && (htab->brlt->rawsize == htab->brlt->size
13045 || (htab->stub_iteration > STUB_SHRINK_ITER
13046 && htab->brlt->rawsize > htab->brlt->size))
58d180e8
AM
13047 && (htab->glink_eh_frame == NULL
13048 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
5c3dead3
AM
13049 break;
13050
721956f4 13051 /* Ask the linker to do its stuff. */
e7d1c40c 13052 (*htab->params->layout_sections_again) ();
721956f4
AM
13053 }
13054
da44f4e5
AM
13055 if (htab->glink_eh_frame != NULL
13056 && htab->glink_eh_frame->size != 0)
13057 {
13058 bfd_vma val;
13059 bfd_byte *p, *last_fde;
13060 size_t last_fde_len, size, align, pad;
d4aaa2a0 13061 struct map_stub *group;
da44f4e5
AM
13062
13063 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
13064 if (p == NULL)
13065 return FALSE;
13066 htab->glink_eh_frame->contents = p;
13067 last_fde = p;
2e0ce1c8 13068 align = 4;
da44f4e5
AM
13069
13070 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
13071 /* CIE length (rewrite in case little-endian). */
2e0ce1c8 13072 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4;
da44f4e5 13073 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
2e0ce1c8 13074 p += last_fde_len + 4;
da44f4e5 13075
d4aaa2a0
AM
13076 for (group = htab->group; group != NULL; group = group->next)
13077 if (group->stub_sec != NULL)
da44f4e5
AM
13078 {
13079 last_fde = p;
d4aaa2a0 13080 last_fde_len = stub_eh_frame_size (group, align) - 4;
da44f4e5 13081 /* FDE length. */
2e0ce1c8 13082 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13083 p += 4;
13084 /* CIE pointer. */
13085 val = p - htab->glink_eh_frame->contents;
13086 bfd_put_32 (htab->elf.dynobj, val, p);
13087 p += 4;
13088 /* Offset to stub section, written later. */
13089 p += 4;
13090 /* stub section size. */
d4aaa2a0 13091 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p);
da44f4e5
AM
13092 p += 4;
13093 /* Augmentation. */
13094 p += 1;
d4aaa2a0
AM
13095 if (group->tls_get_addr_opt_bctrl != -1u)
13096 {
13097 unsigned int to_bctrl = group->tls_get_addr_opt_bctrl / 4;
13098
13099 /* This FDE needs more than just the default.
13100 Describe __tls_get_addr_opt stub LR. */
13101 if (to_bctrl < 64)
13102 *p++ = DW_CFA_advance_loc + to_bctrl;
13103 else if (to_bctrl < 256)
13104 {
13105 *p++ = DW_CFA_advance_loc1;
13106 *p++ = to_bctrl;
13107 }
13108 else if (to_bctrl < 65536)
13109 {
13110 *p++ = DW_CFA_advance_loc2;
13111 bfd_put_16 (htab->elf.dynobj, to_bctrl, p);
13112 p += 2;
13113 }
13114 else
13115 {
13116 *p++ = DW_CFA_advance_loc4;
13117 bfd_put_32 (htab->elf.dynobj, to_bctrl, p);
13118 p += 4;
13119 }
13120 *p++ = DW_CFA_offset_extended_sf;
13121 *p++ = 65;
13122 *p++ = -(STK_LINKER (htab) / 8) & 0x7f;
13123 *p++ = DW_CFA_advance_loc + 4;
13124 *p++ = DW_CFA_restore_extended;
13125 *p++ = 65;
13126 }
da44f4e5 13127 /* Pad. */
d4aaa2a0 13128 p = last_fde + last_fde_len + 4;
da44f4e5
AM
13129 }
13130 if (htab->glink != NULL && htab->glink->size != 0)
13131 {
13132 last_fde = p;
2e0ce1c8 13133 last_fde_len = ((24 + align - 1) & -align) - 4;
da44f4e5 13134 /* FDE length. */
2e0ce1c8 13135 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
13136 p += 4;
13137 /* CIE pointer. */
13138 val = p - htab->glink_eh_frame->contents;
13139 bfd_put_32 (htab->elf.dynobj, val, p);
13140 p += 4;
13141 /* Offset to .glink, written later. */
13142 p += 4;
13143 /* .glink size. */
13144 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
13145 p += 4;
13146 /* Augmentation. */
13147 p += 1;
13148
13149 *p++ = DW_CFA_advance_loc + 1;
13150 *p++ = DW_CFA_register;
13151 *p++ = 65;
9f08fa5c 13152 *p++ = htab->opd_abi ? 12 : 0;
15a3a14f 13153 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7);
da44f4e5
AM
13154 *p++ = DW_CFA_restore_extended;
13155 *p++ = 65;
2e0ce1c8 13156 p += ((24 + align - 1) & -align) - 24;
da44f4e5
AM
13157 }
13158 /* Subsume any padding into the last FDE if user .eh_frame
13159 sections are aligned more than glink_eh_frame. Otherwise any
13160 zero padding will be seen as a terminator. */
2e0ce1c8 13161 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
da44f4e5 13162 size = p - htab->glink_eh_frame->contents;
2e0ce1c8 13163 pad = ((size + align - 1) & -align) - size;
da44f4e5
AM
13164 htab->glink_eh_frame->size = size + pad;
13165 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
13166 }
13167
d969d15f
AM
13168 maybe_strip_output (info, htab->brlt);
13169 if (htab->glink_eh_frame != NULL)
13170 maybe_strip_output (info, htab->glink_eh_frame);
721956f4 13171
b34976b6 13172 return TRUE;
721956f4
AM
13173}
13174
13175/* Called after we have determined section placement. If sections
805fc799 13176 move, we'll be called again. Provide a value for TOCstart. */
721956f4 13177
805fc799 13178bfd_vma
1c865ab2 13179ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
721956f4 13180{
805fc799 13181 asection *s;
a27e685f 13182 bfd_vma TOCstart, adjust;
721956f4 13183
43417696
AM
13184 if (info != NULL)
13185 {
13186 struct elf_link_hash_entry *h;
13187 struct elf_link_hash_table *htab = elf_hash_table (info);
13188
13189 if (is_elf_hash_table (htab)
13190 && htab->hgot != NULL)
13191 h = htab->hgot;
13192 else
13193 {
13194 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
13195 if (is_elf_hash_table (htab))
13196 htab->hgot = h;
13197 }
13198 if (h != NULL
13199 && h->root.type == bfd_link_hash_defined
13200 && !h->root.linker_def
13201 && (!is_elf_hash_table (htab)
13202 || h->def_regular))
13203 {
13204 TOCstart = (h->root.u.def.value - TOC_BASE_OFF
13205 + h->root.u.def.section->output_offset
13206 + h->root.u.def.section->output_section->vma);
13207 _bfd_set_gp_value (obfd, TOCstart);
13208 return TOCstart;
13209 }
13210 }
13211
805fc799
AM
13212 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
13213 order. The TOC starts where the first of these sections starts. */
13214 s = bfd_get_section_by_name (obfd, ".got");
e054468f 13215 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13216 s = bfd_get_section_by_name (obfd, ".toc");
e054468f 13217 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13218 s = bfd_get_section_by_name (obfd, ".tocbss");
e054468f 13219 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 13220 s = bfd_get_section_by_name (obfd, ".plt");
e054468f 13221 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799
AM
13222 {
13223 /* This may happen for
13224 o references to TOC base (SYM@toc / TOC[tc0]) without a
13225 .toc directive
13226 o bad linker script
13227 o --gc-sections and empty TOC sections
13228
13229 FIXME: Warn user? */
13230
13231 /* Look for a likely section. We probably won't even be
13232 using TOCstart. */
13233 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13234 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
13235 | SEC_EXCLUDE))
805fc799
AM
13236 == (SEC_ALLOC | SEC_SMALL_DATA))
13237 break;
721956f4 13238 if (s == NULL)
805fc799 13239 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13240 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
805fc799
AM
13241 == (SEC_ALLOC | SEC_SMALL_DATA))
13242 break;
721956f4 13243 if (s == NULL)
805fc799 13244 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
13245 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
13246 == SEC_ALLOC)
805fc799 13247 break;
721956f4 13248 if (s == NULL)
805fc799 13249 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 13250 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
805fc799
AM
13251 break;
13252 }
721956f4 13253
805fc799
AM
13254 TOCstart = 0;
13255 if (s != NULL)
13256 TOCstart = s->output_section->vma + s->output_offset;
721956f4 13257
a27e685f
AM
13258 /* Force alignment. */
13259 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
13260 TOCstart -= adjust;
1c865ab2
AM
13261 _bfd_set_gp_value (obfd, TOCstart);
13262
810d4e75 13263 if (info != NULL && s != NULL)
1c865ab2
AM
13264 {
13265 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13266
810d4e75
AM
13267 if (htab != NULL)
13268 {
13269 if (htab->elf.hgot != NULL)
13270 {
a27e685f 13271 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
810d4e75
AM
13272 htab->elf.hgot->root.u.def.section = s;
13273 }
13274 }
13275 else
1c865ab2 13276 {
810d4e75
AM
13277 struct bfd_link_hash_entry *bh = NULL;
13278 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
a27e685f
AM
13279 s, TOC_BASE_OFF - adjust,
13280 NULL, FALSE, FALSE, &bh);
1c865ab2
AM
13281 }
13282 }
805fc799 13283 return TOCstart;
721956f4
AM
13284}
13285
a345bc8d 13286/* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
49c09209 13287 write out any global entry stubs, and PLT relocations. */
a345bc8d
AM
13288
13289static bfd_boolean
49c09209 13290build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf)
a345bc8d
AM
13291{
13292 struct bfd_link_info *info;
13293 struct ppc_link_hash_table *htab;
49c09209 13294 struct plt_entry *ent;
a345bc8d
AM
13295 asection *s;
13296
13297 if (h->root.type == bfd_link_hash_indirect)
13298 return TRUE;
13299
49c09209
AM
13300 info = inf;
13301 htab = ppc_hash_table (info);
13302 if (htab == NULL)
13303 return FALSE;
13304
13305 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13306 if (ent->plt.offset != (bfd_vma) -1)
13307 {
13308 /* This symbol has an entry in the procedure linkage
13309 table. Set it up. */
13310 Elf_Internal_Rela rela;
2d7ad24e 13311 asection *plt, *relplt;
49c09209
AM
13312 bfd_byte *loc;
13313
13314 if (!htab->elf.dynamic_sections_created
13315 || h->dynindx == -1)
13316 {
13317 if (!(h->def_regular
13318 && (h->root.type == bfd_link_hash_defined
13319 || h->root.type == bfd_link_hash_defweak)))
13320 continue;
2d7ad24e
AM
13321 if (h->type == STT_GNU_IFUNC)
13322 {
13323 plt = htab->elf.iplt;
13324 relplt = htab->elf.irelplt;
13325 htab->local_ifunc_resolver = 1;
13326 if (htab->opd_abi)
13327 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13328 else
13329 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13330 }
49c09209 13331 else
2d7ad24e
AM
13332 {
13333 plt = htab->pltlocal;
13334 if (bfd_link_pic (info))
13335 {
13336 relplt = htab->relpltlocal;
13337 if (htab->opd_abi)
13338 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13339 else
13340 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13341 }
13342 else
13343 relplt = NULL;
13344 }
49c09209
AM
13345 rela.r_addend = (h->root.u.def.value
13346 + h->root.u.def.section->output_offset
13347 + h->root.u.def.section->output_section->vma
13348 + ent->addend);
2d7ad24e
AM
13349
13350 if (relplt == NULL)
13351 {
13352 loc = plt->contents + ent->plt.offset;
13353 bfd_put_64 (info->output_bfd, rela.r_addend, loc);
13354 if (htab->opd_abi)
13355 {
13356 bfd_vma toc = elf_gp (info->output_bfd);
13357 toc += htab->sec_info[h->root.u.def.section->id].toc_off;
13358 bfd_put_64 (info->output_bfd, toc, loc + 8);
13359 }
13360 }
13361 else
13362 {
13363 rela.r_offset = (plt->output_section->vma
13364 + plt->output_offset
13365 + ent->plt.offset);
13366 loc = relplt->contents + (relplt->reloc_count++
13367 * sizeof (Elf64_External_Rela));
13368 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13369 }
49c09209
AM
13370 }
13371 else
13372 {
13373 rela.r_offset = (htab->elf.splt->output_section->vma
13374 + htab->elf.splt->output_offset
13375 + ent->plt.offset);
13376 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13377 rela.r_addend = ent->addend;
13378 loc = (htab->elf.srelplt->contents
13379 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
13380 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
13381 if (h->type == STT_GNU_IFUNC && is_static_defined (h))
13382 htab->maybe_local_ifunc_resolver = 1;
2d7ad24e 13383 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
49c09209 13384 }
49c09209
AM
13385 }
13386
a345bc8d
AM
13387 if (!h->pointer_equality_needed)
13388 return TRUE;
13389
13390 if (h->def_regular)
13391 return TRUE;
13392
9e390558 13393 s = htab->global_entry;
49c09209
AM
13394 if (s == NULL || s->size == 0)
13395 return TRUE;
13396
13397 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13398 if (ent->plt.offset != (bfd_vma) -1
13399 && ent->addend == 0)
a345bc8d
AM
13400 {
13401 bfd_byte *p;
13402 asection *plt;
13403 bfd_vma off;
13404
a345bc8d 13405 p = s->contents + h->root.u.def.value;
33e44f2e 13406 plt = htab->elf.splt;
a345bc8d
AM
13407 if (!htab->elf.dynamic_sections_created
13408 || h->dynindx == -1)
2d7ad24e
AM
13409 {
13410 if (h->type == STT_GNU_IFUNC)
13411 plt = htab->elf.iplt;
13412 else
13413 plt = htab->pltlocal;
13414 }
49c09209 13415 off = ent->plt.offset + plt->output_offset + plt->output_section->vma;
a345bc8d
AM
13416 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
13417
13418 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
13419 {
13420 info->callbacks->einfo
c1c8c1ef 13421 (_("%P: linkage table error against `%pT'\n"),
a345bc8d
AM
13422 h->root.root.string);
13423 bfd_set_error (bfd_error_bad_value);
13424 htab->stub_error = TRUE;
13425 }
13426
7341d5e2
AM
13427 htab->stub_count[ppc_stub_global_entry - 1] += 1;
13428 if (htab->params->emit_stub_syms)
13429 {
13430 size_t len = strlen (h->root.root.string);
13431 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
13432
13433 if (name == NULL)
13434 return FALSE;
13435
13436 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
13437 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
13438 if (h == NULL)
13439 return FALSE;
13440 if (h->root.type == bfd_link_hash_new)
13441 {
13442 h->root.type = bfd_link_hash_defined;
13443 h->root.u.def.section = s;
13444 h->root.u.def.value = p - s->contents;
13445 h->ref_regular = 1;
13446 h->def_regular = 1;
13447 h->ref_regular_nonweak = 1;
13448 h->forced_local = 1;
13449 h->non_elf = 0;
2ec55de3 13450 h->root.linker_def = 1;
7341d5e2
AM
13451 }
13452 }
13453
a345bc8d
AM
13454 if (PPC_HA (off) != 0)
13455 {
13456 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
13457 p += 4;
13458 }
13459 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
13460 p += 4;
13461 bfd_put_32 (s->owner, MTCTR_R12, p);
13462 p += 4;
407aa07c 13463 bfd_put_32 (s->owner, BCTR, p);
a345bc8d
AM
13464 break;
13465 }
13466 return TRUE;
13467}
13468
49c09209
AM
13469/* Write PLT relocs for locals. */
13470
13471static bfd_boolean
13472write_plt_relocs_for_local_syms (struct bfd_link_info *info)
13473{
13474 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13475 bfd *ibfd;
13476
13477 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
13478 {
13479 struct got_entry **lgot_ents, **end_lgot_ents;
13480 struct plt_entry **local_plt, **lplt, **end_local_plt;
13481 Elf_Internal_Shdr *symtab_hdr;
13482 bfd_size_type locsymcount;
13483 Elf_Internal_Sym *local_syms = NULL;
13484 struct plt_entry *ent;
13485
13486 if (!is_ppc64_elf (ibfd))
13487 continue;
13488
13489 lgot_ents = elf_local_got_ents (ibfd);
13490 if (!lgot_ents)
13491 continue;
13492
13493 symtab_hdr = &elf_symtab_hdr (ibfd);
13494 locsymcount = symtab_hdr->sh_info;
13495 end_lgot_ents = lgot_ents + locsymcount;
13496 local_plt = (struct plt_entry **) end_lgot_ents;
13497 end_local_plt = local_plt + locsymcount;
13498 for (lplt = local_plt; lplt < end_local_plt; ++lplt)
13499 for (ent = *lplt; ent != NULL; ent = ent->next)
13500 if (ent->plt.offset != (bfd_vma) -1)
13501 {
13502 Elf_Internal_Sym *sym;
13503 asection *sym_sec;
13504 asection *plt, *relplt;
13505 bfd_byte *loc;
13506 bfd_vma val;
49c09209
AM
13507
13508 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
13509 lplt - local_plt, ibfd))
13510 {
13511 if (local_syms != NULL
13512 && symtab_hdr->contents != (unsigned char *) local_syms)
13513 free (local_syms);
13514 return FALSE;
13515 }
13516
13517 val = sym->st_value + ent->addend;
13518 val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
13519 if (sym_sec != NULL && sym_sec->output_section != NULL)
13520 val += sym_sec->output_offset + sym_sec->output_section->vma;
13521
2d7ad24e
AM
13522 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13523 {
13524 htab->local_ifunc_resolver = 1;
13525 plt = htab->elf.iplt;
13526 relplt = htab->elf.irelplt;
13527 }
13528 else
13529 {
13530 plt = htab->pltlocal;
13531 relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL;
13532 }
49c09209 13533
2d7ad24e
AM
13534 if (relplt == NULL)
13535 {
13536 loc = plt->contents + ent->plt.offset;
13537 bfd_put_64 (info->output_bfd, val, loc);
13538 if (htab->opd_abi)
13539 {
13540 bfd_vma toc = elf_gp (ibfd);
13541 bfd_put_64 (info->output_bfd, toc, loc + 8);
13542 }
13543 }
49c09209 13544 else
2d7ad24e
AM
13545 {
13546 Elf_Internal_Rela rela;
13547 rela.r_offset = (ent->plt.offset
13548 + plt->output_offset
13549 + plt->output_section->vma);
13550 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13551 {
13552 if (htab->opd_abi)
13553 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13554 else
13555 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13556 }
13557 else
13558 {
13559 if (htab->opd_abi)
13560 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13561 else
13562 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13563 }
13564 rela.r_addend = val;
13565 loc = relplt->contents + (relplt->reloc_count++
13566 * sizeof (Elf64_External_Rela));
13567 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13568 }
49c09209
AM
13569 }
13570
13571 if (local_syms != NULL
13572 && symtab_hdr->contents != (unsigned char *) local_syms)
13573 {
13574 if (!info->keep_memory)
13575 free (local_syms);
13576 else
13577 symtab_hdr->contents = (unsigned char *) local_syms;
13578 }
13579 }
13580 return TRUE;
13581}
13582
721956f4
AM
13583/* Build all the stubs associated with the current output file.
13584 The stubs are kept in a hash table attached to the main linker
13585 hash table. This function is called via gldelf64ppc_finish. */
13586
b34976b6 13587bfd_boolean
e7d1c40c 13588ppc64_elf_build_stubs (struct bfd_link_info *info,
4ce794b7 13589 char **stats)
5d1634d7
AM
13590{
13591 struct ppc_link_hash_table *htab = ppc_hash_table (info);
a4b6fadd 13592 struct map_stub *group;
721956f4 13593 asection *stub_sec;
5d1634d7 13594 bfd_byte *p;
e717da7e 13595 int stub_sec_count = 0;
5d1634d7 13596
4dfe6ac6
NC
13597 if (htab == NULL)
13598 return FALSE;
13599
eea6121a 13600 /* Allocate memory to hold the linker stubs. */
d4aaa2a0
AM
13601 for (group = htab->group; group != NULL; group = group->next)
13602 if ((stub_sec = group->stub_sec) != NULL
eea6121a 13603 && stub_sec->size != 0)
e717da7e 13604 {
e7d1c40c 13605 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd, stub_sec->size);
eea6121a
AM
13606 if (stub_sec->contents == NULL)
13607 return FALSE;
eea6121a 13608 stub_sec->size = 0;
e717da7e 13609 }
5d1634d7 13610
23eb7e01 13611 if (htab->glink != NULL && htab->glink->size != 0)
5d1634d7 13612 {
9f951329 13613 unsigned int indx;
ad8e1ba5 13614 bfd_vma plt0;
9f951329 13615
721956f4 13616 /* Build the .glink plt call stub. */
e7d1c40c 13617 if (htab->params->emit_stub_syms)
97b639ba
AM
13618 {
13619 struct elf_link_hash_entry *h;
468392fb
AM
13620 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
13621 TRUE, FALSE, FALSE);
97b639ba
AM
13622 if (h == NULL)
13623 return FALSE;
13624 if (h->root.type == bfd_link_hash_new)
13625 {
13626 h->root.type = bfd_link_hash_defined;
13627 h->root.u.def.section = htab->glink;
ee4bf8d2 13628 h->root.u.def.value = 8;
f5385ebf
AM
13629 h->ref_regular = 1;
13630 h->def_regular = 1;
13631 h->ref_regular_nonweak = 1;
13632 h->forced_local = 1;
13633 h->non_elf = 0;
2ec55de3 13634 h->root.linker_def = 1;
97b639ba
AM
13635 }
13636 }
33e44f2e
AM
13637 plt0 = (htab->elf.splt->output_section->vma
13638 + htab->elf.splt->output_offset
13639 - 16);
176a0d42
AM
13640 if (info->emitrelocations)
13641 {
13642 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
13643 if (r == NULL)
13644 return FALSE;
13645 r->r_offset = (htab->glink->output_offset
13646 + htab->glink->output_section->vma);
13647 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
13648 r->r_addend = plt0;
13649 }
4ce794b7 13650 p = htab->glink->contents;
176a0d42 13651 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
ee4bf8d2
AM
13652 bfd_put_64 (htab->glink->owner, plt0, p);
13653 p += 8;
b9e5796b
AM
13654 if (htab->opd_abi)
13655 {
13656 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
13657 p += 4;
13658 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13659 p += 4;
13660 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13661 p += 4;
13662 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13663 p += 4;
13664 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
13665 p += 4;
13666 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13667 p += 4;
13668 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13669 p += 4;
13670 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
13671 p += 4;
13672 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13673 p += 4;
13674 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
13675 p += 4;
13676 }
13677 else
13678 {
13679 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
13680 p += 4;
13681 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13682 p += 4;
13683 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13684 p += 4;
f378ab09
AM
13685 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p);
13686 p += 4;
b9e5796b
AM
13687 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13688 p += 4;
13689 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
13690 p += 4;
13691 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
13692 p += 4;
13693 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13694 p += 4;
13695 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
13696 p += 4;
13697 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13698 p += 4;
13699 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
13700 p += 4;
13701 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13702 p += 4;
13703 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
13704 p += 4;
13705 }
407aa07c
AM
13706 bfd_put_32 (htab->glink->owner, BCTR, p);
13707 p += 4;
c75bc4f7 13708 BFD_ASSERT (p == htab->glink->contents + GLINK_PLTRESOLVE_SIZE (htab));
ad8e1ba5 13709
9f951329
AM
13710 /* Build the .glink lazy link call stubs. */
13711 indx = 0;
9e390558 13712 while (p < htab->glink->contents + htab->glink->size)
9f951329 13713 {
b9e5796b 13714 if (htab->opd_abi)
9f951329 13715 {
b9e5796b
AM
13716 if (indx < 0x8000)
13717 {
13718 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
13719 p += 4;
13720 }
13721 else
13722 {
13723 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
13724 p += 4;
13725 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
13726 p);
13727 p += 4;
13728 }
9f951329 13729 }
4ce794b7 13730 bfd_put_32 (htab->glink->owner,
ee4bf8d2 13731 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
a16d5acb 13732 indx++;
9f951329
AM
13733 p += 4;
13734 }
5d1634d7 13735 }
5d1634d7 13736
49c09209
AM
13737 /* Build .glink global entry stubs, and PLT relocs for globals. */
13738 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs_and_plt, info);
13739
13740 if (!write_plt_relocs_for_local_syms (info))
13741 return FALSE;
9e390558 13742
7341d5e2 13743 if (htab->brlt != NULL && htab->brlt->size != 0)
721956f4 13744 {
4ce794b7 13745 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 13746 htab->brlt->size);
4ce794b7 13747 if (htab->brlt->contents == NULL)
b34976b6 13748 return FALSE;
721956f4 13749 }
ee75fd95 13750 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
13751 {
13752 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 13753 htab->relbrlt->size);
63bc6f6c
AM
13754 if (htab->relbrlt->contents == NULL)
13755 return FALSE;
13756 }
5d1634d7 13757
721956f4
AM
13758 /* Build the stubs as directed by the stub hash table. */
13759 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 13760
a4b6fadd
AM
13761 for (group = htab->group; group != NULL; group = group->next)
13762 if (group->needs_save_res)
7dda8d3c 13763 group->stub_sec->size += htab->sfpr->size;
a4b6fadd 13764
aa8a7074
AM
13765 if (htab->relbrlt != NULL)
13766 htab->relbrlt->reloc_count = 0;
13767
e7d1c40c 13768 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
13769 for (group = htab->group; group != NULL; group = group->next)
13770 if ((stub_sec = group->stub_sec) != NULL)
691d2e9a
AM
13771 {
13772 int align = abs (htab->params->plt_stub_align);
13773 stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align);
13774 }
794e51c0 13775
7dda8d3c
AM
13776 for (group = htab->group; group != NULL; group = group->next)
13777 if (group->needs_save_res)
13778 {
13779 stub_sec = group->stub_sec;
13780 memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
13781 htab->sfpr->contents, htab->sfpr->size);
13782 if (htab->params->emit_stub_syms)
13783 {
13784 unsigned int i;
13785
13786 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
13787 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
13788 return FALSE;
13789 }
13790 }
13791
d4aaa2a0
AM
13792 for (group = htab->group; group != NULL; group = group->next)
13793 if ((stub_sec = group->stub_sec) != NULL)
e717da7e
AM
13794 {
13795 stub_sec_count += 1;
c9301e31
AM
13796 if (stub_sec->rawsize != stub_sec->size
13797 && (htab->stub_iteration <= STUB_SHRINK_ITER
13798 || stub_sec->rawsize < stub_sec->size))
e717da7e
AM
13799 break;
13800 }
5d1634d7 13801
25516cc5 13802 if (group != NULL)
5d1634d7 13803 {
b34976b6 13804 htab->stub_error = TRUE;
cf97bcb0 13805 _bfd_error_handler (_("stubs don't match calculated size"));
5d1634d7 13806 }
721956f4 13807
d2a300cf
AM
13808 if (htab->stub_error)
13809 return FALSE;
13810
13811 if (stats != NULL)
13812 {
db84fff3 13813 size_t len;
d2a300cf
AM
13814 *stats = bfd_malloc (500);
13815 if (*stats == NULL)
13816 return FALSE;
13817
db84fff3
AM
13818 len = sprintf (*stats,
13819 ngettext ("linker stubs in %u group\n",
13820 "linker stubs in %u groups\n",
13821 stub_sec_count),
13822 stub_sec_count);
13823 sprintf (*stats + len, _(" branch %lu\n"
13824 " toc adjust %lu\n"
13825 " long branch %lu\n"
13826 " long toc adj %lu\n"
13827 " plt call %lu\n"
13828 " plt call toc %lu\n"
13829 " global entry %lu"),
4ce794b7
AM
13830 htab->stub_count[ppc_stub_long_branch - 1],
13831 htab->stub_count[ppc_stub_long_branch_r2off - 1],
13832 htab->stub_count[ppc_stub_plt_branch - 1],
13833 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
794e51c0 13834 htab->stub_count[ppc_stub_plt_call - 1],
7341d5e2
AM
13835 htab->stub_count[ppc_stub_plt_call_r2save - 1],
13836 htab->stub_count[ppc_stub_global_entry - 1]);
d2a300cf
AM
13837 }
13838 return TRUE;
5bd4f169
AM
13839}
13840
60124e18
AM
13841/* What to do when ld finds relocations against symbols defined in
13842 discarded sections. */
13843
13844static unsigned int
13845ppc64_elf_action_discarded (asection *sec)
13846{
13847 if (strcmp (".opd", sec->name) == 0)
13848 return 0;
13849
13850 if (strcmp (".toc", sec->name) == 0)
13851 return 0;
13852
bce50a28
JJ
13853 if (strcmp (".toc1", sec->name) == 0)
13854 return 0;
13855
60124e18
AM
13856 return _bfd_elf_default_action_discarded (sec);
13857}
13858
5bd4f169
AM
13859/* The RELOCATE_SECTION function is called by the ELF backend linker
13860 to handle the relocations for a section.
13861
13862 The relocs are always passed as Rela structures; if the section
13863 actually uses Rel structures, the r_addend field will always be
13864 zero.
13865
13866 This function is responsible for adjust the section contents as
13867 necessary, and (if using Rela relocs and generating a
1049f94e 13868 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
13869 necessary.
13870
13871 This function does not have to worry about setting the reloc
13872 address or the reloc symbol index.
13873
13874 LOCAL_SYMS is a pointer to the swapped in local symbols.
13875
13876 LOCAL_SECTIONS is an array giving the section in the input file
13877 corresponding to the st_shndx field of each local symbol.
13878
13879 The global hash table entry for the global symbols can be found
13880 via elf_sym_hashes (input_bfd).
13881
1049f94e 13882 When generating relocatable output, this function must handle
5bd4f169
AM
13883 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
13884 going to be the section symbol corresponding to the output
13885 section, which means that the addend must be adjusted
13886 accordingly. */
13887
b34976b6 13888static bfd_boolean
4ce794b7
AM
13889ppc64_elf_relocate_section (bfd *output_bfd,
13890 struct bfd_link_info *info,
13891 bfd *input_bfd,
13892 asection *input_section,
13893 bfd_byte *contents,
13894 Elf_Internal_Rela *relocs,
13895 Elf_Internal_Sym *local_syms,
13896 asection **local_sections)
5bd4f169 13897{
65f38f15 13898 struct ppc_link_hash_table *htab;
5bd4f169
AM
13899 Elf_Internal_Shdr *symtab_hdr;
13900 struct elf_link_hash_entry **sym_hashes;
5bd4f169 13901 Elf_Internal_Rela *rel;
c316a17c 13902 Elf_Internal_Rela *wrel;
5bd4f169 13903 Elf_Internal_Rela *relend;
411e1bfb
AM
13904 Elf_Internal_Rela outrel;
13905 bfd_byte *loc;
411e1bfb 13906 struct got_entry **local_got_ents;
5bd4f169 13907 bfd_vma TOCstart;
b34976b6
AM
13908 bfd_boolean ret = TRUE;
13909 bfd_boolean is_opd;
794e51c0
AM
13910 /* Assume 'at' branch hints. */
13911 bfd_boolean is_isa_v2 = TRUE;
95f0d0d2 13912 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
5bd4f169 13913
65f38f15 13914 /* Initialize howto table if needed. */
5bd4f169 13915 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
13916 ppc_howto_init ();
13917
65f38f15 13918 htab = ppc_hash_table (info);
4dfe6ac6
NC
13919 if (htab == NULL)
13920 return FALSE;
ee75fd95
AM
13921
13922 /* Don't relocate stub sections. */
e7d1c40c 13923 if (input_section->owner == htab->params->stub_bfd)
ee75fd95
AM
13924 return TRUE;
13925
0c8d6e5c 13926 BFD_ASSERT (is_ppc64_elf (input_bfd));
0ffa91dd 13927
411e1bfb 13928 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 13929 TOCstart = elf_gp (output_bfd);
0ffa91dd 13930 symtab_hdr = &elf_symtab_hdr (input_bfd);
5bd4f169 13931 sym_hashes = elf_sym_hashes (input_bfd);
7c8fe5c4 13932 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
65f38f15 13933
c316a17c 13934 rel = wrel = relocs;
5bd4f169 13935 relend = relocs + input_section->reloc_count;
c316a17c 13936 for (; rel < relend; wrel++, rel++)
5bd4f169 13937 {
04c9666a 13938 enum elf_ppc64_reloc_type r_type;
31c76678 13939 bfd_vma addend;
5bd4f169
AM
13940 bfd_reloc_status_type r;
13941 Elf_Internal_Sym *sym;
13942 asection *sec;
039b3fef
AM
13943 struct elf_link_hash_entry *h_elf;
13944 struct ppc_link_hash_entry *h;
13945 struct ppc_link_hash_entry *fdh;
5bd4f169 13946 const char *sym_name;
0d4792f7 13947 unsigned long r_symndx, toc_symndx;
3a71aa26 13948 bfd_vma toc_addend;
f961d9dd
AM
13949 unsigned char tls_mask, tls_gd, tls_type;
13950 unsigned char sym_type;
5bd4f169 13951 bfd_vma relocation;
23cedd1d 13952 bfd_boolean unresolved_reloc, save_unresolved_reloc;
b34976b6 13953 bfd_boolean warned;
bc30df16 13954 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
67f0cbdb 13955 unsigned int insn;
e11840f9 13956 unsigned int mask;
721956f4
AM
13957 struct ppc_stub_hash_entry *stub_entry;
13958 bfd_vma max_br_offset;
13959 bfd_vma from;
c316a17c 13960 Elf_Internal_Rela orig_rel;
b80eed39
AM
13961 reloc_howto_type *howto;
13962 struct reloc_howto_struct alt_howto;
5bd4f169 13963
c316a17c
AM
13964 again:
13965 orig_rel = *rel;
13966
4ce794b7 13967 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 13968 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
13969
13970 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
13971 symbol of the previous ADDR64 reloc. The symbol gives us the
13972 proper TOC base to use. */
13973 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
c316a17c
AM
13974 && wrel != relocs
13975 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
ee87f2da 13976 && is_opd)
c316a17c 13977 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
ee87f2da 13978
4ce794b7
AM
13979 sym = NULL;
13980 sec = NULL;
039b3fef 13981 h_elf = NULL;
4ce794b7 13982 sym_name = NULL;
b34976b6
AM
13983 unresolved_reloc = FALSE;
13984 warned = FALSE;
65f38f15 13985
0b13192e 13986 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
13987 {
13988 /* It's a local symbol. */
74f0fb50 13989 struct _opd_sec_data *opd;
4025353c 13990
5bd4f169
AM
13991 sym = local_syms + r_symndx;
13992 sec = local_sections[r_symndx];
26c61ae5 13993 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
0d4792f7 13994 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 13995 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
74f0fb50
AM
13996 opd = get_opd_info (sec);
13997 if (opd != NULL && opd->adjust != NULL)
1e2f5b6e 13998 {
51aecdc5
AM
13999 long adjust = opd->adjust[OPD_NDX (sym->st_value
14000 + rel->r_addend)];
4025353c
AM
14001 if (adjust == -1)
14002 relocation = 0;
14003 else
4cc603a5
AM
14004 {
14005 /* If this is a relocation against the opd section sym
14006 and we have edited .opd, adjust the reloc addend so
14007 that ld -r and ld --emit-relocs output is correct.
14008 If it is a reloc against some other .opd symbol,
14009 then the symbol value will be adjusted later. */
14010 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
14011 rel->r_addend += adjust;
14012 else
14013 relocation += adjust;
14014 }
1e2f5b6e 14015 }
5bd4f169
AM
14016 }
14017 else
14018 {
62d887d4
L
14019 bfd_boolean ignored;
14020
b2a8e766
AM
14021 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
14022 r_symndx, symtab_hdr, sym_hashes,
039b3fef 14023 h_elf, sec, relocation,
62d887d4 14024 unresolved_reloc, warned, ignored);
039b3fef
AM
14025 sym_name = h_elf->root.root.string;
14026 sym_type = h_elf->type;
b69fdb4e
AM
14027 if (sec != NULL
14028 && sec->owner == output_bfd
14029 && strcmp (sec->name, ".opd") == 0)
14030 {
14031 /* This is a symbol defined in a linker script. All
14032 such are defined in output sections, even those
14033 defined by simple assignment from a symbol defined in
14034 an input section. Transfer the symbol to an
14035 appropriate input .opd section, so that a branch to
14036 this symbol will be mapped to the location specified
14037 by the opd entry. */
14038 struct bfd_link_order *lo;
14039 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
14040 if (lo->type == bfd_indirect_link_order)
14041 {
14042 asection *isec = lo->u.indirect.section;
14043 if (h_elf->root.u.def.value >= isec->output_offset
14044 && h_elf->root.u.def.value < (isec->output_offset
14045 + isec->size))
14046 {
14047 h_elf->root.u.def.value -= isec->output_offset;
14048 h_elf->root.u.def.section = isec;
14049 sec = isec;
14050 break;
14051 }
14052 }
14053 }
5bd4f169 14054 }
039b3fef 14055 h = (struct ppc_link_hash_entry *) h_elf;
5bd4f169 14056
dbaa2011 14057 if (sec != NULL && discarded_section (sec))
c316a17c
AM
14058 {
14059 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
14060 input_bfd, input_section,
14061 contents + rel->r_offset);
14062 wrel->r_offset = rel->r_offset;
14063 wrel->r_info = 0;
14064 wrel->r_addend = 0;
14065
14066 /* For ld -r, remove relocations in debug sections against
dcd2b8a0 14067 symbols defined in discarded sections. Not done for
c316a17c
AM
14068 non-debug to preserve relocs in .eh_frame which the
14069 eh_frame editing code expects to be present. */
14070 if (bfd_link_relocatable (info)
14071 && (input_section->flags & SEC_DEBUGGING))
14072 wrel--;
14073
14074 continue;
14075 }
ab96bf03 14076
0e1862bb 14077 if (bfd_link_relocatable (info))
c316a17c 14078 goto copy_reloc;
ab96bf03 14079
f40da81b
AM
14080 if (h != NULL && &h->elf == htab->elf.hgot)
14081 {
6f20ed8a 14082 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
f40da81b
AM
14083 sec = bfd_abs_section_ptr;
14084 unresolved_reloc = FALSE;
14085 }
14086
951fd09b
AM
14087 /* TLS optimizations. Replace instruction sequences and relocs
14088 based on information we collected in tls_optimize. We edit
14089 RELOCS so that --emit-relocs will output something sensible
14090 for the final instruction stream. */
14091 tls_mask = 0;
14092 tls_gd = 0;
0d4792f7 14093 toc_symndx = 0;
727fc41e
AM
14094 if (h != NULL)
14095 tls_mask = h->tls_mask;
14096 else if (local_got_ents != NULL)
411e1bfb 14097 {
e054468f
AM
14098 struct plt_entry **local_plt = (struct plt_entry **)
14099 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 14100 unsigned char *lgot_masks = (unsigned char *)
e054468f 14101 (local_plt + symtab_hdr->sh_info);
727fc41e
AM
14102 tls_mask = lgot_masks[r_symndx];
14103 }
37da22e5 14104 if (((tls_mask & TLS_TLS) == 0 || tls_mask == (TLS_TLS | TLS_MARK))
727fc41e
AM
14105 && (r_type == R_PPC64_TLS
14106 || r_type == R_PPC64_TLSGD
14107 || r_type == R_PPC64_TLSLD))
14108 {
14109 /* Check for toc tls entries. */
f961d9dd 14110 unsigned char *toc_tls;
0d4792f7 14111
727fc41e
AM
14112 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14113 &local_syms, rel, input_bfd))
14114 return FALSE;
0d4792f7 14115
727fc41e
AM
14116 if (toc_tls)
14117 tls_mask = *toc_tls;
0d4792f7
AM
14118 }
14119
14120 /* Check that tls relocs are used with tls syms, and non-tls
14121 relocs are used with non-tls syms. */
cf35638d 14122 if (r_symndx != STN_UNDEF
0d4792f7
AM
14123 && r_type != R_PPC64_NONE
14124 && (h == NULL
039b3fef
AM
14125 || h->elf.root.type == bfd_link_hash_defined
14126 || h->elf.root.type == bfd_link_hash_defweak)
1d483afe
AM
14127 && (IS_PPC64_TLS_RELOC (r_type)
14128 != (sym_type == STT_TLS
14129 || (sym_type == STT_SECTION
14130 && (sec->flags & SEC_THREAD_LOCAL) != 0))))
0d4792f7 14131 {
37da22e5 14132 if ((tls_mask & TLS_TLS) != 0
727fc41e
AM
14133 && (r_type == R_PPC64_TLS
14134 || r_type == R_PPC64_TLSGD
14135 || r_type == R_PPC64_TLSLD))
0d4792f7
AM
14136 /* R_PPC64_TLS is OK against a symbol in the TOC. */
14137 ;
14138 else
25f53a85 14139 info->callbacks->einfo
1d483afe 14140 (!IS_PPC64_TLS_RELOC (r_type)
695344c0 14141 /* xgettext:c-format */
c1c8c1ef 14142 ? _("%H: %s used with TLS symbol `%pT'\n")
695344c0 14143 /* xgettext:c-format */
c1c8c1ef 14144 : _("%H: %s used with non-TLS symbol `%pT'\n"),
25f53a85 14145 input_bfd, input_section, rel->r_offset,
0d4792f7
AM
14146 ppc64_elf_howto_table[r_type]->name,
14147 sym_name);
411e1bfb
AM
14148 }
14149
14150 /* Ensure reloc mapping code below stays sane. */
14151 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
14152 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
14153 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
14154 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
14155 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
14156 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
14157 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
14158 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
14159 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
14160 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
14161 abort ();
0d4792f7 14162
411e1bfb
AM
14163 switch (r_type)
14164 {
14165 default:
411e1bfb
AM
14166 break;
14167
ba761f19 14168 case R_PPC64_LO_DS_OPT:
95f0d0d2 14169 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
ba761f19
AM
14170 if ((insn & (0x3f << 26)) != 58u << 26)
14171 abort ();
14172 insn += (14u << 26) - (58u << 26);
95f0d0d2 14173 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
ba761f19
AM
14174 r_type = R_PPC64_TOC16_LO;
14175 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14176 break;
14177
411e1bfb
AM
14178 case R_PPC64_TOC16:
14179 case R_PPC64_TOC16_LO:
14180 case R_PPC64_TOC16_DS:
14181 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
14182 {
14183 /* Check for toc tls entries. */
f961d9dd 14184 unsigned char *toc_tls;
951fd09b 14185 int retval;
411e1bfb 14186
3a71aa26
AM
14187 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14188 &local_syms, rel, input_bfd);
951fd09b 14189 if (retval == 0)
411e1bfb
AM
14190 return FALSE;
14191
14192 if (toc_tls)
14193 {
951fd09b 14194 tls_mask = *toc_tls;
411e1bfb
AM
14195 if (r_type == R_PPC64_TOC16_DS
14196 || r_type == R_PPC64_TOC16_LO_DS)
81407a69 14197 {
37da22e5 14198 if ((tls_mask & TLS_TLS) != 0
81407a69
AM
14199 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
14200 goto toctprel;
14201 }
411e1bfb 14202 else
951fd09b
AM
14203 {
14204 /* If we found a GD reloc pair, then we might be
14205 doing a GD->IE transition. */
14206 if (retval == 2)
14207 {
14208 tls_gd = TLS_TPRELGD;
37da22e5
AM
14209 if ((tls_mask & TLS_TLS) != 0
14210 && (tls_mask & TLS_GD) == 0)
102890f0 14211 goto tls_ldgd_opt;
951fd09b
AM
14212 }
14213 else if (retval == 3)
14214 {
37da22e5
AM
14215 if ((tls_mask & TLS_TLS) != 0
14216 && (tls_mask & TLS_LD) == 0)
102890f0 14217 goto tls_ldgd_opt;
951fd09b
AM
14218 }
14219 }
411e1bfb
AM
14220 }
14221 }
14222 break;
14223
9d6ded02
AM
14224 case R_PPC64_GOT_TPREL16_HI:
14225 case R_PPC64_GOT_TPREL16_HA:
37da22e5 14226 if ((tls_mask & TLS_TLS) != 0
9d6ded02
AM
14227 && (tls_mask & TLS_TPREL) == 0)
14228 {
14229 rel->r_offset -= d_offset;
95f0d0d2 14230 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
9d6ded02
AM
14231 r_type = R_PPC64_NONE;
14232 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14233 }
14234 break;
14235
411e1bfb
AM
14236 case R_PPC64_GOT_TPREL16_DS:
14237 case R_PPC64_GOT_TPREL16_LO_DS:
37da22e5 14238 if ((tls_mask & TLS_TLS) != 0
951fd09b 14239 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14240 {
81407a69 14241 toctprel:
95f0d0d2 14242 insn = bfd_get_32 (input_bfd,
c316a17c 14243 contents + rel->r_offset - d_offset);
411e1bfb
AM
14244 insn &= 31 << 21;
14245 insn |= 0x3c0d0000; /* addis 0,13,0 */
95f0d0d2 14246 bfd_put_32 (input_bfd, insn,
c316a17c 14247 contents + rel->r_offset - d_offset);
411e1bfb 14248 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
14249 if (toc_symndx != 0)
14250 {
14251 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 14252 rel->r_addend = toc_addend;
0d4792f7
AM
14253 /* We changed the symbol. Start over in order to
14254 get h, sym, sec etc. right. */
c316a17c 14255 goto again;
0d4792f7
AM
14256 }
14257 else
14258 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14259 }
14260 break;
14261
14262 case R_PPC64_TLS:
37da22e5 14263 if ((tls_mask & TLS_TLS) != 0
951fd09b 14264 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 14265 {
95f0d0d2 14266 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2d0f3896
AM
14267 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
14268 if (insn == 0)
411e1bfb 14269 abort ();
95f0d0d2 14270 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
411e1bfb 14271 /* Was PPC64_TLS which sits on insn boundary, now
4fe5ca5b
GM
14272 PPC64_TPREL16_LO which is at low-order half-word. */
14273 rel->r_offset += d_offset;
0d4792f7
AM
14274 r_type = R_PPC64_TPREL16_LO;
14275 if (toc_symndx != 0)
14276 {
14277 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 14278 rel->r_addend = toc_addend;
0d4792f7
AM
14279 /* We changed the symbol. Start over in order to
14280 get h, sym, sec etc. right. */
c316a17c 14281 goto again;
0d4792f7
AM
14282 }
14283 else
14284 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14285 }
14286 break;
14287
411e1bfb
AM
14288 case R_PPC64_GOT_TLSGD16_HI:
14289 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 14290 tls_gd = TLS_TPRELGD;
37da22e5 14291 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
951fd09b
AM
14292 goto tls_gdld_hi;
14293 break;
14294
411e1bfb
AM
14295 case R_PPC64_GOT_TLSLD16_HI:
14296 case R_PPC64_GOT_TLSLD16_HA:
37da22e5 14297 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 14298 {
951fd09b
AM
14299 tls_gdld_hi:
14300 if ((tls_mask & tls_gd) != 0)
14301 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
14302 + R_PPC64_GOT_TPREL16_DS);
14303 else
411e1bfb 14304 {
4fe5ca5b 14305 rel->r_offset -= d_offset;
95f0d0d2 14306 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
951fd09b 14307 r_type = R_PPC64_NONE;
411e1bfb 14308 }
951fd09b 14309 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
14310 }
14311 break;
14312
951fd09b
AM
14313 case R_PPC64_GOT_TLSGD16:
14314 case R_PPC64_GOT_TLSGD16_LO:
14315 tls_gd = TLS_TPRELGD;
37da22e5 14316 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
102890f0 14317 goto tls_ldgd_opt;
951fd09b 14318 break;
411e1bfb 14319
951fd09b
AM
14320 case R_PPC64_GOT_TLSLD16:
14321 case R_PPC64_GOT_TLSLD16_LO:
37da22e5 14322 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
951fd09b 14323 {
b9f04fe0 14324 unsigned int insn1, insn2;
102890f0
AM
14325 bfd_vma offset;
14326
14327 tls_ldgd_opt:
727fc41e
AM
14328 offset = (bfd_vma) -1;
14329 /* If not using the newer R_PPC64_TLSGD/LD to mark
14330 __tls_get_addr calls, we must trust that the call
14331 stays with its arg setup insns, ie. that the next
14332 reloc is the __tls_get_addr call associated with
14333 the current reloc. Edit both insns. */
14334 if (input_section->has_tls_get_addr_call
14335 && rel + 1 < relend
14336 && branch_reloc_hash_match (input_bfd, rel + 1,
14337 htab->tls_get_addr,
14338 htab->tls_get_addr_fd))
14339 offset = rel[1].r_offset;
b86ac8e3
AM
14340 /* We read the low GOT_TLS (or TOC16) insn because we
14341 need to keep the destination reg. It may be
14342 something other than the usual r3, and moved to r3
14343 before the call by intervening code. */
95f0d0d2 14344 insn1 = bfd_get_32 (input_bfd,
b86ac8e3 14345 contents + rel->r_offset - d_offset);
102890f0 14346 if ((tls_mask & tls_gd) != 0)
411e1bfb 14347 {
102890f0 14348 /* IE */
b86ac8e3 14349 insn1 &= (0x1f << 21) | (0x1f << 16);
102890f0
AM
14350 insn1 |= 58 << 26; /* ld */
14351 insn2 = 0x7c636a14; /* add 3,3,13 */
727fc41e 14352 if (offset != (bfd_vma) -1)
f58d5a2d 14353 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
102890f0
AM
14354 if ((tls_mask & TLS_EXPLICIT) == 0)
14355 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
14356 + R_PPC64_GOT_TPREL16_DS);
411e1bfb 14357 else
102890f0
AM
14358 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
14359 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14360 }
14361 else
14362 {
14363 /* LE */
b86ac8e3
AM
14364 insn1 &= 0x1f << 21;
14365 insn1 |= 0x3c0d0000; /* addis r,13,0 */
102890f0
AM
14366 insn2 = 0x38630000; /* addi 3,3,0 */
14367 if (tls_gd == 0)
951fd09b 14368 {
102890f0 14369 /* Was an LD reloc. */
1d483afe
AM
14370 if (toc_symndx)
14371 sec = local_sections[toc_symndx];
14372 for (r_symndx = 0;
14373 r_symndx < symtab_hdr->sh_info;
14374 r_symndx++)
14375 if (local_sections[r_symndx] == sec)
14376 break;
14377 if (r_symndx >= symtab_hdr->sh_info)
cf35638d 14378 r_symndx = STN_UNDEF;
102890f0 14379 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
cf35638d 14380 if (r_symndx != STN_UNDEF)
1d483afe
AM
14381 rel->r_addend -= (local_syms[r_symndx].st_value
14382 + sec->output_offset
14383 + sec->output_section->vma);
951fd09b 14384 }
102890f0 14385 else if (toc_symndx != 0)
3a71aa26
AM
14386 {
14387 r_symndx = toc_symndx;
14388 rel->r_addend = toc_addend;
14389 }
102890f0
AM
14390 r_type = R_PPC64_TPREL16_HA;
14391 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
14392 if (offset != (bfd_vma) -1)
14393 {
14394 rel[1].r_info = ELF64_R_INFO (r_symndx,
14395 R_PPC64_TPREL16_LO);
14396 rel[1].r_offset = offset + d_offset;
14397 rel[1].r_addend = rel->r_addend;
14398 }
102890f0 14399 }
95f0d0d2 14400 bfd_put_32 (input_bfd, insn1,
3a71aa26 14401 contents + rel->r_offset - d_offset);
727fc41e 14402 if (offset != (bfd_vma) -1)
b9f04fe0 14403 bfd_put_32 (input_bfd, insn2, contents + offset);
727fc41e
AM
14404 if ((tls_mask & tls_gd) == 0
14405 && (tls_gd == 0 || toc_symndx != 0))
14406 {
14407 /* We changed the symbol. Start over in order
14408 to get h, sym, sec etc. right. */
c316a17c 14409 goto again;
727fc41e
AM
14410 }
14411 }
14412 break;
14413
14414 case R_PPC64_TLSGD:
37da22e5 14415 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
675e2809 14416 && rel + 1 < relend)
727fc41e 14417 {
b9f04fe0 14418 unsigned int insn2;
727fc41e
AM
14419 bfd_vma offset = rel->r_offset;
14420
23cedd1d
AM
14421 if (is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
14422 {
14423 bfd_put_32 (output_bfd, NOP, contents + offset);
14424 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14425 break;
14426 }
14427
14428 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14429 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14430
727fc41e
AM
14431 if ((tls_mask & TLS_TPRELGD) != 0)
14432 {
14433 /* IE */
14434 r_type = R_PPC64_NONE;
14435 insn2 = 0x7c636a14; /* add 3,3,13 */
14436 }
14437 else
14438 {
14439 /* LE */
14440 if (toc_symndx != 0)
14441 {
14442 r_symndx = toc_symndx;
14443 rel->r_addend = toc_addend;
14444 }
14445 r_type = R_PPC64_TPREL16_LO;
14446 rel->r_offset = offset + d_offset;
14447 insn2 = 0x38630000; /* addi 3,3,0 */
14448 }
14449 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14450 /* Zap the reloc on the _tls_get_addr call too. */
14451 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 14452 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 14453 bfd_put_32 (input_bfd, insn2, contents + offset);
727fc41e 14454 if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
c316a17c 14455 goto again;
411e1bfb 14456 }
411e1bfb
AM
14457 break;
14458
727fc41e 14459 case R_PPC64_TLSLD:
37da22e5 14460 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
675e2809 14461 && rel + 1 < relend)
727fc41e 14462 {
b9f04fe0 14463 unsigned int insn2;
727fc41e
AM
14464 bfd_vma offset = rel->r_offset;
14465
23cedd1d
AM
14466 if (is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
14467 {
14468 bfd_put_32 (output_bfd, NOP, contents + offset);
14469 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14470 break;
14471 }
14472
14473 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14474 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14475
727fc41e
AM
14476 if (toc_symndx)
14477 sec = local_sections[toc_symndx];
14478 for (r_symndx = 0;
14479 r_symndx < symtab_hdr->sh_info;
14480 r_symndx++)
14481 if (local_sections[r_symndx] == sec)
14482 break;
14483 if (r_symndx >= symtab_hdr->sh_info)
cf35638d 14484 r_symndx = STN_UNDEF;
727fc41e 14485 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
cf35638d 14486 if (r_symndx != STN_UNDEF)
727fc41e
AM
14487 rel->r_addend -= (local_syms[r_symndx].st_value
14488 + sec->output_offset
14489 + sec->output_section->vma);
14490
14491 r_type = R_PPC64_TPREL16_LO;
14492 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14493 rel->r_offset = offset + d_offset;
14494 /* Zap the reloc on the _tls_get_addr call too. */
14495 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 14496 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
727fc41e 14497 insn2 = 0x38630000; /* addi 3,3,0 */
95f0d0d2 14498 bfd_put_32 (input_bfd, insn2, contents + offset);
c316a17c 14499 goto again;
727fc41e
AM
14500 }
14501 break;
14502
411e1bfb 14503 case R_PPC64_DTPMOD64:
951fd09b
AM
14504 if (rel + 1 < relend
14505 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
14506 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 14507 {
951fd09b
AM
14508 if ((tls_mask & TLS_GD) == 0)
14509 {
14510 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
14511 if ((tls_mask & TLS_TPRELGD) != 0)
14512 r_type = R_PPC64_TPREL64;
14513 else
14514 {
4ce794b7 14515 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
14516 r_type = R_PPC64_NONE;
14517 }
14518 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14519 }
14520 }
14521 else
14522 {
14523 if ((tls_mask & TLS_LD) == 0)
411e1bfb 14524 {
4ce794b7 14525 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 14526 r_type = R_PPC64_NONE;
951fd09b 14527 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 14528 }
411e1bfb
AM
14529 }
14530 break;
14531
14532 case R_PPC64_TPREL64:
951fd09b 14533 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
14534 {
14535 r_type = R_PPC64_NONE;
14536 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14537 }
14538 break;
52a82034 14539
006589cf
AM
14540 case R_PPC64_ENTRY:
14541 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
14542 if (!bfd_link_pic (info)
14543 && !info->traditional_format
14544 && relocation + 0x80008000 <= 0xffffffff)
14545 {
14546 unsigned int insn1, insn2;
14547
14548 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
14549 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14550 if ((insn1 & ~0xfffc) == LD_R2_0R12
14551 && insn2 == ADD_R2_R2_R12)
14552 {
95f0d0d2 14553 bfd_put_32 (input_bfd,
006589cf
AM
14554 LIS_R2 + PPC_HA (relocation),
14555 contents + rel->r_offset);
95f0d0d2 14556 bfd_put_32 (input_bfd,
006589cf
AM
14557 ADDI_R2_R2 + PPC_LO (relocation),
14558 contents + rel->r_offset + 4);
14559 }
14560 }
14561 else
14562 {
14563 relocation -= (rel->r_offset
14564 + input_section->output_offset
14565 + input_section->output_section->vma);
14566 if (relocation + 0x80008000 <= 0xffffffff)
14567 {
14568 unsigned int insn1, insn2;
14569
14570 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
14571 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14572 if ((insn1 & ~0xfffc) == LD_R2_0R12
14573 && insn2 == ADD_R2_R2_R12)
14574 {
95f0d0d2 14575 bfd_put_32 (input_bfd,
006589cf
AM
14576 ADDIS_R2_R12 + PPC_HA (relocation),
14577 contents + rel->r_offset);
95f0d0d2 14578 bfd_put_32 (input_bfd,
006589cf
AM
14579 ADDI_R2_R2 + PPC_LO (relocation),
14580 contents + rel->r_offset + 4);
14581 }
14582 }
14583 }
14584 break;
14585
52a82034
AM
14586 case R_PPC64_REL16_HA:
14587 /* If we are generating a non-PIC executable, edit
14588 . 0: addis 2,12,.TOC.-0b@ha
14589 . addi 2,2,.TOC.-0b@l
14590 used by ELFv2 global entry points to set up r2, to
14591 . lis 2,.TOC.@ha
14592 . addi 2,2,.TOC.@l
14593 if .TOC. is in range. */
0e1862bb 14594 if (!bfd_link_pic (info)
810d4e75 14595 && !info->traditional_format
006589cf 14596 && !htab->opd_abi
4f038ee5 14597 && rel->r_addend == d_offset
52a82034
AM
14598 && h != NULL && &h->elf == htab->elf.hgot
14599 && rel + 1 < relend
14600 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
14601 && rel[1].r_offset == rel->r_offset + 4
14602 && rel[1].r_addend == rel->r_addend + 4
14603 && relocation + 0x80008000 <= 0xffffffff)
14604 {
14605 unsigned int insn1, insn2;
14606 bfd_vma offset = rel->r_offset - d_offset;
95f0d0d2
AM
14607 insn1 = bfd_get_32 (input_bfd, contents + offset);
14608 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
006589cf
AM
14609 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
14610 && (insn2 & 0xffff0000) == ADDI_R2_R2)
52a82034
AM
14611 {
14612 r_type = R_PPC64_ADDR16_HA;
14613 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14614 rel->r_addend -= d_offset;
14615 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
14616 rel[1].r_addend -= d_offset + 4;
95f0d0d2 14617 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
52a82034
AM
14618 }
14619 }
14620 break;
411e1bfb
AM
14621 }
14622
14623 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 14624 insn = 0;
b25116a9
AM
14625 max_br_offset = 1 << 25;
14626 addend = rel->r_addend;
bc30df16 14627 reloc_dest = DEST_NORMAL;
65f38f15 14628 switch (r_type)
5bd4f169
AM
14629 {
14630 default:
65f38f15 14631 break;
5bd4f169 14632
3b421ab3
AM
14633 case R_PPC64_TOCSAVE:
14634 if (relocation + addend == (rel->r_offset
14635 + input_section->output_offset
14636 + input_section->output_section->vma)
14637 && tocsave_find (htab, NO_INSERT,
14638 &local_syms, rel, input_bfd))
14639 {
14640 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14641 if (insn == NOP
14642 || insn == CROR_151515 || insn == CROR_313131)
a078d95a
AM
14643 bfd_put_32 (input_bfd,
14644 STD_R2_0R1 + STK_TOC (htab),
3b421ab3
AM
14645 contents + rel->r_offset);
14646 }
14647 break;
14648
65f38f15
AM
14649 /* Branch taken prediction relocations. */
14650 case R_PPC64_ADDR14_BRTAKEN:
14651 case R_PPC64_REL14_BRTAKEN:
cedb70c5 14652 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
1a0670f3 14653 /* Fall through. */
65f38f15 14654
86c76c7b 14655 /* Branch not taken prediction relocations. */
65f38f15
AM
14656 case R_PPC64_ADDR14_BRNTAKEN:
14657 case R_PPC64_REL14_BRNTAKEN:
95f0d0d2 14658 insn |= bfd_get_32 (input_bfd,
411e1bfb 14659 contents + rel->r_offset) & ~(0x01 << 21);
1a0670f3 14660 /* Fall through. */
86c76c7b 14661
b25116a9
AM
14662 case R_PPC64_REL14:
14663 max_br_offset = 1 << 15;
1a0670f3 14664 /* Fall through. */
5bd4f169 14665
65f38f15 14666 case R_PPC64_REL24:
23cedd1d 14667 case R_PPC64_PLTCALL:
ad8e1ba5
AM
14668 /* Calls to functions with a different TOC, such as calls to
14669 shared objects, need to alter the TOC pointer. This is
14670 done using a linkage stub. A REL24 branching to these
14671 linkage stubs needs to be followed by a nop, as the nop
14672 will be replaced with an instruction to restore the TOC
14673 base pointer. */
8387904d 14674 fdh = h;
b31867b6
AM
14675 if (h != NULL
14676 && h->oh != NULL
14677 && h->oh->is_func_descriptor)
14678 fdh = ppc_follow_link (h->oh);
31c76678
DK
14679 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
14680 htab);
23cedd1d
AM
14681 if (r_type == R_PPC64_PLTCALL
14682 && stub_entry != NULL
14683 && (stub_entry->stub_type == ppc_stub_plt_call
14684 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
14685 stub_entry = NULL;
14686
6abec6bc 14687 if (stub_entry != NULL
ad8e1ba5 14688 && (stub_entry->stub_type == ppc_stub_plt_call
794e51c0 14689 || stub_entry->stub_type == ppc_stub_plt_call_r2save
ad8e1ba5
AM
14690 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
14691 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
41bd81ab 14692 {
b25116a9 14693 bfd_boolean can_plt_call = FALSE;
721956f4 14694
6e1816be
AM
14695 if (stub_entry->stub_type == ppc_stub_plt_call
14696 && !htab->opd_abi
14697 && htab->params->plt_localentry0 != 0
14698 && is_elfv2_localentry0 (&h->elf))
14699 {
14700 /* The function doesn't use or change r2. */
14701 can_plt_call = TRUE;
14702 }
14703
f378ab09 14704 /* All of these stubs may modify r2, so there must be a
ba8ca3e7
AM
14705 branch and link followed by a nop. The nop is
14706 replaced by an insn to restore r2. */
6e1816be 14707 else if (rel->r_offset + 8 <= input_section->size)
41bd81ab 14708 {
ba8ca3e7
AM
14709 unsigned long br;
14710
14711 br = bfd_get_32 (input_bfd,
14712 contents + rel->r_offset);
14713 if ((br & 1) != 0)
41bd81ab 14714 {
ba8ca3e7
AM
14715 unsigned long nop;
14716
14717 nop = bfd_get_32 (input_bfd,
14718 contents + rel->r_offset + 4);
23cedd1d
AM
14719 if (nop == LD_R2_0R1 + STK_TOC (htab))
14720 can_plt_call = TRUE;
14721 else if (nop == NOP
14722 || nop == CROR_151515
14723 || nop == CROR_313131)
a7f2871e 14724 {
ba8ca3e7
AM
14725 if (h != NULL
14726 && (h == htab->tls_get_addr_fd
14727 || h == htab->tls_get_addr)
7c9cf415 14728 && htab->params->tls_get_addr_opt)
ba8ca3e7
AM
14729 {
14730 /* Special stub used, leave nop alone. */
14731 }
14732 else
a078d95a
AM
14733 bfd_put_32 (input_bfd,
14734 LD_R2_0R1 + STK_TOC (htab),
ba8ca3e7
AM
14735 contents + rel->r_offset + 4);
14736 can_plt_call = TRUE;
a7f2871e 14737 }
41bd81ab 14738 }
5bd4f169 14739 }
721956f4 14740
ba8ca3e7 14741 if (!can_plt_call && h != NULL)
721956f4 14742 {
ba8ca3e7
AM
14743 const char *name = h->elf.root.root.string;
14744
14745 if (*name == '.')
14746 ++name;
14747
14748 if (strncmp (name, "__libc_start_main", 17) == 0
14749 && (name[17] == 0 || name[17] == '@'))
6ab189d5 14750 {
ba8ca3e7
AM
14751 /* Allow crt1 branch to go via a toc adjusting
14752 stub. Other calls that never return could do
14753 the same, if we could detect such. */
b25116a9 14754 can_plt_call = TRUE;
6ab189d5 14755 }
ba8ca3e7
AM
14756 }
14757
14758 if (!can_plt_call)
14759 {
14760 /* g++ as of 20130507 emits self-calls without a
14761 following nop. This is arguably wrong since we
14762 have conflicting information. On the one hand a
14763 global symbol and on the other a local call
14764 sequence, but don't error for this special case.
14765 It isn't possible to cheaply verify we have
14766 exactly such a call. Allow all calls to the same
14767 section. */
14768 asection *code_sec = sec;
14769
14770 if (get_opd_info (sec) != NULL)
ad8e1ba5 14771 {
ba8ca3e7
AM
14772 bfd_vma off = (relocation + addend
14773 - sec->output_section->vma
14774 - sec->output_offset);
bc30df16 14775
ba8ca3e7 14776 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
ad8e1ba5 14777 }
ba8ca3e7
AM
14778 if (code_sec == input_section)
14779 can_plt_call = TRUE;
14780 }
14781
14782 if (!can_plt_call)
14783 {
4805fc55
AM
14784 if (stub_entry->stub_type == ppc_stub_plt_call
14785 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14786 info->callbacks->einfo
695344c0 14787 /* xgettext:c-format */
c1c8c1ef 14788 (_("%H: call to `%pT' lacks nop, can't restore toc; "
4805fc55
AM
14789 "recompile with -fPIC\n"),
14790 input_bfd, input_section, rel->r_offset, sym_name);
14791 else
14792 info->callbacks->einfo
695344c0 14793 /* xgettext:c-format */
c1c8c1ef 14794 (_("%H: call to `%pT' lacks nop, can't restore toc; "
4805fc55
AM
14795 "(-mcmodel=small toc adjust stub)\n"),
14796 input_bfd, input_section, rel->r_offset, sym_name);
ba8ca3e7
AM
14797
14798 bfd_set_error (bfd_error_bad_value);
14799 ret = FALSE;
721956f4
AM
14800 }
14801
b25116a9 14802 if (can_plt_call
794e51c0
AM
14803 && (stub_entry->stub_type == ppc_stub_plt_call
14804 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
b25116a9
AM
14805 unresolved_reloc = FALSE;
14806 }
14807
6abec6bc
AM
14808 if ((stub_entry == NULL
14809 || stub_entry->stub_type == ppc_stub_long_branch
14810 || stub_entry->stub_type == ppc_stub_plt_branch)
8387904d
AM
14811 && get_opd_info (sec) != NULL)
14812 {
14813 /* The branch destination is the value of the opd entry. */
4cc603a5
AM
14814 bfd_vma off = (relocation + addend
14815 - sec->output_section->vma
14816 - sec->output_offset);
aef36ac1 14817 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
8387904d
AM
14818 if (dest != (bfd_vma) -1)
14819 {
14820 relocation = dest;
14821 addend = 0;
bc30df16 14822 reloc_dest = DEST_OPD;
8387904d
AM
14823 }
14824 }
14825
b25116a9
AM
14826 /* If the branch is out of reach we ought to have a long
14827 branch stub. */
14828 from = (rel->r_offset
14829 + input_section->output_offset
14830 + input_section->output_section->vma);
14831
6911b7dc
AM
14832 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
14833 ? fdh->elf.other
14834 : sym->st_other);
14835
6abec6bc
AM
14836 if (stub_entry != NULL
14837 && (stub_entry->stub_type == ppc_stub_long_branch
14838 || stub_entry->stub_type == ppc_stub_plt_branch)
14839 && (r_type == R_PPC64_ADDR14_BRTAKEN
14840 || r_type == R_PPC64_ADDR14_BRNTAKEN
14841 || (relocation + addend - from + max_br_offset
14842 < 2 * max_br_offset)))
14843 /* Don't use the stub if this branch is in range. */
14844 stub_entry = NULL;
b25116a9
AM
14845
14846 if (stub_entry != NULL)
14847 {
14848 /* Munge up the value and addend so that we call the stub
14849 rather than the procedure directly. */
a4b6fadd
AM
14850 asection *stub_sec = stub_entry->group->stub_sec;
14851
14852 if (stub_entry->stub_type == ppc_stub_save_res)
14853 relocation += (stub_sec->output_offset
14854 + stub_sec->output_section->vma
14855 + stub_sec->size - htab->sfpr->size
14856 - htab->sfpr->output_offset
14857 - htab->sfpr->output_section->vma);
14858 else
14859 relocation = (stub_entry->stub_offset
14860 + stub_sec->output_offset
14861 + stub_sec->output_section->vma);
b25116a9 14862 addend = 0;
bc30df16 14863 reloc_dest = DEST_STUB;
3b421ab3 14864
954b63d4 14865 if ((stub_entry->stub_type == ppc_stub_plt_call
794e51c0
AM
14866 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14867 && (ALWAYS_EMIT_R2SAVE
14868 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
3b421ab3
AM
14869 && rel + 1 < relend
14870 && rel[1].r_offset == rel->r_offset + 4
14871 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
14872 relocation += 4;
b25116a9
AM
14873 }
14874
14875 if (insn != 0)
14876 {
794e51c0 14877 if (is_isa_v2)
721956f4 14878 {
b25116a9
AM
14879 /* Set 'a' bit. This is 0b00010 in BO field for branch
14880 on CR(BI) insns (BO == 001at or 011at), and 0b01000
14881 for branch on CTR insns (BO == 1a00t or 1a01t). */
14882 if ((insn & (0x14 << 21)) == (0x04 << 21))
14883 insn |= 0x02 << 21;
14884 else if ((insn & (0x14 << 21)) == (0x10 << 21))
14885 insn |= 0x08 << 21;
14886 else
14887 break;
14888 }
14889 else
14890 {
14891 /* Invert 'y' bit if not the default. */
4cc603a5 14892 if ((bfd_signed_vma) (relocation + addend - from) < 0)
b25116a9 14893 insn ^= 0x01 << 21;
721956f4 14894 }
b25116a9 14895
95f0d0d2 14896 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
5bd4f169 14897 }
e86ce104 14898
06da1e8e
AM
14899 /* NOP out calls to undefined weak functions.
14900 We can thus call a weak function without first
14901 checking whether the function is defined. */
b25116a9 14902 else if (h != NULL
039b3fef 14903 && h->elf.root.type == bfd_link_hash_undefweak
766bc656 14904 && h->elf.dynindx == -1
b25116a9
AM
14905 && r_type == R_PPC64_REL24
14906 && relocation == 0
4cc603a5 14907 && addend == 0)
e86ce104 14908 {
95f0d0d2 14909 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
c316a17c 14910 goto copy_reloc;
e86ce104 14911 }
65f38f15
AM
14912 break;
14913 }
5bd4f169 14914
65f38f15 14915 /* Set `addend'. */
411e1bfb 14916 tls_type = 0;
23cedd1d 14917 save_unresolved_reloc = unresolved_reloc;
65f38f15
AM
14918 switch (r_type)
14919 {
14920 default:
cf97bcb0
AM
14921 /* xgettext:c-format */
14922 _bfd_error_handler (_("%pB: %s unsupported"),
14923 input_bfd, ppc64_elf_howto_table[r_type]->name);
5bd4f169 14924
65f38f15 14925 bfd_set_error (bfd_error_bad_value);
b34976b6 14926 ret = FALSE;
c316a17c 14927 goto copy_reloc;
5bd4f169 14928
65f38f15 14929 case R_PPC64_NONE:
411e1bfb 14930 case R_PPC64_TLS:
727fc41e
AM
14931 case R_PPC64_TLSGD:
14932 case R_PPC64_TLSLD:
3b421ab3 14933 case R_PPC64_TOCSAVE:
04c9666a
AM
14934 case R_PPC64_GNU_VTINHERIT:
14935 case R_PPC64_GNU_VTENTRY:
006589cf 14936 case R_PPC64_ENTRY:
c316a17c 14937 goto copy_reloc;
5bd4f169
AM
14938
14939 /* GOT16 relocations. Like an ADDR16 using the symbol's
14940 address in the GOT as relocation value instead of the
411e1bfb 14941 symbol's value itself. Also, create a GOT entry for the
5bd4f169 14942 symbol and put the symbol value there. */
411e1bfb
AM
14943 case R_PPC64_GOT_TLSGD16:
14944 case R_PPC64_GOT_TLSGD16_LO:
14945 case R_PPC64_GOT_TLSGD16_HI:
14946 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 14947 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
14948 goto dogot;
14949
14950 case R_PPC64_GOT_TLSLD16:
14951 case R_PPC64_GOT_TLSLD16_LO:
14952 case R_PPC64_GOT_TLSLD16_HI:
14953 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 14954 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
14955 goto dogot;
14956
14957 case R_PPC64_GOT_TPREL16_DS:
14958 case R_PPC64_GOT_TPREL16_LO_DS:
14959 case R_PPC64_GOT_TPREL16_HI:
14960 case R_PPC64_GOT_TPREL16_HA:
14961 tls_type = TLS_TLS | TLS_TPREL;
14962 goto dogot;
14963
14964 case R_PPC64_GOT_DTPREL16_DS:
14965 case R_PPC64_GOT_DTPREL16_LO_DS:
14966 case R_PPC64_GOT_DTPREL16_HI:
14967 case R_PPC64_GOT_DTPREL16_HA:
14968 tls_type = TLS_TLS | TLS_DTPREL;
14969 goto dogot;
14970
65f38f15
AM
14971 case R_PPC64_GOT16:
14972 case R_PPC64_GOT16_LO:
14973 case R_PPC64_GOT16_HI:
14974 case R_PPC64_GOT16_HA:
14975 case R_PPC64_GOT16_DS:
14976 case R_PPC64_GOT16_LO_DS:
411e1bfb 14977 dogot:
5bd4f169
AM
14978 {
14979 /* Relocation is to the entry for this symbol in the global
14980 offset table. */
e717da7e 14981 asection *got;
d881513a 14982 bfd_vma *offp;
5bd4f169 14983 bfd_vma off;
d881513a 14984 unsigned long indx = 0;
927be08e 14985 struct got_entry *ent;
65f38f15 14986
d881513a
AM
14987 if (tls_type == (TLS_TLS | TLS_LD)
14988 && (h == NULL
f5385ebf 14989 || !h->elf.def_dynamic))
927be08e 14990 ent = ppc64_tlsld_got (input_bfd);
411e1bfb 14991 else
5bd4f169 14992 {
d881513a
AM
14993 if (h != NULL)
14994 {
f0158f44
AM
14995 if (!htab->elf.dynamic_sections_created
14996 || h->elf.dynindx == -1
14997 || SYMBOL_REFERENCES_LOCAL (info, &h->elf)
21d68fcd 14998 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
d881513a
AM
14999 /* This is actually a static link, or it is a
15000 -Bsymbolic link and the symbol is defined
15001 locally, or the symbol was forced to be local
15002 because of a version file. */
15003 ;
15004 else
15005 {
039b3fef 15006 indx = h->elf.dynindx;
d881513a
AM
15007 unresolved_reloc = FALSE;
15008 }
039b3fef 15009 ent = h->elf.got.glist;
d881513a 15010 }
411e1bfb 15011 else
5bd4f169 15012 {
d881513a
AM
15013 if (local_got_ents == NULL)
15014 abort ();
15015 ent = local_got_ents[r_symndx];
5bd4f169 15016 }
d881513a
AM
15017
15018 for (; ent != NULL; ent = ent->next)
31c76678 15019 if (ent->addend == orig_rel.r_addend
e717da7e 15020 && ent->owner == input_bfd
d881513a
AM
15021 && ent->tls_type == tls_type)
15022 break;
5bd4f169 15023 }
411e1bfb 15024
927be08e
AM
15025 if (ent == NULL)
15026 abort ();
15027 if (ent->is_indirect)
15028 ent = ent->got.ent;
15029 offp = &ent->got.offset;
15030 got = ppc64_elf_tdata (ent->owner)->got;
e717da7e
AM
15031 if (got == NULL)
15032 abort ();
15033
411e1bfb
AM
15034 /* The offset must always be a multiple of 8. We use the
15035 least significant bit to record whether we have already
15036 processed this entry. */
d881513a 15037 off = *offp;
411e1bfb
AM
15038 if ((off & 1) != 0)
15039 off &= ~1;
5bd4f169
AM
15040 else
15041 {
411e1bfb
AM
15042 /* Generate relocs for the dynamic linker, except in
15043 the case of TLSLD where we'll use one entry per
15044 module. */
25f23106
AM
15045 asection *relgot;
15046 bfd_boolean ifunc;
e717da7e 15047
d881513a 15048 *offp = off | 1;
25f23106
AM
15049 relgot = NULL;
15050 ifunc = (h != NULL
15051 ? h->elf.type == STT_GNU_IFUNC
15052 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
19e08130 15053 if (ifunc)
82e66161
AM
15054 {
15055 relgot = htab->elf.irelplt;
15056 if (indx == 0)
15057 htab->local_ifunc_resolver = 1;
15058 else if (is_static_defined (&h->elf))
15059 htab->maybe_local_ifunc_resolver = 1;
15060 }
f0158f44
AM
15061 else if (indx != 0
15062 || (bfd_link_pic (info)
15063 && (h == NULL
21d68fcd 15064 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf)
f0158f44 15065 || (tls_type == (TLS_TLS | TLS_LD)
f15d0b54
AM
15066 && !h->elf.def_dynamic))
15067 && !(tls_type == (TLS_TLS | TLS_TPREL)
15068 && bfd_link_executable (info)
15069 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))))
19e08130 15070 relgot = ppc64_elf_tdata (ent->owner)->relgot;
25f23106 15071 if (relgot != NULL)
5bd4f169 15072 {
e717da7e
AM
15073 outrel.r_offset = (got->output_section->vma
15074 + got->output_offset
411e1bfb 15075 + off);
4cc603a5 15076 outrel.r_addend = addend;
d881513a 15077 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 15078 {
411e1bfb 15079 outrel.r_addend = 0;
e515b051 15080 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
15081 if (tls_type == (TLS_TLS | TLS_GD))
15082 {
e717da7e
AM
15083 loc = relgot->contents;
15084 loc += (relgot->reloc_count++
d881513a
AM
15085 * sizeof (Elf64_External_Rela));
15086 bfd_elf64_swap_reloca_out (output_bfd,
15087 &outrel, loc);
e515b051 15088 outrel.r_offset += 8;
4cc603a5 15089 outrel.r_addend = addend;
d881513a
AM
15090 outrel.r_info
15091 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 15092 }
411e1bfb 15093 }
951fd09b 15094 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 15095 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 15096 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 15097 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
25f23106
AM
15098 else if (indx != 0)
15099 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
15100 else
81407a69 15101 {
25f23106
AM
15102 if (ifunc)
15103 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15104 else
15105 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
15106
15107 /* Write the .got section contents for the sake
15108 of prelink. */
e717da7e 15109 loc = got->contents + off;
23fbd6fa
JJ
15110 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
15111 loc);
81407a69 15112 }
81407a69
AM
15113
15114 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
15115 {
15116 outrel.r_addend += relocation;
15117 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
989f9879
AM
15118 {
15119 if (htab->elf.tls_sec == NULL)
15120 outrel.r_addend = 0;
15121 else
15122 outrel.r_addend -= htab->elf.tls_sec->vma;
15123 }
e515b051 15124 }
e717da7e
AM
15125 loc = relgot->contents;
15126 loc += (relgot->reloc_count++
411e1bfb
AM
15127 * sizeof (Elf64_External_Rela));
15128 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
15129 }
15130
ad8e1ba5 15131 /* Init the .got section contents here if we're not
81407a69 15132 emitting a reloc. */
d881513a 15133 else
411e1bfb 15134 {
4cc603a5 15135 relocation += addend;
f0158f44 15136 if (tls_type != 0)
411e1bfb 15137 {
989f9879
AM
15138 if (htab->elf.tls_sec == NULL)
15139 relocation = 0;
15140 else
15141 {
f0158f44
AM
15142 if (tls_type & TLS_LD)
15143 relocation = 0;
15144 else
15145 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
676ee2b5 15146 if (tls_type & TLS_TPREL)
989f9879
AM
15147 relocation += DTP_OFFSET - TP_OFFSET;
15148 }
5bd4f169 15149
f0158f44 15150 if (tls_type & (TLS_GD | TLS_LD))
7b609f53
AM
15151 {
15152 bfd_put_64 (output_bfd, relocation,
e717da7e 15153 got->contents + off + 8);
676ee2b5 15154 relocation = 1;
7b609f53 15155 }
411e1bfb
AM
15156 }
15157 bfd_put_64 (output_bfd, relocation,
e717da7e 15158 got->contents + off);
5bd4f169
AM
15159 }
15160 }
15161
65f38f15
AM
15162 if (off >= (bfd_vma) -2)
15163 abort ();
15164
bf102f86 15165 relocation = got->output_section->vma + got->output_offset + off;
6f20ed8a 15166 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
5bd4f169 15167 }
65f38f15
AM
15168 break;
15169
15170 case R_PPC64_PLT16_HA:
15171 case R_PPC64_PLT16_HI:
15172 case R_PPC64_PLT16_LO:
08be3224 15173 case R_PPC64_PLT16_LO_DS:
65f38f15
AM
15174 case R_PPC64_PLT32:
15175 case R_PPC64_PLT64:
23cedd1d
AM
15176 case R_PPC64_PLTSEQ:
15177 case R_PPC64_PLTCALL:
65f38f15
AM
15178 /* Relocation is to the entry for this symbol in the
15179 procedure linkage table. */
23cedd1d 15180 unresolved_reloc = TRUE;
cbf95972
AM
15181 {
15182 struct plt_entry **plt_list = NULL;
15183 if (h != NULL)
15184 plt_list = &h->elf.plt.plist;
15185 else if (local_got_ents != NULL)
15186 {
15187 struct plt_entry **local_plt = (struct plt_entry **)
15188 (local_got_ents + symtab_hdr->sh_info);
2d7ad24e 15189 plt_list = local_plt + r_symndx;
cbf95972
AM
15190 }
15191 if (plt_list)
15192 {
15193 struct plt_entry *ent;
65f38f15 15194
cbf95972
AM
15195 for (ent = *plt_list; ent != NULL; ent = ent->next)
15196 if (ent->plt.offset != (bfd_vma) -1
15197 && ent->addend == orig_rel.r_addend)
15198 {
15199 asection *plt;
08be3224 15200 bfd_vma got;
cbf95972
AM
15201
15202 plt = htab->elf.splt;
15203 if (!htab->elf.dynamic_sections_created
15204 || h == NULL
15205 || h->elf.dynindx == -1)
2d7ad24e
AM
15206 {
15207 if (h != NULL
15208 ? h->elf.type == STT_GNU_IFUNC
15209 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
15210 plt = htab->elf.iplt;
15211 else
15212 plt = htab->pltlocal;
15213 }
15214 relocation = (plt->output_section->vma
15215 + plt->output_offset
15216 + ent->plt.offset);
08be3224
AM
15217 if (r_type == R_PPC64_PLT16_HA
15218 || r_type ==R_PPC64_PLT16_HI
15219 || r_type ==R_PPC64_PLT16_LO
15220 || r_type ==R_PPC64_PLT16_LO_DS)
15221 {
15222 got = (elf_gp (output_bfd)
15223 + htab->sec_info[input_section->id].toc_off);
15224 relocation -= got;
15225 }
cbf95972
AM
15226 addend = 0;
15227 unresolved_reloc = FALSE;
15228 break;
15229 }
15230 }
15231 }
65f38f15 15232 break;
5bd4f169 15233
0b13192e
AM
15234 case R_PPC64_TOC:
15235 /* Relocation value is TOC base. */
15236 relocation = TOCstart;
cf35638d 15237 if (r_symndx == STN_UNDEF)
6f20ed8a 15238 relocation += htab->sec_info[input_section->id].toc_off;
8517fae7
AM
15239 else if (unresolved_reloc)
15240 ;
6f20ed8a
AM
15241 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
15242 relocation += htab->sec_info[sec->id].toc_off;
0b13192e
AM
15243 else
15244 unresolved_reloc = TRUE;
ab96bf03 15245 goto dodyn;
0b13192e 15246
5bd4f169
AM
15247 /* TOC16 relocs. We want the offset relative to the TOC base,
15248 which is the address of the start of the TOC plus 0x8000.
15249 The TOC consists of sections .got, .toc, .tocbss, and .plt,
15250 in this order. */
65f38f15
AM
15251 case R_PPC64_TOC16:
15252 case R_PPC64_TOC16_LO:
15253 case R_PPC64_TOC16_HI:
15254 case R_PPC64_TOC16_DS:
15255 case R_PPC64_TOC16_LO_DS:
15256 case R_PPC64_TOC16_HA:
6f20ed8a 15257 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
5bd4f169
AM
15258 break;
15259
15260 /* Relocate against the beginning of the section. */
65f38f15
AM
15261 case R_PPC64_SECTOFF:
15262 case R_PPC64_SECTOFF_LO:
15263 case R_PPC64_SECTOFF_HI:
15264 case R_PPC64_SECTOFF_DS:
15265 case R_PPC64_SECTOFF_LO_DS:
15266 case R_PPC64_SECTOFF_HA:
4ce794b7 15267 if (sec != NULL)
65f38f15 15268 addend -= sec->output_section->vma;
5bd4f169
AM
15269 break;
15270
25f23106
AM
15271 case R_PPC64_REL16:
15272 case R_PPC64_REL16_LO:
15273 case R_PPC64_REL16_HI:
15274 case R_PPC64_REL16_HA:
a680de9a 15275 case R_PPC64_REL16DX_HA:
25f23106
AM
15276 break;
15277
721956f4
AM
15278 case R_PPC64_REL14:
15279 case R_PPC64_REL14_BRNTAKEN:
15280 case R_PPC64_REL14_BRTAKEN:
5d1634d7
AM
15281 case R_PPC64_REL24:
15282 break;
15283
411e1bfb
AM
15284 case R_PPC64_TPREL16:
15285 case R_PPC64_TPREL16_LO:
15286 case R_PPC64_TPREL16_HI:
15287 case R_PPC64_TPREL16_HA:
15288 case R_PPC64_TPREL16_DS:
15289 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
15290 case R_PPC64_TPREL16_HIGH:
15291 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
15292 case R_PPC64_TPREL16_HIGHER:
15293 case R_PPC64_TPREL16_HIGHERA:
15294 case R_PPC64_TPREL16_HIGHEST:
15295 case R_PPC64_TPREL16_HIGHESTA:
766bc656
AM
15296 if (h != NULL
15297 && h->elf.root.type == bfd_link_hash_undefweak
15298 && h->elf.dynindx == -1)
15299 {
15300 /* Make this relocation against an undefined weak symbol
15301 resolve to zero. This is really just a tweak, since
15302 code using weak externs ought to check that they are
15303 defined before using them. */
15304 bfd_byte *p = contents + rel->r_offset - d_offset;
15305
95f0d0d2 15306 insn = bfd_get_32 (input_bfd, p);
766bc656
AM
15307 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
15308 if (insn != 0)
95f0d0d2 15309 bfd_put_32 (input_bfd, insn, p);
766bc656
AM
15310 break;
15311 }
989f9879
AM
15312 if (htab->elf.tls_sec != NULL)
15313 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7c8bbca5
AM
15314 /* The TPREL16 relocs shouldn't really be used in shared
15315 libs or with non-local symbols as that will result in
15316 DT_TEXTREL being set, but support them anyway. */
15317 goto dodyn;
411e1bfb
AM
15318
15319 case R_PPC64_DTPREL16:
15320 case R_PPC64_DTPREL16_LO:
15321 case R_PPC64_DTPREL16_HI:
15322 case R_PPC64_DTPREL16_HA:
15323 case R_PPC64_DTPREL16_DS:
15324 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
15325 case R_PPC64_DTPREL16_HIGH:
15326 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
15327 case R_PPC64_DTPREL16_HIGHER:
15328 case R_PPC64_DTPREL16_HIGHERA:
15329 case R_PPC64_DTPREL16_HIGHEST:
15330 case R_PPC64_DTPREL16_HIGHESTA:
989f9879
AM
15331 if (htab->elf.tls_sec != NULL)
15332 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
15333 break;
15334
45965137
AM
15335 case R_PPC64_ADDR64_LOCAL:
15336 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
15337 ? h->elf.other
15338 : sym->st_other);
15339 break;
15340
e515b051
AM
15341 case R_PPC64_DTPMOD64:
15342 relocation = 1;
15343 addend = 0;
15344 goto dodyn;
15345
411e1bfb 15346 case R_PPC64_TPREL64:
989f9879
AM
15347 if (htab->elf.tls_sec != NULL)
15348 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
15349 goto dodyn;
15350
15351 case R_PPC64_DTPREL64:
989f9879
AM
15352 if (htab->elf.tls_sec != NULL)
15353 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
1a0670f3 15354 /* Fall through. */
411e1bfb 15355
65f38f15
AM
15356 /* Relocations that may need to be propagated if this is a
15357 dynamic object. */
04c9666a 15358 case R_PPC64_REL30:
65f38f15
AM
15359 case R_PPC64_REL32:
15360 case R_PPC64_REL64:
15361 case R_PPC64_ADDR14:
15362 case R_PPC64_ADDR14_BRNTAKEN:
15363 case R_PPC64_ADDR14_BRTAKEN:
15364 case R_PPC64_ADDR16:
15365 case R_PPC64_ADDR16_DS:
15366 case R_PPC64_ADDR16_HA:
15367 case R_PPC64_ADDR16_HI:
f9c6b907
AM
15368 case R_PPC64_ADDR16_HIGH:
15369 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
15370 case R_PPC64_ADDR16_HIGHER:
15371 case R_PPC64_ADDR16_HIGHERA:
15372 case R_PPC64_ADDR16_HIGHEST:
15373 case R_PPC64_ADDR16_HIGHESTA:
15374 case R_PPC64_ADDR16_LO:
15375 case R_PPC64_ADDR16_LO_DS:
15376 case R_PPC64_ADDR24:
65f38f15
AM
15377 case R_PPC64_ADDR32:
15378 case R_PPC64_ADDR64:
15379 case R_PPC64_UADDR16:
15380 case R_PPC64_UADDR32:
15381 case R_PPC64_UADDR64:
411e1bfb 15382 dodyn:
5d1634d7 15383 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
15384 break;
15385
41bd81ab
AM
15386 if (NO_OPD_RELOCS && is_opd)
15387 break;
15388
8a9e8e72 15389 if (bfd_link_pic (info)
b1b07054
AM
15390 ? ((h == NULL
15391 || h->dyn_relocs != NULL)
15392 && ((h != NULL && pc_dynrelocs (h))
15393 || must_be_dyn_reloc (info, r_type)))
8a9e8e72
AM
15394 : (h != NULL
15395 ? h->dyn_relocs != NULL
d311bc8b 15396 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
65f38f15 15397 {
b34976b6 15398 bfd_boolean skip, relocate;
65f38f15 15399 asection *sreloc;
1cf1f670 15400 bfd_vma out_off;
82e66161 15401 long indx = 0;
65f38f15
AM
15402
15403 /* When generating a dynamic object, these relocations
15404 are copied into the output file to be resolved at run
15405 time. */
15406
b34976b6
AM
15407 skip = FALSE;
15408 relocate = FALSE;
65f38f15 15409
1cf1f670
AM
15410 out_off = _bfd_elf_section_offset (output_bfd, info,
15411 input_section, rel->r_offset);
15412 if (out_off == (bfd_vma) -1)
b34976b6 15413 skip = TRUE;
1cf1f670 15414 else if (out_off == (bfd_vma) -2)
b34976b6 15415 skip = TRUE, relocate = TRUE;
1cf1f670
AM
15416 out_off += (input_section->output_section->vma
15417 + input_section->output_offset);
15418 outrel.r_offset = out_off;
411e1bfb 15419 outrel.r_addend = rel->r_addend;
65f38f15 15420
1cf1f670
AM
15421 /* Optimize unaligned reloc use. */
15422 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
15423 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
15424 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
15425 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
15426 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
15427 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
15428 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
15429 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
15430 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
15431
65f38f15 15432 if (skip)
0bb2d96a 15433 memset (&outrel, 0, sizeof outrel);
afe397ea 15434 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
15435 && !is_opd
15436 && r_type != R_PPC64_TOC)
14acf4dc 15437 {
82e66161
AM
15438 indx = h->elf.dynindx;
15439 BFD_ASSERT (indx != -1);
15440 outrel.r_info = ELF64_R_INFO (indx, r_type);
14acf4dc 15441 }
65f38f15
AM
15442 else
15443 {
41bd81ab
AM
15444 /* This symbol is local, or marked to become local,
15445 or this is an opd section reloc which must point
15446 at a local function. */
65f38f15 15447 outrel.r_addend += relocation;
e86ce104 15448 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 15449 {
3fad3c7c 15450 if (is_opd && h != NULL)
afbe61cf
AM
15451 {
15452 /* Lie about opd entries. This case occurs
15453 when building shared libraries and we
15454 reference a function in another shared
3fad3c7c
AM
15455 lib. The same thing happens for a weak
15456 definition in an application that's
15457 overridden by a strong definition in a
15458 shared lib. (I believe this is a generic
15459 bug in binutils handling of weak syms.)
15460 In these cases we won't use the opd
1e2f5b6e 15461 entry in this lib. */
b34976b6 15462 unresolved_reloc = FALSE;
afbe61cf 15463 }
25f23106
AM
15464 if (!is_opd
15465 && r_type == R_PPC64_ADDR64
15466 && (h != NULL
15467 ? h->elf.type == STT_GNU_IFUNC
15468 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
15469 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15470 else
15471 {
15472 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69 15473
25f23106
AM
15474 /* We need to relocate .opd contents for ld.so.
15475 Prelink also wants simple and consistent rules
15476 for relocs. This make all RELATIVE relocs have
15477 *r_offset equal to r_addend. */
15478 relocate = TRUE;
15479 }
65f38f15
AM
15480 }
15481 else
15482 {
25f23106
AM
15483 if (h != NULL
15484 ? h->elf.type == STT_GNU_IFUNC
15485 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
15486 {
25f53a85 15487 info->callbacks->einfo
695344c0 15488 /* xgettext:c-format */
174d0a74 15489 (_("%H: %s for indirect "
c1c8c1ef 15490 "function `%pT' unsupported\n"),
25f53a85 15491 input_bfd, input_section, rel->r_offset,
25f23106
AM
15492 ppc64_elf_howto_table[r_type]->name,
15493 sym_name);
15494 ret = FALSE;
15495 }
cf35638d 15496 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
65f38f15
AM
15497 ;
15498 else if (sec == NULL || sec->owner == NULL)
15499 {
15500 bfd_set_error (bfd_error_bad_value);
b34976b6 15501 return FALSE;
65f38f15
AM
15502 }
15503 else
15504 {
15505 asection *osec;
15506
15507 osec = sec->output_section;
15508 indx = elf_section_data (osec)->dynindx;
15509
74541ad4
AM
15510 if (indx == 0)
15511 {
15512 if ((osec->flags & SEC_READONLY) == 0
15513 && htab->elf.data_index_section != NULL)
15514 osec = htab->elf.data_index_section;
15515 else
15516 osec = htab->elf.text_index_section;
15517 indx = elf_section_data (osec)->dynindx;
15518 }
15519 BFD_ASSERT (indx != 0);
15520
65f38f15
AM
15521 /* We are turning this relocation into one
15522 against a section symbol, so subtract out
15523 the output section's address but not the
15524 offset of the input section in the output
15525 section. */
15526 outrel.r_addend -= osec->vma;
15527 }
15528
15529 outrel.r_info = ELF64_R_INFO (indx, r_type);
15530 }
15531 }
15532
15533 sreloc = elf_section_data (input_section)->sreloc;
19e08130
AM
15534 if (h != NULL
15535 ? h->elf.type == STT_GNU_IFUNC
15536 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
82e66161
AM
15537 {
15538 sreloc = htab->elf.irelplt;
15539 if (indx == 0)
15540 htab->local_ifunc_resolver = 1;
15541 else if (is_static_defined (&h->elf))
15542 htab->maybe_local_ifunc_resolver = 1;
15543 }
65f38f15
AM
15544 if (sreloc == NULL)
15545 abort ();
15546
dfbb6ac9
AM
15547 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
15548 >= sreloc->size)
15549 abort ();
947216bf
AM
15550 loc = sreloc->contents;
15551 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
15552 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
15553
15554 /* If this reloc is against an external symbol, it will
15555 be computed at runtime, so there's no need to do
81407a69
AM
15556 anything now. However, for the sake of prelink ensure
15557 that the section contents are a known value. */
65f38f15 15558 if (! relocate)
81407a69
AM
15559 {
15560 unresolved_reloc = FALSE;
15561 /* The value chosen here is quite arbitrary as ld.so
15562 ignores section contents except for the special
15563 case of .opd where the contents might be accessed
15564 before relocation. Choose zero, as that won't
15565 cause reloc overflow. */
15566 relocation = 0;
15567 addend = 0;
15568 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
15569 to improve backward compatibility with older
15570 versions of ld. */
15571 if (r_type == R_PPC64_ADDR64)
15572 addend = outrel.r_addend;
15573 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 15574 else if (ppc64_elf_howto_table[r_type]->pc_relative)
f0158f44 15575 addend = outrel.r_offset;
81407a69 15576 }
65f38f15 15577 }
5bd4f169
AM
15578 break;
15579
65f38f15
AM
15580 case R_PPC64_COPY:
15581 case R_PPC64_GLOB_DAT:
15582 case R_PPC64_JMP_SLOT:
25f23106 15583 case R_PPC64_JMP_IREL:
65f38f15
AM
15584 case R_PPC64_RELATIVE:
15585 /* We shouldn't ever see these dynamic relocs in relocatable
15586 files. */
ae9a127f 15587 /* Fall through. */
65f38f15
AM
15588
15589 case R_PPC64_PLTGOT16:
15590 case R_PPC64_PLTGOT16_DS:
15591 case R_PPC64_PLTGOT16_HA:
15592 case R_PPC64_PLTGOT16_HI:
15593 case R_PPC64_PLTGOT16_LO:
15594 case R_PPC64_PLTGOT16_LO_DS:
15595 case R_PPC64_PLTREL32:
15596 case R_PPC64_PLTREL64:
15597 /* These ones haven't been implemented yet. */
15598
25f53a85 15599 info->callbacks->einfo
695344c0 15600 /* xgettext:c-format */
c1c8c1ef 15601 (_("%P: %pB: %s is not supported for `%pT'\n"),
d003868e 15602 input_bfd,
4ce794b7 15603 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
15604
15605 bfd_set_error (bfd_error_invalid_operation);
b34976b6 15606 ret = FALSE;
c316a17c 15607 goto copy_reloc;
65f38f15 15608 }
5bd4f169 15609
67f0cbdb
AM
15610 /* Multi-instruction sequences that access the TOC can be
15611 optimized, eg. addis ra,r2,0; addi rb,ra,x;
07d6d2b8 15612 to nop; addi rb,r2,x; */
67f0cbdb
AM
15613 switch (r_type)
15614 {
15615 default:
15616 break;
15617
15618 case R_PPC64_GOT_TLSLD16_HI:
15619 case R_PPC64_GOT_TLSGD16_HI:
15620 case R_PPC64_GOT_TPREL16_HI:
15621 case R_PPC64_GOT_DTPREL16_HI:
15622 case R_PPC64_GOT16_HI:
15623 case R_PPC64_TOC16_HI:
15624 /* These relocs would only be useful if building up an
15625 offset to later add to r2, perhaps in an indexed
15626 addressing mode instruction. Don't try to optimize.
15627 Unfortunately, the possibility of someone building up an
15628 offset like this or even with the HA relocs, means that
15629 we need to check the high insn when optimizing the low
15630 insn. */
15631 break;
15632
23cedd1d
AM
15633 case R_PPC64_PLTCALL:
15634 if (unresolved_reloc)
15635 {
15636 /* No plt entry. Make this into a direct call. */
15637 bfd_byte *p = contents + rel->r_offset;
15638 insn = bfd_get_32 (input_bfd, p);
15639 insn &= 1;
15640 bfd_put_32 (input_bfd, B_DOT | insn, p);
15641 bfd_put_32 (input_bfd, NOP, p + 4);
15642 unresolved_reloc = save_unresolved_reloc;
15643 r_type = R_PPC64_REL24;
15644 }
15645 break;
15646
15647 case R_PPC64_PLTSEQ:
15648 if (unresolved_reloc)
15649 {
15650 unresolved_reloc = FALSE;
15651 goto nop_it;
15652 }
15653 break;
15654
15655 case R_PPC64_PLT16_HA:
15656 if (unresolved_reloc)
15657 {
15658 unresolved_reloc = FALSE;
15659 goto nop_it;
15660 }
15661 /* Fall through. */
67f0cbdb
AM
15662 case R_PPC64_GOT_TLSLD16_HA:
15663 case R_PPC64_GOT_TLSGD16_HA:
15664 case R_PPC64_GOT_TPREL16_HA:
15665 case R_PPC64_GOT_DTPREL16_HA:
15666 case R_PPC64_GOT16_HA:
15667 case R_PPC64_TOC16_HA:
98528052 15668 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 15669 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
98528052 15670 {
23cedd1d
AM
15671 bfd_byte *p;
15672 nop_it:
15673 p = contents + (rel->r_offset & ~3);
98528052 15674 bfd_put_32 (input_bfd, NOP, p);
d830549d 15675 goto copy_reloc;
98528052 15676 }
67f0cbdb
AM
15677 break;
15678
23cedd1d
AM
15679 case R_PPC64_PLT16_LO:
15680 case R_PPC64_PLT16_LO_DS:
15681 if (unresolved_reloc)
15682 {
15683 unresolved_reloc = FALSE;
15684 goto nop_it;
15685 }
15686 /* Fall through. */
67f0cbdb
AM
15687 case R_PPC64_GOT_TLSLD16_LO:
15688 case R_PPC64_GOT_TLSGD16_LO:
15689 case R_PPC64_GOT_TPREL16_LO_DS:
15690 case R_PPC64_GOT_DTPREL16_LO_DS:
15691 case R_PPC64_GOT16_LO:
15692 case R_PPC64_GOT16_LO_DS:
15693 case R_PPC64_TOC16_LO:
15694 case R_PPC64_TOC16_LO_DS:
98528052 15695 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
560c8763 15696 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
67f0cbdb
AM
15697 {
15698 bfd_byte *p = contents + (rel->r_offset & ~3);
15699 insn = bfd_get_32 (input_bfd, p);
560c8763
AM
15700 if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
15701 {
15702 /* Transform addic to addi when we change reg. */
15703 insn &= ~((0x3f << 26) | (0x1f << 16));
15704 insn |= (14u << 26) | (2 << 16);
15705 }
15706 else
67f0cbdb 15707 {
98528052
AM
15708 insn &= ~(0x1f << 16);
15709 insn |= 2 << 16;
67f0cbdb 15710 }
560c8763 15711 bfd_put_32 (input_bfd, insn, p);
67f0cbdb
AM
15712 }
15713 break;
9a23f96e
AM
15714
15715 case R_PPC64_TPREL16_HA:
15716 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
15717 {
15718 bfd_byte *p = contents + (rel->r_offset & ~3);
15719 insn = bfd_get_32 (input_bfd, p);
15720 if ((insn & ((0x3f << 26) | 0x1f << 16))
15721 != ((15u << 26) | (13 << 16)) /* addis rt,13,imm */)
15722 /* xgettext:c-format */
15723 info->callbacks->minfo
15724 (_("%H: warning: %s unexpected insn %#x.\n"),
d830549d
AM
15725 input_bfd, input_section, rel->r_offset,
15726 ppc64_elf_howto_table[r_type]->name, insn);
9a23f96e 15727 else
d830549d
AM
15728 {
15729 bfd_put_32 (input_bfd, NOP, p);
15730 goto copy_reloc;
15731 }
9a23f96e
AM
15732 }
15733 break;
15734
15735 case R_PPC64_TPREL16_LO:
15736 case R_PPC64_TPREL16_LO_DS:
15737 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
15738 {
15739 bfd_byte *p = contents + (rel->r_offset & ~3);
15740 insn = bfd_get_32 (input_bfd, p);
15741 insn &= ~(0x1f << 16);
15742 insn |= 13 << 16;
15743 bfd_put_32 (input_bfd, insn, p);
15744 }
15745 break;
67f0cbdb
AM
15746 }
15747
65f38f15
AM
15748 /* Do any further special processing. */
15749 switch (r_type)
15750 {
15751 default:
15752 break;
15753
25f23106 15754 case R_PPC64_REL16_HA:
a680de9a 15755 case R_PPC64_REL16DX_HA:
f9c6b907
AM
15756 case R_PPC64_ADDR16_HA:
15757 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
15758 case R_PPC64_ADDR16_HIGHERA:
15759 case R_PPC64_ADDR16_HIGHESTA:
65f38f15
AM
15760 case R_PPC64_TOC16_HA:
15761 case R_PPC64_SECTOFF_HA:
411e1bfb 15762 case R_PPC64_TPREL16_HA:
f9c6b907 15763 case R_PPC64_TPREL16_HIGHA:
411e1bfb 15764 case R_PPC64_TPREL16_HIGHERA:
411e1bfb 15765 case R_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
15766 case R_PPC64_DTPREL16_HA:
15767 case R_PPC64_DTPREL16_HIGHA:
411e1bfb 15768 case R_PPC64_DTPREL16_HIGHERA:
411e1bfb 15769 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
15770 /* It's just possible that this symbol is a weak symbol
15771 that's not actually defined anywhere. In that case,
15772 'sec' would be NULL, and we should leave the symbol
15773 alone (it will be set to zero elsewhere in the link). */
5c5f6e17
AM
15774 if (sec == NULL)
15775 break;
1a0670f3 15776 /* Fall through. */
5c5f6e17
AM
15777
15778 case R_PPC64_GOT16_HA:
15779 case R_PPC64_PLTGOT16_HA:
15780 case R_PPC64_PLT16_HA:
15781 case R_PPC64_GOT_TLSGD16_HA:
15782 case R_PPC64_GOT_TLSLD16_HA:
15783 case R_PPC64_GOT_TPREL16_HA:
15784 case R_PPC64_GOT_DTPREL16_HA:
15785 /* Add 0x10000 if sign bit in 0:15 is set.
15786 Bits 0:15 are not used. */
15787 addend += 0x8000;
65f38f15
AM
15788 break;
15789
15790 case R_PPC64_ADDR16_DS:
15791 case R_PPC64_ADDR16_LO_DS:
15792 case R_PPC64_GOT16_DS:
15793 case R_PPC64_GOT16_LO_DS:
15794 case R_PPC64_PLT16_LO_DS:
15795 case R_PPC64_SECTOFF_DS:
15796 case R_PPC64_SECTOFF_LO_DS:
15797 case R_PPC64_TOC16_DS:
15798 case R_PPC64_TOC16_LO_DS:
15799 case R_PPC64_PLTGOT16_DS:
15800 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
15801 case R_PPC64_GOT_TPREL16_DS:
15802 case R_PPC64_GOT_TPREL16_LO_DS:
15803 case R_PPC64_GOT_DTPREL16_DS:
15804 case R_PPC64_GOT_DTPREL16_LO_DS:
15805 case R_PPC64_TPREL16_DS:
15806 case R_PPC64_TPREL16_LO_DS:
15807 case R_PPC64_DTPREL16_DS:
15808 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
15809 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
15810 mask = 3;
a680de9a
PB
15811 /* If this reloc is against an lq, lxv, or stxv insn, then
15812 the value must be a multiple of 16. This is somewhat of
15813 a hack, but the "correct" way to do this by defining _DQ
15814 forms of all the _DS relocs bloats all reloc switches in
15815 this file. It doesn't make much sense to use these
15816 relocs in data, so testing the insn should be safe. */
15817 if ((insn & (0x3f << 26)) == (56u << 26)
15818 || ((insn & (0x3f << 26)) == (61u << 26) && (insn & 3) == 1))
adadcc0c 15819 mask = 15;
a680de9a
PB
15820 relocation += addend;
15821 addend = insn & (mask ^ 3);
15822 if ((relocation & mask) != 0)
65f38f15 15823 {
a680de9a 15824 relocation ^= relocation & mask;
25f53a85 15825 info->callbacks->einfo
695344c0 15826 /* xgettext:c-format */
174d0a74 15827 (_("%H: error: %s not a multiple of %u\n"),
25f53a85 15828 input_bfd, input_section, rel->r_offset,
d830549d 15829 ppc64_elf_howto_table[r_type]->name,
adadcc0c 15830 mask + 1);
65f38f15 15831 bfd_set_error (bfd_error_bad_value);
b34976b6 15832 ret = FALSE;
c316a17c 15833 goto copy_reloc;
65f38f15
AM
15834 }
15835 break;
5bd4f169
AM
15836 }
15837
239e1f3a
AM
15838 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
15839 because such sections are not SEC_ALLOC and thus ld.so will
15840 not process them. */
d830549d 15841 howto = ppc64_elf_howto_table[(int) r_type];
65f38f15 15842 if (unresolved_reloc
239e1f3a 15843 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
15844 && h->elf.def_dynamic)
15845 && _bfd_elf_section_offset (output_bfd, info, input_section,
15846 rel->r_offset) != (bfd_vma) -1)
9c07fe7c 15847 {
25f53a85 15848 info->callbacks->einfo
695344c0 15849 /* xgettext:c-format */
c1c8c1ef 15850 (_("%H: unresolvable %s against `%pT'\n"),
25f53a85 15851 input_bfd, input_section, rel->r_offset,
b80eed39 15852 howto->name,
039b3fef 15853 h->elf.root.root.string);
b34976b6 15854 ret = FALSE;
9c07fe7c 15855 }
5bd4f169 15856
b80eed39
AM
15857 /* 16-bit fields in insns mostly have signed values, but a
15858 few insns have 16-bit unsigned values. Really, we should
15859 have different reloc types. */
15860 if (howto->complain_on_overflow != complain_overflow_dont
15861 && howto->dst_mask == 0xffff
15862 && (input_section->flags & SEC_CODE) != 0)
15863 {
15864 enum complain_overflow complain = complain_overflow_signed;
15865
15866 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
a47622ac
AM
15867 if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
15868 complain = complain_overflow_bitfield;
15869 else if (howto->rightshift == 0
15870 ? ((insn & (0x3f << 26)) == 28u << 26 /* andi */
15871 || (insn & (0x3f << 26)) == 24u << 26 /* ori */
15872 || (insn & (0x3f << 26)) == 26u << 26 /* xori */)
15873 : ((insn & (0x3f << 26)) == 29u << 26 /* andis */
15874 || (insn & (0x3f << 26)) == 25u << 26 /* oris */
15875 || (insn & (0x3f << 26)) == 27u << 26 /* xoris */))
b80eed39
AM
15876 complain = complain_overflow_unsigned;
15877 if (howto->complain_on_overflow != complain)
15878 {
15879 alt_howto = *howto;
15880 alt_howto.complain_on_overflow = complain;
15881 howto = &alt_howto;
15882 }
15883 }
15884
a680de9a
PB
15885 if (r_type == R_PPC64_REL16DX_HA)
15886 {
15887 /* Split field reloc isn't handled by _bfd_final_link_relocate. */
15888 if (rel->r_offset + 4 > input_section->size)
15889 r = bfd_reloc_outofrange;
15890 else
15891 {
15892 relocation += addend;
15893 relocation -= (rel->r_offset
15894 + input_section->output_offset
15895 + input_section->output_section->vma);
3de43e7b 15896 relocation = (bfd_signed_vma) relocation >> 16;
a680de9a
PB
15897 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15898 insn &= ~0x1fffc1;
3de43e7b 15899 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
a680de9a
PB
15900 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
15901 r = bfd_reloc_ok;
3de43e7b 15902 if (relocation + 0x8000 > 0xffff)
a680de9a
PB
15903 r = bfd_reloc_overflow;
15904 }
15905 }
15906 else
15907 r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
15908 rel->r_offset, relocation, addend);
5bd4f169 15909
ef60b7ff 15910 if (r != bfd_reloc_ok)
5bd4f169 15911 {
bc30df16 15912 char *more_info = NULL;
b80eed39 15913 const char *reloc_name = howto->name;
bc30df16
AM
15914
15915 if (reloc_dest != DEST_NORMAL)
15916 {
15917 more_info = bfd_malloc (strlen (reloc_name) + 8);
15918 if (more_info != NULL)
15919 {
15920 strcpy (more_info, reloc_name);
15921 strcat (more_info, (reloc_dest == DEST_OPD
15922 ? " (OPD)" : " (stub)"));
15923 reloc_name = more_info;
15924 }
15925 }
15926
cd27b276 15927 if (r == bfd_reloc_overflow)
5bd4f169 15928 {
8131c122
AM
15929 /* On code like "if (foo) foo();" don't report overflow
15930 on a branch to zero when foo is undefined. */
15931 if (!warned
15932 && (reloc_dest == DEST_STUB
15933 || !(h != NULL
15934 && (h->elf.root.type == bfd_link_hash_undefweak
15935 || h->elf.root.type == bfd_link_hash_undefined)
15936 && is_branch_reloc (r_type))))
1a72702b
AM
15937 info->callbacks->reloc_overflow (info, &h->elf.root,
15938 sym_name, reloc_name,
15939 orig_rel.r_addend,
15940 input_bfd, input_section,
15941 rel->r_offset);
ef60b7ff
AM
15942 }
15943 else
15944 {
25f53a85 15945 info->callbacks->einfo
695344c0 15946 /* xgettext:c-format */
c1c8c1ef 15947 (_("%H: %s against `%pT': error %d\n"),
25f53a85 15948 input_bfd, input_section, rel->r_offset,
bc30df16 15949 reloc_name, sym_name, (int) r);
b34976b6 15950 ret = FALSE;
ef60b7ff 15951 }
bc30df16
AM
15952 if (more_info != NULL)
15953 free (more_info);
5bd4f169 15954 }
c316a17c
AM
15955 copy_reloc:
15956 if (wrel != rel)
15957 *wrel = *rel;
15958 }
15959
15960 if (wrel != rel)
15961 {
15962 Elf_Internal_Shdr *rel_hdr;
15963 size_t deleted = rel - wrel;
15964
15965 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
15966 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
15967 if (rel_hdr->sh_size == 0)
15968 {
15969 /* It is too late to remove an empty reloc section. Leave
15970 one NONE reloc.
15971 ??? What is wrong with an empty section??? */
15972 rel_hdr->sh_size = rel_hdr->sh_entsize;
15973 deleted -= 1;
15974 }
15975 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
15976 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
15977 input_section->reloc_count -= deleted;
5bd4f169
AM
15978 }
15979
645ea6a9
AM
15980 /* If we're emitting relocations, then shortly after this function
15981 returns, reloc offsets and addends for this section will be
15982 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
15983 file rather than the input. Save a copy of the relocs for
15984 opd_entry_value. */
0e1862bb 15985 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
8860955f
AM
15986 {
15987 bfd_size_type amt;
15988 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
15989 rel = bfd_alloc (input_bfd, amt);
729eabd5
AM
15990 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
15991 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
8860955f
AM
15992 if (rel == NULL)
15993 return FALSE;
15994 memcpy (rel, relocs, amt);
15995 }
5bd4f169
AM
15996 return ret;
15997}
15998
754021d0
AM
15999/* Adjust the value of any local symbols in opd sections. */
16000
6e0b88f1 16001static int
754021d0
AM
16002ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
16003 const char *name ATTRIBUTE_UNUSED,
16004 Elf_Internal_Sym *elfsym,
16005 asection *input_sec,
16006 struct elf_link_hash_entry *h)
16007{
74f0fb50
AM
16008 struct _opd_sec_data *opd;
16009 long adjust;
754021d0
AM
16010 bfd_vma value;
16011
4025353c 16012 if (h != NULL)
6e0b88f1 16013 return 1;
4025353c 16014
74f0fb50
AM
16015 opd = get_opd_info (input_sec);
16016 if (opd == NULL || opd->adjust == NULL)
6e0b88f1 16017 return 1;
754021d0
AM
16018
16019 value = elfsym->st_value - input_sec->output_offset;
0e1862bb 16020 if (!bfd_link_relocatable (info))
754021d0
AM
16021 value -= input_sec->output_section->vma;
16022
51aecdc5 16023 adjust = opd->adjust[OPD_NDX (value)];
4025353c 16024 if (adjust == -1)
6e0b88f1
AM
16025 return 2;
16026
16027 elfsym->st_value += adjust;
16028 return 1;
754021d0
AM
16029}
16030
5bd4f169
AM
16031/* Finish up dynamic symbol handling. We set the contents of various
16032 dynamic sections here. */
16033
b34976b6 16034static bfd_boolean
4ce794b7
AM
16035ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
16036 struct bfd_link_info *info,
16037 struct elf_link_hash_entry *h,
4aef7643 16038 Elf_Internal_Sym *sym)
5bd4f169 16039{
65f38f15 16040 struct ppc_link_hash_table *htab;
8387904d 16041 struct plt_entry *ent;
5bd4f169 16042
65f38f15 16043 htab = ppc_hash_table (info);
4dfe6ac6
NC
16044 if (htab == NULL)
16045 return FALSE;
5bd4f169 16046
49c09209
AM
16047 if (!htab->opd_abi && !h->def_regular)
16048 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
16049 if (ent->plt.offset != (bfd_vma) -1)
16050 {
16051 /* Mark the symbol as undefined, rather than as
16052 defined in glink. Leave the value if there were
16053 any relocations where pointer equality matters
16054 (this is a clue for the dynamic linker, to make
16055 function pointer comparisons work between an
16056 application and shared library), otherwise set it
16057 to zero. */
16058 sym->st_shndx = SHN_UNDEF;
16059 if (!h->pointer_equality_needed)
16060 sym->st_value = 0;
16061 else if (!h->ref_regular_nonweak)
16062 {
16063 /* This breaks function pointer comparisons, but
16064 that is better than breaking tests for a NULL
16065 function pointer. */
16066 sym->st_value = 0;
16067 }
16068 break;
16069 }
5bd4f169 16070
f5385ebf 16071 if (h->needs_copy)
5bd4f169 16072 {
65f38f15 16073 /* This symbol needs a copy reloc. Set it up. */
49c09209 16074 Elf_Internal_Rela rela;
5474d94f 16075 asection *srel;
49c09209 16076 bfd_byte *loc;
5bd4f169 16077
65f38f15
AM
16078 if (h->dynindx == -1
16079 || (h->root.type != bfd_link_hash_defined
16080 && h->root.type != bfd_link_hash_defweak)
5474d94f
AM
16081 || htab->elf.srelbss == NULL
16082 || htab->elf.sreldynrelro == NULL)
65f38f15 16083 abort ();
5bd4f169
AM
16084
16085 rela.r_offset = (h->root.u.def.value
16086 + h->root.u.def.section->output_section->vma
16087 + h->root.u.def.section->output_offset);
16088 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
16089 rela.r_addend = 0;
afbf7e8e 16090 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
16091 srel = htab->elf.sreldynrelro;
16092 else
16093 srel = htab->elf.srelbss;
16094 loc = srel->contents;
16095 loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 16096 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
16097 }
16098
b34976b6 16099 return TRUE;
5bd4f169
AM
16100}
16101
65f38f15
AM
16102/* Used to decide how to sort relocs in an optimal manner for the
16103 dynamic linker, before writing them out. */
16104
16105static enum elf_reloc_type_class
7e612e98
AM
16106ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
16107 const asection *rel_sec,
16108 const Elf_Internal_Rela *rela)
65f38f15 16109{
04c9666a 16110 enum elf_ppc64_reloc_type r_type;
7e612e98
AM
16111 struct ppc_link_hash_table *htab = ppc_hash_table (info);
16112
33e44f2e 16113 if (rel_sec == htab->elf.irelplt)
7e612e98 16114 return reloc_class_ifunc;
a33d1f77 16115
4ce794b7 16116 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 16117 switch (r_type)
65f38f15
AM
16118 {
16119 case R_PPC64_RELATIVE:
16120 return reloc_class_relative;
16121 case R_PPC64_JMP_SLOT:
16122 return reloc_class_plt;
16123 case R_PPC64_COPY:
16124 return reloc_class_copy;
16125 default:
16126 return reloc_class_normal;
16127 }
16128}
16129
5bd4f169
AM
16130/* Finish up the dynamic sections. */
16131
b34976b6 16132static bfd_boolean
4ce794b7
AM
16133ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
16134 struct bfd_link_info *info)
5bd4f169 16135{
65f38f15
AM
16136 struct ppc_link_hash_table *htab;
16137 bfd *dynobj;
5bd4f169 16138 asection *sdyn;
5bd4f169 16139
65f38f15 16140 htab = ppc_hash_table (info);
4dfe6ac6
NC
16141 if (htab == NULL)
16142 return FALSE;
16143
65f38f15 16144 dynobj = htab->elf.dynobj;
3d4d4302 16145 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5bd4f169 16146
65f38f15 16147 if (htab->elf.dynamic_sections_created)
5bd4f169 16148 {
5bd4f169
AM
16149 Elf64_External_Dyn *dyncon, *dynconend;
16150
33e44f2e 16151 if (sdyn == NULL || htab->elf.sgot == NULL)
65f38f15 16152 abort ();
5bd4f169
AM
16153
16154 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 16155 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
16156 for (; dyncon < dynconend; dyncon++)
16157 {
16158 Elf_Internal_Dyn dyn;
19397422 16159 asection *s;
5bd4f169
AM
16160
16161 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
16162
16163 switch (dyn.d_tag)
16164 {
65f38f15
AM
16165 default:
16166 continue;
5bd4f169 16167
5d1634d7 16168 case DT_PPC64_GLINK:
4ce794b7 16169 s = htab->glink;
6348e046 16170 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
16171 /* We stupidly defined DT_PPC64_GLINK to be the start
16172 of glink rather than the first entry point, which is
16173 what ld.so needs, and now have a bigger stub to
16174 support automatic multiple TOCs. */
9e390558 16175 dyn.d_un.d_ptr += GLINK_PLTRESOLVE_SIZE (htab) - 8 * 4;
5d1634d7
AM
16176 break;
16177
19397422
AM
16178 case DT_PPC64_OPD:
16179 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
16180 if (s == NULL)
16181 continue;
16182 dyn.d_un.d_ptr = s->vma;
19397422
AM
16183 break;
16184
e8910a83
AM
16185 case DT_PPC64_OPT:
16186 if (htab->do_multi_toc && htab->multi_toc_needed)
16187 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
f378ab09
AM
16188 if (htab->has_plt_localentry0)
16189 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY;
e8910a83
AM
16190 break;
16191
19397422
AM
16192 case DT_PPC64_OPDSZ:
16193 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
16194 if (s == NULL)
16195 continue;
eea6121a 16196 dyn.d_un.d_val = s->size;
19397422
AM
16197 break;
16198
65f38f15 16199 case DT_PLTGOT:
33e44f2e 16200 s = htab->elf.splt;
6348e046 16201 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
16202 break;
16203
16204 case DT_JMPREL:
33e44f2e 16205 s = htab->elf.srelplt;
6348e046 16206 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 16207 break;
5bd4f169 16208
65f38f15 16209 case DT_PLTRELSZ:
33e44f2e 16210 dyn.d_un.d_val = htab->elf.srelplt->size;
5d1634d7 16211 break;
82e66161
AM
16212
16213 case DT_TEXTREL:
16214 if (htab->local_ifunc_resolver)
16215 info->callbacks->einfo
16216 (_("%X%P: text relocations and GNU indirect "
16217 "functions will result in a segfault at runtime\n"));
16218 else if (htab->maybe_local_ifunc_resolver)
16219 info->callbacks->einfo
16220 (_("%P: warning: text relocations and GNU indirect "
16221 "functions may result in a segfault at runtime\n"));
16222 continue;
5bd4f169 16223 }
5bd4f169 16224
65f38f15 16225 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 16226 }
5bd4f169
AM
16227 }
16228
6528b6eb
AM
16229 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0
16230 && htab->elf.sgot->output_section != bfd_abs_section_ptr)
5d1634d7
AM
16231 {
16232 /* Fill in the first entry in the global offset table.
16233 We use it to hold the link-time TOCbase. */
16234 bfd_put_64 (output_bfd,
60ee0d4a 16235 elf_gp (output_bfd) + TOC_BASE_OFF,
33e44f2e 16236 htab->elf.sgot->contents);
5d1634d7
AM
16237
16238 /* Set .got entry size. */
33e44f2e 16239 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 8;
5d1634d7
AM
16240 }
16241
6528b6eb
AM
16242 if (htab->elf.splt != NULL && htab->elf.splt->size != 0
16243 && htab->elf.splt->output_section != bfd_abs_section_ptr)
5d1634d7
AM
16244 {
16245 /* Set .plt entry size. */
33e44f2e 16246 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
b9e5796b 16247 = PLT_ENTRY_SIZE (htab);
5d1634d7
AM
16248 }
16249
84f5d08e
AM
16250 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
16251 brlt ourselves if emitrelocations. */
16252 if (htab->brlt != NULL
16253 && htab->brlt->reloc_count != 0
16254 && !_bfd_elf_link_output_relocs (output_bfd,
16255 htab->brlt,
d4730f92 16256 elf_section_data (htab->brlt)->rela.hdr,
84f5d08e
AM
16257 elf_section_data (htab->brlt)->relocs,
16258 NULL))
16259 return FALSE;
16260
176a0d42
AM
16261 if (htab->glink != NULL
16262 && htab->glink->reloc_count != 0
16263 && !_bfd_elf_link_output_relocs (output_bfd,
16264 htab->glink,
d4730f92 16265 elf_section_data (htab->glink)->rela.hdr,
176a0d42
AM
16266 elf_section_data (htab->glink)->relocs,
16267 NULL))
16268 return FALSE;
16269
58d180e8 16270 if (htab->glink_eh_frame != NULL
da44f4e5
AM
16271 && htab->glink_eh_frame->size != 0)
16272 {
16273 bfd_vma val;
16274 bfd_byte *p;
d4aaa2a0 16275 struct map_stub *group;
2e0ce1c8 16276 size_t align = 4;
da44f4e5 16277
2e0ce1c8
AM
16278 p = htab->glink_eh_frame->contents;
16279 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
d4aaa2a0
AM
16280
16281 for (group = htab->group; group != NULL; group = group->next)
16282 if (group->stub_sec != NULL)
da44f4e5 16283 {
da44f4e5 16284 /* Offset to stub section. */
d4aaa2a0
AM
16285 val = (group->stub_sec->output_section->vma
16286 + group->stub_sec->output_offset);
da44f4e5
AM
16287 val -= (htab->glink_eh_frame->output_section->vma
16288 + htab->glink_eh_frame->output_offset
d4aaa2a0 16289 + (p + 8 - htab->glink_eh_frame->contents));
da44f4e5
AM
16290 if (val + 0x80000000 > 0xffffffff)
16291 {
cf97bcb0
AM
16292 _bfd_error_handler
16293 (_("%s offset too large for .eh_frame sdata4 encoding"),
d4aaa2a0 16294 group->stub_sec->name);
da44f4e5
AM
16295 return FALSE;
16296 }
d4aaa2a0
AM
16297 bfd_put_32 (dynobj, val, p + 8);
16298 p += stub_eh_frame_size (group, align);
da44f4e5
AM
16299 }
16300 if (htab->glink != NULL && htab->glink->size != 0)
16301 {
da44f4e5
AM
16302 /* Offset to .glink. */
16303 val = (htab->glink->output_section->vma
16304 + htab->glink->output_offset
16305 + 8);
16306 val -= (htab->glink_eh_frame->output_section->vma
16307 + htab->glink_eh_frame->output_offset
d4aaa2a0 16308 + (p + 8 - htab->glink_eh_frame->contents));
da44f4e5
AM
16309 if (val + 0x80000000 > 0xffffffff)
16310 {
cf97bcb0
AM
16311 _bfd_error_handler
16312 (_("%s offset too large for .eh_frame sdata4 encoding"),
da44f4e5
AM
16313 htab->glink->name);
16314 return FALSE;
16315 }
d4aaa2a0
AM
16316 bfd_put_32 (dynobj, val, p + 8);
16317 p += (24 + align - 1) & -align;
da44f4e5
AM
16318 }
16319
16320 if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
16321 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
16322 htab->glink_eh_frame,
16323 htab->glink_eh_frame->contents))
16324 return FALSE;
16325 }
58d180e8 16326
e717da7e 16327 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
16328 since we didn't add them to DYNOBJ. We know dynobj is the first
16329 bfd. */
c72f2fb2 16330 while ((dynobj = dynobj->link.next) != NULL)
e717da7e
AM
16331 {
16332 asection *s;
7b53ace3 16333
0c8d6e5c 16334 if (!is_ppc64_elf (dynobj))
7b53ace3
AM
16335 continue;
16336
e717da7e
AM
16337 s = ppc64_elf_tdata (dynobj)->got;
16338 if (s != NULL
eea6121a 16339 && s->size != 0
e717da7e
AM
16340 && s->output_section != bfd_abs_section_ptr
16341 && !bfd_set_section_contents (output_bfd, s->output_section,
16342 s->contents, s->output_offset,
eea6121a 16343 s->size))
e717da7e
AM
16344 return FALSE;
16345 s = ppc64_elf_tdata (dynobj)->relgot;
16346 if (s != NULL
eea6121a 16347 && s->size != 0
e717da7e
AM
16348 && s->output_section != bfd_abs_section_ptr
16349 && !bfd_set_section_contents (output_bfd, s->output_section,
16350 s->contents, s->output_offset,
eea6121a 16351 s->size))
e717da7e
AM
16352 return FALSE;
16353 }
f6c52c13 16354
b34976b6 16355 return TRUE;
5bd4f169
AM
16356}
16357
5bd4f169 16358#include "elf64-target.h"
7b8e7dad
AM
16359
16360/* FreeBSD support */
16361
16362#undef TARGET_LITTLE_SYM
16363#undef TARGET_LITTLE_NAME
16364
16365#undef TARGET_BIG_SYM
6d00b590 16366#define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
7b8e7dad
AM
16367#undef TARGET_BIG_NAME
16368#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
16369
16370#undef ELF_OSABI
16371#define ELF_OSABI ELFOSABI_FREEBSD
16372
16373#undef elf64_bed
16374#define elf64_bed elf64_powerpc_fbsd_bed
16375
16376#include "elf64-target.h"