]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf64-ppc.c
PR 30569, always call elf_backend_size_dynamic_sections
[thirdparty/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
fd67aa11 2 Copyright (C) 1999-2024 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
c09c8b42
AM
28/* The assembler should generate a full set of section symbols even
29 when they appear unused. The linux kernel build tool recordmcount
30 needs them. */
31#define TARGET_KEEP_UNUSED_SECTION_SYMBOLS true
4bd7c902 32
3db64b00 33#include "sysdep.h"
183e98be 34#include <stdarg.h>
5bd4f169 35#include "bfd.h"
5bd4f169
AM
36#include "bfdlink.h"
37#include "libbfd.h"
38#include "elf-bfd.h"
04c9666a 39#include "elf/ppc64.h"
5d1634d7 40#include "elf64-ppc.h"
58d180e8 41#include "dwarf2.h"
5bd4f169 42
bb294208
AM
43/* All users of this file have bfd_octets_per_byte (abfd, sec) == 1. */
44#define OCTETS_PER_BYTE(ABFD, SEC) 1
45
805fc799 46static bfd_reloc_status_type ppc64_elf_ha_reloc
4ce794b7 47 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016
AM
48static bfd_reloc_status_type ppc64_elf_branch_reloc
49 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 50static bfd_reloc_status_type ppc64_elf_brtaken_reloc
4ce794b7 51 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 52static bfd_reloc_status_type ppc64_elf_sectoff_reloc
4ce794b7 53 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 54static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
4ce794b7 55 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 56static bfd_reloc_status_type ppc64_elf_toc_reloc
4ce794b7 57 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 58static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
4ce794b7 59 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 60static bfd_reloc_status_type ppc64_elf_toc64_reloc
4ce794b7 61 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
5663e321
AM
62static bfd_reloc_status_type ppc64_elf_prefix_reloc
63 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 64static bfd_reloc_status_type ppc64_elf_unhandled_reloc
4ce794b7 65 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016 66static bfd_vma opd_entry_value
0a1b45a2 67 (asection *, bfd_vma, asection **, bfd_vma *, bool);
5bd4f169 68
6d00b590 69#define TARGET_LITTLE_SYM powerpc_elf64_le_vec
ad8e1ba5 70#define TARGET_LITTLE_NAME "elf64-powerpcle"
6d00b590 71#define TARGET_BIG_SYM powerpc_elf64_vec
ad8e1ba5
AM
72#define TARGET_BIG_NAME "elf64-powerpc"
73#define ELF_ARCH bfd_arch_powerpc
ae95ffa6 74#define ELF_TARGET_ID PPC64_ELF_DATA
ad8e1ba5
AM
75#define ELF_MACHINE_CODE EM_PPC64
76#define ELF_MAXPAGESIZE 0x10000
702d1671 77#define ELF_COMMONPAGESIZE 0x1000
ad8e1ba5
AM
78#define elf_info_to_howto ppc64_elf_info_to_howto
79
80#define elf_backend_want_got_sym 0
81#define elf_backend_want_plt_sym 0
82#define elf_backend_plt_alignment 3
83#define elf_backend_plt_not_loaded 1
ad8e1ba5 84#define elf_backend_got_header_size 8
5474d94f 85#define elf_backend_want_dynrelro 1
ad8e1ba5
AM
86#define elf_backend_can_gc_sections 1
87#define elf_backend_can_refcount 1
88#define elf_backend_rela_normal 1
64f52338 89#define elf_backend_dtrel_excludes_plt 1
6bfdb61b 90#define elf_backend_default_execstack 0
ad8e1ba5 91
e717da7e 92#define bfd_elf64_mkobject ppc64_elf_mkobject
6313825c 93#define bfd_elf64_bfd_free_cached_info ppc64_elf_free_cached_info
ad8e1ba5 94#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
aa374f67 95#define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
ee67d69a
AM
96#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
97#define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
ad8e1ba5
AM
98#define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
99#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
90e3cdf2 100#define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
aa374f67 101#define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
8c5b4e52 102#define bfd_elf64_bfd_gc_sections ppc64_elf_gc_sections
ad8e1ba5
AM
103
104#define elf_backend_object_p ppc64_elf_object_p
d37c89e5
AM
105#define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
106#define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
183e98be 107#define elf_backend_write_core_note ppc64_elf_write_core_note
9d19e4fd 108#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
ad8e1ba5 109#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
555cd476 110#define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
f6c7c3e8 111#define elf_backend_check_directives ppc64_elf_before_check_relocs
e5034e59 112#define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
8387904d 113#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
ad8e1ba5 114#define elf_backend_check_relocs ppc64_elf_check_relocs
c0e331c7 115#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
74f0fb50 116#define elf_backend_gc_keep ppc64_elf_gc_keep
64d03ab5 117#define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
ad8e1ba5 118#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
ad8e1ba5
AM
119#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
120#define elf_backend_hide_symbol ppc64_elf_hide_symbol
9f296da3 121#define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
af969b14
AM
122#define elf_backend_early_size_sections ppc64_elf_edit
123#define elf_backend_late_size_sections ppc64_elf_late_size_sections
a345bc8d 124#define elf_backend_hash_symbol ppc64_elf_hash_symbol
74541ad4 125#define elf_backend_init_index_section _bfd_elf_init_2_index_sections
60124e18 126#define elf_backend_action_discarded ppc64_elf_action_discarded
ad8e1ba5
AM
127#define elf_backend_relocate_section ppc64_elf_relocate_section
128#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
129#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
130#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
754021d0 131#define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
29ef7005 132#define elf_backend_special_sections ppc64_elf_special_sections
bf577467 133#define elf_backend_section_flags ppc64_elf_section_flags
6911b7dc 134#define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
8c5b4e52 135#define elf_backend_merge_symbol ppc64_elf_merge_symbol
bce964aa 136#define elf_backend_get_reloc_section bfd_get_section_by_name
ad8e1ba5 137
5bd4f169
AM
138/* The name of the dynamic interpreter. This is put in the .interp
139 section. */
140#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
141
142/* The size in bytes of an entry in the procedure linkage table. */
b9e5796b 143#define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
2d7ad24e 144#define LOCAL_PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 16 : 8)
5bd4f169
AM
145
146/* The initial size of the plt reserved for the dynamic linker. */
b9e5796b 147#define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
5bd4f169 148
a078d95a
AM
149/* Offsets to some stack save slots. */
150#define STK_LR 16
151#define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
eb8d7fda 152/* This one is dodgy. ELFv2 does not have a linker word, so use the
a078d95a
AM
153 CR save slot. Used only by optimised __tls_get_addr call stub,
154 relying on __tls_get_addr_opt not saving CR.. */
155#define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
156
5bd4f169 157/* TOC base pointers offset from start of TOC. */
411e1bfb 158#define TOC_BASE_OFF 0x8000
a27e685f
AM
159/* TOC base alignment. */
160#define TOC_BASE_ALIGN 256
411e1bfb
AM
161
162/* Offset of tp and dtp pointers from start of TLS block. */
163#define TP_OFFSET 0x7000
164#define DTP_OFFSET 0x8000
5bd4f169 165
ad8e1ba5
AM
166/* .plt call stub instructions. The normal stub is like this, but
167 sometimes the .plt entry crosses a 64k boundary and we need to
71a39c98 168 insert an addi to adjust r11. */
a078d95a 169#define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
71a39c98
AM
170#define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
171#define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
172#define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
173#define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
174#define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
5d1634d7
AM
175#define BCTR 0x4e800420 /* bctr */
176
07d6d2b8 177#define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
05d0e962
AM
178#define ADDI_R12_R11 0x398b0000 /* addi %r12,%r11,off@l */
179#define ADDI_R12_R12 0x398c0000 /* addi %r12,%r12,off@l */
07d6d2b8
AM
180#define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
181#define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
182
183#define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
184#define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
185#define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
186#define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
187#define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
188#define BNECTR 0x4ca20420 /* bnectr+ */
189#define BNECTR_P4 0x4ce20420 /* bnectr+ */
794e51c0 190
71a39c98 191#define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
ac2df442 192#define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
07d6d2b8 193#define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
ac2df442 194
07d6d2b8
AM
195#define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
196#define LD_R2_0R12 0xe84c0000 /* ld %r2,0(%r12) */
197#define ADD_R2_R2_R12 0x7c426214 /* add %r2,%r2,%r12 */
ad8e1ba5 198
04bdff6a 199#define LI_R11_0 0x39600000 /* li %r11,0 */
07d6d2b8 200#define LIS_R2 0x3c400000 /* lis %r2,xxx@ha */
04bdff6a 201#define LIS_R11 0x3d600000 /* lis %r11,xxx@ha */
05d0e962 202#define LIS_R12 0x3d800000 /* lis %r12,xxx@ha */
006589cf
AM
203#define ADDIS_R2_R12 0x3c4c0000 /* addis %r2,%r12,xxx@ha */
204#define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
05d0e962 205#define ADDIS_R12_R11 0x3d8b0000 /* addis %r12,%r11,xxx@ha */
a345bc8d 206#define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
05d0e962 207#define ORIS_R12_R12_0 0x658c0000 /* oris %r12,%r12,xxx@hi */
04bdff6a 208#define ORI_R11_R11_0 0x616b0000 /* ori %r11,%r11,xxx@l */
05d0e962 209#define ORI_R12_R12_0 0x618c0000 /* ori %r12,%r12,xxx@l */
07d6d2b8 210#define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
04bdff6a 211#define SLDI_R11_R11_34 0x796b1746 /* sldi %r11,%r11,34 */
05d0e962
AM
212#define SLDI_R12_R12_32 0x799c07c6 /* sldi %r12,%r12,32 */
213#define LDX_R12_R11_R12 0x7d8b602a /* ldx %r12,%r11,%r12 */
214#define ADD_R12_R11_R12 0x7d8b6214 /* add %r12,%r11,%r12 */
04bdff6a
AM
215#define PADDI_R12_PC 0x0610000039800000ULL
216#define PLD_R12_PC 0x04100000e5800000ULL
5663e321 217#define PNOP 0x0700000000000000ULL
a345bc8d 218
3cd7c7d7
AM
219/* __glink_PLTresolve stub instructions. We enter with the index in
220 R0 for ELFv1, and the address of a glink branch in R12 for ELFv2. */
9e390558 221#define GLINK_PLTRESOLVE_SIZE(htab) \
3cd7c7d7 222 (8u + (htab->opd_abi ? 11 * 4 : htab->has_plt_localentry0 ? 14 * 4 : 13 * 4))
ee4bf8d2
AM
223 /* 0: */
224 /* .quad plt0-1f */
225 /* __glink: */
226#define MFLR_R12 0x7d8802a6 /* mflr %12 */
227#define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
228 /* 1: */
229#define MFLR_R11 0x7d6802a6 /* mflr %11 */
71a39c98 230 /* ld %2,(0b-1b)(%11) */
ee4bf8d2 231#define MTLR_R12 0x7d8803a6 /* mtlr %12 */
71a39c98
AM
232#define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
233 /* ld %12,0(%11) */
234 /* ld %2,8(%11) */
235 /* mtctr %12 */
236 /* ld %11,16(%11) */
ee4bf8d2 237 /* bctr */
3cd7c7d7
AM
238
239#define MFLR_R0 0x7c0802a6 /* mflr %r0 */
240#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
241#define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
242#define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
243#define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
244#define LD_R0_0R11 0xe80b0000 /* ld %r0,0(%r11) */
245#define ADD_R11_R0_R11 0x7d605a14 /* add %r11,%r0,%r11 */
5d1634d7
AM
246
247/* Pad with this. */
248#define NOP 0x60000000
249
721956f4
AM
250/* Some other nops. */
251#define CROR_151515 0x4def7b82
252#define CROR_313131 0x4ffffb82
253
cedb70c5 254/* .glink entries for the first 32k functions are two instructions. */
5d1634d7
AM
255#define LI_R0_0 0x38000000 /* li %r0,0 */
256#define B_DOT 0x48000000 /* b . */
257
258/* After that, we need two instructions to load the index, followed by
259 a branch. */
260#define LIS_R0_0 0x3c000000 /* lis %r0,0 */
10ed1bba 261#define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
41bd81ab 262
deb0e272
AM
263/* Instructions used by the save and restore reg functions. */
264#define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
265#define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
266#define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
267#define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
82bd7b59
AM
268#define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
269#define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
deb0e272
AM
270#define LI_R12_0 0x39800000 /* li %r12,0 */
271#define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
272#define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
273#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
82bd7b59
AM
274#define BLR 0x4e800020 /* blr */
275
41bd81ab
AM
276/* Since .opd is an array of descriptors and each entry will end up
277 with identical R_PPC64_RELATIVE relocs, there is really no need to
278 propagate .opd relocs; The dynamic linker should be taught to
1e2f5b6e 279 relocate .opd without reloc entries. */
41bd81ab
AM
280#ifndef NO_OPD_RELOCS
281#define NO_OPD_RELOCS 0
282#endif
810d4e75 283
a4b6fadd
AM
284#ifndef ARRAY_SIZE
285#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
286#endif
287
810d4e75
AM
288static inline int
289abiversion (bfd *abfd)
290{
291 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
292}
293
294static inline void
295set_abiversion (bfd *abfd, int ver)
296{
297 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
298 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
299}
6313825c
AM
300
301#define is_ppc64_elf(bfd) \
302 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
303 && elf_object_id (bfd) == PPC64_ELF_DATA)
5bd4f169
AM
304\f
305/* Relocation HOWTO's. */
46807bf4
AM
306/* Like other ELF RELA targets that don't apply multiple
307 field-altering relocations to the same localation, src_mask is
308 always zero and pcrel_offset is the same as pc_relative.
309 PowerPC can always use a zero bitpos, even when the field is not at
310 the LSB. For example, a REL24 could use rightshift=2, bisize=24
311 and bitpos=2 which matches the ABI description, or as we do here,
312 rightshift=0, bitsize=26 and bitpos=0. */
313#define HOW(type, size, bitsize, mask, rightshift, pc_relative, \
314 complain, special_func) \
315 HOWTO (type, rightshift, size, bitsize, pc_relative, 0, \
316 complain_overflow_ ## complain, special_func, \
0a1b45a2 317 #type, false, 0, mask, pc_relative)
46807bf4 318
04c9666a 319static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
5bd4f169 320
f3185997
NC
321static reloc_howto_type ppc64_elf_howto_raw[] =
322{
5bd4f169 323 /* This reloc does nothing. */
c94cb026 324 HOW (R_PPC64_NONE, 0, 0, 0, 0, false, dont,
46807bf4 325 bfd_elf_generic_reloc),
5bd4f169
AM
326
327 /* A standard 32 bit relocation. */
c94cb026 328 HOW (R_PPC64_ADDR32, 4, 32, 0xffffffff, 0, false, bitfield,
46807bf4 329 bfd_elf_generic_reloc),
5bd4f169
AM
330
331 /* An absolute 26 bit branch; the lower two bits must be zero.
332 FIXME: we don't check that, we just clear them. */
c94cb026 333 HOW (R_PPC64_ADDR24, 4, 26, 0x03fffffc, 0, false, bitfield,
46807bf4 334 bfd_elf_generic_reloc),
5bd4f169
AM
335
336 /* A standard 16 bit relocation. */
c94cb026 337 HOW (R_PPC64_ADDR16, 2, 16, 0xffff, 0, false, bitfield,
46807bf4 338 bfd_elf_generic_reloc),
5bd4f169
AM
339
340 /* A 16 bit relocation without overflow. */
c94cb026 341 HOW (R_PPC64_ADDR16_LO, 2, 16, 0xffff, 0, false, dont,
46807bf4 342 bfd_elf_generic_reloc),
5bd4f169
AM
343
344 /* Bits 16-31 of an address. */
c94cb026 345 HOW (R_PPC64_ADDR16_HI, 2, 16, 0xffff, 16, false, signed,
46807bf4 346 bfd_elf_generic_reloc),
5bd4f169
AM
347
348 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
349 bits, treated as a signed number, is negative. */
c94cb026 350 HOW (R_PPC64_ADDR16_HA, 2, 16, 0xffff, 16, false, signed,
46807bf4 351 ppc64_elf_ha_reloc),
5bd4f169
AM
352
353 /* An absolute 16 bit branch; the lower two bits must be zero.
354 FIXME: we don't check that, we just clear them. */
c94cb026 355 HOW (R_PPC64_ADDR14, 4, 16, 0x0000fffc, 0, false, signed,
46807bf4 356 ppc64_elf_branch_reloc),
5bd4f169
AM
357
358 /* An absolute 16 bit branch, for which bit 10 should be set to
359 indicate that the branch is expected to be taken. The lower two
360 bits must be zero. */
c94cb026 361 HOW (R_PPC64_ADDR14_BRTAKEN, 4, 16, 0x0000fffc, 0, false, signed,
46807bf4 362 ppc64_elf_brtaken_reloc),
5bd4f169
AM
363
364 /* An absolute 16 bit branch, for which bit 10 should be set to
365 indicate that the branch is not expected to be taken. The lower
366 two bits must be zero. */
c94cb026 367 HOW (R_PPC64_ADDR14_BRNTAKEN, 4, 16, 0x0000fffc, 0, false, signed,
46807bf4 368 ppc64_elf_brtaken_reloc),
5bd4f169
AM
369
370 /* A relative 26 bit branch; the lower two bits must be zero. */
c94cb026 371 HOW (R_PPC64_REL24, 4, 26, 0x03fffffc, 0, true, signed,
46807bf4 372 ppc64_elf_branch_reloc),
5bd4f169 373
05d0e962 374 /* A variant of R_PPC64_REL24, used when r2 is not the toc pointer. */
c94cb026 375 HOW (R_PPC64_REL24_NOTOC, 4, 26, 0x03fffffc, 0, true, signed,
46807bf4 376 ppc64_elf_branch_reloc),
05d0e962 377
7aba54da 378 /* Another variant, when p10 insns can't be used on stubs. */
c94cb026 379 HOW (R_PPC64_REL24_P9NOTOC, 4, 26, 0x03fffffc, 0, true, signed,
7aba54da
AM
380 ppc64_elf_branch_reloc),
381
5bd4f169 382 /* A relative 16 bit branch; the lower two bits must be zero. */
c94cb026 383 HOW (R_PPC64_REL14, 4, 16, 0x0000fffc, 0, true, signed,
46807bf4 384 ppc64_elf_branch_reloc),
5bd4f169
AM
385
386 /* A relative 16 bit branch. Bit 10 should be set to indicate that
387 the branch is expected to be taken. The lower two bits must be
388 zero. */
c94cb026 389 HOW (R_PPC64_REL14_BRTAKEN, 4, 16, 0x0000fffc, 0, true, signed,
46807bf4 390 ppc64_elf_brtaken_reloc),
5bd4f169
AM
391
392 /* A relative 16 bit branch. Bit 10 should be set to indicate that
393 the branch is not expected to be taken. The lower two bits must
394 be zero. */
c94cb026 395 HOW (R_PPC64_REL14_BRNTAKEN, 4, 16, 0x0000fffc, 0, true, signed,
46807bf4 396 ppc64_elf_brtaken_reloc),
5bd4f169
AM
397
398 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
399 symbol. */
c94cb026 400 HOW (R_PPC64_GOT16, 2, 16, 0xffff, 0, false, signed,
46807bf4 401 ppc64_elf_unhandled_reloc),
5bd4f169
AM
402
403 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
404 the symbol. */
c94cb026 405 HOW (R_PPC64_GOT16_LO, 2, 16, 0xffff, 0, false, dont,
46807bf4 406 ppc64_elf_unhandled_reloc),
5bd4f169
AM
407
408 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
409 the symbol. */
c94cb026 410 HOW (R_PPC64_GOT16_HI, 2, 16, 0xffff, 16, false, signed,
46807bf4 411 ppc64_elf_unhandled_reloc),
5bd4f169
AM
412
413 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
414 the symbol. */
c94cb026 415 HOW (R_PPC64_GOT16_HA, 2, 16, 0xffff, 16, false, signed,
46807bf4 416 ppc64_elf_unhandled_reloc),
5bd4f169
AM
417
418 /* This is used only by the dynamic linker. The symbol should exist
419 both in the object being run and in some shared library. The
420 dynamic linker copies the data addressed by the symbol from the
421 shared library into the object, because the object being
422 run has to have the data at some particular address. */
5d0feb98 423 HOW (R_PPC64_COPY, 0, 0, 0, 0, false, dont,
46807bf4 424 ppc64_elf_unhandled_reloc),
5bd4f169
AM
425
426 /* Like R_PPC64_ADDR64, but used when setting global offset table
427 entries. */
c94cb026 428 HOW (R_PPC64_GLOB_DAT, 8, 64, 0xffffffffffffffffULL, 0, false, dont,
46807bf4 429 ppc64_elf_unhandled_reloc),
5bd4f169
AM
430
431 /* Created by the link editor. Marks a procedure linkage table
432 entry for a symbol. */
5d0feb98 433 HOW (R_PPC64_JMP_SLOT, 0, 0, 0, 0, false, dont,
46807bf4 434 ppc64_elf_unhandled_reloc),
5bd4f169
AM
435
436 /* Used only by the dynamic linker. When the object is run, this
437 doubleword64 is set to the load address of the object, plus the
438 addend. */
c94cb026 439 HOW (R_PPC64_RELATIVE, 8, 64, 0xffffffffffffffffULL, 0, false, dont,
46807bf4 440 bfd_elf_generic_reloc),
5bd4f169
AM
441
442 /* Like R_PPC64_ADDR32, but may be unaligned. */
c94cb026 443 HOW (R_PPC64_UADDR32, 4, 32, 0xffffffff, 0, false, bitfield,
46807bf4 444 bfd_elf_generic_reloc),
5bd4f169
AM
445
446 /* Like R_PPC64_ADDR16, but may be unaligned. */
c94cb026 447 HOW (R_PPC64_UADDR16, 2, 16, 0xffff, 0, false, bitfield,
46807bf4 448 bfd_elf_generic_reloc),
5bd4f169
AM
449
450 /* 32-bit PC relative. */
c94cb026 451 HOW (R_PPC64_REL32, 4, 32, 0xffffffff, 0, true, signed,
46807bf4 452 bfd_elf_generic_reloc),
5bd4f169 453
10ed1bba 454 /* 32-bit relocation to the symbol's procedure linkage table. */
c94cb026 455 HOW (R_PPC64_PLT32, 4, 32, 0xffffffff, 0, false, bitfield,
46807bf4 456 ppc64_elf_unhandled_reloc),
5bd4f169
AM
457
458 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
459 FIXME: R_PPC64_PLTREL32 not supported. */
c94cb026 460 HOW (R_PPC64_PLTREL32, 4, 32, 0xffffffff, 0, true, signed,
46807bf4 461 ppc64_elf_unhandled_reloc),
5bd4f169
AM
462
463 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
464 the symbol. */
c94cb026 465 HOW (R_PPC64_PLT16_LO, 2, 16, 0xffff, 0, false, dont,
46807bf4 466 ppc64_elf_unhandled_reloc),
5bd4f169
AM
467
468 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
469 the symbol. */
c94cb026 470 HOW (R_PPC64_PLT16_HI, 2, 16, 0xffff, 16, false, signed,
46807bf4 471 ppc64_elf_unhandled_reloc),
5bd4f169
AM
472
473 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
474 the symbol. */
c94cb026 475 HOW (R_PPC64_PLT16_HA, 2, 16, 0xffff, 16, false, signed,
46807bf4 476 ppc64_elf_unhandled_reloc),
5bd4f169 477
c061c2d8 478 /* 16-bit section relative relocation. */
c94cb026 479 HOW (R_PPC64_SECTOFF, 2, 16, 0xffff, 0, false, signed,
46807bf4 480 ppc64_elf_sectoff_reloc),
5bd4f169 481
c061c2d8 482 /* Like R_PPC64_SECTOFF, but no overflow warning. */
c94cb026 483 HOW (R_PPC64_SECTOFF_LO, 2, 16, 0xffff, 0, false, dont,
46807bf4 484 ppc64_elf_sectoff_reloc),
5bd4f169
AM
485
486 /* 16-bit upper half section relative relocation. */
c94cb026 487 HOW (R_PPC64_SECTOFF_HI, 2, 16, 0xffff, 16, false, signed,
46807bf4 488 ppc64_elf_sectoff_reloc),
5bd4f169
AM
489
490 /* 16-bit upper half adjusted section relative relocation. */
c94cb026 491 HOW (R_PPC64_SECTOFF_HA, 2, 16, 0xffff, 16, false, signed,
46807bf4 492 ppc64_elf_sectoff_ha_reloc),
5bd4f169 493
04c9666a 494 /* Like R_PPC64_REL24 without touching the two least significant bits. */
c94cb026 495 HOW (R_PPC64_REL30, 4, 30, 0xfffffffc, 2, true, dont,
46807bf4 496 bfd_elf_generic_reloc),
5bd4f169
AM
497
498 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
499
500 /* A standard 64-bit relocation. */
c94cb026 501 HOW (R_PPC64_ADDR64, 8, 64, 0xffffffffffffffffULL, 0, false, dont,
46807bf4 502 bfd_elf_generic_reloc),
5bd4f169
AM
503
504 /* The bits 32-47 of an address. */
c94cb026 505 HOW (R_PPC64_ADDR16_HIGHER, 2, 16, 0xffff, 32, false, dont,
46807bf4 506 bfd_elf_generic_reloc),
5bd4f169
AM
507
508 /* The bits 32-47 of an address, plus 1 if the contents of the low
509 16 bits, treated as a signed number, is negative. */
c94cb026 510 HOW (R_PPC64_ADDR16_HIGHERA, 2, 16, 0xffff, 32, false, dont,
46807bf4 511 ppc64_elf_ha_reloc),
5bd4f169
AM
512
513 /* The bits 48-63 of an address. */
c94cb026 514 HOW (R_PPC64_ADDR16_HIGHEST, 2, 16, 0xffff, 48, false, dont,
46807bf4 515 bfd_elf_generic_reloc),
5bd4f169
AM
516
517 /* The bits 48-63 of an address, plus 1 if the contents of the low
518 16 bits, treated as a signed number, is negative. */
c94cb026 519 HOW (R_PPC64_ADDR16_HIGHESTA, 2, 16, 0xffff, 48, false, dont,
46807bf4 520 ppc64_elf_ha_reloc),
5bd4f169
AM
521
522 /* Like ADDR64, but may be unaligned. */
c94cb026 523 HOW (R_PPC64_UADDR64, 8, 64, 0xffffffffffffffffULL, 0, false, dont,
46807bf4 524 bfd_elf_generic_reloc),
5bd4f169
AM
525
526 /* 64-bit relative relocation. */
c94cb026 527 HOW (R_PPC64_REL64, 8, 64, 0xffffffffffffffffULL, 0, true, dont,
46807bf4 528 bfd_elf_generic_reloc),
5bd4f169 529
cedb70c5 530 /* 64-bit relocation to the symbol's procedure linkage table. */
c94cb026 531 HOW (R_PPC64_PLT64, 8, 64, 0xffffffffffffffffULL, 0, false, dont,
46807bf4 532 ppc64_elf_unhandled_reloc),
5bd4f169
AM
533
534 /* 64-bit PC relative relocation to the symbol's procedure linkage
535 table. */
536 /* FIXME: R_PPC64_PLTREL64 not supported. */
c94cb026 537 HOW (R_PPC64_PLTREL64, 8, 64, 0xffffffffffffffffULL, 0, true, dont,
46807bf4 538 ppc64_elf_unhandled_reloc),
5bd4f169
AM
539
540 /* 16 bit TOC-relative relocation. */
5bd4f169 541 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
c94cb026 542 HOW (R_PPC64_TOC16, 2, 16, 0xffff, 0, false, signed,
46807bf4 543 ppc64_elf_toc_reloc),
5bd4f169
AM
544
545 /* 16 bit TOC-relative relocation without overflow. */
5bd4f169 546 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
c94cb026 547 HOW (R_PPC64_TOC16_LO, 2, 16, 0xffff, 0, false, dont,
46807bf4 548 ppc64_elf_toc_reloc),
5bd4f169
AM
549
550 /* 16 bit TOC-relative relocation, high 16 bits. */
5bd4f169 551 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
c94cb026 552 HOW (R_PPC64_TOC16_HI, 2, 16, 0xffff, 16, false, signed,
46807bf4 553 ppc64_elf_toc_reloc),
5bd4f169
AM
554
555 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
556 contents of the low 16 bits, treated as a signed number, is
557 negative. */
5bd4f169 558 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
c94cb026 559 HOW (R_PPC64_TOC16_HA, 2, 16, 0xffff, 16, false, signed,
46807bf4 560 ppc64_elf_toc_ha_reloc),
5bd4f169
AM
561
562 /* 64-bit relocation; insert value of TOC base (.TOC.). */
5bd4f169 563 /* R_PPC64_TOC 51 doubleword64 .TOC. */
c94cb026 564 HOW (R_PPC64_TOC, 8, 64, 0xffffffffffffffffULL, 0, false, dont,
46807bf4 565 ppc64_elf_toc64_reloc),
5bd4f169
AM
566
567 /* Like R_PPC64_GOT16, but also informs the link editor that the
568 value to relocate may (!) refer to a PLT entry which the link
569 editor (a) may replace with the symbol value. If the link editor
570 is unable to fully resolve the symbol, it may (b) create a PLT
571 entry and store the address to the new PLT entry in the GOT.
572 This permits lazy resolution of function symbols at run time.
573 The link editor may also skip all of this and just (c) emit a
574 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
575 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
c94cb026 576 HOW (R_PPC64_PLTGOT16, 2, 16, 0xffff, 0, false,signed,
46807bf4 577 ppc64_elf_unhandled_reloc),
411e1bfb
AM
578
579 /* Like R_PPC64_PLTGOT16, but without overflow. */
580 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
c94cb026 581 HOW (R_PPC64_PLTGOT16_LO, 2, 16, 0xffff, 0, false, dont,
46807bf4 582 ppc64_elf_unhandled_reloc),
411e1bfb
AM
583
584 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
585 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
c94cb026 586 HOW (R_PPC64_PLTGOT16_HI, 2, 16, 0xffff, 16, false, signed,
46807bf4 587 ppc64_elf_unhandled_reloc),
411e1bfb
AM
588
589 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
590 1 if the contents of the low 16 bits, treated as a signed number,
591 is negative. */
592 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
c94cb026 593 HOW (R_PPC64_PLTGOT16_HA, 2, 16, 0xffff, 16, false, signed,
46807bf4 594 ppc64_elf_unhandled_reloc),
411e1bfb
AM
595
596 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
c94cb026 597 HOW (R_PPC64_ADDR16_DS, 2, 16, 0xfffc, 0, false, signed,
46807bf4 598 bfd_elf_generic_reloc),
411e1bfb
AM
599
600 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
c94cb026 601 HOW (R_PPC64_ADDR16_LO_DS, 2, 16, 0xfffc, 0, false, dont,
46807bf4 602 bfd_elf_generic_reloc),
411e1bfb
AM
603
604 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
c94cb026 605 HOW (R_PPC64_GOT16_DS, 2, 16, 0xfffc, 0, false, signed,
46807bf4 606 ppc64_elf_unhandled_reloc),
411e1bfb
AM
607
608 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
c94cb026 609 HOW (R_PPC64_GOT16_LO_DS, 2, 16, 0xfffc, 0, false, dont,
46807bf4 610 ppc64_elf_unhandled_reloc),
411e1bfb
AM
611
612 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
c94cb026 613 HOW (R_PPC64_PLT16_LO_DS, 2, 16, 0xfffc, 0, false, dont,
46807bf4 614 ppc64_elf_unhandled_reloc),
411e1bfb
AM
615
616 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
c94cb026 617 HOW (R_PPC64_SECTOFF_DS, 2, 16, 0xfffc, 0, false, signed,
46807bf4 618 ppc64_elf_sectoff_reloc),
411e1bfb
AM
619
620 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
c94cb026 621 HOW (R_PPC64_SECTOFF_LO_DS, 2, 16, 0xfffc, 0, false, dont,
46807bf4 622 ppc64_elf_sectoff_reloc),
411e1bfb
AM
623
624 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
c94cb026 625 HOW (R_PPC64_TOC16_DS, 2, 16, 0xfffc, 0, false, signed,
46807bf4 626 ppc64_elf_toc_reloc),
411e1bfb
AM
627
628 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
c94cb026 629 HOW (R_PPC64_TOC16_LO_DS, 2, 16, 0xfffc, 0, false, dont,
46807bf4 630 ppc64_elf_toc_reloc),
411e1bfb
AM
631
632 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
633 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
c94cb026 634 HOW (R_PPC64_PLTGOT16_DS, 2, 16, 0xfffc, 0, false, signed,
46807bf4 635 ppc64_elf_unhandled_reloc),
411e1bfb
AM
636
637 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
638 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
c94cb026 639 HOW (R_PPC64_PLTGOT16_LO_DS, 2, 16, 0xfffc, 0, false, dont,
46807bf4 640 ppc64_elf_unhandled_reloc),
411e1bfb 641
727fc41e 642 /* Marker relocs for TLS. */
c94cb026 643 HOW (R_PPC64_TLS, 4, 32, 0, 0, false, dont,
46807bf4
AM
644 bfd_elf_generic_reloc),
645
c94cb026 646 HOW (R_PPC64_TLSGD, 4, 32, 0, 0, false, dont,
46807bf4
AM
647 bfd_elf_generic_reloc),
648
c94cb026 649 HOW (R_PPC64_TLSLD, 4, 32, 0, 0, false, dont,
46807bf4 650 bfd_elf_generic_reloc),
727fc41e 651
23cedd1d
AM
652 /* Marker reloc for optimizing r2 save in prologue rather than on
653 each plt call stub. */
c94cb026 654 HOW (R_PPC64_TOCSAVE, 4, 32, 0, 0, false, dont,
46807bf4 655 bfd_elf_generic_reloc),
3b421ab3 656
23cedd1d 657 /* Marker relocs on inline plt call instructions. */
c94cb026 658 HOW (R_PPC64_PLTSEQ, 4, 32, 0, 0, false, dont,
46807bf4
AM
659 bfd_elf_generic_reloc),
660
c94cb026 661 HOW (R_PPC64_PLTCALL, 4, 32, 0, 0, false, dont,
46807bf4 662 bfd_elf_generic_reloc),
23cedd1d 663
411e1bfb
AM
664 /* Computes the load module index of the load module that contains the
665 definition of its TLS sym. */
c94cb026 666 HOW (R_PPC64_DTPMOD64, 8, 64, 0xffffffffffffffffULL, 0, false, dont,
46807bf4 667 ppc64_elf_unhandled_reloc),
411e1bfb
AM
668
669 /* Computes a dtv-relative displacement, the difference between the value
670 of sym+add and the base address of the thread-local storage block that
671 contains the definition of sym, minus 0x8000. */
c94cb026 672 HOW (R_PPC64_DTPREL64, 8, 64, 0xffffffffffffffffULL, 0, false, dont,
46807bf4 673 ppc64_elf_unhandled_reloc),
411e1bfb
AM
674
675 /* A 16 bit dtprel reloc. */
c94cb026 676 HOW (R_PPC64_DTPREL16, 2, 16, 0xffff, 0, false, signed,
46807bf4 677 ppc64_elf_unhandled_reloc),
411e1bfb
AM
678
679 /* Like DTPREL16, but no overflow. */
c94cb026 680 HOW (R_PPC64_DTPREL16_LO, 2, 16, 0xffff, 0, false, dont,
46807bf4 681 ppc64_elf_unhandled_reloc),
411e1bfb
AM
682
683 /* Like DTPREL16_LO, but next higher group of 16 bits. */
c94cb026 684 HOW (R_PPC64_DTPREL16_HI, 2, 16, 0xffff, 16, false, signed,
46807bf4 685 ppc64_elf_unhandled_reloc),
411e1bfb
AM
686
687 /* Like DTPREL16_HI, but adjust for low 16 bits. */
c94cb026 688 HOW (R_PPC64_DTPREL16_HA, 2, 16, 0xffff, 16, false, signed,
46807bf4 689 ppc64_elf_unhandled_reloc),
411e1bfb
AM
690
691 /* Like DTPREL16_HI, but next higher group of 16 bits. */
c94cb026 692 HOW (R_PPC64_DTPREL16_HIGHER, 2, 16, 0xffff, 32, false, dont,
46807bf4 693 ppc64_elf_unhandled_reloc),
411e1bfb
AM
694
695 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
c94cb026 696 HOW (R_PPC64_DTPREL16_HIGHERA, 2, 16, 0xffff, 32, false, dont,
46807bf4 697 ppc64_elf_unhandled_reloc),
411e1bfb
AM
698
699 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
c94cb026 700 HOW (R_PPC64_DTPREL16_HIGHEST, 2, 16, 0xffff, 48, false, dont,
46807bf4 701 ppc64_elf_unhandled_reloc),
411e1bfb
AM
702
703 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
c94cb026 704 HOW (R_PPC64_DTPREL16_HIGHESTA, 2, 16, 0xffff, 48, false, dont,
46807bf4 705 ppc64_elf_unhandled_reloc),
411e1bfb
AM
706
707 /* Like DTPREL16, but for insns with a DS field. */
c94cb026 708 HOW (R_PPC64_DTPREL16_DS, 2, 16, 0xfffc, 0, false, signed,
46807bf4 709 ppc64_elf_unhandled_reloc),
411e1bfb
AM
710
711 /* Like DTPREL16_DS, but no overflow. */
c94cb026 712 HOW (R_PPC64_DTPREL16_LO_DS, 2, 16, 0xfffc, 0, false, dont,
46807bf4 713 ppc64_elf_unhandled_reloc),
411e1bfb
AM
714
715 /* Computes a tp-relative displacement, the difference between the value of
716 sym+add and the value of the thread pointer (r13). */
c94cb026 717 HOW (R_PPC64_TPREL64, 8, 64, 0xffffffffffffffffULL, 0, false, dont,
46807bf4 718 ppc64_elf_unhandled_reloc),
411e1bfb
AM
719
720 /* A 16 bit tprel reloc. */
c94cb026 721 HOW (R_PPC64_TPREL16, 2, 16, 0xffff, 0, false, signed,
46807bf4 722 ppc64_elf_unhandled_reloc),
411e1bfb
AM
723
724 /* Like TPREL16, but no overflow. */
c94cb026 725 HOW (R_PPC64_TPREL16_LO, 2, 16, 0xffff, 0, false, dont,
46807bf4 726 ppc64_elf_unhandled_reloc),
411e1bfb
AM
727
728 /* Like TPREL16_LO, but next higher group of 16 bits. */
c94cb026 729 HOW (R_PPC64_TPREL16_HI, 2, 16, 0xffff, 16, false, signed,
46807bf4 730 ppc64_elf_unhandled_reloc),
411e1bfb
AM
731
732 /* Like TPREL16_HI, but adjust for low 16 bits. */
c94cb026 733 HOW (R_PPC64_TPREL16_HA, 2, 16, 0xffff, 16, false, signed,
46807bf4 734 ppc64_elf_unhandled_reloc),
411e1bfb
AM
735
736 /* Like TPREL16_HI, but next higher group of 16 bits. */
c94cb026 737 HOW (R_PPC64_TPREL16_HIGHER, 2, 16, 0xffff, 32, false, dont,
46807bf4 738 ppc64_elf_unhandled_reloc),
411e1bfb
AM
739
740 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
c94cb026 741 HOW (R_PPC64_TPREL16_HIGHERA, 2, 16, 0xffff, 32, false, dont,
46807bf4 742 ppc64_elf_unhandled_reloc),
411e1bfb
AM
743
744 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
c94cb026 745 HOW (R_PPC64_TPREL16_HIGHEST, 2, 16, 0xffff, 48, false, dont,
46807bf4 746 ppc64_elf_unhandled_reloc),
411e1bfb
AM
747
748 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
c94cb026 749 HOW (R_PPC64_TPREL16_HIGHESTA, 2, 16, 0xffff, 48, false, dont,
46807bf4 750 ppc64_elf_unhandled_reloc),
411e1bfb
AM
751
752 /* Like TPREL16, but for insns with a DS field. */
c94cb026 753 HOW (R_PPC64_TPREL16_DS, 2, 16, 0xfffc, 0, false, signed,
46807bf4 754 ppc64_elf_unhandled_reloc),
411e1bfb
AM
755
756 /* Like TPREL16_DS, but no overflow. */
c94cb026 757 HOW (R_PPC64_TPREL16_LO_DS, 2, 16, 0xfffc, 0, false, dont,
46807bf4 758 ppc64_elf_unhandled_reloc),
411e1bfb
AM
759
760 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
761 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
762 to the first entry relative to the TOC base (r2). */
c94cb026 763 HOW (R_PPC64_GOT_TLSGD16, 2, 16, 0xffff, 0, false, signed,
46807bf4 764 ppc64_elf_unhandled_reloc),
5bd4f169 765
411e1bfb 766 /* Like GOT_TLSGD16, but no overflow. */
c94cb026 767 HOW (R_PPC64_GOT_TLSGD16_LO, 2, 16, 0xffff, 0, false, dont,
46807bf4 768 ppc64_elf_unhandled_reloc),
5bd4f169 769
411e1bfb 770 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
c94cb026 771 HOW (R_PPC64_GOT_TLSGD16_HI, 2, 16, 0xffff, 16, false, signed,
46807bf4 772 ppc64_elf_unhandled_reloc),
5bd4f169 773
411e1bfb 774 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
c94cb026 775 HOW (R_PPC64_GOT_TLSGD16_HA, 2, 16, 0xffff, 16, false, signed,
46807bf4 776 ppc64_elf_unhandled_reloc),
5bd4f169 777
411e1bfb
AM
778 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
779 with values (sym+add)@dtpmod and zero, and computes the offset to the
780 first entry relative to the TOC base (r2). */
c94cb026 781 HOW (R_PPC64_GOT_TLSLD16, 2, 16, 0xffff, 0, false, signed,
46807bf4 782 ppc64_elf_unhandled_reloc),
5bd4f169 783
411e1bfb 784 /* Like GOT_TLSLD16, but no overflow. */
c94cb026 785 HOW (R_PPC64_GOT_TLSLD16_LO, 2, 16, 0xffff, 0, false, dont,
46807bf4 786 ppc64_elf_unhandled_reloc),
5bd4f169 787
411e1bfb 788 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
c94cb026 789 HOW (R_PPC64_GOT_TLSLD16_HI, 2, 16, 0xffff, 16, false, signed,
46807bf4 790 ppc64_elf_unhandled_reloc),
5bd4f169 791
411e1bfb 792 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
c94cb026 793 HOW (R_PPC64_GOT_TLSLD16_HA, 2, 16, 0xffff, 16, false, signed,
46807bf4 794 ppc64_elf_unhandled_reloc),
5bd4f169 795
411e1bfb
AM
796 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
797 the offset to the entry relative to the TOC base (r2). */
c94cb026 798 HOW (R_PPC64_GOT_DTPREL16_DS, 2, 16, 0xfffc, 0, false, signed,
46807bf4 799 ppc64_elf_unhandled_reloc),
5bd4f169 800
411e1bfb 801 /* Like GOT_DTPREL16_DS, but no overflow. */
c94cb026 802 HOW (R_PPC64_GOT_DTPREL16_LO_DS, 2, 16, 0xfffc, 0, false, dont,
46807bf4 803 ppc64_elf_unhandled_reloc),
5bd4f169 804
411e1bfb 805 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
c94cb026 806 HOW (R_PPC64_GOT_DTPREL16_HI, 2, 16, 0xffff, 16, false, signed,
46807bf4 807 ppc64_elf_unhandled_reloc),
5bd4f169 808
411e1bfb 809 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
c94cb026 810 HOW (R_PPC64_GOT_DTPREL16_HA, 2, 16, 0xffff, 16, false, signed,
46807bf4 811 ppc64_elf_unhandled_reloc),
411e1bfb
AM
812
813 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
814 offset to the entry relative to the TOC base (r2). */
c94cb026 815 HOW (R_PPC64_GOT_TPREL16_DS, 2, 16, 0xfffc, 0, false, signed,
46807bf4 816 ppc64_elf_unhandled_reloc),
5bd4f169 817
411e1bfb 818 /* Like GOT_TPREL16_DS, but no overflow. */
c94cb026 819 HOW (R_PPC64_GOT_TPREL16_LO_DS, 2, 16, 0xfffc, 0, false, dont,
46807bf4 820 ppc64_elf_unhandled_reloc),
5bd4f169 821
411e1bfb 822 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
c94cb026 823 HOW (R_PPC64_GOT_TPREL16_HI, 2, 16, 0xffff, 16, false, signed,
46807bf4 824 ppc64_elf_unhandled_reloc),
5bd4f169 825
411e1bfb 826 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
c94cb026 827 HOW (R_PPC64_GOT_TPREL16_HA, 2, 16, 0xffff, 16, false, signed,
46807bf4
AM
828 ppc64_elf_unhandled_reloc),
829
5d0feb98 830 HOW (R_PPC64_JMP_IREL, 0, 0, 0, 0, false, dont,
46807bf4
AM
831 ppc64_elf_unhandled_reloc),
832
c94cb026 833 HOW (R_PPC64_IRELATIVE, 8, 64, 0xffffffffffffffffULL, 0, false, dont,
46807bf4 834 bfd_elf_generic_reloc),
e054468f 835
25f23106 836 /* A 16 bit relative relocation. */
c94cb026 837 HOW (R_PPC64_REL16, 2, 16, 0xffff, 0, true, signed,
46807bf4 838 bfd_elf_generic_reloc),
25f23106
AM
839
840 /* A 16 bit relative relocation without overflow. */
c94cb026 841 HOW (R_PPC64_REL16_LO, 2, 16, 0xffff, 0, true, dont,
46807bf4 842 bfd_elf_generic_reloc),
25f23106
AM
843
844 /* The high order 16 bits of a relative address. */
c94cb026 845 HOW (R_PPC64_REL16_HI, 2, 16, 0xffff, 16, true, signed,
46807bf4 846 bfd_elf_generic_reloc),
25f23106
AM
847
848 /* The high order 16 bits of a relative address, plus 1 if the contents of
849 the low 16 bits, treated as a signed number, is negative. */
c94cb026 850 HOW (R_PPC64_REL16_HA, 2, 16, 0xffff, 16, true, signed,
46807bf4 851 ppc64_elf_ha_reloc),
25f23106 852
c94cb026 853 HOW (R_PPC64_REL16_HIGH, 2, 16, 0xffff, 16, true, dont,
4a969973
AM
854 bfd_elf_generic_reloc),
855
c94cb026 856 HOW (R_PPC64_REL16_HIGHA, 2, 16, 0xffff, 16, true, dont,
4a969973
AM
857 ppc64_elf_ha_reloc),
858
c94cb026 859 HOW (R_PPC64_REL16_HIGHER, 2, 16, 0xffff, 32, true, dont,
4a969973
AM
860 bfd_elf_generic_reloc),
861
c94cb026 862 HOW (R_PPC64_REL16_HIGHERA, 2, 16, 0xffff, 32, true, dont,
4a969973
AM
863 ppc64_elf_ha_reloc),
864
c94cb026 865 HOW (R_PPC64_REL16_HIGHEST, 2, 16, 0xffff, 48, true, dont,
4a969973
AM
866 bfd_elf_generic_reloc),
867
c94cb026 868 HOW (R_PPC64_REL16_HIGHESTA, 2, 16, 0xffff, 48, true, dont,
4a969973
AM
869 ppc64_elf_ha_reloc),
870
a680de9a 871 /* Like R_PPC64_REL16_HA but for split field in addpcis. */
c94cb026 872 HOW (R_PPC64_REL16DX_HA, 4, 16, 0x1fffc1, 16, true, signed,
46807bf4 873 ppc64_elf_ha_reloc),
a680de9a 874
7ba71655 875 /* A split-field reloc for addpcis, non-relative (gas internal use only). */
c94cb026 876 HOW (R_PPC64_16DX_HA, 4, 16, 0x1fffc1, 16, false, signed,
46807bf4 877 ppc64_elf_ha_reloc),
7ba71655 878
f9c6b907 879 /* Like R_PPC64_ADDR16_HI, but no overflow. */
c94cb026 880 HOW (R_PPC64_ADDR16_HIGH, 2, 16, 0xffff, 16, false, dont,
46807bf4 881 bfd_elf_generic_reloc),
f9c6b907
AM
882
883 /* Like R_PPC64_ADDR16_HA, but no overflow. */
c94cb026 884 HOW (R_PPC64_ADDR16_HIGHA, 2, 16, 0xffff, 16, false, dont,
46807bf4 885 ppc64_elf_ha_reloc),
f9c6b907
AM
886
887 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
c94cb026 888 HOW (R_PPC64_DTPREL16_HIGH, 2, 16, 0xffff, 16, false, dont,
46807bf4 889 ppc64_elf_unhandled_reloc),
f9c6b907
AM
890
891 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
c94cb026 892 HOW (R_PPC64_DTPREL16_HIGHA, 2, 16, 0xffff, 16, false, dont,
46807bf4 893 ppc64_elf_unhandled_reloc),
f9c6b907
AM
894
895 /* Like R_PPC64_TPREL16_HI, but no overflow. */
c94cb026 896 HOW (R_PPC64_TPREL16_HIGH, 2, 16, 0xffff, 16, false, dont,
46807bf4 897 ppc64_elf_unhandled_reloc),
f9c6b907
AM
898
899 /* Like R_PPC64_TPREL16_HA, but no overflow. */
c94cb026 900 HOW (R_PPC64_TPREL16_HIGHA, 2, 16, 0xffff, 16, false, dont,
46807bf4 901 ppc64_elf_unhandled_reloc),
f9c6b907 902
006589cf 903 /* Marker reloc on ELFv2 large-model function entry. */
c94cb026 904 HOW (R_PPC64_ENTRY, 4, 32, 0, 0, false, dont,
46807bf4 905 bfd_elf_generic_reloc),
006589cf 906
45965137 907 /* Like ADDR64, but use local entry point of function. */
c94cb026 908 HOW (R_PPC64_ADDR64_LOCAL, 8, 64, 0xffffffffffffffffULL, 0, false, dont,
46807bf4 909 bfd_elf_generic_reloc),
45965137 910
c94cb026 911 HOW (R_PPC64_PLTSEQ_NOTOC, 4, 32, 0, 0, false, dont,
5663e321
AM
912 bfd_elf_generic_reloc),
913
c94cb026 914 HOW (R_PPC64_PLTCALL_NOTOC, 4, 32, 0, 0, false, dont,
5663e321
AM
915 bfd_elf_generic_reloc),
916
c94cb026 917 HOW (R_PPC64_PCREL_OPT, 4, 32, 0, 0, false, dont,
5663e321
AM
918 bfd_elf_generic_reloc),
919
c94cb026 920 HOW (R_PPC64_D34, 8, 34, 0x3ffff0000ffffULL, 0, false, signed,
5663e321
AM
921 ppc64_elf_prefix_reloc),
922
c94cb026 923 HOW (R_PPC64_D34_LO, 8, 34, 0x3ffff0000ffffULL, 0, false, dont,
5663e321
AM
924 ppc64_elf_prefix_reloc),
925
c94cb026 926 HOW (R_PPC64_D34_HI30, 8, 34, 0x3ffff0000ffffULL, 34, false, dont,
5663e321
AM
927 ppc64_elf_prefix_reloc),
928
c94cb026 929 HOW (R_PPC64_D34_HA30, 8, 34, 0x3ffff0000ffffULL, 34, false, dont,
5663e321
AM
930 ppc64_elf_prefix_reloc),
931
c94cb026 932 HOW (R_PPC64_PCREL34, 8, 34, 0x3ffff0000ffffULL, 0, true, signed,
5663e321
AM
933 ppc64_elf_prefix_reloc),
934
c94cb026 935 HOW (R_PPC64_GOT_PCREL34, 8, 34, 0x3ffff0000ffffULL, 0, true, signed,
5663e321
AM
936 ppc64_elf_unhandled_reloc),
937
c94cb026 938 HOW (R_PPC64_PLT_PCREL34, 8, 34, 0x3ffff0000ffffULL, 0, true, signed,
5663e321
AM
939 ppc64_elf_unhandled_reloc),
940
c94cb026 941 HOW (R_PPC64_PLT_PCREL34_NOTOC, 8, 34, 0x3ffff0000ffffULL, 0, true, signed,
5663e321
AM
942 ppc64_elf_unhandled_reloc),
943
c94cb026 944 HOW (R_PPC64_TPREL34, 8, 34, 0x3ffff0000ffffULL, 0, false, signed,
c213164a
AM
945 ppc64_elf_unhandled_reloc),
946
c94cb026 947 HOW (R_PPC64_DTPREL34, 8, 34, 0x3ffff0000ffffULL, 0, false, signed,
c213164a
AM
948 ppc64_elf_unhandled_reloc),
949
c94cb026 950 HOW (R_PPC64_GOT_TLSGD_PCREL34, 8, 34, 0x3ffff0000ffffULL, 0, true, signed,
c213164a
AM
951 ppc64_elf_unhandled_reloc),
952
c94cb026 953 HOW (R_PPC64_GOT_TLSLD_PCREL34, 8, 34, 0x3ffff0000ffffULL, 0, true, signed,
c213164a
AM
954 ppc64_elf_unhandled_reloc),
955
c94cb026 956 HOW (R_PPC64_GOT_TPREL_PCREL34, 8, 34, 0x3ffff0000ffffULL, 0, true, signed,
c213164a
AM
957 ppc64_elf_unhandled_reloc),
958
c94cb026 959 HOW (R_PPC64_GOT_DTPREL_PCREL34, 8, 34, 0x3ffff0000ffffULL, 0, true, signed,
c213164a
AM
960 ppc64_elf_unhandled_reloc),
961
c94cb026 962 HOW (R_PPC64_ADDR16_HIGHER34, 2, 16, 0xffff, 34, false, dont,
5663e321
AM
963 bfd_elf_generic_reloc),
964
c94cb026 965 HOW (R_PPC64_ADDR16_HIGHERA34, 2, 16, 0xffff, 34, false, dont,
5663e321
AM
966 ppc64_elf_ha_reloc),
967
c94cb026 968 HOW (R_PPC64_ADDR16_HIGHEST34, 2, 16, 0xffff, 50, false, dont,
5663e321
AM
969 bfd_elf_generic_reloc),
970
c94cb026 971 HOW (R_PPC64_ADDR16_HIGHESTA34, 2, 16, 0xffff, 50, false, dont,
5663e321
AM
972 ppc64_elf_ha_reloc),
973
c94cb026 974 HOW (R_PPC64_REL16_HIGHER34, 2, 16, 0xffff, 34, true, dont,
5663e321
AM
975 bfd_elf_generic_reloc),
976
c94cb026 977 HOW (R_PPC64_REL16_HIGHERA34, 2, 16, 0xffff, 34, true, dont,
5663e321
AM
978 ppc64_elf_ha_reloc),
979
c94cb026 980 HOW (R_PPC64_REL16_HIGHEST34, 2, 16, 0xffff, 50, true, dont,
5663e321
AM
981 bfd_elf_generic_reloc),
982
c94cb026 983 HOW (R_PPC64_REL16_HIGHESTA34, 2, 16, 0xffff, 50, true, dont,
5663e321
AM
984 ppc64_elf_ha_reloc),
985
c94cb026 986 HOW (R_PPC64_D28, 8, 28, 0xfff0000ffffULL, 0, false, signed,
5663e321
AM
987 ppc64_elf_prefix_reloc),
988
c94cb026 989 HOW (R_PPC64_PCREL28, 8, 28, 0xfff0000ffffULL, 0, true, signed,
5663e321
AM
990 ppc64_elf_prefix_reloc),
991
5bd4f169 992 /* GNU extension to record C++ vtable hierarchy. */
5d0feb98 993 HOW (R_PPC64_GNU_VTINHERIT, 0, 0, 0, 0, false, dont,
46807bf4 994 NULL),
5bd4f169
AM
995
996 /* GNU extension to record C++ vtable member usage. */
5d0feb98 997 HOW (R_PPC64_GNU_VTENTRY, 0, 0, 0, 0, false, dont,
46807bf4 998 NULL),
5bd4f169
AM
999};
1000
1001\f
1002/* Initialize the ppc64_elf_howto_table, so that linear accesses can
1003 be done. */
1004
1005static void
4ce794b7 1006ppc_howto_init (void)
5bd4f169
AM
1007{
1008 unsigned int i, type;
1009
a4b6fadd 1010 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
5bd4f169
AM
1011 {
1012 type = ppc64_elf_howto_raw[i].type;
a4b6fadd 1013 BFD_ASSERT (type < ARRAY_SIZE (ppc64_elf_howto_table));
5bd4f169
AM
1014 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
1015 }
1016}
1017
1018static reloc_howto_type *
87c69f97 1019ppc64_elf_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
5bd4f169 1020{
411e1bfb 1021 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
5bd4f169
AM
1022
1023 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1024 /* Initialize howto table if needed. */
1025 ppc_howto_init ();
1026
4ce794b7 1027 switch (code)
5bd4f169
AM
1028 {
1029 default:
f3185997 1030 /* xgettext:c-format */
2cdcc330
AM
1031 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd,
1032 (int) code);
f3185997 1033 bfd_set_error (bfd_error_bad_value);
4ce794b7 1034 return NULL;
5bd4f169 1035
411e1bfb
AM
1036 case BFD_RELOC_NONE: r = R_PPC64_NONE;
1037 break;
1038 case BFD_RELOC_32: r = R_PPC64_ADDR32;
1039 break;
1040 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
1041 break;
1042 case BFD_RELOC_16: r = R_PPC64_ADDR16;
1043 break;
1044 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
1045 break;
1046 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
1047 break;
f9c6b907
AM
1048 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
1049 break;
411e1bfb 1050 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
5bd4f169 1051 break;
f9c6b907
AM
1052 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
1053 break;
411e1bfb 1054 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
5bd4f169 1055 break;
411e1bfb 1056 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
5bd4f169 1057 break;
411e1bfb 1058 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
5bd4f169 1059 break;
411e1bfb 1060 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
5bd4f169 1061 break;
05d0e962
AM
1062 case BFD_RELOC_PPC64_REL24_NOTOC: r = R_PPC64_REL24_NOTOC;
1063 break;
7aba54da
AM
1064 case BFD_RELOC_PPC64_REL24_P9NOTOC: r = R_PPC64_REL24_P9NOTOC;
1065 break;
411e1bfb 1066 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
5bd4f169 1067 break;
411e1bfb 1068 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
5bd4f169 1069 break;
411e1bfb 1070 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
5bd4f169 1071 break;
411e1bfb 1072 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
5bd4f169 1073 break;
411e1bfb 1074 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
5bd4f169 1075 break;
411e1bfb 1076 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
5bd4f169 1077 break;
411e1bfb 1078 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
5bd4f169 1079 break;
411e1bfb 1080 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
5bd4f169 1081 break;
411e1bfb 1082 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
5bd4f169 1083 break;
411e1bfb 1084 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
5bd4f169 1085 break;
411e1bfb 1086 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
5bd4f169 1087 break;
411e1bfb 1088 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
5bd4f169 1089 break;
411e1bfb 1090 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
5bd4f169 1091 break;
411e1bfb 1092 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
5bd4f169 1093 break;
411e1bfb 1094 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
5bd4f169 1095 break;
411e1bfb 1096 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
5bd4f169 1097 break;
411e1bfb 1098 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
5bd4f169 1099 break;
411e1bfb 1100 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
5bd4f169 1101 break;
411e1bfb 1102 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
5bd4f169 1103 break;
411e1bfb 1104 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
5bd4f169 1105 break;
411e1bfb 1106 case BFD_RELOC_64: r = R_PPC64_ADDR64;
5bd4f169 1107 break;
411e1bfb 1108 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
5bd4f169 1109 break;
411e1bfb 1110 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
5bd4f169 1111 break;
411e1bfb 1112 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
5bd4f169 1113 break;
411e1bfb 1114 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
5bd4f169 1115 break;
411e1bfb 1116 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
5bd4f169 1117 break;
411e1bfb 1118 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
5bd4f169 1119 break;
411e1bfb 1120 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
5bd4f169 1121 break;
411e1bfb 1122 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
5bd4f169 1123 break;
411e1bfb 1124 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
5bd4f169 1125 break;
411e1bfb 1126 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
5bd4f169 1127 break;
411e1bfb 1128 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
5bd4f169 1129 break;
411e1bfb 1130 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
5bd4f169 1131 break;
411e1bfb 1132 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
5bd4f169 1133 break;
411e1bfb 1134 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
5bd4f169 1135 break;
411e1bfb 1136 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
5bd4f169 1137 break;
411e1bfb 1138 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
5bd4f169 1139 break;
411e1bfb 1140 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
5bd4f169 1141 break;
411e1bfb 1142 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
5bd4f169 1143 break;
411e1bfb 1144 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
5bd4f169 1145 break;
411e1bfb 1146 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
5bd4f169 1147 break;
411e1bfb 1148 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
5bd4f169 1149 break;
411e1bfb 1150 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
5bd4f169 1151 break;
411e1bfb 1152 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
5bd4f169 1153 break;
411e1bfb 1154 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
5bd4f169 1155 break;
411e1bfb 1156 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
5bd4f169 1157 break;
411e1bfb 1158 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
5bd4f169 1159 break;
411e1bfb 1160 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
5bd4f169 1161 break;
c213164a 1162 case BFD_RELOC_PPC64_TLS_PCREL:
411e1bfb 1163 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
5bd4f169 1164 break;
727fc41e
AM
1165 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
1166 break;
1167 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
1168 break;
411e1bfb 1169 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
5bd4f169 1170 break;
411e1bfb 1171 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
5bd4f169 1172 break;
411e1bfb 1173 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
5bd4f169 1174 break;
411e1bfb 1175 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
5bd4f169 1176 break;
f9c6b907
AM
1177 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
1178 break;
411e1bfb 1179 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
5bd4f169 1180 break;
f9c6b907
AM
1181 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
1182 break;
411e1bfb 1183 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
5bd4f169 1184 break;
411e1bfb
AM
1185 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
1186 break;
1187 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
1188 break;
1189 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
1190 break;
f9c6b907
AM
1191 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
1192 break;
411e1bfb
AM
1193 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
1194 break;
f9c6b907
AM
1195 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
1196 break;
411e1bfb
AM
1197 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
1198 break;
1199 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
1200 break;
1201 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
1202 break;
1203 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
1204 break;
1205 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
1206 break;
1207 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
1208 break;
1209 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
1210 break;
1211 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
1212 break;
1213 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
1214 break;
1215 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
1216 break;
1217 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
1218 break;
1219 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
1220 break;
1221 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
1222 break;
1223 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
1224 break;
1225 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
1226 break;
1227 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
1228 break;
1229 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
1230 break;
1231 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
1232 break;
1233 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
1234 break;
1235 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
1236 break;
1237 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
1238 break;
1239 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
1240 break;
1241 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
1242 break;
1243 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
1244 break;
1245 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
1246 break;
1247 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
1248 break;
1249 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
1250 break;
1251 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
1252 break;
1253 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
1254 break;
25f23106
AM
1255 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
1256 break;
1257 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
1258 break;
1259 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
1260 break;
1261 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
1262 break;
4a969973
AM
1263 case BFD_RELOC_PPC64_REL16_HIGH: r = R_PPC64_REL16_HIGH;
1264 break;
1265 case BFD_RELOC_PPC64_REL16_HIGHA: r = R_PPC64_REL16_HIGHA;
1266 break;
1267 case BFD_RELOC_PPC64_REL16_HIGHER: r = R_PPC64_REL16_HIGHER;
1268 break;
1269 case BFD_RELOC_PPC64_REL16_HIGHERA: r = R_PPC64_REL16_HIGHERA;
1270 break;
1271 case BFD_RELOC_PPC64_REL16_HIGHEST: r = R_PPC64_REL16_HIGHEST;
1272 break;
1273 case BFD_RELOC_PPC64_REL16_HIGHESTA: r = R_PPC64_REL16_HIGHESTA;
1274 break;
7ba71655
AM
1275 case BFD_RELOC_PPC_16DX_HA: r = R_PPC64_16DX_HA;
1276 break;
a680de9a
PB
1277 case BFD_RELOC_PPC_REL16DX_HA: r = R_PPC64_REL16DX_HA;
1278 break;
006589cf
AM
1279 case BFD_RELOC_PPC64_ENTRY: r = R_PPC64_ENTRY;
1280 break;
45965137
AM
1281 case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL;
1282 break;
5663e321
AM
1283 case BFD_RELOC_PPC64_D34: r = R_PPC64_D34;
1284 break;
1285 case BFD_RELOC_PPC64_D34_LO: r = R_PPC64_D34_LO;
1286 break;
1287 case BFD_RELOC_PPC64_D34_HI30: r = R_PPC64_D34_HI30;
1288 break;
1289 case BFD_RELOC_PPC64_D34_HA30: r = R_PPC64_D34_HA30;
1290 break;
1291 case BFD_RELOC_PPC64_PCREL34: r = R_PPC64_PCREL34;
1292 break;
1293 case BFD_RELOC_PPC64_GOT_PCREL34: r = R_PPC64_GOT_PCREL34;
1294 break;
1295 case BFD_RELOC_PPC64_PLT_PCREL34: r = R_PPC64_PLT_PCREL34;
1296 break;
c213164a
AM
1297 case BFD_RELOC_PPC64_TPREL34: r = R_PPC64_TPREL34;
1298 break;
1299 case BFD_RELOC_PPC64_DTPREL34: r = R_PPC64_DTPREL34;
1300 break;
87c69f97 1301 case BFD_RELOC_PPC64_GOT_TLSGD_PCREL34: r = R_PPC64_GOT_TLSGD_PCREL34;
c213164a 1302 break;
87c69f97 1303 case BFD_RELOC_PPC64_GOT_TLSLD_PCREL34: r = R_PPC64_GOT_TLSLD_PCREL34;
c213164a 1304 break;
87c69f97 1305 case BFD_RELOC_PPC64_GOT_TPREL_PCREL34: r = R_PPC64_GOT_TPREL_PCREL34;
c213164a 1306 break;
87c69f97 1307 case BFD_RELOC_PPC64_GOT_DTPREL_PCREL34: r = R_PPC64_GOT_DTPREL_PCREL34;
c213164a 1308 break;
5663e321
AM
1309 case BFD_RELOC_PPC64_ADDR16_HIGHER34: r = R_PPC64_ADDR16_HIGHER34;
1310 break;
1311 case BFD_RELOC_PPC64_ADDR16_HIGHERA34: r = R_PPC64_ADDR16_HIGHERA34;
1312 break;
1313 case BFD_RELOC_PPC64_ADDR16_HIGHEST34: r = R_PPC64_ADDR16_HIGHEST34;
1314 break;
1315 case BFD_RELOC_PPC64_ADDR16_HIGHESTA34: r = R_PPC64_ADDR16_HIGHESTA34;
1316 break;
1317 case BFD_RELOC_PPC64_REL16_HIGHER34: r = R_PPC64_REL16_HIGHER34;
1318 break;
1319 case BFD_RELOC_PPC64_REL16_HIGHERA34: r = R_PPC64_REL16_HIGHERA34;
1320 break;
1321 case BFD_RELOC_PPC64_REL16_HIGHEST34: r = R_PPC64_REL16_HIGHEST34;
1322 break;
1323 case BFD_RELOC_PPC64_REL16_HIGHESTA34: r = R_PPC64_REL16_HIGHESTA34;
1324 break;
1325 case BFD_RELOC_PPC64_D28: r = R_PPC64_D28;
1326 break;
1327 case BFD_RELOC_PPC64_PCREL28: r = R_PPC64_PCREL28;
1328 break;
411e1bfb
AM
1329 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
1330 break;
1331 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
5bd4f169
AM
1332 break;
1333 }
1334
4ce794b7 1335 return ppc64_elf_howto_table[r];
5bd4f169
AM
1336};
1337
157090f7 1338static reloc_howto_type *
87c69f97 1339ppc64_elf_reloc_name_lookup (bfd *abfd, const char *r_name)
157090f7
AM
1340{
1341 unsigned int i;
87c69f97
AM
1342 static char *compat_map[][2] = {
1343 { "R_PPC64_GOT_TLSGD34", "R_PPC64_GOT_TLSGD_PCREL34" },
1344 { "R_PPC64_GOT_TLSLD34", "R_PPC64_GOT_TLSLD_PCREL34" },
1345 { "R_PPC64_GOT_TPREL34", "R_PPC64_GOT_TPREL_PCREL34" },
1346 { "R_PPC64_GOT_DTPREL34", "R_PPC64_GOT_DTPREL_PCREL34" }
1347 };
157090f7 1348
a4b6fadd 1349 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
157090f7
AM
1350 if (ppc64_elf_howto_raw[i].name != NULL
1351 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
1352 return &ppc64_elf_howto_raw[i];
1353
87c69f97
AM
1354 /* Handle old names of relocations in case they were used by
1355 .reloc directives.
1356 FIXME: Remove this soon. Mapping the reloc names is very likely
1357 completely unnecessary. */
1358 for (i = 0; i < ARRAY_SIZE (compat_map); i++)
1359 if (strcasecmp (compat_map[i][0], r_name) == 0)
1360 {
1361 _bfd_error_handler (_("warning: %s should be used rather than %s"),
1362 compat_map[i][1], compat_map[i][0]);
1363 return ppc64_elf_reloc_name_lookup (abfd, compat_map[i][1]);
1364 }
1365
157090f7
AM
1366 return NULL;
1367}
1368
5bd4f169
AM
1369/* Set the howto pointer for a PowerPC ELF reloc. */
1370
0a1b45a2 1371static bool
4aef7643 1372ppc64_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
4ce794b7 1373 Elf_Internal_Rela *dst)
5bd4f169 1374{
65f38f15
AM
1375 unsigned int type;
1376
ef60b7ff 1377 /* Initialize howto table if needed. */
5bd4f169 1378 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
1379 ppc_howto_init ();
1380
65f38f15 1381 type = ELF64_R_TYPE (dst->r_info);
a4b6fadd 1382 if (type >= ARRAY_SIZE (ppc64_elf_howto_table))
d0fb9a8d 1383 {
695344c0 1384 /* xgettext:c-format */
0aa13fee 1385 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
cf97bcb0 1386 abfd, type);
f3185997 1387 bfd_set_error (bfd_error_bad_value);
0a1b45a2 1388 return false;
d0fb9a8d 1389 }
65f38f15 1390 cache_ptr->howto = ppc64_elf_howto_table[type];
f3185997
NC
1391 if (cache_ptr->howto == NULL || cache_ptr->howto->name == NULL)
1392 {
1393 /* xgettext:c-format */
1394 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1395 abfd, type);
1396 bfd_set_error (bfd_error_bad_value);
0a1b45a2 1397 return false;
f3185997 1398 }
2cdcc330 1399
0a1b45a2 1400 return true;
5bd4f169
AM
1401}
1402
04c9666a 1403/* Handle the R_PPC64_ADDR16_HA and similar relocs. */
5bd4f169
AM
1404
1405static bfd_reloc_status_type
4ce794b7
AM
1406ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1407 void *data, asection *input_section,
1408 bfd *output_bfd, char **error_message)
5bd4f169 1409{
a680de9a
PB
1410 enum elf_ppc64_reloc_type r_type;
1411 long insn;
1412 bfd_size_type octets;
3de43e7b 1413 bfd_vma value;
a680de9a 1414
805fc799
AM
1415 /* If this is a relocatable link (output_bfd test tells us), just
1416 call the generic function. Any adjustment will be done at final
1417 link time. */
1418 if (output_bfd != NULL)
cedb70c5 1419 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1420 input_section, output_bfd, error_message);
1421
5663e321
AM
1422 /* Adjust the addend for sign extension of the low 16 (or 34) bits.
1423 We won't actually be using the low bits, so trashing them
805fc799 1424 doesn't matter. */
a680de9a 1425 r_type = reloc_entry->howto->type;
5663e321
AM
1426 if (r_type == R_PPC64_ADDR16_HIGHERA34
1427 || r_type == R_PPC64_ADDR16_HIGHESTA34
1428 || r_type == R_PPC64_REL16_HIGHERA34
1429 || r_type == R_PPC64_REL16_HIGHESTA34)
1430 reloc_entry->addend += 1ULL << 33;
1431 else
1432 reloc_entry->addend += 1U << 15;
a680de9a
PB
1433 if (r_type != R_PPC64_REL16DX_HA)
1434 return bfd_reloc_continue;
1435
1436 value = 0;
1437 if (!bfd_is_com_section (symbol->section))
1438 value = symbol->value;
1439 value += (reloc_entry->addend
1440 + symbol->section->output_offset
1441 + symbol->section->output_section->vma);
1442 value -= (reloc_entry->address
1443 + input_section->output_offset
1444 + input_section->output_section->vma);
3de43e7b 1445 value = (bfd_signed_vma) value >> 16;
a680de9a 1446
bb294208 1447 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
b54509b8
AM
1448 if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd,
1449 input_section, octets))
1450 return bfd_reloc_outofrange;
1451
a680de9a
PB
1452 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
1453 insn &= ~0x1fffc1;
3de43e7b 1454 insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
a680de9a 1455 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
3de43e7b 1456 if (value + 0x8000 > 0xffff)
a680de9a
PB
1457 return bfd_reloc_overflow;
1458 return bfd_reloc_ok;
805fc799 1459}
5bd4f169 1460
2441e016
AM
1461static bfd_reloc_status_type
1462ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1463 void *data, asection *input_section,
1464 bfd *output_bfd, char **error_message)
1465{
1466 if (output_bfd != NULL)
1467 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1468 input_section, output_bfd, error_message);
1469
6313825c
AM
1470 if (symbol->section->owner == NULL
1471 || !is_ppc64_elf (symbol->section->owner))
1472 return bfd_reloc_continue;
1473
699733f6
AM
1474 if (strcmp (symbol->section->name, ".opd") == 0
1475 && (symbol->section->owner->flags & DYNAMIC) == 0)
2441e016
AM
1476 {
1477 bfd_vma dest = opd_entry_value (symbol->section,
1478 symbol->value + reloc_entry->addend,
0a1b45a2 1479 NULL, NULL, false);
2441e016
AM
1480 if (dest != (bfd_vma) -1)
1481 reloc_entry->addend = dest - (symbol->value
1482 + symbol->section->output_section->vma
1483 + symbol->section->output_offset);
1484 }
810d4e75
AM
1485 else
1486 {
1487 elf_symbol_type *elfsym = (elf_symbol_type *) symbol;
1488
1489 if (symbol->section->owner != abfd
1490 && abiversion (symbol->section->owner) >= 2)
1491 {
1492 unsigned int i;
1493
1494 for (i = 0; i < symbol->section->owner->symcount; ++i)
1495 {
1496 asymbol *symdef = symbol->section->owner->outsymbols[i];
1497
1498 if (strcmp (symdef->name, symbol->name) == 0)
1499 {
1500 elfsym = (elf_symbol_type *) symdef;
1501 break;
1502 }
1503 }
1504 }
1505 reloc_entry->addend
1506 += PPC64_LOCAL_ENTRY_OFFSET (elfsym->internal_elf_sym.st_other);
1507 }
2441e016
AM
1508 return bfd_reloc_continue;
1509}
1510
805fc799 1511static bfd_reloc_status_type
4ce794b7
AM
1512ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1513 void *data, asection *input_section,
1514 bfd *output_bfd, char **error_message)
805fc799
AM
1515{
1516 long insn;
04c9666a 1517 enum elf_ppc64_reloc_type r_type;
805fc799 1518 bfd_size_type octets;
794e51c0 1519 /* Assume 'at' branch hints. */
0a1b45a2 1520 bool is_isa_v2 = true;
805fc799
AM
1521
1522 /* If this is a relocatable link (output_bfd test tells us), just
1523 call the generic function. Any adjustment will be done at final
1524 link time. */
5bd4f169 1525 if (output_bfd != NULL)
cedb70c5 1526 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1527 input_section, output_bfd, error_message);
1528
bb294208 1529 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
b54509b8
AM
1530 if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd,
1531 input_section, octets))
1532 return bfd_reloc_outofrange;
1533
805fc799
AM
1534 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
1535 insn &= ~(0x01 << 21);
4ce794b7 1536 r_type = reloc_entry->howto->type;
805fc799
AM
1537 if (r_type == R_PPC64_ADDR14_BRTAKEN
1538 || r_type == R_PPC64_REL14_BRTAKEN)
cedb70c5 1539 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
805fc799 1540
794e51c0 1541 if (is_isa_v2)
5bd4f169 1542 {
805fc799
AM
1543 /* Set 'a' bit. This is 0b00010 in BO field for branch
1544 on CR(BI) insns (BO == 001at or 011at), and 0b01000
1545 for branch on CTR insns (BO == 1a00t or 1a01t). */
1546 if ((insn & (0x14 << 21)) == (0x04 << 21))
1547 insn |= 0x02 << 21;
1548 else if ((insn & (0x14 << 21)) == (0x10 << 21))
1549 insn |= 0x08 << 21;
1550 else
2441e016 1551 goto out;
5bd4f169 1552 }
805fc799
AM
1553 else
1554 {
1555 bfd_vma target = 0;
1556 bfd_vma from;
5bd4f169 1557
805fc799
AM
1558 if (!bfd_is_com_section (symbol->section))
1559 target = symbol->value;
1560 target += symbol->section->output_section->vma;
1561 target += symbol->section->output_offset;
1562 target += reloc_entry->addend;
5bd4f169 1563
805fc799
AM
1564 from = (reloc_entry->address
1565 + input_section->output_offset
1566 + input_section->output_section->vma);
5bd4f169 1567
805fc799
AM
1568 /* Invert 'y' bit if not the default. */
1569 if ((bfd_signed_vma) (target - from) < 0)
1570 insn ^= 0x01 << 21;
1571 }
4ce794b7 1572 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2441e016
AM
1573 out:
1574 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
1575 input_section, output_bfd, error_message);
805fc799 1576}
5bd4f169 1577
805fc799 1578static bfd_reloc_status_type
4ce794b7
AM
1579ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1580 void *data, asection *input_section,
1581 bfd *output_bfd, char **error_message)
805fc799
AM
1582{
1583 /* If this is a relocatable link (output_bfd test tells us), just
1584 call the generic function. Any adjustment will be done at final
1585 link time. */
1586 if (output_bfd != NULL)
cedb70c5 1587 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799 1588 input_section, output_bfd, error_message);
5bd4f169 1589
805fc799
AM
1590 /* Subtract the symbol section base address. */
1591 reloc_entry->addend -= symbol->section->output_section->vma;
5bd4f169
AM
1592 return bfd_reloc_continue;
1593}
1594
805fc799 1595static bfd_reloc_status_type
4ce794b7
AM
1596ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1597 void *data, asection *input_section,
1598 bfd *output_bfd, char **error_message)
805fc799
AM
1599{
1600 /* If this is a relocatable link (output_bfd test tells us), just
1601 call the generic function. Any adjustment will be done at final
1602 link time. */
1603 if (output_bfd != NULL)
cedb70c5 1604 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1605 input_section, output_bfd, error_message);
1606
1607 /* Subtract the symbol section base address. */
1608 reloc_entry->addend -= symbol->section->output_section->vma;
1609
1610 /* Adjust the addend for sign extension of the low 16 bits. */
1611 reloc_entry->addend += 0x8000;
1612 return bfd_reloc_continue;
1613}
1614
1615static bfd_reloc_status_type
4ce794b7
AM
1616ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1617 void *data, asection *input_section,
1618 bfd *output_bfd, char **error_message)
805fc799
AM
1619{
1620 bfd_vma TOCstart;
1621
1622 /* If this is a relocatable link (output_bfd test tells us), just
1623 call the generic function. Any adjustment will be done at final
1624 link time. */
1625 if (output_bfd != NULL)
cedb70c5 1626 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1627 input_section, output_bfd, error_message);
1628
1629 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1630 if (TOCstart == 0)
1c865ab2 1631 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
1632
1633 /* Subtract the TOC base address. */
1634 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
1635 return bfd_reloc_continue;
1636}
1637
1638static bfd_reloc_status_type
4ce794b7
AM
1639ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1640 void *data, asection *input_section,
1641 bfd *output_bfd, char **error_message)
805fc799
AM
1642{
1643 bfd_vma TOCstart;
1644
1645 /* If this is a relocatable link (output_bfd test tells us), just
1646 call the generic function. Any adjustment will be done at final
1647 link time. */
1648 if (output_bfd != NULL)
cedb70c5 1649 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1650 input_section, output_bfd, error_message);
1651
1652 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1653 if (TOCstart == 0)
1c865ab2 1654 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799
AM
1655
1656 /* Subtract the TOC base address. */
1657 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
1658
1659 /* Adjust the addend for sign extension of the low 16 bits. */
1660 reloc_entry->addend += 0x8000;
1661 return bfd_reloc_continue;
1662}
1663
1664static bfd_reloc_status_type
4ce794b7
AM
1665ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1666 void *data, asection *input_section,
1667 bfd *output_bfd, char **error_message)
805fc799
AM
1668{
1669 bfd_vma TOCstart;
1670 bfd_size_type octets;
1671
1672 /* If this is a relocatable link (output_bfd test tells us), just
1673 call the generic function. Any adjustment will be done at final
1674 link time. */
1675 if (output_bfd != NULL)
cedb70c5 1676 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1677 input_section, output_bfd, error_message);
1678
b54509b8
AM
1679 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
1680 if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd,
1681 input_section, octets))
1682 return bfd_reloc_outofrange;
1683
805fc799
AM
1684 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1685 if (TOCstart == 0)
1c865ab2 1686 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
805fc799 1687
805fc799
AM
1688 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
1689 return bfd_reloc_ok;
1690}
1691
5663e321
AM
1692static bfd_reloc_status_type
1693ppc64_elf_prefix_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1694 void *data, asection *input_section,
1695 bfd *output_bfd, char **error_message)
1696{
1697 uint64_t insn;
1698 bfd_vma targ;
b54509b8 1699 bfd_size_type octets;
5663e321
AM
1700
1701 if (output_bfd != NULL)
1702 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1703 input_section, output_bfd, error_message);
1704
b54509b8
AM
1705 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
1706 if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd,
1707 input_section, octets))
1708 return bfd_reloc_outofrange;
1709
1710 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
5663e321 1711 insn <<= 32;
b54509b8 1712 insn |= bfd_get_32 (abfd, (bfd_byte *) data + octets + 4);
5663e321
AM
1713
1714 targ = (symbol->section->output_section->vma
1715 + symbol->section->output_offset
1716 + reloc_entry->addend);
1717 if (!bfd_is_com_section (symbol->section))
1718 targ += symbol->value;
1719 if (reloc_entry->howto->type == R_PPC64_D34_HA30)
1720 targ += 1ULL << 33;
1721 if (reloc_entry->howto->pc_relative)
1722 {
1723 bfd_vma from = (reloc_entry->address
1724 + input_section->output_offset
1725 + input_section->output_section->vma);
1726 targ -=from;
1727 }
1728 targ >>= reloc_entry->howto->rightshift;
1729 insn &= ~reloc_entry->howto->dst_mask;
1730 insn |= ((targ << 16) | (targ & 0xffff)) & reloc_entry->howto->dst_mask;
b54509b8
AM
1731 bfd_put_32 (abfd, insn >> 32, (bfd_byte *) data + octets);
1732 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets + 4);
5663e321
AM
1733 if (reloc_entry->howto->complain_on_overflow == complain_overflow_signed
1734 && (targ + (1ULL << (reloc_entry->howto->bitsize - 1))
1735 >= 1ULL << reloc_entry->howto->bitsize))
1736 return bfd_reloc_overflow;
1737 return bfd_reloc_ok;
1738}
1739
805fc799 1740static bfd_reloc_status_type
4ce794b7
AM
1741ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1742 void *data, asection *input_section,
1743 bfd *output_bfd, char **error_message)
805fc799
AM
1744{
1745 /* If this is a relocatable link (output_bfd test tells us), just
1746 call the generic function. Any adjustment will be done at final
1747 link time. */
1748 if (output_bfd != NULL)
cedb70c5 1749 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
1750 input_section, output_bfd, error_message);
1751
1752 if (error_message != NULL)
6f860418
AM
1753 *error_message = bfd_asprintf (_("generic linker can't handle %s"),
1754 reloc_entry->howto->name);
805fc799
AM
1755 return bfd_reloc_dangerous;
1756}
1757
927be08e
AM
1758/* Track GOT entries needed for a given symbol. We might need more
1759 than one got entry per symbol. */
1760struct got_entry
1761{
1762 struct got_entry *next;
1763
1764 /* The symbol addend that we'll be placing in the GOT. */
1765 bfd_vma addend;
1766
1767 /* Unlike other ELF targets, we use separate GOT entries for the same
1768 symbol referenced from different input files. This is to support
1769 automatic multiple TOC/GOT sections, where the TOC base can vary
1770 from one input file to another. After partitioning into TOC groups
1771 we merge entries within the group.
1772
1773 Point to the BFD owning this GOT entry. */
1774 bfd *owner;
1775
1776 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
1777 TLS_TPREL or TLS_DTPREL for tls entries. */
f961d9dd 1778 unsigned char tls_type;
927be08e
AM
1779
1780 /* Non-zero if got.ent points to real entry. */
f961d9dd 1781 unsigned char is_indirect;
927be08e
AM
1782
1783 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
1784 union
2cdcc330
AM
1785 {
1786 bfd_signed_vma refcount;
1787 bfd_vma offset;
1788 struct got_entry *ent;
1789 } got;
927be08e
AM
1790};
1791
1792/* The same for PLT. */
1793struct plt_entry
1794{
1795 struct plt_entry *next;
1796
1797 bfd_vma addend;
1798
1799 union
2cdcc330
AM
1800 {
1801 bfd_signed_vma refcount;
1802 bfd_vma offset;
1803 } plt;
927be08e
AM
1804};
1805
e717da7e
AM
1806struct ppc64_elf_obj_tdata
1807{
1808 struct elf_obj_tdata elf;
1809
1810 /* Shortcuts to dynamic linker sections. */
1811 asection *got;
1812 asection *relgot;
1813
b3fac117
AM
1814 /* Used during garbage collection. We attach global symbols defined
1815 on removed .opd entries to this section so that the sym is removed. */
1816 asection *deleted_section;
81688140 1817
927be08e 1818 /* TLS local dynamic got entry handling. Support for multiple GOT
e717da7e 1819 sections means we potentially need one of these for each input bfd. */
927be08e 1820 struct got_entry tlsld_got;
8860955f 1821
d77c8a4b
AM
1822 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
1823 the reloc to be in the range -32768 to 32767. */
98528052
AM
1824 unsigned int has_small_toc_reloc : 1;
1825
560c8763
AM
1826 /* Set if toc/got ha relocs detected not using r2, or lo reloc
1827 instruction not one we handle. */
1828 unsigned int unexpected_toc_insn : 1;
066f4018 1829
903b777d
AM
1830 /* Set if PLT/GOT/TOC relocs that can be optimised are present in
1831 this file. */
1832 unsigned int has_optrel : 1;
e717da7e
AM
1833};
1834
1835#define ppc64_elf_tdata(bfd) \
1836 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
1837
1838#define ppc64_tlsld_got(bfd) \
1839 (&ppc64_elf_tdata (bfd)->tlsld_got)
1840
1841/* Override the generic function because we store some extras. */
1842
0a1b45a2 1843static bool
e717da7e
AM
1844ppc64_elf_mkobject (bfd *abfd)
1845{
0ffa91dd 1846 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
4dfe6ac6 1847 PPC64_ELF_DATA);
e717da7e
AM
1848}
1849
feee612b 1850/* Fix bad default arch selected for a 64 bit input bfd when the
14b57c7c 1851 default is 32 bit. Also select arch based on apuinfo. */
feee612b 1852
0a1b45a2 1853static bool
4ce794b7 1854ppc64_elf_object_p (bfd *abfd)
feee612b 1855{
14b57c7c 1856 if (!abfd->arch_info->the_default)
0a1b45a2 1857 return true;
14b57c7c
AM
1858
1859 if (abfd->arch_info->bits_per_word == 32)
feee612b
AM
1860 {
1861 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
1862
1863 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
1864 {
1865 /* Relies on arch after 32 bit default being 64 bit default. */
1866 abfd->arch_info = abfd->arch_info->next;
1867 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
1868 }
1869 }
14b57c7c 1870 return _bfd_elf_ppc_set_arch (abfd);
feee612b
AM
1871}
1872
d37c89e5
AM
1873/* Support for core dump NOTE sections. */
1874
0a1b45a2 1875static bool
d37c89e5
AM
1876ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1877{
eea6121a 1878 size_t offset, size;
d37c89e5
AM
1879
1880 if (note->descsz != 504)
0a1b45a2 1881 return false;
d37c89e5
AM
1882
1883 /* pr_cursig */
228e534f 1884 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
d37c89e5
AM
1885
1886 /* pr_pid */
228e534f 1887 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
d37c89e5
AM
1888
1889 /* pr_reg */
1890 offset = 112;
eea6121a 1891 size = 384;
d37c89e5
AM
1892
1893 /* Make a ".reg/999" section. */
1894 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 1895 size, note->descpos + offset);
d37c89e5
AM
1896}
1897
0a1b45a2 1898static bool
d37c89e5
AM
1899ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1900{
1901 if (note->descsz != 136)
0a1b45a2 1902 return false;
d37c89e5 1903
228e534f 1904 elf_tdata (abfd)->core->pid
bc989cdc 1905 = bfd_get_32 (abfd, note->descdata + 24);
228e534f 1906 elf_tdata (abfd)->core->program
d37c89e5 1907 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
228e534f 1908 elf_tdata (abfd)->core->command
d37c89e5
AM
1909 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
1910
0a1b45a2 1911 return true;
d37c89e5
AM
1912}
1913
183e98be
AM
1914static char *
1915ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
1916 ...)
1917{
1918 switch (note_type)
1919 {
1920 default:
1921 return NULL;
1922
1923 case NT_PRPSINFO:
1924 {
9ef6d1e3 1925 char data[136] ATTRIBUTE_NONSTRING;
183e98be
AM
1926 va_list ap;
1927
1928 va_start (ap, note_type);
75cd47ed 1929 memset (data, 0, sizeof (data));
183e98be 1930 strncpy (data + 40, va_arg (ap, const char *), 16);
be3e27bb 1931#if GCC_VERSION == 8000 || GCC_VERSION == 8001
95da9854 1932 DIAGNOSTIC_PUSH;
be3e27bb 1933 /* GCC 8.0 and 8.1 warn about 80 equals destination size with
95da9854
L
1934 -Wstringop-truncation:
1935 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643
1936 */
95da9854
L
1937 DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION;
1938#endif
183e98be 1939 strncpy (data + 56, va_arg (ap, const char *), 80);
be3e27bb 1940#if GCC_VERSION == 8000 || GCC_VERSION == 8001
95da9854 1941 DIAGNOSTIC_POP;
fe75810f 1942#endif
183e98be
AM
1943 va_end (ap);
1944 return elfcore_write_note (abfd, buf, bufsiz,
1945 "CORE", note_type, data, sizeof (data));
1946 }
1947
1948 case NT_PRSTATUS:
1949 {
1950 char data[504];
1951 va_list ap;
1952 long pid;
1953 int cursig;
1954 const void *greg;
1955
1956 va_start (ap, note_type);
1957 memset (data, 0, 112);
1958 pid = va_arg (ap, long);
1959 bfd_put_32 (abfd, pid, data + 32);
1960 cursig = va_arg (ap, int);
1961 bfd_put_16 (abfd, cursig, data + 12);
1962 greg = va_arg (ap, const void *);
1963 memcpy (data + 112, greg, 384);
1964 memset (data + 496, 0, 8);
1965 va_end (ap);
1966 return elfcore_write_note (abfd, buf, bufsiz,
1967 "CORE", note_type, data, sizeof (data));
1968 }
1969 }
1970}
1971
5d35169e
AM
1972/* Add extra PPC sections. */
1973
2cdcc330 1974static const struct bfd_elf_special_section ppc64_elf_special_sections[] =
7f4d3958 1975{
07d6d2b8
AM
1976 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
1977 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 1978 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
1979 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
1980 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 1981 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8 1982 { NULL, 0, 0, 0, 0 }
5d35169e
AM
1983};
1984
7c8fe5c4
AM
1985enum _ppc64_sec_type {
1986 sec_normal = 0,
1987 sec_opd = 1,
46439c90
AM
1988 sec_toc = 2,
1989 sec_stub = 3
7c8fe5c4
AM
1990};
1991
f0abc2a1
AM
1992struct _ppc64_elf_section_data
1993{
1994 struct bfd_elf_section_data elf;
411e1bfb 1995
f0abc2a1
AM
1996 union
1997 {
51aecdc5
AM
1998 /* An array with one entry for each opd function descriptor,
1999 and some spares since opd entries may be either 16 or 24 bytes. */
2000#define OPD_NDX(OFF) ((OFF) >> 4)
74f0fb50
AM
2001 struct _opd_sec_data
2002 {
2003 /* Points to the function code section for local opd entries. */
2004 asection **func_sec;
2005
2006 /* After editing .opd, adjust references to opd local syms. */
2007 long *adjust;
6313825c
AM
2008
2009 union
2010 {
2011 /* A copy of relocs before they are modified for --emit-relocs. */
2012 Elf_Internal_Rela *relocs;
2013
2014 /* Section contents. */
2015 bfd_byte *contents;
2016 } u;
74f0fb50 2017 } opd;
7c8fe5c4 2018
3a71aa26
AM
2019 /* An array for toc sections, indexed by offset/8. */
2020 struct _toc_sec_data
2021 {
2022 /* Specifies the relocation symbol index used at a given toc offset. */
2023 unsigned *symndx;
2024
2025 /* And the relocation addend. */
2026 bfd_vma *add;
2027 } toc;
46439c90
AM
2028
2029 /* Stub debugging. */
2030 struct ppc_stub_hash_entry *last_ent;
7c8fe5c4
AM
2031 } u;
2032
2033 enum _ppc64_sec_type sec_type:2;
411e1bfb 2034
7c8fe5c4
AM
2035 /* Flag set when small branches are detected. Used to
2036 select suitable defaults for the stub group size. */
2037 unsigned int has_14bit_branch:1;
3e04d765
AM
2038
2039 /* Flag set when PLTCALL relocs are detected. */
2040 unsigned int has_pltcall:1;
066f4018 2041
903b777d
AM
2042 /* Flag set when section has PLT/GOT/TOC relocations that can be
2043 optimised. */
2044 unsigned int has_optrel:1;
f0abc2a1
AM
2045};
2046
2047#define ppc64_elf_section_data(sec) \
411e1bfb 2048 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
f0abc2a1 2049
0a1b45a2 2050static bool
4ce794b7 2051ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1 2052{
f592407e
AM
2053 if (!sec->used_by_bfd)
2054 {
2055 struct _ppc64_elf_section_data *sdata;
986f0783 2056 size_t amt = sizeof (*sdata);
f0abc2a1 2057
f592407e
AM
2058 sdata = bfd_zalloc (abfd, amt);
2059 if (sdata == NULL)
0a1b45a2 2060 return false;
f592407e
AM
2061 sec->used_by_bfd = sdata;
2062 }
f0abc2a1
AM
2063
2064 return _bfd_elf_new_section_hook (abfd, sec);
2065}
4025353c 2066
0a1b45a2 2067static bool
bf577467
AM
2068ppc64_elf_section_flags (const Elf_Internal_Shdr *hdr)
2069{
2070 const char *name = hdr->bfd_section->name;
2071
3f3328b8
ML
2072 if (startswith (name, ".sbss")
2073 || startswith (name, ".sdata"))
bf577467
AM
2074 hdr->bfd_section->flags |= SEC_SMALL_DATA;
2075
0a1b45a2 2076 return true;
bf577467
AM
2077}
2078
74f0fb50 2079static struct _opd_sec_data *
4025353c
AM
2080get_opd_info (asection * sec)
2081{
2082 if (sec != NULL
2083 && ppc64_elf_section_data (sec) != NULL
7c8fe5c4 2084 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
74f0fb50 2085 return &ppc64_elf_section_data (sec)->u.opd;
4025353c
AM
2086 return NULL;
2087}
90e3cdf2
JJ
2088\f
2089/* Parameters for the qsort hook. */
0a1b45a2 2090static bool synthetic_relocatable;
8cb1c2c8 2091static const asection *synthetic_opd;
90e3cdf2 2092
699733f6 2093/* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
90e3cdf2
JJ
2094
2095static int
2096compare_symbols (const void *ap, const void *bp)
2097{
2cdcc330
AM
2098 const asymbol *a = *(const asymbol **) ap;
2099 const asymbol *b = *(const asymbol **) bp;
90e3cdf2 2100
699733f6
AM
2101 /* Section symbols first. */
2102 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
90e3cdf2 2103 return -1;
699733f6 2104 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
90e3cdf2
JJ
2105 return 1;
2106
699733f6 2107 /* then .opd symbols. */
cd285db5
AM
2108 if (synthetic_opd != NULL)
2109 {
2110 if (strcmp (a->section->name, ".opd") == 0
2111 && strcmp (b->section->name, ".opd") != 0)
2112 return -1;
2113 if (strcmp (a->section->name, ".opd") != 0
2114 && strcmp (b->section->name, ".opd") == 0)
2115 return 1;
2116 }
90e3cdf2 2117
699733f6 2118 /* then other code symbols. */
2cdcc330
AM
2119 if (((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2120 == (SEC_CODE | SEC_ALLOC))
2121 && ((b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2122 != (SEC_CODE | SEC_ALLOC)))
90e3cdf2
JJ
2123 return -1;
2124
2cdcc330
AM
2125 if (((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2126 != (SEC_CODE | SEC_ALLOC))
2127 && ((b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2128 == (SEC_CODE | SEC_ALLOC)))
90e3cdf2
JJ
2129 return 1;
2130
2131 if (synthetic_relocatable)
2132 {
2133 if (a->section->id < b->section->id)
2134 return -1;
2135
2136 if (a->section->id > b->section->id)
2137 return 1;
2138 }
2139
2140 if (a->value + a->section->vma < b->value + b->section->vma)
2141 return -1;
2142
2143 if (a->value + a->section->vma > b->value + b->section->vma)
2144 return 1;
2145
4d35a0aa
AM
2146 /* For syms with the same value, prefer strong dynamic global function
2147 syms over other syms. */
2148 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
2149 return -1;
2150
2151 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
2152 return 1;
2153
2154 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
2155 return -1;
2156
2157 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
2158 return 1;
2159
2160 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
2161 return -1;
2162
2163 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
2164 return 1;
2165
2166 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
2167 return -1;
2168
2169 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
2170 return 1;
2171
dcea6a95
AM
2172 /* Finally, sort on where the symbol is in memory. The symbols will
2173 be in at most two malloc'd blocks, one for static syms, one for
2174 dynamic syms, and we distinguish the two blocks above by testing
2175 BSF_DYNAMIC. Since we are sorting the symbol pointers which were
2176 originally in the same order as the symbols (and we're not
2177 sorting the symbols themselves), this ensures a stable sort. */
2178 if (a < b)
2179 return -1;
2180 if (a > b)
2181 return 1;
2182 return 0;
90e3cdf2
JJ
2183}
2184
699733f6 2185/* Search SYMS for a symbol of the given VALUE. */
90e3cdf2 2186
699733f6 2187static asymbol *
9ad9b810
AM
2188sym_exists_at (asymbol **syms, size_t lo, size_t hi, unsigned int id,
2189 bfd_vma value)
90e3cdf2 2190{
9ad9b810 2191 size_t mid;
90e3cdf2 2192
7292b3ac 2193 if (id == (unsigned) -1)
699733f6
AM
2194 {
2195 while (lo < hi)
2196 {
2197 mid = (lo + hi) >> 1;
2198 if (syms[mid]->value + syms[mid]->section->vma < value)
2199 lo = mid + 1;
2200 else if (syms[mid]->value + syms[mid]->section->vma > value)
2201 hi = mid;
2202 else
2203 return syms[mid];
2204 }
2205 }
2206 else
2207 {
2208 while (lo < hi)
2209 {
2210 mid = (lo + hi) >> 1;
2211 if (syms[mid]->section->id < id)
2212 lo = mid + 1;
2213 else if (syms[mid]->section->id > id)
2214 hi = mid;
2215 else if (syms[mid]->value < value)
2216 lo = mid + 1;
2217 else if (syms[mid]->value > value)
2218 hi = mid;
2219 else
2220 return syms[mid];
2221 }
2222 }
2223 return NULL;
90e3cdf2
JJ
2224}
2225
0a1b45a2 2226static bool
468392fb
AM
2227section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
2228{
2229 bfd_vma vma = *(bfd_vma *) ptr;
2230 return ((section->flags & SEC_ALLOC) != 0
2231 && section->vma <= vma
2232 && vma < section->vma + section->size);
2233}
2234
699733f6 2235/* Create synthetic symbols, effectively restoring "dot-symbol" function
c4b0b099
AM
2236 entry syms. Also generate @plt symbols for the glink branch table.
2237 Returns count of synthetic symbols in RET or -1 on error. */
90e3cdf2
JJ
2238
2239static long
a7535cf3
AM
2240ppc64_elf_get_synthetic_symtab (bfd *abfd,
2241 long static_count, asymbol **static_syms,
2242 long dyn_count, asymbol **dyn_syms,
c9727e01 2243 asymbol **ret)
90e3cdf2
JJ
2244{
2245 asymbol *s;
0ccf57bd 2246 size_t i, j, count;
90e3cdf2 2247 char *names;
0ccf57bd 2248 size_t symcount, codesecsym, codesecsymend, secsymend, opdsymend;
ee67d69a 2249 asection *opd = NULL;
0a1b45a2 2250 bool relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
a7535cf3 2251 asymbol **syms;
ee67d69a 2252 int abi = abiversion (abfd);
90e3cdf2
JJ
2253
2254 *ret = NULL;
2255
ee67d69a
AM
2256 if (abi < 2)
2257 {
2258 opd = bfd_get_section_by_name (abfd, ".opd");
2259 if (opd == NULL && abi == 1)
2260 return 0;
2261 }
90e3cdf2 2262
a5259595
AM
2263 syms = NULL;
2264 codesecsym = 0;
2265 codesecsymend = 0;
2266 secsymend = 0;
2267 opdsymend = 0;
2268 symcount = 0;
2269 if (opd != NULL)
c9727e01 2270 {
a5259595
AM
2271 symcount = static_count;
2272 if (!relocatable)
2273 symcount += dyn_count;
2274 if (symcount == 0)
2275 return 0;
c9727e01 2276
a5259595
AM
2277 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
2278 if (syms == NULL)
2279 return -1;
90e3cdf2 2280
a5259595
AM
2281 if (!relocatable && static_count != 0 && dyn_count != 0)
2282 {
2283 /* Use both symbol tables. */
2284 memcpy (syms, static_syms, static_count * sizeof (*syms));
2285 memcpy (syms + static_count, dyn_syms,
2286 (dyn_count + 1) * sizeof (*syms));
2287 }
2288 else if (!relocatable && static_count == 0)
2289 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
2290 else
2291 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
90e3cdf2 2292
0ccf57bd
AM
2293 /* Trim uninteresting symbols. Interesting symbols are section,
2294 function, and notype symbols. */
2295 for (i = 0, j = 0; i < symcount; ++i)
2296 if ((syms[i]->flags & (BSF_FILE | BSF_OBJECT | BSF_THREAD_LOCAL
2297 | BSF_RELC | BSF_SRELC)) == 0)
2298 syms[j++] = syms[i];
2299 symcount = j;
2300
a5259595
AM
2301 synthetic_relocatable = relocatable;
2302 synthetic_opd = opd;
2303 qsort (syms, symcount, sizeof (*syms), compare_symbols);
90e3cdf2 2304
a5259595
AM
2305 if (!relocatable && symcount > 1)
2306 {
bfa5bd2a
PA
2307 /* Trim duplicate syms, since we may have merged the normal
2308 and dynamic symbols. Actually, we only care about syms
2309 that have different values, so trim any with the same
2310 value. Don't consider ifunc and ifunc resolver symbols
2311 duplicates however, because GDB wants to know whether a
2312 text symbol is an ifunc resolver. */
a5259595 2313 for (i = 1, j = 1; i < symcount; ++i)
bfa5bd2a
PA
2314 {
2315 const asymbol *s0 = syms[i - 1];
2316 const asymbol *s1 = syms[i];
2317
2318 if ((s0->value + s0->section->vma
2319 != s1->value + s1->section->vma)
2320 || ((s0->flags & BSF_GNU_INDIRECT_FUNCTION)
2321 != (s1->flags & BSF_GNU_INDIRECT_FUNCTION)))
2322 syms[j++] = syms[i];
2323 }
a5259595
AM
2324 symcount = j;
2325 }
699733f6 2326
a5259595
AM
2327 i = 0;
2328 /* Note that here and in compare_symbols we can't compare opd and
2329 sym->section directly. With separate debug info files, the
2330 symbols will be extracted from the debug file while abfd passed
2331 to this function is the real binary. */
8bd10d6b
AM
2332 if ((syms[i]->flags & BSF_SECTION_SYM) != 0
2333 && strcmp (syms[i]->section->name, ".opd") == 0)
a5259595
AM
2334 ++i;
2335 codesecsym = i;
2336
2337 for (; i < symcount; ++i)
2338 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC
2339 | SEC_THREAD_LOCAL))
2340 != (SEC_CODE | SEC_ALLOC))
2341 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
2342 break;
2343 codesecsymend = i;
2344
2345 for (; i < symcount; ++i)
2346 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
2347 break;
2348 secsymend = i;
2349
2350 for (; i < symcount; ++i)
2351 if (strcmp (syms[i]->section->name, ".opd") != 0)
2352 break;
2353 opdsymend = i;
2354
2355 for (; i < symcount; ++i)
2cdcc330
AM
2356 if (((syms[i]->section->flags
2357 & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL)))
a5259595
AM
2358 != (SEC_CODE | SEC_ALLOC))
2359 break;
2360 symcount = i;
2361 }
c9727e01 2362 count = 0;
90e3cdf2 2363
699733f6 2364 if (relocatable)
90e3cdf2 2365 {
0a1b45a2 2366 bool (*slurp_relocs) (bfd *, asection *, asymbol **, bool);
699733f6
AM
2367 arelent *r;
2368 size_t size;
0ccf57bd 2369 size_t relcount;
90e3cdf2 2370
468392fb
AM
2371 if (opdsymend == secsymend)
2372 goto done;
2373
699733f6 2374 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
90e3cdf2 2375 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
7356fed5 2376 if (relcount == 0)
c9727e01 2377 goto done;
90e3cdf2 2378
0a1b45a2 2379 if (!(*slurp_relocs) (abfd, opd, static_syms, false))
7356fed5
AM
2380 {
2381 count = -1;
2382 goto done;
2383 }
2384
699733f6 2385 size = 0;
595da8c5 2386 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
699733f6
AM
2387 {
2388 asymbol *sym;
90e3cdf2 2389
595da8c5 2390 while (r < opd->relocation + relcount
699733f6
AM
2391 && r->address < syms[i]->value + opd->vma)
2392 ++r;
90e3cdf2 2393
595da8c5 2394 if (r == opd->relocation + relcount)
699733f6 2395 break;
90e3cdf2 2396
699733f6
AM
2397 if (r->address != syms[i]->value + opd->vma)
2398 continue;
90e3cdf2 2399
699733f6
AM
2400 if (r->howto->type != R_PPC64_ADDR64)
2401 continue;
90e3cdf2 2402
699733f6
AM
2403 sym = *r->sym_ptr_ptr;
2404 if (!sym_exists_at (syms, opdsymend, symcount,
2405 sym->section->id, sym->value + r->addend))
2406 {
2407 ++count;
2408 size += sizeof (asymbol);
2409 size += strlen (syms[i]->name) + 2;
2410 }
2411 }
90e3cdf2 2412
c4b0b099
AM
2413 if (size == 0)
2414 goto done;
699733f6
AM
2415 s = *ret = bfd_malloc (size);
2416 if (s == NULL)
2417 {
7356fed5 2418 count = -1;
c9727e01 2419 goto done;
699733f6 2420 }
90e3cdf2 2421
699733f6 2422 names = (char *) (s + count);
90e3cdf2 2423
595da8c5 2424 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
90e3cdf2 2425 {
699733f6 2426 asymbol *sym;
90e3cdf2 2427
595da8c5 2428 while (r < opd->relocation + relcount
699733f6
AM
2429 && r->address < syms[i]->value + opd->vma)
2430 ++r;
90e3cdf2 2431
595da8c5 2432 if (r == opd->relocation + relcount)
699733f6
AM
2433 break;
2434
2435 if (r->address != syms[i]->value + opd->vma)
2436 continue;
2437
2438 if (r->howto->type != R_PPC64_ADDR64)
2439 continue;
90e3cdf2 2440
699733f6
AM
2441 sym = *r->sym_ptr_ptr;
2442 if (!sym_exists_at (syms, opdsymend, symcount,
2443 sym->section->id, sym->value + r->addend))
2444 {
2445 size_t len;
2446
2447 *s = *syms[i];
6ba2a415 2448 s->flags |= BSF_SYNTHETIC;
699733f6
AM
2449 s->section = sym->section;
2450 s->value = sym->value + r->addend;
2451 s->name = names;
2452 *names++ = '.';
2453 len = strlen (syms[i]->name);
2454 memcpy (names, syms[i]->name, len + 1);
2455 names += len + 1;
6f610d07
UW
2456 /* Have udata.p point back to the original symbol this
2457 synthetic symbol was derived from. */
2458 s->udata.p = syms[i];
699733f6
AM
2459 s++;
2460 }
2461 }
2462 }
2463 else
90e3cdf2 2464 {
0a1b45a2 2465 bool (*slurp_relocs) (bfd *, asection *, asymbol **, bool);
ee67d69a 2466 bfd_byte *contents = NULL;
699733f6 2467 size_t size;
0ccf57bd 2468 size_t plt_count = 0;
468392fb
AM
2469 bfd_vma glink_vma = 0, resolv_vma = 0;
2470 asection *dynamic, *glink = NULL, *relplt = NULL;
2471 arelent *p;
90e3cdf2 2472
81ff113f
AM
2473 if (opd != NULL
2474 && ((opd->flags & SEC_HAS_CONTENTS) == 0
2475 || !bfd_malloc_and_get_section (abfd, opd, &contents)))
699733f6 2476 {
c4b0b099
AM
2477 free_contents_and_exit_err:
2478 count = -1;
ee67d69a 2479 free_contents_and_exit:
c9594989 2480 free (contents);
c9727e01 2481 goto done;
699733f6 2482 }
90e3cdf2 2483
699733f6
AM
2484 size = 0;
2485 for (i = secsymend; i < opdsymend; ++i)
2486 {
2487 bfd_vma ent;
90e3cdf2 2488
5ef11c02
AM
2489 /* Ignore bogus symbols. */
2490 if (syms[i]->value > opd->size - 8)
2491 continue;
2492
699733f6
AM
2493 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2494 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2495 {
2496 ++count;
2497 size += sizeof (asymbol);
2498 size += strlen (syms[i]->name) + 2;
2499 }
2500 }
90e3cdf2 2501
468392fb 2502 /* Get start of .glink stubs from DT_PPC64_GLINK. */
066ee829
AM
2503 if (dyn_count != 0
2504 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
468392fb
AM
2505 {
2506 bfd_byte *dynbuf, *extdyn, *extdynend;
2507 size_t extdynsize;
2508 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
2509
81ff113f
AM
2510 if ((dynamic->flags & SEC_HAS_CONTENTS) == 0
2511 || !bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
c4b0b099 2512 goto free_contents_and_exit_err;
468392fb
AM
2513
2514 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
2515 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
2516
37c59664
AM
2517 for (extdyn = dynbuf, extdynend = dynbuf + dynamic->size;
2518 (size_t) (extdynend - extdyn) >= extdynsize;
2519 extdyn += extdynsize)
468392fb
AM
2520 {
2521 Elf_Internal_Dyn dyn;
2522 (*swap_dyn_in) (abfd, extdyn, &dyn);
2523
2524 if (dyn.d_tag == DT_NULL)
2525 break;
2526
2527 if (dyn.d_tag == DT_PPC64_GLINK)
2528 {
9e390558
AM
2529 /* The first glink stub starts at DT_PPC64_GLINK plus 32.
2530 See comment in ppc64_elf_finish_dynamic_sections. */
2531 glink_vma = dyn.d_un.d_val + 8 * 4;
468392fb
AM
2532 /* The .glink section usually does not survive the final
2533 link; search for the section (usually .text) where the
2534 glink stubs now reside. */
2535 glink = bfd_sections_find_if (abfd, section_covers_vma,
2536 &glink_vma);
2537 break;
2538 }
2539 }
2540
2541 free (dynbuf);
2542 }
2543
2544 if (glink != NULL)
2545 {
2546 /* Determine __glink trampoline by reading the relative branch
2547 from the first glink stub. */
2548 bfd_byte buf[4];
b9e5796b
AM
2549 unsigned int off = 0;
2550
2551 while (bfd_get_section_contents (abfd, glink, buf,
2552 glink_vma + off - glink->vma, 4))
468392fb
AM
2553 {
2554 unsigned int insn = bfd_get_32 (abfd, buf);
2555 insn ^= B_DOT;
2556 if ((insn & ~0x3fffffc) == 0)
b9e5796b 2557 {
2cdcc330
AM
2558 resolv_vma
2559 = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
b9e5796b
AM
2560 break;
2561 }
2562 off += 4;
2563 if (off > 4)
2564 break;
468392fb
AM
2565 }
2566
2567 if (resolv_vma)
2568 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
468392fb 2569
066ee829
AM
2570 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2571 if (relplt != NULL)
2572 {
2573 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
0a1b45a2 2574 if (!(*slurp_relocs) (abfd, relplt, dyn_syms, true))
c4b0b099 2575 goto free_contents_and_exit_err;
68ffbac6 2576
93c6e8c3 2577 plt_count = NUM_SHDR_ENTRIES (&elf_section_data (relplt)->this_hdr);
066ee829 2578 size += plt_count * sizeof (asymbol);
468392fb 2579
066ee829
AM
2580 p = relplt->relocation;
2581 for (i = 0; i < plt_count; i++, p++)
e054468f
AM
2582 {
2583 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
2584 if (p->addend != 0)
2585 size += sizeof ("+0x") - 1 + 16;
2586 }
066ee829 2587 }
468392fb
AM
2588 }
2589
c4b0b099
AM
2590 if (size == 0)
2591 goto free_contents_and_exit;
699733f6
AM
2592 s = *ret = bfd_malloc (size);
2593 if (s == NULL)
c4b0b099 2594 goto free_contents_and_exit_err;
90e3cdf2 2595
468392fb 2596 names = (char *) (s + count + plt_count + (resolv_vma != 0));
90e3cdf2 2597
699733f6 2598 for (i = secsymend; i < opdsymend; ++i)
90e3cdf2 2599 {
699733f6 2600 bfd_vma ent;
90e3cdf2 2601
5ef11c02
AM
2602 if (syms[i]->value > opd->size - 8)
2603 continue;
2604
699733f6
AM
2605 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2606 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
90e3cdf2 2607 {
0ccf57bd 2608 size_t lo, hi;
699733f6 2609 size_t len;
c9727e01 2610 asection *sec = abfd->sections;
90e3cdf2 2611
699733f6
AM
2612 *s = *syms[i];
2613 lo = codesecsym;
2614 hi = codesecsymend;
2615 while (lo < hi)
2616 {
0ccf57bd 2617 size_t mid = (lo + hi) >> 1;
699733f6
AM
2618 if (syms[mid]->section->vma < ent)
2619 lo = mid + 1;
2620 else if (syms[mid]->section->vma > ent)
2621 hi = mid;
2622 else
c9727e01
AM
2623 {
2624 sec = syms[mid]->section;
2625 break;
2626 }
699733f6
AM
2627 }
2628
c9727e01 2629 if (lo >= hi && lo > codesecsym)
699733f6 2630 sec = syms[lo - 1]->section;
699733f6
AM
2631
2632 for (; sec != NULL; sec = sec->next)
2633 {
2634 if (sec->vma > ent)
2635 break;
63524580
JK
2636 /* SEC_LOAD may not be set if SEC is from a separate debug
2637 info file. */
2638 if ((sec->flags & SEC_ALLOC) == 0)
699733f6
AM
2639 break;
2640 if ((sec->flags & SEC_CODE) != 0)
2641 s->section = sec;
2642 }
6ba2a415 2643 s->flags |= BSF_SYNTHETIC;
699733f6
AM
2644 s->value = ent - s->section->vma;
2645 s->name = names;
2646 *names++ = '.';
2647 len = strlen (syms[i]->name);
2648 memcpy (names, syms[i]->name, len + 1);
2649 names += len + 1;
6f610d07
UW
2650 /* Have udata.p point back to the original symbol this
2651 synthetic symbol was derived from. */
2652 s->udata.p = syms[i];
699733f6 2653 s++;
90e3cdf2 2654 }
90e3cdf2 2655 }
699733f6 2656 free (contents);
468392fb
AM
2657
2658 if (glink != NULL && relplt != NULL)
2659 {
2660 if (resolv_vma)
2661 {
2662 /* Add a symbol for the main glink trampoline. */
86a4952b 2663 memset (s, 0, sizeof *s);
468392fb 2664 s->the_bfd = abfd;
6ba2a415 2665 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
468392fb
AM
2666 s->section = glink;
2667 s->value = resolv_vma - glink->vma;
2668 s->name = names;
2cdcc330
AM
2669 memcpy (names, "__glink_PLTresolve",
2670 sizeof ("__glink_PLTresolve"));
468392fb
AM
2671 names += sizeof ("__glink_PLTresolve");
2672 s++;
2673 count++;
2674 }
2675
2676 /* FIXME: It would be very much nicer to put sym@plt on the
2677 stub rather than on the glink branch table entry. The
2678 objdump disassembler would then use a sensible symbol
2679 name on plt calls. The difficulty in doing so is
2680 a) finding the stubs, and,
2681 b) matching stubs against plt entries, and,
2682 c) there can be multiple stubs for a given plt entry.
2683
2684 Solving (a) could be done by code scanning, but older
2685 ppc64 binaries used different stubs to current code.
2686 (b) is the tricky one since you need to known the toc
2687 pointer for at least one function that uses a pic stub to
2688 be able to calculate the plt address referenced.
2689 (c) means gdb would need to set multiple breakpoints (or
2690 find the glink branch itself) when setting breakpoints
2691 for pending shared library loads. */
2692 p = relplt->relocation;
2693 for (i = 0; i < plt_count; i++, p++)
2694 {
2695 size_t len;
2696
2697 *s = **p->sym_ptr_ptr;
2698 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
2699 we are defining a symbol, ensure one of them is set. */
2700 if ((s->flags & BSF_LOCAL) == 0)
2701 s->flags |= BSF_GLOBAL;
6ba2a415 2702 s->flags |= BSF_SYNTHETIC;
468392fb
AM
2703 s->section = glink;
2704 s->value = glink_vma - glink->vma;
2705 s->name = names;
2706 s->udata.p = NULL;
2707 len = strlen ((*p->sym_ptr_ptr)->name);
2708 memcpy (names, (*p->sym_ptr_ptr)->name, len);
2709 names += len;
e054468f
AM
2710 if (p->addend != 0)
2711 {
2712 memcpy (names, "+0x", sizeof ("+0x") - 1);
2713 names += sizeof ("+0x") - 1;
2714 bfd_sprintf_vma (abfd, names, p->addend);
2715 names += strlen (names);
2716 }
468392fb
AM
2717 memcpy (names, "@plt", sizeof ("@plt"));
2718 names += sizeof ("@plt");
2719 s++;
b9e5796b
AM
2720 if (abi < 2)
2721 {
2722 glink_vma += 8;
2723 if (i >= 0x8000)
2724 glink_vma += 4;
2725 }
2726 else
468392fb
AM
2727 glink_vma += 4;
2728 }
2729 count += plt_count;
2730 }
90e3cdf2
JJ
2731 }
2732
c9727e01 2733 done:
a7535cf3 2734 free (syms);
90e3cdf2
JJ
2735 return count;
2736}
5bd4f169 2737\f
65f38f15
AM
2738/* The following functions are specific to the ELF linker, while
2739 functions above are used generally. Those named ppc64_elf_* are
2740 called by the main ELF linker code. They appear in this file more
2741 or less in the order in which they are called. eg.
2742 ppc64_elf_check_relocs is called early in the link process,
2743 ppc64_elf_finish_dynamic_sections is one of the last functions
e86ce104
AM
2744 called.
2745
2746 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
2747 functions have both a function code symbol and a function descriptor
2748 symbol. A call to foo in a relocatable object file looks like:
2749
2750 . .text
2751 . x:
2752 . bl .foo
2753 . nop
2754
2755 The function definition in another object file might be:
2756
2757 . .section .opd
2758 . foo: .quad .foo
2759 . .quad .TOC.@tocbase
2760 . .quad 0
2761 .
2762 . .text
2763 . .foo: blr
2764
2765 When the linker resolves the call during a static link, the branch
2766 unsurprisingly just goes to .foo and the .opd information is unused.
2767 If the function definition is in a shared library, things are a little
2768 different: The call goes via a plt call stub, the opd information gets
2769 copied to the plt, and the linker patches the nop.
2770
2771 . x:
2772 . bl .foo_stub
2773 . ld 2,40(1)
2774 .
2775 .
2776 . .foo_stub:
71a39c98
AM
2777 . std 2,40(1) # in practice, the call stub
2778 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
2779 . addi 11,11,Lfoo@toc@l # this is the general idea
2780 . ld 12,0(11)
2781 . ld 2,8(11)
2782 . mtctr 12
2783 . ld 11,16(11)
e86ce104
AM
2784 . bctr
2785 .
2786 . .section .plt
2787 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
2788
2789 The "reloc ()" notation is supposed to indicate that the linker emits
2790 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
2791 copying.
2792
2793 What are the difficulties here? Well, firstly, the relocations
2794 examined by the linker in check_relocs are against the function code
2795 sym .foo, while the dynamic relocation in the plt is emitted against
2796 the function descriptor symbol, foo. Somewhere along the line, we need
2797 to carefully copy dynamic link information from one symbol to the other.
2798 Secondly, the generic part of the elf linker will make .foo a dynamic
2799 symbol as is normal for most other backends. We need foo dynamic
2800 instead, at least for an application final link. However, when
2801 creating a shared library containing foo, we need to have both symbols
2802 dynamic so that references to .foo are satisfied during the early
2803 stages of linking. Otherwise the linker might decide to pull in a
8387904d
AM
2804 definition from some other object, eg. a static library.
2805
2806 Update: As of August 2004, we support a new convention. Function
2807 calls may use the function descriptor symbol, ie. "bl foo". This
2808 behaves exactly as "bl .foo". */
65f38f15 2809
7c8bbca5
AM
2810/* Of those relocs that might be copied as dynamic relocs, this
2811 function selects those that must be copied when linking a shared
2812 library or PIE, even when the symbol is local. */
65f38f15 2813
1d483afe
AM
2814static int
2815must_be_dyn_reloc (struct bfd_link_info *info,
2816 enum elf_ppc64_reloc_type r_type)
2817{
2818 switch (r_type)
2819 {
2820 default:
7c8bbca5
AM
2821 /* Only relative relocs can be resolved when the object load
2822 address isn't fixed. DTPREL64 is excluded because the
2823 dynamic linker needs to differentiate global dynamic from
2824 local dynamic __tls_index pairs when PPC64_OPT_TLS is set. */
1d483afe
AM
2825 return 1;
2826
2827 case R_PPC64_REL32:
2828 case R_PPC64_REL64:
2829 case R_PPC64_REL30:
1bdd8fac
AM
2830 case R_PPC64_TOC16:
2831 case R_PPC64_TOC16_DS:
2832 case R_PPC64_TOC16_LO:
2833 case R_PPC64_TOC16_HI:
2834 case R_PPC64_TOC16_HA:
2835 case R_PPC64_TOC16_LO_DS:
1d483afe
AM
2836 return 0;
2837
2838 case R_PPC64_TPREL16:
2839 case R_PPC64_TPREL16_LO:
2840 case R_PPC64_TPREL16_HI:
2841 case R_PPC64_TPREL16_HA:
2842 case R_PPC64_TPREL16_DS:
2843 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
2844 case R_PPC64_TPREL16_HIGH:
2845 case R_PPC64_TPREL16_HIGHA:
1d483afe
AM
2846 case R_PPC64_TPREL16_HIGHER:
2847 case R_PPC64_TPREL16_HIGHERA:
2848 case R_PPC64_TPREL16_HIGHEST:
2849 case R_PPC64_TPREL16_HIGHESTA:
2850 case R_PPC64_TPREL64:
c213164a 2851 case R_PPC64_TPREL34:
7c8bbca5
AM
2852 /* These relocations are relative but in a shared library the
2853 linker doesn't know the thread pointer base. */
2854 return bfd_link_dll (info);
1d483afe
AM
2855 }
2856}
65f38f15 2857
f4656909 2858/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
e1c6cf61 2859 copying dynamic variables from a shared lib into an app's .dynbss
f4656909 2860 section, and instead use a dynamic relocation to point into the
e1c6cf61
AM
2861 shared lib. With code that gcc generates it is vital that this be
2862 enabled; In the PowerPC64 ELFv1 ABI the address of a function is
2863 actually the address of a function descriptor which resides in the
2864 .opd section. gcc uses the descriptor directly rather than going
2865 via the GOT as some other ABIs do, which means that initialized
2866 function pointers reference the descriptor. Thus, a function
2867 pointer initialized to the address of a function in a shared
2868 library will either require a .dynbss copy and a copy reloc, or a
2869 dynamic reloc. Using a .dynbss copy redefines the function
2870 descriptor symbol to point to the copy. This presents a problem as
2871 a PLT entry for that function is also initialized from the function
2872 descriptor symbol and the copy may not be initialized first. */
a23b6845 2873#define ELIMINATE_COPY_RELOCS 1
f4656909 2874
721956f4 2875/* Section name for stubs is the associated section name plus this
29942be8
NC
2876 string. */
2877#define STUB_SUFFIX ".stub"
721956f4
AM
2878
2879/* Linker stubs.
2880 ppc_stub_long_branch:
2881 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
2882 destination, but a 24 bit branch in a stub section will reach.
2883 . b dest
2884
2885 ppc_stub_plt_branch:
2886 Similar to the above, but a 24 bit branch in the stub section won't
2887 reach its destination.
6df4c9c2
AM
2888 . addis %r12,%r2,xxx@toc@ha
2889 . ld %r12,xxx@toc@l(%r12)
71a39c98 2890 . mtctr %r12
721956f4
AM
2891 . bctr
2892
2893 ppc_stub_plt_call:
2c66dc6c
AM
2894 Used to call a function in a shared library. If it so happens that
2895 the plt entry referenced crosses a 64k boundary, then an extra
71a39c98 2896 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
7aba54da 2897 An r2save variant starts with "std %r2,40(%r1)".
71a39c98
AM
2898 . addis %r11,%r2,xxx@toc@ha
2899 . ld %r12,xxx+0@toc@l(%r11)
2900 . mtctr %r12
2901 . ld %r2,xxx+8@toc@l(%r11)
2902 . ld %r11,xxx+16@toc@l(%r11)
721956f4 2903 . bctr
ad8e1ba5
AM
2904
2905 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
2906 code to adjust the value and save r2 to support multiple toc sections.
2907 A ppc_stub_long_branch with an r2 offset looks like:
2908 . std %r2,40(%r1)
2909 . addis %r2,%r2,off@ha
2910 . addi %r2,%r2,off@l
2911 . b dest
2912
2913 A ppc_stub_plt_branch with an r2 offset looks like:
2914 . std %r2,40(%r1)
6df4c9c2
AM
2915 . addis %r12,%r2,xxx@toc@ha
2916 . ld %r12,xxx@toc@l(%r12)
ad8e1ba5
AM
2917 . addis %r2,%r2,off@ha
2918 . addi %r2,%r2,off@l
71a39c98 2919 . mtctr %r12
ad8e1ba5 2920 . bctr
ac2df442 2921
05d0e962
AM
2922 All of the above stubs are shown as their ELFv1 variants. ELFv2
2923 variants exist too, simpler for plt calls since a new toc pointer
2924 and static chain are not loaded by the stub. In addition, ELFv2
2925 has some more complex stubs to handle calls marked with NOTOC
7aba54da
AM
2926 relocs from functions where r2 is not a valid toc pointer.
2927 ppc_stub_long_branch_p9notoc:
05d0e962
AM
2928 . mflr %r12
2929 . bcl 20,31,1f
2930 . 1:
2931 . mflr %r11
2932 . mtlr %r12
2cdcc330
AM
2933 . addis %r12,%r11,dest-1b@ha
2934 . addi %r12,%r12,dest-1b@l
05d0e962
AM
2935 . b dest
2936
7aba54da 2937 ppc_stub_plt_branch_p9notoc:
05d0e962
AM
2938 . mflr %r12
2939 . bcl 20,31,1f
2940 . 1:
2941 . mflr %r11
2942 . mtlr %r12
2943 . lis %r12,xxx-1b@highest
f891966f 2944 . ori %r12,%r12,xxx-1b@higher
05d0e962 2945 . sldi %r12,%r12,32
f891966f 2946 . oris %r12,%r12,xxx-1b@high
05d0e962
AM
2947 . ori %r12,%r12,xxx-1b@l
2948 . add %r12,%r11,%r12
2949 . mtctr %r12
2950 . bctr
2951
7aba54da 2952 ppc_stub_plt_call_p9notoc:
05d0e962
AM
2953 . mflr %r12
2954 . bcl 20,31,1f
2955 . 1:
2956 . mflr %r11
2957 . mtlr %r12
2958 . lis %r12,xxx-1b@highest
f891966f 2959 . ori %r12,%r12,xxx-1b@higher
05d0e962 2960 . sldi %r12,%r12,32
f891966f 2961 . oris %r12,%r12,xxx-1b@high
05d0e962
AM
2962 . ori %r12,%r12,xxx-1b@l
2963 . ldx %r12,%r11,%r12
2964 . mtctr %r12
2965 . bctr
2966
7c1f4227 2967 There are also ELFv1 power10 variants of these stubs.
04bdff6a 2968 ppc_stub_long_branch_notoc:
d4b87b1e 2969 . pla %r12,dest@pcrel
04bdff6a
AM
2970 . b dest
2971 ppc_stub_plt_branch_notoc:
2972 . lis %r11,(dest-1f)@highesta34
2973 . ori %r11,%r11,(dest-1f)@highera34
2974 . sldi %r11,%r11,34
d4b87b1e 2975 . 1: pla %r12,dest@pcrel
04bdff6a
AM
2976 . add %r12,%r11,%r12
2977 . mtctr %r12
2978 . bctr
2979 ppc_stub_plt_call_notoc:
2980 . lis %r11,(xxx-1f)@highesta34
2981 . ori %r11,%r11,(xxx-1f)@highera34
2982 . sldi %r11,%r11,34
d4b87b1e 2983 . 1: pla %r12,xxx@pcrel
04bdff6a
AM
2984 . ldx %r12,%r11,%r12
2985 . mtctr %r12
2986 . bctr
2987
05d0e962
AM
2988 In cases where the high instructions would add zero, they are
2989 omitted and following instructions modified in some cases.
7c1f4227 2990 For example, a power10 ppc_stub_plt_call_notoc might simplify down
04bdff6a
AM
2991 to
2992 . pld %r12,xxx@pcrel
2993 . mtctr %r12
2994 . bctr
05d0e962 2995
7aba54da 2996 Stub variants may be merged. For example, if printf is called from
05d0e962
AM
2997 code with the tocsave optimization (ie. r2 saved in function
2998 prologue) and therefore calls use a ppc_stub_plt_call linkage stub,
2999 and from other code without the tocsave optimization requiring a
3000 ppc_stub_plt_call_r2save linkage stub, a single stub of the latter
3001 type will be created. Calls with the tocsave optimization will
3002 enter this stub after the instruction saving r2. A similar
3003 situation exists when calls are marked with R_PPC64_REL24_NOTOC
3004 relocations. These require a ppc_stub_plt_call_notoc linkage stub
3005 to call an external function like printf. If other calls to printf
3006 require a ppc_stub_plt_call linkage stub then a single
7aba54da
AM
3007 ppc_stub_plt_call_notoc linkage stub may be used for both types of
3008 call. */
3009
3010enum ppc_stub_main_type
2cdcc330 3011{
721956f4
AM
3012 ppc_stub_none,
3013 ppc_stub_long_branch,
3014 ppc_stub_plt_branch,
794e51c0 3015 ppc_stub_plt_call,
a4b6fadd
AM
3016 ppc_stub_global_entry,
3017 ppc_stub_save_res
721956f4
AM
3018};
3019
7aba54da
AM
3020/* ppc_stub_long_branch, ppc_stub_plt_branch and ppc_stub_plt_call have
3021 these variations. */
3022
3023enum ppc_stub_sub_type
3024{
3025 ppc_stub_toc,
3026 ppc_stub_notoc,
3027 ppc_stub_p9notoc
3028};
3029
3030struct ppc_stub_type
3031{
3032 ENUM_BITFIELD (ppc_stub_main_type) main : 3;
3033 ENUM_BITFIELD (ppc_stub_sub_type) sub : 2;
3034 unsigned int r2save : 1;
3035};
3036
6f20ed8a
AM
3037/* Information on stub grouping. */
3038struct map_stub
3039{
3040 /* The stub section. */
3041 asection *stub_sec;
3042 /* This is the section to which stubs in the group will be attached. */
3043 asection *link_sec;
a4b6fadd
AM
3044 /* Next group. */
3045 struct map_stub *next;
3046 /* Whether to emit a copy of register save/restore functions in this
3047 group. */
3048 int needs_save_res;
df136d64
AM
3049 /* Current offset within stubs after the insn restoring lr in a
3050 _notoc or _both stub using bcl for pc-relative addressing, or
3051 after the insn restoring lr in a __tls_get_addr_opt plt stub. */
3052 unsigned int lr_restore;
3053 /* Accumulated size of EH info emitted to describe return address
3054 if stubs modify lr. Does not include 17 byte FDE header. */
3055 unsigned int eh_size;
3056 /* Offset in glink_eh_frame to the start of EH info for this group. */
3057 unsigned int eh_base;
6f20ed8a
AM
3058};
3059
2cdcc330
AM
3060struct ppc_stub_hash_entry
3061{
721956f4
AM
3062 /* Base hash table entry structure. */
3063 struct bfd_hash_entry root;
3064
7aba54da 3065 struct ppc_stub_type type;
ad8e1ba5 3066
6f20ed8a
AM
3067 /* Group information. */
3068 struct map_stub *group;
721956f4
AM
3069
3070 /* Offset within stub_sec of the beginning of this stub. */
3071 bfd_vma stub_offset;
3072
3073 /* Given the symbol's value and its section we can determine its final
3074 value when building the stubs (so the stub knows where to jump. */
3075 bfd_vma target_value;
3076 asection *target_section;
3077
721956f4
AM
3078 /* The symbol table entry, if any, that this was derived from. */
3079 struct ppc_link_hash_entry *h;
e054468f 3080 struct plt_entry *plt_ent;
721956f4 3081
2d7ad24e
AM
3082 /* Symbol type. */
3083 unsigned char symtype;
3084
6911b7dc
AM
3085 /* Symbol st_other. */
3086 unsigned char other;
ecc741e6
AM
3087
3088 /* Debug: Track hash table traversal. */
3089 unsigned int id;
721956f4
AM
3090};
3091
2cdcc330
AM
3092struct ppc_branch_hash_entry
3093{
721956f4
AM
3094 /* Base hash table entry structure. */
3095 struct bfd_hash_entry root;
3096
c456f082 3097 /* Offset within branch lookup table. */
721956f4
AM
3098 unsigned int offset;
3099
3100 /* Generation marker. */
3101 unsigned int iter;
3102};
65f38f15 3103
1657026c 3104/* Used to track dynamic relocations. */
19e08130
AM
3105struct ppc_dyn_relocs
3106{
3107 struct ppc_dyn_relocs *next;
3108
3109 /* The input section of the reloc. */
3110 asection *sec;
3111
3112 /* Total number of relocs copied for the input section. */
1657026c
AM
3113 unsigned int count;
3114
3115 /* Number of pc-relative relocs copied for the input section. */
3116 unsigned int pc_count;
3117
3118 /* Number of relocs that might become R_PPC64_RELATIVE. */
3119 unsigned int rel_count;
3120};
3121
3122struct ppc_local_dyn_relocs
3123{
3124 struct ppc_local_dyn_relocs *next;
3125
3126 /* The input section of the reloc. */
3127 asection *sec;
3128
3129 /* Total number of relocs copied for the input section. */
3130 unsigned int count;
3131
3132 /* Number of relocs that might become R_PPC64_RELATIVE. */
3133 unsigned int rel_count : 31;
19e08130
AM
3134
3135 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3136 unsigned int ifunc : 1;
3137};
3138
65f38f15
AM
3139struct ppc_link_hash_entry
3140{
3141 struct elf_link_hash_entry elf;
3142
2cdcc330
AM
3143 union
3144 {
b3fac117
AM
3145 /* A pointer to the most recently used stub hash entry against this
3146 symbol. */
3147 struct ppc_stub_hash_entry *stub_cache;
3148
3149 /* A pointer to the next symbol starting with a '.' */
3150 struct ppc_link_hash_entry *next_dot_sym;
3151 } u;
721956f4 3152
721956f4 3153 /* Link between function code and descriptor symbols. */
34814b9f 3154 struct ppc_link_hash_entry *oh;
721956f4 3155
e86ce104
AM
3156 /* Flag function code and descriptor symbols. */
3157 unsigned int is_func:1;
3158 unsigned int is_func_descriptor:1;
908b32fc 3159 unsigned int fake:1;
411e1bfb 3160
c5614fa4
AM
3161 /* Whether global opd/toc sym has been adjusted or not.
3162 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3163 should be set for all globals defined in any opd/toc section. */
754021d0
AM
3164 unsigned int adjust_done:1;
3165
a4b6fadd
AM
3166 /* Set if this is an out-of-line register save/restore function,
3167 with non-standard calling convention. */
3168 unsigned int save_res:1;
3169
8b5f1ed8
AM
3170 /* Set if a duplicate symbol with non-zero localentry is detected,
3171 even when the duplicate symbol does not provide a definition. */
3172 unsigned int non_zero_localentry:1;
3173
411e1bfb 3174 /* Contexts in which symbol is used in the GOT (or TOC).
37da22e5
AM
3175 Bits are or'd into the mask as the corresponding relocs are
3176 encountered during check_relocs, with TLS_TLS being set when any
3177 of the other TLS bits are set. tls_optimize clears bits when
3178 optimizing to indicate the corresponding GOT entry type is not
3179 needed. If set, TLS_TLS is never cleared. tls_optimize may also
b00a0a86 3180 set TLS_GDIE when a GD reloc turns into an IE one.
37da22e5
AM
3181 These flags are also kept for local symbols. */
3182#define TLS_TLS 1 /* Any TLS reloc. */
3183#define TLS_GD 2 /* GD reloc. */
3184#define TLS_LD 4 /* LD reloc. */
3185#define TLS_TPREL 8 /* TPREL reloc, => IE. */
3186#define TLS_DTPREL 16 /* DTPREL reloc, => LD. */
3187#define TLS_MARK 32 /* __tls_get_addr call marked. */
b00a0a86 3188#define TLS_GDIE 64 /* GOT TPREL reloc resulting from GD->IE. */
46e9995a 3189#define TLS_EXPLICIT 256 /* TOC section TLS reloc, not stored. */
f961d9dd 3190 unsigned char tls_mask;
37da22e5
AM
3191
3192 /* The above field is also used to mark function symbols. In which
3193 case TLS_TLS will be 0. */
3194#define PLT_IFUNC 2 /* STT_GNU_IFUNC. */
2d7ad24e 3195#define PLT_KEEP 4 /* inline plt call requires plt entry. */
37da22e5 3196#define NON_GOT 256 /* local symbol plt, not stored. */
65f38f15
AM
3197};
3198
ed7007c1
AM
3199static inline struct ppc_link_hash_entry *
3200ppc_elf_hash_entry (struct elf_link_hash_entry *ent)
3201{
3202 return (struct ppc_link_hash_entry *) ent;
3203}
3204
30845f11
AM
3205static inline struct elf_link_hash_entry *
3206elf_hash_entry (struct ppc_link_hash_entry *ent)
3207{
3208 return (struct elf_link_hash_entry *) ent;
3209}
3210
65f38f15
AM
3211/* ppc64 ELF linker hash table. */
3212
3213struct ppc_link_hash_table
3214{
3215 struct elf_link_hash_table elf;
3216
721956f4
AM
3217 /* The stub hash table. */
3218 struct bfd_hash_table stub_hash_table;
3219
3220 /* Another hash table for plt_branch stubs. */
3221 struct bfd_hash_table branch_hash_table;
3222
3b421ab3
AM
3223 /* Hash table for function prologue tocsave. */
3224 htab_t tocsave_htab;
3225
e7d1c40c
AM
3226 /* Various options and other info passed from the linker. */
3227 struct ppc64_elf_params *params;
721956f4 3228
6f20ed8a
AM
3229 /* The size of sec_info below. */
3230 unsigned int sec_info_arr_size;
3231
3232 /* Per-section array of extra section info. Done this way rather
3233 than as part of ppc64_elf_section_data so we have the info for
3234 non-ppc64 sections. */
3235 struct
3236 {
3237 /* Along with elf_gp, specifies the TOC pointer used by this section. */
ad8e1ba5 3238 bfd_vma toc_off;
6f20ed8a
AM
3239
3240 union
3241 {
3242 /* The section group that this section belongs to. */
3243 struct map_stub *group;
3244 /* A temp section list pointer. */
3245 asection *list;
3246 } u;
3247 } *sec_info;
721956f4 3248
a4b6fadd
AM
3249 /* Linked list of groups. */
3250 struct map_stub *group;
3251
ad8e1ba5
AM
3252 /* Temp used when calculating TOC pointers. */
3253 bfd_vma toc_curr;
bf102f86
AM
3254 bfd *toc_bfd;
3255 asection *toc_first_sec;
ad8e1ba5 3256
b3fac117
AM
3257 /* Used when adding symbols. */
3258 struct ppc_link_hash_entry *dot_syms;
3259
33e44f2e 3260 /* Shortcuts to get to dynamic linker sections. */
4ce794b7 3261 asection *glink;
9e390558 3262 asection *global_entry;
82bd7b59 3263 asection *sfpr;
2d7ad24e
AM
3264 asection *pltlocal;
3265 asection *relpltlocal;
4ce794b7
AM
3266 asection *brlt;
3267 asection *relbrlt;
58d180e8 3268 asection *glink_eh_frame;
ec338859 3269
8387904d
AM
3270 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3271 struct ppc_link_hash_entry *tls_get_addr;
3272 struct ppc_link_hash_entry *tls_get_addr_fd;
9e7028aa
AM
3273 struct ppc_link_hash_entry *tga_desc;
3274 struct ppc_link_hash_entry *tga_desc_fd;
a804e476 3275 struct map_stub *tga_group;
411e1bfb 3276
927be08e
AM
3277 /* The size of reliplt used by got entry relocs. */
3278 bfd_size_type got_reli_size;
3279
0aac2413 3280 /* DT_RELR array of section/r_offset. */
1657026c
AM
3281 size_t relr_alloc;
3282 size_t relr_count;
0aac2413
AM
3283 struct
3284 {
3285 asection *sec;
3286 bfd_vma off;
3287 } *relr;
1657026c 3288
9b5ecbd0 3289 /* Statistics. */
7aba54da 3290 unsigned long stub_count[ppc_stub_save_res];
9b5ecbd0 3291
ee75fd95
AM
3292 /* Number of stubs against global syms. */
3293 unsigned long stub_globals;
3294
ee67d69a
AM
3295 /* Set if we're linking code with function descriptors. */
3296 unsigned int opd_abi:1;
3297
4c52953f 3298 /* Support for multiple toc sections. */
33c0ec9d 3299 unsigned int do_multi_toc:1;
4c52953f 3300 unsigned int multi_toc_needed:1;
927be08e 3301 unsigned int second_toc_pass:1;
67f0cbdb 3302 unsigned int do_toc_opt:1;
4c52953f 3303
9a23f96e
AM
3304 /* Set if tls optimization is enabled. */
3305 unsigned int do_tls_opt:1;
3306
3e04d765
AM
3307 /* Set if inline plt calls should be converted to direct calls. */
3308 unsigned int can_convert_all_inline_plt:1;
3309
0441f94f
AM
3310 /* Set if a stub_offset changed. */
3311 unsigned int stub_changed:1;
3312
5d1634d7 3313 /* Set on error. */
99877b66 3314 unsigned int stub_error:1;
721956f4 3315
8c5b4e52
AM
3316 /* Whether func_desc_adjust needs to be run over symbols. */
3317 unsigned int need_func_desc_adj:1;
721956f4 3318
f378ab09
AM
3319 /* Whether plt calls for ELFv2 localentry:0 funcs have been optimized. */
3320 unsigned int has_plt_localentry0:1;
3321
5663e321
AM
3322 /* Whether calls are made via the PLT from NOTOC functions. */
3323 unsigned int notoc_plt:1;
3324
e10a07b3
AM
3325 /* Whether any code linked seems to be Power10. */
3326 unsigned int has_power10_relocs:1;
3327
ecc741e6
AM
3328 /* Incremented once for each stub sized. */
3329 unsigned int stub_id;
3330
721956f4
AM
3331 /* Incremented every time we size stubs. */
3332 unsigned int stub_iteration;
0441f94f
AM
3333
3334/* After 20 iterations of stub sizing we no longer allow stubs to
3335 shrink. This is to break out of a pathological case where adding
3336 stubs or increasing their size on one iteration decreases section
3337 gaps (perhaps due to alignment), which then results in smaller
3338 stubs on the next iteration. */
3339#define STUB_SHRINK_ITER 20
65f38f15
AM
3340};
3341
4c52953f
AM
3342/* Rename some of the generic section flags to better document how they
3343 are used here. */
b0dddeec
AM
3344
3345/* Nonzero if this section has TLS related relocations. */
3346#define has_tls_reloc sec_flg0
3347
9737e8af
AM
3348/* Nonzero if this section has a call to __tls_get_addr lacking marker
3349 relocations. */
3350#define nomark_tls_get_addr sec_flg1
b0dddeec
AM
3351
3352/* Nonzero if this section has any toc or got relocs. */
3353#define has_toc_reloc sec_flg2
3354
3355/* Nonzero if this section has a call to another section that uses
3356 the toc or got. */
d77c8a4b 3357#define makes_toc_func_call sec_flg3
b0dddeec
AM
3358
3359/* Recursion protection when determining above flag. */
d77c8a4b 3360#define call_check_in_progress sec_flg4
70cc837d 3361#define call_check_done sec_flg5
4c52953f 3362
65f38f15
AM
3363/* Get the ppc64 ELF linker hash table from a link_info structure. */
3364
3365#define ppc_hash_table(p) \
573eb292
AM
3366 ((is_elf_hash_table ((p)->hash) \
3367 && elf_hash_table_id (elf_hash_table (p)) == PPC64_ELF_DATA) \
3368 ? (struct ppc_link_hash_table *) (p)->hash : NULL)
65f38f15 3369
721956f4
AM
3370#define ppc_stub_hash_lookup(table, string, create, copy) \
3371 ((struct ppc_stub_hash_entry *) \
3372 bfd_hash_lookup ((table), (string), (create), (copy)))
3373
3374#define ppc_branch_hash_lookup(table, string, create, copy) \
3375 ((struct ppc_branch_hash_entry *) \
3376 bfd_hash_lookup ((table), (string), (create), (copy)))
3377
3378/* Create an entry in the stub hash table. */
3379
3380static struct bfd_hash_entry *
4ce794b7
AM
3381stub_hash_newfunc (struct bfd_hash_entry *entry,
3382 struct bfd_hash_table *table,
3383 const char *string)
721956f4
AM
3384{
3385 /* Allocate the structure if it has not already been allocated by a
3386 subclass. */
3387 if (entry == NULL)
3388 {
3389 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3390 if (entry == NULL)
3391 return entry;
3392 }
3393
3394 /* Call the allocation method of the superclass. */
3395 entry = bfd_hash_newfunc (entry, table, string);
3396 if (entry != NULL)
3397 {
3398 struct ppc_stub_hash_entry *eh;
3399
3400 /* Initialize the local fields. */
3401 eh = (struct ppc_stub_hash_entry *) entry;
7aba54da
AM
3402 eh->type.main = ppc_stub_none;
3403 eh->type.sub = ppc_stub_toc;
3404 eh->type.r2save = 0;
6f20ed8a 3405 eh->group = NULL;
721956f4
AM
3406 eh->stub_offset = 0;
3407 eh->target_value = 0;
3408 eh->target_section = NULL;
721956f4 3409 eh->h = NULL;
6911b7dc 3410 eh->plt_ent = NULL;
ecc741e6 3411 eh->symtype = 0;
6911b7dc 3412 eh->other = 0;
ecc741e6 3413 eh->id = 0;
721956f4
AM
3414 }
3415
3416 return entry;
3417}
3418
3419/* Create an entry in the branch hash table. */
3420
3421static struct bfd_hash_entry *
4ce794b7
AM
3422branch_hash_newfunc (struct bfd_hash_entry *entry,
3423 struct bfd_hash_table *table,
3424 const char *string)
721956f4
AM
3425{
3426 /* Allocate the structure if it has not already been allocated by a
3427 subclass. */
3428 if (entry == NULL)
3429 {
3430 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3431 if (entry == NULL)
3432 return entry;
3433 }
3434
3435 /* Call the allocation method of the superclass. */
3436 entry = bfd_hash_newfunc (entry, table, string);
3437 if (entry != NULL)
3438 {
3439 struct ppc_branch_hash_entry *eh;
3440
3441 /* Initialize the local fields. */
3442 eh = (struct ppc_branch_hash_entry *) entry;
3443 eh->offset = 0;
3444 eh->iter = 0;
3445 }
3446
3447 return entry;
3448}
3449
65f38f15
AM
3450/* Create an entry in a ppc64 ELF linker hash table. */
3451
3452static struct bfd_hash_entry *
4ce794b7
AM
3453link_hash_newfunc (struct bfd_hash_entry *entry,
3454 struct bfd_hash_table *table,
3455 const char *string)
65f38f15
AM
3456{
3457 /* Allocate the structure if it has not already been allocated by a
3458 subclass. */
3459 if (entry == NULL)
3460 {
3461 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3462 if (entry == NULL)
3463 return entry;
3464 }
3465
3466 /* Call the allocation method of the superclass. */
3467 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3468 if (entry != NULL)
3469 {
3470 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3471
b3fac117 3472 memset (&eh->u.stub_cache, 0,
908b32fc 3473 (sizeof (struct ppc_link_hash_entry)
b3fac117
AM
3474 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
3475
3476 /* When making function calls, old ABI code references function entry
3477 points (dot symbols), while new ABI code references the function
3478 descriptor symbol. We need to make any combination of reference and
3479 definition work together, without breaking archive linking.
3480
3481 For a defined function "foo" and an undefined call to "bar":
3482 An old object defines "foo" and ".foo", references ".bar" (possibly
3483 "bar" too).
3484 A new object defines "foo" and references "bar".
3485
3486 A new object thus has no problem with its undefined symbols being
3487 satisfied by definitions in an old object. On the other hand, the
3488 old object won't have ".bar" satisfied by a new object.
3489
3490 Keep a list of newly added dot-symbols. */
3491
3492 if (string[0] == '.')
3493 {
3494 struct ppc_link_hash_table *htab;
3495
3496 htab = (struct ppc_link_hash_table *) table;
3497 eh->u.next_dot_sym = htab->dot_syms;
3498 htab->dot_syms = eh;
3499 }
65f38f15
AM
3500 }
3501
3502 return entry;
3503}
3504
2cdcc330
AM
3505struct tocsave_entry
3506{
3b421ab3
AM
3507 asection *sec;
3508 bfd_vma offset;
3509};
3510
3511static hashval_t
3512tocsave_htab_hash (const void *p)
3513{
3514 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4aef7643 3515 return ((bfd_vma) (intptr_t) e->sec ^ e->offset) >> 3;
3b421ab3
AM
3516}
3517
3518static int
3519tocsave_htab_eq (const void *p1, const void *p2)
3520{
3521 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
3522 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
3523 return e1->sec == e2->sec && e1->offset == e2->offset;
3524}
3525
68faa637
AM
3526/* Destroy a ppc64 ELF linker hash table. */
3527
3528static void
d495ab0d 3529ppc64_elf_link_hash_table_free (bfd *obfd)
68faa637 3530{
d495ab0d 3531 struct ppc_link_hash_table *htab;
68faa637 3532
d495ab0d 3533 htab = (struct ppc_link_hash_table *) obfd->link.hash;
68faa637
AM
3534 if (htab->tocsave_htab)
3535 htab_delete (htab->tocsave_htab);
d495ab0d
AM
3536 bfd_hash_table_free (&htab->branch_hash_table);
3537 bfd_hash_table_free (&htab->stub_hash_table);
3538 _bfd_elf_link_hash_table_free (obfd);
68faa637
AM
3539}
3540
65f38f15
AM
3541/* Create a ppc64 ELF linker hash table. */
3542
3543static struct bfd_link_hash_table *
4ce794b7 3544ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
3545{
3546 struct ppc_link_hash_table *htab;
986f0783 3547 size_t amt = sizeof (struct ppc_link_hash_table);
65f38f15 3548
4ce794b7 3549 htab = bfd_zmalloc (amt);
65f38f15
AM
3550 if (htab == NULL)
3551 return NULL;
3552
66eb6687 3553 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4dfe6ac6
NC
3554 sizeof (struct ppc_link_hash_entry),
3555 PPC64_ELF_DATA))
65f38f15 3556 {
e2d34d7d 3557 free (htab);
65f38f15
AM
3558 return NULL;
3559 }
3560
721956f4 3561 /* Init the stub hash table too. */
66eb6687
AM
3562 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
3563 sizeof (struct ppc_stub_hash_entry)))
2915c55b 3564 {
d495ab0d 3565 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3566 return NULL;
3567 }
721956f4
AM
3568
3569 /* And the branch hash table. */
66eb6687
AM
3570 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
3571 sizeof (struct ppc_branch_hash_entry)))
2915c55b
JK
3572 {
3573 bfd_hash_table_free (&htab->stub_hash_table);
d495ab0d 3574 _bfd_elf_link_hash_table_free (abfd);
2915c55b
JK
3575 return NULL;
3576 }
721956f4 3577
3b421ab3
AM
3578 htab->tocsave_htab = htab_try_create (1024,
3579 tocsave_htab_hash,
3580 tocsave_htab_eq,
3581 NULL);
3582 if (htab->tocsave_htab == NULL)
2915c55b 3583 {
d495ab0d 3584 ppc64_elf_link_hash_table_free (abfd);
2915c55b
JK
3585 return NULL;
3586 }
d495ab0d 3587 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
3b421ab3 3588
3254fd24
AM
3589 /* Initializing two fields of the union is just cosmetic. We really
3590 only care about glist, but when compiled on a 32-bit host the
3591 bfd_vma fields are larger. Setting the bfd_vma to zero makes
3592 debugger inspection of these fields look nicer. */
a6aa5195
AM
3593 htab->elf.init_got_refcount.refcount = 0;
3594 htab->elf.init_got_refcount.glist = NULL;
3595 htab->elf.init_plt_refcount.refcount = 0;
3596 htab->elf.init_plt_refcount.glist = NULL;
3597 htab->elf.init_got_offset.offset = 0;
3598 htab->elf.init_got_offset.glist = NULL;
3599 htab->elf.init_plt_offset.offset = 0;
3600 htab->elf.init_plt_offset.glist = NULL;
3254fd24 3601
65f38f15
AM
3602 return &htab->elf.root;
3603}
3604
bfeb4a28
AM
3605/* Create sections for linker generated code. */
3606
0a1b45a2 3607static bool
bfeb4a28
AM
3608create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
3609{
3610 struct ppc_link_hash_table *htab;
3611 flagword flags;
3612
3613 htab = ppc_hash_table (info);
3614
bfeb4a28
AM
3615 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3616 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
b32547cd
AM
3617 if (htab->params->save_restore_funcs)
3618 {
3619 /* Create .sfpr for code to save and restore fp regs. */
3620 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
3621 flags);
3622 if (htab->sfpr == NULL
fd361982 3623 || !bfd_set_section_alignment (htab->sfpr, 2))
0a1b45a2 3624 return false;
b32547cd
AM
3625 }
3626
3627 if (bfd_link_relocatable (info))
0a1b45a2 3628 return true;
bfeb4a28
AM
3629
3630 /* Create .glink for lazy dynamic linking support. */
3631 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3632 flags);
3633 if (htab->glink == NULL
fd361982 3634 || !bfd_set_section_alignment (htab->glink, 3))
0a1b45a2 3635 return false;
bfeb4a28 3636
9e390558
AM
3637 /* The part of .glink used by global entry stubs, separate so that
3638 it can be aligned appropriately without affecting htab->glink. */
3639 htab->global_entry = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3640 flags);
3641 if (htab->global_entry == NULL
fd361982 3642 || !bfd_set_section_alignment (htab->global_entry, 2))
0a1b45a2 3643 return false;
9e390558 3644
bfeb4a28
AM
3645 if (!info->no_ld_generated_unwind_info)
3646 {
3647 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
3648 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3649 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
3650 ".eh_frame",
3651 flags);
3652 if (htab->glink_eh_frame == NULL
fd361982 3653 || !bfd_set_section_alignment (htab->glink_eh_frame, 2))
0a1b45a2 3654 return false;
bfeb4a28
AM
3655 }
3656
3657 flags = SEC_ALLOC | SEC_LINKER_CREATED;
33e44f2e
AM
3658 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
3659 if (htab->elf.iplt == NULL
fd361982 3660 || !bfd_set_section_alignment (htab->elf.iplt, 3))
0a1b45a2 3661 return false;
bfeb4a28
AM
3662
3663 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3664 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
33e44f2e
AM
3665 htab->elf.irelplt
3666 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
3667 if (htab->elf.irelplt == NULL
fd361982 3668 || !bfd_set_section_alignment (htab->elf.irelplt, 3))
0a1b45a2 3669 return false;
bfeb4a28
AM
3670
3671 /* Create branch lookup table for plt_branch stubs. */
3672 flags = (SEC_ALLOC | SEC_LOAD
3673 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3674 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3675 flags);
3676 if (htab->brlt == NULL
fd361982 3677 || !bfd_set_section_alignment (htab->brlt, 3))
0a1b45a2 3678 return false;
bfeb4a28 3679
2d7ad24e
AM
3680 /* Local plt entries, put in .branch_lt but a separate section for
3681 convenience. */
3682 htab->pltlocal = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3683 flags);
3684 if (htab->pltlocal == NULL
fd361982 3685 || !bfd_set_section_alignment (htab->pltlocal, 3))
0a1b45a2 3686 return false;
2d7ad24e 3687
0e1862bb 3688 if (!bfd_link_pic (info))
0a1b45a2 3689 return true;
bfeb4a28
AM
3690
3691 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3692 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2d7ad24e
AM
3693 htab->relbrlt
3694 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
bfeb4a28 3695 if (htab->relbrlt == NULL
fd361982 3696 || !bfd_set_section_alignment (htab->relbrlt, 3))
0a1b45a2 3697 return false;
bfeb4a28 3698
2d7ad24e
AM
3699 htab->relpltlocal
3700 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
3701 if (htab->relpltlocal == NULL
fd361982 3702 || !bfd_set_section_alignment (htab->relpltlocal, 3))
0a1b45a2 3703 return false;
2d7ad24e 3704
0a1b45a2 3705 return true;
bfeb4a28
AM
3706}
3707
e717da7e
AM
3708/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
3709
0a1b45a2 3710bool
e7d1c40c
AM
3711ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
3712 struct ppc64_elf_params *params)
e717da7e
AM
3713{
3714 struct ppc_link_hash_table *htab;
3715
e7d1c40c 3716 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
e717da7e
AM
3717
3718/* Always hook our dynamic sections into the first bfd, which is the
3719 linker created stub bfd. This ensures that the GOT header is at
3720 the start of the output TOC section. */
3721 htab = ppc_hash_table (info);
e7d1c40c
AM
3722 htab->elf.dynobj = params->stub_bfd;
3723 htab->params = params;
bfeb4a28 3724
bfeb4a28 3725 return create_linkage_sections (htab->elf.dynobj, info);
e717da7e
AM
3726}
3727
721956f4
AM
3728/* Build a name for an entry in the stub hash table. */
3729
3730static char *
4ce794b7
AM
3731ppc_stub_name (const asection *input_section,
3732 const asection *sym_sec,
3733 const struct ppc_link_hash_entry *h,
3734 const Elf_Internal_Rela *rel)
721956f4
AM
3735{
3736 char *stub_name;
bcaa2f82 3737 ssize_t len;
721956f4
AM
3738
3739 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3740 offsets from a sym as a branch target? In fact, we could
3741 probably assume the addend is always zero. */
3742 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3743
3744 if (h)
3745 {
3746 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3747 stub_name = bfd_malloc (len);
46de2a7c
AM
3748 if (stub_name == NULL)
3749 return stub_name;
3750
bcaa2f82
AM
3751 len = sprintf (stub_name, "%08x.%s+%x",
3752 input_section->id & 0xffffffff,
3753 h->elf.root.root.string,
3754 (int) rel->r_addend & 0xffffffff);
721956f4
AM
3755 }
3756 else
3757 {
ad8e1ba5 3758 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4 3759 stub_name = bfd_malloc (len);
46de2a7c
AM
3760 if (stub_name == NULL)
3761 return stub_name;
3762
bcaa2f82
AM
3763 len = sprintf (stub_name, "%08x.%x:%x+%x",
3764 input_section->id & 0xffffffff,
3765 sym_sec->id & 0xffffffff,
3766 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3767 (int) rel->r_addend & 0xffffffff);
721956f4 3768 }
bcaa2f82 3769 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
ee75fd95 3770 stub_name[len - 2] = 0;
721956f4
AM
3771 return stub_name;
3772}
3773
e10a07b3 3774/* If mixing power10 with non-power10 code and --power10-stubs is not
7aba54da
AM
3775 specified (or is auto) then there may be multiple stub types for any
3776 given symbol. Up to three classes of stubs are stored in separate
3777 stub_hash_table entries having the same key string. The entries
3778 will always be adjacent on entry->root.next chain, even if hash
3779 table resizing occurs. This function selects the correct entry to
3780 use. */
e10a07b3
AM
3781
3782static struct ppc_stub_hash_entry *
7aba54da
AM
3783select_alt_stub (struct ppc_stub_hash_entry *entry,
3784 enum elf_ppc64_reloc_type r_type)
e10a07b3 3785{
7aba54da 3786 enum ppc_stub_sub_type subt;
e10a07b3 3787
7aba54da
AM
3788 switch (r_type)
3789 {
3790 case R_PPC64_REL24_NOTOC:
3791 subt = ppc_stub_notoc;
3792 break;
3793 case R_PPC64_REL24_P9NOTOC:
3794 subt = ppc_stub_p9notoc;
3795 break;
3796 default:
3797 subt = ppc_stub_toc;
3798 break;
3799 }
e10a07b3 3800
7aba54da 3801 while (entry != NULL && entry->type.sub != subt)
e10a07b3
AM
3802 {
3803 const char *stub_name = entry->root.string;
3804
3805 entry = (struct ppc_stub_hash_entry *) entry->root.next;
3806 if (entry != NULL
3807 && entry->root.string != stub_name)
3808 entry = NULL;
3809 }
3810
3811 return entry;
3812}
3813
721956f4
AM
3814/* Look up an entry in the stub hash. Stub entries are cached because
3815 creating the stub name takes a bit of time. */
3816
3817static struct ppc_stub_hash_entry *
4ce794b7
AM
3818ppc_get_stub_entry (const asection *input_section,
3819 const asection *sym_sec,
039b3fef 3820 struct ppc_link_hash_entry *h,
4ce794b7
AM
3821 const Elf_Internal_Rela *rel,
3822 struct ppc_link_hash_table *htab)
721956f4
AM
3823{
3824 struct ppc_stub_hash_entry *stub_entry;
6f20ed8a 3825 struct map_stub *group;
721956f4
AM
3826
3827 /* If this input section is part of a group of sections sharing one
3828 stub section, then use the id of the first section in the group.
3829 Stub names need to include a section id, as there may well be
3830 more than one stub used to reach say, printf, and we need to
3831 distinguish between them. */
6f20ed8a 3832 group = htab->sec_info[input_section->id].u.group;
89d77b8a
AM
3833 if (group == NULL)
3834 return NULL;
721956f4 3835
b3fac117
AM
3836 if (h != NULL && h->u.stub_cache != NULL
3837 && h->u.stub_cache->h == h
6f20ed8a 3838 && h->u.stub_cache->group == group)
721956f4 3839 {
b3fac117 3840 stub_entry = h->u.stub_cache;
721956f4
AM
3841 }
3842 else
3843 {
3844 char *stub_name;
3845
6f20ed8a 3846 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
721956f4
AM
3847 if (stub_name == NULL)
3848 return NULL;
3849
3850 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
0a1b45a2 3851 stub_name, false, false);
721956f4 3852 if (h != NULL)
b3fac117 3853 h->u.stub_cache = stub_entry;
721956f4
AM
3854
3855 free (stub_name);
3856 }
3857
e10a07b3 3858 if (stub_entry != NULL && htab->params->power10_stubs == -1)
7aba54da 3859 stub_entry = select_alt_stub (stub_entry, ELF64_R_TYPE (rel->r_info));
e10a07b3 3860
721956f4
AM
3861 return stub_entry;
3862}
3863
3864/* Add a new stub entry to the stub hash. Not all fields of the new
3865 stub entry are initialised. */
3866
3867static struct ppc_stub_hash_entry *
4ce794b7
AM
3868ppc_add_stub (const char *stub_name,
3869 asection *section,
25f53a85 3870 struct bfd_link_info *info)
721956f4 3871{
25f53a85 3872 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 3873 struct map_stub *group;
721956f4
AM
3874 asection *link_sec;
3875 asection *stub_sec;
3876 struct ppc_stub_hash_entry *stub_entry;
3877
6f20ed8a
AM
3878 group = htab->sec_info[section->id].u.group;
3879 link_sec = group->link_sec;
3880 stub_sec = group->stub_sec;
721956f4
AM
3881 if (stub_sec == NULL)
3882 {
6f20ed8a
AM
3883 size_t namelen;
3884 bfd_size_type len;
3885 char *s_name;
721956f4 3886
6f20ed8a
AM
3887 namelen = strlen (link_sec->name);
3888 len = namelen + sizeof (STUB_SUFFIX);
3889 s_name = bfd_alloc (htab->params->stub_bfd, len);
3890 if (s_name == NULL)
3891 return NULL;
721956f4 3892
6f20ed8a
AM
3893 memcpy (s_name, link_sec->name, namelen);
3894 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3895 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
3896 if (stub_sec == NULL)
3897 return NULL;
3898 group->stub_sec = stub_sec;
721956f4
AM
3899 }
3900
3901 /* Enter this entry into the linker stub hash table. */
3902 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
0a1b45a2 3903 true, false);
721956f4
AM
3904 if (stub_entry == NULL)
3905 {
695344c0 3906 /* xgettext:c-format */
cf97bcb0
AM
3907 _bfd_error_handler (_("%pB: cannot create stub entry %s"),
3908 section->owner, stub_name);
721956f4
AM
3909 return NULL;
3910 }
3911
6f20ed8a 3912 stub_entry->group = group;
721956f4 3913 stub_entry->stub_offset = 0;
721956f4
AM
3914 return stub_entry;
3915}
3916
7aba54da
AM
3917/* A stub has already been created, but it may not be the required
3918 type. We shouldn't be transitioning from plt_call to long_branch
3919 stubs or vice versa, but we might be upgrading from plt_call to
3920 plt_call with r2save for example. */
3921
3922static bool
3923ppc_merge_stub (struct ppc_link_hash_table *htab,
3924 struct ppc_stub_hash_entry *stub_entry,
3925 struct ppc_stub_type stub_type,
3926 enum elf_ppc64_reloc_type r_type)
3927{
3928 struct ppc_stub_type old_type = stub_entry->type;
3929
3930 if (old_type.main == ppc_stub_save_res)
3931 return true;
3932
3933 if (htab->params->power10_stubs == -1)
3934 {
3935 /* For --power10-stubs=auto, don't merge _notoc and other
3936 varieties of stubs. */
3937 struct ppc_stub_hash_entry *alt_stub;
3938
3939 alt_stub = select_alt_stub (stub_entry, r_type);
3940 if (alt_stub == NULL)
3941 {
3942 alt_stub = ((struct ppc_stub_hash_entry *)
3943 stub_hash_newfunc (NULL,
3944 &htab->stub_hash_table,
3945 stub_entry->root.string));
3946 if (alt_stub == NULL)
3947 return false;
3948
3949 *alt_stub = *stub_entry;
3950 stub_entry->root.next = &alt_stub->root;
3951
3952 /* Sort notoc stubs first, then toc stubs, then p9notoc.
3953 Not that it matters, this just puts smaller stubs first. */
3954 if (stub_type.sub == ppc_stub_notoc)
3955 alt_stub = stub_entry;
3956 else if (stub_type.sub == ppc_stub_p9notoc
3957 && alt_stub->root.next
3958 && alt_stub->root.next->string == alt_stub->root.string)
3959 {
3960 struct ppc_stub_hash_entry *next
3961 = (struct ppc_stub_hash_entry *) alt_stub->root.next;
3962 alt_stub->type = next->type;
3963 alt_stub = next;
3964 }
3965 alt_stub->type = stub_type;
3966 return true;
3967 }
3968 stub_entry = alt_stub;
3969 }
3970
3971 old_type = stub_entry->type;
3972 if (old_type.main == ppc_stub_plt_branch)
04cb922a 3973 old_type.main = ppc_stub_long_branch;
7aba54da
AM
3974
3975 if (old_type.main != stub_type.main
3976 || (old_type.sub != stub_type.sub
3977 && old_type.sub != ppc_stub_toc
3978 && stub_type.sub != ppc_stub_toc))
3979 abort ();
3980
3981 stub_entry->type.sub |= stub_type.sub;
3982 stub_entry->type.r2save |= stub_type.r2save;
3983 return true;
3984}
3985
e717da7e
AM
3986/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3987 not already done. */
65f38f15 3988
0a1b45a2 3989static bool
e717da7e 3990create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 3991{
e717da7e
AM
3992 asection *got, *relgot;
3993 flagword flags;
3994 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 3995
0c8d6e5c 3996 if (!is_ppc64_elf (abfd))
0a1b45a2 3997 return false;
4dfe6ac6 3998 if (htab == NULL)
0a1b45a2 3999 return false;
0ffa91dd 4000
33e44f2e
AM
4001 if (!htab->elf.sgot
4002 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
0a1b45a2 4003 return false;
e717da7e
AM
4004
4005 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4006 | SEC_LINKER_CREATED);
4007
c456f082 4008 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
e717da7e 4009 if (!got
fd361982 4010 || !bfd_set_section_alignment (got, 3))
0a1b45a2 4011 return false;
65f38f15 4012
c456f082
AM
4013 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4014 flags | SEC_READONLY);
e717da7e 4015 if (!relgot
fd361982 4016 || !bfd_set_section_alignment (relgot, 3))
0a1b45a2 4017 return false;
e717da7e
AM
4018
4019 ppc64_elf_tdata (abfd)->got = got;
4020 ppc64_elf_tdata (abfd)->relgot = relgot;
0a1b45a2 4021 return true;
65f38f15 4022}
5bd4f169 4023
b31867b6
AM
4024/* Follow indirect and warning symbol links. */
4025
4026static inline struct bfd_link_hash_entry *
4027follow_link (struct bfd_link_hash_entry *h)
4028{
4029 while (h->type == bfd_link_hash_indirect
4030 || h->type == bfd_link_hash_warning)
4031 h = h->u.i.link;
4032 return h;
4033}
4034
4035static inline struct elf_link_hash_entry *
4036elf_follow_link (struct elf_link_hash_entry *h)
4037{
4038 return (struct elf_link_hash_entry *) follow_link (&h->root);
4039}
4040
4041static inline struct ppc_link_hash_entry *
4042ppc_follow_link (struct ppc_link_hash_entry *h)
4043{
ed7007c1 4044 return ppc_elf_hash_entry (elf_follow_link (&h->elf));
b31867b6
AM
4045}
4046
40d16e0b
AM
4047/* Merge PLT info on FROM with that on TO. */
4048
4049static void
4050move_plt_plist (struct ppc_link_hash_entry *from,
4051 struct ppc_link_hash_entry *to)
4052{
4053 if (from->elf.plt.plist != NULL)
4054 {
4055 if (to->elf.plt.plist != NULL)
4056 {
4057 struct plt_entry **entp;
4058 struct plt_entry *ent;
4059
4060 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4061 {
4062 struct plt_entry *dent;
4063
4064 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4065 if (dent->addend == ent->addend)
4066 {
4067 dent->plt.refcount += ent->plt.refcount;
4068 *entp = ent->next;
4069 break;
4070 }
4071 if (dent == NULL)
4072 entp = &ent->next;
4073 }
4074 *entp = to->elf.plt.plist;
4075 }
4076
4077 to->elf.plt.plist = from->elf.plt.plist;
4078 from->elf.plt.plist = NULL;
4079 }
4080}
4081
65f38f15
AM
4082/* Copy the extra info we tack onto an elf_link_hash_entry. */
4083
4084static void
fcfa13d2
AM
4085ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4086 struct elf_link_hash_entry *dir,
4087 struct elf_link_hash_entry *ind)
65f38f15
AM
4088{
4089 struct ppc_link_hash_entry *edir, *eind;
4090
ed7007c1
AM
4091 edir = ppc_elf_hash_entry (dir);
4092 eind = ppc_elf_hash_entry (ind);
65f38f15 4093
c79d6685
AM
4094 edir->is_func |= eind->is_func;
4095 edir->is_func_descriptor |= eind->is_func_descriptor;
4096 edir->tls_mask |= eind->tls_mask;
4097 if (eind->oh != NULL)
4098 edir->oh = ppc_follow_link (eind->oh);
4099
474436e6 4100 if (edir->elf.versioned != versioned_hidden)
e81830c5
AM
4101 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4102 edir->elf.ref_regular |= eind->elf.ref_regular;
4103 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4a7e5234 4104 edir->elf.non_got_ref |= eind->elf.non_got_ref;
e81830c5
AM
4105 edir->elf.needs_plt |= eind->elf.needs_plt;
4106 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
c79d6685 4107
d311bc8b
AM
4108 /* If we were called to copy over info for a weak sym, don't copy
4109 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
4110 in order to simplify readonly_dynrelocs and save a field in the
4111 symbol hash entry, but that means dyn_relocs can't be used in any
4112 tests about a specific symbol, or affect other symbol flags which
ab2477e1 4113 are then tested. */
d311bc8b 4114 if (eind->elf.root.type != bfd_link_hash_indirect)
ab2477e1 4115 return;
d311bc8b 4116
411e1bfb 4117 /* Copy over any dynamic relocs we may have on the indirect sym. */
190eb1dd 4118 if (ind->dyn_relocs != NULL)
65f38f15 4119 {
190eb1dd 4120 if (dir->dyn_relocs != NULL)
bbd7ec4a 4121 {
1657026c
AM
4122 struct ppc_dyn_relocs **pp;
4123 struct ppc_dyn_relocs *p;
bbd7ec4a 4124
fcfa13d2 4125 /* Add reloc counts against the indirect sym to the direct sym
bbd7ec4a 4126 list. Merge any entries against the same section. */
1657026c
AM
4127 for (pp = (struct ppc_dyn_relocs **) &ind->dyn_relocs;
4128 (p = *pp) != NULL;
4129 )
bbd7ec4a 4130 {
1657026c 4131 struct ppc_dyn_relocs *q;
bbd7ec4a 4132
1657026c
AM
4133 for (q = (struct ppc_dyn_relocs *) dir->dyn_relocs;
4134 q != NULL;
4135 q = q->next)
bbd7ec4a
AM
4136 if (q->sec == p->sec)
4137 {
bbd7ec4a 4138 q->count += p->count;
1657026c
AM
4139 q->pc_count += p->pc_count;
4140 q->rel_count += p->rel_count;
bbd7ec4a
AM
4141 *pp = p->next;
4142 break;
4143 }
4144 if (q == NULL)
4145 pp = &p->next;
4146 }
1657026c 4147 *pp = (struct ppc_dyn_relocs *) dir->dyn_relocs;
bbd7ec4a
AM
4148 }
4149
190eb1dd
L
4150 dir->dyn_relocs = ind->dyn_relocs;
4151 ind->dyn_relocs = NULL;
65f38f15 4152 }
65f38f15 4153
81848ca0
AM
4154 /* Copy over got entries that we may have already seen to the
4155 symbol which just became indirect. */
411e1bfb
AM
4156 if (eind->elf.got.glist != NULL)
4157 {
4158 if (edir->elf.got.glist != NULL)
4159 {
4160 struct got_entry **entp;
4161 struct got_entry *ent;
4162
4163 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4164 {
4165 struct got_entry *dent;
4166
4167 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4168 if (dent->addend == ent->addend
e717da7e 4169 && dent->owner == ent->owner
411e1bfb
AM
4170 && dent->tls_type == ent->tls_type)
4171 {
4172 dent->got.refcount += ent->got.refcount;
4173 *entp = ent->next;
4174 break;
4175 }
4176 if (dent == NULL)
4177 entp = &ent->next;
4178 }
4179 *entp = edir->elf.got.glist;
4180 }
4181
4182 edir->elf.got.glist = eind->elf.got.glist;
4183 eind->elf.got.glist = NULL;
4184 }
4185
4186 /* And plt entries. */
40d16e0b 4187 move_plt_plist (eind, edir);
411e1bfb 4188
fcfa13d2 4189 if (eind->elf.dynindx != -1)
411e1bfb 4190 {
fcfa13d2
AM
4191 if (edir->elf.dynindx != -1)
4192 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4193 edir->elf.dynstr_index);
411e1bfb
AM
4194 edir->elf.dynindx = eind->elf.dynindx;
4195 edir->elf.dynstr_index = eind->elf.dynstr_index;
4196 eind->elf.dynindx = -1;
4197 eind->elf.dynstr_index = 0;
4198 }
411e1bfb
AM
4199}
4200
8387904d
AM
4201/* Find the function descriptor hash entry from the given function code
4202 hash entry FH. Link the entries via their OH fields. */
4203
4204static struct ppc_link_hash_entry *
b31867b6 4205lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
8387904d
AM
4206{
4207 struct ppc_link_hash_entry *fdh = fh->oh;
4208
4209 if (fdh == NULL)
4210 {
4211 const char *fd_name = fh->elf.root.root.string + 1;
4212
ed7007c1 4213 fdh = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, fd_name,
0a1b45a2 4214 false, false, false));
b31867b6
AM
4215 if (fdh == NULL)
4216 return fdh;
4217
4218 fdh->is_func_descriptor = 1;
4219 fdh->oh = fh;
4220 fh->is_func = 1;
4221 fh->oh = fdh;
8387904d
AM
4222 }
4223
8c5b4e52
AM
4224 fdh = ppc_follow_link (fdh);
4225 fdh->is_func_descriptor = 1;
4226 fdh->oh = fh;
4227 return fdh;
8387904d
AM
4228}
4229
8c5b4e52 4230/* Make a fake function descriptor sym for the undefined code sym FH. */
bb700d78
AM
4231
4232static struct ppc_link_hash_entry *
4233make_fdh (struct bfd_link_info *info,
908b32fc 4234 struct ppc_link_hash_entry *fh)
bb700d78 4235{
8c5b4e52
AM
4236 bfd *abfd = fh->elf.root.u.undef.abfd;
4237 struct bfd_link_hash_entry *bh = NULL;
bb700d78 4238 struct ppc_link_hash_entry *fdh;
8c5b4e52
AM
4239 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
4240 ? BSF_WEAK
4241 : BSF_GLOBAL);
4242
4243 if (!_bfd_generic_link_add_one_symbol (info, abfd,
4244 fh->elf.root.root.string + 1,
4245 flags, bfd_und_section_ptr, 0,
0a1b45a2 4246 NULL, false, false, &bh))
bb700d78
AM
4247 return NULL;
4248
4249 fdh = (struct ppc_link_hash_entry *) bh;
4250 fdh->elf.non_elf = 0;
908b32fc
AM
4251 fdh->fake = 1;
4252 fdh->is_func_descriptor = 1;
4253 fdh->oh = fh;
4254 fh->is_func = 1;
4255 fh->oh = fdh;
bb700d78
AM
4256 return fdh;
4257}
4258
8387904d
AM
4259/* Fix function descriptor symbols defined in .opd sections to be
4260 function type. */
555cd476 4261
0a1b45a2 4262static bool
c16153ae 4263ppc64_elf_add_symbol_hook (bfd *ibfd,
e054468f 4264 struct bfd_link_info *info,
555cd476 4265 Elf_Internal_Sym *isym,
6911b7dc 4266 const char **name,
555cd476
AM
4267 flagword *flags ATTRIBUTE_UNUSED,
4268 asection **sec,
b53dfeb2 4269 bfd_vma *value)
555cd476 4270{
b53dfeb2 4271 if (*sec != NULL
f1885d1e 4272 && strcmp ((*sec)->name, ".opd") == 0)
b53dfeb2
AM
4273 {
4274 asection *code_sec;
4275
4276 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4277 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
4278 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4279
4280 /* If the symbol is a function defined in .opd, and the function
4281 code is in a discarded group, let it appear to be undefined. */
0e1862bb 4282 if (!bfd_link_relocatable (info)
b53dfeb2
AM
4283 && (*sec)->reloc_count != 0
4284 && opd_entry_value (*sec, *value, &code_sec, NULL,
0a1b45a2 4285 false) != (bfd_vma) -1
b53dfeb2
AM
4286 && discarded_section (code_sec))
4287 {
4288 *sec = bfd_und_section_ptr;
4289 isym->st_shndx = SHN_UNDEF;
4290 }
4291 }
dbd1e97e
AM
4292 else if (*sec != NULL
4293 && strcmp ((*sec)->name, ".toc") == 0
4294 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
4295 {
4296 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4297 if (htab != NULL)
4298 htab->params->object_in_toc = 1;
4299 }
433817dd 4300
6911b7dc
AM
4301 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4302 {
4303 if (abiversion (ibfd) == 0)
4304 set_abiversion (ibfd, 2);
4305 else if (abiversion (ibfd) == 1)
4306 {
cf97bcb0
AM
4307 _bfd_error_handler (_("symbol '%s' has invalid st_other"
4308 " for ABI version 1"), *name);
6911b7dc 4309 bfd_set_error (bfd_error_bad_value);
0a1b45a2 4310 return false;
6911b7dc
AM
4311 }
4312 }
4313
0a1b45a2 4314 return true;
555cd476
AM
4315}
4316
6911b7dc
AM
4317/* Merge non-visibility st_other attributes: local entry point. */
4318
4319static void
4320ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
5160d0f3 4321 unsigned int st_other,
0a1b45a2
AM
4322 bool definition,
4323 bool dynamic)
6911b7dc 4324{
f378ab09 4325 if (definition && (!dynamic || !h->def_regular))
5160d0f3 4326 h->other = ((st_other & ~ELF_ST_VISIBILITY (-1))
6911b7dc
AM
4327 | ELF_ST_VISIBILITY (h->other));
4328}
4329
8c5b4e52
AM
4330/* Hook called on merging a symbol. We use this to clear "fake" since
4331 we now have a real symbol. */
4332
0a1b45a2 4333static bool
8c5b4e52 4334ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
8b5f1ed8 4335 const Elf_Internal_Sym *isym,
8c5b4e52 4336 asection **psec ATTRIBUTE_UNUSED,
0a1b45a2
AM
4337 bool newdef ATTRIBUTE_UNUSED,
4338 bool olddef ATTRIBUTE_UNUSED,
8c5b4e52
AM
4339 bfd *oldbfd ATTRIBUTE_UNUSED,
4340 const asection *oldsec ATTRIBUTE_UNUSED)
4341{
ed7007c1 4342 ppc_elf_hash_entry (h)->fake = 0;
8b5f1ed8 4343 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
ed7007c1 4344 ppc_elf_hash_entry (h)->non_zero_localentry = 1;
0a1b45a2 4345 return true;
8c5b4e52
AM
4346}
4347
8387904d 4348/* This function makes an old ABI object reference to ".bar" cause the
908b32fc
AM
4349 inclusion of a new ABI object archive that defines "bar".
4350 NAME is a symbol defined in an archive. Return a symbol in the hash
4351 table that might be satisfied by the archive symbols. */
8387904d 4352
b585e899 4353static struct bfd_link_hash_entry *
8387904d
AM
4354ppc64_elf_archive_symbol_lookup (bfd *abfd,
4355 struct bfd_link_info *info,
4356 const char *name)
4357{
b585e899 4358 struct bfd_link_hash_entry *h;
8387904d
AM
4359 char *dot_name;
4360 size_t len;
4361
4362 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
908b32fc 4363 if (h != NULL
b585e899 4364 && ppc_hash_table (info) != NULL
908b32fc
AM
4365 /* Don't return this sym if it is a fake function descriptor
4366 created by add_symbol_adjust. */
b585e899 4367 && !((struct ppc_link_hash_entry *) h)->fake)
8387904d
AM
4368 return h;
4369
4370 if (name[0] == '.')
4371 return h;
4372
4373 len = strlen (name);
4374 dot_name = bfd_alloc (abfd, len + 2);
4375 if (dot_name == NULL)
b585e899 4376 return (struct bfd_link_hash_entry *) -1;
8387904d
AM
4377 dot_name[0] = '.';
4378 memcpy (dot_name + 1, name, len + 1);
4379 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4380 bfd_release (abfd, dot_name);
a804e476
AM
4381 if (h != NULL)
4382 return h;
4383
4384 if (strcmp (name, "__tls_get_addr_opt") == 0)
4385 h = _bfd_elf_archive_symbol_lookup (abfd, info, "__tls_get_addr_desc");
8387904d
AM
4386 return h;
4387}
4388
4389/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
4390 new ABI object defines "bar". Well, at least, undefined dot symbols
4391 are made weak. This stops later archive searches from including an
4392 object if we already have a function descriptor definition. It also
35b0ce59
AM
4393 prevents the linker complaining about undefined symbols.
4394 We also check and correct mismatched symbol visibility here. The
4395 most restrictive visibility of the function descriptor and the
4396 function entry symbol is used. */
8387904d 4397
0a1b45a2 4398static bool
b3fac117 4399add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
8387904d 4400{
8387904d
AM
4401 struct ppc_link_hash_table *htab;
4402 struct ppc_link_hash_entry *fdh;
4403
b3fac117
AM
4404 if (eh->elf.root.type == bfd_link_hash_warning)
4405 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
8387904d 4406
8400d40d 4407 if (eh->elf.root.type == bfd_link_hash_indirect)
0a1b45a2 4408 return true;
8400d40d 4409
b3fac117
AM
4410 if (eh->elf.root.root.string[0] != '.')
4411 abort ();
8387904d 4412
b3fac117 4413 htab = ppc_hash_table (info);
4dfe6ac6 4414 if (htab == NULL)
0a1b45a2 4415 return false;
4dfe6ac6 4416
b31867b6 4417 fdh = lookup_fdh (eh, htab);
8c5b4e52
AM
4418 if (fdh == NULL
4419 && !bfd_link_relocatable (info)
4420 && (eh->elf.root.type == bfd_link_hash_undefined
4421 || eh->elf.root.type == bfd_link_hash_undefweak)
4422 && eh->elf.ref_regular)
4423 {
4424 /* Make an undefined function descriptor sym, in order to
4425 pull in an --as-needed shared lib. Archives are handled
4426 elsewhere. */
4427 fdh = make_fdh (info, eh);
4428 if (fdh == NULL)
0a1b45a2 4429 return false;
bb700d78 4430 }
8c5b4e52
AM
4431
4432 if (fdh != NULL)
8387904d 4433 {
35b0ce59
AM
4434 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4435 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
8c5b4e52
AM
4436
4437 /* Make both descriptor and entry symbol have the most
4438 constraining visibility of either symbol. */
35b0ce59
AM
4439 if (entry_vis < descr_vis)
4440 fdh->elf.other += entry_vis - descr_vis;
4441 else if (entry_vis > descr_vis)
4442 eh->elf.other += descr_vis - entry_vis;
4443
8c5b4e52
AM
4444 /* Propagate reference flags from entry symbol to function
4445 descriptor symbol. */
bc4e12de 4446 fdh->elf.root.non_ir_ref_regular |= eh->elf.root.non_ir_ref_regular;
4070765b 4447 fdh->elf.root.non_ir_ref_dynamic |= eh->elf.root.non_ir_ref_dynamic;
8c5b4e52
AM
4448 fdh->elf.ref_regular |= eh->elf.ref_regular;
4449 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
4450
4451 if (!fdh->elf.forced_local
4452 && fdh->elf.dynindx == -1
4453 && fdh->elf.versioned != versioned_hidden
4454 && (bfd_link_dll (info)
4455 || fdh->elf.def_dynamic
4456 || fdh->elf.ref_dynamic)
4457 && (eh->elf.ref_regular
4458 || eh->elf.def_regular))
4459 {
2cdcc330 4460 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
0a1b45a2 4461 return false;
35b0ce59 4462 }
8387904d 4463 }
99877b66 4464
0a1b45a2 4465 return true;
8387904d
AM
4466}
4467
f6c7c3e8
AM
4468/* Set up opd section info and abiversion for IBFD, and process list
4469 of dot-symbols we made in link_hash_newfunc. */
b3fac117 4470
0a1b45a2 4471static bool
f6c7c3e8 4472ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
8387904d 4473{
99877b66 4474 struct ppc_link_hash_table *htab;
b3fac117 4475 struct ppc_link_hash_entry **p, *eh;
459609d6 4476 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
433817dd 4477
459609d6 4478 if (opd != NULL && opd->size != 0)
b3fac117 4479 {
6313825c
AM
4480 if (ppc64_elf_section_data (opd)->sec_type == sec_normal)
4481 ppc64_elf_section_data (opd)->sec_type = sec_opd;
4482 else if (ppc64_elf_section_data (opd)->sec_type != sec_opd)
4483 BFD_FAIL ();
b9399fcf 4484
459609d6
AM
4485 if (abiversion (ibfd) == 0)
4486 set_abiversion (ibfd, 1);
8a2058b5 4487 else if (abiversion (ibfd) >= 2)
f6c7c3e8 4488 {
695344c0 4489 /* xgettext:c-format */
cf97bcb0
AM
4490 _bfd_error_handler (_("%pB .opd not allowed in ABI version %d"),
4491 ibfd, abiversion (ibfd));
459609d6 4492 bfd_set_error (bfd_error_bad_value);
0a1b45a2 4493 return false;
f6c7c3e8 4494 }
b9399fcf 4495 }
f6c7c3e8 4496
b9399fcf
AM
4497 if (is_ppc64_elf (info->output_bfd))
4498 {
4499 /* For input files without an explicit abiversion in e_flags
4500 we should have flagged any with symbol st_other bits set
ac1b12b5 4501 as ELFv2 and above flagged those with .opd as ELFv1.
b9399fcf
AM
4502 Set the output abiversion if not yet set, and for any input
4503 still ambiguous, take its abiversion from the output.
4504 Differences in ABI are reported later. */
4505 if (abiversion (info->output_bfd) == 0)
4506 set_abiversion (info->output_bfd, abiversion (ibfd));
4507 else if (abiversion (ibfd) == 0)
4508 set_abiversion (ibfd, abiversion (info->output_bfd));
b3fac117
AM
4509 }
4510
459609d6
AM
4511 htab = ppc_hash_table (info);
4512 if (htab == NULL)
0a1b45a2 4513 return true;
459609d6 4514
b9399fcf
AM
4515 if (opd != NULL && opd->size != 0
4516 && (ibfd->flags & DYNAMIC) == 0
4517 && (opd->flags & SEC_RELOC) != 0
4518 && opd->reloc_count != 0
4519 && !bfd_is_abs_section (opd->output_section)
4520 && info->gc_sections)
4521 {
4522 /* Garbage collection needs some extra help with .opd sections.
4523 We don't want to necessarily keep everything referenced by
4524 relocs in .opd, as that would keep all functions. Instead,
4525 if we reference an .opd symbol (a function descriptor), we
4526 want to keep the function code symbol's section. This is
4527 easy for global symbols, but for local syms we need to keep
4528 information about the associated function section. */
4529 bfd_size_type amt;
4530 asection **opd_sym_map;
4531 Elf_Internal_Shdr *symtab_hdr;
4532 Elf_Internal_Rela *relocs, *rel_end, *rel;
4533
4534 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
4535 opd_sym_map = bfd_zalloc (ibfd, amt);
4536 if (opd_sym_map == NULL)
0a1b45a2 4537 return false;
b9399fcf
AM
4538 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
4539 relocs = _bfd_elf_link_read_relocs (ibfd, opd, NULL, NULL,
4540 info->keep_memory);
4541 if (relocs == NULL)
0a1b45a2 4542 return false;
b9399fcf
AM
4543 symtab_hdr = &elf_symtab_hdr (ibfd);
4544 rel_end = relocs + opd->reloc_count - 1;
4545 for (rel = relocs; rel < rel_end; rel++)
4546 {
4547 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
4548 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
4549
4550 if (r_type == R_PPC64_ADDR64
4551 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC
4552 && r_symndx < symtab_hdr->sh_info)
4553 {
4554 Elf_Internal_Sym *isym;
4555 asection *s;
4556
f1dfbfdb
L
4557 isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, ibfd,
4558 r_symndx);
b9399fcf
AM
4559 if (isym == NULL)
4560 {
4561 if (elf_section_data (opd)->relocs != relocs)
4562 free (relocs);
0a1b45a2 4563 return false;
b9399fcf
AM
4564 }
4565
4566 s = bfd_section_from_elf_index (ibfd, isym->st_shndx);
4567 if (s != NULL && s != opd)
4568 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
4569 }
4570 }
4571 if (elf_section_data (opd)->relocs != relocs)
4572 free (relocs);
4573 }
459609d6
AM
4574
4575 p = &htab->dot_syms;
4576 while ((eh = *p) != NULL)
4577 {
4578 *p = NULL;
4579 if (&eh->elf == htab->elf.hgot)
4580 ;
4581 else if (htab->elf.hgot == NULL
4582 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
4583 htab->elf.hgot = &eh->elf;
8c5b4e52
AM
4584 else if (abiversion (ibfd) <= 1)
4585 {
4586 htab->need_func_desc_adj = 1;
4587 if (!add_symbol_adjust (eh, info))
0a1b45a2 4588 return false;
8c5b4e52 4589 }
459609d6
AM
4590 p = &eh->u.next_dot_sym;
4591 }
0a1b45a2 4592 return true;
8387904d
AM
4593}
4594
97fed1c9
JJ
4595/* Undo hash table changes when an --as-needed input file is determined
4596 not to be needed. */
4597
0a1b45a2 4598static bool
e5034e59
AM
4599ppc64_elf_notice_as_needed (bfd *ibfd,
4600 struct bfd_link_info *info,
4601 enum notice_asneeded_action act)
97fed1c9 4602{
e5034e59
AM
4603 if (act == notice_not_needed)
4604 {
4605 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4dfe6ac6 4606
e5034e59 4607 if (htab == NULL)
0a1b45a2 4608 return false;
4dfe6ac6 4609
e5034e59
AM
4610 htab->dot_syms = NULL;
4611 }
4612 return _bfd_elf_notice_as_needed (ibfd, info, act);
97fed1c9
JJ
4613}
4614
aa374f67
AM
4615/* If --just-symbols against a final linked binary, then assume we need
4616 toc adjusting stubs when calling functions defined there. */
4617
4618static void
4619ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
4620{
4621 if ((sec->flags & SEC_CODE) != 0
4622 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
4623 && is_ppc64_elf (sec->owner))
4624 {
2c3f079f
AM
4625 if (abiversion (sec->owner) >= 2
4626 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
aa374f67
AM
4627 sec->has_toc_reloc = 1;
4628 }
4629 _bfd_elf_link_just_syms (sec, info);
4630}
4631
e054468f 4632static struct plt_entry **
4ce794b7
AM
4633update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4634 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
4635{
4636 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e054468f 4637 struct plt_entry **local_plt;
f961d9dd 4638 unsigned char *local_got_tls_masks;
411e1bfb
AM
4639
4640 if (local_got_ents == NULL)
4641 {
4642 bfd_size_type size = symtab_hdr->sh_info;
4643
e054468f
AM
4644 size *= (sizeof (*local_got_ents)
4645 + sizeof (*local_plt)
4646 + sizeof (*local_got_tls_masks));
4ce794b7 4647 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb 4648 if (local_got_ents == NULL)
e054468f 4649 return NULL;
411e1bfb
AM
4650 elf_local_got_ents (abfd) = local_got_ents;
4651 }
4652
37da22e5 4653 if ((tls_type & (NON_GOT | TLS_EXPLICIT)) == 0)
411e1bfb
AM
4654 {
4655 struct got_entry *ent;
4656
4657 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
4658 if (ent->addend == r_addend
4659 && ent->owner == abfd
4660 && ent->tls_type == tls_type)
411e1bfb
AM
4661 break;
4662 if (ent == NULL)
4663 {
986f0783 4664 size_t amt = sizeof (*ent);
4ce794b7 4665 ent = bfd_alloc (abfd, amt);
411e1bfb 4666 if (ent == NULL)
0a1b45a2 4667 return false;
411e1bfb
AM
4668 ent->next = local_got_ents[r_symndx];
4669 ent->addend = r_addend;
e717da7e 4670 ent->owner = abfd;
411e1bfb 4671 ent->tls_type = tls_type;
0a1b45a2 4672 ent->is_indirect = false;
411e1bfb
AM
4673 ent->got.refcount = 0;
4674 local_got_ents[r_symndx] = ent;
4675 }
4676 ent->got.refcount += 1;
4677 }
4678
e054468f 4679 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
f961d9dd 4680 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
37da22e5 4681 local_got_tls_masks[r_symndx] |= tls_type & 0xff;
e054468f
AM
4682
4683 return local_plt + r_symndx;
65f38f15
AM
4684}
4685
0a1b45a2 4686static bool
e054468f 4687update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
1e2f5b6e 4688{
411e1bfb 4689 struct plt_entry *ent;
1e2f5b6e 4690
e054468f 4691 for (ent = *plist; ent != NULL; ent = ent->next)
411e1bfb
AM
4692 if (ent->addend == addend)
4693 break;
4694 if (ent == NULL)
1e2f5b6e 4695 {
986f0783 4696 size_t amt = sizeof (*ent);
4ce794b7 4697 ent = bfd_alloc (abfd, amt);
411e1bfb 4698 if (ent == NULL)
0a1b45a2 4699 return false;
e054468f 4700 ent->next = *plist;
411e1bfb
AM
4701 ent->addend = addend;
4702 ent->plt.refcount = 0;
e054468f 4703 *plist = ent;
1e2f5b6e 4704 }
411e1bfb 4705 ent->plt.refcount += 1;
0a1b45a2 4706 return true;
1e2f5b6e
AM
4707}
4708
0a1b45a2 4709static bool
e054468f
AM
4710is_branch_reloc (enum elf_ppc64_reloc_type r_type)
4711{
4712 return (r_type == R_PPC64_REL24
05d0e962 4713 || r_type == R_PPC64_REL24_NOTOC
7aba54da 4714 || r_type == R_PPC64_REL24_P9NOTOC
e054468f
AM
4715 || r_type == R_PPC64_REL14
4716 || r_type == R_PPC64_REL14_BRTAKEN
4717 || r_type == R_PPC64_REL14_BRNTAKEN
4718 || r_type == R_PPC64_ADDR24
4719 || r_type == R_PPC64_ADDR14
4720 || r_type == R_PPC64_ADDR14_BRTAKEN
23cedd1d 4721 || r_type == R_PPC64_ADDR14_BRNTAKEN
5663e321
AM
4722 || r_type == R_PPC64_PLTCALL
4723 || r_type == R_PPC64_PLTCALL_NOTOC);
23cedd1d
AM
4724}
4725
4726/* Relocs on inline plt call sequence insns prior to the call. */
4727
0a1b45a2 4728static bool
23cedd1d
AM
4729is_plt_seq_reloc (enum elf_ppc64_reloc_type r_type)
4730{
4731 return (r_type == R_PPC64_PLT16_HA
4732 || r_type == R_PPC64_PLT16_HI
4733 || r_type == R_PPC64_PLT16_LO
4734 || r_type == R_PPC64_PLT16_LO_DS
5663e321
AM
4735 || r_type == R_PPC64_PLT_PCREL34
4736 || r_type == R_PPC64_PLT_PCREL34_NOTOC
4737 || r_type == R_PPC64_PLTSEQ
4738 || r_type == R_PPC64_PLTSEQ_NOTOC);
e054468f
AM
4739}
4740
733ae98c
AM
4741/* Of relocs which might appear paired with TLSGD and TLSLD marker
4742 relocs, return true for those that operate on a dword. */
4743
4744static bool
4745is_8byte_reloc (enum elf_ppc64_reloc_type r_type)
4746{
4747 return (r_type == R_PPC64_PLT_PCREL34
4748 || r_type == R_PPC64_PLT_PCREL34_NOTOC
4749 || r_type == R_PPC64_PLTCALL);
4750}
4751
f91074eb
AM
4752/* The RELR encoding doesn't allow odd addresses, so RELR_ALIGN must
4753 be at least 1. R_PPC64_RELATIVE relocs require alignment of 2**3.
4754 We use 3 here to avoid complexity in relocate_section, where for a
4755 value of 1 we'd need to test for not just an output RELATIVE reloc
4756 near the call to maybe_relr but also UADDR64 and some conditions on
4757 the symbol. See PR30824. */
4758#define RELR_ALIGN 3
4759
4760static bool
4761maybe_relr (enum elf_ppc64_reloc_type r_type,
4762 const Elf_Internal_Rela *rel,
4763 const asection *sec)
4764{
4765 return ((r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
4766 && (rel->r_offset & ((1 << RELR_ALIGN) - 1)) == 0
4767 && sec->alignment_power >= RELR_ALIGN);
4768}
4769
733ae98c
AM
4770/* Like bfd_reloc_offset_in_range but without a howto. Return true
4771 iff a field of SIZE bytes at OFFSET is within SEC limits. */
4772
4773static bool
4774offset_in_range (asection *sec, bfd_vma offset, size_t size)
4775{
4776 return offset <= sec->size && size <= sec->size - offset;
4777}
4778
5bd4f169 4779/* Look through the relocs for a section during the first phase, and
65f38f15 4780 calculate needed space in the global offset table, procedure
5d1634d7 4781 linkage table, and dynamic reloc sections. */
5bd4f169 4782
0a1b45a2 4783static bool
4ce794b7
AM
4784ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4785 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 4786{
65f38f15 4787 struct ppc_link_hash_table *htab;
5bd4f169 4788 Elf_Internal_Shdr *symtab_hdr;
c7e2358a 4789 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
4790 const Elf_Internal_Rela *rel;
4791 const Elf_Internal_Rela *rel_end;
5bd4f169 4792 asection *sreloc;
3a71aa26 4793 struct elf_link_hash_entry *tga, *dottga;
0a1b45a2 4794 bool is_opd;
5bd4f169 4795
0e1862bb 4796 if (bfd_link_relocatable (info))
0a1b45a2 4797 return true;
5bd4f169 4798
0c8d6e5c 4799 BFD_ASSERT (is_ppc64_elf (abfd));
0ffa91dd 4800
65f38f15 4801 htab = ppc_hash_table (info);
4dfe6ac6 4802 if (htab == NULL)
0a1b45a2 4803 return false;
4dfe6ac6 4804
3a71aa26 4805 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
0a1b45a2 4806 false, false, true);
3a71aa26 4807 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
0a1b45a2 4808 false, false, true);
0ffa91dd 4809 symtab_hdr = &elf_symtab_hdr (abfd);
5bd4f169 4810 sym_hashes = elf_sym_hashes (abfd);
5bd4f169 4811 sreloc = NULL;
b9399fcf 4812 is_opd = ppc64_elf_section_data (sec)->sec_type == sec_opd;
5bd4f169
AM
4813 rel_end = relocs + sec->reloc_count;
4814 for (rel = relocs; rel < rel_end; rel++)
4815 {
4816 unsigned long r_symndx;
4817 struct elf_link_hash_entry *h;
3a3a4c1f 4818 Elf_Internal_Sym *isym;
04c9666a 4819 enum elf_ppc64_reloc_type r_type;
727fc41e 4820 int tls_type;
7c8fe5c4 4821 struct _ppc64_elf_section_data *ppc64_sec;
cbf95972 4822 struct plt_entry **ifunc, **plt_list;
5bd4f169
AM
4823
4824 r_symndx = ELF64_R_SYM (rel->r_info);
4825 if (r_symndx < symtab_hdr->sh_info)
3a3a4c1f
AM
4826 {
4827 h = NULL;
4828 isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd, r_symndx);
4829 if (isym == NULL)
4830 return false;
4831 }
5bd4f169 4832 else
973a3492 4833 {
3a3a4c1f 4834 isym = NULL;
973a3492 4835 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 4836 h = elf_follow_link (h);
1c865ab2
AM
4837
4838 if (h == htab->elf.hgot)
4839 sec->has_toc_reloc = 1;
973a3492 4840 }
5bd4f169 4841
5663e321
AM
4842 r_type = ELF64_R_TYPE (rel->r_info);
4843 switch (r_type)
4844 {
04bdff6a
AM
4845 case R_PPC64_D34:
4846 case R_PPC64_D34_LO:
4847 case R_PPC64_D34_HI30:
4848 case R_PPC64_D34_HA30:
4849 case R_PPC64_D28:
c213164a
AM
4850 case R_PPC64_TPREL34:
4851 case R_PPC64_DTPREL34:
04bdff6a 4852 case R_PPC64_PCREL34:
5663e321 4853 case R_PPC64_GOT_PCREL34:
87c69f97
AM
4854 case R_PPC64_GOT_TLSGD_PCREL34:
4855 case R_PPC64_GOT_TLSLD_PCREL34:
4856 case R_PPC64_GOT_TPREL_PCREL34:
4857 case R_PPC64_GOT_DTPREL_PCREL34:
5663e321
AM
4858 case R_PPC64_PLT_PCREL34:
4859 case R_PPC64_PLT_PCREL34_NOTOC:
04bdff6a 4860 case R_PPC64_PCREL28:
e10a07b3 4861 htab->has_power10_relocs = 1;
133a1f60
AM
4862 break;
4863 default:
5663e321
AM
4864 break;
4865 }
903b777d
AM
4866
4867 switch (r_type)
4868 {
4869 case R_PPC64_PLT16_HA:
4870 case R_PPC64_GOT_TLSLD16_HA:
4871 case R_PPC64_GOT_TLSGD16_HA:
4872 case R_PPC64_GOT_TPREL16_HA:
4873 case R_PPC64_GOT_DTPREL16_HA:
4874 case R_PPC64_GOT16_HA:
4875 case R_PPC64_TOC16_HA:
4876 case R_PPC64_PLT16_LO:
4877 case R_PPC64_PLT16_LO_DS:
4878 case R_PPC64_GOT_TLSLD16_LO:
4879 case R_PPC64_GOT_TLSGD16_LO:
4880 case R_PPC64_GOT_TPREL16_LO_DS:
4881 case R_PPC64_GOT_DTPREL16_LO_DS:
4882 case R_PPC64_GOT16_LO:
4883 case R_PPC64_GOT16_LO_DS:
4884 case R_PPC64_TOC16_LO:
4885 case R_PPC64_TOC16_LO_DS:
4886 case R_PPC64_GOT_PCREL34:
4887 ppc64_elf_tdata (abfd)->has_optrel = 1;
4888 ppc64_elf_section_data (sec)->has_optrel = 1;
4889 break;
4890 default:
4891 break;
4892 }
4893
f749f26e 4894 ifunc = NULL;
25f23106
AM
4895 if (h != NULL)
4896 {
4897 if (h->type == STT_GNU_IFUNC)
4898 {
4899 h->needs_plt = 1;
4900 ifunc = &h->plt.plist;
4901 }
4902 }
4903 else
4904 {
25f23106
AM
4905 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4906 {
4907 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4908 rel->r_addend,
37da22e5 4909 NON_GOT | PLT_IFUNC);
25f23106 4910 if (ifunc == NULL)
0a1b45a2 4911 return false;
25f23106
AM
4912 }
4913 }
727fc41e 4914
f749f26e 4915 tls_type = 0;
a33d1f77 4916 switch (r_type)
5bd4f169 4917 {
727fc41e
AM
4918 case R_PPC64_TLSGD:
4919 case R_PPC64_TLSLD:
4920 /* These special tls relocs tie a call to __tls_get_addr with
4921 its parameter symbol. */
37da22e5 4922 if (h != NULL)
ed7007c1 4923 ppc_elf_hash_entry (h)->tls_mask |= TLS_TLS | TLS_MARK;
37da22e5
AM
4924 else
4925 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 4926 rel->r_addend,
37da22e5 4927 NON_GOT | TLS_TLS | TLS_MARK))
0a1b45a2 4928 return false;
37da22e5 4929 sec->has_tls_reloc = 1;
727fc41e
AM
4930 break;
4931
411e1bfb
AM
4932 case R_PPC64_GOT_TLSLD16:
4933 case R_PPC64_GOT_TLSLD16_LO:
4934 case R_PPC64_GOT_TLSLD16_HI:
4935 case R_PPC64_GOT_TLSLD16_HA:
87c69f97 4936 case R_PPC64_GOT_TLSLD_PCREL34:
951fd09b 4937 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
4938 goto dogottls;
4939
4940 case R_PPC64_GOT_TLSGD16:
4941 case R_PPC64_GOT_TLSGD16_LO:
4942 case R_PPC64_GOT_TLSGD16_HI:
4943 case R_PPC64_GOT_TLSGD16_HA:
87c69f97 4944 case R_PPC64_GOT_TLSGD_PCREL34:
951fd09b 4945 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
4946 goto dogottls;
4947
4948 case R_PPC64_GOT_TPREL16_DS:
4949 case R_PPC64_GOT_TPREL16_LO_DS:
4950 case R_PPC64_GOT_TPREL16_HI:
4951 case R_PPC64_GOT_TPREL16_HA:
87c69f97 4952 case R_PPC64_GOT_TPREL_PCREL34:
7c8bbca5 4953 if (bfd_link_dll (info))
411e1bfb
AM
4954 info->flags |= DF_STATIC_TLS;
4955 tls_type = TLS_TLS | TLS_TPREL;
4956 goto dogottls;
4957
4958 case R_PPC64_GOT_DTPREL16_DS:
4959 case R_PPC64_GOT_DTPREL16_LO_DS:
4960 case R_PPC64_GOT_DTPREL16_HI:
4961 case R_PPC64_GOT_DTPREL16_HA:
87c69f97 4962 case R_PPC64_GOT_DTPREL_PCREL34:
411e1bfb
AM
4963 tls_type = TLS_TLS | TLS_DTPREL;
4964 dogottls:
4965 sec->has_tls_reloc = 1;
066f4018 4966 goto dogot;
411e1bfb 4967
903b777d
AM
4968 case R_PPC64_GOT16:
4969 case R_PPC64_GOT16_LO:
4970 case R_PPC64_GOT16_HI:
65f38f15 4971 case R_PPC64_GOT16_HA:
903b777d 4972 case R_PPC64_GOT16_DS:
066f4018 4973 case R_PPC64_GOT16_LO_DS:
4a421c53 4974 case R_PPC64_GOT_PCREL34:
066f4018 4975 dogot:
65f38f15 4976 /* This symbol requires a global offset table entry. */
4c52953f 4977 sec->has_toc_reloc = 1;
33c0ec9d
AM
4978 if (r_type == R_PPC64_GOT_TLSLD16
4979 || r_type == R_PPC64_GOT_TLSGD16
4980 || r_type == R_PPC64_GOT_TPREL16_DS
4981 || r_type == R_PPC64_GOT_DTPREL16_DS
4982 || r_type == R_PPC64_GOT16
4983 || r_type == R_PPC64_GOT16_DS)
4984 {
4985 htab->do_multi_toc = 1;
d77c8a4b 4986 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
33c0ec9d
AM
4987 }
4988
e717da7e
AM
4989 if (ppc64_elf_tdata (abfd)->got == NULL
4990 && !create_got_section (abfd, info))
0a1b45a2 4991 return false;
5bd4f169
AM
4992
4993 if (h != NULL)
4994 {
411e1bfb
AM
4995 struct ppc_link_hash_entry *eh;
4996 struct got_entry *ent;
65f38f15 4997
ed7007c1 4998 eh = ppc_elf_hash_entry (h);
411e1bfb 4999 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
133a1f60 5000 if (ent->addend == rel->r_addend
e717da7e 5001 && ent->owner == abfd
411e1bfb
AM
5002 && ent->tls_type == tls_type)
5003 break;
5004 if (ent == NULL)
5bd4f169 5005 {
986f0783 5006 size_t amt = sizeof (*ent);
4ce794b7 5007 ent = bfd_alloc (abfd, amt);
411e1bfb 5008 if (ent == NULL)
0a1b45a2 5009 return false;
411e1bfb 5010 ent->next = eh->elf.got.glist;
133a1f60 5011 ent->addend = rel->r_addend;
e717da7e 5012 ent->owner = abfd;
411e1bfb 5013 ent->tls_type = tls_type;
0a1b45a2 5014 ent->is_indirect = false;
411e1bfb
AM
5015 ent->got.refcount = 0;
5016 eh->elf.got.glist = ent;
5bd4f169 5017 }
411e1bfb 5018 ent->got.refcount += 1;
e7b938ca 5019 eh->tls_mask |= tls_type;
5bd4f169 5020 }
411e1bfb
AM
5021 else
5022 /* This is a global offset table entry for a local symbol. */
5023 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 5024 rel->r_addend, tls_type))
0a1b45a2 5025 return false;
5bd4f169
AM
5026 break;
5027
5bd4f169 5028 case R_PPC64_PLT16_HA:
65f38f15
AM
5029 case R_PPC64_PLT16_HI:
5030 case R_PPC64_PLT16_LO:
08be3224 5031 case R_PPC64_PLT16_LO_DS:
5663e321
AM
5032 case R_PPC64_PLT_PCREL34:
5033 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
5034 case R_PPC64_PLT32:
5035 case R_PPC64_PLT64:
cbf95972
AM
5036 /* This symbol requires a procedure linkage table entry. */
5037 plt_list = ifunc;
5038 if (h != NULL)
e054468f 5039 {
e054468f
AM
5040 h->needs_plt = 1;
5041 if (h->root.root.string[0] == '.'
5042 && h->root.root.string[1] != '\0')
ed7007c1
AM
5043 ppc_elf_hash_entry (h)->is_func = 1;
5044 ppc_elf_hash_entry (h)->tls_mask |= PLT_KEEP;
cbf95972
AM
5045 plt_list = &h->plt.plist;
5046 }
5047 if (plt_list == NULL)
2d7ad24e 5048 plt_list = update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 5049 rel->r_addend,
2d7ad24e 5050 NON_GOT | PLT_KEEP);
133a1f60 5051 if (!update_plt_info (abfd, plt_list, rel->r_addend))
0a1b45a2 5052 return false;
5bd4f169
AM
5053 break;
5054
5055 /* The following relocations don't need to propagate the
5056 relocation if linking a shared object since they are
5057 section relative. */
5058 case R_PPC64_SECTOFF:
5059 case R_PPC64_SECTOFF_LO:
5060 case R_PPC64_SECTOFF_HI:
5061 case R_PPC64_SECTOFF_HA:
5062 case R_PPC64_SECTOFF_DS:
5063 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
5064 case R_PPC64_DTPREL16:
5065 case R_PPC64_DTPREL16_LO:
5066 case R_PPC64_DTPREL16_HI:
5067 case R_PPC64_DTPREL16_HA:
5068 case R_PPC64_DTPREL16_DS:
5069 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
5070 case R_PPC64_DTPREL16_HIGH:
5071 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
5072 case R_PPC64_DTPREL16_HIGHER:
5073 case R_PPC64_DTPREL16_HIGHERA:
5074 case R_PPC64_DTPREL16_HIGHEST:
5075 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
5076 break;
5077
ad8e1ba5 5078 /* Nor do these. */
25f23106
AM
5079 case R_PPC64_REL16:
5080 case R_PPC64_REL16_LO:
5081 case R_PPC64_REL16_HI:
5082 case R_PPC64_REL16_HA:
4a969973
AM
5083 case R_PPC64_REL16_HIGH:
5084 case R_PPC64_REL16_HIGHA:
5085 case R_PPC64_REL16_HIGHER:
5086 case R_PPC64_REL16_HIGHERA:
5087 case R_PPC64_REL16_HIGHEST:
5088 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
5089 case R_PPC64_REL16_HIGHER34:
5090 case R_PPC64_REL16_HIGHERA34:
5091 case R_PPC64_REL16_HIGHEST34:
5092 case R_PPC64_REL16_HIGHESTA34:
a680de9a 5093 case R_PPC64_REL16DX_HA:
25f23106
AM
5094 break;
5095
45965137
AM
5096 /* Not supported as a dynamic relocation. */
5097 case R_PPC64_ADDR64_LOCAL:
0e1862bb 5098 if (bfd_link_pic (info))
45965137
AM
5099 {
5100 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5101 ppc_howto_init ();
695344c0 5102 /* xgettext:c-format */
174d0a74 5103 info->callbacks->einfo (_("%H: %s reloc unsupported "
cf97bcb0 5104 "in shared libraries and PIEs\n"),
45965137
AM
5105 abfd, sec, rel->r_offset,
5106 ppc64_elf_howto_table[r_type]->name);
5107 bfd_set_error (bfd_error_bad_value);
0a1b45a2 5108 return false;
45965137
AM
5109 }
5110 break;
5111
ad8e1ba5 5112 case R_PPC64_TOC16:
33c0ec9d
AM
5113 case R_PPC64_TOC16_DS:
5114 htab->do_multi_toc = 1;
d77c8a4b 5115 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
1a0670f3 5116 /* Fall through. */
ad8e1ba5
AM
5117 case R_PPC64_TOC16_LO:
5118 case R_PPC64_TOC16_HI:
5119 case R_PPC64_TOC16_HA:
ad8e1ba5 5120 case R_PPC64_TOC16_LO_DS:
4c52953f 5121 sec->has_toc_reloc = 1;
ec73ddcd 5122 if (h != NULL && bfd_link_executable (info))
1bdd8fac
AM
5123 {
5124 /* We may need a copy reloc. */
5125 h->non_got_ref = 1;
5126 /* Strongly prefer a copy reloc over a dynamic reloc.
5127 glibc ld.so as of 2019-08 will error out if one of
5128 these relocations is emitted. */
5129 h->needs_copy = 1;
5130 goto dodyn;
5131 }
ad8e1ba5
AM
5132 break;
5133
006589cf
AM
5134 /* Marker reloc. */
5135 case R_PPC64_ENTRY:
5136 break;
5137
5bd4f169
AM
5138 /* This relocation describes the C++ object vtable hierarchy.
5139 Reconstruct it for later use during GC. */
5140 case R_PPC64_GNU_VTINHERIT:
c152c796 5141 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
0a1b45a2 5142 return false;
5bd4f169
AM
5143 break;
5144
5145 /* This relocation describes which C++ vtable entries are actually
5146 used. Record for later use during GC. */
5147 case R_PPC64_GNU_VTENTRY:
a0ea3a14 5148 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
0a1b45a2 5149 return false;
5bd4f169
AM
5150 break;
5151
721956f4
AM
5152 case R_PPC64_REL14:
5153 case R_PPC64_REL14_BRTAKEN:
5154 case R_PPC64_REL14_BRNTAKEN:
220c76dd
AM
5155 {
5156 asection *dest = NULL;
5157
5158 /* Heuristic: If jumping outside our section, chances are
5159 we are going to need a stub. */
5160 if (h != NULL)
5161 {
5162 /* If the sym is weak it may be overridden later, so
5163 don't assume we know where a weak sym lives. */
5164 if (h->root.type == bfd_link_hash_defined)
5165 dest = h->root.u.def.section;
5166 }
5167 else
3a3a4c1f 5168 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
87d72d41 5169
220c76dd 5170 if (dest != sec)
7c8fe5c4 5171 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
220c76dd 5172 }
3e04d765
AM
5173 goto rel24;
5174
5175 case R_PPC64_PLTCALL:
5663e321 5176 case R_PPC64_PLTCALL_NOTOC:
3e04d765 5177 ppc64_elf_section_data (sec)->has_pltcall = 1;
721956f4
AM
5178 /* Fall through. */
5179
5d1634d7 5180 case R_PPC64_REL24:
05d0e962 5181 case R_PPC64_REL24_NOTOC:
7aba54da 5182 case R_PPC64_REL24_P9NOTOC:
3e04d765 5183 rel24:
cbf95972
AM
5184 plt_list = ifunc;
5185 if (h != NULL)
5d1634d7 5186 {
e054468f
AM
5187 h->needs_plt = 1;
5188 if (h->root.root.string[0] == '.'
5189 && h->root.root.string[1] != '\0')
ed7007c1 5190 ppc_elf_hash_entry (h)->is_func = 1;
cbf95972 5191
3a71aa26 5192 if (h == tga || h == dottga)
cbf95972
AM
5193 {
5194 sec->has_tls_reloc = 1;
5195 if (rel != relocs
5196 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5197 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5198 /* We have a new-style __tls_get_addr call with
5199 a marker reloc. */
5200 ;
5201 else
5202 /* Mark this section as having an old-style call. */
9737e8af 5203 sec->nomark_tls_get_addr = 1;
cbf95972
AM
5204 }
5205 plt_list = &h->plt.plist;
411e1bfb 5206 }
cbf95972
AM
5207
5208 /* We may need a .plt entry if the function this reloc
5209 refers to is in a shared lib. */
5210 if (plt_list
133a1f60 5211 && !update_plt_info (abfd, plt_list, rel->r_addend))
0a1b45a2 5212 return false;
411e1bfb
AM
5213 break;
5214
cbf95972
AM
5215 case R_PPC64_ADDR14:
5216 case R_PPC64_ADDR14_BRNTAKEN:
5217 case R_PPC64_ADDR14_BRTAKEN:
5218 case R_PPC64_ADDR24:
5219 goto dodyn;
5220
411e1bfb
AM
5221 case R_PPC64_TPREL64:
5222 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
7c8bbca5 5223 if (bfd_link_dll (info))
411e1bfb
AM
5224 info->flags |= DF_STATIC_TLS;
5225 goto dotlstoc;
5226
5227 case R_PPC64_DTPMOD64:
5228 if (rel + 1 < rel_end
5229 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5230 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 5231 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 5232 else
951fd09b 5233 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
5234 goto dotlstoc;
5235
5236 case R_PPC64_DTPREL64:
5237 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5238 if (rel != relocs
5239 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5240 && rel[-1].r_offset == rel->r_offset - 8)
5241 /* This is the second reloc of a dtpmod, dtprel pair.
5242 Don't mark with TLS_DTPREL. */
5243 goto dodyn;
5244
5245 dotlstoc:
5246 sec->has_tls_reloc = 1;
5247 if (h != NULL)
ed7007c1 5248 ppc_elf_hash_entry (h)->tls_mask |= tls_type & 0xff;
411e1bfb
AM
5249 else
5250 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
133a1f60 5251 rel->r_addend, tls_type))
0a1b45a2 5252 return false;
411e1bfb 5253
7c8fe5c4 5254 ppc64_sec = ppc64_elf_section_data (sec);
6313825c 5255 if (ppc64_sec->sec_type == sec_normal)
411e1bfb 5256 {
3a71aa26
AM
5257 bfd_size_type amt;
5258
e7b938ca 5259 /* One extra to simplify get_tls_mask. */
3a71aa26
AM
5260 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5261 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5262 if (ppc64_sec->u.toc.symndx == NULL)
0a1b45a2 5263 return false;
3a71aa26
AM
5264 amt = sec->size * sizeof (bfd_vma) / 8;
5265 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5266 if (ppc64_sec->u.toc.add == NULL)
0a1b45a2 5267 return false;
7c8fe5c4 5268 ppc64_sec->sec_type = sec_toc;
411e1bfb 5269 }
6313825c
AM
5270 if (ppc64_sec->sec_type != sec_toc
5271 || rel->r_offset % 8 != 0)
5272 {
5273 info->callbacks->einfo (_("%H: %s reloc unsupported here\n"),
5274 abfd, sec, rel->r_offset,
5275 ppc64_elf_howto_table[r_type]->name);
5276 bfd_set_error (bfd_error_bad_value);
5277 return false;
5278 }
3a71aa26 5279 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
133a1f60 5280 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
951fd09b
AM
5281
5282 /* Mark the second slot of a GD or LD entry.
5283 -1 to indicate GD and -2 to indicate LD. */
5284 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
3a71aa26 5285 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
951fd09b 5286 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
3a71aa26 5287 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
5288 goto dodyn;
5289
411e1bfb
AM
5290 case R_PPC64_TPREL16_HI:
5291 case R_PPC64_TPREL16_HA:
f9c6b907
AM
5292 case R_PPC64_TPREL16_HIGH:
5293 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
5294 case R_PPC64_TPREL16_HIGHER:
5295 case R_PPC64_TPREL16_HIGHERA:
5296 case R_PPC64_TPREL16_HIGHEST:
5297 case R_PPC64_TPREL16_HIGHESTA:
252dcdf4
AM
5298 sec->has_tls_reloc = 1;
5299 /* Fall through. */
c213164a 5300 case R_PPC64_TPREL34:
252dcdf4
AM
5301 case R_PPC64_TPREL16:
5302 case R_PPC64_TPREL16_DS:
5303 case R_PPC64_TPREL16_LO:
5304 case R_PPC64_TPREL16_LO_DS:
7c8bbca5
AM
5305 if (bfd_link_dll (info))
5306 info->flags |= DF_STATIC_TLS;
5307 goto dodyn;
5d1634d7 5308
e86ce104 5309 case R_PPC64_ADDR64:
b9399fcf 5310 if (is_opd
1e2f5b6e 5311 && rel + 1 < rel_end
4ce794b7 5312 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
1e2f5b6e 5313 {
8387904d 5314 if (h != NULL)
ed7007c1 5315 ppc_elf_hash_entry (h)->is_func = 1;
1e2f5b6e 5316 }
e86ce104
AM
5317 /* Fall through. */
5318
65f38f15
AM
5319 case R_PPC64_ADDR16:
5320 case R_PPC64_ADDR16_DS:
5321 case R_PPC64_ADDR16_HA:
5322 case R_PPC64_ADDR16_HI:
f9c6b907
AM
5323 case R_PPC64_ADDR16_HIGH:
5324 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
5325 case R_PPC64_ADDR16_HIGHER:
5326 case R_PPC64_ADDR16_HIGHERA:
5327 case R_PPC64_ADDR16_HIGHEST:
5328 case R_PPC64_ADDR16_HIGHESTA:
5329 case R_PPC64_ADDR16_LO:
5330 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
5331 case R_PPC64_D34:
5332 case R_PPC64_D34_LO:
5333 case R_PPC64_D34_HI30:
5334 case R_PPC64_D34_HA30:
5335 case R_PPC64_ADDR16_HIGHER34:
5336 case R_PPC64_ADDR16_HIGHERA34:
5337 case R_PPC64_ADDR16_HIGHEST34:
5338 case R_PPC64_ADDR16_HIGHESTA34:
5339 case R_PPC64_D28:
0e1862bb 5340 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
a345bc8d
AM
5341 && rel->r_addend == 0)
5342 {
5343 /* We may need a .plt entry if this reloc refers to a
5344 function in a shared lib. */
5663e321 5345 if (!update_plt_info (abfd, &h->plt.plist, 0))
0a1b45a2 5346 return false;
a345bc8d
AM
5347 h->pointer_equality_needed = 1;
5348 }
5349 /* Fall through. */
5350
5351 case R_PPC64_REL30:
5352 case R_PPC64_REL32:
5353 case R_PPC64_REL64:
65f38f15 5354 case R_PPC64_ADDR32:
65f38f15
AM
5355 case R_PPC64_UADDR16:
5356 case R_PPC64_UADDR32:
5357 case R_PPC64_UADDR64:
5bd4f169 5358 case R_PPC64_TOC:
ec73ddcd 5359 if (h != NULL && bfd_link_executable (info))
81848ca0 5360 /* We may need a copy reloc. */
f5385ebf 5361 h->non_got_ref = 1;
81848ca0 5362
41bd81ab 5363 /* Don't propagate .opd relocs. */
b9399fcf 5364 if (NO_OPD_RELOCS && is_opd)
e86ce104 5365 break;
e86ce104 5366
c99d782d
AM
5367 /* Set up information for symbols that might need dynamic
5368 relocations. At this point in linking we have read all
5369 the input files and resolved most symbols, but have not
5370 yet decided whether symbols are dynamic or finalized
5371 symbol flags. In some cases we might be setting dynamic
5372 reloc info for symbols that do not end up needing such.
5373 That's OK, adjust_dynamic_symbol and allocate_dynrelocs
5374 work together with this code. */
411e1bfb 5375 dodyn:
ec73ddcd 5376 if ((h != NULL
c99d782d 5377 && !SYMBOL_REFERENCES_LOCAL (info, h))
ec73ddcd 5378 || (bfd_link_pic (info)
3a3a4c1f
AM
5379 && (h != NULL
5380 ? !bfd_is_abs_symbol (&h->root)
5381 : isym->st_shndx != SHN_ABS)
ec73ddcd 5382 && must_be_dyn_reloc (info, r_type))
0e1862bb 5383 || (!bfd_link_pic (info)
25f23106 5384 && ifunc != NULL))
5bd4f169 5385 {
65f38f15
AM
5386 /* We must copy these reloc types into the output file.
5387 Create a reloc section in dynobj and make room for
5388 this reloc. */
5bd4f169
AM
5389 if (sreloc == NULL)
5390 {
83bac4b0 5391 sreloc = _bfd_elf_make_dynamic_reloc_section
0a1b45a2 5392 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ true);
65f38f15 5393
5bd4f169 5394 if (sreloc == NULL)
0a1b45a2 5395 return false;
5bd4f169
AM
5396 }
5397
65f38f15
AM
5398 /* If this is a global symbol, we count the number of
5399 relocations we need for this symbol. */
5400 if (h != NULL)
5401 {
1657026c
AM
5402 struct ppc_dyn_relocs *p;
5403 struct ppc_dyn_relocs **head;
19e08130 5404
1657026c 5405 head = (struct ppc_dyn_relocs **) &h->dyn_relocs;
19e08130
AM
5406 p = *head;
5407 if (p == NULL || p->sec != sec)
5408 {
5409 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5410 if (p == NULL)
0a1b45a2 5411 return false;
19e08130
AM
5412 p->next = *head;
5413 *head = p;
5414 p->sec = sec;
5415 p->count = 0;
5416 p->pc_count = 0;
1657026c 5417 p->rel_count = 0;
19e08130
AM
5418 }
5419 p->count += 1;
5420 if (!must_be_dyn_reloc (info, r_type))
5421 p->pc_count += 1;
f91074eb 5422 if (maybe_relr (r_type, rel, sec))
1657026c 5423 p->rel_count += 1;
65f38f15
AM
5424 }
5425 else
5426 {
3a3a4c1f 5427 /* Track dynamic relocs needed for local syms too. */
1657026c
AM
5428 struct ppc_local_dyn_relocs *p;
5429 struct ppc_local_dyn_relocs **head;
0a1b45a2 5430 bool is_ifunc;
ec338859 5431 asection *s;
6edfbbad 5432 void *vpp;
ec338859 5433
87d72d41
AM
5434 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5435 if (s == NULL)
5436 s = sec;
5437
6edfbbad 5438 vpp = &elf_section_data (s)->local_dynrel;
1657026c 5439 head = (struct ppc_local_dyn_relocs **) vpp;
19e08130
AM
5440 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5441 p = *head;
5442 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5443 p = p->next;
5444 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5445 {
5446 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5447 if (p == NULL)
0a1b45a2 5448 return false;
19e08130
AM
5449 p->next = *head;
5450 *head = p;
5451 p->sec = sec;
19e08130 5452 p->count = 0;
1657026c
AM
5453 p->rel_count = 0;
5454 p->ifunc = is_ifunc;
19e08130
AM
5455 }
5456 p->count += 1;
f91074eb 5457 if (maybe_relr (r_type, rel, sec))
1657026c 5458 p->rel_count += 1;
ec338859 5459 }
65f38f15 5460 }
5bd4f169 5461 break;
65f38f15
AM
5462
5463 default:
96e0dda4 5464 break;
5bd4f169
AM
5465 }
5466 }
5467
0a1b45a2 5468 return true;
5bd4f169
AM
5469}
5470
ee67d69a
AM
5471/* Merge backend specific data from an object file to the output
5472 object file when linking. */
5473
0a1b45a2 5474static bool
50e03d47 5475ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
ee67d69a 5476{
50e03d47 5477 bfd *obfd = info->output_bfd;
ee67d69a
AM
5478 unsigned long iflags, oflags;
5479
5480 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
0a1b45a2 5481 return true;
ee67d69a
AM
5482
5483 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
0a1b45a2 5484 return true;
ee67d69a 5485
50e03d47 5486 if (!_bfd_generic_verify_endian_match (ibfd, info))
0a1b45a2 5487 return false;
ee67d69a
AM
5488
5489 iflags = elf_elfheader (ibfd)->e_flags;
5490 oflags = elf_elfheader (obfd)->e_flags;
5491
f6c7c3e8 5492 if (iflags & ~EF_PPC64_ABI)
ee67d69a 5493 {
4eca0228 5494 _bfd_error_handler
695344c0 5495 /* xgettext:c-format */
871b3ab2 5496 (_("%pB uses unknown e_flags 0x%lx"), ibfd, iflags);
ee67d69a 5497 bfd_set_error (bfd_error_bad_value);
0a1b45a2 5498 return false;
ee67d69a 5499 }
f6c7c3e8 5500 else if (iflags != oflags && iflags != 0)
ee67d69a 5501 {
4eca0228 5502 _bfd_error_handler
695344c0 5503 /* xgettext:c-format */
871b3ab2 5504 (_("%pB: ABI version %ld is not compatible with ABI version %ld output"),
ee67d69a
AM
5505 ibfd, iflags, oflags);
5506 bfd_set_error (bfd_error_bad_value);
0a1b45a2 5507 return false;
ee67d69a
AM
5508 }
5509
4a91d0ba 5510 if (!_bfd_elf_ppc_merge_fp_attributes (ibfd, info))
0a1b45a2 5511 return false;
005d79fd 5512
ee67d69a 5513 /* Merge Tag_compatibility attributes and any common GNU ones. */
8d2c8c3d 5514 return _bfd_elf_merge_object_attributes (ibfd, info);
ee67d69a
AM
5515}
5516
0a1b45a2 5517static bool
ee67d69a
AM
5518ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
5519{
5520 /* Print normal ELF private data. */
5521 _bfd_elf_print_private_bfd_data (abfd, ptr);
5522
5523 if (elf_elfheader (abfd)->e_flags != 0)
5524 {
5525 FILE *file = ptr;
5526
ee67d69a
AM
5527 fprintf (file, _("private flags = 0x%lx:"),
5528 elf_elfheader (abfd)->e_flags);
5529
5530 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
5531 fprintf (file, _(" [abiv%ld]"),
5532 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
5533 fputc ('\n', file);
5534 }
5535
0a1b45a2 5536 return true;
ee67d69a
AM
5537}
5538
8387904d 5539/* OFFSET in OPD_SEC specifies a function descriptor. Return the address
b53dfeb2
AM
5540 of the code entry point, and its section, which must be in the same
5541 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
8387904d
AM
5542
5543static bfd_vma
5544opd_entry_value (asection *opd_sec,
5545 bfd_vma offset,
5546 asection **code_sec,
aef36ac1 5547 bfd_vma *code_off,
0a1b45a2 5548 bool in_code_sec)
8387904d
AM
5549{
5550 bfd *opd_bfd = opd_sec->owner;
8860955f 5551 Elf_Internal_Rela *relocs;
8387904d 5552 Elf_Internal_Rela *lo, *hi, *look;
645ea6a9 5553 bfd_vma val;
8387904d 5554
6313825c
AM
5555 if (!is_ppc64_elf (opd_bfd))
5556 return (bfd_vma) -1;
5557
5558 if (ppc64_elf_section_data (opd_sec)->sec_type == sec_normal)
5559 ppc64_elf_section_data (opd_sec)->sec_type = sec_opd;
5560 else if (ppc64_elf_section_data (opd_sec)->sec_type != sec_opd)
5561 return (bfd_vma) -1;
5562
9f296da3
AM
5563 /* No relocs implies we are linking a --just-symbols object, or looking
5564 at a final linked executable with addr2line or somesuch. */
4b85d634
AM
5565 if (opd_sec->reloc_count == 0)
5566 {
6313825c 5567 bfd_byte *contents = ppc64_elf_section_data (opd_sec)->u.opd.u.contents;
3b36f7e6 5568
729eabd5
AM
5569 if (contents == NULL)
5570 {
81ff113f
AM
5571 if ((opd_sec->flags & SEC_HAS_CONTENTS) == 0
5572 || !bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
729eabd5 5573 return (bfd_vma) -1;
6313825c 5574 ppc64_elf_section_data (opd_sec)->u.opd.u.contents = contents;
729eabd5 5575 }
ee1e4ede 5576
dbb3fbbb 5577 /* PR 17512: file: 64b9dfbb. */
451dfd38 5578 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
dbb3fbbb
NC
5579 return (bfd_vma) -1;
5580
729eabd5 5581 val = bfd_get_64 (opd_bfd, contents + offset);
aef36ac1
AM
5582 if (code_sec != NULL)
5583 {
5584 asection *sec, *likely = NULL;
ee1e4ede 5585
aef36ac1 5586 if (in_code_sec)
4b85d634 5587 {
aef36ac1
AM
5588 sec = *code_sec;
5589 if (sec->vma <= val
5590 && val < sec->vma + sec->size)
5591 likely = sec;
5592 else
5593 val = -1;
5594 }
5595 else
5596 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5597 if (sec->vma <= val
5598 && (sec->flags & SEC_LOAD) != 0
5599 && (sec->flags & SEC_ALLOC) != 0)
5600 likely = sec;
5601 if (likely != NULL)
5602 {
5603 *code_sec = likely;
5604 if (code_off != NULL)
5605 *code_off = val - likely->vma;
4b85d634
AM
5606 }
5607 }
aef36ac1 5608 return val;
4b85d634
AM
5609 }
5610
6313825c 5611 relocs = ppc64_elf_section_data (opd_sec)->u.opd.u.relocs;
8860955f 5612 if (relocs == NULL)
0a1b45a2 5613 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, true);
877a8638
NC
5614 /* PR 17512: file: df8e1fd6. */
5615 if (relocs == NULL)
5616 return (bfd_vma) -1;
645ea6a9 5617
8387904d 5618 /* Go find the opd reloc at the sym address. */
8860955f 5619 lo = relocs;
8387904d 5620 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
645ea6a9 5621 val = (bfd_vma) -1;
8387904d
AM
5622 while (lo < hi)
5623 {
5624 look = lo + (hi - lo) / 2;
5625 if (look->r_offset < offset)
5626 lo = look + 1;
5627 else if (look->r_offset > offset)
5628 hi = look;
5629 else
5630 {
0ffa91dd
NC
5631 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5632
8387904d
AM
5633 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5634 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5635 {
5636 unsigned long symndx = ELF64_R_SYM (look->r_info);
b53dfeb2 5637 asection *sec = NULL;
8387904d 5638
b53dfeb2
AM
5639 if (symndx >= symtab_hdr->sh_info
5640 && elf_sym_hashes (opd_bfd) != NULL)
8387904d
AM
5641 {
5642 struct elf_link_hash_entry **sym_hashes;
5643 struct elf_link_hash_entry *rh;
5644
5645 sym_hashes = elf_sym_hashes (opd_bfd);
5646 rh = sym_hashes[symndx - symtab_hdr->sh_info];
128205bb
AM
5647 if (rh != NULL)
5648 {
5649 rh = elf_follow_link (rh);
bb854a36
AM
5650 if (rh->root.type != bfd_link_hash_defined
5651 && rh->root.type != bfd_link_hash_defweak)
5652 break;
5653 if (rh->root.u.def.section->owner == opd_bfd)
b53dfeb2 5654 {
bb854a36
AM
5655 val = rh->root.u.def.value;
5656 sec = rh->root.u.def.section;
b53dfeb2
AM
5657 }
5658 }
5659 }
5660
5661 if (sec == NULL)
5662 {
5663 Elf_Internal_Sym *sym;
5664
5665 if (symndx < symtab_hdr->sh_info)
5666 {
5667 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5668 if (sym == NULL)
5669 {
5670 size_t symcnt = symtab_hdr->sh_info;
5671 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5672 symcnt, 0,
5673 NULL, NULL, NULL);
5674 if (sym == NULL)
5675 break;
5676 symtab_hdr->contents = (bfd_byte *) sym;
5677 }
5678 sym += symndx;
128205bb
AM
5679 }
5680 else
5681 {
b53dfeb2
AM
5682 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5683 1, symndx,
5684 NULL, NULL, NULL);
128205bb
AM
5685 if (sym == NULL)
5686 break;
128205bb 5687 }
b53dfeb2
AM
5688 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5689 if (sec == NULL)
5690 break;
5691 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5692 val = sym->st_value;
8387904d 5693 }
b53dfeb2 5694
8387904d
AM
5695 val += look->r_addend;
5696 if (code_off != NULL)
5697 *code_off = val;
5698 if (code_sec != NULL)
aef36ac1
AM
5699 {
5700 if (in_code_sec && *code_sec != sec)
5701 return -1;
5702 else
5703 *code_sec = sec;
5704 }
b53dfeb2 5705 if (sec->output_section != NULL)
8387904d 5706 val += sec->output_section->vma + sec->output_offset;
8387904d
AM
5707 }
5708 break;
5709 }
5710 }
645ea6a9 5711
645ea6a9 5712 return val;
8387904d
AM
5713}
5714
aef36ac1
AM
5715/* If the ELF symbol SYM might be a function in SEC, return the
5716 function size and set *CODE_OFF to the function's entry point,
5717 otherwise return zero. */
9f296da3 5718
aef36ac1
AM
5719static bfd_size_type
5720ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
5721 bfd_vma *code_off)
9f296da3 5722{
aef36ac1 5723 bfd_size_type size;
24aebc79 5724 elf_symbol_type * elf_sym = (elf_symbol_type *) sym;
aef36ac1
AM
5725
5726 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
5727 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
5728 return 0;
5729
24aebc79
NC
5730 size = (sym->flags & BSF_SYNTHETIC) ? 0 : elf_sym->internal_elf_sym.st_size;
5731
5732 /* In theory we should check that the symbol's type satisfies
5733 _bfd_elf_is_function_type(), but there are some function-like
5734 symbols which would fail this test. (eg _start). Instead
5735 we check for hidden, local, notype symbols with zero size.
5736 This type of symbol is generated by the annobin plugin for gcc
5737 and clang, and should not be considered to be a function symbol. */
5738 if (size == 0
5739 && ((sym->flags & (BSF_SYNTHETIC | BSF_LOCAL)) == BSF_LOCAL)
5740 && ELF_ST_TYPE (elf_sym->internal_elf_sym.st_info) == STT_NOTYPE
5741 && ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other) == STV_HIDDEN)
5742 return 0;
aef36ac1
AM
5743
5744 if (strcmp (sym->section->name, ".opd") == 0)
9f296da3 5745 {
b07bca4e
AM
5746 struct _opd_sec_data *opd = get_opd_info (sym->section);
5747 bfd_vma symval = sym->value;
5748
5749 if (opd != NULL
5750 && opd->adjust != NULL
5751 && elf_section_data (sym->section)->relocs != NULL)
5752 {
5753 /* opd_entry_value will use cached relocs that have been
5754 adjusted, but with raw symbols. That means both local
5755 and global symbols need adjusting. */
5756 long adjust = opd->adjust[OPD_NDX (symval)];
5757 if (adjust == -1)
5758 return 0;
5759 symval += adjust;
5760 }
5761
5762 if (opd_entry_value (sym->section, symval,
0a1b45a2 5763 &sec, code_off, true) == (bfd_vma) -1)
aef36ac1
AM
5764 return 0;
5765 /* An old ABI binary with dot-syms has a size of 24 on the .opd
5766 symbol. This size has nothing to do with the code size of the
5767 function, which is what we're supposed to return, but the
5768 code size isn't available without looking up the dot-sym.
5769 However, doing that would be a waste of time particularly
5770 since elf_find_function will look at the dot-sym anyway.
5771 Now, elf_find_function will keep the largest size of any
5772 function sym found at the code address of interest, so return
5773 1 here to avoid it incorrectly caching a larger function size
5774 for a small function. This does mean we return the wrong
5775 size for a new-ABI function of size 24, but all that does is
5776 disable caching for such functions. */
5777 if (size == 24)
5778 size = 1;
9f296da3 5779 }
aef36ac1
AM
5780 else
5781 {
5782 if (sym->section != sec)
5783 return 0;
5784 *code_off = sym->value;
5785 }
24aebc79
NC
5786
5787 /* Do not return 0 for the function's size. */
5788 return size ? size : 1;
9f296da3
AM
5789}
5790
f378ab09
AM
5791/* Return true if symbol is a strong function defined in an ELFv2
5792 object with st_other localentry bits of zero, ie. its local entry
5793 point coincides with its global entry point. */
5794
0a1b45a2 5795static bool
f378ab09
AM
5796is_elfv2_localentry0 (struct elf_link_hash_entry *h)
5797{
5798 return (h != NULL
5799 && h->type == STT_FUNC
5800 && h->root.type == bfd_link_hash_defined
5801 && (STO_PPC64_LOCAL_MASK & h->other) == 0
ed7007c1 5802 && !ppc_elf_hash_entry (h)->non_zero_localentry
f378ab09
AM
5803 && is_ppc64_elf (h->root.u.def.section->owner)
5804 && abiversion (h->root.u.def.section->owner) >= 2);
5805}
5806
854b41e7
AM
5807/* Return true if symbol is defined in a regular object file. */
5808
0a1b45a2 5809static bool
854b41e7
AM
5810is_static_defined (struct elf_link_hash_entry *h)
5811{
5812 return ((h->root.type == bfd_link_hash_defined
5813 || h->root.type == bfd_link_hash_defweak)
5814 && h->root.u.def.section != NULL
5815 && h->root.u.def.section->output_section != NULL);
5816}
5817
b31867b6
AM
5818/* If FDH is a function descriptor symbol, return the associated code
5819 entry symbol if it is defined. Return NULL otherwise. */
5820
5821static struct ppc_link_hash_entry *
5822defined_code_entry (struct ppc_link_hash_entry *fdh)
5823{
5824 if (fdh->is_func_descriptor)
5825 {
5826 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
5827 if (fh->elf.root.type == bfd_link_hash_defined
5828 || fh->elf.root.type == bfd_link_hash_defweak)
5829 return fh;
5830 }
5831 return NULL;
5832}
5833
5834/* If FH is a function code entry symbol, return the associated
5835 function descriptor symbol if it is defined. Return NULL otherwise. */
5836
5837static struct ppc_link_hash_entry *
5838defined_func_desc (struct ppc_link_hash_entry *fh)
5839{
5840 if (fh->oh != NULL
5841 && fh->oh->is_func_descriptor)
5842 {
5843 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
5844 if (fdh->elf.root.type == bfd_link_hash_defined
5845 || fdh->elf.root.type == bfd_link_hash_defweak)
5846 return fdh;
5847 }
5848 return NULL;
5849}
5850
ed7007c1
AM
5851/* Given H is a symbol that satisfies is_static_defined, return the
5852 value in the output file. */
5853
5854static bfd_vma
5855defined_sym_val (struct elf_link_hash_entry *h)
5856{
5857 return (h->root.u.def.section->output_section->vma
5858 + h->root.u.def.section->output_offset
5859 + h->root.u.def.value);
5860}
5861
5862/* Return true if H matches __tls_get_addr or one of its variants. */
5863
0a1b45a2 5864static bool
ed7007c1
AM
5865is_tls_get_addr (struct elf_link_hash_entry *h,
5866 struct ppc_link_hash_table *htab)
5867{
30845f11
AM
5868 return (h == elf_hash_entry (htab->tls_get_addr_fd)
5869 || h == elf_hash_entry (htab->tga_desc_fd)
5870 || h == elf_hash_entry (htab->tls_get_addr)
5871 || h == elf_hash_entry (htab->tga_desc));
ed7007c1
AM
5872}
5873
0a1b45a2 5874static bool func_desc_adjust (struct elf_link_hash_entry *, void *);
8c5b4e52
AM
5875
5876/* Garbage collect sections, after first dealing with dot-symbols. */
5877
0a1b45a2 5878static bool
8c5b4e52
AM
5879ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
5880{
5881 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5882
5883 if (htab != NULL && htab->need_func_desc_adj)
5884 {
5885 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
5886 htab->need_func_desc_adj = 0;
5887 }
5888 return bfd_elf_gc_sections (abfd, info);
5889}
5890
74f0fb50
AM
5891/* Mark all our entry sym sections, both opd and code section. */
5892
5893static void
5894ppc64_elf_gc_keep (struct bfd_link_info *info)
5895{
5896 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5897 struct bfd_sym_chain *sym;
5898
4dfe6ac6
NC
5899 if (htab == NULL)
5900 return;
5901
74f0fb50
AM
5902 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
5903 {
b31867b6 5904 struct ppc_link_hash_entry *eh, *fh;
74f0fb50
AM
5905 asection *sec;
5906
ed7007c1 5907 eh = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, sym->name,
0a1b45a2 5908 false, false, true));
74f0fb50
AM
5909 if (eh == NULL)
5910 continue;
5911 if (eh->elf.root.type != bfd_link_hash_defined
5912 && eh->elf.root.type != bfd_link_hash_defweak)
5913 continue;
5914
b31867b6
AM
5915 fh = defined_code_entry (eh);
5916 if (fh != NULL)
74f0fb50 5917 {
b31867b6 5918 sec = fh->elf.root.u.def.section;
74f0fb50
AM
5919 sec->flags |= SEC_KEEP;
5920 }
5921 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5922 && opd_entry_value (eh->elf.root.u.def.section,
5923 eh->elf.root.u.def.value,
0a1b45a2 5924 &sec, NULL, false) != (bfd_vma) -1)
74f0fb50
AM
5925 sec->flags |= SEC_KEEP;
5926
5927 sec = eh->elf.root.u.def.section;
5928 sec->flags |= SEC_KEEP;
5929 }
5930}
5931
64d03ab5
AM
5932/* Mark sections containing dynamically referenced symbols. When
5933 building shared libraries, we must assume that any visible symbol is
5934 referenced. */
5935
0a1b45a2 5936static bool
64d03ab5
AM
5937ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
5938{
5939 struct bfd_link_info *info = (struct bfd_link_info *) inf;
ed7007c1 5940 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
b31867b6 5941 struct ppc_link_hash_entry *fdh;
b407645f 5942 struct bfd_elf_dynamic_list *d = info->dynamic_list;
64d03ab5 5943
64d03ab5 5944 /* Dynamic linking info is on the func descriptor sym. */
b31867b6
AM
5945 fdh = defined_func_desc (eh);
5946 if (fdh != NULL)
5947 eh = fdh;
64d03ab5
AM
5948
5949 if ((eh->elf.root.type == bfd_link_hash_defined
5950 || eh->elf.root.type == bfd_link_hash_defweak)
b80e421f
AM
5951 && (!eh->elf.start_stop
5952 || eh->elf.root.ldscript_def
5953 || !info->start_stop_gc)
87e79a65 5954 && ((eh->elf.ref_dynamic && !eh->elf.forced_local)
1c9177d9 5955 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
64d03ab5 5956 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
4c58e0d8 5957 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
0e1862bb 5958 && (!bfd_link_executable (info)
e278ae05 5959 || info->gc_keep_exported
b407645f
AM
5960 || info->export_dynamic
5961 || (eh->elf.dynamic
5962 && d != NULL
2cdcc330
AM
5963 && (*d->match) (&d->head, NULL,
5964 eh->elf.root.root.string)))
e278ae05 5965 && (eh->elf.versioned >= versioned
4c58e0d8
AM
5966 || !bfd_hide_sym_by_version (info->version_info,
5967 eh->elf.root.root.string)))))
64d03ab5
AM
5968 {
5969 asection *code_sec;
b31867b6 5970 struct ppc_link_hash_entry *fh;
64d03ab5
AM
5971
5972 eh->elf.root.u.def.section->flags |= SEC_KEEP;
5973
5974 /* Function descriptor syms cause the associated
5975 function code sym section to be marked. */
b31867b6
AM
5976 fh = defined_code_entry (eh);
5977 if (fh != NULL)
5978 {
5979 code_sec = fh->elf.root.u.def.section;
5980 code_sec->flags |= SEC_KEEP;
5981 }
64d03ab5
AM
5982 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5983 && opd_entry_value (eh->elf.root.u.def.section,
5984 eh->elf.root.u.def.value,
0a1b45a2 5985 &code_sec, NULL, false) != (bfd_vma) -1)
64d03ab5
AM
5986 code_sec->flags |= SEC_KEEP;
5987 }
5988
0a1b45a2 5989 return true;
64d03ab5
AM
5990}
5991
5bd4f169
AM
5992/* Return the section that should be marked against GC for a given
5993 relocation. */
5994
5995static asection *
4ce794b7 5996ppc64_elf_gc_mark_hook (asection *sec,
fb34365b 5997 struct bfd_link_info *info,
4ce794b7
AM
5998 Elf_Internal_Rela *rel,
5999 struct elf_link_hash_entry *h,
6000 Elf_Internal_Sym *sym)
5bd4f169 6001{
ccfa59ea
AM
6002 asection *rsec;
6003
ccfa59ea
AM
6004 /* Syms return NULL if we're marking .opd, so we avoid marking all
6005 function sections, as all functions are referenced in .opd. */
6006 rsec = NULL;
6007 if (get_opd_info (sec) != NULL)
6008 return rsec;
1e2f5b6e 6009
5bd4f169
AM
6010 if (h != NULL)
6011 {
04c9666a 6012 enum elf_ppc64_reloc_type r_type;
b31867b6 6013 struct ppc_link_hash_entry *eh, *fh, *fdh;
a33d1f77 6014
4ce794b7 6015 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 6016 switch (r_type)
5bd4f169
AM
6017 {
6018 case R_PPC64_GNU_VTINHERIT:
6019 case R_PPC64_GNU_VTENTRY:
6020 break;
6021
6022 default:
6023 switch (h->root.type)
6024 {
6025 case bfd_link_hash_defined:
6026 case bfd_link_hash_defweak:
ed7007c1 6027 eh = ppc_elf_hash_entry (h);
b31867b6
AM
6028 fdh = defined_func_desc (eh);
6029 if (fdh != NULL)
8c5b4e52
AM
6030 {
6031 /* -mcall-aixdesc code references the dot-symbol on
6032 a call reloc. Mark the function descriptor too
6033 against garbage collection. */
6034 fdh->elf.mark = 1;
60d67dc8
AM
6035 if (fdh->elf.is_weakalias)
6036 weakdef (&fdh->elf)->mark = 1;
8c5b4e52
AM
6037 eh = fdh;
6038 }
1e2f5b6e
AM
6039
6040 /* Function descriptor syms cause the associated
6041 function code sym section to be marked. */
b31867b6
AM
6042 fh = defined_code_entry (eh);
6043 if (fh != NULL)
ccfa59ea
AM
6044 {
6045 /* They also mark their opd section. */
74f0fb50 6046 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 6047
b31867b6 6048 rsec = fh->elf.root.u.def.section;
ccfa59ea 6049 }
8387904d
AM
6050 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6051 && opd_entry_value (eh->elf.root.u.def.section,
6052 eh->elf.root.u.def.value,
0a1b45a2 6053 &rsec, NULL, false) != (bfd_vma) -1)
74f0fb50 6054 eh->elf.root.u.def.section->gc_mark = 1;
ccfa59ea 6055 else
1e2f5b6e
AM
6056 rsec = h->root.u.def.section;
6057 break;
5bd4f169
AM
6058
6059 case bfd_link_hash_common:
1e2f5b6e
AM
6060 rsec = h->root.u.c.p->section;
6061 break;
5bd4f169
AM
6062
6063 default:
fb34365b 6064 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5bd4f169
AM
6065 }
6066 }
6067 }
6068 else
6069 {
74f0fb50 6070 struct _opd_sec_data *opd;
1e2f5b6e
AM
6071
6072 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
74f0fb50
AM
6073 opd = get_opd_info (rsec);
6074 if (opd != NULL && opd->func_sec != NULL)
ccfa59ea 6075 {
74f0fb50 6076 rsec->gc_mark = 1;
ccfa59ea 6077
51aecdc5 6078 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
ccfa59ea 6079 }
5bd4f169
AM
6080 }
6081
1e2f5b6e 6082 return rsec;
5bd4f169
AM
6083}
6084
deb0e272
AM
6085/* The maximum size of .sfpr. */
6086#define SFPR_MAX (218*4)
6087
6088struct sfpr_def_parms
6089{
699733f6
AM
6090 const char name[12];
6091 unsigned char lo, hi;
2cdcc330
AM
6092 bfd_byte *(*write_ent) (bfd *, bfd_byte *, int);
6093 bfd_byte *(*write_tail) (bfd *, bfd_byte *, int);
deb0e272
AM
6094};
6095
a4b6fadd
AM
6096/* Auto-generate _save*, _rest* functions in .sfpr.
6097 If STUB_SEC is non-null, define alias symbols in STUB_SEC
6098 instead. */
deb0e272 6099
0a1b45a2 6100static bool
a4b6fadd
AM
6101sfpr_define (struct bfd_link_info *info,
6102 const struct sfpr_def_parms *parm,
6103 asection *stub_sec)
deb0e272
AM
6104{
6105 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6106 unsigned int i;
6107 size_t len = strlen (parm->name);
0a1b45a2 6108 bool writing = false;
699733f6 6109 char sym[16];
deb0e272 6110
4dfe6ac6 6111 if (htab == NULL)
0a1b45a2 6112 return false;
4dfe6ac6 6113
deb0e272
AM
6114 memcpy (sym, parm->name, len);
6115 sym[len + 2] = 0;
6116
6117 for (i = parm->lo; i <= parm->hi; i++)
6118 {
a4b6fadd 6119 struct ppc_link_hash_entry *h;
deb0e272
AM
6120
6121 sym[len + 0] = i / 10 + '0';
6122 sym[len + 1] = i % 10 + '0';
ed7007c1 6123 h = ppc_elf_hash_entry (elf_link_hash_lookup (&htab->elf, sym,
0a1b45a2 6124 writing, true, true));
a4b6fadd 6125 if (stub_sec != NULL)
deb0e272 6126 {
a4b6fadd
AM
6127 if (h != NULL
6128 && h->elf.root.type == bfd_link_hash_defined
6129 && h->elf.root.u.def.section == htab->sfpr)
6130 {
6131 struct elf_link_hash_entry *s;
6132 char buf[32];
6133 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
0a1b45a2 6134 s = elf_link_hash_lookup (&htab->elf, buf, true, true, false);
a4b6fadd 6135 if (s == NULL)
0a1b45a2 6136 return false;
779f2ae7 6137 if (s->root.type == bfd_link_hash_new)
a4b6fadd
AM
6138 {
6139 s->root.type = bfd_link_hash_defined;
6140 s->root.u.def.section = stub_sec;
7dda8d3c 6141 s->root.u.def.value = (stub_sec->size - htab->sfpr->size
a4b6fadd
AM
6142 + h->elf.root.u.def.value);
6143 s->ref_regular = 1;
6144 s->def_regular = 1;
6145 s->ref_regular_nonweak = 1;
6146 s->forced_local = 1;
6147 s->non_elf = 0;
6148 s->root.linker_def = 1;
6149 }
6150 }
6151 continue;
6152 }
6153 if (h != NULL)
6154 {
6155 h->save_res = 1;
6156 if (!h->elf.def_regular)
deb0e272 6157 {
a4b6fadd
AM
6158 h->elf.root.type = bfd_link_hash_defined;
6159 h->elf.root.u.def.section = htab->sfpr;
6160 h->elf.root.u.def.value = htab->sfpr->size;
6161 h->elf.type = STT_FUNC;
6162 h->elf.def_regular = 1;
b32547cd 6163 h->elf.non_elf = 0;
0a1b45a2
AM
6164 _bfd_elf_link_hash_hide_symbol (info, &h->elf, true);
6165 writing = true;
deb0e272 6166 if (htab->sfpr->contents == NULL)
a4b6fadd 6167 {
2cdcc330
AM
6168 htab->sfpr->contents
6169 = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
a4b6fadd 6170 if (htab->sfpr->contents == NULL)
0a1b45a2 6171 return false;
a4b6fadd 6172 }
deb0e272
AM
6173 }
6174 }
6175 if (writing)
6176 {
6177 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6178 if (i != parm->hi)
6179 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6180 else
6181 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6182 htab->sfpr->size = p - htab->sfpr->contents;
6183 }
6184 }
6185
0a1b45a2 6186 return true;
deb0e272
AM
6187}
6188
6189static bfd_byte *
6190savegpr0 (bfd *abfd, bfd_byte *p, int r)
6191{
6192 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6193 return p + 4;
6194}
6195
6196static bfd_byte *
6197savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6198{
6199 p = savegpr0 (abfd, p, r);
a078d95a 6200 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
6201 p = p + 4;
6202 bfd_put_32 (abfd, BLR, p);
6203 return p + 4;
6204}
6205
6206static bfd_byte *
6207restgpr0 (bfd *abfd, bfd_byte *p, int r)
6208{
6209 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6210 return p + 4;
6211}
6212
6213static bfd_byte *
6214restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6215{
a078d95a 6216 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
6217 p = p + 4;
6218 p = restgpr0 (abfd, p, r);
6219 bfd_put_32 (abfd, MTLR_R0, p);
6220 p = p + 4;
6221 if (r == 29)
6222 {
6223 p = restgpr0 (abfd, p, 30);
6224 p = restgpr0 (abfd, p, 31);
6225 }
6226 bfd_put_32 (abfd, BLR, p);
6227 return p + 4;
6228}
6229
6230static bfd_byte *
6231savegpr1 (bfd *abfd, bfd_byte *p, int r)
6232{
6233 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6234 return p + 4;
6235}
6236
6237static bfd_byte *
6238savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6239{
6240 p = savegpr1 (abfd, p, r);
6241 bfd_put_32 (abfd, BLR, p);
6242 return p + 4;
6243}
6244
6245static bfd_byte *
6246restgpr1 (bfd *abfd, bfd_byte *p, int r)
6247{
6248 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6249 return p + 4;
6250}
6251
6252static bfd_byte *
6253restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6254{
6255 p = restgpr1 (abfd, p, r);
6256 bfd_put_32 (abfd, BLR, p);
6257 return p + 4;
6258}
6259
6260static bfd_byte *
6261savefpr (bfd *abfd, bfd_byte *p, int r)
6262{
6263 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6264 return p + 4;
6265}
6266
6267static bfd_byte *
6268savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6269{
6270 p = savefpr (abfd, p, r);
a078d95a 6271 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
deb0e272
AM
6272 p = p + 4;
6273 bfd_put_32 (abfd, BLR, p);
6274 return p + 4;
6275}
6276
6277static bfd_byte *
6278restfpr (bfd *abfd, bfd_byte *p, int r)
6279{
6280 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6281 return p + 4;
6282}
6283
6284static bfd_byte *
6285restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6286{
a078d95a 6287 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
deb0e272
AM
6288 p = p + 4;
6289 p = restfpr (abfd, p, r);
6290 bfd_put_32 (abfd, MTLR_R0, p);
6291 p = p + 4;
6292 if (r == 29)
6293 {
6294 p = restfpr (abfd, p, 30);
6295 p = restfpr (abfd, p, 31);
6296 }
6297 bfd_put_32 (abfd, BLR, p);
6298 return p + 4;
6299}
6300
6301static bfd_byte *
6302savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6303{
6304 p = savefpr (abfd, p, r);
6305 bfd_put_32 (abfd, BLR, p);
6306 return p + 4;
6307}
6308
6309static bfd_byte *
6310restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6311{
6312 p = restfpr (abfd, p, r);
6313 bfd_put_32 (abfd, BLR, p);
6314 return p + 4;
6315}
6316
6317static bfd_byte *
6318savevr (bfd *abfd, bfd_byte *p, int r)
6319{
6320 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6321 p = p + 4;
6322 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6323 return p + 4;
6324}
6325
6326static bfd_byte *
6327savevr_tail (bfd *abfd, bfd_byte *p, int r)
6328{
6329 p = savevr (abfd, p, r);
6330 bfd_put_32 (abfd, BLR, p);
6331 return p + 4;
6332}
6333
6334static bfd_byte *
6335restvr (bfd *abfd, bfd_byte *p, int r)
6336{
6337 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6338 p = p + 4;
6339 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6340 return p + 4;
6341}
6342
6343static bfd_byte *
6344restvr_tail (bfd *abfd, bfd_byte *p, int r)
6345{
6346 p = restvr (abfd, p, r);
6347 bfd_put_32 (abfd, BLR, p);
6348 return p + 4;
6349}
6350
9e7028aa
AM
6351#define STDU_R1_0R1 0xf8210001
6352#define ADDI_R1_R1 0x38210000
6353
6354/* Emit prologue of wrapper preserving regs around a call to
6355 __tls_get_addr_opt. */
6356
6357static bfd_byte *
6358tls_get_addr_prologue (bfd *obfd, bfd_byte *p, struct ppc_link_hash_table *htab)
6359{
6360 unsigned int i;
6361
6362 bfd_put_32 (obfd, MFLR_R0, p);
6363 p += 4;
6364 bfd_put_32 (obfd, STD_R0_0R1 + 16, p);
6365 p += 4;
6366
6367 if (htab->opd_abi)
6368 {
6369 for (i = 4; i < 12; i++)
6370 {
6371 bfd_put_32 (obfd,
6372 STD_R0_0R1 | i << 21 | (-(13 - i) * 8 & 0xffff), p);
6373 p += 4;
6374 }
6375 bfd_put_32 (obfd, STDU_R1_0R1 | (-128 & 0xffff), p);
6376 p += 4;
6377 }
6378 else
6379 {
6380 for (i = 4; i < 12; i++)
6381 {
6382 bfd_put_32 (obfd,
6383 STD_R0_0R1 | i << 21 | (-(12 - i) * 8 & 0xffff), p);
6384 p += 4;
6385 }
6386 bfd_put_32 (obfd, STDU_R1_0R1 | (-96 & 0xffff), p);
6387 p += 4;
6388 }
6389 return p;
6390}
6391
6392/* Emit epilogue of wrapper preserving regs around a call to
6393 __tls_get_addr_opt. */
6394
6395static bfd_byte *
6396tls_get_addr_epilogue (bfd *obfd, bfd_byte *p, struct ppc_link_hash_table *htab)
6397{
6398 unsigned int i;
6399
6400 if (htab->opd_abi)
6401 {
6402 for (i = 4; i < 12; i++)
6403 {
6404 bfd_put_32 (obfd, LD_R0_0R1 | i << 21 | (128 - (13 - i) * 8), p);
6405 p += 4;
6406 }
6407 bfd_put_32 (obfd, ADDI_R1_R1 | 128, p);
6408 p += 4;
6409 }
6410 else
6411 {
6412 for (i = 4; i < 12; i++)
6413 {
6414 bfd_put_32 (obfd, LD_R0_0R1 | i << 21 | (96 - (12 - i) * 8), p);
6415 p += 4;
6416 }
6417 bfd_put_32 (obfd, ADDI_R1_R1 | 96, p);
6418 p += 4;
6419 }
6420 bfd_put_32 (obfd, LD_R0_0R1 | 16, p);
6421 p += 4;
6422 bfd_put_32 (obfd, MTLR_R0, p);
6423 p += 4;
6424 bfd_put_32 (obfd, BLR, p);
6425 p += 4;
6426 return p;
6427}
6428
e86ce104
AM
6429/* Called via elf_link_hash_traverse to transfer dynamic linking
6430 information on function code symbol entries to their corresponding
a442059f
AM
6431 function descriptor symbol entries. Must not be called twice for
6432 any given code symbol. */
deb0e272 6433
0a1b45a2 6434static bool
4ce794b7 6435func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 6436{
e86ce104 6437 struct bfd_link_info *info;
65f38f15 6438 struct ppc_link_hash_table *htab;
50bc7936
AM
6439 struct ppc_link_hash_entry *fh;
6440 struct ppc_link_hash_entry *fdh;
0a1b45a2 6441 bool force_local;
5bd4f169 6442
ed7007c1 6443 fh = ppc_elf_hash_entry (h);
50bc7936 6444 if (fh->elf.root.type == bfd_link_hash_indirect)
0a1b45a2 6445 return true;
e86ce104 6446
8c5b4e52 6447 if (!fh->is_func)
0a1b45a2 6448 return true;
8c5b4e52
AM
6449
6450 if (fh->elf.root.root.string[0] != '.'
6451 || fh->elf.root.root.string[1] == '\0')
0a1b45a2 6452 return true;
8c5b4e52 6453
4ce794b7 6454 info = inf;
65f38f15 6455 htab = ppc_hash_table (info);
4dfe6ac6 6456 if (htab == NULL)
0a1b45a2 6457 return false;
5bd4f169 6458
8c5b4e52
AM
6459 /* Find the corresponding function descriptor symbol. */
6460 fdh = lookup_fdh (fh, htab);
6461
c09bdfe5
AM
6462 /* Resolve undefined references to dot-symbols as the value
6463 in the function descriptor, if we have one in a regular object.
6464 This is to satisfy cases like ".quad .foo". Calls to functions
6465 in dynamic objects are handled elsewhere. */
8c5b4e52
AM
6466 if ((fh->elf.root.type == bfd_link_hash_undefined
6467 || fh->elf.root.type == bfd_link_hash_undefweak)
6468 && (fdh->elf.root.type == bfd_link_hash_defined
6469 || fdh->elf.root.type == bfd_link_hash_defweak)
b31867b6
AM
6470 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6471 && opd_entry_value (fdh->elf.root.u.def.section,
6472 fdh->elf.root.u.def.value,
c09bdfe5 6473 &fh->elf.root.u.def.section,
0a1b45a2 6474 &fh->elf.root.u.def.value, false) != (bfd_vma) -1)
c09bdfe5 6475 {
b31867b6 6476 fh->elf.root.type = fdh->elf.root.type;
f5385ebf 6477 fh->elf.forced_local = 1;
b31867b6
AM
6478 fh->elf.def_regular = fdh->elf.def_regular;
6479 fh->elf.def_dynamic = fdh->elf.def_dynamic;
c09bdfe5
AM
6480 }
6481
8c5b4e52
AM
6482 if (!fh->elf.dynamic)
6483 {
6484 struct plt_entry *ent;
5bd4f169 6485
8c5b4e52
AM
6486 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6487 if (ent->plt.refcount > 0)
6488 break;
6489 if (ent == NULL)
a442059f
AM
6490 {
6491 if (fdh != NULL && fdh->fake)
6492 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, true);
6493 return true;
6494 }
8c5b4e52 6495 }
5bd4f169 6496
8c5b4e52 6497 /* Create a descriptor as undefined if necessary. */
50bc7936 6498 if (fdh == NULL
0e1862bb 6499 && !bfd_link_executable (info)
50bc7936
AM
6500 && (fh->elf.root.type == bfd_link_hash_undefined
6501 || fh->elf.root.type == bfd_link_hash_undefweak))
6502 {
908b32fc 6503 fdh = make_fdh (info, fh);
bb700d78 6504 if (fdh == NULL)
0a1b45a2 6505 return false;
50bc7936 6506 }
648cca2c 6507
8c5b4e52 6508 /* We can't support overriding of symbols on a fake descriptor. */
908b32fc
AM
6509 if (fdh != NULL
6510 && fdh->fake
8c5b4e52
AM
6511 && (fh->elf.root.type == bfd_link_hash_defined
6512 || fh->elf.root.type == bfd_link_hash_defweak))
0a1b45a2 6513 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, true);
908b32fc 6514
8c5b4e52
AM
6515 /* Transfer dynamic linking information to the function descriptor. */
6516 if (fdh != NULL)
6517 {
f5385ebf
AM
6518 fdh->elf.ref_regular |= fh->elf.ref_regular;
6519 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6520 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6521 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
8c5b4e52
AM
6522 fdh->elf.dynamic |= fh->elf.dynamic;
6523 fdh->elf.needs_plt |= (fh->elf.needs_plt
6524 || fh->elf.type == STT_FUNC
6525 || fh->elf.type == STT_GNU_IFUNC);
6526 move_plt_plist (fh, fdh);
6527
6528 if (!fdh->elf.forced_local
6529 && fh->elf.dynindx != -1)
6530 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
0a1b45a2 6531 return false;
e86ce104
AM
6532 }
6533
50bc7936
AM
6534 /* Now that the info is on the function descriptor, clear the
6535 function code sym info. Any function code syms for which we
6536 don't have a definition in a regular file, we force local.
6537 This prevents a shared library from exporting syms that have
6538 been imported from another library. Function code syms that
6539 are really in the library we must leave global to prevent the
6540 linker dragging in a definition from a static library. */
93f3fa99
AM
6541 force_local = (!fh->elf.def_regular
6542 || fdh == NULL
6543 || !fdh->elf.def_regular
6544 || fdh->elf.forced_local);
50bc7936
AM
6545 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6546
0a1b45a2 6547 return true;
e86ce104 6548}
40b8271b 6549
a4b6fadd
AM
6550static const struct sfpr_def_parms save_res_funcs[] =
6551 {
6552 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6553 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6554 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6555 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6556 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6557 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6558 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6559 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6560 { "._savef", 14, 31, savefpr, savefpr1_tail },
6561 { "._restf", 14, 31, restfpr, restfpr1_tail },
6562 { "_savevr_", 20, 31, savevr, savevr_tail },
6563 { "_restvr_", 20, 31, restvr, restvr_tail }
6564 };
6565
e86ce104 6566/* Called near the start of bfd_elf_size_dynamic_sections. We use
c9405344
AM
6567 this hook to a) run the edit functions in this file, b) provide
6568 some gcc support functions, and c) transfer dynamic linking
6569 information gathered so far on function code symbol entries, to
6570 their corresponding function descriptor symbol entries. */
deb0e272 6571
0a1b45a2 6572static bool
c9405344 6573ppc64_elf_edit (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
e86ce104
AM
6574{
6575 struct ppc_link_hash_table *htab;
6576
6577 htab = ppc_hash_table (info);
4dfe6ac6 6578 if (htab == NULL)
0a1b45a2 6579 return false;
4dfe6ac6 6580
c9405344
AM
6581 /* Call back into the linker, which then runs the edit functions. */
6582 htab->params->edit ();
6583
b32547cd
AM
6584 /* Provide any missing _save* and _rest* functions. */
6585 if (htab->sfpr != NULL)
6586 {
6587 unsigned int i;
6588
6589 htab->sfpr->size = 0;
6590 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
6591 if (!sfpr_define (info, &save_res_funcs[i], NULL))
0a1b45a2 6592 return false;
b32547cd
AM
6593 if (htab->sfpr->size == 0)
6594 htab->sfpr->flags |= SEC_EXCLUDE;
6595 }
6596
6597 if (bfd_link_relocatable (info))
0a1b45a2 6598 return true;
b32547cd
AM
6599
6600 if (htab->elf.hgot != NULL)
dba6fa9b 6601 {
0a1b45a2 6602 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, true);
dba6fa9b
AM
6603 /* Make .TOC. defined so as to prevent it being made dynamic.
6604 The wrong value here is fixed later in ppc64_elf_set_toc. */
43417696
AM
6605 if (!htab->elf.hgot->def_regular
6606 || htab->elf.hgot->root.type != bfd_link_hash_defined)
6607 {
6608 htab->elf.hgot->root.type = bfd_link_hash_defined;
6609 htab->elf.hgot->root.u.def.value = 0;
6610 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
6611 htab->elf.hgot->def_regular = 1;
6612 htab->elf.hgot->root.linker_def = 1;
6613 }
dba6fa9b 6614 htab->elf.hgot->type = STT_OBJECT;
2cdcc330
AM
6615 htab->elf.hgot->other
6616 = (htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
dba6fa9b 6617 }
c66bb0ee 6618
0a1b45a2 6619 return true;
e86ce104
AM
6620}
6621
d311bc8b 6622/* Return true if we have dynamic relocs against H or any of its weak
ab2477e1
AM
6623 aliases, that apply to read-only sections. Cannot be used after
6624 size_dynamic_sections. */
d311bc8b 6625
0a1b45a2 6626static bool
d311bc8b
AM
6627alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
6628{
ed7007c1 6629 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
d311bc8b
AM
6630 do
6631 {
5dbc8b37 6632 if (_bfd_elf_readonly_dynrelocs (&eh->elf))
0a1b45a2 6633 return true;
ed7007c1 6634 eh = ppc_elf_hash_entry (eh->elf.u.alias);
2cdcc330
AM
6635 }
6636 while (eh != NULL && &eh->elf != h);
d311bc8b 6637
0a1b45a2 6638 return false;
d311bc8b 6639}
8a2058b5 6640
8a9e8e72
AM
6641/* Return whether EH has pc-relative dynamic relocs. */
6642
0a1b45a2 6643static bool
8a9e8e72
AM
6644pc_dynrelocs (struct ppc_link_hash_entry *eh)
6645{
1657026c 6646 struct ppc_dyn_relocs *p;
8a9e8e72 6647
1657026c 6648 for (p = (struct ppc_dyn_relocs *) eh->elf.dyn_relocs; p != NULL; p = p->next)
8a9e8e72 6649 if (p->pc_count != 0)
0a1b45a2
AM
6650 return true;
6651 return false;
8a9e8e72
AM
6652}
6653
8a2058b5
AM
6654/* Return true if a global entry stub will be created for H. Valid
6655 for ELFv2 before plt entries have been allocated. */
6656
0a1b45a2 6657static bool
8a2058b5
AM
6658global_entry_stub (struct elf_link_hash_entry *h)
6659{
6660 struct plt_entry *pent;
6661
6662 if (!h->pointer_equality_needed
6663 || h->def_regular)
0a1b45a2 6664 return false;
8a2058b5
AM
6665
6666 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
6667 if (pent->plt.refcount > 0
6668 && pent->addend == 0)
0a1b45a2 6669 return true;
8a2058b5 6670
0a1b45a2 6671 return false;
8a2058b5
AM
6672}
6673
e86ce104
AM
6674/* Adjust a symbol defined by a dynamic object and referenced by a
6675 regular object. The current definition is in some section of the
6676 dynamic object, but we're not including those sections. We have to
6677 change the definition to something the rest of the link can
6678 understand. */
6679
0a1b45a2 6680static bool
4ce794b7
AM
6681ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6682 struct elf_link_hash_entry *h)
e86ce104
AM
6683{
6684 struct ppc_link_hash_table *htab;
5474d94f 6685 asection *s, *srel;
e86ce104
AM
6686
6687 htab = ppc_hash_table (info);
4dfe6ac6 6688 if (htab == NULL)
0a1b45a2 6689 return false;
e86ce104
AM
6690
6691 /* Deal with function syms. */
6692 if (h->type == STT_FUNC
e054468f 6693 || h->type == STT_GNU_IFUNC
f5385ebf 6694 || h->needs_plt)
e86ce104 6695 {
0a1b45a2
AM
6696 bool local = (ppc_elf_hash_entry (h)->save_res
6697 || SYMBOL_CALLS_LOCAL (info, h)
6698 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
529fe20e
AM
6699 /* Discard dyn_relocs when non-pic if we've decided that a
6700 function symbol is local and not an ifunc. We keep dynamic
6701 relocs for ifuncs when local rather than always emitting a
6702 plt call stub for them and defining the symbol on the call
6703 stub. We can't do that for ELFv1 anyway (a function symbol
6704 is defined on a descriptor, not code) and it can be faster at
6705 run-time due to not needing to bounce through a stub. The
6706 dyn_relocs for ifuncs will be applied even in a static
6707 executable. */
6708 if (!bfd_link_pic (info)
6709 && h->type != STT_GNU_IFUNC
6710 && local)
190eb1dd 6711 h->dyn_relocs = NULL;
529fe20e 6712
e86ce104
AM
6713 /* Clear procedure linkage table information for any symbol that
6714 won't need a .plt entry. */
411e1bfb
AM
6715 struct plt_entry *ent;
6716 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6717 if (ent->plt.refcount > 0)
6718 break;
8387904d 6719 if (ent == NULL
2d7ad24e
AM
6720 || (h->type != STT_GNU_IFUNC
6721 && local
3e04d765 6722 && (htab->can_convert_all_inline_plt
ed7007c1 6723 || (ppc_elf_hash_entry (h)->tls_mask
3e04d765 6724 & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)))
40b8271b 6725 {
411e1bfb 6726 h->plt.plist = NULL;
f5385ebf 6727 h->needs_plt = 0;
d1eca1e4 6728 h->pointer_equality_needed = 0;
40b8271b 6729 }
8a2058b5 6730 else if (abiversion (info->output_bfd) >= 2)
a345bc8d 6731 {
d1eca1e4
AM
6732 /* Taking a function's address in a read/write section
6733 doesn't require us to define the function symbol in the
6734 executable on a global entry stub. A dynamic reloc can
8a2058b5
AM
6735 be used instead. The reason we prefer a few more dynamic
6736 relocs is that calling via a global entry stub costs a
6737 few more instructions, and pointer_equality_needed causes
6738 extra work in ld.so when resolving these symbols. */
529fe20e 6739 if (global_entry_stub (h))
d1eca1e4 6740 {
5dbc8b37 6741 if (!_bfd_elf_readonly_dynrelocs (h))
529fe20e
AM
6742 {
6743 h->pointer_equality_needed = 0;
04383fd1
AM
6744 /* If we haven't seen a branch reloc and the symbol
6745 isn't an ifunc then we don't need a plt entry. */
529fe20e
AM
6746 if (!h->needs_plt)
6747 h->plt.plist = NULL;
6748 }
6749 else if (!bfd_link_pic (info))
6750 /* We are going to be defining the function symbol on the
6751 plt stub, so no dyn_relocs needed when non-pic. */
190eb1dd 6752 h->dyn_relocs = NULL;
d1eca1e4
AM
6753 }
6754
3988aed5 6755 /* ELFv2 function symbols can't have copy relocs. */
0a1b45a2 6756 return true;
3988aed5
AM
6757 }
6758 else if (!h->needs_plt
5dbc8b37 6759 && !_bfd_elf_readonly_dynrelocs (h))
3988aed5 6760 {
04383fd1
AM
6761 /* If we haven't seen a branch reloc and the symbol isn't an
6762 ifunc then we don't need a plt entry. */
3988aed5
AM
6763 h->plt.plist = NULL;
6764 h->pointer_equality_needed = 0;
0a1b45a2 6765 return true;
a345bc8d 6766 }
5bd4f169 6767 }
bbd7ec4a 6768 else
411e1bfb 6769 h->plt.plist = NULL;
5bd4f169
AM
6770
6771 /* If this is a weak symbol, and there is a real definition, the
6772 processor independent code will have arranged for us to see the
6773 real definition first, and we can just use the same value. */
60d67dc8 6774 if (h->is_weakalias)
5bd4f169 6775 {
60d67dc8
AM
6776 struct elf_link_hash_entry *def = weakdef (h);
6777 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
6778 h->root.u.def.section = def->root.u.def.section;
6779 h->root.u.def.value = def->root.u.def.value;
4a7e5234
AM
6780 if (def->root.u.def.section == htab->elf.sdynbss
6781 || def->root.u.def.section == htab->elf.sdynrelro)
190eb1dd 6782 h->dyn_relocs = NULL;
0a1b45a2 6783 return true;
5bd4f169
AM
6784 }
6785
5bd4f169
AM
6786 /* If we are creating a shared library, we must presume that the
6787 only references to the symbol are via the global offset table.
6788 For such cases we need not do anything here; the relocations will
6789 be handled correctly by relocate_section. */
ec73ddcd 6790 if (!bfd_link_executable (info))
0a1b45a2 6791 return true;
5bd4f169 6792
65f38f15
AM
6793 /* If there are no references to this symbol that do not use the
6794 GOT, we don't need to generate a copy reloc. */
f5385ebf 6795 if (!h->non_got_ref)
0a1b45a2 6796 return true;
65f38f15 6797
b186458a 6798 /* Don't generate a copy reloc for symbols defined in the executable. */
d93d1c80 6799 if (!h->def_dynamic || !h->ref_regular || h->def_regular
b186458a 6800
d93d1c80
AM
6801 /* If -z nocopyreloc was given, don't generate them either. */
6802 || info->nocopyreloc
a127494f 6803
dce2246a 6804 /* If we don't find any dynamic relocs in read-only sections, then
d93d1c80 6805 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1bdd8fac
AM
6806 || (ELIMINATE_COPY_RELOCS
6807 && !h->needs_copy
6808 && !alias_readonly_dynrelocs (h))
65f38f15 6809
d93d1c80
AM
6810 /* Protected variables do not work with .dynbss. The copy in
6811 .dynbss won't be used by the shared library with the protected
6812 definition for the variable. Text relocations are preferable
6813 to an incorrect program. */
6814 || h->protected_def)
0a1b45a2 6815 return true;
a127494f 6816
e1c6cf61
AM
6817 if (h->type == STT_FUNC
6818 || h->type == STT_GNU_IFUNC)
97b639ba 6819 {
e1c6cf61
AM
6820 /* .dynbss copies of function symbols only work if we have
6821 ELFv1 dot-symbols. ELFv1 compilers since 2004 default to not
6822 use dot-symbols and set the function symbol size to the text
6823 size of the function rather than the size of the descriptor.
6824 That's wrong for copying a descriptor. */
ed7007c1 6825 if (ppc_elf_hash_entry (h)->oh == NULL
e1c6cf61 6826 || !(h->size == 24 || h->size == 16))
0a1b45a2 6827 return true;
e1c6cf61
AM
6828
6829 /* We should never get here, but unfortunately there are old
6830 versions of gcc (circa gcc-3.2) that improperly for the
6831 ELFv1 ABI put initialized function pointers, vtable refs and
6832 suchlike in read-only sections. Allow them to proceed, but
6833 warn that this might break at runtime. */
25f53a85 6834 info->callbacks->einfo
c1c8c1ef 6835 (_("%P: copy reloc against `%pT' requires lazy plt linking; "
25f53a85 6836 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
97b639ba
AM
6837 h->root.root.string);
6838 }
5d35169e
AM
6839
6840 /* This is a reference to a symbol defined by a dynamic object which
6841 is not a function. */
6842
5bd4f169
AM
6843 /* We must allocate the symbol in our .dynbss section, which will
6844 become part of the .bss section of the executable. There will be
6845 an entry for this symbol in the .dynsym section. The dynamic
6846 object will contain position independent code, so all references
6847 from the dynamic object to this symbol will go through the global
6848 offset table. The dynamic linker will use the .dynsym entry to
6849 determine the address it must put in the global offset table, so
6850 both the dynamic object and the regular object will refer to the
6851 same memory location for the variable. */
5474d94f
AM
6852 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
6853 {
6854 s = htab->elf.sdynrelro;
6855 srel = htab->elf.sreldynrelro;
6856 }
6857 else
6858 {
6859 s = htab->elf.sdynbss;
6860 srel = htab->elf.srelbss;
6861 }
1d7e9d18 6862 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
5bd4f169 6863 {
4a7e5234
AM
6864 /* We must generate a R_PPC64_COPY reloc to tell the dynamic
6865 linker to copy the initial value out of the dynamic object
6866 and into the runtime process image. */
5474d94f 6867 srel->size += sizeof (Elf64_External_Rela);
f5385ebf 6868 h->needs_copy = 1;
5bd4f169
AM
6869 }
6870
529fe20e 6871 /* We no longer want dyn_relocs. */
190eb1dd 6872 h->dyn_relocs = NULL;
6cabe1ea 6873 return _bfd_elf_adjust_dynamic_copy (info, h, s);
5bd4f169
AM
6874}
6875
e86ce104
AM
6876/* If given a function descriptor symbol, hide both the function code
6877 sym and the descriptor. */
6878static void
4ce794b7
AM
6879ppc64_elf_hide_symbol (struct bfd_link_info *info,
6880 struct elf_link_hash_entry *h,
0a1b45a2 6881 bool force_local)
e86ce104 6882{
34814b9f 6883 struct ppc_link_hash_entry *eh;
e86ce104
AM
6884 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
6885
87469ba2
AM
6886 if (ppc_hash_table (info) == NULL)
6887 return;
6888
ed7007c1 6889 eh = ppc_elf_hash_entry (h);
34814b9f 6890 if (eh->is_func_descriptor)
e86ce104 6891 {
34814b9f 6892 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 6893
721956f4 6894 if (fh == NULL)
d1329ca3
AM
6895 {
6896 const char *p, *q;
b8ac2841 6897 struct elf_link_hash_table *htab = elf_hash_table (info);
d1329ca3
AM
6898 char save;
6899
6900 /* We aren't supposed to use alloca in BFD because on
6901 systems which do not have alloca the version in libiberty
6902 calls xmalloc, which might cause the program to crash
6903 when it runs out of memory. This function doesn't have a
6904 return status, so there's no way to gracefully return an
6905 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
6906 accessed; It's either a string in an ELF string table,
6907 or allocated in an objalloc structure. */
d1329ca3 6908
34814b9f 6909 p = eh->elf.root.root.string - 1;
d1329ca3
AM
6910 save = *p;
6911 *(char *) p = '.';
0a1b45a2
AM
6912 fh = ppc_elf_hash_entry (elf_link_hash_lookup (htab, p, false,
6913 false, false));
d1329ca3
AM
6914 *(char *) p = save;
6915
6916 /* Unfortunately, if it so happens that the string we were
6917 looking for was allocated immediately before this string,
6918 then we overwrote the string terminator. That's the only
6919 reason the lookup should fail. */
6920 if (fh == NULL)
6921 {
34814b9f
AM
6922 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
6923 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 6924 --q, --p;
34814b9f 6925 if (q < eh->elf.root.root.string && *p == '.')
0a1b45a2
AM
6926 fh = ppc_elf_hash_entry (elf_link_hash_lookup (htab, p, false,
6927 false, false));
d1329ca3
AM
6928 }
6929 if (fh != NULL)
6930 {
34814b9f
AM
6931 eh->oh = fh;
6932 fh->oh = eh;
d1329ca3
AM
6933 }
6934 }
e86ce104 6935 if (fh != NULL)
34814b9f 6936 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
6937 }
6938}
6939
0a1b45a2 6940static bool
8843416a
AM
6941get_sym_h (struct elf_link_hash_entry **hp,
6942 Elf_Internal_Sym **symp,
6943 asection **symsecp,
f961d9dd 6944 unsigned char **tls_maskp,
8843416a
AM
6945 Elf_Internal_Sym **locsymsp,
6946 unsigned long r_symndx,
6947 bfd *ibfd)
411e1bfb 6948{
0ffa91dd 6949 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
411e1bfb
AM
6950
6951 if (r_symndx >= symtab_hdr->sh_info)
6952 {
6953 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
6954 struct elf_link_hash_entry *h;
6955
6956 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 6957 h = elf_follow_link (h);
411e1bfb
AM
6958
6959 if (hp != NULL)
6960 *hp = h;
6961
6962 if (symp != NULL)
6963 *symp = NULL;
6964
6965 if (symsecp != NULL)
6966 {
6967 asection *symsec = NULL;
6968 if (h->root.type == bfd_link_hash_defined
6969 || h->root.type == bfd_link_hash_defweak)
6970 symsec = h->root.u.def.section;
6971 *symsecp = symsec;
6972 }
6973
e7b938ca 6974 if (tls_maskp != NULL)
ed7007c1 6975 *tls_maskp = &ppc_elf_hash_entry (h)->tls_mask;
411e1bfb
AM
6976 }
6977 else
6978 {
6979 Elf_Internal_Sym *sym;
6980 Elf_Internal_Sym *locsyms = *locsymsp;
6981
6982 if (locsyms == NULL)
6983 {
6984 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
6985 if (locsyms == NULL)
6986 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
6987 symtab_hdr->sh_info,
6988 0, NULL, NULL, NULL);
6989 if (locsyms == NULL)
0a1b45a2 6990 return false;
411e1bfb
AM
6991 *locsymsp = locsyms;
6992 }
6993 sym = locsyms + r_symndx;
6994
6995 if (hp != NULL)
6996 *hp = NULL;
6997
6998 if (symp != NULL)
6999 *symp = sym;
7000
7001 if (symsecp != NULL)
cb33740c 7002 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
411e1bfb 7003
e7b938ca 7004 if (tls_maskp != NULL)
411e1bfb
AM
7005 {
7006 struct got_entry **lgot_ents;
f961d9dd 7007 unsigned char *tls_mask;
411e1bfb 7008
e7b938ca 7009 tls_mask = NULL;
411e1bfb
AM
7010 lgot_ents = elf_local_got_ents (ibfd);
7011 if (lgot_ents != NULL)
7012 {
e054468f
AM
7013 struct plt_entry **local_plt = (struct plt_entry **)
7014 (lgot_ents + symtab_hdr->sh_info);
f961d9dd 7015 unsigned char *lgot_masks = (unsigned char *)
e054468f 7016 (local_plt + symtab_hdr->sh_info);
e7b938ca 7017 tls_mask = &lgot_masks[r_symndx];
411e1bfb 7018 }
e7b938ca 7019 *tls_maskp = tls_mask;
411e1bfb
AM
7020 }
7021 }
0a1b45a2 7022 return true;
411e1bfb
AM
7023}
7024
e7b938ca 7025/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 7026 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 7027 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
7028
7029static int
f961d9dd 7030get_tls_mask (unsigned char **tls_maskp,
3a71aa26
AM
7031 unsigned long *toc_symndx,
7032 bfd_vma *toc_addend,
0d4792f7 7033 Elf_Internal_Sym **locsymsp,
3a71aa26
AM
7034 const Elf_Internal_Rela *rel,
7035 bfd *ibfd)
411e1bfb
AM
7036{
7037 unsigned long r_symndx;
0d4792f7 7038 int next_r;
411e1bfb
AM
7039 struct elf_link_hash_entry *h;
7040 Elf_Internal_Sym *sym;
7041 asection *sec;
7042 bfd_vma off;
7043
7044 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 7045 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 7046 return 0;
411e1bfb 7047
37da22e5
AM
7048 if ((*tls_maskp != NULL
7049 && (**tls_maskp & TLS_TLS) != 0
7050 && **tls_maskp != (TLS_TLS | TLS_MARK))
411e1bfb 7051 || sec == NULL
6bee8834 7052 || ppc64_elf_section_data (sec) == NULL
7c8fe5c4 7053 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
951fd09b 7054 return 1;
411e1bfb
AM
7055
7056 /* Look inside a TOC section too. */
7057 if (h != NULL)
7058 {
7059 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7060 off = h->root.u.def.value;
7061 }
7062 else
7063 off = sym->st_value;
7064 off += rel->r_addend;
7065 BFD_ASSERT (off % 8 == 0);
3a71aa26
AM
7066 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7067 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
0d4792f7
AM
7068 if (toc_symndx != NULL)
7069 *toc_symndx = r_symndx;
3a71aa26
AM
7070 if (toc_addend != NULL)
7071 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7072 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7073 return 0;
854b41e7 7074 if ((h == NULL || is_static_defined (h))
0d4792f7
AM
7075 && (next_r == -1 || next_r == -2))
7076 return 1 - next_r;
951fd09b 7077 return 1;
411e1bfb
AM
7078}
7079
3b421ab3
AM
7080/* Find (or create) an entry in the tocsave hash table. */
7081
7082static struct tocsave_entry *
7083tocsave_find (struct ppc_link_hash_table *htab,
7084 enum insert_option insert,
7085 Elf_Internal_Sym **local_syms,
7086 const Elf_Internal_Rela *irela,
7087 bfd *ibfd)
7088{
7089 unsigned long r_indx;
7090 struct elf_link_hash_entry *h;
7091 Elf_Internal_Sym *sym;
7092 struct tocsave_entry ent, *p;
7093 hashval_t hash;
7094 struct tocsave_entry **slot;
7095
7096 r_indx = ELF64_R_SYM (irela->r_info);
7097 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7098 return NULL;
7099 if (ent.sec == NULL || ent.sec->output_section == NULL)
7100 {
4eca0228 7101 _bfd_error_handler
871b3ab2 7102 (_("%pB: undefined symbol on R_PPC64_TOCSAVE relocation"), ibfd);
3b421ab3
AM
7103 return NULL;
7104 }
7105
7106 if (h != NULL)
7107 ent.offset = h->root.u.def.value;
7108 else
7109 ent.offset = sym->st_value;
7110 ent.offset += irela->r_addend;
7111
7112 hash = tocsave_htab_hash (&ent);
7113 slot = ((struct tocsave_entry **)
7114 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7115 if (slot == NULL)
7116 return NULL;
7117
7118 if (*slot == NULL)
7119 {
7120 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7121 if (p == NULL)
7122 return NULL;
7123 *p = ent;
7124 *slot = p;
7125 }
7126 return *slot;
7127}
7128
754021d0 7129/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 7130 code for the old ABI, these will already have been done. */
754021d0 7131
0a1b45a2 7132static bool
754021d0
AM
7133adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7134{
7135 struct ppc_link_hash_entry *eh;
7136 asection *sym_sec;
74f0fb50 7137 struct _opd_sec_data *opd;
754021d0
AM
7138
7139 if (h->root.type == bfd_link_hash_indirect)
0a1b45a2 7140 return true;
754021d0 7141
754021d0
AM
7142 if (h->root.type != bfd_link_hash_defined
7143 && h->root.type != bfd_link_hash_defweak)
0a1b45a2 7144 return true;
754021d0 7145
ed7007c1 7146 eh = ppc_elf_hash_entry (h);
754021d0 7147 if (eh->adjust_done)
0a1b45a2 7148 return true;
754021d0
AM
7149
7150 sym_sec = eh->elf.root.u.def.section;
74f0fb50
AM
7151 opd = get_opd_info (sym_sec);
7152 if (opd != NULL && opd->adjust != NULL)
754021d0 7153 {
51aecdc5 7154 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
4025353c
AM
7155 if (adjust == -1)
7156 {
7157 /* This entry has been deleted. */
b3fac117 7158 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
81688140
AM
7159 if (dsec == NULL)
7160 {
7161 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
dbaa2011 7162 if (discarded_section (dsec))
81688140 7163 {
b3fac117 7164 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
81688140
AM
7165 break;
7166 }
7167 }
4025353c 7168 eh->elf.root.u.def.value = 0;
81688140 7169 eh->elf.root.u.def.section = dsec;
4025353c
AM
7170 }
7171 else
7172 eh->elf.root.u.def.value += adjust;
754021d0
AM
7173 eh->adjust_done = 1;
7174 }
0a1b45a2 7175 return true;
754021d0
AM
7176}
7177
8c1d1bb8 7178/* Handles decrementing dynamic reloc counts for the reloc specified by
19e08130 7179 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
8c1d1bb8
AM
7180 have already been determined. */
7181
0a1b45a2 7182static bool
1657026c 7183dec_dynrel_count (const Elf_Internal_Rela *rel,
8c1d1bb8
AM
7184 asection *sec,
7185 struct bfd_link_info *info,
7186 Elf_Internal_Sym **local_syms,
7187 struct elf_link_hash_entry *h,
19e08130 7188 Elf_Internal_Sym *sym)
8c1d1bb8
AM
7189{
7190 enum elf_ppc64_reloc_type r_type;
19e08130 7191 asection *sym_sec = NULL;
8c1d1bb8
AM
7192
7193 /* Can this reloc be dynamic? This switch, and later tests here
7194 should be kept in sync with the code in check_relocs. */
1657026c 7195 r_type = ELF64_R_TYPE (rel->r_info);
8c1d1bb8
AM
7196 switch (r_type)
7197 {
7198 default:
0a1b45a2 7199 return true;
8c1d1bb8 7200
1bdd8fac
AM
7201 case R_PPC64_TOC16:
7202 case R_PPC64_TOC16_DS:
7203 case R_PPC64_TOC16_LO:
7204 case R_PPC64_TOC16_HI:
7205 case R_PPC64_TOC16_HA:
7206 case R_PPC64_TOC16_LO_DS:
7207 if (h == NULL)
0a1b45a2 7208 return true;
1bdd8fac
AM
7209 break;
7210
8c1d1bb8
AM
7211 case R_PPC64_TPREL16:
7212 case R_PPC64_TPREL16_LO:
7213 case R_PPC64_TPREL16_HI:
7214 case R_PPC64_TPREL16_HA:
7215 case R_PPC64_TPREL16_DS:
7216 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
7217 case R_PPC64_TPREL16_HIGH:
7218 case R_PPC64_TPREL16_HIGHA:
8c1d1bb8
AM
7219 case R_PPC64_TPREL16_HIGHER:
7220 case R_PPC64_TPREL16_HIGHERA:
7221 case R_PPC64_TPREL16_HIGHEST:
7222 case R_PPC64_TPREL16_HIGHESTA:
8c1d1bb8 7223 case R_PPC64_TPREL64:
c213164a 7224 case R_PPC64_TPREL34:
8c1d1bb8
AM
7225 case R_PPC64_DTPMOD64:
7226 case R_PPC64_DTPREL64:
7227 case R_PPC64_ADDR64:
7228 case R_PPC64_REL30:
7229 case R_PPC64_REL32:
7230 case R_PPC64_REL64:
7231 case R_PPC64_ADDR14:
7232 case R_PPC64_ADDR14_BRNTAKEN:
7233 case R_PPC64_ADDR14_BRTAKEN:
7234 case R_PPC64_ADDR16:
7235 case R_PPC64_ADDR16_DS:
7236 case R_PPC64_ADDR16_HA:
7237 case R_PPC64_ADDR16_HI:
f9c6b907
AM
7238 case R_PPC64_ADDR16_HIGH:
7239 case R_PPC64_ADDR16_HIGHA:
8c1d1bb8
AM
7240 case R_PPC64_ADDR16_HIGHER:
7241 case R_PPC64_ADDR16_HIGHERA:
7242 case R_PPC64_ADDR16_HIGHEST:
7243 case R_PPC64_ADDR16_HIGHESTA:
7244 case R_PPC64_ADDR16_LO:
7245 case R_PPC64_ADDR16_LO_DS:
7246 case R_PPC64_ADDR24:
7247 case R_PPC64_ADDR32:
7248 case R_PPC64_UADDR16:
7249 case R_PPC64_UADDR32:
7250 case R_PPC64_UADDR64:
7251 case R_PPC64_TOC:
5663e321
AM
7252 case R_PPC64_D34:
7253 case R_PPC64_D34_LO:
7254 case R_PPC64_D34_HI30:
7255 case R_PPC64_D34_HA30:
7256 case R_PPC64_ADDR16_HIGHER34:
7257 case R_PPC64_ADDR16_HIGHERA34:
7258 case R_PPC64_ADDR16_HIGHEST34:
7259 case R_PPC64_ADDR16_HIGHESTA34:
7260 case R_PPC64_D28:
8c1d1bb8
AM
7261 break;
7262 }
7263
7264 if (local_syms != NULL)
7265 {
7266 unsigned long r_symndx;
8c1d1bb8
AM
7267 bfd *ibfd = sec->owner;
7268
1657026c 7269 r_symndx = ELF64_R_SYM (rel->r_info);
8c1d1bb8 7270 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
0a1b45a2 7271 return false;
8c1d1bb8
AM
7272 }
7273
ec73ddcd 7274 if ((h != NULL
c99d782d 7275 && !SYMBOL_REFERENCES_LOCAL (info, h))
ec73ddcd 7276 || (bfd_link_pic (info)
3a3a4c1f
AM
7277 && (h != NULL
7278 ? !bfd_is_abs_symbol (&h->root)
7279 : sym_sec != bfd_abs_section_ptr)
ec73ddcd
AM
7280 && must_be_dyn_reloc (info, r_type))
7281 || (!bfd_link_pic (info)
7282 && (h != NULL
7283 ? h->type == STT_GNU_IFUNC
7284 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
8c1d1bb8
AM
7285 ;
7286 else
0a1b45a2 7287 return true;
8c1d1bb8
AM
7288
7289 if (h != NULL)
6edfbbad 7290 {
1657026c
AM
7291 struct ppc_dyn_relocs *p;
7292 struct ppc_dyn_relocs **pp;
7293 pp = (struct ppc_dyn_relocs **) &h->dyn_relocs;
19e08130
AM
7294
7295 /* elf_gc_sweep may have already removed all dyn relocs associated
7296 with local syms for a given section. Also, symbol flags are
7297 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7298 report a dynreloc miscount. */
7299 if (*pp == NULL && info->gc_sections)
0a1b45a2 7300 return true;
19e08130
AM
7301
7302 while ((p = *pp) != NULL)
60124e18 7303 {
19e08130
AM
7304 if (p->sec == sec)
7305 {
7306 if (!must_be_dyn_reloc (info, r_type))
7307 p->pc_count -= 1;
f91074eb 7308 if (maybe_relr (r_type, rel, sec))
1657026c 7309 p->rel_count -= 1;
19e08130
AM
7310 p->count -= 1;
7311 if (p->count == 0)
7312 *pp = p->next;
0a1b45a2 7313 return true;
19e08130
AM
7314 }
7315 pp = &p->next;
60124e18 7316 }
6edfbbad 7317 }
19e08130
AM
7318 else
7319 {
1657026c
AM
7320 struct ppc_local_dyn_relocs *p;
7321 struct ppc_local_dyn_relocs **pp;
19e08130 7322 void *vpp;
0a1b45a2 7323 bool is_ifunc;
8c1d1bb8 7324
19e08130
AM
7325 if (local_syms == NULL)
7326 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7327 if (sym_sec == NULL)
7328 sym_sec = sec;
c57da1a7 7329
19e08130 7330 vpp = &elf_section_data (sym_sec)->local_dynrel;
1657026c 7331 pp = (struct ppc_local_dyn_relocs **) vpp;
19e08130
AM
7332
7333 if (*pp == NULL && info->gc_sections)
0a1b45a2 7334 return true;
19e08130
AM
7335
7336 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7337 while ((p = *pp) != NULL)
8c1d1bb8 7338 {
19e08130
AM
7339 if (p->sec == sec && p->ifunc == is_ifunc)
7340 {
f91074eb 7341 if (maybe_relr (r_type, rel, sec))
1657026c 7342 p->rel_count -= 1;
19e08130
AM
7343 p->count -= 1;
7344 if (p->count == 0)
7345 *pp = p->next;
0a1b45a2 7346 return true;
19e08130
AM
7347 }
7348 pp = &p->next;
8c1d1bb8 7349 }
8c1d1bb8
AM
7350 }
7351
695344c0 7352 /* xgettext:c-format */
cf97bcb0
AM
7353 _bfd_error_handler (_("dynreloc miscount for %pB, section %pA"),
7354 sec->owner, sec);
8c1d1bb8 7355 bfd_set_error (bfd_error_bad_value);
0a1b45a2 7356 return false;
8c1d1bb8
AM
7357}
7358
754021d0
AM
7359/* Remove unused Official Procedure Descriptor entries. Currently we
7360 only remove those associated with functions in discarded link-once
7361 sections, or weakly defined functions that have been overridden. It
7362 would be possible to remove many more entries for statically linked
7363 applications. */
7364
0a1b45a2 7365bool
e7d1c40c 7366ppc64_elf_edit_opd (struct bfd_link_info *info)
1e2f5b6e
AM
7367{
7368 bfd *ibfd;
0a1b45a2 7369 bool some_edited = false;
3f764659 7370 asection *need_pad = NULL;
e7d1c40c
AM
7371 struct ppc_link_hash_table *htab;
7372
7373 htab = ppc_hash_table (info);
7374 if (htab == NULL)
0a1b45a2 7375 return false;
1e2f5b6e 7376
c72f2fb2 7377 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1e2f5b6e
AM
7378 {
7379 asection *sec;
7380 Elf_Internal_Rela *relstart, *rel, *relend;
7381 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 7382 Elf_Internal_Sym *local_syms;
74f0fb50 7383 struct _opd_sec_data *opd;
0a1b45a2 7384 bool need_edit, add_aux_fields, broken;
3f764659 7385 bfd_size_type cnt_16b = 0;
1e2f5b6e 7386
854b41e7
AM
7387 if (!is_ppc64_elf (ibfd))
7388 continue;
7389
1e2f5b6e 7390 sec = bfd_get_section_by_name (ibfd, ".opd");
81ff113f
AM
7391 if (sec == NULL
7392 || sec->size == 0
7393 || (sec->flags & SEC_HAS_CONTENTS) == 0)
1e2f5b6e
AM
7394 continue;
7395
dbaa2011 7396 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4b85d634
AM
7397 continue;
7398
1e2f5b6e
AM
7399 if (sec->output_section == bfd_abs_section_ptr)
7400 continue;
7401
7402 /* Look through the section relocs. */
7403 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7404 continue;
7405
6cdc0ccc 7406 local_syms = NULL;
0ffa91dd 7407 symtab_hdr = &elf_symtab_hdr (ibfd);
1e2f5b6e
AM
7408
7409 /* Read the relocations. */
4ce794b7 7410 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 7411 info->keep_memory);
1e2f5b6e 7412 if (relstart == NULL)
0a1b45a2 7413 return false;
1e2f5b6e
AM
7414
7415 /* First run through the relocs to check they are sane, and to
7416 determine whether we need to edit this opd section. */
0a1b45a2
AM
7417 need_edit = false;
7418 broken = false;
3f764659 7419 need_pad = sec;
1e2f5b6e 7420 relend = relstart + sec->reloc_count;
50bc7936 7421 for (rel = relstart; rel < relend; )
1e2f5b6e 7422 {
04c9666a 7423 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
7424 unsigned long r_symndx;
7425 asection *sym_sec;
7426 struct elf_link_hash_entry *h;
7427 Elf_Internal_Sym *sym;
51aecdc5 7428 bfd_vma offset;
1e2f5b6e 7429
51aecdc5 7430 /* .opd contains an array of 16 or 24 byte entries. We're
1e2f5b6e
AM
7431 only interested in the reloc pointing to a function entry
7432 point. */
51aecdc5
AM
7433 offset = rel->r_offset;
7434 if (rel + 1 == relend
7435 || rel[1].r_offset != offset + 8)
1e2f5b6e
AM
7436 {
7437 /* If someone messes with .opd alignment then after a
7438 "ld -r" we might have padding in the middle of .opd.
7439 Also, there's nothing to prevent someone putting
7440 something silly in .opd with the assembler. No .opd
b34976b6 7441 optimization for them! */
3f764659 7442 broken_opd:
4eca0228 7443 _bfd_error_handler
871b3ab2 7444 (_("%pB: .opd is not a regular array of opd entries"), ibfd);
0a1b45a2 7445 broken = true;
1e2f5b6e
AM
7446 break;
7447 }
7448
50bc7936
AM
7449 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7450 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7451 {
4eca0228 7452 _bfd_error_handler
695344c0 7453 /* xgettext:c-format */
871b3ab2 7454 (_("%pB: unexpected reloc type %u in .opd section"),
d003868e 7455 ibfd, r_type);
0a1b45a2 7456 broken = true;
50bc7936
AM
7457 break;
7458 }
7459
1e2f5b6e 7460 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
7461 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7462 r_symndx, ibfd))
50bc7936 7463 goto error_ret;
1e2f5b6e
AM
7464
7465 if (sym_sec == NULL || sym_sec->owner == NULL)
7466 {
411e1bfb
AM
7467 const char *sym_name;
7468 if (h != NULL)
7469 sym_name = h->root.root.string;
7470 else
26c61ae5
L
7471 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7472 sym_sec);
411e1bfb 7473
4eca0228 7474 _bfd_error_handler
695344c0 7475 /* xgettext:c-format */
871b3ab2 7476 (_("%pB: undefined sym `%s' in .opd section"),
d003868e 7477 ibfd, sym_name);
0a1b45a2 7478 broken = true;
1e2f5b6e
AM
7479 break;
7480 }
7481
51020317
AM
7482 /* opd entries are always for functions defined in the
7483 current input bfd. If the symbol isn't defined in the
7484 input bfd, then we won't be using the function in this
7485 bfd; It must be defined in a linkonce section in another
7486 bfd, or is weak. It's also possible that we are
7487 discarding the function due to a linker script /DISCARD/,
7488 which we test for via the output_section. */
7489 if (sym_sec->owner != ibfd
7490 || sym_sec->output_section == bfd_abs_section_ptr)
0a1b45a2 7491 need_edit = true;
1e2f5b6e 7492
50bc7936 7493 rel += 2;
51aecdc5
AM
7494 if (rel + 1 == relend
7495 || (rel + 2 < relend
7496 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
7497 ++rel;
7498
7499 if (rel == relend)
3f764659
JJ
7500 {
7501 if (sec->size == offset + 24)
7502 {
7503 need_pad = NULL;
7504 break;
7505 }
51aecdc5 7506 if (sec->size == offset + 16)
3f764659
JJ
7507 {
7508 cnt_16b++;
7509 break;
7510 }
7511 goto broken_opd;
7512 }
3f764659
JJ
7513 else if (rel + 1 < relend
7514 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7515 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7516 {
51aecdc5
AM
7517 if (rel[0].r_offset == offset + 16)
7518 cnt_16b++;
7519 else if (rel[0].r_offset != offset + 24)
7520 goto broken_opd;
3f764659
JJ
7521 }
7522 else
7523 goto broken_opd;
1e2f5b6e
AM
7524 }
7525
e7d1c40c 7526 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
3f764659 7527
51aecdc5 7528 if (!broken && (need_edit || add_aux_fields))
1e2f5b6e
AM
7529 {
7530 Elf_Internal_Rela *write_rel;
d4730f92 7531 Elf_Internal_Shdr *rel_hdr;
1e2f5b6e 7532 bfd_byte *rptr, *wptr;
983bddc8 7533 bfd_byte *new_contents;
74f0fb50
AM
7534 bfd_size_type amt;
7535
983bddc8 7536 new_contents = NULL;
51aecdc5 7537 amt = OPD_NDX (sec->size) * sizeof (long);
74f0fb50 7538 opd = &ppc64_elf_section_data (sec)->u.opd;
33c0ec9d 7539 opd->adjust = bfd_zalloc (sec->owner, amt);
74f0fb50 7540 if (opd->adjust == NULL)
0a1b45a2 7541 return false;
1e2f5b6e
AM
7542
7543 /* This seems a waste of time as input .opd sections are all
7544 zeros as generated by gcc, but I suppose there's no reason
7545 this will always be so. We might start putting something in
7546 the third word of .opd entries. */
7547 if ((sec->flags & SEC_IN_MEMORY) == 0)
7548 {
eea6121a
AM
7549 bfd_byte *loc;
7550 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 7551 {
c9594989 7552 free (loc);
50bc7936 7553 error_ret:
c9594989 7554 if (symtab_hdr->contents != (unsigned char *) local_syms)
6cdc0ccc 7555 free (local_syms);
6cdc0ccc
AM
7556 if (elf_section_data (sec)->relocs != relstart)
7557 free (relstart);
0a1b45a2 7558 return false;
6cdc0ccc 7559 }
1e2f5b6e
AM
7560 sec->contents = loc;
7561 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7562 }
7563
7564 elf_section_data (sec)->relocs = relstart;
7565
3f764659 7566 new_contents = sec->contents;
3f764659
JJ
7567 if (add_aux_fields)
7568 {
7569 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7570 if (new_contents == NULL)
0a1b45a2 7571 return false;
51aecdc5 7572 need_pad = NULL;
3f764659 7573 }
b4f4e59f
AM
7574 wptr = new_contents;
7575 rptr = sec->contents;
1e2f5b6e 7576 write_rel = relstart;
51aecdc5 7577 for (rel = relstart; rel < relend; )
1e2f5b6e 7578 {
50bc7936
AM
7579 unsigned long r_symndx;
7580 asection *sym_sec;
7581 struct elf_link_hash_entry *h;
51aecdc5 7582 struct ppc_link_hash_entry *fdh = NULL;
50bc7936 7583 Elf_Internal_Sym *sym;
51aecdc5
AM
7584 long opd_ent_size;
7585 Elf_Internal_Rela *next_rel;
0a1b45a2 7586 bool skip;
50bc7936
AM
7587
7588 r_symndx = ELF64_R_SYM (rel->r_info);
7589 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 7590 r_symndx, ibfd))
50bc7936
AM
7591 goto error_ret;
7592
51aecdc5
AM
7593 next_rel = rel + 2;
7594 if (next_rel + 1 == relend
7595 || (next_rel + 2 < relend
7596 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
7597 ++next_rel;
7598
7599 /* See if the .opd entry is full 24 byte or
7600 16 byte (with fd_aux entry overlapped with next
7601 fd_func). */
7602 opd_ent_size = 24;
7603 if (next_rel == relend)
1e2f5b6e 7604 {
51aecdc5 7605 if (sec->size == rel->r_offset + 16)
3f764659 7606 opd_ent_size = 16;
51aecdc5
AM
7607 }
7608 else if (next_rel->r_offset == rel->r_offset + 16)
7609 opd_ent_size = 16;
3f764659 7610
51aecdc5
AM
7611 if (h != NULL
7612 && h->root.root.string[0] == '.')
7613 {
ed7007c1 7614 fdh = ppc_elf_hash_entry (h)->oh;
8c5b4e52
AM
7615 if (fdh != NULL)
7616 {
7617 fdh = ppc_follow_link (fdh);
7618 if (fdh->elf.root.type != bfd_link_hash_defined
7619 && fdh->elf.root.type != bfd_link_hash_defweak)
7620 fdh = NULL;
7621 }
51aecdc5 7622 }
1e2f5b6e 7623
51aecdc5
AM
7624 skip = (sym_sec->owner != ibfd
7625 || sym_sec->output_section == bfd_abs_section_ptr);
7626 if (skip)
7627 {
7628 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7 7629 {
51aecdc5
AM
7630 /* Arrange for the function descriptor sym
7631 to be dropped. */
7632 fdh->elf.root.u.def.value = 0;
7633 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 7634 }
51aecdc5 7635 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
1e2f5b6e 7636
0e1862bb 7637 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
51aecdc5
AM
7638 rel = next_rel;
7639 else
7640 while (1)
7641 {
1657026c 7642 if (!dec_dynrel_count (rel, sec, info,
51aecdc5
AM
7643 NULL, h, sym))
7644 goto error_ret;
754021d0 7645
51aecdc5
AM
7646 if (++rel == next_rel)
7647 break;
1e2f5b6e 7648
51aecdc5
AM
7649 r_symndx = ELF64_R_SYM (rel->r_info);
7650 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7651 r_symndx, ibfd))
7652 goto error_ret;
7653 }
50bc7936
AM
7654 }
7655 else
1e2f5b6e 7656 {
51aecdc5
AM
7657 /* We'll be keeping this opd entry. */
7658 long adjust;
7659
7660 if (fdh != NULL)
7661 {
7662 /* Redefine the function descriptor symbol to
7663 this location in the opd section. It is
7664 necessary to update the value here rather
7665 than using an array of adjustments as we do
7666 for local symbols, because various places
7667 in the generic ELF code use the value
7668 stored in u.def.value. */
7669 fdh->elf.root.u.def.value = wptr - new_contents;
7670 fdh->adjust_done = 1;
7671 }
7672
7673 /* Local syms are a bit tricky. We could
7674 tweak them as they can be cached, but
7675 we'd need to look through the local syms
7676 for the function descriptor sym which we
7677 don't have at the moment. So keep an
7678 array of adjustments. */
7679 adjust = (wptr - new_contents) - (rptr - sec->contents);
7680 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
7681
7682 if (wptr != rptr)
7683 memcpy (wptr, rptr, opd_ent_size);
7684 wptr += opd_ent_size;
7685 if (add_aux_fields && opd_ent_size == 16)
7686 {
7687 memset (wptr, '\0', 8);
7688 wptr += 8;
7689 }
7690
50bc7936 7691 /* We need to adjust any reloc offsets to point to the
51aecdc5
AM
7692 new opd entries. */
7693 for ( ; rel != next_rel; ++rel)
7694 {
7695 rel->r_offset += adjust;
7696 if (write_rel != rel)
7697 memcpy (write_rel, rel, sizeof (*rel));
7698 ++write_rel;
7699 }
1e2f5b6e 7700 }
51aecdc5
AM
7701
7702 rptr += opd_ent_size;
1e2f5b6e
AM
7703 }
7704
3f764659 7705 sec->size = wptr - new_contents;
1e2f5b6e 7706 sec->reloc_count = write_rel - relstart;
3f764659
JJ
7707 if (add_aux_fields)
7708 {
7709 free (sec->contents);
7710 sec->contents = new_contents;
7711 }
7712
05bf9422 7713 /* Fudge the header size too, as this is used later in
cdcf6e38 7714 elf_bfd_final_link if we are emitting relocs. */
d4730f92
BS
7715 rel_hdr = _bfd_elf_single_rel_hdr (sec);
7716 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
0a1b45a2 7717 some_edited = true;
1e2f5b6e 7718 }
6cdc0ccc 7719 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 7720 free (relstart);
6cdc0ccc 7721
411e1bfb
AM
7722 if (local_syms != NULL
7723 && symtab_hdr->contents != (unsigned char *) local_syms)
7724 {
7725 if (!info->keep_memory)
7726 free (local_syms);
7727 else
7728 symtab_hdr->contents = (unsigned char *) local_syms;
7729 }
7730 }
7731
754021d0
AM
7732 if (some_edited)
7733 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7734
3f764659
JJ
7735 /* If we are doing a final link and the last .opd entry is just 16 byte
7736 long, add a 8 byte padding after it. */
0e1862bb 7737 if (need_pad != NULL && !bfd_link_relocatable (info))
3f764659
JJ
7738 {
7739 bfd_byte *p;
7740
7741 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7742 {
7743 BFD_ASSERT (need_pad->size > 0);
7744
7745 p = bfd_malloc (need_pad->size + 8);
7746 if (p == NULL)
0a1b45a2 7747 return false;
699733f6 7748
2cdcc330
AM
7749 if (!bfd_get_section_contents (need_pad->owner, need_pad,
7750 p, 0, need_pad->size))
0a1b45a2 7751 return false;
3f764659
JJ
7752
7753 need_pad->contents = p;
7754 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7755 }
7756 else
7757 {
7758 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7759 if (p == NULL)
0a1b45a2 7760 return false;
3f764659
JJ
7761
7762 need_pad->contents = p;
7763 }
7764
7765 memset (need_pad->contents + need_pad->size, 0, 8);
7766 need_pad->size += 8;
7767 }
7768
0a1b45a2 7769 return true;
411e1bfb
AM
7770}
7771
3e04d765
AM
7772/* Analyze inline PLT call relocations to see whether calls to locally
7773 defined functions can be converted to direct calls. */
7774
0a1b45a2 7775bool
3e04d765
AM
7776ppc64_elf_inline_plt (struct bfd_link_info *info)
7777{
7778 struct ppc_link_hash_table *htab;
7779 bfd *ibfd;
7780 asection *sec;
7781 bfd_vma low_vma, high_vma, limit;
7782
7783 htab = ppc_hash_table (info);
7784 if (htab == NULL)
0a1b45a2 7785 return false;
3e04d765
AM
7786
7787 /* A bl insn can reach -0x2000000 to 0x1fffffc. The limit is
7788 reduced somewhat to cater for possible stubs that might be added
7789 between the call and its destination. */
7790 if (htab->params->group_size < 0)
7791 {
7792 limit = -htab->params->group_size;
7793 if (limit == 1)
7794 limit = 0x1e00000;
7795 }
7796 else
7797 {
7798 limit = htab->params->group_size;
7799 if (limit == 1)
7800 limit = 0x1c00000;
7801 }
7802
7803 low_vma = -1;
7804 high_vma = 0;
7805 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
7806 if ((sec->flags & (SEC_ALLOC | SEC_CODE)) == (SEC_ALLOC | SEC_CODE))
7807 {
7808 if (low_vma > sec->vma)
7809 low_vma = sec->vma;
7810 if (high_vma < sec->vma + sec->size)
7811 high_vma = sec->vma + sec->size;
7812 }
7813
7814 /* If a "bl" can reach anywhere in local code sections, then we can
7815 convert all inline PLT sequences to direct calls when the symbol
7816 is local. */
7817 if (high_vma - low_vma < limit)
7818 {
7819 htab->can_convert_all_inline_plt = 1;
0a1b45a2 7820 return true;
3e04d765
AM
7821 }
7822
7823 /* Otherwise, go looking through relocs for cases where a direct
7824 call won't reach. Mark the symbol on any such reloc to disable
7825 the optimization and keep the PLT entry as it seems likely that
7826 this will be better than creating trampolines. Note that this
7827 will disable the optimization for all inline PLT calls to a
7828 particular symbol, not just those that won't reach. The
7829 difficulty in doing a more precise optimization is that the
7830 linker needs to make a decision depending on whether a
7831 particular R_PPC64_PLTCALL insn can be turned into a direct
7832 call, for each of the R_PPC64_PLTSEQ and R_PPC64_PLT16* insns in
7833 the sequence, and there is nothing that ties those relocs
7834 together except their symbol. */
7835
7836 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
7837 {
7838 Elf_Internal_Shdr *symtab_hdr;
7839 Elf_Internal_Sym *local_syms;
7840
7841 if (!is_ppc64_elf (ibfd))
7842 continue;
7843
7844 local_syms = NULL;
7845 symtab_hdr = &elf_symtab_hdr (ibfd);
7846
7847 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7848 if (ppc64_elf_section_data (sec)->has_pltcall
7849 && !bfd_is_abs_section (sec->output_section))
7850 {
7851 Elf_Internal_Rela *relstart, *rel, *relend;
7852
7853 /* Read the relocations. */
7854 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7855 info->keep_memory);
7856 if (relstart == NULL)
0a1b45a2 7857 return false;
3e04d765
AM
7858
7859 relend = relstart + sec->reloc_count;
435edf0b 7860 for (rel = relstart; rel < relend; rel++)
3e04d765
AM
7861 {
7862 enum elf_ppc64_reloc_type r_type;
7863 unsigned long r_symndx;
7864 asection *sym_sec;
7865 struct elf_link_hash_entry *h;
7866 Elf_Internal_Sym *sym;
7867 unsigned char *tls_maskp;
7868
7869 r_type = ELF64_R_TYPE (rel->r_info);
5663e321
AM
7870 if (r_type != R_PPC64_PLTCALL
7871 && r_type != R_PPC64_PLTCALL_NOTOC)
3e04d765
AM
7872 continue;
7873
7874 r_symndx = ELF64_R_SYM (rel->r_info);
7875 if (!get_sym_h (&h, &sym, &sym_sec, &tls_maskp, &local_syms,
7876 r_symndx, ibfd))
7877 {
7878 if (elf_section_data (sec)->relocs != relstart)
7879 free (relstart);
c9594989 7880 if (symtab_hdr->contents != (bfd_byte *) local_syms)
3e04d765 7881 free (local_syms);
0a1b45a2 7882 return false;
3e04d765
AM
7883 }
7884
7885 if (sym_sec != NULL && sym_sec->output_section != NULL)
7886 {
7887 bfd_vma from, to;
7888 if (h != NULL)
7889 to = h->root.u.def.value;
7890 else
7891 to = sym->st_value;
7892 to += (rel->r_addend
7893 + sym_sec->output_offset
7894 + sym_sec->output_section->vma);
7895 from = (rel->r_offset
7896 + sec->output_offset
7897 + sec->output_section->vma);
5663e321
AM
7898 if (to - from + limit < 2 * limit
7899 && !(r_type == R_PPC64_PLTCALL_NOTOC
7900 && (((h ? h->other : sym->st_other)
7901 & STO_PPC64_LOCAL_MASK)
4a4e7361 7902 > 1 << STO_PPC64_LOCAL_BIT)))
3e04d765
AM
7903 *tls_maskp &= ~PLT_KEEP;
7904 }
7905 }
7906 if (elf_section_data (sec)->relocs != relstart)
7907 free (relstart);
7908 }
7909
7910 if (local_syms != NULL
7911 && symtab_hdr->contents != (unsigned char *) local_syms)
7912 {
7913 if (!info->keep_memory)
7914 free (local_syms);
7915 else
7916 symtab_hdr->contents = (unsigned char *) local_syms;
7917 }
7918 }
7919
0a1b45a2 7920 return true;
3e04d765
AM
7921}
7922
c9405344
AM
7923/* Set htab->tls_get_addr and various other info specific to TLS.
7924 This needs to run before dynamic symbols are processed in
7925 bfd_elf_size_dynamic_sections. */
411e1bfb 7926
0a1b45a2 7927bool
e7d1c40c 7928ppc64_elf_tls_setup (struct bfd_link_info *info)
411e1bfb 7929{
411e1bfb 7930 struct ppc_link_hash_table *htab;
9e7028aa 7931 struct elf_link_hash_entry *tga, *tga_fd, *desc, *desc_fd;
411e1bfb 7932
411e1bfb 7933 htab = ppc_hash_table (info);
4dfe6ac6 7934 if (htab == NULL)
0a1b45a2 7935 return false;
4dfe6ac6 7936
a442059f
AM
7937 /* Move dynamic linking info to the function descriptor sym. */
7938 if (htab->need_func_desc_adj)
7939 {
7940 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
7941 htab->need_func_desc_adj = 0;
7942 }
7943
ee67d69a
AM
7944 if (abiversion (info->output_bfd) == 1)
7945 htab->opd_abi = 1;
7946
e7d1c40c 7947 if (htab->params->no_multi_toc)
33c0ec9d
AM
7948 htab->do_multi_toc = 0;
7949 else if (!htab->do_multi_toc)
e7d1c40c 7950 htab->params->no_multi_toc = 1;
33c0ec9d 7951
8b5f1ed8
AM
7952 /* Default to --no-plt-localentry, as this option can cause problems
7953 with symbol interposition. For example, glibc libpthread.so and
7954 libc.so duplicate many pthread symbols, with a fallback
7955 implementation in libc.so. In some cases the fallback does more
7956 work than the pthread implementation. __pthread_condattr_destroy
7957 is one such symbol: the libpthread.so implementation is
7958 localentry:0 while the libc.so implementation is localentry:8.
7959 An app that "cleverly" uses dlopen to only load necessary
7960 libraries at runtime may omit loading libpthread.so when not
7961 running multi-threaded, which then results in the libc.so
7962 fallback symbols being used and ld.so complaining. Now there
7963 are workarounds in ld (see non_zero_localentry) to detect the
7964 pthread situation, but that may not be the only case where
7965 --plt-localentry can cause trouble. */
f378ab09 7966 if (htab->params->plt_localentry0 < 0)
8b5f1ed8 7967 htab->params->plt_localentry0 = 0;
3cd7c7d7
AM
7968 if (htab->params->plt_localentry0 && htab->has_power10_relocs)
7969 {
7970 /* The issue is that __glink_PLTresolve saves r2, which is done
7971 because glibc ld.so _dl_runtime_resolve restores r2 to support
7972 a glibc plt call optimisation where global entry code is
7973 skipped on calls that resolve to the same binary. The
7974 __glink_PLTresolve save of r2 is incompatible with code
7975 making tail calls, because the tail call might go via the
7976 resolver and thus overwrite the proper saved r2. */
7977 _bfd_error_handler (_("warning: --plt-localentry is incompatible with "
7978 "power10 pc-relative code"));
7979 htab->params->plt_localentry0 = 0;
7980 }
d44c746a
AM
7981 if (htab->params->plt_localentry0
7982 && elf_link_hash_lookup (&htab->elf, "GLIBC_2.26",
0a1b45a2 7983 false, false, false) == NULL)
cf97bcb0
AM
7984 _bfd_error_handler
7985 (_("warning: --plt-localentry is especially dangerous without "
7986 "ld.so support to detect ABI violations"));
f378ab09 7987
9e7028aa 7988 tga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
0a1b45a2 7989 false, false, true);
9e7028aa 7990 htab->tls_get_addr = ppc_elf_hash_entry (tga);
9e7028aa 7991 tga_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
0a1b45a2 7992 false, false, true);
9e7028aa
AM
7993 htab->tls_get_addr_fd = ppc_elf_hash_entry (tga_fd);
7994
7995 desc = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_desc",
0a1b45a2 7996 false, false, true);
9e7028aa 7997 htab->tga_desc = ppc_elf_hash_entry (desc);
9e7028aa 7998 desc_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_desc",
0a1b45a2 7999 false, false, true);
9e7028aa
AM
8000 htab->tga_desc_fd = ppc_elf_hash_entry (desc_fd);
8001
7c9cf415 8002 if (htab->params->tls_get_addr_opt)
a7f2871e 8003 {
9e7028aa 8004 struct elf_link_hash_entry *opt, *opt_fd;
a7f2871e
AM
8005
8006 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
0a1b45a2 8007 false, false, true);
a7f2871e 8008 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
0a1b45a2 8009 false, false, true);
a7f2871e
AM
8010 if (opt_fd != NULL
8011 && (opt_fd->root.type == bfd_link_hash_defined
8012 || opt_fd->root.type == bfd_link_hash_defweak))
8013 {
8014 /* If glibc supports an optimized __tls_get_addr call stub,
8015 signalled by the presence of __tls_get_addr_opt, and we'll
8016 be calling __tls_get_addr via a plt call stub, then
8017 make __tls_get_addr point to __tls_get_addr_opt. */
9e7028aa
AM
8018 if (!(htab->elf.dynamic_sections_created
8019 && tga_fd != NULL
8020 && (tga_fd->type == STT_FUNC
8021 || tga_fd->needs_plt)
8022 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
8023 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd))))
8024 tga_fd = NULL;
8025 if (!(htab->elf.dynamic_sections_created
8026 && desc_fd != NULL
8027 && (desc_fd->type == STT_FUNC
8028 || desc_fd->needs_plt)
8029 && !(SYMBOL_CALLS_LOCAL (info, desc_fd)
8030 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, desc_fd))))
8031 desc_fd = NULL;
8032
8033 if (tga_fd != NULL || desc_fd != NULL)
8034 {
8035 struct plt_entry *ent = NULL;
8036
8037 if (tga_fd != NULL)
8038 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
8039 if (ent->plt.refcount > 0)
8040 break;
8041 if (ent == NULL && desc_fd != NULL)
8042 for (ent = desc_fd->plt.plist; ent != NULL; ent = ent->next)
8043 if (ent->plt.refcount > 0)
8044 break;
a7f2871e
AM
8045 if (ent != NULL)
8046 {
9e7028aa
AM
8047 if (tga_fd != NULL)
8048 {
8049 tga_fd->root.type = bfd_link_hash_indirect;
8050 tga_fd->root.u.i.link = &opt_fd->root;
8051 tga_fd->root.u.i.warning = NULL;
8052 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
8053 }
8054 if (desc_fd != NULL)
8055 {
8056 desc_fd->root.type = bfd_link_hash_indirect;
8057 desc_fd->root.u.i.link = &opt_fd->root;
8058 desc_fd->root.u.i.warning = NULL;
8059 ppc64_elf_copy_indirect_symbol (info, opt_fd, desc_fd);
8060 }
b531344c 8061 opt_fd->mark = 1;
a7f2871e
AM
8062 if (opt_fd->dynindx != -1)
8063 {
8064 /* Use __tls_get_addr_opt in dynamic relocations. */
8065 opt_fd->dynindx = -1;
8066 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
8067 opt_fd->dynstr_index);
8068 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
0a1b45a2 8069 return false;
a7f2871e 8070 }
9e7028aa 8071 if (tga_fd != NULL)
a7f2871e 8072 {
9e7028aa 8073 htab->tls_get_addr_fd = ppc_elf_hash_entry (opt_fd);
30845f11 8074 tga = elf_hash_entry (htab->tls_get_addr);
9e7028aa
AM
8075 if (opt != NULL && tga != NULL)
8076 {
8077 tga->root.type = bfd_link_hash_indirect;
8078 tga->root.u.i.link = &opt->root;
8079 tga->root.u.i.warning = NULL;
8080 ppc64_elf_copy_indirect_symbol (info, opt, tga);
8081 opt->mark = 1;
8082 _bfd_elf_link_hash_hide_symbol (info, opt,
8083 tga->forced_local);
8084 htab->tls_get_addr = ppc_elf_hash_entry (opt);
8085 }
8086 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
8087 htab->tls_get_addr_fd->is_func_descriptor = 1;
8088 if (htab->tls_get_addr != NULL)
8089 {
8090 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
8091 htab->tls_get_addr->is_func = 1;
8092 }
a7f2871e 8093 }
9e7028aa 8094 if (desc_fd != NULL)
a7f2871e 8095 {
9e7028aa
AM
8096 htab->tga_desc_fd = ppc_elf_hash_entry (opt_fd);
8097 if (opt != NULL && desc != NULL)
8098 {
8099 desc->root.type = bfd_link_hash_indirect;
8100 desc->root.u.i.link = &opt->root;
8101 desc->root.u.i.warning = NULL;
8102 ppc64_elf_copy_indirect_symbol (info, opt, desc);
8103 opt->mark = 1;
8104 _bfd_elf_link_hash_hide_symbol (info, opt,
8105 desc->forced_local);
8106 htab->tga_desc = ppc_elf_hash_entry (opt);
8107 }
8108 htab->tga_desc_fd->oh = htab->tga_desc;
8109 htab->tga_desc_fd->is_func_descriptor = 1;
8110 if (htab->tga_desc != NULL)
8111 {
8112 htab->tga_desc->oh = htab->tga_desc_fd;
8113 htab->tga_desc->is_func = 1;
8114 }
a7f2871e
AM
8115 }
8116 }
8117 }
8118 }
7c9cf415
AM
8119 else if (htab->params->tls_get_addr_opt < 0)
8120 htab->params->tls_get_addr_opt = 0;
a7f2871e 8121 }
9e7028aa
AM
8122
8123 if (htab->tga_desc_fd != NULL
8124 && htab->params->tls_get_addr_opt
8125 && htab->params->no_tls_get_addr_regsave == -1)
8126 htab->params->no_tls_get_addr_regsave = 0;
8127
0a1b45a2 8128 return true;
3a71aa26 8129}
8387904d 8130
3a71aa26 8131/* Return TRUE iff REL is a branch reloc with a global symbol matching
9e7028aa 8132 any of HASH1, HASH2, HASH3, or HASH4. */
8387904d 8133
0a1b45a2 8134static bool
30845f11
AM
8135branch_reloc_hash_match (bfd *ibfd,
8136 Elf_Internal_Rela *rel,
8137 struct ppc_link_hash_entry *hash1,
8138 struct ppc_link_hash_entry *hash2,
8139 struct ppc_link_hash_entry *hash3,
8140 struct ppc_link_hash_entry *hash4)
3a71aa26
AM
8141{
8142 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
8143 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
8144 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
8145
e054468f 8146 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8387904d 8147 {
3a71aa26
AM
8148 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
8149 struct elf_link_hash_entry *h;
8387904d 8150
3a71aa26 8151 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
b31867b6 8152 h = elf_follow_link (h);
30845f11
AM
8153 if (h == elf_hash_entry (hash1)
8154 || h == elf_hash_entry (hash2)
8155 || h == elf_hash_entry (hash3)
8156 || h == elf_hash_entry (hash4))
0a1b45a2 8157 return true;
a48ebf4d 8158 }
0a1b45a2 8159 return false;
951fd09b 8160}
411e1bfb 8161
951fd09b
AM
8162/* Run through all the TLS relocs looking for optimization
8163 opportunities. The linker has been hacked (see ppc64elf.em) to do
8164 a preliminary section layout so that we know the TLS segment
8165 offsets. We can't optimize earlier because some optimizations need
8166 to know the tp offset, and we need to optimize before allocating
8167 dynamic relocations. */
8168
0a1b45a2 8169bool
33c0ec9d 8170ppc64_elf_tls_optimize (struct bfd_link_info *info)
951fd09b
AM
8171{
8172 bfd *ibfd;
8173 asection *sec;
8174 struct ppc_link_hash_table *htab;
663a1470 8175 unsigned char *toc_ref;
102890f0 8176 int pass;
951fd09b 8177
3cbc1e5e 8178 if (!bfd_link_executable (info))
0a1b45a2 8179 return true;
411e1bfb 8180
951fd09b 8181 htab = ppc_hash_table (info);
4dfe6ac6 8182 if (htab == NULL)
0a1b45a2 8183 return false;
4dfe6ac6 8184
252dcdf4
AM
8185 htab->do_tls_opt = 1;
8186
663a1470
AM
8187 /* Make two passes over the relocs. On the first pass, mark toc
8188 entries involved with tls relocs, and check that tls relocs
8189 involved in setting up a tls_get_addr call are indeed followed by
8190 such a call. If they are not, we can't do any tls optimization.
8191 On the second pass twiddle tls_mask flags to notify
8192 relocate_section that optimization can be done, and adjust got
8193 and plt refcounts. */
8194 toc_ref = NULL;
8195 for (pass = 0; pass < 2; ++pass)
c72f2fb2 8196 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
663a1470
AM
8197 {
8198 Elf_Internal_Sym *locsyms = NULL;
8199 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
8200
102890f0
AM
8201 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8202 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
8203 {
8204 Elf_Internal_Rela *relstart, *rel, *relend;
0a1b45a2 8205 bool found_tls_get_addr_arg = 0;
411e1bfb 8206
102890f0
AM
8207 /* Read the relocations. */
8208 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8209 info->keep_memory);
8210 if (relstart == NULL)
2915c55b
JK
8211 {
8212 free (toc_ref);
0a1b45a2 8213 return false;
2915c55b 8214 }
411e1bfb 8215
102890f0
AM
8216 relend = relstart + sec->reloc_count;
8217 for (rel = relstart; rel < relend; rel++)
8218 {
8219 enum elf_ppc64_reloc_type r_type;
8220 unsigned long r_symndx;
8221 struct elf_link_hash_entry *h;
8222 Elf_Internal_Sym *sym;
8223 asection *sym_sec;
f961d9dd 8224 unsigned char *tls_mask;
46e9995a 8225 unsigned int tls_set, tls_clear, tls_type = 0;
102890f0 8226 bfd_vma value;
0a1b45a2 8227 bool ok_tprel, is_local;
102890f0
AM
8228 long toc_ref_index = 0;
8229 int expecting_tls_get_addr = 0;
0a1b45a2 8230 bool ret = false;
411e1bfb 8231
102890f0
AM
8232 r_symndx = ELF64_R_SYM (rel->r_info);
8233 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
8234 r_symndx, ibfd))
8235 {
8236 err_free_rel:
8237 if (elf_section_data (sec)->relocs != relstart)
8238 free (relstart);
c9594989
AM
8239 free (toc_ref);
8240 if (elf_symtab_hdr (ibfd).contents
8241 != (unsigned char *) locsyms)
102890f0 8242 free (locsyms);
663a1470 8243 return ret;
102890f0 8244 }
411e1bfb 8245
102890f0
AM
8246 if (h != NULL)
8247 {
766bc656
AM
8248 if (h->root.type == bfd_link_hash_defined
8249 || h->root.type == bfd_link_hash_defweak)
8250 value = h->root.u.def.value;
8251 else if (h->root.type == bfd_link_hash_undefweak)
8252 value = 0;
8253 else
663a1470
AM
8254 {
8255 found_tls_get_addr_arg = 0;
8256 continue;
8257 }
102890f0
AM
8258 }
8259 else
8260 /* Symbols referenced by TLS relocs must be of type
8261 STT_TLS. So no need for .opd local sym adjust. */
8262 value = sym->st_value;
8263
0a1b45a2 8264 ok_tprel = false;
f749f26e
AM
8265 is_local = SYMBOL_REFERENCES_LOCAL (info, h);
8266 if (is_local)
102890f0 8267 {
766bc656
AM
8268 if (h != NULL
8269 && h->root.type == bfd_link_hash_undefweak)
0a1b45a2 8270 ok_tprel = true;
c27b8c2a
AM
8271 else if (sym_sec != NULL
8272 && sym_sec->output_section != NULL)
766bc656
AM
8273 {
8274 value += sym_sec->output_offset;
8275 value += sym_sec->output_section->vma;
0b147428 8276 value -= htab->elf.tls_sec->vma + TP_OFFSET;
c213164a
AM
8277 /* Note that even though the prefix insns
8278 allow a 1<<33 offset we use the same test
8279 as for addis;addi. There may be a mix of
8280 pcrel and non-pcrel code and the decision
8281 to optimise is per symbol, not per TLS
8282 sequence. */
0b147428 8283 ok_tprel = value + 0x80008000ULL < 1ULL << 32;
766bc656 8284 }
102890f0 8285 }
951fd09b 8286
102890f0 8287 r_type = ELF64_R_TYPE (rel->r_info);
663a1470
AM
8288 /* If this section has old-style __tls_get_addr calls
8289 without marker relocs, then check that each
8290 __tls_get_addr call reloc is preceded by a reloc
8291 that conceivably belongs to the __tls_get_addr arg
8292 setup insn. If we don't find matching arg setup
8293 relocs, don't do any tls optimization. */
8294 if (pass == 0
9737e8af 8295 && sec->nomark_tls_get_addr
663a1470 8296 && h != NULL
ed7007c1 8297 && is_tls_get_addr (h, htab)
663a1470
AM
8298 && !found_tls_get_addr_arg
8299 && is_branch_reloc (r_type))
8300 {
25f53a85 8301 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
663a1470
AM
8302 "TLS optimization disabled\n"),
8303 ibfd, sec, rel->r_offset);
0a1b45a2 8304 ret = true;
663a1470
AM
8305 goto err_free_rel;
8306 }
8307
8308 found_tls_get_addr_arg = 0;
102890f0
AM
8309 switch (r_type)
8310 {
8311 case R_PPC64_GOT_TLSLD16:
8312 case R_PPC64_GOT_TLSLD16_LO:
87c69f97 8313 case R_PPC64_GOT_TLSLD_PCREL34:
102890f0 8314 expecting_tls_get_addr = 1;
663a1470 8315 found_tls_get_addr_arg = 1;
1a0670f3 8316 /* Fall through. */
102890f0
AM
8317
8318 case R_PPC64_GOT_TLSLD16_HI:
8319 case R_PPC64_GOT_TLSLD16_HA:
8320 /* These relocs should never be against a symbol
8321 defined in a shared lib. Leave them alone if
8322 that turns out to be the case. */
8323 if (!is_local)
8324 continue;
411e1bfb 8325
102890f0 8326 /* LD -> LE */
411e1bfb 8327 tls_set = 0;
102890f0
AM
8328 tls_clear = TLS_LD;
8329 tls_type = TLS_TLS | TLS_LD;
8330 break;
411e1bfb 8331
102890f0
AM
8332 case R_PPC64_GOT_TLSGD16:
8333 case R_PPC64_GOT_TLSGD16_LO:
87c69f97 8334 case R_PPC64_GOT_TLSGD_PCREL34:
102890f0 8335 expecting_tls_get_addr = 1;
663a1470 8336 found_tls_get_addr_arg = 1;
1a0670f3 8337 /* Fall through. */
102890f0
AM
8338
8339 case R_PPC64_GOT_TLSGD16_HI:
8340 case R_PPC64_GOT_TLSGD16_HA:
8341 if (ok_tprel)
8342 /* GD -> LE */
411e1bfb 8343 tls_set = 0;
102890f0
AM
8344 else
8345 /* GD -> IE */
b00a0a86 8346 tls_set = TLS_TLS | TLS_GDIE;
102890f0
AM
8347 tls_clear = TLS_GD;
8348 tls_type = TLS_TLS | TLS_GD;
8349 break;
8350
87c69f97 8351 case R_PPC64_GOT_TPREL_PCREL34:
102890f0
AM
8352 case R_PPC64_GOT_TPREL16_DS:
8353 case R_PPC64_GOT_TPREL16_LO_DS:
8354 case R_PPC64_GOT_TPREL16_HI:
8355 case R_PPC64_GOT_TPREL16_HA:
8356 if (ok_tprel)
8357 {
8358 /* IE -> LE */
8359 tls_set = 0;
8360 tls_clear = TLS_TPREL;
8361 tls_type = TLS_TLS | TLS_TPREL;
8362 break;
8363 }
411e1bfb
AM
8364 continue;
8365
727fc41e 8366 case R_PPC64_TLSLD:
7d04a20a
AM
8367 if (!is_local)
8368 continue;
8369 /* Fall through. */
8370 case R_PPC64_TLSGD:
23cedd1d
AM
8371 if (rel + 1 < relend
8372 && is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
8373 {
8374 if (pass != 0
2cdcc330 8375 && (ELF64_R_TYPE (rel[1].r_info)
5663e321
AM
8376 != R_PPC64_PLTSEQ)
8377 && (ELF64_R_TYPE (rel[1].r_info)
8378 != R_PPC64_PLTSEQ_NOTOC))
23cedd1d
AM
8379 {
8380 r_symndx = ELF64_R_SYM (rel[1].r_info);
8381 if (!get_sym_h (&h, NULL, NULL, NULL, &locsyms,
2cdcc330 8382 r_symndx, ibfd))
23cedd1d
AM
8383 goto err_free_rel;
8384 if (h != NULL)
8385 {
8386 struct plt_entry *ent = NULL;
8387
8388 for (ent = h->plt.plist;
8389 ent != NULL;
8390 ent = ent->next)
8391 if (ent->addend == rel[1].r_addend)
8392 break;
8393
8394 if (ent != NULL
8395 && ent->plt.refcount > 0)
8396 ent->plt.refcount -= 1;
8397 }
8398 }
8399 continue;
8400 }
663a1470 8401 found_tls_get_addr_arg = 1;
1a0670f3 8402 /* Fall through. */
663a1470
AM
8403
8404 case R_PPC64_TLS:
8405 case R_PPC64_TOC16:
8406 case R_PPC64_TOC16_LO:
102890f0
AM
8407 if (sym_sec == NULL || sym_sec != toc)
8408 continue;
8409
8410 /* Mark this toc entry as referenced by a TLS
8411 code sequence. We can do that now in the
8412 case of R_PPC64_TLS, and after checking for
8413 tls_get_addr for the TOC16 relocs. */
8414 if (toc_ref == NULL)
2cdcc330
AM
8415 toc_ref
8416 = bfd_zmalloc (toc->output_section->rawsize / 8);
663a1470
AM
8417 if (toc_ref == NULL)
8418 goto err_free_rel;
8419
102890f0
AM
8420 if (h != NULL)
8421 value = h->root.u.def.value;
8422 else
8423 value = sym->st_value;
8424 value += rel->r_addend;
73242275
AM
8425 if (value % 8 != 0)
8426 continue;
8427 BFD_ASSERT (value < toc->size
8428 && toc->output_offset % 8 == 0);
663a1470 8429 toc_ref_index = (value + toc->output_offset) / 8;
727fc41e
AM
8430 if (r_type == R_PPC64_TLS
8431 || r_type == R_PPC64_TLSGD
8432 || r_type == R_PPC64_TLSLD)
102890f0
AM
8433 {
8434 toc_ref[toc_ref_index] = 1;
8435 continue;
8436 }
8437
8438 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8439 continue;
8440
8441 tls_set = 0;
8442 tls_clear = 0;
8443 expecting_tls_get_addr = 2;
8444 break;
8445
8446 case R_PPC64_TPREL64:
8447 if (pass == 0
8448 || sec != toc
8449 || toc_ref == NULL
663a1470 8450 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8451 continue;
8452 if (ok_tprel)
8453 {
8454 /* IE -> LE */
8455 tls_set = TLS_EXPLICIT;
8456 tls_clear = TLS_TPREL;
8457 break;
8458 }
8459 continue;
8460
8461 case R_PPC64_DTPMOD64:
8462 if (pass == 0
8463 || sec != toc
8464 || toc_ref == NULL
663a1470 8465 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
102890f0
AM
8466 continue;
8467 if (rel + 1 < relend
8468 && (rel[1].r_info
8469 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8470 && rel[1].r_offset == rel->r_offset + 8)
8471 {
8472 if (ok_tprel)
8473 /* GD -> LE */
8474 tls_set = TLS_EXPLICIT | TLS_GD;
8475 else
8476 /* GD -> IE */
b00a0a86 8477 tls_set = TLS_EXPLICIT | TLS_GD | TLS_GDIE;
102890f0
AM
8478 tls_clear = TLS_GD;
8479 }
8480 else
8481 {
8482 if (!is_local)
8483 continue;
8484
8485 /* LD -> LE */
8486 tls_set = TLS_EXPLICIT;
8487 tls_clear = TLS_LD;
8488 }
8489 break;
8490
252dcdf4
AM
8491 case R_PPC64_TPREL16_HA:
8492 if (pass == 0)
8493 {
8494 unsigned char buf[4];
8495 unsigned int insn;
8496 bfd_vma off = rel->r_offset & ~3;
8497 if (!bfd_get_section_contents (ibfd, sec, buf,
8498 off, 4))
8499 goto err_free_rel;
8500 insn = bfd_get_32 (ibfd, buf);
8501 /* addis rt,13,imm */
8502 if ((insn & ((0x3fu << 26) | 0x1f << 16))
8503 != ((15u << 26) | (13 << 16)))
8504 {
8505 /* xgettext:c-format */
8506 info->callbacks->minfo
8507 (_("%H: warning: %s unexpected insn %#x.\n"),
8508 ibfd, sec, off, "R_PPC64_TPREL16_HA", insn);
8509 htab->do_tls_opt = 0;
8510 }
8511 }
8512 continue;
8513
8514 case R_PPC64_TPREL16_HI:
8515 case R_PPC64_TPREL16_HIGH:
8516 case R_PPC64_TPREL16_HIGHA:
8517 case R_PPC64_TPREL16_HIGHER:
8518 case R_PPC64_TPREL16_HIGHERA:
8519 case R_PPC64_TPREL16_HIGHEST:
8520 case R_PPC64_TPREL16_HIGHESTA:
8521 /* These can all be used in sequences along with
8522 TPREL16_LO or TPREL16_LO_DS in ways we aren't
8523 able to verify easily. */
8524 htab->do_tls_opt = 0;
8525 continue;
8526
102890f0
AM
8527 default:
8528 continue;
8529 }
8530
8531 if (pass == 0)
8532 {
727fc41e 8533 if (!expecting_tls_get_addr
9737e8af 8534 || !sec->nomark_tls_get_addr)
102890f0
AM
8535 continue;
8536
3a71aa26
AM
8537 if (rel + 1 < relend
8538 && branch_reloc_hash_match (ibfd, rel + 1,
9e7028aa
AM
8539 htab->tls_get_addr_fd,
8540 htab->tga_desc_fd,
3a71aa26 8541 htab->tls_get_addr,
9e7028aa 8542 htab->tga_desc))
102890f0 8543 {
3a71aa26 8544 if (expecting_tls_get_addr == 2)
102890f0 8545 {
3a71aa26 8546 /* Check for toc tls entries. */
f961d9dd 8547 unsigned char *toc_tls;
3a71aa26
AM
8548 int retval;
8549
8550 retval = get_tls_mask (&toc_tls, NULL, NULL,
8551 &locsyms,
8552 rel, ibfd);
8553 if (retval == 0)
8554 goto err_free_rel;
663a1470
AM
8555 if (toc_tls != NULL)
8556 {
37da22e5
AM
8557 if ((*toc_tls & TLS_TLS) != 0
8558 && ((*toc_tls & (TLS_GD | TLS_LD)) != 0))
663a1470
AM
8559 found_tls_get_addr_arg = 1;
8560 if (retval > 1)
8561 toc_ref[toc_ref_index] = 1;
8562 }
102890f0 8563 }
3a71aa26 8564 continue;
102890f0
AM
8565 }
8566
102890f0
AM
8567 /* Uh oh, we didn't find the expected call. We
8568 could just mark this symbol to exclude it
8569 from tls optimization but it's safer to skip
663a1470 8570 the entire optimization. */
695344c0 8571 /* xgettext:c-format */
25f53a85 8572 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
663a1470
AM
8573 "TLS optimization disabled\n"),
8574 ibfd, sec, rel->r_offset);
0a1b45a2 8575 ret = true;
663a1470 8576 goto err_free_rel;
102890f0
AM
8577 }
8578
37da22e5
AM
8579 /* If we don't have old-style __tls_get_addr calls
8580 without TLSGD/TLSLD marker relocs, and we haven't
8581 found a new-style __tls_get_addr call with a
8582 marker for this symbol, then we either have a
8583 broken object file or an -mlongcall style
8584 indirect call to __tls_get_addr without a marker.
8585 Disable optimization in this case. */
8586 if ((tls_clear & (TLS_GD | TLS_LD)) != 0
8587 && (tls_set & TLS_EXPLICIT) == 0
9737e8af 8588 && !sec->nomark_tls_get_addr
37da22e5
AM
8589 && ((*tls_mask & (TLS_TLS | TLS_MARK))
8590 != (TLS_TLS | TLS_MARK)))
8591 continue;
8592
7d04a20a 8593 if (expecting_tls_get_addr == 1 + !sec->nomark_tls_get_addr)
102890f0 8594 {
23cedd1d
AM
8595 struct plt_entry *ent = NULL;
8596
9e7028aa
AM
8597 if (htab->tls_get_addr_fd != NULL)
8598 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8599 ent != NULL;
8600 ent = ent->next)
8601 if (ent->addend == 0)
8602 break;
8603
8604 if (ent == NULL && htab->tga_desc_fd != NULL)
8605 for (ent = htab->tga_desc_fd->elf.plt.plist;
8606 ent != NULL;
8607 ent = ent->next)
8608 if (ent->addend == 0)
8609 break;
8610
8611 if (ent == NULL && htab->tls_get_addr != NULL)
23cedd1d
AM
8612 for (ent = htab->tls_get_addr->elf.plt.plist;
8613 ent != NULL;
8614 ent = ent->next)
8615 if (ent->addend == 0)
102890f0 8616 break;
411e1bfb 8617
9e7028aa
AM
8618 if (ent == NULL && htab->tga_desc != NULL)
8619 for (ent = htab->tga_desc->elf.plt.plist;
23cedd1d
AM
8620 ent != NULL;
8621 ent = ent->next)
8622 if (ent->addend == 0)
102890f0 8623 break;
23cedd1d
AM
8624
8625 if (ent != NULL
8626 && ent->plt.refcount > 0)
8627 ent->plt.refcount -= 1;
102890f0 8628 }
411e1bfb 8629
102890f0 8630 if (tls_clear == 0)
30038c59
AM
8631 continue;
8632
102890f0
AM
8633 if ((tls_set & TLS_EXPLICIT) == 0)
8634 {
8635 struct got_entry *ent;
411e1bfb 8636
102890f0
AM
8637 /* Adjust got entry for this reloc. */
8638 if (h != NULL)
8639 ent = h->got.glist;
8640 else
8641 ent = elf_local_got_ents (ibfd)[r_symndx];
411e1bfb 8642
102890f0
AM
8643 for (; ent != NULL; ent = ent->next)
8644 if (ent->addend == rel->r_addend
8645 && ent->owner == ibfd
8646 && ent->tls_type == tls_type)
8647 break;
8648 if (ent == NULL)
8649 abort ();
411e1bfb 8650
102890f0
AM
8651 if (tls_set == 0)
8652 {
8653 /* We managed to get rid of a got entry. */
8654 if (ent->got.refcount > 0)
8655 ent->got.refcount -= 1;
8656 }
8657 }
8658 else
8659 {
8660 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8661 we'll lose one or two dyn relocs. */
1657026c 8662 if (!dec_dynrel_count (rel, sec, info,
19e08130 8663 NULL, h, sym))
0a1b45a2 8664 return false;
411e1bfb 8665
102890f0
AM
8666 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8667 {
1657026c 8668 if (!dec_dynrel_count (rel + 1, sec, info,
19e08130 8669 NULL, h, sym))
0a1b45a2 8670 return false;
102890f0
AM
8671 }
8672 }
411e1bfb 8673
46e9995a 8674 *tls_mask |= tls_set & 0xff;
102890f0
AM
8675 *tls_mask &= ~tls_clear;
8676 }
8c1d1bb8 8677
102890f0
AM
8678 if (elf_section_data (sec)->relocs != relstart)
8679 free (relstart);
8680 }
411e1bfb 8681
663a1470
AM
8682 if (locsyms != NULL
8683 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8684 {
8685 if (!info->keep_memory)
8686 free (locsyms);
8687 else
8688 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8689 }
8690 }
411e1bfb 8691
c9594989 8692 free (toc_ref);
0a1b45a2 8693 return true;
1e2f5b6e 8694}
b34976b6 8695
c5614fa4
AM
8696/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8697 the values of any global symbols in a toc section that has been
8698 edited. Globals in toc sections should be a rarity, so this function
8699 sets a flag if any are found in toc sections other than the one just
de194d85 8700 edited, so that further hash table traversals can be avoided. */
c5614fa4
AM
8701
8702struct adjust_toc_info
8703{
8704 asection *toc;
8705 unsigned long *skip;
0a1b45a2 8706 bool global_toc_syms;
c5614fa4
AM
8707};
8708
ba761f19
AM
8709enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8710
0a1b45a2 8711static bool
c5614fa4
AM
8712adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8713{
8714 struct ppc_link_hash_entry *eh;
8715 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
854b41e7 8716 unsigned long i;
c5614fa4 8717
c5614fa4
AM
8718 if (h->root.type != bfd_link_hash_defined
8719 && h->root.type != bfd_link_hash_defweak)
0a1b45a2 8720 return true;
c5614fa4 8721
ed7007c1 8722 eh = ppc_elf_hash_entry (h);
c5614fa4 8723 if (eh->adjust_done)
0a1b45a2 8724 return true;
c5614fa4
AM
8725
8726 if (eh->elf.root.u.def.section == toc_inf->toc)
8727 {
854b41e7
AM
8728 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8729 i = toc_inf->toc->rawsize >> 3;
c5614fa4 8730 else
854b41e7
AM
8731 i = eh->elf.root.u.def.value >> 3;
8732
ba761f19 8733 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
c5614fa4 8734 {
4eca0228 8735 _bfd_error_handler
854b41e7
AM
8736 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8737 do
8738 ++i;
ba761f19 8739 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
854b41e7 8740 eh->elf.root.u.def.value = (bfd_vma) i << 3;
c5614fa4 8741 }
854b41e7
AM
8742
8743 eh->elf.root.u.def.value -= toc_inf->skip[i];
c5614fa4
AM
8744 eh->adjust_done = 1;
8745 }
8746 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
0a1b45a2 8747 toc_inf->global_toc_syms = true;
c5614fa4 8748
0a1b45a2 8749 return true;
c5614fa4
AM
8750}
8751
39eeab25
AM
8752/* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
8753 on a _LO variety toc/got reloc. */
560c8763 8754
0a1b45a2 8755static bool
39eeab25 8756ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type)
560c8763 8757{
2365f8d7
AM
8758 return ((insn & (0x3fu << 26)) == 12u << 26 /* addic */
8759 || (insn & (0x3fu << 26)) == 14u << 26 /* addi */
8760 || (insn & (0x3fu << 26)) == 32u << 26 /* lwz */
8761 || (insn & (0x3fu << 26)) == 34u << 26 /* lbz */
8762 || (insn & (0x3fu << 26)) == 36u << 26 /* stw */
8763 || (insn & (0x3fu << 26)) == 38u << 26 /* stb */
8764 || (insn & (0x3fu << 26)) == 40u << 26 /* lhz */
8765 || (insn & (0x3fu << 26)) == 42u << 26 /* lha */
8766 || (insn & (0x3fu << 26)) == 44u << 26 /* sth */
8767 || (insn & (0x3fu << 26)) == 46u << 26 /* lmw */
8768 || (insn & (0x3fu << 26)) == 47u << 26 /* stmw */
8769 || (insn & (0x3fu << 26)) == 48u << 26 /* lfs */
8770 || (insn & (0x3fu << 26)) == 50u << 26 /* lfd */
8771 || (insn & (0x3fu << 26)) == 52u << 26 /* stfs */
8772 || (insn & (0x3fu << 26)) == 54u << 26 /* stfd */
8773 || (insn & (0x3fu << 26)) == 56u << 26 /* lq,lfq */
8774 || ((insn & (0x3fu << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
39eeab25
AM
8775 /* Exclude lfqu by testing reloc. If relocs are ever
8776 defined for the reduced D field in psq_lu then those
8777 will need testing too. */
8778 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8779 || ((insn & (0x3fu << 26)) == 58u << 26 /* ld,lwa */
39eeab25 8780 && (insn & 1) == 0)
2365f8d7
AM
8781 || (insn & (0x3fu << 26)) == 60u << 26 /* stfq */
8782 || ((insn & (0x3fu << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
39eeab25
AM
8783 /* Exclude stfqu. psq_stu as above for psq_lu. */
8784 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
2365f8d7 8785 || ((insn & (0x3fu << 26)) == 62u << 26 /* std,stq */
39eeab25 8786 && (insn & 1) == 0));
560c8763
AM
8787}
8788
4a421c53
AM
8789/* PCREL_OPT in one instance flags to the linker that a pair of insns:
8790 pld ra,symbol@got@pcrel
dd9b12c2 8791 load/store rt,off(ra)
4a421c53 8792 or
d4b87b1e 8793 pla ra,symbol@pcrel
dd9b12c2 8794 load/store rt,off(ra)
4a421c53 8795 may be translated to
dd9b12c2 8796 pload/pstore rt,symbol+off@pcrel
4a421c53
AM
8797 nop.
8798 This function returns true if the optimization is possible, placing
dd9b12c2 8799 the prefix insn in *PINSN1, a NOP in *PINSN2 and the offset in *POFF.
4a421c53
AM
8800
8801 On entry to this function, the linker has already determined that
d4b87b1e 8802 the pld can be replaced with pla: *PINSN1 is that pla insn,
4a421c53
AM
8803 while *PINSN2 is the second instruction. */
8804
0a1b45a2 8805static bool
dd9b12c2 8806xlate_pcrel_opt (uint64_t *pinsn1, uint64_t *pinsn2, bfd_signed_vma *poff)
4a421c53 8807{
77486630
AM
8808 uint64_t insn1 = *pinsn1;
8809 uint64_t insn2 = *pinsn2;
dd9b12c2 8810 bfd_signed_vma off;
4a421c53 8811
77486630
AM
8812 if ((insn2 & (63ULL << 58)) == 1ULL << 58)
8813 {
8814 /* Check that regs match. */
8815 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
0a1b45a2 8816 return false;
77486630
AM
8817
8818 /* P8LS or PMLS form, non-pcrel. */
8819 if ((insn2 & (-1ULL << 50) & ~(1ULL << 56)) != (1ULL << 58))
0a1b45a2 8820 return false;
77486630
AM
8821
8822 *pinsn1 = (insn2 & ~(31 << 16) & ~0x3ffff0000ffffULL) | (1ULL << 52);
8823 *pinsn2 = PNOP;
8824 off = ((insn2 >> 16) & 0x3ffff0000ULL) | (insn2 & 0xffff);
8825 *poff = (off ^ 0x200000000ULL) - 0x200000000ULL;
0a1b45a2 8826 return true;
77486630
AM
8827 }
8828
8829 insn2 >>= 32;
8830
4a421c53 8831 /* Check that regs match. */
77486630 8832 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31))
0a1b45a2 8833 return false;
4a421c53
AM
8834
8835 switch ((insn2 >> 26) & 63)
8836 {
8837 default:
0a1b45a2 8838 return false;
4a421c53
AM
8839
8840 case 32: /* lwz */
8841 case 34: /* lbz */
8842 case 36: /* stw */
8843 case 38: /* stb */
8844 case 40: /* lhz */
8845 case 42: /* lha */
8846 case 44: /* sth */
8847 case 48: /* lfs */
8848 case 50: /* lfd */
8849 case 52: /* stfs */
8850 case 54: /* stfd */
8851 /* These are the PMLS cases, where we just need to tack a prefix
dd9b12c2 8852 on the insn. */
77486630 8853 insn1 = ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
4a421c53 8854 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8855 off = insn2 & 0xffff;
4a421c53
AM
8856 break;
8857
8858 case 58: /* lwa, ld */
dd9b12c2 8859 if ((insn2 & 1) != 0)
0a1b45a2 8860 return false;
77486630 8861 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8862 | (insn2 & 2 ? 41ULL << 26 : 57ULL << 26)
8863 | (insn2 & (31ULL << 21)));
dd9b12c2 8864 off = insn2 & 0xfffc;
4a421c53
AM
8865 break;
8866
8867 case 57: /* lxsd, lxssp */
dd9b12c2 8868 if ((insn2 & 3) < 2)
0a1b45a2 8869 return false;
77486630 8870 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8871 | ((40ULL | (insn2 & 3)) << 26)
8872 | (insn2 & (31ULL << 21)));
dd9b12c2 8873 off = insn2 & 0xfffc;
4a421c53
AM
8874 break;
8875
8876 case 61: /* stxsd, stxssp, lxv, stxv */
8877 if ((insn2 & 3) == 0)
0a1b45a2 8878 return false;
4a421c53
AM
8879 else if ((insn2 & 3) >= 2)
8880 {
77486630 8881 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8882 | ((44ULL | (insn2 & 3)) << 26)
8883 | (insn2 & (31ULL << 21)));
dd9b12c2 8884 off = insn2 & 0xfffc;
4a421c53
AM
8885 }
8886 else
8887 {
77486630 8888 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8889 | ((50ULL | (insn2 & 4) | ((insn2 & 8) >> 3)) << 26)
8890 | (insn2 & (31ULL << 21)));
dd9b12c2 8891 off = insn2 & 0xfff0;
4a421c53
AM
8892 }
8893 break;
8894
8895 case 56: /* lq */
77486630 8896 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53 8897 | (insn2 & ((63ULL << 26) | (31ULL << 21))));
dd9b12c2 8898 off = insn2 & 0xffff;
4a421c53
AM
8899 break;
8900
94ba9882
AM
8901 case 6: /* lxvp, stxvp */
8902 if ((insn2 & 0xe) != 0)
0a1b45a2 8903 return false;
94ba9882
AM
8904 insn1 = ((1ULL << 58) | (1ULL << 52)
8905 | ((insn2 & 1) == 0 ? 58ULL << 26 : 62ULL << 26)
8906 | (insn2 & (31ULL << 21)));
8907 off = insn2 & 0xfff0;
8908 break;
8909
4a421c53 8910 case 62: /* std, stq */
dd9b12c2 8911 if ((insn2 & 1) != 0)
0a1b45a2 8912 return false;
77486630 8913 insn1 = ((1ULL << 58) | (1ULL << 52)
4a421c53
AM
8914 | ((insn2 & 2) == 0 ? 61ULL << 26 : 60ULL << 26)
8915 | (insn2 & (31ULL << 21)));
dd9b12c2 8916 off = insn2 & 0xfffc;
4a421c53
AM
8917 break;
8918 }
8919
77486630 8920 *pinsn1 = insn1;
4a421c53 8921 *pinsn2 = (uint64_t) NOP << 32;
dd9b12c2 8922 *poff = (off ^ 0x8000) - 0x8000;
0a1b45a2 8923 return true;
4a421c53
AM
8924}
8925
c5614fa4
AM
8926/* Examine all relocs referencing .toc sections in order to remove
8927 unused .toc entries. */
8928
0a1b45a2 8929bool
33c0ec9d 8930ppc64_elf_edit_toc (struct bfd_link_info *info)
c5614fa4
AM
8931{
8932 bfd *ibfd;
8933 struct adjust_toc_info toc_inf;
67f0cbdb 8934 struct ppc_link_hash_table *htab = ppc_hash_table (info);
c5614fa4 8935
67f0cbdb 8936 htab->do_toc_opt = 1;
0a1b45a2 8937 toc_inf.global_toc_syms = true;
c72f2fb2 8938 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
c5614fa4
AM
8939 {
8940 asection *toc, *sec;
8941 Elf_Internal_Shdr *symtab_hdr;
8942 Elf_Internal_Sym *local_syms;
425b145b 8943 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
c5614fa4
AM
8944 unsigned long *skip, *drop;
8945 unsigned char *used;
8946 unsigned char *keep, last, some_unused;
8947
854b41e7
AM
8948 if (!is_ppc64_elf (ibfd))
8949 continue;
8950
c5614fa4
AM
8951 toc = bfd_get_section_by_name (ibfd, ".toc");
8952 if (toc == NULL
92b7a70f 8953 || toc->size == 0
81ff113f 8954 || (toc->flags & SEC_HAS_CONTENTS) == 0
dbaa2011
AM
8955 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8956 || discarded_section (toc))
c5614fa4
AM
8957 continue;
8958
425b145b 8959 toc_relocs = NULL;
c5614fa4 8960 local_syms = NULL;
0ffa91dd 8961 symtab_hdr = &elf_symtab_hdr (ibfd);
c5614fa4
AM
8962
8963 /* Look at sections dropped from the final link. */
8964 skip = NULL;
8965 relstart = NULL;
8966 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8967 {
8968 if (sec->reloc_count == 0
dbaa2011 8969 || !discarded_section (sec)
c5614fa4
AM
8970 || get_opd_info (sec)
8971 || (sec->flags & SEC_ALLOC) == 0
8972 || (sec->flags & SEC_DEBUGGING) != 0)
8973 continue;
8974
0a1b45a2 8975 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, false);
c5614fa4
AM
8976 if (relstart == NULL)
8977 goto error_ret;
8978
8979 /* Run through the relocs to see which toc entries might be
8980 unused. */
8981 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8982 {
8983 enum elf_ppc64_reloc_type r_type;
8984 unsigned long r_symndx;
8985 asection *sym_sec;
8986 struct elf_link_hash_entry *h;
8987 Elf_Internal_Sym *sym;
8988 bfd_vma val;
8989
8990 r_type = ELF64_R_TYPE (rel->r_info);
8991 switch (r_type)
8992 {
8993 default:
8994 continue;
8995
8996 case R_PPC64_TOC16:
8997 case R_PPC64_TOC16_LO:
8998 case R_PPC64_TOC16_HI:
8999 case R_PPC64_TOC16_HA:
9000 case R_PPC64_TOC16_DS:
9001 case R_PPC64_TOC16_LO_DS:
9002 break;
9003 }
9004
9005 r_symndx = ELF64_R_SYM (rel->r_info);
9006 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9007 r_symndx, ibfd))
9008 goto error_ret;
9009
9010 if (sym_sec != toc)
9011 continue;
9012
9013 if (h != NULL)
9014 val = h->root.u.def.value;
9015 else
9016 val = sym->st_value;
9017 val += rel->r_addend;
9018
9019 if (val >= toc->size)
9020 continue;
9021
9022 /* Anything in the toc ought to be aligned to 8 bytes.
9023 If not, don't mark as unused. */
9024 if (val & 7)
9025 continue;
9026
9027 if (skip == NULL)
9028 {
854b41e7 9029 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
c5614fa4
AM
9030 if (skip == NULL)
9031 goto error_ret;
9032 }
9033
ba761f19 9034 skip[val >> 3] = ref_from_discarded;
c5614fa4
AM
9035 }
9036
9037 if (elf_section_data (sec)->relocs != relstart)
9038 free (relstart);
9039 }
9040
ba761f19
AM
9041 /* For largetoc loads of address constants, we can convert
9042 . addis rx,2,addr@got@ha
9043 . ld ry,addr@got@l(rx)
9044 to
9045 . addis rx,2,addr@toc@ha
9046 . addi ry,rx,addr@toc@l
9047 when addr is within 2G of the toc pointer. This then means
9048 that the word storing "addr" in the toc is no longer needed. */
68ffbac6 9049
ba761f19
AM
9050 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
9051 && toc->output_section->rawsize < (bfd_vma) 1 << 31
9052 && toc->reloc_count != 0)
9053 {
9054 /* Read toc relocs. */
425b145b
AM
9055 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9056 info->keep_memory);
9057 if (toc_relocs == NULL)
ba761f19
AM
9058 goto error_ret;
9059
425b145b 9060 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9061 {
9062 enum elf_ppc64_reloc_type r_type;
9063 unsigned long r_symndx;
9064 asection *sym_sec;
9065 struct elf_link_hash_entry *h;
9066 Elf_Internal_Sym *sym;
9067 bfd_vma val, addr;
9068
9069 r_type = ELF64_R_TYPE (rel->r_info);
9070 if (r_type != R_PPC64_ADDR64)
9071 continue;
9072
9073 r_symndx = ELF64_R_SYM (rel->r_info);
9074 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9075 r_symndx, ibfd))
9076 goto error_ret;
9077
425b145b 9078 if (sym_sec == NULL
c27b8c2a 9079 || sym_sec->output_section == NULL
dbaa2011 9080 || discarded_section (sym_sec))
425b145b
AM
9081 continue;
9082
3a3a4c1f
AM
9083 if (!SYMBOL_REFERENCES_LOCAL (info, h)
9084 || (bfd_link_pic (info)
9085 && sym_sec == bfd_abs_section_ptr))
ba761f19
AM
9086 continue;
9087
9088 if (h != NULL)
bddc25c9
AM
9089 {
9090 if (h->type == STT_GNU_IFUNC)
9091 continue;
9092 val = h->root.u.def.value;
9093 }
ba761f19 9094 else
bddc25c9
AM
9095 {
9096 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
9097 continue;
9098 val = sym->st_value;
9099 }
ba761f19
AM
9100 val += rel->r_addend;
9101 val += sym_sec->output_section->vma + sym_sec->output_offset;
9102
9103 /* We don't yet know the exact toc pointer value, but we
9104 know it will be somewhere in the toc section. Don't
9105 optimize if the difference from any possible toc
9106 pointer is outside [ff..f80008000, 7fff7fff]. */
9107 addr = toc->output_section->vma + TOC_BASE_OFF;
9108 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9109 continue;
9110
9111 addr = toc->output_section->vma + toc->output_section->rawsize;
9112 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9113 continue;
9114
9115 if (skip == NULL)
9116 {
9117 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
9118 if (skip == NULL)
9119 goto error_ret;
9120 }
9121
9122 skip[rel->r_offset >> 3]
425b145b 9123 |= can_optimize | ((rel - toc_relocs) << 2);
ba761f19 9124 }
ba761f19
AM
9125 }
9126
c5614fa4
AM
9127 if (skip == NULL)
9128 continue;
9129
9130 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
9131 if (used == NULL)
9132 {
9133 error_ret:
c9594989 9134 if (symtab_hdr->contents != (unsigned char *) local_syms)
c5614fa4
AM
9135 free (local_syms);
9136 if (sec != NULL
c5614fa4
AM
9137 && elf_section_data (sec)->relocs != relstart)
9138 free (relstart);
c9594989 9139 if (elf_section_data (toc)->relocs != toc_relocs)
425b145b 9140 free (toc_relocs);
c9594989 9141 free (skip);
0a1b45a2 9142 return false;
c5614fa4
AM
9143 }
9144
30038c59
AM
9145 /* Now check all kept sections that might reference the toc.
9146 Check the toc itself last. */
9147 for (sec = (ibfd->sections == toc && toc->next ? toc->next
9148 : ibfd->sections);
c5614fa4 9149 sec != NULL;
c5614fa4 9150 sec = (sec == toc ? NULL
c5614fa4 9151 : sec->next == NULL ? toc
30038c59 9152 : sec->next == toc && toc->next ? toc->next
c5614fa4
AM
9153 : sec->next))
9154 {
9155 int repeat;
9156
9157 if (sec->reloc_count == 0
dbaa2011 9158 || discarded_section (sec)
c5614fa4
AM
9159 || get_opd_info (sec)
9160 || (sec->flags & SEC_ALLOC) == 0
9161 || (sec->flags & SEC_DEBUGGING) != 0)
9162 continue;
9163
854b41e7
AM
9164 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9165 info->keep_memory);
c5614fa4 9166 if (relstart == NULL)
2915c55b
JK
9167 {
9168 free (used);
9169 goto error_ret;
9170 }
c5614fa4
AM
9171
9172 /* Mark toc entries referenced as used. */
c5614fa4 9173 do
d4f1ee75
AM
9174 {
9175 repeat = 0;
9176 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9177 {
9178 enum elf_ppc64_reloc_type r_type;
9179 unsigned long r_symndx;
9180 asection *sym_sec;
9181 struct elf_link_hash_entry *h;
9182 Elf_Internal_Sym *sym;
9183 bfd_vma val;
98528052 9184
d4f1ee75 9185 r_type = ELF64_R_TYPE (rel->r_info);
d4f1ee75
AM
9186 switch (r_type)
9187 {
9188 case R_PPC64_TOC16:
9189 case R_PPC64_TOC16_LO:
9190 case R_PPC64_TOC16_HI:
9191 case R_PPC64_TOC16_HA:
9192 case R_PPC64_TOC16_DS:
9193 case R_PPC64_TOC16_LO_DS:
9194 /* In case we're taking addresses of toc entries. */
9195 case R_PPC64_ADDR64:
9196 break;
c5614fa4 9197
d4f1ee75
AM
9198 default:
9199 continue;
9200 }
c5614fa4 9201
d4f1ee75
AM
9202 r_symndx = ELF64_R_SYM (rel->r_info);
9203 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9204 r_symndx, ibfd))
9205 {
9206 free (used);
9207 goto error_ret;
9208 }
c5614fa4 9209
d4f1ee75
AM
9210 if (sym_sec != toc)
9211 continue;
c5614fa4 9212
d4f1ee75
AM
9213 if (h != NULL)
9214 val = h->root.u.def.value;
9215 else
9216 val = sym->st_value;
9217 val += rel->r_addend;
ba761f19 9218
d4f1ee75
AM
9219 if (val >= toc->size)
9220 continue;
ba761f19 9221
d4f1ee75
AM
9222 if ((skip[val >> 3] & can_optimize) != 0)
9223 {
9224 bfd_vma off;
9225 unsigned char opc;
9226
9227 switch (r_type)
9228 {
9229 case R_PPC64_TOC16_HA:
ba761f19 9230 break;
ba761f19 9231
d4f1ee75
AM
9232 case R_PPC64_TOC16_LO_DS:
9233 off = rel->r_offset;
9234 off += (bfd_big_endian (ibfd) ? -2 : 3);
9235 if (!bfd_get_section_contents (ibfd, sec, &opc,
9236 off, 1))
9237 {
9238 free (used);
9239 goto error_ret;
9240 }
9241 if ((opc & (0x3f << 2)) == (58u << 2))
9242 break;
1a0670f3 9243 /* Fall through. */
ba761f19 9244
d4f1ee75
AM
9245 default:
9246 /* Wrong sort of reloc, or not a ld. We may
9247 as well clear ref_from_discarded too. */
9248 skip[val >> 3] = 0;
9249 }
9250 }
9251
9252 if (sec != toc)
9253 used[val >> 3] = 1;
9254 /* For the toc section, we only mark as used if this
9255 entry itself isn't unused. */
9256 else if ((used[rel->r_offset >> 3]
9257 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
9258 && !used[val >> 3])
9259 {
9260 /* Do all the relocs again, to catch reference
9261 chains. */
9262 repeat = 1;
9263 used[val >> 3] = 1;
9264 }
9265 }
9266 }
c5614fa4 9267 while (repeat);
854b41e7
AM
9268
9269 if (elf_section_data (sec)->relocs != relstart)
9270 free (relstart);
c5614fa4
AM
9271 }
9272
9273 /* Merge the used and skip arrays. Assume that TOC
9274 doublewords not appearing as either used or unused belong
de194d85 9275 to an entry more than one doubleword in size. */
c5614fa4
AM
9276 for (drop = skip, keep = used, last = 0, some_unused = 0;
9277 drop < skip + (toc->size + 7) / 8;
9278 ++drop, ++keep)
9279 {
9280 if (*keep)
9281 {
ba761f19
AM
9282 *drop &= ~ref_from_discarded;
9283 if ((*drop & can_optimize) != 0)
9284 some_unused = 1;
c5614fa4
AM
9285 last = 0;
9286 }
b140b010 9287 else if ((*drop & ref_from_discarded) != 0)
c5614fa4
AM
9288 {
9289 some_unused = 1;
ba761f19 9290 last = ref_from_discarded;
c5614fa4
AM
9291 }
9292 else
9293 *drop = last;
9294 }
9295
9296 free (used);
9297
9298 if (some_unused)
9299 {
9300 bfd_byte *contents, *src;
9301 unsigned long off;
d62b3684 9302 Elf_Internal_Sym *sym;
0a1b45a2 9303 bool local_toc_syms = false;
c5614fa4
AM
9304
9305 /* Shuffle the toc contents, and at the same time convert the
9306 skip array from booleans into offsets. */
9307 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
9308 goto error_ret;
9309
9310 elf_section_data (toc)->this_hdr.contents = contents;
9311
9312 for (src = contents, off = 0, drop = skip;
9313 src < contents + toc->size;
9314 src += 8, ++drop)
9315 {
ba761f19
AM
9316 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9317 off += 8;
c5614fa4
AM
9318 else if (off != 0)
9319 {
9320 *drop = off;
9321 memcpy (src - off, src, 8);
9322 }
9323 }
854b41e7 9324 *drop = off;
c5614fa4
AM
9325 toc->rawsize = toc->size;
9326 toc->size = src - contents - off;
9327
ba761f19
AM
9328 /* Adjust addends for relocs against the toc section sym,
9329 and optimize any accesses we can. */
c5614fa4
AM
9330 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9331 {
9332 if (sec->reloc_count == 0
dbaa2011 9333 || discarded_section (sec))
c5614fa4
AM
9334 continue;
9335
9336 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
854b41e7 9337 info->keep_memory);
c5614fa4
AM
9338 if (relstart == NULL)
9339 goto error_ret;
9340
9341 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9342 {
9343 enum elf_ppc64_reloc_type r_type;
9344 unsigned long r_symndx;
9345 asection *sym_sec;
9346 struct elf_link_hash_entry *h;
854b41e7 9347 bfd_vma val;
c5614fa4
AM
9348
9349 r_type = ELF64_R_TYPE (rel->r_info);
9350 switch (r_type)
9351 {
9352 default:
9353 continue;
9354
9355 case R_PPC64_TOC16:
9356 case R_PPC64_TOC16_LO:
9357 case R_PPC64_TOC16_HI:
9358 case R_PPC64_TOC16_HA:
9359 case R_PPC64_TOC16_DS:
9360 case R_PPC64_TOC16_LO_DS:
9361 case R_PPC64_ADDR64:
9362 break;
9363 }
9364
9365 r_symndx = ELF64_R_SYM (rel->r_info);
9366 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9367 r_symndx, ibfd))
9368 goto error_ret;
9369
ba761f19 9370 if (sym_sec != toc)
c5614fa4
AM
9371 continue;
9372
ba761f19
AM
9373 if (h != NULL)
9374 val = h->root.u.def.value;
9375 else
9376 {
9377 val = sym->st_value;
9378 if (val != 0)
0a1b45a2 9379 local_toc_syms = true;
ba761f19
AM
9380 }
9381
9382 val += rel->r_addend;
854b41e7
AM
9383
9384 if (val > toc->rawsize)
9385 val = toc->rawsize;
ba761f19
AM
9386 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9387 continue;
9388 else if ((skip[val >> 3] & can_optimize) != 0)
9389 {
9390 Elf_Internal_Rela *tocrel
425b145b 9391 = toc_relocs + (skip[val >> 3] >> 2);
ba761f19
AM
9392 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9393
9394 switch (r_type)
9395 {
9396 case R_PPC64_TOC16_HA:
9397 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9398 break;
9399
9400 case R_PPC64_TOC16_LO_DS:
9401 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9402 break;
9403
9404 default:
28942f62
AM
9405 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9406 ppc_howto_init ();
b140b010 9407 info->callbacks->einfo
695344c0 9408 /* xgettext:c-format */
174d0a74 9409 (_("%H: %s references "
b140b010
AM
9410 "optimized away TOC entry\n"),
9411 ibfd, sec, rel->r_offset,
9412 ppc64_elf_howto_table[r_type]->name);
9413 bfd_set_error (bfd_error_bad_value);
9414 goto error_ret;
ba761f19
AM
9415 }
9416 rel->r_addend = tocrel->r_addend;
9417 elf_section_data (sec)->relocs = relstart;
9418 continue;
9419 }
9420
9421 if (h != NULL || sym->st_value != 0)
9422 continue;
854b41e7
AM
9423
9424 rel->r_addend -= skip[val >> 3];
9425 elf_section_data (sec)->relocs = relstart;
c5614fa4 9426 }
854b41e7
AM
9427
9428 if (elf_section_data (sec)->relocs != relstart)
9429 free (relstart);
c5614fa4
AM
9430 }
9431
9432 /* We shouldn't have local or global symbols defined in the TOC,
9433 but handle them anyway. */
df22d223
AM
9434 if (local_syms != NULL)
9435 for (sym = local_syms;
9436 sym < local_syms + symtab_hdr->sh_info;
9437 ++sym)
9438 if (sym->st_value != 0
9439 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9440 {
9441 unsigned long i;
854b41e7 9442
df22d223
AM
9443 if (sym->st_value > toc->rawsize)
9444 i = toc->rawsize >> 3;
9445 else
9446 i = sym->st_value >> 3;
854b41e7 9447
df22d223
AM
9448 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9449 {
9450 if (local_toc_syms)
4eca0228 9451 _bfd_error_handler
df22d223
AM
9452 (_("%s defined on removed toc entry"),
9453 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9454 do
9455 ++i;
9456 while ((skip[i] & (ref_from_discarded | can_optimize)));
9457 sym->st_value = (bfd_vma) i << 3;
9458 }
d62b3684 9459
df22d223
AM
9460 sym->st_value -= skip[i];
9461 symtab_hdr->contents = (unsigned char *) local_syms;
9462 }
c5614fa4 9463
854b41e7 9464 /* Adjust any global syms defined in this toc input section. */
c5614fa4
AM
9465 if (toc_inf.global_toc_syms)
9466 {
9467 toc_inf.toc = toc;
9468 toc_inf.skip = skip;
0a1b45a2 9469 toc_inf.global_toc_syms = false;
c5614fa4
AM
9470 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9471 &toc_inf);
9472 }
854b41e7
AM
9473
9474 if (toc->reloc_count != 0)
9475 {
d4730f92 9476 Elf_Internal_Shdr *rel_hdr;
854b41e7
AM
9477 Elf_Internal_Rela *wrel;
9478 bfd_size_type sz;
9479
854b41e7 9480 /* Remove unused toc relocs, and adjust those we keep. */
28be611c
AM
9481 if (toc_relocs == NULL)
9482 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9483 info->keep_memory);
9484 if (toc_relocs == NULL)
9485 goto error_ret;
9486
425b145b
AM
9487 wrel = toc_relocs;
9488 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
ba761f19
AM
9489 if ((skip[rel->r_offset >> 3]
9490 & (ref_from_discarded | can_optimize)) == 0)
854b41e7
AM
9491 {
9492 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9493 wrel->r_info = rel->r_info;
9494 wrel->r_addend = rel->r_addend;
9495 ++wrel;
9496 }
1657026c 9497 else if (!dec_dynrel_count (rel, toc, info,
854b41e7
AM
9498 &local_syms, NULL, NULL))
9499 goto error_ret;
9500
425b145b
AM
9501 elf_section_data (toc)->relocs = toc_relocs;
9502 toc->reloc_count = wrel - toc_relocs;
d4730f92
BS
9503 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9504 sz = rel_hdr->sh_entsize;
9505 rel_hdr->sh_size = toc->reloc_count * sz;
854b41e7 9506 }
c5614fa4 9507 }
c9594989 9508 else if (elf_section_data (toc)->relocs != toc_relocs)
425b145b 9509 free (toc_relocs);
c5614fa4
AM
9510
9511 if (local_syms != NULL
9512 && symtab_hdr->contents != (unsigned char *) local_syms)
9513 {
9514 if (!info->keep_memory)
9515 free (local_syms);
9516 else
9517 symtab_hdr->contents = (unsigned char *) local_syms;
9518 }
9519 free (skip);
9520 }
9521
066f4018 9522 /* Look for cases where we can change an indirect GOT access to
4a421c53
AM
9523 a GOT relative or PC relative access, possibly reducing the
9524 number of GOT entries. */
066f4018
AM
9525 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
9526 {
9527 asection *sec;
9528 Elf_Internal_Shdr *symtab_hdr;
9529 Elf_Internal_Sym *local_syms;
9530 Elf_Internal_Rela *relstart, *rel;
9531 bfd_vma got;
9532
9533 if (!is_ppc64_elf (ibfd))
9534 continue;
9535
903b777d 9536 if (!ppc64_elf_tdata (ibfd)->has_optrel)
066f4018
AM
9537 continue;
9538
9539 sec = ppc64_elf_tdata (ibfd)->got;
903b777d
AM
9540 got = 0;
9541 if (sec != NULL)
9542 got = sec->output_section->vma + sec->output_offset + 0x8000;
066f4018
AM
9543
9544 local_syms = NULL;
9545 symtab_hdr = &elf_symtab_hdr (ibfd);
9546
9547 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9548 {
9549 if (sec->reloc_count == 0
903b777d 9550 || !ppc64_elf_section_data (sec)->has_optrel
066f4018
AM
9551 || discarded_section (sec))
9552 continue;
9553
9554 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9555 info->keep_memory);
9556 if (relstart == NULL)
9557 {
9558 got_error_ret:
c9594989 9559 if (symtab_hdr->contents != (unsigned char *) local_syms)
066f4018
AM
9560 free (local_syms);
9561 if (sec != NULL
066f4018
AM
9562 && elf_section_data (sec)->relocs != relstart)
9563 free (relstart);
0a1b45a2 9564 return false;
066f4018
AM
9565 }
9566
9567 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9568 {
9569 enum elf_ppc64_reloc_type r_type;
9570 unsigned long r_symndx;
9571 Elf_Internal_Sym *sym;
9572 asection *sym_sec;
9573 struct elf_link_hash_entry *h;
9574 struct got_entry *ent;
133a1f60 9575 bfd_vma val, pc;
4a421c53 9576 unsigned char buf[8];
066f4018 9577 unsigned int insn;
903b777d 9578 enum {no_check, check_lo, check_ha} insn_check;
066f4018
AM
9579
9580 r_type = ELF64_R_TYPE (rel->r_info);
903b777d
AM
9581 switch (r_type)
9582 {
9583 default:
9584 insn_check = no_check;
9585 break;
9586
9587 case R_PPC64_PLT16_HA:
9588 case R_PPC64_GOT_TLSLD16_HA:
9589 case R_PPC64_GOT_TLSGD16_HA:
9590 case R_PPC64_GOT_TPREL16_HA:
9591 case R_PPC64_GOT_DTPREL16_HA:
9592 case R_PPC64_GOT16_HA:
9593 case R_PPC64_TOC16_HA:
9594 insn_check = check_ha;
9595 break;
9596
9597 case R_PPC64_PLT16_LO:
9598 case R_PPC64_PLT16_LO_DS:
9599 case R_PPC64_GOT_TLSLD16_LO:
9600 case R_PPC64_GOT_TLSGD16_LO:
9601 case R_PPC64_GOT_TPREL16_LO_DS:
9602 case R_PPC64_GOT_DTPREL16_LO_DS:
9603 case R_PPC64_GOT16_LO:
9604 case R_PPC64_GOT16_LO_DS:
9605 case R_PPC64_TOC16_LO:
9606 case R_PPC64_TOC16_LO_DS:
9607 insn_check = check_lo;
9608 break;
9609 }
9610
9611 if (insn_check != no_check)
9612 {
9613 bfd_vma off = rel->r_offset & ~3;
9614
9615 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9616 goto got_error_ret;
9617
9618 insn = bfd_get_32 (ibfd, buf);
9619 if (insn_check == check_lo
9620 ? !ok_lo_toc_insn (insn, r_type)
2365f8d7 9621 : ((insn & ((0x3fu << 26) | 0x1f << 16))
903b777d
AM
9622 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9623 {
9624 char str[12];
9625
9626 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9627 sprintf (str, "%#08x", insn);
9628 info->callbacks->einfo
9629 /* xgettext:c-format */
9630 (_("%H: got/toc optimization is not supported for"
9631 " %s instruction\n"),
9632 ibfd, sec, rel->r_offset & ~3, str);
9633 continue;
9634 }
9635 }
9636
066f4018
AM
9637 switch (r_type)
9638 {
bb22a418
AM
9639 /* Note that we don't delete GOT entries for
9640 R_PPC64_GOT16_DS since we'd need a lot more
9641 analysis. For starters, the preliminary layout is
9642 before the GOT, PLT, dynamic sections and stubs are
9643 laid out. Then we'd need to allow for changes in
9644 distance between sections caused by alignment. */
066f4018
AM
9645 default:
9646 continue;
9647
066f4018
AM
9648 case R_PPC64_GOT16_HA:
9649 case R_PPC64_GOT16_LO_DS:
4a421c53 9650 case R_PPC64_GOT_PCREL34:
066f4018
AM
9651 break;
9652 }
9653
9654 r_symndx = ELF64_R_SYM (rel->r_info);
9655 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9656 r_symndx, ibfd))
9657 goto got_error_ret;
9658
6d5554a6
AM
9659 if (sym_sec == NULL
9660 || sym_sec->output_section == NULL
9661 || discarded_section (sym_sec))
9662 continue;
9663
06507dab
AM
9664 if ((h ? h->type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
9665 continue;
9666
3a3a4c1f
AM
9667 if (!SYMBOL_REFERENCES_LOCAL (info, h)
9668 || (bfd_link_pic (info)
9669 && sym_sec == bfd_abs_section_ptr))
066f4018
AM
9670 continue;
9671
9672 if (h != NULL)
9673 val = h->root.u.def.value;
9674 else
9675 val = sym->st_value;
133a1f60 9676 val += rel->r_addend;
066f4018
AM
9677 val += sym_sec->output_section->vma + sym_sec->output_offset;
9678
bb22a418
AM
9679/* Fudge factor to allow for the fact that the preliminary layout
9680 isn't exact. Reduce limits by this factor. */
9681#define LIMIT_ADJUST(LIMIT) ((LIMIT) - (LIMIT) / 16)
9682
066f4018
AM
9683 switch (r_type)
9684 {
9685 default:
9686 continue;
9687
066f4018 9688 case R_PPC64_GOT16_HA:
bb22a418
AM
9689 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9690 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9691 continue;
9692
9693 if (!bfd_get_section_contents (ibfd, sec, buf,
9694 rel->r_offset & ~3, 4))
9695 goto got_error_ret;
9696 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9697 if (((insn & ((0x3fu << 26) | 0x1f << 16))
066f4018
AM
9698 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9699 continue;
9700 break;
9701
9702 case R_PPC64_GOT16_LO_DS:
bb22a418
AM
9703 if (val - got + LIMIT_ADJUST (0x80008000ULL)
9704 >= LIMIT_ADJUST (0x100000000ULL))
066f4018
AM
9705 continue;
9706 if (!bfd_get_section_contents (ibfd, sec, buf,
9707 rel->r_offset & ~3, 4))
9708 goto got_error_ret;
9709 insn = bfd_get_32 (ibfd, buf);
2365f8d7 9710 if ((insn & (0x3fu << 26 | 0x3)) != 58u << 26 /* ld */)
066f4018
AM
9711 continue;
9712 break;
4a421c53
AM
9713
9714 case R_PPC64_GOT_PCREL34:
9715 pc = rel->r_offset;
9716 pc += sec->output_section->vma + sec->output_offset;
bb22a418
AM
9717 if (val - pc + LIMIT_ADJUST (1ULL << 33)
9718 >= LIMIT_ADJUST (1ULL << 34))
4a421c53
AM
9719 continue;
9720 if (!bfd_get_section_contents (ibfd, sec, buf,
9721 rel->r_offset & ~3, 8))
9722 goto got_error_ret;
9723 insn = bfd_get_32 (ibfd, buf);
9724 if ((insn & (-1u << 18)) != ((1u << 26) | (1u << 20)))
9725 continue;
9726 insn = bfd_get_32 (ibfd, buf + 4);
2365f8d7 9727 if ((insn & (0x3fu << 26)) != 57u << 26)
4a421c53
AM
9728 continue;
9729 break;
066f4018 9730 }
bb22a418 9731#undef LIMIT_ADJUST
066f4018
AM
9732
9733 if (h != NULL)
9734 ent = h->got.glist;
9735 else
9736 {
9737 struct got_entry **local_got_ents = elf_local_got_ents (ibfd);
9738 ent = local_got_ents[r_symndx];
9739 }
9740 for (; ent != NULL; ent = ent->next)
133a1f60 9741 if (ent->addend == rel->r_addend
066f4018
AM
9742 && ent->owner == ibfd
9743 && ent->tls_type == 0)
9744 break;
9745 BFD_ASSERT (ent && ent->got.refcount > 0);
9746 ent->got.refcount -= 1;
9747 }
9748
9749 if (elf_section_data (sec)->relocs != relstart)
9750 free (relstart);
9751 }
9752
9753 if (local_syms != NULL
9754 && symtab_hdr->contents != (unsigned char *) local_syms)
9755 {
9756 if (!info->keep_memory)
9757 free (local_syms);
9758 else
9759 symtab_hdr->contents = (unsigned char *) local_syms;
9760 }
9761 }
9762
0a1b45a2 9763 return true;
c5614fa4
AM
9764}
9765
1bbe0902
AM
9766/* Return true iff input section I references the TOC using
9767 instructions limited to +/-32k offsets. */
9768
0a1b45a2 9769bool
1bbe0902
AM
9770ppc64_elf_has_small_toc_reloc (asection *i)
9771{
9772 return (is_ppc64_elf (i->owner)
9773 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9774}
9775
927be08e
AM
9776/* Allocate space for one GOT entry. */
9777
9778static void
9779allocate_got (struct elf_link_hash_entry *h,
9780 struct bfd_link_info *info,
9781 struct got_entry *gent)
9782{
9783 struct ppc_link_hash_table *htab = ppc_hash_table (info);
ed7007c1 9784 struct ppc_link_hash_entry *eh = ppc_elf_hash_entry (h);
927be08e
AM
9785 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9786 ? 16 : 8);
9787 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9788 ? 2 : 1) * sizeof (Elf64_External_Rela);
9789 asection *got = ppc64_elf_tdata (gent->owner)->got;
9790
9791 gent->got.offset = got->size;
9792 got->size += entsize;
9793
19e08130 9794 if (h->type == STT_GNU_IFUNC)
927be08e 9795 {
33e44f2e 9796 htab->elf.irelplt->size += rentsize;
19e08130 9797 htab->got_reli_size += rentsize;
927be08e 9798 }
f15d0b54 9799 else if (((bfd_link_pic (info)
1657026c
AM
9800 && (gent->tls_type == 0
9801 ? !info->enable_dt_relr
9802 : !(bfd_link_executable (info)
3a3a4c1f
AM
9803 && SYMBOL_REFERENCES_LOCAL (info, h)))
9804 && !bfd_is_abs_symbol (&h->root))
f0158f44
AM
9805 || (htab->elf.dynamic_sections_created
9806 && h->dynindx != -1
9807 && !SYMBOL_REFERENCES_LOCAL (info, h)))
21d68fcd 9808 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
927be08e 9809 {
19e08130 9810 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
927be08e 9811 relgot->size += rentsize;
927be08e
AM
9812 }
9813}
9814
7865406b
AM
9815/* This function merges got entries in the same toc group. */
9816
9817static void
9818merge_got_entries (struct got_entry **pent)
9819{
9820 struct got_entry *ent, *ent2;
9821
9822 for (ent = *pent; ent != NULL; ent = ent->next)
9823 if (!ent->is_indirect)
9824 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9825 if (!ent2->is_indirect
9826 && ent2->addend == ent->addend
9827 && ent2->tls_type == ent->tls_type
9828 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9829 {
0a1b45a2 9830 ent2->is_indirect = true;
7865406b
AM
9831 ent2->got.ent = ent;
9832 }
9833}
9834
46434633 9835/* If H is undefined, make it dynamic if that makes sense. */
f0158f44 9836
0a1b45a2 9837static bool
46434633
AM
9838ensure_undef_dynamic (struct bfd_link_info *info,
9839 struct elf_link_hash_entry *h)
f0158f44
AM
9840{
9841 struct elf_link_hash_table *htab = elf_hash_table (info);
9842
9843 if (htab->dynamic_sections_created
46434633
AM
9844 && ((info->dynamic_undefined_weak != 0
9845 && h->root.type == bfd_link_hash_undefweak)
9846 || h->root.type == bfd_link_hash_undefined)
f0158f44
AM
9847 && h->dynindx == -1
9848 && !h->forced_local
9849 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9850 return bfd_elf_link_record_dynamic_symbol (info, h);
0a1b45a2 9851 return true;
f0158f44
AM
9852}
9853
30845f11
AM
9854/* Choose whether to use htab->iplt or htab->pltlocal rather than the
9855 usual htab->elf.splt section for a PLT entry. */
9856
9857static inline
0a1b45a2 9858bool use_local_plt (struct bfd_link_info *info,
30845f11
AM
9859 struct elf_link_hash_entry *h)
9860{
9861 return (h == NULL
9862 || h->dynindx == -1
9863 || !elf_hash_table (info)->dynamic_sections_created);
9864}
9865
65f38f15
AM
9866/* Allocate space in .plt, .got and associated reloc sections for
9867 dynamic relocs. */
5bd4f169 9868
0a1b45a2 9869static bool
4ce794b7 9870allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 9871{
65f38f15
AM
9872 struct bfd_link_info *info;
9873 struct ppc_link_hash_table *htab;
5bd4f169 9874 asection *s;
65f38f15 9875 struct ppc_link_hash_entry *eh;
0b8bcf0d 9876 struct got_entry **pgent, *gent;
5bd4f169 9877
e92d460e 9878 if (h->root.type == bfd_link_hash_indirect)
0a1b45a2 9879 return true;
5bd4f169 9880
65f38f15
AM
9881 info = (struct bfd_link_info *) inf;
9882 htab = ppc_hash_table (info);
4dfe6ac6 9883 if (htab == NULL)
0a1b45a2 9884 return false;
5bd4f169 9885
ed7007c1 9886 eh = ppc_elf_hash_entry (h);
951fd09b
AM
9887 /* Run through the TLS GD got entries first if we're changing them
9888 to TPREL. */
b00a0a86 9889 if ((eh->tls_mask & (TLS_TLS | TLS_GDIE)) == (TLS_TLS | TLS_GDIE))
951fd09b
AM
9890 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9891 if (gent->got.refcount > 0
9892 && (gent->tls_type & TLS_GD) != 0)
9893 {
9894 /* This was a GD entry that has been converted to TPREL. If
9895 there happens to be a TPREL entry we can use that one. */
9896 struct got_entry *ent;
9897 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9898 if (ent->got.refcount > 0
9899 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
9900 && ent->addend == gent->addend
9901 && ent->owner == gent->owner)
951fd09b
AM
9902 {
9903 gent->got.refcount = 0;
9904 break;
9905 }
9906
9907 /* If not, then we'll be using our own TPREL entry. */
9908 if (gent->got.refcount != 0)
9909 gent->tls_type = TLS_TLS | TLS_TPREL;
9910 }
9911
7865406b
AM
9912 /* Remove any list entry that won't generate a word in the GOT before
9913 we call merge_got_entries. Otherwise we risk merging to empty
9914 entries. */
0b8bcf0d
AM
9915 pgent = &h->got.glist;
9916 while ((gent = *pgent) != NULL)
411e1bfb 9917 if (gent->got.refcount > 0)
7865406b
AM
9918 {
9919 if ((gent->tls_type & TLS_LD) != 0
f749f26e 9920 && SYMBOL_REFERENCES_LOCAL (info, h))
7865406b
AM
9921 {
9922 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9923 *pgent = gent->next;
9924 }
9925 else
9926 pgent = &gent->next;
9927 }
9928 else
9929 *pgent = gent->next;
9930
9931 if (!htab->do_multi_toc)
9932 merge_got_entries (&h->got.glist);
9933
9934 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9935 if (!gent->is_indirect)
411e1bfb 9936 {
ec73ddcd
AM
9937 /* Ensure we catch all the cases where this symbol should
9938 be made dynamic. */
46434633 9939 if (!ensure_undef_dynamic (info, h))
0a1b45a2 9940 return false;
65f38f15 9941
0c8d6e5c 9942 if (!is_ppc64_elf (gent->owner))
927be08e 9943 abort ();
0ffa91dd 9944
927be08e 9945 allocate_got (h, info, gent);
411e1bfb 9946 }
65f38f15 9947
954b63d4
AM
9948 /* If no dynamic sections we can't have dynamic relocs, except for
9949 IFUNCs which are handled even in static executables. */
8a2058b5
AM
9950 if (!htab->elf.dynamic_sections_created
9951 && h->type != STT_GNU_IFUNC)
190eb1dd 9952 h->dyn_relocs = NULL;
8a2058b5 9953
529fe20e
AM
9954 /* Discard relocs on undefined symbols that must be local. */
9955 else if (h->root.type == bfd_link_hash_undefined
9956 && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
190eb1dd 9957 h->dyn_relocs = NULL;
529fe20e 9958
954b63d4
AM
9959 /* Also discard relocs on undefined weak syms with non-default
9960 visibility, or when dynamic_undefined_weak says so. */
21d68fcd 9961 else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
190eb1dd 9962 h->dyn_relocs = NULL;
954b63d4 9963
190eb1dd 9964 if (h->dyn_relocs != NULL)
65f38f15 9965 {
1657026c 9966 struct ppc_dyn_relocs *p, **pp;
8a2058b5 9967
57e7d118
AM
9968 /* In the shared -Bsymbolic case, discard space allocated for
9969 dynamic pc-relative relocs against symbols which turn out to
9970 be defined in regular objects. For the normal shared case,
9971 discard space for relocs that have become local due to symbol
9972 visibility changes. */
57e7d118 9973 if (bfd_link_pic (info))
65f38f15 9974 {
57e7d118
AM
9975 /* Relocs that use pc_count are those that appear on a call
9976 insn, or certain REL relocs (see must_be_dyn_reloc) that
9977 can be generated via assembly. We want calls to
9978 protected symbols to resolve directly to the function
9979 rather than going via the plt. If people want function
9980 pointer comparisons to work as expected then they should
9981 avoid writing weird assembly. */
9982 if (SYMBOL_CALLS_LOCAL (info, h))
9983 {
1657026c
AM
9984 for (pp = (struct ppc_dyn_relocs **) &h->dyn_relocs;
9985 (p = *pp) != NULL;
9986 )
57e7d118
AM
9987 {
9988 p->count -= p->pc_count;
9989 p->pc_count = 0;
9990 if (p->count == 0)
9991 *pp = p->next;
9992 else
9993 pp = &p->next;
9994 }
9995 }
65f38f15 9996
190eb1dd 9997 if (h->dyn_relocs != NULL)
5bd4f169 9998 {
ec73ddcd
AM
9999 /* Ensure we catch all the cases where this symbol
10000 should be made dynamic. */
46434633 10001 if (!ensure_undef_dynamic (info, h))
0a1b45a2 10002 return false;
5bd4f169 10003 }
65f38f15 10004 }
ec73ddcd
AM
10005
10006 /* For a fixed position executable, discard space for
10007 relocs against symbols which are not dynamic. */
10008 else if (h->type != STT_GNU_IFUNC)
57e7d118 10009 {
49160308
AM
10010 if ((h->dynamic_adjusted
10011 || (h->ref_regular
10012 && h->root.type == bfd_link_hash_undefweak
10013 && (info->dynamic_undefined_weak > 0
10014 || !_bfd_elf_readonly_dynrelocs (h))))
529fe20e
AM
10015 && !h->def_regular
10016 && !ELF_COMMON_DEF_P (h))
f0158f44 10017 {
ec73ddcd
AM
10018 /* Ensure we catch all the cases where this symbol
10019 should be made dynamic. */
46434633 10020 if (!ensure_undef_dynamic (info, h))
0a1b45a2 10021 return false;
dfbb6ac9 10022
ec73ddcd 10023 /* But if that didn't work out, discard dynamic relocs. */
f0158f44 10024 if (h->dynindx == -1)
190eb1dd 10025 h->dyn_relocs = NULL;
f0158f44
AM
10026 }
10027 else
190eb1dd 10028 h->dyn_relocs = NULL;
57e7d118
AM
10029 }
10030
10031 /* Finally, allocate space. */
1657026c 10032 for (p = (struct ppc_dyn_relocs *) h->dyn_relocs; p != NULL; p = p->next)
365bf300
AM
10033 if (!discarded_section (p->sec))
10034 {
10035 unsigned int count;
10036 asection *sreloc = elf_section_data (p->sec)->sreloc;
10037 if (eh->elf.type == STT_GNU_IFUNC)
10038 sreloc = htab->elf.irelplt;
10039 count = p->count;
10040 if (info->enable_dt_relr
10041 && ((!NO_OPD_RELOCS
10042 && ppc64_elf_section_data (p->sec)->sec_type == sec_opd)
10043 || (eh->elf.type != STT_GNU_IFUNC
10044 && SYMBOL_REFERENCES_LOCAL (info, h))))
10045 count -= p->rel_count;
10046 sreloc->size += count * sizeof (Elf64_External_Rela);
10047 }
65f38f15 10048 }
57e7d118 10049
2d7ad24e
AM
10050 /* We might need a PLT entry when the symbol
10051 a) is dynamic, or
10052 b) is an ifunc, or
10053 c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
10054 d) has plt16 relocs and we are linking statically. */
10055 if ((htab->elf.dynamic_sections_created && h->dynindx != -1)
10056 || h->type == STT_GNU_IFUNC
10057 || (h->needs_plt && h->dynamic_adjusted)
10058 || (h->needs_plt
10059 && h->def_regular
10060 && !htab->elf.dynamic_sections_created
3e04d765 10061 && !htab->can_convert_all_inline_plt
ed7007c1 10062 && (ppc_elf_hash_entry (h)->tls_mask
2d7ad24e 10063 & (TLS_TLS | PLT_KEEP)) == PLT_KEEP))
65f38f15 10064 {
57e7d118 10065 struct plt_entry *pent;
0a1b45a2 10066 bool doneone = false;
57e7d118
AM
10067 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
10068 if (pent->plt.refcount > 0)
10069 {
b2936612
AM
10070 if (!ensure_undef_dynamic (info, h))
10071 return false;
10072
30845f11 10073 if (use_local_plt (info, h))
57e7d118 10074 {
2d7ad24e
AM
10075 if (h->type == STT_GNU_IFUNC)
10076 {
10077 s = htab->elf.iplt;
10078 pent->plt.offset = s->size;
10079 s->size += PLT_ENTRY_SIZE (htab);
10080 s = htab->elf.irelplt;
10081 }
10082 else
10083 {
10084 s = htab->pltlocal;
10085 pent->plt.offset = s->size;
10086 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
1657026c
AM
10087 s = NULL;
10088 if (bfd_link_pic (info)
10089 && !(info->enable_dt_relr && !htab->opd_abi))
10090 s = htab->relpltlocal;
2d7ad24e 10091 }
57e7d118
AM
10092 }
10093 else
10094 {
10095 /* If this is the first .plt entry, make room for the special
10096 first entry. */
10097 s = htab->elf.splt;
10098 if (s->size == 0)
10099 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
65f38f15 10100
57e7d118 10101 pent->plt.offset = s->size;
65f38f15 10102
57e7d118
AM
10103 /* Make room for this entry. */
10104 s->size += PLT_ENTRY_SIZE (htab);
65f38f15 10105
57e7d118
AM
10106 /* Make room for the .glink code. */
10107 s = htab->glink;
10108 if (s->size == 0)
9e390558 10109 s->size += GLINK_PLTRESOLVE_SIZE (htab);
57e7d118
AM
10110 if (htab->opd_abi)
10111 {
10112 /* We need bigger stubs past index 32767. */
9e390558 10113 if (s->size >= GLINK_PLTRESOLVE_SIZE (htab) + 32768*2*4)
57e7d118
AM
10114 s->size += 4;
10115 s->size += 2*4;
10116 }
10117 else
10118 s->size += 4;
65f38f15 10119
57e7d118
AM
10120 /* We also need to make an entry in the .rela.plt section. */
10121 s = htab->elf.srelplt;
10122 }
2d7ad24e
AM
10123 if (s != NULL)
10124 s->size += sizeof (Elf64_External_Rela);
0a1b45a2 10125 doneone = true;
57e7d118
AM
10126 }
10127 else
10128 pent->plt.offset = (bfd_vma) -1;
10129 if (!doneone)
10130 {
10131 h->plt.plist = NULL;
10132 h->needs_plt = 0;
10133 }
65f38f15 10134 }
57e7d118 10135 else
65f38f15 10136 {
57e7d118
AM
10137 h->plt.plist = NULL;
10138 h->needs_plt = 0;
65f38f15
AM
10139 }
10140
0a1b45a2 10141 return true;
65f38f15
AM
10142}
10143
9e390558
AM
10144#define PPC_LO(v) ((v) & 0xffff)
10145#define PPC_HI(v) (((v) >> 16) & 0xffff)
10146#define PPC_HA(v) PPC_HI ((v) + 0x8000)
04bdff6a
AM
10147#define D34(v) \
10148 ((((v) & 0x3ffff0000ULL) << 16) | (v & 0xffff))
10149#define HA34(v) ((v + (1ULL << 33)) >> 34)
9e390558 10150
af969b14 10151/* Called via elf_link_hash_traverse from ppc64_elf_late_size_sections
a345bc8d
AM
10152 to set up space for global entry stubs. These are put in glink,
10153 after the branch table. */
65f38f15 10154
0a1b45a2 10155static bool
a345bc8d 10156size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
65f38f15 10157{
a345bc8d
AM
10158 struct bfd_link_info *info;
10159 struct ppc_link_hash_table *htab;
10160 struct plt_entry *pent;
9e390558 10161 asection *s, *plt;
65f38f15 10162
a345bc8d 10163 if (h->root.type == bfd_link_hash_indirect)
0a1b45a2 10164 return true;
65f38f15 10165
a345bc8d 10166 if (!h->pointer_equality_needed)
0a1b45a2 10167 return true;
65f38f15 10168
a345bc8d 10169 if (h->def_regular)
0a1b45a2 10170 return true;
65f38f15 10171
a345bc8d
AM
10172 info = inf;
10173 htab = ppc_hash_table (info);
10174 if (htab == NULL)
0a1b45a2 10175 return false;
a345bc8d 10176
9e390558
AM
10177 s = htab->global_entry;
10178 plt = htab->elf.splt;
a345bc8d
AM
10179 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
10180 if (pent->plt.offset != (bfd_vma) -1
10181 && pent->addend == 0)
10182 {
afe397ea
AM
10183 /* For ELFv2, if this symbol is not defined in a regular file
10184 and we are not generating a shared library or pie, then we
10185 need to define the symbol in the executable on a call stub.
10186 This is to avoid text relocations. */
9e390558
AM
10187 bfd_vma off, stub_align, stub_off, stub_size;
10188 unsigned int align_power;
10189
10190 stub_size = 16;
10191 stub_off = s->size;
10192 if (htab->params->plt_stub_align >= 0)
10193 align_power = htab->params->plt_stub_align;
10194 else
10195 align_power = -htab->params->plt_stub_align;
10196 /* Setting section alignment is delayed until we know it is
10197 non-empty. Otherwise the .text output section will be
10198 aligned at least to plt_stub_align even when no global
10199 entry stubs are needed. */
10200 if (s->alignment_power < align_power)
10201 s->alignment_power = align_power;
10202 stub_align = (bfd_vma) 1 << align_power;
10203 if (htab->params->plt_stub_align >= 0
10204 || ((((stub_off + stub_size - 1) & -stub_align)
10205 - (stub_off & -stub_align))
10206 > ((stub_size - 1) & -stub_align)))
10207 stub_off = (stub_off + stub_align - 1) & -stub_align;
10208 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
10209 off -= stub_off + s->output_offset + s->output_section->vma;
10210 /* Note that for --plt-stub-align negative we have a possible
10211 dependency between stub offset and size. Break that
10212 dependency by assuming the max stub size when calculating
10213 the stub offset. */
10214 if (PPC_HA (off) == 0)
10215 stub_size -= 4;
8a2058b5 10216 h->root.type = bfd_link_hash_defined;
afe397ea 10217 h->root.u.def.section = s;
9e390558
AM
10218 h->root.u.def.value = stub_off;
10219 s->size = stub_off + stub_size;
a345bc8d
AM
10220 break;
10221 }
0a1b45a2 10222 return true;
a345bc8d
AM
10223}
10224
65f38f15
AM
10225/* Set the sizes of the dynamic sections. */
10226
0a1b45a2 10227static bool
af969b14
AM
10228ppc64_elf_late_size_sections (bfd *output_bfd,
10229 struct bfd_link_info *info)
65f38f15
AM
10230{
10231 struct ppc_link_hash_table *htab;
10232 bfd *dynobj;
10233 asection *s;
0a1b45a2 10234 bool relocs;
65f38f15 10235 bfd *ibfd;
7865406b 10236 struct got_entry *first_tlsld;
65f38f15
AM
10237
10238 htab = ppc_hash_table (info);
4dfe6ac6 10239 if (htab == NULL)
0a1b45a2 10240 return false;
4dfe6ac6 10241
65f38f15
AM
10242 dynobj = htab->elf.dynobj;
10243 if (dynobj == NULL)
af969b14 10244 return true;
65f38f15
AM
10245
10246 if (htab->elf.dynamic_sections_created)
10247 {
10248 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 10249 if (bfd_link_executable (info) && !info->nointerp)
65f38f15 10250 {
3d4d4302 10251 s = bfd_get_linker_section (dynobj, ".interp");
65f38f15
AM
10252 if (s == NULL)
10253 abort ();
eea6121a 10254 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
10255 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
10256 }
10257 }
10258
10259 /* Set up .got offsets for local syms, and space for local dynamic
10260 relocs. */
c72f2fb2 10261 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
65f38f15 10262 {
411e1bfb
AM
10263 struct got_entry **lgot_ents;
10264 struct got_entry **end_lgot_ents;
e054468f
AM
10265 struct plt_entry **local_plt;
10266 struct plt_entry **end_local_plt;
f961d9dd 10267 unsigned char *lgot_masks;
65f38f15
AM
10268 bfd_size_type locsymcount;
10269 Elf_Internal_Shdr *symtab_hdr;
3a3a4c1f
AM
10270 Elf_Internal_Sym *local_syms;
10271 Elf_Internal_Sym *isym;
65f38f15 10272
0c8d6e5c 10273 if (!is_ppc64_elf (ibfd))
65f38f15
AM
10274 continue;
10275
10276 for (s = ibfd->sections; s != NULL; s = s->next)
10277 {
1657026c 10278 struct ppc_local_dyn_relocs *p;
65f38f15 10279
6edfbbad 10280 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
65f38f15 10281 {
365bf300 10282 if (discarded_section (p->sec))
ec338859
AM
10283 {
10284 /* Input section has been discarded, either because
10285 it is a copy of a linkonce section or due to
10286 linker script /DISCARD/, so we'll be discarding
10287 the relocs too. */
10288 }
248866a8 10289 else if (p->count != 0)
ec338859 10290 {
1657026c
AM
10291 unsigned int count;
10292 asection *srel;
10293
10294 count = p->count;
8ffb6df2
AM
10295 if (info->enable_dt_relr
10296 && ((!NO_OPD_RELOCS
10297 && (ppc64_elf_section_data (p->sec)->sec_type
10298 == sec_opd))
10299 || !p->ifunc))
1657026c
AM
10300 count -= p->rel_count;
10301 srel = elf_section_data (p->sec)->sreloc;
19e08130 10302 if (p->ifunc)
33e44f2e 10303 srel = htab->elf.irelplt;
1657026c 10304 srel->size += count * sizeof (Elf64_External_Rela);
248866a8
AM
10305 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
10306 info->flags |= DF_TEXTREL;
ec338859 10307 }
65f38f15
AM
10308 }
10309 }
10310
411e1bfb
AM
10311 lgot_ents = elf_local_got_ents (ibfd);
10312 if (!lgot_ents)
65f38f15
AM
10313 continue;
10314
0ffa91dd 10315 symtab_hdr = &elf_symtab_hdr (ibfd);
65f38f15 10316 locsymcount = symtab_hdr->sh_info;
411e1bfb 10317 end_lgot_ents = lgot_ents + locsymcount;
e054468f
AM
10318 local_plt = (struct plt_entry **) end_lgot_ents;
10319 end_local_plt = local_plt + locsymcount;
f961d9dd 10320 lgot_masks = (unsigned char *) end_local_plt;
c9fecd62
AM
10321 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
10322 if (local_syms == NULL && locsymcount != 0)
3a3a4c1f 10323 {
c9fecd62
AM
10324 local_syms = bfd_elf_get_elf_syms (ibfd, symtab_hdr, locsymcount,
10325 0, NULL, NULL, NULL);
10326 if (local_syms == NULL)
10327 return false;
3a3a4c1f 10328 }
e717da7e 10329 s = ppc64_elf_tdata (ibfd)->got;
3a3a4c1f
AM
10330 for (isym = local_syms;
10331 lgot_ents < end_lgot_ents;
c9fecd62 10332 ++lgot_ents, ++lgot_masks, isym++)
65f38f15 10333 {
0b8bcf0d 10334 struct got_entry **pent, *ent;
411e1bfb 10335
0b8bcf0d
AM
10336 pent = lgot_ents;
10337 while ((ent = *pent) != NULL)
411e1bfb
AM
10338 if (ent->got.refcount > 0)
10339 {
e7b938ca 10340 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 10341 {
927be08e 10342 ppc64_tlsld_got (ibfd)->got.refcount += 1;
0b8bcf0d 10343 *pent = ent->next;
411e1bfb
AM
10344 }
10345 else
10346 {
19e08130
AM
10347 unsigned int ent_size = 8;
10348 unsigned int rel_size = sizeof (Elf64_External_Rela);
10349
eea6121a 10350 ent->got.offset = s->size;
e7b938ca 10351 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
927be08e 10352 {
19e08130
AM
10353 ent_size *= 2;
10354 rel_size *= 2;
10355 }
10356 s->size += ent_size;
37da22e5 10357 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 10358 {
33e44f2e 10359 htab->elf.irelplt->size += rel_size;
19e08130
AM
10360 htab->got_reli_size += rel_size;
10361 }
93370e8e 10362 else if (bfd_link_pic (info)
8f22c953
AM
10363 && (ent->tls_type == 0
10364 ? !info->enable_dt_relr
3a3a4c1f
AM
10365 : !bfd_link_executable (info))
10366 && isym->st_shndx != SHN_ABS)
19e08130
AM
10367 {
10368 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10369 srel->size += rel_size;
927be08e 10370 }
0b8bcf0d 10371 pent = &ent->next;
411e1bfb
AM
10372 }
10373 }
10374 else
0b8bcf0d 10375 *pent = ent->next;
65f38f15 10376 }
3a3a4c1f
AM
10377 if (local_syms != NULL
10378 && symtab_hdr->contents != (unsigned char *) local_syms)
10379 {
10380 if (!info->keep_memory)
10381 free (local_syms);
10382 else
10383 symtab_hdr->contents = (unsigned char *) local_syms;
10384 }
e054468f 10385
2d7ad24e
AM
10386 /* Allocate space for plt calls to local syms. */
10387 lgot_masks = (unsigned char *) end_local_plt;
10388 for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks)
e054468f
AM
10389 {
10390 struct plt_entry *ent;
10391
10392 for (ent = *local_plt; ent != NULL; ent = ent->next)
10393 if (ent->plt.refcount > 0)
10394 {
2d7ad24e
AM
10395 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
10396 {
10397 s = htab->elf.iplt;
10398 ent->plt.offset = s->size;
10399 s->size += PLT_ENTRY_SIZE (htab);
10400 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
10401 }
3e04d765
AM
10402 else if (htab->can_convert_all_inline_plt
10403 || (*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)
2d7ad24e
AM
10404 ent->plt.offset = (bfd_vma) -1;
10405 else
10406 {
10407 s = htab->pltlocal;
10408 ent->plt.offset = s->size;
10409 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
edca615a
AM
10410 if (bfd_link_pic (info)
10411 && !(info->enable_dt_relr && !htab->opd_abi))
2d7ad24e
AM
10412 htab->relpltlocal->size += sizeof (Elf64_External_Rela);
10413 }
e054468f
AM
10414 }
10415 else
10416 ent->plt.offset = (bfd_vma) -1;
10417 }
65f38f15
AM
10418 }
10419
10420 /* Allocate global sym .plt and .got entries, and space for global
10421 sym dynamic relocs. */
4ce794b7 10422 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
a345bc8d 10423
0e1862bb 10424 if (!htab->opd_abi && !bfd_link_pic (info))
a345bc8d 10425 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
65f38f15 10426
7865406b 10427 first_tlsld = NULL;
c72f2fb2 10428 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
102890f0 10429 {
7865406b
AM
10430 struct got_entry *ent;
10431
0c8d6e5c 10432 if (!is_ppc64_elf (ibfd))
102890f0
AM
10433 continue;
10434
7865406b
AM
10435 ent = ppc64_tlsld_got (ibfd);
10436 if (ent->got.refcount > 0)
102890f0 10437 {
7865406b 10438 if (!htab->do_multi_toc && first_tlsld != NULL)
102890f0 10439 {
0a1b45a2 10440 ent->is_indirect = true;
7865406b
AM
10441 ent->got.ent = first_tlsld;
10442 }
10443 else
10444 {
10445 if (first_tlsld == NULL)
10446 first_tlsld = ent;
10447 s = ppc64_elf_tdata (ibfd)->got;
10448 ent->got.offset = s->size;
10449 ent->owner = ibfd;
10450 s->size += 16;
f749f26e 10451 if (bfd_link_dll (info))
7865406b
AM
10452 {
10453 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10454 srel->size += sizeof (Elf64_External_Rela);
10455 }
102890f0
AM
10456 }
10457 }
10458 else
7865406b 10459 ent->got.offset = (bfd_vma) -1;
102890f0
AM
10460 }
10461
65f38f15
AM
10462 /* We now have determined the sizes of the various dynamic sections.
10463 Allocate memory for them. */
0a1b45a2 10464 relocs = false;
65f38f15
AM
10465 for (s = dynobj->sections; s != NULL; s = s->next)
10466 {
10467 if ((s->flags & SEC_LINKER_CREATED) == 0)
10468 continue;
10469
1657026c 10470 if (s == htab->brlt || s == htab->relbrlt || s == htab->elf.srelrdyn)
721956f4
AM
10471 /* These haven't been allocated yet; don't strip. */
10472 continue;
33e44f2e
AM
10473 else if (s == htab->elf.sgot
10474 || s == htab->elf.splt
10475 || s == htab->elf.iplt
2d7ad24e 10476 || s == htab->pltlocal
c456f082 10477 || s == htab->glink
9e390558 10478 || s == htab->global_entry
5474d94f
AM
10479 || s == htab->elf.sdynbss
10480 || s == htab->elf.sdynrelro)
65f38f15
AM
10481 {
10482 /* Strip this section if we don't need it; see the
10483 comment below. */
5bd4f169 10484 }
58d180e8
AM
10485 else if (s == htab->glink_eh_frame)
10486 {
10487 if (!bfd_is_abs_section (s->output_section))
10488 /* Not sized yet. */
10489 continue;
10490 }
08dedd66 10491 else if (startswith (s->name, ".rela"))
5bd4f169 10492 {
c456f082 10493 if (s->size != 0)
5bd4f169 10494 {
33e44f2e 10495 if (s != htab->elf.srelplt)
0a1b45a2 10496 relocs = true;
5bd4f169
AM
10497
10498 /* We use the reloc_count field as a counter if we need
10499 to copy relocs into the output file. */
10500 s->reloc_count = 0;
10501 }
10502 }
65f38f15 10503 else
5bd4f169
AM
10504 {
10505 /* It's not one of our sections, so don't allocate space. */
10506 continue;
10507 }
10508
eea6121a 10509 if (s->size == 0)
5bd4f169 10510 {
c456f082
AM
10511 /* If we don't need this section, strip it from the
10512 output file. This is mostly to handle .rela.bss and
10513 .rela.plt. We must create both sections in
10514 create_dynamic_sections, because they must be created
10515 before the linker maps input sections to output
10516 sections. The linker does that before
10517 adjust_dynamic_symbol is called, and it is that
10518 function which decides whether anything needs to go
10519 into these sections. */
8423293d 10520 s->flags |= SEC_EXCLUDE;
5bd4f169
AM
10521 continue;
10522 }
10523
06bcf541
AM
10524 if (bfd_is_abs_section (s->output_section))
10525 _bfd_error_handler (_("warning: discarding dynamic section %s"),
10526 s->name);
10527
c456f082 10528 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5f333394
AM
10529 continue;
10530
65f38f15
AM
10531 /* Allocate memory for the section contents. We use bfd_zalloc
10532 here in case unused entries are not reclaimed before the
10533 section's contents are written out. This should not happen,
411e1bfb
AM
10534 but this way if it does we get a R_PPC64_NONE reloc in .rela
10535 sections instead of garbage.
10536 We also rely on the section contents being zero when writing
5474d94f 10537 the GOT and .dynrelro. */
eea6121a 10538 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 10539 if (s->contents == NULL)
0a1b45a2 10540 return false;
5bd4f169
AM
10541 }
10542
c72f2fb2 10543 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
e717da7e 10544 {
0c8d6e5c 10545 if (!is_ppc64_elf (ibfd))
7b53ace3
AM
10546 continue;
10547
e717da7e 10548 s = ppc64_elf_tdata (ibfd)->got;
33e44f2e 10549 if (s != NULL && s != htab->elf.sgot)
e717da7e 10550 {
eea6121a 10551 if (s->size == 0)
8423293d 10552 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10553 else
10554 {
eea6121a 10555 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e 10556 if (s->contents == NULL)
0a1b45a2 10557 return false;
e717da7e
AM
10558 }
10559 }
10560 s = ppc64_elf_tdata (ibfd)->relgot;
10561 if (s != NULL)
10562 {
eea6121a 10563 if (s->size == 0)
8423293d 10564 s->flags |= SEC_EXCLUDE;
e717da7e
AM
10565 else
10566 {
eea6121a 10567 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e 10568 if (s->contents == NULL)
0a1b45a2
AM
10569 return false;
10570 relocs = true;
e717da7e
AM
10571 s->reloc_count = 0;
10572 }
10573 }
10574 }
10575
e86ce104 10576 if (htab->elf.dynamic_sections_created)
5bd4f169 10577 {
0a1b45a2 10578 bool tls_opt;
e8910a83 10579
5bd4f169
AM
10580 /* Add some entries to the .dynamic section. We fill in the
10581 values later, in ppc64_elf_finish_dynamic_sections, but we
10582 must add the entries now so that we get the correct size for
10583 the .dynamic section. The DT_DEBUG entry is filled in by the
10584 dynamic linker and used by the debugger. */
dc810e39 10585#define add_dynamic_entry(TAG, VAL) \
5a580b3a 10586 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 10587
0e1862bb 10588 if (bfd_link_executable (info))
5bd4f169 10589 {
dc810e39 10590 if (!add_dynamic_entry (DT_DEBUG, 0))
0a1b45a2 10591 return false;
5bd4f169
AM
10592 }
10593
33e44f2e 10594 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
5bd4f169 10595 {
dc810e39
AM
10596 if (!add_dynamic_entry (DT_PLTGOT, 0)
10597 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10598 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
10599 || !add_dynamic_entry (DT_JMPREL, 0)
10600 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
0a1b45a2 10601 return false;
5bd4f169
AM
10602 }
10603
ee67d69a 10604 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
19397422
AM
10605 {
10606 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10607 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
0a1b45a2 10608 return false;
19397422
AM
10609 }
10610
7c9cf415 10611 tls_opt = (htab->params->tls_get_addr_opt
9e7028aa
AM
10612 && ((htab->tls_get_addr_fd != NULL
10613 && htab->tls_get_addr_fd->elf.plt.plist != NULL)
10614 || (htab->tga_desc_fd != NULL
10615 && htab->tga_desc_fd->elf.plt.plist != NULL)));
e8910a83
AM
10616 if (tls_opt || !htab->opd_abi)
10617 {
10618 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
0a1b45a2 10619 return false;
e8910a83 10620 }
a7f2871e 10621
5bd4f169
AM
10622 if (relocs)
10623 {
dc810e39
AM
10624 if (!add_dynamic_entry (DT_RELA, 0)
10625 || !add_dynamic_entry (DT_RELASZ, 0)
10626 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
0a1b45a2 10627 return false;
5bd4f169 10628
65f38f15
AM
10629 /* If any dynamic relocs apply to a read-only section,
10630 then we need a DT_TEXTREL entry. */
248866a8 10631 if ((info->flags & DF_TEXTREL) == 0)
d49e5065
L
10632 elf_link_hash_traverse (&htab->elf,
10633 _bfd_elf_maybe_set_textrel, info);
5bd4f169 10634
65f38f15 10635 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 10636 {
65f38f15 10637 if (!add_dynamic_entry (DT_TEXTREL, 0))
0a1b45a2 10638 return false;
5bd4f169 10639 }
5bd4f169 10640 }
5bd4f169 10641 }
65f38f15 10642#undef add_dynamic_entry
5bd4f169 10643
0a1b45a2 10644 return true;
5bd4f169
AM
10645}
10646
a345bc8d
AM
10647/* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10648
0a1b45a2 10649static bool
a345bc8d
AM
10650ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10651{
10652 if (h->plt.plist != NULL
10653 && !h->def_regular
10654 && !h->pointer_equality_needed)
0a1b45a2 10655 return false;
a345bc8d
AM
10656
10657 return _bfd_elf_hash_symbol (h);
10658}
10659
721956f4 10660/* Determine the type of stub needed, if any, for a call. */
5bd4f169 10661
7aba54da 10662static inline enum ppc_stub_main_type
4ce794b7
AM
10663ppc_type_of_stub (asection *input_sec,
10664 const Elf_Internal_Rela *rel,
10665 struct ppc_link_hash_entry **hash,
e054468f 10666 struct plt_entry **plt_ent,
6911b7dc
AM
10667 bfd_vma destination,
10668 unsigned long local_off)
5bd4f169 10669{
721956f4
AM
10670 struct ppc_link_hash_entry *h = *hash;
10671 bfd_vma location;
10672 bfd_vma branch_offset;
10673 bfd_vma max_branch_offset;
4ce794b7 10674 enum elf_ppc64_reloc_type r_type;
5bd4f169 10675
721956f4
AM
10676 if (h != NULL)
10677 {
e054468f 10678 struct plt_entry *ent;
7fe2b9a6 10679 struct ppc_link_hash_entry *fdh = h;
b31867b6
AM
10680 if (h->oh != NULL
10681 && h->oh->is_func_descriptor)
7b8f6675
AM
10682 {
10683 fdh = ppc_follow_link (h->oh);
10684 *hash = fdh;
10685 }
8387904d 10686
e054468f
AM
10687 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10688 if (ent->addend == rel->r_addend
10689 && ent->plt.offset != (bfd_vma) -1)
10690 {
e054468f
AM
10691 *plt_ent = ent;
10692 return ppc_stub_plt_call;
10693 }
5bd4f169 10694
7fe2b9a6
AM
10695 /* Here, we know we don't have a plt entry. If we don't have a
10696 either a defined function descriptor or a defined entry symbol
10697 in a regular object file, then it is pointless trying to make
10698 any other type of stub. */
854b41e7
AM
10699 if (!is_static_defined (&fdh->elf)
10700 && !is_static_defined (&h->elf))
721956f4 10701 return ppc_stub_none;
5d1634d7 10702 }
e054468f
AM
10703 else if (elf_local_got_ents (input_sec->owner) != NULL)
10704 {
10705 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10706 struct plt_entry **local_plt = (struct plt_entry **)
10707 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10708 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10709
10710 if (local_plt[r_symndx] != NULL)
10711 {
10712 struct plt_entry *ent;
10713
10714 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10715 if (ent->addend == rel->r_addend
10716 && ent->plt.offset != (bfd_vma) -1)
10717 {
10718 *plt_ent = ent;
10719 return ppc_stub_plt_call;
10720 }
10721 }
10722 }
5d1634d7 10723
721956f4
AM
10724 /* Determine where the call point is. */
10725 location = (input_sec->output_offset
10726 + input_sec->output_section->vma
10727 + rel->r_offset);
5d1634d7 10728
721956f4
AM
10729 branch_offset = destination - location;
10730 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 10731
721956f4
AM
10732 /* Determine if a long branch stub is needed. */
10733 max_branch_offset = 1 << 25;
23cedd1d
AM
10734 if (r_type == R_PPC64_REL14
10735 || r_type == R_PPC64_REL14_BRTAKEN
10736 || r_type == R_PPC64_REL14_BRNTAKEN)
721956f4 10737 max_branch_offset = 1 << 15;
5d1634d7 10738
6911b7dc 10739 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
721956f4
AM
10740 /* We need a stub. Figure out whether a long_branch or plt_branch
10741 is needed later. */
10742 return ppc_stub_long_branch;
5d1634d7 10743
721956f4 10744 return ppc_stub_none;
5d1634d7
AM
10745}
10746
f891966f
AM
10747/* Gets the address of a label (1:) in r11 and builds an offset in r12,
10748 then adds it to r11 (LOAD false) or loads r12 from r11+r12 (LOAD true).
10749 . mflr %r12
10750 . bcl 20,31,1f
10751 .1: mflr %r11
10752 . mtlr %r12
05d0e962 10753 . lis %r12,xxx-1b@highest
f891966f 10754 . ori %r12,%r12,xxx-1b@higher
05d0e962 10755 . sldi %r12,%r12,32
f891966f 10756 . oris %r12,%r12,xxx-1b@high
05d0e962 10757 . ori %r12,%r12,xxx-1b@l
f891966f 10758 . add/ldx %r12,%r11,%r12 */
05d0e962
AM
10759
10760static bfd_byte *
0a1b45a2 10761build_offset (bfd *abfd, bfd_byte *p, bfd_vma off, bool load)
05d0e962 10762{
f891966f
AM
10763 bfd_put_32 (abfd, MFLR_R12, p);
10764 p += 4;
10765 bfd_put_32 (abfd, BCL_20_31, p);
10766 p += 4;
10767 bfd_put_32 (abfd, MFLR_R11, p);
10768 p += 4;
10769 bfd_put_32 (abfd, MTLR_R12, p);
10770 p += 4;
05d0e962
AM
10771 if (off + 0x8000 < 0x10000)
10772 {
10773 if (load)
10774 bfd_put_32 (abfd, LD_R12_0R11 + PPC_LO (off), p);
10775 else
10776 bfd_put_32 (abfd, ADDI_R12_R11 + PPC_LO (off), p);
10777 p += 4;
10778 }
10779 else if (off + 0x80008000ULL < 0x100000000ULL)
10780 {
10781 bfd_put_32 (abfd, ADDIS_R12_R11 + PPC_HA (off), p);
10782 p += 4;
10783 if (load)
10784 bfd_put_32 (abfd, LD_R12_0R12 + PPC_LO (off), p);
10785 else
10786 bfd_put_32 (abfd, ADDI_R12_R12 + PPC_LO (off), p);
10787 p += 4;
10788 }
10789 else
10790 {
10791 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10792 {
10793 bfd_put_32 (abfd, LI_R12_0 + ((off >> 32) & 0xffff), p);
10794 p += 4;
10795 }
10796 else
10797 {
10798 bfd_put_32 (abfd, LIS_R12 + ((off >> 48) & 0xffff), p);
10799 p += 4;
10800 if (((off >> 32) & 0xffff) != 0)
10801 {
10802 bfd_put_32 (abfd, ORI_R12_R12_0 + ((off >> 32) & 0xffff), p);
10803 p += 4;
10804 }
10805 }
10806 if (((off >> 32) & 0xffffffffULL) != 0)
10807 {
10808 bfd_put_32 (abfd, SLDI_R12_R12_32, p);
10809 p += 4;
10810 }
10811 if (PPC_HI (off) != 0)
10812 {
10813 bfd_put_32 (abfd, ORIS_R12_R12_0 + PPC_HI (off), p);
10814 p += 4;
10815 }
10816 if (PPC_LO (off) != 0)
10817 {
10818 bfd_put_32 (abfd, ORI_R12_R12_0 + PPC_LO (off), p);
10819 p += 4;
10820 }
10821 if (load)
10822 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10823 else
10824 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10825 p += 4;
10826 }
10827 return p;
10828}
10829
10830static unsigned int
10831size_offset (bfd_vma off)
10832{
10833 unsigned int size;
10834 if (off + 0x8000 < 0x10000)
10835 size = 4;
10836 else if (off + 0x80008000ULL < 0x100000000ULL)
10837 size = 8;
10838 else
10839 {
10840 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10841 size = 4;
10842 else
10843 {
10844 size = 4;
10845 if (((off >> 32) & 0xffff) != 0)
10846 size += 4;
10847 }
10848 if (((off >> 32) & 0xffffffffULL) != 0)
10849 size += 4;
10850 if (PPC_HI (off) != 0)
10851 size += 4;
10852 if (PPC_LO (off) != 0)
10853 size += 4;
10854 size += 4;
10855 }
f891966f 10856 return size + 16;
05d0e962
AM
10857}
10858
3d58e1fc
AM
10859static unsigned int
10860num_relocs_for_offset (bfd_vma off)
10861{
10862 unsigned int num_rel;
10863 if (off + 0x8000 < 0x10000)
10864 num_rel = 1;
10865 else if (off + 0x80008000ULL < 0x100000000ULL)
10866 num_rel = 2;
10867 else
10868 {
10869 num_rel = 1;
10870 if (off + 0x800000000000ULL >= 0x1000000000000ULL
10871 && ((off >> 32) & 0xffff) != 0)
10872 num_rel += 1;
10873 if (PPC_HI (off) != 0)
10874 num_rel += 1;
10875 if (PPC_LO (off) != 0)
10876 num_rel += 1;
10877 }
10878 return num_rel;
10879}
10880
10881static Elf_Internal_Rela *
10882emit_relocs_for_offset (struct bfd_link_info *info, Elf_Internal_Rela *r,
10883 bfd_vma roff, bfd_vma targ, bfd_vma off)
10884{
10885 bfd_vma relative_targ = targ - (roff - 8);
10886 if (bfd_big_endian (info->output_bfd))
10887 roff += 2;
10888 r->r_offset = roff;
10889 r->r_addend = relative_targ + roff;
10890 if (off + 0x8000 < 0x10000)
10891 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16);
10892 else if (off + 0x80008000ULL < 0x100000000ULL)
10893 {
10894 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HA);
10895 ++r;
10896 roff += 4;
10897 r->r_offset = roff;
10898 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10899 r->r_addend = relative_targ + roff;
10900 }
10901 else
10902 {
10903 if (off + 0x800000000000ULL < 0x1000000000000ULL)
10904 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10905 else
10906 {
10907 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHEST);
10908 if (((off >> 32) & 0xffff) != 0)
10909 {
10910 ++r;
10911 roff += 4;
10912 r->r_offset = roff;
10913 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER);
10914 r->r_addend = relative_targ + roff;
10915 }
10916 }
10917 if (((off >> 32) & 0xffffffffULL) != 0)
10918 roff += 4;
10919 if (PPC_HI (off) != 0)
10920 {
10921 ++r;
10922 roff += 4;
10923 r->r_offset = roff;
10924 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGH);
10925 r->r_addend = relative_targ + roff;
10926 }
10927 if (PPC_LO (off) != 0)
10928 {
10929 ++r;
10930 roff += 4;
10931 r->r_offset = roff;
10932 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO);
10933 r->r_addend = relative_targ + roff;
10934 }
10935 }
10936 return r;
10937}
10938
04bdff6a 10939static bfd_byte *
7c1f4227 10940build_power10_offset (bfd *abfd, bfd_byte *p, bfd_vma off, int odd,
0a1b45a2 10941 bool load)
04bdff6a
AM
10942{
10943 uint64_t insn;
10944 if (off - odd + (1ULL << 33) < 1ULL << 34)
10945 {
10946 off -= odd;
10947 if (odd)
10948 {
10949 bfd_put_32 (abfd, NOP, p);
10950 p += 4;
10951 }
10952 if (load)
10953 insn = PLD_R12_PC;
10954 else
10955 insn = PADDI_R12_PC;
10956 insn |= D34 (off);
10957 bfd_put_32 (abfd, insn >> 32, p);
10958 p += 4;
10959 bfd_put_32 (abfd, insn, p);
10960 }
10961 /* The minimum value for paddi is -0x200000000. The minimum value
10962 for li is -0x8000, which when shifted by 34 and added gives a
10963 minimum value of -0x2000200000000. The maximum value is
10964 0x1ffffffff+0x7fff<<34 which is 0x2000200000000-1. */
10965 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
10966 {
10967 off -= 8 - odd;
10968 bfd_put_32 (abfd, LI_R11_0 | (HA34 (off) & 0xffff), p);
10969 p += 4;
10970 if (!odd)
10971 {
10972 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10973 p += 4;
10974 }
10975 insn = PADDI_R12_PC | D34 (off);
10976 bfd_put_32 (abfd, insn >> 32, p);
10977 p += 4;
10978 bfd_put_32 (abfd, insn, p);
10979 p += 4;
10980 if (odd)
10981 {
10982 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
10983 p += 4;
10984 }
10985 if (load)
10986 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
10987 else
10988 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
10989 }
10990 else
10991 {
10992 off -= odd + 8;
10993 bfd_put_32 (abfd, LIS_R11 | ((HA34 (off) >> 16) & 0x3fff), p);
10994 p += 4;
10995 bfd_put_32 (abfd, ORI_R11_R11_0 | (HA34 (off) & 0xffff), p);
10996 p += 4;
10997 if (odd)
10998 {
10999 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
11000 p += 4;
11001 }
11002 insn = PADDI_R12_PC | D34 (off);
11003 bfd_put_32 (abfd, insn >> 32, p);
11004 p += 4;
11005 bfd_put_32 (abfd, insn, p);
11006 p += 4;
11007 if (!odd)
11008 {
11009 bfd_put_32 (abfd, SLDI_R11_R11_34, p);
11010 p += 4;
11011 }
11012 if (load)
11013 bfd_put_32 (abfd, LDX_R12_R11_R12, p);
11014 else
11015 bfd_put_32 (abfd, ADD_R12_R11_R12, p);
11016 }
11017 p += 4;
11018 return p;
11019}
11020
11021static unsigned int
7c1f4227 11022size_power10_offset (bfd_vma off, int odd)
04bdff6a
AM
11023{
11024 if (off - odd + (1ULL << 33) < 1ULL << 34)
11025 return odd + 8;
11026 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
11027 return 20;
11028 else
11029 return 24;
11030}
11031
11032static unsigned int
7c1f4227 11033num_relocs_for_power10_offset (bfd_vma off, int odd)
04bdff6a
AM
11034{
11035 if (off - odd + (1ULL << 33) < 1ULL << 34)
11036 return 1;
11037 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
11038 return 2;
11039 else
11040 return 3;
11041}
11042
11043static Elf_Internal_Rela *
7c1f4227 11044emit_relocs_for_power10_offset (struct bfd_link_info *info,
04bdff6a
AM
11045 Elf_Internal_Rela *r, bfd_vma roff,
11046 bfd_vma targ, bfd_vma off, int odd)
11047{
11048 if (off - odd + (1ULL << 33) < 1ULL << 34)
11049 roff += odd;
11050 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32)
11051 {
11052 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
11053 r->r_offset = roff + d_offset;
11054 r->r_addend = targ + 8 - odd - d_offset;
11055 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
11056 ++r;
11057 roff += 8 - odd;
11058 }
11059 else
11060 {
11061 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0;
11062 r->r_offset = roff + d_offset;
11063 r->r_addend = targ + 8 + odd - d_offset;
11064 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHESTA34);
11065 ++r;
11066 roff += 4;
11067 r->r_offset = roff + d_offset;
11068 r->r_addend = targ + 4 + odd - d_offset;
11069 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34);
11070 ++r;
11071 roff += 4 + odd;
11072 }
11073 r->r_offset = roff;
11074 r->r_addend = targ;
11075 r->r_info = ELF64_R_INFO (0, R_PPC64_PCREL34);
11076 return r;
11077}
11078
df136d64
AM
11079/* Emit .eh_frame opcode to advance pc by DELTA. */
11080
11081static bfd_byte *
11082eh_advance (bfd *abfd, bfd_byte *eh, unsigned int delta)
11083{
11084 delta /= 4;
11085 if (delta < 64)
11086 *eh++ = DW_CFA_advance_loc + delta;
11087 else if (delta < 256)
11088 {
11089 *eh++ = DW_CFA_advance_loc1;
11090 *eh++ = delta;
11091 }
11092 else if (delta < 65536)
11093 {
11094 *eh++ = DW_CFA_advance_loc2;
11095 bfd_put_16 (abfd, delta, eh);
11096 eh += 2;
11097 }
11098 else
11099 {
11100 *eh++ = DW_CFA_advance_loc4;
11101 bfd_put_32 (abfd, delta, eh);
11102 eh += 4;
11103 }
11104 return eh;
11105}
11106
11107/* Size of required .eh_frame opcode to advance pc by DELTA. */
11108
11109static unsigned int
11110eh_advance_size (unsigned int delta)
11111{
11112 if (delta < 64 * 4)
11113 /* DW_CFA_advance_loc+[1..63]. */
11114 return 1;
11115 if (delta < 256 * 4)
11116 /* DW_CFA_advance_loc1, byte. */
11117 return 2;
11118 if (delta < 65536 * 4)
11119 /* DW_CFA_advance_loc2, 2 bytes. */
11120 return 3;
11121 /* DW_CFA_advance_loc4, 4 bytes. */
11122 return 5;
11123}
11124
794e51c0
AM
11125/* With power7 weakly ordered memory model, it is possible for ld.so
11126 to update a plt entry in one thread and have another thread see a
11127 stale zero toc entry. To avoid this we need some sort of acquire
11128 barrier in the call stub. One solution is to make the load of the
11129 toc word seem to appear to depend on the load of the function entry
11130 word. Another solution is to test for r2 being zero, and branch to
11131 the appropriate glink entry if so.
11132
11133 . fake dep barrier compare
71a39c98
AM
11134 . ld 12,xxx(2) ld 12,xxx(2)
11135 . mtctr 12 mtctr 12
11136 . xor 11,12,12 ld 2,xxx+8(2)
794e51c0
AM
11137 . add 2,2,11 cmpldi 2,0
11138 . ld 2,xxx+8(2) bnectr+
11139 . bctr b <glink_entry>
11140
11141 The solution involving the compare turns out to be faster, so
11142 that's what we use unless the branch won't reach. */
11143
11144#define ALWAYS_USE_FAKE_DEP 0
11145#define ALWAYS_EMIT_R2SAVE 0
5d1634d7 11146
794e51c0
AM
11147static inline unsigned int
11148plt_stub_size (struct ppc_link_hash_table *htab,
11149 struct ppc_stub_hash_entry *stub_entry,
29433886
AM
11150 bfd_vma off,
11151 unsigned int odd)
794e51c0 11152{
05d0e962 11153 unsigned size;
b9e5796b 11154
7aba54da 11155 if (stub_entry->type.sub == ppc_stub_notoc)
05d0e962 11156 {
7aba54da
AM
11157 size = 8 + size_power10_offset (off, odd);
11158 if (stub_entry->type.r2save)
11159 size += 4;
11160 }
11161 else if (stub_entry->type.sub == ppc_stub_p9notoc)
11162 {
11163 size = 8 + size_offset (off - 8);
11164 if (stub_entry->type.r2save)
05d0e962 11165 size += 4;
05d0e962 11166 }
29433886 11167 else
b9e5796b 11168 {
29433886 11169 size = 12;
7aba54da 11170 if (ALWAYS_EMIT_R2SAVE || stub_entry->type.r2save)
b9e5796b 11171 size += 4;
29433886 11172 if (PPC_HA (off) != 0)
b9e5796b 11173 size += 4;
29433886
AM
11174 if (htab->opd_abi)
11175 {
11176 size += 4;
11177 if (htab->params->plt_static_chain)
11178 size += 4;
11179 if (htab->params->plt_thread_safe
11180 && htab->elf.dynamic_sections_created
11181 && stub_entry->h != NULL
11182 && stub_entry->h->elf.dynindx != -1)
11183 size += 8;
11184 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain)
11185 != PPC_HA (off))
11186 size += 4;
11187 }
b9e5796b 11188 }
794e51c0 11189 if (stub_entry->h != NULL
ed7007c1 11190 && is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 11191 && htab->params->tls_get_addr_opt)
f378ab09 11192 {
29433886 11193 if (!htab->params->no_tls_get_addr_regsave)
9e7028aa 11194 {
29433886 11195 size += 30 * 4;
7aba54da 11196 if (stub_entry->type.r2save)
29433886 11197 size += 4;
9e7028aa
AM
11198 }
11199 else
11200 {
29433886 11201 size += 7 * 4;
7aba54da 11202 if (stub_entry->type.r2save)
29433886 11203 size += 6 * 4;
9e7028aa 11204 }
f378ab09 11205 }
794e51c0
AM
11206 return size;
11207}
11208
2420fff6
AM
11209/* Depending on the sign of plt_stub_align:
11210 If positive, return the padding to align to a 2**plt_stub_align
11211 boundary.
11212 If negative, if this stub would cross fewer 2**plt_stub_align
11213 boundaries if we align, then return the padding needed to do so. */
11214
794e51c0 11215static inline unsigned int
0f0d9373 11216plt_stub_pad (int plt_stub_align,
2405fc40 11217 bfd_vma stub_off,
0f0d9373 11218 unsigned int stub_size)
794e51c0 11219{
0f0d9373 11220 unsigned int stub_align;
794e51c0 11221
0f0d9373
AM
11222 if (plt_stub_align >= 0)
11223 stub_align = 1u << plt_stub_align;
11224 else
2420fff6 11225 {
0f0d9373
AM
11226 stub_align = 1u << -plt_stub_align;
11227 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
11228 <= ((stub_size - 1) & -stub_align))
11229 return 0;
2420fff6 11230 }
0f0d9373 11231 return stub_align - 1 - ((stub_off - 1) & (stub_align - 1));
794e51c0
AM
11232}
11233
7aba54da 11234/* Build a toc using .plt call stub. */
794e51c0
AM
11235
11236static inline bfd_byte *
11237build_plt_stub (struct ppc_link_hash_table *htab,
11238 struct ppc_stub_hash_entry *stub_entry,
11239 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
11240{
e7d1c40c 11241 bfd *obfd = htab->params->stub_bfd;
0a1b45a2
AM
11242 bool plt_load_toc = htab->opd_abi;
11243 bool plt_static_chain = htab->params->plt_static_chain;
11244 bool plt_thread_safe = (htab->params->plt_thread_safe
11245 && htab->elf.dynamic_sections_created
11246 && stub_entry->h != NULL
11247 && stub_entry->h->elf.dynindx != -1);
11248 bool use_fake_dep = plt_thread_safe;
794e51c0
AM
11249 bfd_vma cmp_branch_off = 0;
11250
11251 if (!ALWAYS_USE_FAKE_DEP
b9e5796b 11252 && plt_load_toc
794e51c0 11253 && plt_thread_safe
9e51d549
AM
11254 && !(stub_entry->h != NULL
11255 && is_tls_get_addr (&stub_entry->h->elf, htab)
7c9cf415 11256 && htab->params->tls_get_addr_opt))
794e51c0
AM
11257 {
11258 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
b9e5796b
AM
11259 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
11260 / PLT_ENTRY_SIZE (htab));
9e390558 11261 bfd_vma glinkoff = GLINK_PLTRESOLVE_SIZE (htab) + pltindex * 8;
794e51c0
AM
11262 bfd_vma to, from;
11263
68d62958
AM
11264 if (pltindex > 32768)
11265 glinkoff += (pltindex - 32768) * 4;
794e51c0
AM
11266 to = (glinkoff
11267 + htab->glink->output_offset
11268 + htab->glink->output_section->vma);
6f20ed8a 11269 from = (p - stub_entry->group->stub_sec->contents
7aba54da 11270 + 4 * (ALWAYS_EMIT_R2SAVE || stub_entry->type.r2save)
794e51c0
AM
11271 + 4 * (PPC_HA (offset) != 0)
11272 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
11273 != PPC_HA (offset))
11274 + 4 * (plt_static_chain != 0)
11275 + 20
6f20ed8a
AM
11276 + stub_entry->group->stub_sec->output_offset
11277 + stub_entry->group->stub_sec->output_section->vma);
794e51c0
AM
11278 cmp_branch_off = to - from;
11279 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
11280 }
11281
ac2df442
AM
11282 if (PPC_HA (offset) != 0)
11283 {
176a0d42
AM
11284 if (r != NULL)
11285 {
7aba54da 11286 if (ALWAYS_EMIT_R2SAVE || stub_entry->type.r2save)
794e51c0 11287 r[0].r_offset += 4;
176a0d42 11288 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
3b421ab3 11289 r[1].r_offset = r[0].r_offset + 4;
176a0d42
AM
11290 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11291 r[1].r_addend = r[0].r_addend;
b9e5796b 11292 if (plt_load_toc)
176a0d42 11293 {
b9e5796b 11294 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 11295 {
b9e5796b
AM
11296 r[2].r_offset = r[1].r_offset + 4;
11297 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
11298 r[2].r_addend = r[0].r_addend;
11299 }
11300 else
11301 {
11302 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
11303 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11304 r[2].r_addend = r[0].r_addend + 8;
11305 if (plt_static_chain)
11306 {
11307 r[3].r_offset = r[2].r_offset + 4;
11308 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11309 r[3].r_addend = r[0].r_addend + 16;
11310 }
c7131b65 11311 }
176a0d42
AM
11312 }
11313 }
7aba54da 11314 if (ALWAYS_EMIT_R2SAVE || stub_entry->type.r2save)
a078d95a 11315 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
397998fc
AM
11316 if (plt_load_toc)
11317 {
11318 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
11319 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
11320 }
11321 else
11322 {
11323 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
11324 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
11325 }
b9e5796b
AM
11326 if (plt_load_toc
11327 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442 11328 {
71a39c98 11329 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
ac2df442
AM
11330 offset = 0;
11331 }
71a39c98 11332 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 11333 if (plt_load_toc)
794e51c0 11334 {
b9e5796b
AM
11335 if (use_fake_dep)
11336 {
11337 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
11338 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
11339 }
11340 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
11341 if (plt_static_chain)
11342 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
794e51c0 11343 }
ac2df442
AM
11344 }
11345 else
11346 {
176a0d42
AM
11347 if (r != NULL)
11348 {
7aba54da 11349 if (ALWAYS_EMIT_R2SAVE || stub_entry->type.r2save)
794e51c0 11350 r[0].r_offset += 4;
176a0d42 11351 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
b9e5796b 11352 if (plt_load_toc)
176a0d42 11353 {
b9e5796b 11354 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
c7131b65 11355 {
b9e5796b
AM
11356 r[1].r_offset = r[0].r_offset + 4;
11357 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
11358 r[1].r_addend = r[0].r_addend;
11359 }
11360 else
11361 {
11362 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
11363 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
11364 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
11365 if (plt_static_chain)
11366 {
11367 r[2].r_offset = r[1].r_offset + 4;
11368 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
11369 r[2].r_addend = r[0].r_addend + 8;
11370 }
c7131b65 11371 }
176a0d42
AM
11372 }
11373 }
7aba54da 11374 if (ALWAYS_EMIT_R2SAVE || stub_entry->type.r2save)
a078d95a 11375 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
71a39c98 11376 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
b9e5796b
AM
11377 if (plt_load_toc
11378 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
ac2df442
AM
11379 {
11380 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
11381 offset = 0;
11382 }
71a39c98 11383 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
b9e5796b 11384 if (plt_load_toc)
794e51c0 11385 {
b9e5796b
AM
11386 if (use_fake_dep)
11387 {
11388 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
11389 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
11390 }
11391 if (plt_static_chain)
11392 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
11393 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
794e51c0 11394 }
ac2df442 11395 }
b9e5796b 11396 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
794e51c0
AM
11397 {
11398 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
11399 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
22aa0c7e 11400 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
794e51c0
AM
11401 }
11402 else
407aa07c 11403 bfd_put_32 (obfd, BCTR, p), p += 4;
5d1634d7
AM
11404 return p;
11405}
11406
a7f2871e
AM
11407/* Build a special .plt call stub for __tls_get_addr. */
11408
b9ca1af6 11409#define LD_R0_0R3 0xe8030000
a7f2871e
AM
11410#define LD_R12_0R3 0xe9830000
11411#define MR_R0_R3 0x7c601b78
b9ca1af6 11412#define CMPDI_R0_0 0x2c200000
a7f2871e
AM
11413#define ADD_R3_R12_R13 0x7c6c6a14
11414#define BEQLR 0x4d820020
11415#define MR_R3_R0 0x7c030378
a7f2871e 11416#define BCTRL 0x4e800421
a7f2871e 11417
29433886
AM
11418static bfd_byte *
11419build_tls_get_addr_head (struct ppc_link_hash_table *htab,
794e51c0 11420 struct ppc_stub_hash_entry *stub_entry,
29433886 11421 bfd_byte *p)
a7f2871e 11422{
e7d1c40c 11423 bfd *obfd = htab->params->stub_bfd;
794e51c0 11424
b9ca1af6 11425 bfd_put_32 (obfd, LD_R0_0R3 + 0, p), p += 4;
a7f2871e 11426 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
b9ca1af6 11427 bfd_put_32 (obfd, CMPDI_R0_0, p), p += 4;
a7f2871e 11428 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
a7f2871e
AM
11429 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
11430 bfd_put_32 (obfd, BEQLR, p), p += 4;
11431 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
9e7028aa 11432
29433886
AM
11433 if (!htab->params->no_tls_get_addr_regsave)
11434 p = tls_get_addr_prologue (obfd, p, htab);
7aba54da 11435 else if (stub_entry->type.r2save)
29433886 11436 {
9e7028aa
AM
11437 bfd_put_32 (obfd, MFLR_R0, p);
11438 p += 4;
11439 bfd_put_32 (obfd, STD_R0_0R1 + STK_LINKER (htab), p);
11440 p += 4;
29433886
AM
11441 }
11442 return p;
11443}
9e7028aa 11444
29433886
AM
11445static bfd_byte *
11446build_tls_get_addr_tail (struct ppc_link_hash_table *htab,
11447 struct ppc_stub_hash_entry *stub_entry,
11448 bfd_byte *p,
11449 bfd_byte *loc)
11450{
11451 bfd *obfd = htab->params->stub_bfd;
11452
11453 if (!htab->params->no_tls_get_addr_regsave)
11454 {
11455 bfd_put_32 (obfd, BCTRL, p - 4);
11456
7aba54da 11457 if (stub_entry->type.r2save)
29433886
AM
11458 {
11459 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p);
11460 p += 4;
11461 }
11462 p = tls_get_addr_epilogue (obfd, p, htab);
11463 }
7aba54da 11464 else if (stub_entry->type.r2save)
29433886 11465 {
9e7028aa
AM
11466 bfd_put_32 (obfd, BCTRL, p - 4);
11467
11468 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p);
11469 p += 4;
11470 bfd_put_32 (obfd, LD_R0_0R1 + STK_LINKER (htab), p);
11471 p += 4;
11472 bfd_put_32 (obfd, MTLR_R0, p);
11473 p += 4;
11474 bfd_put_32 (obfd, BLR, p);
11475 p += 4;
11476 }
a7f2871e 11477
df136d64
AM
11478 if (htab->glink_eh_frame != NULL
11479 && htab->glink_eh_frame->size != 0)
11480 {
11481 bfd_byte *base, *eh;
df136d64
AM
11482
11483 base = htab->glink_eh_frame->contents + stub_entry->group->eh_base + 17;
11484 eh = base + stub_entry->group->eh_size;
29433886
AM
11485
11486 if (!htab->params->no_tls_get_addr_regsave)
9e7028aa 11487 {
29433886
AM
11488 unsigned int cfa_updt, delta, i;
11489
9e7028aa
AM
11490 /* After the bctrl, lr has been modified so we need to emit
11491 .eh_frame info saying the return address is on the stack. In
11492 fact we must put the EH info at or before the call rather
11493 than after it, because the EH info for a call needs to be
11494 specified by that point.
11495 See libgcc/unwind-dw2.c execute_cfa_program.
11496 Any stack pointer update must be described immediately after
11497 the instruction making the change, and since the stdu occurs
11498 after saving regs we put all the reg saves and the cfa
11499 change there. */
11500 cfa_updt = stub_entry->stub_offset + 18 * 4;
11501 delta = cfa_updt - stub_entry->group->lr_restore;
11502 stub_entry->group->lr_restore
11503 = stub_entry->stub_offset + (p - loc) - 4;
11504 eh = eh_advance (htab->elf.dynobj, eh, delta);
11505 *eh++ = DW_CFA_def_cfa_offset;
11506 if (htab->opd_abi)
11507 {
11508 *eh++ = 128;
11509 *eh++ = 1;
11510 }
11511 else
11512 *eh++ = 96;
11513 *eh++ = DW_CFA_offset_extended_sf;
11514 *eh++ = 65;
11515 *eh++ = (-16 / 8) & 0x7f;
11516 for (i = 4; i < 12; i++)
11517 {
11518 *eh++ = DW_CFA_offset + i;
11519 *eh++ = (htab->opd_abi ? 13 : 12) - i;
11520 }
11521 *eh++ = (DW_CFA_advance_loc
11522 + (stub_entry->group->lr_restore - 8 - cfa_updt) / 4);
11523 *eh++ = DW_CFA_def_cfa_offset;
11524 *eh++ = 0;
11525 for (i = 4; i < 12; i++)
11526 *eh++ = DW_CFA_restore + i;
11527 *eh++ = DW_CFA_advance_loc + 2;
29433886
AM
11528 *eh++ = DW_CFA_restore_extended;
11529 *eh++ = 65;
11530 stub_entry->group->eh_size = eh - base;
11531 }
7aba54da 11532 else if (stub_entry->type.r2save)
29433886
AM
11533 {
11534 unsigned int lr_used, delta;
11535
11536 lr_used = stub_entry->stub_offset + (p - 20 - loc);
11537 delta = lr_used - stub_entry->group->lr_restore;
11538 stub_entry->group->lr_restore = lr_used + 16;
11539 eh = eh_advance (htab->elf.dynobj, eh, delta);
11540 *eh++ = DW_CFA_offset_extended_sf;
11541 *eh++ = 65;
11542 *eh++ = -(STK_LINKER (htab) / 8) & 0x7f;
11543 *eh++ = DW_CFA_advance_loc + 4;
11544 *eh++ = DW_CFA_restore_extended;
11545 *eh++ = 65;
11546 stub_entry->group->eh_size = eh - base;
9e7028aa 11547 }
df136d64 11548 }
a7f2871e
AM
11549 return p;
11550}
11551
176a0d42
AM
11552static Elf_Internal_Rela *
11553get_relocs (asection *sec, int count)
11554{
11555 Elf_Internal_Rela *relocs;
11556 struct bfd_elf_section_data *elfsec_data;
11557
11558 elfsec_data = elf_section_data (sec);
11559 relocs = elfsec_data->relocs;
11560 if (relocs == NULL)
11561 {
11562 bfd_size_type relsize;
11563 relsize = sec->reloc_count * sizeof (*relocs);
11564 relocs = bfd_alloc (sec->owner, relsize);
11565 if (relocs == NULL)
11566 return NULL;
11567 elfsec_data->relocs = relocs;
d4730f92
BS
11568 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
11569 sizeof (Elf_Internal_Shdr));
11570 if (elfsec_data->rela.hdr == NULL)
11571 return NULL;
11572 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
11573 * sizeof (Elf64_External_Rela));
11574 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
176a0d42
AM
11575 sec->reloc_count = 0;
11576 }
11577 relocs += sec->reloc_count;
11578 sec->reloc_count += count;
11579 return relocs;
11580}
11581
066c738e
AM
11582static bool
11583swap_reloc_out (bfd *obfd, Elf_Internal_Rela *rel, bfd_byte *loc, asection *s)
11584{
11585 if ((size_t) (loc - s->contents) >= s->size)
11586 return false;
11587 bfd_elf64_swap_reloca_out (obfd, rel, loc);
11588 return true;
11589}
11590
11591static bool
11592count_and_swap_reloc_out (bfd *obfd, Elf_Internal_Rela *rel, asection *s)
11593{
11594 bfd_byte *loc = s->contents;
11595 loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
11596 return swap_reloc_out (obfd, rel, loc, s);
11597}
11598
11599
3d58e1fc
AM
11600/* Convert the relocs R[0] thru R[-NUM_REL+1], which are all no-symbol
11601 forms, to the equivalent relocs against the global symbol given by
11602 STUB_ENTRY->H. */
11603
0a1b45a2 11604static bool
3d58e1fc
AM
11605use_global_in_relocs (struct ppc_link_hash_table *htab,
11606 struct ppc_stub_hash_entry *stub_entry,
11607 Elf_Internal_Rela *r, unsigned int num_rel)
11608{
11609 struct elf_link_hash_entry **hashes;
11610 unsigned long symndx;
11611 struct ppc_link_hash_entry *h;
11612 bfd_vma symval;
11613
11614 /* Relocs are always against symbols in their own object file. Fake
11615 up global sym hashes for the stub bfd (which has no symbols). */
11616 hashes = elf_sym_hashes (htab->params->stub_bfd);
11617 if (hashes == NULL)
11618 {
11619 bfd_size_type hsize;
11620
11621 /* When called the first time, stub_globals will contain the
11622 total number of symbols seen during stub sizing. After
11623 allocating, stub_globals is used as an index to fill the
11624 hashes array. */
11625 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
11626 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
11627 if (hashes == NULL)
0a1b45a2 11628 return false;
3d58e1fc
AM
11629 elf_sym_hashes (htab->params->stub_bfd) = hashes;
11630 htab->stub_globals = 1;
11631 }
11632 symndx = htab->stub_globals++;
11633 h = stub_entry->h;
11634 hashes[symndx] = &h->elf;
11635 if (h->oh != NULL && h->oh->is_func)
11636 h = ppc_follow_link (h->oh);
11637 BFD_ASSERT (h->elf.root.type == bfd_link_hash_defined
11638 || h->elf.root.type == bfd_link_hash_defweak);
ed7007c1 11639 symval = defined_sym_val (&h->elf);
3d58e1fc
AM
11640 while (num_rel-- != 0)
11641 {
11642 r->r_info = ELF64_R_INFO (symndx, ELF64_R_TYPE (r->r_info));
11643 if (h->elf.root.u.def.section != stub_entry->target_section)
11644 {
11645 /* H is an opd symbol. The addend must be zero, and the
11646 branch reloc is the only one we can convert. */
11647 r->r_addend = 0;
11648 break;
11649 }
11650 else
11651 r->r_addend -= symval;
11652 --r;
11653 }
0a1b45a2 11654 return true;
3d58e1fc
AM
11655}
11656
aa374f67 11657static bfd_vma
25f53a85 11658get_r2off (struct bfd_link_info *info,
aa374f67
AM
11659 struct ppc_stub_hash_entry *stub_entry)
11660{
25f53a85 11661 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6f20ed8a 11662 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
aa374f67
AM
11663
11664 if (r2off == 0)
11665 {
11666 /* Support linking -R objects. Get the toc pointer from the
11667 opd entry. */
11668 char buf[8];
b9e5796b
AM
11669 if (!htab->opd_abi)
11670 return r2off;
aa374f67
AM
11671 asection *opd = stub_entry->h->elf.root.u.def.section;
11672 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
11673
11674 if (strcmp (opd->name, ".opd") != 0
11675 || opd->reloc_count != 0)
11676 {
2cdcc330
AM
11677 info->callbacks->einfo
11678 (_("%P: cannot find opd entry toc for `%pT'\n"),
11679 stub_entry->h->elf.root.root.string);
aa374f67 11680 bfd_set_error (bfd_error_bad_value);
a7c49797 11681 return (bfd_vma) -1;
aa374f67
AM
11682 }
11683 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
a7c49797 11684 return (bfd_vma) -1;
aa374f67 11685 r2off = bfd_get_64 (opd->owner, buf);
25f53a85 11686 r2off -= elf_gp (info->output_bfd);
aa374f67 11687 }
6f20ed8a 11688 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
aa374f67
AM
11689 return r2off;
11690}
11691
46439c90
AM
11692/* Debug dump. */
11693
11694static void
ecc741e6
AM
11695dump_stub (const char *header,
11696 struct ppc_stub_hash_entry *stub_entry,
11697 size_t end_offset)
46439c90 11698{
ecc741e6
AM
11699 const char *t1, *t2, *t3;
11700 switch (stub_entry->type.main)
46439c90 11701 {
ecc741e6
AM
11702 case ppc_stub_none: t1 = "none"; break;
11703 case ppc_stub_long_branch: t1 = "long_branch"; break;
11704 case ppc_stub_plt_branch: t1 = "plt_branch"; break;
11705 case ppc_stub_plt_call: t1 = "plt_call"; break;
11706 case ppc_stub_global_entry: t1 = "global_entry"; break;
11707 case ppc_stub_save_res: t1 = "save_res"; break;
11708 default: t1 = "???"; break;
11709 }
11710 switch (stub_entry->type.sub)
11711 {
11712 case ppc_stub_toc: t2 = "toc"; break;
11713 case ppc_stub_notoc: t2 = "notoc"; break;
11714 case ppc_stub_p9notoc: t2 = "p9notoc"; break;
11715 default: t2 = "???"; break;
11716 }
11717 t3 = stub_entry->type.r2save ? "r2save" : "";
11718 fprintf (stderr, "%s id = %u type = %s:%s:%s\n",
11719 header, stub_entry->id, t1, t2, t3);
11720 fprintf (stderr, "name = %s\n", stub_entry->root.string);
b8281767 11721 fprintf (stderr, "offset = 0x%" PRIx64 ":", stub_entry->stub_offset);
ecc741e6
AM
11722 for (size_t i = stub_entry->stub_offset; i < end_offset; i += 4)
11723 {
11724 asection *stub_sec = stub_entry->group->stub_sec;
11725 uint32_t *p = (uint32_t *) (stub_sec->contents + i);
11726 fprintf (stderr, " %08x", (uint32_t) bfd_get_32 (stub_sec->owner, p));
46439c90 11727 }
ecc741e6 11728 fprintf (stderr, "\n");
46439c90
AM
11729}
11730
0a1b45a2 11731static bool
4ce794b7 11732ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 11733{
721956f4
AM
11734 struct ppc_stub_hash_entry *stub_entry;
11735 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
11736 struct bfd_link_info *info;
11737 struct ppc_link_hash_table *htab;
29433886 11738 bfd *obfd;
721956f4 11739 bfd_byte *loc;
3d58e1fc 11740 bfd_byte *p, *relp;
1aa42141 11741 bfd_vma targ, off;
176a0d42 11742 Elf_Internal_Rela *r;
e054468f 11743 asection *plt;
3d58e1fc 11744 int num_rel;
04bdff6a 11745 int odd;
0a1b45a2 11746 bool is_tga;
5d1634d7 11747
721956f4
AM
11748 /* Massage our args to the form they really have. */
11749 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 11750 info = in_arg;
5d1634d7 11751
5d1634d7 11752 htab = ppc_hash_table (info);
4dfe6ac6 11753 if (htab == NULL)
0a1b45a2 11754 return false;
5d1634d7 11755
ecc741e6
AM
11756 struct _ppc64_elf_section_data *esd
11757 = ppc64_elf_section_data (stub_entry->group->stub_sec);
11758 ++htab->stub_id;
11759 if (stub_entry->id != htab->stub_id
570e911f
AM
11760 || (stub_entry->type.main != ppc_stub_save_res
11761 && stub_entry->stub_offset < stub_entry->group->stub_sec->size))
46439c90
AM
11762 {
11763 BFD_ASSERT (0);
ecc741e6
AM
11764 if (stub_entry->id != htab->stub_id)
11765 fprintf (stderr, "Expected id %u, got %u\n",
11766 htab->stub_id, stub_entry->id);
11767 if (stub_entry->stub_offset < stub_entry->group->stub_sec->size)
b8281767
AM
11768 fprintf (stderr, "Expected offset >= %" PRIx64 ", got %"
11769 PRIx64 "\n", stub_entry->group->stub_sec->size,
ecc741e6
AM
11770 stub_entry->stub_offset);
11771 if (esd->sec_type == sec_stub)
11772 dump_stub ("Previous:", esd->u.last_ent, stub_entry->stub_offset);
11773 dump_stub ("Current:", stub_entry, 0);
46439c90 11774 }
ecc741e6
AM
11775 if (esd->sec_type == sec_normal)
11776 esd->sec_type = sec_stub;
11777 if (esd->sec_type == sec_stub)
11778 esd->u.last_ent = stub_entry;
6f20ed8a 11779 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
721956f4 11780
7aba54da
AM
11781 htab->stub_count[stub_entry->type.main - 1] += 1;
11782 if (stub_entry->type.main == ppc_stub_long_branch
11783 && stub_entry->type.sub == ppc_stub_toc)
5d1634d7 11784 {
721956f4 11785 /* Branches are relative. This is where we are going to. */
1aa42141 11786 targ = (stub_entry->target_value
6911b7dc
AM
11787 + stub_entry->target_section->output_offset
11788 + stub_entry->target_section->output_section->vma);
1aa42141 11789 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
5d1634d7 11790
721956f4 11791 /* And this is where we are coming from. */
1aa42141
AM
11792 off = (stub_entry->stub_offset
11793 + stub_entry->group->stub_sec->output_offset
11794 + stub_entry->group->stub_sec->output_section->vma);
11795 off = targ - off;
e86ce104 11796
9e390558 11797 p = loc;
29433886 11798 obfd = htab->params->stub_bfd;
7aba54da 11799 if (stub_entry->type.r2save)
ad8e1ba5 11800 {
25f53a85 11801 bfd_vma r2off = get_r2off (info, stub_entry);
ad8e1ba5 11802
a7c49797 11803 if (r2off == (bfd_vma) -1)
aa374f67 11804 {
0a1b45a2
AM
11805 htab->stub_error = true;
11806 return false;
aa374f67 11807 }
29433886 11808 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p);
9e390558 11809 p += 4;
ac2df442
AM
11810 if (PPC_HA (r2off) != 0)
11811 {
29433886 11812 bfd_put_32 (obfd, ADDIS_R2_R2 | PPC_HA (r2off), p);
9e390558 11813 p += 4;
a7c49797
AM
11814 }
11815 if (PPC_LO (r2off) != 0)
11816 {
29433886 11817 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (r2off), p);
9e390558 11818 p += 4;
ac2df442 11819 }
9e390558 11820 off -= p - loc;
ad8e1ba5 11821 }
29433886 11822 bfd_put_32 (obfd, B_DOT | (off & 0x3fffffc), p);
9e390558 11823 p += 4;
ad8e1ba5 11824
5c3dead3
AM
11825 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11826 {
cf97bcb0
AM
11827 _bfd_error_handler
11828 (_("long branch stub `%s' offset overflow"),
bc30df16 11829 stub_entry->root.string);
0a1b45a2
AM
11830 htab->stub_error = true;
11831 return false;
5c3dead3 11832 }
ee75fd95
AM
11833
11834 if (info->emitrelocations)
11835 {
6f20ed8a 11836 r = get_relocs (stub_entry->group->stub_sec, 1);
176a0d42 11837 if (r == NULL)
0a1b45a2 11838 return false;
9e390558 11839 r->r_offset = p - 4 - stub_entry->group->stub_sec->contents;
ee75fd95 11840 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
1aa42141 11841 r->r_addend = targ;
3d58e1fc
AM
11842 if (stub_entry->h != NULL
11843 && !use_global_in_relocs (htab, stub_entry, r, 1))
0a1b45a2 11844 return false;
ee75fd95 11845 }
7aba54da
AM
11846 }
11847 else if (stub_entry->type.main == ppc_stub_plt_branch
11848 && stub_entry->type.sub == ppc_stub_toc)
11849 {
721956f4
AM
11850 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11851 stub_entry->root.string + 9,
0a1b45a2 11852 false, false);
721956f4
AM
11853 if (br_entry == NULL)
11854 {
cf97bcb0
AM
11855 _bfd_error_handler (_("can't find branch stub `%s'"),
11856 stub_entry->root.string);
0a1b45a2
AM
11857 htab->stub_error = true;
11858 return false;
721956f4
AM
11859 }
11860
1aa42141 11861 targ = (stub_entry->target_value
176a0d42
AM
11862 + stub_entry->target_section->output_offset
11863 + stub_entry->target_section->output_section->vma);
7aba54da 11864 if (!stub_entry->type.r2save)
1aa42141 11865 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
721956f4 11866
1aa42141 11867 bfd_put_64 (htab->brlt->owner, targ,
4ce794b7 11868 htab->brlt->contents + br_entry->offset);
721956f4 11869
f94498ff 11870 if (br_entry->iter == htab->stub_iteration)
721956f4 11871 {
f94498ff 11872 br_entry->iter = 0;
84f5d08e 11873
1657026c 11874 if (htab->relbrlt != NULL && !info->enable_dt_relr)
84f5d08e 11875 {
f94498ff
AM
11876 /* Create a reloc for the branch lookup table entry. */
11877 Elf_Internal_Rela rela;
f94498ff
AM
11878
11879 rela.r_offset = (br_entry->offset
11880 + htab->brlt->output_offset
11881 + htab->brlt->output_section->vma);
11882 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11883 rela.r_addend = targ;
f94498ff 11884
066c738e
AM
11885 BFD_ASSERT (count_and_swap_reloc_out (htab->relbrlt->owner, &rela,
11886 htab->relbrlt));
f94498ff
AM
11887 }
11888 else if (info->emitrelocations)
11889 {
176a0d42
AM
11890 r = get_relocs (htab->brlt, 1);
11891 if (r == NULL)
0a1b45a2 11892 return false;
176a0d42
AM
11893 /* brlt, being SEC_LINKER_CREATED does not go through the
11894 normal reloc processing. Symbols and offsets are not
11895 translated from input file to output file form, so
11896 set up the offset per the output file. */
f94498ff
AM
11897 r->r_offset = (br_entry->offset
11898 + htab->brlt->output_offset
11899 + htab->brlt->output_section->vma);
11900 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
1aa42141 11901 r->r_addend = targ;
84f5d08e 11902 }
84f5d08e 11903 }
721956f4 11904
1aa42141 11905 targ = (br_entry->offset
176a0d42
AM
11906 + htab->brlt->output_offset
11907 + htab->brlt->output_section->vma);
11908
1aa42141
AM
11909 off = (elf_gp (info->output_bfd)
11910 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11911 off = targ - off;
721956f4 11912
ad8e1ba5 11913 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7 11914 {
25f53a85 11915 info->callbacks->einfo
c1c8c1ef 11916 (_("%P: linkage table error against `%pT'\n"),
721956f4 11917 stub_entry->root.string);
5d1634d7 11918 bfd_set_error (bfd_error_bad_value);
0a1b45a2
AM
11919 htab->stub_error = true;
11920 return false;
5d1634d7 11921 }
41bd81ab 11922
176a0d42
AM
11923 if (info->emitrelocations)
11924 {
6f20ed8a 11925 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
176a0d42 11926 if (r == NULL)
0a1b45a2 11927 return false;
6f20ed8a 11928 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
11929 if (bfd_big_endian (info->output_bfd))
11930 r[0].r_offset += 2;
7aba54da 11931 if (stub_entry->type.r2save)
176a0d42
AM
11932 r[0].r_offset += 4;
11933 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
1aa42141 11934 r[0].r_addend = targ;
176a0d42
AM
11935 if (PPC_HA (off) != 0)
11936 {
11937 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11938 r[1].r_offset = r[0].r_offset + 4;
11939 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11940 r[1].r_addend = r[0].r_addend;
11941 }
11942 }
11943
9e390558 11944 p = loc;
29433886 11945 obfd = htab->params->stub_bfd;
7aba54da 11946 if (!stub_entry->type.r2save)
ad8e1ba5 11947 {
176a0d42 11948 if (PPC_HA (off) != 0)
ac2df442 11949 {
29433886 11950 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (off), p);
9e390558 11951 p += 4;
29433886 11952 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11953 }
11954 else
29433886 11955 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (off), p);
ad8e1ba5
AM
11956 }
11957 else
11958 {
25f53a85 11959 bfd_vma r2off = get_r2off (info, stub_entry);
aa374f67 11960
a7c49797 11961 if (r2off == (bfd_vma) -1)
aa374f67 11962 {
0a1b45a2
AM
11963 htab->stub_error = true;
11964 return false;
aa374f67 11965 }
ad8e1ba5 11966
29433886 11967 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p);
9e390558 11968 p += 4;
176a0d42 11969 if (PPC_HA (off) != 0)
ac2df442 11970 {
29433886 11971 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (off), p);
9e390558 11972 p += 4;
29433886 11973 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (off), p);
ac2df442
AM
11974 }
11975 else
29433886 11976 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (off), p);
ac2df442
AM
11977
11978 if (PPC_HA (r2off) != 0)
11979 {
9e390558 11980 p += 4;
29433886 11981 bfd_put_32 (obfd, ADDIS_R2_R2 | PPC_HA (r2off), p);
00f412ee
AM
11982 }
11983 if (PPC_LO (r2off) != 0)
11984 {
9e390558 11985 p += 4;
29433886 11986 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (r2off), p);
ac2df442 11987 }
ad8e1ba5 11988 }
9e390558 11989 p += 4;
29433886 11990 bfd_put_32 (obfd, MTCTR_R12, p);
9e390558 11991 p += 4;
29433886 11992 bfd_put_32 (obfd, BCTR, p);
407aa07c 11993 p += 4;
7aba54da
AM
11994 }
11995 else if (stub_entry->type.sub >= ppc_stub_notoc)
11996 {
11997 bool is_plt = stub_entry->type.main == ppc_stub_plt_call;
05d0e962 11998 p = loc;
f891966f 11999 off = (stub_entry->stub_offset
05d0e962
AM
12000 + stub_entry->group->stub_sec->output_offset
12001 + stub_entry->group->stub_sec->output_section->vma);
29433886 12002 obfd = htab->params->stub_bfd;
7aba54da 12003 is_tga = (is_plt
12cf8b93 12004 && stub_entry->h != NULL
29433886
AM
12005 && is_tls_get_addr (&stub_entry->h->elf, htab)
12006 && htab->params->tls_get_addr_opt);
12007 if (is_tga)
12008 {
12009 p = build_tls_get_addr_head (htab, stub_entry, p);
12010 off += p - loc;
12011 }
7aba54da 12012 if (stub_entry->type.r2save)
05d0e962
AM
12013 {
12014 off += 4;
29433886 12015 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p);
05d0e962
AM
12016 p += 4;
12017 }
7aba54da 12018 if (is_plt)
05d0e962
AM
12019 {
12020 targ = stub_entry->plt_ent->plt.offset & ~1;
12021 if (targ >= (bfd_vma) -2)
12022 abort ();
12023
12024 plt = htab->elf.splt;
30845f11 12025 if (use_local_plt (info, elf_hash_entry (stub_entry->h)))
05d0e962
AM
12026 {
12027 if (stub_entry->symtype == STT_GNU_IFUNC)
12028 plt = htab->elf.iplt;
12029 else
12030 plt = htab->pltlocal;
12031 }
12032 targ += plt->output_offset + plt->output_section->vma;
12033 }
12034 else
12035 targ = (stub_entry->target_value
12036 + stub_entry->target_section->output_offset
12037 + stub_entry->target_section->output_section->vma);
04bdff6a 12038 odd = off & 4;
05d0e962 12039 off = targ - off;
f891966f 12040
3d58e1fc
AM
12041 relp = p;
12042 num_rel = 0;
7aba54da
AM
12043 if (stub_entry->type.sub == ppc_stub_notoc)
12044 p = build_power10_offset (obfd, p, off, odd, is_plt);
04bdff6a
AM
12045 else
12046 {
29433886
AM
12047 if (htab->glink_eh_frame != NULL
12048 && htab->glink_eh_frame->size != 0)
12049 {
12050 bfd_byte *base, *eh;
12051 unsigned int lr_used, delta;
12052
12053 base = (htab->glink_eh_frame->contents
12054 + stub_entry->group->eh_base + 17);
12055 eh = base + stub_entry->group->eh_size;
12056 lr_used = stub_entry->stub_offset + (p - loc) + 8;
12057 delta = lr_used - stub_entry->group->lr_restore;
12058 stub_entry->group->lr_restore = lr_used + 8;
12059 eh = eh_advance (htab->elf.dynobj, eh, delta);
12060 *eh++ = DW_CFA_register;
12061 *eh++ = 65;
12062 *eh++ = 12;
12063 *eh++ = DW_CFA_advance_loc + 2;
12064 *eh++ = DW_CFA_restore_extended;
12065 *eh++ = 65;
12066 stub_entry->group->eh_size = eh - base;
12067 }
12068
04bdff6a
AM
12069 /* The notoc stubs calculate their target (either a PLT entry or
12070 the global entry point of a function) relative to the PC
12071 returned by the "bcl" two instructions past the start of the
12072 sequence emitted by build_offset. The offset is therefore 8
12073 less than calculated from the start of the sequence. */
12074 off -= 8;
7aba54da 12075 p = build_offset (obfd, p, off, is_plt);
04bdff6a
AM
12076 }
12077
7aba54da 12078 if (stub_entry->type.main == ppc_stub_long_branch)
05d0e962 12079 {
f891966f 12080 bfd_vma from;
3d58e1fc 12081 num_rel = 1;
f891966f
AM
12082 from = (stub_entry->stub_offset
12083 + stub_entry->group->stub_sec->output_offset
12084 + stub_entry->group->stub_sec->output_section->vma
12085 + (p - loc));
29433886 12086 bfd_put_32 (obfd, B_DOT | ((targ - from) & 0x3fffffc), p);
05d0e962
AM
12087 }
12088 else
12089 {
29433886 12090 bfd_put_32 (obfd, MTCTR_R12, p);
05d0e962 12091 p += 4;
29433886 12092 bfd_put_32 (obfd, BCTR, p);
05d0e962
AM
12093 }
12094 p += 4;
df136d64 12095
29433886
AM
12096 if (is_tga)
12097 p = build_tls_get_addr_tail (htab, stub_entry, p, loc);
12098
3d58e1fc
AM
12099 if (info->emitrelocations)
12100 {
04bdff6a 12101 bfd_vma roff = relp - stub_entry->group->stub_sec->contents;
7aba54da 12102 if (stub_entry->type.sub == ppc_stub_notoc)
7c1f4227 12103 num_rel += num_relocs_for_power10_offset (off, odd);
04bdff6a
AM
12104 else
12105 {
12106 num_rel += num_relocs_for_offset (off);
12107 roff += 16;
12108 }
3d58e1fc
AM
12109 r = get_relocs (stub_entry->group->stub_sec, num_rel);
12110 if (r == NULL)
0a1b45a2 12111 return false;
7aba54da 12112 if (stub_entry->type.sub == ppc_stub_notoc)
7c1f4227 12113 r = emit_relocs_for_power10_offset (info, r, roff, targ, off, odd);
04bdff6a
AM
12114 else
12115 r = emit_relocs_for_offset (info, r, roff, targ, off);
7aba54da 12116 if (stub_entry->type.main == ppc_stub_long_branch)
3d58e1fc
AM
12117 {
12118 ++r;
12119 roff = p - 4 - stub_entry->group->stub_sec->contents;
12120 r->r_offset = roff;
12121 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
12122 r->r_addend = targ;
12123 if (stub_entry->h != NULL
12124 && !use_global_in_relocs (htab, stub_entry, r, num_rel))
0a1b45a2 12125 return false;
3d58e1fc
AM
12126 }
12127 }
7aba54da
AM
12128 }
12129 else if (stub_entry->type.main == ppc_stub_plt_call)
12130 {
e054468f 12131 if (stub_entry->h != NULL
b31867b6
AM
12132 && stub_entry->h->is_func_descriptor
12133 && stub_entry->h->oh != NULL)
c862ae31 12134 {
b31867b6
AM
12135 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
12136
12137 /* If the old-ABI "dot-symbol" is undefined make it weak so
6f20ed8a 12138 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
8c5b4e52
AM
12139 if (fh->elf.root.type == bfd_link_hash_undefined
12140 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
12141 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
b31867b6 12142 fh->elf.root.type = bfd_link_hash_undefweak;
c862ae31
AM
12143 }
12144
721956f4 12145 /* Now build the stub. */
1aa42141
AM
12146 targ = stub_entry->plt_ent->plt.offset & ~1;
12147 if (targ >= (bfd_vma) -2)
721956f4
AM
12148 abort ();
12149
33e44f2e 12150 plt = htab->elf.splt;
30845f11 12151 if (use_local_plt (info, elf_hash_entry (stub_entry->h)))
2d7ad24e
AM
12152 {
12153 if (stub_entry->symtype == STT_GNU_IFUNC)
12154 plt = htab->elf.iplt;
12155 else
12156 plt = htab->pltlocal;
12157 }
1aa42141 12158 targ += plt->output_offset + plt->output_section->vma;
e054468f 12159
1aa42141
AM
12160 off = (elf_gp (info->output_bfd)
12161 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
12162 off = targ - off;
721956f4 12163
ad8e1ba5 12164 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4 12165 {
25f53a85 12166 info->callbacks->einfo
695344c0 12167 /* xgettext:c-format */
c1c8c1ef 12168 (_("%P: linkage table error against `%pT'\n"),
e054468f
AM
12169 stub_entry->h != NULL
12170 ? stub_entry->h->elf.root.root.string
12171 : "<local sym>");
721956f4 12172 bfd_set_error (bfd_error_bad_value);
0a1b45a2
AM
12173 htab->stub_error = true;
12174 return false;
721956f4
AM
12175 }
12176
176a0d42
AM
12177 r = NULL;
12178 if (info->emitrelocations)
12179 {
6f20ed8a 12180 r = get_relocs (stub_entry->group->stub_sec,
3ba720c7
AM
12181 ((PPC_HA (off) != 0)
12182 + (htab->opd_abi
e7d1c40c 12183 ? 2 + (htab->params->plt_static_chain
3ba720c7
AM
12184 && PPC_HA (off + 16) == PPC_HA (off))
12185 : 1)));
176a0d42 12186 if (r == NULL)
0a1b45a2 12187 return false;
6f20ed8a 12188 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
7cfbafbc
AM
12189 if (bfd_big_endian (info->output_bfd))
12190 r[0].r_offset += 2;
1aa42141 12191 r[0].r_addend = targ;
176a0d42 12192 }
29433886
AM
12193 p = loc;
12194 obfd = htab->params->stub_bfd;
12195 is_tga = (stub_entry->h != NULL
12196 && is_tls_get_addr (&stub_entry->h->elf, htab)
12197 && htab->params->tls_get_addr_opt);
12198 if (is_tga)
12199 {
12200 p = build_tls_get_addr_head (htab, stub_entry, p);
12201 if (r != NULL)
12202 r[0].r_offset += p - loc;
12203 }
12204 p = build_plt_stub (htab, stub_entry, p, off, r);
12205 if (is_tga)
12206 p = build_tls_get_addr_tail (htab, stub_entry, p, loc);
7aba54da
AM
12207 }
12208 else if (stub_entry->type.main == ppc_stub_save_res)
12209 return true;
12210 else
12211 {
721956f4 12212 BFD_FAIL ();
0a1b45a2 12213 return false;
721956f4
AM
12214 }
12215
1aa42141 12216 stub_entry->group->stub_sec->size = stub_entry->stub_offset + (p - loc);
97b639ba 12217
e7d1c40c 12218 if (htab->params->emit_stub_syms)
97b639ba
AM
12219 {
12220 struct elf_link_hash_entry *h;
ee75fd95
AM
12221 size_t len1, len2;
12222 char *name;
12223 const char *const stub_str[] = { "long_branch",
05d0e962 12224 "plt_branch",
ee75fd95
AM
12225 "plt_call" };
12226
7aba54da 12227 len1 = strlen (stub_str[stub_entry->type.main - 1]);
ee75fd95
AM
12228 len2 = strlen (stub_entry->root.string);
12229 name = bfd_malloc (len1 + len2 + 2);
12230 if (name == NULL)
0a1b45a2 12231 return false;
ee75fd95 12232 memcpy (name, stub_entry->root.string, 9);
7aba54da 12233 memcpy (name + 9, stub_str[stub_entry->type.main - 1], len1);
ee75fd95 12234 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
0a1b45a2 12235 h = elf_link_hash_lookup (&htab->elf, name, true, false, false);
97b639ba 12236 if (h == NULL)
0a1b45a2 12237 return false;
97b639ba
AM
12238 if (h->root.type == bfd_link_hash_new)
12239 {
12240 h->root.type = bfd_link_hash_defined;
6f20ed8a 12241 h->root.u.def.section = stub_entry->group->stub_sec;
97b639ba 12242 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
12243 h->ref_regular = 1;
12244 h->def_regular = 1;
12245 h->ref_regular_nonweak = 1;
12246 h->forced_local = 1;
12247 h->non_elf = 0;
2ec55de3 12248 h->root.linker_def = 1;
97b639ba
AM
12249 }
12250 }
12251
0a1b45a2 12252 return true;
721956f4
AM
12253}
12254
12255/* As above, but don't actually build the stub. Just bump offset so
12256 we know stub section sizes, and select plt_branch stubs where
12257 long_branch stubs won't do. */
12258
0a1b45a2 12259static bool
4ce794b7 12260ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
12261{
12262 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 12263 struct bfd_link_info *info;
721956f4 12264 struct ppc_link_hash_table *htab;
f891966f
AM
12265 asection *plt;
12266 bfd_vma targ, off, r2off;
0f0d9373 12267 unsigned int size, pad, extra, lr_used, delta, odd;
0441f94f 12268 bfd_vma stub_offset;
721956f4
AM
12269
12270 /* Massage our args to the form they really have. */
12271 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
12272 info = in_arg;
12273
12274 htab = ppc_hash_table (info);
4dfe6ac6 12275 if (htab == NULL)
0a1b45a2 12276 return false;
721956f4 12277
abf874aa
CL
12278 /* Fail if the target section could not be assigned to an output
12279 section. The user should fix his linker script. */
12280 if (stub_entry->target_section != NULL
12281 && stub_entry->target_section->output_section == NULL
12282 && info->non_contiguous_regions)
c63d4862 12283 info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
53215f21
CL
12284 "Retry without --enable-non-contiguous-regions.\n"),
12285 stub_entry->target_section);
abf874aa
CL
12286
12287 /* Same for the group. */
12288 if (stub_entry->group->stub_sec != NULL
12289 && stub_entry->group->stub_sec->output_section == NULL
12290 && info->non_contiguous_regions)
c63d4862
AM
12291 info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
12292 "Retry without --enable-non-contiguous-regions.\n"),
12293 stub_entry->group->stub_sec);
abf874aa 12294
1aa42141 12295 /* Make a note of the offset within the stubs for this entry. */
0441f94f 12296 stub_offset = stub_entry->group->stub_sec->size;
2405fc40
AM
12297 if (htab->stub_iteration > STUB_SHRINK_ITER
12298 && stub_entry->stub_offset > stub_offset)
12299 stub_offset = stub_entry->stub_offset;
ecc741e6 12300 stub_entry->id = ++htab->stub_id;
1aa42141 12301
a4b6fadd
AM
12302 if (stub_entry->h != NULL
12303 && stub_entry->h->save_res
12304 && stub_entry->h->elf.root.type == bfd_link_hash_defined
12305 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
12306 {
12307 /* Don't make stubs to out-of-line register save/restore
12308 functions. Instead, emit copies of the functions. */
12309 stub_entry->group->needs_save_res = 1;
7aba54da
AM
12310 stub_entry->type.main = ppc_stub_save_res;
12311 stub_entry->type.sub = ppc_stub_toc;
12312 stub_entry->type.r2save = 0;
0a1b45a2 12313 return true;
a4b6fadd
AM
12314 }
12315
7aba54da 12316 if (stub_entry->type.main == ppc_stub_plt_branch)
721956f4 12317 {
f891966f
AM
12318 /* Reset the stub type from the plt branch variant in case we now
12319 can reach with a shorter stub. */
04cb922a 12320 stub_entry->type.main = ppc_stub_long_branch;
7aba54da
AM
12321 }
12322
12323 if (stub_entry->type.main == ppc_stub_long_branch
12324 && stub_entry->type.sub == ppc_stub_toc)
12325 {
1aa42141
AM
12326 targ = (stub_entry->target_value
12327 + stub_entry->target_section->output_offset
12328 + stub_entry->target_section->output_section->vma);
f891966f 12329 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
0441f94f 12330 off = (stub_offset
1aa42141
AM
12331 + stub_entry->group->stub_sec->output_offset
12332 + stub_entry->group->stub_sec->output_section->vma);
721956f4 12333
ad8e1ba5 12334 size = 4;
f891966f 12335 r2off = 0;
7aba54da 12336 if (stub_entry->type.r2save)
ad8e1ba5 12337 {
25f53a85 12338 r2off = get_r2off (info, stub_entry);
a7c49797 12339 if (r2off == (bfd_vma) -1)
aa374f67 12340 {
0a1b45a2
AM
12341 htab->stub_error = true;
12342 return false;
aa374f67 12343 }
a7c49797 12344 size = 8;
ac2df442 12345 if (PPC_HA (r2off) != 0)
a7c49797
AM
12346 size += 4;
12347 if (PPC_LO (r2off) != 0)
12348 size += 4;
1aa42141 12349 off += size - 4;
ad8e1ba5 12350 }
1aa42141 12351 off = targ - off;
ad8e1ba5 12352
f891966f
AM
12353 /* If the branch offset is too big, use a ppc_stub_plt_branch.
12354 Do the same for -R objects without function descriptors. */
7aba54da 12355 if ((stub_entry->type.r2save
f891966f
AM
12356 && r2off == 0
12357 && htab->sec_info[stub_entry->target_section->id].toc_off == 0)
12358 || off + (1 << 25) >= (bfd_vma) (1 << 26))
721956f4 12359 {
f891966f 12360 struct ppc_branch_hash_entry *br_entry;
df136d64 12361
f891966f
AM
12362 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
12363 stub_entry->root.string + 9,
0a1b45a2 12364 true, false);
f891966f 12365 if (br_entry == NULL)
721956f4 12366 {
f891966f
AM
12367 _bfd_error_handler (_("can't build branch stub `%s'"),
12368 stub_entry->root.string);
0a1b45a2
AM
12369 htab->stub_error = true;
12370 return false;
721956f4
AM
12371 }
12372
f891966f 12373 if (br_entry->iter != htab->stub_iteration)
721956f4 12374 {
f891966f
AM
12375 br_entry->iter = htab->stub_iteration;
12376 br_entry->offset = htab->brlt->size;
12377 htab->brlt->size += 8;
63bc6f6c 12378
1657026c 12379 if (htab->relbrlt != NULL && !info->enable_dt_relr)
f891966f
AM
12380 htab->relbrlt->size += sizeof (Elf64_External_Rela);
12381 else if (info->emitrelocations)
84f5d08e 12382 {
f891966f
AM
12383 htab->brlt->reloc_count += 1;
12384 htab->brlt->flags |= SEC_RELOC;
05d0e962 12385 }
f891966f 12386 }
ac2df442 12387
f891966f
AM
12388 targ = (br_entry->offset
12389 + htab->brlt->output_offset
12390 + htab->brlt->output_section->vma);
12391 off = (elf_gp (info->output_bfd)
12392 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
12393 off = targ - off;
176a0d42 12394
f891966f
AM
12395 if (info->emitrelocations)
12396 {
12397 stub_entry->group->stub_sec->reloc_count
12398 += 1 + (PPC_HA (off) != 0);
12399 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12400 }
05d0e962 12401
04cb922a 12402 stub_entry->type.main = ppc_stub_plt_branch;
7aba54da 12403 if (!stub_entry->type.r2save)
f891966f
AM
12404 {
12405 size = 12;
12406 if (PPC_HA (off) != 0)
12407 size = 16;
ac2df442 12408 }
f891966f 12409 else
ac2df442 12410 {
f891966f
AM
12411 size = 16;
12412 if (PPC_HA (off) != 0)
12413 size += 4;
12414
12415 if (PPC_HA (r2off) != 0)
12416 size += 4;
12417 if (PPC_LO (r2off) != 0)
12418 size += 4;
ac2df442 12419 }
f40bb390
AM
12420 pad = plt_stub_pad (htab->params->plt_stub_align, stub_offset, size);
12421 stub_offset += pad;
721956f4 12422 }
f891966f
AM
12423 else if (info->emitrelocations)
12424 {
12425 stub_entry->group->stub_sec->reloc_count += 1;
12426 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12427 }
7aba54da
AM
12428 }
12429 else if (stub_entry->type.main == ppc_stub_long_branch)
12430 {
0441f94f 12431 off = (stub_offset
f891966f
AM
12432 + stub_entry->group->stub_sec->output_offset
12433 + stub_entry->group->stub_sec->output_section->vma);
12434 size = 0;
7aba54da 12435 if (stub_entry->type.r2save)
f891966f
AM
12436 size = 4;
12437 off += size;
12438 targ = (stub_entry->target_value
12439 + stub_entry->target_section->output_offset
12440 + stub_entry->target_section->output_section->vma);
04bdff6a 12441 odd = off & 4;
f891966f
AM
12442 off = targ - off;
12443
f40bb390
AM
12444 if (stub_entry->type.sub == ppc_stub_notoc)
12445 extra = size_power10_offset (off, odd);
12446 else
12447 extra = size_offset (off - 8);
12448 /* Include branch insn plus those in the offset sequence. */
12449 size += 4 + extra;
12450
12451 /* If the branch can't reach, use a plt_branch.
12452 The branch insn is at the end, or "extra" bytes along. So
12453 its offset will be "extra" bytes less that that already
12454 calculated. */
12455 if (off - extra + (1 << 25) >= (bfd_vma) (1 << 26))
12456 {
12457 stub_entry->type.main = ppc_stub_plt_branch;
12458 size += 4;
12459 pad = plt_stub_pad (htab->params->plt_stub_align, stub_offset, size);
12460 if (pad != 0)
12461 {
12462 stub_offset += pad;
12463 off -= pad;
12464 odd ^= pad & 4;
12465 size -= extra;
12466 if (stub_entry->type.sub == ppc_stub_notoc)
12467 extra = size_power10_offset (off, odd);
12468 else
12469 extra = size_offset (off - 8);
12470 size += extra;
12471 }
12472 }
12473 else if (info->emitrelocations)
12474 stub_entry->group->stub_sec->reloc_count +=1;
12475
3d58e1fc
AM
12476 if (info->emitrelocations)
12477 {
04bdff6a 12478 unsigned int num_rel;
7aba54da 12479 if (stub_entry->type.sub == ppc_stub_notoc)
7c1f4227 12480 num_rel = num_relocs_for_power10_offset (off, odd);
04bdff6a
AM
12481 else
12482 num_rel = num_relocs_for_offset (off - 8);
12483 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
12484 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12485 }
12486
7aba54da 12487 if (stub_entry->type.sub != ppc_stub_notoc)
04bdff6a
AM
12488 {
12489 /* After the bcl, lr has been modified so we need to emit
12490 .eh_frame info saying the return address is in r12. */
0441f94f 12491 lr_used = stub_offset + 8;
7aba54da 12492 if (stub_entry->type.r2save)
04bdff6a
AM
12493 lr_used += 4;
12494 /* The eh_frame info will consist of a DW_CFA_advance_loc or
12495 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
12496 DW_CFA_restore_extended 65. */
12497 delta = lr_used - stub_entry->group->lr_restore;
12498 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
12499 stub_entry->group->lr_restore = lr_used + 8;
12500 }
7aba54da
AM
12501 }
12502 else if (stub_entry->type.sub >= ppc_stub_notoc)
12503 {
12504 BFD_ASSERT (stub_entry->type.main == ppc_stub_plt_call);
29433886 12505 lr_used = 0;
12cf8b93
AM
12506 if (stub_entry->h != NULL
12507 && is_tls_get_addr (&stub_entry->h->elf, htab)
29433886
AM
12508 && htab->params->tls_get_addr_opt)
12509 {
12510 lr_used += 7 * 4;
12511 if (!htab->params->no_tls_get_addr_regsave)
12512 lr_used += 11 * 4;
7aba54da 12513 else if (stub_entry->type.r2save)
29433886
AM
12514 lr_used += 2 * 4;
12515 }
7aba54da 12516 if (stub_entry->type.r2save)
29433886 12517 lr_used += 4;
f891966f
AM
12518 targ = stub_entry->plt_ent->plt.offset & ~1;
12519 if (targ >= (bfd_vma) -2)
12520 abort ();
12521
12522 plt = htab->elf.splt;
30845f11 12523 if (use_local_plt (info, elf_hash_entry (stub_entry->h)))
f891966f
AM
12524 {
12525 if (stub_entry->symtype == STT_GNU_IFUNC)
12526 plt = htab->elf.iplt;
12527 else
12528 plt = htab->pltlocal;
12529 }
12530 targ += plt->output_offset + plt->output_section->vma;
0441f94f 12531 off = (stub_offset
29433886
AM
12532 + stub_entry->group->stub_sec->output_offset
12533 + stub_entry->group->stub_sec->output_section->vma
12534 + lr_used);
04bdff6a 12535 odd = off & 4;
f891966f
AM
12536 off = targ - off;
12537
0f0d9373
AM
12538 size = plt_stub_size (htab, stub_entry, off, odd);
12539 pad = plt_stub_pad (htab->params->plt_stub_align, stub_offset, size);
12540 if (pad != 0)
f891966f 12541 {
2405fc40 12542 stub_offset += pad;
f891966f 12543 off -= pad;
29433886 12544 odd ^= pad & 4;
0f0d9373 12545 size = plt_stub_size (htab, stub_entry, off, odd);
f891966f
AM
12546 }
12547
3d58e1fc
AM
12548 if (info->emitrelocations)
12549 {
04bdff6a 12550 unsigned int num_rel;
7aba54da 12551 if (stub_entry->type.sub == ppc_stub_notoc)
7c1f4227 12552 num_rel = num_relocs_for_power10_offset (off, odd);
04bdff6a
AM
12553 else
12554 num_rel = num_relocs_for_offset (off - 8);
12555 stub_entry->group->stub_sec->reloc_count += num_rel;
3d58e1fc
AM
12556 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12557 }
12558
7aba54da 12559 if (stub_entry->type.sub != ppc_stub_notoc)
04bdff6a
AM
12560 {
12561 /* After the bcl, lr has been modified so we need to emit
12562 .eh_frame info saying the return address is in r12. */
0441f94f 12563 lr_used += stub_offset + 8;
04bdff6a
AM
12564 /* The eh_frame info will consist of a DW_CFA_advance_loc or
12565 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2,
12566 DW_CFA_restore_extended 65. */
12567 delta = lr_used - stub_entry->group->lr_restore;
12568 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
12569 stub_entry->group->lr_restore = lr_used + 8;
12570 }
7aba54da 12571 if (stub_entry->h != NULL
29433886
AM
12572 && is_tls_get_addr (&stub_entry->h->elf, htab)
12573 && htab->params->tls_get_addr_opt)
12574 {
12575 if (!htab->params->no_tls_get_addr_regsave)
12576 {
0441f94f 12577 unsigned int cfa_updt = stub_offset + 18 * 4;
29433886
AM
12578 delta = cfa_updt - stub_entry->group->lr_restore;
12579 stub_entry->group->eh_size += eh_advance_size (delta);
12580 stub_entry->group->eh_size += htab->opd_abi ? 36 : 35;
0441f94f 12581 stub_entry->group->lr_restore = stub_offset + size - 4;
29433886 12582 }
7aba54da 12583 else if (stub_entry->type.r2save)
29433886 12584 {
0441f94f 12585 lr_used = stub_offset + size - 20;
29433886
AM
12586 delta = lr_used - stub_entry->group->lr_restore;
12587 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
0441f94f 12588 stub_entry->group->lr_restore = stub_offset + size - 4;
29433886
AM
12589 }
12590 }
7aba54da
AM
12591 }
12592 else if (stub_entry->type.main == ppc_stub_plt_call)
12593 {
f891966f
AM
12594 targ = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
12595 if (targ >= (bfd_vma) -2)
12596 abort ();
12597 plt = htab->elf.splt;
30845f11 12598 if (use_local_plt (info, elf_hash_entry (stub_entry->h)))
f891966f
AM
12599 {
12600 if (stub_entry->symtype == STT_GNU_IFUNC)
12601 plt = htab->elf.iplt;
12602 else
12603 plt = htab->pltlocal;
12604 }
12605 targ += plt->output_offset + plt->output_section->vma;
12606
12607 off = (elf_gp (info->output_bfd)
12608 + htab->sec_info[stub_entry->group->link_sec->id].toc_off);
12609 off = targ - off;
12610
0f0d9373
AM
12611 size = plt_stub_size (htab, stub_entry, off, 0);
12612 pad = plt_stub_pad (htab->params->plt_stub_align, stub_offset, size);
12613 stub_offset += pad;
f891966f
AM
12614
12615 if (info->emitrelocations)
12616 {
12617 stub_entry->group->stub_sec->reloc_count
12618 += ((PPC_HA (off) != 0)
12619 + (htab->opd_abi
12620 ? 2 + (htab->params->plt_static_chain
12621 && PPC_HA (off + 16) == PPC_HA (off))
12622 : 1));
12623 stub_entry->group->stub_sec->flags |= SEC_RELOC;
12624 }
12625
f891966f 12626 if (stub_entry->h != NULL
ed7007c1 12627 && is_tls_get_addr (&stub_entry->h->elf, htab)
f891966f 12628 && htab->params->tls_get_addr_opt
7aba54da 12629 && stub_entry->type.r2save)
f891966f 12630 {
29433886
AM
12631 if (!htab->params->no_tls_get_addr_regsave)
12632 {
12633 /* Adjustments to r1 need to be described. */
0441f94f 12634 unsigned int cfa_updt = stub_offset + 18 * 4;
29433886
AM
12635 delta = cfa_updt - stub_entry->group->lr_restore;
12636 stub_entry->group->eh_size += eh_advance_size (delta);
12637 stub_entry->group->eh_size += htab->opd_abi ? 36 : 35;
12638 }
12639 else
9e7028aa 12640 {
0441f94f 12641 lr_used = stub_offset + size - 20;
9e7028aa
AM
12642 /* The eh_frame info will consist of a DW_CFA_advance_loc
12643 or variant, DW_CFA_offset_externed_sf, 65, -stackoff,
12644 DW_CFA_advance_loc+4, DW_CFA_restore_extended, 65. */
12645 delta = lr_used - stub_entry->group->lr_restore;
12646 stub_entry->group->eh_size += eh_advance_size (delta) + 6;
12647 }
0441f94f 12648 stub_entry->group->lr_restore = stub_offset + size - 4;
f891966f 12649 }
7aba54da
AM
12650 }
12651 else
12652 {
f891966f 12653 BFD_FAIL ();
0a1b45a2 12654 return false;
721956f4
AM
12655 }
12656
0441f94f
AM
12657 if (stub_entry->stub_offset != stub_offset)
12658 htab->stub_changed = true;
2405fc40
AM
12659 stub_entry->stub_offset = stub_offset;
12660 stub_entry->group->stub_sec->size = stub_offset + size;
0a1b45a2 12661 return true;
721956f4
AM
12662}
12663
12664/* Set up various things so that we can make a list of input sections
12665 for each output section included in the link. Returns -1 on error,
cedb70c5 12666 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
12667
12668int
e7d1c40c 12669ppc64_elf_setup_section_lists (struct bfd_link_info *info)
721956f4 12670{
6f20ed8a 12671 unsigned int id;
986f0783 12672 size_t amt;
721956f4
AM
12673 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12674
4dfe6ac6
NC
12675 if (htab == NULL)
12676 return -1;
4c52953f 12677
7cf7fcc8 12678 htab->sec_info_arr_size = _bfd_section_id;
6f20ed8a
AM
12679 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
12680 htab->sec_info = bfd_zmalloc (amt);
12681 if (htab->sec_info == NULL)
721956f4
AM
12682 return -1;
12683
3d6f9012
AM
12684 /* Set toc_off for com, und, abs and ind sections. */
12685 for (id = 0; id < 3; id++)
6f20ed8a 12686 htab->sec_info[id].toc_off = TOC_BASE_OFF;
734b6cf9 12687
721956f4
AM
12688 return 1;
12689}
12690
927be08e
AM
12691/* Set up for first pass at multitoc partitioning. */
12692
12693void
12694ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
12695{
12696 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12697
1c865ab2 12698 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
927be08e
AM
12699 htab->toc_bfd = NULL;
12700 htab->toc_first_sec = NULL;
12701}
12702
e717da7e
AM
12703/* The linker repeatedly calls this function for each TOC input section
12704 and linker generated GOT section. Group input bfds such that the toc
927be08e 12705 within a group is less than 64k in size. */
ad8e1ba5 12706
0a1b45a2 12707bool
4ce794b7 12708ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
12709{
12710 struct ppc_link_hash_table *htab = ppc_hash_table (info);
d77c8a4b 12711 bfd_vma addr, off, limit;
ad8e1ba5 12712
4dfe6ac6 12713 if (htab == NULL)
0a1b45a2 12714 return false;
4dfe6ac6 12715
927be08e 12716 if (!htab->second_toc_pass)
4c52953f 12717 {
927be08e 12718 /* Keep track of the first .toc or .got section for this input bfd. */
0a1b45a2 12719 bool new_bfd = htab->toc_bfd != isec->owner;
a4fd3de5
AM
12720
12721 if (new_bfd)
bf102f86
AM
12722 {
12723 htab->toc_bfd = isec->owner;
12724 htab->toc_first_sec = isec;
12725 }
927be08e 12726
bf102f86
AM
12727 addr = isec->output_offset + isec->output_section->vma;
12728 off = addr - htab->toc_curr;
d77c8a4b
AM
12729 limit = 0x80008000;
12730 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
12731 limit = 0x10000;
12732 if (off + isec->size > limit)
bf102f86
AM
12733 {
12734 addr = (htab->toc_first_sec->output_offset
12735 + htab->toc_first_sec->output_section->vma);
12736 htab->toc_curr = addr;
a27e685f 12737 htab->toc_curr &= -TOC_BASE_ALIGN;
bf102f86 12738 }
99877b66 12739
927be08e
AM
12740 /* toc_curr is the base address of this toc group. Set elf_gp
12741 for the input section to be the offset relative to the
12742 output toc base plus 0x8000. Making the input elf_gp an
12743 offset allows us to move the toc as a whole without
12744 recalculating input elf_gp. */
06bcf541 12745 off = htab->toc_curr - elf_gp (info->output_bfd);
927be08e
AM
12746 off += TOC_BASE_OFF;
12747
12748 /* Die if someone uses a linker script that doesn't keep input
12749 file .toc and .got together. */
a4fd3de5
AM
12750 if (new_bfd
12751 && elf_gp (isec->owner) != 0
927be08e 12752 && elf_gp (isec->owner) != off)
0a1b45a2 12753 return false;
927be08e
AM
12754
12755 elf_gp (isec->owner) = off;
0a1b45a2 12756 return true;
4c52953f 12757 }
927be08e
AM
12758
12759 /* During the second pass toc_first_sec points to the start of
12760 a toc group, and toc_curr is used to track the old elf_gp.
12761 We use toc_bfd to ensure we only look at each bfd once. */
12762 if (htab->toc_bfd == isec->owner)
0a1b45a2 12763 return true;
927be08e
AM
12764 htab->toc_bfd = isec->owner;
12765
12766 if (htab->toc_first_sec == NULL
12767 || htab->toc_curr != elf_gp (isec->owner))
12768 {
12769 htab->toc_curr = elf_gp (isec->owner);
12770 htab->toc_first_sec = isec;
12771 }
12772 addr = (htab->toc_first_sec->output_offset
12773 + htab->toc_first_sec->output_section->vma);
06bcf541 12774 off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF;
927be08e
AM
12775 elf_gp (isec->owner) = off;
12776
0a1b45a2 12777 return true;
ad8e1ba5
AM
12778}
12779
927be08e
AM
12780/* Called via elf_link_hash_traverse to merge GOT entries for global
12781 symbol H. */
12782
0a1b45a2 12783static bool
927be08e
AM
12784merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12785{
12786 if (h->root.type == bfd_link_hash_indirect)
0a1b45a2 12787 return true;
927be08e 12788
927be08e
AM
12789 merge_got_entries (&h->got.glist);
12790
0a1b45a2 12791 return true;
927be08e
AM
12792}
12793
12794/* Called via elf_link_hash_traverse to allocate GOT entries for global
12795 symbol H. */
12796
0a1b45a2 12797static bool
927be08e
AM
12798reallocate_got (struct elf_link_hash_entry *h, void *inf)
12799{
12800 struct got_entry *gent;
12801
12802 if (h->root.type == bfd_link_hash_indirect)
0a1b45a2 12803 return true;
927be08e 12804
927be08e
AM
12805 for (gent = h->got.glist; gent != NULL; gent = gent->next)
12806 if (!gent->is_indirect)
12807 allocate_got (h, (struct bfd_link_info *) inf, gent);
0a1b45a2 12808 return true;
927be08e
AM
12809}
12810
12811/* Called on the first multitoc pass after the last call to
12812 ppc64_elf_next_toc_section. This function removes duplicate GOT
12813 entries. */
12814
0a1b45a2 12815bool
927be08e 12816ppc64_elf_layout_multitoc (struct bfd_link_info *info)
ad8e1ba5
AM
12817{
12818 struct ppc_link_hash_table *htab = ppc_hash_table (info);
927be08e 12819 struct bfd *ibfd, *ibfd2;
0a1b45a2 12820 bool done_something;
927be08e
AM
12821
12822 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
ad8e1ba5 12823
7865406b 12824 if (!htab->do_multi_toc)
0a1b45a2 12825 return false;
7865406b 12826
d0fae19d 12827 /* Merge global sym got entries within a toc group. */
927be08e
AM
12828 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
12829
12830 /* And tlsld_got. */
c72f2fb2 12831 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12832 {
12833 struct got_entry *ent, *ent2;
12834
12835 if (!is_ppc64_elf (ibfd))
12836 continue;
12837
12838 ent = ppc64_tlsld_got (ibfd);
12839 if (!ent->is_indirect
12840 && ent->got.offset != (bfd_vma) -1)
12841 {
c72f2fb2 12842 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
927be08e
AM
12843 {
12844 if (!is_ppc64_elf (ibfd2))
12845 continue;
12846
12847 ent2 = ppc64_tlsld_got (ibfd2);
12848 if (!ent2->is_indirect
12849 && ent2->got.offset != (bfd_vma) -1
12850 && elf_gp (ibfd2) == elf_gp (ibfd))
12851 {
0a1b45a2 12852 ent2->is_indirect = true;
927be08e
AM
12853 ent2->got.ent = ent;
12854 }
12855 }
12856 }
12857 }
12858
12859 /* Zap sizes of got sections. */
33e44f2e
AM
12860 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
12861 htab->elf.irelplt->size -= htab->got_reli_size;
927be08e
AM
12862 htab->got_reli_size = 0;
12863
c72f2fb2 12864 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12865 {
12866 asection *got, *relgot;
12867
12868 if (!is_ppc64_elf (ibfd))
12869 continue;
12870
12871 got = ppc64_elf_tdata (ibfd)->got;
12872 if (got != NULL)
12873 {
12874 got->rawsize = got->size;
12875 got->size = 0;
12876 relgot = ppc64_elf_tdata (ibfd)->relgot;
12877 relgot->rawsize = relgot->size;
12878 relgot->size = 0;
12879 }
12880 }
12881
12882 /* Now reallocate the got, local syms first. We don't need to
12883 allocate section contents again since we never increase size. */
c72f2fb2 12884 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12885 {
12886 struct got_entry **lgot_ents;
12887 struct got_entry **end_lgot_ents;
12888 struct plt_entry **local_plt;
12889 struct plt_entry **end_local_plt;
f961d9dd 12890 unsigned char *lgot_masks;
927be08e
AM
12891 bfd_size_type locsymcount;
12892 Elf_Internal_Shdr *symtab_hdr;
19e08130 12893 asection *s;
3a3a4c1f
AM
12894 Elf_Internal_Sym *local_syms;
12895 Elf_Internal_Sym *isym;
927be08e
AM
12896
12897 if (!is_ppc64_elf (ibfd))
12898 continue;
12899
12900 lgot_ents = elf_local_got_ents (ibfd);
12901 if (!lgot_ents)
12902 continue;
12903
12904 symtab_hdr = &elf_symtab_hdr (ibfd);
12905 locsymcount = symtab_hdr->sh_info;
12906 end_lgot_ents = lgot_ents + locsymcount;
12907 local_plt = (struct plt_entry **) end_lgot_ents;
12908 end_local_plt = local_plt + locsymcount;
f961d9dd 12909 lgot_masks = (unsigned char *) end_local_plt;
c9fecd62
AM
12910 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
12911 if (local_syms == NULL && locsymcount != 0)
3a3a4c1f 12912 {
c9fecd62
AM
12913 local_syms = bfd_elf_get_elf_syms (ibfd, symtab_hdr, locsymcount,
12914 0, NULL, NULL, NULL);
12915 if (local_syms == NULL)
12916 return false;
3a3a4c1f 12917 }
927be08e 12918 s = ppc64_elf_tdata (ibfd)->got;
3a3a4c1f
AM
12919 for (isym = local_syms;
12920 lgot_ents < end_lgot_ents;
c9fecd62 12921 ++lgot_ents, ++lgot_masks, isym++)
927be08e
AM
12922 {
12923 struct got_entry *ent;
12924
12925 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
d0fae19d 12926 {
19e08130
AM
12927 unsigned int ent_size = 8;
12928 unsigned int rel_size = sizeof (Elf64_External_Rela);
12929
d0fae19d
AM
12930 ent->got.offset = s->size;
12931 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
d0fae19d 12932 {
19e08130
AM
12933 ent_size *= 2;
12934 rel_size *= 2;
12935 }
12936 s->size += ent_size;
37da22e5 12937 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
19e08130 12938 {
33e44f2e 12939 htab->elf.irelplt->size += rel_size;
19e08130
AM
12940 htab->got_reli_size += rel_size;
12941 }
6a3858a6 12942 else if (bfd_link_pic (info)
8f22c953
AM
12943 && (ent->tls_type == 0
12944 ? !info->enable_dt_relr
3a3a4c1f
AM
12945 : !bfd_link_executable (info))
12946 && isym->st_shndx != SHN_ABS)
19e08130
AM
12947 {
12948 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12949 srel->size += rel_size;
d0fae19d
AM
12950 }
12951 }
927be08e
AM
12952 }
12953 }
12954
12955 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
12956
c72f2fb2 12957 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12958 {
12959 struct got_entry *ent;
12960
12961 if (!is_ppc64_elf (ibfd))
12962 continue;
12963
12964 ent = ppc64_tlsld_got (ibfd);
12965 if (!ent->is_indirect
12966 && ent->got.offset != (bfd_vma) -1)
12967 {
12968 asection *s = ppc64_elf_tdata (ibfd)->got;
12969 ent->got.offset = s->size;
12970 s->size += 16;
f749f26e 12971 if (bfd_link_dll (info))
927be08e
AM
12972 {
12973 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
12974 srel->size += sizeof (Elf64_External_Rela);
12975 }
12976 }
12977 }
12978
33e44f2e 12979 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
927be08e 12980 if (!done_something)
c72f2fb2 12981 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
927be08e
AM
12982 {
12983 asection *got;
12984
12985 if (!is_ppc64_elf (ibfd))
12986 continue;
12987
12988 got = ppc64_elf_tdata (ibfd)->got;
12989 if (got != NULL)
12990 {
12991 done_something = got->rawsize != got->size;
12992 if (done_something)
12993 break;
12994 }
12995 }
12996
12997 if (done_something)
e7d1c40c 12998 (*htab->params->layout_sections_again) ();
927be08e
AM
12999
13000 /* Set up for second pass over toc sections to recalculate elf_gp
13001 on input sections. */
13002 htab->toc_bfd = NULL;
13003 htab->toc_first_sec = NULL;
0a1b45a2 13004 htab->second_toc_pass = true;
927be08e
AM
13005 return done_something;
13006}
13007
13008/* Called after second pass of multitoc partitioning. */
13009
13010void
13011ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
13012{
13013 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13014
13015 /* After the second pass, toc_curr tracks the TOC offset used
13016 for code sections below in ppc64_elf_next_input_section. */
3d6f9012 13017 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
13018}
13019
9b5ecbd0
AM
13020/* No toc references were found in ISEC. If the code in ISEC makes no
13021 calls, then there's no need to use toc adjusting stubs when branching
13022 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
13023 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
13024 needed, and 2 if a cyclical call-graph was found but no other reason
13025 for a stub was detected. If called from the top level, a return of
13026 2 means the same as a return of 0. */
9b5ecbd0
AM
13027
13028static int
4ce794b7 13029toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 13030{
9b5ecbd0 13031 int ret;
70cc837d
AM
13032
13033 /* Mark this section as checked. */
13034 isec->call_check_done = 1;
9b5ecbd0 13035
772119ce
AM
13036 /* We know none of our code bearing sections will need toc stubs. */
13037 if ((isec->flags & SEC_LINKER_CREATED) != 0)
13038 return 0;
13039
eea6121a 13040 if (isec->size == 0)
082c50f8
AM
13041 return 0;
13042
4c52953f
AM
13043 if (isec->output_section == NULL)
13044 return 0;
13045
4c52953f 13046 ret = 0;
70cc837d 13047 if (isec->reloc_count != 0)
9b5ecbd0 13048 {
70cc837d
AM
13049 Elf_Internal_Rela *relstart, *rel;
13050 Elf_Internal_Sym *local_syms;
13051 struct ppc_link_hash_table *htab;
2917689a 13052
70cc837d
AM
13053 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
13054 info->keep_memory);
13055 if (relstart == NULL)
13056 return -1;
90aecf7a 13057
70cc837d
AM
13058 /* Look for branches to outside of this section. */
13059 local_syms = NULL;
13060 htab = ppc_hash_table (info);
13061 if (htab == NULL)
13062 return -1;
4c52953f 13063
70cc837d 13064 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
4c52953f 13065 {
70cc837d
AM
13066 enum elf_ppc64_reloc_type r_type;
13067 unsigned long r_symndx;
13068 struct elf_link_hash_entry *h;
13069 struct ppc_link_hash_entry *eh;
13070 Elf_Internal_Sym *sym;
13071 asection *sym_sec;
13072 struct _opd_sec_data *opd;
13073 bfd_vma sym_value;
13074 bfd_vma dest;
13075
13076 r_type = ELF64_R_TYPE (rel->r_info);
13077 if (r_type != R_PPC64_REL24
05d0e962 13078 && r_type != R_PPC64_REL24_NOTOC
7aba54da 13079 && r_type != R_PPC64_REL24_P9NOTOC
70cc837d
AM
13080 && r_type != R_PPC64_REL14
13081 && r_type != R_PPC64_REL14_BRTAKEN
23cedd1d 13082 && r_type != R_PPC64_REL14_BRNTAKEN
5663e321
AM
13083 && r_type != R_PPC64_PLTCALL
13084 && r_type != R_PPC64_PLTCALL_NOTOC)
70cc837d 13085 continue;
4c52953f 13086
70cc837d
AM
13087 r_symndx = ELF64_R_SYM (rel->r_info);
13088 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
13089 isec->owner))
4c52953f 13090 {
70cc837d
AM
13091 ret = -1;
13092 break;
13093 }
4c52953f 13094
70cc837d
AM
13095 /* Calls to dynamic lib functions go through a plt call stub
13096 that uses r2. */
ed7007c1 13097 eh = ppc_elf_hash_entry (h);
70cc837d
AM
13098 if (eh != NULL
13099 && (eh->elf.plt.plist != NULL
13100 || (eh->oh != NULL
13101 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
13102 {
13103 ret = 1;
13104 break;
4c52953f
AM
13105 }
13106
70cc837d
AM
13107 if (sym_sec == NULL)
13108 /* Ignore other undefined symbols. */
4c52953f 13109 continue;
4c52953f 13110
70cc837d
AM
13111 /* Assume branches to other sections not included in the
13112 link need stubs too, to cover -R and absolute syms. */
13113 if (sym_sec->output_section == NULL)
13114 {
13115 ret = 1;
13116 break;
13117 }
4c52953f 13118
70cc837d
AM
13119 if (h == NULL)
13120 sym_value = sym->st_value;
13121 else
13122 {
13123 if (h->root.type != bfd_link_hash_defined
13124 && h->root.type != bfd_link_hash_defweak)
13125 abort ();
13126 sym_value = h->root.u.def.value;
13127 }
13128 sym_value += rel->r_addend;
4c52953f 13129
70cc837d
AM
13130 /* If this branch reloc uses an opd sym, find the code section. */
13131 opd = get_opd_info (sym_sec);
13132 if (opd != NULL)
13133 {
13134 if (h == NULL && opd->adjust != NULL)
13135 {
13136 long adjust;
4c52953f 13137
92a9c616 13138 adjust = opd->adjust[OPD_NDX (sym_value)];
70cc837d
AM
13139 if (adjust == -1)
13140 /* Assume deleted functions won't ever be called. */
13141 continue;
13142 sym_value += adjust;
13143 }
4c52953f 13144
aef36ac1 13145 dest = opd_entry_value (sym_sec, sym_value,
0a1b45a2 13146 &sym_sec, NULL, false);
70cc837d
AM
13147 if (dest == (bfd_vma) -1)
13148 continue;
13149 }
13150 else
13151 dest = (sym_value
13152 + sym_sec->output_offset
13153 + sym_sec->output_section->vma);
4c52953f 13154
70cc837d
AM
13155 /* Ignore branch to self. */
13156 if (sym_sec == isec)
13157 continue;
4c52953f 13158
70cc837d
AM
13159 /* If the called function uses the toc, we need a stub. */
13160 if (sym_sec->has_toc_reloc
13161 || sym_sec->makes_toc_func_call)
4c52953f 13162 {
70cc837d 13163 ret = 1;
4c52953f
AM
13164 break;
13165 }
70cc837d
AM
13166
13167 /* Assume any branch that needs a long branch stub might in fact
13168 need a plt_branch stub. A plt_branch stub uses r2. */
13169 else if (dest - (isec->output_offset
13170 + isec->output_section->vma
6911b7dc
AM
13171 + rel->r_offset) + (1 << 25)
13172 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
13173 ? h->other
13174 : sym->st_other))
4c52953f 13175 {
70cc837d
AM
13176 ret = 1;
13177 break;
13178 }
13179
13180 /* If calling back to a section in the process of being
13181 tested, we can't say for sure that no toc adjusting stubs
13182 are needed, so don't return zero. */
13183 else if (sym_sec->call_check_in_progress)
13184 ret = 2;
13185
13186 /* Branches to another section that itself doesn't have any TOC
13187 references are OK. Recursively call ourselves to check. */
13188 else if (!sym_sec->call_check_done)
13189 {
13190 int recur;
13191
13192 /* Mark current section as indeterminate, so that other
13193 sections that call back to current won't be marked as
13194 known. */
13195 isec->call_check_in_progress = 1;
13196 recur = toc_adjusting_stub_needed (info, sym_sec);
13197 isec->call_check_in_progress = 0;
13198
4c52953f
AM
13199 if (recur != 0)
13200 {
70cc837d
AM
13201 ret = recur;
13202 if (recur != 2)
13203 break;
4c52953f
AM
13204 }
13205 }
4c52953f 13206 }
70cc837d 13207
c9594989
AM
13208 if (elf_symtab_hdr (isec->owner).contents
13209 != (unsigned char *) local_syms)
70cc837d
AM
13210 free (local_syms);
13211 if (elf_section_data (isec)->relocs != relstart)
13212 free (relstart);
9b5ecbd0
AM
13213 }
13214
70cc837d
AM
13215 if ((ret & 1) == 0
13216 && isec->map_head.s != NULL
13217 && (strcmp (isec->output_section->name, ".init") == 0
13218 || strcmp (isec->output_section->name, ".fini") == 0))
13219 {
13220 if (isec->map_head.s->has_toc_reloc
13221 || isec->map_head.s->makes_toc_func_call)
13222 ret = 1;
13223 else if (!isec->map_head.s->call_check_done)
13224 {
13225 int recur;
13226 isec->call_check_in_progress = 1;
13227 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
13228 isec->call_check_in_progress = 0;
13229 if (recur != 0)
13230 ret = recur;
13231 }
13232 }
13233
13234 if (ret == 1)
13235 isec->makes_toc_func_call = 1;
4c52953f 13236
9b5ecbd0
AM
13237 return ret;
13238}
13239
721956f4
AM
13240/* The linker repeatedly calls this function for each input section,
13241 in the order that input sections are linked into output sections.
13242 Build lists of input sections to determine groupings between which
13243 we may insert linker stubs. */
13244
0a1b45a2 13245bool
4ce794b7 13246ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
13247{
13248 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13249
4dfe6ac6 13250 if (htab == NULL)
0a1b45a2 13251 return false;
4dfe6ac6 13252
734b6cf9 13253 if ((isec->output_section->flags & SEC_CODE) != 0
6f20ed8a 13254 && isec->output_section->id < htab->sec_info_arr_size)
721956f4 13255 {
3d6f9012
AM
13256 /* This happens to make the list in reverse order,
13257 which is what we want. */
6f20ed8a
AM
13258 htab->sec_info[isec->id].u.list
13259 = htab->sec_info[isec->output_section->id].u.list;
13260 htab->sec_info[isec->output_section->id].u.list = isec;
721956f4 13261 }
ad8e1ba5 13262
4c52953f 13263 if (htab->multi_toc_needed)
9b5ecbd0 13264 {
8b974ba3
AM
13265 /* Analyse sections that aren't already flagged as needing a
13266 valid toc pointer. Exclude .fixup for the linux kernel.
13267 .fixup contains branches, but only back to the function that
13268 hit an exception. */
13269 if (!(isec->has_toc_reloc
13270 || (isec->flags & SEC_CODE) == 0
13271 || strcmp (isec->name, ".fixup") == 0
13272 || isec->call_check_done))
13273 {
13274 if (toc_adjusting_stub_needed (info, isec) < 0)
0a1b45a2 13275 return false;
8b974ba3
AM
13276 }
13277 /* Make all sections use the TOC assigned for this object file.
13278 This will be wrong for pasted sections; We fix that in
13279 check_pasted_section(). */
13280 if (elf_gp (isec->owner) != 0)
13281 htab->toc_curr = elf_gp (isec->owner);
13282 }
13283
6f20ed8a 13284 htab->sec_info[isec->id].toc_off = htab->toc_curr;
0a1b45a2 13285 return true;
721956f4
AM
13286}
13287
70cc837d
AM
13288/* Check that all .init and .fini sections use the same toc, if they
13289 have toc relocs. */
13290
0a1b45a2 13291static bool
70cc837d
AM
13292check_pasted_section (struct bfd_link_info *info, const char *name)
13293{
13294 asection *o = bfd_get_section_by_name (info->output_bfd, name);
13295
13296 if (o != NULL)
13297 {
13298 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13299 bfd_vma toc_off = 0;
13300 asection *i;
13301
13302 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
13303 if (i->has_toc_reloc)
13304 {
13305 if (toc_off == 0)
6f20ed8a
AM
13306 toc_off = htab->sec_info[i->id].toc_off;
13307 else if (toc_off != htab->sec_info[i->id].toc_off)
0a1b45a2 13308 return false;
70cc837d 13309 }
6683a28d
AM
13310
13311 if (toc_off == 0)
13312 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
13313 if (i->makes_toc_func_call)
13314 {
6f20ed8a 13315 toc_off = htab->sec_info[i->id].toc_off;
6683a28d
AM
13316 break;
13317 }
13318
70cc837d
AM
13319 /* Make sure the whole pasted function uses the same toc offset. */
13320 if (toc_off != 0)
13321 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
6f20ed8a 13322 htab->sec_info[i->id].toc_off = toc_off;
70cc837d 13323 }
0a1b45a2 13324 return true;
70cc837d
AM
13325}
13326
0a1b45a2 13327bool
70cc837d
AM
13328ppc64_elf_check_init_fini (struct bfd_link_info *info)
13329{
0c80c644
SM
13330 bool ret1 = check_pasted_section (info, ".init");
13331 bool ret2 = check_pasted_section (info, ".fini");
13332
13333 return ret1 && ret2;
70cc837d
AM
13334}
13335
721956f4
AM
13336/* See whether we can group stub sections together. Grouping stub
13337 sections may result in fewer stubs. More importantly, we need to
13338 put all .init* and .fini* stubs at the beginning of the .init or
13339 .fini output sections respectively, because glibc splits the
13340 _init and _fini functions into multiple parts. Putting a stub in
13341 the middle of a function is not a good idea. */
13342
0a1b45a2 13343static bool
6f20ed8a 13344group_sections (struct bfd_link_info *info,
4ce794b7 13345 bfd_size_type stub_group_size,
0a1b45a2 13346 bool stubs_always_before_branch)
721956f4 13347{
6f20ed8a
AM
13348 struct ppc_link_hash_table *htab;
13349 asection *osec;
0a1b45a2 13350 bool suppress_size_errors;
7c8fe5c4 13351
6f20ed8a
AM
13352 htab = ppc_hash_table (info);
13353 if (htab == NULL)
0a1b45a2 13354 return false;
6f20ed8a 13355
0a1b45a2 13356 suppress_size_errors = false;
7c8fe5c4
AM
13357 if (stub_group_size == 1)
13358 {
13359 /* Default values. */
13360 if (stubs_always_before_branch)
09f92717 13361 stub_group_size = 0x1e00000;
7c8fe5c4 13362 else
09f92717 13363 stub_group_size = 0x1c00000;
0a1b45a2 13364 suppress_size_errors = true;
7c8fe5c4
AM
13365 }
13366
6f20ed8a 13367 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
721956f4 13368 {
6f20ed8a
AM
13369 asection *tail;
13370
13371 if (osec->id >= htab->sec_info_arr_size)
13372 continue;
13373
13374 tail = htab->sec_info[osec->id].u.list;
734b6cf9 13375 while (tail != NULL)
721956f4 13376 {
734b6cf9
AM
13377 asection *curr;
13378 asection *prev;
13379 bfd_size_type total;
0a1b45a2 13380 bool big_sec;
734b6cf9 13381 bfd_vma curr_toc;
6f20ed8a 13382 struct map_stub *group;
09f92717 13383 bfd_size_type group_size;
734b6cf9
AM
13384
13385 curr = tail;
eea6121a 13386 total = tail->size;
09f92717
AM
13387 group_size = (ppc64_elf_section_data (tail) != NULL
13388 && ppc64_elf_section_data (tail)->has_14bit_branch
13389 ? stub_group_size >> 10 : stub_group_size);
13390
13391 big_sec = total > group_size;
7c8fe5c4 13392 if (big_sec && !suppress_size_errors)
695344c0 13393 /* xgettext:c-format */
871b3ab2 13394 _bfd_error_handler (_("%pB section %pA exceeds stub group size"),
4eca0228 13395 tail->owner, tail);
6f20ed8a 13396 curr_toc = htab->sec_info[tail->id].toc_off;
734b6cf9 13397
6f20ed8a 13398 while ((prev = htab->sec_info[curr->id].u.list) != NULL
734b6cf9 13399 && ((total += curr->output_offset - prev->output_offset)
6bee8834
AM
13400 < (ppc64_elf_section_data (prev) != NULL
13401 && ppc64_elf_section_data (prev)->has_14bit_branch
09f92717 13402 ? (group_size = stub_group_size >> 10) : group_size))
6f20ed8a 13403 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
13404 curr = prev;
13405
13406 /* OK, the size from the start of CURR to the end is less
09f92717 13407 than group_size and thus can be handled by one stub
734b6cf9 13408 section. (or the tail section is itself larger than
09f92717
AM
13409 group_size, in which case we may be toast.) We should
13410 really be keeping track of the total size of stubs added
13411 here, as stubs contribute to the final output section
13412 size. That's a little tricky, and this way will only
13413 break if stubs added make the total size more than 2^25,
13414 ie. for the default stub_group_size, if stubs total more
13415 than 2097152 bytes, or nearly 75000 plt call stubs. */
6f20ed8a
AM
13416 group = bfd_alloc (curr->owner, sizeof (*group));
13417 if (group == NULL)
0a1b45a2 13418 return false;
6f20ed8a
AM
13419 group->link_sec = curr;
13420 group->stub_sec = NULL;
a4b6fadd 13421 group->needs_save_res = 0;
df136d64
AM
13422 group->lr_restore = 0;
13423 group->eh_size = 0;
13424 group->eh_base = 0;
a4b6fadd
AM
13425 group->next = htab->group;
13426 htab->group = group;
734b6cf9 13427 do
721956f4 13428 {
6f20ed8a 13429 prev = htab->sec_info[tail->id].u.list;
734b6cf9 13430 /* Set up this stub group. */
6f20ed8a 13431 htab->sec_info[tail->id].u.group = group;
721956f4 13432 }
734b6cf9
AM
13433 while (tail != curr && (tail = prev) != NULL);
13434
09f92717 13435 /* But wait, there's more! Input sections up to group_size
734b6cf9
AM
13436 bytes before the stub section can be handled by it too.
13437 Don't do this if we have a really large section after the
13438 stubs, as adding more stubs increases the chance that
13439 branches may not reach into the stub section. */
13440 if (!stubs_always_before_branch && !big_sec)
13441 {
13442 total = 0;
13443 while (prev != NULL
13444 && ((total += tail->output_offset - prev->output_offset)
6bee8834
AM
13445 < (ppc64_elf_section_data (prev) != NULL
13446 && ppc64_elf_section_data (prev)->has_14bit_branch
2cdcc330
AM
13447 ? (group_size = stub_group_size >> 10)
13448 : group_size))
6f20ed8a 13449 && htab->sec_info[prev->id].toc_off == curr_toc)
734b6cf9
AM
13450 {
13451 tail = prev;
6f20ed8a
AM
13452 prev = htab->sec_info[tail->id].u.list;
13453 htab->sec_info[tail->id].u.group = group;
734b6cf9
AM
13454 }
13455 }
13456 tail = prev;
721956f4
AM
13457 }
13458 }
0a1b45a2 13459 return true;
721956f4
AM
13460}
13461
58d180e8
AM
13462static const unsigned char glink_eh_frame_cie[] =
13463{
13464 0, 0, 0, 16, /* length. */
13465 0, 0, 0, 0, /* id. */
13466 1, /* CIE version. */
13467 'z', 'R', 0, /* Augmentation string. */
13468 4, /* Code alignment. */
13469 0x78, /* Data alignment. */
13470 65, /* RA reg. */
13471 1, /* Augmentation size. */
13472 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
2e0ce1c8 13473 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
58d180e8
AM
13474};
13475
d969d15f
AM
13476/* Stripping output sections is normally done before dynamic section
13477 symbols have been allocated. This function is called later, and
13478 handles cases like htab->brlt which is mapped to its own output
13479 section. */
13480
13481static void
13482maybe_strip_output (struct bfd_link_info *info, asection *isec)
13483{
13484 if (isec->size == 0
13485 && isec->output_section->size == 0
53d8967a 13486 && !(isec->output_section->flags & SEC_KEEP)
d969d15f
AM
13487 && !bfd_section_removed_from_list (info->output_bfd,
13488 isec->output_section)
13489 && elf_section_data (isec->output_section)->dynindx == 0)
13490 {
13491 isec->output_section->flags |= SEC_EXCLUDE;
13492 bfd_section_list_remove (info->output_bfd, isec->output_section);
13493 info->output_bfd->section_count--;
13494 }
13495}
13496
0aac2413
AM
13497/* Stash R_PPC64_RELATIVE reloc at input section SEC, r_offset OFF to
13498 the array of such relocs. */
1657026c
AM
13499
13500static bool
0aac2413 13501append_relr_off (struct ppc_link_hash_table *htab, asection *sec, bfd_vma off)
1657026c
AM
13502{
13503 if (htab->relr_count >= htab->relr_alloc)
13504 {
13505 if (htab->relr_alloc == 0)
13506 htab->relr_alloc = 4096;
13507 else
13508 htab->relr_alloc *= 2;
0aac2413
AM
13509 htab->relr = bfd_realloc (htab->relr,
13510 htab->relr_alloc * sizeof (*htab->relr));
13511 if (htab->relr == NULL)
1657026c
AM
13512 return false;
13513 }
0aac2413
AM
13514 htab->relr[htab->relr_count].sec = sec;
13515 htab->relr[htab->relr_count].off = off;
13516 htab->relr_count++;
1657026c
AM
13517 return true;
13518}
13519
0aac2413
AM
13520/* qsort comparator for bfd_vma args. */
13521
13522static int
13523compare_relr_address (const void *arg1, const void *arg2)
13524{
13525 bfd_vma a = *(bfd_vma *) arg1;
13526 bfd_vma b = *(bfd_vma *) arg2;
13527 return a < b ? -1 : a > b ? 1 : 0;
13528}
13529
13530/* Produce a malloc'd sorted array of reloc addresses from the info
13531 stored by append_relr_off. */
13532
13533static bfd_vma *
13534sort_relr (struct ppc_link_hash_table *htab)
13535{
13536 bfd_vma *addr = bfd_malloc (htab->relr_count * sizeof (*addr));
13537 if (addr == NULL)
13538 return NULL;
13539
13540 for (size_t i = 0; i < htab->relr_count; i++)
13541 addr[i] = (htab->relr[i].sec->output_section->vma
13542 + htab->relr[i].sec->output_offset
13543 + htab->relr[i].off);
13544
13545 if (htab->relr_count > 1)
13546 qsort (addr, htab->relr_count, sizeof (*addr), compare_relr_address);
13547
13548 return addr;
13549}
13550
13551/* Look over GOT and PLT entries saved on elf_local_got_ents for all
e26ff4b5 13552 input files, stashing info about needed relative relocs. */
0aac2413 13553
1657026c
AM
13554static bool
13555got_and_plt_relr_for_local_syms (struct bfd_link_info *info)
13556{
13557 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13558 bfd *ibfd;
13559
13560 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
13561 {
13562 struct got_entry **lgot_ents, **lgot, **end_lgot_ents;
13563 struct plt_entry **local_plt, **lplt, **end_local_plt;
13564 Elf_Internal_Shdr *symtab_hdr;
13565 bfd_size_type locsymcount;
3a3a4c1f
AM
13566 Elf_Internal_Sym *local_syms;
13567 Elf_Internal_Sym *isym;
1657026c
AM
13568 struct plt_entry *pent;
13569 struct got_entry *gent;
13570
13571 if (!is_ppc64_elf (ibfd))
13572 continue;
13573
13574 lgot_ents = elf_local_got_ents (ibfd);
13575 if (!lgot_ents)
13576 continue;
13577
13578 symtab_hdr = &elf_symtab_hdr (ibfd);
13579 locsymcount = symtab_hdr->sh_info;
3a3a4c1f
AM
13580 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
13581 if (local_syms == NULL && locsymcount != 0)
13582 {
13583 local_syms = bfd_elf_get_elf_syms (ibfd, symtab_hdr, locsymcount,
13584 0, NULL, NULL, NULL);
13585 if (local_syms == NULL)
13586 return false;
13587 }
1657026c
AM
13588 end_lgot_ents = lgot_ents + locsymcount;
13589 local_plt = (struct plt_entry **) end_lgot_ents;
13590 end_local_plt = local_plt + locsymcount;
3a3a4c1f
AM
13591 for (lgot = lgot_ents, isym = local_syms;
13592 lgot < end_lgot_ents;
13593 ++lgot, ++isym)
1657026c
AM
13594 for (gent = *lgot; gent != NULL; gent = gent->next)
13595 if (!gent->is_indirect
13596 && gent->tls_type == 0
3a3a4c1f
AM
13597 && gent->got.offset != (bfd_vma) -1
13598 && isym->st_shndx != SHN_ABS)
1657026c
AM
13599 {
13600 asection *got = ppc64_elf_tdata (gent->owner)->got;
0aac2413 13601 if (!append_relr_off (htab, got, gent->got.offset))
1657026c
AM
13602 {
13603 htab->stub_error = true;
13604 return false;
13605 }
13606 }
13607
13608 if (!htab->opd_abi)
3a3a4c1f
AM
13609 for (lplt = local_plt, isym = local_syms;
13610 lplt < end_local_plt;
13611 ++lplt, ++isym)
1657026c 13612 for (pent = *lplt; pent != NULL; pent = pent->next)
3a3a4c1f
AM
13613 if (pent->plt.offset != (bfd_vma) -1
13614 && ELF_ST_TYPE (isym->st_info) != STT_GNU_IFUNC)
1657026c 13615 {
0aac2413 13616 if (!append_relr_off (htab, htab->pltlocal, pent->plt.offset))
1657026c 13617 {
1657026c
AM
13618 if (symtab_hdr->contents != (unsigned char *) local_syms)
13619 free (local_syms);
13620 return false;
13621 }
1657026c
AM
13622 }
13623
13624 if (local_syms != NULL
13625 && symtab_hdr->contents != (unsigned char *) local_syms)
13626 {
13627 if (!info->keep_memory)
13628 free (local_syms);
13629 else
13630 symtab_hdr->contents = (unsigned char *) local_syms;
13631 }
13632 }
13633 return true;
13634}
13635
0aac2413
AM
13636/* Stash info about needed GOT and PLT entry relative relocs for
13637 global symbol H. */
13638
1657026c
AM
13639static bool
13640got_and_plt_relr (struct elf_link_hash_entry *h, void *inf)
13641{
13642 struct bfd_link_info *info;
13643 struct ppc_link_hash_table *htab;
13644 struct plt_entry *pent;
13645 struct got_entry *gent;
13646
13647 if (h->root.type == bfd_link_hash_indirect)
13648 return true;
13649
13650 info = (struct bfd_link_info *) inf;
13651 htab = ppc_hash_table (info);
13652 if (htab == NULL)
13653 return false;
13654
13655 if (h->type != STT_GNU_IFUNC
13656 && h->def_regular
13657 && (h->root.type == bfd_link_hash_defined
13658 || h->root.type == bfd_link_hash_defweak))
13659 {
3a3a4c1f
AM
13660 if ((!htab->elf.dynamic_sections_created
13661 || h->dynindx == -1
13662 || SYMBOL_REFERENCES_LOCAL (info, h))
13663 && !bfd_is_abs_symbol (&h->root))
1657026c
AM
13664 for (gent = h->got.glist; gent != NULL; gent = gent->next)
13665 if (!gent->is_indirect
13666 && gent->tls_type == 0
13667 && gent->got.offset != (bfd_vma) -1)
13668 {
13669 asection *got = ppc64_elf_tdata (gent->owner)->got;
0aac2413 13670 if (!append_relr_off (htab, got, gent->got.offset))
1657026c
AM
13671 {
13672 htab->stub_error = true;
13673 return false;
13674 }
13675 }
13676
13677 if (!htab->opd_abi
13678 && use_local_plt (info, h))
13679 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
13680 if (pent->plt.offset != (bfd_vma) -1)
13681 {
0aac2413 13682 if (!append_relr_off (htab, htab->pltlocal, pent->plt.offset))
1657026c
AM
13683 {
13684 htab->stub_error = true;
13685 return false;
13686 }
13687 }
13688 }
13689 return true;
13690}
13691
721956f4
AM
13692/* Determine and set the size of the stub section for a final link.
13693
13694 The basic idea here is to examine all the relocations looking for
13695 PC-relative calls to a target that is unreachable with a "bl"
13696 instruction. */
13697
0a1b45a2 13698bool
e7d1c40c 13699ppc64_elf_size_stubs (struct bfd_link_info *info)
721956f4
AM
13700{
13701 bfd_size_type stub_group_size;
0a1b45a2 13702 bool stubs_always_before_branch;
721956f4
AM
13703 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13704
4dfe6ac6 13705 if (htab == NULL)
0a1b45a2 13706 return false;
4dfe6ac6 13707
e10a07b3
AM
13708 if (htab->params->power10_stubs == -1 && !htab->has_power10_relocs)
13709 htab->params->power10_stubs = 0;
13710
0e1862bb 13711 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
e7d1c40c 13712 htab->params->plt_thread_safe = 1;
b9e5796b 13713 if (!htab->opd_abi)
e7d1c40c
AM
13714 htab->params->plt_thread_safe = 0;
13715 else if (htab->params->plt_thread_safe == -1)
794e51c0 13716 {
e2458743 13717 static const char *const thread_starter[] =
794e51c0
AM
13718 {
13719 "pthread_create",
13720 /* libstdc++ */
13721 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
13722 /* librt */
13723 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
13724 "mq_notify", "create_timer",
13725 /* libanl */
13726 "getaddrinfo_a",
13727 /* libgomp */
2300b5a1 13728 "GOMP_parallel",
794e51c0 13729 "GOMP_parallel_start",
2300b5a1 13730 "GOMP_parallel_loop_static",
794e51c0 13731 "GOMP_parallel_loop_static_start",
2300b5a1 13732 "GOMP_parallel_loop_dynamic",
794e51c0 13733 "GOMP_parallel_loop_dynamic_start",
2300b5a1 13734 "GOMP_parallel_loop_guided",
794e51c0 13735 "GOMP_parallel_loop_guided_start",
2300b5a1 13736 "GOMP_parallel_loop_runtime",
794e51c0 13737 "GOMP_parallel_loop_runtime_start",
2300b5a1 13738 "GOMP_parallel_sections",
68ffbac6 13739 "GOMP_parallel_sections_start",
f9dffbf0
AM
13740 /* libgo */
13741 "__go_go",
794e51c0
AM
13742 };
13743 unsigned i;
13744
a4b6fadd 13745 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
794e51c0
AM
13746 {
13747 struct elf_link_hash_entry *h;
13748 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
0a1b45a2 13749 false, false, true);
e7d1c40c
AM
13750 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
13751 if (htab->params->plt_thread_safe)
794e51c0
AM
13752 break;
13753 }
13754 }
e7d1c40c
AM
13755 stubs_always_before_branch = htab->params->group_size < 0;
13756 if (htab->params->group_size < 0)
13757 stub_group_size = -htab->params->group_size;
721956f4 13758 else
e7d1c40c 13759 stub_group_size = htab->params->group_size;
721956f4 13760
6f20ed8a 13761 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
0a1b45a2 13762 return false;
721956f4 13763
a804e476
AM
13764 htab->tga_group = NULL;
13765 if (!htab->params->no_tls_get_addr_regsave
13766 && htab->tga_desc_fd != NULL
13767 && (htab->tga_desc_fd->elf.root.type == bfd_link_hash_undefined
13768 || htab->tga_desc_fd->elf.root.type == bfd_link_hash_undefweak)
13769 && htab->tls_get_addr_fd != NULL
13770 && is_static_defined (&htab->tls_get_addr_fd->elf))
13771 {
13772 asection *sym_sec, *code_sec, *stub_sec;
13773 bfd_vma sym_value;
13774 struct _opd_sec_data *opd;
13775
13776 sym_sec = htab->tls_get_addr_fd->elf.root.u.def.section;
13777 sym_value = defined_sym_val (&htab->tls_get_addr_fd->elf);
13778 code_sec = sym_sec;
13779 opd = get_opd_info (sym_sec);
13780 if (opd != NULL)
0a1b45a2 13781 opd_entry_value (sym_sec, sym_value, &code_sec, NULL, false);
a804e476
AM
13782 htab->tga_group = htab->sec_info[code_sec->id].u.group;
13783 stub_sec = (*htab->params->add_stub_section) (".tga_desc.stub",
13784 htab->tga_group->link_sec);
13785 if (stub_sec == NULL)
0a1b45a2 13786 return false;
a804e476
AM
13787 htab->tga_group->stub_sec = stub_sec;
13788
13789 htab->tga_desc_fd->elf.root.type = bfd_link_hash_defined;
13790 htab->tga_desc_fd->elf.root.u.def.section = stub_sec;
13791 htab->tga_desc_fd->elf.root.u.def.value = 0;
13792 htab->tga_desc_fd->elf.type = STT_FUNC;
13793 htab->tga_desc_fd->elf.def_regular = 1;
13794 htab->tga_desc_fd->elf.non_elf = 0;
0a1b45a2 13795 _bfd_elf_link_hash_hide_symbol (info, &htab->tga_desc_fd->elf, true);
a804e476
AM
13796 }
13797
c9301e31 13798 /* Loop until no stubs added. After iteration 20 of this loop we may
0441f94f 13799 exit on a stub section shrinking. */
c9301e31 13800
721956f4
AM
13801 while (1)
13802 {
13803 bfd *input_bfd;
13804 unsigned int bfd_indx;
a4b6fadd 13805 struct map_stub *group;
721956f4
AM
13806
13807 htab->stub_iteration += 1;
1657026c 13808 htab->relr_count = 0;
721956f4
AM
13809
13810 for (input_bfd = info->input_bfds, bfd_indx = 0;
13811 input_bfd != NULL;
c72f2fb2 13812 input_bfd = input_bfd->link.next, bfd_indx++)
721956f4
AM
13813 {
13814 Elf_Internal_Shdr *symtab_hdr;
13815 asection *section;
6cdc0ccc 13816 Elf_Internal_Sym *local_syms = NULL;
721956f4 13817
0c8d6e5c 13818 if (!is_ppc64_elf (input_bfd))
67f93c31
AM
13819 continue;
13820
721956f4 13821 /* We'll need the symbol table in a second. */
0ffa91dd 13822 symtab_hdr = &elf_symtab_hdr (input_bfd);
721956f4
AM
13823 if (symtab_hdr->sh_info == 0)
13824 continue;
13825
721956f4
AM
13826 /* Walk over each section attached to the input bfd. */
13827 for (section = input_bfd->sections;
13828 section != NULL;
13829 section = section->next)
13830 {
721956f4 13831 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
1657026c 13832 bool is_opd;
721956f4
AM
13833
13834 /* If there aren't any relocs, then there's nothing more
13835 to do. */
13836 if ((section->flags & SEC_RELOC) == 0
12c0f757
AM
13837 || (section->flags & SEC_ALLOC) == 0
13838 || (section->flags & SEC_LOAD) == 0
721956f4
AM
13839 || section->reloc_count == 0)
13840 continue;
13841
1657026c
AM
13842 if (!info->enable_dt_relr
13843 && (section->flags & SEC_CODE) == 0)
13844 continue;
13845
721956f4
AM
13846 /* If this section is a link-once section that will be
13847 discarded, then don't create any stubs. */
13848 if (section->output_section == NULL
927be08e 13849 || section->output_section->owner != info->output_bfd)
721956f4
AM
13850 continue;
13851
1e2f5b6e
AM
13852 /* Get the relocs. */
13853 internal_relocs
4ce794b7 13854 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 13855 info->keep_memory);
721956f4 13856 if (internal_relocs == NULL)
1e2f5b6e 13857 goto error_ret_free_local;
721956f4 13858
1657026c
AM
13859 is_opd = ppc64_elf_section_data (section)->sec_type == sec_opd;
13860
721956f4
AM
13861 /* Now examine each relocation. */
13862 irela = internal_relocs;
13863 irelaend = irela + section->reloc_count;
13864 for (; irela < irelaend; irela++)
13865 {
4ce794b7
AM
13866 enum elf_ppc64_reloc_type r_type;
13867 unsigned int r_indx;
7aba54da 13868 struct ppc_stub_type stub_type;
721956f4 13869 struct ppc_stub_hash_entry *stub_entry;
8387904d 13870 asection *sym_sec, *code_sec;
e054468f 13871 bfd_vma sym_value, code_value;
721956f4 13872 bfd_vma destination;
6911b7dc 13873 unsigned long local_off;
0a1b45a2 13874 bool ok_dest;
721956f4 13875 struct ppc_link_hash_entry *hash;
8387904d 13876 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
13877 struct elf_link_hash_entry *h;
13878 Elf_Internal_Sym *sym;
721956f4
AM
13879 char *stub_name;
13880 const asection *id_sec;
74f0fb50 13881 struct _opd_sec_data *opd;
e054468f 13882 struct plt_entry *plt_ent;
721956f4
AM
13883
13884 r_type = ELF64_R_TYPE (irela->r_info);
13885 r_indx = ELF64_R_SYM (irela->r_info);
13886
4ce794b7 13887 if (r_type >= R_PPC64_max)
721956f4
AM
13888 {
13889 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 13890 goto error_ret_free_internal;
721956f4
AM
13891 }
13892
13893 /* Only look for stubs on branch instructions. */
1657026c
AM
13894 switch (r_type)
13895 {
13896 default:
f91074eb
AM
13897 if (info->enable_dt_relr
13898 && maybe_relr (r_type, irela, section))
13899 break;
1657026c
AM
13900 continue;
13901
13902 case R_PPC64_REL24:
13903 case R_PPC64_REL24_NOTOC:
13904 case R_PPC64_REL24_P9NOTOC:
13905 case R_PPC64_REL14:
13906 case R_PPC64_REL14_BRTAKEN:
13907 case R_PPC64_REL14_BRNTAKEN:
13908 if ((section->flags & SEC_CODE) != 0)
13909 break;
13910 continue;
1657026c 13911 }
721956f4
AM
13912
13913 /* Now determine the call target, its name, value,
13914 section. */
411e1bfb
AM
13915 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
13916 r_indx, input_bfd))
13917 goto error_ret_free_internal;
411e1bfb 13918
1657026c
AM
13919 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
13920 {
13921 /* Only locally defined symbols can possibly use
13922 relative relocations. */
13923 bfd_vma r_offset;
13924 if ((sym_sec == NULL
13925 || sym_sec->output_section == NULL)
13926 /* No symbol is OK too. */
13927 && !(sym != NULL && sym->st_shndx == 0)
13928 /* Hack for __ehdr_start, which is undefined
13929 at this point. */
13930 && !(h != NULL && h->root.linker_def))
13931 continue;
13932 if (NO_OPD_RELOCS && is_opd)
13933 continue;
13934 if (!is_opd
13935 && r_type == R_PPC64_ADDR64)
13936 {
13937 if (h != NULL
13938 ? h->type == STT_GNU_IFUNC
13939 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13940 continue;
3a3a4c1f
AM
13941 if (h != NULL
13942 ? bfd_is_abs_symbol (&h->root)
13943 : sym->st_shndx == SHN_ABS)
13944 continue;
1657026c
AM
13945 if (h != NULL
13946 && !SYMBOL_REFERENCES_LOCAL (info, h))
13947 continue;
13948 }
13949 r_offset = _bfd_elf_section_offset (info->output_bfd,
13950 info,
13951 section,
13952 irela->r_offset);
13953 if (r_offset >= (bfd_vma) -2)
13954 continue;
0aac2413 13955 if (!append_relr_off (htab, section, r_offset))
1657026c
AM
13956 goto error_ret_free_internal;
13957 continue;
13958 }
13959
13960 hash = ppc_elf_hash_entry (h);
0a1b45a2 13961 ok_dest = false;
8387904d 13962 fdh = NULL;
7fe2b9a6 13963 sym_value = 0;
411e1bfb 13964 if (hash == NULL)
721956f4 13965 {
411e1bfb 13966 sym_value = sym->st_value;
c27b8c2a
AM
13967 if (sym_sec != NULL
13968 && sym_sec->output_section != NULL)
0a1b45a2 13969 ok_dest = true;
721956f4 13970 }
7fe2b9a6
AM
13971 else if (hash->elf.root.type == bfd_link_hash_defined
13972 || hash->elf.root.type == bfd_link_hash_defweak)
13973 {
13974 sym_value = hash->elf.root.u.def.value;
13975 if (sym_sec->output_section != NULL)
0a1b45a2 13976 ok_dest = true;
7fe2b9a6
AM
13977 }
13978 else if (hash->elf.root.type == bfd_link_hash_undefweak
13979 || hash->elf.root.type == bfd_link_hash_undefined)
721956f4 13980 {
99877b66 13981 /* Recognise an old ABI func code entry sym, and
7fe2b9a6
AM
13982 use the func descriptor sym instead if it is
13983 defined. */
ceb1f1ef 13984 if (hash->elf.root.root.string[0] == '.'
8c5b4e52 13985 && hash->oh != NULL)
8387904d 13986 {
8c5b4e52 13987 fdh = ppc_follow_link (hash->oh);
8387904d
AM
13988 if (fdh->elf.root.type == bfd_link_hash_defined
13989 || fdh->elf.root.type == bfd_link_hash_defweak)
13990 {
13991 sym_sec = fdh->elf.root.u.def.section;
13992 sym_value = fdh->elf.root.u.def.value;
13993 if (sym_sec->output_section != NULL)
0a1b45a2 13994 ok_dest = true;
8387904d 13995 }
99877b66
AM
13996 else
13997 fdh = NULL;
8387904d 13998 }
7fe2b9a6
AM
13999 }
14000 else
14001 {
14002 bfd_set_error (bfd_error_bad_value);
14003 goto error_ret_free_internal;
721956f4
AM
14004 }
14005
8843416a 14006 destination = 0;
6911b7dc 14007 local_off = 0;
8843416a
AM
14008 if (ok_dest)
14009 {
14010 sym_value += irela->r_addend;
14011 destination = (sym_value
14012 + sym_sec->output_offset
14013 + sym_sec->output_section->vma);
6911b7dc
AM
14014 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
14015 ? hash->elf.other
14016 : sym->st_other);
8843416a
AM
14017 }
14018
8387904d 14019 code_sec = sym_sec;
e054468f 14020 code_value = sym_value;
74f0fb50
AM
14021 opd = get_opd_info (sym_sec);
14022 if (opd != NULL)
8387904d
AM
14023 {
14024 bfd_vma dest;
14025
74f0fb50 14026 if (hash == NULL && opd->adjust != NULL)
8387904d 14027 {
51aecdc5 14028 long adjust = opd->adjust[OPD_NDX (sym_value)];
8387904d
AM
14029 if (adjust == -1)
14030 continue;
e054468f 14031 code_value += adjust;
8387904d
AM
14032 sym_value += adjust;
14033 }
14034 dest = opd_entry_value (sym_sec, sym_value,
0a1b45a2 14035 &code_sec, &code_value, false);
8387904d
AM
14036 if (dest != (bfd_vma) -1)
14037 {
14038 destination = dest;
14039 if (fdh != NULL)
14040 {
14041 /* Fixup old ABI sym to point at code
14042 entry. */
99877b66 14043 hash->elf.root.type = bfd_link_hash_defweak;
8387904d 14044 hash->elf.root.u.def.section = code_sec;
e054468f 14045 hash->elf.root.u.def.value = code_value;
8387904d
AM
14046 }
14047 }
14048 }
14049
721956f4 14050 /* Determine what (if any) linker stub is needed. */
e054468f 14051 plt_ent = NULL;
7aba54da
AM
14052 stub_type.main = ppc_type_of_stub (section, irela, &hash,
14053 &plt_ent, destination,
14054 local_off);
14055 stub_type.sub = ppc_stub_toc;
14056 stub_type.r2save = 0;
14057
14058 if (r_type == R_PPC64_REL24_NOTOC
14059 || r_type == R_PPC64_REL24_P9NOTOC)
05d0e962 14060 {
7aba54da
AM
14061 enum ppc_stub_sub_type notoc = ppc_stub_notoc;
14062 if (htab->params->power10_stubs == 0
14063 || (r_type == R_PPC64_REL24_P9NOTOC
14064 && htab->params->power10_stubs != 1))
14065 notoc = ppc_stub_p9notoc;
14066 if (stub_type.main == ppc_stub_plt_call)
14067 stub_type.sub = notoc;
14068 else if (stub_type.main == ppc_stub_long_branch
05d0e962
AM
14069 || (code_sec != NULL
14070 && code_sec->output_section != NULL
14071 && (((hash ? hash->elf.other : sym->st_other)
14072 & STO_PPC64_LOCAL_MASK)
4a4e7361 14073 > 1 << STO_PPC64_LOCAL_BIT)))
7aba54da
AM
14074 {
14075 stub_type.main = ppc_stub_long_branch;
14076 stub_type.sub = notoc;
14077 stub_type.r2save = 0;
14078 }
05d0e962 14079 }
7aba54da 14080 else if (stub_type.main != ppc_stub_plt_call)
ad8e1ba5
AM
14081 {
14082 /* Check whether we need a TOC adjusting stub.
14083 Since the linker pastes together pieces from
14084 different object files when creating the
14085 _init and _fini functions, it may be that a
14086 call to what looks like a local sym is in
14087 fact a call needing a TOC adjustment. */
33cb30a1
AM
14088 if ((code_sec != NULL
14089 && code_sec->output_section != NULL
33cb30a1 14090 && (code_sec->has_toc_reloc
918dc783
AM
14091 || code_sec->makes_toc_func_call)
14092 && (htab->sec_info[code_sec->id].toc_off
14093 != htab->sec_info[section->id].toc_off))
33cb30a1
AM
14094 || (((hash ? hash->elf.other : sym->st_other)
14095 & STO_PPC64_LOCAL_MASK)
14096 == 1 << STO_PPC64_LOCAL_BIT))
7aba54da
AM
14097 {
14098 stub_type.main = ppc_stub_long_branch;
14099 stub_type.sub = ppc_stub_toc;
14100 stub_type.r2save = 1;
14101 }
ad8e1ba5
AM
14102 }
14103
7aba54da 14104 if (stub_type.main == ppc_stub_none)
721956f4
AM
14105 continue;
14106
411e1bfb 14107 /* __tls_get_addr calls might be eliminated. */
7aba54da 14108 if (stub_type.main != ppc_stub_plt_call
411e1bfb 14109 && hash != NULL
ed7007c1 14110 && is_tls_get_addr (&hash->elf, htab)
411e1bfb
AM
14111 && section->has_tls_reloc
14112 && irela != internal_relocs)
14113 {
14114 /* Get tls info. */
f961d9dd 14115 unsigned char *tls_mask;
411e1bfb 14116
3a71aa26 14117 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
411e1bfb
AM
14118 irela - 1, input_bfd))
14119 goto error_ret_free_internal;
abc489c6
AM
14120 if ((*tls_mask & TLS_TLS) != 0
14121 && (*tls_mask & (TLS_GD | TLS_LD)) == 0)
411e1bfb
AM
14122 continue;
14123 }
14124
7aba54da
AM
14125 if (stub_type.main == ppc_stub_plt_call
14126 && stub_type.sub == ppc_stub_toc)
794e51c0 14127 {
6e1816be
AM
14128 if (!htab->opd_abi
14129 && htab->params->plt_localentry0 != 0
14130 && is_elfv2_localentry0 (&hash->elf))
14131 htab->has_plt_localentry0 = 1;
14132 else if (irela + 1 < irelaend
14133 && irela[1].r_offset == irela->r_offset + 4
14134 && (ELF64_R_TYPE (irela[1].r_info)
14135 == R_PPC64_TOCSAVE))
f378ab09
AM
14136 {
14137 if (!tocsave_find (htab, INSERT,
14138 &local_syms, irela + 1, input_bfd))
14139 goto error_ret_free_internal;
14140 }
f378ab09 14141 else
7aba54da 14142 stub_type.r2save = 1;
794e51c0 14143 }
3b421ab3 14144
721956f4 14145 /* Support for grouping stub sections. */
6f20ed8a 14146 id_sec = htab->sec_info[section->id].u.group->link_sec;
721956f4
AM
14147
14148 /* Get the name of this stub. */
14149 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
14150 if (!stub_name)
14151 goto error_ret_free_internal;
14152
14153 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
0a1b45a2 14154 stub_name, false, false);
721956f4
AM
14155 if (stub_entry != NULL)
14156 {
721956f4 14157 free (stub_name);
7aba54da 14158 if (!ppc_merge_stub (htab, stub_entry, stub_type, r_type))
e10a07b3 14159 {
7aba54da
AM
14160 /* xgettext:c-format */
14161 _bfd_error_handler
14162 (_("%pB: cannot create stub entry %s"),
14163 section->owner, stub_entry->root.string);
14164 goto error_ret_free_internal;
e10a07b3 14165 }
721956f4
AM
14166 continue;
14167 }
14168
25f53a85 14169 stub_entry = ppc_add_stub (stub_name, section, info);
721956f4
AM
14170 if (stub_entry == NULL)
14171 {
14172 free (stub_name);
6cdc0ccc
AM
14173 error_ret_free_internal:
14174 if (elf_section_data (section)->relocs == NULL)
14175 free (internal_relocs);
14176 error_ret_free_local:
c9594989
AM
14177 if (symtab_hdr->contents
14178 != (unsigned char *) local_syms)
6cdc0ccc 14179 free (local_syms);
0a1b45a2 14180 return false;
721956f4
AM
14181 }
14182
7aba54da
AM
14183 stub_entry->type = stub_type;
14184 if (stub_type.main == ppc_stub_plt_call)
e054468f 14185 {
05d0e962
AM
14186 stub_entry->target_value = sym_value;
14187 stub_entry->target_section = sym_sec;
e054468f
AM
14188 }
14189 else
14190 {
05d0e962
AM
14191 stub_entry->target_value = code_value;
14192 stub_entry->target_section = code_sec;
e054468f 14193 }
721956f4 14194 stub_entry->h = hash;
e054468f 14195 stub_entry->plt_ent = plt_ent;
2d7ad24e
AM
14196 stub_entry->symtype
14197 = hash ? hash->elf.type : ELF_ST_TYPE (sym->st_info);
6911b7dc 14198 stub_entry->other = hash ? hash->elf.other : sym->st_other;
ee75fd95 14199
3d58e1fc
AM
14200 if (hash != NULL
14201 && (hash->elf.root.type == bfd_link_hash_defined
14202 || hash->elf.root.type == bfd_link_hash_defweak))
ee75fd95 14203 htab->stub_globals += 1;
721956f4
AM
14204 }
14205
14206 /* We're done with the internal relocs, free them. */
6cdc0ccc 14207 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 14208 free (internal_relocs);
721956f4 14209 }
6cdc0ccc
AM
14210
14211 if (local_syms != NULL
14212 && symtab_hdr->contents != (unsigned char *) local_syms)
14213 {
14214 if (!info->keep_memory)
14215 free (local_syms);
14216 else
14217 symtab_hdr->contents = (unsigned char *) local_syms;
14218 }
721956f4
AM
14219 }
14220
5c3dead3 14221 /* We may have added some stubs. Find out the new size of the
721956f4 14222 stub sections. */
d4aaa2a0 14223 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
14224 {
14225 group->lr_restore = 0;
14226 group->eh_size = 0;
14227 if (group->stub_sec != NULL)
14228 {
14229 asection *stub_sec = group->stub_sec;
14230
9ff8aa7d 14231 stub_sec->rawsize = stub_sec->size;
df136d64
AM
14232 stub_sec->size = 0;
14233 stub_sec->reloc_count = 0;
14234 stub_sec->flags &= ~SEC_RELOC;
14235 }
14236 }
a804e476
AM
14237 if (htab->tga_group != NULL)
14238 {
14239 /* See emit_tga_desc and emit_tga_desc_eh_frame. */
14240 htab->tga_group->eh_size
14241 = 1 + 2 + (htab->opd_abi != 0) + 3 + 8 * 2 + 3 + 8 + 3;
14242 htab->tga_group->lr_restore = 23 * 4;
14243 htab->tga_group->stub_sec->size = 24 * 4;
14244 }
eea6121a 14245
9ff8aa7d 14246 htab->brlt->rawsize = htab->brlt->size;
eea6121a 14247 htab->brlt->size = 0;
84f5d08e
AM
14248 htab->brlt->reloc_count = 0;
14249 htab->brlt->flags &= ~SEC_RELOC;
ee75fd95 14250 if (htab->relbrlt != NULL)
eea6121a 14251 htab->relbrlt->size = 0;
721956f4 14252
1657026c
AM
14253 if (htab->elf.srelrdyn != NULL)
14254 {
9ff8aa7d 14255 htab->elf.srelrdyn->rawsize = htab->elf.srelrdyn->size;
1657026c
AM
14256 htab->elf.srelrdyn->size = 0;
14257 }
14258
0441f94f 14259 htab->stub_changed = false;
ecc741e6 14260 htab->stub_id = 0;
63bc6f6c 14261 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4 14262
a4b6fadd
AM
14263 for (group = htab->group; group != NULL; group = group->next)
14264 if (group->needs_save_res)
14265 group->stub_sec->size += htab->sfpr->size;
14266
176a0d42
AM
14267 if (info->emitrelocations
14268 && htab->glink != NULL && htab->glink->size != 0)
14269 {
14270 htab->glink->reloc_count = 1;
14271 htab->glink->flags |= SEC_RELOC;
14272 }
14273
58d180e8
AM
14274 if (htab->glink_eh_frame != NULL
14275 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
2d0d44d5 14276 && htab->glink_eh_frame->output_section->size > 8)
58d180e8 14277 {
2e0ce1c8 14278 size_t size = 0, align = 4;
58d180e8 14279
d4aaa2a0 14280 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
14281 if (group->eh_size != 0)
14282 size += (group->eh_size + 17 + align - 1) & -align;
58d180e8 14283 if (htab->glink != NULL && htab->glink->size != 0)
2e0ce1c8 14284 size += (24 + align - 1) & -align;
58d180e8 14285 if (size != 0)
2e0ce1c8
AM
14286 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
14287 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
14288 size = (size + align - 1) & -align;
58d180e8
AM
14289 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
14290 htab->glink_eh_frame->size = size;
14291 }
14292
e7d1c40c 14293 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
14294 for (group = htab->group; group != NULL; group = group->next)
14295 if (group->stub_sec != NULL)
691d2e9a
AM
14296 {
14297 int align = abs (htab->params->plt_stub_align);
14298 group->stub_sec->size
14299 = (group->stub_sec->size + (1 << align) - 1) & -(1 << align);
14300 }
d4aaa2a0 14301
1657026c
AM
14302 if (htab->elf.srelrdyn != NULL)
14303 {
14304 bfd_vma r_offset;
14305
14306 for (r_offset = 0; r_offset < htab->brlt->size; r_offset += 8)
0aac2413 14307 if (!append_relr_off (htab, htab->brlt, r_offset))
1657026c
AM
14308 return false;
14309
14310 if (!got_and_plt_relr_for_local_syms (info))
14311 return false;
14312 elf_link_hash_traverse (&htab->elf, got_and_plt_relr, info);
14313 if (htab->stub_error)
14314 return false;
14315
0aac2413
AM
14316 bfd_vma *relr_addr = sort_relr (htab);
14317 if (htab->relr_count != 0 && relr_addr == NULL)
14318 return false;
1657026c
AM
14319
14320 size_t i = 0;
14321 while (i < htab->relr_count)
14322 {
0aac2413 14323 bfd_vma base = relr_addr[i];
1657026c
AM
14324 htab->elf.srelrdyn->size += 8;
14325 i++;
14326 /* Handle possible duplicate address. This can happen
14327 as sections increase in size when adding stubs. */
14328 while (i < htab->relr_count
0aac2413 14329 && relr_addr[i] == base)
1657026c
AM
14330 i++;
14331 base += 8;
14332 while (1)
14333 {
14334 size_t start_i = i;
14335 while (i < htab->relr_count
0aac2413
AM
14336 && relr_addr[i] - base < 63 * 8
14337 && (relr_addr[i] - base) % 8 == 0)
1657026c
AM
14338 i++;
14339 if (i == start_i)
14340 break;
14341 htab->elf.srelrdyn->size += 8;
14342 base += 63 * 8;
14343 }
14344 }
0aac2413 14345 free (relr_addr);
1657026c
AM
14346 }
14347
d4aaa2a0
AM
14348 for (group = htab->group; group != NULL; group = group->next)
14349 if (group->stub_sec != NULL
14350 && group->stub_sec->rawsize != group->stub_sec->size
c9301e31 14351 && (htab->stub_iteration <= STUB_SHRINK_ITER
d4aaa2a0 14352 || group->stub_sec->rawsize < group->stub_sec->size))
5c3dead3
AM
14353 break;
14354
d4aaa2a0 14355 if (group == NULL
0441f94f
AM
14356 && (!htab->stub_changed
14357 || htab->stub_iteration > STUB_SHRINK_ITER)
ba21f564
AM
14358 && (htab->brlt->rawsize == htab->brlt->size
14359 || (htab->stub_iteration > STUB_SHRINK_ITER
14360 && htab->brlt->rawsize > htab->brlt->size))
1657026c
AM
14361 && (htab->elf.srelrdyn == NULL
14362 || htab->elf.srelrdyn->rawsize == htab->elf.srelrdyn->size
14363 || (htab->stub_iteration > STUB_SHRINK_ITER
14364 && htab->elf.srelrdyn->rawsize > htab->elf.srelrdyn->size))
58d180e8 14365 && (htab->glink_eh_frame == NULL
a804e476
AM
14366 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size)
14367 && (htab->tga_group == NULL
14368 || htab->stub_iteration > 1))
5c3dead3
AM
14369 break;
14370
9ff8aa7d
AM
14371 if (htab->stub_iteration > STUB_SHRINK_ITER)
14372 {
14373 for (group = htab->group; group != NULL; group = group->next)
14374 if (group->stub_sec != NULL
14375 && group->stub_sec->size < group->stub_sec->rawsize)
14376 group->stub_sec->size = group->stub_sec->rawsize;
14377
14378 if (htab->brlt->size < htab->brlt->rawsize)
14379 htab->brlt->size = htab->brlt->rawsize;
14380
14381 if (htab->elf.srelrdyn != NULL
14382 && htab->elf.srelrdyn->size < htab->elf.srelrdyn->rawsize)
14383 htab->elf.srelrdyn->size = htab->elf.srelrdyn->rawsize;
14384 }
14385
721956f4 14386 /* Ask the linker to do its stuff. */
e7d1c40c 14387 (*htab->params->layout_sections_again) ();
721956f4
AM
14388 }
14389
da44f4e5
AM
14390 if (htab->glink_eh_frame != NULL
14391 && htab->glink_eh_frame->size != 0)
14392 {
14393 bfd_vma val;
14394 bfd_byte *p, *last_fde;
14395 size_t last_fde_len, size, align, pad;
d4aaa2a0 14396 struct map_stub *group;
da44f4e5 14397
df136d64
AM
14398 /* It is necessary to at least have a rough outline of the
14399 linker generated CIEs and FDEs written before
14400 bfd_elf_discard_info is run, in order for these FDEs to be
14401 indexed in .eh_frame_hdr. */
da44f4e5
AM
14402 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
14403 if (p == NULL)
0a1b45a2 14404 return false;
da44f4e5
AM
14405 htab->glink_eh_frame->contents = p;
14406 last_fde = p;
2e0ce1c8 14407 align = 4;
da44f4e5
AM
14408
14409 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
14410 /* CIE length (rewrite in case little-endian). */
2e0ce1c8 14411 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4;
da44f4e5 14412 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
2e0ce1c8 14413 p += last_fde_len + 4;
da44f4e5 14414
d4aaa2a0 14415 for (group = htab->group; group != NULL; group = group->next)
df136d64 14416 if (group->eh_size != 0)
da44f4e5 14417 {
df136d64 14418 group->eh_base = p - htab->glink_eh_frame->contents;
da44f4e5 14419 last_fde = p;
df136d64 14420 last_fde_len = ((group->eh_size + 17 + align - 1) & -align) - 4;
da44f4e5 14421 /* FDE length. */
2e0ce1c8 14422 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
14423 p += 4;
14424 /* CIE pointer. */
14425 val = p - htab->glink_eh_frame->contents;
14426 bfd_put_32 (htab->elf.dynobj, val, p);
14427 p += 4;
14428 /* Offset to stub section, written later. */
14429 p += 4;
14430 /* stub section size. */
d4aaa2a0 14431 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p);
da44f4e5
AM
14432 p += 4;
14433 /* Augmentation. */
14434 p += 1;
df136d64
AM
14435 /* Make sure we don't have all nops. This is enough for
14436 elf-eh-frame.c to detect the last non-nop opcode. */
14437 p[group->eh_size - 1] = DW_CFA_advance_loc + 1;
d4aaa2a0 14438 p = last_fde + last_fde_len + 4;
da44f4e5
AM
14439 }
14440 if (htab->glink != NULL && htab->glink->size != 0)
14441 {
14442 last_fde = p;
2e0ce1c8 14443 last_fde_len = ((24 + align - 1) & -align) - 4;
da44f4e5 14444 /* FDE length. */
2e0ce1c8 14445 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
da44f4e5
AM
14446 p += 4;
14447 /* CIE pointer. */
14448 val = p - htab->glink_eh_frame->contents;
14449 bfd_put_32 (htab->elf.dynobj, val, p);
14450 p += 4;
14451 /* Offset to .glink, written later. */
14452 p += 4;
14453 /* .glink size. */
14454 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
14455 p += 4;
14456 /* Augmentation. */
14457 p += 1;
14458
3cd7c7d7 14459 *p++ = DW_CFA_advance_loc + (htab->has_plt_localentry0 ? 3 : 2);
da44f4e5
AM
14460 *p++ = DW_CFA_register;
14461 *p++ = 65;
9f08fa5c 14462 *p++ = htab->opd_abi ? 12 : 0;
3cd7c7d7 14463 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 4 : 2);
da44f4e5
AM
14464 *p++ = DW_CFA_restore_extended;
14465 *p++ = 65;
2e0ce1c8 14466 p += ((24 + align - 1) & -align) - 24;
da44f4e5
AM
14467 }
14468 /* Subsume any padding into the last FDE if user .eh_frame
14469 sections are aligned more than glink_eh_frame. Otherwise any
14470 zero padding will be seen as a terminator. */
2e0ce1c8 14471 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
da44f4e5 14472 size = p - htab->glink_eh_frame->contents;
2e0ce1c8 14473 pad = ((size + align - 1) & -align) - size;
da44f4e5
AM
14474 htab->glink_eh_frame->size = size + pad;
14475 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
14476 }
14477
d969d15f 14478 maybe_strip_output (info, htab->brlt);
2efec98b
AM
14479 if (htab->relbrlt != NULL)
14480 maybe_strip_output (info, htab->relbrlt);
d969d15f
AM
14481 if (htab->glink_eh_frame != NULL)
14482 maybe_strip_output (info, htab->glink_eh_frame);
1657026c
AM
14483 if (htab->elf.srelrdyn != NULL)
14484 maybe_strip_output (info, htab->elf.srelrdyn);
721956f4 14485
0a1b45a2 14486 return true;
721956f4
AM
14487}
14488
14489/* Called after we have determined section placement. If sections
805fc799 14490 move, we'll be called again. Provide a value for TOCstart. */
721956f4 14491
805fc799 14492bfd_vma
1c865ab2 14493ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
721956f4 14494{
805fc799 14495 asection *s;
a27e685f 14496 bfd_vma TOCstart, adjust;
721956f4 14497
43417696
AM
14498 if (info != NULL)
14499 {
14500 struct elf_link_hash_entry *h;
14501 struct elf_link_hash_table *htab = elf_hash_table (info);
14502
2cc15b10 14503 if (is_elf_hash_table (&htab->root)
43417696
AM
14504 && htab->hgot != NULL)
14505 h = htab->hgot;
14506 else
14507 {
2cc15b10
AM
14508 h = (struct elf_link_hash_entry *)
14509 bfd_link_hash_lookup (&htab->root, ".TOC.", false, false, true);
14510 if (is_elf_hash_table (&htab->root))
43417696
AM
14511 htab->hgot = h;
14512 }
14513 if (h != NULL
14514 && h->root.type == bfd_link_hash_defined
14515 && !h->root.linker_def
2cc15b10 14516 && (!is_elf_hash_table (&htab->root)
43417696
AM
14517 || h->def_regular))
14518 {
ed7007c1 14519 TOCstart = defined_sym_val (h) - TOC_BASE_OFF;
43417696
AM
14520 _bfd_set_gp_value (obfd, TOCstart);
14521 return TOCstart;
14522 }
14523 }
14524
805fc799
AM
14525 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
14526 order. The TOC starts where the first of these sections starts. */
14527 s = bfd_get_section_by_name (obfd, ".got");
e054468f 14528 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 14529 s = bfd_get_section_by_name (obfd, ".toc");
e054468f 14530 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 14531 s = bfd_get_section_by_name (obfd, ".tocbss");
e054468f 14532 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799 14533 s = bfd_get_section_by_name (obfd, ".plt");
e054468f 14534 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
805fc799
AM
14535 {
14536 /* This may happen for
14537 o references to TOC base (SYM@toc / TOC[tc0]) without a
14538 .toc directive
14539 o bad linker script
14540 o --gc-sections and empty TOC sections
14541
14542 FIXME: Warn user? */
14543
14544 /* Look for a likely section. We probably won't even be
14545 using TOCstart. */
14546 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
14547 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
14548 | SEC_EXCLUDE))
805fc799
AM
14549 == (SEC_ALLOC | SEC_SMALL_DATA))
14550 break;
721956f4 14551 if (s == NULL)
805fc799 14552 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 14553 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
805fc799
AM
14554 == (SEC_ALLOC | SEC_SMALL_DATA))
14555 break;
721956f4 14556 if (s == NULL)
805fc799 14557 for (s = obfd->sections; s != NULL; s = s->next)
e054468f
AM
14558 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
14559 == SEC_ALLOC)
805fc799 14560 break;
721956f4 14561 if (s == NULL)
805fc799 14562 for (s = obfd->sections; s != NULL; s = s->next)
e054468f 14563 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
805fc799
AM
14564 break;
14565 }
721956f4 14566
805fc799
AM
14567 TOCstart = 0;
14568 if (s != NULL)
14569 TOCstart = s->output_section->vma + s->output_offset;
721956f4 14570
a27e685f
AM
14571 /* Force alignment. */
14572 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
14573 TOCstart -= adjust;
1c865ab2
AM
14574 _bfd_set_gp_value (obfd, TOCstart);
14575
810d4e75 14576 if (info != NULL && s != NULL)
1c865ab2
AM
14577 {
14578 struct ppc_link_hash_table *htab = ppc_hash_table (info);
14579
810d4e75
AM
14580 if (htab != NULL)
14581 {
14582 if (htab->elf.hgot != NULL)
14583 {
a27e685f 14584 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
810d4e75
AM
14585 htab->elf.hgot->root.u.def.section = s;
14586 }
14587 }
14588 else
1c865ab2 14589 {
810d4e75
AM
14590 struct bfd_link_hash_entry *bh = NULL;
14591 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
a27e685f 14592 s, TOC_BASE_OFF - adjust,
0a1b45a2 14593 NULL, false, false, &bh);
1c865ab2
AM
14594 }
14595 }
805fc799 14596 return TOCstart;
721956f4
AM
14597}
14598
a345bc8d 14599/* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
49c09209 14600 write out any global entry stubs, and PLT relocations. */
a345bc8d 14601
0a1b45a2 14602static bool
49c09209 14603build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf)
a345bc8d
AM
14604{
14605 struct bfd_link_info *info;
14606 struct ppc_link_hash_table *htab;
49c09209 14607 struct plt_entry *ent;
a345bc8d
AM
14608 asection *s;
14609
14610 if (h->root.type == bfd_link_hash_indirect)
0a1b45a2 14611 return true;
a345bc8d 14612
49c09209
AM
14613 info = inf;
14614 htab = ppc_hash_table (info);
14615 if (htab == NULL)
0a1b45a2 14616 return false;
49c09209
AM
14617
14618 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
14619 if (ent->plt.offset != (bfd_vma) -1)
14620 {
14621 /* This symbol has an entry in the procedure linkage
14622 table. Set it up. */
14623 Elf_Internal_Rela rela;
2d7ad24e 14624 asection *plt, *relplt;
49c09209
AM
14625 bfd_byte *loc;
14626
30845f11 14627 if (use_local_plt (info, h))
49c09209
AM
14628 {
14629 if (!(h->def_regular
14630 && (h->root.type == bfd_link_hash_defined
14631 || h->root.type == bfd_link_hash_defweak)))
14632 continue;
2d7ad24e
AM
14633 if (h->type == STT_GNU_IFUNC)
14634 {
14635 plt = htab->elf.iplt;
14636 relplt = htab->elf.irelplt;
0a1b45a2 14637 htab->elf.ifunc_resolvers = true;
2d7ad24e
AM
14638 if (htab->opd_abi)
14639 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
14640 else
14641 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14642 }
49c09209 14643 else
2d7ad24e
AM
14644 {
14645 plt = htab->pltlocal;
1657026c
AM
14646 relplt = NULL;
14647 if (bfd_link_pic (info)
14648 && !(info->enable_dt_relr && !htab->opd_abi))
2d7ad24e
AM
14649 {
14650 relplt = htab->relpltlocal;
14651 if (htab->opd_abi)
14652 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
14653 else
14654 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14655 }
2d7ad24e 14656 }
ed7007c1 14657 rela.r_addend = defined_sym_val (h) + ent->addend;
2d7ad24e
AM
14658
14659 if (relplt == NULL)
14660 {
14661 loc = plt->contents + ent->plt.offset;
14662 bfd_put_64 (info->output_bfd, rela.r_addend, loc);
14663 if (htab->opd_abi)
14664 {
14665 bfd_vma toc = elf_gp (info->output_bfd);
14666 toc += htab->sec_info[h->root.u.def.section->id].toc_off;
14667 bfd_put_64 (info->output_bfd, toc, loc + 8);
14668 }
14669 }
14670 else
14671 {
14672 rela.r_offset = (plt->output_section->vma
14673 + plt->output_offset
14674 + ent->plt.offset);
066c738e
AM
14675 BFD_ASSERT (count_and_swap_reloc_out (info->output_bfd, &rela,
14676 relplt));
2d7ad24e 14677 }
49c09209
AM
14678 }
14679 else
14680 {
14681 rela.r_offset = (htab->elf.splt->output_section->vma
14682 + htab->elf.splt->output_offset
14683 + ent->plt.offset);
14684 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
14685 rela.r_addend = ent->addend;
14686 loc = (htab->elf.srelplt->contents
14687 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
14688 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
14689 if (h->type == STT_GNU_IFUNC && is_static_defined (h))
0a1b45a2 14690 htab->elf.ifunc_resolvers = true;
066c738e
AM
14691 BFD_ASSERT (swap_reloc_out (info->output_bfd, &rela,
14692 loc, htab->elf.srelplt));
49c09209 14693 }
49c09209
AM
14694 }
14695
a345bc8d 14696 if (!h->pointer_equality_needed)
0a1b45a2 14697 return true;
a345bc8d
AM
14698
14699 if (h->def_regular)
0a1b45a2 14700 return true;
a345bc8d 14701
9e390558 14702 s = htab->global_entry;
49c09209 14703 if (s == NULL || s->size == 0)
0a1b45a2 14704 return true;
49c09209
AM
14705
14706 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
14707 if (ent->plt.offset != (bfd_vma) -1
14708 && ent->addend == 0)
a345bc8d
AM
14709 {
14710 bfd_byte *p;
14711 asection *plt;
14712 bfd_vma off;
14713
a345bc8d 14714 p = s->contents + h->root.u.def.value;
33e44f2e 14715 plt = htab->elf.splt;
30845f11 14716 if (use_local_plt (info, h))
2d7ad24e
AM
14717 {
14718 if (h->type == STT_GNU_IFUNC)
14719 plt = htab->elf.iplt;
14720 else
14721 plt = htab->pltlocal;
14722 }
49c09209 14723 off = ent->plt.offset + plt->output_offset + plt->output_section->vma;
a345bc8d
AM
14724 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
14725
14726 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
14727 {
14728 info->callbacks->einfo
c1c8c1ef 14729 (_("%P: linkage table error against `%pT'\n"),
a345bc8d
AM
14730 h->root.root.string);
14731 bfd_set_error (bfd_error_bad_value);
0a1b45a2 14732 htab->stub_error = true;
a345bc8d
AM
14733 }
14734
7341d5e2
AM
14735 htab->stub_count[ppc_stub_global_entry - 1] += 1;
14736 if (htab->params->emit_stub_syms)
14737 {
14738 size_t len = strlen (h->root.root.string);
14739 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
14740
14741 if (name == NULL)
0a1b45a2 14742 return false;
7341d5e2
AM
14743
14744 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
0a1b45a2 14745 h = elf_link_hash_lookup (&htab->elf, name, true, false, false);
7341d5e2 14746 if (h == NULL)
0a1b45a2 14747 return false;
7341d5e2
AM
14748 if (h->root.type == bfd_link_hash_new)
14749 {
14750 h->root.type = bfd_link_hash_defined;
14751 h->root.u.def.section = s;
14752 h->root.u.def.value = p - s->contents;
14753 h->ref_regular = 1;
14754 h->def_regular = 1;
14755 h->ref_regular_nonweak = 1;
14756 h->forced_local = 1;
14757 h->non_elf = 0;
2ec55de3 14758 h->root.linker_def = 1;
7341d5e2
AM
14759 }
14760 }
14761
a345bc8d
AM
14762 if (PPC_HA (off) != 0)
14763 {
14764 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
14765 p += 4;
14766 }
14767 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
14768 p += 4;
14769 bfd_put_32 (s->owner, MTCTR_R12, p);
14770 p += 4;
407aa07c 14771 bfd_put_32 (s->owner, BCTR, p);
a345bc8d
AM
14772 break;
14773 }
0a1b45a2 14774 return true;
a345bc8d
AM
14775}
14776
49c09209
AM
14777/* Write PLT relocs for locals. */
14778
0a1b45a2 14779static bool
49c09209
AM
14780write_plt_relocs_for_local_syms (struct bfd_link_info *info)
14781{
14782 struct ppc_link_hash_table *htab = ppc_hash_table (info);
14783 bfd *ibfd;
14784
14785 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
14786 {
14787 struct got_entry **lgot_ents, **end_lgot_ents;
14788 struct plt_entry **local_plt, **lplt, **end_local_plt;
14789 Elf_Internal_Shdr *symtab_hdr;
14790 bfd_size_type locsymcount;
14791 Elf_Internal_Sym *local_syms = NULL;
14792 struct plt_entry *ent;
14793
14794 if (!is_ppc64_elf (ibfd))
14795 continue;
14796
14797 lgot_ents = elf_local_got_ents (ibfd);
14798 if (!lgot_ents)
14799 continue;
14800
14801 symtab_hdr = &elf_symtab_hdr (ibfd);
14802 locsymcount = symtab_hdr->sh_info;
14803 end_lgot_ents = lgot_ents + locsymcount;
14804 local_plt = (struct plt_entry **) end_lgot_ents;
14805 end_local_plt = local_plt + locsymcount;
14806 for (lplt = local_plt; lplt < end_local_plt; ++lplt)
14807 for (ent = *lplt; ent != NULL; ent = ent->next)
14808 if (ent->plt.offset != (bfd_vma) -1)
14809 {
14810 Elf_Internal_Sym *sym;
14811 asection *sym_sec;
14812 asection *plt, *relplt;
49c09209 14813 bfd_vma val;
49c09209
AM
14814
14815 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
14816 lplt - local_plt, ibfd))
14817 {
c9594989 14818 if (symtab_hdr->contents != (unsigned char *) local_syms)
49c09209 14819 free (local_syms);
0a1b45a2 14820 return false;
49c09209
AM
14821 }
14822
14823 val = sym->st_value + ent->addend;
49c09209
AM
14824 if (sym_sec != NULL && sym_sec->output_section != NULL)
14825 val += sym_sec->output_offset + sym_sec->output_section->vma;
14826
2d7ad24e
AM
14827 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14828 {
0a1b45a2 14829 htab->elf.ifunc_resolvers = true;
2d7ad24e
AM
14830 plt = htab->elf.iplt;
14831 relplt = htab->elf.irelplt;
14832 }
14833 else
14834 {
14835 plt = htab->pltlocal;
1657026c
AM
14836 relplt = NULL;
14837 if (bfd_link_pic (info)
14838 && !(info->enable_dt_relr && !htab->opd_abi))
14839 relplt = htab->relpltlocal;
2d7ad24e 14840 }
49c09209 14841
2d7ad24e
AM
14842 if (relplt == NULL)
14843 {
066c738e 14844 bfd_byte *loc = plt->contents + ent->plt.offset;
2d7ad24e
AM
14845 bfd_put_64 (info->output_bfd, val, loc);
14846 if (htab->opd_abi)
14847 {
14848 bfd_vma toc = elf_gp (ibfd);
14849 bfd_put_64 (info->output_bfd, toc, loc + 8);
14850 }
14851 }
49c09209 14852 else
2d7ad24e
AM
14853 {
14854 Elf_Internal_Rela rela;
14855 rela.r_offset = (ent->plt.offset
14856 + plt->output_offset
14857 + plt->output_section->vma);
14858 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14859 {
14860 if (htab->opd_abi)
14861 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
14862 else
14863 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14864 }
14865 else
14866 {
14867 if (htab->opd_abi)
14868 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
14869 else
14870 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14871 }
14872 rela.r_addend = val;
066c738e
AM
14873 BFD_ASSERT (count_and_swap_reloc_out (info->output_bfd,
14874 &rela, relplt));
2d7ad24e 14875 }
49c09209
AM
14876 }
14877
14878 if (local_syms != NULL
14879 && symtab_hdr->contents != (unsigned char *) local_syms)
14880 {
14881 if (!info->keep_memory)
14882 free (local_syms);
14883 else
14884 symtab_hdr->contents = (unsigned char *) local_syms;
14885 }
14886 }
0a1b45a2 14887 return true;
49c09209
AM
14888}
14889
a804e476
AM
14890/* Emit the static wrapper function preserving registers around a
14891 __tls_get_addr_opt call. */
14892
0a1b45a2 14893static bool
a804e476
AM
14894emit_tga_desc (struct ppc_link_hash_table *htab)
14895{
14896 asection *stub_sec = htab->tga_group->stub_sec;
14897 unsigned int cfa_updt = 11 * 4;
14898 bfd_byte *p;
14899 bfd_vma to, from, delta;
14900
14901 BFD_ASSERT (htab->tga_desc_fd->elf.root.type == bfd_link_hash_defined
14902 && htab->tga_desc_fd->elf.root.u.def.section == stub_sec
14903 && htab->tga_desc_fd->elf.root.u.def.value == 0);
14904 to = defined_sym_val (&htab->tls_get_addr_fd->elf);
14905 from = defined_sym_val (&htab->tga_desc_fd->elf) + cfa_updt;
14906 delta = to - from;
14907 if (delta + (1 << 25) >= 1 << 26)
14908 {
14909 _bfd_error_handler (_("__tls_get_addr call offset overflow"));
0a1b45a2
AM
14910 htab->stub_error = true;
14911 return false;
a804e476
AM
14912 }
14913
14914 p = stub_sec->contents;
14915 p = tls_get_addr_prologue (htab->elf.dynobj, p, htab);
14916 bfd_put_32 (stub_sec->owner, B_DOT | 1 | (delta & 0x3fffffc), p);
14917 p += 4;
14918 p = tls_get_addr_epilogue (htab->elf.dynobj, p, htab);
14919 return stub_sec->size == (bfd_size_type) (p - stub_sec->contents);
14920}
14921
14922/* Emit eh_frame describing the static wrapper function. */
14923
14924static bfd_byte *
14925emit_tga_desc_eh_frame (struct ppc_link_hash_table *htab, bfd_byte *p)
14926{
14927 unsigned int cfa_updt = 11 * 4;
14928 unsigned int i;
14929
14930 *p++ = DW_CFA_advance_loc + cfa_updt / 4;
14931 *p++ = DW_CFA_def_cfa_offset;
14932 if (htab->opd_abi)
14933 {
14934 *p++ = 128;
14935 *p++ = 1;
14936 }
14937 else
14938 *p++ = 96;
14939 *p++ = DW_CFA_offset_extended_sf;
14940 *p++ = 65;
14941 *p++ = (-16 / 8) & 0x7f;
14942 for (i = 4; i < 12; i++)
14943 {
14944 *p++ = DW_CFA_offset + i;
14945 *p++ = (htab->opd_abi ? 13 : 12) - i;
14946 }
14947 *p++ = DW_CFA_advance_loc + 10;
14948 *p++ = DW_CFA_def_cfa_offset;
14949 *p++ = 0;
14950 for (i = 4; i < 12; i++)
14951 *p++ = DW_CFA_restore + i;
14952 *p++ = DW_CFA_advance_loc + 2;
14953 *p++ = DW_CFA_restore_extended;
14954 *p++ = 65;
14955 return p;
14956}
14957
721956f4
AM
14958/* Build all the stubs associated with the current output file.
14959 The stubs are kept in a hash table attached to the main linker
14960 hash table. This function is called via gldelf64ppc_finish. */
14961
0a1b45a2 14962bool
e7d1c40c 14963ppc64_elf_build_stubs (struct bfd_link_info *info,
4ce794b7 14964 char **stats)
5d1634d7
AM
14965{
14966 struct ppc_link_hash_table *htab = ppc_hash_table (info);
a4b6fadd 14967 struct map_stub *group;
721956f4 14968 asection *stub_sec;
5d1634d7 14969 bfd_byte *p;
e717da7e 14970 int stub_sec_count = 0;
5d1634d7 14971
4dfe6ac6 14972 if (htab == NULL)
0a1b45a2 14973 return false;
4dfe6ac6 14974
eea6121a 14975 /* Allocate memory to hold the linker stubs. */
d4aaa2a0 14976 for (group = htab->group; group != NULL; group = group->next)
df136d64
AM
14977 {
14978 group->eh_size = 0;
14979 group->lr_restore = 0;
14980 if ((stub_sec = group->stub_sec) != NULL
14981 && stub_sec->size != 0)
14982 {
14983 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd,
14984 stub_sec->size);
14985 if (stub_sec->contents == NULL)
0a1b45a2 14986 return false;
df136d64
AM
14987 stub_sec->size = 0;
14988 }
14989 }
5d1634d7 14990
23eb7e01 14991 if (htab->glink != NULL && htab->glink->size != 0)
5d1634d7 14992 {
9f951329 14993 unsigned int indx;
ad8e1ba5 14994 bfd_vma plt0;
9f951329 14995
721956f4 14996 /* Build the .glink plt call stub. */
e7d1c40c 14997 if (htab->params->emit_stub_syms)
97b639ba
AM
14998 {
14999 struct elf_link_hash_entry *h;
468392fb 15000 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
0a1b45a2 15001 true, false, false);
97b639ba 15002 if (h == NULL)
0a1b45a2 15003 return false;
97b639ba
AM
15004 if (h->root.type == bfd_link_hash_new)
15005 {
15006 h->root.type = bfd_link_hash_defined;
15007 h->root.u.def.section = htab->glink;
ee4bf8d2 15008 h->root.u.def.value = 8;
f5385ebf
AM
15009 h->ref_regular = 1;
15010 h->def_regular = 1;
15011 h->ref_regular_nonweak = 1;
15012 h->forced_local = 1;
15013 h->non_elf = 0;
2ec55de3 15014 h->root.linker_def = 1;
97b639ba
AM
15015 }
15016 }
33e44f2e
AM
15017 plt0 = (htab->elf.splt->output_section->vma
15018 + htab->elf.splt->output_offset
15019 - 16);
176a0d42
AM
15020 if (info->emitrelocations)
15021 {
15022 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
15023 if (r == NULL)
0a1b45a2 15024 return false;
176a0d42
AM
15025 r->r_offset = (htab->glink->output_offset
15026 + htab->glink->output_section->vma);
15027 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
15028 r->r_addend = plt0;
15029 }
4ce794b7 15030 p = htab->glink->contents;
176a0d42 15031 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
ee4bf8d2
AM
15032 bfd_put_64 (htab->glink->owner, plt0, p);
15033 p += 8;
b9e5796b
AM
15034 if (htab->opd_abi)
15035 {
15036 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
15037 p += 4;
15038 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
15039 p += 4;
15040 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
15041 p += 4;
15042 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
15043 p += 4;
15044 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
15045 p += 4;
15046 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
15047 p += 4;
15048 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
15049 p += 4;
15050 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
15051 p += 4;
15052 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
15053 p += 4;
15054 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
15055 p += 4;
15056 }
15057 else
15058 {
3cd7c7d7
AM
15059 unsigned int insn;
15060
15061 /* 0:
15062 . .quad plt0-1f # plt0 entry relative to 1:
15063 #
15064 # We get here with r12 initially @ a glink branch
15065 # Load the address of _dl_runtime_resolve from plt0 and
15066 # jump to it, with r0 set to the index of the PLT entry
15067 # to be resolved and r11 the link map.
15068 __glink_PLTresolve:
15069 . std %r2,24(%r1) # optional
15070 . mflr %r0
15071 . bcl 20,31,1f
15072 1:
15073 . mflr %r11
15074 . mtlr %r0
15075 . ld %r0,(0b-1b)(%r11)
15076 . sub %r12,%r12,%r11
15077 . add %r11,%r0,%r11
15078 . addi %r0,%r12,1b-2f
15079 . ld %r12,0(%r11)
15080 . srdi %r0,%r0,2
15081 . mtctr %r12
15082 . ld %r11,8(%r11)
15083 . bctr
15084 2:
15085 . b __glink_PLTresolve
15086 . ...
15087 . b __glink_PLTresolve */
15088
15089 if (htab->has_plt_localentry0)
15090 {
15091 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p);
15092 p += 4;
15093 }
b9e5796b
AM
15094 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
15095 p += 4;
15096 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
15097 p += 4;
15098 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
15099 p += 4;
b9e5796b
AM
15100 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
15101 p += 4;
3cd7c7d7
AM
15102 if (htab->has_plt_localentry0)
15103 insn = LD_R0_0R11 | (-20 & 0xfffc);
15104 else
15105 insn = LD_R0_0R11 | (-16 & 0xfffc);
15106 bfd_put_32 (htab->glink->owner, insn, p);
15107 p += 4;
b9e5796b
AM
15108 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
15109 p += 4;
3cd7c7d7 15110 bfd_put_32 (htab->glink->owner, ADD_R11_R0_R11, p);
b9e5796b 15111 p += 4;
3cd7c7d7 15112 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-44 & 0xffff), p);
b9e5796b
AM
15113 p += 4;
15114 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
15115 p += 4;
15116 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
15117 p += 4;
15118 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
15119 p += 4;
15120 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
15121 p += 4;
15122 }
407aa07c
AM
15123 bfd_put_32 (htab->glink->owner, BCTR, p);
15124 p += 4;
c75bc4f7 15125 BFD_ASSERT (p == htab->glink->contents + GLINK_PLTRESOLVE_SIZE (htab));
ad8e1ba5 15126
9f951329
AM
15127 /* Build the .glink lazy link call stubs. */
15128 indx = 0;
9e390558 15129 while (p < htab->glink->contents + htab->glink->size)
9f951329 15130 {
b9e5796b 15131 if (htab->opd_abi)
9f951329 15132 {
b9e5796b
AM
15133 if (indx < 0x8000)
15134 {
15135 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
15136 p += 4;
15137 }
15138 else
15139 {
15140 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
15141 p += 4;
15142 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
15143 p);
15144 p += 4;
15145 }
9f951329 15146 }
4ce794b7 15147 bfd_put_32 (htab->glink->owner,
ee4bf8d2 15148 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
a16d5acb 15149 indx++;
9f951329
AM
15150 p += 4;
15151 }
5d1634d7 15152 }
5d1634d7 15153
a804e476
AM
15154 if (htab->tga_group != NULL)
15155 {
15156 htab->tga_group->lr_restore = 23 * 4;
15157 htab->tga_group->stub_sec->size = 24 * 4;
15158 if (!emit_tga_desc (htab))
0a1b45a2 15159 return false;
a804e476
AM
15160 if (htab->glink_eh_frame != NULL
15161 && htab->glink_eh_frame->size != 0)
15162 {
15163 size_t align = 4;
15164
15165 p = htab->glink_eh_frame->contents;
15166 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
15167 p += 17;
15168 htab->tga_group->eh_size = emit_tga_desc_eh_frame (htab, p) - p;
15169 }
15170 }
15171
49c09209
AM
15172 /* Build .glink global entry stubs, and PLT relocs for globals. */
15173 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs_and_plt, info);
15174
15175 if (!write_plt_relocs_for_local_syms (info))
0a1b45a2 15176 return false;
9e390558 15177
7341d5e2 15178 if (htab->brlt != NULL && htab->brlt->size != 0)
721956f4 15179 {
4ce794b7 15180 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 15181 htab->brlt->size);
4ce794b7 15182 if (htab->brlt->contents == NULL)
0a1b45a2 15183 return false;
721956f4 15184 }
ee75fd95 15185 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
15186 {
15187 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 15188 htab->relbrlt->size);
63bc6f6c 15189 if (htab->relbrlt->contents == NULL)
0a1b45a2 15190 return false;
63bc6f6c 15191 }
5d1634d7 15192
721956f4 15193 /* Build the stubs as directed by the stub hash table. */
ecc741e6 15194 htab->stub_id = 0;
721956f4 15195 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 15196
a4b6fadd
AM
15197 for (group = htab->group; group != NULL; group = group->next)
15198 if (group->needs_save_res)
7dda8d3c 15199 group->stub_sec->size += htab->sfpr->size;
a4b6fadd 15200
aa8a7074
AM
15201 if (htab->relbrlt != NULL)
15202 htab->relbrlt->reloc_count = 0;
15203
e7d1c40c 15204 if (htab->params->plt_stub_align != 0)
d4aaa2a0
AM
15205 for (group = htab->group; group != NULL; group = group->next)
15206 if ((stub_sec = group->stub_sec) != NULL)
691d2e9a
AM
15207 {
15208 int align = abs (htab->params->plt_stub_align);
15209 stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align);
15210 }
794e51c0 15211
7dda8d3c
AM
15212 for (group = htab->group; group != NULL; group = group->next)
15213 if (group->needs_save_res)
15214 {
15215 stub_sec = group->stub_sec;
15216 memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
15217 htab->sfpr->contents, htab->sfpr->size);
15218 if (htab->params->emit_stub_syms)
15219 {
15220 unsigned int i;
15221
15222 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
15223 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
0a1b45a2 15224 return false;
7dda8d3c
AM
15225 }
15226 }
15227
df136d64
AM
15228 if (htab->glink_eh_frame != NULL
15229 && htab->glink_eh_frame->size != 0)
15230 {
15231 bfd_vma val;
15232 size_t align = 4;
15233
15234 p = htab->glink_eh_frame->contents;
15235 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
15236
15237 for (group = htab->group; group != NULL; group = group->next)
15238 if (group->eh_size != 0)
15239 {
15240 /* Offset to stub section. */
15241 val = (group->stub_sec->output_section->vma
15242 + group->stub_sec->output_offset);
15243 val -= (htab->glink_eh_frame->output_section->vma
15244 + htab->glink_eh_frame->output_offset
15245 + (p + 8 - htab->glink_eh_frame->contents));
15246 if (val + 0x80000000 > 0xffffffff)
15247 {
15248 _bfd_error_handler
15249 (_("%s offset too large for .eh_frame sdata4 encoding"),
15250 group->stub_sec->name);
0a1b45a2 15251 return false;
df136d64
AM
15252 }
15253 bfd_put_32 (htab->elf.dynobj, val, p + 8);
15254 p += (group->eh_size + 17 + 3) & -4;
15255 }
15256 if (htab->glink != NULL && htab->glink->size != 0)
15257 {
15258 /* Offset to .glink. */
15259 val = (htab->glink->output_section->vma
15260 + htab->glink->output_offset
15261 + 8);
15262 val -= (htab->glink_eh_frame->output_section->vma
15263 + htab->glink_eh_frame->output_offset
15264 + (p + 8 - htab->glink_eh_frame->contents));
15265 if (val + 0x80000000 > 0xffffffff)
15266 {
15267 _bfd_error_handler
15268 (_("%s offset too large for .eh_frame sdata4 encoding"),
15269 htab->glink->name);
0a1b45a2 15270 return false;
df136d64
AM
15271 }
15272 bfd_put_32 (htab->elf.dynobj, val, p + 8);
15273 p += (24 + align - 1) & -align;
15274 }
15275 }
15276
1657026c
AM
15277 if (htab->elf.srelrdyn != NULL && htab->elf.srelrdyn->size != 0)
15278 {
15279 htab->elf.srelrdyn->contents
15280 = bfd_alloc (htab->elf.dynobj, htab->elf.srelrdyn->size);
15281 if (htab->elf.srelrdyn->contents == NULL)
15282 return false;
15283
0aac2413
AM
15284 bfd_vma *relr_addr = sort_relr (htab);
15285 if (htab->relr_count != 0 && relr_addr == NULL)
15286 return false;
15287
1657026c
AM
15288 size_t i = 0;
15289 bfd_byte *loc = htab->elf.srelrdyn->contents;
15290 while (i < htab->relr_count)
15291 {
0aac2413 15292 bfd_vma base = relr_addr[i];
f91074eb 15293 BFD_ASSERT ((base & ((1 << RELR_ALIGN) - 1)) == 0);
1657026c
AM
15294 bfd_put_64 (htab->elf.dynobj, base, loc);
15295 loc += 8;
15296 i++;
15297 while (i < htab->relr_count
0aac2413 15298 && relr_addr[i] == base)
1657026c
AM
15299 {
15300 htab->stub_error = true;
15301 i++;
15302 }
15303 base += 8;
15304 while (1)
15305 {
15306 bfd_vma bits = 0;
15307 while (i < htab->relr_count
0aac2413
AM
15308 && relr_addr[i] - base < 63 * 8
15309 && (relr_addr[i] - base) % 8 == 0)
1657026c 15310 {
0aac2413 15311 bits |= (bfd_vma) 1 << ((relr_addr[i] - base) / 8);
1657026c
AM
15312 i++;
15313 }
15314 if (bits == 0)
15315 break;
15316 bfd_put_64 (htab->elf.dynobj, (bits << 1) | 1, loc);
15317 loc += 8;
15318 base += 63 * 8;
15319 }
15320 }
0aac2413 15321 free (relr_addr);
1657026c
AM
15322 /* Pad any excess with 1's, a do-nothing encoding. */
15323 while ((size_t) (loc - htab->elf.srelrdyn->contents)
15324 < htab->elf.srelrdyn->size)
15325 {
15326 bfd_put_64 (htab->elf.dynobj, 1, loc);
15327 loc += 8;
15328 }
15329 }
15330
d4aaa2a0
AM
15331 for (group = htab->group; group != NULL; group = group->next)
15332 if ((stub_sec = group->stub_sec) != NULL)
e717da7e
AM
15333 {
15334 stub_sec_count += 1;
c9301e31
AM
15335 if (stub_sec->rawsize != stub_sec->size
15336 && (htab->stub_iteration <= STUB_SHRINK_ITER
15337 || stub_sec->rawsize < stub_sec->size))
e717da7e
AM
15338 break;
15339 }
5d1634d7 15340
25516cc5 15341 if (group != NULL)
1657026c
AM
15342 htab->stub_error = true;
15343
15344 if (htab->stub_error)
5d1634d7 15345 {
cf97bcb0 15346 _bfd_error_handler (_("stubs don't match calculated size"));
1657026c 15347 return false;
5d1634d7 15348 }
721956f4 15349
d2a300cf
AM
15350 if (stats != NULL)
15351 {
988b7300
AM
15352 char *groupmsg;
15353 if (asprintf (&groupmsg,
17a6f5f2
AM
15354 ngettext ("linker stubs in %u group",
15355 "linker stubs in %u groups",
988b7300
AM
15356 stub_sec_count),
15357 stub_sec_count) < 0)
15358 *stats = NULL;
15359 else
15360 {
17a6f5f2 15361 if (asprintf (stats, _("%s, iter %u\n"
988b7300 15362 " branch %lu\n"
988b7300 15363 " long branch %lu\n"
988b7300 15364 " plt call %lu\n"
988b7300 15365 " global entry %lu"),
17a6f5f2 15366 groupmsg, htab->stub_iteration,
988b7300 15367 htab->stub_count[ppc_stub_long_branch - 1],
988b7300 15368 htab->stub_count[ppc_stub_plt_branch - 1],
988b7300 15369 htab->stub_count[ppc_stub_plt_call - 1],
988b7300
AM
15370 htab->stub_count[ppc_stub_global_entry - 1]) < 0)
15371 *stats = NULL;
15372 free (groupmsg);
15373 }
d2a300cf 15374 }
0a1b45a2 15375 return true;
5bd4f169
AM
15376}
15377
60124e18
AM
15378/* What to do when ld finds relocations against symbols defined in
15379 discarded sections. */
15380
15381static unsigned int
15382ppc64_elf_action_discarded (asection *sec)
15383{
15384 if (strcmp (".opd", sec->name) == 0)
15385 return 0;
15386
15387 if (strcmp (".toc", sec->name) == 0)
15388 return 0;
15389
bce50a28
JJ
15390 if (strcmp (".toc1", sec->name) == 0)
15391 return 0;
15392
60124e18
AM
15393 return _bfd_elf_default_action_discarded (sec);
15394}
15395
e59a1001
AM
15396/* These are the dynamic relocations supported by glibc. */
15397
0a1b45a2 15398static bool
e59a1001
AM
15399ppc64_glibc_dynamic_reloc (enum elf_ppc64_reloc_type r_type)
15400{
15401 switch (r_type)
15402 {
15403 case R_PPC64_RELATIVE:
15404 case R_PPC64_NONE:
15405 case R_PPC64_ADDR64:
15406 case R_PPC64_GLOB_DAT:
15407 case R_PPC64_IRELATIVE:
15408 case R_PPC64_JMP_IREL:
15409 case R_PPC64_JMP_SLOT:
15410 case R_PPC64_DTPMOD64:
15411 case R_PPC64_DTPREL64:
15412 case R_PPC64_TPREL64:
15413 case R_PPC64_TPREL16_LO_DS:
15414 case R_PPC64_TPREL16_DS:
15415 case R_PPC64_TPREL16:
15416 case R_PPC64_TPREL16_LO:
15417 case R_PPC64_TPREL16_HI:
15418 case R_PPC64_TPREL16_HIGH:
15419 case R_PPC64_TPREL16_HA:
15420 case R_PPC64_TPREL16_HIGHA:
15421 case R_PPC64_TPREL16_HIGHER:
15422 case R_PPC64_TPREL16_HIGHEST:
15423 case R_PPC64_TPREL16_HIGHERA:
15424 case R_PPC64_TPREL16_HIGHESTA:
15425 case R_PPC64_ADDR16_LO_DS:
15426 case R_PPC64_ADDR16_LO:
15427 case R_PPC64_ADDR16_HI:
15428 case R_PPC64_ADDR16_HIGH:
15429 case R_PPC64_ADDR16_HA:
15430 case R_PPC64_ADDR16_HIGHA:
15431 case R_PPC64_REL30:
15432 case R_PPC64_COPY:
15433 case R_PPC64_UADDR64:
15434 case R_PPC64_UADDR32:
15435 case R_PPC64_ADDR32:
15436 case R_PPC64_ADDR24:
15437 case R_PPC64_ADDR16:
15438 case R_PPC64_UADDR16:
15439 case R_PPC64_ADDR16_DS:
15440 case R_PPC64_ADDR16_HIGHER:
15441 case R_PPC64_ADDR16_HIGHEST:
15442 case R_PPC64_ADDR16_HIGHERA:
15443 case R_PPC64_ADDR16_HIGHESTA:
15444 case R_PPC64_ADDR14:
15445 case R_PPC64_ADDR14_BRTAKEN:
15446 case R_PPC64_ADDR14_BRNTAKEN:
15447 case R_PPC64_REL32:
15448 case R_PPC64_REL64:
0a1b45a2 15449 return true;
e59a1001
AM
15450
15451 default:
0a1b45a2 15452 return false;
e59a1001
AM
15453 }
15454}
15455
5bd4f169
AM
15456/* The RELOCATE_SECTION function is called by the ELF backend linker
15457 to handle the relocations for a section.
15458
15459 The relocs are always passed as Rela structures; if the section
15460 actually uses Rel structures, the r_addend field will always be
15461 zero.
15462
15463 This function is responsible for adjust the section contents as
15464 necessary, and (if using Rela relocs and generating a
1049f94e 15465 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
15466 necessary.
15467
15468 This function does not have to worry about setting the reloc
15469 address or the reloc symbol index.
15470
15471 LOCAL_SYMS is a pointer to the swapped in local symbols.
15472
15473 LOCAL_SECTIONS is an array giving the section in the input file
15474 corresponding to the st_shndx field of each local symbol.
15475
15476 The global hash table entry for the global symbols can be found
15477 via elf_sym_hashes (input_bfd).
15478
1049f94e 15479 When generating relocatable output, this function must handle
5bd4f169
AM
15480 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
15481 going to be the section symbol corresponding to the output
15482 section, which means that the addend must be adjusted
15483 accordingly. */
15484
0f684201 15485static int
4ce794b7
AM
15486ppc64_elf_relocate_section (bfd *output_bfd,
15487 struct bfd_link_info *info,
15488 bfd *input_bfd,
15489 asection *input_section,
15490 bfd_byte *contents,
15491 Elf_Internal_Rela *relocs,
15492 Elf_Internal_Sym *local_syms,
15493 asection **local_sections)
5bd4f169 15494{
65f38f15 15495 struct ppc_link_hash_table *htab;
5bd4f169
AM
15496 Elf_Internal_Shdr *symtab_hdr;
15497 struct elf_link_hash_entry **sym_hashes;
5bd4f169 15498 Elf_Internal_Rela *rel;
c316a17c 15499 Elf_Internal_Rela *wrel;
5bd4f169 15500 Elf_Internal_Rela *relend;
411e1bfb
AM
15501 Elf_Internal_Rela outrel;
15502 bfd_byte *loc;
411e1bfb 15503 struct got_entry **local_got_ents;
5bd4f169 15504 bfd_vma TOCstart;
0a1b45a2
AM
15505 bool ret = true;
15506 bool is_opd;
794e51c0 15507 /* Assume 'at' branch hints. */
0a1b45a2
AM
15508 bool is_isa_v2 = true;
15509 bool warned_dynamic = false;
95f0d0d2 15510 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
5bd4f169 15511
65f38f15 15512 /* Initialize howto table if needed. */
5bd4f169 15513 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
15514 ppc_howto_init ();
15515
65f38f15 15516 htab = ppc_hash_table (info);
4dfe6ac6 15517 if (htab == NULL)
0a1b45a2 15518 return false;
ee75fd95
AM
15519
15520 /* Don't relocate stub sections. */
e7d1c40c 15521 if (input_section->owner == htab->params->stub_bfd)
0a1b45a2 15522 return true;
ee75fd95 15523
7af5d5c4
AM
15524 if (!is_ppc64_elf (input_bfd))
15525 {
15526 bfd_set_error (bfd_error_wrong_format);
0a1b45a2 15527 return false;
7af5d5c4 15528 }
0ffa91dd 15529
411e1bfb 15530 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 15531 TOCstart = elf_gp (output_bfd);
0ffa91dd 15532 symtab_hdr = &elf_symtab_hdr (input_bfd);
5bd4f169 15533 sym_hashes = elf_sym_hashes (input_bfd);
7c8fe5c4 15534 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
65f38f15 15535
c316a17c 15536 rel = wrel = relocs;
5bd4f169 15537 relend = relocs + input_section->reloc_count;
c316a17c 15538 for (; rel < relend; wrel++, rel++)
5bd4f169 15539 {
04c9666a 15540 enum elf_ppc64_reloc_type r_type;
31c76678 15541 bfd_vma addend;
5bd4f169
AM
15542 bfd_reloc_status_type r;
15543 Elf_Internal_Sym *sym;
15544 asection *sec;
039b3fef
AM
15545 struct elf_link_hash_entry *h_elf;
15546 struct ppc_link_hash_entry *h;
15547 struct ppc_link_hash_entry *fdh;
5bd4f169 15548 const char *sym_name;
0d4792f7 15549 unsigned long r_symndx, toc_symndx;
3a71aa26 15550 bfd_vma toc_addend;
f961d9dd
AM
15551 unsigned char tls_mask, tls_gd, tls_type;
15552 unsigned char sym_type;
5bd4f169 15553 bfd_vma relocation;
0a1b45a2
AM
15554 bool unresolved_reloc, save_unresolved_reloc;
15555 bool warned;
bc30df16 15556 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
67f0cbdb 15557 unsigned int insn;
e11840f9 15558 unsigned int mask;
721956f4
AM
15559 struct ppc_stub_hash_entry *stub_entry;
15560 bfd_vma max_br_offset;
15561 bfd_vma from;
c316a17c 15562 Elf_Internal_Rela orig_rel;
b80eed39
AM
15563 reloc_howto_type *howto;
15564 struct reloc_howto_struct alt_howto;
4a421c53
AM
15565 uint64_t pinsn;
15566 bfd_vma offset;
5bd4f169 15567
c316a17c
AM
15568 again:
15569 orig_rel = *rel;
15570
4ce794b7 15571 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 15572 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
15573
15574 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
15575 symbol of the previous ADDR64 reloc. The symbol gives us the
15576 proper TOC base to use. */
15577 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
c316a17c
AM
15578 && wrel != relocs
15579 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
ee87f2da 15580 && is_opd)
c316a17c 15581 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
ee87f2da 15582
4ce794b7
AM
15583 sym = NULL;
15584 sec = NULL;
039b3fef 15585 h_elf = NULL;
4ce794b7 15586 sym_name = NULL;
0a1b45a2
AM
15587 unresolved_reloc = false;
15588 warned = false;
65f38f15 15589
0b13192e 15590 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
15591 {
15592 /* It's a local symbol. */
74f0fb50 15593 struct _opd_sec_data *opd;
4025353c 15594
5bd4f169
AM
15595 sym = local_syms + r_symndx;
15596 sec = local_sections[r_symndx];
26c61ae5 15597 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
0d4792f7 15598 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 15599 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
74f0fb50
AM
15600 opd = get_opd_info (sec);
15601 if (opd != NULL && opd->adjust != NULL)
1e2f5b6e 15602 {
51aecdc5
AM
15603 long adjust = opd->adjust[OPD_NDX (sym->st_value
15604 + rel->r_addend)];
4025353c
AM
15605 if (adjust == -1)
15606 relocation = 0;
15607 else
4cc603a5
AM
15608 {
15609 /* If this is a relocation against the opd section sym
15610 and we have edited .opd, adjust the reloc addend so
15611 that ld -r and ld --emit-relocs output is correct.
15612 If it is a reloc against some other .opd symbol,
15613 then the symbol value will be adjusted later. */
15614 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
15615 rel->r_addend += adjust;
15616 else
15617 relocation += adjust;
15618 }
1e2f5b6e 15619 }
5bd4f169
AM
15620 }
15621 else
15622 {
0a1b45a2 15623 bool ignored;
62d887d4 15624
b2a8e766
AM
15625 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
15626 r_symndx, symtab_hdr, sym_hashes,
039b3fef 15627 h_elf, sec, relocation,
62d887d4 15628 unresolved_reloc, warned, ignored);
039b3fef
AM
15629 sym_name = h_elf->root.root.string;
15630 sym_type = h_elf->type;
b69fdb4e
AM
15631 if (sec != NULL
15632 && sec->owner == output_bfd
15633 && strcmp (sec->name, ".opd") == 0)
15634 {
15635 /* This is a symbol defined in a linker script. All
15636 such are defined in output sections, even those
15637 defined by simple assignment from a symbol defined in
15638 an input section. Transfer the symbol to an
15639 appropriate input .opd section, so that a branch to
15640 this symbol will be mapped to the location specified
15641 by the opd entry. */
15642 struct bfd_link_order *lo;
15643 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
15644 if (lo->type == bfd_indirect_link_order)
15645 {
15646 asection *isec = lo->u.indirect.section;
15647 if (h_elf->root.u.def.value >= isec->output_offset
15648 && h_elf->root.u.def.value < (isec->output_offset
15649 + isec->size))
15650 {
15651 h_elf->root.u.def.value -= isec->output_offset;
15652 h_elf->root.u.def.section = isec;
15653 sec = isec;
15654 break;
15655 }
15656 }
15657 }
5bd4f169 15658 }
ed7007c1 15659 h = ppc_elf_hash_entry (h_elf);
5bd4f169 15660
dbaa2011 15661 if (sec != NULL && discarded_section (sec))
c316a17c
AM
15662 {
15663 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
15664 input_bfd, input_section,
0930cb30 15665 contents, rel->r_offset);
c316a17c
AM
15666 wrel->r_offset = rel->r_offset;
15667 wrel->r_info = 0;
15668 wrel->r_addend = 0;
15669
15670 /* For ld -r, remove relocations in debug sections against
dcd2b8a0 15671 symbols defined in discarded sections. Not done for
c316a17c
AM
15672 non-debug to preserve relocs in .eh_frame which the
15673 eh_frame editing code expects to be present. */
15674 if (bfd_link_relocatable (info)
15675 && (input_section->flags & SEC_DEBUGGING))
15676 wrel--;
15677
15678 continue;
15679 }
ab96bf03 15680
0e1862bb 15681 if (bfd_link_relocatable (info))
c316a17c 15682 goto copy_reloc;
ab96bf03 15683
f40da81b
AM
15684 if (h != NULL && &h->elf == htab->elf.hgot)
15685 {
6f20ed8a 15686 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
f40da81b 15687 sec = bfd_abs_section_ptr;
0a1b45a2 15688 unresolved_reloc = false;
f40da81b
AM
15689 }
15690
951fd09b
AM
15691 /* TLS optimizations. Replace instruction sequences and relocs
15692 based on information we collected in tls_optimize. We edit
15693 RELOCS so that --emit-relocs will output something sensible
15694 for the final instruction stream. */
15695 tls_mask = 0;
15696 tls_gd = 0;
0d4792f7 15697 toc_symndx = 0;
727fc41e
AM
15698 if (h != NULL)
15699 tls_mask = h->tls_mask;
15700 else if (local_got_ents != NULL)
411e1bfb 15701 {
e054468f
AM
15702 struct plt_entry **local_plt = (struct plt_entry **)
15703 (local_got_ents + symtab_hdr->sh_info);
f961d9dd 15704 unsigned char *lgot_masks = (unsigned char *)
e054468f 15705 (local_plt + symtab_hdr->sh_info);
727fc41e
AM
15706 tls_mask = lgot_masks[r_symndx];
15707 }
37da22e5 15708 if (((tls_mask & TLS_TLS) == 0 || tls_mask == (TLS_TLS | TLS_MARK))
727fc41e
AM
15709 && (r_type == R_PPC64_TLS
15710 || r_type == R_PPC64_TLSGD
15711 || r_type == R_PPC64_TLSLD))
15712 {
15713 /* Check for toc tls entries. */
f961d9dd 15714 unsigned char *toc_tls;
0d4792f7 15715
727fc41e
AM
15716 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
15717 &local_syms, rel, input_bfd))
0a1b45a2 15718 return false;
0d4792f7 15719
727fc41e
AM
15720 if (toc_tls)
15721 tls_mask = *toc_tls;
0d4792f7
AM
15722 }
15723
15724 /* Check that tls relocs are used with tls syms, and non-tls
15725 relocs are used with non-tls syms. */
cf35638d 15726 if (r_symndx != STN_UNDEF
0d4792f7
AM
15727 && r_type != R_PPC64_NONE
15728 && (h == NULL
039b3fef
AM
15729 || h->elf.root.type == bfd_link_hash_defined
15730 || h->elf.root.type == bfd_link_hash_defweak)
71c4e95a 15731 && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
0d4792f7 15732 {
37da22e5 15733 if ((tls_mask & TLS_TLS) != 0
727fc41e
AM
15734 && (r_type == R_PPC64_TLS
15735 || r_type == R_PPC64_TLSGD
15736 || r_type == R_PPC64_TLSLD))
0d4792f7
AM
15737 /* R_PPC64_TLS is OK against a symbol in the TOC. */
15738 ;
15739 else
25f53a85 15740 info->callbacks->einfo
1d483afe 15741 (!IS_PPC64_TLS_RELOC (r_type)
695344c0 15742 /* xgettext:c-format */
c1c8c1ef 15743 ? _("%H: %s used with TLS symbol `%pT'\n")
695344c0 15744 /* xgettext:c-format */
c1c8c1ef 15745 : _("%H: %s used with non-TLS symbol `%pT'\n"),
25f53a85 15746 input_bfd, input_section, rel->r_offset,
0d4792f7
AM
15747 ppc64_elf_howto_table[r_type]->name,
15748 sym_name);
411e1bfb
AM
15749 }
15750
15751 /* Ensure reloc mapping code below stays sane. */
15752 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
15753 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
15754 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
15755 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
15756 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
15757 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
15758 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
15759 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
15760 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
15761 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
15762 abort ();
0d4792f7 15763
411e1bfb
AM
15764 switch (r_type)
15765 {
15766 default:
411e1bfb
AM
15767 break;
15768
ba761f19 15769 case R_PPC64_LO_DS_OPT:
733ae98c
AM
15770 if (offset_in_range (input_section, rel->r_offset - d_offset, 4))
15771 {
15772 insn = bfd_get_32 (input_bfd,
15773 contents + rel->r_offset - d_offset);
15774 if ((insn & (0x3fu << 26)) != 58u << 26)
15775 abort ();
15776 insn += (14u << 26) - (58u << 26);
15777 bfd_put_32 (input_bfd, insn,
15778 contents + rel->r_offset - d_offset);
15779 r_type = R_PPC64_TOC16_LO;
15780 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15781 }
ba761f19
AM
15782 break;
15783
411e1bfb
AM
15784 case R_PPC64_TOC16:
15785 case R_PPC64_TOC16_LO:
15786 case R_PPC64_TOC16_DS:
15787 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
15788 {
15789 /* Check for toc tls entries. */
f961d9dd 15790 unsigned char *toc_tls;
951fd09b 15791 int retval;
411e1bfb 15792
3a71aa26
AM
15793 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
15794 &local_syms, rel, input_bfd);
951fd09b 15795 if (retval == 0)
0a1b45a2 15796 return false;
411e1bfb
AM
15797
15798 if (toc_tls)
15799 {
951fd09b 15800 tls_mask = *toc_tls;
411e1bfb
AM
15801 if (r_type == R_PPC64_TOC16_DS
15802 || r_type == R_PPC64_TOC16_LO_DS)
81407a69 15803 {
37da22e5 15804 if ((tls_mask & TLS_TLS) != 0
81407a69
AM
15805 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
15806 goto toctprel;
15807 }
411e1bfb 15808 else
951fd09b
AM
15809 {
15810 /* If we found a GD reloc pair, then we might be
15811 doing a GD->IE transition. */
15812 if (retval == 2)
15813 {
b00a0a86 15814 tls_gd = TLS_GDIE;
37da22e5
AM
15815 if ((tls_mask & TLS_TLS) != 0
15816 && (tls_mask & TLS_GD) == 0)
102890f0 15817 goto tls_ldgd_opt;
951fd09b
AM
15818 }
15819 else if (retval == 3)
15820 {
37da22e5
AM
15821 if ((tls_mask & TLS_TLS) != 0
15822 && (tls_mask & TLS_LD) == 0)
102890f0 15823 goto tls_ldgd_opt;
951fd09b
AM
15824 }
15825 }
411e1bfb
AM
15826 }
15827 }
15828 break;
15829
9d6ded02
AM
15830 case R_PPC64_GOT_TPREL16_HI:
15831 case R_PPC64_GOT_TPREL16_HA:
37da22e5 15832 if ((tls_mask & TLS_TLS) != 0
733ae98c
AM
15833 && (tls_mask & TLS_TPREL) == 0
15834 && offset_in_range (input_section, rel->r_offset - d_offset, 4))
9d6ded02
AM
15835 {
15836 rel->r_offset -= d_offset;
95f0d0d2 15837 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
9d6ded02
AM
15838 r_type = R_PPC64_NONE;
15839 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15840 }
15841 break;
15842
411e1bfb
AM
15843 case R_PPC64_GOT_TPREL16_DS:
15844 case R_PPC64_GOT_TPREL16_LO_DS:
37da22e5 15845 if ((tls_mask & TLS_TLS) != 0
733ae98c
AM
15846 && (tls_mask & TLS_TPREL) == 0
15847 && offset_in_range (input_section, rel->r_offset - d_offset, 4))
411e1bfb 15848 {
81407a69 15849 toctprel:
95f0d0d2 15850 insn = bfd_get_32 (input_bfd,
c316a17c 15851 contents + rel->r_offset - d_offset);
411e1bfb
AM
15852 insn &= 31 << 21;
15853 insn |= 0x3c0d0000; /* addis 0,13,0 */
95f0d0d2 15854 bfd_put_32 (input_bfd, insn,
c316a17c 15855 contents + rel->r_offset - d_offset);
411e1bfb 15856 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
15857 if (toc_symndx != 0)
15858 {
15859 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
3a71aa26 15860 rel->r_addend = toc_addend;
0d4792f7
AM
15861 /* We changed the symbol. Start over in order to
15862 get h, sym, sec etc. right. */
c316a17c 15863 goto again;
0d4792f7
AM
15864 }
15865 else
15866 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
15867 }
15868 break;
15869
87c69f97 15870 case R_PPC64_GOT_TPREL_PCREL34:
c213164a 15871 if ((tls_mask & TLS_TLS) != 0
733ae98c
AM
15872 && (tls_mask & TLS_TPREL) == 0
15873 && offset_in_range (input_section, rel->r_offset, 8))
c213164a
AM
15874 {
15875 /* pld ra,sym@got@tprel@pcrel -> paddi ra,r13,sym@tprel */
15876 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15877 pinsn <<= 32;
15878 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
15879 pinsn += ((2ULL << 56) + (-1ULL << 52)
15880 + (14ULL << 26) - (57ULL << 26) + (13ULL << 16));
15881 bfd_put_32 (input_bfd, pinsn >> 32,
15882 contents + rel->r_offset);
15883 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
15884 contents + rel->r_offset + 4);
15885 r_type = R_PPC64_TPREL34;
15886 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15887 }
15888 break;
15889
411e1bfb 15890 case R_PPC64_TLS:
37da22e5 15891 if ((tls_mask & TLS_TLS) != 0
733ae98c
AM
15892 && (tls_mask & TLS_TPREL) == 0
15893 && offset_in_range (input_section, rel->r_offset & ~3, 4))
411e1bfb 15894 {
c213164a 15895 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2d0f3896
AM
15896 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
15897 if (insn == 0)
c213164a
AM
15898 break;
15899 if ((rel->r_offset & 3) == 0)
0d4792f7 15900 {
c213164a
AM
15901 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
15902 /* Was PPC64_TLS which sits on insn boundary, now
15903 PPC64_TPREL16_LO which is at low-order half-word. */
15904 rel->r_offset += d_offset;
15905 r_type = R_PPC64_TPREL16_LO;
15906 if (toc_symndx != 0)
15907 {
15908 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
15909 rel->r_addend = toc_addend;
15910 /* We changed the symbol. Start over in order to
15911 get h, sym, sec etc. right. */
15912 goto again;
15913 }
15914 else
15915 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
15916 }
15917 else if ((rel->r_offset & 3) == 1)
15918 {
15919 /* For pcrel IE to LE we already have the full
15920 offset and thus don't need an addi here. A nop
15921 or mr will do. */
2365f8d7 15922 if ((insn & (0x3fu << 26)) == 14 << 26)
c213164a
AM
15923 {
15924 /* Extract regs from addi rt,ra,si. */
15925 unsigned int rt = (insn >> 21) & 0x1f;
15926 unsigned int ra = (insn >> 16) & 0x1f;
15927 if (rt == ra)
15928 insn = NOP;
15929 else
15930 {
15931 /* Build or ra,rs,rb with rb==rs, ie. mr ra,rs. */
15932 insn = (rt << 16) | (ra << 21) | (ra << 11);
15933 insn |= (31u << 26) | (444u << 1);
15934 }
15935 }
15936 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - 1);
0d4792f7 15937 }
411e1bfb
AM
15938 }
15939 break;
15940
411e1bfb
AM
15941 case R_PPC64_GOT_TLSGD16_HI:
15942 case R_PPC64_GOT_TLSGD16_HA:
b00a0a86 15943 tls_gd = TLS_GDIE;
733ae98c
AM
15944 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
15945 && offset_in_range (input_section, rel->r_offset & ~3, 4))
951fd09b
AM
15946 goto tls_gdld_hi;
15947 break;
15948
411e1bfb
AM
15949 case R_PPC64_GOT_TLSLD16_HI:
15950 case R_PPC64_GOT_TLSLD16_HA:
733ae98c
AM
15951 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
15952 && offset_in_range (input_section, rel->r_offset & ~3, 4))
411e1bfb 15953 {
951fd09b
AM
15954 tls_gdld_hi:
15955 if ((tls_mask & tls_gd) != 0)
15956 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
15957 + R_PPC64_GOT_TPREL16_DS);
15958 else
411e1bfb 15959 {
4fe5ca5b 15960 rel->r_offset -= d_offset;
95f0d0d2 15961 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
951fd09b 15962 r_type = R_PPC64_NONE;
411e1bfb 15963 }
951fd09b 15964 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
15965 }
15966 break;
15967
951fd09b
AM
15968 case R_PPC64_GOT_TLSGD16:
15969 case R_PPC64_GOT_TLSGD16_LO:
b00a0a86 15970 tls_gd = TLS_GDIE;
733ae98c
AM
15971 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
15972 && offset_in_range (input_section, rel->r_offset & ~3, 4))
102890f0 15973 goto tls_ldgd_opt;
951fd09b 15974 break;
411e1bfb 15975
951fd09b
AM
15976 case R_PPC64_GOT_TLSLD16:
15977 case R_PPC64_GOT_TLSLD16_LO:
733ae98c
AM
15978 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
15979 && offset_in_range (input_section, rel->r_offset & ~3, 4))
951fd09b 15980 {
b9f04fe0 15981 unsigned int insn1, insn2;
102890f0
AM
15982
15983 tls_ldgd_opt:
727fc41e
AM
15984 offset = (bfd_vma) -1;
15985 /* If not using the newer R_PPC64_TLSGD/LD to mark
15986 __tls_get_addr calls, we must trust that the call
15987 stays with its arg setup insns, ie. that the next
15988 reloc is the __tls_get_addr call associated with
15989 the current reloc. Edit both insns. */
9737e8af 15990 if (input_section->nomark_tls_get_addr
727fc41e
AM
15991 && rel + 1 < relend
15992 && branch_reloc_hash_match (input_bfd, rel + 1,
9e7028aa
AM
15993 htab->tls_get_addr_fd,
15994 htab->tga_desc_fd,
727fc41e 15995 htab->tls_get_addr,
9e7028aa 15996 htab->tga_desc))
727fc41e 15997 offset = rel[1].r_offset;
b86ac8e3
AM
15998 /* We read the low GOT_TLS (or TOC16) insn because we
15999 need to keep the destination reg. It may be
16000 something other than the usual r3, and moved to r3
16001 before the call by intervening code. */
95f0d0d2 16002 insn1 = bfd_get_32 (input_bfd,
b86ac8e3 16003 contents + rel->r_offset - d_offset);
102890f0 16004 if ((tls_mask & tls_gd) != 0)
411e1bfb 16005 {
102890f0 16006 /* IE */
b86ac8e3 16007 insn1 &= (0x1f << 21) | (0x1f << 16);
2365f8d7 16008 insn1 |= 58u << 26; /* ld */
102890f0 16009 insn2 = 0x7c636a14; /* add 3,3,13 */
727fc41e 16010 if (offset != (bfd_vma) -1)
f58d5a2d 16011 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
46e9995a
AM
16012 if (r_type == R_PPC64_TOC16
16013 || r_type == R_PPC64_TOC16_LO)
102890f0 16014 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
46e9995a
AM
16015 else
16016 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 1)) & 1)
16017 + R_PPC64_GOT_TPREL16_DS);
102890f0
AM
16018 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
16019 }
16020 else
16021 {
16022 /* LE */
b86ac8e3
AM
16023 insn1 &= 0x1f << 21;
16024 insn1 |= 0x3c0d0000; /* addis r,13,0 */
102890f0
AM
16025 insn2 = 0x38630000; /* addi 3,3,0 */
16026 if (tls_gd == 0)
951fd09b 16027 {
102890f0 16028 /* Was an LD reloc. */
71c4e95a 16029 r_symndx = STN_UNDEF;
102890f0 16030 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
951fd09b 16031 }
102890f0 16032 else if (toc_symndx != 0)
3a71aa26
AM
16033 {
16034 r_symndx = toc_symndx;
16035 rel->r_addend = toc_addend;
16036 }
102890f0
AM
16037 r_type = R_PPC64_TPREL16_HA;
16038 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
16039 if (offset != (bfd_vma) -1)
16040 {
16041 rel[1].r_info = ELF64_R_INFO (r_symndx,
16042 R_PPC64_TPREL16_LO);
16043 rel[1].r_offset = offset + d_offset;
16044 rel[1].r_addend = rel->r_addend;
16045 }
102890f0 16046 }
95f0d0d2 16047 bfd_put_32 (input_bfd, insn1,
3a71aa26 16048 contents + rel->r_offset - d_offset);
733ae98c
AM
16049 if (offset != (bfd_vma) -1
16050 && offset_in_range (input_section, offset, 4))
c96e0573
AM
16051 {
16052 bfd_put_32 (input_bfd, insn2, contents + offset);
733ae98c 16053 if (offset_in_range (input_section, offset + 4, 4))
c96e0573
AM
16054 {
16055 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
16056 if (insn2 == LD_R2_0R1 + STK_TOC (htab))
16057 bfd_put_32 (input_bfd, NOP, contents + offset + 4);
16058 }
16059 }
727fc41e
AM
16060 if ((tls_mask & tls_gd) == 0
16061 && (tls_gd == 0 || toc_symndx != 0))
16062 {
16063 /* We changed the symbol. Start over in order
16064 to get h, sym, sec etc. right. */
c316a17c 16065 goto again;
727fc41e
AM
16066 }
16067 }
16068 break;
16069
87c69f97 16070 case R_PPC64_GOT_TLSGD_PCREL34:
733ae98c
AM
16071 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
16072 && offset_in_range (input_section, rel->r_offset, 8))
c213164a
AM
16073 {
16074 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16075 pinsn <<= 32;
16076 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
16077 if ((tls_mask & TLS_GDIE) != 0)
16078 {
16079 /* IE, pla -> pld */
16080 pinsn += (-2ULL << 56) + (57ULL << 26) - (14ULL << 26);
87c69f97 16081 r_type = R_PPC64_GOT_TPREL_PCREL34;
c213164a
AM
16082 }
16083 else
16084 {
16085 /* LE, pla pcrel -> paddi r13 */
16086 pinsn += (-1ULL << 52) + (13ULL << 16);
16087 r_type = R_PPC64_TPREL34;
16088 }
16089 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
16090 bfd_put_32 (input_bfd, pinsn >> 32,
16091 contents + rel->r_offset);
16092 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
16093 contents + rel->r_offset + 4);
16094 }
16095 break;
16096
87c69f97 16097 case R_PPC64_GOT_TLSLD_PCREL34:
733ae98c
AM
16098 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
16099 && offset_in_range (input_section, rel->r_offset, 8))
c213164a
AM
16100 {
16101 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16102 pinsn <<= 32;
16103 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
16104 pinsn += (-1ULL << 52) + (13ULL << 16);
16105 bfd_put_32 (input_bfd, pinsn >> 32,
16106 contents + rel->r_offset);
16107 bfd_put_32 (input_bfd, pinsn & 0xffffffff,
16108 contents + rel->r_offset + 4);
16109 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
16110 r_symndx = STN_UNDEF;
16111 r_type = R_PPC64_TPREL34;
16112 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
16113 goto again;
16114 }
16115 break;
16116
727fc41e 16117 case R_PPC64_TLSGD:
37da22e5 16118 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
733ae98c
AM
16119 && rel + 1 < relend
16120 && offset_in_range (input_section, rel->r_offset,
16121 is_8byte_reloc (ELF64_R_TYPE (rel[1].r_info))
16122 ? 8 : 4))
727fc41e 16123 {
b9f04fe0 16124 unsigned int insn2;
5663e321 16125 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 16126
4a421c53 16127 offset = rel->r_offset;
5663e321 16128 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
16129 {
16130 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
16131 if (r_type1 == R_PPC64_PLT_PCREL34
16132 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
16133 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
16134 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
16135 break;
16136 }
16137
733ae98c 16138 if (r_type1 == R_PPC64_PLTCALL)
23cedd1d
AM
16139 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
16140
b00a0a86 16141 if ((tls_mask & TLS_GDIE) != 0)
727fc41e
AM
16142 {
16143 /* IE */
16144 r_type = R_PPC64_NONE;
16145 insn2 = 0x7c636a14; /* add 3,3,13 */
16146 }
16147 else
16148 {
16149 /* LE */
16150 if (toc_symndx != 0)
16151 {
16152 r_symndx = toc_symndx;
16153 rel->r_addend = toc_addend;
16154 }
c213164a 16155 if (r_type1 == R_PPC64_REL24_NOTOC
7aba54da 16156 || r_type1 == R_PPC64_REL24_P9NOTOC
c213164a
AM
16157 || r_type1 == R_PPC64_PLTCALL_NOTOC)
16158 {
16159 r_type = R_PPC64_NONE;
16160 insn2 = NOP;
16161 }
16162 else
16163 {
16164 rel->r_offset = offset + d_offset;
16165 r_type = R_PPC64_TPREL16_LO;
16166 insn2 = 0x38630000; /* addi 3,3,0 */
16167 }
727fc41e
AM
16168 }
16169 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
16170 /* Zap the reloc on the _tls_get_addr call too. */
16171 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 16172 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 16173 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
16174 if ((tls_mask & TLS_GDIE) == 0
16175 && toc_symndx != 0
16176 && r_type != R_PPC64_NONE)
c316a17c 16177 goto again;
411e1bfb 16178 }
411e1bfb
AM
16179 break;
16180
727fc41e 16181 case R_PPC64_TLSLD:
37da22e5 16182 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
733ae98c
AM
16183 && rel + 1 < relend
16184 && offset_in_range (input_section, rel->r_offset,
16185 is_8byte_reloc (ELF64_R_TYPE (rel[1].r_info))
16186 ? 8 : 4))
727fc41e 16187 {
b9f04fe0 16188 unsigned int insn2;
5663e321 16189 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info);
727fc41e 16190
4a421c53 16191 offset = rel->r_offset;
5663e321 16192 if (is_plt_seq_reloc (r_type1))
23cedd1d
AM
16193 {
16194 bfd_put_32 (output_bfd, NOP, contents + offset);
5663e321
AM
16195 if (r_type1 == R_PPC64_PLT_PCREL34
16196 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC)
16197 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
23cedd1d
AM
16198 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
16199 break;
16200 }
16201
733ae98c 16202 if (r_type1 == R_PPC64_PLTCALL)
23cedd1d
AM
16203 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
16204
c213164a 16205 if (r_type1 == R_PPC64_REL24_NOTOC
7aba54da 16206 || r_type1 == R_PPC64_REL24_P9NOTOC
c213164a
AM
16207 || r_type1 == R_PPC64_PLTCALL_NOTOC)
16208 {
16209 r_type = R_PPC64_NONE;
16210 insn2 = NOP;
16211 }
16212 else
16213 {
16214 rel->r_offset = offset + d_offset;
16215 r_symndx = STN_UNDEF;
16216 r_type = R_PPC64_TPREL16_LO;
16217 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
16218 insn2 = 0x38630000; /* addi 3,3,0 */
16219 }
727fc41e 16220 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
727fc41e
AM
16221 /* Zap the reloc on the _tls_get_addr call too. */
16222 BFD_ASSERT (offset == rel[1].r_offset);
f58d5a2d 16223 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
95f0d0d2 16224 bfd_put_32 (input_bfd, insn2, contents + offset);
c213164a
AM
16225 if (r_type != R_PPC64_NONE)
16226 goto again;
727fc41e
AM
16227 }
16228 break;
16229
411e1bfb 16230 case R_PPC64_DTPMOD64:
951fd09b
AM
16231 if (rel + 1 < relend
16232 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
16233 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 16234 {
733ae98c
AM
16235 if ((tls_mask & TLS_GD) == 0
16236 && offset_in_range (input_section, rel->r_offset, 8))
951fd09b
AM
16237 {
16238 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
b00a0a86 16239 if ((tls_mask & TLS_GDIE) != 0)
951fd09b
AM
16240 r_type = R_PPC64_TPREL64;
16241 else
16242 {
4ce794b7 16243 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
16244 r_type = R_PPC64_NONE;
16245 }
16246 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
16247 }
16248 }
16249 else
16250 {
733ae98c
AM
16251 if ((tls_mask & TLS_LD) == 0
16252 && offset_in_range (input_section, rel->r_offset, 8))
411e1bfb 16253 {
4ce794b7 16254 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 16255 r_type = R_PPC64_NONE;
951fd09b 16256 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 16257 }
411e1bfb
AM
16258 }
16259 break;
16260
16261 case R_PPC64_TPREL64:
951fd09b 16262 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
16263 {
16264 r_type = R_PPC64_NONE;
16265 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
16266 }
16267 break;
52a82034 16268
006589cf
AM
16269 case R_PPC64_ENTRY:
16270 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
16271 if (!bfd_link_pic (info)
16272 && !info->traditional_format
733ae98c
AM
16273 && relocation + 0x80008000 <= 0xffffffff
16274 && offset_in_range (input_section, rel->r_offset, 8))
006589cf
AM
16275 {
16276 unsigned int insn1, insn2;
16277
16278 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
16279 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
16280 if ((insn1 & ~0xfffc) == LD_R2_0R12
16281 && insn2 == ADD_R2_R2_R12)
16282 {
95f0d0d2 16283 bfd_put_32 (input_bfd,
006589cf
AM
16284 LIS_R2 + PPC_HA (relocation),
16285 contents + rel->r_offset);
95f0d0d2 16286 bfd_put_32 (input_bfd,
006589cf
AM
16287 ADDI_R2_R2 + PPC_LO (relocation),
16288 contents + rel->r_offset + 4);
16289 }
16290 }
16291 else
16292 {
16293 relocation -= (rel->r_offset
16294 + input_section->output_offset
16295 + input_section->output_section->vma);
733ae98c
AM
16296 if (relocation + 0x80008000 <= 0xffffffff
16297 && offset_in_range (input_section, rel->r_offset, 8))
006589cf
AM
16298 {
16299 unsigned int insn1, insn2;
16300
16301 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
16302 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
16303 if ((insn1 & ~0xfffc) == LD_R2_0R12
16304 && insn2 == ADD_R2_R2_R12)
16305 {
95f0d0d2 16306 bfd_put_32 (input_bfd,
006589cf
AM
16307 ADDIS_R2_R12 + PPC_HA (relocation),
16308 contents + rel->r_offset);
95f0d0d2 16309 bfd_put_32 (input_bfd,
006589cf
AM
16310 ADDI_R2_R2 + PPC_LO (relocation),
16311 contents + rel->r_offset + 4);
16312 }
16313 }
16314 }
16315 break;
16316
52a82034
AM
16317 case R_PPC64_REL16_HA:
16318 /* If we are generating a non-PIC executable, edit
16319 . 0: addis 2,12,.TOC.-0b@ha
16320 . addi 2,2,.TOC.-0b@l
16321 used by ELFv2 global entry points to set up r2, to
16322 . lis 2,.TOC.@ha
16323 . addi 2,2,.TOC.@l
16324 if .TOC. is in range. */
0e1862bb 16325 if (!bfd_link_pic (info)
810d4e75 16326 && !info->traditional_format
006589cf 16327 && !htab->opd_abi
4f038ee5 16328 && rel->r_addend == d_offset
52a82034
AM
16329 && h != NULL && &h->elf == htab->elf.hgot
16330 && rel + 1 < relend
16331 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
16332 && rel[1].r_offset == rel->r_offset + 4
16333 && rel[1].r_addend == rel->r_addend + 4
733ae98c
AM
16334 && relocation + 0x80008000 <= 0xffffffff
16335 && offset_in_range (input_section, rel->r_offset - d_offset, 8))
52a82034
AM
16336 {
16337 unsigned int insn1, insn2;
4a421c53 16338 offset = rel->r_offset - d_offset;
95f0d0d2
AM
16339 insn1 = bfd_get_32 (input_bfd, contents + offset);
16340 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
006589cf
AM
16341 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
16342 && (insn2 & 0xffff0000) == ADDI_R2_R2)
52a82034
AM
16343 {
16344 r_type = R_PPC64_ADDR16_HA;
16345 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
16346 rel->r_addend -= d_offset;
16347 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
16348 rel[1].r_addend -= d_offset + 4;
95f0d0d2 16349 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
52a82034
AM
16350 }
16351 }
16352 break;
411e1bfb
AM
16353 }
16354
16355 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 16356 insn = 0;
b25116a9
AM
16357 max_br_offset = 1 << 25;
16358 addend = rel->r_addend;
bc30df16 16359 reloc_dest = DEST_NORMAL;
65f38f15 16360 switch (r_type)
5bd4f169
AM
16361 {
16362 default:
65f38f15 16363 break;
5bd4f169 16364
3b421ab3
AM
16365 case R_PPC64_TOCSAVE:
16366 if (relocation + addend == (rel->r_offset
16367 + input_section->output_offset
16368 + input_section->output_section->vma)
16369 && tocsave_find (htab, NO_INSERT,
733ae98c
AM
16370 &local_syms, rel, input_bfd)
16371 && offset_in_range (input_section, rel->r_offset, 4))
3b421ab3
AM
16372 {
16373 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
16374 if (insn == NOP
16375 || insn == CROR_151515 || insn == CROR_313131)
a078d95a
AM
16376 bfd_put_32 (input_bfd,
16377 STD_R2_0R1 + STK_TOC (htab),
3b421ab3
AM
16378 contents + rel->r_offset);
16379 }
16380 break;
16381
65f38f15
AM
16382 /* Branch taken prediction relocations. */
16383 case R_PPC64_ADDR14_BRTAKEN:
16384 case R_PPC64_REL14_BRTAKEN:
cedb70c5 16385 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
1a0670f3 16386 /* Fall through. */
65f38f15 16387
86c76c7b 16388 /* Branch not taken prediction relocations. */
65f38f15
AM
16389 case R_PPC64_ADDR14_BRNTAKEN:
16390 case R_PPC64_REL14_BRNTAKEN:
733ae98c
AM
16391 if (!offset_in_range (input_section, rel->r_offset, 4))
16392 break;
95f0d0d2 16393 insn |= bfd_get_32 (input_bfd,
411e1bfb 16394 contents + rel->r_offset) & ~(0x01 << 21);
1a0670f3 16395 /* Fall through. */
86c76c7b 16396
b25116a9
AM
16397 case R_PPC64_REL14:
16398 max_br_offset = 1 << 15;
1a0670f3 16399 /* Fall through. */
5bd4f169 16400
65f38f15 16401 case R_PPC64_REL24:
05d0e962 16402 case R_PPC64_REL24_NOTOC:
7aba54da 16403 case R_PPC64_REL24_P9NOTOC:
23cedd1d 16404 case R_PPC64_PLTCALL:
5663e321 16405 case R_PPC64_PLTCALL_NOTOC:
ad8e1ba5
AM
16406 /* Calls to functions with a different TOC, such as calls to
16407 shared objects, need to alter the TOC pointer. This is
16408 done using a linkage stub. A REL24 branching to these
16409 linkage stubs needs to be followed by a nop, as the nop
16410 will be replaced with an instruction to restore the TOC
16411 base pointer. */
8387904d 16412 fdh = h;
b31867b6
AM
16413 if (h != NULL
16414 && h->oh != NULL
16415 && h->oh->is_func_descriptor)
16416 fdh = ppc_follow_link (h->oh);
31c76678
DK
16417 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
16418 htab);
5663e321
AM
16419 if ((r_type == R_PPC64_PLTCALL
16420 || r_type == R_PPC64_PLTCALL_NOTOC)
23cedd1d 16421 && stub_entry != NULL
7aba54da 16422 && stub_entry->type.main == ppc_stub_plt_call)
23cedd1d
AM
16423 stub_entry = NULL;
16424
6abec6bc 16425 if (stub_entry != NULL
7aba54da
AM
16426 && (stub_entry->type.main == ppc_stub_plt_call
16427 || stub_entry->type.r2save))
41bd81ab 16428 {
0a1b45a2 16429 bool can_plt_call = false;
721956f4 16430
7aba54da
AM
16431 if (r_type == R_PPC64_REL24_NOTOC
16432 || r_type == R_PPC64_REL24_P9NOTOC)
6e1816be 16433 {
7aba54da 16434 /* NOTOC calls don't need to restore r2. */
0a1b45a2 16435 can_plt_call = true;
6e1816be 16436 }
7aba54da
AM
16437 else if (stub_entry->type.main == ppc_stub_plt_call
16438 && !htab->opd_abi
16439 && htab->params->plt_localentry0 != 0
16440 && h != NULL
16441 && is_elfv2_localentry0 (&h->elf))
05d0e962 16442 {
7aba54da 16443 /* The function doesn't use or change r2. */
0a1b45a2 16444 can_plt_call = true;
05d0e962 16445 }
6e1816be 16446
f378ab09 16447 /* All of these stubs may modify r2, so there must be a
ba8ca3e7
AM
16448 branch and link followed by a nop. The nop is
16449 replaced by an insn to restore r2. */
733ae98c 16450 else if (offset_in_range (input_section, rel->r_offset, 8))
41bd81ab 16451 {
ba8ca3e7
AM
16452 unsigned long br;
16453
16454 br = bfd_get_32 (input_bfd,
16455 contents + rel->r_offset);
16456 if ((br & 1) != 0)
41bd81ab 16457 {
ba8ca3e7
AM
16458 unsigned long nop;
16459
16460 nop = bfd_get_32 (input_bfd,
16461 contents + rel->r_offset + 4);
23cedd1d 16462 if (nop == LD_R2_0R1 + STK_TOC (htab))
0a1b45a2 16463 can_plt_call = true;
23cedd1d
AM
16464 else if (nop == NOP
16465 || nop == CROR_151515
16466 || nop == CROR_313131)
a7f2871e 16467 {
ba8ca3e7 16468 if (h != NULL
ed7007c1 16469 && is_tls_get_addr (&h->elf, htab)
7c9cf415 16470 && htab->params->tls_get_addr_opt)
ba8ca3e7
AM
16471 {
16472 /* Special stub used, leave nop alone. */
16473 }
16474 else
a078d95a
AM
16475 bfd_put_32 (input_bfd,
16476 LD_R2_0R1 + STK_TOC (htab),
ba8ca3e7 16477 contents + rel->r_offset + 4);
0a1b45a2 16478 can_plt_call = true;
a7f2871e 16479 }
41bd81ab 16480 }
5bd4f169 16481 }
721956f4 16482
ba8ca3e7 16483 if (!can_plt_call && h != NULL)
721956f4 16484 {
ba8ca3e7
AM
16485 const char *name = h->elf.root.root.string;
16486
16487 if (*name == '.')
16488 ++name;
16489
3f3328b8 16490 if (startswith (name, "__libc_start_main")
ba8ca3e7 16491 && (name[17] == 0 || name[17] == '@'))
6ab189d5 16492 {
ba8ca3e7
AM
16493 /* Allow crt1 branch to go via a toc adjusting
16494 stub. Other calls that never return could do
16495 the same, if we could detect such. */
0a1b45a2 16496 can_plt_call = true;
6ab189d5 16497 }
ba8ca3e7
AM
16498 }
16499
16500 if (!can_plt_call)
16501 {
16502 /* g++ as of 20130507 emits self-calls without a
16503 following nop. This is arguably wrong since we
16504 have conflicting information. On the one hand a
16505 global symbol and on the other a local call
16506 sequence, but don't error for this special case.
16507 It isn't possible to cheaply verify we have
16508 exactly such a call. Allow all calls to the same
16509 section. */
16510 asection *code_sec = sec;
16511
16512 if (get_opd_info (sec) != NULL)
ad8e1ba5 16513 {
ba8ca3e7
AM
16514 bfd_vma off = (relocation + addend
16515 - sec->output_section->vma
16516 - sec->output_offset);
bc30df16 16517
0a1b45a2 16518 opd_entry_value (sec, off, &code_sec, NULL, false);
ad8e1ba5 16519 }
ba8ca3e7 16520 if (code_sec == input_section)
0a1b45a2 16521 can_plt_call = true;
ba8ca3e7
AM
16522 }
16523
16524 if (!can_plt_call)
16525 {
7aba54da 16526 if (stub_entry->type.main == ppc_stub_plt_call)
4805fc55 16527 info->callbacks->einfo
695344c0 16528 /* xgettext:c-format */
c1c8c1ef 16529 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 16530 "(plt call stub)\n"),
4805fc55
AM
16531 input_bfd, input_section, rel->r_offset, sym_name);
16532 else
16533 info->callbacks->einfo
695344c0 16534 /* xgettext:c-format */
c1c8c1ef 16535 (_("%H: call to `%pT' lacks nop, can't restore toc; "
f53ad3cf 16536 "(toc save/adjust stub)\n"),
4805fc55 16537 input_bfd, input_section, rel->r_offset, sym_name);
ba8ca3e7
AM
16538
16539 bfd_set_error (bfd_error_bad_value);
0a1b45a2 16540 ret = false;
721956f4
AM
16541 }
16542
b25116a9 16543 if (can_plt_call
7aba54da 16544 && stub_entry->type.main == ppc_stub_plt_call)
0a1b45a2 16545 unresolved_reloc = false;
b25116a9
AM
16546 }
16547
6abec6bc 16548 if ((stub_entry == NULL
7aba54da
AM
16549 || stub_entry->type.main == ppc_stub_long_branch
16550 || stub_entry->type.main == ppc_stub_plt_branch)
8387904d
AM
16551 && get_opd_info (sec) != NULL)
16552 {
16553 /* The branch destination is the value of the opd entry. */
4cc603a5
AM
16554 bfd_vma off = (relocation + addend
16555 - sec->output_section->vma
16556 - sec->output_offset);
0a1b45a2 16557 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, false);
8387904d
AM
16558 if (dest != (bfd_vma) -1)
16559 {
16560 relocation = dest;
16561 addend = 0;
bc30df16 16562 reloc_dest = DEST_OPD;
8387904d
AM
16563 }
16564 }
16565
b25116a9
AM
16566 /* If the branch is out of reach we ought to have a long
16567 branch stub. */
16568 from = (rel->r_offset
16569 + input_section->output_offset
16570 + input_section->output_section->vma);
16571
6911b7dc
AM
16572 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
16573 ? fdh->elf.other
16574 : sym->st_other);
16575
6abec6bc 16576 if (stub_entry != NULL
7aba54da
AM
16577 && (stub_entry->type.main == ppc_stub_long_branch
16578 || stub_entry->type.main == ppc_stub_plt_branch))
16579 {
16580 if (stub_entry->type.sub == ppc_stub_toc
16581 && !stub_entry->type.r2save
16582 && (r_type == R_PPC64_ADDR14_BRTAKEN
16583 || r_type == R_PPC64_ADDR14_BRNTAKEN
16584 || (relocation + addend - from + max_br_offset
16585 < 2 * max_br_offset)))
16586 /* Don't use the stub if this branch is in range. */
16587 stub_entry = NULL;
16588
16589 if (stub_entry != NULL
16590 && stub_entry->type.sub >= ppc_stub_notoc
16591 && ((r_type != R_PPC64_REL24_NOTOC
16592 && r_type != R_PPC64_REL24_P9NOTOC)
16593 || ((fdh ? fdh->elf.other : sym->st_other)
16594 & STO_PPC64_LOCAL_MASK) <= 1 << STO_PPC64_LOCAL_BIT)
16595 && (relocation + addend - from + max_br_offset
16596 < 2 * max_br_offset))
16597 stub_entry = NULL;
16598
16599 if (stub_entry != NULL
16600 && stub_entry->type.r2save
16601 && (r_type == R_PPC64_REL24_NOTOC
16602 || r_type == R_PPC64_REL24_P9NOTOC)
16603 && (relocation + addend - from + max_br_offset
16604 < 2 * max_br_offset))
16605 stub_entry = NULL;
16606 }
05d0e962 16607
b25116a9
AM
16608 if (stub_entry != NULL)
16609 {
16610 /* Munge up the value and addend so that we call the stub
16611 rather than the procedure directly. */
a4b6fadd
AM
16612 asection *stub_sec = stub_entry->group->stub_sec;
16613
7aba54da 16614 if (stub_entry->type.main == ppc_stub_save_res)
a4b6fadd
AM
16615 relocation += (stub_sec->output_offset
16616 + stub_sec->output_section->vma
16617 + stub_sec->size - htab->sfpr->size
16618 - htab->sfpr->output_offset
16619 - htab->sfpr->output_section->vma);
16620 else
16621 relocation = (stub_entry->stub_offset
16622 + stub_sec->output_offset
16623 + stub_sec->output_section->vma);
b25116a9 16624 addend = 0;
bc30df16 16625 reloc_dest = DEST_STUB;
3b421ab3 16626
7aba54da
AM
16627 if (((stub_entry->type.r2save
16628 && (r_type == R_PPC64_REL24_NOTOC
16629 || r_type == R_PPC64_REL24_P9NOTOC))
16630 || ((stub_entry->type.main == ppc_stub_plt_call
16631 && (ALWAYS_EMIT_R2SAVE || stub_entry->type.r2save))
16632 && rel + 1 < relend
16633 && rel[1].r_offset == rel->r_offset + 4
16634 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE))
16635 && !(stub_entry->type.main == ppc_stub_plt_call
16636 && htab->params->tls_get_addr_opt
16637 && h != NULL
16638 && is_tls_get_addr (&h->elf, htab)))
29433886
AM
16639 {
16640 /* Skip over the r2 store at the start of the stub. */
7aba54da 16641 relocation += 4;
29433886 16642 }
5663e321 16643
7aba54da
AM
16644 if ((r_type == R_PPC64_REL24_NOTOC
16645 || r_type == R_PPC64_REL24_P9NOTOC)
16646 && stub_entry->type.main == ppc_stub_plt_call
16647 && stub_entry->type.sub >= ppc_stub_notoc)
5663e321 16648 htab->notoc_plt = 1;
b25116a9
AM
16649 }
16650
16651 if (insn != 0)
16652 {
794e51c0 16653 if (is_isa_v2)
721956f4 16654 {
b25116a9
AM
16655 /* Set 'a' bit. This is 0b00010 in BO field for branch
16656 on CR(BI) insns (BO == 001at or 011at), and 0b01000
16657 for branch on CTR insns (BO == 1a00t or 1a01t). */
16658 if ((insn & (0x14 << 21)) == (0x04 << 21))
16659 insn |= 0x02 << 21;
16660 else if ((insn & (0x14 << 21)) == (0x10 << 21))
16661 insn |= 0x08 << 21;
16662 else
16663 break;
16664 }
16665 else
16666 {
16667 /* Invert 'y' bit if not the default. */
4cc603a5 16668 if ((bfd_signed_vma) (relocation + addend - from) < 0)
b25116a9 16669 insn ^= 0x01 << 21;
721956f4 16670 }
b25116a9 16671
95f0d0d2 16672 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
5bd4f169 16673 }
e86ce104 16674
06da1e8e
AM
16675 /* NOP out calls to undefined weak functions.
16676 We can thus call a weak function without first
16677 checking whether the function is defined. */
b25116a9 16678 else if (h != NULL
039b3fef 16679 && h->elf.root.type == bfd_link_hash_undefweak
766bc656 16680 && h->elf.dynindx == -1
05d0e962 16681 && (r_type == R_PPC64_REL24
7aba54da
AM
16682 || r_type == R_PPC64_REL24_NOTOC
16683 || r_type == R_PPC64_REL24_P9NOTOC)
b25116a9 16684 && relocation == 0
733ae98c
AM
16685 && addend == 0
16686 && offset_in_range (input_section, rel->r_offset, 4))
e86ce104 16687 {
95f0d0d2 16688 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
c316a17c 16689 goto copy_reloc;
e86ce104 16690 }
65f38f15 16691 break;
066f4018
AM
16692
16693 case R_PPC64_GOT16_DS:
6738c8a7 16694 if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC
3a3a4c1f
AM
16695 || (bfd_link_pic (info)
16696 && sec == bfd_abs_section_ptr)
6738c8a7 16697 || !htab->do_toc_opt)
06507dab 16698 break;
066f4018
AM
16699 from = TOCstart + htab->sec_info[input_section->id].toc_off;
16700 if (relocation + addend - from + 0x8000 < 0x10000
f5b9c288
AM
16701 && sec != NULL
16702 && sec->output_section != NULL
16703 && !discarded_section (sec)
733ae98c
AM
16704 && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, &h->elf))
16705 && offset_in_range (input_section, rel->r_offset & ~3, 4))
066f4018
AM
16706 {
16707 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 16708 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
16709 {
16710 insn += (14u << 26) - (58u << 26);
16711 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
16712 r_type = R_PPC64_TOC16;
16713 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
16714 }
16715 }
16716 break;
16717
16718 case R_PPC64_GOT16_LO_DS:
16719 case R_PPC64_GOT16_HA:
6738c8a7 16720 if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC
3a3a4c1f
AM
16721 || (bfd_link_pic (info)
16722 && sec == bfd_abs_section_ptr)
6738c8a7 16723 || !htab->do_toc_opt)
06507dab 16724 break;
066f4018
AM
16725 from = TOCstart + htab->sec_info[input_section->id].toc_off;
16726 if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL
f5b9c288
AM
16727 && sec != NULL
16728 && sec->output_section != NULL
16729 && !discarded_section (sec)
733ae98c
AM
16730 && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, &h->elf))
16731 && offset_in_range (input_section, rel->r_offset & ~3, 4))
066f4018
AM
16732 {
16733 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
fba8689a
AM
16734 if (r_type == R_PPC64_GOT16_LO_DS
16735 && (insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */)
066f4018
AM
16736 {
16737 insn += (14u << 26) - (58u << 26);
16738 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3));
16739 r_type = R_PPC64_TOC16_LO;
16740 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
16741 }
fba8689a
AM
16742 else if (r_type == R_PPC64_GOT16_HA
16743 && (insn & (0x3fu << 26)) == 15u << 26 /* addis */)
066f4018
AM
16744 {
16745 r_type = R_PPC64_TOC16_HA;
16746 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
16747 }
16748 }
16749 break;
4a421c53
AM
16750
16751 case R_PPC64_GOT_PCREL34:
6738c8a7 16752 if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC
3a3a4c1f
AM
16753 || (bfd_link_pic (info)
16754 && sec == bfd_abs_section_ptr)
6738c8a7 16755 || !htab->do_toc_opt)
06507dab 16756 break;
4a421c53
AM
16757 from = (rel->r_offset
16758 + input_section->output_section->vma
16759 + input_section->output_offset);
6738c8a7 16760 if (!(relocation - from + (1ULL << 33) < 1ULL << 34
f5b9c288
AM
16761 && sec != NULL
16762 && sec->output_section != NULL
16763 && !discarded_section (sec)
733ae98c
AM
16764 && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, &h->elf))
16765 && offset_in_range (input_section, rel->r_offset, 8)))
6738c8a7
AM
16766 break;
16767
16768 offset = rel->r_offset;
16769 pinsn = bfd_get_32 (input_bfd, contents + offset);
16770 pinsn <<= 32;
16771 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
16772 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
16773 != ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */))
16774 break;
16775
16776 /* Replace with paddi. */
16777 pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26);
16778 r_type = R_PPC64_PCREL34;
16779 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
16780 bfd_put_32 (input_bfd, pinsn >> 32, contents + offset);
16781 bfd_put_32 (input_bfd, pinsn, contents + offset + 4);
16782 /* Fall through. */
4a421c53
AM
16783
16784 case R_PPC64_PCREL34:
6738c8a7
AM
16785 if (!htab->params->no_pcrel_opt
16786 && rel + 1 < relend
16787 && rel[1].r_offset == rel->r_offset
16788 && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT)
733ae98c
AM
16789 && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, &h->elf))
16790 && offset_in_range (input_section, rel->r_offset, 8))
4a421c53
AM
16791 {
16792 offset = rel->r_offset;
16793 pinsn = bfd_get_32 (input_bfd, contents + offset);
16794 pinsn <<= 32;
16795 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
16796 if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
16797 == ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
16798 | (14ULL << 26) /* paddi */))
16799 {
6738c8a7
AM
16800 bfd_vma off2 = rel[1].r_addend;
16801 if (off2 == 0)
16802 /* zero means next insn. */
16803 off2 = 8;
16804 off2 += offset;
733ae98c 16805 if (offset_in_range (input_section, off2, 4))
4a421c53 16806 {
6738c8a7
AM
16807 uint64_t pinsn2;
16808 bfd_signed_vma addend_off;
16809 pinsn2 = bfd_get_32 (input_bfd, contents + off2);
16810 pinsn2 <<= 32;
16811 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
4a421c53 16812 {
733ae98c 16813 if (!offset_in_range (input_section, off2, 8))
6738c8a7
AM
16814 break;
16815 pinsn2 |= bfd_get_32 (input_bfd,
16816 contents + off2 + 4);
16817 }
16818 if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off))
16819 {
16820 addend += addend_off;
16821 rel->r_addend = addend;
16822 bfd_put_32 (input_bfd, pinsn >> 32,
16823 contents + offset);
16824 bfd_put_32 (input_bfd, pinsn,
16825 contents + offset + 4);
16826 bfd_put_32 (input_bfd, pinsn2 >> 32,
16827 contents + off2);
4a421c53 16828 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
6738c8a7
AM
16829 bfd_put_32 (input_bfd, pinsn2,
16830 contents + off2 + 4);
4a421c53
AM
16831 }
16832 }
16833 }
16834 }
16835 break;
65f38f15 16836 }
5bd4f169 16837
411e1bfb 16838 tls_type = 0;
23cedd1d 16839 save_unresolved_reloc = unresolved_reloc;
65f38f15
AM
16840 switch (r_type)
16841 {
16842 default:
cf97bcb0
AM
16843 /* xgettext:c-format */
16844 _bfd_error_handler (_("%pB: %s unsupported"),
16845 input_bfd, ppc64_elf_howto_table[r_type]->name);
5bd4f169 16846
65f38f15 16847 bfd_set_error (bfd_error_bad_value);
0a1b45a2 16848 ret = false;
c316a17c 16849 goto copy_reloc;
5bd4f169 16850
65f38f15 16851 case R_PPC64_NONE:
411e1bfb 16852 case R_PPC64_TLS:
727fc41e
AM
16853 case R_PPC64_TLSGD:
16854 case R_PPC64_TLSLD:
3b421ab3 16855 case R_PPC64_TOCSAVE:
04c9666a
AM
16856 case R_PPC64_GNU_VTINHERIT:
16857 case R_PPC64_GNU_VTENTRY:
006589cf 16858 case R_PPC64_ENTRY:
4a421c53 16859 case R_PPC64_PCREL_OPT:
c316a17c 16860 goto copy_reloc;
5bd4f169
AM
16861
16862 /* GOT16 relocations. Like an ADDR16 using the symbol's
16863 address in the GOT as relocation value instead of the
411e1bfb 16864 symbol's value itself. Also, create a GOT entry for the
5bd4f169 16865 symbol and put the symbol value there. */
411e1bfb
AM
16866 case R_PPC64_GOT_TLSGD16:
16867 case R_PPC64_GOT_TLSGD16_LO:
16868 case R_PPC64_GOT_TLSGD16_HI:
16869 case R_PPC64_GOT_TLSGD16_HA:
87c69f97 16870 case R_PPC64_GOT_TLSGD_PCREL34:
951fd09b 16871 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
16872 goto dogot;
16873
16874 case R_PPC64_GOT_TLSLD16:
16875 case R_PPC64_GOT_TLSLD16_LO:
16876 case R_PPC64_GOT_TLSLD16_HI:
16877 case R_PPC64_GOT_TLSLD16_HA:
87c69f97 16878 case R_PPC64_GOT_TLSLD_PCREL34:
951fd09b 16879 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
16880 goto dogot;
16881
16882 case R_PPC64_GOT_TPREL16_DS:
16883 case R_PPC64_GOT_TPREL16_LO_DS:
16884 case R_PPC64_GOT_TPREL16_HI:
16885 case R_PPC64_GOT_TPREL16_HA:
87c69f97 16886 case R_PPC64_GOT_TPREL_PCREL34:
411e1bfb
AM
16887 tls_type = TLS_TLS | TLS_TPREL;
16888 goto dogot;
16889
16890 case R_PPC64_GOT_DTPREL16_DS:
16891 case R_PPC64_GOT_DTPREL16_LO_DS:
16892 case R_PPC64_GOT_DTPREL16_HI:
16893 case R_PPC64_GOT_DTPREL16_HA:
87c69f97 16894 case R_PPC64_GOT_DTPREL_PCREL34:
411e1bfb
AM
16895 tls_type = TLS_TLS | TLS_DTPREL;
16896 goto dogot;
16897
65f38f15
AM
16898 case R_PPC64_GOT16:
16899 case R_PPC64_GOT16_LO:
16900 case R_PPC64_GOT16_HI:
16901 case R_PPC64_GOT16_HA:
16902 case R_PPC64_GOT16_DS:
16903 case R_PPC64_GOT16_LO_DS:
5663e321 16904 case R_PPC64_GOT_PCREL34:
411e1bfb 16905 dogot:
5bd4f169
AM
16906 {
16907 /* Relocation is to the entry for this symbol in the global
16908 offset table. */
e717da7e 16909 asection *got;
d881513a 16910 bfd_vma *offp;
5bd4f169 16911 bfd_vma off;
d881513a 16912 unsigned long indx = 0;
927be08e 16913 struct got_entry *ent;
65f38f15 16914
d881513a 16915 if (tls_type == (TLS_TLS | TLS_LD)
9e51d549 16916 && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
927be08e 16917 ent = ppc64_tlsld_got (input_bfd);
411e1bfb 16918 else
5bd4f169 16919 {
d881513a
AM
16920 if (h != NULL)
16921 {
f0158f44
AM
16922 if (!htab->elf.dynamic_sections_created
16923 || h->elf.dynindx == -1
16924 || SYMBOL_REFERENCES_LOCAL (info, &h->elf)
21d68fcd 16925 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
d881513a
AM
16926 /* This is actually a static link, or it is a
16927 -Bsymbolic link and the symbol is defined
16928 locally, or the symbol was forced to be local
16929 because of a version file. */
16930 ;
16931 else
16932 {
039b3fef 16933 indx = h->elf.dynindx;
0a1b45a2 16934 unresolved_reloc = false;
d881513a 16935 }
039b3fef 16936 ent = h->elf.got.glist;
d881513a 16937 }
411e1bfb 16938 else
5bd4f169 16939 {
d881513a
AM
16940 if (local_got_ents == NULL)
16941 abort ();
16942 ent = local_got_ents[r_symndx];
5bd4f169 16943 }
d881513a
AM
16944
16945 for (; ent != NULL; ent = ent->next)
133a1f60 16946 if (ent->addend == orig_rel.r_addend
e717da7e 16947 && ent->owner == input_bfd
d881513a
AM
16948 && ent->tls_type == tls_type)
16949 break;
5bd4f169 16950 }
411e1bfb 16951
927be08e
AM
16952 if (ent == NULL)
16953 abort ();
16954 if (ent->is_indirect)
16955 ent = ent->got.ent;
16956 offp = &ent->got.offset;
16957 got = ppc64_elf_tdata (ent->owner)->got;
e717da7e
AM
16958 if (got == NULL)
16959 abort ();
16960
411e1bfb
AM
16961 /* The offset must always be a multiple of 8. We use the
16962 least significant bit to record whether we have already
16963 processed this entry. */
d881513a 16964 off = *offp;
411e1bfb
AM
16965 if ((off & 1) != 0)
16966 off &= ~1;
5bd4f169
AM
16967 else
16968 {
411e1bfb
AM
16969 /* Generate relocs for the dynamic linker, except in
16970 the case of TLSLD where we'll use one entry per
16971 module. */
25f23106 16972 asection *relgot;
0a1b45a2 16973 bool ifunc;
e717da7e 16974
d881513a 16975 *offp = off | 1;
25f23106
AM
16976 relgot = NULL;
16977 ifunc = (h != NULL
16978 ? h->elf.type == STT_GNU_IFUNC
16979 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
19e08130 16980 if (ifunc)
82e66161
AM
16981 {
16982 relgot = htab->elf.irelplt;
efb2a7b4 16983 if (indx == 0 || is_static_defined (&h->elf))
0a1b45a2 16984 htab->elf.ifunc_resolvers = true;
82e66161 16985 }
f0158f44
AM
16986 else if (indx != 0
16987 || (bfd_link_pic (info)
16988 && (h == NULL
f749f26e
AM
16989 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
16990 && !(tls_type != 0
f15d0b54 16991 && bfd_link_executable (info)
9e51d549
AM
16992 && (h == NULL
16993 || SYMBOL_REFERENCES_LOCAL (info,
3a3a4c1f
AM
16994 &h->elf)))
16995 && (h != NULL
16996 ? !bfd_is_abs_symbol (&h->elf.root)
16997 : sym->st_shndx != SHN_ABS)))
16998
19e08130 16999 relgot = ppc64_elf_tdata (ent->owner)->relgot;
25f23106 17000 if (relgot != NULL)
5bd4f169 17001 {
e717da7e
AM
17002 outrel.r_offset = (got->output_section->vma
17003 + got->output_offset
411e1bfb 17004 + off);
133a1f60 17005 outrel.r_addend = orig_rel.r_addend;
d881513a 17006 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 17007 {
411e1bfb 17008 outrel.r_addend = 0;
e515b051 17009 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
17010 if (tls_type == (TLS_TLS | TLS_GD))
17011 {
066c738e
AM
17012 BFD_ASSERT (count_and_swap_reloc_out (output_bfd,
17013 &outrel,
17014 relgot));
e515b051 17015 outrel.r_offset += 8;
133a1f60 17016 outrel.r_addend = orig_rel.r_addend;
d881513a
AM
17017 outrel.r_info
17018 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 17019 }
411e1bfb 17020 }
951fd09b 17021 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 17022 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 17023 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 17024 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
25f23106
AM
17025 else if (indx != 0)
17026 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
17027 else
81407a69 17028 {
25f23106
AM
17029 if (ifunc)
17030 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
17031 else
17032 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
17033
17034 /* Write the .got section contents for the sake
17035 of prelink. */
e717da7e 17036 loc = got->contents + off;
23fbd6fa
JJ
17037 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
17038 loc);
81407a69 17039 }
81407a69
AM
17040
17041 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
17042 {
17043 outrel.r_addend += relocation;
17044 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
989f9879
AM
17045 {
17046 if (htab->elf.tls_sec == NULL)
17047 outrel.r_addend = 0;
17048 else
17049 outrel.r_addend -= htab->elf.tls_sec->vma;
17050 }
e515b051 17051 }
1657026c
AM
17052 if (!(info->enable_dt_relr
17053 && ELF64_R_TYPE (outrel.r_info) == R_PPC64_RELATIVE))
066c738e
AM
17054 BFD_ASSERT (count_and_swap_reloc_out (output_bfd,
17055 &outrel, relgot));
411e1bfb
AM
17056 }
17057
ad8e1ba5 17058 /* Init the .got section contents here if we're not
81407a69 17059 emitting a reloc. */
d881513a 17060 else
411e1bfb 17061 {
133a1f60 17062 relocation += orig_rel.r_addend;
f0158f44 17063 if (tls_type != 0)
411e1bfb 17064 {
989f9879
AM
17065 if (htab->elf.tls_sec == NULL)
17066 relocation = 0;
17067 else
17068 {
f0158f44
AM
17069 if (tls_type & TLS_LD)
17070 relocation = 0;
17071 else
17072 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
676ee2b5 17073 if (tls_type & TLS_TPREL)
989f9879
AM
17074 relocation += DTP_OFFSET - TP_OFFSET;
17075 }
5bd4f169 17076
f0158f44 17077 if (tls_type & (TLS_GD | TLS_LD))
7b609f53
AM
17078 {
17079 bfd_put_64 (output_bfd, relocation,
e717da7e 17080 got->contents + off + 8);
676ee2b5 17081 relocation = 1;
7b609f53 17082 }
411e1bfb
AM
17083 }
17084 bfd_put_64 (output_bfd, relocation,
e717da7e 17085 got->contents + off);
5bd4f169
AM
17086 }
17087 }
17088
65f38f15
AM
17089 if (off >= (bfd_vma) -2)
17090 abort ();
17091
bf102f86 17092 relocation = got->output_section->vma + got->output_offset + off;
133a1f60 17093 addend = 0;
c213164a 17094 if (!(r_type == R_PPC64_GOT_PCREL34
87c69f97
AM
17095 || r_type == R_PPC64_GOT_TLSGD_PCREL34
17096 || r_type == R_PPC64_GOT_TLSLD_PCREL34
17097 || r_type == R_PPC64_GOT_TPREL_PCREL34
17098 || r_type == R_PPC64_GOT_DTPREL_PCREL34))
5663e321 17099 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
5bd4f169 17100 }
65f38f15
AM
17101 break;
17102
17103 case R_PPC64_PLT16_HA:
17104 case R_PPC64_PLT16_HI:
17105 case R_PPC64_PLT16_LO:
08be3224 17106 case R_PPC64_PLT16_LO_DS:
5663e321
AM
17107 case R_PPC64_PLT_PCREL34:
17108 case R_PPC64_PLT_PCREL34_NOTOC:
65f38f15
AM
17109 case R_PPC64_PLT32:
17110 case R_PPC64_PLT64:
23cedd1d 17111 case R_PPC64_PLTSEQ:
5663e321 17112 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d 17113 case R_PPC64_PLTCALL:
5663e321 17114 case R_PPC64_PLTCALL_NOTOC:
65f38f15
AM
17115 /* Relocation is to the entry for this symbol in the
17116 procedure linkage table. */
0a1b45a2 17117 unresolved_reloc = true;
cbf95972
AM
17118 {
17119 struct plt_entry **plt_list = NULL;
17120 if (h != NULL)
17121 plt_list = &h->elf.plt.plist;
17122 else if (local_got_ents != NULL)
17123 {
17124 struct plt_entry **local_plt = (struct plt_entry **)
17125 (local_got_ents + symtab_hdr->sh_info);
2d7ad24e 17126 plt_list = local_plt + r_symndx;
cbf95972
AM
17127 }
17128 if (plt_list)
17129 {
17130 struct plt_entry *ent;
65f38f15 17131
cbf95972
AM
17132 for (ent = *plt_list; ent != NULL; ent = ent->next)
17133 if (ent->plt.offset != (bfd_vma) -1
133a1f60 17134 && ent->addend == orig_rel.r_addend)
cbf95972
AM
17135 {
17136 asection *plt;
08be3224 17137 bfd_vma got;
cbf95972
AM
17138
17139 plt = htab->elf.splt;
30845f11 17140 if (use_local_plt (info, elf_hash_entry (h)))
2d7ad24e
AM
17141 {
17142 if (h != NULL
17143 ? h->elf.type == STT_GNU_IFUNC
17144 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
17145 plt = htab->elf.iplt;
17146 else
17147 plt = htab->pltlocal;
17148 }
17149 relocation = (plt->output_section->vma
17150 + plt->output_offset
17151 + ent->plt.offset);
08be3224 17152 if (r_type == R_PPC64_PLT16_HA
2cdcc330
AM
17153 || r_type == R_PPC64_PLT16_HI
17154 || r_type == R_PPC64_PLT16_LO
17155 || r_type == R_PPC64_PLT16_LO_DS)
08be3224
AM
17156 {
17157 got = (elf_gp (output_bfd)
17158 + htab->sec_info[input_section->id].toc_off);
17159 relocation -= got;
17160 }
133a1f60 17161 addend = 0;
0a1b45a2 17162 unresolved_reloc = false;
cbf95972
AM
17163 break;
17164 }
17165 }
17166 }
65f38f15 17167 break;
5bd4f169 17168
0b13192e
AM
17169 case R_PPC64_TOC:
17170 /* Relocation value is TOC base. */
17171 relocation = TOCstart;
cf35638d 17172 if (r_symndx == STN_UNDEF)
6f20ed8a 17173 relocation += htab->sec_info[input_section->id].toc_off;
8517fae7
AM
17174 else if (unresolved_reloc)
17175 ;
6f20ed8a
AM
17176 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
17177 relocation += htab->sec_info[sec->id].toc_off;
0b13192e 17178 else
0a1b45a2 17179 unresolved_reloc = true;
10040916
AM
17180 if (unresolved_reloc
17181 || (!is_opd
17182 && h != NULL
17183 && !SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
17184 info->callbacks->einfo
17185 /* xgettext:c-format */
17186 (_("%H: %s against %pT is not supported\n"),
17187 input_bfd, input_section, rel->r_offset,
17188 ppc64_elf_howto_table[r_type]->name, sym_name);
ab96bf03 17189 goto dodyn;
0b13192e 17190
5bd4f169
AM
17191 /* TOC16 relocs. We want the offset relative to the TOC base,
17192 which is the address of the start of the TOC plus 0x8000.
17193 The TOC consists of sections .got, .toc, .tocbss, and .plt,
17194 in this order. */
65f38f15
AM
17195 case R_PPC64_TOC16:
17196 case R_PPC64_TOC16_LO:
17197 case R_PPC64_TOC16_HI:
17198 case R_PPC64_TOC16_DS:
17199 case R_PPC64_TOC16_LO_DS:
17200 case R_PPC64_TOC16_HA:
6f20ed8a 17201 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
1bdd8fac
AM
17202 if (h != NULL)
17203 goto dodyn;
5bd4f169
AM
17204 break;
17205
17206 /* Relocate against the beginning of the section. */
65f38f15
AM
17207 case R_PPC64_SECTOFF:
17208 case R_PPC64_SECTOFF_LO:
17209 case R_PPC64_SECTOFF_HI:
17210 case R_PPC64_SECTOFF_DS:
17211 case R_PPC64_SECTOFF_LO_DS:
17212 case R_PPC64_SECTOFF_HA:
4ce794b7 17213 if (sec != NULL)
65f38f15 17214 addend -= sec->output_section->vma;
5bd4f169
AM
17215 break;
17216
25f23106
AM
17217 case R_PPC64_REL16:
17218 case R_PPC64_REL16_LO:
17219 case R_PPC64_REL16_HI:
17220 case R_PPC64_REL16_HA:
4a969973
AM
17221 case R_PPC64_REL16_HIGH:
17222 case R_PPC64_REL16_HIGHA:
17223 case R_PPC64_REL16_HIGHER:
17224 case R_PPC64_REL16_HIGHERA:
17225 case R_PPC64_REL16_HIGHEST:
17226 case R_PPC64_REL16_HIGHESTA:
5663e321
AM
17227 case R_PPC64_REL16_HIGHER34:
17228 case R_PPC64_REL16_HIGHERA34:
17229 case R_PPC64_REL16_HIGHEST34:
17230 case R_PPC64_REL16_HIGHESTA34:
a680de9a 17231 case R_PPC64_REL16DX_HA:
721956f4
AM
17232 case R_PPC64_REL14:
17233 case R_PPC64_REL14_BRNTAKEN:
17234 case R_PPC64_REL14_BRTAKEN:
5d1634d7 17235 case R_PPC64_REL24:
05d0e962 17236 case R_PPC64_REL24_NOTOC:
7aba54da 17237 case R_PPC64_REL24_P9NOTOC:
5663e321
AM
17238 case R_PPC64_PCREL34:
17239 case R_PPC64_PCREL28:
5d1634d7
AM
17240 break;
17241
411e1bfb
AM
17242 case R_PPC64_TPREL16:
17243 case R_PPC64_TPREL16_LO:
17244 case R_PPC64_TPREL16_HI:
17245 case R_PPC64_TPREL16_HA:
17246 case R_PPC64_TPREL16_DS:
17247 case R_PPC64_TPREL16_LO_DS:
f9c6b907
AM
17248 case R_PPC64_TPREL16_HIGH:
17249 case R_PPC64_TPREL16_HIGHA:
411e1bfb
AM
17250 case R_PPC64_TPREL16_HIGHER:
17251 case R_PPC64_TPREL16_HIGHERA:
17252 case R_PPC64_TPREL16_HIGHEST:
17253 case R_PPC64_TPREL16_HIGHESTA:
766bc656
AM
17254 if (h != NULL
17255 && h->elf.root.type == bfd_link_hash_undefweak
733ae98c
AM
17256 && h->elf.dynindx == -1
17257 && offset_in_range (input_section, rel->r_offset - d_offset, 4))
766bc656
AM
17258 {
17259 /* Make this relocation against an undefined weak symbol
17260 resolve to zero. This is really just a tweak, since
17261 code using weak externs ought to check that they are
17262 defined before using them. */
17263 bfd_byte *p = contents + rel->r_offset - d_offset;
17264
95f0d0d2 17265 insn = bfd_get_32 (input_bfd, p);
766bc656
AM
17266 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
17267 if (insn != 0)
95f0d0d2 17268 bfd_put_32 (input_bfd, insn, p);
766bc656
AM
17269 break;
17270 }
beaddc1a
AM
17271 /* Fall through. */
17272
17273 case R_PPC64_TPREL34:
989f9879
AM
17274 if (htab->elf.tls_sec != NULL)
17275 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7c8bbca5
AM
17276 /* The TPREL16 relocs shouldn't really be used in shared
17277 libs or with non-local symbols as that will result in
17278 DT_TEXTREL being set, but support them anyway. */
17279 goto dodyn;
411e1bfb
AM
17280
17281 case R_PPC64_DTPREL16:
17282 case R_PPC64_DTPREL16_LO:
17283 case R_PPC64_DTPREL16_HI:
17284 case R_PPC64_DTPREL16_HA:
17285 case R_PPC64_DTPREL16_DS:
17286 case R_PPC64_DTPREL16_LO_DS:
f9c6b907
AM
17287 case R_PPC64_DTPREL16_HIGH:
17288 case R_PPC64_DTPREL16_HIGHA:
411e1bfb
AM
17289 case R_PPC64_DTPREL16_HIGHER:
17290 case R_PPC64_DTPREL16_HIGHERA:
17291 case R_PPC64_DTPREL16_HIGHEST:
17292 case R_PPC64_DTPREL16_HIGHESTA:
c213164a 17293 case R_PPC64_DTPREL34:
989f9879
AM
17294 if (htab->elf.tls_sec != NULL)
17295 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
17296 break;
17297
45965137
AM
17298 case R_PPC64_ADDR64_LOCAL:
17299 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
17300 ? h->elf.other
17301 : sym->st_other);
17302 break;
17303
e515b051
AM
17304 case R_PPC64_DTPMOD64:
17305 relocation = 1;
17306 addend = 0;
17307 goto dodyn;
17308
411e1bfb 17309 case R_PPC64_TPREL64:
989f9879
AM
17310 if (htab->elf.tls_sec != NULL)
17311 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
17312 goto dodyn;
17313
17314 case R_PPC64_DTPREL64:
989f9879
AM
17315 if (htab->elf.tls_sec != NULL)
17316 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
1a0670f3 17317 /* Fall through. */
411e1bfb 17318
65f38f15
AM
17319 /* Relocations that may need to be propagated if this is a
17320 dynamic object. */
04c9666a 17321 case R_PPC64_REL30:
65f38f15
AM
17322 case R_PPC64_REL32:
17323 case R_PPC64_REL64:
17324 case R_PPC64_ADDR14:
17325 case R_PPC64_ADDR14_BRNTAKEN:
17326 case R_PPC64_ADDR14_BRTAKEN:
17327 case R_PPC64_ADDR16:
17328 case R_PPC64_ADDR16_DS:
17329 case R_PPC64_ADDR16_HA:
17330 case R_PPC64_ADDR16_HI:
f9c6b907
AM
17331 case R_PPC64_ADDR16_HIGH:
17332 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
17333 case R_PPC64_ADDR16_HIGHER:
17334 case R_PPC64_ADDR16_HIGHERA:
17335 case R_PPC64_ADDR16_HIGHEST:
17336 case R_PPC64_ADDR16_HIGHESTA:
17337 case R_PPC64_ADDR16_LO:
17338 case R_PPC64_ADDR16_LO_DS:
5663e321
AM
17339 case R_PPC64_ADDR16_HIGHER34:
17340 case R_PPC64_ADDR16_HIGHERA34:
17341 case R_PPC64_ADDR16_HIGHEST34:
17342 case R_PPC64_ADDR16_HIGHESTA34:
65f38f15 17343 case R_PPC64_ADDR24:
65f38f15
AM
17344 case R_PPC64_ADDR32:
17345 case R_PPC64_ADDR64:
17346 case R_PPC64_UADDR16:
17347 case R_PPC64_UADDR32:
17348 case R_PPC64_UADDR64:
5663e321
AM
17349 case R_PPC64_D34:
17350 case R_PPC64_D34_LO:
17351 case R_PPC64_D34_HI30:
17352 case R_PPC64_D34_HA30:
17353 case R_PPC64_D28:
411e1bfb 17354 dodyn:
5d1634d7 17355 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
17356 break;
17357
41bd81ab
AM
17358 if (NO_OPD_RELOCS && is_opd)
17359 break;
17360
8a9e8e72 17361 if (bfd_link_pic (info)
b1b07054 17362 ? ((h == NULL
190eb1dd 17363 || h->elf.dyn_relocs != NULL)
b1b07054
AM
17364 && ((h != NULL && pc_dynrelocs (h))
17365 || must_be_dyn_reloc (info, r_type)))
8a9e8e72 17366 : (h != NULL
190eb1dd 17367 ? h->elf.dyn_relocs != NULL
d311bc8b 17368 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
65f38f15 17369 {
0a1b45a2 17370 bool skip, relocate;
65f38f15 17371 asection *sreloc;
1cf1f670 17372 bfd_vma out_off;
82e66161 17373 long indx = 0;
65f38f15
AM
17374
17375 /* When generating a dynamic object, these relocations
17376 are copied into the output file to be resolved at run
17377 time. */
17378
0a1b45a2
AM
17379 skip = false;
17380 relocate = false;
65f38f15 17381
1cf1f670
AM
17382 out_off = _bfd_elf_section_offset (output_bfd, info,
17383 input_section, rel->r_offset);
17384 if (out_off == (bfd_vma) -1)
0a1b45a2 17385 skip = true;
1cf1f670 17386 else if (out_off == (bfd_vma) -2)
0a1b45a2 17387 skip = true, relocate = true;
1cf1f670
AM
17388 out_off += (input_section->output_section->vma
17389 + input_section->output_offset);
17390 outrel.r_offset = out_off;
411e1bfb 17391 outrel.r_addend = rel->r_addend;
65f38f15 17392
1cf1f670
AM
17393 /* Optimize unaligned reloc use. */
17394 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
17395 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
17396 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
17397 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
17398 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
17399 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
17400 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
17401 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
17402 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
17403
65f38f15 17404 if (skip)
0bb2d96a 17405 memset (&outrel, 0, sizeof outrel);
9e51d549
AM
17406 else if (h != NULL
17407 && !SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
17408 && !is_opd
17409 && r_type != R_PPC64_TOC)
14acf4dc 17410 {
82e66161
AM
17411 indx = h->elf.dynindx;
17412 BFD_ASSERT (indx != -1);
17413 outrel.r_info = ELF64_R_INFO (indx, r_type);
14acf4dc 17414 }
65f38f15
AM
17415 else
17416 {
41bd81ab
AM
17417 /* This symbol is local, or marked to become local,
17418 or this is an opd section reloc which must point
17419 at a local function. */
65f38f15 17420 outrel.r_addend += relocation;
e86ce104 17421 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 17422 {
3fad3c7c 17423 if (is_opd && h != NULL)
afbe61cf
AM
17424 {
17425 /* Lie about opd entries. This case occurs
17426 when building shared libraries and we
17427 reference a function in another shared
3fad3c7c
AM
17428 lib. The same thing happens for a weak
17429 definition in an application that's
17430 overridden by a strong definition in a
17431 shared lib. (I believe this is a generic
17432 bug in binutils handling of weak syms.)
17433 In these cases we won't use the opd
1e2f5b6e 17434 entry in this lib. */
0a1b45a2 17435 unresolved_reloc = false;
afbe61cf 17436 }
25f23106
AM
17437 if (!is_opd
17438 && r_type == R_PPC64_ADDR64
17439 && (h != NULL
17440 ? h->elf.type == STT_GNU_IFUNC
17441 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
17442 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
17443 else
17444 {
17445 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69 17446
25f23106
AM
17447 /* We need to relocate .opd contents for ld.so.
17448 Prelink also wants simple and consistent rules
17449 for relocs. This make all RELATIVE relocs have
17450 *r_offset equal to r_addend. */
0a1b45a2 17451 relocate = true;
25f23106 17452 }
65f38f15
AM
17453 }
17454 else
17455 {
25f23106
AM
17456 if (h != NULL
17457 ? h->elf.type == STT_GNU_IFUNC
17458 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
17459 {
25f53a85 17460 info->callbacks->einfo
695344c0 17461 /* xgettext:c-format */
174d0a74 17462 (_("%H: %s for indirect "
c1c8c1ef 17463 "function `%pT' unsupported\n"),
25f53a85 17464 input_bfd, input_section, rel->r_offset,
25f23106
AM
17465 ppc64_elf_howto_table[r_type]->name,
17466 sym_name);
0a1b45a2 17467 ret = false;
25f23106 17468 }
cf35638d 17469 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
65f38f15
AM
17470 ;
17471 else if (sec == NULL || sec->owner == NULL)
17472 {
17473 bfd_set_error (bfd_error_bad_value);
0a1b45a2 17474 return false;
65f38f15
AM
17475 }
17476 else
17477 {
f26a3287 17478 asection *osec = sec->output_section;
65f38f15 17479
f26a3287
AM
17480 if ((osec->flags & SEC_THREAD_LOCAL) != 0)
17481 {
17482 /* TLS symbol values are relative to the
17483 TLS segment. Dynamic relocations for
17484 local TLS symbols therefore can't be
17485 reduced to a relocation against their
17486 section symbol because it holds the
17487 address of the section, not a value
17488 relative to the TLS segment. We could
17489 change the .tdata dynamic section symbol
17490 to be zero value but STN_UNDEF works
17491 and is used elsewhere, eg. for TPREL64
17492 GOT relocs against local TLS symbols. */
17493 osec = htab->elf.tls_sec;
17494 indx = 0;
17495 }
17496 else
74541ad4 17497 {
74541ad4 17498 indx = elf_section_data (osec)->dynindx;
f26a3287
AM
17499 if (indx == 0)
17500 {
17501 if ((osec->flags & SEC_READONLY) == 0
17502 && htab->elf.data_index_section != NULL)
17503 osec = htab->elf.data_index_section;
17504 else
17505 osec = htab->elf.text_index_section;
17506 indx = elf_section_data (osec)->dynindx;
17507 }
17508 BFD_ASSERT (indx != 0);
74541ad4 17509 }
74541ad4 17510
65f38f15
AM
17511 /* We are turning this relocation into one
17512 against a section symbol, so subtract out
17513 the output section's address but not the
17514 offset of the input section in the output
17515 section. */
17516 outrel.r_addend -= osec->vma;
17517 }
17518
17519 outrel.r_info = ELF64_R_INFO (indx, r_type);
17520 }
17521 }
17522
1657026c
AM
17523 if (!(info->enable_dt_relr
17524 && ELF64_R_TYPE (outrel.r_info) == R_PPC64_RELATIVE
f91074eb
AM
17525 && maybe_relr (ELF64_R_TYPE (orig_rel.r_info),
17526 rel, input_section)))
82e66161 17527 {
1657026c
AM
17528 sreloc = elf_section_data (input_section)->sreloc;
17529 if (h != NULL
17530 ? h->elf.type == STT_GNU_IFUNC
17531 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
17532 {
17533 sreloc = htab->elf.irelplt;
17534 if (indx == 0 || is_static_defined (&h->elf))
17535 htab->elf.ifunc_resolvers = true;
17536 }
17537 if (sreloc == NULL)
17538 abort ();
17539
066c738e
AM
17540 BFD_ASSERT (count_and_swap_reloc_out (output_bfd, &outrel,
17541 sreloc));
82e66161 17542 }
65f38f15 17543
e59a1001
AM
17544 if (!warned_dynamic
17545 && !ppc64_glibc_dynamic_reloc (ELF64_R_TYPE (outrel.r_info)))
17546 {
17547 info->callbacks->einfo
17548 /* xgettext:c-format */
17549 (_("%X%P: %pB: %s against %pT "
17550 "is not supported by glibc as a dynamic relocation\n"),
17551 input_bfd,
17552 ppc64_elf_howto_table[ELF64_R_TYPE (outrel.r_info)]->name,
17553 sym_name);
0a1b45a2 17554 warned_dynamic = true;
e59a1001
AM
17555 }
17556
65f38f15
AM
17557 /* If this reloc is against an external symbol, it will
17558 be computed at runtime, so there's no need to do
81407a69
AM
17559 anything now. However, for the sake of prelink ensure
17560 that the section contents are a known value. */
2cdcc330 17561 if (!relocate)
81407a69 17562 {
0a1b45a2 17563 unresolved_reloc = false;
81407a69
AM
17564 /* The value chosen here is quite arbitrary as ld.so
17565 ignores section contents except for the special
17566 case of .opd where the contents might be accessed
17567 before relocation. Choose zero, as that won't
17568 cause reloc overflow. */
17569 relocation = 0;
17570 addend = 0;
17571 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
17572 to improve backward compatibility with older
17573 versions of ld. */
17574 if (r_type == R_PPC64_ADDR64)
17575 addend = outrel.r_addend;
17576 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 17577 else if (ppc64_elf_howto_table[r_type]->pc_relative)
f0158f44 17578 addend = outrel.r_offset;
81407a69 17579 }
65f38f15 17580 }
5bd4f169
AM
17581 break;
17582
65f38f15
AM
17583 case R_PPC64_COPY:
17584 case R_PPC64_GLOB_DAT:
17585 case R_PPC64_JMP_SLOT:
25f23106 17586 case R_PPC64_JMP_IREL:
65f38f15
AM
17587 case R_PPC64_RELATIVE:
17588 /* We shouldn't ever see these dynamic relocs in relocatable
17589 files. */
ae9a127f 17590 /* Fall through. */
65f38f15
AM
17591
17592 case R_PPC64_PLTGOT16:
17593 case R_PPC64_PLTGOT16_DS:
17594 case R_PPC64_PLTGOT16_HA:
17595 case R_PPC64_PLTGOT16_HI:
17596 case R_PPC64_PLTGOT16_LO:
17597 case R_PPC64_PLTGOT16_LO_DS:
17598 case R_PPC64_PLTREL32:
17599 case R_PPC64_PLTREL64:
17600 /* These ones haven't been implemented yet. */
17601
25f53a85 17602 info->callbacks->einfo
695344c0 17603 /* xgettext:c-format */
c1c8c1ef 17604 (_("%P: %pB: %s is not supported for `%pT'\n"),
d003868e 17605 input_bfd,
4ce794b7 17606 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
17607
17608 bfd_set_error (bfd_error_invalid_operation);
0a1b45a2 17609 ret = false;
c316a17c 17610 goto copy_reloc;
65f38f15 17611 }
5bd4f169 17612
67f0cbdb
AM
17613 /* Multi-instruction sequences that access the TOC can be
17614 optimized, eg. addis ra,r2,0; addi rb,ra,x;
07d6d2b8 17615 to nop; addi rb,r2,x; */
67f0cbdb
AM
17616 switch (r_type)
17617 {
17618 default:
17619 break;
17620
17621 case R_PPC64_GOT_TLSLD16_HI:
17622 case R_PPC64_GOT_TLSGD16_HI:
17623 case R_PPC64_GOT_TPREL16_HI:
17624 case R_PPC64_GOT_DTPREL16_HI:
17625 case R_PPC64_GOT16_HI:
17626 case R_PPC64_TOC16_HI:
17627 /* These relocs would only be useful if building up an
17628 offset to later add to r2, perhaps in an indexed
17629 addressing mode instruction. Don't try to optimize.
17630 Unfortunately, the possibility of someone building up an
17631 offset like this or even with the HA relocs, means that
17632 we need to check the high insn when optimizing the low
17633 insn. */
17634 break;
17635
5663e321
AM
17636 case R_PPC64_PLTCALL_NOTOC:
17637 if (!unresolved_reloc)
17638 htab->notoc_plt = 1;
17639 /* Fall through. */
23cedd1d 17640 case R_PPC64_PLTCALL:
733ae98c
AM
17641 if (unresolved_reloc
17642 && offset_in_range (input_section, rel->r_offset,
17643 r_type == R_PPC64_PLTCALL ? 8 : 4))
23cedd1d
AM
17644 {
17645 /* No plt entry. Make this into a direct call. */
17646 bfd_byte *p = contents + rel->r_offset;
17647 insn = bfd_get_32 (input_bfd, p);
17648 insn &= 1;
17649 bfd_put_32 (input_bfd, B_DOT | insn, p);
5663e321
AM
17650 if (r_type == R_PPC64_PLTCALL)
17651 bfd_put_32 (input_bfd, NOP, p + 4);
23cedd1d
AM
17652 unresolved_reloc = save_unresolved_reloc;
17653 r_type = R_PPC64_REL24;
17654 }
17655 break;
17656
5663e321 17657 case R_PPC64_PLTSEQ_NOTOC:
23cedd1d
AM
17658 case R_PPC64_PLTSEQ:
17659 if (unresolved_reloc)
17660 {
0a1b45a2 17661 unresolved_reloc = false;
23cedd1d
AM
17662 goto nop_it;
17663 }
17664 break;
17665
5663e321
AM
17666 case R_PPC64_PLT_PCREL34_NOTOC:
17667 if (!unresolved_reloc)
17668 htab->notoc_plt = 1;
17669 /* Fall through. */
17670 case R_PPC64_PLT_PCREL34:
733ae98c
AM
17671 if (unresolved_reloc
17672 && offset_in_range (input_section, rel->r_offset, 8))
5663e321
AM
17673 {
17674 bfd_byte *p = contents + rel->r_offset;
17675 bfd_put_32 (input_bfd, PNOP >> 32, p);
17676 bfd_put_32 (input_bfd, PNOP, p + 4);
0a1b45a2 17677 unresolved_reloc = false;
5663e321
AM
17678 goto copy_reloc;
17679 }
17680 break;
17681
23cedd1d
AM
17682 case R_PPC64_PLT16_HA:
17683 if (unresolved_reloc)
17684 {
0a1b45a2 17685 unresolved_reloc = false;
23cedd1d
AM
17686 goto nop_it;
17687 }
17688 /* Fall through. */
67f0cbdb
AM
17689 case R_PPC64_GOT_TLSLD16_HA:
17690 case R_PPC64_GOT_TLSGD16_HA:
17691 case R_PPC64_GOT_TPREL16_HA:
17692 case R_PPC64_GOT_DTPREL16_HA:
17693 case R_PPC64_GOT16_HA:
17694 case R_PPC64_TOC16_HA:
98528052 17695 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
3a3a4c1f
AM
17696 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn
17697 && !(bfd_link_pic (info)
17698 && (h != NULL
17699 ? bfd_is_abs_symbol (&h->elf.root)
17700 : sec == bfd_abs_section_ptr)))
98528052 17701 {
23cedd1d
AM
17702 bfd_byte *p;
17703 nop_it:
733ae98c
AM
17704 if (offset_in_range (input_section, rel->r_offset & ~3, 4))
17705 {
17706 p = contents + (rel->r_offset & ~3);
17707 bfd_put_32 (input_bfd, NOP, p);
17708 goto copy_reloc;
17709 }
98528052 17710 }
67f0cbdb
AM
17711 break;
17712
23cedd1d
AM
17713 case R_PPC64_PLT16_LO:
17714 case R_PPC64_PLT16_LO_DS:
17715 if (unresolved_reloc)
17716 {
0a1b45a2 17717 unresolved_reloc = false;
23cedd1d
AM
17718 goto nop_it;
17719 }
17720 /* Fall through. */
67f0cbdb
AM
17721 case R_PPC64_GOT_TLSLD16_LO:
17722 case R_PPC64_GOT_TLSGD16_LO:
17723 case R_PPC64_GOT_TPREL16_LO_DS:
17724 case R_PPC64_GOT_DTPREL16_LO_DS:
17725 case R_PPC64_GOT16_LO:
17726 case R_PPC64_GOT16_LO_DS:
17727 case R_PPC64_TOC16_LO:
17728 case R_PPC64_TOC16_LO_DS:
98528052 17729 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
733ae98c 17730 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn
3a3a4c1f
AM
17731 && !(bfd_link_pic (info)
17732 && (h != NULL
17733 ? bfd_is_abs_symbol (&h->elf.root)
17734 : sec == bfd_abs_section_ptr))
733ae98c 17735 && offset_in_range (input_section, rel->r_offset & ~3, 4))
67f0cbdb
AM
17736 {
17737 bfd_byte *p = contents + (rel->r_offset & ~3);
17738 insn = bfd_get_32 (input_bfd, p);
2365f8d7 17739 if ((insn & (0x3fu << 26)) == 12u << 26 /* addic */)
560c8763
AM
17740 {
17741 /* Transform addic to addi when we change reg. */
2365f8d7 17742 insn &= ~((0x3fu << 26) | (0x1f << 16));
560c8763
AM
17743 insn |= (14u << 26) | (2 << 16);
17744 }
17745 else
67f0cbdb 17746 {
98528052
AM
17747 insn &= ~(0x1f << 16);
17748 insn |= 2 << 16;
67f0cbdb 17749 }
560c8763 17750 bfd_put_32 (input_bfd, insn, p);
67f0cbdb
AM
17751 }
17752 break;
9a23f96e
AM
17753
17754 case R_PPC64_TPREL16_HA:
733ae98c
AM
17755 if (htab->do_tls_opt
17756 && relocation + addend + 0x8000 < 0x10000
17757 && offset_in_range (input_section, rel->r_offset & ~3, 4))
9a23f96e
AM
17758 {
17759 bfd_byte *p = contents + (rel->r_offset & ~3);
252dcdf4
AM
17760 bfd_put_32 (input_bfd, NOP, p);
17761 goto copy_reloc;
9a23f96e
AM
17762 }
17763 break;
17764
17765 case R_PPC64_TPREL16_LO:
17766 case R_PPC64_TPREL16_LO_DS:
733ae98c
AM
17767 if (htab->do_tls_opt
17768 && relocation + addend + 0x8000 < 0x10000
17769 && offset_in_range (input_section, rel->r_offset & ~3, 4))
9a23f96e
AM
17770 {
17771 bfd_byte *p = contents + (rel->r_offset & ~3);
17772 insn = bfd_get_32 (input_bfd, p);
17773 insn &= ~(0x1f << 16);
17774 insn |= 13 << 16;
17775 bfd_put_32 (input_bfd, insn, p);
17776 }
17777 break;
67f0cbdb
AM
17778 }
17779
65f38f15
AM
17780 /* Do any further special processing. */
17781 switch (r_type)
17782 {
17783 default:
17784 break;
17785
25f23106 17786 case R_PPC64_REL16_HA:
4a969973
AM
17787 case R_PPC64_REL16_HIGHA:
17788 case R_PPC64_REL16_HIGHERA:
17789 case R_PPC64_REL16_HIGHESTA:
a680de9a 17790 case R_PPC64_REL16DX_HA:
f9c6b907
AM
17791 case R_PPC64_ADDR16_HA:
17792 case R_PPC64_ADDR16_HIGHA:
65f38f15
AM
17793 case R_PPC64_ADDR16_HIGHERA:
17794 case R_PPC64_ADDR16_HIGHESTA:
65f38f15
AM
17795 case R_PPC64_TOC16_HA:
17796 case R_PPC64_SECTOFF_HA:
411e1bfb 17797 case R_PPC64_TPREL16_HA:
f9c6b907 17798 case R_PPC64_TPREL16_HIGHA:
411e1bfb 17799 case R_PPC64_TPREL16_HIGHERA:
411e1bfb 17800 case R_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
17801 case R_PPC64_DTPREL16_HA:
17802 case R_PPC64_DTPREL16_HIGHA:
411e1bfb 17803 case R_PPC64_DTPREL16_HIGHERA:
411e1bfb 17804 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
17805 /* It's just possible that this symbol is a weak symbol
17806 that's not actually defined anywhere. In that case,
17807 'sec' would be NULL, and we should leave the symbol
17808 alone (it will be set to zero elsewhere in the link). */
5c5f6e17
AM
17809 if (sec == NULL)
17810 break;
1a0670f3 17811 /* Fall through. */
5c5f6e17
AM
17812
17813 case R_PPC64_GOT16_HA:
17814 case R_PPC64_PLTGOT16_HA:
17815 case R_PPC64_PLT16_HA:
17816 case R_PPC64_GOT_TLSGD16_HA:
17817 case R_PPC64_GOT_TLSLD16_HA:
17818 case R_PPC64_GOT_TPREL16_HA:
17819 case R_PPC64_GOT_DTPREL16_HA:
17820 /* Add 0x10000 if sign bit in 0:15 is set.
17821 Bits 0:15 are not used. */
17822 addend += 0x8000;
65f38f15
AM
17823 break;
17824
5663e321
AM
17825 case R_PPC64_D34_HA30:
17826 case R_PPC64_ADDR16_HIGHERA34:
17827 case R_PPC64_ADDR16_HIGHESTA34:
17828 case R_PPC64_REL16_HIGHERA34:
17829 case R_PPC64_REL16_HIGHESTA34:
17830 if (sec != NULL)
17831 addend += 1ULL << 33;
17832 break;
17833
65f38f15
AM
17834 case R_PPC64_ADDR16_DS:
17835 case R_PPC64_ADDR16_LO_DS:
17836 case R_PPC64_GOT16_DS:
17837 case R_PPC64_GOT16_LO_DS:
17838 case R_PPC64_PLT16_LO_DS:
17839 case R_PPC64_SECTOFF_DS:
17840 case R_PPC64_SECTOFF_LO_DS:
17841 case R_PPC64_TOC16_DS:
17842 case R_PPC64_TOC16_LO_DS:
17843 case R_PPC64_PLTGOT16_DS:
17844 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
17845 case R_PPC64_GOT_TPREL16_DS:
17846 case R_PPC64_GOT_TPREL16_LO_DS:
17847 case R_PPC64_GOT_DTPREL16_DS:
17848 case R_PPC64_GOT_DTPREL16_LO_DS:
17849 case R_PPC64_TPREL16_DS:
17850 case R_PPC64_TPREL16_LO_DS:
17851 case R_PPC64_DTPREL16_DS:
17852 case R_PPC64_DTPREL16_LO_DS:
733ae98c
AM
17853 if (!offset_in_range (input_section, rel->r_offset & ~3, 4))
17854 break;
adadcc0c
AM
17855 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
17856 mask = 3;
a680de9a
PB
17857 /* If this reloc is against an lq, lxv, or stxv insn, then
17858 the value must be a multiple of 16. This is somewhat of
17859 a hack, but the "correct" way to do this by defining _DQ
17860 forms of all the _DS relocs bloats all reloc switches in
17861 this file. It doesn't make much sense to use these
17862 relocs in data, so testing the insn should be safe. */
2365f8d7
AM
17863 if ((insn & (0x3fu << 26)) == (56u << 26)
17864 || ((insn & (0x3fu << 26)) == (61u << 26) && (insn & 3) == 1))
adadcc0c 17865 mask = 15;
a680de9a
PB
17866 relocation += addend;
17867 addend = insn & (mask ^ 3);
17868 if ((relocation & mask) != 0)
65f38f15 17869 {
a680de9a 17870 relocation ^= relocation & mask;
25f53a85 17871 info->callbacks->einfo
695344c0 17872 /* xgettext:c-format */
174d0a74 17873 (_("%H: error: %s not a multiple of %u\n"),
25f53a85 17874 input_bfd, input_section, rel->r_offset,
d830549d 17875 ppc64_elf_howto_table[r_type]->name,
adadcc0c 17876 mask + 1);
65f38f15 17877 bfd_set_error (bfd_error_bad_value);
0a1b45a2 17878 ret = false;
c316a17c 17879 goto copy_reloc;
65f38f15
AM
17880 }
17881 break;
5bd4f169
AM
17882 }
17883
239e1f3a
AM
17884 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
17885 because such sections are not SEC_ALLOC and thus ld.so will
17886 not process them. */
d830549d 17887 howto = ppc64_elf_howto_table[(int) r_type];
65f38f15 17888 if (unresolved_reloc
239e1f3a 17889 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
17890 && h->elf.def_dynamic)
17891 && _bfd_elf_section_offset (output_bfd, info, input_section,
17892 rel->r_offset) != (bfd_vma) -1)
9c07fe7c 17893 {
25f53a85 17894 info->callbacks->einfo
695344c0 17895 /* xgettext:c-format */
c1c8c1ef 17896 (_("%H: unresolvable %s against `%pT'\n"),
25f53a85 17897 input_bfd, input_section, rel->r_offset,
b80eed39 17898 howto->name,
039b3fef 17899 h->elf.root.root.string);
0a1b45a2 17900 ret = false;
9c07fe7c 17901 }
5bd4f169 17902
b80eed39
AM
17903 /* 16-bit fields in insns mostly have signed values, but a
17904 few insns have 16-bit unsigned values. Really, we should
17905 have different reloc types. */
17906 if (howto->complain_on_overflow != complain_overflow_dont
17907 && howto->dst_mask == 0xffff
733ae98c
AM
17908 && (input_section->flags & SEC_CODE) != 0
17909 && offset_in_range (input_section, rel->r_offset & ~3, 4))
b80eed39
AM
17910 {
17911 enum complain_overflow complain = complain_overflow_signed;
17912
17913 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
2365f8d7 17914 if ((insn & (0x3fu << 26)) == 10u << 26 /* cmpli */)
a47622ac
AM
17915 complain = complain_overflow_bitfield;
17916 else if (howto->rightshift == 0
2365f8d7
AM
17917 ? ((insn & (0x3fu << 26)) == 28u << 26 /* andi */
17918 || (insn & (0x3fu << 26)) == 24u << 26 /* ori */
17919 || (insn & (0x3fu << 26)) == 26u << 26 /* xori */)
17920 : ((insn & (0x3fu << 26)) == 29u << 26 /* andis */
17921 || (insn & (0x3fu << 26)) == 25u << 26 /* oris */
17922 || (insn & (0x3fu << 26)) == 27u << 26 /* xoris */))
b80eed39
AM
17923 complain = complain_overflow_unsigned;
17924 if (howto->complain_on_overflow != complain)
17925 {
17926 alt_howto = *howto;
17927 alt_howto.complain_on_overflow = complain;
17928 howto = &alt_howto;
17929 }
17930 }
17931
5663e321 17932 switch (r_type)
a680de9a 17933 {
5663e321
AM
17934 /* Split field relocs aren't handled by _bfd_final_link_relocate. */
17935 case R_PPC64_D34:
17936 case R_PPC64_D34_LO:
17937 case R_PPC64_D34_HI30:
17938 case R_PPC64_D34_HA30:
17939 case R_PPC64_PCREL34:
17940 case R_PPC64_GOT_PCREL34:
c213164a
AM
17941 case R_PPC64_TPREL34:
17942 case R_PPC64_DTPREL34:
87c69f97
AM
17943 case R_PPC64_GOT_TLSGD_PCREL34:
17944 case R_PPC64_GOT_TLSLD_PCREL34:
17945 case R_PPC64_GOT_TPREL_PCREL34:
17946 case R_PPC64_GOT_DTPREL_PCREL34:
5663e321
AM
17947 case R_PPC64_PLT_PCREL34:
17948 case R_PPC64_PLT_PCREL34_NOTOC:
17949 case R_PPC64_D28:
17950 case R_PPC64_PCREL28:
733ae98c 17951 if (!offset_in_range (input_section, rel->r_offset, 8))
5663e321
AM
17952 r = bfd_reloc_outofrange;
17953 else
17954 {
5663e321
AM
17955 relocation += addend;
17956 if (howto->pc_relative)
17957 relocation -= (rel->r_offset
17958 + input_section->output_offset
17959 + input_section->output_section->vma);
17960 relocation >>= howto->rightshift;
17961
17962 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset);
17963 pinsn <<= 32;
17964 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
17965
17966 pinsn &= ~howto->dst_mask;
17967 pinsn |= (((relocation << 16) | (relocation & 0xffff))
17968 & howto->dst_mask);
17969 bfd_put_32 (input_bfd, pinsn >> 32, contents + rel->r_offset);
17970 bfd_put_32 (input_bfd, pinsn, contents + rel->r_offset + 4);
17971 r = bfd_reloc_ok;
17972 if (howto->complain_on_overflow == complain_overflow_signed
17973 && (relocation + (1ULL << (howto->bitsize - 1))
17974 >= 1ULL << howto->bitsize))
17975 r = bfd_reloc_overflow;
17976 }
17977 break;
17978
17979 case R_PPC64_REL16DX_HA:
733ae98c 17980 if (!offset_in_range (input_section, rel->r_offset, 4))
a680de9a
PB
17981 r = bfd_reloc_outofrange;
17982 else
17983 {
17984 relocation += addend;
17985 relocation -= (rel->r_offset
17986 + input_section->output_offset
17987 + input_section->output_section->vma);
3de43e7b 17988 relocation = (bfd_signed_vma) relocation >> 16;
a680de9a
PB
17989 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
17990 insn &= ~0x1fffc1;
3de43e7b 17991 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
a680de9a
PB
17992 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
17993 r = bfd_reloc_ok;
3de43e7b 17994 if (relocation + 0x8000 > 0xffff)
a680de9a
PB
17995 r = bfd_reloc_overflow;
17996 }
5663e321
AM
17997 break;
17998
17999 default:
18000 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
18001 contents, rel->r_offset,
18002 relocation, addend);
a680de9a 18003 }
5bd4f169 18004
ef60b7ff 18005 if (r != bfd_reloc_ok)
5bd4f169 18006 {
bc30df16 18007 char *more_info = NULL;
b80eed39 18008 const char *reloc_name = howto->name;
bc30df16
AM
18009
18010 if (reloc_dest != DEST_NORMAL)
18011 {
18012 more_info = bfd_malloc (strlen (reloc_name) + 8);
18013 if (more_info != NULL)
18014 {
18015 strcpy (more_info, reloc_name);
18016 strcat (more_info, (reloc_dest == DEST_OPD
18017 ? " (OPD)" : " (stub)"));
18018 reloc_name = more_info;
18019 }
18020 }
18021
cd27b276 18022 if (r == bfd_reloc_overflow)
5bd4f169 18023 {
8131c122
AM
18024 /* On code like "if (foo) foo();" don't report overflow
18025 on a branch to zero when foo is undefined. */
18026 if (!warned
18027 && (reloc_dest == DEST_STUB
18028 || !(h != NULL
18029 && (h->elf.root.type == bfd_link_hash_undefweak
18030 || h->elf.root.type == bfd_link_hash_undefined)
18031 && is_branch_reloc (r_type))))
9e51d549
AM
18032 info->callbacks->reloc_overflow
18033 (info, (struct bfd_link_hash_entry *) h, sym_name,
18034 reloc_name, orig_rel.r_addend, input_bfd, input_section,
18035 rel->r_offset);
ef60b7ff
AM
18036 }
18037 else
18038 {
25f53a85 18039 info->callbacks->einfo
695344c0 18040 /* xgettext:c-format */
c1c8c1ef 18041 (_("%H: %s against `%pT': error %d\n"),
25f53a85 18042 input_bfd, input_section, rel->r_offset,
bc30df16 18043 reloc_name, sym_name, (int) r);
0a1b45a2 18044 ret = false;
ef60b7ff 18045 }
c9594989 18046 free (more_info);
5bd4f169 18047 }
c316a17c
AM
18048 copy_reloc:
18049 if (wrel != rel)
18050 *wrel = *rel;
18051 }
18052
18053 if (wrel != rel)
18054 {
18055 Elf_Internal_Shdr *rel_hdr;
18056 size_t deleted = rel - wrel;
18057
18058 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
18059 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
18060 if (rel_hdr->sh_size == 0)
18061 {
18062 /* It is too late to remove an empty reloc section. Leave
18063 one NONE reloc.
18064 ??? What is wrong with an empty section??? */
18065 rel_hdr->sh_size = rel_hdr->sh_entsize;
18066 deleted -= 1;
18067 }
18068 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
18069 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
18070 input_section->reloc_count -= deleted;
5bd4f169
AM
18071 }
18072
645ea6a9
AM
18073 /* If we're emitting relocations, then shortly after this function
18074 returns, reloc offsets and addends for this section will be
18075 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
18076 file rather than the input. Save a copy of the relocs for
18077 opd_entry_value. */
6313825c
AM
18078 if (is_opd
18079 && (info->emitrelocations || bfd_link_relocatable (info))
18080 && input_section->reloc_count != 0)
8860955f
AM
18081 {
18082 bfd_size_type amt;
18083 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
18084 rel = bfd_alloc (input_bfd, amt);
6313825c 18085 ppc64_elf_section_data (input_section)->u.opd.u.relocs = rel;
8860955f 18086 if (rel == NULL)
0a1b45a2 18087 return false;
8860955f
AM
18088 memcpy (rel, relocs, amt);
18089 }
5bd4f169
AM
18090 return ret;
18091}
18092
754021d0
AM
18093/* Adjust the value of any local symbols in opd sections. */
18094
6e0b88f1 18095static int
754021d0
AM
18096ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
18097 const char *name ATTRIBUTE_UNUSED,
18098 Elf_Internal_Sym *elfsym,
18099 asection *input_sec,
18100 struct elf_link_hash_entry *h)
18101{
74f0fb50
AM
18102 struct _opd_sec_data *opd;
18103 long adjust;
754021d0
AM
18104 bfd_vma value;
18105
4025353c 18106 if (h != NULL)
6e0b88f1 18107 return 1;
4025353c 18108
74f0fb50
AM
18109 opd = get_opd_info (input_sec);
18110 if (opd == NULL || opd->adjust == NULL)
6e0b88f1 18111 return 1;
754021d0
AM
18112
18113 value = elfsym->st_value - input_sec->output_offset;
0e1862bb 18114 if (!bfd_link_relocatable (info))
754021d0
AM
18115 value -= input_sec->output_section->vma;
18116
51aecdc5 18117 adjust = opd->adjust[OPD_NDX (value)];
4025353c 18118 if (adjust == -1)
6e0b88f1
AM
18119 return 2;
18120
18121 elfsym->st_value += adjust;
18122 return 1;
754021d0
AM
18123}
18124
5bd4f169
AM
18125/* Finish up dynamic symbol handling. We set the contents of various
18126 dynamic sections here. */
18127
0a1b45a2 18128static bool
4ce794b7
AM
18129ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
18130 struct bfd_link_info *info,
18131 struct elf_link_hash_entry *h,
4aef7643 18132 Elf_Internal_Sym *sym)
5bd4f169 18133{
65f38f15 18134 struct ppc_link_hash_table *htab;
8387904d 18135 struct plt_entry *ent;
5bd4f169 18136
65f38f15 18137 htab = ppc_hash_table (info);
5bd4f169 18138
49c09209
AM
18139 if (!htab->opd_abi && !h->def_regular)
18140 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
18141 if (ent->plt.offset != (bfd_vma) -1)
18142 {
18143 /* Mark the symbol as undefined, rather than as
18144 defined in glink. Leave the value if there were
18145 any relocations where pointer equality matters
18146 (this is a clue for the dynamic linker, to make
18147 function pointer comparisons work between an
18148 application and shared library), otherwise set it
18149 to zero. */
18150 sym->st_shndx = SHN_UNDEF;
18151 if (!h->pointer_equality_needed)
18152 sym->st_value = 0;
18153 else if (!h->ref_regular_nonweak)
18154 {
18155 /* This breaks function pointer comparisons, but
18156 that is better than breaking tests for a NULL
18157 function pointer. */
18158 sym->st_value = 0;
18159 }
18160 break;
18161 }
5bd4f169 18162
1bdd8fac
AM
18163 if (h->needs_copy
18164 && (h->root.type == bfd_link_hash_defined
18165 || h->root.type == bfd_link_hash_defweak)
18166 && (h->root.u.def.section == htab->elf.sdynbss
18167 || h->root.u.def.section == htab->elf.sdynrelro))
5bd4f169 18168 {
65f38f15 18169 /* This symbol needs a copy reloc. Set it up. */
49c09209 18170 Elf_Internal_Rela rela;
5474d94f 18171 asection *srel;
5bd4f169 18172
1bdd8fac 18173 if (h->dynindx == -1)
65f38f15 18174 abort ();
5bd4f169 18175
ed7007c1 18176 rela.r_offset = defined_sym_val (h);
5bd4f169
AM
18177 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
18178 rela.r_addend = 0;
afbf7e8e 18179 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
18180 srel = htab->elf.sreldynrelro;
18181 else
18182 srel = htab->elf.srelbss;
066c738e 18183 BFD_ASSERT (count_and_swap_reloc_out (output_bfd, &rela, srel));
5bd4f169
AM
18184 }
18185
0a1b45a2 18186 return true;
5bd4f169
AM
18187}
18188
65f38f15
AM
18189/* Used to decide how to sort relocs in an optimal manner for the
18190 dynamic linker, before writing them out. */
18191
18192static enum elf_reloc_type_class
7e612e98
AM
18193ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
18194 const asection *rel_sec,
18195 const Elf_Internal_Rela *rela)
65f38f15 18196{
04c9666a 18197 enum elf_ppc64_reloc_type r_type;
7e612e98
AM
18198 struct ppc_link_hash_table *htab = ppc_hash_table (info);
18199
33e44f2e 18200 if (rel_sec == htab->elf.irelplt)
7e612e98 18201 return reloc_class_ifunc;
a33d1f77 18202
4ce794b7 18203 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 18204 switch (r_type)
65f38f15
AM
18205 {
18206 case R_PPC64_RELATIVE:
18207 return reloc_class_relative;
18208 case R_PPC64_JMP_SLOT:
18209 return reloc_class_plt;
18210 case R_PPC64_COPY:
18211 return reloc_class_copy;
18212 default:
18213 return reloc_class_normal;
18214 }
18215}
18216
5bd4f169
AM
18217/* Finish up the dynamic sections. */
18218
0a1b45a2 18219static bool
4ce794b7
AM
18220ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
18221 struct bfd_link_info *info)
5bd4f169 18222{
65f38f15
AM
18223 struct ppc_link_hash_table *htab;
18224 bfd *dynobj;
5bd4f169 18225 asection *sdyn;
5bd4f169 18226
65f38f15 18227 htab = ppc_hash_table (info);
4dfe6ac6 18228 if (htab == NULL)
0a1b45a2 18229 return false;
4dfe6ac6 18230
65f38f15 18231 dynobj = htab->elf.dynobj;
3d4d4302 18232 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5bd4f169 18233
65f38f15 18234 if (htab->elf.dynamic_sections_created)
5bd4f169 18235 {
5bd4f169
AM
18236 Elf64_External_Dyn *dyncon, *dynconend;
18237
33e44f2e 18238 if (sdyn == NULL || htab->elf.sgot == NULL)
65f38f15 18239 abort ();
5bd4f169
AM
18240
18241 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 18242 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
18243 for (; dyncon < dynconend; dyncon++)
18244 {
18245 Elf_Internal_Dyn dyn;
19397422 18246 asection *s;
5bd4f169
AM
18247
18248 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
18249
18250 switch (dyn.d_tag)
18251 {
65f38f15
AM
18252 default:
18253 continue;
5bd4f169 18254
5d1634d7 18255 case DT_PPC64_GLINK:
4ce794b7 18256 s = htab->glink;
6348e046 18257 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
18258 /* We stupidly defined DT_PPC64_GLINK to be the start
18259 of glink rather than the first entry point, which is
18260 what ld.so needs, and now have a bigger stub to
18261 support automatic multiple TOCs. */
9e390558 18262 dyn.d_un.d_ptr += GLINK_PLTRESOLVE_SIZE (htab) - 8 * 4;
5d1634d7
AM
18263 break;
18264
19397422
AM
18265 case DT_PPC64_OPD:
18266 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
18267 if (s == NULL)
18268 continue;
18269 dyn.d_un.d_ptr = s->vma;
19397422
AM
18270 break;
18271
e8910a83 18272 case DT_PPC64_OPT:
5663e321
AM
18273 if ((htab->do_multi_toc && htab->multi_toc_needed)
18274 || htab->notoc_plt)
e8910a83 18275 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
f378ab09
AM
18276 if (htab->has_plt_localentry0)
18277 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY;
e8910a83
AM
18278 break;
18279
19397422
AM
18280 case DT_PPC64_OPDSZ:
18281 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
18282 if (s == NULL)
18283 continue;
eea6121a 18284 dyn.d_un.d_val = s->size;
19397422
AM
18285 break;
18286
65f38f15 18287 case DT_PLTGOT:
33e44f2e 18288 s = htab->elf.splt;
6348e046 18289 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
18290 break;
18291
18292 case DT_JMPREL:
33e44f2e 18293 s = htab->elf.srelplt;
6348e046 18294 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 18295 break;
5bd4f169 18296
65f38f15 18297 case DT_PLTRELSZ:
33e44f2e 18298 dyn.d_un.d_val = htab->elf.srelplt->size;
5d1634d7 18299 break;
82e66161
AM
18300
18301 case DT_TEXTREL:
cebd6b8a 18302 if (htab->elf.ifunc_resolvers)
82e66161
AM
18303 info->callbacks->einfo
18304 (_("%P: warning: text relocations and GNU indirect "
18305 "functions may result in a segfault at runtime\n"));
18306 continue;
5bd4f169 18307 }
5bd4f169 18308
65f38f15 18309 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 18310 }
5bd4f169
AM
18311 }
18312
6528b6eb
AM
18313 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0
18314 && htab->elf.sgot->output_section != bfd_abs_section_ptr)
5d1634d7
AM
18315 {
18316 /* Fill in the first entry in the global offset table.
18317 We use it to hold the link-time TOCbase. */
18318 bfd_put_64 (output_bfd,
60ee0d4a 18319 elf_gp (output_bfd) + TOC_BASE_OFF,
33e44f2e 18320 htab->elf.sgot->contents);
5d1634d7
AM
18321
18322 /* Set .got entry size. */
2cdcc330
AM
18323 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
18324 = 8;
5d1634d7
AM
18325 }
18326
6528b6eb
AM
18327 if (htab->elf.splt != NULL && htab->elf.splt->size != 0
18328 && htab->elf.splt->output_section != bfd_abs_section_ptr)
5d1634d7
AM
18329 {
18330 /* Set .plt entry size. */
33e44f2e 18331 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
b9e5796b 18332 = PLT_ENTRY_SIZE (htab);
5d1634d7
AM
18333 }
18334
84f5d08e
AM
18335 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
18336 brlt ourselves if emitrelocations. */
18337 if (htab->brlt != NULL
18338 && htab->brlt->reloc_count != 0
18339 && !_bfd_elf_link_output_relocs (output_bfd,
18340 htab->brlt,
d4730f92 18341 elf_section_data (htab->brlt)->rela.hdr,
84f5d08e
AM
18342 elf_section_data (htab->brlt)->relocs,
18343 NULL))
0a1b45a2 18344 return false;
84f5d08e 18345
176a0d42
AM
18346 if (htab->glink != NULL
18347 && htab->glink->reloc_count != 0
18348 && !_bfd_elf_link_output_relocs (output_bfd,
18349 htab->glink,
d4730f92 18350 elf_section_data (htab->glink)->rela.hdr,
176a0d42
AM
18351 elf_section_data (htab->glink)->relocs,
18352 NULL))
0a1b45a2 18353 return false;
176a0d42 18354
da44f4e5 18355
df136d64
AM
18356 if (htab->glink_eh_frame != NULL
18357 && htab->glink_eh_frame->size != 0
18358 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
18359 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
18360 htab->glink_eh_frame,
18361 htab->glink_eh_frame->contents))
0a1b45a2 18362 return false;
58d180e8 18363
e717da7e 18364 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
18365 since we didn't add them to DYNOBJ. We know dynobj is the first
18366 bfd. */
c72f2fb2 18367 while ((dynobj = dynobj->link.next) != NULL)
e717da7e
AM
18368 {
18369 asection *s;
7b53ace3 18370
0c8d6e5c 18371 if (!is_ppc64_elf (dynobj))
7b53ace3
AM
18372 continue;
18373
e717da7e
AM
18374 s = ppc64_elf_tdata (dynobj)->got;
18375 if (s != NULL
eea6121a 18376 && s->size != 0
e717da7e
AM
18377 && s->output_section != bfd_abs_section_ptr
18378 && !bfd_set_section_contents (output_bfd, s->output_section,
18379 s->contents, s->output_offset,
eea6121a 18380 s->size))
0a1b45a2 18381 return false;
e717da7e
AM
18382 s = ppc64_elf_tdata (dynobj)->relgot;
18383 if (s != NULL
eea6121a 18384 && s->size != 0
e717da7e
AM
18385 && s->output_section != bfd_abs_section_ptr
18386 && !bfd_set_section_contents (output_bfd, s->output_section,
18387 s->contents, s->output_offset,
eea6121a 18388 s->size))
0a1b45a2 18389 return false;
e717da7e 18390 }
f6c52c13 18391
0a1b45a2 18392 return true;
5bd4f169
AM
18393}
18394
6313825c
AM
18395static bool
18396ppc64_elf_free_cached_info (bfd *abfd)
18397{
18398 if (abfd->sections)
18399 for (asection *opd = bfd_get_section_by_name (abfd, ".opd");
18400 opd != NULL;
18401 opd = bfd_get_next_section_by_name (NULL, opd))
18402 if (opd->reloc_count == 0)
18403 free (ppc64_elf_section_data (opd)->u.opd.u.contents);
18404
09d757a5 18405 return _bfd_elf_free_cached_info (abfd);
6313825c
AM
18406}
18407
5bd4f169 18408#include "elf64-target.h"
7b8e7dad
AM
18409
18410/* FreeBSD support */
18411
18412#undef TARGET_LITTLE_SYM
6afcdeb3 18413#define TARGET_LITTLE_SYM powerpc_elf64_fbsd_le_vec
7b8e7dad 18414#undef TARGET_LITTLE_NAME
6afcdeb3 18415#define TARGET_LITTLE_NAME "elf64-powerpcle-freebsd"
7b8e7dad
AM
18416
18417#undef TARGET_BIG_SYM
6d00b590 18418#define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
7b8e7dad
AM
18419#undef TARGET_BIG_NAME
18420#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
18421
18422#undef ELF_OSABI
18423#define ELF_OSABI ELFOSABI_FREEBSD
18424
18425#undef elf64_bed
18426#define elf64_bed elf64_powerpc_fbsd_bed
18427
18428#include "elf64-target.h"